ファミコンで学ぶアセンブリ言語

 

はい。いよいよそろそろ機械語だったりバイナリ的な何かを学ばないとプログラマとしてアカンかな。という心境に至り、いろいろ情報を集めております。とりあえず、以前に見たこの動画を思い出したのでいろいろ調べたりします。

ユカリンカワイイヤッター

はい。ファミコン七不思議の一つ、「りり」について知らない人はここを読むか各自ググってください。

あと、私自身が「アセンブラ」「アセンブル」「アセンブリ言語」「低級言語」「機械語」「バイナリ」の違いがよくわかっておらんのでそこらへんを調べてから進みます。

低レベル(低級)(低水準)言語

コンピュータによって扱われる言語のうち、コンピュータが直接解釈して処理できる「機械語」、または機械語に近い構造を持ったプログラミング言語のことである。
低級言語は、多くの場合「高級言語」との対比で用いられる。高級言語とは、より人間の言語に近い構文や概念の体系を持ったプログラミング言語を指す語である。https://www.weblio.jp/content/%E4%BD%8E%E6%B0%B4%E6%BA%96%E8%A8%80%E8%AA%9E

アセンブリ(言語)

機械語と一対一の関係にある低水準言語のこと。
アセンブリ言語(アセンブラ言語)と呼ばれる。
言語自体は MOV AX , FFなどと書かれている。
このままでは実行できない。

http://www.cyamax.com/entry/2017/08/14/070000

CASL(キャスル)

情報処理技術者試験の試験課題として独自に開発された言語であり、COMETと呼ばれる架空の演算装置に対応している。
一般的に、アセンブリ言語は機械語とほぼ1対1で対応しており、ハードウェアの設計に対する依存性が強い。
このため、実在するハードウェアやアセンブリ言語を試験の題材とするならば、試験の公平を期することができないという問題が生じる。
CASLやCOMETは、既製品に依拠せず完全に独自に開発されたため、公平さの維持を実現している。
2001年の試験からCASLはCASL IIへと改定されている。
同じくCOMETも仕様変更を経てCOMET IIとなっている。
ちなみに、試験の実施元であるIPA(情報処理推進機構)のWebサイトでは、CASL IIのシミュレータを無償でダウンロード提供している。
https://www.weblio.jp/content/CASL

MOS 6502

アメリカのモステクノロジーが1975年に発表した8ビット MPU (CPU) である。
1977年に発売されたApple II に搭載されて一躍有名になり、その後PET 2001(1977年1月発表、10月発売)、CBM3032、VIC-1001等、主にコモドール社の製品で採用されていた。
日本ではパソコン用のCPUとしてはそれほど普及しなかったが、互換CPU(リコー製RP2A03)がファミリーコンピュータやPCエンジンに採用されている。
https://ja.wikipedia.org/wiki/MOS_6502

MPU(micro processing unit)

主にコンピュータの演算機能を担う半導体チップのことである。
マイクロプロセッサは、PCに関する言及においては、CPU(中央演算処理装置)の同義語として扱われている。
より厳密に言えば、CPUは構成要素としての処理装置のことであり、マイクロプロセッサは1チップ化された処理装置を指すものである。
PCのCPU、MPUは、初期のころから1チップであったため、両者の違いはないに等しい。
世界初のマイクロプロセッサは、1971年に嶋正利らによって電卓用に開発されたIntelの4004である。
4ビットの演算能力を備えていた4004が登場する以前は、多数のトランジスタを実際に組み合わせて回路を構成していたが、4004は2300個分のトランジスタ素子がひとつの半導体チップ上に集積されていた。
https://www.weblio.jp/content/MPU

嶋正利(しままさとし)

日本を代表するコンピューター技術者のひとりである。1943年8月22日、静岡県静岡市生まれ。Intelが開発した世界初のマイクロプロセッサである「4004」の設計開発に携わり、世界のコンピュータ産業に多大な影響を与えたことで知られている。
嶋正利氏は東北大学理学部化学第二学科を卒業した後、日本計算機販売社(後のビジコン社)に入社して電卓の開発に携わることになった。折しも電卓開発争いが始まった頃で、シャープやカシオが小型化のため新しい集積回路(IC)を求めてアメリカ企業と提携を進めてゆく中、日本計算機は設立されたばかりのIntel社へ提携交渉を進めていた。この年(1969年)はIntel社の創立から1年目のことだった。
そこでIntel社と嶋氏は目覚しい活躍を見せ、同社のフェデリコ・ファジンやスタンレー・メイザー、マーシャン・エドワード・ホフJr. らと共に、4004の開発に成功した。完成は1971年4月だった。ただ、その将来性にいち早く気づいたIntelは、開発費を返却して日本計算機販売社から独占販売権を取り戻している。そして同年11月、「MCS-4」の名称で、世界初のマイクロプロセッサが発表された。
1972年、嶋氏はIntelに引き抜かれて米国に渡った。そこでパソコン誕生のきっかけともいえる8ビットマイクロプロセッサ「8080」の開発に貢献した後、Zilog社に転籍してZ80を開発、まもなく16ビットマイクロプロセッサ「Z8000」の開発も手がけた。
1979年、嶋氏は日本に帰国してインテル・ジャパン・デザインセンターを設立した。1986年にはVMテクノロジーを設立。後にAOIテクノロジーの代表取締役社長に就任している。
氏は、1992年に筑波大学から工学博士号を授与されており、1997年には京都賞(先端技術部門)が授与されている。
https://www.weblio.jp/content/%E5%B6%8B%E6%AD%A3%E5%88%A9

