読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

iPhone6+Softbank から MNP で iPhone7+IIJmioに

usual day

iPhone 6 から iPhone 7 に機種変更するとともに、Softbank から IIJmio に MNP しました。

iPhone 6 がおかしい

iPhone 6 は非常に満足いく端末であったわけですが、以下 2 点の問題が気になるようになりました。

  1. 月々の料金が高い

    • これが 11 月の料金だったんですが、月 9,000 円を超す出費になります。格安 SIM 全盛の時代に、この価格を月々払っているのはなかなかにつらいものがありました。 f:id:kiririmode:20170117210539p:plain
  2. バッテリーに余裕があるはずなのに電源が落ちる

ちょうどこの 12 月で、Softbank との 2 年縛りの契約が完了し、12 月・1 月が更新猶予の期間です。 これはもう、格安 SIM に移行するしかないやろ、ということで、MNP を行うことに相成りました。

契約プラン

IIJmio のファミリーシェアプラン を契約しました。 ぼく用に音声通話機能付き SIM を 1 枚、妻 (iPad Pro)用に SMS 機能付き SIM を 1 枚という構成です。 データ量は 10GB で、ぼくの Softbank 時代の使用量の過去実績 5 GB/月からすると若干心許ないのですが、妻は常時持ち歩くわけではないということを考えると、まぁ何とかなるかなっていう算段です。

月額だと二人使用で 4,000 円くらいになると思うので、Softbank 時代と比べると半額以下になるかなと思います。思った以上にお得になったかんじですね。

f:id:kiririmode:20170117211707p:plain

切り替え

最初に Softbank に MNP 利用の電話をかけるところからスタートしました。

電話をかけたら引き止めを受けたものの断固拒否すると、Softbank から SMS で MNP の予約番号が送られてきます。予約番号には 2 週間という有効期限が設定されているので、それまでに MNP の乗り換えを完了する必要があります。 IIJmio の契約手続については、ちょっとでも得をするために Amazon でこれを買いました。400 円ちょっとで購入できて、初期費用がかからなくなります。

IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043

IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043

申し込みページ に、ここに記載されているエントリーコードを記入して、あとはネットで調べた紹介コードを入力して、契約するコースを選択していきます。

本人確認のメールが届くので、メールからリンクされている本人確認システムで、住所や電話番号、あとは本人確認書類の画像をアップロードします。 入力した住所と、本人確認書類(ぼくは免許証を選択)上の住所は完全一致が求められるみたいで、免許証が X 丁目 Y 番地って書いてあるのに、入力を X-Y とかで書くと NG になります。意地でも OK っていわせたくて頑張ったけどダメで MNP の有効期限が迫ってきたので、諦めてきちんと完全一致できるように入力したら通った。

これだけ頑張ってもまだ開通しなくて、IIJmio に電話かけることで開通依頼になります。 電話かけたあと、1 時間くらいして iPhone7 を再起動したら使えるようになってました。

テザリング

ぼくは iPad mini (Wifi) を持っているんですが、モバイルルータを解約して以来、Wifi のある家でしか使えませんでした。 でも、IIJmio の SIM はテザリング OK なので、iPad mini でいつでもどこでもネットに接続できるようになりました。 iPhone の小さい画面よりも、iPad mini のちょっと大きめの画面の方がネットサーフィンとか Kindle での読書とか捗って大変よいです。正直、これが一番ライフチェンジングでした。

「人喰いの大鷲トリコ」に感じた生きている感覚

ここまで感情移入ができたゲームはこれまでありませんでした。もう現実と変わらないです。本当に生きてる。


The Last Guardian – CG Cinematic Trailer | PS4

人喰いの大鷲トリコ

人喰いの大鷲トリコは、ICO、ワンダと巨像に続く、上田ワールド全開の作品です。E3 2009 に発表されて早 7 年、プラットフォームを PS3 から PS4 に移し、もう開発は中止されたんじゃないかという噂を乗り越え、ようやく発売になりました。

