本日、とあるお客様のところへ作業に伺ったところ、3Dプリンタが稼働中でした。
3Dスキャナ付でなかなかお高い感じでしたが、お話によると3Dプリンタ単体なら10万をかるく切るお値段だとか。
ネットで検索してみても確かに6万円台のものがチラホラ。
危うくポチりかけました。
これから暫く物欲との戦いになりそうです。
深夜のネットショッピングを避けないと危ないかも。
本日、とあるお客様のところへ作業に伺ったところ、3Dプリンタが稼働中でした。
3Dスキャナ付でなかなかお高い感じでしたが、お話によると3Dプリンタ単体なら10万をかるく切るお値段だとか。
ネットで検索してみても確かに6万円台のものがチラホラ。
危うくポチりかけました。
これから暫く物欲との戦いになりそうです。
深夜のネットショッピングを避けないと危ないかも。
今週初めから、仙台へ出張に。
出張が続いていたため、現地で着替えのシャツを買い足すつもりで、ついでにもし寒くて我慢できなければコートも買ってしまえと考えていました。が、着いてみると寒いのは寒いものの夜間ずっと外を歩き続けるわけでもなくコートは買わずに我慢できそうでした。
そして2日目の仕事が終わり、仙台駅の改札を抜けながら「さて名物の牛タンでも~」と内ポケットに手を入れると…
財布が無い。
「うそやろ~」
思わず声でましたね。
シャツとコートを買えるようにと多めに入れていた現金とクレジットカードが、新調した財布ごと居なくなっていました。
そんなに居心地が悪かったですか。
朝ホテルを出る際に、現金持ちすぎだから置いていこうか、でも部屋に金庫無いし、現金むき出しでフロントに預けるのもどうかと思うし、と考えているうちに時間がなくなってきまして。まぁ上着の内ポケットに入れてホックを留めて置けば大丈夫だろうと思ったのですが、全然駄目でした。
よく落とすんですよね、財布。先々週の出張では現金を挟んだ手帳を忘れましたし。
よく落とすので免許証やメインで使っていないクレジットカードなどは全て家に置いていたのですが、そんなに落とす人間が現金沢山入れておくなというハナシですね。
もう一日残した状態で現金が無くなってしまいどうしようかと思いましたが、幸い携帯のモバイルSuicaには別クレジットカードを使っていたので多めにチャージしまして、とりあえず牛タンを食べました。厚切り牛タン美味しかったです。電子マネー万歳。その後交番に遺失届をして、翌日はSuicaで乗り切りました。
そして空き時間にあちらこちら連絡してみましたが見つからず、失意の内に福岡に戻ったのですが、本日仙台警察から連絡がありまして、タクシーの運転手さんが届けて下さったとの事でした。有り難うございます。
これからは首から巾着さげようかと考えています。
前回入手した回転灯をRaspberry Piに繋いでみたのですが、どうも回転が遅く、何より全く明るくありませんでした。
貼ってあったラベルをもとに調べてみると、どうもこの商品のようです。
http://www.daiji.co.jp/product/rescue/FQ-01.php
「12V」
Raspberry Piの出力は5Vなんですよね。
とりあえず電池ボックスをつなげて12V供給してみると確かに明るくなりました。
でも電池を使うのは、入れ替えの手間だとかランニングコストだとかで避けたいところです。
かといって、別ラインで電源供給も面倒。
高光度LEDに差し替える等の手を考えていきたいところです。
週末にイカ釣りに行きまして、久しぶりに坊主でした。
さて、前回時点でIP Messengerからのメッセージを受け取ることができるようになったので、今回はRaspberry Pi で回転灯を点けてみます。
PythonからRaspberry PiのGPIOをいじるためにはモジュールが必要なので 「Raspberry pi Python GPIO」でググってインストールしておきます。
で、おきまりのLED点滅。
import RPi.GPIO as GPIO import time GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) GPIO.output(18, False) while True : GPIO.output(18, True) time.sleep(0.5) GPIO.output(18, False) time.sleep(0.5)
>sudo python ./led.py
で点滅することを確認します。
で、これを踏まえて前回のコードに書き足します。
import RPi.GPIO as GPIO PIN_NUM = 18 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_NUM, GPIO.OUT) GPIO.output(PIN_NUM, False) def turn_the_light_on(): GPIO.output(PIN_NUM, True) def turn_the_light_off(): GPIO.output(PIN_NUM, False)
これでIP Messenger経由でLEDのON/OFFができるようになりました。
後は回転灯を繋げば完成です。
回転灯はこれを使いたいと思います。
本来は車載用でシガーソケットに繋いで使うモノですが、プラグ部分が壊れて使っていないようなので釣りに行ったついでにもらってきました。
引き続き、PythonでIP Messengerのサービスにエントリして送られてくるメッセージを処理する辺りを。前回今回Raspberry Pi関係ないですね。
import socket import random USER_NAME = 'ipmsg_light' MACHINE_NAME = 'raspberrypi' BROADCAST = '255.255.255.255' IPMSG_VERSION = 1 IPMSG_DEFAULT_PORT = 2425 IPMSG_BR_ENTRY = 0x00000001L IPMSG_BR_EXIT = 0x00000002L IPMSG_ANSENTRY = 0x00000003L IPMSG_BR_ABSENCE = 0x00000004L IPMSG_SENDMSG = 0x00000020L IPMSG_RECVMSG = 0x00000021L PORT = IPMSG_DEFAULT_PORT # ----- def turn_the_light_on(): print 'light on.' def turn_the_light_off(): print 'light off.' def get_mode(command): return command & 0x000000FFL def get_msg_header(cmd, msg): packet_num = random.randrange(1, 10000000) return "%s:%s:%s:%s:%s:%s" % (IPMSG_VERSION, packet_num, USER_NAME, MACHINE_NAME, cmd, msg) def get_ans_cmd(cmd): if cmd == IPMSG_BR_ENTRY: return IPMSG_ANSENTRY elif cmd == IPMSG_SENDMSG: return IPMSG_RECVMSG return -1 def set_light_status_by_user_status(user_dic): if len(user_dic) == 0: turn_the_light_off() elif reduce(lambda x,y: x+y, user_dic.values()) == 0: turn_the_light_off() else: turn_the_light_on() def set_light_status(user, msg_text, user_dic): if user not in user_dic: user_dic[user] = 0 msg_cmd = msg_text.replace("\0", '').strip().lower() if msg_cmd == "on": user_dic[user] = 1 elif msg_cmd == 'off': user_dic[user] = 0 elif msg_cmd == 'kill': user_dic.clear() else: user_dic[user] = (0 if user_dic[user] == 1 else 1) set_light_status_by_user_status(user_dic) def remove_user(user, user_dic): if user in user_dic: user_dic.pop(user) set_light_status_by_user_status(user_dic) def parse_recv_msg(msg): msg_ary = msg.split(':') if len(msg_ary) < 5 : return return (msg_ary[1], msg_ary[2], msg_ary[3], msg_ary[4], msg_ary[5]) # ----- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.bind(('0.0.0.0', PORT)) msg = get_msg_header(IPMSG_BR_ENTRY, '') s.sendto(msg, (BROADCAST, PORT)) user_dic = {} while True: (recv_msg, client_addr) = s.recvfrom(1024) print recv_msg msg_tuple = parse_recv_msg(recv_msg) if msg_tuple is None: continue (packet_num, send_user, send_machine, recv_cmd, recv_msg_text) = msg_tuple cmd = get_mode(int(recv_cmd)) if cmd == IPMSG_SENDMSG: set_light_status(send_user, recv_msg_text, user_dic) elif cmd == IPMSG_BR_EXIT: remove_user(send_user, user_dic) ans_cmd = get_ans_cmd(cmd) if ans_cmd < 0 : continue ans_msg = '' if ans_cmd == IPMSG_ANSENTRY: ans_msg = get_msg_header(ans_cmd, USER_NAME) else : ans_msg = get_msg_header(ans_cmd, packet_num) s.sendto(ans_msg, client_addr) s.close()
こんな感じで他のIP Messengerから送られてくるメッセージを処理できてる気がします。正直Python詳しくないので適当です。
基本的にメッセージ本文無しで回転灯をON/OFFさせるように考えていますが、本文にonかoffが書かれていればそれに従い、killとあれば他のユーザの状況にかかわらず常にOFFにするようにしてみました。
とりあえずメッセージを受けて回転灯の状態を操作できそうになったので、on/off文字をprintしている箇所を変更してRaspberry PiのGPIOを弄っていきます。
さて、Raspberry Piを使うとなるとやはり開発言語はPythonでしょう。
IP Messengerのプロトコルについてはこの辺りを参考にさせていただきます。 http://ipmsg.org/protocol.txt
http://libipmsg.sourceforge.jp/specification.html
今回はメッセージの送信は重要視しておらず、IP Messengerのユーザリストにリストアップされて、送られてくるメッセージを受け取ることができればOKです。 ざっくりまとめると、
これだけです。 プロトコルフォーマットは
<バージョン>:<パケット番号>:<ユーザ名>:<ホスト名>:<コマンド番号>:<オプション部>
です。
バージョンは1固定でOKっぽいです。
パケット番号は乱数で。
ユーザ名とホスト名は適当に文字列を。
コマンド番号はIP Messengerのソースコードをダウンロードしてipmsg.hをみると早いです。エントリ時に送信するメッセージはこんな感じで定義されていました。
#define IPMSG_BR_ENTRY 0x00000001UL
とりあえずユーザリストにリストアップしてもらうところまでをさらっと。
import socket import random s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.bind(('0.0.0.0', 2425)) pnum = random.randrange(1, 100000) msg = "%s:%s:%s:%s:%s:%s" % (1, pnum, 'ipmsg_light', 'raspberrypi', 1, '') s.sendto(msg, ('255.255.255.255', 2425)) s.close()
勢いで大人買いしたRaspberry Piが余っています。
何を作ろうかと考えまして、大分前に社内で話があがった「大事な話し中だから静かにして」回転灯でも作ろうかと思います。
お客様から「楽しそうな会社ですね」といわれる、笑いの起きるオフィスな弊社ですが、大事な電話中に後ろで笑い声がしてしまうのも困りものです。そしてそういう場合に限って周りに注意できなかったりするものです。
そこで静かにしてほしいことを電話しながらでも周囲に伝えられる仕組みがあると良いよね。他のメンバがパソコンの画面を見ているとも限らないから、回転灯なんか良いよね。という話です。
単純な話、Raspberry Pi と回転灯を繋いで、各メンバの机からスイッチが押せれば完成です。
でも、
では役に立ちません。
誰がONにして誰がOFFにしたのか判別できないといけませんから、単純に@10円ぐらいのスイッチだけというわけにもいきませんし、そもそも物理スイッチを各メンバの机に伸ばすと配線が大変です。
ここはプログラマらしくネットワーク経由でRaspberry Piにコマンドを送って回転灯を点けたり消したりしたいところです。コマンド送信時にユーザIDを付加すれば誰が点けたのかも判ります。
しかし回転灯を点けたり消したりするために専用のソフトをインストールしてもらうというのも面倒な話です。
そこで題名にあるIP Messengerの出番です。
社内では簡単なメッセージのやり取りにIP Messengerを使っているので全員のPCにインストール済み。ユーザの判別も完了しています。そしてIP Messengerはソースも公開されています。
というわけで、Raspberry Pi + IP Messenger + 回転灯 で作っていきたいと思います。
「パトライト」ってパトライト社の登録商標なんですね。回転灯に修正しました。
絶滅が危惧されているウナギについてこんな記事がありました。
SankeiBiz 「ウナギ高騰一転、一斉値下げ 稚魚豊漁 国内仕込み量倍増」
今年は稚魚が豊漁で『仕込み量』が前年比2倍の25トンになったということです。そして「価格も下がるから消費者にもっと買ってもらえるようにしよう」的な記事になっています。
前年比2倍の『仕込み量』は確かに豊漁と思えるかもしれません。しかし『仕込み量』なので海外からの輸入も含まれていると思います。2013年度の国内漁獲量は5.2トンですから、単純に国内漁獲量も2倍になったとしても10トン。ちなみにシラスウナギの最盛期『漁獲量』は国内だけで232トン。
およそ資源回復には遠い状態です。
消費者も売っているから、安いからといって何でも買えば良いというわけではありませんね。
そして昨年のブログ記事ですが 『ウナギをどう看取るか?』
こちらブログでは日本の水産資源の状況について様々な記事があり、とても参考になります。
Internet Explorerに深刻なセキュリティホールが見つかり、ネットのみならず新聞などでも取り上げられるほどの話題となっています。
弊社教務WebシステムをIEでご利用されている場合には、以下のページなどをご参考に回避策をとられることをおすすめします。
IPA 独立行政法人情報処理推進機構 Internet Explorer の脆弱性対策について(CVE-2014-1776) http://www.ipa.go.jp/security/ciadr/vul/20140428-ms.html