RをJavaScript(Node.js)から使ってみる +α:R Advent Calendar 2017 day 7

この記事は、Japan.R 2017での講演内容を再編成した物です。

Node.jsで作られたアプリケーションや、Electronアプリケーションを、Rと連携させたいと思ったことはありませんか?

JavaScriptとRの連携

Rで統計処理をしているときに、JavaScriptでインタラクティブなビジュアライゼーションを行いたい、ということはあると思います。この目的であれば、shiny (Winston Chang et al.)という便利なパッケージがあります。htmlwidgets(JJ Allaire et al.)も便利なパッケージで、threejsbokehなどの連携を行うことができます。

では、逆は、というとあまり決定的なアプリケーションはありません。npmをみてみると、controlr, r-script, computerというパッケージがありますが、どのパッケージもRをspawnしてstdin/stdout経由でアクセスしているだけであり、すこし物足りません。

そこで、勉強がてら自前ですこし作ってみることにしました。

libr-bridge

libr-bridgeはlibr(WindowsではR.dll)と連携して、Node.js環境からRを使用するパッケージです。

let r = new R();

const arrA = [1.00, 3.36, 8.01, 1.22, 3.74, 2.43, 7.95, 8.32, 7.45, 4.36];
const arrB = [1.04, 3.65, 6.82, 1.46, 2.70, 2.49, 7.48, 8.28, 8.93, 5.63];

/* Some functions are already loaded to libr-bridge */
console.log("Mean of arrA: " + r.mean(arrA));
console.log("Mean of arrB: " + r.mean(arrB));
console.log("Peason's correlation coefficient: " + r.cor(arrA, arrB));

libr-bridgeを利用することで、Rの関数にアクセスすることが出来ます。eval関数も備えていますので、とりあえずデータだけ渡してしまって、凝った作業をRスクリプトで行い、結果を受け取ることも出来ます。

まだまだfactorやdata.frame, S3/S4クラスなど対応しないと行けないことは山積みですが、Node.jsで出来る作業の幅を広げてくれます。

どうやって実現しているの?

ぜひ、ソースコードを見ていただきたいですがlibRのAPIをゴリゴリに呼び出して動作を行っています。Rの内部挙動を理解するのにも役に立ちました。

小ネタ

