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

isomorphic所感

JavaScript Programming

React・Fluxまわりをひと通り触ってみたので所感を徒然。

isomorphicなアプリを書く

そこまで大した話ではない。

  • isomorphicなライブラリをnpmで入れる。
  • isomorphicなコードを書く。
  • node.js(io.js)ではそのまま動作。
  • ブラウザ用にはbrowserify。

所感:

  • bowerのオワコン感。
  • webpackのtoo complicated感。

altJSの選択

巷のFluxライブラリはReact前提な部分があるので、全てを生JSを書くことはまず考えられない。

ほぼ以下の4択(ハイブリッド可能)。

  • CoffeeScript
    • 書きやすさ以外に特筆すべき部分はない。
  • TypeScript
    • 型を書けるという圧倒的ユニークスキル。
  • JSX
    • The React。ES6のサポート。
  • ES6 JS (babel, etc.)
    • 次世代JS。
    • 正式サポートされるまでの投資感。
    • トランスコンパイラの代表格babel*1が何故かJSXをサポートしている。

判断の軸:

    • これを再重視するならTypeScript以外の選択肢はない。
  • 書きやすさ
    • CoffeeScriptはなんだかんだで書きやすい。ただES6が十分書きやすいので、今後の立場はどうなるか。
  • 将来性
    • 当然のことながらES6がランタイムの最適化の期待大。
  • React親和性
    • 1つのライブラリがコンパイラの選択肢にまで影響を及ぼすとは。
    • あるいはVirtualDOMを簡単に書くためのライブラリを使うのは手だが…。

所感:

  • 個人的には全てをbabelに統一するのが良い感じはしている。
    • babel, babel-node
    • browserify, babelify
    • JSXサポート
    • ES7サポート (stage 0)

isomorphicを崩す仕組み

変な表現ではあるが、全てを共通コードにするのは無理。

  • サーバー側: DB, セキュリティ, ...
  • クライアント側: CSS, アニメーション, ...

透過的に委譲するような仕組み

  • Fetchr的な

クライアント側にサーバー側のコードを見せたくない話

  • JSファイルサイズ肥大化
  • セキュリティ

目下この部分を考え中

  • コンパイラレベルのサポート。conditional compilation的な。
    • あまりこういう話はhotじゃない感。
  • 今はエントリポイント分けて頑張るか。

Fluxについて

TODO

Polyfilについて

TODO

*1:元es6to5

フローチャートが書けない

Programming

昔、講義でフローチャートを書かされたような記憶はあるが、
全く自慢にならないが、今「フローチャート書いて」と言われても書ける自信が全くない。
開始が四角で分岐が菱型だったけ?線引いてYes/Noみたいな。そんな感じ?

とはいえ、ドキュメントでフローを表現したいことは間々あるわけで、じゃあどうしているの?
という問いに対しては「擬似コードで良くね?」と答えたい。

Wikipedia見たらこんなフローチャートがあった。

f:id:s-shin:20150329214131p:plain

フローチャート - Wikipedia

この図もそうであるが、基本的にフローチャートは、擬似コードで書ける。

function sumFrom1To10() {
  var n = 1;
  var s = 0;
  while (n < 10) {
    s += n;
    n += 1;
  }
  return s;
}

JavaScriptで書いてみたが、言語は何でも、それこそ架空の言語でも良いと思う。
書き方もあえてフローチャートに合わせてwhile使ってるが、for使えばもっとシンプルに書ける。

...

というようなことを考えていたら、フローチャートは過去の遺物的は議論は既に結論が出ている話題のようだ。

フローチャート不要論 - Google検索

...

では、フローを表現する図は不要なのか、という言われると、そうでもない。
例えば、UMLのシーケンス図は、擬似コード化しづらいので重宝する。
もちろんシーケンス図も完璧ではないが、PlantUML使えばテキストで書けるし、不満は少ない。


オチは特に無い。

PHPの小ネタ: タイプヒンティングの罠

PHP Programming

タイプヒンティングとは

PHP5からタイプヒンティングという似非タイプチェック機能が使えるようになっています。

<?php
interface Runnable
{
    public function run();
}

class Foo implements Runnable
{
    public function run()
    {
        echo 'Foo', "\n";
    }
}

class Bar
{
    public function run()
    {
        echo 'Bar', "\n";
    }
}

function run(Runnable $runner)
{
    $runner->run();
}

run(new Foo);
run(new Bar);
Foo
PHP Catchable fatal error:  Argument 1 passed to run() must implement interface Runnable, instance of Bar given

