うっかりエンジニアのメモ

未来の自分に宛てたメモ

2015年まとめ

社会人になってからは毎年あっという間に過ぎていますが、やはり今年もせわしく一年が過ぎ去ってしまいました。 入社して3年近くが過ぎ、ブログのタイトルにある技術支援部署も、来月から異動で離れることになりました。 諸先輩方、大変お世話になりました。新卒で最初に配属された部署が、技術的に尖った先輩がいる環境で良かったです。 (この会社でそういう環境に居られたのは、なかなか運が良かったと思います)

今年勉強したもの

その割に記事が全然書けてませんね…反省します。

resultoon

ひそかにGitHubで10 starsを獲得する目標があり、9月頃に公開したアプリケーションで達成することができて良かったです。

entropiajp/resultoon · GitHub

任天堂のゲームソフト「スプラトゥーン」の戦績を記録するアプリです。HDMIキャプチャの入力を元に画像認識で各種情報を読み取るので、ユーザ入力0でプレイしてるだけで勝手に記録されて便利です。ちょうどエンジニア界隈でスプラトゥーンが流行っていたこともあり、多くの人に知ってもらうことができました。

学生時代の私のネット上の活動といえば、耳コピして演奏した動画を投稿したり、ピアノアレンジの楽譜を起こしたりすることでした。

趣味のアプリではありますが、こうしてエンジニアの人々の目に留まったことで「ピアノを弾く人」から「エンジニア」に一歩衣替えできた気分になり、とても嬉しいのです。

ただし、あまりにスプラトゥーンにはまりすぎて、resultoonを作れたことは良かったのですが、正直、学習はおろそかになってしまいました。。 費やした時間を考えると暗澹たる気持ちになりますが、行けるところまで行ったのでもう悔いはありません。

f:id:entropiajp:20151231233855p:plain

抱負

来年はいよいよ現場で仕事することになります。
今まで培ったことも下地にしつつ、いい意味でまた新入社員のような緊張感を持って、現場の仕事に馴染んでいきたいと思います。
年末年始はこたつでAWSの勉強するぞーー

それでは皆さま良いお年を。

MonsterTV X3A(SK-MVX3A)でSplatoon録画環境を構築する

スプラトゥーンにガチハマリしているので、対戦の様子を録画したくなってきました。 デスクトップのWinマシンでWii Uの映像を録画(キャプチャ)する環境を構築する手順をまとめておきます。所要時間は30分位。

PCI-express接続のキャプチャボードを使用するので、ノートPCでは実現できません。あしからず。

流れ

  • 各種ハードウェア購入
  • 設置
  • Wii U画面解像度設定
  • ドライバ・動作確認用アプリインストール
  • (最低限の)動作確認
  • アマレコTVインストール

マシン環境

項目 内容
MB ASUS P8h77?
CPU Intel Haswell Core i7
memory 16GB
storage システム: SSD データ: HDD
OS Windows 7 64bit

各種ハードウェア購入

合わせて1万円くらいです。

設置・配線

MonsterTV X3AをPCI Expressのレーンに差し込みます。
WiiUから分配器に入力し、2つの出力端子をテレビとMonster X3Aに接続します。

※我が家ではもともとテレビでプレイしていたので、そうでない場合は読み替えてください。

Wii U画面解像度設定

Wii Uの画面解像度を 720p に変更します。
これに気づかなくて1時間消えました。皆様お気をつけ下さい。

ドライバ・動作確認用アプリインストール

ダウンロード|地デジチューナーやビデオキャプチャなどパソコン周辺機器の製造・販売ならエスケイネット

キャプチャボード開発元の上記ページからMonster X3A用のアプリとドライバをそれぞれダウンロードして適宜readmeにしたがってインストールします。

(最低限の)動作確認

開発元提供の視聴録画アプリで、Wii Uの画面をキャプチャできるかどうか確認します。

ただし、このアプリはあくまで動作確認用に留めます。私の環境では15分に1度程度、画面の横方向に乱れが発生する場合があり、ゲームプレイに支障をきたすためです。実際のプレイ・録画には後述の「アマレコTV」というアプリを使います。 (あと開発元提供アプリは起動時にWindows Aeroがいちいち無効化されるのも煩わしいです)

アマレコTVインストール

