OmniAICreator/Qiita-1.07M huggingface dataset:
メモ⑤-データベースへのDDL処理-

DDLとは
データベースや、テーブルそのものに処理を加える指示。
生成(=CREATE)・削除(=DROP)・変更(=ALTER)などがある。

～データベースへの処理
【CREATE】
「sample」というデータベースを新しく生成する。

書き方は以下の通り。↓
MariaDB [world]> create database sample;
Query OK, 1 row affected (0.003 sec)

確認すると…
MariaDB [world]> show databases;
+--------------------+
| Database           |
+--------------------+
| company            |
| information_schema |
| mysql              |
| performance_schema |
| sample             |←「sample」データベースが追加されている。
| test               |
| world              |
+--------------------+
7 rows in set (0.001 sec)

【DROP】
データベースを削除するコマンド。

上で生成したsampleデータベースを削除してみる。↓
MariaDB [world]> DROP DATABASE sample;
Query OK, 0 rows affected (0.002 sec)

確認すると…
MariaDB [world]> show databases;
+--------------------+
| Database           |
+--------------------+
| company            |
| information_schema |
| mysql              |
| performance_schema |
| test               |←「sample」データベースが消えている。
| world              |
+--------------------+
6 rows in set (0.001 sec)

・・・⑥へ続く
定時自動ツイートを ExcelファイルとPower Automateで作る


定期的に特定の内容＆画像付きでツイートってよく見ますよね。企業のツイートとかで。
そういう、決まった内容、決まった時刻/日付/曜日での自動ツイートをPower Automateでつくってみたので紹介します。

# 用意
データは、今回はOneDrive上のExcelファイルとしました。
Automateで取り扱うときにはテーブルを定義しておかないといけないので、注意してください。
すべて文字列で、列は3つ
- TweetHour : 今回は定時ツイートなので、時刻を入れています。24時間表示
- TweetBody : セル内改行でもOKです。ハッシュタグはツイートの時同様、#つきで。
- ImageLink : OneDrive上の画像ファイルのパスを入れます。画像付きでない場合にはブランクで。OneDriveのルートが/で、フォルダーを利用する場合には*/Folder/image.png*のようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/48e9c35a-7580-5fc2-7df3-f3444d24673f.png)

あとはOneDrive上に必要であれば画像を置いておくだけです。

# Flow
定時ツイートのステップは全部で7つです。

1. 現在時刻の取得と変換
2. データ取得
3. 対象データのフィルター
4. フィルター結果の行数判定
5. 画像添付有無を判定
6. 画像取得
7. ツイート実行

それぞれ見ていきます。
※トリガーはスケジュールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/513e1a35-ba94-93e8-d190-a83419409736.png)

## 1. 現在時刻の取得と変換
現在時刻の取得とフォーマットの変換ステップです。
TweetHourで今ツイートするものを抽出するために使います。このステップの詳細は
[松本さん](https://twitter.com/nori790822)のブログが詳しいので[こちら](https://zuvuyalink.net/nrjlog/archives/4695)をご覧ください。
今回は24時間表示が欲しいのでHHで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/dc32c5db-47d6-9f6d-749d-096ce1557782.png)

## 2. データ取得
データ取得と仰々しく書いていますが、Excelの特定のテーブルから、特にフィルターせず一括取得するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/b4b99329-de37-d172-98a0-a60137a27793.png)

## 3. 対象データのフィルター
取得結果のフィルターを行います。ここは動的コンテンツでサクサク進むかと思います。
比較するのは、ExcelのTweetHourの列と、時刻変換した結果(HH)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/6ebdd54f-10a0-1fd0-1009-f14ac3ef0356.png)
ここの結果は複数データになりうるので、配列が返ってきます。

## 4. フィルター結果の行数判定
条件分岐で、ツイート内容が設定されているか(データがあるか)を確認します。
Filterアクションで取得した結果のlength()をとることで、フィルター結果の行数が分かります。
0ならツイートしない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/5c65b270-bab6-a5c8-3bf3-08e08e785e7b.png)

## 5. 画像添付有無を判定
5以降の処理は4の判定でYESの時だけです。
Automateからのツイートでも画像の添付ができます。これを行うには対象のファイルのコンテンツ自身が必要です。
まずはコンテンツ取得アクションを実行するかの判定をしましょう。ImageLink列の値の文字列長が0かどうかで判定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/530799ce-6f0b-fe3a-0cee-6b066a90b0b0.png)

```
length(first(body('Filter_array'))?['ImageLink'])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/87305e4f-1dca-df27-e47e-860cb3ecf553.png)


## 6. 画像取得
OneDrive上のパスで画像コンテンツを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/f71310a5-550d-9260-98fc-fa1b8ebb7193.png)

```
first(body('Filter_array'))?['ImageLink']
```

## 7. ツイート実行
ここでやっとツイートです。
データはフィルターで取れました。画像がある場合のコンテンツも取得できています。
あとは2個目の条件分岐の外側 (=1個目の条件分岐のYes側)でツイートを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/a562d510-b953-29e3-bf0a-1fba42bfa59b.png)


# 完成！！
これで時刻に応じた定時ツイートが完成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/b206af18-088e-e9f5-1eea-07e93196dee7.png)

このような簡単なステップで、ほとんど数式も使わず、自動＆定時ツイートを構築できました。
ツイートする内容やコンテンツを変えるのも、Excelファイルなので簡単ですしね♪ぜひぜひお試しください！！
XAMPPのmysqlがError: MySQL shutdown unexpectedly.で立ち上がらなくなった時の対処方法

XAMPPのmysqlが以下のようなエラーを表示して動かなくなった。
ポートがコンフリクトしているように見えるので、利用ポートを変えてみたり、明示的にmysqlをシャットダウンしてみたり、ibdataとib_logfileを削除してから再起動を試みたがなおらず・・・

```
16:59:23  [mysql] 	Error: MySQL shutdown unexpectedly.
16:59:23  [mysql] 	This may be due to a blocked port, missing dependencies, 
16:59:23  [mysql] 	improper privileges, a crash, or a shutdown by another method.
16:59:23  [mysql] 	Press the Logs button to view error logs and check
16:59:23  [mysql] 	the Windows Event Viewer for more clues
16:59:23  [mysql] 	If you need more help, copy and post this
16:59:23  [mysql] 	entire log window on the forums
```

```
2020-02-25 16:59:22 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2020-02-25 16:59:22 0 [Note] InnoDB: Uses event mutexes
2020-02-25 16:59:22 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2020-02-25 16:59:22 0 [Note] InnoDB: Number of pools: 1
2020-02-25 16:59:22 0 [Note] InnoDB: Using SSE2 crc32 instructions
2020-02-25 16:59:22 0 [Note] InnoDB: Initializing buffer pool, total size = 16M, instances = 1, chunk size = 16M
2020-02-25 16:59:22 0 [Note] InnoDB: Completed initialization of buffer pool
2020-02-25 16:59:22 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2020-02-25 16:59:22 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2020-02-25 16:59:22 0 [Note] InnoDB: Setting file 'C:\xampp\mysql\data\ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2020-02-25 16:59:22 0 [Note] InnoDB: File 'C:\xampp\mysql\data\ibtmp1' size is now 12 MB.
2020-02-25 16:59:22 0 [Note] InnoDB: Waiting for purge to start
2020-02-25 16:59:22 0 [Note] InnoDB: 10.4.11 started; log sequence number 47082; transaction id 9
2020-02-25 16:59:22 0 [Note] InnoDB: Loading buffer pool(s) from C:\xampp\mysql\data\ib_buffer_pool
2020-02-25 16:59:22 0 [Note] Plugin 'FEEDBACK' is disabled.
2020-02-25 16:59:22 0 [Note] InnoDB: Buffer pool(s) load completed at 200225 16:59:22
2020-02-25 16:59:22 0 [Note] Server socket created on IP: '::'.
```

【対処方法：再インストールに次ぐ最終手段】
注意：自分が作ったデータベースのデータは消えるのでバックアップを取っておくなどしておいてください

xampp\mysql\backupフォルダにあるフォルダとファイルをCtrl+cですべてコピーし
そのデータをxampp\mysql\dataディレクトリに上書きでペースト（Ctrl+v）する。

再度XAMPPからMySQLをStartさせると動き始める（場合がある）。
golangのmongo-go-driverを使うとstructのtime.TimeにUTCで日付が入るのでlocal-timeにする方法


```go
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
opt := options.Client().ApplyURI("mongodb://localhost:27017")

// findでstructにtime.Time型が設定されている状態で、取得するとUTCで設定されるのでLocalTimeZoneになるようにした。
rb := bson.NewRegistryBuilder()
// v1.2.1より前
// rb.RegisterDecoder(reflect.TypeOf(time.Time{}), bsoncodec.NewTimeCodec(bsonoptions.TimeCodec().SetUseLocalTimeZone(true)))
// v1.3.0以降 メソッドが変更になっている。。。
rb.RegisterTypeDecoder(reflect.TypeOf(time.Time{}), bsoncodec.NewTimeCodec(bsonoptions.TimeCodec().SetUseLocalTimeZone(true)))
opt.SetRegistry(rb.Build())

client, _ := mongo.Connect(ctx, opt)
col := client.Database("hoge").Collection("fuga")

type fuga struct {
T1 time.Time          `bson:"t1"`
T2 primitive.DateTime `bson:"t2"`
}
now := time.Now()
col.DeleteMany(ctx, &map[string]interface{}{})
col.InsertOne(ctx, &map[string]interface{}{"t1": now, "t2": now})

