2018-05-27 悪魔の公開メール
一体,誰に何の話をしているのやらという感じですが(ふめい)。
FFMPEGのダウンロード
FFMPEGを使う
FFMPEGの使い方を表示
ffmpeg -h
FLVファイル(たいていはH.263+MP3)をMPEG4ファイル(デフォルト設定,H.264+AAC)に変換
ffmpeg -i input.flv output.mp4
映像と音声のコーデックを明示的に指定(1)
映像:H.264,ビットレート可変,インターレス解除,60fps。音声:AAC,サンプリング周波数44.1KHz
ffmpeg -i input.flv -vcodec h264 -deinterlace -vf fps=60 -acodec libvo_aacenc -ar 44100 output.mp4
映像と音声のコーデックを明示的に指定(2)★光学メディアに焼かない場合はビットレートを固定する意味がない?ファイル容量が大きくなるだけ
映像:H.264,ビットレート固定(3Mbps),インターレス解除,60fps。音声:AAC,ビットレート固定(128Kbps),サンプリング周波数44.1KHz
ffmpeg -i input.flv -vcodec h264 -b:v 3M -deinterlace -vf fps=60 -acodec libvo_aacenc -b:a 128k -ar 44100 output.mp4
シェルスクリプト
forコマンドの使い方を表示(MS-DOS時代から進化していてかなり多機能)
for /?
カレントフォルダ内のすべてのファイルのファイル名(拡張子あり)を表示
for %I in (*) do echo %I
カレントフォルダ内のすべてのファイルのファイル名(拡張子なし)を表示
for %I in (*) do echo %~nI
カレントフォルダ内のすべてのFLVファイルをMPEG4ファイルに変換(1)
for %I in (*.flv) do ffmpeg -i %I %~nI.mp4
カレントフォルダ内のすべてのFLVファイルをMPEG4ファイルに変換(2)。映像と音声のパラメータを明示的に指定
for %I in (*.flv) do ffmpeg -i %I -vcodec h264 -deinterlace -vf fps=60 -acodec libvo_aacenc -ar 44100 %~nI.mp4
備考
- ffmpeg version N-54161-gc329713で動作確認
- FFMPEGはバージョンによってコマンド引数が微妙に違うので,微妙に実行結果が違ったり,エラーになったりする。とくにコーデック名は別名定義がごちゃごちゃとあり面倒な印象
- フレームレートとインターレースの設定は,元の映像のフレームレートに関わらず60p(プログレッシブ)で統一するのがおすすめ。バッチ処理の際にインターレースの映像が混ざっていると厄介
- DVDの映像は60i(インターレース)だがブラウン管テレビで再生するわけではないので,インターレスは不要。30pにすると「動き」に対する情報量が足りなくてカクカクした印象。場面によっては気に障ることあり。インターレスを取り除いて60pにしておくと収まりが良い
2018-05-21 最近の出来事
最近の出来事を少々。
ホムペの更新が進んでいます
「ホムペ(というかブログ)を狂ったように更新しているみたいだけど,いよいよ狂い始めたのかしら?」と思った人がいるかもしれません。
数日前から某既存製品の改修作業をしておりまして,いまデータベースを再構築しているのです。この処理には,かなり計算機資源(リソース)を消費するため,終わるまで作業用PCが使えないんですよね。
それで,ホムペ(というかブログ←2回目)の更新に優先順位が移ったというわけなのです。月曜日の朝には,平常運転に戻る予定。
某スポーツクラブの入会手続きをしてきました
先週の出来事です。今夏に新しく開店する某スポーツクラブの入会手続きをしてきました。
いま通っているところも悪くはないのですが,この機会に変えてみようかなと思って。
さて,このお店はまだ開店していないので,入会手続きは市内の雑居ビルの一室に設けられた特設会場(ただの事務所でしたが)でします。
早見優似の綺麗なお姉さんが担当してくれたのですが,このお姉さんがいまどき珍しい旧式のメタルボンドの差し歯を装着していました。差し歯の根元が真っ黒だったの。
私は,お姉さんの差し歯から目が離せなくなっていました。お姉さんは,親切にいろいろと説明していたのですが,さっぱり内容が頭に入りませんでした(どこまで本当なのやら)。
でも会員証はちゃんと入手できたので,問題ないと思います。
2018-05-20 Windows Phone―OSバージョンアップ―
1月にMADOSMA Q501を購入したというお話をしました。MADOSMA Q501は,Windows Phoneです。
そのMADOSMA Q501なのですが,先日,OSがバージョンアップしました。
私ね,てっきり「Windows 10 Update 1803」という奴になるのかなと思っていたのですが,そうではありませんでした。既存のUpdate 1703の不具合修正のみのようです。
更新後もOSバージョンは,このとおり1703のままなのです。ビルド番号は,10.0.15063.1088だそうです。
さて,今回のバージョンでは,PDFが開けるようになっていました。初期のOSバージョンでは何の疑いもなくPDFを開けていたのですが,数回の更新を経ているうちにいつの間にかPDFを開こうとするとエラーが発生して,開けなくなっていました。
今回の更新で,たびたびキーボードが表示されなくなる不具合が直っているといいなと思っているのですが,まだ修正済みかどうか分かりません。
ちなみに,Windows Phoneで最近話題になっていた不具合は,地図アプリで地図が表示されない(白地図が表示される)というものでした。この現象は4月下旬に修正されています。なぜか日本国内の地図データだけで発生する現象ということで,憶測を呼んだようです。外部から調達している地図データの契約期間が切れて,非表示になっていたという説があるくらいなのですが(契約を延長したので現在は表示できている),真相は不明です。
2018-05-19 ストロング系缶チューハイ―危険な2品―
巷で大好評(らしい)ストロング系缶チューハイ。アルコール度数が高く安価に酔えるお酒という意味で,私は密かにドキュン酒と呼んでいます。
ドキュン酒の問題点のひとつは,まるでソフトドリンクかのような味付けの製品が多いこと。お酒らしくないお酒であるがゆえに,何も考えないで飲んでしまうと,予想以上に酔いが回ってしまい後で大変なことになります。
今回は,私が最近,飲んでみた製品の中で「これは危ない」と思った2品をご紹介します。
キリン・ザ・ストロング ハードコーラ
http://www.kirin.co.jp/products/list/item/rtd/kirinstrong_cola.html
容量:350ml,購入価格:113円(税込)
コーラ味と言っても,コカコーラやペプシコーラの味とは,かなり違います。「コーラ味のお菓子の味」とでも言うのか。炭酸が抜けたコカコーラを炭酸水で割ったような味なのかも。おやおや,ますます分からなくなってきたかもしれませんね(なぞ)。
アルコール臭が若干あるため,飲酒経験のある人ならお酒だとすぐ気付きそうですが,下戸の人相手に,「ちょっと変わった味のコーラだよ」と言えば,知らないで飲んでしまいそう。危ない危ない。
話を戻して,キリンのメッツには,「コーラ味」が存在します。私はメッツのコーラを飲んだことがないので,ストロング・ハードコーラと風味に共通点があるかは不明です。
SANTORY -196℃ ストロングゼロ〈まるごと青梅〉
https://products.suntory.co.jp/d/4901777317420/
容量:350ml,購入価格:113円(税込)
「梅ジュースの炭酸割り」そのものです。グイグイ飲めてしまいます。一口飲んでみて,「これは危ない」と悟ったので,1缶(350ml)飲み干すまでに30分掛けてしまいました。休み休み飲んでいれば,そんなに酔った気になりませんので。
サントリーのストロングゼロは,ストロング系缶チューハイの元祖というか本家というか,総本山みたいなものです。味付けがかなり上手いのです。基本のレモン味を比べてみると,サントリーがいちばん味付けに凝っていると思います。安酒のくせに。
青梅味も例外ではありませんでした。
さて私,目隠しして飲んだら,チョーヤの缶入り「ウメッシュ」と区別が付かないかもしれません。さすがにその場で飲み比べれば違いが分かるかもしれませんが。
http://www.choya.co.jp/products/umeshu/umesshu/
余談ですが,「ウメッシュと言えば工藤夕貴(びっくりマーク)」と思って,過去に放送されていたテレビコマーシャルをYouTubeで調べてしまいました。
【CHOYA】 ウメッシュCM集 工藤夕貴編【全6種】
https://youtu.be/IbWF8dgGbUg
「こうなっていると安心する」って‥‥こりゃ完全にアル中女です。当時はぜんぜん気づきませんでした。安心している暇があったら,さっさと入院の準備をするべきでしょう。
2018-05-18 なんだか似ているYouTube―中田ヤスタカ×Kraftwerk―
Perfume(中田ヤスタカ)の「Spice」と,Kraftwerkの「Computer Love [The Mix] 」は,なんだか似ている気がします。
Kraftwerk - Computer Love [The Mix]
https://youtu.be/rEyxppGP8T4
Perfume - Spice instrumental
https://youtu.be/gtQSZl2IC7I?t=35s
「Computer Love [The Mix]」は,冒頭から30秒間くらい聴いてみてくださいね。
私ね,「Spice」に似ている曲があると思いながらも,それが何の曲だったか,なかなか思い出せなかったのです。
数日前に,Kraftwerkではないかと気づきました。でも,何度か聴き比べてみると騒ぐほどのものではないのかもしれませんね。
2018-05-14 某スポーツクラブ―大人の部活動―
先日,夜10時に寝る生活を止めて,また午前0時あたりに寝る生活に戻したというお話をしました。
某スポーツクラブに通う時間帯も,昼の部から夜の部に戻すことに。
久しぶりに夜(だいたい21時以降)に行ってみて,気づいたことがあります。
まず,1年間の会員の生存率です。生存率とは,スポーツクラブ通いが続いている人の割合。残っていたのは,6割くらいなのかなと思いました。
つぎに,やっぱり夜は大人の部活動という雰囲気がすること。昼間のスポーツクラブは,お爺ちゃんお婆ちゃんたちの社交場と化していますので,部活って感じは全然しないんですよね。
夜の会員は,おそらく9割が社会人です。平均年齢も(昼と比べて)25歳くらい下がって,それだけで活気が感じられるものなのですね。
2018-05-05 PerlでOutlook受信トレイ内のメールを取得・表示
PerlでOutlook受信トレイ内のメールを取得・表示するサンプルコードを作りました。巷で見掛けないようなので。
概要
・Outlookの任意フォルダ内にあるメールのヘッダ,件名,受信日時,本文を標準出力に出力
・WindowsのActivePerlを使用。Windows以外は対象外
・文字エンコードを意識しない版と,UTF-8版の2種類を作成。不慣れな人は,「Win32::OLEでActiveXオブジェクトがどうの」という問題よりも,PerlのUTF-8フラグの扱いでハマると思われます
・実行するPCにはOutlookのインストールが必要。OutlookがインストールされていないPCでは使用できない
詳細
Perl独特の作法で注意すべき点を中心に。
・Win32::OLEクラスを使用しOutlook.Applicationのインスタンスを獲得
・「Outlook.ApplicationからMAPIという名前のName Spaceを獲得。Outlookのデータフォルダ一覧からフォルダ階層を辿って,受信トレイや送信トレイのFolderオブジェクトを‥‥」という以後の手順は,Perlとはほとんど関係がなくて,Microsoftが提供しているVBやC#の説明と同様
・オブジェクトの型はどれもWin32::OLEになる。Perlからは型の区別が付かない。VBA/VBSで作成したものをPerlに移植しながら作業すると「察し」が付きやすくなる
・変数に格納したデータをData::Dumpしたいところだが,ダンプするとPerlインタプリタが強制終了。内部のデータがどうなっているか,覗き見することは無理なようです
・タイムスタンプの扱いもちょっと面倒。日付時刻は,Win32::OLE::Variantオブジェクトで返されます。Win32::OLE::VariantのDateメソッドとTimeメソッドで,日付と時刻に各々分けて取得。一度,ISO8601形式(YYYY-MM-DDTHH:MM:SS)の文字列にしてから,Time::Pieceクラスで解析。Time::Piece クラスのepochメソッドでUNIXエポック秒に変換してみました
文字エンコードなし版
Win32::OLEが使用できることを確認するためのサンプルです。
シェルの標準出力に表示する以上のことはできません。しようとすると途端に難易度が上がります。たとえば,JSON形式でファイル保存する。XML形式でファイル保存する。HTTPでリモートホストにリクエストを投げる,などなど。さらに話を進めたい方は,つぎのUTF-8版をご利用ください。
# このファイルはCP932(Shift_JIS)で保存すること use strict; use Win32::OLE; use Win32::OLE::Const; use Time::Piece; ##### use constant TZ => -9*60*60; # 日本時間のタイムゾーン(JST-9) ##### #my $data_folder = 'Outlook データ ファイル/受信トレイ'; my $data_folder = undef; # 空の場合はフォルダ選択ダイアログを表示 my $outlook; eval { # すでにOutlookが起動しているならそのインスタンスを取得 $outlook = Win32::OLE->GetActiveObject('Outlook.Application'); }; if($@ or !defined $outlook) { $outlook = Win32::OLE->new('Outlook.Application', sub {$_[0]->Quit}) or die; } # Windowsタイプライブラリの定数一覧をハッシュにロード my $const = Win32::OLE::Const->Load($outlook); my $namespace = $outlook->GetNameSpace('MAPI') or die; my $folders; if(!$data_folder) { # $data_folderが空の場合はフォルダ選択ダイアログを表示 $folders = $namespace->PickFolder(); } else { $folders = $namespace; foreach(split('/', $data_folder)) { # フォルダ階層を辿る。指定したフォルダの参照を得る $folders = $folders->Folders()->Item($_); } } # 選択したフォルダのパスを出力 my @path; for(my $o = $folders; $o; $o = $o->Parent) { if($o->Class == $const->{olFolder}) { push(@path, $o->Name); } } print join('/', reverse(@path)), "\n"; print "\n"; # フォルダからアイテム一覧を取得 my $items = $folders->Items(); for(my $item = $items->getFirst(); $item; $item = $items->GetNext()) { my $header = $item->PropertyAccessor->GetProperty('http://schemas.microsoft.com/mapi/proptag/0x007D001E'); my $subject = $item->Subject; my $body = $item->Body; my $received_time = $item->ReceivedTime; # Win32::OLE::Variantオブジェクト my $tp = Varinat2time($received_time, &TZ); # Variant -> シリアル値 $header =~ s/\x0d\x0a/\n/g; # 改行コードを\nにする $body =~ s/\x0d\x0a/\n/g; print $header; print $subject; print Time::Piece->localtime($tp)->strftime('%Y/%m/%d %H:%M:%S'), "\n"; print "\n"; print $body, "\n"; } Win32::OLE->FreeUnusedLibraries(); exit; sub Varinat2time { my $p = shift; # Win32::OLE::Variantオブジェクト my $tz = shift || 0; # 日付時刻はWin32::OLE::Variant型でラップされる # 日付と時刻を分けてパース。Time::Pieceを介して整数のエポック秒に変換する my $iso8601 = sprintf('%sT%s', $p->Date('yyyy-MM-dd'), $p->Time('HH:mm:ss')); my $tp = Time::Piece->strptime($iso8601, '%Y-%m-%dT%H:%M:%S'); $tp += $tz; # タイムゾーンを合わせる return $tp->epoch; } # EOF
UTF-8版
UTF-8フラグの挙動を合わせたバージョンです。以下,概要。
・ソースファイルはUTF-8(BOMなし)で保存する
・Win32::OLEオブジェクトからゲットした文字列は,CP932からUTF-8に文字コードを変換する。Encode::decodeでUTF-8フラグを付ける
・Win32::OLEオブジェクトにセットする文字列は,UTF-8からCP932に文字コードを変換する。Encode::encodeでUTF-8フラグを外す
# UTF-8版 # このファイルはUTF-8N(UTF-8,BOM(Byte Order Mark)なし)で保存すること # Windowsの「メモ帳」は不適なので注意。ファイル保存するとBOMありになる use strict; use utf8; use Win32::OLE; use Win32::OLE::Const; use Time::Piece; ##### use constant TZ => -9*60*60; # 日本時間のタイムゾーン(JST-9) use constant CODE_PAGE => 'cp932'; # 文字コード:日本語Windows(CP932) ##### binmode(STDOUT, ':raw :encoding(cp932)'); ##### #my $data_folder = 'Outlook データ ファイル/受信トレイ'; my $data_folder = undef; # 空の場合はフォルダ選択ダイアログを表示 my $outlook; eval { # すでにOutlookが起動しているならそのインスタンスを取得 $outlook = Win32::OLE->GetActiveObject('Outlook.Application'); }; if($@ or !defined $outlook) { $outlook = Win32::OLE->new('Outlook.Application', sub {$_[0]->Quit}) or die; } # Windowsタイプライブラリの定数一覧をハッシュにロード my $const = Win32::OLE::Const->Load($outlook); my $namespace = $outlook->GetNameSpace('MAPI') or die; my $folders; if(!$data_folder) { # $data_folderが空の場合はフォルダ選択ダイアログを表示 $folders = $namespace->PickFolder(); } else { $folders = $namespace; foreach(split('/', $data_folder)) { # フォルダ階層を辿る。指定したフォルダの参照を得る $folders = $folders->Folders()->Item(Encode::encode(CODE_PAGE, $_)); } } # 選択したフォルダのパスを出力 my @path; for(my $o = $folders; $o; $o = $o->Parent) { if($o->Class == $const->{olFolder}) { push(@path, Encode::decode(CODE_PAGE, $o->Name)); } } print join('/', reverse(@path)), "\n"; print "\n"; # フォルダからアイテム一覧を取得 my $items = $folders->Items(); for(my $item = $items->getFirst(); $item; $item = $items->GetNext()) { my $header = $item->PropertyAccessor->GetProperty('http://schemas.microsoft.com/mapi/proptag/0x007D001E'); my $subject = Encode::decode(CODE_PAGE, $item->Subject); my $body = Encode::decode(CODE_PAGE, $item->Body); my $received_time = $item->ReceivedTime; # Win32::OLE::Variantオブジェクト my $tp = Varinat2time($received_time, &TZ); # Variant -> シリアル値 $header =~ s/\x0d\x0a/\n/g; # 改行コードを\nにする $body =~ s/\x0d\x0a/\n/g; # 改行コードを\nにする print $header; print $subject; print Time::Piece->localtime($tp)->strftime('%Y/%m/%d %H:%M:%S'), "\n"; print "\n"; print $body, "\n"; } Win32::OLE->FreeUnusedLibraries(); exit; sub Varinat2time { my $p = shift; # Win32::OLE::Variantオブジェクト my $tz = shift || 0; # 日付時刻はWin32::OLE::Variant型でラップされる # 日付と時刻を分けてパース。Time::Pieceを介して整数のエポック秒に変換する my $iso8601 = sprintf('%sT%s', $p->Date('yyyy-MM-dd'), $p->Time('HH:mm:ss')); my $tp = Time::Piece->strptime($iso8601, '%Y-%m-%dT%H:%M:%S'); $tp += $tz; # タイムゾーンを合わせる return $tp->epoch; } # EOF
2018-05-05 夜10時に寝る生活―終わりの始まり―
私は,昨年の3月から夜10時に寝る生活を励行してきました。
1年間続けてみて,これがあまり良くない(合わない)ことが分かったので,さっさと撤回することにして,また午前0時すぎに寝る生活に戻すことにしました。
この1年で一体,何が起きたのか少々。
「痩せた」「痩せたね」「痩せたよね」
夜10時に寝る生活を始めて,すぐに実感したのは体重の減少です。
「痩せた」「痩せたね」「痩せたよね」って一体,何人から指摘されたことか。某所では,一度も話したことのない人からも,「前より痩せましたよね」と言われる有様。
私は痩身主義者ではないし,この業界で「痩せる」というのは,あの病気の発症やいよいよ迫った死期の訪れを意味します(有害)。いいことなんか何もないわけ。
さて,どうして早寝するだけで痩せられたのかと言うと,簡単な話なのです。起きていると何か食べたり飲んだりしてしまいがちですが,寝ている間は飲み食いしないのです。
早寝すると1日の総摂取カロリーが低くなる。これだけの話です。
コーヒーが飲めない
知らない人はいないと思いますが,コーヒーには化学物質のカフェインが含まれています。
知らない人はいないと思いますが,カフェインには興奮作用があります。摂取すると意識が明瞭になります。眠気覚ましになります。
「夜10時に寝る生活」を始めた当初は,なかなか寝付けなくて苦労しました。これが,昼に飲んだコーヒーが犯人だと気づくまでに,かなり時間を要しました。
自分が特別なカフェイン過敏症だとはいまも思っていないのですが,昼食後(13時あたり)にコーヒーを飲んでも,夜の睡眠の妨げになってしまいます。
夜10時に寝る生活をするためには,コーヒーを我慢しなければならず,日々の楽しみが一つ減ってしまうのです。
小熊たちの別れ
以前も同じ話をしました。
この1年で,小熊たちと本格的に疎遠になりました。
最初は,「自分の新しい生活に合った小熊が現れるのでは」と楽観していました。ところが,待てど暮らせど事態が進展する気配はなし。私にとってこの1年は,小熊とは無縁の生活でございました。
少し夜型の生活に戻して,また小熊たちと仲良くなれるとは限りませんけどね。
それに小熊系の人って,どうにも生活態度がだらしない印象なんですよね。私の日常の利益を最大化するっていう観点で言うと,小熊たちとは疎遠になって正解なのかもしれません(←最後の最後でやけに攻撃的)。