Pythonで秒換算での経過時間計算

今作っているアプリで、2つのdatetime型時間データ間の経過時間を、秒で計算する必要が出てきた。

単純に引き算すれと、timedelta型の差が取得できる。
でも、timedelta型は、日数、時間、分、秒をそれぞれメンバ変数で持っていて、それを秒に換算してくれるイケてるメソッドがない。

意外とイケてないなぁ・・・・
日、時間、分をそれぞれ秒換算して計算することはできるけど、マイナス等を考慮して色々作るのは面倒臭いしなぁ・・・・
とウジウジしながら色々と試行錯誤した結果、以下のやり方が一番スッキリしているのではないかという結論に。

from datetime import datetime
import time

# エポックからの経過秒数に変換
def dt2sec(dt):
    return int(time.mktime(datetime.timetuple(dt)))

# dt2からdt1までで経過した秒数を計算
result = dt2sec(dt1) - dt2sec(dt2)

# ついでに経過分数
result2 = result // 60

もっと楽ちんなやり方があったら教えてください・・・

Pythonのbottleを使ってJSON-RPCでデータを送受信する

JavaScript畑のわたしは、Pythonの構文のカッチリさに食わず嫌いしていたのですが(JavaScript、自由度高すぎですよね・・・)、bottleフレームワークのお手軽さに一気に惹かれて、最近、Pythonばっかりになってしまいました。
辞書とか意外とJavaScriptと構文が同じだったりするし、取っ付き易いというのもありますね。。。

bottleって、現在、一番手っ取り早くアプリケーション・サーバーを作ることができる環境なのではないでしょうか。

node.jsをはじめて使ったときは、こりゃ便利だと思ったものですが、こっちの方が全然直感的に書けるし、なによりたくさん書いたときの見通しがよい。
(これはPythonのカッチリした構文に依る部分も大きいですが・・・)

で、今、スマホの側アプリを作っておりまして、そのサーバー側をこいつでやってやろうと思っています。

できるだけ画面遷移を起こさないようにXMLHttpRequestでjsonデータを送受信する形にしているので、ajax系での書き方を調べているのですが・・・・
bottleの使い方の記事自体は多くあるのですが・・・・
ajax系の情報が少ない。。。

なので、調べた内容を書いて行きたいと思います。

コード

クライアント側をこんな感じで書いているとします。
(ベタのコードを書くと面倒なので、JQueryでのコードを記載します。)

$.ajax({
    type: "POST",
    url: getUrl(url),
    data: JSON.stringify(data),
    dataType: 'json',
    contentType: "application/json",
    success: function(res){
        console.log(res);
    },
    error : function(req, stat,err) {
        console.debug('error:' + err.message);
        alert('エラーが発生しました。再読み込みを実行してください。');
    }
});

まずはライブラリをこんな感じでimportしてみます。

from bottle import post, request, HTTPResponse

クライアントはPOSTで送信をしているとします。
その場合・・・

