iq29 diary

EG.LAB 開発日記

引っ越し反省

引っ越し反省

もしよければ参考に

町田 -> 二日市

方針

  • 基本はヤマト運輸の通常配送でなんとかする
  • 絶対に梱包できないデスク (と付属する収納)、椅子があるので、それはらくらく家財宅急便を利用する
  • PC モニターの梱包はめんどくさいので営業所に持ち込む (パソコン便)

使った段ボールの個数

  • 100 サイズ [38 × 27 × 29] * 28 枚
  • 160 サイズ [55 × 55 × 40] * 5 枚

間取り: 2LDK
梱包所要時間: 3 日くらい

ヤマトから送った個数

31 個 (ダンボールの他、キャリーバック、衣装ケース 2 個、楽器ハードケース)
56,697 円

備考

使った段ボールの個数 ≠ 送った個数
段ボールの拡張に使ったり、段ボールを使わずに郵送したため

反省

  • モニターは買ったときの箱をとっておけば、それで持っていけた。箱代勿体ない
    • 自分でヤマト事業所に持ち込んパソコン便でモニター送ったら箱代込みで約 3,600 円 * 2台 = 7,200円 だった
    • モニターの足を外さないと専用箱に入らないので運んでくれないので注意
  • 段ボールはほぼほぼ 160 サイズでよかった
    • 小さい段ボールで個数が増えると料金が高くなる
  • 引っ越しシーズンのヤマトは 1 回の配送で 10 個しか持っていってくれない
  • らくらく家財宅急便
    • 机とイスと机収納の 3 つで 33,000 円かかった
    • 吊るし作業が発生するとさらに 1 万円かかるらしい
  • 近場だったらレンタカー使って運ぶという選択肢があったかも
  • ぎり段ボールに入らないものはプチプチ梱包するか、段ボール自作して詰めればよかった
  • トータル 10 万円くらいで済んだ
    • 赤帽に引っ越しの見積もりだしたら 16 万円だったから、まあそれよりはマシか
  • 粗大ゴミの回収は早めに予約しないといけない。ゴミの寸法必要
  • 楽器はハードケースでしか運んでくれない
    • ソフトケースで飛行機にいくつか持ち込んだ。JetStar だと手荷物料金かかった

個人事業主がパソコン買うときの注意

個人事業主がパソコン買うときの注意

仕事で使う新しい mac mini の購入を検討していた
特盛スペックにするぜ、これで経費になるし節税にもなるぜ、うほほーいと思っていたら
知り合いから 30 万円未満のパソコンじゃないと減価償却になるから今年の確定申告に全額反映されないですよって聞かされて

え。マジで?

とそんな経緯があって調べてみました

青色申告の場合

少額減価償却資産制度

少額減価償却資産とは、購入した金額が30万円未満の場合その年に一括で計上することができる仕組み

注意点

年間に少額減価償却資産として計上できる金額に300万円という枠があることと、青色申告でしか制度を利用できない

消費税込みで計上する

  • 10 万円未満: 消耗品費
  • 10 万円以上: 固定資産

白色申告の時は一括償却資産

10 万円以上のパソコンの場合、4年間にわけて減価償却される
12 万円だったら 3万円 * 4 年間なので、今年は 4 万円しか乗ってこない

結局

特盛やめたってよ

f:id:loney1986:20181104205052j:plain

Boostnote ハック術

Boostnote ハック術

Boostnote

エンジニア専用のノートアプリ。とはいうものの IT 業界にいる身なら誰にでもおすすめできそう

良いところ

  • ローカルで動かすので軽いし、変なネットワーク障害やラグで消失しない
  • ローカルファイルを Dropbox で監視しておけば、どの端末でもノートの同期がとれる
  • Markdown が使える
  • フォント指定もできるので Ricty Diminished を使用
  • Emacs キーバインドが使える
  • プレビューをすぐ表示できる
  • CSS で味付けができるので見やすくできる
    こんな感じにしてる
h1 {
    color: #ffffff;
}

h2 {
    color: lightskyblue;
}

h3 {
    color: lightgreen;
}

h4 {
    color: khaki;
}

h5 {
    color: lightpink;
}

strong {
    color: lightcoral;
}

table th {
  color: #000000;
  background: #CCCCCC;
}

改善してほしいところ

  • タグづけできる。ただし、タグ設定時に過去のタグを記憶してくれていないので毎回最初から入力しないといけないから不便
  • フォルダ分けできる。ただし、1 階層しかフォルダを作れない
    PHP」「Laravel」と階層が深くなるようなフォルダ分けしたい場合、フォルダの命名を「PHP_Laravel」にしたりしてる

