Hatena::ブログ(Diary)

ブックマクロ開発に このページをアンテナに追加 RSSフィード Twitter

2012/03/08

ffmpeg でDVDのリッピング

DVDのVOBファイルを CAT で結合してffmpeg でコンテナを変更する

 cat VIDEO_TS/V*.VOB | ffmpeg -i pipe:0 -vcodec copy -acodec copy c:/users/takuya/dvd_ripping_test.mpeg

自分で撮ったムービーのDVDに限られますけど。


参考

http://jr0bak.homelinux.net/~imai/pukiwiki/pukiwiki.php?%C6%FC%B5%AD%2F2008-10-16%2Fffmpeg%20%A4%C7%A4%CE%20DVD%20%A4%CE%A5%EA%A5%C3%A5%D4%A5%F3%A5%B0

コレもヒドいダダ漏れ。サイボウズで会社名と社員名がダダ漏れな件について

あるブログで見かけました。。サイボウズ利用者の皆さんは公開大好きです。

サイボウズの旧版を放置している会社の社員情報バレバレです。

検索してみよう。

次のリンクをクリック→サイボウズ ログイン 名前 パスワード filetype:cgi


いっぱい出てきた。

f:id:takuya_1st:20120308171258j:image(スクリーンショット 2012-03-07 21.17.53)

f:id:takuya_1st:20120308171306j:image(スクリーンショット 2012-03-07 21.19.03)

f:id:takuya_1st:20120308171318j:image(スクリーンショット 2012-03-07 21.19.48)

「◯◯部の◯◯さんお願いします」って言えば簡単にテレアポ営業出来るんじゃないですかね。ってかかれてたけど、全くそのとおりだと思いました。

テレアポさん頑張って。

情報って怖いです、Googleさん怖いです。

あわせてオススメ、Desknets

f:id:takuya_1st:20120308171303j:image(スクリーンショット 2012-03-07 21.18.17)

desknets グループ 氏名 filetype:cgi

Desknetsは何の対策もしてないみたいなのでした。

aipoの営業マンはDesknetsを使用している会社に重点的に弾幕営業をかければいいんじゃないでしょうか。


たしかサイボウズは対策済みです

ソース忘れたけど、サイボウズは対策しているはず。

むしろ2006年のサイボウズをそのまま放置している運営者側に問題があるかも。でもサイボウズを起動させただけで一杯一杯だよねたぶん。

というわけで、サイボウズで会社情報を公開しちゃってどうしていいかわらない。

