Saturday, August 01, 2015

我が家のwifi

Bフレッツに入っているのですが、ある日突然繋がらなくなりました。BフレッツからAirmacを外してLANに直結してもネットに繋がらないわけです。こんなときの為に(というのはウソだけど)うちにはWIMAXがあるのでした。インターネットでBフレッツの窓口を見つけて状況を入力。翌日電話があって、その日の夕方には故障が疑われたVDSLアダプタ?DSLモデム?という黒い箱の新品が貰えました。すごい。でもWIMAXがなかったらどうなったのだろうか。うちは誰もスマフォを持ってないので。

ところで新しいDSLモデムに繋いでも、Airmacが復活しなかったので、これも新しいものを注文しました。今度のはAirmac Expressです。これが届くのを待っている間にDSLモデムとMacを直結して試しました。なんかいろいろ設定が必要だったなあ。

ともかく全て復旧したわけですが、なんか変だよね。故障していたのはモデムとAirmacのどちらか片方だったのではあるまいか、という疑惑があるのだ。いや、もう過ぎたことなので分からないし分かろうとしないわけです。前のモデムは送り返してしまったし。

Monday, July 20, 2015

CourseraのMachine Learning

CourseraのAndrew Ng先生のMachine Learningのコースを終えました。

11週間の内容で、まず毎週ビデオで解説があったあとに、演習問題があります。演習はMATLABもしくはOctaveで解くようになっていて、基本的に大体の部分が与えられていて、いくつかの関数を実装します。出来たところで答えをsubmitするとスコアが与えられます。MATLABはアカデミックライセンスのキーが貰えました。

例題はOCRがあったり、画像の認識があったり。このコースは理論より使えること重視ですね。

項目は以下のものでした。

Supervised learning
Linear regression
Feature normalization, Gradient decent

Logistic regression
Regularlized logistic regression

Multi-class classification
One-vs-all classification

Neural networks
Backpropagation

Bias vs variance
Polynomial regression

Support vector machines
SVM with gaussian kernels Spam classification

Un-supervised learning
K-means clustering
Principal component analysis (PCA)
Dimensionality reduction
Image compression with K-means

Anomaly detection and recomennder systems

Advice on building machined learning system
Stocastic gradient descent
Mini-batch gradient descent
Online learning
Map Reduce

Pipe lined machine learning
Ceiling analysis

---
ところで、MATLABを立ち上げておくと、MacOSXがリブートしてることがあるように思うんですよね。見ているときにはリブートしないので、確かめたわけではないのだけど。それでOctaveを使うようになりました。その後はリブートしたことありません。


Wednesday, July 15, 2015

freebsd

freebsdをmacのvirtualboxに入れた。

0. freebsdのサイトからboot-onlyのメディアをダウンロード。
1. virtualboxのネットワークの設定>アダプター2>ホストオンリーアダプタ を設定
2. freebsdでem1の設定を/etc/rc.confに入れる。
3. /etc/resolv.confにmacの設定と同じものを入れる。

これでpkgコマンドまで動いたと思う。この簡素な感じがfreebsdだなあ。

Monday, July 13, 2015

パラメータN

実際の数字にのっとらず、議論が観念的になることってあるよなあと思うことがあります。

知り合いの数って、1000人のオーダだろうと思うんですね。いろいろレベルはあるとしても。知り合いの知り合いまで含めると、その二乗で100万人になります。ダブりは無視しましょう。100万人オーダーの国と、10倍か100倍の国ではいろんなことが違うんじゃないかと思うのだけど、どうなのだろう。とある北欧の国の知り合いと、日本の近くのアジアの国の知り合い、それぞれ兵役があったのですが、北欧の人は兵役で良い経験をした、と言い、アジアの隣国の人は最悪だったと言っていた。サンプル数それぞれ1の危うい比較ですが。その北欧の国は小さいんです。500万人くらい。アジアの国はその10倍くらい。私の仮説は、小さい国、つまり100万人オーダーの国でないと兵役は上手く行かず、社会的緊張を高める、というものです。だって、大きな国になるとそれが「システム」になるじゃないっですか。兵役という税金以上の奴隷的作業をしているわけですから、国民が政治を見る目は非常に厳しいだろう、ということを社会的緊張と呼んでおります。

中東の某国で、兵役についた経験のある知り合いがいます。そこも500万くらいの国ですね。今の話は全部現地のネイティブの人ね、日本人はもちろん一人もいない。彼もそのことを悪く言ってなかったなあ、というのが私の仮説を強化しています。

兵役の話は以上。
和をもって貴しとなす、おまえら喧嘩するな、というのは何人まで可能なのでしょう。
民主主義は何人の集団までで可能なのでしょうか。100億人いても可能なのでしょうか。まず人数だけではなく、どれだけ多様性があるかということも問題だと思いますが。


