OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】コミットをクリーンにする手順。git diff -> git status

個人用メモです。
Gitでコミットをクリーンにする方法


##git status
まずは`git status`でgitの状態を確認する。


```terminal:
$ git status
On branch xxx
Your branch is up to date with 'origin/xxx'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)
	modified:  frontend (new commits, modified content)

no changes added to commit (use "git add" and/or "git commit -a")
```

**▼未対応部分**
ステージしていないファイルが存在している。

```
Changes not staged for commit:
 modified:  frontend (new commits, modified content)
```



<br>
##git diff
ステージに追加する前に`git diff`で変更内容を確認する。

| コマンド | 内容 |
|:--|:--|
| git diff  | ステージ前のファイル差分確認  |
| git diff --cached  | コミット前のファイル差分確認  |

```
$ git diff
diff --git a/frontend b/frontend
--- a/frontend
+++ b/frontend
@@ -1 +1 @@
-Subproject commit 228a7ffc18770d1aff28a46c7bb45057ee3d9fe5
+Subproject commit 228a7ffc18770d1aff28a46c7bb45057ee3d9fe5-dirty
```

`Subproject`とあるので、サブモジュールのあるディレクトリに移動してから`git diff`する必要がある。



<br>
##サブモジュールでgit diff
ディレクトリを移動し内容を確認

```
$ cd frontend/
$ git diff
diff --git a/components/table.vue b/components/article/table.vue
index fb8185e..0e6fc28 100644
--- a/components/article/table.vue
+++ b/components/article/table.vue
@@ -171,10 +171,10 @@ export default {

+    //ドラッグ選択処理
     endCell(){
       this.selectedCells = []

-      // 基点となるrowとcol
       const startCell = this.startCell
```

コメントアウトを変更（追加と削除）したのみ。特に重要ではないので、今回はこのステージ前の変更を削除する。


##git checkout .
ステージ前の変更を消して、クリーンなコミットの状態にする。

・`git checkout <パス>`
HEADを指定したパスに移動する。
ドット（.）を指定した場合、最新のコミットに戻る。

```
$ git checkout .
Updated 1 path from the index
```

<br>
##ステータスの確認
ルートディレクトリに戻って`git status`で状況を確認する。

```
$ cd ..
$ git status
On branch xxx
Your branch and 'origin/xxx' have diverged,
and have 181 and 3 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean
```


`nothing to commit, working tree clean`。これで、gitがクリーンになった。



<br>
##git reset と git checkoutの違い
以下はどちらも最新のコミットに自分のHEADを移動する。（直近の変更を取り消す）

`git reset --hard HEAD`
`git checkout .`


コミット番号SHAを指定すれば、そのコミットまで戻れる。

`git reset --hard 8b3e55e5`
`git checkout 8b3e55e5`


###違い
両者の違いは、`reset --hard`は指定したコミット以降の履歴は**すべて削除**する。

`checkout`はHEADの位置を移動するだけで、以降のコミットは**残った状態**になる。
Googleスプレッドシートで、プルダウンを連動させる

## やりたいこと
Googleスプレッドシートで、プルダウンを連動させる。

以下のように、カテゴリ、商品と2つのプルダウンがある場合に、カテゴリで選択した内容に基づいて、商品の選択肢を変える
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049264/15b9b934-7b7b-d8c1-6c9c-39f2fbf67306.png" width="300">
システム開発では、プルダウン（本記事だとカテゴリ）を選択した時に連動させるプルダウン（本記事だと商品）の選択肢を非同期で取得する、というのをやりますが、同じことをスプレッドシートで実現します。

僕の大好きなミスドの商品を使用して、以下のようにプルダウンの選択肢を絞れるように作りたいと思います。

▼カテゴリで「ポン・デ・リング」を選択した場合、商品は「ポン・デ・リング」の商品が選択できる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049264/6f2b184c-ff5f-dbd3-630e-b5003e238ed5.png" width="300">
▼カテゴリで「オールドファッション」を選択した場合、商品は「オールドファッション」の商品が選択できる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049264/515e8984-0310-f089-07b3-f0cdcf7a4f6e.png" width="300">

## プルダウンの選択肢になるリストを用意する

カテゴリと商品プルダウンの選択肢になるリストを作ります。
以下のようにA列がカテゴリ、B列以降が商品となっていて、紐付けたい商品を同じ行に記述します。
![プルダウンの選択肢になるリスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049264/19e545a1-6232-50e8-f4e5-7fa1c500cb76.png)

以下「ミスドカテゴリ商品リスト」シートと示します。

## 連動させるためのシートを作る

以下のようなシートを作ります。
![プルダウンを連動させるためのシート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049264/0e567f8d-15bc-3e64-2152-3c936dca5e2d.png)
このシートはA列がカテゴリ、B列以降が商品というのは先ほどと同様ですが、関数を使用して作成します。

A列は以下のようにします。

```
='プルダウン選択'!A2
```

「プルダウン選択」というのは、プルダウンで選択するシートです。
以下のようにプルダウンを作っています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049264/458ca5a6-cf53-1601-c7f8-cf5bdeffb5be.png" width="300">
つまり、

```
='プルダウン選択'!A2
```

というのはカテゴリプルダウンで選択した文字列になります。
セルの位置は双方のシートで一致するように指定します。
（本記事の例だとA2セル）

A3セル以降も同様です。
これで連動用のシートのA列はカテゴリプルダウンで選択した文字列が表示されるようになりました。

続いて、連動用シートのB列は以下のようにします。

```
=IFERROR(OFFSET('ミスドカテゴリ商品リスト'!$A$1, MATCH($A2,'ミスドカテゴリ商品リスト'!$A:$A, 0)-1, COLUMN(A2)),"")
```

「ミスドカテゴリ商品リスト」というシートが最初にリストを定義したシートです。
MATCH関数でA列（カテゴリプルダウンで選択した文字列）をリストから探して、該当のカテゴリの商品を取得しています。
B列以降は商品の数だけ同じ関数を使用します。
本記事の場合だとG列まで同じ関数を使用しています。
※列を固定にする箇所としない箇所があるので、ご注意ください。

結果、以下のようになりますが、2行目のE、F、G列にも関数が入っているという感じです。
「ポン・デ・リング」は商品が3つなので、D列までになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049264/83d7ad3c-f385-6920-0a4a-e9f881db0f65.png)

このようにA列、B列以降に関数を設定したら、各行にも同じように関数を設定しておきます。

以下「プルダウン連動用」シートと示します。

## スプレッドシートのデータの入力規則を設定

最後にプルダウンとして表示するセルに対して、データの入力規則を設定します。

まず、カテゴリプルダウンです。
カテゴリは単純にリストのA列（先頭行はヘッダーにしているので除く）です。

```
='ミスドカテゴリ商品リスト'!$A$2:$A
```

続いて、商品プルダウンです。
先ほど作成した連動用のシートの商品部分を指定します。
商品部分は選択したカテゴリによって、動的にリストを作るようにしたので、データの入力規則が変わらなくても選択するカテゴリが変わると選択肢が変わるという仕組みです。
それぞれのシートで行が対応するように作っているので、行は可変になるようにしています。

```
='プルダウン連動用'!$B2:$G2
```

## まとめ
こうやって文字に起こしてみると分かりにくい部分もあると思うので、実際にやってみるのが分かりやすいかと思います。
You've tried to invoke Spring when it's already loaded･･･ となり、rails sが出来なくなったときの対処法

#rails sが突然動かなくなった

railsを使ったポートフォリオを作成中、ローカルサーバーを起動したら突然、以下のようなエラーが表示された。