オープンソースで開発されているらしいので、このあたりもどんどん改善されていくと思われる

ハロウィンのすヽめ

ハロウィンのすヽめ

10/28(土) 渋谷のコワーキングスペースに行くついでにセンター街に寄ってきた。
コスチュームプレイ、つまり仮装した若者達がどんちゃん騒ぎをしている...
こちとら仮装ではなく普段から正装で覆面プログラマをやっているので同一視されて傍迷惑な話である。

FXXK!!!

f:id:loney1986:20181028025408j:plain

怒るエルプログラマ

仮装

誰しも気を遣って普段は生きている。ここぞとばかりに仮装してガラにもなく目立ちたい、承認欲求を満たしたい、ストレスを発散したい、そんな人にとって良いイベントだと思う。
よく陽キャのイベントだと思われるが、覆面をしていれば無問題。しかし視界が遮られる系の仮装は人とぶつかってトラブルの元になるので要注意だぞ。
なんかよくわからんオリキャラで仮装しているやつもいるし、格好は自由でいいと思う。俺だってエルプログラマという格好でしかないわけだしな!

暴徒

ナンパ待ちのコスプレギャル、路上飲酒、ゴミのポイ捨て、一夜にして欲望が渦巻く街になるのは見ていて面白い。まるで Pokemon Go が流行ったときのような、いつもと違う街のお祭り感である。
わかっているとは思うが、酒の勢いでめちゃくちゃしてる奴がいるので気をつけよう。
仮装をすることで、いつもの自分ではない、人の目を気にしないでいいと、気が大きくなるのだろう。つまりはバカ発見機になるので、友人が暴れ出したら縁を切ってもいいだろう。また、わざとトラブルを起こして殴られることで小金を稼ぐのも有りだろう。

パンダ

f:id:loney1986:20181028031550j:plain

ん?

f:id:loney1986:20181028031445j:plain

お腹が空いたパンダを発見!

f:id:loney1986:20181028031436j:plain

ユーカリあげたら付いてきた。。。

f:id:loney1986:20181028031441j:plain

パンダが仲間になった!

腰と背中がめっちゃ痛いから購入したクッション「p!nto」レビュー

腰と背中がめっちゃ痛いから購入したクッション「p!nto」レビュー

pt01_txt.png

P!nto

料金

13,500 円

なんで買ったの?

ハーマンミラーのせい

決め手

持ち運べる。折りたためる。コワーキングスペースのロッカーに入りそう。実際入った。長時間座ってられそう。

使い心地

第一印象

普通の低反発クッション・座椅子みたいで地味だなと。 座ったら「まあラクな気がするかも」って感じ。そんなに悪くもないからノリで購入。

購入後

長時間座って気づく。ぶっちゃけ「p!nto」と姿勢を張って座ってないけどすごくラク。特にハーマンミラーのあと。

こんな感じ

f:id:loney1986:20181024215815j:plain

色が地味すぎた...
そこらへんの椅子を上位種にするプラグインみたいなもんだからお得感あり。

他の候補だったもの

Style

9338401001.jpg

最初は持ち運びが便利そうだし Style を検討してた。
ただ店員の話を聞いていると、姿勢矯正にフォーカス置いてるから長時間利用が想定されていないとか。腰まで高さがないので疲れるとか。
しかも思っていたよりデカイ。用途が違ったなと。

終話

体痛いとやる気でないし離席率あがるからクッションおすすめ。場合によっては良い椅子を買うよりおすすめかも。

ハーマンミラーのオフィスチェア「Embody Chairs」レビュー

ハーマンミラーのオフィスチェア「Embody Chairs」レビュー

CN122AWAAG1G1BB3513-m-01-dl.jpg

Embody Chairs

なんでこれ使ってるの

現場の代表がエンジニアのためを想い、ご好意で職場に用意してくれている、らしい

値段

214,920 円

使い心地

疲れやすい。こんなにコスパが悪い椅子は初めてである。買う価値なし!

で終わってもいいんだけど、一応フォロー。

元々猫背でここ1年間は腰痛と背痛を持っているので、これだと2時間としてじっと座っていられず、伸びをしたり歩いたりしてなんとか凝りを解消しています。椅子自体は細部までカスタマイズできるんですが、背もたれが妙に固くて体が沈まないので辛いです。肘乗せは平行になっているのでデスクに合わせるとパソコンの操作はしやすいです。私以外のエンジニアからは悪い意見は聞かないので (良い意見も聞かない) 姿勢が悪くない人・腰痛背痛を抱えていない人には合うのかもしれない。

