tag:crieit.net,2005:https://crieit.net/users/ringo_deve/feed
りんご🍎@エンジニア/個人開発がんばりんごの投稿 - Crieit
Crieitでユーザーりんご🍎@エンジニア/個人開発がんばりんごによる最近の投稿
2020-07-16T20:34:21+09:00
https://crieit.net/users/ringo_deve/feed
tag:crieit.net,2005:PublicArticle/16008
2020-07-16T13:51:22+09:00
2020-07-16T20:34:21+09:00
https://crieit.net/posts/Gulp
Gulpの使い方をメンティさんに教えるその1
<p>(ここまでの流れあとでまとめときます)</p>
<h1 id="gulpfile.jsを作ってみよう"><a href="#gulpfile.js%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86">gulpfile.jsを作ってみよう</a></h1>
<p>今日のカリキュラムはこちら</p>
<ol>
<li>htmlをsrcフォルダからdistフォルダにコピーしよう!</li>
<li>pugをコンパイルしよう!</li>
<li>ホットリロードを導入しよう!</li>
</ol>
<p>3については余裕が残ってればという感じ。</p>
<h2 id="基本形"><a href="#%E5%9F%BA%E6%9C%AC%E5%BD%A2">基本形</a></h2>
<p>これが基本形</p>
<pre><code>const
gulp = require("gulp")
function pugCompile(){
return gulp
.src()
.pipe()
}
</code></pre>
<h2 id="完成形"><a href="#%E5%AE%8C%E6%88%90%E5%BD%A2">完成形</a></h2>
<p>完成形(関数部分だけ)</p>
<pre><code>function pugCompile(){
return gulp
.src([srcDir + "**/*.pug", "!" + srcDir + "**/_*.pug"], {
since: gulp.lastRun(pug)
})
.pipe(plumber({errorHandler: notify.onError("pugがエラーだよ!!\n<%= error.message %>")}))
.pipe(pug(pugOption))
.pipe(gulp.dest(dstDir))
.pipe(browser.reload({ stream: true}))
}
</code></pre>
<h2 id="gulpfile.jsの基礎説明"><a href="#gulpfile.js%E3%81%AE%E5%9F%BA%E7%A4%8E%E8%AA%AC%E6%98%8E">gulpfile.jsの基礎説明</a></h2>
<p>基本形について、何をしているかというと、</p>
<pre><code>const
gulp = require("gulp")
</code></pre>
<p>ここで宣言して、package.jsonでインストールしたgulpというライブラリを使用しますよー、使うときはgulpという名前で使いますよーとしています。</p>
<p>また、下を見ると</p>
<pre><code>function pugCompile(){
return gulp
.src()
.pipe()
}
</code></pre>
<p>となっています。<br />
関数名はなんでもいいです。そのままpugまで教える魂胆です。<br />
<code>return gulp</code> で、先ほど宣言した変数名を呼び出します。</p>
<p>また、その後の行は「.」でつながっているメソッドチェーンですね。<br />
<code>src()</code> でソースとなるファイルを指定しています。<br />
<code>.pipe()</code> はそのまんま。何かをパイプします。この中に、gulpのプラグインなんかを指定していきます。</p>
<p>ここで完成形を見ると<br />
1つの <code>src()</code> と4つの <code>pipe()</code> がつながってますね。</p>
<p>それぞれ、</p>
<ul>
<li>pipe1個め:エラーがあっても終了しない。エラーメッセージも吐く。</li>
<li>2個め:pugに変換</li>
<li>3個め:distフォルダに出力</li>
<li>4個目:ホットリロード</li>
</ul>
<p>という意味になります。</p>
<p>これがgulpfile.jsの基本的な説明です。</p>
<h2 id="1. htmlをsrcフォルダからdistフォルダにコピーしよう!"><a href="#1.+html%E3%82%92src%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8B%E3%82%89dist%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%82%88%E3%81%86%EF%BC%81">1. htmlをsrcフォルダからdistフォルダにコピーしよう!</a></h2>
<p>srcフォルダを作ります。<br />
その中にindex.htmlを作ります。</p>
<pre><code><html>
<head>
</head>
<body>
<p>テスト</p>
</body>
</html>
</code></pre>
<p>↑最低限これくらい入れておけば表示して出てる確認ができるのでこんなのを入れて保存しときます。</p>
<p>gulpfileのsrcメソッドにそのフォルダ、ファイルを指定します。</p>
<p>pipeメソッドの引数にdestを指定し、distに出力させます。</p>
<pre><code>function pugCompile(){
return gulp
.src("src/index.html")
.pipe(gulp.dest("dist/"))
}
gulp.task('pug', pugCompile)
</code></pre>
<p>最後にタスクも指定。</p>
<p>これでターミナルで<code>npx gulp pug</code>で動くはず。</p>
<h2 id="2.pugをコンパイルしよう!"><a href="#2.pug%E3%82%92%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%97%E3%82%88%E3%81%86%EF%BC%81">2.pugをコンパイルしよう!</a></h2>
<p>次にpugをコンパイルしていくよ。</p>
<p>前回までのコード↓</p>
<pre><code>const
gulp = require("gulp")
function pugCompile(){
return gulp
.src("src/index.html")
.pipe(gulp.dest("dist/"))
}
gulp.task('pug', pugCompile)
</code></pre>
<p><code>src</code>と<code>pipe(dest)</code>の間に<code>pipe(pug)</code>メソッドを入れていきます。</p>
<h3 id="pugメソッドのインストール"><a href="#pug%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">pugメソッドのインストール</a></h3>
<p><code>npm i -S gulp-pug</code> ←ターミナルでこれ。</p>
<p>package.jsonを見ると追加されてるのが確認できる。</p>
<h3 id="constで宣言する"><a href="#const%E3%81%A7%E5%AE%A3%E8%A8%80%E3%81%99%E3%82%8B">constで宣言する</a></h3>
<p>const でgulpの下にpugを追加</p>
<pre><code>const
gulp = require("gulp")
pug = require("gulp-pug") // これ追加
</code></pre>
<h3 id="宣言したpugを実行する(オプションもつける)"><a href="#%E5%AE%A3%E8%A8%80%E3%81%97%E3%81%9Fpug%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%EF%BC%88%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%82%E3%81%A4%E3%81%91%E3%82%8B%EF%BC%89">宣言したpugを実行する(オプションもつける)</a></h3>
<p>関数の中に、pipeを1個増やし、<br />
引数にpugを入力。<br />
オプションは2個<br />
1個がprettyこれは、falseにすると出力されたHTMLがミニファイされて出てくる。試してみて。</p>
<p>2つめはbasedir。これは入れておくと便利なやつ。includeとかしたときに便利。</p>
<p>あ、あとsrcで指定しているファイルを別のにしましょう。<br />
<code>pug-test.pug</code>という名前にして、指定も<code>.src("src/pug-test.pug")</code>に変更。</p>
<pre><code>function pugCompile(){
return gulp
.src("src/pug-test.pug")
.pipe(pug({
pretty: true,
basedir: "src/",
}))
.pipe(gulp.dest("dist/"))
}
</code></pre>
<p>pug-test.pugの中身は</p>
<pre><code>p テスト
</code></pre>
<p>で保存しておく。</p>
<h3 id="実行"><a href="#%E5%AE%9F%E8%A1%8C">実行</a></h3>
<p>以上の変更をあわせるとこう。</p>
<pre><code>const
gulp = require("gulp")
pug = require("gulp-pug")
function pugCompile(){
return gulp
.src("src/pug-test.pug")
.pipe(pug({
pretty: true,
basedir: "src/",
}))
.pipe(gulp.dest("dist/"))
}
gulp.task('pug', pugCompile)
</code></pre>
<p>その後、さっきと同様 <code>npx gulp pug</code>ってやると<br />
distフォルダの中に、pug-test.htmlというファイルができてますか?</p>
<p>中身は</p>
<pre><code><p>テスト</p>
</code></pre>
<p>こうなってたら成功。<br />
ファイル名の拡張子もpugからhtmlに変わってるのを確認。</p>
<h3 id="ソースファイルのワイルドカード化"><a href="#%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E5%8C%96">ソースファイルのワイルドカード化</a></h3>
<p>ソースファイルをこれまでは1個1個指定してきたのだけれど、<br />
ソースフォルダ<code>src/</code>の中にあるpugファイルはすべてサブディレクトリも含めて対象にするっていうことをします。</p>
<p><code>.src("src/pug-test.pug")</code><br />
これまで↑こうなってた箇所を<br />
<code>.src("src/**/*.pug")</code><br />
こうします。</p>
<p><code>/**/</code>の箇所はサブディレクトリも全部含むという意味。<br />
<code>*.pug</code>はpugという拡張子はすべてという意味。</p>
<p>これで、srcフォルダの中にあるpugファイルはすべて対象になりました。</p>
<h2 id="3. ホットリロードを導入しよう!(ついでにplumberも一緒に)"><a href="#3.+%E3%83%9B%E3%83%83%E3%83%88%E3%83%AA%E3%83%AD%E3%83%BC%E3%83%89%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%97%E3%82%88%E3%81%86%EF%BC%81%EF%BC%88%E3%81%A4%E3%81%84%E3%81%A7%E3%81%ABplumber%E3%82%82%E4%B8%80%E7%B7%92%E3%81%AB%EF%BC%89">3. ホットリロードを導入しよう!(ついでにplumberも一緒に)</a></h2>
<p>さて、今日は最後にホットリロードを導入していきます。</p>
<p>ホットリロードとは?<br />
ファイルを保存したら、変更がブラウザに反映される。っていうやつ。</p>
<p>やっていきましょう。</p>
<h3 id="プラグインのインストール"><a href="#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">プラグインのインストール</a></h3>
<p>ターミナルで<code>npm i -S browser-sync</code>を実行するとインストールされます。<br />
(例によってpackage.jsonが変わってると思います。)</p>
<p>ついでにここでエラー時にタスクが落ちない便利なやつplumberも入れておきましょう。<br />
<code>npm i -S gulp-plumber</code><br />
<code>npm i -S gulp-plumber gulp-notify</code></p>
<p>※ちなみにこうやって複数インストールするときは<br />
<code>npm i -S browser-sync gulp-plumber gulp-notify</code>ってつなげて書くこともできます。</p>
<h3 id="constで宣言"><a href="#const%E3%81%A7%E5%AE%A3%E8%A8%80">constで宣言</a></h3>
<p>さっきと同様、最初のconstに加える</p>
<pre><code>const
gulp = require("gulp")
pug = require("gulp-pug")
browser = require("browser-sync") // これ追加
plumber = require("gulp-plumber") // ついでにこれも追加
notify = require("gulp-notify") // あとこれも追加
</code></pre>
<h3 id="関数を一個追加する"><a href="#%E9%96%A2%E6%95%B0%E3%82%92%E4%B8%80%E5%80%8B%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B">関数を一個追加する</a></h3>
<p>constのあとにでも入れておいてください。</p>
<pre><code>function server(){
return browser
.init({
port: 3000,
server: {
baseDir: "dist/",
index: 'index.html',
},
reloadOnRestart: true,
})
}
</code></pre>
<p>portは3000とか8080が多いですね。<br />
あとの設定はレベル上がったらまたでよいかと。</p>
<h3 id="pugの設定に追加"><a href="#pug%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AB%E8%BF%BD%E5%8A%A0">pugの設定に追加</a></h3>
<p><code>.pipe(browser.reload({ stream: true}))</code> これをdestの次の行に追加。</p>
<pre><code>function pugCompile(){
return gulp
.src("src/**/*.pug")
.pipe(pug({
pretty: true,
basedir: "src/",
}))
.pipe(gulp.dest("dist/"))
.pipe(browser.reload({ stream: true})) //ココに追加
}
</code></pre>
<h3 id="ついでにplumber"><a href="#%E3%81%A4%E3%81%84%E3%81%A7%E3%81%ABplumber">ついでにplumber</a></h3>
<pre><code>function pugCompile(){
return gulp
.src("src/**/*.pug")
.pipe(plumber({ errorHandler: notify.onError("sassがエラーだぞ豚野郎!!\n<%= error.message %>") })) // plumberはココ追加
.pipe(pug({
pretty: true,
basedir: "src/",
}))
.pipe(gulp.dest("dist/"))
.pipe(browser.reload({ stream: true}))
}
</code></pre>
<p>コメントは自由にどうぞです。。</p>
<h3 id="watchとdefaultタスクを入れる"><a href="#watch%E3%81%A8default%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B">watchとdefaultタスクを入れる</a></h3>
<p>ここで2つのタスクを追加します。</p>
<ul>
<li>defaultタスクは、<code>npx gulp</code>で立ち上げたときに、同時に実行されるタスク。</li>
<li>watchタスクは、立ち上げたのちに監視対象のファイルが更新されたら、設定したタスクを実行するタスク。</li>
</ul>
<p>というわけで書き方。</p>
<p>これまで書いた<code>function pugCompile</code>のあとに、</p>
<pre><code>// watchタスク
function watchFiles(){
gulp.watch("src/**/*.pug").on('change', gulp.series(pugCompile))
}
// defaultタスク
gulp.task("default", gulp.series(
gulp.parallel(
pugCompile
),
gulp.parallel(server, watchFiles)
))
</code></pre>
<p>を入れます。</p>
<p>これは何かというと<br />
watchのほうは、例のワイルドカードをつけたpugファイルを監視していて、変更があればpugCompile関数を実行します。</p>
<p>defaultのほうは、最初にpugを動かすのと、ついでにホットリロードを動かしてます。</p>
<h3 id="まとめると"><a href="#%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E3%81%A8">まとめると</a></h3>
<p>そしてこれらのをまとめるとこうなりますかね。</p>
<pre><code>const
gulp = require("gulp")
pug = require("gulp-pug")
browser = require("browser-sync")
plumber = require("gulp-plumber")
notify = require("gulp-notify")
// ホットリロードの設定
function server(){
return browser
.init({
port: 3000,
server: {
baseDir: "dist/",
index: 'index.html',
},
reloadOnRestart: true,
})
}
// pugの設定
function pugCompile(){
return gulp
.src("src/**/*.pug")
.pipe(plumber({ errorHandler: notify.onError("sassがエラーだぞ豚野郎!!\n<%= error.message %>") }))
.pipe(pug({
pretty: true,
basedir: "src/",
}))
.pipe(gulp.dest("dist/"))
.pipe(browser.reload({ stream: true}))
}
// watchタスク
function watchFiles(){
gulp.watch("src/**/*.pug").on('change', gulp.series(pugCompile))
}
// defaultタスク
gulp.task("default", gulp.series(
gulp.parallel(
pugCompile
),
gulp.parallel(server, watchFiles)
))
gulp.task('pug', pugCompile)
</code></pre>
<h3 id="実行"><a href="#%E5%AE%9F%E8%A1%8C">実行</a></h3>
<p>実行コマンドは<br />
ターミナルで<br />
<code>npx gulp</code> でタスク名を指定しないでいきます。<br />
これでローカルサーバーが立ち上がるのと、defaultで設定したタスクが実行されます。</p>
<p>また、逆に今後たくさんタスクが作られたときに<code>npx gulp pug</code>とするとタスクを指定して実行することも可能です。</p>
<p>どうでしょうか。うまく動きましたか?<br />
これで今日の予定は終わりです。</p>
りんご🍎@エンジニア/個人開発がんばりんご
tag:crieit.net,2005:PublicArticle/15911
2020-05-25T01:34:59+09:00
2020-05-25T01:35:56+09:00
https://crieit.net/posts/a-is-like-b
とっさのスピーチ力とか説得力を培うことのできる、A is like Bゲームを作りました
<p>とっさに誰かを説得しなければならなくなったり、何かを伝えなくてはいけなくなるような状況って結構ありますよね。<br />
そんな力を培うことのできる練習ができるようなサービスを作りました!</p>
<p>お題をランダムに出題させ、それの回答を書いて、<br />
Twitterにシェアしてみてください!(140文字以内じゃないとツイートできないと思います!)</p>
<p>ゲームはこれです↓↓<br />
<a target="_blank" rel="nofollow noopener" href="https://a-is-like-b.netlify.app">A is like B ゲーム</a></p>
<p>初の #web1week チャレンジです! 完成できてよかった。</p>
<p><a href="https://crieit.now.sh/upload_images/cddcda62b0dd18f5b2d61216700383da5eca9fadc06e2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cddcda62b0dd18f5b2d61216700383da5eca9fadc06e2.png?mw=700" alt="image.png" /></a></p>
<h1 id="このゲームはなに?"><a href="#%E3%81%93%E3%81%AE%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%AB%EF%BC%9F">このゲームはなに?</a></h1>
<p>とっさの場面、上司やお客さんからの新しい話を聞いたとき、さっと主張しないといけない場面なのに、<br />
何を言えばいいのか思いつかなかったり、考えるのに時間がかかってしまったり。。。<br />
そんなことって、よくありますよね。</p>
<p>この「A is like B ゲーム」は、英語ディベートをやっていた学生の頃、私が先輩に教えてもらった方法です。<br />
「A is like B」、つまり「AはBに似ている」、もしくは「AはまるでBだ」、という主張を、とっさに考えて言葉にする練習ができます。<br />
よく大学への行き帰りの自転車をこぎながら、ぶつぶつとこの練習をしていたことを覚えています。</p>
<p>私が学生時代にやっていた英語ディベートは「パーラメンタリーディベート」といって、<br />
いわゆる長期間文献を調べて臨むディベートとは違い、その日、その場でお題が出題されます。<br />
20分ほどの準備時間で何を主張するのかを準備して臨むのです。</p>
<p>そのため、思考の瞬発力と、豊かな表現力が求められます。<br />
真面目に練習しなかった私はとても弱く全然勝てませんでしたが、練習は楽しかったです。</p>
<h1 id="意外と知られてない方法?"><a href="#%E6%84%8F%E5%A4%96%E3%81%A8%E7%9F%A5%E3%82%89%E3%82%8C%E3%81%A6%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95%EF%BC%9F">意外と知られてない方法?</a></h1>
<p>ネットで検索してみると、「A is like B」というワードはおそらくなさそうでしたので、<br />
もしかすると、くだんの先輩が作った練習方法なのかもしれませんが、<br />
この練習は非常に基礎練習として有効だなぁと思っていました。</p>
<h1 id="開発について"><a href="#%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">開発について</a></h1>
<p>今回、 #web1week のお題が「like」ということもあり、<br />
天の邪鬼ワタクシ、シンプルにいいねやスキの意味のlikeではなく、<br />
「~のようだ」「まるで~だ」という前置詞のlikeを採用してみました。</p>
<p>今回は使い慣れたNuxtを利用し、またNetlifyにホスティングしてます。<br />
本当はデータベースと連動させていろいろやりたかったのですが<br />
Firebaseの設定がどうにもうまくできなかったので、こちらも使い慣れているNetlifyにしちゃいました。</p>
<p>今後、まだまだ直したい改修予定としては、<br />
ログインできたり、記録できたり、また時間制限などを追加したいと思っています。</p>
<p>まずはTwitterに投稿できるシステムだけつけてみました。<br />
楽しみながらスピーチの練習や、説得力の向上をしていただけたらと思います。<br />
ありがとうございました。</p>
<p>りんご</p>
<p><a target="_blank" rel="nofollow noopener" href="https://a-is-like-b.netlify.app">A is like B ゲーム</a></p>
りんご🍎@エンジニア/個人開発がんばりんご