OmniAICreator/Qiita-1.07M huggingface dataset:
PythonからMeCabを使っていてRuntimeErrorが出た時の解決方法

PythonでMeCabを使っているときにRuntimeErrorが出た時の解析メモ

# 状況

```
Traceback (most recent call last):
  File "hoge.py", line 104, in <module>
    run()
  File "hoge.py", line 60, in run
    tagger = MeCab.Tagger('-u user_term.dic')
  File "/home/bwtakacy/Develop/hoge/venv/lib/python3.6/site-packages/MeCab.py", line 307, in __init__
    this = _MeCab.new_Tagger(*args)
RuntimeError
```

# まず試すこと

PythonのMeCabバインディングだとMeCabのエラーを返せずRuntimeErrorになるらしい。なので、コマンドラインからMeCabを呼び出して実際に起きているエラーが何なのかを確認する。

## 今回の場合
```
$ mecab -u user_term.dic
viterbi.cpp(50) [tokenizer_->open(param)] tokenizer.cpp(130) [sysdic->isCompatible(*d)] incompatible dictionary: user_term.dic 
```

システム辞書とユーザ辞書のバージョンやエンコーディングが一致していないときに発生する様子。

ref: https://github.com/taku910/mecab/blob/3a07c4eefaffb4e7a0690a7f4e5e0263d3ddb8a3/mecab/src/tokenizer.cpp#L131

環境のMeCabの辞書周りの設定がどうなっているかは、 `-D` オプションで確認できる。


```
$ mecab -D
filename:	/usr/local/lib/mecab/dic/mecab-ipadic-neologd/sys.dic
version:	102
charset:	UTF8
type:	0
size:	4542610
left size:	1316
right size:	1316

filename:	/home/bwtakacy/Develop/hoge/user_term.dic
version:	102
charset:	EUC-JP
type:	1
size:	6095
left size:	1316
right size:	1316
```

## 解決方法
今回はシステム辞書とユーザ辞書のエンコーディングが違っていたのが原因だった。
`mecab-dict-index` コマンドでユーザ辞書をコンパイルする際に、出力のエンコーディングを指定していなかったので、`-t` オプションで`utf-8`を指定してあげることで解決できた。

`mecab-dict-index`のオプションは以下の通り。

```
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index --help
MeCab: Yet Another Part-of-Speech and Morphological Analyzer

Copyright(C) 2001-2012 Taku Kudo 
Copyright(C) 2004-2008 Nippon Telegraph and Telephone Corporation

Usage: /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index [options] files
 -d, --dicdir=DIR                    set DIR as dic dir (default ".")
 -o, --outdir=DIR                    set DIR as output dir (default ".")
 -m, --model=FILE                    use FILE as model file
 -u, --userdic=FILE                  build user dictionary
 -a, --assign-user-dictionary-costs  only assign costs/ids to user dictionary
 -U, --build-unknown                 build parameters for unknown words
 -M, --build-model                   build model file
 -C, --build-charcategory            build character category maps
 -s, --build-sysdic                  build system dictionary
 -m, --build-matrix                  build connection matrix
 -c, --charset=ENC                   make charset of binary dictionary ENC (default EUC-JP)
 -t, --charset=ENC                   alias of -c
 -f, --dictionary-charset=ENC        assume charset of input CSVs as ENC (default EUC-JP)
 -w, --wakati                        build wakati-gaki only dictionary
 -p, --posid                         assign Part-of-speech id
 -F, --node-format=STR               use STR as the user defined node format
 -v, --version                       show the version and exit.
 -h, --help                          show this help and exit.
```

以上。
SIGNATEにPytorchで初投稿【練習】

#0 背景
CIFAR10で色々なことを体験し、92%になったところで、（別記事）

他のもので遊んでみようかと思います。

日本版kaggleとも言われている(?)SIGNATEのうち、learningにある分類問題はCIFAR10と同じ32×32の画像なので、以前の記事と同じようなネットワークでそのまま突っ込んでみました。

すると、いくつかの発見もあったので備忘録として残そうと思います。
あとSIGNATEに投稿したい私のような初心者のために。

#1 データのロードどうしよう

torchvisonが使えないやり方は知りませんでした。

調べたところ、pytorchのdatasetクラスを継承すると、Dataloaderが使えるのでやりやすいとのことで実践してみました。実際のコードは以下の通りです。

```
from PIL import Image
import torchvision.transforms as transforms
from torch.utils.data import Dataset

transform = transforms.Compose(
    [transforms.RandomHorizontalFlip(),
      transforms.ToTensor(),
      transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

class MyDataSet(Dataset):
    def __init__(self, csv_path, root_dir, transform):
        self.train_df = pd.read_csv(csv_path,skipinitialspace = True, delimiter = "\t")
        self.root_dir = root_dir
        self.images = os.listdir(self.root_dir)
        self.transform = transform

    def __len__(self):
        return len(self.images)

    def __getitem__(self, idx):
        # load pic
        image_name = self.images[idx]
        image = Image.open( os.path.join(self.root_dir, image_name) )
        # label 
        label = self.train_df.query('file_name=="'+image_name+'"')['label_id'].iloc[0]
   
        return self.transform(image), int(label)
```

また、ロードする際には、

```
train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True)
```

としてやると、自前のデータセットからロードすることがきます。

#2 提出用ファイル

提出するのは、testデータの各クラスの推論結果です。
提出用のsubmit.csvに推論結果を格納して保存していきます。

```
import csv

test_dir = "./test/"
test_images = os.listdir(test_dir)

with open("submit.csv", mode = "w") as f:
  f.write("")
for test in test_images:
  image = Image.open( os.path.join(test_dir, test) )
  image = transform(image)
  image = image.view(-1, 3, 32, 32)
  with torch.no_grad():
    outputs = net(image)
  outputs = F.softmax(outputs, dim = 1)
  outputs = outputs.cpu().numpy().reshape(20)
  csvlist = []
  csvlist.append(test)
  for i in range(len(outputs)):
    csvlist.append(outputs[i])

  with open("submit.csv", "a") as f:
    writer = csv.writer(f)
    writer.writerow(csvlist)
```

#3 過学習を図るためのデータ
テストデータのラベルがないので、モデルが過学習しているかがわかりません。
そこで、traindataをさらに分割し、過学習の度合いをはかりましょう。
Pytorchでは割と簡単にできてしまいます。

```
trainval_set = MyDataSet('train_master.tsv', './train/', transform)
train_set, test_set = torch.utils.data.random_split(trainval_set, [42000, 8000])

train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_set, batch_size=512, shuffle=True)
```

#　おわりに

以上のような形でSIGNATEに投稿することができました。
HerokuにDockerFileのイメージを使用してリリースする

## はじめに
※学んだことアウトプット用です。
複数コンテナリリースや、DBとの連携までは書いていないです。

# メリット
dockerで開発することで環境依存問題を解決できる。
リリースもコンテナをプッシュするだけで簡単にできる。

# 実際にリリースしてみよう

事前にherokuにログイン

```
heroku container:login
```

DockerFileのあるディレクトリで

```bash
heroku container:push web
```

イメージがビルドされて、プッシュされる。

そのあと

```bash
Heroku container:release web
```

これでプッシュされたイメージが起動する

# 補足
Railsの場合はserver.pidがコンテナに取り込まれるとHeroku上で起動できなくなる

いちいちプッシュする際にサーバーを落とすのは面倒なので、対策を打つ。
対策として、.dockerignoreにserver.pidを登録することで、イメージに含まれなくなる
イメージに含まれなくなると無事にコンテナを起動することができる

```bash:.dockerignore
pids/server.pid
```
Nuxtのsentryモジュールでエラーを検知するときの注意点

## Nuxtのsentryモジュールでエラーを検知するときの注意点
以下のようにtryの中で例外が発生する場合は注意が必要です。このとき、sentryで通知するには`       this.$sentry.captureException(e)`が必要なことに注意してください。

デフォルトでは、Uncaught Exceptionにしかsentryは機能しないからです。

```javascript
    try {
        const a = 1
        a()
      } catch (e) {
        this.$sentry.captureException(e) // これが必要！
      }
```

参考 公式 https://github.com/nuxt-community/sentry-module
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
JupyterのTracebackを見やすくする

# better-exceptionsを jupyter でも

## この記事は何？
　jupyerでバッチコードも書くアナタ、pdbを起動させるのがかったるいアナタにオススメします。ExceptionでTracebackが起動すると前後の変数を出力しておいてくれる優れモノのモジュール「better-exceptions」をjupyterでも使えるようにするHackです。
![BetterExceptions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111758/1b35d7c4-f66d-d63a-657b-a6a61ba5d271.png)