そんな会社さんからの問い合わせお待ちしておりますよ(笑



desknetsの皆さん頑張ってください。

見た感じ、desknet'sは何の対策もしてないみたいなので、とりあえず、利用者に通知をするところから始めたらいいんじゃないでしょうか。




追記:

Twitter経由で教えてもらいました。サイボウズの脆弱性はこれじゃないかな。

http://jvn.jp/jp/JVN31125599/374951/index.html

っていうか製品の有効期間切れてるからサイボウズは悪くない。放置してる管理者に責任があるんだろうけど・・・WEBアプリって怖いね。

個人情報について思うことなど。

氏名や住所、勤務先は公開情報ですよね。

名刺を配ったり、住所を登録したりするので、氏名と住所はもはや公開情報です。訊いたらわかるし。

本人を特定できる情報とは何か

以下のような場合、男子の名前だけで、誰かが特定できる状態にあります。

34年間女子しかいなかった高校に男子1人が入学決定wwwwwwww

f:id:takuya_1st:20120308171749j:image(41f0a719-s)

彼の場合、「高校名+男子」の属性情報があれば特定できるわけです。名前は必要ありません。

給与情報テーブルの名前を隠しただけで個人情報保護か?

会社名+給与の金額でも容易に個人が特定できますよね。社長+社員が3名の会社の場合はもう誰がいくらもらってるかバレバレなわけです。

第三者からみても金額が一番少ないのが社長*1、その次が若手か入社年度の浅い人だと想像が容易ですよね。。

名前+住所+電話番号が個人情報と思ってる人が多すぎじゃないでしょうか。

隠さなくていいと言ってるわけではなくて、個人が特定できるレベルって千差万別よね。

乗車履歴も個人情報ですよ

乗車履歴が個人情報に当てはまらないと思ってる、まさかそんな人は居ないと思うけど。PiTaPa/PASMOの乗車履歴は、バレてもよさそうな個人情報と思ってるフシがあって、そこが気になった。

交通ICカードの乗車履歴は、リーダーで簡単に見られるから、そんなに神経質にならなくていい、ってのが電鉄各社の本音だろうけど、そもそも簡単に見られる現実が甘いんだよね。サイバネ規格は公開するべきだし、交通ICカードのプログラムはGNULGPLに近いライセンスにしてコードを公開させるべきだと思う。

不正なプログラムがレジで情報抜いてないか誰がチェックできるんでしょうか。


串刺し検索が出来る権限こそ本質だと思うんだ。

乗車履歴と住所、氏名を関連付けて串刺し出来るから個人情報を守らなくちゃいけない。串刺しできないようにしてもいいし、不特定多数に串刺しで検索されないようにしないとダメだよね。

公開情報や個人情報と、別の個人情報を紐付けて、串刺し検索していけるような仕組みはあやういと思う。その場合串刺し検索ができる人と串刺し検索できる人に権限と管理をしっかりさせないとダメだと思うんだ。誰がいつどこで何を串刺し検索したか。その履歴が残ってないと怖いよね。

*1:または一番多い、社長ってあれだからさ一番少ないことも多い

2012/03/06

PiTaPaがププとピピの鳴り分け解説・・・ヤバイw

PiTaPaを通した時の音、これは状況に応じて鳴り分けてます。知ってた?

9種類あるそうです。

f:id:takuya_1st:20120307030517j:image(スクリーンショット 2012-03-07 3.04.49)

プ、ピとかなんだこれは。(笑


一応公式のパンフレットなんだけどさ。

f:id:takuya_1st:20120307030513j:image(4d55f6942b66074195c7625c1a3d1488)


ピタパの音での利用状況の違いが・・・


おもしろすぎる

とりあえず、改札で音が二回なったら定期の期限が近いってことで。

PiTaPaの履歴をカードから読み出すSFviewer

交通系ICカードの履歴読み出しはだれでもできるので便利です。

交通利用履歴は余りに簡単に見れるので、これは個人情報なのか公開情報なのかわけわからなくなってきた。個人情報なんだけど、うっかりさんの電鉄各社とオバカさんなシステム作る会社が公開しちゃった情報だと思うことにしてる。

実際に交通利用履歴を見てみる。

カードリーダーを準備。

うちのおんぼろのカードリーダーを持ってきた。

f:id:takuya_1st:20120306212847j:image(リーダー)

SFViewer2で読みだしてみる。

起動画面

f:id:takuya_1st:20120307023113j:image(SFカードビューワー)

情報を読み出し。

f:id:takuya_1st:20120307023108j:image(WS000001)

認証やパスコードはいらない。

載せるだけで表示される。便利。


Felicaの交通系ICなら大抵見られる。駅名コードが非対応なら読み出せないけど。

リーダー内蔵のVaioなどのPCだとすごく簡単です。


簡単すぎる。交通系の鉄道サイバネ規格は、IDmとIDiと履歴情報へのアクセスをどう考えてるんだろうか。

15年前ならこういう簡単な読み出しでもOKだけど。いまはヤバイよね。

PiTaPaやSuicaのIDと個人情報と紐付けるはNGじゃないかな

もちろんIDmは取得可能なんだけど、IDmに個人情報を紐付けるのはちょっと待ってほしい。

うちの妹に相談されたことがある。

鉄道会社ってPiTaPaとかICOCAで入退室出来るんでしょ?あれ、ウチの会社でも使いたいんだよね。
アルバイトが増えてきたから、出退勤管理したいんだけど、新規でカード作るの面倒なんだよね。金かかるし。嘘の出勤申告防げないし。

定期券のICカードなら、利用履歴あるし、持ってないと出勤できないから丁度いいと思うんだよね。

これ返事に困った。IDは誰も読みだし可能だから、それを使うのはいいかもしれないんだけど、出退勤は個人情報になり得るだろうし。

IDと個人情報を会社が持っちゃうと、下手すりゃその人の行動を全部取れる可能性が出てきちゃうんだよねぇ。

出退勤、入退室、定期券までワンストップで全部やっちゃうと、たしかに便利なんだけど、そういうログをどうするのか。それに思いが至らないのはちょっと困る。下手に情報持ってりゃなんかの時に責任問題になるだろうが。会社と労務でちゃんと情報取扱規定を定めないとダメだよね、出退勤の利用は。っていうか、鉄道会社とサイバネ規格ははIDmを出退勤替わりに使うのをどう見てるの?

Suica/PASMOで出退勤とかどうなん?

なんかすげーFelica関連のソフトウェア増えてるけど、IDmとそのへんのところ詳しく教えてもらえないか?


ちゃんと正規のSDKなの?


かざすとか、その気になれば交通利用履歴を抜けるだろうし。抜いてないって言えるの?

そもそもPitapaで決済以外に会員登録とかにも使われるよね。ああいうのどうなのさ。時々レジでフェリカ・リーダー見かけるけど交通利用履歴抜いてないって何処に証拠あるのさ。

一般利用者はFelicaを交通以外用途に使うことに無駄に慣れている気がする。


会社に定期ICカード使って出退勤してくださいと言われた時に、個人情報を抜くのはヤダ。Noと言ったらクビになるだろうなぁ。

日立は賢い。

既存のカードに追加で貼るだけ。

http://www.hbs.co.jp/ad_netacs/index.html#merit01

これがまともだろう。たしか横浜市が使ってたよね。こうすればIDmやらFelicaやらに悩まされない。こうあるべきだよ。

定期券の購入証明出してください。

別の会社で6ヶ月分の定期の購入証明が必要とのことで、定期券を提出したことがある。そして定期券の番号を控えられた。


今思うと、PASMOってこういうことだよね。

会社には定期券の購入証明で提出する、番号をメモる。甘い会社はフェリカのID番号をメモる。

会社にID差し出してたら、住所も電話番号も性別もあるから人事部なんて交通利用履歴を見放題じゃないですか。

PASMO履歴と比較した場合のPiTaPa倶楽部の問題点

PASMOから派生してPiTaPa倶楽部の問題点が指摘されてるので、ちょっと考えて見てる。

Pitapaとパスモはちょっち違うんじゃないのか。


PiTaPa倶楽部に第三者が登録するのを防ぐため、以下の点は必ず守りましょう

カード裏面に記載されている会員番号、カードID、有効期限は絶対に秘密にすること

PiTaPa倶楽部には必ず登録し、毎日ログインすること

カードを長期間利用しない場合は解約を検討すること

http://www.sonorilo.net/2012/03/02/2852

なんか違う気がする。


まず。ピタパについて

ピタパは登録制。ここは絶対抑えておくべきポイント。


Pitapaは登録が前提。

Pasomoは匿名で買える。


ポイントは匿名性。


Pitapaは匿名で買うことができない。匿名で変えないし、クレジットカード機能すら付いている。

発行時に「住所。氏名、電話番号、勤務先」と身分証を送付する。*1

発行後には、PiTaPa番号(クレジットカード番号)が発行される。

記名PASMOの場合「住所、氏名、性別、電話番号」と「Felica番号」を紐付けるのみ。


履歴について

PiTaPaは後払い。履歴を意識する。

利用者は履歴を回収されて当たり前だと思ってる。

Pitapaは登録が前提
そして履歴も前提、だから、ユーザーは履歴が完全に残ってることを知っている。
PASMOは匿名で買える
手軽に買える、ユーザーは履歴が完全に残っていることを知っていない。

履歴が残ってて見られてどう使われるかを、利用者は意識してないと思う。

「記名PASMO」は「再発行」のためだと思ってるんじゃないだろうか。

PiTaPaが問題にならなかったのは。

PiTaPa番号という「通常の第三者に知りえない情報」が提供されていたからだと思う。

*2

クレジットカードでもあるのでレジでも使える。

後払いクレジット故に、利用者の履歴と番号への意識が高かった。

PASMOが問題だったのは、履歴への意識の低さ

PASMOはFelicaのIDi(黒背景に白抜き文字)を使い、「住所、氏名、年齢、性別」など公開情報とも言える情報を使った。

匿名で手軽に買える利便性を残したため、公開情報だけの記名PASMO、そして匿名利用ゆえに履歴・番号への意識が低かった。

だからこそタイムズなど第三者が、IDiを識別ったIDiと住所と氏名を自社で関連付けてても違和感無く受け入られたんじゃないかな。

利用者のIDへの意識の低さ、鉄道会社の履歴情報へのアクセスについての周知の低さが透けて見える。


これらの違いが

高木先生に攻め込まれた理由で、そこがPASMOとPiTaPaの違いだったんだろうと思います。*3

PiTaPaの問題点も

基本的にはPASMOと同じです。だけど、Pitapaには番号が一つ多い。


PiTaPaの場合、クレジットカード番号を付与していたことで立ち位置がちょっと違ってた。

つまり「カード番号を盗まれたときは、すぐに再発行してください」

PiTaPaはクレジットカード番号(PiTaPa会員番号)を追加発行しているので、これを安易に盗まれるのはユーザーの責任といえるだろう。

サイバーノーガードというよりクレジットカード番号のアクセスと同等と考えられているのでしょうね。

PiTaPa倶楽部の問題点は

サイバーノーガード戦法というより、上書き登録出来てしまうことが問題だと思う。

IDiやクレジットカードが漏れるのは仕方ないことだとしても。

第三者が本人に知られることなく上書き登録しちゃえるのは、問題だと思う。。。




参考

http://www.sonorilo.net/2012/03/02/2852

これはヒドイ。PiTaPa倶楽部はアカウント乗っ取りを公式に推奨中

ある日、Twitterを見ていると。「ピタパクラブは上書き登録可能。」と見かけた。

#pitapa 倶楽部がひどいのは、とあるカードに対してユーザー登録が既に行われてても、上書き登録ができてしまうこと。なので、攻撃者が対象者のアカウントを上書きすることが可能になるという凄い実装。

https://twitter.com/#!/cetacea/status/174094663861542912

f:id:takuya_1st:20120306220206j:image:w450

そうだったの・・・知らなかったです。上書き登録出来るとかヤバイんじゃないの?早速試してみよう。

ピタパを知らない人に解説すると、ピタパは、パスモに先駆けて、関西私鉄で使える交通ICカード。後払いが特徴。あとから回数券分相当が割引されて請求される。とっても便利なサービス。


Pitapa倶楽部はID乗っ取りが可能。

登録済みPiTaPaに対して、ID乗っ取りが可能です。実際に試しました。

でも悪いことじゃないです。ID再登録はピタパ発行元も推奨する乗っ取り手段です。

以前、ピタパ紛失時にコールセンタで「ピタパクラブはどうすればいいですか?」って訊いたら、再登録できるから大丈夫ですって言われたの。それ思い出した。

悪用しなければいいんです。悪用しなければいいんです。悪用しなければいいんです。

大事なので3回言いました。

再・登録じゃなく、パスワード再設定できないの?

ピタパクラブは、パスワード再設定ができません。パスワード紛失時には新規登録で上書きします。

PiTaPa公式サイトの説明

f:id:takuya_1st:20120306220949j:image:w450(新規登録っすか)

「再発行なし=>新規登録を推奨」が公式見解だそうだ。

パスワードにつきましては、お忘れになられた場合、改めて(略)新規登録の手続きをしなおしていただく必要がございます。

再度新規登録だと何がまずいか?

簡単にアカウントを乗っ取れます。

  • Pitapaカード番号
  • 電話番号
  • 生年月日
  • フェリカID
  • クレジットカードの有効期間

これらがセットになれば、いつでも再登録できる。


PiTaPa安心じゃない。

いまから、彼女のピタパクラブのカード上書きしてみよう


実験してみた。

番号入力してー

f:id:takuya_1st:20120306220212j:image(上書き!)

上書き登録しました。

以前のIDでログインすると・・・

f:id:takuya_1st:20120306220202j:image(上書きされた側)


既存アカウントは無効化された。彼女のPiTaPa履歴が見放題です。アリガトン


電話番号と生年月日を知りうる人は、簡単に乗っ取れるということです。

電話番号と生年月日は公開情報だから、PiTaPaカードさえ見れれば誰でも履歴にアクセス可能で、登録情報変更可能ですね。*4

じゃぁピタパの履歴を見るには。ピタパカードを入手して、ってそんな必要ないかもよ。




カード無しで、ピタパのカードIDを入手する。

レシートにフェリカ番号乗るからね、ピタパの支払いレシートがアレば十分。レシートがあればFelicaID入手完成。*5

f:id:takuya_1st:20120306223320j:image:w225:left

f:id:takuya_1st:20120306223329j:image:w225

(レシートに載ってる)

0027が僕の下四桁です。もう公開情報にしておくわ


Pitapa会員番号IDを取得する

利用明細にピタパの番号乗るからね、明細手に入れたら、13桁入手。

f:id:takuya_1st:20120307002226j:image(送付される明細にPitapaIDが!)

f:id:takuya_1st:20120307001203j:image(マスクされてるけど。)


追記:僕のエメラルドスタシアのPiTaPa会員番号はクレジットカード番号と同じでした。


これでほとんど丸裸だよね。

生年月日・電話番号は公開情報、ピタパ番号(16桁中13桁)が請求書記載、フェリカ番号(下4桁)がレシートに記載。

登録に必要な番号のうち残る番号は、カード有効期限とピタパ会員番号3桁のみ。

その内の、カード有効期限ってのは隠しているうちに入らない。4桁ですが1000通りもありません。

有効期限はつまり60通りです。年はせいぜい5年だから5個、月は12ヶ月だから12個。

ピタパ番号は数字3桁だから1000個。つまり高々60,000通りの総当たり攻撃で登録可能になる。




いまできることは、

ピタパクラブには定期的にログインして、アカウントの有効チェックするしかないね。

これが日本の技術力。こういう疑問符が出るシステム作る会社が国民ID関連の会議に入ってるんだろうね。ヤダヤダ

PASMOの履歴問題といい勝負かな。というか、会員情報変更できる分、ピタパ倶楽部の方が被害が大きくてヤダ。

ここがPASMOと違うところ。

PiTaPa会員番号がクレジットカード番号と同等でした。なのでPASMOと違いPiTaPaは利用者が番号の取扱いが慎重なことを知っている。*6

PASMOの場合、履歴がWEBで見られることを「周知不足」だと指摘されていて、「公開情報」で登録可能な点が問題を大きくしていた。

PiTaPaの場合、履歴がWEBで見られることを「大前提」で履歴収集している。「クレジット番号」で登録必須な点が問題を見えなくしてた。

PiTaPaとPASMOを同一視して攻撃するのは違う。



どうすればいいですか?

システム作る会社さん、問い合わせ待ってるからね。今回も。

f:id:takuya_1st:20120224165354j:image

ピタパクラブだから、アイテック阪急阪神と、大阪市営地下鉄とピタパ協議会と京阪◯◯とあたりからの問い合わせは歓迎するよ。

優しい解説と改善提案するから僕を雇って!(違

*7

*1:勤務先はやり過ぎだと思ってたら、最近は必須じゃなくなったらしい。あぁまぁクレジットカードだからアリといえばありなんだけど

*2:だけど、クレジットカード番号なので知ろうと思えば知ることが出来るが

*3:まぁ高木先生はPiTaPaなんて使ったこともないだろうし、興味もないだろうけど

*4:パスワード+メアド登録が意味無いじゃん。

*5:裏面の黒背景白抜き番号

*6:まさかPiTaPa会員番号とクレジットカード番号が同一だとは・・・

*7:ちなみに彼女ってのは脳内だからね。

2012/03/05

もやしもんノートを見つけた。思わず買っちまった。

何気なくAmazon見ていたら「もやし」のノートを見つけた。しかも中身が実用的

表紙が可愛い。

しかも中身がいい感じで

やばい。これは可愛い。

(旅行)

f:id:takuya_1st:20120306035630j:image(家計簿)

f:id:takuya_1st:20120306035633j:image(自由帳)

紙ノートはいい。

テキストエディタでファイルを書き散らかすと、印象に残らない。ノートだと書いたものを検索しにくい。

僕は、記憶に残るほうが大事だと思う。だから未だにアナログなノートが好きだ。


Evernoteは検索も、デジカメ写真とコメントが残せるのがとても便利だ。でもインデックスが悪い。

アナログなノートを活用するコツ。

インデックスを手作業で作るのです。

f:id:takuya_1st:20120306040922j:image(目次)

ノートを書くときにインデックスも手書きする。すると、前後の関係がよく分かるようになる。インデックスは一種のファイル名みたいなものです。

あと、ノートはフォーマットを決めておくといい。白紙の日記とか何を書いていいか迷走する。

だからこのようなテンプレのノートが便利なんだ。

でもテンプレ付きのノートは事務用の殺風景なもの、小学生向きのものしかない。毎日使うには楽しくない。

もやしもんノートだと、なんか楽しくなりそう。


値段も安い

f:id:takuya_1st:20120306040143j:image(スクリーンショット 2012-03-06 4.01.22)

これは一個買っておこう。


AA

とりあえず、AA

目的別ノート 旅行

目的別ノート 旅行

気に入ったら踏んでもらえると嬉しいです。

はじめてのおっぱいダウンロード。プログラミング男子応援イベント。

男子高校生いや中学生か。円グラフをパイチャート呼んだり、円周率πが2πで360度で、2πが一個で妙に納得したり。1/6 πとか美乳ですよね。とか。積分のデルタが密林でΔだとか。数学とか楽しめます。


そんな男子高校生に送る「おっぱい」

見たくてたまらない君たちに、とりあえず、飽きるまで見ることをおすすめする。飽きたら、現実を見ような。いろいろな意味で。


ゆーすけさんのをRubyで描いてみた。

Perlなんてアレだよね。PyPiPythonが一番向いている気がするけど、Pypiネタはすでにある。じゃぁRubyでエロくダウンロードしてみるか。

rubyでゆるく、エロくダウンロード

rubyにはMechanizeという、最凶ツールと、Nokogirlという無敵ツールがあってWEBからぶっこ抜きに、至高ツールなのです。


おっぱいをダウンロードする方法。

  1. rubyをインストールする。
  2. ツールをインストール
  3. スクリプトを動かす。
  4. ワクワクしながら待つ。

rubyのインストールは簡単。

Macなら初めから入ってるよ。Macを買ったきみはついてる。

Windowsな君は。http://www.ruby-lang.org/en/downloads/ からダウンロードしてインストール。


rubyが実行できるようになると、いよいよ、プログラミングで魔法の時間だ。

ツールを入れる

rubyで使う、Rubyで書かれた、Rubyのためのツールをインストール。

gem install mechanize

スクリプトを動かす

ruby oppi.rb

oppi.rb

プログラミングの本体。

##リクエストを投げる。
require "rubygems"
require "json"
require 'mechanize'
$app_id = "35A40D6D57F***********"
$start  = "http://api.bing.net/json.aspx"
$offset = 0;
$params ={ 
        'Appid'     => $app_id,
        'Version'   =>'2.2',
        'Markert'   =>'ja-JP',
        'Sources'   =>'Image',
        'Image.Count'=> 50,
        'Image.Offset'=> $offset,
        'Adult' => 'off',
        'Query'=> 'おっぱい'
}
$mech = Mechanize.new
$mech.get $start, $params
$ret = JSON.load($mech.page.body)
$ret["SearchResponse"]["Image"]["Results"].each{|e|
  $mech.get e["MediaUrl"]
  $mage.page.save
}

これでおっぱいがいっぱい。

うむ。それでは一気にダウンロード。

なんか楽しいけど、萌えない。

ファイル名がエロくないんだ。ファイル名を、検索結果からつけてみた。


f:id:takuya_1st:20120305215202j:image(スクリーンショット 2012-03-05 21.50.16)



ダウンロードを複数起動するとあれなのでスレッドする。

一本ずつダウンロードを待ってられないのが男子中学生。

複数スレッドでのダウンロードのプログラムを参考に書いておきます。

*1

require "rubygems"
require "json"
require 'mechanize'
require 'thread'

$image_url_list = Queue.new
$app_id = "35A40D6D57FEB804B1E1AAD*****************E2B"
$start  = "http://api.bing.net/json.aspx"
$mech = Mechanize.new
$offset = 0;
$params ={ 
        'Appid'     => $app_id,
        'Version'   =>'2.2',
        'Markert'   =>'ja-JP',
        'Sources'   =>'Image',
        'Image.Count'=> 50,
        'Image.Offset'=> $offset,
        'Adult' => 'off',
        'Query'=> 'おっぱい'
}

def oppi_search(n=1000)
  Thread.new{
    $mech.get($start, $params)
    #1000ページまで行こうか。
    n.times{|i|
        #1ページからNページまでの遷移
        $offset = i * $params["Image.Count"]
        $params["Image.Offset"] = $offset
        $mech.get $start, $params
        #
        ret = JSON.load($mech.page.body)
        pp ret["SearchResponse"]["Image"]["Results"].size
        ret["SearchResponse"]["Image"]["Results"].each{|e|
            #ダウンロードリストに追加する。
            $image_url_list.push( { "img_title" => e["Title"], "img_url" => e["MediaUrl"]})
        }
    }
  }
end
#ダウンロードするだけの娘
def download_thread
    t = Thread.new{
        m = Mechanize.new
        m.max_history = 1
        loop {
            begin 
              task = $image_url_list.pop 
              file = m.get task["img_url"]
              #拡張子判別
              ext_name = file["content-type"].split(%r"/").last
              file.save( task["img_title"]+".#{ext_name}"  )
            rescue => e
              puts e
              m = Mechanize.new #エラーがでたらMechanize再起動
            end
        }
    }
    return t
end

##Bing検索スレッド
t = oppi_search()
workers = []
##画像のダウンロードは5スレッドで。
workers << download_thread()
workers << download_thread()
workers << download_thread()
workers << download_thread()
workers << download_thread()

#無限ループ
workers.first.join

*2

元ネタ。

http://d.hatena.ne.jp/heavenshell/20120304/1330869594

http://yusukebe.com/archives/20120229/072808.html


励めよ。うむ

他の蒐集も、基本は同じです。検索先がBing→ニコニコになったり、取得対象がJPG→FLVになるだけです。がんばってね。

AmazonでエロDVDが1円

1円で買える時代なのに、エロ画像ってのもの無いと思うんだ。DVDを簡単にMP4にする方法がいいかな?

↓ほらね

rubyを動かしたい人は

初めてのプログラミング をかいなさい。

2012/03/08追記;さらなる高速化へ

更に我慢出来ない人に高速化のヒントを書いておきます。

  • HTTPのKeepAliveが働くように書きなおす
  • DNSルックアップを一括で処理する。

HTTP1.1はKeepAliveで一回の接続で複数回ダウンロードできます。TCP/IPのコネクションのオーバーヘッドがもったいないのでIPアドレス毎に接続を切り分けて、一回のコネクションで複数回ダウンロードすれば高速化できます。取得相手が同じサーバーならそのほうが速い。(特にHTML/JPEGの場合は効果的、FLVのような大きいファイルだとファイルのダウンロード時間のほうが長いのであまり変わらないと思う)

*1:Rubyのスレッドとかプリエンプションが・・・ノンプリとかいうけど、ネットワークIO待ちだと別スレッドに切り替わるしそれなりに効果ある。

*2:15分程度で適当に書いたので、マルチスレッドちゃんと動いてるかなぁ。。まぁいいけど。

2012/03/02

PDOのquery/execの違い

PDOのquery/execの違いを忘れていたので、久しぶりに調べてみた。

<?php
        $ret = $this->album_table->exec($CREATE_TABLE_SQL);
        $ret = $this->album_table->query($CREATE_TABLE_SQL);

複数行のクエリを投げるときは、execを使う。

たとえばcreate tableの一括実行など。sqlite:memory:で動作確認した。

queryだと最初の一行だけが実行されただけだった。


exec
複数行まとめて実行
query
一行実行

queryは複数仕込んでも一行だけだった。

phpのPDOのPrepareの課題

prepare では in(:list)とできない 。PHPのPDOでbindParamした時に、INの場合は複数値を配列で渡せない。

PDOStatement::execute() をコールする際には、 文に渡すパラメータにはそれぞれ固有のパラメータマークを設定する必要があります。 ひとつのプリペアドステートメントの中で、同じ名前のパラメータマークを 複数使用することはできません。SQL 文の IN() 句などで、 ひとつのパラメータに複数の値を 割り当てることはできません。


というわけで where in ( :list )

という書き方ができないです。


そこでどうするのか?

<?php
        $SQL = "$SQL where ".implode(' AND ' , $conds);
                  $conds[] = " id in ( ".
                  implode(",", array_map( create_function('$v','return "?";'),$id_list ) ).
                  " ) “;


とやる、これしか無い。配列の中身をまとめてBindするしかないんですよねえ

ActiveRecord単体で、Sqliteにテーブルを作る。

ActiveRecordの単体でSQLiteにテーブルを作るとかしてみた。

データベースにテーブル作るのすらActiveRecordを使ったら楽な気がする。

  1 #!/usr/bin/env ruby
  2
  3 require 'rubygems'
  4 require 'active_record'
  5
  6 ActiveRecord::Base.establish_connection(
  7     "adapter"=>"sqlite3",
  8       "database" => "./data.sqlite"
  9 )
 10
 11 class TestCreation < ActiveRecord::Migration
 12   def self.up
 13     create_table :entries do|t|
 14       t.string :title
 15     end
 16   end
 17 end
 18
 19
 20 TestCreation.new.up
 21
 22 

結果

テーブルできた。

SQLite version 3.7.3
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE "entries" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255));
sqlite> .tables
entries
sqlite> 

できた。


アダプタ名

 18
 19 ActiveRecord::Base.establish_connection(
 20   "adapter"=>"sqlite3",
 21   "database" => "./ndl_data.sqlite"
 22 )

なんか adapter 名が sqliteから sqlite3に変わったみたい。



苦労したけどなんとか動かせたみたい。

Pitapaクラブにログインして、明細を取得する。

f:id:takuya_1st:20120302222746j:image(スクリーンショット 2012-03-02 22.27.28)

Pitapa倶楽部にログインする。

明細CSVと請求料金のTABLEタグを取得する。


require 'rubygems'
require 'mechanize'
require 'kconv'

m = Mechanize.new
##ログインページ
m.get "https://www2.pitapa.com/login.html"
m.page.forms[0].field_with({:name=>"id"}).value = "**i*d_takuya******"
m.page.forms[0].field_with({:type=>"password"}).value = "**password**"
m.page.forms[0].submit
#トップページ
m.page.links.select{|e| e.text =~ /ご利用代金・明細照会/}.first.click
#フォーム
m.page.forms[0] #ご利用代金
m.page.forms[1] #ご利用明細
m.page.forms[2] #TOPページヘ

f = m.page.forms[1]
f.fields.select{|e| e.class.to_s =~ /Select/ }.first
#先月
month = (Time.now()-60*60*24*30*1).strftime('%Y%m')
f.fields.select{|e| e.class.to_s =~ /Select/ }.first.options.select{|e| e.value == month}.first.select
f = m.page.forms[1].submit
##CSVダウンロード
m.page.forms.last.submit
puts m.page.body.to_s.toutf8
##同月の請求額へ
m.history[-2].forms[-3].submit
puts m.page.search('//table[@width=760]').to_s

確定日が翌月14日前後なので毎月20日くらいに実行するといいかも。


PASMOがアレコレ騒がしいいま、ピタパは大丈夫なんだろうか。

なんかアカウントが上書きできるとか。できないとか。どっちにしろPITAPAのICのIDが割れちゃうとまずいよねぇ。

ffmpegを応用する。ファイル転送しながら、エンコード

PT2で録画したデータはATOMでなく、クラウド側でエンコードしたら速いよね。ATOMでエンコードすると、時間がかかりすぎるし、電気代大変なので。

サーバーでエンコードする。

cat test.ts | ssh enc_server1 "/usr/local/bin/ffmpeg -i pipe:0 out.mp4 “

はい、楽チン。

これで転送待ち時間がゼロです。転送しながら到着した動画をエンコードするのです。

仕組みの解説。

標準入力をつかったエンコード

cat test.mpeg | /usr/local/bin/ffmpeg -i pipe:0 out.mp4 

これで、FFMPEGが、標準入力のパケットをそのままエンコードして、out.mp4に書き出します。

  • pipe0 :0 が標準入力
  • pipe1 :1 が標準出力
  • pipe2 :2 がエラ出力
  • pipe :- 指定なしは自動判別

です。

ファイル転送

cat test.ts | ssh enc_server1 "cat - > out.ts “

SSHは、標準入力・出力を扱えるので、それをつかって標準入力をそのまま渡します。


無名パイプライン処理に、ffmpegを挟み込む

最後にこれらに、ffmpegをはさみ込めば完成です。

cat test.ts | ssh enc_server1 "/usr/local/bin/ffmpeg -i pipe:0 out.mp4 “

転送待ちして、その後にTSを変換するとか時間無駄だし。そもそもTSってこういう使い方しても大丈夫なトランスポートストリームなんだからね。

転送も、エンコードも同時にするなら

teeをはさみ込めばいいんじゃないかな

cat test.ts | ssh enc_server1 "|tee test.ts | /usr/local/bin/ffmpeg -i pipe:0 out.mp4 “

これでどう?

標準入力が使えるんなら

EPGRECで録画時にそのままmp4で保存できるんじゃないかと思ってるんだけどさ。


ffmpeg のパイプ出力に注意

ffmpeg -i pipe:0 -vcodec libx264 -acodec copy -f mp4 pipe:1

は出来ない。標準出力に出すには、当然TSで有るべきだと思う。

別にTSでなくてもいいんだけど、MP4だと、動画の書き込みのために、ファイルの中身をSEEKで戻ったりする。

なので、Mp4のpipe出力はffmpegに怒られて、動作しないの。パイプだと行きつ戻りつができないので無理だそうだ。

で注意が必要。

ffmpeg -i pipe:0 -vcodec libx264 -acodec copy -f mpegts pipe:1

だと動くかも。

「SSHで標準入力を渡す」は便利

こいうのは便利だと思うわ。そういえば、知り合いがサーバー越しにパイプをするために、わざわざnetcatやら、ポートあけて待受しててたな。

SSH使えよって思います。

SSHでパイプをネットワークで使えるのに、そして名前付きパイプでもいいと思うんだけど。

アクトビラ対応ブラウザに任意の動画を配信する方法。

結論から言います。

アクトビラ対応機器のブラウザで好きな動画が楽しめます。

もうDLNA対応機やREGZA厨と喧嘩しなくていいんですね。朗報

ただし、イバラの道なので初心者にはお勧めしません。うまく動作するテレビやSTBならとても快適です。



今回実験に使ったBuffaloの機器だと余裕でした。

その他メーカの場合は、コーデックが難しい、誰か実験を助けてください。

実験に使った機器。

メーカーページ→メディアプレーヤー〈リンクシアター〉LT-H91DTV | BUFFALO バッファロー


アクトビラで再生する動画の作り方

ffmpeg -y -i 2355.mp4 -vcodec libx264 -acodec copy test2.m2ts

ポイントは、拡張子 m2ts これが188バイトのヘッダにタイムスタンプを入れた192バイトのヘッダをつけた、タイムスタンプ付きTSを作るための魔法の拡張子。本当はArib仕様を読み解いて作りたいけどね。

アクトビラのブラウザに配信する方法

  1. アクトビラ対応TVにアドレス入力出来る場所にHTMLを置く
    • 今回は 192.168.2.5
  2. index.html設置
  3. HTMLが見られることを確認する。
  4. CPCファイルを設置する
    • 今回のキモ
    • CPCファイルが出発点
  5. CPCファイルへのリンクを作る
  6. TVでCPCファイルをクリックする
  7. 動画の再生が始まる。

アクトビラ対応のNetFrontブラウザでHTMLが開けることを確認

f:id:takuya_1st:20120302060227j:image(CA3G0443)


CPCファイルを作る。

これが面倒くさい。

とりあえず、それっぽいCPCを作ったのがあるので、おいておきます。

http://qiita.com/items/2925

(CPCファイルの詳しい仕様は、あとで書きます。)

CPCファイルの動画部分にURLを指定

   <startup>
        <content_title>test</content_title>
        <duration>000000</duration>
        <start>http://192.168.2.5/0655_HD.m2ts</start>
    </startup>

ここの部分の動画いm2tsを指定しました。

あとはindex.htmlで

さっき作ったCPCファイルをリンク先に指定します。

<a href="http://192.168.2.5/test.cpc?LID=none&Return=http://192.168.2.5/">0655_HD@atom </a><

と指定します。

LIDは課金用決済のセッションコード、Returnは再生終了後に開くブラウザに渡すアドレス。


アクトビラ・ブラウザを起動して

URLを入力して

f:id:takuya_1st:20120302042439j:image(CA3G0444)

f:id:takuya_1st:20120302042452j:image(CA3G0445)

クリック

f:id:takuya_1st:20120302060254j:image(CA3G0446)


すると再生が始まる。

f:id:takuya_1st:20120302050545j:image(CA3G0447)

おおおお!やりましたね。

f:id:takuya_1st:20120302050559j:image(CA3G0448)

ニコ動を変換したTSがAQUOSブラウザで再生されました。やったね。


これでテレビのリモコンで動画が見られるようになります。

マウスで操作したりDLNAで探すのは面倒でした。HTMLで表示できるので便利ですね。役得。

AQUOSでもなんとか頑張ってPT2のTSも見れるようになるんです。

さて、こういう仕様は何処で調べるのか。

デジタルテレビ情報化研究会/発行物

個々にかいてあるPDFが置いてありました。PDFを詳細に読み進めればわかるんだけど。如何せん面倒くさい。


CPCファイルについて

CPCファイルについては、デジタルテレビ ネットワーク機能仕様-ストリーミング機能仕様書-プロトコル編(v1.1)

に記述されているんですが。。。。これが結構ややこしい。でもCPCファイルがキモなので必須ですね。


3パートから構成される「CPC」

CPCファイルは3パートから構成されます。

Content-Type:application/X-arib-resourceList
Content-Location:FL-NOENC.eri
Content-Location:RTP.nci

の3パートです。

f:id:takuya_1st:20120302060326j:image(スクリーンショット 2012-03-02 5.21.40)

それぞれ役割があって

arib-resourceList
ここにはFL-NOENC.eriとRTP.nciを見に行けと、バイナリで書いてある。(これが面倒でね、、)
FL-NOENC.eri
ここには、動画ファイルのURLとコーデックや長さとかがXMLで 記述されてる
RTP.nci
ここには、ファイルのプロトコルが書いてある(固定)

このほかに、課金情報とかあるらしいんだけど、調べても使ってる人居ないみたい。

形式はHTTPヘッダ形式とかMIME形式とか規格書に書いてある。まぁ、MHTMLやマルチパートのメールと同じです。通常のMIMEです。


CPCの欠点

CPCには"Content-Type:application/X-arib-resourceList"があるんだけど、これがめんどくさい仕様なんですよ。

これが先頭のフォーマット形式

f:id:takuya_1st:20120302060324j:image(スクリーンショット 2012-03-02 5.20.20)

先頭パートとには「このCPCは3つのパートからなる」と書いてある。

先頭パートのバイナリ・フォーマットの定義リスト

f:id:takuya_1st:20120302060223j:image(Aribによる定義)


つまり、バイナリなんですね。先頭行からちょこちょこ読めばいいんです。でもね、バイナリがBase64されてないので、コピペが激しく難しい。これがアクトビラの解析で一番の罠っぽい感じです。

であとは、Content-Lengthに気をつけながらファイルを書く。

CPCファイルはかなり厳格に読まれる。なぜかというとだ、arib-resourceListがバイナリだから、長さが結構重要みたい。適当に書き換えたら動かない。そのくせタグの中は全く見てなくて、「MPEGだぜESはMPE2だぜ」とCPCに書いてH.264/AVCを送信しても読んじゃいます。


CPCファイルをContent-Lengthにさえ注意して作れば完成です。


CPCファイルさえ作ればあとは簡単よ。

一応AQUOSでもいけることは確認した。タイムスタンプ付きTSを作るだけ。

リモコン操作で簡単動画

epgrecとかだとブラウザ経由で見れるので、正直パソコン触るのが面倒なのでリモコン解決は嬉しい感じ。

大事な事は、アクトビラ対応のテレビにTS直接配信できるということ

ここが重要。しかもHTMLで記述できるからDLNAより楽かも知んない。


*1

早送りとスキップかはどうするの

このエントリのブクマが伸びたらまた続編書きます。そんときにでも。


Buffaloが最強

バッファローのSTBが最強でした。

バッファローのアクトビラ対応STBはかなり最凶でしたわ。

生産完了になってる。いそげ

ヤフオクで安くで手に入るしいまならいける。

手伝ってください。

CPCファイルの解析は済んだのです、いまはCPCファイルのジェネレーターを作るところです。しかし我が家にはAQUOSしかないので、他メーカのブラウザでも試してみたいんですが。協力してもらえませんか。


アクトビラってクソだよね

アクトビラってガラパゴス化の最たるものだと思うけど。HTMLを意識した標準化を頑張ってる。そのへんか好感が持てる。でも情報リソースが少なくて秘密主義でもっとオープンになってもいいと思う。喧伝が下手だ。

*1:ただAQUOSだとなんかH.264/AACの扱いに難がある。時々デコード出来ない場合があった。MPEG2のTSはバッファが短いのか帯域が遅いとブロックノイズだらけになりました。BraviaはTSファイルをなぜか読まない。

2012/03/01

simpletestの使い方

PHPにも数あるテストツール(unittest)だけど、今のところ。これが手軽で便利そう

f:id:takuya_1st:20120301214107j:image(63d7cb68b612441ee851c5a020fa64b5)

インストールと使い方

  1. 最新版のtgz を取得する。
  2. require する
  3. 特定のclassをextendsする。
  4. 作ったクラスをnewする。

以上

インストール

wget http://downloads.sourceforge.net/project/simpletest/simpletest/simpletest_1.1/simpletest_1.1.0.tar.gz -O - | tar zxvf -

インクルード

<?php
require_once('simpletest/autorun.php’);

クラス。

class SampleTest extends UnitTestCase{
    public function __construct(){
        //
        $this->dsn = "sqlite::memory:";
    }
    public function test_insert_and_select_one(){
    }
}
//newする
$test = new SampleTest();

実行

php test.php

またはブラウザで開く


記述規約

class SampleTest extends UnitTestCase{

クラスは UnitTestCaseを exntendsして使う。

テスト関数は、testXXXXXXで testから始める。


セットアップと、終了には

  • funciton setup
  • function teardown

を使えば前処理、後処理が出来る。

クラスのコンストラクタは、セットアップにも使える。

このあたりは通常のUnittestと変わらない。


WEBで見た場合は

これで見える。

f:id:takuya_1st:20120301214109j:image(a5346ffadb3f7dddca226cfe3f7ad9ff)

Mechanize(ruby)でUserAgent詐称

MechanizeでUserAgentを切り替える方法。


MechanizeでScrapingしていると、時々UAチェックで弾かれることがある。

UserAgentを切り替える方法

mech = Mechanize.new
mech.user_agent_alias = 'Windows IE 7’ #キーを指定。


ちなみに使えるUserAgent

UserAgentはこんな感じで、定数に展開されている。

AGENT_ALIASES = {
  'Windows IE 6' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
  'Windows IE 7' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
  'Windows Mozilla' => 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6',
  'Mac Safari' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10',
  'Mac FireFox' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6',
  'Mac Mozilla' => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4a) Gecko/20030401',
  'Linux Mozilla' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624',
  'Linux Firefox' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1',
  'Linux Konqueror' => 'Mozilla/5.0 (compatible; Konqueror/3; Linux)',
  'iPhone' => 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3',
  'Mechanize' => "WWW-Mechanize/#{VERSION} (http://rubyforge.org/projects/mechanize/)"
}

Mechanizeに指定するのは、上記のキーだけでいいみたい。



詐称と呼ぶけど、悪いことじゃないよ。そもそもUserAgentがオレオレなんだぜ。




参考

http://w.livedoor.jp/ruby_mechanize/d/Mechanize#user_agent_alias=

DDコマンドでWrite速度測定:ddでHDDやNASの書き込み速度を見てみる。

ddでHDDやNASの速度を見てみる。

ディスクの速度を見たいなぁと思ったんですけど、いちいち測定ソフト入れるのも面倒くさい。

書きこんで速度がわかれば・・・そうかddで良いじゃん。

ddでやってみた。

5回書き込み

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=5 bs=1024
5+0 records in
5+0 records out
5120 bytes (5.1 kB) copied, 0.000198 s, 25.9 MB/s

50回書いた

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=50 bs=1024
50+0 records in
50+0 records out
51200 bytes (51 kB) copied, 0.000732 s, 69.9 MB/s

ある程度のサイズを書きこまないと、正しく測定できない模様。

ファイルサイズを増やしていくよ。

500回書いた。

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=500 bs=1024
500+0 records in
500+0 records out
512000 bytes (512 kB) copied, 0.004786 s, 107 MB/s

1000回書いた

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=1000 bs=1024
1000+0 records in
1000+0 records out
1024000 bytes (1.0 MB) copied, 0.007525 s, 136 MB/s

2000回

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=2000 bs=1024
2000+0 records in
2000+0 records out
2048000 bytes (2.0 MB) copied, 0.014717 s, 139 MB/s

3000回

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=3000 bs=1024
3000+0 records in
3000+0 records out
3072000 bytes (3.1 MB) copied, 0.034717 s, 88.5 MB/s
takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=2000 bs=1024
2000+0 records in
2000+0 records out
2048000 bytes (2.0 MB) copied, 0.014924 s, 137 MB/s


さらに小さいファイルにしてみた

takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=100 bs=512
100+0 records in
100+0 records out
51200 bytes (51 kB) copied, 0.000996 s, 51.4 MB/s
takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=1000 bs=512
1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 0.004781 s, 107 MB/s
takuya@air:~/Desktop$ dd if=/dev/zero of=./test count=10000 bs=512
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.047248 s, 108 MB/s

MACのSSDは書き込み136MBくらいですね。

NAS(テラステーション)にも書き込めている。

takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=10000 bs=512
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.947956 s, 5.4 MB/s

takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=1000 bs=1024
1000+0 records in
1000+0 records out
1024000 bytes (1.0 MB) copied, 0.335269 s, 3.1 MB/s
takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=1 bs=1048576
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.833249 s, 1.3 MB/s
takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=10 bs=1048576
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 3.38667 s, 3.1 MB/s
takuya@air:/Volumes/takuya$ dd if=/dev/zero of=./test count=100 bs=1048576
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 30.6982 s, 3.4 MB/s

テラステーション遅い・・・3MB/s

同じようにすればUSBメモリも測定できる。

読み込みは?

なんかおっきいファイル作って

dd if=/path/to/sample_file of=/dev/null

で出来るんじゃないの?

参考資料

同じ事を考えている人がいる。

【ただの独り言】HDDの速度計測 for Linux - 糸瓜京の日記

あなたと私のインナースペース - ddでHDDの平均書き込み速度を測定する。

UNIXの部屋 コマンド検索:dd (*BSD/Linux)

phpのSqliteでの「謎」のエラー

PHPのSQLiteには謎のエラーがあって、

unable to open database file

になります。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 14 unable to open database file

と出てきます。しかし・・・

[mi@www-mini db]$ ls -alt
合計 92
drwxrwxrwx  9 root root  4096  223 19:58 ..
drwxrwxr-x  2   mi   mi  4096  221 22:57 . #←これが原因
-rwxrwxrwx  1   mi   mi 36864  221 22:57 development.sqlite3
-rwxrwxrwx  1   mi   mi 29696  211 00:57 development.sqlite3.default

ファイルは777なんですね。でも動かない。


ディレクトリにも書き込み権限が必要

こっちは動く。

ファイルだけでなく、ディレクトリにも書き込み権限が必要。

[mi@www-mini db]$ ls -alt
合計 92
drwxrwxrwx  9 root root  4096  223 19:58 .. 
drwxrwxrwx  2  mi   mi  4096  221 22:57 .#←このパーミッションの注目
-rwxrwxrwx  1   mi   mi 36864  221 22:57 development.sqlite3
-rwxrwxrwx  1   mi   mi 29696  211 00:57 development.sqlite3.default

”. ”のパーミッションに注目! "drwxrwxr-x" → "drwxrwxrwx"だと書き込める。

あれれ、ディレクトリって、"rwx"の"x"さえアレばいいんだよね。って思ってたら、ディレクトリに書き込み権限つけたら治った。

まさか。まさかですよね。これはバグ?なのかな?

watch コマンドのオプション

watchコマンド:コマンドを定期実行し結果を淡々と表示するコマンドで--differences=cumulativeとすれば、毎秒変わっていくところがハイライトされて便利なんですが。

--differences=cumulative が長くて覚え得られないと思ってたら、

-dc でも同じらしい

watch -n 1 -dc date

Macの場合はbrewで入るよ

brew install watch

SQLiteでテーブルヘッダを表示する。

カラムを使って表示すると、JOINの時とかに便利でしょ。

.headers ON

設定前

sqlite> SELECT *  from B inner join C on c.id = b.c_id inner join D on c.d_id = D.id ;

20|100||100|1000||1000|1

設定後

sqlite> .headers ON
sqlite> SELECT *  from B inner join C on c.id = b.c_id inner join D on c.d_id = D.id ;

id|c_id|date|id|d_id|price|id|a_id
20|100||100|1000||1000|1

ちょっとだけ見やすくなる。

Alternativeに項目を追加する

alternatives を使って使うプログラムを切替えるにはの続き。

切替する選択肢を増やしたい。

alternativesを使うと同じ名前の別プログラムを切り替えられる。これにプログラムを追加したい。

記述方法

alternatives --install $PATH_TO_LINK $ALTER_NAME $PATH_TO_REAL_PATH $PROIORITY

現在の設定。

takuya@letsnote:~$ update-alternatives --config gcc

1 プログラムがあり 'gcc' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/bin/gcc-4.exe


Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:

追加してみる。

追加

takuya@letsnote:~$ alternatives --install /usr/bin/gcc.exe  gcc  /usr/bin/gcc-3.exe 10

追加後

takuya@letsnote:~$ update-alternatives --config gcc

2 プログラムがあり 'gcc' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/bin/gcc-4.exe
   2           /usr/bin/gcc-3.exe


Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:

無事追加された。OK


まとめ

 /usr/sbin/alternatives --install /usr/sbin/sendmail mta /usr/sbin/sendmail.postfix 30
                --install [バイナリのシンボリックリンク名][名前][指定したいバイナリ本体][優先度]



参考資料

http://d.hatena.ne.jp/tkkochan/20080204/1202092154

MacでRPMファイルを展開するには

RPMファイルを貰ったけど、いちいちRedhatCentOS)に転送して展開するのも馬鹿らしい。

rpm2cpioで形式を変換したらいい。

brewにrmpをcpioに変換

brew install rpm2cpio

展開。

rpm2cpio hoge.rpm | cpio -id


以上。簡単です。

2012/02/29

XMLを整形(tidy)して読みやすく、貼りつけやすくする。

XMLをもらったけど、階層ツリーがむちゃくちゃでわからない

tidy -utf8  -i --input-xml true  --indent-cdata true  ./sample.xml 

しかも昔にエントリ書いてるし。www



tidy のインストール。

mac
はじめから
linux
debian gnu/linuxは aptで
windows
コンパイル済みバイナリをどこかでダウンロードしてくる
cygwin
setup.exeや apt-cyg で

XMLの整形

tidyでxmlを整形するには・

 -xml オプションを付ける。

tidy -xml ./sample.xml

または tidy-configを使う。( --input-xml true)

出力

takuya@air:~/Desktop$ tidy -q -xml sample.xml  | head
line 164 column 40 - Warning: replacing invalid character code 151

<?xml version="1.0" encoding="utf-8"?>
<PMML version="4.0">
<Header copyright="BMRC">
<Application name="mclassify" version="1.0" />
<Timestamp>15 Jun 2010 17:54:26</Timestamp>
</Header>
<DataDictionary numberOfFields="7">
<DataField name="&#230;&#176;&#8212;&#230;&#184;&#169;"
optype="continuous" dataType="double"></DataField>
<DataField name="&#230;&#185;&#191;&#229;&#186;&#166;"

あちゃっ文字化けだ。*1


文字コードを指定する。


line 164 column 40 - Warning: replacing invalid character code 151

のように文字コードに問題があるときはちゃんと指定する。

 -utf8オプションを付ける。

結果

takuya@air:~/Desktop$ tidy -q -utf8 -xml sample.xml  | head
<?xml version="1.0" encoding="utf-8"?>
<PMML version="4.0">
<Header copyright="BMRC">
<Application name="mclassify" version="1.0" />
<Timestamp>15 Jun 2010 17:54:26</Timestamp>
</Header>
<DataDictionary numberOfFields="7">
<DataField name="気温" optype="continuous" dataType="double">
</DataField>
<DataField name="湿度" optype="continuous" dataType="double">

インデントを指定する。

takuya@air:~/Desktop$ tidy -q -i -utf8 -xml sample.xml  | head
<?xml version="1.0" encoding="utf-8"?>
<PMML version="4.0">
  <Header copyright="BMRC">
    <Application name="mclassify" version="1.0" />
    <Timestamp>15 Jun 2010 17:54:26</Timestamp>
  </Header>
  <DataDictionary numberOfFields="7">
    <DataField name="気温" optype="continuous" dataType="double">
    </DataField>
    <DataField name="湿度" optype="continuous" dataType="double”>

余計なメッセージを消す。

標準エラーに出力される、メッセージがうざったいので消す。

 -q : quiet 黙れ。 

出力ファイルを指定する。

単純にリダイレクをする。

tidy -q -i -utf8 -xml sample.xml  > neat.xml

または出力ファイルを指定する。

tidy -q -i -utf8 -xml  -o neat.xml sample.xml 

このときの注意点は、 -o text.xmlを sample.xml(入力ファイル)より先に指定する。

この指定がうざったい・・・

インデントの細かいオプションをつける。

タグの階層でインデントをする。

tidy -utf8  -i --input-xml true  --indent-cdata true  ./sample.xml 

さらに属性でインデントもつけたい。

tidy -q -utf8  -i --input-xml true  --indent-cdata true --indent-attributes true ./sample.xml  

これで、インデントが属性にも適用されて読みやすくなる。

出力結果。

takuya@air:~/Desktop$ tidy -q -utf8  -i --input-xml true  --indent-cdata true --indent-attributes true ./sample.xml  | head -n 20
<?xml version="1.0" encoding="utf-8"?>
<PMML version="4.0">
  <Header copyright="BMRC">
    <Application name="mclassify"
                 version="1.0" />
    <Timestamp>15 Jun 2010 17:54:26</Timestamp>
  </Header>
  <DataDictionary numberOfFields="7">
    <DataField name="気温"
               optype="continuous"
               dataType="double"></DataField>
    <DataField name="湿度"
               optype="continuous"
               dataType="double"></DataField>
    <DataField name="天候"
               optype="categorical"
               dataType="string">
      <Value value="晴れ" />
      <Value value="曇り" />
      <Value value="雨" />

--indent-xxxなどのオプションを全部みたい。

tidy -show-config 

で設定項目が分かる。




ま、こんなコトしなくても、見るだけなら、Opera/Safari/Firefoxなどブラウザで開くのが手っ取り早いんだけどね。

*1:文字化けというより、XMLのUTF8の文字符号になってるんだけどさ。

2012/02/28

ffmpeg で指定時間だけエンコード

ffmpeg で、指定時間だけエンコードする。

-t オプションを使う

./ffmpeg/ffmpeg -y    -i out.mp4 -vcodec libx264 -acodec libfaac -t 00:00:03  out.ts

この場合3秒


ffmpeg で、開始時間から、指定時間までだけエンコードする。

-ss オプションを使う

./ffmpeg/ffmpeg -y    -i out.mp4 -vcodec libx264 -acodec libfaac -ss 3 -t 00:00:33  out.ts

この場合3秒〜33秒までをエンコード

ffmpeg をcygwinでコンパイルする。

Corei7マシンをwindowsに使っちゃったので、しかたなく、cygwin利用を継続している。最近はSetup.exeでCygwinを最新版にしたらなんかコンパイルが速いので、FFMpegをコンパイルをしてみた。

入れたパッケージ

多分これくらいアレば大丈夫。(なんか余計なものもおおいけど)

apt-cyg install autoconf automake binutils gcc gcc-core gcc-g++ gcc-mingw gcc-mingw-core gcc-mingw-g++ gdb gettext gettext-devel git libgcrypt-devel libiconv libtool make mingw-runtime nasm patchutils pkg-config subversion ncurses expat libgcrypt curl wget zip unzip

コンパイルの流れ

  • ビルド用のGCCとか準備。
  • 必要なコーデックのライブラリを準備
  • ffmpegをインストール

libx264のインストール

cd ~
git clone git://git.videolan.org/x264
cd x264
./configure --prefix=/usr --enable-shared
cd ~

lameのインストール

wget -O - 'http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.4.tar.gz | tar zxvf -
cd lame-3.99.4/
./configure   --prefix=/usr && make  &&make install

libfaacのインストール

wget -O - http://downloads.sourceforge.net/faac/faac-1.28.tar.gz | tar xzvf -
cd faac-1.28/
chmod +x ./bootstrap
./bootstrap && ./configure --prefix=/usr 
make && make install
cd ~

faacだけはgcc4でコンパイルしてる。

ffmpegをインストール

cd ~
git clone --depth 1 git://source.ffmpeg.org/ffmpeg
cd ffmpeg 
./configure --prefix=/usr/local  --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac  --enable-libmp3lame  --enable-libx264 
make && make install 

できたーーーーーーーーー!!

cygwinビルドと、既存のmingwとの比較。

いまのffmpegは。windows版imagemagickについてきたものを使ってる。

takuya@host:~/ffmpeg$ which ffmpeg
/cygdrive/c/programfiles/ImageMagick-6.6.7-Q16/ffmpeg

オプション

takuya@host:~/ffmpeg$ ffmpeg.exe
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

FFmpeg version SVN-r23418, Copyright (c) 2000-2010 the FFmpeg developers
  built on Jun  2 2010 04:12:01 with gcc 4.4.2
  configuration: --target-os=mingw32 --enable-runtime-cpudetect --enable-avisynth --enable-gpl --enable-version3 --enable-bzlib --enable-libgsm --enable-libfaad --enable-pthreads --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libmp3lame --enable-libopenjpeg --enable-libxvid --enable-libschroedinger --enable-libx264 --extra-libs='-lx264 -lpthread' --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-librtmp --extra-libs='-lrtmp -lssl -lcrypto -lws2_32 -lgdi32 -lwinmm -lcrypt32 -lz' --arch=x86 --cross-prefix=i686-mingw32- --cc='ccache i686-mingw32-gcc' --enable-memalign-hack
  libavutil     50.16. 0 / 50.16. 0
  libavcodec    52.72. 1 / 52.72. 1
  libavformat   52.67. 0 / 52.67. 0
  libavdevice   52. 2. 0 / 52. 2. 0
  libavfilter    1.20. 0 /  1.20. 0
  libswscale     0.11. 0 /  0.11. 0
Use -h to get full help or, even better, run 'man ffmpeg'

今回ビルドしたffmpeg

takuya@host:~/ffmpeg$ ./ffmpeg.exe
ffmpeg version git-2012-02-27-a4c22e3 Copyright (c) 2000-2012 the FFmpeg developers
  built on Feb 28 2012 04:01:16 with gcc 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
  configuration: --prefix=/usr/local --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libx264
  libavutil      51. 41.100 / 51. 41.100
  libavcodec     54.  4.100 / 54.  4.100
  libavformat    54.  1.100 / 54.  1.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 62.101 /  2. 62.101
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  7.100 /  0.  7.100
  libpostproc    52.  0.100 / 52.  0.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg’

若干コーデックが減ってるけど、まぁそりゃ入れてないので仕方ない。いままではビルドなんて無理だろう。と諦めてたけど、新しいCygwinとCorei7パワーで30分もかからない。便利〜。

2012/02/26

触れてはいけないこと。

 些細な一言が他人を傷つけたり、些細な一言が心に刺さって、傷が深く立ち上がれない。そんな経験は誰しもあると思います。僕もたくさん経験してきました。言いたい放題言ってるわけだし、他人を傷つけたり、問題を起こすこともある。たくさんの人を傷つけたり、たくさん傷ついた。

言葉はナイフ。

 言葉はナイフです。言葉は世界を切り取り、理解の補助する。言葉がなければ何も生まれない。ナイフを他人に向けないよう教わるのに、僕らは言葉を他人に向けないよう、明確に習うことはないかな。言葉は便利な道具です。使い方を誤ると、心に深く突き刺さる。

殴ってもいい場所と、ダメな場所。

 喧嘩はしてもいい。でも目を狙っちゃいけない。頭を殴っちゃいけない。そうならなうよね。なぜ目を狙っちゃいけないか?それは取り返しがつかないからだ。簡単に傷つけられるのに、永遠に取り返しが付かない。骨は折れても元通り。でも目はダメだ。拳は武器だ。凶器だ。そう身体の使い方を習うよね。小さな力で相手を再起不能にできちゃうんだから。。

発していい言葉と、ダメな言葉。

 口喧嘩もしてもいい。でも、相手の内面やコンプレックスをついちゃダメだ。性格を否定したらダメだ。なぜか、それは取り返しがつかない。自尊心を傷つけたら元通りにはならない。コンプレックスを増やすだけだからだ。そうすると人間関係も壊れてしまう。「食べ過ぎたらダメだよ。」この程度ならいい。でも「食べ過ぎて我慢出来ない、お前はダメだ。」「我慢のないやつは最低だ。」と言っちゃだめだ。言葉も凶器だ。身体の使い方を習うように、言葉の使い方を学ばなくちゃいけない。

触れてはいけないこと

 相手の身体のデリケートな部分に触れたらダメだよね。相手が大事してる部分に触れてはいけないこと。言葉だって同じだ。相手の大事にしているもの、大切にしている思い出に安易に触れちゃいけない。相手の思い出に触れる言葉は慎重に、それは相手の外性器を触るように慎重に。距離を縮めるんだよ。

心は目に見えない。

 だから我慢しなくていいんだよ。言われたときは、相手の見えるよう主張しよう。心が辛い時は我慢しちゃダメ。ちゃんと目に見える形で主張しよう。言葉以外もアリだ。相手の些細な一言が突き刺さったら、ちゃんとそれを眼に見えるように態度にだそう。そういう我慢はしなくてもいい。でもね、出来る限り笑顔でいてほしいな。笑顔で不快な思いをしたことを伝えるのが理想だよ。笑顔で拒否の気持ちを伝えられたら、その時にオトナとして一人前らしいよ。

言葉は自分に向けよう。

 たとえば、相手が食欲を我慢出来ない人だとしても、「我慢出来ないの?」って聞くのではなく、「食べ過ぎちゃうアナタを見ていて心配だな。心が痛いな。」なんて言えたらいいよね。夜更かししちゃう人がいたら、「眠れないの?そっか。それは不安が募るよね、まぁ眠くなるまで一緒にいるわ」と言えばいい。たとえ先に寝ちゃったとしても、心は何故か温かい。俺はガチホモかと思ったほど、そいつの存在が有難かった。

言葉の使い方を学ぼう。

 「何大卒ですか?」なんて聞くバカが居る。「部活とかやってました?」って聞けばいい。相手に学歴コンプレックスがあったり、望んで無い大学進学だってあるよね。だから遠回しに聞くんだ。「なんか筋肉多いよね。部活とかやってました?」って。もし「はい、大学時代にアメフトを。」って回答があれば、大卒ってわかるよね。質問は上手にやろう。知りたいことを知るために質問は別にストレート聞く必要はない。

だけど、想像と、読み取ることは違う。

 蛇足だけど、想像をふくらませたらいけない。相手は「大学時代にアメフト」と答えただけで、卒業したとは言ってない。だから質問を注ぐんだ「最近はやってないんですか?」って、「卒業してからはやってないなぁ。卒業ぎりぎりまでやってましたよ。単位やばかった」って答えがあれば、卒業したとわかる。うっかり前の質問で、早とちりで卒業と想像してたら、中退のコンプレックスを啄いちゃうかもしれない。言葉と質問は武器だから上手に使うといい。


だけどもし傷つけたら?

 すぐに謝ろう。すぐにだ。その場で。たとえ仲裁があってその場が収まっても、相手に直接謝ろう。


なんでコイツ怒ってるかわからないんだけど。

 それもすぐに、笑顔で「ごめんね。」という。

なんでこれくらいで怒るの?

 いやそれは相手にとって、触れてほしくないことだったんだよ。だからまず謝ろう。

些細な冗談でマジギレして空気壊すなよ。

 いやそれは、相手にとって、言われたくなかったことだから、空気を盾にしてもだめだ。相手に空気嫁というまえに、自分の行動を振り返えるほうが建設的かな。それくらいでマジギレすんなよ。と思う前に、「ちゃんと目に見える形で表現してくれてよかった」と思うほうが建設的。


時に言葉は凶器だから。

 基本笑顔。そしてコンプレックスには触れない。別の質問で代替できるなら、ストレートには聞かない。そして笑顔で。これが日本という人口高密度社会で生きる上の知恵だとおもう。欧米人から見ると婉曲的で面倒かもしれないけど。それは社会と人間関係をうまく回す知恵なんだよ。


部活を聞くテクニックは。

日野原重明先生の本から習いました。こうやって「ワンパターンな質問」を飛躍的に膨らますことが出来るよ。「大学は?研究は?どこ出身?何が好き?」なんて質問は飽き飽きだよねー

ワンパターンな質問になってないかい?質問が何故必要か?その質問は別の質問で代替できないかな?。ずっと遠まわしにでもいいんだ。聞くんだったら色々な質問で代替してみよう。そのほうが話が膨らむよ。

コンプレックスを煽っちゃいけない。

誰しもコンプレックスや劣等感はあるし、自尊心がなければ死んでしまう。「泥棒といえば人は盗む。」これが真実。出来ない出来ないって言い続けたら本当に出来ない子になる。僕の友人のある人は、無理して身長を伸ばそうとしたし。*1ある人は、空を飛ぼうとした、ある人は、献血に挑戦したし、ある人は電車に勝負を挑んだ。強くないのに強くなろうとして無茶な勝負をしたもんだ。ある人は、早く良くなろうといつもより多めに薬を飲んだ。みんな早く良くなって認めてもらおうと必死だっった。

 コンプレックスを刺激しちゃダメなんだよ。何より怖いのはコンプレックスが何処にあるか見えないことなんだ。だから傷つけたらすぐに謝ろう。出来ることなら傷つけないように慎重に言葉を選ぼう。

 貴方がつらい言葉を言われたら、その場で脊髄反射して拒否を明確にしよう。目に見えない心だから、ちゃんと眼に見えるよう主張してみよう。我慢しちゃダメ。我慢して考えて悩むくらいならその場で喧嘩したほうがすっきりするから。

 そしてもし、他人の主張を見かけたら、「よく言ってくれたね」って受け入れてあげて欲しい。どうしてそんな事言うの、言い訳すんなとか、空気嫁とか、我慢しろとか言っちゃだめだよ。コンプレックスを煽ると人はすぐにコンプレックスを克服するために、無茶をするからね。

甘えじゃない。

 甘えじゃない。若い人には辛く当たることが教育だと勘違いしてる人がよくいる。アレさ家族がいる若い人ならいいんだよ。仕事でいくら厳しいことを言われてもちゃんと帰る場所があって、ちゃんと家族がいれば。自尊心はちゃんと貯金されるから。仕事で自尊心をすり減らそうが、またきっと貯金して出なおしてくるんだ。だから若い人に厳しく言うと育つんだ。それは「厳しく」が有効じゃなくて、若いうちは家族のサポートがあるからなんだよ。よく思い上がってる人がいるけど、、、ね






 

*1:アレは本当に悲しかった。

2012/02/25

サンプルで使って慣れる。ffmpeg の使い方。

ffmpeg って色々出来るんだけど、オプションが慣れないとわからないというか。コンテナとかフォーマットとかコーデックとか色々あってね。ちょっと取っ掛かりが分かり難い。僕も色々やってみたけど、「習うより慣れ」でした。

ffmpegの基本

ffmpeg -i 入力ファイル名   その他いっぱいオプション  "出力ファイル名.拡張子"

です。最初は上記の構文だけ頭に入れておきます。ffmpeg は使いかたも概念もややこしいので、とりあえずパターンで覚えて、その後に理屈を攻めていけばいいさ


本エントリの目標

基本的な使い方を覚えて、2パスで高画質エンコード*1のオプションを暗記する。地デジのTSをエンコード出来るように。

2パス エンコードまでやります。


ffmpeg で動画を変換してみる。

適当な動画を一本用意する。とりあえずニコニコ動画から、なんかFLVを一本ダウンロードして用意。

あんまり長いファイルだと、変換時間が長くて勉強テンポが悪い。短すぎるとわかりづらいので1分くらいの動画でいい。

ffmpegのインストールは別に何でもいい。OSに入ってるものや、適当にダウンロードしたバイナリではじめるといいさ。

flvをmp4にに変換する

ニコニコ動画のflvをMP4形式に変換してみます。

ffmpeg -i sm1715919.flv out.mp4

mp4をflvに

逆に、MP4のファイルをflvに変換してみます。

ffmpeg -i sm1715919.mp4 out.flv

mp4 を movに

MP4形式をQuickTimeのMOV形式に変換してみます。

ffmpeg -i sm1715919.mp4 sm1715919.mov

形式の変換ができるようなった?

形式の変換のまとめ

ffmpeg -i 入力ファイル名  " 出力ファイル名.拡張子"

の「拡張子」で自動で決定されるの。僕らは、拡張子だけ意識していればいい。

拡張子とコンテナ。

実は先ほどの例、これらはコンテナを変えた。動画・音声を変換するオプションは指定してない。*2


ffmpegで動画の情報を見る。

動画形式が変換されたら、どの辺が変わるか。それを見てみます。

動画の情報を見る。
 ffmpeg -i ファイル名 

flvの情報を見てみる。

まず元になった動画のファイル形式を見てみる。

ffmpeg -i sm1715919.flv
(ry
    Stream #0:0: Video: flv1, yuv420p, 320x240, 200 kb/s, 29.97 tbr, 1k tbn, 1k tbc
(ry
    Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s

movファイル

flv→movに変換したものを見てみる。

 ffmpeg -i sm1715919.mov
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240, 137 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 128 kb/s

mp4ファイル

flv→mp4に変換したものを見る

ffmpeg -i sm1715919.mp4
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 214 kb/s, 29.97 fps, 29.97 tbr,            
  Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 64 kb/s

mpeg2に変換したもの

ffmpeg -i sm1715919.mpeg
    Stream #0:0[0x1e0]: Video: mpeg1video, yuv420p, 320x240 [SAR 1:1 DAR 4:3], 104857 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc
    Stream #0:1[0x1c0]: Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s

情報の読み方。

Streamで始まる項目が音声・動画の形式。

    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 214 kb/s, 29.97 fps, 29.97 tbr,            
  Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 64 kb/s

Video:XXXXのXXXが動画のコーデック

Audio:YYYYのYYYYが音声コーデック


コーデックとコンテナに付いての簡単な説明。

あくまでイメージですが、、、こんな感じ。

file=¥int_0^x¥{video(t)+audio(t)}dt

動画と音声を数秒ごとに分割して、数秒単位に動画+音声が繰り返し現れる。ってイメージ。

この時の切り方、ファイルの折り返し方を定義したのがコンテナ(数式の¥int_0^tdtの部分)



ffmpeg で動画ファイルから音声を抜き出す

Mp3を動画ファイルから作ります。

ffmpeg -i sm1715919.mp4 sample.mp3

出来上がり。簡単ですねー。

ファイルをチェックしてみる。

takuya@air:~/Desktop$ ffmpeg -i sm1715919.mp4 sample.mp3
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s

ちゃんとMp3だけのファイル。簡単ですねー


音無しの絵の動画だけにする。

逆に、音無し。絵だけにする。動画から音を消してしまう。

ffmpeg -i sm1715919.mp4 -an -vcodec libx264 test-noaudito.mp4 
-an
audio none とかそういうこと:

これで音声をカットして、動きだけの動画ファイルにする。


画面サイズを変える。

元ファイルがこれ

f:id:takuya_1st:20120226003938j:image(377fc0e4a622e8f01669f72de39def5f)

フォーマット(コンテナ)はそのままに画面サイズを変える。

拡大してみた
ffmpeg -i sm1715919.mp4 -s 640x480 out.mp4

結果

f:id:takuya_1st:20120226004006j:image(d848c7a0d43044a4b16d5754856b4997)

縮小してみた
ffmpeg -i sm1715919.mp4 -s 160x120 out.mp4

f:id:takuya_1st:20120226003950j:image(73af0174edf49db3f3b4f6fd32710699)


これも簡単ですね。

ビデオ・コーデックの変換

ファイルのコンテナはそのままに、ビデオのコーデックだけを変換します。

ffmpeg -i sm1715919.mp4 -vcodec libx264 test.mp4

mp4コンテナのビデオ部分は、Mp4コーデックやH264コーデックでもどちらでも構わないので、変換してみる。

変換前
takuya@air:~/Desktop$ ffmpeg -i sm1715919.mp4
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 214 kb/s, 29.97 fps, 29.97 tbr,        
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 64 kb/s
変換後
takuya@air:~/Desktop$ ffmpeg -i test.mp4
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 120 kb/s, 29.97 fps, 29.97 tbr, 30k tbn,       
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 128 kb/s

ビデオコーデックが変換されている


最後に、ビットレート

ビットレートはkbpsで表現する。違い、一秒再生するのに何ビットいるか

つまり平均何ビットあれば一秒再生できるかってことらしい。

通信とは単位が似ているが・・・ちょっと違う。



2pass はVBRで。

2パスとは、2回エンコードして、2回目に目標のビットレートで最高の画質を追求する

CBRだと無駄が多い。

VBRで圧縮するときに静止してる場面を固定するから、2回やったほうがいい。インターレースをいっぱい作る。

まぁ、とにかく一回エンコードしたものを、可変レートのために読み込みながらもう一回エンコードかけて圧縮率を上げるってことで。

画質が最高とは、同じファイルサイズでも、より高画質。ってことです。

動画を2パスでエンコードすることで画質の向上を狙います。そのかわり処理時間は約2倍になります。

http://nicowiki.com/エンコード設定(中画質〜高画質).html#teeca4db]

音声と動画を別々にエンコードするらしいよ。


MPEG2 TSを変換する。

2パスで変換する。

1パス目
ffmpeg -i $INPUT -vcodec libx264 -an -pass 1 -passlogfile "./pass.log" -s 1280x720 test.mp4
2パス目
ffmpeg -i $INPUT -vcodec libx264  -b:v 500k -acodec libfaac -pass 2 -passlogfile "./pass.log" -s 1280x720 test.mp4

ポイント、2パス目にはVBR(可変レート)のレートを指定する事になる。ビットレートの目標値を目指してファイルを圧縮。


500kだと画面も明らかに汚い。

画質を上げてみた。
time ffmpeg -i $INPUT -vcodec libx264 -b:v 5000k -acodec libfaac -pass 2 -passlogfile "./pass.log" -s 1280x720 test.mp4

5Mでやり直してみよう。

時間は掛かったけど、ファイルサイズの割にすごく綺麗です。

出来上がりは、

500k   で   27MB
5000k で 180MB

でした。

変換元ファイルからして25%程度に減ったのでとてもいいと思います。*3

ただし、サンプルがアニメで動きが少ないので、圧縮率は高いと思います。

Ubuntuでh264のffmpegを使う。

標準仕様のffmpeg は何も入ってないのです。

ubuntuのffmpegで、h264動画をつくろうとしたら、できないって言われたので、コンパイルだわ。ビルドしてインストール。でもやり方面倒だよね。ってこと調べた

ffmpeg を non-freeでビルドする方法

参考資料にすげー丁寧に書いてあった。

0.The instructions on the page are for Ubuntu Oneiric Ocelot 11.10, Ubuntu Natty Narwhal 11.04 and Ubuntu Maverick Meerkat 10.10. Separate instructions are also available for older, supported releases:

http://ubuntuforums.org/showthread.php?t=786095

自分でビルドすればいいんです。

ビルド専用のスクリプト書いてみた。

urlの記事を参考に、シェルスクリプトにまとめておいた。

ffmpeg_install.sh

  1 ##uninstall
  2 sudo apt-get remove ffmpeg x264 libx264-dev -y
  3 ## install build-tools and library
  4 sudo apt-get update
  5 sudo apt-get install build-essential checkinstall git libfaac-dev libjack-jackd2-dev \
  6   libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev \
  7   libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev texi2html yasm zlib1g-dev
  8 #install x264
  9 cd
 10 git clone git://git.videolan.org/x264
 11 cd x264
 12 ./configure --enable-static
 13 make
 14 sudo checkinstall --pkgname=x264 --pkgversion="3:$(./version.sh | \
 15     awk -F'[" ]' '/POINT/{print $4"+git"$5}')" --backup=no --deldoc=yes \
 16     --fstrans=no --default
 17 #install ffmpeg
 18 cd
 19 git clone --depth 1 git://source.ffmpeg.org/ffmpeg
 20 cd ffmpeg
 21 ./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb \
 22     --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 \
 23     --enable-nonfree --enable-postproc --enable-version3 --enable-x11grab
 24 make
 25 sudo checkinstall --pkgname=ffmpeg --pkgversion="5:$(date +%Y%m%d%H%M)-git" --backup=no \
 26   --deldoc=yes --fstrans=no --default
 27 hash x264 ffmpeg ffplay ffprobe
 28
 29
 30

実行結果

(ry
tripping ELF binaries and libraries...OK
manページを圧縮..OK
ファイルリストを作成..OK
Debianパッケージを作成..OK
Debianパッケージをインストール..OK
tempファイルを削除..OK
doc-pakディレクトリを削除..OK
temp dirを削除..OK
**********************************************************************
 Done. The new package has been installed and saved to

 /home/takuya/ffmpeg/ffmpeg_201202232008-git-1_amd64.deb

 You can remove it from your system anytime using:

      dpkg -r ffmpeg

**********************************************************************

インストールされた先。

/usr/local/bin/ffmpeg

に新しいイケテルffmpegがインストールされてます。


楽ちんですね。

*1:高画質ってのは、同じファイルサイズなのにスゲー綺麗ってことで、画質が向上するってことではないんですよ

*2:実際にはコンテナに従って決めるんだけど、一応そういうことにしておいて。

*3:TSの1440を1280にしてるからそれだけでもかなり落ちてるけどね。

2012/02/24

ゆうちょ銀行もスクレーパーかけたら、色々終わってた。

パスワードの話はこっち→ゆうちょ銀行のパスワード紛失したので、再発行手続したら、コーヒー吹いた話。

ゆうちょ銀行のスクレーパー

ゆうちょ銀行のタイムアウトがきついのと、「ホームへ」ボタンを押さないとセッションエラーになるので頭に来た。ブラウザ戻るボタン。押させろよ。

ちょっと本気スクレーパーを書いてやった。スクレーパーを書いて気づいた。ゆうちょ銀行のオンラインは色々終わってた。(後述)

ゆうちょ銀行は

ゆうちょ銀行にはログインのために以下の3つが必要になる。

  • ID 1234-5678-09876
  • 合言葉 [質問,回答][質問,回答][質問,回答]
  • パスワード

リクエストの仕組み。ボタン押した時にFormにActionとhidden eventを入れてSubmitする。

これだけわかればあとは簡単。

サンプル

require 'yucho_bank.rb'

cli = YuchoBank.new
#お客様番号
cli.id="6666-9999-33433"
#合言葉と回答リスト
cli.passphrase_list["初恋の人の名前は何ですか?"] = "恋するために出会うために来ていく服がない"
cli.passphrase_list["初めて映画館で見た映画のタイトルは何ですか?"] = "映画館行ったこと無い"
cli.passphrase_list["母親の旧姓は何ですか?"] = "天皇家には、苗字はありません"
#ログインパスワード
cli.password = "****password****"
cli.login
cli.go_page("現在高照会")
puts cli.current_page.search("xpath to amount")
cli.go_home()
cli.go_page("更新")

こんな感じ

ゆうちょ銀行のスクレーパー

yucho_bank.rb

ソースコード載せるつもりだったけど、パスワード関連の話のほうが面白いので、Qiitaにとりあえず、なげた。

ゆうちょ銀行のタイムアウト早すぎだとおも

いくらなんでも、早すぎだと思う。

現金を動かすトランザクション中にいるならともかく、残高照会で期間を選んでいるうちにタイムアウトするぞ。馬鹿か。

そういう場合は、とりあえず、タイムアウトさせずに、ログイン後のホームへ押し戻しておけばいいものを。


速すぎるタイムアウトにセキュリティ上の意味はない。

「ユーザーがパスワードを暗記してくれる」という反復学習効果しか期待できない。

そして暗記したパスワードは変更しなくなるので、むしろ恐ろしい。

そして暗記したパスワードは話のネタに、安易に教える可能性が高い。

セキュリティとか以前に終わってる

終わってるんですよ。色々と

意味がわからない。ログイン画像。

セキュリティ上の意味は全くない。。。。

これ何の意味があるのか全く理解出来ないんだけど。


一人で複数の口座を持っているときに区別が付くかもしれない

ゆうちょ銀行の公式の解説

公式の解説によるとこうだ。

f:id:takuya_1st:20120224155808j:image(スクリーンショット 2012-02-24 15.50.17)

画像の登録をしていただきますと、ログインパスワードを入力する画面上に、ご登録いただいた画像が表示されます。その画像がお客さまご自身で登録したものであれば、ゆうちょダイレクトの正規の画面です。

なるほどー、画像の表示に認証してるんですね。


ってことで画像のパスを見てみたよ

f:id:takuya_1st:20120224155814j:image(スクリーンショット 2012-02-24 15.57.34)

<img src="pages/etc/image/TravelCulture/TC19/2005_08_12_415.jpg" alt="旅行・文化 40" height="100" width="100">

え、GET引数持ってないの?そうか、セッションIDで見てるんだね。じゃぁ画像直アクセスは見られないんですよね。



実際の画像URLはこちら。

https://direct2.jp-bank.japanpost.jp/tp1web/pages/etc/image/TravelCulture/TC19/2005_08_12_415.jpg

見れる。サンプル


アカンわ。クズだ。


IMGタグに、丁寧にALTまで入れてる時点で怪しいと思ったんですよねぇ。

ログインシールってのは「Cookieの有無が一目でわかる」からフィッシング詐欺防止に役立つんじゃなかったっけ?

むぅ


画像のURLはすべて同じで、ユーザー毎(Cookie毎)に違う画像を出すなら、意味はまだある。

あと、質問を自分で決められないのがアウトだ。

そして質問内容が失礼すぎる。「母親の旧姓は?」とか、両親が揃ってるイイところのお嬢ちゃんとお坊ちゃんがそのまま、大きくなって大企業に就職して自分の常識を疑ってない好例だよね。母親の旧姓とは大変失礼だと思いました。



ゆうちょ銀行もクズだ


これが日本の技術力()だよ。

第三次オンライン世代の団塊世代はとっと引退しろ。インターネット世代に変えておけ。

まだまだある、ゆうちょ銀行のヤバい点

更に続くよ。

ゆうちょ銀行のパスワード紛失したので、再発行手続したら、コーヒー吹いた話。

ゆうちょ銀行のパスワード紛失したので、再発行手続したら、パスワード印字した藁半紙が届いた。\(^o^)/

ゆうちょ銀行のスクレーパーを書くに当たり、パスワードと合言葉がわからなかったので初期化をお願いした。

初期化をお願いしたのに、窓口のお姉さんに「再通知ですね!」とか言われた。きっと言い間違いだろうと思ってたら、本当にパスワードが平文で届いた。

パスワードを忘れたので郵送通知をお願いした。

前のパスワード印字した藁半紙が届いた。\(^o^)/

おお紙よ。あなたは覚えていらっしゃった。忘れたパスワードが印字されて郵送されてきた。

マジでドン引きしたわ。

忘れたパスワードが送られてきたよ。

f:id:takuya_1st:20120224161457j:image(パスワードが印字されて届いた。)

f:id:takuya_1st:20120224161512j:image(暗証番号も印字されて届いた。 )

さすがにこれはドン引きしたわ。

これ情報処理センタのバイトが手作業で封してるんですよね・・・

これね、紛失したパスワードが平文でそのまま届きましたよ。再発行じゃなくて、以前のものがそのまま。


郵送で送るかぁ。。。。


  • パスワードを平文で保持してる点がアウト。
  • それを印字して郵送してくる点がアウト。
  • パスワードを郵送する手続が簡単すぎるのがアウト。

配偶者のゆうちょ銀行のパスワードくらいならすぐに手に入るよ。

そこから暗証番号やら、よく使うパスワードのキーフレーズやらが漏れる。これはたまらない。


アウトだアウト。

平文で保持してる点とかそういう問題以前に、印字するわ、郵送するわ、なんだこれは。

彼らにとって照会であって再発行じゃないところ。

ただし、ゆうちょ銀行は

料金面とサービス面では群を抜いている。


18:00まで窓口を開けてる銀行が他にあるかい?

頑張れゆうちょ銀行。

で、どうすればいいの


ゆうちょ銀行からのご相談の連絡をいつでもお待ちしてますよ。f:id:takuya_1st:20120224165354j:image


サービスアドバイザとして僕を雇ってください。(違