人生迷子

大学院に復帰!現在はBridge of Fashionという団体でファッション業界と他の業界を繋げる活動を定期的に行いつつ、徒然なるままに自分が思ったことをブログにまとめています。

【プロダクト紹介】初めの一歩【TkInterを用いたログインウィンドウ】

※このプロダクトは変更が加えられたため、使用方法が大幅に変わりました。 それに伴い、この記事の内容も書き換えられています。

【台風はいづこ】

こんばんは。台風が近づいてるっつーから 普段はあまり持たないふつーの傘持ってったら 一滴もふりゃーしない!

傘ってこう電車で本読む時とか本当に邪魔なんですよね。 傘のクラウドとか欲しい。降ったときに傘を取り出したい←

【これがほんとのIoT】

くだらないこと言ってないで本題へ

今回は自分がgithub上にアップしているプロダクトの紹介をしてみたいと思います。 まあプロダクトっつってもすごい簡単なものなんですが、 こういう簡単なものの積み重ねからも得ることもあるし、 とにかく誰かの役にたてばよいなーと思って紹介してみます。

今回紹介するのはこちらpythonプログラムです。

【作った背景】

元々アルバイト先でpython2.X系のプログラムを書いていたんですが、 あるときに会社が提供しているホームページの記事を自動で作成してくれるような アプリケーションの開発を頼まれまして、 記事の作成自体はmechanizeとかを使って簡単にできたんですが、 肝心のプログラム起動の部分で 依頼してきた社員さんから 「プログラムを実行する時に実行したユーザ毎のアカウントとパスワードでログインして記事作成をしてほしい」 と頼まれたわけです。 ただこういうプログラム使う人って 真っ黒の画面とか慣れてないから 標準入力でユーザ名とかパスワード入れてもらおうとしても なかなかよろしくないわけです、見栄えが笑

んでどうしようかなーと思ったときにこちらのモジュール(?)を作ってみました。 これを使えばプログラム実行時に下のようなwindowが立ち上がってユーザに入力を要求します。 ユーザが入力を完了すると 予め登録された関数に入力パラメータを渡して関数を実行してくれます。

f:id:AkeruE:20140810023457j:plain

【使い方】

以下ではgithubにもあがっているsample.pyを参考に使い方を説明します。 まずLoginFrame内にあるlogin_frameのframe_wrapperデコレータをプログラムからインポートできる適切な場所に配置してください。 よくわからん人は実行したいプログラムと同じ場所でOKです。

そしてsample.pyのようにframe_wrapperデコレータをインポートします。 今回の例ではsample_functionをframe_wrapperデコレータでラップしています。 デコレートされる関数はユーザ名とパスワードを引数として定義されている必要があります。 ですが、実際に関数を呼び出す場合には無引数で呼び出して構いません。 (今回はsample_functionとして定義しています)

ユーザ名とパスワードを引数として受け取ったsample_functionは今回はその二つを標準出力に出力するに留めていますが、 適宜この関数を編集すればホームページの認証を通るプログラムをかけたりします。

ちなみにログインウィンドウというだけあって、パスワード入力の表示はきちんと"*"で代用されるようになっています。

# -*- coding: utf-8 -*-
from __future__ import division, absolute_import, print_function, unicode_literals

from login_frame import *

@frame_wrapper
def sample_function(username, password):
    # Do something to log in
    print("Login Name: {}".format(username))
    print("Password: {}".format(password))
    return

@frame_wrapper(title="Other frame window", message="他のメッセージも指定可能")
def sample_function2(username, password):
    # Do something to log in
    print("Login Name: {}".format(username))
    print("Password: {}".format(password))
    return

def main():
    sample_function()

if __name__ == "__main__":
    main()

【オプションも充実】

このフレームをログインウィンドウ以外でも(もしかしたら)使えるかもしれないと思い、 以下のようなオプションを用意しました。

  • title: ウィンドウのタイトルを変更できる.デフォルトは"Login Window"
  • message: ウィンドウ内のメッセージを変更できる.デフォルトは"ログイン名とパスワードを入力してください。"
  • first_label: 一つ目の入力欄のラベルを変更できる.デフォルトは"ログイン名"
  • second_label: 二つ目の入力欄のラベルを変更できる.デフォルトは"パスワード"
  • visible: Falseにすると二つ目の入力文字が"*"に変更される.デフォルトはFalse

これらをきちんと設定すればログインフレーム以外にも利用は可能です。 ただパラメータ二つを入力するのってログインの時以外になかなかないですようね笑

【しょぼいとか言わない】

確かにたいした実装量ではないですし、 たいしたこともやってないんですが、 それでもこれあれば便利ー♪ってなる人も世界のどこかにはいる(かも)しれないし、 他の人たちが同じような実装をしなくて済むなーと思って githubに挙げてみました。

今回初めてデコレータ機能を駆使して少しでも使いやすいようにと工夫してみましたが、 まだまだframe_wrapperの定義で冗長な箇所が散見されます。 ぜひもっとスマートに書けると言う方はプルリクおねがいします!

