OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルの削除


##GitHub commit済ファイルの削除手順


```
$ git rm -rf ファイル名
rm 'ファイル名'
```

##GitHub commit前ファイルの削除手順
```
$ git rm remove.js
```

上記エラーが出た場合

```
error: the following file has changes staged in the index:
    remove.js
(use --cached to keep the file, or -f to force removal)
```
ステージングされた状態のファイルをリポジトリから削除したい場合には、次のように "-f" オプションをつけて "git rm" を再実行します。
無事削除できました。
ARMの64bit命令セットと32bit命令セットの速度比較

RaspberryPi 3B+ には Cortex-A53 が乗っている。
Cortex-A53 の命令セットは Armv8-A。64bit 命令を実行可能。

でも、普通に Raspberry Pi OS (Raspbian) を入れると、32bit になる。

```shell
$ uname -a
略 armv7l GNU/Linux
```

なんかもったいないなぁと思いつつ、どれぐらいもったいないのかは全然知らなかった。
で。
今日も楽しいマイクロベンチマーク。

# 64bit 環境を用意する

[Raspberry Pi 4B 64bit kernel を試す]( https://qiita.com/god19/items/463b2c089159856d23ac ) を参考にしたら簡単にできた。
記事のタイトルに 4B とあるが、 3B+ でも同じだった。

```shell
$ uname -a
略 aarch64 GNU/Linux
```
ちゃんと 64bit になったっぽい。

# バイナリをつくる

当初は、 clang か gcc で arm64 バイナリ作ろうと思ったんだけど、簡単には arm64 バイナリを作れそうになかったので、仕方なく、 go で行くことにした。

# 時間を測る

* [無意味な計算]( https://github.com/nabetani/armbench/blob/a299f466909e344bd4a071ad637c5a0c05aa5135/src/main.go )を uint64, float64, float32 で行った
* 環境は、MacBook Pro (Retina, 15-inch, Mid 2015) と 64bit化された Raspberry Pi 3B+
* バイナリは、 amd64 と Armv7, Armv8。
* ビルドは macOS 行った。これは、 Raspberry Pi に go 1.14 を入れるのがめんどくさかったから。

# 測った結果

## uint64

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/eae10382-f300-58c9-0150-0f1403d52769.png)

計算内容は、足し算、乗除、そしてローテート。
グラフがグネグネしているのでよくわからないが、2〜3倍 Armv8 の方が速い模様。

## float32

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/4ce350c1-0330-22d2-16de-42fa2fa68f51.png)

計算内容は、足し算と乗除。
neon の効き具合に差が出るかと思いきや、大差ない感じ。

## float64

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/b3a5b934-dcfa-38c6-b2fb-8d4ebddf97e4.png)

計算内容は、足し算と乗除。
こちらも neon の効き具合に差が出るかと思いきや、大差ない感じ。

# まとめ

Armv8 (amd64, aarch64) 命令セットが使えれば、64bit 整数を含む計算ではだいぶ差が出ることがありそう。
浮動小数点数では差が出なさそう。

まあマイクロベンチマークなので、この実験だけでははっきりわからないのだけれど。
Vimのターミナルをすこし使いやすくする

こんにちわ
ゴリラです

Vimでターミナルを使うときは`:term ++close +shell {cmd}`というふうに実行することが多々ありますが、
オプションが多くなると、いささか不便に感じます。

そこで、`BufReadCmd`を使えば、ターミナルがちょっと使いやすくなります。

# やりかた

```vim
function! s:termopen() abort
  let name = split(bufname(), '\/\/')
  if len(name) < 2
    return
  endif
  call execute(printf('term ++curwin ++close ++shell %s', name[1]))
endfunction

augroup terminal
  au!
  au BufReadCmd term://* call s:termopen()
augroup END
```

上記のコードを`vimrc`に追記&リロードして、`:vnew term://top` すると、ターミナルが起動して`top`コマンドが動きます。

![vim-term.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/346ec215-2109-3c5f-c01c-9601c7ae6054.gif)

## 仕組み
仕組みは簡単で、bufferが作られたら `BufReadcmd` イベントが走るので、その時 `s:termopen` を実行させるように `autocmd` を設定します。
`s:termopen`関数内ではバッファ名からterminalで実行するコマンド(`//`よりも後ろの部分)を取得してターミナルを起動します。

`//`よりも後ろがコマンドになるので、例えば`tabnew term://bash`でも動くし、`new term://docker exec -it golang bash`でも動きます。
設定自体はシンプルでかつ柔軟にコマンドを実行できるので個人的に便利と思っています。

## さいごに
このターミナルのカスタマイズはneovimから着想を得ました。neovimでは標準で同じようなことが出来ます(ヘルプより抜粋)。

```
- Edit a file with a name matching `term://(.{-}//(\d+:)?)?\zs.*`.
  For example:

    :edit term://bash
    :vsplit term://top
```
Swiftでインスタグラムへのシェア導線をつけてみる

# はじめに

今回はアプリからインスタグラムのフィードへのシェア導線をつける実装です。詳しくは[こちら](https://yamato8010.hatenablog.com/entry/2020/07/25/160833)に書いてあります👨‍💻

## インスタグラムに遷移できるようにする

まずは、アプリからインスタグラムの Custom URL Scheme が利用できるように info.plist の `LSApplicationQueriesSchemes`に`instagram://`を追加していきましょう。

## 画像を保存して LocalIdentifier を取得する

```.swift
    func saveImage() {
        UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
    }

    @objc private func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
        let fetchOptions: PHFetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]

        let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
        if (fetchResult.firstObject != nil) {
            guard let lastAsset = fetchResult.lastObject else {
                return
            }
            let localIdentifier = lastAsset.localIdentifier
        }
    }
```

## LocalIdentifier を使って Custom URL Scheme でインスタグラムに遷移する

```swift
    @objc private func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
        let fetchOptions: PHFetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]

        let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
        if (fetchResult.firstObject != nil) {
            guard let lastAsset = fetchResult.lastObject, let urlScheme = URL(string: "instagram://library?LocalIdentifier=\(lastAsset.localIdentifier)") else {
                return
            }
            if UIApplication.shared.canOpenURL(urlScheme) {
                UIApplication.shared.open(urlScheme)
            }
        }
    }
```
Actionメソッドと画面遷移

#ASP.NETでの画面遷移
この記事ではわかりやすさなどは追求せず、備忘録的に内容をまとめていきます。

##元画面に戻す場合は？
自分が分からなくなっていたのは元画面に戻る処理の実装方法です。

例えばショッピングサイトでアカウントを作成するとき、

アカウント情報を入力画面に記入する。
送信ボタンをクリック！
↓
問題がなければ次の画面に遷移します
だけど、あれ？入力内容ちょっとまずいじゃん！いろいろ必須事項漏れてるし、使用禁止文字使ってるし、、、
よしっ、*元の入力画面に戻しちゃえ！*ついでにどこがまずいかのメッセージも表示しちゃえ！


て場合です。
例えばアカウント作成のときにこんな画面の遷移をします。

では、画面の間を繋ぐコントローラーではどう実装すべきでしょうか？特に元の画面に戻す場合は何をリターンするのが正解でしょうか？

``` C#
if(/*エラーがある場合*/)
{
/*何か処理*/ 

/*戻り値は何？*/
}else/*入力にエラーがないとき*/
{
/*何か処理*/ 

/*戻り値は何？*/
}
```

## 結論　Viewメソッドを使え！
結論から言えばViewメソッドを使うが正解です。とりあえず画面遷移をさせたいならViewメソッドです！← これは言い過ぎ？


## わからなかった原因
しかし最初、Viewメソッドを使うことがわかりませんでした。
その原因はViewメソッドはそのメソッド名と同じ名前のViewに遷移させるものと思っていたからです。そして、View以外(RedirectToActionとか？)の場合はモデルに付与した検証用のアノテーションが意味をなさなくなります。

Indexメソッド内でView→Index.cshtml

みたいな感じ

## Viewメソッドは返すView名を指定できる
ViewメソッドはオーバーロードでView名を指定するオーバーロードも用意されています。
なので、

``` C#
if(/*エラーがある場合*/)
{
/*何か処理*/ 

return View(“前画面”,xxx);
}else/*入力にエラーがないとき*/
{
/*何か処理*/ 

return View(“次画面”,yyy);
}
```

xxxとかyyyにはViewに渡したいモデルのインスタンスが入ります。

なので、画面遷移でViewメソッドを使ってどのViewにも返すことができました。
Viewでも検証用の属性を使えます。
Excel版Power Queryでデータの追記処理