「ICO」と同様に今作も男の子が主人公で、壮年になった主人公が過去の冒険を振り返る形で物語は始まります。自分の知らぬまま連れてこられた神秘的な雰囲気の廃墟から、主人公は様々なギミックの謎を解きながら脱出を試みます。 その脱出のパートナーとなっていくのが大鷲トリコ。主人公が気付いたときには、傷つき鎖で繋がれたトリコがそこにいました。

ゲームタイトルにあるように「大鷲」トリコは鳥の翼と足を持ってはいますが、ぼくたちの知っている「鷲」ではありません。猫のような耳、鼠のようなしっぽ、そして何より、犬のような態度と純粋さ。 ゲーム開始当初は、お互いが脱出するためだけに力を合わせるだけ。トリコの食べ物が入っている樽を与えても、主人公が離れないと食べてくれない。食べ物がないと、主人公が溺れるかもしれないのに水に入ろうともしてくれない。

冒険を繰り返すうちに、そんな二人に静かな絆が結ばれていきます。 主人公を隣にうとうとと眠るようになり、手渡しで樽を食べてくれ、声をかけると湖にも飛び込んでくれるようになる。見たこともなかった獣が、いぶかしげに首をかしげ、つぶらな瞳で目を見つめ、共感、信頼がゆっくりと結ばれていくのは、ゲームではなければできない表現だと思います。

ゲームでしかできない表現、ゲームでしかできない感情、それが人喰いの大鷲トリコには満ちています。 ゲームでここまで感情を、それも感動とかではなく、慈しみみたいな感情を覚えたのは初めてでした。

PostgreSQLの論理バックアップ時に使用するpg_dumpの基本的な使い方

db technology

pd_dump は、PostgreSQL のデータバックアップを取得するためのコマンドラインツールです。 どういう形でバックアップするのかは、まずは実例を見て頂けるとわかりやすい。

$ pg_dump -h 127.0.0.1 -U postgres dvdrental | less
--
-- PostgreSQL database dump
--

-- Dumped from database version 9.6.1
-- Dumped by pg_dump version 9.6.1

SET statement_timeout = 0;
SET lock_timeout = 0;
(略)
--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
(略)
--
-- Name: actor; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE actor (
    actor_id integer DEFAULT nextval('actor_actor_id_seq'::regclass) NOT NULL,
    first_name character varying(45) NOT NULL,
    last_name character varying(45) NOT NULL,
    last_update timestamp without time zone DEFAULT now() NOT NULL
);
(略)
-- Data for Name: actor; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY actor (actor_id, first_name, last_name, last_update) FROM stdin;
1       Penelope        Guiness 2013-05-26 14:47:57.62
2       Nick    Wahlberg        2013-05-26 14:47:57.62
3       Ed      Chase   2013-05-26 14:47:57.62
(略)

こんな風に、pg_dump はデータベースの内容を読み取り、それを標準出力に出力します。 PostgreSQL は物理バックアップもできますが、pg_dump のメリットはオンラインバックアップが可能ということです。 他のユーザのトランザクションをブロックすることなくダンプが可能です。 ビューやシーケンス、ファンクションといったオブジェクトも対象になります。

特定のテーブルだけをダンプ出力することも可能です(-t TABLENAME)。また、標準出力ではなくファイルに直接出力したい場合は、-f FILENAME を指定します。

$ pg_dump -h 127.0.0.1 -U postgres dvdrental -t ACTOR -f actor.sql

リストアについては、生成されたダンプファイルを psql に食わせれば良いです。

$ psql -h 127.0.0.1 -U postgres dvdrental < actor.sql

ただし、ダンプには create database 等、オブジェクトの作成が含まれるので、オブジェクトが作成済のデータベースに対してリストアすると、ERROR: relation "actor" already exists といったエラーが発生します。 データだけをダンプに含ませるためには、-a オプションを使用します。

$ pg_dump -h 127.0.0.1 -U postgres dvdrental -t ACTOR -a -f actor.sql

実はダンプファイルにはいくつかフォーマットが存在しており、これまでに使ってたのはデフォルトのスクリプトファイル (SQL) です。 他には、以下のような形式があります。いずれも、pg_restore を使ってリストアします。

custom (-Fc で指定)

