OmniAICreator/Qiita-1.07M huggingface dataset:
【Xdebug】Xampp+Laravel7 or Laravel9+Windowsでデバッグ実行


:::note info
2023/02/08更新
Laravel9+Xampp+PHP8.1に対応しました(Sail未使用パターン)
旧Laravel7での導入方法も残しています。
:::

# 環境
・Windows10 x64
・VSCode
・Laravel7 (PHP 7.4.7)
・Laravel9 (PHP 8.1.12)


# Xdebugインストールと設定
#### ①VSCODEでPHP Debugをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/a2e6f08c-724a-9bc2-ce07-a1ba3598d2e0.png)

#### ②php.iniの最下部に下記を追記

**PHP7.4系 (Laravel7)**
```ini:C&#58;\xampp\php.ini
zend_extension = "C:\xampp\php\ext\php_xdebug.dll"
[XDebug]
xdebug.remote_autostart = 1
xdebug.profiler_append = 0
xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = "c:\xampp\tmp"
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
xdebug.remote_log="c:\xampp\tmp\xdebug.txt"
xdebug.remote_port = 9000
xdebug.trace_output_dir = "c:\xampp\tmp"
xdebug.remote_cookie_expire_time = 36000
```

**PHP8.1系 (Laravel9)**
```
[XDebug]
xdebug.idekey=VSCODE
xdebug.client_host=localhost
xdebug.client_port=9000
xdebug.mode=debug
xdebug.start_with_request=1
zend_extension = C:\xampp\php\ext\php_xdebug.dll
```

#### ③「上部メニュー→実行→構成を追加」からlaunch.jsonを下記を上書き

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
        }
    ]
}
```

#### ④php_xdebug.dllをダウンロードして配置

```
C:\xampp\php\ext\php_xdebug.dll
```
上記パスのファイルがあるか確認し、存在しない場合はダウンロードしてくる必要があります。
※XamppのPHP8.1系には含まれていなかったので注意

[こちらのリンク](https://xdebug.org/download)から公式を開きます。

![スクリーンショット 2023-02-28 11.13.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/04ada989-3750-131a-5db9-bd0098de60cb.png)

上記の様にいくつかダウンロード可能な候補が出ますが、TSと書かれておりPHPのバージョンが同じものを選択してダウンロードしてください。
今回はLaravel9 (PHP 8.1系 Xampp)だったのでPHP8.1 VS16 TS(64bit)をダウンロードしました。

ダウンロードしたら、ファイル名を「php_xdebug.dll」に変更してC:\xampp\php\ext\に配置し、
C:\xampp\php\ext\php_xdebug.dllのパスが通る様にします。


# デバッグ実行してみる

※既にphp artisan serveで動かしている場合、一旦終了させて再度起動させる必要があります

#### ①左メニュー→デバッグ(再生アイコンに虫が乗っているアイコン)を選択して、構成が「Listen for Xdebug」が選択されているのを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/471e793c-8442-3786-c6ed-494a24378642.png)
#### ②あとはブレークポイントを仕掛けて「F5」でデバッグ実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/8e576417-fcb1-4874-41b5-1df4135244e9.png)
Java覚え書き


java

Oracleから対象のJDKインストーラをダウンロード
2019/4/19からダウンロードにアカウントらしきものが必要になった。
めんどい、プロファイルは作ったら削除するには18か月一切いじらず個人情報を消されるのを待つか、自分で問い合わせフォームから削除依頼をしなくてはならない、めんどい

インストール後環境変数の指定をする
こういうの（プログラム関係）は、PCのシステムにインストールしてあることを教えなくてはならない、それをする（じゃあ果たしてこれはインストールといえるのか？）

検索で「システム環境変数の編集」より編集する。
（コントロールパネル→システム→システムの詳細設定）

システム環境変数
変数名	JAVA_HOME
値	C:\~~\Java\jdk1.8.0_261

変数名「Path」の値に
%JAVA_HOME%\bin
を追加

とりあえずこれで定番の
Hello_World
はできるはず、メモ帳かなんかで

```java:Hallo_World.java
public class Hallo_World{
    public static void main(String[] args){
        System.out.println("Hello World");
    }
}
```
を保存して、
コマンドプロンプト上で

```
D:\ダウンロード\University\java>javac Hallo_World.java

D:\ダウンロード\University\java>java Hallo_World
Hello World

D:\ダウンロード\University\java>
```

とりあえずこれでJavaが使えるようになったぜ。


いちいちコンパイル時や実行時にjarファイル指定するのがめんどいから
CLASSPATHを設定するといちいち書かなくて済むらしい。
これはユーザー環境変数でもいいらしい。（まぁこのパソコン使うの私だけだし関係ないか）

ユーザー環境変数
　

| 変数名 |→ | CLASSPATH |
|:-----------|------------:|:------------:|
| 変数値 |→| .;C:\OpenCV\opencv\build\java\opencv-440.jar |

初めて設定するときは変数値の「.;」を忘れずに、
あくまでコマンドラインで実行するときの話、統合開発環境で必要かは知らない。
[UE4] PluginのC++をビルドしてバイナリ化する

# 手順

- .uprojectファイルから、.slnファイルを生成する
    - エラーが出るなら、C++ファイルをUEで生成してからUEを閉じる
- .slnファイルをVisual Studioで開く
    - [プラグイン名]をビルドを選択
        - C1853のエラーが出たら、リビルドを選択する
        

これで完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/fa23e305-962b-1d85-5ddf-ee4214c9bd98.png)
初心者がAndroidアプリを作ってみる　～プロジェクトの作成～

#**初めに**

Androidアプリの自己学習として、シリーズ化を目指しています。
過去の記事を記載しておきますので、
Androidアプリは作ったことがないよ！
という方がいれば、前回の記事から見ていただければ幸いです。

リンク
・[初心者がAndroidアプリを作ってみる　～開発に必要なツールの設定～](https://qiita.com/t-namba/items/e9272635e9e85f25438d)

#**使用端末**
前回記事で書きましたが、
元々メモリ4GのPCをにて本取り組みを始めました！
結果としてですが、ちょっと4Gじゃ無理でしたね。。。
動きません…！…！

というわけで、端末を変更したので改めて記載しておきます。

　**OS：Microsoft Windows 10**
　**メモリ：16G**



#**プロジェクトを作成する**
プロジェクトとは、アプリを作るために必要なファイルやフォルダを
まとめて管理するためのフォルダのことです。

早速、Android Studioを使用して
プロジェクトを作成していきます。



Android Studioを起動し、
[＋新規 Android Studio プロジェクトの開始]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530030/31c7ee46-1385-9089-98a2-37d3cac43dc9.png)

[空のアクティビティー]を選択し[次へ]を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530030/b2d629e4-1eec-f73d-01fd-ada56da0c2eb.png)

それぞれ、
名前：[MyFirstApp]と入力
言語：[java]を選択
　　　※近年の主流は[Kotlin]になります。ここでは一旦[java]で進めます
最小SDK：ここでは[API 25:Android 7.1.1(Nougat)]を選択
　　　　　※PlayストアでAppを検索した際、ここで選択したバージョン以降の端末のみヒットします

下記のような入力内容になったことを確認し、完了を押下します。

|項目名|値|
|:--|:--|
|アプリケーション名|MyFirstApp|
|パッケージ名|com.example.myfirstapp|
|プロジェクトの場所|C:\Users\＜ユーザ名＞\AndroidStudioProjects\MyFirstApp|
|言語|java|
|最小SDK|API 25:Android 7.1.1(Nougat)|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530030/f6b85b30-3ef8-93b2-fdb4-b47738ad4560.png)

下記のような画面が立ち上がるまで、暫く待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530030/51a0104e-d2b1-ae22-6b56-2f3ec32870a1.png)

以上でプロジェクトの作成は完了です。

#**すでにプロジェクトを開いている場合**
上記は、プロジェクトをまだ開いていない場合の操作となります。

すでにプロジェクトを開いている時に
新たにプロジェクトを作成する場合は、
[ファイル] > [新規] > [新規プロジェクト] を選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530030/ba255375-65bc-dc0a-7314-cc1b0194efd9.png)


#**ファイルやフォルダについて**
作成したプロジェクトにあるファルダやファイルについて
簡単に記載しておきます。

最初は、画面の左側にappとGradle Scriptというフォルダが
表示されているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530030/625de9ea-8437-6210-1614-224b9ed0f2c0.png)

プルダウンを開くと、中にあるファイルやフォルダを見られるようになります。
これらは実在するフォルダというわけではなく
役割ごとに見やすくするためにカテゴリー分けしたものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530030/d11d01c3-5d76-8aed-1cdd-532eff4df73b.png)

appフォルダには、Javaファイルや画像など、
ストアから配布されるアプリのファイルに埋め込まれるものが入っています。

|フォルダ名|役割|
|:--|:--|
|manifests|インストール先のAndroidに対してアプリの概要を説明するためのAndroidManifest.xmlファイルを管理する|
|Java|Javaファイルを管理する|
|res|画像ファイル、音声ファイルレイアウトファイルといった、アプリで使用するファイルを管理する|


Gradle Scriptフォルダには、appフォルダに入っているファイル群を
APKファイルの形に組み上げるために必要な各種設定ファイルが入っています。
不用意に消さないように注意してください。

#**次回予告**
次回、アプリを起動します！

...ちょっとペース配分をミスりました。
一発目の記事でアプリを起動するところまで書くべきでした。
もう開き直って、刻んでいきます。。。
rails csv ファイル読み込み トライ


[【Ruby on Rails】CSVインポート](https://qiita.com/seitarooodayo/items/c9d6955a12ca0b1fd1d4)
[Rails上で、CSVファイルを読み込んでみた]
(https://qiita.com/m-shin1/items/7e8cdea2644e47b87fbf)
[【Rails】CSVファイルからデータをインポート]
(https://qiita.com/d0ne1s/items/d49423796dd1c801afd3)

これを参考にトライ

結果その通りにやったらできました。
(投稿者様、ありがとうございます)

だが、rubyの文法でつまづく。
だれかわかる方いらっしゃたら助けていただけるとありがたいです。

```app/controllers/users_controller.rb
def index
    @users = User.all
  end

  def import
    # fileはtmpに自動で一時保存される
    User.import(params[:file])
    redirect_to users_url
  end