こう思った

オフィスチェアってラーメンの好みばりに意見が別れるから難しい。ニトリの名もなきフカフカ社長椅子とかの方が良かったりするし、最初は良くても何時間か座っていると疲れるパターンの椅子もあるので買うときは気をつけよう・・・

宇野常寛 『雑誌の作り方特別講義』まとめ

宇野常寛 『雑誌の作り方特別講義』

行ってきたのでコンテキスト無視の自分解釈でまとめてみた。
なのでニュアンスとか本人の意図と違うところがあるかも。 ご了承ください。

雑誌

雑誌の役割

  1. 人々のライフスタイルを投影
  2. 世界観の提示

雑誌の性質

  • 雑誌は興味があるものからないものへ伝搬させる性質がある
  • スマホだと自分が興味あるものだけで、雑多なコンテンツに出会わなくなってしまう
  • 雑誌が一番ブランディングしやすく、手っ取り早く世界観を伝えやすい
  • 雑誌は自己表現や自己実現の手段であるべき

人間のバイオリズム、技術進歩によって雑誌は衰退する運命にある

  • サブカルに強くなるため雑誌で情報収集される時代があった
  • スマホ等の登場により、Web 媒体に先を越されてしまうようになった
  • 今となっては週刊、月刊のペースでは情報が古すぎる
  • 宇野氏が責任編集している PLANETS は約 1 年おきに刊行されている

政治 → 文化 → 経済 (今ここ)

  • かつての政治、サブカルに強い奴がマウントを取れる時代は終わり、起業家や Tech に強い奴が物事を語るようになった
  • 国家権力こそ未だ圧倒的だが、私企業の経済成長によって容易に法律と世の中が変わってしまうようになった

他誌

  • サラリーマンのコンプレックスにつけこんだのが NewsPicks
  • 頭が良いことを誰にでも伝わるように噛み砕くのがほぼ日
  • 赤字を出すルサンチマンヘイト本やコンプレックス商法に依存しないで、リクームできる付加価値のある本を高い値段で売れるようにしていくべき

Planets

  • 雑誌そのものが売れなくてもそのブランドを作ることに意味がある
  • 読者の感度と偏差値が高いものをつくる、あえて噛み砕かない内容にする
  • 自分が読みたい雑誌は自分でお金を出して作ればよいと考えた
  • 仮に自分ならこうするという建設的な対案を書きたかった
  • 書籍だと相応の期待に応えないといけないのでハードルが高い
  • web マガジンともいずれ連動させる

現代の人々が求めているのはリアルタイムか時間をかけた超大作

  • 月刊誌、週刊誌の需要は無くなってきている
  • 逆に半年、年一冊だけ刊行されるスペシャルな総合雑誌であれば手に取られる可能性がある

Planets 10 号

戦争について

  • 書きたいテーマとはいえ、部数が落ちることがハッキリと分かっていた
  • 10 号という節目で過去の号の特集を今やったり・過去の自分がやりそうなことも企画したが、結局今やりたいことを選んだ
  • キャッチーな導入にして、目次を作り、本題に戦争というテーマを持ってきているが、通して読むと流れが繋っている
  • 顔である猪子寿之と落合陽一を最初と最後に持ってきた

表紙、デザイン

  • 俯瞰してる、圧倒的に美しいものという意味で衛星写真の表紙に決まった
  • 読み進めると視点が落ちてくるという写真コンセプトになっている
  • SNS アイコンのようなフラットな表紙ロゴ。中身は多様なコンテンツという性質上、表紙は入っていきやすいデザインにしている
  • イラストは基本的に使わない。発注の仕方で素材がピックできてしまうと Controllable で、ありのままではないので好まない
  • イラストが一部にあるのはそこだけ外注しているため

座談

  • 対話はクオリティーコントロールが難しい
  • 散文形式は編集が大変なのと読みにくいから会話調。時代のニーズにもあっている
  • 座談は各々がテーマに対して総論で Yes という立場であっても、各論で No を持っていないと成立しない

流通の優先順位

  1. BASE: ユーザーを囲って育てたかった。特典もつけた。利益率も9割ほどで高い。
  2. 信頼関係のある小売と書店
  3. Amazon: 利益率が低い

インタビュー

  • 肌感で潜在レベルで気付いているけど未だ言語化できていないことを引き出す

パトレイバー2

  • めっちゃ面白いらしい

30代だけど「20代エンジニアのためのプログラマー勉強法」 に参加したので Matz の話をまとめてみた

