7rpn’s blog: うわああああな日常

好きなことをつらつらと。AIとかで面白いことをしたい。

Pythonで文脈自由文法

大学院の課題で"文脈自由文法による構文解析を実装せよ. プログラミング言語は問わない"って課題が出されました。

超簡単だったけれど,日本語のドキュメントないっぽいのでメモ。
来年も同じ課題が出て,検索をかけた人用に書き残しておきます。笑

いわゆる文理融合の新しい分野()を学ぶ研究科の,文系の授業の最終課題のひとつとして出たものです。 選択課題の一つで,レポートの課題もあったのですが,レポートを書くって非生産的であまり好きではないので。
そういうわけで,構文解析を実装してみました。 pip install nltkして,以下を実行するだけ。超楽。

分析器には,"I thought about your smile in tears."って文章を突っ込みました。 恋人と別れたばかりでちょっとセンチな言葉を選びたかったり。笑

import nltk
#Copyright (C) 2001-2015 NLTK Project.

phrase = ['I','thought','about','your','smile','in','tears']

parser = nltk.CFG.fromstring("""
S -> NP VP
PP -> P NP
NP -> Det N | Det N PP | N | N PP |
VP -> V  | VP PP
Det ->  'my' | 'your'
N -> 'you' |'I' |'smile'| 'tears'
V -> 'thought'
P -> 'in' | 'about'
""")

for x in parser.parse(phrase):
    print(x)

ちゃんと二通りの答えが返ってくる。すごい

(S
  (NP (N I))
  (VP
    (VP (VP (V thought)) (PP (P about) (NP (Det your) (N smile))))
    (PP (P in) (NP (N tears)))))
(S
  (NP (N I))
  (VP
    (VP (V thought))
    (PP
      (P about)
      (NP (Det your) (N smile) (PP (P in) (NP (N tears)))))))

"your smile is literally the cutest thing i had ever seen my life"って文章を構文解析したかったけれど,意味不明になってやめました。
東大の構文解析機に突っ込んでも間違ってたし。いや俺の文章理解が間違ってるのか?

grammar部分に構文の法則突っ込んで,その法則から文章を分析するっていうなんとも簡単な。
ただ奥が深そうだなぁとは思います。

授業ほぼ行かなかったのに課題をソースコードと文章三行くらいで提出したのでさすがになめてるw

英語苦手だし今のところ良い応用も思い浮かばないので,こんな感じで適当に終えます。
形態素解析とか今はMecab叩けば一瞬で終わっちゃうのがすごいなぁと思います。日本語の分析ってめちゃ難しそうなのに。研究者頑張れ。

睡眠導入剤比較(ドリエル vs ネオデイ)

ドリエル vs ネオデイ

有効成分が同じ量だから同じ効き目だろうと思ったら,全くもって違いました。

どう考えてもドリエルの方が効果が強くて,効果が長く(朝まで)続きます。
薬に弱い自分は日中ボケーっとします笑
ネオデイは自分に合っているみたいです。眠るまでは時間ちょっとかかるけど翌朝まで残らない。
というか次の日に眠気が残らないから薬の効果あったのか不安になる笑

という風にめっちゃ差がある二つの薬ですが,この差はプラシーボ効果ではないと思います。成分同じだから全く同じものだって思って飲んだので,実際に効果があったとしか思えません。
有効成分以外の成分は全く違うので,身体の中での薬の溶けやすさとかが変わってくるんでしょうねー,当たり前か。

というわけで,ドリエルとネオデイの有効成分は同じですが,飲み比べてみて合ってるものを選ぶのが良いと思います。

ドリエル強すぎるからもう使えないなー勿体無い…
ヤフオクに出すわけにも行かないし笑

GM1と共に,飛水峡を観光。

最近自然が恋しいなーと思ったので,岐阜県の飛水峡っていう絶景で有名?な観光地へ行ってきました。 もちろん,愛用のカメラGM1で写真を撮りまくってきましたよ。写真はすべてキットレンズで撮りました。

せっかくなのでブログにでも残しておこうかなー,と思った次第です。