```

このimportコントローラーUser.importのimportメソッドは、user Modelを操作するために、下記で、クラスメソッドとして定義されている、importメソッドであることはわかった。

```app/model/user.rb
class User < ApplicationRecord
  def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
      # IDが見つかれば、レコードを呼び出し、見つかれなければ、新しく作成
      user = find_by(id: row["id"]) || new
      # CSVからデータを取得し、設定する
      user.attributes = row.to_hash.slice(*updatable_attributes)
      # 保存する
      user.save
    end
  end

  # 更新を許可するカラムを定義
  def self.updatable_attributes
    ["id", "name", "age"]
  end
end
```

まず、
```
user = find_by(id: row["id"]) || new
```
でつまづいた。
調べると、
https://www.sejuku.net/blog/19044
nil判定を行っていることは理解
find_by(id: row["id"])がnilなら newをuserに代入している。

でも "new"とはなんだろう、インスタンスか？
公式document
https://docs.ruby-lang.org/ja/latest/class/CSV=3a=3aRow.html
をみると、
CSV::Rowクラスの、newメソッドなのではないかと予想
であれば、
row.newを省略して書いている？？

もう一個
```
row.to_hash.slice(*updatable_attributes)
```
がわからない。

rowは、csvの特定の行
それをto_hashでハッシュにしている
sliceで ["id", "name", "age"]のみ取扱たいが、
to_hashメソッドではを使うと、["id", "name", "age"]がハッシュのキー(あるいは値)として使われるのだろうか？
https://docs.ruby-lang.org/ja/latest/class/CSV=3a=3aRow.htm

謎は深まる。

あと、*updatable_attributes
引数にアスタリスク付きのメソッドを指定している記法がわからない。
HushMeをUbuntuにつないだらオーディオ設定がぶっ壊れたので直した

# HushMe
https://www.gethushme.com

# マシン
[system76 Lemur Pro](https://system76.com/laptops/lemur)

# 手順
いろいろ試して、これで解決した

```
sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX=snd_hda_intel.model=headset-mode-no-hp-mic

# if it's System76 machine
sudo apt install --reinstall system76-driver
mv ~/.config/pulse ~/.config/pulse.old

sudo reboot
```

System76のサポートチケットを起票して解決しました。
HushMe, 壊しやがってこのやろう。
System76のサポートチームのみなさん、ありがとう。
Rubyで段落を作る

Rubyで段落を作るには、文字の後に\nをつける必要があります。

バックスラッシュ\の出し方はオプションキーと￥を押せば簡単に出すことが出来ます:ok_hand:

おはよう\nこんにちは\nこんばんは\n

と記載すると...

下のように簡単に縦に文字を並べることができました。



おはよう
こんにちは
こんばんは
Active Storage を使用した画像アップロード方法をまとめてみる。

# Active Storage とは…？
Active Storage とは、Ruby on Rails Ver.5.2 から実装されたファイルのアップロードをするための機能です。
Active Storage を使用することで、ローカルストレージへのファイルの保存はもちろん、Amazon S3，Google Cloud Storage，Microsoft Azure Storage といったクラウドストレージへのファイルのアップロードも簡単にすることができます。
これまでは、Carrierwave 等の Gem を利用してしていましたが、これからは Gem を使わずに Ruby on Rails の１つの機能としてファイルアップロード機能ができちゃうんです！

# Active Storage をアプリケーションにインストールする。
1. Active Storage をアプリケーションで使えるようにインストールするために以下のコマンドを入力します。

```Ruby:ターミナル
$ rails active_storage:install
```

1. Active Storage が使用するテーブルをマイグレーションして作成します。

```Ruby:ターミナル
$ rails db:migrate
```

- このコマンドによって、`active_storage_blobs` と `active_storage_attachments` というテーブルが作成されます。  
`active_storage_blobs` がアップロードしたファイルの情報を記録しているテーブル。`active_storage_attachments` はアプリケーションの該当するモデルと `active_storage_blobs` を繋ぐ中間テーブルです。

# ファイルをアップロードするモデルを作成する。

1. ファイルをアップロードするモデルを作成します。

```Ruby:ターミナル
$rails g model モデル名
```

1. モデルと Active Storage が使用するテーブルとをアソシエーション（関連付け）します。

```Ruby:app/models/モデル名.rb
class モデル名 < ApplicationRecord
  has_one_attached :image
    # アップロードするファイルが 1枚のときは `has_one_attached` とします。
    # `:image` はビューファイルにてフォームヘルパーで指定するカラム名に応じて適宜 変更して下さい。

  has_many_attached :images
    # アップロードするファイルが 複数枚のときは `has_many_attached` とします。
    # `:images` はビューファイルにてフォームヘルパーで指定するカラム名に応じて適宜 変更して下さい。
end
```

1. フォームから送信されたパラメータをストロングパラメータでテーブルへの保存を許可します。

```Ruby:app/controllers/●●●_controller.rb
class ● ● ● Controller < ApplicationController
  private
    def ○ ○ ○
      params.require(:モデル名).permit(:カラム名, :image)
        # アップロードするファイルが 1枚のときの記述です。
      params.require(:モデル名).permit(:カラム名, :images: [])
        # アップロードするファイルが複数枚のときはカラム名を空の配列にしておきます。
    end
end
```

**【重要】** 上述の説明で `:image`，`:images` としているカラム名ですが、アプリケーションのモデルには `:image`，`:images` といったカラムは作成しません。
ビューファイルのフォームから `<%= form.file_field :image %>` 等でファイルを送信してあげると自動的に `active_storage_blobs` に保存されて、`active_storage_attachments` により該当するモデルと関連付けられます。
これが Active Storage の便利なところであり、ちょっと厄介なところですね。

# Active Storage を使用してアップロードしたファイルの保存先を設定する。

1. `config/environments/` ディレクトリにある `production.rb （本番環境用）` `development.rb （開発環境用）` `test.rb （テスト環境用）` の各ファイル内の `config.active_storage.service` の設定を変更します。

```Ruby:config/environments/production.rb，development.rb，test.rb
config.active_storage.service = : ○ ○ ○
  # 設定したい保存先に合わせて `:local （ローカル環境）` `:amazon （Amazon S3）` `:google （Google Cloud Storage）` `:microsoft （Microsoft Azure Storage）` と記述します。
```
ウェブサイトでお洒落なフォントを使おう！

#この記事の対象読者
・最近CSSの勉強を始めた人
・自分のサイトをもっとカッコ良くしたい人
・フォントを変えて見たいけど方法がいまいち分からない人
#新しフォントを探そう！！
ネット上では色々なフォントが公開されていますが、初心者が手っ取り早くかっこいい**フォント**に変えるなら[google fonts](https://fonts.google.com/)がお勧めです。なので今回はgoogle fontsを使ってフォントの見た目を変えて見ましょう。そうれでは始めにこちらの[サイト](https://fonts.google.com/)に飛んで見てください。![スクリーンショット 2020-08-19 23.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/db909629-8169-2a0b-5fe0-7af2842e135a.png)
そうすると上の画像の様なサイトに飛ぶはずです。次に今回は日本語のフォントを使いたいので**Language**の所からJapaneseを選択して見て下さい。![スクリーンショット 2020-08-19 23.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/5de36c4a-3076-d1be-ea4a-9ac7542c8d76.png)
すると次はこの様な感じで日本語のフォントが色々表示されると思うので、自分の好きなfontを選んで下さい。次に気に入ったフォントをクリックして下さい。![スクリーンショット 2020-08-19 23.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/473a8ab8-c13f-12d9-e111-509e000ddaaa.png)
次に**Select this style**をクリックすると右にウインドウの様な物が出て来るので最後に**Embed**をクリックすると上の画像の様なサイトが表示されます。上に表示されている**<link>**と言うやつをheadに追加してcssで右下にある様に書くとフォントが設定されるらしいです。
#実際にやって見よう
ここまでフォントを探してウェブサイトで表示する手順を紹介してきましたが、このままではよく分からないので実際に作って確かめでいきます。※今回はフォントがどんな感じで表示されるかを確認する事が目的なので、著作権が無さそうな憲法を文章として利用します。
#HTMLとCSSの下準備
まずは適当にfinderなどで**fonts-test**と適当な名前を付けたフォルダーを作成して、Bracketsを開いき新規作成で**index.htmlとstyle.css**と言う二つのファイルを先ほど作ったフォルダーに保存します。最後にindex.htmlのファイルに**!**を入力してからtobキーを押すと下の様なコードが出てきます。

```html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
</body>
</html>

