2013年7月15日月曜日

「プログラミング入門 - Rubyを使って -」をやってみた その1

Rubyの勉強に下記サイトの練習問題に挑戦します。1章はirbを使ってます。
プログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyama

1.数(Numaber)

  • 1年は何時間でしょうか?
    うるう年ではないとします。
>> 24*365
=> 8760
  • 10年間は何分でしょうか?
    うるう年が2回ありますので、計算に含めます。
>> 60*24*(365*10+10/4)
=> 5258880
  • あなたが生まれてから今日まで何秒たっているでしょうか?
>> (Time.now - Time.local(1973,12,3,0,0,0)).to_i
=> 1250124789
  • あなたは一生のうちいくつのチョコレートを食べたいですか?
    1週間に1つのチョコを食べるとします。
>> (80*365)/7
=> 4171
  • 私が生まれてから10億3400万秒 たっているとしたら、私は今何歳でしょう
>> 1034000000/(60*60*24*365)
=> 32

4.数と文字列の変換

  • 最初に姓、次に名前を聞いて、最後にフルネームに対してあいさつを するようなプログラムを書いてみましょう。
pochi-2:Test snumano$ cat 4-1.rb
#!/usr/bin/ruby

puts 'こんにちは。あなたの姓を入力してください'
last = gets.chomp

puts '次は、あなたの名を入力してください'
first = gets.chomp

puts 'あなたの名前は' + first + ' ' + last + 'ですね。'

pochi-2:Test snumano$ ./4-1.rb
こんにちは。あなたの姓を入力してください
Numano
次は、あなたの名を入力してください
Shugo
あなたの名前はShugo Numanoですね。
  • 好きな数を入力してもらい、それに1を加えて、その結果を ベターな 数字として薦めるプログラムを書きましょう。
  •  
pochi-2:Test snumano$ cat 4-1.rb
#!/usr/bin/ruby

puts 'こんにちは。あなたの姓を入力してください'
last = gets.chomp

puts '次は、あなたの名を入力してください'
first = gets.chomp

puts 'あなたの名前は' + first + ' ' + last + 'ですね。'

pochi-2:Test snumano$ ./4-1.rb
こんにちは。あなたの姓を入力してください
Numano
次は、あなたの名を入力してください
Shugo
あなたの名前はShugo Numanoですね。

5.メソッド(method)

  • 「怒ったボス」のプログラム
pochi-2:Test snumano$ cat 5-1.rb
#!/usr/bin/ruby

$KCODE = 'UTF-8'

puts '望みは何だ?'
hope = gets.chomp

if hope =~ /給料上げてください/ then
  puts 'なにぃ? "給料上げてください" だとー!! おまえは首だ!! '
else
  puts 'なにぃ?' + hope + 'だとー!!お前は首だ!!'
end
pochi-2:Test snumano$ ./5-1.rb
望みは何だ?
休みたい
なにぃ?休みたいだとー!!お前は首だ!!
pochi-2:Test snumano$ ./5-1.rb
望みは何だ?
給料上げてください
なにぃ? "給料上げてください" だとー!! おまえは首だ!! 
  • 「目次」を表示する プログラム
pochi-2:Test snumano$ cat 5-2.rb
#!/usr/bin/ruby

$KCODE = 'UTF-8'

lineWidth = 20
lineWidth2 = 10

index = '目次'
chap1 = '1章:  数'
chap1Page = 'p. 1'
chap2 = '2章:  文字'
chap2Page = 'p. 72'
chap3 = '3章:  変数'
chap3Page = 'p. 118'

puts index.center(lineWidth)
puts chap1.ljust(lineWidth) + chap1Page.center(lineWidth2) 
puts chap2.ljust(lineWidth) + chap2Page.center(lineWidth2) 
puts chap3.ljust(lineWidth) + chap3Page.center(lineWidth2) 
pochi-2:Test snumano$ ./5-2.rb
       目次       
1章:  数             p. 1   
2章:  文字         p. 72   
3章:  変数         p. 118  
今回はここまで。6章以降は後日。。。
このエントリーをはてなブックマークに追加

2013年7月14日日曜日

rbenv install時に、.bashrcと.bash_profile動作の違いでつまずいた