30代だけど「20代エンジニアのためのプログラマー勉強法」 に参加したので Matz の話をまとめてみた

20代エンジニアのためのプログラマー勉強法

2018/09/29
まつもとゆきひろ / Matz
質疑応答に使われたハッシュタグ: #プログラマー勉強法

背景知識の活用

勉強、メタファー、抽象化 して理解しやすいようにする。類似性からパターン抽出する

抽象化のデメリット

苦手克服 vs 得意を伸ばす

学生時代のテストなら点数の伸びしろがある苦手科目の克服が重要
しかし社会人の勉強に100点満点という上限がない
得意を伸ばすのが良い戦略。苦手があるのはよくないみたいな概念は無視せよ

その他、対立する概念

  • 記憶 vs 把握
  • 知識 vs インデックス
  • 試験 vs 常在戦場
  • 一次元 vs 多次元
  • メイン vs サブ
  • 間接的 vs 直接的
  • 安定 vs 変化

成功する確率を高める要素

  • 高評価
  • 尊敬される
  • 尊重される

大事なこと

内省 - self reflection

走り出すだすのはラク
続けるのは大変
走る前に考える
好きなものは上達が早い
苦手の克服に意味はない

パターン認識が成功の秘訣

尊敬する人は誰

身近な人を挙げる人
→ 良い面を見れる人

知らない人のことは尊敬できない

  • 尊敬: 人格も敬う
  • 尊重: ないがしろにしない、人格は無関係

人は本質的にミーハー。有名人だと得

  • 尊敬をしていなくても、知名度は価値と可換されている
  • 知られる必要がある
  • 有名だから成功する、成功したから有名になるわけではない
  • これって循環論法?

勉強はマーケティングと同じ

キャズム (峡谷) 理論

  1. イノベーター(Innovators:革新者、革新的採用者)
  2. アーリーアダプター(Early Adopters:初期採用者、初期少数採用者)
  3. アーリーマジョリティ(Early Majority:前期追随者、初期少数採用者)
  4. レイトマジョリティ(Late Majority:後期追随者、後期多数採用者)
  5. ラガード(Laggards:採用遅滞者、伝統主義者)

つまり

  • 知らないものを人は買わない
  • ニッチにまずは進出する
  • 次に横展開する
  • ユニークさ
  • 埋没しないことが重要

Matz がやったこと

  • 東京に住まない
  • 尊重してもらえる、埋没しない環境
  • 下のレイヤーに力を入れる。社内ツールの開発
  • 高い裁量権を持っていた
  • 周囲の生産を高めた
  • バブル崩壊後、社内ツールのメンテナー (閑職) になった
  • イヤな仕事はなかった
  • フリーソフトウェア: Ruby の開発して公開した。ユニークな存在になった
  • ニッチに進出、局所的な有名人になった
  • 時を超えて共通する問題、人間の性質やふるまいによって起きるコミュニティの問題を解決

どう勉強するか

パターン認識して抽象化する

  • 内省 / インベントリ / 棚卸し
  • 真剣に考える。しかし予想は外れる。決めたことは変えてもいい
  • 未来や将来のことは考えない。それよりも自分の傾向を考えるべき

モチベーション

  • 時間の使い方、それが自分にとっての優先順位を表す
  • 仕事中の時間の生産性を高めて、それを勉強とするのが理想
  • 短い時間で成果をあげる
  • 仕事には必ずバッファを入れる。割りこみタスクが入るのはザラであるため
  • 人生のバランスを考える。プライベートを犠牲にしない

アウトプット

  • インプットだけでは差別化要因にならない
  • 心理的障壁がある: アウトプットはしんどいし恥ずかしい
  • アウトプットによる定着、体系化を行う
  • クオリティは棚上げしてアウトプットを繰り返すと最適化される
  • いつか人間の可塑性が起きる
  • 人は置かれた環境に合わせて変化する
  • 35才で損益分岐点としてマネジメントに回されることがあるが、それが楽しくなる人もいる
  • 自分は固定的と思わない。ゆっくりだが環境によって変化する

基礎

コンピュータサイエンス
  • 定番知識や基礎を抑える
英語
  • 18億人と話せる
  • タイムマシン経営。海外で流行っていることが日本で適用できる
  • ガラパゴスを出る
  • 語学は場数でしかない
  • 完璧は目指さない
コンフォートゾーン
  • 幸せな空間だけにいると成長がない
  • 普段ならやらないことをすると成長機会がある
  • 変化を恐れない訓練をする
  • 他人は無責任である、という原則 を知っておく
誰かを見下さない
  • コミュニケーションができなくなる
  • 自分ことも卑下しない

質疑応答

影響を受けた本

情報収拾

アメリカで働きたい人へのアドバイス

  • H1B のビザをとるのが定石。会社紹介のビザなので現地企業に認めらないといけない
  • 英語で自分のスキルセット・実績をプレゼンできるようにする
  • ひたすらアプリを作りまくる人が多い

最後に

自分の人生を良くすることに貪欲になった方がいい
自分は運がよかったが運がいいかはわからないので貪欲になったほうがいい

Fork してから Pull Request するまで

Fork してから Pull Request するまで

# commit する前にブランチを切っておく
git checkout -b [新しいローカルブランチ名 ★1]

# git add する
# git commit する

git push origin [フォーク先の新しいリモートブランチ名 ★2]

#
# フォーク元のリモートリポジトリを登録
# 差分を取り入れてフォーク先 (origin/master) を最新化する
#

# まずフォーク元のリモートリポジトリを upstream という名前で登録する
git remote add upstream [フォーク元のリポジトリ SSH]

# ローカルを master ブランチに変更
git checkout master

# フォーク元の upstream から pull してローカルを最新化する
git pull upstream master

# ローカル の master ブランチでフォーク先 (origin) リポジトリに push
git push origin master

#
# ローカルブランチを変更して、master の最新差分を取り入れて push する
#

# ローカルブランチを変更する
git checkout [ローカルブランチ名 ★1]

# ローカルの master ブランチから rebase (コミットログが綺麗な merge )
git rebase master

# -f (force) フォーク先のリポジトリに強制的な push する
git push -f origin [フォーク先のリモートブランチ名 ★2]

これでフォーク先のリポジトリでは自分のコミットが先頭(最新)、かつフォーク元の差分も過去に反映 (Verified) されたことになっている。
この後は
1. Github でフォーク先の自分のリポジトリに行き、左側にあるボタンより branch を master から [フォーク先のリモートブランチ名 ★2] に切り替える。
2. 右上にある Pull Request ボタンを押して、Pull Request を送信する。

すれば OK

作業中のプルリクの場合

  • タイトルに [WIP] をつけて作業中であることを明記する

今更 ES2015 まとめた

今更 ES2015 まとめた

この記事を整形しただけです
ES2015について (ES6) · takahashiakira/tech_for_web Wiki · GitHub)

Class

ES5 における prototype 構文にあたる

class Greet {
  constructor(name) {
    // プロパティ
    this.name = name;
  }
    
  // インスタンスメソッド
  hello() {
    console.log('Hello, My name is ' + this.name)
  }
    
  // スタティックメソッド
  static create(name) {
    return new Person(name);
  }
}

var tom = new Greet('Tom');

// インスタンスメソッドの実行
tom.hello();

// スタティックメソッドの呼び出し
var john = Greet.create("John");

let

ブロックスコープ内のみで利用可能な変数定義。

var foo = 'foo';

{ // この foo は外の foo とはスコープが違うので別物
  let foo = 100;
}

let の宣言をブロックで囲めば、即時関数の中で private な変数を宣言する必要がなくなる

(function () {
  // private
  var food = 'Meow Mix';
}());

console.log(food); // Reference Error
{
  // private
  let food = 'Meow Mix';
}

console.log(food); // Reference Error

const

定数のため再代入できない

const foo = 100;
foo = 'foo' // error

配列は各要素のアドレスを保持しているだけなので、要素の値変更はエラーにならない

const arr = [1, 2, 3];
arr[1] = 10

Arrow Function

// ES5
var func = function (x, y) {
  return x + y;
}
// ES6
var func = (x, y) => {
  return x + y;
}

bind

bind は this の指す先を明示的に指定したオブジェクトに変更できるもので、イベントリスナーなどで this の中身が変わってしまう場合などに役に立つ。アロー関数内では this の値をバインドしなくても利用できる

// ES5
function Person(name) {
  this.name = name;
}

Person.prototype.prefixName = function (arr) {
  return arr.map(function (character) {
    return this.name + character;
  }.bind(this)); // bind しないと this.name が使えない
};
// ES6
function Person(name) {
  this.name = name;
}

Person.prototype.prefixName = function (arr) {
  // this.name をいきなり使える
  return arr.map(character => this.name + character);
};

Method

ハッシュ内のメソッドの function も省略できるようになった

// ES5
var counter = {
  count: 0,
  // メソッド
  increment: function () {
    this.count++;
  }
}
// ES6
var counter = {
  count: 0,
  // メソッド
  increment() {
    this.count++;
  }
}