## イントロ
### [「PythonのException発生時のTracebackを綺麗に見る」](https://vaaaaaanquish.hatenablog.com/entry/2017/12/14/183225)
　元記事は、Twitter:@vaaaaanquish氏の上記記事で、Traceback周りのモジュール紹介してくれています。大変秀逸な記事です。氏はその中で様々な機能拡張がコメントされていますが、そこはかとなくオススメされていた「better-exception」は、Traceback停止時に、変数の内容を一緒に表示してくれる優れモノ。
 
　こりゃjupyterでも使いたいと思い、アレコレ試したところjupyterでも使えるようになったので、ノウハウとして投稿することにしました。

### モジュール作者はQixさん(githubは[こちら](https://github.com/Qix-/better-exceptions))
リポジトリのREADME.mdにある紹介画像を下に引用します。
<img width="541" alt="screenshot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111758/0524d9de-052e-2686-27b2-ad25b30a6bd4.png">

## 元々はシェルやREPL環境用
　IDE環境がある人はそれでできている機能ですが、何かの理由でシェルやREPL環境用で実行してTracebackが発生した際には、パッとデバッグできないのが厄介。better_exceptionsがインポートしてあれば、業務は劇的に向上します。

## better-exceptionsの使い方
### インストール
　まだ、未インストールの方はインストールをしてください

```
 pip install better_exceptions
```

また、REPLやシェルでも使う方は環境変数を設定すると幸せになれるかも

```
export BETTER_EXCEPTIONS=1  # Linux / OSX
```

### Python REPL (インタラクティブ・シェル)に入って使う
下記のように起動コマンドでーmオプションを使ってbetter-exceptionsモジュールをしています。

```
$ python -m better_exceptions
Type "help", "copyright", "credits" or "license" for more information.
(BetterExceptionsConsole)
>>>
```

# jupyterでもbetter-exceptionsを使う
jupyter用の設定ファイルをipythonのスタートアップパスにおきます。

### ipythonのスタートアップパス

```
$HOME/.ipython/profile_default/startup/00-better_exceptions.py
```

### jupyter用設定ファイル ↓↓↓↓↓

```00-better_exceptions.py
import sys
try:
    import better_exceptions
except ImportError:
    better_exceptions = None

def exception_thunk(exc_tuple=None, filename=None,
                    tb_offset=None, exception_only=False, **kwargs):
    new_exc_tuple = exc_tuple or sys.exc_info()
    if not isinstance(new_exc_tuple[0], SyntaxError):
        return print(better_exceptions.format_exception(*new_exc_tuple))
    else:
        return old_show_tb(exc_tuple, filename,
                           tb_offset, exception_only)
if better_exceptions:
    ip = get_ipython()
    old_show_tb = ip.showtraceback
    ip.showtraceback = exception_thunk

```

### 実行例
githubのテストスクリプトによる実行例（意図的に例外を発生させるコード）
![スクリーンショット 2019-06-25 23.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111758/b57175c0-3515-bf06-5d1a-7475e9f0f660.png)

実行例その２
![スクリーンショット 2019-06-25 23.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111758/79fad313-32ea-89e3-e55a-35656d80644d.png)

コード中にあるようにbetter_exceptions.MAX_LENGTHで出力する文字数（水色）を調整できます。

本当に便利（マジで関心しています）。

## 実は正式採用にはなっていない
上の'00-better...'ファイルは未だリポジトリには正式採用されていません。github上のissue ipython support#10 の中でユーザ同士の提案で出てきたコードです。その中から良さげなものをピックしました。pdbとも上手く同居できるようです（当方はまだ試していません）。
https://github.com/Qix-/better-exceptions/issues/10

# 良い jupyter生活を！
【製作進捗】BlackJack：03