MacOSXにて、複数versionのrubyを切り替えるツールとしてrvmを使っていましたが、rbenvに切り替える事にしました。
rbenv installの際つまずいたのですが、原因は「.bashrcと.bash_profileの動作の違いを理解していなかった」事でした。


詳細は下記の通りです。

  • 下記ブログを参考にさせていただきました
    Mountain Lion に rbenv を導入 - :soy_milk:
  • 上記ブログを参考に対応した場合、対応直後が正常にruby versionの切り替え実施できるのですが、MacBook再起動すると「rbenv globalコマンドでrubyのバージョンを変更しても、実際には変更できない」事象が発生しました。しかも、最初再起動時に発生した事に気づかず、「がちゃがちゃ設定をいじっている間に、rbenvの動作がおかしくなった」と思っていたため、原因の特定に時間がかかりました。
pochi-2:~ snumano$ rbenv versions
  system
* 1.9.3-p327 (set by /Users/snumano/.rbenv/version)
  2.0.0-p247
pochi-2:~ snumano$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]
pochi-2:~ snumano$ rbenv global 1.9.3-p327
pochi-2:~ snumano$ rbenv versions
  system
* 1.9.3-p327 (set by /Users/snumano/.rbenv/version)
  2.0.0-p247
pochi-2:~ snumano$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]

  • 対応は下記どちらかを実施します。
    • 「.bashrc」の代わりに「.bash_profile」を指定する
    • もしくは、「.bash_profile」の最後に下記設定を加えておく。
source ~/.bashrc

  • 理由は下記の通り。今回の発生した事象は、後者になります。
    • .bashrcはbash起動時に読み込まれる
    • .bash_profileはログインシェルとして起動された時に読み込まれる   

久しぶりにshellの設定を触ったので、という言い訳で。。。

参考:
rbenvでRubyを複数バージョンインストールする
http://www.proton.jp/main/apps/bash.html
http://stackoverflow.com/questions/10940736/rbenv-not-changing-ruby-version
http://stackoverflow.com/questions/7780030/how-to-fix-terminal-not-loading-bashrc-on-os-x-lion

このエントリーをはてなブックマークに追加

2013年6月24日月曜日

vagrant box addコマンドを実行すると、"Failed to untar the box file..."エラーメッセージが表示されOSイメージをダウンロードできない

原因ははっきり分かっていないが、正常にダウンロードできたので、備忘録。

環境は下記。
host:MacOS10.8
ruby:1.9.3p429
vagrant:1.0.7

事象は下記の通り。

  • ホームディレクトリ意外の適当なディレクトリで、vagrant box addコマンドを実行したところ、ダウンロード後のuntarに失敗した旨のメッセージが表示される。
pochi:Vagrant snumano$ vagrant box add base http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
[vagrant] Downloading with Vagrant::Downloaders::HTTP...
[vagrant] Downloading box: http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
[vagrant] Extracting box...
[vagrant] Cleaning up downloaded box...
Failed to untar the box file. This is usually because you're
attempting to add a box that isn't a valid box file. Please
double check that the box file is properly packaged.

  •  ~/.vagrant.d以下のtmp, boxesディレクトリには何もファイルなし。
  • こちらには、環境変数HOMEを上書きするのがいやなら、VAGRANT_HOMEを使うようにとのコメントあり。
  • vagrantのソースを見るが、環境変数HOMEをどのように設定しているか分からない。(単なるスキル不足。。。)

とりあえず、ホームディレクトリで再度、vagrant box addを実行してみると、、、
  • ~/.vagrant.d/tmp/に、OSイメージがdownloadされる事を確認できるようになった。で、download成功。
pochi:~ snumano$ vagrant box add base http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box
[vagrant] Downloading with Vagrant::Downloaders::HTTP...
[vagrant] Downloading box: http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box
[vagrant] Extracting box...
[vagrant] Verifying box...
[vagrant] Cleaning up downloaded box...

  •  ~/.vagrant.d/boxes/に各種ファイルが作成された。

pochi:.vagrant.d snumano$ pwd
/Users/snumano/.vagrant.d
pochi:.vagrant.d snumano$ tree
.
├── boxes
│   └── base
│       ├── Vagrantfile
│       ├── box-disk1.vmdk
│       └── box.ovf
├── gems
├── insecure_private_key
└── tmp
4 directories, 4 files