Parameter

Rest Parameter

引数を可変長で利用できる

function rest (...rest){
  console.log(rest);
}

// 好きなだけ引数を渡せる
rest(1, 2, 3); // [10, 20 ,30]

Default Parameter

関数でデフォルトパラメータを指定できる

function add (a = 1, b = 2){
  return a + b;
}

Template Strings

テンプレートリテラル を利用して特殊文字エスケープする必要がなくなった
JavaScript の テンプレートリテラル を極める!

// バッククオート (`) で囲めば、ちゃんと " はエスケープされる
let text = `This string contains "double quotes" which are escaped.`;
var name = 'Bob';

// 文字列に変数を埋め込めるようになった
console.log('Hello, ${name}.');
// 改行に改行コードを使う必要がなくなった
let text = ( `cat
dog
nickelodeon`
);
let today = new Date();

// 式も文字列内で展開して扱えるようになった
let text = `The time and date is ${today.toLocaleString()}`;

Map

key-value データを扱うクラスである Map を利用できるようになった

var map = new Map();
map.set('key1', 'value1');
map.get('key1'); // "value1"
map.has('key1'); // true
map.delete('key1');
var map = new Map([['k1', 'v1'], ['k2', 'v2']]);
map.get('k1') // "v1"
console.log(map2.size); // 2
map2.clear(); // 全データのクリア

WeakMap

WeakMap は、Key に指定されたオブジェクトに対して弱い参照を持つことでガベージコレクションを妨げないクラスとなっている。そのため繰り返しを伴うメソッドや clear メソッドは存在しないが、キャッシュに利用したり、プライベートプロパティとして利用できる

const privateNames = new WeakMap();

class Foo {
  constructor(name) {
    // name をプライベートプロパティとして保持
    privateNames.set(this, name);
  }

  getName() {
    return privateNames.get(this);
  }
}

Symbol

オブジェクトプロパティのキーとして使うことができるユニークな値を生成。プロパティ名がコンフリクトしないことを保証できるため、文字通りシンボルとして使われるイベント名などの定数や列挙型の値として使うと便利

var syml = Symbol();
var syml2 = Symbol('foo');

syml2.toString(); // "Symbol("foo")"
console.log(syml2 === Symbol('foo')); // false

var obj = {[syml2]: 1};

Object.keys(obj); // []
Object.getOwnPropertySymbols(obj); // [Symbol(foo)]
var obj = {
  [Symbok.toStringTag]: 'Foo!'
}
console.log(String(obj)); // "[object Foo!]"

Object.assign(target, source1, source2...)

オブジェクトをターゲットにシャローコピーする。jQuery の $.extend と同様の機能。

var objA = {
 "key1": 1,
}

var objB = {
 "key1": 2,
 "key2": 2
}

// ObjA に objB の要素を上書きコピーする
var objC = Object.assign(objA, objB);

console.log(objA == objC); // true
console.log(objA["key1"] == 2); // true
console.log(objA["key2"] == 2); // true

String

String.includes(string)

文字列の中に引数の文字列が含まれているか真偽値を返す

const string = 'food';
const substring = 'foo';

console.log(string.includes(substring)); // true

String.repeat(n)

文字列を n 回繰り返す

'meow'.repeat(3); // 'meowmeowmeow'

Array

  • Array.from: Array のようなオブジェクトやイテレータを Array に変換
  • Array.of: 引数を要素に持つ配列を生成する
var arr = Array.from('foo');

console.log(arr); // ['f', 'o', 'o']
var arr = MyArray.of[1, 2, 3];

console.log(arr); // [1, 2, 3]
console.log(arr instanceof MyArray); // true

イテレータへの対応として、Map や Set と互換性のあるメソッド keys, values, entries が追加された。その他、配列内で要素をコピーするメソッド copyWithin や、要素を指定の値で埋めるメソッド fill や、find、findIndex が追加された

Promise

非同期処理を抽象化する統一的なインターフェース

// 非同期処理
function wait(time){
  // 引数名は自由
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      // 処理が成功の場合、resolve の引数の中で then に渡される戻り値を書く
      resolve('wait: ' + time);
    }, time);
  });
}

// then 以下に resolove 時の処理。value で戻り値を受け取る
wait(2000).then(value => {
  console.log(value); // "wait: 2000"
// then をメソッドチェーンにすることもできる
}).then(value => {
  conosle.log(value); // undefined
});

Promiseのエラー処理

