技術書典6に初サークル参加した話

4/14に行われた技術書典6に初サークル参加した。

lambda-sunという名前で、λ計算入門について書きました。 気になる人は以下から100円で買えるのでよろしくお願いします。

lambda-sun.booth.pm

この記事では初サークル参加した振り返りを書いていきたいと思います。

振り返り

KPTで振り返る。

Keep

  • なんとか出せた!
  • 執筆環境が \TeXだったが、Dockerに環境を閉じ込めたことで \TeX環境に苦しめられることがなかった
  • 40冊売れた
  • 技術書典公式のQR決済(後払い)が強かった
  • Kyash決済も用意していて使ってくれる人が何人かいた

Problem

  • 書き始めるのが遅かった
  • iPadで見本誌を置いていたが躊躇する人が多かった
  • 直前まで書いていたせいでブースの準備をしていなかった
  • お釣り用の小銭を用意してなかった
  • 意外と物理本を求める声があった
  • 1人で売っていたのでブースから離れられなかった

Try

  • 中締め切りを設けて余裕を持って書く
  • 物理本を数冊用意する
  • 売るときは複数人で売る
  • ブースの準備をする

おわりに

ちゃんと計画的に書こう!!!!

BigQueryでArrayの各要素をそれぞれ別の行にしたいとき

タイトルが難しい。 よく忘れるのでメモ。

要するに

これを

f:id:ushiumi:20190405140932p:plain

こうしたい

f:id:ushiumi:20190405140951p:plain

UNNESTを使ってクロスジョインみたいにすればできる。

WITH dataset AS (
  SELECT 1 AS id, ARRAY['foo', 'bar'] AS arr
  UNION ALL SELECT 2, ARRAY['foo', 'bar', 'baz'])

SELECT
  id,
  item
FROM dataset, UNNEST(arr) AS item

参考:

https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays?hl=ja#querying-nested-arrays

Google Cloud Natural Language で簡単感情分析

この記事はねおりんアドベントカレンダー19日目の記事です。
ざっくり言うとねおりんのツイートを分析してみたよというお話しです。


Google Cloud Natural Languageは、 APIを投げるだけでGoogleが事前に学習させたモデルを使って自然言語処理ができてしまう優れものです。 最近はGoogle Cloud AutoMLという データを与えるだけでそのデータから学習したモデルを作ってくれるサービスも出ています。

今回はねおりんアドベントカレンダーということでCloud Natural Languageを使って @noir_neoのツイートの感情分析をしてみました。

Cloud Natural Language を使った感情分析

Cloud Natural Language での感情分析では、文章を与えると

  • -1.0(ネガティブ)~1.0(ポジティブ)の範囲で表わされるスコア
  • 0.0~+infで表わされる感情の強度であるマグニチュード

の2つが出力されます。

例えば このツイートのテキストを入れると

Score: 0.6000000238418579
Magnitude: 0.6000000238418579

という値が返ってきます。 これはスコアが0.6もあるので非常にポジティブな内容であるということが分かります。 ねおりんがニッコリ笑顔になってるのでポジティブと出てるのはあってそうですね。

こんどはこのツイートのテキストを入れると

Score: -0.8999999761581421
Magnitude: 0.8999999761581421

今度は非常にネガティブなスコアになりました。

2つのツイートから得られるマグニチュードは非常に低いものですが、これは文章自体が 短いことに起因すると考えられます。

ねおりんのツイートを分析

ツイートの期間は2018/09/06~2018/12/18 (UTC)

今回はマグニチュードは考慮せず、スコアだけを取りました。

f:id:ushiumi:20181219205501p:plain

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-0.4500  0.0500  0.1211  0.1097  0.1985  0.4133

第1四分位数が正なのを見るとねおりんはポジティブな発言が75%以上ということが分かります。

最小値の日は

Amazonにキレてました。

11月は

曜日ごと(UTC)の最小値、第1四分位点、中央値、平均、第3四分位点、最大値を見てみると

day of the week Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.06667 0.12680 0.18570 0.18280 0.23530 0.41330
-0.16670 0.05777 0.12960 0.11840 0.21810 0.35000
-0.45000 0.04062 0.09583 0.08636 0.17900 0.31820
-0.30000 -0.02593 0.05926 0.04662 0.12660 0.27040
-0.38330 0.02316 0.10690 0.09655 0.20210 0.30450
-0.03788 0.08788 0.12780 0.13010 0.15700 0.32000
-0.22310 0.07211 0.12110 0.10610 0.18030 0.29170

1Qを見ると分かりやすく月曜日がスコアが高い。 月曜は憂鬱になる人が多いのにねおりんはポジティブになるという発見。

まとめ

  • Cloud Natural Language 簡単!
  • ねおりんはAppleAmazonに厳しい
  • ねおりんは月曜にポジティブになる

Google Cloud Pub/Sub のat-least-oneってどれくらい重複するの?

Google Cloud Platform その2 Advent Calendar 2018の15日目の記事です。


Google Cloud Pub/Sub とは

Google Cloud Pub/SubGCPの非同期メッセージングサービスです。 Pub/Subの概念の詳細やユースケースついてはGoogle Cloud Pub/Subのドキュメントに書いてあるのでそちらをご覧ください。

at-least-one配信

Cloud Pub/Subの特徴としてat-least-one配信があります。 at-least-one配信とはメッセージが1 回以上配信することを指します。

ドキュメントの中のサブスクライバーガイドには以下のように書かれています。

通常、Pub/Sub は各メッセージを公開された順序で 1 回配信します。ただし、メッセージが順不同で配信される場合や複数回配信される場合があります。通常、複数回の配信に対応するには、メッセージの処理時にサブスクライバーがべき等である必要があります。Google Cloud Pub/Sub メッセージ ストリームを 1 回だけ処理するには、Cloud Dataflow の PubsubIO を使用します。

これがなかなか厄介です。

そもそもat-least-one配信って言うけど実際どのくらい重複が起きるの? という疑問がある。

そこで以下のような検証をしてみた。

検証

順序が分かる10万件のデータをPublishし、その後すべてSubscribeする。

使用する言語はRubyで、すべて同期pullで行った。

10万件Publishするスクリプト gist.github.com

すべてSubscribeするスクリプト gist.github.com

結果

10万件だと重複はなかったRubyの処理速度だと重複があまり起きない? 100万件でやろうとしたけど時間がかかるのでまた別の機会に...

ただ気になったのは1回のpullで取ってくる件数。 maxで1000件まで取ってくる設定にしていたが、以下のように件数が上下していた。

f:id:ushiumi:20181215234043p:plain

10回の単純移動平均をとると

f:id:ushiumi:20181215234304p:plain

途中で200件が続いてるのが気になる... 過去にCloud Pub/Subを使っていてデータがあるのに0件で返ってくるケースもあったので、pullするときの件数はばらつきがあるみたいだ。

順序性を保証しようとするとどれくらいパフォーマンスが落ちるのかなど調べたいことはまだあるのでまた調査したい。

もしBigQueryのテーブルを消してしまったら

疲れてたりするとうっかりBigQueryのテーブルやデータセットを消してしまうことありますよね?? でも大丈夫!BigQueryは最新2日間であれば1秒ごとに全データのスナップショットを取っているのです!

ただし削除された後に同名のテーブルが作成されるとスナップショットを参照できなくなります!

テーブルの復元方法

スナップショットには以下の構文でアクセスできます。

  • PROJECT_ID:DATASET.TABLE@<time>

<time>はエポックタイム(Unix Timestamp)で表わされます。 詳しい情報は以下のURLから。 https://cloud.google.com/bigquery/table-decorators?hl=ja