駅に降り立って

とりあえず飛水峡のある駅"上麻生"へ降り立ったとき最初に思ったのが,空やばいってことでした。
この青さとこの細やかさ。無編集のRAWでこれです。もちろん写真よりもずっと綺麗で,雄大でした。 f:id:s7rpn:20151014192621j:plain:w600

空が高くて綺麗だとめちゃくちゃ感動ですね。やっぱり田舎って良い!!
観光地である飛水峡は駅から結構歩きました。

鬱蒼とした道を歩いていくと。。 f:id:s7rpn:20151014193546j:plain:w800

下へ降りられる階段が。 f:id:s7rpn:20151014193603j:plain:w800

風景が開けた先は絶景。空の綺麗さも相まって,もう感極まりって感じでした。 f:id:s7rpn:20151014195035j:plain:w800

なんで飛水峡のメインである川を含めた写真がないかって?
台風の後でにごってたからです。残念。こんな白飛びした適当な写真しかないです。笑 f:id:s7rpn:20151014195725j:plain:w800

まぁGoogleで検索すればたくさんの人が撮った綺麗な川の写真があると思うので。。。

それよりも空が綺麗過ぎて,ずっと空の写真を撮っていました。あああ,良い。
綺麗な川も見たかったのでちょっと残念でしたけどね。 f:id:s7rpn:20151014194306j:plain:w800

f:id:s7rpn:20151014194802j:plain:w800

そういえば,帰り道でNHKがインタビューしてたのを見かけました。
NHKの人が「こんにちはー,いまちょっとお時間よろしいですか?」って聞く前に,インタビューする相手に事細かく指示しまくってたので,テレビってやっぱりそういうものなんだなぁと思ったり。
ていうかなんでこんな田舎でインタビューしてるのかしらね。

こんなこと書いてNHKから消してくださいって要請が来たらどうしよう。。。笑

その日の帰り道の駅で,夕焼けがすごく綺麗でした。良い一日だったと思います。 f:id:s7rpn:20151014193544j:plain:w800

関連記事:
iPhoneのカメラがかなり綺麗な理由。

iPhoneのカメラがかなり綺麗な理由。

自分はもちろん,ミラーレスや一眼レフを持っている友人も認める,カメラの綺麗さを誇るiPhone
iPhoneの画面で見るならば,撮影の状況次第では一眼レフに負けない写真を写してくれます。 今回の内容は,そんなiPhoneカメラの綺麗さの理由。

理由1:ISOを詰められるから

iPhoneは基本ISOが32まで詰められます。 これがiPhoneが綺麗に写真を写せる一番大きな理由じゃないですかね。
カメラをやっている人にとっては驚異的な値だと思います。ISO32。

ISOとは

写真を撮る際に,光の情報をどれだけ増幅するかを表した値。 増幅すればするほどノイズが乗るので,基本的にはISOを下げた方が階調が豊かになり,綺麗に撮れる。

音に例えると分かりやすいんですが,例として雑音のある室内で会話を録音したい場面を考えてみてください。 会話している場所から遠く離れた場所で録音して後から音を増幅するより,近くで会話を録音したほうが会話が綺麗に聞こえることは理解できると思います。 それと同じように,写真を写すときも低ISOで光を多く取り込んだ方が,高ISOで少しの光を後から増幅するより綺麗に写るってわけですね。

一眼レフ各社の基本ISO

Canon Ricoh Sony Nikon Olympus Panasonic
100 100 100 200 200 200

確かこんな感じ。 触ったことのあるカメラの常用最低ISO感度なので,同じ会社でも機種ごとに違ったら間違いがあるかもしれません。 また,各社によってISOの基準がまちまちなので,絶対的な値ではないですけどね。

これより低いISOの場合は各社とも拡張感度となり,白とびしやすくなったりします。 音に例えれば,近くで録音した音がうるさすぎてマイクの許容量を越えちゃう感じ。

どの会社でもここまでしかISOを詰められないのですが,iPhone32です。ずば抜けてます。 ずばぬけて低いので,写真もスマホのなかではずばぬけて綺麗に撮れるわけです。 CASIOのデジカメ持ってるけど,iPhoneのほうがずっと綺麗。