栄枯盛衰ということがありますが、我がIT業界も私が学生だった頃は花形でしたが、今はどうでしょう。昔はとにかくキレイなイメージのある業界でした。後に実情がバレて新3K(きつい、かえれない、給料安い)と言われるようになりましたが、私と同じ年代以上のおじさんたちは気がついていないし、聞いたことがあっても忘れています。最近の学生さんの人気学科はどこなんでしょうね。情報系は不人気だと聞きます。

そこで少し気になっているのが、オープンソース。オープンソースといえば、「コミュニティ」に頼んでおけばなんとかしてくれるもの、とオジさんたちは信じているのです。そのオープンソースって、人材が無限大に供給されることを想定していません?最近でもCでプログラム書く若者っているのかなあ。日本だけの話ではないけど。減っているとすると、Linuxカーネルみたいに、20年前はみな若者だった世界はどうなって行くんだろう。若い人をリクルートできているのかなあ。だってみんな老眼になるよ?

後半の話はちょっと実数との関係は分かりずらかったかもしれないが、人数や年齢という数字を踏まえないと危ういよ、と言うつもり。




Saturday, June 27, 2015

Apache Sparkメモ#2

spark-shellからコマンドを叩いている段階から、プログラムを書く段階にすすみたい。プログラムをsparkに食わせるのをsubmitと呼んでいる。ここを読んだ。 https://spark.apache.org/docs/1.4.0/submitting-applications.html 
サンプルプログラムをsubmitするには以下のようにする。以下の例ではモンテカルロ法で円周率を計算している。

$ ./bin/spark-submit   --class org.apache.spark.examples.SparkPi   --master local[8] lib/spark-examples-1.4.0-hadoop2.6.0.jar 10
Pi is roughly 3.14154
同じことをpythonで実行する。

$ ./bin/spark-submit   --master local[*]   examples/src/main/python/pi.py   10 
Pi is roughly 3.141452
では自分で作ったファイルをコンパイルするにはどうするか。

ここのSimple Projectの例題をやってみよう。ファイルの中のaとかbの数を数えるってやつ。

http://spark.apache.org/docs/1.4.0/quick-start.html#self-contained-applications 
よくわからないのだが、上記のようにsbtを使って定義し、ビルドするらしい。sbtは以下からダウンロードした。
http://www.scala-sbt.org 
sparkのページの例題の以下のバージョンだが、私の手元のscalaはもっと古い番号なのだが、気にせず例題通りにやってみた。

scalaVersion := "2.10.4"
setはset packageで、手元にあるsbtファイルを実行してくれる。ファイルが2つある場合はどちらを取るのだろう。 とにかく、set packageを実行すると、なんやらmavenや圧縮のライブラリなど含めていろいろダウンロードが始まる。これってまともなことなのだろうか。依存関係は先に解決してくれればいいのに。すごく時間かかる。2度目からは時間かからないんだろうな。 これができていたファイル。

./target/scala-2.10/classes/SimpleApp.class
./target/scala-2.10/simple-project_2.10-1.0.jar
sbtファイルには name := "Simple Project" と書いていたのだが、できるjarファイルは小文字なんだなあ。しかも横棒が入っているし。油断も隙もない。。。
私Javaで開発やらないんで、どうもこういうJava周りの風習について行けないんだよなあ。mavenて何なのよ。

文句はともかくsubmitしてみよう。

$ ./bin/spark-submit   --class "SimpleApp"   --master local[4]   target/scala-2.10/simple-project_2.10-1.0.jar
Lines with a: 60, Lines with b: 29


spark 1.4.0からR対応が入った。例題が付いているけれど、dataframe.Rを読めばRの言葉で書いてあるので理解できる。本日一番親しみを感じるのがRという結論。実行結果は正しそうだ。

$ ./bin/spark-submit examples/src/main/r/dataframe.R
root
 |-- name: string (nullable = true)
 |-- age: double (nullable = true)
root
 |-- age: long (nullable = true)
 |-- name: string (nullable = true)
    name
1 Justin


おしまい。

Saturday, June 20, 2015

Apache Sparkメモ

Apache Sparkでローカルのファイルを読んで、必要なフィールドを抜き出すまでに引っかかったことをメモっておく。 つまりはawkやpythonならあっさりできること。 spark-shellを立ち上げると、ポート4040でjettyくんが立ち上がり、sparkの動作状況がわかるのでブラウザでみてみると良い。 Javaではファイル名に”:”が入っているのを許さないらしく、それがファイルにアクセスした時に判明する。 以下は人工的な例だが、dateを元にしてで作ったようなファイル名の場合に問題になるでしょう。

scala> val f = sc.textFile("tmp/w:1:2.csv")
その時の怒られようが以下のように相対パスがどうのこうのと意味不明なので、ちょっと覚えておこう。

scala> f.first
java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: w:1:2.csv

scala> val f = sc.textFile("tmp/w.csv")
てきとーなcsvファイルだが、カンマ区切りとして読み込むには以下のようにsplitする。pythonみたいにcsvモジュールはないってことだろうか。firstで、最初の一行を表示しているところ。

