2019年2月にやったこと

花粉が出てきてつらい。

Release It! 本番用ソフトウェア製品の設計とデプロイのために

4章の後半まで見た。ここまでは基本的に事例の紹介でここから対策という感じ。基本的にリソースを分割して障害の伝搬を防ぐ話と、タイムアウト設定して完全にロックしたままにならないようにしようぜみたいな話が多いっぽい。

読書会プラットフォームを作り始めた

読書会プラットフォームを作り始めた。 本検索して読書会登録するとdiscordのURL吐き出されるみたいな感じのやつ。

フロントがReact.jsでバックエンドがGAE+Golangで作っている。2人で作ってて私はバックエンドを作っている。 まだほぼ何もない。認証の仕組みを作っているところ。GAEもFirebaseもめちゃくちゃサクサク動かせてすごい。

3月中にリリースできたら嬉しい。

基礎から学ぶ Vue.js

ざらざらっと全部読んでなんとなく挙動はわかった気がする。webpackとかvue-routerとかはよくわかってない。

lorcaでtreviewのUI作った

inabajunmr.hatenablog.com

Vue.jsがなんとなくわかったので画面を作ってみた。lorcaもなんとなく触れるようになったっぽい。

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

ちょろちょろ読み始めた。いくつかソートを実装したあたりでまだ本番感はあんまりない。今月中に読み終わりたい。

情熱プログラマー ソフトウェア開発者の幸せな生き方

トイレとかでちまちま読んでる。

英語

12レッスン受講した。だれているが当面これを終わらせる方向で頑張ることにした。

書いた記事

qiita.com

qiita.com

qiita.com

これからやること

  • 読書会プラットフォーム作る
  • プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
    • 読む
  • ElectronかWebアプリ(サーバなし)でNature RemoのPC用クライアントを作る
    • なぜか俺は音声やスマホよりもPCで操作したい時がたまにある
      • あとはSPAとJSの学習用に
        • 読書会プラットフォームの後
  • Goならわかるシステムプログラミング
  • 英語
  • Release It!
  • ここ最近ほとんど業務でプログラミングをしなくなって、調整とかレビューとかばっかしてるがかなり雰囲気でやってるので、マネジメント系の本を読もうとしている
    • なにがいいのかよくわからん
  • Effective Go - The Go Programming Language

GitHubのPRの差分を見るときレビュー済み/未レビューをファイルごとにTODOリスト化したい

でかいPRがあるととりあえず差分を上から見てくんだけどこの上から見てく、ってのは本当は間違ってると思ってて多分見てく上で正しい順番みたいなものがある

複数レイヤーにまたがったPRだったら依存される側から見てくべき、とか

実装とFW的な奴がごっちゃに飛んできたらFWから見てくべき、とか

ただしそれとは別に、全部の差分を見たい、というのがある

それで、上から見てくと"全部みる"、という意味では効率が良い

というか見たいとこから見てくと全部見たかどうかわからなくなる

ので、見たい差分を選んで、見終わったら見終わったマークをつけるような奴が欲しいなと思った

イメージ的には

  1. 差分のページに行くとデフォルトで全部の差分が閉じた状態で表示
  2. 開いてレビュー
  3. 完了したら見たよマークをつけるとなんか背景とかがわかりやすい色になる

そういう感じのやつ

とりあえず全ファイルを閉じたかったのでそれはこんなん

Array.from( document.getElementsByClassName("file") ).forEach(e => {e.classList.remove("open"); e.classList.remove("Details--on")});

3/2 追記 作った

chrome.google.com

qiita.com

treviewにlorcaでGUIをつけてみた

前作った「GitHubのtrendingって面白いけど毎日同じのでがちだから今日の新着的なのだけみたいなー」と思って作ったやつに画面をつけてみました。

GitHub Trendingに毎日同じリポジトリがいるのを見たくないので俺がその日初めて見るリポジトリだけを見るためのツールを作った - チョキチョキかにさん

