OmniAICreator/Qiita-1.07M huggingface dataset:
鹿児島のエンジニアコミュニティ集まれ!!

# 鹿児島のエンジニアコミュニティ集まれ!!

　先日鹿児島では「エンジニアとしての生き方」をテーマとするエンジニアのイベント、**さくらじまハウス2020🌋**が開催されました！学生から社会人、そしてエンジニアをはじめ様々な職種の参加者は2日間で約200名に上り、大盛況の刺激溢れる2日間となりました。
　さくらじまハウス2020初日の「鹿児島のエンジニアコミュニティ集まれ!!」というセッションについてまとめてみました。

# セッションについて🏠

　今回のセッションには5名が登壇され、鹿児島のエンジニアコミュニティや運営の難しさを語りました。
　　- 上釜 幸大 (株式会社現場サポート/JAWS-UG鹿児島)
　　- くすたん (ナガシゲタスク/鹿児島.mk)
　　- 鶴田 真由美 (FLOW/Kagoshima WordPress Meetup)
　　- 古屋 保 (鹿児島大学/K-Ruby)
　　- 政倉 智 (かごんま.NET、かごべん、html5j 鹿児島、GitLab Meetup Kagoshima)
 
## 学んだこと
　- **鹿児島には色んなコミュニティがある！**
　　　今回のセッションにご登壇された方々が所属・マネジメントするコミュニティも多様でした。
　　　AWS, WordPress, Ruby, html5等々、分野も参加者も様々。

　- **初心者・初見さん歓迎！**
　　　コミュニティ参加のハードルの１つとなりそうなスキルレベル。
　　　自分のスキルを憂うこと勿れ、初心者も参加しやすいコミュニティは多くあります。
　　　また、初心者用プログラムを計画しているコミュニティもあるようです！
　　　*但し、コミュニティによっては一定のスキルレベル・習熟度がなければ積極的参加が難しい場合も。

　- **コミュニティは教室ではない**
　　　コミュニティを運営されている方の言葉です。
　　　教える側と教えられる側という絶対的な関係性ではなく、互いに教えあう**「共育」的な空間**がコミュニティ。
　　　いわば、全員が生徒であり、先生である。

## 思ったこと
　- **外に出てみよう！**
　　自分ができること・できないこと、知ってる技術・知らない技術など、一人では気づくのに時間がかかることがあります。
　　外部コミュニティに参加して**多種多様な考え方やスキル**に触れる→**視野の広い、柔軟な考え方**を持つエンジニアに。

　- **内輪感のない安心感**
　　コミュニティを運営されている方が心掛けていることして、**「内輪感を出さない事」**をあげてらっしゃっていました。
　　内輪感もコミュニティ参加の1つの大きなハードルではないでしょうか。（少なくとも私はそう感じます...）
　　初見さんを歓迎されているコミュニティは多くあるので、コンタクトを取ってみましょう。
　　雰囲気やコミュニティ参加者を知るために、見学や思い切って参加してみるのも一つの方法ですね。
　　
　- **とりあえずコミュニティに参加してみる**
　　コミュニティにはもちろん合う・合わないがあるが、まずはそのコミュニティに飛び込んでみるのも一手。
　　運営側もスタンスとしては、**来るもの拒まず去るもの追わず**といったスタンスをお持ちだという印象を受けました。
　　迷ったらまずは飛び込んでみる。

# 飛び出してみる
　今回のイベント参加で自分が知らない果てなきエンジニアの世界を見ました。まだまだそれは世界の一部かもしれませんが、このイベントで抱いた感情と刺激をこれからスキルや考え方に昇華させることがこのイベント参加の大きな意義だと思います。
　この想いや考えを温めていく、そして想いを受け止めてくださるのがコミュニティという存在だと思いました。
　自分の可能性を広げるため、鹿児島をITで盛り上げるため、まずは一歩どこかのコミュニティに飛び出してみようと思いました🌋

### リンク集

さくらじまハウス2020　イベントページ
https://www.sakurajima-house.tech/

鹿児島市の企業に勤めて、枕崎でテレワークしてる IT エンジニアっぽい人のブログ　(上釜幸大さんのブログ)
こちらのサイトに鹿児島のエンジニアコミュニティの詳細がまとめられています。
http://kusokamayarou.hatenablog.com/
カメラキャリブレーションの研究で役に立つ記事・スライドまとめ

## はじめに
大学でカメラキャリブレーションに関する論文を執筆していました。
この記事では、当時の僕がよく見ていた、カメラキャリブレーションに関する記事やスライド・ツールを共有します。

概念の理解や卒業研究の助けになれば幸いです。

## カメラキャリブレーションの基本的な理論
カメラキャリブレーションに関する学習記事をまとめました。
### 実践カメラキャリブレーション
https://www.slideshare.net/SSII_Slides/ssii2019ts3-149136612

京都大学の延原先生によるチュートリアル。
SSII2019(画像センシングシンポジウム2019)で特別講演をされた際のスライドです。

カメラキャリブレーションの基本が詰まっている素晴らしい資料です。

## キャリブレーションツール・ライブラリ
プログラミングとロジックに関する記事をまとめました。

### Open CV-Pythonチュートリアル >> カメラキャリブレーションと3次元復元
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_calib3d/py_table_of_contents_calib3d/py_table_of_contents_calib3d.html

Open CVを用いたカメラキャリブレーションのチュートリアル(鳥取大学による和訳)です。

カメラキャリブレーションの最も有名なチェスボード(白黒のボード)を使った手法の解説と実装となります。
コーナー検出や各種パラメータの計算ライブラリがOpen CVに実装されているので、まずはこれを読んで実際にキャリブレーションしてみることをオススメします。

### Open CV calibrateCamera関数のプロになる
https://kamino.hatenablog.com/entry/opencv_calibrate_camera

PythonのライブラリであるcalibrateCamera関数を解説した記事です。
カメラモデルからキャリブレーションまでの一連の流れを体得できるいい記事です。

### カメラキャリブレーションと3次元再構成
http://opencv.jp/opencv-2svn/cpp/camera_calibration_and_3d_reconstruction.html

Open CVの日本語版ドキュメントです。
カメラキャリブレーションに関する関数を網羅できます。

ステレオカメラのキャリブレーションや外部パラメータの連結など、便利なライブラリが詰まっているので自分で実装する前に一度のぞいてみるといいです。

「なんかいいライブラリないかな〜」と、何度このサイトを眺めたか数え切れません。

### Open CV Camera Calibration and 3D Reconstruction
https://docs.opencv.org/3.4.9/d9/d0c/group__calib3d.html

こちらは、英語版のOpen CVカメラキャリブレーションに関するドキュメントです。
日本語版のドキュメントよりバージョンが新しいので、いくつかのライブラリがかなり便利になっていることがわかります。

### Open CV sample data
https://github.com/opencv/opencv/tree/master/samples/data

Open CVが用意したサンプル画像をダウンロードできます。
論文や発表資料の図に使ったり，サンプルでキャリブレーションしたりいろいろできます。

### ステレオカメラキャリブレーターアプリ
https://jp.mathworks.com/help/vision/ug/stereo-camera-calibrator-app.html

Matlabが販売するステレオカメラキャリブレーターの解説ページです。
チェスボードを用いる手法で実装されているので、Open CVを使って動作を模することは可能です。

ここでは、ステレオカメラのキャリブレーションでどんなことやっているのかを勉強できます。

## (番外編)チェスボード自動生成ツール
https://mementoo.info/archives/598

実験で使用するチェスボードはここで作りました。
マスの数とサイズを指定して生成することができるので、非常に便利です。

## おわりに
カメラキャリブレーションは、データの型でハマりやすいので注意深く実装することが重要です。
ransackでラベル検索をチェックボックス検索にしたい

# Ransackを使ったラベル(label)検索をどうしてもチェックボックス(check_box)で実装したいことがあったのでメモ

<img width="177" alt="スクリーンショット 2020-02-10 18.25.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319526/6a0b86c8-2543-6f4b-c3cb-c7e0b5c97745.png">