// 非同期処理
function getUrl(url) {
  return new Promise((resolve, reject) => {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.onload = () => {
      if (xhr.status == 200) {
        resolve(xhr.statusText);
      } else {
        // 処理が失敗の場合、reject の引数の中で catch に渡される戻り値を書く
        reject(new Error(xhr.statusText));
      }
    }
    xhr.onerror = () => {
      // 処理が失敗の場合、reject の引数の中で catch に渡される戻り値を書く
      reject(new Error(xhr, statusText));
    };
    xhr.send();
  });
}

getUrl('/items').then(res => {
  var items = JSON.parse(res);
  someProcess(items);
// catch 以下に reject 時の処理。e で戻り値を受け取る
}.catch(e => {
  console.error(e);
});

Promise.all

全ての非同期処理が終わるまで待つ

Promise.all([
  // 配列の中で非同期処理を複数実行
  getUrl('/foo'),
  getUrl('/bar')
]).then(res => { // 受け取る戻り値 res も配列
  console.log(res[0]);
  console.log(res[1]);
}).catch(e => {
  console.error(e);
});

co

Generator をベースにしたライブラリ。yield の処理が終わるまで次に進まない。非同期処理の可読性があがる

// ジェネレーター関数で非同期処理を実装
function * getFirstitem() {
  var Items = yield getUrl('/items');
  var item = yield getUrl('items/' + imtes[0].id);
  return item;
}

var co = require('co');

co(function* () {
  // try - catch 文
  try {
    var item = yield getFirstItem(); // ジェネレータ関数を同期処理として実行
    someProcess(item); // item の取得を待ってから実行される
  } catch(e) {
    console.error(e);
  }
});

Generator

処理を停止したり再開したりできる特殊な関数。yield で処理が一旦止まるので、next で次に進める

function* 宣言 (末尾にアスタリスクが付いた function キーワード)

Generator オブジェクトを返すジェネレーター関数を定義

function generator() {
  yield 1;
  yield 2;
  return 3;
}

var g = generator();

// generator1 の処理が全部終わったかどうかは done でわかる
conosle.log(g.next()); // {value: 1, done: false}
conosle.log(g.next()); // {value: 2, done: false}
conosle.log(g.next()); // {value: 3, done: true}

for (let n of generator()) {
  console.log(n);
}

非同期処理との組み合わせ

// 非同期処理
asyncflow(function * () {
  var items = yield getUrl('/items');
  var id = items[0].id;
  var item = yield.getUrl('/items/', + id);
  console.log(item);
});

function asyncflow(generator){
  var g = generator();
  var next = value => {
    var result = g.next(value);
    if (!result.done) {
      promise = result.value;
      promise.then(value => {
        next(value);
      });
    }
  };
  next();
}

import/export

ES2015 では Webpack などのライブラリを使わなくても AMD や CommonJS の記法を扱うことができる

エクスポート

default export

let foo = "foo!";

export default foo;

class Baz {
  constructor() {
    console.log('Baz!');
  }
}

export default Baz;

インポート

import from

import foo from './foo';
import Baz from './baz';

as

名前を変更できる

import {foo as bar} from './foo';

*

全てをインポートできる

import * as util from 'math/addition';

デフォルトのオブジェクトから、どの機能をインポートするか選択する

import React, { Component, PropTypes } from 'react';

Boostnote はじめた

Boostnote はじめた

これを見たので

GitHubリポジトリで8000スター獲得、人気OSS「Boostnote」オープンソース化の軌跡

所感

Evernote -> Backlog とエンジニアリングまとめを書いてきたが、スニペットが一番使いやすい 。 マークダウンで書けて、すぐプレビューを見れる。カスタム CSS を付けれるのが嬉しい。 Backlog 記法だとそこでしか使えないし今後マークダウンで書いておくことではてなブログ使いまわせる応用がきくと思って乗り換えてみた。 ローカル保存だから動作も早いし、Dropbox の共有フォルダにデータ入れておけば擬似的に端末間で同期もとれる。 UI もいい感じでコーディングが楽しくなる。最初は VS Code でマークダウン書けばよくねって思ったけど、ファイル管理やタグ付けしてくれるので圧倒的に便利。

リンク

Boostnote

Homestead で複数の新規プロジェクトを作ったとき、同名のマシンイメージがあるせいで vagrant up ができない場合

Homestead で複数の新規プロジェクトを作ったとき、同名のマシンイメージがあるせいで vagrant up ができない場合

Mac 環境から vagrant up すると以下のエラーが出た場合の対処法

A VirtualBox machine with the name 'homestead-7' already exists.
Please use another name or delete the machine with the existing
name, and try again.
  1. vagrant up により出来上がってしまったマシンイメージを GUIVirtualBox.app から削除する
  2. Homestead/scripts/homestead.rb ファイルを開き、「homestead-7」となっている箇所を grep して全てリネームする (ここで名前が被っているためエラーが出ている)
  3. vagrant up する

Node.js でサーバ起動したとき、Nginx を使って URL のポート番号を消す

Node.js でサーバ起動したとき、Nginx を使ってURL のポート番号を消す

リバースプロキシ

結論から書くと最初からポート 80 番を指定して使っておけば、URL:8080 みたいなみっともないポート番号で表示しなくていい。
なんだけども、Node.js でそれをやるとセキュリティ的によくないらしい。なので Nginx で HTTP サーバをポート 80 番で立てておいて、 そこで受け取ったリクエストを Node.js サーバに渡すのがセオリーらしい。 これをリバースプロキシという。

/etc/nginx/nginx.conf

下記を修正する。

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    # サーバー名を記載
    server_name  randomchord.work;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
        # ポート80 のまま下記の URL にアクセスする
        proxy_pass http://www.randomchord.work:8080/;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

ランダムコード

今回の仕組みでこんなサービス作ってます。よろしくです。

素のNode.jsでCSSやJSなどの静的ファイルが読み込めない

素のNode.jsでCSSやJSなどの静的ファイルが読み込めない

Node.js でサーバーを立ち上げるとき、Apache などと違ってドキュメントルートから静的ファイルを読み込むってことを自動でやってくれない。 サーバーにリクエストされた静的ファイルのパスから拡張子を判定してレスポンスを返してあげないといけない。

server.on("request", function (req, res) {
  // リクエストされた拡張子をまず判定する
  chkExt(req, res, function () {
    switch (req.url) {
      case "/":
        // なにかしらの処理
        break
      default:
        // なにかしらの処理
        break;
    }
  });
});

var chkExt = function (req, res, callback) {
  var url = req.url;
  var tmp = url.split('.');
  var ext = tmp[tmp.length - 1];
  var path = '.' + url;
  switch (ext) {
    case 'js':
      fs.readFile(path, function (err, data) {
        res.writeHead(200, {
          "Content-Type": "text/javascript"
        });
        res.end(data, 'utf-8');
      });
      break;
    case 'css':
      fs.readFile(path, function (err, data) {
        res.writeHead(200, {
          "Content-Type": "text/css"
        });
        res.end(data, 'utf-8');
      });
      break;
    default:
      callback();
  }
}

意外と使い勝手がいいソース転がってなかったので書いてみた。

Fire TV Stick × Google Home

Fire TV Stick × Google Home

経緯

最近 Netflix よく見るので今更ながら Fire TV Stick を買った

bluetooth スピーカーとしての Google Home

echo ではなく Google Home だけれども
テレビとかパソコンのスピーカーで聞くよりはよっぽど音がいいので
Fire TV Stick から繋げてみた
例えばドキュメンタリー動画とかだと音がちっちゃかったりするけど
スピーカーだと割と鮮明に聞き取れた
Spotify アプリから音楽流してもいい感じ

Webview

リモコンの精度は結構よくなってきているとはいえ
HTMLでブラウジングしているアプリとか文字入力はまだまだきつい
Youtubeがまさにこれでストレスフル
だから iPhone iPad の動画をミラーリングしようと思ったのだけど...

ミラーリング問題

300円くらいの一番 DL されてる Airplay 専用アプリ airplay and upnp とかいうのを
Fire TV Stick に入れたみたんだけど何十回に1回とかしか認識しない
認識したときはちゃんとスマホの音が Google Home から出ていて感心したんだけど
そのあとがうんともすんとも
ソフトフェアアップデートで改善されるのを待つばかり

ブックマーク問題

firefox などのブラウザが入っているが出来が非常に悪い
画面幅は見切れているし、アカウントでブックマークの紐付けもできないので
パソコンのお気に入り動画を見る、みたいなことは基本的にできない
まあそういう用途で設計していないんだろうけど

総評

5000円くらいなので買いではある
例えば新日本プロレスワールドとかWWEネットワークに加入していた自分にとって
専用アプリが用意されていたし、いつもより大きい画面で見れるは爽快
普段みないテレビがこのような形で利用できたのはよかった
ネイティブアプリの出来はいいものが多いし
オンデマンドの動画はほとんどアプリで見れるんじゃないかな
ただそれ以外の痒いところに手がとどく使い方はできないって感じかな