スナップショットをコピーするにはbqコマンドを使用します。 (インストール方法や使い方は以下のURLから https://cloud.google.com/bigquery/bq-command-line-tool?hl=ja)

安全に復旧するためには一度temporaryなデータセットにデータをコピーしてから、 元の場所にコピーしましょう。

例:

  1. dataset_name.table_nameのスナップショットをtmp_dataset.table_nameにコピー
    • bq cp dataset_name.table_name@1540869645 tmp_dataset.table_name
  2. tmp_dataset.table_namedataset_name.table_nameにコピー
    • bq cp tmp_dataset.table_name dataset_name.table_name

データセットごとやってしまった場合はこれをデータセット内の全テーブルに行うことでデータセットを復旧できます。
これでいつテーブルを消しても大丈夫!

参考:

Lisp入門

概要

この記事でわかること

  • Lispの基礎知識
  • Lispのコアとなる部分の考え方
  • Lispがなぜすごいのか

この記事でわからないこと

  • Lispでのアプリケーションの作り方
  • もう1歩踏み込んだラムダ計算の考え(別の記事orLTでやります)

入門じゃないじゃん!と言われる前に言っておくと、入門というのは手取り足取り"Hello World"をするものだけではない。
Lispの考え方、Lispの世界に入門する、という意味で"Lisp入門"としている。

Lisp入門

Lispをちゃんと理解するためにLispがどのような思想で作られたのかを調べた。
今回この記事を書くにあたって、Lispというプログラミング言語が提唱された論文
"Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I"を参照した。
この論文が出たのは1960年であり、Lispが考案されたのは1958年だ。
1957年に"広く使われた世界最初の高級言語"と言われるFORTRANが出ているが、それほど古い言語である。
ちなみに論文のタイトルの最後に Part Iとあるが Part IIはない。

Lispの概要

論文の内容の前にLispの基本知識を簡単に説明する。
LISt Processorという意味を持っている。
つまり、Lispの中核はlistなのである。

Lispと聞くと何を思い浮べるだろうか。
おそらく、Lispを少しでも知っている人ならば"かっこ"を思い浮べるだろう。
Lispにとって"かっこ"はとても重要なものだ。
まず、Lispのexpressionは atomlist(pair) から出来ている。
atomとは、"かっこ"と"·"以外の文字が1つ以上繋ったもの(例:foo bar)
listとは、0個以上のexpressionが"かっこ"の中に空白区切りで配置されたもの(例:(foo bar))である。
これがLispを構成する全てと言っても過言ではない。 関数もlistで表されとデータもlistで表される。 Lispでは、関数とデータに本質的な違いはない。 関数もデータである。

Lisp

S式(S-Expressions)

LispはS式(S-Expressions)で表現される。 S式の定義は以下の通りである。

1. atomはS式である。
2. e1とe2がどちらもS式ならば (e1 · e2) はS式

(a · b) という表現はドット対(dotted pair)と呼ばれる。

Elementary S-functions and Predicates

McCarthyはS式を用いて5つのfunctionを定義した。 McCarthyの言うfunctionとは引数の全てが評価されるS式のことを指している。

  1. atom x:xがatomであれば真を、そうでなければ偽を返す。
  2. eq x y:xとyを評価した結果が同じならば真を、そうでなければ偽を返す。
  3. car x:引数にlistをとり、そのlistの先頭を返す。
  4. cdr x:引数にlistをとり、listの先頭以外を返す。
  5. cons x y:xとyのドット対を作る。

これだけあれば様々なlist操作はできるが、プログラミング言語としては不十分である。

Recursive function

先程の5つのfunctionに加えて再帰関数(Recursive function)を書くことができれば、チューリング完全高級言語ができる。 再帰関数を書くために、McCarthyは次の4つを定義している。 (実際にはSUBSTとf[e1;...;en]という表現も同時に定義しているが、コアな部分でないため割愛する。)

  1. QUOTE x:xを評価せずS式自体を返す。
  2. COND (p1 e1)(p2 e2) ... (pn en):条件式(実際はただのS式)とS式のペアの0個以上とり、合致した条件とペアのS式を評価する
  3. LAMBDA (x1 x2 ... xn) e:いわゆるラムダ式。これ自体が関数と同じ働きをし、引数を2つ以上とり、最後の引数はその前の引数をラムダ式の引数とした関数の中身となる。(例:(lambda (a b c) (+ a b c)) (1 3 5))
  4. LABEL x e:eをxで与えられた名前で保持する。

これらの4つがあることによってチューリング完全となる。 実際には不動点コンビネータによってLAMBDAだけで再帰関数が書けるため、チューリング完全のためだけならばLABELはいらない。 McCarthyがこの論文を書いた際には不動点コンビネータが発見されていなかったため、LABELを付けて再帰関数を書いたのだと思われる。

まとめ

Lispの何がすごいか、といえばたった7つ(atom eq car cdr cons quote cond)のオペレータとlambdaでeval関数が書けるところにある。 この論文でeval関数をどう作るかも書いてあるが、この記事の内容とevalの作り方を含めてもたった20ページにしかならない。

また、全てがatomとlistで表現されるためProgrammable programing languageと言われるほど拡張性が高い。 プログラム自体をプログラムできるプログラミング言語なのだ。

この入門記事では、Lispのコアとなるオペレータを紹介してLispの世界に入門した。 途中、ラムダ式不動点コンビネータなどの部分が分かない方もいただろうが、これについてはいつか別の記事で紹介する。

プログラミング初心者に最適な言語ってなんだろう

昔からずっと言われてる議題だけど社内の非プログラマ向けにプログラミング講座をやろうと思った時に迷ったのでもう一度考えてみる。

プログラマに最適な言語とは

今回の前提として社内の非プログラマに教えるというところがある。 教えた人が「プログラムって便利じゃん!」って思ってくれると最高。
単純な反復処理をプログラムで処理したり、定期実行系のbotとか作るところが(とりあえずの)ゴール。
おもしろいと思わせるのも重要。
プログラマの作業で一番多そうなのは、あるファイル(Excel or CSV)を加工して別の形にするとかだと思うのでFile I/Oのしやすさは重要。

候補

  • Ruby
  • R
  • Shell script

Ruby

日本製スクリプト言語

  • メリット
    • 日本語ドキュメントが多い
    • 社内にも書ける人が多い
    • シンプル(Matzさんの言葉を使うなら「自然」参考:Rubyとは)
    • File I/Oも単純
  • デメリット
    • 環境構築のコスト(非プログラマにとってコストが高そう)

R

統計解析向けプログラミング言語

  • メリット
    • ?コマンドやdemoコマンドの充実
    • データフレームがExcelをよく使う人にとっては強い見方に
    • CSVなどをデータフレームとして読み込める
    • 環境構築が楽
    • RStudioで作業することになるのでエディタを用意しなくていい
  • デメリット
    • googlabilityが低い
    • 日本語のドキュメントが少ない
    • 英語アレルギーだと?demoコマンドが読めない

Shell Script

シェル芸

  • メリット
    • 数個のコマンドを覚えるだけで非プログラマの生産性向上はできる
    • リダイレクト等があるのでFile I/Oも楽
  • デメリット
    • 黒い画面アレルギーの人がいそう
    • Windowsのことを考えると憂鬱になる

まとめ

環境構築さえなんとかなればRubyがいいかなあ
環境構築の面ではRが楽なんだけど英語とgooglabilityの壁がある
リモートにRubyの環境整えておいてCloud Shellとかでssh接続するのはあり。