インストールとかはGitHubからです。とりあえずmacosの64ビットのバイナリしかないです。

github.com

画面はこんなんです。余白が多いのでなんとかしたい。

f:id:inabajunmr:20190211003059p:plain

技術とかの話

Lorca

Lorcaを使いました。 github.com

めちゃくちゃ雑にいうとElectronみたいな感じで画面作れてさらにJSの関数にGoの関数をバインディングできるやつです。 ただし

Unlike Electron it doesn't bundle Chrome into the app package, but rather reuses the one that is already installed.

です。 HTMLだけ書けばあとは雰囲気でCLIGUIにできる気がします。 データの受け渡しはJS->Goは勝手にJSONをオブジェクトにマッピングしてくれて、逆はJSONで受け渡しができます。

JSからGoはこんな感じでGoからJSはこんな感じでした。

静的コンテンツ込みのビルドがよくわかんなかったのでゴニョゴニョしたらできたのでそっちはQiitaにあげました。

qiita.com

ロスコンパイルはよくわかんないというか手元で起動できなくてどっちにしろテストできないので一旦やめました。workspaceとかを使えばいいという説もあります。

Vue.js

使ったけどなんか使った範囲ではわかったけど、って感じでなんとも言えない感じでした。ただまあ使った範囲では便利っぽい感じでした。 とりあえずAPIでとってくるデータとformの入力値を定義して前者はビューにバインドして後者はwatchでGoの関数を呼び出してました。それくらいしかしてないです。

今ふと「開発用のVue.jsでそのままバイナリをリリースしてしまった・・・」ってのを思い出したんですが全部HTMLに直接CDNで埋め込んでるのでビルドがめんどくさいですね。 この辺のフローとかはちゃんと学ばないといけない気がしました。

オンライン読書会のプラットフォーム

  • 本検索できる
  • 本の中に読書会リソースを登録できる
    • 読書会の中に参加者の概念がある
    • 読書会からDiscordか何かに飛べる
  • 本に感想とか進捗とか書ける

だいたいそんなイメージ

画面一覧

  • 技術書一覧
  • 技術書詳細
    • 開催中の読書会一覧がみれる
    • 読書会登録できる
    • 本の感想とか登録できる?
  • 読書会登録
    • タイトルとか詳細とか登録できる
    • スケジュール登録できる
      • 毎週金曜日19:00-20:00とか
    • 登録するとdiscordのリンクが払いだされる
  • 読書会詳細
    • discordのリンクとかタイトルとか詳細とか表示される
    • 参加するリンクから参加できる
    • 参加するリンクなしでいきなりdiscordでもいいけど参加人数とかは見れるようにしたい
  • あとはまあ普通のユーザ登録とか
    • GitHubログインだけでいいと思っている

2019年1月にやったこと

年があけた。

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

読み終わった。この本で出てくる範囲では、AWSとの違いは

  • アカウントの下にプロジェクトの概念があること
    • やーめた、で全部消せて便利
  • IAMじゃなくてプロジェクトに対してAPIを有効化するというやり方なこと(多分他にもある気がするが)
  • Webからコンソールでだいたいゴニョゴニョできる
    • AWS Systems Managerと同じようなものなのかはよくわかっていない
    • Cloud Shellがどこで動いてて何に触れるのか、みたいなことが理解できてない
  • DynamoDBっぽいやつに親子の概念がある

くらいかなあと思った。サクサク進むしとりあえずデプロイするというところまでではまとまって良かった。

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

最近JavaScriptをよく書きなぐるのだが(主にChrome拡張で)あまりにも雰囲気で書いているのでいい加減体系的に学ぼうと思って読んだ。 面白かった。プログラミングの勉強って面白いなって久しぶりに思った。最近仕事でプログラミングをしていない。

第1級関数についてようやく理解した気がする。なぜGolangチュートリアルをやったのに理解していないのか。