カスタム形式と呼ばれるフォーマットです。形式はバイナリなので、スクリプトファイルのように人が読むことはできません。

directory (-Fd で指定)

ディレクトリ形式と呼ばれるものです。これを指定する場合、-f ではディレクトリ名を指定します。

$ pg_dump -h 127.0.0.1 -U postgres dvdrental -t ACTOR -a -Fd -f dump
$ ls dump2
./  ../  2236.dat.gz  toc.dat

この dat.gz にデータが含まれています。

$ gzip -dc dump/2236.dat.gz | head -5
1       Penelope        Guiness 2013-05-26 14:47:57.62
2       Nick    Wahlberg        2013-05-26 14:47:57.62
3       Ed      Chase   2013-05-26 14:47:57.62
4       Jennifer        Davis   2013-05-26 14:47:57.62
5       Johnny  Lollobrigida    2013-05-26 14:47:57.62

tar (-Ft で指定)

tar 形式には、restore 用の SQL が含まれます。 直接実行してもリストアできるはずですが、通常は pg_restore を使った方が簡潔です。

$ pg_dump -h 127.0.0.1 -U postgres dvdrental -t ACTOR -a -Ft -f actor.tar
$ tar tf actor.tar
toc.dat
2236.dat
restore.sql

実際に restore.sql の中身を見ると、データファイルからデータをコピーしていることが分かります。

$ tar xOf actor.tar restore.sql| less
(略)
--
-- Data for Name: actor; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY actor (actor_id, first_name, last_name, last_update) FROM stdin;
\.
COPY actor (actor_id, first_name, last_name, last_update) FROM '$$PATH$$/2236.dat';

--
-- PostgreSQL database dump complete
--

PostgreSQLのサンプルデータを簡単につくる

db technology docker

PostgreSQL で遊ぶときのテストデータを簡単につくりましょうという話です。 PostgreSQL にはDocker 公式のイメージがあるので、それを立ち上げればまずは PostgreSQL 環境はできあがりです。

$ docker run --name postgres -d -p 5432:5432 postgres:9.6.1

あとはデータを作成するってところですが、以下からゲットすれば良いかしらと思いました。

ここから、dvdrental.zip をダウンロードして解凍すると、dvdrental.tar ができます。 これはダンプデータになっているので、pg_restore を使うことでリストアできます。

というわけで、データベースを作成して、

$ psql -h 127.0.0.1 -U postgres -c "CREATE DATABASE dvdrental;"

あとはリストアすれば良い。

$ pg_restore -h 127.0.0.1 -U postgres -d dvdrental ./dvdrental.tar

これによって、データがインポートされています。

$ psql -h 127.0.0.1 -U postgres dvdrental -c "select count(*) from actor;"
 count
-------
   200
(1 row)

息をするな…「ドント・ブリーズ」を見てきた

event

このあいだ、王様のブランチで取り上げられていた Don't Breathe、気になって映画館に足を運ぶことになりました。 ジャンルはホラーですが、心霊現象といった類のものは一切登場しません。それでホリラー足り得るのかというところですが、公式サイトの表現では「ショッキング・スリラー」ということで、ホラーというよりはこちらの表現の方がずっと相応しいと思います。 ぼくは心霊系が結構苦手なのですが、この映画はそういう意味で正しく恐怖できました。

Yahoo!映画の評価は現時点で 3.84 点とそこそこの好評価。 ぼく自身も、今まで見てきた映画の中で一番スリルを感じましたし、見て後悔するタイプの映画では決してないと思います。

ストーリーについては、まずはこちらのトレーラーを見て頂くのが早いと思います。


映画 『ドント・ブリーズ』 予告

主人公であるロッキーはお金欲しさに恋人、友人と 3 人で、盲目の退役軍人の老人の家に忍び込みます。 盲目であるが故に、窃盗は簡単に成功するかに思えたのですが、目が見えない代わりに気配を異常に敏感に察知することができる老人に、暗闇の中で徹底的に追い詰められていく、というストーリー。

