OmniAICreator/Qiita-1.07M huggingface dataset:
BERTを用いてNHK番組のジャンルを97％の精度で予測しましょう

みなさん、

日本語でのテキストデータを持ち、そのデータから大事なインサイトを生み出そうと思ったことありませんか。

本記事ではGoogleで検索する時に使われている最先端の自然言語モデル「BERT」を使用し、日本語のテキストを高精度で分類しましょう。

# 問題定義
NHKの[API](https://api-portal.nhk.or.jp/)によって入手した番組情報（番組題名, 概要など）を元に番組のジャンルを予測します。１３のジャンルのうち、正解のジャンルを予測する多クラス分類問題です。

# データ
NHKは当日から７日間の間のテレビ・ラジオ・ネットラジオの番組表を[API](https://api-portal.nhk.or.jp/)によって公開しています。公開データに各番組の題名 （Title）、副題（Subtitle）、概要 (Content）とジャンルなどが含まれています。ここ７日間のデータしか入手できませんので週一回ぐらいAPIに繋がってデータを入手し、2021/8/30から2021/9/24までの10,321ユニーク番組をデータベース化しました。[こちら](https://github.com/danyelkoca/NHK/blob/main/data.csv)のリンクよりアクセスしてください。ちなみに、合計ジャンル数は13です。

#### データの例
<dt>Title</dt><dd> もふもふモフモフ「恒松祐里感激３万匹に１匹の激レア猫！奥野壮猫まみれ」</dd>
<dt>Subtitle</dt><dd>恒松祐里が出生確立３万分の１といわれるオスの三毛猫をスケッチ！[省略]</dd>
<dt>Content</dt><dd>堤真一がいざなう癒やし番組▼「おかえりモネ」でおなじみ、[省略]</dd>
<dt>Genres</dt><dd>1) バラエティ</dd><dd>2) ドキュメンタリー/教養</dd><dd>3) 情報/ワイドショー	</dd>
_上記の例のようにジャンルが複数ある場合は第一ジャンルのみを予測します。_


