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

プログラマー35歳定年説

押し出されてるのか引き寄せられてるのかわからないが、段々とひとつの業務に集中できなくなってきている。

それは、自分の経験がそうさせているのかもしれないし誰かが求めているからかもしれない。

それを人は成長というのかもしれないが、同時にそれは人生の打ち止めとも言える。 そんな気がする。

誰も行かないところに行こうと決めたのに誰かが踏み歩いた道に続こうとしていることに不安を感じる。

問題は個人的にはどちらでもいいと自分が思っているからだ。
どちらも本当は求めてないし、人に求められるのならそちらに進もうかと安易に針路をとっていないか。

針路があるだけで幸せなのかもしれない。 最後の選択肢は20代後半だと誰かが言った。 もしそれが本当ならまだ選択肢のある自分は幸せなのかもしれない。

幸せ?それは何か?
自分はそれに幸せと感じていないのに他人と比較して幸せだから幸せだと思えというのか。

そもそも幸せになりたいのか、俺は。

とかそういうことを考えている。 いや、考えているというか迷っている。

自分は今年で定年だ。

プログラマー35歳定年説。

それは、嘘であり真実でもある。

自分がだいたいなんなのかどこらへんの人なのかはわかった。
絶望した。諦めた。
まあなんでもいい。

いつの間にか技術を高めることは何かの逃避になっていた。
それは30を目前にしてこの道を選んだ時からそうだったのかもしれない。

うん、先はわからないしそれは昔からそうだった。
次の駅で降りなきゃいけない。
考えるのはまた今度にしよう。

ハイフンぽい文字列をUnicode に変換してそれを「全角の長音」に変換する

JavaScript

文字列をUnicode に変換して置換する

ここではJavascriptでハイフンぽい文字列をUnicode に変換してそれを「全角の長音」に変換する例を示します。

Unicode ⇔ 文字列 への相互変換

“\uXXXX"形式の4桁の16進数を文字に変換

String.fromCharCode(0xff0d); // "-"

文字を"\uXXXX"形式の4桁の16進数で表すに変換

"-".charCodeAt(0).toString(16); // "ff0d"

正規表現で置換する処理に応用

var h = v.replace( /[‐-−―]/g, 'ー');

は以下のように表すことができます。

v.replace(/[\u2010\uff0d\u2212\u2015]/g, '\u30fc');

検証

"‐-−―".replace(/[\u2010\uff0d\u2212\u2015]/g, '\u30fc');

参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Special_characters_in_regular_expressions https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode

Atom でプロジェクトの検索結果をクリップボードにコピーする

AtomGrep検索の結果をコピーしようと右クリックするとコピーするというメニューが存在しない。
ファイル名をコピーしてチャットに貼りたい場合、同じ作業をターミナルや他のエディタで行わなければならず地味にフラストレーションがたまる。 f:id:snowlong:20170126190226p:plain

現在、検索結果をコピーするという機能はAtomには実装されていないようだ。
プルリクエストがあるがマージに失敗して取り込まれていない!

というわけで、Atom でプロジェクトの検索結果からファイル名を抽出する手順を以下に記載する。

手順

1: Ctrl + Shift + i でDeveloper Toolsを開く。
2: 以下のコードをコンソール上で実行する。

pack = atom.packages.getActivePackage('find-and-replace')
pack.mainModule.resultsModel.results

3: 出力されたObjectの上で右クリック。
4: Strore as a global variable を選択する。
すると、tempX (Xは数値)という変数が生成される。
5: コンソール上で以下を実行する。
Windowsなので\を/に変換している。

copy(Object.keys(temp1).map(function(d) {return d.replace(/\\/g, '/');}));

これでクリップボードにtempXの内容が以下のような形式でコピーされる。

[
  "C:/file/path/path.js"
]

あとは、コードをスニペットに登録するなどして使い勝手をよくする。

マージして

しかし、なぜこの機能がまだ実装されていないのか。
はやくマージして使えるようにしてほしい。

Atom実践入門──進化し続けるハッカブルなエディタ (WEB+DB PRESS plus)

Atom実践入門──進化し続けるハッカブルなエディタ (WEB+DB PRESS plus)

コインランドリー事情 - 所有から共有へ

地味に儲かる

http://tegamisha.com/renew/wp-content/uploads/2015/09/IMG_1513.jpg 今日のお手紙 » Blog Archive » 世にも楽しいコインランドリー@ポートランド

最近はコインランドリー投資がはやっているらしい。

「実際、コインランドリーは儲かるんですか?」

すると、こんな答えが即返ってきました。
「地味に儲かります!」

儲かるでも、「地味に」というあたりがなんとも生々しい。コインランドリーは手堅い商売で、急激に売り上げが上がることはないが、徐々に右肩上がりで推移していく商売なのだそうです。

地味に儲かる、いい言葉だ。

なるほどと思ってKindleでこの書籍を購入してみました。
ポジショントークが鼻につくが、事実コインランドリー数は増えているので儲からないことはないのだろう。

f:id:snowlong:20170115151233j:plain

自分は自宅に乾燥機があるが業務用の乾燥機に比べて一度に乾燥できる量、パワーには不満を感じている。
ガスで一気に乾燥する業務用の乾燥機で乾かした洗濯ものは違うのだ。

様変わりするコインランドリー

http://www.freddy-leck-sein-waschsalon.de/uploads/images/IMG_8724.JPG Freddy Leck sein Waschsalon

画像はドイツのベルリンにあるカフェっぽい感じのコインランドリーで乾燥機回している間の時間を快適に過ごしてもらう工夫、Wi-Fiが飛んでたり、をいろいろとしている。
日本ではこのブランドのトートバッグが人気だ。
Freddy Leck(フレディレックウォッシュサロン) ランドリートート FL-109

冒頭の画像もポートランドのコインランドリーのもの。
もうね、カフェやコインランドリーといった言葉では表現できない空間ですよね。
さすがに日本でこんな土地の使い方は難しいかもしれないけどこれだったら洗濯ものを乾燥させるついでにちょっと作業するかーってなりますね。
あと雰囲気が清澄白河ブルーボトルコーヒーに似てますね。
工場かなにかを改修したのかな?

コインランドリーは乾燥が終わるまでどこかで時間を潰すか、回る洗濯ものを眺めるかのどちらかしか選択肢はなかった。

村上春樹世界の終りとハードボイルド・ワンダーランドでコインランドリーの描写がある。
じめじめした天気の日に所在なさげにすごす場所、それがコインランドリーというものである。

雨の日曜日ということで、コイン・ランドリーの四台の乾燥機は全部ふさがっていた。
色とりどりのビニール・バッグやショッピング・バッグがそれぞれの乾燥機の把手にかかっていた。 ランドリーの中には三人の女がいた。
一人は三十代後半の主婦で、あとの二人は近所の女子大の寮に住んでいる女の子のようだった。
主婦はなにもするともなくパイプ椅子に座ってTVでも見るみたいにじっと観点する洗濯ものを眺めていた。
女子大生は二人並んで「JJ」のページを繰っていた。

もちろん、気の利いた人間は休日の午後をコインランドリーで過ごすことなどしない。

私は椅子の上で全身の力を抜いて、空間の一点をぼんやりと眺めていた。
ランドリーの中には衣服の乾燥していく独特の臭いと洗剤の臭いがいりまじった不思議な臭いが漂っていた。
となりでは二人の女子大生がセーターの柄について話し合っていた。
どちらもとくに美人というわけではない。
気の利いた女の子は日曜日の午後にコイン・ランドリーで雑誌を読んだりはしていない。

いいぞ春樹!

乾燥機にかけて洗濯ものが乾くまで30分くらいの時間が発生するわけですね。

ここにビジネスチャンスがあると世の中の資本主義の権化どもは考えるわけです。

この30分の間にコーヒーでも売りつけて、おしゃべりでもさせとけばいいじゃんと。 コインランドリー側からしてみれば、ドリンク代も売り上がるし、乾燥機も効率的に回すことができるしでメリットばかり。

利用者だって快適に過ごせて、インスタにあげられるようなおしゃれなコーヒーを提供してくれるならうれしいですよね。
おだやかな気持ちで他人の自慢投稿を読み流すことができると思います。

都内でもこんな感じでコインランドリーをコミュニケーションの場として提供しているところもあります。

所有から共有へ

少しずつですが個人の所有から、みんなで共有するという方向に社会が動いているようです。
この動きを後押ししているのがテクノロジーだというのが面白いですね。
心をもたないテクノロジーが人と人のつながりを生む手助けをしてくれている。

