OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Piで初期設定から無線マウスの設定やUSキーボードを使って日本語を入力するまで

## はじめに

環境壊して初期化して、何度もいろんなページを漁り見るのは面倒なので手順として残しておく。

3部構成。

- [1. 初期設定をする](#1-初期設定をする)
- [2. 無線マウスの設定をする](#2-無線マウスの設定をする)
- [3. 日本語入力の設定をする](#3-日本語入力の設定をする)

参考程度に、私が使用しているキーボードとマウスはこちら。

- [Makuake｜ハニカム形状、ポップなカラーのキーボードでパソコン周りを彩る！【ハニーカラフル】｜マクアケ - アタラシイものや体験の応援購入サービス](https://www.makuake.com/project/honey-colorful/)

## 前提

- Raspberry Pi 3
- debian_version: 10.7

## 手順

### 1. 初期設定をする

#### 1-1. `Welcome to the Raspberry Pi Desktop!`

`Next`ボタンを押下する。

#### 1-2. `Set Country`

下記の通り設定して`Next`ボタンを押下する。

- Country: Japan
- Language: Japanese
- Timezone: Tokyo
- [ ] Use English language
- [x] Use US keyboard

#### 1-3. `Change Password`

パスワードを設定して`Next`ボタンを押下する。

#### 1-4. `Set Up Screen`

条件により設定をした後、`Next`ボタンを押下する。

モニタの画面端に黒枠が表示されている場合にチェックを付けると改善される。
私の環境では黒枠があるのでチェックを付ける。

- [x] This screen shows a black border around the desktop

#### 1-5. `Select WiFi Network`

WiFiに接続する場合は設定する。
接続するWiFiを選択して、`Next`ボタンを押下する。

##### 1-5-1. `Enter WiFi Password`

選択したWiFiのパスワードを入力して、`Next`ボタンを押下する。

#### 1-6. `Update Software`

OSやアプリケーションの更新を行うため、`Next`ボタンを押下する。

しばらく待つ。

##### 1-6-1. `System is up to date`

`OK`ボタンを押下する。

#### 1-7. `Setup Complete`

設定を反映するため、`Restart`ボタンを押下。

### 2. 無線マウスの設定をする

私の環境ではUSBドングルを使うタイプの無線マウスを使用しているが、マウスカーソルがすごくもっさり動く[^1]ので、スムーズに動くように設定する。

#### 2-1. `cmdline.txt`を編集する

##### 2-1-1. `cmdline.txt`を開く

ターミナルで下記コマンドを実行し、viで`cmdline.txt`を開く。

```terminal:Terminal
$ sudo vi /boot/cmdline.txt
```

##### 2-1-2. `usbhid.mousepoll=0`を追記する

長い記述の一番後ろに、半角空白と`usbhid.mousepoll=0`を追記する。
追記したら`:wq`で保存して閉じる。

変更前

```text:cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=cb5b7276-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
```

変更後

```text:cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=cb5b7276-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles usbhid.mousepoll=0
```

#### 2-2. OSを再起動する

ターミナルで下記コマンドを実行すると再起動ができる。
GUIなら、左上の「Raspberry Piアイコン」 → 「ログアウト」 → 「Reboot」で再起動できる。

```terminal:Terminal
$ reboot
```

これでマウスカーソルがスムーズに動くようになった。

### 3. 日本語入力の設定をする

USキーボードを使用しているとアルファベットと記号しか打てず、日本語が入力できないため、日本語が入力できるように設定する。

#### 3-1. `fcitx-mozc`をインストールする

ターミナルを開き、下記コマンドを実行して`fcitx-mozc`をインストールする。
インストール時、「インストールして良いですか？(Y/n)」を聞かれるので`Y`を入力する。

```terminal:Terminal
$ sudo apt-get update
$ sudo apt-get install fcitx-mozc
```

#### 3-2. OSを再起動する

やり方は [2-2. OSを再起動する](#2-2-osを再起動する) と同じ。

OSの再起動後、タスクバーの右側に白いキーボードのアイコンが新しく表示される。
`Ctrl + Space`で英語と日本語を切り替える。

## 参考サイト

- [Pi/無線マウスが遅れてorカクカク動く場合の対処方法 - ミニPC&シングルボードコンピュータ活用術](https://minipc.just4fun.biz/?Pi/%E7%84%A1%E7%B7%9A%E3%83%9E%E3%82%A6%E3%82%B9%E3%81%8C%E9%81%85%E3%82%8C%E3%81%A6or%E3%82%AB%E3%82%AF%E3%82%AB%E3%82%AF%E5%8B%95%E3%81%8F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95)
- [RaspberryPi日本語入力 fcitx-mozcを入れる | | Physical Computing FAQ& Tutorial](https://physical-computing-lab.net/raspberry-pi/raspberrypi%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html)

## 脚注

[^1]: ペイントソフトで手ブレ補正が異常についているときのような遅い動作。
組み込みシステムの開発可能性チェック

# 技術的な確認項目
組み込みシステムはソフトウェアとハードウェアが一体となって目的を達成するシステムなので、両方の可能性を検討する必要がある。
希望するソフトウェア（プログラム）の実現可能性から考える。ソフトウェアは次の２つがクリアできれば、開発可能性があるといえる。

- 処理させたい機能や目的を箇条書きにできるか？
- 箇条書きにした機能や目的を誰もが同じ意味で理解することができるか？

漠然とイメージしているような機能ではプログラムを作成することはできない。また、人によって個人差のあるような機能は誰もが納得できる仕様を決めることができず、プログラムを作成することが困難である。その点、数式で表現できるようなものは、誰が同じ意味に捉えることができるため表現手段として最適である。
統計的な手法を用いれば、多少の不確定要素を含んでいても取り扱うことができるかもしれない。

次にハードウェアの実現可能性を考える。実現したい仕様を満たす入出力回路を揃えられることが必要になってくる。希望する入力を検知できるセンサ回路と、処理した結果に基づいて機械的な動作に変換できるアクチュエータ回路が必須である。

また、RAMやプロセッサの性能が満足なものか、容量が十分であるかも検討する必要がある。

# 技術以外の確認項目
技術的な項目以外に検討すべき内容として、以下のようなものがある。

- 人
    - 技術者は揃うのか？
    - 経理や契約は誰が行うのか？
    - 協力企業や支援企業はあるのか？
- 取引先
    - 部品等の発注先のあてはあるのか？
    - どれくらいの期間で手配できるのか？
    - 外注できる企業は十分にあるのか？
    - 完成時の製品試験はどこへ依頼するのか？
- 資金
    - 開発予算はどれくらいあるのか？
    - 融資や借入金の可能性は問題ないか？
    - 色々な助成金の検討はしたか？
- 期間
    - 開発期間はどれくらいか？
- 場所
    - 開発場所はどこか？
    - 深夜作業をした場合の仮眠室はあるのか？
    - 部品や製品の置き場所はあるのか？
- 特許
    - 特許侵害の恐れは調査したか？
    - 特許出願の可能性はないのか？

# 参考文献
坂巻佳壽美, トコトンやさしい組込みシステムの本, 今日からモノ知りシリーズ, 日刊工業新聞社, 2019年.
Emacsキーバインドメモ

![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

# Emacsキーバインド

よく使うキーバインドを示す。C-<文字>はCtrlキーを押しながら<文字>キーを押すことを表し、M-はaltやeditなどのメタキーを押しながら<文字>キーを押すことを表している。(メタキーが無ければescを押して離したあとに<文字>キーを押すとよい。)

M-x help-with-tutorialでEmacsのチュートリアルが開くのでまずはチュートリアルをやってみるのがオススメ。

# カーソル移動

C-f: 一文字次に進む

C-b: 一文字前に戻る

M-f: 一単語次に進む

M-b: 一単語前に戻る

C-n: 次の行に移動

C-p: 前の行に移動

C-a: 行頭に移動

C-e: 行末に移動

M-a: 文頭に移動

M-e: 文末に移動

M-<: ファイルの先頭に移動

M->: ファイルの末尾に移動

C-v: 次の画面に進む

M-v: 前の画面に戻る

C-l: 画面を書き直す。このとき、カーソルのある行が画面の中央にくるようにする。

# 基本操作

C-g: 操作のキャンセル・取り消し

C-x u: 変更の取り消し

C-x C-c: Emacsを終了

# 編集操作

C-d: カーソルのある文字を削除

C-k: カーソル位置から行末までを消去

C-w: カット

M-w: コピー

C-y: ペースト

C-s: 検索

------
 - **source** ~/grad_members_20f/members/o-michika/2-emacs.org
【備忘録】Dockerfile



# 初めに
私のリポジトリで、Docker環境でrailsの開発環境を整えることができるクイックスタートを用意しています。今回は、そこに配置したDockerfileについてまとめていこうと思います。
https://github.com/naokikubo2/quickstart/blob/master/Dockerfile

### Dockerfileとは
docker imageを作成する際のコマンドをコード化したもの
公式ドキュメント

Dockerfileで重要なコマンドは、
- FROM
- RUN
- COPY
の3つだけです。

FROM
ベースとなるimageの指定
https://docs.docker.com/engine/reference/builder/#from
RUN
コマンドの実行
https://docs.docker.com/engine/reference/builder/#run
COPY
ローカルからdocker imageへのファイルの転送
https://docs.docker.com/engine/reference/builder/#copy

## ベースイメージの読み込み
```
FROM ruby:2.7
```

FROM 行では、`ruby:2.7` のベースイメージを読み込んでいます。

>FROM 命令は、イメージビルドのための処理ステージを初期化し、ベース・イメージ を設定します。後続の命令がこれに続きます。 このため、正しい Dockerfile は FROM 命令から始めなければなりません。 ベース・イメージは正しいものであれば何でも構いません。 簡単に取り掛かりたいときは、公開リポジトリ から イメージを取得します。[dockerリファレンス](http://docs.docker.jp/v17.06/engine/reference/builder.html#from)

## 言語の指定
```
ENV LANG C.UTF-8
```
rails consoleで日本語を使うために、UTF-8をここで設定します。

## 警告を取り除くための処理
```
ENV DEBCONF_NOWARNINGS yes
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE yes
ENV XDG_CACHE_HOME /tmp
EXPOSE 3000
```
- 何かインストールする時に、「本当にインストールしますか？」の様な警告が表示されて、いちいち「yes」を選択したりすることありますよね？1, 2行目は、警告が来たら必ずyesを選択するというものです。

APTって何って方は、以下参照
> APTとは、Linuxでソフトウェアの導入や管理、削除に用いられるパッケージ管理システムの一つ。また、それを操作するコマンド（apt）。Debian系ディストリビューションで標準的に使われている。[IT用語辞典](http://e-words.jp/w/APT.html)

> apt-key は、apt が パッケージを認証するのに使用するキーの一覧を管理するのに使用します。[ubuntu manual](http://manpages.ubuntu.com/manpages/trusty/ja/man8/apt-key.8.html)

- 3行目：Dockerのマウント領域に生成されるファイルが、キャッシュディレクトリの書き込み権限が無くてエラーを吐くケースがあリます。XDG_CACHE_HOMEに書き込み権限のあるディレクトリを指定してますが、どうもRailsのみの使用では発生しなさそうです。問題なければ外してもいいと思います。

- 4行目：expose(晒す)なので、 ポート番号3000を晒します。つまり、晒したポート番号3000からデータを受け付けるという意味です。


## コンテナパッケージのアップデートとインストール
```
RUN apt-get update -qq && apt-get install -y \
    build-essential \
    libpq-dev \
    vim \
    less \
    graphviz
```

- upadateしてからインストールするので、最新バージョンのパッケージを使用できます。
- ビルドに必要なツールがインストールされる  
- PostgreSQLの接続に必要。
- vimのインストール(ターミナルでファイル内容を操作できます)
- lessコマンド(linuxコマンドの1つで、ファイルの中身を表示することができる)を追加
- オープンソースのツールパッケージgraphvizを使う為(ER図を出力する時に必要です)

## yarnのインストール
> yarnとnpmはJavaScriptでサーバーサイドの処理を行うために使うプログラム（Node.js）上で使うパッケージマネージャーということです。

```
RUN apt-get install apt-transport-https
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install -y yarn
```
- 2行目：pubkeyは認証を行うための公開鍵です。
- 3行目：現在のyarnのstable版情報を保存。teeコマンドを使うことによって、echoで出力した内容を保存します。
- 4行目：yarnのインストールです。


## ワークディレクトリを設定
```
# setting work directory
RUN mkdir /app
WORKDIR /app
```
- 2行目：プロジェクト用のディレクトリを作成
- 3行目：ワークディレクトリに設定


## 環境変数を設定
```
ENV HOME /app
```
スクリプトやコンテナに入ったときに使う用。

## Gemfileを作成
```
COPY Gemfile /app/Gemfile
```
「Gemfile」というローカルファイルを、プロジェクトのディレクトリにコピー。

# 参考資料
https://tech-lab.sios.jp/archives/19191
docker+rails6でbundle installを行うもgemが反映しない


簡単な忘備録です。
rails6をdockerで実装中のエラーです。

### バージョン
docker 2.3
rails 6.0.3
Ruby 2.6.5

## 問題

SassC::SyntaxErrorとなり、'materialize-sass'のgemが読み込まれない事案が発生。

```ruby:app/assets/stylesheets/application.scss
@import "materialize";
```


```ruby:/Gemfile
gem 'materialize-sass'
gem 'material_icons'
```


コンテナ内でbundle installを行うも、以前としてエラー
なぜ。。？


## 解決法

キャッシュが残るケースがあるとのことでビルドしなおしました。

```コマンド
docker-compose build --no-cache
```
RubyでのStringの出力メソッドメモ

![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

# 色々な出力メソッド

rubyでStringを出力する際の種類にはprint, puts, p, pp, printfなどがある。例えば、

    print 'Hello World.'

と入力すると' '内の文字が出力される。

# print

出力結果

    1. Hello World.

printメソッドでは改行なしで表示される。

# puts

print以外に、putsを使うと末尾に改行ありで出力される。

    puts 'Hello'
    puts 'World.'

出力結果

    1. Hello
    2. World.

# p

pメソッドは出力結果は" "で囲まれてそのまま表示される。オブジェクトの型情報や改行コード、特殊文字などがそのまま出力されるのでデバッグ用に使われる。

    p 'Hello World.'
    p Hello World.

出力結果

    1. "Hello World."
    2. Hello World.

# pp

ppは適度にインデントや改行された出力が得られる。

------
 - **source** ~/grad_members_20f/members/o-michika/1-puts.org
Pardot のメールマーケティング (Pardot Lightning アプリケーション) ⇒ メールテンプレートの作成 (Pardot Lightning アプリケーション)

１．メールテンプレートとリストメールはどう違いますか?
２．変数タグがメールテンプレートに挿入するのは何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/1ed25116-5dc0-7161-eed0-7120b1fb712f.png)
README.org

![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) ![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

# qiita\_links

-   [README.org](https://qiita.com/o-michika/private/e5c6daf2893b00d5d412)
-   [RubyでのStringの出力メソッドメモ](https://qiita.com/o-michika/private/85b967a199494d9fef7d)
-   [Emacsキーバインドメモ](https://qiita.com/o-michika/private/d805742035be7cd71851)
-   [colorizeと正規表現](https://qiita.com/o-michika/private/c5ff1ff7004e05ba359a)
-   [roman\_numerals](https://qiita.com/o-michika/private/b7cba95a618dd9429497)

------
 - **source** ~/grad_members_20f/members/o-michika/README.org
CLIP STUDIO PAINTのショートカットキー設定と設定のバックアップ＆リストア

#レイヤー名変更のショートカットキーを変えるぞい
**ファイル** の **ショートカットキー設定** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1e85c979-2082-4a20-4e9f-9eccaced14c7.png)
**レイヤー設定** の **レイヤー名の変更** 。
**ショートカットの編集** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/824f2913-3b4c-0bb2-d463-5e89deb80db3.png)
割り当てたいショートカットを入力できる状態になるので、入力してOKボタン。
（既に割り当て済のショートカットがあれば警告出てくれるよ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8ed8f332-4c8b-d6d1-5f53-b2907cd9db58.png)

#CLIP STUDIO PAINTの設定ファイルってどこにあるん？
ここ。

```
C:\Users\ユーザー名\Documents\CELSYS
```
フォルダ丸ごとコピー = バックアップ
フォルダ丸ごと差し替え = リストア
ぞい。

#蛇足
『CELSYS』フォルダの日次バックアップバッチ作っておきたいね。
OSクリーンインストールする時とか絶対忘れちゃうし…。


#参考サイトさん
https://www.clip-studio.com/clip_site/support/help/detail/svc/53/tid/76006

#バージョン
Windows10 Pro バージョン20H2 OSビルド19042.685
CLIP STUDIO PAINT PRO （64ビット） 1.10.6 202012211752
Ruby 勉強メモ(テスト駆動開発)

# 概要
前回までは関数や条件分岐、rakeビルドツールなどを学習した。今回は一度基本に立ち戻って、Rubyの真髄としている「テスト駆動開発」について学んだことをメモする。

## テスト駆動開発とは
例えば大規模なソフトを開発する場合、長く複雑なソースコードを書くわけですが、どんなにプログラミングに長けている人でもいきなり完璧なコードを書くことは不可能です。
極端な話、もし一度ソースコードを一万行書いてからコンパイルや実行テストをした場合、エラーや例外が発生しますがこの場合厄介なのが、どこにエラーがあるか、どこから直していけばいいか分からなくなる点です。

今のは極端な例ですが、テスト駆動開発ではこの対策としてざっくりいうと、一部の機能の最小限のテストコードを書く➡ エラーが起きるので修正する ➡ エラーが起きない状態を維持して読みやすいコードに改善
この３ステップを繰り返します。

### メリット
非常に細かい頻度でエラーのチェックをするためバグを早期発見できます。エンジニアは追加の実装などで原因不明のバグに見舞われることが多いため、この細かいエラーチェックはそのようなバグを防いできれます。
また読みやすいコードに改善するタスクも含まれているため保守もききやすいことが長所といえるでしょう

### デメリット
テストコードを書くのにとにかく時間がかかるため、開発初期段階の時間的な負担が大きくなります。更に、一度書いたコードの保守も必要です。慣れないうちは高品質なテストコードを作成できず、それを修正するのにもまた時間がかかってしまいます。

正確性か、スピード性を重視するかでこのテスト駆動開発という方法は良し悪しがあると考えられそうです

### 参考
https://it-trend.jp/development_tools/article/32-0036#chapter-2
C# ListView 高速化＋α

FormsのListViewは行挿入時、10000行を超えてくるとウィンドウが固まったり、時間がかかったりする。
そこでListViewの行挿入の高速化と＋αとして画面が固まらない、挿入途中でキャンセル処理ができるようにする。


### ListViewのBeginUpdate()とEndUpdate()による高速化

```Sample1.cs
listView.BeginUpdate();
listView.Items.AddRange(items);
listView.EndUpdate();
```
BeginUpdate()を呼び出すと、EndUpdate()を呼ぶまでListViewの描画を停止する。
通常時の半分程度の時間で処理が完了するくらいになる。
ただ若干ウィンドウが固る。

### ListViewの行挿入時、ウィンドウが固まらないようにする。

```Samle2.cs
public async Task AddRangeAsync(ListView listView, IEnumerable<ListViewItem> items)
{
    const int loopCount = 1000;
    const int deley = 10;

    // long index = 1;
    int index = 1;
    var item = items.GetEnumerator();

    listView.BeginUpdate();

    while(item.MoveNext())
    {
        if ((index++ % loopCount) == 0)
        {
            //listView.EndUpdate();

            // 1000行挿入ごとに少し待つ。
            await Task.Delay(deley);
 
            //listView.BeginUpdate();
        }

        listView.Items.Add(item.Current);
    }

    listView.EndUpdate();
}

```
asyncメソッドでListViewの行挿入の処理を行い、1000行くらい挿入するごとに少し中断し、元のUIスレッドが操作できるようにする。
すこし時間はかかるが行挿入時、通常よりウィンドウは固まらない。

Task.Delay()で前後にEndUpdate()、BeginUpdate()を入れて、行が挿入される様子を描画することもできる。

### 挿入の途中で処理をキャンセルできるようにする。
```Samle3.cs
public async Task AddRangeAsync(ListView listView, IEnumerable<ListViewItem> items, CancellationToken token)
{
    const int loopCount = 1000;
    const int deley = 10;

    int index = 1;
    var item = items.GetEnumerator();

    listView.BeginUpdate();

    while(item.MoveNext() && !token.IsCancellationRequested)
    {
        if ((index++ % loopCount) == 0)
        {
            // 1000行挿入ごとに少し待つ。
            await Task.Delay(deley);
        }

        listView.Items.Add(item.Current);
    }

    listView.EndUpdate();
}

```
行挿入中にUIスレッドの操作が可能なため、CancellationTokenを使用して、キャンセルイベントなどが発生した際は処理を終了することもできる。
## まとめ
・ListView
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.listview?view=net-5.0
Ruby 勉強メモ(ソースコードの一括管理)

# 概要
前回までは変数や関数、条件分岐などの基本的なことを勉強した。基本的なプログラムを作るときはコードの量は大した量にならないが、いずれ複雑なプログラミングをするうちにファイルは複数に分割されるだろう。
このような状況下では、分割された複数のソースファイルをリンクしてコンパイルする便利なmakeというビルドツールがあった。
今回はそのmakeコマンドのRubyでの代替であるrakeについて学んだメモを以下に記す

### rakeファイル
rakeを使うことであらかじめ定義した一連のタスクを実行することができる。どこにあらかじめ定義するかというと、rakeファイルである。
書き方としては基本的に

```
task : タスク名 do
処理1
処理2
end
```

### rakeファイルの実行
```
rake タスク名
```
2020年に読んだ書籍

やぬてつです。

この記事は備忘録です。
プロジェクトマネジャーとして一人前になるためにと思って読み始めました。（去年から）
何を読んだのかを忘れてしまうので、年単位で記録しておこうと思っって書き留めました。

# 2020年に読んだ書籍一覧

- ドラッカーさんに教わったIT技術者が変わる50の習慣
- ライト、ついてますか
- アジャイルサムライ
- Manage It!現場開発者のための達人式プロジェクトマネジメント
- 熊とワルツを　ー　リスクを愉しむプロジェクト管理
- エンジニアあのためのリスクマネジメント入門
- 一億人の英文法
- ITILはじめの一歩　すっきりわかるITILの基本と業務改善のしくみ
- プロジェクトマネジャーが知るべき97のこと
- まんがでわかる　理科系の作文技術
- The DevOpsハンドブック　理論原則実戦のすべて
- Team Geek　ーGoogleのギークたちはいかにしてチームを作るのか
- 予定通り進まないプロジェクトの進め方
- 会議後、みんなの行動が加速する議事録の取り方
- みんなが知っておくべき運用設計ノウハウ
- 対話型マネジャー部下のポテンシャルを引き出す最強の育成術
- 「プロになるためのWeb技術入門」ーーなぜ、あなたはWebシステムを開発できないのか
- 曖昧性とのたたかい
- UNIXという考え方ーその設計思想と哲学
- ソフトウェアアーキテクトが知るべき97のこと
- 人に頼む技術
- プロジェクト実行完全ガイド
- 予定通り進まないプロジェクトの進め方
- リモートワークの達人
- メンタルヘルスマネジメント検定公式テキスト
- ビジネスマネジャー検定試験公式テキスト
- アドレナリンジャンキー
- CTO・エンジニアリングマネージャー養成読本
- 鬼滅の刃全巻

# 特にインパクトを感じた書籍
- プロジェクトマネジャーが知るべき97のこと
- 人に頼む技術
- 曖昧性とのたたかい
- UNIXという考え方ーその設計思想と哲学

## プロジェクトマネジャーが知るべき97のこと
一つ一つのエッセイを噛み締めながら読んだ本の一つ。
いろんなエッセイが入っているタイプなので、必ずどこかにヒットする的な感じ。この本に何度助けられたことか。

## 人に頼む技術
プロジェクトマネジャーになって結構キツかったのが、人に何かを頼むことだったので読んでみました。
とてもロジカルに記述がしてあって納得しながら読みました。こちらの書籍を読むことでかなり人に物事をお願いすることに対する抵抗を和らげることができました。
プロジェクトマネジャーになると一人で全てをやることを求められていなくて、チームを動かすことが求められるので、どんどん人にお願いすることが必要になってくると思います。お願いすることが苦手な人は一読してみると良いと思います。

## 曖昧性とのたたかい
プロジェクトマネジメントの本。当時から本質は変わらないのかな？と考えさせられるもの。今年のタスク振り分けの根本はこの本を参考にしていました。そして、その効果は絶大。
最近出版された新しい書籍ももちろん良いですが、こういった昔からある書籍も良いですね。

## UNIXという考え方ーその設計思想と哲学
こちらも当時から本質は変わらないのかーと考えさせられた書籍。
ソースコードレビューをしたときに、なんとなく感じる違和感に対してこういった哲学があると説明がつくのかなとか思ったり思わなかったり。
この本を読んだことで自信を持ってレビューできるようになりました。
自分のソースコードに自信のない若手には読ませようと思っています。

# まとめ
物事を始めるのであればまずはインプットということで、今年はかなりのハイペースで書籍を読みました。身についてないものもあるかと思うので、来年は2回目3回目にも挑戦しようと思います。
でも、まだまだ読みたい本があるんですよねー
第十一回：クラス



# クラスの作成

クラスの初期化はinitializeで行う．名前を受け取った場合は「Hello name」と返し，受け取らなかった場合は「Hello world」と返すコードを作成するとすると下記のようになる．

```ruby
class Hello
  def initialize
    name = gets_name
    puts_hello name
  end

  def puts_hello name
    puts "Hello #{name}."
  end

  def gets_name
    name = ARGV[0] || 'world'
    return name
  end
end

Hello.new
```

ここで，nameを@nameにすると，以下のようにコードが変更される．@変数名で、クラス変数となる。

```ruby
class Hello
  def initialize
    @name = gets_name
    puts_hello 
  end

  def puts_hello
    puts "Hello #{@name}."
  end

  def gets_name
    name = ARGV[0] || 'world'
    return name
  end
end

Hello.new
```


# 参考サイト

参考サイトは以下の通り．

-   <https://qiita.com/daddygongon/items/969ad5112878f6dab844>



------
 - **source** ~/grad_members_20f/members/yuhsuzu/r11.org
FET故障モードについて調べてみた

#概要
パワーMOSFETの故障モードについて調べてみたので記録として本ページに残す。
故障モードは5つに分けられる。各モードについての説明、原因、対策についてまとめた。一部情報不足している箇所はご留意ください。
1アバランシェ破壊
2ASO破壊
3ダイオード破壊
4寄生発振破壊
5静電気破壊


#アバランシェ破壊
##説明
アバランシェ破壊とはドレインソース間電圧Vds(青矢印)が耐圧を超え、FET等価回路のダイオ―ドに逆方向の電流(下図の赤矢印)が流れることで破壊に至るモード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/9cd31261-b9fb-dc23-52ad-eca4d312d102.png)

##対策
ドレインソース間電圧にかかる電圧がVdsの耐圧を超えないFETを選定する
FET AON2060のデータシートを参考にするとVdsの耐圧(絶対最大定格)は60Vと記載されてある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/2299a134-5b98-112d-e034-5fcaa418ff33.png)

#ASO破壊
##説明
FETを安全動作領域(Safe Operation Area)外で使用することで破壊に至るモード
環境温度25℃のときのAON2060のSOAを示す。横軸がドレインソース間電圧Vds、縦軸がドレイン電流Idである。IdとVdsの上限は絶対最大定格で決まり、Vdsの上限を上げると、Idの上限が下がるのは許容損失Pdが1.8~2.8W(下図の赤線)の範囲だからである。またFETがONする時間によっても動作領域が変化する。FETON時間が少ないほど動作領域は広がる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/590442cc-6333-7b98-4711-292f19015993.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/42e4d200-b56a-b922-ba33-0ce3985bcffd.png)


##対策
安全動作領域外で使用しない

#ダイオード破壊
##説明
FETターンoff時にCdsに充電されていた電流がRbに流れ(下図の青線)、Vbe(オレンジ)が発生することで寄生バイポーラトランジスタが誤ってONしてしまい破壊に至るモード。ソース・ドレイン間電圧の立ち上がりが急だと破壊になりやすい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/8c365b00-cd3a-a134-097d-862663005cfd.png)

##対策
ゲート抵抗を入れターンOFF時のドレインソース間電圧の立ち上がりをなまらせる。

#寄生発振破壊
##説明
ゲートにかかる電圧が発振し耐圧以上の電圧がゲートにかかり破壊に至る

##対策
ゲート抵抗をいれる

#静電気破壊
##説明
人体や実験設備からの静電気により破壊に至るモード

##対策
電荷を地面に逃がすためにアースする

#参考
TOSHIBA
https://toshiba.semicon-storage.com/info/docget.jsp?did=63590

富士電機
https://www.fujielectric.co.jp/products/semiconductor/model/powermosfets/application/box/pdf/MOSFET_J_140926_01.pdf

FET datasheet
http://www.aosmd.com/res/data_sheets/AON2260.pdf
cronでコマンドの定期実行をしてみよう！

#はじめに
最近LinuxでバッチファイルやPythonプログラムを定期実行したいということがあり、その方法を調べたので備忘録として記事にしておきます。いくつか定期実行の方法があると思いますが、今回はcronを使いました。

#cronとは？
多くのUNIX系OS（Linuxなど）で標準的に利用される常駐プログラム（デーモン）の一種で、利用者の設定したスケジュールに従って指定されたプログラムを定期的に起動してくれるものです。

#どんな感じで定期実行してくれるの？
crontab（cron table）コマンドで実行したいプログラムやコマンド、シェルスクリプトなどと実行日時、実行ユーザーを指定すると、同名のテキストファイル（crontabファイル）が保存され、設定が行われます。
（※「/etc/crontab」にあるcrontabファイルを直接書き換える方法もあります。）

上記の設定が完了すればシステムに常駐するデーモンの一つであるcrond（cron daemon）がcrontabファイルに書かれたスケジュールに従って、決まった日時に指定されたプログラムを実行してくれるといった感じで実行が行われます。

###補足
実行スケジュールは分刻みで指定することができ、毎時、毎日、毎週、毎月、再起動時などを指定できるほか、該当する値を列挙したり範囲を指定することにより、「毎週月曜・水曜・金曜の午前0時」「9時から17時の毎時0分と30分」といった指定もできます。

ちなみにcrontabファイルは各ユーザーのホームディレクトリの中にもありそちらを変更するとユーザーを指定して実行が行われます。
（↑管理者権限が無いユーザーなら管理者実行が必要な処理はできない）

#具体的な設定方法
やり方は大きく分けて２つあります。
###crontab（cron table）コマンドで設定する
1. 実行したいユーザーでログインしシェルで以下のコマンドを実行

    ```
    crontab -e
    ```

1. デフォルトエディタで設定ファイルが読み込まれるので、次のような設定を記述し保存。

    ```
    [minute hour day month dow(Day of the week) command]
    0 7 * * * (実行したいコマンドやプログラムを記載)
    ```
    
###/etc/crontabを編集
1. suコマンドでrootになる
1. エディタで/etc/crontabを編集する。次のような行を最後に追加すれば良い

    ```
    [minute hour day month dow(Day of the week) user command]
    00 07 * * * （実行ユーザー） (実行したいコマンドやプログラムを記載)
    ```

2. crondを再起動します

    ```
    /etc/rc.d/init.d/crond restart
    ```

#どんなコマンドを実行すれば良いかわからない人へ
登録コマンドをWebサイトでぽちぽち押していけば作成してくれるサイトがあります。
[UNIXのCRONTABの設定ヘルパー]
(http://www.japan9.com/cgi/cron.cgi)
![スクリーンショット 2020-12-30 4.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/2a5b9dc9-d98c-9da4-40a0-5b4c3d706c0a.png)

#参考にした、参考になるサイト
- [定期実行の手法3パターンとその活用例]
(https://qiita.com/shuntaro_tamura/items/c759bc318859a1203211)
- [クーロン(cron)をさわってみるお]
(https://qiita.com/katsukii/items/d5f90a6e4592d1414f99)
- [定期的にスクリプトを自動実行させる]
(https://qiita.com/msrks/items/6a180e03d7af622f2101)
- [プログラムの自動実行(cron)について]
(http://tsuttayo.jpn.org/crond/)
Ruby 勉強メモ(条件分岐)

# 概要
前回はプログラミングにおいて最も基本となる変数と関数について勉強した。今回は条件分岐でつかうif else文のメモを以下に記す。

```ruby

if ~ then
   処理1
elsif ~ then
   処理2
else
   処理3
```
が基本的な形


### サンプルプログラム
その年がオリンピックの開催年かどうか判定するプログラムをif elseで作成してみた

```ruby

year = 2021

if year%4 == 0 then
  print("今年はオリンピック")
elsif year == 2021 then
  print("今年はオリンピック(コロナウイルスにより延長)")
else
  print("今年はオリンピックではない")
end
```

### 参考
https://www.javadrive.jp/ruby/numeric_class/index6.html
Selenium利用におけるSessionNotCreatedExceptionの対処方法 

## エラー本文
```
SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 88
Current browser version is 87.0.4280.88 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
```

## 発生環境
- Windows10
- Anaconda (Selenium等のパッケージをcondaからインストール)
- Jupyter notebook


## 原因
Chromeブラウザのバージョンとpython-chromedriver-binaryのバージョンが不一致

## 対処
1. Chromeブラウザ > ヘルプ ＞ Google Chromeについて　からバージョン確認
2. 以下のコマンドでブラウザバージョンと同一バージョンのpython-chromedriver-binaryを再インストール
 
``` cmd:再インストール
conda uninstall python-chromedriver-binary
conda install -c conda-forge python-chromedriver-binary=<Chromeブラウザのバージョン>
```
elasticsearch-rails(7系)のcreate_index!でclass_cast_exceptionが出るときの解決法

## 事象

[RailsとElasticsearchで検索機能をつくり色々試してみる - その１：サンプルアプリケーションの作成](https://qiita.com/yamashun/items/6ecaa6f161b4cf283db3#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%99%BB%E9%8C%B2)を参考にRailsでElasticSearchの学習をしています。

インデックスとモデルの準備をして、いざインデックスを作成しようとしたら、下記のようなエラーが発生しました。

```
irb(main):001:0> Manga.create_index!
Traceback (most recent call last):
        2: from (irb):1
        1: from app/models/concerns/manga_searchable.rb:50:in `create_index!'
Elasticsearch::Transport::Transport::Errors::InternalServerError ([500] {"error":{"root_cause":[{"type":"class_cast_exception","reason":"class java.lang.String cannot be cast to class java.util.Map (java.lang.String and java.util.Map are in module java.base of loader 'bootstrap')"}],"type":"class_cast_exception","reason":"class java.lang.String cannot be cast to class java.util.Map (java.lang.String and java.util.Map are in module java.base of loader 'bootstrap')"},"status":500})
```

## 解決方法

解決方法はドキュメントタイプを指定することです。

```app/models/xxx.rb
module XXXSearchable
  extend ActiveSupport::Concern

  included do
    include Elasticsearch::Model
    #  ...省略...

    # ドキュメントタイプの指定が必須
    document_type "es_xxx_#{Rails.env}"
  end
end
```

同様の[Issue](https://github.com/elastic/elasticsearch-rails/issues/883)が上がっていたので、こちらをみて解決できました。

古いバージョン(6系までのもの)のgemではマッピング時にtypeとdocument_typeを推測していたのに対し、7系からはtypeとdocument_typeの推測をしなくなったため、というのが原因のようです。

## そもそもドキュメントタイプとは

Elasticsearchでは、格納する1つの文章の単位をドキュメントと呼びます。
[はじめての Elasticsearch - Qiita](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329)の表現を借りると、RDBMSのレコードに相当するのがドキュメントということになります。

そして、ドキュメントタイプとは「**ドキュメントの名**」のことです。
"タイプ"という文言が含まれるので、型っぽく感じられますが、実体は「名前」です。
ちょっと困惑しがちなポイントですね。
Ruby 勉強メモ(変数&関数)

# 概要

今回はプログラミングでは特に基本となる、変数と関数について学習したメモを忘備録として以下に記す。

## 変数

```ruby

a = 'hello' # ローカル変数
A = 'world' # 定数
$global = 'ruby' #グローバル変数
```

ローカル変数なら小文字、定数ならすべて大文字で宣言する(慣習)。
またグローバル変数なら変数前に$を入れる

## 関数
```ruby

def func(argument)
   puts argument

a = 'hello world'
func(a)
>>> hello world
```
関数については書き方がPythonに非常に似ているため馴染みやすかった


### 参考
https://www.sejuku.net/blog/12879
AWS cloud9でrails serverが切れなくなった時の対処法

■問題点
rails tutorial学習時、
rails serverを起動したまま、誤ってターミナルを閉じてしまった。。。。

■通常の終了方法
→ctrl+c

■本件の対処法
ターミナル上で右クリック
→Tmux
→Restart All Terminal Sessions
→解決！
![スクリーンショット 2020-12-31 11.03.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965757/a4aba163-a30b-d046-5021-06f9de784a07.png)
Ruby 勉強メモ(puts)

# 概要
Rubyについて授業で習ったのでメモ。今回は主に数値や文字列を出力する際に使う'p', 'puts', 'print'メソッドの違いを調べたのでいかに記す。

|メソッド  |改行  |引数の型情報の表示  |
|---|---|---|
|p  |o  |o  |
|puts  |o  |x  |
|print  |x  |x  |

また、pメソッドだと"Hellow World"という引数で出力したとき両端のタブルクオーテーションも出力される


# 参考ページ
I(puts)]https://qiita.com/Chinats/items/c464c3a88c263f15224b
emacs チュートリアル

# 概要

普段はvscodeでGUIをメインにコーディングするため、CUIベースのemacsというエディタには慣れが必要だと思った。
そのため忘備録としてよく使うコマンドなどを以下に記す

## 基本的な使い方

「コピー」や「一文字進む」などの操作は基本的に複数のキーを組み合わせて実行します。例えば
C-u : Ctrl + u
C-u 0 : 一度C-uしてから0
M-x : alt + x

### カーソル移動系

C-u 0 C-l : カーソルの位置が画面の一番上に来る
C-u -1 C-l : 現在のカーソルの位置が画面の一番下に来るようにする
C-v : スクロールする
M-v : スクロールする


### 検索系

C-s : ファイルから検索したキーワードを全て検索する。次の候補を見に行くときはもう一度C-s。
C-r : 逆順に検索する。C-s を繰り返し押して検索し続ける途中で C-r を押すと逆順の検索結果にヒットするのが便利。
kubectlをM1 Mac向けにコンパイルする

2020年時点でkubectlをM1 Mac向けにコンパイルする仕組みはない

Ref. https://github.com/kubernetes/kubernetes/issues/97550

PRも作られてるがなんか中途半端でコメントを入れておいたがすぐに取り込まれるかは不明なので、先にpatchを当ててやる方法を作ってしまう。

diffはこうだ。

```patch:diff.patch
diff --git a/hack/lib/golang.sh b/hack/lib/golang.sh
index bef1d837703..768aa1e867a 100755
--- a/hack/lib/golang.sh
+++ b/hack/lib/golang.sh
@@ -49,6 +49,7 @@ readonly KUBE_SUPPORTED_CLIENT_PLATFORMS=(
   linux/s390x
   linux/ppc64le
   darwin/amd64
+  darwin/arm64
   windows/amd64
   windows/386
 )
@@ -62,6 +63,7 @@ readonly KUBE_SUPPORTED_TEST_PLATFORMS=(
   linux/s390x
   linux/ppc64le
   darwin/amd64
+  darwin/arm64
   windows/amd64
 )
 
@@ -213,11 +215,13 @@ kube::golang::setup_platforms() {
     if [[ "${KUBE_BUILDER_OS:-}" == "darwin"* ]]; then
       KUBE_TEST_PLATFORMS=(
         darwin/amd64
+        darwin/arm64
         linux/amd64
       )
       readonly KUBE_TEST_PLATFORMS
       KUBE_CLIENT_PLATFORMS=(
         darwin/amd64
+        darwin/arm64
         linux/amd64
       )
       readonly KUBE_CLIENT_PLATFORMS
diff --git a/test/typecheck/main.go b/test/typecheck/main.go
index ffe5085b0d5..4d631f205ec 100644
--- a/test/typecheck/main.go
+++ b/test/typecheck/main.go
@@ -51,7 +51,7 @@ var (
 		"darwin/amd64", "linux/arm",
 		"linux/386", "windows/amd64",
 		"linux/arm64", "linux/ppc64le",
-		"linux/s390x",
+		"linux/s390x", "darwin/arm64",
 	}
 
 	// directories we always ignore
  
```

まずは公式手順通りに`k/k`をcloneしてくる。

```bash
mkdir -p $GOPATH/src/k8s.io
cd $GOPATH/src/k8s.io
git clone https://github.com/kubernetes/kubernetes
cd kubernetes
```

できたらpatchをあてる

```bash
curl -LO https://gist.githubusercontent.com/inductor/d944f90cb277d077fb8b737ff74b9cf2/raw/a276fcad07a693b60679d473720718761c4de94d/mac-m1.patch
git apply mac-m1.patch
```

コンパイルして、kubectlが出力され実行できることを確認

```bash
make kubectl
ls -l _output/bin/kubectl
-rwxr-xr-x  1 inductor  staff 44870050  12 31 10:30 _output/bin/kubedctl
```

kubectlが実行できることを確認

```
kubectl get pod
No resources found in default namespace.
```

わいわい
iOSでボタンを何度もタッチしないと押せない現象

#はじめに
webの改修のためボタンを追加したのですが、iOSでボタンを押そうとしたとき何度かタッチしないと反応しない現象が起こりました。

#原因
iOSではhover等を１タッチ分としてカウントします。
今回の場合既存コードで全体にかかる外側のdivにonmousemoveイベントがかかっており、これを1回タップした後フォーカスを移動させるためにもう1タップしてからでないと中に追加したボタンを押せなかったようです。

#修正方法
onmousemoveイベントを対象部分のdivに移して、ボタン部分に影響しないよう修正しました。

#まとめ
ブラウザによってcssやJSの動作が異なることがあるのですが、iOSはそういうバグが特に多かったので今後は先に自分でテストしておきたいと思います。
情報セキュリティマネジメント試験レポ

#はじめに
情報セキュリティマネジメント試験を受けてきたのでレポートを書きたいと思います。

#情報セキュリティマネジメント試験
問題数：午前50問、午後大問3問
時間：午前90分、午後90分
合格基準：60%

令和2年秋はプロメトリックのCBT試験で実施

#学習状況と結果
###自分の前提知識
・ITパスポート（2018秋）、基本情報技術者試験（2019秋）取得済
・会社の情報セキュリティ研修等
###勉強時間、方法
主に購入したpdf版の過去問をiPadのGoodNotesというアプリに2周分読み込み、書き込みながら学習しました。
勉強時間はトータルで7時間程です。

時間配分：
1.5時間　午後問題を一通り解いてみる(国語の問題のような感じで対策のしようがないと思ったため切り捨て)
4.5時間　午前問題4回分を暗記（20問ずつ答えを見ながら1周目用のファイルに印をつける→2周目用のファイルで何も見ずに解く）
0.5時間　移動しながら過去問道場を解く
0.5時間　直前の待ち時間に過去問についていた直前チェックポイントを確認する

###結果
午前78点　午後62点
多分合格？

###所感
#####■問題
午前は思った以上に過去問からそのまま出ました。数回分は解いておいたほうが良いと思います。
午後はCBTだと問題の長文を見ながら問題文を見ることができないのでカチカチと行ったり来たりして中々大変&寝不足であまり集中できずでした。
しっかりと睡眠をとって挑んだほうが良いと思います。
また基本情報の範囲で苦手な部分が出たため、そこらへんも復習していれば午後対策になったかなと思います。

#####■申込
今回からCBTということで午前午後を分けて受験したり、逆に午後に一気に受験するようなことが可能となりました。
土日の試験が非常に少なくすぐ埋まってしまっていたので、社会人には中々厳しいかなと思います。
埋まるのが早いので受付が始まったらなるべく早めに申し込むのが良いと思います。
また残り少ない枠について予約手続き中に満席になってしまった際、システムがエラーとなり40分間のロックがかかってしまいました。
今後枠数が増えてシステムがもうちょっと使いやすくなると良いなと思います。


#####■当日
試験の15分前集合ということでまぁギリギリにいけばいいだろうという感覚だったのですが、30分前には受付が始まり15分前には全員に対して説明を始めていました。
15分前の集合時間に間に合わないと受けさせてくれないという情報も見かけたので、なるべく早めに行ったほうが良いと思います。
新宿のエルタワーで受けたのですが、待つための席もたくさんありました。

#おわりに
難易度が基本情報と同じレベル２とされているわりに合格しやすく、受験料も5700円とベンダー資格に比べればお手頃なお値段なので、会社で資格手当が出るならお得な試験だと思います。
私はセキュリティについて漠然とした不安があったので、受験を期に多少触れることが出来て良かったかなと思います。
PHP7初級試験レポ

#はじめに
PHP7技術者認定初級試験を受験したので、レポートを書きたいと思います。

#PHP7技術者認定初級試験
問題数：40問
時間：60分
合格基準：70%

#学習状況と結果

###自分の前提知識
PHP歴1.5年（業務ではzendframeworkを使用しています。）
以下の項目は問題集で初めて勉強しました。
・ファイルの操作
・クッキーとセッション
・ファイル関数、cURL、APIリクエスト
・PHPUnit テスト駆動開発
・一般的な処理や話題（タイムゾーン、日付と時刻の処理、メールの送信）

###勉強時間
黒本3周：3日程度(1周目に2.5日、2、3周目に0.5日)

1周目 (一章10分×13章分と見直しをぐだぐだ　＋　巻末問題30分程)
2周目(3時間程)
3周目(1時間程)
Javasilverに比べると1章あたりの問題が5〜10問程度と少なく問題も簡単なのでサクサク進められました。

###結果
875点で合格

###所感
#####■問題
試験は問題集より難易度が高くてハラハラしました。
黒本との被りが少なく、解説まで読んで知らない部分があれば理解・暗記したくらいの状態で「大体解けてると思うけどどうかな…」という印象でした。
触ったことのない部分はそれなりに使いこなせるレベルまで触っておけばもっと自信を持って答えられたと思います。

#####■申込
申込はそれぞれのテストセンターに直接申込みます。
割と直前まで申込が可能だったと思います。
申し込みが分かりづらく再試験制度も無いので中々受験に踏み切れなかったのですが、普段触っている人なら1週間もあれば充分合格出来ると思うので、思い立ったらまず申し込んだ方が良いと思います。

#####■当日
池袋のテストセンターで受験しました。
結構混んでたので1日に何回もテストを実施するタイプの試験場のほうが空いててよかったかもと思いました。
終了後すぐ画面に結果が出るのと、終わり次第帰れるのが良かったです。

#おわりに
知らない部分もあり、PHPについて一通り勉強したという自信がついたので受けて良かったとは思いますが、受験料が高いので会社で資格手当が出ないのであれば受験しなくても良いかなと思います。
横並びにしたいのにfloatもinline-blockも効かなくて泣いた

#はじめに
改修で以下のように要素を追加したかったのですが、floatにしてもinline-blockにしてもうんともすんとも反応せずで困り果ててしまいました。
![20201231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370171/bbf3342c-7b46-ea97-759d-e4cd43da123f.png)

#`align-items: center;`
>CSS の align-items プロパティは、すべての直接の子要素に集合として align-self の値を設定します。

これや！！！！！！
消したらちゃんと横並びになりました

#まとめ
解決するのにすごく時間がかかってしまいました。
こういう全体にかけるプロパティがあるんですね・・・
よくわからなくて困り果ててたのですが、途中で開発者ツールでそれらしいdivを選択して１つ１つ消していく方針にしたら見つかりました。
###cssを触るときはもりもり開発者ツールを使うようにしたいと思います。
Ajaxを順番に実行させたい

#はじめに
Ajaxで取得した値を使用してjs上で処理を行いたかったのですが、js上の処理を先に行ってしまうためうまくいきませんでした。
引っかかった部分のメモとして残しておきたいと思います。

#非同期処理
非同期処理は別のタスクを順番を待たずに同時に実行できるというものなので、普通に書くと書いた順番は関係なく実行されていきます。
試しにthenやdoneで順番を変えられないかやってみたのですがうまくいきませんでした。

#方法①：`async: false`を使用
以下のように先に行いたいAjaxの中に`async: false`を追加して同期処理に変更する方法があります。
ただ、jQuery 1.8以降では非推奨となっているようです。

```javascript
//js上の処理を行うfunction
function doSomething(){
         getflgAjax().done(function(data){
            if(data){
                //フラグがtrueの時の処理
            }else{
                //フラグがfalseの時の処理
            }
        }).fail(function(){
            //失敗したときの処理
        });
}
// フラグを取得するAjax
function getflgAjax(){
	return $.ajax({
		type : 'post',
		url : url,
		dataType: 'json',
		async: false,
	})
}
```
#方法②：`$.Deferred()`を使用
①は非推奨なので`$.Deferred()`を使用するべきなのですが、当時試してみてうまくいかなかったため①の方法で妥協してしまいました。。

参考：
[jQueryのDeferredが便利過ぎた](https://qiita.com/yamamoto_hiroya/items/9380375b11c99f056663#deferred%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88)
[はじめてajaxを使うときに知りたかったこと](https://qiita.com/nekoneko-wanwan/items/bedc0e826c0842ca0b11)

#まとめ
これまでAjaxの処理を行う順番というのを意識したことがありませんでした。
今ぱっと試せる環境がないのですが、手が空き次第環境を作って$.Deferred()についてもちゃんと勉強してここに追記したいと思います。
新人が初めての現場でZendFrameworkを触ってつまづいた部分

#はじめに
自分が新人研修の後初めて配属された現場でZendFrameworkを触って、慣れるまでに特に時間がかかったことをまとめました。
あまりフレームワーク関係ないかもしれません。
色々間違っているところなどあるかもしれませんが、後で見返せるように残しておきたいと思います。

#①コードの読み方、探し方がわからない
たくさんのフォルダやファイルがある中でどこに何のファイルがあるのか、どう読めば良いのかがわかりませんでした。
###フォルダ構成を把握する
こちらは参考書から引用しました。
私はMVCについての概要は知っていたのですが、この例のようにベースのモジュールがあって、改修ごとにコントローラー、モデル、ビューそれぞれ継承関係を増やしていくような実用例を知らなかったので混乱してしまいました。
現場のフォルダ構成はこれとは異なっていますが、コントローラー、モデル、ビューの場所と継承関係を把握すると一気に読めるようになりました。
![folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370171/0480ba4a-4e2b-a507-d034-1e28c8fbf2cb.png)

###URLからファイルを探す
#####http://ベースURI/モジュール名/コントローラー名/アクション名
上の画像の例で言うと、http://localhost/default/hoge/index みたいな感じでURLからファイルを探すことができます。

###MVC
Zendは一般的なフロントコントローラパターンを使用しています。
１機能につき１つ、同名のコントローラ、モデル、フォルダがあります。
コントローラは１画面ごとにアクションと呼ばれるファンクションを持ちます。

###例
ちょっと微妙かもですが・・・

■コントローラー

```php5
<?php
    class usr_HogeController extends \defalut_Controllers_Hoge
    {
        public funciton indexAction(){
            //前の画面からパラメータを受け取る
            $params = $this->_getAllParams();
            //受け取ったパラメータをindex画面に送る
            $this->view->assign('hoge', $params['hoge']);
            //モデル呼び出し
            $model = new \usr_Model_Hoge();
            //モデルからidを取得
            $id = $model->getId();
            //idをindex画面に送る
            $this->view->assign('id', $id);
            //画面表示
            $this->render();
        }
        public function editAction(){
            ...
        }
        ...
    }
?>
```

■モデル

```php5

<?php
    class usr_Model_Hoge extends \defalut_Models_Hoge
    {
        function getId(){
            return $this->_getId();
        }
        ...
    }
?>
```
■ビュー

```html
...
<!-- フォーム -->
<form  method="post" name="form" 
       action="<?php echo $this->baseUrl('usr/hoge/edit');?>">
<input type="hidden" name="hoge" value="<?php echo $this->hoge;?>">
<input type="hidden" name="id" value="<?php echo $this->id;?>">
</form>
...
```

#②ネットで検索してもドキュメントが見つからない
Zendは日本語のドキュメントが少ないです。
Qiitaはもちろん、公式ドキュメントを見ても良くわからなかったり、エラーについて検索しても同じ事例が引っ掛からなかったりします。
そういう時はPhpStormの全文検索でプロジェクト内を検索して同じようなことをやっている部分を見つけたりして解決しています。

#③DB接続の書き方がわからない
DB接続をするときにフレームワーク独特の書き方があります。
[こちらのサイト](http://pentan.info/php/zend_fw/zend_db_query.html)がとてもわかりやすいです。
載ってないような複雑な処理は既存コードに全文検索をかけて真似したり、それでも見つからなければSQLをベタ打ちしたりしています。

#④ビューヘルパーってなに
最初のころビューヘルパーというのがよくわかりませんでした。
ビューヘルパーとはその名の通りビューでよく使う処理を書く用のクラスです。
例えばフォームの生成とか、ビューで表示するために値をちょっと整えたりとかする用に使用しています。
Zend付属のものもあるし、自分で追加もできます。

###例
・基底URLを付加する：`$this->baseUrl();`

```php5
//基底URLが/mypage/だったら、/mypage/usr/hoge/editになる
$this->baseUrl('usr/hoge/edit');
```

・チェックボックスの生成：`$this->formCheckbox($name, $value, $attribs, $options);`

```php5
//初期状態でチェックされている、チェックされてたらvalue=5,未チェックならvalue=-1
echo $this->formCheckbox('ex1', 5, null, array(5, -1));
echo $this->formCheckbox('ex1', null, array('checked' => true), array(5, -1));
```

#まとめ
###①→まずはコントローラー、モデル、ビューの場所と継承関係を把握する
###②～③→公式ドキュメントやネットで見つからない場合は既存のコードで全文検索をかけまくって似てる部分を参考にする。
Ubuntu(20.04.1 LTS)を用いてRubyとRails環境を構築する前段階でハマった話



##はじめに
Ubuntu使い始めて2ヶ月
Ruby on Rails勉強し始めて3ヶ月の超初心者です。(2020.12.31時点）
初投稿なので、お手柔らかにお願いします><

##環境
+ Ubuntu 20.04.1 LTS

##参考にしたサイト

+ <a href="https://qiita.com/Gushi_maru/items/f3b5cc43e135e678085f">(Ubuntu)Ruby on rails 6.0 環境構築</a> 
+ <a href="https://qiita.com/kaishuu0123/items/2a91495e7daa8c7783ed#_reference-676d3ce878ece19a21dc">Ruby 歴 10 年の私が【絶対に】 gem install rails コマンドを実行しない理由</a>
+ <a href="https://ichinari.work/Linux_ubuntu_error_20190814">ubuntuで「sudo apt-get install docker-ce」実行時に以下のエラーが発生</a>
+ <a href="https://sysrigar.com/2019/03/08/debian-9-8%E3%81%A7apt-get%E3%81%97%E3%81%9F%E3%82%89cdrom%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8D%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/">Debian 9.8でapt-getしたらcdromを入れろと言われた場合の対処法</a>


##ハマったところ
上記サイト様に記載されていた以下コマンド

```
sudo apt install build-essential -y
```
を実行すると、

```
'Ubuntu 20.04.1 _Focal Fossa_ - Release amd64(20200808.1)' とラベルの付いたディスクをドライブ '/cdrom/' に入れて [Enter] キーを押してください
```
を抜け出せず、その後terminal を再起動して、上記コマンドを再度実行すると、

```
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
```
とロックがかかり何もできなくなってしまった話です。

##原因
ロックされてしまっている「/var/lib/dpkg/lock-frontend」を手動削除すればOKとのことですが、 「sudo apt autoremove」コマンドで自動削除できるとのこと。
とありましたので、コマンド実行
しかし、


```
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
```
の繰り返し…。
落ち着いて、とりあえず再起動実行してみる。

その後、sudo apt autoremove自体は問題なく実行できたが、
問題の sudo apt install build-essential -y 

の部分でまた同じCDROM要求発生。
今回、UBUNTU自体が、USBからインストールしたので、CDROM無いねん！ってことで、解決方法を模索した結果が以下の通り

##対処方法
/etc/apt/sources.list 内にある


```
# deb cdrom:[Ubuntu 20.04.1 _Focal Fossa_ - Release amd64(20200808.1)]/ focal main restricted
```
を削除し、再起動後、上記コマンドを再度実行することで問題なく
実行できました！

なんだかんだで一時間ぐらいハマったので、同じ課題でハマった人に参考になれば幸いです。
roman numeralsを解いてみよう

https://qiita.com/knkrhs/items/27440e1c7f75cc5f53f0

> 課題
>アラビア数字(arabic numerals)を受け取って，ローマ数字(roman numerals)を返すmethodを書きなさい

ほほぉ、なかなか面白い。ということで、これを解いてみる。
大晦日だし、たまにはこういうのもいいですよね！

```ruby:digittoarabic.rb
DigitToRoman = Struct.new(:arabic, :roman )

def roman(n)
    # 対応しているのは、1～3999まで
    if n <= 0 || n >= 4000 then
        raise "Invalid input(" + n.to_s + ")"
    end

    # 変換用のテーブルつくる。
    # 本当はClassでinitilizeタイミングでした方がよいが。
    v = Array.new()
    v.push ( DigitToRoman.new( 1000, "M") )
    v.push ( DigitToRoman.new(  900, "CM") )
    v.push ( DigitToRoman.new(  500, "D") )
    v.push ( DigitToRoman.new(  400, "CD") )
    v.push ( DigitToRoman.new(  100, "C") )
    v.push ( DigitToRoman.new(   90, "XC") )
    v.push ( DigitToRoman.new(   50, "L") )
    v.push ( DigitToRoman.new(   40, "XL") )
    v.push ( DigitToRoman.new(   10, "X") )
    v.push ( DigitToRoman.new(    9, "IX") )
    v.push ( DigitToRoman.new(    5, "V") )
    v.push ( DigitToRoman.new(    4, "IV") )
    v.push ( DigitToRoman.new(    1, "I") )

    # 逆順ソート
    # ソートしてからReverseしてもいいけど、コストが…
    # ソートをしないと、上のpushの順番が変わると結果も変わる
    v = v.sort{|a,b| -( a.arabic <=> b.arabic ) }

    # ローマ数字文字列への変換。
    # injectを使う事で、変換用テーブルでのループを無くす
    # あと、文字列*数字で、繰り返しになるのを使って文字列作る
    v.inject("") { |ret, m|
        i = n / m.arabic
        n = n % m.arabic
        ret + m.roman * i
    }
end

num = ARGV[0].to_i
puts ARGV[0] + " = " + roman(num)
```

\![ruby 2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>)
応用情報処理と電気工事士

今日この頃、タゴメです。
周りが現役のプロ。
自分はただの畳製造をしているただの製造員。

趣味で応用情報処理技術者試験を勉強し、来年で3度目の挑戦となりますが、
ここにきて電気工事士の勉強を始めました。

人工知能を理解して老後の仕事としてアルバイトとしてプログラマーをしたいがために、
無根拠でＰｙｔｈｏｎを勉強しています。

では、何故電気工事士なのか？

それは簡単にいえば産業用ロボットの構造を理解するためにですが、
私自体は友人のレクチャーを受けて勉強を始めました。

電気工事士とプログラマーに何の因果関係があるのかといえば、
ゼロではありません。

じゃあ、その友人は何かというと、ＩＴ関連ではないんですが。

ＩＴ関連からヘッドハンティングされまくっている自動車関係の整備士さんとだけ言っておきましょう。

電気工事士と応用情報処理を取得したら

次はＧ検定か機械実装士です。

製造業をやる傍ら。

畳を作る産業用機械はどのような言語で動いているのか？

を含めて色々と理解できますが。


とにかくプログラムは機械の脳内です。

人間のように機械の内部をめぐるのはエアーか、油か電気かです。

とにかく応用情報処理と電気工事士を両方を勉強することで何か「答え」があるかもしれません。

ただ、それに近い答えに近づいているのかが整備士の友達です。

自動車整備士として入ったのに……。

今じゃあ……ＰｙｔｈｏｎやＶＢスクリプトで色々なものを発明する「天才博士」になっています。

私はとにかくＰｙｔｈｏｎを勉強しながら
応用情報と電気工事士をとにかく取得します。
【Laravel】Laravel8 Jetstream でパスワード検証ルールを変更する

Laravel8 + Jetstream でパスワードの長さなど検証ルールを変更する方法がわかりにくかったので調べた結果を書いておきます。

# 答え

`app/Actions/Fortify/PasswordValidationRules.php` を以下のように変更すればOK.

```
    //(例)パスワードの長さを10文字以上にしたい場合
    protected function passwordRules()
    {
        //return ['required', 'string', new Password, 'confirmed'];
        return ['required', 'string', (new Password)->length(10), 'confirmed'];
    }
```

他にもアッパーケースや記号を含ませたいなどは `new Password` 以下のメソッド呼び出しをデイジーチェーンでつないで

```
(new Password)->length(10)->requireUppercase()->requireNumeric()
```

とすれば良い。  
どんなメソッドがあるかは、`vendor/laravel/fortify/src/Rules/Password.php` で確認。

# 背景

Laravel8/Jetstream/Fortify のパスワード検証ルールの設定ファイルは、`vendor/laravel/fortify/src/Rules/Password.php`.

このファイルを直接編集してもパスワード検証ルールの変更はできるが、vendor フォルダの下なのでこのファイルを直接編集してしまうと `composer update` などララベルをアップデートした時に編集を上書きされてしまいます。  
しかし、`app` 側でどうやって変更するのかがよくわからなかったので、今回の調査となった次第。

ドキュメント  
[ララベル本家のパスワード検証ドキュメント](https://jetstream.laravel.com/1.x/features/security.html#password-confirmation)
bit を高速に数える 手法の比較

はじめての投稿なので温かい目で見てください。

## はじめに

本記事では bit の 1 の数を数える手法（アルゴリズム）の比較を行います。アルゴリズムの詳しい内容等は紹介せずあくまで処理速度の比較だけ行います。アルゴリズムの詳しい内容は下の参考文献に飛んでください。

## アルゴリズム

[Hamming weight](https://en.wikipedia.org/wiki/Hamming_weight) で紹介されている 5 つの手法の演算回数について簡単にまとめます。A は有名なアルゴリズムをそのまま実装した状態です。Bと C は A の高速化である派生です。D は bit が立っている（1 になっている）数に比例して演算量が増えます。E は力技で，16bit すべての数に対して立ってる bit の数をメモしておき，64bit を 4 分割してその合計として求めています。メモリを多く使用し，64bit のように bit 数が多い場合はあまり高速ではありません。

|手法|算術|乗算|比較 / 分岐|メモリ読み込み|特徴                                   |
|:--:|---:|---:|--------:|-------------:|:--------------------------------------|
|A   |  24|   0|        0|             0|単純な実装                             |
|B   |  17|   0|        0|             0|乗算が遅い環境で優秀                   |
|C   |  12|   1|        0|             0|乗算が速い環境で優秀                   |
|D   |  3n|   0|       1n|             0|n は 1 になっている数，n が小さいと高速|
|E   |   9|   0|        0|             4|16bit ごとに分けてメモリから読み取る   |

## 実験

### 実験環境・ソースコード

実験で使用したソースコードは [GitHub](https://github.com/Daiji256/Hamming-weight) にあげておきます。実験環境は下のとおりです。最適化については GitHub にあげている Makefile を見てください。

- OS: Ubuntu 20.04.1
- Kernel: 5.4.0-58-generic
- CPU: Intel i5-3360M (4) @ 3.5 GHz
- gcc: version 9.3.0 (C11)

### 実験 1 単純な比較

まずは全 bit に対して処理を行う安直な手法 N と 5 つの手法 A–E を C 言語に実装してタイムを計測します。1 億個の乱数に対してビットカウントを行いその処理時間を計測します。計測結果を表にまとめます。このときの立っている bit の平均は 32 です。（64bit の乱数でやりました。）この環境では C が B よりも高速でした。D はこの中では最も遅いですがそれでも N に比べて十分高速です。E も C と同等の速度ですが，メモリのことを踏まえると微妙に感じます。

|手法|時間   |
|:--:|:-----:|
|N   |4.447 s|
|A   |0.541 s|
|B   |0.467 s|
|C   |0.386 s|
|D   |3.025 s|
|E   |0.393 s|

### 実験 2 特殊環境下での比較

次に立っている bit の数が平均 0.5 の場合で測定します。D は 4 倍程度高速になったがもっと高速化されてもいいのかなと思いました。しかし，C などと比較しまだ遅いことからこの環境下では使用する必要性はないと思います。また，N は下位 bit から参照し 0 になったとき終了するようにしているため，高速化されたがそもそも N は使わない。

|手法|時間   |
|:--:|:-----:|
|N   |1.966 s|
|A   |0.534 s|
|B   |0.458 s|
|C   |0.381 s|
|D   |0.735 s|
|E   |0.364 s|

### 実験 3 `-march=native` による最適化

`-march=native` は特定の CPU を指定して高速化を行います。コンパイル後のバイナリデータを他の人と共有する場合は不適切ですが，自分の環境だけでの使用の場合はおすすめします。実験結果を示します。D 以外は少し高速化されました。注目できるのは D で，30 倍程度高速化されこの中で最速となっています。

|手法|時間   |
|:--:|:-----:|
|N   |4.257 s|
|A   |0.380 s|
|B   |0.235 s|
|C   |0.181 s|
|D   |0.091 s|
|E   |0.212 s|

### 実験 4 `_popcnt64`と`__asm__`

最後に `_popcnt64` と `__asm__` を利用して計測する。`-march=native` 無しの結果を N，有りの結果を Y に示しています。結果はどの自作関数より高速になりました。これらが使える環境では使用したほうが良いと思います。

|手法       |時間 (N)|時間 (Y)|
|:---------:|:------:|:------:|
|`_popcnt64`| 0.234 s| 0.071 s|
|`__asm__ ` | 0.234 s| 0.071 s|

## まとめ

bit を高速に数える手法の比較を行いました。安直に数える場合に比べて 10 倍程度高速に数えるアルゴリズムであると確認できました。`_popcnt64` と `__asm__` はこれらに比べてより高速であることも確認できました。

## 文献

1. [ソースコード (GitHub)](https://github.com/Daiji256/Hamming-weight)
1. [Hamming weight (Wiki)](https://en.wikipedia.org/wiki/Hamming_weight)
1. [x86_64 で popcnt / tzcnt / lzcntする【ビット演算テクニック Advent Calendar 2016 5日目】 (Qiita)](https://qiita.com/ocxtal/items/01c46b15cb1f2e656887)
1. [GCC (GNU)](https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html)
ReactアプリをFirebaseにHostingしてみた

みなさんこんにちは、グリドンです。

前回の記事を読んでくださった皆さん、ありがとうございます。
最近は、「変種型」のコロナウイルスが流行って来ているので、今まで以上に警戒が必要になってきそうですね。

さて、2020年ももうすぐ終わりですが、今日はFirebaseを利用して、Reactアプリをデプロイした流れをアウトプットして行こうと思います！

#Firebase とは
まずは、[Firebase](https://firebase.google.com/ "Firebase")について軽く説明致します。
FirebaseはGoogle社が作っている、WebアプリやMobileアプリを作るサービスになります。元々は、別の会社が運営していたのを、2014年にGoogleが買収したみたいです。

個人的な意見としては、UIUXもとても使いやすく、「無料版」がはっきり分かれているので、勝手に多額の請求が来てしまった、というような心配はなさそうです。

#Firebaseの設定
それでは、今回の本題へ入ろうと思います。
まずは、プロジェクト作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764190/efb7e767-e9d4-9a9b-aa7a-488a0a130712.png)

[Add project]から、自分のプロジェクトを作成します。
質問に答えていくだけだと思うので、基本的にここは簡単だと思います。

Firebaseの設定はここまで。

#Local環境でFirebaseを設定する
Firebaseの設定が終わったと思うので、次にLocal環境でFirebaseを設定・デプロイして行こうと思います。
まずは、Firebase toolをインストールします。

```qiita.js
npm install -g firebase-tools
```

下記のようなエラーが出た場合は、```sudo```をつけて試してみてください（Mac用）

```
Error: EACCES: permission denied
```

Firebase toolがダウンロードできたら、Firebaseにログインして、Firebaseをイニシャライズします。

```qiita.js
firebase login
firebase init
```

イニシャライズする時も、質問が出てくるので、基本的に質問に答えていけば簡単に設定が終わります。
利用目的はHostingにしてください。

ここまでやれば、ほとんど終わりです。

#Firebaseにアプリをデプロイする
最後に、アプリをFirebaseにデプロイします。

```qiita.js
firebase deploy --only hosting:splitting-bill-app
```

これで、完了。

Firebaseのコンソールから、Hostingを選択して確認してみてください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764190/a384f444-aa3b-286b-3dfe-10da82c231d2.png)
Bitcoin価格モニターPythonスクリプト

##概要
Bitcoinの価格が高騰するに伴い欲の皮が突っ張ってきてついついなんどもサイトの価格チャートをリロードしがち。コマンドラインのターミナルで一定間隔でBitcoin表示させる簡単なスクリプト作った。

##コード
USDでの価格はCoindeskからJPYでの価格はCoinCheckから引いてきています。この二つのサイトにしたのは特に理由ありません。各サイトのサービスは時の経過とともに中止になったりすると思うのでその時使えるものに適宜変更すればよいかと思います。

８行目で価格情報を取り行く時間間隔を、11行目で自分の持っているBitcoinの量を指定しています。

```python:loop_btc_price.py
btcuser01@ubuntu002:~/Price$ cat -n loop_btc_price.py 
     1	#!/usr/bin/python3
     2	
     3	import requests
     4	import time
     5	import datetime
     6	
     7	# Interval to check btc price in second
     8	interval=60
     9	
    10	# BTC which you have 
    11	btc_you_have=6.04
    12	
    13	COINCHEK_API_URL = 'https://coincheck.com/api/ticker' 
    14	def get_price_jpy_coincheck():
    15	  
    16	    response = requests.get(COINCHEK_API_URL)
    17	    response_json = response.json()
    18	    # print(response_json)
    19	    return(response_json["last"])
    20	  
    21	
    22	COINDESK_API_URL = 'https://api.coindesk.com/v1/bpi/currentprice.json'
    23	def get_price_usd_coindesk():
    24	    response = requests.get(COINDESK_API_URL)
    25	    response_json = response.json()
    26	    # print(response_json)
    27	    return(float(response_json["bpi"]["USD"]["rate"].replace(',','')))
    28	  
    29	
    30	while True:
    31	    dt_now = datetime.datetime.now()
    32	    usd_a_btc=get_price_usd_coindesk()
    33	    jpy_a_btc=get_price_jpy_coincheck()
    34	    # print(dt_now.strftime("%y/%m/%d %H:%M:%S"),usd_a_btc,jpy_a_btc,jpy_a_btc * btc_you_have)
    35	    print("{:s}, {:.2f}, {:d}, {:d}".format(dt_now.strftime("%y/%m/%d %H:%M:%S"),
    36	        usd_a_btc,
    37	        int(jpy_a_btc),
    38	        int(jpy_a_btc * btc_you_have)))
    39	    time.sleep(interval)
    40	
btcuser01@ubuntu002:~/Price$ 
```

##実行例
```
btcuser01@ubuntu002:~/Price$ python3 loop_btc_price.py 
20/12/31 09:34:50, 29186.75, 2977781, 17985797
20/12/31 09:35:50, 29148.89, 2980000, 17999200
20/12/31 09:36:50, 29182.07, 2978434, 17989741
20/12/31 09:37:50, 29168.38, 2980612, 18002896
20/12/31 09:38:50, 29232.75, 2980116, 17999900

```
実行すると各行に
　時刻、USD価格、JPY価格、所有BitcoinのJPYでの評価額
が表示されます。CTRL-Cで停止するまでずっと表示が続きます。

2020/12/31現在非常に値上がりしています。6.04BTCが約1800万円。来年どうなるかなぁ。
【超おすすめ】「Amazon Web Services 基礎からのネットワーク&サーバー構築」で学んだこと

# 背景
* ソリューションアーキテクト試験に向けて勉強していますが、前提となるVPC周りの知識があやふやになっていたので、「Amazon Web Services 基礎からのネットワーク&サーバー構築」で勉強し直しました
* VPCやEC2周りをサクッと勉強したい人にはおすすめです

### リージョン
* それぞれの地域に存在するデータセンター群

### アベイラビリティゾーン
* 物理的に距離が相当離された、独立したファシリティ（ネットワークや電源網などの設備）

## 構築の進め方
### VPCの作成
* リージョンの設定
* 使用するIPアドレスを設定

### サブネットに分割
* パブリックとプライベートに分けることが多い


#### サブネットに分割するメリット
* 物理的に隔離し、障害発生時に影響範囲を限定する
* セキュリティ上の理由
    * 特定のグループからのアクセスは禁止したい、など

#### パブリックサブネットの作り方
* サブネットの作成
* サブネット名、IPアドレスを入力

### インターネットゲートウェイ
* サブネットをインターネットに接続するために必要

####インターネットゲートウェイの作成方法
* インターネットゲートウェイの作成を進める
* VPCに割り当てる→VPCをアタッチする

### ルートテーブルの設定
* ルートテーブル：ネットワークにデータを流すための設定
* Amazon VPCでは、サブネットごとにルートテーブルを設定
* デフォルトでは、「送信先：10.0.0.0/16、ターゲット：local」と設定されている
    * サブネットから「10.0.0.0/16」あてのパケットを、ローカルに転送するという意味
    * サブネットから「10.0.0.0/16」以外のパケットを全て破棄する
* インターネットと接続するために、「0.0.0.0/0の宛先のパケット(=全てのパケット)をインターネットゲートウェイ に転送する」という設定をルートテーブルにする必要がある

### パブリックサブネットをインターネットに接続する方法
* 新しくルートテーブルを作成する
* ルートテーブルにサブネットを割り当てる
* ルートを追加し、デフォルトゲートウェイにインターネットゲートウェイを設定する

### インスタンス
#### インスタンスの作成方法
* リージョンの確認
* AMIの選択
* インスタンスタイプの選択
* 詳細情報の設定
    * VPC
    * サブネット
    * パブリックIP
    * プライベートIP
* ストレージの設定
* 名前付与
* セキュリティグループの設定
    * インスタンスにセキュリティを設定する機能
    * IPアドレスとポートを選択し、通信を制御する
* インスタンスの起動
* キーペア作成
    * キーペア：インスタンスログイン時に必要となる「鍵」

### DNS
* パブリックDNS：インターネットから参照できる
* プライベートDNS：VPC内でしか参照できない

### DNSサーバーの構成方法
* インスタンスの名前解決を有効にするよう、VPCを設定

### 踏み台サーバーを経由してSSHで接続する
* DBサーバなどをプライベートサブネットに置いた場合に、パブリックサブネット上のWEbサーバーからSSHで接続する

### 踏み台サーバーを経由してSSHで接続する方法
* DBサーバの秘密鍵をWebサーバに置く
* 鍵ファイルのパーミッションを変更して、自分しか読めないようにする
* SSHでDBサーバに接続する

### NAT
* プライベートサブネット上のサーバーがインターネットに接続するために使う
    * サーバーのアップデートやソフトウェアのインストール時にインターネットが必要

* AWSではNATインスタンスとNATゲートウェイがある
    * NATインスタンス：NAT機能付きのEC2インスタンスを使う方法
    * NATゲートウェイ：NAT専用のコンポーネント
        * 構築はこちらの方がしやすい

#### NATゲートウェイの構築方法
* NATゲートウェイの作成
* サブネットとElastic IPの割当
* ルートテーブル更新
    * プライベートサブネットのデフォルトゲートウェイをNATゲートウェイに向ける → 「送信先：0.0.0.0/0」「ターゲット：NATゲートウェイのインスタンスID」を設定する
`chromedriver' executable may have wrong permissions. を解決する

先日seleniumをlambdaで運用しよとしたときに遭遇しました。

permissionなんて設定したっけな？と思いましたどうやらosに対応していないバージョンを使用するとこのエラーが出てきてしまうようです。

### 解決法

lambdaのOSはLinuxなのでLinuxに対応したバージョンをインストールしてからレイヤーにアップロードする。

こちらに関してはLinux環境を用意する必要があるのでaws cloud9を使用すると簡単です。

[>>Lambdaでseleniumを使ってスクレイピング](https://qiita.com/ichihara-development/items/5e61c3424b3176bc6096)
'lambda_function': No module named 'selenium' が出るとき

## seleniumのPATHが間違っている
pythonの場合lambdaレイヤーは
・python
・python/lib/python3.x/site-packages 

配下を自動で読み込むため、アップロードしたseleniumzipファイルが上記のディレクトリ構造になっているかをもう一度確認してみてください。


## zipファイルを解凍していない

外部からダウンロードしてきたseleiumをzipのままで保存し、親ディレクトリごと圧縮してしまうとlambdaでseleniumを使用することができません。

![スクリーンショット (146).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/46f56de0-83cc-22f3-7ebf-ac8c815b696e.png)


一度解凍してから再びフォルダを圧縮しアップロードしなおすと上手くいきます。