Rでは倍精度浮動小数点(double9は他言語と同じようにIEEE 754に従って、実装されています。これは、1bitの符号と、11bitの指数部、52bitの仮数部で数値を表す方式です。

NaNはこの決まりに含まれており、指数部のbitがすべて1であり、仮数部が0以外のもの、と定められています。これは他の言語も共通です。

しかし、 NAはR独自の表現であり、この決まりの中には含まれていません。

Rでは、少し特殊な仕組みでNAを実現していて、仮数部が1954(R言語設計者の一人のRoss Ihakaの誕生年)のNaNをNAとして区別して扱っています。

今回、libr-bridgeを作るのに、Rの内部を調べていくうちにこういった小ネタをいくつか見つけたので、また次の機会にでも記事にしたいと思います。

Electronドキュメントの翻訳 (Crowdinへの移行) : Electron Advent Calendar 2017 day 4

Electronの多言語ドキュメントが最近Crowdinへ移行し、翻訳作業が大変やりやすくなりました。

ここでは、その経緯と使い方について説明しています。

なぜCrowdinに移行したの?

もともとは日本語など、英語以外のドキュメントもelectronレポジトリの中に含まれており、翻訳を行う際にはdocs-translationsを編集してpull requestを送る、という方法で行われていました。

しかし、この方法には

  1. ドキュメントがなかなか英語の最新版に追いつかない
  2. Pull requestの処理が大変

という問題がありました。

一点目の「ドキュメントがなかなか英語の最新版に追いつかない」ですが、docs(英語版)のドキュメントが編集され、新しいメソッドの追加やメソッド名の変更があったり、書かれていた方法がDeprecatedになっていても、なかなか翻訳版のほうがそれに追いつかなかったり、またたくさんの言語があるために言語ごとにバラバラの作業で一貫性が保てていないという状態になっていました。

二点目の「Pull requestの処理が大変」ですが、electronリポジトリには、たくさんのPull requestが送られていますが、動作に関わるもの多くなかなか大変そうです。それにもかかわらず、細々したドキュメントの翻訳などのmerge作業もCheng ZhaoさんZekeさんをはじめとしたElectronの開発コアメンバーが行うことになってしまっていました。

そこで、翻訳の作業の効率化と質の向上のためCrowdinに移行することになりました。

doc-translationsディレクトリは、Deprecate /docs-translations #11039をもって削除されて空になっています。

Crowdinってなに?

CrowdinはWebから使用できる翻訳プラットフォームです。Githubとの連携がとてもしやすく、またオープンソースソフトウェアの開発には無料で使用できるという大きなメリットがあります。

一度翻訳した言葉をドキュメント内で一貫性を保つためにシソーラスを作ったり、機械翻訳を参考にしたり、複数人での作業のために投票機能があったりと、さまざまな機能があります。

どうやって使うの?

まずはCrowdinのユーザー登録を行います。登録にはGithubやTwitterのアカウントを利用することが出来ます。登録後、Electronドキュメント翻訳のプロジェクトを開きます。

言語の設定を行っているためJapaneseが一番上にあがっています。翻訳を行う言語をクリックします。

クリック後は、ドキュメントに含まれるファイルが出てきます。右の青いバーが翻訳率で、こう見ると日本語はほとんど翻訳されていないファイルも多いのが分かります。

今回は、翻訳が全くされていないinstallation.mdを翻訳することにしてみます。ファイルを開くと下のような画面が表示されます。

左側に翻訳文書全体が表示されます。赤がまだ作業を行っておらず未翻訳の部分、黄色が現在編集中の部分、緑が翻訳済みの部分です。

右側で実際の翻訳作業を行います。場合によっては下の機械翻訳や、過去に翻訳したドキュメントに同じ文章があれば表示されますので、それを参考にします。タグは<0></0>といった形で原文の物を引用できます。

翻訳の都合上、タグの順番が変わったり、括弧の対応が減ったりすると警告が表示されますが、わかりやすい翻訳にするためにあえて文書を構成した場合は気にしなくてかまいません。

翻訳されたドキュメントはどこから見るの?

翻訳されたドキュメントは、Crowdinからしばらくするとelectron-i18nリポジトリに取り込まれ、Electronのウェブサイトから見ることが出来ます。数日以上かかることもあるので気長に待ちましょう。

ffmpegをGoogle Compute Engine経由で使ってみた

ffmpeg、便利ですよね。ただ、どうしてもエンコード作業という物はCPUパワーと時間を消費します。

背景

つい最近、Panasonic の4Kビデオカメラ VX980Mを購入しました。画質もよく、大変満足しているのですが、4K画質はとにかくファイルサイズが大きくて大変です。10分程度の動画でも約5GBになってしまい、普段の取り回しにはやや不便です。

そこで、もともとの4K動画は将来使用できるようにクラウド上へとバックアップし、ローカルには960×540 30fpsにエンコードしたものを置いておくことにしました。

しかし、僕のメインマシンはMacBook Pro 12″ (1.3 GHz Intel Core m7)なので、どう考えても本格的なエンコード作業には向いていません。

そこで、ffmpegをGoogle Compute Engineで動かし、クラウドでのエンコードを行ってみたので、引っかかった点も踏まえて、ここに報告させていただきます。

方法

まず、Google Compute Engineが使用できるようになっているのが大前提です。まだの人は導入を済ませてください

まずは、インスタンスを作ります。今回はエンコード作業が目的ですので、CPUを強化した設定として、n1-highcpu-8を使用します。また、ちょっとお高いですが、近い方が通信コストも少ないでしょうから、asia-northeast1-cを選ぶことにしてみました。

% gcloud compute instances create cloudencode --image-family cos-stable --image-project cos-cloud --zone "asia-northeast1-c" --machine-type "n1-highcpu-8"

もちろん、UbuntuやCentOSを選んでも良いですが、Dockerを使った方が後々の取り回しも楽だと思いますので、Container-Optimized OSを選ぶことにします。

まずは、dockerでffmpegを動かすのを試してみましょう。イメージは人気のあるjrottenberg/ffmpegを選ぶことにします。

% gcloud compute ssh cloudencode --command="docker run -i --rm jrottenberg/ffmpeg"
Unable to find image 'jrottenberg/ffmpeg:latest' locally
latest: Pulling from jrottenberg/ffmpeg
c62795f78da9: Pulling fs layer
d4fceeeb758e: Pulling fs layer
5c9125a401ae: Pulling fs layer
...
...
Status: Downloaded newer image for jrottenberg/ffmpeg:latest
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
...
...
ffmpeg version 3.3 Copyright (c) 2000-2017 the FFmpeg developers
 built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
...
...

これでffmpegを動かすことができました。ここまではスムーズ。

と言うわけで、stdinとstdoutを用いてエンコード作業ができないかを試してみます。

% cat input.mp4 | gcloud compute ssh cloudencode --command="docker run -i --rm jrottenberg/ffmpeg -i pipe:0 -s 960x540 -r 30 -vsync passthrough -vcodec libx264 -acodec aac -ac 2 -ab 128k -threads 0 -f mp4 pipe:1" > output.mp4
ffmpeg version 3.3 Copyright (c) 2000-2017 the FFmpeg developers
...
...
[mp4 @ 0x7f890685a600] muxer does not support non seekable output
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 --
...

どうやらだめなようです…。調べてみると、パイプを使った場合は、MPEG-PSでの出力はできないことが分かりました。ので、残念ながら、そのままmp4にはできないようです。

MPEG-TSならパイプへの出力にも対応しているので、こうすれば大丈夫です。

% cat input.mp4 | gcloud compute ssh cloudencode --command="docker run -i --rm jrottenberg/ffmpeg -i pipe:0 -s 960x540 -r 30 -vsync passthrough -vcodec libx264 -acodec aac -ac 2 -ab 128k -threads 0 -f mpegts pipe:1" > output.ts
ffmpeg version 3.3 Copyright (c) 2000-2017 the FFmpeg developers
...
...

これでクラウドでの変換はうまいこといきました!

ただ、tsファイルのままだと、取り回しがまた面倒なので、こちらもローカルで再変換しましょう。

% ffmpeg -i output.ts -vcodec copy -acodec copy output.mp4

これで取り回しのしやすい小さいサイズのmp4ファイルのできあがり、です。

ただ、tsファイルをローカルにいったん保存するのは美しくない……。そう思うようであれば下記を試しましょう。zshが必要です。

% ffmpeg -i pipe:0 -vcodec copy -acodec copy output.mp4 2> /dev/null < <(gcloud compute ssh cloudencode --command="docker run -i --rm jrottenberg/ffmpeg -i pipe:0 -s 960x540 -r 29.970030 -vsync passthrough -vcodec libx264 -acodec aac -ac 2 -ab 128k -threads 0 -f mpegts pipe:1" < <(cat input.mp4 ) )

環境とバージョンによっては、inの方もMPEG TSである必要があるようです。その場合は残念ながら、さらに入れ子にして、

% ffmpeg -i pipe:0 -vcodec copy -acodec copy output.mp4 2> /dev/null < <(gcloud compute ssh cloudencode --command="docker run -i --rm jrottenberg/ffmpeg -i pipe:0 -s 960x540 -r 29.970030 -vsync passthrough -vcodec libx264 -acodec aac -ac 2 -ab 128k -threads 0 -f mpegts pipe:1" < <(ffmpeg -i input.mp4 -vcodec copy -acodec copy -f mpegts pipe:1 2> /dev/null ) )

これで、input.mp4 -> TS -> cloudのffmpeg -> TS -> output.mp4と変換することができます。

結果

肝心の性能です。

まずはlocalで実行している場合。

うーん、0.547x, 16 fpsと出ています。10分の動画の変換に約20分かかることになります。

それではクラウドではどうでしょう。

リアルタイム変換より速い速度で変換できています。4K動画の変換なので、Uploadが速度のボトルネックになる場合もあるかもしれませんが、ローカルの2.3倍の速度でエンコードできたようです。

注意点

Google Cloud Computingなので、料金がかかります。また、リソースの割当量にも注意が必要です。

MacBookやその他のNetBookなどでも、この方法なら動画のエンコードを行うことができます。ただ、巨大なファイルをアップロードする必要もあり、思ったより速度がかせげない、というのが正直な感想です。今後H.245/HEVCなどさらに負荷のかかる動画形式が一般的になってくれば、有用になるかもしれません。

Pocket C.H.I.P. が届いた

Pocket C.H.I.P.が届きました。2016年5月に申し込みをしているので、実に半年かかったことになります。(当時はまだ49$でした)

プチプチに包まれたPocket C.H.I.P.

こんな感じのプチプチに包まれて香港からやってきました。

C.H.I.P.とPocket C.H.I.P.

Pocket C.H.I.P.にあわせて、C.H.I.P.とHDMI DIPを購入。こちらもおいおい触って行きたいです。 続きを読む

妊娠前と妊娠中の葉酸

妊娠前と妊娠中の葉酸 (folic acid)

葉酸はビタミンB類の一種で、DNAの生合成に強く関わっています。

日本人の食事摂取基準(2015年版)によると成人(18~29 歳)の推定平均必要量は200μg/日、推奨量は、240μg/日です。ただし、妊娠中は需要が増大するので、さらに240μg/日(付加量推奨量)を追加しましょう。

妊娠中の葉酸の補充が重要である理由は、神経管閉鎖障害が予防できるからです。 続きを読む

「情熱価格」のACプラグ付充電器を試してみた。

ドン・キホーテのプライベートブランドの「情熱価格」のACプラグ付充電器 が出ていたので試してみました。インターネット上で検索しても、全く情報がなかったので、少しレビューを書いておきます。

jk1454899315-1-main
商品概要
型番 MJ-LI309/310/311
内蔵電池 リチウムイオンポリマー
電池定格容量 3.7V/3000mAh
入力 AC 100V-240V
出力 USBポート / DC 5V 最大 2A
収納式microUSBコネクタ / DC 5V 1A
 サイズ  幅5.4×縦8.4×厚さ1.9 [cm]
重量 105g
(ドン・キホーテのホームページより)

パッケージの製造元を見ると、株式会社アルファとなっており、こちらの商品のようです。 続きを読む

岡山のお店100選

100は嘘です。岡山でオススメのお店を自分のメモを兼ねて書いておきます。異論は認める。

和食

和楽 (岡山市北区表町)

天満屋から少し歩いたところにあります。

岡山の地物を使っており、かつ季節を感じることのできる店です。料理は日本酒にあうもので流れが出来ており、次に出てくる品が楽しみになります。北区津高にお弟子さんの店もあるそうです。

両備グレースタワーの2階の店も美味しいですが、個人的にはこちらの方が好きです。ただし、大将は必ず会話に入ってきます。

食べログ公式サイト

割烹 動 (岡山市北区磨屋町)

動と書いて「いぶり」と読むそう。場所はゴリラビルの1階。

和楽よりは大変リーズナブルですがいろいろ楽しめます。

食べログ 続きを読む

「クリエイター独立マニュアル」の表紙

先日書店に行った時、グラフィック社編集部 (編集)の「クリエイター独立マニュアル」を見てびっくりしました。

表紙の一部を引用しますが、

cover_cross

このように、中央上部にでかでかと赤十字マークが入っています。

赤十字マークは、赤十字の標章及び名称等の使用の制限に関する法律でその使用に強い制限がかかっています。

第一条  白地に赤十字、赤新月若しくは赤のライオン及び太陽の標章若しくは赤十字、ジュネーブ十字、赤新月若しくは赤のライオン及び太陽の名称又はこれらに類似する記章若しくは名称は、みだりにこれを用いてはならない。
第四条  第一条の規定に違反した者は、六月以下の懲役又は三十万円以下の罰金に処する。

また、日本赤十字社のサイトにも、赤十字マークの意味と約束事としてこうあります。

また赤十字マークは、病院や医療を象徴するマークだと思っている方も少なくないようですが、このようにとても大切な意味をもつマークであり、その使用については赤十字社と法律等に基づいて認められている組織に限られています。もちろん、一般の病院や医薬品などに使用することは禁止されています。

今一度気をつけましょう。

第8回 小児科専門医試験 2014年の記録

第8回(2014年) 小児科専門医試験を受けてきました。

病院によっては近くに試験を受けた人がいなくて、どんな試験であったか話を聞けない場合もあると思いますので、第9回(2015年) 小児科専門医試験を受ける人のためにも少し記録として残しておきます。

受験票が届くまで

受験資格

当然ですが、小児科専門医を受けるためには、受験資格と受験の申し込みが必要です。

受験資格としては

  • 2014 年 8 月 31 日までに,会員歴が連続 3 年以上,もしくは通算 5 年以上である者.
  • 2004 年以降の医師国家試験合格者で,2 年間の卒後臨床研修を修了後,学会の指定した研修施設(研修施設が予め登録した関連施設を含む)において 2014 年 8 月 31 日までに 3 年以上の研修を修了,または修了見込みの者.

とあります。要は、後期研修医になる時に普通に学会に加入していれば、3年間の研修を終えた時には施設に問題なければ受験資格があることになります。施設が専門医研修施設かどうかは、小児科学会のホームページ (要ログイン)で調べることができます。

出願までの流れ

2014年の書類について説明しています。2015年に必要な書類が同じであるとは限らないので、必ず小児科学会の公式資料で確認しましょう。

続きを読む

Affinity Designer で pdf を編集してみる

serifのAffinity Designerはシェアウェアで¥5000もしますが、トップレベルのベクターグラフィック編集ソフトです。

demoを見てもらうとどんなソフトウェアか分かってもらえると思います。

イラストを描く方にはもちろん便利なソフトウェアだと思いますが、pdfの編集にも大変威力を発揮します。

IGF1SDbyGroup_raw

たとえば、Rやその他のソフトウェアでこんな出力が得られたとします。何の変哲のない箱ひげ図で、このままでも充分使用はできますが、よく見ると色々と不満が出てきます。

affinity

実際にこういった画像を綺麗に編集するのは難しく、グラフィックソフトウェアでちまちま編集するか、PowerPointやKeyNoteに貼り付けた後、上から覆いかぶせるように図形やテキストを駆使しして見栄えを調整するか、もしくは最終的には諦める、という風になっていたと思います。

もちろん、Adobe Illustratorは選択肢の一つですが、高価であり個人用途で簡単に手を出せるものではありません。

Affinity Designerはpdfのファイルを開くことができ、色々と編集した上で、pdfやpngなどで保存することができます。

先程の例でも、

screenshot

必要に応じて、テキストの大きさ・色・内容を変更して…

IGF1SDbyGroup

グラフの色や線の太さなども簡単に調整して保存することができます。このくらいの作業なら慣れたら3分もかかることなく簡単に行うことができます。

現時点では、日本語化されておらず、一部フォントで日本語の表記が乱れるようですが、画像の編集は問題なく行えています。

近いうちに日本語化すれば、Adobe Illustratorの代替として一番におすすめできるソフトウェアになると思います。