```
最後にlangをenからjaに変更して、<head>の所にcssのリンクをつけたら下準備は完了です。


```html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```
#実際にfontを変えてみる
ようやく下準備が終わったので、あの有名な憲法９条をググって取り敢えず<body>内に文章貼り付けて大まかにタグと先ほど調べたfontのlinkを<head>に貼り付けて置きます。最後に今回新しくフォントを作りたい場所にclassを割り振ります。

```html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <link href="https://fonts.googleapis.com/css2?family=Sawarabi+Mincho&display=swap" rel="stylesheet">
    <title>Document</title>
</head>

<body>
    <h1>第２章　戦争の放棄</h1>

    <p>〔戦争の放棄と戦力及び交戦権の否認〕</p>
    <h2>第９条</h2>
    <ol>
        <li>日本国民は、正義と秩序を基調とする国際平和を誠実に希求し、 国権の発動たる戦争と、武力による威嚇又は武力の行使は、国際紛争を解決する手段としては、永久にこれを放棄する。(MS ゴシック)</li>
        <li class="Sawarabi Mincho">前項の目的を達するため、陸海空軍その他の戦力は、これを保持しない。国の交戦権は、これを認めない。(さわらびフォント)</li>
    </ol>
</body>

</html>
```
次にcssです。

```css
body {
    font-size: 20px;
/*    フォントを大きくした方がフォントの違いが分かり易いを分かりやするする為のcss*/
}
.font {
    font-family: 'Sawarabi Mincho', sans-serif;
/*    fontクラスのフォントを新しいフォントに変える為のcss*/
}
```
![スクリーンショット 2020-08-20 0.40.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/21254b13-a457-04f9-4fc9-a07835b0b213.png)
実際に出来たサイトを見ると下の文の方がちょっとお洒落だと言う事が分かると思います。
#終わりに
最後まで記事を読んでくれてありがとうございました。まだ初心者なのでいたらいない点や憲法に著作権があるのか、コメントで教えてくれたら幸いです。

参考にしたwebサイト
[google fonts](https://fonts.google.com/)
[よく分からないサイト](http://www.sip.or.jp/~kokemomo/file/9.html)
TypeScript入門1 TypeScriptの説明と環境構築

[こちら](https://yk0807.com/techblog/2020/08/19/typescript%e5%85%a5%e9%96%80%e3%81%9d%e3%81%ae1/)のブログ記事をQiitaに投稿したものです。

#1 AltJSとは
Webプログラミングのサーバー側言語はPHP、Java、Python、Ruby、・・・とたくさんありますが、フロントエンド側の言語となると、ほぼJavaScript一択。しかしJavaScriptにも下記のような問題点があったりします。
・型付けが自由すぎてそれに由来する想定外の問題が起きやすい（**例えば1=="1"がtrueになったり**）
・オブジェクト指向が独特（プロトタイプベース）
・スコープを絞りにくい
そこで、最近ではこう行った問題を解決するために、より実装しやすいプログラミング言語（**AltJS**と言います）で実装してJavaScriptに変換するというのが流行りになりつつあります。

というわけで、これから何回かに渡って代表的な AltJSの1つである**TypeScript**について紹介していこうと思います。

#2 TypeScriptの特徴
TypeScriptは2012年にマイクロソフトによって開発された言語で、下記の特徴を持っています。
・JavaScriptのスーパーセットである（JavaScriptの機能はTypeScriptでも使える）
・静的型付けの言語である（数値型の変数に文字列を代入したりするとエラーになる）
・クラスやインターフェースなど一般的なオブジェクト指向の機能を持っている（クラスについてはJavaScriptでもES6から使えるようになりましたが）

#3 TypeScriptの環境構築
まず前提として、npmが使える環境であるとします。とりあえず、Windowsならコマンドプロンプトで、MacならiTerm2で

```
npm -v
```
と打ってみて、バージョンが出てくればOKです。入っていない人は[こちら](https://qiita.com/mk185/items/7ad004bf202f400daea1)を参考にしてNode.jsとnpmをして下さい。

次に、TypeScriptをインストールします。

```
npm install -g typescript
```
インストールし終わったら、とりあえず下記の内容をコピーして、.tsを拡張子につけたファイル名（例えばhello.ts）で保存して下さい。

```TypeScript
class Hello {
  public name: string;
  constructor(name: string) {
    this.name = name;
  }
}

let user = new Hello("World");
console.log("Hello " + user.name);
```

そしたら、

```
tsc hello.ts
```
で保存したファイルをコンパイルすればhello.jsというJavaScriptのファイルができているはずです。
後は、HTMLに埋め込んでブラウザで開けば、検証ツールで"Hello World"と出力されることが確認できますし、node hello.jsでターミナル上で出力を確認してもいいでしょう。

次回はTypeScriptで使えるデータ型などについて説明しようと思います。
シェルの種類

Linuxではさまざまなシェルを使うことができる。どのシェルも、`カーネルとユーザの橋渡しをする`という点で違いはない。

しかし、開発された時代や作者の考え方によって、それぞれのシェルの特徴も違ってくる。

代表的なシェルを以下にて紹介する。

#sh

- Bシェル(開発者の名前の「Bourne」が由来)と呼ばれていて、もっとも古くから存在するシェルである。

- Linuxに限らず、FreeBSDやSolaris、HPUXやAIXなど、多くのOSで利用できる。

- 古いシェルであるため機能が少なく、特に対話的に使うには不便であるため、ログインシェルとして使われることは現在ではほとんどない。

#csh

- Cシェルと呼ばれていて、C言語に似た構文を持っている。

- 現在はcsh後継のtcshがあるため、ほとんど使われることはない。

#bash

- shを基本として、機能を拡張したシェルである。

- 対話型操作を行う上で十分な機能を持ち、多くのLinux環境でデフォルトのログインシェルとして使われている。

#tcsh

- cshの後継として開発された、Cシェル系のシェルである。

- cshと同じく、シェルスクリプトを書くには向いていない。

#zsh

- 比較的新しいシェルで、bashやtcshを初めとした他のシェルの機能を積極的に取り込み、さらに独自の拡張を加えたシェルである。

- 非常に多くの機能を持っていて、初心者向けではない。
[UE4] Unity出身でもわかる、BluePrintでREST APIを簡単にたたく方法 

# ゴール

住所取得のAPIをたたいた結果が表示をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/1aadffbe-37e0-8777-1983-eca909cb3775.png)

# 前提

- Unreal Engine4.24
- [VaRest](https://www.notion.so/VaRest-UE4-Plugin-40b98c54fc184033b60a42e0e4753536)
    - MarketPlaceからダウンロードできます。
- [郵便番号検索API zipcloud](http://zipcloud.ibsnet.co.jp/doc/api)
    - `https://zipcloud.ibsnet.co.jp/api/search?zipcode=1500001`
    - このAPIをたたくと以下の結果が返ってくる

```
{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "渋谷区",
			"address3": "神宮前",
			"kana1": "ﾄｳｷｮｳﾄ",
			"kana2": "ｼﾌﾞﾔｸ",
			"kana3": "ｼﾞﾝｸﾞｳﾏｴ",
			"prefcode": "13",
			"zipcode": "1500001"
		}
	],
	"status": 200
}
```

# 手順

- VaRestのインストール
    - Pluginを有効にする
- BluePrintに書く

# VaRestのインストール

UnityからUE4に入った人向けに、マーケットプレイスからのインストールの仕方を書きます。
ちなみにマーケットプレイスとはUnityでいうAssetStoreです。
まず、UE4ではなく、EpicGamesLauncherを開きます。

そこから、マーケットプレイスを選択し、Varestで検索をします。すると現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/70b8b909-8cd7-0e63-0e50-16936c3154fb.png)

エンジンにインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/b1e80080-536b-b297-d678-12ca06e90899.png)

一応こちらも確認しておきましょう。ライブラリの下の方にダウンロード済みのアセットが並んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/f6106bfb-72f5-5d2f-0d86-903a57147896.png)

不安であればダウンロード先のフォルダを確認しましょう。

`C:\Program Files\Epic Games\UE_4.24\Engine\Plugins\Marketplace` 私の例ですが、以下にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/5f498647-afa9-ee6a-296e-167770ed5b26.png)

## Pluginを有効化
メニューの[Edit]>[Plugin]を選択し、VaRestのEnabledにチェック入れる。その後再起動。、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/af990d14-5e37-ad2b-fc9a-5c2850fc85d0.png)

# BluePrintに書いていく

BluePrintをBPと略す

## 最終BP

レベルブループリントに書きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/1d6ea2db-f4e5-8c4d-104d-763169aa48a6.png)

## レベルブループリントを開く