派手な演出はほとんどなく静かに進んでいく映画なのですが、その静寂が空気をキンと張り詰めさせて恐怖感を煽りますし、「音を出すと老人に見つかってしまう」という緊張感、静寂の中で追い詰められていく絶望感が映画の中から館内にも伝播して、見ている方も物音一つ立てられないような錯覚に陥ります。息をするな、というオフィシャルサイトの売り文句そのままに、息をするのも躊躇われる緊張感の連続でした。

実は老人には人には言えないような秘密があり…というのはお約束かもしれませんが狂気を感じさせるという意味では良かったのかもしれません。この設定自体は割と蛇足な感じがしましたが、気になる方は映画館で。

hex-encodedな文字列をUTF-8に変換する

とあるプロジェクトの技術支援に入っているのですが、API リクエスト/レスポンスの送受信内容(UTF-8)のログが、すべてバイト列を hex-encoded されたものになっているようなシステムになっております。 人類は長い歴史を無為に生きてきたため、hex-encoded されたバイト列を頭の中で UTF-8 にエンコードできるほど進化しておりません。なんとかしないといけない。

そういうわけなので、なんとかして UTF-8 のバイト列が hex-encoded された文字列をプレインテキストに戻してやるツールが必要になります。 それでいて、開発は Windows でなされているので、ツールは Windows で動かないといけない。

おやおや、これは Go で書けば良いんじゃねーかと思いまして、初めて Go でプログラムを書いてみました。

こんなかんじで、hex-encoded された文字列を標準入力に食わせると、標準出力に結果を出力する。

$ cat hello
e38193e38293e381abe381a1e381af
e38193e38293e381abe381a1e381af
$ cat hello | ~/bin/hexstr
こんにちは
こんにちは

でも、自宅に Windows 環境ないし Windows で標準入力に投入するテストしにくかったのと、オプション解析を Go でどうやるのか試したかったので、オプション引数でファイル指定にも対応する実験をしてみた。

$ ~/bin/hexstr -i hello
こんにちは
こんにちは

Go の標準ライブラリが結構充実していたので、あんまし大した実装しなくて良い。 以下がだいたいの処理なんだけど、ファイル開いて hex-encoded の文字列を取り出して、それをデコードしてから utf-8 の文字列として出力するだけ。

func run(args []string) int {
    var scanner *bufio.Scanner
    var filename = flag.String("i", "", "file path which includes hex-encoded lines")

    flag.Parse()

    if *filename == "" {
        scanner = bufio.NewScanner(os.Stdin)
    } else {
        file, err := os.Open(*filename)
        if err != nil {
            fmt.Fprintf(os.Stderr, "file open error: %s\n", err)
            return ExitCodeOpenFileError
        }
        defer file.Close()

        scanner = bufio.NewScanner(file)
    }

    for scanner.Scan() {
        var hexString = scanner.Text()
        var decoded, err = hex.DecodeString(hexString)
        if err != nil {
            fmt.Fprintf(os.Stderr, "failed to decode \"%s\": %s\n", hexString, err)
            return ExitCodeInputError
        }
        fmt.Println(string(decoded))
    }

    if err := scanner.Err(); err != nil {
        fmt.Fprintf(os.Stderr, "scanner error: %s\n", err)
        return ExitCodeInputError
    }

    return ExitCodeOK
}

むしろつらかったのはツールチェーン系で、クロスコンパイルを楽にするための gox とか、いろいろあるのだなぁという学習コストそれなりにあったし、今後もありそう。まぁこのあたりの学習コストはどの言語でも必要なので、慣れるしかない。

l

手掴みシーフードレストラン、新宿の「ダンシングクラブ」に行ってきた

event

手掴みで食事するのってインドなイメージがあったんですが、新宿のレストランで手掴みで食べるところがあったとは!

年始のご挨拶もかねて、妻のご家族とレストランに行ったんですが、ダンシングクラブが相当エッジ効いててヤバかったです。

立地は新宿駅徒歩 1 分で、まさに新宿のど真ん中なかんじのところにあります。 入店したときから、「ダンシングクラブ」という名前に負けないダンサブルな音楽の音量に驚かされます。時折、ホールをしていたスタッフが踊り出すという催しもやっていて、しかもそのダンスがキレッキレ。