#今回の進捗
[前回](https://qiita.com/DoroRITCH/items/c2514aa08e3c1e31132a)からの続きです。

- プレイヤーの行動が済んだ後のディーラーの行動
- プレイヤーとディーラーの得点を比較して決着

前回と比較してあっさりになってしまいました。
では細かい内容に。

#内容
##ディーラーの行動

　基本的にはHitのみを行うように設計しています。
　変わっている部分は、ディーラーの得点を参照して15点以上になるか、プレイヤーの得点を上回るまでWhile文でループさせるようにしています。

```Java:BlackJack_main.java
		System.out.println("ディーラーの2枚目のカードは["+handCard_dealer.get(1)+"]でした");
		System.out.println("ディーラーの手札は"+handCard_dealer+"です");
		System.out.println("ディーラーの得点は"+cardPoints_dealer+"点です");

		//ディーラーの行動
		while(cardPoints_dealer<15 || cardPoints_dealer<=cardPoints) {
			handCard_dealer.add(bills.get(0));
			System.out.println("ディーラーの引いたカードは["+handCard_dealer.get(handCard_dealer.size()-1)+"]です");
			cardPoints_dealer+=points.get(handCard_dealer.get(handCard_dealer.size()-1));
			bills.remove(0);
			System.out.println("ディーラーの得点は"+cardPoints_dealer+"点です");
			JUDGE.judge(cardPoints,cardPoints_dealer);
			if(JUDGE.result != "") {
				System.out.println("BlackJack終了！また遊んでね☆");
				return;
			}
		}
```

##決着
　簡単なif文で条件分岐させています。

```Java:blackJack_main.java
		//得点比較・勝敗
		System.out.println("ディーラーの手札は"+handCard_dealer+"です");
		System.out.println("あなたの得点は"+cardPoints+"点です");
		if(cardPoints==cardPoints_dealer) {
			System.out.println("////引き分けです。////");
			System.out.println("BlackJack終了！また遊んでね☆");
			return;
		}else if(cardPoints>cardPoints_dealer) {
			System.out.println("----あなたの勝ちです----");
			System.out.println("BlackJack終了！また遊んでね☆");
			return;
		}else{
			System.out.println("----あなたの負けです----");
			System.out.println("BlackJack終了！また遊んでね☆");
			return;
		}
```

#終わりに
　Javaを始めてから、最初の製作物でした。
　実質製作時間が15時間程になります。
　オブジェクト指向設計についてまだまだ未熟なこともあって、コードが長くなってしまいましたが、伸びしろということにしておきたいと思います。
　コメントしてくださった方々、Slack・Discordでアドバイスをくれた友達、ありがとうございます。

　なお、Gitに関してもまだ触れていないので、今回のPGはGitが利用できるようになった後にアップしようと考えています。
Frontend or Backend Development explained 

I started as a back end developer and work on that for about 3 years. Then I went into management and worked on that for about 3 years and now I am a front end developer and has been doing that for 4 years.

Now that I’ve been doing FE for 4 years I can see in some projects that I’m currently working on how PHP and JAVA have evolved (from when I was a BE developer) and I wish I had more time to learn more and dive deeply into them (again), and specially work on real projects using them. I miss databases as well and I remember I loved to handle complex logic stuff in the BE.

On the other hand, I think that FE has evolved A LOT in the recent years and now there are a ton of things that you can do and that could be complex and interesting as well (like heavy logic SPAs, dynamic templating, using SASS power to handle things like theming in a nicer fashion, React, Babel, Gulp, TypeScript) and I enjoy it. And my previous experience as BE developer has helped me hugely to be a better FE developer.

So in my humble opinion, I think it depends on what you like more. But if you want to continue working with both, I guess full stack developer is the go to path. However, there’s a downsize to that and it is that I don’t think you can really get to know BE or FE very deeply unless you are extremely dedicated and spend a lot of time doing research and keeping you up to date with trending techniques, tools and technologies.

Another point is that if you choose a specific field you’ll be more likely specialized in that field after some time and you could earn more money because of that specialized knowledge you have.

I am personally thinking to start diving more in native mobile applications or machine learning. But who knows, at the end everything is just code and logic (at least to me) and the nice thing is that we have a lot of options in this field.

Related blog:

[Spring boot tutorial](http://candidjava.com/tutorial/spring-boot-tutorials/)
Oracle Data Visualization Desktopでデータの準備からカラム名を変更する

Oracle Autonomous Data Warehouse + Oracle Data Visualization Desktopでデータをいろいろな切り口から見ることができますが、元データのカラム名が利用者から直感的にわかりにくかった場合はどうしましょうか？たとえば業務ユーザーに英語の要素で考えてもらうのはあまりフレンドリーではありません。

データを入れ直す際にDBに対してcreate table/alter table文できれいにするのがおそらく正解なのですが、データの歴史的経緯で過去のしがらみがあるとか、日本語カラム名は使いたくないとか、そもそも早く結果を出すためのものなので名前の部分を記にせず手軽に使いたいなどで、カラム名変更のような大きな作業をしたくないなど、やらないですむならやりたくない事情はよくわかります。

私も開発者としてデータのモデルや名前付けの悪い設計で、悔やむような思い出を多く持っています。後任者の人ごめんなさい。

### ユースケース

- 分析データのもともとのDBは、英語やローマ字でカラム名が設定されているところからエクスポートした
- 業務ユーザーは日本語のカラム名で作業したい

というありがちなシーンで、DVDの画面から見た目のカラム名を変更できれば情シスさんも業務ユーザーもハッピーだよね、ということで、カラム名変更の仕方を解説します。

## カラム名を変えてみる

準備　のタブを叩き、元データを閲覧します。各カラムの名前の右側にカーソルと持ってくると「三」のようなアクションメニューが現れるので、これをクリックします。

<img width="1322" alt="スクリーンショット_R1_06_25_22_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/aae3b488-6664-5151-9e8d-5f4eb3bfb4c7.png">

アクションメニューから、名前変更を選びます。

<img width="1322" alt="スクリーンショット_R1_06_25_22_51_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/abefa3db-36c0-1882-612e-6f1ce5fdd2e4.png">

名前変更画面になったので、名前の部分にわかりやすいカラム名をいれてあげます。


<img width="1322" alt="スクリーンショット_R1_06_25_22_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/fa200be8-370a-d2a4-33ae-75380d1a44eb.png">

さて、ここまでで名前が変わった、と思ったらどうやら適用をしてあげなければいけないようです。左側準備スクリプトの下のほうにある、「適用スクリプト」のボタンを押すことで実際にプロジェクト上のデータに対して適用されます（この際、DBは更新されず、あくまでDVDの上での見かけが変更されるようです）

<img width="1322" alt="スクリーンショット_R1_06_25_22_52_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/3b0408ea-b29a-9f71-342c-8e96cee1c4f5.png">

これで、DVDのプロジェクトから見ると永続的に変更されて、DVDを再起動したりしても表示が保持されます。

<img width="1322" alt="スクリーンショット_R1_06_25_22_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/e37d8d26-d3a8-860e-c453-b1b095bd7f50.png">

では、ビジュアル化のタブを叩いてみましょう。日本語で表示されるようになりました。

<img width="1322" alt="スクリーンショット_R1_06_25_22_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/e5959625-d934-3d02-938d-edd3289fd546.png">

地味な設定方法ですが、少し使い勝手がよくなりました。また便利な方法を見つけたら記事にします。
iOS Appバンドル公開時のメモ

- 単体アプリと同様の審査が必要。
- 審査通過後は“販売可能“のOnでリリースとなるので、審査提出時は”販売可能”をOffにしておいた方が良さそう。
- 審査通過後もバンドル名、説明、URLなどは変更可能。
- スクショは単体アプリのを全部取ってくるが、バンドル内では変更ができない。
- バンドルの価格は、一番高いアプリの価格から全バンドルアプリの合計価格の範囲内で設定可能。
- バンドル内のアプリを所有している場合は、差額がバンドル価格となる。既に支払額がバンドル価格を超えている場合は 価格表示が”complete” となり、無料でバンドルを購入可能。
- 単体アプリページで購入してしまうと、バンドル価格は適応されないので注意。その際はユーザーが Apple に申し出れば返金はしてくれるとのこと。
自作IoT機器を作る

# 自作IoT機器を作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/0dca6f82-4097-b110-6fb0-af2591be6709.png)
# Raspberry PIからwifi経由でリレーのスウィッチをOn Off させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/b7fbc4d0-cb24-3b4f-31e6-5932b3435716.png)

# どうやって家のwifiに参加させるか?
モード1：このボードがアクセスポイントになり周辺機器にIP-addressを配る。
緑色のLEDが点滅してから4秒後に点滅が2秒になると設定が完了する。
192.168.4.1 、ポート番号8080 設定される。
モード2：ルータに参加しDHCPからIP-Addressをもらう。
[下記のappがsmartConfigを行ってくれる。]
(https://apps.apple.com/jp/app/espressif-esptouch/id1071176700)
家庭内ネットワークに参加しているiPhoneなどを用いてSmartConfigを実施する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/1423045b-d215-0d47-91d8-d943c1712804.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/e24e7460-843d-587f-87c5-fc649c7c961c.png)

# 最初の一歩(Getting Start)
```
>arp -a
インターフェイス: 192.168.1.10 --- 0x13
  インターネット アドレス 物理アドレス           種類
  192.168.1.1           58-52-8a-3f-8a-21     動的
  192.168.1.90          b0-e8-92-10-3c-f6     動的
  192.168.1.104         e4-e4-ab-58-7e-36     動的
  192.168.1.111         b8-27-eb-43-fa-bf     動的
  192.168.1.150         78-0f-77-1a-31-a0     動的
  192.168.1.151         78-0f-77-17-5d-70     動的
  192.168.1.152         84-0d-8e-a7-d8-3a     動的
  192.168.1.255         ff-ff-ff-ff-ff-ff     静的
  224.0.0.22            01-00-5e-00-00-16     静的
  224.0.0.251           01-00-5e-00-00-fb     静的
  224.0.0.252           01-00-5e-00-00-fc     静的
  239.255.255.250       01-00-5e-7f-ff-fa     静的
  255.255.255.255       ff-ff-ff-ff-ff-ff     静的
```
無事192.168.1.152に接続できた。

## wifiリレーに送信するコマンド
|  コマンド                  |  value(値)   |
|---------------------------|--------------|
| Turn OFF the first relay  |  A0 01 00 A1 |
| Turn ON the first relay   |  A0 01 01 A2 |
| Turn OFF the second relay |  A0 02 00 A2 |
| Turn ON the second relay  |  A0 02 01 A3 |
| Turn OFF the third relay  |  A0 03 00 A3 |
| Turn ON the third relay   |  A0 03 01 A4 |
| Turn OFF the fourth relay |  A0 04 00 A4 |
| Turn ON the fourth relay  |  A0 04 01 A5 |

デバック用サンプル

```send.py
import sys,binascii,time,socket
HOST, PORT = "192.168.1.152", 8080
cmd=[('A00100A1','A00101A2'),('A00200A2','A00201A3'),('A00300A3','A00301A4'), ('A00400A4','A00401A5')]
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
send=lambda x: sock.send(bytearray.fromhex(x))
for i,x in enumerate(cmd):
    print("Channel %d on"%i)
    send(x[1]) #コマンド　送信　on
    time.sleep(1)
    print("Channel %d off"%i)
    send(x[0]) #コマンド　送信　off
    time.sleep(1)
sock.close()
```
リレーに魔法瓶やコーヒーメーカを接続するとwifi経由でon/offできる。

結果

```
>send.py
Channel 0 on
Channel 0 off
Channel 1 on
Channel 1 off
Channel 2 on
Channel 2 off
Channel 3 on
Channel 3 off
```
LINE BOT GASスニペット 【初心者用】最も基本的な書き方

##はじめに
プログラミングの入門にLINE BOTをたくさん作れば勉強になるかなと思って、シンプルな応答のプログラムは、基本的に記載内容はほぼ一緒だから定形を作っておけば、一部内容をいじるだけで作れるかなと、スニペットを作ってみました。
##使い方
GoogleAppsScriptに下記コードをコピペするだけで、テンプレートが返されるコードです。あくまでテンプレートなので、返信内容は任意で変更してください。
`LINE_ACCESS_TOKEN` 部分は、任意のトークン設定となりますので、取得したトークンに書き換えてください。

```
var LINE_ACCESS_TOKEN = PROPERTIES.getProperty('LINE_ACCESS_TOKEN');
```

![IMG_9934.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444878/a64b0f8e-9587-db2d-0784-a91a78d629c5.png)

##コード
```line_bot_gas.js
var LINE_ACCESS_TOKEN = PROPERTIES.getProperty('LINE_ACCESS_TOKEN');
var LINE_END_POINT = "https://api.line.me/v2/bot/message/reply";
var reply_token;

//ラインからGASへのリクエスト時の処理
function doPost(e){
  var json = JSON.parse(e.postData.contents); //送られた内容をJSONから変換
  reply_token = json.events[0].replyToken; //送られたメッセのトークンを取得
  response_message(); //下記関数を実行 応答メッセージ
}

//応答詳細
function response_message(){
  //応答の定形 LINEリファレンスのまま
  var messages = [{
    "type": "template",
      "altText": "This is a buttons template",
      "template": {
          "type": "buttons",
          "thumbnailImageUrl": "https://example.com/bot/images/image.jpg",
          "imageAspectRatio": "rectangle",
          "imageSize": "cover",
          "imageBackgroundColor": "#FFFFFF",
          "title": "Menu",
          "text": "Please select",
          "defaultAction": {
              "type": "uri",
              "label": "View detail",
              "uri": "http://example.com/page/123"
          },
          "actions": [
              {
                "type": "postback",
                "label": "Buy",
                "data": "action=buy&itemid=123"
              },
              {
                "type": "postback",
                "label": "Add to cart",
                "data": "action=add&itemid=123"
              },
              {
                "type": "uri",
                "label": "View detail",
                "uri": "http://example.com/page/123"
              }
          ]
      }
  }]; //ここまで
//応答処理
  UrlFetchApp.fetch(LINE_END_POINT,{ 
    "headers":{
      "Content-Type" : "application/json; charset=UTF-8", //JSONの場合
      //Authorizationを設定する場合
      "Authorization" : "Bearer " + LINE_ACCESS_TOKEN,
    },
    "method" : "post", 
    "payload" : JSON.stringify({ //オブジェクトをJSONに変換
      "replyToken": reply_token, //LINEでBotに送られたメッセのtoken,変数指定しておく
      "messages": messages //上記messagesは長いので変数化しておく
    })
  });
}
```

##アレンジ方法
上の画像を見てわかるように、
画像、タイトル、テキスト、Buyボタン、Add To Cartボタン、View Detailボタンの準に配置されています。コードを読めば対象部分がどこかわかると思うので、そのボタンのリンク先や記載内容、掲載画像を変更したら、最低限の使い方がわかるかなと思います。
ぜひお試しくださいませ〜

その他、もっとシンプルな書き方などあるよ！っていう場合は教えてくださいませ！
【SQL】関数[todate]の実行結果が正規表現の指定通りにならない

# 事象：関数[todate]の実行結果が正規表現の指定通りにならない
次のクエリを投げた時、実行結果が同じになるのは何故か？？


```SQL:test.sql
SELECT to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss') ,
       to_date('2000-01-01', 'yyyy-mm-dd') 
FROM dual;
```
実行環境：OSQLEdit
DB：Oracle

<br>

▼想定結果

|    to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss')    |    to_date('2000-01-01', 'yyyy-mm-dd')    |
|:------------------:|:------------------:|
|        2000-01-01 23:59:59       |        2000-01-01        |

▼実行結果

|    to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss')    |    to_date('2000-01-01', 'yyyy-mm-dd')    |
|:------------------:|:------------------:|
|        2000-01-01       |        2000-01-01        |

<br>

# 結論：OSQLEditの設定の問題だった。
DATE型の値を表示する際に、'yyyy-mm-dd'で表示する設定になっていたため、
年月日時分秒ミリセカンドを指定した場合と、年月日のみを指定した場合で
クエリの結果が同じであった。

ツール>オプション>設定（2）>DATE型の書式
から設定可能。

<br>

# 補足
DATE型の値を表示を、'yyyy-mm-dd hh24:mi:ss'で表示する設定にした場合、
下記のような実行結果になった。

```SQL:test.sql
SELECT to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss') ,
       to_date('2000-01-01', 'yyyy-mm-dd') 
FROM dual;
```

####実行結果

|    to_date('2000-01-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss')    |    to_date('2000-01-01', 'yyyy-mm-dd')    |
|:------------------:|:------------------:|
|        2000-01-01 23:59:59       |        2000-01-01 00:00:00        |
django基本　プロジェクト・アプリケーション生成方法

#プロジェクトの生成
- 以下を実行すると、現在のディレクトリにmyProjectディレクトリが作成される

```bash
$ django-admin startproject myProject
```


#アプリケーションの生成
- 以下を実行すると、現在のディレクトリにmyAppディレクトリが作成される

```bash
$ python manage.py startapp myApp
```

#プロジェクトとアプリケーションの違い
- アプリケーション
    - 実際に何らかの処理を行うWebアプリケーション
- プロジェクト
    - あるウェブサイト向けに設定とアプリケーションを集めたもの
    - 複数のアプリケーションを入れられる。
bind(バインディング)の概念について(Rxswift)

# bind(バインディングってそもそも何)
Rxswiftの.bindなどで用いられるバインディングですがプログラムに置き換えると結局どういうことなの？ 
と感じたのでまとめました
・バインディングは.bindしなくてもそもそもできるもの
・`Timer`と似たようなもんで`監視対象が時間ではなくViewなどになった`だけ

```swift
// 1秒'たったら'getInfoを実行する
let timerGetInfo = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(getInfo), userInfo: nil, repeats: true)
timerGetInfo.fire()
```

```swift
// hugaを満たしたらhogeにバインディング
.map { huga }
.bind(to: hoge) 
```
・まぁ用は`紐付ける`ぐらいに考えとけばいい
→深く掘り下げすぎなくても分からなければならなくなってからやってったらいい、キャリア積んだ人でもこの辺のことは探り探りで進めていくことも多い

# 結論
あんま気にすんな
UiPathの「For Each Row/繰り返し（各行）」内で行を削除する

# 概要

UiPathの「For Each Row / 繰り返し（各行）」アクティビティの中で、特定行だけ削除する方法です。

# 問題

UiPathでExcelファイルを処理すると、DataTable型には必ずお世話になると思います。
そして、DataTable型の変数を、「For Each Row / 繰り返し（各行）」で順次に処理していくのも、かなり多いワークフローのパターンになると思います。

「For Each Row / 繰り返し（各行）」の中で、row（行に該当する変数）を読むだけなら何も問題ありません。
ところが、処理している行を削除したいとき、方法を知らないと躓くことが多いようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447505/14f16d7d-ad22-25c1-ec48-8124e6be1cf3.png)

たとえばこのような設定。rowの2番目の要素をInt32型に変換して、値が「1」ならその行を削除する簡単なロジックです。一見、動きそうに見えますが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447505/86c25290-551b-c79b-f65b-01acfb59736d.png)

