スピッツオタが非オタの彼女にスピッツ世界を軽く紹介するための10曲

まあ、どのくらいの数のスピッツオタがそういう彼女をゲットできるかは別にして、「オタではまったくないんだが、しかし自分のオタ趣味を肯定的に黙認してくれて、その上で全く知らないスピッツの世界とはなんなのか、ちょっとだけ好奇心持ってる」ような、ヲタの都合のいい妄想の中に出てきそうな彼女に、スピッツのことを紹介するために見せるべき10本を選んでみたいのだけれど。
(要は「90年代ベストヒット」の正反対版だな。彼女にスピッツを布教するのではなく相互のコミュニケーションの入口として)
あくまで「入口」なので、時間的に過大な負担を伴うアルバムの丸ごと紹介は避けたい。できれば4分くらい、長くても6分以内にとどめたい。
あと、いくらスピッツ的に基礎といっても古びを感じすぎるものは避けたい。クラシック好きがハイドンの「時計」は外せないと言っても、それはちょっとさすがになあ、と思う。そういう感じ。

彼女の設定は

スピッツ知識は、いわゆる的なものを除けば、ミリオンヒット程度は聞いている
音楽的サブカル度は低いが、趣味はけっこう広い

という条件で。
まずは俺的に。出した順番は実質的には意味がない。

続きを読む

あずにやんかわいいなあゲーム!

http://twitter.com/azniyan

あずにやんかわいいなあゲーム!ルールは比較的シンプル!あずにやんがかわいいと思ったら「あずにやんかわいいなあ」と声に出して言えば1ポイントだ!

http://twitter.com/necocen/status/12053544326