後半のDOMいじりはリファレンス感があったので結構ざっくり読んだ。

しかし私の書くChrome拡張はだいたいどこかのWebページの構造に依存しているのであまり真面目に作る気持ちになれないという問題はある。本当はE2Eテストを自動化したい。HeadlessなChromeはextensionをサポートしていないとのことなので困っている。まあコンテンツで完結するやつはHeadlessなChromeスクリプトだけ叩けばいいような気もするけど。

Release It! 本番用ソフトウェア製品の設計とデプロイのために

この本を読まないといけないらしいのでせっかくなので社内で読書会をやってみた。いわゆる技術の本はわかるまで読めばわかるがこの手の本は人と読んだ方が楽しい気がするな。 まだ2章までなのでここからが本番な感じ。読書会て参加したことなかったのに企画をしてしまった。 会社ならいいけど読書会って通うのめんどくさくて参加できない。Webで読書会企画するプラットフォームとかあったらいいのかな。一緒にこの本やっていこうぜ!みたいな。本に対するメーリングリストの集合体でもいいんだけども。

情熱プログラマー ソフトウェア開発者の幸せな生き方

最近よく俺はなんなんだという気持ちになっているので読んでいる。半分くらい読んだ。モチベーションが下がっている時に読むと良い。楽しくて厳しい方向に進むぞ。

英語

Englishbellを43レッスン受講した。18時間くらい。ステージ7まで行ったが正直飽きてきてしまった。雑談がしたいが雑談をするならDMMに変えたい。 あと5ステージだがおそらく1年弱かかる気がする。どうしようか。

あとはEnglishbell用にしょうもないChrome拡張を作った。

inabajunmr.hatenablog.com

あとはTEDを見る活動を始めた。なんだかんだ英語力は上がっているようで初見で5〜8割くらいは理解できる気がするので普通に喋っている内容をある程度楽しめるので良さそう。

書いた記事

re:invent2018がらみの諸々を書いていた。書いていましたよ。 あとはQiitaにどうでもいいようなことをいくつか。

これからやること

  • 既存のChrome拡張を書き直す
    • せっかくJavaScript学んだので
      • でもこれはやらないかもしれん・・・
  • プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
    • いい加減この手のプログラミングが弱いという気持ちで暮らすのは嫌なのでいい加減なんとかする
      • ポチった
  • 基礎から学ぶ Vue.js
    • 学ぼう
  • ElectronかWebアプリ(サーバなし)でNature RemoのPC用クライアントを作る
    • なぜか俺は音声やスマホよりもPCで操作したい時がたまにある
      • あとはSPAとJSの学習用に
  • lorcaでtreviewのアプリを作る
    • これは気が向いたら
  • Goならわかるシステムプログラミング
  • 英語
  • Release It!
  • ここ最近ほとんど業務でプログラミングをしなくなって、調整とかレビューとかばっかしてるがかなり雰囲気でやってるので、マネジメント系の本を読もうとしている
    • なにがいいのかよくわからん

ここ最近いろいろ考えていたがおれはまだエンジニアリングをやりたいのでエンジニアリングをやるぞという意思を明確にした。楽しくて厳しい環境を探す。

「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」を読んでいる④

6章まで読んだ。知らない文法だけメモ。DOMの操作はリファレンス的なところはざっくり読んだ。

「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」を読んでいる① - チョキチョキかにさん

「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」を読んでいる② - チョキチョキかにさん

「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」を読んでいる③ - チョキチョキかにさん

HTMLCollectionの操作

document.getElementsByTagの結果はHTMLCollectionであり、これは生きており、条件にマッチするエレメントが増えたり減ったりしたとき、コレクションの内容がリアルアイムに変わることを意味する。

https://developer.mozilla.org/ja/docs/Web/API/HTMLCollection

<ul id="a">
<li>aaa</li>
<li>bbb</li>
</ul>