こうなります。

原因は、「For Each Row / 繰り返し（各行）」を実行中に、そのDataTableに変更が加わったために、現在処理している行が特定できなくなった、といった感じです。（厳密にはちょっと違うのですが、話を進める上で不要なので割愛します）
そして、確かに自分で行を削除しているので、DataTableに変更が加わっているのも当然なのです。これでは困りますね。

# 対策

「For Each Row / 繰り返し（各行）」ではなく、**「For Each / 繰り返し（コレクションの各要素）」を使います。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447505/4c5132f6-7a74-fbd1-cf39-debe29fac58b.png)

ポイントは2つです。

- 「For Each / 繰り返し（コレクションの各要素）」の、TypeArgumentを、 **System.Data.DataRow**にする。
- 対象のコレクションにDataTable型変数をそのまま設定せず、**DataTable型変数.Select()**で一時的な配列に変換する。

細かい解説は省きますが、これで「データ行を削除」が例外（エラー）にならずに動作します。
（原理的には「繰り返し中に、テーブルを直接弄ると叱られるので、いったん内容をコピーした配列を用意して、それを順番に処理することで、元のテーブルの変更を無視できる」ぐらいに思ってください）
SwiftUIのImageをネットワークのURLから取得して表示

# 概要

SwiftUIの画像データをネットワークなどから取得して、描画する方法のメモ。
勘違いをしている箇所などありましたらぜひご指摘いただけると嬉しいです。

# やりかた

ObservedObjectを使ってデータ更新を通知する
https://developer.apple.com/documentation/swiftui/state-and-data-flow

1.`ObservableObject`を継承したデータモデルを作成
2.データ更新を受け取るViewのプロパティに1で作成したデータモデルを追加して`@ObservedObject`をつける
3.1で作成したデータモデルにUIImageのプロパティを追加して、`@Published`をつけておく

データモデル側

```swift

/// ObservableObjectを継承したデータモデルを作る
final class ImageContainer: ObservableObject {

    // @PublishedをつけるとSwiftUIのViewへデータが更新されたことを通知してくれる
    @Published var image = UIImage(systemName: "photo")!
    
    init(from resource: URL) {
        // ネットワークから画像データ取得
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: resource, completionHandler: { [weak self] data, _, _ in
            guard let imageData = data,
                let networkImage = UIImage(data: imageData) else {
                return
            }
            
            DispatchQueue.main.async {
                // 宣言時に@Publishedを付けているので、プロパティを更新すればView側に更新が通知される
                self?.image = networkImage
            }
            session.invalidateAndCancel()
        })
        task.resume()
    }
}
```