アマレコTV公式ホームページ から アマレコTVをダウンロード・インストールします。

Ctrl+Sでスクリーンショット、Ctrl+Zで録画開始できます。これらのショートカットは他のアプリをアクティブにしている状態でも効くので、とっさに画像をキャプチャするのがとても楽です。

イカ、よろしく~

Timezone情報の有無によるJackson Deserializerの挙動変化でハマる

timezoneに想いを馳せる1日となりました。

環境

REST APIサーバ + JavaScript MVWフレームワーク構成のWebアプリです。

サーバサイド

クライアントサイド

  • AngularJS 1.3.14

状況

ユーザがアプリの画面で入力した日時を、json形式でAPIサーバに送信するような状況です。

前置き: Date and Time API(JSR310)とは

Java SE 8から導入された日付・時刻を扱うAPIです。

アプリが動作するのがJava8ということもあり、ここではJava8以前からある java.util.Date は使いたくないので、日付・時刻はすべてこのJSR310で定義されたクラスのオブジェクトとして扱うことにします。

ということで、ユーザが入力した日時はサーバサイドで以下のいずれかのクラスにマッピングされることになります。

JacksonでJSR310のクラスにデシリアライズするには

サーバサイドはJavaなので、JavaJSONパーサライブラリが必要です。上で書いたとおり、ここでは定番のjacksonを使うことにしました。

サーバサイド

依存関係に com.fasterxml.jackson.datatype:jackson-datatype-jsr310 を追加します。jacksonのcoreライブラリにはJSR310のクラスのパーサは実装されていないため、この追加モジュールを加える必要があります。

Jackson support for Java 8 Date & Time API data types is automatically registered when Java 8 is used and jackson-datatype-jsr310 is on the classpath. Joda-Time support is registered as well when jackson-datatype-joda is part of your project dependencies.

引用: Latest Jackson integration improvements in Spring

私はビルドシステムとしてGradleを使っているので、以下の記述をbuild.gradleのdependenciesに追加します。

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.5.1")

日付情報を受け取るクラスを決める

先に書いたとおり、JSR310には日時を表現する3つのクラスがあります。

  • java.time.LocalDateTime
  • java.time.ZonedDateTime
  • java.time.OffsetDateTime

今回

  • DB(MySQL)に datetime 型で日付を格納している
  • ORマッパー(Doma)がデフォルトで、MySQLdatetime 型のカラムを LocalDateTimeマッピングする

ということで、 LocalDateTime クラスとしてユーザの入力した日時を受け取ることにします。

問題発生

ユーザが入力した日時データをPOSTすると、サーバ側のアプリ上で例外が発生してアプリが停止しました。

原因

jacksonの LocalDateTimeDeserializer ではデシリアライズできないフォーマットでjsonが送られてきたことが原因でした。

何が起きていたのか

たとえば「2015年1月1日0時0分0秒」という日時データをjsonで送るとき、サーバ側には

{date: "2015-01-01T00:00:00.000Z"}

のようなフォーマットの文字列で送られていました。
このTやらZやらが謎です。ということでぐぐると、ISO-8601形式を知りました。

ISO-8601形式

詳しくはWikipedia先生をどうぞ。

ISO 8601 - Wikipedia

中ほどを見ていくとありました

  • 日付と時刻の間にTを挟んで表記する
  • 時刻の末尾にZを加える事で協定標準時(UTC)を表現できる

さらに調べると、JavaScriptにはまんま toISOString() 関数がありました。

Date.prototype.toISOString() - JavaScript | MDN

toISOString(new Date()) みたいなことをすると、確かにISO-8601形式で日時が表示されました。

Jackson Deserializerでデシリアライズ可能なフォーマット

JacksonでjsonをLocalDateTimeにマッピングする時に使われるDeserializerは LocalDateTimeDeserializerクラス です。このクラスがデシリアライズ可能なフォーマットがわかれば良いと思い、とりあえずソースコードを見ていたら、ありました。

