27 Feb 2018, 13:56

プログラマになりたい

プログラミングの経験値をソースコードのステップ数で測るのは間違いかもしれないけれども、参考にはなる。仕事で、ほとんどプログラミングを仕事でさせてくれない気がしてきたので、本当にそうなのか、振り返ってみた。

職務履歴はgithubで管理している。

  • ETERNUS DX フォームウェア開発 201004-201401
    • 1000 C言語
    • 2000 C言語
  • 統合保守エンジン開発 201402-201407
    • 2000 Ruby
  • WAN 高速化開発 201408-201502
    • 4000 Java
  • AGL プロジェクト 研究開発 201503-201506
    • なし
  • ServerView Infrastructure Manager 201507-201512
    • なし
  • 現在
    • 1000 Java

合計で、1万ステップいくかいかないかかな。8年間で、これだ。泣けてくるな。

自分はプログラミングが好きで、プログラマになりたいのだけれども、これではプログラマ(笑)もいいところだ。プログラミングが得意でないからやらせてくれないのか、それともやらせてくれないからいつになっても得意にならないのか。

こんな環境に耐えて、いつかたくさんプログラミングをさせてくれることを夢見て待っている自分はなんて忍耐強いんだろう!社畜だなぁ。しかし、ここ数年だと、あまりにプログラミングをさせてくれないので、ノイローゼになって会社を休職してしまった。プログラマになりたい。

24 Feb 2018, 20:22

futurismo.fm 1. Futurismo.fmをはじめました

 

futurismo.fmをはじめたきっかけ、1月2月で散財したガジェットについて話しました。

