OmniAICreator/Qiita-1.07M huggingface dataset:
8日目プログレスバーを使ったタイマーアプリ。

#8日目のアプリ 
プログレスバーを使ったタイマーアプリ。

##画面キャプチャ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/959530/1a02b848-64a0-8960-0867-19619447cb94.gif" width=50%>

ボタンを3つおいて、各ボタンを押すと、ボタン名が表示される。
押すボタンによって、トータル時間が変わって、
経過時間を下のプログレスバーで表示。
プログレスバーが最後になると、音が出る。
という仕様にしました。

##以下の流れで作りました。
1. オブジェクトを配置して、Viewcontrolerに紐付け
2. プログレスバーを追加
3. import AVFoundation
4. 再生するプレイヤーを作って、取り込んだ音を再生

##できたこと
+ プログレスバーの設置
+ 音の再生（復習）
+ 
##書いたコードを共有します！

```
import UIKit
import AVFoundation //音声ファイルを使うときimportする

class ViewController: UIViewController {
    @IBOutlet weak var displayText: UILabel!
    
    
    let eggTime = [
        "Soft": 5,
        "Medium": 7,
        "Hard": 12
    ]
    
    var myTimer = Timer()
    var totalTime = 0
    var secondsPassed = 0
    var player : AVAudioPlayer! // 音声ファイルを再生するデッキ player を作る
    
    
    
    @IBOutlet weak var progressBar: UIProgressView!
    
    
    @IBAction func hardnessSelected(_ sender: UIButton) {
        
        let selected = sender.currentTitle!
//        switch selected {
//        case "Soft":
//            print(eggTime["Soft"]!)
//        case "Medium":
//            print(eggTime["Medium"]!)
//        case "Hard":
//            print(eggTime["Hard"]!)
//
//        default:
//            print("none")
//        }
        myTimer.invalidate()
        secondsPassed = 0
        
        totalTime = eggTime[selected]!
        displayText.text = "\(sender.currentTitle!)"
        progressBar.progress = 0.0
        
        myTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(action), userInfo: nil, repeats: true)
        
    }
    
    @objc func action() {
        if secondsPassed < totalTime {
            secondsPassed += 1
            progressBar.progress = Float(secondsPassed) / Float(totalTime)
            
            print(Float(secondsPassed) / Float(totalTime))
        print(secondsPassed)
        } else {
//            progressBar.progress = 1.0
            myTimer.invalidate()
            displayText.text = "done!"
            //再生デッキに入れるCDを作る
            let url = Bundle.main.url(forResource: "alarm_sound", withExtension: "mp3")
            //再生デッキに入れる
            player = try! AVAudioPlayer(contentsOf: url!)
            //デッキの再生ボタンを押す
            player.play()
            
        }
        }

}
```

##感想
よし、できた。きっとw
平均値や中央値と比べて大きい/小さいものをcountしたい時はeventstats

*もっと包括的なタイトルの方が良い気がしますが、初期衝動でそのままにします。*

通常、平均値(avg)や中央値(median)を単純に得るには、statsコマンドを使うと思います。

しかし、今回私がやりたかったのは、
「得られたそれらの値と元の値とを比較した結果で絞りたい」というものでした。

ここで利用するのがeventstatsコマンドです。
eventstatsで平均値や中央値を出すと、
それらの値がそれぞれのイベントに紐付くので、あとから比較処理ができます。

whereコマンドで比較後に、countコマンドで再集計してミッションコンプリートです。

```
index=main host=web_application 
| eventstats median(bytes) AS med
| table bytes, med
| where bytes >= med
| stats count
```
※ tableコマンドは本来不要ですが、後述時の視覚化のために記述してあります。


#参考にしたサイト

https://www.splunk.com/ja_jp/blog/tips-and-tricks/search-command-stats-eventstats-and-streamstats-2.html


#上記コマンド 各フェイズの結果対応
###１行目
```
index=main host=web_application 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/ffa727e5-1cee-953d-df67-eaf1759ce773.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/0126af2d-a52f-427a-2917-3177b6b29daf.png)


###２行目(eventstats)
```
index=main host=web_application 
| eventstats median(bytes) AS med
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/87a0ff4d-1d04-e751-8bbd-c933e4e0261d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/694fb3af-8c34-4ef2-b00f-28f2082a194f.png)
statsコマンドを使用した時と違いますね。（その分、処理はeventstatsの方が重いです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/a62d4db3-e756-9387-8ba9-04a4bc8f2c21.png)



###３行目
```
index=main host=web_application 
| eventstats median(bytes) AS med
| table bytes, med
```
一応、次の項のために、bytesフィールドを昇順ソートしときました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/36f04ab4-6bc0-01bb-3353-8d2e3e9ec059.png)


###４行目(元の値と統計値を各イベントごとに比較)
```
index=main host=web_application 
| eventstats median(bytes) AS med
| table bytes, med
| where bytes >= med
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/1974c95a-606b-adc9-d506-83942142f112.png)


###５行目(改めて数える)
```
index=main host=web_application 
| eventstats median(bytes) AS med
| table bytes, med
| where bytes >= med
| stats count
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/d4706c57-f8e9-40f7-bb62-18197c83e7ce.png)



#20210306追記(上記をグループ別に実施することも可能)
言われてみれば何てことないですが、きっとそういうことやりたい人も居るよね？

```
index=main host=web_application 
| eventstats median(bytes) AS med by categoryId
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/f8b376c1-0430-6e42-9bfd-01a785109a44.png)
↑↓　一致してますよね
　　（８グループ。各グループごとの中央値が、所属するイベントに各々紐付けられました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428575/ad8c9529-02f9-a2fc-d543-1ab6235e4880.png)


#更に次へ
@odorusatoshi さんの記事。面白いぞ

https://qiita.com/odorusatoshi/items/790a519f6e017b6ae2a1
cronを一定確率で実行する

```
crontab -e
```

```
# 毎分1%の確率でecho hoge
* * * * * [ $((RANDOM \% 100)) -eq 1 ] && echo hoge

# 毎分33%の確率でecho hoge
* * * * * [ $((RANDOM \% 100)) -lt 33 ] && echo hoge
```

味噌は「%」にはエスケープが必要ということです。
ハマったので誰かの助けになれば幸いです。
データサイエンス１００本ノックを C# でやってみた

# データサイエンス100本ノック を C# でも

データサイエンティスト協会 様が公開してくれている
[データサイエンス100本ノック](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)

を C# でもやってみました。

まだ日本語の情報は少ないですが C# でも データサイエンス関連のライブラリがすこしづつ充実してきている感じです。

今回 [MathNet.Numerics](https://numerics.mathdotnet.com/) を利用しました。

その Jupyter Notebook の ページがこちら 『 [データサイエンス100本ノック C# 実行結果 （Notebook Viewer）](https://nbviewer.jupyter.org/github/kkato233/100knocks-data-scientist-cs/blob/master/work/ans_preprocess_knock_CS.ipynb)　』

<a href="https://nbviewer.jupyter.org/github/kkato233/100knocks-data-scientist-cs/blob/master/work/ans_preprocess_knock_CS.ipynb"><img src="https://github.com/kkato233/100knocks-data-scientist-cs/raw/master/img/question1.png"></a>

Visual Studio Code 上に 環境を構築すると LINQ を使って わりとサクサク 回答する事ができました。

Docker イメージと 回答例 を [github 上に公開](https://github.com/kkato233/100knocks-data-scientist-cs) しています。 

Docker 環境構築が 面倒な方でも Web 上で 直接実行できる環境があります。
このボタン
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/kkato233/100knocks-data-scientist-cs/HEAD)　
をクリックして 画面が表示されるまで しばらくお待ちください。
実際に データサイエンス 100本ノック　C# 版 の コードを WEB 上で動かす事ができます。


#### Visual Studio Code で Jupyter Notebook 環境構築手順


[Visual Studio Code](https://code.visualstudio.com/) をインストールし、

[.NET Interactive Notebooks](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode)
パッケージを追加し

[.NET 5 SDK](https://dotnet.microsoft.com/download/dotnet/5.0)
を インストールすると

Visual Studio Code で サクサク開発ができます。


自動補完の機能が便利です。


![編集例](https://github.com/kkato233/100knocks-data-scientist-cs/raw/master/img/edit01.gif)


![編集例](https://github.com/kkato233/100knocks-data-scientist-cs/raw/master/img/edit02.gif)

## Jupyter Notebook の 実行環境 Docker Image 説明

Jupyter Notebook を 簡単に試すための Docker Image を作成しました。

Docker Desktop を インストールしている環境で

```
git clone https://github.com/kkato233/100knocks-data-scientist-cs
cd 100knocks-data-scientist-cs
docker-compose up -d --build
```
とすると
`http://localhost:8889/` の アドレスで .NET 対応版の Jupyter Notebook が開きます。

