OmniAICreator/Qiita-1.07M huggingface dataset:
【無料アイコン素材】ゲーム・アプリ開発におすすめのアイコンダウンロードサイトまとめてみた。6つ

アプリ制作におすすめの、アイコン素材サイト【無料】をまとめてみました。

それぞれの短所・長所も追加でまとめて行きます。

↓最新更新版

https://kaedeee.com/app-famous-icon-download-site/

#Streamline

https://app.streamlinehq.com/icons
![スクリーンショット 2021-11-15 14.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/884c2559-1ba2-4702-4d4e-47c348a7af08.png)

**長所**
ライナーデザインから、マテリアルデザインまで。
一つのアイコンに対し、複数のデザインを選ぶことができる。

**短所**
無料版では、使えないデザインもある。

#ICOON MONO

https://icooon-mono.com
![スクリーンショット 2021-11-15 14.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/e42b8a15-a0f4-3147-5dad-e78f7ff4b1cf.png)

**長所**
全て無料。素材豊富。

**短所**
一昔前のデザイン感あり。

#FLAT ICON

http://flat-icon-design.com
![スクリーンショット 2021-11-15 14.17.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/ffc050cf-79a4-7938-0ec4-f18639132eba.png)

**長所**
全て無料。おしゃれ。

**短所**
数が少ない。例えばTwitterのアイコンや、AppStoreのアイコンがないなど。（GooglePlayのアイコンはあるのに）

#Google Fonts (Google Icons)
https://fonts.google.com/icons
![スクリーンショット 2021-11-15 14.20.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/65c6bc40-2344-b4cf-777a-67ba776c1f8b.png)

**長所**
Google純正のマテリアルデザインが使える。

**短所**
TwitterやFacebookのデザインがない。

#SF Symbols

https://developer.apple.com/sf-symbols/

![スクリーンショット 2021-11-15 14.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/bc1c1dc9-54b5-78ff-67ce-d16d6c9a7224.png)

**長所**
Apple純正のCupertinoデザインが使える。

**短所**
Mac用アプリのみ？

#Font Awesome

https://fontawesome.com/v5.15/icons?d=gallery&p=2

![スクリーンショット 2021-11-15 14.26.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/850aea95-2286-57a5-f512-5b996cd79d67.png)

**長所**
豊富すぎるアイコンの量。

**短所**
課金しないと、限られたアクティベーション。


#終わり
6つのおすすめアイコンダウンロードサイトをご紹介しました。
これらを使えば、すっげぇおしゃれになってる、はっきりわかんだね。

最新更新版↓

https://kaedeee.com/app-famous-icon-download-site/
2012.11.15現在 → Ubuntu 20.04.02 LTS にて ncs v1.6.1 から ncs v1.7.1 へ環境を移行する

v.1.6.1 環境から、最新の v1.7.1 環境へ移行しようとしたら エラーになった。

どうやら cmake のバージョンの要件が改定されたらしい。


https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/gs_recommended_versions.html#req-tools-table


最新環境での cmake は 3.20.0 以上が必要。
現在のテストバージョンでは、cmake は 3.20.05 以上が必要。

私が利用している Ubuntu 20.04.02 LTS の環境は、cmake version 3.16.3 だった。


```cmake --version```

にて 利用中の cmake のバージョンが確認できる。


https://cmake.org/download/

上記URLで最新リリース版を確認すると、3.21.4 だった。

端末から、

```
wget https://github.com/Kitware/CMake/releases/download/v3.21.4/cmake-3.21.4.tar.gz
```

ダウンロードしたら、展開

```
tar xvfz cmake-3.21.4.tar.gz
```

展開したディレクトリに移動して、

```
cd cmake-3.21.4
./configure
```

エラーがなければ、

```
sudo make install
```

~/.bashrc に 下記を追加
```export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH```


```
source ~/.bashrc
cmake --version
```

これで、3.21.4 が表示されれば完了。


以下の方法が 正当な方法のようだ。

Enter cmake --version to check which version of CMake you have installed. The nRF Connect SDK requires CMake version 3.20.0 or later.

If your CMake version is lower than required, check the backports for your distribution or install a current version of CMake manually.

For example, to install version 3.20.5 directly from the CMake website into the ~/cmake folder, enter the following commands:

```
mkdir -p ${HOME}/cmake && cd ${HOME}/cmake
wget https://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5-linux-x86_64.sh
yes | sh cmake-3.20.5-linux-x86_64.sh | cat
echo "export PATH=${PWD}/cmake-3.20.5-linux-x86_64/bin:${PATH}" | tee -a ${HOME}/.zephyrrc ${HOME}/.bashrc
cmake --version
```

# nRF9160 feather での変更点（ncs v1.6.1 → v.1.7.1）

ncs v1.7になって、ボードのフラグ名称が変更されていた。

```
変更前：CONFIG_BOARD_CIRCUITDOJO_FEATHER_NRF9160NS
変更後：CONFIG_BOARD_CIRCUITDOJO_FEATHER_NRF9160_NS
```

* * *

以上。

* * *
ROSのcv_cameraノードから画像メッセージが1つしか配信されない問題を解決

OS：Ubuntu18.04
ROSのバージョン：melodic
USBカメラ： UCAM-C0220FEBK 

https://www2.elecom.co.jp/multimedia/pc-camera/ucam-c0220fe/

#問題
cv_cameraというパッケージを下記のリンクからインストールし、カメラ画像を扱おうとしたものの、画像が１枚しか配信されていませんでした。

http://wiki.ros.org/cv_camera

![Screenshot from 2021-11-15 13-58-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286937/32a719ca-c53a-a4cc-9c8a-cb7fd6dd5707.png)

この写真にあるとおり、:white_check_mark:Status: OK とあるものの、そのすぐ下の:white_check_mark: Imageの欄では"1 images received"と書いてあります。つまり、/cv_camera/image_rawトピックが１つしか配信されていません。

#解決方法
以下のコマンドで解決しました。

```
rosparam set use_sim_time false
```

#原因
問題の原因はROSの時間形式が適切ではなかったことにありました。rostopic echo /cv_camera/image_raw というコマンドを打って確かめようとしたところ、下記のようなメッセージが帰ってきたことから判明しました。

>WARNING: no messages received and simulated time is active.
Is /clock being published?

自分自身がLeGO-LOAMで地図を作成するときに、rosbagではなく自分が所有するセンサから取り込んだデータを利用するときにuse_sim_timeの設定をfalseにしたりtrueにしたりしていたのでそのことを完全に忘れてしまっていました。

たまに上記のコマンドでうまく行かなかったりしたのですが、一度 true にしてから再度falseにしてあげると問題が解決されました。
猫でもわかる！🐈 [ 継承 ]

私は現在C++を絶賛勉強中なわけでありますが、継承って難しいですよね？
ネットでは知ってることを前提で書かれてたり、継承は簡単な方とかって書かれてますけど、そんなことはないです😰
**難しいです。
めっちゃ難しいです。😡**
そういった方々でも分かるような継承の説明を頑張ってみます！
自分も頭よわよわなので理解できているのかどうかすら分からないレベルなので、つよつよの人は間違っているところは是非ご指摘ください！
この説明で分からないところがあればそれも是非コメントください！

コードを書くと、難しく感じるかもしれないので、猫でも分かるシリーズははなるべくコードは使わずに解説しています！[^1]
最終的な目標は道端にいる野良猫に継承を教える事です！🙀


###継承って...?
継承ってオブジェクト指向プログラムしてるとよく聞きますよね！
でも、実際に何をするのか、どうすればできるのかよくわからないのが現実で、初心者には難しい記事ばかりです😢
Wikipediaによると、
``コンピュータプログラミングで用いられる概念であり、任意のオブジェクトの特性を、他のオブジェクトの特性の基礎にするためのメカニズムと定義されている。``
とのこと
つまるところ、何らかのオブジェクトの機能を他のオブジェクトに引き継げるよ～
といった感じ

そもそも継承っていう単語の意味が受け継ぐっていう意味だからこの辺はまぁ読んで字のごとくですね！

###じゃあ実際にどんな感じ？
今の説明だけ聞いても全然イメージわかないですよね
私だって字を見ればこれぐらいは分かります😑
オブジェクト指向って空間上に存在するすべてのオブジェクトに対してそれぞれプログラミングするもの(のはず)ですよね
結構現実世界に基づいているような気がします(なんかそういうこと言ってる人がいた気がする)
多分、継承の概要を説明するとめちゃくちゃ難しいので、極力分かりやすい例を挙げますね！