jackson-datatype-jsr310/LocalDateTimeDeserializer.java at master · FasterXML/jackson-datatype-jsr310

    private LocalDateTimeDeserializer() {
        this(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    }

コンストラクタの引数 DateTimeFormatter.ISO_LOCAL_DATE_TIME がめちゃくちゃ怪しいですね。

この時点でうすうす原因に気づいた感じがしてきましたが DateTimeFormatter.ISO_LOCAL_DATE_TIME はJSR310のクラスなのでリファレンスを読んでみると

フォーマッタ 説明
ISO_LOCAL_DATE_TIME ISOローカル日付および時間 '2011-12-03T10:15:30'

DateTimeFormatter (Java Platform SE 8 )より引用

Zがない

LocalDateTimeDeserializerは文字通りローカルな時刻(=タイムゾーンを持たない時刻)を扱うので、ケツZなぞ知らん、というわけです。

例外発生までの流れ

ユーザが日付を入力する
-> Dateオブジェクトが作られる
-> DateオブジェクトをPOSTする時、Angular内部で toISOString() 関数によりISO-8601形式に変換される(たぶん)
-> ケツZがついたフォーマットでPOSTされる
-> LocalDateTimeDeserializerからみたらデシリアライズできないケツZ
-> \(^o^)/

解決策の前に前提条件

  • JavaScriptのDateオブジェクトをAngularJSで送信しようとすると、ISO-8601形式で送信される
  • jacksonの LocalDateTimeDeserializer ではISO-8601形式の文字列をデシリアライズできない

解決策

クライアントかサーバか、どちらかで頑張るということになります。。。

解決策1: clientで日時のフォーマットを整形してから送信する

AngularJSなら、dateフィルタに処理させる。

$filter('date')(new Date(), "yyyy-MM-dd'T'HH:mm:ss")

これでDateオブジェクトのケツZが除かれた状態で送信されるので、何の問題もなくLocalDateTimeDeserializerでデシリアライズできます。ただし、この対処はタイムゾーンなしデータへの変換作業をclient側に寄せています。この方法ではすべての箇所で変換してから送らないといけないのでだるいです。

解決策2: serverでZonedDateTime型にデシリアライズする

ZonedDateTimeに対応したDeserializerである InstantDeserializerタイムゾーン情報付きのISO-8601形式のフォーマットをデシリアライズすることができます。 なので、ユーザの入力を一旦ZonedDateTime型で受け取り、内部でLocalDateTime型に変換します。 DBに格納する前にZonedDateTime型のオブジェクトをLocalDateTime型のオブジェクトに変換すればOKです。 幸い、それ用のAPIが用意されていました。( ZonedDateTime#toLocalDateTime() )

まとめ

解決策2を採用して、めでたく日時情報をやりとりできるようになりました。おしまい。

参考

sublime text 3をWindowsにインストールしたらやること

Markdownとpythonソースコードの編集に利用することを想定しています。

  • package control
  • package
  • font
  • key bindings

package control

なにはともあれ、package controlをインストール

Installation - Package Control

package

下記パッケージをインストール

パッケージ名 機能
Anaconda Pythonの自動補完、lint、pep8警告表示
IMESupport Windows環境下で日本語入力したときのインライン入力窓の位置を正しくする
Markdown Extended markdown中に書かれたソースコードのsyntaxhighlighting
Monokai Extended markdown文書のsyntaxhighlighting
OmniMarkupPreviewer markdown文書をCtrl+Alt+Oでブラウザプレビューできるようにする
Package Control パッケージ管理ツール
Table Editor markdownでテーブルを簡単に記述できるようにする
Theme - itg.flat フラットなsublime textテーマ

Anaconda settings

Anacondaのpep8警告表示を利用するための設定。 Preferences > Package Settings > Anaconda > Settings - Userで開かれる Anaconda.sublime-settings を以下のようにする。

{
    "python_interpreter": "C:/Python27/python.exe",
    "pep8_max_line_length": 99,
    "anaconda_linter_mark_style": "none",
}

1行当たりの文字数制限を99文字にしているのは私の好み。(あと最近はpep8の制限が緩和されたらしい)
3つ目の設定で、pep8警告が控えめな表示になる。(デフォルトは行全体が枠で囲まれる)

OmniMarkupPreview settings

デフォルトのmarkdown文書のブラウザプレビュー時のフォントが美しくないので、cssをいじる。
Preferences > Browse Packages... で開かれるExplorerのウィンドウで C:\...\OmniMarkupPreviewer\public\github.css を開く。
私はメイリオConsolasが好きなので、以下のように編集する。

  • 1行目付近の body のfont-family指定に Meiryo を追加する
  • 334行目付近の .markdown-body code, .markdown-body tt のstyleに font-family: Consolas を追加する
  • 349行目付近の .markdown-body .highlight pre, .markdown-body pre のstyleに font-family: Consolas を追加する

font

Ricty Diminishedを13ptで使う。

yascentur/RictyDiminished

Preferences > Settings - Userで開かれる Preferences.sublime-settings に下記を追加する。

{
    "font_face": "Ricty Diminished",
    "font_size": 13.5,
}

key bindings

Sublime TextはデフォルトではCtrl+Tabの挙動が直感と異なる。
(右のタブに移動してほしいが、「開いた順にタブを移動」する)

これを直感通りに変更したい。Preferences > Key Bindings - Userで開かれるファイルに下記を追加する。

[
    { "keys": ["ctrl+tab"], "command": "next_view" },
    { "keys": ["ctrl+shift+tab"], "command": "prev_view" },
]

参考

悪徳不動産屋にカモられそうになった話

12月に都内某所に引っ越しました。
本当は、11月に引っ越しするはずでした。

某不動産屋で物件が決まり、さて初期費用払って契約という段で、不動産屋が送ってきた精算書がこちら

f:id:entropiajp:20141231233531p:plain

室内抗菌処理代?

ネットで調べてみると出るわ出るわ。
抗菌処理系の項目をしれっと初期費用に忍ばせて入居者から金を巻き上げる事例。
入金はせず、不動産屋に電話してみた。

「この【室内抗菌処理代】というのは、どういう初期費用ですか?」
「入居前に室内を消臭などさせていただく代金となっております」
「これ必須の費用でしたっけ?」
「いえ、任意です」
「そういう説明受けていませんでしたけど」
「え?そうでしたっけ?(すっとぼけ)」
「不明瞭な費用が含まれているので、契約はできません」
「…それなら、抗菌処理代は無料にできますよ(悪びれず)」
「あの〜こういった経緯がありますし、契約にあたって信頼を失っておりますので、契約はなしです。申込金は明日15時までに私の口座に返金してください。着金確認できない場合は、こちらも用意が有ります」
「…はい、わかりました」

翌日、無事に申込金の返金があり、ようやくゴタゴタも終わり。疲れた。。。

「部屋を押さえるには必要なんです」
とか言われて、前もって申込金とか取るのも本当はアレなんだってね。
別の不動産屋にこの経緯説明したら

「まだやってるとこあるんですねw」

って言われました。

以下、あくまで参考資料としてツイートを挙げておきますね。

免許番号とか、どこそこのマーケット上場とか、企業の真摯さを測る指標としてはまったく意味を成しません。。。皆様もお気をつけを。

こんな記事が2014年の締めになってしまいましたが、それでは皆さま良いお年を。

【会ったことある人限定】こやさんフリマ ~2014 Winter~

引越に伴いまして、いくつかフリマします。
興味のある方、@entropiajp までご連絡ください。

最新情報

  • 2014/12/03 02:20 液晶モニターRDT191WLMは譲り先が見つかりました
  • 2014/12/31 23:15 MBP、MacBay、Intel SSDは譲り先が見つかりました

お願い

  • 対象はこやと直接会ったことがある方に限定します
  • すべて中古です。それなりに使用感がありますが、完動品です
  • 急ですが、12/5午前中で〆切とさせていただきます
  • 極力、銀行振り込み&ゆうパック着払いでお願いします
  • 別所でも譲り先を募集しているため、お譲りできないことがあります
  • 同梱など相談OK

【完売】MacBook Pro (15-inch, Mid 2010) [35000円]

f:id:entropiajp:20141202020602j:plain

f:id:entropiajp:20141202020541j:plain

2011年春にヤマダ電機で14万円くらいで買いました。メモリは4GB->8GBに増設してあります。
OS Xは10.10(Yosemite)が入っていますが、購入時のOS X 10.6(Snow Leopard)を入れて譲ることもできます。

スペックはこちら
MacBook Pro (15-inch, Mid 2010) - 技術仕様

【完売】林檎派 MacBay [1000円]

f:id:entropiajp:20141202021000j:plain

上記のMacBook ProのDVDドライブを外して、代わりにSSDなどのストレージに換装できるようにするパーツです。

【完売】Intel SSD 320 120GB [3000円]

f:id:entropiajp:20141202015837j:plain

IntelSSD 320シリーズの容量が120GBのモデルです。

Plextor PX-128M2P SSD 128GB [3000円]

f:id:entropiajp:20141202015905j:plain

PlextorSSD 容量128GBのモデルです。

スペックはこちら
PX-128M3P【終息】 | コンピュータ関連製品の代理店事業 l 株式会社リンクスインターナショナル

【完売】三菱電機 RDT191WLM [1000円]

f:id:entropiajp:20141202020722j:plain

19インチのPC用液晶モニターです。DVIまたはVGAで接続できます。

スペックはこちら
三菱 ディスプレイ

【完売】GLADIAC GTS 250G 1GB [1000円]

f:id:entropiajp:20141202020141j:plain

低消費電力なグラフィックボードです。DVI2個ついているので、マルチディスプレイ用にいかがでしょうか。

スペックはこちら
価格.com - ELSA ELSA GLADIAC GTS 250G 1GB (PCIExp 1GB) スペック・仕様

PS2ゲームソフト Kanon [100円]

f:id:entropiajp:20141202015748j:plain

全年齢版ですので、子供から大人まで安心して遊べます。
レターパックライト(360円)で送付可能です。

Macをインターネットリカバリしようとしたらエラー

来月引っ越すので、普段目の届かない場所にある物も、発掘されてしまいます。

春にMBPr 13inch (Late 2013)を買った結果、4年間使っていたMBP 15inch (Mid 2010)が本棚で埃を被っていることに気づきました。ソフマップ買い取り価格見たらmax5万!急にやる気が出てきてこの機会に売ってしまおうと奮起し、筐体を綺麗にしてさぁリカバリ掛けてクリーンインストールだ、と思ったら、意外と苦戦したので顛末を記録しておきます。

状況

  • 購入当時、HDD320GBと光学ドライブがついていた
  • 自分でパーツ交換して、HDD320GBをSSD256GBに、光学ドライブをSSD128GBに換えていた
  • 外したHDDは自作Win機に載せてサブストレージとして利用していた
  • 売却にあたって、パーツ構成を元に戻した(HDDのデータはそのまま)
  • 手元にSnow Leopard(購入当時のプリインストールOS)のインストールCDは無い

つまり、戻したHDD320GBにはMac OSは無いし、NTFSでフォーマットされている。

まずはPRAMリセット

ハードウェア構成を変えたので、PRAMリセット(⌘+option+P+R同時押しで起動)した。

謎のメッセージ「インストールの準備中にエラーが起きました」

Apple公式ドキュメントOS X:OS X での復元について - Apple サポートにしたがって、クリーンインストールを進めることにした。今はインストールCDが無くても、インターネットリカバリというものが利用できるらしい。

手順通り、⌘+R押しながら起動するとインターネットリカバリが開始される。AppleのサーバからミニマムなMac OSがダウンロード・展開される。しばし待つ。

やがて復元メニューへ。ディスクユーティリティから、HDDを正常認識していることを確認。HDDを検査したところ異常なし。NTFSでフォーマットされているので、Mac OS拡張でフォーマットする。

さてYosemite入れちゃうぞ、とOS再インストールをぽちぽち進めていったところ、

「インストールの準備中にエラーが起きました」

あれ…

何度やっても同じ。再起動しても変わらず。

完全にこれと同じ状況。困った。
OS X再インストールについて〜初心者 | Apple サポートコミュニティ

ヒントになるツイート

インターネットをさまよっていると、何やら気になるツイートが…

これか!!!!

早速ターミナルを起動して確認すると2001年!!なるほど、この時刻を見てインストーラYosemiteのインストール可否を判断しているのか。(PRAMリセットでシステム時刻がリセットされたっぽい)

dateコマンドで現在時刻を設定

インターネットリカバリモードにおけるタイムゾーンはPST(Pacific Standard Time:太平洋標準時)なので、日本の時間から17時間引きます。

たとえば現在時刻を日本時間2014年11月24日23時50分に設定したい場合は

% date 112406502014

となります。

できた

ターミナルを閉じて、再びOSの再セットアップを進めると、、、できました!

30分位でログインして利用できるようになりました。めでたし、めでたし。