- 投稿日:2020-02-28T23:06:02+09:00
nuxtでDOMException: Failed to execute 'appendChild' on 'Node'エラー
- 投稿日:2020-02-28T14:56:35+09:00
Vue.jsを使って簡単な計算ツールを作った
はじめに
グランブルファンタジーというゲーム内のイベントである古戦場にて、目的の貢献度を貯めるためにはどれくらいのトリガーが必要か?を計算するツールを作りました。
作り自体は簡単なため、初めてVue.jsを勉強&アウトプットするにはいい題材でした。実際に動かしたもの
http://ayama.main.jp/battlefieldRun.htmlコード
https://github.com/guranytou/battlefieldRuns一番困った部分
battlefieldRun.html<fieldset class="inputFieldset"> <div id="app"> <div> <span>目標累計貢献度</span> <input type="text" v-model="input" id="contributionInput"></input> </div> <div id="trigerDigest"> <div><span>肉の消化方法</span></div> <div> <input type="radio" class="hellRadio" name="hellRadio" id="hell95" value="Hell95" v-model="trigerDigest"/> <label class="hellRadioLabel" for="hell95">95HELL</label> <input type="radio" class="hellRadio" name="hellRadio" id="hell100" value="Hell100" v-model="trigerDigest"/> <label class="hellRadioLabel" for="hell100">100HELL</label> <input type="radio" class="hellRadio" name="hellRadio" id="hell150" value="Hell150" v-model="trigerDigest"/> <label class="hellRadioLabel" for="hell150">150HELL</label> <input type="radio" class="hellRadio" name="hellRadio" id="both" value="both" v-model="trigerDigest"/> <label class="hellRadioLabel" for="both">95&100HELL</label> </div> <div> <span>必要なトリガー数:</span><span>{{ output }}</span> </div> </div> </fieldset>battlefieldRun.js(function () { var triger = new Vue({ el: '#app', data: { input: 0, trigerDigest: 'false' }, computed: { output: function(){ const Hell95NeedTriger = 10; const Hell100NeedTriger = 20; const Hell150NeedTriger = 20; const ExTriger = 4; const Hell95Contribution = 51500 * (Hell95NeedTriger / ExTriger) + 910000; const Hell100Contribution = 51500 * (Hell100NeedTriger / ExTriger) + 2680000; const Hell150Contribution = 51500 * (Hell150NeedTriger / ExTriger) + 3600000; let ans = 0; const ThisInput = String(this.input); const InputContribution = removeComma(ThisInput); function removeComma(value) { var num = value.replace(/,/g, ""); return parseInt(num); } if(this.trigerDigest === 'Hell95'){ // 計算式 ans = Math.floor(InputContribution / Hell95Contribution * Hell95NeedTriger); return ans.toLocaleString() }else if(this.trigerDigest === 'Hell100'){ // 計算式 ans = Math.floor(InputContribution / Hell100Contribution * Hell100NeedTriger); return ans.toLocaleString() }else if(this.trigerDigest === 'Hell150'){ ans = Math.floor(InputContribution / Hell150Contribution * Hell150NeedTriger); return ans.toLocaleString() }else if(this.trigerDigest === 'both'){ // 計算式 ans = Math.floor((InputContribution / 2 / Hell95Contribution * Hell95NeedTriger) + (InputContribution / 2 / Hell100Contribution * Hell100NeedTriger)); return ans.toLocaleString() }else{ return 0; } } } }) }());振り返り
・カンマをinput/outputにいれるのに地味に困った
→ここは本題ではなかったので、今回はinputに外部のJQueryを利用、outputにはtoLocaleString()を利用した
・computedとmethodsのどちらを利用すればいいのか分からなくて困った
→入れたらすぐに発火するものが作りたかったのでcomputedを採用。またcomputedとmethodsの違いの勉強が出来てよかった
・必要な部分だけさらっと勉強して書き始めたので、まだまだVue.jsへの理解が足りないように感じた
→座学もちゃんと増やす。簡単な題材のアウトプット(FizzBuzz、ToDoリスト作成etc)をする。・疑問点:Computed内でif文の分岐をしている例文が見当たらなかったが、他の書き方があったりするのだろうか
- 投稿日:2020-02-28T10:37:22+09:00
HTML CSS フレックスボックスレイアウト(display: flex;)を使って header, footer を作ってみる(最小?)サンプルコード
HTML CSS フレックスボックスレウアウト(display: flex;)を使って header, footer を作ってみる(最小?)サンプルコード
みなさまこんにちは、ハーツテクノロジーの山崎です。
HTML でヘッダー(header)を作るのは難しくないのですが、フッター(footer)を作るのって意外にも難しくて、ハマりポイントもあったり、いろんな方法を紹介してくれるページもたくさんあります。でも、最近のブラウザでは CSS のフレックスボックス flex (注意:flexboxではない)がサポートされていて「いまとなってはこの方法がベストじゃん」と思うものの、ググってみても情報が多すぎて、最小構成のサンプルがみつからず、、、「ならばわしがっっ!」といった気持ちで到達記念魚拓を残すのです。
まぁ、たいした情報じゃないけど、忘れちゃうので(忘れたいので)備忘録です。
リサイズしたときのスクロールバーに注目!
表示画面を小さくリサイズしていくと、まずコンテンツ部分にスクロールバーが出て、隠れ始めます。「ヘッダ」「フッタ」が表示され続けています(ここがポイント)。さらに小さくリサイズしていくと、全体にスクロールバーが表示されます。
コードの解説
解説するほど情報は無いのですが、ポイントを挙げると、メインになるのは以下の4つ。逆に言えば、たったこれだけ。
・display: flex; /* flex を指定 */; ・flex-direction: column; /* 縦方向に並べ */; ・flex-grow: 1; /* この div をがんばって広げる指定 */; ・overflow: auto; /* コンテンツが増えても、フッタが隠れないようにスクロールを指定 */;あとは、罠が2つほどあるので、
・html tag も body tag も縦サイズ height が最小になるようにデフォルトで設定されている ・body tag にはご丁寧に margin がデフォルトで設定されているこれを回避する指定をすれば目標に到達できます。
CSS の詳細を知りたいひとはこちらflexへどうぞ。
全コード
<!DOCTYPE html> <!-- HTML CSS display: flex; を使って header-footer を作ってみるテスト --> <meta charset="UTF-8"> <html style="height: 100%; /* まず html タグを広げる必要がある、ってなかなか気が付かない */;"> <body style=" margin: 0; /* body のデフォルト margin が 0 以外になっているのも罠だよなぁ、、、 */; height: 100%; display: flex; /* flex を指定して */; flex-direction: column; /* 縦方向に並べます */; "> <div style='background-color: hsla(29, 52%, 72%, 0.5);'>ヘッダ<br>ヘッダ</div> <div style='background-color: hsla(106, 23%, 63%, 0.5);'>コンテンツ1タイトル</div> <div style=' flex-grow: 1; /* この div をがんばって広げる指定 */; overflow: auto; /* コンテンツが増えても、フッタが隠れないようにスクロールを指定 */; background-color: hsla(106, 23%, 63%, 0.7); '> コンテンツ1<br> コンテンツ1<br> コンテンツ1<br> コンテンツ1<br> </div> <div style='background-color: hsla(202, 32%, 60%, 0.5);'>フッタ<br>フッタ</div> </body> </html>動作を確認したブラウザ
2020-02-28の時点で動作確認したブラウザは以下です。Windowsのみ。MacOS は機会があったら追加します。
Google Chrome 80.0.3987.122
Firefox 73.0.1
Microsoft Edge 44.17763.8831.0
IE 11.1039.17763.0
みなさまのプログラミングライフの一助になれば幸いです。
- 投稿日:2020-02-28T07:17:57+09:00
ネストしたindexにYoutube動画埋め込み
ネストしたindexへの動画埋め込み備忘録
https://qiita.com/Kairi_Yasunnde/items/8e931a4670549ba8237e
上記の記事を参考にしたが、自分はgroupテーブルにYoutube_urlを入れてcreateに定義し、groupでネストしたmessages/indexに埋め込もうとして、コントローラーの差異があり出来なかったと推測する。routes.rbresources :groups, only: [:new, :create, :edit, :update, :show, :destroy] do resources :messages, only: [:index, :create, :destroy] endなのでYoutube_urlを生値のまま取り出し、ビュー上で末尾11桁をとり出すようにした。
※Youtubeは末尾11桁の文字、数字が各動画に割り当てられている。手順
まずは、groupにYoutube_urlのカラムを追加する。
ターミナル上で、groupテーブルにyoutube_urlをstring型でカラムを追加。↓rails g migration AddYoutube_urlToGroups youtube_url:string追加後、rails db:migrateで実行
次に、コントローラーでYoutube_urlの値をpermitで許可する↓
groups_controller.rbprivate def group_params params.require(:group).permit(:name, :image, :content, :youtube_url, user_ids: []) endcreateまたはupdateアクションでurlをテーブルに入れたいのでフォームを作る↓
※_formはnewとeditアクションの部分テンプレートgroups/_form.html.erb<%= f.text_field :youtube_url, class: "form-control", placeholder: "Youtube_url" %>そして、ビュー上で末尾11桁の値をlastメソッドで取り出し、Youtube動画埋め込みのテンプレートにはめこむ↓
<%=(@groups.youtube_url).last(11)%>の部分messages/index.html.erb<iframe width="560" height="315" src="https://www.youtube.com/embed/<%=(@groups.youtube_url).last(11)%>" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>以上で埋め込み完了
createまたはupdateアクションで入力したurlの動画が埋め込まれる
- 投稿日:2020-02-28T05:08:52+09:00
初心者によるプログラミング学習ログ 251日目
100日チャレンジの251日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
251日目は、
おはようございます
— ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) February 27, 2020
251日目
・webサイト模写#早起きチャレンジ#駆け出しエンジニアと繋がりたい#100DaysOfCode
- 投稿日:2020-02-28T03:16:34+09:00
HTMLテンプレートエンジン詰め合わせ 11ty/eleventy を使ってみる
はじめに
本記事では11ty/eleventyの紹介と簡単なサンプル作成に留め、SCSSファイルなどの環境構築については別記事を執筆予定です。
テンプレートエンジンとしてNunjucksを使用しますので、Nunjucksの記法について知見のある方でしたらスムーズに読み進めることができるかと思います。「Nunjucks?なにそれおいしいの?」という方は以下をご参照ください。
EJSと比較すると独自記法も多いですが、個人的にはかなり使いやすいテンプレートエンジンだと思っています。Nunjucks 公式ドキュメント
詳解 Nunjucks − Mozilla 謹製テンプレートエンジン11ty/eleventyとは?
11ty/eleventy(以下11ty)はZach Leatherman氏により制作された静的サイトジェネレーターです。
Gatsby.jsやNuxt.jsなど、JSフレームワークを静的サイトジェネレータとして使用するのとは異なり、HTMLのテンプレートエンジンをベースとして静的サイトを構築することができます。
11tyでの静的ページ生成にはPugやEJS, Nunjucksなどのテンプレートエンジンからマークダウンまで幅広く対応しており、下記テンプレートエンジンを使用されたことのある方はかなり導入しやすいのではないかと思います。本記事ではNunjucksとマークダウンファイルをベースに、HTMLファイルを作成していきます。
Support Language
- HTML(.html)
- Liquid(.liquid)
- EJS(.ejs)
- Markdown(.md)
- Handlebars(.hbs)
- Mustache(.mustache)
- Haml(.haml)
- Pug(.pug)
- Nunjucks(.njk)
- JavaScript(.11ty.js)
以下サイトで他の静的サイトジェネレータとの比較を見ることができます。
StaticGen11tyにはCSSやJSファイル周りのコンパイル/トランスパイルは含まれていないため、この点に関しては自身で環境構築する必要があります。
裏を返せば、スタイルシートやスクリプトの環境が制限されていないので、何を使用するかはプロジェクトや各々の好みによって自由に変更することができるということでもあります。11tyの環境構築
11ty 公式スタートガイドを辿りながら、ミニマムな11tyプロジェクトの作成から進めていきます。
まずはnpmを使用して
@11ty/eleventy
パッケージをインストールします。
このとき、node.jsのバージョンは8以上である必要があるので注意してください。Eleventy is available on npm and requires version 8 of Node.js or higher.
作成するサンプルページは11ty 公式スタートガイドに則って、適当な場所に空の
eleventy-sample
ディレクトリを用意して進めていきます。
$ mkdir eleventy-sample
$ cd eleventy-sample
次にpackage.jsonの生成と、11tyパッケージのローカルインストールを行います。
$ npm init -y
$ npm install --save-dev @11ty/eleventy
初期状態では 11ty のコンパイルタスクがないので、package.json の scripts に
"serve": "eleventy --serve"
を追加しておきます。
- コンパイルタスク追加後のpackage.json
{ "name": "200225_eleventy_sample", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "serve": "eleventy --serve" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@11ty/eleventy": "^0.10.0" } }(2020/2/25日現在、eleventyのバージョン0.10.0がインストールされます。)
これで 11ty の使用準備が整いました。
サンプルページの出力
eleventy_sample
ディレクトリ以下にindex.njk
とREADME.md
の二つファイルを追加します。
11ty 公式スタートガイドのサンプルが寂しかったので若干追加しています。
- index.njk
<!doctype html> <html> <head> <title>Page title</title> </head> <body> <p>Hi</p> </body> </html>
- README.md
# Page header ## Heading Text Sample前章で package.json に追加した
$ npm run serve
を実行すると、HTMLの出力 + ファイル監視タスク が走るようになっています。
デフォルトの設定では
_site
ディレクトリとコンパイル後の HTMLファイル が追加され、ローカルサーバーが立ち上がります。
また、index.html
とREADME/index.html
が_site/
に作成されていることが確認できるかと思います。
入出力のディレクトリ名は設定ファイルに記述することで変更が可能ですが、こちらは別記事で。11ty 公式スタートガイドベースのサンプル作成は以上です。
が、11tyでは各ファイルにYAML形式の front-matter という記法で変数やテンプレートファイルを設定することができます。
本記事では front-matter を使用した変数のセットとテンプレート継承まで紹介します。front-matterの使用
front-matter は以下のように
—-
で区切ってYAML形式で記述します。--- pageTitle: Hello 11ty txt: <p>Hi</p> ---変数のセット
front-matter の記述は変数として使用することが可能です。
Nunjucksであれば、マスタッシュ構文で変数を出力することができます。--- pageTitle: Hello 11ty txt: <p>Hi</p> --- <!doctype html> <html> <head> <title>{{ pageTitle }}</title> </head> <body> {{ txt | safe }} </body> </html>
{{ pageTitle }}
には front-matter に記述したHello 11ty
が表示されます。
また、body内の{{ txt | safe }}
には、txt変数として定義されている<p>Hi</p>
が safeフィルターによってHTMLタグごと出力されます。11tyのテンプレート継承を利用する
front-matter による設定で、拡張子の異なるファイルをテンプレートとして使用することができます。
テンプレートとして以下のような
layout.njk
ファイルを作成します。
テンプレートファイルは_include
ディレクトリ以下に配置する必要があります。
- layout.njk
<!doctype html> <html> <head> <title>Page title</title> </head> <body> {{ content | safe }} </body> </html>マークダウンファイルから生成されるHTMLタグは自動エスケープしてほしくないため、Nunjucksの内蔵フィルターである
safe
をつけておきます。
テンプレートとして上記のファイルを使用したい場合、front-matterにYAML形式で読み込むテンプレートファイルを記述します。
- README.md
--- layout: layout.njk --- # Page header ## Heading Text Sampleコンパイルしてみると、
layout.njk
をベースとしてREADME/index.html
が変更されているはずです。EJSでもテンプレート継承してみる
本来であればextendsはサポートされていないEJSですが、11tyではNunjucksと同様テンプレートとしての利用が可能です。
- layout.ejs
<!doctype html> <html> <head> <title>EJS Template Sample</title> </head> <body> <%- content %> </body> </html>
- README.md
--- layout: layout.ejs --- # Page header ## Heading Text Sample
<%- content %>
内にREADME.md
が配置される形のHTMLファイルが出力されます。個人的な感想
HTML周りに関してはできることが多く、JSがあまり得意でない身としてはかなり使いやすい静的サイトジェネレーターだと感じました。
他にもJSONファイルを使用したデータの分離や、データからのページ構築など、中~大規模の静的サイトを構築する上ではかなり強力な機能があります。CSS, JS周りの環境を整えることができれば、個人的にはどんどん使っていきたいところです。少しずつ紹介していければと思います。