OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのGitHubへのpushでエラーが出る

はじめてGitHubにpushしたらエラーが出たときの対処法:blush:

以下エラー内容▼

```sh
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/Monet13/gasTest.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

##原因
GitHubにレポジトリを作ったときREADMEが自動作成されるが、それがローカルにはないのが原因。
なのでまずはpullするなりして最新のリモートを取り込んでね！って書いてあります:grinning:

##対処方法

#### 1.fetchする

```sh
$ git fetch
```
#### 2.mergeする

```sh
$ git merge origin/master
```

#### 3.READMEがnew fileとして反映されていることを確認

```sh
$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

	new file:   README.md
```

#### 4.addしてcommitする

```sh
$ git add .
$ git commit -m 'README追加'
```

#### 5.最後にpushする！
```sh
$ git push -u origin master
```

リモートを確認すると、pushできていると思います:blush:
以上！
【Slack】Slack API を使用してメッセージを飛ばすまでの手順

# App を新規作成

https://api.slack.com/apps にアクセス。
**Create an App** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/35d101fe-a9a9-b7d4-a6ff-3f67d13557b4.png)


**App Name** は 適切なアプリ名をつけてください。
今回は「SlackMessageTest」と名付けています。

**Development Slack Workspace** は、紐付ける Slack のワークスペースを指定してください。
今回は「RiekureAlone」を指定しています。

入力が終わったら **Create App** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/e39e6fd7-18dd-b672-fced-f4092fc982ff.png)

そして下のような画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/6c5b329f-ad10-f8c2-1fa4-d5f9e487bc0e.png)

# API でメッセージを送信できる権限を追加

**Permissions** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/0ffb5234-863a-a0cb-eff4-a1ed11a3cc97.png)

下にスクロールして、 **Scope** の **Add on OAuth Scope** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/ad16e791-8e34-f8bd-94ad-667abc2ae77d.png)

**chat::write** を選択します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/1fd6866e-1dbd-8e6c-f7ab-cb7029284084.png)

選択したらこんな画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/090cbf7c-db41-179f-5988-7b87572003e3.png)

# ワークスペースにインストール

ページの先頭の **Install App to Workspace** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/2775ab5b-b84a-ee24-0149-d1b6f652142b.png)

**許可** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/79f8f252-7da5-8e9a-5110-303079525def.png)

成功すると、 **Access Token** が発行されるので、メモしておきます。
（スクショで黒く塗りつぶしているところです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/d4b79bb7-61fe-b305-3b64-4886614f8ee9.png)

# チャンネルに対して App を追加

App を追加したいチャンネルを選択して、 **アプリを追加する** を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/09b4adf7-af2f-9c0c-84d7-63bbe6dcec7f.png)

作ったアプリを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/50963933-f12f-553c-b429-c6e548bfc86e.png)

# 動作確認

https://api.slack.com/methods/chat.postMessage/test
で正常にメッセージを送信できるか確認します。

とりあえず Arguments で Required に設定されている項目を埋めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/686ea688-d145-271b-5e02-2ff8a8538345.png)

入力したら、下にスクロールして **Test Method** を押します。
うまくできたら、 Slack にメッセージが飛ぶことを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/783e5cb7-ddc7-75e9-6fe5-2065cb053e06.png)
Swiftで、Kotlinのdata class の copy() みたいのが欲しい

Swift と Kotlin を行ったり来たりして開発していると、うーってなることが結構あります。

そんな中で、似ていて違ってうわってなるのが Kotlin の `data class` で暗黙に生成される `copy()` メソッドが Swift では生成されないことです。

ただ、コメントで指摘を受けて気付きましたが、Swift的には `data class` 的に `struct` を使用する時は、プロパティは var で定義すれば、 let が伝播してくので不変になりますね。

そうなるとこの実装の役立つタイミングは、変更できない、例えばライブラリやモジュールの構造体を扱いたい時とかの限定的な場面だけになりそうです。

実装してみたところ、結構うまくいったので、共有します。

実装したいことは、「引数で指定したプロパティだけ変更して、他の項目は元と同じ別の struct を入手したい」です。

```swift
struct Bean {
     let weight: Double
     let size: Double?
     let name: String?
 }

 extension Bean {
     func copy(
         weight: (() -> Double)? = nil,
         size: (() -> Double?)? = nil,
         name: (() -> String?)? = nil
     ) -> Bean {
         Bean(
             weight: choose(weight, value: self.weight),
             size: choose(size, value: self.size),
             name: choose(name, value: self.name)
         )
     }
 }

 func choose<T>(_ block: (() -> T)?, value: T) -> T {
     guard let block = block else { return value }
     return block()
 }
