イテレータ・ジェネレータ(ついでにシンボルもちょっとだけ)覚えたことメモ

tuitui.hatenablog.com

↑昨年イテレータについて後日読もうと思っていたんですが、ようやくその「後日」が来ました。
イテレータ・ジェネレータ(ついでにシンボルもちょっとだけ)について覚えたことをメモ。
自分でIterableなオブジェクトを書いてもいいし、arrayやstringにはそもそも備わっているということで
なんだ〜となりました。もっと早くちゃんと読んでおけばよかったなと思った次第です。  

Iterationについて

繰り返し処理を行うための決まりに従った実装。
繰り返し処理を適用したときの挙動 → Iteration

IterableとIterator

Iterable = Iteratorを備えた(Symbol.iteratorプロパティにIteratorを返すメソッドを実装している)オブジェクト。Iteratorを備えているのでfor-ofで処理できる。
Iterator = next()メソッドを実装したオブジェクト。nextメソッドを呼ぶと以下2つのプロパティをもったオブジェクトを返す。

  • value 現在の値
  • done 値を出し終えたかどうか

最初からIterableな挙動が備わっているもの

はじめからSymbol.iteratorプロパティにIteratorを返すメソッドが実装されているもの

  • Array
  • String
  • NodeList
  • Generator Object
  • Array, Map, Set が持つ entries(), keys(), values()の戻り値

など。
たとえば文字列で順番にとりだしたいとき以下のように書ける

const s = 'javascript';
const sIterator =  s[Symbol.iterator]();
sIterator.next();//Object {value: "j", done: false}
sIterator.next();//Object {value: "a", done: false}
sIterator.next();//Object {value: "v", done: false}
sIterator.next();//Object {value: "a", done: false}
sIterator.next();//Object {value: "s", done: false}
sIterator.next();//Object {value: "c", done: false}
sIterator.next();//Object {value: "r", done: false}
sIterator.next();//Object {value: "i", done: false}
sIterator.next();//Object {value: "p", done: false}
sIterator.next();//Object {value: "t", done: false}
sIterator.next();//Object {value: undefined, done: true}

for-ofを使ってとりだすとき

const a = ['j','a','v','a','s','c','r','i','p','t'];
const aIterator =  a[Symbol.iterator]();
for (variable of aIterator) {
  console.log(variable);
}
//j
//a
//v
//a
//s
//c
//r
//i
//p
//t

使い方はここ qiita.com

がとてもまとまってました。ありがとうございます。

Symbolについて

オブジェクトに対して、ある状況に応答するためのインターフェースを組み込む(プロトコルを定義する)ために使う。

const sym = Symbol();

で生成できる。newをつけない。
常に別々のユニークな値として生まれる。

オブジェクトのプロパティとして使うとObject.keys()などで無視される。

GlobalSymbolRegistry

グローバルスコープを越えて共有されるSymbolの領域。 iframeなどを隔てたとしても同じSymbolを共有することができる。
Symbol.for(key)メソッドを使うと keyとして渡した値を持ったSymbolがGlobalSymbolRegistryに存在しなければ、新しく生成したSymbolを生成して返す。

Generatorについて

処理を途中で抜けられる。そのときに値を取り出すことができる。 Generatorオブジェクトはnextメソッドを呼びだすと、 yieldの後に置かれている処理を評価するところまで進み、その評価結果を返す。 返ってくるオブジェクトの中身は

  • value : yieldの後の処理
  • done : すべての値を取り出し終えたかどうか

書き方

function* generatorFunc() {
  yield 1;
  yield 2;
  return 3;
}
var g = generatorFunc();
console.log(g.next()); //Object {value: 1, done: false}
console.log(g.next()); //Object {value: 2, done: false}
console.log(g.next()); //Object {value: 3, done: true}

function* と記述すると定義できる。

読書メモ:イシューからはじめよ(1)

