OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミングを初めて2カ月半で作ったwebアプリ

#記事の概要
私が作成したポートフォリオの解説です。
作った背景から、目的、採用した技術、機能、工夫した点、問題点をまとめた。


#背景
プログラミング知識はなかったが、やる気と語学力が評価され、2019年の8月から11月までの4か月間フィリピンのオフショア開発企業でインターンとして受け入れてもらった。
その時に業務に入る前の研修課題としてphpを使ったwebアプリケーションの作成が命じられ、私はよく使っているtwitterのクローンサイトを作成した。
研修中はローカル環境のみで開発していたのだが、帰国後、自らのポートフォリオの一環として使うためにAWSを使い、本番環境にデプロイした。

#目的
<ul>
<li>開発を通してWEBアプリケーションの動作の仕組みを理解する</li>
<li>要件定義から設計、開発、テストまですべて自分で行うことによってシステムの開発工程を理解する</li>
<li>スケジュール表を事前に作り、スケジュール通りに開発を行えるようなマネジメント能力を養う</li>
<li>わからない点は、積極的にフィリピン人スタッフに質問することで、フィリピン人スタッフとの交流を深める</li>
</ul>


#採用した技術
**言語**　
php5.6(cakephp3)
javascript(jquery)

**CSSフレームワーク**
bootstrap4

**開発環境**
centos6.7
 vagrant

**本番環境**
aws ec2 RDS

**バージョン管理**
git

#主な機能

####ログイン、ユーザー登録機能