ちなみに、著書の「マイクロコンピュータの誕生」はAmazonで1万円を超えるプレミアがついているが、岩波書店のオンデマンド出版が利用でき、5,000円で買えるらしい。
https://www.iwanami.co.jp/book/b287063.html

アセンブラ

アセンブリ言語で書いたプログラムを
機械語に変換するプログラム(ソフト)のこと。
英語ではassemblerなので、
assemble(変換)+er(者)で変換をしてくれる者のこと。
http://www.cyamax.com/entry/2017/08/14/070000

アセンブル

アセンブリをバイナリファイルに変換すること。
アセンブリ言語MOV AX , FF –変換(アセンブル)–> B8FF00バイナリ
となる。
http://www.cyamax.com/entry/2017/08/14/070000

マシン(機械)語

機械語は、その名の通り機械である計算機のために書かれた0と1のビットからなるデータ列である。このため、機械語を見てどのような動作をするのかを人間が理解する事は非常に難しい。また、同じ処理であってもどの機械(CPU)で実行するかによって機械語の内容は変わってしまう。
文字を使って命令とレジスタを表現する事で、機械語をもう少し分かりやすく表記したものがアセンブリ言語である。アセンブリ言語で書かれたコードはアセンブラによって機械語に変換する事ができる。機械語とアセンブリ言語は低級言語、CやJava等のそれ以外のプログラミング言語は高級言語と呼ばれる。
機械語はバイナリエディタなどによって読み書きする事ができる。その際には1と0の二進数ではなく、記述を短くできる十六進数が使われることも多い。
プログラムや入出力がパンチカードで行われていた時代には機械語を読み書きできる事が計算機を扱うエンジニアにとって普通であった。しかし、アセンブラやコンパイラの普及によりそういったスキルは必須ではなくなり、むしろマニアックであるとみなされる領域となっている。
http://dic.nicovideo.jp/a/%E6%A9%9F%E6%A2%B0%E8%AA%9E

バイナリ(ファイル)

中身がバイナリデータなファイルのこと
http://wa3.i-3-i.info/word1147.html

バイナリデータ

バイナリ(binary)とは、元々「2進数の」という意味の英語である。コンピュータはデータを処理するために、全ての情報を2進数に変換しているので、コンピュータが解釈するために用意されたデータはすべてバイナリ形式となっている。
https://www.weblio.jp/content/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA

Hex Editor

そんでは、動画本編を進めてみます。

ゆかりさん「まず、りりが画面にでている状態で背景タイル情報を格納しているVRAM(0x2843)をみてみましょう」

ここで利用しているツールはHxDというバイナリ(Hex)エディタです。

PPU(Picture Processing Unit)

ファミコンで描画を行うのは、PPU(Picture Processing Unit)です。PPUは6502とは別のメモリ空間(VRAM)を持ち、 背景やスプライトの描画を行います。PPUは6502とは独立して非同期に画面描画を行います。 6502がスプライト描画のレジスタ書き込みを行っても、画面にすぐスプライトが描画されるわけではありません。 6502からPPUを操作するには、PPUコントロールレジスタに値を設定します。

http://gikofami.fc2web.com/nes/nes003.html

PPUへのアクセス方法についてはこちらを参照

トレースログ

ゆかりさん「VRAMに『りり』が書き込まれる瞬間の1フレームのトレースログをとります」

トレースログ

トラブルが発生した場合に,トラブル発生の経緯を調査したり,各処理の処理時間を測定したりするために採取するログ情報のことです。

http://itdoc.hitachi.co.jp/manuals/3020/30203S0832/AJSK0010.HTM

 

アセンブリのデバッグ方法がなんとなくわかった気がしたので今日はここまで。

オリソン・スウェット・マーデン

 

はい。後藤新平閣下も読んだとされる

オリソン・スウェット・マーデンの本当の幸せを見つける秘訣

を読んでおります。

別のマーデン本のAmazonのレビューでアル中と書かれているのですが、アル中にしては生涯に渡って業績が多すぎるのと英語wikiだったり英語Google先生に訊いてみても「知らん」とのことなんでたぶんデマです。