```
% rails s
You've tried to invoke Spring when it's already loaded (i.e. the Spring constant is defined).

This is probably because you generated binstubs with Spring 1.0, and you now have a Spring version > 1.0 on your system. To solve this, upgrade your bundle to the latest Spring version and then run `bundle exec spring binstub --all` to regenerate your binstubs. This is a one-time step necessary to upgrade from 1.0 to 1.1.

Here's the backtrace:

/Users/user/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/bootsnap-1.7.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:59:in `load'
（中略）
/Users/user/Desktop/rails_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
```

エラー解決のために、「You've tried to invoke Spring when it's already loaded (i.e. the Spring constant is defined).」で検索してみると、[この記事](https://teratail.com/questions/262483)を発見。
記事通りにやっていくと解決できた。

#解決方法
どうやら、インストールしたgemのバージョンが古いのが原因らしい。
該当のgemの最新バージョンを調べ、gemfileのバージョンを最新版に書き直した後、bundle installをしたら無事治った。
AWSの「RDSとは？」

##RDS
一言でいうと、マネージド型データサービスのことです。
EC2にデータベースの高度な機能がついたPassのクラウドモデルサービスの１つです。

これまでのデータベース管理では、構築、セキュリティ、バックアップ、スケーリングなど
管理するものが非常に多くとても大変でした。

RDSを使用することで、上記の管理を基本的に自動で管理してくれるようになるため、作業コストを減らすことができます。

###RDSの機能一覧は以下のような感じです。

**選べるエンジン**
以下のあらゆるデータベースエンジンの選択が可能。

- MySQL
- PostgreSQL
- AmazonAurora
- ORACLE
- SQLServer
- sMariaDB

**エンドポイント通信**
DNSで名前解決で通信をするので、障害の時の対応も自動でしてくれる。

**リードレプリカ**
データベースに参照用と更新用と分けることで負荷分散ができる。

**自動スナップショット**
スナップショットを自動で宛ててくれる。

**自動パッチ**
パッチを自動で宛ててくれる。

**パラメーター管理**
パラメーターの更新をGUIで簡単に操作ができる。


###RDSを使用する大きなメリット

**① Master-Slave（正副）構成を手軽に構築可能**
エンドポイントで接続しているため、万が一Master（正）に障害が起きてしまった際に、自動的にSlave（副）に切り替わる仕様になっているので、アプリケーション全体が落ちてしまうとう自体を防止することができます。

**②リードレプリカ構成を手軽に構築可能**
データベースを更新用と参照用に分けて負荷分散ができます。
メインで稼働しているMasterの負担を他のデータベースに振り分けることでMasterの負担を軽減することができます。

**③スナップショット（バックアップ）の機能**

- 定例スナップショット取得可能
- 手動スナップショット取得可能
- スナップショットから新たなRDSを構築可能
- スナップショットのコピー可能
- スナップショットのアカウント間コピー可能

**④パッチ当て機能**
メンテナンスウィンドウから適用可能。
時間指定をして適用時間をコントロールすることができる。

**⑤パラメーター設定**
パラメーターグループを使って設定値を変える。
設定変更のタイミングは、メンテナンスウィンドウから指定可能。


この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
STM32F767のMbedでの新規Lチカコンパイル


X何らかの方法でMbedにユザー登録しておく

1.compiler画面を開く
2.一番右上のボードボタンでNUCLEO-F767ZIを選ぶ
3.一番左上の「新規」をクリックする
4.プラットホームは、「NUCLEO-F767ZI」、テンプレートは、「mbed OS Blinky LED HelloWorld」、プログラムは、mbed-os-example-mbed5-blinky、プログラムとライブラリー
6.「OK」ボタンをクリックする
7.コンパイルする
8.コピーする
9.おわり

![mbed_767_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6085db75-5f66-3b06-ae58-402436f9dd5c.jpeg)
M1 mac インストール場所のメモ

#インストールするもの
*インストール場所
*PATH
ホームディレクトリ配下にあるファイルをvi/vim等でPATHを追記。
(bash)
~/.bash_profile

(zsh)
~/.zshrc 

*PATHの反映
source ~/.bash_profile
source ~/.zshrc 


#homebrew
/opt/homebrew
export PATH=/opt/homebrew/bin:$PATH

#mysql
/opt/homebrew/Cellar/mysql@5.7
export PATH="/opt/homebrew/opt/mysql@5.7/bin:$PATH"

#node.js
*nodebrewからnode.jsがインストールできなかったため、nvm経由でnode.jsをインストール。
brew install nvm
mkdir ~/.nvm
vi .bash_profile

``` 
//.bash_profileに追記

export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && . "/opt/homebrew/opt/nvm/nvm.sh"  # This loads nvm
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && . "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"  # This loads nvm bash_completion
```

nvm --version
nvm ls-remote
nvm i v15.5.0(バージョンは任意で)
node -v (インストール完了後バージョン確認)

#php
brew install php@7.4(PHP7.4の場合)
export PATH=/opt/homebrew/opt/php@7.4/bin:$PATH
Unityのプレハブとnewについて

Unityのプレハブを使っていて、引っかかる点があったので共有します。

プレハブにアタッチされているコンポーネントです。

```C#:PrefabAttach.cs
using UnityEngine;

public class PrefabAttach : MonoBehaviour
{
    SampleClass _sample = null;

    //SampleClassをnewするメソッド
    //自分のクラスを返却
    public PrefabAttach InstantiateClass()
    {
        _sample = new SampleClass();
        return this;
    }

    //SampleClassの中の、_countをログに表示するメソッド
    public void View()
    {
        Debug.Log(_sample._count);
    }
}

public class SampleClass
{
    public int _count;
}
```

シーンに追加されているオブジェクトにアタッチされているコンポーネントです。

```C#:PrefabAttach.cs
using UnityEngine;

public class PrefabLoader : MonoBehaviour
{
    void Update()
    {
        //Aキーが押されたとき
        if (Input.GetKeyDown(KeyCode.A))
        {
            //プレハブをリソースフォルダからロードし、SampleClassをnewしてから変数に入れる
            PrefabAttach attach = (Resources.Load("Prefab") as GameObject).GetComponent<PrefabAttach>().InstantiateClass();
            //SampleClassの_countをログに表示
            attach.View();

            //プレハブをリソースフォルダからロードし、Instantiateしてシーンに追加する
            GameObject game = Instantiate(Resources.Load("Prefab") as GameObject);
            
            //Instantiate前にプレハブの中のクラス、SampleClassをnewしたので、
            //きっとログに表示されるはず...
            game.GetComponent<PrefabAttach>().View();
        }
    }
}
```
```C#:実行結果
NullReferenceException: Object reference not set to an instance of an object
PrefabAttach.View () 
```

はいエラーです。

・プレハブをロードした後、シーンに追加する前にGetComponentできる
・シーンに追加する前にGetComponentしたコンポーネントへの参照と
  追加した後のコンポーネントへの参照は別物
・変数なら、プレハブに加えた変更を保持している
・プレハブのままクラスをnewしても意味がないよ

とりあえず今回わかったのはこんな感じです。
以上です。
Homebrewでエラー homebrew-core is a shallow clone.

# リライト
[こちら](https://omkz.net/archives/1)にリライトしました。

## エラー内容
`brew update`や`brew tap`をすると以下のようなエラーが出てしまいます。
`homebrew-core`と`homebrew-cask`が原因になってでエラーが出ています。

```
Error: 
  homebrew-core is a shallow clone.
  homebrew-cask is a shallow clone.
To `brew update`, first run:
  git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
  git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow
These commands may take a few minutes to run due to the large size of the repositories.
This restriction has been made on GitHub's request because updating shallow
clones is an extremely expensive operation due to the tree layout and traffic of
Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do this for you
automatically to avoid repeatedly performing an expensive unshallow operation in
CI systems (which should instead be fixed to not use shallow clones). Sorry for
the inconvenience!
```

## 解決策
解決策はエラー文中に出ているコマンドを実行することです。

```
git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow
```

## 原因
2020年12月以降にこのようなエラーが出ているようです。

HomebrewはこれまでGitリポジトリのshallow cloneを利用が、これからはcloneを利用して更新するように仕様変更になったからです。

なぜこのような仕様変更になったのかは、以下のディスカッションを参照してください。
[Why is a full clone of homebrew/core required for brew update?](https://github.com/Homebrew/discussions/discussions/226)

2020年12月4日の時点で該当がプルリクがマージされています。
[update.sh: refuse to update shallow homebrew-core/cask clones. ](https://github.com/Homebrew/brew/pull/9383)
[python] pandasでcsvを読み込む際のデコード問題を回避する

## ■やりたいこと
csvを```pandas```でデータを読み込もうと思ったら全件読み込めないままエラーも出ずに終了してしまった。
いろいろ調べてみたらデコードできない文字が混在している行が読み込めないようだということがわかった。
試行錯誤の結果、```codecs```を使えばいいらしい。


## ■解決策

* ```codecs```でcsvをopen
* ```errors```オプションを```ignore```にすることでエラーをスルーさせる
* ```replace```にすると、エラー箇所が```?```に置換される

## ■ライブラリ
* ```pandas```
* ```codecs```

## ■サンプルコード 
```python:test

import pandas as pd
import codecs

# 読み込むcsv
target = 'sample.csv'
# 出力先
out = 'output.tsv'

# csvをcodecsでopenする
# エラーは無視する
with codecs.open(target, mode='r', encoding='shift-jis', errors='ignore') as f:
    df = pd.read_csv(
            f,
            sep=',',
            engine='python',	# encodingのかわりにengine='python'にするとおまかせになるらしい
            # 特定のカラムだけ出力したい時はusecolsで設定する
            usecols=[
                'ID',
                'NAME',
                'COMPANYADDRESS__C',
                'CORPORATEADDRESS__C',
                'CORPORATIONNUMBER__C',
                'TDBCOMPANYCODE__C',
                'COUNTRY__C'
            ],
            # 一見数値に見えるカラムの値も文字として扱いたいので文字列にコンバートしておく
            # 何もしないと出力時に小数点以下がついたりするので注意
            converters={
                'ID': str,
                'CORPORATIONNUMBER__C': str,
                'TDBCOMPANYCODE__C': str
                }
    )

    # 出力
    df.to_csv(out, sep='\t',encoding='utf-8',index=False)
    