result := &fuga{}

sr := col.FindOne(ctx, &map[string]interface{}{})
sr.Decode(result)

fmt.Println(result.T1)
fmt.Println(result.T2.Time())

// registryセット前
// 2020-02-28 05:50:26.759 +0000 UTC
// 2020-02-28 14:50:26.759 +0900 JST

// registryセット後
// 2020-02-28 14:52:51.103 +0900 JST
// 2020-02-28 14:52:51.103 +0900 JST

```

なお、mapにデコードすると、`primitive.DateTime` でデコードされるのでJSTになるっぽい。


### 所感

ドキュメントに無いから、実装を追ってみた。

コード追うの大変だったので、ぜひドキュメントに追記いただきたい。。。

あと、設定してすぐに、v1.3.0でメソッド名が変わったので、コンボ食らった気分だった。。。
cd のデフォルトディレクトリを変更する alias

# cd のデフォルトディレクトリ

単に `cd` と打ったときにホームディレクトリに移動する動作で行く先、変えたくないですか？
僕は変えたかったです。

# alias で解決
こうしました。

```bash
alias ccdd='alias cd="HOME=$(pwd) cd"'
```

これで `ccdd` すると `cd` で行く先が現在のディレクトリになります。
ccdd は change cd dir の略のつもりですがいい名前あったらください。

# 参考
[linux - Change cd default directory (bash) - Stack Overflow](https://stackoverflow.com/questions/24039048/change-cd-default-directory-bash)
リモートワークのために社内のWebサーバなどに接続する環境設定を用意した


**追記2020.3.27**
わざわざ Proxyサーバ起動する必要なかった

以下の記事にあるような、踏み台にダイナミックポートフォワードで接続することで、そのポートを経由してアクセスすることで、自前でProxyを立てるのと同様のことができた。

* [どこへ行っても安心！SSHサーバーを踏み台にしてWebアクセスする方法](https://linuxfan.info/ssh-dyamic-forward)

---

急遽、自宅から社内の各種事務手続き用のサーバ及び担当している案件で使っているクラウドサービス等にアクセスする必要に迫られたので環境を設定した。

![リモートワーク用設定(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8219/4e0ff0a4-4ff2-7b9c-e94e-7b03e9944b9e.png)


## ①ssh設定（踏み台経由の Office PC への接続）

以下のような ~/.ssh/config を用意

```
# 踏み台(a)
Host gate
  Hostname {踏み台のIPアドレス}

# Office PC (b)
Host officepc
  Hostname {Office PC のIPアドレス}
  ProxyCommand ssh -CW %h:%p gate  
  LocalForward 8888 {Office PC のIPアドレス}:8888
```

上記設定の後、Office PC (b) に ssh 接続

```terminal
$ ssh officepc
```

## ②Office PC で proxy サーバを起動

[docker コマンドだけで起動する proxy サーバ](https://qiita.com/snaka/items/c82a7883c733abc58e11) に書いたとおり、proxy サーバを起動する（※ Dockerホストのポート番号 `8888` は ssh の LocalForward の設定と合わせること）

```
$ docker run --rm -p 8888:3128 node npx proxy 
```

起動が完了すると以下のように表示される（下記以外は特にアクセスログ等は出てこない）

```
npx: installed 17 in 4.217s
HTTP(s) proxy server listening on port 3128
```

## ③OS/ブラウザのProxy設定

Windows 10 の場合、設定>ネットワークとインターネット>プロキシで「手動プロキシ セットアップ」で以下のようにアドレス／ポートを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8219/0426aaad-15a8-eae6-ae88-0c62ba80dce9.png)
RGB 画像と alpha(mask)画像から ImageMagic で RGBA 画像を作る

## 背景

glTF PBR など, alpha は RGBA で diffuse 画像として指定が必要.
RGB 画像と alpha 画像から, てっとりばやく RGBA 画像を作りたい.
(photoshop や gimp はどうもうまくいかない)

Transfer transparency from one image to another using imagemagick
https://superuser.com/questions/718755/transfer-transparency-from-one-image-to-another-using-imagemagick

```
$ convert pink.png black.png -compose CopyOpacity -composite PNG32:fixed.png
```

のような感じでいけました. 出力は PNG32(8bit RGBA) にする必要あります.
 

## TODO

* [ ] きちんとした RGBA 画像つくる(本来は sRGB -> linear にしてから rgb x alpha して premultiplied alpha 画像をつくる必要がある. imagemagic はその辺り対応しているか不明)
  * [ ] Python PIL or STB image あたりで C++ コード書くのがてっとりばやいか.
机器学习模式与人类思考模式

#全连接网络 VS 卷积网络

#全连接神经网络之所以不太适合图像识别任务，主要有以下几个方面的问题：

- 参数数量太多 考虑一个输入1000*1000像素的图片(一百万像素，现在已经不能算大图了)，输入层有1000*1000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多)，那么仅这一层就有(1000*1000+1)*100=1亿参数，这实在是太多了！我们看到图像只扩大一点，参数数量就会多很多，因此它的扩展性很差。
- 没有利用像素之间的位置信息 对于图像识别任务来说，每个像素和其周围像素的联系是比较紧密的，和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连，那么就相当于对于一个像素来说，把图像的所有像素都等同看待，这不符合前面的假设。当我们完成每个连接权重的学习之后，最终可能会发现，有大量的权重，它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重，这样的学习必将是非常低效的。
- 网络层数限制 我们知道网络层数越多其表达能力越强，但是通过梯度下降方法训练深度全连接神经网络很困难，因为全连接神经网络的梯度很难传递超过3层。因此，我们不可能得到一个很深的全连接神经网络，也就限制了它的能力。

#那么，卷积神经网络又是怎样解决这个问题的呢？主要有三个思路：

- 局部连接 这个是最容易想到的，每个神经元不再和上一层的所有神经元相连，而只和一小部分神经元相连。这样就减少了很多参数。
- 权值共享 一组连接可以共享同一个权重，而不是每个连接有一个不同的权重，这样又减少了很多参数。
- 下采样 可以使用Pooling来减少每层的样本数，进一步减少参数数量，同时还可以提升模型的鲁棒性。
对于图像识别任务来说，卷积神经网络通过尽可能保留重要的参数，去掉大量不重要的参数，来达到更好的学习效果。
ISSが見える時間を予測する

# はじめに

<a href="https://qiita.com/floatnflow/items/45ffcf3a4e011e574920">前回</a>、PyEphemの機能を見てて、ISSを目視できる日時を予測できるんじゃないかなぁとなんとなく思ったんだけど、でもISSが見える条件ってなんだろう。

物理的な位置関係とかでごちゃごちゃ悩んで、こりゃ思ったより難しいな。っていうか無理！！

って一瞬なったけど、いや、よく考えると、うーんもしかして・・・
次の3つの条件を満たせばいいんじゃなかろうか。

- 観測者から見たISSの仰角が正
- 観測者から見た太陽の仰角が負
- ISSが食じゃない

# 試してみる

```python
import ephem
import requests
import datetime
from math import degrees as deg

tle_url = 'https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/orbit/ISS/SVPOST.html'

loc = ('35.689922','139.692122',41) # 都庁
home = ephem.Observer()
home.lat = loc[0]
home.lon = loc[1]
home.elevation = loc[2]
sun = ephem.Sun()

doc = requests.get(tle_url).text
lines = doc.split('\n')
for idx in range(len(lines)):
    if lines[idx].strip() == 'TWO LINE MEAN ELEMENT SET':
        iss = ephem.readtle(lines[idx+2], lines[idx+3], lines[idx+4])
        break

utcnow = datetime.datetime.utcnow().replace(second=0,microsecond=0)
utcnow += datetime.timedelta(days=0) # 確認用
for after in range(0, 60*24*10, 1): # 予測期間(m),予測間隔(m)
    when = utcnow + datetime.timedelta(minutes=after)
    home.date = when
    sun.compute(home)
    alt_sun = deg(sun.alt)
    iss.compute(home)
    alt_iss = deg(iss.alt)
    az_iss = deg(iss.az)
    iss.compute(when)
    ecl = iss.eclipsed
    if alt_sun <= -4 and alt_iss >= 10 and not(ecl):
        jst = when+datetime.timedelta(hours=9)
        print('%s - %.2f %.2f' % (jst, alt_iss, az_iss))
```

直近10日間を予測してみると、

```
2020-03-07 05:38:00 - 11.98 9.07
2020-03-07 05:39:00 - 12.73 27.92
2020-03-07 05:40:00 - 11.22 46.14
2020-03-09 05:38:00 - 12.83 338.71
2020-03-09 05:39:00 - 19.49 353.95
2020-03-09 05:40:00 - 25.41 19.47
2020-03-09 05:41:00 - 24.90 51.33
```

- 3月7日5時38分から3分間程度 (北から北東へ最大12.73度)
- 3月9日5時38分から4分程度 (北北西から北東へ最大25.41度)

と予測した。

# 答え合わせ(ズル)

以下の予報サイトで確認してみる。

https://spotthestation.nasa.gov/sightings/view.cfm?country=Japan&region=None&city=Fuchu#.XlcICsvng2x

位置やTLE最新化サボりの誤差を考慮すると、ほぼほぼ正解と言って良さそう。(ISSの仰角を10、太陽の仰角を-4としたのはNASAの予測に合わせてチューニングした。たぶんそんくらいじゃないと低いか明るいかで見えないんだろう。)

# 答え合わせ(真)

基本的にISSが見える時刻ってのは夜明け前か日没後の30分～1時間前後くらいが多い。
ここはせっかくなので朝5時くらいの予測のときに、めっちゃ早起きするのがおすすめ。

暗い中一人でこっそり起きて、寝ぼけまなこをこすりながら(ほんとに見えるのかなぁ)と思いながら空を眺めてると、予測通りの方角、高さで光点が見えたときの感動は久しく忘れていたレベルのもの。

これ、対象が具体的だし、ちょっと論理的な考察が求められるし、ソースコード量的に簡単だし、感動できるしで、子どものプログラミングの教材に最適なんじゃないかなぁ。

# 追記
ISSのTLEを提供してくれていた spaceflight.nasa.gov が2021年2月に廃止されてしまった。ので、 https://celestrak.com/NORAD/elements/stations.txt から取得&フォーマットも若干違うので修正が必要。
僕のCURSOR(SQL)

自分用の備忘録

##どんな時に使用する？
1行ずつループさせるような処理をしたい時

##書き方

```SQL
--SELECT文から取り出した結果を格納するための変数を準備