View側

```swift
struct ContentView: View {
    // 監視対象にしたいデータに@ObservedObjectをつける。
    @ObservedObject var container: ImageContainer
    
    var body: some View {
        Image(uiImage: container.image)
    }
}
```

# 解説

※ こちらに記載されている内容を引用しながらやっていることを書いていきます。
https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app  

  
モデルクラス(今回の例だとImageContainer)内のデータが変更された場合にSwiftUIに反映するには、モデルクラスが`ObservableObject`を継承する必要があります。

> To make the data changes in your model visible to SwiftUI, adopt the ObservableObject protocol for model classes.

```swift

final class ImageContainer: ObservableObject { ... }
```

このモデルクラス内のプロパティに`@Published`をつけることで、プロパティが更新されたときに通知をすることができます。

> To publish a property, add the Published attribute to the property’s declaration:

```swift

final class ImageContainer: ObservableObject {
    @Published var image: UIImage
}
```

この更新をSwiftUI側で監視するために`@ObservableObject`のアノテーションをつけてプロパティを宣言します。

> To tell SwiftUI to monitor an observable object, add the ObservedObject attribute to the property’s declaration

```swift

struct ContentView: View {
    @ObservedObject var container: ImageContainer
}
```

`ImageContainer`でネットワーク経由での画像の取得が完了し`var image: UIImage`が更新されることによって、
`ImageContainer`を監視していたSwiftUI側に表示更新の通知がされます。

# 参考情報

こちらの記事もとても参考にさせていただきました。 :bow: 
https://qiita.com/shiz/items/6eaf87fa79499623306a

https://developer.apple.com/documentation/swiftui/state-and-data-flow
SQLで数字パズルをする

環境: postgresql 9.6


以下のサイトでSQLで解くパズルがいくつか紹介されていたので、簡単なものを挑戦してみます
https://oraclesqlpuzzle.ninja-web.net/index.html

## 1. 素数を求めるには?

プログラミングの入門でよくありそうな問題。
numberテーブルに連続した自然数(1~1000)がnumカラムに入っている。その中から素数だけを取り出す。

### 前準備

テーブルを作成して連続した自然数を1000個入れる

```sql
create table number (num INTEGER);
insert into number(num) values (select generate_series(1,1000));
```

### 解き方

素数は 

- 1以外の自然数で割り切れない自然数N

なので

- 自然数N に対して 2->(N-1)までの自然数で割り算をして、その時の剰余が全て0にならないこと

を確認すればOKです。

このままでもOKですが計算量を減らすために割る時の自然数の2乗が自然数Nを超過しないことも条件に入れます


`自然数N に対して 2->(N-1)までの自然数で割り算をして、その時の剰余が全て0にならないこと`このループを伴う処理は`not exists`を使いましょう。

### 解答

`not exists`を使ってループ処理をするのがポイントです。

```sql
select 
  s1.num 
from 
  number as s1 
where 
  s1.num > 1
and not exists(
    select s2.num from number as s2
    where 
      s1.num >= s2.num * s2.num 
    and 
      s2.num > 1 
    and 
      s1.num % s2.num = 0 
    limit 1
  )
;
```

## 2. 組み合わせの問題①


数字 8,7,4,2,1,0 のうち
3つを足して10になる組み合わせをすべて求める。

### 前準備

テーブルを作成して必要な自然数を入れる

```sql
create table number (num INTEGER);
insert into number (num) values(1),(2),(0),(4),(7),(8);
```

### 解き方

1. ３つの組み合わせを同じtableをinner joinする(順列じゃないので`t1.num < t2.num`で除外処理を入れる)
2. 組み合わせが完了してから`where`句で合計値が10になるものを取り出す

### 解答

先にinner joinで組み合わせのtableを作成するのがポイントです。

```sql
select 
  t1.num, t2.num, t3.num, t1.num+t2.num+t3.num as sum  
from 
  number as t1
inner join  
  number as t2
on 
  t1.num < t2.num 
inner join 
  number as t3 
on 
  t2.num < t3.num 
where 
  t1.num + t2.num + t3.num = 10;
```

- 結果

 num | num | num | sum 
-----+-----+-----+-----
   1 |   2 |   7 |  10
   0 |   2 |   8 |  10
(2 rows)



## 3. 組み合わせ問題②

数字 21,12,17,11,25,10,3,7,15 のうち
2つの数字を足して、
2,3,5,7,11で割り切れない数になる組み合わせをすべて求める。

### 前準備

テーブルを作成して必要な自然数を入れる

```sql

create table number (num INTEGER);
insert into number (num) values(21),(12),(17),(11),(25),(10),(3),(7),(15);
```

### 解き方

①ができればほとんど同じですね。

1. 2つの組み合わせを同じtableをinner joinする(順列じゃないので`t1.num < t2.num`で除外処理を入れる)
2. 組み合わせが完了してから`where`句で合計値がそれぞれ割り算する


### 解答

```sql
select 
  t1.num, t2.num, t1.num+t2.num as sum 
from 
  number as t1
inner join 
  number as t2
on 
  t1.num < t2.num 
where 
  (t1.num+t2.num) % 2 != 0 
and 
  (t1.num+t2.num) % 3 != 0 
and 
  (t1.num+t2.num) % 5 != 0 
and 
  (t1.num+t2.num) % 7 != 0 
and 
  (t1.num+t2.num) % 11 != 0 
;
```
- 結果

 num | num | sum 
-----+-----+-----
  12 |  17 |  29
  12 |  25 |  37
  11 |  12 |  23
  10 |  21 |  31
   3 |  10 |  13
   7 |  12 |  19
   7 |  10 |  17
(7 rows)


## 感想

inner joinで同じテーブル繋げられるの初めて知りました。数独もsqlで解けるらしいので、今度チャレンジしてみようと思います。
マンガのような画像を並べるHTML

とりあえず、マンガのように並べて表示出来るように作成しました。

静的に作っていますが、フレームワーク的に使えるように作成しています。
クリック場所でページ移動とキーボード移動に対応しています。

改造は今後に期待


https://github.com/karosuwindam/mangahtml
Windowsバッチファイルのメモ

#findstr（id-list.cmd）

```
rem アカウントIDから情報抽出
rem 準備ファイル：id-list.txt
rem id-list.txtの内容：ユーザー名(sAMAccountName)を一行ごとに羅列

rem カレントディレクトリを実行ファイルのある階層に設定
pushd %~dp0
rem ドメイン環境下の場合は　OPT=/domain
set OPT=

rem id-list.txtの内容を読み込んで、キーワード「ユーザー名」「コメント」「アカウント有効」を抽出
for /f %%i in (id-list.txt) do net user %OPT% %%i | findstr "ユーザー名" && net user %OPT% %%i | findstr "コメント アカウント有効"

rem ※バグなの？＞findstrのor検索では1行目が表示されない
rem ※不細工だけど＆＆で繋いで対処

pause
exit
```
UiPathの基礎にして基礎

<h2>概要</h2>
今回はUiPathの基礎中の基礎を説明してからUiPathでHelloWorldまでの道のりを捧げようと思います。

<h2>UiPathで出来ること</h2>
UiPathを使うことで動作の自動化を図ることができます。まだ勉強中でどこまでできるか分かっていないのですが、自動化と聞いて人間の頭に思い浮かぶようなことは大抵できるらしいです。
これさえあれば誰でもできるテストがこの世からなくなるかもしれませんね。

<h2>本題</h2>
というわけで早速UiPathを使ってHelloWorldをしてみましょう！

<h3>1.UiPathでプロジェクトを作る</h3>
UiPathを開いて「プロセス」で新規プロジェクトを作成します。
![スクリーンショット 2019-06-25 20.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/c2abaf51-ee22-6ad2-9513-0402819dd234.png)

ちなみに新規プロジェクト作成のテンプレートの説明はご覧の通り。

<table>
  <tr>
    <td>プロセス</td>
    <td>何も配置されていない空のプロジェクトを作成できる</td>
  </tr>
  <tr>
    <td>ライブラリ</td>        
    <td>作成した複数のプロジェクトを再利用可能なライブラリにする</td>
  </tr>
  <tr>
    <td>トランザクションプロセス</td>        
    <td>情報の流れを図式化した自動化処理を作成できる</td>
  </tr>
  <tr>
    <td>エージェントプロセス改善</td>        
    <td>ユーザのクリックやキー入力など人の操作が介在する自動化処理を作成できる</td>
  </tr>
  <tr>
    <td>Robotic Enterprise Framework</td>        
    <td>大規模な展開に適した自動化処理を作成できる</td>
  </tr>
