# アーカイブ | yamanoku.net > このページはyamanokuこと大山奥人が書いてきた過去の記事やログを収集したページです。 --- ## 2025年オープンソースコントリビュート活動振り返り https://archives.yamanoku.net/2025-oss-contribute-activity/ 2025年もまもなく終わりですね。みなさんは今年どれくらいオープンソースにコントリビュートできたでしょうか?(唐突) というわけで私の2025年のOSSコントリビュート活動の振り返りをしてみようと思います。2025年以前の活動は[Notion](https://www.notion.so/yamanoku/170f2fefa69c80959582f75f6e5b4b3f)にてまとめております。 ## fedify-dev/hollo Holloは、[Fedify](https://github.com/fedify-dev/fedify)で構築された単一ユーザー向けのフェディバース(ActivityPub対応)マイクロブログソフトウェア。Mastodon互換APIを実装しており、専用のWebインターフェースなしでMastodonクライアントから利用可能。 https://github.com/fedify-dev/hollo/pull/100 HTMLの `
`/`
` 要素の不適切な使用を修正。画像のaltテキストにfigcaptionを使うのは不適切であるため削除。 https://github.com/fedify-dev/hollo/pull/105 ページネーションのパラメータ名を `cont` から `page` に変更し、前のページに戻るリンク(Newer link)を追加。存在しないページ番号にアクセスした際の404エラー処理も実装。 https://github.com/fedify-dev/hollo/pull/106 アカウントのフィールド情報テーブルのレスポンシブ対応修正。画面縮小時に横スクロールが発生する問題を[Pico CSS](https://picocss.com/)の `overflow-auto` クラスで解決。 https://github.com/fedify-dev/hollo/pull/110 [#100](https://github.com/fedify-dev/hollo/pull/100)で画像のALTテキストを `
` 要素で展開表示できる機能を追加。 ## stackblitz/alien-signals 最軽量のSignalライブラリ。Push-Pullベースのリアクティブシステムを探求するプロジェクトで、Vue 3.4のリアクティブシステムの約400%のパフォーマンスを実現。Vue 3.6でも採用されている。 https://github.com/stackblitz/alien-signals/pull/53 READMEのEffect Scopeサンプルコードを修正。未定義の `effect` 関数の修正と `count(2)` の宣言位置を適切に変更。 ## elk-zone/elk Mastodon向けのWebクライアント。Vue.js/Nuxtで構築されたモダンなフェディバースクライアント。 https://github.com/elk-zone/elk/pull/3254 モーダルダイアログの位置を画面中央から上部に変更。OSのオンスクリーンキーボードが表示された際にダイアログが隠れる問題を解決するため、`items-center` から `items-start` に変更。 ## web-platform-dx/web-features Web Platform DXプロジェクトによる、Webプラットフォームの機能とそのBaselineステータスを管理するリポジトリ。 https://github.com/web-platform-dx/web-features/pull/2877 自作の[Baseline MCP Server](https://github.com/yamanoku/baseline-mcp-server)[^1]をBaseline in the wild(Baselineを活用しているプロジェクト一覧)に追加。 https://github.com/punkpeye/awesome-mcp-servers/pull/653 関連してMCPサーバーのキュレーションリスト(Awesome List)の[awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)にも[Baseline MCP Server](https://github.com/yamanoku/baseline-mcp-server)を追加。 [^1]: MCPサーバーの詳細は[Baseline MCP Serverを公開しました!](https://zenn.dev/yamanoku/articles/baseline-mcp-server)を参照。 ## chibivue-land/japanese-companies-using-vuejs 日本でVue.jsを使用している企業の一覧リポジトリ。Vue.jsコミュニティの可視化と企業間の情報共有を目的としている。 https://github.com/chibivue-land/japanese-companies-using-vuejs/pull/5 yamanokuの所属企業である[株式会社Schoo](https://corp.schoo.jp/)を企業一覧に追加。 ## chibivue-land/chibivue [ubugeeei](https://github.com/ubugeeei)さん作のVue.jsを自作で実装しながら学ぶ教育コンテンツ。Vue.jsの内部実装を理解するためのハンズオンチュートリアル。 https://github.com/chibivue-land/chibivue/pull/605 [vitepress-plugin-llms](https://github.com/okineadev/vitepress-plugin-llms)を使用してllms.txtとllms-full.txtを生成する機能を追加。NotebookLMなどのツールでドキュメントを理解・活用できるように。 https://github.com/chibivue-land/chibivue/pull/606 NotebookLMで生成した[音声ファイル](https://book.chibivue.land/notebooklm-audio.wav)(ポッドキャスト形式)を追加。 ## wattanx/button.dev [wattanx](https://github.com/wattanx)さん作のボタン要素に関する開発者向けツール/デモサイト。Nuxt製。 https://github.com/wattanx/button.dev/pull/1 SelectFieldコンポーネントと ` ``` しかしセマンティクスな表現をしてあげるとこれだけで済みます。 正しい HTML を選択することで実装コストも減り、利用するユーザに最低限の正しい機能を提供できるということにも繋がります。 つまりこれは **いらない考慮をする** 機会を減らしてくれるので、積極的に正しい HTML を書いていくべきです。 ## 実装時に参考にしているもの 私が UI を実装しているときに参考にしているものを紹介します。 ### [HTML Living Standard](https://html.spec.whatwg.org/) HTML の仕様書。内包できるものや使い方といったことを見返す時に役に立っています。 ### [Web Accessibility Tutorials](https://www.w3.org/WAI/tutorials/) アクセシビリティを考慮したコンポーネント作成例。あらゆる人が使えるように考える点で参考になります。 ### [ソシオメディア | ヒューマンインターフェース ガイドライン](https://www.sociomedia.co.jp/category/shig) ソシオメディアが公開しているヒューマンインタフェースデザインでの指針。GOOD や BAD といった例も載っているのでそうしたプラクティスに則っているかを確認できます。 ## UI というものに向き合ってみて学べたこと 「この UI は一体何をするものなのか」ということを自分なりに考えてみた結果、結論としてちゃんと納得させるような習慣がつけられるようになってきました。 たとえばコンテンツを内包するもの( container, wrapper )の最大幅を考える時、皆さんはどういう基準や判断でその数値を決めていますでしょうか。 サイトやアプリの設計によるものなので絶対の正解はありませんが、[私のサイト](https://yamanoku.net/)では最大文字数のために考えるようにしています。そのため最大幅の数値は `ch` で設定しています。 > ### 最大幅について > > メインコンテンツの最大幅は 80ch に設定しています。ch はチェーンと呼ばれ、文字のサイズによって可変する単位です。 > > この設定にすることのメリットとして、長文が読めない読字障害の利用者のサポートができたり、文字サイズが大きくなるに従ってテキストの一部が欠けて読めなくなるような事態も発生しにくくなります。 > https://github.com/yamanoku/yamanoku.github.io/blob/dev/EXPLAINING_PORTFOLIO_SITE_ja.md#%E6%9C%80%E5%A4%A7%E5%B9%85%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6 このように Web 上で表現されているものの意味を突き詰めて考えてみると、それが1つのフレームワークとしてどこかで流用することもでき、迷いない意思決定がしやすくなると思っています。 ## おわりに ブラウザを通じてユーザーに良い体験を提供していけるようにするために、考慮していくことや考えていくことはどんどん増えてきていくかもしれません。そうした中で常に正しいものを提供していくというのは大変なことです。 私が今回記事として書いたものも間違った考慮となっている場合があるかもしれません。そうなったとき、間違っている部分があったとしたらすぐに気づいて直していけるようにしていく体制も必要だと感じます。 そして、みんなで良い UI とは何か?というものを考えながら作っていけるといいなと願っています。 --- ## クラウドワークスのフロントエンド活動を振り返る 2020 https://archives.yamanoku.net/looking-back-at-crowdworks-front-end-activities-2020/ ![CrowdWorks Front-End 2020 CrowdWorks Engineer Blog 2020 Adevent Calender](https://i.gyazo.com/d35f084a03bf66780ebba0727f65e458.png) この記事はクラウドワークスアドベントカレンダー1日目の記事です。 クラウドワークスでフロントエンドの可能性を模索し続けている [@yamanoku](https://twitter.com/yamanoku) です。 アドベントカレンダーを今年もやっていきます。初日の盛り上げ手としてよろしくおねがいします。 ## フロントエンド活動の振り返りをしてみよう クラウドワークスでは現在、フロントエンド専属のエンジニアチームというものは存在しません。 その代わりにサーバーサイド(Ruby on Rails)も併せてフロントエンド開発するのが基本体制となっています。 各チームごとでのフロントエンド開発の悩みやノウハウといったものは存在するのですが、それらを全体を通してうまく共有・把握できてないような気がしていました。 そこで今後の開発で各チームの「次」に活かすための参考として、併せて今年はどういったことを行っているのかを外部にも知ってもらうために、この記事では 2020 年のフロントエンド活動を振り返ってみました。 ## 全体総括編 ### frontend チャンネルでの相談・議論 弊社の Slack には #frontend というフロントエンド開発に関連する共有チャンネルがあります。 フロントエンドに関する最新情報の共有や社内開発にまつわる雑談のほか、フロントエンド開発の相談をする Slack ワークフローが作成されました。 ![Slack ショートカットを開いたスクリーンショット。「frontendに関する質問はこちらから」のワークフロー選択肢がある](https://i.gyazo.com/d29db28e9a06a872b6354d20c413b1bc.png) 今までの相談内容として以下のものがありました。 - SVG ファイルを Vue.js コンポーネントで扱うときのベストプラクティス - CSS 実装に関する相談 - Vue.js のページネーションライブラリでおすすめのもの - stylelint と prettier のルールが競合している問題 相談を受けたものはスレッドベースで議論され、各チームに持ち帰ってもらっています。 ### webpacker でのコンパイル・ビルド高速化対応 クラウドワークスのフロントエンド開発におけるモジュールバンドラでは、レガシーなものは Sprockets、モダンなものは webpacker にて行っております。 日頃の悩みとして webpacker によるコンパイル・ビルドの遅い問題がありました。 そんな中 [@t0yohei](https://twitter.com/t0yohei) が [hard-source-webpack-plugin](https://github.com/mzgoddard/hard-source-webpack-plugin) の導入と [splitChunks](https://github.com/rails/webpacker/blob/master/docs/webpack.md#add-splitchunks-webpack-v4) の追加設定をしてくれました。 `hard-source-webpack-plugin` は実験的なものとしてでオプション的に使うことで webpacker の立ち上げ速度を改善され、 `splitChunks` については以下の効果が出ました。 - 本番環境を含む各環境で、JavaScript の取得が早くなり画面の表示完了速度が早くなる。 - 開発時の `webpack-dev-server` によるホットリロード時などのビルドが、多くの場合早くなる。 これにより以前よりも精神的負担を軽減したフロントエンド開発ができるようになりました。圧倒的感謝。 ### モダンな JavaScript 開発ができる取り組み 新機能開発においては積極的にモダンな JavaScripit 開発を取り入れていますが、まだまだレガシーなフロントエンド環境のまま負債となっている箇所があります。 ![Sprockets層のCoffeeScriptとWebpacker層のTypeScript、その上部にjQuery層とVue.jsの層があるイメージ図](https://i.gyazo.com/05543c7838d372593f190742915990b5.png) このままその基盤に乗ったままだと後続の開発者に負担を強いることになってしまいかねないため、TypeScript や Vue.js での開発も推進しています。 [イニシエのコードをモダン JS 化 - クラウドワークス エンジニアブログ](https://engineer.crowdworks.jp/entry/2020/06/18/181146) こうすることで後続のエンジニアたちの参入障壁を減らしモダンな開発を行えるようになるので、地道ではありますが、非常に大切な活動になっています。 ### フロントエンド開発でのチーム越境レビュー 他チームからフロントエンドレビューを依頼してもらうこともありました。今までチームを超えた相談というものは受けてこなかったため、とても新鮮でした。 主にアクセシビリティ観点でどのような懸念点があるかなどの相談を受け、以下のようなレビューを実施しました。 - 画面を切り替える際のフォーカス位置制御 - WAI-ARIA を使用した制御 - マークアップ(情報設計)の見直し ![Pull Requestでのレビュー対応スクリーンショット。aをbuttonに変更する、ボタン開閉に関するaria属性の解説。](https://i.gyazo.com/78993d8877be69166823e4fd98f51bf6.png) ### Atomic デザインを参考にしたコンポーネント設計 [【Vue.js】負債を返却しながら機能追加しなければならない状況で実践したフロントエンドのコンポーネント設計 - クラウドワークス エンジニアブログ](https://engineer.crowdworks.jp/entry/2020/08/26/170745) 新卒入社して今年で社会人 2 年目を迎えた [@d4te_kun](https://twitter.com/d4te_kun) による Atomic デザインの考え方を参考にしたコンポーネント設計に関する記事。フロントエンドにまつわる記事の中で反響が大きかったものです。 - 粒度の認識合わせができる/しやすい - スピードを優先して実装が複雑化しても後で簡単に作り直せる 上記2点を実現するための取り組みや、状態管理におけるレイヤー層の考え方について非常に参考になりました。 ### コンポーネント集での認識合わせ 業務委託として長年参加されているフロントエンドエンジニアの方が、とあるページのリニューアルに際してコンポーネントとスタイル定義をしたページを作成してくれました。 [![ボタンコンポーネントのガイド](https://i.gyazo.com/9cb40ace4fa8b7e7384858eb3824335d.png)](https://gyazo.com/9cb40ace4fa8b7e7384858eb3824335d) ![カラムのガイド](https://i.gyazo.com/ce49ae964e0606d596ec8fc3fcf65680.png) ![ユーティリティクラスのガイド](https://i.gyazo.com/13124071b0419e8e2158fa035067f963.png) コンポーネントの各状態やブレークポイントがどの範囲まであるか、Utility なクラスがエンジニア以外でも簡易的に確認できるようになりました。 ### Web アクセシビリティチェックをしてみた アクセシビリティ向上の一環として、クラウドワークスの Web アクセシビリティチェックも行いました。 [クラウドワークスの Web アクセシビリティチェックを始めてみた - クラウドワークス エンジニアブログ](https://engineer.crowdworks.jp/entry/product_accessibility_check) TOP ページ、ログインページ、会員登録ページの 3 ページに絞ってみて、なんとなく分かっていたところや、気づけなかったアクセシビリティにまつわる問題点を確認できました。 その時にチェックした内容は GitHub Project で管理するようにしています。 ![Accessibilityという名前のGitHub Projectのスクリーンショット。各ページでカラム分けされており、その中で問題点をカードで分類している](https://i.gyazo.com/e8b49b35ed69733a690bd240bcde1146.png) 弊社のコーポレートサイトも5月にリニューアルされたのですが、その際のアクセシビリティチェックも有志にて実施していました。 [「One CrowdWorks」で、コーポレートサイトをフルリニューアルした話。| Peter | note](https://note.com/contrabass/n/nf7931eb0c905#T0CYf) ### dependabot によるライブラリアップデート 弊社の開発用リポジトリは GitHub で管理されており、それぞれ dependabot の設定がされております。クラウドワークスの開発でも Gemfile と NPM modules のそれぞれで適応されています。 GitHub の Pull Request にてアップデート通知が来て、順次マージしています。 有志による個人活動に頼って属人化が進んでいますが、この問題をどうしていくかについても考えつつ、引き続きアップデートの追従やセキュリティ対応などを行っていきます。 ### デザイナーチームとの連携 フロントエンドの負債と関連して、混沌極めるクラウドワークスのデザイン制作を向上させるための「デザイン基盤整理」なる活動も行われております。 デザイン基盤整理では以下の課題点を解消するために、ドメインの整理や情報設計の見直しなどを行おうとしております。 - 画面の複雑化による情報設計の難易度が高い(拡張性がない) - 複雑化ゆえデザインを適切に表現できず、実装時のコミュニケーションコストが高い(拡張性がない) - 昔から使われているフレームワークの仕様を完全に理解しているメンバーが不在、デザインのメンテコストの高さゆえ更新されづらい(保守性がない) - レガシーなデザインによって引き起こす様々な課題(耐久性がない) この中で UI 開発の観点でフロントエンドに関心のあるエンジニアが基盤整理活動に参加しています。 そのほか、デザイナーとエンジニアがペアワークをしながら画面開発をしたり、 フロントデザイン相談室という Slack チャンネルにてデザイナーとエンジニア間での各自の疑問などの相談をしやすくする取り組みも行われています。 ### Vue.js v3 ドキュメントの翻訳活動 今年はついに Vue.js Ver3.0 が正式リリースされました。それにともないドキュメント翻訳の Issue が立ちました。 ![Vue.js v3 ドキュメントの翻訳 Issue のスクリーンショット](https://i.gyazo.com/f0e0b53b4c8f32eb20c822442a7f26d1.png) 社外活動になりますが、弊社からは私と [@t0yohei](https://twitter.com/t0yohei) が参加してドキュメントの翻訳に参加しています。 ## 個人活動編 ### 新型コロナ対策サイトのアクセシビリティもくもく会に参加 上述にてクラウドワークスやコーポレートサイトのアクセシビリティチェックを実施してみたと紹介しました。 実は[東京都新型コロナ対策サイトのアクセシビリティもくもく会](https://ca11y.connpass.com/event/169901/)に参加して、アクセシビリティ試験を学んだことがきっかけになっています。 [東京都 新型コロナウイルス対策サイトにアクセシビリティ視点でコントリビュートしてみた - クラウドワークス エンジニアブログ](https://engineer.crowdworks.jp/entry/covid-19_site_a11y_contribute) これまで試験対応というものはやったことがなかったのですが、アクセシビリティ分野の諸先輩に囲まれながら何が達成して何が未達なのかをチェックシートを見ながら確認し、非常に勉強になった良き会でした。 余談ではありますが、私は主に東京都からフォークされて派生した千葉県の新型コロナ対策サイトにて OSS 開発の参加をしていました。 [civictechzenchiba/covid19-chiba: 新型コロナウイルス感染症対策サイト[千葉県版]](https://github.com/civictechzenchiba/covid19-chiba) ### リモート勉強会で LT してきた オフラインでの勉強会はほぼなくなってしまいましたが、代わりにオンライン勉強会や配信というものが増えてきました。 今年は発表する機会があまり無かったのですが、以下フロントエンドに関するリモート勉強会にて発表をしてきました。 人が大勢いる前でやるのと違った感覚があり面白かったです。 #### PWA Night vol.16 ~オンライン LT 大会!~ [PWA Night vol.16 ~オンライン LT 大会!~ - connpass](https://pwanight.connpass.com/event/173576/) ![PWA is Progressive Web ... ? 発表資料表紙スクリーンショット](https://i.gyazo.com/57f486f40b4853074c0b94a22f18c404.png) [PWA Night 発表資料](https://docs.google.com/presentation/d/1VIBjWSrWcZ0ekKNIQ9Vl0pMdfGym1lrXi3Krq_o1EEo/edit?usp=sharing) #### UI/UX デザイナー LT 会 [【増枠】UI/UX デザイナー LT 会 【登壇者 15 名御礼】#uiuxdesignerslt - connpass](https://rakus.connpass.com/event/187048/) ![Web UIの実装で考えていることと気をつけたいこと 発表資料表紙スクリーンショット](https://i.gyazo.com/fb1becc7ad2c7afd380a9d3072067864.png) [UI/UX デザイナー LT 会 発表資料](https://scrapbox.io/yamanoku/Web_UI%E3%81%AE%E5%AE%9F%E8%A3%85%E3%81%A7%E8%80%83%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A8%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8) 12/9 に開催される v-tokyo オンライン Meetup#12 でも発表予定です。 [Vue.js v-tokyo オンライン Meetup#12 - connpass](https://vuejs-meetup.connpass.com/event/195236/) ### フロントエンド雑談会、ランチ会を実施してみている 気軽に参加してくれて各々が分からないことや困っていることを共有する雑談会を2度ほど開催しました。 また、10月後半から週1のペースでフロントエンドに関する情報共有をざっくばらんにやるフロントエンドランチなる会を開催しています。 フロントエンドランチは現在5回(2020 年 11 月現在)ほど実施しており、以下のことを実施してみています。 - ランチ会を何故実施するのか - 各社のフロントエンドエンジニア採用事例を見てみる - WEB+DB の脱レガシーフロントエンド特集を見てみる - TypeScript の基礎、応用について紹介する - デリバードチームで取り組んだフロントエンド改善の紹介する まだ構想段階ですが、ポッドキャストのようにいずれはゲストも呼んで話ができればいいななんて思ったりもしています。 ### 自分の立ち位置を考え直した 入社した当初はモノリシックな巨大なアプリケーションに圧倒されていました。 複雑なドメイン知識・インフラ周り・バグ対応や開発環境の整備など、フロントエンドのみならずフルスタックな立ち回りを要求される現状に自身の強みを活かすことの難しさで悩む日々もありました。 そんな私の入社して1年が経過し様々な事象(色々ある)に揉まれ続けてきた中で、これまでの振り返りと次の1年で自分がどう振る舞っていくのかということを考え、社内で発表してみました。 これからはフロントエンド「エンジニア」としてではなく、UI へのさわり心地やアクセシビリティを含む体験設計に重視したフロントエンド「デザイナー」としてやっていこうと思っています。 ![発表資料の表紙。1年の振り返りと次の1年について Okuto Oyama 2020/10/05 著者の顔写真](https://i.gyazo.com/28df9669a0d121f61a99f0e33537acb8.png) ![Twitterのyamanokuによる発言「Webのこと6割くらい知っているUIデザイナー(フロントエンド)っていうキャリアにしようかな」全体に置ける知識はそこそこに、UIについてを極める人を目指す](https://i.gyazo.com/f3428814fad69c997d34c156692680f9.png) ![FrontEnd Designer 👍](https://i.gyazo.com/f529d2acdad669a840c4e632739fdc5d.png) ## おわりに 繰り返しとなりますが、クラウドワークスでは現在「フロントエンドチーム」という明確なチームや役割は定義されていません。 そのため「フロントエンドエンジニアとして活躍したい」と思って参加できるような環境を提供できていないのが現状です。 しかしフロントエンドの役割の重要性、やることの細分化など Web に携わるものとして無碍にできないことは存在しています。そしてそれらを1人で網羅していくことはとても大変なことです。 そこで私はチーム自体を編成するより、各自の得意分野や興味・関心といったものを尊重して事業に活かせるようにできないかと考えています。それに伴い[どういったことが必要なのかを改めて言語化して洗い出していたり](https://zenn.dev/yamanoku/scraps/632e570e160251839d48)します。 まだまだ道半ばでやることも色々とありますが、いろいろな方が参加してくれる魅力あるフロントエンド開発をする組織になれればと思っております。 ここまでご覧いただきありがとうございました。 --- ## クラウドワークスのWebアクセシビリティチェックを始めてみた https://archives.yamanoku.net/crowdworks-product-accessibility-check/ ![](https://i.gyazo.com/627253dc3266425cbf2798a446ef96b8.png) こんにちは。フロントエンドエンジニアの [yamanoku](https://twitter.com/yamanoku) と申します。 最近久々に出社しましたが、どうやら半年以上も出社していなかったことに驚愕しました。自分自身が違和感なくリモート作業やれているのかもなぁという気づきにもなりました。 前回の記事では東京都 新型コロナウイルス対策サイトの Web アクセシビリティチェックをしたという話をしました。 [東京都新型コロナウイルス対策サイトにアクセシビリティ視点でコントリビュートしてみた](/covid-19-site-a11y-contribute) 今回の記事では、チーム内でクラウドワークスの Web アクセシビリティチェックを実施してみた話をします。 ## Web アクセシビリティとは? Accessibility は「アクセスできる・アクセスしやすさ」と翻訳されます。そして Web アクセシビリティは Web にある情報やコンテンツに、あらゆる人がアクセスできようにすることを指します。 あらゆる人がアクセスできるようにする、とはどういうことか。以下はその対応例です。 - デバイス操作に慣れない人でも簡単に閲覧できるようにする - 難しい言い回しを避けて理解しやすくする - コントラストを調整して閲覧しやすいデザインにする - 音声読み上げをしてくれるスクリーンリーダーといった支援技術を使うために考慮する W3C[^1]では、ウェブは多くの人々の日常に欠かせないものと定義して、アクセシビリティについては以下のように説明されています。 > 世界には 10 億人、言い換えると、人口の 15 から 20%の割合で障害を持つ人がいます。国連は障害者の権利条約を定めており、人権として Web を含んだ情報へのアクセスはほとんどの国で国連条約として批准されています。また数カ国では政策として義務付けられています。法律や規制にも関わらずアクセシビリティ標準を実行するのは、障害を持つ人たちにも、すべての人達にも不可欠なことです。 > > [W3C のアクセシビリティと標準技術 | Web Accessibility Initiative (WAI) | W3C](https://www.w3.org/WAI/videos/standards-and-benefits/ja) ## Web アクセシビリティチェックをするきっかけ そもそものチェックをするきっかけとなったのは、フロントエンドチームで行っていたフロントエンド基盤整理からでした。 以下フロントエンド基盤整理で行っていたものの一例です。 - 外部リンクに `rel=“noopener noreferrer”` をつけて脆弱性を改善する - フロント実装面でのガイドラインの叩きをつくる - SNS ログインボタンのロゴの刷新 改善していきたい内容をあげていき、タスク化して日々の業務のスキマで実施していきました。 そんな中アクセシビリティに興味がある私と同じチームの [earlgreyMK](https://twitter.com/earlgreyMK) は、デザイニング Web アクセシビリティ[^2]の社内輪読会を実施していたり、コーポレートサイトのリニューアルでアクセシビリティチェックを担当した経験[^3]もあり、クラウドワークスのアクセシビリティチェックもやってみようと思いました。 ## チェックした方法など ### チェック項目について どうやってチェックするか、については WCAG(ウェブコンテンツをよりアクセシブルにするためのガイドライン)をもとに項目を列挙しました。 ちなみに WCAG には「知覚可能」「操作可能」「理解可能」「堅牢」という4つの原則があり、その中で様々なユーザ層や状況からくるニーズを満たすために、3 つの適合レベル(A、AA、AAA)の達成基準あります。 今回チェックした達成基準は以下になります。 #### 知覚可能 - 1.1.1 非テキストコンテンツの達成基準 - 1.2.1 音声だけ及び映像だけ(収録済み)の達成基準 - 1.2.2 キャプション(収録済み)の達成基準 - 1.2.3 音声解説又はメディアに対する代替コンテンツ(収録済み)の達成基準 - 1.3.1 情報及び関係性の達成基準 - 1.3.2 意味のある順序の達成基準 - 1.3.3 感覚的な特徴の達成基準 - 1.4.1 色の使用の達成基準 - 1.4.2 音声の制御の達成基準 - 1.4.3 コントラスト(最低限レベル)の達成基準 #### 操作可能 - 2.1.1 キーボードの達成基準 - 2.1.2 キーボードトラップなしの達成基準 - 2.4.2 ページタイトルの達成基準 - 2.4.3 フォーカス順序の達成基準 - 2.4.4 リンクの目的(コンテキスト内)の達成基準 - 2.4.7 フォーカスの可視化の達成基準 - 2.5.2 ポインタのキャンセル - 2.5.3 名前 (name) のラベル #### 理解可能 - 3.1.1 ページの言語の達成基準 - 3.2.1 フォーカス時の達成基準 - 3.2.2 入力時の達成基準 - 3.3.1 エラーの特定の達成基準 - 3.3.2 ラベル又は説明の達成基準 #### 堅牢 - 4.1.1 構文解析の達成基準 - 4.1.2 名前(name),役割(role)及び値(value)の達成基準 レベル A 達成基準に加え、レベル AA のコントラストとフォーカスを項目に追加、更に WCAG2.1 より新たに追加された 2 つの項目(ポインタのキャンセル、名前 (name) のラベル)でチェックしました。 ※ 基準適用されない項目(チェックする要素が存在しない場合)は省いております。 ### チェックする範囲について アクセシビリティチェックを行うにあたり、現在クラウドワークス内で存在するページを数えてみたところ、おおよそ 400 ページ近くあることが判明しました。 これを全てチェックするのは時間がかかるので、チェックを行うために主要なページをしぼりました。 ![会員登録ページ](https://i.gyazo.com/1aed0bbe7f86f5de9ddfb3f02227c9cd.png) ![ログインページ](https://i.gyazo.com/74c92b16229bfd9e2fae278052a9d03b.png) ![TOPページ](https://i.gyazo.com/7c6bd7c09c74a7c15595c8ad485efc68.png) これらを選んだ理由としては、ログインをしてない状態でも表示できるため不特定多数の人が閲覧すると想定したからです。 ### チェックの進め方について 進め方として、1 週間で 1 ページの全項目をチェックしていく形で始めました。 ![](https://i.gyazo.com/21e2aa8d7da480601936b2a4df51039c.png) チェックはスプレッドシートに項目沿って確認をしていきます。 スプレッドシートは以前、自分が参加した外部のアクセシビリティ試験会[^4]のものから流用してきました。 ![各達成基準で見つかった課題をスプレッドシートに「見つかった課題」「ページURL」「issue化」「メモ」といった項目で列挙している](https://i.gyazo.com/60b496638320ff002fa78b3f7b4c482b.png) 達成できているかどうかについて、Ameba アクセシビリティガイドライン[^5]も参考に使わせてもらいました。 ガイドラインには簡単な実例があり、どういった内容をチェックすればいいかが分かりやすく、チェックを進める上で理解の手がかりになりました。 その他、WCAG2.1 の解説書[^6]での達成失敗事例もどういった場合適応できていないかで参考にしました。 ## チェック時に困ったことについて チェックした経験がある人は共感してもらえそうですが、「項目を達成しているか」の判別が難しかったです。 達成基準の「1.2.1 音声だけ及び映像だけ(収録済み)の達成基準」では、動画に字幕が付けられているかという基準なのですが、TOP ページ下部にある動画では YouTube の「自動字幕機能」にて生成された字幕が使われています。 字幕がある時点で達成しているように思いましたが、機械翻訳では精度が怪しいため、○ でありつつ ✗ という判断になりました。 「2.5.2 ポインタのキャンセル」では、今ある UI においてどこまで達成できているのか、という判断が難しかったです(結果として問題無さそうと判断しました)。 合間でやっていた対応だったため、日によってチェックの精度にムラがありました。 1人はチェックできるけど他のタスクで手がつけられなかった、ということもありました。また、それぞれが確認した基準のダブルチェックも行うまでの時間はありませんでした。 ## チェック時に工夫したことについて コントラストチェックですが、[Axe](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd)というアクセシビリティチェックツールを使用することで簡単に問題点が発見できます。 ![](https://i.gyazo.com/ff94f29456df98bde194d55a20d3ebcb.png) 要素数の列挙のほか、基準を満たしていないものを強調してくれます。 ![達成基準を満たしていないオレンジ色のボタンが水色と黒の太い破線で強調されている](https://i.gyazo.com/e7e91fb2a37bca833e8505f364409b70.png) Chrome の検証ツールでは要素を選択するとその要素のコントラスト比やキーボードでフォーカス可能なのかなど、アクセシビリティチェックしやすい機能が増えてきています。 ![要素の上にポップアップでチェック項目が表示されている](https://i.gyazo.com/4e5025b28d6e374a0deb9ed838e95ab4.png) 達成基準 4.1.1 の構文解析の達成基準では[Nu Html Checker](https://validator.w3.org/nu/)を使ってチェックしました。 ![](https://i.gyazo.com/d2048e58d53c37a24ec4bce074658335.png) こちらは URL を打ち込むことで構文解析してくれるのですが、freee 株式会社の公開している freee アクセシビリティガイドライン[^7]より、[ブックマークレートを使うと良さそう](https://a11y-guidelines.freee.co.jp/explanations/check-tools.html?highlight=nu%20html#id79)ということで、そちらを使用しました。
結果として URL を打ち込むことなく解析結果に遷移してくれます。 ただし、Nu Html Checker ではサーバーの方にデータが送られてしまうため社外に出したくないページは使わないようにしましょう。 ## チェックした結果について 次に実際にチェックした結果、どういった項目が課題として浮かび上がったかの一例を紹介します。 ### 達成基準 1.4.1「色の使用の達成基準」 利用規約・個人情報保護方針のリンクが色のみで判断できるものとなっており、こちらはディスプレイのグレイスケールモードを使っている方などには見づらいと判断しました。 ![文章内にリンクのみ色が変わっている表示のスクリーンショット](https://i.gyazo.com/36f0e28e5d2796462e82f12e53caf077.png) ![文章内にリンクがあるが色の差別しかないためどこがリンクなのか分かりにくくなっている表示のスクリーンショット](https://i.gyazo.com/bd43d6454121c6983c72dd02a7ebe956.png) この場合、リンク下線を出しておくことで通常のテキストと判別がしやすくなるように対応できそうです。 ### 達成基準 1.3.3「感覚的な特徴の達成基準」 コンテンツを理解して操作できるように感覚的な特徴を使わないというものです。 会員登録ページにおける「ログインはこちら」という文言において、「こちら」がどこを指すかが曖昧になっており、テキストを読み上げた時に困惑してしまいかねないという問題が発覚しました。 ![](https://i.gyazo.com/0e32d3d844e01586b1035598635ecf99.png) 「ログインする」「ログインページに移動」といったリンクの目的がはっきりとわかる文言に変える必要があります。 ### 達成基準 2.4.7「フォーカスの可視化の達成基準」 クラウドワークスの中で使われているボタンは、フォーカスしたときのアウトラインが薄く見えづらいため、視認性がよくない問題を見つけました。 ![ものすごく分かりづらいが薄い点線がアウトラインで表示されている](https://i.gyazo.com/100bea5a556f08817e0e855f2bea68f6.png) クラウドワークスでは`cw-core`という独自の CSS フレームワークを長年使っており、こうしたボタンの仕様を一部変更することが、どのページでどれくらいの影響範囲になるかの検討がつけられていないため、安易に修正ができないという問題も表出しています。 ### 達成基準 1.3.1「情報及び関係性の達成基準」 「メールアドレスではじめる」がマークアップとしては`