scala> f.map(line => line.split(",")).first
res2: Array[String] = Array(8, 1, 66.3)
最初のフィールドには興味がないという場合、0番目は飛ばして、1、2を タプルで保持する。

scala> f.map(line => line.split(",")).map(x => (x(1),x(2))).first
res3: (String, String) = (1,66.3)
そして、2番めのフィールドの値でフィルタする処理。

scala> f.map(line => line.split(",")).filter(x => x(2).toDouble > 67.0).map(x => (x(1),x(2))).first
res6: (String, String) = (2,67.1)
map, reduceをやろうとしている時にcsvに値の欠損があって、そこで処理が失敗するんですね。一旦csvを直して出直しました。 ペアの場合は左がキーで、valueを集計するには、単に_+_と言えば良い。scalaのアンダースコアは謎だけれど、この場合、二項演算子だということを言ってるらしい。キーが同じものを集計して出力してるところ。最初の3つを表示している。

scala> f.map(line => line.split(",")).map(x=>(x(2),1)).reduceByKey(_+_).take(3)
res5: Array[(String, Int)] = Array((65.7,1), (65.5,2), (66.1,3))
集計した値でソート。”_._2”と言っている後半の”_2”は、配列の2番目の要素の意味。scalaではなぜか

scala> (1,2,3)._2
res10: Int = 2
のように._2のように要素を指定する。ようするに[2]のこと。これって 1始まりの配列なのね。 最初の”_”は任意のものにマッチするアンダースコア。

scala> f.map(line => line.split(",")).map(x=>(x(2),1)).reduceByKey(_+_).sortBy(_._2).take(3)
res6: Array[(String, Int)] = Array((65.7,1), (66.9,1), (67.1,1))
これだと面白くないので、逆順にする。 reverseするにはsortByの第二引数でfalseというだけ。これはscalaではなく、RDDの仕様。

scala> f.map(line => line.split(",")).map(x=>(x(2),1)).reduceByKey(_+_).sortBy(_._2, false).take(3)
res7: Array[(String, Int)] = Array((63.9,17), (64.5,14), (64.2,13))
おしまい。 今回はカンマ区切りだったのでline.split(“,”)としたが、空白で切る場合はsplit(“\\s+”)とする。これはJavaの規則だそうだ。

Saturday, June 06, 2015

iTunesでのNHK語学CDのダウンロード

結論からいうと、
iTunes Storeではオーディオブック、着信音、通知音は再ダウンロードできない
ということだそうです。つまり買ったデバイスでしか聞けないということです。

それと、NHKの語学の教材のCDはオーディオブックです。

この顛末は以下の通りです。
iCloudの機能でファミリー共有ということができます。iTunesで買ったものがファミリー設定した家族と共有できるのです。この機能を使って、中学生の子供にNHKの基礎英語のCDを買って、子供のiPodで聴けるようにしようとおもいました。ところが買ったパソコンのiTunesの中でこのCDの内容を見つけるのが一苦労、さらにiPodからは全く見えない、という症状になりました。

結局、ここからhttp://www.apple.com/jp/support/itunes/contact/  電話で相談して、冒頭のことを教えてもらった次第です。再ダウンロードできないので、ちゃんとバックアップしてくださいとのことだそうです。それだと根本の問題の解決まで先が長いので、買ったコンテンツの分は返金してもらい、改めて子供のiPodから購入することにしました。

NHKの語学番組は一週間遅れですがストリーミング配信しているので、そもそもCDを買う理由はそれほどないんですけどね。

Sunday, May 31, 2015

iOS卒業

iPod touchを使っていたのですが、上の子に与えることにして、私はiOSから卒業しました。もう大体分かったということで。

下の子はZ会の通信添削をやっているのでiPad miniを使ってます。

Running Spark on EC2

Apache Sparkを動かそうと思って、Running Spark on EC2に書いてあることをやってみている。

pythonのスクリプトでSparkのクラスタがインストールできる優れものだが、私は今までAWSでEC2にsshでログインしたことがあるだけだったので、新しく設定すべきことがあった。これメモしておかないと絶対忘れる。

東京リージョンのpemのファイルは手元にあるので、それを使う。これ以外にアクセスキーが必要。AWSコンソールの右上の認証情報からIAMマネージメントコンソールには入って、アクセスキーを作った。これを環境変数AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY
に入れておく。

キーペアは、自分がAWSで設定したキーペアの名前。

スクリプトを動かすと、
You are not authorized to perform this operation.
といっておこられる。

AWSコンソールで、IAM > ユーザから、ポリシーのアタッチで、自分にAdministratorAccessをつけた。

これでスクリプトが起動。クラスタが立ち上がった。デフォルトで起動したところm1.largeが2ノード立ち上がった。

クラスタのマシンに入るには、同じスクリプトを使うのだが、キーペア、pemファイル、リージョン、クラスタ名などを設定する必要があった。