</table>

適当にプロジェクト名と保存場所、説明を追加して作成しましょう。
![スクリーンショット 2019-06-25 20.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/52c335df-5012-db06-04e1-da868bb0b39d.png)

<h3>2.画面のレイアウトを理解しよう</h3>
プロジェクトを作成すると3つに区切られた画面が出てきました。
![スクリーンショット 2019-06-25 21.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/c75ae78d-3d6a-532b-965c-982129b890db.png)

左の画面から説明していきます。

<table>
  <tr>
    <td>アクティビティパネル</td>
    <td>クリックや文字の入力、ブラウザを開くなど、操作(アクティビティ)のひとつひとつがこのパネルに格納されています。また拡張アクティビティもインストールできます。下のタブでプロジェクトと切替可能。</td>
  </tr>
  <tr>
    <td>デザイナーパネル</td>
    <td>開発においてメインとなるパネルです。自動化する操作(アクティビティ)をドラッグ&ドロップで配置していくことで開発を行うことができます。上部にはファイル単位でタブが表示され、複数のファイルを切り替えることができます。</td>
  </tr>
  <tr>
    <td>プロパティパネル</td>
    <td>各アクティビティ毎のプロパティを設定できます。</td>
  </tr>
</table>

<h3>3.アクティビティを使ってみよう</h3>
上のパネルの説明に頻繁い出てきた「アクティビティ」について説明していきます。

クリックやキー入力など自動化する操作のひとつひとつをUiPathでは「アクティビティ」と呼んでいます。「UiPath Studio」では200個以上の「コアアクティビティ」が用意されており、また用途に合わせて追加でインストールする「拡張アクティビティ」があります。

例えばエクセル用の拡張アクティビティをインストールすれば、エクセル上での自動化を簡易に行えるようなアクティビティが開発環境に追加されます。便利！

よく使うアクティビティの説明はこちら
https://www.cresco.co.jp/blog/entry/6236/

早速アクティビティの「MessageBox」を使ってみましょう。
左の検索ボックスを使うと簡単に探せます。
![スクリーンショット 2019-06-25 21.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/ff499c75-c836-ce3e-e25e-e4a8b762a06d.png)

そして、出てきたアクティビティをデザイナーズパネルにドラッグすると...
![スクリーンショット 2019-06-25 21.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/39b88f33-9e04-3161-9f99-16e3fe9e29dc.png)

だだん！無事にメッセージボックスが配置されました。
メッセージボックスを配置できたら、入力部に適当な文字列を入力しましょう。文字の入力時には基本的にダブルコーテーション（引用符）でくくる必要があります。
![スクリーンショット 2019-06-25 21.12.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/257d97ac-5bbb-f2f4-ad1f-5ea5001f7c17.png)

これでHelloWorld準備はバッチリです。
上のリボンから保存して、実行ボタンを押してみましょう。すると...
![スクリーンショット 2019-06-25 21.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/9fad28b9-b5f0-8306-b8d9-5894506ac06d.png)

だだん！HelloWorldが表示することに成功しました！

<h2>まとめ</h2>
ここまででUiPathの基本中の基本の操作を触ってみました。
視覚的にもわかりやすくて触ってて楽しいですし、なんでもできそう感がすごいですね。
次回はもう少し深いところまで触ってみれればと思います。それでは！
アロー演算子の可変関数についてメモ

可変関数について簡単にメモ。

```php:ex)
class Person {
    public function sayHello() {
        echo "Hello.";
    }
    
    public function sayEvening() {
        echo "Good evening";
    }
}

$now = intval(date('H'));
if($now <= 16) {
    $greet = "sayHello";    
} else {
    $greet = "sayEvening";    
}

$person = new Person;
$person->$greet();
```

アロー関数時も、関数名を変数にいれて、

```php:
$person->$greet();
```
このように動的にメソッドを呼ぶことができる。


FWのモデルを呼ぶときにwhereメソッドなのか、andWhereメソッドなのか条件で場合分けするときに使ってみた。
C#でPrint関数とRead関数を実装してみた

# C#でPrint関数を実装してみた

はい、初めに言うけどあまり使い所の多くないネタ投稿的内容だ。
C#とかJavaとかって、出力文一つ書くのが長いんだよ！
Console.Writelineだとか、System.out.printlnだったりと。
Pythonならprint一つで済むのに！！
と思ったので実装。

```C#

using System;

class test
{

    static void Print(string a)
    {
        Console.WriteLine(a);
    }

    static void Print(string a, string b)
    {
        Console.WriteLine("{0}と{1}",a,b);
    }

   
    public static void Main()
    {
       Print("a"); 
    }

}

```

はい、これだけ。
一応引数2つまで受け取れるようにしてみた
もっと実用性のあるようにしたかったけどアイディア不足()

# Read関数も実装してみた。

上で言った通り長すぎるから打つのだるいねん！！ってことで実装。

```C#
using System;

class test
{
    static void Read()
    {
        var hogehoge = Console.ReadLine();
        return hogehoge;
    }

    public static void Main()
    {
       var hoge = Read()
    }
}

```

こっちはまぁ、Printと比べたらまだ使い勝手が良さそう
Read()だけで入力読み込みできるのは悪くないね！！

はい、まとめたコードと使用例？
的なもの

```C#

using System;

class test
{

    static void Print(string a)
    {
        Console.WriteLine(a);
    }

    static void Print(string a, string b)
    {
        Console.WriteLine("{0}と{1}",a,b);
    }

    static string Read()
    {
        var hogehoge = Console.ReadLine();
        return hogehoge;
    }
    public static void Main()
    {
        var a = Read();
        Print(a);
    }
}

```

はい、これで3とか入れるとそのまま3って表示されるよ。
うん、クソ簡単なコードだね(笑)
Readは便利かもしれないのでよかったら使ってみてな。。。
では、お疲れ！
SQLでデータをNULLとする基準について

SQLでは、データに`NULL`を入れることができます。
しかし、データには**数値であれば「０」**、**文字列であれば「空白」**を入れて表現することもできます。
そこで、データを`NULL`とするか、「０」や「空白」で表すかを調べて考えてみました。

## `NULL`にする場合
`NULL`にする場合は簡単です。
基準としては、値が存在しないときに`NULL`を使います。
例えば、電話番号やメールアドレスなどと存在として不明確な場合には`NULL`を使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425008/72ec5b68-b45b-b7e6-9011-d7acba4b90f5.png)

しかし、これが年齢や身長などと存在がはっきりとわかる場合には使えないということです。

## 「０」や「空白」とする場合
先ほども書いた通りに、年齢や身長などと存在がはっきりとわかる場合には「０」や「空白」を使います。（この場合は「０」ですね）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425008/d8bdd1a1-d2dd-4a9f-9835-e653e0afdf1b.png)

## まとめ
まとめると、

- 存在として値が不明確なときは、`NULL`
- はっきりと存在がわかる値のときは、「０」や「空白」
ニューラルネットワークのコスト関数とバックプロパゲーション

