OmniAICreator/Qiita-1.07M huggingface dataset:
[読書]IT業界の病理学

こんにちは。今日はいつもの小ネタではなく、一風変わって書籍紹介のような記事を書いてみたいと思います。たまにはこういうのもいいんじゃないかなとｗ

## 書籍情報
![350_130970.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70638/3ea4196f-e5fc-46f7-9cf5-8c660bf6015b.jpeg)

- IT業界の病理学
- 司馬紅太郎、秋山浩一、森龍二、鈴木昭吾、都築将夫、堀明広、佐々木誠、鈴木準一　著
- 2019年11月9日発売
- https://gihyo.jp/book/2019/978-4-297-10857-1

## ざっくり概要
IT業界というよりはシステム開発界隈の様々な事例を、「症例」という視点で捉え、それぞれの症例に対して、その症状、原因、治療法、予防法、という視点で記事が書かれている、というものです。

少々曲解かもしれませんが、わかる人にはわかるシステム開発あるある本と言い換えてもいいかもしれません。

## 目次
- 1章 開発の病気
- 2章 レビュー・テストの病気
- 3章 保守・運用の病気
- 4章 マネジメントの病気
- 5章 業界の病気

## 個人的に刺さった話題の抜粋・所感
個人的に「おっ」とか「ｷﾞｸｯ」となった話題を抜粋して、私なりの感想を交えて紹介してみたいと思います。

