OmniAICreator/Qiita-1.07M huggingface dataset:
【lddコマンド】依存関係を確認する方法

#まず
今回記述するコマンドは
依存する側がどのファイルに依存しているのかを確認するのであって、
依存される側がどのファイルから依存されているかを判別するものではありません。

共有ライブラリ側から依存ファイルを確認する方法をご存じの方がいたら教えて下さい。。！

#どうすればわかるのか　=>　$ ldd


```
$ ldd [オプション] [対象ファイル名]
```

ldd(エルディーディー)です。
又、ファイル名はフルパスで指定してください。

▼参考:「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word13813.html#:~:text=%E3%80%8Cldd%E3%80%8D%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AFUNIX%E7%B3%BB,Mac%E3%81%A8%E3%81%8B%EF%BC%89%E3%81%A7%E4%BD%BF%E3%81%88%E3%81%BE%E3%81%99%E3%80%82&text=%E5%AF%BE%E8%B1%A1%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%8C%87%E5%AE%9A,%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82


オプションは下記引用になります。
>
|オプション|説明|
|:-------|:-----|
|-d      |「データ再配置を処理する」らしい|
| --data-relocs|	「データ再配置を処理する」らしい|
|-r|	「データと関数再配置を処理する」らしい|
|--function-relocs|	「データと関数再配置を処理する」らしい|
|-u|	使用されていない直接依存関係を表示する|
|--unused|	使用されていない直接依存関係を表示する|
|-v|	全ての情報を表示する|
|--verbose|	全ての情報を表示する|
|--help|	ヘルプを表示する|
|--version|	バージョン情報を表示する|

#出力から依存関係を確認
▼参考:依存しているライブラリを調べるには
https://www.atmarkit.co.jp/flinux/rensai/linuxtips/134whatneedlib.html
下記引用例を見て確認
>
$ ldd /bin/ls　←調べるプログラムはフルパスで指定する
        libtermcap.so.2 => /lib/libtermcap.so.2 (0x2aac6000)
        libc.so.6 => /lib/libc.so.6 (0x2aaca000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x2aaab000)

この場合、　`/bin/ls`　と依存関係にあるファイルは
 => の先にある　`/lib/libtermcap.so.2`　などになります。
【初心者でもわかる】CSSだけでアイコン画像の色を変える方法

# どうも7noteです。cssだけで1枚のアイコン画像を好きな色に変える方法（IEにも対応!!）

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/technique/iconcolor/
Raspberry Pi4のSDをバックアップしてみた

Raspberry Pi 4のSD（32GB）がいっぱいになり、落ちることが増えました。そこで、Macにバックアップし、新しいSD（64GB）にリストアしてみました。

#Macにバックアップ
SDカードをMacに差してターミナルを起動し、以下のコマンドを入力してディスク名を確認します。

```
$ diskutil list
（略）
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.3 GB    disk2
   1:             Windows_FAT_32 boot                    268.4 MB   disk2s1
   2:                      Linux                         31.0 GB    disk2s2
```

ディスク名を確認できたら、バックアップのためにアンマウントしないといけないので、以下のコマンドでアンマウントします。

```
$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```

ddコマンドでバックアップします。コマンドは以下の通りです。

```
i$ sudo dd if=/dev/disk2 of=raspi-backup.img bs=1m
Password:
29808+0 records in
29808+0 records out
31255953408 bytes transferred in 2896.330466 secs (10791570 bytes/sec)
```
#新しいSDカードにリストアする
リストアするSDカード（64GB）は、Macの" ディスクユーティリティ > extFAT > 消去 "と進みます。

リストアするためにアンマウントします。

```
$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```
ddコマンドでリストア。

```
$ sudo dd if=./raspi-backup.img of=/dev/disk2 bs=1m
Password:
dd: /dev/disk2: end of device
28139+0 records in
28138+1 records out
29504835584 bytes transferred in 2630.225134 secs (11217608 bytes/sec)
```
SD(64GB)で起動後、以下のコマンド実行します。"A1 Expand Filesystem"を選択し、有効（Enable)にし、再起動します。

```
$ sudo raspi-config
```

#(おまけ）
df -h で /dev/root が100%になったとき、/var/logや/root/.pm2/などのログをファイルサイズで削除するとよいです。

```
sudo find /root/.pm2/ -type f -size +1k -name "*.log" -exec rm -f {} \;
sudo find /root/.pm2/ -type f -size 0 -name "*.log" -exec rm -f {} \;
```

#参考サイト
[RaspberryPiのバックアップ＆リストア方法 for Mac](https://simple-was-best.com/blog-entry-raspberrypi-backup-restore-for-mac.html)
[Raspberry Piで最小サイズのバックアップを作成する](https://dev.classmethod.jp/articles/raspberrypi-backup-restore/)
[Raspberry Piのバックアップ方法(Windows、Mac)](https://gloria.cool/blog/20200209-raspberrypi-backup/)
[Macで64GB以上のFAT32フォーマットはディスクユーティリティでFAT形式を選び空き容量の拡張でイケる](https://raspida.com/mac-format-64gbfat32)
第8回パケットトレーサーでVPN環境を構築

6月から始めたアウトプット勉強もついに**10個目の記事**に突入しました

記念すべき**10個目**なので、、、

初めてアサインされた構築現場で使用していた技術である**VPN**に関して記事を書いていきます。
パケットトレーサーでも**VPN構築**できることが分かったので復習を兼ねてチャレンジしてみました。


##VPN
(Virtual Private Network)
インターネット上に仮想的な専用線をつくり拠点間をつなぐ技術
暗号化などセキュリテイを重視する場合、暗号化技術のIPsecを活用した**IPsec-VPN**またはセッション層で使用される**SSL-VPN**が使用されています。

##IPsec
(Security Architecture for Internet Protocol)
**ネットワーク層**で使用するIPパケット単位で安全な暗号通信を行うプロトコル
データリンクやトランスポート層から影響を受けず、**暗号通信が可能**です。

##ISAKMP(アイサカンプ)
(Internet Security Association Key Management Protocol)
IPsecで利用されるセキュリテイを確立させるためのプロトコル
VPN通信をする際は**フェーズ1と2**を経て通信が確立されます。

##SA
(Security Association)
セキュアな通信を提供するために、**2つのネットワーク間で同じセキュリティを確立**すること。

##構築ネットワーク
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/927ee332-201f-2ebe-532e-d80383a6d093.png)


###設定内容

```ruby:閉域網内のRIP構築
一拠点間での通信だったので小規模向けルーティングプロトコルであるRIPを選択

<投入コンフィグ>
router rip　
network 11.0.0.0
RouterA設定
network 192.168.1.0
RouterB設定
network 192.168.2.0
exit
```

##フェーズ1 ISAKMP設定

```ruby:★ISAKMP作成
<投入コンフィグ>　　RouterA/B共通
①ISAKMP SAを生成するためのポリシー設定(数値が低いほど優先度高)
crypto isakmp policy 10
②暗号化アルゴリズムの設定
encryption aes 256
③ハッシュアルゴリズムの設定
hash sha
④認証方式の設定 
authentication pre-share
⑤グループの設定
group 2
⑥ISAKMP SAのライフタイムの設定
lifetime 86400

exit
⑦(pre-share)ハッシュアルゴリズムにおいて事前共有鍵を指定した場合、対抗先との事前共有鍵を設定
crypto isakmp key TEST1 address 11.0.0.2 RouterA設定
crypto isakmp key TEST1 address 11.0.0.1 RouterB設定
```

##フェーズ2 生成されたISAKMP SAでIPsec SAを生成

```ruby:IPsecTransform設定
①セキュリティプロトコル＋暗号化(esp-aes)＋認証(esp-sha-hmac)で設定する
<投入コンフィグ>　RouterA/B共通
crypto ipsec transform-set TSET esp-aes esp-sha-hmac
```

```ruby:対抗ルーターへのアクセスリスト
②IPsecの対象となる送信先と宛先のアクセスリストを設定する
<投入コンフィグ>
RouterA設定
access-list 101 permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255

RouterB設定
access-list 101 permit ip 192.168.2.0 0.0.0.255 192.168.1.0 0.0.0.255
```

```ruby:CyptoMap設定
<投入コンフィグ>
RouterA設定
③暗号マップ（crypto map）の設定
crypto map CMAP 10 ipsec-isakmp
④対抗先(RouterB)のアドレスの設定
set peer 11.0.0.2
⑤暗号マップに関連付けるアクセスリスト(101)の設定
match address 101
⑥暗号マップに関連付けるIPsecトランスフォームの設定
set transform-set TSET

RouterB設定
③暗号マップ（crypto map）の設定
crypto map CMAP 10 ipsec-isakmp
④対抗先(RouterA)のアドレスの設定
set peer 11.0.0.1
⑤暗号マップに関連付けるアクセスリスト(101)の設定
match address 101
⑥暗号マップに関連付けるIPsecトランスフォームの設定
set transform-set TSET
```

```ruby:閉域網側のインターフェースfa0/1でCyptoMapを有効化
⑦どのインターフェースで作成した暗号マップ（crypto map）を適用するか決める
<投入コンフィグ>　RouterA/B共通
int fa0/1
crypto map CMAP
do write
```
##投入結果

PCAからPCBへの通信結果
![PCAからBへの通信.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/e0980317-dfe8-9a0f-a90e-12806eeeead0.png)

PC AからPC Bに対してICMP疎通ができているので**IPsec-VPN通信が成功**しました。

参考: [ネットワークエンジニアとして IPsecをはじめから](https://www.infraexpert.com/study/study10.html)
GCEで立てたWindows Serverが外部からめっちゃログイン試されててファイアウォールとか見直した話

#どうして気づいた
別件で、立てたWindows Serverのログを取ろうとして、[公式](https://cloud.google.com/logging/docs/agent/installation?hl=ja)からStackdriverをインストールして、
「お、ログ入ってきてるやん」
なんてぬか喜びしてたんですよ。
でもよくみてみると、![スクリーンショット 2020-09-04 18.03.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/a0120270-44a7-bf94-7d12-222a76dd847c.png)
####なんか数秒ごとにログイン失敗してるログがめちゃくちゃ出てくる！！
Account Nameが「ADMINISTRATOR」とかいろんな名前で総当たりでログインしてきているのがわかります。

#え、やばくね？
とりあえずファイアウォールか。
でもインスタンス立てる時に自分のIPからしかRDP(TCP:3389)できないようにしたはず。

でも確認してみると・・・
![スクリーンショット 2020-09-04 21.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/64bf58a3-1536-3f1d-4716-04e6d128dbad.png)
設定されてなーい！！

####ファイアウォールのルールは作成したら必ずネットワークタグで適用しよう！アラサーとの約束だよ！！

#他に考えるべきは・・・
[公式](https://cloud.google.com/vpc/docs/firewalls#blockedtraffic)を確認すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/7968fdd2-aa78-b708-9d7e-94b780fe232c.png)
とりあえず許可さえしなければ外部から第三者が接続できる、なんてことはそうそう無いようです。

#そういえばファイアウォールルールには
デフォルトで設定されているものがあります。その中には
>default-allow-rdp
>任意の送信元からネットワーク内の任意のインスタンスへの TCP ポート 3389 での上り（内向き）接続を許可します。このルールの>優先度は 65534 で、Microsoft リモート デスクトップ プロトコル（RDP）を実行しているインスタンスへの接続を有効にします。

があります。

自作で自分のIPからしかRDPできないようなルールを作って優先度高くしていますが、これがあると結局誰でもRDPできるような設定になっています。
てことでこの設定を**無効化**。

#WindowsServerへの接続はRDPだけなのか？
[公式](https://cloud.google.com/compute/docs/instances/connecting-to-instance?hl=ja)によると、
・RDP(リモートデスクトップ)
・Special Administrative Console
・PowerShell ターミナルを使用
の3つがあるとのこと

・RDP(リモートデスクトップ)
は上記設定で塞いだ。

・Special Administrative Console
はVMインスタンスの設定で**シリアルポート接続を有効化**をしていないといけないらしい。
デフォルトでは無効であり、トラブルシューティング的に使うものらしいのでこのまま。

・PowerShell ターミナルを使用
は
>ファイアウォール ルールを追加して、Windows Server インスタンスが存在する Google Cloud VPC ネットワーク上のポート 5986 を開くようにこのルールを設定します。

とあるので、ファイアウォールルールで許可しない限りは大丈夫。

#で、どうなった？
何日か動かした後、こちらに追記します。

2020/9/9追記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/2105bd3b-9da1-7d34-867b-71cc64149a78.png)
設定以降、そのようなログが出力されなくなりました！
【Java Bronze学習】カプセル化・データ隠蔽・情報隠蔽の違い

##前提
<b>使用教材</b>
・スッキリわかるJava入門
・Java SE 7/8 Bronze問題集（黒本）

Java Bronzeの学習中に、ややこしい！と思った概念「カプセル化」「データ隠蔽」「情報隠蔽」についてまとめます。
「スッキリわかるJava入門」ではカプセル化・情報隠蔽・データ遮蔽の違いを明瞭にしていない（そもそも「データ隠蔽」「情報隠蔽」という用語が出てこない）ので、Java黒本の内容を参考にしています。

##カプセル化

「１　関係するデータをまとめること」
「２　まとめたデータを必要とする処理をまとめること」

※カプセル化は、データ遮蔽と組み合わせることで完成する。

##データ隠蔽
「外部からフィールドを直接操作できないようにすること」

<b>目的：カプセル化の維持</b>

カプセル化によってまとめられたデータが、まとめたもの以外のモジュールから利用されて関係が複雑化するのを防ぐ。

<b>実装方法</b>
・アクセス修飾子をprivateにすることで外部からフィールド操作を禁じる
・フィールドにアクセスしたい場合はgetter, setterと呼ばれるメソッド（アクセサメソッド）を介するようにする（必須では無い）


##情報隠蔽
「公開すべきものと非公開にすべきものを区別して扱うこと」

<b>目的：抽象化の効果を維持</b>

抽象化によって、モジュール間の関係性を単純化している。
「使われる側」にある、抽象化によって無視したはずのモジュールを、「使う側」が勝手に利用してしまうと、関係性が複雑化する。これを避けるために情報遮蔽を行う

<b>実装方法</b>
・公開部分→インターフェースとして公開する
・非公開部分→パッケージ・アクセス修飾子を使って不適切なアクセスを制御する


・ポリモーフィズム（多態化）との関係
　※ポリモーフィズム＝インスタンスを抽象化し、共通の型で扱うこと
→外部から不必要な箇所を触られて、抽象化してざっくりまとめた処理が複雑化するのを防ぐために情報隠蔽する
ElasticSearchのちょっとしたコマンド集

筆者は自然言語関連の仕事をしています。世の中的には「自然言語処理＝ディープラーニングとか機械学習系のもの」みたいなイメージができつつありますが、現場ではElasticSearchなど検索エンジンのほうが実用的だったりするシーンが多いなと感じてます。

ElasticSearchを使っていると`curl`コマンドでちょっと確認できると便利ですよね。自分でコピペして使う用もかねて確認でよく使うものを集めてみました。

各コマンド末尾にパラメータ`pretty=true`がついてますが、これをつけると出力のJSONがインデントして見やすく表示されます。
## インデックスの一覧
ElasticSearchのインデックスの一覧を表示します。

```bash
curl "localhost:9200/_aliases?pretty=true"
```
結果の例

```json
{
  "demo" : {
    "aliases" : { }
  },
  "demo2" : {
    "aliases" : { }
  },
  "demo3" : {
    "aliases" : { }
  },
  "myindex" : {
    "aliases" : { }
  }
}
```

## インデックスに登録されているデータの件数
指定されたインデックス（以下では"demo"）に登録されているデータの件数を表示します。

```bash
curl "localhost:9200/demo/_count?pretty=true"
```
結果の例

```json
{
  "count" : 120,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  }
}
```

最近知ったのですが、ワイルドカード「*」を付けるとそのパターンに当てはまるインデックスの件数を合算してくれるようです。例えば以下なら、"demo", "demo2", "demo3" の件数を合算です。

```bash
curl "localhost:9200/demo*/_count?pretty=true"
```

# おわりに
もう少し色々と載せたかったのですが、おいおい追記していくことにします。

普段はこちらの会社で自然言語関連の業務をしています。
ElasticSearchやKivanaなどのシステム構築をお考えの方はぜひお声がけください。
→  [アイフォーカス・ネットワーク株式会社](https://wwww.ifocus-network.com/)
Elasticsearchにzip形式のプラグインをインストールする

手元にあったzip形式のプラグインをインストールする必要があったので、メモとして残しておきます。

* Elasticsearchのバージョンは7.7.0です。
* 実行環境はUbuntu18.04です。

# 方法

以下のコマンドを打つだけです。(zip名は変えてあります）

```
/usr/share/elasticsearch/bin/elasticsearch-plugin install --batch /tmp/plugin.zip
```

# Dockerfile上でインストールする

Dockerfileを利用して、docker imageをビルドする際にプラグインを予めインストールしておくことも可能です。以下のような内容の`Dockerfile`を作成します。

```Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:7.7.0
COPY plugin.zip /tmp
RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch file:///tmp/plugin.zip
```

* Dockerfileと同じディレクトリ上で、プラグインのzipがある状態にしておきます。
* `docker build -t custom-elasticsearch .` と実行することでイメージをビルドできます。
* 実行時はelasticsearchの仕様上、9200番と9300番のポートを開けておく必要があります。以下のコマンドで実行します。（ノードが1つの場合）

```
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  custom-elasticsearch
``` 

# 補足: `--batch`について

`--batch`というのはプラグインのインストールの「Batch Mode」というもので、特にDockerfileでビルドする際には、インストール時の確認を省略するために必須です。もし付けなかった場合は以下の例外が発生します。

```
Exception in thread "main" java.lang.IllegalStateException: unable to read from standard input; is standard input open and a tty attached?
	at org.elasticsearch.cli.Terminal$SystemTerminal.readText(Terminal.java:273)
	at org.elasticsearch.plugins.PluginSecurity.prompt(PluginSecurity.java:74)
	at org.elasticsearch.plugins.PluginSecurity.confirmPolicyExceptions(PluginSecurity.java:67)
	at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:878)
	at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:254)
	at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:224)
	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127)
	at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:91)
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127)
	at org.elasticsearch.cli.Command.main(Command.java:90)
	at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
```

# 参考
* [Install Elasticsearch with Docker | Elasticsearch Reference [7.9] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html)
ファブレス(fabless)、デザインハウス、EMS(Electronics Manufacturing Service)、ベンダー(vendor)、付加価値再販業者


応用情報技術者平成30年春期 午前問65

EMS(electronics manufacturing services)の説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/15e84e9c-74c9-fb8f-28e5-3ff2f30d1646.png)

１、ファブレス(fabless)の説明
製造設備をもたず，製品の企画，設計及び開発を行う。

特徴：設計して、自社ブランドとして、他社に製造依頼する。

２、デザインハウスの説明
相手先ブランドで販売する電子機器の設計だけを受託し，製造は相手先で行う。

特徴：他社ブランドとして、受託して設計して、他社に納品して、製造する。

３、EMS(electronics manufacturing services)は、電子機器の設計から製造までを専門に受託するサービスのことです。

特徴：他社ブランドとして、受託して設計から製造をして、他社に納品する。


電子機器の製造は技術的に高度かつ複雑であり、メーカ企業が自社内に製造ラインを設置し、維持管理するには多大なコストが掛かります。EMSの始まりはメーカ企業の下請け工場でしたが、電子機器には共通部品が多く、メーカ企業が個別の製品ごとに製造ラインを設置するのは非効率的なので、徐々に外部へ委託する形態が主流になっていきました。その結果としてEMSという業務形態が発達しました。

４、ベンダー(vendor)の説明
他メーカから仕入れた電子機器などの販売を専門に行う。

５、付加価値再販業者の説明
外部から調達した電子機器に付加価値を加えて，自社ブランドで販売する。

６、ITアウトソーシングサービスの説明
自社ブランドで販売する電子機器のソフトウェア開発だけを外部に委託し，ハードウェアは自社で設計製造する。


７、コールセンターの説明
一般消費者からの家電製品に関する問合せの受付窓口となって電話対応を行う。


参照：

https://www.fe-siken.com/kakomon/28_haru/q70.html


https://www.ap-siken.com/kakomon/30_haru/q65.html
Google Shopping Listにいつも買うものを自動で追加する

# あらまし

Google Shopping Listにいつも買うものをワンクリックで追加する、テンプレート機能的なものを実装するために以下のスクリプトを書きました。

[Function to a given item to Google Shopping List. Paste the code in the DevTools' console!](https://gist.github.com/igrep/a41d2f9678621b5bb5e5e0d7c79ae6e5)

適当に編集してブックマークレットにするなりして用法用量を守りながらお使いください。

# 動機

コロナ禍によって外出をできるだけ減らす努力をした結果、食料の買い出しが週一回程度になった。  
➡️ 毎度決まって買うものがはっきりしてきた。  
➡️ 同じものを繰り返し買い物リストに追加するのは面倒だし、テンプレート機能的なのがほしい。  
➡️ Google Homeから使うのが一番楽なのはなんやかんや[Google Shopping List](https://shoppinglist.google.com/)だよな  
➡️ でもGoogle Shopping Listは超シンプルだしそんな機能実装しないかー、APIもないしなー  
➡️ 💪ないなら作るか！

# ⚠️注意事項⚠️

この手の、公開されたAPIを使用しないスクリプトにおいては半ば常識的なことですが、念のため。

- Google Shopping ListのHTML・JavaScriptの内部構造に直接依存した作りになっています。  
  そのため、Google Shopping Listの構造が変わった場合、いつの間にか動かなくなってしまう恐れがあります。
- この関数を使ってあまりにもたくさんのアイテムを同時に追加すると、Googleさんに怒られてしまう可能性があります。  
  まぁ、個人が一度の買い物で買うものをまとめて追加する分には全く問題ないとは思いますが。

# できたもの

こういう関数ができました。

```javascript
const input = document.getElementsByClassName("listItemInput")[0];
const form = document.getElementsByClassName("addForm")[0];

function addItem(name){
  input.dispatchEvent(new Event("focus"));
  input.value = name;
  input.dispatchEvent(new Event("input"));
  form.dispatchEvent(new Event("submit"));
}
```

動作確認はGoogle ChromeとFirefox<small>（ともにWindows版）</small>で行いましたが、残念ながらFirefoxでは動きませんでした😞。  
なぜか「追加できた！」と思った直後にページがリロードされてその後追加する前に戻ってしまうんですよねぇ。

手元でDevToolsを使って試していたときは、思いのほかうまく行かず時間がかかってしまいました。  
しかしでき上がったものは👆のとおり極めて単純ですね。  
必要なイベントを必要な要素に擬似的に発火しつつ、フォームに指定した文字列を突っ込んでいるだけです。

# 使い方

後は次のように`addItem`関数を呼び出すコードを適当に追記して、行儀良くするために`function`で囲いつつ、ブックマークレットとして保存・クリックするだけです（[参考](https://qiita.com/aqril_1132/items/b5f9040ccb8cbc705d04)）。

```javascript
(function(){
const input = document.getElementsByClassName("listItemInput")[0];
const form = document.getElementsByClassName("addForm")[0];

function addItem(name){
  input.dispatchEvent(new Event("focus"));
  input.value = name;
  input.dispatchEvent(new Event("input"));
  form.dispatchEvent(new Event("submit"));
}

addItem("牛乳");
addItem("納豆");
addItem("チーズ");
addItem("豆腐");
// ...
})();
```

Enjoy!!
Databricks事例紹介 ~コンシューマー編~

はじめに
本記事では、Databricksのコンシューマいわゆる消費者にまつわる事例をご紹介します。

1,Electrolux社
公式事例URL：https://databricks.com/customers/electrolux

2,Grab社
公式事例URL：https://databricks.com/customers/grab


■Grab社

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321357/faf00a7b-693f-f829-e9ba-3073772e5ffd.png)


■ユースケース
豊富な顧客セグメントとより深いプロファイルを構築
より効率的かつ効果的に、顧客により良いサービスを提供

■課題
・様々なデータチームがそれぞれの目的を基に業務を行なっていたため
一貫性をもって顧客を理解できていなかった
・部門間での各データにある属性間の関係を見落としていた
・それぞれのチームでそれぞれのシステムを構築していたため複数のデータパイプラインができ、それぞれを維持および更新管理をする必要があった
・エンジニアの工数が増大し、コストも大幅に増加した
・データの民主化を行ない各チームでその可能性を統合して深い洞察を得る必要があった

上記課題から必要としていたニーズ
・データ量に関係なく拡張や部門間などでのコラボレーションを可能にする統合データ分析プラットフォームが必要だった。
・顧客にパーソナライズされた体験を提供するために顧客セグメントの集中化された一貫したビューを提供するソリューションが必要だった。

■成果
・Databricksを搭載したGrabの社内セルフサービス顧客データソリューション（Customer 360）は、様々な角度から集約された顧客属性の真の単一ソースを実現した。
この民主化された顧客データにどこからでも安全にアクセスして、顧客の習慣やニーズについてよりよく学習し、強化されたアプリ内エクスペリエンスを作成できるようになった。
・Databricksを活用したCustomer 360により、Grabは顧客データを活用し、地理空間的またはトランザクションの観点を超えて、さまざまな製品セグメントおよび機能にわたってお客様の一貫した理解を構築できるようになった
・Delta Lakeを通じて、Grabは、データの整合性とセキュリティをさらに強化する方法で、Webサイトやアプリケーションからユーザーが生成した数千の信号とデータソースを取り込み、最適化。
・数週間かかっていた面倒な作業が今では数時間に短縮
・データをシームレスに統合するDatabricksの機能により、豊富な顧客セグメントとより深いプロファイルを実現
・完全にセルフサービスの内部ポータルを通じて、さまざまなチームが簡単にコラボレーションして、顧客データ、洞察、属性、およびライフタイムバリューを調査可能になった
・より効率的かつ効果的に、より適切な推奨を行ったり、顧客の好みに合わせた新機能を設計したりして、アプリ内エクスペリエンスを改善し、顧客により良いサービスを提供できるようになった。



■Electrolux社

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321357/3bde39e0-cde0-da57-dc2d-c3f735604a42.png)


■ユースケース
売上予測を改善し、サプライチェーンを合理化し、製品をタイムリーに提供することで収益を予測し、顧客満足度を向上

■課題
・400以上の倉庫と流通センターより年間6000万以上位の製品を製造、出荷しているため、非常に複雑なサプライチェーン（仕入れから出荷までの一連の流れのこと）となっている
・このサプライチェーンにより、競争圧力や揮発性物質のコストの発生
・サプライチェーンの複雑さと管理するモデルの数が多かったため、データ資産を管理するだけでなく、さまざまなモデルすべてをバージョン管理するためのより良い方法が必要
・分析方法は、従来Excelに複数のデータソースから履歴情報（価格、オンライン評価、レビューなど）を入力。このプロセスで非常に大きなリソースを消費するだけでなく、マーケティングキャンペーンの影響を明確に示さない不正確な予測をもたらした

■成果
・Databricksを使用すると、Electroluxは大量の消費者データと製品データを簡単に取り込み、機械学習を大規模に活用して、マーケティングROIと売上予測の改善を通じてバリューチェーンを最適化する方法をより深く理解できた
・Delta Lakeを使用すると、Electoluxのデータチームは数百万のデータポイントを簡単に取り込み、データ品質の問題を心配することなく、大規模な堅牢な本番データパイプラインを構築できた。
・MLflowは、Electroluxの完全な機械学習ライフサイクルを合理化します。「Databricksを使用すると、さまざまなバージョンの実験とシミュレーションを追跡し、組織全体でモデルをパッケージ化して共有及び展開が可能。その結果、予測モデルをはるかに速いペースで反復して、より正確な予測を行うことができる。
・データチームにとって、技術者ではないチームメンバーが活用できる方法で実用的な洞察を提供することも重要である。全体として、同じプラットフォームでのデータサイエンス、エンジニアリング、およびアナリストチームの統合により、チーム間のコラボレーションが促進され、ビジネス全体の販売と運用を改善する新しいデータ主導の機会が生まれた。
・エレクトロラックスの販売予測エンジンの中核にDatabrikcsを導入したことにより、絶え間なく改善されてスマートになっている何千ものモデルにデータを供給するため、グローバルサプライチェーンの複雑さは今や貴重な資産であり、競争上の差別化要因と見なされている。
同社は現在、消費者と市場が将来どのように振る舞うかをより正確に予測することが可能。これらの新たな洞察により、サプライチェーンのすべての重要な側面が改善。特に、販売およびマーケティングキャンペーンが販売予測に与える影響大。
・Databricksを使用すると、セールスプロモーションがより的確に行われるだけでなく、適切な製品を適切なコンシューマーに適切なタイミングで提供可能となる
BCP(Business Continuity Plan，事業継続計画)ー4段階のフェーズ　BCP発動、業務再開、業務回復、全面復旧

応用情報技術者平成30年春期 午前問63

BCPの説明はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d4188bfc-e332-c982-ac52-d5ac1777bea5.png)


１、BCP(Business Continuity Plan，事業継続計画)は、予期せぬ災害が発生した場合に、最低限の事業を継続し、または早期に復旧・再開できるようにする企業が定めた行動計画です。

２、経済産業省や厚生労働省の資料では、BCPの発動から全面復旧に至るまでを以下の4段階のフェーズに分けています。
　・BCP発動フェーズ
　　災害や事故の発生（或いは発生の可能性）を検知してから、初期対応を実施し、BCP発動に至るまでのフェーズ

　・業務再開フェーズ
　　BCPを発動してから、バックアップサイト・手作業などの代替手段により業務を再開し、軌道に乗せるまでのフェーズ

　・業務回復フェーズ
　　最も緊急度の高い業務や機能が再開された後、さらに復旧する業務の範囲を拡大するフェーズ

　・全面復旧フェーズ
　　代替設備・手段から平常運用へ切り替えるフェーズ

参考：
https://www.fe-siken.com/kakomon/23_aki/q61.html
システム監査項目ー機密性（confidentiality）、完全性（integrity）、可用性（availability）、効率性（efficiency）

応用情報技術者平成30年春期 午前問60

マスタファイル管理に関するシステム監査項目のうち，可用性に該当するものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/894aef46-6275-35cf-67af-dd8f9e4b933e.png)

情報セキュリティを「情報の機密性、完全性及び可用性の維持」と定義し、機密性、完全性、可用性について：
・機密性（confidentiality）	
　アクセスを認可された者だけが情報にアクセスできることを確実にすること

・完全性（integrity）	
　情報および処理方法が、正確であること及び完全であることを保護すること

・可用性（availability）	
　認可された利用者が、必要なときに、情報及び関連する資産にアクセスできることを確実にすること




１、可用性(Availability)とは、
システムが正常に稼働し続け、ユーザが必要な時にシステムが利用可能である特性を示します。

例え、マスタファイルが置かれているサーバを二重化し，耐障害性の向上を図っていること
→　障害が起きてもサービスの提供を維持できるような対策が実施されているかどうかが、可用性の監査項目になります。


２、効率性に該当する項目
マスタファイルのデータを複数件まとめて検索・加工するための機能が，システムに盛り込まれていること

３、機密性に該当する項目
マスタファイルのメンテナンスは，特権アカウントを付与された者だけに許されていること

４、完全性に該当する項目
マスタファイルへのデータ入力チェック機能が，システムに盛り込まれていること



参考：
システム監査の視点
情報システムを「信頼性」「安全性」「効率性」の視点で検証・評価します。具体的には、以下のような内容があげられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c054723d-9e33-edab-54cd-0af9ea19480c.png)


言い方が違いますね。困るな。。。


参照：
https://www.fe-siken.com/kakomon/24_aki/q60.html


“安心して使えるシステム”を客観的に評価する
https://www.itmedia.co.jp/im/articles/0403/27/news017.html

システム監査の視点：「信頼性」「安全性」「効率性」
https://www.asckk.co.jp/services/id21
Amazon ECS 及び AWS Fargate概要

Amazon ECSとAWS Fargateの概要についてまとめる。学習目的兼備忘録。


## Amazon ECS

* コンテナオーケストレーター
  * コンテナのデプロイ、スケーリング、クラスター管理などをサポートするサービス
* 様々なAWSサービスとの連携をサポート
* コンテナの起動タイプは、EC2起動タイプとFargate起動タイプから選択
  * EC2起動タイプ：ECSコンテナエージェントを実行し、クラスターに登録されているEC2インスタンス
  * Fargate起動タイプ：下記参照。



### Amazon ECSの主要要素

![ECS_Component.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/a79d5254-4abe-e1bc-1dd2-f470dbba4e6d.png)

* **タスク**
  * タスク定義に基づいて起動するコンテナの集合
  * タスク内のコンテナは同一ホスト上で実行
* **タスク定義**
  * コンテナ群定義
  * イメージレジストリや使用CPU、タスクへの割り当てIAMロールなどを指定
* **サービス**
  * どのタスク定義を使用するか、タスクの起動数、ELBとの連携、起動方式(EC2,Fargate)などを管理する定義

* **クラスター**
  * コンテナインスタンス(コンテナを起動させるインスタンス)の集合

## AWS Fargate

* コンテナ実行用のマネージドコンピューティングエンジン
* Amazon ECSと連携
* コンテナ用インスタンスのプロビジョニングやスケーリング管理をサポート
* タスクとサービスをFargate起動タイプとして設定することで利用
  * EC2起動タイプよりも、利用状況に対して最適化されることが多く、コスト面で〇
  * EC2起動タイプで対応しているパラメータの中でサポートしていないものもあり。



## Amazon ECSとAWS Fargateを利用したコンテナ実行イメージ

![ECS_Fargate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/0f99ce25-3656-607b-b941-fc2dc45f1631.png)

## 参考情報
* [[AWS Black Belt Online Seminar]Amazon Elastic Container Service サービスカットシリーズ](https://d1.awsstatic.com/webinars/jp/pdf/services/20200422_BlackBelt_Amazon_ECS_Share.pdf)
* [[AWS Black Belt Online Seminar]AWS Fargate サービスカットシリーズ](https://d1.awsstatic.com/webinars/jp/pdf/services/20190925_AWS-BlackBelt_AWSFargate.pdf)
【PHP】basename,require,require_once

PHPについて学習内容を備忘録としてまとめます。

#basename
basenameとはパスの最後にある名前の部分を返す関数です。

例えば、下記のように記述すると出力結果は'index.html'となります。

```php

<?php
print basename("/etc/index.html");
?>

#結果
index.html

```
また、第２引数に値を設定することで末尾から文字をカットすることできます。

```php

<?php
print basename("/etc/index.html",".html");
?>

#結果
index

```


#requre,require_once
ライブラリや他のPHPファイルを読み込むときに使用されるのがrequre,require_onceです。
##require
記述の仕方は、下記のようにどちらでも問題ありません。
またパスの指定は絶対パス、相対パスどちらでも大丈夫です。

```php

require"ファイルパス";
require("ファイルパス");

```

他のファイルの関数を使う場合はこのように記載します。

```php

#test1.php
require './test2.php';
test2();

#test2.php
function test2(){
	print'test2';
}

#実行結果
test2
```

##require_once
repuire_once文はrepuire文と違ってファイルが既に読み込まれている状態であれば再読み込みは行いません。
repuire文の場合だと意図せずライブラリや設定ファイルが再読み込みされた場合に関数再定義エラーや変数の書き換えなどが起きてしまいます。require_once文はこれを防ぐことができます。

#参考URL
https://www.php.net/manual/ja/function.basename.php
https://uxmilk.jp/26454
kustomize による共通 label の対象から Deployment の selector.matchLabels を除外する

## バージョン

- kustomize v3.8.2

## 文脈

kustomize の [commonLabels](https://github.com/kubernetes-sigs/kustomize/tree/kustomize/v3.8.2/examples/transformerconfigs) を使うと、管理するリソースに一括で label を付与する事ができて便利。
しかし commonLabels は `deployment.spec.selector.matchLabels` のようなイミュータブルなフィールドも編集するので、リソース更新時に事故がよく起きる。
なので commonLabels の編集対象から `deployment.spec.selector.matchLabels` を外したいということはよくあるのだが、commonLabels ではできない。

## 方法

[LabelSelector](https://github.com/kubernetes-sigs/kustomize/blob/kustomize/v3.8.2/site/content/en/guides/plugins/builtins.md#labeltransformer) というビルトインされたプラグインを使う。

まず kustomization.yaml に transformer を追加する。

```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
transformers:
  - label-transformer.yaml 
```

次に label-transformer.yaml を作る。

```yaml
apiVersion: builtin
kind: LabelTransformer
metadata:
  name: metadata-labels
labels:
  app.kubernetes.io/component: database
fieldSpecs:
- path: metadata/labels
  create: true
- path: spec/template/metadata/labels
  kind: Deployment
  create: true
```

ビルドして確かめると、期待通りの結果になっているはず。

```
$ kustomize build | grep labels -2
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: foo
    app.kubernetes.io/component: database
  name: foo
--
  template:
    metadata:
      labels:
        app.kubernetes.io/name: foo
        app.kubernetes.io/component: database
```

```console
$ kustomize build | grep matchLabels -2
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: foo # 👈 ここに app.kubernetes.io/component: database が正しく存在しない
  template:
```

## おわりに

どうやら kustomization.yaml に書ける便利機能はだいたい builtin plugins として切り出されているらしい。
kustomize の挙動を調整したくなったら[このページ](https://github.com/kubernetes-sigs/kustomize/blob/kustomize/v3.8.2/site/content/en/guides/plugins/builtins.md)を覗くと良さそう。
内部統制的な視点ー入力作業のチェックポイント

応用情報技術者平成30年春期 午前問57

業務部門が起票した入力原票を，情報システム部門でデータ入力する場合，情報システム部門の業務として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c9fb5371-d75f-b02f-2fbb-3f2f8c3557cc.png)


１、内部統制的な視点から考えると以下の点が入力作業におけるチェックポイントなります。
・入力データの正確性・完全性・正当性の確保
・エラーデータの修正・再処理手段の確保
・マスタデータの正確性の確保

・内部統制
業務が適正に行われていることを確保するために、組織が自ら体制を構築しシステム化することです。
内部統制は、業務の有効性・効率性を高めること、財務報告書の信頼性を高めること、法令遵守、資産の保全を目的として行います。
日本版SOX法の施行に伴い、各企業が内部統制の整備を行っています。


２、上記の視点にょり、下記活動をします。
・業務部門が入力原票ごとの処理結果を確認できるように，処理結果リストを業務部門に送付して
　入力データと処理結果を照合することで入力データの完全性を確保すること

・入力原票の記入内容に誤りがある場合は，入力データの誤りは勝手に修正せずに起票した業務部門に確認すること

・入力原票の受領枚数の点検などの授受確認は、授受ごとに枚数を確認すること

・入力済みの入力原票は，入力データにエラーがあった場合の再処理するなどの理由で、不正使用や機密情報の漏えいように、厳重に管理し一定期間保管します。エラーデータの修正・再処理手段の確保すること。



参照：
https://www.fe-siken.com/kakomon/27_aki/q57.html

https://itsiken.com/30S_L3/30S_L3_57.html
[WIP]arduino IDEにおける追加ボードファイル等のフォルダ構成

macの場合、ライブラリとかボートファイルがどこにあるのかなかなか見つからなかったのでメモっておく

- 追加したボードのパス
/Users/<ユーザ名>/Library/Arduino15/packages

- 標準ボードのパス
/Applications/Arduino.app/Contents/Java/hardware/
プログラミングの続け方

#はじめに
いざプログラム学習を始めたものの、様々な理由で学習が続けられなく事はあります。
その理由の多くはモチベーションを維持できない事になると思います。
裏を返せば**モチベーションを維持できればプログラム学習をやり遂げる事が出来る**とも言えます。

#内容
この記事では、私が今まで学習してきた方法を例にして、誰でもプログラミングを学習を続けられる方法について解説していきます。

#実行
モチベーションが続くなくなる方法は、主に次の3つが挙げられます。

・難しい所で立ち止まる
・エラーが解けない
・学習の意義が解らない

一つ一つ見ていきます。

##難しい所で立ち止まる
プログラム学習を進めていると、
`「とりあえずサンプルをそのまま写して動くようになったけど、どうしてこういう結果が出るのか解らない」`
という事が起こります。
「用語の意味が解らない…」とか「どうしてこのメソッドを使うのか解らない」といった具合です。

プログラム学習は独特の用語があったり、演算子の使い方が数学と違ったりするので、一度考え出すとキリがなくなり、やる気も次第に失せていきます。

###どうすればいいのか？
こういう時、私はとにかく***「後で復習するつもりで読み飛ばしていく」***を実行していました。

`「とりあえず、間違えずに写せれば良い」`
`「狙った結果が出たのだから、それで良し」`
という具合に、100%理解できてなくても先に進むようにしていました。

そうしていると、そのうち**「そのまま写しても、狙った結果が出ない」**部分に到達します。

`そうなった時に初めて過去に解らないままにしていた部分を復習します`。
最初は結果オーライで済ました部分を「どういう処理を行っているのか？」とか「どうしてこういう記述をするのか？」という観点で見ていきます。
すると***今度は最初に比べて良く理解できるようになっています***。

とにかく先に進んでいるうちに`「その言語の全体像が少しずつ見えてくる」`という理由で、***「こういう事か！」***とより進んだ理解に繋がります。

それを繰り返して、先ほど全く手が出なかった部分に取り組んでみると、今度はすんなり理解できたりします。

モチベーションを保ったまま学習を続けるには、

・100%理解できてなくても先に進める
・後で必ず復習する
を繰り返すの最適だと思います。

##エラーが解けない
独学にせよ通学にせよ、エラーはとても辛いものです。
Progateで一通り学習した後に、書籍などで学習する人が一番苦しむ部分になります。
「このコードを実行すれば、こういうコードが出ます」と書いてあるのに、**実行したら違う結果がでたりエラーが出て実行されない**事は頻繁にあります。

###どうすればいいのか？
エラーが出た時は一番最初に**「本当に正しくコードが書けているか？」**を確認するべきです。
`私は’message’と書くところを’mesagge’と書いてしまい、2週間程エラーに悩まされた事があります。`
プログラミングはちょっとしたスペルミスで、全く別の処理をしてしまうので、正しく書けているかどうか？はしっかり確認する必要があります。

スペルミスが特に見つからない場合は、インターネットで検索します。
私はGoogleを利用していました。
`プログラム学習を私より先に行っている人は非常に多く、自分と同じエラーをしている人は星の数ほどいます。`
エラー文を検索したり、質問サイトで質問したりすると、ピンポイントな情報を手に入れる事も珍しくありません。

この項目については別途投稿したいと思いますが、とにかく**「自分にしか起きない、オリジナリティー溢れるエラーは存在しない」**という事は知っておくべきでしょう。


##学習の意義が解らない
`「そもそもプログラム学習をして意味があるのか？」`
`「この言語を習得しても役立たないのでは？」`というのは誰もが一度は考える事です。

前者については「今の仕事のままでもいいや」といった気持ちから、後者は「最近違う言語も流行ってきてるし、そっちを学習するのもいいな」といった気持ちから生じます。

###どうすればいいのか？
これについては「他のプログラム学習者に話してみる」というのが一番良いです。
スクールだったら講師や他の受講生の人と話してみる、SNSに投稿してみる、など色々な手段があります。

話していると「自分も同じ事を考えている」とか「実はこういう意味があるんですよ」とか、色々なコメントを頂く事ができます。
**実のある会話が出来てなくても、一人で悶々と考えているよるよりは気が楽になります**し、**人に伝えようとする内に考えが整理されることもあります**。

最近ではもくもく会のようなプログラム学習者の集まりもありますし、他の学習者と話す機会はどんどん増えていると思います。

私は最近は一緒に学習していた人とオンラインで話すことが多いのですが、お互いに画面を共有しながら「今こういう事をやっている」「ここで悩んでいる」という事を話しあっています。
それにより気が楽になったり、学習のヒントが見つけらたりするので、皆さんも自分に会った方法で他の学習者と話すという事を実行して頂ければと思います。

#終わりに
本記事では私が実行してきたモチベーション維持方法を紹介しました。
ここでお話したことはプログラム学習に限らず、他のあらゆるジャンルにも当てはまる事だと思います。
それぞれは簡単に実行できるものだと思いますので、自分にあった方法から試して頂ければと思います。
Arch Linux - wifi-menuがないのでiwctlコマンドで無線接続する

## 背景

ひさびさにインストールしようとしたらインストール用メディアにwifi-menuコマンドが入ってなかった。無線接続の方法がわからないよ。

## 解決方法

```bash
$ iwctl
[iwd]# wsc list  # wifiカードの名前を確認する(wlan0とか)
[iwd]# station wifiカード名 get-networks # アクセスポイントの名前を確認する
[iwd]# station wifiカード名 connect アクセスポイント名
Passphrase: ******...  # パスワードを入力
[iwd]# station wifiカード名 show  # コマンドの結果に"connected"と書いてあればOK
[iwd]# quit
```

## 反省
公式のインストールガイドに書いてあったね...
Docker Machineを使ってAWSにdockerホストの作成(個人的備忘録)

##AWS操作を行うための認証情報の取得
※**AWSのIAMでユーザーを作成していない場合**

```
1. サービスのIAMをクリック
2. 左のメニューからユーザーを選択
3. ユーザーの追加をクリック
4. 任意のユーザー名を入力
5. アクセスの種類はプログラムによるアクセス
6. 次のステップをクリック
7. 権限の設定を「既存のポリシーを直接アタッチ」
8.「AdministratorAccess」にチェックを入れる。
9. 次のステップを押す。
10. 次のステップを押す。
11. 問題が無ければ「ユーザーの作成」をクリック。
```
ユーザーの作成が完了するとアクセスキー、シークレットアクセスキーが表示されるのでメモをしておく。シークレットアクセスキーは「表示」をクリックすると確認できる。これらは**AWSに接続するための鍵**となるので無くさないようにする。

※**既にユーザーを作成している場合**

```
1. サービスのIAMをクリック
2. 左のメニューからユーザーを選択
3. 任意のユーザー名をクリック
4. アクセス権限タブのアクセス権限の追加をクリック
5. 権限の設定を「既存のポリシーを直接アタッチ」
6.「AdministratorAccess」にチェックを入れる。
```
アクセス権限に**「AdministratorAccess」**が追加されていることを確認する。


## ホームディレクトリの下に「.aws」ディレクトリとcredentialsファイルを作る。
```haml
-# ホームディレクトリに移動
% cd 
-# ホームディレクトリに「.aws」の作成、隠しファイルになるのでls -a で確認できる。
% mkdir ~/.aws
-# credentialsの設定
% vim ~/.aws/credentials
-# 先ほどメモした2つのキーを入力
[default]
aws_access_key_id = xxxxxxx
aws_secret_access_key = xxxxxxx
```
##AWSのEC2にインスタンスの作成

```haml
-# 例
% docker-machine create —-driver amazonec2 —-amazonec2-open-port 8000 —-amazonec2-region ap-northeast-1 aws-sandbox
```
**--driver** はamazonec2の指定。
**--amazonec2-open-port 8000** で起動したインスタンスの8000番ポートを外部に公開している。
**--amazonec2-region ap-northeast-1** はリージョンの指定。ap-northeast-1は東京リージョンの指定。
**aws-sandbox** はホストに「aws-sandbox」と言う名前で指定。

EC2のインスタンスを確認し「aws-sandbox」でインスタンスが作られているのがわかる。


##Dockerホスト上でコンテナを起動する
```haml
-# dockerホストに接続するための環境変数の設定
% eval $(docker-machine env aws-sandbox)
-# テスト用のページを表示するhelllo-world-nginx使用してwebserverというコンテナを起動
% docker run -d -p 8000:80 —-name webserver kinematic/hello-world-nginx
-# dockerホストのipの確認
% docker-machine ip aws-sandbox
52.199.66.11
```
52.199.66.11:8000でwebページが表示されることを確認する。

##コンテナの停止
```haml
-# コンテナの停止
% docker-machine stop aws-sandbox
Stopping "aws-sandbox2"...
Machine "aws-sandbox2" was stopped.
```
EC2のインスタンス状態が**「stopped」**になっていることを確認する。

## Dockerホストの削除
```haml
-# dockerホスト削除コマンド 
% docker-machine rm aws-sandbox
About to remove aws-sandbox
WARNING: This action will delete both local reference and remote instance.
-# yを入力
Are you sure? (y/n): y
Successfully removed aws-sandbox
```
EC2のインスタンス状態が「terminated」になっていることを確認する。
メタ構文変数について(hoge?fuga??)

#プログラミング勉強日記
2020年9月4日
「ほげほげ」とか「hogehoge」は良く見るけど、この意味のない言葉って他にもあるのかな？これってなんていうんだろうって思ったのでまとめる。

#メタ構文変数とは
　サンプルプログラムなどで適当に記述したいときによく使われる<font color=blue>意味のない名称</font>のこと。意味を持たないということが重要。
　「hoge」「fuga」「piyo」「foo」「bar」などがメタ構文変数である。


#日本で使われるメタ構文変数
　ほげほげは、上にも述べたようにサンプルプログラムで意味のない文字が必要なときにつかれるメタ構文変数のhogehogeをひらがなで表した言葉。この「ほげほげ」という言葉を動詞化した「ほげる」という言葉も存在し、「ほげる」は新しいことを試みるという意味で使われる。
　hogehogeは日本でのみ使われていて、海外では別のメタ構文変数が使われている。（hogeやfuga、piyoは日本で使われている）

#海外で使われるメタ構文変数
　メタ構文変数は使用される国や言語によって系統が異なる。英語圏では「foo」や「bar」が良く使わている。
　Python(プログラミング言語)では、「span」「ham」「eggs」などが使われている。

#ルール
　メタ構文変数には一定のルールが存在する。hoge、fuga、piyo、hogeraでは、それぞれ使用する順番が決まっている。最初にhogeが使われて、次にfugaかpiyo、そこからhogeraというように続く。
　<font color=blue>最初にいきなりfugaやpiyoから始まることはない</font>
　何度か使用しているとバリデーションがなくなるので、同じ言葉を繰り返す。そのときにhogehogeが出てくる。

　※この繰り返しのやりかたは英語圏のfooとbarには使われない。(foofooという使い方はしないが、foobarといった使い方をする)　

#参考文献
[メタ構文変数](https://wa3.i-3-i.info/word11872.html)
[「ほげほげ」とは？意味や使い方を解説！](https://meaning.jp/posts/906#:~:text=%E3%81%BB%E3%81%92%E3%81%BB%E3%81%92(%E3%83%9B%E3%82%B2%E3%83%9B%E3%82%B2)%E3%81%AE%E6%84%8F%E5%91%B3,%E6%84%8F%E5%91%B3%E3%81%A7%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82&text=%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%80%82)
[「hogehoge（ほげほげ）」とは？意味や使い方をご紹介](https://word-dictionary.jp/posts/1172)
質問の第一歩

#はじめに
学習でも仕事でも、質問する事は大事です。
一人で悩んでいたら丸一日かかることも、質問すれば数分で解決することも珍しくありません。

しかし、質問を使いこなしている人は多くありません。
その理由は質問の仕方が下手というよりは、質問ができないという事が多いのでしょうか？

本記事では、

・どうして質問できないのか？
・どうやって質問するのか？
・という事について書かせて頂きます。

#内容

##どうして質問できないのか？
例えば、海外旅行した時に道が分からなくなったので、誰かに聞く場面を想像してみます。
恐らく、その時次のような事を考えるのではないでしょうか？

##言葉が通じるだろうか？
外国人だという事で警戒されないか？
この人は道を知っているだろうか？
若干被害妄想を含みますが、おおよそこのような事を考えると思います。

これを一般化すると、次のようになります。

・質問を理解してもらえるか？
・自分が質問しても大丈夫か？
・質問相手として適切か？
という事です。

##どうやって質問するのか？
前述のことに対処するには、それぞれ次のようにすると良いです。

・質問のフォーマットを作る
・マナーを守れば大丈夫
・質問対応専門の人に聞く

質問できないのはどうすればいいのか判らないからです。
こうやって質問すれば良いという事が解れば、最初の一歩が踏み出しやすくなります。
そうなれば、後は回数をこなせば、質問に抵抗がなくなってきます。
WordPressのTIPS集（随時更新）

## WordPressの管理画面からプラグインがインストール・アップデートできない時

FTP情報が要求され、入力失敗すると```FTP サーバー ***.***.***.***:21 への接続に失敗しました```というエラーが表示される場合

### wp-config.phpに追記

```php
define('FS_METHOD', 'direct');
```

※ ```if ( !defined('ABSPATH') )``` より上に書く

参考：[\[CentOS\]wordpressでFTPを聞かれないようにする \| ハックノート](https://hacknote.jp/archives/37775/)

## 画像系

### アップロードファイルパスから投稿IDを取得

```php

attachment_url_to_postid( $url );
```

参考：[attachment\_url\_to\_postid\(\) \| Function \| WordPress Developer Resources](https://developer.wordpress.org/reference/functions/attachment_url_to_postid/)

### アップロードファイルパスから拡張子を取得

```php
$filetype = wp_check_filetype( $url );
echo $filetype['ext'];
```

参考：[関数リファレンス/wp check filetype \- WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_check_filetype)

### デフォルトのsitemap.xmlを無効にする

```php
add_filter( 'wp_sitemaps_enabled', '__return_false' );
```

参考：[WordPress 5\.5に実装されたネイティブ サイトマップ機能を無効化する方法 \| 海外SEO情報ブログ](https://www.suzukikenichi.com/blog/how-to-disable-core-xml-sitemap-in-wordpress-5-5/)

### ブロックパターンを無効化

```php
unregister_block_pattern( $pattern_name );
```

ブロックパターン名については以下サイト参考
参考：[WordPress：Gutenbergのブロックパターンやパターンカテゴリを追加・削除する方法 \| NxWorld](https://www.nxworld.net/wordpress/wp-gutenberg-custom-block-pattern-and-block-pattern-category.html)
構成管理プロセス、リリース及び展開管理プロセス、変更管理プロセス、サービスの予算業務及び会計業務プロセスの活動

応用情報技術者平成30年春期 午前問56

JIS Q 20000-2:2013(サービスマネジメントシステムの適用の手引)によれば，構成管理プロセスの活動として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ee2b090b-2664-e725-7ada-7a9afc8b51f1.png)


１、構成管理プロセスは、
すべてのサービス資産と構成およびその関係を特定して構成管理データベース(CMDB)を構築し、それらサービス構成要素の維持管理や制御を活動の中心とするプロセスです。
構成管理データベースには、構成品目、版、関係、ベースライン及びリリースなどの構成情報が記録され、他のプロセスからの求めに応じて情報の提供を行います。


２、サービスの予算業務及び会計業務プロセスの活動
構成品目の総所有費用及び総減価償却費用の計算


３、リリース及び展開管理プロセスの活動
正しい場所及び時間での構成品目の配付


４、変更管理プロセスの活動
変更管理方針で定義された構成品目に対する変更要求の管理


参照：
https://www.ap-siken.com/kakomon/30_haru/q56.html
JupyterLabをdockerでどこででも動かせるようにする

# 手っ取り早くJupyterを動かす

* Dockerをインストールする。https://hub.docker.com/editions/community/docker-ce-desktop-mac/ から。
* コンソールから以下を実行する。これでJupyterが立ち上がる。

```bash
docker run -d --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v "$PWD":/home/jovyan/work -e GRANT_SUDO=yes --user root jupyter/datascience-notebook:$tag start-notebook.sh --NotebookApp.token=password
```

* ブラウザから`127.0.0.1:8888/lab`にアクセス。
* ログイン画面でパスワードを求められたら`password`と入力する。
* 終わり

# どこからでも動かせるようにする。

```bash:run_jupyter_lab
#!/bin/bash
tag=latest
password=password
port=8888

# validate args
if [ $# -gt 1 ]; then
  echo ERROR: the number of args must be 0 or 1
  exit 1
fi

# if a port num is specified, then change the port num
if [ $# -ne 0 ]; then
  port=$1
fi

# the name of running container with port num
name=jl_${port}

# run juypyter lab with port $port
docker run -d --rm -p ${port}:8888 --name ${name} -e JUPYTER_ENABLE_LAB=yes -v "$PWD":/home/jovyan/work -e GRANT_SUDO=yes --user root jupyter/datascience-notebook:$tag start-notebook.sh --NotebookApp.token=$password
```

これを`~/bin/run_jupyter_lab`とかに入れておく。ここにはPATHが通っている前提。

`run_jupyter_lab`コマンドを実行すると、実行したディレクトリの名前でdocker containerが動く。notebookがあるディレクトリなんかで実行すると良い。


# 参考

* https://github.com/jupyter/docker-stacks
* https://hub.docker.com/r/jupyter/datascience-notebook

# VSCodeで動かせるようにする

```json:settings.json
{
    "python.pythonPath": "./.venv/bin/python3",
    "python.analysis.extraPaths": [
        "hoge/"
    ],
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 1000,
    "python.linting.lintOnSave": true,
    "python.linting.pylintEnabled": false,
    "python.linting.pycodestyleEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--ignore=W293, W504",
        "--max-line-length=200",
        "--max-complexity=20"
    ],
    "python.formatting.provider": "autopep8",
    "python.formatting.autopep8Args": [
        "--aggressive",
        "--aggressive"
    ],
    "autoDocstring.docstringFormat": "google",
    "editor.formatOnSave": true
}
```

```bash
pipenv --python 3.8
pipenv install --dev autopep8 flake8 
```

jupyter使うなら

```bash
pipenv install --dev ipykernel
```

必要そうなライブラリインストール

```bash
pipenv install pandas scikit-learn matplotlib
```
業務を継続的に改善する手法ーPDCAは，Plan(計画)→Do(実行)→Check(評価)→Act(見直し・改善)の4段階を繰り返すこと

応用情報技術者平成30年春期 午前問55

JIS Q 20000-1(サービスマネジメントシステム要求事項)は，サービスマネジメントシステム(以下，SMSという)及びサービスのあらゆる場面でPDCA方法論の適用を要求している。SMSの実行(Do)の説明はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c37b2f92-b2ee-d1d1-a078-96d5e8dedd46.png)


１、PDCAは，Plan(計画)→Do(実行)→Check(評価)→Act(見直し・改善)の4段階を繰り返すことによって業務を継続的に改善する手法で，各種のマネジメント手法に取り入れられています。

ITサービス提供者が構築するサービスマネジメントシステム(以下，SMS)への要求事項を示したJIS Q 20000-1:2012では，SMSにおけるPDCAサイクルを次のように定義してます。(選択肢の記述がそのままJIS Q 20000-1:2012における定義なのですが再掲します)
・Plan(計画)
　SMSを確立し，文書化し，合意する。SMSには，サービスの要求事項を満たすための方針，目的，計画及びプロセスが含まれる。

・Do(実行)
　サービスの設計，移行，提供及び改善のためにSMSを導入し，運用する。

・Check(点検)
　方針，目的，計画及びサービスの要求事項について，SMS及びサービスを監視，測定及びレビューし，それらの結果を報告する

・Act(処置)
　SMS及びサービスのパフォーマンスを継続的に改善するための処置を実施する。


参照：
https://www.ap-siken.com/kakomon/30_haru/q55.html
本番環境で画像アップロード時のエラー：「Permission denied @ rb_sysopen - /var/www/rails/app/tmp/uploads/cache/xxxxxx」への対処法

Rrailでアプリを作りAWSの本番環境でデプロイが完了し、動作確認で画像を投稿しようとしたら以下のエラーが出ました。

```Permission denied @ rb_sysopen - /var/www/rails/app/tmp/uploads/cache/xxxxxx```

権限周りでエラーが起こっているらしいです。
調べたところ[こちらの記事](https://qiita.com/4EAE_Learner/items/1e0824a71cb4eb41780a)が参考になりました。

私の場合EC2にSSHログインし、対象フォルダまで移動、権限の変更で解決できました。
(usernameは適宜変更して下さい。 "whoami" というコマンドで確認できます)

```
$ ssh app_name_key_rsa
$ cd /var/www/rails/app/tmp/uploads/cache
$ ls -la
  drwxr-xr-x 2 root root  6  8月 14 00:44 .
  drwxr-xr-x 4 root root 32  8月 14 00:44 ..
$ sudo chown -R username .
$ ls -la
  drwxr-xr-x 2 username root  6  8月 14 00:44 .
  drwxr-xr-x 4 root root 32  8月 14 00:44 ..
```

変更後に再デプロイしたのですが次はこちらのエラーが出ました。
```Permission denied @ rb_sysopen - /var/www/rails/app/tmp/uploads/store/xxxxxx```

こちらも上記と同様のコマンドで権限を変更します。内容は殆ど一緒のため割愛します。

同様に権限変更後に再デプロイして確認すると無事に画像の投稿ができるようになっていました。
また、今回のエラー時にトップページで表示されるはずの画像(CSSでバックグラウンドイメージに指定していた)が表示されていませんでした。こちらは別階層にあるcacheファイルを権限変更すれば解決できました。

```
$ ssh app_name_key_rsa
$ cd /var/www/rails/app/tmp
$ ls -la
  :
  drwxr-xr-x  3 root root   20  8月 14 23:40 cache
  :
$ sudo chown -R username cache
$ ls -la
  :
  drwxr-xr-x  3 username root   20  8月 14 23:40 cache
  :
```

以上、どのたかのお力になれたら幸いです。
プロジェクトチームの育成、決定、管理、結成

応用情報技術者平成30年春期 午前問53

ISO 21500:2012(プロジェクトマネジメントの手引き(英和対訳版))によれば，プロジェクト資源マネジメントにおけるプロセス"プロジェクトチームの育成"の目的はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/51ff68c5-e75e-8807-9d2a-951107117add.png)


１、ISO 21500:2012には、プロジェクト資源マネジメントのプロセスとして、
・プロジェクト組織の決定、
・資源の見積り、
・プロジェクトチームの結成、
・プロジェクトチームの育成、
・資源のコントロール、
・プロジェクトチームの管理、
という5つが定義されています。

２、各プロセスの目的：
　・プロジェクトチームの育成"の目的
　　継続的にプロジェクトチームのメンバのパフォーマンス及び相互関係を改善する。

　・プロジェクト組織の決定"の目的
　　プロジェクトチームの全てのメンバの役割，責任及び権限を決め，決定事項に対して全てのメンバからコミットメントを得る。

　・プロジェクトチームの管理"の目的
　　プロジェクトチームのパフォーマンスを評価分析し，分析結果をフィードバックして問題を解決し，変更を調整する。
です。

　・プロジェクトチームの結成"の目的
　　プロジェクトの完遂に必要な能力をもったプロジェクトチームのメンバを招集し，人的資源を得る。

　・資源の見積りの目的
　　活動リストの活動ごとに必要な資源を決定することである。
　　資源には，人員，施設，機器，材料，インフラストラクチャ，ツールなどが含まれる。

　・資源のコントロール」の目的
　　プロジェクト作業の実施に必要な資源を確保し，プロジェクト要求事項を満たせるように資源を配分する。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
補足

ISO 21500:2012(プロジェクトマネジメントの手引き(英和対訳版))によれば，資源サブジェクトグループのプロセスの目的のうち，資源のコントロールプロセスのものはどれか。

ア、アクティビティリストのアクティビティごとに必要な資源を決定する。
イ、継続的にプロジェクトチームメンバのパフォーマンス及び相互関係を改善する。
ウ、プロジェクト作業の実施に必要な資源を確保し，プロジェクト要求事項を満たせるように資源を配分する。
エ、プロジェクトの完遂に必要な人的資源を得る。



参照：
https://www.ap-siken.com/kakomon/30_haru/q53.html

https://www.pm-siken.com/kakomon/30_haru/am2_5.html

https://www.kikakurui.com/q/Q21500-2018-01.html
Oracle DBA系SQLチートシート

DB管理者がよく使うコマンドの備忘録
oracle 12c以降を想定

## DBの状態確認
#####DBオープン
```
STARTUP
```

#####DBシャットダウン
```
SHUTDOWN IMMEDIATE
```

#####実行中のSQL一覧
```
STARTUP
```


#####PDBの状態確認
```
show pdbs
```

## リスナーの状態確認
#####リスナーの状態
```
lsnrctl status
```

#####リスナーの再起動
```
lsnrctl restart
```

##### tnsnames.oraの記載が認識されてるかチェック
```
tnsping {{tnsnames.oraに記載したDB名}}
```


## パラメーターチェック
##### パラメーターチェック
```
select name, value from v$parameter order by name;
```

###### Password Policy
```
select PROFILE, RESOURCE_NAME, LIMIT from dba_profiles order by profile, RESOURCE_NAME;
```

###### システム時間
```
SELECT SYSDATE FROM DUAL;　
```

##### アーカイブログの有無
```
select log_mode from v$database;
select * from nls_database_parameters where parameter = 'log_archive_dest_1';
```

##### 文字コード
```
select * from nls_database_parameters where parameter in (
'NLS_CHARACTERSET'
,'NLS_NCHAR_CHARACTERSET'
,'NLS_LANGUAGE'
) order by parameter;
```

#####SGAサイズのチェック
```
show sga
show parameter sga_;
```

#####SGAサイズの変更
```
ALTER SYSTEM SET SGA_MAX_SIZE = 16G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_TARGET = 16G SCOPE=SPFILE;
```

#####PGAサイズのチェック
```
```

## database filesの場所の確認
##### control file
```
SELECT name FROM v$controlfile;
```

##### redo
```
SELECT a.thread#,
       a.group#,
       b.member,
       a.members,
       a.bytes/1024/1024 mbytes
FROM v$log a, v$logfile b
WHERE a.group# = b.group#;
```

##### datafile(exclude temp)
```
select
TABLESPACE_NAME
,FILE_NAME
,BYTES/1024/1024 "BYTES(MB)"
,MAXBYTES/1024/1024 "MAXBYTES(MB)"
,AUTOEXTENSIBLE
,INCREMENT_BY*8/1024 "INCREMENT_BY(MB)" 
from dba_data_files 
order by TABLESPACE_NAME, FILE_NAME;
```
##### datafile(temp)
```
select
TABLESPACE_NAME
,FILE_NAME
,BYTES/1024/1024 "BYTES(MB)"
,MAXBYTES/1024/1024 "MAXBYTES(MB)"
,AUTOEXTENSIBLE
,INCREMENT_BY*8/1024 "INCREMENT_BY(MB)" 
from dba_temp_files 
order by TABLESPACE_NAME, FILE_NAME;
```


## テーブル、ユーザーの確認
#####スキーマユーザー確認
```
SELECT * FROM DBA_USERS;
```

#####表領域一覧
```
SELECT * FROM DBA_TABLESPACES
```


## 統計情報
#####統計情報の取得
```
BEGIN dbms_stats.gather_table_stats(ownname => null, tabname => ''hoge'', cascade => true, no_invalidate => false);
```

#####Snapshotの取得
```
execute statspack.snap(i_snap_level=> 7)
```

#####取得したsnapshotの確認
```
select to_char(snap_time, 'yyyy-mm-dd hh24:mi:ss') from stats$snapshot order by snap_time;
```

#####Statspackレポートの取得
```
@?/rdbms/admin/spreport
```





##その他

#####impdp/expdpの停止kill
```
select * from DBA_DATAPUMP_JOBS;
impdp ststem/password@RDSDB attach = ↑のSQLで帰ってきたJOBの名前
Import> kill_job
```

#####JOBの確認
```
select owner, JOB_NAME, NEXT_RUN_DATE from dba_scheduler_jobs order by owner,JOB_NAME;
```

JOBの実行が行われないときの参考
https://stackoverrun.com/ja/q/12786033
コードでUISwitchを押したことにする

#やりたかったこと

**「UISwitchをタップしたら○○すること」**
というテストを書きたいけどコード上でタップさせる方法がわかりませんでした。
検索ワードが悪いのか、調べてもなかなか欲しい答えが見つからず…
前にも一度書き方がわからなくて悩んだ気がするので、自分の備忘録として残しておきます。

#.isOn と .sendActions を必ずセットで使う
結論、たったの二行でタップさせることが出来ました。
.isOnを書き換えてから.sendActionsで変更したことを知らせるだけ🎉

```
switch.isOn = true
switch.sendActions(for: .valueChanged)
```
Swift学習のきっかけ

# はじめに
この記事は振り返った際に、当時の自分がどう思っていたかをまとめただけのメモになる予定ですので、身になるお話は一切ありません。

本当にどうしようもなく暇な方は、こんな奴がいるんだなぁ程度に見ていただければと思います。

# Swiftやるか
そう思ったのは2020年8月17日だった気がする。

”未経験からエンジニアへ”でおなじみのTECH CAMPの申し込みを終えていたので、
予習としてPHPとかRubyとかRailsをやろうとか思っていた。

このことをさらりとサーバープログラマ（この言葉で正しいか分からないが）の友人に話したところ、
「PHPとかは古い言語だし、スクールでやるんでしょ？どうせなら新しい言語触ったら？Swiftとか」
との意見をいただいた。

Swiftやろう。我ながら単純である。

# これまでのプログラミング経験
一応大学で少しだけ触れたことはある。
1年間ほどCに触れ、1ヶ月ほどC++にも触れた。

大学・大学院の研究はハード屋さんだったので、ソフトについては全く触れなかった。
（電源のソフト部分を自作することも可能だったが既製品で済ましてしまった。3年じゃ時間足りないよ......）

なので大学の授業で取り扱った程度の知識しかない。

よく分からんけどiostreamをincludeして......とか、
intとかdoubleで型を指定して変数定義して......とか、
その程度しか覚えてなかった。

プログラミングの概念的なものは理解できているつもりだが、武器となるようなことは実装できない。

ここが私のスタートラインだ。

# なぜ今更プログラミングを？
ひとつのきっかけはLeague of LegendsというPCゲームの存在だ。
私はこのゲームがとても好きで、ほぼ毎日プレイしている。

その思いが募り、いちファンとしてこのコミュニティに貢献したいと思うようになった。

**「なんかLoL（League of Legendsの略称）のアプリ作りてーなぁ。PCだけじゃなくて、携帯機器でもLoLのなにかしらに触れられるアプリ作りてぇ。」**

幸い？なことに、League of Legendsに関するiOSアプリは少なく、
コンテンツの内容にもよるだろうが需要はあるんじゃないか？と考えるようになった。

PCを触ることができない時でも、LoLのなにかしらに触れることができるアプリを作る。
これが私のSwift学習の目標であり、原動力だ。
コンパイラを作る。 その3

#概要

コンパイラを作る。
俺言語を俺cpuのアセンブラに変換するコンパイラを作る。
下記に、ソースとコンパイル結果を載せる。

#ソース


```
10 a=0
20 b=234
30 b=b*5
40 b=b+1
50 #=b<120*100
60 ?="zun"
70 a=a+1
80 #=a>4*130
90 #=30
100 ?="doko"
110 a=0
120 #=30
130 ?="doko"
140 ?="kiyosi!"
```

#コンパイル結果


```
  push  0
  set  a
  push  234
  set  b
label30:
  get  b
  push  5
  *
  set  b
  get  b
  push  1
  +
  set  b
  get  b
  push  120
  <
  jz  label100
  push  'z'
  out
  push  'u'
  out
  push  'n'
  out
  push  32
  out
  get  a
  push  1
  +
  set  a
  get  a
  push  4
  >
  jz  label130
  jmp  label30
label100:
  push  'd'
  out
  push  'o'
  out
  push  'k'
  out
  push  'o'
  out
  push  32
  out
  push  0
  set  a
  jmp  label30
label130:
  push  'd'
  out
  push  'o'
  out
  push  'k'
  out
  push  'o'
  out
  push  32
  out
  push  'k'
  out
  push  'i'
  out
  push  'y'
  out
  push  'o'
  out
  push  's'
  out
  push  'i'
  out
  push  '!'
  out
  push  32
  out
label255:
  en
```

#成果物

https://embed.plnkr.co/plunk/z4zR4ipmrnLh9JmH

#シミュレーション結果


```
zun zun doko zun zun zun doko doko zun doko zun zun doko doko doko doko zun zun doko doko zun doko doko zun zun doko doko doko doko doko zun zun zun zun zun doko kiyosi!
```

以上。
The Elm Architectureをコードで触れてみた。

[前回の記事](https://qiita.com/atsu6/items/bea02b88143601279503)でThe Elm Architecture(TEA)について勉強したので、実際にコードで触ってみることにした。

## カウンターの例
Elmガイドにあるカウンターの例をなるべく答えをみずに書いてみる。

```elm
-- module 宣言
module Main exposing(..)

-- import 複数
import Browser
import Html exposing(..)
import Html.Attributes exposing(..)
import Html.Events exposing(onClick)


-- model は、Int
type alias Model = Int


-- init 関数の定義
init : Model
init = 0


-- メッセージの定義
type Msg = Increment | Decrement

-- update関数の定義
update : Msg -> Model -> Model
update msg model =  
    case msg of 
        Increment -> 
            model + 1
        Decrement -> 
            model - 1 


-- view関数の定義
view :  Model -> Html Msg 
view model = div []
    [ button [ onClick Increment] [ text "+" ] 
    , p [] [ text (String.fromInt model) ]
    , button [ onClick Decrement] [ text "-" ] 
    ]

-- main Browser.sandboxを使う
main  = Browser.sandbox {init = init , view = view ,  update = update}


```

Ellie: https://ellie-app.com/9SGDWtcs2Tva1

[String.fromInt](https://package.elm-lang.org/packages/elm/core/latest/String#fromInt)関数を使えばよかったけど、
「elm 数字 文字列 変換」のような検索をしてもぱっとみやりたいことはでてこないかった。

関連するモジュール（今回だったら、`String`)のパッケージのドキュメントを探したほうが効率がいいかも。


## リセット機能を追加
Elmガイドに記載されている練習問題

> 練習問題: The Elm Architectureが優れていることの一つに、プロダクトに変更が必要な場合はとても簡単に拡張できることが挙げられます。あなたのプロダクトマネージャが"reset"機能を思い付いたとしましょう。新しいボタンはカウンタを0にリセットします。
>
> この機能を追加するにはMsg型の実装部分にもどってもう一つの可能性のResetを追加しましょう。メッセージを受け取ったときに何をすべきかをupdate関数に記述して下さい。最後はviewにボタンを追加して下さい。
>
> それでは、"reset"機能を実装してみましょう！

をやってみた。


```elm
-- module 宣言
module Main exposing(..)

-- import 複数
import Browser
import Html exposing(..)
import Html.Attributes exposing(..)
import Html.Events exposing(onClick)


-- model は、Int
type alias Model = Int


-- init 関数の定義
init : Model
init = 0


-- メッセージの定義

type Msg = Increment | Decrement | Reset

-- update関数の定義
update : Msg -> Model -> Model
update msg model =  
    case msg of 
        Increment -> 
            model + 1
        Decrement -> 
            model - 1 
        Reset -> 
            0 
   


-- view関数の定義
view :  Model -> Html Msg 
view model = div []
    [ button [ onClick Increment] [ text "+" ] 
    , p [] [ text (String.fromInt model) ]
    , button [ onClick Decrement] [ text "-" ] 
    , button [ onClick Reset] [ text "Reset" ]
    ]

-- main Browser.sandboxを使う
main  = Browser.sandbox {init = init , view = view ,  update = update}
```
Ellie: https://ellie-app.com/9SGWhszPRHba1


## ハマりどころ
1. 関数の定義をやるときにすぐに `=` という記法が思いうかばない。 ->　「〇〇を定義」という言葉を「=」と脳内変換できるようにする。
2. 日本語でググってもどのモジュールを使っていいのかわからない。英語でググったほうが情報は多いがそれでも関連ありそうなパッケージ名を考えて検索しないといけない。
3. 関数のネストにまだなれていないため、式がめちゃくちゃになってしまいエラーがでる。 -> 解決先は丸括弧の対応付けをよく考える。ex) `text String.fromInt 0` は誤り。正しくは、`text (String.fromInt 0)`

## 感想
サンプルコードに記載されているカウンタをコードを見ずに書いてみた。
コンパイルをするとどの点がおかしいかElmが知らせてくれるのでその都度ググりながら書いた。
まだElmの式の書き方や文法になれていないためおかしな書き方をしてしまうが、これはきっと慣れなのだろう。沢山コードを書いてくぞ！！