DECLARE @[variable1] [data_type],
        @[variable2] [data_type],...
--以下では変数を順に書いていくときはまとめて[variable_list]と書きます。

--カーソルを定義
--[CURSOR_SENTENCE]には処理対象の結果セットをえるためのSELECT文
DECLARE [cursor_name] CURSOR FOR [select_sentence]

--カーソルを開く
OPEN [cursor_name]

--SELECTで取り出した内容を[variable_list]に代入
--※selectした要素数=[variable_list]の要素数
FETCH NEXT FROM [cursor_name] INTO [variable_list]

--WHILEのとこの条件は色々
--今回の場合は「最終行までの間」
WHILE @@FETCH_STATUS = 0

--BEGINから下の~は処理を書く
BEGIN
~
--これは決り文句
FETCH NEXT FROM [cursor_name] INTO [variable_list]
END


--カーソルを閉じる
CLOSE [cursor_name]

--カーソルを開放
DEALLOCATE [cursor_name]


```
メモ④-カラム名の変更とテーブルが異なるカラム同士の結合-

MariaDBでは、表の項目名を自由に設定し表示することができる。

【カラム名を変更しての表示】
例えば、以下のような表示。
MariaDB [company]> SELECT
    ->     emp.code AS emp_code,
    ->     emp.name AS emp_name,
    ->     post.code AS post_code,
    ->     post.name AS post_name
    -> FROM
    ->     tbl_employee AS emp
    ->     LEFT OUTER JOIN tbl_post AS post
    ->       ON emp.post_code = post.code
    -> ORDER BY
    ->     emp.code
    -> ;
+----------+----------+-----------+-----------+
| emp_code | emp_name | post_code | post_name |
+----------+----------+-----------+-----------+
|      101 | 伊藤英樹 |         1 | 部長      |
|      102 | 山本大樹 |         3 | 課長      |
|      103 | 中村千佳 |         4 | 係長      |
|      104 | 小林谷雄 |      NULL | NULL      |
|      105 | 斎藤美緒 |      NULL | NULL      |
+----------+----------+-----------+-----------+
5 rows in set (0.000 sec)


このように書き換えることで、
カラム名を変更して表示することができる。

MariaDB [company]> SELECT
    ->     emp.code AS "社員コード",
    ->     emp.name AS "社員名",
    ->     post.code AS "役職コード",
    ->     post.name AS "役職名"
    -> FROM
    ->     tbl_employee AS emp
    ->     LEFT OUTER JOIN tbl_post AS post
    ->       ON emp.post_code = post.code
    -> ORDER BY
    ->     emp.code
    -> ;
+------------+----------+------------+--------+
| 社員コード | 社員名   | 役職コード | 役職名 |
+------------+----------+------------+--------+
|        101 | 伊藤英樹 |          1 | 部長   |
|        102 | 山本大樹 |          3 | 課長   |
|        103 | 中村千佳 |          4 | 係長   |
|        104 | 小林谷雄 |       NULL | NULL   |
|        105 | 斎藤美緒 |       NULL | NULL   |
+------------+----------+------------+--------+
5 rows in set (0.002 sec)


【テーブルが異なるカラム同士を結合して表示する】
worldデータベースに接続。
countryとcountrylanguageを結合し、英語圏の国の国名と言語名を一覧で表示されるようにする

MariaDB [world]> SELECT
    ->     Name AS "国名",
    ->     Language AS "言語名"
    -> FROM
    ->     country,countrylanguage
    -> WHERE
    ->     (Language = "English")
    ->     AND
    ->     (Code = CountryCode)
    -> ORDER BY
    ->     Code;

・・・⑤に続く
VSCodeでNumpyのインテリセンス（入力補完）が不完全で解決まで軽くハマった話

#問題
MacでDockerコンテナを利用して深層学習のための環境を作ったが、
NumPyの入力補完（以下、IntelliSense）が不完全で、ちょっと不便。

`〜解決前〜`
![解決前](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499855/5f8dab25-a0f4-5cc8-f505-255b6010967d.png)
`〜解決後〜`
![解決後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499855/9b7d4e0f-b210-ba88-164e-49adc089e01a.png)

#環境
* VSCode 1.42.1
* MacOS Catalina 10.15.3
* VSCodeの拡張機能に`ms-python.python`は導入済み  
（これさえ入れればpythonのIntelliSenseは問題なく動作する）
* Python3.6.9 64bit
* Numpy 1.18.1  
その他の環境は本記事のテーマにあまり関係ないので割愛。

#結論
ディレクトリ`.vscode`にある`setting.json`に設定を追加すれば良い。

#手順
##NumPyなどのパッケージがどこの場所にあるかを確認する

```python
import numpy as np

print(np.__file__)
# 出力結果
# /usr/local/lib/python3.6/dist-packages/numpy/__init__.py

```
私の環境では以上のディレクトリだったので、このパスを確認して次の手順へ移ります。
##setting.jsonに設定を追加する
```json:setting.json
{
    "python.autoComplete.extraPaths": [
        "/usr/local/lib/python3.6/dist-packages"
    ],
}
```
今回はNumPyの話に絞っているが、これ以外のライブラリも同様のことが言える。
よく見たらちゃんとVSCodeの公式でも説明されている。

[カスタムパッケージの場所でIntelliSenseを有効にする](https://code.visualstudio.com/docs/python/editing#_enable-intellisense-for-custom-package-locations)

#おわりに
分かれば何てことはないが、拡張機能に頼ってあまり`setting.json`を直接いじらないような方はこの機会に少し覚えておくと損はない。
laravel Controller作成時 ReflectionException

# App\Http\Controllers\〇〇がある場合
```
# php artisan make:controller 〇〇/<Controller名>
```

このようにコントローラを作成してあげると、`App\Http\Controllers`配下のディレクトリにコントローラが作成され、名前空間(namespace)も自動的に記述される。




# 作成直後に`ReflectionException`が出る場合
```php:App\Http\Controllers\〇〇.php
use App\Models\<モデルクラス>;
use App\Http\Controllers\Controller;
```
この２つをuseすることが最低限必要そうです。
どちらかが記述されていないと、`php artisan route:list`などが機能しません。
Spring DI関連アノテーションについて

> ## Spring DI関連アノテーションの種類
>>
Context Configuration Annotations
&nbsp;
 @Scope 
 @Autowired
 @Resource
 @Inject
 @Required
 @Named
 @Order
 @PostConstruct
 @PreDestroy

> #### @Scope
>
一般的に @Component @Service @Repository などで自動的にスキャニングするBeanはシングルトンとして一つのみ生成されるが、これを変更するためには @Scope アノテーションを使えばよい。つまり、Beanの範囲を設定してあげる。

> singleton - `IoC コンテナー`当たり一つのBeanをリターン
prototype - `リクエスト`がある度に新しいBeanを作成し、リターン
request - `HTTP request オブジェクト`当たり一つのBeanをリターン
session - `HTTP session オブジェクト`当たり一つのBeanをリターン
globalSession - `全てのセッション`に対する一つのBeanをリターン
&nbsp;
>
```ruby:Example
   @Component
   @Scope("prototype")
   Class Hoge { ... } 
   <bean id="hoge" class="aaa.java.bbb.ccc.hoge" scope="prototype" />
```


>Beanを注入してもらった場合は、下記のアノテーションが使える。
> #### @Autowired
>
Spring Frameworkに属するアノテーション
Beanのidかname、どっちか合ったら適用する。Type Driven Injection
いくつかのBeanが検索された場合は、`@Qualifier(name="hoge")` アノテーションで区別する。
基本的に @Autowiredになった属性はすべてBeanが注入される。
&nbsp;
 - 適用できるとこ：メンバー変数、setterメソッド、コンストラクト、一般メソッド


> #### @Resource
> 
Spring 2.5 以上で使えて、Spring Frameworkに属しないアノテーション
Beanのnameで注入されるBeanを探す。使うためには、JSR.250ライブラリの`jsr250-api.jar`をクラスパスに追加する。
&nbsp;
 - 適用できるとこ：メンバー変数、setterメソッド
>  
 ```xml:Maven設定
<dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>jsr250-api</artifactId>
      <version>1.0</version>
</dependency>
 ```


> #### @Inject
> 
Spring 3.0 以上で使える。特定のFrameworkに属しないアプリーを構成するためには、@Injectを使うことがおすすめされている。使うためには、JSR.330ライブラリの`javax.inject-x.x.x.jar`をクラスパスに追加する。
&nbsp;
 - 適用できるとこ：メンバー変数、setterメソッド、コンストラクト、一般メソッド
>  
 ```xml:Maven設定
