スクリプト類とメニューボタン

トップ ソフト 雑記 日記 リンク

2015/12/26

アドベントカレンダーをいろいろと書いてみて

今年はアドベントカレンダーに25日分参加してみました。
25種類のアドベントカレンダーで重複参加2本の27本。
1日に3本ぐらい書いたり全く進まない日があったりで、常に10日分ぐらいストックを溜める感じで書き進めていきました。

毎年アドベントカレンダーを見ていて感じたのは、参加したものの記事を投稿しなかったというパターンをよく見かけます。
できれば記事を投稿して欲しいなぁと思うのですが、いろいろなパターンで記事が投稿されなかったのでしょう。
  1. 参加したこと自体を忘れている
  2. 忙しくて書く時間がなかった、たぶん書けない
  3. 書いてるんだけど間に合わない
  4. 忙しくて書く時間がなかった、後で書く
このなかで、1番については、リマインダーで対応できないかなと。
2番については、誰か他に書ける人居ないかな?
3番は遅れて良いから頑張って!
4番も期待してるから頑張って!

ここ数年は、ADVENTARで管理されるカレンダーが増えたようですが、どうも忘れられているのが多いような気がします。
システム的にはQiitaのアドベントカレンダーが良い感じなのですが、あそこは技術系じゃないとダメらしいので、いまのところシステムとして整備されているアドベントカレンダーシステムはADVENTARだけとなります。

1番・2番をサポートできる、そして読み手側も便利になるようなサイトを作ってみたいなと思いました。
来年の目標にしようと思います。

機能としてはこんなあたり?
  • Twitter、facebook、Google+でログイン
  • カレンダー期間自由設定可能(12月以外にテストしたいし)
  • 予約投稿 or 記事できてる宣言 or 記事書き上がりそう or遅れそう宣言
  • リマインダー通知
  • 補欠登録 or 25日分埋まっていたら、1日で複数人投稿可能
  • 期限過ぎてからの割り込み投稿
  • 指定日が空いているカレンダー検索
  • お気に入りカレンダー(読み手側)
ギスギスしますかね?
せっかく自由意志でエントリーしたんだったら書き上げるか、無理なら「ごめんね~」って空けたら良いのになと思うのですが、25日分参加者が埋まっているのに、投稿されずに放置される日がもったいないなと思いまして。

2015/12/25

箕面のインドカレー屋さんSOL(カレー Advent Calendar 2015)


カレー Advent Calendar 2015の25日目です。

今日紹介するのは、阪急宝塚線の石橋駅から少し離れたところにある、インドカレーSOL(Spice of Life)です。

無国籍風な店内でカウンターになっています。持ち帰りもできるので、近くの人だと持ち帰っている人も多いかもしれません。
なんと言っても値段の安さ。チキンカレー・野菜カレーは300円。それにターメリックライス・ナンはそれぞれ200円。(2015年12月)
チキンカレーが辛口、野菜カレーが中辛にあたります。普段家では中辛を食べるのですが、ここではチキンカレーが美味しくて、いつもチキンカレーを頼んでいます。この記事を書く前に、一度野菜カレーを頼んでみたのですが、野菜たっぷりでピリッとしつつも、辛さが後を引く感じではなかったので、辛いのが苦手な人でも大丈夫かと思います。
最近バターチキンカレー(甘口)400円とキーマカレー(辛口)500円も増えたので、バターチキンカレーなら子供さんにも大丈夫かも(この二つはまだ食べたことがないです)。

先にカウンターで注文をしてお金を払ってから調理されるので、ナンは焼きたてを食べられます。
なかなかナンを食べる機会もないので、ここではいつもナンを注文しています。

やはり大阪でご飯を食べるとなると、安くて旨いのは嬉しいですね。

2015/12/24

ArduinoでJJY発信(おうちハック Advent Calendar 2015)

おうちハック Advent Calendar 201515日目に書いた内容について、
ツッコミがあったのでおうちハックアドベントカレンダーの15日目として。
内容的には、完全にArduino Advent Calendar 2015なんですが、続き物ということでおうちハックにぶら下げます。


電波時計に供給される日本標準時電波(JJY)は、国立研究開発法人情報通信研究機構の日本標準時グループによって、福島県と佐賀県から送信されています。電波時計は、これらの電波を受信して現在時刻を知るわけです。

自宅に電波時計があり、買ったときに住んでいた家では電波を受信していたのですが、何度か引越をするうちに電波を受信しなくなってしまったようです。
何度手動で合わせても少しずつずれてしまう。電車やバスの時間に合わせて家を出ようと思うと、これが意外と辛い。 また、窓際に置いて強制受信ボタンを押してみたりしたのですが、どうも受信しない。