なるほど中々悪くなさそうな機能です。 が、このタイプヒンティングという機能には、色々と罠が潜んでいます。

スカラー型には使えない

ちゃんとマニュアルを読みましょうという話ですが、

タイプヒントは int や string といったスカラー型には使えません。 また、リソース や トレイト も使えません。

http://php.net/manual/ja/language.oop5.typehinting.php

と書かれています。

<?php
function add(int $a, int $b) // NG
{
    return $a + $b;
}

ついついやりたくなるんですけどね…。

nullは渡せない、が渡せないこともない

何言っているのかというと、こういうことです。

<?php
function echoTimestamp(DateTime $dt)
{
    echo ($dt ? $dt->getTimestamp() : 0), "\n";
}

echoTimestamp(null);
PHP Catchable fatal error:  Argument 1 passed to echoTimestamp() must be an instance of DateTime, null given,

なるほど、nullは渡せないのか! と思いきや。

<?php
function echoTimestamp(DateTime $dt = null)
{
    echo ($dt ? $dt->getTimestamp() : 0), "\n";
}

echoTimestamp(null);
0

デフォルト引数にnullを与えている場合は、null値を引数に渡せます。なんじゃそりゃ。

しかし、デフォルトのパラメータの値として NULL を使用した場合は、後から任意の値を引数に指定できるようになります。

http://php.net/manual/ja/language.oop5.typehinting.php

デフォルト引数が無いときにnull値を与えられないというのは、メソッド内部でnullかどうかで分岐してないということが保証されるので、それはそれで良いのかな*1と良心的に解釈できますが、デフォルト引数nullの仕様は完全に蛇足な気がします。

<?php
function addSeconds(DateTime $dt = null, $seconds = 0)
{
    if (is_null($dt)) {
        $dt = new DateTime('now');
    }
    return $dt->add(new DateInterval("PT{$seconds}S"));
}

$dt = new DateTime('now');
echo $dt->format('H:i:s'), "\n";
echo addSeconds($dt, 300)->format('H:i:s'), "\n";
echo addSeconds(null, 300)->format('H:i:s'), "\n";

全部にデフォルト引数与えるの、なんか違わない?引数なしで呼べるけど意図した使い方じゃないよね、という…。

所感

タイプヒンティングは、nullが来ないことを保証されているのだとポジティブに考えて、上手に使うのが良いのかと思います。

hacklangではもっと厳密に型を宣言できるようなので、一度試してみたい所です。

*1:nullでの分岐をしたくなるシチュエーションはそれなりにありますが、そういうことをするとメソッドブラックボックス度は上がるのでそれが矯正されるなら良くかなという

structの関数プロパティとメソッドの挙動

Programming go golang
package main

import "fmt"

type OpFunc func(int, int) int

type Operation struct {
	// associateされていないのでOperationのプロパティ・メソッドへのアクセスは出来ない。
	Do1 OpFunc
	// 以下コメントを外すと "type Operation has both field and method named Do2"
	//Do2 OpFunc
}

func (op Operation) Do2(a, b int) int {
	return op.Do1(a, b)
}

func main() {
	op := &Operation{
		Do1: func(a, b int) int {
			return a + b
		},
	}
	fmt.Println(op.Do1(1, 2), op.Do2(3, 4))
}

http://play.golang.org/p/4ytA1cOJ1d

golangのType Assertionメモ

go golang
  • Type AssertionはC++のdynamic_cast的な機能。
  • interfaceを別の型にキャストする時に使用。
  • 2通りの受け方がある。
package main

import (
	"fmt"
	"errors"
)

type MyError struct {
	i int
}

func (e *MyError) Error() string {
	return fmt.Sprintf("i = %d", e.i)
}

func check1(e error) {
	myErr, ok := e.(*MyError)
	if ok {
		fmt.Println(myErr)
	} else {
		fmt.Println("It's not *MyError")
	}
}

func check2(e error) {
	myErr := e.(*MyError)
	if myErr != nil {
		fmt.Println(myErr)
	} else {
		fmt.Println("It's not *MyError")
	}
}

func main() {
	e100 := &MyError{100}
	e200 := errors.New("200")
	check1(e100)
	check1(e200)
	check2(e100)
	check2(e200) // panic
}

http://play.golang.org/p/MY2G3J_QPU

package main

import (
	"fmt"
	"strconv"
)