show notes

  • 24 Feb 2018, 20:02

    tsu-neraが気になった技術のことをゆるく語るPodcast、Futurismo.fmをはじめました

    はじめに

    最近、きまべんでgaaamiiiさんとやりとりすることがあるのだけれども、この前「くもキャスト」というPodcastを運営していることを知って、結構驚いた。自分よりも若い世代の人たちが、podcastを通じて情報を発信しているところに共感した。

    また、Udemyを眺めていたら講座の中で、podcastをつくってみようというという講座があったので見てみた。内容は陳腐で参考にならなかったものの、タイトルだけ役に立った。

    もちろんブログで情報発信するのはしているけれども、声で情報発信するのも斬新で面白いかもしれない。というわけで、とりあえずやってみようということでやってみた。

    Futurismo.fm の立ち上げ

    Futurisimo.fm 放送局の立ち上げである。

    SoundCloudで音源が公開できるときいたので、ここで音源を公開していこうと思う。立ち上げについては、ゆーすけべーさんの資料がとても役に立った。

    更新頻度は、まあ月に1回更新できればいいかな。一回の分量は10分くらいを目安に。

    内容は、ブログで発信しているような、興味を持った技術情報やライフハックについて語っていこうと思う。

    というわけで、これからよろしくお願いしますm(._.)m

    12 Feb 2018, 11:36

    Google Homeで DI.FMのTech Houseを聴く

    はじめに

    プログラマーならば、テクノ・ミュージック、ですよね。

    とてもとてもニッチな小ネタだけれども、誰かの役に立てれば。

    自分は、作業用音楽として、Digitally Importedの Tech Houseを溺愛している。

    テクノ・ミュージックを聴くと、テンション上がって作業がとても捗るのだ。Google Homeを購入したので、せっかくいいスピーカーなので、これで聴きたい!

    ということで、Digitally ImportedのTech House のチャンネルを聴く方法を試した。もちろん、同様の方法は、JazzRadioでもいける。

    ChromeCastできくとwifiが切れる

    まず思い付いた方法は、Google Chromeのキャスト機能を利用して、Google Chromeで流れている音楽をGoogle Homeに転送して聴く方法。

    これでうまく行った、と思いきや、なぜかwifiが1分もするとブツブツ切れてしまう。失敗。

    iPhone経路で聴くことに成功

    調査を続けると、Digitally Imported が Chromecastをサポートしているとのこと。

    試しに、iPhoneアプリを起動してみて、上記記事のようなアイコンを押すと、なんと流れた!おおーっ。

    パソコン経由で聴くことに成功

    欲を入れば、OK Google, テクノ・ミュージックかけて、で音楽を流したい。なので、パソコンからやる方法を調べた。pychromecastを使えばいけた。

    まずは、digitally importedのstream urlをしらべる。

    次に以下のスクリプトを書いた。

    #!/usr/bin/env python
    import pychromecast
    
    def play_mp4(url):
        cast.wait()
        mc = cast.media_controller
        mc.play_media(url, 'audio/mp4')
        mc.block_until_active()
    
    chromecast_name = "Main"
    chromecasts = pychromecast.get_chromecasts()
    cast = next(cc for cc in chromecasts if cc.device.friendly_name == chromecast_name)
    
    play_mp4("http://pub2.diforfree.org:8000/di_techhouse_hi")
    

    これを実行すると、Tech Houseが流れた。いえい!あとは、こことかでやった方法を応用して、声のインタフェースを用意すれば完成!

    09 Feb 2018, 15:29

    pychromecastでお手軽にGoogle Homeから時報を鳴らす

    はじめに

    Google Homeで 時報を鳴らしたい。こんな記事があり、試してみようと思った。

    google-home-notifierというツールを使うのが王道なようだ。

    しかし、いかんせん、node.jsがわからない。。できれば、いつも使っているPythonでやりたいなーと思っていろいろ試した結果、pychromecastというものをつかうと、GoogleHomeから音楽を鳴らすことができたので、そのメモ。

    pychromecastをつかう

    pychromecastを使うと、かなりお手軽にやりたいことが実現できた。

    pip install pychromecast
    

    Web上のリソースをGoogleHomeで鳴らすことができるので、以下のダウンロードサイトから、音源を鳴らすことにした。

    コードは以下。

    これを実行すると、Google Homeから音を鳴らすことができる。

    cronで定期実行

    cronで1時間ごとに実行するように、設定してみる。 crontab -e で Ok。

    0 */1 * * * python google-home-jihou.py
    

    これで、ピッピッピっポーン。

    04 Feb 2018, 14:20

    Google Homeから Linux上のパソコンをコマンド操作を自由にする

    はじめに

    GoogleHome/ IFTTT/ Beebotte、そして Pyhtonを使えば声をトリガーに任意の作業ができる。前回、ダーゲットPCに対して、別のサーバを用意していたけれどもど、今回の場合は実行したいPCを用意すれば良い。

    まずは結果を。

    [https://www.youtube.com/embed/ue_UKf3HSZE]

    システム構築

    基本的には前回の記事と同じだ。

    マシンが違うので、異なるチャンネル beebotteで作成した。

    出来るようになったこと

    こである声をトリガにして、処理を実施するということができるようになった。

    具体的には、

    • モニター OFF
    • モニターON
    • パソコン シャットダウン
    • パソコン Sleep
    • パソコン再起動

    しかし、これだけではない。Linux上で実施するあらゆる操作がpythonコードを介して実現可能となった。これは大きな一歩だ。

    #!/home/tsu-nera/anaconda3/envs/py3/bin/python
    import paho.mqtt.client as mqtt
    import json
    import os
    
    HOST = 'mqtt.beebotte.com'
    PORT = 8883
    CA_CERTS = '/home/tsu-nera/repo/python-scripts/mqtt.beebotte.com.pem'
    TOKEN = '[チャンネルのトークン]'
    TOPIC = 'Galleria/voice'
    
    MONITOR_ON_CMD = "xset dpms force on"
    MONITOR_OFF_CMD = "xset dpms force off"
    PC_SLEEP_CMD = "systemctl suspend"
    PC_OFF_CMD = "shutdown now"
    PC_REBOOT_CMD = "shutdown -r now"
    
    def on_connect(client, userdata, flags, respons_code):
        print('status {0}'.format(respons_code))
    
    def on_message(client, userdata, msg):
        data = json.loads(msg.payload)["data"][0]
        print(data)
        if data["device"]=="monitor" and data["action"]=="on":
            os.system(MONITOR_ON_CMD)
        elif data["device"]=="monitor" and data["action"]=="off":
            os.system(MONITOR_OFF_CMD)
        elif data["device"]=="pc" and data["action"]=="スリープ":
            os.system(PC_SLEEP_CMD)
        elif data["device"]=="pc" and data["action"]=="シャットダウン":
            os.system(PC_OFF_CMD)
        elif data["device"]=="pc" and data["action"]=="再起動":
            os.system(PC_REBOOT_CMD)
        else:
            print("Ivalid requset")
        
    if __name__ == '__main__':
        client = mqtt.Client()
        client.on_connect = on_connect
        client.on_message = on_message
        client.username_pw_set('token:%s' % TOKEN)
        client.tls_set(CA_CERTS)
        client.connect(HOST, PORT)
        client.subscribe(TOPIC)
        client.loop_forever()
    
    

    04 Feb 2018, 06:37

    Google Homeから Wake on Lanで パソコン起動

    はじめに

    Google Homeに 「パソコンつけて」といって、パソコンを起動してみました。

    [https://www.youtube.com/embed/B1FW42dwSWs]

    仕組み

    必要なものは以下です。

    • Google Home(Google Assistants) ・・・ 音声インタフェース。トリガを与える口。
    • IFTTT(https://ifttt.com/) ・・・ Google Assistantsからの通知をトリガにして GET リクエストを Beeboteに投げる。
    • Beebotte(https://beebotte.com/) ・・・ MQTTメッセージBroker。 IFTTTからのRestを受け取る。Mindstormsからの mqttのポーリングに応答する。
    • Linuxサーバ(Raspberry Piをつかう人が大半だけれども、自分は持っていないので LEGO Mindstormsに ev3devいれている)
    • python + paho-mqtt ・・・ Pythonで mqtt通信を実施するためのライブラリ。
    • wakeonlan ・・・ wakeonlan発行ツール
    • 起動対象のパソコン

    処理の流れは以下のような感じ。

    • GoogleHome -(音声)→ IFTTT -(REST)→ Beebotte ←(監視)- Mindstorms -(wol)-> PC

    システム構築

    基本的には、以下の記事に従って構築しました。

    IFTTTや Beebotteの設定は上記記事に詳しく書いてあるので、参照してください。ここでは省略し、差分のみを書きます。

    Mindstormsでの設定

    Beebotteに通知されたGETリクエストを監視するために、paho-mqttを入れます。

    $ sudo apt install pip
    $ sudo pip install paho-mqtt
    

    以下のようなスクリプトをpythonで書きました。

    mqtt_client.py:

    #!/usr/bin/python
    import paho.mqtt.client as mqtt
    import json
    import os
    
    HOST = 'mqtt.beebotte.com'
    PORT = 8883
    CA_CERTS = 'mqtt.beebotte.com.pem'
    TOKEN = '[channelのトークン]'
    TOPIC = 'MySmartHome/voice'
    CMD = 'wakeonlan 70:85:c2:67:7a:66'
    
    def on_connect(client, userdata, flags, respons_code):
        print('status {0}'.format(respons_code))
    
    def on_message(client, userdata, msg):
        data = json.loads(msg.payload)["data"][0]
        if data["action"] == "on":
            os.system(CMD)
    
    if __name__ == '__main__':
        client = mqtt.Client()
        client.on_connect = on_connect
        client.on_message = on_message
        client.username_pw_set('token:%s' % TOKEN)
        client.tls_set(CA_CERTS)
        client.connect(HOST, PORT)
        client.subscribe(TOPIC)
        client.loop_forever()
    

    UbuntuでWake on Lanするための設定メモ | Futurismo

    このスクリプトをシステム起動時に起動するようにサービス化します。

    シェルスクリプトを作成。 /usr/local/bin/hal.sh

     #!/bin/bash
     /home/robot/scripts/mqtt_client.py 
    

    サービスファイルを以下のように、作成 /lib/systemd/system/hal.service

    シンボリックリンク作成。

    ln -s /lib/systemd/system/hal.service /etc/systemd/system/hal.service
    

    サービス起動。

    sudo systemctl daemon-reload
    sudo systemctl enable hal
    sudo systemctl start hal
    

    rebootして、サービス起動していればOK.

    29 Jan 2018, 15:31

    Scrapboxによる Futurismo Wiki 復活

    https://gyazo.com/79d7eb8d1532bbf9cf317bdfb486018a

    はじめに

    最近Scrapboxと言うウェブサービスを知った。こは何かと言うとタグで情報をくっつけることができるwikiだ。ちょうどモダンなwikiサービスを探していたところ見つけたのがこのツールだ。

    scrapboxのwikiとしての斬新性

    Scrapboxの斬新なところは、タグ によって情報をつなげることができるというところ。

    フォルダ構造で情報を管理するか、タグによって管理するかというのは、ちょっとした論争を引き起こしてきた。どうやってメールを管理するか、どうやってファイルを管理するか。

    今までの潮流は、ディレクトリごとにフォルダを管理したり、メールを管理してきた。しかし、gmailがラベルでメールを管理し始めたり、FennirFSがタグでフォルダを管理しはじめたように、タグによる情報管理というものが、主流になりつつある。それは、ビッグデータに適した情報整理の手法として、フォルダよりもタグのほうが優れていることの現れだと考えている。

    そこで、scrapboxである。 wikiというものの起源を考えてみると、ハイパーリンクという仕組みによって情報をつなげるところが魅力であった。

    scrapboxは、キーワードをタグ化することで、驚くほど簡単にそのつながりを実現することができる。ここが、今までにない点であり、驚くところだ。

    Futurismo Wiki の復活

    このブログの裏サイトには、Futurismo wikiというサイトがある。

    当時の意気込みをもう一度引用しよう。

    最近、以下のような課題を感じる。ブログに知識を集約していくことに限界を感じている。

    • 知識を体系的に整理することが不便
    • 知識を追記して膨らませて発展させていくことが不便
    • 知識と知識をつなげることが不便
    • ちょっとした備忘録をブログの記事にするのは気が引ける
    • 他人にとってはどうでもよいことをブログの記事にするのは気が引ける

    なぜ、Futurismo Wikiは停滞していまったのだろうか?それは、org-modeで記事を書いていたのだけれども、Emacsを利用しなくなってしまったからというのが大きな理由だ。

    別の理由は、知識をまとめるのが面倒だったからだ。しかし、上記に書いた課題というものは、今も変わらず抱いている。

    そこで、である。Futurismo Wikiの Scrapboxによる Rebornである。

    Scrapbox プロジェクト立ち上げ

    以下のようなプロジェクトを作ってみた。

    • private用プロジェクト ・・・私的なことがらをどんどん記録する
    • work用プロジェクト ・・・ 仕事で利用する情報法をどんどん記録する
    • Futurismo Wiki … ブログのフロー情報を集約するスタック情報サイト
    • きまべん … @gaaamii さんが運営する勉強するための場所。勉強ノートを投稿していく。

    おわりに

    心地よいツールを使っていると、楽しい。これからどんどんいろんなことを記録していきたい。

    work用と、きまべんプロジェクトでは作業ログを、Futurismo Wikiは技術情報の集約を、そしてprivateはまずは日記から。便利さを感じるには、まずは日記からはじめてみてはどうでしょうか?

    27 Jan 2018, 10:42

    Elasticsearch と kibanaで fitbitのデータを可視化する

    はじめに

    今まで収集されたデータを分析して、よい精度を出すことに躍起になっていたのだけれども、世の中そんなに簡単にデータが集まっているわけではない。データを集めることは結構大変なのではと思った。なので、データ分析の前にデータ収集を自前でやってみようと思ったのだった。

    何がデータ収集の対象がいいだろうと考えたのだけれども、自分のライフログを収集するのがまずは取っ掛かりとしては面白そうだ。これを英語ではQuantified Self というらしい。自分の行動履歴をマッシュアップで表示できると楽しいのではないか??

    そんな空想を実現するOSSを調べていると、どうやらElasticsearch と kibanaというツールが使えそうだ。というわけで、このツールをいじってみることにした。

    Elasticsearchとkibanaについて

    まずは、2つのツールの関係と機能について。Elasticsearchとは、データの全文検索エンジン。そして、kibanaは そのフロントエンドツール。どちらも同じ会社 elastic が開発しているOSS。

    Elasticsearchのインストールと実行

    ダウンロードは以下から。

    Ubuntuなのでdebを選択してDownloadします。

    $ sudo dpkg -i elasticsearch-6.1.2.deb
    $ systemctl start elasticsearch.service
    

    これで、http://localhost:9200 にアクセスして、以下のレスポンスを受ければOK.

    {
      "name" : "6UGX_mB",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "Ih-924HvSr6AxH7CMfWlZg",
      "version" : {
        "number" : "6.1.2",
        "build_hash" : "5b1fea5",
        "build_date" : "2018-01-10T02:35:59.208Z",
        "build_snapshot" : false,
        "lucene_version" : "7.1.0",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
      },
      "tagline" : "You Know, for Search"
    }
    

    kibanaのインストールと実行

    kibanaのインストールは以下から。

    Ubuntuなのでdebを選択してDownloadします。

    $ sudo dpkg -i kibana-6.1.2-amd64.deb
    $ systemctl start kibana.service
    

    これで、http://localhost:5601 にアクセスして、welcome画面がでればOK.

    CSV データを elasticsearchに投入する

    理想的にはリアルタイムでデータ収集したいが、まずは手元にある静的なデータを使う。まずはじめは、fitbitから得た心拍数をグラフ化してみよう。

    Fitbit Apiとpythonで心拍数の取得をする | Futurismo

    kibanaからCSVデータを投入する機能は、一時保留になっている。そこで、logstashを利用する。

    設定ファイルを以下のように書く。

    input {
      file {
        path => "/home/tsu-nera/repo/python-scripts/heartbeat.csv"
        type => "csv"
        start_position => "beginning"
        sincedb_path => "/dev/null"
      }
    }
    
    filter {
      csv {
        columns => ["time","value"]
        separator => ","
      }
      date{
        match => ["time" , "yyyy-MM-dd HH:mm:ss"]
        target => "time"
      }
      mutate {
        convert => { "value" => "integer" }
      }
    }
    
    output {
      elasticsearch {
        hosts => ["localhost:9200"]
        index => "heartbeat"
      }
    }
    

    コマンドラインから実行。

    $ logstash -f conf.conf 
    

    これで、elasticsearchにcsvのデータが投入された。Webから確認してみよう。

    kibanaでfitbitの心拍数をグラフ化

    kibanaにアクセスして、index patterns を作成する。 作成が完了すると、Management > Index Patterns から作成した name を持つ データが並んでいるのが確認できる。

    タブから Visualize を選択し、 Lineを選択。折れ線グラフを作成する。以下のようにY軸とX軸を設定。

    すると、以下のような折れ線グラフができる。素晴らしい。

    おわりに

    この記事を書いた背景は、以下の記事にとても影響を受けている。

    この記事みたいに、自分もライフログを収集してみたい。心拍数はつまらないな。まずは、睡眠と体重からかなー。

    27 Jan 2018, 07:41

    Fitbit Apiとpythonで心拍数の取得をする

    はじめに

    fitbit ionicを購入しました! fitbit Charge, altaに続いて、3台目の購入となります。ここまでくると私もfitbit マニア??

    購入の動機は、睡眠の深度を測る機能が欲しかったから。てっきり、浅い睡眠で起こしてくれる機能がついたと思ったのだけれども、それはなかった(T_T)。

    別の理由は、fitbit初のスマートウォッチということで、ディベロッパーとしてなにか応援できないかと思ったから。というわけで、このHackableなガジェットをハックします! Let’s Hack begin。

    Fitbit APIをつかってみる

    データの取得をするために、Fitbit APIを利用する。

    まずは、API の IDを取得する。

    https://dev.fitbit.com/login からログインして、 REGISTER AN APP を選択。情報を入力する。

    • Application Name 適当
    • Description 適当
    • Application Website 適当
    • Organization 適当
    • Organization Website 適当
    • OAuth 2.0 Application Type Personalを選択
    • Callback URL http://127.0.0.1:8080/ と入力
    • Default Access Type Read & Write を選択

    次に、Access Tokenを取得する。取得するために、Pythonのツール、python-fitbitを利用する。

    Access Tokenと Refresh Tokenをメモする。以下の4つはプログラムで必要になるのでメモする。

    • Client ID
    • Client Secret
    • Access Token
    • Refresh Token

    スクリプトの作成

    心拍数を取得するスクリプト。

    import fitbit
    import pandas as pd
    
    CLIENT_ID =  "xxx"
    CLIENT_SECRET  = "xxxx"
    ACCESS_TOKEN =  "xxxx"
    REFRESH_TOKEN =  "xxxx"
    
    DATE = "2018-01-26"
    client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET,
                           access_token=ACCESS_TOKEN,
                           refresh_token=REFRESH_TOKEN)
    
    stats = client.intraday_time_series('activities/heart', DATE, detail_level='1min')
    heart_beat = stats["activities-heart-intraday"]["dataset"]
    
    heart_df = pd.DataFrame.from_dict(heart_beat)
    heart_df.index = pd.to_datetime([DATE + " " + t for t in heart_df.time])
    heart_df.drop(["time"], axis=1, inplace=True)
    heart_df.plot(y="value", figsize=(20,5))
    import fitbit
    import pandas as pd
    
    CLIENT_ID = #
    CLIENT_SECRET  = #
    ACCESS_TOKEN =  #
    REFRESH_TOKEN =  # 
    
    DATE = "2018-01-26"
    client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET,
                           access_token=ACCESS_TOKEN,
                           refresh_token=REFRESH_TOKEN)
    
    stats = client.intraday_time_series('activities/heart', DATE, detail_level='1min')
    heart_beat = stats["activities-heart-intraday"]["dataset"]
    
    heart_df = pd.DataFrame.from_dict(heart_beat)
    heart_df.index = pd.to_datetime([DATE + " " + t for t in heart_df.time])
    heart_df.drop(["time"], axis=1, inplace=True)
    
    # plot
    heart_df.plot(y="value", figsize=(20,5))
    
    # export csv
    heart_df.to_csv("heartbeat.csv")
    

    以下のような時系列グラフが出力される。寝ている時間は心拍数が低い。