**ラベル機能がある状態からスタート！！！**
※ラベル機能の作成まではこの記事で完結できます↓
[【gemなし】Railsでラベル機能を作る](https://qiita.com/___inon_/items/ad83c2adbd68981e9dce)
### gemのransackをインストール

```rb.Gemfile
gem 'ransack'
```

```
$ bundle install
```

```posts_controller.rb
  def index
    @search = Post.ransack(params[:q])
    @posts = @search.result(distinct: true)
  end


  private
    def post_params
      params.require(:post).permit(:title, :details, label_ids: [] )
    end
```

```view.posts.index.html.erb
<%= search_form_for @search do |f| %>
  <% Label.all.each do |label| %>
    <%= f.check_box :labels_id_eq_any, { multiple: true, checked: label[:checked], disabled: label[:disabled], include_hidden: false }, label[:id] %>
    <label><%= label.title %></label>
  <% end %>
  <%= f.submit "検索" %>
<% end %>
```

以上です！

参考記事
https://www.tom08.net/entry/2016/11/11/144813
仕事できる(ように見える)文章校正勘所

#お客様は意外と見ている
※本記事は文章校正ではなく、単語や一文に特化した文章レビュー記事となっております。

お客様に提出する書類は、言ってみれば「会社の顔」です。
内容が伴っていても、誤字脱字や表現が適切でないと、大なり小なり印象を悪くします。
最悪の場合は会社間の信頼関係の損失につながります。
※「あいつだからな……」で済まされる「無敵の人」と理解されれば話は別かもしれませんが。
レビューをしない文章というものは、フォーマルな場にジャージで出てくるようなものとお考え下さい。

ルーズな人という印象を受けるメリットはないので、時間の許す限り文章はレビューしてもらいましょう。
もちろん、見てもらう前に自己レビューは忘れずに。


#私が気を付けていること
以下は、私が文章作成と文章レビューの時に気を付けていることです。
特定業界向けのものになっているかもしれませんが、ご参考までに。



#### 1.業界の専門用語など、閲覧者になじみのある言葉を積極的に使用しましょう
商習慣を理解している=相手のことを理解している、という印象を与えます。
常習的に理解している単語は積極的に使っていきましょう。
例えば、「値下げ」と「値引き」は同じ意味ですが、某社では片方しか使わないなんてことがあります。
分からない場合は、先輩技術者や営業の方などに聞くとよいでしょう。


#### 2.ネガティブワードを使わないようにしましょう
ネガティブワードはポジティブワードに変換するようにしましょう。
よくありがちなのが、たとえ事実であっても
「できません」「できなかった」などの表現を使うことです。
お客様の要望を考える力がないとか、仕事ができない等の印象を与えかねません。
例えばですが、
「ここまでならできます」
といった表現に変えるだけでも印象は大きく違います。

実は、実際に「できない」を連呼して顧客から出禁を言い渡された人を見たことがあります。
コワイコワイ。
その後担当変更により関係が良好になったのですが、その理由の一つもまたネガティブワードを
使わないことであったかなと思います。

#### 3.文章の表現を統一しましょう。
例えばですが、
サーバ
サーバー
Server
どれも同じ意味ですが、単語の表現は統一していたほうが混乱を避けることができます。
※固有名詞は表記そのままに書いてください。
英字よりはカタカナ・漢字・平仮名のほうが日本人にはなじみがあるので、
対日本人であれば英字をなるべく避けることを推奨します。


#### 4.一文をなるべく短くしましょう。
一文に読点は最大２個までにすると、一文内の意味がとっちらからなくて読みやすくなります。
理想は１個だけ。
但し、改行を読点代わりに使うことで疑似的に読みやすくすることは可能です。


#自己レビューしてもミスが出る
上記の観点でレビューしても誤字脱字や修正漏れはほぼ必ず発生します。
人間だもの。

だけど、発生を減らすことはできます。
次の方法を紹介します。


#### 1.指でなぞりながらチェックしましょう。
人間の目は動くものに対しての認知に優れるが、反面静止したものの認知が不得手だそうです。
これ、指でなぞりながらチェックすることである程度回避できます。
指の動きが加わることで静止画が動画になるんですね。

####2.可能であれば、翌日見返しましょう。
書きたての文章をレビューすると、文章を書いている観点でレビューしがち。
文章のことを忘れてから、改めてレビューしましょう。
文章を忘れることで、他人になれます。
個人的にオススメしたいHTML/CSSの学習教材

この記事では僕が今まで購入してきた中で
個人的にオススメしたいHTML/CSSの学習教材を三つ紹介していきたいと思います！



# ①よくわかるHTML5＋CSS3の教科書
➡https://www.amazon.co.jp/よくわかるHTML5-CSS3の教科書【第3版】-大藤幹/dp/4839965471

HTML/CSSを学ぶ人が最初に取り組むのに個人的にオススメな一冊です！
内容自体が教科書みたいな感じでHTML/CSSの基礎が網羅されています！



# ②HTML5/CSS3 モダンコーディング
➡https://www.amazon.co.jp/HTML5-CSS3モダンコーディング-フロントエンドエンジニアが教える3つの本格レイアウト-スタンダード・グリッド・シングルページレイアウトの作り方-吉田真麻-ebook/dp/B0176GNY26

一冊目のHTML/CSSでは紹介されていなかったモダンなコーディングをする方法
(Font Awesomeの使い方等)を教えてくれる実用的な技術書です！
僕自身ポートフォリオを作成した時に重宝したので本当にオススメです！



# ③[HTML/CSS/JavaScript]フロントエンドエンジニアになりたい人のWebプログラミング入門
➡https://www.udemy.com/course/html-css-js/

Udemyで分かりやすいと評判のTaniguchi Makotoさんの講座です！
特に参考になったことは
「CSSの詳細度」、
「真っ黒の文字は強すぎて見にくい」といった「デザインに関するアドバイス」、
「アクセシビリティの観点に立つことの重要性とその具体的アプローチ等」、
「『メソッド』」と『プロパティ』の区別の仕方」　
などで、多くの重要な事柄を学習できました！


---


紹介は以上となります！　如何でしたでしょうか？

紹介されている教材がかなり少ないかもしれませんが
最初はこれ位がシンプルで良いのでは？と個人的に思います！

参考になれれば嬉しい限りです(^^)
【RSpec】「都道府県」を表示させるため、View側でDB参照した部分のテストでハマった

# はじめに

まとめをかきます。

- テスト実行時には、**DBのレコードは空っぽです**。マスターテーブルをView側で参照した部分のテストでは事前にレコードをつくりましょう。
- さもないと**「ブラウザで動いてるのに、テスト時だけコケる」**ので注意しましょう。
- ActiveHashに置き換えると、`db:seed`の手間もなくなり、変更も容易になります


     -------✁-------✁-------✁-------✁-------

※以下は、解決までにどのようなことを考えて試したかの話になります。
筆者自身への備忘録な成分が多めですのでご了承ください。

# 開発の環境

- Rails 6.0.2
- Ruby 2.7
- simple_form 5.0.2
- RSpec 3.9.1

# 住所の都道府県の選択を`Prefecture`テーブルとsimple_formで実装

`Prefecture`はnameだけをもつ、都道府県のマスターテーブルです。

```haml:app/views/addresses/_form.html.haml
= f.input :prefecture, selected: "東京都", collection: Prefecture.all, label_method: :name, value_method: :id
```

こうすると、こう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/d2ea308a-118e-08bc-7391-3ef20aab35ee.png)


`Prefecture`テーブル用に以下のseedをつかいました。

```rb:prefecture_seed.rb
prefs = %w[北海道 青森県 岩手県 宮城県 秋田県 山形県 福島県 茨城県 栃木県 群馬県 埼玉県 千葉県 東京都 神奈川県 新潟県 富山県 石川県 福井県 山梨県 長野県 岐阜県 静岡県 愛知県 三重県 滋賀県 京都府 大阪府 兵庫県 奈良県 和歌山県 鳥取県 島根県 岡山県 広島県 山口県 徳島県 香川県 愛媛県 高知県 福岡県 佐賀県 長崎県 熊本県 大分県 宮崎県 鹿児島県 沖縄]

insert_prefs = prefs.map {|pref| {name: pref, created_at: Time.current, updated_at: Time.current } }    

Prefecture.insert_all!(insert_prefs)
```

# System Testでセレクト要素を選択する部分がコケた【今回の問題点】

「新規住所を登録する」Specをつくりました。

```rb:addresses_spec.rb
visit new_user_address_path(user)
select "高知県", from: "都道府県"
```

すると、`ElementNotFound`がでました。（"高知県" がみつかっていない）

# ブラウザで実行すると表示される

ブラウザではたしかに表示されているし、期待通りの動きをしているのに、、、、なぜだ。。。

## スクショを確認すると、セレクト要素が空白

System Specが落ちたときのスクショを確認すると、セレクト要素が空白でした。（ここで気づきたかった！）

頭の中は「？？ :thinking: ？？」

IDEを起動したりしました。

# ためしたこと 1.配列を直接わたすとパスする

simple_formのcollectionが動いていない？

```haml:app/views/addresses/_form.html.haml
= f.input :prefecture, selected: "東京都", collection: ["東京都", "高知県"]
```

書き換えてみると、テストはパスしました。

# ためしたこと 2.ActiveHashにするとパスする