カーシェアリングとか

音楽のストリーミングはちょっと違うけど個人が所有していないという意味では同じですね。

こうやって世の中の変化に意識的になるのは面白いですね。
ちなみに、コインランドリー1500万くらいからではじめられるそうです。

2016年に読んだ書籍ー人体六〇〇万年史 など

本棚を見ればその人がわかるという格言があったようななかったような。
というわけでAmazonの購入履歴から2016年に読んだ本をまとめてみます。

プログラミング

2016年といえば機械学習ですね。
パラっと読んで雰囲気つかんでそれっきりですが…

フレームワークとか使わない素のjavaScript(いわゆる Vanila JS)で書かれているのがよかった。
内容も実践的かつ薄いのによくまとまっていてよかった。

HTML5プロフェッショナル認定試験 レベル2 対策テキスト&問題集 (Mynavi Examination Library)

HTML5プロフェッショナル認定試験 レベル2 対策テキスト&問題集 (Mynavi Examination Library)

試験を受ける気はないけどこれもよくまとまっていてよい。
教育用に買ったのだけど自分の知識の整理になってオトクな一冊でした。

コンピュータ・IT

10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く (Informatics &IDEA)

10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く (Informatics &IDEA)

読みかけだけど良さげなので。
これからエンジニアと非エンジニアの区別がつかなくなる時代を見越した一冊。
データが欲しかったら自分でSQL叩く時代ですよ。

カンバン: ソフトウェア開発の変革

カンバン: ソフトウェア開発の変革

プロジェクトの進め方に悩んでいたときにAmazonで評価高かったので購入。
個人的には欲しい情報はそんなになかったですが読み物として読みました。

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

ソフトウェア開発者のための本なのだが、本業で稼いだ金で不動産投資してリタイアしようぜって本でした。
筋トレはいいぞとか、瞑想しろとか、どんどん人に会うべきだとか書いてあってこの本はいったい何の本なんだ!?って思いました。
個人的には2016年の異端の書として半笑いで読んだ。
決して間違ってはいないけどね、これを周りのエンジニアに進めてもねウザいやつだなと思われるのが関の山。

ビジネス

クリティカルチェーン―なぜ、プロジェクトは予定どおりに進まないのか?

クリティカルチェーン―なぜ、プロジェクトは予定どおりに進まないのか?

これもプロジェクトの進め方についての本。
得てしてこういう類の本は小説としてのクオリティ低くてゲンナリするのだが、ちゃんと小説になっていてすごい。
で、欲しい情報がそこにあったかというとなかった。

ノンフィクション

アカマイについての本。

マインクラフト 革命的ゲームの真実 (角川学芸出版単行本)

マインクラフト 革命的ゲームの真実 (角川学芸出版単行本)

もっと技術的なことが書いてあると期待してたのだがNotchの人生について詳しくなっただけだった…
好きな人なら。

コンテナ物語―世界を変えたのは「箱」の発明だった

コンテナ物語―世界を変えたのは「箱」の発明だった

この書評を読んで購入。20世紀最大の発明はどう考えても「コンテナ」だったという話 : 超音速備忘録
正直書評のほうが面白かったぜ。

映画マネーショートの原作。

貧困

家のない少年たち

家のない少年たち

少年は暴力に走る。

最貧困女子 (幻冬舎新書)

最貧困女子 (幻冬舎新書)

少女は売春に走る。

ルポ 貧困大国アメリカ (岩波新書)

ルポ 貧困大国アメリカ (岩波新書)

アメリカはトランプを選ぶ。

歴史

微妙なテーマなのだからまあわからなくもないのだけど、いろんな方面に配慮してる文章がうっとおしく感じるところもあった。
でも貨幣は人類普遍の宗教という考え方は目からうろこだった。 下巻は未読。

科学

意識はいつ生まれるのか 脳の謎に挑む統合情報理論

意識はいつ生まれるのか 脳の謎に挑む統合情報理論

いつ生まれるんだっけ。
意識がないと僕らが思っている人たち(事故で植物状態になったとか)にも意識はあるんだよとか麻酔は記憶をなくすだけで意識はあるらしいよとかそういう話。

The Story of the Human Body: Evolution, Health and Disease

The Story of the Human Body: Evolution, Health and Disease