レベル (Unityでいうシーン) に付随したBluePrint (UnityでいうノンコードのScript) をレベルブループリントといいます。今回はここを使いたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/63749885-1462-26b7-d8ab-d13d30483861.png)

## APIを呼ぶところを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/2573ce91-f35c-ad55-f714-52f68deb4edd.png)

## レスポンスの取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96970/89b949e4-f81e-07b2-ba6b-4720c19b6b59.png)
pg_configとかビルドとかwheelとかよくわからないけどMacにpsycopg2を入れたい


DjangoでPostgreSQLを使用したいなと思い、
普通にpip install psycopg2でインストールしたいなと思った時に、
いろいろ詰まって調べていた中に体系的な情報が少なかったので、
備忘録的に書き溜めておきます。

macOS Catalina 10.15.6
Python 3.8.5
pip 20.1.1


普通にpip installした時に、長文の赤い文字のエラー文が吐き出されてこちらまで吐血しそうだったのですが、エラー文を掻い摘んで見てみると。

```
Using cached psycopg2-2.8.5.tar.gz (380 kB)
Building wheels for collected packages: psycopg2
Building wheel for psycopg2 (setup.py) ... error
```



wheelのBuilding？？ナンノコッチャ？？
とりあえずsetuptoolsとwheelというのをインストールしてみる。



```
% pip install --upgrade pip setuptools wheel

Requirement already up-to-date: pip in ./myenv/lib/python3.8/site-packages (20.2.2)
Collecting setuptools
  Using cached setuptools-49.6.0-py3-none-any.whl (803 kB)
Requirement already up-to-date: wheel in ./myenv/lib/python3.8/site-packages (0.35.1)
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 47.1.0
    Uninstalling setuptools-47.1.0:
      Successfully uninstalled setuptools-47.1.0
Successfully installed setuptools-49.6.0
```

結果は変わらなかった。
もっとよく見てみるとこんな親切なドキュメントを見つけた。

```
It appears you are missing some prerequisite to build the package from source.
    
    You may install a binary package by installing 'psycopg2-binary' from PyPI.
    If you want to install psycopg2 from source, please install the packages
    required for the build and try again.
    
    For further information please check the 'doc/src/install.rst' file (also at
    <https://www.psycopg.org/docs/install.html>).
```
「アンタの場合、psycopg2-binaryというのをPyPIからとったきた方がいんじゃない？
でもどうしてもpsycopg2をインストールしたいんなら、ビルドに必要なパッケージをインストールしてやりなおしてみたら？？」とのこと。


親切にURLも貼ってくれているので見に行ってみることに。
https://www.psycopg.org/docs/install.html


>psycopg2PyPIでは、最も一般的なプラットフォーム（Linux、OSX、Windows）のホイールパッケージの形式でも利用できます。これにより、上記のビルドまたはランタイムの前提条件を必要とせずに、モジュールのバイナリバージョンをインストールできるようになります。

psycopg2-binaryでいけそう。

```
 % pip install psycopg2-binary

Collecting psycopg2-binary
  Downloading psycopg2_binary-2.8.5-cp38-cp38-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl (1.5 MB)
     |████████████████████████████████| 1.5 MB 5.8 MB/s 
Installing collected packages: psycopg2-binary
Successfully installed psycopg2-binary-2.8.5
```

おっいけた！
importしてみよう！

```
>>> import psycopg2
>>> 
```

やったぜ！！
もう迷わないGitアカウントを会社用・個人用で分ける方法

気付いたら会社のGithubアカウントには草が生えまくっているのに、私用のアカウントには草木もないようなことがあると思います。

わたしがそうでした。

globalには**個人のアカウント**、localには**会社のアカウント**というように
Gitアカウントを使い分けることができたので作業内容をメモとして残します。


## 会社用アカウントの設定ファイルの作成

```:/
// ルートディレクトリに作成
~ $ touch .gitconfig_company_name
```

```:/
~ $ vi .gitconfig_company_name
```

以下の内容をファイルに書き込みます。


```bash:.gitconfig_company_name
[user]
  name = company_username
  email = company@xxx.com
```

## .gitconfigファイルの設定
共通の設定ファイルを開く。

```:/
~ $ git config --global -e
```

`.gitconfig` は大体以下のようなことが記載されているかと思います。
私の場合、SourceTreeを使っていたので、`[difftool "sourcetree"]`や `[mergetool "sourcetree"]` などがありました。
ポイントとしては **[includeIf "gitdir:~/iOS/SomeCompany/"]を[user]の下に配置**することです。
特定のディレクトリ以下の時には **[user]** を上書きするイメージです。

```bash:.gitconfig
[user]
	name = private_name
	email = private@gmail.com

# 追加 ここから -----
[includeIf "gitdir:~/iOS/SomeCompany/"] # SomeCompany以下のディレクトリが先ほど設定したアカウントに適用されます。
  path = ~/.gitconfig_company_name # .gitconfig_company_nameがある場所。
# 追加 ここまで -----

[commit]
	template = /Users/{username}/.stCommitMsg

[core]
 excludesfile = /Users/{username}/.gitignore_global
```

`gitdir:`は会社のリポジトリを配下に入れるディレクトリです。

## 設定されているか確認

```:/
$ git config user.name 
```

グローバルなので`private_name`が出力される。

```:~/iOS/SomeCompany/SomeProject
$ git config user.name
```

`company_username`が出力されたら成功。

## 完成

root/
　├ iOS/ 
　│　└ SomeCompany/ # SomeCompany以下は会社のアカウントになりました🥰
　│　　└ SomeProject1/
　│　　└ SomeProject2/
　└ hoge/





## 参考
- [Gitでリポジトリ毎に異なるアカウントを使う | AABrain](https://aakira.app/blog/2018/07/gitconfig/)
- [gitアカウントを作業フォルダによって自動で変更できるようにする – ajike developer's blog – UXデザイン会社アジケの開発者ブログ](https://ajike.github.io/Git%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%A5%AD%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%A4%89%E6%9B%B4%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/)
ITILファンデーション(ITIL4エディション)の資格の勉強を始めた6

#技術的マネジメントプラクティス
##展開管理
###展開の種類
- 段階的展開
- 継続的提供
- ビッグバン展開
- プル展開

##インフラストラクチャおよびプラットフォーム管理
###クラウドサービスモデル
- Saas
- Paas
- Iaas

###クラウドサービス展開モデル
- プライベートクラウド
- パブリッククラウド
- コミュニティクラウド
- ハイブリッドクラウド

##ソフトウェア開発および管理
Raspberry PiやJetsonのディスプレイとしてUSB-HDMI変換器を使うという選択

# 概要
- ラズパイやJetson Nanoのディスプレイとして7inch程度の小型ディスプレイを使用している方が多いと思います。ふと、USB-HDMI変換器(HDMIキャプチャ)を使ってみたらかなり良かったのでその紹介と、類似手段との性能比較を行いました。
- HDMIディスプレイとの比較
	- Pros
		- 机の上のスペースが空く
		- 電源不要
		- 記事用の撮影が楽
		- 安価 (1,000～2,000円程度)
	- Cons
		- ディレイがある、FPSが遅い
- VNCとの比較
	- Pros
		- CPUを食わない
		- ディレイとFPSは少し良い
		- ※ラズパイのRealVNCは優秀なので不便を感じませんが、JetsonNano等のリモートデスクトップと比べるとかなり良いです
	- Cons
		- 操作が出来ない
		- 変換器を購入する必要がある
- 今回はUSB2の1,600円程度の安い物を使いましたが、ゲーム実況用のグレードが高いものなら上記のマイナスポイントは改善されるかもしれません。


![board.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214268/44261015-8fd2-4207-7aec-06bcf6b85fc9.jpeg)

# 使い勝手
- ドライバ不要で通常のUSB Cameraとして認識される。Windowsなら標準のカメラアプリで画面を表示出来て便利
- VNCだと、HDMIディスプレイに接続していないときにフレームバッファが640x480になってしまうことがあるが、何の設定をしないでも1280x720に認識されて便利 (HDMI出力は1920x1080でした)
- うっかり画面をクリックして、操作しようとして??? となることあがる
- 基本的には満足なのですが、ラズパイに関してはVNCが便利すぎるのでVNCを使い続けると思います。Jetson Nanoの場合にはリモートデスクトップにすると負荷が増加してしまうので役に立ちそうです
- ターミナルからSSHでログインしてコマンド操作がメインでたまに画面を確認するだけ、という方にはお勧めです

# 性能比較
## まとめ
|                  | Delay [msec] | FPS |
|:----------------:|:------------:|:---:|
| HDMIディスプレイ |            9 |  30 |
| USB-HDMI変換器   |     200～250 |  20 |
| VNC              |     180～250 |  10 |

※遅延はカメラ入力、ソフト処理を含みます
※Raspberry Pi 4, 解像度 = 1280 x 720

## 詳細
### 遅延(Delay)の測定方法
- ストップウォッチをラズパイのカメラで撮影し、ライブビューを画面出力
    - https://torisky.com/public/stopWatch2_0/index.html
- ストップウォッチそのものと表示結果を、別のカメラで撮影する
	- RX100, 60p動画記録, シャッタースピード優先 (手元に240p記録できる機材がない。。。)
- 表示されている時刻を比べる
	- 多少、心の目で読んでいます
	- HDMI変換器とVNCはFPSが遅く、同じ時刻が数フレーム続くので遅延に幅があります

測定環境はこんな感じです。

![kankyou.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214268/065a8b85-5556-e9f8-a40e-f71fa75c1a1f.jpeg)


### 遅延(Delay)の測定結果
#### HDMIディスプレイの遅延(Delay)
![delay_display.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214268/989829b2-e28b-74d6-1b6c-49fcf992a296.jpeg)


#### USB-HDMI変換器の遅延(Delay)
![delay_usb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214268/f0317067-4cb3-3e8d-45cc-2cfd6eaf1062.jpeg)


#### VNCの遅延(Delay)
![delay_vnc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214268/b29bfaf2-30ab-7dc1-da1e-de7484f99ab5.jpeg)


### FPSの測定方法
- ストップウォッチをラズパイのカメラで撮影し、ライブビューを画面出力
- ストップウォッチそのものと表示結果を、別のカメラで撮影する
- 同じ数値が何フレーム連続しているかをカウントし、この数値で60を割る
	- 60pで記録したため

### FPSの測定結果
- たくさんになるので省略
- HDMIディスプレイの場合は、2フレームに1回、数値が更新されました。つまり、30pということ
- HDMI変換器の場合は3フレームに1回、VNCの場合は6フレームに1回でした

## 注意
- USB-HDMI変換器の性能は、PC側の負荷によって変動する可能性があります。(ただ、そんなに影響はないと思います)
- VNCの性能は、ラズパイ側の負荷によってかなり変動すると思われます。

# おまけ
ダイソーで買ったこれが、ラズパイカメラの固定にちょうどよくて便利でした。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214268/09ed3f20-8122-2004-ed67-37170ec2b415.jpeg)
変数の命名規則


【概要】
----------------------------------------
<b>1.変数の命名規則とは何か</b>
<b>2.なぜ変数の命名規則が必要か</b>
<b>3.変数の命名規則はどのように使うか</b>
<b>4.ここから学んだこと</b>
<br>

1.変数の命名規則とは何か
----------------------------------------
●変数の命名規則とは、

<b>変数を書く際の一定のルール</b>
ということです。

変数は自由に名前を付けれます。
できるだけわかりやすい命名(ex:user,main_box等々）も
そうですが、それも含めて規則があります。


 <br>


2.なぜ変数の命名規則が必要か
----------------------------------------
結論としては、

<b>コードに統一性を持たせることにより
可読性を向上させ、ミスや作業効率をアップさせるためです！</b>
 <br>

3.変数の命名規則はどのように使うか
----------------------------------------

禁止事項
i)予約語:例➡︎do else nil false etc...
ii)スペース:エラーが発生します。
iii)日本語:文字列以外での日本語は使用できません。
iv)最初の文字が数字:２文字目以降は使用できます。
v)最初の文字が”_(アンダーバー)”:2文字目から使用できます。（"user_id"のように使用しましょう）
vi)最初は大文字:最初は小文字から書く
vii)抽象的な名前:A',aldjfなどの適当な名前（user などの具体的な名前にしましょう）