最近数学をやり直していてふと機械学習がどういう仕組みなのか知りたくなって、Courseraでスタンフォード大学が提供している機械学習講座を受けている。第6週まで終わったので思い出しながら軽くまとめる。講座はこちら [Coursera Machine Learning](https://www.coursera.org/learn/machine-learning)

[week1 機械学習とは何か、単線形回帰、仮説関数、コスト関数、最急降下法](https://qiita.com/yusayusa/items/b3b35e4f415f5c516d21)
[week2 重線形回帰、スケーリング、多項式回帰、正規方程式](https://qiita.com/yusayusa/items/d7f0224cabf7465a8d55)
[week3 ロジスティック回帰、共役勾配法・BFGS・L-BFGS、多クラス分類 、過学習と正則化](https://qiita.com/yusayusa/items/587a882b5d28cdd136e3)
[week4 ニューラルネットワークの基礎](https://qiita.com/yusayusa/items/b6b29b96ebcae0e8ea3c)
[week5 ニューラルネットワークのコスト関数とバックプロパゲーション](https://qiita.com/yusayusa/items/0b0a7a56c30b685aa521)
[week6 機械学習のモデルの評価 - 交差検証、バイアスとバリアンス、学習曲線、適合率と再現率](https://qiita.com/yusayusa/items/b49d9bd866526037cf02)

# Week 5 ニューラルネットワークのコスト関数とバックプロパゲーション

ニューラルネットワークのパラメータをフィッティングするにはどうするか。いつもと同じようにコスト関数から入る。

## コスト関数
ニューラルネットワークはロジスティック回帰が連なったものなので、ロジスティック回帰のコスト関数を思い出すと直感的にイメージしやすい。

- ロジスティック回帰のコスト関数

```math
J(\theta)=−\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\log(h_\theta(x^{(i)}))+(1−y^{
(i)})\log(1−h_\theta(x^{(i)}))]+\frac{\lambda}{2m}\sum_{j=1}^{n}\theta_j^2​	
```

- ニューラルネットワークのコスト関数
    - $L=$ レイヤーの合計
    - $s_l=$ $l$レイヤーのユニット数
    - $K=$ 出力のユニット数

```math
J(\Theta)=−\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{k}[y^{(i)}_k\log((h_\Theta(x^{(i)}))_k)+(1−y^{
(i)}_k)\log((1−h_\Theta(x^{(i)}))_k)]+\frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_l+1}(\Theta_{j,i}^{(l)}​)^2
```

## バックプロパゲーション - Backpropagation

いつものように$J(\Theta)$を最小化するような$\Theta$を求めたいので、$J(\Theta)$の偏導関数を計算する。

$$
\frac{\partial}{\partial\Theta_{i,j}^{(l)}}J(\Theta)
$$

計算するためにバックプロパゲーションというアルゴリズムを使用する。

まず$\\{(x^{(1)},y^{(1)})⋯(x^{(m)},y^{(m)})\\}$のようなm個のトレーニングセットを考える。

$\Delta_{i,j}^{(l)}:=0$とする。

step 1: $a^{(1)}:=x^{(t)}$

入力層の活性化ユニット$a^{(1)}$に対して$x^{(t)}$をセットする。

step 2: フォワードプロパゲーションを適用して$a^{(l)}$を計算する。レイヤー2,3...と最後のレイヤーまで。

step 3: トレーニングセットの出力$y^{(t)}$を使って、$\delta^{(L)}=a^{(L)}−y^{(t)}$、つまり誤差を計算する。

この時、$L$はレイヤーの合計で、$a^{(L)}$は最後のレイヤーの活性化ユニットの出力のベクトルである。そのため、最後のレイヤーの誤差は、単に最後のレイヤーの仮説が出力した値とトレーニングセット$y$の値の差でしかない。最後のレイヤーよりも前にあるレイヤーの$\delta$を取得するには、右から左に戻る。このことから誤差を右から左に伝播させるという意味でバックプロパゲーションと呼ばれる。

step 4: $\delta^{(l)}=((\Theta^{(l)})^T\delta^{(l+1)})\hspace{2pt}.∗\hspace{2pt}a^{(l)}\hspace{2pt}.∗\hspace{2pt}(1−a^{(l)})$を使って、それぞれの誤差である$\delta^{(L-1)}, \delta^{(L-2)},\dots,\delta^{(2)}$を計算する。$\delta^{(1)}$を計算しないのはレイヤー1は入力層のため誤差が存在しないから。

レイヤー$l$の$\delta$は、次のレイヤーの$\delta$にレイヤー$l$の$\Theta$行列を掛けることによって計算される。次に、$g'$関数を要素ごとに掛ける。これは入力$z^{(l)}$の活性化関数$g$の導関数である。$g'(z^{(l)})=a^{(l)}\hspace{2pt}.∗\hspace{2pt}(1−a^{(l)})$

step 5: $\Delta_{i,j}^{(l)}:=\Delta_{i,j}^{(l)}+a_j^{(l)}\delta_i^{(l+1)}$　もしくはベクトル化した $\Delta^{(l)} := \Delta^{(l)} + \delta^{(l+1)}(a^{(l)})^T$で$\Delta$行列をアップデートする。


```math
\begin{align}
D_{i,j}^{(l)}&:=\frac{1}{m}(\Delta_{i,j}^{(l)}+\lambda\Theta^{(l)}_{i,j})\hspace{4pt},if\hspace{4pt}j≠0\\
D_{i,j}^{(l)}&:=\dfrac{1}{m}\Delta_{i,j}^{(l)}\hspace{4pt},if\hspace{4pt}j=0
\end{align}
```

最終的に以下となる。

$$
\frac{\partial}{\partial\Theta_{i,j}^{(l)}}J(\Theta)=D_{i,j}^{(l)}
$$
HTML2（HTMLの要素と属性名と"属性値"）超初心者


HTMLというのは、具体的にはどんな形で書くのか。

HTMLには、要素以外にも、要素におまけをつける属性を書くことができる。

＜HTMLの要素と属性名と"属性値"＞
　　　　↑役割と担う　　↑文字コードとか。無いと文字化けしたりする

例えば・・・

<p class="apple">　これは、

<p class="apple">
↑p要素↑属性の名前↑りんご（この場合はなんでもいい）
この場合は、classって書くことで、
クラス属性を意味しているよってことになり、
p要素は段落を意味しているので
りんごの大きめの文字が作られて、必ず改行されるって意味になる。

書き方にも決まりがあって、
＊属性名＊
<p class="apple">
　　↑開始タグの中で、要素名のあとに、半角スペースを空けてかく。
＊属性値＊
<p class="apple">
　　　　　　↑＝のあと、""で囲んでかく。
※複数の属性は、半角スペースを空けてかく。

あとは、テキストエディタの中で、

⌘/（コマンドスラッシュ）を使うことで、

コメントアウト

っていう状態になり、その中の情報は反映されないので便利だっていうことを学びました！

今日のまとめ
HTMLの要素と属性名と"属性値"には書き方の決まりがある。
⌘/のコメントアウトは便利



＜参考＞
https://webliker.info/39533/
2019/06/25の備忘録

#　わからなかったこと

## 1.ダブルクォーテーションで囲んで実行したら

```
$ >
```

と返された

### 1. 閉じた時のダブルクォーテーションが全角入力だったので閉じてなかった
### 2. 閉じてない状態だと

```
$ >
```

で返されるので

```
$ >"
```

と半角でダブルクォーテーションを入力すれば

```
$ 今日の日付は??す。"
```
と返される

## 2.「ln -s」コマンドで作成したシンボリックリンクに「cd」コマンドで移動してもfileが見つからない

### 1.シンボリックリンクを作成してもリンク元の場所が存在していなければ表示されない

### 2.その上リンク元が存在していなくてもシンボリックファイルは作成される

### 3.なのでリンク元にファイルが存在するシンボリックファイルを作成すればいい

## 3.「vagrant up」コマンドを実行しても成功しない

[参考にさせていただいた記事](https://qiita.com/sudachi808/items/3614fd90f9025973de4b)

```terminal:home
//centos7ディレクトリに移動//
$ cd centos7/

//「status」コマンドで仮想マシンの状態を確認//
$ vagrant status

//仮想マシンを起動//
$ vagrant up

//状態を確認//
$ vagrant status

//起動した仮想マシンにログイン//
$ vagrant ssh

//仮想マシンを停止させる
$ vagrant halt
```

## 4.linuxのファイルを編集する方法がわからない

[参考にさせていただいた記事](https://eng-entrance.com/linux-command-vi)

```terminal
//ファイルを編集するページを開く//
//viは、Linuxの標準のエディタを起動するコマンド//
$ vi ファイル名

//編集できるようにする(入力モード)//
//現在のカーソルの位置に文字を挿入する//
iキー
aキー

//編集し終わったら//
//コマンドモードに戻る//
escキー

//ファイルを保存しviを終了する//
：wq enterキー

//編集モードが終わり元の画面に戻る//
```

## 5.「ls/etc」が実行されない

```
//lsの後にスペースを入力する//
ls /etc
```

#　その他参考にさせていただいた記事

[Linuxの逆引き時点](https://tech.nikkeibp.co.jp/it/article/COLUMN/20060224/230579/)

[Macでバックスラッシュを入力する方法]
(https://qiita.com/miyohide/items/6cb8967282d4b2db0f61）)

[Vagrantに「ssh 192.168.33.10」でパスワードなしログイン]
(https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/14/100733)

[Linuxの概要]
(https://anopara.net/2017/04/05/%e3%80%90linux%e5%85%a5%e9%96%80%e3%80%91linux%e3%82%92%e5%a7%8b%e3%82%81%e3%82%88%e3%81%86%ef%bc%81linux%e6%a6%82%e8%a6%81/)

[ls -lコマンドで表示されるtotalの意味]
(https://oshiete.goo.ne.jp/qa/239016.html)

[permission deniedで悩まされたので]
(https://qiita.com/takuyanin/items/18590600d077df707923)

[ディストリビューションとは]
(https://wa3.i-3-i.info/word12473.html)

[コンソール　とは]
(https://wa3.i-3-i.info/word12140.html)
node.jsで文字列のバイト数を簡単に把握する関数

## バイト数を求める

javascriptで文字列から、UTF-8でバイト数を求める方法を探してたらどのコードも大変そう、、、
たまたま見かけた、下記の関数がとても便利だったので、メモ。

`Buffer.byteLength`関数

第一引数に、引用元、第二引数に、文字コードの指定。

[公式サイト](https://nodejs.org/api/buffer.html)
変数と配列について調べる

変数の型
boolean	真偽（ true と false ）
integer	整数型
double	浮動小数点数型、float型のこと
string	文字列
array	配列
object	オブジェクト
resource	リソース
unknown type	不明

調べるにはgettypeを使う。
string gettype ( mixed $var ) 指定した変数の型を確認します。 
引数　$var 型を調べる変数を指定します。 
返り値　指定した変数の型を文字列（string型）で返す。

以下サンプル
gettype( 変数 )
ソースを表示印刷SyntaxHighlighterについて
<?php
$a = 1;
$b = 1.1;
$c = array( "PHP", "LANGUAGE", "WEB" );
 
echo gettype( $a ) . "\n";
echo gettype( $b ) . "\n";
echo gettype( $c ) . "\n";
?>

gettypeで出すと、指定した変数に対する型が表示される！
integer 1だから整数型ってこと
double 1.1だから浮動小数点数型
array arrayだから配列…？



変数とは？
値を入れておく箱のようなもの。
変数を利用して何かを作るときは、*変数の中の値を常に想像しながら作る。*
「*この変数には、こんな値が入ってくるはず*」というのが想像できないと、その変数を*どんなことに使えるのか予測できない*。


配列について調査

配列とは
データのかたまりのことを指すよ
変数が連続でかたまってる状態
一個の変数の中に複数の値が入ってるってこと

注意
・同じ型のものしか配列では扱えない
・同じ性質の値だけを入れるようにする
・箱(変数)の数は変えられない

配列の種類
インデックス配列　0からの数値
連想配列　任意の文字列
つまり数と文字の違い
node.jsを自動再起動させる、nodemonが最高

## 単にnodemonを導入したら、開発が一気に楽になったから紹介するだけ

-gでグローバルインストールしています。

```
// nodemonのインストール
$ npm install -g nodemon
```

これだけで、ソースコードを書き換える度に、サーバーの再起動の手間が無くなります。

app.jsを叩いてサーバーを起動させる場合。

```
// nodemonの起動
$ npx nodemon app
```
form_forについて 

# form_forについて 
## 構文の書き方

```haml:.haml
form_for(モデルオブジェクト , オプション) do |f|
  フォームコントロールの設置
```

## form_forが生成するフォームコントロール


check_box	:チェックボックス
color_field	:色の入力欄
date_field	:日付の入力欄
datetime_field	:日時の入力欄（グローバルタイム）
datetime_local_field	:日時の入力欄（ローカルタイム）
email_field	:emailアドレスの入力欄
fields_for	:form_forの中で別のモデルを指定したフォーム
file_field	:画像や文章などのファイルを選択するフォーム
hidden_field	:隠しフィールドの生成
label	:ラベルの生成
month_field	:月の入力欄
number_field	:数値入力欄
password_field	:パスワード入力欄
phone_field
telephone_field	:電話番号入力欄
radio_button	:ラジオボタンの生成
range_field	:範囲選択バー
search_field	:検索ボックスフォーム
text_area	:文字列入力欄
text_field	:文字列入力欄
time_field	:時間入力欄
url_field	:URL入力欄
week_field	:週の入力欄
submit	:送信ボタン

### 以上のようにフォームコントロールに設置するオプションと軽い説明を作成しました。
laravelをAWS EC2にデプロイする


#はじめに
vagrantなどのローカル開発環境で作成したlaravelプロジェクトをAWSのEC2上にデプロイする時に色々迷ったので、まとめとしてあげます。本番サーバにAWSを使ってみたいという方に見て頂ければと思います。


#環境
php7.2.18
apache2.4.39
laravel5.7
EC2(Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type 無料枠)
RDS(mysqlを使用)

#前提
・ローカルで開発したプロジェクトをすでにgithubにプッシュ済み
・EC2にSSH接続できている
・EC2からRDSへ接続できる設定ができている(セキュリティグループなど)

#PHP7.2インストール
```
インストールできるリスト確認
sudo yum list available | grep php72

インストール
sudo yum install -y \
  php72 php72-devel php72-fpm php72-gd php72-mbstring \
  php72-mysqlnd php72-pdo \
  php72-xml php72-json

インストール済みを確認
sudo yum list installed | grep php72

バージョン確認
php -v
```

#Mysqlインストール RDSとの接続
```
インストール
sudo yum -y install mysql

接続
mysql test_db -h <エンドポイント> -P 3306 -u test_user -p
```
#apacheインストール
```
sudo yum install -y httpd24
```
上記の流れでインストールを進めていると、なぜかすでにインストール済みと出た。
どこで入れたかわからなかった。
続きの設定を行っていく

```
wabサーバの起動
sudo service httpd start

システムがブートするたびにapacheが起動するよう設定
sudo chkconfig httpd on

有効か確認
chkconfig --list httpd
```

ドキュメントルートの権限変更

```
ユーザをapacheグループに追加
sudo usermod -a -G apache ec2-user

一旦ログアウト
exit

グループのメンバーシップを検証
groups

グループ所有権をapacheグループに変更
sudo chown -R ec2-user:apache /var/www

グループの書き込み許可追加
sudo chmod 2775 /var/www

サブディレクトにグループ ID を設定するには、/var/www とサブディレクトのディレクトリ許可
find /var/www -type d -exec sudo chmod 2775 {} \;

グループ書き込み許可を追加するには、/var/www とサブディレクトリのファイル許可を再帰的に変更します。
find /var/www -type f -exec sudo chmod 0664 {} \;
```

#Gitインストール

```
sudo yum install git
```

#composer自身のインストール

```
インストール
sudo curl -sS https://getcomposer.org/installer | php

パスを通す
sudo mv composer.phar /usr/local/bin/composer
```

#LaravelプロジェクトのClone

```
cd /var/www/html
git clone <URL>
```

#apacheのドキュメントルート設定

```
設定ファイルを開く
sudo vi /etc/httpd/conf/httpd.conf

以下に変更
DocumentRoot "/var/www/html/自分のlaravel_project/public

最終行に以下を追記
# .htaccess 有効化
<Directory /var/www/html/自分のlaravel_project/public>
    AllowOverride All
</Directory>

サービス再起動
sudo service httpd restart
```

#Laravelプロジェクトでcomposer インストール

```
cd /var/www/html/laravelプロジェクト
composer install
```

#config, routeのキャッシュクリア

```
php artisan config:cache
php artisan route:cache
```

#プロジェクトのパーミッション変更

```
chmod 777 storage -R
chmod 777 bootstrap/cache -R
```

#.envの設定
git cloneしたLaravelプロジェクトには.envファイルがないので、
composer insatallで作成された、.env.exsampleを使用する

```
cp .env.example .env
vi .env

APP_URL=http://IPアドレス ←サーバーのIPにする

DB_CONNECTION=mysql
DB_HOST=←RDSのエンドポイント
DB_DATABASE=データベース名
DB_USERNAME=RDS作成時のユーザ名
DB_PASSWORD=設定したパスワード

```

#キーを作成し、キャッシュをクリアする

```
php artisan key:generate
php artisan config:clear

```

#テーブル作成

```
php artisan migrate
```

#シンボリックリンクの作成
これは作成したアプリで画像アップロードしているような場合は必要かと思います。

```
php artisan storage:link
```

#ブラウザで確認する
あとはブラウザでEC２のIPアドレスを入力するだけです！
ここまでくればブラウザで正しく表示されるかと思います！


#参考
https://qiita.com/reflet/items/11ad79e01e808876caa1
https://nori-life.com/install-laravel-aws/
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html
https://qiita.com/takg/items/9a044b36cdf216a42ba6
https://qiita.com/nbapps_dev/items/9307e6fc0edb59c09181