func Println(x interface{}) {
	if i, ok := x.(int); ok {
		fmt.Println(strconv.Itoa(i))
		return
	}
	if i, ok := x.(int64); ok {
		fmt.Println(strconv.FormatInt(i, 10))
		return
	}
	if _, ok := x.(string); ok {
		fmt.Println("ニヤ(・∀・)ニヤ")
		return
	}
}

func main() {
	Println(int(100))
	Println(int64(200))
	Println("300")
}

http://play.golang.org/p/Qt7EPb-4kF

安定してよく使っているiOS/Androidアプリまとめ

アプリ iOS Android

↓の記事見てたら、なんとなくまとめたくなってきたのでまとめ。


2014年版、2ちゃんねるでテンプレ入りしたiPhoneの神アプリ150選 : IT速報

使っている端末

仕事ではNexus5(Lollipop)、iPhone 5sも使ってます。

よく使うアプリ

カテゴライズは上記事を借用します。

2ch

してないのでアプリ必要なし。検索かはてブで行き着くことはあります。

ブラウザ

iOSは基本SafariChromeは使い勝手微妙*1だけどPCとの連携は便利。

AndroidChrome。前の端末(4.0)の時はChromeFirefoxも重かったので標準ブラウザ使ってました。

ウェブクリップ

しない。ブクマか要点をEvernoteにまとめるので十分。

メール

どちらもGmailに集約しつつあります。

もっとも、メールの処理はPCで行うことが多く、スマホで見ることはあまり無いのが実情です。

ランチャー

非使用。ホーム画面を整理する派です。横断検索も使わないですね。

ニュース

基本的にパッシブな情報収集はホッテントリだけですね。

RSS

昔使ってましたが、未読放置ばかりになるので使うのやめました。

天気防災

特になし。ウィジェットググるTwitter検索で十分。

ファイラー

同列で並べると違和感ありますが、強いてあげるならこれです*2

iOSは定番のGoodReader。とはいえほぼPDFリーダーと化してますが。PDFをクロップして読めるのが非常に良いです。

AndroidYahoo!ファイルマネージャーが割りと細かいところまで手が込んでいて良いと思います*3Yahoo!という安心感もあります。初回起動時にホーム画面にショートカット作ったりステータスバー占拠したりすることだけがネックです。

クラウド、ストレージ

Google DriveはPC非同期で大きめのファイル中心、DropboxはPC同期で小物中心という使い分けしてます。

RAS (リモートデスクトップ?)

特になし。昔はいろいろ試しましたが、結局使う機会ないというのが結論です。

お恥ずかしいことにRAS(Remote Access Service)って言葉初めて聞いたのですがVPN的なものなのですね。そういういみでは元記事のカテゴリ名はリモートデスクトップの方が正しいと思います。

ID、パスワード

KeePassに統一。kbdファイルはDropboxで共有してます*4

メモ、テキスト

基本Evernoteです。

日記

特になし。

スケジュール、ToDo、GTD

  • iOS: 標準カレンダー
  • Android: 標準カレンダー

ToDoは結局使わなくなりました。シンプルに使えればそれで十分。

電話帳

iPhone使ってないのでiOSは無し。

Androidは4.0の時は色々試しましたが、4.4ではプリインストールに落ち着きました。

アドレス送受信

特になし。

コミュニケーション

基本公式アプリしかない世界なので、テンプレもなにもないとは思いますが、普通にLineとかです。

Twitter

何故か別枠のTwitter。使用頻度低いので公式で不満無いです。

画像編集

色々入ってますが、結局PCでしか画像編集してないというのが結論。

カメラ

色々入れてはみるものの、なんだかんだで標準アプリしか使わない現実。

QR、スキャナ

iOSみたら色々入ってました。Androidはドコモのプリインのやつ使ってます。

使用頻度低いんで正直動けば何でもいいですね。

録音

特になし。強いて言うなら標準アプリ。

音楽再生

  • iOS: 標準
  • Android: 音楽プレイヤーとして使ってないので N/A

色々葛藤はありましたが*5、今は標準アプリです。

自動プレイリストやイコライザは使わない派です。

音楽検索、歌詞検索

ニーズがないので特になし。

ラジオ

色々入れたけど使った試しがないので省略。

動画

特になし。

ダウンロード

特になし。

書籍ビューア

GoodReaderは前述の通り。書籍系は最近Kindleにガバガバ。

辞書

ググる

地図

PC版Google MapsのUI、使いづらいのでなんとかして欲しいです。

ナビ、電車