![Notebook](https://github.com/kkato233/100knocks-data-scientist-cs/raw/master/img/notebook.png)

Jupyter Notebook の環境構築は Docker が便利ですね。

Python 複数バージョンが競合したり、ライブラリが変に競合する事がありません。

誰かが作ってくれたイメージをありがたく使わせてもらいましょう。
Python 3.3以降での__init__.py の書き方についての簡単説明

## はじめに
pythonでパッケージ化をする必要が出てきたので、\_\_init\_\_.pyの書き方を調べました。
技術的な背景や経緯は不要で、とりあえず書き方だけを知りたかったのですが、簡単に理解できるような記事がすぐに見つかりませんでした。
そこで、備忘として簡単な説明を残します。

## Python 3.3以降に限定
自身で書くPythonコードは常にPython3ですので、python2との互換性は日頃から一切考慮しません。また、基本的に新しい環境を使うようにしているため、Python 3.3より古い環境を考慮することがないので、Python 3.3以降に限定して説明します。

## Python 3.3からは空の \_\_init\_\_.py は不要
\_\_init\_\_.py についで調べると必ず、中身が空っぽの\_\_init\_\_.pyに関する説明が出てくると思います。
「空で良いなら無くても動作するようにして」、と誰もが思うと思いますが、3.3からは空の\_\_init\_\_.pyを書かなくても、今まで空の\_\_init\_\_.pyを書いた時と同じように動作するようになりました。
ですので、空の\_\_init\_\_.pyのことはもう忘れましょう。
[pep-420-implicit-namespace-packages](https://docs.python.org/dev/whatsnew/3.3.html#pep-420-implicit-namespace-packages)
>Native support for package directories that don’t require \_\_init\_\_.py marker files and can automatically span multiple path segments (inspired by various third party approaches to namespace packages, as described in PEP 420)

## \_\_init\_\_.pyを用意したい時、用意した方が良いのはどんな時？
複数のファイルで流用したい共通処理を別ファイルに切り出して、'util'や'common'といったフォルダにまとめておく、というようなことはよくあることだと思います。
このような時には、そのフォルダに、\_\_init\_\_.pyを用意した方が良いでしょう。

## \_\_init\_\_.pyには何を書けばよいか？
以下、実際に私が直面した事例で説明します。
svm.py というメインのファイルがあり、同じ階層に'util'というフォルダがあります。
'util'というフォルダには、training_data.pyとfile.pyがあります。

```
./svm.py
./util/training_data.py
./util/file.py
```
\_\_init\_\_.pyを用意しない場合、svm.pyでのimportは以下のようになります。

```python
import util.training_data
import util.file
```
importに関しては、さほど不便は感じませんでしたが、実際にtraining_data.pyの中で実装されたTrainingDataというクラスをsvm.pyで使うには、次のように書く必要があり、煩わしく思いました。

```python
training_data = util.training_data.TrainingData()
```

どう考えても、真ん中の'training_data.'を省略したくなりますね。
そこで、'util'フォルダに\_\_init\_\_.pyを用意します。

```
./svm.py
./util/training_data.py
./util/file.py
./util/__init__.py
```

そして以下を記述します。

```python
#!/usr/bin/env python3
from util.file import *
from util.training_data import *
```

これにより、svm.pyでのimportは以下の1行で済むようになります。

```
import util
```

ファイル名を指定する必要がなくなり、utilをパッケージとして扱えるようになります。
また、util内のオブジェクト・関数呼び出しにおいても、ファイル名の指定が不要になります。

```python
training_data = util.TrainingData()
```
あるいは、次のようにimportして使うこともできます。

```python
from util import TrainingData
training_data = TrainingData()
```

## まとめ
\_\_init\_\_.pyの使用目的は他にもあると思いますが、パッケージ化の仕方について簡単に説明してみました。
deviseによる[ ~~ must exist ] によるエラー

今回のエラーは強敵でした。
中々原因が分からずかなり苦戦しました。
とりあえず、真夜中ですが忘れないうちに備忘録書きます。

---
###エラーに至った経緯

アプリ作成時すぐに**devise**でユーザー管理機能を作成し、
カラムを追加で足しました。
動物関連のアプリを作っていたので、追加で足したカラム名は
**keep_pet**と**number_of_pets**を足しました。
その時は何事もなくユーザーの新規登録ができました。
アプリ制作も順調に進み、**編集と削除**の機能を追加しました。

機能を確かめる為に、
ここで新しく**id2**の**新規ユーザーに**登場してもらおうと思い、
ユーザー新規登録画面に行きました。

　

###ここでエラー発生
全ての項目を埋めて、新規登録ボタンを押すと、

```
1 error prohibited this user from being saved:
1つのエラーにより、このユーザーの保存が禁止されました。
             Pet must exist
```
上記のエラーメッセージが出てきました。
**Pet must exist**とは一体何ですか！？
カラムに間違いはなく、アソシエーションもdevise用のストロングパラメータの記述も完璧なはずだった。
なのに、どうしてか全く分からず完全に詰んだ..と思っていながら調べては試しを繰り返しやっと解決に至りました。


##解決方法

結論、アソシエーションに問題がありました。
**belongs_to :user**だけでいいと思っていたら、間違っていたみたいです。
正解は↓

```
belongs_to :user, optional: true
```

##optional: true
belongs_toの外部キーのnilを許可するというものだそうです。
外部キーに値がセットされていない場合はバリデーションが作動するせいでエラーが起きていたそうです。
`optional: true`を設定しておくと、外部キーがnilであっても**DBに保存できる**ようになります。

　

###まとめ
これっぽっちのエラーでもまた一つ覚えることができたのはいい収穫。
新たなエラーに出くわしても挫けず頑張りたいと思った今日この頃。
[rust入門]備忘録：再代入と再束縛

## これ何
rustって一度値を入れたら更新できない。
同じ変数の値を変える場合どうしたらいいんだっけって言う備忘録

再代入と再束縛の2つのパターンがある。

### 違い
#### 再代入
- 同じ型のデータしか代入できない
- ミュータブル(変更可能な)変数とも言う
    - ミュータビリティ - Rust By Example 日本語版 https://doc.rust-jp.rs/rust-by-example-ja/variable_bindings/mut.html

#### 再束縛
- 違う型も代入することができる
- 変数のシャドーイングとも言う
    - スコープとシャドーイング - Rust By Example 日本語版 https://doc.rust-jp.rs/rust-by-example-ja/variable_bindings/scope.html

### sample

```rust
fn main() {
    // 再代入
    let mut variable1 = 32i32;
    println!("variable1 is {}", variable1);
    variable1 = 64i32;
    println!("variable1 is {}", variable1);
    // errorが発生する
    // variable1 = "string";

    // 再束縛
    let variable2 = 32i32;
    println!("variable2 is {}", variable2);
    let variable2 = 64i32;
    println!("variable2 is {}", variable2);
    let variable2 = "string";
    println!("variable2 is {}", variable2);
}
```

### 実行結果
```
variable1 is 32
variable1 is 64
variable2 is 32
variable2 is 64
variable2 is string
```

## 参考文献
- Rustの変数（再代入、再宣言（シャドーイング）） - やってみる http://ytyaru.hatenablog.com/entry/2020/08/02/000000
- 再束縛と再代入の違い - Qiita https://qiita.com/padawan_e15/items/63b0c728514907c9faaa
タグ付きテンプレートリテラルで例外発射

[assertsでassert関数](https://qiita.com/sugoroku_y/items/bd82009001973ddfa3d4)なんて記事を以前に書いたんですが、assert関数より例外を投げるだけの関数を用意した方が汎用性が高そうな気がしてきました。

```ts
/**
 * テンプレートリテラルで生成した文字列をメッセージとした例外を投げる。
 * @param templ 例外のメッセージに指定する文字列のテンプレート
 * @param values テンプレートに適用する値
 */
function error(templ: TemplateStringsArray, ...values: unknown[]): never;
/**
 * メッセージ無しの例外を投げる。
 */
function error(): never;
/**
 * 指定した文字列をメッセージとした例外を投げる。
 * @param message 例外のメッセージに指定する文字列。
 */
function error(message: string): never;
function error(): never {
  const message =
    // 引数無しの場合はメッセージ無し
    arguments.length === 0
      ? undefined
      : // 引数が文字列の場合はそのままメッセージにする
      typeof arguments[0] === 'string'
      ? arguments[0]
      : // タグ付きテンプレートリテラルの場合はテンプレートからメッセージ生成
        (arguments[0] as string[]).reduce(
          (r, t, i) => r + String(arguments[i]) + t
        );
  throw new Error(message);
}
```

という関数を用意しておくと、

```ts
function compare<T>(a: T, b: T): 0 | 1 | -1 {
  // 等しいときは0
  return a === b ? 0 :
         // 前者の方が小さい場合は-1
         a < b ? -1 :
         // 前者の方が大きい場合は1
         a > b ? 1 :
         // どれでも無い場合は例外
         error`Uncomparable value: ${a}, ${b}`;
}
```

のように想定外の値が来た場合は例外を投げる、ということが簡単に書けます。

例えばある変数をnullチェックしたあと、その変数をハンドラの中で使おうとしたとき、nullの可能性があると指摘されたことはないですか?

```ts
  canvas.addEventListener('mousedown', ev => {
    let ctx = canvas.getContext('2d');
    if (!ctx) {
      return;
    }
    ctx.strokeStyle = 'red';
    ctx.lineWidth = 2;
    const {x, y} = eventToPos(ev);
    ctx.moveTo(x, y);
    canvas.addEventListener('mousemove', ev => {
      const {x, y} = eventToPos(ev);
      ctx.lineTo(x, y); // ctxはnullの可能性がある(nullチェックしたのに...)
    })
  }
```

こんなときでも

```ts
    let ctx = canvas.getContext('2d') ?? error`コンテキストの取得失敗`;
```

と書いておけば、ctxは最初からnullにはならないため、ハンドラの中で使ってもエラーになりません。

[assertsでassert関数](https://qiita.com/sugoroku_y/items/bd82009001973ddfa3d4)で挙げた例でいえば、

```ts
  function index(node: INode): number {
    return node.parent
      ? (
          node.parent.children ?? error`nodeのparentにはchildrenがいるはず(少なくともnodeが)`
        ).indexOf(node)
      : 0;
  }
```

のように書くことでassert関数いらずに。

たまに`!`を使ってnullチェックをはしょっているコードを見かけますが、それよりチェックして例外投げるようにした方が何が原因かを例外のメッセージに書くことができます。

```ts
function func(arg?: {aaa?: {bbb?: {ccc?: string}}}) {
  console.log(arg!.aaa!.bbb!.ccc!.slice()); // もしどこかがundefinedだったときにはエラーになる
  console.log(arg?.aaa?.bbb?.ccc?.slice() ?? error`必須パラメータがないよ`); // どうせエラーになるならエラーの情報を載せよう
}
```

## 注意点

何故かタグ付きテンプレートリテラルだけの文だと返値のnever型が有効にならず、その後の式で型ガードが有効になりません。

```ts
function func(arg: {type: 'string' | 'number', value: string | number}) {
  if (arg.type === 'string') {
    if (typeof arg.value !== 'string') {
      error`typeがstringなのにvalueが文字列じゃない`;
    }
    arg.value; // なぜかここでもarg.valueはstring | number
  }
  // ...
}
```

こんなときはタグ付きテンプレートリテラルではなく、文字列を引数に取るタイプを使用して下さい。

```ts
function func(arg: {type: 'string' | 'number', value: string | number}) {
  if (arg.type === 'string') {
    if (typeof arg.value !== 'string') {
      error(`typeがstringなのにvalueが文字列じゃない`);
    }
    arg.value; // これならarg.valueはstring
  }
  // ...
}
```
Facebook for Developersを使用し、access_tokenを取得する方法

#1.アプリの作成
![スクリーンショット 2021-03-03 1.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/8f1e0798-8373-b1d0-b985-3c75b1850042.png)
緑色の'アプリを作成'をクリックしアプリを作成する。

![スクリーンショット 2021-03-03 1.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/bec5014d-7326-db33-9124-0e7b33cf8b54.png)
今回は他のオプションを選択

![スクリーンショット 2021-03-03 1.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/c2b9b94b-52a8-5e48-7e42-3324344787b0.png)
今回はテストとしてアプリを作成するのでtutorialとする。
メールアドレスは、適切なものを設定。

![スクリーンショット 2021-03-03 1.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/46f5d363-2cac-3a82-a5e0-ed37db0c7a5c.png)

ここまで来たらアプリの作成は完成である。

#2.redirect_url（リダイレクトURLの）設定

![スクリーンショット 2021-03-03 1.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/dc442094-6153-f122-02d3-985a6350b584.png)
プロダクト→Instagram Basic Display→ Basic Displayの順に押していき、青色のcreate new appをクリック
![スクリーンショット 2021-03-03 1.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/ea763895-6353-47e6-2a8e-b77b651da191.png)
ここでredirect_urlを設定する。ここで設定したurlに認証コードが送信されトークンを取得する際に必要になってくる。（例：https://google.com/?code=*****）
このような形式で送られてくる。

#3.Instagram testersの登録
![スクリーンショット 2021-03-03 1.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/43464f37-e92e-4cc1-5c2c-51b71037d33e.png)
Add or Remove Instagram Testersをクリック

![スクリーンショット 2021-03-03 1.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/8ef42298-dade-36cc-7017-73ed33e16777.png)
一番下にある、Instagramテスターを追加をクリックし、自分のInstagramを選択

instagram-web版に移動（①〜③の順に進める）
①設定
②アプリとwebサイト
③テスターへのご招待

先ほどのページに戻り更新するとtesterが追加されている。

#4.実際にaccess_tokenを取得していく
![スクリーンショット 2021-03-03 2.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/552d7ce0-cb95-2e44-b857-83158c8b9ed9.png)
Generate Tokenをクリック（Instagramへの許可などについてのバナーが出る）
![スクリーンショット 2021-03-03 2.02.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122184/da85c15b-329b-0e10-bae7-e14b7bc984af.png)
ここまで来たら、access_tokenの取得は完了である（実際にはI understandの下にトークンが表示されている）

#4.まとめ
今回取得したのはinstagram basic displayのaccess_token（厳密に言えば短期アクセストークン）である。このtokenを使用することでinstagramの様々な情報を取得することが可能である。このトークンをは短期アクセストークンであり有効期限が短いため、長期アクセストークンにする必要が出てくる場合もある。

参考 https://developers.facebook.com/?locale=ja_JP
access_tokenを使用しinstagramの情報を取得したい場合
https://developers.facebook.com/docs/instagram-basic-display-api/getting-started
Windowsにnnmnkwiiをインストールしようとしたらエラーになった

# なんかよくわからんけど赤字めっちゃ出た

Visual Studio C++ Build Tools が無いって言われたから入れたけど赤字が増えた

# 原因

- Python3.9.2 だとインストールできないみたい
- cl.exe にパスが通ってなかった

# 解決策

- Python3.8 を使う
- Visual Studio C++ Build Tools の cl.exe に下記のパスを通す。

```
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64\
```

上記の `14.28.29333` の部分はバージョンによるので適宜変更。最後の `\` を忘れないように。

# 余談

## NNSVSのインストール

NNSVSをインストールするときに torchaudio がインストールできないって言われるので、次のコマンドでインストール。

```bat
pip install torchaudio -f https://download.pytorch.org/whl/torch_stable.html
```

# 参考

- [(2019年版)コマンドラインからclを使ってコンパイルできるようにしたので共有する](https://qiita.com/asana_yui/items/d545b5eccd994c0cdaab)
- [taroushirani/pnew: Portable NNSVS environment for Windows](https://github.com/taroushirani/pnew)
- [https://qiita.com/taroushirani/items/8706a2204924ab881b2f](https://qiita.com/taroushirani/items/8706a2204924ab881b2f)
PrivateTmp に残ったファイルの処理

systemd が作成する PrivateTmp に、ユーザがアップロードするファイルが大量に残っていてOSの容量を圧迫していたので、適当に消すスクリプトを作成。

/root/remove_files_in_php_fpm_private_tmp.sh

```
#!/bin/bash

PHP_FPM_PRIVATE_TEMP=$(find /tmp -type d -name "*php-fpm*")
PHP_FPM_PRIVATE_TEMP="${PHP_FPM_PRIVATE_TEMP}/tmp"
find "${PHP_FPM_PRIVATE_TEMP}" -type f -exec rm {} \;

exit 0
```

cron で適当に実行


```
# crontab -e
...(snip)...
# removing php-fpm private temp files (not a directory)
5 * * * * /root/remove_files_in_php_fpm_private_tmp.sh >/dev/null
...(snip)...
```

ちなみに、ディレクトリを消しちゃうと、アップロードができなくなる。
その場合は、php-fpm を再起動すると、PrivateTmp が再作成される。
Accessランタイム2019でaccdb へアクセス（C#）

Accessランタイムの場合、Access.Application = new Access.Applicationで落ちるのでその対策

        private void button1_Click(object sender, EventArgs e)
        {
            Application ac = null;
            IWshShell3 ws = (WshShell)Interaction.CreateObject("WScript.Shell", "");
            ws.Run(@"C:\work\test.accdb");
            ac = (Application)Marshal.GetActiveObject("Access.Application");
            //アクセスの処理

            ac.Quit();
        }

accdbかmdbを開いておく必要があるので、ダミーファイルが必要になってしまうのと、
Run実行後にAccessのダイアログが入るのがいまいち。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295656/7ad687e4-e655-be8a-4312-7d48e0696402.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295656/7034ece3-8f2e-4a90-1d91-a3fc7806f2a9.png)

開くを押下後でないとGetActiveObjectで例外エラーになるのでダイアログをどうにかする必要がある。
レジストリ書き換えるか何かほかに方法があるか...
ディープニューラルネットワーク（AI）でジャズのアドリブを生成するBebopNet

ディープニューラルネットワークでジャズのアドリブを生成する
BebopNetです。
https://shunithaviv.github.io/bebopnet/


リンク先のページで色々なサンプルを聞く事ができる他コードも公開されているのでご自身で実践する事が可能です。


ISMIR2020で発表した際の動画ありますので英語ですが、ご興味のある方はご覧になってみてください。
https://youtu.be/oNJmBT6eYBU



Githubの公開コードページはこちら
PyTorchで実装されている様です。
https://github.com/shunithaviv/bebopnet-code



実はジャズはAI音楽生成の実践ではかなり頻繁に取り上げられています。
理由は”それっぽい”生成がポップミュージックなど周期性のより明確な音楽に比べ容易だからです。（と、我々の実践から感じています）



私が運営している音楽TECHアカデミーでも2017年にはジャズのアドリブ生成を行っており、2018年頃から研究会などで発表しています。
一例としてよりフリージャズ的な生成曲の動画をご覧ください。
https://youtu.be/vEj1t2JGWfM


いかがでしょうか？
実はこの生成曲は数千曲のクラシックなどジャズではない音楽のデータセットをわずか４エポックしか学習させていない結果です。
面白い事に十分に学習させるとこの様なジャズらしさは薄れ、どんどんクラシック的な学習した曲に近づいていきます。
この様にジャズの様なジャンルは、学習回数が少なくても、あるいは仮にデータ数が少なくても、それらしい生成曲になるのが面白いです。


もっとも音楽的に魅力的かは人それぞれかと思いますが。。。。
何か音楽AIのご参考になれば幸いです。
ガウス分布・多次元ガウス分布・ガウス過程

# ガウス分布・多次元ガウス分布・ガウス過程
今回は機械学習のガウス分布・多次元ガウス分布・ガウス過程についてのスライドをまとめました。
要点を絞ってかなり簡潔にまとめております。

[ガウス分布からガウス過程/スライド](https://docs.google.com/presentation/d/1nTCqKppKYtZRXKVZjiOfI3SRx4ty9ElPe9NNxKXNUVA/edit#slide=id.p)

# 最後に
今後もアウトプットをしていきます。
Pythonと機械学習中心に投稿していきます。
復習のために重複する内容が投稿されるかもしれませんが、ご理解ください。
フレームワークを使わないPHP＋Javascript　TIPS

#サイトマップを作る
記載するほどでもないが、サイトマップを作るコード。
最終的にxmlファイルを生成するが、phpファイルのままでもいけるかもしれない。

```make_stemap.php
$xml = '<?xml version="1.0" encoding="utf-8" ?>'."\n";
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
foreach($array_movie_id as $value){
    $xml .= "<url>";
    $xml .= "<loc>https://～/".$value['key']."</loc>";
    $get_date = $value['key2'];
    $mod_date = substr($get_date, 0, -9);
    $xml .= "<lastmod>".$mod_date."</lastmod>";
    $xml .= "</url>";
}
$xml .= "</urlset>";
<urlset>
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/xml/sitemap.xml', $xml);
```
#ページを複製する
通常1つのページを作成し、PPOSTで渡した値で表示を変えるのが通例だが、
SEOの観点から複数のページを作成したいときがある。

##元ファイルがJavascriptの場合
定型部分をJavascriptで記載し、incファイル化
ob_start()関数を使用。元ファイルがJavascriptなのでPHPの変数の影響を受けることなく記載可能。

```a.inc
コード内部はJavascript。
```

```b.php
データベースに接続等
ob_start(); //バッファ制御スタート
include("inc/a.inc");
$text = ob_get_clean(); //バッファ制御終了＆変数を取得
$something = 可変部分
$something .= $text;
```

##元ファイルがphpの場合
変数をエスケープする。

```a.php
$name = "名前";
$email = "a@gamil.com";

$text = "<?php \$name=\"$name \"; ?>"."\n";
$text .= "<?php \$email =\"$email\"; ?>"."\n";

file_put_contents("b.php", $text);
```

```b.php
<?php $name="名前"; ?>
<?php $email ="a@gamil.com"; ?>
```
エスケープって便利！

#ajaxによる非同期通信（jQueryを用いた場合）
毎回迷うので、備忘録もかねて。

```a.php
let options = {//変数にまとめておくと可読性が増す
    type:'POST',
    url: 'b.php',
    data: fd,
    dataType: 'json'
};

$.ajax(
    options
).done(function(d){
    //json返ってきたので処理
    console.log('success');
    var src = d.src;
    console.log(src);
    //let p = $('div.droparea').find('p');
    let p = $('div.droparea');
    $(p).html('<img src="'+src+'" width="300px" height="169px">');
    let img_box = document.getElementById('thumbnail_area')
    var protocol = location.protocol;
    var host = location.host;
    src = protocol + '//' + host + '/' + src.replace('../','');
    img_box.textContent = src;

}).fail(function(d){
    console.log('false');
    let p = $('div.droparea').find('p');
    $(p).text("アップロードに失敗しました");
}).always(function(){
    //完了
});
```

#CORSについて
送信元のhtaccessに受け取る側のドメインを記載。

```htaccess
Header append Access-Control-Allow-Origin: https://～
```

#文字化けについて
HTML-ENTITIESで終わらせるといけない。
HTML-ENTITIESに変換したものをUTF-8に変換する。
CELLをスワイプして消去する。

前提として
文字列型の配列変数todoListを定義し
textFieldで文字を代入し
cellを構築済みとする。
![スクリーンショット 2021-03-03 1.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099804/dd308753-c40e-235d-3bd5-1298b23c3835.png)


■UITableViewDelegate
のデリゲートメソッドを使用する。

♪追加したcellを画面上でスワイプして消去する事ができる。
下記デリゲートメソッドを記述する。
![スクリーンショット 2021-03-03 1.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099804/73035f1d-4fa7-7c35-3c56-a4a67c92aca5.png)




■なすを左にスワイプ
右側にDdeleteが表示される

![スクリーンショット 2021-03-03 1.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099804/24117b7d-70f5-50e3-2335-937ebfbcd2f7.png)


■Delieteを押すとなすが消去される。

![スクリーンショット 2021-03-03 1.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099804/88b911d9-02e6-74bc-ef7b-d93fe5af9c30.png)


簡単になりますが以上です。
あくまで画面上での消去になります。
DBなどの使用の場合は別途処理が必要になります。
flashの使い方

####フラッシュ
画面に一度だけ表示されるメッセージで別のページに遷移や、時間がたつと消えるメッセージ

フラッシュを利用するには特殊な変数　flash　を利用する
コントローラーでflash[:notice]に文字を設定すると、<%= flash[:notice] %> で表示できる

flashはいろいろな箇所で共通で使っていくのでapplication.html.erbに書いた方がいい
headerの下らへんかな
その場合、falshに値が入ってるかを確認して出しわけをする

    <% if flash[:notice] %>
      <div class="flash">
        <%= flash[:notice] %>
      </div>
    <% end %>
Vue.js URLからidを取得

例えば以下の?がつくURLで1を取得したい場合

```
http://localhost:3000/maps?tweet_id=1
```

クエリパラメーターと言うみたいです
これで1が取得できます

```.vue
<template>
<div id="app">
  {{$route.query.tweet_id}}
</div>
</template>
```

詳細ページでよく見る以下のURLでは

```
http://localhost:3000/tweets/1
```

これで良いと思います

```.vue
<template>
<div id="app">
  {{$route.params.id}}
</div>
</template>
```


###おまけ
axiosでJSONデータを取得するときなどはthisをつけると取得できます

```.js
      axios
        .get(`/api/v1/tweets/${this.$route.params.id}/index.json`)
        .then(response =>{
          this.analyses = response.data;
        })
```
renderメソッドとredirect_toの使い方

#### renderメソッド
別のアクションを経由せずに直接ビューを表示できる
使い道は、更新などが失敗した場合、更新内容を保持しておきたい時に使う
renderメソッドを使うと、redirect_toメソッドを使った場合と違い、そのアクション内で定義した@変数をビューでそのまま使うことができる。

```render("フォルダ名/ファイル名")```
のように表示したいビューを指定する

コントローラー
```@fefefe = test```
render("ccc/ddd") ビューファイルを指定
-+-+-+-+-+-+-+
ccc/ddd.html.erb
```<%= @fefefe =>```

renderで書く時は最初の"/"がいらない


####redirect_toメソッド
redirect_toはURLを指定して
```redirect_to(URL)```
のように書く

コントローラー
redirect_to("/aaa/bbb")

ルーター
get "aaa/bbb" => "aaa#bbb"
【リーダブルコーディング】読みやすいコードを書くためのチェックリスト☑️

#0.はじめに
プログラミング初心者は必ず読むべきとも、言われている良書「リーダブルコーディング」を読み、要約をチェックリストとして残していく。
　この記事を見直せば、誰でも読みやすく現場でも評価されるようなコードを書けるようにしたい。

読み進める度、更新していきます。

#第１部｜表面上の改善
変数やクラス名などの付け方などについて

##チェックリスト
1. [ ]  情報を含まない名前を使用していない（スコープが短い（使用される行数が短い）一部の名前を除く）

2. [ ] 　ループイテレーター（ブロックメゾットなどで使われるi,j,kなど）は、意味のある名前を使用している

3. [ ] 　定数やグローバル変数は長くても分かりやすい名前をつけているか
4. [ ] 　大文字やアンダースコア、キャメルスタイルなどはフォーマット規約に乗っ取っているか
5. [ ]   名前が他の意味に捉えられることはないだろうか（何度も自問自答したか？）
6. [ ]   限界値を明確にするためにMAXやMINを使う
7. [ ]   範囲を指定するときはfirstとlastを使う
8. [ ]   含包・排他的範囲(どこからどこまで的な表現)にはbeginとendを使う
9. [ ]   ブール値(true or falseを返す値)は文字の最初に動詞を持ってくると良い、
　否定系はわかりづらいので避ける
Windows Application Driver で Windows アプリケーションにアタッチ

Windows Application Driver を利用して起動済みアプリにアッタッチして操作します。
Pythonですぐ動作が確認できるコードがWeb上で見当たらなかったので同じように困った方の参考になれば嬉しいです。

#1. Windows Application Driver の使い方。
他の方の良い記事を参考にしてください。

https://qiita.com/yuuhu04/items/5a96608ad96eccee34a0


- 要素の取得

```
C:\Program Files (x86)\Windows Kits\10\bin\XX\x64\inspect.exe
```

- Application Driverの起動

```
C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe
```


#2. Pythonで起動済みワードパットにアタッチ。
起動済みワードパットの**ファイルタブ**をクリック後、**開く**をクリックするアクションをします。

```python:attach_wp.py
# -*- coding: utf-8 -*-
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def getDriverFromWin(win):
    win_handle1 = win.get_attribute("NativeWindowHandle")
    win_handle = format(int(win_handle1), 'x') 
    desired_caps = {}
    desired_caps["appTopLevelWindow"] = win_handle
    driver = launchApp(desired_caps)
    driver.switch_to_window(win_handle)
    return driver

def launchApp(desired_caps):
    dut_url = 'http://127.0.0.1:4723'
    driver = webdriver.Remote(
    command_executor = dut_url,
    desired_capabilities = desired_caps)
    return driver

#nameで指定したクラスにアタッチします.    
def SetUp_SelectClassName(name):
    #set up appium
    desired_caps = {}
    desired_caps["app"] = "Root"
    desktop = launchApp(desired_caps)
    win = WebDriverWait(desktop, 120).until(EC.presence_of_element_located((By.CLASS_NAME,name)))
    driver = getDriverFromWin(win)
    return driver
      
def Click_SelectName(appdriver, name):
   element = appdriver.find_element_by_name(name)
   if True == element.is_enabled():
       element.click()
       
def tearDown(driver):
    driver.quit()    

if __name__ == '__main__':
  #Windows Appliction Driverを起動 . 
  #ワードパッドを起動しておく. 
  appdriver = SetUp_SelectClassName('WordPadClass')
  #ファイルタブをクリック.
  Click_SelectName(appdriver,"ファイル タブ")
  #フォルダを開く.
  Click_SelectName(appdriver,"開く")
  #終了.
  tearDown(appdriver)

```
[参考元](https://github.com/microsoft/WinAppDriver/issues/92)。
Amazonのポイントを利用しないで貯めるためのUserScript

# 姉さん、Amazon Kindle本の50%ポイント還元セールです。
> 【50%ポイント還元】Kindle本キャンペーン
> 期間：2021年2月19日（金）～2021年3月4日（木）（日本時間）

https://www.amazon.co.jp/s?i=digital-text&bbn=7962654051&rh=n%3A2250738051%2Cn%3A7962654051%2Cn%3A2275256051%2Cn%3A2293143051&dc&qid=1614698230&rnid=2275256051

https://www.amazon.co.jp/s?i=digital-text&bbn=8516654051&rh=n%3A2250738051%2Cn%3A8516654051%2Cn%3A2275256051%2Cn%3A2291476051&dc&_encoding=UTF8&qid=1614701152&redirect=true&rnid=2275256051

せっかくの機会なので、ポイントを貯めに貯めよう！

# 利用環境
* Tampermonkey  
  https://www.tampermonkey.net/

# UserScript
```js:userscript.js
// ==UserScript==
// @name         do not use amazon point.
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://www.amazon.co.jp/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    document.querySelectorAll('input#balance-checkbox-0').forEach(function(elm) {
        if(elm.checked) {
            elm.click();
        }
    });
})();
```
ラムダ式のありがたみを噛みしめるため、敢えて使わない派。

# 効果
『ポイントを利用する』のチェックが外れてうっかり利用が減って、ポイントをためやすい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/376450ec-5ebe-fa34-1486-85916d913ef3.png)
『みたむらくん』最高です。

# 備考
Amazonのデジタル コンテンツの場合、デフォルトが『ポイントを利用する』だったので、こんなUserScriptを作って久しいのだけど。

https://gist.github.com/libraplanet/18ef88dc289dbf7500acf2c3f46bcea5

もしかして、いつのまにかデフォルトでOFFに出来る様になってたりする？:thinking:

ちなみに私はポイント貯めるマンなので、うん万分貯めてスカッと使いたい派です。(PS3/PS4はヨドバシのポイントだけで買いました。) そんな同士用のスクリプト。
TypeScriptをなんとなく理解するための記事④ ~構造型~ 

# この記事は何？

TypeScriptとは何か、何がいいのかを伝えようと頑張った記事の**第4弾**です！

1~3弾は、TypeScriptの書き方にフォーカスしましたが、
この記事では、TypeScriptの特徴である**Structural Type System（構造型システム）**について説明していきます。

@ 過去の記事👇も合わせて御覧ください！
　1. [JavaScriptを知っている方がTypeScriptをなんとなく理解するための記事① ~はじめに~](https://qiita.com/NOMURA_keibyou38/items/06a3218de3ff480ce9de)
　2. [TypeScriptをなんとなく理解するための記事② ~型を組み合わせる: Union~](https://qiita.com/NOMURA_keibyou38/items/9db230baf556cdfee276)
　3. [TypeScriptをなんとなく理解するための記事③ ~汎用的な型を作成する: Generics~](https://qiita.com/NOMURA_keibyou38/items/45974b8f802c51fe5a1d)
　4. TypeScriptをなんとなく理解するための記事④ ~構造型~ `← この記事`
@ TypeScriptがなんとなく理解できたら、是非インストールして、触ってみてください！
　👉 [【画像で説明】シンプルにTypeScriptを導入して使う方法](https://qiita.com/NOMURA_keibyou38/items/2cbb5971cea1ef6e83f5)

# 構造型って何だ？
よく比較されるものとして、公称型と構造型があります。
**公称型**に関しては、JavaやPHPの型システムに利用されており、**クラス名の一致**で型の互換性（同じような型かどうか）を識別します。

一方で、TypeScriptの**構造型**は何なのでしょうか？
構造型（Structural Type）は、**型の構造さえ同じであれば互換性がある**と判断する仕組みのことです。

この記事では、TypeScriptの大きな特徴である、構造型について理解していきます。

# コードから構造型の理解を深める

では、実際にコードを見ながら構造型について理解していきましょう。
以下に、型の構造が同じコードを書いてみました。

```typescript
// { name: string, cry: string }の構造を持つAnimal型を作成
interface Animal {
  name: string;
  cry: string;
}

const animalCryInfo = (animal: Animal) => {
  console.log(`${animal.name}の鳴き声は、${animal.cry}`);
}

// vividMorayは{ name: string, cry: string }と同じ構造 → Animal型と同じ
const vividMoray = { name: 'ハナヒゲウツボ', cry: 'ありません' };
// vividMorayは、引数がAnimal型と構造が一致するので、動作する！
animalCryInfo(vividMoray); // ハナヒゲウツボの鳴き声は、ありません
```

最初に`interface`を利用して、`{ name: string, cry: string }`の構造を持つ`Animal`型を作成しています。

```typescript
interface Animal {
  name: string;
  cry: string;
}
```

次に、`Animal`型を引数に持つ関数`animalCryInfo`を定義しています。

```typescript
const animalCryInfo = (animal: Animal) => {
  console.log(`${animal.name}の鳴き声は、${animal.cry}`);
}
```

次に、オブジェクト`vividMoray`を定義します。このオブジェクトの型は推論により`{ name: string, cry: string }`と解釈されます。

```typescript
const vividMoray = { name: 'ハナヒゲウツボ', cry: 'ありません' };
```

最後に`animalCryInfo`関数の引数に、オブジェクト`vividMoray`を入れてみます...。
もし、`Animal型`とオブジェクト`vividMoray`が同じ型（構造）であれば、問題なく実行されますが。。。

```typescript
animalCryInfo(vividMoray); // ハナヒゲウツボの鳴き声は、ありません
```

問題なく`ハナヒゲウツボの鳴き声は、ありません`と出力されます！

このように、型の構造に焦点を当てて、型チェックする仕組みが**構造型システム（Structural Type System）**です。

TypeScriptを記述するときは、この**構造型**を意識して書いたほうが良さそうです！
さもなくば以下のようなエラーが出てしまいます。😱

```typescript
interface Animal {
  name: string;
  cry: string;
}