ルイジアナスタイルのシーフードレストランということで、ルイジアナのイメージが変わりそうなのですが、売りはなんといってもシーフード、そして皿のない、手掴みでの食事スタイル。 単に蟹やエビを手掴みで食べるってだけなら日本料理でも手掴みで食べることはあるかもしれませんが、なんといってもこのダンシングクラブの料理は、ケジャン等のグチャっとしたソースがたっぷり乗ったシーフードを手掴みで食べるところにあります。

今回は WEEKEND LUNCH ということで、「名物! ズワイガニと大海老コンボバッグコース」というものを頼んだんですが、ホントに手が汚れるのなんの。

シグニチャーソース(ケイジャンソース)と、クアトロチーズソースでお願いしたんですが、ホントにスパイスの効いたトマトソースとチーズたっぷりのソースで手がいとも簡単に汚れていきます。

それでも、魚介のダシがこれでもかっていうくらいに効いていて、手が止まらないかんじ。予約が取りづらいのもうなづけます。 スープはさすがに皿がありますが、サラダももちろん手掴みです。とにかく手が汚れる。

手が汚れるのはもちろん店側も認識していて、レストランど真ん中に、Dyson のハンドドライヤーが5、6個鎮座していて、いつでも洗いに行けるつくりになっています。

コースは 2 時間制だったはずなのですが、蟹の甲羅と格闘し、手を洗い、ダンスを見たらあっという間に時間が過ぎていきました。

とても静かに御飯を食べようというタイプの店ではないですが、たまには違う雰囲気の店でおいしく食べたい、というような場合にはすごく良いお店だと思います。

findコマンドにおける -newer オプション

technology command

みんな大好き find コマンド、-newer オプションというのをはじめて知った。find コマンド、マニュアルを読む度に発見ある。 -newer オプションはファイル名を引数に取って、そのファイルよりも modification time が新しいと true を返す述語になってる。 たとえば、以下のようなバックアップスクリプトを書けば、雑なバックアップが実現できることになる。

$ find /path -newer /var/backup/backup.timestamp -exec some-backup-command {} \;
$ touch /var/backup/backup.timestamp

find コマンド、ファイルの時刻に関する述語が多いんだけど、時間の粒度が大きくて不便だから、そういうときに使うと良いのかなと思ってた。 というのも、ファイルの変更時刻とかは touch コマンドの -t オプションを使えば秒(場合によってはもっと粒度細かく)単位で設定できるので、この -newer オプションがあれば秒単位でのファイル/ディレクトリ抽出が可能になります。

わー便利、とか思ってたら、man だと -newerXY とかいう項目があって、別にファイルの変更日時基準ではなくて、i-node の作成時刻だとか、アクセス時刻基準とかでも柔軟に制御ができるようになってた。(-newerXYXY を特定の文字にすることで、これらを変更できる)。 さらに、Yt とすると、ファイルの属性から時刻を取得するのではなくて、直接時刻を記述できるようになってた。