ユーザー情報として、初期時にユーザー名、メールアドレス、パスワードの登録が必要。
データベースには、これらに加え、プロフィール画像のパス、アカウント作成、修正した日時、
メールでユーザー登録した場合は、メールアドレスをハッシュ化したもの、
TWITTERでユーザー登録した場合は、ログイントークンを保存している。
![microblog_login-compressor (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568685/1605c8d6-e9f3-2ef8-39b9-de38d6f63988.gif)
<br/>

####投稿機能

画像付きでの投稿、画像なしでの投稿がそれぞれ可能。
![microblog_post-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568685/e856c3f6-e07c-e4ff-dc80-0b7c0fab99ff.gif)

####投稿削除、投稿編集機能
自分の投稿のみ、投稿の削除や投稿編集を行うことが出来る。
![microblog_delete-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568685/fa3acaec-427a-abbc-099a-4bb4af29e946.gif)

####フォロー、アンフォロー機能
他のユーザーをフォローすることが出来る機能。フォローすることによって、そのユーザーの投稿を閲覧することが出来る。
![microblog_follow-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568685/c568ca41-c564-9d90-ba66-e4fe54200838.gif)

####LIKE機能、LIKEカウント機能

一つのポストに対して1人1回までLIKEすることが可能。また、一つのポストに対するLIKEをカウントすることが出来る。

![microblog_like-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568685/c4ada4f9-67ff-52f1-4de0-4db7b4424036.gif)

####コメント付きリツイート機能、コメントなしリツイート機能、リツイートカウント機能
![microblog_retweet-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568685/ed1c217e-5bd3-8506-76d6-c006837ace31.gif)

####ユーザー検索機能、投稿検索機能

![microblog_search-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568685/d1462c2b-7aa8-b556-cd5c-9f42a77d41db.gif)



#工夫した点
1.LIKEボタンとフォロー(アンフォロー)ボタンをjqeuryを用いてajaxを使用した点
　LIKEボタンとフォローボタンは、よく使うため、そのようなボタンを押すたびにロードしていたらユーザーが使いづらいため、ajax処理を用いた。javascriptを使った経験が、あまりなかったので、処理の難易度の割には、時間が掛かった。
2.ユーザー登録時にメール認証のみではなく、twitterを用いたソーシャル認証も行えるようにした点
　メール認証が面倒な人でも、簡単に始められるためにソーシャルログインも取り入れた。ライブラリを用いて実装したので、比較的簡単に実装できた。
3.検索機能でユーザーとポストの検索を同時に行えるようにした点
　はじめは、ユーザーのみの検索しか行っていなかったが、フィリピン人スタッフから「ユーザーとポストを同時に検索したい」と注文を受けたので、同時に検索できるようにした。しかし、GETではなく、POST処理をしてしまっている。
#課題
1.わかりづらいUI
　ユーザー目線での開発を行えなかった。特に、ユーザーがページ移動した後に「戻る」ボタンがないときなど、行き止まりになってしまうような設計がいくつかある。
2.テーブル設計を入念に行うべきだった
　直観的にpostテーブルとretweetテーブルを分けたテーブル設計にしたため、ポスト一覧を時系列順に表示するときに,複雑なSQL処理をする必要が生じてしまった。今後は、開発プロセスを考えながら、テーブル設計を行っていきたい。
3.冗長なコーディング
4.フレームワークの良さをあまり生かせていない
　一回フレームワークを使わずに同様なWEBアプリ開発した後に、フレームワークへの理解を深める目的もかねて本WEBアプリを制作したのだが、フレームワークの良さを十分に生かしたとは言い辛い。
#今後
　1年後くらいに、現在のアプリをリファクタリングしてみて、自分の成長を感じられるようにはなりたい。
Perl で解くAtCoder2次元配列問題

# はじめに
[AtCoder：競技プログラミングコンテストを開催する国内最大のサイト](https://atcoder.jp/home) で、時々次のような問題が出題されます。

```
#...#.#
..#...#
.#..#..
```
[DISCO presents ディスカバリーチャンネル コードコンテスト2020 予選 C - Strawberry Cakes](https://atcoder.jp/contests/ddcc2020-qual/tasks/ddcc2020_qual_c)

```
41 7 46
26 89 2
78 92 8
```
[AtCoder Beginner Contest 157 B - Bingo](https://atcoder.jp/contests/abc157/tasks/abc157_b)

いずれも、2次元配列を使用して解答いたします。

# Perl の配列
Perlの配列は、java の様に簡単に2次元配列が作成できないところがもどかしいです。

```array.java
int a[][] = new int[h][w];
```

リファレンスの使用例も、動的に作成する方法が示されていないように感じます。

```静的なarray.pl
my $a = [
  [ 41,  7, 46 ],
  [ 26, 89,  2 ],
  [ 78, 92,  8 ]
];
print $a->[0][1]; # => 7
$a->[0][1] = 6;
print $a->[0][1]; # => 6
```
# TLEになった手法

```TLE.pl
$s[$i*$w+$j] = 0;
```
C - Strawberry Cakesの時は、配列を1次元配列とし、i行j列にアクセスする際、幅wを掛けてi*w+j番目の要素に取得する方法を取りましたが、TLEになりました。

|実行時間|
|:--:|
|2105 ms|


# ACした手法
ベストな方法かわかりませんが、ACしました。

```B-Bingo.pl
use strict;
use warnings;

my @a;
{
  for (my $i=0; $i<3; $i++) {
    my $in = <STDIN>;
    my @b = split(" ", $in);
    $a[$i] = \@b;
  }
}
my $n = <STDIN>;
chomp $n;
my @b;
{
  for (my $i=0; $i<$n; $i++) {
    my $in = <STDIN>;
    chomp $in;
    $b[$i] = $in;
  }
}
for (my $i=0; $i<3; $i++) {
  for (my $j=0; $j<3; $j++) {
    for (my $k=0; $k<$n; $k++) {
      if ($a[$i][$j] == $b[$k]) {
        $a[$i][$j] = 0;
      }
    }
  }
}
my $ans = "No";
for (my $i=0; $i<3; $i++) {
  if ($a[$i][0]+$a[$i][1]+$a[$i][2]==0) {
    $ans = "Yes";
    last;
  }
  if ($a[0][$i]+$a[1][$i]+$a[2][$i]==0) {
    $ans = "Yes";
    last;
  }
}
if ($a[0][0]+$a[1][1]+$a[2][2]==0) {
    $ans = "Yes";
}
if ($a[0][2]+$a[1][1]+$a[2][0]==0) {
    $ans = "Yes";
}
print "$ans\n";
```
配列をリファレンスで受け取ることにより、それ以降は簡単にアクセスできます。

```dynamic.pl
    $a[$i] = \@b;

    $a[$i][$j] = 0;
```
B - Bingoの実行時間は **4ms**
C - Strawberry Cakesの実行時間も余裕のある時間となっています。

|実行時間|
|:--:|
|155 ms|
# まとめ
+ Perlでの2次元配列問題の手法を確立した


参照したサイト
今回はいいサイト、見つかりませんでした
Methylpyに乗り換えた

#### Bismarkには大変お世話になりました
  
N年前にメチロームの解析を始めて以来ずっとbismark一筋でしたが1サンプル半日とかかかるのにそろそろうんざりしてきました。

#### Methylpyがよいらしい

Methylpy:
>Matthew D. Schultz, Yupeng He, John W.Whitaker, Manoj Hariharan, Eran A. Mukamel, Danny Leung, Nisha Rajagopal, Joseph R. Nery, Mark A. Urich, Huaming Chen, Shin Lin, Yiing Lin, Bing Ren, Terrence J. Sejnowski, Wei Wang, Joseph R. Ecker. Human Body Epigenome Maps Reveal Noncanonical DNA Methylation Variation. Nature. 523(7559):212-216, 2015 Jul.

https://github.com/yupenghe/methylpy

Ecker labから出てるんだね。
river winさんもこれが良いと言っているという風の噂を聞いたので導入してみることにした。

----

#### Install
pipでいけるがconda派なのでcondaでやってみた

```shell

conda install -c bioconda methylpy
```
とくに問題なくインストール完了

####ゲノムのBuild

```sh

methylpy build-reference \
--input-files hoge.fasta \
--output-prefix hoge
```
チュートリアルにある`--bowtie2 True`というオプションはバージョンが変わって無くなりました。

#### トリミング->マッピング->メチル化カウント

```sh

FASTQ=`find *1.fastq.gz`
for int in ${FASTQ[@]}; do
  fastq=`echo "$int" | sed s/_R1.fastq.gz//g`

#trimming
  trimmomatic PE -threads 20 \
  ${fastq}_R1.fastq.gz \
  ${fastq}_R2.fastq.gz \
  ${fastq}_paired_R1.fastq.gz \
  ${fastq}_unpaired_R1.fastq.gz \
  ${fastq}_paired_R2.fastq.gz \
  ${fastq}_unpaired_R2.fastq.gz \
  ILLUMINACLIP:TruSeq3-PE.fa:2:30:10 TRAILING:20 SLIDINGWINDOW:4:15 MINLEN:50 HEADCROP:10
  ref_path=/path/to/ref_fasta/

  #Mapping
  mkdir ./${fastq}_output
  methylpy paired-end-pipeline \
  --read1-files ${fastq}_paired_R1.fastq.gz \
  --read2-files ${fastq}_paired_R2.fastq.gz \
  --sample ${fastq}_BS-seq \
  --forward-ref ${ref_path}hoge_f \
  --reverse-ref ${ref_path}hoge_r \
  --ref-fasta ${ref_path}hoge.fasta \
  --num-procs 20 \
  --trim-reads FALSE \
  --path-to-output ./${fastq}_output

done
```
フォルダにある全てのfastqをそれぞれ`trimmomatic`でトリミングし、メチル化カウントまで一気に処理
個人的な趣味でトリミングには`trimmomatic`を使用。それに伴い`methylpy paired-end-pipeline`では`--trim-reads`は`FALSE`指定にしている。
最終産物として`all-c_hoge.tsv.gz`というファイルが得られる。bismarkでいうところの`cx_report`みたいなやつ
数千万リードがだいたい3時間弱で終わった。速い！

#### Wigファイルの作成

```sh

methylpy allc-to-bigwig \
--allc-file allc_hoge.tsv.gz \
--output-file methylpy_hoge_CG \
--ref-fasta /path/to/ref_fasta/hoge.fasta \
--mc-type CGN \
--bin-size 50

methylpy allc-to-bigwig \
--allc-file allc_hoge.tsv.gz \
--output-file methylpy_hoge_CHG \
--ref-fasta /path/to/ref_fasta/hoge.fasta \
--mc-type CHG \
--bin-size 50

methylpy allc-to-bigwig \
--allc-file allc_hoge.tsv.gz \
--output-file methylpy_hoge_CHH \
--ref-fasta /path/to/ref_fasta/hoge.fasta \
--mc-type CHH \
--bin-size 50
```

`allc-file`: でき上がった`all-c_hoge.tsv.gz`
`--ref-fasta` :リファレンスfasta
`--mc-type` :wigにしたいコンテクストを指定。例えば植物だとCGN, CHG, CHHを三つを上のようにそれぞれ指定してwigファイルを作成する

なにせ速い。もうこっちに切り替えよう。

----
追記
`allc-to-bigwig`を走らせても`wig`ファイルしかできないのでなんでだろうと思っていたが
`wigToBigWig `が正常に走っていないのが原因だった。
libsslをうまく参照できていないのが動かない原因のよう。
`/miniconda3/lib`に移動して以下のようにシムリンクを貼り直す。

```shell
(base) [hoge lib]$ ln -s libssl.so.1.1 libssl.so.1.0.0
(base) [hoge lib]$ ln -s libcrypto.so.1.1 libcrypto.so.1.0.0
```
そうすると正常に動いた。似たような報告があったのでそれを参考した。
https://qiita.com/kohei-108/items/9129ad953b0906e115a6
OpenJtalkを使って日本語をRaspberry Piに喋らせる

#この記事でできること
・OpenJtalkのRaspberry Piにインストール
・実際に"こんにちは"を音声出力
#動作環境
・Raspberry P i3 model B
・OS: Raspbian
#前提
・ラズパイのssh接続で操作できる or ディスプレイで操作可能
・日本語入力が可能
#OpenJtalkのインストール
自分は、[この記事](https://qiita.com/Higemal/items/6dde8637a680bfe200ca)を参考にしてインストールしました。

まずは、以下を実行します

```
sudo apt-get update #アップデートする
sudo apt-get install open-jtalk #インストール
```
次に推奨されているパッケージもインストールします。

```
sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m00
```


##テスト
これでもう音声出力はできます!
OpenJtalkは日本語の音声ファイルを作ってからそれを再生するという順序になっています。
まず、以下で音声ファイルを作ります。

```
echo "こんにちは" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow ~/ojtalk.wav
```
これで同じディレクトリにojtalk.wavという音声ファイルができたと思います。
それでは次に再生します。

```
aplay ~/ojtalk.wav
```

"こんにちは"
と出力されましたか？
####オプションの意味
-x 使う辞書
-m どの声を使うか(男声or女声など)
-ow 出力ファイルを指定

####ノイズが多い時
ちなみにですが、3.5mmのアナログ出力だとノイズが乗ってしまって綺麗に聞こえないことがあります。(自分はそうでした、、、)
その時は、HDMIでディスプレイに接続してディスプレイから出力してみてください。
おそらく回路が原因のノイズは消えます。

####音声ファイル保存せずに出力
今回は、音声ファイルを作ってから出力しましたが、発話させる度に音声ファイルが保存されていくのは少し気持ち悪いという方は、以下で音声ファイルを作らずにできます。

```
echo "こんにちは" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow /dev/stdout | aplay --quiet
```

#女性の音声をダウンロード
[MMDAgent](http://www.mmdagent.jp/)のパッケージを使用します。

まずは以下を実行してダウンロード

```
wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
```
次にそのzipを解凍します

```
unzip ./MMDAgent_Example-1.7.zip
```

そしてフォルダーの中にあるmeiちゃんの音声フォルダーを
/usr/share/hts-voice/のディレクトリー下にコピーします。

```
sudo cp -r ./MMDAgent_Example-1.7/Voice/mei/ /usr/share/hts-voice/
```

これで音響モデルをこれに変えれば女性音声になります。
オプションの -m 音響モデル
に相当する部分ですね。

```
echo "こんにちは”|open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice -ow ~/ojtalk.wav
aplay ~/ojtalk.wav
```
これで女性の音声になったと思います。

#まとめ
今回はOpenJtalkのインストールとそのテストをお届けしました。
次は、APIで取得した情報やweb scrapingしたものを話すプログラムを作っていきたいと思います！
では！
USキーボードのMacからWindows10にリモートデスクトップしてUSキーボードとして使う

# 環境

Mac側:
- macOS Mojave 10.14.6
- Parallels Client 17.1.0
- Karabiner-Elements 12.9.0

Windows側:
- Windows 10 Pro 1909
- YAMY 0.0.3

# 前提

- USキーボードじゃないと仕事できない
- 左右のコマンドキーを英数・かなキーとしてIMEをOFF/ONできないと仕事できない

# 課題

- USキーボードのMacBook ProからWindows10にリモートデスクトップ接続すると，キーボードがJISとして認識される．
  * リモートデスクトップ環境でもUSキーボードとして使いたい
  * 逆の事象 (JISキーボードがUSとして認識される) の記事はたくさん見つかるんですが，こっちの場合の対応についての記事が見つからない
- MacではKarabiner-Elementsを使用して左右のコマンドキーを単体で押したときに，英数・かなキーとしてIMEのOFF/ONをしている
  * リモートデスクトップ環境でもコマンドキーでIMEをOFF/ONしたい

# 解決手段

上記2点をKarabiner-Elementsだけで解決したかったが，できなかったのでWindows側でYAMYを導入して対応した．

## Mac側の設定

Karabiner-Elementsを使用してコマンドキーを単体で押したときに英数・かなキーとして認識させる

<img width="758" alt="Karabiner.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490712/a04b3b1e-c54a-6cd3-3620-bb8ab7c761d2.png">

## Windows側の設定

YAMYで「日本語109キーボード (104風) 」を選択．
ただし，英数・かなキーは109のままとするよう設定ファイル (104on109.mayu) の以下4行をコメントアウト．

```
#def subst    *ひらがな		= *Space
#def subst    *E0ひらがな	= *Space
#def subst    *英数		= S-*英数
#def subst    *E0英数		= S-*英数
```

# 結果

これでリモートデスクトップ接続したWindowsでもUSキーボードとして使用できます．
コマンドキーでIMEの切り替えもできて満足．
Karabiner-Elementsだけでできるよ，という指摘がいただけるのなら大変ありがたいです．
【Bootstrap】アコーディオンが1つの時にレイアウトが崩れた話

#概要
DjangoでWebアプリケーションを作成中、フロントのCSSはBootstrapを使ってデザインしていた。

viewから渡されたリストをループで処理しながらアコーディオンを作成しようとしたら、
リストが1件の時の表示がおかしくなってしまった。

ループが2件以上の時（正常）：
<img width="1047" alt="スクリーンショット 2020-03-05 22.31.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247528/666115aa-e472-1a76-aae0-ca356af18faf.png">

1件の時（下線切れてるし角が丸くない）：
<img width="1046" alt="スクリーンショット 2020-03-05 22.32.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247528/2ba31464-c9f1-8c29-ae7d-12bee3e5c531.png">

ソース：

```html:test.html
<div class="accordion" id="accordion" role="tablist" aria-multiselectable="true">
	{% for l in list %}
	<div class="card">
		<div class="card-header" role="tab" id="heading{{ forloop.counter }}">
			<h5 class="mb-0">
				<a class="text-body d-block p-3 m-n3" data-toggle="collapse" href="#collapse{{ forloop.counter }}" role="button" aria-expanded="true" aria-controls="collapse{{ forloop.counter }}">
					{{ forloop.counter }}
				</a>
			</h5>
		</div>
		<div id="collapse{{ forloop.counter }}" class="collapse" role="tabpanel" aria-labelledby="heading{{ forloop.counter }}" data-parent="#accordion">
			<div class="card-body">
				{{ l }}
			</div>
		</div>
	</div>
	{% endfor %}
</div>
```


#今のところの対処法
リストが1件しかない場合の分岐処理を追加し、CSSのクラスを追加してあげる。


```html:card
<div class="card">
```

↑に

```html:card-border-rounded
<div class="card {% if list|length == 1 %}border rounded{% endif %}">
```

↑という分岐を追加してあげると1件でも綺麗に表示してくれる。

<img width="1043" alt="スクリーンショット 2020-03-05 22.39.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247528/f5b7f56d-5160-d4f4-83aa-ce3db0fabc89.png">

#おわりに
これ解決するのに1〜2時間かけた気がする...

Djangoじゃなくてもリストのサイズがわかれば他の言語/フレームワークでもできると思うし、なんならもっといい方法がある気がする。

誰かBootstrap/CSSに詳しい人いたらもっとスマートな方法教えてください...（涙目）

ちなみに[Bootstrap](https://cccabinet.jpn.org/bootstrap4/components/collapse)公式ドキュメントにあるソースのアイテム2と3を全部消してアイテム1だけ残しても同じ現象が起きるから、アコーディオンが1個だけなんて使い方は想定してないんじゃないかなぁ...と勝手に思ったり。
VSCodeでコードをAND検索

VSCodeのコード検索機能で正規表現を利用することができます。

これを利用して「AかつBが含まれるコード」を探すことができます。

## 手順

1.検索ボックスの`.*`と表示されているボタンをオンにして正規表現を有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/70459c6d-e7e7-8748-1db8-d5946ffd07ba.png)

2.検索したい文字列の間に`.+?`を挟みます。（例: `import AND axios` → `import.+?axios`）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/be5f89e6-bbef-9cd5-1de4-81d5b5d75981.png)

## 欠点

入れ替えに対応していないです。

## まとめ

`(A | B)`とかで上手く欠点を補える方法などありましたら、教えてください:pray:
laravel vue 

```
<template>
    <div class="container">
　　　　　<!-- v-modelで変数と入力値を同期させる -->
        <input v-model="condition" class="form-control filter" type="text" placeholder="filter">
        <div class="list-group">
            <!-- v-forで条件に合致したタスクを繰り返し表示する -->
            <div v-for="task in matched" :key="task.id"
                 class="list-group-item list-group-item-action flex-column align-items-start">
                <div class="d-flex w-100 justify-content-between">
                    <h5 class="mb-1">{{ task.title }}</h5>
                    <small class="text-muted">{{ task.created_at }}</small>
                </div>
                <p class="mb-1">{{ task.content }}</p>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        name: "TasksComponents.vue",
        data: function () {
            return {
                condition: null, //フィルタ条件
                tasks: [] //タスクの配列
            }
        },
        created() {
            //インスタンス生成時にapiからタスク一覧を取得して変数に格納
            axios.get('/api/task').then(response => {
                this.tasks = response.data
            })
        },
        computed: {
            matched: function () {
                //conditionの値が変更されると自動的に呼び出される
                return this.tasks.filter(function (element) {
                    //タイトルにcondionの値を含むものでフィルタ
                    return !this.condition || element.title.indexOf(this.condition) !== -1
                }, this)
            }
        }
    }
</script>

<style scoped>
    .filter {
        margin: 1em 0em;
    }
</style>
```
vue getters

-----
<script>
const store = new Vuex.Store({
  state: {
    items: [
      { name: 'itemA', price: 1500 },
      { name: 'itemB', price: 700 },
      { name: 'itemC', price: 2000 },
      { name: 'itemD', price: 300 },
      { name: 'itemE', price: 5000 }
    ]
  },  // ←カンマの入れ忘れ注意！
 
  // ここから追加
  getters: {
    getItems: state => {
      return state.items.filter(item => item.price >= 1000)
    }
  }
  // ここまで追加
})
</script>

------

import { mapState } from 'vuex'  // #1 ヘルパーをインポートする
 
export default {
  // #2 算出プロパティを宣言する
  computed: mapState({
    loginAlias: 'login',  // loginAlias: state => state.loginと同義
    deviceAlias: 'device' // deviceAlias: state => state.deviceと同義
  })
}
Xcode10から11にあげたらBitriseでbuildできなくなった。

# この記事の解決方法の対象
- iOS13対応を終えてBitriseのbuild環境をXcode10からXcode11にあげた
- Mac Catalystは対応しない
- xcodebuildコマンドで以下のエラーが出る

```
xcodebuild: error: Failed to build workspace "workspace_name" with scheme "scheme_name".
Reason: The run destination My Mac is not valid for Archiving the scheme "scheme_name".
```

# 原因
Xcode11からの追加機能の[Mac Catalyst](https://developer.apple.com/jp/mac-catalyst/)のBuild Settingsのフラグを未設定だったためBuild Deviceが**My Mac**に設定されてしまったことが原因です。

# 解決方法
Build Settingsで`Support Mac Catalyst = NO`を設定をします。
（未設定の場合、検索して開くだけで設定値が入ります）

Build Settings > Mac Catalyst - Deployment > Setting > Support Mac Catalyst
<img width="871" alt="スクリーンショット 2020-03-05 22.28.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103494/b74822fb-628d-3780-96b7-e43de8f1a207.png">

# あとがき
プロジェクトでは関係ない機能や要素の追加でもBuild Settingsの変更は大きな影響があることがあるので気をつけないといけないなと、久々に時間も使ってしまったこともあり同じトラブルにあった方の助けになれば！
Jasmine, fixture.debugElement.nativeElement.querySelectorで要素が取得できないよ！！！

Jasmine 3.3

Angular Jasmineでハマったポイント
もしかしたらng-ifとかで、画面の表示をガッツリ切り替えてないですか？
（ローディング等）

とりあえずfixture.debugElement.nativeElementを表示してみて、そこに目的の要素がなければquerySelectorで何しようと取れません。

必要あれば、ngifをクリアできる様にcomponentのパラメータをいじりましょう

```html:test.component.html
<app-loading *ngIf='isLoading'></app-loading>
<div *ngIf='!isLoading'>
  <!--
    ここにほしい要素
  -->
</div>
```

蛇足ですが、fixture.detectChanges();を忘れずに

蛇足2
もしテンプレートの要素を取得したい場合、
下記二つは同じ(inputの要素をnameでとる場合)

```javascript:test.component.spec.ts
let element = fixture.debugElement.nativeElement.querySelector('input[name=approveAmount]');
let element = fixture.debugElement.query(By.css('[name=approveAmount]')).nativeElement as HTMLInputElement;

//あとは入力して、dispatchすれば反映されるよ！
element.value = something;
element.dispatchEvent(new Event('input'))
```
deviseのcontrollerをインストールしていない場合は、ログイン後のユーザー作成は出来ないよって話。

自分用メモ
macOS Catalina 10.15.3
ruby 2.6.3
rails 5.2.4

ログイン機能なしの作業報告用アプリを作成。

ユーザーを作成して、devise後付けでだが、deviseのcontrollerは無し。（インストールしなくても裏で作動する）
deviseのmodelとviewはインストール。

deviseのcontrollerをインストールしていない場合は、ログイン後のユーザー作成は出来ない。

と言うか、社内用を想定してのアプリだから、

ユーザー登録＝ユーザー作成

よって新規ユーザー作成のリンクは削除。

どうしても作成したい場合は、ログインする前のログイン画面にリンクを持ってくる。

している場合は、こちらを参照（管理者権限でユーザー作成）

https://qiita.com/MasatoYoshioka@github/items/7de96ac05bc0c17b7535
WinActor ノードとライブラリの違い

WinActorの基本をメモ✨✨

アプリの操作を行うための「コマンド」にあたるものは「ノード」タブと「ライブラリ」タブの中の項目の2か所に配置されているんだけど、これらは何が違うの？ということにボクも最初迷ったので、メモしておくよ😘✨
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/2eb3932f-c75c-4b5d-585f-22ce8b173a63.png)

# 「ノード」とは
「ノード」タブに配置されている31個の基本動作のことを指すようだよ😚😄 内容自体はわりと基本的なことに限定されているんだよ😣😥👎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/df37e3bc-3a13-764c-ce6a-76edb08ccb79.png)

# 「ライブラリ」内のノードとは
一方、「ライブラリ」タブの中にもたくさんのノードが配置されていて、同じようなものも並んでいるものがあるよ😘✨✨たとえば「Excel操作」は通常のノードにもライブラリ内にもあるんだけど、どっちを使えばいいのか迷うよね🤔🤔🤔
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/70248419-2cd2-a716-ec9f-3111fd062a08.png)

[7.xのライブラリ一覧はこちらをみてね](https://qiita.com/KamiyaMT/items/9de1c19677b9d40b87cd)
[6.xのライブラリ一覧はこちらをみてね](https://qiita.com/KamiyaMT/items/336d21ac2fbc559f23ff)
[5.xのライブラリ一覧はこちらをみてね](https://qiita.com/KamiyaMT/items/2da0e23e25bf29d904ac)

# ライブラリは「スクリプト実行」の集まり
実はライブラリ内のノードは、すべて「スクリプト実行」というノードだよ。この中に、VBScriptで書かれたさまざまなスクリプト (プログラム)が入っていて、基本動作以上のことができるように書かれているんだ😘✨

たとえば通常のノードの「Excel操作」とほぼ同じ動きをする**「Excel操作(アクティブセから指定位置の値取得)」**はVBScriptで書かれているよ😚😄 ダブルクリックするとウィンドウが開いて詳細が見られるよ😘✨
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/3efd1527-d87d-fe39-a776-260a0d0e48c8.png)

スクリプトタブにはVBScriptが書かれているよ😘✨ スクリプトは書き換えることで動作のカスタマイズができるけど、それなりのプログラミングの知識がいるのと、デバッグ機能がないから結構大変な作業になりそう...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/580ef2b7-fffc-d662-ef6c-4876a6f611eb.png)

注釈も参考になる情報が書かれているので、参考にしてね👻👻
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500776/06179a48-3776-84b1-bf1c-90303ae9b350.png)

✨✨✨**「ノード」と「ライブラリ」内のノードに似たようなものがある場合は、「ライブラリ」の方が高機能であることが多く、こちらを使うのがおススメだよ**✨✨✨✨
PIC16F648AでPWMを使う方法

# はじめに
この記事はPWMをどのようにすれば制御できるかではなく、こう書いたらPIC16F648AでPWMができた、ということを紹介する記事です。これが正解である保証は一切ありません。
僕はPIC初心者なのですが、PIC16F648AでPWMをやっている例が見つからず、いろいろなサイトでそれぞれ書いていることが違ったのでその中から自分がやってうまくいったプログラムを紹介します。
# 環境
- macOS 10.15.3
- MPLAB X IDE v5.35
- XC8 v2.10

# プログラム

```c:main.c


// PIC16F648A Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 4000000

void main(void) {
    TRISB = 0;
    
    CCP1CON = 0b00001100;
    PR2 = 255;
    T2CON = 0b00000100;
    
    while(!TMR2IF);
    
    while(1) {
        CCPR1L = 0;
        // 0%
        __delay_ms(1000);
        
        CCPR1L = 0b00011001;
        // 10%
        __delay_ms(1000);
        
        CCPR1L = 0b00110011;
        // 20%
        __delay_ms(1000);
        
        CCPR1L = 0b01001100;
        // 30%
        __delay_ms(1000);
        
        CCPR1L = 0b1100110;
        // 40%
        __delay_ms(1000);
        
        CCPR1L = 0b10000000;
        // 50%
        __delay_ms(1000);
        
        CCPR1L = 0b10011001;
        // 60%
        __delay_ms(1000);
        
        CCPR1L = 0b10110011;
        // 70%
        __delay_ms(1000);
        
        CCPR1L = 0b11001100;
        // 80%
        __delay_ms(1000);
    }
    return;
}
```

# 解説
プログラムの解説というよりはどのようにしてこのプログラムに至ったかという紹介です。
最初の`#pragma`の部分は「Configration Bits」で生成しました。

[ツール・ラボの記事](https://tool-lab.com/pic-basic-21/)に使い方が書いてあります。

PWM制御部分は
[本だけ持っての記事](http://kotanero.naganoblog.jp/e1140257.html)でPICでのPWMの制御方法の概要をなんとなく頭に入れ、
[meideru blogの記事](https://meideru.com/archives/1649)のプログラムを少し改変して使いました。

# 最後に
「ツール・ラボ」、「本だけを持って」、「meideru blog」の記事を書いてくださった方、ありがとうございました。
もしこの記事を読んでくださった方で間違いや改善点を見つけた方はコメントや編集リクエストで教えてください。
ありがとうございました。
dockerでpythonを使う

```
docker pull python
docker run -v C:/:/data --name python -it python /bin/bash
#GPU版
docker run -v $PWD:/working --gpus all --name python -it python:3.8  /bin/bash

#windows用
docker run -v C:/:/working --net host --workdir /working --shm-size=8gb --name python -it python:3.8  /bin/bash

```

```
docker run -v $PWD:/working -e DISPLAY=$DISPLAY --net host --gpus all --workdir /working --shm-size=8gb --name python -it python:3.8  /bin/bash
```

`-v` ホストにマウントする。
`-e` 環境変数を設定する。
`--net` コンテナをネットワークにつなげる
`--gpus` コンテナにgpuを追加
`--name` コンテナに名前を付ける
`-i` インタラプタモード
`-t` 疑似ttyを割り当てる
`python:buster` python 3.8.3
`bin/bash` 使うshell
`shm-size` 共有メモリ





参考
https://kamino.hatenablog.com/entry/docker_gui
https://qiita.com/chroju/items/ce9cae248cc016745c66
https://docs.docker.com/engine/reference/commandline/run/
さくらエディタでなでしこさんを使いたい！　その３、キーワードヘルプと入力補完

# おさらい
　前回は、強調キーワードと正規表現キーワードを設定して、なでしこ用のシンタックスハイライトが出来るようになりました。
　ある種、私の当初の目標はクリア出来たのですが、折角なので、その他の定義ファイルも作成して、より便利で快適ななでしこ生活を目指します。

# アウトライン解析ルールファイル
　「.rul」「.rule」という拡張子のファイルが、アウトライン解析用のルールファイルのようです。

- [タイプ別設定 『スクリーン』プロパティ](https://sakura-editor.github.io/help/HLP000074.html)

```
(見出し文字列) /// (グループ名)
```

　基本的にはこんな単純な書式で、正規表現モードを使ってあれやこれやすると色々高度なことも出来るのでしょうが、とりあえず「● /// 関数」と登録するだけで、nakopadの「関数一覧を列挙」のように使用出来るようです。
　個人的に全角「＃」のコメントを、マークダウンのように見出しにすることにしてみます。（半角「#」は、普通にコメントとして多用するので）
　前回、特に全角「＃」を選んで、正規表現キーワードで対応する方に回したのは、見出しとして色を変えて表示することも出来るように、だったんですねー。結局、普通にコメント色にしてますけれどねｗ

```
//なでしこv3　アウトライン解析 ルールファイル
＃＃＃＃＃＃ /// 見出し,Lv=6
＃＃＃＃＃ /// 見出し,Lv=5
＃＃＃＃ /// 見出し,Lv=4
＃＃＃ /// 見出し,Lv=3
＃＃ /// 見出し,Lv=2
＃ /// 見出し,Lv=1
● /// 関数,Lv=7
```

- タイプ別設定 ＞ スクリーン ＞ ルールファイルにチェックを入れてファイル選択。

　これが、実際に使ってみると、予想以上に良きです☆
　ちゃんとツリー表示されて、そこにジャンプ出来るんですよ♪

# 入力補完機能

- [入力補完機能](https://sakura-editor.github.io/help/HLP000104.html)
- [タイプ別設定 『支援』プロパティ](https://sakura-editor.github.io/help/HLP000197.html)

　別途補完用の単語ファイルも登録出来るようなのですが、強調キーワードが利用出来るようなので、命令も強調キーワードに入れてみます。
　450行もあるので、ここには掲載しませんが、命令の一覧は、[ここ](https://nadesi.com/v3/)の**command.json**から命令のトコを抜いただけのものです。各バージョンの命令文がジェイソンさんになっているので、大助かりです。
　前回の時と同様に設定し、ばっきり色が付くとさすがにうるさいので、ありかなしかくらいにうっすらと色づけしますｗ
　そして、

- タイプ別設定 ＞ 支援 ＞ 強調キーワードにチェック。

　これで、例えば「DOM」などと入れて「ctrl+スペース」で、DOMなんちゃらというDOMを扱う命令がずらっと候補に出てきて、選んで入力出来るようになるんです！（喜）
　ひとまずブラウザ版もコンソール版も一緒くたに１ファイルにしてしまいましたが、使ってみて塩梅式が悪いようなら分割するかもです。使えない命令が一緒に候補に上がってきてしまうと、邪魔くさいかも知れないですよね。

　この機能は、カーソルの左側の文字を見て続きを補完、複数ある時はリストを表示するということで、命令文の後に括弧書きで引数を付ける形でなら、別途単語ファイルを作成して、付けるべき引数を含めた補完が出来そうなんですが、なでしこらしい「AにBを～～～」みたいな形では、補完出来ないようなんですよねぇ～。残念。

# キーワードヘルプ

　「.khp」という拡張子のファイルが、キーワードヘルプファイルのようです。

- [キーワードヘルプ](https://sakura-editor.github.io/help/HLP000105.html)
- [タイプ別設定 『キーワードヘルプ』プロパティ](https://sakura-editor.github.io/help/HLP000315.html)

　アウトライン解析と同様、

```
（単語） /// （説明）
```

　という簡単な書式ではあるんですけどもね。
　これも基本的にはcommand.jsonから取ったのですが、一部補完したり、手直ししたりと結構手作業が入りましたｗ
　何はともあれ、

- タイプ別設定 ＞ キーワードヘルプ
	- キーワードヘルプを使うにチェック。
	- 「辞書ファイル」のテキストボックスの横にある「...」というちっちゃいボタンを押し、ファイル選択して開く。（インポートでは無いのでご注意）
	- 「挿入」を押して、辞書ファイル一覧に表示させる。（重要）
	- キーワードも表示するにチェック。(個人的に)

　これで、命令文を選択すると命令文の説明と引数が表示されるようになりました。
　やったね！

　悩ましいのは、なでしこの命令は、助詞として設定された以外の平仮名を送り仮名として無視することになっていて、より日本語らしい表記が出来るようになってんですが、それゆえに、後に付く送り仮名はいいですけど、例えば「押されたキー」なんて登録は「押キー」なんですからね～。そうなると当然「押されたキー」上ではヘルプは出ないわけですよ。むむむ。
　しかし、力尽きたので取りあえずそのまま；
　ぼちぼちと、自分の欲しいやつからなおしていこうと思います（主に、引数につく助詞を確認したいやつ。よく書き間違いでエラー出すやつ）

# エクスポート
　こうしてすべて良き感じに設定出来たら、

- タイプ別設定一覧 ＞ エクスポート

　「なでしこv3.ini」というのが出来て、次はこれをインポートすれば色々設定を元通りに出来るというわけなんですね。
　ならばなにも、こうしてちまちまと、あれやこれやの設定方法を個別に書き残さなくてもよかったようなものですけど、まあ、１００％どっかに見えなくするしね。あるいは、事件によってパソコンがどうかなったりとか；

　と、いうわけで、今回作成した定義ファイルはすべてGitHubに置いておくことにします。
　なでしこがバージョンアップして命令が増えたら、追加しないとならないかも知れないですからね。

### ファイル置き場
> https://github.com/snowdrops89/sakura_editor_nako3_highlight

　そんなに需要があるとも思いませんが欲しい人はどうぞご自由に。
　ほぼ単なる単語のリストと正規表現なので、他のエディタのなでしこ用のハイライトを作る際にも、役に立つかも知れません。

# おわりに
　様々な面で、「これで完璧！」とまでは言えないかもしれませんが、概ね目標は達成出来たので、これからは快適ななでしこ生活が送れそうです。
　なでしこが、もっと流行るといいなぁ～☆

前の記事：[『さくらエディタでなでしこさんを使いたい！　その２、シンタックスハイライト』](https://qiita.com/snowdrops89/items/e7af2139c6e24bb358dd)
AWS内の環境構築

ec2-userでログイン

cd .ssh

lsでパスを確認できる（tsubo09）

ssh -i tsubo09.pem ec2-user@18.177.248.32
でログイン

カリキュラム通りやっているつもりでもうまくできず、ものすごく時間がかかってしまっているので良く確認しながら進めていかなといけない
【React Native】Macで構築したLaravel Homesteadのローカル環境にExpoで開発しているアプリからアクセスする方法

# 経緯
[Laravel Homestead](https://readouble.com/laravel/6.x/ja/homestead.html) + [React](https://ja.reactjs.org/)のローカル環境のWebアプリケーション開発を経て[React Native](https://reactnative.dev/)とExpoを利用したアプリ開発をしてみようとした時に、Webで構築したAPIをアプリから使えるようにする方法をまとめておきます。

# mDNSとは
multicast Domain Name Serverの略です。

通常の名前解決ではDNSサーバに問い合わせを行いますが、mDNSではマルチキャスト転送を利用して同一ネットワーク内のデバイスに問い合わせる事で名前解決を行います。

つまりMacとiPhoneで同一ネットワーク環境を利用していれば、Macで用意したLaravel Homesteadのローカル開発環境にiPhoneからアクセスできる、ということです。

# 設定方法
Laravel Homesteadの[公式リファレンス](https://readouble.com/laravel/5.8/ja/homestead.html)にある【Homestead設定 > ホスト名の解決】の項を見ると、mDNSを利用してホスト名を公開できると記載されています。

実際に必要な設定を以下に記載していきます。

### hostsの設定

```ruby:hosts
192.168.10.10  homestead
```

まずはMac側のhostsの設定です。
homesteadはデフォルトのhomestead.testのトップレベルドメインを抜いた部分に対応して、IPアドレスもLaravel Homestead環境のデフォルトのものです。
それぞれ変更している方は適宜自身の環境に合わせて設定してください。

```
$ ping homestead
PING homestead (192.168.10.10): 56 data bytes
64 bytes from 192.168.10.10: icmp_seq=0 ttl=64 time=0.527 ms
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.348 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.328 ms
```

これで`http://homestead`でアクセスできる様になりました。

### Homestead.yamlの設定

```ruby:Homestead.yaml
hostname: homestead
```

次にHomesteadの設定です。
先ほど紹介した公式リファレンスにも記載されている上記の一文をHomestead.yamlの最下部にでも追記します。
これを記述することでiPhoneからhomestead.localにアクセスした時に、mDNSを利用してMacのhostsに記述したhomesteadと同じ名前解決が行われます。

```
ping homestead.local
PING homestead.local (192.168.3.14): 56 data bytes
64 bytes from 192.168.3.14: icmp_seq=0 ttl=64 time=0.683 ms
64 bytes from 192.168.3.14: icmp_seq=1 ttl=64 time=0.264 ms
64 bytes from 192.168.3.14: icmp_seq=2 ttl=64 time=0.377 ms
```

これで`http://homestead.local`に同一ネットワークを利用しているiPhoneからアクセスできる様になりました。
設定としてはこれで終わりですが、アプリからAPIサーバとして利用する場合は、

```
fetch('http://homestead.local/XXXXX')
```

この様に記載してあげれば大丈夫なはずです。

### Vagrantを利用していて名前解決できない場合

Vagrantを利用しているとhostsとHomestead.yamlの設定だけでは出来ないことがある様です。
そんな時はVagrantfileに以下を追記して、Vagrantのネットワークアダプターをbridgeに変更することで名前解決ができるようになると思います。
追記した後は`vagrant reload --provision`をして再度試してみてください。

```ruby:Vagrantfile
config.vm.network "public_network", bridge: 'en0: Wi-Fi (AirPort)'
```

## 最後に
これでReact Native + Expo + Laravel Homesteadの環境だけでアプリ・API開発ができるようになりました！
学習記録#1

#やったこと
Udemy「PythonによるWebスクレイピング〜入門編〜【業務効率化への第一歩】」の12-14

- ランキングサイトを模したページを使って、特定の要素（titleクラスのh1タグの中身など）をまとめて拾う方法
- はじめに要素を拾う際`browser.find_elemtent_by_class_name〜`とするときのbrowser.を忘れてしまう
- リストの最初が0ってのにいまいち慣れない

#読んだもの
https://qiita.com/katz_PG/items/a95a0f91705f80ffc47c
「Twitter漁るの面白そう」と思ったけど、スクレイピング禁止されてるのか。知らなかった。

#その他
-Jupyter notebookを終わる時はブラウザ側で終了→コンソールでCtrl+C
iOS13.3.1の環境で実機テストするとLibrary not loaded が表示される件について

こんにちは。
先日、外部フレームワークを使ったアプリで実機テストしようとしたら、真っ黒な画面になってしまい、少々ハマってしまったので記事を書きます。
同じことが起きてる人がいたら参考にして欲しいです。

# 環境
Xcode11.3.1
iOS(実機)13.3.1

# 解決すべき問題
Firebaseなどの外部ライブラリをCocoaPodsで導入したアプリを実機にインストールすると、「Library not loaded」となって、画面が真っ黒くなるという問題。なお、シュミレーターでは普通に動く。

# 原因
iOS13.3.1から、Appleは無料のアカウントで外部フレームワークを使用することをブロックしたらしいです、、、
僕は試してないんですが、有料版にアップグレードすると動くらしいです。

# 解決するためにやったこと
とりあえずエラーをコピペして検索してみた。そしたら、上の原因に書いたことが影響しているってことは分かったのですが、じゃあ1万円払って有料のデベロッパーアカウントを作成するのもなんか悔しい。

それで色々調べた結果、無料アカウントでも外部フレームワーク使える方法がありました。
それは、Podfileのuse_frameworks!をuse_modular_headers!に変更するという方法です。

こんな感じに、、、

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'AppName' do
  # Comment the next line if you don't want to use dynamic frameworks
  # use_frameworks!
  use_modular_headers!

  # Pods for AppName
  
  pod 'Firebase'
  pod 'Firebase/Analytics'

end
```
ここでは、use_frameworks!をコメントアウトしています。

もし、せっかく作ったアプリが動かなくて困っている方がいたら参考にしていただければと思います。

#参考にしたサイト
https://stackoverflow.com/questions/60096258/library-not-loaded-rpath-fblpromises-framework-fblpromises-ios-13-3-1
ReactでマークダウンをHTMLに変換する

ReactでマークダウンをHTMLに変換する方法について記載



1.react-markdownをインストール

```
npm install --save react-markdown
```


2.以下のコードを記載

```

import React,{Component} from 'react';
import ReactMarkdown from 'react-markdown/with-html';

export default class MarkdownSample extends React.Component {

    constructor(props) {
        super(props)
    }

    getHTMLfromMarkdown(){
        let markdown =
            '# 見出し 1\n' +
            '## 見出し 2\n' +
            '### 見出し 3\n' +
            '#### 見出し 4\n' +
            '---\n' +
            '- リスト 1\n' +
            '- リスト 2\n' +
            '- リスト 2-1\n' +
            '1. 番号付きリスト 1\n' +
            '2. 番号付きリスト 2\n' +
            '3. 番号付きリスト 3\n' +
            '[リンク](http://...)\n' +
            '**強調**\n' +
            '```ruby:filename.rb\n' +
            'コード\n' +
            '```';
        return markdown;
    }

    render() {
        return (
            <div>
                <ReactMarkdown
                    source={this.getHTMLfromMarkdown()}
                    escapeHtml={false}
                />
            </div>
        )
    }
}

```

以上





参考

https://github.com/rexxars/react-markdown
同時ログイン後の強制ログアウト表示を出す

前回の[CakePHPでの同時ログイン禁止](https://qiita.com/hoogee/items/4967be92b687a68991fd)の続き。
過去のセッションをすべてDBから消して強制ログアウトした後の挙動と、
「他でログインしたからこのセッションはログアウトした」という表示を出す方法について。

## DBに無いSession idが来た時の挙動
Sessionsテーブルからデータを消して強制ログアウトさせる方法の場合、ブラウザからはDB側データが消された事は分からないので、cookieが残っていれば普通に過去のセッションIDを送ってくる。
この時のサーバーサイドの挙動は以下の通り。

* 何らかのURLにユーザーからアクセスされる
* セッション開始(session_start())され、openハンドラとreadハンドラが一回呼ばれる
  * この呼び出しはCakePHPというより[PHP自体の機能](https://www.php.net/manual/ja/function.session-start.php)
  * カスタムSessionHandlerを登録してるので、そこで定義した関数が呼ばれる
* openハンドラは定義してないので継承元のDatabaseSessionへ、そこでも結局何もしない
* readハンドラでDB読みに行き、当然DBに行が無いので、空文字列""を返す
* Session id再発行。これ以降は再発行されたsession idで通常の動作になる
  * 内部でid振りなおし
  * writeハンドラ呼ばれてDBに書き込み
  * ユーザーにも新IDのcookieを返す 
* Authは当然失敗、ログインアクションにredirecされる。[これ](https://book.cakephp.org/3/ja/controllers/components/authentication.html#id13)の通り。

そしてログイン画面にリダイレクト後、

* 再発行されたsession idのcookieを受け取る
* DBにデータがあるので、ごく普通のセッション
  * **=この場所では強制ログアウト後か否かは知り得ない**

## 強制ログアウト時に表示を出す
二重ログイン後か否かを判断して強制ログアウトされた旨のメッセージを出したい場合、
上の挙動の通りリダイレクト後のログイン画面では知り様が無い。
よって、最初にアクセスされた、リダイレクト前のページで検知する必要がある。

検知はカスタムSessionHandlerで特定の挙動をしたときにフラグを立てるようにして、
Auth失敗時にこのフラグを確認する。
場所はAppControllerのbeforeFilter()[あたり](https://book.cakephp.org/3/ja/controllers/components/authentication.html#id14)。当然ここに来るまでにセッションID再発行まで終わっている。
以下①有り && ②無し が強制ログアウト時の状況になる。
① read() でカラ文字列を返した
② destroy() が呼ばれた

```
beforeFilter()内

if (!$this->Auth->user()) {
    //ここでフラグチェック
}
```

### 補足 ②destroy有無フラグが必要な理由
普通にログアウト・再ログインする際にもセッションID再発行が行われる。
この時もread()で空文字返す処理があるので、①だけで絞り込めない。
この時はdestroyも呼ばれるので、この有無を絞り込みに使う。
RustのトレイトとDeriveのキホンがよくわからんかったので自分なりに落とし込んだ

> https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/traits.html
> https://doc.rust-jp.rs/rust-by-example-ja/trait/derive.html

このドキュメントを見てもよくわからなかったので自分なりにキホンがわかるように。

# まずざっくりと

## トレイトとは
>トレイトはある型が提供しなければならない機能をRustのコンパイラに伝える言語機能です。
メソッド構文で関数を呼び出すのに用いていた、 impl キーワードを思い出して下さい。

## 継承(Derive)とは
>コンパイラには、[#derive]アトリビュートを用いることで型に対して特定のトレイトの標準的な実装を提供する機能があります。より複雑なことを行わせたい場合には、同名のトレイトを手動で実装することも可能です。

なにがなんだか...

# まずトレイトからみてみる

```rust
struct Circle {
    x: f64,
    y: f64,
    radius: f64,
}

impl Circle {
    fn area(&self) -> f64 {
        std::f64::consts::PI * (self.radius * self.radius)
    }
}
```

このプログラムをトレイトを用いて作り直すと，

```rust
struct Circle {
    x: f64,
    y: f64,
    radius: f64,
}

trait HasArea {
    fn area(&self) -> f64;
}

impl HasArea for Circle {
    fn area(&self) -> f64 {
        std::f64::consts::PI * (self.radius * self.radius)
    }
}
```
こうなるのかな？
`HasArea`トレイトを`Circle`構造体が実装したらなにかいいことがあるのでしょうか。

もう一度トレイトのドキュメントを見てみます。

```rust
fn print_area<T>(shape: T) {
    println!("This shape has an area of {}", shape.area());
}
```
このプログラムはエラーを吐くみたいです。
なるほど`T`はどんな型にもなれるから，`.area()`が使える保証がない（安全性がない）ためだとドキュメントが言っています。

```rust
fn print_area<T: HasArea>(shape: T) {
    println!("This shape has an area of {}", shape.area());
}
```
こういうふうにして`HasArea`トレイトを実装しているあらゆる型`T`という書き方にしてやれば実行できるようです。
なるほど使いみちがわかってきました。
`Derive`ではこのトレイトを構造体に追加できるみたいな感じなんですかね？

# Deriveについて
`Derive`を使うとどうやら**特定のトレイト**の標準的な，みんなが使うような実装をカンタンに行うことができるようです。
なるほど，標準的な実装があるのならさっきのトレイトのドキュメントみたいに改めて実装しなくてもいいみたいですね。

この`Derive`が使える特定のトレイトは，
- `Eq`
- `PartialEq`
- `Ord`
- `PartialOrd`
- `Clone`
- `Hash`
- `Default`
- `Debug`
というふうに決められてるみたいですね〜！
※ドキュメントに載っている`Zero`はDeprecatedになっているみたいです...
> https://www.reddit.com/r/rust/comments/2o3s5v/why_were_stdnum_zero_and_one_traits_deprecated/

# おわり
ざっくりと`トレイト`と`derive`の雰囲気を掴むことができたので，実際に手を動かして行こうと思います。
【メモ】Acronis Cyber Backupの警告

###ちょっと困ったのでメモ。

Acronis Backup 12.5で仮想マシンの復元を行うと、
リソースプールとvAppツリーの作成で警告が出て、
警告を伴う正常終了となる。

復元後のマシンの中身を見ても特に異常がない。

詳しい人に聞いてみると、
**Acronis Applianceの設定値でESXiを指定していると出てしまう無問題警告**らしい。

とはいえ、警告はアラートに出てしまうので、なんか嫌だな。。
vCenterを指定していると出ないらしいけど。
聴いたPodcastエピソード 2020(随時更新)

随時更新します。

### Fukabori.fm 27. 論理削除とは何か？どのような解法があるのか？ w/ twada
https://fukabori.fm/episode/27

### ajitofm 57: Nature Remoのシステムの裏側をsongmuさんに聞いてみた
https://ajito.fm/57/
Nature Remo で温度をとれて、赤外線リモコンをSiriとかで操作できるようになると？　面白そう。

### mozaic.fm  ep63 Cross Origin Info Leaks
https://mozaic.fm/episodes/63/cross-origin-info-leaks.html

### backspace.fm #331:リモートワーク必須時代の遠隔会議術
http://backspace.fm/episode/331/

### PHPの現場 35. クリーンアーキテクチャと DDD（nrslib）
https://php-genba.shin1x1.com/35

### はなれより。　vol.006｜情報発信と情報収集とクライアントワーク（ゲスト：長谷川恭久さん）
https://anchor.fm/hanare-yory/episodes/vol-006-eacvo0
Ruby 2.7.0 で速度が重要なときは double splat 引数に double splat 演算子をつけてハッシュを渡すより単にハッシュをハッシュとして渡すほうが良い

Ruby 2.7.0 にして、キーワード引数関連の大量の警告を出ないように変更していったところ、指定の時間内で処理が終わるというテストが失敗するようになったため、もしかして警告に合わせて変更した部分が影響しているのではないかと考え、速度を調べてみました。

```ruby
RUBY_VERSION                    # => "2.7.0"

h = { a: 1, b: 2, c: 3 }

def f1(o = {})
end

def f2(**o)
end

require "active_support/core_ext/benchmark"
def _; "%7.2f ms" % Benchmark.ms { 1000_0000.times { yield } } end
_ { f1(h)   } # => " 857.01 ms"
_ { f2(h)   } # => "1955.95 ms"
_ { f2(**h) } # => "3679.11 ms"
```

これでわかったこと

1.  ハッシュをハッシュとして渡すのはかなり速い
2.  `f2(**o)` にハッシュを渡すのはハッシュをハッシュとして渡すより2倍ほど重い (そもそも警告がでる)
3.  `f2(**o)` にハッシュを `**` をつけて渡すのは単にハッシュをハッシュとして渡すより4倍ほど重い

ということです。

いままで `func(options = {})` というのがあると、とりあえず新しい感じの方に合わせとけば利点があるんだろうと考えて `func(**options)` の方に寄せていってましたが、速度がもっとも重要なところでは、逆に `func(options = {})` の方に寄せていった方がよさそうです。
OCI DBaaS(VM)でシェイプを変更できるようになったよ

# DBaaSでもシェイプ変更可能に
ついにOracle Cloud Infrastructure Database（VM）でもシェイプ（CPU）を変更できるようになった。

* [2020/03/04 Changing the shape of a virtual machine DB system](https://docs.cloud.oracle.com/en-us/iaas/releasenotes/changes/6842bd85-f339-4d74-9b2c-bcdfe573a864/)

Oracle Cloud Infrastructure ClassicのDatabase Cloud Serviceでは、初期のころからCPUコア数を変更できた。しかしOracle Cloud Infrastructure Databaseでは、Bare Metalは変更できたが―――それもオンラインで―――、VMでは変更できなかった。

この機能拡張によって、利用状況に応じてCPUコア数の変更が可能になり、コスト最適化が図れるようになった。またData Guard構成のとき、従来はプライマリとスタンバイを同じシェイプにする必要があったが、その必要もなくなった。

<font color="blue">**おまけ：Linux OSにおける動的CPUコア数変更**</font>
今回のDBaaS（VM）とは関係ないが、DBaaS（BM）ではCPUホットプラグ機能を使って、CPUコアを動的に有効／無効化している。実際には、さらにOracle DBパラメータも変更している。

```shell-session
# CPUコアの無効化
echo 0 > /sys/devices/system/cpu/cpu＜#＞/online

CPUコアの有効化
echo 1 > /sys/devices/system/cpu/cpu＜#＞/online

※＜#＞にはCPUスレッド番号
```

たとえばHyper-Threadingが有効な2物理コアでは、0から3までの4CPUスレッドがあり、動的に変更できる。

```shell-session
ls -d /sys/devices/system/cpu/cpu?
/sys/devices/system/cpu/cpu0  /sys/devices/system/cpu/cpu2
/sys/devices/system/cpu/cpu1  /sys/devices/system/cpu/cpu3
```

# シェイプの変更方法
シェイプは管理コンソールやCLI等で変更できる。なお、障害に備えて事前にバックアップを取得することを推奨する。またOSの再起動が必要なので、数分から10分程度のダウンタイムが発生する。

1. 管理コンソールから**「シェイプの変更（Change Shape）」**をクリックする。

![dbaas-up01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/cbe95e4c-5a71-0721-70fd-af50fb9209cd.png)

2.シェイプの一覧から選択して**「シェイプの変更（Change Shape）」**をクリックすると変更を開始する。
![dbaas-up02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/7e140f42-7789-eabb-a4aa-a73b30752ba0.png)
3. 進捗状況は**「作業リクエスト（Work Requests）」**で確認できる。ステータスが**「利用可能（AVAILABLE）」**になれば終了だ。

# おわりに
これでDBaaSの不満の一つが解消されたが、今後は次のあたりが改良してほしいところ。Autonomous DBもあり大変だとは思うが、AWSもRDSとAuroraでそれぞれ進歩させているのだから。

* ~~リージョン間の自動Data Guard~~　→2020/3/31にできるようになった（[Configuring Oracle Data Guard across regions](https://docs.cloud.oracle.com/iaas/releasenotes/changes/83baf0ae-4352-41db-94eb-d0cb4d0058c5/)）
* メジャーバージョン間の容易なマイグレーションの仕組み
* バックアップの強化（OCI-Cのほうがよかった）
* dbcli等の管理ツール強化
ざっくりgitコマンド

タイトル通りで自分用のメモ書きなのでいずれ追記したり、体系的にまとめていきたいと思います。

## 前提知識
### 領域
gitは変更履歴（ファイルを作成、削除、更新した履歴）を管理するために、保管領域を４つに分けている
1. ワーキングツリー
　　- ファイルの作成、削除、更新などを行う領域
　　- 変更履歴そのものを作成する場所と言い換えてもいいかしれない
2. インデックス
　　- `git add`した時に変更履歴が登録される領域
　　- どの変更履歴をローカルリポジトリへ保管するかを登録する
　　- インデックスに登録すること（git add）をステージングともいう
3. ローカルリポジトリ
　　- `git commit`した時に変更履歴が登録される領域
　　- 変更履歴をローカルに保存する=自分用
4. リモートリポジトリ
　　- `git push`した時に変更履歴が登録される領域
　　- 変更履歴をリモートに保存する=共有用

### HEADとは
変更履歴の~~最新版ではなく~~直近版のこと

以下は`git log`の簡易形式だが、`HEAD`、つまり最新版の変更履歴はコミット3ということになる。
`origin/HEAD`はリモートリポジトリの`HEAD`のこと。
以下の履歴からローカルリポジトリで変更した内容をまだ`git push`してリモートリポジトリに保存していないことが伺える。

```
コミット3 (HEAD -> master)
コミット2 (origin/master, origin/HEAD)
コミット1 
```
### リセットのオプション種類
例
1. A.txtというファイルの内容を変更し、
2. `git add A.txt`して、
3. `git commit`した時

`--soft`
　　・3を取り消す = ローカルリポジトリの内容を取り消し、ワーキングツリーとインデックスでの変更内容は残る
`--mixed`
　　・2、3を取り消す = インデックス、ローカルリポジトリの内容を取り消し、ワーキングツリーでの変更内容は残る
`--hard`
　　・1、2、3全て取り消す = ワーキングツリー、インデックス、ローカルリポジトリの内容を取り消す

## コマンド

```:ブランチ一覧にコミットメッセージなどの詳細を加えて表示
git branch -v
git branch -vv
# -vv オプションの方がリモートブランチ情報などより詳細な情報になる
```
```:リモートリポジトリのブランチの一覧を確認
git branch --remote
```
```:ブランチを削除する
git branch -d ブランチ名

# ブランチを強制削除
git branch -D ブランチ名
```
```:ブランチ名を変更する
# 変更したいブランチにいる時
git branch -m 新ブランチ名

# 別ブランチにいる時
git branch -m 現ブランチ名 新ブランチ名
```
```:リモートで削除されているブランチをローカルでも削除する
git fetch --prune
```
```:リベース
git rebase ブランチ名
```
```:対象のローカルブランチをリモートブランチに強制プッシュ
git push -f origin ローカルブランチ:リモートブランチ
```
```:ワーキングディレクトリ内の変更を破棄（元に戻す)
git checkout -- ファイル名
```
```:リモートリポジトリを確認
git remote -v
```
```:ログを1行表示で確認
git log --oneline
```
```:コミットしていない内容を一時退避(変更内容をコミットしないとブランチ変更できないのでそういう時に使う)
git stash
```
```:一時退避したリストの一覧
git stash list
```
```:一時退避した内容(stash)をリストから指定して戻す
git stash pop stash@{0}
```
※`stash@{0}`は適宜変更

```:一時退避した内容(stash)を全て消去
git stash clear
```
```:直近のコミットからの変更内容を（新コミットを追加せず）直近コミットに反映する
git commit --amend
```
```:マージする前に戻る
git merge --abort
```
```:addを取り消す
git reset HEAD addしたファイル名
```

▼【参考サイト】
https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe
再帰表現メモ

## ユークリッド互除法
修正：2020.3.５

普通の書き方

```python:main.py
def euclid_algolithm_1(a, b):
    while True:
        r = a % b
        if r == 0:
            return b
        a, b = b, r
```

再帰表現で書く

```python:main.py
def euclid_algolithm_2(a, b):
    r = a % b
    if r == 0:
        return b
    return euclid_algorithm_2(b, r)
```
PySparkのleft anti joinとexceptの振る舞いの違いを調べた

# はじめに

PySparkにおいて、他方のDataFrameにないレコードを取得したい場合、letfanti joinする方法とexcept演算を行う方法とで振る舞いの違いが気になったので比較した。

#　検証コード

```python:検証コード
import numpy as np
import pandas as pd
import random

n = 100; m = 10000
a = spark.createDataFrame(pd.DataFrame({'i': range(n)}))
b = spark.createDataFrame(pd.DataFrame({'j': [''.join(random.choice('qwertyuiopasdfghjklzxcvbnm') for _ in range(10)) for _ in range(m)]}))

x = a.crossJoin(b).persist()
y = x.sample(fraction=0.001).persist()

x.count(); y.count()

data1 = x.join(y, ['i', 'j'], 'left_anti')  # leftanti
data2 = x.exceptAll(y)  # except
```

## leftanti join

explainメソッドでPhysicalPlanを確認すると大まかに以下の手順の処理になる。

1. Joinする
    - 上記の例だとBroadcastHashJoin
    - Planからは分からないが、結合後にright tableの結合key is Nullで判定？


## except all

同様に、explainメソッドでPhysicalPlanを確認すると大まかに以下の手順の処理になる。

※PySparkのDataFrameで提供されているのは、except allのみでexceptはない認識

1. 一方のDataFrameに1、もう一方のDataFrameに-1の列Vを追加する
1. Unionする
1. 結合keyでHashAggregateにより、Vのsumを集計する
1. sum(V)>0なレコードを取得
1. sum(V)>1なレコードを複製する
    - except all処理なので、重複行を再現する

# 実行時間

上記の例での実行時間を比較してみた。
扱うデータや環境によるだろうが、Joinするだけで済むので、BroadcashHashJoinできる条件下では、leftanti joinした方が早そう？

||時間|
|:-:|:-:|
|leftanti join|36.2 s ± 885 ms|
|except|40.2 s ±　374 ms|
[Kaggle] ep.X - 欠損値の扱い

# tldr

欠損値の扱いについて勉強しました。

# 欠損値

何らかの理由で値が入っていないデータのこと

単に空欄の場合もあるし「ゼロ値」の場合もある。

# 欠損している理由

- 値が存在しない
- 意図がある
- 取得に失敗した

# 対処法

**そのまま取り扱う**

GBDTライブラリとかは欠損値を埋めずにそのまま取り扱うことが可能。

**代表値で埋める**

平均値などの分布を代表する値で埋める。

**他の変数から予測する**

欠損している変数が他の変数と関連がある場合は、予測した値で埋める。

# 欠損値から新たな特徴量を作成する

欠損値がランダムではない場合、欠損していることが特徴量となりうる。
ラズベリーパイでアクティブディレクトリ

# はじめに
今回はラズベリーパイでSambaを使ったActive Directoryを試してみます。

# 実行環境
下記バージョンで動作確認しています。
- RaspberryPi3
- Ubuntu

```
# uname -a
Linux ubuntu 5.3.0-1017-raspi2 #19~18.04.1-Ubuntu SMP Fri Jan 17 11:14:07 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
```

# 学習方針
バイナリパッケージを利用します。

```
# apt-get update

# apt-get install samba krb5-config winbind smbclient ldap-utils
# mv /etc/samba/smb.conf /etc/samba/smb.conf.org 

# samba-tool domain provision 

Realm: raspberry.pi
 Domain [raspberry]:
 Server Role (dc, member, standalone) [dc]:
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:
 DNS forwarder IP address (write 'none' to disable forwarding) [127.0.0.53]: none
Administrator password:
Retype password:
Looking up IPv4 addresses
Looking up IPv6 addresses
More than one IPv6 address found. Using 2001:268:c0ca:9d99:ba27:ebff:fe3b:cf14
Setting up share.ldb
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=raspberry,DC=pi
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=raspberry,DC=pi
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba AD has been generated at /var/lib/samba/private/krb5.conf
Once the above files are installed, your Samba AD server will be ready to use
Server Role:           active directory domain controller
Hostname:              ubuntu
NetBIOS Domain:        RASPBERRY
DNS Domain:            raspberry.pi
DOMAIN SID:            S-1-5-21-271669818-82488480-2142163154

# reboot

/etc/samba/smb.confに以下の行を追加
ldap server require strong auth = no
# cat /etc/samba/smb.conf
# Global parameters
[global]
        netbios name = UBUNTU
        realm = RASPBERRY.PI
        server role = active directory domain controller
        workgroup = RASPBERRY
        ldap server require strong auth = no

[netlogon]
        path = /var/lib/samba/sysvol/raspberry.pi/scripts
        read only = No

[sysvol]
        path = /var/lib/samba/sysvol
        read only = N

# systemctl unmask samba-ad-dc
# systemctl start samba-ad-dc
# systemctl status samba-ad-dc
# systemctl enable samba-ad-dc

# ldapsearch -x -D "cn=administrator,cn=users,dc=raspberry,dc=pi" -W -b "cn=Users,dc=raspberry,dc=pi" 
```

#Why ラズベリーパイ？
仕事ではAWS/AZUREなどクラウドを使っていますが、個人で自由に使うにはコスト面で問題があります。１万円でUbuntuが動かせるラズベリーパイは、マックブックと一緒にどこにでも持ち運べてサーバーサイドのプログラミングのテスト環境として最適です。
プログラミングを学習する前に知るべき、"論理というもの"の種類と使い方

# この記事の基本的な方針
論理は日常でヒトが皆当たり前のように使用しているものです。頭が良いか悪いかは関係ありません。人間全員が使用しています。
しかし当たり前すぎてそれを改めて客観的に考えたことのある人は少ないのではないのでしょうか。
ここではそんな論理を種類分けして、プログラミングにおいていかに使うべきかを検討します。
# 想定する読み手
プログラミングを行っているが、論理そのものについて検討したことのない全ての人。
# 論理とはそもそも何か
論理は日常でヒトが皆当たり前のように使用しているものです。頭が良いか悪いかは関係ありません。話すということ、考えるということ、そして認識することさえも論理によるものであると言えます。
論理を一言で説明すると`『知らないことを知るための手続き』`です。
論理を使用した一例をあげます。"なので"以降が論理によって導き出されたものです。

```
「Aさんは背が高い」
「Aさんは頭がいい」
なので
「Aさんは背が高く かつ 頭がいい」
```

なんだそりゃ？と思うでしょうか。「Aさんは背が高い」そして「Aさんは頭がいい」なんだから「Aさんは背が高く かつ 頭がいい」に決まっているじゃないか。意味ないじゃないか！！
私もそう思います(笑) でもこれが論理なんです。

別の例をあげます。

```
「オランダ人のBさんは背が高い」
「オランダ人のCさんは背が高い」
「オランダ人のDさんは背が高い」
なので
「オランダ人は背が高い」
```

これについては人によって感想がさまざまに分かれると思います。
# 論理の種類
上であげた２つの例は全く違った種類の論理を使っています。
前者が<b>`『演繹(えんえき)法論理』`</b>で、後者が<b>`『帰納(きのう)法論理』`</b>です。
演繹法論理は、厳格な法則によってすでに得た知識の中から確実に正しいものだけを導き出す論理です。
帰納法論理は、なんかそういう傾向あるからこうなんじゃない？という恣意的な部分を含みつつ新たな知識を生み出してゆく論理です。

（恣意的…その時々の思いつきで物事を判断するさま）
# 演繹法論理について
演繹法論理を使うもっとも一般的なものは数学です。
数学は演繹法のみを用いていて、一度導きだされたものは前提が正しければ100％正しいと言えます。上の「Aさんは背が高く かつ 頭がいい」の例のように一歩一歩は当たり前なことの積み重ねで数学の定理は証明されています。そして実は`新たな知識は一つも増えていない`のです。「三角形の内角の和は常に180度である」ことを証明して新たな知識が得られたように感じるのは我々ヒトの頭がその程度であるからであり、全知全能な神から見れば上の「Aさんは背が高く かつ 頭がいい」の例のように当たり前なことなのでしょう。
（ちなみに、『数学的帰納法』という数学の証明法がありますが、これは完全に演繹法論理であるので注意が必要です。）
演繹法論理について本気で語りだそうとすると極めて大きなボリュームになってしまいますので、ここでは省きますが、『かつ』と『または』の意味を捉えておくことをおすすめいたします。『または』に関しては特に日常的な使い方と異なる可能性がありますので注意が必要です。
# 帰納法論理について
帰納法論理は上の「オランダ人は背が高い」の例でも分かる通り極めて乱暴な部分を含んだものであります。演繹的論理と違い、`新たな知識をどんどん増やしていく`ものであり、人類はこれによって発展したと言えますが、その新たな知識はクオリティがまばらであり、使用には細心の注意が必要です。
# 二種の論理の整理
まとめると、
『演繹法論理』は`常に正しいが知識を生み出していないもの`であり、
『帰納法論理』は`知識を生み出しているが常に正しくないもの`であります。

やっぱり都合の良い万能な道具立は存在しないことがうけてとれますね。
# プログラミングにおいて
我々はプログラムを書くことによって便利な楽しいサービスをどんどん生み出しています。その過程ではおそらく自然に『帰納法論理』を駆使しまくっていることでしょう。もちろん常に100％正しいことはないので失敗もあると思いますが、それこそが醍醐味と言えるかもしれません。
そしてだからこそ、そのサービスをコードを書いて具体的に作る過程においては想定した通りのサービスを作るために、恣意的なものを紛れ込ませて余計なものを生み出してはなりません。
言い換えると、`コードを検討する思考においては『演繹法論理』を使用すべきであり『帰納法論理』を使用してはなりません`。
「何回やってもデータベース登録うまくいっているから、テスト必要ないよね？」という思考は、上の「オランダ人は背が高い」の例と同じであり、何万回うまくいったところでコードの正当性の証明にはなりません。データベース登録にかけた制限の登録可能な側と登録不可能な側の際にきちんと設定して行うべきです。
テスト以外についても同じです。
# まとめ
今自分の思考はどちらの論理を使っているかを意識しましょう。
自分が本当にやりたいことについては、常に正しくないというリスクを承知で『帰納法論理』を使いましょう。
そのやりたいことを遂行するための行動に対しては、『演繹法論理』を使いましょう。