@post(‘/path/to/call’)
def call()
    if request.is_ajax: #AJAXのデータなら
        print (JSON.stringify(request.json)) # request.jsonに辞書型で格納されている
        r = HTTPResponse(status=200, body=‘{“uho” : 1, “oho” : 2}’) #bodyにJSON形式で詰め込む
        r.set_header('Content-Type', 'application/json’)
      return r
  else:
      r = HTTPResponse(status=400)
      return r

うーん。お手軽。

MacでGoogleTestを使用しようとしたらリンクエラー

C++用のテストフレームワークとして、GoogleTestを使おうと思い、 GoogleTestのサイト(下記)の内容を信じ、SVNから最新版を落として、cmakeからmakeを実行。 https://code.google.com/p/googletest/

無事makeは通った。 出来たライブラリを実行テストモジュールにリンクしたところ、下記エラーが発生。。。

ld: warning: could not create compact unwind for __ZSt9__find_ifIN9__gnu_cxx17__normal_iteratorIPN7testing12TestPropertyESt6vectorIS3_SaIS3_EEEENS0_5__ops10_Iter_predINS2_8internal17TestPropertyKeyIsEEEET_SE_SE_T0_: dwarf uses DW_CFA_GNU_args_size
ld: warning: could not create compact unwind for __ZNSt6vectorISsSaISsEEC1IPKPKcEET_S7_RKS0_: dwarf uses DW_CFA_GNU_args_size
ld: warning: could not create compact unwind for __ZSt9__find_ifIN9__gnu_cxx17__normal_iteratorIPPN7testing8TestCaseESt6vectorIS4_SaIS4_EEEENS0_5__ops10_Iter_predINS2_8internal14TestCaseNameIsEEEET_SF_SF_T0_: dwarf uses DW_CFA_GNU_args_size
Undefined symbols for architecture x86_64:
  "testing::internal2::PrintBytesInObjectTo(unsigned char const*, unsigned long, std::__1::basic_ostream<char, std::__1::char_traits<char> >*)", referenced from:
      testing::internal2::TypeWithoutFormatter<std::nullptr_t, (testing::internal2::TypeKind)2>::PrintValue(std::nullptr_t const&, std::__1::basic_ostream<char, std::__1::char_traits<char> >*) in test.cpp.o

GoogleTestのmakefileを見ても、testing::internal2::PrintBytesInObjectToがあるソースをちゃんと含めているし、謎状態。 色々試行錯誤しても解決しないので、古い版(1.7.0)を落として同じ手順でやってみたら、うまく行きました。。。

f:id:osajiru:20150505020129j:plain

BlackBerryClassic買ったので、レビューからのカーナビ遊び

またやっちまった。。。

BlackBerryClassic。
このままでは買ってしまう、どうしよう。
と悩んでいるうちに買ってしまった。。。
またやっちまった。。。

f:id:osajiru:20150111153706j:plain

独身一人暮らしのボクは、叱ってくれる人がいないので、
とりあえず、自分で自分の尻をペチペチ叩いて、戒めた。

ひと通り戒め終わったので、まずはレビュー。

デカイ

届いてみての印象は、デカイ。
デカイとは聞いていたが、やはりデカイ。

f:id:osajiru:20150111153809j:plain

見て、あぁ・・・ってなった。
このあぁ・・・は、
ラーメンと一緒に餃子2、3個食べたいんだけど、一皿単位でしかない。
多分5個くらいだろうからいいやと注文したら、7個だった・・・
的なあぁ・・・。

9900やQ10は小銭入れ感覚で持ち運びできたけど、これは長財布感覚。
BlackBerry使うメリットがちょい減ったかなという印象。

でも、デカイだけあって、キーがものスゴく打ちやすい。
こりゃまた、ものスゴく打ちやすい。

回線

自分はDOCOMOなので、それでしか試していない。
とりあえず自分の縄張りの横浜では、常にLTEで繋がっている感じ。
2、3年前のBlackBerryと較べて、今のこの回線速度。
涙が止まらない。。。

ちなみに、SIMカードはnanoSIM。
miniSIMしかない場合は、ドコモショップ等へレッツゴー。

そしてトラックパッド

この機種の目玉は、なんといってもトラックパッド。
9900の頃まであった、使いやすい理由の半分くらいを占めていたトラックパッドが戻ってきたのだ。
やっとこさスティーブ・ジョブスの呪いが解けて、本当のBlackBerryが戻ってきた。

あとは、BlackBerryOS10でどの程度サポートしているか。。。

で、触ってみると・・・・

完璧・・・
あの頃のBlackBerryのトラックパッド操作が、そのまま出来る・・・・

正に、BlackBerry社がコンセプトにしている
「BlackBerry9900ユーザーの"Upgraded"」
を体現した端末だ。

感動しすぎて外に飛び出した

完璧だけどデカイ。デカイから画面もデカイ。
画面がデカイからカーナビとしても普通に使えるのでは?

ボクは、Android版GoogleMapを早速インストールし、車へ乗り込んだ。
GoogleMapアプリは、AmazonAppStore(プリインストールされているGooglePlay的なアプリ。
たぶんKindle用のAmazonサービスをBlackBerryに流用したもの)に無いので、自分であんなことやこんなことをして入手する必要がある。

操作した様子Youtubeにアップしてみた。

GoogleMapのログインは、AndroidOSに密にくっついているのかどうか分からないけど、できない。
でもナビ機能はそれなりにできる。

当分この端末一本で大丈夫そう。。。

(2015.1.17追記)

香港版なので中文ストロークが印字されています。(黄色い部分)

f:id:osajiru:20150117181609j:plain

BB9900との比較です。

f:id:osajiru:20150117181650j:plain

f:id:osajiru:20150117181700j:plain

ビットコインが起こす社会のパラダイムシフト

ビットコイン

ビットコインは、はじめて通貨として一般レベルで使用できる機能を実現した、現在最も普及している暗号通貨です。

今のところ、主に電子マネー的な役割や投資(機?)目的で利用されています。

このこと自体が大きな成功ですが、この成功の内側に、より重要なことがあります。

それは、社会のパラダイムシフトを起こす起点になるかもしれない新しい仕組みを、通貨の世界に作り出したということです。

通貨がなぜ通貨として機能するのでしょうか。

それは、使う人々がそれに価値があることを信じているです。

では、何を根拠に信じているのでしょうか。

それは、中央銀行がその通貨の価値を管理すること、そのバックにある法と権力がそれを守らせることを信じているからです。

ものすごく短くまとめると、

「法と権力により通貨システムという秩序が維持されている」 ということです。

一方ビットコイン。

この暗号通貨は誰も管理していません。あるのはビットコインのP2Pネットワークとそれに繋がれたビットコインソフトウェアのみです。これで通貨価値を維持しています。

なぜこのネットワークに存在するデータが通貨的価値を持つのでしょうか。

それは、暗号技術をベースにして作られたアルゴリズムが、データを正しく維持し、価値交換や保管用途に使用できることを信じているからです。

ビットコインのネットワークに繋がれたそれぞれのマシンは、個々に世界全体のビットコインの帳簿情報(の履歴)を持っています。

このネットワークを構成するソフトウェアは、帳簿情報の改ざんや二重送金などの不正ができないようなアルゴリズムをベースにして動いています。

この、改ざんや不正ができないことが数学的に確実なことに対する信頼。

これが、ビットコインが価値を持つ根拠となっています。

法と権力に対する信頼ではなく、暗号とアルゴリズムに対する信頼。 これが、人間の欲望が最も表出し、無秩序になりやすい「通貨」の世界に秩序を作り出し、この通貨に価値を持たせています。

法と権力による秩序ではなく、暗号とアルゴリズムによる秩序

これが、ビットコインが作り出した、パラダイムシフトを起こすかもしれない新しい仕組みなのです。

人間は、集団で行動することで自然の脅威の中を生き残り、活動する領域を広げてきました。

集団が機能するためには、その中に秩序が必要となります。

人間は、秩序を維持する仕掛けをいくつも発明してきました。

道徳的本能

人間が自然の中で優位な地位に着きはじめると、人間の最大の脅威は他の人間集団になりました。

その人間集団同士が争い、淘汰されていく中で、より結束した集団が生き残りました。

初期の人間集団は、サルや類人猿の集団と近い状態だったでしょう。

動物行動学者のフランス・ドゥ・ヴァールは、これらの動物を長年観察し、「道徳性誕生への道筋」という状態で暮らしていると述べました。

これらの動物だけが持つ特徴に、群れの中で争いが起きると他の個体が頃合いをみて和解や仲裁に入る行動があります。内輪揉めをしていると他の集団に滅ぼされてしまうためです。

また、公平性の観念も持っています。人間がサルの個体それぞれにブドウを与え、一匹だけにキュウリを与えると、不公平さに怒りを示します。

このような、道徳の起源となったと思われる本能が、秩序を作っていたと考えられます。

音楽、踊り(原始宗教)

やがて人類は、高度な知能を持ち始めました。 その知能で、個体それぞれが、何が自分の利益になるかを考え始めました。 そしてそれは、大抵、所属する集団の利益とは異なるものでした。

それぞれの個体が自分の利益を求めた行動を取ると、集団として機能しなくなります。

これを食い止める発明が起こりました。

音楽、踊りです。

集団にあわせてリズミカルで激しい運動を行うことは、高揚感と集団への一体感を生み出しました。

集団の仲間と集団自体への愛情が深まり、結果、自分の利益だけではなく、仲間の利益、集団の利益を考えるようになりました。

また、その中でトランス状態へと行き着き、そこにある超自然的な存在に自分達が従う対象を見出し、それがまた秩序を生み出しました。

農耕の発明により定住が始まり、富の蓄積ができるようになりました。それにより、集団の規模が大きくなりました。

それを維持するために階層が生まれました。

支配、被支配の構造が生まれ、それを正当化するために超自然的な存在が利用されました。

音楽や踊りによる超自然的な存在へのアクセスは禁止されました。そして、その周りに体系が作られ、宗教と呼ぶものとなりました。

支配、被支配の構造と、それを正当化する宗教の体系により、秩序が作られました。

デカルトやニュートンにより、合理主義的な考え方が広まってくると、超自然的な存在が疑われ、宗教自体の根拠が薄れてしまいました。

それまで、宗教をベースに作られてきた集団のルールの内、合理性の部分と道徳性の部分の分離を行い、合理性の部分を法とし、その法を根拠として権力の正当性を保つ形となりました。

法と権力による秩序です。

これは現在まで続いています。

このように、秩序は、文明の発展によって適合しなくなる度に新しい方法が発明され、それにより形作られてきました。

法と権力の限界

インターネットの誕生

インターネットが広まると、個人の情報収集力や発信力が大幅に高まりました。

それにより、今まで見えなかったり抑えこんだりしてきた個人の本質的な指向と、所属する集団の秩序との違いが浮かび上がってきました。

また、法と権力による中央管理でもたらされる、最大公約数的な権利や中央から見ての最適な負担の配分など、個人レベルで見ると不公平だったり非効率だったりする点も顕わになってきました。

最近でも、アラブの春、ISILに向かう先進国の国民、シャルリー・エブド紙襲撃テロ、スコットランド独立運動、沖縄県と日本政府の関係など。

これらは、中央集権の限界が表出したものように見えます。

空間・時間・専門化

交通手段、通信手段が発達や、知識や趣味嗜好の細分化により、国を越えたレベルでの交流がより頻繁に行われるようになってきています。

企業等の組織は国をまたぐ形で存在したり、別の国の組織と利害を共有したりしています。

技術の進化は加速し、ある技術の評価が定まり、対応した法が整備されるより前に、そこで想定した範囲を超える形で別の技術が生まれてきています。

最近のドローンを使った事件、事故などは、その典型です。

このようなものに対するものとして、中央集権が適さない形になってきているように見えます。

人間による管理

国など永続するように見える組織は、それを運営する人間同士が共通の利益で繋がり、本来の目的を逸れて、その共通の利益を追求する存在へとねじ曲がっていきます。

世界中の集団は、昔からこれを繰り返してきました。

法治国家と言えども、法を作るのも運用するのも人間。

民主主義と言えども、選ぶのも選ばれて権力を持つのも人間です。

人間は、何よりも自身の利益を優先します。 また、能力不足やその時々の感情で容易に判断を誤ります。

権力分立やマスメディアの監視など、これに対応する方法が生み出されてきましたが、その権力を持つのも人間であり、根本的な解決になっていないように見えます。

ビットコイン2.0

ここ数年、ビットコインの分野で新しい動きが出てきています。 smart contract、bitcoin2.0、crypto2.0といった呼ばれ方をしているものです。

ビットコインは、ブロックチェインというデータベースによって成り立っています。

ビットコインのブロックチェインは、ある時点の帳簿情報をブロックとし、そのブロックをチェーンのように履歴として積み上げる構造となっています。

そして、新しいブロックを積み上げるまでの間に世界中で行われた送金情報をトランザクションという形持ち、それぞれのマシンで持っているブロックチェインとトランザクションの内容を検証し、新しいブロックを作り上げます。

(ここにはProof of workというアルゴリズムが入り、本当はもっと複雑なのですが、今回の投稿の中では重要な部分でないので省略します。)

新しい動きとは、このビットコインの帳簿情報を契約情報、さらにはもっと広い範囲の情報に、送金情報を契約履行情報、さらにはもっと範囲の広い契約更新情報へと適用範囲を広げようというものです。

これにより何ができるかと言うと、一般的に言われているのは、第三者無しの第三者預託(エスクロー)、保険会社無しの保険、先物会社無しの先物取引などです。

契約の関係者間だけで(それを管理する組織を置かずに)契約の履行ができるというものです。

その契約は、法と権力ではなく、暗号とアルゴリズムによって守られます。

この技術は、インターネットの普及により表出してきた社会の矛盾の解決に、適合するように思えます。

全く新しい流れのため、問題は次から次へと出てくると思われますがが、この動きが社会のパラダイムシフトを起こすことになるかもしれません。

© 2009-2017 Osajiru All Rights Reserved.