$ find ./* -newermt '20170101 01:01'

いつのまにできるようになったんだろう。世の中、いろいろと変化してる。もはや自分は老害と化しているのではないか。

失敗の本質

book

2 年くらい前に良い本だと紹介されてからずっと読めていなかった「失敗の本質」、手応えのある骨太の本でもあり、なかなか進みませんでしたが、この年末年始でようやく読了することができました。

失敗の本質―日本軍の組織論的研究 (中公文庫)

失敗の本質―日本軍の組織論的研究 (中公文庫)

  • 作者: 戸部良一,寺本義也,鎌田伸一,杉之尾孝生,村井友秀,野中郁次郎
  • 出版社/メーカー: 中央公論社
  • 発売日: 1991/08
  • メディア: 文庫
  • 購入: 55人 クリック: 1,360回
  • この商品を含むブログ (287件) を見る

失敗の本質は、第二次世界大戦における日本の戦い方、より正確にはその負け方、敗因を分析し、現代の組織にとっての教訓・反面教師として活用することを目的とした「研究書」です。 この本のテーマははしがきの中で、以下のように述べられているので、そちらを引用した方が分かりやすいかもしれません。

たとえ日本の大東亜戦争史を社会科学的に見直してその敗北の実体を明らかにすれば、それは敗戦という悲惨な経験のうえに築かれた平和と繁栄を享受してきたわれわれの世代にとって、きわめて大きな意味を持つことになるのではないか。

ダイヤモンドでも特集を組んでいました。

取り上げているのは以下の 5 つの有名な作戦/戦いで、それぞれの分析に 1 章を費しています。個々の戦いがどのように進み、どのような大本営と現場との間でどのような情報連携がされ、アメリカが何を考え、日本がどのように負けていったのか、個々の戦いの内容を見るだけでも十分に読み応えがありました。

しかし、この本の趣旨は、個々の戦いの敗因の一般化です。なぜ日本軍が、ただ負けるだけでなく、妥当とはとても言えない判断を積み重ねて負けていったのか、退屈することなく読み進めることができました。

適応能力

ぼくの読み取った限りでは、日本軍の失敗は、「常に変動していく戦場・戦況に、柔軟に適応していくことができなかったこと」にあります。 皮肉だなと思ったのが、この大きな要因が、過去の成功例に「適応し過ぎて」日々変わる状況に「適応できなかった」から、ということです。本文では、「適応は適応能力を締め出す (adaptation precludes adaptability)」と紹介されています。

帝国陸軍は西南戦争、日清戦争、そして日露戦争(旅順戦)で成功した銃剣突撃主義と精神主義、海軍は日本海海戦において歴史上稀に見る完全勝利を収めた艦隊決戦主義と、それぞれのパラダイムに従って、組織設計、戦術設計、教育、人事制度を進めていました。 強い成功体験があるが故に、時代が変わった後もその成功体験を否定することができませんでした。年功序列的な昇進制度により組織が極めて安定的になってしまったこと、無難で納得性のある人事をしようとするが故の学歴主義、結果よりもプロセス重視、信賞必罰のなさ、情緒主義の採用、等等、どこかで聞いた事柄かもしれません。

これはまさに食傷気味なガラパゴス化 wikipedia:ガラパゴス化 と同じ構造ですし、イノベーションのジレンマにおける「ジレンマ」に相当する部分です。

イノベーションのジレンマ―技術革新が巨大企業を滅ぼすとき (Harvard business school press)

イノベーションのジレンマ―技術革新が巨大企業を滅ぼすとき (Harvard business school press)

失敗の本質、年初に読むにはちょっと重い本でしたが、このくらいの時間がないと読めない本であったという意味では、この時期に読んで良かったなと重います。

新幹線の指定席確保の争いは切符の発売日の1週間前から始まっている

usual day

ぼくの地元は山口県でして、年末年始で新幹線のチケットを押さえるのは結構大変です。しかし、東京・山口間で 5 時間ちかく座れずに立っているのはこの歳になるともはや死を意味しますから、強い使命感を持ち、意地でも新幹線の予約席を確保しなければならない。

新幹線の指定席というのは乗車日 1 ヶ月前から発売開始されるというのはもはや世の中の常識ですが、戦いはその前から始まっています。 JR では「えきねっと」というサービスをやっておりまして、会員登録すると、「事前受付」というサービスが利用できるようになります。 これ、どういうことかというと、発売開始日のさらに 1 週間前の午前 5:30 から、PC/スマートフォンで指定席の予約受付ができるんです。

注意すべき点としては、このサービスは、座席を確実に予約できるというわけではないということ。 当然ですが、みなさんみたいな日頃の行いが悪い人を新幹線に乗せるなんていうのは JR にとっては由々しき自体ですから、そういうときは予約不可という形になって、メールでお断りされます。

_/_/_/お申込の指定席は満席です_/_/_/
 
この度は、えきねっとJR券申込をご利用いただき、誠に
ありがとうございます。

大変申し訳ございませんが、満席のため、お申込いただ
きました指定席は、ご用意できませんでした。

なんで満席なんだクソ。

日頃から清く正しく美しくをモットーに清廉潔白な人生を歩み、新幹線の指定席に乗れるように日々心がけましょう。