```
アルゴリズムってなんですの？

アルゴリズムとは、「手段」のこと！

アルゴリズムの正解は
・汎用性が高い
・処理が速い
・メモリ消費量が少ない
・わかりやすい

プログラムは指示・命令の集合体！

変数
数値や文字などの値を一時的に記憶しておくための領域のこと。
変数は一つしかデータを記憶できず、他の変数を入れると前のデータは消えてしまう。
変数には「グローバル変数」と「ローカル変数」がある。

スコープ
変数の有効範囲のこと

配列（リスト）
複数のデータを入れたければ、配列にいれる。
配列は0から始まる。

関数（メソッド）
特定の目的をもったコードの塊のこと。
関数を作成して使用することを、「関数を呼び出す」という。

探索（サーチ）
前から順番に探すアルゴリズムを線形探索という。
Rubyでの標準入力のあれこれ

#一行の要素を取得
##文字列
```ruby
string = gets.chomp

#標準入力
Spring

#出力
p string
=> "Spring"
```

##数値
```ruby
number = gets.chomp.to_i

#標準入力
100

#出力
p number
=> 100
```

#一行の複数要素を取得
##文字列
```ruby
line = gets.chomp.split

#標準入力
Spring Summer Autumn

#出力
p line
=> ["Spring", "Summer", "Autumn"]
```

##数値
```ruby
line = gets.chomp.split.map(&:to_i)

#標準入力
1 2 3

#出力
p line
=> [1, 2, 3]
```

#一行の文字列を一文字ずつ取得
```ruby
line = gets.chomp.split("")

#標準入力
SPRING

#出力
p line
=> ["S", "P", "R", "I", "N", "G"]
```

#複数行の要素を取得
##文字列
```ruby
array = []
while string = gets
  array << string.chomp
end

#標準入力
Spring
Summer
Autumn

#出力
p lines
=>  ["Spring", "Summer", "Autumn"]

#この書き方でも同じ結果になる
lines = readlines
i = 0
while i < lines.length
  lines[i] = lines[i].chomp
  i += 1
end

p lines
=>  ["Spring", "Summer", "Autumn"]

#この書き方でも同じ結果になる
lines = readlines.map(&:chomp)

p lines
=>  ["Spring", "Summer", "Autumn"]
```

##数値
```ruby
array = []
while number = gets
  array << number.chomp.to_i
end

#標準入力
1
2
3

#出力
p lines
=>  [1, 2, 3]


#この書き方でも同じ結果になる
lines = readlines.map(&:to_i)

p lines
=>  [1, 2, 3]
```
#複数行の複数要素を取得
##文字列
```ruby
array = []
while string = gets
  array << string.chomp.split
end

#標準入力
Spring Summer
Autumn Winter

#出力
p array
=>  [["Spring", "Summer"], ["Autumn", "Winter"]]

#この書き方でも同じ結果になる
lines = readlines
i = 0
while i < lines.length
  lines[i] = lines[i].chomp.split
  i += 1
end

#この書き方でも同じ結果になる
lines = readlines.map{|line| line.split}

p lines
=>  [["Spring", "Summer"], ["Autumn", "Winter"]]
```

##数値
```ruby
array = []
while string = gets
  array << string.chomp.split.map(&:to_i)
end

#標準入力
1 2
3 4

#出力
p array
=>  [[1, 2], [3, 4]]

#この書き方でも同じ結果になる
lines = readlines.map{|line| line.split.map(&:to_i)}

p lines
=>  [[1, 2], [3, 4]]
```
新しいことを学ぶには from エンジニアの知的生産術(マイピックアップ)

「[エンジニアの知的生産術](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E8%A1%93-%E2%80%95%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B3%E3%80%81%E6%95%B4%E7%90%86%E3%81%97%E3%80%81%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-WEB-PRESS-plus-ebook/dp/B07JFRF6MW/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2GRDGUXMBTF82&dchild=1&keywords=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E8%A1%93&qid=1608975046&sprefix=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%2Cstripbooks%2C272&sr=8-1)」 を読み、今の自分にとって大切な考え方をピックアップ！


# 第1章. 新しいことを学ぶには

「学び」に対して、「やる気」は強い原動力。
ただし、「やる気」はリソースと考えて、**今やる気が出ないものに対しては無理に学ぶことをあきらめて、よりやる気の出るものに気持ちを切り替える**
→ この戦略の方が時間を有効的に使える

## 知りたいところから学ぶ

前提条件

- 目標が明確化されている (ex: Pythonのリストと多プルの違いについて知る)
- 目標が達成可能である 
- **大まかに**全体像を把握している (全て理解するのではなく情報がまとまっているサイト、本などを知ることであとから何度でも参照すればよい)



### 本を1ページ目から読んでいくのではなく必要なところから飛び飛びに読んでいく(遅延評価的勉強法) 

- やる気の出るところから！　
- 後で断片的に組み立てることにより**自分なりの情報処理が入るため記憶がしやすい**

### YANGIの原則(気になるものだけを学ぶ)

- 時間は貴重であるため「必要になるかも」で学び、必要なかった場合は時間の無駄になる
- 必要なもの = やる気の出るものとは限らない。今の自分にとって気になるものだけ学ぶ
- **全体を通して読む必要はない!** 面白そうなところをつまみ食いして先人の知恵を学べば十分

## 知りたいことが具体的に決められない場合

この状態は、何から学べば効率が良いかを判断する材料が揃っていない。
→ **わからないことの効率を考えるより片っ端から情報を手に入れていく必要がある**

※ただし、「必要なところだけ手を動かす」が出来ないかを考えることで効率を上げる

- 目標のゴールを近く設定する
- プログラミング写経は、**既存の知識と異なる部分を学ぶ際にやればよい** = 自分には写経する必要がないと感じる時期が来た場合は、新しい挑戦をしていないと思った方がよい。


## 抽象化の必要性

抽象化とは、具体的なものから特に体制つな部分だけ抜き出すこと。
抽象化によって、解決方法のパターンを得ることで、新しい問題を解けるようになる。


### パターンを発見する

具体的な事例を集めて、共通した部分があればそれは非常に有用なポイント
→ **パターンを抜き出して抽象化すればいろいろな要素に活用できる**

### ソースコードの歴史から学ぶ

ソースコードは基本的に「今」の「how」の情報しかない。
- 過去の情報から「なぜ変更する必要があったか」「なぜこの方法を選んだのか」を知ることにより、**今のソースコードの必要性が理解できるようになる**。
- コミット履歴を見ることは、whyの意図を知ることが出来るかも


### 本から学ぶ

本は、著者の具体的な経験から書かれている。
→ **いろいろなジャンルの本からの情報・知識をもとにパターンを見出し、活用する必要がある。**


### 理解を検証する

自分がわかっていないことに気付くことが出来なければ学びを進めていくことが出来ないため、理解を検証することが大切。

- 自分の言葉で説明できるか?
- 自分の経験に基づいた具体例を挙げることが出来るか?
- 自分の目的を達成するためにその知識を使えるか?

↑　3つが出来っていれば「自分の知識」
辞書について（Ruby学習後のPython初学）

#ディクショナリ（辞書）
####辞書とはまとまったデータをテキスト（キー）で扱うもの
#####主に辞書はDBとのやりとりをキーを用いてデータ処理をする時などに便利となる

```python:qiita.py
dic = {"single":1, "double":"two"}
#リストと違って波括弧を用いる

len(dic) #辞書の中身の数
print(len(dic)) #この場合は2

#データ追加する場合
dic["triple"] = "three"

#変更する場合
dic["triple"] = 3