根本原因は不明のままだが、とりあえず先に進む事とする。

(2013.6.24 追記)
gem installでvagrantをinstallした場合、上述の通りver1.0.7だが、こちらのサイトでは最新は1.2.2であった。MacOS用のバイナリをinstallして様子見している。
このエントリーをはてなブックマークに追加

2013年6月23日日曜日

Mac(10.8)からLinkStation(LS-WXL)へ接続できない場合の対処

先日入手したMacBookAir(MacOS 10.8)でTimeMachineの設定する際に、手間取ったのでメモ。
先に結論を言うと、「ファームウェアのバージョンアップは大事」という事でした。

Mac(10.8)からLinkStationへ接続できない場合の対処

環境は下記の通り。
  • 旧MacBook(MacOS 10.7)
  • 新MacBookAir(MacOS 10.8)
  • LinkStation(型番:LS-WXL、ファームウェア:ver1.22)

新MBAからLinkStationにafpおよびsmbの両方とも接続できない。login画面は表示されるが、ID,PWを入力すると認証に失敗し、下記のような画面が表示される。
旧MacBookからは、同じLinkStationに問題なく接続できていたのに。。。

検索してもずばりの回答がないので、まずはLinkStationのファームのバージョンを調べてみた。手元のLinkStationで動いているバージョンは1.22。最新のバージョンは1.65
しかも、リリースノートをみると、1.52から1.54にかけて、AFP接続やTimeMachine関係の修正がされているようだ。
早速1.65のアップデータをDLして、アップデートするもうまく適用できない(どのような状況だったかは、画像が残っていないので省略)。。。
段階的にアップデートしようと、他のアップデータを探すも1.60のアップデータぐらいしか見つからない。。。

仕方ないので、1.60を当ててみたら、LInkStationの検索およびアップデート適用までうまくいった。しかし、その後自動でLInkStationが再起動がされ100秒程で起動してくるはずが、100秒経過後、再び、再起動を繰り返しさらに100秒待てというメーッセージが繰り返し表示される事象が発生。
LinkStation本体をみてみると、POWERランプが青色点滅している。実際に起動を繰り返しているようだ。
とりあえず1.65のアップデータを起動し、LinkStationの検索を実行すると、
やはりLinkStationを検索しても見つけてくれない。再起動を繰り返しているので、当然だ。

あきらめて10分程放っておいたら、いつの間にかLinkStationが見つかっていた。
すかさず、そのまま1.65にアップデートを実行。
(結局、なぜ再起動を繰り返していたのかは不明。1.60を適用から15分程度で、LinkStationが安定したようだ)
そして1.65にアップデート完了、今度は繰り返し、再起動中のメッセージが表示されることもない。
しかし、、、アップデータ、LinkNabigatorでLinkStationを検索するも見つからない。pingするも返答なし。本体のLEDを確認すると、POWERランプは青色点灯するも、その下のINFO/ERRORランプが点滅している。

さっきと同様に、これもしばらく放っておいて他の事をしていたら、30分程度でping応答が返ってくるようになっていた。
(あとで、こちらで気づいたが何らかの処理が実行されてたらしい。)

以上で、LinkStationのファームウェア1.22から1.65にバージョンアップ完了。
その後、新MBAからLinkStationへAFP,SMB接続できるようになり、本来の目的であった、TimeMachineへの接続もできるようなった。
(LinkStationでTimeMachineできるようにする設定はいろいろあるようだが、対応している機器であれば、こちらの手順が一番簡単だと思う。自分もこの手順と同じ設定を実施した)

これで、日々のバックアップはTimeMachineに任せる事ができた。
さらに、他の機器と共有したいファイルはSugarSyncを利用する事にした。
このエントリーをはてなブックマークに追加

2013年5月19日日曜日

Scratch1.4(相当)とArduinoと光センサーで、かめはめ波測定器(仮)を作ってみた

