第20回山陰ITPro勉強会に行ってきました
「Webからのデータ抽出自由自在」
簡単にまとめると、『サーバーの事を思いやりつつ、スクリプトで欲しい情報を抜き出しましょう!』ですかね?
Webスクレイピングとかでググると色々出ると思いますよ!
正規表現で抜き出す
今回はRubyを用いて抜き出すという事で、最初は某庁の気象警報等を教えてくれるページをローカルに保存し、正規表現で欲しいところを引っ掛けるという事をしていました。
該当ページはスクレイピング禁止と書いてあったので、ローカルに保存して使いました。
開発の準備段階として正規表現の肩ならしサイトを紹介されていたのですが、割と面白かったです(^ω^
Beginner辺りで早くも解くペースが落ちましたw
普段、正規表現でごりごりする事がなかったもので・・・皆様も挑戦してみてください!!
Regex Crossword
話を戻して、警報のスクレイピングです。
警報があった場合は、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人辺り○○円の補償があるので、結果○○円の損失が発生するかもしれません』と数値化してから、考えましょうねと。
はい。費用対効果は大事だと思います。
以下のケースでも"費用対効果の壁が〜"とありましたもんね。
- 「山陰新幹線」へ55市町村進行 あす推進会議
また犯罪には、動機、手段、機会があるので、それぞれを推測する事で、対策を考える事が出来ますよと。
この辺は開発する時に使うペルソナみたいな手法と似てますね。
実際に使う人がどんな人で、どうするか〜を妄想するみたいな。
よく言われる『相手の気持ちになって考えよう』ってやつですね。
「なぜホームページを改ざんするの?」とか。
皆でわいわい「どうするかな?」「この情報から芋づる出来ないかな?」と妄想した後に、「じゃあ、どう対策するの?」「いつやるの?」としていくと。
誰かには「敵の姿を勝手に想像するな」とか言われるかもしれませんが(笑
確かに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
google chrome, messenger, skype, echofonインストール
- http://tools.google.com/chrome/intl/ja/welcome.html
- 最近乗り換えた
- テキストエリアが自由なのが地味に便利
- とりあえず、はてブとKeep My Opt-Outsを入れる
- ホームページをhttp://www.nicovideo.jp/rankingにする
- http://www.microsoft.com/japan/mac/messenger
- msn messengerというか、live messenger用
- http://www.skype.com/intl/ja/get-skype/on-your-computer/macosx/
- http://www.echofon.com/twitter/mac
- twitter用に
ical, mail設定
yamlでアンカーにエイリアス
そういえば、Rubyがまだ1.9.1だったなーという事を思い出したのでアップデートをしてみた。
RubyWorldConference2010の中でYAMLのパーサーががsyckからpsyckに変わったらしいという事を聞きました。
syckの実装者が失踪してしまったからだとかなんとか。
昔、syckでハマった事がありますが、どうなったのかなー?
アンカーにエイリアス
- 昔ハマったというのは、アンカーにエイリアスを貼って、GCを走らせるとエラーになる(rescueでも拾えない)というものです。
- GCが走らない限りは、通常どおりつかえる。
- 多分、サンプルコードを見た方が早いです。
ハマり方
アンカーにエイリアスを貼ります。
- sample.yaml
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 ===実はGC.startがなくても、上記sample.rbの場合はこのエラーが出ますけどね。 このエラーは、GCが走る際に起きるっぽいです。 なので、以下のようなプログラムにすると、CTRL+Cを押すまで、特にエラーは出ないです。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]
- 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 をインストールしたらログイン画面でキーボード入力ができなかった問題
ほほぉ・・・。詳細は上記リンク先の記事にお任せするとしてざっくりと以下
- オンスクリーンキーボードON
- 再起動
- /etc/default/console-setupを編集
XKBMODEL="pc106" XKBLAYOUT="jp" XKBVARIANT="" XKBOPTIONS=""
最後に、再起動して、オンスクリーンキーボード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がらみでハマった話を書いてみます。おやすみなさい。