仮想的なマシンをインストールしたPC上に作成できる VirtualBox のフロントエンド。Ruby 製。ゲストOSのインストールや必要なソフトのインストール等、面倒くさい設定を省くことができ、いきなり目的の作業することができる。
最初に Mac 版のVirtualBox の最新版をインストールしておく。
今回は最新版のV1.3.5をインストール Vagrant
予め用意された仮想マシンのテンプレートをダウンロードしてくる。CentOSやUbuntu等のメジャーなLinux系のbox以外にも、OpenBSDなんかのboxもある。
他にもGithub等で検索すれば、多種多様なboxファイルをダウンロードできる。今回はCentOS 6.4 x86_64 Minimal (VirtualBox Guest Additions 4.2.16, Chef 11.6.4, Puppet 3.2.3)をインストールすることにする。
boxファイルの追加は以下のようにすればOK。下記のように。最後の部分にURLを指定すると自動的にダウンロードが開始されるが、boxファイルを事前にダウンロードしておいて、そのファイルのPathを指定してもOK。
$ vagrant box add ceontos6.4 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box
まず仮想マシン作成先に移動する。
$ mkdir ~/vagrant/centos6.4
$ cd ~/vagrant/centos6.4
下記のようにすれば、仮想マシンが作成されサーバーが起動する。
$ vagrant init ceontos6.4
$ vagrant up
次に下記のようにすると、起動したサーバーにsshで接続できる。
$ vagrant ssh
接続を切断する際はコンソールにexitと入力すればOK。シャットダウンする際は、下記のようにする。
$ vagrant halt
サスペンド
$ vagrant suspend
レジューム(サスペンド状態から復帰)
$ vagrant resume
追加済みのboxの一覧を表示
$ vagrant box list
boxの削除
$ vagrant box remove {box名}
仮想マシンの状況確認
$ vagrant status
仮想マシン削除
$ vagrant destroy
仮想マシンからboxを作成
$ vagrant package
]]>2013/09/28に行われたNDS33に参加してきました。今回はScalaのハンズオン+LTの構成。
Scala で Hello, World から Twitter bot を作成するまでのハンズオン形式のセミナー。講師は猫型さん(@neko_gata_s)。
ScalaはJVMで動く強い静的型付き言語。Javaの資産も活用できる。
事前に Twitter API の consumer key, consumer secret, access token, access token secret を取得を取得し、Scala開発環境のセットアップを行うまでが入学試験(?)でした。
私はMacだったので、Scala と sbt は homebrew でインストールし、JDK や IntelliJ IDEA は公式からダウンロードし普通にインストール。
実はsbt-ideaのインストールがうまいこといってなかったのがハンズオン中に発覚。
build.sbtを ~/.sbt/plugins/build.sbt
に置けと公式ページに書いてあったが、正しくは~/.sbt/0.13/plugins/build.sbt
だった。
hello, world は無事出力され、次に文法周りの説明が。 ifが最後に評価された値を返すのが地味に便利だったり、強力なパターンマッチもある。また、map、flatMap、filterあたりの関数型っぽい操作を味わったり、それらの高階関数+Option型等を駆使することで、ぬるぽ回避を行う等なかなか興味深い手法も体験できた。
最後に Twitter bot の作成。ぬるぽをタイムラインに発見したら、ガッする bot 。 Java用の Twitter API ラッパの twitter4j を利用してサクッっと作成。 twitter4j 触ったの初めてだったけど、設計しっかりしてて触りやすそうなライブラリだった。
約5時間のハンズオンでしたが、Scala の魅力が十分伝わってくる良いハンズオンでした。 これから Java の移行先として盛り上がってきそうな雰囲気もあるので、今後が楽しみな言語です。
Scalaのハンズオンに続いてLTセッション。
ETロボコンのお話。PID制御のお話も。 光センサーでズレを検知して修正するが、モーター出力の個体差があるので、モーターーエンコーダ角度制御でも補正してやるとうまくいくらしい。最近はこの辺の制御やることもないので、なんだか懐かい気持ちになったLT。
もっとライトに新潟開発者向けの勉強会を開きたい。が、新潟市だと割とお金がかかる。駅から近い、利用許可がフットワーク軽い、お金がかからない、ネット回線、etc…が必要。ウォーターセル株式会社1F アグリノートカフェを勉強会向けに開放するらしい。基本的に祝休日のみで、開発者の勉強会orハッカソン、ウォーターセル社員が参加者にいることが条件らしい。今度機会を見つけて、遊びに行きたい。
裏東京ゲームショウ2013 in 長岡レポート。かつて、突然死ぬゲームやPythonが主人公のシューティングゲーム等、なかなかユーモラスたっぷりなゲームを作ってきた@jewel_x12さんが、最新作のデモを公開。「草不可避」と言葉があんまり好きじゃなく、wwwwの雰囲気を大事にしたいらしい。「草避ける気はあるのか?努力しろ社会は厳しい」。Backbone.jsを使って上から降ってくるツイッターのTLに現れる草を避けるブラウザゲーム。正式版公開が待ち望まれる。
はてなサマーインターン2013により得られた見解(はてななんも関係ないよ!)。 エンターキーによる騒音被害を軽減するためにエンターキーを押しにくくする必要あり。 人間の電流に対する恐怖心は強いのでエンターキーに電流を流そう!という発想はなかった。実際に使ってもらったら騒音被害が減った。なぜならCtrl+Mを使い始めたから。その発想はなかった。次はデプロイ失敗で電流とかが目標らしい。
コンポーネントテスト、統合テスト、システムテスト、受け入れテスト
人や組織によっていろいろな呼び方がある。違いがあることを許容しましょう。同じ言葉で話すこともできるって素晴らしいですね。JSTQBシラバス読めとのこと。
ここの用語集便利そうなのでとりあえずブックマークした。
東京の某社に転職が決まったらしい。おめでとうございます。何故転職?という話から、前の会社でよりよい環境のためにやったこと、うまくいったこと、わかったことのお話。環境を変えるための大変さを改めて実感。自分にも活かせそうなお話もあった。
今回はテーマ的にプログラマ向けのハンズオンが主でしたが、なかなか充実した内容で楽しめました。新しい言語を触って新しい概念を学ぶと、普段使ってる言語での書き方も良くなることが多いので、積極的に他の言語の考え方も取り入れていきたいです。 次回のNDS34はおそらく日程的に参加は厳しいですが、次々回やその次あたりは東京行く前に参加しておきたいです。
]]>username.github.io でリポジトリ作ってーって言われたけど、 作るとこのブログが上書きされてしまうので、のんびり進行を眺めつつ過ごす。
Mac版とWindows版の仕様の違いでトラブルが。 Windows版の方が後発なので、まだまだこなれていない部分があるようです。 普段コンソールからしか叩いてなかったので、この見やすさは便利。
nodebrew(node.jsのバージョン管理ツール)を使ってjode.jsとnpmをインストール
node.jsを使ってスクリプト実行
npmを使ってモジュールをインストール
趣味でもGitつかおうぜ。
音楽データの差分どうするの?
画像の差分比較欲しい。
-> 質疑で画像の差分はGithubで可能だよ!とのこと。
マインクラフトのセーブデータ管理を実演。
オートセーブの結果を上手いこと管理。
セーブデータのPush!Fork!
一番いいセーブデータを頼む。
ソーシャルゲーム!
「とりあえず、修正して。」
と…とりあえずってなにさ?
「とりあえず、見たいんだけど。」
とりあえずの連鎖
とりあえずで進んだ結末
解決法は(1)計画的に(2)面倒事に踏み込む
ディレクションネタが好きな人を、募集中らしい。
https://www.facebook.com/yoshihiro.ueki
ディレクション系のネタは大学にいるとほとんど聞く機会がなかったので新鮮でした。
皆さんラーメンはお好きですか?
facebookページで広告してみた
プロモーション方法の紹介
「いいね!スポンサー記事」と「いいね!広告」
1ヶ月$45で設定。急に大金の請求来る心配なし。
結構トータルで安く済むっぽい。
インプレッション数等確認可能。
対象(オーディエンス)の指定が可能。何人ぐらいが見る可能性があるのかわかる。
支払いはPaypalやクレカ等。1週間単位ぐらいで集金。
Facebookのプライバシーの収集具合こわひ。
結構細かいこと指定できるのね。
アイコンの作成方法
keynoteでもいけるんじゃね?
keynoteでアイコン組み合わせまくり。グループ化。
クリップボードにコピーしてGimpに貼り付け。
お手軽!
簡単な図形の組み合わせだけでも意外となんとかなる。
画像の種類の少なさが逆に想像力を刺激する!
必然的にフラットデザインになる。
私の発表。
資料やコードはここに。
自分の理解しているVCSの情報を一旦全部出す。
情報を整理し、足りない情報をWebで収集。
情報を分類し文章の目的設定。
書く利点は…
(1)自分の知識が整理される
(2)みんなに「すごい」って言ってもらえる
(3)マサカリが飛んでくる
ver. < Office 2007。 2003以前は残念。
美しい。
アウトライン式でテキストを追加した時レイアウトが自動で変更。
面倒な関係を用意に記述可能。
デザインとコンテンツを分離可能。
Office365でも可能。
前のネタと同じなので略。
今回は人数も部屋ぎっしりで、初参加の人もいっぱいいたっぽい。
GithubハンズオンでGUIツールの見やすさを実感。コミットしたりするときはコンソールでいいかなと思うけど、過去の編集履歴確認するとき等は、今後SourceTree使うことにしよう。あと普段GitでForkすることがなかったので、いい経験になりました。
LTセッションの多種多様な発表を見ると、自分のプレゼンはまだまだ工夫が足りないのを実感。もっと場数踏んで慣れないといけませんね。あと既存のものの組み合わせ方についても普段から意識的に考えねば。
]]>https://codeiq.jp/ace/naoyat/q105
http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002315&tcs=kanren
トレーニング用のデータ: “CodeIQ_auth.txt”
分類するデータ: “CodeIQ_mycoins.txt”
を上記のURLからダウンロード。
以下ソースコード。
きちっと線形分離できるので簡単な問題ですね。
]]>以下今日の発表の簡単なまとめです。
@~ はTwitterのid
SL4A(Scripting Layer for Android)を利用すると、Android上でPython Perl RubyなどのScript言語が動く。これとQRコードスキャナを組み合わせて、「とびだせ どうぶつの森」のマイデザインのQRコードを生成する。
…はずが失敗。マイデザインのQRコードの中身は独自形式のバイナリデータだったため。Unicode文字列で表示できない文字が<?>に。この部分を改善すればどうにかなるのか?
祝電スライド1つ目。内容はこちら 。
LTSV(Labeled Tab-separated Values) とは hoge:foo\tbar:baz\n
のような形式のデータストラクチャ。
DynamicLTSV:LTSVライブラリを作ったよという話。これからLTSV流行る?
ガベージコレクションの基本的なアルゴリズムのお話。基本的なマーク・アンド・スイープ、参照カウント、コピーGCに加え、3つを組み合わせたもの、世代別GCなどの発展的なものの話もあり。最強のGCは無いっぽい。
GroovyはJavaVM上で動作する動的なプログラミング言語。Javaのコードがほぼそのまま動くのでJavaとの相性が良い。クロージャー、演算子オーバーロード、Groovy JDK (GDK)、便利なライブラリ(Groovy API)など、Javaを強化する機能が盛り沢山。
開発を効率化するために、Webアプリフレームワークの「Grails」、デスクトップアプリケーションフレームワークの「Griffon」、ビルドツール「Gradle」、常駐化で高速起動「GroobyServ」、その他「Gaelyk」、「Gpars」、「GroovyFX」などのフレームワークやライブラリ群などがある。 パフォーマンスはそのままだとそこまで良くないが、最近実装された静的な型チェックや静的コンパイル機能を使ってやると結構早い。Javaより少し遅い程度かも?
日本Grails/Groovyユーザーグループに日本語情報あり。
鯛虎という、Web記事タイトルをみんなでひたすら翻訳するサービスブックマークサービスをPadrinoでつくったとのこと。ちなみに、Title:鯛 Transration:虎。
軽量WebアプリケーションDSL(Domain Specific Language)としてRubyにはSinatoraがある。多言語用の似たものとして、PerlにはMojoliciousやDancer、PythonにはFlaskやJuno、PHPにはSlimやSilexなどがある。
PadrinoはSinatoraベース(Sinatoraを拡張)のWebアプリケーション作成フレームワーク。Sinatoraにロガー、ヘルパー、ジェネレータ、Rails風MVCの導入、メール配信機能、管理画面、View用ヘルパー、多言語対応など諸々の機能が追加されている。Webアプリでおなじみのディレクトリ構成をいちいち手動で作る必要がなく、必要な機能のみ選択して拡張可。
小さなサービスをサクッと作るには良いフレームワークっぽい。 Knohとか出てきてるし、今後記事翻訳系サービスが面白くなるかも的な話もあった。
Padrinoに引き続き、WAF(Web Application Framework)のMojoliciousのお話。これはPerl用。公式の日本語ドキュメントが充実していて、テンプレート、開発用サーバ・開発用SSL証明書、json、Websoketなどはデフォルトで用意されている。足りないところはCPANでカバーする。例えばデータベースやセッション管理など。
Perlで小粒なアプリケーションをつくるならMojolicious一択!
CinnamonはPerl製のデプロイツール。複数ホストに対して、アプリケーションをガッとデプロイ。他言語の似たようなツールはCapistrano (Ruby)、Fabric (Python)などがある。
Cinnamonの実態は、SSHでホストに接続してコマンド実行。Role x Task で柔軟に対応できる。
同時実行たタスク・イン・タスクなどはこれから実装される?シンプルだけどまだまだこれからのようです。この手のツールは基本的に学習コスト高。
Fabricよさげなので、Pythonに抵抗ない人はそっち使おう!というオチ。
XLUnitはわかりづらい。VBAUnitは手間がかかる割には使いづらい。そこでVBAUnit(jp)。日本語の関数名が使える、レッド/グリーンバーがある、関数を追加するだけでテスト追加、対象とテストのファイル分離可、対象のソースをあまり汚さないなど非常に使いやすい。
VBAであまり組みたくないというオチ。
Scala入門編。オブジェクト指向 + 関数型 ≠ 関数型。オブジェクト指向で作っていい。副作用があってもいい。JavaにRubyを足した感じ。すべてオブジェクト(型も)。トレイトを使ってMix-in。Javaのライブラリが使え、より簡潔に書ける。型推論もある。並列処理や再帰が得意。などといった特徴がある。
欠点はコンパイルとJVM起動がややもっさり。また言語仕様が複雑。例えばListのインスタンスメソッド名が++ ++: +: /: :+
etc…のように名が体を表しておらず意味不明。
拡張ライブラリにscalazというものがあるが、こういうことやるからScalaは怖い的なことを言われるので、最初は使わなくてもおkらしい。
関数型言語は興味あるので、そのうち触ってみるつもり。
発表してきました。LLと相性のいいブログだよ!資料はこちら。
MONO Rubyとはmrubyともの作りのコラボイベント。3Dプリンタの話など、すでにmrubyが組み込まれた製品の話。
mrubyは組み込み向けの軽量ruby。日本語で参加可能なオープンソースプロジェクトでまだまだ発展途上。
RubyのGemはmrubyではmrbgemsとなっている。mrubyを拡張する仕組みでmrubyコンパイル時にlimmrubyに機能を組み込む。基本的な組み込み関数もこれで提供されるので極限まで最適化可能。
プロジェクトの規模は大きいけどソースコードはまだ小さい。もしかしたら、Matzのコードレビューが受けられるかも?今ならmrubyの先駆者になれる。さあLet’s pull request!
基本的にJSのテスト駆動開発(TDD)の話。クライアント(ブラウザ)を使うテスト:PhantomJS、単体(ユニット)テスト:QUnit、コマンドライン上からのテスト:QUnit-TAP & prove、更新に合わせたテストの自動実行:pfswatchなどが紹介された。
コマンドが成功するか失敗するかによってその結果に対応した音声が流れるモジュールを利用して、テスト結果の通知を音声で通知するという面白い試みについての話App::WithSoundもありました。
一度TDDはしっかり勉強しないと…
PowerShellはWindows用のShell。Win7は2.0、Win8は3.0。MS製品との親和性が高い。例えばSQLServerとかActiveDirectoryとか。基本Shellだが、VBScriptの代替にも使える。
lsって入力できる!エイリアスが登録できる(lsもdirもエイリアス)。csvファイルの読み書きが簡単。スクリプトファイルに保存、実行できる。.NET Frameworkのクラスライブラリが使える。パイプが使える。.NET Frameworkのオブジェクトが渡せる。オブジェクト指向プログラミングができる。IDEが標準で付属。サーバー管理機能。テストツール、例外処理、文字コード周りの処理などもちゃんとある。
もはやなんでもあり。
祝電スライド2つ目。内容はこちら。
最近のPerlの可読性・オブジェクト指向(Mouse)や例外(Try::Lite)のお話。There’s More Than One Way To Do It. 「やりかたはひとつではない」的な観点に基づくと別にPerlにこだわりすぎる必要もない。
ここにAdobe AirとかopenFrameworksを使って制作したもののサンプルあり。ミーム DE ディスカッションとか。
プロジェクトマッピングとかのお話も。こんな(YouTube)感じで、かなりレベル高かった。今回一番の衝撃。
この手の話は、普段あまり聞く機会がなかったので面白かった。もっと芸術的なセンス欲しい…
@JO_RI_bot のお話。いわゆる人工無能。圧縮新聞とかしゅうまい君の仲間。Twitterでリプライを送るだけで様々な機能が利用可能。
ぬるぽ->ガッ、タイマー、翻訳(Bing翻訳を利用)、多言語対応、Amazonの商品検索、本の感想(じょりくん:@JO_RI が読んだ本(主にラノベ)ならだいたい返ってくる)、キーワード検索、ユーザー検索、イベントの詳細、QA機能、etc..
詳細はここ読めばおk。
Scalaのパターンマッチングのお話。簡単に言うと豪華なCase文的なイメージ。定数パターン、シーケンスパターン、型付きパターン、コンストラクタパターン、抽出子(インスタンスの構成要素を分解してマッチング)など。
色々できて便利!Scalaは多機能故に学習コスト高…
普段使わない言語の考え方って面白い。
今回は飛び入りの発表者が多く、分量・内容ともかなり増し増しな感じでした。LLは用途的にもWeb開発系のフレームワークの話が多いかなと思ってたけど、そんなことはなかった。
普段はほとんどPythonを使っているけれど、こういう場で学んだ他言語・他ツールとの共通部分・差異をもっと意識すれば、もうちょっとマシなプログラムが書けるはず。精進あるのみ。
それから、普段見落としそうな所にもアンテナを向けるためには、「こんなんあるけど、どうよ?」と言ってくれる人がいる、情報を受動的に手に入れられる環境に定期的に顔出すのって重要なのを再認識しました。
]]>Sys.setenv("http_proxy"="http://xxx.com:yyyy") # xxx: host, yyyy: port
]]>最初にRをインストールするために必要なパッケージのgfortranをHomebrewでインストール。
$ brew install gfortran
あれ?
Brews that require a Fortran compiler should not use:
depends_on 'gfortran'
とか言われた。アップデートしてみる。
$ brew update
$ brew install gfortran
$ brew install r
起動のテストとデモ。
$ R
Rは、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()'あるいは'licence()'と入力してください。
Rは多くの貢献者による共同プロジェクトです。
詳しくは'contributors()'と入力してください。
また、RやRのパッケージを出版物で引用する際の形式については
'citation()'と入力してください。
'demo()'と入力すればデモをみることができます。
'help()'とすればオンラインヘルプが出ます。
'help.start()'でHTMLブラウザによるヘルプがみられます。
'q()'と入力すればRを終了します。
> demo(nlm)
動いたよ!
]]>MacTeXから、MacTeX.pkgをダウンロード。ダウンロードした.pkgファイルをダブルクリックしてインストール。
動作確認。以下のサンプルをhogehoge.texの名前で保存。
\documentclass{jarticle}
\begin{document}
こんにちは、世界。
こんにちは、\TeX。
こんにちは、\LaTeX。
\end{document}
コンソールから、
$ platex hogehoge.tex
$ dvipdfmx hogehoge.dvi
これで、hogehoge.pdfが生成される。日本語も問題ない。
普段はコンソール上のEmacsで作業しているので、そこからTeXを便利に使うためのツールをインストール。
YaTeXから、最新版のtar.gzをダウンロード。
$ cd ~/Downloads
$ curl -O http://www.yatex.org/yatex1.76.tar.gz
$ tar zxvf yatex1.76.tar.gz
$ mkdir ~/.emacs.d/lisp/yatex
$ mv yatex1.76 ~/.emacs.d/lisp/yatex
次に、.emacsを編集。以下のコードを最後に追記。
;; for YaTex
;; Add library path
(add-to-list 'load-path "~/.emacs.d/lisp/yatex")
;; YaTeX mode
(setq auto-mode-alist
(cons (cons "\\.tex$" 'yatex-mode) auto-mode-alist))
(autoload 'yatex-mode "yatex" "Yet Another LaTeX mode" t)
(setq tex-command "platex")
(setq dviprint-command-format "dvipdfmx %s")
;; use Preview.app
(setq dvi2-command "open -a Preview")
(setq bibtex-command "pbibtex")
動作確認。
$ emacs hogehoge.tex
C-c t j
でコンパイル。C-c t l
でdviをpdfに。C-c t p
でpdfファイルをプレビュー。
動いた。
この辺りのページ参照。
LaTeXコマンドシート一覧
野鳥(YaTeX)[物理のかぎしっぽ]
JAWS-UG は AWS User Group - Japan 最後のNGは 新潟 or 長岡。31番目の支部らしい。
VPC(Virtual Private Cloud)の作成から始まって、EC2インスタンスを作成してアプリケーションサーバの構築、DBインスタンスを作成してEC2インスタンス内で動かしてたデータベースを移行、ロードバランサの追加という流れで進んでいった。
小規模なWebサービスを立ち上げて、トラフィックの増加に従い、システムリソースの拡張を行う際の流れをひと通り経験出来た。システムの可用性の向上、セキュリティ面で注意すべきことなどの話もきちんとあり、AWS未経験の人間でも数時間でそれなりのシステムが組めるようになった(気がする)。
今回のハンズオンでAWSに以下の様な印象を持った。
Azureも悪くはないが、個人で利用する場合は少しコスト面が気になる。ネットワーク周りやディスクアクセス周りは、両者で実際にそれなりのサービスを動かして比較してみないとなんとも言えませんね。AWSで今後使う可能性がありそうなサービスは、EC2で簡易なWebサービスのホスト、Amazon Glacierで重要であまり変更が行われないデータのバックアップあたりかな?将来的にはHadoop関連のサービスあたりも使うかも。1年間の無料枠があるので、その間にもう少しいじってみる予定。
一人あたり約5分程度の枠で合計約1時間程度の発表。
https://gist.github.com/4640042
Webサービスが簡単に作れる。
スケーリングも簡単にできるが、お金も必要。
簡易な処理で済むサービス動かすならいい感じ。
家で調べてみたらこのブログで使ってるOctopressもHerokuにデプロイ可能なようだ。
https://github.com/Shinpeim/WaveZutaZuta
いけてるほうのねこがたさん
音を分割して繋いでリミックス
くーる!
えんじにあにはもててた
NPOが実施している高齢者向けパソコン教室の受講者の高齢者のみささんにテスターをやってもらおうという試み。
「自助」災害時に自力で情報収集 +「共助」高齢者の友達の輪
開発者は若年層が多いので、高齢者向けのデザインはあまり考慮されてないものが多い。高齢者にも優しいプロダクトを。
多少なりとも報酬を。高齢者のPC学習のモチベーション向上に。
Raspberry Piネタ1人目。
https://github.com/aokcub/PiGPIO
Lチカ。LEDチカチカ。マイコンのHello, World!
Perlで制御。PWM制御も実装。
もてそう。
Raspberry Piネタ2人目。
USB温度センサーで部屋の温度取得。
Matplotlibでグラフ化
将来はエアコンの管理も?
私が発表しました。このBlogに書いたRaspberry Piネタ(概要・キャラクタLCD・人工無能)を話しました。
発表スライドのPDF
LCD制御用のプログラム
人工無能: MunouChan
Webサービスの高速化についてのお話。
Titanium Mobile: JavaScriptでiOS・Androidのアプリが書ける。
Appcelerator Cloud Services(ACS) -> AWS上で動いている
BaaS Backend as a Service
あらかじめ用意された機能群から必要な機能を選択できる。
サーバーサイド、バックエンド側の知識が少なくてもどうにかなるように。
非常に高い堅牢性。
短時間でAWSでのWebサービス構築方法を学べたので非常に有意義だった。LTも普段触れない技術に触れることの出来る良い機会でした。そろそろLTで言語処理関連の話や機械学習の話もしたいですね。
]]>考えてるように見えて考えてない。ただ確率に従い文章を生成するプログラム。それでも人間から見ると、意味のある文章に見える文章が生成される。
基本的な生成手順は
自然言語で書かれた文を、形態素 (言語で意味を持つ最小単位) ごとに分割し、各形態素の品詞を特定することを形態素解析と呼ぶ。プログラムで自然言語を扱う場合、よく使われる技術の一つ。細かいことはWikipedia でも見てください。
日本語の形態素解析を行うためのツールは以下の様なものがある。
今回は使い慣れているMeCabを使いました。
すごく簡単に言うと、ある要素を次々と発生させる状況を考えたときに、次の要素が現在の要素のみによって決まるのがマルコフ連鎖である。詳しくはWikipediaでも見てください。
これを文章に適用した場合の例だが、解説はこのページがわかりやすい(「それが大事」にマルコフ連鎖を適用してみる)。
ある単語があったとき、その単語の次に現れる可能性のある単語の確率のみを考える場合を単語uni-gramのマルコフ連鎖、2単語ずつをペアにして考える場合を単語bi-gramのマルコフ連鎖、さらに続いてtri-gram、4-gram、…N-gram。と呼ぶ。
例えば、
私/は/旅行/に/行き/たい/。
という文章があった場合、
[S]/私/は/旅行/に/行き/たい/。/[E]
のように。単語[S]から作り始めて、単語[E]が現れたら終了。という訳で、Raspberry Pi + LCD で動くものを実装してみました(MunouChan)。文章生成に使用したのは友人のTweet。@~
から始まるリプライツイートは削除しました。各単語はMeCabで分割し単語の読みに変換(最終出力が半角カナのみなので)。単語の読みのみを考慮して(火と日は”ひ”で同一単語扱い)bi-gramの単語ペアを生成。ペアの出現回数をカウント。次に現れる単語の確率を計算したものをpickleモジュールでダンプしたものが上記URLのプログラムの状態です。
後はプログラム起動時にダンプされたデータを読み込み、開始単語から終了単語が現れるまで確率に従いランダムに単語を選択。LCDに収まる文字数ならLCDに出力し、オーバーしていたら再生成。
./probability.pkl
を削除またはリネームし、tweetディレクトリの中のsample.tsvを同じ形式で書き換えてやれば、任意の元データでも動くはず。ただ元データに文字数が多いものばかりを選ぶと、制限文字数をオーバしまくるので怪しい動作しそう。
実行したときの画像がこのページトップあたりにある画像です。
シンプルな人工無脳を作るのはさほど難しくないが、人間らしい応答をさせようとすると難易度が跳ね上がる。そもそも「人間らしい」という定義すらよくわからない。
これはマルコフ連鎖を文章に適用した例だけど、状態の遷移を確率的に表現できるものに適用できるので、音楽や絵の自動生成など、他分野にもいろいろ適用できるはず。
]]>秋月電子で以下のものを購入。 ・SD1602HUOB 16x2 キャラクタLCD x 1 ・GF12-US0520 5V2A ACアダプタ x 1 ・半固定抵抗器 50Ω x 1 ・ピンソケット (メス) 2x13 (26P) x 1 ・ブレッドボード用DCジャックDIP化キット x 1 ・トグルスイッチ3P x 1 ・ユニバーサル基板 (両面スルーホール) 72x47 x 1
合計して約2000円。配線は以前からの余りを流用。
今回使用したLCDはHD44780の互換品なので以下の作業はこのページを参考にして行いました。
GPIOとLCDのピンの接続は、基本的に参考ページの通りに接続。基本的には問題ないのですが、注意点が1つ。参考サイトではLCDの3番ピン(Contrast)がGNDに接続されてますが、今回使用したキャラクタLCDはここに可変抵抗器を入れないと、コントラストの関係で液晶に四角い塊が出力される状態になる(斜めから見るとギリギリ文字が読める)。可変抵抗器で分圧してやれば、コントラストの調節ができるようになり、無事文字が読めるようになりました。
また、Raspberry Piには電源スイッチがないので、電源ON/OFFのためのスイッチも追加しました。これでリセット時にACアダプタを抜き差しする必要がなくなった。
参考用ページにアルファベットを出力するための、Pythonのプログラムがあったが、日本語(半角カナ・記号)をLCDに出力するために少々書き換えました。GPIO用のモジュール:RPi.GPIO はeasy_installやpipで適当にインストールしてください。
Github:Raspberry-Pi-LCD-HD44780
このプログラムを使えば、日本語(ひらがな・カタカナ・一部記号)とアルファベットの混じった文字列ををunicodeで渡してやれば、いい感じに変換して出力してくれます。この記事TOPの画像は、このプログラムを動かしたときのものです。
実行する際の注意点として、このプログラムはroot権限で動かす必要があります(GPIO使う場合は必須なのか?)。
$ sudo python lcd.py
これで文字列を生成するPythonのプログラムから、自由にLCDへ出力できるようになりました。電源はRaspberry PiとLCDどちらもACアダプタからの入力で動作します。あと地味に電源スイッチが便利です。次はPythonで文字列を生成するプログラムを書いてこいつに乗っけます。
]]>以下簡単なハードウェア仕様のまとめ。
モデル | Model A | Model B | |
---|---|---|---|
価格 | $25 | $35 | |
CPU | ARM11 ARM1176JZF-S core | 同じ | |
メモリ | 256 MB | 512 MB | |
GPU | Broadcom VideoCore IV,OpenGL ES 2.0, OpenVG 1080p30 H.264 high-profile encode/decode | 同じ | |
ストレージ | SDメモリーカード / MMC / SDIO カードスロット | 同じ | |
USB2.0 | 1ポート | 2ポート | |
ビデオ出力 | コンポジット(RCA) / HDMI | 同じ | |
音声出力 | 3.5mmジャック / HDMI | 同じ | |
LAN | なし | 10/100M 有線Ethernet | |
その他インターフェイス | GPIO / SPI / UART | 同じ | |
電源 | 500 mA | 700 mA | |
電源ソース | 5V MicroUSB Type B or GPIO | 同じ | |
サイズ | 85.60 mm ×53.98mm | 同じ |
OSはDebian(wheezy)ベースのもの、Arch Linux、RISC OSなどが動きます。ダウンロードはここから。
ここで購入しました。私が入手した際は1ヶ月以上待ちましたが、今はどうなってるのやら。
書き込み作業の際、ディスクの指定を誤るとシステムデータが飛ぶ可能性があるので、気をつけてください。
インストールするOSのイメージを上記のページからダウンロードしておきます。今回はDebianベースのRaspbian “wheezy”(2012-12-16-wheezy-raspbian.zip) を利用しました。~/Downloads/
(デフォルトのダウンロードフォルダ)に保存しておきます。
OSをインストールするためのSDカードを用意します。OS自体は2GB程度なので、最低4GB程度の容量があれば大丈夫ですが、色々とソフトをインストールする場合を考えると、8GB程度あれば問題ないと思います。インストールの際、カード内の全データが消去されます。
今回はMacOSXで作業しました。Unix系のOSならおそらくほぼ同じ方法でできるはず。最初にSDカードのデバイス名を調べます。SDカードを接続する前に、以下のコマンドを実行します。
$ df -h
次にSDカード接続後に同じコマンドを実行します。私の環境の場合、SDカード名は/dev/disk1s1
になっていました。次にSDカードをアンマウントします。
$ umount /dev/disk1s1
ダウンロードしたOSのイメージがあるところへ移動し、ddコマンドを実行。この際、デバイスの指定は/dev/disk1s1
=> /dev/rdisk1
のようにrawデバイスを指定します。
$ cd ~/Downloads
$ dd sudo time dd bs=1m if=2012-12-16-wheezy-raspbian.img of=/dev/rdisk1
これでOSの入ったSDカードの準備ができた。
Raspberry Piに先ほど準備したSDカード、モニタ、キーボード、LAN、その他デバイスを接続し、USBポートまたはGPIOから電源を供給して起動します。電源供給と同時に起動するので、電源の接続は最後にしてください
初回のみ、設定画面が表示されます。項目は以下の通りです。
・info
このツールの情報の確認。スルーして問題なし。
・expand_rootfs
デフォルトではSDカードのうち2GB程度しか使用していません。
全領域を使用するようにここで設定出来ます。設定後、要再起動。
・overscan
テレビに出力する場合、画面周囲がきちんと表示されない場合があります。
その際、ここで周囲に余白を設定することで、正常に表示できるようになります。
・configure_keyboard
キーボードの配列の設定。
日本語配列、US配列、使用しているキーボードに合わせて設定。
・change_pass
デフォルトのユーザである’pi’ ユーザのパスワードの変更。
自分のパスワードに変更しておくべき。
・change_locale
ロケールの設定。
日本語フォントが入っていないので、UTF-8に設定しても日本語は文字化けする。
とりあえずデフォルトのままで問題ない。
・change_timezone
時間の設定。日本は”Asia”の”Tokyo”を指定すればよい。
・memory_split
GPUどれだけメモリを割り当てるか。通常はデフォルトのままで問題ない。
・ssh
sshを利用してリモートログインする場合”Enable”を指定。
設定しておけば別マシンから開発できる。
・boot_behaviour
”Yes”を選択すれば、最初からGUIな画面で起動する。
CUIで起動して、startxするのが面倒くさいなら”Yes”に。
・update
この設定用ツール raspi-config のアップデート。
これで最低限の設定は終わりです。もし、再設定したいならコンソールから
$ sudo raspi-config
を実行することで、いつでも再設定出来ます。
私が買ったのは$35のモデルです。
想像以上に高性能です。コンソールから使う分には特に不満なし。
軽い開発なら実機のみでそれなりにできそう。
低消費電力なのでサーバー用途に良さそう。
GPIO / オーディオ出力 などいろいろ遊べそう。
なかなか遊びがいのあるおもちゃですね。
libsvmはChih-Chung Changさん・Chih-Jen Linさんが開発したSVMのライブラリです。様々なSVMタイプ・カーネル関数、また細かくオプションも指定できるので、SVMを使う必要がある場合は、とりあえずこれを選んでおけば困ることは少ないと思います。
$ brew search libsvm
libsvm
brewにあった。ラッキー。
$ brew install libsvm
本体のインストール完了。
$ svm-train
Usage: svm-train [options] training_set_file [model_file]
options:
-s svm_type : set type of SVM (default 0)
0 -- C-SVC (multi-class classification)
...
動いた。がこれだとPython用バインディングがインストールできなかった。残念。
無いなら、pipで公式のバインディングをインストールするためのsetup.pyを自分で書いてしまえばいいじゃない。てな訳で書いた奴をgithubに上げといた(libsvm-python)。 問題はsetup.py書いたのが初めてなので、これであってるのかどうか自信がない。とりあえず以下のコマンドでインストールできます。
$ pip install -e git+https://github.com/Salinger/libsvm-python.git#egg=libsvm-python
テスト用のコード。
そして実行。
$ python libsvm_test.py
.*.*
optimization finished, #iter = 9
nu = 0.298326
obj = -0.596685, rho = 3.000257
nSV = 3, nBSV = 0
Total nSV = 3
Accuracy = 75% (3/4) (classification)
[Result]
[-1.0, 1.0, -1.0, -1.0]
(75.0, 1.0, 0.3333333333333333)
[[-1.3527684585781998], [3.038557720585867], [-1.9331234989121904], [-2.4115929900464406]]
問題なく動くのを確認できた。自分で書いたsetup.pyもとりあえず問題ないっぽい?
]]>普段はNormalという環境を作って、これを使うことにする。
$ mkvirtualenv Normal
$ brew search mecab
mecab mecab-ipadic
Homebrewにあった。
$ brew install mecab mecab-ipadic
$ mecab
これでこの時点の最新版である0.994とIPA辞書がインストールできた。動作確認。
$ mecab
すもももももももものうち
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
Ctrl + c で終了。 文字コード周りのトラブルも特になし。
MacPortsのときはPythonバインディングもまとめてインストールできたが、Homebrewには無いっぽい。まあvirtualenvで作った環境にインストールするには結局自分で入れなきゃならないらしいので、普通にインストールすることにする。インストール先のvirtualenv環境のまま作業続行。
$ cd ~/Downloads/
$ curl -O http://mecab.googlecode.com/files/mecab-python-0.994.tar.gz # 同じバージョンのものをダウンロード
$ pip install mecab-python-0.994.tar.gz # tar.gz のままインストールできる。
動作確認を行う。
サンプルコード
実行。
$ python mecab_test.py
BOS/EOS,*,*,*,*,*,*,*,*
それ 名詞,代名詞,一般,*,*,*,それ,ソレ,ソレ
サバンナ 名詞,一般,*,*,*,*,サバンナ,サバンナ,サバンナ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
も 助詞,係助詞,*,*,*,*,も,モ,モ
同じ 連体詞,*,*,*,*,*,同じ,オナジ,オナジ
事 名詞,非自立,一般,*,*,*,事,コト,コト
言え 動詞,自立,*,*,一段,未然形,言える,イエ,イエ
ん 助動詞,*,*,*,不変化型,基本形,ん,ン,ン
の 助詞,終助詞,*,*,*,*,の,ノ,ノ
? 記号,一般,*,*,*,*,?,?,?
BOS/EOS,*,*,*,*,*,*,*,*
動いた。
今回はgistで書いたコードをブログに貼ってみたけど、
{% gist 4555097 %}
の1行で長いコードを見やすい形式で貼れるのってかなり便利だ。 Github + Octopress 快適すぎる。
]]>必要な物をHomebrewでインストール。
$ python -V
Python 2.7.2 # Macに標準で入ってるPython
$ brew install readline sqlite gdbm
$ brew install python --universal --framework
$ python -V
Python 2.7.2
あれっ?変化なし? bashだとPathは問題なく2.7.3が起動したけど、普段使ってるtmux + zshだと2.7.2が起動した。.zshrcに以下のようにPathの記述をする必要あり。
export PATH=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:${PATH}
.zshrcの再読み込み
$ source .zshrc
$ python -V
Python 2.7.3
これでPython2系最新版のインストールはOK。
$ which pip # インストール先の確認
/usr/local/bin/pip # Homebrewでインストールした先になっているのを確認
$ pip install virtualenv
$ pip install virtualenvwrapper
$ mkdir ~/.virtualenvs
.zshrcに
#virtualenv settings
export WORKON_HOME=$HOME/.virtualenvs
. /usr/local/share/python/virtualenvwrapper.sh
を記述。
$ source .zshrc # リロード
virtualenvが見えない…
.zshrcに
export PATH=/usr/local/share/python:${PATH}
を追記。
$ source .zshrc
問題解決。
$ pip freeze # 現在のモジュールの確認 (virtualenvなど)
$ mkvirtualenv test1 # test1という環境を作成
$ deactivate #環境から抜ける
$ mkvirtualenv test2 # test2という環境を作成
$ workon # 環境の一覧を確認
test1
test2
$ workon test1 # testを選択
$ pip install numpy # test1 にnumpyをインストール
$ pip freeze # nuupyのインストールを確認
$ deactivate
$ pip freeze # 元の環境に影響がないのを確認
$ rmvirtualenv test1 # テスト環境を削除
$ rmvirtualenv test2
$ workon # 出力なし 削除完了
動作確認完了。モジュールの切り替えが非常に楽なので、今後の開発が捗りそう。
この記事を書こうとして、
$ rake new_post["2"]
を実行したら、
$ zsh: no matches found: new_post["2"]
というエラーが。何故だ?しかし、
$ rake new_post
$ Enter a post title:2
作成できたぞ?今回Pathを弄ったのが原因か?
この辺の動作がよくわからんので。また確認しとかないと。
.zshrcに
alias rake="noglob rake"
を追記したらエラー消えました。ありがとうございます > shogo82148 。
]]>以下のコマンドを実行。
$ ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
$ brew doctor
gitのインストール。
$ brew install git
Homebrewのアップデート。
$ brew update
/usr/local/sbin
の作成。
$ mkdir /usr/local/sbin
Pathを設定するため/etc/paths
の編集。
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
となっているのを、
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/usr/local/sbin
/sbin
と変更。これでHomebrewでインストールした方が優先される。 ターミナルを再起動してとりあえずの設定は終わり。
とりあえずこのブログを編集するためのRuby環境構築。
$ brew install ruby
$ gem install bundler
このBlogのデータをgit clone
で作業用ディレクトリに持ってきて、そのディレクトに移動。そこで、
$ bundle install
を実行しようとしたら、bundleコマンドが見当たらないぞ?次のコマンドを実行すれば良かった。
$ brew unlink ruby
$ brew link ruby
こんな感じでBlogを更新するための環境の再構築はとりあえず終了。MacPortsの時に面倒だったRubyとGemのバージョン指定周りも特に気にする必要はなかった。早くPythonの環境も整えないと。
]]>PC: MacBook Air, Core i5 1.7GHz, Mem 4GB
OS: OS X 10.8.2
XCode: 4.5.2
1.9.3が入ってればいいらしいので、MacPortsを使ってインストール。
$ sudo port install ruby19 +nosuffix
bundle のインストール (とりあえずgem1.9を使えば問題はなかった。gem だと標準でインストールされている1.8系にインストールされるのか?試していないので分からないが)。
$ sudo gem1.9 install bundle
$ cd ~/Downloads/
$ git clone https://github.com/imathis/octopress.git
$ cd octopress
$ bundle install
$ rake install
Github Pagesを利用するために、username.github.com というような名前でリポジトリを作成。ここで私の場合はsalinger.github.comという名前で作成した。→のGithub Reposに見えてるかな?
$ rake setup_github_pages
ここでgit@github.com:Salinger/salinger.github.com.git を入力。
$ rake generate
$ rake deploy
この2行をまとめて実行する場合には
$ rake gen_deploy
で可能。
$ git add . && git commit -m "Initial commit"
$ git push
ここを見ながら_config.ymlを弄って初期設定。Github,Twitterとの連携も簡単にできる。
$ rake new_post["1"]
sourse/_posts/以下に新しい記事のテンプレートが作成される。 Wikipedia:Markdown を見ながら、テストがてらこの記事を作成してみた。 なおデプロイする前に
$ rake generate
$ rake preview
を実行すると、http://localhost:4000でプレビューが見れる。
$ rake deploy
$ git add . && git commit -m "Create octopress install page."
$ git push
記事にコメント欄を追加するには、Disqusに登録しなければならないっぽいので登録した。このページを見つつ_config.ymlに設定を記述した。
ここを参考にしました。source/_includes/custom/asides/about.html
を編集(中身はただのHTML)。サイドバーの表示設定を変更するために_config.ymlを編集。
default_asides: [...]
の中の任意の位置にcustom/asides/about.htmlを追加する。genereteしてdeployすればプロフィールがサイドバーに表示されるはず。
ちょこちょこ弄ってみた感想ですが、
1. Githubとの連携が良い感じ。
2. Markdown記法なかなか書きやすい。普段使ってるEmacsで書けるのはありがたい。
3. 2とも関連するが、作業中にエディタ内でシームレスに書けるのは非常に楽。
静的なページでいいなら、レンタルサーバ借りるよりもこっちの方がいいかも。