#全体の概要
このネタを書こうと思う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/7c150d70-172a-90af-4547-db42e7f2620d.png)
この図の1~4はクエリの駆動順序を表しています

Power Queryはインメモリデータベースをexcelの外に作り
そこで制作したデータをEXCELに受け渡しをおこない
完了後にDBそのまま消去されます
逆に言えばEXCELはインメモリデータベース(a)の外に
テーブル形式でデータを保存する領域を持っているといえます
そしてそのテーブルの更新タイミング(④)はPower Queryの処理が完了した後に発生するために
②の過去の結果を取り込むという処理が可能になります

Power BIだと、Power Queryが動き始めた時点で
(a)（b)両方のデータが削除されるため再現できません

#作り方
今回の説明は外部データではなくexcelのセル上のデータを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/d5607ff9-3328-7249-9739-ac3a3552535e.png)
まずわかりやすいようにNOW関数で現在時刻をセル上に起きます(わかりやすいように1セルだけ入れます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/a85c01be-197c-f68b-833a-5dd65572c93c.png)
「テーブルまたは範囲から」でnow関数の入ったセルを取り込みを行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/fa661163-2da3-a2fe-f930-7c7a0fafd848.png)
このようにクエリをテーブルに書き出し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/96079ab3-f547-b78f-67dc-a24378d755a7.png)
さらに(a)を書き出したテーブルをクエリで取り込みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/8dc9d022-c458-f1e5-c1d4-fb74822d8e7e.png)
ここで

(a)のクエリに(b)のクエリを追加してやるとどうなるでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/1cf20f6c-758e-6f41-23eb-24092d4a04eb.png)
そうすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/d2f88a27-1663-c5ce-d391-2834a87cd433.png)
このように
赤い所が元データテーブルから読み込んだ最新の時刻
その下のデータは今まで更新ボタンを押した時刻になります

そしてクエリの更新設定から時間指定をしてやれば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/76dcf9e2-4774-be53-413a-19b46429713a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/76e122a6-dfa8-ecc4-0bc4-615b82022408.png)
そうすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/a32d7f2d-b5ea-95f8-ebba-164cab4a7544.png)
こんな感じに
ある程度定期的に更新しつつ前のデータを残して集めるということが割とできなくもありません

この自動取得状態に発生時間は
他の周りの動作次第で重ければ20～30秒ぐらい平気でずれるので
あんまりぴったり↓集計したい場合にはあまり使えません

##コード確認用ソース(使えない)
注：下記の物はコピペしても出力テーブルがないので動きません
なので、どのようなコードになってるかの確認用です

```text:クエリ：(a)
let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"列1", type datetime}}),
    追加されたクエリ = Table.Combine({変更された型, #"(b)"})
in
    追加されたクエリ
```

```text:クエリ：(b)
let
    ソース = Excel.CurrentWorkbook(){[Name="a"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"列1", type datetime}})
in
    変更された型
```

#消し方
取得したデータをクリアしたい時は
aの結果クエリを消して、aのクエリにnullを削除するフィルタを追加ください

#(a)の取り込みデータにエラーがあった場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/7c150d70-172a-90af-4547-db42e7f2620d.png)
①の取り込みが失敗すると④のテーブルの更新が行われないので
error前の状況で維持されます

読み込みファイルが他の人が開いていてエラーが出る
といった場合、それが終わってエラーが消えるまでテーブルは更新されません
Lenovo IdeaPad Duet ChromebookにVScodeをインストールする


**Lenovo IdeaPad Duet Chromebook** にVScodeの公式サイトのファイルを使ってインストールできなかったので、コミュニティビルド版サイトからインストールしました。起動確認済みです。