<dependency>
      <groupId>javax.inject</groupId>
      <artifactId>javax.inject</artifactId>
      <version>1</version>
</dependency>
 ```

> #### @Required
>
Setterメソッドの上に記述し、必須プロパティーを設定する用途で使われる。使うためには、RequiredannotationBeanPostProcessorクラスをBeanとして登録するか、<context.annotation-config>設定を追加すればいける。
>
```ruby:Example
   package day1;
   public class Emp {
   private String ename;
   @Requried
   public void setEname( String ename ) { this.ename = ename; }
   public String getName() { return this.ename; }
   }
```
>

>
```xml:Beans.xml
<bean id="emp" class="day1.Emp" >
  <!-- 以下のプロパティーを設定しないとエラー -->
  <!-- <property ename="ename" value="hoge" /> -->
</bean>
```

>
```java:main()
   ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
   Emp emp = (Student) ctx.getBean("emp");
   System.out.println("Ename : " + emp.getEname());

実行すると、下記のエラーが出る。

>
```ruby:Error
   Property 'ename' is required for bean 'emp'
```
&nbsp;

>
少し疲れたので、@Named @Order @PostConstruct については明日・・・
GAS Exception: Ui.showModalDialog を呼び出す権限がありません。

実際にはDriveAppを呼び出そうとして怒られた。
他のGoogle関連サービスを利用するには、appsscript.jsonにoauthScopesエントリを追加するとよいようだ。最終的には以下のようになった

```appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/drive.readonly",
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/spreadsheets.currentonly",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/script.container.ui"
  ]  
}
```

もともとスプレットシートとUIを使えるようにスコープには書いてあったが、
oauthScopesエントリにDriveだけ追加したら、Sheetで怒られ、uiで怒られ、毎回エントリ足す、実行時にダイアログでる、という結果に。

これも備忘録的に書いとこう〜
Terraform 0.12.x .tfファイル まとめてフォーマット

--動作環境--
OS:Windows10
Terraform:v0.12.18


通常のフォーマットコマンドは以下の通り。

```Terminal:カレントディレクトリのみ対象とする場合
$ terrafornm fmt
```

下階層のフォルダにある.tfファイルもまとめてフォーマットしたい場合、
フォーマットしたい .tfファイルが保存されているルートディレクトリにて、以下コマンドを実行


```
$ terraform fmt -recursive
```

上記コマンドを実行すると

```qiita:実行結果
main.tf
variables.tf
outputs.tf
modules\APIGateway\main.tf
modules\APIGateway\variables.tf
modules\Lambda\main.tf
modules\Lambda\variables.tf
modules\RDS-AuroraMySQL\main.tf
modules\RDS-AuroraMySQL\output.tf
modules\RDS-AuroraMySQL\variables.tf
modules\SES\variables.tf
modules\SQS\main.tf
modules\SQS\variables.tf
modules\IAM\variables.tf
・
・
・
```

とフォーマット完了した .tfファイル一覧が表示されて、フォーマット完了です。
AutoLISP 比較演算関数と条件関数の使い方

[比較演算関数と条件関数リファレンス（公式ヘルプ）](https://help.autodesk.com/view/OARX/2020/JPN/?guid=GUID-C6A7FC58-7A07-4650-9D59-12CAFD194FDA)

## 値が等しいか調べる　=
```scheme
(= 1 1)
;; -> T
(= "a" "a")
;; -> T
(= 4 (+ 1 2))
;; -> nil
(= "a" "A")
;; -> nil
```

## 値が等しくないかか調べる　/=
```scheme
(/= 1 1)
;; -> nil
(/= "a" "a")
;; -> nil
(/= 4 (+ 1 2))
;; -> T
(/= "a" "A")
;; -> T
```

## 数値の大きさを比べる < <= > >=
```scheme
(< 1 1)
;; -> nil
(< 1 2)
;; -> T
(< 2 1)
;; -> nil
(< "a" "a")
;; -> nil
(< "a" "A")
;; -> nil

(<= 1 1)
;; -> T
(<= 1 2)
;; -> T
(<= 2 1)
;; -> nil
(<= "a" "a")
;; -> T
(<= "a" "A")
;; -> nil

(> 1 1)
;; -> nil
(> 1 2)
;; -> nil
(> 2 1)
;; -> T
(> "a" "a")
;; -> nil
(> "a" "A")
;; -> T
(>= 1 1)
;; -> T

(>= 1 2)
;; -> nil
(>= 2 1)
;; -> T
(>= "a" "a")
;; -> T
(>= "a" "A")
;; -> T
```

## AND(論理積)を返す　and
```scheme
(and T T)
;; -> T
(and T nil)
;; -> nil
(and nil nil)
;; -> nil
```

## ビット方式の汎用ブール演算　boole
```scheme
(boole 1 1 1)
;; -> 1
(boole 6 1 1)
;; -> 0
(boole 7 1 1)
;; -> 1
(boole 8 1 1)
;; -> -2
```

## 多分岐条件関数(swich文)　cond
```scheme
(setq val 1)
(cond
    ((= 1 val) 1)
    ((= 2 val) 2)
    ((= 3 val) 3)
)
;; -> 1
```

## 2つの式が同一物かどうかを調べる　eq
```scheme
(eq 1 1)
;; -> T
(eq "a" "a")
;; -> T
(eq (+ 1 1) (/ 4 2))
;; -> T
(eq (type 1) (type 2))
;; -> T
(eq (= 1 1) (numberp 2))
;; -> T
(eq 'a 'A)
;; -> T
```

## 2つの式の評価結果が等しいかどうかを調べる　equal
```scheme
(equal 1 1)
;; -> T
(equal "a" "a")
;; -> T
(equal (+ 1 1) (/ 4 2))
;; -> T
(equal (type 1) (type 2))
;; -> T
(equal (= 1 1) (numberp 2))
;; -> T
(equal 'a 'A)
;; -> T
```

## 条件に応じて式を評価(if文)　if
```scheme
(setq val 1)
if (= 1 val)
    1 ;_T(true) のとき
    0 ;_nil(false) のとき
)
;; -> 1

(setq val 9)
if (= 1 val)
    1 ;_T(true) のとき
    0 ;_nil(false) のとき
)
;; -> 0
```

## OR(論理和)を返す　or
```scheme
(or T T)
;; -> T
(or T nil)
;; -> T
(or nil nil)
;; -> nil
```

## 指定された回数繰り返す　repeat
```scheme
(repeat 5
    (print "Hello")
)
;; -> "Hello"
;;    "Hello"
;;    "Hello"
;;    "Hello"
;;    "Hello"

(setq val 0)
(repeat 10
    (setq val (1+ val))
)
;; -> val = 10
```

## 条件がTの間繰り返す　while
```scheme
(setq val 0)
(while(< val 10)
    (setq val (1+ val))
)
;; -> val = 11

;; 無限ループ
(while T
    ･･･
)
```
GitLab-CIで「ERROR: Job failed (system failure): Error: No such container」が発生

# 現象

GitLab-CIのジョブが、ある日突然下記のようなエラーを吐いて`Failed`になるようになった。
この状態では、同じジョブはリトライしても高確率で失敗。（たまに成功しているジョブもあるのが難解）

gitlab-runnerはDocker版を使用しており、Docker Executorとしてセットアップしたもの。

```
ERROR: Job failed (system failure): Error: No such container: 40c002093a4bd596c73a19aa006b80b552d728d76128654cf65f3ac4967fdac3 (executor_docker.go:785:0s)
```

# 調査

エラー内容で調べていると、[この投稿](https://gitlab.com/gitlab-com/support-forum/issues/3864#note_169381650)にたどり着いた。

下記のような操作が有効とのこと。

1. Dockerのサービスを止める
2. すべてのイメージを削除する
3. ディスク領域を開放する
4. Dockerとgitlab-runnerのサービスを起動する


# 対処

ディスク領域が逼迫している様子はなかったので、私の場合は2や3は関係ないような気がした。

そのため、とりあえずgitlab-runnerのコンテナを稼働させているVMを再起動させてみることに。
この操作に伴って、上記の1や4の操作を実施することになる。

再起動後は、正常に動作していることを確認。

安易に再起動できない環境の場合は、必要に応じて上記1～4の操作を試してみると良さそう。
音声読み上げでの「伏字」

#変数としての○○
「私の名前は○○です。」と伏字で表現したときに、ほとんどの日本人なら○○の部分は各々が勝手に氏名と変換してくれます。

この用例の場合、伏字には氏名を代入するって刷り込まれていますね。変数の説明をするときによく使っている例だとおもいます。

##Javascriptで表現したら？
こんな感じになるかな？

```
var name;
name = "○○";
console.log(`私の名前は${name}です。`);
```

最近のお気に入り、テンプレート文字列を使ってみました。

##音声読み上げソフト
文章だと人間の補完機能で成立するのですが、Amazon Pollyなどで音声読み上げると

>わたしの　なまえは　まるまるです。

ちょっと変です。
氏名なら人間側で自動補完されますが、固有名称を考えた場合

>私たちの固有名称はホニャララです。

○○を「ほにゃらら」に置き換えてみましたが、固有名称という前置きが必要になります。「まるまる」よりも「ほにゃらら」は砕けた印象がありますが、若者には通用しなさそうです。

##○○の代わりになる英語

視点を変えて、英文の例をググってみました。

> My name is X.

日本語と同じような使い方でxxxとすると、エッチな意味合いも含んでしまうらしい。

#解決案
絶対的な正解ってのは、まだわかりません。

##数値なら「何」
数値は「何」にしました。
>何番部屋、何時何分

何は「不定称の指示代名詞」というらしいです。

##氏名など連想しやすい文字列
氏名とか姓名とか違和感しかないですが、連想しやすい単語を読み上げることにしてみます。

>私の名前は姓名です。
>わたしの　なまえは　せいめいです。

生命とか神がかっている人間自動変換はされないと思いたい。

##固有名詞なら括弧を使う
やっと一番言いたいところまできた。

○○のところに固有名称とする場合の連想しやすい別単語を思いつかなかった。
固有名称のままだと想像しずらいので団体名としてみます。

>私たちは【団体名】です
>私の名前は【氏名】です。

括弧書きにすることで読み上げとテキストを同一にしても違和感が少なくなる気がします。

##応用
アイドルグループの本人たちに、キャッチコピーとグループ名を記述してもらうための文章と音声読み上げを想定してみます。

>私たちは【キャッチコピー】、【グループ名】です。

なぜか地下アイドルグループな匂いがプンプンします。

おしまい。
Excelで集合縦棒・積み上げ縦棒・折れ線グラフを組み合わせる

資料作成を行う際に、集合縦棒・積み上げ縦棒・折れ線グラフを組み合わせたグラフを作成しました。その際の手順を記載していきます。
もしより簡単な記載方法等があれば教えていただけると嬉しいです。

使用したのはExcel2016です。

#今回作るグラフ
今回は下記のようなグラフを作成していきます。
数値についてはかなり適当なので、あまり気にしないでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/d8907a26-2e83-9a85-a1fb-c3bf73f871bb.png)


#手順

ざっくり行ってしまえば3ステップ。

1. 元データを作成する
2. グラフの挿入を行う
3. グラフの形を整える

元データさえ作れればほとんど完成したも同然。

#詳細

##1.元データを作成する
下記のような形でデータを作成します。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/6a74a61f-c464-55c0-0f6e-399cb9866add.png)
**補足**

