CasperJSで非同期部分をテストしたい
firefoxの仕様か何かで、iframeのadがうまく表示されないということがありました。 実装を非同期のものに変えたのですが、 非同期実装した広告が出ているかどうか、テストがしんどいと思い、CasperJSでE2Eテストを実装しました。
デフォルトで要素を待って実行できるなんて、Casperさんは偉い。
.hogehoge
要素を待って、要素を取得します。
casper.waitForSelector(".hogehoge", function _then() { //要素取得 this.test.assertExists(".hogehoge"); },function _onTimeout(){ //タイムアウト時 this.echo("hogehoge not found", "WARNING"); this.test.assertExists(".hogehoge"); });
jsのObjectで.mapしたらはまった
//オブジェクトを作成 var tagNameArray = ["name1", "name2"]; var pushObjs = {}; tagNameArray.map(function (tagName, index){ pushObjs[index] = { "tagname": tagName, "size": "3", "id": index }; }); //勘違い実装 pushObjs.map(function (pushObj){ consoel.log(pushObj); });
ってやると死にます。死にました。 配列の時だけ.mapしましょう。。
for (var i in pushObjs) { pushObjs[i].map(function (pushObj){ consoel.log(pushObj); }); }
これもダメです。
for (var i in pushObjs) { console.log(pushObjs[i]); }
大人しくこうしておきますか・・・
ていねいにvue-cliを使った環境構築手順を書いてみる
Vue-cli環境構築
vue-cliで簡単にvue.jsの環境構築ができます。
前提条件
以下がインストールされていること
- node.js
- npm
node -v
npm -v
でインストールされているバージョンが確認できます。
インストールしていない方はしてください。 nodeはnodebrewなどを使用して、バージョンを管理しておきましょう。
1.ターミナルを開きます。
spotlight(command
+space
)で
ターミナルって入れると候補で出してくれます。
vue-cliをインストールします
npm install -g vue-cli
インストールが始まります。
ちょっと長いかも・・・
終わりました。
プロジェクトを作成します
vue init webpack my-project
webpackをボイラーテンプレートとしてプロジェクトを作成します。
色々聞いてきます。
EnterでOK
EnterでOK
EnterでOK
EnterでOK
yを入力
lintの設定ですね。慣れないうちは、ここはnにしておきましょう
テストの環境を構築するかどうか?にします
こちらはe2eテストの環境ですね。nにします
project作成終了です
まだ終わっていません!
cd my-project
でディレクトリを移動します。
これで、現在地はmy-projectです
npm install
します。
ちょっと長いです。
package.jsonに記載してある依存モジュールをインストールしています。
終わりました。
起動します
環境構築は完了です。
立ち上げてみましょう!
npm run dev
でローカルのnodeサーバーが起動します。
URLを教えてくれるので、アクセスしてみましょう。
この場合はhttp://localhost:8080
です
開きました!
起動したサーバーはctrl
+c
で終了することができます。
便利ツールを導入しておきましょう!
vue.js devtoolsというchromeのアドオンがあります。
https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd
先ほど立ち上げたhttp://localhost:8080
で、このように使うことができます。
環境構築は以上です!!
参考
github dist使ってみた
ただただmarkdownで書いた勉強会用資料を、勉強会で共有したいためだけに使ってみた。
勉強会用配布資料でgithub distにたどり着くまでの流れ。
- markdownでスライドが作成できる!Marpで資料を作成。 発表するだけならMarp上だけで良いが、実際にみんなでプログラムを動かしながら説明したいため、コードのコピペができるようにしたい。 ->エクスポートが必要。
- Marpでpdfエクスポートを実行。作成途中にはエクスポートできたが、完成後は画像が重すぎるのか失敗する。
- npm でmarkdown-pdf(https://www.npmjs.com/package/markdown-pdf)をインストール、nodeでpdfへ変換する。 ->コード部分に全角が混じる。
- github distにたどり着く
この記事上にリンクを貼ろうとしたら、埋め込み表示が・・・!
画像をupしてリンクを貼るのはちょっとめんどくさいけれど、 プライベートにもできるので、良さそう。
アルゴリズムパズルを考えてみた
ルール
3 * 3マス。 1から9までの数字を当てはめて、縦、横、斜めの合計を全て同じにするよくあるタイプ。
まず、合計値を推測します
1 2 3 4 5 6 7 8 9
一番小さい値が 1 一番大きい値が 9 真ん中の値が 5
なので、1 + 9 + 5 で 15 なんじゃないかと。 奇数なので、合計で10になるセットを2つの数字で組むと(1+9, 2+8, 3+7 とか・・・)、5だけ(5+5)でその数自身になって、あぶれますしね。 でも、なぜ?と言われると説明できない・・
合計値(45)を出して、列数の3で割るっていうのが、一番説明としてはしっくりきそうです。(45/3 = 15)
という2つの視点から、5が真ん中になるのが一番簡単そうですよね、 セットは10が作りやすいはずなので。
| - | - | - |
| - | 5 | - |
| - | - | - |
となると、どこかの対角線上に入るであろう数字は、例えば(1,9)
ここでポイントとなってくるのが9です。 9の来るライン上には、(8,7,6)は置けません。9と足すと、15以上の合計値ができてしまうので。 以下、ライン上が×。残りは○。
| × | ○ | × |
| × | 5 | ○ |
| 9 | × | × |
○のところにしか(8,7,6)は置けないのに2箇所じゃ足りない・・・
| × | ○ | ○ |
| 9 | 5 | × |
| × | ○ | ○ |
とすると、9が角にくることはなさそうです。
| × | 9 | × |
| 9 | 5 | 9 |
| × | 9 | × |
9が置けるのはこの4パターン
| - | - | - |
| 9 | 5 | 1 |
| - | - | - |
9が決まれば、1は1箇所に決まります。
| n | ○ | ○ |
| 9 | 5 | 1 |
| m | ○ | ○ |
○のところにしか入らないのは(8, 7, 6)。 とすると、残りの(2, 3, 4)が入るのは×のところです。そちらの方が選択肢が狭いですね。
9 + n + m =15 だとすると、 (n, m)は(2, 4)もしくは(4, 2)です。パターンとしては2つですね。
| 4 | ○ | ○ |
| 9 | 5 | 1 |
| 2 | ○ | ○ |
仮に当てはめます。とすると、4の対角や2の対角が埋められそうです。パターンは1です。
| 4 | ○ | 8 |
| 9 | 5 | 1 |
| 2 | ○ | 6 |
もう全部埋まりますね。
| 4 | 3 | 8 |
| 9 | 5 | 1 |
| 2 | 7 | 6 |
9の位置は4パターン 2,4が2パターン
5が真ん中の場合は4*2の8パターン存在します。
もっと解法がありそうだなぁ
markdown-pdfを使ってmdをpdfに焼いてみた
marpを使ってプレゼン資料を作成していたのですが、 資料が重すぎるのか、ページがそこそこ増えた結果、pdfにエクスポートできなくなってしまいました。
marpが大好きなだけに辛い・・
markdownをpdfに変換するツールは他にもあるだろうということで、 npmで簡単に導入できる
GitHub - alanshaw/markdown-pdf: Markdown to PDF converter
を使用してみました。
焼いたpdfがこちら
https://pocchi.github.io/docs/vue%E5%8B%89%E5%BC%B7%E4%BC%9A.pdf
これをそのまま勉強会の資料として配布したのですが、不評でしたw コードに全角が入っていて、そのままコピペできないというトラップ!!
レイアウトもそんなに綺麗にできませんでしたし(A4前提で作成していないので仕方がないのですが・・・)
何か他に良い方法を探します。。
Vue.js勉強会資料作成中(その2)
Vue.js勉強会資料作成中(その1) - カメ飼ってる新米エンジニアの覚書き
のその2です。
では、はじめてみましょう!
Vue.jsの始め方(初心者用)
htmlを作成し、CDN読み込んじゃう
<!-- Vue.jsの読み込み --> <script src="https://unpkg.com/vue"></script>
jsFiddleってやつ
https://jsfiddle.net/chrisvfritz/50wL7mdz/
今回はこれ使います。
Fork
を押して、自由に書き換えましょう
Run
で実行されます。保存はUpdate
。
保存しなくてもRun
できます。
URL
を覚えておけば、いつでもアクセスできます。
他にも手段があるよ
3.vue-cliってのを使う(nodeを使うよ)
4.npmでインストール(nodeを使うよ)
[参考] https://jp.vuejs.org/v2/guide/installation.html
(ここでデザイナーさんにCDNって何?って言われた)
messageを変更してみよう
new Vue({ el: '#app', data: { message: 'ここを変更してみて' } })
変更後、Run
をクリック!
[こうなってるはず] https://jsfiddle.net/pocchi/rtec7eyh/1/
こんな書き方もできる
<script src="https://unpkg.com/vue/dist/vue.js"></script> <div id="app"> <p v-html="message">メッセージ</p> </div>
v-html
という属性をつければはじめに書いておいて、
置き換えることもできる。
{{生の文字列}}
だが、v-html
はHTMLとして扱える。
[参考]https://jp.vuejs.org/v2/guide/syntax.html#生の-HTML
[こうなってるはず] https://jsfiddle.net/pocchi/rtec7eyh/2/
v-if
で出し分け
<div id="app"> <p v-if="message">メッセージ</p> </div>
new Vue({ el: '#app', data: { message: true } })
[参考]https://jp.vuejs.org/v2/guide/syntax.html#ディレクティブ https://jp.vuejs.org/v2/guide/#条件分岐とループ [こうなっているはず] https://jsfiddle.net/pocchi/rtec7eyh/3/
message: false
に変更してみましょう
[変更後はこれ] https://jsfiddle.net/pocchi/rtec7eyh/4/
ところでv-
ってなに
v- から始まる特別な属性をディレクティブと言います。
単一の JavaScript 式を期待します。 ディレクティブの仕事は、属性値の式が変化したときに、リアクティブに副作用を ※DOM に適用すること。
さっきの例だと、
true
で挿入、false
で削除できるってこと
※DOM(Document Object Model)とは、xmlやhtmlの各要素、たとえば<p>
とか<img>
とかそういった類の要素にアクセスする仕組みのことです。このDOMを操作することによって、要素の値をダイレクトに操作できます。
[参考・引用]https://jp.vuejs.org/v2/guide/syntax.html#ディレクティブ http://piyo-js.com/05/dom.html
Vue.js側で値を変化させれば、 それにつられてHTMLも勝手に変わる
つまり、状態を管理しやすい !
v-for
でリストを表示する
<div id="app"> <ol> <li v-for="todo in todos"> {{todo.text}} </li> </ol> </div>
new Vue({ el: '#app', data: { todos: [ { text: 'JavaScriptを勉強する' }, { text: 'Vueを勉強する' }, { text: '何かすごいものを作る' } ] } })
[こうなっているはず] https://jsfiddle.net/pocchi/rtec7eyh/5/
何をやっているのか
todos
の中身をtodo
の中に上から1つずつ移し替えている
TODOリストを作ってみましょう!
TODOリストのTODOリスト
- やることを入力する
- やることリストを見る
- やることが終わったら消す
TODOリストのTODOリスト
- やることを入力する
- やることリストを見る–>すでにできている!
- やることが終わったら消す [以後の参考・引用] http://notsleeeping.com/archives/131
やることを入力できるようにしよう
<div id="app"><!-- この下から追記 --> <input v-model="inputText" type="text" /> {{inputText}}<!-- この上まで追記 --> <ol> <li v-for="todo in todos"> {{todo.text}} </li> </ol> </div>
new Vue({ el: '#app', data: {/* この下から追記 */ inputText: null, todos: [/* この上まで追記 */ { text: 'JavaScriptを勉強する' }, { text: 'Vueを勉強する' }, { text: '何かすごいものを作る' } //以下省略
[こうなっているはず]https://jsfiddle.net/pocchi/3LnLuc4p/1/
フォームに入力すると値が取得できることは確認できた!
次は保存ボタンをつけたい!
<div id="app"> <input v-model="inputText" type="text" /> <input type="submit" value="保存" v-on:click="save"/> <ol> <li v-for="todo in todos"> {{todo.text}} </li> </ol> </div>
new Vue({ el: '#app', data: { /* --inputTextとtodosは中略-- */ },/* この下から追記 */ methods:{ save: function(){ this.todos.push({text: this.inputText}); } } })/* この上まで追記 */
[こうなっているはず]https://jsfiddle.net/pocchi/3LnLuc4p/6/
どうなっているのか
どうなっているのか
これで、保存ができる!
後は削除するにはどうしたらいいのか!
<div id="app"> <input v-model="inputText" type="text" /> <input type="submit" value="保存" v-on:click="save"/> <ol> <li v-for="todo in todos"> {{todo.text}}<!-- この下から変更! --> <input type="submit" value="削除" v-on:click="remove(todo.index)" /> </li><!-- この上まで変更! --> </ol> </div>
methods:{ save: function(){ this.todos.push({text: this.inputText}); },/* <-コンマをつけて、この下から追記 */ remove: function(index){ this.todos.splice(index, 1); } /* ここまで追記 */ }
[こうなっているはず]https://jsfiddle.net/pocchi/3LnLuc4p/10/
何が起こっている?
コンポーネント化してみましょう!
Sketchでいうシンボルに近い
<div id="app"> <!-- 中略 --> <ol> <list-component v-for="todo in todos" v-bind:key="todo" v-bind:text="todo.text" v-bind:text="todo.index" ></list-component> </ol> </div>
new Vue({の上に追加
Vue.component('list-component', { template: '<li>{{text}} <input type="submit" value="削除" v-on:click="remove(index)" /> </li>', props:['text','index'] });
[こうなっているはず]https://jsfiddle.net/pocchi/3LnLuc4p/12/
削除が動かない!
メソッドも渡してあげよう! [参考]https://jp.vuejs.org/v2/guide/components.html#カスタムイベントとの-v-on-の使用
<list-component v-for="todo in todos" v-bind:key="todo" v-bind:text="todo.text" v-bind:index="todo.index" v-on:remove="remove(todo.index)" ></list-component>
Vue.component('list-component', { template: `<li>{{text}} <input type="submit" value="削除" v-on:click="$emit('remove')"/></li>`, props:['text','index'] });
template: `` で囲まれていることに注意! [こうなっているはず]https://jsfiddle.net/pocchi/3LnLuc4p/15/