OmniAICreator/Qiita-1.07M huggingface dataset:
子育てから学ぶコミュニケーション技術

さてさて、今年も残りわずかですね。
本当に色々なことがあった一年でしたが、何とか年の瀬を迎えることができ一息。問題は山積ですが、来年はもっといい年にしていきたいですね。

この記事は「あなたの学びをシェア！2020年までにUdemyで学んだこと03【PR】Udemy Advent Calendar 2020」の20日目として投稿させていただいております。

私に関して
---
もう結構いい年したおっさんであり、もちろんエンジニアとして四苦八苦している一方で、4人の子供に囲まれながら日々、家でも悪戦苦闘している父親でもあります。
仕事と家庭、どちらが大事なの！？なんて使い古された言葉で自問自答しながら、少しでも時間を有効に活用するべくUdemy使って勉強しています


今年受講した講座
---

今年一年でUdemyで受講した講座は以下のものとなります

* [現役エンジニアが教える、手を動かして学ぶGoogle Cloud Platform(GCP) 入門](https://www.udemy.com/course/google-cloud-platform-gcp/)
* [東大生を育てた親に学ぶ！真のコミュニケーション能力を育てる　親子会話マスターコース（ほめる・諭す・叱る・導く会話）](https://www.udemy.com/course/hkkbwyjo/)
* [手を動かして学ぶITプロジェクトの資料作成！システム開発のドキュメンテーション技術と成果物テンプレート](https://www.udemy.com/course/it-yugtl/)
* [これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/course/aws-associate/)
* [【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)

今回の記事
----

Udemyでは、Qiitaを見ている多くの人と同様に、技術的な好奇心や技術習得を目的としています。
もちろん、チュートリアルや公式リファレンスもあり、ものによっては非常に充実しているのですが、それでもやはり説明があった方がわかりやすいものもあるわけです。
あと、英語が苦手という話もありますね。
あれこれを見ていると、技術以外の講座に関しても関心を覚え、見てわかる通り、親業じゃないですけど、一つ受けてみました。

[東大生を育てた親に学ぶ！真のコミュニケーション能力を育てる　親子会話マスターコース（ほめる・諭す・叱る・導く会話）](https://www.udemy.com/course/hkkbwyjo/)

もう、今回のアドベンドカレンダーの基準全無視の内容ですが、コミュニケーションも親業も技術です。

意外と、いや、こういう事を言うと失礼かもしれませんが為になりました。
相手に対してどういう形でコミュニケーションをとるべきなのか。何に気を付けると、よりいい効果を得ることができるか？を考え、自分の行動を変えていくことができます。

効果
---
これを受けてから、かなり子供に対して怒る回数が格段に減りました！（アウトプット）
自分の子供だからこそ、感情的になってしまうもの。なかなか難しいところではありますが、いきなり完璧な親やエンジニアになれるものでもなく、日々積み重ねていくものですね。

それと同時に、仕事においても同僚とのコミュニケーションでより意識するようになりました。特に、1on1のような場面では傾聴から相手をほめること。そして育てていくための問いを立てること。
色々なものが色々なところで結びついていくということを、いい年して改めて思った次第です。
継続的にこれからも、勉強をし、野望としては教えられる立場になっていきたいものです

あれ、これ、Qiitaに載せていい内容なのかな？まぁいいですよね！
最後までお読みいただきありがとうございました。
Kintoneは災害時こそ使ってほしい

皆さんは気がついていないのですが。
災害時こそ使ってほしいのがKintoneです。
あえて書くために２ndにも登場しちゃいます。
[kintone 2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kintone2 "kintone 2 Advent Calendar 2020")１９日目です。
#何故使ってほしいのか
急ぎで上方を共有するのに向いているのはKintoneです。
実際にいろんな現場で活躍していますが。
本当に重要なのはものの管理と避難所の収容している現在の人員などの管理に使ってほしいです。
実はクライシスマッピングに使えることも確認できてますが。
問題がプラグインとして書くGoogleMapAPIが災害時に無償提供してくれないんです。
これが一番困る。
#新コロナでも使ってほしい
これは本当に伝えたいことなんですが。
現在の患者の把握などに使ってほしいのです。
実際FAXではもう限界超えてます。
個々でやってもらいたいのはKintoneを使った情報共有。
これ絶対やってほしいです。
#雪害でも使って
もうすでに今年も起きてしまいました。
雪害。
これが一番の問題児なのです。
通行止めするのはいいんですが。
物資量や止まっているところの把握などに使ってください。
というかサイボウズさん雪害にも無償提供などやってあげてください。
自分も２８年の福井豪雪のときは実際に会社での対応でドタバタしてるわ。
ものは運べないわで困ることが多かった。
使った最終手段は知り合いの運送屋に軽トラで現地に移動してもらい確認したという古風な手。
これは今後なくしていきたいですね。
だからこそ雪害にKintoneを使えとあえてここで叫ばせていただきます。
素早い情報共有が重要ですからね。
SNSではどうにもなりませんし電話もパンクするだろうし。
実は今週の豪雪ではあの有名な関ヶ原の戦いの舞台になった桃配山の裏の鉄塔の頂点が折れるという被害が出てました。
２８年豪雪で働いていたのは三和シャッター岐阜工場で実は今回は雪害が起きた現地なんですよね。
関ケ原と垂井の境にあるのですね。
おいら気にしてるよ。
岐阜工場のみんな何でもいいんで連絡頂戴。
といったことにも巻き込まれてるんです。
こういったときにも使えますんで是非雪害の無償提供をサイボウズさんお願いしたいです。
#災害こそ急いで提供を
これはずばりいつもボランティアの立場で活躍している自分たちにとって一番重要なことです。
OpenStreetMapで作るのには時間がかかります。
OpenStreetMapやGoogleMapAPIでプラグインを作ればあっという間に使えるKintoneこそ重要です。
是非起きてすぐの無償提供対応をお願いしたい。
何時も情報共有はFacebookばかりでまとまりがないんです。
誰かが動かないとクライシスマッピングできないという状況を打破しないと行けないですね。
だからお願いしたいです。

今日は災害ボランティアの立場で書いてます。
ハッカソン常連者の自分ではない書き方になってますね。
BBごめんよ〜。
本当にお願いしたいことなので今回書かせてもらいました。

ということで締めたいと思います。

明日は[MoriMority](https://qiita.com/MoriMority "MoriMority")さんです。
初参加ということですが頑張って書きましょう。
怖くないっすよ。
[Node.js] フレームワーク「Express」とは

###フレームワーク「Express」とは

昨日、「Node.jsのフレームワーク「Express」とは」という記事を投稿したのですが、いちおう調べてみました（googleで）。

[Wikipedia Webアプリケーションフレームワーク](https://ja.wikipedia.org/wiki/Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF "wikipediaWebアプリケーションフレームワーク")

Node.js云々の前に、そもそもフレームワークとは何かと思い、Webアプリケーションフレームワークという言葉を調べてみました。

Webアプリケーションフレームワークについては、上記のwikipediaさんに書いてあります。

>JavaScriptでは種々のフレームワークが乱立している状態であるが、徐々に収束に向かい始めており、MEANという手法が有名になりつつある。[要出典]

なんていうふうにも書かれていますね。

[Wikipedia MEAN (ソフトウェアバンドル)](https://ja.wikipedia.org/wiki/MEAN_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%90%E3%83%B3%E3%83%89%E3%83%AB) "wikipediaMEAN (ソフトウェアバンドル)")

上に書かれているMEANという手法についてのwikipediaさんです。

[Wikipedia Express.js](https://ja.wikipedia.org/wiki/Express.js "wikipediaExpress.js")

>Express.js は、サーバーサイドJavaScriptのNode.jsのWebアプリケーションフレームワークである。

そして、Expressについてのwikipediaさんです。

フレームワークは、プログラミングを容易にするとか、テンプレート化するという素晴らしいものですが、上記の「Webアプリケーションフレームワーク」にあるように、"種々のフレームワークが乱立している状態"であることがプログラミング初学者にとっては、逆にわかりづらくしてしまっているかも……と少し思いました。
アンケートデータ集計の注意点

この記事は [freeeデータに関わる人たち Advent Calendar 2020](https://adventar.org/calendars/5461) 19日目のエントリーです。

# 概要
freeeでデータアナリストをしています。
今回はアンケートデータの集計について、注意した方が良い事例に出会ったので紹介したいと思います。

# 事例
データ部門に所属するAさんは、オンライン忘年会の実施を任されることになりました。食事は一括で発注することにしましたが、どんな料理を用意すれば良いかが悩みの種です。そこで、社内に好きな食べ物アンケートがあったので利用することにしました。

![データ部門が好きな食べ物.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103938/4cedd0fd-41d4-404a-fabf-b84af59e2499.png)![データ部門除くメンバーが好きな食べ物.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103938/bb8111ef-e8cf-432d-f1de-31ce0d4bf73d.png)


データ部門と他のメンバーの寿司を比較すると、43.8%と38.8%で5ポイントの差があります。Aさんは「どうやらデータ部門は他のメンバーより寿司が好きなようだ」と結論づけて寿司を発注するのでした。

（※実際の事例は寿司とは関係ありません。業務上の意思決定を上記のようなアンケート結果で考えていた例を元にしています。）

# 問題点

サンプルサイズが小さい？　そういった話ではありません。具体的なアンケート票を見てみましょう。
![スクリーンショット 2020-12-15 14.38.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103938/70fda1c3-665b-a8eb-a626-1d556b3c7e6f.png)
そう、こちら、ラジオボタンでなくチェックボックスなのです。すなわち**1ユーザーが複数回答している可能性**があります。それがどうして問題かというと、このデータを先の円グラフで表してデータ部門とそれ以外で比較すると、何を比較しているのかよく分からなくなるためです。
もう少し具体的にいうと、例えば、もしデータ部門がそれ以外のメンバーに比べてラーメンに大量のチェックを入れていた場合、同じ割合で寿司にチェックが入っても、データ部門の寿司にチェックした割合が小さくなってしまいます。

# 解決策

では、単純に比較できないで終わりなのでしょうか？

発想を転換して集計の方法を変えてみましょう。以下のようなアンケートだったと想定して集計し直します。（この変換は先ほどのアンケート結果があれば可能です。）
![スクリーンショット 2020-12-15 15.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103938/5659e318-2dbe-f937-c02b-1b705a2f7db4.png)
![データ部門が好きな食べ物 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103938/d74115f3-9fa0-30bd-77ec-97e5877b56b2.png)![データ部門除くメンバーが好きな食べ物 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103938/2915c292-e29f-e40c-2bfe-3346053732df.png)

このように1項目ずつ「はい」にチェックが入っているか否かで「チェック」か「未チェック」かに分類すれば、それぞれの項目のチェックが独立しているという前提において、例えば「寿司をチェックした人の割合に差があるかないか」の検定には持ち込むことができます。
あとは、心置きなくカイ二乗検定やフィッシャーの正確確率検定（サンプルサイズが小さい場合）などを行って有意差があるか確認しましょう。

# まとめ

- そもそも複数回答OKのアンケートで回答の割合を出すことをオススメしません
- さらにその割合をサンプル同士比較することは危険なのでやめましょう
- みんな寿司が好き
[Rails]ランキング機能に王冠マークつける方法

今回はランキングに王冠マークをつける方法を書いていきたいと思います。
#前提
・ランキング機能を実装していること。以下記事を参考させていただきました。
以下に記載するviewのメソッドなどは以下の記事を参照しておりますのでご了承ください。
https://qiita.com/mitsumitsu1128/items/18fa5e49a27e727f00b4
・Font-Awesome６が使用できる状態にして置くこと。

#王様マークをつける

```rank.html.erb
<table>
  <thead>
    <tr>
      <th class= "text-center">順位</th>
      <th class= "text-center">Note</th>
    </tr>
  </thead>
  <tbody>
    <% @all_ranks.each.with_index(1) do |note, index| %>
      <tr>
        <td class="text-center">
          <% case index when 1 %>
            <i class="fas fa-crown" style='color: gold;'></i>
          <% when 2 %>
            <i class="fas fa-crown" style='color: silver;'></i>
          <% when 3 %>
            <i class="fas fa-crown" style='color: orange;'></i>
          <% else %>
            <%= index %>
          <% end %>
        </td>
        <td class="text-center">
          <%= link_to user_note_path(note) do %>
            <%= note.name %>
          <% end %>
        </td>
      </tr>
    <% end %>
  </tbody>
</table>     
```

#説明

`<% case index when 1 %>`
これはrubyのcase文です。「if」文では複数の条件式を組み合わせて複雑な分岐を行う事ができますが、一つの値に対して複数の候補の中で一致するものを探すような場合には「case」文を使用すると便利です。例は以下の通りです。

```
case 対象オブジェクト
when 値1
  値1と一致する場合に行う処理
when 値2
  値2と一致する場合に行う処理
when 値3
  値3と一致する場合に行う処理
else
  どの値にも一致しない場合に行う処理
end
```

.with_index(1)を使用することで1から順番に数字を出力してるのでこれに対して１の時に金の王冠、2の時に銀の王冠、3の時銅の王冠のように　case文で実装しております。
DEMデータをTerrain RGBのラスタタイルに変換し、Mapbox GL JSで利用する

Mapbox GL JSが最近v2になり、ライセンスがプロプライエタリなものにかわり、3Dに対応したことで、Terrain RGB形式の標高データがますます注目されていくことになると感じます。自前のDEMデータをTerrain RGBのラスタタイルセットに変換し、Mapbox GL JSで活用するところまで一連を試したので、そのやり方をご紹介します。

実はqiitaではなく、私が個人的に運用している水道ベクトルタイルのドキュメントの方にやり方を英語と日本語でまとめたので、[そちら](https://docs.water-gis.com/ja/setups/terrain-rgb/)の方をご覧いただければと思います。

目次（各項目のリンクをクリックするとそのページに飛びます）

- [DEMからTerrain RGBを生成する](https://docs.water-gis.com/ja/setups/terrain-rgb/create_terrainrgb/)
- [Terrain RGBをGithub pagesにホストする](https://docs.water-gis.com/ja/setups/terrain-rgb/host-terrainrgb-tiles/)
- [MapboxスタイルでTerrain RGBのスタイル設定する](https://docs.water-gis.com/ja/setups/terrain-rgb/utilize-on-mapboxgl/#1-陰影起伏図レイヤをスタイルに追加する)
- [標高プラグインをWebアプリに追加する](https://docs.water-gis.com/ja/setups/terrain-rgb/utilize-on-mapboxgl/#2-標高プラグインをアプリに追加する)

今後も標高関係で便利な機能を開発して、どんどん水道GISアプリに追加していきます！
AWS Canaryを使って外形監視する

# Canary
- カナリア
- 内部的にはLambdaとCloudwatchAlermが連携してくれている
- 外形監視、API監視、セレニウムでのGUI操作などができる
- SNSに連携できるので、メール、Slack、Teamsなどに飛ばすことができる
- Terraformはなかった

## CloudWatchコンソールを開く
- Canariers - 設計図 - ハートビートのモニタリングを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/803a57e5-dfb0-4678-1d7f-aa2c19df765c.png)

## 監視したいURLを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/431ee252-76cb-2f23-c1f7-a50a230342fa.png)

## スクリプトを設定

### 好みのランタイムを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/71ce2944-25a8-5e01-5f39-9128cb9fef90.png)

### 変更する場所
- `const URL = "https://vamdemicsystem.black";`
    - 監視対象のURL
- `if (response.status() < 200 || response.status() > 299) {`
    - 正常とみなすステータスコードが302とかであれば、変える

## ログを保管するS3を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/9403d3ab-9e7d-3742-da37-7f95ac13c7ba.png)

## しきい値と連携するSNSを選ぶ
- しきい値は1でなかったら（200-299のレスポンスコードでなかったら）、異常と判定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/f080c2fb-bc48-5bb2-9805-a2589a29be62.png)

## 作成ボタンをクリック
- 作成中に作業中のブラウザで別の画面などにいくとリセットされてしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/964fcb50-24ed-582a-8d9d-31834677856d.png)


## 動作確認
- Webサーバを落としたりしてテストする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/4ddfae88-2010-fa58-3ec7-1e06c0b5b937.png)
[Windows] SDカードをパーティション削除～フォーマットしたときのメモ

# もくじ

https://tera1707.com/entry/2022/02/06/144447

# やりたいこと

ラズパイ3でWindowsIoTcoreを動かしたときのSDカードを別のところで使いたかったのでフォーマットしようとしたときに、意外と詰まったので手順をメモ。

# 現状確認

Windows IoT coreをインストールした状態のSDカードは、下記のようにいくつかのパーティションに分かれていた。(E:,F:,H:,I:ドライブが、WindowsIoTcore関係だと思う)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/25cc6c77-d0b4-e471-f6a6-3f626bd77d03.png)
パーティションがいくつも分かれてると使いづらいので、1つにまとめてから使いたい。

# やってみる

エクスプローラを開いて、[PC]を右クリック > [管理] > [ディスクの管理]を選択する。
下記のような画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/c8d6f913-f82a-fa39-f71e-c121dba6212d.png)
ここで[ディスク2]が、今回フォーマットしようとしているSDカード。

今回の場合は、ディスク2が4つパーティションが切られているので、これを統合する。

ディスク2の削除したいパーティションを右クリック(下記のあたり)して、「ボリュームの削除」を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/f35e411e-92a6-8821-65b1-464d69c362bd.png)
そうすると、パーティションが消える。（下記では、2つ消した状態）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/6dbb7d97-112a-25fc-2e79-7c29e64d2759.png)
全部消すとこうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/d24da62f-ab8a-44cd-4586-c19ebee6684a.png)
これで、パーティションが消えた。(4つに分かれてたやつが統合された)
次に、ストレージとして使用できるように、フォーマットする。

未割当て、となっているところを右クリックして、「新しいシンプルボリューム」を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/fee59d19-392e-0351-0bef-a97d18998cdd.png)

下記のような画面がいろいろ出てくるので、指示にしたがって、やりたいようにフォーマットする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/ce04662b-16fb-4d49-2c44-c58403fd8535.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/bc019627-b206-1503-7db2-7b2a44d4b50d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/7fa71efc-a876-00cf-b6a1-9830774e53b4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/0d94d1af-ff0d-6866-43b7-7b6f2330e7ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/e6fab482-33c4-a561-6f1b-e49dad589c87.png)

これで出来上がり。

※なんかうまくいかないときは、一度SDを取り外しして、もう一度接続してみる。
その際、下記のような画面でフォーマットをしろと言われたら、それはそれで実施してもOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/2473febd-b661-434c-98e4-aa9d5128d2fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/15c6eb73-061d-de45-b9ca-fd5387d2c776.png)
【初心者でもわかる】ゆっくり[ ✕ ]にかわるハンバーガーメニュー

# どうも7noteです。シンプルできれいなハンバーガーメニューの作り方

ハンバーガーメニューの線をそのままゆっくり[ ✕ ]の形になるように移動させて見せるハンバーガーメニューの作り方。

シンプルな作り方で、クラスがついているかついていないかをjavascriptで切り分けて、CSSで見た目を変えていく方法です。

**見本**

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/b395cf3c-f4b4-2670-3d2b-5d53b0ed8f2f.gif)


※jQueryを使用しています。jQueryってなんだ?という方は[こちら](https://qiita.com/7note/items/45bd8efbedd557667218)

## [ ✕ ]にかわるハンバーガーメニューの作り方

```index.html
<header>
  <div class="menu open"><span></span></div>
</header>
```

```style.css
.menu {
  width: 20px;        /* メニューの横幅 */
  height: 16px;       /* メニューの高さ */
  position: relative; /* 基準値とする */
}

/* 3本線共通のCSS */
.menu span,
.menu::before,
.menu::after {
  width: 100%;           /* 横幅いっぱいに指定 */
  height: 2px;           /* 3本線の高さを2pxに指定 */
  display: inline-block; /* インラインブロック要素にする */
  background: #CCC;      /* 線の色をグレーにする */
  position: absolute;    /* 相対位置にする */
  left: 0;               /* 左からは0pxの位置 */
  transition: .5s;       /* 動きを0.5秒かけて動かす */
}

/* 真ん中の線 */
.menu span {
  top: 50%;                    /* 上から50%の位置 */
  transform: translateY(-50%); /* 線の高さ半分、上に戻す。 */
}
/* 上の線 */
.menu::before {
  content: "";  /* 疑似要素なので必須 */
  top: 0;       /* 上から0pxの位置 */
}
/* 下の線 */
.menu::after {
  content: "";  /* 疑似要素なので必須 */
  bottom: 0;    /* 下から0pxの位置 */
}

/* 〜〜〜ここから下開いた時のCSS〜〜〜 */
.menu.open span {
  opacity: 0;   /* 真ん中の線は透明にする */
}

.menu.open::before {
  top: 7px;     /* 上から7pxに指定（大きさによって微調整必要） */
  transform: rotate(45deg);  /* 45度回転させる */
}

.menu.open::after {
  bottom: 7px;  /* 下から7pxに指定（大きさによって微調整必要） */
  transform: rotate(-45deg); /* -45度回転させる */
}
```

```script.js
$(function(){
  //「メニュー」がクリックされた場合
  $('.menu').on('click',function(){
    $(this).toggleClass('open');  // openのクラスをつけたり消したりする
    /*~~ここにメニューを表示したりするscriptを書く~~*/
  });
});
```

## 解説

シンプルな作りにしました。
CSSは気持ち**長いソースですが、1つ1つは難しいことをしていません**ので、ゆっくり見ていけばわかるかなと思います。
CSSのポイントは`transition: .5s;`を指定することで、ふわっとした動きを実現しています。
これがあるかないかだけでもグッと印象が変わるので、個人的にはアリのほうがいいかなと思います。
スタイリッシュにシュッシュって動くようなサイトならなくてもいいかもしれませんね。

scriptの方は短く、.menuがクリックされたときに反応するように書き、その都度`open`のクラスをつけたり消したりを切り替えるという処理を書いています。
toggle系は便利ですが、他のscriptと併用して使う場合に不都合が出ることもあるので、他に入れたい処理とうまく調和させながら使ってください。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
SlackにPostするプログラムをGOで作りコンテナ化する


#はじめに
以下のサイトのプログラムを改造して、コンテナ化する。

[GoでSlackにPostする](https://qiita.com/yhidetoshi/items/5e47fc8a54eb9f7380ff)

#フォルダ構成

raspberrypiで実行するためのDockerコンテナを作る構成
なお`github.com/ashwanthkumar/slack-go-webhook`はcurlをインストールしないと
実行できないので、インストールを行う

```
./
├── Dockerfile
└── golang
    └── main.go
```


```:Dockerfile
FROM multiarch/ubuntu-core:armhf-bionic As builder
RUN apt update &&\
    apt install -y curl gcc git
RUN  curl -OL https://dl.google.com/go/go1.14.4.linux-armv6l.tar.gz
RUN tar -C /usr/local -xzf go1.14.4.linux-armv6l.tar.gz
RUN rm -rf go1.14.4.linux-armv6l.tar.gz
ENV PATH $PATH:/usr/local/go/bin
RUN go get -u github.com/ashwanthkumar/slack-go-webhook
WORKDIR /app
ADD ./golang/ ./
RUN go build -o app
FROM multiarch/ubuntu-core:armhf-bionic
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y curl && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* 
WORKDIR /app
COPY --from=builder /app/app /app
COPY ./golang/conf ./
CMD ["./app"]
```

`Pmain.go`のプログラムはリンク先から借用
`WEBHOOKURL`の値は以下のリンクから取得できる
[Incoming Webhook](https://apptestslackk-ntp1946.slack.com/apps/new/A0F7XDUAZ--incoming-webhook-)

```go:main.go
package main

import (
    "github.com/ashwanthkumar/slack-go-webhook"
    "os"
)

const (
    WEBHOOKURL = "https://hooks.slack.com/services/XXXX" //Webhook URL
    CHANNEL    = "dev"  //送信先チャンネル
    USERNAME   = "GoBot" //表示User名
)

func main() {
    PostSlack("HelloWorld!!")
}

func PostSlack(msg string) {
    field1 := slack.Field{Title: "Message", Value: msg}
    field2 := slack.Field{Title: "AnythingKey", Value: "AnythingValue"}

    attachment := slack.Attachment{}
    attachment.AddField(field1).AddField(field2)
    color := "good"
    attachment.Color = &color
    payload := slack.Payload{
        Username:    USERNAME,
        Channel:     CHANNEL,
        Attachments: []slack.Attachment{attachment},
    }
    err := slack.Send(WEBHOOKURL, "", payload)
    if err != nil {
        os.Exit(1)
    }
}
```

# Docker実行
以下のコマンド尾の通り実行すれば、Slackに文字列を投稿できる。

```
docker build -t slackpost .
docker run --rm slackpost
```

コンテナの応用として、以下の通りコードを追加すると
環境変数から投稿先を変更できる。

```go
type SlackSetUp struct {
	WebUrl    string
	Channel   string
	UserName  string
}

func EnvConfRead() SlackSetUp {
	var tmp SlackSetUp
	if str := os.Getenv("SLACK_URL"); str != "" {
		tmp.WebUrl = str
	}
	if str := os.Getenv("SLACK_CHANNEL"); str != "" {
		tmp.Channel = str
	}
	if str := os.Getenv("SLACK_USERNAME"); str != "" {
		tmp.UserName = str
	}
	return tmp
}

```
railsでview_componentを使ってみる

# view_componentとは
github製のgemです。
https://github.com/github/view_component

render partialのパワーアップ版みたいなもので、viewのコードを再利用したい時やテストを書きたい時に便利そうです。

こんな感じでrubyとtemplateをセットで用意できるので、partialに比べてロジックやデータの受け渡しが書きやすそうです。

```app/components/test_component.rb
class TestComponent < ViewComponent::Base
  def initialize(title:)
    @title = title
  end
end
```

```erb:app/components/test_component.html.erb
<span title="<%= @title %>"><%= content %></span>
```

呼び出すときはこんな感じです。

```erb
<%= render(TestComponent.new(title: "my title")) do %>
  Hello, World!
<% end %>
```

定義した `@title` とは別に、blockで渡した内容は自動的に `content` というaccessorに割り当てられます。

# インストール
gemを追加して `bundle install` でインストールできます。

```ruby
gem "view_component", require: "view_component/engine"
```

# バージョンについて
rails5.0以上で動くようです。
ただしrails6.1未満だとrenderメソッドにモンキーパッチが当たるようです。

モンキーパッチを当てたくない場合は `render_component` を使うこともできます。

```ruby
config.view_component.render_monkey_patch_enabled = false # defaults to true
```

```erb
<%= render_component Component.new(message: "bar") %>
```


# view_componentの作成
railsコマンドでview_componentを作成してみます。

```
bin/rails generate component Example title
```

こんな感じでファイル一式が作成されます。

```
Running via Spring preloader in process 407
      create  app/components/example_component.rb
      invoke  test_unit
      create    test/components/example_component_test.rb
      invoke  erb
      create    app/components/example_component.html.erb
```

# preview機能
ActionMailerのようにview_componetをpreviewで確認できます。

```test/components/previews/test_component_preview.rb

class TestComponentPreview < ViewComponent::Preview
  def with_default_title
    render(TestComponent.new(title: "Test component default"))
  end

  def with_long_title
    render(TestComponent.new(title: "This is a really long title to see how the component renders this"))
  end

  def with_content_block
    render(TestComponent.new(title: "This component accepts a block of content")) do
      tag.div do
        content_tag(:span, "Hello")
      end
    end
  end
end
```

これで下記のurlにアクセスするとpreviewを確認できるようになります。
http://localhost:3000/rails/view_components/test_component/with_default_title
http://localhost:3000/rails/view_components/test_component/with_long_title
http://localhost:3000/rails/view_components/test_component/with_content_block

# テストの書き方
`render_inline` でview_componentを呼び出して、内容をテストできます。


```ruby
require "test_helper"

class HelloComponentTest < ViewComponent::TestCase
  def test_component_renders_something_useful
    assert_equal(
      %(<div>hello bob</div>),
      render_inline(HelloComponent.new(name: "bob")).css("div").to_html
    )
  end
end
```

# ドキュメント
今回紹介したもの以外にも色々機能があるようなので気になる方は公式ドキュメントをご覧ください。
https://viewcomponent.org/
アニメーションライブラリJavis.jlを試す！

[Juliaアドベントカレンダー](https://qiita.com/advent-calendar/2020/julia)19日目です。

Javis.jlという簡単にアニメーションを作成できるライブラリを使っていきます。

## 導入
例のごとく

```julia
julia> ]add Javis
julia> using Javis
```
で使えるようになります。

 LaTeXを使いたいのであれば、

```shell

> npm install -g mathjax-node-cli
julia> ]add LaTeXStrings
 
```

で使えるようになるようです。

他に、画像処理用のモジュールとして、`ImageIO QuartzImageIO ImageMagick`等必要に応じて追加が必要なようです。

## まずは簡単な例を動かす！
[Javis.jlのExample](https://github.com/Wikunia/Javis.jl/blob/master/examples/fourier.jl)からJuliaのロゴを描くサンプルを実行してみます。

上記実行した感じ特に問題なく、動きました。

![julia_logo_dft.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397374/57aed73c-af53-1ccb-c5e0-b30c8126821f.gif)


## 基本的な使い方
`Video = video(width, height)`で表示領域作成します。

あとは、作りたい図形を定義して、そこにアニメーションを付加していくだけです。

```julia

function ground(args...)
    background("white") # canvas background
    sethue("black") # pen color
end

# 100フレーム作成
Background(1:100, ground)
# 四角形作成
obj = Object((args...) -> rect(O, 50, 50, :fill), Point(100, 0))
# 0を起点に一回転
act!(obj, Action(1:50, anim_rotate_around(2π, O)))

```

## Jupyter Notebookで動かす
このライブラリで、保存される成果物はgifです。

gifの表示は
`display("image/gif", read(filename))`でいけるため、それ使います。

```julia

function ground(args...)
    background("white") # canvas background
    sethue("black") # pen color
end

myvideo = Video(500, 500)

Background(1:100, ground)

obj = Object((args...) -> rect(O, 50, 50, :fill), Point(100, 0))

act!(obj, Action(1:50, anim_rotate_around(2π, O)))

display("image/gif", read(render(myvideo)))

```

![javis_4QOj9kE.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397374/6263ce65-9f51-ba36-a59e-018ddb7c9d4b.gif)


## Weave.jlで表示

Weave.jlでJavie.jlの機能を使いたいという特殊な場合があれば、以下ですればいいと思う。

```
    
    ```julia;echo=false;results="hidden"
    
    using Javis, Plots
    function ground(args...)
        background("white") # canvas background
        sethue("black") # pen color
    end
    
    myvideo = Video(500, 500)
    
    Background(1:100, ground)
    
    obj = Object((args...) -> rect(O, 50, 50, :fill), Point(100, 0))
    
    act!(obj, Action(1:50, anim_rotate_around(2π, O)))
    
    render(myvideo; pathname="sample.gif")
    
    ```
    
    ![Alt txt](sample.gif)

```

上のは、ターミナル表示も結果表示も切って、動的？に作られたgifを表示するためのものです。

いちいち、gifを作りなおして、再リンクしなおすのが面倒とかいう場合には使えるかもしれません。

例えば、自分のホームページ上にgifを使うって、いちいち書き出すのが面倒とか。

## 感想

基本的な動きはサポートされてるみたいなので、簡単なアニメーションを作成する時に敷居は低くなりそうですね。
DynamoDB と検索

これは思考を整理するためのメモ書きであり、ナレッジではありません。

# 検索の種類

- キーによる一本釣り
- 複合キーによる一本釣り
- キー以外のフィールドに対する完全一致判定
- 部分一致判定
- 大小判定
- AND演算 による絞り込み
- OR演算 による結合
- NOT演算 による反転

# DynamoDB で実現可能か

## キーによる一本釣り

Hash Key にキーを格納することで可能

## 複合キーによる一本釣り

Hash Key に複数のフィールドの値を結合した文字列を格納することで可能

## キー以外のフィールドに対する完全一致判定

グローバルセカンダリーインデックスを作成すれば可能。
ただし、値が十分に分散する必要がある。（例えば、動画の視聴回数のような、値に偏りがある場合はだめ）

## 部分一致判定

Range Key に対する Begins with だけが可能。

## 大小判定

Range Key に対してのみ可能。

## AND 演算 による絞り込み

Hash Key と Range Key でのみ可能

## OR 演算 による結合

一切できない

## NOT 演算 による反転

一切できない

# DynamoDB が苦手なクエリ

- キー以外のフィールドに対する完全一致判定
- Hash Key に対する部分一致判定
- Hash Key に対する大小判定
- Hash Key と Range Key 以外の組み合わせの AND演算
- OR 演算
- NOT 演算

## 自分が欲しいクエリ

- キー以外のフィールドに対する完全一致判定
- Hash Key に対する部分一致判定
- Hash Key に対する大小判定
- Hash Key と Range Key 以外の組み合わせの AND演算

# なぜ難しいか

## キー以外のフィールドに対する完全一致判定

値が分散していないとシャードが偏る

### どうすればいい？

値が分散しない＝値のバリエーションが少ないなので、事前に結果を作ってしまう

## Hash Key に対する部分一致判定

データがどのシャードにあるかを特定できなくなる

### どうすればいい？

高速な全文検索の仕組みがあればよさそう

## Hash Key に対する大小判定

データがどのシャードにあるかを特定できなくなる

### どうすればいい？

高速な全文検索の仕組みがあればよさそう

## Hash Key と Range Key 以外の組み合わせの AND演算

インデックスを作るのが難しい

### どうすればいい？

クエリを工夫（基本完全一致、最後だけあいまいな条件を付けられる）すれば高速な全文検索の仕組みがあればよさそう。

# DynamoDB に足りないもの

- 十分に値が分散しないケースでのインデックス作成
- 全文検索
Twitter で画像や動画だけが流れてくる Chrome 拡張をつくる

こんにちは 🥳

この記事は、 [LAPRAS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/lapras) 19 日目の記事です。
ほかにも楽しい記事がたくさんあるので要チェキです！

さて、突然ですがみなさんは Twitter で画像や動画だけをダラっと見たい時ありませんか？

私は写真が好きで、写真家さんのアカウントをたくさんフォローしているのですが、
最近作品と関係がないテキストだけのツイートもタイムラインに流れてくるようになり、
もっと写真だけ見たいなーと思うことがよくあります。 🤤

そこで、ツイートの本文のテキストが隠れた状態で、
画像や動画だけが流れてくるタイムラインを作ることにしました。 💡

Twitter を Instagram 感覚で見られるようにしたいので、 Twitgram と名付けました。
完成したものはGitHubで公開しているので、興味がある方はぜひどうぞ。
https://github.com/minojiro/twitgram-chrome-extension

## どうやって作る？

私は普段 Twitter 公式のウェブ版を使っているので、 Chrome ブラウザの拡張機能で作ることにしました。
当初 JavaScript で実装しようとしたのですが、 Twitter には無限のバーチャルスクロールが入っていることもあり、
ツイートを加工するタイミングを自前の JS と同期するのが難しそうな感じ…。

そこで、ツイートの表示の出し分けはCSSだけで実装することにしました。
CSS の解説は、実際に [Twitter のタイムライン](https://twitter.com/home) を
ブラウザのDOMインスペクタなどで見ながらだと理解しやすいかと思います。

### 機能が ON/OFF できるチェックボックスをつける

ここだけはJavaScriptで書きました。
まずはチェックボックスを body 直下に入れるスクリプトを書きます。

```js
var inputElemeent = document.createElement('input')
inputElemeent.setAttribute('type', 'checkbox')
inputElemeent.setAttribute('class', 'twitgram-toggle')
document.body.prepend(inputElemeent)
```

ただチェックボックスを入れただけです。
画面の左上に常時いてくれると便利なので、ちょっと CSS も書きます。
（CSS はすべて SCSS で書いていきます）

```scss
.twitgram-toggle {
  position: fixed;
  left: 20px;
  top: 20px;
  z-index: 100000;
}
```

このチェックが入った時にだけ、今回書くスタイルを適応させたいので、
ここからのスタイリングはすべてチェックが入った状態に限定して書いていきます。

```scss
.twitgram-toggle:checked ~ div {
  // ここに書いていく
}
```

### ツイート本文のテキストを非表示にする

本文のテキストはいらん！隠せ隠せ〜！

```scss
本文のテキスト {
  // 本文のテキスト
  display: none;
}
```

簡単ですね。

### メディアがないツイートは、ツイートのパネル自体を非表示にする

いよいよクライマックス。
画像や動画などのメディアの有無の分岐は、それらを wrap している div タグの `:empty` という擬似クラスできます。
しかし、「 `:empty` だったら先祖の div を隠す」という CSS は書けません。

そこで、このようにしてみました。

![image22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156563/f501b353-2f3a-a5ac-9aad-3eb1c6066ef3.jpeg)

```scss
青く囲われた箇所 {
  position: relative;
  overflow: hidden;
  ...
}
緑の箇所 {
  position: static;
  padding: 50px 0 40px;

  &:empty {
    // 中にメディアの要素がないとき
    padding: 0;
  }
}
赤の箇所 {
  position: absolute;
  ...
}
```
メディアの箇所以外の部分を `position: absolute;` で浮かせています。
そのままだと緑のメディアの箇所に他の赤い箇所の箇所が乗っかってしまうので、
中にメディアの要素があるときだけ、 `padding` を使ってその分のスペースを開けておきます。

すると…
![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156563/e2119e12-bb86-b006-4f34-2b6921a6b780.jpeg)
テッテレーーン🎉🎉🎉

メディアがない場合は、親要素の青い枠の高さがなくなり、
`overflow: hidden;` も効いているので中の要素が完全に隠れました。

あとはお好みで、不要な要素を隠したり、レイアウトをいじったりして、自分好みのTLにしていきます。

![スクリーンショット 2020-12-19 19.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156563/85ffd7b1-f341-4f77-f640-0db8736cdaf0.png)

## やってみて

画像や動画だけ見ていても、すぐに付随するテキストが読みたくなってチェック外しちゃいますね、これ………。
iOSアプリでYouTubeの動画を直接再生する方法

# 背景

業務で、「これまでYouTube動画を再生するのに、一度動画をエンベッドしたウェブページを経由していたが、ネイティブ画面に直接動画を埋め込みたい」という要件が出てきたので軽く調べてみたメモです。

結論から言うとネイティブのSDKなどはないようで、WebViewを利用してエンベッドした動画を再生するという方法になるようです。

公式に薄いヘルパーはあるもののObjective-Cだし、とりあえず再生させたいだけなので自前で実装してみる。
https://developers.google.com/youtube/v3/guides/ios_youtube_helper?hl=ja

# 実現方法

実装方法としては動画と同じサイズになるようにレイアウトしたWebViewを配置するだけ

こんな感じでWebViewを配置。動画は16:9なので、WebViewも16:9にしておく
![スクリーンショット 2020-12-19 19.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22205/709cbca7-b2f5-5dbc-37aa-8001a93d3134.png)

だらっと書いてしまってますが、ポイントは以下です

- レスポンシブに動画サイズを変更できるようにスタイル指定
- viewport指定をしておかないと、embedされた動画がPC向けになって操作しづらい
- scrollViewでbounceをOFFにしているが、拡大/縮小などもうちょっと制御した方がいいかも

```swift

import UIKit
import WebKit

class ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView! {
        didSet {
            webView.scrollView.bounces = false
        }
    }
    
    let vid = "M7lc1UVf-VE" // videoID
    lazy var htmlString = """
<!DOCTYPE html>
<html>
<head>
<meta charset=“UTF-8”>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
body {
    margin: 0px;
}
.youtube {
  position: relative;
  width: 100%;
  padding-top: 56.25%;
}
.youtube iframe {
  position: absolute;
  top: 0;
  right: 0;
  width: 100% !important;
  height: 100% !important;
}
</style>
</head>
<div class="youtube">
<iframe width="375" height="210" src="https://www.youtube.com/embed/\(vid)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
</html>
"""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        webView.loadHTMLString(htmlString, baseURL: nil)
    }
}
```


雑ですが、ここまででとりあえずそれっぽく再生することはできました。
<a href="https://user-images.githubusercontent.com/1009747/102686410-eef49c80-422a-11eb-9749-e4f2e205aeb7.MP4"><img src="https://user-images.githubusercontent.com/1009747/102686496-78a46a00-422b-11eb-83d0-bc9e1a45ac62.PNG" width="320"></a>



# サンプル
https://github.com/satorun/EmbedYouTubeVideos/tree/main

### 環境
- Xcode12.3
- iOS14.0
UE4.26でPowerIKを有効化したときにPowerIKToolモジュールが云々と出たら

Discordでも話に上がっていて、優しい人が教えてくていました。

POWERIK.dllというファイルを

C:\Program Files\Epic Games\UE_4.26\Engine\Plugins\Marketplace\PowerIK\Source\PowerIKRuntime\sdk\lib\Win64

から

C:\Program Files\Epic Games\UE_4.26\Engine\Plugins\Marketplace\PowerIK\Binaries\Win64

にコピーすればOKです。やったー
ロールバックせずにマイグレーションファイルを削除する方法

＜この記事について＞
自作のアプリ製作中にカラム修正のために、マイグレーションファイルを削除。
毎回ロールバックして削除するのが手間で、他の方法を学んだので備忘録として投稿します！

[環境]
・Ruby 2.6.5
・Rails 6.0.0
・macOS

まずは、以下のコマンドを実行してマイグレーションファイルの現状を確認しましょう！

```
$ bundle exec rake db:migrate:status
```

次はステータスの確認です。

一番左の"Status"が"up"となっているものは修正など一切できない状態なので、"down"にする必要があります。

削除したいファイルが"up"になっている場合は、以下のコマンドで"down"にします。

```
$ bundle exec rake db:migrate:down VERSION=(削除したいファイルのMigration ID_Migration Name).rb  
  * IDとNameを"_"で繋いで".rb"を後ろに足す。
```

もう一度ステータスを確認しましょう！

```
$ bundle exec rake db:migrate:status
```

削除したいファイルが"down"になっていれば、あとは削除して完了です！
  * "down"にならない人は数字や誤字を確認して下さい。

```
$ rm -rf db/migrate/(削除したいファイルのMigration ID_Migration Name).rb
```
無事に消えましたか？

自分自身、初学者のため分かりにくい点もあったかと思いますので、徐々に改善できるように日々改善していきます🙇‍♂️
目的にあった技術を選ぶために【コーポレートサイト編】

##　はじめに
知人からコーポレートサイトの依頼を頂いた。
railsを学習していたので、railsを使って作成しようと一度は思ったのですがなんか違うなと思い。
目的にあった技術を選択して作成することにしました。

サイトの一覧を見ていると、SPAで作成されているのを見かけたので向いているのか確かめる為に調べてみました。

下記の技術より向いているのがあるよ。など、ご教授いただけると幸いです。

<br>

#SPA (Single Page Application)
Webサーバーからもらった唯一のHTMLファイル（index.html）を雛形にして、ページの一部だけをだけをJavaScriptのDOM操作で変更し複数ページを表現。

デメリット
初期表示の遅さ、OPGが使えない。（SSRを使用すればカバー出来る）

アプリケーション向き、ブログなどサイトのページ数が頻繁に変わるものはメリットがない。

<br>

# SSR (Server side Rendering)
SPAの改良版で、ページ遷移とコンテンツ切り替えはブラウザの仕事のままでページ固有の非同期リクエストのレスポンスでレンダリングで、レンダリング済のHTMLを渡します。

デメリット
ブラウザの仕事を引き受けているため、サーバー負荷が高い。
アプリケーションサーバーをNginxなどと連携する作業が必要、運用を考えた施策が必要。

小規模では、フル活用出来ない。そもそも表示の遅さに対応する必要があるか検討。

<br>

# SSG (Static Site Generator) 
SPA、SSRと違いJavaScriptを使ったブラウザでのページ遷移をしません。ページ遷移は従来のWebサーバーの仕事。サーバ上には各ページのHTMLファイルがあるのでそれを使用。しかも、その中身はレンダリング済のHTMLなので、ブラウザの仕事が削減されます。動的コンテンツは使う時は、Webサーバー、DBの連携が必要。

デメリット
ページ数が多い、動的コンテンツの割合が多いものには向かない。

サイトのページ数が少ないもの、動的処理があまり無いシンプルなサイト（コーポレートサイトなど）
ページ数が多くても、更新頻度が大したことのないサイトにも向いている。（ブログサイトも行けるかも）

<br>

# JAMstack
JAMstack （ジャムスタック）とはウェブサイトを構築・運用するための JavaScript ・ APIs ・ Markup を表します。

APIs はプログラムから利用するために作られたウェブサービスのことで、 Markup は HTML ファイルのことを指します。

特徴としては
 　● サイトの各ページに相当する HTML ファイルをプログラムを使って事前に生成しておく
 　● ブラウザからアクセスがあったときは事前に生成した HTML ファイルの中身をそのまま返す
 　● 動的な機能が必要な場合は JavaScript と API を利用して実現する


JAMstack は SSG 等の要素技術を組み合わせて「静的サイトと動的サイトのよいとこどり」をしたようなサイトを実現する手法全体を意味します。

 関係性で言うと、 SSG は JAMstack を実現するときに利用される要素技術のひとつです。 
 つまり SPA を作る JAMstack 構成も可能で、 SPA ではない JAMstack 構成も JAMstack 構成ではない SPA も実現可能。

同じと言えば同じであるが、厳密に言えば違うということ。


<br>
下記参考サイトにより詳しく記述あります。上記はざっくりと抜き出したものです。
[SPA、SSR、SSG][参考サイト](https://tadtadya.com/summary-of-the-web-site-display-process-flow/)
[JAMstack][参考サイト](https://dyno.design/articles/what-is-JAMstack/)

<br>
<br>

# 結論

Nuxt.jsでSSGよりのJAMstackなサイトを作成していこうと思います。

Vue.jsのフレームワークであるNuxt.jsを使用する理由は

学習コストが低い点やSSGで作成が出来るなどから、今の状況に適していると考えたからです。

<br>

クラウドはNetlifyを使用する予定をしています。


<br>

FireBaseとvue.jsを使った記事も多かったのですが、

下記サイトを参考にした所Netlifyの方がいいという結論に至りました。

[参考サイト](https://cloudlance-motio.work/post/netlify-vs-firebase/)


<br>


手探り状態で、やることになりますが

やらせて頂けることに感謝しつつ、取り組んで参ります。
「構造的連接」で拡張＞１ファイルのHTML(+JavaScript)で、QRcodeを生成する



#構造的連接とは？
「構造的連接」とは、だいぶ、いかつい名前だが、規格書に、そういう名で定義がある。複数のQRコードをあわせて読み取ることで、１つのデータを示す構成を言う。

>JIS規格の、X0510より、「8 構造的連接」から、以下抜粋
>引用ここから
![スクリーンショット 2020-12-19 19.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/df869da6-29fb-2693-fdcc-f8f4ccf602a4.png)
>引用ここまで


#構造的連接のQRコードを読み取るには
構造的連接に対応した、QRコードリーダーは、多くはない。
以下は、おすすめのアプリ

>ポメラQRコードリーダー
https://apps.apple.com/jp/app/%E3%83%9D%E3%83%A1%E3%83%A9qr%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC/id371963393


#ファイル
https://github.com/santarou6/QRcode_javascript/blob/main/QRcode_javascript40x16.html

#外観
![スクリーンショット 2020-12-19 19.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/ad70545d-6691-a857-453c-45a9b7223d4d.png)

#動作確認
http://thomas.cranky.jp/js_QR/QRcode_javascript40x16.html

#スマホ読み取り時の、外観
（●枚中の●枚目の読み取り、という表示になる）

![IMG_5282.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/37535467-536b-2344-cffa-9433972951b1.jpeg)

#技術面
それぞれのQRコードのデータの上位に、以下のようなデータが付されている
例） "0011" +"0000" +"0001" +"00010110"

"0011" 構造的連接をあらわす固定値
n番目 ・・・"0000"で１枚め。"0001"で２枚め
全m枚 ・・・"0001"で全２枚。"0010"で全3枚。1111で最大１６枚。
全データのXORのパリティ ・・・データ値のすべてXOR取った値。


#続編
→８つのマスクパターンを選べる版はこちら
１ファイルのHTML(+JavaScript)で、QRcodeを生成する #８つのマスクパタン対応
https://qiita.com/santarou6/items/cc73b5c7d048fbc5fb5a



#元記事
１ファイルのHTML(+JavaScript)で、QRcodeを生成する
https://qiita.com/santarou6/items/db17788158dba38f3a5c
FreeBSDをIPv6 + IPv4(DS-Lite)なルータにしたメモ

FreeBSDをIPv6(IPoE) + IPv4(DS-Lite)対応ルータ化したメモ

# 環境

FreeBSDのバージョン: 12.2-RELEASE
WAN側インターフェイス: re0
LAN側インターフェイス: ue0

# 使ったもの

- rtadvd
  - クライアントにIPv6アドレスを通知するため(ルータ広告)
- dhcpd
  - クライアントにIPv4プライベートアドレスを通知するため(DHCPサーバー)
- ndproxy
  - NDPパケットのプロキシ用
- ifconfig
  - DS-Lite設定など

# rc.confの設定

```conf
#/etc/rc.conf

#================================================
# IPv6関係の設定
#================================================
# IPv6のゲートウェイ化(フォワーディングが有効化される)
ipv6_gateway_enable="YES"
# すべてのインターフェイスを有効化
ipv6_activate_all_interfaces="YES"
# WAN側インターフェイスへのRA(IP自動設定)を受け取るようにする
# また、promiscモードを有効化する(確かndproxyが要求してた)
ifconfig_re0_ipv6="inet6 accept_rtadv promisc"
# LAN側インターフェイスはRAを受け付ける設定にしていても
# グローバルアドレスがついてくれないので手動でつける
ifconfig_ue0_ipv6="inet6 {IPv6プレフィックスアドレス}::1 prefixlen 64 -accept_rtadv"
# rtadvd(クライアントにRAを送るやつ)を有効化
rtadvd_enable="YES"
# rtadvdの対象をLAN側インターフェイスに設定
rtadvd_interfaces="ue0"
# rtsold(Router Soliticationメッセージを送信するやつ)
rtsold_enable="YES"
# IPv6のルートを設定
#  ゲートウェイアドレスは`route -6 show default`で表示できるが、
#  ipv6_gateway_enable="YES"となっているときは表示されないので、
#  無効化されているときに確認しておく
ipv6_defaultrouter="{ゲートウェイアドレス}%re0"

# ndproxyを有効化
ndproxy_enable="YES"
# WAN側インターフェイス
ndproxy_uplink_interface="re0"
# WAN側インターフェイスのMACアドレス
ndproxy_downlink_mac_address="{WAN側インターフェイスのMACアドレス}"
ndproxy_uplink_ipv6_addresses="{ゲートウェイアドレス}"

#================================================
# IPv4関係の設定
#================================================
# WAN側のIPv4を無効化
ifconfig_re0=""
# LAN側のIPv4アドレスの範囲を設定
ifconfig_ue0="inet 192.168.0.1 netmask 255.255.255.0"
# トンネル設定
cloned_interfaces="gif0"
ifconfig_gif0_ipv6="inet6 tunnel {WAN側グローバルIPv6アドレス} {AFTRのアドレス} prefixlen 128 mtu 1500"
defaultrouter="-iface gif0"
# ゲートウェイモードを有効化(フォワーディングなど)
gateway_enable="YES"
# DHCPDを有効化
dhcpd_enable="YES"
dhcpd_flags="-q"
dhcpd_conf="/usr/local/etc/dhcpd.conf"
# DHCPの対象インターフェイスを設定
dhcpd_ifaces="ue0"
```

# rtadvdの設定

ue0に接続された機器に対してルータ広告するやつ DNSサーバーも渡そうと思えば渡せる

```conf
#/etc/rtadvd.conf

ue0:\
  :addr="{IPv6プレフィックスアドレス}":prefixlen#64:
```

# dhcpdの設定

ローカルIPv4アドレスの設定用

```conf
#/usr/local/etc/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.10 192.168.0.100;
  option routers 192.168.0.1;
  option domain-name-servers {プライマリDNSサーバー}, {セカンダリDNSサーバー};
}
```

# pfの設定

```conf
# /etc/pf.conf

block in log all flags any
acceptable_protos="{" icmp6 icmp igmp "}"
pass in proto $acceptable_protos all flags any
# ゲートウェイからのアクセスを受け付けるため
pass in from fe80::/64 to any flags any
# ローカルからのパケットを受け付ける
pass in on $lan_if all flags any

# 出ていくやつは全部許可する
pass out all flags any
```

これで設定終わり

# 感想とか

使ってた1Gbps対応USB-LAN変換器が90Mbpsくらいしか出なくてしばらく躓いたのがつらかった(やる気が出たらメモするかも)
Built_Valueのすすめ (シリアライズ)

この記事は[こちら](https://stacksecrets.com/flutter/json-serialization-in-dart-flutter-with-built_value)の和訳です。Flutterを触り始めて理解があやしかったBuild_Valueライブラリについて、自分の勉強用にまとめます。

## イントロ
前の記事でも書いたが、DartはJSONシリアライズのサポートが不十分であり、自前で実装するために毎回長いコードを書かなくてはいけない。そこでBuilt Valueの出番となる。

## Serializerのセットアップ
2つのステップでセットアップする。
1. モデルの定義にstatic Serializerを追加
2. トップレベルのSerializerを定義する

## 1. モデルの定義にstatic Serializerを追加
[前の記事](https://qiita.com/stoneshower/items/24e9165974c825f8b0a6)のContactモデルを使ってシリアライズの設定をする。
static Serializerを追加するとこのようになる。

```dart
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

part 'contact.g.dart';

abstract class Contact implements Built<Contact, ContactBuilder> {
  Contact._();
  factory Contact([updates(ContactBuilder b)]) = _$Contact;

  static Serializer<Contact> get serializer => _$contactSerializer;

  int get id;

  String get fullName;

  @nullable
  int get age;

  @nullable
  String get mobile;

  @nullable
  bool get isFriend;
}
```

ここで下記のコマンドで再度`contact.g.dart`を生成する

```
flutter packages pub run build_runner build
```

するとserializerが追加されているのがわかる。

```dart
part of 'contact.dart';

Serializer<Contact> _$contactSerializer = new _$ContactSerializer();

class _$ContactSerializer implements StructuredSerializer<Contact> {...}

class _$Contact extends Contact {...}

class ContactBuilder implements Builder<Contact, ContactBuilder> {...}
```

## 2. トップレベルのSerializerを定義する
次に`serializers.dart`ファイルを追加する。

```dart

// serializers.dart

import 'package:built_value/serializer.dart';

import 'contact.dart';

part 'serializers.g.dart';

// モデルはここのリストに追加する
@SerializersFor([
  Contact,
])
final Serializers serializers = _$serializers;
```


ここで下記のコマンドで`serializers.g.dart`を生成する

```
flutter packages pub run build_runner build
```

## 使ってみる

```dart
Contact contact3 = Contact((b) => b
    ..id = 1
    ..fullName = 'Stack Secrets');
```

```
[Contact, id, 1, fullName, Stack Secrets]
```

serializers.dartを下記のように変更。

```dart
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';

import 'contact.dart';

part 'serializers.g.dart';

@SerializersFor([
  Contact,
])

final Serializers serializers =
    (_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

```


```dart
Contact contact3 = Contact((b) => b
    ..id = 1
    ..fullName = 'Stack Secrets');
```

するとJSONフォーマットで出力できた。

```
{$: Contact, id: 1, fullName: Stack Secrets}
```
入力フォームのはみ出す文字を縮小して全体表示する機能の実装について

# はじめに
今回の記事はエンジニアを目指す前の
物流企業の事務だった私がプログラミングを使って
課題を解決していく過去のお話です。

# 背景
前職にて、市販の業務ソフトを使って、
人事書類のワークフロー化に携わることになりました。
その時、ソフトの既存機能では叶えられない問題が１つありました。
__「データーベースから出力した文字に対して、文字を縮小して全体表示する機能」__がなく見にくいことです。
そこで解決方法を探していると追加機能をjavascriptで実装出来るとありましたので実行に移すことにしました。

因みに当時の私のスキルはjavascriptを全く使ったことがない素人です。
ソフトについてきたjavascript追加実装のマニュアルを見ながら作成しました。

# 課題の前提条件
・　入力フォームは縦と横のサイズ(px)からなる。
・　入力文字はフォントサイズ(px)からなる。
・　縦と横のサイズは固定されている。
・　入力する文字数が都度与えられる。
・　文字のフォントサイズを求めたい。

## 解法に対する計算方法
上記条件を基に入力された文字数に応じて変動する
フォントサイズXを求める式を考える。


```math

フォントサイズ = X\\
横幅 = W\\
縦幅 = H\\
文字数 = L\\
横幅に入る文字数 = W÷X\\
縦幅に入る文字数 = H÷X\\
文字数(L) = (W÷X) × (H÷X)\\
X^2 = (W × H)÷L\\
X = {\sqrt{(W × H)÷L}}

```
結果、フォームに文字がぴったりおさまるフォントサイズを求める式が出来た。
これをプログラミングに落とし込めば完成。

# 実装コード例
```test.js
  var target = document.getElementById("test");
  var width = target.clientWidth;
  var height = target.clientHeight;
  var length = target.value.length;
  var fontsize = Math.floor(Math.sqrt((width*height)/length));
  var maxsize = 18;
  if(fontsize > maxsize){
    fontsize = maxsize;
  }
```
#### コード解説
fontsizeはフォーム内の横幅と縦幅にぴったりおさまる文字のサイズを求めています。
Math.sqrtでルートの計算が出来ます。
fontsizeの計算結果次第で小数点以下の数値が出力されるので小数点以下を切り捨てして、
整数値を回答として設定しました。
また、上限が設けられていないとフォントサイズが100pxになるなどの問題があったので、フォーム内で表示するフォントサイズの最大値を設けました。
結果、指定したフォントサイズ以下に縮小して文章全体が見れるようになりました。


## 最後に
ここまで記事を見てくださりありがとうございました。
このような形でプログラミングに落とし込んで自動で縮小する機能を実装出来たのは、
物事の仕組みがどのようになっているのかなと疑問を持って考えてきたからだと思います。どうやったら出来るのか。何が必要なのか。複雑なことはシンプルな部分を考えて組み合わせる。
今後も繰り返しこのなぜなぜを取り組み続けて、もっと精進して参ります。
Raspberry Piブート用に大容量SDカードをFAT32でフォーマットしたい

###記事を書いた理由
ラズパイ関連の記事は古いものも多く、32GBを超える容量のMicro SDは使用できない、とまで書いてある記事を見つけた。結論から言えば、公式のアプリ(Raspberry Pi Imager)を使えば大容量のMicro SD(今回試したのは128GB)でも使用可能であり、本件に関する現時点(2020年12月現在)においてのベストソリューションと思われる方法をまとめてみた。

###はじめに

SDカードの容量が大きくなってくるとwindowsからのフォーマットはFAT32が選択できなくなってしまう。
これだとラズパイのストレージとして使用できない。

例1：8GBの場合
![format_8gスクリーンショット 2020-12-19 183130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70666/11cedee6-6846-f7b9-4066-f8a9fa89dfd8.png)

例1：128GBの場合
![format_128gスクリーンショット 2020-12-19 183130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70666/9e270f77-b51c-1778-ef7a-ccd14005c4d0.png)

ちなみにMacだとFAT32が選択可能(MS-DOSと表示されるが今でも通じるのだろうか…)
![mac fotmat msdos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70666/9a3df279-cb48-940e-60dd-4723f41a787c.png)

###どうするか？
Windowsユーザの場合、この為だけにMacを買ってもよいが、現実にそんな人はいないと思うので、その場合はRaspberry Pi Imagerをインストールし、そこからフォーマットするとよい([ダウンロードサイト](https://www.raspberrypi.org/software/))。

Raspberry Pi Imagerを起動したら、”Operating System"から”ERASE”を選択し、SD Cardを指定後、”WRITE”を押すだけ。

![imager fat32 format.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70666/b013660d-a204-97f4-d9ef-ebce554e893f.png)

128GBのMicroSDでも無事FAT32でフォーマットされました！
![formatted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70666/8596aab2-68e6-cb1f-e01c-ebf84e6c02aa.png)
[体験談: 半日で合格] 技術士(情報工学)第一次試験勉強法～情報学部の学生は積極的に受けよう！～

:::note info
最新記事はこちらです。
[技術士(情報工学)第一次試験勉強法～情報学部の学生は積極的に受けよう！～](https://zenn.dev/pokopokoomochi/articles/60d3da554fce87)
:::



私は令和2年度技術士(情報工学)第一次試験に合格することができました。

**試験前日の夕方から勉強して合格**することができました。
この経験から技術士試験の勉強方法について共有します！

合格時の経歴
・工業高校電子工学科卒業
・情報技術検定一級合格(基本情報技術者試験の足がかり的試験)
・大学工学部３年生(専門:電子情報)
・エンベデッドシステムスペシャリスト試験勉強中

想定読者
・特に情報学部の大学生(２年生以上)

# 取得するメリット
以下の３つのサイトを見てみると技術士(情報工学)のメリットを感じることができると思います。

[情報工学部門の技術士がフリーランスとしてどんな仕事をしているのか？](https://note.com/masuipeo/n/n8b9ec7848ceb)
[ITエンジニアにとって技術士は本当にメリットがないのか？](http://wowlog.green-boy.com/2017/04/it.html)
[情報処理技術者のための技術士受験のすすめ](https://www.slideshare.net/akimicyu/ss-138027220)


# 勉強法
## 基礎科目:
大学に入ってからの数学、物理、化学の基礎科目などをある程度勉強している方は、特に**対策する必要**はありません。
過去問を覗いておく程度で良いと思います。

## 専門科目:
大学で情報系を勉強している人や応用情報技術者試験を合格している方は、特に**対策する必要**はないと思います。
私的には、応用情報技術者試験の１次試験+α程度のレベルに感じました。
不安な方は過去問をやっておくと良いでしょう。加えて、応用情報技術者試験の１次試験の過去問を勉強するのも有効だと思います。
また、**高度情報処理技術者のいずれかに合格している方は免除**されます。

## 適性科目:
この科目は必ず**勉強する必要**があります。この科目は技術者倫理、及び関連する法令を問われます。技術者倫理は、常識問題に近いので、勉強していなくてもある程度は点数は取れると思います。しかしながら、技術士法の知識も問われるので、そこは勉強しなくてはなりません。
こちらの[サイト](https://pe.hpeo.jp/entry/pe/law)の内容を読み込んで理解し、５年分ほど過去問を回せば良いと思います。

# まとめ
真面目に情報を学んでいる学生にとっては、特に普段の生活に負担にならずに取得できると思います。今は必要性を感じないかもしれませんが、持っていても損をすることはないので、比較的時間がある大学生の間に取得することをおすすめします！
【Flask】Message Flashingでメッセージを出す

# flash
メッセージを表示させることができる。

# 階層
[こちら](https://qiita.com/eee-lin/items/4e9a2a308ca52b58fd1e)の続き。新たに`user.html`を追加した。

![スクリーンショット 2020-12-19 18.48.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/b4d648a2-a646-499b-8632-16008688b890.png)

# プログラムコード
```app.py
from flask import Flask, redirect, url_for, render_template, request, session, flash #flash追加
from datetime import timedelta #時間情報を用いるため

app = Flask(__name__)

app.secret_key = 'user'
app.permanent_session_lifetime = timedelta(minutes=5) # -> 5分 #(days=5) -> 5日保存

@app.route("/")
def home():
  return render_template("index.html")

@app.route("/login", methods = ["POST", "GET"])
def login():
  #データベースに情報を送るとき
  if request.method == "POST":
    session.permanent = True  # <--- makes the permanent session
    user = request.form["nm"] #ユーザー情報を保存する
    flash("Login Successful!!") #flash
    session["user"] = user #sessionにuser情報を保存
    return redirect(url_for("user"))
  else: #情報を受け取るとき
    if "user" in session: #sessionにユーザー情報があったとき
      flash("Already Logged In!!") #flash
      return redirect(url_for("user")) #userページに遷移
    return render_template("login.html") #sessionにユーザー情報がなかったときはloginページに遷移

@app.route("/user")
def user():
  if "user" in session:
    user = session["user"] #sessionからユーザー情報をとってくる
    return render_template("user.html", user=user)
  else:
    flash("You are not logged in!") #flash
    return redirect(url_for("login"))

@app.route("/logout") #ログアウトする
def logout():
  if "user" in session:
    user = session["user"]
    flash(f"You have been logged out, {user}", "info")
  session.pop("user", None) #削除
  return redirect(url_for("login"))

if __name__ == "__main__":
  app.run(debug=True)
```

```index.html
{% extends "base.html" %}
{% block title %}Login Page{% endblock %}

{% block content %}
<form action="#" method="post">
	<p>Name:</p>
	<p><input type="text" name="nm" /></p>
	<p><input type="submit" value="submit"/></p>
</form>
{% endblock %}
```

```user.html
{% extends "base.html" %}
{% block title %}User{% endblock %}
{% block content %}
  {% with messages = get_flashed_messages() %}
  {% if messages %}
    {% for msg in messages %}
      <p>{{msg}}</p>
    {% endfor %}
  {% endif %}
  {% endwith %}
<p>Welcome, {{user}}</p>
{% endblock %}
```

# 使い方
flashをインポートする。
`import flash`

メッセージは、
`flash("You are not logged in!")`
`flash("メッセージ")`
のように書く。

メッセージを表示させたいときは、表示させたいファイルの中の(ex `user.html`)
`{% block content %} {% endblock %}`
の中に、以下のコードを書く。

```python
  {% with messages = get_flashed_messages() %} #flashのメッセージを受け取る
  {% if messages %} #メッセージがあったら
    {% for msg in messages %} #メッセージを一つずつ出力する
      <p>{{msg}}</p> #pタグでメッセージを出力する
    {% endfor %} #for終わり
  {% endif %} #if終わり
  {% endwith %} #flashメッセージ終わり
```
# まとめ
1. `app.py`のViewのプログラムの中で、`flash()`とするとメッセージを設定することができる。

2. `flash()`したメッセージは、テンプレートのHTMLの中で、`get_flashed_message()`することで取り出すことができる。

3. flashのメッセージは、設定した次のリクエストで表示可能。

# 参考
[Flask Tutorial #6 - Message Flashing](https://www.youtube.com/watch?v=qbnqNWXf_tU)
Google スライドのプレゼンテーション時の下側に表示されるメニューを消す

#はじめに
「Googleスライド」というGoogle製のWebアプリ(WindowsのPowerPointに酷似)があるんですが、プレゼンテーション中に下側にメニューが出てうざいので消してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/bd65ea4a-4ce2-1f51-bdbe-5d5f80f0c80f.png)

#GoogleChromeの拡張機能で消す

手順を示します。
①: 以下の3つファイル(manifest.json, content.js, jquery.min.js)を作成する

manifest.json

```xml
{
  "name": "Hide Google Slide Presentation Menu",
  "manifest_version": 2,
  "version": "1.0",
  "browser_action": {
    "default_title": "Hide Google Slide Presentation Menu"
  },
  "description": "Google スライドのプレゼンテーション時の下側に表示されるメニューを消す",
  "content_scripts": [
    {
      "matches": [
        "https://docs.google.com/presentation/*"
      ],
      "js": ["jquery.min.js", "content.js"]
    }
  ]
}
```

content.js

```js
$(() => {
	setInterval(() => {
	    const $elm = $('iframe').contents().find('.punch-viewer-nav');      
	    if($elm.length) {
	    	$elm.hide();
	    }
	}, 1000);
});
```

適当なバージョンのjquery.min.js

②: 3つのファイルを同一フォルダに置く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/bdbfe940-c62b-2cd3-9946-5c300bb30dad.png)


③ GoogleChromeで拡張機能を開き、デベロッパーモードをONにして、フォルダごとドロップする
デベロッパーモードの切り替えは右上にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/de4a32b2-01eb-41bb-fcd0-580e6a232cc0.png)


④ Google スライドを開いて、プレゼンテーションを開始する。一瞬メニューが見えますがすぐに消えるはずです。

#ダウンロード
<a href="https://drive.google.com/drive/folders/0B_lKV7pwoDrcWkdXS2dHVGtzSUU">こちら</a>からダウンロードできます。
hideGoogleSlidePresentaionMenuフォルダ毎ダウンロードして、解凍してください。あとは③と同様にフォルダ毎ドロップしてください。
hideGoogleSlidePresentaionMenu2はON/OFFなど少し設定が可能です。

###hideGoogleSlidePresentaionMenu2の設定ポップアップ
チェックボックスで消すかどうか選択できます。
今後selectorが変わってもいいように変更できるようにしています。(基本的にSelectorは変更しないでください)
Intervalはメニューが表示されているか監視する間隔です。(プレゼン開始後、消えるまでの最大時間とお考え下さい。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/2eb1b561-e85b-4578-bdab-7ff980b6d39e.png)


#最後に
少しググったんですが、あーもうめんどくせーってことで自分で消しました