どうしてISO感度iPhoneは低くできるの?

たぶんCPUぶん回してるからじゃないですかね。 想像ですが,iPhoneは普通のカメラと違ってCPUもメモリもあるので,画像を多く重ねあわせることによって低ISOを実現しているのだと思います。 光量が許容量を越えそうになったら光を取り込むのをやめて,メモリに写真を保存する。 すぐに同じ写真を撮って,それらを重ねあわせる。 それらを4回繰り返せば,基本ISO128でもISO32の階調豊かな写真が得られます。

ソフト側で秒速10回の連写もできるiPhoneなら,ハード側で撮影素子の光をメモリに一時保存して後から重ねあわせることは不可能じゃないと思います。

理由2:レンズがサファイアガラス

これも大きな理由です。一般的にスマホのカメラはレンズが露出し続けるので,傷がとてもつきやすいです。 そしてレンズにとって傷は大敵で,大きな画質劣化をもたらします。

自分が愛用していたXperia rayというスマホがあるのですが,購入当初は割と綺麗に写真を写してくれました。 カメラ部の人に「この写真何のカメラで撮ったの?」って聞かれる程度には。スマホって言ったらかなり驚かれましたね。

ですが今ではレンズに傷が付き,もうひどい画質です。 このスマホで写真を撮ろうと思うことは一切ありません。

重要なのは,"綺麗な写真を長い期間写せること" なんですよね。 購入当初にどんなに綺麗な写真を写せるカメラでも,使ってて画質がゴミ同然になったら意味ないです。
その点iPhoneは安心です。 強化ガラスの4倍の硬度を持つとも言われているサファイアガラスをレンズ部分に使っているので,ちょっとのことでは傷がつきません。
綺麗な写真を長く写すには,iPhone一択ですね。

理由3:写真に対するAppleのこだわり

iPhone6のレンズ部分の出っ張りがずいぶん非難されたAppleですが,それもAppleスマホデザインよりもカメラの画質を重要視しているという動かぬ証拠でしょう。
Appleはとてもデザインに力を入れている会社ってことを考えれば,iPhoneで一番力が入れている部分はもしかしたらカメラかも。

また,愚直にカメラの画質を追う姿勢は低画素って部分にも見て取れます。 基本的に,画素数が低くなれば撮影素子の一画素あたりの面積が増えるので,より階調豊かな写真が撮れるんですよね。
Sonyとかは数字が命なので2000万画素のカメラとかを平気でスマホに搭載していますが。 Xperia ZシリーズよりiPhoneのほうが写真が綺麗じゃないのって思ったあなたの目は,間違ってはいません。

というわけでiPhone5sの写真

iPhone5sで写した写真の作例を載せておきます。
決して写真撮るのが上手なわけではないですが,良いカメラってことは伝わるかな。
iPhone5sでこの画質なので,進化した6sではもっと写真が綺麗になっていることでしょう。

朝焼け。
f:id:s7rpn:20151005150329j:plain:w600

SLの客席。
f:id:s7rpn:20151005150253j:plain:w600

長野へ旅行へ行ったときの写真。
f:id:s7rpn:20151005150704j:plain:w600

近所の公園。
f:id:s7rpn:20151005145501j:plain:w600

岐阜県の川。
f:id:s7rpn:20151005150308j:plain:w600

まとめ

カメラ重視でスマホを選ぶなら,iPhoneにしよう!って感じの記事でした。

追記。

iPhone6sの最低ISO,25でした。半端ないですね。


カメラ系の関連記事:
GM1と共に,飛水峡を観光。

Rubyのclockworkでエラーが出る

ちょっとはまった。

出たバグ

rubyファイルとして実行すると実行できたプログラムを,clockworkのジョブの中にいれて実行するとSQlite3::Exceptionのエラーとか出る。

原因

# hoge.rb
print `pwd`
# hage.rb
require "clockwork"
include Clockwork