ということで、ちょうど家にあったArduinoをネットに繋いでNTPから時刻情報を受信し、そこからJJYを発信してみました。

必要なもの
  • Arduino
  • ネットシールド
  • 電源用USBケーブル
  • 通信用LANケーブル


以下、2019年7月2日更新。
で、肝心のスケッチなどですが、以前書いていたものは2015年当時のもので、だいぶ古くなっていたので書き直しました。
コードを出すとメンテナンスが継続できなくなったり、継ぎはぎだといい加減だと言われるので非公開にします。
GitHubで管理するにしても、Pull Requestに応えられなければ同じ事なので。

Timeライブラリは、新しくhttps://github.com/PaulStoffregen/Timeを参照するのが良いでしょう。
以前は固定IPで運用していましたが、最近のEthernetライブラリにはDHCPクライアントの機能が付いたため、http://arms22.blog91.fc2.com/blog-entry-445.htmlのような実装でいけるかと思います。

メインとなる変調部分はmillis()で比較していたのですが、50日でゼロに戻るという情報をいただいたので、古い情報も持っておいてリセットを検知したら引き算して・・・なんてことを考えたのですが、誤差が出てしまうため、もうすぐリセットされそうとなったところで発信をやめる方法にしました。
以上、2019年7月2日更新。

発信する電波は、40khz、ArduinoのPWM送信に対応している3番ピンを使います。

わたしの場合は50cmのリード線を3周巻いています。
アンテナとして機能するために、何周かのループになっている必要があります。
時計のすぐそばに設置するなら、それほど電波強度も必要ないので、3周程度できっちりと巻いてなくても受信できました。ただし時計の真裏でないと伝わりませんでした。
時計側の性能にもよるので、もう少し長いリード線を使って、きっちりと巻いた方がいいかもしれません。

我が家では、ルーター(NEC AtermWR9500N)にUSBポートと、余っているLANポートがあったので、そこに繋いでいます。

極々普通なTKG(TKG Advent Calendar 2015)

TKG Advent Calendar 2015の24日目です。

個人的に好きな卵かけご飯は、一番ノーマルとも言えるスーパーで売ってるお米に、普通の玉子に普通の量産された醤油です。

いろいろ試してみたのです。
ごま油を垂らすと良いとか、塩が良いとか、ネギを入れると良いとか、聞いたときは涎が湧き出してくるのですが、食べてみると、あー、そうなの、うーん、という感じで、自分にはイマイチでした。


醤油を「ちょっと多いんじゃない?」というぐらい掛けて食べるのが好きです。
これは決して醤油ご飯ではなく、卵と醤油の素晴らしい共同作業があってこその卵かけご飯なのです。
卵だけでもダメです。醤油の旨みが卵の旨みを引き出す。

うまく説明できないけど卵かけご飯は旨いということは、 揺るぎない事実なのです。
生の玉子が食べられることに感謝して、いただきます。

2015/12/23

選ばれたのは回転寿司です(寿司 Advent Calendar 2015)

寿司 Advent Calendar 2015の23日目です。

寿司。いろいろありますね。
  • 目の前で握ってもらえる特上寿司
  • 寿司屋の握りの盛り合わせ
  • 回転寿司
  • スーパーのパック寿司
今日は回転寿司の話をしましょう。

回転寿司は素晴らしい

なぜ素晴らしいのか、挙げていきたいと思う。

回っている

食事の定義として「食べ物が給仕人の手を借りずに動いてやってくる」というのは、流しそうめん以外に聞いたことがない(一部鉄道に乗ってやってくる店などがあるが)。
そこから生み出される非日常感。
子供は楽しい。回転寿司が嫌いと言っている子供を見たことがない。自分は好きだった。
大人も楽しい。少なくとも自分は楽しい。今でも楽しい。

好きなものが取れる

言い換えれば嫌いなものを取らなくて良い。
詰め合わせパックにたまに入っている赤貝とか食べなくて良い。(固い)
もてなしで出してもらった握りのウニとか食べなくて良い。(ごめん、良さわかんない)
玉子とか二回取っちゃっても良い。
自分で選択することによる納得がある。詰め合わせパックに入っているイカが美味しそうに見えたけど、今日はハマチの気分じゃないんだよなと、しぶしぶ自分を納得させたりしなくて良い。

すぐに食べられる