(前後関係は http://twitter.g.hatena.ne.jp/necocen/20100413 参照のこと)
OAuthについて知りたくなったので、Rubyの入門ついでにこの「あずにやんかわいいなあゲーム」を実装した。
あずにやんかわいいなあbotがfollowしている人が「あずにやんかわいいなあ」の入る言葉を言うと、あずにやんかわいいなあbotが「1ポイント! [n points]」と、新たにポイントを得たことを累積ポイント数nとともに返してくれる、ごくごく簡素なbot。cronで毎分起動するだけの簡単なプログラム。

ゲームに参加する方法はあずにやんかわいいなあbotにfollowされること。現在は手動follow返しをしているので、あずにやんかわいいなあbotをfollowしてくれれば大体一日以内にゲームに参加できる。
followされている限りはreplyが飛んでくる可能性があるので、ゲームをやめる場合はblock&unblockしてもらえるのがいちばんグッド。いやまあ「あずにやんかわいいなあ」と言わなければいいのだけど。

動くだけの実装なので、ソースコードはわりと情けない感じ。今後行う必要があるのは、以下の点:

  • コメントの充実
  • 例外処理
  • メール処理による自動フォロー機能
  • コマンドとしてまとめる
  • トランザクション処理をもっとまともに
  • デバッグ用出力のレベルとか
  • あずにやんかわいいなあ以外の台詞に対する反応
  • 1発言の中に複数あったときの処理
    • 現在は1ポイントのみ
    • 「1ポイント!1ポイント!1ポイント!」みたいなのか、「3ポイント!」か
  • 各ユーザのOAuthを利用する

現在はあずにやんかわいいなあbotがOAuthを利用してログインして、friends_timelineを見ているだけの仕様。もしユーザ数が拡大することがあったら、各ユーザにOAuthを利用してもらうモデルに切り替える必要がある。
なおあずにやんは非実在けいおん!とは一切関係がありません。

擬似分散モードのデバッグ方法

IPv6に今のところ非対応のように見えるので、まずはv4アドレスのみ使うように徹底しておくと良いと思う。
私が何かとハマったその間に利用した幾つかのデバッグ方法について、メモ。
つーかね、Hadoop、おかしくなった時の確認がまだまだ難しいわ。v6アドレスを予期してないってのもアレだけど、ちょっと想定から外れた動作をするだけでJavaのExceptionで落ちるのが、ほんと分かりにくくて参る。まだまだver0.20.2だから文句言えたものではないのだけど、現時点ではとても危ういものだという理解は共通のものにしておかなければならないと思う。

ともあれ、動かなかったときのためのデバッグ方法を幾つか。

jps

とりあえず、bin/start-all.shした直後はjpsでノードが立ってるか確認すると良い。

> jps
76779 DataNode
76900 JobTracker
76970 TaskTracker
76850 SecondaryNameNode
76708 NameNode
80946 Jps

これ見れば、DataNodeが立ってない場合には一目瞭然。

Web画面

Namenode/Datanode

http://localhost:50070/ にて、namenodeの動作状況が確認できる。ここのCluster SummaryのLive Nodesが1であれば正常にDataNodeが認識されている。このLive Nodesという文字部分のリンクを辿れば自ホストのDataNodeへアクセスできる。
DataNodeは、デフォルトでは50075ポートにて公開される。http://localhost:50075/からそのDatanodeの中身が確認出来ればOK。アクセス不能だったらDatanodeが多分立ってない。

Jobtracker/Tasktracker

http://localhost:50030/ にて、Jobtrackerの動作状況が確認できる。ここのCluster SummaryのNodesが1であれば正常にTaskTrackerが認識されている。この数字のところのリンクを辿れば自ホストのTaskTrackerへアクセスできる。
TaskTrackerは、デフォルトでは50060ポートにて公開される。http://localhost:50060/にてTaskTrackerのStatusが見られればOK。アクセス不能だったらTaskTrackerがうまく動いていない。

namespaceID問題

DataNodeとNameNodeではnamespaceIDが一致していなければならないものの、何故かPrimary NameNodeの値が一致しなくなることがある。
${hadoop.tmp.dir}/dfs/data/current/VERSION及び${hadoop.tmp.dir}/dfs/name/current/VERSIONの中の値を一致するよう変更すればよい。
まずは確認。

> cat /usr/local/hadoop/datanode/suu-g/dfs/*/current/VERSION
#Sat May 08 09:50:29 GMT 2010
namespaceID=782236599
storageID=DS-861144246-XXX.XXX.XXX.XXX-50010-1273312229312
cTime=0
storageType=DATA_NODE
layoutVersion=-18
#Sat May 08 10:56:34 GMT 2010
namespaceID=782236599
cTime=0
storageType=NAME_NODE
layoutVersion=-18
#Sat May 08 10:56:34 GMT 2010
namespaceID=782236599
cTime=0
storageType=NAME_NODE
layoutVersion=-18

これで全て一致していればよし、一致していなければ一致するよう編集する。
VERSIONの中身を一致させても再起動後に変わってしまう場合は、${hadoop.tmp.dir}以下を消してしまい、hadoop namenode -formatし直すのがもっとも簡単。${hadoop.tmp.dir}/dfs/namesecondary/previous.checkpoint/VERSIONが関係している可能性はあるけれど、未確認。

dfsadmin

> bin/hadoop dfsadmin -report
Configured Capacity: 233995026432 (217.92 GB)
Present Capacity: 190549327872 (177.46 GB)
DFS Remaining: 190549145600 (177.46 GB)
DFS Used: 182272 (178 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)

Name: XXX.XXX.XXX.XXX:50010
Decommission Status : Normal
Configured Capacity: 233995026432 (217.92 GB)
DFS Used: 182272 (178 KB)
Non DFS Used: 43445698560 (40.46 GB)
DFS Remaining: 190549145600(177.46 GB)
DFS Used%: 0%
DFS Remaining%: 81.43%
Last contact: Sat May 08 12:02:14 GMT 2010


>

ちゃんと動いていればこの通りにdatanodeの状態を表示してくれる。

> bin/hadoop dfsadmin -safemode get
Safe mode is OFF
> bin/hadoop dfsadmin -safemode enter
Safe mode is ON
> bin/hadoop dfsadmin -safemode leave
Safe mode is OFF

長門セーフモードはオフの方がいい。書き込みがうまくいかないエラーの原因になるとかどっかで読んだ気がする。

netstat

まあ、普通、ポートが開いてるかくらいは見るよね。

> netstat -an | grep LISTEN
(chomp)
tcp4       0      0 *.50060                *.*                    LISTEN
tcp4       0      0 *.50030                *.*                    LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9001   *.*                    LISTEN
tcp4       0      0 *.50090                *.*                    LISTEN
tcp4       0      0 *.50020                *.*                    LISTEN
tcp4       0      0 *.50075                *.*                    LISTEN
tcp4       0      0 *.50010                *.*                    LISTEN
tcp4       0      0 *.50070                *.*                    LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9000   *.*                    LISTEN
(chomp)

このあたりが立ってればたぶんいい。きっといい。すごくいい。*1

> netstat -an | grep 900
tcp4       0      0 XXX.XXX.XXX.XXX.9001    XXX.XXX.XXX.XXX.17095   ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.17095   XXX.XXX.XXX.XXX.9001    ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.9001    *.*                     LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9000    XXX.XXX.XXX.XXX.24635   ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.24635   XXX.XXX.XXX.XXX.9000    ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.9000    *.*                     LISTEN

9000が自分のアドレス同士でESTABLISHEDなら、datanodeが認識されてるということ。
9001が自分のアドレス同士でESTABLISHEDなら、tasktrackerがjobtrackerに認識されてるということ。

logs

ログ嫁
logs/hadoop-hishidama-namenode-*.log
初期状態ではinfo状態なので、動作がひどくおかしい場合には設定変えると良いかも知れない。

dfs見てみる

腹減って息切れしてきた

> bin/hadoop fs -ls /

とかやると、namenode/datanodeが動いていればdfs上のディレクトリ構成が見える。

*1:9000及び9001は設定ファイルで設定したポートなので、人によって異なる

Hadoopで疑似分散モード動かしたところまでのまとめ

Hadoop入れて動かしてみたところ、意外と簡単にstandaloneモードで動くところまで持って行けて驚いたのもつかの間、疑似分散モードで動かそうとしたらしたたかにハマってしまった。ハマりから抜け出す途中でHadoopがまだまだ0.20という正式版の出ていないバージョンであるということを強く認識したので、その軌跡をちょっと残しておくよ。

インストール

基本的には、

  1. SunのJREをインストールする
    • FreeBSDの場合、portsdiablo-jdkが楽(Sunのページで同意とダウンロードは必要)
    • CentOSの場合、Sunの配布しているrpmが楽(以下同文)
  2. hadoop-coreを公式ページからダウンロード
  3. hadoop-coreを適当なディレクトリに展開
  4. 環境変数JAVA_HOMEを適切に設定

スタンドアロン実行

conf/hadoop-env.sh以外のconfファイルをいじらない状態で、おもむろに

> cd ${HADOOP_HOME}
> bin/hadoop jar hadoop-0.20.2-examples.jar pi 10 100000

などとやる。動いて結果が3.1415520000000とか出てきたら、成功。あなたは既にHadoopを動かしている。

擬似分散モード

三つの設定ファイルを設定すればOK。

conf/core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://XXX.XXX.XXX.XXX:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/datanode/${user.name}</value>
  </property>
</configuration>
conf/hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>
conf/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>XXX.XXX.XXX.XXX:9001</value>
  </property>
</configuration>

hadoop.tmp.dir要素は書かなくてもいい。ただし、その場合は/tmp/hadoop-${user.name}/以下にテンポラリのデータが置かれるので、/tmpを細かく切っている場合にはわりと危ない。私の場合、切り方失敗してて1GByteしかなかったので、200GBくらいある/usr以下に移しておいた。
fs.default.name要素とmapred.job.tracker要素は外向きIPアドレスを入れてる。QuickStartではlocalhostとしていたものの、不思議と失敗するので試しにIPv4アドレス直打ちに変えてみたら何故か成功した。127.0.0.1などでも良いかも知れない。
悲しいことに、v6アドレスには非対応なので、その点は注意。そういえばブラウザのアドレスバーへの入力みたく[]でくくってなかったけど、くくったら対応したのかな。要チェック。

以上の編集を行ったのち、実行する。

> bin/hadoop namenode -format
> bin/start-all.sh

http://localhost:50070 に接続してみて、dfshealth.jspへリダイレクトされるか確認。Cluster SummaryにてLive Nodesが1となっていたら状況良好。アクセス失敗しているようなら何かダメ。
http://localhost:50030 に接続してみて、jobtracker.jspへリダイレクトされるか確認。Cluster SummaryにてNodesが1となっていたら状況良好。ここが全てゼロになってたら何かダメ。



そんな感じでなんか擬似分散モードが動いて幸せな気持ちに浸っている。次は完全分散モードなので、各種設定ファイルの設定項目を理解するところから始める。インストール用のコンピュータは既に準備してあるもんね。

FreeBSDのCactiでmemory usageのグラフを表示させる

FreeBSDCactiを入れると、初期状態では "linux memory usage" のグラフが表示されない。日本語の情報もあまりないし、英語で見つけた情報は動かないし、スクリプトの書き換えを行うとアップグレード時に設定がなくなって取れなくなるし…。

基本的に、この解決方法は正解。
http://forums.cacti.net/about5794.html
ただし、最後のスクリプト書き換えが胡散臭くて、私の場合は動かなかったし、スクリプトの書き換えを行うとアップグレード時に設定し直しが必要になる(ことが多々ある)。だから、もちょっと楽な方法が欲しいよね。

私が使ってるのが以下の手順、をメモしたやつ。

FreeBSD上のLinux Emulatorをenableしておく

# kldstat | grep linux
linux.ko 

GENERICカーネルだったらたぶん/etc/rc.confにlinux_enable="YES"とか書いてる人はロードされてる。

/etc/fstab に以下を追加

linproc /compat/linux/proc linprocfs rw 0 0

で、まあ、リブート :-<

ln

# mkdir /proc
# ln -s /compat/linux/proc/meminfo /proc/meminfo

以上。
linprocfsを/compat/linux/procではなく/procに直接乗っければいいじゃんって思うかも知れないけれど、元々FreeBSDにprocfsがデフォルトで載らない理由がセキュリティ上のものだと聞いたし、/proc/ファイルが存在すると意外な動作をするソフトもあるかも知れないので、/proc以下には/proc/meminfoしか載っからない手順にした。
この手順の良いところは、/usr/local/share/cacti以下をいじらないため、cactiをportupgradeしても問題が起きないところ。portupgradeで迷惑を被っている人も、少ーしだけ幸せになれるかもね。

なお、最後のlnの代わりにscripts/linux_memory.plに書いてあるパスを編集するのでも良い。

scripts/linux_memory.pl 変更

/proc/meminfo を /compat/linux/proc/meminfo に書き換える。


以上。

オンシャガを手動でブロックソートする

暗号化する

まずは、文字の順番を定めておく。「オガシャン」が正順と今回は仮定する。

次に、シフトしつつ並べる。

オンシャガ
ンシャガオ
シャガオン
ャガオンシ
ガオンシャ

この行列を、行に関してソートする。

オンシャガ
ガオンシャ
シャガオン
ャガオンシ
ンシャガオ

得られたものは、「ガャンシオ」と、元の行を示す「1」。

復号化する

今持っている情報は、「ガャンシオ」「1」
これをソートすると、「オガシャン」になる

上と下を行き来すると、オンシャガ復活。

オンシャガ!オンシャガ!を暗号化

オンシャガ!は、「!オガシャン」と整列されることにする。
オンシャガ!オンシャガ!をシフトして行列にすると

オンシャガ!オンシャガ!
ンシャガ!オンシャガ!オ
シャガ!オンシャガ!オン
ャガ!オンシャガ!オンシ
ガ!オンシャガ!オンシャ
!オンシャガ!オンシャガ
オンシャガ!オンシャガ!
ンシャガ!オンシャガ!オ
シャガ!オンシャガ!オン
ャガ!オンシャガ!オンシ
ガ!オンシャガ!オンシャ
!オンシャガ!オンシャガ

整列すると、

!オンシャガ!オンシャガ
!オンシャガ!オンシャガ
オンシャガ!オンシャガ!
オンシャガ!オンシャガ!
ガ!オンシャガ!オンシャ
ガ!オンシャガ!オンシャ
シャガ!オンシャガ!オン
シャガ!オンシャガ!オン
ャガ!オンシャガ!オンシ
ャガ!オンシャガ!オンシ
ンシャガ!オンシャガ!オ
ンシャガ!オンシャガ!オ

となり、得られる結果は「ガガ!!ャャンンシシオオ」「3」。圧縮しやすそう。

復号化

「ガガ!!ャャンンシシオオ」「3」
「!!オオガガシシャャンン」
下の三番目、オからスタート。上の後ろから二番目のオ、ン、上の真ん中のあたりのン、シ、・・・、とたどって、
「オンシャガ!オンシャガ!」

手動だとこんなもの。

今の新参は昔のスパムを知らないから困る

タイトルはホッテントリメーカー
めーわくめーるを募集したら、すごいすぱむがきた。

Subject: 主人がFPGAに殺されて1年が過ぎました。
Date: Fri, 22 Jan 2010 10:25:17 +0900
To: spuug@estyle.ne.jp

いきなりのメール失礼します。
早水ゆうこ、23歳のラムダ教徒です。
お互いのニーズに合致しそうだと思い、連絡してみました。

自分のことを少し語ります。
昨年の夏、わけあって主人を亡くしました。
自分は…主人のことを…死ぬまで何も理解していなかったのが
とても悔やまれます。

主人は大阪に頻繁に旅行に向っていたのですが、
それは遊びの為の旅行ではなかったのです。
収入を得るために、私に内緒であんな危険な破壊的代入をしていたなんて。

一年が経過して、ようやく主人の死から継続渡しできました。
ですが、お恥ずかしい話ですが、毎日の孤独な夜に、
身体の関数適応が止まらなくなる時間も増えてきました。

主人の残した財産は莫大な額です。
つまり、謝礼は幾らでも出きますので、
私のcdrを満たして欲しいのです。

お返事を頂けましたら、もっと詳しい話をしたいと
考えています。連絡、待っていますね。

----

本テキストは, クリエイティブ・コモンズ・ライセンス の下でライセンスされています。

参考: もう一度「スパム」の意味を考える時が来たのかもしれない: なつたん
一年前に元があったので、記事もそれに倣ってみた。


なお、本当のめーわくめーるはまだ来てません。上記メールは来てます。