第20回山陰ITPro勉強会に行ってきました

「Webからのデータ抽出自由自在」

簡単にまとめると、『サーバーの事を思いやりつつ、スクリプトで欲しい情報を抜き出しましょう!』ですかね?
Webスクレイピングとかでググると色々出ると思いますよ!

正規表現で抜き出す

今回はRubyを用いて抜き出すという事で、最初は某庁の気象警報等を教えてくれるページをローカルに保存し、正規表現で欲しいところを引っ掛けるという事をしていました。
該当ページはスクレイピング禁止と書いてあったので、ローカルに保存して使いました。


開発の準備段階として正規表現の肩ならしサイトを紹介されていたのですが、割と面白かったです(^ω^
Beginner辺りで早くも解くペースが落ちましたw
普段、正規表現でごりごりする事がなかったもので・・・皆様も挑戦してみてください!!
Regex Cross­word


話を戻して、警報のスクレイピングです。
警報があった場合は、growlで通知するという部分を作っていたのですが、意外とgrowlのインストールに時間がかかった様子。
知らなかったですけど、growlって有料なんですね。なぜかmacだと最初から入っているものだと思ってました!!
僕はというと、growlをインストールするのも何か気が進まなかったので、macrubyをインストールして、『とりあえずtextViewに表示するか〜。きっとその後、notificationCenterっぽいやつに投げれば良いんだろ〜?』と思いながら開発していたのですが、なぜかtextViewのアウトレットが貼れずに敗退・・・。
ログには抽出結果が出せていたので、後は表示だけだったんだけどな〜・・・。
今度また頑張りますw

次はHTML等を解析するライブラリを使って抜き出す

例としてnokogiriを使って挑戦してみました。
やはりライブラリを使うと楽ですね〜。
同じ事を正規表現でやっていた時は、トライ&エラーで時間もかかったのに、nokogiriさんを使うと、一瞬で目標達成。
nokogiriの癖に切れ味が良い(=w=;
余った時間は、ニコニコ動画のランキングでよく観るのだけ抽出するかな〜と作っていたのですが、タイムアップw
僕、開発速度遅いw


ログインとか必要なサイトだとmechanizeを使ったり、javascript等からDOMを弄られるサイトだったらseleniumとかを使ったりするよ〜という話でした。


昔、鳥取の勉強会でもcapybaraでニコニコ動画の新規投稿を取得するとか話されてたのを思い出しました。
僕も何かを取得するの作ろうかな〜。

その他

次回のSITWは、9/28だそうです。
あと、LT大会&大掃除が12/14(?)に計画されているそうです。
イクゾー!(^q^

まとめ

よくやるルーティンワークがあるのなら、それをスクリプトでやりましょうね!って事なんだと思います!
今回もありがとうございました!
夏休み明けのボケた頭には良い感じでした!
また遊びに行きまーす^q^

山陰ITPro勉強会 番外編#04に行ってきました

「エンジニアのための情報セキュリティの考え方」
〜最新の技術に対応できるセキュリティの地頭づくり〜

一言でまとめると、「数値化した価値に応じたセキュリティ対策を!」でしたかね。


エンジニアなのに、『なんかヤバいので、対策します』というのは辞めましょう的な。
『もし、○○の脆弱性があると、○○が発生して、1人辺り○○円の補償があるので、結果○○円の損失が発生するかもしれません』と数値化してから、考えましょうねと。

はい。費用対効果は大事だと思います。
以下のケースでも"費用対効果の壁が〜"とありましたもんね。


また犯罪には、動機、手段、機会があるので、それぞれを推測する事で、対策を考える事が出来ますよと。
この辺は開発する時に使うペルソナみたいな手法と似てますね。
実際に使う人がどんな人で、どうするか〜を妄想するみたいな。


よく言われる『相手の気持ちになって考えよう』ってやつですね。
「なぜホームページを改ざんするの?」とか。
皆でわいわい「どうするかな?」「この情報から芋づる出来ないかな?」と妄想した後に、「じゃあ、どう対策するの?」「いつやるの?」としていくと。


誰かには「敵の姿を勝手に想像するな」とか言われるかもしれませんが(笑


確かに100円の物を盗むのに1万円かけてもやるっていうのは酔狂ですもんね。
動機にはなりづらい。

そういう意味では、RICOHさんが出していたこういうのは挑戦状的で動機になるかもしれないんですかね?
http://www.ricoh.co.jp/info/130604.html
と、思いましたが、”適切な設定のもとで”ですね。


他にも、「実際に誰が攻撃するの?」とか面白いですね。
推測しにくいパスワードは、主に人間が入力する場合の対策で、時間稼ぎをするのは、プログラムが入力する場合の対策とか。
「IDとパスワードを入力する部分がたくさんあったら、攻撃者もやる気を失くすんじゃない?」というのは良いですね(笑


あとは、最近の事故で話題になった変な件。
やっぱり、誰もが変だと思う部分には理由がありますね。
理由を聞いてから、再度考えると、『ぁ”ー・・・』みたいになりますもんね。
苦肉の策っぽい雰囲気が伝わってくる話でしたw


個人的には、韓国のお話が面白かったです。
『そんな事してるん?!』というようなセキュリティ対策でした。
他にも色々聞いてみたかったですねー。


とても面白い話が聞けて、講師の方も面白い人だったので、懇親会行けなくて残念だな〜と思いました。

6,7月にはchef、8月はハンズオン、9月はあの方を呼ぶみたいな事を言われていたので、その時こそは!!!(><

今回もありがとうございました!!


と、数年ぶりにだらだらと日記を書いたのでした!

見ている記事をツイートしたい

最近は、多くのサイトでtweetボタンがあるので、あまりそういう欲求はないのかもしれません。
個人的には、yahooのニュースを見ていて、全文表示をクリックした画面でtweetボタンがないので、そこに欲しいなぁと思っていました。

ボタンがないために、毎回、URLをコピペして、タイトルをコピペして、コメントを追加して、つぶやく・・・という事をしており、面倒だな、と。

で、chrome extensionsで作ってみるか〜!とゴリゴリとしていたのですが・・・。


ブックマークレットだと一瞬で作れるんじゃね?』


はい。そんな事実に気づいてしまい、試しに何も考えずにやってみました。

javascript:%20var%20url='http://twitter.com/home?status='+encodeURIComponent("%E3%80%80->%E3%80%80"+document.title+" "+location.href);window.open(url);

改行等を入れるとこう?

javascript:
 var url = 'http://twitter.com/home?status='
              + encodeURIComponent("%E3%80%80->%E3%80%80" + document.title
                                                      + " " + location.href
                                                    );
 window.open(url);

あとは適当にブクマしておけばOK.
・・・というわけで、欲しい機能は満たせてしまったとさ。。。orz
よろしければ、こうするともっと良いよ〜とかアドバイスくださいw

とりあえず、chrome extensionsのHello World等は分かりました(=w=;


P.S.
サイト設置用のツイートボタンって割と簡単に作れるんですね。
https://twitter.com/goodies/tweetbutton

windowsで育った僕のコタツの上に、MBPが来た日。

日記って、なかなか続けられないですね。
さて、タイトルの通り、MacBookProがおうちに来ましたー(>_<

人生、初のPCはWindowsXP
その後、ゲームばかりしていて、大学ではVineLinux, TurboLinux、卒業後はCentOS, Ubuntu, windowsXP等々だった僕には、戸惑いも多く、色々設定する事があるので、その辺りをメモします。

システム環境設定

  • トラックパッド設定
    • 軌跡の速さを最速に
      • マウスが遅くて死にそうな時はこちらをしてリログ
defaults write .GlobalPreferences com.apple.mouse.scaling -1
    • 1本指の操作でタップでクリックにチェック
    • 副ボタンのクリックにチェック
    • 右クリックしたいので
  • その他
    • セキュリティ設定
    • Dock
      • サイズを小さく
    • 言語とテキスト
      • 入力ソースのオプション
        • 書類ごとに異なるものを使用
    • キーボード
      • F1、F2などのすべてのキーを標準のファンクションキーとして使用にチェック
    • ことえり環境設定
      • windows風のキー操作にチェック
      • 数字を全角で入力のチェックを外す

google chrome, messenger, skype, echofonインストール

ical, mail設定

テキストエディットの環境設定

開く/保存の項目のファイルを開くときのエンコーディングを自動からUnicode(UTF-8)に変更する

テキストエンコーディング 日本語(Mac OS) には対応していません

って言われる事が僕の使い方だと多いから。ついでに保存時も同じ指定。

ターミナル

  • .vimrc
syntax on
    • vimで開いた時に単色で味気ないので色付けました。
  • .bash_profile
alias ls='ls -G'
    • lsした時に色を付けたかったので
  • 設定
    • シェル終了時:シェルが正常に終了した場合は閉じるに変更
    • あとは背景をスケスケにしておく

とりあえず、こんなところかな。
急いで書いたから何か漏れているかも。
あとは、xcode入れたら大体終わりかな〜?
初日はこんなところ〜。
他にもwindows出身者におすすめなものがあれば教えてください(^q^)ノ

追記:
23:56 指摘により誤字修正

yamlでアンカーにエイリアス

そういえば、Rubyがまだ1.9.1だったなーという事を思い出したのでアップデートをしてみた。
RubyWorldConference2010の中でYAMLのパーサーががsyckからpsyckに変わったらしいという事を聞きました。
syckの実装者が失踪してしまったからだとかなんとか。

昔、syckでハマった事がありますが、どうなったのかなー?

アンカーにエイリアス

  • 昔ハマったというのは、アンカーにエイリアスを貼って、GCを走らせるとエラーになる(rescueでも拾えない)というものです。
    • GCが走らない限りは、通常どおりつかえる。
    • 多分、サンプルコードを見た方が早いです。
ハマり方

アンカーにエイリアスを貼ります。

sample1:
  - &figure1
    arg1: "test1"
    arg2: "test2"
  - &figure2 *figure1
  • sample.rb
require 'yaml'

a = YAML.load_file("sample.yaml")
p a

puts "=== start ==="
GC.start
puts "=== end ==="
  • 実行
ionis@ubuntu:~/workspace$ ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]

ionis@ubuntu:~/workspace$ ruby sample.rb
{"sample1"=>[{"arg1"=>"test1", "arg2"=>"test2"}, {"arg1"=>"test1", "arg2"=>"test2"}]}
=== start ===
glibc detected *** ruby: double free or corruption (fasttop): 0x09e81d50 ***
======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x1a1591] /lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x1a2de8] /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x1a5ecd] /usr/local/lib/ruby/1.9.1/i686-linux/syck.so(syck_free_node+0x56)[0xe31cf6] /usr/local/lib/ruby/1.9.1/i686-linux/syck.so(syck_st_free_nodes+0x22)[0xe3e472] /usr/local/lib/libruby.so.1.9(st_foreach+0xb1)[0x3db951] /usr/local/lib/ruby/1.9.1/i686-linux/syck.so(syck_st_free+0x37)[0xe3e3f7] /usr/local/lib/ruby/1.9.1/i686-linux/syck.so(syck_free_parser+0x51)[0xe3ea21] /usr/local/lib/ruby/1.9.1/i686-linux/syck.so(rb_syck_free_parser+0x38)[0xe3c518] /usr/local/lib/libruby.so.1.9(rb_gc+0xc2)[0x339612] /usr/local/lib/libruby.so.1.9(rb_gc_start+0x17)[0x339797] /usr/local/lib/libruby.so.1.9(+0x16790d)[0x43190d] /usr/local/lib/libruby.so.1.9(+0x178277)[0x442277] /usr/local/lib/libruby.so.1.9(+0x16d253)[0x437253] /usr/local/lib/libruby.so.1.9(+0x172820)[0x43c820] /usr/local/lib/libruby.so.1.9(rb_iseq_eval_main+0x1e3)[0x43cc43] /usr/local/lib/libruby.so.1.9(+0x58a8a)[0x322a8a] /usr/local/lib/libruby.so.1.9(ruby_exec_node+0x25)[0x322ac5] /usr/local/lib/libruby.so.1.9(ruby_run_node+0x35)[0x3242d5] ruby(main+0x68)[0x80487d8] /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x14cbd6] ruby[0x80486d1]
実はGC.startがなくても、上記sample.rbの場合はこのエラーが出ますけどね。 このエラーは、GCが走る際に起きるっぽいです。 なので、以下のようなプログラムにすると、CTRL+Cを押すまで、特にエラーは出ないです。
  • sample2.rb
require 'yaml'

a = YAML.load_file("sample.yaml")

puts "=== start ==="
loop do
  print a['sample1'][1], " \r"
end
puts "=== end ==="
しかし、ここで、ふと気づく
/usr/local/lib/ruby/1.9.1/i686-linux/syck.so(syck_free_node+0x56)[0xe31cf6]
・・・もしかして、僕Ruby1.9.2のインストールに失敗してない?(=”=;; ま、まぁ、ruby1.8.6とかIronRuby1.0で発生するのは確認しているので、その辺を使っている方はお気をつけください。 ・・・「複数アンカーなんて作らないよ!」と言われれば、それまでなんですけどね! えぇ・・・私の書き方が悪いだけですよ!(凹 ちなみに、JRubyではこのエラーは出なかったはずです。 また、Ruby1.8.6とIronRubyでは表示される内容が微妙に違ったハズ・・・(ちょっと記憶が曖昧です。) なお、おそらくこのバグはこのチケットだと思われます。

VMwarePlayerにUbuntuを入れたりしたり。

Ubuntuが綺麗だというので、10系をVMwarePlayerに入れてみた。
今回の環境は以下

VMwarePlayer 3.0.1 build-227600
ubuntu-ja-10.04-desktop-i386-20100512 

ポチポチとしていって、ログイン画面までは行くが・・・なぜか、パスワードが入力できずログインが出来ない。。。
同じVMwarePlayerに入れていたCentOS5.4、Ubuntu8.04では起きていない現象なのでかなりハマる。

再起動したり、ゲームをしたり、ガンダムSEEDを見たりしたけど、直らない。
種もはじけないので、ググる先生に聞いたところ以下の記事を発見。

VMware Player でゲスト OS として Ubuntu 10.04 LTS Desktop をインストールしたらログイン画面でキーボード入力ができなかった問題
ほほぉ・・・。詳細は上記リンク先の記事にお任せするとしてざっくりと以下

  1. オンスクリーンキーボードON
  2. 再起動
  3. /etc/default/console-setupを編集
XKBMODEL="pc106"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS=""
    • (memo)日本語キーボードを使用しているのに英語キーボードの設定になっている場合、コロンはshift+セミコロンキー
      • 地味にviから抜け出せなくて、一瞬「あれ〜?(@q@」ってなってましたw

最後に、再起動して、オンスクリーンキーボードOFFにするだけ。

と上記リンク先のサイト様と同様の手順をしたらログイン出来るようになりました。
めでたしめでたし。

続きを読む

yaml

いわゆる、書き方が知りたい人はRubyistMagazine

複数行にわたるyamlの書き方

要するに改行を使いたい時。
少しはまったので。メモ。

hoge:
 - |- Proc.new {|params|
   puts params
   }
 - "Proc.new {|params| puts params}"

↑はOKな例。僕は↓を書いてハマった。

hoge:
 - |- "Proc.new {|params|
   puts params
   } "
 - "Proc.new{|params| puts params}"

何がダメかというと、文字列の扱いに気づいてない僕が問題w
これを文字列としてしか使わない場合は大体OKだろうけど、evalとかに使いたい場面で困る。
実際にダメな方でやってみる。

irb(main):026:0>a = YAML::load_file('test.yml') #上記ダメな方のyaml
=> {"hoge"=>["\"Proc.new {|params|puts params\n  } \"", "Proc.new{|params| puts
params}"]}
irb(main):027:0> (eval a['hoge'][0]).call("test")
NoMethodError: undefined method `call' for "Proc.new {|params|puts params\n  } "
:String
        from (irb):27
irb(main):028:0> (eval a['hoge'][1]).call("test")
test
=> nil
irb(main):029:0> exit

yamlではどうやら、どれにも確定しなかった場合に文字列として扱うらしい。

hoge:       #キー
 - hoge     #配列の要素文字列
 - "hoge"   #配列の要素文字列
 - 'hoge'   #配列の要素文字列
 - | "hoge" #バーチカルバーがあると、それは複数行にまたがる文字列である
            #事が確定するので、ダブルクォート込みで文字列になる
            #つまり読み込むと"\"hoge\""となる。
 - 1        #数値

他の複数行にまたがる表現の時も同じ。

言われてみれば納得だけど、気づかんよ。要らんとこでハマッぜ。。。

次回もyamlがらみでハマった話を書いてみます。おやすみなさい。