#削除する場合
del dic["triple"] #"triple":3がdicから削除される
```
キーには変数も代用できるが、存在していないキーであればエラーとなる
kintone REST API でアプリ一覧を取得する

kintoneのREST APIを使ってみます。

公式ドキュメントはこちらです。
https://developer.cybozu.io/hc/ja/articles/201941754

## 準備

> リクエストヘッダに「X-Cybozu-Authorization」を追加し、「ログイン名:パスワード」をBASE64エンコードしたものを値に指定します。

とのことなので「ログイン名:パスワード」をBASE64でエンコードしてください。
検索すれば文字列をエンコードしてくれるサービスがでてきます。

- base64エンコード/デコードツール
    - https://www.en-pc.jp/tech/base64.php

例：ログイン名が「Administrator」、パスワードが「cybozu」の場合
「Administrator:cybozu」 → QWRtaW5pc3RyYXRvcjpjeWJvenU=

## アプリ一覧を取得

```http
GET /k/v1/apps.json HTTP/1.1
Host: example.cybozu.com:443
X-Cybozu-Authorization: QWRtaW5pc3RyYXRvcjpjeWJvenU=
```

Basic認証が必要であれば公式ドキュメントにある通り、AuthorizationにX-Cybozu-Authorizationと同じ内容を設定してください。

```http
GET /k/v1/apps.json HTTP/1.1
Host: example.cybozu.com:443
X-Cybozu-Authorization: QWRtaW5pc3RyYXRvcjpjeWJvenU=
Authorization: Basic QWRtaW5pc3RyYXRvcjpjeWJvenU=
```

## アプリ情報を取得
取得するアプリのIDをパラメーターのidを指定してください。

```http
GET /k/v1/app.json?id=1 HTTP/1.1
Host: example.cybozu.com:443
X-Cybozu-Authorization: QWRtaW5pc3RyYXRvcjpjeWJvenU=
```

## アプリに登録されているレコード一覧を取得
接続するアプリのIDをパラメーターのappに指定し、そのアプリで取得したAPIトークンをX-Cybozu-API-Tokenに設定してください。

```http
GET /k/v1/records.json?app=1 HTTP/1.1
Host: example.cybozu.com:443
X-Cybozu-Authorization: QWRtaW5pc3RyYXRvcjpjeWJvenU=
X-Cybozu-API-Token: APIトークン
```


# 参考
- [kintone REST APIの共通仕様](https://developer.cybozu.io/hc/ja/articles/201941754)
- [APIトークンを使ってみよう](https://developer.cybozu.io/hc/ja/articles/202463840-API%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)
- [アプリ情報の取得](https://developer.cybozu.io/hc/ja/articles/202931674-%E3%82%A2%E3%83%97%E3%83%AA%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%96%E5%BE%97)
- [kintone REST APIでアプリの一覧情報を全件(100件以上)取得する方法](https://www.ait-labo.com/kintone-customize/2571/)
【Git】サブモジュール (submodule)が複数ある場合の便利コマンド。git submodule foreach

サブモジュール (submodule)が複数ある場合に、各サブモジュールで同じコマンドを実行したい場合にforeachが便利。

```
$ git submodule foreach <コマンド>
```

コマンドに記述した処理を各サブモジュールで実行してくれる。



<br>
##実例
例えば、(1)deploy, (2)frontend, (3)widget, (4)proto, (5)vuetify-resourcesの５つのサブモジュールがあるプロジェクトで、各サブモジュールの直近１つのコミットを表示した場合。


`$ git submodule foreach git log -n 1 --oneline --graph`

```
$ git submodule foreach git log -n 1 --oneline --graph

Entering 'deploy'
* ee83e50 (HEAD -> master, origin/master, origin/deploy, origin/HEAD) [F].env
Entering 'frontend'
*   228a7ff (HEAD, origin/master, origin/HEAD) Merge pull request #42
|\
Entering 'widget'
* 6785b9d (HEAD -> master, origin/master, origin/HEAD) [fix]reply
Entering 'proto'
* 50fc21f (HEAD -> master, origin/master, origin/HEAD) [fix]mini brand
Entering 'vuetify-resources'
*   fbe2572 (HEAD, origin/phone, origin/eugene) Merge pull request #115 from cyber-owl/eugene
|\
```


`Entering`で各サブモジュールに入り、最新コミットを表示している。


<br>
##使い道の例

####直近１０個のログを表示
`$ git submodule foreach git log -n 10 --oneline --graph`


####masterからプル
`$ git submodule foreach git pull origin/master`


####ファイル差分を表示
`$ git submodule foreach git diff`

など。
update_all で更新かけられると after_commit がフックしない

という事象に出くわしてちょっとハマったので、メモをとりあえず残しておく。

起こった時のバージョンは Rails 5.1.6
調べてないけど現在は解消されているのだろうか？ (そもそもの挙動を考えると多分そのままな気がする）

ほぼ下記の事例と同じ状況で、回答者の内容を deeplしたのがこちら。
https://stackoverflow.com/questions/10921919/after-commit-not-getting-called-after-update-all

```
原文:
The way after_commit works is that whenever a record is saved it gets added to a list of records. When the transaction gets committed, rails iterates over that list calling the after commit hooks on each one.

When you do update_all the instances aren't saved individually (since they aren't actually loaded at all - rails doesn't actually know which rows were updated) and so they don't get added to the list that power after_commit.

destroy_all is different because it does actually load all the instances and delete them one by one, firing all callbacks. You'd observe similar behaviour to update_all if you used delete_all

訳文:
after_commitの動作は、レコードが保存されるたびにレコードのリストに追加されます。トランザクションがコミットされると、railsはそのリストを繰り返し処理し、それぞれのレコードに対してafter commitフックを呼び出します。

update_allを実行した場合、インスタンスは個別に保存されず（実際には全くロードされていないので - railsはどの行が更新されたかを実際には知りません）、after_commitを実行するリストに追加されません。

destroy_allが違うのは、実際に全てのインスタンスをロードして、全てのコールバックを発生させて一つずつ削除するからです。delete_allを使用した場合、update_allと同様の挙動を見ることができます。
```
【Laravel】エラー対処法。'parse': 767: unexpected token at ''

Dockerを使って起動したLaravelのプロジェクトで以下エラーが出た場合の対処法について。

ネットで検索するとエラーが発生する条件がいろいろあるようなので、次の状況の場合の解決法。

##発生状況
プロジェクトはAPIを利用しており、APIから取得したデータを表示するページでエラーが発生。

プロジェクトトップは正常に表示されているが、特定のページを開くと40４になる。


dd関数（またはdump関数）でデバッグすると以下が表示される。


```
Traceback: `parse': 767: unexpected token at ''
```

APIにアクセスするための暗号（トークン）が違う。というエラー。


<br>
##発生原因
APIを提供しているサーバーの環境環境が変わり、それに伴って環境変数（.env）が変化していたが、アップデートをしていなかった。

このため、APIにはアクセスできていたが、欲しいデータにアクセスできなかった。


<br>
##対処法
APIを提供しているサーバーのデータをgit pullしてアップデート。

今回の対象はサブモジュールで扱っているファイルだったため、`submodule update`で更新。（親のレポジトリを更新するだけではsubmoduelは更新されない）


<br>
##.envファイル更新時の注意点
###1. 置き場所はルートディレクトリ
プロジェクトのルートディレクトリ以外の場所で更新した場合は、ルートディレクトリにコピーする必要がある。


<br>
###2. 独自の環境変数を消さないように
自分専用の環境変数を使っていた場合、上書きすると消えてしまうので注意。
【Ruby】意外と知らないクラスとモジュールの関係性を簡単に理解する

クラスとモジュールの関係性について、あまり知らない人も多くいるのではないでしょうか。

今から、初心者に向けたクラスとモジュールの関係性について解説していきます。

これに関しては、理解していた方が今後スムーズにRubyを使うことができると思うので、是非一読してみてください。

## 全てのクラスはモジュールである

まず、「全てのクラスはモジュールである」ということについて話していきます。

RubyにClass.superclassという問いをしてみると、Moduleと返ってきます。

つまり、「全てのクラスはモジュールである」と言えます。

初心者のモジュールに対するイメージは、「クラスの中で使える便利なオブジェクト」程度でしょう。

これだと、「クラスの方が上の存在で、モジュールは普段存在しないけど必要な時にだけ現れる便利なツール」のように聞こえる。

でも実はそうではないのです。

全てのクラスはモジュールであって、常にクラスとモジュールは切って離すことができない関係なのです。

## 普段みんなが定義してるクラスってさ、Classクラスのインスタンスだよ？知ってた？

見出しに関しては先に謝罪しておきますが（すみません笑）、

別に、Classクラスのインスタンスという概念を知らない人を挑発したいわけではなく、この方がちょっと印象的かなと思っただけなんです。。（汗）

という冗談はさておき、皆さんは普段、下記のようにクラスを定義しているはずです。

```ruby
class ClassA

end
```
このClassAはインスタンスだということです。

今混乱したでしょう？そうでしょう？？

え、舐めてもらっちゃ困るって？そう思った方には素直にすみません。、

えっと、話を戻して、普段皆さんは、インスタンスとはどのようにお考えになっているでしょうか。

多分、初学者の皆様は「クラスから生成される実態のこと」のようなイメージだけ思い浮かべるでしょう。

例えば、クラスは鯛焼き機のことで、インスタンスとは鯛焼きのことである。的な？

そして、普段皆さんが定義しているクラスは、Classクラスのインスタンスなんです。

つまり、Classクラスのインスタンスであるクラスを生成して、クラスのインスタンスを生成するわけです。

しっかり伝えられたでしょうか？？

## Classクラスとモジュールに深い関係がある

普段皆さんが定義しているクラスはClassクラスのインスタンスだということを話しました。

それは、普段皆さんが定義しているクラスのスーパークラスはClassクラスということになります。

そして、Classクラスのスーパークラスがモジュールになります。

## まとめ

どうだったでしょうか？？

僕はこのように少し深いところでの繋がりがわかる瞬間がとても大好きで、それを皆さんに共有したいなと思い記事を書かせていただきました。

伝え方の問題でわかりにくいところがありましたら、コメントなどでお知らせいただけましたら修正いたします。

そして、今回の記事をまとめますと、全てのクラスはモジュールであるということと、

皆さんが普段定義しているクラスのスーパークラスはClassクラスであり、Classクラスのスーパークラスがモジュールであるということです。

今後もRubyに関することを中心に、面白いと思ったことを共有いたしますので、よろしくお願いいたします！
Ｌピカ

ラズパイ2日目　Lピカ　Ｌチカ

まずはＬピカ

LEDライトは足が長い方が+極、短い方が－極

ラズパイのピンは裏が□の位置が1番ピン
その外側が2番ピン、以降、1番の下が3番、2番の下が4番…と続いていきます。

通電しているピンは、1番と17番が3.3V 2番と4番が5Vでの電源ピンです。
－極を指すピンはGNDピンで、6番、9番 14番 20番 25番です。
残りのピンはGPIOピンで、ラズパイ側から電気のオンオフを制御できます。
GPIOの並びは複雑です。なぜ。
3番　GPIO2
5番 GPIO3
7番 GPIO4
8番 GPIO14
10番 GPIO15
11番 GPIO17
12番 GPIO18
13番 GPIO27
15番 GPIO22
16番 GPIO23
18番 GPIO24
19番 GPIO10
21番 GPIO9
22番 GPIO25
23番 GPIO11
24番 GPIO8
26番 GPIO7
29番 GPIO5
31番 GPIO6
32番 GPIO12
33番 GPIO13
35番 GPIO19
36番 GPIO16
37番 GPIO26
38番 GPIO20
40番 GPIO21

Lピカ
1番ー　ジャンパーケーブル　ーブレッドボードi1
h1ー抵抗器220Ωーh4
f4ー +極　LED　-極　ーf5
i5ー　ジャンパーケーブル　ー　6番

これで着きました。
ラズパイ準備

ラズパイ1日目　準備
ラズベリーパイを購入しました。
キットを購入すればよかったですが、なんとなくバラ買いに

ラズベリーパイははんだ付け無しで工作が可能です。
必要な道具は
ラズベリーパイ
GPIO　Hammer header 　取り付けるとオス型ピンになります。
ブレッドボード
ジャンパーワイヤ―
マイクロSD
SDカード

ラズベリーパイの購入
https://www.switch-science.com/catalog/3200/
GPIO Hammer headerの購入
 https://www.switch-science.com/catalog/3189/


OSのインスト―ル
まずはパソコンにラズビアンをインストール
https://www.raspberrypi.org/software/

インストールしたら、起動し、SDカードに書き込みをする。
左側　choose OSから　Rasberry Pi OS(32 bit)を選択
choose card からmicro SDカードを選択
右側のwriteを記入

書き込み完了後、continueをクリックし、終了。SDカードを抜く


microSDカードをラズパイに差し込む。
電源をつないげば自動的に起動します。

まず、画面上部の黒字に”＞＿”と書いてあるところを開く
$ sudo apt-get update
$ sudo apt-get upgrade
を入力して、enterを打つ
処理が完了するまでしばらく時間がかかります。

ここまでで準備完了です。
Ｌチカ

Ｌチカ


Lピカの配線から一か所変更して、
電源を取る位置を3番　GPIO2にします。

ラズパイのデスクトップから
スタート＞プログラム＞Thonny Python IDE を起動します。

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(2,GPIO.OUT)

try:
while True:
GPIO.output(2, GPIO.HIGH)
sleep(0.5)
GPIO.output(2,GPIO.LOW)
sleep(0.5)

except KeyboardInterrupt:
pass

GPIO.cleanup()

を入力するとチカチカしました。　大文字、小文字なども注意が必要でした。

import RPi.GPIO as GPIO
from time import sleep
GPIO.～～～とsleepを使えるようにするための文

GPIO.setmode(GPIO.BCM)
GPIO.setup(番号,GPIO.OUT)
番号（今回はGPIO2)を使うよ～準備してね～という意味の文

try:


except KeyboardInterrupt
エラーが起きたときにいい感じにしてくれるための文らしい

while True
繰り返しをするための文

GPIO.output(2, GPIO.HIGH)
2番に電流を流して、という文

sleep(0.5)
次の行に進むまで0.5秒待ってと言う文

GPIO.output(2, GPIO.LOW)
2番に電流を流すなという文

コードの実行は　ctr+D で開始します。
コードを止める時は　ctr+Cで止まります。
[rails] Bootstrap4のアイコンをsubmitボタンに埋め込む

#概要
[![Image from Gyazo](https://i.gyazo.com/2799cdc41ad6e6625d1accb56044f81b.png)](https://gyazo.com/2799cdc41ad6e6625d1accb56044f81b)
　　　　　　↑を↓に変更する方法をメモしています。
[![Image from Gyazo](https://i.gyazo.com/069261e44091538b9d378a69b4a25390.png)](https://gyazo.com/069261e44091538b9d378a69b4a25390)

```_header.html.erb
 <form class="d-flex">
   <%= search_form_for @search, url: articles_path do |f| %>
     <%= f.text_field :text_cont, class: "form-control me-2", type: "search", placeholder: 'キーワードを入力' %>

     <%= f.submit "検索", class: "btn btn-outline-secondary" %>

   <% end %>
 </form>
```

　　　　まず結論、↑が"検索"ボタンのコード、↓がsearchアイコンのコードです。
　　　　変更するとsearchアイコンを埋め込むことができ、アイコンをクリックす
　　　　ると正しく検索もできます。

```_header.html.erb
　<form class="d-flex">
    <%= search_form_for @search, url: articles_path do |f| %>
      <%= f.text_field :text_cont, class: "form-control me-2", type: "search", placeholder: 'キーワードを入力' %>

      <%= button_tag type: 'submit', class: "btn btn-outline-secondary" do %>
        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16">
          <path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/>
        </svg>
      <% end %>

    <% end %>
  </form>
```
#解説
<%= f.submit "検索", class: "btn btn-outline-secondary" %>を
<%= f.submit アイコンのHTML, class: "btn btn-outline-secondary" %>のように
書いて、ずーっとSyntax errorが発生していました。書き方を知らなかったからです。

<%= button_tag type: 'submit', class: "btn btn-outline-secondary"  do %>
　　アイコンのHTML
<% end %>

調べると、↑のように書けば良いことがわかりました。
button_tagは、ボタンを生成してくれるメソッドです。
button_tag([オプション or データ属性 or HTML属性 or イベント属性])

#因みに
button_tagではなくbutton_toを使うと下記になりました。
[![Image from Gyazo](https://i.gyazo.com/f8bd283d8b3ee0c073bf5f6f8f7d9587.png)](https://gyazo.com/f8bd283d8b3ee0c073bf5f6f8f7d9587)
現状、検索の挙動はどちらのメソッドを用いても正しく動作していたので、お好みの方を使って良いんじゃないかなと思っております。
２つのメソッドの違いは何なのか今後必要な際、調べていきますね😌
CERNのROOTをMacOSで使えるようにする

# 準備

## Xcodeのコマンドラインツールを入れておく

ホームディレクトリで

```bash
xcode-select --install
```

これが入っていないと、ROOTを入れたとしても正しく機能しない。

## XQuartzを入れておく

[XQuartzのページ](https://www.xquartz.org/)から最新版を選んでダウンロードし、インストールしてうまくいったらPCを再起動。XQuartzはCERNなど外部のマシンなどにSSH接続しているときにそのマシンROOTのTBrowserなどのGUIを自分のMacで表示するために必要。

# ROOTを入れる

## ダウンロードして解凍して/usr/localへ移動

[ROOTのリリース一覧](https://root.cern/install/all_releases/)から最新のリリースを選び、`Binary distributions`の中から自分のOSに最も合いそうな`tar.gz`ファイルを選んでダウンロード。
ターミナルのコマンドでやるなら

```bash
curl -O https://root.cern/download/root_v6.22.06.macos-11.0-x86_64-clang120.tar.gz
```

のような感じ。このコマンドを打ったディレクトリ内に`tar.gz`が入るので、

```bash
tar -xzvf ファイル名.tar.gz
```

で解凍。すると同じディレクトリ内に`root`ディレクトリが作られるので、これを

```bash
sudo mv root /usr/local
```

で`/usr/local`へ移す。

## PATHを通す

ホームディレクトリで`.bashrc`ファイルを編集。以下の行を一番下に足す。

```bash:~/.bashrc
source /usr/local/root/bin/thisroot.sh
alias root='root -l'
```

一旦ターミナルを閉じてもう一回開き、どのディレクトリ内でも良いので`root`コマンドを実行してみる。あとは雰囲気で成功したか失敗したかわかると思う。
成功したと思ったら

```
1+1
```

を実行して2が返ってくることを確かめてみると良い。これで失敗したらXcodeのコマンドラインツールのインストールがうまくいっていない可能性あり。もしくは次節参照。

また、(自分のMacにROOTを入れる話とは関係ないが、)外部のマシンにSSH接続してrootを同様に起動し、

```
TBrowser a
```

を実行したときに3分以上待っても自分のMacに何のGUIも表示されなかったら、XQuartzが正しく入っていない可能性あり。

## もしうまくいかなかったら

MacBook Pro (13-inch, M1, 2020)でMacOS 11.2を使って試したら`root`コマンドを打ったときに

```
warning: no such sysroot directory: '/Library/Developer/CommandLineTools/SDKs/MacOSX11.0.sdk'
```
というメッセージが出てきてうまく起動しなかった。

```bash
sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk /Library/Developer/CommandLineTools/SDKs/MacOSX11.0.sdk
```

のようにしてコマンドラインツールのシンボリックリンクを作成してもう一度試したらうまくいった。
CentOS 8（CentOS 8 Stream）にdnfでGoをインストールする

# What's？

CentOS 8に、Goを`dnf`でインストールしたい、ということで。

結果的に、CentOS 8 Streamに変換することになりましたが。


# 環境

確認した環境は、こちらです。

```shell
$ cat /etc/redhat-release
CentOS Linux release 8.3.2011


$ uname -srvmpio
Linux 4.18.0-240.10.1.el8_3.x86_64 #1 SMP Mon Jan 18 17:05:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
```

# CentOS 8にインストールできるGoの情報

Goのダウンロードページには、Linux向けの`tar.gz`ファイルが取得できるようになっています。

[Download and install ](https://golang.org/doc/install)

一方で、GoのGitHubリポジトリのWikiには各プラットフォーム向けの情報があるのですが、ここにCentOSやRHELのものはありません。

[Platform Specific Information](https://github.com/golang/go/wiki#platform-specific-information)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/217dc47f-87cd-cfe8-9420-7d8b2646fc06.png)

とりあえず、現時点でのCentOS 8でGoのパッケージ情報を見てみます。

```shell
$ sudo dnf info golang
Last metadata expiration check: 0:05:50 ago on 2021年02月05日 03時23分42秒.
Available Packages
Name         : golang
Version      : 1.14.12
Release      : 1.module_el8.3.0+605+410c5674
Architecture : x86_64
Size         : 703 k
Source       : golang-1.14.12-1.module_el8.3.0+605+410c5674.src.rpm
Repository   : appstream
Summary      : The Go Programming Language
URL          : http://golang.org/
License      : BSD and Public Domain
Description  : The Go Programming Language.

```

Go 1.14ですね。現在のGoが1.15.8なので、もう少し新しい方がいいかなと。

ここで、[rpmfind.net](https://rpmfind.net/linux/RPM/)で`golang`を探してみます。


[RPM resource golang](https://rpmfind.net/linux/rpm2html/search.php?query=golang)

よーく見ると、CentOS 8 Streamに変換すればGo 1.15が入りそうです…。

# CentOS 8 StreamにGoをインストールする

というわけで、CentOS 8をCentOS 8 Streamに変換します。

```shell
$ sudo dnf install centos-release-stream
$ sudo dnf swap centos-{linux,stream}-repos
$ sudo dnf distro-sync
```

パッケージのインストールを実行し、しばらく待つとCentOS 8 Streamになります。

```shell
$ cat /etc/redhat-release 
CentOS Stream release 8


$ uname -srvmpio
Linux 4.18.0-269.el8.x86_64 #1 SMP Tue Jan 12 17:55:05 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
```

`golang`のパッケージの情報が、1.15.5になりました。これくらいならよいでしょう。

```shell
$ sudo dnf info golang
メタデータの期限切れの最終確認: 0:07:12 時間前の 2021年02月05日 03時38分51秒 に実施しました。
利用可能なパッケージ
名前         : golang
バージョン   : 1.15.5
リリース     : 1.module_el8.4.0+586+97b59638
Arch         : x86_64
サイズ       : 707 k
ソース       : golang-1.15.5-1.module_el8.4.0+586+97b59638.src.rpm
リポジトリー : appstream
概要         : The Go Programming Language
URL          : http://golang.org/
ライセンス   : BSD and Public Domain
説明         : The Go Programming Language.

```

インストール。

```shell
$ sudo dnf install golang
```

確認。

```shell
$ go version
go version go1.15.5 linux/amd64
```

というわけで、CentOS 8にGoをインストールするつもりが、`dnf`を使ってインストールする場合に1.15を選ぼうとするとCentOS 8 Streamになりました、と。
【初心者向け】Reactの雛形を一発で作成する方法



# 結果

### 「rafce」と入力しEmmetを利用

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689344/0496e9d7-dc2f-5ed7-f5e4-7b14dc03a26f.gif)


※エディタはVsCode
VsCodeの拡張機能ES7 React/Redux/GraphQL/React-Native snippetsが必要

#　まとめ
雛形を作成するようなショートカットは早めに覚えておくと便利だと思いました。
【macOS】Web会議システム切り忘れ防止: カメラがアクティブかどうか知りたい！

# Web会議システムの問題
1. カメラをOFFのまま参加している人が多く、表情が読めないことが多い
2. 会議中に別の作業をしている人がいる
3. 切ったつもりのWeb会議システムがアクティブのままでイケナイものが写ってしまう

などなど、様々な問題が発生しています。

コロナ禍でWeb会議が増えている中、切り忘れによって、写ってほしくない油断した姿などが防止できればと思い、今回は、
**3. 切ったつもりのWeb会議システムがアクティブのままでイケナイものが写ってしまう**
を、macOSのコマンドラインでどうにかカメラのアクティブ状況をウォッチできないかというところの暫定解決策です。

# やりたいこと
MacBookを利用している方はわかると思うのですが、Mac標準のカメラがActiveの場合はカメラ横の緑のランプが点灯します。

ただし、外部カメラなどを利用していると、ランプが付かないものがあったりと、それにすら気づかない事があるため、この条件に近しい形で、カメラが起動しているか否か、また、どのアプリで利用しているかをMacの通知を利用し、別の作業をしていても通知で気付ける状態を作りたい。

## 先に結論
カメラの起動状況を検知することは出来なかったのですが、主にWebRTCで通信をしていると、UDPでの通信が発生するため、この通信をチェックすることで一定ラインの監視をすることは出来ました。

# 今回とった手段
## 調査
- macOSに緑のランプが点灯した情報がサラリと採れるインターフェースが無いか
    - → 簡易的に取得する手段はなさそう
- Web会議ソフトのプロセス監視
    - → 起動しているだけだったり、ブラウザベースだったりという状況もあるので意味無しと判断
- 通信状況のチェック
    - WebRTCの通信状況をチェック
        - カメラの起動状況は分からないが、その通信が発生している時点で危険と判断
    - **今回はこちらで進めました**

## 概要
Web会議システムの通信はUDPでの通信

`local → 特定のサービス`

が発生するため、

1. この通信をチェックし
2. その通信を検知したら
3. Macの通知でアラートを出す

という至ってシンプルなものです。

## ステップ

### 1. この通信をチェックし

まずはWebRTCの利用をしている場合、UDP通信がlocalIPアドレスから不特定のIPに対して継続的に発生します。
これを検知するため、 `lsof` コマンドを利用し、UDPでの通信をチェックします。

```Terminal
$ lsof -iUDP
```

このままだと、名前解決もやろうとするので時間がかかるため、IPでの表示オプション `-n` と、ウェルノウンポートの名前としてではなく、ポート番号を表示するオプション `-P` を追加します。

```Terminal
$ lsof -iUDP -n -P
```

この結果でUDPでの通信が自身のIPアドレスから発生しているものが今回の絞り込み対象となります。

なので、上の実行結果から自身のIPアドレス

```Terminal
$ ipconfig getifaddr en0
> 192.168.1.30
```

が含まれる通信がWeb会議システムの利用で使われていそうな通信と判断しています。

```Terminal
# これが対象となるもの
$  lsof -iUDP -n -P | grep `ipconfig getifaddr en0`
```

### 2. その通信を検知したら, 3. Macの通知でアラートを出す

ここから先はシェルスクリプトに落としています。

```sh
# 自身のIP
SELFIP=`/usr/sbin/ipconfig getifaddr en0`
# 1. 通信のチェックの部分を絞り込んだものから、アプリ名をawkで取得
UDPPROCESS=`/usr/sbin/lsof -iUDP -n -P | grep ${SELFIP} | awk '{print $1}'`

# UDPPROCESSにデータがあったらMacへ通知
if [ "$UDPPROCESS" ]; then
    MESSAGE="${UDPPROCESS}でカメラ起動してるかも"
    osascript -e "display notification \"${MESSAGE}\" with title \"UDP Alert\""
fi
```

しばらくcrontabに設定入れて試してますが、今の所いい感じに動いています。
（Web会議中はずっと出てきます。）

ソースは [github](https://github.com/mcfish/watch_using_camera_for_mac) にあげてます。

もっといい方法や改善点思いついたら更新します。

## 注意点

普段利用しているツールの中でUDPの通信が常に走り続けるようなツールが入っていると常に警告が出てしまうので、そういったツールがある場合は `grep` コマンドの部分で除外してください。

また、ChromeなどはまれにUDPの通信を行っており、タイミングによってはそちらを拾ってしまうため、誤検知が発生するケースもありますorz

#### 2021/02/06 - 追記
zoomは調査時はUDP通信が発生していたのですが、常時発生するわけではないようでした。
[websocketとwebassemblyを使っている](https://qiita.com/ynwa0826/items/66ea83d4b851df4ce37d)ようで、使用時に通知が出ない場合があるようです。
（要調査）

また、chromeではQUICの実装によってUDP通信が発生するケースが多く、今朝起動したところアラートが出続けていました。
※ chromeでのquic通信は chrome://net-internals/#quic で見ることが出来ます。

また、カメラとマイクの利用状況を監視するMacアプリとしては OverSight というものがあるようですが、途中から通信内容での検知に脳が切り替わっていたので継続して調査しますｗ （@sohsatohさん、コメントありがとうございます。）
【WordPress】アイキャッチ画像を挿入しよう

# はじめに
自分のテンプレートをゼロから作った場合、投稿するときにアイキャッチ画像が挿入できない。そこで、今回はアイキャッチ画像を挿入できるようプログラムを書き換えよう。

# 手順
- `functions.php`を作成する。(`function.php`にしないように)

```functions.php
<?php
add_action('init', function(){
  add_theme_support('post-thumbnails');
});
```
phpの閉じタグが最後に来る場合、`?>`を省略することが可能。

- 投稿にアイキャッチ画像を表示させる

`<?php the_post_thumbnail(); ?>`

```single.php
  <?php
  $id = get_post_thumbnail_id();
  $img = wp_get_attachment_image_src($id);
  ?>
  <header class="masthead" style="background-image: url('<?php echo $img[0]; ?>')">
```

サムネイルを表示させるには、
`<?php the_post_thumbnail(); ?>`
という一文を書き加えれば良い。

- 画像のサイズを変更

画像のサイズを調整したい場合は、
`<?php the_post_thumbnail(array(32,32)); ?>`
と引数を入れれば良い。

```single.php
  <?php
  $id = get_post_thumbnail_id();
  var_dump($id); // 追記
  $img = wp_get_attachment_image_src($id);
  ?>
```
上のコードの場合、

![スクリーンショット 2021-02-05 4.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/f3141c72-9f8c-1300-300b-bf1d7dfeb015.png)

というふうに、WordPress上にサムネイルのIDを表示させることができる。

- 画質の調整

画質を調節したい場合は、
`$img = wp_get_attachment_image_src($id, 'large');`
と第二引数を変えてあげれば良い。

- デフォルト画像を設ける

デフォルト画像を設定したい場合は、

```single.php
  <?php
  if (has_post_thumbnail()):
    $id = get_post_thumbnail_id();
    $img = wp_get_attachment_image_src($id, 'large');
  else:
    $img = array(get_template_directory_uri().'/img/post-bg.jpg');
  endif;
  ?>
```
と記述すれば良い。

実際にどう変わるか確認してみると、
![スクリーンショット 2021-02-05 5.03.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/8f14787a-7137-fffd-f433-3bc1cd3a9ea2.png)

劇的に画質が良くなっていることがわかるだろう。

# 関数
再利用する場合は、`functions.php`に関数としてまとめておくことも可能だ。

```functions.php
<?php
add_action('init', function(){
  add_theme_support('post-thumbnails');
});

/* アイキャッチ画像がなければ、標準画像を取得する */
function get_eyecatch_with_default() {
  if (has_post_thumbnail()):
    $id = get_post_thumbnail_id();
    $img = wp_get_attachment_image_src($id, 'large');
  else:
    $img = array(get_template_directory_uri().'/img/post-bg.jpg');
  endif;

  return $img;
}
```


# 終わりに
自作テンプレートにはデフォルトでアイキャッチ画像を設定する項目がない。そのため、アイキャッチ画像を設定するコードを書き加えれば良い。
AWSのI「IAMとは何か？」

AWSの「IAMとは何か？」について学習したことをアウトプットさせて頂きます。

結論IAMとは、AWSのサービスで「認証」と「認可」の設定を行うことができるサービスです。「認証」「認可」を正しく設定することで、AWSの利用者や、AWSのサービスがアクセスできる範囲を制御することができます。

まずはじめに、AWSを利用するためには、アクセスキーとシークレットアクセスキーの2種類の秘密鍵を使用してAWSにログインすることで、各サービスが使用できる仕組みになっていることを理解しておきましょう。

AWSのサービスを利用できるユーザーには、ルートユーザーとIAMユーザーの２種類のアカウントユーザーが存在します。


##ルートユーザー
ルートユーザーは、クレジットカードを登録して作成したアカウントユーザーのことを指します。
ルートユーザーでは、AWSのサービスの全てを使用することが出来る万能ユーザーになります。
その分、権限範囲がとても広いので、セキュリティ観点から必要な場合を除き、ルートユーザーでのログインは避けた方が良いでしょう。

##IAMユーザー
IAMユーザーは、権限範囲を抑えてAWSのサービスを利用するために、ルートユーザーが、IAMポリシーの則って作成されたアカウントユーザーのことを指します。
通常はセキュリティ的に安全なIAMユーザーを使用することが推奨されています。

##IAMポリシー
IAMポリシーは、AWSで操作できる権限を表したものになります。
設定ファイルはJSON形式で記述され、権限を設定することになります。

- AWS管理ポリシー
アマゾン側であらかじめ用意しているものです。

- カスタマー管理ポリシー
オリジナルで詳細を決められるようじ自分で設定したポリシーのものです。


##IAMグループ
複数のIAMユーザーのまとめて管理をするために、IAMグループを作成することができます。
IAMグループを作成することで、各IAMユーザーのIAMポリシーを同時に設定することが
できるようになるので、ユーザー管理がしやすくなります。


##IAMロール
IAMロールとは、ユーザーやグループではなく、EC2などのAWSのサービスや他のアカウントに対してにAWS の操作権限を付与するための仕組みのことを指します。
IAMロールには、信頼関係と権限の2つがあります。

信頼関係
相手が誰（何）なのか確認することです。

権限
リソースへのアクセス権限を与えることことです。


##まとめ
IAMはAWSのサービスを操作するための、「認証」と「認可」を行う大変重要なサービスです。AWSを利用していくうえで必ず利用するサービスになります。IAMユーザやIAMロールを正しく組み合わせて利用することで、セキュアにAWSを利用することができます。また実際には、IAMと合わせて2多要素認証を利用することや、権限範囲を抑えることで抑えることができます。


この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
【IE11・Safariにも対応】WebPをPictureタグとCSSで使う方法

前提として、ここでいうIEはIE11をさす。IE10以下は確認していない。

## WebPとPictureタグは対応していないブラウザが存在する

- WebPはIEとSafariが対応していない（iOS14から対応、macOS版はmacOS Big Surから対応した模様）
- PictureタグはIEが対応していない。

https://caniuse.com/picture
https://caniuse.com/webp
https://www.suzukikenichi.com/blog/safari-on-big-sur-now-supports-webp/

## 先に結論
- Pictureタグの場合はPicturefillポリフィルを使ってIE対応。
- CSSの場合はModernizrを使ってIEとSafariに対応。

## Pictureタグの場合

### 設置
`npm i picturefill`かCDN経由で読み込む。
基本的には読み込むだけでOK。
~~IEのためだけに使っているので不要な他のブラウザでは読み込まないように条件式で読み込むと尚良い。~~

https://cdnjs.com/libraries/picturefill
http://scottjehl.github.io/picturefill/

### 注意点
- 上から順番に条件にあうものが表示されるので、WebPはjpgよりも先に書く。
- WebPは`type="image/webp"`を指定する。

Safariは自動的にWebPをスキップしてjpgを読み込む。
IEはPictureタグのルールに従ってPicturefillが処理してくれる（ありがたい）

サンプルはモバイルファーストの書き方だが、PCファーストの場合はSP・PC画像の順番を逆にして`max-width`を使えば良い。

``` sample.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/picturefill/3.0.3/picturefill.min.js"></script>

<picture>
  <source srcset="pc.webp" media="(min-width: 1000px)" type="image/webp"><!-- 幅1000px以上でWebP対応なら表示 -->
  <source srcset="pc.jpg" media="(min-width: 1000px)"><!-- 幅1000px以上でWebP非対応なら表示 -->
  <source srcset="sp.webp" type="image/webp"><!-- 上記に当てはまらずWebP対応なら表示 -->
  <img src="sp.jpg"><!-- 上記に当てはまらずWebP非対応なら表示 -->
</picture>
```

## CSSの場合
Modernizrで振り分けする。

### Modernizr注意点
デフォルトのままではWebPの判定は入っていないのでCDN経由では使えない。
１） https://modernizr.com/ にアクセスして「Add your detects」をクリック。
２） 「Webp」を選択して「BUILD」クリック。
３） ダウンロードするか、コードをコピー。

設置すると、WebP対応していないブラウザの`<html>`タグに`.no-webp`が付与されるようになる。
なのでWebP対応のブラウザはそのままWebP画像を読み込み、非対応のブラウザは別の画像を読むという指定ができるようになる。

```sample.css
.sample {
  background: url(sp.webp);
}
.no-webp .sample {
  background: url(sp.jpg);
}
```


## WebPとPictureを使うメリット
- WebPはjpgやpngと比べて容量が軽い。
- 特にpngはWebPにすることで圧倒的に軽くなる。
- Pictureタグは条件に合致した画像だけ読み込むため、無駄な画像を読み込まない。

**結果、ページ高速化。**

Webサイトの容量は画像の割合が大きいので、これを軽くできるのは効果が大きい。

## デメリット・注意点
- Next.jsやNuxt.jsを使う場合、プリフェッチが効かないかもしれない。
- 別途WebP画像を用意する必要がある。


WebPもPictureタグもなんとなく敬遠してきたが、設置は意外と簡単でページの高速化に大きく寄与することがわかった。これからは積極的に使っていきたい。

## 記事修正しました
IEの条件付きコメントはIE10以降廃止されたので記述を訂正しました。
【ShopifyのTheme Kit導入】HomebrewでError: homebrew-core is a shallow clone で怒られた話

ShopifyのTheme Kit導入に際してターミナルで以下のコマンドを入力したところHomebrewでError: homebrew-core is a shallow clone で怒られた時に解決した方法を残しておきます。


###解決方法
解決策はエラー文で表示されたコマンドを実行

```irb
git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
```

###エラー内容
```irb
~ % brew tap shopify/shopify

Error: 
  homebrew-core is a shallow clone.
To `brew update`, first run:
  git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
This command may take a few minutes to run due to the large size of the repository.
This restriction has been made on GitHub's request because updating shallow
clones is an extremely expensive operation due to the tree layout and traffic of
Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do this for you
automatically to avoid repeatedly performing an expensive unshallow operation in
CI systems (which should instead be fixed to not use shallow clones). Sorry for
the inconvenience!
```

#####Deeplで翻訳したところ以下のような内容

更新を行うには、まず実行します。
  git - C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
このコマンドはリポジトリのサイズが大きいため、実行に数分かかることがあります。
この制限は、GitHub の要請により行われました。
クローンは、木の配置や交通量が多いため、非常に高価な作業となります。
とのこと。

####つまり

shallow clonesは非常に重たい処理をおこなってしまうためGitHubの要請を受けて<font color="Red">高負荷のshallowの繰り返しを避けるため</font>に自動的に浅いクローンを使用しないように修正されています。

ふむ
ということで

###解決策
解決策はエラー文で表示されたコマンドを実行

```irb
git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
```

エンター後、数分おくと
###結果

```irb
Error: 
  homebrew-core is a shallow clone.
To `brew update`, first run:
  git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
This command may take a few minutes to run due to the large size of the repository.
This restriction has been made on GitHub's request because updating shallow
clones is an extremely expensive operation due to the tree layout and traffic of
Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do this for you
automatically to avoid repeatedly performing an expensive unshallow operation in
CI systems (which should instead be fixed to not use shallow clones). Sorry for
the inconvenience!
user@user-MBP ~ % git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow

remote: Enumerating objects: 532139, done.
remote: Counting objects: 100% (532101/532101), done.
remote: Compressing objects: 100% (192046/192046), done.
remote: Total 523512 (delta 334257), reused 517870 (delta 328618), pack-reused 0
Receiving objects: 100% (523512/523512), 199.08 MiB | 5.46 MiB/s, done.
Resolving deltas: 100% (334257/334257), completed with 3950 local objects.
From https://github.com/Homebrew/homebrew-core
   24213f07e5..8509715934  master     -> origin/master
user@user-MBP ~ % 
user@user-MBP ~ % brew tap shopify/shopify                                                        
user@user-MBP ~ % 
```


Shopify Theme Kitのコマンドが通りました。
以上です。


#参考記事
[update.sh: refuse to update shallow homebrew-core/cask clones. #9383
](https://github.com/Homebrew/brew/pull/9383)
ドットインストール　詳解JavaScript 　基礎文法編 メモ

htmlの中でJavaScriptを使う場合は、＜ｂｏｄｙ＞タグの中に＜ｓｃｒｉｐｔ＞タグ
<h3>'use strict'; は厳密なエラーチェックをするためのもので、書いておくとエラーが発見しやすくなるので、必ず書いておく。</h3>

＜ｓｃｒｉｐｔ　ｓｒｃ＞は別ファイルに書く方法。

<h6>//でコメント
複数行のコメントは/* */で囲む　（vs codeでは　command + / ）</h6>

\ を使うと、直後の ' は文字列の終端ではなく、単なる文字列として扱われる。
\n は改行　\t はタブ（文字列の中でスペースの意）

べき乗は ** 

10 / 3 など、JavaScriptに限らず、少数が近似値になることが多い。

なるべく const を使って、どうしても必要なときに let が使われる。

定数と変数の命名規則
英数字と $ と　_ のみ
数字から始められない
大文字小文字は区別される。

値のデータ型がどれか調べるには、　typeof という演算子を使う。
console.log(typeof "hello")　など
(null　が　object になるのは、JavaScriptの有名なバグ)

console.log(parceInt("5" ,10) + 3); は５を１０進数の整数値に変換してくれるので、出力結果は8になる。
こうしない場合、５３という文字列になる。

console.log(parceInt("hello" ,10)); はNaN (Not a Number)になる。

値をtrue falseで評価するにはconsole.log(Boolean()); で括弧の中に値を入れる

<h5>命令がブロック{}で終わる場合はセミコロンはつけない</h5>


条件式に　=== ばかりが並ぶときは switch() 
switch　の　case の後ろは : 
break; を忘れない!

fot文の条件式は ; で区切る

while文は注意が必要で、条件に関する処理を忘れると無限ループに陥る
最悪、ブラウザやPCの再起動が必要になる

<h5>for や whileで、特定の回だけ処理をスキップしたい場合
例えば、４の時だけスキップしたいなら、このようにcontinueを使う</h5>

      for(let i = 1; i <= 0 ; i++) {
        if (i === 4) {
         continue;
        }
       console.log(i);
      }

４でループをやめたいときは breakを使う

関数を定義するときは仮引数
実際に関数を呼び出すときは実引数と呼ぶ

<h6>関数を呼び出すときに値を渡さなかったときにデフォルト値を設定しておくには、
仮引数 = 'Ad' などと設定すればOK</h6>


<h5>ブロック{}で囲っていても、変数に代入する式のときは文末に ; が必要</h5>


<h6>アロー関数では、処理がreturnだけの場合は　=> の後に returnする値を書けばよい
また、アロー関数で引数がひとつの場合は () を省略できる。</h6>


<h4>JavaScriptで複数のコードを書くようになると、複数のスクリプトを読み込むことも多くなる
そうした場合にエラーを防ぐには、書いたコードはブロックで囲ってスコープを分ける、という習慣をつけておくとよい</h4>
Xcodeが保存したプロビジョニングプロファイルを削除する

JenkinsやfastlaneなどのCIツールを使っていると段々と不要になった期限切れのプロビジョニングプロファイルがXcodeの作業ディレクトリに溜まってきて、そのうちに手動で削除するのも面倒になりついにはゴミだらけに。
そんな期限切れのプロビジョニングプロファイルを綺麗さっぱり掃除するためのシェルスクリプトを用意してみました。

```bash:
#!/bin/bash

USER_NAME=`whoami`
TODAY=`date '+%s'`

# Remove old mobileprovision
MOBILEPROVISION_FILES=`find /Users/${USER_NAME}/Library/MobileDevice/Provisioning\ Profiles/ -maxdepth 1 -type f | sed 's!^.*/!!'`
for MOBILEPROVISION_FILE in ${MOBILEPROVISION_FILES}; do
  #echo ${MOBILEPROVISION_FILE}
  expire_date=`/usr/libexec/PlistBuddy -c "Print DeveloperCertificates:0" /dev/stdin <<< $(security cms -D -i "/Users/${USER_NAME}/Library/MobileDevice/Provisioning Profiles/${MOBILEPROVISION_FILE}") | openssl x509 -inform der -enddate -noout | sed -e 's/^notAfter=//g'`
  #echo $expire_date
  expire=`LANG=C date -j -f "%b %d %H:%M:%S %Y %Z" "$expire_date" '+%s'`
  if [ $TODAY -gt $expire ]; then
    echo ${MOBILEPROVISION_FILE} is expire on $expire_date removed.
    rm -f "/Users/${USER_NAME}/Library/MobileDevice/Provisioning Profiles/${MOBILEPROVISION_FILE}"
  fi
done
```