下手な栄養の本とか読むよりこの本を読むほうがいい。邦訳もある人体六〇〇万年史 上
個人的にはこの本が2016年のベスト。

小説

人間の絆 上巻 (新潮文庫 モ 5-11)

人間の絆 上巻 (新潮文庫 モ 5-11)

映画セブンでモーガン・フリーマンがおすすめしてたので読んでみた。 モームの自伝的小説。

オートマトンをテーマにした小説。
精霊の箱も読まねば。

照準を持たない暴力性の発動

照準を持たない暴力性の発動

はてな界隈のある一部で有名な人。

エッセイ

河童が覗いたヨーロッパ (新潮文庫)

河童が覗いたヨーロッパ (新潮文庫)

こんなスケッチすらすらと書けるんだからすごいよなー。 時代が変わってもというか古くなればなるほど文化的が高まる本ですよ。

筋肉

Strength Training Anatomy

Strength Training Anatomy

Delavier's Core Training Anatomy

Delavier's Core Training Anatomy

はい。このトレーニングはどの筋肉を鍛えているのかが一目瞭然です。
見てるだけで楽しいです。
筋肉は裏切らない。

総評

The Story of the Human Body: Evolution, Health, and Diseaseがベストでした。
脳とか人間の体についての本が好きだなあとあらためて思いました。

貧困をテーマに三冊も読んでいてBrexitのちょっと前くらいだったかなあ。世界はひとつよ国境なんていらない派とんなわけねーだろこのスットコドッコイ派の分断が浮き彫りになったなあと。
ブレイディみかこの底辺からの保育士目線のほうが、セレブ気取りのミュージシャンなんかよりもよっぽど説得力があるわけですね。 困ったことになりましたね、特にヨーロッパはもうやばいですね。

$.ajax で直列処理を行う

2016年もjQuery を使ってます。

f:id:snowlong:20161117184446g:plain

ふと、以下のようなことがしたくなりました。

  • 可変リストのデータを利用してAjaxjsonを取得したい

  • 非同期ではなく一つの処理が終わったら次の処理を実行するようにして、処理の順番を保証したい

  • 戻ってきたdata を処理してViewに描画したい

でいろいろと悩んだのですが以下のように実装しました。

// number_list は可変リストという想定
var number_list = [
  'number1',
  'number2',
  'number3',
  'number4',
];
var html_data = [];
var number_list_length = number_list.length;

var loadDataRecursive = function(){
  if(!number_list ) {
    return;
  }
  var number =  number_list.shift();
  var url = '//cdn.hogehoge.jp/json/' + number + '.json';

  $.ajax({
    type: 'GET',
    url: url,
    dataType: 'jsonp',
    jsonpCallback: 'callback_' + model_code,
  }).done(function(data) {
    // dataをつかって描画処理する
    html_data.push('<p class="title">' + data.productName + '</p>');
    html_data.push('<p class="title">' + data.productNumber + '</p>');

    // 最後まで処理を行ったらappend する
    if(number === number_list_length) {
      $('#model-list').append(html_data.join(''));
    }
    // 再帰的にコール
    if (number) {
      loadDataRecursive();
    }
  }).fail(function() {
    console.log("loadDataRecursive is failed: " + number );
  });
};
loadDataRecursive();

ポイントは

var number =  number_list.shift();

    if (number) {
      loadDataRecursive();
    }

です。

shift()メソッドは、配列から最初の要素を取り除き、その要素を返します。このメソッドは配列の長さを変えます。
いわゆる破壊的なメソッドです。

返された要素をもとに非同期通信を行い、number_listが空になるまでloadDataRecursive()を実行し再帰的に繰り返します。 loadDataRecursive()自体はひとつのjson しか処理を行いません。
number_listの要素数だけ、処理を繰り返すことで処理の順番が保証されます。

描画処理以下のように行います。 配列にDOMデータをプッシュしておいて最後にそいつを表示したいDOMにappend()します。

    // dataをつかって描画処理する
    html_data.push('<p class="title">' + data.productName + '</p>');
    html_data.push('<p class="title">' + data.productNumber + '</p>');

    // 最後まで処理を行ったらappend する
    if(number === number_list_length) {
      $('#model-list').append(html_data.join(''));
    }

これを実現するために丸一日つぶれました。

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック