OmniAICreator/Qiita-1.07M huggingface dataset:
RaspberryPi4 に Ubuntu Desktop 20.10 をインストール 

#はじめに
2020/10/22に、Ubuntu20.10がリリースされました。(詳細 : [Ubuntu公式ブログ](https://jp.ubuntu.com/blog/ubuntu-20-10%E3%82%92%E6%90%AD%E8%BC%89%E3%81%97%E3%81%9Fraspberry-pi%E3%81%8C%E5%AE%8C%E5%85%A8%E3%81%AAlinux%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%A8%E3%83%9E%E3%82%A4%E3%82%AF))
これによりRaspberryPi4が正式にUbuntu Desktopに対応したということで、実際にRaspberryPi4 に Ubuntu Desktop 20.10 をインストールしてみました。
備忘録として手順を残しておきます。

#準備したもの
- RaspberryPi4 Model B その他電源・ケーブル等
    - こちらのセットになっているものを購入しました。([LABISTS Raspberry Pi 4...](https://www.amazon.co.jp/gp/product/B082VVBKRP/))
- microSDカード
    - 上のセットにSDカードも入っていますが、私はすでに別のものに使っているので新たにサンディスクのmicroSDを購入。([サンディスク microSD 64GB...](https://www.amazon.co.jp/gp/product/B07YLT3ML9/))
- PC(Windows10)
- ディスプレイ、キーボード、マウス

#インストール手順
##1. Raspberry Pi Imagerをインストール
[Raspberry Pi Imager ダウンロードページ](https://www.raspberrypi.org/downloads/)にアクセスし、"Raspberry Pi Imager for Windows"をダウンロードします。
手順に従ってインストールすると、そのままRaspberry Pi Imagerが起動すると思います。

##2. Raspberry Pi ImagerでSDカードに書き込み
Raspberry Pi Imagerが起動したらOSとSDカードを選択して書き込みます。
PCにSDカードを挿したあと、
・"CHOOSE OS" > "Ubuntu" > "Ubuntu Desktop 20.10(RPi 4/400)"
・"CHOOSE SD CARD" > "書き込みたいSDカード"
を選択。
"WRITE"をクリックすると書き込みが始まります。人によるかもしれませんが、私は書き込み終わるのに2時間かかりました…。
しばらく経つと、無事書き込みが成功した旨のメッセージが表示されます。
![Raspberry Pi Imager v1.4 2020_11_02 12_13_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691532/fed82320-d29e-4ce4-b6df-4adf43a10cde.png)

##3. RaspberryPi4で起動/セットアップ
SDカードに書き込みが終わったら、RaspberryPi4に周辺機器をつなぎ、SDカードを挿して電源を入れます。
1分くらいすると画面にゴリラの顔が出た後セットアップが始まりました。手順に従って選択していくと無事RaspberryPi4でUbuntuDesktopが使えるようになります。
追加で特に設定をいじることなくキーボードとマウスとWi-Fiは使えました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691532/5f19cc20-73dc-5d66-72e6-be0078f2e7bb.jpeg" width=50%>

#おわりに
環境によっては上記の方法でできないかもしれないので、あくまで成功例の１つとして参考までに。
SDカードへの書き込みに想像以上に時間がかかり少し不安でしたが、簡単にインストールすることができました。何に使うかは…これから考えます(笑)
もし間違えているところがあれば指摘していただけると幸いです。
Class Component ? Function Component ?

今まで`Class Component`と`Function Component`の違いがよくわかってなかったので少しまとめてみます

これらを語る上で欠かせないのが`state`と`ライフサイクル`こいつらが何かというと

##state
コンポーネント内で使える値で、値の変更が起こると、renderが走って画面が更新される

##ライフサイクル
コンポーネントがMuntingしてUpdatingしてUnmountingする流れ


#今風なのはFunction Component
`Hooks`が導入されるまでは`Class Component`では`state`が使えたり、`ライフサイクル`が使えたりすることがメリットだと考えられていました
ただ`Hooks`内で使う`useState`と`useEffect`あるので`state`と`ライフサイクル`が置き換えられちゃうんですよね
`Function Component`の方が記述が簡単にまとめられて、こっちを使う方がモダンなんです

`ライフサイクル`だと`componetDidMount()`とか`componentDidUpdate()`とか`componentWillUnmount()`とか長ったらしい記述を別々に記述するのめんどいですもんね

ただ、`Hooks`は比較的に新しい技術なので、ネットに転がっている情報は`Class Component`の方が多そうです、、、

それらをみて、積極的に`Function Component`に書き換えてアプリ作成やっていけたらいいのかなと思います

後々、状況によって`Class Component`で書いた方が良い！！という場面が出てくるかもしれないですし、`Class Component`と`Function Component`の使い分けができる様になると良いエンジニアへ成長していけるんでは？？
AWS WorkSpaces でウェビナー配信をしたときのメモ


2020/10/26 に JAWS UG 名古屋で、AWS WorkSpaces + OBS + Chime でウェビナー配信を試してみました。

その時の配信はこちら
https://www.youtube.com/watch?v=67u_ss-TbUg

準備から配信、WorkSpaces 削除までの手順の防備録です。

# 手順メモ

忘れないうちに手順ステップをメモ

## 設定

- WorkSpaces インスタンス起動
	- PowerPro を使用。
	- シンプルな配信 + Chrome の Tweetdeck でのタイムライン表示ぐらいできる。
	- CPU 占有率 90%
	- fast.com の結果は 260Mbps ぐらい
	- AutoStop で使用。AlwaysOn の場合は月額になる
	- AutoStop の時間を必要に応じて1時間から増やす。勉強会の準備時間から終了までは動き続けるようにする。
	- Audio Driver インストール
- Google Drive に事前にインストールするアプリ群を ZIP ファイル化
    - Chrome インストール
    - Chrome アカウントログイン
    - Chrome Remote Desktop インストール、アカウント紐付け
    - OBS インストール
    - Audio Driver インストール
- YouTube Live URL 取得
- 扉絵作成: 透過画像の PNG。
- OBS インストール
    - 音声設定確認
    - 配信先設定（テスト用ストリームキー入力）
    - 配信クオリティ設定
        - 1920x1080
        - 24fps (そんなに fps いらない想定)
    - シーン作成
    - Chrome 起動
        - TweetDeck で、ハッシュタグ表示カラムを作成して表示。表示が小さかったので 125%~150% 表示。
    - Amazon Chime の画面は全画面表示
    - OBS の「ウインドウキャプチャ」を使ってシーンに設定。
    - 扉絵を一番上のレイヤーにもってくる
    - テキストで追加できるところはテキストを追加する。
- テスト配信
- 本配信のストリームキーを入力
- 準備完了


## 配信開始

- 配信開始
- 配信終了

## 配信後

- YouTube
    - 説明欄修正
    - タイトル修正
    - タグ修正
    - 始点・終点・途中カットの編集
    - サムネイル画像追加

## WorkSpaces 削除

- WorkSpaces 削除
- WorkDocs アプリケーションを削除。そのときに Simple AD ディレクトリも一緒に削除しないと追加料金がチャージされるので注意

※WorkSpacesは高くなりそうなので注意。

## 今回の値段

種別 | 単位 | 数値 | 小計
------|-----|-----|------
Usage | 1.84 / hour | 8 時間 | $14.72
AutoStop | $26 / month | 0.300月 | $7.80
合計 | - | - | $22.52


# 感想メモ

- AWSJ 沼口さんのブログ記事を参考にしました。感謝！Graphics Pro を試すのといいかも。ただし緩和申請が必要
- AWS WorkSpaces の PowerPro を使用
- CPU が結構食う。配信始めたら常に 90% ぐらい。
- レスポンシブが重くなるので動画の再生とかできるか不安
- AlwaysOn を使わないと止まってしまう。AlwaysOn は月額になるのでちょっと高くなる
- 最初、デュアルディスプレイ設定で配信しようとしたけれど、停止してしまったのでシングルディスプレイに戻ってしまった。そのため、急遽、シングルディスプレイでの配信となった。
- Audio Driver のインストールは不要だった。WorkSpaces は音声ドライバが入っていた。まあでも何かのときのために入れておいたほうが良いかもということで手順には残しました。

# 参考記事

- [Amazon WorkSpacesで堅牢な配信を実現する](https://note.com/s_numaguchi/n/n3176232300b3)
- [まだ手元のパソコンでイベント配信してるんですか？クラウド上でTeamsを利用してOBSで配信した方が楽ですよ。](https://level69.net/archives/27811)
MyBatis  There is no getter for property named xxx エラー

## Mybatisで以下のようなエラーが出た。

```
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'dto' in 'class com.awba.manage.awbamanage.domain.UserRole'
	at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:373) ~[mybatis-3.5.3.jar:3.5.3]
	at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:163) ~[mybatis-3.5.3.jar:3.5.3]
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162) ~[mybatis-3.5.3.jar:3.5.3]

```

### エラーが出ているクエリ
INSERT時にオブジェクトを引数に渡してそのフィールドをVALUEとしてセットするクエリ

```java:UserRoleMapper.kt
    @Insert("""
        INSERT INTO user_role (
          user_id,
          role_id,
          role_name,
          deleted_at,
          created_at,
          updated_at)
        VALUES (
          #{dto.user_id},
          #{dto.role_id},
          #{dto.role_name},
          null,
          now(),
          now()
        )
    """)
    fun insertDefaultRoles(dto: UserRole)
```

### 原因
MyBatisはバインド変数`#{xxx}`使用時は、クラスのフィールド名を指定する必要がある。
上記だとUserRoleクラスのdtoというフィールドを探しにいってしまってエラーになっている。
dto.user_id → user_id　でOK

### 正しい形

```java:UserRoleMapper.kt
    @Insert("""
        INSERT INTO user_role (
          user_id,
          role_id,
          role_name,
          deleted_at,
          created_at,
          updated_at)
        VALUES (
          #{user_id},   //フィールド名を直接指定
          #{role_id},
          #{role_name},
          null,
          now(),
          now()
        )
    """)
    fun insertDefaultRoles(dto: UserRole)
```

### (注意) 引数が2つ以上の場合➡︎変数名の指定が必要

```java:UserRoleMapper.kt
    @Insert("""
        INSERT INTO user_role (
          user_id,
          role_id,
          role_name,
          deleted_at,
          created_at,
          updated_at)
        VALUES (
          #{dto.user_id},   //引数が複数ある場合は、dto.user_id とする
          #{dto.role_id},
          #{roleName},
          null,
          now(),
          now()
        )
    """)
    fun insertDefaultRoles(dto: UserRole, roleName: String)
```
[Swift] No such module ‘RealmSwift’が出る時に役立つ記事のまとめ

#今回の題


RealmSwiftの導入時、

`No such module ‘RealmSwift’`

というエラーに遭遇することがありました。
stackoverflowやteratailなどにも同様のエラーに対する質問が多くあり、中には解決に至っていないものもあります。私も何度か遭遇したのですが、エラーの発生理由がその時によって異なり、解決方法も複数ある為ピンポイントで指摘することが難しいです。
その為今回は、参考にしたサイトのリンクを載せ同じエラーに遭遇した方々への橋渡しになる様な内容になっています。


#参考サイトへのリンク

##Frameworks, Librariesを修正するパターン
http://somen.site/2020/09/22/swift5%E3%82%A8%E3%83%A9%E3%83%BCno-such-module-realmswift/

https://teratail.com/questions/287204

##開くファイルを間違えているパターン
`プロジェクト.xcodeproj`ではなく`プロジェクト.xcworkspace`を開きましょう。
https://stackoverflow.com/questions/41654408/realm-swift-2-2-0-no-such-module-realmswift-in-xcode-8

##manage schemeを編集するパターン
https://stackoverflow.com/questions/55912541/why-do-i-keep-getting-the-error-no-such-module-realmswift/55914079

https://qiita.com/doge_kun55/items/26ac2fa2031ddbeee879


##私が経験したパターン
pod install後に以下の画像の`Pods`ディレクトリだけが作成されずエラーが出たことがありました。
諦めて別のプロジェクトを立ち上げてインストールし直すことで解決しました。

![スクリーンショット 2020-11-03 22.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546124/738b5110-a6c6-290c-12de-4df2509502ce.png)

#最後に
まだありそうなので、適宜追加します。
Alpine LinuxにWebminを入れるシェルスクリプト

## 参考

[Webmin - Alpine Linux](https://wiki.alpinelinux.org/wiki/Webmin)
[AlpineLinux 3.6: ウェブベースシステム管理ツールのWebminをインストールする](https://www.hiroom2.com/2017/08/23/alpinelinux-3-6-webmin-ja/)

##本体

```sh
#webminのバージョン
WEBMIN_VRESION=1.960

#webminをダウンロード
curl -sL https://prdownloads.sourceforge.net/webadmin/webmin-${WEBMIN_VERSION}.tar.gz \
     -o webmin-${WEBMIN_VERSION}.tar.gz

#webminを展開
tar zxf webmin-${WEBMIN_VERSION}.tar.gz -C /var/lib/
mv /var/lib/webmin-${WEBMIN_VERSION} /var/lib/webmin
rm -rf webmin-${WEBMIN_VERSION}.tar.gz
cd /var/lib/webmin

#webminのインストールスクリプトを実行して質問に適当に答える
cat << EOF | ./setup.sh
/etc/webmin
/var/log/webmin
/usr/bin/perl
10000
admin


y
EOF

#Alpine Linuxではinitシステムがopenrcだからなのか、
#インストールスクリプトでは自動起動は有効にできないので、自分でinitスクリプトを作って実行属性をつけておく
cat << EOF > /etc/init.d/webmin
#!/sbin/openrc-run
start() { /etc/webmin/start; }
stop() { /etc/webmin/stop; }
EOF

chmod a+x /etc/init.d/webmin

#initスクリプトを登録してLinux開始時に自動で起動するようにする
rc-update add webmin boot
```
spring-cloud-starter-aws-parameter-store-configを利用してAWS SSMパラメータストアからパラメータを取得する

SpringCloudを利用してAWS SSMパラメータストアに設定したパラメータを取得する方法のメモ

## 目的

セキュリティの観点からアプリケーション内のプロパティファイルに認証情報を保持しないようにするため、起動時のSSMパラメータストアから必要なプロパティ値を取得できるようにする。

## 前提

EC2で起動するSpringBootアプリケーションがRDSへの接続情報をSSMパラメータストアから読み込む

## ライブラリ設定
build.gradleのdependenciesに下記追加

```
implementation 'org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config'
```

## プロパティファイル

``` bootstrap.properties
cloud.aws.stack.auto=false
cloud.aws.region.auto=false
cloud.aws.region.static=ap-northeast-1

# ParameterStore の設定
aws.paramstore.region=${cloud.aws.region.static}
aws.paramstore.default-context={アプリケーション名}
aws.paramstore.enabled=true
aws.paramstore.prefix=/config
aws.paramstore.name={アプリケーション名}
# アプリケーション名とプロファイルのセパレータ
aws.paramstore.profileSeparator=_

# Datasource
spring.datasource.driver-class-name=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
```
ローカル起動（開発時）の場合は無効とする設定を入れる

``` bootstrap-develop.properties
aws.paramstore.enabled=false
```

## SSMパラメータストアの設定
下記のように各プロパティ値をSSMパラメータストアにて設定する

```
/config/{アプリケーション名}_{プロファイル名}/spring.datasource.driver-class-name
/config/{アプリケーション名}_{プロファイル名}/spring.datasource.url
/config/{アプリケーション名}_{プロファイル名}/spring.datasource.username
/config/{アプリケーション名}_{プロファイル名}/spring.datasource.password
```

## EC2に対するポリシー設定
IAMロールを用意して、下記ポリシーを設定する。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ssm:DescribeParameters",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "ssm:GetParametersByPath",
                "ssm:GetParameters"
            ],
            "Resource": "arn:aws:ssm:ap-northeast-1:[アカウントID]:parameter/config/[アプリケーション]*"
        }
    ]
}
```
「画像認識」処理を行う「機械学習エンジニア」は要らなくなるかも ～ Microsoft Lobe と Azure Virtual Machines で遊んでみた ～

#Lobe のプレビュー
2年ほど前に買収したLobeというAI製品だが、2020年10月26日より新たなソフトのプレビューが可能になったようだ。Microsoft社としての（プレビュー）リリースとなる。
**https://lobe.ai**
元々マイクロソフトの製品でなかったこともあってかMacでもWindowsでも動く。

#このツールの何が良い？

・少なくとも今は無料。
・ドラッグドロップ、スマホなどとの連携が容易。ローコードというよりノーコードに近い。
・画像を画質落とさずそのまま読ますことができる
（テストとして利用したデータは https://unsplash.com/ からダウンロードしてみた）
・1枚に1個タグをつけられる。タグは自由に設定できる。（野菜や果物の固有名称を例にして遊んでみたが、「OKかNGか」といったタグもできる。）
・新たなイメージを読み込ませた際に正しく認識できたか否かを記録していくことができる（徐々に精度を高めることができる）
・判定サーバーをローカルで動かすこともできるしTensorFlow / TensorFlow Liteと連携もできる。

みかんとイチゴを認識させてみた
![機械学習イメージ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/3e41cfef-bcc0-09f2-3f85-ff25802a41d0.png)

新たなイメージが何なのか判定させてみた
![機械学習イメージ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/d9ed5b9f-6556-6585-932c-f3afc7daf48a.png)

新たなイメージが何なのか判定させてみた
![機械学習イメージ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/27badfb6-283c-236d-b104-bc18d134ba23.png)

エクスポート画面：
![機械学習イメージ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/4b19f8e7-a73d-536a-d6dd-7c9396580ca6.png)

ローカルAPIの例：
![機械学習イメージ5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/7746b14d-a231-b03b-7eec-025a84ea78f4.png)

#サーバーとして動かした場合など・・・
（１）Azure / AWS / Google Cloud / ローカルにサーバーを立てる場合:
"TensorFlow 1.15 SavedModel" または "Local API" REST endpoint
※ローカルAPIとする場合、ポート38100を使うようでWindows OSレベル（インストール後初回起動時にWindows Firewallについては聞かれる）とAzure等の場合はNetwork Security Groupの開放設定も必要。Azureの設定例は下記にも参考情報として追加しておいた。
（２）"Core ML": Apple iOS
（３）"TensowFlow Lite" : Android or Raspberry Pi
（４）"Spreadsheets and local images"

![lobe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/8846a137-4eab-f7b9-a584-579def082388.png)

Azureで設定する場合の追加情報：
Azureの良いところは固定IPでなくてもVirtual Machine仮想OSにアクセスするためのDNS名を入手できること。DNS名でアクセスをするようにすればIPが変わってもシステム変更をしなくてよくなる。AzureでRDP,Ping,38100のポートを全開放してみた事例（セキュリティ的にやや甘いので企業内の本番サーバーとする場合はAny <-> Anyではないほうが良い）。
http://AzureサーバーDNS名:38100/predict と入力し
"404 NOT FOUND" というリプライが返ってくればローカルREST APIとしての接続はできていることになる。実際に画像をインポートしてRESTで動かす場合は/predict/xxxxxxxxxxのように長い文字列が続く。
Azure のDNS名は各Azureリージョン毎早い者勝ちとなる。各Virtual Machine毎に設定できる。
私の場合は単価の安いwestus2でマシンを動かしているので、
任意の名前の後のDNS名はwestus2.cloudapp.azure.comと続いている。
![DNS名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/04dea62f-8d57-9559-1395-e89a300ac5fa.png)


#Python, .Net API
Pythonと.Net APIが正式公開されていました。コードが好きな人はこれらを見てみるのも良いでしょう。
https://github.com/lobe/lobe-python
https://github.com/lobe/lobe.NET

#サンプル用途例
https://lobe.ai/examples
![lobeexample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/6002dbe3-a4bf-1022-29a9-71bd07081135.png)
ubuntu にsentencepiece をインストール

# 目次
1. 環境
2. 概要
3. 手順
4. 結果

## 1. 環境
- ec2:ubuntu(18.04.5)
- python:3.7.3

## 2. 概要
ec2インスタンスに python 環境を構築し、sentencepiece を入れようとしたところ若干つまづいた。

```
~$ pip install sentencepiece
Collecting sentencepiece
  Using cached https://files.pythonhosted.org/packages/72/e0/57edbab017a204e9f39448c1717292437a45b5f7cf3a9dbf4a9c026b03c5/sentencepiece-0.1.94.tar.gz
Installing collected packages: sentencepiece
  Running setup.py install for sentencepiece ... error
    Complete output from command /home/ubuntu/.pyenv/versions/3.7.3/bin/python3.7 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-p1e9kzi7/sentencepiece/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-cjap2xh6/install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-3.7
    creating build/lib.linux-x86_64-3.7/sentencepiece
    copying src/sentencepiece/__init__.py -> build/lib.linux-x86_64-3.7/sentencepiece
    copying src/sentencepiece/sentencepiece_model_pb2.py -> build/lib.linux-x86_64-3.7/sentencepiece
    copying src/sentencepiece/sentencepiece_pb2.py -> build/lib.linux-x86_64-3.7/sentencepiece
    running build_ext
    Package sentencepiece was not found in the pkg-config search path. 　#　ここ！
    Perhaps you should add the directory containing `sentencepiece.pc'
    to the PKG_CONFIG_PATH environment variable
    No package 'sentencepiece' found
    Cloning into 'sentencepiece'...
    Note: checking out '8336bbd0c1cfba02a879afe625bf1ddaf7cd93c5'.
```

```pkg-config``` が見つからないとのこと。

## 3. 手順
### 3.1 依存関係のインストール
[sentencepiece の github](https://github.com/google/sentencepiece) を見ると以下の記述がある。

>On Ubuntu, the build tools can be installed with apt-get:
% sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev


とのことで以下のコマンドを実行

```
sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev
```

### 3.2 sentencepiece のインストール

```
pip install sentencepiece
```

無事インストールできました。
Qiitaを毎日投稿して半年たったので半年間を振り返る

#プログラミング勉強日記
2020年11月3日
毎日Qiitaでアウトプットしていたのでその振り返りをする。

#なぜ毎日投稿しようと思ったのか
　最初は毎日投稿するつもりはなかった。ただProgateで勉強をして勉強を始めたときに勉強の記録をつけたいと思いQiitaを始めた。「できる日に無理なく続けよう」と思っていたので、毎日続けようとは考えてなかった。しかし、気付いたら毎日投稿していて、毎日継続的に投稿することで力になるのでは？と思い毎日投稿を始めた。

#毎日投稿するための工夫
　まず、毎日投稿するというところですべての記事で内容が豊富で完璧な記事を書かなくていいと思うようにした。時間があるときに超大作な記事を書くことはいいと思うが、毎日それを継続的にやることは難しいと思う。なので、自分の備忘録やメモとしてQiitaに書き残すつもりで毎日投稿するようにした。

#毎日投稿のいいところ
　自分自身が思ういいところは以下の3点であると思う。

- 学習の定着
- 備忘録としての機能
- モチベーション向上

　毎日投稿を欠かさずにしようと思うので、学習した内容の定着につながる。また備忘録としても記録しているので、「このエラー見たことあるな～」といったときに自分のQiitaを振り返ることで解決することがある。また、毎日続けられているということで自分自身の成長の記録が残っているので、Qiitaを書くことによってモチベーションにつながる。

#毎日投稿の悪いところ
　自分自身が思う悪いところは以下の点であると思う。

- Qiitaを書くために勉強している(ネタを探している)
- Qiitaを書くために時間が割かれている

　もともとの目的は勉強のアウトプットの記録であったにも関わらず、Qiitaを書くということが目的になってしまっているところがある。それによってインプットの質が落ちているのではないかという懸念点がある。
　2点目は当たり前のようにも感じるが、Qiitaを書くためには時間を要する。私の場合、内容にもよるが最低でも30分以上かかり、基本的には1時間ほどかけて書いていることが多い(資料を探して考えてまとめてという作業)。実際にもまとめる力というのは必要な能力でもあると思うが、毎日限られた時間でインプットの時間をとっているのにも関わらずアウトプットに時間を割きすぎてしまい、インプットの時間が減っていると感じている。


#まとめ
　個人的な意見になるが、Qiitaは毎日投稿しなくてもいいのではないかと思う笑 インプットの時間をまとめてとり、それがひと段落したらQiitaを書くという考え方で問題ないと思う。そうすることで効率よく学習を進められるのではないかと思う。
　ただ、私の場合は1日休んでしまったらそのまま「Qiita毎日書かなくていいし、今日もやらなくていいかな」と思ってしまいそうな気がするので、たとえQiitaを書くことが目的であったとしても毎日勉強をするために、毎日投稿をし続けていきたいと思う。「毎日投稿するための工夫」で述べたように無理せず自分のメモや備忘録として活用することもあると思うが、毎日コツコツ継続してこれからも投稿していこうと思う
PHP mb_convert_encodingで500エラーが出る場合の対処法

## 原因
phpinfo()で状態を確認するとZend Multibyte Supportがdisabledになっていると思う。エラーはこれが原因である。
![ScreenShot_20201103212225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197942/88815b4d-f007-74d8-0b1b-64515b4af3c6.png)


## 対処法
Zend Multibyte Supportにmbstringを追加する。

## 環境
Ubuntu 16.04.7 LTS
Apache2
PHP 7.0

## まずphpinfo()を確認し、php.iniの場所を特定する
![ScreenShot_20201103212910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197942/aba307ed-b564-98aa-e1b0-2d4368ec62b1.png)

## mbstringをインストールする
```bash
$ sudo apt install php-mbstring
```
## php.iniを編集する
```bash
$ sudo nano /etc/php/7.0/apache2/php.ini
```

以下の項目を探して変更する（;のコメントアウトは消す）

```php.ini
; 変更した状態
zend.multibyte = On
zend.script_encoding = UTF-8
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
```

## Apache2を再起動し、設定を反映させる
```bash
$ sudo service apache2 restart
```

phpinfo()を確認し、このようになっていたら成功である。
![ScreenShot_20201103212307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197942/9c9358b5-2caf-e9fc-7bc8-1428ae11944d.png)
EC2（ubuntu) に pyenv で python 環境構築

# 目次
1. 環境確認
2. 手順確認

## 1. 環境確認
- os:ubuntu（18.04.5）
- ec2インスタンスタイプ:t2.micro


## 2. 手順確認
### 2.1 依存関係のインストール
```
sudo apt-get install git gcc make openssl zlib1g-dev libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
```
### 2.2 pyenv をクローン
```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

### 2.3 .bashrc に以下を記述
```
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
fi
```

### 2.4 .bashrc を再読み込み
```
source ~/.bashrc
```

### 2.5 目的のバージョンをインストール
```
pyenv install 3.7.3
```

### 2.6 バージョン切り替え
```
pyenv global 3.7.3
```

### 2.7 確認
```
python -V
```
【Ruby On Rails】RubyAws::Sigv4::Errors::MissingCredentialsErrorについて

# エラーの背景
AWS導入後、ローカル環境で開発中のアプリから画像をアップロードし、実際に保存した物がS3に保存されているかを確認しようとしたところ、今回の様なエラーがでました。

# エラー文の意味
![スクリーンショット 2020-11-03 21.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770386/fd03179b-b537-ef16-36d2-1812ed776c19.png)

####「読み込めません。認証情報が欠けているので、次のいずれかを用いて認証情報を与えてあげてください」
という感じになります。

:access_key_id
:secret_access_key
:credentials

....

つまり、それらの認証情報を正しく拾って、読み込まれていない可能性があるということです。

# 確認したこと
S3で保存先できる様にするために、S3でデータが格納される様にバケットは用意しましたし、リージョンやチェックボックスも適切な設定しました。バケットポリシーもユーザーのARN、バケット名を間違いなく入力しました。

そして、ターミナルで環境変数は代入し、confing/environments/production.rbの記述も、config/storage.ymlの記述も正しく行われていることを確認しました。

```ruby:confing/environments/production.rb
config.active_storage.service = :amazon
```
```ruby:confing/environment/development.rb
config.active_storage.service = :amazon
```
```ruby:config/storage.yml
amazon:
  service: S3
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
  region: ap-northeast-1
  bucket: バケット名
```

# 仮説
####ターミナルでの入力が正しく行われていない

# 仮説を踏まえた作業
vim ~/.zshrcコマンドやsource ~/.zshrcコマンドで正常に動くか確認

# 結果
####source ~/.zshrc を実行していないことが原因でした。

# そもそもsource ~/.zshrcとは
vim ~/.zshrcでキーを入力して保存した後に、行うコマンド。.zshrcを読み込み直してから、環境変数として追加した変数を使える様にするコマンド。

そりゃ実行していなきゃ、画像アップできませんというエラー出てきますよね。一度間違えたことは次回から忘れずに実行していきたいと思います。
期待高まる「エッジAI」におけるモデルを圧縮する3手法

## エッジAIってなに

「エッジ AI」 とは、AIのモデルを、クラウドではなくFPGAやCPUなどの端末で実行する技術を指します。

僕はクラウドエンジニアとして、継続的再学習や、進化的データモデリング、データ基盤の３分類など、
データやMLモデルの運用をクラウド上で運用してきたのですが、自動運転技術について興味があって勉強しているとどうしても、エッジAIについて学ぶ必要があることがわかってきました。


エッジAIは非常にアツイ分野で、それによって、ネットワーク不要、低コストで瞬時な推論が実現でき、これまでのクラウド上のAIに加えて、FPGAなどで動くニューラルネットワークというのにも注目が集まっています。

僕が個人的に興味を持っている、自動運転技術のSemantic Segmentationなども、自動運転では通信不安定時を想定する必要があることと、より高速な推論を実現するため、エッジAIが採用されているそうです。

モデルの圧縮はクラウドだとあまり問題にならなかったりするのですが、
コンピューティングリソースの削減や推論時間の縮小に役立つので、エッジAIに限ったテーマではないかもしれません。

## AWSのエッジ向けサービス

「Amazon SageMaker Neo」というエッジAI向けのサービスをAWSは展開していて、クラウドサービスの頂点でありながら、エッジAIの市場も狙っているようです。

## モデル圧縮の手法

大きく分けて3つの手法があります。

### Pruning（枝刈り）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309507/b9b76bdc-2b42-704f-a9e3-23e2ffa95189.png)

ニューラルネットワークにおける重み$w$が非常に小さいところの重みを0(接続を削除)としてしまっても結果に大きな影響がないのではないか。
と言う考えのもとに成り立っているのが、枝刈りです。
これによって、計算回数とパラメータの数を減らすことができるのでモデルの圧縮ができます。

どの接続を削除するかについては、様々な議論があります。

- https://arxiv.org/pdf/2003.03033.pdf
- https://arxiv.org/abs/1506.02626
- https://arxiv.org/abs/1611.06211
- https://arxiv.org/abs/1611.06440

などが参考になります。


実装に関しては、

- https://pytorch.org/tutorials/intermediate/pruning_tutorial.html
- https://www.tensorflow.org/model_optimization/guide/pruning/pruning_with_keras



### Quantize（量子化）

学習時に、重みや活性化関数を量子化しておくことで、ネットワークの構造を変えずに、軽量化を測ることができます。
一般に、Pytorchなどで使われているfloat型は32bitですが、これをもっと小さなbitに抑えても十分な大きさがあるということです。
ただし、小さくしすぎると精度が大幅に低下する可能性があるので難しいですね。


参考

- https://jmlr.org/papers/v18/16-456.html
- https://qiita.com/habakan/items/8d4573dbc77003f78c43
- https://arxiv.org/abs/1712.08934


### Distillation（蒸留）

蒸溜とは精度の高い大きなモデルを、教師モデルとして新たなモデルの学習に利用します。
これによって、教師モデルと同程度の精度のより軽量な新たなモデルを生成することについて考えます。

具体的には、教師モデルの返す答えを教師データかのように扱うことで、教師モデルに近づけていくということができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309507/e030caa7-8428-ccc9-82aa-52bc65fbd1f3.png)
また、一般的な教師データの場合、この画像は「５」を表しているということはわかりますが、
それでは、この汚い５が普通の綺麗な５と同等に扱われてしまいます。
しかし、教師モデルを用いれば、これは「５」ともとれるけど、「３」ともとれるというのが定量的に渡されます。
なので、精度の高い教師モデルの方が教師データよりも価値があるような可能性があります。

それを活かして新たなモデルを作るのが、Distillationの考え方です。

Distillationの参考

- http://codecrafthouse.jp/p/2018/01/knowledge-distillation/
- https://arxiv.org/pdf/1712.04440.pdf



## 参考

- http://madoibito80.hatenablog.jp/entry/2018/04/06/121059
- https://www.slideshare.net/tkatojp/iclr2018iclr2018pfn
- https://www.slideshare.net/ren4yu/ss-84282514
sourcetreeでリポジトリ管理

みんなすまない。自分のために書いている。
だからすげー雑なのさ。
いつもやり方忘れるので、書いておかせてください。

sourcetreeを立ち上げる

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/bdfef042-cc65-a43f-eb30-8025a7820b13.png)|
|:-:|

「Create」をクリックする。
リポジトリの作成画面になるので、リポジトリを作成するフォルダを指定する。
今回は既存のソースが入っているフォルダをそのまま指定。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/f7b591f4-4d77-6e61-e528-c4d72c3a35f8.png)|
|:-:|

作成をクリックすると、「もうフォルダあるよ」みたいなメッセージが出るので、「知ってるよ」といいながらOKをクリックすると、リポジトリが作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/ec058a5d-756d-aa26-03c4-5fdb4252486b.png)

フォルダに入っているリソースが「作業ツリーのファイル」に表示されるので、「全てインデックスに追加」をクリックする。
そうするとファイルがすべて「INDEXにステージしたファイル」に移るので、コメントを記入して「コミット」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/8f8bc589-d42a-925f-8c1b-89d5e9e7f105.png)

リポジトリに登録されると、画面が空になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/fe56e91f-b7d2-a99a-d93d-642f90fd63b7.png)

左メニューのHistpryをクリックすると、コミットした状態がツリー表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/0667bc25-f7c0-f190-6c8d-63e0d67b67f3.png)

リモートリポジトリを作成する。
githubにアクセスして、右メニューの「New」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/0399e26f-d200-4fd6-4041-d4ca95df39c1.png)

リポジトリの名前を入力して、一番下の「Create Repository」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/3560fd9a-d4d0-7c16-cf39-6c41ede97b6f.png)

リポジトリが作成されるので、urlをコピーする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/29a575fa-d13b-a6cd-7bd7-094fb4b8d371.png)

sourcetreeに戻る。リモートリポジトリに登録するため、「設定」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/9879cafa-181b-e9e0-482d-896556b78073.png)

追加をクリックすると「リモートの詳細設定」の画面が開くので、リモートリポジトリの名前とurlを設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/e0e8385e-c62e-26bc-bfe9-131e1b0319ac.png)

History画面に戻ったら、プッシュをクリックする。
プッシュの画面が表示されるので、対象にチェックを入れて、プッシュボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/a8ae5e99-b6c4-8cfe-9850-18947c79a0f6.png)

リモートリポジトリにローカルリポジトリの内容がプッシュされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/99a3a913-235a-7792-9b33-8f7290cb6152.png)

※プッシュしたとき認証エラーが出たら、改めて認証しないといけないらしい。
[ツール]-[オプション]でオプション画面を開き、「認証」タブを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/c1d69b45-41cb-0bb4-6390-0b28cf09701c.png)

ホスティングサービスで接続したいサイトを選んで「OAuthトークンを再読み込み」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/9d51d8c6-3083-3cc8-82c0-f54d55319a3f.png)

そうするとログイン画面が開くので、IDとパスワードを入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/86f80805-832a-24c8-6581-80e5890a1c46.png)

認証されたらプッシュできるようになる。
AWS(IAM)

#はじめに
こちらではAWS機能について書いていきたいと思います。
公式ドキュメントやAWS認定試験（ソリューションアーキテクトやDevOpsなど）の勉強教材など細かい内容をかかず、ざっくりとした内容で。
試験などに興味はないし！公式ドキュメントなど長ったらしくて読めん！
という方に向けに作っていきたいと思います。
(私の備忘録も兼ねて)

写真はつけられればつけます。(Qiitaの制限の範囲内で)

#環境
AWS

#ドキュメント
https://docs.aws.amazon.com/index.html

#そもそもIAMとは？
AWSで権限を操作するためにサービス。
・ユーザやロールやグループを作れる
・ユーザやグループごとに何のサービスを操作できるようにするか権限を付与したりできる。

#ユーザの種類
###ルートユーザ(ルートアカウント)
特権のあるユーザ
メールアドレスや支払いの類まで操作できるユーザ
権限が大きすぎるので実際の操作には別のユーザを作った方が無難。

####ルートアカウントにしかできないこと
・AWSルートアカウントのメールアドレスやパスワードの変更
・IAMユーザの課金情報へのアクセスに関するactivate/deactivate
・AWSサービスやアカウントの停止
・逆引きDNS申請
・脆弱性診断フォームの提出
・CloudFrontのキーペア作成
・他のAWSアカウントへのRoute５３のドメイン登録の移行

###メンバーアカウント
基本的なユーザ

###管理アカウント(旧マスターアカウント)
AWS Organizationで操作するための親アカウント
(調べたけどルートユーザとはまた別だけど...いまいち区別がよくついてない
ルートアカウント＝マスターアカウントではないらしい)


###パワーユーザ
IAMユーザーやグループの管理以外の全てのAWSサービスにフルアクセスできるユーザーです。
公式ドキュメントでは「Developer power user」ともいうらしい。


#ユーザの作成
左タブのユーザを選択
↓
ユーザの追加
↓
ユーザ名入力
↓
アクセスの種類やパスワードを設定
↓
次ステップアクセス権限
↓
アクセス許可周りの設定（必要であれば）
↓
キーと値を入力
↓
ユーザの作成

#グループの作成
左のタブのグループを選択
↓
グループの名前を入力
↓
次のステップ


#ポリシーの設定
###ポリシーって？
ユーザに対してどのアクセスを許可するかという設定

左タブのポリシーを選択
↓
ポリシーの作成
↓
サービスの選択
↓
アクションやアクセスレベルを選択
↓
リソースの選択
↓
リクエスト条件(必要であれば設定)
↓
名前と説明
↓
ポリシーの作成

#ポリシーのアタッチ（ポリシーをグループに設定）
左タブのグループを選択
↓
グループをクリック
↓
アクセス許可
↓
ポリシーのアタッチ
↓
ポリシーの選択
↓
ポリシーのアタッチ

#ロール作成
###ロールとは？
ポリシーがユーザに対してだが、こちらはEC２などのインスタンスに対して行う。

左タブからロールの選択
↓
ロールの作成
↓
エンティティとユースケースを選択
↓
次ステップ:アクセス権限
↓
ポリシーの選択
↓
ロール名とロール説明入力
↓
ロールの作成

###ロールの設定
EC２にて割り当てたいロールのインスタンスを選択
↓
アクション
↓
セキュリティ
↓
IAMロールを変更
↓
IAMロールを選択
↓
保存

#おわりに
いかがでしたでしょうか
まだ書くこともあるので随時追記したいと思います。
Docker の nginx 設定方法

<h1>Docker による nginx の設定方法

Dockerを使用したnginxの導入を行ったので、その内容を下記にまとめます。

<h5>・Docker hubから、Docker imageを入手する。</h5>

Docker hub URL
https://hub.docker.com/_/nginx 

リンク先の右上黒い囲みの内容をコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696940/0a8138b4-7c65-83c8-0781-9b03a05b3e1a.png)


```
% docker pull nginx　
```
nginxイメージがインストールされる。 

↓確認

```
% docker images
nginx               latest              f35646e83998        3 weeks ago         133MB
```


<h5>・コンテナの中に入る</h5>

```
% docker run -it -p 8080:80 nginx bin/bash
```

-it 立てたコンテナの中に入り込める 
仮想環境の80番ポートにアクセスするのはlocal8080番ポートらしい。

<h5>・vimを使えるようにするコマンド</h5>

```
% apt update && apt install -y vim
```

<h5>・vimファイルの設定内容を確認できるコマンド</h5>

```
% vi /etc/nginx/nginx.conf　
```
:q! で戻る

<h5>・psコマンドが使用可能になるコマンド</h5>

```
apt update && apt install -y procps
```

<h5>起動中の各プロセス毎の項目をみるコマンド</h5>

```
% ps aux
```

localhost:8080番 portにアクセス → 起動


このように表示されればnginxの起動成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696940/4c7016cc-7f90-b809-6550-0084389e6b3f.png)





<h5>・プロセスの停止</h5>

```
% nginx -s stop  
```

<h5>・コンテナから抜ける、停止</h5>

コントロール＋D  

<h5>・vimとpsの使用できる環境をコミットする</h5>

```
docker commit コンテナID 新しい名前　新しいdockerの作成
```

```
% docker images                               
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f35646e83998        3 weeks ago         133MB
```
<上記の場合>

```
docker commit 4fe63b604f41 nginx-new
```

新しくnginx-newのイメージができる。

```
% docker images                               
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f35646e83998        3 weeks ago         133MB
nginx-new           latest              9b8e8bcd32fe        33 minutes ago      185MB
```

※以降nginx-newで起動する方法は上記内容参照
Webスクレイピングツール５選 | Webクローラーを簡単評価(2)

 [Webスクレイピングツール](https://jp.scrapestorm.com/)は、Webサイトで必要な情報を取得するように開発されています。今回はこの五つのWebスクレイピングツールを紹介します。
##1.Getleft
Getleftは [Webサイトグラバー](https://jp.scrapestorm.com/)です。 URLを指定すると、サイト全体、または少なくともユーザーが設定したオプションに一致するサイトの一部をダウンロードしようとします。
***特徴：***
***・***Webサイトをまるごとダウンロードできる
***・***ダウンロードしたサイトのリンクをハードディスクから直接閲覧できる
***・***中断された場合、またはタイムアウトした場合は、ダウンロードを再開できる
***・***特定の種類のファイルをダウンロードしないようにフィルターする
![6　Getleft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/d169021b-27c8-149f-109f-5bbc2013a874.png)
##2.Diggernaut
Diggernautは、Webからの[データスクレイピング](https://jp.scrapestorm.com/)、抽出、および収集サービスを提供します。 ユーザーに代わって[ウェブスクレイピング](https://jp.scrapestorm.com/)を行い、ウェブサイトからデータを抽出して正規化し、データをクラウドに保存できます。 小売店のサイトから製品価格やその他の関連情報、レビュー、評価、さまざまな通信社のWebサイトのニュースやソースの統計データを抽出するのに役立ちます。
***特徴：***
***・***APIサービスを提供する
***・***無料のスクレーパーリポジトリに既製のソリューションを提供する
***・***IOサービスを提供し、他のプラットフォームにデータの入出力を自動化できる
![7　Diggernaut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/aed55a3f-6f1d-dd38-3937-742ce3e72d32.png)
##3.Websundew
WebSundewは、完全なWebデータ抽出ソフトウェアおよびサービスです。 高精度、高速でWebデータを[スクレイピング](https://jp.scrapestorm.com/)します。Eコマース、不動産、ITなど様々なWebサイトから情を引き出すことができるWindows専用のWebスクレイピングツールです。
***特徴：***
***・***複雑さに応じた価格設定ポリシー
***・***代行でデータ抽出サービスを提供する
***・***Eclipseをベースに構築されている。
![8　Websundew.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/6865fd5d-d84b-fa64-fa4b-2735dfd427ad.png)
##4.Easy Web Extract
Easy Web ExtractとはWebページからコンテンツ（テキスト、URL、画像、ファイル）を抽出し、画面を数回クリックするだけで結果を複数の形式に変換する使いやすいWebスクレイピングツールです。プログラミングは不要です。Windows向けのスクレイピングソフトウェアです。
***特徴：***
***・***複数のスレッドでデータをスクレイピングする
***・***いつでもWebスクレイピングを実行するようにスケジュールできる
***・***商品画像ギャラリーをスクレイピングするのに役立つ
***・***（部分文字列の選択、置換、分割など）などのすぐに使用できるスクリプトを提供する
![9　Easy Web Extract.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/dcf9a24a-3063-a9ce-a2de-2f0cad98756e.png)
##5.Screen Scraper
ユーザーはプログラミングなどを全くする必要がなく、指定のサイトと納品データ・フォーマットを選ぶだけでスクレイピングを実行してくれます。
***特徴：***
***・***メソッドとAPIを使用して外部アプリケーションを呼び出すことができる
***・***クロスプラットフォームであり、どこでも展開できる
***・***.NET、Java、Ruby、PHP、またはその他の言語からスクリーンスクレイパーを呼び出す
![10　Screen Scraper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/1cada7e4-9488-5a66-c6d1-806e1cf400b7.png)
サポートベクターマシンのまとめ

この記事は個人的なお勉強用のメモです。

# 講義

動画の講義は無し。
講義資料は有り。
つまり、自習。

# 自習

## サポートベクターマシン

Support Vector Machine: SVM

### 参考情報

- 講義資料『Appendix サポートベクターマシン』
- YouTube『【機械学習】サポートベクトルマシン』（Able Programming）
- 書籍『機械学習のエッセンス』（SBクリエイティブ）

上記の動画や書籍を見てみたが、数式の難易度が高く、100%理解できたかと問われると疑問が残る。

### 概要

少なくとも概要レベルは完ぺきに理解しておくことにする。

- 教師あり学習
- 分類問題で説明されること多いが回帰問題にも応用できる。
- 出力はクラスの確率ではなくクラスそのものである。
- 計算コストが大きい。
- クラスの間に、2次元であれば線を引く。
- 線と最も近いデータをサポートベクタという。
- 線とサポートベクタとの間の距離をマージンという。
- SVMではマージンを最大化するように線を引く。（$w$ を求める）
- 重要なのはサポートベクタのみであり、サポートベクタ以外のデータは意味をなさない。
- SVMにはハードマージンとソフトマージンの2種類がある。
- ハードマージンは線ではっきりと分類する。
- ソフトマージンは線の間にある程度の誤りを許容する。
- その誤りはスラック変数  $\xi$ （クサイ）で考慮する。
- 高次元空間に特徴量を増やすことによって分類の性能を高める。
- 単純に特徴量を増やすと計算量が多くなるため、カーネルトリックで抑制する。
- カーネルトリックとは、ベクトルの内積をカーネル関数で置き換えること。
- カーネル関数には、多項式カーネル、ガウスカーネル、シグモイドカーネルがある。


# 実装演習

```python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

iris_dataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_dataset.data, iris_dataset.target)
svc = SVC()
svc.fit(X_train, y_train)
print(svc.score(X_train, y_train))
print(svc.score(X_test, y_test))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/9872f9a2-00f8-c57b-b50d-a733a5769027.png)

SVM では、学習データおよびテストデータの両方において、スコアが高い。
これはアヤメのデータセットそのものがきれいに分類できているのも理由にあるのだろうか。

# 修了テスト～練習問題～

### 問題6（SVM）

SVMの欠点

- 計算コストが非常に高い  
データ数 $n$ の $2$ 乗のオーダー

### 問題7（SVM）

カーネル関数

```math
k(x^{(i)}, x^{(j)})=\phi \bigl(x{(i)}\bigr)^T \phi \bigl(x{(j)}\bigr)
```

### 問題8（SVM）

ガウス動径基底関数

```math
k(x^{(i)}, x^{(j)})=\exp\Biggl(-\frac{||x^{(i)}-x^{(j)}||^2}{2\sigma^2}\Biggr)
```

【参考】
ガウス関数

```math
f(x)=a \exp\Biggl(-\frac{(x-b)^2}{2c^2}\Biggr)
```

正規分布関数

```math
f(x)= \frac{1}{\sqrt{2\pi}\sigma}\exp\Biggl(-\frac{(x-\mu)^2}{2\sigma^2}\Biggr)
```
アルゴリズム（kNN、k-means）のまとめ

この記事は個人的なお勉強用のメモです。

# 講義

## k近傍法（kNN）

- 教師あり学習
- 分類を予測
- 予測対象のデータに最も近い k個のデータを取ってきて、それらのデータが最も多く所属するクラスを予測値とする、という単純なアルゴリズム。（要するに、多数決でクラスを決めるだけ）

### kについて

- kの値によって分類の結果が変わる場合がある。
- kは事前に決めておく。（ハイパーパラメータ）
- kを大きくすると決定境界は滑らかになる。

## k-平均法（k-means）

- 教師なし学習
- クラスタリングする（クラス分けする）

#### 処理順序

1. 分類する個数を決める。
2. クラスタの中心の初期値をランダムに決める。
3. 各データに対して、どれが最も近いクラスタの中心か求める。
4. 各クラスタの平均ベクトル（中心）を計算する。
5. 3と4を繰り返す。

クラスタの中心を変化させていって、変化が落ち着いたところが
クラスタリング終了といったところか。

#### 特徴

- 中心の初期値が近いと、うまくクラスタリングできない。  
k-means++という手法を使うと、初期値がうまくばらける。
- kの値を変えるとクラスタリング結果も変わる。  
人間の目で見てkの値を判断する必要性がある。

# 修了テスト～練習問題～（kNN）

kNNの問題が無い。

# 修了テスト～練習問題～（k-means）


### 問題22（k-means）

内側の1つ目のforループ
データごとに最も近いクラスタの中心を求める処理。

```python
for centroid in centroids:
  for i, x in enumerate(data):
    indexes[i] = np.argmin(np.sum((x - centroid) ** 2, axis=1))
```

説明
x：既存の1つのデータ
centroid：クラスタの中心の1つのデータ
x - centroid：成分ごとの差を求める。
(...) **2：成分の差ごとに二乗する。
np.sum(..., axis=1)：異なる成分の差を足す。足すのは右方向。
np.argmin：最小値を持つインデックスを返す。

### 問題23（k-means）

内側の2つ目のforループ
クラスタの中心を再計算する。
再計算とは、データの平均値を求める。

```python
for i in range(k):
  centroisd[i] = data[indexes==i].mean(axis=0)
```

説明
k：クラスタの個数（4個）
i：クラスタの番号（みたいなもの、0～3）
centroids：クラスタの中心が複数
data[indexes==i]：クラスタの番号iと一致するdataを抽出する。
data[...].mean：該当するデータの平均値を計算する。

### 問題25（k-means）

k-meansの欠点は、初期値が近いとうまくクラスタリングできないこと。
k-means++によって、この欠点が改良された。


### 問題26（k-means++）

k-means++で初期のクラスタの中心（セントロイド）を決めるアルゴリズム

```python
probabilities = np.repeat(1/n, n)
centroids = np.zeros((k, 2))
distances = np.zeros((n, k))

for in in range(k):
  centroids[i] = data[np.random.choice(np.arange(n), p=probabirities, size=(1))]
  distances[:, i] = np.sum((data - centroids[i]) ** 2, axis=1)
  probabilities = np.sum(distance, axis=1) / np.sum(distance)
```

probabilities：確率をセットする。確率なので全部足すと1になる。
全体の距離のうち、データごとの距離の割合を求める。
その割合を probabilities変数にセットする。

距離が遠い
＝probabilities変数にセットされる値が大きい
＝次にセントロイドとして選ばれる確率が高い
という仕組み。
逆に言うと、近い距離のデータはセントロイドとして選ばれづらくなる。

こうやって、距離が遠いものをセントロイドとして選んでいく。

用語
クラスタの中心：セントロイド

# 実装演習（kNN）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/d143b5d9-1d1f-ee1f-d52c-02c69205653c.png)

上の結果はkの値が3の場合。
100×100のメッシュグリッドを作って、そのメッシュグリッドに対して
クラス分類をしている。
NumPyを使った実装による結果だが、十分にクラス分類できている。

kの値を10にしたところ、滑らかな線が描かれた。
どの程度のkが適切かは機械的に求めるのは難しい側面があるので
人間の目で結果を見て、パラメータ（kNNの場合はk）の値が適切か
判断する必要がありそう。

scikit-learnのKNeighborsClassifierクラスを使った方も実行してみた。
NumPyのときと同じグラフが描かれた。
当然だろうが、NumPyで自前で書いたものと同じアルゴリズムで
KNeighborsClassifierクラスが動作しているのであろう。

# 実装演習（k-means）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/8327408e-a4ba-07c6-452f-1eb743f2e7d6.png)

これは iter_max=100 の場合。
きれいにクラスタリングできている。

試しに、iter_max=2にして実行してみたところ、
それでもきれいにクラスタリングできた。
（100の場合と分類境界がほぼ同じ）

今回のデータは明確に3種類に分けられるため、
クラスタの中心を再計算する回数も少なくて済むのだろう。
逆いうと、データが明確に分けづらい場合は
クラスタの中心を再計算する回数が多く必要になるのだろう。
主成分分析のまとめ

この記事は個人的なお勉強用のメモです。

# 講義

### 主成分分析とは

- 教師なし学習
- 変量(特徴量)の個数を減らす＝次元を減らす。
- 次元を減らす際はなるべく情報量を落とさない。
- 2次元・3次元まで落とすと可視化できる。

### 求め方

1. すべてのデータで成分ごとに平均をとる（1つの平均的なベクトルを作る）
2. すべてのデータで平均との差をとる。（成分が差になっている行列を作る。）
3. この行列の分散を求める。（分散共分散行列）
4. 線形変換後のベクトルを求める。

### 分散共分散行列

分散共分散行列とは、データごとに共分散を求め、それを行列にしたもの。
対称行列。
対角成分は同じデータ同士の共分散なので、単なる分散になる。

### 実装上のキーワード

- 共分散行列の作成 np.cov
- 固有値分解 np.linalg.eig  
戻り値はタプル、1つ目は固有値、2つ目は固有ベクトル
- ソートしてインデックスを取得 np.argsort  
引数に -1 を指定すると降順になる。  
この関数はあくまでもソート後のインデックスを返すのみ。


### 用語

- 次元の呪い  
Bellman「空間の次元が増えるのに対応して、問題の複雑さが指数関数的に大きくなる」
- 球面集中現象  
高次元空間の場合、データが超球面上に分布しやすくなる。  
高次元になると、点がほとんど同じ距離になる。
- 特徴選択  
特徴量の組み合わせを最適化する。
- 寄与率  
ある固有値が全体のどの程度の割合で情報を含むか。  
寄与率が高い固有値を成分として採用する（削減せずに残す）。

# 実装演習

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/0731cdf2-afb7-519c-27e9-3080a42e160e.png)

pca.explained_variance_ratio_変数に、成分ごとの割合が降順で格納される。
それを棒グラフに表示している。
第1成分が45%くらい、第2成分が20%くらいなので、この2つの成分だけでも65%くらいの
情報を表現できているという意味。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/2b022914-3586-dad8-88a5-fce97268a290.png)

いくつかの他方の領域に含まれており、正しく分類できていない個所が多く存在する。
元は97%だったのでそれに比べると累積の寄与率が65%程度では正解率がかなり落ちる。

# 修了テスト～練習問題～

### 問題76（主成分分析）

Wikipediaより

主成分分析は、相関のある多数の変数から相関のない少数で全体のばらつきを
最もよく表す主成分と呼ばれる変数を合成する多変量解析の一手法。

変量を削除するのではない。

### 問題77（主成分分析）

主成分分析の計算の過程で分散を計算する。
分散がもっとも大きい成分を求めるため。

### 問題78（主成分分析）

```math
a_1=
\begin{pmatrix}
a_{1x}\\
a_{1y}
\end{pmatrix}
,

a_2=
\begin{pmatrix}
a_{2x}\\
a_{2y}
\end{pmatrix}
,

a_3=
\begin{pmatrix}
a_{3x}\\
a_{3y}
\end{pmatrix}\\
e=
\begin{pmatrix}
e_{x}\\
e_{y}
\end{pmatrix}\\
```

```math
分散 V=
\frac{(a_1e)^2+(a_2e)^2+(a_3e)^2}{3}
```

式変形すると

```math
分散 V=e^TXe
```

行列 $X$ を共分散行列という。

# 演習問題

公式の演習問題が見当たらない。
代わりに某問題集を使って勉強。

```python
def pca(X, n_components):
  X = X - X.mean(axis=0)
  cov = np.cov(X, rowvar=False)
  l, v = np.linalg.eig(cov)
  l_index = np.argsort(l)[::-1]
  v_ = v[:,l_index]
  components = v_[:,:n_components]
  T = np.dot(X, components)
  return T
```

1. 平均をとる
2. 分散共分散行列を求める
3. 固有値と固有ベクトルを求める
4. 固有値を降順でソートするためのインデックスを求める
5. 固有ベクトルを降順でソートする
6. n_componentsの個数だけ、固有ベクトルを切り出す
7. データを低次元空間に射影する

scikit-learnを使わなくても、Pythonだけでこれほど短いコードで
PCAを実装できる。
ソースコードから思想を読み取るべきか？

# 結果として

あくまで個人の見解になりますが
先に結果を言いますと「否」になります。

# 何回も失敗しているから

実装方法や方針の資料が無い場合で、
他の実装を参考にする…という手順になるのですが、
かなりの確率で間違えてます。

特に変更するソースファイルが増えるほど後の巻き戻しが多いです。

余裕でスケジュール吹っ飛ばします。

# 問題点

①過去実装からまとめた実装方法を有識者に見てもらう
　→これは繰り返すスパンが短ければ短いほど良いと思います。
　PDCAを高速で回して実装方法を確立するべきです。

②ソースからしか読み取るものが無い
　→レビューの回数を増やすべきだと思います。
　　兎に角自己判断で決めつけないことが大事。
　　fixしてコミットするまでは「実装中」。

③他社との兼ね合いで思想が分からない、または、変更点が被りそう
　→立場によって変わりますが、なるべく影響のない実装方法を模索すること。
　　共通テーブルとか使ってたら、最新版で既存から一部削除されて別途追加されてるなんて事がありかねない。
　　というか実際にあった。

④共通化や使用方法が簡略化されるはず
　→確証の無い思い込みが1番危険
　　実際に、「一部の変更より簡単にする方向性・そういう思想となるんだろう。」と思って進めたところ、ドツボにハマった。
約1ヶ月3、4回目のリファクタリングが発生した
　　他者巻き込む程のリソースとメリットがあれば別ですが、自分の思想と仕事は切り分けることが最短かもしれない

⑤理解度不足
　→検証が大雑把の場合、PDCAのPlanが深く掘り下げられて無いことになる。
　　後々になって判明することでリファクタリングが発生



# 対策は？

いくつか述べてますが、
　・有識者に見てもらう
　・精度が大雑把なときから何回もレビューしてもらう
　・実装の思い込みがないか立ち止まる(独自理論で都合の良い解釈をしないこと)
　・疑問点はこまめに質問する
　・コードの制御は１行ずつ追ってよく理解すること

以上。
多分基本的な事だと思います。
個人的な見解になりますが、5年目でも未だに出来てなかったポンコツなので記載する。

※再投稿記事（前のは最初の記事に上書きしたため）
pukiwiki新規設置時の改修点メモ（2020年版）

# 概要
2020年3月にリリースされたpukiwiki1.5.3を新規設置する場合の改修ポイントメモ。

## 環境等
- PHP 7.3
- xreaサーバ
- pukiwiki 1.5.3

# 手順

## 新規設置
設置方法等については、本家、他のサイトに記載があるので省略。

## 改修ポイント（個人的には必須と思う部分）
### 管理人表示名を変更する
画面上に表示される管理人名を変更する。対象ファイルはpukiwiki.ini.php、122行目と125行目。modifier変数を変えると表示名、modifierlink変数を変更すると、張られるリンクが変更される。

```php:pukiwiki.ini.php

// Site admin's name (CHANGE THIS)
$modifier = 'anonymous';

// Site admin's Web page (CHANGE THIS)
$modifierlink = 'http://pukiwiki.example.com/';

```

### 凍結用パスワードを変更する
ページ凍結用のパスワードを変更する。対象はpukiwiki.ini.php、１８９行目付近から。

```php:pukiwiki.ini.php

/////////////////////////////////////////////////
// Admin password for this Wikisite

// Default: always fail
$adminpass = '{x-php-md5}!';

// Sample:
//$adminpass = 'pass'; // Cleartext
//$adminpass = '{x-php-md5}1a1dc91c907325c69271ddf0c944bc72'; // PHP md5()  'pass'
//$adminpass = '{x-php-sha256}d74ff0ee8da3b9806b18c877dbf29bbde50b5bd8e4dad7a3a725000feb82e8f1'; // PHP sha256  'pass'
//$adminpass = '{CRYPT}$1$AR.Gk94x$uCe8fUUGMfxAPH83psCZG/';   // LDAP CRYPT 'pass'
//$adminpass = '{MD5}Gh3JHJBzJcaScd3wyUS8cg==';               // LDAP MD5   'pass'
//$adminpass = '{SMD5}o7lTdtHFJDqxFOVX09C8QnlmYmZnd2Qx';      // LDAP SMD5  'pass'
//$adminpass = '{SHA256}10/w7o2juYBrGMh32/KbveULW9jk2tejpyUAD+uC6PE=' // LDAP SHA256 'pass'

/////////////////////////////////////////////////

```


### タイトル表示を変更する
pukiwikiでページを作成した際に表示されるページタイトル（タイトルタグ）に表示される、サイトのタイトルを変更する。対象はpukiwiki.ini.php、113行目。初期表示は「PukiWiki」なので、これを変更する。

```php:pukiwiki.ini.php

// Title of your Wikisite (Name this)
// Also used as RSS feed's channel name etc
$page_title = 'PukiWiki';

```


### 関連ページ一覧、添付ファイル一覧を表示させない
pukiwikiでは初期設定のままだと、ページ下部に関連ページ（リンクされているページ）、添付ファイル一覧が表示されるが、これを非表示にする。対象はdefault.ini.php、58行目、62行目。

```php:default.ini.php（修正前）

/////////////////////////////////////////////////
// 添付ファイルの一覧を常に表示する (負担がかかります)
$attach_link = 1;

/////////////////////////////////////////////////
// 関連するページのリンク一覧を常に表示する(負担がかかります)
$related_link = 1;

```

```php:default.ini.php（修正後）

/////////////////////////////////////////////////
// 添付ファイルの一覧を常に表示する (負担がかかります)
$attach_link = 0;

/////////////////////////////////////////////////
// 関連するページのリンク一覧を常に表示する(負担がかかります)
$related_link = 0;

```

## 改修ポイント（好み次第）
### メニューバーの幅調整
レスポンシブ対応にはなったが、PCで観た場合でも、メニューバーの幅は若干狭いと感じるので修正する。対象はpukiwiki.cssの373行目。

```css:pukiwiki.css（修正前）

div#menubar {
  min-width:12em;
  max-width:12em;
  min-width: 100px;
  max-width: 300px;
  padding:0;
  margin:4px;
  font-size:90%;
  overflow:hidden;
  order:1;
  flex-grow:0;
}

```

```css:pukiwiki.css（修正後）

div#menubar {
	/*
  min-width:12em;
  max-width:12em;
  */
  min-width: 100px;
  max-width: 300px;
  min-width: 100px;
  max-width: 300px;
  padding:0;
  margin:4px;
  font-size:90%;
  overflow:hidden;
  order:1;
  flex-grow:0;
}

```

### ページタイトル直下のURL表示修正
日本語名のページが入る場合は、URL表示で日本語が通常表示できるように修正しておいたほうが無難。pukiwiki.skin.phpの18行目付近から始まる設定を「Show topicpath」、つまり「0」に変更する。

```php:pukiwiki.skin.php

// SKIN_DEFAULT_DISABLE_TOPICPATH
//   1 = Show reload URL
//   0 = Show topicpath
if (! defined('SKIN_DEFAULT_DISABLE_TOPICPATH'))
	define('SKIN_DEFAULT_DISABLE_TOPICPATH', 0); // 1, 0

```
【PowerShell】  iTextSharp で PDF を回転させる


[以前の記事](https://qiita.com/AWtnb/items/215f77d97b7ea069a06a) に引き続き、 iTextSharp で PDF を回転させます。

## 事前準備

`$PROFILE` と同じディレクトリに用意した `lib` に itextsharp.dll を配置し、下記のようにして読み込んでおきます。

```PowerShell
Add-Type -Path ($PROFILE | Split-Path -Parent | Join-Path -ChildPath "lib\itextsharp.dll")
```

## コード

```PowerShell
function Invoke-PdfRotate {
    param(
        [parameter(ValueFromPipeline = $true)]$inputObj
        ,[ValidateSet(90, 180, 270)][int]$clockwise = 180
    )
    begin {}
    process {
        $fileObj = Get-Item $inputObj
        if ($fileObj.Extension -ne ".pdf") {
            Write-Error "Non-pdf file!"
            return
        }
        "rotating clockwise {0} degrees: '{1}'" -f $clockwise, $fileObj.Name | Write-Host -ForegroundColor Cyan
        try {
            $outFullPath = $fileObj.Directory | Join-Path -ChildPath "rotate$($clockwise)_$($fileObj.Name)"
            $pdfReader = New-Object iTextSharp.text.pdf.PdfReader($fileObj.Fullname)
            for ($i = 1; $i -le $pdfReader.NumberOfPages; $i++) {
                $page = $pdfReader.getPageN($i)
                $rotate = $page.getAsNumber([iTextSharp.text.pdf.PdfName]::ROTATE)
                $degree = ($rotate)? ($rotate.IntValue + $clockwise) % 360 : $clockwise
                $page.put([iTextSharp.text.pdf.PdfName]::ROTATE, [iTextSharp.text.pdf.PdfNumber]::new($degree))
            }
            $fileStream = New-Object System.IO.FileStream($outFullPath, [System.IO.FileMode]::Create)
            $pdfStamper = New-Object iTextSharp.text.pdf.PdfStamper($pdfReader, $fileStream)
            $pdfStamper.Close()
            $filestream.Close()
            $pdfReader.Close()
        }
        catch {
            Write-Error "ERROR: faield to rotate..."
        }
    }
    end {}
}
```

余談ですが、2番目以降のパラメータを指定するとき先頭にカンマを打つという書き方を見かけて最近マネしています。パラメータ属性が複雑になったときに区切りがハッキリして可読性が上がるような気がします。

## 使い方

ファイルをパイプもしくは `-inputObj` パラメータで渡します。回転方向は時計回りに90度・180度・270度から選択できるようにしました。

```
# パラメータに渡す
> Invoke-PdfRotate -inputObj .\hoge.pdf

# パイプで渡す
> ls -file | Invoke-PdfRotate -clockWise 90
```

---

仕事場の複合機が不調だと紙詰まりが頻繁に発生します。回避のためにホチキス跡のない側からフィーダーに通すのですが、その結果生じる「上下逆転したスキャン PDF を逐一手作業で回転させる仕事」をなくせないかと考えたコマンドです。
回転機能は複合機側に付いていてほしいですね……。
行き詰ったから復習してみた_11/08_update

こんばんは(*´ω｀)

ありますよね、そんな事も、人間だもの。
そんな時は御参りをしたり、散歩したり、
あとは理解したことを整理します。

今までやったことは身についてるのでしょうか??(笑)

パソコンに向かって書こうとしても
行き詰った負のイメージしか湧いてこないので、
取りあえず、手書きしてみました。
スタックでも実装してみます。

何も見ないで、やってみましたが、
最初は手が動かなくて途方に暮れます(笑)
でも、幹の部分だけでもいいので
書いて、PC に取り込んで動かしてみます。
足りない所、どうすればコードを昇華させられるか
考えて変更してみます。

ある程度、煮詰めた後に問題ないか整理してみました。
![IMG_0036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/74478b92-14af-4c3d-46a1-45b3170d3568.jpeg)
**ざっくり仕様**
**1.user interface は 3択 (push/pop/end)**
**2.例外処理を盛り込む**
**3.バッファ出来るデータ個数は 5個※個数は気分**


```stack.py
class stack_sys:
    def __init__(self,size=5):
        buff =[]
        self.buff = buff
        self.size = size
    def push(self,InD):
        if len(self.buff) >= self.size:
            print("full")
            print(self.buff)
        else:
            self.buff.append(InD)
    def pop(self):
        if len(self.buff) <= 0:
            print("empty")
        else:
            return self.buff.pop() # pop(0) にするとqueue に変更
    
stack = stack_sys()

if __name__ == "__main__":
    
    while True:
        sel_mode = int(input("1.push,2.pop,3.break"))
        
        if sel_mode == 1:
            try:
                Din = int(input(""))
                stack.push(Din)
            except:
                pass
        elif sel_mode == 2:
            try:
                Dout = stack.pop()
                print(Dout)
            except:
                pass
        else:
            break
```

プログラムに行き詰ったら
皆さんは何をしますか？
騙されたと思ってやってみてください、スッキリします(≧▽≦)

今日、偶然ですが、[プログラミングのチカラを身につけるなら](https://qiita.com/zurazurataicho/items/f003002e89c487430725)に出会いました。
継続し、少しずつ深化する考え方にとても救われました。
私のように既存のコードを動かして表面だけ理解し
記事にすることは間違いではないようですが、
**それだけで終わってしまっては何も意味がないと理解しました。**

ゼロから自分のイメージをコードに落とし、
自分なりに確かな理解を積み上げていきたいと思います。
過去の記事で不足分は今後 update していきます。

引き続き宜しくお願い致します。m(_ _)m

**11/04_update***************************************************************************************
[sort を使わずに**バブル**ソート](https://qiita.com/AKpirion/items/7a4fa899d0471ecba19d) をupdate しました。
シンプルなアルゴだとは思いますが、for の中身を
どこまでキッチリかけるかで、全く成立しないプログラムになっちゃいます。
**11/05_update***************************************************************************************
[sort を使わずに**クイック**ソート](https://qiita.com/AKpirion/items/d365a70b3cd1a93b8537) をupdate しました。
ここから再帰処理が入ってきます。
まず最初に基本構成をキッチリ作ります。
そのあとは再帰処理したい領域を if 文で
しっかり分割できれば、あとは渡すだけです。
例えばですが条件で使う < , <= の違いを意識しないと
コードの挙動が別物になります(笑)
**11/07_update***************************************************************************************
[sort を使わずに**マ―ジ**ソート](https://qiita.com/AKpirion/items/a737f1cd7aa47f976802) をupdate しました。
イメージを全て伝えきれていないかもしれません。
それは私の理解不足を露呈しているかも。。
**11/08_update***************************************************************************************
[避けて通りたかった Hash chain その(1)](https://qiita.com/AKpirion/items/e002c7ae598777df35f9) をupdate しました。
申し訳ありません、一部間違ってましたm(_ _)m
wikiについて

wiki選定時の候補について
ツールの使いこなしがすごく上手な方に教えてもらったのでメモ。

#esa
UIがすごくいい！
非エンジニアの人も使いやすい！
https://esa.io/

#growi
crowiを元に、色々デプロイ！とかしなくてもよくなってるやつ。
https://growi.cloud/

#crowi
無料のオープンソースなマークダウン形式でメモが残せるwikiツール。
使いやすい。
https://github.com/crowi/crowi

バージョンアップしたらherokuにデプロイしたりとか
画像はAWSのs3とかにupしたりするように設定しないといけないらしい。
https://jp.heroku.com/what
https://aws.amazon.com/jp/s3/