- 区分を作成しているのは、うまく2列あることが読み込まれなかったためです。
- 列4がすべて記載されているのは間の数字を入れないと0として読み込まれるため、数値を入れています。
- 月の下にさらに1列追加しているのはグラフを見やすくするためです。ここを開けなかった場合、棒グラフの太さ等を調整したときに横と隣接しすぎて見づらくなります。

##2.グラフの挿入を行う

上記のデータを全選択（ヘッダーの部分も）した状態で、「積み上げ折れ線グラフ」で挿入を行います。
そうすると下記のようなグラフが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/5e4dff5d-27ce-2f04-8b76-6350d0978239.png)


##3.グラフの形を整える
ここまで来たらあとは形を整えていくだけです。
整えるのは3つ。

1. 不要な項目の削除
2. 横軸の変更
3. グラフの変更

1と2は一気にやっていきます。

消去の仕方はグラフを選択した状態で、右クリック>データの選択
「月」と「区分」からチェックを外します。
この時横軸ラベルを月にしたいので、編集から選択しておきます。

下記のようになればOKです。
これで不要な項目（「月」と「区分」）が消去され、横軸が月単位になります。

![mado .PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/9ae08248-e271-b150-88e3-28cb6e40692f.png)

次に折れ線グラフを集合と積み上げの棒グラフにしていきます。
任意の折れ線グラフを選択し、右クリック>系列グラフの種類の変更

例1・例2・例3を「積み上げ縦棒」に変更する。
![orebou.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/e58c9a10-56f6-bbe3-5348-a5e69f2eb7ce.png)

※この時、例4の値が小さすぎて折れ線が下で横ばいになるので、第2軸にチェックを入れることで解決する。

*グラフの作成自体は完成。*

##おまけ
上のグラフでもまあいいんですが、もうちょっと整えたい。
なので再度任意の折れ線グラフを選択し、右クリック>データ系列の書式設定

下記の設定で棒線グラフが太くなり、まとまりがわかりやすくなります。

![setting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/797b50cf-b571-2843-eb3b-901595a223d4.png)

あとはお好みですが、折れ線グラフを少し見やすくするために下記の設定もしています。
標準スタイルは外側のオフセット（下）です。
これをすることで少しだけ影がついて見やすくなります。

![shadou.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/f75addc7-5c5d-c538-62f3-fd4bea8d2a27.png)


これで最初に示したグラフが完成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121319/d8907a26-2e83-9a85-a1fb-c3bf73f871bb.png)
プログラミング用語を整理

#プログラミングの基礎用語を整理
#Activity
 アプリの画面を表示するためのコンポーネントであり、また、状態の保存・復帰のための仕組みや、他のコンポーネントを呼び出す機能がある。ライフサイクルは今後追加
#Fragment
 FragmentはActivity上で運用されるものの独立した機能をもつので,Fragment自身もViewを装備・使用できるが、UI画面としてのライフサイクルの根本をコントロールするのはActivity。紙芝居の土台が、Activityで、一つ一つの紙芝居のページがFragment。ライフサイクルは今後追加