レーンに流れているものを見る→旨そう→食べたい→取る→食べる。
場合によっては脳にまで情報は行っていないかもしれない。脊髄反射。
好きなものを取れることと合わせて、野生の動物と同じ。
最近回転寿司と名乗りながら「店員に注文したら渡してやる」という看板に偽りのある店が増えた。
注文してから握ってたら遅いんだ。いま見たものを食べたいのだ。
鮮度?そんなものを気にしているのだったら、もっと良い店に行く。
破棄?臭わなければ大丈夫。
俺はとにかく回転している寿司を食べたいのだ!
鮮度も回転寿司も両方満たしてくれる店として「漁港近くの全国チェーンじゃない回転寿司屋」が穴場である。

とにかく回転寿司最高

P.S.Bloggerで🍣(UNICODEの寿司絵文字)が表示されないのが行けていない。

2015/12/22

コンタクト(プログラマの映画 Advent Calendar 2015)

プログラマの映画 Advent Calendar 2015の22日目です。
プログラマが見ると
モチベがアガル。
テンションがアガル。
なんかもう色々アガル。
そういう映画のコト。
ということなので、プログラマが出てくるわけではないのですが、コンタクトのご紹介。

宇宙人を見つけるSETIプロジェクトに関わる女性研究者エリナー・アロウェイ 。
彼女がいろいろな困難に立ち向かいながら、なんとか研究資金を獲得し、ニューメキシコのVLA(超大型干渉電波望遠鏡群)を借りて、地球外生命体からの電波を探し続ける日々を送ります。
何も成果がでないまま、いよいよレンタル期間も終了が近づいて来たある日、彼女の耳に特徴的なノイズが聞こえてきます。

ここからが一気に盛り上がるシーンです。
砂漠に広がるパラボラアンテナ群から車を飛ばして制御室に戻り、他の研究者とそれが別の電波との勘違いではないか調べる流れや、地球の食によって電波が受信できなくなるために世界中の研究者に協力を仰ぐところは、現代でも大して変わらないシーンになりそうです。

そして極めつけは、ケント・クラークという研究者。
彼はエリナーと一緒に研究していた人物なのですが、実は盲目。
宇宙人からの電波を受信したと大騒ぎになっているVLAへ祝福に訪れ、電波の解読に参加します。
ケントは盲目であるためか、聴力がすさまじく、なんと彼はノイズの中から耳grepをしてしまうのです。
我々プログラマーは、よく目grepをすることがありますが、大量に流れるログからなんとなく異常を察知したりします。
彼も、ただのノイズと思われる部分から複数に重ねられたデータを分離して、別のデータが隠されていることに気が付きます。
すごい、すごいよケント。

この後はさらに様々な困難が立ちはだかるのですが、宇宙人が出てこない宇宙人ものということで、なかなか見応えのある展開となります。
技術職に関わっている人ならテンションが上がる映画ではないかと思います。

2015/12/21

移動するサーバのzabbixエージェントを登録する(Zabbix Advent Calendar 2015)

Zabbix Advent Calendar 2015の21日目です。

zabbix便利ですね。
監視と通知と表示と対応がこれ一つでできるので、 何かと重宝しています。
悩みをツイートすると、的確なアドバイスが返ってくるのもすごいです。
本当はフォーラムあたりに投稿して、情報を集積するべきなんでしょうけど、すいません。

さて、わたしの環境では 自宅サーバでzabbix-serverを起動し、他の自宅サーバやEC2、VPSのagentから情報を集めています。
EC2だと固定IPを登録していないなら起動する度にIPアドレスが変わりますし、スポットインスタンスなどを使えば起動していない時間帯もあります。
このようなサーバもzabbixで管理したいと思い試行錯誤してみたらうまく行ったのでご紹介。

通常、同一ネットワークに管理対象サーバが居れば、ディスカバリ機能を使ってagentを見つけてくれますが、さすがにグローバルIPアドレス宛で、範囲が決まっているとは言えEC2などでは広大な範囲が指定されているので難しいものがあります。
ですので、agent側から起動時にserverへIPアドレスの変更を通知します。
わたしの場合は、サーバが落ちていることも検知したかったので、インスタンス終了時には敢えてサーバの登録解除はせず、あらかじめ登録しておいたサーバのIPアドレスを変更する手法を採っています。
数の決まっていないサーバを登録・解除する場合は、以下の方法のIP変更命令を、サーバの登録にして、インスタンス終了時に登録解除の命令を送れば大丈夫かと思います。