### 1章より「絶対にさわれないソースコード」
1000行オーバーのメソッド、命名規則・ソースコードの記述ルール・開発標準がなくカオス、コピペされたコードの嵐(同じコードが色んなところに直書き)、全体を把握している開発者が一人もいない、という **どこかで聞いたことがあるようなないような話** がテーマです。うっ、頭が(

主な原因として考えらえることは、**時間がなかった** という点に集約されています。正直身もフタもないとは思いましたｗ

時間がないゆえに

- とにかく動けばよい
- テストも書くヒマがない
- リファクタも後回し

ということが **積み重なった結果** 絶対にさわれない、というかさわりたくないソースコードが生まれてしまった、ということが要旨と考えられます。

また、**そもそも時間がなかったことの背景** として、ソースコードの整理や教育に対する投資を、直接利益を生まないという理由で経営者より軽視されている、という背景も少なくないようです。

で、気になる治療方法ですが、第一声に **この病気を治療するのは非常に困難です。** と書かれています。<font color="red">**とんでもねぇ難病ですね。**</font>

根治治療は難しく、地道な対処療法しかないのが現状です。その最初のステップとしては、**自動でも手動でもよいのでテストを書こう** ということが挙げられています。目的や期待される効果として、

- 現行のシステム動作・振る舞いを把握するため
- 変更しても壊れていないことを随時確認するため
- これにより **リファクタリングの心理的障壁を下げるため**

というものです。そもそもテストを書くことにもある程度の慣れや技術が必要なので、テストを書く練習を研修などに取り入れていくといいのかな、と私はぼんやり考えました。

ちなみに予防法としては **ソースコードの実態を開発中に常に把握する** ということが挙げられています。前述の1000行超えメソッドが無いか、など例えるならそういう話です。

「ステップカウンタ　フリー」等で検索すると、規模を計測する助けになるツールなどが実はネットにけっこう落ちていたりします。興味がある方はぜひ探してみてください。

### 2章より「全部そろってからレビュー」
レビューの粒度が大きすぎることによるデメリットや問題点にフォーカスしたトピックです。
大きすぎる粒度のレビューの主な問題点としては

- そもそもレビューに大きな時間がかかり、レビュアーに負荷がかかる
- レビューの精度を保てず、下手すると重大な問題点を見逃しかねない
- もしフェーズの後半に大きなレビューを集中して行い、修正項目もたくさん出ると今度は修正する時間が足りなくなる

という点です。**かくいう私にもレビュアー、レビュイー両方の立場で多少身に覚えがあります(苦笑)**

こちらの原因は単純にレビューの粒度を細かくすればよい、とは限らないことがここでの興味深い点でした。もし成果物の最終的な品質をレビューしたい場合、逆に全部そろわないとレビューにならないからです。

ここで大事なポイントは **何をレビューしてほしいのか(あるいはレビュアー的には何をレビューしたいのか)** という目的をはっきりさせ、それに対して **予めレビューの計画・予定を立てておく** ことです。

実はこれはレビュアーにも非常に大事なところで、**レビュー時にどこまで踏み込むのか** という点も考慮できる意味でも事前に計画を立てておくことは大きな意味があります。

これからレビューすることもしてもらうことも両方あると思いますが、この章は短いながらも非常にポイントが高いという印象を受けました。

## 感想
とりあえず気になったものをかいつまんでみました。全体的な印象としては、正直大手の業務系システムを想定した状況が多いかな？と感じました。ただ、中には汎用的に参考になる記事もありましたし、書籍自体は通勤の合間にサクサク読めてしまう程度の文量でわりととっつきやすく、「これは参考になる」と思えたところだけをうまくパクって活用するだけでも違うんじゃないか、ということが読了後の印象でした。

もし気になったという方は試しにレジに持っていってみてはいかがでしょうか。

本稿へのツッコミ、感想、単にひとことなどあればお気軽にコメントください。

ではまた。
Rails 6ではsend_data/send_fileメソッド呼び出し時にERB::Util.url_encodeは不要です

## Rails 6にアップグレードすると発生する問題
Railsでファイルダウンロード機能を実装するときは`send_data`メソッドや`send_file`メソッドがよく使われます。
このとき、ファイル名に日本語（正確には非ascii文字）が含まれていると、IEやEdgeで文字化けします。
そのため、Rails 5.2以前では以下のように`ERB::Util.url_encode`メソッドを使って文字化けを防いでいました。

```ruby
class FooController < ApplicationController
  # ...

  def download
    # ...

    # Rails 5.2以前ではurl_encodeをかけないと、IEやEdgeでダウンロードしたときに
    # `縺ｫ縺ｻ繧薙＃.txt`のようなファイル名になってしまっていた
    send_data(your_data, filename: ERB::Util.url_encode('にほんご.txt'), disposition: 'attachment')
  end
end
```

しかし、RailsアプリケーションをこのままRails 6にアップグレードすると、再びファイル名が文字化けします。
（IEやEdgeのみならず、Chrome等でも文字化けします）

```
# Rails 5.2でダウンロードしたときのファイル名
にほんご.txt

# Rails 6.0でダウンロードしたときのファイル名
%E3%81%AB%E3%81%BB%E3%82%93%E3%81%94.txt
```

## 原因

これはRails 6でファイル名がデフォルトでエンコードされるようになったのが原因です。

- [Encode Content\-Disposition filenames on send\_data and send\_file · rails/rails@890485c](https://github.com/rails/rails/commit/890485cfce4c361c03a41ec23b0ba187007818cc)

## 解決策

Rails 6ではデフォルトでエンコードされるので、`ERB::Util.url_encode`を挟まずに`send_data`メソッドや`send_file`メソッドを呼び出してください。

```diff
-send_data(your_data, filename: ERB::Util.url_encode('にほんご.txt'), disposition: 'attachment')
+send_data(your_data, filename: 'にほんご.txt', disposition: 'attachment')
```

こうすれば、どのブラウザでも文字化けせずに日本語のファイル名でダウンロードすることができます。
schemaにdumpさせてみました


##記録用

railsでgenerate migrationコマンドを使って、自動的に作成していましたが、その方法で作成しない方針だったため、migrationファイルからDBにカラムを追加したり、コメントを入れたり、schemaディレクトリにバックアップファイルを作成してその中にdumpさせました。

完全に理解していないですが、記録用と手順ややったことを忘れないためにも残しておきます。


##migretionファイルでカラムの追加


###カラムの追加

```
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型 型名  ;
COMMENT ON TABLE テーブル名 IS 'コメント';
```

###データ確認
```
\d (テーブル名)
\d+ でコメントも確認することができる
```


列　｜　型　｜　修飾語


↑のような形式で追加したカラムを確認することができる


##schemaファイルにdumpするとき

データベースを指定してダンプする場合は、pg_dumpを使用する

```
pg_dump DB名 --schema-only -U username -h host -p port -t  'table' > file(バックアップファイル).sql
```

###dumpのオプション内容

-- schema-only
データ定義（スキーマ）のみをダンプし、データはダンプしません。

-U username
指定したユーザとして接続します。

-h
000.000.000.000

-p
ポート番号

-t table
tableに一致するテーブル（またはビューやシーケンス）のみをダンプします。

table > file.sql
dump先を指定

このようにオプションで絞っていきました。

schemaファイルにdumpできていることを確認することができました。
次回からこの手順で作成していきます。


参考文献

https://www.postgresql.jp/document/9.4/html/ddl-alter.html

https://www.postgresql.jp/document/8.2/html/app-pgdump.html

https://www.postgresql.jp/document/11/html/app-pgdump.html
firebaseデプロイ中のサイトを（Xドメイン）独自ドメイン設定する方法

Xサーバーにてに数年前からWordPressを利用していた為
###Xドメインを元々取得していた###

###Xドメインを利用した独自ドメイン設定についての記事が見つける事が出来なかった為、トライ致しました。###
今後のために記録を残す。

---
##Firebase　HPログイン##

https://firebase.google.com/

##①ドメイン指定したいプロジェクトを選択##

####カスタム ドメインを追加をクリック####
<img width="695" alt="スクリーンショット 2020-01-19 21.33.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/c6331636-d7dc-0bf9-bedd-bb1c648ee0df.png">
##↑　ここのドメインに、取得済みのドメインを入力##
(例：　uuu.com)

<img width="697" alt="スクリーンショット 2020-01-19 21.36.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/721fe596-7ffb-c302-9cd9-ecc13dc62ed3.png">


###↑　このTXTの値を　DNSに紐つける。以下参照###

（まだ所有権を証明はクリックしない）

---
##①　Xドメイン　HP　ログイン

<img width="438" alt="スクリーンショット 2020-01-19 20.51.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/74fcc76d-9286-42ca-082c-2f56291caa66.png">

###契約情報　＞ドメインパネル###

###②ネームサーバー情報を編集###

Xドメインで利用を選択、保存

<img width="620" alt="スクリーンショット 2020-01-19 20.53.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/73dd10e8-8fe9-12c1-2998-ade2ee078240.png">


###③DNSレコード###

新規レコードを追加　＞　
<img width="459" alt="スクリーンショット 2020-01-19 21.30.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/3c14f8e5-a813-129f-8308-cfb63d09e21c.png">


タイプ　：　TXT

コンテンツ　：firebaseのTXTの値をここに貼り付ける


レコードを追加をクリック

---

###Firebase　HPの所有権を証明　をクリック。###

<img width="697" alt="スクリーンショット 2020-01-19 21.36.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/f25505ba-429d-a47b-219e-dccd7e16b192.png">




（DNS反映に時間がかかる為、数時間後にクリック推奨）

###A　値　が２つ出る###

##この値を、③と同じく入力していく。##


ドメイン反映に　２４時間ほどかかると記載あり。

<img width="761" alt="スクリーンショット 2020-01-21 7.46.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/ba685bf8-8252-b7df-221d-8011e381d6d0.png">


数時間後にURL確認すると反映されていた
【イベント申込みました！】【初心者向け】ソフトウェアテスト勉強会（ASTER出張セミナー） in 長崎 

#長崎でソフトウェアテストの勉強会に参加します！

## イベント開催概要

### 【初心者向け】ソフトウェアテスト勉強会（ASTER出張セミナー） in 長崎 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516424/0a8189e8-49d1-883f-4912-6e5ef17a3012.png)
connpassより (https://nagasaki-it-engineers.connpass.com/event/155285/)

### (ソフトウェアテスト初級者向け) テストの基礎を体系的に学ぶことができる勉強会!
>ソフトウェアテスト初心者を対象に、ASTERセミナー標準テキストをもとに、テストの基礎を経験豊かな講師により解説いたします。これまでテストを体系的に学んだことがない、日頃テストで悩んでいる、テストを学びなおしたい、現在のテストの潮流などを知りたいといった方を始めとしてテストに興味があればどなたでもご参加いただけます。

- 参加費　無料！
- 日時・場所
    - 日時：2020年2月1日（土） 12:30 ～18:30（予定）
    - 場所：CO-DEJIMA（長崎市）
    - 主催：NPO法人ASTER
    - 共催：長崎IT技術者会
    - 後援：公益財団法人長崎県産業振興財団

↓ CO-DEJIMA
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516424/09cb3352-b6a4-35f3-874f-39d069fa0011.png)

### 主催コミュニティ紹介　「NaITE（長崎IT技術者会）」

> 長崎に縁のある技術者による技術コミュニティです。
長崎QDGやAgile japan 長崎サテライトを開催，その他長崎内外で勉強会やSIG活動に取り組んでいる。


## 勉強会に参加する目的
 
### 4か月ぶりの長崎 (実は2019年10月にも長崎の勉強会に参加しています)

前回2019年10月(4か月前)には、今回と同じくNaITE（長崎IT技術者会）主催の「4th 長崎 Software Quality and Development Gathering」に参加しました。
[【イベントレポート】4th 長崎 Software Quality and Development Gathering](https://qiita.com/naosumi_tech/items/38228f58beda2738c0d7)

私は、現在関東に在住ですが、まさか、4か月という短いスパンで、長崎に2度行くことになるとは正直考えてもいませんでした。しかし、**ソフトウェアテストについて体系的に学ぶ機会**は、あまり多くありません。(そして、また、長崎ちゃんぽんを食べたいという気持ちも強くありました。)
ということで、このイベントを知った後は、割と早めに行くことを決意しました。

### ソフトウェアテストの基礎を定着させるために！

「会社の業務でソフトウェアテストをやっているが、OJTが基本で体系的にソフトウェアテストについて学ぶ機会が少ない。」という悩みをお持ちの方は少なくないのではないでしょうか。私自身、2年間テストの担当者として仕事をしましたが、テストについてきちんと学んだことがなく、テストに対するモチベーションが上がらなかったり、テストでやるべき活動をきちんと押さえられてないという状態が続いていました。
テストに対するモチベーションを上げること、また実業務でのテスト活動を改善するためには、テストのあるべき姿を認識する必要があると思います。そこで、今回の勉強会で、ソフトウェアテストの基礎を定着させたいと考えています！

### JSTQB Foundation Levelに受かるために！

2/8(土) (ちょうどこのイベントの一週間後)にJSTQB Foundation Levelを受験します！
この勉強会の内容とJSTQB Foundation Levelは重なる部分があるので、勉強したことを復習するチャンスとしても活用させていただきます。
[JSTQB（Japan Software Testing Qualifications Board）](http://jstqb.jp/attribute.html)

### LT枠で申し込んでみた　しかし、まだテーマは決まっていない。。。

#### せっかく参加するなら、何か自分もアウトプットし、イベントに貢献する！

僭越ながら、LT(ライトニングトーク)枠で申し込みをしました。
当日は5分間、**ソフトウェアテストについての話題**をお話しさせていただきます。
ソフトウェアテストに関する自分の知識や技術、経験を整理し、ソフトウェアテスト初心者向けに少しでもお役立ちできる情報をお伝えしたいです！

ちなみに、2019年10月に人生ではじめて勉強会というものに参加したときにも、LTでお話しさせていただきました！
[はじめてのLＴ(ライトニングトーク)の進め方](https://qiita.com/naosumi_tech/items/f2a96b9fdad7150a2bed)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516424/91d90f5e-d76d-e302-cc40-d85af001fea3.png)

以上です。参加後はイベントレポートを書きます！
参加される方は、当日どうぞよろしくお願いいたします(^^)/
まだ、参加申し込みされてない方はぜひ、一緒に長崎でソフトウェアテストについて学びましょう！
JSDocの書き方・出力メモ


最近はJavaScriptを書くことが多く、「仕様書出せ！」と言われるのでJSDocでの記述・出力メモ。

## やりたいこと

* ./srcフォルダに機能別に保存され、module.exportsされる関数の仕様を記述・出力する


## セットアップ

めんどくさいのでグローバルにインストールします。

```bash
npm install -g jsdoc
```

## サンプル

### 作業場所の準備

```bash
mkdir jsdoc-test
cd jsdoc-test
mkdir src
touch hello.js bye.js
```

### hello.jsの記述

モジュールの場合は@moduleを付けてやらないと何も出力されない。

```js:hello.js
/**
 * Helloという文字列を返します。
 * @module hello
 * @param {string} name - 表示したい名前を指定する。
 * @return {string} - [Hello + name]という形式で戻る。
 */
module.exports = hello = (name) => {
    return "Hello" + name;
}
```

### bye.jsの記述

```js:bye.js
/**
 * Helloという文字列を返します。
 * @module bye
 * @param {string} name - 表示したい名前を指定する。
 * @return {string} - [Bye + name]という形式で戻る。
 */
module.exports = bye = (name) => {
    return "Bye" + name;
}
```

### Doc出力

```bash
jsdoc src
```

すると、同じ階層にoutというフォルダが作成される。その中のindex.htmlを見る。
下記のような内容が表示される（味気ない）。

![スクリーンショット 2020-01-21 7.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/5de2c208-7fc4-a166-257b-b3690384f007.png "スクリーンショット 2020-01-21 7.30.04.png")

右メニューのHelloを見ると下記のような感じ。

![スクリーンショット 2020-01-21 7.30.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/02053029-ad78-bfbd-b400-f83d8609d00e.png "スクリーンショット 2020-01-21 7.30.41.png")

基本は以上。

## 応用１：Home画面に説明文を入れたい

Markdownで説明文を書いて、出力時に指定すれば取り込んでくれるみたい（便利）。

```md:README.md
### テストAPIです。

以下の２つを作りました。

* hello()
* bye()
```

そして、

```bash
jsdoc src README.md
```

とすると、下記のようにHomeに出力されます。

![スクリーンショット 2020-01-21 7.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/ad82aa44-a452-f3d2-37d9-be9fcc80bef6.png "スクリーンショット 2020-01-21 7.34.17.png")

## 応用２：Objectを記述する

JSではObjectを引数、戻り値に取ることもありますよね。。。下記のように記述するようです。

```js:object.js
/**
 * Objectを受け取りObjectを返します。
 * @module object
 * @param {Object} user - ユーザーオブジェクト
 * @param {string} user.name - ユーザの名前。
 * @param {number} user.age - ユーザーの年齢。
 * @return {Object} result オブジェクトが戻る。
 * @return {string} result.status - "OK or NG"。
 * @return {string} result.message - メッセージが返ります。
 */
module.exports = object = (User) => {
    return { status: "OK", message: "hoge" }
}
```

が、returnはうまく表現できないのかな・・・。

![スクリーンショット 2020-01-21 7.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/922328c9-0980-90b0-89ac-fec7a50db6fa.png "スクリーンショット 2020-01-21 7.45.05.png")



## 応用３：テンプレートを変更する

しかしJSDocの標準テンプレートはなんでこんなに微妙なんだろ。。。せめて左メニューにしてくれたらいいのに。。。
変え方はひとまずリンクだけ。

[こちら](https://www.dcom-web.co.jp/lab/javascript/jsdoc3)のサイトに紹介されているので一旦メモ。
【Rails】 DataTables 動的にカラムを変更する方法

# はじめに
Railsアプリケーションで DataTables を使う方法を以前にまとめさせていただきました。
DataTables を使ったテーブルのカラムを動的に変更したい需要があると思いますが、まとめられている記事を見かけませんでしたので、こちらにてまとめさせていただきます。
この方法を理解していれば、開発時間を極端に減らして高機能なテーブルを提供することができます。

なお、今回の方法は少し強引にカラムを動的に変更しています。
もし、もっといい方法があるということをご存知の方はコメントをいただければ嬉しいです。

#### 関連リンク
関連リンクを下記に載せておくので、必要であれば参考にしてください。。

* 【Rails】 DataTables 検索結果の保持方法
    * https://qiita.com/syukan3/items/4be6ba8ef22aff189fc4

# 動的にカラムを変更する方法
## 前提条件
下記リンクにてDataTablesを実装していること。
このリンク先のコードを元にして、動的にカラムを変更する方法をこちらの記事にて特記したいと思います。

* 【Rails】DataTables 実装方法
    * https://qiita.com/syukan3/items/5ac9f0d1b43334b5eb13

## 値を変更する方法
動的にカラムを変更するには、```users.coffee```のコードを変更することによって可能です。

ここでは一例として、id が 3 のときに"あほ"を表示するコードを書いています。

```coffeescript:app/assets/javascripts/users.coffee
$ ->
  # *** 省略 ***

  # user_table へカラムを追加する
  user_table.setColumns([

    # 以下に注目
    { 
      data: 'id',         title: 'ユーザID', width: '5%'
      # 以下を追記
      render: (data, type, row) ->
        # data / type / row にどんなデータが入っているか確認。
        console.log data
        console.log type
        console.log row

        if data == "3"
          "あほ"
    },
    { data: 'username',   title: 'ユーザ名', width: '25%' },
    { data: 'name',       title: '名前',    width: '30%' },
    { data: 'created_at', title: '登録日時', width: '20%' },
    { data: 'updated_at', title: '更新日時', width: '20%' },
  ])
  # *** 省略 ***
```

## フォントを変更する方法

つづいて、フォントを変更する方法を紹介します。

一例として、id が 3 のときに赤色の文字で"あほ"と表示するコードを書いています。
htmlタグを使ってそこにcssを埋め込んでいるだけとなります。（少し強引かもしれません。。）

```coffeescript:app/assets/javascripts/users.coffee
$ ->
  # *** 省略 ***
    # 以下に注目
    { 
      data: 'id',         title: 'ユーザID', width: '5%'
      # 以下を追記
      render: (data, type, row) ->
        if data == "3"
          "<span style='color: red;'>あほ</span>"
    },
  # *** 省略 ***
```

## Bootstrap のレイアウトを導入する
最後に応用技として、 Bootstrap のレイアウトを導入する方法を紹介します。

一例として、id が 3 のときに赤色の文字で"あほ"と表示するコードを書いています。
応用と書きましたが、htmlタグを使ってbootstrapで使用できるclassを付与しているだけとなります。

```coffeescript:app/assets/javascripts/users.coffee
$ ->
  # *** 省略 ***
    # 以下に注目
    { 
      data: 'id',         title: 'ユーザID', width: '5%'
      # 以下を追記
      render: (data, type, row) ->
        if data == "3"
          "<div><center><span class='label label-default'>あほ</span></center></div>"
    },
  # *** 省略 ***
```

# まとめ
いかがでしょうか。Railsなので動的に値を変更したい需要はかなりあるかと思いますが、DataTables だとドキュメントが英語で読みづらいし、あまり柔軟性がないと考える方もいると思います。
少し強引ではありますが、このような感じで色々な応用をすることも可能ですので、ご自身で色々と試してみるのもいいかもしれません。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
[bundler: command not found: unicorn_rails Install missing gem executables with `bundle install]AWSのEC2サーバ上でRailsに追加したgemfileが反映されない時の解決例

<エラー文>
<img width="985" alt="スクリーンショット 2020-01-21 7.03.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/829699d7-8f3b-9f2a-d008-5f2cd4f1ab2e.png">

#このエラーの原因で考えられること
local環境でしかgemfileが反映されていないことが考えられます。
具体的には下記のことにより起こっていると考えられます。

1.rbenvのrehashし忘れ
2.bundlerの入れ忘れ
3.githubへの反映し忘れ(commitとpushのし忘れ)

#解決方法

####1.rbenvのrehashし忘れ
rbenv(rubyの環境構築)について更新をすれば解決します
EC2サーバー上で下記のコマンドを入力してください

```
[ec2-user@ip-xxx-xx-xx-xxx chat-space$ gem install bundler -v 2.0.2]$rbenv rehash
```

####2.bundlerの入れ忘れ

EC2サーバー上にbundlerをインストールし、再度bundle installすることで解決します
バンドラーのバージョンはご自分のプロジェクトファイルのものと合わせるためローカルサーバー上でバージョンを調べたのち、EC2サーバー上で下記のコマンドを入力してください




```
Neverland:chat-space kontatomoya$ bundler -v
#プロジェクトのローカルディレクトリで bundler -v でbundleのバージョンを調べられます（筆者の場合は"Bundler version 2.0.2"が帰ってきたのでver2.0.2で以下を進めています）

[ec2-user@ip-xxx-xx-xx-xxx chat-space]$ gem install bundler -v 2.0.2
[ec2-user@ip-xxx-xx-xx-xxx chat-space$ gem install bundler -v 2.0.2]$ bundle install
#bundlerをインストールし、bundle installしてます
```



####3.GitHubへの反映し忘れ(commitとpushのし忘れ)
EC2サーバーにプロジェクトを保存するには、**GitHub上のデータ**を受け取りコピーという流れとなるため、GitHub上のデータに反映した後のデータをgit cloneしないとEC2サーバー上でも反映されません。そのため下記の手順に従って最新ファイルを反映させましょう。

①GitHub Desktopでcommitとpushし、GitHub上のデータに反映させましょう。

やり方はここでは説明しませんが簡単です。わからない人は下記などでやり方を確認してみましょう。（公式の使用方法解説ページにリンクしてます。）

https://help.github.com/ja/desktop/getting-started-with-github-desktop/creating-your-first-repository-using-github-desktop


②EC2サーバーのファイルに反映させましょう
今はEC2のプロジェクトが更新されていない状態なので、pullコマンドで更新を行いましょう

```
[ec2-user@ip-xxx-xx-xx-xxx chat-space$ gem install bundler -v 2.0.2]$ git pull origin master
#EC2は表示だけが必要となるため反映させるのはmasterとしましょう
```

③bundle installを行う
このプロジェクトのダウンロードができただけで、インストールはできていないので最後に忘れずbundle installしましょう

```
[ec2-user@ip-xxx-xx-xx-xxx chat-space$ gem install bundler -v 2.0.2]$ bundle install
```

これでこのエラーは解消されます。
【Vue.js】表示後、3秒経過したら自動的に消えるフラッシュメッセージのサンプルコード

## はじめに
**表示後、3秒経過したら自動的に消える**フラッシュメッセージのサンプルコードを残します。

※単一ファイルコンポーネントにしていますので、コピペで挙動の確認が可能です。

## 環境
```yaml
OS: macOS Catalina 10.15.1
Vue: 2.6.10
```

## 結論：コード
※コード内に簡単な説明を記載しています。

```vue:Sample.vue
<template>
  <div>

    <!-- v-ifで<script>内のshowがtrueであれば表示する -->
    <div
      class="flash"
      v-if="show === true"
    >
      this is flash message!
    </div>

    <!-- clickしたらmethods:{}内のshowFlashが発火する -->
    <button
      @click="showFlash"
    >
      show flash message
    </button>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        show: false,
      }
    },

    // Vueインスタンスに変化があったら発動する
    updated() {

      // setTimeoutで3000ms後にshowをfalseにする
      setTimeout(() => {
        this.show = false}
        ,3000
      )
    },
    methods: {
      showFlash(){
        this.show = true;
      }
    }
  }
</script>

<style>
.flash {
  width: 200px;
  height: auto;
}
button {
  width: 200px;
  height: 30px;
  background: red;
  border-radius: 5px;
}
</style>
```

## 2020/01/22 追記　修正分

@aotoriii さんよりご教授頂き、リファクタリングしたものを以下に記載しております。

@aotoriii さん、わざわざご指摘ありがとうございます:bow_tone1:

```vue:Sample.vue
<template>
  <div>

    <!-- v-ifで<script>内のshowがtrueであれば表示する -->
    <div
      class="flash"
      v-if="show"
    >
      this is flash message!
    </div>

    <!-- 略 -->
</template>

<script>
  export default {
//...略
    methods: {
      showFlash(){
        this.show = true;
      // setTimeoutで3000ms後にshowをfalseにする
        setTimeout(() => {
          this.show = false}
          ,3000
        )
      }
    }
  }
</script>
```

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [Vue インスタンス — Vue.js](https://jp.vuejs.org/v2/guide/instance.html)
- [条件付きレンダリング — Vue.js](https://jp.vuejs.org/v2/guide/conditional.html)
[Ruby on Rails] resourcesの使い方について

resourcesに慣れないので理解することを目的に個人のメモとして残します

#環境
OS：Windows10
Rubyバージョン：ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]
Railsバージョン：Rails 5.2.4.1

#resourcesの使い方
```ruby:routes.rb
Rails.application.routes.draw do

resources :tests

end
```
上記のようにroutes.rbでモデルを選んで宣言

#resourcesの機能
- 複数のCRUD処理に関わるルーティングを設定する（下記の表参照）
- いくつかのURLと同値である簡潔な文字列が使用できる
    
|URLと同値な文字列|httpメソッド|URL|コントローラー|アクション|
|:--------------:|:---------:|:--|:----------:|:--------:|
|tests|GET|/tests|tests|index|
|tests|POST|/tests|tests|create|
|new_test|GET|/tests/new|tests|new|
|edit_test|GET|/tests/:id/edit|tests|edit|
|test|GET|/tests/:id|tests|show|
|test|PATCH|/tests/:id|tests|update|
|test|PUT|/tests/:id|tests|update|
|test|DELETE|/tests/:id|tests|destroy|

同じ文字列でもメソッドが異なるため判別されると考えられる

#RESTfulについて
勉強中。随時加筆
Kubernetesのkubectl自動補完エラー： -bash: _get_comp_words_by_ref: command not found

# 作業内容
https://kubernetes.io/docs/tasks/tools/install-kubectl/#enable-kubectl-autocompletion
K8S公式サイト通りに、設定してみたが、エラーです。

```bash
echo 'source <(kubectl completion bash)' >>~/.bashrc
```

# 問題事象

```bash
[centos@zzeng-hdp-1 ~]$ kubectl  gen-bash: _get_comp_words_by_ref: command not found
-bash: _get_comp_words_by_ref: command not found
```

# 対策
Bashの自動補完パッケージが足りない
https://www.tecmint.com/install-and-enable-bash-auto-completion-in-centos-rhel/

```bash
sudo yum install bash-completion bash-completion-extras
```

# 結果

```bash
[centos@zzeng-hdp-1 ~]$ kubectl de
delete    describe
```
メディアンフィルタを使って,空画像から星を抽出した


## はじめに
メディアンフィルタをかければごま塩ノイズが軽減されることを利用して,
空の画像から星を抽出してみました.


[こちら](https://github.com/be-m1ya/star_detection)に全コードがのっています.

左：元画像　, 右：星抽出画像
![E58741_right.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/eb9cb621-6903-e7d5-57d3-b1b033697c95.jpeg)

## どうやって？

星はごま塩ノイズにそっくり.フィルタをかけたら消えてくれそう
→フィルタをかけた(星の消えた)画像と元画像の差として星が抽出できるはず...

## 結果


①元画像
![E00012_right.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/abfad136-ceea-788d-db6e-46a478b7295e.jpeg)
②メディアンフィルタをかけた画像(かなり星消えてる!)
![median.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/d8cf3b29-6645-db4e-9adb-a8fc0825d602.jpeg)
③フィルタをかけた画像と元画像の差分
![star_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/c55a4ffa-9603-fa39-bb0e-b9a99ac5b023.jpeg)
④差分画像を2値化したもの
![star.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/545ee4be-0f8f-7d9a-9443-46028d1c3db3.jpeg)

つぶつぶお星がきれいです.
こんなに簡単なのにかなり抽出できた,お得!!
【CSS】cursor

## cursor
:sunny: 要素にカーソルが乗ったときにカーソルの形を変える

![普通.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/fee11c76-88ce-c907-56cc-3fa2b422f9f8.gif)

なにも指定しないと赤い四角にカーソルをのせても何の変化もありません。

### cursor: text;
:sunny: テキスト編集カーソルになる

```CSS.
cursor: text;
```

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/c6d6d030-38f7-fea5-6098-3a7ee4f5b1b3.gif)

テキストを入力するときに変化するローマ字の I のカーソルに変更になりました:laughing: 

### cursor: pointer;
:sunny: リンクカーソルになる

```CSS.
cursor: pointer;
```

![ezgif.com-video-to-gifのコピー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/af48916b-69d5-7c99-468e-6b0b0603ed5b.gif)

リンクボタンを押す時の指ボタンに変更になりました:laughing: 
ちなみに＜a＞タグはこの cursor: pointer; が初期設定されています:smile:

### cursor: default;
:sunny: 標準のカーソルになる

```CSS.
cursor: default;
```

![普通.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/acb48893-f8f8-acbb-bbef-fbb3374d17a6.gif)

初期設定されているカーソルです:sweat_smile:
rails+froalaエディタ使用の注意

<h1>表示させる部分にはクラスに'fr-view fr-element'を付ける</h1>


froalaエディタは、とても高機能のエディタである。

ブログアプリで使用するとき、form画面ではとくに問題ないが、その内容を表示させるときに思うように表示されないときがある。
それは、form画面ではデフォルトで

```
<div class="fr-view fr-element">
```

で囲まれているが、表示させるときはない。
画像の左寄せ、中央寄せ、右寄せの機能がうまく表示されないのはこのせいである。
なので表示させたいページで同じようにdivで囲めばよい。
macOS Catalina ＋ Unity 2019.3でAndroidビルド（IL2CPP）に失敗する場合の対処

# 概要
macOS Catalina ＋ Unity 2019.3でAndroidビルド（IL2CPP）に失敗したので対処のメモを残しておく。

# 何が起きたか
IL2CPPでAndroid向けビルドをした時に、以下のエラーが発生。

>Failed running /Applications/Unity/Hub/Editor/2019.3.0f5/Unity.app/Contents/il2cpp/build/deploy/il2cppcore/il2cppcore.dll (以下略)

# 原因(おそらく)
Android NDK を手動でインストールしたことにより、macOS Catalinaの強力すぎるセキュリティに引っかかってコマンドを実行できなかった。

# 対処方法
UnityHubからAndroid NDK をインストールする。(SDKも一緒にインストールされるが)
PreferenceからNDKのパスを設定することを忘れないこと。

# 環境
Mac OS 10.15.2
Unity 2019.3.0f5
AWSが大阪リージョンを開設するに至った背景を推測する

#AWSが大阪リージョンを2021年初頭に開設を発表
AWSは2020年1月20日にこれまで一部顧客向けの限定的なローカルリージョンとしての位置付けだった大阪リージョンを、東京やその他リージョンと同様なスタンダードなリージョンとして拡張を発表しました。

- [AWS、2021年初頭に大阪でスタンダードなAWSリージョンを開設](https://prtimes.jp/main/html/rd/p/000001104.000004612.html)

- [In the Works – AWS Osaka Local Region Expansion to Full Region](https://aws.amazon.com/jp/blogs/aws/in-the-works-aws-osaka-local-region-expansion-to-full-region/)

個人的にこの発表は、ここ最近のAWS関連ニュースの中でも上位に来るレベルなサプライズでした。というのも直近の案件でAWSでのDR構成についてアレやコレやと頭を悩ませていたからです。

#官公庁システムのクラウド・バイ・デフォルトについて
日本政府は2018年より政府情報システムのクラウド利用における基本方針を打ち出して、「未来投資戦略2018」や「サイバーセキュリティ戦略」などにより諸外国の状況を調査したりと、クラウドサービス利用における安全性評価に関する検討を2019年まで行っておりました。

そして2020年秋から全省庁のシステムをクラウドに切り替えていくため、海外の企業に日本国内へのデータセンター設置などを求めていました。今後4～8年で原則、クラウドに切り替わっていきます。

- [全省庁への導入でクラウドの全国的な広がり期待](https://web.fisco.jp/FiscoPFApl/ThemeDetailWeb?thmId=0010320020191111003&token=)

制限付きの大阪ローカルリージョンは2018年に開設されておりましたが、2020年秋より本格化する官公庁システムのクラウド移行需要を取り込むための準備が整ったという感じなのかなと推測しています。

#要件
堅めのシステムですと`データの海外持ち出しNG`、`国内裁判権`、`DR`などの要件を良く耳にすると思います。`AWS`で`国内`で`DR`を満たそうと既存の使い勝手が良いとは言えない大阪ローカルリージョンで構成しようとするとイケてない感じになってしまい、いっそ現状で東西リージョンのあるAzureにした方がいいのでは？ってパターンに遭遇することもありました。

DR要件が局所的な被災を想定するのか広域的な被災を想定するかでまた変わって来ますが、広域想定とする場合は尚の事悩ましいものです。

今回の大阪リージョンのスタンダード化の発表によって、2021年から広域想定のDR構成が組みやすくなる為、シンプルにより顧客の要件に沿った提案が可能となるわけです。わ〜い。

あと純粋に西日本寄りに事業所がある場合、大阪リージョンにインスタンスを立てたほうがレスポンスがあがるのも嬉しいですよね。

#まとめ
ざっくり簡単にまとめると

- 政府は2020年秋から順次システムをクラウドへ移行する為に準備してきた
- AWSは官公庁システムの移行需要に備えるため大阪リージョンの拡張を進めた(推測)
- これまでAWSでは満たし難かった要件を、将来満たせるようになるため提案の幅が増えた

以上、AWS大阪リージョンの拡張を祝したテンションで書いてみました。
RDS PostgreSQLで参照専用のユーザを作成する（複数のスキーマがあっても一発で）

RDS PostgreSQLで参照専用のユーザを作成するための手順です。ドキュメント自体は "[AWS Document - Managing PostgreSQL users and roles - Read-only role](https://aws.amazon.com/blogs/database/managing-postgresql-users-and-roles/)" に丁寧に書かれていましたが、スキーマがたくさんある場合に大変だったのでそれを補った手順です。

# 環境
以下の環境で試しました。少し古いかもしれませんが基本的に上位互換です。

* RDS PostgreSQL v9.6.11
* psql v11.5

# 手順
psqlでDBへ接続します。この時、RDS作成時に指定した権限の強いユーザを利用しました。

```bash
$ psql -h hogehoge.fugafuga.ap-northeast-1.rds.amazonaws.com -U morihaya -d morihaya
```

以下のSQLクエリで参照ユーザを作成します。ポイントとしては

* ON DATABASE で指定するDBは各自のDBを指定する
* パスワードも各自のを指定
* `FOR sch IN SELECT nspname FROM pg_namespace WHERE nspname not like ...` は場合によってはエラーが出るスキーマもあるかもしれないため、適宜追加
* ここで作成しているのは readonly ロールと readonly_user です。詳細は上述したAWSさんのドキュメントが詳しくてわかりやすいです

```sql
CREATE ROLE readonly;
GRANT CONNECT ON DATABASE morihaya TO readonly;
DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace WHERE nspname not like 'pg_%' and nspname not like 'information_schema' and nspname not like 'hogehoge'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO readonly $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO readonly $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO readonly $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL sequences IN SCHEMA %I TO readonly $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON sequences TO readonly $$, sch);
    END LOOP;
END;
$do$;
CREATE USER readonly_user WITH PASSWORD 'hogehoge';
GRANT readonly TO readonly_user;
```

# 参考

* [AWS Document - Managing PostgreSQL users and roles - Read-only role](https://aws.amazon.com/blogs/database/managing-postgresql-users-and-roles/)
    * 上にも書きましたが、基本的にこのドキュメントの通りです
* [stack overflow - Give all the permissions to a user on a DB](https://stackoverflow.com/questions/22483555/give-all-the-permissions-to-a-user-on-a-db)
    * 上述のAWSの手順ではSchema単位で `GRANT USAGE ON ALL SEQUENCES IN SCHEMA myschema TO readwrite;` を行う必要があり、弊社の環境では少なくないスキーマが存在していて一括方法を探してたどり着いたのがこれ
docker-composeでMySQLのrootパスワードを忘れた場合

docker-composeでMySQLのrootパスワードを忘れた場合に自分が行った対処のメモです。

###権限なしでmysqlコンテナを起動する
パスワードをリセットするためには権限テーブルを非参照で起動する必要があります。下記のオプションをdocker-compose.ymlに追加。
**command: mysqld --skip-grant-tables --skip-networking**

```yml:docker-compose.yml

mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=${MYSQL_DATABASE}
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        - TZ=${WORKSPACE_TIMEZONE}
      command: mysqld --skip-grant-tables --skip-networking 
      volumes:
        - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
        - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${MYSQL_PORT}:3306"
      networks:
        - backend
```
コンテナを再起動し、変更を反映させます。

```
>docker-compose stop mysql
>docker-compose up -d mysql
```
###パスワード変更

```
mysqlコンテナに入る
>docker-compose exec mysql bash

パスワードなしでログインできるようになる
mysql> mysql -u root

ユーザ名、ホスト名を確認
mysql> use mysql;
mysql> SELECT user, host FROM user;

パスワードを変更
mysql> SET PASSWORD FOR ユーザ名@ホスト名 = 'パスワード';
```

最後に**command: mysqld --skip-grant-tables --skip-networking**をdocker-compose.ymlから削除し、再起動すれば完了。
ReflectionException  Class  does not exist 原因まとめ

# ReflectionException  Class  does not existが出現するときの原因

違う原因で何度か遭遇したのでまとめます。

1. `use`し忘れ -> ちゃんとuseする。
2. autoloaderが壊れる -> `composer dump-autoload`
3. sintax error -> 直す

3は、PHPのバージョンに寄ったりするようで、ローカルでは問題ないけど、
本番環境ではエラーが発生するという事象で少し厄介でした。
自分の場合は、ローカルがphp7.3、サーバーが7.2でしたので、
バージョンではなく、php.iniなどの設定でしょうか。調べてもわかりませんでした。

ちなみに、3の原因は、今の所全て`sprintf`関数で、
最後の引数の後にカンマを付けてしまっていたことでした。

# 参考
https://qiita.com/yoshinyan/items/5116bd30f2d1f2b1d865
https://qiita.com/K-Shuuun/items/c48292cd4186a2c1c8fd
【CSS】box-shadow

## box-shadow
:sunny: ボックスに影をつける

名前通りでなんておぼえやすい・・・:sweat_smile: 

```
box-shadow: 水平方向 垂直方向 色;
```

厳密に言えばどこを基準にするかで水平方向も垂直方向も変わってくるのでしょうが、現段階では

水平方向→横方向
垂直方向→縦方向

でいいかと思います:sweat_smile: 

```横にのみ影CSS.
  box-shadow: 10px 0px #dfdfdf;
```

影を横方向に 10px だけ出す設定です。
影の色はグレーです。
<img width="131" alt="スクリーンショット 2020-01-21 1.30.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/49320fb5-3b9c-3919-3eaa-ea0fde6f302d.png">

```縦にのみ影CSS.
  box-shadow: 0px 10px #dfdfdf;
```

<img width="114" alt="スクリーンショット 2020-01-21 1.31.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/ff24d240-ca6e-023f-0789-b2ae8cbbea86.png">

影を縦方向に 10px だけ出す設定です。
では組み合わせると・・・

```縦＋横に影CSS.
  box-shadow: 10px 10px #dfdfdf;
```

<img width="136" alt="スクリーンショット 2020-01-21 1.33.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/a259b986-6ecf-2efc-9728-357494b62b28.png">

影っぽくなりました:laughing:
Git for Windows + OpenSSH で Windows10 を Git サーバーにする

雑な備忘録
#やりたいこと
Windows10 を git サーバーにする。
そのために以下のことをする。

- OpenSSH で SSH サーバーを動かす
- パスワードログインを禁止し、SSH Key でログインする
- ssh の既定のシェルを bash にして git 操作を可能にする
- クライアントから ssh 経由で git 操作する

#OpenSSH の設定
この辺を読んでいいようにする。

- [OpenSSH による Windows の管理](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_overview) ←公式資料
- [Windows10でSSHサーバーを立ててデフォルトシェルをBashにする](https://qiita.com/kenji0x02/items/3f4e7262e6de0d8c8702) ←既定のシェルの設定
- [Windows10でOpenSSHサーバーを動かす](https://wave.hatenablog.com/entry/2019/02/23/080800) ←sshd_config など設定の詳細

#クライアントからの接続
事前に SSH Key を作成し、サーバーの authorized_keys に公開鍵を追加しておくこと

リモートリポジトリが `c:\repos\test.git` だとすると

```
git remote add origin ssh://<username>@<hostname or IP>/c/repos/test.git
```

でリモートリポジトリを設定する。
username は Windows のユーザー名を入れること。
無限小数を乗算して丸め誤差が起きた計算事例

# 概要

以下のような問題を解いていた。

```
1000m先に信号機がある。この信号は、15秒ごとに赤になり、また15秒後に緑に戻ることを繰り返す。
ある自動車がこのエリアにs km/hで突入し定速で走り続けたが、この信号を緑で通過したい。
0<= s <= 200とするとき、これを実現できる最大の速度を求めよ。ただし、sは整数とする。

尚、信号はこの地点に到達した瞬間に緑であれば通過できるし、赤であれば通過できないとする。
この信号はエリアに入った瞬間に緑になったものとする。
```

#　考え方
まず、ある信号機のある地点についた時間tが$ 0 \leqq t \lt 15$や$ 30 \leqq t \lt 45$, $ 60 \leqq t \lt 75$であれば通過でき、$ 15 \leqq t \lt 40$や$ 45 \leqq t \lt 60$であれば通過できない。つまり、tを15で除算した結果を切り下げたとき、偶数であればOK(通過), 奇数であればNG(通れない)となる。

次に、スピードは時速(km/h)であり、信号機の地点は(m)であるので単位を合わせる必要がある。
求めたいのは200km/h以下でこの信号機を通過できるかなので、200->1までforで回して通過できる条件を満たせばよい。これをシミュレートする。

```Python
d = 1000
for s in range(70, 0, -1): #70km/h -> 1km/hまでシミュレート
    # 信号までの距離[m] を 速度(秒速かつm単位)で割る
    if ( ( d // (s / 3600 * 1000)) ) % 15 == 0:
        print("[1]OK! s = {0}".format(s))
        break

# 上の式を変形したもの
for s in range(70, 0, -1):
    if ( ( d * 3600 / 1000) // s ) % 15 == 0:
        print("[2]OK! s = {0}".format(s))
        break

"""
[1]OK! s = 40
[2]OK! s = 60
"""
```

[1]と[2]は式を変形したもので、結果は同じ値でないとおかしいが、なぜか結果が異なる。

```math
\frac{d}{\frac{s}{3600} 1000} \Leftrightarrow \frac{d \frac{3600}{1000}}{s}
```

手で計算すると、例えばs=60のとき、

```math
\frac{1000}{\frac{60}{3600} 1000} = \frac{3600}{60} = 60
```
となり、$60 / 15 = 4$で偶数のため通過できるのが正しい。式をPython3で計算すると、

```Python
[1]>>> (1000 // (60 / 3600 * 1000))
59.0
[2]>>> (1000  * 3600 / 1000) // 60
60.0
```

となり結果が一致しない。なぜこうなるかというと、

```Python
[1]の式の一部
>>> 60/3600
0.016666666666666666
>>> 60/3600*1000
16.666666666666668
>>> a=60/3600*1000
>>> 1000 / a
59.99999999999999
```

というように、60/3600を1000で倍にして無限小数が丸められた結果、結果が60にならず、59.999となってしまったからである。
例えば

```Python
>>> 1000 / (60 / 3600) / 1000
60.0
```

のようにしても、正しく答えは得られる。

# まとめ
無限小数を乗算すると、まるめが出てしまうので注意しなければならない。
大場花菜と大谷映美里の分類をディープラーニングでやってみた(その２)

#前回の続き
会社の研修で画像認識で分類問題を解いたので自分の好きなアイドルで同じことをしてみようとしたのがきっかけ。
以下、前回の記事

[大場花菜と大谷映美里の分類をディープラーニングでやってみた](https://qiita.com/obr_bt/items/c7e65127be2f04360948 "大場花菜と大谷映美里の分類をディープラーニングでやってみた")

今回は前回の結果を踏まえ、精度向上と間違えてた画像がどのようなものだったのかを見ていこうと思います。

その前に分類対象となるお二方のご紹介

###大場花菜

私、おぼろの心の推しメン。アイドルグループ「=LOVE」のメンバーです。
**どがわええええええええええべほべほべろほろへゆろ、！！！！！ーー！！！**
<div align="center">
<img width="400" alt="EMUEVIBUcAAgFdI.jfif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569713/6967b589-484e-e6ed-48d5-b2f2fd3066ec.jpeg">
</div>

以下、Twitterのアカウント。是非フォローよろしくお願いします。
大場花菜(https://twitter.com/hana_oba)

###大谷映美里

同じくアイドルグループ「=LOVE」のメンバーです。
かわいいですね。

<div align="center">
<img width="400" alt="ELKvYJ_UYAEkYf3.jfif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569713/69c8fa2c-c751-5db7-1628-81db261dd204.jpeg">
</div>

大谷映美里(https://twitter.com/otani_emiri)

前回の精度が大体正答率90％くらいでした。

#精度向上のために試すこと① ~試行回数を増やす~

前回がエポック数200回ほどでした。

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569713/f7d5ae55-5020-bb3a-3fe1-cbd2511432ff.png)

これをみるとまだ上がりそう(試行回数が多すぎると一時的ではなく恒常的にグラフが下降していきます)

なのでもっと回数を増やしていきます。
200→1000回へ

無事に精度が向上しました。
800回を超えたあたりで長い間低い値を推移しており、これは過学習してしまっているのか？と思いましたが最後持ち直してくれましたね。

![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569713/9b678a31-daaf-e318-9689-ede522899ca5.png)

1000エポック目は正答率98.33％でした。
まぁ実際には研修の時に精度向上のためにいくらか試行錯誤をしているので回数を増やすだけで結構精度を出すことができました。
記事としてはもっと精度向上のためにもがき苦しむべきなんでしょうがこれで良しにしたい自分がいます。
・・・とりあえず今日は精度向上はここまでにしてこのモデルが何を間違えたのかを見ていきます。(早く推論がやりたい)

#何を間違えてしまったのか見てみる

以下で答え合わせして、間違えてしまったやつがどれなのか、見ていきます。

```idol.ipynb
ans = []
for i in range(0,x_test.shape[0]):
  x = np.array([x_test[i]])
  y = model.predict(x)
  ans.append(np.argmax(y))
  if(ans[i] != t_test[i]):
    print(i)
```

以下が結果

```
75
82
148
```

検証データ140件のうち誤答が3件=正解率が約98%なのであってそうですね！
これをつかって以下のように一度数値に落としたデータを画像に復元します。

```idol.ipynb
plt.imshow(x_test[75])
plt.imshow(x_test[82])
plt.imshow(x_test[148])
```

- 75
<div align="center">
<img width="400" alt="EB7uqiOUIAEgxwa.jfif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569713/2c631bad-641b-e96b-12f0-8c39453f0b04.jpeg">
</div>

- 82

カメコさんの画像だったので載せるのはやめておきます。
以下のツイートの1枚目です。(いいね！押しておいてください)
https://twitter.com/hana_oba/status/1119100534286217221?s=20

- 148

<div align="center">
<img width="400" alt="EJu0k1TU8AEaSsc.jfif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569713/930dde29-fa0d-0f7c-c21e-ac8129ac747a.jpeg">
</div>

うーん、、、普通に花菜ちゃんですね。
1枚目はみりにゃ率89%
2枚目はみりにゃ率58%
3枚目はみりにゃ率64%
で最終的にみりにゃという判断をしたみたいです。

まぁ、ディープラーニングはなぜそのような判断をしたのかを人間がわかるレベルで説明することはなかなかできないのでこれ以上推測することとかは何もないのですが。

では次回は違う方法で精度を高めていこうと思います。
PowerShellで、csvの情報を元に各種Excelファイルの特定セルの入力を行いたい

[前回](https://qiita.com/shikasen/items/b8504d33a80d76679cc7)の続きになります。
CSVにあるファイルパス、シート名、行列、及び値/数式の情報を、対象位置に記載して保存していくスクリプトです。

テスト仕様書とか設計書とかで表記揺れを修正するときに使ったりしていました。
表記なんて揺れてもいいじゃん、そういうのがやりたいんじゃないんだ。

```PowerShell:updateExcel.ps1
Param(
    $targetCsv ,
    [ValidateSet("Value2","Formula")]$updateTarget
)

if($targetCsv -eq $null) {
    '-targetCsv オプションを指定して、処理対象のCSVファイルを指定してください。'
    return
}

if($updateTarget -eq $null) {
    '-updateTarget オプションを指定して、CSVから書き換える項目を指定してください'
    return
}

if((Test-Path $targetCsv) -eq $false) {
    "$targetCsv ファイルが見つかりません。"
    return
}

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false

$csv = Import-Csv $targetCsv -Encoding Default

$csv | ForEach-Object {
    $fullName = $_.FullName
    $sheetName = $_.SheetName
    [int32]$Column = $_.Column
    [int32]$Row = $_.Row

    if($updateTarget -eq "Value2") {
        $targetText = $_.Value2
    } elseif($updateTarget -eq "Formula") {
        $targetText = $_.Formula
    }

    $fileOpen = $true

    try {
        $workBook = $excel.Workbooks.open($fullName)
    } catch {
        Write-Host "$fullName のオープンに失敗しました。このファイルに対する処理はスキップします。" -ForegroundColor Red
        $fileOpen = $false
    }

    $sheet = $workBook.sheets($sheetName)

    if($fileOpen -eq $true) {
        if($updateTarget -eq "Value2") {
            if($(($sheet.Cells($Row,$Column)).Value2) -ne $targetText) {
                ($sheet.Cells($Row,$Column)).Value2 = $targetText
                [void]$workBook.save()
            }
        } elseif($updateTarget -eq "Formula") {
            $sheet = $workBook.Sheets($sheetName)
            if($(($sheet.Cells($Row,$Column)).Formula) -ne $targetText) {
                ($sheet.Cells($Row,$Column)).Formula = $targetText
                [void]$workBook.save()
            }
        }
        [void]$workBook.close()
    }
}

$sheet = $null
$excel.quit()
```

targetCsvとして、[前回](https://qiita.com/shikasen/items/b8504d33a80d76679cc7)作成したCsvファイルを
加工したものを指定します。（検索を仕掛けて、セルの情報と値/数式を取得したのが前回のCsv）
不要な行は削除しても良いです。

updateTargetとして、Value2（値）か、Formula（数式）かを選択します。
数式の方はちょっと面倒で、エクセルでCsvを編集して保存すると自動で値に書き換えてくれちゃいますので、
テキストエディタで編集する感じになりますが、エクセルを経由しないと数式が正しいかの検証ができないので、
いろいろ神経質なやり方で編集する感じになります。
日本語に対応した文字起こしサービス Amazon Transcribe がすごいらしいので試してみた

# はじめに
下記の記事を読んだところ、日本語に対応した文字おこしサービス Amazon Transcribe がすごいらしいので試してみた。

Amazon Transcribe：破壊的な文字起こしのスピードと価格。 60分の音声だと150円で、20分もあれば完了。日本語にも対応。
https://note.com/sangmin/n/nf404e9945f48

[サービスページ](https://aws.amazon.com/jp/transcribe/)を見てみると
1. 複数話者の認識
2. カスタム語彙
3. 語彙フィルタリング
4. 文字起こしのストリーミング
5. 120分の音声ファイルで、約2.88USD（300円くらい）

なかなかすごい。既存のインストール型文字起こしソフト（AmiVoiceやドラゴンスピーチ）も真っ青だ。


# 試してみる
## 環境
- Chrome 79
- Windows 10 1909
- 音声ファイルは以下の動画の音声を抽出して使用させてもらった。
- [厚生文教委員会 R2.1.14 17:49-20:06](https://www.youtube.com/watch?v=txfrq0vdu38&t=3377s)

## 手順
おおまかな手順は以下
1. 文字起こししたい音声ファイルを、S3に保存
2. Transcribeでjobを作成し、音声ファイルを指定
3. job実行、テキスト出力

### 事前にS3に音声ファイルを保存し、保存したファイルパスをコピーしておく
![無題のプレゼンテーション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/2baeb9cb-a7ba-96ca-c657-25e7f44cccaf.jpeg)

### アクセス
[Amazon Transcribe](https://aws.amazon.com/jp/transcribe/)
![無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/710da02e-4454-184c-25d0-73389ab22cdf.png)

### 「Amazon Transcribe の使用を開始する」をクリック
![無題のプレゼンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/c36276ce-7cea-ddb5-4a13-e67bb7ceea88.png)

### 「Create job」をクリック
![無題のプレゼンテーション (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/28679fe0-58b5-2751-78b9-691793c80953.png)

### 「Name」に適当な<job名>、「Language」に<Japanese(Japan)>、「Input file location on S3」に<事前にS3に保存した音声ファイルパス>を入力、選択し「next」クリック
![無題のプレゼンテーション (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/eaac83c9-ad72-6ba8-63be-efc0c20a5309.png)

### optional画面が出るが特に設定せず、「Create」をクリック
![無題のプレゼンテーション (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/bb972a34-8d06-114a-b859-8dc3fed5046b.png)

### 「Transcription jobs」画面に戻り、「Status」が「In progress」に変更されていれば文字起こし実施中。「Status」が「Complete」になれば文字起こし完了。job名をクリック
![無題のプレゼンテーション (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/70dfb6b5-583a-a054-8189-9a6af9fd2514.png)

### 「Download full transcript」をクリックし文字起こしファイルをダウンロード
![無題のプレゼンテーション (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/0cb61d09-f6ad-06f0-9fab-7984766ff603.png)

### 文字起こしファイルはjsonでダウンロードされるため、適当なメモ帳などのテキスト編集ソフトで開く
![無題のプレゼンテーション (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/d7ffc062-d632-b3b8-7098-0f5777df57a8.png)


## 実際に使ってみて
- 2時間18分の音声ファイルを約20分で文字起こし完了した。
- S3に音声ファイルをアップロードする時間を合わせても30分以内で完了した。
- 変換精度はまあまあ、手動での修正が必須。
- 変換されたファイルには文字と文字の間に半角スペースが入っていてそのままでは使えない。
例）ガードレール 付き まし て は い て 一つ の 考え として は その いわゆる その 装甲 車両 も 含め た 走行 と それぞれ の 観客 エリア が はっきり 分かれ た 方 が いい って こと も あり ます ので


## 終わりに
思った以上に日本語の変換精度は高くなく、変換後に人による全文チェックは必須のレベル。
そのため現状ではAmivoiceなど既存の文字起こしソフトウェアに分があるように思える。
が、変換速度と価格は既存ソフトの価値を破壊するレベルであり、変換精度もこれから急に上がっていくと思われるとうかうかしていられない。
もう少しこなれてきた頃にもう一度試してみたい。
miomio.tv がWEB ゲームに！

http://www.miomio.tv

動画を見ようと飛んだら、ゲームが始まった。
webゲーム。

OperaとEdgeブラウザで開きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/490fb0fa-728c-c696-036a-c34dada2433d.png)

青いキャラで黄色いキャラをすべて取ればクリア。何面かあります。
すべてクリアまではやっていません。
pip3ベースでデータサイエンス環境を作るためのDockerfile

# やること
データサイエンス用のDockerコンテナといえばjupyter公式が配布している[scipy-notebook](https://hub.docker.com/r/jupyter/scipy-notebook)がありますが、Dockerfileを見るとcondaベースで書かれています。
しかし、宗教上の理由でcondaを使いたくありません。
そこで、今回はpip3ベースでデータサイエンス用の環境を作るためのDockerfileを書きます。

参考にした記事
[Dockerを使って機械学習の環境を作ろうとした話](https://qiita.com/penpenta/items/3b7a0f1e27bbab56a95f)

# 方針
・ python公式のDocker imageをベースにする
・ pip3を使う
・ 必要なモジュールのみを`requirements.txt`から読み込む
・ `google-cloud-bigquery`でBigQueryと繋ぎたいのでCloudSDKを入れる
・ jupyterlab+plotlyで可視化をしたいのでNode.jsを入れる

# 出来たもの

Dockerfile

```Dockerfile
# Pythonの3.8をベースにする
# 参考: https://qiita.com/penpenta/items/3b7a0f1e27bbab56a95f
FROM python:latest

USER root

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y sudo \
    && apt-get install -y lsb-release \ # google-cloud-sdkのインストール時に必要
    && pip3 install --upgrade pip

# 作業するディレクトリを変更, なくてもいい
# WORKDIR /home/{適当なユーザー名}

# 予め作成してDockerfileと同じフォルダにあるrequirements.txtをインストール
COPY requirements.txt ${PWD}
RUN pip3 install -r requirements.txt

# Cloud SDKをインストール
# https://cloud.google.com/sdk/docs/downloads-apt-get
RUN export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
    echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
    apt-get update -y && apt-get install google-cloud-sdk -y

# plotlyを使うため、Node.jsをインストール
# https://github.com/nodesource/distributions/blob/master/README.md
RUN curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - \
    && sudo apt-get install -y nodejs

# JupyterLabでplotlyをサポートする
ENV NODE_OPTIONS=--max-old-space-size=4096
RUN jupyter labextension install @jupyter-widgets/jupyterlab-manager@1.1 --no-build \
    && jupyter labextension install jupyterlab-plotly@1.4.0 --no-buil \
    && jupyter labextension install plotlywidget@1.4.0 --no-build \
    && jupyter lab build
ENV NODE_OPTIONS=
```

今回インストールするモジュール群を`requirements.txt`に書きます。
バージョン固定はお好みで

```requirements.txt
numpy
pandas
matplotlib
seaborn
scikit-learn
scrapy
jupyter
plotly
google-cloud-bigquery
jupyterlab
```

# 使い方

適当なフォルダの中に上記2ファイルを入れて、そのディレクトリに移動します。
後は以下のコマンドを順に実行すればOK

```bash
# Docker imageを作成
docker build --rm -t {Docker imageの名前} .
# Docker Containerを作成
# Dockerの中と外を繋ぐためにポートフォワーディング(-p)する
# Dockerコンテナを消してもファイルが消えないようにDocker外のフォルダをマウント(-v)する
docker run -itp {コンテナ外のport}:{コンテナ内のport} -v {コンテナ外のフォルダの絶対パス,末尾に"/"はつけない}:{コンテナ内でフォルダをマウントしたい場所の絶対パス+マウントするフォルダのDocker内での名称} --name {コンテナの名前} {作成元のimageの名前} /bin/bash
# jupyterの起動
jupyter lab --ip=0.0.0.0 --allow-root --port {コンテナ内のport}
```

# その他諸々

```bash
# cloud SDKの認証
gcloud init
# google-cloud-bigqueryのAPI認証
hogehoge
export GOOGLE_APPLICATION_CREDENTIALS={認証ファイルの絶対パス}
export GOOGLE_CLOUD_PROJECT={繋げるプロジェクト名}
```
Google OR-ToolsのVisual Studio 2019 Community版で始める

# C++サンプルプログラムをVisualStudio2019の新規プロジェクトで始める手順
[前回](https://qiita.com/kat5815/items/4bc26c3db9c24ed62a79)、Google OR-ToolsをVisual Studio 2019でソースコードからビルドしました。今回はその成果物であるortools.libを利用する手順を簡単にまとめます。

既に、OR-ToolsはPCにインストール済みであることを前提としています。

新規プロジェクト作成手順にフォーカスするため、サンプルコードは、[本家のサンプル](https://developers.google.com/optimization/introduction/cpp)を写経します。
これをprogram1.cppとして任意の場所に保存します。今回は、`C:/orsample` の下に置いたとします。

```
cd C:/orsample
 └── program1.cpp
```
# CMakeLists.txtを準備する
Visual Studio 2019のプロジェクトを作成するため、CMakeの `find_package()` を利用すると簡単です。
プロジェクト名を `prog` として以下の様な記述としました。CMakeLists.txtの細かい記述方法についてはここでは割愛します。

```
cmake_minimum_required(VERSION 3.8.2)
project(prog VERSION 1.0.0 LANGUAGES CXX)

include(CTest)
find_package(ortools CONFIG REQUIRED)

add_executable(${PROJECT_NAME} program1.cpp)
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_11)
set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION})
target_link_libraries(${PROJECT_NAME} PRIVATE ortools::ortools)
```
ここまでで以下の様な構成です。

```
cd C:/orsample
 ├── CMakeLists.txt
 └── program1.cpp
```

# プロジェクトファイルの生成
上記の作成したCMakeLists.txtを利用してVisualStudio2019のソリューションファイルを生成します。以下の手順です。開発用ですのでデバッグタイプの構成で生成させます。

```
mkdir build
cd build
cmake  -DCMAKE_BUILD_TYPE=Debug ..
```
私の環境では、上記コマンドで以下の様なメッセージがでました。これはgflags::gflags_staticが正しく設定できなかったようです。

```
CMake Error at CMakeLists.txt:7 (add_executable):
  Target "prog" links to target "gflags::gflags_static" but the target was
  not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?
```
デバックタイプのプロジェクト生成なので、gflags_static_debug.libのハズなので、先に進めて手動で手直しすることにします。
# slnファイルのビルド
上記の生成後、以下の様な構成です。

```
cd C:/orsample
 ├── CMakeLists.txt
 ├── program1.cpp
 └── build/
     ├─  ALL_BUILD.vcxproj.user
     ├─ ...
     ├─ prog.sln
     ├─ ...
     └── CMakeCache.txt
```
ここで、 `prog.sln` をVisual Studio 2019　で開きます。その後、CMakeでリンク設定できていない箇所を手動で修正します。ソリューションエクスプローラーから `prog` → `プロパティ` → `リンカー`→ `入力` を開き、 `[追加の依存ファイル]` を編集し `gflags::gflags_static` を削除して、以下のlibをリンクするように設定します。他の設定は生成したプロジェクトのままでビルドできました。`C:\tools\or-tools\build\dependencies\install\lib\`部分については、私のor-toolsをビルドしたパスに依存しています。各自環境に読み替えてください。

```
C:\tools\or-tools\build\dependencies\install\lib\gflags_static_debug.lib
shlwapi.lib
```

# テスト実行
VisualStudio2019の　`[デバッグ]` ⇒ `[デバッグの開始]` メニューからデバッグ実行もできました。コンソールに Objective value = 4やx=1,y=1の実行結果も表示されました。もちろんブレークポイントも正しく止まります。:frowning2:

![program1_output.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562620/41f54082-35a5-ff5c-4def-7f5a434fb800.png)


# おわりに
正しい手順かどうかは不明ですが、自分の環境でGoogle OR-Toolsを利用した新規プロジェクトの簡単な作成手順が確認できました。手修正が１ステップ残りましたが、おいおい、対応していくことにします。

# 参照元
- [OR-Tools サンプルコード](https://developers.google.com/optimization/introduction/cpp)
- [github](https://github.com/google/or-tools/blob/stable/cmake/README.md)

# 次回
次回はいよいよ制約プログラミングの第一歩に入りたいと思います。
Macでよく使う機能の覚書

## Prologue
開発をMacでするようになった時、コマンドやショートカットキーが分からず戸惑ったため、よく使う機能をメモしておきます。
こちらは都度新しいメモを追加したり、ブラッシュアップしていけるようにしますので、ご参考までに...

## 環境
- macOS: 10.15.2
- terminal: iTerm, Mac デフォルトのターミナル

---

## よく使う機能

### ショートカットキー

| ショートカットキー | 用途 |
| :--: | :--: |
| command + z | 一つ前に戻る |
| command + option + Z | 一つ先に進む |
| command + Ctr + Q | 画面Lock |
| command + Ctr + F | フルスクリーン |
| command + Shift + 4 | スクリーンショット |
| command + option + ^ | 拡大* |
| command + option + - | 縮小* |

\* ズーム機能は'システム環境設定\アクセシビリティ' から 'キーボードショートカットを使ってズーム'をONにする


### VSCodeで使うショートカットキー

| ショートカットキー | 用途 |
| :--: | :--: |
| option + shift + F  | テキスト整形 |
| command + option + V | Markdownに画像貼り付け |
| command + shift + '+' | 文字拡大 |
| command + '-' | 文字縮小 |

### 入力

| - | 入力方法 |
| :--: | :--: |
| `\` (バックスラッシュ) | option + `¥` |

### 環境変数を調べる

以下のコマンドを実行

```
printenv
```

### パスワード付きzipファイルの作成

1. 圧縮したいファイルを右クリックして圧縮
2. ターミナルを開く
3. 以下のコマンドを実行

```
zipcloak [zipファイル名]
```

[zipファイル名]は`cd`で対象のディレクトリまで移動してからzipファイル名を指定、コマンドを実行しても良いですが、zipファイルをドラッグ＆ドロップでターミナルにおくとpath名が取得できます。

4\. パスワードを入力 -> 確認パスワードを入力

参考: https://www.atmarkit.co.jp/ait/articles/1511/20/news027.html

---

## 基本一度設定すれば済むもの

###  マルチモニターの配置を変える

システム環境設定\ディスプレイ\配置

### 隠しファイルの表示

ターミナルで以下のコマンドを実行

``` 
defaults write com.apple.finder AppleShowAllFiles TRUE

killAll Finder
```

参考: https://pc-karuma.net/mac-finder-show-all-files/

## スクリーンショットの保存先

デフォルトではデスクトップのため、すぐ散らかります...そうならないようにするためhome下にフォルダを作ってそこに保存します。
※ home下にこだわらず任意のディレクトリでいいと思います。

ターミナルで以下のコマンドを実行
※　ここでは`screenshot`というフォルダに保存できるようにします

```bash
defaults write com.apple.screencapture location ~/screenshot
killAll Finder
```

## 日本語の変換フォントを変える

Appleマーク -> システム環境設定 -> キーボード -> 候補表示

## Dock の表示スタイルを変える

Appleマーク -> システム環境設定 -> Dock
Dock を非表示にしたり、アイコンの大きさやフォーカスした際の大きさなどを変えられます。

## Enter キー2回で確定を1回に変更する

Appleマーク -> システム環境設定 -> キーボード -> 入力ソース
Windows風のキー操作にチェックを入れる

## 数字入力を常に半角に固定する

Appleマーク -> システム環境設定 -> キーボード -> 入力ソース
数字を全角入力のチェックを外す

## サイドバーにホームフォルダを表示する

作業スペースのような役割のため、常に表示させておくと作業効率があがります。

Finder -> 環境設定 -> サイドバーの設定

ホームアイコン + user 名がホームフォルダーなのでチェックを入れると表示されるようになる。

 
## Epilogue

調べればすぐ出てくるものばかりですが、慣れて覚えるまで調べ続けるのも時間がもったいないので、今回このようにまとめました。
元々はwindowsユーザーだったのでそのショートカットキーに慣れていたのですが、OSが変わりそのまま使えるものも少ないことに気がつき、ちょっとストレスを感じていました。今後もキーの移動に左右されないコーディングライフを送りたいと思います！

機械等にあまり詳しくないため、もしOSやバージョン依存のもの等ありましたら教えてください。

### 追加履歴

- 2020/2/1  
  - ショートカットキー: 拡大、縮小  
  - VSCode ショートカットキーを追加
- 2020/3/23    
  - VSCode ショートカットキーを追加
- 2020/7/13   
  - フォントとDockの変更を追加
- 2020/7/18   
  - Enterキーの項目を追加