【参考文献】

デコレータはこちらの記事を参考にしました! Pythonのデコレータを理解するための12Step とてもわかりやすいですね☻

普段は

初めてのPython 第3版

初めてのPython 第3版

を使用してpythonは勉強しているんですが、 デコレータの話はこちらにはあまり載っていませんでした・・・

【とりま】

こういうとりあえず挙げて見る精神大事だと最近思っております。 ニッチな需要ではありますが、もしこういう需要がある人はぜひ使ってみてください。

ちなみにwindowsmacでは動くことを確認してます。 悪しからず!

【書評】夏だし書評しよう【統計学が最強の学問である】

【意味わからん】

暑さにやられました。AkeruEです。 どーもどーも。

夏だしってわけでもないんですが、 最近通学中とかずっと本読んでまして、 エンジニア力ないくせに全然エンジニアっぽくない本ばっか読んでるんですよ 完全に反骨精神(何が)

【完全にテンションでお伝えしてます】

とまあそんなわけでせっかく今日一冊読み終わったので ちょっと前からやってみたかった書評をやってみたいと思います

【注意事項】

書評とかかっちょいい名前つかってますけど 完全なる感想文をつらつらと書き連ねたものたちです。 そこらへん悪しからず!

【書評第一号】

てなわけで書評第一号はこちら

統計学が最強の学問である

統計学が最強の学問である

もうなんつーか、うん。言い切っちゃう?大丈夫?言い切っちゃって? みたいな心配しちゃう本です(俺だけ) ブックオフで徘徊してたときに見つけて買ってみたんですけど、 なんとなーくね

結構面白かったです。 全然統計の知識とかないんですけど、 統計のバックグラウンドなしでも全然よめちゃうし 大学時代に完全放棄してたベイズの確率の話とかもわかりやすく載ってたりして 「あーそういうことだったの」みたいにすっと腹落ちします。はい。

おかけで統計に結構目覚めまして、 本格的な統計知識身につけようかななんて 思ったりして、 もっと専門的な統計学の本買ってしまった次第です (ミーハーです)

【実際最強(になりつつある?)】

最近はDeNAがDNA解析(紛らわしいーーー)に手を出したりして、統計がわかるエンジニアとかを結構探してるらしいです。 エンジニアが異常なまでにあふれているこの時代には、 よっぽどエンジニアリングを極めるか何か付加価値を持つしか生き残りの道はないように思いますが、 そんな中でデータマイニングとかDNA解析とかビッグデータとかはやってる今だからこそ、 エンジニアは統計やる価値があるのではないかなーと思います。

ちなみに本書の中でもデータマイニングとかビッグデータの話は書いてあり、 現在のビッグデータ流行に対する疑問とか正しいデータの扱いかたなんてものも書いてあります。

【一点注意】

この本はあくまで入門書の入門くらいの話でして、 専門的な数式とかそういうのは全然出てきません。 だからこそ分かりやすいんですけど 途中から「うおーー!統計やりてえーーー!いつになったら統計の突っ込んだ話がくるんじゃーー!」といきり立ってると 結局一度もそんな話でずに、終わってしまいます。 ある程度統計学を知ってる人とかはあまり読んでも意味ないかも

【初めての書評】

まあ、

こんなもんすよねw あんま詳しく書く訳にもいかないし、 文章力ないし 興味がある方は手に取ってみると良いと思います。

JavaでopenMPIを使い始める時のメモ

【何気に初めての投稿】

登録はしてみたものの何書けばよいかわからん状態でしたが、 最近研究でMPIをいじることになり、 OpenMPIをインストールしようとしたら Java使えるようにするための記事とかが案外なかったりしたので、 「良い機会だしまとめてみよう」と思い至り、書いてみました。

環境はMac OSXです。

【OpenMPIとは】

MPIの実装の一つで並列プログラミングを簡単にかくことができるようになります。 詳しくはこちら

他にMPICHLAM/MPIなどがあります。

OpenMPとは別物なのでご注意を!!(紛らわしい笑)

【MPIとは】

MPIは"Message Passing Interface"の略で分散メモリを使った並列計算処理を行う際に発生するメッセージ通信のためのライブラリ規格を言います。

Wikipedia: MPI

【MPIを書きたい!!でも・・・】

OpenMPIでは標準ではC言語Fortranで書かれたものしか動かないんですね。 今のご時世にFortran・・・,C言語・・・ (ちなみにこの前研究室で僕がC言語で卒論のプログラムを実装したことを話したら「よくC言語なんて書けるね笑」と言われてしまいました笑)

しかし、ちょっとした手間を書ければOpenMPIに備わっているJavaインターフェースを利用してJavaプログラムからOpenMPIを利用することができます! 今回はこの手順を説明したいと思います。

【てか何故OpenMPIなのか】