# 探索的データ解析 (Exploratory Data Analysis)
ジャンルの分布状態を見ると、不均衡データということが把握できます。したがって、データを訓練データセットと検証データセットに分ける時に「Stratification」する必要あります。(i.e. 検証データが全体のデータと同じ分布特徴を持つように行われるデータの分け方）また、モデルの精度評価メトリックとして、不均衡データに適しているWeighted F1 Scoreを使います。

![EDA_jp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1978095/6ba6cdfb-a3d0-3e67-2e91-c98844ae7712.png)

# モデル
#### パラメーターなど
10,321番組を80-20%の割合で訓練データと検証データに分けます。10エポックを通してモデルを学習させ、各エポックで訓練データでのLossと検証データでの精度を追跡します。各エポックの終わりにモデルを保存し、検証データでの精度のもっとも高いエポックのモデルを最終モデルとしてピックアップします。

#### 構築
モデルにインプットとしてTitle、SubtitleとContentを連結し、この一つのデータのみをインプットします。アウトプットとして、各番組において13ジャンルそれぞれのその番組のジャンルになりえる確率が出されます。この13次元の配列から、一番高い確率をピックアップし、そのジャンルをモデルの予測として扱っています。予測を正解ラベルと比較し、精度評価を行なっています。

#### BERT
この問題を解くためにはGoogleが開発したBERTを使います。[🤗 Hugging Face](https://huggingface.co/) LibraryによってBERTの日本語のpre-trainedモデルを使用し、この問題を解けるように微調整を行います。Pre-trainedモデルとして東北大学の研究者らが開発したWikipediaの日本語の約３,000万の文章を用いて学習された[bert-base-japanese-v2](https://huggingface.co/cl-tohoku/bert-base-japanese-v2)を使います。豊富なデータを元に学習された高度なモデルですので、日本語の文脈やニュアンスをある程度理解できるモデルです。


# 結果
BERTモデルはパラーメータが多いためCPUで学習させるのが難しいのでGoogle ColabにてGPUのある実行環境で学習させます(無料実行可能)。また、モデルを加速させ、メモリー過大が起きないようにインプットを32番組（Batch）ごとにモデルに入力します。学習の推移は以下の図に表示されています：
![download (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1978095/5b863368-3712-6dae-f82e-55c9d9fa86ee.png)

各ジャンルの予測パーフォマンスは以下の図で表示されています：
![Screen Shot 2021-09-20 at 15.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1978095/e4e58d5d-c85a-c9c1-704c-f4f09dc34f8e.png)

なお、Confusion Matrixは分類問題の結果において不可欠ですかね：
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1978095/2aa6fc83-7abf-0c6e-a5f1-841eaea33fa9.png)

要約すれば、モデルは１０番目のエポックで一番高い精度 (97%)を得ました。また、訓練Lossも検証精度も１０エポック頃に横ばいになっていますので、１０以降のエポックで得られるメリってが少ないです。

データが多ければ多いほど、精度が上がるはずですので、この問題において完璧なモデルを構築できるのが可能だと思います。なお、この問題だけでなく、BERTのpre-trainedモデルはそれぞれの問題を解くために微調整するだけで有力なツールになるでしょう。

質問・コメントなどがありましたら danyelkoca@gmail.com までお聞かせください。

Dataset: https://github.com/danyelkoca/NHK/blob/main/data.csv
Code: https://colab.research.google.com/drive/12ezR2Q4MZHE9m_Ppv_RfuqnKt-G9yX3f?usp=sharing

Happy hacking!
【Laravel】FormRequestでバリデーションを実装しよう

#はじめに#
バリデーションとは、入力内容が要件を満たしているかどうか確認することです。
LaravelではFormRequestを使って簡単にバリデーションが実装できます。

#FormRequestのメリット#
　FormRequestを使うことで、バリデーションのルールやエラー時の処理をコントローラーから分離することが出来ます。また、バリデーションの使い回しやカスタマイズもしやすくなります。

#どうやって実装するのか#
　まずはRequestクラスを継承したPostFormRequestを作ります。
このようにコマンド入力します。

```
php artisan make:request PostFormRequest
```
これでPostFormRequestクラスを作ることが出来ます。
次に、生成されたPostFormRequestクラスに次のように記述します。

```PostFormRequest.php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PostFormRequest extends FormRequest
{
   /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
   public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required|max:20',
            'post' => 'required|max:140'
        ];
    }

}
```

public function authorize()の中身をtrueにするのを忘れないようにしましょう。
バリデーションのルールはpublic function rules()の中に書いていきます。
今回の例だと、name（フォームタグのname属性の値）には必須入力、最大文字数20文字というルールが与えられています。入力内容がこれに逸脱すると、バリデーションに引っかかって自動で前のページにリダイレクトするようになります。
　当然、エラーメッセージを表示することもできます。

```php:post.blade.php
/** エラーを全てまとめて表示 */
@if(count($errors) > 0)
      <div class="alert alert-danger">
             <ul>
                 @foreach($errors->all() as $error)
                       <li>{{ $error }}</li>
                 @endforeach
             </ul>
       </div>
@endif

/** 特定のエラーを表示 */
@if($errors->has('name'))
  <div class="error alert alert-danger">
    <p>{{ $errors->first('name') }}</p>
  </div>
@endif
```

#まとめ#
・Laravelでバリデーションを実装する際はFormRequestを使う。
・FormRequestクラスにバリデーションルールを記入する。
・viewでエラーを表示する。
ABC182 C - To 3 から学んだ

https://atcoder.jp/contests/abc182/tasks/abc182_c

![abc182_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/6f3c4cc3-7023-7966-7673-8fff37a713c3.png)
![abc182_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/d7297b5a-8662-d8a5-f80e-e8f41bb399aa.png)
![abc182_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/560c49ae-4c22-8541-b8af-dbfbc7e31a8b.png)
![abc182_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/a70aa74e-dacf-d321-7e7f-e19b264a207a.png)

bit 全探索かな？。
っで、どうやるんだっけ？
こちらが神です。

https://qiita.com/keroido/items/8744453a50d8c8b471c1

ザックリ見積もりで計算量が O(10^6 ~ 10^7) 。 
python で行けない可能性を危惧し、pypy で提出。無事通った。

```To3.py
N = list(input())

from itertools import product
def solv():
    ans = float("inf")
    for nums in product([0,1],repeat=len(N)):# O(2*10^5)
       nums = list(nums)
       score = ""
       if sum(nums) == 0:
          continue
       for i in range(len(N)):# O(19)
          if nums[i] == 1:
              score += N[i]
       score = "".join(score)
       if (int(score))%3 == 0:
          ans = min(len(N)-len(score),ans)
    print(ans if ans != float("inf") else -1)

solv()
```
[Win] Pageantを自動起動させて、あらかじめCAPIを読み込む設定を入れたい

#目的
WindowsのSSHクライアントから公開鍵暗号方式でSSH接続する際には、
TeraTermやPuTTyと一緒に、Pageantを使うと、いちいち秘密鍵を指定しなくて済むので便利です。

しかし、Pageantはデフォルト設定だと、
起動時に、毎回CAPIや秘密鍵を指定する必要があります。

面倒なので、Windows起動時にPageantを自動起動させて、同時にCAPIや秘密鍵を読み込ませるようにします。

#Windows起動時に、Pageantを自動実行させる
スタートアップフォルダに、Pageantのショートカットを入れるだけです。

- Win + R キーを押して、***「ファイル名を指定して実行」***を起動

- 下記コマンドを実行すると、***スタートアップフォルダ***が開く

```
shell:startup
```

- Pageantのショートカットを入れる


#Pageant起動時に、秘密鍵を読み込ませる
- スタートアップフォルダ内のPageantのショートカットの***プロパティ***を開く

- リンク先(T): に書かれたProgramのPathの後に、半角スペースを開けて、ダブルコーテーションで囲った秘密鍵のパスを入力する
![pageant_p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245439/a936affc-90d8-c4e8-0fb3-322991bc1c96.png)

```
[リンク先(T):Before]
"C:\Program Files\PuTTY_CAC\pageant.exe"

[リンク先(T):After]
"C:\Program Files\PuTTY_CAC\pageant.exe" "C:\Program Files\sample.ppk"
```

[Pageant起動後の例]
![pageant_import.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245439/879eb80f-eba5-3a27-6585-97626ec7d24a.png)

#Pageant起動時に、CAPIを読み込ませる (YubiKeyに保存している証明書を利用する場合など)

まずはPageantを起動し、利用したいCAPIの証明書を読み込みます。
![addcapicert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245439/0fa7a653-f893-9cfb-0c1c-513dc3df56f5.png)

Windowsの証明書選択画面が出るので、読み込みたい証明書を選択します。
![cert_select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245439/08ba3d51-a996-6085-74f1-42a1fcb4108d.png)

読み込まれたら、読み込んだCAPIの証明書をダブルクリック(赤枠)。
![CAPI_Cert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245439/862c87ae-9f93-8fb4-a3ee-7fe5d55293cc.png)

証明書が表示されるので、詳細タブの拇印を選択して、表示されたHEXを控える(コピーして利用する)。
![certificate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245439/6906e81e-ff41-4cdc-ee16-96b3f5c918e9.png)

- スタートアップフォルダ内のPageantのショートカットの***プロパティ***を開く

- リンク先(T): に書かれたProgramのPathの後に、半角スペースを開けて、
  CAPI:User\MY\[証明書で確認したHEX] のように入力する。

```
[リンク先(T):Before]
"C:\Program Files\PuTTY_CAC\pageant.exe"

[リンク先(T):After]
"C:\Program Files\PuTTY_CAC\pageant.exe" "C:\Program Files\sample.ppk" CAPI:User\MY\0123456789012345678901234567890123456789
```

以上


#参考
[SSH用の鍵管理にYubiKeyを使ってみた](https://qiita.com/ssgw39/items/dac4d5969ad4a7c649b6)
非同期関数のループ処理 - Part2（forLoop + async/await）

##他の処理方法との違い
前回のPart1ではforEach + async/awaitを使いましたが、今回はforLoop + async/awaitを使ってテストします。
このforLoop + async/awaitによる処理については、関数processArrayの中のawaitがしっかり効いて、逐次処理（順番に、ひとつ前の処理の結果が出てから次の処理を実行）となります。

また、awaitが効いているため、アウトプットの順番はインプットした順番と同じになりますので、今回はソートする必要はありません。

##ループ処理の内容
基本的にPart1と同じですが、フェイク非同期関数（fakeDatabaseQuery）を作成し、forLoopとasync/awaitを利用して、処理を（1 ~ 100まで）100回実行します。

プログラム内部にも説明がありますが、awaitは受けとる予定のpromiseオブジェクトがfullfilledまたはrejectedとなるまでファンクションの実行をサスペンドしますので、100回のループ処理において、ファンクションを止めている（サスペンドしている）時間がかなりの割合で発生していることになります。

##まとめ
Part1と比較して、フェイク非同期関数をループ実行する点は同じですが、こちらはforEachと違いasync/awaitがしっかり効きます！
ということで、全体としてサスペンドされている時間が長いので、当然ながら「遅い」です。ただし、アルゴリズム上、このような逐次処理をする必要がある場合は、このsyntax（構文）は意味があることになります。

##その他
下記のサンプルコードは、Node.js v14.15.5でテストしたものです。また、私の環境（Ubuntu + Node.js）で実行すると、約5秒かかります。

##サンプルコード

```JavaScript:
console.time();

let fakeSearchResult = [];
//整数の1～100まで並んでいるarrayを作ります
let arrayN = [];
const arrayLength = 100;
for (let i = 0; i < arrayLength; i++) {
    arrayN.push(i+1);
}

//データベース検索を偽装したフェイク非同期関数
function fakeDatabaseQuery(index) {
    const elapse = Math.floor(Math.random() * 100);
    const promise = new Promise(function(resolve, reject) {
        const result = {
            index:index,
            elapse:elapse
        }
        setTimeout(() => resolve(result), elapse);
    });
    return promise;
}

async function processArray(array) {
    for (let i = 0; i < array.length; i++) {
      //awaitは、受けとる予定のプロミスオブジェクトがfulfilledかrejectedとなるまで、
      //このファンクションの動作をサスペンドします
        const obj = await fakeDatabaseQuery(array[i]);
        console.log('obj', obj);
        fakeSearchResult.push(obj);
    }
    console.log('fakeSearchResult:',fakeSearchResult);
    console.timeEnd();
}

processArray(arrayN);

```

https://qiita.com/soichirowada/items/894be5a2532b477c4b29

https://qiita.com/soichirowada/items/77d358ea64f85d21667b

https://qiita.com/soichirowada/items/7f0ad6c55075252ee012

https://qiita.com/soichirowada/items/263ee198c3d793be6f59
登記情報(pdf)→メモ帳（txt）変換

windows10
Python 3.9.0
visual studio code


・ファイル名を入れないといけない。
・ファイル1つしか出来ない。
・一行しかコピー＆ペースト出来ない。
・＿＿＿
・＿＿＿


```

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
input_path = 'ファイル名.pdf'
output_path = 'result.txt'
manager = PDFResourceManager()
with open(output_path, "wb") as output:
    with open(input_path, 'rb') as input:
        with TextConverter(manager, output, codec='utf-8', laparams=LAParams()) as conv:
           interpreter = PDFPageInterpreter(manager, conv)
            for page in PDFPage.get_pages(input):
                interpreter.process_page(page)
```

https://www.youtube.com/watch?v=B-n-wpnBQ2g
【PHP初心者】処理はうまくいっているのに画像が表示されない

## 事例
・ブログを作成中に発生。
・なぜか1箇所画像が表示されない。（ブログ記事編集画面のサムネイル）

__▼記事一覧（抜粋）__

[編集]を押すと編集画面に遷移

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2054587/df1f0e37-13ef-9a45-5077-b9baa3a06dc2.png)
|:-:|

__▼編集画面（抜粋）__
　本来はここにサムネイル画像が表示されるはず。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2054587/85668236-b9da-35d9-019f-f1beba237696.png)
|:-:|

## 問題の切り分け
編集画面で画像を更新すると、遷移先の記事一覧画面では更新後画像が表示される。

| 記事一覧画面（更新前） | 編集画面 | 記事一覧画面（更新後） |
| :--- | :--- | :--- |
| 変更前画像が表示 | NG（サムネイル画像が表示されない） | 変更後画像が表示|
__→画像の更新処理は正しく動いてそう__。

編集画面の1箇所だけ画像表示できないとなると、htmlの方に問題がある気がする。


## 解決法
該当箇所（html）のimgタグ内のパスが誤っていました。初歩的...
ちなみに私のディレクトリ構成はこちら。（関連あるものだけ抜粋）

```
root
├ album/
│　  └ imgファイル（表示させたいもの）
└　edit.php（編集画面用ファイル） 　
```

そして、下記が修正内容です。


__修正前（誤り）__

```:edit.php
<img src="/album/thumbs-<?php echo $article->getFilename() ?>">
```

__修正後（正解）__

```:edit.php
<img src="./album/thumbs-<?php echo $article->getFilename() ?>">
```

これで無事、編集画面上にもサムネイル画像が表示されるようになりました。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2054587/84125a29-1700-256a-6359-139811409c6f.png)
|:-:|
## 参考
[PHP初心者がつまづいた画像ファイルを上げる際に倒さねばならぬエラーたち](https://qiita.com/Dicrotect/items/1c76c14b9c7c91195fa8)
C言語３級試験で知ったことメモ

[サーティファイC言語プログラミング能力認定試験3級](https://www.sikaku.gr.jp/js/cpjv/ "C-Language Programming Skills Qualification Test")のまとめです
※間違いがあるかもしれませんので、ご容赦ください

# 問1にあたる知識
### 一般的なこと
- C言語は異なるハードウェアで動作させることのできる移植可能なプログラムを書くことができる（らしい）(すごい）
- プログラム開始処理において呼び出される関数の名前はmain関数
- 関数内の任意の場所で実行を終えるときはreturn文を使用する
- 標準ライブラリ関数``scanf``は、stdio.hで宣言されている
- 文字操作関数はヘッダファイルctype.hをインクルードする
- 改行を表すときは￥nであらわす
- 水平タブを表すときは￥tであらわす
- 符号なし整数型unsigned int型を扱うことができる
- /**/で注釈（コメント）になる（ただし、ダブルコーテーション""内では無効）
```c
    /*
        ここが注釈
    */
```
- 注釈/**/は入れ子にすることはできない
- 注釈/**/は複数行にわたって記述できる
```c
    /*
        ここが注釈
        複数行も可能
    */
```
- 注釈をどれだけ大量に記述しても実行速度には関わらない（コンパイル時に無視されるため）

---
### その他
- ``#include``前処理命令で読み込む対象のソースファイル内に``#include``前処理命令を記述することができる
- 前判定型のwhile文、後判定型のdo while文どちらも使用可能
- while（式）文の「式」の部分には反復処理の継続条件を記述する
- switch文の各caseの定義式には同値を記述できない
- switch文ではcaseの定義式のいずれにも一致しないときの処理をdefaultで記述することができる
- getchar関数は標準入力から1文字単位で文字を読み込み、ファイルの終わりで``EOF(End of File)``を返す
- 文字列定数は￥0（ナル、ヌル文字）で終わる連続した文字の列である
- C言語には、文字列を連結する**演算子はない**（関数はあるstrcat()）
- 下記2つは等価である
 ```c
    char c[] = "xyz"; 
    char c[] = {'x','y','z','￥0'};
```

- isxdigitは16進数かどうかを判定する

# 問2にあたる知識
### 演算子シリーズ
|演算子の名前|対応する演算子|
|:--:|:--:|
|加算演算子|+|
|減算演算子|-|
|乗算演算子|*|
|除算演算子|/|
|剰余算演算子|%|
|インクリメント|++|
|デクリメント|--|
|論理積演算子|&&|
|論理和演算子|\|\|
|代入演算子|=|
|等価演算子|==|
|非等価演算子|!=|

---

### 定数に関すること
- 8進数は接頭語に0をつけて表記する
    - ex.077(8進数)、008
- 16進数は接頭語に**0x**(小文字)または**0X**(大文字)をつけて表記する
- ``char c = '8';`` と ``char c = 0x38;`` は同値になる(ASCII表&nbsp;16進表記）
- ``char c = '2';`` と ``char c = 062;`` は同値になる(ASCII表&nbsp;8進表記)
- ``int d = 7; ``と ``int d = '7'- '0'; ``は同値になる計算は以下
    - 0010 0111(2) - 0010 0000(2) = 0000 0111(2) = 7(10)

---
### 書式(フォーマット)指定子
| 指定子 | データ型 | 説明 |
|:----------:|----------|------|
| %c | char | char型１文字 (charのc) |
| %s | char * | 文字列 (stringのs) |
| %u | unsigned int など | 符号なし10進整数 (Unsignedのu) |
| %o | unsigned int, int など | 8進整数 (Octalのo) |
| %x | unsigned int, int など | 16進整数 (HeXadesimalのx) |
| %f | float | 浮動小数 (float) |
| %ld | long | 倍精度整数10進 (long decimalの頭文字) |

※他にもあります

---
# 問4にあたる知識
- ``#define``指令でマクロを置き換えられる
- ``#include``指令で他のソースファイルを読み込める
- 以上の処理はプリプロセッサによって行われる

---
### 　文字操作関数(標準ライブラリ関数)

- ``<ctype.h>``で宣言される

| 関数名 | 説明 |
|--------|------|
| isalpha | アルファベット(alphabet)文字であるか判定する |
| isupper | 大文字(uppercase)であるか判定 |
| islower | 小文字(lowercase)であるか判定 |
| isdigit | 10進数数字であるか判定 |
| isxdigit | 16進数数字であるか判定 |
| isalnum | 10進数数アルファベット（alphabet）文字または数字(numeric)であるか判定 |
| isspace | 空白文字(空白''、タブ\t、改行\n、垂直タブ\v、改ページ\f、復帰\r)であるか判定 |
| toupper | 文字が小文字なら大文字に変換した値を返す（それ以外はそのままの値を返す） |
| tolower | 文字が大文字なら小文字に変換した値を返す（それ以外はそのままの値を返す） |


# 問5にあたる知識
- printf関数で出力される値の表示桁数を指定できる
- 表示桁数は<br>[指定子＜0またはマイナス＞＜**最小**ケタ数＞.＜実際に表示する桁数＞]<br>で指定でき、＜＞内は省略可能
- 0 の時は空き領域を0で埋め、マイナスの時は左詰めになる(デフォルトは右詰め)

```c:sample.c 
/*[指定子＜0またはマイナス＞＜最小ケタ数＞.＜実際に表示する桁数＞]*/
printf("[%05d]",29); //00029
printf("[%03X]", 0xfa);//0FA
printf("[%6d]",2021);//ΔΔ2021
printf("[%-8s]", "TOKYO");//TOKYOΔΔΔ
printf("[%-15s]", "I am a boy.");//I am a boy.ΔΔΔΔ
printf("[%-4s]", "MUSIC");//MUSIC
printf("[%5.3s]", "PHOTOGRAPH");//ΔΔPHO
```
※Δは空白文字

---
rbenvでRubyのversionが変わらなくて悩んだ原因はシェルだった。

# 背景
Homebrewおよびrbenvをインストールし、

```
$ rbenv global 3.0.2
```
Rubyのversionを2.6.3から3.0.2へ更新しました。


しかし、ターミナルを一度閉じてしまったり、iTermやVSCodeなど他のCLIで「ruby -v」コマンドでRubyのversionを確認してみても、2.6.3のままでした。


[Rubyのバージョンが切り替わらない時の対処法！](https://qiita.com/opiyo_taku/items/3312a75d5916f6cd32b1)を参考に「.bash_profile」を書き換えた後、「source ~/.bash_profile」コマンドを実行してみましたが症状は変わらずでした。


# 原因
シェルがbashではなくzshだったため、「.bash_profile」にRubyの参照先を書いても起動時に読み込まれないことが原因でした。

[rbenvでRubyバージョン切り替える【仕組みまで理解】](https://ichitasu.com/ruby-rbenv/)を参考に「.zshrc」を書き換えたところ解消されました。
processing4.0 beta1でのvideoライブラリ検証

#はじめに
　processing4.0b1のvideoライブラリの動作検証です。Processingではwebカメラを使うのが非常に簡単ではありましたが、MacOS 10.15から32bitプログラムが動かなくなった関係で、videoライブラリが動かなくなったりしました。
　動かない時は、3.5.3を一度入れてから、3.5.4を入れると動いたりして。それでもダメな時は、もっと古いバージョンを手動で入れてコマンドも使うなど、初心者にはハードルが高すぎました。
　4.0になって、その辺が一気に解消するといいのですが、アルファからベータになってどうなっているでしょう。

#結論
　動く。

#環境
 M1 Mac
 processing4.0b1
 MacOS 11.1
 GStreamer-based video library for Processing 2.0
 ※起動時にはコマンドラインに1.16.2と出る
 SlitScanサンプルプログラム

追記：
　processing4.0b2
　MacOS 11.6
　にアップデートしても、SlitScanは動いた。ただし、初回実行は10秒かかる。

#注意点
　すでに、3.5.3と3.5.4が入っていて、videoライブラリ問題が解決している環境なので、問題がないのかもしれません。processing4.0b1を入れて起動して、すでに入っていたライブラリのサンプルにアクセスできたので、まっさら環境に4.0b1だけだと、結果は違うかもしれません。

#メモ
　内部的に、java8からjava11になって高速化していると、書いてありますが、フラクタル系のサンプル動かした感じでは、逆に遅くなってます。環境のせい？

追記：
4.0b2にして、OSも最新にした場合、フラクタルの計算で、
3.5.4では32秒に対し、4.0b2では26秒と速くなった。
XiaomiADBFastbootToolsが文字化けしていたときの対処法


私の使っているスマホ、RedmiNote9Tで充電ケーブルを挿すたびに画面が暗転しめっちゃ早く充電してまっせ〜！感を出すだけのこの表示を消したいと思いXiaomiADBFastbootToolsをインストールしてみました。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276059/f3e9e0da-723d-28fd-997d-2b036238d0df.png" width="500px">

XiaomiADBFastbootTools

https://smartasw.com/archives/8039

サイトの通りにJava SE v17をMacにインストールし再起動してからXiaomiADBFastbootToolsを起動すると以下のように文字化けをしてしまいました。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276059/0750302f-8c8b-ec0c-076e-ae51603d291a.png" width="700px">

どうやらRedmiNote9Tを認識しているらしいですが、こんな状態でいじるのは怖すぎるので解決法を探してみました。

XiaomiADBFastbootToolsのGitHubリポジトリに文字化けしてしまう問題について言及している[issue](https://github.com/Szaki/XiaomiADBFastbootTools/issues/289#issuecomment-851850429)を見つけました

Java SE v11を使え！16を使え！　OpenJDKだ　と色々議論がされてますが、私の場合AdoptOpenJDKをインストールすることで解決しました

https://agency-star.co.jp/column/adoptopenjdk/

インストール後Macを再起動し、XiaomiADBFastbootToolsを起動すると無事文字化けが解決しました。

環境が違うと解決しないかもしれませんが、以下の環境ではこの方法で解決できたので備忘録として残しておきます。

環境:
RedmiNote9T 
MIUI12.5.3
Android11

MacBookPro2016
MacOS Big Sur

ちなみに充電の表示を消すことはこのツールでは叶いませんでした。誰か知っている人がいたら教えてください。
ExcelVBA経由でAccessにsql(insert)を発行する際にハマった

ExcelVBAを利用して、取得したJSONデータをAccessのテーブルにInsertするときにハマったので、メモとして残しておく。実際は、sql発行全般にいえることみたいですが、ハマったのはinsert文だったので以下はinsert文と例となります。
予め結論ですが、Accessでは、```[```と```]```で括ることが重要だと勉強になりました。
***
###各種環境について
* Access2013
* Excel2013
* 参考)利用したデータはLINEWORKSのアドレス帳のデータをAPIで取得したもの

***
###ハマった部分について
頭に記載している通りInsertの発行時にハマりました。
以下、抜粋ですが、```Execute```した時に、```insert構文エラー```と表示されてしまう。試しにinsertのsql文だけ```Debug.Print```で出力されたものをAccessのクエリ画面で実行してみると正しくinsert文が発行される。

```vb
  'Access接続用オブジェクト
  Dim con as Object
  Set con = CreateObject("ADODB.Connection")
  con.Open = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
             "Data Source=Accessファイルのフルパス;"
  
  'insert用のsql文
  Dim sql as string
  sql = "insert into address" & _
        "(resourceId,isOpen,isCoEditing,masterUserId)" & _
        "values('123456789',1,0,'xxx@xxx');"
 
  'sqlの実行
  con.Execute sql
```

***
### insert構文エラーの原因について
以下抜粋です。ほぼ↑のソースコードと変わりませんが、一部異なる部分があります。ぱっと見一緒すぎてわかりにくいのですが、insert文の列名の部分に着目します。↑だと```resourceId,isOpen,isCoEditing,masterUserId```となっていますが、↓だと```[resourceId],[isOpen],[isCoEditing],[masterUserId]```となっています。列名を```[```と```]```で括っているか括っていないかの違いのみ。これですんなりinsert文が発行できました……。

```vb
  'Access接続用オブジェクト
  Dim con as Object
  Set con = CreateObject("ADODB.Connection")
  con.Open = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
             "Data Source=Accessファイルのフルパス;"
  
  'insert用のsql文
  Dim sql as string
  sql = "insert into address" & _
        "([resourceId],[isOpen],[isCoEditing],[masterUserId])" & _
        "values('123456789',1,0,'xxx@xxx');"
 
  'sqlの実行
  con.Execute sql
```

***
### 所感
Accessのクエリ画面で発行すると正常に動作して、ExcelのVBA経由で実行すると上手くいかないという部分でかなりハマってしまいました。AccessとExcel経由でSQL構文の判断基準が違うなんて知らなかった。

Access触った事ほぼ無かったですが、いけるやろうと軽く手を出して、返り討ちにあい、数年後になんとか領地を取り戻した気分でした。

とりあえずドツボにハマらなくて良かった。
とはいえ、時間は溶かしたなあ……。
Map の keys を使うときの注意点

Kotlin で Android アプリの実装中に、ConcurrentModificationException が発生したので記事にしておきます。

### 発生条件

下記は、Exception が発生した状態を、簡易的にテストで表したものです。

```kotlin
    @Test
    fun test() {
        val map = mutableMapOf(1 to "One", 2 to "Two", 3 to "Three")
        thread(name = "thread-a") {
            map.keys.forEach { _ ->
                // key を使った処理を実行
                Thread.sleep(100)
            }
        }
        thread(name = "thread-b") {
            // map の更新
            map.remove(1)
        }
        Thread.sleep(1000)
    }
```

一方のスレッド (thread-a) では Map の keys.forEach を使った処理を行っており、もう一方のスレッド (thread-b) では Map を変更するような処理を行っています。

これを実行すると、下記の　Exception　が発生します。

```
Exception in thread "thread-a" java.util.ConcurrentModificationException
	at java.base/java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
	at java.base/java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:741)
	at com.ykato.designpatterns.ExampleUnitTest$test$1.invoke(ExampleUnitTest.kt:34)
	at com.ykato.designpatterns.ExampleUnitTest$test$1.invoke(ExampleUnitTest.kt:14)
	at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
```

### 原因
ConcurrentModificationException は、あるスレッドが Collection で反復処理を行っている間に、別のスレッドがそのCollectionを変更すると発生します。

keys のドキュメンテーションコメントには特に記載がありませんが、keys の forEach も Map 自体の forEach と同様（Collection の反復処理）の扱いとなるようです。
Map の forEach には気を遣っていましたが、keys の forEach はノーマークでした。。。

```kotlin:Collections.kt
    /**
     * Returns a [MutableSet] of all keys in this map.
     */
    override val keys: MutableSet<K>
```

### 回避策
この問題は `map.keys` を `map.keys.toSet` に変える（コピーする）ことで回避できます。
【初心者向け】CSSの記述場所（３パターン）

#はじめに
HTMLを装飾するのに欠かせないCSSですが、一体どこに記述すれば良いのでしょう。
今回は、CSSの記述場所３パターンをご紹介します。
３パターンとも青い文字で`CSSの記述場所を紹介します`と画面に表示されることになります。

#① headタグ内に書く
１つ目のパターンとして、headタグ内にstyleタグを書き、その中に書く方法があります。

```html:index.html
<!DOCTYPE html>
<html lang=“ja”>
    <head>
        <meta charset=“utf-8”>
        <title>CSSの記述場所</title>
        <style>
            p { color: blue; }
        </style>
    </head>
    <body>
        <p>CSSの記述場所を紹介します</p>
    </body>
</html>
```

#② HTMLタグに直接書く
２つ目のパターンとして、HTMLタグの中にスタイル属性を指定して、直接書く方法があります。

```html:index.html
<!DOCTYPE html>
<html lang=“ja”>
    <head>
        <meta charset=“utf-8”>
        <title>CSSの記述場所</title>
    </head>
    <body>
        <p style="color: blue;">CSSの記述場所を紹介します</p>
    </body>
</html>
```

#③ 外部に作ったCSSファイルに書く
３つ目のパターンとして、外部に作ったCSSファイルを作成し、それを読み込む方法があります。
今回は、cssフォルダの中にstyle.cssというCSSファイルを作成したことにします。

```html:index.html
<!DOCTYPE html>
<html lang=“ja”>
    <head>
        <meta charset=“utf-8”>
        <title>CSSの記述場所</title>
　　　　　　　　　　　　　　　　<link rel=“stylesheet” href=“css/style.css”>
    </head>
    <body>
        <p>CSSの記述場所を紹介します</p>
    </body>
</html>
```

```CSS:style.css
@charset "utf-8";

p {
    color: blue;
}
```

#おわりに
③の外部に作ったCSSファイルに書く方法が一般的なので、この書き方に慣れておくと良いかと思います。
Celeryのwokerをスクリプトから起動

[python \- スクリプト/モジュール\_\_main\_\_からCeleryワーカーを起動する方法は？](https://try2explore.com/questions/jp/10858119)
[miguelgrinberg/flask\-celery\-example: This repository contains the example code for my blog article Using Celery with Flask\.](https://github.com/miguelgrinberg/flask-celery-example)



# redisサーバーの準備

```sh:github.com/miguelgrinberg/flask-celery-example/blob/master/run-redis.sh
#!/bin/bash
if [ ! -d redis-stable/src ]; then
    curl -O http://download.redis.io/redis-stable.tar.gz
    tar xvzf redis-stable.tar.gz
    rm redis-stable.tar.gz
fi
cd redis-stable
make
src/redis-server
```

# スクリプト用意

```
worker.py
proj/
  celery.py
  tasks.py
  __init__.py
```

```py:worker.py
from proj import app

# celery -A proj worker -l INFO
app.worker_main(['worker', '--loglevel', 'info'])
```

```py:proj/celery.py
from celery import Celery

app = Celery('proj',
             broker='redis://localhost:6379/0',
             backend='redis://localhost:6379/0',
             include=['proj.tasks'])

# Optional configuration, see the application user guide.
app.conf.update(
    result_expires=3600,
)

if __name__ == '__main__':
    app.start()
```

```py:proj/tasks.py
from .celery import app

@app.task
def add(x, y):
    return x + y

@app.task
def mul(x, y):
    return x * y

@app.task
def xsum(numbers):
    return sum(numbers)
```

```py:__ini__.py
from .celery import app
```

# 実行

```
$ python worker.py
```
ThinkPad TrackPoint Keyboard II でスクロール

github code: https://github.com/yabeenico/thinkpad-trackpoint-keyboard-ii/blob/main/scroll.ahk

# 目標

[ThinkPad TrackPoint Keyboard II](https://www.lenovo.com/jp/ja/accessories-and-monitors/keyboards-and-mice/keyboards/KBD-BO-TrackPoint-KBD-US-English/p/4Y40X49493) で Windows との Bluetooh 接続時にスクロールとミドルクリックを両立させたい。

スクロールはミドルボタンを押しっぱなしにしてトラックパッドを前後に倒すことで実現する。

# 現状
- USB ドングルで接続した場合:
    - 普通に可能 (別途ドライバ不要)
- Bluetooth 接続の場合:
    - ドライバ[^driver] をインストールし、"ThinkPad Preferred Scrolling" にチェックを
        - 入れた場合: スクロールだけ実現
        - 入れない場合: ミドルクリックだけ実現
    - ドライバをインストールしない場合:
        - ミドルクリックだけ実現

# 解決策

以下の AutoHotkey スクリプトを常駐させれば良い。
なおドライバは不要。
ドライバをインストールする場合は "ThinkPad Preferred Scrolling" のチェックを外す。

```
#MaxHotkeysPerInterval 2000
#SingleInstance force

WheelUp:: hookWheelUp()
global isWheelUP := false
hookWheelUp(){
    send {Wheelup}
    isWheelUp := true
}

WheelDown:: hookWheelDown()
global isWheelDown := false
hookWheelDown(){
    send {WheelDown}
    isWheelDown := true
}

; MButton を無効化
MButton::return

MButton up::hookMButtonUP()
hookMButtonUP(){
    ; MButton を押して離すまでにスクロールされなかった場合、MButton を押す
    if(!(isWheelUp | isWheelDown)){
        send {MButton}
    }
    isWheelUp   := false
    isWheelDown := false
}
```

[^driver]: [ThinkPad トラックポイント キーボード II ソフトウェア (Windows 10 64bit/ 7 64bit)](https://support.lenovo.com/jp/ja/downloads/ds543713-thinkpad-trackpoint-keyboard-ii-software-for-windows-7-windows-10)
[Ruby] Array#permutation

##はじめに
Rubyのpermutationメソッドについて簡単にまとめたいと思います。
よろしくお願いします。

##permutationメソッド
これは配列の中の組み合わせを全て作ってくれます。
返し方は配列の中に配列を作って一つの組み合わせを表現します。

また、要素が同じで順番が違っていた場合も違う組み合わせとして扱われます。

```ruby
a = [1, 2, 3]
a.permutation.to_a

=> [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
```

また引数を渡すとその渡された数字分で組み合わせを出します。

```ruby
a = [1, 2, 3]
a.permutation(2).to_a

=> [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
```

参考: https://docs.ruby-lang.org/ja/latest/method/Array/i/permutation.html
Conflicting values for 'process.env.NODE_ENV'

webpackのバージョンを 5.17.0 -> 5.53.0にあげたら以下のワーニングが出た。

#### エラーメッセージ
```
Conflicting values for 'process.env.NODE_ENV'
'"staging"' !== '"development"'
```

#### Source

```javascrtipt
new webpack.DefinePlugin({
  'process.env.NODE_ENV': JSON.stringify('staging')
}),
```

色々ググったみたけど、`webpack.DefinePlugin`や　`webpack.DefinePlugin`だとNODE_ENVにmodeの値以外を設定するとワーニングが出るみたい

ということで、`APP_ENV`みたいな違う値にして実現する必要があります。

#### 参考
- https://webpack.js.org/plugins/environment-plugin/
python pyenv 切り替え

Djangoを入れようとしたら、pythonのversionが合わないと言われpythonのversionを変えようと思った。
しかし、versionの切り替えに詰まったのでまとめます。

環境：
mac big sur
zsh 使用

zshに以下を記述。
`if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
`

これで、macの標準のpythonを使わせることを取りやめ、pyenvのpathを読ませる記述らしい。


参考：
https://teratail.com/questions/289984
【Django】Markdownをプレビュー通りにHTML反映させる

はじめまして、こちらはDjangoアプリ開発の際に躓いた点を備忘録として残しております。
今回はMarkdown形式での記事投稿を実装の際、少し悩んだ点を書き記します。

## 実装の際に参照したサイト  
実装の際、下記サイトを参考に進めていきました。いやはや本当に有難いです。  

[https://yuki.world/django-markdown-implement/#t_mdeditor](https://yuki.world/django-markdown-implement/#t_mdeditor)  

基本的に上記サイトの手順通りに進めていったのですが、初歩的な点に気付かず、小一時間悩み続けました。。。  

## 悩んだところ  
上記サイトの項目『**mdeditorリアルタイムプレビュー通りのスタイリングでフロント表示する**』になります。  
まずは記事通り、テンプレートのhead要素内に下記コードを記述しました(自分の場合はbase.htmlに書きました)。  

```base.html
  <link href="{% static 'mdeditor/css/editormd.min.css' %}" rel="stylesheet">
  <link href="{% static 'mdeditor/css/editormd.preview.css' %}" rel="stylesheet">
```  
そしてお次はbody要素の最後に下記コードを記述。こちらも記事通りですが、ここで躓いた点があります。  

```base.html
  <script src="{% static 'mdeditor/js/jquery.min.js' %}"></script>
  <script src="{% static 'mdeditor/js/editormd.min.js' %}"></script>
  <script src="{% static 'mdeditor/js/lib/marked.min.js' %}"></script>
  <script src="{% static 'mdeditor/js/lib/prettify.min.js' %}"></script>
  <script src="{% static 'mdeditor/js/lib/raphael.min.js' %}"></script>
  <script src="{% static 'mdeditor/js/lib/underscore.min.js' %}"></script>
  <script src="{% static 'mdeditor/js/lib/sequence-diagram.min.js' %}"></script>
  <script src="{% static 'mdeditor/js/lib/flowchart.min.js' %}"></script>
  <script src="{% static 'mdeditor/js/lib/jquery.flowchart.min.js' %}"></script>
<script>
  $(function () {
      editormd.markdownToHTML("content", {   ←躓いた点
          emoji           : true,
          taskList        : true,
          tex             : true, 
          flowChart       : true,
          sequenceDiagram : true,
      });
      $(".reference-link").each(function (i,obj) {
        console.log(obj)
      })
  })
</script>

```  
上記コードに『躓いた点』と書いた行ですが、"content"はテンプレート内のid属性を参照していることに気付きませんでした。  
自分の場合、下記テンプレート内の本文をプレビュー通りに反映させたかったため、ブログ詳細『detail.html』の下記コードにid属性『content』を付与しました。  

```detail.html
<div id="content">{{object.content|markdown|safe}}</div>
```  
これで本文にMarkdownが適用されるようになりました。
今後も何かありましたら、備忘録として残していこうと思います。
@graphql-codegenの環境変数の設定方法

## 前提使用技術

- Next.js
- typescript
- apollo-chlient
- @graphql-codegen-cli



```codegen.yml
overwrite: true

schema:
  - "ここにエンドポイント":
      headers:
        "X-Shopify-Storefront-Access-Token": ${NEXT_PUBLIC_STORE_FRONT_ACCESS_TOKEN}

documents: "src/queries/**/*.ts"
generates:
  src/types/generated/graphql.tsx:
    plugins:
      - "typescript"
      - "typescript-operations"
      - "typescript-react-apollo"

```

```.env
NEXT_PUBLIC_STORE_FRONT_ACCESS_TOKEN="ここにアクセストークンやAPIKEY"
```

今回はショッピファイ のトークンを想定してました。
headersは自分のアクセスしたいAPIのものを設定します。

.envファイルを読み込みにいくには${}で囲みます。
注意しなくてはいけないのはprocess.envを通常つけるはずですが、この場合は付けなくて良いことです。


```package.json
"scripts": {
    "gen-types": "graphql-codegen --require dotenv/config --config codegen.yml"
  }
```

package.jsonにscriptsを追加します。
--require dotenv/configを設定すると実行時にデフォルトで.envファイルを読みにいきます。

注意点として.envファイルだけで.env.localなどのファイルは読みにいきません。
その場合は
https://www.graphql-code-generator.com/docs/getting-started/require-field
こちらに書いてあるので実践してみましょう！！

お疲れさまでした！
python版py3Dmolによる描画にはnodejsをinstall (jupyter-notebookにて)

#要約
jupyter-notebookにてpy3Dmolによる描画が表示されないときはnodejsをinstallしましょう。
#背景
py3Dmolは化学物質や蛋白質の三次元構造を描画するモジュールの1つです。PyPIに載っているリンクからプロジェクトページに移動すると3Dmol.jsとなります。ベースはjavascriptなんでしょうね。
#方法
windows10ではコマンドプロンプトで以下のコマンドを実行。linux, macでも同様と思いますが試していません。jupyter-labには拡張が必要とのこと。
pip install nodejs
pip install py3Dmol
次に、python実行環境で以下を実行 (公式tutorialと同じです)。
import py3Dmol
view = py3Dmol.view(query='pdb:1ubq')
view.setStyle({'cartoon':{'color':'spectrum'}})
view
以上です。
lightgbmのランキング学習で「lambdarank label (31) excel the max range」が出る場合の解決

## 事象
lightgbmの`'objective': 'lambdarank'`でランキング学習しようとしたときにLightGBMError例外が発生してしまう問題

```.py
model = lgb.train(params, train_set=lgb_train, valid_sets=lgb_eval, verbose_eval=10)
# => LightGBMError: label (31) excel the max range -290077952
```

## 解決
事前にラベル(目的変数)を`int64`に変換しておく。
30を超える数の順位を使いたいときはparamsに`label_gain`を渡せば上限数を変えれるようだが、そもそもfloat型だとどうやっても上限数を超えてしまう模様。
`pandas.DataFlame.astype`でint型に変換することで解決した。

```.py
y_train.dtype()
# => dtype: float64

y_train = test_set['target'].astype(int)
y_train.dtype()
# => dtype: int64

```


## 参考
- [can't use ranking with label value >= 31](https://github.com/microsoft/LightGBM/issues/1090)
docker メモ

```
1st terminal
`docker run -it -v ${PWD}:/resume there4/markdown-resume`

2nd terminal
`docker cp resume.md ${container_id}:app/examples/source`

1st terminal
```
cd ../app
./bin/md2resume pdf -t readable examples/source/resume.md examples/output/
```

2nd termianl
`sudo docker cp ${container_id}:app/examples/output/ .`

Get into container bash
`sudo docker exec -it ${container_id} bash`
```
ColaboratoryのRカーネルでBQにクエリを投げる

## 概要
RカーネルのColaboratoryでBigQueryにクエリ発行するまでのメモです。

## 手順

以下のURLにてRを実行環境としたノートブックを作成します。

`https://colab.research.google.com/notebook#create=true&language=r`

ローカル環境と同じようにbigrqueryパッケージをインストールして認証を進めてみます。

```R
install.packages("bigrquery")
library(bigrquery)
```

```R
bq_auth(use_oob = TRUE, cache = FALSE)
```

以下のようなエラーメッセージが出てしまいました。
PythonであればURL認証のダイアログが表示されるのですが、どうにも認証を進めることができません。

```
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)

also installing the dependency ‘rapidjsonr’


Error: Can't get Google credentials.
Are you running bigrquery in a non-interactive session? Consider:
  * Call `bq_auth()` directly with all necessary specifics.

Traceback:

1. bq_auth(use_oob = TRUE, cache = FALSE)
2. stop("Can't get Google credentials.\n", "Are you running bigrquery in a non-interactive session? Consider:\n", 
 .     "  * Call `bq_auth()` directly with all necessary specifics.\n", 
 .     call. = FALSE)
```

いろいろ調べてみたところ以下のような記事が見つかりました。

https://towardsdatascience.com/how-to-use-r-in-google-colab-b6e02d736497

> Apparently, the error occurred because the interactive function in httr package could not be executed.
Here’s a workaround that we can use, provided by jobdiogene’s: https://gist.github.com/jobdiogenes/235620928c84e604c6e56211ccf681f0

どうやらhttrパッケージのis_interactive()について、常にTRUEを返却する形でオーバーライドすることで解決できるようです。

```R
if (file.exists("/usr/local/lib/python3.7/dist-packages/google/colab/_ipython.py")) {
  install.packages("R.utils")
  library("R.utils")
  library("httr")
  my_check <- function() {return(TRUE)}
  reassignInPackage("is_interactive", pkgName = "httr", my_check) 
  options(rlang_interactive=TRUE)
}
```
そのまま実行して、再度bq_auth()を実行してみたところ問題なくURL認証のダイアログが表示されました。

```
Please point your browser to the following url: 

https://accounts.google.com/o/oauth2/auth?client_id=~~~

Enter authorization code: []
```

認証を通過できたので、クエリ結果をデータフレームとして代入できるようになります。

```R
projectid <- "projectName"
sql <- "SELECT * FROM `projectName.datasetName.tableName`"

tb <- bq_project_query(projectid, sql)
df <- bq_table_download(tb)
```

## 参考URL
https://gist.github.com/jobdiogenes/235620928c84e604c6e56211ccf681f0
割り込み処理について

#割り込み
コンピュータのCPU（中央処理装置）に現在実行中の処理を一時中断させ、強制的に指定された処理を実行させること。また、CPUに伝達されるそのような処理要求。
***
#####⇔ポーリング
何かイベントが起きると、それに対応した処理を行う
「何時起こるかわからないイベント」を「非同期イベント」という
######このイベントが発生しているかを定期的にチェックする←これをポーリングという
しかし、チェックする周期が長いと、イベントの発生から検出までにタイムラグが生じてしまう
だからといってチェック周期を短くすると、CPUがその処理ばかりやることになってしまって、他の処理に支障がでてしまう

この問題を解決するのが**割り込み処理**

1.あるデバイスでイベントが発生すると、CPUに割り込み信号が通知される。
2.CPUは割り込み信号を受けると、現在の処理を中断。このとき後で戻ってこられるように現在の状態を保存（退避）しておく。
3.対応する割り込み処理を行う。この処理を行う関数は、割り込みハンドラや割り込みサービスルーチン(ISR)と呼ばれ、あらかじめOSに登録しておく。
4.割り込み処理が終わると、状態を復帰させて、元の処理を継続する。
***

###内部割込み
実行中のプログラムのトラブルが原因で発生する割り込み。

コンピュータを構成するCPUやメモリなどのプログラムに基づく演算やデータ処理動作に伴って割り込み動作が行われる。

ex)
・演算結果のオーバーフローやアンダーフロー

・0による除算

・権限の無い領域へのアクセス(メモリ保護違反)
___
###外部割込み
プログラムの実行中にユーザがマウスやキーボードを操作したり、ネットワークからデータが送信された際に派生する割り込みのこと。

ex)
・主記憶障害、電源などの障害

・入出力装置の完了、中断

・タイマ割り込み(予定の時間が来た時)

・コンソール割り込み(割込みスイッチを押した時)
___
###割り込み処理のデメリット
>ハードウェアに依存する

各イベントに対応した割り込み信号がCPUに通知されるようにハードウエアを設計しておかなくてはならない。ソフトウエア側も、どのデバイスの割り込みにどの割り込み番号が割り当てられているかを理解する知識が要求される


>OSに依存する

割り込みハンドラを登録する時に指定する番号（ベクタともいう）や割り込み制御関数の仕様は、OSによって異なっている

>割り込みハンドラにはご法度がある。

長時間の処理はダメ、待ち状態になってはいけない、 呼んではいけない関数がある
WSL2上でIntelliJ IDEAでJava開発

## WSL2上の実行環境で、WindowsからIntelliJ IDEA Communityを起動して開発する

### Windows側

- IntelliJ IDEA Communityをインストール
- WSL2をインストール
- `C:\Users\ユーザー名` フォルダに、`.wslconfig`ファイルを作成する

```config:.wslconfig
[wsl2]
localhostForwarding=true
```

### WSL2側

- WSL2上にJDKをインストール

```sh
$ sudo apt update
$ sudo apt install openjdk-11-jdk

# JAVA_HOMEの設定（以下を .bashrcに追加する）
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

#確認
$ sudo update-alternatives --list java
/usr/lib/jvm/java-11-openjdk-amd64/bin/java

$ java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)

$ echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-amd64
```

[Intellij公式 WSL](https://pleiades.io/help/idea/how-to-use-wsl-development-environment-in-product.html#wsl-general)

## Spring initializrでプロジェクトを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88686/f38cf45b-8963-eb2b-be67-a8ed80bbc0f0.png)

- 上記で作成されたdemoフォルダを `\\wsl$\Ubuntu-20.04\home\ユーザ名`の下にコピー
    - Windowsでダウンロードすると、`Zone.Identifier`が付いたファイルが大量発生するので、以下のように、チェックを付けると解消する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88686/4e511298-8555-e46b-56e5-259805bd55a6.png)

- Project SDKの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88686/5140f6bb-b2bc-f177-0a0d-b09a04f9fd14.png)

- Gradleの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88686/0ec05f34-a40e-9c0b-23e3-742f65530fe3.png)

- Androidプラグインのチェックを外す。
    - ↓ 既知のバグ回避のため
    - https://blog.jetbrains.com/ja/2021/04/19/jetbrains-ide-2021-1/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88686/265f0919-a817-f3c2-2787-35112e747183.png)

- サンプルプログラムの作成

```java:DemoApplication.java
@SpringBootApplication
@RestController        // ← 追加
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	// ↓ 追加
	@GetMapping("/hello")
	public String getDemo() {
		return "Hello!";
	}
}
```

- WSL2側から動作確認

```sh
$ curl localhost:8080/hello
Hello!
```

- Windows側から動作確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88686/6dffee40-f6f3-820e-5e98-894f97993340.png)
【初心者】Adobe　illustratorとPhotoshop


#【初心者】Adobe　illustrator



はじめに簡単にAdobeのillustratorとPhotoshopの
１、得意分野の違い
２、扱う画像の違い
３、カラーモードについてを投稿させていただきます。




##１［illustratorとPhotoshopの得意分野］
illustrator　:　ロゴやレイアウトの作成を得意としています。
Photoshop　:　写真の加工や合成、イラストや描画を得意としています。
![スクリーンショット 2021-09-20 160819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813926/d2a0cdb9-1f9e-4cb7-483b-df02e3388341.png)


それぞれ得意・不得意があるので使い分けて作成していきましょう。





##２［ベクトル画像とビットマップ画像の違い］


illustratorはベクトル画像を取り扱うのが得意なソフトで、
Photoshopはビットマップ画像を取り扱うのが得意なソフトです。


<img width="220" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813926/43e04ec7-a879-0947-8e2f-888386cb5c99.png" />
↑ベクトル画像はどれだけ拡大してもぼやけません。
そのためくっきりと表示とさせたいロゴやレイアウトにピッタリです。


<img width="220" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813926/8d188184-77c0-305d-7fa0-e8e3d45359a2.png" />

↑ビットマップ画像とは無数の点の集まりで作られた画像です。
ビットマップ画像で作られたロゴの場合、拡大するとぼやけてしまいます。



##３［カラーモードについて］
最後にカラーモードについてです。


《illustratorのカラーモード》
illustratorで制作する場合
印刷物(物理的な出力)を作成する場合　:　CMYKカラーモード
Web用(ホームページ等のWebページ、映像等モニターに出力)を作成する場合　:　RGBカラーモードを選択します。
　　

《Photoshopのカラーモード》
Photoshopもillustrator同様カラーモードがあります。
基本的な概念は同じで、Photoshopでデジタル画像の編集する場合RGBカラーモード、印刷物を作成する場合CMYKカラーモードで作業するのが原則になります。
　

《注意》作成後RGB→CMYKカラーに変更するとCMYKカラーは色域が狭いのでRGBカラーの色味がうまく表現できずRGBカラーでせっかく素敵な色を表現しても台無しになってしまうので、基本的には印刷物用のドキュメント以外はCMYKカラーに変更はしないようにしましょう。
また、間違えない為にも作成する前にカラーモードの確認、設定をしておくのがオススメです！



##まとめ
illustrator　:　ロゴやレイアウトの作成
Photoshop　:　写真の加工や合成を得意としている。
カラーモードは、
印刷物(物理的な出力)を作成　:　CMYKカラーモード
Web用(ホームページ等のWebページ、映像等モニターに出力)を作成　:　RGBカラーモードを選択すること頭にいれて、illustratorとPhotoshopのいいところを上手に利用して楽しく作成していけたら嬉しいです！
Perl ことはじめ


# おまえだれ

エンジニア3年目
使ってきた言語は PHP、Go、JavaScript、TypeScript、Python辺り
好きなパスタはボロネーゼとカルボナーラ

# これはなに

Perlを勉強してみたくなった
新しい言語を勉強するときの手順、工数などをメモしておきたくなった

# まずPerlって

1987年公開の、動的型付け言語・スクリプト言語のパイオニア
コンパイルが不要で、テキスト処理に強い

>Perl（パール）とは、ラリー・ウォールによって開発されたプログラミング言語である。実用性と多様性を重視しており、C言語やsed、awk、シェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。ウェブ・アプリケーション、システム管理、テキスト処理などのプログラムを書くのに広く用いられている。

https://ja.wikipedia.org/wiki/Perl

真珠を意味するパール(pearl)とは綴りが異なる（知らなかった）

>Perlは当初、新約聖書のマタイによる福音書13章46節の「高価な真珠」にちなんで真珠を意味する「pearl」と名付けられた。ラリー・ウォールは肯定的な意味を持つ短い名前を選びたいと考えていて、彼によれば3文字および4文字の単語を辞書から探したが良いのが見つからなかったということである。

↓草

> また、彼は妻のグロリアにちなんで名前を付けることも考えたが、家族の会話でまぎらわしいために却下となった。


登場から数年の90年代には既にUNIXやLinuxには標準でインストールされており、**CGI（Common Gateway Interface）**の開発に広く利用された。

最も普及しているバージョンは、「Perl 5」であるが、最新バージョンは2015年にリリースされた「Perl 6」である。
しかし「Perl 6」は、それ以前のバージョンとは互換性のないため注意が必要。

# 開発者:ラリー・ウォールさん

**プログラマの三大美徳** を提唱した人

文筆家でもあるらしい
↓このあたりのセンス、素敵

〜プログラマの三大美徳〜

```
・ 怠惰（Laziness）
・ 短気（Impatience）
・ 傲慢（Hubris）
```

# Perlの特徴

- 動的型付け言語・スクリプト言語（短いプログラムを簡単に書ける）のパイオニア
- 同時主流だったシェルやC言語に似た文法
- 表現力・自由度が高い（いい意味で）
- 強力な文字列処理で、正規表現をサポート
- プログラムの実行に事前コンパイルが不要（当時は画期的だった）
- インタプリタ言語の中では処理が速い
- オブジェクト指向をサポート
- Linux/Unix環境にデフォルトでインストールされている

# 他の後発動的型付け言語 との違い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570466/fa0d8ec4-302f-3af0-5061-c569c1db9762.png)

https://trends.google.co.jp/trends/explore?date=2004-01-01%202021-09-20&q=%2Fm%2F06ff5,%2Fm%2F05zrn,%2Fm%2F060kv,%2Fm%2F05z1_

## Python

Perl先輩の4年後輩

### 保守性

- 「やり方はいくつもある」という理念のPerl
  - 開発者によってコードの品質が変わってしまうため、保守性は低い
- 一方で「やり方はいつも同じ」という理念のPython

### 教育的分野での活用

- Pythonは「書きやすく、誰が書いても同じようなコードになる」という観点から、海外の教育現場で普及している
- その結果、幅広い理系コミュニティで便利なライブラリが数多く作成され、今日における「科学計算や機械学習といえばPython」の地位を築いてる

## Ruby

Perl先輩の8年後輩

### オブジェクト指向

- 後付けオブジェクト指向のPerl
  - Perlがオブジェクト指向に対応するようになったのは1994年のバージョン5.0からで、後付け
  - そのためオブジェクト指向により最適とはいえない作りになっている...
- 一方でRubyは、最初から本格的なオブジェクト指向言語として作られた

### フレームワーク

- Perlには「Mojolicios」や「Dancer」などのフレームが存在するが、「Ruby on Rails」の登場でシェアを奪われた雰囲気がある

## PHP

同じくPerl先輩の8年後輩

### Web開発

CGIにおいて、Perlで書かれた実行コードはHTML本体に書かれているのではなく、処理の度に、毎回呼び出し処理が必要である
PHPは、その手間をなくすために、最初からHTML内に記載することができ、より動的なページ作成を作成することができる

### CMS

CMSにおいて、当初はPerl製のMovableTypeが人気を集めていたが、突然の有償化・後発で無償のWordPressの登場によって廃れてしまった

↓歴史的背景や多言語比較は下記記事が詳細で分かりやすかった🙌↓

https://qiita.com/raccy/items/81f936e324c4dde61d9f


# 環境構築

筆者の環境は`macOS`であるため、デフォルトでPerl5がインストールされており、環境構築の必要がなかった

# Hello Woldする

```bash
$ touch sample.pl
$ vi sample.pl
```

以下を記述

```perl
print "Hello, world!";
```

実行

```bash
$ perl script.pl
```

# あとは適当に

日本語サイトの中では、以下が良くまとまっている

https://perlzemi.com/

基本的な文法を色々触りながら学習を進めた

PHP、Python、Rubyなどを触った経験があればさほど抵抗なく学習が進められるであろうと思う

# 参考

https://ja.wikipedia.org/wiki/Perl

https://agency-star.co.jp/column/perl/

https://qiita.com/yaju/items/5502115d7e3d06e6bbdd

# 時間計測メモ

ここまで**1時間46分**⏰
新しく言語を習得する時間にしてはさほど工数が掛からなかったと思う
他の言語比較が面白く、少々寄り道が多かったかも
Array.fromの第1引数のarrayLikeって配列じゃなくてもいいのか

[オライリーの プログラミングTypeScript](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0TypeScript-%E2%80%95%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8BJavaScript%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Boris-Cherny/dp/4873119049) P.81に出てきた`Array.from`の以下のような使い方を見て、最初意味が分からなかったため、調べてみました。

```typescript
function fill(length: number, value: string): string[] {
  return Array.from({length}, () => value)
}
fill(3, 'a')
// -> [ 'a', 'a', 'a' ]
```

## Array.from について

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from

`Array.from`はMDNによると

> Array.from() メソッドは、配列のようなオブジェクトや反復可能オブジェクトから、浅くコピーされた新しい Array インスタンスを生成します。

で、以下のサンプルのような使い方をします。

```javascript
console.log(Array.from([1, 2, 3], x => x + x));
// expected output: Array [2, 4, 6]
```

引数の確認をしてみると、第1引数は以下のようになっています。

> arrayLike
配列に変換する配列のようなオブジェクトまたは反復可能オブジェクト

今回のケースを改めて見ても、`{length}`が「配列のようなオブジェクト」にも「反復可能オブジェクト」にも見えなかったため、なぜこれで動くのかが分かりませんでした。

## 型定義を見てみる

`Array.from`の型定義を見てみると、以下のように書かれていました。

```typescript:./node_modules/typescript/lib/lib.es2015.iterable.d.ts
interface ArrayConstructor {
    /**
     * Creates an array from an iterable object.
     * @param iterable An iterable object to convert to an array.
     */
    from<T>(iterable: Iterable<T> | ArrayLike<T>): T[];

    /**
     * Creates an array from an iterable object.
     * @param iterable An iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from<T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
}
```

`Iterable`ではなさそうなので、`ArrayLike`の定義を見てみます。

```typescript
interface ArrayLike<T> {
    readonly length: number;
    readonly [n: number]: T;
}
```

すると、上記のような2つのプロパティを持つオブジェクトをArrayLikeと判定しているようでした。
今回の例でいうと、以下のようにどちらの条件も満たしていることになり、`{length}`は`ArrayLike<T>`にマッチします。

```js
> const length = 3 // 仮で定義
// -> undefined

> {length}.length // `{length}` は `{length: length}`のようにプロパティ名と値の変数名が同じときに省略した記法
// -> 3

> {length}[0]
// -> undefined
```

もう少し書き方を変えてみると、以下のようなことをやっているイメージです。

```js
> {hoge: 'hoge'}.hoge
// -> 'hoge'

> {0: 'fuga', 1: undefined}[0]
// -> 'fuga'
> {0: 'fuga', 1: undefined}[1]
// -> undefined
> {0: 'fuga', 1: undefined}[2]
// -> undefined
```

このようなことができるのは、JavaScript、TypeScriptが「対象物は何という名前のものなのか」というよりも、「どう振る舞うのか」、「何ができるのか」という構造を重視しているからです。
そろそろHello Worldやめないか

# はじめに
本記事は初心者がHello Worldから学習を始めることを否定するものではありません。
プログラミング学習の本来の目的に立ち返って考えたとき、より本質に迫ったスタートの選択肢を提示するものです。

## 9/24追記
多くのコメントで指摘を頂き、以下の内容はコンパイル言語その他環境構築の手順が複雑な言語、或いは構文そのものが高度な言語においては不適である可能性を考慮していなかったことをここにお詫び訂正させていただきます。
以下の内容はPythonやJS等比較的優しいインタプリタ言語の想定で読んでいただくと真意が誤解少なく伝わるかと思いますのでご承知おきください。

# そもそもHello Worldとは
標準出力で「`Hello World!`」あるいは「`Hello (言語)`」と表示させることを目的としたもので、プログラミングの入門における課題中で最も簡単なものです。
例えばKotlinでは

```kotlin
println("Hello World!")
```

このHello World課題、プログラミング学習のスタートとしてはド定番です。
入門書の第1章、プログラミングスクールの1時限目、入門指南ブログの1ページ目、だいたいHello Worldです。

発祥は諸説ありますが、ブライアン・カーニハンの「A Tutorial Introduction to the Language B」(1973)が有力ではとされています。技術書由来なのは間違いなさそうですね。

# Hello Worldはなぜ悪い？
悪いとまでは言いませんが、はっきり言って**無駄**ではないかと思います。

皆さんはなんのためにプログラミングを学び始めましたか？
突き詰めればその目的は、プログラムに任せたほうが速い作業や**プログラムにしかできない作業をさせたいためではないでしょうか**。

プログラミングに限らず**学びを始めるときには学ぶ対象物の魅力を感じられるようなものでないといけません**。

最初に感じた魅力がモチベーションという起爆剤となって快調なスタートダッシュを切ることができるからです。

そんな大事な時期に、人間でもできる、何なら人間のほうが速くできるというような作業をプログラミングするというのは極めてナンセンスでしょう。

**「`Hello World!`出力できたぞー！ウォー！」**って起爆剤に出来るならいいですよ。
でも大体の人はもっと「プログラムならではの動き」を最初でも見たいはずです。違いますか？

# じゃあどうしろと
**FizzBuzz**良いと思います。
あれこそプログラミング課題のスタートダッシュにふさわしい。
> 1. 1から100までの数字を出力しなさい。
1. 出力される数字が3の倍数のときはその数字の代わりに「Fizz」、5の倍数のときは「Buzz」、どちらの倍数にもなる場合は「FizzBuzz」を出力しなさい。

というものです。
初見では題意を読み解くのに苦労するかもしれませんが、やることは単純です。

```
1
2
Fizz #3は3の倍数
4
Buzz #5は5の倍数
Fizz #6は3の倍数
7
...中略
13
14
FizzBuzz #15は3の倍数であり5の倍数
16
...
```

FizzBuzzの良さを見ていきましょう。
### FizzBuzzのここがいい: プログラミングならではの作業を見ることができる
人間が前述の課題を解決するには実直に1から100まで3で割り切れるか、5で割り切れるか調べて書いていく必要があります。
暗算が速くても書いていくのにはシンプルに時間がかかりますね。

こういった**「手順は決まりきっているけれど量が多い」作業こそ、プログラムの出番なのです**。
プログラムが活躍すべきところで活躍している姿を最も簡単に見る手段の一つがFizzBuzzです。

### FizzBuzzのここがいい: プログラミングの制御構造が入っている
リファクタリング抜きにした実直なFizzBuzzの実装は、

```kotlin
for(n in 1..100){
    if(n % 3==0){
        if(n % 5 ==0){
            println("FizzBuzz")
        }
        else{
            println("Fizz")
            }
    }else{
        if(n % 5==0){
            println("Buzz")
        }
        else{
            println(n)
            }
    }
}
```

あたりでしょうか。(こちらもKotlinでの実装です)
このプログラムの中には`for`ループと`if-else`分岐が入っていますね。
ループと分岐はプログラムの三大制御構造**「順列、反復、分岐」**の2つを占めており、この概念を把握することはその後の学習の効率に大きな好影響を与えます。

### FizzBuzzのここがいい: Hello Worldの上位互換
言うまでもなくFizzBuzzの結果を出す方法は標準出力です。
Hello Worldの課題も同時に満たすことができます。

### FizzBuzzは初心者には難しい？
まあHello Worldに比べりゃ難しいでしょう。

しかしプログラミングで一番重要で一番難しいのはロジックの構築と実装方法の模索です。
構文はググればいくらでも出てきますから、エディタとブラウザの往復作業です。

**ロジックを組む過程を身を以て体験すること、そしてコードを書くときに調べる力を会得すること**こそがプログラミング教育の入門に期待される重要な要素ではないでしょうか。


# 結論
**本当にHello Worldにワクワクできますか？**
**本当にHello Worldは身になりますか？**
axiosのメソッド


# axios get postメソッドについて

開発環境
windows10 home
Ruby 2.6.3
Ruby on Rails 5.2.6
vue.js 2.6.14

## axiosとは
ブラウザや node.js で動く Promise ベースの HTTP クライアントである｡

インストール

```
yarn add axios
```

Vueファイルにインポート

```
 import axios from 'axios';
```
## getメソッド
```js
import axios from 'axios';

 methods: {
    setMemo: function () {
     // axios.HTTP動詞('url')
      axios.get('/api/memos')
     // .then()で通信が成功した際の処理を書く。
      .then(response => (
     // Axiosで呼び出したAPIの情報をmemosに代入
        this.memos = response.data
     ))
   }
 }
```
axiosの HTTP動詞 や url はルーティングで確認。

```routes.rb
api_memos GET /api/memos(.:format) api/memos#index {:format=>/json/}
```

## postメソッド

```js
 addMemo: function() {
  // axios.HTTP動詞('url')
    axios.post('/api/memos', {
  // 第二引数に送りたいデータを記載
       title: this.title,
       description: this.description
    })
  // .then()で通信が成功した際の処理を書く。
    .then(response => (
      this.setMemo()
    ));
 }
```

Google Chromeの拡張機能に[Talend API Tester](https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ja)があるので、
簡易的にデータが送信できているか確認することができます。
以上、axiosのメソッドについての記事でした。