明治~大正時代くらいになるとWEB上の情報が極端に不正確になってしまってデマが多くなるのは今後、改善すべきインターネットの課題でやんすね。

さておき、いい本です。この本。翻訳の方がいい腕してるというのもあるのですが、100年前に引き寄せの法則に言及してるのは驚きです。たぶん成功者の皆さんにとっては人類有志始まって以来から現代に至るまで、「人生は思い通りにしかならない」っていうのは周知の事実だったんでしょうたぶん。

この本で私が心に刻んでおきたいことは2つです。

人生を深刻に考えすぎない

自分の悩みに何かユーモラスなところ、滑稽なところがないか考えてみよう。コメディアンになったつもりで、あなたが置かれた状況を笑い飛ばしてみよう。深刻に悩むのは、あとになってからで構わないではないか。

人生にはあなたに都合のよいことしか起きない

(要約)人生に起きるあらゆるイベントはあなたにとって都合の良い、良いイベントである。

 

うむ。その通りでございます。

Laravel 5.6 での Vue の blade template 内の書き方

npm が入ってる前提です。

コンソールから下記を実行してファイルを生成

masasikatano:~/workspace (master) $ npm install
masasikatano:~/workspace (master) $ npm run dev

laravelのテンプレートのhead部分に以下を追記

<meta name="csrf-token" content="{{ csrf_token() }}">

それと、jsを読み込む部分に以下を追記

<!-- Vue -->
<script src="js/app.js"></script>
<script src="js/main.js"></script>

あとは、Vueを表示したい bladeテンプレート部分に、以下のように記入

<div id="hoge">
    <p>Hello @{{ name }}!</p>
    <p><input type="text" v-model="name"></p>
  </div>

Laravel の blade テンプレート内でのVueの書き方は

@{{ hoge }}

になります。

あと、自分でvueを記述するための

js/main.js

var app = new Vue({
  el: '#hoge',
  data: {
      name: 'taguchi'
    }
});

にいろいろ書くと使えます。

取り急ぎメモ。

 

参考 : LaravelからVue.jsを使う最短レシピとTips

https://qiita.com/fruitriin/items/e0f2c9aa035c3ff2c874

ドットインストールのVue講座

 

はい。百式先生ドットインストールのVue講座を進めています。

とりあえずモリモリ進めてみたんですが、内容を復習も兼ねてまとめたくなったんで書いときます。

Vue.js とは

JavaScript謹製のUI 部品を作るためのフレームワーク。使えると超便利。中国系アメリカ人の方が作ってるらしく中国語でもサポート充実で中国でも人気らしいです。

また、AngularJS等と同じく、双方向データバインディングができるのが大きな特徴。

双方向データバインディングとは、データが更新されればUIが更新され、UIが更新されればデータが更新される仕組みのことです。

基本的には、jQueryなんかと同じくライブラリの本体を読み込むとブラウザあれば動くようになります。

ミニマルなVue.js

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

(function() {
  'use strict';
})();

用語解説

ざっくり用語解説です。特にわからなければリンク先をじっくり読んだりしてしっかり感じ取ってください。

View Model

ViewModel とは Vue.js のインスタンスのこと。
View と Model をとりもつオブジェクト。

Vue.jsではじめるMVVM入門

インスタンス

インスタンス (instance)とはオブジェクト指向で出てくる概念のひとつで設計図(クラス)を具現化した「実体」のこと

インスタンス (instance)

インスタンスとオブジェクトの違い

ディレクティブ

ディレクティブとは、DOM 要素に対して何かを実行することをライブラリに伝達する、マークアップ中の特別なトークンです。

ディレクティブ

個人的には、このディレクティブが Vue.js が Vue.js である最大の特徴であり、Vue.js そのものであると言っても過言ではないと思いますたぶん。

Vue.jsのディレクティブ ≒ 他プログラミング言語の制御構造

みたいな認識なのですがあんまり自信はないですはい。

v-model ディレクティブ

v-model はUIとViewModelオブジェクトを紐付けるディレクティブです。

index.html

まずはVue.jsで扱うUIの領域を id = app として div で定義します。main.jsのViewModelインスタンスから受け取ったデータは {{ }} の中に書くことで表現できます。

次に、UIから data へ反映させるには input タグを使用して v-model=”name” というディレクティブを使用することで main.js 内の ViewModel インスタンスの name データと紐付けすることができます。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app">
    <p>Hello {{ name }}!</p>
    <p><input type="text" v-model="name"></p>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

UI ( id=app ) に結びつくデータを作るため、 ViewModel インスタンス ( var vm )を作成し、どの領域の UI  と結びつけるのかを el (elementsの略) キーで指定し、data キーで保持するデータを指定します。

(function() {
  'use strict';
  // 
  var vm = new Vue({
    el: '#app',
    data: {
      name: 'taguchi'
    }
  });
})();

v-for ディレクティブ

v-for は配列をループさせて表示するためのディレクティブです。

List Rendering

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app">
    <h1>My Todos</h1>
    <ul>
      <li v-for="todo in todos">{{ todo }}</li>
    </ul>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

data には配列形式でデータを保持することもできる。

(function() {
  'use strict';

  var vm = new Vue({
    el: '#app',
    data: {
      todos: [
        'task 1',
        'task 2',
        'task 3'
      ]
    }
  });
})();

v-on ディレクティブ

v-on ディレクティブを使うことで、DOM イベントの購読、イベント発火時の JavaScript の実行が可能になります。

イベントハンドリング

index.html

まずは、input タグに v-model=”newItem” ディレクティブを使用してViewModel インスタンスの newItem データと紐付けします。

次に、フォームが submit された時にViewModel内のメソッドを発火するためにディレクティブとして v-on:submit=”addItem” を使用します。また、 v-on はよく使うので @submit=”addItem” とすることも可能です。

さらに、@submit.prevent=”addItem” とすることでsubmitを押下したときの画面遷移(リロード)を防ぐことができます。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app" class="container">
    <h1>My Todos</h1>
    <ul>
      <li v-for="todo in todos">{{ todo }}</li>
    </ul>
    <!-- <form v-on:submit="addItem"> -->
    <form @submit.prevent="addItem">
      <input type="text" v-model="newItem">
      <input type="submit" value="Add">
    </form>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

UIから受け取る newItem を data に追加します。

次に、v-on ディレクティブで使用するメソッドとして methods というキーを追加して、その中に addItem メソッドを追加します。data 内のデータには this でアクセスできるので this.newItem と書くことができます。

(function() {
  'use strict';

  var vm = new Vue({
    el: '#app',
    data: {
      newItem: '',
      todos: [
        'task 1',
        'task 2',
        'task 3'
      ]
    },
    methods: {
      addItem: function() {
        this.todos.push(this.newItem);
        this.newItem = '';
      }
    }
  });
})();

v-onのクリックイベント

index.html

spanタグに @click=”deleteItem(index)”と指定することで main.jsのメソッドを発火させることができます。

v-for は v-for=”(todo, index) in todos” とすることで配列のインデックスを、展開後に使用することができます。

リストレンダリング

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app" class="container">
    <h1>My Todos</h1>
    <ul>
      <li v-for="(todo, index) in todos">
        {{ todo }}
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
    </ul>
    <form @submit.prevent="addItem">
      <input type="text" v-model="newItem">
      <input type="submit" value="Add">
    </form>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

ViewModel の methods に deleteItem を追加して、todos の 指定のidの 要素を削除する処理を追加します。

(function() {
  'use strict';

  var vm = new Vue({
    el: '#app',
    data: {
      newItem: '',
      todos: [
        'task 1',
        'task 2',
        'task 3'
      ]
    },
    methods: {
      addItem: function() {
        this.todos.push(this.newItem);
        this.newItem = '';
      },
      deleteItem: function(index) {
        if (confirm('are you sure?')) {
          this.todos.splice(index, 1);
        }
      }
    }
  });
})();

v-bind ディレクティブ

index.html

チェックボックスに対しては v-model=”isDone” を書くことで、isDone が true のときは checked の役割をします。

フォーム入力バインディング

データに応じて css の class を付け替えるには v-bind ディレクティブを使用します。

span タグに v-bind:class=”{done: todo.isDone}” とすると、 VeiewModel データの todo.isDone が true の時は、 css の done クラス が表示されます。

また、v-bind は省略が可能で、 :class=”{done: todo.isDone}” とできます。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app" class="container">
    <h1>My Todos</h1>
    <ul>
      <li v-for="(todo, index) in todos">
        <input type="checkbox" v-model="todo.isDone">
        <!-- <span v-bind:class="{done: todo.isDone}">{{ todo.title }}</span> -->
        <span :class="{done: todo.isDone}">{{ todo.title }}</span>
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
    </ul>
    <form @submit.prevent="addItem">
      <input type="text" v-model="newItem">
      <input type="submit" value="Add">
    </form>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

(function() {
  'use strict';

  var vm = new Vue({
    el: '#app',
    data: {
      newItem: '',
      todos: [{
        title: 'task 1',
        isDone: false
      }, {
        title: 'task 2',
        isDone: false
      }, {
        title: 'task 3',
        isDone: true
      }]
    },
    methods: {
      addItem: function() {
        var item = {
          title: this.newItem,
          isDone: false
        };
        this.todos.push(item);
        this.newItem = '';
      },
      deleteItem: function(index) {
        if (confirm('are you sure?')) {
          this.todos.splice(index, 1);
        }
      }
    }
  });
})();

v-show ディレクティブ v-if ディレクティブ

index.html

条件的な要素を表示するのは v-show ディレクティブを使用します。また、他の言語のif文と同じような v-if ディレクティブ も使用できます。

条件付きレンダリング

また、一般的に、v-if はより高い切り替えコストを持っているのに対して、 v-show はより高い初期描画コストを持っています。 そのため、とても頻繁に何かを切り替える必要があれば v-show を選び、条件が実行時に変更することがほとんどない場合は、v-if を選びます。

Vueのあれこれ

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app" class="container">
    <h1>My Todos</h1>
    <!-- <ul>
      <li v-for="(todo, index) in todos">
        <input type="checkbox" v-model="todo.isDone">
        <span :class="{done: todo.isDone}">{{ todo.title }}</span>
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
      <li v-show="!todos.length">Nothing to do, yay!</li>
    </ul> -->
    <!-- <ul>
      <li v-if="todos.length" v-for="(todo, index) in todos">
        <input type="checkbox" v-model="todo.isDone">
        <span :class="{done: todo.isDone}">{{ todo.title }}</span>
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
      <li v-else>Nothing to do, yay!</li>
    </ul> -->
    <ul v-if="todos.length">
      <li v-for="(todo, index) in todos">
        <input type="checkbox" v-model="todo.isDone">
        <span :class="{done: todo.isDone}">{{ todo.title }}</span>
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
    </ul>
    <ul v-else>
      <li>Nothing to do, yay!</li>
    </ul>
    <form @submit.prevent="addItem">
      <input type="text" v-model="newItem">
      <input type="submit" value="Add">
    </form>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

(function() {
  'use strict';

  var vm = new Vue({
    el: '#app',
    data: {
      newItem: '',
      // todos: [{
      //   title: 'task 1',
      //   isDone: false
      // }, {
      //   title: 'task 2',
      //   isDone: false
      // }, {
      //   title: 'task 3',
      //   isDone: true
      // }]
      todos: []
    },
    methods: {
      addItem: function() {
        var item = {
          title: this.newItem,
          isDone: false
        };
        this.todos.push(item);
        this.newItem = '';
      },
      deleteItem: function(index) {
        if (confirm('are you sure?')) {
          this.todos.splice(index, 1);
        }
      }
    }
  });
})();

computed プロパティ

index.html

spanタグ囲って、 {{ remaining }} を追加します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app" class="container">
    <h1>
      My Todos
      <span class="info">({{ remaining }}/{{ todos.length }})</span>
    </h1>
    <ul>
      <li v-for="(todo, index) in todos">
        <input type="checkbox" v-model="todo.isDone">
        <span :class="{done: todo.isDone}">{{ todo.title }}</span>
        <span @click="deleteItem(index)" class="command">[x]</span>
      </li>
      <li v-show="!todos.length">Nothing to do, yay!</li>
    </ul>
    <form @submit.prevent="addItem">
      <input type="text" v-model="newItem">
      <input type="submit" value="Add">
    </form>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

ViewModel内の computed キーはVue インスタンスに組み込まれる算出プロパティ (Computed property) です。

算出プロパティはキャッシュされ、そしてリアクティブ依存が変更されたときにだけ再算出します。ある依存関係がインスタンスのスコープ外の(つまりリアクティブではない)場合、算出プロパティは更新されないことに注意してください。

https://jp.vuejs.org/v2/api/#computed

ViewModel に computed プロパティを追加します。todos.isDone の数が変更されると動的に remaing の値が変更されます。

(function() {
  'use strict';

  var vm = new Vue({
    el: '#app',
    data: {
      newItem: '',
      todos: [{
        title: 'task 1',
        isDone: false
      }, {
        title: 'task 2',
        isDone: false
      }, {
        title: 'task 3',
        isDone: true
      }]
    },
    methods: {
      addItem: function() {
        var item = {
          title: this.newItem,
          isDone: false
        };
        this.todos.push(item);
        this.newItem = '';
      },
      deleteItem: function(index) {
        if (confirm('are you sure?')) {
          this.todos.splice(index, 1);
        }
      }
    },
    computed: {
      remaining: function() {
        var items = this.todos.filter(function(todo) {
          return !todo.isDone;
        });
        return items.length;
      }
    }
  });
})();

Component

index.html

コンポーネントは Vue.js の最も強力な機能の 1 つです。基本的な HTML 要素を拡張して再利用可能なコードのカプセル化を助けます。高いレベルでは、コンポーネントは Vue.js のコンパイラが指定された振舞いを加えるカスタム要素です。場合によっては、特別な is 属性で拡張されたネイティブな HTML 要素の姿をとることもあります。

コンポーネント

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app">
    <like-component></like-component>
    <like-component></like-component>
    <like-component></like-component>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

(function() {
  'use strict';

  var likeComponent = Vue.extend({
    data: function() {
      return {
        count: 0
      }
    },
    template: '<button @click="countUp">Like {{ count }}</button>',
    methods: {
      countUp: function() {
        this.count++;
      }
    }
  });

  var app = new Vue({
    el: '#app',
    components: {
      'like-component': likeComponent
    }
  });

})();

Component内のpropsキー

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app">
    <like-component message="Like"></like-component>
    <like-component message="Awesome"></like-component>
    <like-component message="Great"></like-component>
    <like-component></like-component>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>
</body>
</html>

js/main.js

親コンポーネントからデータを受け取るためにエクスポートされた属性のリスト/ハッシュです。シンプルな配列ベースの構文、そして型チェック、カスタム検証そしてデフォルト値などの高度な構成を可能とする配列ベースの代わりとなるオブジェクトベースの構文があります。

https://jp.vuejs.org/v2/api/#props

(function() {
  'use strict';

  var likeComponent = Vue.extend({
    // props: ['message'],
    props: {
      message: {
        type: String,
        default: 'Like'
      }
    },
    data: function() {
      return {
        count: 0
      }
    },
    template: '<button @click="countUp">{{ message }} {{ count }}</button>',
    methods: {
      countUp: function() {
        this.count++;
      }
    }
  });

  var app = new Vue({
    el: '#app',
    components: {
      'like-component': likeComponent
    }
  });

})();

 

Udacity の Google による Website Performance Optimization をやってみる

 

はい。 Vueを勉強してるんですが、ブラウザのレンダリング周りの知識が必要なことになり、調べてます。そんななかみつけたのが Udacity の Website Performance Optimization

Udacity とは

Udacityとは、元スタンフォード大学教授のコンピュータ科学者セバスチャン・スラン(Sebastian Thrun)が中心となって立ち上げられたMOOC(大規模公開オンライン講座)のプラットフォームである。2012年2月にサービスを開始した。

Udacityはコンピュータサイエンスまたは数学の分野に特化しており、人工知能やアルゴリズムなどをテーマとした高度な授業を配信している。最初に配信した2コースだけで世界中から延べ16万人のユーザーが受講したとされる。Udacityは「Coursera」や「edX」と共に代表的なMOOCのプラットフォームとして挙げられることが多い。

ちなみに、Udacityの設立者であるセバスチャン・スランは、Google X Labの立ち上げに加わり「Google Glass」や「Google driverless car」などの研究開発プロジェクトに携わっていることでも知られている。

セバス·チャンはナザリック第9・10階層に控え、メイド長と共に「至高の41人」の生活面を支える最高責任者である家令。

サンクユーセバス!というわけでさっそくやっていきます。Website Performance Optimization

導入

ムッキムキの赤い彼がGoogleのWebパフォーマンスエンジニアのイリヤ・グリゴリクさんです。

GoogleのTシャツが欲しい。ムッキムキです。ムッキムキ。最近のエンジニアは筋トレが必修科目であることがよくわかります(ぇん)。

Critical Rendering Path Walkthrough

クリティカルレンダリングパスとは、ブラウザがHTML、CSS、JavaScriptを画面上のピクセルに変換するための一連のステップのこと

HTMLとDOM

ブラウザはURLの入力を受けてサーバーにページを要求し、入手したHTMLの解析を行う。

文字情報 Character → トーカナイザによりトークン化 Tokens → 別のプロセスによりノードオブジェクト化 Nodes → ノードオブジェクトを統合して、ドキュメントオブジェクトモデルを作成する DOM

の順番に解析を進めていく。

Fast Google Search Responses

Googleに検索キーワードを入力すると、

  1. まず、検索結果ページの共通ヘッダ部分(キーワードを入力できる部分)を描画する
  2. 検索結果が届きしだい、検索結果をリスト化して表示する

という二段階に分かれて結果ページを表示している。

Converting CSS to the CSSOM

CSSはブラウザのパースによって、HTMLのように、

文字情報 Character → トーカナイザによりトークン化 Tokens → 別のプロセスによりノードオブジェクト化 Nodes → ノードオブジェクトを統合して、CSSオブジェクトモデルを作成する CSSOM

を経てCSSOMに変換される。

その際、CSSは再定義を許可しているため、全てのCSSをCSSOMに変換してからでしかレンダリングが行えない。

つまり、少しずつ段階を分けてレンダリングする手法がとれないため、CSSは(相対的に)ブロッキングであるといえます。

Steps to Render the Page

 

ページをレンダーする際にブラウザは以下の手順を踏みます。

  1. Begin constructing the DOM by parsing HTML – HTMLを解析してDOMを構築し始める
  2. Request CSS & JS resources – CSSとJavaScriptのリソースを要求する
  3. Parse CSS and construct the CSSOM tree – CSSを解析してCSSOMツリーを作成する
  4. Execute JS – JavaScriptを実行する
  5. Merge DOM and CSSOM into the Render Tree – DOMとCSSOMを結合させてレンダーツリーを作成する
  6. Run layout, Paint – レイアウトとペイントを実行する