Yahoo!乗換案内、文句の付け所がほぼないですね。

メモリ管理

特になし。この手のアプリをあまり信用してないということもあり。

電卓

あまり使う機会無いので何でもいいと思います。

家計簿

社会人になってお金入ってくるようになったので、検討し始めようかという所。

タイマー

標準の時計アプリで十分です。

広告除去

使ってない。

キーボード

iOSのカスタムキーボードアプリ、増えてきた印象ありますが、まだ使ってないです。

AndroidGoogle日本語入力QWERTY入力で上フリックで数字入れられるのがマジで便利です。

株式、FX

特になし。

航空機運行状況

特になし。

ネット将棋

このカテゴリは一体…。

有料制のようですが24アプリ出てたんですね。

まとめ

  • 標準アプリが多い。
  • 特になし、が多い。

アプリの使用頻度に関しても80対20の法則が成り立つ気がしていて、なるべく2割のアプリに絞ろうというのが信条です。

それが、標準アプリや特になしの増加に繋がっているのかなと思ってます。

*1:バックグラウンドのタブの挙動とか

*2:そもそもiOSでファイラ?とも思いますが。

*3:ファイルの移動とか、隠しファイルの表示とか

*4:KeePassXがkbdx未対応なので今のところkbdで統一

*5:iOS側で作ったプレイリストをiTunesでも出したい→標準アプリしか選択肢なし。しかしiOS7のプレイリスト編集機能は最悪!だったがiOS8で若干改善し一応使えるレベルに←イマココ

Kindle書籍を買ったけどダウンロード・配信できない問題と解決法

Kindle Amazon 電子書籍

ググっても今回起きた問題と同一のものが見つからなかったのでメモしておきます。なおTwitterで検索したら数件見つかったのでごく稀に起きる現象のようです。

今回の現象

  • 12月14日0時頃、1-Clickで購入
  • 購入完了画面が出る
  • Kindle Cloud Readerで読む→試し読み版になる*1
  • 配信ボタンを押してもできませんと出る
    • Android端末はグーレアウト
    • Kindle Cloud Reader, iPod Touchの配信ボタンは押せるが、配信できませんと出る。
  • 注文の詳細・領収書は見れる
  • 注文履歴に入っている
    • 未発送の注文にも入っている*2
  • ご注文の確認メールが来ていない

特徴としては、ご注文の確認メールが来てない所になるかもしれません。

解決法

といっても大したことではなく、お問い合わせしただけです。

  1. 画面下部メニュー、右下「カスタマーサービスに連絡
  2. カスタマーサービスに連絡」ボタン
  3. お問い合わせ方法を選択: 電話、チャット、Eメールの3択
    • 夜中だったのでEメールにした
  4. 適当に埋める
    • 注文番号とかも書いておいた。

翌日

  • 3時頃にご注文の確認メールが来た様子
  • 10時頃にお知らせメールが来た

このたびは、Kindle本のご注文について、ご迷惑をおかけしていることをお詫びいたします。

12月13日から14日にかけてご注文いただいたKindle本について、注文の処理に時間がかかりダウンロードが開始されない件について、問題が修復いたしましたのでお知らせいたします。

なお、この問題が発生している間に、同じKindle本を重複してご注文いただいている場合、一方の注文をキャンセルし、返金処理を行います。返金処理が完了しだい、Eメールでお知らせいたしますので、今しばらくお待ちください。(本メールと入れ違いで、お受け取りいただいている場合はご容赦ください。)

その他、ご不明な点がございましたらご遠慮なくお問い合わせください。

どうせこんなことだろうと思い、重複注文しなくて正解でした。

Kindle配信の仕組みの推測

  1. step
    • ユーザ: 1-Clickで購入ボタンを押す。
  2. step
    • サーバ: 該当商品を購入キューに入れる。
    • ユーザ: 画面が切り替わる。
  3. step
    • サーバ: なるはやでキューが処理される。完了時にご注文の確認メール送信。
    • ユーザ: KindleReaderで書籍をダウンロード。

今までも購入後、Kindel Cloud Readerで読む時にお試し版になる現象は何度も起きていました。この原因は3rdステップのタイミングの問題と推測されます。

今回の問題は、3rdステップのサーバ側処理が何らかの原因でスタックしたことが原因ではないかと推測しています。

*1:Kindle Cloud Readerでは購入後のURLと試し読みとURLは同じ。

*2:一回ダウンロードするまではここに入ってキャンセルできる仕組みらしい。