#Context
・アプリケーションの環境情報とかをグローバル(Android OSの全域）で受け渡しするためのインターフェース
・アクティビティの起動とかブロードキャスト、インテントの受け取りといった他のアプリからの応答を行え、アンドロイド特有のリソース・クラスにアクセスすることも出来る。
　アプリ全体の状態を持っていて、何から起動されたかどういう状態か、何にアクセスしようとしているか、といった情報を受け渡すために使っている。ということでいいのかも。（次のサイトから抜粋）
http://individualmemo.blog104.fc2.com/blog-entry-41.html
#Intent
　各コンポーネントの要求をシステムに伝えて、意図にあった相手のコンポーネントとつながる。
#Listener
 ある「イベント」が発生した時、「イベント発生」の通知を受け取るオブジェクト
ELB配下のEC2インスタンスのnginxの設定

## ELBを使うと何が困るか
ELBを使ってEC2にアクセスする場合、nginxが認識する直近のアクセス元は全てELBとなります。
従って、アクセスログをみるとアクセスがすべてELBということになったり、IP制限をかけようにもクライアントのIPが取得できなくて困ることがあります。

そういう時には`X-Forwarded-For`を使うといいと言うことがさらっと書いてあることが多いのですが、もう少し細かく記載しておきます。

## 実際の設定
```
set_real_ip_from 172.32.10.0/20; # プライベートIPは実際のものを使ってください
set_real_ip_from 172.32.18.0/20; # プライベートIPは実際のものを使ってください
real_ip_header X-Forwarded-For;
real_ip_recursive on;
```
この設定を追加します。この設定を追加すると`set_real_ip_from`で設定したサブネットからのアクセスは`X-Forwarded-For`を利用するようになります。`real_ip_recursive`を`on`にしておくことで、その他のプロキシなどが噛んでいた場合も元々のクライアントのIPが取得できるようになります。recursiveなので再帰的に転送元をたどる設定かと。

set_real_ip_fromにはELBの存在するサブネットを設定しておきます。基本的には複数あると思うので並べて記載すればOKです。

この設定を反映することでaccess.logの`$remote_addr`にはELBではなく、実際のユーザーのIPアドレスが記録されるようになります。`$http_x_forwarded_for`を使わずともクライアントのIPが記録可能となります。

## limit_reqとlimit_con
同一IPからの集中アクセスがある場合も

```
# limit req
limit_req_zone $binary_remote_addr zone=limit_req_by_ip:10m rate=10r/s;
limit_req_log_level error;
limit_req_status 503;

# limit conn
limit_conn_zone $binary_remote_addr zone=limit_per_ip:10m;
limit_conn_log_level error;
limit_conn_status 503;
```
このように設定してlocationディレクティブで

```
location / {
    limit_req zone=limit_req_by_ip burst=10;
    limit_conn limit_per_ip 5;
}
```

このように設定します。こうすると同一IPから一秒間に10リクエスト以上、または同一IPから同時に5接続という制限がかかり、制限を超えると503エラーを返します。
これも`real_ip_header`の設定をしていないと、全てELBからのアクセスとなるため、間違ってしまうと不要にエラーを返してしまうことにあります。

調べながら書いたので正しくない箇所もあると思うので指摘あったらいただけると助かります。
【Java】lengthとlength()とsize()の違い

#この記事の内容
Javaで配列や文字列の長さを取得するとき、lengthなのかlength()なのかsize()なのかごっちゃになるので、その辺りを勉強を兼ねてまとめました。

#結論

|length|length()|size()|
|------|--------|------|
|**配列**の長さ|**文字列**の長さ|**コレクション**の要素数|


#length、length()、size()の違い

###length

lengthは配列の長さを取得するのに使われます。

```java
int[] a = new int [100];
a.length;    // 100
a.length();  // コンパイルエラー
```

配列のメンバであるlengthフィールドを利用するため、()は不要となります。

###length()
length()は文字列の長さを取得するのに使われます。

```java
String str = "aiueo"
str.length;    // コンパイルエラー
str.length();  // 5
```

文字列では長さの取得にlengthメソッドを用いるため、()が必要となります。
全角の場合でも文字数を（人間的に）正しく数えてくれます。

```java
String zenkaku = "あいうえお"
zenkaku.length();  // 5
```

###size()

size()でコレクション（ListやSetなど）の要素数を取得できます。

```java
ArrayList<Integer> b = new ArrayList<>();
for(int i = 0; i < 100; i++){
  b.add(i);
}
b.size()  //100
```

size()はCollectionクラスで定義されているメソッドだそうです。なので、コレクションなら全てsize()が使えます。

##参考文献
http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000290.html
アンドロイド Camera Xとトーチライトの組み合わせ

#Camera Xでライトをつける

**Camera X**でカメラの機能を実装して、トーチライトを使おうとしたら、あれっ、ライト付かないんだけど...ってなったので今後忘れないようにメモ。


####Camera Xの前までやってた書き方↓(※Camera Xではライトが付かなかった例)

```kotlin
        val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
        cameraManager.registerTorchCallback(object: CameraManager.TorchCallback(){
            override fun onTorchModeChanged(cameraId: String, enabled: Boolean) {
                super.onTorchModeChanged(cameraId, enabled)
                cameraID = cameraId
                lightOn = enabled
            }
        }, Handler())

        //トーチライトオン
        cameraManager.setTorchMode(cameraID, lightOn)
```

これだとCamera 2とかでは使えるけど Camera Xでは使えずトーチライトが付かない。ちなみにビルドは普通に通る。

####Camera Xでの書き方↓

前提として、Camera Xのプレビューまで実装済み

```kotlin
val preview = Preview(previewConfig)
CameraX.bindToLifecycle(this, preview)

//ライトをつける
preview.enableTorch(true)
```
まさかのこれだけ。プレビューuse caseを使ってトーチライトをつけることができる。
すごく便利だった。

ちなみに自分は最初付かねーってなったけど、ちゃんと公式には書いてあった...
User Agent Client Hintsに関する調査

# 1. 概要


2020年1月14日にGoogleが「Chrome」でUser Agent文字列の利用を段階的に縮小していく計画を発表しました。
User Agentが固定化されるため、従来行ってきたUser Agentを用いた、ブラウザ種別やバージョンの判定ができなくなります。

代わりに、今後は「User-Agent Client Hints」という新たな仕組みに置き換えられることが検討されています。
＊調査中のため、不正確な情報が記載されている恐れがあります。

- [参考：グーグル、「Chrome」でユーザーエージェント文字列の利用縮小へ--プライバシー保護強化の一環](https://japan.cnet.com/article/35147994/)

# 2. User Agent文字列固定化のスケジュール

以下のスケジュールで段階的にUser Agent文字列固定化が進む予定でしたが、最新の状況では、COVID-19の影響及びUA-CH機能に評価期間を設ける目的で、UA凍結計画は2021年以降に延期されています。

| Chromeバージョン（リリース時期） | 対応内容 |
|:--|:--|
| Google Chrome 81（2020年3月中旬） | navigator.userAgent によるUAの取得が非推奨となる(navigator.userAgentを実行するとコンソールに警告が出るようになる。) |
| Google Chrome 83（2020年6月上旬） | ブラウザバージョンやOSバージョンなど、UserAgent文字列の中で後方互換性を損わずに固定できる部分を凍結したり、統一される。 |
| Google Chrome 85（2020年9月中旬） | UserAgent文字列を統一。デスクトップブラウザ用のUserAgentかモバイル用UserAgent文字列のいずれかしか取得できなくなる。 |

# 3. 対応策

User Agent文字列でサイトの表示を変更していたりする場合、今後は「User Agent Client Hints」を利用する必要があります。
＊なお、過去のブラウザのUser Agentが変更されないので、

「User Agent Client Hints」は以下の２つの利用方法があります。

１．ブラウザ上で取得する。
2.サーバーのhttpリクエストヘッダで取得する。

## 3.1. ブラウザでの「User-Agent Client Hints」の利用方法

`navigator.getUserAgent`関数により、ブラザやOSの情報を取得することが可能となります。
＊2020/2/17時点のChrome 80では、`chrome://flags`で「Experimental Web Platform features」のオプションを有効にする必要があります。

`navigator.getUserAgent`関数はPromiseの関数なのでawaitで利用します。

Mac版Chrome 80で取得すると以下の結果となります。「architecture」や「model」の項目に値が入っていませんが、今後、これら項目にも値が設定されるのかもしれません。

```javascript
const user_agent = await navigator.getUserAgent()
{
architecture: ""
brand: "Google Chrome"
model: ""
platform: "Mac OS X"
version: "80.0.3987.106"
}
```

- Brand
    - The user agent’s brand.
- Platform
    - The user agent’s platform brand and version.
- Architecture
    - The user agent’s platform architecture.
- Model
    - The user agent’s model.
- mobile
    - The user agent’s mobileness.

## 3.2. サーバでの「User-Agent Client Hints」の利用方法

今後、執筆予定。
Chrome84(beta)では取得可能なUA-CH項目が下記通りです。 

| 項目名 | 説明 | 例 |
|:--|:--|:--|
| sec-ch-ua | ブラウザのブランド及びメジャーバージョン | ... "Google Chrome";v="84" |
| sec-ch-ua-arch | CPUアーキテクチャ | ARM64 |
| sec-ch-ua-platform | OS名 | Mac OS X |
| sec-ch-ua-model | デバイスモデル | Pixel 2 XL |
| sec-ch-ua-mobile | モバイルか否か | ?0 |
| sec-ch-ua-full-version | UAビルドバージョン | 84.0.4147.30 |
| sec-ch-ua-platform-version | OSバージョン | 10_15_4 |

# 4. 関連記事

- [Privacy Sandboxの調査](https://qiita.com/tetsurotayama/items/e4dd801ab64c0b50074e)

# 5. 参考文献

- [User-Agent Client Hints(Draft Community Group Report, 27 May 2020)](https://wicg.github.io/ua-client-hints/)
metabaseでフィールドフィルターを使わずに任意の月基準のデータを表示する

自分用メモ
フィールドフィルター使えない状況の対処
ポスグレ使用環境

## 1.テキストで指定する場合
フィルターをテキストに設定して YYYY/MM で年月を入力して使うようにする
【指定月の表示】
`to_char(date, 'YYYY/MM') = {{text}}`

## 2.日付で指定する場合
キャストしないとエラる
【指定月の表示】
`date_trunc('month', date) = date_trunc('month', cast({{day}} as timestamp))`
【指定月から一ヶ月前までの表示】
`date_trunc('month', date) between date_trunc('month', date_trunc('month', cast({{day}} as timestamp)) - interval '1 day') and date_trunc('month', cast({{day}} as timestamp))`

## ex.当月をデフォルト値にしたい場合
指定した時だけ当月指定の記述をコメントアウトするようにすればおk
`date_trunc('month', date) = [[date_trunc('month', cast({{day}} as timestamp)) --]]date_trunc('month', current_timestamp)`




フィールドフィルター以外でももうちょっとフィルターの幅増やして欲しい
[やってみた][Android]UserLAndを使用したUbuntu環境の構築

## 環境

LenovoPad 601LV(Softbank TAB3)

Android 6.0



## 参考サイト

[Android で動く Linux 環境 UserLAnd が XServer XSDL に対応](https://wlog.flatlib.jp/item/1866)

[UserLAndの日本語化](https://yamadablog.web.fc2.com/articles/2/index.html)

![Screenshot_20201008-095703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589067/cf173591-ec67-bb41-31f1-0eda5053cfd2.png)

## 手順

1. アプリストアより「UserLAnd」「XServer XSDL」をインストール

2. [Android で動く Linux 環境 UserLAnd が XServer XSDL に対応](https://wlog.flatlib.jp/item/1866)を参考に、UserLAndにUbuntuの環境を構築

3. XSDL、SSHで接続可能であることを確認

   なお、/support/startXSDLServer.shの編集は下記のように行うこと

   ```
   #! /bin/bash
   
   if [[ -z "${INITIAL_USERNAME}" ]]; then
     INITIAL_USERNAME="user"
   fi
   
   #su $INITIAL_USERNAME -c /support/startXSDLServerStep2.sh
   sleep 20
   su $INITIAL_USERNAME -c 'startlxde &'
   ```

4. [UserLAndの日本語化](https://yamadablog.web.fc2.com/articles/2/index.html)を参考に、日本語化環境に変更



## 動作確認

UserLAndからXSDLモードで起動するとLXDEが日本語モードで起動する



## PCよりSSH接続

同一ネットワーク上に存在している場合、TerminalやTeraTermからもSSH接続が可能

UserLAndをSSHモードで起動している場合はsshdが起動している。(port 2022)

```
ssh -p 2022 <UserName>@<IPAddress>
```

## 起動モードの切り替え
UserLAndはディストリビューション単位にssh、vnc、xsdlとセッションを切り替えられる。  

セッションの切替方法はディストリビューションを長押し。
![Screenshot_20201008-095648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589067/792a0a5c-4538-4cad-87f1-7ca029f8f117.png)


同時にセッションを起動することができないので、sshからxsdlに切り替える等の場合は、起動中のセッションを終了させる必要がある。  
セッションの終了はディストリビューション名を長押しし、Stop Appをタップする。  
![Screenshot_20201008-095712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589067/908b936b-a59a-c960-1811-f715c69c60e0.png)



## デスクトップ環境の表示(XSDL)ができない

UserLAndはXSDLを使用してデスクトップ表示も可能らしい。
試してみたが、起動すると以下の画面が表示され、
![Screenshot_20201008-094112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589067/a4bede9d-f612-45c1-3f4a-d8922ec3feb1.png)

その後、以下のようなエラーが発生してしまい表示できず。
![Screenshot_20201008-094115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589067/24acbf31-258a-af1a-92b7-12390d4114c7.png)

.bashrcにDISPLAYPORTを設定するなどの説明があり試してみたが解決には至らず。
タブレットを使用しているので液晶画面はそこそこの大きさ。
デスクトップが表示できればできることや表現力も広がると思うので引き続き調査していく予定。

## 追記

原因というわけではないが、以前、デスクトップ環境を表示できた端末があり、再度環境を調査したところ、Android8の端末だとOK、Android5,6だとNGだということが判明。
TDD失敗事例(次回に活きれば)

## まとめ
いきなりですが、私がTDDを実施するために必要だと感じたこと(今回足りなかったこと)
1. 詳細設計所(もしくは十分な業務知識の理解。何を作ってるのか?)
2. 単体テストをするための準備(繰り返し実行しても同じ結果が返ること。DB定義の更新があった場合取り込めて、データの作成の手間が最小になるような環境に出来るのが理想。どうやるのがベストなのか、まだわかりません)
3. 体制準備(テストがオールグリーンじゃないとpushできないくらいの強制力のある仕組みを用意してもいいかも)
4.pullrequestの単位を小さくすること(単位がでかすぎると結局どういうコードがあって、どんなテストがされてるのかわからない。初めにテストを書かせて、どんなテストをするかレビューした後にコード実装に入ってもいいかも)

## なぜTDD?
- 既存のソースコード改修してリリース->予想外の場所でエラーが･･･
- メソッドが長すぎて何やってんのかよくわからん
- とりあえず実装したけどバグがやばい！<br>
↓<br>
**こんなときにTDDで開発すればきれいさっぱり解決します！**<br>
(今回私は完全に達成できなかったのですが、体感として一部あります。)

## メリットデメリット(書籍の内容&私が感じたこと)
|    メリット    |    デメリット    |
|:------------------|:------------------|
|1. メソッドが最小になりやすい。<br>2.既存のコード改修時に既存の振る舞いに変更がないことを確認しやすい。<br>3.業務ロジックがわかる(テストを記述するためにはどういうテストが必要か?を知る必要があり、最低限の業務を理解している必要がある)<br>4.リファクタリングが容易 |1.コード量が倍になる<br>2.テストを書きなれていないと時間がかかる(個人差あると思います。)<br>3.それなりに技術力が必要(どんなテストがあるのか?)<br>4.既存コードへの適用は大変|

当たり前かもしれませんが、テストを書いて、ちゃんとグリーンで通ってるよねってことが確認できてもそれが必ずしも業務要件や、パフォーマンス、ユーザビリティを保証しているものではないので、そこは別途注意が必要だと思います。


## 失敗したこと(こうなって欲しくないこと)
- ソースレビュー時にテスト長すぎてバーがグリーンになるけど結局何やってるかわからない
- 単体テストがかけるレベルの詳細設計所を書けなかった。ざっくりとした要件で伝えてしまったので、テストは全てグリーンになっていたが、業務要件が満たせていなかった。
- 単体テストをする環境作り。個人の環境で何回実行しても同一のテストが繰り返しグリーンになるようなDBおよびテストデータ作りの十分な知見がなく、それをするための環境の整備ができなかった。
- プロジェクトが炎上したときにテストコードを最後まで書ききることができない部分があった。
Nuxt.js で静的サイト生成時に不要な JavaScript を含めないやり方

# 背景
Nuxt.js で静的サイトを generate して Netlify などにデプロイしたい。
asyncData で API を実行してデータを取得するが、生成したサイトには API 情報を含めたくない。
(生成に使った後は不要になる場合)
ローカルでの開発も普通に行いたい。

# 結論
`if (process.server) {}`　内で処理する。

```javascript
  async asyncData({ $axios }) {
    if (process.server) {
      const res = await $axios.get(
        'https://<tekitou>.microcms.io/api/v1/items',
        {
          headers: {
            'X-API-KEY': 'aaaaaaa-bbbb-cccc-dddd'
          }
        }
      )
      return {
        items: res.data.contents
      }
    }
  }
```

# 確認方法
`yarn generate` などで生成した dist ディレクトリ内を検索する。
上記の場合だと **X-API-KEY** が含まれていないことを確認。

# その他いろいろ
- `process.static` でも良いが、ローカルでの開発時(yarn dev)に実行されなくなってしまう。
- 静的サイト生成なので `mode: 'universal'` が前提
- if 文が無いと、生成したサイトはブラウザで問題無く見えるが javascript に含まれてしまう
ポートフォリオ作成前に実施してほしいポイントまとめ

#はじめに

エンジニア転職・フリー転身を目指してスクールに通い始めた、Progateやドットインストールなどを一通り終えたあなた。

ポートフォリオの作成が大事だと言われたけど、何をしようか・何から手をつければいいか悩んでいるという方が非常に多いです。

そこで、<font color="HotPink">ポートフォリオ作成に取り掛かる前に実施するべきポイント</font>を記事にしました。少しでも読んで良かったって言ってもらえるように具体的なアクションで書いていきます。

※文字色変える方法は[「Qiitaで箇条書きの間に空行を入れたい」](https://qiita.com/twipg/items/d8043cd4681a2780c160)を参照しました。

<br/>
#企業から求められるポートフォリオとは？

さて、近年プログラミングスクールやコミュニティ・Twitter・YouTubeなどでのインフルエンサーの発信者増加によりエンジニアを目指す方が急増しています。ここで一度企業目線で考えてみてください。

あなたはWeb開発を行っている会社の人事部長です。

「最近応募者がどんどん増えているけど、スクールで学んだことに毛が生えたような機能実装の人が多くて、みんな似たようなポートフォリオに見えちゃうなー。未経験とはいえ、即戦力になってもらえそうな人をできるだけ選びたいんだけど。」

どうでしょうか？学んだことを使って実装するのは最低限必要ですが<font color="HotPink">＋α他の人がやってないことをやって差別化を図らない限り、面接官の印象には残らない</font>と思います。

では、他の人と差別化を図るにはどんなことを意識して作成に取り掛かるべきでしょうか？

<br/>
#将来どんな仕事をしたいかで求められるポートフォリオは変わる

- ざっくり<font color="HotPink">フロントエンドかバックエンド</font>どちらを目指すかは必ず初めに決めて下さい。マストです。途中で方向転換も可能ですが、重視すべき点が異なります。

- 好き、書きたい言語があるなら<font color="HotPink">理由を明確に</font>してください。面接でなぜその言語で書いたか聞かれます。 

- 行きたい会社がある程度絞れているならその<font color="HotPink">会社でメインに使われている言語</font>をチョイスすると良いです。

メインで書く言語が決まったら次はテーマ決めです！

<br/>
# 常日頃からアンテナを高く張っておく

- 他の人がどんなポートフォリオを作っているか見てみる

<font color="HotPink">良いものを真似られるようになるのが初心者卒業への第一歩</font>です。GitHub・Twitter・ブログなどからどんな機能を実装しているのか、どういう経緯で作ったのかを見てみましょう。


- スマホやPCのアプリを色々触ってみる

<font color="HotPink">意識的に使う</font>ようにすれば「使いづらい」「もっとこうだったら良いのに」というのがたくさん出てきます。

普段何気なく使っているアプリも何かしらの理由があって使い続けていると思います。<font color="HotPink">アプリ毎にそれぞれ良い点・悪い点を言語化</font>してみましょう。大体下記の項目に分類できると思います。他にもあったら是非教えてください笑

1. サービスの内容
2. 操作性
3. レイアウト
4. コンテンツ・情報量
5. 他サービスとの連携機能
6. レスポンスの速さ
7. ユーザー数・ユーザーの質
8. 料金設定
9. セキュリティ面

<br/>
# 自分の経験談を織り交ぜる

「好き」「嫌い」を縦軸、「便利」「不便」を横軸にグラフを書いて、その中に使っているアプリ、サービス、物などを書き出してみましょう。

![A79C4EC1-3AA1-4DD3-89DE-E73C15B3EB13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487789/4c8487a5-43c8-3681-26a7-65650719f2cc.png)

① 好きだし便利
なぜ使っていて便利、好きだと思うのかを分析して<font color="HotPink">優れていると思った機能</font>を書き出し、取り入れてみましょう（充実型）

② 好きだけど不便
この項目が一番重要です。
レイアウトが見づらいのか、操作性が悪いのか、機能的に不足があるのかなどを書き出して整理してみましょう。

どんなに小さなことでもいいので<font color="HotPink">解決したい課題を自力で解決できた</font>というストーリーは心に刺さります。（問題解決型）

③ ④ そもそも好きじゃない
これは基本的に無視していただいてOKです。
なぜ嫌いかは自分の向き不向きの基準として、頭の片隅に置いておいてもいいかもしれません。

<br/>
#実装する機能を箇条書きする

ここまで行ってきた分析・決定から組み込みたい機能を整理しましょう。

例. 
1. 記事一覧表示
2. 記事詳細表示
3. 記事の投稿
4. 管理ユーザー登録
5. 管理ユーザーログイン,ログアウト
6. 画像ファイルのアップロード,ダウンロード
7. DBトランザクション制御
8. ページネーション
9. 単体テスト
10. 統合テスト


ここまで出来たらもう少しです！

<br/>
# 実装する機能を踏まえてレイアウトを紙に書き出してみる

必要な画面、フォーム、ボタン、画面遷移先など<font color="HotPink">イメージを簡単に</font>書き出しておくと実装がスムーズにいきます。

![gui.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487789/79390612-8ded-059d-2e9c-b63a0ef0b3de.jpeg)

※上図はPhotoShopでフリー素材を組み合わせて作っています。

<br/>
# 実装する順番を決める

いきなり全部をやろうとすると抜け漏れ・バグだらけになり、直すのも一苦労です。

Progateやカリキュラム同様、<font color="HotPink">まずは記事投稿のアクションを、次に記事の一覧表示</font>を、というように順を追って実装しましょう。ここで焦って難しいことから手を出すとかえって膨大な時間がかかります。

<br/>
# お疲れ様でした！！！

ここまで出来たあなたはもう実装が楽しみで仕方なくなっているのではないでしょうか？笑

クオリティを上げようと思うほど時間がかかるし、その分たくさんエラーにもぶち当たると思います。ですが、<font color="HotPink">壁にぶち当たったときこそ成長のとき</font>です！

私もまだまだこれからなので、皆さんと切磋琢磨して良いサービスを生み出すエンジニアになりたいと心の底から思っています。

ここまで読んでくださりありがとうございました！
CentOS8 メモ

メモモモモモ

仮想鯖作る:fishing_pole_and_fish:

# やること
1. VirtualBox,CentOS8ダウンロード
2. VirtualBoxの設定とか
3. CentOSの設定とか

# 1. 省略
下記の参考文献をみる

# 2. ばーちゃん
| せっ               | てい |
|:------------------|-----|
| バージョン          | Red Hat(64-bit) |
| メモリ              | 2048MB |
| 仮想ハード(割当)     | 作成 |
| 仮想ハード(タイプ)    | VDI |
| 仮想ハード(ストレージ) | 可変 |
| 仮想ハード(サイズ)    | 20.00GB |
| システム(起動順序)    | フロッピー, ハード, 光学 |
| ディスプレイ(ビデメモ) | 25MB |
| ディスプレイ(倍率)     | 200% |
| 共有フォルダー         | 適当に |

* 起動順序を設定しないと、無限ループする。で、そのまま、また設定しようとすると容量が足りないって言われる。


# 3. せんとくん
*  フォフフォウぇあ設定。サーバーで、開発ツール選択。
*  ネットワーク設定する。適当に。適当って難しい。普通何番とかなんだろうか…
* インストール




# 参考URL
令和2年2月現在
- [【初心者でもわかる】VirtualBoxインストール方法を詳しく！( https://eng-entrance.com/virtualbox-install )]
(https://eng-entrance.com/virtualbox-install)
- [画像で分かる！CentOS 8 のインストール方法( https://hackers-high.com/linux/centos8-installation/ )]
(https://hackers-high.com/linux/centos8-installation/)
- [【画像あり】CentOS 8インストール後に再起動しても初期画面に戻る問題 ( https://qiita.com/4EAE_Learner/items/01cd1a63aa7f5022c7d4 )](https://qiita.com/4EAE_Learner/items/01cd1a63aa7f5022c7d4)
【ターミナル】地味だけど使いこなせば時間が浮くショートカットキー一覧

## はじめに
ターミナルで使えるショートカットキーのうち、以下３項目をまとめました。

- カーソル移動
- カット＆ペースト
- 履歴系コマンド

特に**移動とカット**！これをもっと使っていれば**楽だった**なーと感じています。:sweat_smile:

## 環境
```yaml
OS: macOS Catalina 10.15.3
zsh: 5.7.1
```
## ターミナルショートカットキー一覧

### カーソルの移動
|キー|意味|
|:-:|:-:|
|⌃ + A|行頭に移動|
|⌃ + E|行末に移動|
|⌥ + →|1単語右に移動|
|⌥ + ←|1単語左に移動|

### カット・ペースト
|キー|意味|
|:-:|:-:|
|⌃ + U|現在のカーソル位置から行頭までカット|
|⌃ + K|現在のカーソル位置から行末までカット|
|⌥ + W|現在のカーソル位置にある１単語をカット|
|⌥ + Y|切り取った内容をペースト|

### 履歴の呼び出し
|キー|意味|
|:-:|:-:|
|↑|1つ前のコマンド|
|↓|1つ後のコマンド|
|⌃ + R|過去使用したコマンド検索|

## 余談：きっかけ
これまで個人的に[snap](https://apps.apple.com/jp/app/snap/id418073146?ign-mpt=uo%3D4&mt=12)で任意のショートカットを設定して**エディタやKindle**をさっと立ち上げたりしてきました。

- `⌃ + A` (VSCodeの起動)
- `⌃ + K` (Kindleの起動)

これはこれで超便利。
ただ、代わりに犠牲にしていたものがありました。

ターミナルのショートカットのうち

- `⌃ + A` (行頭へ移動)
- `⌃ + K` (現在のカーソル位置から行末までカット)

の２つとだだ被りしていたんですねー:sweat:

**[Alfred](https://www.alfredapp.com/)**を導入してアプリの起動に対するショートカットキーは必要でなくなってきたので、**オリジナルのショートカットは一旦封印**しようと思っています。

※便利な**snap**の公式は[こちら](https://apps.apple.com/jp/app/snap/id418073146?ign-mpt=uo%3D4&mt=12)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/d55c3a69-e81f-f077-5193-5047a555ae48.png)

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

どなたかの参考になれば幸いです:relaxed:
【Python】if文を使ったファイル操作

#問題
フォルダが100個あり、その中に2つの画像が入っているべきである。
しかし、フォルダによっては1つしかない場合がある。

#目的
1つしか画像が入っていないフォルダのみを”mada”フォルダに集める。

#詳細
詳しい解説とコードは[【Python】if文を使ったファイル操作](https://www.aiprogrammers.net/entry/2020/04/19/012843)をご覧ください。
環境変数でJavaとMySQLのPATH を通してみる【Windows版】

##環境設定でPath を通す

環境変数で**「Pathを通す」**とは一体何をしているのか、また設定のやり方について説明していきます:grinning:

今回の記事:point_down_tone2:

- Pathとは?
- Pathを通す意味
- システム環境変数でのPathの通し方
- Pathが通ったかどうか確認

##Pathとは?
まずPathとは何かについてです。
**Path**とはその**アプリケーションの場所を示すアドレス**みたいなものです。
例を見てみましょう。

例：Java
そのPCのjdkをインストールした場所を示すのものがPathです。
「C:\Program Files\Java\jdk1.X.X_XXX\bin」


例：MySQL
「mysql.exe」というのがMySQLのアプリケーションなので、それの場所を指示している**「C:\Program Files\MySQL\MySQL Server 8.0\bin」**がPathになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/b34aebd0-f7a0-4a33-be37-d84212ac2f6e.png)

##Pathを通す意味
Pathとはアプリケーションの場所を示すものだとわかりました。
その「Pathを通す＝Pathを設定する」ことによってパソコンに**特定のプログラムを「プログラム名だけで実行できるようにして」**と頼んでることになります。


##システム環境変数でのPathの通し方

早速システム環境変数でPathを通していきましょう！

フォルダーのPCを右クリック→プロパティ(R)をクリック
<img width="512" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/28d4b339-093d-39d4-2d4e-375cfc00541b.png">

システムのページに行くのでシステム詳細設定を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/0d70ef6d-de40-76e8-0f10-a663bd819835.png)

システムのプロパティが出てくるので、環境変数(N)をクリック
<img width="341" alt="コメント 2020-02-28 091010.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/98076301-83ce-9571-9dcd-61a74b3fa301.png">

そこでPathを選択し→編集(E)
<img width="443" alt="コメント 2020-02-28 091108.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/f01f5dbe-2f49-b1c5-ed71-4a3f548e225b.png">

するとPathを入力する画面になります。
ここにPath(C:\Program Files\～)を入力しOKで完了です。
<img width="377" alt="コメント 2020-02-28 091633.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/0a5d6ad7-bf43-6c23-f36a-0aa86d3b277e.png">

##Pathが通ったかどうか確認
Pathが通ったかどうかの確認はコマンドプロンプトでできます。


例：Java
「javac -version」と打ってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/4c049961-3472-23f6-ef58-9f20932bb524.png)

上記のように帰ってくれば成功です。

例：MySQL
「mysql --version」と打ってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562982/d3b9123c-5dbd-40a8-4613-c29ab2e23c96.png)

上記のように帰ってくれば成功です。

「'～' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」とでてきた場合はPathがしっかり通っていませんのでご注意ください:bangbang:
最も簡単にパワフルなGolangのvim開発環境をSpaceVimで構築する

## はじめに

Vimでgolangを書く環境を整えたいと思っていたところ、SpaceVimを使ってそれがとても簡単にかつ満足度高く実現出来たので書いていきたいと思います。

> 前提としてSpaceVimが適用されていることが前提となりますので、インストールされていない方は、[こちら](https://qiita.com/sayama0402/items/5a9621ee58cf5255d254)で設定を行なってください。
> Golangのインストールなどについても解説しません。

## layersの追加

[このlayer](https://spacevim.org/layers/lang/go/)を使います。

`~/.SpaceVim.d/init.toml`に以下の記述を追加します。



```toml
[[layers]]
  name = "lang#go"
```

一度保存して、vimを開いてください。
vimのnormalモードで以下を実行します。

```vim
:GoInstallBinaries
```

上記実行後、gotagsをインストールするため、以下もターミナルで実行しておきましょう。

```sh
$ go get -u github.com/jstemmer/gotags
```

## 使い方

[key-bindings](https://spacevim.org/layers/lang/go/#key-bindings)に詳しい使い方は書いてありますが、以下に少し書いておきます。

| キーバインド       |       実行内容  |
|:-----------------|:-----------------:|
| space + l + b             | go build |
| space + l + r           | go run |
| space + l + h           | go info |
| space + l + M           | add import |
| space + l + t           | go test |