- [静的データやマスターデータの為だけにtableを持つのを止めよう。 active\_hash が便利そうだ \- Qiita](https://qiita.com/ryoff/items/88670edb3a656ca69d7b)

```
gem 'active_hash'
bundle install
```
したあとに、２都県の日本でためしてみました。

```rb:app/models/prefecture.rb
class Prefecture < ActiveHash::Base
  field :name
  add id: 1 , name: "北海道"
  add id: 2 , name: "高知県"
end
```
パスします。
あとで調べてわかったのですが、ActiveHash化した `Prefecture.all` は単に配列を返すので、1.の検証とおなじ挙動になります。

- [zilkey/active\_hash: A readonly ActiveRecord\-esque base class that lets you use a hash, a Yaml file or a custom file as the datasource](https://github.com/zilkey/active_hash)

# テスト実行時は「レコード0件の世界」であることに気づく【解決】

要素が表示されない。

`Prefecture.all`はエラーではない。

つまりレコードが存在しない。

なぜ・・・

時計の長針が1周しようかというところで、ついに**テスト実行時は「レコード0件の世界」であることに気づく**わけです。長かった。


# スペック内でPrefectureにレコードをつくるとパスする

検証。

```rb:addresses_spec.rb
Prefecture.create!(name: "東京都")
Prefecture.create!(name: "高知県")

visit new_user_address_path(user)

select "高知県", from: "都道府県"
```

パスしました。

# さいごに

ここまで読んでいただきありがとうございました。

普段の記事では、問題に対する答えだけをかくようにしていますが、今回は「どのようにして解決に至ったか」までの道のりをかいてみました。

「simple_formの使い方がまちがっているんだろう」というところから、おなじ問題がIssueにあがってないかと公式レポジトリを検索したり、迷走の極みでした。

# 人に聞くと解決するメソッド

気づいてしまえばなんでもないことほど深くハマってしまうことがあります。筆者の場合は、チャットで質問しようと文章を書いているときに :qiitan::bulb:解決しました。

ハマったときこそ考え込まず、**文章 :writing_hand: にしたり、他の人に説明 :speaking_head: してみるといいかも**しれません。

追伸：`Prefecture`はActiveHashにしました。
npmコマンドまとめ

# npmコマンド

新米なのでここにちょくちょく書き留めていきたいと思います…

## install

何も考えずにパッケージ入れます。デフォルトだとローカルのdependenciesに入ります

```
npm install [packege_name]
```

バージョンを指定します

```
npm install [packege_name]@[version]
```

グローバルで入れます
これを使うときは注意します
グローバルに入れますと、packege.jsomに記述されません
一般公開してバージョンが適切に選択できずに動かないことがあると面倒ですので

```
npm install -g [packege_name]
```

開発環境に入れます

```
npm install [packege_name] --save-dev
npm install [packege_name] -D
```
awscli-aliasesを設定してみた。

# はじめに
今更ながら、aws-cliにalias機能が使えることを発見しました。
ちょっと設定してみたいと思います。


# 設定
まずはバージョンの確認です。
この機能を使うには`1.11.24`以上である必要があります。

```bash:
$ aws --version
aws-cli/1.16.183 Python/3.6.2 Darwin/19.3.0 botocore/1.12.173
```

ということでgitリポジトリからクローンします。
これは、[awslabs](https://github.com/awslabs) で用意してくれているaliasファイルなので、なくてもalias機能は使えますが、今回はこれを使って試したいと思います。

```bash:aliasファイルのクローン
$ git clone https://github.com/awslabs/awscli-aliases.git
```

次に、aliasファイルを配置するためのディレクトリを作成します。

```bash:ディレクトリ作成
$ mkdir ~/.aws/cli
```

作成したら先ほどクローンしたファイルを配置します。

```bash:aliasファイルの配置
$ cp awscli-aliases/alias ~/.aws/cli/alias
```

以上で完了です。
試しにalias登録されているものを実行してみます。

```bash:whoami
$ aws whoami
{
    "UserId": "AIDWJ0SDPRLPSAH7T34ZS",
    "Account": "777777777777",
    "Arn": "arn:aws:iam::777777777777:user/kohei"
}
```

これはaliasファイルを見ると実行したコマンドのaliasは以下になります。


```text:alias
[toplevel]

whoami = sts get-caller-identity
```

では今度はaliasではなく、実際のawsコマンドを実行してみます。

```bash:
$ aws sts get-caller-identity
{
    "UserId": "AIDWJ0SDPRLPSAH7T34ZS",
    "Account": "777777777777",
    "Arn": "arn:aws:iam::777777777777:user/kohei"
}
```

先ほどと同じ結果が返ってきました。


# おわりに
普段はaliasなど使う必要はないかもしれませんが、頻繁に使うコマンドがあればそれを登録しておくととても便利です。
自分はsshのconfigファイルに記載するような感覚でセッションマネージャー経由でログインするインスタンスをaliasに登録しています。

---
[参考URL]
・awslabs/awscli-aliases
https://github.com/awslabs/awscli-aliases
少人数で適当に開発する時のGit運用Flowを整理してみた

## 概要

開発中にお酒を飲んで記憶を無くしても大丈夫、そうGitならね。
という事で個人開発する時には「Git運用フローなんかしらねぇ！！masterにpushだｵﾗｧ!!漢は黙ってmasterｵﾝﾘｨｨｨｨ!!!!ﾝﾌﾌﾌﾌﾌﾌﾌﾌｗｗｗｗ」ってやってましたが、ちょっとしたものを知人（3人）と作ることになったので少しだけGit運用フローについて考えてみました。考えなれてない感満載。

## 前提

* ユーザは自分達のみ（故にクソコードを書いても許される）
* ツールはGitHubのみ（適当にIssue作ってそれに対応する形で進める、要するに行きあたりばったり）
* ステージング環境とプロダクション環境は別で用意した（気持ちだけ先走った結果）
* masterブランチ＝プロダクション環境と同一ソース、stagingブランチ＝ステージング環境と同一ソース、としたい（先に環境だけ作っちゃたからね、仕方ないね）
* 作るものはフロントエンド（React）とAPI（Node.js）

とにかくシンプルに簡単に面倒くさくないように。面倒だとやらなくなってじきに開発自体止めちゃうからね。良くないね。

## ベースになるフローを決める

と言ってもGit FlowかGitHub Flowしかないんだけど。GitFeatureFlowってのもどこかで見たことある。
スプリントって概念も無いし適当にIssue食べるだけだからfeatureもhotfixesもいらないよねってことでGitHub Flowを採用。

## ちょっと変える

GitHub Flowだとmasterから適当にIssueブランチ生やしてやっつけてマージするだけなのでプロダクションは良いとしてステージングどうする問題がある。各自のブランチをステージングに上げるってのは流石にねぇ...ってことでstagingブランチは作る。

使用ブランチは以下の通り。

* master
* staging
* issues

issuesブランチは無限に生える。インスタには生えない。しらんけど。
issuesブランチの命名は適当で良い気がする。1Issue1Branchだろうからとりあえず先頭にissue番号付けときゃ何とかなるなる、なるっなる。3_add_some_componentみたいな名前ならわかるやろ、多分。

## issues運用フロー

Issueには「Why」「What」「Outcome」があればそれでおｋ。各自好き勝手食べるのでassigneesとか不要。milestoneとかも不要。いつ終わるのかはわからないし永遠に終わらないかもしれない。だが、それがいい。

### Why

なぜそのIssueを作ったのか。それを書く。仕様とかその辺は無くても良いというかいらん。
機能のIssueならなぜその機能を追加したいのか、必要なのか。一行でおｋ。伝わればそれだけで十分。
例えばIssueが「データ保存機能の追加」だとしたらWhyは「（主に俺の）UX向上のため。ブラウザ更新でデータ消えるとかマジ無理。」とか。
最高にわかりやすいし最高に共感できる。

### What

何を（実現、実装）したいのか。または何について意思決定をしたいのか。
先の例えを使うなら「localstorage使うかDB使うか決めたい（DB使いたくない（本音」とか。適当に倒したい方向をチラ見せしとこう。こっちも気が楽だ。

### Outcome

最終的に何を作り上げたり決定したりしたらこのIssueが完了なのか。所謂Doneの定義みたいなもの。
実際にコードじゃなくて方針の議論であれば何がどこまで決まったら完了なのかを明記しておく。例えば先のやつなら「データ保存及び参照機能をバックエンド及びフロントエンドで利用できるようにする」とかになるんだと思う、多分。ただフロントエンドとバックエンドが一緒のIssueだとデカいんでIssueをフロントエンドとバックエンドで分割しないとハゲるから分割してくれとは言われそう。
意思決定関連ならこの記事みたいな内容だと思う。例えば「Git運用フローのベースを確定させる」とかね。意思決定もIssuesで決めるとログが残って良いね。意思決定関連はDiscussionみたいなlabelを付けといても良いかもね。多分振り返らないけど。

## commitメッセージ

何をしたか書く。って話なんだけど最低限「Issue番号（ex. #999）」と「コミット種別（add, update, delete, fix）」があればおｋ。半年後には死んだリポジトリになるんだからこまけぇことは良いんだよ。

## プルリク

とりあえずIssue対応始めたらIssueに自分をassignしてbranch作ってpushしよう。タイトルに[WIP]を忘れずに。で、linked issuesに対応issueを関連付ける。以上。
必要ならlabel付けておく。

### label

細かいのはいらない。適当にお気持ち表明ラベルだけ作って後は必要になったら作る感じで。

* マージ待ち
* 手に負えない
* 分割したい
* テストはパスしたが自信は無い
* いらない気がしてきた
* やる気が起きない

いらない気がしてきたら多分いらないから捨てるかどうか話そう。やる気が起きない場合は早く寝るか散歩に行こう。

## プルリクコメント

commitメッセージと同じ程度でおｋ。意味わかんなかったら聞く。以上。

## 全体のフロー再整理

* Issue作る
* 不明点があればクリアにする
* 適当に食べるIssueを決めて自分にアサインする
* branch切ってpushしてプルリク作ってlinked issuesする
* 適当なところでpushしつつやる気が無くなったら「やる気が起きない」labelを付けて引き継いでいこうな
* （コードに自信ありニキは）自分でstagingにマージしちゃっても良い

## git hooksとかGitHub Actionsとかその辺

pre-commit(hooks)でLint, Formatter, unit testを走らせる。人がチェックするとか無理。仕組みでカバー。
issueブランチ切ってpushしてプルリク作ってissueと関連付けるのが面倒＆面倒だから何かこう上手く自動化したい（できそうな気はする
GitHub Actionsを使ってstagingブランチに変更が入ったらFirebaseに自動デプロイするようにしておく（Hosting, Functions共に）。時間があればcomponent testも入れたいけどparcel使ってるのでその辺の限界はありそう。  

## 他の細かいところ

追々決めればいいっしょ。

## 終わり

全体のフローを考えたのは初めてだったので楽しかった。多々不足はあると思うけど進めながらブラッシュアップすればいっかぐらいに考えてる。
GitHub Flowをベースにしてるので追々Git Flowにするのも楽そう、多分。

GitLab？Redmine？ん？
append関数で可変長引数を受け取る

[書籍:Go言語によるWebアプリケーション開発](https://books.google.co.jp/books/about/Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7.html?id=p9lGjwEACAAJ&source=kp_book_description&redir_esc=y)より。

> 組み込みの append 関数は可変長引数を受け取れるので、複数の要素を一度に追加できる。適切な型のスライスを持っているなら、その名前に続けて「...」と記述するとスライス中のそれぞれの項目を個別の引数として渡せる。



```go
// 格納先のスライス初期化
gore> var options []string

// 格納要素の初期化
gore> arr := []string{"a","b","c"}
[]string{
  "a",
  "b",
  "c",
}

// 可変長引数でまとめて追加
gore> options = append(options, arr...)
[]string{
  "a",
  "b",
  "c",
}

// スライスの宣言と可変長引数による受け渡しを同時に実施
gore> options = append(options, []string{"d","e","f"}...)
[]string{
  "a",
  "b",
  "c",
  "d",
  "e",
  "f",
}
インストールすることができないパッケージがありました。‐sambaに踊らされた…‐（Ubuntu16.04インストール時の備忘録）

# はじめに
社内サーバー追加に伴いsambaをインストールできなかった問題の備忘録です。
ちなみにUbuntu16.04へのインストール時に発生した問題です。

# 発生現象
何も考えずに以下のコマンドを実行。

```コマンド
# apt install samba
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 samba : 依存: python-samba しかし、インストールされようとしていません
         依存: samba-common-bin (= 2:4.3.8+dfsg-0ubuntu1) しかし、インストールされようとしていません
         依存: libwbclient0 (= 2:4.3.8+dfsg-0ubuntu1) しかし、2:4.3.11+dfsg-0ubuntu0.16.04.21 はインストールされようとしています
         依存: samba-libs (= 2:4.3.8+dfsg-0ubuntu1) しかし、インストールされようとしていません
         推奨: attr
         推奨: samba-dsdb-modules しかし、インストールされようとしていません
         推奨: samba-vfs-modules しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

「壊れた変更禁止パッケージがある」…何かロックしてたか？

# やった事
念のため、他のパッケージがインストールできることを確認したら問題ない。
もちろん以下のコマンドは実行している

```
apt-get autoclean
apt-get clean
apt-get update
```

ロックしているパッケージがないことを確認

```
dpkg -l
```

結果については省略。
私のケースでは特になかった。

# 結論
aptitudeをインストールして実施。

```
# aptitude install samba
以下の新規パッケージがインストールされます:
  attr{a} libaio1{a} python-crypto{a} python-dnspython{a} python-ldb{a}
  python-samba{a} python-tdb{a} samba{b} samba-common{a}
  samba-common-bin{a} samba-dsdb-modules{ab} samba-libs{ab}
  samba-vfs-modules{a} tdb-tools{a}
0 個のパッケージを更新、 14 個を新たにインストール、 0 個を削除予定、0 個が更新 されていない。
8,610 k バイトのアーカイブを取得する必要があります。 展開後に 48.3 M バイトのデ ィスク領域が新たに消費されます。
以下のパッケージには満たされていない依存関係があります:
 samba : 依存: libwbclient0 (= 2:4.3.8+dfsg-0ubuntu1) [2:4.3.11+dfsg-0ubuntu0.16.04.21 が既にインストール済みです]
 samba-dsdb-modules : 依存: libwbclient0 (= 2:4.3.8+dfsg-0ubuntu1) [2:4.3.11+dfsg-0ubuntu0.16.04.21 が既にインストール済みです]
 samba-libs : 依存: libwbclient0 (= 2:4.3.8+dfsg-0ubuntu1) [2:4.3.11+dfsg-0ubuntu0.16.04.21 が既にインストール済みです]
以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージを現在のバージョンに一時固定する:
1)     python-samba [インストールされていません]
2)     samba [インストールされていません]
3)     samba-common-bin [インストールされていません]
4)     samba-dsdb-modules [インストールされていません]
5)     samba-libs [インストールされていません]
6)     samba-vfs-modules [インストールされていません]

     以下の依存関係を未解決のままにする:
7)     samba-common が samba-common-bin を推奨


この解決方法を受け入れますか? [Y/n/q/?]
```
結論から言うと、「Y」を選択したところで何も解決しなかった。
正解は「n」

```
この解決方法を受け入れますか? [Y/n/q/?] n
以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージをダウングレードする:
1)     libwbclient0 [2:4.3.11+dfsg-0ubuntu0.16.04.21 (now) -> 2:4.3.8+dfsg-0ubun



この解決方法を受け入れますか? [Y/n/q/?] Y
以下のパッケージがダウングレードされます:
  libwbclient0
以下の新規パッケージがインストールされます:
  attr{a} libaio1{a} python-crypto{a} python-dnspython{a} python-ldb{a}
  python-samba{a} python-tdb{a} samba samba-common{a} samba-common-bin{a}
  samba-dsdb-modules{a} samba-libs{a} samba-vfs-modules{a} tdb-tools{a}
0 個のパッケージを更新、 14 個を新たにインストール、 1 個をダウングレード、 0 個を削除予定、0 個が更新されていない。
8,640 k バイトのアーカイブを取得する必要があります。 展開後に 48.3 M バイトのデ ィスク領域が新たに消費されます。
先に進みますか? [Y/n/?] Y
```

正解！！
手動で変えようとして失敗した気もするけど…結構無駄にはまっていたので。
Google Coral Edge TPUの紹介-Mini PCIe Accelerator

Edge TPUを既存のシステムに簡単に統合できるPCIeデバイス。
- サポートされるホストOS：Debian Linux
- ハーフサイズMini PCIeフォームファクター
- サポートされているフレームワーク：TensorFlow Lite
- AutoML Vision Edgeで動作します


![alt](https://gravity-store.oss-cn-hongkong.aliyuncs.com/images/goods/1573026438_2.jpg)

Coral Mini PCIe Acceleratorは、Edge TPUコプロセッサーを既存のシステムと製品にもたらすPCIeモジュールです。

Mini PCIe Acceleratorは、標準のMini PCIeスロットに収まるように設計されたハーフサイズのMini PCIeカードです。 このフォームファクタにより、ARMおよびx86プラットフォームに簡単に統合できるため、組み込みプラットフォーム、ミニPC、産業用ゲートウェイなどの製品にローカルMLアクセラレーションを追加できます。

####特徴
- Google Edge TPU MLアクセラレーター
- 標準のハーフミニPCIeカード
- ホストCPUでDebian Linuxおよびその他のバリアントをサポート

####Edge TPUについて
Edge TPUは、低電力要件で高性能ML推論を提供するGoogleによって設計された小さなASICです：各TOPSに0.5ワット（ワットあたり2 TOPS）を使用して、1秒間に4兆回の操作（テラ操作）（TOPS）を実行できます ）。 たとえば、MobileNet v2などの最先端のモバイルビジョンモデルを約400 FPSで電力効率の高い方法で実行できます。 このデバイス上の処理により、待ち時間が短縮され、データプライバシーが向上し、一定の高帯域幅接続が不要になります。

#### 必要条件
Coral Mini PCIe Acceleratorは、次の仕様のホストコンピューターに接続する必要があります。
互換性のあるミニPCIeモジュールスロットを備えたLinuxコンピューター
Debian 6.0以降、またはその派生物（Ubuntu 10.0+など）
ARMv8命令セットを備えたx86-64またはARM32 / 64のシステムアーキテクチャ

![alt](https://gravity-store.oss-cn-hongkong.aliyuncs.com/images/goods/1573026438_2.jpg)


### 熱限界と動作周波数
Edge TPUスタックアップの熱抵抗と最大許容温度は次のとおりです。
熱抵抗（シールド缶の上部への接合部）：11°C / W
最大Edge TPUジャンクション温度：100°C

Mini PCIe Acceleratorには、システムから熱を放散する熱ソリューションは含まれていません。 Edge TPUから最大限のパフォーマンスを維持するには、Edge TPUが最大Edge TPU温度よりも十分に低く動作するようにシステムを設計することが重要です。 Edge TPUが高温になりすぎると、動作周波数が徐々に低下し、永久的な損傷を避けるためにリセットされる場合があります。

#### ソフトウェアと操作
ホストシステムは、Debian Linux 6.0以降、またはその派生物を実行し、Edge TPUランタイムとAPIライブラリがインストールされている必要があります。

![正方形海报.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/f5f54aa9-60c4-895e-43a0-55d48eb71984.jpeg)


Google Coral製品、および#Gravitylinkオンラインストアでの大量販売または大量販売（ボリュームディスカウント）の詳細に興味がある場合は、メールでsales@gravitylink.comまたはmarket@gravitylink.comにご連絡ください。 できるだけ早く見積もりをお送りします。
【勤怠管理】タイムカードの計算ができるGem「punch_time」の使い方

# この記事は

タイムカード計算 punch_timeを作ったメモ

https://bitbucket.org/smapira/punch_time/

# やりたかったこと

Railsで深夜残業時間の計算をするのにSQLだと再利用ができなそうだったので

# やり方

## インストール方法

```ruby
gem 'punch_time'
```

## コンフィグ

コンフィグでシフトの開始、終了時間、休憩時間、深夜時間、時差が設定できます

```ruby
PunchTime.configure do |config|
config.shift_in_time = Time.parse('10:00')
config.shift_out_time = Time.parse('19:00')
config.breaks = [
    {
    start_time: Time.parse('12:00'),
    end_time: Time.parse('13:00')
    }
]
config.night = {
    start_time: Time.parse('22:00'),
    end_time: Time.parse('05:00')
}
config.offset = '+0900'
end
```

## タイムカードの記録

就業時間はシフトの開始時間からで計算

```ruby
PunchTime.punch(DateTime.parse('20200101 10:10'), DateTime.parse('20200101 19:00'))
```

## 就業時間の出力

```ruby
p PunchTime.sum_work.hours
```

例えば、business_time、holiday_jpを組み合わせれば祝日の勤務時間計算がこうなります

```ruby
sum_works = []
Date.parse('20200101').upto(Date.parse('20200105')) do |x|
  PunchTime.punch(DateTime.parse(x.to_s + ' 10:10'), DateTime.parse(x.to_s + ' 19:00'))
  sum_works.append(PunchTime.sum_work.hours) unless x.workday?
end
p sum_works.inject(:+).to_i
```

## そのほか
```ruby
PunchTime.sum_work
PunchTime.sum_tardy
PunchTime.sum_over_work
PunchTime.sum_night_work
PunchTime.tardy?
PunchTime.overtime_work?
PunchTime.night_overtime_work?
```

# 技術的ポイント

なあなあだったタイムゾーンとか、Rationalの扱いに結構時間とられたので、これからはオープンソースは人々の協力によって支えられているのだ、ということを心に留めてGithubを利用したい

# 株式会社旗指物 について

punch_time は株式会社旗指物によってメンテナンス、開発が行われています。

当社では、働き方改革関連法の施行とともに、より多くの従業員同士の個性の発揮の機会と、チームワークが高められる社会の実現を期待しています。
そして、科学的なアプローチの利用と拡大に貢献し、もって企業の生産性の向上を図るため、当社ソフトウェアのOSS化を進めています。

https://blog.routeflags.com/2020/02/19/punch-time/
微分・積分公式集

<h2>シリーズ</h2>
<a href="https://qiita.com/campbel2525/items/004270f9f89818b08e12">物理・数学・プログラムのページについて</a>


<h2>概要</h2>
微分積分の公式集です。よかったら活用してください。

<h2>公式</h2>

```math
    ({\sin^{-1}x})' = \frac{ 1 }{ \sqrt{ 1 - x^2 } }
```
```math
    ({\cos^{-1}x})' = \frac{ -1 }{ \sqrt{ 1 - x^2 } }
```
```math
    ({\tan^{-1}x})' = \frac{ 1 }{ 1 + x^2 }
```
```math
    ({\sec^{-1}x})' = \frac{ 1 }{ \vert x \vert\sqrt{ x^2 - 1 } }
```
```math
    ({\csc^{-1}x})' = \frac{ -1 }{ \vert x \vert\sqrt{ x^2 - 1 } }
```
```math
    ({\cot^{-1}x})' = \frac{ -1 }{ 1 + x^2 }
```
```math
    ({\sinh^{-1}x})' = (log(x + \sqrt{ x^2 + 1 }))' =  \frac{ 1 }{ \sqrt{ x^2 + 1 } }
```
```math
    ({\cosh^{-1}x})' = (log(x + \sqrt{ x^2 - 1 }))' =  \frac{ 1 }{ \sqrt{ x^2 - 1 } }
```
```math
    ({\tanh^{-1}x})' = \frac{ 1 }{ 1 - x^2 }
```
```math
    \int \sqrt{ x^2 + A }dx = \frac{ 1 }{ 2 } x\sqrt{ x^2 + A } + A\log(\vert x \vert + \sqrt{ x^2 + A })
```

```math
    \int \sqrt{ a^2 - x^2 }dx = \frac{ 1 }{ 2 } x\sqrt{ a^2 - x^2} + a^2{\sin^{-1}\frac{ x }{ a }}
```

```math
    \int \sqrt{ a^2 - x^2 }dx = \frac{ 1 }{ 2 } x\sqrt{ a^2 - x^2} + a^2{\sin^{-1}\frac{ x }{ a }}
```

```math
    \int e^{ax}\sin bx dx = \frac{ e^{ax} }{ \sqrt{ a^2 + b^2 } }(a\sin bx - b\cos abx)
```
```math
    \int e^{ax}\cos bx dx = \frac{ e^{ax} }{ \sqrt{ a^2 + b^2 } }(a\sin bx + b\cos bx)
```
Railsでwebpackを用いて画像を表示させる

タイトル通りやっていきます。

##環境
Ruby2.7
Rails6.0.2
webpack

##はじめに：アセットパイプラインとwebpackは違う

「あれ？ちゃんと画像はassets/imagesの下に置いているし、image_tagのパス指定も間違っていないのにブラウザで画像が表示されない！」

こんなことでお困りのあなた、もしかしてアセットパイプラインではなく、webpackを使用していませんか？
私はそうでした。

最近のRails開発においては、sprocketsを用いたアセットパイプラインではなく、webpackを使うのがモダンなようです。しかし私のようにRails初心者でwebpackを理解していないくせに使っていると、上記のように画像を表示できなくなるのです。

あなたはアプリ作成時にオプションで```--skip-sprockets```をつけたり、またはコマンドライン上で```bundle exec rails webpacker:install```したりしていませんか？

この場合はあなたはwebpackを使っています。なのでアセットパイプラインであるassets/imagesの下に画像を置いても意味がないのです。

というわけでこれからwebpackを用いた画像の表示を説明していきます。

##方法
まずは```bundle exec rails webpacker:install```でwebpackを導入します。既にやった方はやらなくて良いです。インストールが完了するとconfig配下にwebpackerの設定ファイル、app配下にjavascriptディレクトリが生成されます。


次に```app/javascript```の下にimagesフォルダを作成しましょう。できたらそこに表示させたい画像ファイルを置きます。

次は```app/javascript/packs/application.js```ファイルを開きます。下にコメントされた状態で

```
const images = require.context("../images", true);
const imagePath = name => images(name, true);

```
というコードがあるはずです。そのコメントを外しましょう。


ここまで来たら後はviewでimage_pack_tagを使えば画像が表示できるはずです。

```<%= image_pack_tag '画像名' %>```

お疲れさまでした。
VisualStudioのIntelliSenseが、Enterで決定できなくなった話（C#）

# はじめに

ある日、C#でプログラミングをしていると、IntelliSenseをEnterとかで決定できなくなりました。
普通C#のIntelliSenseは、Enter以外にも、スペースとかピリオドを入力しても決定できるのです。決定できないのすごい不便…バグか…？

こんな感じに、枠で囲まれてはいるけど、選択状態になっていなくて、
![2020021016434039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223441/b7ead4f9-783a-92ea-6496-9020c5adaaaa.png)

上下キー等を押すことで選択され、この状態ならEnterとかで補完できます。
![2020021016441823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223441/75e92411-e570-e848-5fc9-bae6baf4b34f.png)

直し方探すの、なんて検索したらいいかもわからず、苦労しました…

# なおしかた

IntelliSenseには、2つのモードがあるらしい。
**完了モード（標準の完了モード）**と、**提案モード（提案される完了モード）**というようです。

で、今回は、いつの間にかモードを提案モードに変更しちゃっていた、ということのようでした。バグじゃなかった。

完了モードと提案モードを切り替える方法はいくつかあります。好きな方法でやってください。

- [CTRL] + [ALT] + [スペース]のショートカットを使う
- メニューの『編集』→『IntelliSense』→『○○モードの切り替え』を押す
- ツールバーの『テキストエディター』にある切り替えボタンを押す

[CTRL] + [スペース]でIntelliSenseを出すことができるじゃないですか。多分この時に、間違えて[CTRL] + [ALT] + [スペース]を入力しちゃったんだろうなぁ…IntelliSenseにモードがあるとか、初めて知ったよ…
【GAS】V8 runtimeに切り替えるとき、claspの人はマニフェストを手動で書き換えること！

# あらすじ：
- GAS (Google Apps Script) はJavaScript 1.6〜1.8という古い構文だった
- 最近それがV8 runtimeというエンジンに変わってECMAScript準拠のナウい構文になった
- Webのスクリプトエディタを使っている人はRunメニューから切り替えられる
- claspを使っている人はローカルのappsscript.jsonを手動で書き換える必要がある

これでわかった人は読む必要なし。

# 詳細：
GASのランタイムがRhinoというのからV8というのに変更になった。
これまでのGASのJavaScriptは1.6〜1.8とかの古いものだったが、ECMAScript準拠のナウいものになったらしい。
めでたい。

参考記事: https://tonari-it.com/gas-v8-runtime/

上の「隣にIT」さん（いつもお世話になります！）の記事の執筆時点では、本来「実行＞Enable new Apps Script runtime powerd by V8」で変更できるが、まだ「表示＞マニフェストファイルの変更」でマニフェストファイルを表示して変更しなければならなかった、と書かれているが、2020-02-10では、ちゃんと実行メニューに「Enable...」と表示されるようになった。

ちなみにこれ、トグルになっていて、Enable状態で実行メニューを見るとDisable、Disable状態で見るとEnableが表示されていて、RhinoとV8が交互に切り替わるようになっている。
（Rhinoってオライリーのサイ本のサイだね！ｗ）

また、ぼくの場合スクリプトエディタを開いただけで「V8が使えますがどうしますか」的なメッセージが出てきて（スクショ撮りはぐった＞＜）、はい、と答えるだけでV8に切り替わった。

ただ、ぼくはclaspを使っていて、ローカル上にRhinoのレガシーソースが溜まっていた（※）。
これをpushしようとすると

```bash
? Manifest file has been updated. Do you want to push and overwrite?(y/N)
```

と言われる。

「y」と入力すると、マニフェストファイルも置き換わってしまい、レガシー状態に戻ってしまう。
デフォルトを受け入れてEnterを押下するか「N」と入力すると、マニフェストファイル以外のソースもアップロードされない。

この場合は、claspのローカル環境にあるマニフェストファイル、appsscript.jsonを手動で書き換える。
末尾だけ掲げる。

```appsscript.json書き換え前
  "exceptionLogging": "STACKDRIVER"
}
```

＝＞

```書き換え後
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```

jsonはjsと違ってケツカンマを許さないので注意。
https://qiita.com/daijinload/items/149410c975d6c008101e

これでpushするとV8状態のまま開発中のソースも正しくアップロードされる。
とりあえずスプレッド構文が使えてハッピーだ。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

（この項終わり）

※過去のぼくのclaspとの格闘はコチラ：
https://qiita.com/query1000/items/259a60ba1be8743b858b
https://qiita.com/query1000/items/b25ae9deb700c7bf3212

追記：
2020-02-10現在、HtmlService.getUserAgent()がnullを返すという問題がある。
https://ja.stackoverflow.com/questions/62926/gas%e3%81%aev8-runtime%e3%81%a7htmlservice-getuseragent%e3%81%8c%e4%bd%bf%e3%81%88%e3%81%aa%e3%81%84
AVSを理解したい (1)

[Autonomous Visualization System (AVS)](https://avs.auto/#/)は、自動運転向けのWebベース3D視覚化ツールキットです。

まずは、AVSのデータレイヤであるXVIZについて調べます。

# ファイル構造

## バイナリGLBファイル
- XVIZはGLB形式と呼ばれるバイナリにエンコードできる
- GLBは、JSON構造とバイナリデータのチャンクを持つ
- バイナリデータとしては、JPEG/PNG画像やLiDARの点群などがある

## メッセージ
- ある時間窓の中のデータは、タイムスタンプを１つもつメッセージに集約される
    - ストリーミングサーバは、メッセージごとに１つのGLBファイルをソケット経由で送信できる 
- １つのメッセージが１つの".glb"ファイルにエンコードされる
    - 上記は慣習であり、複数のメッセージを含めることも可能

## ストリーム
-１つのメッセージには複数のストリームを含められる
- すべてのストリームは、同じタイプのデータが含まれているので、 ストリームがどんなものか知らなくても統合して表示できる（どういう意味？）

## JSONファイル
- XVIZはJSON形式にエンコードすることも可能
- 大きなデータがエンコードできる利点は無くなるが、トラブルシューティングのときに役に立つ
基本情報17週目(２月10日)

##目標と結果##

##目標##
•午前試験を一回通し、自分の未だ理解できていない部分の分析をすること。

•午後試験[データ構造及びアルゴリズム]勉強を一週間の内10時間勉強する。

##振り返り##

__KEEP__

__TRY__

__PROBLEM__

##次週 and more...##

[2/3](https://qiita.com/Comitakato0515/items/b9d177a3173c8935ad74)
QGISでカーソルアイコンを変更する

## 方法
方法としては3つあります
* QApplication
* QWidget
* QgsMapTool


## 検証環境
* Windows 10
* QGIS
    * 2.18
    * 3.4
* Pythonコンソール

## QApplication
アプリケーション全体のカーソルを上書きしたい場合は、`QApplication`に対してカーソルを変更します。
Qtでの変更方法は`QApplication`にカーソルを取得・設定できる関数が準備されています。
QGISでは、`QApplication`を継承している`QgsApplication`で変更することができます。

```python:hoge.py
from PyQt5.QtCore import Qt
from qgis.core import QgsApplication

app = QgsApplication.instance()

# 処理中的なカーソルに変更する
app.setOverrideCursor(Qt.BusyCursor)

# 元のカーソルを復元
app.restoreOverrideCursor()
```

## QWidget
Qtでは、`QWiget`ごとに変更することが可能なのでそこに対してカーソルを設定することで変更することができます。
`QApplication`の方が権限が強いのと`QgsMapTool`にも負けるときがあるっぽいです。

```python:hoge.py
from PyQt5.QtCore import Qt

widget = iface.mainWindow()
cursor = widget.cursor()

# 処理中的なカーソルに変更する
widget.setCursor(Qt.WaitCursor)
```

## QMapTool
QgsMapToolのカーソルでは、QGISの地図領域の時のみに変更されます。一番影響範囲が少なく強制力がない変更方法になります。
また既存のマップツール(例えば`actionPan`の`QgsMapToolPan`)のアイコンを変更した場合、元に戻す方法がありません。
処理中は砂時計、その後に矢印に戻す処理をしたいのですが、`QgsMapTool`の`QCursor`をPythonで取得できないので元に戻すことができません。

```python:hoge.py
from PyQt5.QtCore import Qt

canvas = iface.mapCanvas()
maptool = canvas.mapTool()

# 処理中的なカーソルに変更する
maptool.setCursor(Qt.BusyCursor)
```

## Qtで準備されたものに変更する
Qtでは, `Qt.CursorShape`で基本的なカーソルが準備されているものに変更します。

```python:hoge.py
from PyQt5.QtCore import Qt
from qgis.core import QgsApplication

app = QgsApplication.instance()

# 処理中的なカーソルに変更する
app.setOverrideCursor(Qt.WaitCursor)

print("なんか処理する")

# 元に戻す
app.restoreOverrideCursor()
```

## 独自カーソルに変更する
```python:hoge.py
from PyQt5.QtCore import Qt, QImage, QPixmap
from PyQt5.QtGui import QCursor
from qgis.core import QgsApplication

app = QgsApplication.instance()

# カーソルに使用する画像をPixmapにする
path = 'cursor.png'
image = QImage(path)
pixmap = QPixmap.fromImage(image)

# 独自カーソルを作成
cursor = QCursor(pixmap)

# 独自カーソルに変更する
app.setOverrideCursor(cursor)
```

`QCursor`のオブジェクトを作成し`QApplication`に設定することで変更することができます。
`QCursor`は、`QPixmap`と`QBitmap`で画像の入力を受け入れています。

## 備考
今回は処理中に砂時計にしたいということでカーソルの変更を調べました。
全ての所で止めたいので、`QApplication`でやっていこうと思います。

## 参考
* QGis Document
    * [QgsApplication](https://qgis.org/api/classQgsApplication.html)
    * [QgsMapTool](https://qgis.org/api/classQgsMapTool.html)
* Qt Document
    * [QApplication](https://doc.qt.io/qt-5/qapplication.html)
    * [QWidget](https://doc.qt.io/qt-5/qwidget.html)
    * [QCursor](https://doc.qt.io/qt-5/qcursor.html)
    * [Qt.CursorShape](https://doc.qt.io/qt-5/qt.html#CursorShape-enum)
    * [QPixmap](https://doc.qt.io/qt-5/qpixmap.html)
GolangのBigQueryパッケージで外部データソースとしてCSVを指定するサンプル

BigQuery上で複数の異なるデータソース間でJOINとかしたいことがある。それをする方法。

以下のようなCSVがGCS上に用意されているとする。

```csv:people.csv
name,age
jessy,25
thomas,30
brian,34
tommy,33
```

このCSVのデータをBigQuery上でテーブルっぽく使うには以下のような実装をする。

```go
// スキーマフィールドを定義
nameSchema := bigquery.FieldSchema{
	Name: "name", 
	Required: true, 
	Type: bigquery.StringFieldType,
}
ageSchema := bigquery.FieldSchema{
	Name: "age", 
	Required: true, 
	Type: bigquery.IntegerFieldType,
}

// GCSをBigQuery上で外部データソースとして使うための設定を定義
gcsSrcConfig := bigquery.ExternalDataConfig{
	SourceFormat: bigquery.CSV,
    SourceURIs:   []string{"gs://your-gcp-project/somewhere/somedirectory/people.csv"},
    Schema: []*bigquery.FieldSchema{
    	&nameSchema,
        &ageSchema,
    },
}

// CSV上のデータをdataOnGcsとして指定しSQL文で使う
q := client.Query(`select * from dataOnGcs`)
q.TableDefinitions = map[string]bigquery.ExternalData{
	"dataOnGcs": &gcsSrcConfig,
}
```

`ExternalDataConfig`に`AutoDetect`というオプションがあり、これをtrueにすると自動でCSVのデータ構造からスキーマを推測してくれると書いてあったのだが、これをtrueにしてもselect文とかで指定できなかった。やはり`Schema`に自前でスキーマ定義を渡してやるのが必要そうだ。

GCS以外にもJSONやGoogleスプレッドシートをデータソースとして使えるらしい。ええやん。
NXP SE050検証(環境構築編)(prepare for testing NXP SE050)

#はじめに#
2019/12/14に開かれた　IoTSecJPにてお時間をいただき
[セキュアエレメントとIoTデバイスセキュリティ](https://www.slideshare.net/KentaroMitsuyasu1/secure-element-for-iot-device)
と題してお話させていただきました。
その内容をベースにまとめていきたいと思います。

#環境セットアップ#
前回、選択したNXP　SE050C1を使い、まずはデバイス認識ができるかチェックしていく。
[ATECC608Aで実施したArduinoによるデバイス認識方法](https://qiita.com/kmitsu76/items/768d320069d9a2e764fa)を試していく。

ESP32-DevkitCを用意しI2Cは100kHzで
SE050をピン21，22に接続する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/d682288a-4e95-6be2-d6a3-36bdee6971ee.png)
ATECC608Aのように3.3v、GND、SCL、SDAの4本の接続だけでは認識しなかった。Pin15 VOUT とPin18 VCCを接続する必要があるようだ。
ブレッドボードでジャンパーを飛ばす。

#テスト結果#


```
Scanning...
device found on I2C port 0 at address 0x48  !
done

Scanning...
device found on I2C port 0 at address 0x48  !
done

```
問題なく認識できた。
次回以降、ESP32でSE050を動かせるかを試してみる。
RのSummary()の使い方 ---初心者向け---

###### tags: `rBasicLearning`
# Summary()の使い方
### 使用するデータ
今回は, データとしてirisを使う.

```r
library(datasets)
iris
```
### Summary()を使う場合
Summary()は, データの概観を数値で見たい時に使う.
### 質的データのSummary()
質的データのSummary()は, その変数ごとにどれくらいの度数が入っているかを数値で見ることができる.
視覚的に見たい時は, 棒グラフ（barplot）を使う.

```r
summary(iris$Species)       # Categorical variable

> summary(iris$Species)       # Categorical variable
    setosa versicolor  virginica 
        50         50         50 
```

```r
irisSpecies <- table(iris$Species)
barplot(irisSpecies)
```
![](https://i.imgur.com/5GBjGDK.png)

### 量的データのSummary()
量的データのSummary()は, 最大値, 最小値, メジアン, 四分位数, 平均の数値を見ることができる.
これを視覚的に見たい時は, 箱ひげ図（boxplot）を使う.

```r
summary(iris$Sepal.Length)  # Quantitative variable

> summary(iris$Sepal.Length)  # Quantitative variable
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.300   5.100   5.800   5.843   6.400   7.900 
```
```r
boxplot(iris$Sepal.Length)
```
![](https://i.imgur.com/ukFgLIR.png)

### 全体のSummary()
全体でSummary()を見ると, 以下のようになる.
今回は, 最大値, 最小値, メジアン, 四分位数, 平均の数値を見ることができる.

```r
summary(iris)               # Entire data frame
> summary(iris)               # Entire data frame
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500       
```
PHP プログラムの呼び出し

PHPで以下の機能があるプログラムを作成しようと思っています。
1.値を受け取る
2.DBに照会してチェックする
3.チェック結果を返す

まず、2と3の機能を作成しました。
思ったように動作しました。
■recieve.php

  <?php

  error_reporting(E_ALL);

  define('DSN', 'mysql:host=localhost; dbname=test_db');
  define('DB_USERNAME', 'dbuser');
  define('DB_PASSWORD', 'r5b2Wisd');

  \$key1 = "key1_A99";
  \$key2 = "key2_A99";
  /*
    \$params = json_decode(file_get_contents('php://input'), true);
    \$key1 = \$params['key1'];
    \$key2 = \$params['$key2'];
  */

  try {
    \$db = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
    \$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  } catch (DOException \$e) {
    result(9, 'unable connect to db');
  }

  try{
    //DBに登録があればチェックOK
    \$stmt = \$db->prepare("select count(\*) cnt from test where key1 = :key1 and key2 = :key2");
    \$stmt->execute([
      ':key1' => \$key1,
      ':key2' => \$key2]
    );
    \$row = \$stmt->fetch();
    if (\$row['cnt'] == 1) {
      result(0, 'already registered');
    }
    //DBに登録がなく、key1の登録件数が2件以上のときはエラー
    \$stmt = $db->prepare("select count(*) cnt from test where key1 = :key1");
    
\$stmt->execute([
      ':key1' => \$key1
    ]);
    \$row = \$stmt->fetch();
    if (\$row['cnt'] >= 2) {
      result(9, 'already exists');
    }
    //DBに登録がなく、key1の登録件数が2件未満のときは、DBに登録してチェックOKとする
    \$sql = "insert into test(key1, key2) values(:key1, :key2)";
    \$stmt = \$db->prepare(\$sql);
    \$stmt->execute([
      ':key1' => \$key1,
      ':key2' => \$key2
    ]);
    result(0, 'registered');
    } catch (Exception \$e){
      result(9, \$e->getMessage());
  }


  function result(\$result_code, \$result_message) {
    header("Content-Type: application/json; charset=UTF-8");
    \$result = array('result' => \$result_code, 'message' => \$result_message);
    echo json_encode(\$result);
    exit;
  }

次に、1の機能（呼び出し）を作成しました。
■send.php
<?php
\$url = 'http://192.168.33.10:8000/recieve.php';
\$data = array(
  'key1' => 'key1_A99',
  'key2' => 'key2_A99'
);
\$options = array('http' => array(
  'method'  => 'POST',
  'header'  => "Content-type: application/json\r\n",
  'content' => json_encode(\$data)
));
\$options  = stream_context_create(\$options);
\$contents = file_get_contents(\$url, false, \$options);
header('Content-type: application/json');
echo \$contents;

send.phpを呼ぶとエラーになります。
PHP Warning:  file_get_contents(http://192.168.33.10:8000/recieve.php): failed to open stream: HTTP request failed!  in /home/vagrant/license/send.php on line 13

recieve.phpのパラメーター部分のコメントをどちらに切り替えてもエラーになるので、そもそも呼び出しがまずいのだと思っています。
ですが、そもそも呼び出せないので受け側を完成させることができないです。
（受け側が完成していれば、呼び出し方が悪いと確定するので、ネットで検索しつつ調整することも叶うということです）

Web関係の知識が圧倒的に不足していることは自覚しています。
聞き方（書き方）すら分からないレベルで恐縮ですが、どんなことを試してみれば良いかお教えください。

ちなみに、受け渡しはJSONでなくてもいいです。
プログラムもPHPでなくてもいいです。
ただ、やりたいことは小さいので、フレームワークなどを入れて大げさにしようとは考えていません。
蟹さんにMPU-6050をつないでみた

I2Cの加速度センサーのMPU-6050を蟹さんにつないでみました。

もともとpull up抵抗が2.2Kだったのですが、それでは全く認識されなかったので、いろいろ試して10Kにしてみました。

![写真（2020-02-10 16.18）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/6736e2c1-7599-3cc3-26c0-5d26caf48d37.jpeg)

コードはこんな感じです。置く面によってLEDの色が変わります。

https://github.com/yamori813/rtlbm-mruby/blob/master/samples/mpu6050.rb

蟹さんにはfloatが入ってないので、複雑な計算はできないので、Accelerometer Measurementsの値を閾値で判断しています。

![写真（2020-02-09 17.59）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3015dec9-4252-35b1-e2d4-4d5811d1f736.jpeg)

みんなのラズパイコンテスト2019の岩木祐介さんの「時間の使い方ロガー」にインスパイヤーされて作ってみました。

またここのところ不調の蟹さんが、何故かRJ45を上向きにすると調子がよく、それを見ていて思いつきました。
EC2(Amazon Linux 2)にPython 3.8, Pip 3.8をインストールする


# Amazon Linux2 に Python 3.8をインストール
Python 3.8, Pip 3.8をAmazon Linux2にインストールでお困りの方は参考にしてください。

- EC2 AMI  
  　Amazon Linux 2 AMI (HVM)  
  　SSD Volume Type  
  　ami-062f7200baf2fa504 (64 ビット x86)/ami-0e98ccceff552e8a8 (64 ビット Arm)  

# 事前準備

```
$ sudo yum -y update
$ sudo yum -y install gcc openssl-devel bzip2-devel libffi-devel
```

# ダウンロード

```
$ wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
$ tar xzf Python-3.8.1.tgz
```

# インストール

```
$ cd Python-3.8.1
$ sudo ./configure --enable-optimizations
$ sudo make altinstall
```

# 確認

```
$ python3.8 --version
Python 3.8.1
$ pip3.8 --version
pip 19.2.3 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
```

# rootのpathを設定
rootからもPython3.8を使えるようにパスを通しシンボリックリンクをはっておく

```
$ sudo which python3.8
which: no python3.8 in (/sbin:/bin:/usr/sbin:/usr/bin)
$ sudo visudo
(Before)
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
(After)
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
$ sudo which python3.8
/usr/local/bin/python3.8
$ sudo ln -s /usr/local/bin/python3.8 /usr/local/bin/python3
$ sudo which python3
/usr/local/bin/python3
$ sudo ln -s /usr/local/bin/pip3.8 /usr/local/bin/pip3
$ sudo which pip3
/usr/local/bin/pip3
```
NXP SE050検証(概要編)(Overview of Testing NXP SE050)

#はじめに#
2019/12/14に開かれた　IoTSecJPにてお時間をいただき
[セキュアエレメントとIoTデバイスセキュリティ](https://www.slideshare.net/KentaroMitsuyasu1/secure-element-for-iot-device)
と題してお話させていただきました。
その内容をベースにまとめていきたいと思います。

#セキュアエレメント比較#
前回迄検証していたATECC608Aと比較してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/a88fc571-b6a7-bb57-f618-6bb5ca5e1f41.png)

NXP SE050は幅広い楕円暗号とRSA暗号にも対応できる。
SHAも512まで対応可能。
記憶領域が1.1KB→50KBと大きい容量を扱える。
価格はおよそ5倍（1個単価）
コモンクライテリアEAL6+他の認証を取得しているところが大きい。

パッケージの比較。
ATECC608A
[8-pad UDFN, 8-lead SOIC, and 3-lead CONTACT packages](https://www.microchip.com/wwwproducts/en/ATECC608A)
とあるが、実際は、8-pad UDFN, 8-lead SOICのみが販売されているようだ。扱いやすいのは8-lead SOIC、高密度に実装したい場合UDFNと選択できる。
写真はSOICをDIP変換に乗せたところ。はんだ付けの難易度はそこそこ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/0ce1d880-54e0-dde5-1cc8-facac45ba9f8.png)


SE050
[Small footprint HX2QFN20 package (3x3 mm)](https://www.nxp.com/products/security-and-authentication/authentication/edgelock-se050-plug-trust-secure-element-family-enhanced-iot-security-with-maximum-flexibility:SE050)の1パッケージのみ。
aitendoの[QFN20pin](http://www.aitendo.com/product/14872)変換基盤へ実装するが、手はんだは相当の難易度。
フラックスとはんだペーストを駆使して何とかはんだ付け。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/3d2b8e89-961b-c677-84bb-c86f7d7cfc7a.png)

#SE050のバリエーション#
NXP社の[comparison Table](https://www.nxp.com/products/security-and-authentication/authentication/edgelock-se050-plug-trust-secure-element-family-enhanced-iot-security-with-maximum-flexibility:SE050)から、6つラインアップがあり、ざっと

SE050A　楕円暗号対応
SE050B　RSA暗号対応
SE050C　楕円、RSA両方対応し、NFCカード対応、I2Cマスター機能を持つ　

3つそれぞれ通常版と環境対応版（動作温度範囲拡大）がある。

今回全部入りのSE050Cを選択し検証していく。
GitでPowerShellスクリプトファイルをhookする。

プロジェクト運用上、
「Visual Studioで開発を行っているが、開発環境ごとに `csproj` の内容を変えている（IISの設定）」
ので、ごく個人的にはリーダーさんがスムーズにプロジェクトファイルを開いて動作確認していただきたく、PowerShellで、
「自分の環境で `csproj` を開くために行った編集を間違えてコミットしないように、 `csproj` の中身を確認する」 
だけのスクリプトを書いたので、そのメモ。

# `.git/info/exclude` に `*.csproj` を突っ込むだけでいいのでは？

Visual Studioで追加・削除したファイルの管理は行いたいので、今回はこうしました。

# Git Hooks
[公式ドキュメント](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)はもちろん、Qiitaでもこれの使い方はたくさん出てくるので、割愛。

Gitで何かコミットやコミットログを編集するようなコマンドを叩いた時に、Git Bashでスクリプトを動かして、チェック機能などを付加できるものだという雑理解でいいんでないかと。

# Git BashでPowerShellのスクリプトを動かす方法。

今回はコミットを行う直前にチェックしたかったので、 `.git/hooks/pre-commit` を作ります。

``` bash:pre-commit
#!/bin/sh
powershell.exe -Command "echo 手ミー、コミット！"
```

ワンラインであれば上記で十分ですが、今回はスクリプトファイルを作ったので、 `.git/hooks/` の下の各ファイルの内容は以下のようになりました。

``` bash:pre-commit
#!/bin/sh
powershell.exe -File ".git/hooks/check-csproj.ps1"
```

``` powershell:check-csproj.ps1
# csproj の中身はxmlなので、XMLオブジェクトに変換して取り込む
# 気を付ける点としては、スクリプトファイルの存在するディレクトリからではなく、
# Git管理下ディレクトリの直下からのパスを指定すること。
$proj_xml = [xml](Get-Content "src/Tale.proj")

if ($proj_xml.Project.ProjectExtension.VisualStudio.FlavorProperties.WebProjectProperties.IISUrl -ceq "http://localhost/")
{
#IISUrlプロパティの中身が "http://localhost/" 決め打ち
    Write-Host "ニャハハ！　片付けバッチリだな！"
    exit 0
} else {
#IISUrlプロパティがそもそもなかったり、 "http://localhost/" 以外が割り当てられていた場合
    Write-Host "ぬわぁぁぁぁぁっ！　貴様、csprojを汚すな！"
    exit 1
}
```

上記 `check-csproj.ps1` のコメントアウトでも書いた通り、スクリプトファイルからの相対パスではなく、Git管理下ディレクトリ（フォルダ）からの相対パスで、各ファイルを呼びだします。

# 参考資料
+ [Windowsでpre-commitを実行する - Yanor.net/Wiki](http://yanor.net/wiki/?Git/%E3%83%95%E3%83%83%E3%82%AF/Windows%E3%81%A7pre-commit%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)
+ [Running PowerShell scripts as git hooks - stackoverflow](https://stackoverflow.com/a/23258452)

# P.S. スクリプト内の文字列について
[Undertale](https://undertale.jp/)というRPGのキャラクターのセリフっぽくしました。

最近のLinux版Steamでも[Proton](https://github.com/ValveSoftware/Proton)を強制有効化すると遊べます。
おかげで姉に誕生日プレゼントで買ってもらったこのゲームを3年越しに遊べました。
rails g scaffold_controllerしたのに、indexにアクセスするとNo route matches

## 発生したこと
`rails g scaffold_controller crazy_diamond`やりました。
コントローラーとかviewとかできました。

```
create  app/controllers/crazy_diamonds_controller.rb
invoke  erb
create    app/views/crazy_diamonds
create    app/views/crazy_diamonds/index.html.erb
create    app/views/crazy_diamonds/edit.html.erb
create    app/views/crazy_diamonds/show.html.erb
create    app/views/crazy_diamonds/new.html.erb
create    app/views/crazy_diamonds/_form.html.erb
```

そんで、`http://localhost:3000/crazy_diamonds`にアクセスしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533120/625bf14b-7b15-c9a0-32ed-84fa735e254a.png)

なんでか。

## 解決策

参考：https://mpiyok.hatenablog.com/entry/2015/10/05/074742

```rb:config/routes.rb
Rails.application.routes.draw do

  resource :crazy_diamonds  # indexはルーティングされない
  resources :crazy_diamonds # indexがルーティングされる
```

「resource」に「s」がつてないと。だからindexにはアクセスできませんと。
ドヤ顔でミスを指摘してくるバイトリーダーを思い出しました。
Excel のチェックボックスが印刷すると小さくなる

## 背景

自分の PC で Excel ファイルを印刷するとチェックボックスが小さく表示された。他の人はそんなことないのでググってみたが解決策が見当たらなかったので調べてみた。

## 解決方法

【ディスプレイ設定】の「テキスト、アプリ、その他の項目のサイズを変更する」を「100%」に変更する。
![DisplaySetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58491/0fa28833-8b02-9788-f8e9-a4285eb614c7.png)

## 原因

Windows 10 では高解像度のモニターでも表示スケールを変更して拡大表示し、文字や画像が大きく表示されるようになっている。
最近のアプリは拡大縮小しても綺麗に表示されるようになっているが、昔のアプリは対応していないので、たまに変な表示になったりする。

Excel の場合、アプリ本体は対応しているのだが、チェックボックス等のコンポーネントに関しては昔のままなので、表示スケールを変更してもそこだけ拡大されず、相対的に小さく表示されて見えるようだ。

100% 表示だと小さくて見えにくい場合は解像度を下げるか、 2K モニター等の昔のモニターを外部モニター／サブモニターとして接続し、そちらに表示すれば見やすいだろう。
Linuxコマンド備忘録

よく使うコマンドたちを使うケースに分けて記録してみました。
誰かの役に立てばうれしいです。
※Linuxコマンド備忘録というタイトルなんですがLinux以外にもまじってます…

#### ファイル新規作成して書き込み・保存して終了

```
$ touch fileName（ファイル作る）
$ vi fileName（ファイルの中に入る）
aかiを押す （文字を書き込めるようになる）
ごにょごにょ（ファイルの中に入れたので書き込む）
Ctrl + C　（コマンドモードに戻る）
# 強制的にファイルに書き込みたい時
$ :w !sudo tee %
$ :q!
# 強制的に書き込まなくても保存終了できる場合
$ :wq（ファイルを保存して終了）
```

#### ギットプルしてシンボリックリンク向かせる（デプロイのときよく使った）
```
$ tree -L 2(ディレクトリ構造のイメージ)
now
├── releases(空っぽのディレクトリ用意)
└── current

$ cd releases
$ git clone https://git.hogehoge.com/scm/aaa/study.git // masterブランチがクローンされる
$ cd study
$ git checkout develop // ほしいソースのブランチにチェックアウト
$ git pull origin develop // ソースをプル
$ cd ../../
($ unlink current //すでにシンボリックリンク向いてる場合これで外す)
$ ln -sf releases/study current

```

#### テキストの中から特定の文字列検索
```
$ grep -ir 検索したい文字列 --include=*.sql --exclude-dir=*/tests/* .
// SQLファイルからのみ検索したい文字列をtestsのディレクトリ内からは除外して現在地から検索
// 最後のカンマを置かないとサーバー内にあるすべてのディレクトリから検索してしまい時間もかかるためカンマを置くことで現在地から直下のディレクトリ内のファイルを検索してくれます
--exclude-dir={hogehoge,tets}
//　複数除外したいディレクトリある場合

```

#### ディレクトリの中にあるドットファイルも全部コピー
```
$ cp -a hoge1/. hoge2
// hoge1の中身を全部hoge2に入れてる、-aを付けることでドットファイルもコピー
```


#### Mysqlの中に入る（Linuxコマンドなのかはわからないけど・・・）
```
$ mysql -u USER_NAME -h HOST -p -P PORT
//これでUSER_NAMEでパスワード付きでMysqlの中に入れる
$ Enter password:
mysql> // 入れた
```

#### gitで読み込むファイルの権限を755にする方法（もはやLinuxコマンドではない）

```
$ git config core.filemode false // filemode = falseにしないとこれより先のコマンドが機能しない
$ git config -l |grep filemode　//　確認したい人だけ叩いてください
$ git update-index --add --chmod=+x filePath/fileName　//　--chmod=+x　が755にするって意味らしい
```

#### 現在使用中のポートの確認→消すまで
```
sudo lsof -i:8080
kill PID番号
```
contenteditableな要素への入力をイベントで検知する

# 結論
changeイベントは発火しないけど、inputイベントは発火しています。

# 例

以下のような要素があったとします。

```html
<div id="editor" contenteditable="true"></div>
```

これに対する入力がなされたタイミングで処理したい場合があります。
そこで、changeイベントで取れるかな？と思って以下のように書きたくなると思います。

```js
//ダメな例

let editor = document.getElementById("editor");
editor.addEventListener("change",function(){
   console.log("change");
});
```

しかし、入力してもchangeイベントは発火しません。
contenteditableは、次のようにinputイベントで受け取りましょう。

```js
//よい例

let editor = document.getElementById("editor");
editor.addEventListener("input",function(){
   console.log("input");
});
```
visual studio code ショートカット Ctrl+/ が作動しません

visual studio code ショートカット Ctrl+/ が作動しません。
スクリーンショットのEditメニューを見るとCtrl + /にはきちんと割り当てられているのですが、ショートカットキーが使えないと困ります。どういった対処方法があるでしょうか。
visual studio code を再インストールするとかになってしまうのでしょうか？
　PCは　LENOVO　ideapad330で、昨年購入した機種です。
何か対処方法をご存じの方は教えてもらえませんでしょうか。