<ul id="b">
</ul>
let a = document.getElementById("a");
let b = document.getElementById("b");
let lis = document.getElementsByTagName("li");

for(var i = 0; i < lis.length; i++){
  var item = lis.item(i);
  var li = document.createElement("li");
  var text = document.createTextNode(item.textContent);
  li.appendChild(text);
  b.appendChild(li);
}

このコードが無限ループするのは、bにliを追加すると、追加した要素もdocument.getElementsByTagName("li")の条件にマッチするので要素数が増えてしまうため。 document.querySelectrAllで返ってくるNodeListは静的なのでこの動作がない。NodeListが静的というわけではなく、querySelectorAllだとそう、という話。

EventListnerのthis

EventListnerのコールバックのthisは呼び出し元のelementn参照となる。Functionオブジェクトのbindメソッドを使うと、その関数内でのthisを後から設定できる。

EventListnerにコールバックではなくEventListnerオブジェクトを指定した場合はオブジェクト自体のthisとなるので、オブジェクトに定義したhandleEventメソッドからはそのオブジェクトのフィールドを参照できる。

アロー関数によるthisの束縛についてはこれがわかりやすい。 https://qiita.com/mejileben/items/69e5facdb60781927929 雑にいうと呼び出され方やなにに呼び出されたかを意識せず、宣言時のスコープでthisが決まるって感じ?ややこしい気がするな。

「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」を読んでいる③

5.5.2章まで読んだ。知らない文法だけメモ。知らない要素ばっかりになってきた。

「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」を読んでいる① - チョキチョキかにさん

「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」を読んでいる② - チョキチョキかにさん

クラス

var Class = function(){};
var c = new Class();
console.log(c);

Functionオブジェクトをクラスとして使う。

初期化

let Student = function(name, age){
  this.name = name;
  this.age = age;
  this.getName = function(){
    return this.name;
  };
};

let student = new Student("takashi", 10);
console.log(student.getName());

あくまでメソッドは関数オブジェクトのメンバなので後から追加もできる。

let Student = function(name, age){
  this.name = name;
  this.age = age;
};

let student = new Student("takashi", 10);
student.getName = function(){
  return this.name;
};

console.log(student.getName());

追加されたメソッドはインスタンスに対して追加されてるので別のStudentインスタンスにはない。

あくまでFunctionクラスなので、コンストラクタではなく関数として呼ばれてしまう可能性がある。

let Class = function(val){
        if(!(this instanceof Class)){
            return new Class(val);
      }
      this.val = val;
      this.getVal = () => val;
}

let c1 = new Class("a");
let c2 = Class("b"); // コンストラクタを呼び出せていないが、instanceofで判定してコンストラクタ経由でClassオブジェクトを返している。
console.log(c1.getVal());
console.log(c2.getVal());

this

thisの参照先は条件によって変わる。 コンストラクタの場合は生成したインスタンス自体。メソッドの場合はレシーバーオブジェクト。

call/apply

Functionオブジェクトのメンバで、その関数自体を呼び出す。thatに渡された値をthisとして参照できる。

prototype

メソッドはFunctionオブジェクトのフィールドであり、つまりコンストラクタを呼び出すときにFunctionオブジェクトが組み立てらる。 ので、インスタンスを作るたびに同じFunctionが毎回生成されてしまう。

同じオブジェクトの全てのインスタンスが同じprototypeへの参照を持っており、ここにFunctionオブジェクトを定義すると、Functiojnオブジェクトの初期化が無駄に複数回行われなくなる。

let Class = function(){}

Class.prototype.print = () => {
  console.log("call");
}
c1 = new Class();
c1.print();

インスタンスとprototypeに同じ名前のフィールドがあると、インスタンスが優先される。

オブジェクトリテラルでprototypeに対してメソッドを定義しするとこうなってスッキリする。

let Class = function(){}