zabbixには、JSONRPCで用意されているAPIを叩くと、様々な情報を取得したり、更新したりできます。
この機能を利用します。このスクリプトは、zabbixサーバに設置します。
ユーザー名、パスワード、zabbix設置アドレスをそれぞれの環境に合わせて書き換えてください。
あと、jqコマンドを使いますので入れておいてください。
#!/bin/bash

# json2zabbix
json_auth='{"jsonrpc":"2.0","method":"user.login","params":{"user":"ユーザー名","password":"パスワード"},"id":1}'
rpc_url='http://zabbix設置アドレス/api_jsonrpc.php'

ZABBIX_TOKEN=`curl -s -XGET -H "Content-Type:application/json-rpc" -d $json_auth $rpc_url | jq -r '.result'`
echo "####### TOKEN = $ZABBIX_TOKEN"

if [ $1 ]; then
  json='{"jsonrpc": "2.0","method":"hostinterface.get","params":{"filter":{"dns":"##DNS##"}},"id":2,"auth":"##TOKEN##"}'
  json=`echo $json | jq '.' -c | sed -e s/##DNS##/$1/ -e s/##TOKEN##/$ZABBIX_TOKEN/ `
  echo $json
  interfaceid=`curl -s -XGET -H "Content-Type:application/json-rpc" -d $json $rpc_url | jq -r '.result[0].interfaceid'`

  json='{"jsonrpc": "2.0","method":"hostinterface.update","params":{"interfaceid":"##INTERFACEID##","ip":"##IP##"},"id":3,"auth":"##TOKEN##"}'
  json=`echo $json | jq '.' -c | sed -e s/##INTERFACEID##/$interfaceid/ -e s/##IP##/$2/ -e s/##TOKEN##/$ZABBIX_TOKEN/ `
  echo $json
  curl -s -XGET -H "Content-Type:application/json-rpc" -d $json $rpc_url
else
  echo "JSON to ZABBIX Request"
  echo "Usage: json2zabbix.sh ip dns"
fi
jsonrpcのメソッドについてはこちらを参照してください。バージョン2.4へのリンクですが、ロゴの下でバージョンが切り替えられます。
このスクリプトではuser.loginメソッドでログイントークンを取得し、以後のメソッド呼び出しに使っています。
IPアドレスを変更する対象サーバを見つけるために、DNS情報を利用しています。
hostinterface.getにて、指定のDNSを持つサーバのインターフェースIDを取得し、そのインターフェースのIPアドレスをhostinterface.updateメソッドで更新しています。

EC2側では、agentの起動スクリプト内で
sudo -u サーバにSSH接続できるユーザ名 ssh ユーザ名@サーバアドレス -p SSHポート "json2zabbix.sh ${instance_name} ${ec2_public_ipv4}"
を呼び出します。
ここで使っている
${instance_name} と ${ec2_public_ipv4} は、別途
#!/bin/sh

# get instance data
url_prefix=http://169.254.169.254/latest
ec2_instance_id=`/usr/bin/curl ${url_prefix}/meta-data/instance-id/ --stderr /dev/null`
ec2_region=`/usr/bin/curl ${url_prefix}/meta-data/public-hostname --stderr /dev/null | awk -F . '{print $2}'`
ec2_public_ipv4=`/usr/bin/curl ${url_prefix}/meta-data/public-ipv4 --stderr /dev/null`
ec2_user_id=`/usr/bin/curl ${url_prefix}/dynamic/instance-identity/document --stderr /dev/null | awk -F : '/accountId/ {n=split($2,a,"\"");print a[2]}'`
instance_name=`/usr/bin/curl -q ${url_prefix}/user-data --stderr /dev/null`
local_ipv4=`/usr/bin/curl ${url_prefix}/meta-data/local-ipv4 --stderr /dev/null`
というようなスクリプトを用意して読み込ませておくと良いでしょう。
分けてあると、色々と使い回しができて便利です。
このスクリプトでは、EC2の高度な詳細にあるユーザーデータにドメイン名を指定します。
jsonrpcで操作できる項目は多種に渡るため、一度どんなメソッドが用意されているか見ておくだけでも楽しいです。基本的にはWebUIから設定できる物は全部できるっぽいですね。
何か自動化したくなったときに、いろいろと役立つかもしれません。

2015/12/20

新宿御苑の猫(猫写真 Advent Calendar 2015)

猫写真 Advent Calendar 2015の20日目です。

以前、新宿御苑へ行って休憩所で休んでいたら見かけた猫。


猫はひなたぼっこ場所を見つけるプロですね。

広告