です。
意外に多いかもしれませんが、基本的なことなので、
しっかり頭に入れておかないとたいしたことのないエラーと思っても手こずることになります。


 <br>

4.ここから学んだこと
----------------------------------------
i)基本小文字で書いていますが、vii)の際に具体的に名前を付けようとして大文字にしてしまう可能性もあるなとおもったのでvi)は特に気を付けないといけないと思いました！

ii)あくまで”変数の命名規則”なのでMVCモデルでコントローラーのclassの命名は大文字であるので混乱しないように気をつけます！
 <br>
バッチファイルがあるディレクトリ名だけを取得

```bat
@echo off
rem バッチファイルがあるディレクトリ名だけを取得

setlocal

set DIRECTORY_PATH=%~dp0
for %%D in ("%DIRECTORY_PATH:~0,-1%") do set THIS_DIRECTORY=%%~nxD

echo %THIS_DIRECTORY%

endlocal

pause
```
閾値処理(スレッショナルド)

#実行環境
[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

#Google Colaboratoryで画像を読み込む為の準備
```python:
from google.colab import files
from google.colab import drive
drive.mount('/content/drive')
```

#必要なライブラリの読み込み
```python:
import cv2 #opencv
import matplotlib.pyplot as plt 
%matplotlib inline
```

#画像準備
```python:
img = plt.imread("/content/drive/My Drive/Colab Notebooks/img/Lenna.bmp")
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
```

#スレッショナルド処理
```python:
plt.figure(figsize=(9, 6), dpi=100,
           facecolor='w', linewidth=0, edgecolor='w')

#オリジナル画像
plt.subplot(2,5,1)
plt.imshow(gray)

#スレッショナルド処理:cv2.THRESH_BINARY #閾値を超えたものを1、他を0にする
plt.subplot(2,5,6)
ret,dst = cv2.threshold(gray,100,200,cv2.THRESH_BINARY)
plt.imshow(dst)

#スレッショナルド処理:cv2.THRESH_BINARY_INV #閾値を超えたものを0、他を1にする
plt.subplot(2,5,7)
ret,dst = cv2.threshold(gray,100,200,cv2.THRESH_BINARY_INV)
plt.imshow(dst)

#スレッショナルド処理:cv2.THRESH_TRUNC #閾値100を超えたものをmax値:200にする
plt.subplot(2,5,8)
ret,dst = cv2.threshold(gray,100,200,cv2.cv2.THRESH_TRUNC)
plt.imshow(dst)

#スレッショナルド処理:cv2.THRESH_TOZERO 閾値以下の輝度を0に変換
plt.subplot(2,5,9)
ret,dst = cv2.threshold(gray,100,200,cv2.THRESH_TOZERO)
plt.imshow(dst)

#スレッショナルド処理:cv2.THRESH_TOZERO_INV 閾値以上の輝度を0に変換
plt.subplot(2,5,10)
ret,dst = cv2.threshold(gray,100,200,cv2.THRESH_TOZERO_INV)
plt.imshow(dst)

plt.show()
plt.gray()
```

##スレッショナルド結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610285/f0d26d1b-2970-0ef0-468c-a97043fc72e8.png)
mecab-python3やtransformersのBertJapaneseTokenizerで辞書を指定する

Ubuntu18.04で[huggingface/transformers](https://github.com/huggingface/transformers)の`BertJapaneseTokenizer`を使ったときに辞書の指定で苦労したのでメモ．

こんな感じです．

```python

In [1]: import MeCab

In [2]: mecab = MeCab.Tagger("")

Failed initializing MeCab. Please see the README for possible solutions:

    https://github.com/SamuraiT/mecab-python3#common-issues

If you are still having trouble, please file an issue here, and include the
ERROR DETAILS below:

    https://github.com/SamuraiT/mecab-python3/issues

issueを英語で書く必要はありません。

------------------- ERROR DETAILS ------------------------
arguments:
error message: [ifs] no such file or directory: ./dicrc
----------------------------------------------------------
```

# 事情
- Ubuntu 18.04
- mecabはインストール済
- mecab-python3のバージョンは1.0.1
- http://taku910.github.io/mecab/#download から mecab-ipadic-2.7.0-20070801.tar.gz をダウンロードし，記述に基づきインストール済．

```bash:/etc/mecabrc
$ cat /etc/mecabrc
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/ipadic/

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n
```

```bash
$ mecab -D
filename:       /usr/lib/x86_64-linux-gnu/mecab/dic/ipadic/sys.dic
version:        102
charset:        utf8
type:   0
size:   392126
left size:      1316
right size:     1316
```


# 設定など
- `/etc/mecabrc` (` mecab-config --sysconfdir`で確認できるやつ)にて `dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/ipadic/`と設定済．
  - これは`make install`で入る先
- `mecab -D`で見てみると`filename:       /usr/lib/x86_64-linux-gnu/mecab/dic/ipadic/sys.dic`となっている

# 症状
- mecabコマンドではカレントディレクトリがどこでもちゃんとインストールした辞書が指定できている
- カレントディレクトリをインストールした辞書にすると，Pythonにて`mecab = MeCab.Tagger()`がちゃんと読み込んでくれる
- カレントディレクトリが違う場所だと，`error message: [ifs] no such file or directory: ./dicrc`って怒られて`mecab = MeCab.Tagger()`にて終了する．


# だめだったやつ
- `/etc/mecabrc`の設定だけではだめ

# 解決方法 for MeCab
おとなしく辞書を指定する．

```python

In [5]: mecab = MeCab.Tagger("-d /usr/lib/x86_64-linux-gnu/mecab/dic/ipadic")
```

# 解決方法 for bert with transformers
transformersの`BertJapaneseTokenizer`が使いたかった．このクラス，`transformers/tokenization_bert_japanese.py`に記述されているのですが，中身はほとんどtransformersの日本語モデルを提供している東北大学乾研究室のGitHub内にある[tokenization.py](https://github.com/cl-tohoku/bert-japanese/blob/master/tokenization.py)でした．

よって，以下のようにして解決できます．

```python
name = 'cl-tohoku/bert-base-japanese-whole-word-masking'  # 例えば
BertJapaneseTokenizer.from_pretrained(name, mecab_kwargs={"mecab_option": "-d /usr/lib/x86_64-linux-gnu/mecab/dic/ipadic"})
```
macOS Big SurでAndroid Studioの Emulatorが起動した瞬間にクラッシュする問題の回避策

#はじめに
macOS Big Surを使用していると、Parallelsが使えなくなったり、Visual Studio 2019が落ちることが多発する様ですが、Android Studioもその中の1つです。
タイトルの通り、Android StudioからEmulator(バージョンに関わらず)を起動すると、Android Studioもろともクラッシュしてしまいます。

スタックオーバーフローでも同様の問題が確認できます。
https://stackoverflow.com/questions/63148352/emulator-does-not-start-c066d201-unhandled-exit-1d

私の環境では上の解決法では治りませんでしたが、ごちゃごちゃやっているうちに解決法を見つけたので紹介しようと思います。

#環境
macOS Big Sur Beta 11.0 Beta（20A5343i）

Android Studio 4.0.1
Build #AI-193.6911.18.40.6626763, built on June 25, 2020
Runtime version: 1.8.0_242-release-1644-b3-6222593 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

#解決法

##ステップ1
### ※2020/8/20 18:40　追記
以下を行う前に、AVD Managerから対象のEmulatorの**Wipe Data**を行ってください。

　
##ステップ2
まず、AVD Managerから一度、起動したいEmulatorを**Cold Boot Now**します。
![スクリーンショット 2020-08-19 22.39.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639408/0a3e1ae0-bca7-6f8c-9f6b-5dbe0a178244.png)

すると、Emulatorが起動しますが、Cold bootしたよ!みたいな通知が出るだけで画面は真っ暗なままです。
(ちなみにこの時点でAndroid Studioはクラッシュし、応答しなくなります。Emulatorと一緒に強制終了しましょう。)

![スクリーンショット 2020-08-19 22.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639408/15552c43-5741-075e-8ecd-2c54f5de6d0f.png)

##ステップ3
次に、コマンドラインからオプション付きで起動します。**絶対にコマンドラインから**起動してください。

ターミナルを開き、次のコマンドを打ちます。

```terminal
$ cd ~/Library/Android/sdk/emulator/  # $は入力しないでね

$ ./emulator -list-avds
```

こうすると、現在使っているEmulatorの名前が出てきます。
例えば、

```
Pixel_3_API_29
```

の様になります。これは次で必要になります。

次に、

```console
$ ./emulator -gpu host -avd 「さっきのエミュレーターの名前」
```

の様に打ちます。
私の場合、

```console
$ ./emulator -gpu host -avd Pixel_3_API_29
```

こうなります。

すると、Emulatorが起動するはずです。
![スクリーンショット 2020-08-19 22.54.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639408/a91209bd-e4dc-8bbe-a07f-a68ea16330f4.png)

そして、DISMISSを押してしばらくすると...
![スクリーンショット 2020-08-19 22.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639408/71aa2b6c-810e-0fb9-0b3c-ef4977052d40.png)


起動しました!

Emulatorが起動した後なら、　Android Studioを起動しても問題ありません。
ちゃんとアプリのビルドもできました。

#最後に
やっぱり、ベータ版のものってあんまり使うべきじゃないですね...
かなり困ることが多いです。

ちなみに、上記の方法でなぜ治るのか原因は不明です。詳しい方がいたら教えてください。
URLとタイトルをorg-mode、markdownのリンクとして取得

# 概要
メモをとるときは基本org-mode、
記事を書くときは基本markdownで書いているので、
閲覧中のURLタイトルをそれらのハイパーリンク形式で取れたら便利。

ということをブックマークレットで簡単にできそうだったので、
閲覧中のページのURLとタイトルをそれぞれの形式でクリップボードにコピーするものを作成した。

参考:
- [Create Bookmarklet (browser bookmark that executes Javsacript) to copy a given text to Clipboard](https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d)

# コード

ブックマークレットとして作成した。
以下の要領でブックマークレットとして登録している。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162960/34b60b6b-1523-9bbb-cb42-3a1968782991.png" width=50%>

## copy as org
`[[URL][title]]` の形式でクリップボードにコピーする。

```javascript
javascript:!function(a){var b=document.createElement("textarea"),c=document.getSelection();b.textContent=a,document.body.appendChild(b),c.removeAllRanges(),b.select(),document.execCommand("copy"),c.removeAllRanges(),document.body.removeChild(b)}("[["+location.href+"]["+document.title+"]]");
```

## copy as md
markdownもよく使うので作成しておいた。
`[title](URL)` の形式でクリップボードにコピーする。

```javascript
javascript:!function(a){var b=document.createElement("textarea"),c=document.getSelection();b.textContent=a,document.body.appendChild(b),c.removeAllRanges(),b.select(),document.execCommand("copy"),c.removeAllRanges(),document.body.removeChild(b)}("["+document.title+"]("+location.href+")");
```

# ブックマークレットの開発TIPS
ブックマークレット開発時は、google closure compilerでuglifyすると便利らしい。
https://closure-compiler.appspot.com/home
next js で Error: Cannot find module 'next/Link' が出たときの解決方法

# 概要
Error: Cannot find module 'next/Link' が出たときの解決方法を共有します。

# 方法
大文字を小文字に修正してください。

```javascript
import Link from 'next/Link';
↓
import Link from 'next/link';
```

参考
https://github.com/vercel/next.js/issues/9482
gitで直前のコミットからの変更を完全に取り消すワンライナー

# gitで直前のコミットからの変更を完全に取り消すワンライナー

```bash
git add -A && git reset --hard HEAD
```

# このワンライナーについて

備忘録です。

通常は以下のコマンドで直前のコミットにファイルの状態を戻すことができます。

```bash
git reset --hard HEAD
```

しかしながら、このコマンドでは新規ファイルが作成された場合はそのファイルは消してくれません。なぜなら新規ファイルが一度もステージングされていないため、gitの追跡対象になっていないからです。

なので`git reset --hard HEAD`をする前に、すべてのファイルを一度ステージングすることで、新規ファイルを含めて完全に直前のコミットの状態に戻すことができます。

# 最後に

このコマンドをaliasにしとくと便利なのでおすすめです。
macOS Catalinaでコマンドライン・デベロッパツールをインストールする

OS : macOS Catalina(バージョン10.15.6)
目的 : GNU makeを使いたい
手段 : コマンドライン・デベロッパツールをインストールする
Xcode : 未インストール(Xcodeにコマンドライン・デベロッパツールが含まれているそうです)
手順 :

1.ターミナルを起動します。

2.以下コマンドを実行します。

```
make --version
```

すると、標準出力か標準エラー出力に、以下が出力されます。

``` 
xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.
```

3.コマンドライン・デベロッパツールのインストールのダイアログが出るので、指示に従ってインストールします。

4.手順2.のコマンドを再実行して、インストール確認を行います。

``` 
make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
```

インストールされたGNU makeのバージョンは3.81でした。
【Bigquery勉強メモ#001】BigQueryで日次データの欠損値を補完する。

Crezitの[@yabebe_t](https://twitter.com/yabebe_t)です。
最近ひたすらBQ書いてるのでわからなかったことのメモを残していくことにしました。



# 課題
貸付データをサーバーから日次で集計しつつ、銀行口座データとのダブルチェックができるようにしたい。日付の欠損があった場合に、集計がずれてしまわないように、欠損日には0をいれてクエリーする。




# 解決方法
シンプルに2ステップで解決しました。
色々調べているとSQLで@numなど変数を使ってやっている方もいました

1. GENERATE_DATE_ARRAYで日付データを生成
2. 集計したテーブルをLEFT JOIN。

 

### 1. GENERATE_DATE_ARRAYで日付データを生成


2020年3月1日から今日+1日までの日付データを生成。

```
WITH date_series as (
select publish_date
from unnest(GENERATE_DATE_ARRAY( DATE("2020-03-01"), DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY))) as publish_date
)
``` 






#### GENERATE_DATE_ARRAY
``` 
GENERATE_DATE_ARRAY(start_date, end_date[, INTERVAL INT64_expr date_part])


SELECT GENERATE_DATE_ARRAY('2016-10-05', '2016-10-08') AS example;

+--------------------------------------------------+
| example                                          |
+--------------------------------------------------+
| [2016-10-05, 2016-10-06, 2016-10-07, 2016-10-08] |
+--------------------------------------------------+
```
https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators?hl=ja 
 


#### Date_ADD
```
DATE_ADD(date_expression, INTERVAL int64_expression date_part)

SELECT DATE_ADD(DATE "2008-12-25", INTERVAL 5 DAY) as five_days_later;

+--------------------+
| five_days_later    |
+--------------------+
| 2008-12-30         |
+--------------------+
```




### 2. 集計したテーブルをLEFT JOIN。







# 参考記事
- [BigQueryによるデータ分析のための前処理Tips
](https://techblog.zozo.com/entry/bigquery_data_reduction)
- [SQLで分析を始めた人に贈る、中級者に上がるための10のTips — 前編 -](https://medium.com/eureka-engineering/sql%E3%81%A7%E5%88%86%E6%9E%90%E3%82%92%E5%A7%8B%E3%82%81%E3%81%9F%E4%BA%BA%E3%81%AB%E8%B4%88%E3%82%8B-%E4%B8%AD%E7%B4%9A%E8%80%85%E3%81%AB%E4%B8%8A%E3%81%8C%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE10%E3%81%AEtips-%E5%89%8D%E7%B7%A8-4ac648b09c77)
Google Classroom クラスフォルダとGoogle Driveの違い

Google Classroom でクラスに共有されているクラスフォルダと、Google Driveで共有するフォルダは、別物みたいなのでまとめてみました。

#Google Drive
共有したい相手それぞれに、「閲覧者」「閲覧者（コメント可）」「編集者」の権限を設定して、共有することができます。
とても共有構造がわかりやすい、構造になっています。

>共有ドライブでは、
・共有ドライブごとでの共有
・各ファイルの共有
での共有はできても、
・共有ドライブ内のフォルダの共有
はできません。（2020年8月現在）


#Google Classroom 
Google Classroomのクラスを作成・参加した段階で、Google Driveに「Classroom」のフォルダが追加され、その中にクラスごとのフォルダが作成されます。
ただし、この「クラスフォルダ」というのは、上記の共有フォルダのように全員が同じ中身ではなく、先生・各生徒が別々のものになっています。
→そのため、クラスフォルダに共有したはずなのに共有されていない！といった現象が起きてしまうことがあります。

- 先生のフォルダは、複数の先生がいる場合、同じフォルダが共有されます
- 生徒のフォルダは、生徒ごとに異なるフォルダが作成されます。


##先生がClassroomで、課題（生徒が閲覧可/編集可）を作成した場合
課題を設定した時点で、講師のクラスフォルダに

- **課題名** のファイルが作成されます

このファイルの権限は、以下のように設定されます。

|課題の設定|講師|生徒|
|:-:|:-:|:-:|
|生徒が閲覧可|編集可|閲覧可|
|生徒が編集可|編集可|編集可|

また、生徒のフォルダには追加されません。

Google Driveは、以下のフォルダ構造になります。

```
講師 の Google Drive
- マイドライブ
  |- Classroom
     |- 講義名
        |- 課題X

生徒 の Google Drive は、変化なし
```


##先生がClassroomで、課題（各生徒にコピーを作成）を作成した場合
課題を設定した時点で、講師のクラスフォルダに

- **Templates - DO NOT EDIT** の中に、設定した課題のテンプレートが追加される
- **課題名** のフォルダが作成され、生徒ごとに **生徒名-課題名** のファイルが追加される（それぞれの生徒に共有されている）

また、生徒のクラスフォルダに生徒ごとの

- **生徒名-課題名** のファイルが追加される（講師に共有されている）

Google Driveは、以下のフォルダ構造になります。

```
講師 の Google Drive
- マイドライブ
  |- Classroom
     |- 講義名
        |- Templates - DO NOT EDIT
           |- 課題X （コピー元）
        |- 課題名
           |- 生徒1-課題X ★
           |- 生徒2-課題X

生徒1 の Google Drive
- マイドライブ
  |- Classroom
     |- 講義名
        |- 生徒1-課題X ★

★ のファイルが、同一のものとして共有されています
```



##GoogleDriveでクラスフォルダに、ファイルを作成した場合
なんと、GoogleDriveでクラスフォルダにフォルダやファイルを作成しても、自動で共有はされません！！
> クラスフォルダって名前なので、このフォルダの中にあるものは、みんなに共有されていると思っていました。

ただし、講師のクラスフォルダに作成したものは、講師同士で自動で共有されます。


#さいごに
Google Classroomのクラスフォルダ構造はわかりにくいですが、Google Driveの情報で権限を見れば誰が編集可・閲覧可の設定がされているかを確認することができます。
クラスの中で、フォルダやファイルを自由に作成・共有するスペースを作るには、別にフォルダを作成して個別に共有したり、URLを共有するしかなさそうですかね。。。
【Laravel】セッション/ペジネーション

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
[PHPフレームワーク Laravel入門 第2版](https://www.amazon.co.jp/dp/B08625YD7H/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

#セッション
##セションについて
セッションはクッキーとDBを組み合わせるのが基本
Laravelではファイルやメモリキャッシュ等でセッションを保存している。
デフォルトではファイルを利用するように設定されている。

##セッション操作の基本

- 値に名前をつけて保存する
- 名前を指定して値を取得する

この2つの操作のみ。

###値を保存
```php5
《Request》->session()->put(キー,値)
```
セッションファイルの保存先はstorage/framework/sessions
###値を取得
```php5
$変数=《Request》->session()->get(キー)
```

##DBでセッションを使う
セッションをファイルで管理するとなると、そのうち膨大な数を配置することになる上、読み書きの速度も早いわけではない。
本格的に導入していくならDBを利用する方法に変更すべき
###セッションの保存先をDBに変更する
以下のように修正する。

```php5:config/session.php
'driver' => env('SESSION_DRIVER', 'database'),
```
次に`.env`のSESSION_DRIVERを修正

```:.env
SESSION_DRIVER=database
```

##セッション用のテーブルを作成
セッション用のテーブルは決まった形で作る必要があるため、artisanコマンドで作成する。

```
php artisan session:table
```
これでセッション用のテーブルを作成するマイグレーションファイルが作成される。
後はマイグレーションを実行してテーブルを生成する


#ペジネーション
allで全レコードを取得して表示するのではなく、必要な部分だけを取り出して表示するという処理が必要になる。

ペジネーションはレコードを一定数ごとに取り出して表示していく仕組み。
全レコードをページ分けして表示している。

##simplePaginate
###DBクラス
simplePaginateメソッドの引数へ指定した数字で1ページあたりの表示レコード数を指定する

```php5
$item=DB::table('people')->simplePageinate(5)
```
出典:[PHPフレームワーク Laravel入門 第2版](https://www.amazon.co.jp/dp/B08625YD7H/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

上記例では5項目ずつレコードを表示している。

###モデルクラス
DBクラス同様simplePaginateが使える

```php5
$items=Person::simplePageinate(5)
```
出典:[PHPフレームワーク Laravel入門 第2版](https://www.amazon.co.jp/dp/B08625YD7H/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
プログラムを書くときの注意点：その５

【概要】
----------------------------------------
<b>1.結論</b>
<b>2.逆依存性の原則とは何か</b>
<b>3.逆依存性の原則はどう使うのか</b>
<b>4.なぜ逆依存性の原則が必要か</b>
<b>5.ここから学んだこと</b>
<br>

1.結論
----------------------------------------
<b>逆依存性の原則にも従う！
<br>

2.逆依存性の原則とは何か
----------------------------------------
●逆依存性の原則とは、

>上クラスは下クラスに依存するべきではなく、
抽象クラスに依存するべきである。

つまりBクラスはCクラスには依存せずに、
interfeceに依存するべき。ということになります。

もっとわかりやすくすると、
B➡︎Cではなく、

A⬅︎B
⬆︎
C
であれば、
BとCは依存関係にはならないということですね！

これはおそらく<a href="https://qiita.com/taka_no_okapi/items/42e6bba8c23ef019f7f6">"インターフェース分離の原則"</a>にも深く関わってくるお話だと思います。
<br>


3.逆依存性の原則はどう使うのか
----------------------------------------
こちらも例を出します！

```ruby:逆依存性の原則

class A
aaa =
bbb =
ccc =

****(B)

****(C)


```

```ruby:逆依存性の原則
interface B
 ****
interface C
 ****
```
の関係にすれば
Aに集中させることができ、
BクラスがCクラスに依存することがなくなりました。

 <br>

4.逆依存性の原則が必要か
----------------------------------------
結論としては、プログラミングを書く際の要は以下の
3つに集約されると思っています。

Ⅰ）保守性：修正（エラー発見のしやすさ）・管理のしやすさ
Ⅱ）拡張性：追加機能実装のしやすさ
Ⅲ）可読性：記述のわかりやすさ
が必要だと考えております。

つまり、上の3つを叶えるには
<b>逆依存性の原則に”も（他の４つの原則もあるので）”従う！！</b>
 <br>


5.ここから学んだこと
----------------------------------------
i)この記事にてSOLID原則は全て書き終えましたが、
単一性の原則以外、めちゃくちゃ難しいです。しかも、お互いの原則が絡み合っています。おそらく今後も、もっとコードを書いた上で、より深く理解できる原則だと感じました。

ii)この５原則は毎日意識してプログラムに落とし込んでいきます！
<br>
ITILファンデーション(ITIL4エディション)の資格の勉強を始めた5

#サービスマネジメント・プラクティス
##可用性管理
顧客やユーザのニーズを満たせるよう、合意済みの可用性レベルをサービスが提供することを確実にするプラクティス。

###可用性
ITサービスまたはその他の構成アイテムが合意された機能を必要なときに実行できる能力。

##事業分析
ビジネスを分析しビジネスニーズを定義しそのニーズに対処し、利害関係者にとっての価値を生み出すためのソリューションを推奨するプラクティス。

###有用性要件
顧客によって定義され特定の製品に固有の機能的要件。
###保証要件
主要な利害関係者および他のプラクティスからのインプットとして得られる要件。通常は非機能要件となります。組織は事前に定義された一連の保証受け入れ基準をまとめて管理することを目的とすべき。

##キャパシティおよびパフォーマンス管理
サービスが合意済みで期待されたパフォーマンスレベルを達成することを確実にし、費用対効果に優れた方法で現在および将来の需要を満たすプラクティス。

###パフォーマンス
システム、人、チーム、プラクティス、または、サービスによって達成または提供されたものの尺度。

##変更実現
製品・サービスの変更の成功数を最大にするために、変更を進めることを許可し、変更スケジュールを管理するプラクティス。これによりリスクが確実に適切に評価されるようにする。

###変更
サービスに直接的または間接的な影響を及ぼす可能性がある何らかの追加、修正、削除。
###変更許可委員
変更を承認する個人またはグループ
###変更には3種類ある
- 標準的な変更
- 通常の変更
- 緊急の変更

##インシデント管理
###インシデント
サービスの計画外の中断、サービスの品質の低下

##IT資産管理
すべてのIT資産のライフサイクル全体を計画し管理するプラクティス。

###IT資産
IT製品またはITサービスの提供に利用できる、経済的な価値を持つすべてのコンポーネント。

##モニタリングおよびイベント管理
サービスを系統的に観察し、イベントとして認識された特定の状態変化を記録し報告するプラクティス。

###イベント
サービスまたはその他の構成アイテム(CI)を管理するうえで重要な意味を持つ状態の変更。イベントは通常、ITサービス、CI、モニタリングツールによって作成された通知によって識別される。

##問題管理
インシデントの実際の原因と潜在的原因を識別し、ワークアラウンドと既知のエラーを管理することで、インシデントの発生可能性とインパクトを低減するプラクティス。

###問題
１つまたは複数のインシデントの原因または潜在的原因。
###既知のエラー
分析済みだが未解決の問題。
###問題管理の段階
- 問題の特定
- 問題のコントロール
- エラーコントロール

###ワークアラウンド
まだ完全な解決策がないインシデントまたは問題のインパクトを軽減または排除するソリューション。インシデントの発生する可能性を抑えるためのワークアラウンドも存在する。

##リリース管理
新規および変更されたサービス並びに機能を使用可能にするプラクティス。

###リリース
使用可能にしたサービスまたは他の構成アイテムのバージョン、あるいは構成アイテムの集合。
###ブルーグリーンリリース
２つのミラーリングされた本番環境を使用する。適切な環境に接続できるネットワークツールを使用して、新しい機能を利用できる更新された環境に切り替えることができる。
###機能フラグ
機能フラグを使用すると特定の機能をコントロールされた方法で個々のユーザやグループにリリースできる。新機能はリリースされずに本番環境に展開され、その後ユーザ構成設定に基づき、必要に応じて新しい機能が個々のユーザにリリースされる。

##サービスカタログ管理
###サービスカタログが提供するビューの種類
- ユーザービュー
- 顧客ビュー
- IT to IT 顧客ビュー

###リクエストカタログ
サービスカタログのビューの１つ。既存および新規のサービスに対するサービス要求の詳細を提供する。

##サービス構成管理
###構成アイテム
ITサービスを提供するために管理する必要がある、あらゆるコンポーネント。
###構成管理システム
サービス構成管理を支援するために使用される一連のツール、データ、情報。

##サービス継続性管理
災害の発生時にサービスの可用性とパフォーマンスを十分なレベルで維持することを確実にするプラクティス。

###目標復旧時間(RTO)
###目標復旧時点(RPO)
###災害復旧計画
###ビジネスインパクト分析(BIA)

##サービスデザイン
目的に適し、使用に適し、組織によって提供できる製品・サービスを設計するプラクティス。

###顧客体験(CX)
###ユーザ体験(UX)
###デザイン思考

##サービスデスク
インシデント解決とサービス要求の需要を収集するプラクティス。

##サービスレベル管理
###サービスレベル
期待または実現されるサービス品質を定義する１つまたは複数の測定基準。
###サービスレベルアグリーメント
必要とされるサービスとサービスで期待されるレベルを規定するためのサービスプロバイダと顧客の間で結ばれる合意文書。

##サービス要求管理
事前に定義されユーザが開始したすべてのサービス要求を効果的かつユーザフレンドりーな方法で処理することによって、合意済みのサービス品質を支援するプラクティス。

###サービス要求
通常のサービス提供の一部として合意されたサービス活動を開始する、ユーザまたは権限を与えられたユーザ代理人からの要求。

##サービスの妥当性確認およびテスト
新規・変更された製品・サービスが、定義された要件を満たすことを確実にするプラクティス。
AWS IoT で IoT基盤を構築 ~ストリーミングを追加する~

# はじめに
[AWS IoT で IoT基盤を構築 ~お試し編~](https://qiita.com/ground0state/items/69b168289f1c61e49326)ではIoT Coreから直接Dynamo DBにデータを流していたが、それだとアクセスが多い場合データがドロップするので、Kinesisを使用してバッファを持たせる。

# 参考
- 全体的な手順 https://www.slideshare.net/dcubeio/kinesis-firehose-80037243
- S3prefixの設定 https://dev.classmethod.jp/cloud/firehose-custom-s3-prefixes/
- データの配信頻度 https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/basic-deliver.html
- ハンズオン道場 https://awsiot-handson-dojo-basic-ble.readthedocs.io/en/latest/05.html

# 手順
[AWS IoT で IoT基盤を構築 ~お試し編~](https://qiita.com/ground0state/items/69b168289f1c61e49326)の続きになっています。

## ルールの作成

まず、コンソールにログインし、IoT Coreを開きます。画面左部のメニューから「ACT」をクリックします。
「ルールの作成」をクリックします。ルールに名前を付けます。今回は`kinesis_streams`としました。

「ルールクエリステートメント」欄に、データに対する加工操作を記述します。「SQL バージョンの使用」は`2016-03-23`にします。「ルールクエリステートメント」には下記のステートメントを記述します。

```SQL
SELECT clientid() AS client_id, timestamp() AS timestamp, * FROM 'sdk/test/Python'
```

「アクションの追加」をクリックします。「Amazon Kinesis Firehose ストリームにメッセージを送信する」をクリックし、「アクションの設定」をクリックします。「アクションの設定」画面で「新しいリソースを作成する」をクリックすると、「Amazon Kinesis」画面に遷移します。画面左部の「Data Firehose」が選択されていることを確認し、「Create Delivery Stream」をクリックします。「Delivery stream name」に`stream01`と付けました。「Choose source」では「Direct PUT or other sources」ラジオボタンをONにしました。「Next」をクリックします。

「Transform source records with AWS Lambda」ではKinesis上でLambdaを呼び出しデータを加工するか設定できます。今回は変換しないので「Disabled」ラジオボタンをONにします。「Convert record format」では、データをparquet形式に圧縮するか設定できます。圧縮すると行き先はS3のみになります。今回は変換しないので「Disabled」ラジオボタンをONにします。「Next」をクリックします。

「Select destination」では「Amazon S3」ラジオボタンをONにします。「S3 destination」ではS3 bucketを指定するのですが、新しく作成する場合は「Create new」をクリックします。今回は新しく作成することとし、「S3 bucket name」を`data-d9wj2qk3`としました。「Region」は「Asia Pacifi(Tokyo)」としました。その他はデフォルトとし、「Next」をクリックします。

「S3 buffer conditions」ではバッファの設定をします。S3へ配信する場合は、これらの条件のどちらかを満たしたタイミングで配信されます。「Buffer size」を`5`とし、「Buffer interval」を`60`としました。「S3 compression and encryption」ではデータを圧縮するか、暗号化するか選択しますが、今回はデフォルトのままとします。「Error logging」と「Tags(optional)」もデフォルトのままとします。「IAM role」では「Create new or choose」をクリックします。今まで一度も作成していなければ、「Amazon Kinesis Firehose is requesting permission to use resources in your account」画面に遷移し、デフォルトの値が入力された状態になります。そのまま「許可」をクリックします。Kinesisの画面に戻るので、「Next」をクリックします。

今まで設定した内容の確認画面が表示されるので、確認できたら「Create delivery stream」をクリックします。

AWS IoT の「アクションの設定」画面に戻るので、ストリーム名に先ほど作成したストリームを指定します。「Separator」には「\n(改行)」を指定します。「このアクションを実行するための AWS IoT アクセス権限を付与するロールを選択または作成します。」で「ロールの作成」をクリックし、「新しいロールの作成」画面でロール名を入力します。今回は`iot_kinesis_firehose`としました。「アクションの追加」をクリックします。

「ルールの作成」をクリックします。

以上でKinesisを経由してS3にデータが送信されるようになりました。データはバッファにある程度溜まったあと、1つのファイルにまとめられてS3に格納されます。Dynamo DBに直接PUTしていたときは1リクエスト1ファイル生成していたので、効率的に処理され負荷が小さくなっています。Kinesisがバッファの役割になるのでIoT Coreの負荷が低減さて、QoSが0でも欠落しにくくなると考えられます。