そもそもJavaでMPIを利用するライブラリとしては他にもMPJmpiJavaなどがあります。これらはデフォルトでJavaから利用できる(名前からJava使える感漂わせてるし)のになんでお前OpenMPIなんじゃと思われるかもしれません。 実は僕自身も最初はMPJを入れていたのですが、研究室の先輩にいわせるとMacでプログラムを書いた後にそれをLinux系の環境で動かそうとするとハマることがあるらしいです。 てか過去に先輩がハマったらしいです・・・。 修論でハマるなんて絶対にやだ!ということで泣く泣くOpenMPIインストールにチャレンジしました。

ちなみに「Macでしかプログラム書かないし、動かさない」って人とかは別にMPJとかで全然いいです。てかそっちの方が楽です。 ぜひMPJで楽しいMPIライフを!

【手順1: OpenMPIのダウンロード】

Mac使ってるとほとんどbrewとかportsとかなんですけど 今回はconfigureの際にオプション設定しなきゃいけないんで、自分でmakeしてインストールします。 (brewとかでもできるよ!って人はぜひ教えてください><)

ダウンロードはこちらから

自分が使ってるjdkと同じバージョンのものをダウンロードしましょう。 (jdk1.8を使ってるならv1.8)

【手順2: 解凍してconfigure】

次にダウンロードした圧縮ファイルを解凍し、コマンドラインからそのフォルダに移動します。 (そのフォルダ内に"README.Java.txt"というものがあります。英語ぺらぺーらの人はそっち読む方が確実です)

フォルダに移動したら以下のコマンドでconfigureを実行します。 ポイントは二つ!

  • "--enable-mpi-java"オプションを付ける。これでJavaインターフェースを利用できる。
  • prefixオプションを指定して自分のインストールしたい場所を指定する。このパスは自分の環境に合わせて変更する。自分の場合は"/Users/{ユーザ名}/Library/openmpi/"としました。
$ ./configure --prefix=/hogehoge/openmpi --enable-mpi-java

【手順3: make & install】

あとはぱぱっとmakeしてインストールしましょう!(といってもこれが実はとても時間かかる汗)

$ make
$ make install

【手順4: PATHを通す】

さてこれでインストールできたーと思ってJavaで"import mpi.*;"なんてしようものなら 「あ?んなもんねえよ!」 とIDEに怒られます。 MPIプログラムを実行する時に使用するmpirunコマンドなども使用できない・・・。 そこで環境変数にopenmpiの実行パスを追加します。 以下を.bashrc、もしくは.zshrcに追加してください。 ついでにMANPATHも追加してmanコマンドでmpiのコマンドが見えるようにしておきます。

export PATH=/hogehoge/openmpi/bin:$PATH
export MANPATH=/hogehoge/openmpi/share/man:$MANPATH

これで設定を読み込むために

$ source .zshrc

を実行すればOK! (bash使いは"source .bashrc")

"man mpirun"などを実行してmpirunコマンドの説明が確認できるか試してみてください。

【手順5: 共有ライブラリパスにmpiライブラリを追加】

以上の手順を踏んで「いざ!MPI実行!」と意気込んで実行すると 「bindings failed to load required library 」と二度目のお叱りを食らいます。(俺は食らった) 日本語でおkといった感じですが、要は「君が使おうとしているライブラリなど俺は知らん!」ってことです。 なのでLD_LIBRARY_PATHにmpiライブラリのパスを追加する必要があります。 先ほどの設定ファイル(.zshrc or .bashrc)に以下を追加します。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/hogehoge/openmpi/lib 

これでまた

source .zshrc

して設定を読み込む。 そうすればJavaで念願のMPIプログラムが実行できます!

【とはいうものの・・・】

長い道のりではあったものネットを探してもJAVA版のOpenMPI APIとかがなかなか無いわけですよ。 いやー世の中世知辛い汗 なので、最初にも言いましたが、ほんとに自分みたいに諸事情がない限りはmpiJavaやMPJを利用することをおすすめします。

【それでもOpenMPIを使いたいあなたへ】

とりあえずはダウンロードしたフォルダの中にexampleが入っているので そのプログラムを動かして遊んでみましょう。

OpenMPIについての詳しい説明はここが良いです。

【お初でした】

というわけで初投稿でした。 見苦しい所やもしかしたら間違っている部分もあるかもしれませんが、 もし間違いがあったり、こうした方がいいよなんて意見があればぜひ教えていただければと思います。

【アウトプット大事】

最近、インターンの面接とか受けてると思うんですが、 ほんとにこの年になるとアウトプット大事ですね。 いくら「自分はこんだけ頑張った」とか「自分はこんなにすごい」って言っても 結局(エンジニアは特に)プロダクトやこのブログみたいなアウトプットがないと 見向きもしてもらえないなーっと実感していました。 なので、今回このエントリーも書いてみたし、これからもコンピュータサイエンスの話に限らず いろいろアウトプットしてみようと思います。

終わり