Optimizing the DOM

通常、前項6のレンダーツリー構築前の、1.DOMと3.CSSOMがレンダリングを遅くさせる原因となります。

Unblocking CSS with Media Queries

デフォルトでブラウザは特定のスタイルシートそれぞれがレンダリングをブロックすると仮定します。

しかしメディアクエリにメディア属性を加えることでスタイルシートが適用される場合を指示することもできます。

参考: メディアクエリの利用

例えば、スマホでポートレイトモードの場合には下記のように

上の2つのCSSがレンダリングをブロックしますが、

下2のCSSはレンダリングをブロックしません。

JavaScript and the CRP

下記の例ではDOM → Javascript → DOM の順番でページが解析される。

つまり、JavaScriptはパーサをブロックすると言えます。

 

OpenAim を Laravel 5.6 にアップグレードしました

 

はい。Laravel 5.6 発表されましたね。それに伴って、私のサイトも Laravel 5.2系から 5.6 にアップグレードしました。

今は OpenAimもLaravel 5.6で動作しております。

参考にさせていただいた記事はこちら

Laravel5.3 アップグレード @kawax

移行に伴い、テストが全滅してたりしたおかげで一瞬ヒヤッとしましたがなんとか移行できました。

ついでに、MySQLをアップグレードしたらMariaDBと統合した兼ね合いなのか、単にSDカードが老朽化してただけなのか、Raspberry Pi が起動しなくなりビビリましたがその復旧も終わって私は元気です。

そんで、何が言いたいかと言うとOpenAimが一周年を迎えました。

いよいよサイトをオープンして丸一年でございます。

これもひとえに利用して頂ける皆様のおかげでございます。

まあ、このサイトがどんなサイトなのかはリンク先をみてもらうとしてまだまだ登録者様を大募集しております。

オンラインサービスやタスク管理サービスやゲームが好きな方々ぜひぜひ登録してみてね!

地頭力を鍛える 問題解決に活かす「フェルミ推定」 細谷 功

 

はい。地頭力を鍛える 問題解決に活かす「フェルミ推定」 細谷 功 をよみました。

以下要点

東京都に信号は何基あるか

1. 単位面積あたりの本数を市街地と郊外で分ける

1-2. 市街地の電柱配置を50m四方に1本 = 50m × 50m = 2,500m2に1本、つまり ( 1000m × 1000m = 1,000,000m2 になるので) 1,000,000m2 ÷ 2500m2 = 400本 で市街地の1km四方には400本の電柱があると仮定する

 

1-3. 郊外の電柱配置を200m四方に1本 = 200m × 200m = 40,000m2に1本、つまり ( 1000m × 1000m = 1,000,000m2 になるので ) 1,000,000m2 ÷ 40,000m2 = 25本 で郊外の1km四方には25本の電柱があると仮定する

 

日本の総面積は378,000 km²でこの情報はネットを見ればすぐに分かる。

また、国土の約73%を山地が占める山国でもある。というのもネットですぐに出てくる。そこで、73%(山地)+7%(緩衝地帯)= 80%が郊外、20%が市街地と想定する。

 

2. 実際に計算する

2-1-1. 市街地の面積 = 378,000 km² × 20% = 75,600 km2

2-1-2. 市街地の電柱の本数 = 400 × 75,600 km2 = 30,240,000 本

2-2-1. 郊外の面積 = 378,000 km² × 80% = 302,400 km2

2-2-2. 市街地の電柱の本数 25 × 302,400 km2 = 7,560,000 本

2-3. 日本の電柱の本数の合計 = 30,240,000 + 7,560,000 = 37,800,000本

 

そうすると、実際は33,000,000本らしいのでだいたい合ってるらしい。

日本人だけが知らない戦争論 苫米地英人

 

ええ。表題の通りを読んでございます

クロムウェルの正体

1650年代にニューモデル・アーミーを指揮し清教徒革命を行ったオリバー・クロムウェルは、世界の銀行家の豊富な資金を背景にイギリス国王チャールズ一世の王政を打破し、銀行家へイギリスの通貨発行権をもたらし、その後に真実を知る者と共に始末されたのだと氏は伝えます。

要するに、戦争をして得をするのはその後に通貨発行権を手にする人物で、戦争を行うのもこの種の人物だと氏は言います。

各国の革命の奇妙な類似性

日本の戊辰戦争であっても、薩長同盟に資金提供をしていたのはイギリスの銀行家で、幕府に資金提供をしていたのはフランスの銀行家でした。

その後、ニューモデル・アーミーのような私兵くずれの奇兵隊が現れ倒幕となり、日本銀行が設立されています。

戦争でのお金儲けの方法