バリューのある仕事とは

  • イシュー度(置かれた局面での答えをだす必要性の高さ)と解の質(どこまで明確に答えがだせているかの度合い)が高い仕事
  • 解の質が高い仕事であってもイシュー度が低いと結果的にバリューのある仕事は生まれにくい(犬の道)
  • 誤:「問題かもしれない」 正:「今この局面で白黒はっきりさせるべき問題」

イシューの見極め

  • 相談できる相手をもつ(本当に受け手にとってインパクトがあるのか?)
  • 具体的な仮説を立てる(答えが出せる形になる、必要な情報と分析がわかる、解釈が明確になる ので)
  • 言葉にする
    • 主語と動詞をいれる
    • 「〜はなぜ?」という形にしない、「〜すべきか?」にする
    • 比較表現にする
  • よいイシューの条件を満たす
    • 本質的(イシューは状況に応じて変わる)
    • 深い仮説
    • 答えが出る

イシューが見つけにくい時

  • 変数を削る
  • 視覚化する
  • 後ろから考える
  • so what?を繰り返す
  • 極端な場合をかんがえる

イシューからはじめよ―知的生産の「シンプルな本質」

イシューからはじめよ―知的生産の「シンプルな本質」

nature of code:今日の練習「障害物を避けて獲物に向かうように進化するビークル」

See the Pen 障害物を避けて進化 by kanaparty (@kanaparty) on CodePen.

前回

tuitui.hatenablog.com

のコードをベースに、障害物を設置してそれを避けて通るように進化させる課題。

前回のコードとの大きな違いは、ビークルの表現のクラスのなかの、適応度を更新する部分。

//適応度を更新
  updateFitness() {
    this.fitness = Math.pow(1 / this.RecordDistance * this.finishTime, 4);
    if(this.hitObstcle){
      this.fitness *= 0.01;
    } else if(this.hitTarget){
      this.fitness *= 2;
    }
  }

前回はライフサイクルが終了した時のビークルの位置を見て適応度としていたが、
今回はライフサイクル中に一番近い付いたときの距離と、そのサイクル数の短さが適応度に反映されるようにする。
また、ターゲットにぶつかったときは2倍の適応度に、障害物にぶつかったときは10分の1の適応度にすることで重みをつけている。

この課題、写経なのでなんとなくできている感のある動きになってはいるものの、
適応度を図る部分や突然変異率、母数などちょっとしたことが与える影響がかなり大きくて 自分一人で1から組み立てチューニングできるようになるのは大変なんじゃないかな、と思ったり。。

nature of code:今日の練習「獲物に向かうように進化するビークル」

See the Pen 獲物に向かうように進化するビークル by kanaparty (@kanaparty) on CodePen.

久しぶりにnature of codeの課題!
前回の進化の課題の表現を文字列から運動に変えて、 解を「獲物(画面右端の丸)にたどり着くこと」とした。
はじめはてんでバラバラの方向に向かう集団が、世代を進めるとだんだん獲物に辿り着けるように進化していく。

読書メモ:webを支える技術(1)(2)

URL URN URI

URL(リソースの場所)、URN(リソースの名前)、URI(リソースの識別)

REST

REST・・・webのアーキテクチャスタイル(指針・作法・流儀、システムを設計するときの指針)

リソース

  • web上に存在する、名前(URI)をもったありとあらゆる情報のこと。
  • URIを使うことでプログラムがアクセスできるようになる。
  • 複数URIをもったリソースもある。
  • ひとつのリソースは複数の表現ができる。
  • リソースには状態がある。

クライアント/サーバー

  • ステートレスサーバー
    アプリケーション状態を保存しない
  • キャッシュ
    いちど取得したデータをクライアントで使い回す
  • 統一インターフェイス
    httpが8個のメソッドしかもっていないのとかがそれ
  • 階層化システム
    負荷分散したりできる
  • コードオンデマンド
    プログラムをサーバからクライアントへ落としてきて実行する(jsとか)

クールなURI

「クールなURIは変わらない」

  • 言語依存の拡張子を使わない
  • 実装依存のパス名を使わない
  • メソッド名を使わない
  • セッションIDを含めない
  • そのリソースを表現する

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)