const animalCryInfo = (animal: Animal) => {
  console.log(`${animal.name}の鳴き声は、${animal.cry}`);
}


const vividMoray = { name: 'ハナヒゲウツボ'};
animalCryInfo(vividMoray);
// タイプの引数 '{ name： string; } 'はタイプ'Animal'のパラメータに割り当てることはできません。
// プロパティ'cry'がタイプ '{ name： string;} 'にありませんが、タイプ' Animal'.ts（2345）では必須です
```

# 終わりに

今回は第1~3回と異なったTypeScriptの特徴を紹介しました。
この記事を見て、TypeScriptを触ってみよう！という人が増えていただければ幸いです👍

わかりやすかったら、是非LGTM✨お願いします！（励みになります！）

@ ハンズオンも書いたので、さっそく使ってみたい人は是非！
　👉[【TypeScriptハンズオン①】男もすなるTypeScriptといふものを、女もしてみむとてするなり](https://qiita.com/NOMURA_keibyou38/items/8cb285900291df83957a)

# 参考文献
- https://qiita.com/suin/items/57cfc0ec9bb1a6995aa5
- https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html
【JavaScript】クロネコヤマトの404ページでダンボールをこじ開けてみた

先日バズっていた以下のツイート↓


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">お探しのページが見つかりません Page not found <a href="https://t.co/WAMjFEzTEk">https://t.co/WAMjFEzTEk</a><br><br>クロネコヤマトの404ページがめちゃ可愛かったのでみんなも見て</p>&mdash; たび (@mesotabi)<a href="https://twitter.com/mesotabi/status/1366374362245337089?ref_src=twsrc%5Etfw">March 1, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

どうやらクロネコヤマトのウェブサイトの[404ページ](https://www.kuronekoyamato.co.jp/ytc/404error.html)が面白いらしい



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/cf5ede74-2a93-90a5-b307-85e9fecc347b.png)


こんなことになっている。
そう、**ダンボールを開けまくってクロネコを探すミニゲーム（制限時間30秒）**が始まるのである。

<font color="red">30秒？俺には余裕だぜ...３秒で見つけ出してやる。</font>

こいや！！！！

# すみませんでした

![kuroneko1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/cd3beba7-8a69-a256-b936-dd8ae718734c.gif)

い、いない...？！クソッ、どこに...
グッ...指がもげる...

![kuroneko2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/89ec56bb-1342-62c2-4636-d6a8c0129b86.gif)

**（ラスト４箱目で発見）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/9eaddc1b-fea4-428c-ccde-2f7dd6f33dd1.png)

赤文字に完全に煽られてしまった。
覚えてろよ！！！！

# フロントエンジニアをなめるな

ここまで苔にされるのは久しぶりだ。このままじゃ引き下がれない。

**要は箱を全部開ければいいんだろ？**
やってやるさ。

## ソースコード偵察

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/bc57fc1a-9889-0211-c661-7898ae1d9a1d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/56eaa6b4-542b-705a-da31-3e394a06fb5a.png)

ふーん？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/ca3ff2f6-1ed4-db1c-23d8-8aa7acb72a87.png)

(↓/assets/js/notfound.jsから抜粋)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/32f1d07f-44b0-151f-a4b0-9662fe4acb6e.png)

ほーん？（めっちゃコメントついてて読みやすいやんけ...）
わかった。つまり、これをこうして...

```javascript
for(var i=1; i<=30; i++) {
    const className = `.box-game-item-${('00'+i).slice(-2)}>a`;
    $(className).eq(0).removeClass("disabled");
    $(className).eq(0).click();
}
```


こうじゃ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/78d46c24-3885-3369-c6c6-3f4985ec5f44.png)


# 復讐の時

歯ァ食いしばれ！！！

![kuroneko3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/7d52310d-c938-eeb9-4427-96e7f0a6e049.gif)
**オラァ！！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/66f951fd-3f9f-2674-4c5a-68871a0d18e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169634/b13cb4ec-f27f-4fe8-04bf-afa5821419d6.png)


おわり


（クロネコヤマトさんへ：純粋に楽しいゲームでした。ありがとうございました）
FortiGateのコンフィグバックアップについて備忘録

#はじめに
初記事です。
そして自分の備忘録のためだけの記事です。
もし同じようなことで困っていたりしている人のお手伝いになれば幸いです。

#どんな作業をしていたのか
FortiGateのOSアップデート作業が予定され、
それに伴い本番機のコンフィグを提供してもらいアップデート後も現在と同様に動作ができるのかを検証していました。
アップデートパスの間にある、ver6.2.0からSuper adminとGlobal adminの仕様に若干の変更が入っていました。
詳しくはリリースノートのSystemの部分を確認してください: [リリースノート](https://docs.fortinet.com/document/fortigate/6.2.0/fortios-release-notes/230510/changes-in-default-behavior)
エンドユーザ様から提供いただいた現行のコンフィグファイルを、
検証機にリストアしてポリシーテストやアップデートのテストを進めていました。
その中でadminの仕様の違いでver6.2.0以上からリストアができなくなっていることが確認でき、
Super adminのプロファイルを持っているアカウントが存在していないことを確認しました。


#原因
Super adminのアカウントはSuper adminのプロファイルを持つアカウントでログインしないとコンフィグをバックアップしても出力されないことが確認されました。
そのため、Super admin以外のアカウントで出力されて提供していただいたコンフィグファイルからリストアしていたので、adminの存在がそもそもなかったものとなっていました。


```config:adminでlogin
#config-version=FGT60D-6.0.12-FW-build0419-210127:opmode=0:vdom=0:user=admin
~~(中略)~~
config system admin
    edit "admin"
        set accprofile "super_admin"
        set vdom "root"
~~(中略)~~
    next
    edit "test_user"
        set accprofile "prof_admin"
        set vdom "root"
~~(中略)~~
    next
end
```


```config:test_userでlogin
#config-version=FGT60D-6.0.12-FW-build0419-210127:opmode=0:vdom=0:user=test_user
~~(中略)~~
config system admin
    edit "test_user"
        set accprofile "prof_admin"
        set vdom "root"
~~(中略)~~
    next
end
```

#改善点・反省点
この辺のログインユーザによってバックアップとして取得しているコンフィグファイルの内容も変わってきているっぽいです。
エンドユーザ様とも情報共有し以降の運用でバックアップを取得するときに気を付けていただけるように情報共有をしました。
そもそもこの事象を2年間放置していたので故障して筐体を入れ替えなどの対応になった場合は、
直近に取ったバックアップをかぶせていたでしょうから、
今回のログインユーザの問題でsuper_adminが見えない！というレベルの問題ではなかったと思われます。
今後新機器導入やもっと新しいバージョンでの導入になった場合は、
リリースノートや基本動作検証などの検証作業などもっとちゃんとやっていこうと思わされる事象でした。
バリデーションやエラーメッセージ

バリデーションはモデルで設定する
validates :name, {ここに書いていく}
```validates :content, {presence: true, length:{maximum: 10}}```
content ： バリデーションをかけるカラム


バリデーションでfefefe.saveなどが失敗した場合は
```fefefe.errors.full_messages```
の中にバリデーションで引っかかったエラーの内容が自動的にはいる

```
<% @post.errors.full_messages.each do |message| %>
   　　<%= message %>
