てっくな音楽、はじめました。

こんにちは！やぎちゃんです。

まずはじめに謝っておきます。
題名で音楽系の記事かと思って楽しみにしていた人、ごめんなさい！ :pensive: 
バリバリWebデザインの記事です。

この記事は[ Life is Tech ! Members Advent Calendar 2016 ](http://qiita.com/advent-calendar/2016/lit-members)19日目の記事です。

[Life is Tech! MUSIC](http://lit-kansai-members.github.io/music/) というキャンプのテーマソングをまとめたWebページを作った話です。
# 背景
さて、 Life is Tech! では一キャンプ毎に何曲かづつテーマソングが割り当てられています。

どの曲も非常にセンスがよく、何度聴いても飽きない曲ばかりです。

あれは忘れもしないいつだったか（忘れとるやないの！）（このネタわかる人いるかな……）。過去のキャンプのテーマソングを知りたくなった僕は、LiT!メンバーの間にプログラミングの神と名を馳せる[@KawakawaRitsuki（ごっちゃん！！）](http://qiita.com/kawakawaritsuki)に尋ねました。

彼は個人リポジトリにMarkdownで過去の曲をまとめていました。

その時は今の半分ほどの曲数しかなかったこのリポジトリも、僕達メンバーから、メンターさんまで[いろんな人](https://github.com/lit-kansai-members/music#contributors)に協力してもらって、だんだんデータが充実してきました。

しかし、曲数が増えてくると、GitHubとYouTube間の移動が面倒になってきます。

そこで、Perlの生みの親であるラリー・ウォール氏の提唱する「[プログラマの三大美徳](https://ja.m.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E#.E3.83.97.E3.83.AD.E3.82.B0.E3.83.A9.E3.83.9E.E3.81.AE.E4.B8.89.E5.A4.A7.E7.BE.8E.E5.BE.B3)」の一つ、「怠惰」に従いYouTubeの埋め込み用`iframe`を埋め込みます。

ところが、GitHubではYouTubeの埋め込みはセキュリティ上できません。

それならMarkdownからHTMLを生成して[GitHub Pages](https://pages.github.com/)で公開すればいいじゃんということになり、どうせならかっこ良くしようと思ったのです。

その後、データの保管形式をYAMLにしました。

こうして完成したページが、[Life is Tech! MUSIC](http://lit-kansai-members.github.io/music/)です。
# 本題
前置きが長かったですね……。それでは解説です。
## デザインを考える
何はさておきデザインです。

YouTubeの埋め込み動画を元にカード型デザインにしました。

「Life is Tech! のキャンプ」もテーマの一つであるため、背景画像は各キャンプの画像にしました。パララックス（視差効果）もつけてあります。画像がないキャンプはLife is Tech!のロゴにしています。

長いページなので年とキャンプごとにジャンプできるナビゲーションも設置しました。

ヘッダーはローディング画像をそのままロゴにするため100vw*100vhになりました。
## 構成
### 使う言語
- [YAML](https://ja.wikipedia.org/wiki/YAML) JSONの上位互換のようなもの。Rubyが大好き
- [Pug](https://pugjs.org/) HTMLのテンプレートエンジン。タグを書かなくていい。
- JavaScript ES6ゴリゴリ使っていきますよー！
- [scss](http://sass-lang.com/) (CSSのメタ言語) （リンクはsass。scssのHPやGitHubはどこに…？）

### ビルドツール
Gulpを使っています。

##  ページのビルド
Gulp自体は解説されている方がたくさんあり、[gulpfile](https://github.com/lit-kansai-members/music/blob/master/gulpfile.js)は分かりやすい（と思う）ので細かい解説はしませんが、最終的には以下のファイルを生成しています。

### index.html
[src/pug/index.pug](https://github.com/lit-kansai-members/music/tree/master/src/pug/index.pug)をコンパイルしたもの。
### css/style.css
[src/scss/](https://github.com/lit-kansai-members/music/tree/master/src/scss)*.scssをコンパイルして連結したもの

### js/script.js
[src/js/](https://github.com/lit-kansai-members/music/tree/master/src/js)*を"{}"で囲って（`var`はつかわないのでブロックスコープ）連結したもの

### img/
[res/img](https://github.com/lit-kansai-members/music/tree/master/res/img)をコピーしたもの
## ビルド -> ライブリロード
プロジェクトの性質上、何かソースファイルを変更したらGulpを実行しビルドし直してブラウザをリロードしなければいけません。

そんなの面倒くさいですよね。プログラマは怠惰でなくてはいけません。

そこで登場するのが救世主[gulp-watch](https://github.com/floatdrop/gulp-watch)と[Browsersync](https://browsersync.io/)です！

BrowsersyncはNode.jsでサーバーを立て、複数ブラウザでイベントを同期し、ライブリロードもしてくれるというすぐれものです。

そして、Browsersyncのリロードなどの操作はファイル監視を通してGulp内で行いたいのでgulp-watchを使用します。

これで、`gulp generate`で単純ビルド、`gulp generate:development`でビルド&ファイル監視&ライブリロードができました。


## その他
### ローディング
アニメーションはSVG+CSSアニメーションで実装しています。 [CodePen](http://codepen.io/ygkn/pen/NRraOO)
ローディングが終わったら`<body>`に`loaded`クラスをつけることでアニメーションさせています。

### YouTube埋め込みiframeの遅延ロード
クリックで`iframe`を`parentElement`に`appendChildしています。`
### スムーズスクロール
[jump.js](http://callmecavs.com/jump.js/)を使用しました。

### ナビゲーション
ロード時にナビゲーションの全てに開いた状態のCSS(`auto`はアニメーション効かないので)を生成しています。

### OGP設定
最初ページができたぁぁーと思ってFacebookでシェアしたらとても残念なことになったのでいい感じに設定しました。[コチラの記事](https://ferret-plus.com/610)が参考になります。

## ホスティング
さて、これでWebページができました。

それでは[GitHub Pages](https://pages.github.com/)を使って公開（ホスティング）します。

リポジトリのgh-pagesブランチをbuildディレクトリとしてcloneしてきてビルドしてcdしてgit pushします。**ページに変更があるたびに。**

面倒くさいですよね皆さん。プログラマは怠惰（以下略

これも自動化しちゃいましょう。今回は[Travis CI](https://travis-ci.org/)というコミットやプルリクエストごとに予め設定しておいたタスクを実行してくれるCI（継続的インテグレーション）サービスを使います。

拙作ですが、[コチラの記事](http://qiita.com/ygkn/items/d9300ad29de89458d2fa)にやり方を書いておきました。

現在はなにか変更して、masterブランチにpushしたら即座にタスクが回り、ページが変更されるようになってます。

## READMEのバッヂ
READMEにTravis CIのビルドが成功したかのバッヂと、依存パッケージのアップデートをチェックしてくれるサービス、[David.](https://david-dm.org)のバッヂを付けました。

このように見えると思います。

[![Build Status](https://travis-ci.org/lit-kansai-members/music.svg?branch=master)](https://travis-ci.org/lit-kansai-members/music) [![devDependencies Status](https://david-dm.org/lit-kansai-members/music/dev-status.svg)](https://david-dm.org/lit-kansai-members/music?type=dev)

カッコいいですね！

# おわりに
皆さんにお願いがあります。僕は今年のクリキャンにはいかないので、**テーマソングの情報提供を（できればPull Requestで）お願いいたします！**

もちろん来年以降もお願いいたします！

耳で聴いて曲名がわからなくても大丈夫！音声から音楽を検索できる[Shazam](https://www.shazam.com/ja)というアプリがあります。これがあれば「BGMの曲名が気になって開発に集中できない！」なんてこともなくなります。このアプリはかなり感度がいいのでちょっとくらい周りがはしゃいでても大丈夫！

また、Auto Shazamというオンにしといたら周りの音楽を勝手に検索してくれる機能もあるので安心してオープニングムービーに集中できますね！

最後に、この長い記事を最後まで読んでくださりありがとうございました。

明日の記事は[nami634](http://qiita.com/nami634)（なみ）さんの「Chromeの拡張機能を作った話」です！僕は拡張機能は作ったことないですけどいつかは作りたいと思っております。（某DJシステムのとか。）

それではよいクリスマスを! :christmas_tree: