投稿者「as」のアーカイブ

3Dプリンタ購入欲

本日、とあるお客様のところへ作業に伺ったところ、3Dプリンタが稼働中でした。
3Dスキャナ付でなかなかお高い感じでしたが、お話によると3Dプリンタ単体なら10万をかるく切るお値段だとか。

ネットで検索してみても確かに6万円台のものがチラホラ。
危うくポチりかけました。

これから暫く物欲との戦いになりそうです。
深夜のネットショッピングを避けないと危ないかも。

仙台出張にて

今週初めから、仙台へ出張に。

出張が続いていたため、現地で着替えのシャツを買い足すつもりで、ついでにもし寒くて我慢できなければコートも買ってしまえと考えていました。が、着いてみると寒いのは寒いものの夜間ずっと外を歩き続けるわけでもなくコートは買わずに我慢できそうでした。

そして2日目の仕事が終わり、仙台駅の改札を抜けながら「さて名物の牛タンでも~」と内ポケットに手を入れると…

財布が無い。

「うそやろ~」

思わず声でましたね。

シャツとコートを買えるようにと多めに入れていた現金とクレジットカードが、新調した財布ごと居なくなっていました。
そんなに居心地が悪かったですか。

朝ホテルを出る際に、現金持ちすぎだから置いていこうか、でも部屋に金庫無いし、現金むき出しでフロントに預けるのもどうかと思うし、と考えているうちに時間がなくなってきまして。まぁ上着の内ポケットに入れてホックを留めて置けば大丈夫だろうと思ったのですが、全然駄目でした。

よく落とすんですよね、財布。先々週の出張では現金を挟んだ手帳を忘れましたし。

よく落とすので免許証やメインで使っていないクレジットカードなどは全て家に置いていたのですが、そんなに落とす人間が現金沢山入れておくなというハナシですね。

もう一日残した状態で現金が無くなってしまいどうしようかと思いましたが、幸い携帯のモバイルSuicaには別クレジットカードを使っていたので多めにチャージしまして、とりあえず牛タンを食べました。厚切り牛タン美味しかったです。電子マネー万歳。その後交番に遺失届をして、翌日はSuicaで乗り切りました。

そして空き時間にあちらこちら連絡してみましたが見つからず、失意の内に福岡に戻ったのですが、本日仙台警察から連絡がありまして、タクシーの運転手さんが届けて下さったとの事でした。有り難うございます。

これからは首から巾着さげようかと考えています。

Raspberry Pi と IP Messenger でネットワーク対応回転灯を作る5

前回入手した回転灯をRaspberry Piに繋いでみたのですが、どうも回転が遅く、何より全く明るくありませんでした。

貼ってあったラベルをもとに調べてみると、どうもこの商品のようです。
http://www.daiji.co.jp/product/rescue/FQ-01.php

「12V」

Raspberry Piの出力は5Vなんですよね。

とりあえず電池ボックスをつなげて12V供給してみると確かに明るくなりました。

でも電池を使うのは、入れ替えの手間だとかランニングコストだとかで避けたいところです。
かといって、別ラインで電源供給も面倒。

高光度LEDに差し替える等の手を考えていきたいところです。

Raspberry Pi と IP Messenger でネットワーク対応回転灯を作る4

週末にイカ釣りに行きまして、久しぶりに坊主でした。

さて、前回時点で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
で点滅することを確認します。

DSC_0073

で、これを踏まえて前回のコードに書き足します。

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ができるようになりました。

後は回転灯を繋げば完成です。

回転灯はこれを使いたいと思います。
DSC_0074
本来は車載用でシガーソケットに繋いで使うモノですが、プラグ部分が壊れて使っていないようなので釣りに行ったついでにもらってきました。

Raspberry Pi と IP Messenger でネットワーク対応回転灯を作る3

引き続き、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 と IP Messenger でネットワーク対応回転灯を作る2

さて、Raspberry Piを使うとなるとやはり開発言語はPythonでしょう。

IP Messengerのプロトコルについてはこの辺りを参考にさせていただきます。 http://ipmsg.org/protocol.txt
http://libipmsg.sourceforge.jp/specification.html

今回はメッセージの送信は重要視しておらず、IP Messengerのユーザリストにリストアップされて、送られてくるメッセージを受け取ることができればOKです。 ざっくりまとめると、

  1. ネットワーク上のIP MessengerサービスにエントリするためのメッセージをUDP 2425でブロードキャスト。
  2. その後2425をリッスン。
  3. メッセージが来たら受け取ったよメッセージを返す。エントリメッセージの場合はエントリ受け付けたよメッセージを返す。

これだけです。 プロトコルフォーマットは
<バージョン>:<パケット番号>:<ユーザ名>:<ホスト名>:<コマンド番号>:<オプション部>
です。

バージョンは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 と IP Messenger でネットワーク対応回転灯を作る

 

勢いで大人買いしたRaspberry Piが余っています。

RaspberryPi

 

何を作ろうかと考えまして、大分前に社内で話があがった「大事な話し中だから静かにして」回転灯でも作ろうかと思います。

『「大事な話し中だから静かにして」回転灯』とは

お客様から「楽しそうな会社ですね」といわれる、笑いの起きるオフィスな弊社ですが、大事な電話中に後ろで笑い声がしてしまうのも困りものです。そしてそういう場合に限って周りに注意できなかったりするものです。

そこで静かにしてほしいことを電話しながらでも周囲に伝えられる仕組みがあると良いよね。他のメンバがパソコンの画面を見ているとも限らないから、回転灯なんか良いよね。という話です。

Raspberry Piをどう使うか

単純な話、Raspberry Pi と回転灯を繋いで、各メンバの机からスイッチが押せれば完成です。

でも、

  1. Aさんが電話をするのでライトを点けて
  2. Bさんも電話をするのでライトを点けて
  3. Aさんが電話終わってライトを消したら
  4. Bさんの電話が終わっていないのに消えちゃいました。

では役に立ちません。

誰が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のセキュリティホールについて

Internet Explorerに深刻なセキュリティホールが見つかり、ネットのみならず新聞などでも取り上げられるほどの話題となっています。

弊社教務WebシステムをIEでご利用されている場合には、以下のページなどをご参考に回避策をとられることをおすすめします。

IPA 独立行政法人情報処理推進機構 Internet Explorer の脆弱性対策について(CVE-2014-1776) http://www.ipa.go.jp/security/ciadr/vul/20140428-ms.html