<% end %>
```

####バリデーションの種類####
presence: true 入力チェック
length:{maximum: 10}　文字数チェック
uniqueness: true　重複チェック
ARGVとgetsの併用

Rubyで暗号化プログラムを書いてたとき、
ARGVと標準入力getsを一緒に使うとエラーが起きたので解決策をポストしときます。


```encrypt.rb
file = open(ARGV[0])
puts "暗号キーを入力してください"
num = gets.to_i

# 以下省略

```

プログラムを実行するとgetsでの標準入力を受け付けない。

### 解決策

STDIN.getsにする。

```encrypy.rb
file = open(ARGV[0])
puts "暗号キーを入力してください"
num = STDIN.gets.to_i

# 以下省略

```

別解

```encrypy.rb
file = open(ARGV[0])
ARGV.clear
puts "暗号キーを入力してください"
num = gets.to_i

# 以下省略

```


### 理由

getsとARGFについて

- Kernel#gets、Kernel#readline、Kernel#readlines
  - それぞれARGF.gets、ARGF.readline、ARGF.readlinesと同じ。モジュール関数

- ARGF
  - ARGVの各引数をファイルパスとみなし、それらのファイルを連結した1つの仮想ファイルを表すオブジェクト。 ___ARGVが空なら標準入力する___。


ARGVが空じゃなかったのでgetsできなかったんですね。
ARGV.clearで配列をきれいにしてあげるか、STDIN.getsのように別オブジェクトで標準入力を受け付けましょう。
Community Cloud の基本 ⇒ Community Cloud の使用開始

１．会社は、外部ユーザと交流するために Community Cloud をどのように利用できますか?
２．Salesforce Community Cloud を使用して構築されたコミュニティには、次のうち、どのような利点がありますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/6b4b17d1-207f-ef70-2d80-8a3532ee9dc4.png)
初心者必見！！再利用するコンポーネントは「Vue.component」で定義しよう！

皆さんこんにちは！

何回も使うコンポーネントって毎回``import``するの面倒くさくないですか？？

それに``import``した後に``components``で定義しなきゃいけない。。。

僕の場合、ユーザーに分かりやすいようにパンくずリストのコンポーネントをページごとに必ず設置します。

このように何回も使うコンポーネントは再利用できるように``Vue.component``で定義しちゃいましょう！！

```main.js
import Vue from 'vue'
// パンくずリストコンポーネント
import Breadcrumb from './components/Breadcrumb'