[Lenovo IdeaPad Duet Chromebook](https://www.lenovo.com/jp/ja/jpad/notebooks/ideapad/ideapad-chromebook-series/Lenovo-CT-X636/p/ZZICZCTCT1X?cid=jp:sem|se|google|g_b_brand_pc|b05_brand_series_ideapad|%2Blenovo%20%2Bideapad%20%2Bduet|b|10449050778|103146281669|kwd-898508301734|text|brand|&cid=jp:sem:google_g_b_brand_pc_b05_brand_series_ideapad_0000037613&gclid=EAIaIQobChMInovqj-)

2020年６月に出た製品なのでまだ情報が少なかったのですが、たぶんVScodeも入るでしょーというノリで購入した経緯となります。  

プロセッサが **Media Tek Helio P60Tプロセッサ(2.00GHz)** となっております

## 試してみたこと
全部失敗しました。成功した方法は次の項をご覧ください。

- 公式サイトからインストールした.deb パッケージを `マイファイル > ダウンロード` より実行  
→ `インストール中にエラーが発生しました` というメッセージが出て失敗する

- `sudo apt install .debファイル`　をターミナルで実行  
→ こちらも失敗。たぶん同じ理由だと思います。
以下のようなエラーが出ました。

```bash
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 code:amd64 : Depends: libnss3:amd64 (>= 2:3.26) but it is not installable
              Depends: apt:amd64 but it is not installable
              Depends: libxkbfile1:amd64 but it is not installable
              Depends: libsecret-1-0:amd64 but it is not installable
              Depends: libgtk-3-0:amd64 (>= 3.10.0) but it is not installable
              Depends: libxss1:amd64 but it is not installable
E: Unable to correct problems, you have held broken packages.
```
プロセッサがMedia Tekであることが関係しているのかなと思います。  
ARMのプロセッサをベースにしているみたいですけど、ちょっと仕様が違うのでしょう。

- Snapを経由する  
→ Snapを使ってインストールをした経験がないので手順が定かではありませんが、みなさんのインストール手順をみようみまねでやったものの、インストールできず。

## 成功した方法
[こちらの記事](https://www.webcyou.com/?p=8765)にてコミュニティビルド版というものの存在を知りました。  

[Community builds of Visual Studio Code](https://code.headmelted.com/)  

VScodeをマイナーなプラットフォーム向けに有志で調整してくれているみたいです。  
公式のレポジトリが更新されるたびに、コミュニティビルド版もパッケージを更新しているようです。（公式がアップデートされる都度インストールしなおせばよいのでしょうか？未確認です）

FAQによると、拡張機能も偏ったプロセッサにのみ対応でなければ**たぶん動く！**って書いてあります。  

### インストール方法
`Chrome OS` の `Native method` の [the Release page](https://github.com/headmelted/codebuilds/releases)からバージョンを選び `.deb` 形式のパッケージをダウンロード。  
ファイルを実行するとインストールが成功しました。  

ちなみに私が試したとき最新パッケージをインストールしたのですが、拡張機能がインストールできなかったので、1つ古いバージョンをインストールしなおしたところ、拡張機能も無事にインストールができました。
なにかのバグかもしれません。  
(インストール後に日本語入力できないって焦りましたが、Linuxに日本語入力が設定されていないためでした。そちらはまた別途）

## まとめ
Lenovo IdeaPad Duet ChromebookにVScodeをインストールしたくて失敗した３つの方法と、コミュニティビルド版をインストールする手順を示しました。
railsとcloudinaryでtextのオーバーレイを改行で入れたい

# この記事の目的

cloudinaryでtextをオーバーレイで入れる際に改行する

# 仕様

https://cloudinary.com/documentation/image_transformations#adding_text_captions

- 上記でtextをoverlayで入れて`%0A`を改行箇所に入れる。
- 変数が入る場合は下記のように一度変数に格納してから代入する。

```ruby
ogp_text = hogehoge + "%0A" + hogehoge
ogp_url = cl_image_path("sample.jpg",
  :transformation=>[
    {:width=>500, :crop=>"scale"},
    {:width=>470, :overlay=>{:font_family=>"Arial", :font_size=>25, :text=>ogp_text}, :crop=>"fit"}
  ],
  :sign_url=>true
)
```
Raspberry Pi SDカードイメージをLinux稼働PCから編集する

https://downloads.raspberrypi.org/raspios_arm64/ にあるSDカードイメージをUbuntuまたはDebian LinuxをインストールしたインテルPCで実行しパッケージの入れ替え・アップグレードなどを行う話です。[qemu-user-static](https://packages.ubuntu.com/focal-updates/qemu-user-static) と [systemd-nspawn](https://packages.ubuntu.com/focal-updates/systemd-container) を用います。64-bit版で話を進めます。32-bit版でも同様にできるはずです。Raspberry Piディスプレイ出力のハードウェアエミュレーションは無いです。以下すべてインテルPCのUbuntuまたはDebianのrootプロンプトで実行します。

# パッケージインストール

`apt-get install qemu-user-static systemd-container` で必要パッケージをインテルPCにインストールします。

# Raspberry Pi用Ubuntuイメージのダウンロードと展開

https://downloads.raspberrypi.org/raspios_arm64/ からイメージファイルをダウンロード・展開して `/var/tmp` （など）に置きます。このイメージファイルには２つのパーティションがあり、大きさなどを `fdisk` コマンドで確認できます。

# loopデバイスのセットアップ

`losetup -P -f /var/tmp/2020-05-27-raspios-buster-arm64.img` で１，２番目のパーティションをインテルPCからデバイスファイルとして見られるようにします。こうすると `/dev/loop0p1` が１番目のパーティション、 `/dev/loop0p2` が２番目のパーティションになります。

# マウント

`mount -o async,lazytime,discard /dev/loop0p2 /mnt;`
`mount -o async,lazytime,discard /dev/loop0p1 /mnt/boot` でSDカードイメージのパーティションがマウントされます。

# Raspberry Server のルートプロンプト

`systemd-nspawn -D /mnt -a` でRaspberry Pi OSのルートプロンプトが出ます。パッケージの削除やインストール、設定などをここから行うことができます。使い終わったらumountとlosetup -Dでパーティションのマウントなどを解除します。

# パーティションの拡大

`apt-get dist-upgrade` などするとパーティションの大きさが足りず失敗することがあります。そのような場合

```shell-session
# umount /mnt/boot
# umount /mnt
# losetup -D
# dd seek=10000000 count=1 conv=notrunc if=/dev/zero of=/var/tmp/2020-05-27-raspios-buster-arm64.img
```

でイメージファイルを5GB (10000000 × 512バイト）に拡大することができます（新しいサイズが5 GBになる）。`seek` の数値を調整すれば`dd`後のサイズが変わります。イメージファイルを拡大したあと、[GParted](https://packages.ubuntu.com/focal/gparted) を用いて

```shell-session
# losetup -P -f /var/tmp/2020-05-27-raspios-buster-arm64.img
# gparted /dev/loop0
```

で、イメージファイルの中にあるパーティションを拡大します。
AWS EC2でKong

AWS EC2でKongを利用してみようとしたら躓いたのでメモ。

[aws market place](https://aws.amazon.com/marketplace/pp/Kong-Inc-Kong/B06WP4TNKL)にあるものを使うとインスタンスの起動までしてくれる。便利。

Kongの記事で「nanoでもすごい性能を発揮したよ！」（参照：[Kong、他社API管理製品の14倍の性能を実測](https://www.webapi.tokyo/kong%E3%80%81%E7%AC%AC%E4%B8%89%E8%80%85%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%A7%E3%80%81%E4%BB%96%E7%A4%BEapi%E7%AE%A1%E7%90%86%E8%A3%BD%E5%93%81%E3%81%AE14%E5%80%8D%E3%81%AE/)）と出てたので、nanoでも動くと思ってインスタンスを作ってみた。
ただ、sshで入っても動いている気配がない。

仕方なく、とりあえず「ベンダーおすすめ！」らしい、「c3.8xlarge」にしてみる。東京リージョンは毎時約2ドル、月で約1,440ドル、日本円で約16万円とかするので動かしっぱなしにはできない。

```bash
$ ps aux | grep -i kong
ec2-user   4913  0.0  0.0 432252 14048 ?        Ss   12:01   0:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx -p /usr/local/kong -c nginx.conf
```
どうやらこちらは動いている。nanoのときは出てこなかった行だ。
[こちら](https://www.aizulab.com/blog/install-kong/)を参考にコマンドを叩いてみても、ちゃんと動いているっぽい。

ささっと「c3.8xlarge」インスタンスをterminateして、安くて動くものを探す旅に出る。

# 結論

けっこう長い旅でした。
時間あたりの価格が安いものから試していってみた結果、「**t3.medium**」インスタンスならばどうやら動く、という結論に達しました。1日(24時間)あたりなら、約138円。開発時に作って使ってサッと消す、であればそこまで高額ではないですね。
表は東京リージョンのもの。ドル円相場は2020年7月26日現在で取得した値、1ドル=106.13円で換算。月の稼働時間は744時間で換算(31日×24時間)。

|インスタンスタイプ|ドル/毎時|RAM(GB)|月額|結果|
|---|--:|:-:|--:|:-:|
|t3.nano|$0.007|0.5|553円|×|
|t3.micro|$0.014|1|1,105円|×|
|t3.small|$0.027|2|2,132円|×|
|**t3.medium**|$0.054|4|4,264円|○|
|c4.8xlarge|$2.016|60|159,185円|○|

# なんで動かないのか

```
$ cassandra

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000cf600000, 815792128, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 815792128 bytes for committing reserved memory.
```

Cassandraを実行するのにメモリが足りないので。
PostgreSQLを使うんであれば、もっと下のインスタンスでも行けるかもしれない。
ワンタッチで使えるインスタンスを用意したいのであれば、 `t3.medium` 以上を選びましょう。

# 参考
[API GatewayのKongをインストールしてみた](https://www.aizulab.com/blog/install-kong/)
Kongの設定コマンドがとても素敵にまとまっています🤩
リストとジェネレータ（データサイエンスの観点から）


Pythonを勉強し始めると，初期にはリスト”[ ] ”表記を学びます．
そしてだんだんと，リストの内包表記を学び始めて効率的なコードが書けるようになります．
そして次には，「ジェネレータが便利だよ！」という声が耳に入りますが，結局ジェネレータってなんなん・・・となるのではないでしょうか．
このジェネレータの便利な点の初歩をまとめました．

# ジェネレータの意義
ジェネレータを用いる意義の１つとしてあげられるのが

・使用メモリ量を抑えられる

という点です．これがリスト表記との決定的な違いであり，データサイエンスで大量のデータを読み込む必要があるときに効力を発揮します．

# ジェネレータ表記

```list_comprehension.py
>>> [2 * num for num in range(5)]
[0, 2, 4, 6, 8]
```

```generator_object.py
>>> (2 * num for num in range(5))
<generator object <genexpr> at 0x109ce7840>
```

上と下の違いは，外側の括弧が"[]"であるか"()"であるかです．
そしてこの違いは，上がリストを返したのに対して，下はジェネレータオブジェクトを返すことになりました．
どちらも繰り返し可能（iterable）なので中のデータを取り出すことができます．

例えば．．．

```test.py
result = (num for num in range(5))
for num in result:
    print(num)
```
```
0
1
2
3
4
```

```test2.py
result = (num for num in range(5))
print(list(result))
```
```
[0, 1, 2, 3, 4]
```

一点厄介なのが，リスト表記と違って，index指定でデータが取り出せないことです．
したがって，"next()"を使って１つずつ取り出すことになります．

```test3.py
result = (num for num in range(5))
```
```
>>> print(next(result))
0
>>> print(next(result))
1
>>> print(next(result))
2
>>> print(next(result))
3
```

「こんなことしか出来ないなら，リストの内包表記でいいじゃｎ．．」
となるかもしれません．
さてここからが重要です．まだ数が少ないからよいものの，大規模なデータを扱う際にリストの内包表記でそれが出来るか？という問題があります．

```
>>> [num for num in range(10**100000000)]
```
は実行不可能ですが

```
>>> (num for num in range(10**100000000))
```
はＯＫです．
つまりこうすることで，「ジェネレータオブジェクトを作成」し，あとはここからポンポンとデータを取り出していくようなイメージですね．
これでメモリ使用量を抑えることが出来るため，大規模データにも対応できることになります！
例えば内包表記を使って

```test.py
even_nums = (num for num in range(5) if num %2 == 0)
print(list(even_nums))
```
```
[0, 2, 4]
```
などと取り出せますね．
【PHP】2次元配列をキーを指定して並べ替える関数

###array_multisortより便利？
array_multisortがあまり理解できていないのが悪いですが、とりあえずユーザ定義関数を作った。

キーを指定して、そのキーの値を基準に並べ替えができるように。

課題は某サイトで与えられたもの。

```
<?php
    // 自分の得意な言語で
    // Let's チャレンジ！！

    [$x, $y] = explode(" ", trim(fgets(STDIN)) );
    $k = trim(fgets(STDIN));
    
    $num_data = trim(fgets(STDIN));
    
    for($i = 0; $i < $num_data; $i++ ) {
        [$xi, $yi, $price] = explode(" ", trim(fgets(STDIN)));
        $datas[$i]['x'] = $xi;
        $datas[$i]['y'] = $yi;
        $datas[$i]['price'] = $price;
        $datas[$i]['distance'] = ( $x - $xi )**2 + ( $y - $yi )**2;
    }
    
    $sum = 0;
    $sorted = val_sort($datas, 'distance');
    for( $i = 0; $i < $k; $i++ ) {
        $sum += (int)$sorted[$i]['price'];
    }
    $ave = $sum / $k;
    
    echo $ave .PHP_EOL;
    
    function val_sort($array, $key) {
    // Loop through and get the values of our specified key
        foreach($array as $k=>$v) {
            $b[] = $v[$key];

        }
        asort($b); // キーと要素を維持しつつ昇順
        foreach($b as $k=>$v) {
            $c[] = $array[$k]; // 展開される順番にキーを取り出して元の配列のキーに指定して代入し直す
        }

        return $c; // 代入し直した配列を返す
    }
?>
```

###勉強になったこと
配列の展開をするときにforeachを使えるのは知っていたけど、キーも一緒に取り出して、そのキーをうまく使うと便利になるものだなということ。
Vue3 の<teleport>の 遷移先を指定する prop は `target` ではなく `to` である

新機能 `teleport` について、いろいろな記事で `<teleport target="selector">` と紹介されていますが、
`<teleport>` の prop は `target` ではなく `to` のようです(少なくとも 2020 年 7 月時点では)。
ref. [vue-next/packages/runtime-core/src/components/Teleport.ts](https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/components/Teleport.ts#L17)

```App.vue
<teleport to="#target">
  <div>teleport</div>
</teleport>
```

また、遷移先は `<div id="app">` の外側ではないといけません。
ref. [issues/992](https://github.com/vuejs/vue-next/issues/992#issuecomment-616126089)

```index.html
<body>
  <div id="app"></div>
  <div id="target"></div>
</body>
```
以上。
ディープラーニングと物理学でPythonを勉強する①(画像処理)

#1.はじめに
numpyを使って画像を処理する．
#2.目次
1.はじめに
2.目次
3.とある思考実験
4.コード
5.まとめ
参考
#2.とある思考実験
[この本](https://www.kspub.co.jp/book/detail/5162620.html)の中にとある思考実験が乗っている．その内容は妖精が目の前のボタンを一分ごとに押す/押さないを選択する事を繰り返し五日間，徹夜で作業させてその結果を行列で表現すると人の顔になっていると言うものである．この妖精は物理学で言うマクスウェルの悪魔である．

![publicdomainq-0006273zkn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657554/fcdf2a99-1be7-12cb-740a-30676bb4ae43.jpeg)


この労働は労働基準法に明らかに違反している．
_____
第32条 　
使用者は、労働者に、休憩時間を除き一週間について四十時間を超えて、労働させてはならない。
使用者は、一週間の各日については、労働者に、休憩時間を除き一日について八時間を超えて、労働させてはならない。
____
しかし，妖精に労働基準法が適用されるか不明なので気にしない事にする．今回，妖精が作り出した画像はlenna画像と呼ばれるサンプルデータである．今回は[こちらのサイト](http://www.ess.ic.kanagawa-it.ac.jp/app_images_j.html)のものを使用した．これを使って画像処理を行う．

#4.コード
Pillow(PIL)とnumpyを用いて画像をnumpy配列にする．

```python
from PIL import Image
import numpy as np


# PILでcat.jpgを開いてグレースケール画像に変換し、NumPy配列に変換
im = np.array(Image.open("画像のパス名").convert('L'))

# NumPy配列のshapeと、要素のデータ型を表示
print(im.shape, im.dtype)

# グレースケール化した画像のNumPy配列に変換したものを表示
print(im)

# 上記NumPy配列をテキストで保存
np.savetxt('im_lenna.txt', im)
```
```
(150, 150) uint8
[[164 163 161 ... 132 154 164]
 [160 160 159 ... 136 146 141]
 [157 157 156 ... 105  80  61]
 ...
 [ 54  55  54 ...  53  58  64]
 [ 51  49  50 ...  59  72  83]
 [ 49  48  52 ...  71  89 100]]
```
150×150=22500なので

```python
im2 = im.reshape([1, 22500])#一次元配列に変更
np.savetxt('im_lenna.txt', im2)# 上記NumPy配列をテキストで保存
lenna = np.loadtxt('im_lenna.txt')# 上記で保存したNumPy配列を読み出す
print(lenna)
```

```
[164. 163. 161. ...  71.  89. 100.]
```
これを画像として出力する．

```python
import matplotlib.pyplot as plt
%matplotlib inline
plt.imshow(lenna.reshape(150,150), cmap=plt.cm.gray_r)
```
![lennaグレー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657554/96ce7183-146d-46a6-978d-46a47bfae129.png)


また，これと比較するためにランダムに数字をふった画像を出力する．

まず，この画像は

```python
print(lenna)
print(lenna.shape)
print(max(lenna))
```
```
[164. 163. 161. ...  71.  89. 100.]
(22500,)
236.0
```
を用いて，ランダムに値を代入する．

```python

import random

random_lenna = [random.randint(0, 236) for i in range(len(lenna))]
random_lenna_n = np.array(random_lenna, dtype=float)

print(random_lenna_n)
```
```
[117.  92.   1. ...  88.  12.  55.]
```
これを画像として出力する．

```python
plt.imshow(random_lenna_n.reshape(150,150), cmap=plt.cm.gray_r)
```

![lennaランダム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657554/cfc2351a-e275-0bfc-0d99-32944b764707.png)



#5.まとめ
本の中では妖精がボタンを押す/押さないの二つの値であったが，今回のコードは0から236までの値を入れる作業を行った事に対応する．妖精が適当に数字を選んでいくと2枚目の画像のような典型的状態になるはずだが，妖精(マクスウェルの悪魔)は2枚目のような例外的状態を作り出している．ご指摘，コメントなどをいただけたら幸いです．

参考

[ディープラーニングと物理学　原理がわかる、応用ができる](https://www.kspub.co.jp/book/detail/5162620.html)

https://ja.wikibooks.org/wiki/%E5%8A%B4%E5%83%8D%E5%9F%BA%E6%BA%96%E6%B3%95%E7%AC%AC32%E6%9D%A1

https://i-doctor.sakura.ne.jp/dokuwiki/doku.php/%E7%94%BB%E5%83%8F%E3%82%92numpy%E9%85%8D%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B

http://www.ess.ic.kanagawa-it.ac.jp/app_images_j.html

https://publicdomainq.net/fairy-silhouette-0006273/
pythonでJIS X 0208をShift-JISやUTF-16に変換する

あることでJISコードを日本語変換したくなったときのやり方が分からなかったのでメモ。

# 方法
公開されているJIS X 0208コードの変換表を用いて連想配列を作成する
下は対応表
> http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT
> http://ash.jp/code/unitbl21.htm

# プログラム
```python:jis.py

import os
ar = []
with open('./JIS0208.TXT') as f:
    for t_line in f:
        # 先頭がコメントの部分は除く
        if t_line[0] != "#":
            sjis, jis, utf16 = os.path.basename(t_line).split('\t')[0:3]
            ar.append([jis, utf16])
# 例) ar['0x3B3D'] -> '0x8695'
# JIS -> UTF-16
ar = dict(ar)
```

# 実行するとき
JISコードの3B3Dから"蚕"を出力する
0x3b3dだとエラーが出るので、0x3B3Dにするため文字を大文字に変換する。

```python:jis.py

print(chr(int(ar['0x'+'3b3d'.upper()], 16)))
```
```python:terminal
$ python jis.py
蚕
```
Flutterでリストとスクロールしないグリッドを組み合わせる

Flutterでアプリ開発をしていてリストのセクション内のアイテムをグリッド状に表示したい場面があり、実装できたので紹介します。

## 使うWidget

実装に使うWidgetは以下の３つです。

- CustomScrollView
- SliverList
- SliverGrid

CustomScrollViewの中にSliverListとSliverGridを子Widgetとして格納します。

## CustomScrolView

CustomScrollViewには表示したいWidgetを格納します。

今回はSliverListとSliverGridを格納します。

Sliver系のWidget以外も配置することが可能です。

## SliverList

SliverListはパラメータにSliverChildListDelegateを設定します。

SliverChildListDelegateのパラメータには表示したいWidgetの配列を格納します。

```dart
SliverList(
  delegate: SliverChildListDelegate(
    [
      ...,
    ],
  ),
)
```

## SliverGrid

SliverGridはパラメータにSliverChildListDelegateとSliverGridDelegateWithFixedCrossAxisCountを設定します。

SliverChildListDelegateはSliverListと同様に表示するWidgetの配列を格納します。

SliverGridDelegateWithFixedCrossAxisCountは一列に表示する要素の数を設定します。

```dart
SliverGrid(
  delegate: SliverChildListDelegate(
		[
		...,
		]
	),
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
  ),
)
```

## 実装例

```dart
CustomScrollView(
    slivers: [
      SliverList(
        delegate: [
					...
				],
      ),
      SliverGrid(
        delegate: [
					...
				],
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
        ),
      ),
    ],
  );
}
```

SliverListとSliverGridを組み合わせることで簡単に実現したいレイアウトを実装することができました。

ネイティブでは結構面倒なこともFlutterを使えば簡単に実装できるのもFlutterの良いところだと思います。
FacebookをAuthyで2段階認証する



Facebookのアカウント乗っ取りが猛威を振るっているようなので、セキュリティ周りの見直しを実施しました。
具体的には
・信頼できる連絡先の追加
・2段階認証
・メールアドレスの非開示設定
を実施しました。

予防安全的な2段階認証について、Authyとの連携について記事が少ないので記載します。
Authyですが、AWSのログイン時に使用していましたが、スマホ紛失時の対応もあり、良さそうです。
[こちら](https://qiita.com/garakutayama/items/33f78c932e817bcb8b22)の方がメリットを解説しています。

####1.Authyをスマホ上にインストール&設定
[このあたり](https://excesssecurity.com/authy/)が参考になります。

####2.Facebookの2段階設定
右上の▼のマークより、セキュリティとログイン→2段階認証→認証アプリ読み込み
スマホからQRコードを読みこみ、認証アプリ(Authy)の表示コードを入力して完了。
俺々なCSV／TSVデータ作成ツールを作ったので公開した

【追記：2020年8月1日】 UTF-8(BOM無し)に対応しました。

業務でテスト用のCSVファイルを作成することがよくあるので、自分でツールを作成しました。
TSVにも対応しています。

# 基本仕様
・1行目がカラム行
・2行目以降がデータ行
・出力形式　：CSV、TSV
・文字コード：UTF-8(BOM無し)、UTF-8(BOMあり)、SJIS
・改行コード：CRLF、CR、LF

# 動作イメージ
<img src="https://loglog.xyz/wp-content/uploads/2020/07/csv_create.gif" alt="" width="1214" height="421" class="alignnone size-full wp-image-2147" />
・3シート（要求・要件、設計、ファイル出力）以外をデータ出力シートとして扱います。
・「出力フォーム」をクリックして表示されたフォームで、
　一括出力か個別出力でファイルを生成します。
・生成時の設定（文字コード、改行コード、出力形式）はデフォルト値が設定されています。
　必要であれば変更して出力します。
・CSVファイルはツールと同じフォルダ階層に出力されます。
・既にファイルが生成済の場合、タイムスタンプを付与したファイル名で保存します。

# ダウンロード
他の方にも使っていただけるように、GitHub に公開しています。
もし改良が必要であれば、ぜひコメント下さい！

<a href="https://github.com/TakumiKondo/vba_tools/blob/master/CSV%E4%BD%9C%E6%88%90/CSV%E4%BD%9C%E6%88%90.xlsm" rel="noopener noreferrer" target="_blank">Github : vba_tools/CSV作成/CSV作成.xlsm</a>
<img alt='' class='alignnone size-full wp-image-2149 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f1d6e1a87606.png' />
＜Airtable＞スプレッドシートからAirtableへPOSTする(GAS)



毎日、あるスプレッドシートの値をAirtableに送るためのスクリプトを書いたので、メモとして残します。


結論
----------------------------


      var YOUR_API_KEY = "あなたのKEYを入れてください"
      var obj = {
        'fields': {
          "Airtableの項目名1": "値1",
          "Airtableの項目名2": "値2",
          "Airtableの項目名3": "値３",
        }
      }
      
      var headers = {
        'Authorization': 'Bearer ' + YOUR_API_KEY,
        'Content-Type': 'application/json'};
      var data = JSON.stringify(obj);
      var options = {
        'method' : 'post',
        "headers" : headers,
        'payload' : data
      };
      
      var response = UrlFetchApp.fetch('https://api.airtable.com/v0/データベースID/テーブルID',options);
新卒プログラマの学習ログ　〜　其の一　〜

#本記事の目的
基本的には自分用の学習ログとして投稿していきます。

そのため、誤った解釈や方法をとっている可能性があることは否めません。
ご指摘いただければ修正し、今後の学びで気づくことがあれば随時加筆していきます。

#投稿者の背景
今年度より外資系IT企業で新卒エンジニアとしてのキャリアをスタートしました。 

With Covid-19で新卒入社から完全リモート勤務という、 この状況下でプログラマとして成長をしていけるように色んなことを模索しています。

大学でもプログラミングは学んできましたが、実務経験は皆無なのでまだまだわからないことだらけです。

業務に関わる内容や取り組みはもちろんここに書くことはできませんが、自学的に取り組んだことを今後書き留めて行きたいと思います。

#Android アプリ開発
アンドロイドでアプリを開発するのであれば、Android StudioはIDEとして優秀なツールです。

その基礎構築としてGoogleが提供しているCodelabsは非常に有効な学習ツールとなるでしょう。
(https://codelabs.developers.google.com/)

そのため本記事においてもCodelabsにあるAndroid Studioによる、基礎構築講座を通して学習を勧めていきます。
(https://codelabs.developers.google.com/android-kotlin-fundamentals/)

内容は全文英語となっていますが、図も多く使用して説明があるため、特に詰まることなく進めることができると思います。


#環境
- Mac OS Catalina
- Android Studio 4.0.1

環境構築はこのサイトを参考にしてすんなりできました。
(https://akira-watson.com/android/adt-mac.html)

#Hello Worldから始めよう！
やはりプログラミングで何か始めるならこれからですかね。
Codelabs
Android Kotlin Fundamentals 01.1: Get started
の手順に従って進めれば簡単に表示することができました。




# 初学者から一人前まで、、
ここでは一人前のプログラマの定義を
「おおよそ自力で様々なツールを活用しながら、ある程度思い通りの実装ができること」
とします。

また、人生においてプログラミングに向き合う時間として、現時点で2000時間取り組めればある程度の基盤が備わると仮定しています。
（言語やツールに依存しない思考法や情報収集能力）

プログラミングは大学で学んで来ましたが、特に根詰めてやってきていないので、ノーカウントとして取り組みます。

現在までの研修を含めて
**およそ320時間**
どんどん更新していきます。

### これまで取り組んだ内容
- C言語
    - 基礎的な文法理解
    - Atmel Studio を使用した組み込み開発
        - データシートから複数のデバイスの組み込み機器の実装
        - I2C通信によるデバイス制御
        
- Java
    - 基礎的な文法理解
    - オブジェクト指向
    
- Kotlin
    - 基礎的な文法理解
    - Android Studioによるアプリ開発
centos Ansible ssh有効化



・keypair作成（client）
$ssh-keygen -t rsa -b 4096


$ mkdir ~/.ssh
$ chmod -R 700 ~/.ssh
$ vi ~/.ssh/authorized_keys 
$ chmod 600 ~/.ssh/authorized_keys



・sshd_config設定
$ sudo vi /etc/ssh/sshd_config

Port 49152 #デフォルト：#Port 22
PermitRootLogin no #デフォルト：PermitRootLogin yes
PubkeyAuthentication yes #デフォルト：#PubkeyAuthentication yes
PasswordAuthentication no #デフォルト：PasswordAuthentication yes


・firewalld穴空け
$ sudo firewall-cmd --add-port=49152/tcp --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-port
22/tcp

・service再起動
$ sudo systemctl restart sshd
$ sudo systemctl status sshd

・
$ sudo dnf install -y policycoreutils-python-utils
$ sudo semanage port --add --type ssh_port_t --proto tcp 49152
$ sudo semanage port --list | grep ssh
ssh_port_t                    tcp      49152, 22
$ sudo systemctl restart sshd
$ sudo systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat yyyy-MM-dd hh:mm:ss JST; ●h ●min ago
MacにLaravelインストールしたメモ

この度初めてMacを購入してLaravelの環境構築を行ったのでメモ。調べながらトライしてなんとか完了。が、２つハマったポイントがありました。

###１.　システム環境
　　・macOS Catalina10.15.6

　　　すべてMacのターミナルで作業。
　　（ちなみにハマった理由の１つがOSのverとターミナルが関係。）
###２.　手順

　　Ⅰ.Composerインストール
  　　以下を実行。

```
curl -sS https://getcomposer.org/installer | php
```

つぎにcomposerをどの作業場所からでも呼べるように設定。

```
mv composer.phar /usr/local/bin/composer
```
インストール後,以下のコマンドで

```
composer
```

```   
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.10.9 2020-07-16 12:57:00
```

上記表示されれば正常にインストール完了。


　　Ⅱ.Composerを使ってLaravelインストーラーをインストール

  　　以下を実行。

```
composer global require "laravel/installer"
```
※ハマりポイント１
しかし、ここでエラー出てしまいました。どうもmacにはじめからインストールされているPHPではext-zipに対応してませんよ、ということらしい...（Problem1の2段目の部分）

```
Changed current directory to /Users/ryo3110/.composer
Using version ^3.2 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for laravel/installer ^3.2 -> satisfiable by laravel/installer[v3.2.0].
    - laravel/installer v3.2.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.


Installation failed, deleting ./composer.json.
```

これをPHPをインストールし直すことで対応。MacにはHomebrewというパッケージ管理システムがあるのでこちらを利用する。

以下のコマンドでHomebrewをインストール

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
インストールできたらbrewコマンドでphpをインストールする。普段を使用しているので7.4にした。ここは使い慣れているver.でいいはず。

```
$ brew install php@7.4
```
インストールできたら改めてLaravelインストーラーのインストールを試みる。

```
composer global require "laravel/installer"
```

無事インストーラーのインストール完了。

Ⅲ.Laravelコマンド使えるようにパスを通す

この時点ではターミナル開いてすぐにLaravelコマンドが使えないのでパスの設定を行う。以下を実行。

```
echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
```
.bash_profileを読み込み。

```
source ~/.bash_profile
```

これでターミナルにlaravelと打てばlaravelコマンドが使える。

※ハマりポイント２
しかしターミナルをと閉じると使えなくなってしまう...どうもパスの設定が保存されていないのではと考えひたすら調べる。。。

https://www.infoq.com/jp/news/2019/07/macos-ditches-bash-for-zsh/

どうやらCatalinaから標準シェルがbashからzshに変わっていることで.bash_profileを読み込まないのが原因と判明。（Mac初めて買ったのに、変わってるとかそんなん知らん...）後ほど気づいたのですが、そもそも使用不可のコマンド打ったとき、**zsh**: command not foundと表示されるのでちゃんと確認しておくべきでした...

ともあれ、原因わかったので再度トライ。従来のbashにも設定できるようだが、Appleがzshに切り替えたということで今後しばらくその方針になることを考えて、zshを使う方針で対応。

ターミナルのホームディレクトリに.zshrcをつくる。（vimで作業）

```
vim .zshrc
```
下記を入力し保存する。

```
export PATH=$PATH:~/.composer/vendor/bin
```

これでなんとかターミナルを閉じてもすぐにLaravelコマンドが使えるようになった。
AWS認定 ソリューションアーキテクト プロフェッショナル（SAP-C01）に合格しました。

AWS認定のアソシエイト資格3種類合格したので
より知識の定着を図るために
AWS認定 ソリューションアーキテクト プロフェッショナル（SAP-C01）を続けて受験し合格しました。

#合格時のAWS歴
（業務歴的には）半年
個人学習歴的には1年程度


#点数推移
1回目→728点（2020-05-31）
2回目→840点（2020-07-26）

#難易度について
他の方もまとめている通り、難易度が高いです。
問題文と選択肢がSAAの比ではなく長文かつ、
最適なソリューションを選択肢を比較して（怪しい日本語を）咀嚼して回答しなければなりません。
試験時間（180分）はかなり長いですが、それでも厳しい時間制限です。（75問あるので、1問にかけられる時間は3分）

#勉強法
勉強期間は、合計で4か月程度（集中すればもっと短縮できたはず）

SAAと違ってBlackBeltで概要をつかむだけでは合格は厳しいかと思うので
可能であれば、実際にマネジメントコンソール上で操作して勉強したいのですが、
SAPはDMSなどの移行サービスも試験範囲に含まれたり、Organizationsのエンタープライズ組織前提の設計も試験範囲に含まれるので
個人利用だと難しい部分があるように思いました。
※業務で触った分野はやはり理解度が違います。

書籍であれば[AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説]
(https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E8%A9%A6%E9%A8%93%E7%89%B9%E6%80%A7%E3%81%8B%E3%82%89%E5%B0%8E%E3%81%8D%E5%87%BA%E3%81%97%E3%81%9F%E6%BC%94%E7%BF%92%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC-%E5%B9%B3%E5%B1%B1-%E6%AF%85/dp/4865942483/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=AWS&qid=1595762428&s=books&sr=1-4)
が現状唯一の問題集になりますが、本番のレベル感に近いのでおすすめです。（こんなに綺麗な日本語では出ないので、英語ができる方は本番は英語で解いた方が簡単かもしれません。）

ネットの問題集だと[whizlabs](https://www.whizlabs.com/login/)をグーグル翻訳しながら解きました。

問題解いて分からなかった部分を自分なりにまとめたり、検証してみるのが合格への近道かと思いました。（当然ですが）

#補足：AWS SAA合格後に次に直に受験する方が特に勉強すべきと思われる部分

[試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-pro/AWS-Certified-Solutions-Architect-Professional_Exam-Guide.pdf)内の、
分野 1: 組織の複雑さに対応する設計
→Organizationsの実装レベルの理解（マルチアカウント前提の設計）
分野 2: 新しいソリューションの設計
→サーバレスアーキテクチャのある程度の実装レベルでの理解（概要レベルだとあやしい）
→DR設計が概要レベルで理解（パイロットライト、RTO・RPOなど）
→オンプレミスの既存サイトとの連携・設計
→Cloudformationの用語がわかること
分野 3: 移行の計画 
→移行関係のマネージドサービスの理解
分野 4: コスト管理
→ワークロードに最適なインスタンスをある程度理解している（この状況なら、リザーブドインスタンスを使用すべきなど）
Google ColabにMeCabとipadic-NEologdをインストールする

#1.はじめに
　**Google Colab** に **MeCab** と **ipadic-NEologd** をインストールしようと思ったら意外に手間取ったので備忘録として残します。

#2.コード
　色々なWeb情報を漁った結果、インストールには下記のコードがベストではないかと思います。

```python 
# 形態素分析ライブラリーMeCab と 辞書(mecab-ipadic-NEologd)のインストール 
!apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl python-mecab > /dev/null
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git > /dev/null 
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n > /dev/null 2>&1
!pip install mecab-python3 > /dev/null

# シンボリックリンクによるエラー回避
!ln -s /etc/mecabrc /usr/local/etc/mecabrc
```

　辞書のパスの確認

```python
!echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
```

　動作確認

```python
import MeCab

m = MeCab.Tagger()
sample_txt = "彼女はペンパイナッポーアッポーペンと恋ダンスを踊った。"
print("Mecab:\n", m.parse(sample_txt))

path = "-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd"
m = MeCab.Tagger(path)
print("Mecab ipadic NEologd:\n",m.parse(sample_txt))
```


（参考）
[google colab で mecab-ipadic-NEologd を使おうとしたら mecabrc がないと error が出る場合の対処法](https://hakasenote.netlify.app/20200719-mecab-neologd-in-colab/)
[hurutoriya/colab-mecab-ipadic-NEologd.ipynb](https://gist.github.com/hurutoriya/1c417853a723206d5deb19b5083538ff)
discord.pyを1.3.4にしなきゃ動かなくなったってお話

# 経緯
先日discord APIのアップデートが入り、バージョン1.3.4以前のdiscord.pyでは、以下のようなエラーが発生して動作しなくなってします。

```python
TypeError:__new__() got an unexpected keyword argument 'deny_new'
```
(なんか1.2.5の時も似たようなのありましたね。`KeyError`でしたっけ？)

# 解決法
discord.pyのバージョンを1.3.4以上にしてあげてください(記事掲載時点での最新は1.3.4)。
ちなみに現在のバージョンを確認するには、コンソール上でPythonのインタプリタ(対話モード)を開き、以下のコマンドを実行してください。

```py
>>> import discord
>>> print(discord.__version__)
1.3.4
```
この場合は記事執筆時点で最新の、1.3.4がインストールされています。
今この記事を見ている人の大半は1.3.4以前のものを使っていると思いますので、1.3.3など違う出力になっていると思います。
バージョンを上げることができれば何でも大丈夫ですが、以下にいくつか方法を提示しておきます。

## Herokuの場合
Herokuの場合は`requirements.txt`というファイルでライブラリを管理しているため、このファイルを編集して上げる必要があります。
以下が例です。

```tex:requirements.txt
discord.py>=1.3.4
```
requirements.txtの書き方については、我らが味方note.nkmk.meが解説していますので、興味がある方は是非。
https://note.nkmk.me/python-pip-install-requirements/

また、Herokuの場合、requirements.txtに記述したライブラリが自動でアップデートされるわけではないため、1.3.4のリリース後にデプロイをしていない場合、gitでコミットを行いデプロイして上げる必要があります。
「何いってんのかよくわかんねぇよ！」って人は上の通りにrequirements.txtを更新するだけでも大丈夫です

## Windowsの場合
Windowsの場合は、以下のコマンドをコマンドプロントで実行すればdiscord.pyを更新することが出来ます。
1.3.4が入らない場合は`discord.py`の部分を`discord.py==1.3.4`に変更するなどしてみてください。

```sh
py -3 -m pip install -U discord.py
# voice関係のものを使っている場合
py -3 -m pip install -U discord.py[voice]
```

## Linux or Macの場合
以下のコマンドをターミナルで実行してみてください。なお筆者はMacを持っていないためMacの仕様はよくわかってません。

```sh
python3 -m pip install -U discord.py
# Windowsの場合と同様にvoice関係の物を使っている場合
python3 -m pip install -U discord.py[voice]
```

# 終わりに
いかがでしたでしょうか。
「久しぶりにbotを起動したけど動かない！」みたいな方の手助けになったなら幸いです。
執筆が初めてなので、拙い箇所が多々あるかもしれませんがご容赦ください。

最後に、私がよく出没しているdiscordサーバのリンクを貼っておきます。
[Discord Bot Portal JP](https://discord.gg/FWw6VqQ) 
disocrd botについての質問などができるサーバですので、bot制作で躓いていたら参加してみると良いかもしれません。

Happy coding!
SwiftのErrorのlocalizedDescriptionをカスタマイズする

## SwiftのError

APIなどでエラーが発生した際にどのようなエラーになっているかをハンドリングするプロトコルです。
任意のenumを作成してErrorに準拠させます。

```swift
enum SomeError: Error {
		case hoge
		case fuga
}
```

## カスタマイズする利点

localizedDescriptionをカスタマイズすることでエラーメッセージを表示する際にわざわざエラー処理用のクラスを作る必要がなくなり、エラーをキャッチした際のダイアログの表示ロジックがシンプルになり可読性が向上します。

## LocalizedErrorに準拠する

localizedDescriptionをカスタマイズするにはErrorの他にLocalizedErrorに準拠させる必要があります。

```swift
enum SomeError: Error, LocalizedError {
		case hoge
		case fuga

		var errorDescription: String? {
        switch self {
        case .hoge:
            return "hoge Error"
        case .fuga:
            return "fuga Error"
        }
    }
}
```

LocalisedErrorに準拠させてerrorDescriptionにエラーメッセージを返すことでlocalizedDescriptionをカスタマイズすることができます。

**localizedDescriptionにメッセージを返してもlocalizedDescriptionにメッセージは渡らないので注意してください。**

## まとめ

localizedDescriptionをカスタマイズすることでエラーをthrowするだけでカスタマイズされたメッセージをダイアログなどに表示できてメッセージの管理クラスなどを実装しなくて住むのでコード量が減って可読性が向上するのでおすすめです。

Rxswiftでエラーが流れてきたときの処理もシンプルになるのでとても良いと感じました。
S3バケットポリシーでエラーが出た際の対応【this policy contains invalid Json】

S3のバケットポリシーの登録で、一見問題なさそうなコードにエラーが出て少しはまりました。

## エラー内容
this policy contains invalid Json
[画像]([![Screenshot from Gyazo](https://gyazo.com/9697b735d2fe4fa937c974c5f40da800/raw)](https://gyazo.com/9697b735d2fe4fa937c974c5f40da800))

## コード
```
{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::IAMユーザーのarn情報:user/IAMユーザー名"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::バケット名"
        }
    ]
}
```
日本語訳は「無効なJsonデータ」とのこと。文法ミスや誤入力で起こることが多い様です。

コピペのみで、見直してもコードに誤字脱字はなさそう・・・インテンドや文法ミスも確認したのですが、問題ありませんでした。

## エラー解決・原因
スマートな解決法ではないかもしれないですが、同様の記述がある違う記事をコピペしたら
エラーが出ませんでした。
コピペでも、貼り付けデータによっては無効な情報とS3側が受け取ってしまうエラーが起こることがある様です。

## 参考元
※バケットポリシーのコードはプラグラミングスクールの教材を利用

●この記事のエラーに関わることが掲載されています
https://acloud.guru/forums/aws-certified-cloud-practitioner/discussion/-LXsAmzSKItLpOLBQe18/ERROR%20this%20policy%20contains%20invalid%20Json
[C#]リフレクションを使って基本クラスライブラリ(BCL)のクラス図を作ってみた

[ソースコードからクラス図を作るツール](https://pierre3.hatenablog.com/entry/2019/03/03/224400)などはあるが、アセンブリからリフレクションでPlantUMLのクラス図を作成するツールを作ってみた。
集約関係までやるとキリが無いので継承関係のみ。
個人的にはクラス図は重視していなくて、既にありそうだけど手習いで作成した。

## [ソースコード](https://github.com/udaken/AssemblyToPlantUmlClassDiagram)

## 実行例(ファイルがくそデカイsvgなので注意。)
![image.png](https://gist.githubusercontent.com/udaken/bfc746d7b5d4bbcc9fbf3c2756a904d3/raw/classdiagram_netcoreapp31.svg)


## 感想

- `IDisposable`や`IEquatable<T>`のようなインターフェースの実装関係を含めると、とても見れたものではないのでステレオタイプとして表現した。
- それでも利用頻度の低そうな名前空間は消した。
- `Delegate`と`Attribute`も消した。
- PlantUMLは最新版を使え。1.2020.10で謎の例外が起きていたけど、1.2020.15ならOKだった。
- GraphViz/dotは最新版を使え。安定版だと謎のエラーが起きた。
- PlantUMLの名前空間レイアウトは謎。
cargoでfailed to authenticateになった時の対処法

## 背景

気分転換に[Rustチュートリアル](https://doc.rust-jp.rs/book/second-edition/ch02-00-guessing-game-tutorial.html#a%E3%82%AF%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)を始めてみたら初めての依存ライブラリー取得のところで以下のエラーが出て若干ハマったので対処法をメモしておく。

```bash
$ cargo build
    Blocking waiting for file lock on package cache
    Updating crates.io index
error: failed to get `rand` as a dependency of package `guessing_game v0.1.0 (/Users/xxx/rust/guessing_game)`

Caused by:
  failed to load source for dependency `rand`

Caused by:
  Unable to update registry `https://github.com/rust-lang/crates.io-index`

Caused by:
  failed to fetch `https://github.com/rust-lang/crates.io-index`

Caused by:
  failed to authenticate when downloading repository
attempted ssh-agent authentication, but none of the usernames `git` succeeded

Caused by:
  no authentication available
```

## 原因

cargoコマンドはデフォルトではssh-agentを使用して取得を試みるが、これがコケている。

### 解決法1: ssh-agentに鍵を登録する

こちらは正統派解決法で、普段使っている秘密鍵をそのまま登録すればOK。下記記事の手順通りにやればいいだけなので難しいことはないが解決法2と比べると若干めんどくさい。

[ssh-agentを利用して、安全にSSH認証を行う](https://qiita.com/naoki_mochizuki/items/93ee2643a4c6ab0a20f5)

### 解決法2: コケた場合にOSのgitコマンドへフォールバックさせる

言うまでもないかもしれないが、前提条件としてgitコマンドが正しく動作していることが必要。

下記のオプションを入れるとssh-agentを使った認証にコケた場合、gitコマンドを使って取得を試みるように動作を変更することができる。この結果普段通り鍵認証を行うようになるので正しく認証完了しリポジトリを取得できるようになる。

※ファイルが無い場合は作成する

```toml:~/.cargo/config
[net]
git-fetch-with-cli = true
```

ワークアラウンド的なやり方だが、OSのgitコマンドと設定が共通になり多少楽な気がしたので今回私はこのやり方にした。

## ダメだった解決法

エラーメッセージでググると以下のように書き換える記事がいくつか出てくるが、私の環境では解決できなかった。

```diff:~/.gitconfig
- [url "git@github.com:"]
+ [url "ssh://git@github.com/"]
```

## 参考文献

* https://github.com/rust-lang/cargo/issues/2078#issuecomment-434388584
* https://github.com/rust-lang/cargo/issues/3381#issuecomment-430166555
gemの種類

#プログラミングの勉強日記
2020年7月26日　Progate Lv.226
Ruby on Rails開発パス終了

#gemとは
　Railsでパスワードを暗号化するときはgem（読み方：「ジェム」）というツールを利用する。gemはRubyやRailsでプログラミングをするときに「よく使う機能」をパッケージ化したものである。様々なgemが存在するが、今回は`bcrypt`という暗号化するためのgemを使う。
　Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。`gem 'gemの名前' `と記述する。`rails new`コマンドで生成されたGemfileにはすでにいくつかのgemが書かれてインストールされている。
　`gem 'gemの名前', 'gemのバージョン' `　とすると、そのバージョンがインストールされる。バージョンを指定しないと、最新のgemがインストールされる。

```:Gemfile
gem 'rails', '5.0.3'
gem 'puma', '3.6.2'

bcryptのインストール
gem 'bcrypt'
```

```:ターミナル
$ bundle install
```

#gemの一覧

##CarrierWave
　ファイルのアップロードを簡単に追加することができる。（前提として、scaffoldのコマンドで作られている。）
　[こちらの記事](https://qiita.com/mzmz__02/items/a7ae6ea048dfd484d7ca)で詳しく書いています。

##haml
　HTML Abstraction Markup Languageの略で、簡単にHTMLのコードを書くことができる。erbと同じでRubyのコードを埋め込むこともできる。
　[こちらの記事](https://qiita.com/mzmz__02/items/fa9a2f5f120b03d7a42d)で詳しく書いています。

##Slim
　hamlと似ていて、HTMｌを簡単に書くことができる。erbと同じでRubyのコードを埋め込むこともできる。
　[こちらの記事](https://qiita.com/mzmz__02/items/445894348fb5fdbbe33f)で詳しく書いています。

##kaminari
　1つのページに掲載するコンテンツが増えたときに複数ページに分けて表示させる<font color=orange>ページネーション</font>を簡単に実装することができる。
　[こちらの記事](https://qiita.com/mzmz__02/items/56540358a5b664ea88e2)で詳しく書いています。
【Xcode Behaviors】Xcodeのイベントに合わせて動作を設定する - 開発効率をUPする便利機能

# 開発効率をUPする便利機能

Xcodeの設定にBehaviorsという項目があるのをご存知でしょうか？
この項目から、Build/Testing/Runningなどの各イベント発生時の挙動を設定することができます。

例えば次の画像のように、RunningのPausesイベント（デバッグ中のエラー発生やブレイクポイント到達）発生時に、別のタブを開いて該当部分を表示するといったことが可能です。
<img width="1077" alt="before-running.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499615/135dcabc-dc20-602f-6150-4e32e768afe7.png"><img width="1078" alt="running-fails.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499615/606afbaa-12b3-821c-c8ad-4f85e67697f3.png">
デフォルトの設定では、エラーが発生するたびに編集中のファイルからエラー発生箇所に移動してしまいますが、別タブで開く設定をしておけば、タブを移動するだけで編集中の状態に戻れるので、ストレスが軽減します。

# デバッグ中にエラーが発生したときやブレイクポイントに達したときに別のタブを開く

<img width="800" alt="behaviors.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499615/913c3c73-f9a2-1ee4-253a-1e7941f501a2.png">
Behaviors > Running > Pauses から以下の項目を設定します。

- Show tab named "Debug" in "active window"
- "Show" navigator "Debug navigator"
- "Show" debugger with "Variables & Console View"
- "Hide" inspectors

ナビゲーターに"Debug navigator"に選択することで、スタックトレースが表示されます。
デバッガーに"Variables & Console View"を選択することで、変数の内容を表示するビューとコンソールが表示されます。
ちなみにタブ名とインスペクターを隠す設定は任意です。

# ビルドに失敗したときに問題箇所を表示するナビゲーターを開く

<img width="799" alt="スクリーンショット 2020-07-26 20.13.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499615/8d228e3b-4646-68d8-85a5-82b34d5474ea.png">
Behaviors > Build > Fails から以下の項目を設定します。

- "Show" navigator "Issue navigator"

この項目はデフォルトで設定されているべきでは？と思うのですが、なぜかデフォルトではないようです。

# テストに失敗したときに問題箇所を表示するナビゲーターを開く

<img width="799" alt="testing.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499615/c1a84d9e-5c4c-95b7-982f-521664749145.png">
ビルドのときと同様です。
Behaviors > Testing > Failsから以下の項目を設定します。

- "Show" navigator "Test navigator"

# 参考

公式ドキュメント（あまり情報がない）
- [Customizing Your Workflow](https://developer.apple.com/library/archive/documentation/ToolsLanguages/Conceptual/Xcode_Overview/CustomizingYourWorkflow.html)
- [Configure actions for events](https://help.apple.com/xcode/mac/11.4/#/devb4d6e8810)

タブをさらに使いこなしたい方はこちらが詳しいです
[XcodeのBehaviorsを設定してデバッグ時にウインドウを自動で切り替える](https://techracho.bpsinc.jp/wingdoor/2019_12_04/83304)

他の設定項目についてはこちら
[Xcodeのオススメ初期セットアップ](https://qiita.com/uhooi/items/ed148c68855ce4fd665f)
【Kaggle】略語一覧

Kaggleで使われている略語をいくつかメモ

# 略語一覧
- ANOVA : Analysis of Variance 分散分析
- AUC : Area Under the Curve
- CV: Cross Validation 交差検証
- CNN : Convolutional Neural Network 畳み込みニューラルネットワーク
- DNN: Deep Neural Network　ディープニューラルネットワーク　
- DNN:Deconvolutional Neural Network 逆畳み込みニューラルネットワーク
- EDA: Exploratory Data Analysis 探索的データ解析
- FCN: Fully Convolutional Network 全層畳み込みネットワーク
- FFT: Fast Fourier Transform 高速フーリエ変換
- GBM: Gradient Boosting Machine 勾配ブースティングマシン
- GLM: Generalized Linear Model 一般化線形モデル
- GRU: Gated Recurrent Unit ゲート反復単位
- HMM : Hidden Markov Model 隠れマルコフモデル
- ICA: Independent Component Analysis 独立成分分析
- kNN: k-Nearest Neighbors k近傍法
- LB: LeaderBoard リーダーボード
- LDA: Latent Dirichlet Allocation or Linear
-  Discriminant Analysis 潜在的ディリクレ配分法　もしくは 線形判別分析
- LLE : Locally Linear Embedding 局所線形埋め込み
- LOOCV : Leave-One-Out cross-validation 一個抜き交差検証
- LpO CV : Leave-k-out cross-validation K-分割交差検証
- LSA: Latent Semantic Allocation 潜在意味解析
- LSTM: Long Short Term Memory　長・短期記憶
- MAPE: Mean Absolute Percentage Error 平均絶対誤差率
- MCMC : Markov Chain Monte Carlo　マルコフ連鎖モンテカルロ法
- MDS : Multi-Dimensional Scaling 多次元尺度構成法
- MSE: Mean Squared Error　平均二乗誤差
- NLDR: Non-Linear Dimensionality Reduction 非線形次元削減
- NLP : Natural Language Processing 自然言語処理
- NMF: Non-Negative Matrix Factorization 非負値行列因子分解
- OOF: Out Of Fold
- PCA: Principal Component Analysis 主成分分析
- pLSA: Probabilistic Latent Semantic Allocation 確率的潜在意味解析
- R2 : R-squared 決定係数
- RF: Random Forest ランダムフォレスト
- RFE: Recursive Feature Elimination 再帰的特徴量削減
- RMSLE : Root Mean Squared Logarithmic Error
- RNN: Recurrent Neural Network 再帰型ニューラルネットワーク
- ROC : Receiver Operating Characteristic 受信者動作特性
- SMOTE: Synthetic Minority Over-sampling Technique
- SVM: Support Vector Machine サポートベクターマシン
- tf-idf: term frequency, inverse document
- frequency 単語の出現頻度、逆文書頻度
- t-SNE: t-Distributed Stochastic Neighbor Embedding