先日、Qiitaに投稿したようにArduinoと光センサーでアナログ値を入力として得られることを確認しました。
しかし、これを見た子供の反応は薄く、3秒程度で、やっていた3DSに視線を戻していきました。「子供に電子回路の関心を持たせるにはどうしたらいいか」を考え、子ども達が触っているScratchを組み合わせる事にしました。

準備
  1. 回路
    回路に関して準備したものと、回路図はこちらと同じです。
  2. ScratchとArduinoを連携する環境(S4A)の導入
    こちらのInstallationの1-3を実行します。
    1はArduinoの開発環境ですので、Arduinoを触ってる人は、既にinstall済のはずです。
    2は、local PCの適当な場所に保存し、1のArduino開発環境でコンパイルおよびArduinoへの転送を実施します。
    3については、自分の使用しているOSのものを選択し、installします。私はMac版をinstallしました。下記の「S4A」をクリックしてアプリを起動します。


    起動後の画面は下記の通りです。Scratch1.4とほぼ同じような画面です。右側のArduinoの絵(スプライト)とAnarogx6,Digitalx2の入力値が表示されます。(まだ何も入力されていないので、適当な値が表示されています)

  3. Scratch(実際はS4A)にてプロジェクト(アプリ)の作成
    下記のような感じでブロックを並べてみました。(S4Aに含まれるブロックは、Scratchのサイト上で公開できないので、現時点では下記画像でご勘弁ください。Scratch2.0では2013年夏頃に、外部デバイス操作機能が追加予定なので、そうなれば、下記のようなアプリを公開する事ができるようになります)
    「value of Analog0」で光センサーの値を取得しています。Analog0の値の変化を読み取り、良いタイミングで期待する値になった場合に、「成功」の判定をしています。

  4. かめはめ波測定器(仮)を実行する
    実際に実行してみましょう。以後はScratchの操作方法と同じです。
    画面右上の緑の丸をクリックします。すると「かーめーはーめー」とArduinoの絵がしゃべりはじめます。(この辺りは、それっぽい絵を用意すればいいのですが、著作権の問題もあるので、横着してArduinoの絵のままとしています。w)


    「波ーーー!!」のタイミングで、光センサーに対して、かめはめ波を発射してください。(本当は、手で光センサーを隠すようにすればいいです。。。)


    タイミングとかめはめ波の勢いがあえば「成功」と表示されます。下記の例では発射タイミングが遅く失敗となってます。


以上、簡単ですが、Scratch1.4(S4A)とArduinoと光センサーを組み合わせて、センサーから取得したアナログ値をScratch上に表示する事を試してみました。
当初の目的であった「子供に電子回路に関心を持たせる。(少なくとも3秒以上の関心を引く)」については、1分程いろいろ触っていたので成功とします。

Scratch2.0では、同等の外部デバイスとの連携機能は2013年夏にリリース予定との事なので、リリースされたら、本アプリをScratchサイトにて公開したと思っています。
このエントリーをはてなブックマークに追加

2013年5月3日金曜日

Arduino x Ruby x 光センサーで電子回路作り

最近Arduinoを入手し、どのような使い方ができるか模索しています。
まずはセンサーで値を取得するところから始めたいと思います。
センサーも温度、湿度、気圧、光センサーなど様々なものがあります。こんな感じ。

今回は光センサーを使います。手を近づけると値が変わるので、手の動きで操作をする。なんて事が安価にできそうです。
今回はQiitaに投稿してみましたので、こちらをご覧下さい。


今後も、センサーとネットを使って名にができるのか、試してみたいと思います。

このエントリーをはてなブックマークに追加

2013年5月2日木曜日

なぜRubyを使っているか?

最近Rubyを使う事が少しずつ増えていますが、「なぜRubyなのか?」mindmapでまとめてみました。
結論としては「気になるツール、技術要素、トピックにアプローチするのに都合がいいから」となりました。

用途によって適切な言語を選択するのがいいのでしょうが、学習コストも高いので現実的ではありません。そういった意味でRubyは幅広い用途で利用シーンがあり、とても重宝しています。

今後はPerlは仕事でのみ利用となり、JavaScriptはiPhoneアプリ開発(TitaniumMobile)やnode.js等で利用が増えてくるのではないかと思ってます。


Make your own mind maps with Mindomo.
このエントリーをはてなブックマークに追加