Vue.component('Breadcrumb', Breadcrumb)
```

一応簡単に説明しますね。

``Vue.component``は、第１引数に**呼び出すときの名前**、第２引数に**対象のコンポーネント**をそれぞれ引数にします。

作業はこれだけです！

後はいつものように呼び出してあげてください。

作業効率アップ♪

以上、「初心者必見！！再利用するコンポーネントは「Vue.component」で定義しよう！」でした！

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

あと、最近「ココナラ」で環境構築のお手伝いをするサービスを始めました。

気になる方はぜひ一度ご相談ください！

Thank you for reading
Laravel:既存テーブルにカラムを追加する方法

# 概要
Laravelで既存テーブルにカラムを追加する方法について解説

# 例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/f9bb6bf9-6ddf-8a25-287e-5b4a1ad0a263.png)

# 手順１：追加用のマイグレーションを作成
ターミナルで下記のようにコマンドを実行する

```

//コマンド形式
$ php artisan make:migration add_カラム名_to_テーブル名_table --table=テーブル名

//例1 memosテーブルにtitleカラムを追加する場合
$ php artisan make:migration add_title_to_memos_table --table=memos

//例2 アンダーバーがあるuser_idカラムなどを追加する場合
$ php artisan make:migration add_user_id_to_memos_table --table=memos
```

# 手順２：作成したマイグレーションファイルを編集
アプリ名/database/migrations配下に先ほど作ったファイルが作成されているので
function up の部分に追加したいカラムを下記のように記述を行う(今回の場合titleカラム)


```php

<?php

    public function up()
    {
            //
    }

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    public function up()
    {
        Schema::table('memos', function (Blueprint $table) {
            $table->string('title');
        });
    }