戦争でのお金儲けの方法は、相手の土地を焦土にして二束三文で買い叩くというものです。

経済学は虚学

元々経済学は、ヨーロッパの大銀行家の戦争への主張を正当化するために生み出された接待用の学問でした。

その証拠に、経済学の大前提として、「不景気になれば金利を下げる必要があり、好景気になれば金利を上げる必要がある」という理論がありますが、実際には因果関係が逆で、「金利を下げれば好景気になり、金利を上げれば不景気になる」という単純な話を中央銀行が景気を操作しているのを民衆に悟らせず、中央銀行へのヘイトが向かないようにするカバーストーリーを各々の経済学者が担当しています。

戦争に加担するな

銀行家のお金儲けに手を貸す必要はありません。

疑うこと

恐れないこと

執着しないこと

が重要だと氏は言います。

自分を大きく変える偉人たち、100の言葉

 

はい。読んでます。

自分を大きく変える偉人たち、100の言葉 苫米地 英人 (著)

以下、私が気になったところの要点

孤独というのは主観的な発想

孤独というのは主観的な発想だということです。
西洋的個人主義が礎にあるから、自分を中心にして考えられているのです。この世に本当に孤独な人なんているのでしょうか。みんな誰かと関係して生きているはずです。
六十六億人(2015年当時)も地球上に人がいるのに、なぜ自分が孤独だと思うのでしょうか。つまりは視野が狭くなり、自分の作り出した壁を見ているだけなのです。

人間一人が保持できる情報は有限、外の情報は無限

どんな物知りな人でも、有限情報で生きているので、誤った判断や認識をするのが当たり前です。

この世に失敗はない

人生は有限ですが、人間がしたことが成功か失敗かは、おそらく無限にわからないことです。失敗か成功かは、(人類が)滅亡するまで判断がつかないわけです。

謙虚で貪欲であれば最後には勝てる

(エリック・)クラプトン的な生き方とは、謙虚に堂々と(他人のギタープレイを)真似して、長生きすることです。そうすれば(真似した人が死んでしまってオリジナルになって)勝てます。

仕事のために無理にモチベーションを上げる必要はない

上機嫌ではかどること=仕事なのです。そう思えない職に就いている人は、今すぐやめてしまったほうが良い。

心がこの世を生み出している

他人の言動に気持ちを左右されてはいけません。自分のマイナスの感情はすべて心の持ちようで解消されます。

重要なのは自己演出力

人生においては自己プロデュース力が重要だということです。自己演出は自らのエフィカシーを上げる行為です。常に自分の素晴らしい個性をわかりやすく演出することを意識しましょう。

あなた>お金

世界はみなさんを中心に回っています。あなたにはお金より高い価値があります。

自分を成長させるものにお金を使う

もしあなたに、今よりもっとお金を稼ぎたいという考えがあるなら、自分を成長させることにお金を使うべきです。

抽象度の高い視点を持つ

では、どうやって人脈を増やせばよいのかと言いますと、「相手の価値観を覆し、鮮烈な印象を残す」という方法があります。そのために重要なポイントは「相手より抽象度の高い視点を持つ」ことです。

恋愛は娯楽

恋愛はヒマな人がハマる娯楽行為であり、人生にはもっとやるべきことがたくさんあるはずです。

 

すべてを可能にする数学脳のつくり方

 

はい。すべてを可能にする数学脳のつくり方 苫米地 英人 (著)

を読みました。数学に抵抗感のある人はとても勇気が出る本なのでおすすめであります。以下要点。

数学は言語である

数学が理解できないのは表記がわからないからである

フェルマーの最終定理

3 以上の自然数 n について、xn + yn = zn となる自然数の組 (xyz) は存在しない

数学の最難問も表記を理解すれば一般人にも意味がわかるようになる

不確定性原理

デルタは誤差のこと。

xはロケーションで位置を意味する。

pはベロシティで運動量と方向と定義されるが、今回は運動量とする。

hはプランク定数で10のマイナス34乗くらいの数字のさらに半分のごく小さな数字。

位置と運動量の誤差は、必ずごく小さな数字以上にはなるという意味で「すべての存在は不確定だ」という意味になる。

つまり、この式は「この世に確定的なものはなにもないことを表す数式」なのである

法律は矛盾だらけ

この世に確定的なものは全くないにも関わらず、確定的なものとして無理やりに制定された憲法や法律のようなものは数学的世界に反する行いであり、世界の矛盾や無駄は憲法や法律に依拠することで始まることが多い。

幸福の基準は量ではなく変化

Aさんは資産を400万円持っている。ある日投資に失敗して資産を300万円に減らしてしまった。

Bさんは資産を100万円持っている。ある日投資が成功して資産を110万円に増やすことができた。

過去の経済学では資産を多く持っているAさんの方が幸福だとしてきたが、実際に私達が幸せだと感じるのはあきらかにBさんの方である