Class.prototype = {
  print : () => console.log("call"),
  getDog : () => "dog"
}
c1 = new Class();
c1.print();
console.log(c1.getDog())

staticなプロパティ/メソッド

クラス自体に定義する。

let Class = function(){}
Class.print = () => console.log("ok");
Class.print();

プロトタイプチェーン

let Parent = function(){};
Parent.prototype = {
  print : () => console.log("Parent"),
  sleep : () => console.log("sleep")
}

let Child = function(){};
Child.prototype = new Parent(); // ChildのprototypeにParentを指定することで継承を表現
Child.prototype.print = () => console.log("Child");

c = new Child();
p = new Parent();
c.print();
p.print();
c.sleep();
p.sleep();

JavaScriptのプロトタイプチェーンはインスタンスが作成された時点で決まるので、インスタンス生成後に元クラスのprototypeを差し替えて継承元を変えても、インスタンスの挙動は変わらない。

型の判定方法

  • constructorプロパティで取得したコンストラクタと、型を比較
    • 継承してると親のコンストラクタが返って来ちゃう
  • instanceofでコンストラクタと比較
    • 継承元と比較してもtrue
  • isPrototypeOfでプロトタイプを比較

privateフィールド

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty これ使えばクロージャで表現しなくてもいいような気がする?

class命令

class Student {
  constructor(name, age){
    this.name = name;
    this.age = age;
  }
  
  print(){
    console.log(this.name + ":" + this.age)
  }
}

let takashi = new Student("takashi", 10);
let takeshi = new Student("takeshi", 80);
takashi.print();
takeshi.print();

アクセス修飾子はない。静的メソッドの宣言のためにstatic修飾子が使える。

class Super{
    constructor(val) {
    this.val = val;
  }
  print1(){console.log("Super");}
  print2(){console.log("Super");}
}

class Child extends Super{
    constructor(val1, val2) {
    super(val1);
    this.val2 = val2;
  }

    print1(){console.log("Child");}
}

let s = new Super(1);
let c = new Child(2,3);
s.print1(); // Super
s.print2(); // Super
c.print1(); // Child
c.print2(); // Super(Override)

console.log(c.val); // 2(superで親クラスのコンストラクタが呼ばれている)
console.log(c.val2); // 3

Computed property

let i = 1;
let a = {['yes' + i] : 100}
console.log(a); // {yes1: 100}

自前でのイテレーターの実装

class Test{
  constructor(max){
    this.max = max
  }
  [Symbol.iterator](){
    let value = 0;
    let that = this;
    return {
      next() {
        if (value > that.max) { // nextメソッドの内部ではthisの領域が変わってしまうので、thisではなくthatに格納した値を利用している。
          return {done:true}
        }
        return  {value:value++, done:false}
      }
    }
  }
}

let test = new Test(10);
for (let i of test){
  console.log(i);
}

Generator

yieldで値が返却(返却といっていいのか?)した後、そこで一旦停止するが次のループでまたyieldの行から処理が再開する。

function* aho(){
  let count = 0;
  while(true){
    count++
    if(count % 3 == 0){
      yield count + "!!!!!!!!!";
      continue;
    }
    if (count > 10) {break;}
    yield count;
  }
}

for(let val of aho()){
  console.log(val)
}

Proxy

オブジェクトをラップして値の参照とか更新とか初期化とか関数の呼び出しに干渉できる。

class Test {
  constructor(greeting) {
    this.greeting = greeting;
  }
}

let test = new Test("fuck");
var testProxy = new Proxy(test, {
  get: function(target, prop) {
    if(target.greeting == "fuck"){
      return "hello beautiful world";
    }
    
    return target.greeting;
  }
});
console.log(testProxy.greeting);

Testクラスのオブジェクトのgreetingフィールドがfuckだったらhello beautiful worldに差し替えてる。 用途がよくわからん。ライブラリのHTTPクライアントに呼び出し元のログの機構を組み込みたい時とかかな。