every(1.minutes, ''piyo") do
  print `pwd`
end 

っていうhoge.rbとhage.rbってファイルを作った。これを以下のように実行した場合,

$ ruby folder/hoge.rb 
 => home/folder
$ clockwork folder/hage.rb
 => home

ってなる。

つまり,rubyとして実行した場合は実行ディレクトリが(rubyファイルの存在する)folder内になるのに対して,clockworkでは現在のディレクトリ(rubyファイルの親ディレクトリ)が実行ディレクトリになるっぽい。
まぁそりゃあfolder内のデータベースファイルにアクセスできないっすよねっていう。もしかして常識なんかな?

JavaScriptで文章を暗号化してRuby(Rails)で複合化する

というわけで, JavaScript上で文章をRSA暗号で暗号化して,Ruby(Rails)で複合化するってことをやってみました。 PHPで複合化する記事なら嫌というほど見つけられましたが,Rubyでやってる記事が一切見当たらなかったので。

まぁ見つからないってことはそんなに必要とされてないことなんでしょう。
無料のSSL証明書あるしそれ使えば済むじゃん,って言われたらそれでおしまいですしね。

下準備

環境: Ruby 2.2.2
JavaScriptの暗号化ライブラリは数多くありますが,今回はJSencrypt.jsを使いました。 こちらgithubにあるライブラリです。
あとRailsって書いておきながら実行はSinatraでやったので,ノリでRailsに乗せて行きます。Railsのほうがキャッチーだしね。

コード

とりあえず公開鍵作成のコントローラーから。普通に暗号鍵を作って公開鍵をViewに渡すだけのシンプルな関数です。

#controllers/hoge_controller.rb
class HogeController < ApplicationController
  def new
    rsa = OpenSSL::PKey::RSA.generate(2048) # 公開鍵と秘密鍵作成
    @pub_key = rsa.public_key.to_s.gsub(/\n/,"") # 秘密鍵をViewに渡す
    $rsa_obj = rsa # とりあえずグローバル変数に入れる,実装環境だとセッションごとに共通させたりみたいな処理が要るよね
  end
  # 略
end

次にJavaScriptに暗号鍵を渡して,暗号化します。 encrypt_buttonが押されたらフォームに入力した内容が暗号化される感じ。

<script>
$(document).ready(function(){
  $('#encrypt_button').click(function(){
    var message = $('#message_area').val();
    var enc = new JSEncrypt();
    enc.setPublicKey('<%=@pass%>'); // JSEncryptに公開鍵突っ込む
    var cipher = enc.encrypt(message); // 暗号化
    $('#message_area').val(cipher);
  });
});
</script>

そして,Postされた暗号を複合化するコントローラー。

#controllers/hoge_controller.rb
class HogeController < ApplicationController
  # 略
  def post
    message = @params[:message]
    crypt_arr = Base64.decode64(message) # Base64でデコードする
    output = $rsa_obj.private_decrypt(crypt_arr) # 秘密鍵で複合化
    render plain: "Hello!#{output}"
  end
end

formに「JSencrpt!」って入力して,「Hello!JSencript!」って返ってこれば成功。 f:id:s7rpn:20150926013956p:plain:w300

こちらのサイトの記事を激しく参考にしました。Perlなら読めるので。PHPは意味不明すぎる
ちなみに内容自体はそんなに難しいことではないんですが,"message"を"messege"って誤記していて結構ハマりました。マクルーハンの呪いか。笑

はてなブログを始めてみた

自己紹介的な何か

markdown使えるんだよね?これ

名古屋大学の院生。Rubyを下手の横好きしてます。
作曲とかやってて書いた曲を楽団に演奏してもらったりしてます。
自然を眺めるのが大好き。あと何となくカメラにもはまってたり。

Tumblrサイトも持ってるけどはてブのほうが書きやすそうだなと思ったので,とりあえずこっちで書いてみようかな,とか。
Tumblrサイトはこちら。まだ5~6記事しか書いてないけど。

とりあえず今はOpenStreetMapの覚え書きでも書こうかな,って感じ。

追記

Tumblrやめてこっち一本でやっていくことにしました。