```

# 手順３：マイグレーションコマンドを実行
下記のコマンドを実行

```
$ php artisan migrate
```

# 手順４：DBを確認してカラムが追加されているか確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/80b11696-06a1-6070-633c-9a64e89995b2.png)


カラムが追加されていてば完了となります。
AWS大阪リージョンの注意事項

# 待望のAWS大阪リージョン(ap-northeast-3)が登場

これまでローカルリージョンとして限定利用のみたっだ大阪リージョンが正規リージョンとしてリリースされました。正規リリースに伴い誰でも利用できます。しかし、ローカルリージョンから昇格したためか、通常のリージョンとは少し違う特徴があります。全部調べられたわけではありませんが、気がついた範囲で紹介します。

# 2021/07/25追記
この記事を書いたあとにGuardDutyなど機能が追加されたので、記事の編集を行いました。

## リージョンはデフォルト有効

2019年3月20日以降にリリースされたリージョンは、デフォルトでは利用できず明示的にリージョンを有効化する必要があります。ところが大阪リージョンはデフォルトで有効化されているため、有効化作業は不要です。ローカルリージョンとして大阪リージョンが登場したのが2018年で、この仕様になる前だったからかとみられます。設定不要で使えて便利ですが、使わないリージョンが有効化されることで、攻撃者が知らないうちに不正なインスタンスを起動して仮想通貨マイニングなどを行うリスクが発生します。大阪リージョンでもGuardDutyを忘れずに設定、~~といいたいところですが大阪リージョンにはGuardDutyがありません。ないものはしょうがないので、~~AWS Organizationsの[Service Control Policy](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps.html)を検討するなどしましょう。AWS Configは利用できるので、全リージョンで有効化している場合は大阪リージョンにも忘れずに追加設定しておきましょう。
現在は大阪リージョンでもGuardDutyが利用できます。

## サービスが微妙に少ない

先述のGuardDutyがないこともありますが、サービスが微妙に少ないです。さすがにEC2とかRDSとかはあるのですが、利用している人も多いであろう~~CodeBuild~~やCloud9, ~~GuardDuty~~, ~~EFS~~, ~~WAF~~, Detectiveなども実装されていません。大阪リージョンでサービスを動かそうとする前に、一度必要なサービスがリリースされているか確認した方がよいです。

## AMDインスタンス, Gravitonインスタンスの設定がない

大阪リージョンはIntelCPUインスタンスのみで、EPYCやGravitonインスタンスは今のところありません。そのうち追加されるかと思われますが、現状ではあきらめる必要があります。

## インスタンスタイプによってはマルチAZ構成を取れない

これが大阪リージョン最大の特徴だと思います。大阪リージョンは一部のインスタンスタイプが1AZのみの提供になっています。具体的にはt2, c4, d2, m4, r4, x1, x1eが1AZ(apne3-az3)のみの提供です。（このゾーンがa, b, cのどのゾーンになるのかはアカウントによって異なるため、利用されるアカウントでご確認ください）このため、これらのインスタンスタイプを使ってしまうとAZ間冗長構成を取れないので注意してください。今から使うならt3, m5など次の世代のインスタンスを使う方がよいですが、古いシステムを移設したいなど旧世代インスタンスを必要とする場合には意識する必要があります。

## 大阪リージョンの利用戦略

リリース経緯もあって若干特殊な仕様になっていたり、現時点では機能も控えめな大阪リージョンなので、今の時点では（少なくとも自分自身が担当しているシステムにおいて）大阪リージョン単体で使うのは若干厳しい気がしています。利用を検討するときは、使おうとしている機能が大阪に展開されているか、使い始める前にチェックしておく必要があるでしょう。幸いにしてVPC Peeringは利用できるので、足りない機能を東京リージョンで補いながら大阪リージョンでシステムを展開していくのがよいんじゃないかと思います。
iTerm2からVisual Studio Codeを開きたい

#【iTerm2からVisual Studio Codeを開きたい】

たった1分の簡単パス設定で、かなり便利になります。
$ code Dockerfile などで使います。

##設定手順

1、Visual Studio Codeを起動する。

2、commnd + shift + P　を押す。

3、コマンドパレットに「 shell command install 」と入力する。

4、インストールを実行する。

5、「シェルコマンド ‘code’ がPATHに正常にインストールされました。」と表示されると完了。

→　iterm2でcodeコマンドを使用すると、Visual Studio Codeが開く。
ROS2のworkspaceの構成

ファイル構成を忘れるので，メモする．


```
ros2_ws
 └ src
    ├ package1
    │  ├ node
    │  │  ├ <node1>.py
    │  │  └ <node2>.py
    │  ├ resource
    │  ├ src
    │  ├ test
    │  ├ package.xml
    │  ├ setup.cfg
    │  └ setup.py
    │
    ├ package2
    │
    └ message1
       ├ msg
       ├ src
       └ srv
```



## 参考にしたページ
https://qiita.com/myasu/items/87ee6a208f4af615e653
Blue Prismのプロセス実行権限の設定について（マルチチーム環境/Multi-team Environment）

オッスオラ夢ノ島！

Blue Prismでプロセスの実行権限せってえってどうやってやんだ？と思って検索したけんどイマイチよくわかんねー！ってか見つかんねー！
と思ったら「マルチチーム環境（Multi-team Environment）」っていうなめえ（名前）なんだな！

わかりにき～！


というわけで、備忘録的に書きます。

ドキュメントはBlue Prismポータルサイトに載ってるこのドキュメントです（要ログイン）。

日本語ドキュメント(6.10はまだ出てません）
v6.7 User Guide - Multi-Team Environments (Japanese)
https://portal.blueprism.com/documents/v67-user-guide-multi-team-environments-japanese

英語ドキュメント
v6.10 User Guide - Multi-Team Environments
https://portal.blueprism.com/documents/v610-user-guide-multi-team-environments

v6.7 User Guide - Multi-Team Environments
https://portal.blueprism.com/documents/v67-user-guide-multi-team-environments

## やりたいこと

今回やりたいのは
<b>「ユーザーA（孫悟飯）にはプロセス：サイヤ人を見せたいけど、ユーザーB（ヤムチャ）にはプロセス：サイヤ人を見せたくない」</b>

というやつです。
孫悟飯というユーザーは「サイヤ人」というグループに所属していて、ヤムチャは「地球人」というグループに所属しているので、サイヤ人フォルダはヤムチャには見せたくないわけですね。

### 以下手順

①まずはBlue Prismのシステム＞セキュリティ＞ユーザー役割　画面で任意の名前（今回は「サイヤ人」と「地球人」）を作成し、プロセスにチェックを入れて「適用」ボタンを押して保存します
※役割はプロセスを表示できるようにどちらの役割も「プロセススタジオ」にチェックを入れてます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/a527ced1-4cc0-874e-ec1e-5ab453bef1fb.png)

②次にシステム＞セキュリティ＞ユーザー　画面でユーザー「孫悟飯」を作り、役割に「サイヤ人」を設定します。
同じようにユーザー「ヤムチャ」を作り、役割に「地球人」を設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/14357162-b770-818d-f2d7-464c653c7cd8.png)

③次にスタジオの画面でプロセスの方に「サイヤ人フォルダ」を作成し、その下に実行権限制御をしたいプロセスを移動します（今回だと「サイヤ人」プロセス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/c698e50c-4701-1326-939f-1862f5ac3f45.png)

④サイヤ人フォルダで右クリックすると「アクセス権」というメニューが出てくるのでクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/e0d569dd-7f42-2f67-1f10-824e53fb7ec9.png)

ユーザーの役割「地球人」のアイテムに対する許可とグループに対する許可のチェックを外してOKします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/ab349e0c-bd0c-d27b-1781-847cd2682011.png)

以上の処理が終わった状態で、ユーザー「ヤムチャ」でログインすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/4bbe9304-c526-4042-e3db-c80dc031f863.png)

サイヤ人フォルダは見えませんが、
ユーザー「孫悟飯」でログインすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636507/1b76e325-6483-4156-a274-c9924ce4d0d6.png)

サイヤ人フォルダが見えています。
こんな感じで制御ができるわけですね。

ドキュメントを見るとプロセスやオブジェクトのほかにランタイムリソースの制御もできると記載があります。
奥深き権限設定。
【Docker】 よく使う基本的なコマンド

はじめに
---
1ヶ月半ほど前にDockerの勉強を始めたものの、この約1ヶ月間をポートフォリオ制作や他の課題に時間を費やし、久しぶりに勉強を始めたところです。Docker独自の初見のコマンドも多く、覚えることが大変だと感じたため、自身のメモ用として今回もQiitaに記録を残しておきたいと思います。
<br>

コマンド集
---
```
# ホストの中にあるDocker imageを確認
$ docker images

# コンテナを作成し、docker imageのデフォルトコマンドを実行する
$ docker run <image名>

# コンテナを表示
$ docker ps     # 起動しているコンテナのみ表示
$ docker ps -a  # 全てのコンテナを表示（起動していない物も含む）

# コンテナを作成し、デフォルトコマンドを実行する（コンテナ内に入る）
$ docker run -it <image名> <デフォルトコマンド>
例）$ docker run -it ubuntu bash

# 既に作成されているコンテナを指定し、デフォルトコマンドを実行する（コンテナ内に入る）
$ docker exec -it <コンテナ名> <デフォルトコマンド>
例）$ docker exec -it ubuntu bash

# コンテナから抜ける
（プロセスを切る = status: Exited）
$ exit

# コンテナから抜ける
（プロセスを切らない = status: Up）
$ detach

# status: Exitedの状態をUpに変更する
$ docker restart <コンテナ名>

# コンテナから新しいイメージを作成し、名前をつける
$ docker commit <コンテナ名> <新しいimage名>

# Docker imageの元のリポジトリ名同じ名前に変更してpushする
#source: 一度任意で設定したimage名
#target: username/リポジトリ名
$ docker tag <source> <target>

# Docker imageをDocker Hubへpushする
$ docker push <image名>

# Docker HubからDocker imageをpullする
$ docker pull <image名>
```

● tag
　　Docker imageのバージョン
　　（latest: デフォルト）

終わり
---
今回は以上になります。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になればと思っています。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。
今迄の学習内容２

ネットワークの基礎に関しては、Webサイト以外の書籍等は、「今迄の学習内容１」に書いたPCに関する図解のものと、<li>「図解でよくわかる ネットワークの重要用語解説 改訂５版」</li>
を読んでいます。
この書籍はきたみ りゅうじ氏が書かれていますが、キタミ式イラストIT塾シリーズでお馴染みの方ですので、初心者でもかなり読みやすいと思います。