`が正しいのではないかということが挙げられました。 ![](https://i.gyazo.com/29509f8507b267a042b4858072e547f8.png) 現在は``タグにおけるページ内リンクをクリックした時の本来持つ挙動を損なわない実装を紹介 こうした素晴らしい記事を、祐平さんのフォロワー・ファンであれば即座に拝見して知識として吸収できるのだが、彼を使うべきではない言葉なので修正してください人やこの情報を伝播してくれる人が周りに居ないと、この記事で伝わってほしい部分も伝わらないと思った なので自分をはじめ、この記事を見たものとしては、それが価値があるものと判定できたら、実務の中で活かしたり、参考例として伝聞していく使命みたいなのが我々にはあるのかなと感じた。 繰り返しますがこれはアクセシビリティに限らずどの分野でも言えることで、インフルエンサーがきちんと正しく流布していかないと何でも廃れていくだろうなと思ってる。 分かる人同士であれば伝える言葉も少なくていいが、共通言語があるからできることをデフォルトにするのはまずい。 出来る限り自分の言葉として落として、あらゆる人たちにでも伝わる・理解できる伝達が必要かなと思う。こういう「あらゆる人に届ける」ことこそがアクセシビリティの本質の部分でもあると思う。 自分と近しい境遇の人を仲間として増やしていく、そういう自分の根底にある理念みたいなのを表層したくて「これからはじめる Web アクセシビリティ」というものを作ったのかもな、と改めて思った 以上 19 日目の記事でした。 明日の Web アクセシビリティ担当は[kzakza](https://twitter.com/kzakza/)さんです。 - 関連:[読書に困難のある子供に図書館ができること | kzakza](https://code.kzakza.com/2018/12/lib4cd/) - 自分も娘がいて、今のところは健康そのものなのですが - 後天性の病気になったり、他の子が障害があったりするなどが見られる機会は今後増えるかもしれなく - 家族・子どもと一緒にアクセシビリティ(or インクルーシブ)を考えることも必然になってくるだろうなと思いました - 今回は「読書」を例にとっていただきましたが、自分は昔はあまり本を読まない側だったので - この辺を意識したことは正直なかったのでこういう実情が知れてよかったです - 松戸駅の JR 側エレベーターはよ設置しろや GEEK アドベントカレンダー担当はデザイナーの R さんです。カレーの話かな? - 関連カレー記事 - [【不定期開催】第 0 回社内カレー晩餐会 – 株式会社 GEEK クリエイターズブログ](https://blog.geek.co.jp/archives/2180) - [【不定期開催】第 1 回社内カレー晩餐会 〜夏の締めくくりスペシャル〜 – 株式会社 GEEK クリエイターズブログ](https://blog.geek.co.jp/archives/2538) - [オシャレ系〜異次元系まで 気になるカレーサイトまとめ – 株式会社 GEEK クリエイターズブログ](https://blog.geek.co.jp/archives/2024) ご覧いただき誠にありがとうございました。 --- ## インプットをしまくってアウトプットもした2018年について https://archives.yamanoku.net/2018-for-inputs_and_outputs/ [![Image from Gyazo](https://i.gyazo.com/60f869fb8d060073a7af85db11402aa2.png)](https://gyazo.com/60f869fb8d060073a7af85db11402aa2) この記事は[GEEK Inc. Advent Calendar 2018](https://adventar.org/calendars/3108)の 15 日目の記事となります。 4 回目の登場になります。マークアップ&フロントエンジニアと 2 歳 9 ヶ月の父親をやってます大山です。 年の瀬ということで毎年おなじみの今年の漢字が発表されましたね。 > [2018 年「今年の漢字」 | 公益財団法人 日本漢字能力検定](https://www.kanken.or.jp/kanji2018/) 今年は「災」とのことです。2004 年のやつと被ってるじゃん! とお思いのかたもおられると思いますが 私は[2018 年プロレス大賞](https://www.tokyo-sports.co.jp/wrestling/)の人選をもう 1 回考え直して欲しいと思ってるのでそれと比較したら大したことないかもです(?) そんな今年を「象徴する」漢字の話から派生して、今年の自分を象徴することはなにか? を何となく考えてみたところ、**インプットしまくってた**ということでした。 ということで今回は、私のインプットとそれに伴うアウトプットの話をしようと思います。 ## 2018 年、怒涛のインプット アドベントカレンダー初日の[プレイバック・テック・2018](https://blog.geek.co.jp/archives/2616)でも触れましたが、 2018 年はかなりインプット強めて、勉強会やイベント・カンファレンスに出向きました。 - Netlify Meetup#003 - Scrapbox SQUARE TOKYO ~開発現場の活用会議~ - 第 1 回 mgn アクセシビリティ公開社内勉強会 - Scramble!#2 Security - UIT#5 わたしたちにとっての Vue.js - UX Cafe: チームで取り組む! サイボウズのアクセシビリティ - HTML5 Conference 2018 - We Are JavaScripters! @26th - Vue Fes Japan 2018 Reject Conference - Meguro.css#4 - CI/CD Test Night#1 - Vue Fes Japan 2018 - DIST.23「マークアップを止めるな!」 - NuxtMeetup#5 - すくすく! 子育てエンジニア Meetup#3 - STUDIO Workshop#3 @ OHAKO - Netlify Meetup Tokyo#2 - Roppongi.js#6 - Vue.js Tokyo v-meetup#8 - Roppongi.js#5 - Meguro.css#2 - We Are JavaScripters! @22nd - DXEL.1 エンジニアとデザイナーが「いい関係」を築くために - HTML5 APP CONFERENCE 2018 - さくらの勉強会フロントエンドナイト - Cybozu Meetup フロントエンド#2 - 第 69 回 HTML5 とか勉強会「UI フレームワーク最前線」 - Scrapbox Drinkup#4 Tokyo Edition - Nuxt Meetup#2 - Roppongi.js#2 - 技術書典#4 - すくすく! 子育てエンジニア MeetUp#2 - すくすく! 子育てエンジニア MeetUp#1 自分が見返しても**やべぇなこいつ**となっています。 ちなみに比較までに 2017 年にいってきたところは以下のとおりです。 - JSLounge「Nuxt.js で作る Vue.js による web 制作ハンズオン」 - Japan Accessibility Conference vol.1 - さくらの夕べ「さくらインターネットのエンジニアは Vue.js をこんな風につかってます」 - Abema TV Developer Conference 2017 - HTML5 カンファレンス 2017 数で比較すると**33 : 5**です。 **本当に何があった?? ?????** ## インプットしたら社内から評価されるようになった 今年とにかく数をこなしていたのですが、自分としては無理はせず単純に「興味がある」と思ったものには足を向けてみようという認識で参加していました。 ただなんとなくそういう風にしていたら、社内の中間面談でメンバーから「大山さんのインプットがはんぱない」と評価をうけるようになりました(以下抜粋)。 > - アクティブに勉強会などに参加されていて素晴らしいです。 > - お忙しい中社外での活動を積極的にされていて純粋にすごいなと思います。 > - 登壇を実現していて素晴らしいです。 > - 社内外で発信受信というアンテナ感度が高く、積極的に新しいことにチャレンジしたり、知識を深めようとしているところだけではなく、行動しているところを評価します。 ## 数をこなすことでいろんな障壁が減る 勉強会に行ってみたいと思いながらも足が重く行きづらいなと感じている人もいると思いますが、これを解消するには、根本的な解決にはならないかもですが、何であれ参加してみるしか無いなと思っています。 ただ参加するにしても懇親会や交流といったことなどはしなくても、個人の知識や知見を得るためだけに参加するのも立派な勉強会参加だと思っております。私は自宅が千葉にある都合上、あまり遅くまで残れない問題があるのでそういったアフターパーティーには基本参加できていません。 - 社内だけでは得られない知識・知見が豊富 - 業界交流的なものが出来る - あんまり自分は積極的ではないのですが… - いろんな会社に遊びにいける - 各会社の事情が知れる - **タダ飯・タダ酒がうまい(不純)** - 寿司のネタだけを食べるような非人道的な行いは避けましょう ## メモ帳として大活躍、Scrapbox [![scrapbox logo](https://i.gyazo.com/9abb9d4a2208c7d055a2391a792e826e.png)](https://gyazo.com/9abb9d4a2208c7d055a2391a792e826e) 勉強会などで参加すると、資料が公開されたりもしますが、現場でしか聞けないことはメモしたりすることもあります。テキストエディタや Twitter などの SNS に発信するのもありますが私は Scrapbox を使ってメモを取っています。 Scrapbox でメモを取るメリットして以下のようなことがあります。 - スピード感をもって記述できる - 長文ではなく短文や単語区切りで書ける - [![NuxtMeetup#05のメモ例。コードの自動分割→これが足かせになった→CommonChankPlugin→vendor.{hash_id}.js…という感じで単語区切りで段落落ちして記述している](https://i.gyazo.com/dba20e88b5fe09e474b3b467a123950b.png)](https://gyazo.com/dba20e88b5fe09e474b3b467a123950b) - そもそも Scrapbox を使って書き慣れているのがありますが - リンクがあるとインクリメンタル検索みたいに関連 Word がでてくる - [![kubernetesと打つ時にScrapboxのリンク記述を使うとすでにページとして登録していればインクリメンタル検索のように「kubernetes」がすぐ出てくる](https://i.gyazo.com/89534f15e40fdc56297b4d0e592d4ab1.gif)](https://gyazo.com/89534f15e40fdc56297b4d0e592d4ab1) - まとめた分が1つのドキュメントとしてすぐに公開できる - ブログ枠で参加する時、勉強会が終わったらそれを公開することも可能に 是非みなさんも Scrapbox でメモってみてください。かなり捗るようになると思います。 ## インプットしまくった分、アウトプットもした とにかく出向いては吸収しまくり出向いては吸収しまくりを繰り返していましたが、インプットしまくるとどうなるかというと**アウトプットする機会も次第に増えてきます**。 ### 社内 Slack で共有 [![Image from Gyazo](https://i.gyazo.com/129fad0a7d2a366be3ee078607d5cb1a.png)](https://gyazo.com/129fad0a7d2a366be3ee078607d5cb1a) 社内 Slack チェンネルにて勉強会参加してきた旨を報告・メモを公開 参加したあとの翌日であれば基本的には Scrapbox でまとめたドキュメントを社内の Scrapbox でもコピーして共有するようにしています。 自分の Scrapbox で共有していないのは、社内のものであればメンバーが質問したり感想を書いてくれることもあるからです。 [![Image from Gyazo](https://i.gyazo.com/5477b8c3878953d4a6ab5aa95e9f5c17.png)](https://gyazo.com/5477b8c3878953d4a6ab5aa95e9f5c17) 子育てエンジニア MeetUp のメモにディレクターの塚田パパがコメントしてもらっている図 ### 社内勉強会も実施 特に社内で取り組んでいきたいことは言語化するだけでなく、直接に使ってもらう・知ってもらうことで啓蒙を行っていました。 - Scrapbox 社内勉強会(資料非公開) - [Nuxt.js で爆速開発最高だぜ勉強会@2018-11-16](https://scrapbox.io/yamanoku/Nuxt.js%E3%81%A7%E7%88%86%E9%80%9F%E9%96%8B%E7%99%BA%E6%9C%80%E9%AB%98%E3%81%A0%E3%81%9C%E5%8B%89%E5%BC%B7%E4%BC%9A@2018-11-16) - [誰がためにアクセシビリティ対応をするのか?](https://scrapbox.io/yamanoku/%E8%AA%B0%E3%81%8C%E3%81%9F%E3%82%81%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E5%AF%BE%E5%BF%9C%E3%82%92%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F) ### 勉強会で登壇 いままで勉強会を聴講するだけだったのですが、勢いにまかせて 2018 年 11 月に 3 本出ました。 - すくすく! 子育てエンジニア Meetup#3 - Meguro.css#4 - We Are JavaScripters! @26th 登壇、昔こそ「そんな恐れ多いことができるのか…」と思っていたのですが、意外となんとかなるもんです。 「意外となんとかなる」と思っていたのは様々な勉強会に参加してみて発表者の内容や、勉強会の空気感として初心者もウェルカムなものであれば、やってみるのもそこまで怖くないのかなと思うようになったからです。 自分の知識を再確認・ブラッシュアップする分では大いにアリですし、発表は**勢いやお酒の力とかでなんとかなる**というのもあります。実際、**資料を一本まとめることができることが重要**だと思っているので、発表は後付みたいなところはあります。 ### 技術書典#5 でサークル参加 [![Image from Gyazo](https://i.gyazo.com/bc2ac5f1c41fd8ea01cc77f85d871d00.png)](https://gyazo.com/bc2ac5f1c41fd8ea01cc77f85d871d00) これもおさらいみたいな感じですが、[技術書典#5](https://techbookfest.org/event/tbf05)ではサークル側として参加しました。 登壇とも同じことが言えるのですが、アウトプットの形として一冊の本として出すのはそれなりのインプットをしていることが前提になっています。その結果、自分にとっても揺るぎない 1 つの知識であることが裏付けされるので、本にしろブログにしろ人に伝えるにしろ、何をどこまで理解しているかを文章化するのは大事な気がしています。 ## おわりに ということで、私の 2018 年は - インプットに始まり - アウトプットも時折あり - インプットに終わる というような 1 年だったような気がします。 特にそれを目標としていたわけではなかったのですが、来年もスキあらばいろんな勉強会や MeetUp、カンファレンスに参加してみたいと思っています。会場やタイムラインなどでお見受けしましたらその時は何卒よろしくお願いいたします(何を?) 以上、15 日目の記事でした。次回は EC チーム飯塚さんになります。 --- ## Tumblrよ、俺を失望させるな。 https://archives.yamanoku.net/tumblr-dont-let-me-down/ - [Tumblr をよりよい場所に](https://nihongo.tumblr.com/post/180759840667/tumblr%E3%82%92%E3%82%88%E3%82%8A%E3%82%88%E3%81%84%E5%A0%B4%E6%89%80%E3%81%AB) - [Tumblr、アダルトコンテンツを完全排除へ  12 月 17 日に新ポリシー施行](http://www.itmedia.co.jp/news/articles/1812/04/news060.html) まずこの話に入る前に経緯を説明すると、最近以下のような出来事がありました。 > [Tumblr の iOS アプリ、App Store から消える](http://www.itmedia.co.jp/news/articles/1811/19/news087.html) 11 月 16 日(米国時間)に上記タイトルの通り[App Store]からアプリが消える問題が発生しました。 原因を追求してみたところ、児童ポルノの表示フィルタから漏れ、データが表示されていたことのようでした。 この原因をもって Tumblr ではセキュリティポリシーを更新し、 12/17 までにアダルトコンテンツを一切排除して今後一切アダルトコンテンツが表示されないクリーンなものとすると発表しました。 また、この事件の影響かは分かりませんが、Tumblr に関連して日本において児童ポルノ動画をリブログしたことで逮捕された事件も最近起こっておりました。 [ブログサービス「タンブラー」に児童ポルノ動画投稿容疑、愛知県立高教諭ら逮捕 京都府警](https://mainichi.jp/articles/20181205/k00/00m/040/185000c) この発表だけをみると至って全う・健全かのように思われるかもしれませんが、 かつて Tumblr ヘビーユーザーであった自分はこの措置が正しいものなのか疑問に感じているところです。 Tumblr は Twitter と同時期くらいに同じく SNS・ショートブログコンテンツを扱うサービスとして使われていました。 ほかのサービスと一線を画していたのはリブログ機能という引用と同じようにコンテンツを自分のブログに投稿できるものがあります。 また、最たる特徴としてはメッセージ・DM といった密な交流をしなくともユーザー同士の適度な距離感のまま運用できるというメリットがありました。 ただ最近ではアダルトコンテンツを扱うブログ自体も増えてきており、 そうした目的のために Tumblr を利用している人が多く居たというのは事実としてあります。 そこで Tumblr ではアダルトコンテンツを扱う際に NSFW(職場閲覧不適切)のフラグをつけるなどして 棲み分けを確立しておくなどの措置があったり、そもそも Tumblr 側でふさわしくないもの (アダルトコンテンツや特にグロテスク・暴力的なコンテンツ)は削除なりを取るなどしておりました。 しかしながら、このように問題のある投稿に対して全く措置や対応をやっていないわけではなかったですが、 今回の件をもって Tumblr はポリシーを更新して、それらと決別する意思を表明することになりました。 今後のアダルトコンテンツの選定においては内部の AI を使って自動的に判別されるとのことですが、 現状[アダルトコンテンツと思わしくないコンテンツすらもアウトになる](https://gigazine.net/news/20181206-tumblr-ai-flagged-post/)判定を出しており、 この方針を更に批判的なものとして注目させることとなりました。 少なからず Tumblr で活動していた NSFW アーティストなどはこの騒動を受けて離脱・移行の意思を示しております この措置について自分は、最近まで日本国内で物議を醸していたサイトブロッキングのそれに近いと思っており、 いわば指先の痛みを除去するために腕そのものを切除するそれだと思っています。 そもそも心地よい無法地帯よろしく、自由な投稿プラットフォームという立ち位置であった Tumblr が NSFW フラグはもちろんのこと違法的なアダルトコンテンツを扱うユーザーや投稿へ注力すべき箇所を、何故すべて分断しうる措置をとってしまったのかが、非常に理解に苦しんでいるところのものです。 かつてデビット・カープがそうしたものを取り締まるべきではないと主張しているのですが、 > 「ユーザーの言論の自由と創作物のサポートには強行対策をとっているが、取り締まりたいわけではない」 > > [Tumblr のカープ CEO、ポルノ問題について「取り締まりたくはない」とコメント - ITmedia NEWS](http://www.itmedia.co.jp/news/articles/1307/18/news091.html) 彼がこの Tumblr を去ってしまって、もう 1 年が経とうとしています(2018/12 現在)。カープ、あなたがこの事情を知ったとしたら何を思うのだろうか。 健全であるということは否定はしませんし、そうではないもので苦しめられることはあってはならないとは思います。 ですがそれを達成するために、**それらに関わる・纏わりつくあらゆる文脈をも分断すること**は 果たして真に健全で公平なことなのかどうなのかを、皆さんにも今一度考えてみていただきたいと思っています。 ## 関連リンク - [多様性社会について思うこと](i-think-inclusive-society) --- ## すくすく!子育てエンジニアMeetUpが自分を救ってくれた話 https://archives.yamanoku.net/childcare-engineer-meetup-saved-me/ [![Image from Gyazo](https://i.gyazo.com/6dd0f6163d57807d34a856d8f9472f35.png)](https://gyazo.com/6dd0f6163d57807d34a856d8f9472f35) この記事は[子育てエンジニア Advent Calendar 2018](https://adventar.org/calendars/3178)の 9 日目の記事です。 兼、[GEEK Inc. Advent Calendar 2018](https://adventar.org/calendars/3108)の 9 日目の記事でもあります。 エンジニアの肩書のくせに、今回自分はあまり技術的な内容を語れない感じです。 しかも自分語り多めな感じです。よろしくお願いいたします。 ## 娘、誕生 [![Image from Gyazo](https://i.gyazo.com/fd4020eed750367db05996de19318de0.png)](https://gyazo.com/fd4020eed750367db05996de19318de0) 2016 年 3 月に我が大山家に待望の女の子が産まれました。 歳を重ねるに連れて涙腺がゆるくなるとは言いますが、出産に立ち会って無事生まれるまでの間に3回も泣く人間はあまり居ないんではないんでしょうか。 ともかく喜ばしい出来事で我々夫婦はもちろん、身内・知り合いからお祝い・祝福の言葉をいただくなどありました。 1週間後に退院して家に帰ってきた妻・娘を迎えて自分自身は「やっていくぞ」スピリッツみたいなものが芽生え出しました。しかし… ## 何もできていない自分 [![Image from Gyazo](https://i.gyazo.com/3440e5ea2bf3eb108fb44a222cc69a9b.png)](https://gyazo.com/3440e5ea2bf3eb108fb44a222cc69a9b) おそらく通常であれば共働きの状況において、お互いのやるべきことや役割分担などを決めるなどがあったのでしょうが、ウチでは妻が妊娠するにあたり、これまでやっていた派遣を辞めて、専業主婦として家に居る状況でした。 だからこそなのかもしれませんが、自分自身は産まれてから1年近くは子育てに「直接」関与できていませんでした。 間接的なこととしては、必要なものの買い物や諸々のセッティング手伝い、ミルクを作ったりというのはやっていたのですが、それ以外の娘に直接触れることはすべて妻まかせとなっていました。 当時の社内福利厚生として男性の育休制度は確立されていなかったため(現在は一週間付与の制度になりました)、自分は労働に徹して妻に子育て含めてそれ以外をやってもらう状況でした。 この時無理にでも時間をつくってでもやるべきだったのですが、最初の段階から娘と密に接せなかった時間があり、自分は親として・家族として何もできていない心境となって辛かった時期がありました(もちろん妻側もほぼ1人で対応をして大変なのですが…)。 ## すくすく! 子育てエンジニア MeetUp の存在を知る [![すくすく!子育てエンジニア MeetUp connpassページ](https://i.gyazo.com/d63c09512475e275489f331a0fb719c7.png)](https://gyazo.com/d63c09512475e275489f331a0fb719c7) そんな中、Twitter で「子育てをしているエンジニア向けの MeetUp をやる」という情報を見かけました。 概要としては以下の通りです。 - 家庭・育児で大変ななにかをエンジニアリングで解決・サポートできないか? というのを共有し合うために開催に至った Meetup。 - 開催時間が早い(アルコールなし) - 家族にその日のうちに情報共有したいという思い - 子連れ・土曜開催も計画中 - 主催者はそれぞれ別の企業に所属しているので特定の企業に依存しない 今の自分にとって「どうやっていくのがいいのか」が分かるのだろうかという、一抹の不安と少しの期待がその当時ありました。 また、2018 年の個人目標としてとにかく興味が出たらそこに足を向けてみるというのがあり、参加するボタンを押しました。 記念すべき第1回目では、どちらかというネイティブアプリエンジニアが参加者・登壇者で多かった感じです。 ただ、自分はどちらかというと Web、フロントエンドエンジニアなのですが、職務関係なしに為になる・面白い話がありました。 - 家庭内の情報共有ツールに Slack・LINE を使って自動化してみた - 家庭内の問題をプロジェクト化して KPT を回して解決していく - VUI を家庭内で活用してみた話 - 自作の育児管理アプリ開発話 - 育児タスクのカンバン管理してみる 参加レポート過去2回分の詳細は以下にリンクとして貼っておりますので、ご興味のある方はご覧になってみてください。 - [「すくすく!子育てエンジニア Meetup #1」レポート #子育てエンジニア – やまろぐはてな](https://yamanoku.hatenablog.com/entry/2018/01/21/213318) - [「すくすく!子育てエンジニア Meetup #2」レポート #子育てエンジニア – やまろぐはてな](https://yamanoku.hatenablog.com/entry/2018/04/07/200750) # 下手でもいい、自分なりにやろう 自分はこの MeetUp に参加してみて、自分でも何かしら貢献できることはあるのでは? と勝手に勇気づけられました。 知見を聞けたのもありますが、各家庭の親御さんがどう言うふうなアプローチができるのかどうかという体験談を聞けた点において。 MeetUp 後の興奮をそのままに、社内 LT でも家庭内やっていきを宣言してきました。 > [まもなく娘生誕2周年だよ全員集合 – YAMALT vol.05](https://yamanoku.net/LT/lt05/) 妻は非エンジニアであり、機械などに頼らずとも割となんでも自己完結できるスーパーウーマンなので、あんまり自分が提案することを受け入れてもらえたり・導入してもらえることはありませんでした。 ですが「こうした話があった」「こういうことをやっている」「これはどう?」という話題をもって、育児や家事のことなどに徐々に参加できるような形になっていけました。 今でこそ妻も労働を再開して娘も保育園に通えるようになり、昔のような妻任せにはできなくなったので家のことでの役割分担を明確化していきました(ゴミ捨て・風呂掃除・娘の散らかした部屋片付け・ペットの世話・在宅時の登園補助など)。 自分は PC 扱う以外は圧倒的な不器用を発揮するので妻からは心配されるのですが、それでも 1 つ一つやっていかないことには分からないこともあります。 父親として未熟な所が多いのですが昔と違うのは、まだまだやれることはあると分かり、多少なりとも自分がやることに自信が持てるようになったことだと思います。 [![Image from Gyazo](https://i.gyazo.com/ab84773376a9fdcb7bcfd350f01e8624.png)](https://gyazo.com/ab84773376a9fdcb7bcfd350f01e8624) 今はもう使われてませんが[Trello](https://trello.com/)を用いた食材管理などをやっていた時期もありました ## 同じ境遇の人を救いたい [![すくすく!子育てエンジニアMeetUpへの謝辞:子どもができてからどう親として家族として接していけばいいかわからなかった。当時専業主婦だった妻が娘のことをほとんどやってくれた。エンジニアとして、父親としてやれることがわからなかった。自分は不要なのでは?と本気で信じてた。共有できる同じ境遇の人がいなかった。当時おそらく軽く鬱になってた。MeetUpの開催が宣伝されて偶然見かけた。聴講枠での参加。「こういう形での子育て方がある」ものすごい感動した。全部が全部活かせたわけではないが、自分にとって励みとなれた。自分も登壇してみて同じような人の背中を押してあげたい 、という形で登壇させていただきます。](https://i.gyazo.com/864a8ec720389e59da0b9bb55f2d5183.png)](https://gyazo.com/864a8ec720389e59da0b9bb55f2d5183) [![MeetUp参加時のLTにて謝辞を述べているところを撮ってもらった](https://i.gyazo.com/f0908b04ac1c42c3ebf4c3ddfb9c78d9.png)](https://gyazo.com/f0908b04ac1c42c3ebf4c3ddfb9c78d9) それからしばらく日が空いていたのですが、10 月にすくすく! 子育てエンジニア Meetup#3 が開催されるとのことで、参加してみて社内以外で人前ではじめての LT をやってみるなどしました。 [https://scrapbox.io/yamanoku/家庭内に Scrapbox を導入してみる提案](https://scrapbox.io/yamanoku/家庭内にScrapboxを導入してみる提案) そしてその際に謝辞を述べさせてもらいました(以下全文抜粋)。 [Jun Osaki@田町の採用広報さんのツイート: “イベントに参加者から謝辞もらえるなんてすごい ww #子育てエンジニア… “](https://twitter.com/nobosemon21/status/1051754307006021632) もちろん MeetUp の方が意図的に自分を助けてくれたということはなく、こうした謝辞自体が主催者側は寝耳に水だったと思います。 ただ、自分はこの MeetUp に参加できたおかげで心理的に助けられたと思っているのでありのままの気持ちを述べさせてもらいました。 子育てしつつ労働もするパパ・ママたちの環境というのは、少しずつ改善はされていきてはいるものの、まだまだ恵まれているものではないと思います(理想を言えばキリはありませんが)。 そんな中でもし自分と同じ境遇だったり自信がつかないパパ・ママが居たら、自分が直接でも間接的にでも、その人達の背中を押してあげるようになりたいなと思いました。 かつての自分が MeetUp にそうしてもらったように。 そんなすくすく! 子育てエンジニア MeetUp の次回開催はまだ未定ですが、興味が湧いた人は是非参加してみてください。 - connpass ページ - [すくすく!子育てエンジニア Meetup – connpass](https://childcare.connpass.com/) - 子育てエンジニア Slack Join - [https://join.slack.com/t/childcare-engineer/shared_invite/enQtMjkxMDE0OTMwMDE3LTNiZmM0NmViZmZkMzMzNjlkM2YzNzI2MmU4ZmRmNGM1NzRiOTIwZjExMmFiZGFiZTVlMjBkNzNiZWQyNWQ2NDI](https://join.slack.com/t/childcare-engineer/shared_invite/enQtMjkxMDE0OTMwMDE3LTNiZmM0NmViZmZkMzMzNjlkM2YzNzI2MmU4ZmRmNGM1NzRiOTIwZjExMmFiZGFiZTVlMjBkNzNiZWQyNWQ2NDI) - 子育てエンジニア Scrapbox Join - [https://scrapbox.io/projects/childcare-engineer/invitations/f61f79a4c64999afc3deb04887af0530](https://scrapbox.io/projects/childcare-engineer/invitations/f61f79a4c64999afc3deb04887af0530) 以上になります。 次回は以下の方々です。よろしくお願いいたします。 - [子育てエンジニア Advent Calendar 2018](https://adventar.org/calendars/3178) – PoohSunny さん - [GEEK Inc. Advent Calendar 2018](https://adventar.org/calendars/3108) – マークアップエンジニア深坂さん --- ## よく分かってなくてもNuxt.jsでPWAが作れた話 https://archives.yamanoku.net/beginner-make-nuxtjs-pwa/ この記事は[PWA Advent Calendar 2018](https://qiita.com/advent-calendar/2018/pwa)の 6 日目の記事になります。 既視感のあるタイトルですが気にしないでください。 毎年何かしら自分のレベルに合わせて新技術に触れてみる・作ってみるみたいなのを課してるのですが、 今年個人的にチャレンジしてみようと思ったものの1つに PWA があります。 毎年何かしら自分のレベルに合わせて新技術に触れてみる・作ってみるみたいなのを課してるのですが、 今年個人的にチャレンジしてみようと思ったものの1つに PWA があります。 そこで今回は大した知識が無くとも PWA を作ることができた話をしようと思います。 内容として他の皆様と大したことやってないかもですが、こんなんでも形になったぞというのを知ってもらいたいのもあるので温かい目で見てくださいませ。 ## Reading… Reading… Logo - Link: [https://reading.yamanoku.net](https://reading.yamanoku.net/) - GitHub: [https://github.com/yamanoku/reading/](https://github.com/yamanoku/reading/) 日頃自分が見ているニュースを集約してまとめてみたらどうなるだろうか、情報の蓄積・可視化みたいなのを考えておりそういうのができないかなと思ってそれを題材に PWA にしてみようと思いました。以下は経緯みたいなやつです。 > [情報収集ってどうしてる? - YAMALT vol.04](https://yamanoku.net/LT/lt04/) ### 動作イメージ [![Reading… iPhoneシュミレーターによる実動作イメージ図](https://gyazo.com/8418eadc1713fd8f083a625706757786/thumb/1000)](https://gyazo.com/8418eadc1713fd8f083a625706757786) 自分が最近見た 20 件のニュース × 5ページ分にした計 100 件を表示。 ページ間はページネーションで動きます。 ### 使用技術 | API | ホスティング | フレームワーク | | :----------------------------- | :----------- | :------------- | | Slack API
AWS API GateWay | Netlify | Nuxt.js | Nuxt.js のプラグイン・モジュールは以下を使用 - [vue-paginate](https://github.com/TahaSh/vue-paginate) - ページネーション。async もあって複数で連携できたり、 - 個人的には色々あるページネーションの中で導入が簡単(な印象) - [nuxt-community/pwa-module](https://github.com/nuxt-community/pwa-module) - 皆様ご存知の Nuxt.js で PWA にするなら必要になる - PWA にしなくともキャッシュ高速化にも使える あと当初は Nuxt1.0 で作成していましたが、今年の 2.0 の発表に合わせて[アップデートしました](https://github.com/yamanoku/reading/commit/6124198e300dc1f8ccc74e14c6b9118e09f36a5d)。 > Nuxt 2 で generate した PWA サイトです > https://twitter.com/yamanoku/status/1043119076489318401 ### フローチャート 図です。 ![フローチャート 以下説明](https://i.gyazo.com/6c87beb1a40364b5520050b0963fa3e9.png) - 投稿自体は Twitter - シェアする内容の文頭に`Reading...`とつけてツイート - 例:[https://twitter.com/yamanoku/status/998900479487692800](https://twitter.com/yamanoku/status/998900479487692800) - 別に「Reading」じゃなくてもいいけど、昔使ってた[ニュースアプリ](http://fladdict.net/blog/2012/10/news-storm.html)の名残で自発的にやってる - 主な発言地帯が Twitter なだけなので、別に IFTTT と連携できるならなんでもいい - DB は個人用 Slack - IFTTT で投稿連携 - Twitter から「Reading...」と紐づけた特定のものを拾ってくる - 連携して個人 Slack に投稿されて全件検索される - [![Image](https://gyazo.com/1948eaf267fa165a4b4b1fef5afff211/thumb/1000)](https://gyazo.com/1948eaf267fa165a4b4b1fef5afff211) - Slack API の制約もあり 100 件までを抽出。古いものは取得内から消えていく。 - なぜ Slack をデータベースにしたのか? - お手軽サーバーレス体験 - Slack 側のメッセージの修正や消去で即 JSON に反映してくれる - 無料で作れて垢バンの心配がない - Twitter 単体だと心配 - 日経の米朝首脳会談の速報ページで前例あり - [こに@SocialDog/whotwi さんのツイート: 日経の米朝首脳会談の速報ページ、気味の悪い拡張子のファイルによると Slack が使われているっぽい。現地から Slack に投稿するとそのまま公開される仕組みっぽい。すごい今風。](https://twitter.com/koni/status/1006452321583271936) - AWS で API Gateway と Lambda Function にて API 変換 - Slack API から直接経由だと制約があってしんどかった - devtools 使うとどの slack から持ってきてるのかとかがわかっちゃう - token を隠蔽しても`nuxt generate`しビルドした JS 内に token とかが見えると警告メールが来て API 止められる(計 4 敗) - [![Image](https://gyazo.com/22343b9c3de68ed9a44d24d81064bc6b/thumb/1000)](https://gyazo.com/22343b9c3de68ed9a44d24d81064bc6b) - 変えてよかったこと - token を完全隠蔽した - CORS 対応したのでどこでも取得できる - gzip 配信もできる - 今のところは自分用なのもあって無料枠で収まる内容になってる - [Netlify Meetup Tokyo #2](https://netlify-meetup-tokyo.connpass.com/event/100705/)で`Netlify Functions`でもいけそうって話を@mottox2 さんから聞けたので Netlify 内で完結できる方向に変えようかと考え中 - [Netlify](https://scrapbox.io/yamanoku/Netlify)でホスティング - [GitHub](https://scrapbox.io/yamanoku/GitHub)リポジトリと紐づけてる - `nuxt generate` & `push-dir --dir=dist --branch=master --cleanup` - 静的書き出しした`dist`を`master`ブランチにプッシュ - `master`ブランチをホスティング - [![Image from Gyazo](https://i.gyazo.com/89e1780586aa0aee4322c9a1cdee3fed.png)](https://gyazo.com/89e1780586aa0aee4322c9a1cdee3fed) - SSL 化やらカスタムドメイン可やらプレレンダリング(今回は未使用)やら無料でやってくれてすごい。 - あとプライベートリポジトリも使える。 ### パフォーマンス #### lighthouse - Device: Emulated Nexus 5X - Network throttling: 150 ms TCP RTT, 1,638.4 Kbps throughput (Simulated) - CPU throttling: 4x slowdown (Simulated) 上記設定で計測。Perfomance 部分は変動ある感じですがだいたいこんな感じ ##### 2018/9/6 計測 [![Perfomance 91, PWA 96, Accessibility 88, Best Practice 100, SEO 100](https://gyazo.com/798f53d86ca89daf3d3d2c02187c44c2/thumb/1000)](https://gyazo.com/798f53d86ca89daf3d3d2c02187c44c2) ##### 2018/12/2 計測 [![Perfomance 95, PWA 96, Accessibility 90, Best Practice 100, SEO 100](https://gyazo.com/62f8aebc83ef63c8637401dca55fa6bd/raw)](https://gyazo.com/62f8aebc83ef63c8637401dca55fa6bd) #### WebPageTest - From: Tokyo, Japan - EC2 - Chrome - Cable 上記設定で計測。 ##### 2018/9/6 計測 [https://www.webpagetest.org/result/180905_90_60fd3b52c101b6aaeb61fda8ac192468/](https://www.webpagetest.org/result/180905_90_60fd3b52c101b6aaeb61fda8ac192468/) ##### 2018/12/2 計測 [https://www.webpagetest.org/result/181202_Q9_0b087ea9b135cf3ee5e8c790e07853a7/](https://www.webpagetest.org/result/181202_Q9_0b087ea9b135cf3ee5e8c790e07853a7/) ### Fixed & Updates あんまり PWA 要素と関係ないかもですが、更新したことなど。 #### ページネーションをクリックするとスクロール位置が保存されたままになってる - 中間くらいまでスクロールした状態で移動するとページ間でその位置のまま - `position: fixed`と`vh`を使っているせい - ページが切り替わったときの制御に`scrollTop`をかませた ```javascript methods: { onPageChange() { document.getElementsByClassName('news-list')[0].scrollTop = 0; } } ``` ```html :show-step-links="true" :limit="2"> ``` #### 絵文字がパースされていない [![🔥の絵文字が :fire: として出力されている](https://gyazo.com/515ea122571f395b03d8be35b82e4469/thumb/1000)](https://gyazo.com/515ea122571f395b03d8be35b82e4469) 単純にパースしてあげればいいのかなと思ったので、 [node-emoji](https://www.npmjs.com/package/node-emoji) を使いました。 [![🔥絵文字が適応された](https://gyazo.com/6586344df213347f483f99f7ea95c014/thumb/1000)](https://gyazo.com/6586344df213347f483f99f7ea95c014) 👍👍👍👍👍 #### ページネーションのボタンアクセシビリティ対応 今回ページネーションのライブラリで使用した[vue-paginate](https://github.com/TahaSh/vue-paginate)ですが、`
`タグのみで`href`で明確なリンク遷移が明示されていない、リンクとして未完成な状態のままでした。 また、`tabindex`指定もないのでタブキーでのフォーカスも効かない状態でした。 そこでページネーションのボタン部分をリンク要素としてではなく`button`タグに変更して、意味あるタグを設置・タブにおけるフォーカスの両方を解消しようと思いました。 ただ、この内容について Issue で報告する・プルリクエストを提出することを考えた時、個人での運用なのでいつ見てもらえるか・かつ受け入れられるかもわからないという不安がありました。 そこで、リポジトリを fork して自分専用用のモジュールを作ったほうが早いと感じたので、早速対応しました。 - [https://github.com/yamanoku/vue-paginate](https://github.com/yamanoku/vue-paginate) [![aタグからbuttonタグに変更してタブキーのフォーカスが効くようになった](https://gyazo.com/42475acc4d4f26575615095b57d77a70/thumb/1000)](https://gyazo.com/42475acc4d4f26575615095b57d77a70) ただ、開閉時の`aria-expanded`ほか WAI-ARIA 部分などはまだまだ対応しきれていないので、今後も改良する余地はありそうです(自前実装になる?)。 #### 今後の更新・TODO など 以下 Scrapbox のページにて順次手作業で更新予定です [https://scrapbox.io/yamanoku/Reading…](https://scrapbox.io/yamanoku/Reading%E2%80%A6) ### PWA を作ってみての感想 - Nuxt.js における PWA 導入が圧倒的にやりやすい・分かりやすいかなと思いました - Vue.js 依存ですが… - PWA だけに限らないですが、何かしら動くものを作ってみると、新しいものがきたらそこから派生してみる・検証することができる - まだまだ改善の余地は大きい部分はあるが試行錯誤していろんなことが検証できるのが楽しい - こうしたらいいよ的なアドバイスお待ちしております(コメントでも Twitter でも) - 今後の派生として、妻を個人 Slack に招待して、家族間での URL 共有みたいなのがやれたらいいかなと思っている - 妻が結構検索しまくって共有してくれる(育児・買い物・行きたいところ等) - 夫婦間での共有を簡易・履歴として残すようにしたい - 自分で PWA を実装してみて Android 実機で動かせるのがこれまでにない感覚で面白かった - ちなみに[ポートフォリオサイト](https://yamanoku.net)も PWA 化しています - GitHub Pages と紐づけているので、配下のページ(リポジトリ)も自動的に PWA 判定になっている? - [Birthday-Countdown.js](https://yamanoku.net/birthday-countdown-js/) など - Service Worker がルートディレクトリで設定されているから? - 実際に PWA として使えるものを使ってみたり検証したりしてみる - Service Worker がどのような感じで使われているかとか - 自分は Twitter はネイティブではなく[Twitter Lite](https://mobile.twitter.com)(PWA 版)のを使うようにしています。 - 企業の制作実体験記みたいなのが気になりだす(業務内でのノウハウや失敗など) - 最近だと HTML5 カンファレンスや 7 月の HTML5 APP CONFERENCE 2018 でその辺が聞けました - [PWA の導入で得られた成果と見えてきた課題](https://speakerdeck.com/sisidovski/nikkei-pwa-html5conf2018) - [Web プラットフォーム再考 ~ PWA のもたらす未来の光と影 ~](https://scrapbox.io/yamanoku/Web_%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E5%86%8D%E8%80%83_%EF%BD%9EPWA_%E3%81%AE%E3%82%82%E3%81%9F%E3%82%89%E3%81%99%E6%9C%AA%E6%9D%A5%E3%81%AE%E5%85%89%E3%81%A8%E5%BD%B1_%EF%BD%9E) - [pixiv chatstory の PWA としての取り組み](https://speakerdeck.com/ikasoumen/pixiv-chatstory-false-pwa-tositefalsequ-rizu-mi) - [モバイルネイティブアプリに代わる存在!?初めての PWA](https://speakerdeck.com/kasanomo/mobairuneiteibuapurinidai-warucun-zai-chu-metefalsepwa) - **iOS マジお前...**となる気持ちがよくわかる 以上になります。ご覧いただきありがとうございました。 明日(12/7)は@*lemon2003*さんになります。 ## 【弊社アドベントカレンダー PR】 [![株式会社GEEK ロゴ](https://i.gyazo.com/a2ce676febed730106792e210ad75eba.jpg)](https://gyazo.com/a2ce676febed730106792e210ad75eba) 最後に宣伝になりますが、私が所属している[株式会社 GEEK](https://qiita.com/organizations/geekinc)でもアドベントカレンダーをやっております。良ければご覧になってみてください。 自分はこのアドベントカレンダーほか色んな所に出張執筆予定です。 - [GEEK Inc. Advent Calendar 2018](https://adventar.org/calendars/3108) - 去年 → [GEEK Inc. Advent Calendar 2017](https://adventar.org/calendars/2422) GEEK アドベントカレンダーの次回担当はマークアップエンジニアの大房さんになります。 --- ## PlayBackTech2018 https://archives.yamanoku.net/playback-tech-2018/ [![Image](https://gyazo.com/48d84dac71d8c0ece8e16379ede834ba/thumb/1000)](https://gyazo.com/48d84dac71d8c0ece8e16379ede834ba) - feat. [平成ドロー生成](https://walkingmask.github.io/heiseidraw/) - 2017 年 => [PlayBackTech2017](playback-tech-2017) ## CSS Grid Layout [![Image](https://gyazo.com/6f82a1382d08fee4cca8e04dea5c4536/thumb/1000)](https://gyazo.com/6f82a1382d08fee4cca8e04dea5c4536) - 今年様々な案件で利用できた - レスポンシブにおける複雑なレイアウトに対応するのに向いている気がする - PC と SP とでレイアウトが異なる時 - PC のときだけ親に wrapper などを挟んで妥協するなどしていたが - 不必要な DOM を書かずに済むようになった - 例:[複雑なフッター階層の配置](https://codepen.io/yamanoku/pen/ZmVRrv) - autoprefixer のおかげで IE 対応もおおよそできるようになったと思う - [CSS Grid の gap(grid-gap)が遂に IE 11 でも再現できるように。Autoprefixer が待望のアップデート - Qiita](https://qiita.com/tonkotsuboy_com/items/10fc250ac579a32e9ee9) ## アクセシビリティ活動 [![Image](https://gyazo.com/9e358448e053d1f1998bd045d413562b/thumb/1000)](https://gyazo.com/9e358448e053d1f1998bd045d413562b) - 去年からやっていくぞみたいなことをやってたので個人的に色々やってみてます。 - WAI-ARIA の導入・実施 - 去年より引き続き - パンくず、ハンバーガーボタン、タブ切り替え、アラート表示などに導入 - タブキーなどのキーボード移動への意識 - A11YJ_Slack への参加 - 質問してみたり色々とながめてみたり - アクセシビリティおじさんたちは非常に頼もしい - 入門書を書いてみた - 後述する技術書典#5 参加において発表 - WCAG の翻訳をされているもんどさんに FB をもらえた(対応遅れてすみません…) - [もんどさんからの FB 対応 – 第 4 章 · Issue #2 · yamanoku/accessibility_book-issues](https://github.com/yamanoku/accessibility_book-issues/issues/2) - [もんどさんからの FB 対応 – 第 6 章 · Issue #3 · yamanoku/accessibility_book-issues](https://github.com/yamanoku/accessibility_book-issues/issues/3) - 社内アクセシビリティ勉強会を開けた - [誰がためにアクセシビリティ対応をするのか?](https://scrapbox.io/yamanoku/%E8%AA%B0%E3%81%8C%E3%81%9F%E3%82%81%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E5%AF%BE%E5%BF%9C%E3%82%92%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F) - プログラマーだけではなく、職務に関わらず誰もが取り組めることを強調 - プロダクトにどう取り組むか?`alt`どうするか? などが議論できた - 株式会社インフォアクシア様が運用している WebA11y.jp に取り上げてもらえた!(嬉しい) - [https://twitter.com/weba11y/status/1065428929165455360](https://twitter.com/weba11y/status/1065428929165455360) - 外部勉強会でも啓蒙してきた - [outline: none;](https://scrapbox.io/yamanoku/outline:_none%3B) - 来年もやっていくぞ! !!!!!!!!!!!!!!! ## Sublime Text から Visual Code Studio の乗り換え [![Image](https://gyazo.com/9a84874ffd2020a35f33fae6e5abe305/thumb/1000)](https://gyazo.com/9a84874ffd2020a35f33fae6e5abe305) - Sublime Text のアップデートにより使えないパッケージがでてきたので物は試しで乗り換えてみた - するといろいろ便利機能があることが判明して無事乗り換え成功した - [Visual_Studio_Code に移行してよかったこと](https://scrapbox.io/yamanoku/Visual_Studio_Code%E3%81%AB%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%A6%E3%82%88%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8) - 統合ターミナル - ESLint / prettier の自動整形 - TypeScript 関連の強さ - `Git clone`機能(拡張) - 最近まで会社のエディタに editorconfig 入ってなくて戦慄した(修正済み) ## ホスティングサービスがアツい - Netlify - [![Image](https://gyazo.com/9f86f8a1f474ab9eb6f3ccbe109795eb/thumb/1000)](https://gyazo.com/9f86f8a1f474ab9eb6f3ccbe109795eb) - 個人的一押しサービス - プライベートリポジトリも無料でホスティングできる - Firebase - [![Image](https://gyazo.com/c6e057f43e4dc45e6a30fa051d61d668/thumb/1000)](https://gyazo.com/c6e057f43e4dc45e6a30fa051d61d668) - 最近人気がある?  GCP よりかは名前をよく聞く - 年収 1000 万いけるらしい - [11. フロントエンドエンジニアのキャリアパス](https://bkkcast.me/011/) - now - [![Image](https://gyazo.com/8ffaa569d5871e67db9ad4292e2aa9e5/thumb/1000)](https://gyazo.com/8ffaa569d5871e67db9ad4292e2aa9e5) - ビルドがめちゃくちゃ簡単 - アプデが頻発 - 昔は Heroku、AWS_S3 だけだった気がするけど、だいぶ競合が増えた気がする - reInvent で新しいのが出たっぽいです - [新サービス「AWS Amplify Console」登場!簡単 3 ステップで Web アプリの CI/CD 環境を構築! #reinvent | DevelopersIO](https://dev.classmethod.jp/cloud/aws/amplify-console/) ## Renovate [![Image](https://gyazo.com/330388a9f5d6d18640bd029b0bf20a0e/thumb/1000)](https://gyazo.com/330388a9f5d6d18640bd029b0bf20a0e) - サイボウズフロントエンド MeetUp の[Teppeis](https://twitter.com/teppeis)さんのスライドで知った - [Automated Dependency Updates with Renovate](https://www.slideshare.net/teppeis/automated-dependency-updates-with-renovate-102769685) - npm パッケージのアップデート自動化をより用意にしてくれた - Pull_Request で通知 - Greenkeeper の上位互換? - パッケージ管理が多い場合はマージを自動化するなどがよさそう - メジャーバージョン以外をマージするので OK? - 特定のパッケージは管理しないなどもできる ## 脱 jQuery の機運を高める - 個人的な目標として jQuery の使用をやめようとしてみた - 今年 GitHub も実施していた - [Removing jQuery from GitHub.com frontend](https://githubengineering.com/removing-jquery-from-github-frontend/) - 何故やめようとしたか - 単純なセレクタ取得は`querySelector`がやってくれる - ライブラリを読み込まなくてもよい(容量) - よしなにしてくれたのを廃止してロジックを理解する - 依存しないコードでほかモダンフレームワークなどに派生できる - 最近のバージョン更新頻度から見て、進化を感じられなくなった - [jQuery 3.3.0 – A fragrant bouquet of deprecations and…is that a new feature? | Official jQuery Blog](https://blog.jquery.com/2018/01/19/jquery-3-3-0-a-fragrant-bouquet-of-deprecations-and-is-that-a-new-feature) - しかし頼るべきところがあればそこは頼る - `offset().top` 周りの挙動 - プラグインを使用したデザイン・仕様 - 結果として - ES6 でモリモリ書けるようになった - 頼っていたことは大したレベルのことではなかったとわかった - 社内の新規開発案件では今後目にすることは無いと思う - リニューアル案件やビジュアル重視とか納期重視だとまだ残るとは思う - なんだかんだで楽なので - レガシーなものを書き換えていきたい欲が出た ## Scrapbox の社内活用 [![Image](https://gyazo.com/5f93e65a3b979ae5333aca4f32600611/thumb/1000)](https://gyazo.com/5f93e65a3b979ae5333aca4f32600611) - もともと自分で使ってみていた - 会社内でもやってみようとのことでクリエイティブチーム内で実施 - [Scrapbox Drinkup #4 Tokyo Edition](https://nota.connpass.com/event/87600/)に参加してみて改めてその凄さを実感 - 社内啓蒙で悩んでたらNota Inc.さんに来てもらって勉強会をやってもらった - [Nota 社主催で Scrapbox 勉強会をやってもらった話 – 株式会社 GEEK クリエイターズブログ](http://blog.geek.co.jp/archives/2411) - 有料使用して現在 680 ページ超え - プロジェクトの Wiki として - 自己紹介ページ - 知見の共有 - 勉強会のメモ残し - 会議の議事録 - デザインレビュー - 社内での意見を募る場として - などなど様々な活用をしてもらっています - スタータープランなども出て、ビジネス利用も今後増えそう? - [Scrapbox 利用期限なし無料の新プラン ”Business Starter”を発表。社内でスモールスタートしよう。](https://medium.com/@scrapbox/business-starter-95c4355a2035) - Nota Inc.様から Scrapbox 情報整理術を献本いただきました。感謝 ## パフォーマンス・チューニング - とあるパフォーマンス・チューニング結果の紹介 - lighthouse Performance 評価 - Before - [![Image](https://gyazo.com/f17c1d5c17a0110f02b1fe6040ab4dd8/thumb/1000)](https://gyazo.com/f17c1d5c17a0110f02b1fe6040ab4dd8) - First Contentful Paint を除き赤点。全体評価として 25 点 - After - [![Image](https://gyazo.com/5d0e20c2072216fbda4757339a7e8211/thumb/1000)](https://gyazo.com/5d0e20c2072216fbda4757339a7e8211) - First Meaningful Paint, Speed Index が合格判定、ほか赤点箇所も秒数をほぼ減らせて合計 53 点 - 初回ロード時のリクエスト比較 - Before - [![Image](https://i.gyazo.com/3695db66547ec47ceeec0ede67462be2.png)](https://gyazo.com/3695db66547ec47ceeec0ede67462be2) - 主に画像や動画などの読み込みが多重化しており、20000ms かかっていた - After - [![Image](https://gyazo.com/eb0aa95ee51f245a875b1843fe94c668/thumb/1000)](https://gyazo.com/eb0aa95ee51f245a875b1843fe94c668) - 遅延読み込みを活用し、初回のリクエストを減らした結果 2000ms という 1/10 の短縮に成功! - lighthouse と少し仲良くなれた - [Lighthouse によるウェブアプリの監査 | Tools for Web Developers | Google Developers](https://developers.google.com/web/tools/lighthouse/?hl=ja) - コンテンツの遅延取得で Intersection Observer 無双した - HTTP/2 が大事だなと感じた - ただ使い所をきちんと理解しないといけない - [HTTP/2 が速いという幻想 - Web パフォーマンスについて](http://takehora.hatenadiary.jp/entry/2017/12/27/011121) - 劇的によくなったというわけではない。パフォーマンス改善とは計測・検証してわずかながらでも数値をあげていこうとする地道な戦いである - [http://azu.github.io/slide-pdf.js/?slide=http://azu.github.io/slide//2018/roppongijs/webpagetest-performance.pdf](http://azu.github.io/slide-pdf.js/?slide=http://azu.github.io/slide//2018/roppongijs/webpagetest-performance.pdf) - **速くするのではなく遅くしない(not-slow)** - [超速本](http://gihyo.jp/book/2017/978-4-7741-9400-4)にはお世話になりました。 ## stylelint - 社内 config のものに sass ルールも追加 - [update stylelint-config · geekcojp/config@eae7a70](https://github.com/geekcojp/config/commit/eae7a70641be2a97832d8b2ec934bae0e7a08cfa) - 要望により depth 周りを設定しようと画策中 ## Nuxt.js で爆速開発体験 - 1 月に 1 系がリリース - 9 月に 2 系がついにリリース - [Nuxt.js 2.0: Webpack 4, ESM Modules, create-nuxt-app and more! 💫](https://medium.com/@nuxt_js/nuxt-js-2-0-webpack-4-esm-modules-create-nuxt-app-and-more-6936ce80d94c) - 2 系が出て[vue-cliで作ったNuxtスターターキットでNuxt1 => 2に上げるやり方](./nuxt-starter-template-v2-migration)というのを書いた - その後、公式が vue-cli で作成するのは**deprecated と発表** - とにかく爆速で開発できるメリットがある - モダン開発環境を一瞬で用意してもらえる - webpack などのバンドル処理周りを気にしなくていい - ディレクトリが決まっている=ルール・規約を制定しやすい - 公式配布のプラグイン周りが豊富 - コンポーネント単位で再利用した設計ができる - scoped css が書ける。CSS 設計思想など死んだ - 爆速静的サイト作成ツールとして認識してもいい - 今年の Adobe MAX Japan のサイトも Nuxt.js 製 - [Nuxt.js による Adobe MAX Japan 2018 公式 Web サイト制作の舞台裏 – Speaker Deck](https://speakerdeck.com/haribote/nuxt-dot-jsniyoruadobe-max-japan-2018gong-shi-websaitozhi-zuo-falsewu-tai-li) - もちろん Vue.js 記法で書かないといけないが大きいデメリットでもないと思う - 社内勉強会を実施 - [Nuxt.js で爆速開発最高だぜ勉強会@2018-11-16](https://scrapbox.io/yamanoku/Nuxt.js%E3%81%A7%E7%88%86%E9%80%9F%E9%96%8B%E7%99%BA%E6%9C%80%E9%AB%98%E3%81%A0%E3%81%9C%E5%8B%89%E5%BC%B7%E4%BC%9A@2018-11-16) - 開発のみならず制作会社としても今後使っていく層はどんどん広がっていきそう ## PWA [![Image](https://gyazo.com/5dec5cb8c410a2ab9238e79a0aee2f0b/thumb/1000)](https://gyazo.com/5dec5cb8c410a2ab9238e79a0aee2f0b) - Progressive Web App - Progressive = 漸進的 - Web をアプリのものに徐々に近づけていく思想 - 以下の条件で構成されている - レスポンシブ - ネットワーク接続に依存しない - Service Worker - 常に最新 - https 通信必須 - Web Push 通知 - manifest.json - ホーム画面へのインストール可能 - HTML5 Conference 2018 でも amp 同様話題にあがってた - つくったやつ - [https://yamanoku.net](https://yamanoku.net/) - ポートフォリオ - Nuxt.js で作成 - [Reading…](https://reading.yamanoku.net/) - 去年の RSS 作成の流れを受けてやってみた - [自分用 rss リーダーを作ろうとした](/playback-tech-2017#自分用rssリーダーを作ろうとした) - 詳しくは [PWA Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/pwa) 6日目にて ## 勉強会・MeetUp・ワークショップ・カンファレンスへの参加、登壇 気がついたら結構参加していた - [参加した勉強会、MeetUp、カンファレンス、ハンズオン](https://scrapbox.io/yamanoku/%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%9F%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%80%81MeetUp%E3%80%81%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%80%81%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3#5afce094c2cd3f0000e0366d) - UIT#5 わたしたちにとっての Vue.js - UX Cafe: チームで取り組む! サイボウズのアクセシビリティ - HTML5 Conference 2018 - We Are JavaScripters! @26th - Vue Fes Japan 2018 Reject Conference - Meguro.css#4 - CI/CD Test Night#1 - Vue Fes Japan 2018 - DIST.23「マークアップを止めるな!」 - NuxtMeetup#5 - すくすく! 子育てエンジニア Meetup#3 - STUDIO Workshop#3 @ OHAKO - Netlify Meetup Tokyo#2 - Roppongi.js#6 - Vue.js Tokyo v-meetup#8 - Roppongi.js#5 - Meguro.css#2 - We Are JavaScripters! @22nd - DXEL.1 エンジニアとデザイナーが「いい関係」を築くために - HTML5 APP CONFERENCE 2018 - さくらの勉強会フロントエンドナイト - Cybozu Meetup フロントエンド#2 - 第 69 回 HTML5 とか勉強会「UI フレームワーク最前線」 - Scrapbox Drinkup#4 Tokyo Edition - Nuxt Meetup#2 - Roppongi.js#2 - 技術書典#4 - すくすく! 子育てエンジニア MeetUp#2 - すくすく! 子育てエンジニア MeetUp#1 - 地味に登壇もしていました - すくすく! 子育てエンジニア Meetup#3 発表資料 📄[scroll handler を捨てよ、Intersection Observer へ出よう](https://scrapbox.io/yamanoku/scroll_handler%E3%82%92%E6%8D%A8%E3%81%A6%E3%82%88%E3%80%81Intersection_Observer%E3%81%B8%E5%87%BA%E3%82%88%E3%81%86) - Meguro.css#4 発表資料 📄[outline: none;](https://scrapbox.io/yamanoku/outline:_none%3B) - We Are JavaScripters! @26th 発表資料 📄[家庭内に Scrapbox を導入してみる提案](https://scrapbox.io/yamanoku/%E5%AE%B6%E5%BA%AD%E5%86%85%E3%81%ABScrapbox%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%E6%8F%90%E6%A1%88) - 来年も引き続き色々参加していきたい ## 技術書典#5 参加 [![Image](https://gyazo.com/bf7b22b3e820bbb41c7f6336a0cc26ca/thumb/1000)](https://gyazo.com/bf7b22b3e820bbb41c7f6336a0cc26ca) - [サークル詳細 | こんのいぬ | 技術書典](https://techbookfest.org/event/tbf05/circle/41130001) - [これからはじめる Web アクセシビリティ - こんのいぬ - BOOTH](https://booth.pm/ja/items/1044446) - 技術書典#4に参加してみて「本を作って発信する」ことに久々に熱を感じた - 昔同人活動をやっていたのも影響あったかも(もう絵も描かなくなりましたが) - なんとなく応募してみたら受かってしまったので何かやってみるかとなった - アクセシビリティの入門書みたいなものを書いたらどうかと思った - 自分の知識を深めるきっかけになる - 啓蒙もできる - アクセシビリティに何かしら貢献できそう - 色々と反省箇所・準備不足な部分があったが、やってみてよかったと思うことが多かった - ただ個人参加すると、欲しいものが入手できないというつらさがあった - この活動を通して、ようやくアクセシビリティ活動の輪に入れたのかなと感じた ## 2018 年もいろいろありましたね(順不同) - Vtuber ラッシュ - 漫画村閉鎖 - WCAG 2.1 の勧告 - Hagex さん - Osushi - メルカリ エンジニア大量雇用 - はてなブログ、SSL 化 - Yahoo!ジオシティーズ終了のお知らせ - はてなダイアリー、はてなハイクサービス終了のお知らせ - 五反田バレー、シブヤ・ビットバレー - mineo 通信の最適化実施 - Twitter User Streams API 廃止 - Pixel3 日本上陸 - [Internet Explorer の今後について – Japan IE Support Team Blog](https://blogs.technet.microsoft.com/jpieblog/2018/07/18/internet-explorer-support/) - 国際信州学院大学 - Node.js 10 系リリース - GDPR - サイトブロッキング騒動 - GitHub、Microsoft 買収 - ニコニコ動画、SSL 対応 - Mac OS Mojave - Chrome アドレス欄からサブドメイン削除 - React Hook の衝撃 - 東京オリンピックボランティア申し込みフォーム - ZOZO タウン社長、月へ行く宣言 - リニューアル国税庁 URL リダイレクト無効 - DX: Developer Experience(開発体験) - 侍エンジニア塾 - [azu さん転職活動開始](https://azu.github.io/open-job-letter/) - WordPress 5.0 リリース(まもなく) --- ## vue-cliで作ったNuxtスターターキットでNuxt1 => 2に上げるやり方 https://archives.yamanoku.net/nuxt-starter-template-v2-migration/ ## 追記(2018/10/26) [![Image from Gyazo](https://i.gyazo.com/e91df68c9bb73a2637ad2fb09da78d64.png)](https://gyazo.com/e91df68c9bb73a2637ad2fb09da78d64) `vue init nuxt-community/starter-template` が公式発表 10/14 で**deprecated**になったようです。 https://github.com/nuxt-community/starter-template/commit/82513c7306563b2dd42c7da3efed57803d25aea2 今後はこんな記事なんぞ参照せず**create-nuxt-app**を使うようにしましょう 👋👋👋 ## Nuxt.js 2.0 Release ! [![Image from Gyazo](https://i.gyazo.com/f8a82a7c384f33360aed3884a2fbdba8.png)](https://gyazo.com/f8a82a7c384f33360aed3884a2fbdba8) [Nuxt.js 2.0: Webpack 4, ESM Modules, create-nuxt-app and more! 💫 ](https://medium.com/@nuxt_js/nuxt-js-2-0-webpack-4-esm-modules-create-nuxt-app-and-more-6936ce80d94c) ついに来ました Nuxt2.0。ということで初心者でもすぐ体験できる Nuxt2 の世界の話をします。 たぶんこのあと`vue-cli`がちゃんとアップデートしてくれると思いますが、それまでの僅かな命だと思ってご覧ください。 ## install npm 5.2.0 以上だったら`npx`使うとラクチンです。 ```bash npx vue-cli init nuxt-community/starter-template nuxt2 ? Project name nuxt2 ? Project description Nuxt.js project ? Author yamanoku <0910yama@gmail.com> vue-cli · Generated "nuxt2". To get started: cd nuxt2 npm install ## Or yarn npm run dev ``` ```bash cd nuxt2 yarn ``` 宗教上の都合で`yarn`を使ってますが別に`npm`でも問題ないです ## package.json 現時点(9/21)ではこうなってると思います ```json "dependencies": { "nuxt": "^1.0.0" }, ``` ここから2にあげる ```bash yarn add nuxt ``` ```json "dependencies": { "nuxt": "^2.0.0" }, ``` ## run とりあえず動かしてみましょう ```bash yarn dev yarn run v1.9.4 $ nuxt ``` [![Image from Gyazo](https://i.gyazo.com/d790ef2cbcef0071a90531d7cbe157e2.png)](https://gyazo.com/d790ef2cbcef0071a90531d7cbe157e2) おっ動いてる [![Image from Gyazo](https://i.gyazo.com/22a2bd507b01a49725c8221be7b93a88.png)](https://gyazo.com/22a2bd507b01a49725c8221be7b93a88) と思いきや`eslint`でなにやらコケてる ## fix 以前@potate4d さんの記事で拝見した[Migrate from isServer to process.server](https://qiita.com/potato4d/items/7b3119c88869d7622a7d#migrate-from-isserver-to-processserver)で該当箇所を修正してみる。 ### before ```js build: { /* ** Run ESLint on save */ extend (config, { isDev, isClient }) { if (isDev && isClient) { config.module.rules.push({ enforce: 'pre', test: /\.(js|vue)$/, loader: 'eslint-loader', exclude: /(node_modules)/ }) } } } ``` ### after ```js build: { /* ** Run ESLint on save */ extend (config) { if (process.server && process.client) { config.module.rules.push({ enforce: 'pre', test: /\.(js|vue)$/, loader: 'eslint-loader', exclude: /(node_modules)/ }) } } } ``` [![Image from Gyazo](https://i.gyazo.com/b0864a60c02e61e7e90d58f43887f7ac.png)](https://gyazo.com/b0864a60c02e61e7e90d58f43887f7ac) エラー消えた! [![Image from Gyazo](https://i.gyazo.com/c0cc3fead577df1aa4edcabc985866a7.gif)](https://gyazo.com/c0cc3fead577df1aa4edcabc985866a7) `build`も動く [![Image from Gyazo](https://i.gyazo.com/394756cc959d76f9ccfa09fd63bfd1ac.gif)](https://gyazo.com/394756cc959d76f9ccfa09fd63bfd1ac) `generate`も動く 以上!!!!!!!!!!!!!!!!!! ## etc 他なにかわかったら追記します。 ### vendor があると警告が出る ```js build: { vendor: [ 'axios', ] }, ``` こういうのがあったと思うんですが、Nuxt2 にアプデしてこのまま動かすと警告が出ます。 ``` ⚠ warn vendor has been deprecated due to webpack4 optimization ``` webpack4 の最適化による非推奨になったためだそうです。 --- ## 熟練者に対する問題 https://archives.yamanoku.net/problem-with-the-skilled/ 普段使い慣れている web サービスの見た目やら UI のデザインをガラリと一新させる。このことでもっとも被害がないのは新規参入者、そして一番被害を受けるのは使い慣れきた熟練者の存在です。以前似非原さんが言及していた「[ユーザーインターフェイスのリニューアルにおけるユーザーの覚えなおしコストについて](http://bugrammer.hateblo.jp/entry/2014/03/15/125317)」という記事でこんなことを書いてありました。 > 熟練者になればなるほど、既存の操作体系に慣れている筈だ。それを考えた場合、そもそも「学習コストを支払う」ということに対して、それほどメリットはない。それどころか「既存の使い方を行いたい」というネガティヴな動機づけになるはずだ。さらにいうと、そもそもそのユーザーインターフェイスのリニューアル自体が、その「既存の使い方」を「間違っていること」として破棄する場合、多くのユーザーは混乱するはずだ。 もし大幅なデザイン変更のあとにそのサービスを使う人が参入してきたとき、その人たちは昔のデザインに関しては何も使うべきではない言葉なので修正してくださいわけですから今の形をすんなりと受け入れると思います。最近だとチュートリアルみたいに一通りの動きの説明があったりして、そこから気に入って使い続けていけば以前から使っている「熟練者」と同じような立ち位置になります。 そしてそのサービスを使わなくなるまでは運営の方針でまた大幅にデザインが変わったりすれば不満を出すかもしれません。サービスを運営する側としては新規ユーザーが常に入ってくることも大事なんですが、同時にヘビーユーザーになりかけ・なっている層をどうするかを大幅な変更の際にもっと議論されてもよいのかもしれません。 --- ## 多様性社会について思うこと https://archives.yamanoku.net/i-think-inclusive-society/ 多様性がだいぶ認められるようになって「声をあげることができなかった勢」が声をあげることができる、ちゃんと正当にみとめられるっていう社会は歓迎したいのだけれども、 それに伴い**ステレオタイプ**であることを非難するというのは絶対あってはならないと思う。あとその権威にあやかってるだけのこととか。 結局のところそれは多様性の社会ではなく **「価値観が変わっただけ」** の社会だから[^1] 「多様性、多様性」と声高にいう人がいたりするけど、それを実現するというのは - (既存の枠が大きければ大きいほど)とてつもなく労力のかかることであったり - 歴史を追っていきなぜそうなっていたのかということを知ってどう変えていくべきかを理解して - しっかり地ならししていかないといけない慎重にやるべき ということをどれだけわかっているのだろうか 〇〇じゃなければ認められなかったのに苦言を呈せるようになったのは、時代が変わって〇〇でも問題なくなったという歴史的な進歩があってこそで、そうした基盤はあった上で見直されるべきことだと思うのだけど 実は〇〇でやることによって生じる問題というのは何かしらあって、そういうのが起きたときにどう対処できるかというのも含めて変えていくべきだと思う。 つまり、目的としての **「何を達成したいのか」** を見ずに 手段としての **「〇〇を認める」** というのを目的としてしまっているのは悪手であるということ。 いま既存のあり方を変えようしてる人は様々な活動や主張をしていると思う そういう人たちがまず実現させたいのは 「多様性であるのを認めてもらう」ことでなく「既存の枠組みをアップデートさせようとしている」のだと自分は思っている アップデートさせるというのは、今までその枠の中で基準として考えられていた項目に新たに項目が追加される、ということだと自分の中で考えている。 そしてその枠で問題が起きたときに、その本質を守るためにどうするかと考えて「やっぱりこの項目が足枷になっている」となれば上述した価値観が変わっただけの社会というもののままで、すべての項目の漏れなく本質を守るということが真の多様性社会なのではないだろうかと考えてみた。 ## 関連 - [本当にお前らダイバーシティが分かってないんだな。これこそいい例だよ。..](https://anond.hatelabo.jp/20181205222003) [^1]: 「おっさんをダイバーシティから除くな」という話 --- ## 「お休み」を家族全体で揃える難しさ https://archives.yamanoku.net/difficulty-of-getting-holidays-together-as-family/ - 自分が有給を取れたとして果たして配偶者も同様に取得できるか?問題が有る - 倫理的なところとして会社が黒い場合むずかしい - 黒くなくとも有給が付与されているのか(半年未満とか) - 残り日数とかの関係とか - 子どもや他家族の体調不良 - 1 人だと別に問題ない話かもだけど、家族だとそうはいかない - 全体の楽しみと 1 人の体調不良は天秤ではかることはできるのか - 場合によっては誰も悪くないはずがなんかもう悲しくなる - この辺は大人数の友達とで旅行に行く感覚に似てるんかと思ったけど、友達とかだったら 1 人欠員でた程度で止まることもないか - 夏休み、冬休みといった子どものみが享受できる大型連休 - これに親が合わせるのは日本じゃ無理だとは思ってる - 1 週間くらいは会社の休みと有給合わせて取って行くのは可能だとは思うが、それ以上はどうだろうか - フリーランスやリモートワークという手段 - 自分で仕事管理するのだから休みに合わせて仕事調整などの融通はきくのかと感じる - しかし家族が「休み」の傍らで自分や恋人・配偶者などが仕事をするのはどうなのか - ここに違和感がなければ問題はないのかもしれない 別に休みを取れないわけではないと思う(取れないとしたら状況や規則が変)。ただ**揃える**ってのは案外むずいなーと感じる。なんとなく。 自分はまだ家長になって 1,2 年くらいしか経っておらず、全体の都合を合わすノウハウが溜まってないだけかもしれないので、ベテラン家長に是非この辺意見いただきたいところです。 --- ## 技術書典4 https://archives.yamanoku.net/techbookfest-04/ 行ってきたよ。 ## 買った本リスト(サークル配置昇順) - マンガでわかる Web デザイン+ Git - マンガでわかる Docker - SOLARSOLFA - Markdown ライティング入門 - nayucolony - こまる UI よくしてみた本 - CANDY CHUPS Lab. - SVG で作ろうローディングアニメーション - TechBooster - The Web Explorer 4 - 吉川雅彦 - IE11 以上対応できもちよく書く CSS - 犬テトラ+ - イヌでもわかるウェブフォント - イヌでもわかる Web Components - Nikkei Engineer Team - 日経電子の本 - ころころぶっくす - "Auth0"でつくる! 認証付き SPA - Web サービス作り隊 - マッチングサービスを開発したら大失敗したのでその理由を解説してみた - カウプラン機関極東支部 - jQuery だって複雑なアプリ作れるもん! - るてんのお部屋 - JavaScript で実行時エラーを起こす 100+の技法 - 愛宕文庫 - 現代 Web フロントエンドデザインパターン - ukyoweb - オレオレ仮想 DOM 作りたいだけだった - 底なし沼の魔女 - Libraries of React - Get ready for Next.js - ねこの手@福岡 - 現場で使える Vue.js tips 集 - 使うべきではない言葉なので修正してくださいと損する CSS - 帝都研究所 - Nuxt tech book - 御苑 ×Lab - CSS をもう一段階レベルアップさせる本 - 東京ラビットハウス - 最新 JavaScript 開発~ES2017 対応モダンプログラミング - JavaScript で覚える暗号通貨入門#1 Bitcoin 完全に理解した前編 - YATTEIKI Project - 今日からはじめる技術 Podcast 完全入門 基本フロントエンドまわりでした。あと yatteiki ### 追記(20180423) 以下もダウンロードにて購入 - 好きなコマンドは dig です - DNS をはじめよう - KUGIBAKO - 初めてのシングルページアプリケーション Vue.js と Firebase で作るミニ Web サービス ## 所感 - 技術書典はじめての参加だったので開始 30 分前につけば御の字かなと思ってたら既に 500 人並んでる状況だった - 自分は整理券番号 671 番目だった - 入り口寄りにあったフロントエンド系の「お〜か」島らへんが密集していたというかたぶん配置失敗してたんじゃないかと思うくらい混雑すごかった - 逆に奥側の方になるにつれて人の行き来もそこまで難しくはない感じだった。次回は今回の件から配置配慮してほしい - 硬貨両替しておいたが、最初入れるか心配だったので使えないのではと思ったが、無事活用できた - 札で払うところを 500 円玉で用意したら喜んでもらえた(計算がアレだったかもだけど) - yatteiki.fm でも言及していた気がするけど中の人が見られるという点ではこうした即売会の利点? だよなと感じる。 - 「技術」書典ともあり、ダウンロード販売しているところもあったり、[かんたん後払いシステム](https://blog.techbookfest.org/2017/10/18/payment/) もあってやはり先進的な即売会だなぁと感じるなど - 万一売り切れてもダウンロード販売が即時対応できるところは強いなーと思った - 技術書ってあくまでも「標準」をめざしたものでかつ高価なものだけど、こうした同人誌としてニッチな内容もとりあげたり自分で掘り下げてみた内容を、(通常と比べて)安価で簡易的に購入できるという場としてはかなりレアなのではないかと思う。 そんな感じでした。もろもろ買い終わって UDX で海鮮丼食ってから家に帰りました。職場が秋葉原に徒歩で行けるレベルなのであとで COMIC ZIN に行ってみます。 こちらからは以上です。 --- ## テンプレートリテラルつかわずに改行してHTML表示する方法 https://archives.yamanoku.net/html-on-new-line-without-using-template-literal/ ちょっとビビった。たしかにそういうやり方があるにはあるのだが。 ```js template: [ '
', '', '
  • ', '{{post.title.rendered}}', '
  • ', '', '', '
    ', ].join('\n'); ``` 参照:https://qiita.com/nanonum/items/a335ba09fc2c2c4e3d5e#htmlcssjs%E4%B8%B8%E3%81%94%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89 配列にして改行を`join`だと…! その手は思いつかなかった…! **だがテンプレートリテラルを使え** --- ## stylelint社内勉強会資料 https://archives.yamanoku.net/stylelint-study-document/ ※このスライドは社内勉強会(18/01/30)にて使用した資料です。公開用に一部修正・改訂などしております。 ## Lint とは コード検査。これを利用するとコード構造の品質に関する問題を特定して修正できる。 ## いろいろある Lint ツール - [JSLint](https://github.com/douglascrockford/JSLint) ... JavaScript の Lint ツール(ルールは決まっている) - [ESLint](https://eslint.org/) ... JSLint よりも汎用性のあるルールの改変ができる Lint ツール - [htmllint](https://github.com/htmllint/htmllint) ... HTML の Lint ツール - [markuplint](https://github.com/YusukeHirao/markuplint) ... マークアップに特化した Lint ツール(開発中) - [commitlint](http://marionebl.github.io/commitlint/) ... Git のコミットメッセージにルールをつける(プレフィックスなど) - [textlint](https://github.com/textlint/textlint) ... 文章やマークダウンの構文チェックツール - etc... ## メリットは? - コードの品質維持 - 制作ガイドラインを逐一確認しなくてもよくなる - どう守れているか? は最悪ターミナルで確認できる。 - ハックを利用しなければいけない書き方を廃絶していける - 「標準的な」コードの書き方が身につく Lint をすることでバグ 0 が実現できるわけではないが(ブラウザチェック・テストコードも別途必要) 全体で **「見通しの良い」コード**は実現できる。 => その結果、後天的なバグを回避できる可能性はあがるので多少なりにも貢献はできている。 ## CLI で試してみる ```bash yarn add --global stylelint yarn install -y yarn add @geekcojp/stylelint-config stylelint --config node_modules/@geekcojp/stylelint-config/index.js styles.css ``` (npm でも可) すぐに使える! ## 公式サイトのデモもあるよ。 https://stylelint.io/demo/ ## ルールは色々ある。 - 「:」の前後にスペースを入れるかどうか - `!important`を書いていないか - 重複したプロパティは無いか - 詳細度、ネストなどは深くなっていないか(数値で調整可能) - プロパティや値が空の宣言箇所はないか - etc... https://stylelint.io/user-guide/rules/ 「クライアントの要望でスタイル上ここのルールは絶対無視しないといけない…!」みたいなことがあった際 => **disable コメントアウトでルールの無視が可能** ## disable 使用例 ```css /* stylelint-disable */ a { } /* stylelint-enable */ ``` もしくは ```css a { /* stylelint-disable-next-line declaration-no-important */ color: pink !important; } ``` ただし、`disable`は出来る限り使わないようにする(したい)。 もしくは他プロジェクトでも頻繁にするようであればルール自体を見直す機会が必要かもしれないので考えてみるなど必要。 独自でルール設定することも可能(`extends`で`@geekcojp/stylelint-config`は読み込むこと) ```js module.exports = { extends: './node_modules/@geekcojp/stylelint-config', rules: { // ルール追記 }, }; ``` ```bash stylelint --config config.js index.css ``` ルールは厳しいルールセットみたいなものから、自分で必要箇所を埋めていく緩いものまで必要に応じて設定できる。 - https://github.com/stylelint/stylelint-config-standard - stylelint の公式推奨ルールセット - ルール制定が分からなかったらこれ入れてみても良さそう ちなみに `@geekcojp/stylelint-config` で参考にしている`.stylelintrc`内容は以下参照 https://github.com/benfrain/ecss-postcss-shell/blob/master/.stylelintrc ※ 社内では[ECSS](http://ecss.io/)の設計思想をベースにコーディングしています `@geekcojp/stylelint-config` は絶賛パブリックなので内容に意義があればプルリクバンバン投げてくれ! https://github.com/geekcojp/config/tree/master/packages/stylelint-config **TODO** - [ ] CHANGE.LOG を書く(どのバージョンで何のルールが追加されたか等) Lint はあくまでも「警告」をするものなので、無視したり気づかなかったりする場合、コードが悪いまま通ってしまう。 => 警告があるものは絶対にコミットなどを通さないような仕組みも必要。 ## husky 🐶 ```json "scripts": { "test": "stylelint", }, "husky": { "hooks": { "pre-commit": "yarn test" } } ``` https://github.com/typicode/husky コミットした時に`test` が作動し(stylelint が動く)、Lint 警告文を出してくれる(無かったらコミットが通る) ## どう動かすのか分からんし時間がない… 試せる下地を作ったよ! https://github.com/geekcojp/stylelint-boilerplate 使うのはこのコマンドだけ! ```bash ## リポジトリclone git clone https://github.com/geekcojp/stylelint-boilerplate.git ## 依存パッケージをインストール yarn ## developモード(gulpを動かす) yarn dev ## or gulp ## stylelint単体動かす yarn lint-styles ``` ## 雑感 - 何事も見るよりやって慣れろ - 問題のある箇所のみチェックしながら書けるのは良い - `!important` は悪しき存在 - これまでの書き方を見直すよいきっかけにもなる。 - 記述スピードは多少上がった気がする - ガイドラインはもう必要なさそう? - config 自体がガイドラインになる ## Lint やっていきましょう 💪 --- ## よく分かってないでvue-cliで作ったVue.js製SPAをアップデートした話 https://archives.yamanoku.net/update-beginner-make-vuejs-spa/ 前回 => [よく分かってなくてもVue.jsで動くモノが作れた話](./beginner-make-vuejs-spa) 特にきっかけはないのですが、表題のまんまのことやりましたので記録です。 ## 以前の環境について - Vue v1.0.0 - vue-cli v2.5.0(おそらく) - vue-router v0.7.13 で作ってました。`vue-router`がまず v2.0.0 でもないというのが驚きですが、いかんせん Vue.js どころか諸々のスキルが低すぎたのもあったので、言われるがままなすがままにこの環境のままでつくりました。 使用した`vue-cli`テンプレートは`webpack-simple`でした。 一応動きます。 https://github.com/yamanoku/vue_portfolio_templete/tree/ver1.0.0 ## 強制アプデして直そうとした まず以前の内容からブランチを切って`npm-check-updates`をかけ`package.json`周りを強制アップデートしてから、諸々インストールして、dev を走らせましたが、早速**webpack からぶっ壊れる**。 ### webpack - `resolveLoader`箇所の`root`を`modules`に変更 ```js resolveLoader: { root: path.join(__dirname, 'node_modules'), }, ``` ```js resolveLoader: { modules: [path.join(__dirname, 'src'), 'node_modules'], }, ``` - `module`箇所の loader 部分に`-loader`接尾語? が必要 ```js module: { loaders: [ { test: /\.vue$/, loader: 'vue-loader' }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, { test: /\.json$/, loader: 'json-loader' }, { test: /\.html$/, loader: 'vue-html-loader' }, { test: /\.(png|jpg|gif|svg)$/, loader: "file-loader?name=[name].[ext]" } ] }, ``` ```js module: { loaders: [ { test: /\.vue$/, loader: 'vue' }, { test: /\.js$/, loader: 'babel', exclude: /node_modules/ }, { test: /\.json$/, loader: 'json' }, { test: /\.html$/, loader: 'vue-html' }, { test: /\.(png|jpg|gif|svg)$/, loader: "file?name=[name].[ext]" } ] }, ``` - `webpack.optimize.OccurenceOrderPlugin()` => `webpack.optimize.OccurrenceOrderPlugin()` - 一番ひどい 1つ1つ調べながら対応していたのもあってなかなか`build`や`dev`が通らず苦労しました。 webpack のほうを修正して npm-scripts 周りが動作するようになったので動かし始めたのですが、お次は**Vue1.x => Vue2.0.0**へのアプデ修正周りです。 ### Vue.js **vue-migration-helper** https://github.com/vuejs/vue-migration-helper 世の中にはマイグレーションヘルパーツールなる優れたものがあるのでこちらを使用しました(変更した部分に関しては後述)。 ターミナルで吐かれたエラーを1つずつ治し、ようやく 0 になってコンソールもエラーなくなったのですが、肝心の vue-router 部分が動かず、ここで立ち往生しました。 1つ1つ見直していけば問題判明できそうというのもありましたが、個人のプロダクトで特に機能も複雑化していないものだったので、1 つずつ手直しするよりも**vue-cli で1から作り直してやろう**という気持ちが勝ったのでやり直しました。 ちなみにですが立ち往生した作業途中もブランチ切って上げてます。どんなのか気になる人は参考までに見てみてください。 https://github.com/yamanoku/vue_portfolio_templete/tree/fail/updates ## vue-cli から作り直し グローバルにある`vue-cli`をアップデートして、前回は`webpack-simple`テンプレートだったので今回は`webpack`を選択しました。余談ですがいつの間にか`pwa`なるものも追加されていたのですね。 さっそく`assets`内に必要ファイルを格納しました。以下変更部分 - `src`内各コンポーネント => `assets/components` - 画像各種 - ソース内で使うもの => `assets/img` - json 内で使用する部分 => `static` - json ファイル - `src/data/list.json` => `assets/data/list.json` `App.vue`と `main.js`は既存のままですが、router 部分の記述は`src/router/index.js`に移動しました。 ## Vue.js 変更箇所 ### `v-for`で回した時に`:key`指定 #### before ```html ``` #### after ```html ``` > 2.2.0 以降で、コンポーネントで v-for を使用するとき、key は必須です https://jp.vuejs.org/v2/guide/list.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A8-v-for ### `v-for`で作成したエイリアス値の属性値での設定 #### before ```html {{list.url}} ``` #### after ```html {{list.url}} ``` `{{ xxx }}`指定が不要になる。 ### `this.$eval` 廃止 以下記事参考にしました。ありがとうございます。 https://qiita.com/tmiame/items/34823b22cd3829321120#eval 以前のは json の画像 URL 部分も一緒に引っかかるのをどうにかしたかったんですがこれで解決しました。 ## `vue-router` 設定時 ### `router.start` #### before ```js router.start(App, '#app'); ``` #### after ```js new Vue({ el: '#app', router, components: { App }, template: '', }); ``` Vue インスタンスに`router`プロパティを渡す。 https://jp.vuejs.org/v2/guide/migration-vue-router.html#router-start-%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88 ### `router.map` #### before ```js router.map({ '/home': { component: Main, }, '/work/:number/detail': { component: Detail, }, '/profile': { component: Profile, }, '*': { component: NotFound, }, }); router.redirect({ '/': '/home', }); ``` #### after ```js export default new Router({ routes: [ { path: '/', redirect: '/home', }, { path: '/home', name: 'Main', component: Main, }, { path: '/work/:number/detail', name: 'Works', component: Detail, }, { path: '/profile', name: 'Profile', component: Profile, }, { path: '*', name: 'NotFound', component: NotFound, }, ], }); ``` redirect 部分も一緒に配列に追加。 https://jp.vuejs.org/v2/guide/migration-vue-router.html#router-map-%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88 ### `hashbang` 機能 不要となりましたのでこちらは削除。 ## vue-router コンポーネント使用時 ### `v-link` 廃止 #### before ```html Back Home ``` #### after ```html Back Home ``` path 指定での記述ではなくなりました。 ### 名前付きルート指定 #### before ```html [{{ list.type }}] ``` #### after ```html [{{ list.type }}] ``` `router.map`設定時に`name`を指定しておくと、ここでルートを特定できて非常に楽になりました。 上記設定でたとえば `href="work/001/detail"` を書き出してくれます。 https://router.vuejs.org/ja/essentials/named-routes.html ### `transition` 指定 #### before ```html
    ``` #### after ```html ``` どこかのタグに対して`transition`属性として付与するのではなく、``タグで独立。 いままで各コンポーネントごとでかけてましたが一括化するために`App.vue`にのみに変更・設定しておきました。 ```html ``` ### `.v-transition` 廃止 `.v-enter-active`や`.v-leave-active`に変更。 ## ほか修正したこととか アプデに伴い、webpack や Vue.js と関係なく修正した部分について ### `flex-box` => `grid layout` #### before ```css .container { display: flex; flex-wrap: wrap; justify-content: space-between; width: 95%; margin: auto; } .container::before { display: block; content: ''; order: 1; width: 22.75%; } .container::after { display: block; content: ''; width: 22.75%; } .card { width: 22.75%; margin-bottom: 2.5%; background: #456a8e; border-radius: 3px; box-shadow: 0 1px 3px rgba(100, 100, 100, 0.25); transition: all 0.25s ease-in-out; } ``` #### after ```css .container { width: 95%; margin: auto; display: grid; grid-template-columns: repeat(4, 1fr); grid-column-gap: 20px; grid-row-gap: 20px; padding-bottom: 20px; } .card { background: #456a8e; border-radius: 3px; transition: all 0.25s ease-in-out; } ``` IE11 は`.card`が`width:100%`になるが、コード量的には減ってすっきり。 ただ、`grid-row-gap`が%指定しても空きができなかった。`grid-column-gap`はできたけど両方に指定はできないか? ### `transition`効果 [![Screenshot from Gyazo](https://gyazo.com/df45ce6f156ec940727777b982b6bbc7/raw)](https://gyazo.com/df45ce6f156ec940727777b982b6bbc7) 下から上に切り替わるような効果にしていたが、もうちょっとスムーズになるように調整したのと、タブレット〜スマホサイズ時は左から右に切り替わるようにした。 [![Screenshot from Gyazo](https://gyazo.com/edd54a09798aee161ecd8895f95b6de5/raw)](https://gyazo.com/edd54a09798aee161ecd8895f95b6de5) ```css .fade-enter-active { transition: all 0.75s ease; } .fade-leave-active { transition: all 0.75s cubic-bezier(1, 0.5, 0.8, 1); } @media screen and (min-width: 769px) { .fade-enter, .fade-leave-to { transform: translateY(100vh); } } @media screen and (max-width: 768px) { .fade-enter, .fade-leave-to { transform: translateX(-250vw); } } ``` あと`height: 100%`での SPA になってるのでページ下部までいって詳細ページに遷移する時にガクッとなる動きがあり違和感があったため、router の`scrollBehavior`を使って詳細ページ時はページトップへ遷移(`setTimeout`で transition 部分の時間と調整)して、それ以外はページ位置を保持しておくという設定もつけておきました。 ```javascript routes: [ ... { path: '/work/:number/detail', name: 'Works', component: Detail, meta: { scrollToTop: true } }, ... ], scrollBehavior (to, from, savedPosition) { if (savedPosition) { return savedPosition } else { return new Promise(resolve => { if (to.matched.some(m => m.meta.scrollToTop)) { setTimeout(() => { resolve({ x: 0, y: 0 }) }, 750) } }) } } ``` まだ精度としては微妙なのでスタイル部分も合わせて見直す必要ありそうだけど、まぁいいかとなってます。 ## ToDo - [ ] `vue-head`入れて meta 情報周り整える - [ ] 左メニュー一覧のレイアウト作成 - [ ] テンプレートから作成したが、これを個人単位でメンテできる構成にできるか。 - [ ] pwa 化できるか。これはおそらく Nuxt.js でやったほうがよさそう ## 雑感 - CLI ツールとは便利なものであり、`vue-cli`は未だに初学者に優しいテンプレート作成ツールである。 - ただ、どんな便利な CLI ツールにしろアップデートされた機能・廃止された機能ほかも合わせて調整、最悪マイグレーションヘルパーみたいなのがあればいいが、そういうのはない。 - たぶん CLI ツールを使い運用していくにはバージョンアップの都度、テンプレートも更新できているか、きちんと保守できるかどうかなど徹底的に付き合う必要はある。 - `vue-cli`3.0 以降でこの辺の煩雑な機能などを見直す予定とのこと(下部関連リンク参考) - 今回のは大した機能もなく1からやり直せる範囲だったのでどうでもよかったが、規模が大きかったり機能が煩雑だったりするとこれの比ではない苦労や地獄が待っている可能性がある。 - なので個人的な1発ネタや突発性のある簡易的なツール、練習やどのような構成で動かすかの勉強としては自由に使っても良い。 - ただ自分できちんと動かしたり保守できたりするにはそれらに頼らない環境構築をしなければならない(上記 ToDo 3件目で言及済み)。 - CLI ツールがどのようなものかを理解すればいいけど現状の自分にはそこまで読み解く力はない。 - これは`vue-cli`、Vue.js に限らず、あらゆる点で大切なことだと思う。 - _You know, I learned something today._(サウスパーク並の感想) ## 関連リンク **Future of Vue.js (vue-cli について)** https://speakerdeck.com/player/7d437d38c31b46318998d120b2d9c929?slide=60 **vue-router 日本語ドキュメント** https://router.vuejs.org/ja/
    --- ## Route53でドメイン買ってACMでSSL証明書発行してCloudFrontでGithub Pagesと買ったドメインと紐付けた https://archives.yamanoku.net/aws-route53-acm-cloudfront-with-github-page/ ## 追記:2018/05/02 Github 側でカスタムドメインでも SSL 化対応してくれるようになったそうです。 CloudFront よくわからん、AWS ヤダみたいな人は無理しなくても良さそうです 😇 https://blog.github.com/2018-05-01-github-pages-custom-domains-https/ ## なにこれ タイトル通りの手順です。流れなので長いのはお許しください。 0からでもうまいことやれたので備忘録として書きました。参考までにどうぞ。 ## 事前準備 - AWS へのアカウント登録関連は完了しておく - メール認証・クレカ登録などお忘れなく - Github Pages 作成 - 無料垢でも OK ## Route53 でドメインを買う - Route53 にアクセス。 - 「Register Domain」ボタンよりドメイン購入手続き - [![Screenshot from Gyazo](https://gyazo.com/1909db49bec796d6b74ac77ecfed36e9/raw)](https://gyazo.com/1909db49bec796d6b74ac77ecfed36e9) - 購入したいドメイン名を入力 - 欲しい TLD(.com, .net, .org など)を選択 - 「Check」ボタンより購入可能なドメインを検索 - [![Screenshot from Gyazo](https://gyazo.com/cf376fabe3486d6eb63e1251df94e7e0/raw)](https://gyazo.com/cf376fabe3486d6eb63e1251df94e7e0) - 「Add to cart」で欲しいドメインをカートに追加 - ページ下部の「Continue」ボタンで次へ - [![Screenshot from Gyazo](https://gyazo.com/b0a01a379736ad1532a5686602ea2419/raw)](https://gyazo.com/b0a01a379736ad1532a5686602ea2419) - 購入者入力画面で各種入力 - [![Screenshot from Gyazo](https://gyazo.com/d4d87e3de77816c712fc21b60107bc69/raw)](https://gyazo.com/d4d87e3de77816c712fc21b60107bc69) - 「Privacy Protection」項目は特に考慮することがなければ **Hide contact information if the TLD registry, and the registrar, allow it** にチェック - [ドメインの連絡先情報のプライバシー保護の有効化/無効化箇所](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/domain-privacy-protection.html) になります。 - 入力後、問題なければ「Continue」ボタンで確認画面に遷移 - 「Terms and Conditions」の同意確認箇所にチェックを入れ、「Complete Purchase」ボタンで購入確定へ - [![Screenshot from Gyazo](https://gyazo.com/b0959d18ff3a0a9bc131e7c060dea8bb/raw)](https://gyazo.com/b0959d18ff3a0a9bc131e7c060dea8bb) - メールにて購入完了の旨を受け取る。ドメイン購入はこれにて完了。 - 下図は実際に買ったときのやつ - AWS Certificate Manager に移動 - [![Screenshot from Gyazo](https://gyazo.com/b12ce54876c9078d4f5a56f4bc8fd9a4/raw)](https://gyazo.com/b12ce54876c9078d4f5a56f4bc8fd9a4) ## AWS Certificate Manager - 右上のリージョンが「バージニア北部」になっていることを確認 - なっていなかったら選択 - CloudFront で使用する際に必要 - [![Screenshot from Gyazo](https://gyazo.com/e0cbe3bbc2412f31a873994c9c171384/raw)](https://gyazo.com/e0cbe3bbc2412f31a873994c9c171384) - 「証明書のリクエスト」をクリック - [![Screenshot from Gyazo](https://gyazo.com/ea43c6b77f7daa425750617e7687e93f/raw)](https://gyazo.com/ea43c6b77f7daa425750617e7687e93f) - ドメイン名の追加で先程購入したドメインを入力して「次へ」をクリック - [![Screenshot from Gyazo](https://gyazo.com/5a965cfe4fe959080d69fe97c73489c9/raw)](https://gyazo.com/5a965cfe4fe959080d69fe97c73489c9) - 証明書のリクエスト検証は DNS にして「次へ」をクリック - [![Screenshot from Gyazo](https://gyazo.com/7492dbf9ddb80adf96005530188916ae/raw)](https://gyazo.com/7492dbf9ddb80adf96005530188916ae) - 確認で問題なければ「確定とリクエスト」ボタンをクリック。 - [![Screenshot from Gyazo](https://gyazo.com/00ff6b2169bf0ec63124959a96bbe5f3/raw)](https://gyazo.com/00ff6b2169bf0ec63124959a96bbe5f3) - その後遷移する確定後の画面より「続行」ボタンをクリック。 - ダッシュボードに遷移して、検証保留中になっているのを確認したら CloudFront に移動 - [![Screenshot from Gyazo](https://gyazo.com/d3b93a580edf975761e57c5206a6e640/raw)](https://gyazo.com/d3b93a580edf975761e57c5206a6e640) ## CloudFront - 「Distributions」ダッシュボードが開いているのを確認して、「Create Distribution」をクリック - [![Screenshot from Gyazo](https://gyazo.com/0e310f558925fc82235158f32597e8bd/raw)](https://gyazo.com/0e310f558925fc82235158f32597e8bd) - Web の方の「Get Started」をクリック - [![Screenshot from Gyazo](https://gyazo.com/a62fcd9dca6394d764f93b6d6ef552c5/raw)](https://gyazo.com/a62fcd9dca6394d764f93b6d6ef552c5) ### 01. Origin Settings - 「Origin Domain Name」に自分の GitHub page を入力 - ここでは GitHub page の URL =インデックスページという想定です - [![Screenshot from Gyazo](https://gyazo.com/a6f565bcc0cd5749338eb8db11087d73/raw)](https://gyazo.com/a6f565bcc0cd5749338eb8db11087d73) ### 02. Default Cache Behavior Settings - 「Viewer Protocol Policy」を**Redirect HTTP to HTTPS** - 「Cache Based on Selected Request Headers」を**Whitelist** - 「Whitelist Headers」で**Hosts**を Add - [![Screenshot from Gyazo](https://gyazo.com/4e7f2fb903010864627793bd8b4b9760/raw)](https://gyazo.com/4e7f2fb903010864627793bd8b4b9760) ### 03. Distribution Settings - 「Alternate Domain Names(CNAMEs)」に適応させるドメインを入力 - 「SSL Certificate」は**Custom SSL Certificate**を選択 - このとき AWS Certificate Manager で作成した SSL 証明書が選択できると思うのでそれを選択 - [![Screenshot from Gyazo](https://gyazo.com/45f194497695a27eff634d943475298b/raw)](https://gyazo.com/45f194497695a27eff634d943475298b) - 01~03 までを入力したら「Create Distribution」ボタンをクリック - その後生成された「Domain Name」(d から始まるやつ)の URL をコピー - [![Screenshot from Gyazo](https://gyazo.com/76a42865ccb51d7f3519bc6d07ca1477/raw)](https://gyazo.com/76a42865ccb51d7f3519bc6d07ca1477) - コピーした URL が見れる状態になってるかを確認 - アクセスできるのを確認したら Route53 に戻る ## Route53 - 左メニューより「Hosted Zones」を選択、ダッシュボードに購入したドメイン名あるのでクリック - 「Create Record Set」ボタンをクリック - [![Screenshot from Gyazo](https://gyazo.com/75aa0fa79e8c62940ad33d62308e2555/raw)](https://gyazo.com/75aa0fa79e8c62940ad33d62308e2555) - Name は空で OK - Type は A - Alias は Yes をチェック - Alias Target に先程コピーした URL を貼る - 「Save Record Set」クリックで追加 - [![Screenshot from Gyazo](https://gyazo.com/30d54d9938cd894da5972f2d6b385edb/raw)](https://gyazo.com/30d54d9938cd894da5972f2d6b385edb) ## Github - GitHub Pages のリポジトリに移動 - 「Settings」タブより設定ページに移動 - [![Screenshot from Gyazo](https://gyazo.com/b795df7853711780c14fda9f17a406c2/raw)](https://gyazo.com/b795df7853711780c14fda9f17a406c2) ### GitHub Pages - 「Custom domain」箇所に購入したドメインを入力、Save - DNS の浸透がまだだとはじかれるかもなので、10 分くらい待つのとか、CloudFront の Status が Deployed になっているかなど確認した上でやる - [![Screenshot from Gyazo](https://gyazo.com/cd4592176a225ad12c31d4dad40e106e/raw)](https://gyazo.com/cd4592176a225ad12c31d4dad40e106e) ## 反映を確認 🎉🎉🎉 [![Screenshot from Gyazo](https://gyazo.com/b1faf5eca06214f17314f3330e2ae58a/raw)](https://gyazo.com/b1faf5eca06214f17314f3330e2ae58a) ## 感想 - AWS、自分で1から触るのは始めてなので DNS 浸透なり証明書が無効だったりと色々ありしんどかった。 - ただここまでやっておけばある程度動かせる下地ができる感じなのでやっておいてよかった - ドメイン買うのももっと安くやる方法もあるだろうけど、AWS サービス間で設定するなら全部まとめてやるのが分かりやすいかなと思ったのでこの手法で良かったと思う ## 参考 - [Github Pages でホスティングしつつ、CloudFront を使ってサイトを SSL 対応の独自ドメインにする](https://qiita.com/kechol/items/9609e1ab4a673e05b613) - [CloudFront を利用して独自ドメインの GitHub Pages を HTTPS 化する](https://qiita.com/iogi/items/82618c1d56abba6b9337) - [CloudFront からカスタムオリジンまでの通信を HTTPS 化する方法を 2 パターン](https://dev.classmethod.jp/cloud/aws/2way-to-use-https-from-cloudfront-to-custom-origin/) - [Route53 と CloudFront で独自ドメインの GitHub Pages を HTTPS 化した](https://blog.pinekta.tech/aws/2017/02/21/sslchange/) - [AWS Route53 ドメイン取得から Certificate Manager での証明書作成まで](https://qiita.com/sk565/items/2da1fc0c5fc676f54994) --- ## マークアップエンジニアから見たNuxt.jsの可能性 https://archives.yamanoku.net/markup-engineer-think-nuxtjs/ この記事は[Vue.js #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vue2)の 21 日目の記事です。 去年も参加させていただいたのですが、今年は4つもカレンダーが作成されて Vue.js の勢いすごいですね。 今回、自分がこの記事で書く内容は特にテック的なことではなく、`Nuxt.js`への感想記事や思い出記事みたいなのになりますので、`Nuxt.js`の技術的な内容を期待していた方はすみません。こういった人間もいるのか程度にご覧いただけたら、という感じです。 今回、自分がこの記事で書く内容は特にテック的なことではなく、`Nuxt.js`への感想記事や思い出記事みたいなのになりますので、`Nuxt.js`の技術的な内容を期待していた方はすみません。こういった人間もいるのか程度にご覧いただけたら、という感じです。 ## テンプレートエンジン・プリプロセッサの多様化 いきなり`Vue.js`、`Nuxt.js`という主題から脱線してしますがご了承ください。 Node.js というものが世に出てから、おそらく、宗教上の理由などを抜きにすれば、HTML や CSS を素で書くことはなくなったと思います。いわゆるテンプレートエンジン・プリプロセッサの時代。 人々は HTML を`Pug`(`Jade`)で書いたり、CSS を`Less`、`Sass`、`Stylus`といったもので書くようになったおかげで作業効率は格段にあがったと思います。ここに各種タスクランナーを組み合わせれば更に恩恵を受けられるものになることでしょう。 とくに`Pug`というものと出会って、マークアップエンジニアとしての自分は今まで SSI や php での処理しかできなかった「共通化」部分を実現して静的に出力できるというのは感激ものでした。たとえば、 ```pug doctype html html(lang="ja") head meta(charset="UTF-8") meta(http-equiv="X-UA-Compatible" content="IE=edge") meta(name="viewport" content="width=device-width, initial-scale=1") body block contents ``` みたいな感じにして ```pug extends _tmpl block contents h1 Hello World! ``` な感じで出力すると ```html

    Hello World!

    ``` みたいな感じになります。あとは変数での宣言も出来るので先程の`_tmpl.pug`に以下のように`param` という変数を設定して ```pug doctype html html(lang="ja") head meta(charset="UTF-8") meta(http-equiv="X-UA-Compatible" content="IE=edge") meta(name="viewport" content="width=device-width, initial-scale=1") block param title #{title} meta(name="description" value=description) meta(name="keywords" value=keywords) body block contents ``` 以下のようにして出力すると ```pug extends _tmpl block param - var title = "なにかのサイト" - var keywords = "キーワード1, キーワード2, キーワード3"; - var description = "なにかしらの説明"; block contents h1 Hello World! ``` こんな感じで、ページ毎に共通のものと、そのページ独自のメタデータなどを静的ファイルとして入れ込むことができます。 ```html なにかのサイト

    Hello World!

    ``` これを今まで手動ですべて管理していた身と考えれば革新的だったのがわかると思います。 ## フロントエンドとの境界線をどう超えるか問題 自分がマークアップエンジニアとして仕事をしてからは、上記のようなテンプレートエンジンやプリプロセッサを駆使して業務を行っていたのですが、まれに JS 開発におけるフロントエンド領域の仕事依頼がくることがあります。 マークアップ上ではせいぜい`VanillaJs`や`jQuery`を使用して身軽なアニメーションや状態の管理などは行えました。しかしガッツリとしたフロントエンド業務であれば、様々なモジュールを駆使して、`npm`コマンドや`browserify`や`webpack`などを駆使してバリバリ開発しているわけで、そういったものを通常では使用しない人間にとっては、環境設定の時点で大きな障壁となっていたりします。 自分自身としてもそうしたフロントへの境界線をどう飛び越えていくかについて思い悩みつつも、先人が敷いてくれた環境設定というレールの上で、どのような軌跡をおってきたかを逐一調べながらやるしかなかったので、いきなりバリバリと進められるわけでもなく、どうやって段階を追ってやっていけばいいのかをヤキモキしていた時期がありました。 ## Vue.js との出会い そんな自分でも何かうまく扱えるフレームワークはないかと調べてみた所、どうやら Vue.js というものが分かりやすいという情報を仕入れ、昨年に、稚拙ではありますが、SPA なるものを作り上げるところまでできました。[(去年の記事)](./beginner-make-vuejs-spa) なるほどこうして動かせるのかと理解を進めるのと同時に、「[vue-cli](https://github.com/vuejs/vue-cli)」というコマンドラインから簡単にプロジェクトを作れるものを知って、参入障壁というかどうやっていけばいいのかの理解を進めるのにはもってこいでした。 もちろん他のフレームワークでも近しいものがあるかもですが、フレームワークの明快さと馴染みのある感じ、そして`vue-cli`という存在において、`Vue.js`は自分にとって道を切り開いてくれる開拓者のような存在でした。 ## Nuxt.js を知る そんな中、`Vue.js`からの派生フレームワークで今年バージョン 1.0 がリリースされた`Nuxt.js`というものの存在を知りました。 [![Screenshot from Gyazo](https://gyazo.com/0a683b30754e8e77285eb23fd5230cb0/raw)](https://gyazo.com/0a683b30754e8e77285eb23fd5230cb0) 最初は`Vue.js`を使って SPA や SSR といった開発が容易にできる! といった評判を聞いており、自分は「へ〜こういうのがリリースされたのね」という感覚で受け取っていて、あとで触ってみるかなーという感じで、知った当時はそれほど興味なりはそこまでといった感じでした。 時は変わって 10 月某日、さくらインターネットさんに開催していただいた「[さくらの夕べ 「さくらインターネットのエンジニアは Vue.js をこんな風につかってます](https://connpass.com/event/67740/)」に Vue.js 関連の話をやるとのことで参加してきました。=> ([レポート記事](http://yamanoku.hatenablog.com/entry/2017/10/31/%E3%80%8C%E3%81%95%E3%81%8F%E3%82%89%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AF_Vue_js_%E3%82%92%E3%81%93%E3%82%93)) その中で@esukei さんが Nuxt.js に関連してを紹介していただいたのですが、ひとつ自分の中で引っかかったとある機能がありました。 それは **静的ファイルを出力する** という`nuxt generate`コマンドがあるということでした。そしてそれをもとにウェブサイトを作れるのではないか? という内容をおっしゃられていました。 先述したように、これまでマークアップエンジニアとしての私は各種テンプレートエンジンやプリプロセッサ、そしてタスクランナーを使い業務を行っていました。 それはそれで問題なかったのですが、**CSS の管理問題**や**コンポーネントとしての共通化**、そして**JS 部分との連携**も考えねばならないのに、それぞれを別個として出力させて、合わせたときにどうなるかを考えなければならなかったというのがあります。 そういった部分を解消しうる静的なマークアップ環境が整う都合のいいものは何か無いだろうか…と考えていました。 その問題をおおよそ解決しうるプロダクトとして`Nuxt.js`、そして`nuxt generate`というものがなのではないか、と感じました。 ## Nuxt.js の良さそうな所 ### ディレクトリ構成が明瞭的 Nuxt.js は取っ組みやすい[スターターキット](https://github.com/nuxt-community/starter-template)を用意してくれているスグレモノで`vue-cli`を使えるようにして以下で作成できます。 ```bash $ vue init nuxt-community/starter-template test ``` ```bash ? Project name test ? Project description Nuxt.js project ? Author yamanoku <0910yama@gmail.com> vue-cli · Generated "test". To get started: cd test npm install ## Or yarn npm run dev ``` で上記プロジェクト名やプロジェクト説明、著者の入力をエンターでタンタンターンッとやって、作成したディレクトリ(上記で言うと test)に移動するとこのような構成になっています。 ``` ├── assets ├── components ├── layouts ├── middleware ├── pages ├── plugins ├── static └── store ``` ディレクトリの詳細は[公式ページ](https://ja.nuxtjs.org/guide/directory-structure)を参照いただければ、と思いますが、単純にページのみをつくる想定で考えると、 ``` ├── components(パーツ集) ├── pages(ページ単位) └── static(画像ほか静的なファイル置き場) ``` 最悪これだけでもページ作れると思います。必要なものは適時追加いただければという感じで。 ここで良いなと感じる部分は**どこに何を担当しているのかを一見して分かりやすい**というのがあります。なのでこれはここに入れておくというルールも固定化できると思います。 ### 詳細な環境構築が不要 ここから開発をはじめるにあたり、まず`npm i`か`yarn`でモジュール一覧をダウンロードするのですが、通常であれば`webpack`だったり`gulp`なりのビルドツールやタスクランナーを設定することがあると思いますがそれらは不要です。 必要なモジュールほかは`npm i -D`や`yarn add -D`で追加して`import`などで導入できるのですが、ここから CSS フレームワークなども簡単に設定できます。例えば ```bash yarn add -D bulma ``` このように追加した後に、以下`nuxt.config.js`に以下を追記すると、 ```js module.exports = { head: { css: ['bulma/css/bulma.css'], }, }; ``` 全ページ共通で`bulma.css`が使えます。 ### 1ソース完結、scoped CSS 革命 `Vue.js`をベースとしているので、1ソースの中で、`html`、`css`、`JavaScript`をそれぞれ書ける利点があります。さらに、`html`には`pug`と`css`には`sass`、`less`、`stylus`のプリプロセッサ言語も使用できちゃいます。 コンポーネント設計や AtomicDesign における個々のパーツを管理する設計思想が流行ってはいますが、`Nuxt.js`はそれを実現しやすいものだと思っています。 そして CSS 管理においては`scoped CSS`を使用すると、コンポーネントやレイアウト、ページ単体の CSS 管理ができます。 [![Screenshot from Gyazo](https://gyazo.com/3ba66219ffec42b5e34e50a659d165f4/raw)](https://gyazo.com/3ba66219ffec42b5e34e50a659d165f4) こうすると [![Screenshot from Gyazo](https://gyazo.com/a72042dcd05dfb09e4b085f427e1cf95/raw)](https://gyazo.com/a72042dcd05dfb09e4b085f427e1cf95) クラスにユニーク名が付与されてこういうことができます(画像のは Nuxt.js ではないのですがイメージとして)。 @yassh さん投稿による「[vue-loader の Scoped CSS のスタイルが子コンポーネントのルート要素に効いてしまって辛い](https://qiita.com/yassh/items/7fb75904de19ff3bd3e8)」といった仕様の問題もありますが、使いこなせば強力な武器になるのではないかなと思います。 ### ES6/ES7 も対応できる&トラインスパイルしてくれる JavaScript のナウい書き方にもバベルで対応しているので、レガシーな書き方からも脱せそうです。 ### ``情報も簡単に設定できる こうした JS フレームワークにおいて、`meta`情報などの`head`要素を弄るのはあまり情報がなかった、bundle された js を置く index.html に設定するだけと思うのですが、共通であったり各種ページでの個別設定も簡易的にできます。 先程登場した`nuxt.config.js`で以下設定できます。 ```js module.exports = { head: { title: 'test', // 部分 meta: [ // metaタグ関連 { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, { hid: 'description', name: 'description', content: '説明文説明文' }, ], link: [ //linkタグ関連 { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }, ], }, }; ``` さらに個別ページでは以下のような個別設定も可能です。 ```html <template> <h1>{{ title }}</h1> <!-- => <h1>Hello World!</h1> --> </template> <script> export default { data() { return { title: 'Hello World!', }; }, head() { return { title: this.title, // => <title>Hello World! meta: [ { hid: 'description', name: 'description', content: 'My custom description', }, // => ], }; }, }; ``` ### PWA 化も楽々導入。 話題の PWA に関しても`pwa-module`を追加すると利用できちゃいます。以下 manifest 設定と icon.png を`static`に追加しておくと簡単に作成できます。 ```js module.exports = { modules: ['@nuxtjs/pwa'], manifest: { name: 'testApp', short_name: 'shortName', title: 'test', 'og:title': 'ogtest', description: 'appDescription', 'og:description': 'ogDescription', lang: 'ja', theme_color: '#ffffff', background_color: '#ffffff' } workbox: { dev: true, //開発でもPWAができる } } ``` これでオフラインでも確認できる静的ページを作成できちゃいます。 ## Nuxt.js の悩ましい所 上述した点はプロダクトを利用する面で良さ気なところでしたが、すぐに導入するには難しいところもあります。 ### minify される点 `yarn generate`で`dist`ディレクトリが作成されると、生成された`html`は基本 minify されています。 そのままでよければいいのですが、出力されたファイルを確認したいときに可読性がわるくブラウザのデベロッパーツールで minify 解除するなどしないと階層化されている内容をみれないです。 どうやら minify 制御は`nuxt.config.js`内では`html-minifer`を使用しているので`generate`内で以下のように設定してみると多少なりの制御はできるみたいです。ただ思い通りの調整をするにはもう少し調査が要りそうです。 ```js generate: { minify: { collapseBooleanAttributes: true, collapseWhitespace: true, decodeEntities: true, minifyCSS: true, minifyJS: true, processConditionalComments: true, removeAttributeQuotes: false, removeComments: false, removeEmptyAttributes: true, removeOptionalTags: true, removeRedundantAttributes: true, removeScriptTypeAttributes: false, removeStyleLinkTypeAttributes: false, removeTagWhitespace: false, sortAttributes: true, sortClassName: true, trimCustomFragments: true, useShortDoctype: true }, } ``` 関連: https://nuxtjs.org/api/configuration-generate#minify ### 同ディレクトリ内に違うファイルを作成できない これは自分の知見不足なのかもしれませんが ``` pages ├── index.vue └── one ├── two.vue └── index.vue ``` このような構成の場合に`generate`を動かすと ``` ├── index.html └── one ├── two │ └── index.html └── index.html ``` という感じで`one/two.html`というファイルは作成されません。この辺は router の設定次第なのかなと思いますが、少々不便です。 ### Vue.js を前提としているための学習コスト&他フレームワークで再利用ができない 当たり前な部分ではありますが、`JavaScript`部分を動かすには多少なりとも`Vue.js`を理解しておく必要はあります(個人的な感想ではありますが他のものと比較すれば理解はしやすいかなと思いますが)。 また、他のフレームワークやモジュールなどを利用することもできないので、もし Vue.js 以外のフレームワークを使っていたりするときは選定する技術にするかを考える必要はあるかなと思います。 ### まだまだ情報が少ないので知見を集め続けなければならない 公式日本語ドキュメントもある`Nuxt.js`なのですが、まだまだ出て日が浅いのもあるのと、制作事例も少ないため「こうするにはどうすればいい?」という情報共有がまだ少ないかなという印象です。 上述した不明点もすぐ調べてわかれば良いのですが多少のググり力がないと厳しい or 見つからない場合もあるので、「こうしたときにどうすればいいのか?」というのを出来る限り埋めておかないと厳しいかなとは思います。 [公式の Issue](https://github.com/nuxt/nuxt.js/issues)などを眺めてみるとどうすればいいのかなどの話はちらほら見れます。 ## 導入は難しいかもしれないが、動かしてみる価値はある。 メリット面とデメリット面を自分なりに上げてみましたが、1つのプロジェクトを無事完結するためにはまだまだ難はあるかなと思います。もしかしたら、前よりも効率が落ちる可能性もあるかもしれません。ですが、動かしてみる価値はあるのではと思っています。 今後`Nuxt.js`を使った案件として実績をあげるためにも、まずは個人的に動かしてみるのと、これまでに携わった案件でどこまで代用できるのか、というのを考えてみると良いのかなと思っています。そうすればどの点で有利でどの点で不利になるかが明確になるんじゃないかなと感じます。 今回はマークアップの視点で考えてみましたが、SPA や SSR を簡単にやってみるなど「試してみたかったことをアレコレやってみる」最初のきっかけとしてはかなり導入の敷居が低いと思うので、どんどん利用者や利用実績が増えていけばいいなぁと感じています。
    --- ## CSSとわたし、正義と悪、そしてこれから。 https://archives.yamanoku.net/css-advent-calender-2017/ この記事は [CSS Advent Calendar 2017](https://qiita.com/advent-calendar/2017/css) 16 日目の記事です。 テック的なことを書こうかと思いましたが、これまでの人生を振り返ってきて自分にとっての CSS とは何か、そしてこれからどうやっていくべきかみたいなことを書こうと思います。Qiita に書くのもあれな内容と判断したのでブログの方にしました。 ## 「はじめて公開された」CSS 自分が、個人の制作物以外で「世の中の人に初めて公開された」CSS はこちらになります。 [https://github.com/yamanoku/gwe2012/tree/master/css](https://github.com/yamanoku/gwe2012/tree/master/css) なんだかよくわからないものばかりになっております。自分で推測しますが、どこかしらのテンプレートから拝借してそのまま置いてみた感じかなと思います。まぁ当時の独学でアレコレやったド素人が書いたものなのでそんなもんです。 美術系の大学出身[^1]なのですが、一応サイトを作れる人間だったので当時の卒業制作展のサイトを勝手に担当していました。 卒業年が 2008 年なのですが当時は iPhone が出回り始めて、いわゆる「スマートフォン対応」というものを徐々にしていかないといけない時代だったと思います。当時の自分はレスポンシブ対応することまではできなかったなりに、「PC は PC の体験を、SP は SP の体験をすべき」という考えをもとに SP ページを用意して `.htaccess` でユーザーエージェント判定をして振り分けなんぞやってました。 当時の有名美大の卒業サイトと見比べると月とスッポン、いや比喩することすら失礼にあたる可能性があるくらい出来は微妙なのですが、素人なりに真新しいことは無理にやらず、ちゃんと情報にたどり着ける阻害しないようなスタイル、そして CSS は分けてスタイルも分割するなんていう生意気なことをやっていたんですねぇ(ただし内容はグダグダな感じです) ## CSS2 => CSS3 さて、思い出語りから話をガラリと変えてしまいますが、CSS3 というものがこの世に出てからどれくらいが経ったのか皆さまはご存知でしょうか。 調べたところどうやら「CSS2.1」が確定された 2011 年より策定が進んでいる[^2]とのことで、誕生? から6年ほど経っているようです。 先程紹介させていただきました卒業制作展サイトにも CSS3 Media Queries を使用したり、box-shadow 要素や gradient、border-radius といった要素を使用しておりました。 これまで自分の中で CSS というものはサイトにある要素を「整える」ものという認識でいて(今もそんな感じかとは思いますが)、キッチリとやるために必要なものだと思っていました。 それが CSS3 になって、より多彩な表現の幅を広げてもらえるものになったと思い、当時は画像などで対応せざるを得なかったものを CSS で対応してくれる革新性には驚かされました。 CSS とはこんなにも自由なものなのになったのか! それはとても素晴らしいことだと当時の私は感嘆しておりました。 ## プリプロセッサ、ポストプロセッサとの出会い 手書きで CSS を書くことが当たり前だった私が転職先で「えっ素で CSS 書いてるの…マジ…?」と言われるくらいには古いやり方だったようで、双方に驚きがあったようです。 素の CSS を弄る時代はいつの間にか終わっており、代わりに Less、Sass、Stylus といったプリプロセッサ言語で楽に CSS を書ける、管理しやすくすることが出来ることを知ってから、世界はこんなにも広かったのか! というような気がしました。 中でも Stylus との出会いは特に衝撃的でした。何故かというとインデントで階層管理して、あの煩わしかった{}やコロンも省略可能で記述スピードを爆速にしてくれるのには感動しかありませんでした。 出力された後に調整する「ポストプロセッサ」なる autoprefixer、minify、PostCSS といったものにも触れ、ブラウザごとのバージョンに合わせて、または CSS の機能を拡張してくれるなど、これらもまた私にとっては大変重宝しているものたちでした。 ## 「設計思想」というものがある これまで CSS についてなんとなくで書いてきた私でしたが、仕事をしたり、インターネットを潜っていると「世の中には CSS 設計思想というものがある」ことを徐々に知りました。 有名どころですと、OOCSSSMACSSFLOCSSBEMなどでしょうか。 設計思想とはいわば、CSS をこういう風に切り分け・管理・拡張すると運用や再利用がし易い設計となるのではないかという考え方をもとにそれぞれのアプローチが提案されています。 自分が業務として体験してきたのは、SMACSS、BEM、そしてECSSです。 当初は BEM を使った設計を全面的に目指そうと考えていたのですが、ECSS が我々の業務内での設計と fix するのではないかと考え、今は ECSS をベースとした設計思想で作成しています。 これまでの経験則として、ファイル数は増えるがもっとも追加や更新のコストを軽減しうるものではないかなと感じています。 ## CSS は世間で「忌み嫌われている」言語だった そんなこんなで便利なツールや意味のある設計思想を使って CSS を書くことが楽しくなってきた筆者にとある避けられない事実を突きつけられました。 それは CSS は - 「明確な解決法もなく」 - 「保守しようにも破綻しかねない」 - 「一番考えるのが煩わしい」 言語ということだったのです。 おいおいそんなこと言うなよ! こんなにも素晴らしく楽しい世界にそんなことなんて…そう思って私が振り返ってこれまでの CSS を見てあることに気づきました。 「同じように生み出された style.css なのに、よく見ると…ルールや内容が全然違っている…!」 クライアントワークを行う上で、要件や仕様というものが決まっていると、それに準拠するために設定などを見直す必要がでてきます。また、外部の方に制作を依頼するときも少しでも綻びがあるとそこから新たなるルールが発生してこちらがオーバーライドしかけるという事態も起こり得ていたのでした。 加えて運用案件においてもソースコードが誰かしらの手に渡り、制作意図もうまく伝わらぬまま変わり果てた style.css となって残り続けているものもあり、それをメンテナンスしなければならなくなるということもあったそうな(この段落はフィクションです)。 もちろん下準備した我々がそうした事態を考慮できてなかった問題もあるのですが、それにしてもここまで顔が違くなることはあるのか? 多少の設計やプリプロセッサは違えど、何故みんな同じようにできなかったんだ?などかつての思い描いていた何でもできる素晴らしい CSS は一体何処へ…? ## もしかしたら CSS を誤解していたかもしれない そうした失敗への気付きから今一度 CSS についてを考え直していました。 こんな書き方をしてしまえば身も蓋もないのですが、よほど長期運用するサイトであったとしても、万能薬として効く設計思想やプリプロセッサ、そしてそれをもとに得られる、再帰性があり可読性も高く更新しやすい CSS を生み出すということは、まず難しいということです。 これは CSS 自体が悪いものなのか、と考えることもできるのですが、私自身はそうではなく、**むしろそうした CSS に合わせられないサイト設計、UI 設計が良くないのでは?** というある種の責任転換みたいな、しかしながらそうしない限り破綻が続くような考えを持つようになりました。 「なんでや! 自由度の高いサイトデザインができなくて何が Web や!」という意見もごもっともだと思います。 ですが、結局のところウェブに残るものとは文化資産に近いそれらだと思っており、そういった文化をメンテもできない冗長性しかないもので管理するのはいかがなものか…とも考えられるのです。 なので、極端ではありますが、現状 CSS との付き合い方はこうするしかないのかなと思っています。 - サイト設計や UI 設計といったものをメンテナンスできて要素を更新するにも容易に対応できるものとした上で、正義の CSS を生み出す - 新たなクラスをどんどん生み出し、他のセレクタなどに影響を出さないことを前提とした闇鍋のような悪の CSS を生み出す 極端過ぎる。でも結局はどちらかになると思ってます。 ただ、正義の CSS を生み出すために、CSS に対してみんなで優しくしろ、という訳ではないと思っています。 何故かというと、CSS に優しい設計を考える上で、CSS 以外もきちんとどう運用すべきか、どう管理すべきか、どう設計すべきかなどが徹底されて初めて成り立つものだと思っているからです。 だから世間で忌み嫌われている CSS は、自由度が高すぎるがゆえに「なんでもしてくれる床上手な処女」のような空想上のものとどこかで錯覚しているのかもしれません。CSS もほかの言語と変わらぬきちんと運用されないと破綻されるものと一緒なのです。 ## CSS を見直すヒントたち そんな CSS たちをどうやって見直していけばいいか? という部分においてヒントとなりえそうなものがあるので紹介していきます。 ### 宣言ブロックは慎重に精査する [宣言ブロックの CSS 設計 | Web Design KOJIKA17](https://kojika17.com/2017/07/css-architecture.html) kojika さんのブログでも述べられていたように、CSS においてプロパティや値を管理する宣言ブロックについてはあまり意識していなかったようにも思えます。 たしかにどこかで `!important` を入れてしまうとそれをオーバーライドするために元あった宣言ブロックのルールが破綻してしまいかねないことや、汎用的に使いこなしたいのに width 指定やテキスト方向などが変更できないものなど、想定していたものと別の形になってしまうことがあります。 こうした事態を避けるためにもデザインの確認やある程度余白を意識した宣言を書くようにしないといけません。割とタグに直接書く悪習はなかなか治らないので、そこで左右されないように大元をも見直すことも大事かと思われます。 ### stylelint における品質維持 JavaScript の構文チェックに使用される eslint という Lint ツールがあるのですが、それの CSS 版 Lint ツールに「Stylelint」というものがあります。 CSS を綺麗に整形できているか? 統一化された書き方ができているかという面で有用なのですが、他にも「!important を使っていないか?」「階層を深くしすぎていないか?」「プロパティが重複していないか?」などの宣言ブロック関連のチェックをしてくれるものもあります。 標準の Lint ルールが割とすぐに使える(エラーも少なめ)なところもあるので、必要な部分を徐々に継ぎ足して、ルールをもった可読性のある CSS を実現させましょう。 ### コンポーネント指向におけるパーツごとでの管理 正義の CSS を生み出す上で、私の中での1つの解として考えているのがコンポーネント管理です。 レイアウト、ページ、パーツという単位で切り分けそれらを組み合わせる…いわゆるアトミックデザインのそれに当たりますが、とにかく範囲をぶつ切りして影響範囲を減らしていく過程というのは必要なのだと思いました。 そういう意味では Nuxt.js というプロダクトがまさに適応しうるのでは? と考えております。CSS に関しては style scoped が使用できるので、より閉鎖的に他とバッティングすることもなくセレクタの命名問題点も解消できるかもしれません。 ただ、問題点を解消できる参入しやすいプロダクトだと思うのですが、まだまだ汎用的に使用するには有用な情報が少ないので、「まだ」確実な一手とはなってないかと思います。ですが参考にしうること(ディレクトリ構成など)は多いと思います。 他にも React を Vue ライクにする one-loader というプロダクトもあるみたいです。 [https://github.com/digitalie/one-loader](https://github.com/digitalie/one-loader) ## 正義の CSS をやっていこう 上記3点の他にも解決しうるものは探せば出てくると思うのですが、それをこれからすぐにやり始める・導入するというのもなかなか難しいことのように思えます。何故ならこれからの CSS を失敗しないようにしても、これまでのものを無かったこと・解決したことにはならないからです。贖罪とはならないのです。 私自身も数多くの「悪の CSS」を生み出し続けてきました。生み出してきたものを無かったことにすることはできませんが、彼らをもう一度、正しい方へと導いていくことはできるかもしれません。そのためにも何故こういう状態になっているのか・どうすればまとめられるのかを見直していくことが必要になります。 ですが、かつては皆が信じてやまなかった「正義の CSS」として作られていたはずのものであるならば、実現しようとしていた正義の片鱗のようなものがどこかにあるはずです。そこを頼りにかつての正義(もしくは新たな希望)を取り戻しに行くことはできるかもしれません。[^3] 最後にこの言葉をもって終わりとしたいと思います。ご覧いただきありがとうございました。 > 悪に報いるには正義をもってし、善に報いるには善をもってせよ。 > > 孔子 [^1]: 今は学部ごと移動して事実上の消滅 [^2]: [https://allabout.co.jp/gm/gc/376450/](https://allabout.co.jp/gm/gc/376450/) [^3]: もしかしたら最初から破綻を前提とした「純粋悪な CSS」も存在すると思いますが、その場合は闇に葬り去るか完全にリセットした方がいいかもしれません --- ## HTMLからウェブサイトのあり方を見直す。 https://archives.yamanoku.net/revisit-web-from-html/ [![Image from Gyazo](https://i.gyazo.com/42acf3b5c065db36cd9ef55287a47549.jpg)](https://gyazo.com/42acf3b5c065db36cd9ef55287a47549) ## そもそも HTML とは何なのか? みなさんは HTML ってそもそも文書として扱われているもの、ということをご存知でしたでしょうか? 原点に戻ってみて、HTML とは一体なんなのかを考えてみましょうか。検索してみると、 > **「ハイパー・テキスト・マークアップ・ランゲージ」** というのがわかるとは思いますが、結局なんのこっちゃとなりますがもう一度見直してみましょう。 > **「ハイパーテキスト」** そう、すんごいテキストなのです。すんごいテキストをマークアップしてる言語なのです(?)。 元々は[科学文書などを世界的に共有するためにつくられたもの](https://www.w3.org/TR/HTML51/introduction.HTML#background)ではありましたが、W3C やブラウザ開発している会社などにより HTML は進歩を遂げ、いわゆる Web アプリやブラウザゲームなど、様々なことができるものとして認知されてきました。 しかし、そうした進化を重ねてきた HTML であったとしても、結局のところ、**HTML は文書ファイル**であるという事実は何ら変わっておりません。 我々は普段ネットをブラウジングしていて何を見ているのかというと**HTML を見ています**。 厳密に分類すれば php や JS などのサーバーサイド側で解釈して HTML として出力するのもありますが、それはともかく**HTML を見ています**。 見ている内容は人それぞれ、いろんなものがあるでしょう。 ブログ、ニュース、キュレーションサイト、動画、SNS…などなど。興味の幅や種類というものが各々違ってはいると思いますが、共通して言えることは**マークアップされた HTML 文書を皆が閲覧している**ということです。 ## きれいなマークアップとは正しい文章を書くこと 次に HTML 文書の中身を見ていきましょう。 HTML は head と呼ばれるメタ要素、ここでは **「文書のタイトルや説明」** についてがあたるもの、と body と呼ばれる文書の **「本文」** にあたるものから成り立っています。 head はあくまでもその文書が何かを指し示すものでここではあまり重要ではないのですが、本文にあたる body には様々なタグ、いわゆる文書を構成するために必要なパーツがあります。 文書を構成するパーツは**見出し(h1,h2,h3…)**、**強調分(strong)**、**引用文(blockquote)**、**セクショニング(section)**、**段落(p)**、**水平線(hr)**、**改行(br)**、**画像(img)**、そして**リンク要素(a)**など。 > 参考:[http://www.htmq.com/HTML5/](http://www.htmq.com/HTML5/) [![Image from Gyazo](https://i.gyazo.com/188538b4613879fd49782950a81cfb43.png)](https://gyazo.com/188538b4613879fd49782950a81cfb43) このパーツたちを見て、なにやら既視感みたいなものを感じるかもしれませんが、社会人や大学生だったら普段よく目にする Microsoft Word といった文書作成ツールが持つものと同じ要素で出来ております。そう考えると HTML というものにより親近感が湧いてはこないでしょうか?(湧かなければそれはそれで大丈夫です) そうしたことを踏まえて、マークアップエンジニアの私が常々思うことは、HTML を綺麗に書けるかどうかは**文章をしっかりと書ける技術があるかどうか**ではないかということです。 もちろんただ相手に理解できればいいということで文書体系みたいなのを考えなくてもよいことはあるかもしれません。ですが、どういった相手でも・どんな状況下でも伝わる、共有し合えるものを作るためには、体系を学び・どういった構成をすべきなのかを実現させるほかありません。 HTML には正しくマークアップできたかを調べるバリデーターがあり、マークアップに従事している人ならば品質チェックとして必ずチェックするものかと思います。この工程は正しい文書を実現させる上で必要な**校閲作業**と似たものだと思ってください。 正しくマークアップできていればそのサイトやページは文書としてルールを遵守できたページと担保されます。逆にエラーや警告が残念ながら出てしまう場合は、ルールを見直してしっかりと校閲していく必要があります。 我々マークアップエンジニアは、人間やブラウザ(マシン)が、きちんと理解できるような文書を作り出せることをモットーに日々頑張っております。 ## サイトの文書構造を理解する一番いい方法 [![Image from Gyazo](https://i.gyazo.com/28fed5d2d299723b7f591f9e868cd58a.png)](https://gyazo.com/28fed5d2d299723b7f591f9e868cd58a) [![Image from Gyazo](https://i.gyazo.com/f0168b9e16edf385c59f6a838985108b.gif)](https://gyazo.com/f0168b9e16edf385c59f6a838985108b) これは簡単なことで、適応しているスタイル CSS を外すと分かりやすいと思います。**要は素の状態の HTML**を見る。 Chrome のエクステンションで CSS を無効化にするものもありますのでこれを使ってみましょう。 [https://chrome.google.com/webstore/detail/css%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%8F%E3%82%93/locapbphgfloicmncpgmjnglfepfjfbm?hl=ja](https://chrome.google.com/webstore/detail/css%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%8F%E3%82%93/locapbphgfloicmncpgmjnglfepfjfbm?hl=ja) たとえば日経電子版のサイトに行って先程のエクステンションを作動させると… このような感じで、装飾抜きのテキストと画像のみの状態になります。 この時に皆さんにしていただきたいのが、普段見ているサイトはいったいどういった順番でパーツが並べられているのか、ナビゲーションとして機能していたものも装飾を外すとこのような内容になっていたのか等、HTML 文書として**どのような構造・骨組みとなっているか**です。 気になるあのサイトの CSS をとっぱらって骨組みだけにしたら…いったいどうなるでしょうか? ここからはあなたの目でたしかめてみてください。 ## 「クソ酷いウェブサイト」が教えてくれること [![Image from Gyazo](https://i.gyazo.com/309de70e04de5416f94f664c02828545.png)](https://gyazo.com/309de70e04de5416f94f664c02828545) 今年5月くらいに注目が集まった「[クソ酷いウェブサイト](https://toshimaru.net/motherfuckingwebsite/)」についてを皆さんはしっていますでしょうか。 このサイトは JavaScript・jQuery や CSS での装飾、その他ソーシャルウェジェットや大きな画像も使うことなく、ただ HTML でのセマンティックなマークアップだけで表現された何の変哲もないウェブサイトです。 内容や言いたいことはサイト全文を参照してくれればいいのですが、私はまさにこれこそが本質的な HTML なのではないかと感じます。何故ならば、 - どの端末化でも認識できる - どういった内容であるかが分かりやすい - セマンティックな構成ができている - 「ページ」としての機能を果たしている といった要件を満たしているからです。 誤解なきように伝えると、このサイトのようなことを皆が目指してほしいという訳ではないです。ただ、ユーザの希望しない過剰な装飾・ウェジェットを大量に貼っていたりするならば、ここから学ぶべきこと・考え直してみることは大いにあるのではないでしょうか。 ## おわりに 色々と書きましたが、自分の HTML の書き方が誰がどう見ても・機械判定としても 100%の判定のものを必ず書けているわけではないです(保険みたいな書き方ですみません)。 ただ、その判定や点数といったものを日々上げていけるよう知識のアップデートや書き方の見直しなどを試行錯誤している次第であります。 当たり前の話ではありますが、今までも・これからもきちんとしたマークアップをしていきたい所存であります。 フロントエンド界隈では、様々な技術や設計思想が跋扈して繁栄と同時に混沌をも極めております。 ですがそうした中だからこそ今一度初心にもどって、我々はインターネットを通じていつも何を見ているのか、そして我々ウェブ業界で生きるものたちは何を見てこの世界にやってきたのかを改めて見つめ直すことを忘れてはいけないような気がしてなりません。 **「HTML とは何なのだ?」** **「それは誰のためのものなのか?」** **「そして私たちはそれとどう付き合っていくべきなのか?」** _ーーー 願わくば、幸せなインターネットを。_ --- ## Qiita記事のコードスタイル部分を以前のやつに戻すChrome Extension作った https://archives.yamanoku.net/comeback-qiita-code-style-chrome-extension/ ## 経緯 Qiita がサイトリニューアルされて、記事内のコード部分の色がガラッと変わり、個人的に見づらかったのでなんとか変えたかった。 メインブラウザが Chrome なので Extension で自動的に変わるみたいなのがあったらいいなと思って作った。突発的に作って、個人的に使う程度のものなのでストアには登録してません。 ## 内容 やってることは至極簡単で、読み込まれたら``の直前にオーバーライドされた CSS を読み込むようにしているだけ。 ```js document.head.insertAdjacentHTML( 'beforeend', '', ); ``` `manifest.json`で以下の設定するのがミソっぽいです ```json { "web_accessible_resources": ["style.css"] } ``` ## デモ [![https://gyazo.com/923e0fd8f4151121597121378f848b9d](https://i.gyazo.com/923e0fd8f4151121597121378f848b9d.gif)](https://gyazo.com/923e0fd8f4151121597121378f848b9d) ラグありますが、読み込み完了したら反映みたいな感じです。 ## Github https://github.com/yamanoku/Qiita_Code-Style_Before ここからクローンなりダウンロードでディレクトリ落としてもらってデベロッパーモードで追加してください。いらんかったら削除ください。 自分がよく見る分は補完してますがこの言語のここが対応していないなどあったら Issue かプルリクでもおなしゃす。 ## 参考 - https://qiita.com/sqrtxx/items/19fd2114430e9e1fb57f - https://developer.chrome.com/extensions/manifest/web_accessible_resources - https://developer.mozilla.org/ja/Add-ons/WebExtensions/manifest.json/web_accessible_resources --- ## PlayBackTech2017 https://archives.yamanoku.net/playback-tech-2017/ [![Image from Gyazo](https://i.gyazo.com/baf0bffa88a384d25b672d4f9cecaa62.jpg)](https://gyazo.com/baf0bffa88a384d25b672d4f9cecaa62) ## Velocity.js - アニメーション案件で使用してみました。 - これまで CSS3 アニメーションなりで無理やり動かしていたところをぬるぬるアニメーションさせたい用に検討。[jQuery]と親和性があるのでバリバリ使えました。 - 公式がドキュメント更新してなかったので知らなかったけど調べたら`pause`と`resume`というのがあった。 - [Velocity.js 一時停止・再生機能について](./velocityjs-pause_and_resume-functions) - 付随して、GPUでの処理(position 要素の廃止、transform の使用)、will-changeの存在などパフォーマンスは出来る限り高められるような設定などもしました。 ## ES5 => ES6 対応 - マークアップ案件とかだとなかなか Webpack もバベる機会もないので個人的に変換しつつ勉強しています。 - https://lebab.io/ - 実際のコードをここで変換してみてどう置き換わるかなどの検証や勉強に使ってます。 - 個人リポジトリの JS も ES6 対応しつつあります。 - https://github.com/yamanoku/birthday-countdown-js/releases/tag/v2.0.0 - jQuery とアロー関数は最悪の組み合わせとのことで、jQuery を捨てる1つの材料となりそう。 - [jQuery とアロー関数の微妙な関係](https://qiita.com/mogya/items/1d6a0eadc7e0f9d2982b) - [jQuery を使うときに安易にアロー関数を使ってはいけない(戒め)](http://www.pandanoir.info/entry/2017/11/04/190000) ## Docker + WordPress [![Image from Gyazo](https://i.gyazo.com/69af6f1b89ec88b2af36e7988f45af44.jpg)](https://gyazo.com/69af6f1b89ec88b2af36e7988f45af44) [![Image from Gyazo](https://i.gyazo.com/2e2cbb5e6bc6f1531149f12f0d43c31d.png)](https://gyazo.com/2e2cbb5e6bc6f1531149f12f0d43c31d) - 社内案件で Docker を使っていたので個人的にもなんか使えないかと画策。 - WordPress を動かすのがちょうどチュートリアルとして良さそうでした。 - [docker-compose を使って WordPress テーマ開発環境を構築しよう](https://tech.recruit-mp.co.jp/infrastructure/post-11266/) - docker-compose を覚えた。以下自作 WP テーマを公開してるリポジトリで使えます。 - https://github.com/yamanoku/malachite - 内製アプリで使えるようになるだろうか、色々試作してみたい(機会があるのか?)。 ## Flexbox - 去年よりもレイアウトのためにバリバリ使うようになりました。`clearfix`はそろそろ卒業。 - むしろ`clearfix`といった疑似要素があると`justify-content`のときに邪魔になる場合も… - 均等割付した折り返し Flexbox の最後の行 - `order`や`flex-grow`とか`flex-shrink`には地味にお世話になったかも。 - あと`column-reverse`とか。 - 来年はGrid Layoutも考えていきたい。 - [CSS Grid Layout – Can I use](https://caniuse.com/#feat=css-grid) - [これからの CSS は margin 禁止!?CSS グリッドレイアウトやコンポーネント指向な CSS について、矢倉さんに聞いてきた!](https://html5experts.jp/shumpei-shiraishi/24439/) ## Intersection Observer がもたらすスクロールイベントにおける革命 - いままでスクロールをさせてイベントを発火させていたところを、ウィンドウや要素・コンポーネント同士が交差するときを監視してイベント発火させるようなものに変更してみた感じです。 - [Intersection Observer が良さそうなので試してみた](./intersection-observer) - inview.js ほか scroll イベント動作といった負荷がかかったり、管理が煩わしかった部分を解消してくれた気がします。 - polyfill でなんとかなってるので今後も積極的に対応していきたいです。 - `` ## きれいなマークアップ、WAI-ARIA、アクセシビリティについて - 今年、個人的にはマークアップエンジニアとして、意識的に取り組んでみた内容かもしれない。 - `div`要素で作ったパンくずやナビゲーションには、`aria-*`属性付与するようにしてみた(ページのカレント状態など) - `
    カレントページ
    ` - https://www.w3.org/TR/wai-aria/ - 注釈ほか`role`要素、フォーカスのあたらない div 要素への`tabindex`の設定など、少しずつではありますがユーザビリティを蔑ろにせず、アクセシビリティもじんわりと改善しています。 - [Japan Accessibility Conference](https://japan-a11y-conf.com/)にも参加してきました。 - 結局のところ、WAI-ARIA に頼らずともちゃんとしたマークアップが出来ていればだいぶ機能的にかつアクセシビリティ面でも評価されるとのことなのでちゃんと書こうとなってます。 - HTML もデザイン通りの組みとしてよりかは「マシンリーダブル」らへんを意識して順番を変えるなどしてみました。 ## TypeScript、Storybook - 業務でやってみたいというエンジニアに合わせて体験してみた感じ。 - https://www.typescriptlang.org/ - 正直な所「すごく便利」という認識まで個人的においつけなかったのが反省点。 - とはいえ型定義しておくことのメリット・重要性みたいなのは理解した。 - とりあえず覚えたのは`any`で宣言しとけばなんとかなるということです(雑) - Storybook も活かしきれるまでには至らず、また、React.js v16 にて互換性がなかったため見送り。 - 企業別 Storybook 集 => https://storybook.js.org/examples/ - 関係ないですけど、React16.2 からの Fragment 用の新しいシンタックスが出て`div`で括らなくなったのすごくいいですね ```jsx render() { return ( <>

    React v16.2 has been released!

    Introduces a new syntax for fragments!

    Thanks to all our collaborators! ); } ``` # PostCSS [![Image from Gyazo](https://i.gyazo.com/2599c040c415d83db1ebc75e021bfd45.png)](https://gyazo.com/2599c040c415d83db1ebc75e021bfd45) - 社内的には Stylus をこれまで使用していたが、更新があまりない(2~4 年前の)CSS プリプロセッサだったので、改めて一体どのようなオプションだけが必要なのか・PostCSS 自体も業務に導入すべきかなどあった上で自分の方で試してみた感じです。 - 感想としては css 単体で使うよりも sass や less などに付随させて必要なものを動かすのがてっとり早いという感じ。 - プリプロセッサのオプションじゃまかない切れないものを継ぎ足すイメージ。 - https://github.com/luisrudge/postcss-flexbugs-fixes - これはすごくて感動しました。 ## GitHub 開発、CircleCI、CodeClimate - 社内で GitHub での開発がスタート。1案件+社内ツールプロジェクトなどでジョイン中。 - https://github.com/geekcojp - メリットとしては GitHub 用のツールとの連携とかで、いままで backlogのリポジトリ内管理だったので、いろんなことが出来ることが知れてよかった。 - [backlog 上で案件・進捗管理をしていた自分が Github に触れてみた感想](./thinks-of-backlog-to-github) - 自動化ツールの CircleCI ほか CodeClimate についても体験。やはり間違いを減らす・機械的に判定してもらうというのは良い。 - ただ一時期開発中にエラーばかり吐いてバツマークが付きすぎてたので`ci skip`を多用していた時期がありました。 ## stylelint、csscomb - CSS 周りの設定で stylelint を使用してみてます。 - ターミナルでエラーがでるようになってそれを直す矯正マシーンみたいな感じですが、逐一ルールも確認せずとも教えてくれるので便利。 - 弊社は ECSS の設計思想で CSS 書いてますが、それに付随した stylelint もドキュメント内にあったので、内容を少し更新してそれを派生させて動かすようにやってます。 - http://ecss.io/chapter9.html#stylelint - あと csscomb もコンフィグ化してみた。以下自分用ですが。 - https://www.npmjs.com/package/@yamanoku/stylelint-config - https://www.npmjs.com/package/@yamanoku/csscomb-config - 共通で使えるパッケージ、モジュールを作ってパブリックでいつか公開します。 - もちろん TSLint や ESLint とかも使ってます。 - htmllint や textlint も今後導入しようとかいう感じです。 ## Vue.js、Nuxt.js [![Image from Gyazo](https://i.gyazo.com/3a2a2919e156d721277ae29ebc7a9eae.png)](https://gyazo.com/3a2a2919e156d721277ae29ebc7a9eae) [![Image from Gyazo](https://i.gyazo.com/ad0755fc9babcc4f48c7080944f04ac4.jpg)](https://gyazo.com/ad0755fc9babcc4f48c7080944f04ac4) - 去年、個人的に動かしてみて理解につなげてみてましたが、実は社内案件でこっそり使い始めています。 - Nuxt.js は興味湧いたので個人的に触ってみてます。SPA、SSR ほか静的ジェネレータとしても使えるようなのでマークアップ案件で活かせないかと検討中。 - [Vue.js 製フレームワーク Nuxt.js ではじめる Universal アプリケーション開発](https://html5experts.jp/potato4d/24346/) - やっぱり素として使うにはそれなりにコストがでてくる(モジュールやプラグインを使いたい時とか)ので、やっぱりwebpackとかでビルドできるような動かした方が必要に感じました。 - https://www.slideshare.net/ShoheiOkada/1-vuejs - この辺見たんですけど 1000 行の`new Vue()`が気になってしょうがない。 - さくらインターネット株式会社様も Vue.js バリバリ使ってる or 使おうとしているようです - [「さくらインターネットのエンジニアは Vue.js をこんな風につかってます」レポート #さくらの夕べ](http://yamanoku.hatenablog.com/entry/2017/10/31/%E3%80%8C%E3%81%95%E3%81%8F%E3%82%89%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AF_Vue_js_%E3%82%92%E3%81%93%E3%82%93) ## vw,vh - Viewport units という概念を取り入れてみました。 - `calc()`とは相性が悪いみたいです。 ## Qiita Organization 始動 - 社内の Qiita Organization をやろうかと MTG で検討していたのをついに始動しました。 - https://qiita.com/organizations/geekinc - [株式会社 GEEK の Qiita Organization はじめました!](http://blog.geek.co.jp/archives/1739) ## ECSS ドキュメント見直し・翻訳作業 - 個人の Scrapbox にて個人的にコツコツやってる(スローペースですが)。 - [Enduring CSS 非公式翻訳](https://scrapbox.io/yamanoku/Enduring_CSS_%E9%9D%9E%E5%85%AC%E5%BC%8F%E7%BF%BB%E8%A8%B3) - ほかにも公式でまとめられている抽象的表現が多いドキュメントとかもまとめて分かりやすくしたのを社内で配布するなどしてみたいです。 - なんか今更みたいなのもあるかもしれませんが、誰もやっていないところで生まれる価値や仕事というものを見出していくようなことをしていきたいです。 ## Zeppelin、Avocode 体験 - デザインツールではあるが弊社デザイナーが取り入れてみた上記2点も体験してみました。 - CSS コード自動生成がすごい。100%希望通りのこととはならないが、画像化されているものの CSS 判定の精度の高さに感動しました。 - [![Image from Gyazo](https://i.gyazo.com/8eaefa123b187ebcb3ef3e03f469b67d.png)](https://gyazo.com/8eaefa123b187ebcb3ef3e03f469b67d) - と当時書いてみたがどうやら微妙に px が違う問題があるらしい - あと Sketch も案件によっては触れる機会がありました。 ## 自分用 RSS リーダーを作ろうとした - 経緯 => https://yamanoku.github.io/LT/lt04/ - Slack のチャンネルに URL をなげたら RSS リーダーとして機能するというのを導入してみた。 - https://elements.heroku.com/buttons/gozman/slack-rss - そもそも iOS アプリのはてなブックマークが使いづらくなったのでなんとかしようと試していたのですが気がついたら使いづらい部分が直ってました。 - 自作 RSS のは中途半端に頓挫しました。機会があったら復帰させたい。
    --- ## imgのalt何入れるか問題(WAI-ARIA回避編) https://archives.yamanoku.net/what-to-put-in-img-alt_using-wai-aria/ alt に文字画像とかあれば入れるのは常なんだが、たとえば商品画像とかがそのままポンと置いてあると説明しづらい。 heading なりで紹介してあるとスクリーンリーダーなどで読み取るので画像自体に大きな意味はないとは思うけど、特に見出しもなく(alt に詳細を入れずに済む)、ただ文章で説明している箇所もありけりな場合どうするかを回避する方法。 ```html 製品画像01

    製品画像に関する説明についてあれこれ

    ``` こうかな。WAI-ARIA 使えなかったら詰みっぽいです。 参考:https://www.w3.org/WAI/tutorials/images/complex/#description-containing-textual-information
    --- ## backlog上で案件・進捗管理をしていた自分がGithubに触れてみた感想 https://archives.yamanoku.net/thinks-of-backlog-to-github/ 転職してから業務管理ツールをサイボウズ(勤怠が主だったけど)→backlog に変わってずっと進捗管理をそこで行ってきた。2年くらいになるけど、Redmine とかには触れないでも、方向性とかやり方を模索しながらうまいこと立ち回ってきたように感じる。 そんな中こないだより弊社でも backlog では案件自体の管理、Github 上で修正・ソース管理を分割していこうという流れが出来てきて実質2案件くらいの開発案件では行っている。自分も1つ案件に入ってきたので Github 上で仕事している。そんな中で思ったこととか感想とかを書き綴ってみるなど。 ## 案件の可視化に関しては圧倒的に backlog 優位 見やすさとか検索のしやすさであれば圧倒的に backlog かなと思った。そりゃ案件管理ツールと Git 連携サービスとを比較するのであれば酷なのではあるが、ガントチャートを見たり案件内でどのような課題が作られているか・進行しているか、などのディレクター、マネージャー、エンジニア、デザイナーなどの全員が案件の動きを見る面ではかなり強いなものなのだと感じる。 Github 上でもマイルストーンや Issue を作ってあげたり Wiki で詳細を書いてあげたり、backlog 同様に1つのプロジェクト内で案件管理することは不可能なことではないしうまくやれる方法は模索できるとは思うが、それ相応の準備(勉強)とかがいると思うので、Github を使って案件管理をしよう! というよく分かってない浅はかな思考をもつエンジニア・ディレクターが居たら首を締めてあげるのが人情というものです。 あと自分は Git の履歴を見る上でネットワークで図示されたのを見るので backlog のは割と分かりやすくてよいのだけれど、Github はそこに行き着くまでが若干分かりづらいかなとも思った。見れるには見れるんだけど。 [![Image from Gyazo](https://i.gyazo.com/fdc90d716464eb2c0ff5d2533a805fc0.gif)](https://gyazo.com/fdc90d716464eb2c0ff5d2533a805fc0) ## 逆行して考える力の必要性 新しい案件が走る場合、まず要件定義なり客の要望などをしっかりと固めてあげて、そこからどのようなものを作るかを明らかにするものだけど、それを完成するに辺り何が必要なのか、何をもってして完了と言えるのか、という部分を明確にしなければならない、というのが Github でプロジェクトを進行していてわかった・感じたことだった。 Github では Issue(課題)を立ててどのような機能を作っていくか・作ったときに出たバグを潰すかというのがあるが、Github の仕様上、立てた Issue はClose こそできるが完全に削除できない(消すにはプロジェクト自体を削除するとかになる)のでバカスカバカスカ立てても結局精査する時間もあるので、Issue を立てるのは慎重にやる必要があると思う。 つまり課題を立てる上で、何をもってそれをプロジェクトやバグ修正の完結に向わせるか、それを完結させるために用いるものがあるとしたら何かということを考えてものを作るのが進行管理者でも作業者でも求められることなのではないかなと感じた(全員が全員できるようになれという話ではない)。 あと Issue 立てる時にテンプレみたいなのも設定できるので、活用していくと良さげ。 [Manually creating a single issue template for your repository - GitHub Help](https://help.github.com/en/github/building-a-strong-community/manually-creating-a-single-issue-template-for-your-repository) ## CI ツールと連携できる強さ backlog には無い機能として、CI ツールとの連携が Github にはある。Travis CI とか Circle CI とかで自動テストとかデブロイをやってくれるのが凄まじい。これは正直自分のプライベートプロジェクトでは試してなかったので勉強になった。 連携自体は割と簡単で各サービスにサインアップしてプロジェクトを連結させるだけ。あとは設定ファイル(.yml とか)を弄って push して自動で走らすなどしておけば、コミットログの横にチェックマークが出てちゃんと出来てますよーという確認ができる。 [![Image from Gyazo](https://i.gyazo.com/245de11675ea5b876c35ea2c3491e19a.png)](https://gyazo.com/245de11675ea5b876c35ea2c3491e19a) コード品質管理をどうするかということでテストなどを走らせるというのがあり、今までだとこうした連携がなかったので、厳密なものは自社のガイドライン遵守でコード内容が守られているかとかを目測確認したり、そこまででなかったら結構省略することもあったので、PullRequest よろしくレビュー文化みたいなのをやっていく上でも、こうした指標は便利かなと感じた。 作業の進行上、どうしても WIP 的なものであってそれらもチェック走るなどのめんどくささもあるが、一応スキップする機能はあるみたいなので(Circle Ci だと[ci skip]ってコミットメッセージに打てば走らない)内容に合わせて送るようにすれば問題なさそう。 ## 芝が濃くなる嬉しさ backlog と関係ない完全に私的な内容だけど、芝(= Contributions)が濃くなるのは単純に嬉しい。個人開発をやれている人なら毎日濃くはなるだろうけど、実際問題なかなか芝を濃くしていくのは難しいと思う。通常業務であれば backlog のプロジェクト上で結構頻繁に push 作業をしているので(跨いでるプロジェクトが多いのもあるけど)、自分の芝はもっと濃かったのではないかと思っちゃう。 [![Image from Gyazo](https://i.gyazo.com/b74a108b765bdf9bc7eaf3ae9c0f4e59.png)](https://gyazo.com/b74a108b765bdf9bc7eaf3ae9c0f4e59) もちろん Contribution activity とかをしっかり見れば何をしていたかは分かるのだけれど一見のインパクトというものは凄いなとも感じるところ。あとはモチベ維持につながるとかかな。 ようやく本業でも Github を利用し始めて、個人で使う分では色々と見えなかった部分が見えてきて楽しくなってきたところではある。自分のプライベートリポジトリもいい感じにできそうだなというのも分かってきたので業務と合わせてうまく活用していきたいなーなど。 そんな感じで、こちらからは以上です。 --- ## StorybookでCSSに画像を指定をしたい時 https://archives.yamanoku.net/set-image-storybook-css/ 小ネタ。 CSS での画像指定の仕方がイマイチわからず webpack 上でなんとかするのかと思っていました。 ## 解決法 単純に**「静的ディレクトリから参照してくる」**というのを設定してあげればいいだけの話でした。 ### 指定方法 https://storybook.js.org/configurations/default-config/#image-and-static-file-support > storybook also has a way to mention static directories via the -s option of the start-storybook and build-storybook commands. ```bash -s {static directories} ``` `-s`オプションを追加して指定の静的ディレクトリを指定してあげるだけ。ね、簡単でしょ。 #### `./dist` が output 先だとしている場合 ```json "scripts" { "storybook": "start-storybook -p 6006 -s ./dist" } ``` こんな感じになります。 ### 動かしてみる ```bash yarn storybook ``` 動かしてみて、以下ルートのディレクトリから画像を取得すると想定します。 ``` dist/ └── img/ └── ic-arrow_right.png < これ ``` #### コード例 ```tsx import * as React from 'react'; export class Hogehoge extends React.Component { render() { return
    画像が見れる
    ; } } ``` ```css .hogehoge { width: 100%; height: 30px; background-image: url('/img/ic-arrow_back.png'); /* 画像指定 */ } ``` #### 結果 [![https://gyazo.com/e8336990759c1b762050251c0c7fe510](https://i.gyazo.com/e8336990759c1b762050251c0c7fe510.png)](https://gyazo.com/e8336990759c1b762050251c0c7fe510) ちなみに `` の src 読み込みでも同じこと出来ます。 ```tsx import * as React from 'react'; export class Hogehoge extends React.Component { render() { return (
    画像が見れる
    ); } } ``` [![https://gyazo.com/c5174a5a6a99b4d7570ca7c5e8080ecf](https://i.gyazo.com/c5174a5a6a99b4d7570ca7c5e8080ecf.png)](https://gyazo.com/c5174a5a6a99b4d7570ca7c5e8080ecf) ### 参考 URL - https://storybook.js.org/configurations/serving-static-files/#2-via-a-directory - https://github.com/storybooks/storybook/issues/37#issuecomment-205744157
    --- ## CodeClimateで.vueファイルも判定させる https://archives.yamanoku.net/vuejs-add-codeclimate/ ## 概要 vue.js で作ったプロジェクトを[CodeClimate](https://codeclimate.com/)で試そうと思ったのだけれど、 通常時では `.vue` ファイルは CodeClimate の判定に入らない。 [![https://gyazo.com/3b6d92ed3d572446412316149a671855](https://i.gyazo.com/3b6d92ed3d572446412316149a671855.png)](https://gyazo.com/3b6d92ed3d572446412316149a671855) ## 解決 ### 公式ドキュメント https://docs.codeclimate.com/v1.0/docs/eslint#section-extensions > Extensions > You can configure our ESLint Engine to analyze the file types you’d like by configuring the extensions in your `.codeclimate.yml` , as shown in the example below: ```yaml eslint: enabled: true config: extensions: - .es6 - .js - .jsx ratings: paths: - '**.es6' - '**.js' - '**.jsx' ``` eslint エンジンに対応するように、こういう感じで追加していけとのこと。 ### .codeclimate.yml 以下をプロジェクトルートに追加、push する。 ```yaml --- engines: duplication: enabled: true config: languages: - javascript extensions: - .js - .vue ratings: paths: - '**.js' - '**.vue' ``` ### リポジトリを追加する [![https://gyazo.com/d7b3f4fefe8bd36f1728c77524f5ad18](https://i.gyazo.com/d7b3f4fefe8bd36f1728c77524f5ad18.png)](https://gyazo.com/d7b3f4fefe8bd36f1728c77524f5ad18) 「Open sourse」→「Add a repository」で移動して、対象のリポジトリを追加する。 [![https://gyazo.com/723ddf55036630f0a108a0d11d155e5e](https://i.gyazo.com/723ddf55036630f0a108a0d11d155e5e.png)](https://gyazo.com/723ddf55036630f0a108a0d11d155e5e) 判定、通過しているか確認。 ### 結果 [![https://gyazo.com/12753c13ba022e6e4fe5504fc17ac2d2](https://i.gyazo.com/12753c13ba022e6e4fe5504fc17ac2d2.png)](https://gyazo.com/12753c13ba022e6e4fe5504fc17ac2d2) 判定できた! ちなみに今回は細かい `.eslintsrc` ほか、詳細な eslint 設定などはしてないです。 ## 備考 試したプロジェクト:[https://codeclimate.com/github/yamanoku/vue_portfolio_templete](https://codeclimate.com/github/yamanoku/vue_portfolio_templete) 作った経緯:[よく分かってなくてもVue.jsで動くモノが作れた話](./beginner-make-vuejs-spa) --- ## 個人情報保護士の観点から見たパスワード管理について https://archives.yamanoku.net/password-management-from-personal-information-protection-officers-perspective/ http://jp.wsj.com/articles/SB12199000528276883842504583318883522596550 この記事流し読みした。 NIST、だいぶ前に「パスワードの定期変更やめろ」みたいなこと言ってたと思うんですよね。 http://internet.watch.impress.co.jp/docs/yajiuma/1007177.html そういや前に個人情報保護士に質問する機会があって、パスワード管理について個人情報保護法としてはどのような見解なのかを聞いてみた。 - パスワードはできる限り新しくしておく(定期変更) - ただし様々なツールで使用されなかなか個人で記憶できないこともある - そうした場合は **「パスワード管理者」**という人を立てておきその人にパスワード管理してもらう って感じだったと思う。 ヒューマンによる 1Password もどきもどうなんだとは一瞬思ったけど、管理場所の鍵だけ強固にしといてその人以外は触らないようにして、誰でも取り出し可能にするってんならいいんじゃないのっていう、しっかりしてるのか緩いのかよく分からない見解だった気がする。まぁいいか。(いいのか? ) ただ、そもそものパスワード管理についてを個人情報保護的にもどう扱っていいのか分からんみたいになっているとその時は感じた。 ともかくパスワードという存在自体が人間の努力とかその辺でどうにかしようとしてる時点で設計は破綻しているのだから、生体認証みたいなのが流行って「強盗団により重役の指が切り取られる事件が発生」みたいな社会になってほしいなと切に思います。 --- ## コミットメッセージとコミットの粒度について思ったこと https://archives.yamanoku.net/i-think-commit-message_and_commit-granularity/ [コミットメッセージの書き方 - risacan - Medium](https://medium.com/@risacan/%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-64aeadd92057) 見た。以下感想。 ## 思ったこと コミットメッセージが結構雑になる問題ってのは、自分が考える中としてコミットの粒度が割とデカい場合になるんじゃないかなと思ってる。 例えば数ページマークアップしたときに、ページごとにコミットを切るよりかは、全ページの作業をコミットさせておく方が分かりやすいし、どこまでの進捗なのかも一見しやすいかなと思う。もちろんページ内で機能が複雑化している場合はその限りではないと思うけど。 なのでコミットのメッセージを分かりやすく書く、ということと同時にコミットの粒度をどれほどのものにするか、という意識と進め方を持たないとこの辺はなりたたないのではないかなーと個人的に感じている。 基本業務の流れとして、バグや機能追加の課題が振られてそれらを対応完了するまでを1コミットとしているけど、LP などページ単位で対応するときは、場合によっては、1ページ単位でコミットを切ることがある。 あと良くない癖なので直さなきゃなんだけど、その日に対応する修正もまとめて対応して「00/00 対応分修正コミット」とかで切って細かく書かなかったりもする。修正範囲の意義を全体的なものとして捉えていると、修正する1機能というよりかはそれに付随するもとしてまとめて対応しないと、という意識になっちゃうのでその辺は進行管理とも付随する問題かなと感じる。 この辺の粒度対策としては、ブランチをいかに細かく切って作業するかにかかってるんじゃないかと思うので手を動かす前にまずブランチ切っとけ、終わったらマージしとけを工程の中に入れておかんと危ないなとは感じた。まあもし単位がデカくなってもやり直しが一応できるのが Git の良いところではあるけど、出来る限りそういう修正はしたくないよね、と。 課題の建て方としてもそうだけど個人としては、もう少し部品化・機能化するイメージで進めてみてもいいかなと感じた。この辺は実験として新規のプロジェクトとか、個人がメインで動いていたプロジェクトにもっかいアサインしたら試してみようかなと思ってる。誰かとやるんであればその時のルールには従います。 ## 余談 昔、コミットの内容なんか見なくてもファイルの内容みればどうなったか分かるだろみたいな言説を聞いて、当時はまあそうだよなと思ったけど、結局属人性を加速させかねない危険な発言だったと徐々に分かってきて、1回限りではない・他人の手にも渡るリポジトリ内では、出来る限りは詳細的に書くように努めたいと思ってる。 こちらからは以上です。 --- ## PostCSSの雑感 https://archives.yamanoku.net/i-think-postcss/ [![Image from Gyazo](https://i.gyazo.com/e62249bd6564515f104ff2c300072ff6.jpg)](https://gyazo.com/e62249bd6564515f104ff2c300072ff6) 業務で実験的に使ってみたんですが、PostCSS 使うほどでもなく各プリプロセッサのオプションで運用は事足りるのでは? という気持ちが強い。 とりあえず1プロジェクト終えた後にちゃんとした感想やります。 ただこういうのがプラグインであるのは感動した。
    [https://github.com/luisrudge/postcss-flexbugs-fixes](https://github.com/luisrudge/postcss-flexbugs-fixes) 以上雑日記でした。こちらからは以上です。 プラグインの翻訳記事とかつくれば価値出ますかね?
    --- ## 記事を書くときに気をつけること https://archives.yamanoku.net/keep-in-mind-writing-article/ なんらかの記事を書くというのは日々のモチベや多忙さに左右されるので継続は難しいなと感じるところですが、記事を共有するというのは慣れていないとどうも参入障壁がデカい気がします(いわゆるアウトプットが慣れてない場合)。 そんな訳で少しでも参入障壁や苦手意識を取っ払うために自分の中で記事を共有するときに念頭においてることを以下書いてみます。 ## 重複する内容じゃないか これは当たり前ですが既に世に出ているものでそれが十分だったらそれでいい訳です。いわゆる新規性がまったくない場合。 もし間違ってたりアップデートしている内容があったら編集リクエストなり指摘を入れればよくて(直すかどうかはおいておき)、わざわざ自分が書くことはないと思います。それでも残したいならメモ帳にでも書いとけという感じです。 ## 既存のものを組み合わてみる もしかしたら大半のことは上記のことで弾かれてしまうと思いますが、別にそれは単一の内容だから被ってしまうのではと思います。 いわゆる **点と点をつなげたもの** を調べてみるといいです 例えばバグをみつけて改修するときに、それに基づく情報や Tips があったとして、そこに行き着くまでに試したことやダメだったことは 1 つの財産たるわけです。 簡単に直せることはもちろん大事ですが、そこに行き着くまでのプロセスや何故こうしたらできたのか、ということを知ることが一番大切です。 そうした結果に行き着くまでのいくつもの点をつなげてみると、より洗練されたものになるのではないでしょうか。 [iOS でダブルタップしないとリンク反応しないバグ対応について](./ios-double-tap-bug) ## 日本語情報があるか ここら辺は有志が Wiki なりしかるべき場所にまとめたりしてますが、無かったら書くに値するかなと感じます。 少なくとも検索かけて 1、2 ページに有効な手や翻訳記事がなかったら共有する価値は十分あるかなと思います。 結構プロジェクトによっては、とあるバージョンのまま日本語記事が書かれていない場合もあったりします。 [Velocity.js 一時停止・再生機能について](./velocityjs-pause_and_resume-functions) ## 実際に試した内容か 正直 Tips をこういうのがあるよ! と言って書いたりすることもありますが、ブラウザの互換性やバージョン、バグらへんを完全に無視したものもあったりしてそれはノイズとなんら違わないです。 なので実際にやってみた雑感なり、ここを対応するときは注意みたいなことを追加で書いておくだけでだいぶ優しい記事になりえると思います。 試した結果とかは codepen とか codesandbox など、実際のプロジェクトに置いて各自で試してもらうなど、形として残しておくとなお良いかと思います。 [よく分かってなくてもVue.jsで動くモノが作れた話](./beginner-make-vuejs-spa) ## 試した・変えてみたことがどうなったか 色々な実験や改善策、アップデートが日々行われているとは思いますが、そうした試してみた結果、どのような現状になったかというのは 1 つのネタになり得ます。 もちろん上手くいくことがすべてではなく、失敗して共有すらできないこともあるかと思いますが、できる限り咀嚼してみて同じ轍を踏まないようにしてあげる(たとえ届かなくても)のも、業界全体を良くすることだと思えば価値はあるかなと思います。 [よく分かってなくてもVue.jsで動くモノが作れた話](./beginner-make-vuejs-spa) [社内分報 ver 2.0 について](./slack-times-version_02) ## 個人でやってみたこと、社内で試したこと ここら辺は場合によっては書ける書けないの領域もあるかとは思いますが、ネタとしては使えるものもあったりします。 たとえば「社内でこうしたツールを使ってみたけどもっと使いやすくしてみた」「オレオレ設定だけど意外と人に使われてるよ」「みんなこうやってるけど自分はこんなパターンで試した」など、その人、その企業ごとで独自性をもったものになり得ると思います。 この辺は宣伝にもなりそうなんで Qiita なり諸般の場所で書くのは程度問題にはなりますが、個人ブログや企業ブログに書いてみるというのもありかもしれません。それが結果として興味を持ってもらえる材料にもなるので。 [在宅勤務に関してやってみて思うこと](./i-think-working-from-home) ## ゆるく書く意識 最後に一番重視していることとして、ゆるくやるということを忘れないようにしています。 こんなに気をつけておいてゆるくって何でやねんってのはあると感じるかもですが、その辺と力みすぎてしまうのは別物だと思います。 対人が見るものだから粗相のない文章を、と力むよりも、見た人がなるほどなとか、わかるわ〜と共感してくれるような語りかけ調で見てくれるのがいいよねと感じてます。 あとは勢いにまかせて一気にやると良いです。 そんなわけで自分が記事を書く時に意識していることたちでした。大したものを書いているわけではないですが、みんなでゆるく知見を広げていこうぜよ。 こちらからは以上です。 ## 合わせて読みたい [書いた記事をアップデートすること](./update-for-writed-article) --- ## iOSでダブルタップしないとリンク反応しないバグ対応について https://archives.yamanoku.net/ios-double-tap-bug/ もともと iOS8 であったバグだが、8 以降でもこのバグが発生することがあるので備忘録。 ## 問題点・原因 スマホ時のタップ判定は mouseover → click という順序を通過して行われる。 この部分でとある不具合が生じるのが **hover 時のスタイル設定** ```css a:hover { opacity: 0.5; /* よくあるやつ */ } ``` 上記のように hover 時に opacity をかけた要素は最初のタップ(mouseover)でそのスタイルが適応された後、次のタップ(click)でリンク機能が使える。 いわゆる2回タップが生じる。 ※ background や color などではこのバグは発生しない。display 判定だと起こる模様 [^1] ## 解決策 ### 01. media query、CSS 分け対策 ```css @media screen and (min-width: 640px) { a:hover { opaciry: 0.5; } } ``` もしくは ```css li > a { color: red; } li > a:hover { opaciry: 0.5; } ``` ```css li > a { color: red; } ``` つまりスマホレイアウト時ではこのスタイルを適用させない方法。 #### メリット PC・スマホのサイトがそれぞれ分離していれば問題なし。 #### デメリット レスポンシブサイトと断定的に使う場合この策は悪手。スマホやタブレットの解像度が疎らでどれに基準を置くか、PC 時にブラウザを縮めた際にこのスタイルは適応しないなどの説明が必要。 ### 02. userAgent 対策 ```js var ua = navigator.userAgent; if (/iPhone|iPad|iPod/.test(ua)) { $('body').addClass('ios'); } ``` ```css .a:hover { opacity: 0.7; } .ios .a:hover { opacity: 1; } ``` 下記でも可 ```js var ua = navigator.userAgent; if (!/iPhone|iPad|iPod/.test(ua)) { $('a').each(function () { $(this).hover( function () { $(this).css('opacity', 0.7); }, function () { $(this).css('opacity', 1.0); }, ); }); } ``` iOS のときのみスタイルを適用させない方法 #### メリット iOS バグのみなので切り分けて考えられる。レスポンシブサイトでも問題なく使える。 #### デメリット 対応する箇所ごとにスタイルを追加しなければならないのでその分行数は増える。 またコメントやドキュメントにこのバグ対策したことを記載する必要あり。 ```js if (window.ontouchstart === null) { $('a').addClass('touch'); } ``` 上記のようなタッチイベントがあるかどうかを判定してクラスを付与して制御するやり方もあるようです。 ```css a:hover { opacity: 0.75; } a.touch:hover { opacity: 1; } ``` ### 03. js による挙動制御 (タッチ挙動) 通常の場合 ```js $('a').on('touchstart', function () { var url = $(this).attr('href'); location.href = url; }); ``` 別窓の場合 ```js $('a').on('touchstart', function () { var url = $(this).attr('href'); window.open(url, '_blank', 'width=800,height=600'); }); ``` #### メリット タッチデバイスのみに適応できる。CSS 管理とは分離ができる。 #### デメリット タッチ挙動に関しての別のバグが起きないか注意。こちらもコメントやドキュメントなどで追記の必要あり。 ### 所感 明確な棲み分けとしては**「02. userAgent 対策」**が妥当かと感じた。開発規模も大きくなく他 js との棲み分けも問題ないのであれば**「03. js による挙動制御 (タッチ挙動)」**でも良さそうだが、確実な手として比較すると怪しいかもしれない。 そもそもスマホ時にホバー(厳密にはタップ)時のアクションなどを予め除外しておくことのが重要そうだと思った。MaterialDesgin のような優れたタップイベントが分かる UI ならまだしも、**opacity をかけるだけのスタイルでユーザビリティが壊滅的になるならば**除外することが正解にも感じるなど。 ### 参考記事 - [【スマホ最新情報】iPhone でバナーを押しても反応しなくなった理由とは?](https://www.turbine.co.jp/blog/20150911_ios) - [WordPress での iOS 8.4.1 CSS:hover のタップバグ問題の解決方法](https://iwb.jp/wordpress-ios-8-4-1-css-hover-tap-bug/) - [iOS 10.3.1 の Safari で CSS の:hover を 1 クリックカウントしてしまい 2 タップしないとリンク遷移しないのを jQuery で修正](http://epixion.com/2017/04/11/ios-10-css-hover-2-taps-bug/) - [javascript で新規タブ/ウィンドウを作成する時の罠](http://qiita.com/yukiyukki/items/907d3173001c52df50c0) - [クリックとタップを同時に指定したい場合【Javascript】](http://muumv.com/click-tap/) [^1]: [http://qiita.com/hibikikudo/items/6703f11627ac0c55c796](http://qiita.com/hibikikudo/items/6703f11627ac0c55c796) --- ## .DS_Store以外の隠しファイルを.gitignoreするやり方 https://archives.yamanoku.net/invisible-file-add-gitignore/ 小ネタ。 ## きっかけ 会社の作業用 mac の HDD が圧迫してきたので SSD 拡張を導入しました。こちらに作業ディレクトリなどを移管して作業していたのですが、ファイルを作成する毎に隠しファイルが生成されるという事態に遭遇。 例えば`dist/`以下に`config.json`なるファイルを作成したとします。その時に`git status`で管理ファイルを確認すると、、、 ```bash Untracked files: (use "git add ..." to include in what will be committed) dist/config.json dist/._config.json ``` と、上記のように隠しファイル版の`config.json`まで作成されてしまうことがあります。 ターミナルコマンドとか`.gitignore_global`などで`.DS_Store`は消せる、管理しないのはあるのですが`._`始まりのファイルの制御ができなくてしんどかったです。いちいち消すのも面倒くさい… ## 解決策 以下を設定(できれば`.gitignore_global`が良い) ``` ._*.* ``` 改めてステータスを確認 ```bash git status ``` ```bash Untracked files: (use "git add ..." to include in what will be committed) dist/config.json ``` やったぜ。 ## 留意点 いわずもがなですが、あくまで Git 管理下から見えなくしているだけなので、ファイル自体は残ってます。要らなかったらそこは各自コマンドなりアプリなりで消しておいてください。 --- ## Intersection Observer が良さそうなので試してみた https://archives.yamanoku.net/intersection-observer/ ## スクロールでのイベント制御はしんどい。 jQuery にて scroll イベントで制御していた時代 ```javascript $(function () { $(window).on('scroll', function () { // some event }); }); ``` ### 個人的に辛いと思っていたこと - レスポンシブ時で要素のスクロール位置がレイアウトによって変化する場合(SP だとレイアウトが縦長になるため) - **感覚的に**書けないつらさ - 1回のみの動作させるときは flag 処理が必須(スクロールさせて false にして false 時は動作させないなど) - スクロールイベントの発生は断続的なのでブラウザでの負荷がヤバい。 - setTimeout とか requestAnimationFrame とかで軽減させる方法は一応ある ⇛ ([関連記事](http://qiita.com/yoshiiiiie/items/135dafcdde1f9b097fcf)) - lazyload などの遅延読み込みをネイティブで分かりやすく出来ないか。 ## Intersection Observer という技術について [こちらの記事](https://developers.cyberagent.co.jp/blog/archives/6057/)で「Intersection Observer」という API を要素の遅延読み込みに利用していると知り、なんとなく調べてみることにした。 ### 概要 Intersection(交点)Observer(監視)ということで要素自体が交差した瞬間にイベントを発火させる監視 API である。 これの重要な点は上述した **スクロールによるイベント監視** というつらさ部分を解消してくれて、条件分岐に至ってもより分かりやすく実装できることが出来る。 ### サンプル 以下よりご確認ください

    See the Pen Intersection Obeserver Test code by Oyama Michinoku (@yamanoku) on CodePen.

    [![https://gyazo.com/bebf722e1e507c4b4a1fe9b5c01dd81b](https://i.gyazo.com/bebf722e1e507c4b4a1fe9b5c01dd81b.gif)](https://gyazo.com/bebf722e1e507c4b4a1fe9b5c01dd81b) いわゆる「ある程度の表示にきたらヘッダの色を変える」アレです。スクロール量に制御されないので、レスポンシブなどで要素の高さが変わった場合でもこの調整は効きます。 #### サンプルコード(ES6) ```javascript (() => { const clientHeight = document.documentElement.clientHeight; const header = document.querySelector('.header'); let observer = new IntersectionObserver((changes) => { for (const change of changes) { let rect = change.target.getBoundingClientRect(); let h = (0 < rect.top && rect.top < clientHeight) || // 対象の上端は表示領域に入っている (0 < rect.bottom && rect.bottom < clientHeight) || // 対象の下端は表示領域に入っている (0 > rect.top && rect.bottom > clientHeight); // 上端下端も表示されてないがその間が表示されている if (h) { header.classList.remove('scrolled'); } else { header.classList.add('scrolled'); } } }); let target = document.querySelector('.main-middle'); // この要素のから外れたら observer.observe(target); })(); ``` コード内でいうところの target 部分に何を指定するかでどの位置で変化するか制御することが出来ます。 ```javascript let target = document.querySelector('.main-middle'); ``` また`unobserve()`を使用することでその対象の監視を終了させることができるので、1度限りの処理も対応できます。 #### 画像遅延読み込み Intersection Observer を使うと以下制御で実現出来る感じです ```html img_1 img_2 img_3 img_4 img_5 ... ``` ```javascript let observer = new IntersectionObserver(onChange); function onChange(changes) { changes.forEach(change => { // data-src属性の画像URLをsrcに挿入 change.target.src = change.target.dataset.src; // 挿入し終わったら監視を終了 observer.unobserve(change.target); } } // 配列化した画像一覧 const imgs = [ ...document.querySelectorAll('.lazy') ]; // それぞれに順次監視処理 imgs.forEach(img => observer.observe(img)); ``` ちなみに上記の場合だと、画像が小さかったりして読み込みがない表示があるなどラグが起こりうるので、オプションの`rootMargin`で要素の上下左右に空きを指定しておけば、その要素がくる前の段階でイベントを発火させることも出来ます。 margin の指定の順序は CSS のそれと同じです。 ```javascript { rootMargin: '10px 0px'; } // 上下10px、左右0pxの空き ``` ```javascript { rootMargin: '-10px 10px -5px'; } // 左記のようにマイナス値も設定できる。 ``` ちなみに、0 の時は必ず単位を省略せずに書かないとエラー判定になります。 ### Callback 例 以下参考までに。 ```javascript let observer = new IntersectionObserver(changes => { for (const change of changes) { console.log(change.time); // 変化が生じた時点でのタイムスタンプ console.log(change.rootBounds); // root の getBoundingClientRect() console.log(change.boundingClientRect); // target の getBoundingClientRect() console.log(change.intersectionRect); // 交差領域の getBoundingClientRect() console.log(change.intersectionRatio); // 交差している領域の割合 console.log(change.target); // target にされている要素 } }, {}); const target = ... // ターゲットとする要素 observer.observe(target); // 特定のtargetに対して,監視開始 observer.unobserve(target); // 特定のtargetに対して,監視をやめる observer.disconnect(); // すべての target に対し,監視をやめる ``` ### Polyfill(2017/07 現在) 現状 Intersection Observer は IE Edge 最新、Firefox 最新、Chrome 最新、Android ブラウザ最新のみの対応につき Polyfill が必要となります。([Can I Use](http://caniuse.com/#feat=intersectionobserver)) ```html ``` #### 追記(2019/02/05) Safari12.1 でも Intersection Observer API がサポートされるようになりました。 - [Safari 12.1 Release Notes | Apple Developer Documentation](https://developer.apple.com/documentation/safari_release_notes/safari_12_1_release_notes) - [IntersectionObserver in WebKit | WebKit](https://webkit.org/blog/8582/intersectionobserver-in-webkit/) ## 所感 監視する要素の設定があるので感覚的かと言われると怪しいですが、上記にも書いた辛くて煩わしいスクロールイベントからは離れられそうでそこは安心しました。また、スクロールイベントではなくなるので処理に負荷がかかっていた場合に原因を特定する際にも役立ちそうです。 現状は縦イベントのみで確認していますが、横スクロールのコンテンツの場合でもこれは有効な API っぽいなと感じたので後で試してみます。 ## 参考 URL・記事 - [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) - [Intersection Observer 1 日本語訳](https://triple-underscore.github.io/IntersectionObserver-ja.html#intersection-observer-callback) - [FRESH! Web パフォーマンス改善 〜クライアントサイド編〜](https://developers.cyberagent.co.jp/blog/archives/6057/) - [Intersection Observer を用いた要素出現検出の最適化](https://blog.jxck.io/entries/2016-06-25/intersection-observer.html) - [Quick introduction to the Intersection Observer API](https://jeremenichelli.github.io/2016/04/quick-introduction-to-the-intersection-observer-api/)
    --- ## 書いた記事をアップデートすること https://archives.yamanoku.net/update-for-writed-article/ [CSSのプロパティ記述順についてどうするかの話](./sort-order-css-property) この記事を書いて早いもので 1 年経った。CSS プロパティの記述順に関してはひとつの解決の足掛けにはなれたのではないかと思っていたけれど 1 年たった今では記述順よりも煩わしいコンポーネント管理問題や他人とどう CSS を弄ればいいかなど悩みは尽きない。そんな記事を書いていたことも忘れかけていた中で最近ふと気にかかった言葉がある。 **技術記事ってだいたい書いた当時の情報からアップデートされないよね** まあだいたいはその通りであるというか、記事に直近の追記以外でこのプラグインやら記述はもう使えませんよみたいなのって本当に丁寧な記事以外では全く見かけないし Qiita でもそんなにはないんじゃないのかーという感じではあるわけです。 これは俺がフロントエンド界隈にいる限りなのか、それとも単に手前の視野が狭いだけなのかというのは分かりませんが、少なくとも自分の界隈はそういったもんだと思っています。 別に記事なんて公式ドキュメントではないんだし、いちボンクラが書いたものをいちいち更新しなきゃいかんのかというのもダルい話ではある。でも、そんなボンクラが書いたような記事でも必要な人はそれを頼って見に来ることもある。どこの誰かは使うべきではない言葉なので修正してくださいけれども。そう思った時に自分は必要な人間側になった時にどう思うかというと多少なりともアップデートはしていてほしいなという気持ちにはなる。 そもそもがインターネットのものはアーカイブもできて、上書きできるものであるという前提を見失っていた気はします。 これは別に Qiita に寄稿した記事に限らずこのブログもそうだし、果ては Github のドキュメントや社内の Wiki やら議事録に至る何までどこの誰がどのような探索をしに来るかは知らんけども、今一度あの時書いたもの、作ったものを見直してみるのはどうかという感じにはなってきているそんな今日のこのごろです。 --- ## カスタムデータ属性(data-*)の値に複数設定、それを取得する方法 https://archives.yamanoku.net/get-multiple-data-attributes/ カスタムデータ属性(`data-*`)は基本、属性値を1つのみしか設定できませんが、いわゆる**配列** 、**オブジェクト**化させることで複数設定が可能になります。 以下方法です。 ## 複数設定パターン ### 1. 配列 ```html
    ``` ### 2. オブジェクト ```html
    ``` ## 取得方法 ```js var arr = $('#id1').data('test1'); var obj = $('#id2').data('test2'); console.log(arr[1]); // age console.log(obj.name); // 名前 ``` ## 注意点 ### 要素の括りについて 複数設定する時は必ずシングルクォーテーションで囲んで、中の文字列はダブルクォーテーションで囲みましょう。 #### デモ(成功パターン) https://jsfiddle.net/z56ryn6L/ ![demo2](https://i.gyazo.com/b765e53468af449c647ee78431270049.png) #### デモ(失敗パターン) https://jsfiddle.net/z56ryn6L/1/ ![demo1](https://i.gyazo.com/f70f6b62962682d57cefdfb1779e5ce0.png) 失敗パターンでは、配列時は全体が文字列と化しているので、そこから何番目のものかを取得してきています。 オブジェクトの場合は key から value を参照できません。 ちなみに value 部分に数値が入る時はダブルクォーテーションで囲まなくても大丈夫ですが、01 や 001 といった場合は判定されないようです。 ### 取得時のメソッド カスタムデータ「属性」ではあるのですが、配列とオブジェクトを設置している時に `attr()` で対応すると上記の失敗パターンと同じ結果で返ってきます。 #### デモ(失敗パターン) https://jsfiddle.net/z56ryn6L/2/ `attr()` 自体はあくまでも属性名を取得して value を返すメソッドで、 `data()` は key や object として取得してきてくれるメソッドなので、対応できるようです。 - http://api.jquery.com/attr/ - http://api.jquery.com/data/ 配列やオブジェクトのように複数設定した属性取得の場合は `data()` で行うようにしましょう。 ### undefined について データ値として判定できないので、この時に限り使用できません。 当たり前ですが文字列として設定すれば取得できます。 ```html
    ``` ```js // 成功例 -- オブジェクトで返ってくる var obj1 = $('#id3').data('test3'); console.log(obj1); // Object {key1: "value1", key2: "value2", key3: "undefined"} // key1:"value1" // key2:"value2" // key3:"undefined" // 失敗例 -- 文字列で返ってくる var obj2 = $('#id4').data('test4'); console.log(obj2); // {"key1":"value1","key2":"value2","key3":undefined} ``` また、現状 jQuery ではなく、ネイティブ JavaScript で上記のようにデータ属性の配列・オブジェクトを取得する方法は見つけられませんでした…(文字列として返ってくる)。情報求む。 ## 参考記事 - http://cly7796.net/wp/javascript/use-an-array-in-the-data-attribute/ - http://dot-town-lab.com/laboratory/item/66
    --- ## Velocity.js 一時停止・再生機能について https://archives.yamanoku.net/velocityjs-pause_and_resume-functions/ ![Velocity.js](https://i.gyazo.com/e4ff99807a7e6917ee9f5dfa0be8f5fc.png) Velocity.js、アニメーションさせる際には[CSS で動かすよりも圧倒的パフォーマンス](https://davidwalsh.name/css-js-animation)を出すことで非常に便利なのですが、とある機能の日本語情報が見受けられなかったのでここに記載します! ## 一時停止 → 再生機能 stop()メソッドはあるのですが、いわゆる「一時停止 → 再生」するもののドキュメント情報が[公式サイト](http://velocityjs.org/)がありませんでした(しかも stop()だと完全停止しちゃう)。 Github の Issue で「一時停止・再生機能つけてくれ頼む」という話はあったのですが、[肝心の作者がやる気を喪失](https://github.com/julianshapiro/velocity/issues/14#issuecomment-56395478)していたので、本人からの実装には期待が0になり、以下のようなテクニカルであまり汎用的ではない方法で一時停止・再生する機能をつけるようにやっていました。

    See the Pen Velocity.js - Pause/Resume animation by William Lindner (@wlindner) on CodePen.

    [https://codepen.io/wlindner/pen/ykIzw](https://codepen.io/wlindner/pen/ykIzw) google 日本語検索でもそれに関する記事は見受けられませんでした。 しかし、1人の Contributior の活躍により [2016 年 11 月に一時停止・再生機能が実装されました](https://github.com/julianshapiro/velocity/pull/718)。 ## 実装例 ```js $(function () { $('.hover').velocity( { scale: [1, 0.6], }, { duration: 1500, complete: function () { $(this).velocity( { scale: [0.6, 1], }, { duration: 1500, loop: true, }, ); }, }, ); $('.hover').hover( function () { $(this).velocity('pause'); }, function () { $(this).velocity('resume'); }, ); }); ``` ## デモ [https://jsfiddle.net/g09jkr80/1/](https://jsfiddle.net/g09jkr80/1/) ![demo](https://i.gyazo.com/cc2cc731deccdd699f8f16437702945f.gif) ## 得られた教訓 **公式ドキュメント、アップデート情報はちゃんと調べてちゃんと読もう!!!!!** 以上学びでした。 ## 余談ですが React 用の velocity.js プラグインがあります [https://github.com/twitter-fabric/velocity-react](https://github.com/twitter-fabric/velocity-react) おっきなとこが管理してるので安心 ☺
    --- ## Promise処理について雑にまとめる https://archives.yamanoku.net/summary-promise-process/ ## Promise とは 簡単に言うと非同期処理を行う時にコールバック地獄、ネストの深層化を回避して記述をだいぶ楽にするオブジェクト。ES2015 です。 ### 非同期処理とは 例えば A の処理の後に B の処理があるとする。JavaScript とはシングルスレッドで動く同時に処理を行うということができないものなので、通常であれば A、B の処理で動く。その辺の順番を変えて処理を行うのを非同期処理という。 分かりやすい例は Api と連携する Ajax 通信を受け取ったレスポンス(200 とか 404 とか)の結果によって処理を行うやつ。 ### 非同期処理の例 - setTimeout - setInterval - addEventListener(イベントハンドラ) - jQuery.Deferred - Promise ← これ - async/await ### 例 -- ajax 通信後順番に処理を行う ```javascript var fetchSomething1 = function (done) { // API1にアクセス doAjaxStuff(someOptions, { success: function (data) { done(); // 成功したら渡されたfunctionを実行 }, }); }; // fetchSomething1と同じようにそれぞれ別のAPIにアクセスするfunction群 var fetchSomething2 = function (done) { /* 省略 */ }; var fetchSomething3 = function (done) { /* 省略 */ }; var fetchSomething4 = function (done) { /* 省略 */ }; var doSomethingFinally = function () { // APIにアクセスして取得してきたデータを使って何かする }; ``` こういう関数を登録しておき、順番に処理を行うとする。通常だと ```javascript fetchSomething1(function () { fetchSomething2(function () { fetchSomething3(function () { fetchSomething4(doSomethingFinally); }); }); }); ``` こうなるが、これが ```javascript fetchSomething1() .then(fetchSomething2) .then(fetchSomething3) .then(fetchSomething4) .then(doSomethingFinally); ``` こうなる。コールバック地獄、ネスト深層化問題の回避がよく分かる。 ```javascript // Callback fetchSomething1(function() { fetchSomething2(function() { fetchSomething3(function() { fetchSomething4(doSomethingFinally, function() { // fetchSomething4のエラー処理 }); }, function() { // fetchSomething3のエラー処理 }); }, function() { // fetchSomething2のエラー処理 }); }, function() { // fetchSomething1のエラー処理 }); // Promise then & catch fetchSomething1() .then(fetchSomething2) .catch(/* fetchSomething1のエラー処理 */); .then(fetchSomething3) .catch(/* fetchSomething2のエラー処理 */); .then(fetchSomething4) .catch(/* fetchSomething3のエラー処理 */); .then(doSomethingFinally) .catch(/* fetchSomething4のエラー処理 */); ``` エラー処理も含めると更に分かりやすくなる。こういう風に書くと見やすくなってメンテナンス性も上がりますね。 ## ブラウザ対応状況 -- CanIUse [![Image from Gyazo](https://i.gyazo.com/27f6663a05cf677796e44911a766c161.png)](https://gyazo.com/27f6663a05cf677796e44911a766c161) 発表されてからだいぶ時間が経ったのでブラウザ対応であれば、現状 IE11 以外だったら大丈夫。 ## パフォーマンス対決 [jsPref](https://jsperf.com/)にて計測。 ### Promise vs Callback [![Image from Gyazo](https://i.gyazo.com/9eb43867d18465da067d59ea659365e1.png)](https://gyazo.com/9eb43867d18465da067d59ea659365e1) ### Native Promise vs Callback [![Image from Gyazo](https://i.gyazo.com/363caf653209063133a294aca9e1e8e1.png)](https://gyazo.com/363caf653209063133a294aca9e1e8e1) 非同期処理だとそこまで差はないけどそのまま使う Promise だと圧倒的に Callback のがパフォーマンス良い。素で使わないほうがよさそう。 ### 参考 - [Promise で簡単!JavaScript 非同期処理入門【前編】](https://html5experts.jp/takazudo/17107/) - [Promise で簡単!JavaScript 非同期処理入門【後編】](https://html5experts.jp/takazudo/17113/) - [Promise - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise) --- ## JavaScript無効にしたときのユーザビリティとかについて https://archives.yamanoku.net/usability-when-ignored-javascript/ 社内で話した内容で気づけてよかったことなのでまとめてみる。自戒も込めてます。 ## 話し合ったこと - 最近は JavaScript 無効な環境とかに対して優しくする意識はないのではないか - SPA とかなんか JavaScript あり気なんだしでかい Flash を 1 つ置いてて iPhone で見る場合のと同義っぽい(※SPA を dis ってる訳ではない) - JavaScript でガッチリ組みすぎてるのもアレだけど、とはいえ今のレイアウトは JavaScript ありきのものばかりだよね - そうなると JavaScript が動作してなくて崩れてたとしても情報はちゃんと見せてあげたい - リッチな表現は JavaScript にのみ任せて、それ以外の基本動作は抜きでもちゃんと機能するようにしたい - 以下例みたいな考え方をスタンダードにしたい - アコーディオンは通常時は出しておき、JavaScript 読み込みで非表示にする - ローディングとかを入れる時、ローディング自体をすでに出しておき setTimeOut で消えるみたいな処理にしない(消えなくなる) - Google とかのウェブフォントも極力 js 読み込みなどを避ける - JavaScript で動作しないと表示しないテキストをやめる(重要なやつだと特に) - `text()`とかで出来る限り入れない・表示非表示で切り替える。 - form のバリデーションはブラウザのバリデーションも意識してやる(最低限 required 付けるとか) - [クライアント側のフォームデータ検証 - ウェブ開発を学ぶ | MDN](https://developer.mozilla.org/ja/docs/Learn/HTML/Forms/Data_form_validation) - WAI-ARIA についても考えておく必要はある - JavaScript バリバリ使っているサイトだったら最低限の礼儀として noscript タグをちゃんと使おう ## まとめ 結局のところマークアップなりの時点で **HTML の構造をしっかり作れ** という感じなのですが、デザインでも JavaScript 使えて当然なリッチなものも多いのでその辺意識しないと結構大変だなと思うようになってます。 まあ結局ケースバイケースで JavaScript やれる部分は JavaScript でやるという部分はやっておき、万一のことは`