OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでsftpファイル送信

# 目的
Pythonでsftpファイル送信を行いたい

# 利用ライブラリ
- [atmoz/sftp](https://hub.docker.com/r/atmoz/sftp/)
- [paramiko](http://www.paramiko.org/)

# sftp開発環境構築
Dockerで「atmoz/sftp」を利用し構築します。
以下のコマンドでコンテナ起動します。

```
docker run -p 22:22 -d atmoz/sftp hoge:pass:::upload
```

ユーザ名「hoge」パスワード「pass」アップロード先フォルダ「upload」で構築しました。

# sftp接続確認
```
$ sftp hoge@localhost
hoge@localhost's password: 
Connected to localhost.
sftp> ls
upload  
sftp> cd upload/
sftp> pwd
Remote working directory: /upload
```

接続確認ができましたのでローカルのsftp環境はOK

# Pythonでsftpファイル送信を試す
まずは paramiko をインストール

```
$pip install paramiko
```

Pythonでローカルにファイルを作成し
そのファイルをsftpファイル送信してみます。

```py
# coding: utf8

import paramiko

# SFTP接続情報
SFTP_HOST = 'localhost'
SFTP_PORT = 22
SFTP_USER = 'hoge'
SFTP_PASS = 'pass'

# アップロード先パス
UPLOAD_FILE_PATH = '/upload/test.txt'
# ローカルのアップロード予定ファイル
LOCAL_FILE_PATH = './test.txt'


def main():
    # アップロードするファイル作成
    with open(LOCAL_FILE_PATH, 'w') as local_file:
        local_file.write('test')

    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    client.connect(SFTP_HOST, port=SFTP_PORT, username=SFTP_USER, password=SFTP_PASS)
    sftp = client.open_sftp()
    # sftpファイル送信
    sftp.put(LOCAL_FILE_PATH, UPLOAD_FILE_PATH)
    if sftp:
        sftp.close()

if __name__ == '__main__':
    main()

```

# ファイル確認
再度、sftp接続しファイルが作成されているか確認してみます。

```
$ sftp hoge@localhost
hoge@localhost's password:
Connected to localhost.
sftp> cd upload/
sftp> ls -la
drwxr-xr-x    2 1000     100          4096 Mar 22 09:53 .
drwxr-xr-x    3 root     root         4096 Mar 22 09:30 ..
-rw-r--r--    1 1000     100             4 Mar 22 09:53 test.txt
```

ファイルが存在しており無事にPythonでsftpファイル送信を行うことが出来ました。
qiskitを使って量子テレポーテーションの実装する

https://www.amazon.co.jp/Quantum-Computation-Information-10th-Anniversary/dp/1107002176

最近、この本を使って量子コンピューティングを勉強し始めました。
練習問題が難しいです（笑）
ここではアウトプットの一環として量子テレポーテーションをqiskitを使って実装していきます！
開発環境はcolabです。

<h2>IBMのアカウントを作る</h2>

https://www.ibm.com/quantum-computing/

ここからIBMのアカウントを作成します。

<h2>qiskitのインストール</h2>

```
pip install qiskit
pip install pylatexenc
```
下のやつは量子回路を表示させるときに使います。（なくても一応大丈夫ですがあったほうが見やすくなります。）

<h2>必要なライブラリのインポート</h2>
```
from qiskit import *
import numpy as np
%matplotlib inline
```

<h2>回路を作っていく！</h2>
```
qc = QuantumCircuit(3, 1)

#未知の状態を作る
qc.ry(np.pi/5, 0)
qc.barrier()

#ベル状態を作る
qc.h(1)
qc.cx(1, 2)
qc.barrier()

qc.cx(0, 1)
qc.h(0)
qc.barrier()

qc.cz(0, 2)
qc.cx(1, 2)

qc.ry(-np.pi/5, 2)

qc.measure(2, 0)

qc.draw(output="mpl")
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127342/e3bc34db-300a-d340-9f56-717d630c552f.png)

回路の説明をしていきます。
数式ベースの話は次の記事に書こうと思いますので、雰囲気だけ掴んでもらえれば幸いです。
最初の$q_0$にかかっている$R_Y$というゲートで、送りたい量子状態をつくっています。
つぎの点線の中は$q_1$と$q_2$をベル状態という特別な状態にしています。
ここまではいわば、準備の段階で、次からが量子テレポーテーションを行うところです。
ここからは次回の記事で説明します

<h2>実際に量子コンピューターに投げてみる</h2>
```
from qiskit import IBMQ
IBMQ.save_account('###') #ここに自分のtokenをいれる
```
```
#使える量子コンピューターを調べる
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q')
provider.backends()
```
実行結果に現在使用できる量子コンピューターが表示されます。

```
# 最もすいているバックエンドを選ぶ
from qiskit.providers.ibmq import least_busy
large_enough_devices = IBMQ.get_provider().backends(filters=lambda x: x.configuration().n_qubits > 3 and not x.configuration().simulator) 
print(large_enough_devices)
real_backend = least_busy(large_enough_devices)   

print("ベストなバックエンドは " + real_backend.name())
```
実行結果に一番すいているものが表示されます。

```
job = execute(qc,real_backend)
```

```
# ジョブの実行状態を確認
from qiskit.tools.monitor import job_monitor
job_monitor(job)
```
自分の場合は一時間ぐらい待ったら実行結果が返ってきました

```
real_result= job.result()
print(real_result.get_counts(qc))
plot_histogram(real_result.get_counts(qc))
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127342/ba2e3a85-ab19-2760-bae5-4bd9ac783a14.png)

<h2>感想</h2>
シミュレーターでられば、0が100%になるんですけど、実際の量子コンピューターだと1が少し出てきてしまいます。誤り制御？がまだ量子コンピューターではできないからこうなるそうです。（自分もまだよくわかっていないです）
鉛筆と紙で理論ばっかり勉強するのも楽しいですが、こうやって実際に自分でやってみるのも楽しいかったです。これからもたくさん利用させていただきたく思います。
SSMって便利。でも管理が大変。なのでToolを作った話

## はじめに

各EC2のユーザー管理がしんどいしんどい。

だってインスタンスが20~30種類あって、インスタンス毎にユーザーが独立されて管理されているんですぜ。

そもそも、EC2にユーザーいる？sshする必要ってある？しなくても済むように設計するべきだよね。
接続する時はSSMでいいよね。

と言う訳でそんな構成に。
したはよいが、今度はSSMする時に

「え〜っと。どうやるんだっけ？」

と言う経年劣化による記憶容量がScaleIn、コマンドが思い出せない事案が発生。

ならToolを作りましょう。

## 構築

コマンドを実装

```
$ vim ssm.sh
```

```ssm.sh
#!/bin/sh
AWS_CONFIG='~/.aws/config'
profile=''
function showProfile() {
  echo '# Input profile.'
  echo '## profile list.'
  cat ~/.aws/config | grep profile
  echo '##'
  read input
  if [ -z $input ] ; then
    echo 'Done.'
    exit 1
  else
    profile=$input
  fi
}
function ssmInstance() {
  echo '# Input ResourceId.'
  echo '## ResourceId list.'
  aws ec2 describe-tags --profile $profile  --output table --filters "Name=resource-type,Values=instance"
  echo '## ResourceId list.'
  read input
  if [ -z $input ] ; then
    echo 'Done.'
    exit 1
  else
    aws ssm start-session --target $input --profile $profile
  fi
}
showProfile
ssmInstance
```
コマンドを移動

```
$ chmod 744 ssm.sh
$ mv ssm.sh /usr/local/bin/ssm
```

以上。

## 実際に使ってみる。

```
$ ssm
# Input profile.
## profile list.
[profile profile-dev]
[profile profile-prod]
[profile teck]
[profile pricate-dev]
##
-- 接続対象のprofileを入力
# Input ResourceId.
## ResourceId list.
------------------------------------------------------------------------------------------
|                                      DescribeTags                                      |
+----------------------------------------------------------------------------------------+
||                                         Tags                                         ||
|+----------------------------+-----------------------+---------------+-----------------+|
||             Key            |      ResourceId       | ResourceType  |      Value      ||
|+----------------------------+-----------------------+---------------+-----------------+|
||  Name                      |  i-xxx                |  instance     |  webapp_1       ||
||  Name                      |  i-xxx                |  instance     |  webapp_2       ||
||  Name                      |  i-xxx                |  instance     |  batch          ||
||  Name                      |  i-xxx                |  instance     |  nat            ||
|+----------------------------+-----------------------+---------------+-----------------+|
## ResourceId list.
-- 接続対象のResourceIdを入力
Starting session with SessionId: xxxxxxxx
sh-4.2$
-- 接続！！！
```
## 終わりに

EC2のユーザーを脳死で追加してしまうと、いざと言うときに管理や棚卸しがとても大変。
なのでそもそも「EC2に接続しないように・させないように」する設計が大事。

※ ECS / Fargateを使えば万事解決
Vue.js~オブジェクト（ドラえもん）~

https://qiita.com/akari_0618/items/36ba2fc4dee783def482
前回の記事でのオブジェクトについて触れていきたいと思います。

簡単に言うとオブジェクトとは物体なのですが、わけわからないと思うのでここではドラえもんという作品を作るということにしときます。
ということで最初にいきなりオブジェクトに突っ込むと詰むので、まずは周りから攻めていきましょう。
ドラえもんの登場人物で考えて行きましょう。

#クラス
これは設計図のです。難しいことは考えずにもう設計図だと思ってください！
しずかちゃんとかのび太くんのプロフィール用紙のようなものです。

#プロバティ
これはCSSを触っていると馴染みがあると思います。要は、１つ１の説明のようなものです。
ドラえもんだとわかりにくいので、のび太くんたちで例えます。
のび太くんたちの出身地、通ってる学校、学年などをかきます。ある程度共通項目があるので、それをかきます。

#メゾット
行動のことです。
何をするのか、特技はなにか、好物はなにかなどですね

これが、のび太くんたちの共通項目です。
ここから一人ひとりの設計図を作っていきます。


そして共通のクラスをあたしく作ったクラスに受け継ぐことを『継承』と言います！！

新たにクラスを作ったあとに、プロバティを詳細に記載していきます。
のび太くん▶　＜プロバティ＞
　　　　　　出身地：東京　学校：小学校　学年：５年生
　　　　　　＜メソッド＞
　　　　　　何をするのか：昼寝　特技：あやとり　好物：カレーライス
　　　　　　のび太くんはジャイアンにいじめられて泣きますが、帰ってきたドラえもんみたいにたまに自分の力でなんとかすることもあるの　　
　　　　　　ので、ここはあまり変えたくないなってときには『カプセル化』します。
これを、登場人物順に作っていく感じです。

共通項目を作ることにより、たまには出来杉君入れようよってなっても継承するだけって感じで改修しやすくなりますよね！😊
また話が進んでいくうちにのび太くんたちが社会人になる場合もあるのでその場合に設定を変える場合にオブジェクトで書くと楽だよってことですね。
testcafe (自分用)

###活性化非活性かをチェックする
```
const button = Selector("button").withText("送信する");
test("活性テスト", async(t) => {
　await t
　　.expect(button.hasAttribute("disabled"))
　　.notOk();
});
test("非活性テスト", async(t) => {
　await t
　　.expect(button.hasAttribute("disabled"))
　　.ok();
});
```
NWChem触ってみた

# 初めに
QM/MMをやってみたかったので、[NWChem](https://github.com/nwchemgit/nwchem)を触ってみた。
が、ドキュメントを読んでも全体像がよく分からなかったので
今回は水分子のHF/6-31Gでの構造最適化だけ試してみた。

# バージョン
- NWChem 7.0.2
- Windows 10
- WSL 1 / Ubuntu 18.04.4

# ダウンロードとインストール
[releaseページ](https://github.com/nwchemgit/nwchem/releases)を参考に次のようにインストール。

```
$ sudo apt-get update
$ sudo apt -y install  python3-dev gfortran  mpi-default-bin mpi-default-dev ssh
$ curl -LJO https://github.com/nwchemgit/nwchem/releases/download/v7.0.2-release/nwchem-data_7.0.2-1_all.ubuntu_bionic.deb
$ curl -LJO https://github.com/nwchemgit/nwchem/releases/download/v7.0.2-release/nwchem_7.0.2-1_amd64.ubuntu_bionic.deb
$ sudo dpkg -i nwchem*7.0.2*bionic*.deb
```

これをすると`nwchem`のパスが通っているハズ。(通っていなければシェルを再起動)
`nwchem`は`/usr/bin/nwchem`にインストールされている。
インストールされたものは実行ファイルの`nwchem`のみ。
(ソースコードとかは無さげ……コンパイル済みのものをインストールしたのかな)

```
$ which nwchem
/usr/bin/nwchem
```
(インストール場所って変えられないのかな…)

# 環境変数の設定
しなくても実行はできたので割愛。
mpirunとかの処理の最適化をするなら必要なのか？

# サンプル
```:h2o.nw
start h2o
title "Water in 6-31g basis set"

geometry units au
    O  0.00  0.00  0.00
    H  0.00  1.43 -1.11
    H  0.00 -1.43 -1.11
end
basis
    H library 6-31g
    O library 6-31g
end
task scf optimize
```
公式ドキュメントにもあるサンプルをとりあえず適当なディレクトリに作り、
これを実行する。

```
$ nwchem h2o.nw
```
もしくは

```
$ mpirun -np 4 nwchem h2o.nw
```

するとGaussianのlogファイルみたいなものが標準出力される。
最適化過程における座標値やエネルギー値を出力している様子。

また、同時にファイルが生成される。

```
$ ls
 'h2o.b^-1'   h2o.cfock   h2o.drv.hess   h2o.nw       h2o.p
  h2o.b       h2o.c       h2o.db         h2o.movecs   h2o.zmat
```
`.nw`(インプット)を除いてどれもバイナリなので直接読むことはできない。

標準出力はシェルのリダイレクトを使うことでファイルに保存できる

```
$ nwchem h2o.nw > h2o.nwout
```

# 可視化
GaussianはGaussViewがあるが、NWChemは？となり調べてみたところ
Gaussianのcube形式に出力することができる。([dplot](https://nwchemgit.github.io/DPLOT.html))
その場合は次の通りにインプットに`dplot`と`task`を追加する。

```:h2o.nw
start h2o
title "Water in 6-31g basis set"

geometry units au
    O  0.00  0.00  0.00
    H  0.00  1.43 -1.11
    H  0.00 -1.43 -1.11
end
basis
    H library 6-31g
    O library 6-31g
end
task scf optimize

dplot
    gaussian
    limitxyz; -3.0 3.0 100; -3.0 3.0 100; -3.0 3.0 100
    output chargedensity.cube
end
task dplot
```
これで回すと、chargedensity.cubeファイルが生成される。
中には格子点(`limitxyz`で指定)上の電子密度の値が並んでいる。
加えて7行目から最適化構造の座標値も出力されている。
(cubeファイルの解釈は[このページで](https://wikiwiki.jp/itatte22/gaussiancubefile))

```:chargedensity.cube
 Cube file generated by NWChem
 Unknown Title
    3   -5.669180   -5.669180   -5.669180
  101    0.113384    0.000000    0.000000
  101    0.000000    0.113384    0.000000
  101    0.000000    0.000000    0.113384
    8    8.000000    0.000000    0.000000    0.154929
    1    1.000000   -1.483748    0.000000   -0.854464
    1    1.000000    1.483748    0.000000   -0.854464
  0.77530E-13  0.10980E-12  0.15423E-12  0.21483E-12  0.29679E-12  0.40662E-12
  0.55250E-12  0.74450E-12  0.99496E-12  0.13187E-11  0.17333E-11  0.22595E-11
  0.29211E-11  0.37452E-11  0.47622E-11  0.60053E-11  0.75104E-11  0.93152E-11

....
```

あとはこれをGaussViewに読ませるなり、自分で解読するなり()すればOK

他にもMOとかスピン密度とかも出力できるらしいが、今回は興味がないので割愛
解決！Rubyのバージョンアップに伴うトラブル｜rails コマンドが動かない

##1. 状況  
1) 開発環境にあったプロジェクトをherokuにpushしようとしたところ、ruby のバージョンが 2.6.3 になっているけど、2.6.6 を使用しろと言われた。  
2) これは、なんとか解決。その時の戦記は[こちら](
https://qiita.com/6OdhzjPIEGaL2ye/items/ed500a856d43f06c46fb)。  
3) 無事にherokuにpushはできた。  
4) しかし、そのあと、rails s しようとしたところ、謎のエラーが出た。

```terminal:環境
% ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin20]

% rbenv versions
  system
  2.5.1
  2.6.3
* 2.6.6 (set by /Users/randytozuka/.rbenv/version)

% gem -v
3.2.15
```
エラー文

```terminal:ターミナル
% rails s            
/Users/randytozuka/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/bundler-1.17.2/lib/bundler/rubygems_integration.rb:200: warning: constant Gem::ConfigMap is deprecated
Traceback (most recent call last):
    71: from bin/rails:3:in `<main>'
    70: from bin/rails:3:in `load'
    69: from /Users/randytozuka/Desktop/deskschedule2-master/bin/spring:15:in `<top (required)>'
　　（中略）
 　　 2: from /Users/randytozuka/Desktop/deskschedule2-master/vendor/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:89:in `register'
　　　1: from /Users/randytozuka/Desktop/deskschedule2-master/vendor/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
/Users/randytozuka/Desktop/deskschedule2-master/vendor/bundle/gems/bootsnap-1.7.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require': cannot load such file -- etc (LoadError)
```


##2. 対応    
ググってみたところ、先人がこのようなアドバイスを残してくれていた。
・bundle install をしろ
・gem install bundler を試してみろ
・gem を update したら bundler も update せよ
・RubyGemsのバージョンをupdate か downgradeして、bundlerのバージョンと相性のよいバージョンに合わせろ

```terminal:ターミナル
% gem update --system
Latest version already installed. Done.

% gem update bundler
Updating installed gems
Nothing to update

% gem list rubygems-update
*** LOCAL GEMS ***
rubygems-update (3.2.15)
```
状況変わらず…（TT）
ここでメンターさんから、これやってみと教えていただいた事をやってみる。

```terminal:その１
gem uninstall -I -a -x --user-install --force
ERROR:  While executing gem ... (Errno::ENOTEMPTY)
    Directory not empty @ dir_s_rmdir - /Users/randytozuka/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/rails-6.1.3
```

エラーか強い心でスルーする。

```terminal:その２
gem install bundler
Fetching bundler-2.2.15.gem
Successfully installed bundler-2.2.15
1 gem installed
```
その３、ここでGemfile.lock を削除して,


```terminal:その４
% bundle install
% rails s 
```

どうじゃ！！　お？？　エラーがちょっと変わった。
ん〜〜〜となったところで,たまたま見た[記事](https://cloud6.net/so/ruby-on-rails/4068237) にあった ↓ を試してみる。

```terminal:ターミナル
% bundle install --redownload
```
解決! やった！

#3. まとめ
丸一日彷徨いました。
今回のトラブルは、ruby 及び rails のバージョンを上げたが、gem がそれについてきていなかったので、もう一回最新の gem のライブラリを読み込んだら解決した…ということだったのかなと。安易にrubyのバージョンあげると大変だよということでいい勉強させてもらいました。
【Rails】投稿したURLをリンク可能にする方法

#投稿したURLをリンクにしたい！！！


###結論からいうと、Gemをインストールすれば簡単に解決できます！


イメージが湧きやすいように実際の画像で説明します。


①このように製作した投稿機能からURLを投稿すると...
![スクリーンショット 2021-03-22 18.01.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918117/f0eadce7-9672-6ed6-0afa-eff037cf1c6c.png)

↓↓↓↓↓↓

![スクリーンショット 2021-03-22 18.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918117/314f11c0-5c72-1c0a-21ae-d32fee2805ce.png)


②このような感じでリンクが押せない状態で投稿されてしまう。


##rinku というGemをインストールすれば問題は解決できる。

③Gemfileにrinkuを追加。

```
gem 'rinku'
```

```
bundle install
```

これでrinkuをインストールできました。


##viewのコードをrinkuに対応した形式に書き換える。

④erbファイルを、rinkuに対応したコードに書き換えます。

```
<%= post.link %>
```

↓↓↓↓↓

```
<%= Rinku.auto_link(post.link, :all, 'target="_blank"').html_safe %>
```

これだけでリンクとして反映されています。

ただこれだけだと、もしもリンクを投稿しない場合、「データがnilですよ」というエラーが発生する可能性があります。
そんな時はlinkの投稿フォームにあらかじめバリデーションをかけておくか、

```
<% if post.link.nil? %>
  <%= post.link %>
<% else %>
  <%= Rinku.auto_link(post.link, :all, 'target="_blank"').html_safe %>
<% end %>
```

...と、if文でlinkというカラムにデータが存在するか否かを条件分岐してあげれば解決できます。
ちなみに、'target="_blank"'があると外部リンク、無いと内部リンクになるようです。

![スクリーンショット 2021-03-22 18.35.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918117/85bff10e-66b8-a396-5f79-ada27d379400.png)


確認してみると、このようにリンクといえばお馴染みの青色が着色されました。
リンクを押せば、外部のサイトにも飛べるようになるはずです。
Perl: CGI.pm の使い方

CGI.pm を使って、アクセスした URL を取得する方法です。

```perl:test_script.pl
#! /usr/bin/perl
#
#	test_script.pl
#
use strict;
use CGI;

my $query = CGI->new;
my $SelfUrl   = $query->self_url;
#
my $file_out = "/var/log/apache2/perl/perl_aa.txt";
open (OUT,">$file_out");
binmode OUT, ":encoding(UTF-8)";
print OUT "*** test_script.pl *** start ***\n";
print OUT "*** test ***\n";
print OUT $SelfUrl . "\n";
print OUT "*** Mar/22/2021 PM 18:29  ***\n";
print OUT "*** test_script.pl *** end ***\n";
close (OUT);
#
print STDERR "*** test_script.pl *** start ***\n";
print STDERR "*** Mar/22/2021 PM 18:27 ***\n";
#
print "Content-type: text/html; charset=utf-8\n\n";
print "*** test_script.pl ***<br />\n";
print "Hello<br />\n";
print "Good Morning<br />\n";
print "Mar/22/2021 PM 15:59<br />\n";
print "<p></p>\n";
#
print STDERR "*** test_script.pl *** end ***\n";
#
```

実行すると次のようなファイルが作成されます。

```text:/var/log/apache2/perl/perl_aa.txt
*** test_script.pl *** start ***
*** test ***
https://example.com/cgi-bin/test_virtual.php
*** Mar/22/2021 PM 18:29  ***
*** test_script.pl *** end ***
```

Arch Linux で CGI.pm をインストールする方法

```bash
sudo pacman -S perl-cgi
```

関連ページ
[Apache2 の PHP で virtual を使う](https://qiita.com/ekzemplaro/items/8e7fa417cc1e86a0ee38)
[Apache2 の PHP で virtual を使う (ファイル書き込み)](https://qiita.com/ekzemplaro/items/f2256fabad185d127439)
Model データ周り 自分用


```Swift:Swift
//クイズのデータ
struct Quiz: Decodable {
    //クイズのID
    let quizID: Int?
    //クイズの問題文
    let question: String
    //クイズの選択肢
    let choices: [String]?
    //クイズの答え
    let answer: String
    //クイズの難易度
    let difficulty: Int
    //クイズの解説
    let commentary: String?
    //4択かどうか
    var isFourChoices: Bool {
        return choices != nil
    }
}
```

```Kotlin:Kotlin
data class Quiz (
    /** クイズのID */
    val quizID: Int?,
    /** クイズの問題文 */
    val question: String,
    /** クイズの選択肢 */
    val choices: List<String>?,
    /** クイズの答え */
    val answer: String,
    /** クイズの難易度 */
    val difficulty: Int,
    /** クイズのコメント */
    val commentary: String?
) {
    /** 4択かマルバツかの分岐 */
    val isFourChoices: Boolean
        get() = choices != null
}
```
DockerのVolume領域について

# Docker上での記憶領域について
ちょっと気になったのでDockerDesktop for WindowsとLinuxでのDockerのvolumeについてメモ。

~~~:確認用コマンド
// Docker上のボリューム一覧
docker volume ls

//指定ボリュームの詳細情報
docker volume inspect <VOLUME NAME>
~~~
## DockerDesktop for Windows
dockerを利用するために利用しているWindows Subsystem for Linux内にコンテナやイメージが保持されている。

windowsのボリューム上に仮想Linuxディスクイメージが保存されている。

~~~:windows用の仮想linuxディスクイメージ
C:\ProgramData\DockerDesktop\vm-data\Dockerdesktop.vhdx
~~~

WSL上でのマウントポイントを調べてみると、

~~~:仮想Linux上のマウントポイント
"Mountpoint": "/var/lib/docker/volumes/<VOLUME NAME>/_data"
~~~
docker-compose.ymlで指定したvolumesのpathにmongoDBのデータが保存されているっぽい。


## DockerEngin(linux)
linux上にdockerを構築した場合はホストOSのボリュームに直接コンテナのデータなどが保存される模様。
dockerのボリューム位置を確認すると以下の場所に格納されていた。

~~~:Linux上のマウントポイント
 "Mountpoint": "/var/lib/docker/volumes/<VOLUME NAME>/_data"
~~~
Mountpointで指定されているpathにアクセスしてみると、実際にコンテナ内のデータを確認することができる。


## ボリュームの挙動について
volumeが削除されない限りは
docker-compose.ymlのvolumeの設定を以前のvolumeと同じpathを指定すればmongoDBのデータは引き継がれて使える模様。
(コンテナやイメージを削除してもvolumeは削除されずホストOS内に残っている)
ユーザー管理機能をDeviseを使って実装する方法(Rails)

# RailsにDeviseを導入する方法（学習記録）:statue_of_liberty:

#### 1: Gemのインストール
まずdeviseというGemをインストールします


```
# Gemfile
# 追記
gem 'devise

# Gemのインストール
% bundle install
```

#### 2: rails g devise:installコマンドの実装

```
# deviseの設定ファイルを作成
% rails g devise:install
```

#### 3: rails g deviseコマンドでdeviseに管理させたいモデルを生成

```
# deviseコマンドでUserモデルを作成
% rails g devise user

# マイグレーションファイルも自動生成される
```

#### 4: マイグレーションの実行
```
# マイグレーションを実行
% rails db:migrate
```

#### 5: deviseのビューを作成
※ deviseでログイン機能を実装すると、ログイン/サインアップ画面が自動的に生成されますがビューファイルとしては生成されません。これは、deviseのGem内に存在するビューファイルを読み込んでいるためです。deviseのビューファイルに変更を加えるためには、deviseのコマンドを利用して、ビューファイルを生成する必要があります。

```
% rails g devise:views

# 生成されたビューファイルを独自に編集
```

#### 5: カラムの追加
※ 現在、サインアップ時に登録する情報はメールアドレスとパスワードの2つです。これに加えて名前を登録できるようにしましょう。
テーブルにカラムを追加するために、マイグレーションを生成する必要があります。

##### 1.rails g migrationコマンド

マイグレーションを生成するコマンドです。
マイグレーションはこれまで、rails g modelコマンドでモデルと一緒に生成されていましたが、すでに作成されたテーブルの内容を変更する際などに使用します。

##### 2.usersテーブルにnameカラムをstring型で追加
```
# usersテーブルにnicknameカラムをstring型で追加するマイグレーションファイルを作成
% rails g migration AddNameToUsers name:string

# 作成したマイグレーションを実行
% rails db:migrate
```

##### 3.ストロングパラメーターを使えるようにする
※ サインアップ時に入力する情報はパラメーターとしてサーバーに送信されます。deviseを使わない通常のリクエストの場合は、コントローラーにストロングパラメーターを記述し、受け取れるパラメーターを制限していました。deviseに関しても、同様にストロングパラメーターをコントローラーに記述します。しかし、deviseの処理を行うコントローラーはGem内に記述されているため、編集することができません。

##### 4.devise_parameter_sanitizerメソッド
deviseにおけるparamsのようなメソッドです。deviseのUserモデルに関わる「ログイン」「新規登録」などのリクエストからパラメーターを取得できます

```
# application_controller.rbを編集
# sign_up（新規登録の処理）に対して

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
```
以上がユーザー管理機能をDeviseを使って実装する方法です！参考までにどうぞ！！
Vite+React+Typescriptでimportのパスを必要最低限にする

[Vite](https://github.com/vitejs/vite)を使用してReact+Typescriptのプロジェクトの開発をしています。
Typescriptのimportのパスに`../`のような相対パス指定を指定したくなくて、必要最低限の指定で利用できないものかと考えていました。
ほんのわずかなコードでも、コードが小さければ不具合はそれだけ減らせるからです。

そこでtsconfig.jsonに`compilerOptions.baseUrl`の設定をしたものの、Viteはその設定を読んでくれませんでした。
Viteにはvite.config.tsという設定ファイルがあるのでそこに設定をしなければならないようです。

私のプロジェクトでは、アトミックデザインを採用しています。

## tsconfig.jsonの例

baseUrlを書くと相対パスの指定がない場合にどこを起点にパスを解決するかを指定できます。
ここでは`"src"`としています。
pathsという設定もあるのですが、それもViteは読み込まないようです。

```json
{
  "compilerOptions": {
    "target": "ESNext",
    "lib": ["DOM", "DOM.Iterable", "ESNext"],
    "types": ["vite/client"],
    "allowJs": false,
    "skipLibCheck": false,
    "esModuleInterop": false,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react",
    "baseUrl": "src"
  },
  "include": ["./src"]
}
```

## vite.config.tsの例

tsconfig.jsonに書いたbaseUrlやpathsはViteは読んでくれません。
そこでvite.config.tsは以下のようにエイリアスを設定します。

`import * as path from "path"`の部分がエラーになる方は、`yarn add @types/node -D`か`npm -i -D @types/node`を実行してください

```typescript
import { defineConfig } from "vite"
import reactRefresh from "@vitejs/plugin-react-refresh"
import * as path from "path"

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [reactRefresh()],
  resolve: {
    alias: {
      "atoms": path.resolve(__dirname, "src/atoms"),
      "molecules": path.resolve(__dirname, "src/molecules"),
      "organisms": path.resolve(__dirname, "src/organisms"),
      "templates": path.resolve(__dirname, "src/templates"),
      "pages": path.resolve(__dirname, "src/pages")
    }
  }
})
```

## import文はどうなる？

ディレクトリー構成は以下のようになっているとします。

```text
：
├ pages
│　├ index.ts
│　└ HomePage.tsx
├ templates
│　├ index.ts
│　└ MainTemplate.tsx
：
```

index.tsは以下のようになっているとします。

```typescript
import MainTemplate from "templates/MainTemplate"

export { MainTemplate }
```

import文は以下のように指定すれば、必要最低限の指定でコンポーネントを呼び出せます。

```react
import * as React from "react"
import { MainTemplate } from "templates"

export default () => (
  <MainTemplate>
    コンテンツ
  </MainTemplate>
)
```

## 注意

- 本プロジェクトで使用しているViteのバージョンは`2.1.2`です。バージョン1系だと、vite.config.tsの書き方が違う可能性があるのでご注意ください。
- 指定したエイリアス以外のディレクトリーが必要になったときは、vite.config.tsにメンテナンスが必要になりますが、そのようなことが起こることはあまりない前提です。
rails new でディレクトリが作成されない！

#開発環境
xcode
homebrew
Ruby2.6.5
rails 6.0.0
VScode バージョン: 1.54.2
データベースは　Sequel Pro 1.1.2

#起こったこと
よし！新しいアプリを作成しようとターミナルにて

```ruby
rails _6.0.0_ new (アプリ名) -d mysql
```
を実行したら、、、

```ruby
 create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  Gemfile
         run  git init from "."
```

で終了、、、

あれ？？こんな早くrails newコマンドって終わるっけ？
あれ？？VScodeのディレクトリ少なすぎない？？appファイルは？configファイルは？一体何が起こっているんだ！？！？
#原因
いろいろ調べてみると
どうやら、先程の

```ruby 
    run  git init from "."
```
がヒントらしく、自分の場合はgitがインストールされていないよということだった。

そういえばVScodeで作業している時もなんか右下にGitがインストールされていませんと出ていたような、、、
いやでも最初の環境構築でGitの公式サイトからインストールしてないけどな、、どういうことだ？？
環境構築の部分を見直す必要がありそうかな？

ということでターミナルにて

```ruby
brew -v
```
で現在のhomebrewのところを見てみると

```ruby
Homebrew >=2.5.0 (shallow or no git repository)
Homebrew/homebrew-core (no Git repository)
```
おっと、なんか (no Git respository)といかにもそうなのがでてきました！
###解決した方法
解決した方法は単純にhomebrewを再度インストールするでした。

具体的には
1、homebrewの公式サイト（https://brew.sh/index_ja）
　にアクセス
2、トップページに大きくインストールと書かれている部分をコピーしてターミナルのホームディレクトリにて実行

```ruby
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

３、再度brew -vコマンドを用いると

```ruby
Homebrew 3.0.7
Homebrew/homebrew-core (git revision 173ea7530d; last commit 2021-03-22)
```
(no Git repository)じゃ無くなって問題解決！

実際にこの後も問題なくアプリを作成できました！
#最後に

この記事が誰かの学習の後押しになれば幸いです。
この投稿が初めての投稿となります。
この記事についてまだまだ自分も未熟で、至らぬところも多々あるかとは思いますが、その際はご教授願えればと思います。
プログラミング学習は決して楽ではないですが、お互いに頑張っていきましょうね。
#参照リンク先
https://git-scm.com/download/mac
https://qiita.com/kodai_0122/items/56168eaec28eb7b1b93b
https://qiita.com/Yuu94/items/a97490f57640587e0ac7
勉強になりました！ありがとうございました！
マルチタスク学習者に最適なオンライン家庭教師サイト5選

直接会って話をすることが望ましいのは言うまでもありませんが、今の時代はオンライン家庭教師が主流です。今は社会的に距離を置く時代ではありませんが、リクエストに応じて家庭教師を呼ぶのはとても楽しいことです。スケジュールの自由度が高く、時間をかけずに済む（実在の場所に通う必要もない）ため、これらのサイトには、特定の分野で上級学位を取得している数名の優秀な教師が集まってくるかもしれない。また、多くのサイトでは、デジタルホワイトボードやインタラクティブなテキスト編集など、生徒とチューターが同じ環境にいるかのように感じられるコネクテッドワークスペースを提供しています。
 
特定のコミュニティで利用可能なチューターだけに限定されず、これらのネットワークにはあまりにも多くのチューターが登録されています。つまり、あなたの生徒は、幼稚園児から高校生までの読解力や数学、高度なエンジニアリングや看護など、指導を必要とするあらゆる科目のスペシャリストと数分で対話することができるのです。また、教科の枠を超えて、大学受験や小論文、履歴書の作成、就職面接などのサポートを受けることもできます。こんなに頭を使うことができるのなら、誰だって申し込まないわけにはいきません。
 
 
iProf Evolutionアイプロフ・エボリューション iprofevolution.com
 
一風変わったアプローチのモダンなウェブサイトです。大阪に拠点を置く自然なアプローチの哲学は、東と西の概念を組み合わせ、数学と物理学を理解する全く新しい方法を学生に提供します。利用できる分野は、数学、物理、化学、英語、その他の言語です。
 このコンセプトは、生徒によって推論の筋道や文化的理解が異なるため、学習は誰にとっても同じではあり得ないという事実から生まれました。
教師は、生徒が納得するまでさまざまな方法を試し、学習時間を短縮するよう訓練されています。
 
また、講師はクラスを受講したり、無料のオンラインレッスン（ベータモード）を受講することで、スキルを向上させることができます。料金は1時間あたり18ドルからとなっており、低価格で質の高い家庭教師を探している学生に最適なプラットフォームです。
 
Chegg
 
Cheggは、ライブホワイトボードを使った1時間のオンラインセッションを月額30ドルで提供しており、ユーザーがより利用しやすい料金設定となっています。チューターは、さまざまな学問分野や大学入学手続きなどを教えてくれる。
 
Preply
 
Preplyは、ネイティブスピーカーと一緒に外国語を勉強したり教えたりしたい学生に適したサイトだ。スペイン語、ロシア語、アラビア語、日本語、ヘブライ語、ウルドゥー語など、さまざまな言語に精通した世界中のチューターが在籍している。言語だけでなく、数学、物理、科学など様々なトピックがリンクされています。欠点は、最初の授業料は無料で、その後の授業料は30％以上割引されることです。残念なことに、多くの教師は、給料が極端に割引されるため、それほど長くは続かない。
 
Classgap

preplyと同じアイデアですが、ラテン系の学生に焦点を当てて、様々なクラスを提供します。最初の授業では先生は0ドル、プラットフォームは毎回30％以上の値引きがある。最悪なのは、ホワイトボードがひどく、質の悪い作りになっていることです。先生があなたを助けようとズームミーティングを提案しても、Classgapはあなたの先生をブロックします。多くの良い先生が去っていきました。
 
Revolution
 
レボリューション・プレップの自慢は、講師陣がすべて正社員で構成されていることです。ここにはパートタイマーはいません。しかし、彼らの知識にはお金を払わなければなりません。12時間の個人指導は1,200ドル、12時間の少人数制試験準備セッションは400ドルと、一般の学生にとっては非常に高額です。
トランザクション管理

#トランザクションとは
一連の処理をひとまとめにしたもの。データベースではこれをひとつの単位として処理を管理してる。
#排他制御
データを処理している間に他の人にいじられないようにすること。
これをしないと、同時に処理が起こったときデータに不具合が生じるから。
#デッドロック
複数のトランザクションがそれぞれのロック待ちになってしまう状態。
JavaでAtCoder青色になりました

遭難者です。[ARC115](https://atcoder.jp/contests/arc115)でに青色になったので記事を書くことにしました。![スクリーンショット 2021-03-22 0.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227863/3c819cbc-17b9-34a5-c190-16aa3d0845e3.png)
緑色に4ヶ月程度いたのに水色には1ヶ月もいないのは春休み中毎日競プロと数学しかしていなかったからだと思います。
#自己紹介
現在高専1年の、情報系の学生です。
得意分野は数学とグラフ問題、苦手分野は文字列の操作とデータ構造、DP等です。
学校の授業でJavaを扱っていたということもあり、競プロをJavaで始めました。

#精進量

![スクリーンショット 2021-03-22 1.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227863/eb8cf377-5f5f-f15c-a882-78bd30965589.png)

![スクリーンショット 2021-03-22 1.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227863/89b739a4-e3d8-cee5-0c67-563bfa84f487.png)

![スクリーンショット 2021-03-22 15.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227863/bb760eff-4008-3cbd-8f95-13218a563c49.png)

画像の通りです。

#アドバイス的ななにか
青色になりたい！という人(特にJavaを使っている人向け)へのアドバイスをまとめます。

**クラスを使えるようにする**
ありがたいことにJavaには有志の方々が作ってくださった[ACL for Java](https://github.com/NASU41/AtCoderLibraryForJava)があり、これを貼り付けるだけで様々な機能が使えます。特に高速入出力は全ての問題に使え、実行時間とデータ使用量を大幅に減らせます。私はまだ[ACL for Java](https://github.com/NASU41/AtCoderLibraryForJava)の全てが使えるわけではありませんが、頻繁にコンテストに出るクラスは使えるようにしました。また、クラスを使えるようにするだけでなく、内部でどのようなことをしているのかも理解できるようにしました。内部を理解できるとそのクラスをより快適なものにすることができます。

**他人のコードを読む**
Javaには様々な機能があります(何もJavaに限った話ではありませんが)。例えば任意の $0<i\le n$ を満たす $i$ について $a[i]=i$ を満たす 配列 $a$ を作りたい時、for文を使って

```java
for(int i = 0; i < n; i++){
  a[i] = i;
}
```

という風に書けます。しかし、setAllを使うと

```java
Arrays.setAll(a, i -> i);
```

という風にスッキリと書けます。他人のコードが各行で何をしているのかを覗いてみると意外な成果があるかもしれません。

**早解きを心がける**
コンテストには崖が存在することがよくあります。例えば茶-緑-黄-橙-橙-銅のようなセットの場合、水色程度の実力では2問の勝負になります(3問目以降も解ける人は居ますが)。そういった時に大事になってくるのは如何に早く解けるか、如何にペナを出さないでACできるかになります。早解きは自分より1色以上下の問題を素早く解ける程度にするべきだと思います(1色以上下でも解けないものは解けないので、そういった問題は解説ACをすることをお勧めします)。

**Streakを無理に繋げない**
気が向いていないときに無理に競プロをするのは苦痛になるのでやめたほうがいいです。気分ではない時は休み、気分が乗ったらたくさん問題を解き勉強する、といった感じで競プロを楽しむことが一番です。



#Javaのメリット
**多倍長整数が使える**
AtCoderでは多倍長整数が使えないと解けないような問題はまず出ません。しかし、[ABC169-B](https://atcoder.jp/contests/abc169/tasks/abc169_b)のように多倍長整数が使えると実装が楽になる・正攻法が思いつかなくてもなんとかなるケースは少なくないです。

**速い**
速いです。C++ほどではありませんが、それでも速いです。TL2sのところを1990msで通したりするとJavaで良かったなと感じます。

#Javaのデメリット
**JOI本選で使えない**
JOI本選ではCとC++しか使えません。公平性を期すためらしいですが、なんとかなって欲しいものです。パソコン甲子園では使えるのがせめてもの救いです。


#今後の目標
水色になりたい！という思いと共に競技プログラミングを始めたのですが、目標を大幅に超えてしまいました。
青色になったので4つほど目標を立てます。

**黄色になる**
ユーザー解説を書いてみたいからです。実装例にJavaを入れたいです。

**JOI・PCK本選に出場する**
JOIは精進あるのみです。幸い同校の友人が競プロに興味を持ってくれたので、その友人と共にPCK本選を目指していきます。

**苦手分野を克服する**
苦手分野は下手すると茶diffも解けないかもしれません。そういった問題を重点的に解いていくことにします。

**開発に参加する**
情報系の学生とはいえ競プロのスキル単体ではあまり役にたたないと思っているので、競プロのスキルを生かせる方向に持っていきたいです。

以上の4つの目標ですが、今年中には達成したいです。

最後まで読んでいただき、ありがとうございました。
iOSプロジェクトにおけるプルリクエストを出す時の心得

1年以上iOS開発の講師業をしていまして、これまで何人ものソースコードをレビューしました。
その経験からコードの中身をレビューする以前に気をつけてほしいことがかなり共通していたのでまとめてみました。
iOSプロジェクトと書いてますが、ほとんどの内容がどんな開発環境でも共通のものとなっています。
初学者の方はGitHubでプルリクエストを出す前に確認してみてください。


# GitHubにあげたプロジェクトは最初にビルドできるか確認する
Xcodeが管理するファイルを絶対パスで指定していたり、必要なファイルがあがっていなかったりします。
プロジェクトを初めてGitHubにあげたら、一度Githubから落とし直してビルドできることを確認しましょう。

# ファイル名、フォルダ名にスペースや全角文字は絶対に使わない
iOS開発においては問題は起きづらいですが、ファイル名、フォルダ名にスペースがあったり全角文字があったら、サーバー側と連携した時に思わぬバグを産みやすいので絶対にやめましょう。

# ひとつのプルリクエストに複数のissueの対応を混ぜない
issueのA、Bの対応を一緒にやると差分が巨大になりますし、レビュワーがA、Bどっちのための変更なのか把握できず正確なレビューをすることができません。
また、途中で仕様変更がありBだけリリースしないと判断されることもあります。
ひとつひとつプルリクエストは分けましょう。

# issueと関係ない差分を入れない
たった１行でもissueと関係ない変更を入れないようにしましょう。
アプリのver10でバグが報告されて調査を開始したら、ver8では発生しないことが分かったとします。
ver9、ver10でどんな改修をしたのかissueなどを見返して調査していきますが、ここで無関係な変更が１行混ざっていると原因の発覚が遅れてしまいます。

# 変更したら必ず動作確認する
設定１行変更しただけでビルドできなくなることだってありますので必ず動作確認をしましょう。

# レビューしてもらう前にコンフリクトが起きてないか確認する
マージできないものをレビューしてもらってもしょうがないので、レビュー前には必ずチェックしましょう。
プルリクエストを出した時だけではなく、レビューを受けて改修をしている間にマージ先のブランチが変更していることもありますので、常にチェックしましょう。

# レビューしてもらう前に自分で差分を確認する
開発中に書いた`print`や、`SwiftLint`などが警告しているものが残ってないか確認しましょう。
自分が見てもすぐ分かる差分がそのままだと「自分が何を変更したのか把握してない人」と思われ信用を失います。
他人に見てもらう前にまずは自分でレビューをしましょう。

# Xcodeが勝手に変えた差分も含めて、差分の全て「なぜ変えたのか」説明できるようにする
Xcodeが勝手にソースを変えることがよくあります(storyboardとか)
「何か分からないけど勝手に変わったからそのままにした」は通用しません。
Xcodeというツールを選んで使っているのも自分、その変更のプルリクエストを出したのも自分、責任があるのも自分です。
全ての差分に「なぜ変えたのか」説明できるようにしましょう。
gitを使っていればよく分からない差分が出てもいつでも元に戻せます。
分からない差分が出たら調べて余計な差分であれば元に戻しましょう。
UI/UXとは？？

今回はUI/UXについて学習していきます。
Vue.jsでUI部分に少し触れたので、学習してみました。
よくUI/UXデザイナーさんと聞くことがあり、なんだろ？？

#UIとは
ユーザーインターフェース略してUIです！
コンピューターと人間の間にあり情報をやり取りする仕組みになっています。サイトの外観やフォントなどになります。
ボタンを押しやすいようにしたり、フォントをサイトの構造に合わせて設定したりすることですね。
かなりセンスがいることですね😳
サイトを見に来る人とコンピューターをつなぐ役割ってめっちゃ大切やんって思いました！


#UXとは
ユーザーエクスペリエンス略してUXです！
ユーザーがコンピューターを通して、感じる体験です。このサイトを訪れたことによって、どう思ったか、また来たいと思えたかなどですね。
また、商品購入後、商品が早く来た、商品のクオリティが高かったなどもUXに含まれます。
以下にユーザーの目線に立つことができるかが大切なようですね👍

#まとめ
UI/UXこの両者は別物ではなく、相関関係にあると考えられます。
ユーザーのニーズに合わせたUIによって満足と感じればUXも高まりますよね😊
とこんなかんじです。
Windows版vimでコンソール上で呼び出した際にPress ENTER or type command to continue（超初歩的なミス）

## 問題
PowerShellでvimと入力してEnter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347189/b285f31b-6a2c-71f5-25ab-9747af6b3e33.png)
何かキーを押すと問題なく(?)編集自体はできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347189/d1cba5b1-4b16-37ae-e012-15c8df781a18.png)
## 原因
システム環境変数Pathを下記で通していた
>C:\Software64\vim81-kaoriya\vim.exe

vim内で
>:echo $VIM

を叩いた時に別のアプリ付属のvimを呼んでいたところから判明
## 対策
システム環境変数Pathを
>C:\Software64\vim81-kaoriya

と修正し、表題のメッセージが表示されないこととvim内でもパスが合っていることを確認
Apache2 の PHP で virtual を使う (ファイル書き込み)

こちらのファイルを改造して、ファイルの書き込みをするようにしました。
[Apache2 の PHP で virtual を使う](https://qiita.com/ekzemplaro/items/8e7fa417cc1e86a0ee38)

次のフォルダーに書き込みます。
>/var/log/apache2/php
>/var/log/apache2/perl

```php:test_virtual.php
<?php
// ------------------------------------------------------------------
//	test_virtual.php
// ------------------------------------------------------------------
// fputs ('STDERR',"*** start ***\n");
// fputs (STDERR,"*** aaa ***\n");
$fp_out = fopen('/var/log/apache2/php/php_aa.log', 'w');
fputs ($fp_out,"*** test_virtual.php *** start ***\n");
fputs ($fp_out,"*** bbb ***\n");
fputs ($fp_out,"*** ccc ***\n");
fputs ($fp_out,"*** ddd ***\n");
fputs ($fp_out,"*** Mar/22/2021 PM 17:09 ***\n");
fputs ($fp_out,"*** test_virtual.php *** end ***\n");
fclose ($fp_out);

echo '<!DOCTYPE html>';
echo '<html  lang="ja">';
echo "<head>";
echo '<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />';
echo "<title>virtual</title>";
echo "</head>";
echo "<body>";
echo "<h2>test_virtual.php</h2>";
echo exec('whoami');
echo "<p></p>";
echo "<p>Mar/22/2021 PM 15:30</p>";
echo "</body>";
echo "</html>";
?>
```

```perl:test_script.pl
#! /usr/bin/perl
#
#	test_script.pl
#
print STDERR "*** test_script.pl *** start ***\n";
print STDERR "*** Mar/22/2021 PM 15:38 ***\n";
#
print "Content-type: text/html; charset=utf-8\n\n";
print "*** test_script.pl ***<br />\n";
print "Hello<br />\n";
print "Good Morning<br />\n";
print "Mar/22/2021 PM 15:59<br />\n";
print "<p></p>\n";
#
#
$file_out = "/var/log/apache2/perl/perl_aa.txt";
open (OUT,">$file_out");
binmode OUT, ":encoding(UTF-8)";
print OUT "*** test_script.pl *** start ***\n";
print OUT "*** test ***\n";
print OUT "*** Mar/22/2021 PM 17:13  ***\n";
print OUT "*** test_script.pl *** end ***\n";
close (OUT);
#
print STDERR "*** test_script.pl *** end ***\n";
#
```
【AWS】AWS Managed Microsoft ADのパスワードポリシーに要注意

#はじめに
結論から申し上げますと、AWS Managed Microsoft ADのデフォルトのドメインポリシーパスワード有効期間が42日間となっております（※2021/03/22時点）。
つまり、デフォルトのドメインポリシーで42日間以内に一回もパスワードを変更しない場合は、AWS Managed Microsoft ADのパスワードが失効になってしまいます。
もしAWS Managed Microsoft ADをほかのAWSサービス（例えばFSx）と繋いて構成を組んでいる場合は、デフォルトのドメインポリシーで42日間に一回もAWS Managed Microsoft ADのパスワードを変更しない場合は、そのサービスが42日後に接続できなくなりますので、要注意です。

#AWS Managed Microsoft ADパスワードポリシー
下記AWS公式サイト上で記載されているパスワードポリシーを引用します。
>AWS Managed Microsoft AD では、AWS Managed Microsoft AD ドメインで管理するユーザーのグループ別に異なるきめ細かいパスワードおよびアカウントロックアウトのポリシー (「きめ細かいパスワードポリシー」とも呼ばれる) を定義して割り当てることができます。AWS Microsoft AD ディレクトリを作成すると、デフォルトのドメインポリシーが作成され、ディレクトリに適用されます。このポリシーには、以下の設定が含まれます。

|ポリシー            | 設定 |
|:------------------|:------------------|
|パスワードの履歴を記録する|24 個のパスワードを記憶|
|最大のパスワード有効期間|42 日間 *|
|最小のパスワード有効期間|1 日|
|パスワードの最小長|7 文字|
|パスワードは複雑さの要件を満たす必要がある|有効|
|元に戻せる暗号化を使用してパスワードを保存|Disabled|
* 注意: 42 日間の最大パスワード有効期間は管理者パスワードにも適用されます。

出典URL：https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/ms_ad_password_policies.html


#実際に遭ったこと
Amazon FSx for Windowsを使用するために、AWS Managed Microsoft ADが構成要件となっています。私はAWS Managed Microsoft ADとAmazon FSx for Windowsを合わせて利用しています。

当初はAWS Managed Microsoft ADのパスワード有効期間があることを知らずに、構築後にそのままFSxとの接続をしていましたが、42日間経った後に、EC2からFSxへの接続が出来なくなっている事象が発生しました。
![1112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/4216f275-03c4-7bef-75fa-0c4e5d94a6d8.png)
上記は当初EC2からFSxへ接続する際に、AD認証側で「パスワード有効期間が切れています」というエラーメッセージが表示されています。

#対応策
MicrosoftのActive Directoryページを見てみると、GPOでは0日指定で無効化も可能です。
>You can set passwords to expire after a number of days between 1 and 999, or you can specify that passwords never expire by setting the number of days to 0

ただしベストプラクティスには30~90日の変更がお勧められています。
>Set Maximum password age to a value between 30 and 90 days, depending on your environment. This way, an attacker has a limited amount of time in which to compromise a user's password and have access to your network resources.

出典URL：
https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/maximum-password-age

運用面とセキュリティリスク対応の観点から、基本的にはAWS Managed Microsoft AD有効期間を設け日数に設定するのが一番良いです。
ただし、運用面の効率化の観点のアイデアとしては、パスワード更新のPowerShellもしくはAWS CLIによるスクリプトの自動化が挙げられます。
個人はスクリプトによるパスワード自動更新を選択しました。

#パスワード自動更新スクリプト
当時書いたスクリプトは下記となります。

```
@echo off
cls& color 0a & title パスワード設定　Made By HYJ 2020/08/28
rem ------AD password change script-------
powershell -NoProfile -ExecutionPolicy Unrestricted -Command "& { Reset-DSUserPassword -UserName <AWS Managed Microsoft ADで設定されたユーザー> -DirectoryId ＜AWS Managed Microsoft ADのディレクトリ ID＞ -NewPassword ＜ここにパスワードを入力＞ }"
```
書いたスクリプトをEC2(Windows)に格納し、CloudWatch Events + AWS Systems Managerで一ヶ月に一回定期実行するように設定しました。（後日当方法を公開します）
またWindowsのタスクスケジューラに登録しても実行ができますので、どちらかを選択していただければと思います。

ちなみに公式サイト上に載せている参考URLをシェアします：https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/ms_ad_manage_users_groups_reset_password.html

#感想
Microsoft ADまわりと関わってくると、必要とされる考慮事項をしっかりと事前に調査しておく必要があります。今回はいい勉強になりました。
Rails API 設定

# [API 設定方法]
通常のrails newコマンドの末尾に--apiをつけることでAPIモードでアプリを作成することができる。
(APIに必要ない部分をデフォルトで作成しなくなる。)

# --apiをつけない場合

config/application.rbのApplicationクラス定義の冒頭に、次を追加します。

```css
config.api_only = true
```

app/controllers/application_controller.rbの以下のコードを置き換えます。

```css
class ApplicationController < ActionController::Base
end
```
上を以下に変更します。

```css
class ApplicationController < ActionController::API
end
```
# routing分割方法
rails6.1からroutes.rbのファイルを複数に分けることができるようになった。

- ファイル分割する際のディレクトリ構成


```config
  ├─ routes.rb
  │
  └─ routes/ #ここに分割したroutesファイルを格納
     ├─ api.rb
     └─ admin.rb
```


-  routes.rbの記載を変更

 draw(:読み込みたいファイル名)

```config
 Rails.application.routes.draw do

  draw(:api) #別ファイルのルーティングを読み込む
  draw(:admmin) #別ファイルのルーティングを読み込む
end
```
-  routesディレクトリ&外部ファイルの作成

 以下のディレクトリ構成になるようにroutesディレクトリと外部ファイルを作成します。

```config
config
  ├─ routes.rb
  │
  └─ routes/ #このディレクトリを作成
      ├─ api.rb    #外部ファイルを作成
      └─ admin.rb  #外部ファイルを作成
```
リモートワークでチームワークと作業効率がグーンと上がった話

#はじめに
リモートワークに移行したものの作業効率が前より落ちちゃったなぁなんて思うことありませんでしょうか？

自分のチームは管理チームと実施チームでそれぞれ働いているオフィスが別々の場所だったので最初からコミュニケーションにどこか壁があったんですよね
そんな中で始まったリモートワークも不安しかなかったのですが、
どうやってチームを良い方向にもっていったのかをお話させて頂きます！

#リモートワークだからこそコミュニケーションが重要
リモートワークを始めてから1日無言だった、業務連絡だけで雑談してない、チャットのみで仕事している、在籍しているチームでこんな状況になっていませんでしょうか？
個人的にこんな状況はよくないと思っています(精神的にもよくなさそうですよね...)
そういうことも含くめてコミュニケーションって本当に大事なんです！

そんなの知ってるよって思うかもしれないですが、知っているのと出来ているのでは全く違います
自分のチームでは発言しやすい環境をつくるため管理者のほうから積極的に話を振ったり、忙しくてもフランクに接したりなどを心掛けてきました、すると以前よりチーム全員が発言をしてくれるようになり自然とコミュニケーションが生まれるようになってきました。

#コミュニケーションが生まれるようになってから
まず管理者と、設計者が増えました！
どうして？って思うかもしれないですが、これもコミュニケーションが増えたことによる副産物で、
会話の中で管理や設計に興味がある旨の話がちょくちょく出たのでその中から数人をピックアップして管理、設計をやってもらっています！
(リモートワークでの育成は難しいと思うかもしれないですが、いまは画面共有などすぐできるので全然難しくなかったです)

次に、チームの抱えている問題点の洗い出しと改善への取り組みの流れがスピーディーにできるようになりました！
これについてはチームの人が提案してくれて実施できているので成長を感じました:sob:

ただ、下記のように良い事もあれば逆に良くなかった事もありました。(そんなに気にならないですが)

* メリット
    * オフィスの縛りが無くなった
    * 口頭での会話が増えた
    * チームの抱えている些細な問題などの解決が早くなった
    * 設計者や管理者を増やすことができた
    * 通勤のストレスがなくなってのびのび仕事が出来るようになった
* デメリット
    * 端末など特定の人が持つことになるのでその配慮が少し大変
    * 自宅の環境による仕事のやりづらさがある場合がある(家庭環境やWi-Fiなど)

#やっぱりコミュニケーションが本当に大事だった！
リモートワークをして本当に実感しました！
管理者によってチームの運営方針はバラバラだと思います
ただメンバーもたくさん頑張っているので忙しいからといって態度や声色に出したり、雑に対応したりするとチームの雰囲気がどんどん悪くなってしまいます。優しくしろという訳ではないのですがメンバー1人1人を大事にしましょう:relieved:

それでは皆様よきリモートワークライフをお送りください！
<br>
# We are recruiting !
株式会社GENZでは現在キャリア採用を行っております。
ご興味がある方は以下をご確認ください！
[株式会社GENZ - 採用情報]
 (https://www.genz.jp/recruit/?qirecruit=20210323)
[株式会社GENZ - ブログ]
 (https://www.vamp.jp/?qi=20210323)
未経験がインフラエンジニアに転職した話

#はじめに
営業事務と営業の経験しかなかったわたしが、インフラエンジニアに転職した経緯についてお話ししたいと思います！
同じ文系出身で未経験だけど、エンジニアに転職したいなという方達の参考になれば嬉しいです。

**簡単な自己紹介**

* 四年制大学出身。数学嫌いなゴリゴリの文系。
* 今回で2回目の転職。<br>1社目は太陽光発電の会社の営業で、2社目はSIerで営業事務と営業（共に派遣社員）だった。
* IT企業で仕事したことがあるとはいえ、転職前のIT知識はITパスポート程度だった。<br>ネットワークや工数については少しかじったくらい。（2社目での営業経験はたった8ヶ月で、営業事務のときはIT知識なくても特に支障がなかった）

**エンジニアになりたい！と決意した経緯**

* やっぱり派遣社員ではなく、正社員として働きたかったから。営業は挑戦してみたものの向いてなかったので、エンジニアがいいと思った。
* キャリアアップに必要な努力が明確で分かりやすい職業だと思った。
* 前職で尊敬している人がエンジニアだった。

**なぜインフラを選んだのか？**

* 前職の業務がインフラ寄りで、特にネットワークが身近だったから。
* 理系脳ではないわたしに、プログラマーは絶対向いてないと思った。

#転職活動中に行ったこと
わたしの場合、退職してから転職活動を行っていました。
期間は4ヶ月ほどで、昨年の緊急事態宣言中というのもあって思ったよりだいぶ長引きました。。
本当は在職中に転職活動をしたかったのですが、仕事しながらエンジニアになるためのスクールに通うのがとてもハードだったので、泣く泣く断念しました。

転職活動中は以下のことを行いました！
>１．通っていたスクールで簡単なWebサーバ & ネットワークの構築を経験
>２．ネットワークをメインにITインフラについて勉強
>３．スクールで転職支援を受けつつ、転職サイトも利用した

わたしは転職サイトで応募した企業から内定を頂いて、コロナ禍でも無事就職することができました。

#プログラミングスクールってどうなの？
必要最低限の技術を知っておくという面では、通って良かったなと思いました。
というのも、Webサーバの構築やCisco ルータの実機への設定を経験できたからです。
OSのインストール方法も、GNS3というソフトを使ってネットワークの勉強ができるというのも、そのとき知りました。
それらの経験は入社後の研修でしっかり活かせたので、研修課題をスムーズにこなすことができました。
とはいえ、事前にある程度IT知識の勉強はしておかないと辛いと思います。
同じタイミングで入学した人が気付いたらいなくなってるということが何度かありましたし。。

一方で、転職支援の面ではうーんってかんじです。
スクール側が数打てばあたる方式で何十社にも応募し、書類選考が通り次第、次の選考を受けないとならないからです。それが自分にとってイマイチだと思う企業でもです。
また、わたしの場合は「メンターさんいい人なんだけど、こっちから都度連絡しないと現状のこと教えてくれない～！」ということもありました笑
サービスの質はスクールによって様々だとは思いますが。
わたしは実際に通ってみて、わざわざ高いお金を払うほどではないかなと感じました。

#入社した会社と今の業務
わたしはエンジニアの派遣事業を行っている会社に入社しました。
未経験エンジニアといえばSESだな！と考えていたので、客先に派遣もしくは準委任契約で技術者を提供する会社を探してましたね。
入社した会社は従業員数でいうと少ないですが、面倒見のいい人が多くて技術のこともキャリアのことも相談しやすい環境があります。

また、配属先として二次請けを行っている会社に常駐することになりました。
念願の設計～構築を行うネットワークエンジニアとしてです。
転職活動中、「未経験は構築以降に携わるのはかなり厳しい」と何度も言われましたが、営業さんたちのおかげで希望を叶えることができました。
本当に感謝です。
現在は、直属の先輩のもとで指導を受けながら各案件に励んでいます。

#さいごに
今まで話したことをまとめると、

* 文系の未経験者でもエンジニアになれる
* プログラミングスクールは、技術取得するための入門としてはいいかもしれないが、転職支援の面では微妙かも
* 未経験でも、希望の業務に配属されることもある

です。（ちょっと適当だったかな。。）

最後まで読んでいただき、ありがとうございました！
安易にPHPのバージョンを上げたら色々ハマった（TwitterOAuth編）

#はじめに
自分の忘備録で記事を書いております。技術的に至らない点多々ありますがご容赦下さい。

#今回の記事
前回の記事
安易にPHPのバージョンを上げたら色々ハマった（imagick編）
https://qiita.com/cafe-capitola/items/4c9ba9faad997b299fd9　
の続き。

今回のテーマは「PHPのバージョン上げたら今まで動いてたTwitterOAuthが動かなくなっちゃった」です。

私はTwitterにて細々とbotを運営しています。
仮面ライダーBLACKクレジットbot( https://twitter.com/black_staffrole )

はい、オタクです。しかも色んな意味で炎上してる番組です。

仕様としては番組の1話から最終話、劇場版2作におけるオープニングとエンディングに表示されるキャスト・スタッフのデータをひたすらタイプしたCSV化したファイルを用意。たまに本家の写植が間違ってるとかありますけど、それを突き詰めるとキリがないのでそのままパンチ。
30分毎にファイル内のデータをランダムに1レコード出力するという非常に単純かつ簡単なものです。
データは合計3000件オーバー。データづくりよりも、Twitter社との「認証キーを下さい」の長文英語メールを5回ぐらいやり取りした方が辛かった。google先生の翻訳機能様様です。

実はあまりにこの番組を取り巻く環境のカオスさに耐え切れなくなり、今年の頭にこっそりと一部処理を追加していますが、その話は今回のテーマに沿わないので割愛します。

我が家にはbot投稿用兼テスト用LAMP環境としてRaspberryPi3+を使用しています。
開発機のPHPは8.0.2。開発機と実行環境のバージョンが違うのもどうかと思い同じバージョンに揃えました。7.0.X→8.0.2にガッとバージョン上げました。
PHPのバージョンをあげたら、
``sudo apt-get install php-curl``
するのを忘れずに。

#ハマった
botはcronによるphpの実行で動かしています。cronで実行が失敗した時には「失敗しましたメール」が飛んでくるようになっています。
…数分後、やってきました失敗メール。

エラー内容を見る限り、どうやら今まで使用してきたTwitterOAuthのライブラリがPHP8系では動かないようです。

#TwitterOAuthの新しいバージョンを落とす
TwitterOAuthの公式ページを見に行くと、自分が当初開発していた頃に比べてあまりにもガラッと変わっていて面食らいました。

Googleで検索をすると、検索上位にGitHubのTwitterOAuthが表示されますが、そこから直でファイルをダウンロードするのは止めましょう。
必要なコンポーネントが含まれていませんので実行時にエラーになります。（やらかした）

公式ページ
https://twitteroauth.com/
を見に行くと、「composer経由で落としてね」とあります。composerってなにぞやと思いつつ、公式ページに行って落としに行きます。

#composerをインストールする必要あり
![yasuda.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1207708/2d0e59bb-8b58-ef51-2039-a5c00c260684.jpeg)

https://getcomposer.org/
若いころの安田顕チックな男性がトップページに出てきます。安田顕が所属しているTEAM NACSにcomposerという演目があるんですが偶然でしょうか。肌の色を見るとマッスルボディは傷つかないを思い起こさせるイラストです。

自分の環境はWindows10なので、Windows InstallerのComposer-Setup.exeを落としてきてインストール。
自分はcomposerをc:\xamppにインストールしました。
composer.pharがあるディレクトリに環境変数pathが通っている事を確認してください。

以上でcomposerのインストールは完了です。

#composerでTwitterOAuthをダウンロード
続いて、composerを使用してTwitterOAuthをダウンロードします。コマンドプロンプトでカレントディレクトリをダウンロードしたいディレクトリに移動します。

ではダウンロードしましょう。TwitterOAuth公式のトップに書いてあるコマンドをそのままコピペして実行。
``composer require abraham/twitteroauth``

ほどなくしてダウンロードが始まります。
自分は一度、この時に「composerなんてものは知らん」とエラーが出ましたが、PCを再起動したら無事にコマンドが実行されました。
![composer_cmd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1207708/a9fba1be-937a-6f23-5255-94d40029df01.jpeg)
ダウンロードが完了した後、カレントディレクトリ内を確認するとファイルとディレクトリが作成されています。
![composer_dir.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1207708/dd425483-c8e6-ec49-b43a-331ce3673d7c.jpeg)

vendorディレクトリの下にautoload.phpがあるのでこのファイルをrequireして、自分の好きなような処理を書きましょう。自分の書いたプログラムのファイルの配置箇所によってrequireするパスは変わるので適時変更してください。（この場合は、カレントディレクトリに自作phpファイルを配置しています。）
``require "vendor/autoload.php";``

最後に、色々と番組に対する思いとか書きたくなりましたが、長くなりそうだしここは技術系のコミュニティなのでそこは我慢します。

では。
AtomicDesignとは法律である

過去、AtomicDesignについて色々質問を受けてきました。

今回は今まで聞かれた質問と、質問に対する自分なりの解答を書いていこうと思います。

フロント周りについてはかなりReact寄りな内容となっております、ご了承ください。

---

> プロトタイピング中にコンポーネント設計がAtomicDesignに沿えれない場合はどうしたら良いですか？

Atomic Designを採択した場合、AtomicDesignに沿ってプロトタイピングを行うのが正解です。

従ってプロトタイプにAtomicDesignを適用しようとしていることが間違っています。

Atomic Designに沿ってコンポーネント設計を行うようにしましょう。

> AtomicDesignって厳格なルールが存在しないですよね？

そんなことはないです、一つ一つの要素にしっかりとしたルールが定まっています。

日本語の情報はかなり間違いや勘違いが目立ちますので、[公式サイト](https://atomicdesign.bradfrost.com/table-of-contents/)をしっかりと読むようにしましょう。

> AtomicDesignに沿ってコンポーネント設計をしづらいのですがどうしたら良いですか？

AtomicDesignが採択しやすいケースとしづらいケースが存在します。

繰り返しになりますが、AtomicDesignを採択する場合AtomicDesignに沿ってコンポーネント設計を行う必要があるがあります。

AtomicDesignを理解した上で何度かプロトタイピングを行えば、自然とAtomicDesignを採択すべきか否かわかるようになってきます。

> AtomicDesignを理解するにはどうしたら良いですか？

まずは[公式サイト](https://atomicdesign.bradfrost.com/table-of-contents/)をしっかりと読みましょう。

実際にプロトタイピングを行うときは、ペーパープロトタイピングから始めることをオススメします。

個人的には小さい要素、つまりAtomsからコンポーネント設計を行うことを意識することが大切だと思っています。

> AtomicDesignのサンプルってないんですか？

[Pattern Lab](https://patternlab.io/)という公式のサンプルがあります。

個人的には[このサンプル](https://demo.patternlab.io/)が一番わかりやすいと思います。

> AtomicDesignってフロントエンドエンジニアは理解しなきゃいけないの？

理解する必要はないです、もちろん理解して損はないと思いますが。

AtomicDesignなどのデザインシステムを理解する必要があるのはWebデザイナーです。

コンポーネント設計をフロントエンドエンジニアが行っている現場は非常に多いですが、それは間違っています。

コンポーネント設計はWebデザイナーが行うべきです。

> AtomicDesignと相性の良いプロトタイピングツールってなに？

もしかしたら自分の知識が古いかもしれないですが、把握している限りでは[Figma](https://www.figma.com/)一択です。

[公式のブログ](https://www.figma.com/blog/creating-atomic-components-in-figma/)でも言及されていますしね。

> TemplatesとPagesの違いがわからないんだけど？

Pagesでデータの取得を行い、取得したデータをTemplatesに流し込むイメージで良いと思います。

外部データとやり取りを行う場所がPagesで、Templates以下は外部データとやり取りを行いません。

あと、Templates以下は動的なデータを持たないです。

[サンプル](https://demo.patternlab.io/)の実装を見てもらえればわかりやすいかと。

> たまにOrganismsで外部データとやり取りしているケースを見かけるけど、あれってどうなの？

AtomicDesign的にはルールに沿えていないため良くないです。

一番上の層で外部とのやり取りを解決しているのがAtomicDesignの良さなので、ちょっともったいないです。

ちょっとくらい手間であっても、外部データとやり取りはPagesで留めるようにしましょう。

経験上そのほうが保守性が高くなるためメリットが大きいです。

> TemplatesとPagesって1対1の関係なの？

ケースバイケースです、そうなる時もありますしそうならない時もあります。

[サンプル](https://demo.patternlab.io/)がわかりやすいです。

> AtomicDesignを採択するメリットってなに？

コンポーネント設計にルールが生まれるのが一番のメリットだと思っています。

むしろルールもなくプロトタイピングを行っているWebデザイナーってとても迷惑です、今すぐやめてもらいたい。

> AtomicDesignを採択するとバケツリレーが発生するのが面倒なんだけど？

4段階か、せいぜい5段階のバケツリレーで済むのがAtomicDesignのメリットです。

下手にバケツリレーを回避しようとすると余計なロジックを組む羽目になるため、むしろ面倒になるケースも多いです。

バケツリレーで済むのなら、それに越したことはないと思うのが個人的な意見です。

ただあまりにデータの受け渡しが多い場合など、そもそもプロトタイプが良くないケースも非常に多いです。

そういう場合はAtomicDesignを導入しないほうが良いですね。

> AtomicDesignとReactって相性どうなの？

決して良いとは言えないです。

AtomicDesignにベタベタに沿って開発を行うことも可能ですが、その場合Reactの一部の機能を殺すことになってしまうのでちょっともったいないです。

多分一番相性が悪いのがTemplates周りなので、うまい具合に折衷案を考えてやる必要があると思います。

> AtomicDesignと相性の良いフロント周りのパッケージってなに？

自分の経験でしかないですが、以下は相性が良いです。

- Next.jsやGatsbyなどStatic Site Generator(SSG)に対応したフレームワーク
- Redux([Presentational and Container Components](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0))
- CSS Modulesやstyled-componentsなど
- storybook(特に相性が良い)

逆に以下は相性がそこまでよくなかったり、悪かったりです。

- create-react-app
- SWR

フォームも組むのが結構難しい印象があります。

---

以上です。

1画面1画面が比較的シンプルかつ、画面数がそこそこ存在するケースで採択しやすいデザインシステムかなと思います。

他にも質問がありましたら随時追記していこうと思います。
flutter firebase

# memo
## podfile修正
1. podinit
2. podfileに使うfirebaseのサービス追加
3. podinstall

※cocoapodsエラー時
- xcodeでxxx.xcconfigの修正
- platform差異
    - podfileのiosバージョン10以上

## ビルド時間
https://firebase.flutter.dev/docs/overview/#improve-ios-build-times
Kubernetes　ReplicaSetを使って同じPodをいくつも立てる

# ReplicaSetを使って同じPodをいくつも立てる

[Introduction to Kubernetes](https://cybozu.github.io/introduction-to-kubernetes/introduction-to-kubernetes.html)のチュートリアルを進めながらメモした内容です。

ReplicaSetを使って同じPodをいくつも立ててみます。

## ReplicaSetのYAML

```nginx-replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
  labels:
    component: nginx
spec:
  replicas: 3 # レプリカ数。この数だけ Pod を立てる
  selector: # ここに指定した条件に一致する Pod をこの ReplicaSet が管理する
    matchLabels:
      component: nginx
  template: # この ReplicaSet が作成する Pod の定義
    metadata:
      labels:
        component: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
```

```
# 現在の Pod の状態を確認
kubectl get pod

# ReplicaSet を作成
kubectl apply -f nginx-replicaset.yaml

# 確認
kubectl get replicaset
kubectl get pod
```

## 消去すると、自動でdeployされる

ReplicaSetは「selector にマッチする Pod の数」が「replicas に指定した数」になるように Pod を自動的にデプロイしたり削除したりするオブジェクトです。


```
# podを消去
kubectl delete pod [pod名]

# 確認
kubectl get pod
```
ターミナルでディレクトリ内の先頭ファイルを開く

## 発端
大量のファイルがあるディレクトリから, なんでもいいから
1個ファイルを覗きたいというときがあります.
例えば機械学習の大量のアノテーションファイルがあるディレクトリで,
なんでもいいから1個覗いてみて形式を見たいとか.
![ls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229552/45fcf639-fb6c-2413-30ef-05ec1dbe85c4.png)
lsして大量に表示されるの嫌ですよね.
![llwc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229552/0dffb369-e747-983a-0496-54ef73fa40e8.png)
ディレクトリの中に17126ものファイルが...
## そんなときのワンライナー
```
$ vim `ls | head -n 1`
```

## コマンドの説明
まず, vimが嫌という人は他のエディタでどうぞ. lessとかでもいいかもしれません.
<br>

```
`コマンド`
```
これで, ``の中身をコマンドとして処理し, 結果を出力させます. これをvimに渡します.

```
ls | head -n 1
```
lsした結果を, headにパイプで渡し, -nオプションで1行だけ抽出します.

もし実行権限がついていて, ファイル名に*がついちゃってるときは

```
$ vim `ls | head -n 1 | sed s/\*//`
```
のようにsedで取り除きましょう. chmodしたほうが早そうですが.

さらに, ディレクトリ内にディレクトリが含まれていて, lsしたら最初にディレクトリが表示されてしまうよってときは

```
$ vim `ls -F | grep -v / | head -n 1`
```
のようにします.
- ls -F : ディレクトリ名に / がつくようになる
- grep -v : ヒットしたもの以外を検索結果に出す

## 結論
こうなると, このコマンドを打ったほうが早いのか直接ファイル名を打ったほうが早いのかわかりませんね.
今回はエディタでしたが, 他のアプリでも使えます.