####例)猫と人と鳥の場合
猫と人と鳥がその空間にいるときに、それらを動かそうと思ったらそれぞれ別々のプログラムを書きますよね
C++だと、``cat.h``,``cat.cpp``,``human.h``,``human.cpp``,``bird.h``,``bird.cpp``という感じで、それぞれのヘッダファイルとソースファイルを用意するはずです。
ほかの言語でも、ファイルは分かれていないにせよ、それぞれ別々のクラスにしたりしますよね!(C++とC#以外のオブジェクト指向あんまり分からない...😱)

でも、この３つのオブジェクトって共通している処理っていくつかありますよね
例えば、体力(寿命)がある、食べ物を食べる、歩く、などです！
ここら辺の同じ処理をいちいち全部のファイルに書くのってコピペしたとしても面倒だし、何よりプログラマ的にはムズムズすると思います😟
forとかwhileを使う理由だって同じ処理を何回も書くのが面倒くさいからですよね
それと同じです！！

だから同じ処理を複数ファイルに書かない方法を考えたんですよね～
そこで、現実世界を見てみてください！
猫、人、鳥って現実世界だとあるまとまりに属しているのが分かると思います！

**そう！生き物なんですよ！！**

だから、「生き物」という生きているものに共通した機能を持つオブジェクト(クラス)をあらかじめ用意しておいて、その中にある機能をそのまま猫や人や鳥に引き継いじゃえ！って考えるに至ったんですよ！
これだけ聞いても、そんなことできるの？？って思う方がいるとは思いますが、こればかりはできるとしか言いようがないんですよ～🙇
そして、そのための機能こそが「**継承**」なんですね～

この継承を使って猫、人、鳥を実装すると、
猫は生き物クラスを継承して、猫クラスには、鳴く関数を実装して完成
人は生き物クラスを継承して、人クラスには、喋る、作る関数を実装して完成
鳥は生き物クラスを継承して、鳥クラスには、鳴く、飛ぶ関数を実装して完成
という感じで、重複しているところは継承するだけでいいんですね～
(鳴くはもっとスマートに実装できるはず)

本当はさらにこの猫クラスを使ってムギ、ソラ、レオ(猫の名前ランキング2021トップ3の名前)というオブジェクトを作ることができるのですが、これに関してはまた後程記事を書きます


###さいごに
継承についてできる限り分かりやすく説明したつもりですがどうでしたでしょうか？
私自身も継承完全に理解したわけじゃないので不備は少なからずありますが、できる限り自分と近いレベルの人にも伝わるような書き方をしてみました！
これからも猫でもわかるシリーズを書いていくつもりなので、ご期待ください！
コメント待ってます！！

[^1]: これはあくまで継承に関するイントロで、実用的な知識というよりは外のサイトで継承に関する記事を見たときに理解できるようにするための踏み台のような記事です。もちろんコードがあった方が分かりやすいという方も多く見えるでしょうし、そもそもコードを書いてなんぼのプログラミングでなにを甘いことを言ってるんだと思うかもしれませんが、ご理解ください。<(_ _)>
OpsRamp JOBの設定

# 概要

OpsRampのヘルプにはJOBについての説明が下記１ページしかないので、どのように使えば良いのか？そもそも何をするためのJOBなのか理解できませんでした。
※[Opsrampヘルプのリンク](https://docs.opsramp.com/solutions/remediation-automation/jobs-and-scripts/creating-jobs/)

| ![2021-1115-135307.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/e271bc02-acfc-9603-ed3b-d642b4b199d2.jpeg) |
| :-- |


別途Scriptを登録してスケジュール実行できるので、あまり利用シーンは無いのかもしれません。
設定できるJOBの一覧だけ記載しておきます。


# JOBの種類

公式ドキュメントにはJOBの説明がないので、設定項目から推測で記載しておきます。
ネットワーク機器のConfigバックアップは実際に動作する事を確認できてます。

| JOB名 | 説明 |
| :-- | :-- |
| AD CheckList | xx |
| Antivirus Update | TrendMicro、Symantec、McAfeeのパターンファイルを更新できるようです |
| Application Scan | インストールされたアプリの情報を取得できるようです |
| Asset Information | アセット情報が取得できるようです |
| Disk Defragmentation | ディスクのデフラグを実行するようです<br>（仮想マシンだと意味ないと思います） |
| EXBPA CheckList | xx |
| Missing Patches Request | Windowsのパッチ適用状況が確認できるようです |
| MSSQL Report | xx |
| Network Configuration Backup | ネットワーク機器のConfigバックアップができます |
| TempFiles Deletion | xx |



# JOBの作成

例としてTrendMicroのパターンファイルアップデートのJOBを作成する流れを確認します。

"Automation" > "Jobs"

| ![2021-1115-134405.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/8734bdf7-bf3b-0f8a-a982-2390b3c0ed10.jpeg) |
| :-- |


最初は何もJobが作成されていないので何も表示されていません。ここで"作成"をクリックします

| ![2021-1115-134430.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/74b562dc-7eff-45dc-35bc-3b591c9094d6.jpeg) |
| :-- |


この画面でJOBを選択して、スケジュールを登録します

| ![2021-1115-134518.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/2b50d7e1-7d94-c543-15e2-8ef16aaa1f29.jpeg) |
| :-- |


選択できるJOB一覧です

| ![2021-1115-134531.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/1ed725b5-c773-1911-276e-3e1c7ccf3684.jpeg) |
| :-- |


TrendMicroを選択した場合、レジストリパスやパターンファイルのキーを設定するようです。
※何をどう指定するのか分かりません。。

| ![2021-1115-134643.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/f6463a5a-ebc3-ccf9-08a1-83ead2ea3fc7.jpeg) |
| :-- |



※とりあえずスケジュール実行する場合はScriptを作成すれば良いかなと思いますね。


おわり。
tsconfig.jsonで「"baseUrl": "."」しているのに絶対パスにならない問題

ちょっと彷徨ったのでこちらでメモ
##したいこと
VSCodeでimportを絶対参照にしたい
##自分の状況
tsconfig.jsonには

~~~json

{
  "compilerOptions": {
    "baseUrl": ".",   
  }
}

~~~

と、書いてるのに絶対パスにならない


##原因＋こうしたら上手くいった
結論：VSCodeの設定をすると上手くいった
[@reriiasuさんの記事](https://qiita.com/reriiasu/items/c53d11aac6c46b5e919d)
上記記事のVSCodeの設定をすると上手くいった

自分の場合は

VSCodeの設定⇨設定の検索に「importModuleSpecifier」と打ち込み
自動 import の優先パス スタイルを`non-relative`選択すると反映されるようになった(tsconfig.jsonで設定しとく必要はある)
![スクリーンショット 2021-11-15 13.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246495/c8ccc697-806f-b343-038b-b13730814080.png)

##はっきりわかっていないこと
他にも絶対パスを調べている際に

~~~json
 "baseUrl": "./"
"baseUrl": "./src"
~~~
などもあり、違いがまだ理解できていない



参考にさせていただいた記事
- [Next.js で src からの相対パスで import できるようにする (tsconfig.json)](https://maku.blog/p/qgvamzc/)
- [TypeScript の baseUrl について調べた事](https://qiita.com/1v1ura/items/fc8b7d663e301e9228ba)
- [パスの書き方を覚えよう。絶対パス、相対パス、ルート相対パスの違い](https://original-game.com/how-to-write-a-path/)
Google オプティマイズ（Optimize）を使ってリリースされたA/Bテストが本番で出し分けられているか気になったので検証方法をメモした

## はじめに

Google オプティマイズとは、Googleが提供しているA/Bテストを行うための無料A/Bテストツールです。

詳細

https://marketingplatform.google.com/intl/ja/about/optimize/

タイトルにあるように、本番での検証ですが、プレビュー モードで確認すればOKじゃね？というのもその通りなんですが

https://support.google.com/optimize/answer/6280014?hl=ja

どんな仕組みなのか、本当に本番で出し分けコントロールできないのか？

気になったのでまとめてみました。

A/Bテストの実施は、おそらくGoogle Optimize の Cookieから情報を取得していると思うので

https://support.google.com/optimize/answer/6283420

Keyがわかって、ValueにパターンAとBの規則性がわかれば、本番で出し分けを検証できそうですね。

### パターンAとBの規則性はあるか？

https://datacisions.com/2017/10/09/google-optimize-in-gtm/

この記事を見て、実機で試したところ以下のような規則性でした。

Nameは `_gaexp`

Valueは以下のようなパターン

```
GAX1.2.~~~~.0 // オリジナル
GAX1.2.~~~~.1 // チャレンジャ
```

## 検証方法

CookieのValueをブラウザから書き換えれば確認できます。

![キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/4ad60b97-0e47-3ff0-a9e1-583213f9d8fe.png)

末尾の半角数字を変更して、リロードすればA/Bそれぞれが確認できます。

### 参考

- https://datacisions.com/2017/10/09/google-optimize-in-gtm/
- https://help.ptengine.jp/docs/googleoptimize/

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
重回帰分析の方法をフロチャートで表してみた

重回帰分析とは、多変量解析のうち複数の説明変数と一つの目的変数が量的なデータの場合に用いることができる解析手法です。
これまでの記事([R言語とExcelを用いた重回帰分析の方法1～6](https://qiita.com/yuki01221013/items/5fb62d673884b94e2a9f))で重回帰分析の方法を小分けにして書きました。
今回はもっとわかりやすく重回帰分析の方法をまとめるためにフローチャートを用います。

#重回帰分析の方法(フローチャート)
重回帰分析の方法をフロチャートで表すと下図のとおりです。
R言語とExcelを併用する場合の方法をRStudio側とExcel側に分けて書きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253181/13a95a81-7f84-3359-d2fe-cd96f058c059.png)

#あとがき
R言語とExcelを用いる場合の重回帰分析の方法をフローチャートで表しました。

この記事をお読みいただきありがとうございます。
GitとGitHubの使い方についてのメモ3（自分なりの解釈）～GitHubについて編～

前回はGitの使い方について学びました↓
https://qiita.com/Shunsuke2967/items/f32b62019390cdae4e2a

#GitHubについて

今までGitというバージョン管理システムについて学んできました

GitHubとは「Git」の「ハブ：拠点・中心・集まり」という意味で、Gitの仕組みを利用して、世界中の人々がプログラムのコードやデザインのデータなどを保存し、公開できるようにしたサービスです。

このサービスを利用することで個人で変更したファイルなどをチーム全体で共有できるようになります。

(GitHubは無料ではパブリックでしか利用できませんが、有料版だとプライベートで使うこともできます。)

#Gitのおさらい

これだけだとなんのことかわからないと思うので次の章でGitも交えながらもう少し具体的に説明します
#GitとGitHubの使い方についての流れ
ここでGitについて復習します
まずリポジトリを作りたいフォルダを新規で作成します。そしてそのディレクトリにコマンドプロンプトを開いて移動しますそして下記のコマンドでリポジトリを作成してください↓

```
git init
```

#GitHubの登録

これで自分のパソコンにリポジトリを作成できました。
前回の手順でファイルを作成したり編集したりしたあとに下記のコマンドを打って自分のローカルリポジトリに変更した内容をcommit(追加する)してください。

```
git add ファイル名

git commit -m'変更した内容'
```

一人で開発する場合はこれでもよいのですが、何人かで開発する場合は同じひとつのリポジトリを共有しないといけません。
そのときにチームで共有のリポジトリをGitHub上に作りそのリポジトリに変更内容を追加することで誰がいつなんのファイルにどんな変更をしたのかがわかるようになりバージョン管理をチームで共有できるようになります。イメージは下記のような図になります↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2244777/f29d9c88-aa83-5330-1db5-f09b699b95ea.png)

このGitHub上のリポジトリのことをリモートリポジトリ、自分のパソコン上にあるリポジトリのことをローカルリポジトリと言います。

作業した内容をローカルリポジトリにcommitさせ、そのローカルリポジトリの内容をリモートリポジトリに反映させる(push)というのが一通りの流れになります

ではさっそくGitHubを使ってみましょう。
GitHubを使うにはまず登録をしないといけません。
登録はまずGitHubのトップページにアクセスします↓
https://github.com/

緑色の「Sign up for GitHub」ボタンをクリックして次の画面でUsername（ユーザー名）やPassword（パスワード）を入力します。
これで登録完了です。

次にGitHubにログインした状態で「New Repository」ボタンをクリックします。

その後に表示される画面で、リポジトリ名を「Repository name」に入力していきます。

同ページにある「Description」には、このリポジトリの内容や情報を入力してください。

以上の操作が終わったら、リポジトリの種類が「Public（公開）」「Private（非公開）」の2つあるため、公開するのか非公開にするのか選択することができます。

READMEファイル（このリポジトリを他の人がみたときに分かりやすいような説明を書く部分）を作成しておきたい場合は、「Initialize this repository with a README」という個所にチェックを入れましょう。READMEファイルはあとから追加もできるので、保留にしておいても問題ありません。

最後に「Create repository」をクリックすることでリポジトリを作成することができます。

これでGitHubにリポジトリを作成することができました。この作成したリポジトリを今後はリモートリポジトリと呼んでいきます。

#ローカルリポジトリの内容をリモートリポジトリに反映させる

次は先ほど作成したリモートリポジトリに反映させていきます。下記のコマンドでリモートリポジトリとローカルリポジトリを結びつけます↓

```
$ git remote add origin https://github.com/あなたのユーザー名/リポジトリ名.git
```
これでoriginという名前でリモートリポジトリを結びつけることができました。

あとはリモートリポジトリに変更内容を追加します
このリモートリポジトリに追加する作業をpushといいます。それでは下記のコマンド打ってpushしましょう。↓

```
$ git push origin master
```

このコマンドのoriginは先ほど結びつけたときにつけたリモートリポジトリの名前(別名)です。masterはローカルリポジトリを作成した際にデフォルトでつけてくれる名前です。
これでエラーがでなければリモートリポジトリにローカルリポジトリの内容が反映されています。確認してみてください。

#終わり

これでローカルリポジトリをリモートリポジトリをにpush(反映)するところまでをやってみました。
これでリモートリポジトリとローカルリポジトリの役割と使い方についてまとめました。
次回はbranchについてまとめていきます。
paiza問題集　スキルチェック過去問題　Cランク野球の審判

初めてqiitaで何を書けばいいのかわからないので、paizaの演習問題を書いてみる。

要件
標準入力で　「ストライク」か「ボール」が入力される
ストライクが入力され、かつストライクが１、２の時は「strike!]
ボールが入力され、かつボールが１～３の時は「ball!」
ストライクが入力され、かつストライクが３つの時は「out!」
ボールが入力され、かつボールが４つの時は「four ball!」
ただし、バッターはバットを振らないこと前提

```php:yakiu.php
<?php
$num=trim(fgets(STDIN));
$strike=0;
$ball=0;

for($i=1;$i<=$num;$i++){
   $pitch=trim(fgets(STDIN));
   if($pitch==='strike'){
       $strike++;
       if($strike===3){
            echo 'out!'.PHP_EOL;
            break;
       }else{
            echo 'strike!'.PHP_EOL;
       }
   }
   if($pitch==='ball'){
       $ball++;
       if($ball===4){
            echo 'four ball!'.PHP_EOL;
            break;
       }else{
            echo 'ball!'.PHP_EOL;
       }
   }
}
?>
```
投球後の結果の処理を解説していくと

```php:yakiu.php
<?php
for($i=1;$i<=$num;$i++){
   $pitch=trim(fgets(STDIN)); //投球の結果を受け取る
   if($pitch==='strike'){
       $strike++; //ストライクなら$strikeが一つ増える
       if($strike===3){ //ストライクのカウントによって条件分岐
            echo 'out!'.PHP_EOL; 
            break;  //バッターが合うとなったので抜け出す
       }else{
            echo 'strike!'.PHP_EOL;
       }
   }
?>
```
![スクリーンショット (1620).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281946/f82af656-5036-d6b1-c2fa-7a697ff332e0.png)
やったぜ

<h2>おまけ</h2>
せっかくなのでファールも加えてきた

ファールの要件
ファールが入力され、かつストライクが０、１の時はストライクが一つ増える
ファールが入力され、かつストライクが２の時は変化なし

```php:yakiu.php
<?php
$num=trim(fgets(STDIN));
$strike=0;
$ball=0;

for($i=1;$i<=$num;$i++){
   $pitch=trim(fgets(STDIN));
   if($pitch==='strike'){
       $strike++;
       if($strike===3){
            echo 'out!'.PHP_EOL;
            break;
       }else{
            echo 'strike!'.PHP_EOL
       }
   }
//ここから追加
   if($pitch==='foul'){
       if($strike===2){
            echo 'foul!'.PHP_EOL;
       }else{
            echo 'foul!'.PHP_EOL;
            $strike++;
       }
   }
//ここまで
   if($pitch==='ball'){
       $ball++;
       if($ball===4){
            echo 'fourball!'.PHP_EOL;
            break;
       }else{
            echo 'ball!'.PHP_EOL;
       }
   }
}
?>
```

```text:入力値
8
ball
strike
foul
ball
foul
foul
ball
strike
```
```text:出力値
ball!
strike!
foul!
ball!
foul!
foul!
ball!
out!
```
GeoPandasをGoogle App Engine(GAE)上で動かすためには、libspatialindexを事前ビルドする必要がある

※ 2021年4月時点での検証内容であり、ライブラリ側の更新により解消済みの可能性があります。

## 概要
GeoPandasはGISデータを扱うために使用するライブラリです。本ライブラリはfiona, Rtree, shapelyなどのライブラリに依存しており、利用するにはこれらのライブラリのインストールも必要です。
このうちRtreeはlibspatialindexライブラリに依存しているのですが、C++で実装されたライブラリなのでPythonのパッケージマネージャとは別ににインストールする必要があります。

## 今回の問題: GAE上でlibspatialindexをインストールするには？
ローカル環境では、

- `conda-forge`(Windowsの場合)
- `brew install spatialindex`(Macの場合)
- `sudo apt install libspatialindex-dev`(Debian系Linux)

などでlibspatialindexをインストールすることができます。一方でGAE環境ではlibspatialindexを直接インストールできません。そのため、

- A: あらかじめlibspatialindexライブラリをDebian系Linux x64環境でビルドする
- B: Cloud Build時にlibspatialindexライブラリをビルドする

のどちらかでライブラリをビルドし、デプロイ時にコード内に組み込んでおく必要があります[^1]。本稿では、A.について記載します(当該ライブラリについてアップデートされる頻度がかなり少なく、Cloud Buildに対応する恩恵があまりないのでB.については割愛します)

## 手順: あらかじめlibspatialindexライブラリをDebian系Linux x64環境でビルドする

過去検証した限り、GAEにおけるOSはDebian系x64由来のものが使用されています。そのため、同環境に互換性のあるOS下でlibspatialindexライブラリをビルドし、GAEにデプロイするコードからロードするようにすれば同ライブラリを依存関係に含めることができます。

### 1. ビルド環境構築
まず、仮想マシンでx64版のUbuntuを準備しておきます。その後、ホスト側にてビルドに必要なcmakeをインストールします。

### 2. ビルド
libspatialindexをクローンし、INSTALLに記載の手順に従ってビルドします。ビルド後、`bin/`下にlibspatialindex*.soが生成されます(コード量は多くないので、数分でビルドされます)。

**コマンド**

```
$ git clone https://github.com/libspatialindex/libspatialindex
$ cd libspatialindex

$ cmake .
$ make
```

**生成物(bin/下)**

```
libspatialindex.6.1.1.so   
libspatialindex.6.so
libspatialindex.so
libspatialindex_c.6.1.1.so
libspatialindex_c.6.so
libspatialindex_c.so
```

### 3. libspatialindex*.soをGAEアプリに組み込む

前述のlibspatialindex*.soをGAEアプリのどこか(例えば、libs/libspatialindex/など)にコピーします。

GAEアプリについて、クラウド環境であれば明示的に同ライブラリを参照するようにします(ローカル環境は開発メンバーによって異なる可能性があるので、環境変数に参照を追加しません)。

```
if os.getenv('GAE_ENV', '').startswith('standard'):
    os.environ["SPATIALINDEX_C_LIBRARY"] = \
            "./libs/libspatialindex/libspatialindex.so"
```

また、最新のRtreeにおいてGAEにデプロイできない問題があったため、 バージョンを0.8.3に固定する必要があります(2020年1月頃の0.9.3時点。0.9.4以降で修正されている可能性があります)。

以上の手順により、GAE環境でGeoPandas(の特にsjoinなど)が利用可能になります。

[^1]: libspatialindexライブラリはMITライセンスで提供されているため、個別にビルドしたものをプログラム中に組み込むことはOKです。
【Rails】インデックスアクションのインスタンス変数が複数形である理由

##### はじめに
Rails 学習時にインスタンス変数に関して疑問点があったため、記載します。

##### indexアクションのインスタンス変数が複数形である理由について  
下記のindexアクションとshowアクションを見比べてみると分かるのですが、indexアクションのインスタンス変数は複数形@usersになっています。 
また、showアクションなど他のアクションのインスタンス変数は単数形@userで表現されています。

```rb:users_controller.rb
def index
  @users = User.all
end

def show
  @user = User.find(params[:id])
end
```
この理由は、indexアクション以外は、パラメータでidを取得しているため、Userデータの1つの配列として格納されているのに対し、indexアクションはビューで利用したい全てのUserデータを取得し、インスタンス変数に格納されます。
そのため、インスタンス変数に格納されている配列が単数か複数かによって、インスタンス変数の表記も単数形と複数形で使い分けているのです。
通信における多重暗号化は必要？

昨今ではweb通信でHTTPSを使うことが当たり前になっており、サービスや製品を作る際に当然の如く採用されています。
しかし、中間者攻撃を恐れるならHTTPSだけでは甘く、その通信内容も暗号化した方が良いのでは？　と考える人もいらっしゃるかもしれません。
暗号化されるデータを更に暗号化する。このような多重暗号化の必要性を調べてみました。

# デメリット
セキュリティレベルが上がるならいいことじゃないかと、諸手を上げて採用することはできません。
お察しの通り、大いなる力には大いなる責任が伴います(=トレードオフ)

#### オーバーヘッド
 当たり前ですが送信側で暗号化、受信側で復号を行うため処理時間がかかります。

#### 鍵管理
暗号化および復号には鍵が必要です。厳密には鍵が不要な暗号化手法もありますが、それ自体がセキュアなものではないので、ここではそれらは存在するものとカウントしません。
話を戻すと、共通鍵や公開鍵、秘密鍵を多重暗号化分作成、管理しなくてはなりません。鍵交換も同様です。

# 採用例
[GOLDBUG](http://goldbug.sourceforge.net/index.html)というプライベートチャットツールが多重暗号化を採用していると謳っています。
説明を読んでいて、頑張ってるな～と感心していたらサイトがHTTPSじゃなくてどないやねんと思いました。

他にも[SAMSUNG](https://www.samsung.com/us/business/solutions/industries/government/tactical-edition/)の軍事用スマホがありました。
傍受されたら命にかかわるため、これは納得です。ちなみにこれは音声の通信に関するものです。

また、採用した製品ではありませんが、最近の論文で通信のハイブリッド暗号化を扱ったものがありました。
https://iopscience.iop.org/article/10.1088/1742-6596/1769/1/012060/pdf

# 各種要件
やった方がいい多重暗号化ですが、果たしてやらなきゃいけないのでしょうか。
各種チェックリストを見ていきましょう。
#### 経済産業省
[セキュリティチェックシート](https://www.meti.go.jp/policy/it_policy/softseibi/model_tuiho/model_tuiho_security.pdf)ではWeb通信においてSSLなどを使用して暗号化していればレベル4(MAX)としています。

#### 一般社団法人 ソフトウェア協会
[ソフトウェア出荷判定セキュリティ基準チェックリストVer.1.2](https://www.saj.or.jp/NEWS/pr/201201_sec-release-decision.html)では通信のHTTPSが求められています。

#### PCI DSS
クレジットカード情報および取引を保護するための国際セキュリティ基準です。一言でいうと、これに準拠することでクレジットカード情報の扱いが許可されます。
こちらでは、「強力な暗号化」を使用することというガイダンスがあります。具体的に何とは明記されていませんが、業界標準のベストプラクティスを参照するように指示があります。
NIST(米国標準技術研究所)では使用する暗号化アルゴリズムにAESやTDEA、RSAなどが紹介されていますが、多重暗号化について言及しているものはありません。

# 結論
HTTPSで通信できているなら多重暗号化は必要としていないケースが多いようです。
その他の要求・要件によって決まってくるのでしょうね。
公的機関ではないので参考にするのは微妙ですが、アメリカのあるセキュリティベンダでも、HTTPS通信を採用しているのであれば多重暗号化は不要と[説明](https://help.zscaler.com/zpa/about-double-encryption)していました。

ただ、「送られてきたデータを暗号化してから保存する」などの場合は、初めから暗号化しておくのはアリかもしれません。
カラーの筈のデータが急に白黒になった時の対処法【OBGノウハウ】

先日ふとした瞬間に何かを触ってしまい、急に白黒画面が白黒？になってしまいました。
簡単な対処法の備忘録です。
![unnamed (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/d81c6543-1cb8-62d9-4ae4-d5e8d342779a.png)




<h2>そもそもどんな状態？</h2>
「アウトライン表示(またはアウトラインモード)」になっています。

通常イラレを立ち上げた際には「プレビュー表示」になっていますが、これがふとした瞬間の間違った操作で「アウトラインモード」に切り替わったことが原因です。

写真、文字(フォント)、オブジェクトが全て線表示されている状態で、データ自体はカラーの筈なのに、色がありません。
オブジェクトの線の太さを変えている場合は、その線の太さも表示されない状態になっています。


<h2>対処法</h2>
対処法はいくつかあります。
<h3>ショートカットキーを使用</h3>

+ Macであれば「Command(⌘) + Y」
+ Windowsであれば「Ctrl + Y」

これだけで治ります。
もしもこれで切り替わらない場合は、他の原因が考えられます。

<h3>レイヤーパネルから表示変更</h3>
①「ウィンドウ」から「レイヤー」を選択すると、レイヤーパネルが表示されます。
![スクリーンショット 2021-10-15 9.40.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/ba7bb8e8-6920-6938-7fb5-06d93b28dc01.png)



②レイヤーの表示を示す「目」のアイコンがこの状態になっていれば、「アウトライン表示」になっています。
キーボードの「 **Command(⌘) / Ctrl**」を押しながら、目のアイコンをクリックします。![スクリーンショット 2021-10-15 9.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/338c8d8a-2e2f-1084-adf0-112bcd295318.png)

これで表示が戻る筈です。


<h2>アウトライン表示の使い方</h2>
印刷データ納品前や、他の作業者にデータを渡す前に使うと、下記を確認できます。

<h3>①フォント(文字)はアウトライン化できているか</h3>
![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/4a883602-001a-0c48-cf8c-dbd35c004c7a.png)


<h3>②写真は埋め込みできているか</h3>
プレビュー表示
![unnamed (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/5d1a5235-d09b-0028-fd7b-55eb9d55b65e.png)

アウトライン表示
![unnamed (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/11306737-948f-e800-e469-1006c41a5ecf.png)


<h3>③削除した筈の不要なテキストエリアや、オブジェクトが残っていないか</h3>

プレビュー表示
![unnamed (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/569e1096-6a7d-2148-5a56-a894db1a6a51.png)

アウトライン表示
![unnamed (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/261db563-c734-80bd-fb8e-80669f76ff7a.png)


※プレビュー表示の時にも該当箇所を選択するとオブジェクトやフォントが隠れていることが確認できる。
![unnamed (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100978/159c868f-7af0-3409-c6ed-d845c1635114.png)


それでは！


**参考サイト：**[人力検索はてな | イラストレーターで作ったファイルを開くと、色が全く表示されず、白黒になっていました…](https://q.hatena.ne.jp/1213661806 "人力検索はてな")
MicroStrategyのアーキテクチャについての簡単な概要

#はじめに
はじめまして、株式会社ジールの@ntakahashi425です。
BIツールであるMicroStrategy（以下MSTR）使ったデータ分析の構築を業務としております。
その中で得たノウハウをQiitaを通して発信していきます。
今回はMSTRの全体的なアーキテクチャの概要について説明させて頂きます。

#１.MSTRについての説明
そもそもBIとは蓄積している膨大なデータを収集・蓄積・分析・加工し、可視化する事によって、意思決定を支援するツールです。
その中でもMSTRは、オブジェクトがレポートから独立している事を特徴としています。
オブジェクトとは、データの定義情報を保持し、オブジェクトの定義により、生成されるSQLに影響を与えます。
多くのBIでは、レポートごとにデータを定義する必要がありますが、MSTRの場合、オブジェクトをレポートから独立して作成するため、オブジェクトの再利用/共有が可能です。



##簡単な処理の流れ

あるユーザーがオブジェクトを作成し、分析レポートを表示する際の処理の流れを説明します。

下図がMSTRのアーキテクチャとなります。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2188350/e810cf61-27ca-9be0-2080-64063361d20a.png)



上図番号と処理の手順番号は一致しております。
①Warehouseのデータ定義を基に、Developerを使用してMSTRオブジェクトとして定義します。
定義したMSTRオブジェクトはMetadataに格納されます。
②Developerより、①で定義したMSTRオブジェクトを使って、レポートを定義します。
定義情報を基にIntelligence ServerはSQLを生成します。
③ブラウザより、作成したレポートを開くと、②で生成されたSQLが実行され、レポートが表示されます。

以下より、各用語の概要を解説します。

##Warehouseについて
Warehouseは、データベースの接続情報と、それに紐づいた各データベースのテーブル定義情報を保持しています。

##Metadataについて
オブジェクト定義が格納されるDBです。
標準ではMYSQLがバンドルされています。

##Intelligence Serverについて
Intelligence Serverとは、MSTRで行うほとんどの処理を管理するコアサーバーです。MSTRオブジェクトの定義に基づき、クエリ生成、レポート実行、ユーザーアクセス処理、OLAP分析を最適化します。

##Developerについて
MSTRオブジェクトを作成、編集、削除するための開発者用のツールです。


#２.オブジェクトとは
データベースのデータを定義したもので、定義情報はMetadataに格納されます。
オブジェクトでデータをどのように定義するかによって、生成されるSQLに影響を与えます。
下の図はオブジェクトの種類と階層を表したものです。
※一部、プロジェクトなど設定情報を保持するオブジェクトも存在します。

![MicrosoftTeams-image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2188350/e3f2e024-452e-0a4f-8db1-eca6f95866a9.png)



##スキーマオブジェクト
Warehouseから、テーブルの構造を論理的に定義したものです。
具体的には、売上や数量などの数値項目をファクトとして定義したり、
部署名や商品名などをアトリビュートとして定義します。
レポートを作成する上で、スキーマオブジェクトは最低限必要となるオブジェクトです。

##分析オブジェクト　
スキーマオブジェクトを基に作成され、分析のニーズを満たすための処理を追加するオブジェクトです。
具体的には、売上にSUM関数を加えた売上合計メトリック、売上から費用を差し引いた利益メトリック、
営業部のみや、利益が〇〇円以下といった条件に一致するデータを表示するフィルター、
レポート表示時に部署の一覧が表示され、ユーザーが任意の部署を選択する事で、動的なフィルターを適用するプロンプトなどが該当します。

##分析レポートデータセット
上記で作成したスキーマオブジェクト、分析オブジェクトを配置し、グリッドやグラフとして表示するオブジェクトが分析レポートデータセットです。

##ドキュメント、ドシエ
一つ以上の分析レポートデータセットを基に作成され、様々なデータをグラフィカルにまとめ、一目で理解できるようにするデータ可視化オブジェクトです。



#まとめ
今回はMSTRにおけるアーキテクチャの概要と、オブジェクトについて、説明しました。
今後もMSTRにまつわるナレッジを記事に上げていこうと思います。
MicroStrategyのプロジェクトデザイン概要

# はじめに
はじめまして。株式会社ジールの@Seiken-Saiです。
弊社はBI専業として、様々なBI製品の導入支援を行っております。
我々が業務を通じて得た様々なtipsを、Qiitaを通じて発信していけたらと思います。
今回は、BIの中でも私が特に携わることが多いMicroStrategy（以下MSTR）に関する記事を発信致します。

# 本記事において最低限押さえておくべきMSTRの特徴
MSTRの簡単な説明は下記のリンクをご参照下さい：
https://qiita.com/ntakahashi425/items/7405f8ba7d45d931c96d

プロジェクトデザインを行う上で最低限押さえておくべきMSTRの特徴は下記です。

### 1. BIレポートを作成する為のオブジェクト（部品）がレポートから独立している
MSTRでは、レポートから独立してオブジェクト（データソース、分析軸・数値項目やフィルタ等）を定義します。
オブジェクトは異なるレポートで共用することができます。
この特徴は、レポート毎にオブジェクトを定義する他のBI製品と大きく異なる点です。

### 2. オブジェクトが階層化されている
MSTRでは、各オブジェクトが階層化されています。
各オブジェクトの階層構造は下図の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166088/07f0e44b-6943-b7db-4abf-09c7b6b07f13.png)



本記事の対象は、赤枠の「スキーマオブジェクト」になります。

# MSTRにおけるプロジェクトデザイン
MSTRでは、前述2で記載している「スキーマオブジェクト」から設計・作成を行う必要があります。
スキーマオブジェクトの設計・作成で必要となる工程が「プロジェクトデザイン」です。
プロジェクトデザインは下記のステップで実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166088/6c3c7d3d-1631-c7f9-2366-8d63d59a4828.png)



### 1. 論理データモデルのデザイン
プロジェクトデザインのファーストステップは、論理データモデルのデザインです。
論理データモデルのデザインは、以下の手順で実施します。
① ユーザーがレポートへの表示を望んでいる情報を確認・整理する
② ①の結果を元に、ソースとなるデータを洗い出した上で①の情報と適切に関連付ける。

本手順で大事なポイントは、インプットとアウトプットを明確にすることです。


### 2. DWHスキーマのデザイン
論理データモデルの設計後、DWHスキーマのデザインを行います。
DWHスキーマのデザインでは、格納するデータの特徴と、レポート要件、パフォーマンス要件、保守要件等を総合的に考慮した上で最適なスキーマ構造を決定します。
代表的なスキーマ構造とその特徴は下表のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166088/f55cf078-2a28-f2b3-b799-ef193b02d272.png)

スキーマ構造が決まったら、その構造に則りテーブルを作成します。

### 3. MicroStrategy Architectでのプロジェクトの作成
DWHスキーマのデザイン・作成が完了後、MSTRのプロジェクト作成を行います。
プロジェクトは、MSTRにおけるオブジェクトをまとめる箱のようなものです。
※異なるプロジェクト間で、オブジェクトは共有することは出来ません。

プロジェクトの作成は、以下の手順で実施します。
①プロジェクトのメタデータを構成する（初期構築時に、チュートリアルに従い実施）
②DWHに対する接続を構成する（初期構築時に、チュートリアルに従い実施）
③これから作成するレポートや、それらを構成するスキーマオブジェクトを開発・管理していくためのプロジェクトを作成する

### 4. スキーマオブジェクトの作成
作成したプロジェクトの配下に、論理データモデルに基づいて必要なスキーマオブジェクトを作成し、これらをDWHの適切なテーブル・カラムにマッピングします。


# まとめ
今回は、MSTRの特徴と、プロジェクトデザインの概要について説明しました。
今後もMSTRに関する様々なナレッジを記事に上げていこうと思います。
地味に記録してて助かった話

## ０．初めに

この記事は、ポエムです。備えあれば患いなしみたいな話です。

私は、レンタルサーバーのロリポップの一番安いプランを利用しています。

ロリポップでは、PHPで個人用のログイン画面付きオンラインメモなどを置いて使っています。

* オンラインメモの画像

![frame_generic_light.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/9b0b28db-0275-af00-cab1-6467ed9e32a1.png)


##　１．起こったこと

先日、オンラインメモに、メモを追加するときに、誤って、オンラインメモのデータを削除（※１）してしまいました。

※１　正確には、空のデータで、ロリポップ側のメモデータを上書きした。

元々、20件ほどのメモがあり、このオンラインメモにしか書いていないこともあってあせりました。

ロリポップには、7世代のバックアップオプションがありますが、私はお金をケチって利用していませんでした。

## ２．思い出したこと

メモデータが消えて頭を抱えましたが、ぼやっと思い出したことがありました。

「たしか…Qiitaに何か書いてたな…」

自分のQiita記事を探すと、

[ロリポップ！からケチケチバックアップする話 - Qiita](https://qiita.com/basictomonokai/items/87a3820b885c1834f7e5)

すっかり忘れてましたが、GAS+PHPでちゃんとGoogle driveにバックアップしていました。

## ３．終わりに

Qiitaに記事残しといてよかった。

メモデータは、Google driveから無事復元できました。

バックアップは、大切だと実感しました。

以　上
PHPでforeachを使って配列を操作してみましょう！

#foreach
<br>
配列の要素を、foreachを使って１つ１つ取り出してみます。
<br>

```php:index.php
<?php
$scores = [
  '1番目' => 1,
  '2番目' => 2,
  '3番目' => 3,
];

foreach ($scores as $score) {
  echo $score . PHP_EOL;
}
```

<br>
以下をターミナルに入力します。
<br>

```
~$ php index.php
```

<br>
１つずつ出力されました。
<br>

```
~ $ php main.php
1
2
3
~ $ 
```

<br>
キーも一緒に取り出してみます。

$key => 追加します。
<br>

```php:index.php

<?php
$scores = [
  '1番目' => 1,
  '2番目' => 2,
  '3番目' => 3,
];

foreach ($scores as $key => $score) { 
  echo $key . ' は ' . $score . PHP_EOL;   //文字列で繋げて表示させます。
}
```

<br>
ターミナルで以下を実行します。
<br>

```
~$ php index.php
```

<br>
キーも出力されました ☆
<br>

```
~ $ php index.php
1番目 は 1
2番目 は 2
3番目 は 3
~ $ 
```
【SQL】サブクエリ, AS

#はじめに
今回はサブクエリとASを紹介したいと思います。

#サブクエリとは
サブクエリとは、SQLではクエリの中に他のクエリを書くことができ、この他のクエリのことを元のクエリに対してサブクエリと言います。
例えば、ある人の今月に使った支出の合計を基準にその人よりも支出の多い人を同じテーブルから見つけたいと言うときに、サブクエリを使わないとまずは基準になる人の支出合計を求めるクエリを書き、その結果をもとにテーブルからその支出金額より多い人を見つけるクエリを書く必要があるので、クエリを別々に二つ書かないといけません。しかし、サブクエリを使うと一つのクエリでこれらを求めることができます。

#サブクエリを使ってみる

以下のsampleテーブルからpriceの合計を求め、その合計よりもpriceが多い人のnameを一覧表示するクエリを考えてみます。

![ScreenShot 2021-11-15 12.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/86aff10c-3aba-0e24-5d52-3f346de8c0a2.png)

とりあえず、サブクエリを用いないバージョンで書いてみましょう。

```SQL
<平均priceを求めるクエリ>
SELECT AVG(price)
FROM sample;
-----------------
SELECT name
FROM sample
WHERE price > 上のクエリで求めた平均price;
```

このように、クエリを二つに分けて書く必要がありますよね。
しかし、以下のようにサブクエリを使うと一つのクエリにまとめることができます。

```SQL
SELECT name
FROM sample
WHERE price > (
  SELECT AVG(price)
  FROM sample
);
```

`()`で囲まれたクエリをサブクエリと言います。ちなみに、サブクエリの中に`;`は必要ありません。


#AS
ASを使うことで、カラムの名前を好きな文字列に変更できます。

```SQL
SELECT SUM(price) AS "金額の合計"
FROM sample;
```

![ScreenShot 2021-11-15 12.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/c9610d06-c700-dd2c-8451-90d403ed747b.png)



#おわりに
今回はサブクエリを使って二つのクエリをまとめる方法と、ASを使ってカラム名を任意のものに変更する方法法を紹介しました。
terraform show コマンドで plan 内容を自由自在に表示する

`terraform plan` コマンドはリソースの変更内容を、色付きで詳細に表示できますが、プロジェクトが大きくなると、リソース数が多くなりすぎ全体像を把握しにくくなります。

そんなとき便利なのが 1.0.1 から追加されていた `terraform show` コマンド。planファイルをJSON形式に変換します。一度JSONに変換してしまえば、お好みのプログラミング言語で整形できます。

たとえば、これは追加・削除・変更されるリソースの名前だけを一覧表示するRubyのスクリプト。

```ruby
# diff.rb
require 'json'

JSON.parse(STDIN.read)['resource_changes'].each do |c|
    a = c['change']['actions'][0]
    next if a == 'no-op'
    op = {
        'create' => '+',
        'delete' => '-',
        'update' => 'M'
    }[a]
    puts "#{op} #{c['address']}"
end
```

実行例

```ruby
$ terraform plan -out=plan

$ terraform show -json plan | ruby diff.rb
M aws_db_subnet_group.private
- aws_subnet.public[0]
- aws_subnet.public[1]
+ module.public.aws_subnet.this["1a"]
+ module.public.aws_subnet.this["1c"]
```
FormRequestのバリデーションルールを状況に応じて変えたい

Laravelで、入力フォームのバリデーション用に、FormRequestクラスを継承するEmployeeRequestクラスを作成しました。
EmployeeRequestクラスは、コントローラのstoreメソッド（追加処理）とupdateメソッド（更新処理）に DI して使います。

ですが、`store`と`update`では、バリデーションルールにちょっとだけ違いがありました。
ルールの違いをコントローラ側で意識したくありません。

```PHP:EmployeeController@store
/**
 * 追加処理（新規入力フォームの登録ボタンで呼び出される）
 */
public function store(EmployeeRequest $request) {
	Employee::create($request->all());
	return redirect()->route('employee');
}
```

```PHP:EmployeeController@update
/**
 * 更新処理（編集フォームの更新ボタンで呼び出される）
 */
public function update(EmployeeRequest $request, $id) {
	Employee::find($id)->update($request->all());
	return redirect()->route('employee');
}
```

このような場合、Laravelでどう書くのがセオリーなのでしょうか。自分はAfterフックの`withValidator`メソッドで対処しました。
`Route::currentRouteName`が現在のルート名を返すので、これを評価すれば、storeメソッド（追加処理）かどうか判断できます。

```PHP:EmployeeRequest.php
class EmployeeRequest extends FormRequest
{
	// 標準ルール
	public function rules() {
		return [
			'name'  => 'bail|required|string|max:191',
			// email はシステム内でuniqueとする
			'email' => ['required', 'email', 'max:191', Rule::unique('employees')->ignore($this->id)],
			// employee_id（従業員番号）はその会社内でuniqueとする 
			'employee_id' => ['required', 'string', 'max:30', Rule::unique('employees')->ignore($this->id)->where('company_id', Auth::user()->company_id)],
			// 以降、省略
			:
			:
		];
	}

	// 現在のルートが employee.store なら password をバリデーション
	public function withValidator(Validator $validator) {
		$validator->sometimes('password', 'required|string|between:8,20|confirmed', function() {
			return \Route::currentRouteName() == 'employee.store';
		});
	}
}
```

```PHP:web.php
Route::get('/employee/create', [EmployeeController::class, 'create'])->name('employee.create');
Route::post('/employee/store', [EmployeeController::class, 'store'])->name('employee.store');
```

モデルにバリデーションルールを定義し、FormRequestクラスで切り替えるとか、もっと素直で良いやり方があるかもしれません。
PHP配列のキーを指定してみましょう！

#配列
<br>
以下の配列を var_dump と print_r で表示してみます。
<br>


```php:index.php

<?php
$scores = [1, 2, 3];

var_dump($scores);
print_r($scores);
```
<br>
ターミナルに以下を実行します
<br>

```
~$ php index.php
```
<br>
var_dump は要素数と値の型を表示してくれて、

print_r は字下げして見やすくしてくれます。

<br>

```
~ $ php index.php
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
~ $ 
```

<br>
ではこの 0、 1、 2 のインデックス番号を好きなキーに置き換えてみましょう。

キーは数値や文字列に変える事が出来ます。

最初の配列に => を使ってキーを指定していきます。
<br>

```php:index.php
<?php
$scores = [
  '1番目' => 1,
  '2番目' => 2,
  '3番目' => 3
];

var_dump($scores);
print_r($scores);
```

<br>
同じく var_dump と print_r で見てみましょう。

ターミナルに以下を実行します。
<br>

```
~$ php index.php
```

<br>
キーを指定する事が出来ました！
<br>


```
~ $ php index.php
array(3) {
  ["1番目"]=>
  int(1)
  ["2番目"]=>
  int(2)
  ["3番目"]=>
  int(3)
}
Array
(
    [1番目] => 1
    [2番目] => 2
    [3番目] => 3
)
~ $ 
```

<br>
キーを使って値にアクセスしてみましょう。

echo $scores [ '2番目' ]  .  PHP_EOL ; を追加します。
<br>

```php:index.php
<?php
$scores = [
  '1番目' => 1,
  '2番目' => 2,
  '3番目' => 3
];

var_dump($scores);
print_r($scores);

echo $scores['2番目'] . PHP_EOL;    //$scoresの2番目を表示せよ
```

<br>
以下のターミナルを実行します。
<br>

```
~$ php index.php
```
<br>
$scoresの2番目が出力されました！
<br>

```
~ $ php index.php
array(3) {
  ["1番目"]=>
  int(1)
  ["2番目"]=>
  int(2)
  ["3番目"]=>
  int(3)
}
Array
(
    [1番目] => 1
    [2番目] => 2
    [3番目] => 3
)
2    
~ $ 
```
【MicrosoftEdge, IEモード】<open-in>要素の設定値ごとの動作

MicrosoftEdgeでIEモードを使用する際に記述するエンタープライズモードサイトリストの
\<open-in>要素について、設定値ごとの動作の違いをまとめました。

IEモードやエンタープライズモードサイトリストの詳しいことについては、こちらの記事をご参考ください。

* [新 Microsoft Edge で IEモード を利用する方法（IE は Edge の中に統合された）・・・IE11延長サポート終了日「2022/6/15」](https://qiita.com/kouji-kojima/items/ec6607297e870fe91fbb)

# \<open-in>要素とは

指定するURLをどのモードで開くか(Edge or IEモード)を定義する要素です。

# 設定値ごとの動作

設定可能な値と動作のまとめは以下の通りです。

|Mode|(1)画面を表示したときのモード|(2)ユーザーによるモードの切り替え|(3)他の画面から遷移したときに使われるモード|
|---|---|---|---|
|未設定(空)|Edge|できる|Edge|
|none|Edge|できる|遷移元がEdgeの場合はEdge<br/>IEモードの場合はIEモード(※)|
|MSEdge|Edge|できない<br>（Edge固定）|Edge|
|IE11|IEモード|できない<br>（IEモード固定）|IEモード|

※[Microsoftのドキュメント](https://docs.microsoft.com/ja-jp/internet-explorer/ie11-deploy-guide/enterprise-mode-schema-version-2-guidance)では「none または未指定。 従業員が選択したブラウザーで開きます。」と記載があり、どちらを設定しても同じ動作になるように見えますが、実際には「(3)他の画面から遷移したときに使われるモード」で、動作に違いが発生します。

## (1)画面を表示したときのモード

\<open-in>を指定した画面を表示した場合の挙動です。
ブックマークからの遷移やURLを直接したときなど、当該画面が最初の画面になる場合に限ります。
他の画面から遷移した場合は「(3)他の画面から遷移したときの挙動」となります。

## (2)ユーザーによるモードの切り替え

\<open-in>を指定した画面を表示した場合の当該画面の操作に関する挙動です。
MSEdgeおよびIE11を設定した場合は、それぞれのモードに固定され切り替えのメニューが選択不可になります。

下記のキャプチャのように指定したモード以外への変更が行えなくなります。

|MSEdgeを設定|IE11を指定|
|--|--|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518444/6b1ecce8-edb8-019e-d530-07cecc777212.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518444/0aaba0c3-19fb-7ba6-34da-c33cd54434aa.png)　|

## (3)他の画面から遷移したときに使われるモード

遷移元のモードにより使われるモードが異なります。「前の画面でIEモードを使っている場合は、**IEモードで表示したい**」というケースでは**none**に設定し、「前の画面でIEモードを使っていても、**Edgeで表示したい**」というケースでは**MSEdge**または**未設定**に設定する必要があります。
後者のケースで**MSEdge**と**未設定**どちらを設定するかですが、必ずEdgeで表示したい(ユーザーによるIEモードへの変更を許さない)場合は、**MSEdge**を設定する形になります。
本記事では特に触れておりませんが、EdgeとIE11モードでクッキー共有を行う場合、クッキーを発行する画面はEdgeで表示する必要があります。

以下の表は「設定値ごとの挙動」の表を、「遷移先モード」の観点で表し直したものになります。

|Mode|遷移元画面のモード|使われるモード|
|---|---|---|
|未設定(空)|Edge|Edge|
|〃|IEモード|**Edge**|
|none|Edge|Edge|
|〃|IEモード|**IEモード**|
|MSEdge|Edge|Edge|
|〃|IEモード|Edge|
|IE11|Edge|IEモード|
|〃|IEモード|IEモード|

# おまけ

* エンタープライズ モード スキーマとは
    * Microsoft Edge にて、IEモード(IE互換)を使用するための、「どこどこのサイトはIEモードで開く」というような設定を記載するスキーマ(XML)です。
    * https://docs.microsoft.com/ja-jp/internet-explorer/ie11-deploy-guide/enterprise-mode-schema-version-2-guidance
    * https://docs.microsoft.com/ja-jp/internet-explorer/ie11-deploy-guide/review-neutral-sites-with-site-list-manager
* SiteListのXMLがEdgeにどのように認識されているか確認したい
    * Edgeで以下のURLを表示する
        * edge://compat
EMについて

# はじめに

運良く機会があったので2年くらいエンジニアリングマネージャー(以下EM)をやってみた。今後の自分のためにメモを残す。
以下、ITサービスに関わるソフトウェアエンジニアをエンジニアと記す。
前提として、会社のビジネスがある程度うまくいき、チームが大きくなって組織課題が発生するとEMが必要になる。なのでEMを置いていること自体が素晴らしいことである。

# EMになった経緯

チームが大きくなってきて一人のEMで支えきれなくなってきたので、メンターや1on1などを徐々に引き受けるようになり、そのあと正式にEMに。

# EMの責務

マネージャーはmanageする人であり、manageという単語は「管理する・なんとかする」という意味らしい。EMはチームにオーナーシップを持って、チームのあらゆることを何とかする人、というのが私の理解である。あらゆることは例えば以下のようなこと。

- 全体: 会社の戦略を理解し、チームメンバーに伝え、協力する。採用活動など。
- チーム間: 他のチームと円滑にコミュニケーションできるようにする。
- チーム内: チームの健康を保ち、チームメンバーのキャリアの成功に貢献する。目標設定や評価も行う。

# リーダーシップスタイル

EMは一種のリーダーだが、どうやらひとくちにリーダーといってもいろいろあるらしいということを知った。例えば [10 Common Leadership Styles](https://www.indeed.com/career-advice/career-development/10-common-leadership-styles) のように典型的なものでも10種類くらいあるらしい。自分の理想はサーバント型かなと思い、「メンバーに気持ちよく働いてもらい最高の成果を出してもらう」ということを目標にした。
EMとの最初の1on1では、お互いが理想とするスタイルについて意見交換し、どのような支援を受けたいのかなどについてすり合わせるのが良いと思う。

# EMに求められるスキル全般

会社によって度合いが異なると思うが、技術面ではガイドラインやロードマップの整備、そのほかの面では採用能力やチーム間コミュニケーション能力が求められると思う。
人を管理するマネージャー(ピープルマネージャー)としては1on1やコーチング、フィードバックのスキルも必要になる。また、常に機嫌をよくしておくためにアンガーマネジメントも大切になる。
日々の業務では、そのような表出するスキルだけでなく、メタ認知スキルというか、構造化と言語化のスキルの必要性を感じた。何となくうまく対処できないとき、概念の適切な名前がわかると、問題を可視化したり次のアクションを考えやすくなったりするようなことがあった。

# ピープルマネージメント

人を管理するマネージャー(ピープルマネージャー)の考え方の土台としてはアンディ・グローブの「HIGH OUTPUT MANAGEMENT」をまず読んだ。実践方法としては「ヤフーの1on1」を参考にした。
マネージャー向けの研修でSLIIというフレームワークを学ぶ機会があってとてもよかった。メンバーの状況によって支援のスタイルを柔軟に変えるというもので、経験が浅いタスクならハンズオンでやるが、習熟しているタスクなら結果だけ聞く、のように、人ではなく課題単位で対処方法を変える。これは人のスキルや目標設定について考えるときにも役に立った。例えばシニアエンジニアは全てがシニアレベルとは限らなくて、技術には習熟しているがビジネスコミュニケーションが苦手だったりする。
コーチングの本も少し読んだり、プロからコーチングを受けたりもしてみた。いわゆる傾聴(active listening)というやつで、自分の感想や意見を言う前に、まずは質問して内容を理解し共感するように努めてみた。(おそらくうまくできてはいなかったとは思うが)

# 心構え

マネージャーになるとき、「高速道路を走っているとしたらマネージャーは大型バスだと思えばよい。同じことをしても目立つ」と言われて記憶に残った。
また、マネージャーはいつでも話しかけられやすい状態であるべきで、常に機嫌がいいことが望ましい。特に、他人に対する怒りはなるべく少ない方がいい。例えばハンロンの剃刀とか、自我を小さくして怒りポイントを極小化する、みたいなテクニックを教えてもらった。怒りを感じた時に、なぜ怒るんだっけ? 自分の機嫌が悪いから? 単なるミス? 価値観の違い? など原因を考えていくことで、行為に対して自分が怒ること自体は肯定した上で、自分の怒りポイントが解明されるほうが大事で他人に向けてもしょうがない、のような感じに消化するようにした。

# 目標設定・フィードバック

一般的には改善点のない人はいないらしいが、シニアなメンバーの目標設定は難しかった。その人が高いレベルで当たり前にできていることを他のメンバーができるようになるために共有してもらったりした。
また、大きなキャリアアップを望んでいない場合などもあり、そういう場合でもスキルアップには前向きだったりするので、「成長」よりはその人にとってのキャリアの成功が大切だと思うようにした。

# 参考にした記事など

- [マネージャーにはできないこと、マネージャーにしかできないこと](https://note.com/sasakill/n/n1e99085a5d58)
- [視座の可視化](https://note.com/kgmyshin/n/ndbed1f3496a1)
- [Engineering Managerの役割 - 組織と成果の視点から](https://note.com/yoichitgy/n/n7b9609ee7088)
- [エンジニアリングマネージャーになる前に知りたかった考え方](https://qiita.com/kyntk/items/f5731a68e6aed10e3639)
- [マネジメントをする立場の人が知っておくべきこと『すべての人類が成長を望んでいるわけではない』成長したくない理由や価値観の話](https://togetter.com/li/1466883)
VMware workstation playerでUbuntuのネットワークが切れる事象を解決する

VMware workstation playerで仮想マシンとしてUbuntuを使っていて、サスペンドとレジュームを繰り返ししてるといつの間にかネットワークが切れていることがある。

その度に仮想マシンを再起動とかして回復していたのだが、以下の対応をすることでネットワークが切れても再起動が必要なくなった。

/etc/network/interfaces
に以下2ラインを追加。

```
auto ens33
iface ens33 inet dhcp
```

その後Terminalから

```
$ sudo /etc/init.d/networking restart
```
SwiftでISO8601形式の期間の文字列表現を扱う

SwiftでISO8601形式の期間の文字列表現を扱います。

# ISO8601形式の期間
ISO8601では期間を示す形式の文字列が存在します。
https://ja.wikipedia.org/wiki/ISO_8601#期間

次のような文字列は、2021年10月1日12時から2021年12月31日15時の期間を示す文字列になります。
`2021-10-01T12:00:00+09:00/2021-12-31T15:00:00+09:00`

これを、Swiftで扱えるようにします。

# DateIntervalに変換する
FoundationにDateIntervalというクラスが含まれます。

https://developer.apple.com/documentation/foundation/dateinterval

これはstartからendまでの特定の期間を示すクラスです。
このクラスには`contains`などの便利なfunctionがあり、特定の日付が期間に含まれているかを簡単に調べることができます。
ですので、期間文字列をDateIntervalに変換することを最終的な形とします。

# DateIntervalFormatter

Foundationには同じくDateIntervalFormatterというクラスも含まれます。

https://developer.apple.com/documentation/foundation/dateintervalformatter

日付の処理するFormatterとしてDateFormatterがあるように、このDateIntervalFormatterを使えば簡単に期間文字列の処理ができそうな感じもしますが、残念ながらDateIntervalFormatterには、DateFormatterのような`date(from:String)`が用意されていません。
ですので、DateIntervalFormatterに対して文字列からDateIntervalに変換する機能を追加します。

## DateIntervalFormatterを継承して機能を追加する
DateIntervalFormatterにextensionを追加する方法もありますが、せっかくなのでDateIntervalFormatterを継承した `ISO8601DateIntervalFormatter`というクラスを作成しようと思います。
`getObjectValue(_:for:errorDescription:)`にも対応してSwiftUIのText等にも使えるようにしてみます。

```swift
class ISO8601DateIntervalFormatter: DateIntervalFormatter {
    var formatOptions: ISO8601DateFormatter.Options?
    
    func dateInterval(from string: String) -> DateInterval? {
        let split = string.split(separator: "/")
        guard split.count == 2 else { return nil }
        let dateFormatter = ISO8601DateFormatter()
        if let formatOptions = formatOptions {
            dateFormatter.formatOptions = formatOptions
        }
        guard let start = dateFormatter.date(from: .init(split[0])),
              let end = dateFormatter.date(from: .init(split[1])) else {
                  return nil
              }
        
        return DateInterval(start: start, end: end)
    }
    
    override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
        if let measurement = dateInterval(from: string)  {
            obj?.pointee = measurement as AnyObject
            return true
        } else {
            return false
        }
    }
}
```

## ISO8601DateIntervalFormatterを使う

内部的には文字列解析に`ISO8601DateFormatter`を使っているので、ISO8601DateFormatterの使い方と同様に`formatOptions `を設定して使う形になります。

```swift
let dateIntervalString = "2004-04-01/2005-07-01"
let formatOptions: ISO8601DateFormatter.Options = [
    .withYear,
    .withDashSeparatorInDate,
]
let formatter = ISO8601DateIntervalFormatter()
formatter.formatOptions = formatOptions

let dateInterval = formatter.dateInterval(from: dateIntervalString)
```
Google Apps Script（GAS）の始め方

# 目的

- Google　Apps Script（以降GAS）の始め方を記載する

# 概要

- 「実行ログ」に「Hello」と出力する簡単な処理を記載してみる

# 方法

1. GoogleアカウントでGoogleのサービスにログインする。
1. 下記の「ドライブ」をクリックする。

    ![新しいタブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c6a8352f-57eb-537b-e7be-45d1d2c0a217.png)

1. 「新規」をクリックする。

    ![マイドライブ_-_Google_ドライブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/557bb9bd-15bf-6ceb-d8cf-bf8d34c50420.png)

1. 「その他」→「Google Apps Script」をクリックする。![無題のプロジェクト_-_プロジェクト編集者_-_Apps_Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/df84a617-251e-2533-8f5a-921ba6533d69.png)


    ![マイドライブ_-_Google_ドライブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4177e20f-05da-62b6-39c7-6ccefed8e89e.png)

1. 下記のようなウインドウが開く。

    ![無題のプロジェクト_-_プロジェクト編集者_-_Apps_Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4822b416-df3b-ff3a-ef84-47dcd4aa3164.png)

1. エディター部分に下記の内容を記載する。

    ```
    function myFunction() {
        Logger.log('Hello');
    }
    ```

1. フロッピーマークをクリックして記載内容を保存する。

    ![無題のプロジェクト_-_プロジェクト編集者_-_Apps_Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ca1a5bf0-4881-a588-0046-c187a9f7aaf5.png)

1. 「実行」をクリックする。

    ![無題のプロジェクト_-_プロジェクト編集者_-_Apps_Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3176b694-740e-cc73-4432-62b9aa464fda.png)
    
1. 下記のように「実行ログ」に「Hello」の文字が出力される。

    ![無題のプロジェクト_-_プロジェクト編集者_-_Apps_Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/06c2c0de-9cb8-ebbd-45aa-052a9c94a580.png)
動画をgifに変換してSlackにサクッと貼り付ける shellscript のおすすめ設定

# 【Macでgif画像を一瞬で作れるようにする設定】
株式会社じげんの rorensu です。
インフラからフロントまで色々見ております。

ウェブサイトを開発する上でビジネスチームや営業さんと
動作をSlackやChatworkなどで共有したい場面が多いので、
その際は動画をgifに変換して共有してます。

動画を貼れるツールであれば不要かもしれませんが
動画は容量が大きい上に、貼れないことも多々あるため

gitに貼ったりSlackに貼ったりするgif画像を作成する
便利なコマンド(ffmpeg)とその設定の紹介です。

### 【この記事で紹介する変換設定はウェブの動作チェック用です】
サイト上の動作チェックや確認に必要な最低限の画質とFPSにしてます。
画質やFPSはオプションで調節可能です。

### 【この記事の設定で作成できるgif画像（590 KB）】
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/b2fa59d8-2976-b16b-8bdd-39f18f1d7817.gif)

## 【gifを作成する手順】
* `command Shift 5` で画面収録動画をDesktopに保存
* scriptでffmpegを使って動画をgif画像に変換する


## 【インストール方法】
まず動画をgifに変換できる`ffmpeg`をインストール。

```bash:インストール
brew install ffmpeg
```

以下のテキストをファイル名の拡張子を`.command`にして保存。
パスを通す（ホームディレクトリにおいても良い）

```bash:script.command
ffmpeg -y -i ~/Desktop/*.mov -r 15 -vf "scale=iw/2:-1" ~/Desktop/output.gif
rm ~/Desktop/*.mov
open ~/Desktop/
exit
```

Macの動画保存先をDesktopに設定する。
`Command + Shift + 5`を押して画面の動画収録先をDesktopにする。


※ 変換が終わると動画を削除して保存したディレクトリを開きます。

## 【使い方】
* `Command + Shift + 5`を押して画面収録動画を作成
* bashで`bash ./script.command`を実行
* 動画完成！最高！


## オプション解説（動画の画質設定など）
私の設定は極力画像の容量を抑えるために画質を下げてますが調節可能です。

-i 変換したい動画のパス
-y　出力同名ファイルを警告無しに上書き
-r フレームレート
-vf 動画のアスペクト比を保って縮小

```bash:script.command
ffmpeg -y -i ~/Desktop/*.mov -r 15 -vf "scale=iw/2:-1" ~/Desktop/output.gif
```

上記のコマンドでは以下のことをしています。

* ファイルの強制上書きをする
* デスクトップにある .mov拡張子のファイル 1つを選択
* フレームレートは 15fps
* 動画サイズを2/1に縮小
* 出力先はデスクトップに `output.gif` として保存


## ffmpeg公式サイトはこちら
https://ffmpeg.org/
【Tera Term】サーバーからローカルにファイルをダウンロードする方法

<strong>動作環境</strong>
ロカール → 踏み台サーバー → 本番サーバー
<strong>やりたいこと</strong>
本番サーバーからローカルにファイルをダウンロードする。

①本番サーバーから踏み台サーバーに送ってから、ダウンロード
~~②本番サーバから直接ダウンロード~~ 後日追加

<strong>①方法</strong>
踏み台サーバーで下記コマンド

```
$ scp <ホスト名(本番)>@<アドレス(本番)>:/<ディレクトリー(本番)>/testdb.tar.gz /<ディレクトリー(踏み台)>

例）
$ scp kura@10,120,20,XX:/home/kura/testdb.tar.gz /home/kura
```
####踏み台サーバーからファイルをダウンロードする（Tera Term）

踏み台サーバーにアクセスする。
ファイル → SSH SCP...
「From」にディレクトリーを入力
例）/home/kura/testdb.tar.gz
「To」ローカルで保存したいディレクトリーを選択
![Inked保存1_LI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371642/157b3dfc-2b02-18f5-0e49-04179a1b6aa3.png)
【ショートカット】 VSCodeを使いこなす

# はじめに
まず本記事の前提と対象を記載します。
前提 : VSCodeをインストール、起動している
対象 : VSCodeに慣れていない人、使えてはいるけど効率良く使えてないと感じる人

本記事は、上記のような人が<b>スムーズに開発を行えるようになること</b>を目的とします。


# 必ず覚えたいショートカット
VSCodeの便利なショートカットをいくつか紹介します。ショートカット一覧を以下にまとめます。
<font color = red>※Ctrl + K + S　でVSCode上でショートカット一覧を見ることができます！</font>
※画像は筆者が作成したものです

### ①編集系
編集系のショートカットを使いこなすことで、綺麗に素早くコーディングすることができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/0e7eb49b-5d6c-0364-65fb-b29e19b047d5.png)


### ②検索系
検索系のショートカットを使いこなすことで、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/b2ea3e46-f415-cc10-faef-ff67e5eeddcd.png)

### ③開く系
「ウィンドウを開いたり」、「ターミナルを開いたり」、普段なんとなくクリックして行っていることも、ショートカットを使うことでかなり作業効率が上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/38da1db3-0668-5ec7-aeb5-2ec64df83f2c.png)

### ④インデント系
インデントすることは、コードを構造的に捉えやすくします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/308c889f-6aee-7448-48d0-e5ca4554fffc.png)



# 拡張機能
こちらでは筆者おすすめの拡張機能を紹介します。
### vscode icon
フォルダ、ファイルにアイコンを付与します。エクスプローラー内が見やすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/7e775539-50ba-ceee-31dc-2b2c2c0d4997.png)

### Git History
gitログを見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/0973285b-287d-467f-ef61-d9e2beea1e92.png)

### Path Autocomplete
パスの入力を補完してくれます。タイプミスも防ぐことができ便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/dcc55544-73f3-8b4d-38d5-e48122901314.png)

### Partial Diff
選択したコードの比較を簡単に行えます。ほかのコードとの比較ができるため、同じように書いているのになぜか動かないなどの場合に、便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017201/9fd94893-92f8-097b-7deb-2e9e18917ca6.png)

# 参考

VSCode公式ドキュメント
https://code.visualstudio.com/docs

拡張機能リスト
https://rui-log.com/VSCode-extended-function/

1分でも早く仕事を終わらせるためにVSCodeにできること
https://qiita.com/EaE/items/4ca1b35396eba682a86f