```
`copy()` メソッドの引数をOptionalのブロックにするのが思いつきです。
こちらの構造体は機械的で実装するのはまあまあ面倒ですが、使う時は例えば、

```swift
let blackSesame = Bean(weight: 0.1, size: 2.0, name: "黒ごま")
let whiteSesame = blackSesame.copy(name:{ "白ごま" })
```

こんな感じです。

extention はこんな実装もできそうです。どちらがいいかしら？

```swift
extension Bean {
    func copy(
        weight: (() -> Double)? = nil,
        size: (() -> Double?)? = nil,
        name: (() -> String?)? = nil
    ) -> Bean {
        Bean(
            weight: (weight ?? { self.weight })(),
            size: (size ?? { self.size })(),
            name: (name ?? { self.name })()
        )
    }
}
```

もっといい方法あったら、是非共有くださいませ。
twitterから有名人のtweet履歴を取得する

IBM cloudのpersonality insightを使ってみたい、と思いすぐにぶつかった壁。
その際の備忘録。

###困ったこと
3000語以上の文章が必要（というか望ましい）とのこと。
そこでtwitterさんから有名人のtweetを拝借する。
1tweetあたり約15単語程度あるとみなし、1名あたり200tweet取得する。

ただし、大前提としてtwitter APIの登録をしておく必要がある。
私は以前に登録申請済みなので、ここでは同手順は省略する。

###実装方法
~~~
# -*- coding:utf-8 -*-
###
import tweepy
import re
import subprocess

# ユーザリスト
import user_list
# twitter APIの認証キー
# Access_token, Access_secret, Consumer_key, Consumer_secretの４つ
from auth import twitter_credentials as tc

###
def get_twitterdata(username, rfile):

  # 認証キー読み込み、API設定
  auth = tweepy.OAuthHandler(tc.Consumer_key, tc.Consumer_secret)
  auth.set_access_token(tc.Access_token, tc.Access_secret)
  api = tweepy.API(auth, wait_on_rate_limit = True)

  # tweetを格納するリスト
  tweets_data =[]
  # 200tweetまでデータ取得
  for tweet in api.user_timeline(screen_name=username, count=200):
    # つぶやきテキストを取得
    tmp_text=tweet.text
    # 連続改行は１つに集約
    tmp_text=re.sub('\n+','\n',tmp_text)
    # tweetをリストへ追加
    tweets_data.append(tmp_text + '\n')

  # ファイル出力
  with open(rfile, "w",encoding="utf-8") as wf:
    wf.writelines(tweets_data)

###
if __name__ == '__main__':

  # twitterのユーザ名を取得
  userlist=user_list.username

  for i in range(0,len(userlist)):
    username = userlist[i]
    rfile = "./data/tweet_"+str(i).zfill(3)+".csv"

    try:
      get_twitterdata(username, rfile)
    # プライベート設定されているなど、取得できない場合は空ファイルを生成
    except:
      subprocess.run(["touch",rfile])
~~~

###ユーザリストの例
バレバレだけど、人名は伏せる。
username=[
"ariyoshihiroiki",
"matsu_bouzu",
"takapon_jp"
]

###結果
記述内容は著作権にかかるかもしれないので割愛
tweet_000.csv
tweet_001.csv
tweet_002.csv
ができる。

###あとがき
15分ごと（？）に取得できるデータ量は制限されているため、欲張るとかなり待たされる。
リツイートなど、本人の文章ではないものも取得してしまうので、除外してしまってもよいかも。
svnで git stash と同じことをしたい 2020

### はじめに
- Git全盛のこの時代にあって、様々な理由からSubversionを使わなければならないことってあります（よね？）
- そんなあなたにお送りする、Subversionで使える「git stash」相当コマンド

### git stash save 相当のコマンド
```
svn diff > stash.patch
svn revert -R .
```
### git stash apply 相当のコマンド
```
svn patch stash.patch
```


### 参考
- 引用元：[svnで git stash と同じことをしたい](https://qiita.com/snaka/items/673c33e1210505a8851e)

※本記事は引用元とほとんど同じ内容ですが
- 2020年時点では、`patch`コマンドがWindowsのデフォルトに存在しない
- 2020年時点では、「git pop」相当コマンドも`svn patch`で対応可能
という理由から、新記事を作成しました。

最後までお読みいただきありがとうございました。
tumo.jp
BigQueryでn-gram作成

BigQueryに[前処理関数](https://cloud.google.com/bigquery-ml/docs/reference/standard-sql/bigqueryml-preprocessing-functions)があるのを発見。
テキスト分析で使えそうなNGRAM関数があるのでメモ。

## ML.NGRAMS

    ML.NGRAMS(array_input, range[, separator])



## 使い方
リンク先のページにあるが、seapatorやrange（）を指定できるのがうれしい。
※rangeは、普通2gramしか使わないけど（[参考書](https://www.amazon.co.jp/%E8%A8%80%E8%AA%9E%E3%81%A8%E8%A8%88%E7%AE%97-4-%E7%A2%BA%E7%8E%87%E7%9A%84%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB-%E5%8C%97-%E7%A0%94%E4%BA%8C/dp/4130654047)でもnを3以上にしても精度（パープレキシティ）は
あまり上がらないとのことだ）。
あと、日本語でもngram作成してくれるといいなと思ったのだけど、たぶんない。

分割対象の列をスペースやカンマ区切りなどとして入れておけば、下記のように
SPLIT()をかませてarray_inputに変えてから使える。

```SQL
SELECT application_number,ML.NGRAMS(SPLIT(STRING_AGG(titles.text),' '), [1,2])
FROM `patents-public-data.patents.publications`,UNNEST(title_localized) as titles
WHERE filing_date > 20191201 AND SUBSTR(publication_number,0,2) = 'US'
GROUP BY application_number
```

ちゃんと2-gramを作って出力してくれている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/3a978f73-c7c2-75a2-c76b-b253d371d157.png)



## その他
作ったn-gramはそのままAutoML Tablesに突っ込めば、n-gramを利用したモデルが作成できるし、
BigQuery　MLでも特徴量として使ってもらえる。
BigQueryのオンライン授業を受けたところ、GCP上で機械学習をする際の選択肢が以下３つあるとのこと。

* BigQueryMLで完結させる方法（[LOGISTIC_REG](https://medium.com/@jeffrey.james/text-classification-using-bigquery-ml-and-ml-ngrams-6e365f0b5505)）
* Auto ML
* 自分で作る（tensorflowなど）

３通り並列で今度やってみよう。
他にもML.POLYNOMIAL_EXPAND、ML.QUANTILE_BUCKETIZE、MIN_MAX_SCALERなど欲しい機能が
存在している！
今pythonやpipelineで行っていることを、BigQueryがどんどん飲み込んでいくような気がする。
tensorflowのモデルもBQMLの中で処理してくれるみたいですし。。
knexでdistinct onする方法

>特定のカラムだけdistinctしてーーー！
そしてdistinctしたカラム以外も取得してーーーー！

って時、極稀にありますよね。
RDBに多少でも触れる人生なら一生に3回くらいは遭遇するはずです。

エンジニア歴10年超えにしてやっと実運用ProductでPostgresデビューした私にも、人生で３回遭遇するうちの第一回目が来ました。

knexのドキュメント見てもですね。
「distinct on」サポートしてないんですよ。

http://knexjs.org/

distinct on なにそれ？おいしいの？くらいの勢いでカレーにスルーされてるんです。
Postgresの方言らしいので仕方ないのかな。。

もうこういったRDB固有の方言は、raw使うしか無いようですロー


## knexでdistinct on するには"raw"を使う
```
knex.select(knex.raw('DISTINCT ON (target_colum) target_colum1, other_colum2, other_colum2)
```

こうすると、target_columでdistinctしつつ、other_colum1とother_colum2も取得できます。

## orderも組み合わせる
```
knex.select(knex.raw('DISTINCT ON (target_colum) target_colum1, other_colum2, other_colum2).orderBy([target_colum, {column: 'target_colum1', order: 'desc'}])
```
orderByの１つ目は必ずdistinct onで指定したやつに。

２つ目に指定したカラムでソートして一番最初に出る行が残されて取得できるよ
統計調査士（CBT試験）対策

# 統計調査士(CBT試験）とは。
概要はこちら。https://www.toukei-kentei.jp/cbt/

# 試験対策。
対策本はほとんどなく、公式過去問集が１冊だけあります。
https://jitsumu.hondana.jp/book/b352894.html
後半1/3ぐらいは統計検定3級の内容に近いので、統計検定3級と同時期に取り組むと効率的です。

# 出題内容。
出題内容自体はCBTなので公開できませんが、基本的には過去問をやっておけば半分ぐらいは大丈夫な感じです。
前半2/3のうち数問は、日本語を読むだけで「あ、これは怪しい」とだいたい当たりをつけられる問題があります。

# 感想。
前半2/3は、記憶力とか読解力勝負の出題ですが「これ覚えて何か役に立つ？」感が拭えませんでした。後半1/3は、公的統計の読み方を考えるのに役立ちそうです。
herokuのデプロイ先リポジトリを変更する方法

プログラミングを勉強中です。
herokuにいくつかリポジトリを作っており、新しいリポジトリにpushしたいタイミングでエラーとなってしまいました。

小さなエラーではありますが、今後の為に備忘録として残させていただきます。

##状況
現在、ローカルでアプリケーションを開発中です。

開発の途中で、一度herokuにデプロイしていたのですが、
デプロイ済みのリポジトリではなく他のリポジトリにpushする必要がありました。

##行ったこと

####新しいリポジトリ（アプリケーションのデプロイ先）の作成
```
heroku create
```
####必要ないかも知れませんが、herokuサイト上に記載があったので念のためgit init。

```
git init
```
####その後、デプロイしたいアプリケーションを指定します。

```
heroku git:remote -a 【heroku createで作成されたアプリケーション名】

```
####あとは通常通り、

```
git add .
```

```
git commit -m "コミットメッセージ"
```
```
git push heroku master
```

こちらでherokuへのデプロイできているかと・・・！

####最後に

最後に、こちらのコマンドを打てば終了です！

```
heroku run rails:db:migrate
```
Zabbixサーバ　データベースデータインポートエラーについて（MariaDB10.2）

今回`Zabbix4.0`のDBインポート時に以下のようなエラーが出力されました。  
`ERROR 1118 (42000) at line 1278: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.`

インポート時に実行したコマンドは、以下となります。

```bash:DBインポート
zcat create.sql.gz | mysql -u zabbix -p zabbix
```
  
結論から言うと原因は、`immodb`厳密モードが`ON`になっているせいです。  
この設定は、`MariaDB10.2.2`からデフォルトで有効に設定されるようになりました。  
> [MariaDB 公式サイト（英文）](https://mariadb.com/kb/en/innodb-strict-mode/)  

対処方法として`/etc/my.conf`か`/etc/my.cnf.d/server.cnf`の`[mysqld]`session内に以下の設定を追記して`immodb`厳密モードが`OFF`にすることで対応可能しました。  

```ini:厳密モードOFF
innodb_strict_mode=0
```

そもそも`innodb_strict_mode`ってなに？については、[Mysql 公式サイト](ttps://dev.mysql.com/doc/refman/5.6/ja/innodb-parameters.html#sysvar_innodb_strict_mode)に載ってましたのでそちらを参照してください

ちなみに一度`innodb_strict_mode`を`ON`の状態でZabbixのデータベースインポートをしてしまった場合は、一度そのデータベースを完全に削除してから再実行してくださいとのことです。

[日本Zabbixユーザー会フォーラム]( http://www.zabbix.jp/node/4667) 

以上です。
actix-web+actix-sessionをUnit Testする方法

actix-web+actix-sessionの基本的な使い方は[ドキュメント](https://docs.rs/actix-session/)のサンプルコードを見れば分かる。
本記事ではテスト方法について書く。

# Crate Versions

```toml:cargo.toml
[dependencies]
actix-web = "2"
actix-rt = "1"
actix-session = "0.3"
```

# Handler

下のようなHandlerだったとする。

```rust
use actix_session::Session;
use actix_web::{error, Error, HttpResponse};

pub async fn example(session: Session) -> Result<HttpResponse, Error> {
    let name = session
        .get::<String>("name")
        .map_err(|e| {
            println!("{}", e.to_string());
            error::ErrorInternalServerError("Server Error")
        })?
        .unwrap_or("".to_string());
    Ok(HttpResponse::Ok()
        .content_type("text/html")
        .body(format!("Hello, {}.", name)))
}
```

# テスト

上のexample関数に注入するSessionインスタンスをどう用意するかが問題になる。

[ソースのドキュメント](https://github.com/actix/actix-extras/blob/master/actix-session/src/lib.rs#L63)を見ると

「Sessionオブジェクト取得するにはUserSession::get_sessionメソッドを使うと良い。UserSessionトレイトはHttpRequestとServiceRequestとRequestHeadに被せることができる」

といったことが書いてあるので、これを使わせてもらう。

そして[actix-webのドキュメント](https://actix.rs/docs/testing)によるとHttpRequestインスタンスを生成するためのテスト用のメソッドが用意されているのでこれを使う。

```rust
#[cfg(test)]
mod tests {
    use super::*;
    use actix_session::UserSession;
    use actix_web::dev::ServiceResponse;
    use actix_web::{http, test};

    #[actix_rt::test]
    async fn test_example() {
        let req = test::TestRequest::default().to_http_request();
        let _ = req.get_session().set("name", "Foo");
        let resp = example(req.get_session()).await.unwrap();
        assert_eq!(resp.status(), http::StatusCode::OK);
        let srv_resp = ServiceResponse::new(req, resp);
        let bytes = test::read_body(srv_resp).await;
        let body = String::from_utf8(bytes.to_vec()).unwrap();
        assert!(body.contains("Hello, Foo."));
    }
}
```

このようにしてSessionインスタンスを注入しテストができた。

# 参考

- https://actix.rs/docs/testing/
- https://docs.rs/actix-session/
(3)- 関数の足し算を咀嚼する

##やりたかった事
条件を付けて関数同士を足せるのか先生に聞いてみた結果をもっとよく理解したい。
Total= if(条件1){CalcA();}  + if(条件2){CalcB();} +  if(条件2){CalcC();}  + if(条件2){CalcD();} みたいなこと。


##サンプルプログラムを作って再現してみる事にした。

```csharp 
public class Fishing : MonoBehaviour
{
    void Start()
    {
        //条件を作るフラグ変数
        bool flagIka=true;
        bool flagAji = true;

        //クーラーボックスの中身
        int sum =0;

        //イカとアジの釣れた数を足し算
        //イカフラグがtrueなら処理を行う
        if (flagIka == true)
        {
            //関数（1）実行
            sum += Squid(1);
            //アジフラグがtrueなら処理を行う
            if (flagAji == true)
            {
                //関数（2）実行
                sum += HorseMackere(5);
            }
        }
        //全部で何匹？
        Debug.Log(sum+"匹");
    }

    //関数（1）：イカが釣れた数
    int Squid(int ika)
    {
        int squid = ika;
        return squid;
    }

    //関数（2）：アジが釣れた数
    int HorseMackere(int aji)
    {
        int horsemacker = aji;
        return horsemacker;
    }
}

```
![01JPG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/c271c79b-7998-7b8c-3fd6-67763be03b87.jpeg)

##まとめ
・フラグで条件を作る。必要ならflag関数とかも作る
・そのフラグで入れ子if文作る
・**sum + = 関数名（）;で追加していく**
・アジは英語でHorseMackere

そして出来たけど、咀嚼感がないのは何故だろう？
応用出来ない様な不安感。なんのために咀嚼したん？
自問自答。。

参考サイト
https://plus.luremaga.jp/_ct/17045369
AWS CloudFrontのキーローテーションを考えてみた

# はじめに
CloudFrontの署名付きURLを使用して画像などを配信する際に、
キーペアのローテーションをどうすれば良いのか？検討する必要があったため考えてみました。

AWSの推奨としてはセキュリティ担保のため、90日以内にキーローテーションすべきとのこと。

# 結論
結論から言いますと、[AWSのドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-rotating-key-pairs)に丁寧に書いてあったため、  基本はそちらの手順に従いました。。  

サマリだけ記載すると、以下になります。

* キーペアは2つまで作成できるため、更新時は2つ目を作成する
* キーペアを利用しているアプリケーションの環境変数などを更新する
* 古いキーペアの使用がなくなった時点で無効化→削除する

# 自システムに適用するなら、、
実際にシステムに適用する場合をイメージしてみた。
アプリケーションの実行基盤は、AWS Lambda(python3.8)を想定する。  

① 秘匿情報を含むので、SSM Parameter Store（SecureString）に格納
   キー名は`/cf/key`、複数情報をまとめて管理したいため`JSON文字列`とした。

```json
{
    "keyPairId": "aaa-key-pair-id",
    "privateKey": "bbb-private-key"
} 
```

② Lambda内でParameter Storeから取得

```python
import json
import boto3

def get_parameter(param_key):
    ssm = boto3.client('ssm')
    response = ssm.get_parameters(
        Names=[
            param_key,
        ],
        WithDecryption=True
    )
    return response['Parameters'][0]['Value']

def lambda_handler(event, context):
    # キーペアをSSM Parameter Storeから取得
    value = get_parameter('/cf/key')
    params = json.loads(value)
    print(params['keyPairId'])
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

③ 上記Parameter Storeにあるキーペア情報で署名URLを発行
  

それで、キーをローテーションする場合は、上記のParameter Storeを手動で更新するかな。  
次回のLambda実行時から新しいキーペアが使用されるはずです。

# 課題
* 90日毎にローテーションするとなると、以外と面倒な運用である。
    * キーペアはrootアカウントしか作成できないため、自動化するのも難しいと思い実現方法が想像できず。
* 古い署名付きURLの期限が切れるまで、古いキーペアを無効化→削除できない
    * 単に待てば良いのだが、本番運用のオペレーション期間が長くなるので色々面倒
* Lambda内でParameter Storeの値をキャッシュする場合は、いつ新しい値に切り替わるか分からない
    * 期限付きのキャッシュを実装する、DynamoDBにTTL付きで格納する、とかでしょうか。


# おわりに
rootアカウントだったりもあり、いまいち使いにくい印象です。
もっと良い方法や、そもそも違うサービスを使うものなのでしょうかね。。
React/Reduxでカレンダーアプリケーションを作って学んだことなど

[React/ReduxでGoogleカレンダー風カレンダーアプリケーションを作ろう](https://www.techpit.jp/p/react-calendar)というチュートリアルを完走しました。

まだ完全に理解はできていませんが、学んだことをつらつらと書いて行こうと思います。

このチュートリアル、かなりおすすめです。

##学んだこと
###ディレクトリ構成
```
src
  - components
    - hoge
      - presentation.jsx
      - container.jsx
  - redux
    - foo
      - actions.js
      - reducer.js
    - rootReducer.js
  - services
    - api.js
    - calendar.js
  - index.jsx
```

#### コンポーネントは見た目とロジックでファイルを分ける
絶対のルールじゃないけど、そうした方が無難っぽい。Reactはディレクトリの構造にいくつかの流派があるみたい。Railsが恋しい。

```
src
  - components
    - Navigation
      - presentation.jsx (見た目)
      - container.jsx (ロジック)
```

#### Redux
以下のような構成をとった。reducerをいくつか作って対応するactionと同じディレクトリに格納して、rootReducerで全てを束ねる。

```
index.js
component
redux
  - foo
    - actions.js
    - reducer.js
  - bar
    - actions.js
    - reducer.js
  - rootReducer.js
```

#### 複数のコンポーネントで汎用的に使えそうなメソッドは`services`においた
`services`って名前はプロジェクトによってまちまちらしいけど、同じような目的のディレクトリを作る場合が多いっぽい


###import
```jsx
import React from "react" // export defaultを受け取る場合は直接変数に
import { Provider } from "react-redux" // exportを受け取る時はオブジェクトに;
```

###Arrow functionでただオブジェクトを返す時は()で囲む
```jsx
const mapStateToProps = (state) => ({
  calendar: state.calendar,
  schedules: state.schedules,
});
```

###mapの後にHTML要素がくる時は`{}`ではなく`()`で囲む
```jsx
{days.map((d) => (
  <li key={d}>
    {d}        
  </li>
))}
```

###スプレッド演算子で展開後、カンマで区切って部分的に値を更新できる

```jsx
{ ...state, isStartEdit: true }; //isStartEditの値だけ上書きされる
```

###material-uiを使うといい感じのコンポーネントやアイコンを簡単に実装できる
```zsh
npm i @material-ui/core @material-ui/icons
```
```jsx
import React from "react";
import { Tooltip, IconButton } from "@material-ui/core";
import { Close } from "@material-ui/icons";

const close = () => {
  return (
    <Tooltip title="閉じる" placement="bottom">
      <IconButton>
        <Close />
      </IconButton>
    </Tooltip>
  );
};
```
[material-ui](https://material-ui.com/)
`Tooltip`、`TextField`などのフォーム要素全般、`Snackbar`、`Pagination`、`Progress`、`Table`、`Button`あたりはかなり使えそう。

逆に、レイアウトを整えたりするのは自分でCSSで整えた方が小回りがきくし、コードの見通しもよくなる気がする。Bootstrapがそうであったように。

クラスを大量につけるのとかも、見通し悪くなるし保守性下がるからやらないだろうな。

##疑問点
- `src/redux/schedules/effects.js`とかいうファイルがいきなり出てきたけどこれは何?actionとreducerだけを格納すると思っていたディレクトリにいきなり変なファイルが出てきてびびる。

##感じたこと
- `import`をたくさん書かなくちゃ行けなくてめんどくさい。Railsが恋しい。
- ファイルが色々分割されてめんどくさい。特にreducer関連とコンポーネントが離れる感じ。
- 長めのチュートリアルは途中から何をしようとしてるのかわからなくなって、楽しくなくなる。書かされてる感じ。でも全体の流れはつかめたし、答えのコードもあるので、これをベースに自分で実装していくと楽しく力がつくだろう。
- 似たような名前のオブジェクトとか変数とかがたくさんあって、どれを使ってるのかがわからなくなった
makefileを利用して簡単にmac,VSCodeでbits/stdc++.hを使う

こんにちは。初投稿です。はてなブログに書いていたのですが、参考がQiitaばっかりだったので、こういう記事はQiitaにも書いてみようかなと思い、コピーしてみました。

元記事→[こちら](https://o-treetree.hatenablog.com/entry/2020/04/27/194001)

競プロではC++が強いそうですね。

C++ではインクルードファイルとして

```hoge.cpp
#include <iostream> //入出力
#include <string> //文字列
#include <vector> //配列
...
```

等々書くそうですが、面倒なのでAtCoderでは`<bits/stdc++.h>`を使うと良い、という話になっています。
[B - 1.01.出力とコメント](
https://atcoder.jp/contests/apg4b/tasks/APG4b_b)

これは、gccに付属する、諸々のインクルードファイルを一気に読み込むためのファイルだそうです。つまり

```hoge.cpp
#include <bits/stdc++.h>
```

とかけば済むということです。

しかし、macでは使えないそうです（参考文献参照）。

これを、makefileを活用して楽に使えるようにしてみました。

# ファイル構造

`abc150/a.cpp`をコンパイルしてみたいと思います。

```
@AtCoder
|
|-- abc150
|   |-- a.cpp
|
|-- bits
|   |-- stdc++.h
|
|-- makefile
```

```a.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
  int K, X;
  cin >> K >> X;
  if(K*500>=X){
    cout << "Yes\n";
  }else{
    cout << "No\n";
  }
  return 0;
}
```
```makefile
%: %.cpp
	c++ -I .../@AtCoder $< -o $@
# パスは各自で書き換えてください
```

ちなみに上のa.cppは[A - 500 Yen Coins](https://atcoder.jp/contests/abc150/tasks/abc150_a)にACで通過します（それはそう）。

# コンパイルしてみる

+ 環境

> macOS Mojave バージョン10.14.6<br>
> Visual Studio Code バージョン1.44.2

（環境について何をかけば良いのかあんまりわかってないので不十分かも。ごめんなさい）

普通にコンパイルすると

```
$ cd .../@AtCoder
$ c++ abc150/a.cpp
```

↓

```
abc150/a.cpp:1:10: fatal error: 'bits/stdc++.h' file not found
#include <bits/stdc++.h>
         ^~~~~~~~~~~~~~~
1 error generated.
```
怒られた。元々のインクルードパスにbits/stdc++.hが無いですよ、ということ。

# bits/stdc++.hの準備

ここ↓にあります

https://gcc.gnu.org/onlinedocs/gcc-4.9.2/libstdc++/api/a01220_source.html

これをコピペして`@AtCoder/bits/stdc++.h`に保存します。（行番号もコピーしてしまうので頑張って消した）

参考文献にあるように、コンパイル時にインクルードパスを指定してコンパイルすれば良いので

```
$ c++ -I /Users/.../@AtCoder abc150/a.cpp
```
これで一応はコンパイルできます。

# 簡単にする

毎回インクルードパスを書くのは面倒なのでmakefileを作ってそこに書いておきましょう。

ということで、冒頭にも置きましたが

```
# .../@AtCoder/makefile
%: %.cpp
    c++ -I /Users/.../@AtCoder $< -o $@
```

これだけ。ちなみに2行目の頭の空白は、スペースではなく「タブ」でなくてはいけません。

それでもって

```
$ cd .../@AtCoder
$ make abc150/a
```
でコンパイル（拡張子`.cpp`をつけないことに注意）。実行は

```
$ abc150/a
```
です。

# おまけ-Cのファイルとの共存
もともと`abc150/a.c`があった場合、今までは`make abc150/a`でコンパイルできたのが、makefileの変更によって`make abc150/a`ではc++のファイルがコンパイルされてしまいます。

makefileを改良して

```makefile
%pp: %pp.cpp
    c++ -I /Users/.../@AtCoder $< -o $@
```
とし、c++のファイルは`app.cpp`, `bpp.cpp`のようにファイル名の方にも`pp`をつけてやると`a.c`, `b.c`との共存(?)が図れます。

まあ、cをコンパイルするときは先に移動しておけば良いんですけどね

```
$ cd abc150
$ make a (a.cコンパイル)
$ ./a (実行)
```

# 参考文献
+ [C++の標準ライブラリを一行で一括でインクルードする - Qiita]
(https://qiita.com/berlysia/items/6368ebe5d033e3ace43b)
+ [C言語を使うならMakeを使おうよ - Qiita]
(https://qiita.com/j8takagi/items/74232a00cc33623f7844)
+ [C言語におけるinclude文とgcc -Iオプションの関係 - Qiita]
(https://qiita.com/DQNEO/items/4e5c2eca2761ec08b922)
マーカーの位置に再生位置を移動する

マーカーのticksを使えば良いらしい。

```js:marker.jsx
var activeSequence = app.project.activeSequence;
var markers = activeSequence.markers;
var markerCount = markers.numMarkers;
if (markerCount) {
var firstMarker = markers.getFirstMarker();
activeSequence.setPlayerPosition(firstMarker.start.ticks);
}
```
アプリ制作に必須なRailsの起動方法

# Railsはめちゃくちゃ便利！
アプリに必要な機能の雛形を事前に全て用意してくれています。
雛形に手を加えるだけでお洒落な投稿アプリを作ることだってできます。
今回はその起動方法について記していきます。

# 早速起動してみよう
環境は5.2.3
そしてオプションにmysqlを利用しています。
mysqlについては後日記載していきます。
ターミナルで以下のように記述しましょう。
`ターミナル`

```terminal
% cd project（他の場所でも構いません）
% rails _5.2.3_ new "practiceApp(ここにはアプリの名前が入りますので自由な名前を付けてもらえれば大丈夫です)" -d mysql
% cd アプリ名
```
これができたらデータベースも作りましょう。
<details><summary>データベースとは</summary>ユーザーの名前やメールアドレスなどを登録する場所です。**データを保管してある場所という認識で構いません。**</details>
`ターミナル`

```terminal
% rails db:create
# 以下のような表示がされれば成功
Created database 'practiceApp_development'
Created database 'practiceApp_test'
```
次は実際にサーバーを起動してみましょう。
rails sで起動できます。
`ターミナル`

```terminal
% rails s
```
これができたらhttp://localhost:3000
に接続してみましょう。
以下の画面が出てきたら成功です。
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/91983510-4552-1d3c-ff2c-870035bc0614.png">
ここまでできたら是非テキストエディタで開いてみてください。
開発に最低限必要な雛形がすでに入っていると思います。
それらに記述していく、ファイルを追加するだけで簡単にアプリが作れます。
便利な時代です！
wordpressの管理と公開で異なるドメインにしたらWP REST APIがエラーになる場合の対処

- 現象
  - wordpressのwordpressアドレスとサイトアドレスで異なるドメインにしていたら、
投稿画面でエラーになる

参考: wordpressの閲覧URLと管理URLで異なるホストを設定
https://qiita.com/backgroundcolor/items/fb7b5ce8cba9794c460f

- 原因
  - wordpress ver.5の投稿画面は [WP REST API](https://ja.wp-api.org/) を利用している
  - なぜだか APIのアドレスが 「閲覧URL(サイトアドレス)/wp-json/wp/〜」 なので、投稿画面のドメインと異なるため、認証が通らずエラーとなる
- 対応
    - function.php に、管理画面操作時は WP REST API のドメインを置換する処理を入れる
  
```php:function.php
/* 管理画面での APIのドメインを変更 */
add_filter( 'rest_url', 'rest_url_replace' );
function rest_url_replace($url){
  if (is_admin()){
    $url = str_replace(home_url(), site_url(), $url);
  };
  return $url;
}
```


これで無事動くようになった
Pythonのデータ型まとめメモ

# まとめ
- Iterable: `for`文で回せる
    - Iterator: `len()`できない
        - `enumerate()`, `zip()`, `map()`, `filter()`の戻り値
        - `itertools`で用意されている関数の戻り値
        - file object: `open()`の戻り値など
        - Generator: ジェネレータ式・関数の戻り値
    - Collection: `len()`できる
        - `array.array`
        - `enum.Enum`
        - Sequence: indexとsliceが使える
            - `list`
            - `str`
            - `collections.deque`
            - `range()`の戻り値
            - `tuple`
        - Set: 集合の演算が使える
            - `set`
            - `frozenset`
        - Mapping: keyとvalueが定義されている
            - `dict`
                - `collections.defaultdict`
                - `collections.Counter`
            - `collections.ChainMap`
- Number
    - `decimal.Decimal`: 任意精度の浮動小数点数
    - Complex
        - `complex`
        - Real
            - `fraction.Fraction`
            - `float`
            - `int`
                - `bool`

# 参考
[abc --- 抽象基底クラス](https://docs.python.org/ja/3/library/abc.html)など
【試験合格記】AWS 認定 クラウドプラクティショナー(CLF-C01)

お疲れさまです。
表題の試験に合格したため記録として残したいと思います。

# 結果
合格

|分野|名称|割合|
|:-----------------|:-------------------|:-------------------|
|1|クラウドの概念|28%|
|2|セキュリティ|24%|
|3|テクノロジー|36%|
|4|請求と料金|12%|

# 所有資格

| 資格名       |取得年月日 |
|:-----------------|:-------------------|
|AWS Certified Solutions Architect - Associate (SAA)|2018-06-14|
|AWS Certified SysOps Administrator - Associate (SOA)|2018-06-22|
|AWS Certified Developer - Associate (DVA)|2018-06-25|
|AWS Certified Solutions Architect - Professional (SAP)|2018-07-19|
|AWS Certified DevOps Engineer - Professional (DOP)| 2020-02-19| 
|AWS Certified Big Data - Speciality (BDS)| 2020-03-23| 
|AWS Certified Security - Speciality (SCS)| 2020-04-01| 
|AWS Certified Machine Learning - Speciality (MLS)| 2020-04-13| 
|AWS Certified Advanced Networking - Speciality (ANS)| 2020-04-27| 
|AWS Certified Cloud Practitioner (CLF)| 2020-04-27| 

# 事前知識
上記の通り、勉強のためではなく自己紹介の水増し(AWS10冠)をするためだけに取得しました。

# 所感
正直、この記事に参考となる内容はありません。
初学者の方でこの資格に興味がある方は同じようなモチベーションの方々の記事を読むべきです。

なお、AWS知識の有無に関わらず日本語が苦手な方にこの試験は難易度が高いかもしれません。
自分がまさにそれで、問題がシンプルすぎて知識があると逆に深読みして落ちる危険があると思いました。

# 受験者に向けたアドバイス
- AWSサービス全般の名称、カテゴリ、用途を理解する
- 使用料金やアカウントの請求をどのようにまとめればいいのかを覚える
- リザーブドインスタンス、スポットインスタンス、オンデマンドインスタンス、専用ホストの使い所を理解する
- S3のストレージクラスを種類ごとに覚える
- DynamoDB、RDS Aurora、ElastiCacheの違いを覚える

# まとめ
水増しで取得した資格なので特に言えることはありません。
あえて言うなら、アソシエイト資格を取るか取らないかぐらいのレベルで受けるとすんなりAWSの全容を理解するのに役立つと思います。
あとはIT系営業職の方など、オンプレ環境からAWSに移行する相談をする上では勉強しておいて損はないと思いますので本当に初学者向けの資格です。

次はCKAとCKADの資格を取得できるよう頑張りたいと思います。
サーバ管理で使用頻度が高いコマンド集

うちの若けぇ衆から要請があったのでまとめてみました。

##ファイル関係
<dl>
  <dt>cd</dt>
  <dd>ディレクトリ移動。</dd>
</dl>
```
cd /home/okuno/
```
<dl>
  <dt>cat</dt>
  <dd>ファイルの中身表示。lessを付けて１画面ずつ表示する。</dd>
</dl>
```
cat access.log | less
```
<dl>
  <dt>tail</dt>
  <dd>ファイルの中身を最新〇件表示。fオプションでリアルタイムに更新される。</dd>
</dl>
```
tail -1000 access.log | less
tail -f access.log 
```
<dl>
  <dt>vim</dt>
  <dd>viは伝統的なキー配列になっている（最近はそうでもない）ディストリビューションもあるのでvimを使用する。</dd>
</dl>
```
vim /etc/apache2/httpd.conf
```
<dl>
  <dt>cp</dt>
  <dd>ファイルをコピーする。-aで丸ごとコピーすることが多い。</dd>
</dl>
```
# 丸ごとコピー
cp -a /from/* /to/
```
<dl>
  <dt>mv</dt>
  <dd>ファイルを移動する。</dd>
</dl>
```
mv /from/file.txt /to/
```
<dl>
  <dt>tar</dt>
  <dd>ファイルを解凍する。オプションとセットで覚える。</dd>
</dl>
```
tar zxvf hoge.tar.gz
```
<dl>
  <dt>rm</dt>
  <dd>ファイルを削除する。-fオプションは破壊力抜群なのでrootでの実行は極力控えること。相対パスの方がいくらか安心。</dd>
</dl>
```
# 最上級のコマンド
rm -rf gomi
```
<dl>
  <dt>df</dt>
  <dd>ディスク容量を確認する。-hで表示容量を最適化する。</dd>
</dl>
```
df -h
```
<dl>
  <dt>du</dt>
  <dd>階層ごとの容量を確認する。１階層目でまとめることが多いのでコピペすること。</dd>
</dl>
```
du --max-depth=1 -h
```
<dl>
  <dt>locate</dt>
  <dd>ファイルを高速に検索する。updatedbで最新のデータベースが作成されます。</dd>
</dl>
```
locate sagashimono.txt
```
<dl>
  <dt>find</dt>
  <dd>ファイルを検索する。時間がかかることがあるので注意すること。</dd>
</dl>
```
# 日付でfind
find ./* -newermt '20190517 17:00'
```
##プロセス管理
<dl>
  <dt>ps</dt>
  <dd>実行中のプロセスを表示。axとgrepを使用するケースが多い。</dd>
</dl>
```
ps ax | grep apache2
```
<dl>
  <dt>kill</dt>
  <dd>実行中のプロセスを終了させる。強制終了や再起動もよく使う。</dd>
</dl>
```
# 強制終了
kill -9 [プロセス番号]
#再起動
kill -HUP [プロセス番号]
```
<dl>
  <dt>uptime</dt>
  <dd>現在時間、サーバの稼働時間、接続ユーザー数、負荷状況（ロードアベレージ）を表示する。</dd>
</dl>
```
uptime
```

##ログイン関係
<dl>
  <dt>last</dt>
  <dd>ログイン履歴を表示。moreで１画面ずつ表示する。</dd>
</dl>
```
last | more
```
<dl>
  <dt>who</dt>
  <dd>今ログインしてるユーザーを表示する。</dd>
</dl>
```
who
```
<dl>
  <dt>vlock</dt>
  <dd>コンソール画面をロックする。再度開始するにはパスワード入力が必要で、同時に作業をしている時にミスを防ぐことができる。</dd>
</dl>
```
vlock
```
##通信関係
<dl>
  <dt>ping</dt>
  <dd>シンプルに疎通確認をする。</dd>
</dl>
```
ping ww-system.com
```
<dl>
  <dt>netstat</dt>
  <dd>サーバに接続されている通信を確認する。</dd>
</dl>
```
netstat
```
<dl>
  <dt>traceroute</dt>
  <dd>通信経路を確認する。</dd>
</dl>
```
traceroute ww-system.com
```
<dl>
  <dt>dig</dt>
  <dd>DNSを確認する。</dd>
</dl>
```
# DNSサーバを指定する場合
dig @localhost ww-system.com
```
<dl>
  <dt>nslookup</dt>
  <dd>DNSを確認する。その２。mxレコードを確認する時に使用する。</dd>
</dl>
```
nslookup
>set type=mx
>ww-system.com
>exit で終了
```
<dl>
  <dt>mail</dt>
  <dd>メールの送信を確認する。</dd>
</dl>
```
mail korehamihon@ww-system.com
Subject:test [Ctrl + D]
Cc:[Enter]
Null message body; hope that's ok で本文空のシンプルメールが送信される
```
<dl>
  <dt>wget</dt>
  <dd>外部サーバからファイルをGetする。</dd>
</dl>
```
wget https://hogefuga.loc/piyo.tar.gz
```
<dl>
  <dt>iptable</dt>
  <dd>ソフトウェアでファイヤーウォールを実装する。IP拒否が多い。最近のDebianはufw で管理されてるので便利に使うこと。</dd>
</dl>
```
# IPを拒否する
iptables -I INPUT -s ***.***.***.*** -j DROP
```
##パッケージ管理
<dl>
  <dt>systemctl</dt>
  <dd>サービスの起動・終了などを実行する。</dd>
</dl>
```
systemctl start apache2
```
<dl>
  <dt>cpan</dt>
  <dd>Perlモジュール管理。最近ではyumで管理できるモジュールが増えてきた。</dd>
</dl>
```
cpan
```
【試験合格記】AWS 認定 アドバンスドネットワーキング – 専門知識(ANS-C00)

お疲れさまです。
表題の試験に合格したため記録として残したいと思います。

# 結果
合格

|分野|名称|割合|
|:-----------------|:-------------------|:-------------------|
|1|大規模なハイブリッド IT ネットワークアーキテクチャを設計し、実装する|23%|
|2|AWS ネットワークを設計し、実装する|29%|
|3|AWS タスクを自動化する|8%|
|4|アプリケーションサービスとネットワークの連携を構成する|15%|
|4|セキュリティとコンプライアンスを設計し、実装する|12%|
|4|ネットワークの管理、最適化、トラブルシューティングを行う|13%|

# 所有資格

| 資格名       |取得年月日 |
|:-----------------|:-------------------|
|AWS Certified Solutions Architect - Associate (SAA)|2018-06-14|
|AWS Certified SysOps Administrator - Associate (SOA)|2018-06-22|
|AWS Certified Developer - Associate (DVA)|2018-06-25|
|AWS Certified Solutions Architect - Professional (SAP)|2018-07-19|
|AWS Certified DevOps Engineer - Professional (DOP)| 2020-02-19| 
|AWS Certified Big Data - Speciality (BDS)| 2020-03-23| 
|AWS Certified Security - Speciality (SCS)| 2020-04-01| 
|AWS Certified Machine Learning - Speciality (MLS)| 2020-04-13| 
|AWS Certified Advanced Networking - Speciality (ANS)| 2020-04-27| 
|AWS Certified Cloud Practitioner (CLF)| 2020-04-27| 

# 事前知識
一応、業務領域としては本職と言えるしスペシャリティの中では一番勉強が楽でした。
あとGCPのNetworkingも受けてたので類似する点は多かったですね。

# 所感
ネットワーク領域全般、少しだけセキュリティ絡みの出題が多かったと思います。
出題範囲の多くはDirectConnectとRoute53に割かれ、ハイブリッドクラウドを構築したことがない方にとってはイメージしづらいので相対的に難易度が上がるんだと感じました。
とは言え、実務でそこを触るような会社は限られてくるので、AWSが主催している「AWS 専用線アクセス体験ラボトレーニング」をオススメしたいです。
https://aws.amazon.com/jp/dx_labo/

今の時期はコロナの影響で開催が難しいですが、落ち着いたらまた定期的にハンズオンラボを開催すると思いますので
AWS公式やconnpassなどをチェックして参加されるとよいと思います。

# 受験者に向けたアドバイス
- DirectConnectの利用申請からトラブルシューティングまで一通りの流れを理解する
- VPNはソフトウェアVPNやハードウェアVPNなど多様な種類のVPNが存在するのでそれらの特徴と利用環境を理解する
- AS、BGP、DHCP、OSPF、VLAN、BFD、MTUなどネットワークレイヤーで当たり前に使用される用語を理解する
- IPv4のCIDR計算をアナログで出来るようになる
- VPC flowlogの特徴を理解する
- 静的ルーティング、動的ルーティングなどの意味を理解する
- セキュリティグループとネットワークACLの違いを覚える
- プレースメントグループや拡張ネットワーキングを理解する
- Route53のルーティングポリシーの種類と特徴を覚える

# まとめ
ようやく主要なAWS資格を取ることができたので、AWSの資格勉強としては一段落といきたいところです。
ちまたによくあるAWS資格コンプ記事ではネットワーキングが最難関と言われることも多いですが、それは間違っていないと思います。
なぜなら業務利用する技術者の数が他の資格と比べて圧倒的に限定されるからだと考えます。
逆に言えばネットワークやセキュリティの領域を意識的に仕事で使っていれば難易度はさほど高くないということも理解できました。

こんな記事を書いておいてアレですが、資格を10個取ろうが12個取ろうがそれ自体は他者にとってあまり重要ではありません。
「知らないことを知って、必要なときに手を出しやすくする」というのが資格勉強の本筋だと思うので、インプットしたことを正しくアウトプットしていけるように今後もがんばります。
【LINE Bot】Cloud FunctionsでHello world

**Cloud Functions for Firebase**を利用して、**LINE Bot**を実装します。
Cloud Functions for FirebaseでのHello worldに関しては[別の記事](https://qiita.com/mako0715/items/10724105f32f52783002)にまとめてあるので、そちらを参照してください。

# 環境
- LINEアカウント作成済み
- [LINE Developersアカウント](https://developers.line.biz/ja/)作成済み
- macOS Catalina
- Node v10.19.0

# LINE Botの作成

LINE Developerコンソールを開き、**プロバイダー**を作成する。
今回はHogeという名前で作成します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/7c595d78-b945-0cdc-c2f3-6fdfaca18053.png)

チャネル設定画面に遷移するので、**Messaging API**を選択します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/ee543c75-f3a7-758a-caa4-28fce0951d2f.png)

チャネルの詳細設定画面に遷移するので、次の項目を埋めて作成する。

- チャネルの種類（デフォルト）
- プロバイダー（デフォルト）
- チャネルアイコン（任意）
- チャネル名
- チャネル説明
- 大業種
- 小業種
- メールアドレス
- プライバシーポリシーURL（任意）
- サービス利用規約（任意）
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/ea2e6cdd-8585-de34-6036-45dc0223a8a0.png)

# チャネルシークレットとチャネルアクセストークンの取得

**チャネル基本設定**より**チャネルシークレット**をメモする。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/2cae9fad-f933-a0ef-b07a-b017aeae88f4.png)

**Messaging API設定**より**チャネルアクセストークン**を発行し、メモする。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/3f2a9b50-38ed-8bf5-de62-d5d7f52dc326.png)

# 必要なライブラリのインストール

[LINE BotのSDK](https://github.com/line/line-bot-sdk-nodejs/tree/fc86d6654dcd9c025f7073a313298741b2f5bd79)をインストールする。

```
$ npm install @line/bot-sdk
```

環境変数を管理するために、dotenvをインストールする。

```
$ npm install dotenv
```

# 環境変数の管理
**.envファイル**を作成し、メモしたチャネルシークレットとチャネルアクセストークンを保存する。

```bash
CHANNEL_ACCESS_TOKEN="hogehogehoge"
CHANNEL_SECRET="fugafugafuga"
```

# Hello worldのコードを書く

動く必要最低限のコードになります。

```js
const functions = require('firebase-functions');
const line = require('@line/bot-sdk');
require('dotenv').config();

exports.helloWorld = functions.https.onRequest(async (req, res) => {
 const events = req.body.events;
 const client = new line.Client({
  channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.CHANNEL_SECRET,
 });
 const result = await client.replyMessage(events[0].replyToken, { type: 'text', text: 'こんにちわーるど' });
 res.json(result);
});
```

# Webhookの設定

**Messaging API設定**でデプロイした関数のエンドポイントを設定し、**Webhookの利用**をONにする。
また、**検証**ボタンをクリックすることで正常に動いているか確認できる。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/23e344b0-39a6-0cf6-bf9b-85f5f440a290.png)

# 使ってみる

あとはLINEから**Messaging API設定**に載っているQRコードを読み込み、Botを登録する。
![developers.line.biz_console_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/384bb277-7187-afbc-499a-d53b938c1b35.png)

何か文字を入力すると・・・ちゃんと返ってきました。
![IMG_7283.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/11442d41-9cc1-f2a9-0ab3-b67f27cbd087.png)
【PyTorch】サンプル② 〜TENSOR (テンソル) 〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b676b25e-f9b2-9053-cb16-a63b7ed51ad1.png)
#目的
PyTorchのチュートリアル[PyTorch: Tensors](https://pytorch.org/tutorials/beginner/examples_tensor/two_layer_net_tensor.html#sphx-glr-beginner-examples-tensor-two-layer-net-tensor-py)を参考にPyTorch Tensor(テンソル)を使って、損失(loss)や重み(weight)の計算をする。

PyTorchの特徴の一つである、テンソルとNumPyの違いを手を動かしながら感じる。

NumPyを用いた例は、[【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)から。

<span style="color: #ff5252">詳しい解説とコード</span>は、[【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
C# 基本構文(備忘録)

## コメント
```C#:Example.cs
// コメント(単行)
/*
コメント(複数行)
*/
```

## 変数宣言
```C#:Example.cs
var value;
// 宣言時に初期化
var intValue = 0;
```

## 定数
```C#:Example.cs
const int VALUE = 10;
```

## データ型と代入
```C#:Example.cs
// byte (0 ~ 255)
byte byteValue = 10;
// short (-32,768 ~ 32,767)
short shortValue = 10;
// int (-2,147,483,648 ~ 2,147,483,647)
int intValue = 10;
// long (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
long longValue = 10;
// float
float floatValue = 1.23f;
// double
double doubleValue = 1.23d;
// decimal
decimal decimalValue = 1.23m;
// サフィックスなしの場合、double型
var doubleValue = 1.23;
// string
string stringValue = "abc";
// bool (true / false)
bool boolValue = true;
```

## キャスト
```C#:Example.cs
// double型からint型
double doubleValue = 1.23d;
int intValue = (int)doubleValue;

// Parseを使用
string stringValue = "10";
int intValue = int.Parse(stringValue);
// キャスト不可の場合、例外発生
string stringValue = "abc";
int intValue = int.Parse(stringValue);

// TryParseを使用
// 型.TryParse(変換元, out 変換先) ： 戻り値bool
string stringValue = "10";
int intValue;
bool result = int.TryParse(stringValue, out intValue);
```

## 配列
```C#:Example.cs
int[] array = new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
// 宣言時に初期化
int[] array = { 1, 2, 3 };
```

## 動的配列
```C#:Example.cs
// List<T>
var list = new List<int>();
// 宣言時に初期化
var list = new List<int>{ 1, 2, 3 };
// 要素の追加
list.Add(4);
// 指定した添え字の要素を削除
list.RemoveAt(2);
// 全削除
list.Clear();
// 要素の取得
var item = list[1];
```

## 比較演算子
```C#:Example.cs
// 等号
a == b
// 不等号
a != b
// 小なり
a < b
// 大なり
a > b
// 以下
a <= b
// 以上
a >= b
```

## 論理演算子
```C#:Example.cs
// AND
a == b && c == d
// OR
a == b || c == d
```

## 加算演算子と減算演算子
```C#:Example.cs
// x= x + y;
x += y;
// x = x + 1;
x++;
// x = x - y;
x -= y;
// x= x - 1;
x--;
```

## if文
```C#:Example.cs
int i = 1;
if(i == 0)
{
    ~
}
else if(i == 1)
{
    ~
}
else
{
    ~
}
```

## switch文
```C#:Example.cs
int caseSwitch = 1;
switch (caseSwitch)
      {
          case 1:
              ~
              break;
          case 2:
              ~
              break;
          default:
              ~
              break;
      }
```

## while文
```C#:Example.cs
int i = 0;
while(i < 5)
{
    i++;
    if()
    {
        // 処理をスキップ
        continue;
    }
    if()
    {
        // 処理を抜ける
        break;
    }
}
```

## for文
```C#:Example.cs
for (int i = 0; i < 5; i++)
{
    ~
}
```

## foreach
```C#:Example.cs
foreach (var item in items)
{
    ~
}
```

## メソッド
```C#:Example.cs
// 戻り値あり
public int Hoge()
{
    ~
}
// 戻り値なし
public void Hoge()
{
    ~
}
```

## 文字列結合
```C#:Example.cs
string stringValue1 = "abc";
string stringValue2 = "def";
// abcdef
Console.WriteLine(stringValue1 + stringValue2);
```

## 三項演算子
```C#:Example.cs
// 条件式 ? 条件式True : 条件式False
int intValue = 10;
string res;
res = (intValue >= 0) ? "nonnegative" : "negative";
```

---

## 参考文献
- [C#関連のドキュメント](https://docs.microsoft.com/ja-jp/dotnet/csharp/)
オブジェクト指向について

#オブジェクト指向=概念
明確な答えはない。
オブジェクト指向プログラミングとは、プログラムを手順ではなく、モノの作成と操作として見る考え方。オブジェクトとは「モノ」を意味する。
その「モノ」を作る。そして、その「モノ」を使う。というのがオブジェクト指向という考え方で、「モノ」を作っておくことはとても便利。
なぜ「モノ」を作っておくと便利なのか？

###１.作業の効率化が図れる
例えば、１万台の電子レンジを作成する場合。
「○○レンジはAボタンを押すと温める。Bボタンを押すと止まる」
「△△レンジはAボタンを押すと温める。Bボタンを押すと止まる」
「□□レンジはAボタンを押すと温める。Bボタンを押すと止まる」
それぞれ順を追って一つ一つ作り上げるのは大変だし、ある機能を途中で追加しようと考え出したときに、1万台分のプログラムを全部書き換えることになってしまう。
しかし、オブジェクト指向で考えれば、「電子レンジ」という「モノ」を初めから定義しておいて、それを使うので、作業がとても楽になる。

* ○○レンジは「電子レンジ」をコピーして外装の色だけ赤にする
* △△レンジは「電子レンジ」をコピーして外装の色だけ青にする
* □□レンジは「電子レンジ」をコピーして外装の色だけ緑にする
こうしておけば、「Cボタンで温め中に音楽を流す」という機能を追加するとき「電子レンジ」プログラムだけを変更すればいい。
要するに、同じものを作りやすい。

####大人数で開発するときにも便利
「電子レンジ」というモノを用意しておけば、「電子レンジ」というプログラミング作成者だけが中身を知っていればよく、他の開発者はそれがどうやって動作するのか、ということだけを知っていればいいことになる。
もし手順を書いたプログラムだと、他のプログラマーも中身を理解しないといけないしそのプログラムを壊してしまいかねない。

#####オブジェクト
オブジェクトは、「モノ」「対象」。データと処理の集まり。設計図から作った実物がオブジェクト。

#####クラス
オブジェクトの設計図。オブジェクトの中のプロパティやメソッドを一まとめにしたもの。
例）実際に作られた電子レンジはオブジェクト。電子レンジの設計図はクラス。
クラスを作成するためには、以下のようにclass構文を使用する。
クラスを呼び出すためには、関数を呼び出す際と同様で、クラス名を記述。

```ruby
class Microwave(クラス名)
end
Microwave
```

#####プロパティ（属性）
オブジェクトが持っているデータのこと。
電子レンジというオブジェクトは「メーカー」「大きさ」「W数」「色」といったプロパティを持っている。様々な種類がある。

#####メソッド（操作）
オブジェクトが持っている処理。電子レンジの「温めスタート」「止まる」など、オブジェクトが何らかのアクションを起こす処理のこと。このアクションのことを「振る舞い」というケースもある。

#####インスタンス
「実体」「事例」という意味で、プログラムでオブジェクト(インスタンス)を実際に使うときに生み出されるもの。
設計図からオブジェクトを作ることをインスタンス化と呼ぶ。
newメソッドを使用することで、インスタンス（オブジェクト）を作成できる。

```ruby
class Microwave
end
Microwave.new
```
#####カプセル化
オブジェクトが持つデータや処理のうち、別のオブジェクトから直接利用される必要のないものを隠すことを言う。
利用する場合は外部から操作するために作られた処理を設ける。
それにより、大人数で開発するときにすべてのコードを認識する必要がなくなる。プログラムも壊れにくくなる。

#####継承
特定のオブジェクトの機能を引き継いで使うこと。例）車からトラックを作る。
似たようなオブジェクトを複数作る際に、全てのプロパティやメソッドをいちいちプログラミングするのは手間がかかるが、継承を使うと、同じ機能を実装できる。

#####ポリモーフィズム
クラスによって同一のメソッドで異なる処理が行えるという性質をいう。
Kinx アルゴリズム - クイックソート

# アルゴリズム - クイックソート

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。「プログラム＝アルゴリズム＋データ構造」。アルゴリズムの実装例をご紹介。

元ネタは「C言語による（30年経っても）最新アルゴリズム事典」。今回はソート（クイックソート）です。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。  

アルゴリズムと言えばソート。その中でも一番使うであろうクイックソートです。

## クイックソート

* https://ja.wikipedia.org/wiki/クイックソート
    * 平均して最速
    * 平均 $O(n \log n)$
    * 安定ではない

## サンプル

### テスト・ドライバ

以下のコードを共通のテスト・ドライバコードとして使います。

```javascript
function display(name, a) {
    System.println(name, a.map(&(e) => "%2d" % e).join(' '));
}

function demo(N, func) {
    var a = N.times(&() => Integer.parseInt(Math.random() * 100));
    display("Before: ", a);
    a = func(a);
    display("After:  ", a);
}
```

### サンプル・コード

```javascript
function quicksort(a, first, last) {
    var i = first;
    var j = last;
    var x = a[(first + last) / 2];
    while (true) {
        while (a[i] < x) i++;
        while (x < a[j]) j--;
        if (i >= j) break;

        [a[i], a[j]] = [a[j], a[i]];
        ++i; --j;
    }
    if (first  < i - 1)
        quicksort(a, first , i - 1);
    if (j + 1 < last)
        quicksort(a, j + 1, last);
}

demo(20, &(a) => {
    quicksort(a, 0, a.length() - 1);
    return a;
});
```

### 結果

```
Before: 33 17  3 50 33 25 57 72 46 93 82 72 49 84 78 86 74 23 95 26
After:   3 17 23 25 26 33 33 46 49 50 57 72 72 74 78 82 84 86 93 95
```

## おわりに

`Array.sort(ary, compfunc)` と `Binary.sort(bin, compfunc)` はクイックソートです。また Binary のほうは `compfunc` が省略された場合に `stdlib.h` の `qsort` を使うように最適化されています。

...ということは、もしかすると Binary に対しての降順ソートは `bin.sort(&(a, b) => b <=> a)` よりも `bin.sort().reverse()` としたほうが速いのかも。`Binary.reverse()` も C ルーチンなので。ということでお試し。

```javascript
function test(name, f) {
    var tmr = new SystemTimer();
    var sorted = f();
    var disp = [sorted[0], sorted[1], "...", sorted[-1]];
    System.println("%{name}%{disp} => ", tmr.elapsed());
}

var a = 10000.times(&() => Integer.parseInt(Math.random() * 100));
var bin = <...a>;
test("sort1", &() => bin.sort(&(a, b) => b <=> a));
test("sort2", &() => bin.sort().reverse());
```

```
sort1[99, 99, "...", 0] => 0.045096
sort2[99, 99, "...", 0] => 0.000582
```

...やはり。ではでは、また次回。
dockerとdocker-composeのインストール(mac編)

マックへドッカーとドッカーコンポーズをインストールするまでの個人的なメモ書きです。

# dockerのインストール

```terminal:terminal
$ brew install docker
```

ただし、これだけでは上手く行かなかったので、デスクトップアプリとしてインストールする

## Docker Desktop for Mac のインストール
DLサイト：[Docker Desktop for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac/)

インストール後にバージョン確認

```terminal:terminal
$ docker -v
```

# docker-composeのインストール

## docker-composeのバージョン確認
サイト：[github / docker / compose](https://github.com/docker/compose/releases)

## curlでインストール

```terminal:terminal
$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```

※ `1.25.4` の部分を任意のバージョンへ

## docker-composeに実行権限を付与
```terminal:terminal
$ sudo chmod +x /usr/local/bin/docker-compose
```

インストール後にバージョン確認

```terminal:terminal
$ docker-compose -v
```

以上
Xgboostをインストールしようとしたら出たエラーとその解決策 

Xgboostをインストールしようとしたら、エラーが出たので解決策と一緒に記録しておきます。
# 環境
```terminal:環境
macOS version 10.15.4(Catalina)
anaconda3-5.3.1
```

# エラー
```terminal:ERROR
ERROR: Command errored out with exit status 1:
    (中略)
　　 ./xgboost/build-python.sh: line 27: cmake: command not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/15//xgboost/setup.py", line 42, in <module>
        LIB_PATH = libpath['find_lib_path']()
      File "/private/var/folders/15//xgboost/libpath.py", line 50, in find_lib_path
        'List of candidates:\n' + ('\n'.join(dll_path)))
    XGBoostLibraryNotFound: Cannot find XGBoost Library in the candidate path, did you install compilers and run build.sh in root path?
    List of candidates:
    /private/var/folders/15/###############################
    /private/var/folders/15/###############################
    /private/var/folders/15/###############################
    /Users//.pyenv/versions/anaconda3-5.3.1/###############################
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```

# やったこと①
```
pip install --upgrade pip setuptools
```
エラー文でぐぐったら出てきたので、とりあえず実行しました。
アップグレードされたものの解決せず

# やったこと②
```
brew install gcc@8
```
こちらも出てきたので、とりあえず実行しました。
インストールしたものの解決せず

# 解決策
結局、エラーメッセージをちゃんと読むことに
するとこんなメッセージを見つけました.

```terminal:Error
./xgboost/build-python.sh: line 27: cmake: command not found
```
#### 訳）cmakeやれって言ってるけど、それがなにかわからんわ。
**これやん！！！！ということで、早速インストールを実行しました。**

```terminal:terminal
pip install cmake
```
cmakeがインストールされました。
続いて本命のxgboost

```terminal:terminal
pip install xgboost

-----
Successfully built xgboost
Installing collected packages: xgboost
Successfully installed xgboost-1.0.2
-----
```




#### xgboostをインストールすることが出来ました！！！