OmniAICreator/Qiita-1.07M huggingface dataset:
October CMS (Laravel) 検索結果にページネーションを使う

WHEREでクエリ結果を絞り込んで、その結果をページネーションするところで、指定ページが効かないなど少しハマったのでメモ。（現在October CMSで使用しているLaravelは5.5なので、それ以降のLaravelバージョンでは挙動がもしかしたら違うかもしれない。）

ググると「`MyModel::paginate(10, ['*'])` でOK」みたいな情報はたくさん出てくるが、`WHERE`などで絞り込むときはどうするのか。
また、常に`WHERE`があるとは限らないので、`MyModel::where()`を使うのもキレイではない。
そして、取得するカラムも指定したい。

## うまくいった書き方

1. `MyModel::select($columns)`でクエリオブジェクトを作成する。
2. クエリオブジェクトに対して`where`メソッドでクエリ条件を必要に応じて追加する。
3. クエリオブジェクトで`paginate`メソッドでページネータを作成する。

下記はWeb APIのコントローラ内でクエリ処理を実施している例。

```php

public function list()
{
    $columns = [
        'id',
        'name',
        'description',
        'type',
    ];

    // Search conditions
    $name = Input::get('name');
    $type = Input::get('type');
    $page = Input::get('page');
    $perPage = Input::get('per_page', 15); // 15 is framework default

    // To specify columns, they must be specified in select().
    $query = MyModel::select($columns); // <- (1)

    if (!empty($name)) {
        $query = $query->where('name', 'like', '%'.$name.'%'); // <- (2)
    }
    if (!empty($type)) {
        $query = $query->where('type', '=', $type); // <- (2)
    }

    // For proper functionality of pagination, columns also passed to paginate()
    return $query->paginate($perPage, $columns, 'page', $page); // <- (3)
}
```

## ポイント：カラムの指定について
(1)の`MyModel::select($columns)`でカラムを指定しないと全てのデータが返される

(1)で指定していても(3)の`$query->paginate()`でも指定する必要がある。ここで指定しないとページ指定が効かないなどページネーションが正常に動作しない。

## 次ページ、前ページのURLの修正
ページネータは次ページや前ページのURLを提供してくれるが、GETパラメータで渡した検索条件を同様にこれらのURLには入れてくれないので自分で入れる必要がある。


上記の例で`return`で返しているページネータオブジェクトの`appends`メソッドでこれらのURLにGETパラメータを追加することができる。受け取ったのと同じパラメータをそのまま入れてやれば良い。

```php
// For proper functionality of pagination, columns also passed to paginate()
$paginator = $query->paginate($perPage, $columns, 'page', $page);

// Add query string to the next/prev URLs.
$queryParams = [
    'name' => $name,
    'type' => $type,
    'per_page' => $perPage,
];
if (!empty($queryParams)) {
    $paginator->appends($queryParams);
}

return $paginator;
```
都市名を市区町村コードに変換

都市名を市区町村コードに変換に変換する仕組みを作成します。
例として、埼玉県を取り上げます。

次のページからコピーペーストでテキストを取り出します。
>[埼玉県の市区町村コード一覧](https://ecitizen.jp/Sac/11)

```text:in01.txt
11100	さいたま市	さいたまし	111007
11101	　西区	にしく	111015
11102	　北区	きたく	111023
11103	　大宮区	おおみやく	111031
11104	　見沼区	みぬまく	111040
11105	　中央区	ちゅうおうく	111058
11106	　桜区	さくらく	111066
11107	　浦和区	うらわく	111074
11108	　南区	みなみく	111082
11109	　緑区	みどりく	111091
11110	　岩槻区	いわつきく	111104
11201	川越市	かわごえし	112011
11202	熊谷市	くまがやし	112020
11203	川口市	かわぐちし	112038
11206	行田市	ぎょうだし	112062
11207	秩父市	ちちぶし	112071
11208	所沢市	ところざわし	112089
11209	飯能市	はんのうし	112097
11210	加須市	かぞし	112101
11211	本庄市	ほんじょうし	112119
11212	東松山市	ひがしまつやまし	112127
11214	春日部市	かすかべし	112143
11215	狭山市	さやまし	112151
11216	羽生市	はにゅうし	112160
11217	鴻巣市	こうのすし	112178
11218	深谷市	ふかやし	112186
11219	上尾市	あげおし	112194
11221	草加市	そうかし	112216
11222	越谷市	こしがやし	112224
11223	蕨市	わらびし	112232
11224	戸田市	とだし	112241
11225	入間市	いるまし	112259
11227	朝霞市	あさかし	112275
11228	志木市	しきし	112283
11229	和光市	わこうし	112291
11230	新座市	にいざし	112305
11231	桶川市	おけがわし	112313
11232	久喜市	くきし	112321
11233	北本市	きたもとし	112330
11234	八潮市	やしおし	112348
11235	富士見市	ふじみし	112356
11237	三郷市	みさとし	112372
11238	蓮田市	はすだし	112381
11239	坂戸市	さかどし	112399
11240	幸手市	さってし	112402
11241	鶴ヶ島市	つるがしまし	112411
11242	日高市	ひだかし	112429
11243	吉川市	よしかわし	112437
11245	ふじみ野市	ふじみのし	112453
11246	白岡市	しらおかし	112461
11301	伊奈町	いなまち	113018
11324	三芳町	みよしまち	113247
11326	毛呂山町	もろやままち	113263
11327	越生町	おごせまち	113271
11341	滑川町	なめがわまち	113417
11342	嵐山町	らんざんまち	113425
11343	小川町	おがわまち	113433
11346	川島町	かわじままち	113468
11347	吉見町	よしみまち	113476
11348	鳩山町	はとやままち	113484
11349	ときがわ町	ときがわまち	113492
11361	横瀬町	よこぜまち	113611
11362	皆野町	みなのまち	113620
11363	長瀞町	ながとろまち	113638
11365	小鹿野町	おがのまち	113654
11369	東秩父村	ひがしちちぶむら	113697
11381	美里町	みさとまち	113816
11383	神川町	かみかわまち	113832
11385	上里町	かみさとまち	113859
11408	寄居町	よりいまち	114081
11442	宮代町	みやしろまち	114421
11464	杉戸町	すぎとまち	114642
11465	松伏町	まつぶしまち	114651
```

JSONに変換します。

```bash
./code_city.py in01.txt code_cities.json
```

```py:code_city.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	code_city.py
#
#					Apr/04/2020
#
# ------------------------------------------------------------------
import	sys
import	os
import	json
#
# ------------------------------------------------------------------
def file_write_proc(file_name,str_out):
#
	fp_out = open(file_name,mode='w',encoding='utf-8')
	fp_out.write(str_out)
	fp_out.close()
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
file_in = sys.argv[1]
json_out = sys.argv[2]
sys.stderr.write(file_in + "\n")
sys.stderr.write(json_out + "\n")
#
fp_in = open(file_in,encoding='utf-8')
lines = fp_in.readlines()
fp_in.close()
#
dict_aa = {}
for line in lines:
	cols= line[:-1].split ('\t')
	key = cols[1].strip()
	value = cols[0]
	dict_aa[key] = {"code": value}
#
out_str = json.dumps(dict_aa)
file_write_proc(json_out,out_str)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

変換の動作確認

>```text
$ jq .\"川越市\" code_cities.json
{
  "code": "11201"
}
```

>```text
$ jq .\"熊谷市\" code_cities.json
{
  "code": "11202"
}
```

>```text
$ jq .\"川口市\" code_cities.json
{
  "code": "11203"
}
```
C言語　ALDS1_3_A　Stack

##問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_A&lang=ja

##要点
- 逆ポーランド記法
    - 演算子をオペランドの後に記述する数式やプログラムを記述する記法。
    - (1+2)*(5+4)は 1 2 + 5 4 + *と記述される。

###スタックを使って処理する
スタックの基本操作と制約

- push(x)　スタックの頂点に要素Xを追加します。
- pop()　スタックの頂点から要素を取り出す。
- isEmpty()　スタックが空かどうかを調べます。
- isFull()　スタックが満杯かどうかを調べます。

データの中で最後に入ったものが最初に取り出される。pop()によって取り出される要素は、最後にpushされた要素。

スタックの実装
スタックやその他のデータ構造の実装には配列やリストを使ったものなどいくつかの方法がある。今回は整数型のデータが格納されるスタックを配列を用いて実装する。

###必要な変数と関数
- データを格納するための整数型1次元配列 :S
- スタックポインタを表す整数型変数 :top
    - topは最後の要素が格納されている場所を指す。
    - またtopの値はスタックの要素数に等しくなる。
- スタックに要素xを追加する関数  push(x)
    - topを１つ増やし、S[top]にxを代入する。
- スタックのトップから要素を取り出す関数  pop()
    - S[top]の値を返し、topを１つ減らす。



##コード

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int top, S[1000];

void push(int x)
{
    top++;
    S[top] = x;
}

int pop(void)
{
    top--;
    return S[top + 1];
}

int main(void)
{
    int a, b;
    top = 0;
    char tmp[10]; //10^6の数が入ればいい

    while ( scanf("%s", tmp) != EOF )
    {
        if (tmp[0] == '+')
        {
            a = pop();
            b = pop();
            push(a + b);
        }
        else if (tmp[0] == '-')
        {
            b = pop();
            a = pop();
            push(a - b);
        }
        else if (tmp[0] == '*')
        {
            a = pop();
            b = pop();
            push(a * b);
        }
        else
        {
            push(atoi(tmp));
        }
    }
    printf("%d\n", pop());
    return 0;
}
```
##ポイント
スペースが入っている文字列の入力は下記でやる。標準入力では、ファイルの終わりというものが存在しないので、ずっと処理待ち状態になる。

Ctrl + Dとかで抜けられる


```c
while ( scanf("%s", tmp) != EOF )
```


##所感

- だらだらやってしまった。
- EOFのところ、詰まってしまったがteratailで調べたら出てきた。
- また一度やり直す。

所要時間 90分


【復習】

- 2020/04/05
    - 記号と数字どちらでも取れるscanf("%s",s)を使う
    - 記号から判断して、数値を処理する
    - pop,pushの中も考える
    - 実装なし
IEのwebsocet同時接続数は6

よく知られているWebSocket 
チャットやリアルタイム性の強いアプリなどに使われる技術

## 実はブラウザにより最大同時接続数が異なる？
異なります。
- Chrome:255接続
- Firefox:200接続
- IE11:6接続　（最大128接続）
https://postd.cc/websockets-caution-required/

つまり、通常chromeでは255もの同時接続が出来るのだが、IEではデフォルトでは最大6接続のみしか同時接続ができないのだ。

## IE11の最大WebSocket数の設定変更方法
・winodws
　①タスクバーの検索フォーム、もしくはウィンドウズキーを押下後「gpedit.msc」と入力（Microsoft Common Console Document）
　
　②ローカルコンピューターポリシー → 管理用テンプレート → Windowsコンポーネント → Internet Explorer → セキュリティの機能 → AJAX
　「サーバーあたりの最大WebSocket接続数を設定する」を選択

　③ポリシー設定をクリックし、有効にチェックをつけ最大接続数を変更する。

https://www.tomoroh.net/archives/2219/

## 変更する影響
→特になし（最大数変更するだけなので。。）
中華DAPとかで.mp4とかを簡単にREN(拡張子変更)

# 常識的な知識だと思いますが for Windows
この間、ある中華DAPを使っている知り合いが、「.mp4を.m4aに変換するの面倒くさい」と言ってきた。
どの様にしていたのかと問うと、エクスプローラー上で右クリックしてわざわざ名前の変更とやっていたので、その方法だとクソ面倒くさいので知らない方のためにメモ。
Windows使い魔だと常識的な範囲だと思うので、無視で。
鼻で笑ってください
#拡張子変更はやっぱりREN
拡張子変更する際、cmd使い魔はren。renameコマンド。

```ruby:cmd.exe
ren hoge.txt hoge.html
```

#cmdを開かずできるよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/2700bf9d-c323-a42a-65e8-fd76bee45c12.png)

これは自分の中華DAPなんですが。
MP4ファイルフォーマットについてですが、
拡張子で.mp4は基本的にビデオに対して使う拡張子なので、オーディオは.m4aを使用。
ウォークマンとかだったら.mp4のまま再生できるのですが、中華DAPはほとんどできないみたいですね。
拡張子を変更するのにエクスプローラー、cmd両方使わなくても・・・

#### 1. エクスプローラーで対象ファイルのフォルダを開く
#### 2. アドレスバーに `cmd /c ren *.mp4 *.m4a` と入力
#### 3. .mp4が.m4aになる

#知らない方が多いらしい
.mov → .mp4でも使えるんで
cssのmargin:autoの学習

【やったこと】
　①Webサイト[『ほんっとにはじめての HTML5 と CSS3』](http://honttoni.blog74.fc2.com/)の記事[『【11-2】marginの auto という値の「？」を解決しておこう』](http://honttoni.blog74.fc2.com/blog-entry-229.html)を学習

【わかったこと】
　- margin: auto; で左右を中央に配置できる。ただしwidthの指定が必要
　- 左右のいずれかに(例 margin:1em 1em 1em auto;)具体値がある場合は自動計算する
　- 左右に同じ値をいれることで同様に中央に配置できる
　- 上下は中央に配置できない
　- 上下にautoを設定すると0になる

【補足】
 　項目『縦方向のセンター合わせは display:table-cell で』については未学習です
プログラマ脳を鍛える数学パズルQ02「数列の四則演算」

#問題概要
4桁の数字の間に四則演算の演算子を入れて計算した結果が、元の数の桁を逆から並べた数字になるものをみつける。

#Code
```
ops = [("*", "", ""), ("", "*", ""), ("", "", "*"), ("*", "*", ""),("", "*", "*"),("*", "", "*"),("*", "*", "*"),]
for i in range(1000, 10000):
    s = str(i)
    for t in ops:
        f = s[0] + t[0] + s[1] + t[1] + s[2] + t[2] + s[3]
        try:
            if eval(f) == int(str(i)[::-1]):
                print(f)
        except: # "1*001"みたいなやつはパス
            pass
```

#補足
文字列を逆にする
`str[::-1]`

#ToDo
exceptで逃げるのはよくないかなあ。
（3）マウスボタンを押した後の処理 GetMouseButton

##GetMouseButton簡単らしいけど、自分よく分かっていなっかたのでネットで調べたまとめと、疑問に思った事を少し実験。

Input.GetMouseButtonは、基本マウスボタンが押されているかどうかを返す。
でも押すだけじゃなくて、押し続ける、離す、左クリック、右クリック、中クリックで条件を変えて処理も変える事が出来る。

##マウスを押したり、離したり
1) GetMouseButton **空白**
　マウスクリックしている間

2) GetMouseButton **Down**
　マウスクリックした時

3) GetMouseButton **Up**
　マウスボタンが離れた時

👆個人的に「Wクリック」が気になる。。

ネット調べた結果無いのかも。。でもあった。
[Unityでシングルクリック（タップ）/ダブルクリック（タップ）のイベントを使い分ける](https://qiita.com/morio36/items/3de164d6131c902af9bd)


##マウスボタンで差別化
~~1) Input.GetMouseButtonDown~~
　~~マウスをクリックした時~~
　👆どれでも、入力を受け付けるって事かな？
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/a1a1e799-9448-ecde-4434-85739ea6c4ee.jpeg)

読み間違えた？これはない。0、1、2のどれか。

1)Input.GetMouseButtonDown(0)
　**左**クリックの時

2)Input.GetMouseButtonDown(1)
　**右**クリックの時

3)Input.GetMouseButtonDown(2)

　**中**クリックした時
　👆ホイールの事かな？

```csharp
        if (Input.GetMouseButtonDown(2))
        {
            Debug.Log("入力受付中");
        }
```
ホイール押下すると正解
![キャプチャ01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232643/953ffdb1-a5ad-b693-9241-5b807ce9f07d.jpeg)




##その他
・GetMouseButtonDownはInputクラスの関数の一つ
・bool型で返ってくるので、基本的にif文の条件式として使用するのが良い

##何を覚えたか？
・Input.GetMouseButtonは押したり、離したりする動作や、左クリック、右クリックなどのボタンで設定する。
・基本if文でbool型で返ってくるので「押されたら」などで使う。
・Wクリックも頑張れば実装可能。やってないけど。。

###参考にさせて頂いたサイト
[【Unity】マウスクリックを検知する方法は？GetMouseButtonDownの使い方]
(https://xr-hub.com/archives/4181)
[スクリプトリファレンス](https://docs.unity3d.com/ja/current/ScriptReference/Input.GetMouseButton.html)
[【Unity】１分でわかる！マウス関連する３つのメソッド](https://miyagame.net/mouse-method/)
[【Unity】マウスが左・右クリックされたときの処理を設定できるメソッド](https://miyagame.net/mouse-click/)
PHPがない環境でEmacsでPSR2のflycheckを使用する

Dockerを使って開発している場合、Emacsエディタが動いている環境にPHPがインストールされていない場合もよくあると思います。
EmacsでPSR2のflycheckを使って文法チェックを動かすためには、phpcsコマンドが使える必要があるので、わざわざPHPからインストールするのかという問題が出てきます。

それを避けるために、phpcsのDockerコンテナを使ってEmacsでflycheckを動かす方法を紹介します。
※ Docker等のインストールは完了していることが前提となります。
※ Docker化によるオーバーヘッド等の検証はまだ行っておりません。

# 環境

Ubuntu: 18.04 / 20.04
Docker: 19.03 / 20.10
Emacs: 25.2 / 26.3

※ 確認できた環境は逐次追加しています。

# セットアップ

以下の内容のファイルを作成します。

```:/usr/local/bin/phpcs
#!/bin/bash
docker run -i -v $(pwd):$(pwd) -w=$(pwd) --rm phpqa/phpcs $@
```

実行権限を与えます。

```bash
chmod 755 /usr/local/bin/phpcs
```

動作確認します。

```bash
phpcs --version
```	

これでEmacsが正しく設定されていればflycheckが正しく動作するようになるはずです。

# 参考

ここでは細かい.emacs側の設定はスキップしますが、参考までにこのようにflycheckを有効化しています。

```:.emacs
(add-hook 'php-mode-hook
          '(lambda ()
             (setq flycheck-phpcs-standard "PSR2")
             'php-enable-psr2-coding-style
             ))
(add-hook 'after-init-hook #'global-flycheck-mode)
```
エラー「...mysql2/client.rb:90: [BUG] Segmentation fault at 0x00000000000000」に苦しんだ

エラー「...mysql2/client.rb:90: [BUG] Segmentation fault at 0x00000000000000」
で非常に苦しみました。
改善したので、メモしておきます。



Rails　sはできるが、どこかページを読み込もうとしようと、エラーが発生します。

改善の参考になった記事は、下記になります
[エラー「...mysql2/client.rb:90: [BUG] Segmentation fault at 0x00000000000000」（セグフォ/セグメンテーション違反）に対応した](https://kanamaru.hateblo.jp/entry/2019/05/18/222232)
これでmysqlをアンインストールします。

mysqlの再インストール方法は、自分の環境構築方法である
[VS codeの初期設定とRuby on Railsの環境設定](https://qiita.com/mylevel/items/8e0d91f625e1daa8720b)のMysqlの構築をしました。

しかし、
エラー「Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)」が表示されました

この対応方法は下記のサイトが有効でした
https://note.com/shoki_rails/n/nf7b51ba48084

```
$ bundle exec gem uninstall mysql2
> 3ですべてのバージョンを削除する
$ bundle install
$ rails s
＞改善
```
Perl による next_permutation の実装と AGC022 A

# はじめに
*[AtCoderは、オンラインで参加できるプログラミングコンテスト(競技プログラミング)のサイトです。リアルタイムのコンテストで競い合ったり、約3000問のコンテストの過去問にいつでも挑戦することが出来ます。](https://atcoder.jp/home)* では、時々、順列生成が必要な問題が出題されます。
***Perl*** には標準モジュールとして、**next_permutation** が準備されていないので、自作により対応します。
# Perl による実装
```num.pl
my $next_perm = sub {
  my $t = shift;
  my $f = -1;
  for my $i (0..length($t)-1) {
    if (ord(substr($t, length($t)-1-$i, 1)) > ord(substr($t, length($t)-2-$i, 1))) {
      $f = length($t) - 2 - $i;
      last;
    }
  }
  return -1 if $f == -1;
  my @w = split '', substr($t, $f+1);
  my @x = sort {$a cmp $b} grep {ord($_) > ord(substr($t, $f, 1))} @w;
  my $r = shift @x;
  push @w, substr($t, $f, 1);
  @w = sort {$a cmp $b} grep {ord($_) != ord($r)} @w;
  return substr($t, 0, $f).$r.join('', @w);
};
```
*ord* 関数を使用することにより、数字・文字の両方に対応しています。

```sample1.pl
print $next_perm->(13542);  # => 14235
print $next_perm->('CAEDB'); # => CBADE
```
*while* ループで **-1** が返るまで回すこともできます。

```while.pl
my $ans = 1234;
while ($ans != -1) {
  print $ans, "\n";
  $ans = $next_prem->($ans);
}
 # => 1234
 .
 .
 # => 4321
```
# A - Diverse Word
*[AGC 022 A - Diverse Word](https://atcoder.jp/contests/agc022/tasks/agc022_a)*

```perl.pl
use v5.18; # strict say state
use warnings;
use List::Util qw(reduce first max min sum0);

chomp (my $s = <STDIN>);
my $next_perm = sub {
  my $t = shift;
  my $f = -1;
  for my $i (0..length($t)-1) {
    if (ord(substr($t, length($t)-1-$i, 1)) > ord(substr($t, length($t)-2-$i, 1))) {
      $f = length($t) - 2 - $i;
      last;
    }
  }
  return -1 if $f == -1;
  my @w = split '', substr($t, $f+1);
  my @x = sort {$a cmp $b} grep {ord($_) > ord(substr($t, $f, 1))} @w;
  my $r = shift @x;
  push @w, substr($t, $f, 1);
  @w = sort {$a cmp $b} grep {ord($_) != ord($r)} @w;
  return substr($t, 0, $f).$r.join('', @w);
};
my $ans;
if (length($s)==26) {
  $ans = $next_perm->($s);
} else {
  my %h;
  $h{$_}++ for ('a'..'z');
  $h{$_}++ for split('', $s);
  my @w = sort {$a cmp $b} grep {$h{$_}==1} keys %h;
  $ans = $s . $w[0];
}
say $ans;
```

# まとめ
+ **next_permutation** を自作した

参照したサイト
*[Javaでnext_permutationメソッドを作ってみる](https://jpliterature.hatenablog.com/entry/java-next-permutation)*
*[Perl と Ruby で解く AtCoder ABC146 B - ROT N](https://qiita.com/superrino130/items/27d05bd37a768d90d1ec)*
GitHubの使い方メモ

開発しているサービスを[GitHub](https://github.com/)で管理していても、すぐGitコマンドを忘れてしまうので、メモ。

# 初期設定（レポジトリを作成）
[GitHub](https://github.com/)にログインしたら、左上の緑のボタン「New」で新しくレポジトリというものを作成。
<img width="549" alt="スクリーンショット 2020-04-03 午後7.05.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/1f65cafc-352c-b66d-876d-9ab6f877412e.png">
レポジトリの名前は必ず入力。あとは一旦無視してもあとで追加できるので、下の「Create repository」で作成。
<img width="730" alt="スクリーンショット 2020-04-03 午後7.09.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/09c2720a-5a64-0bb2-70d6-9d9818c90148.png">
↓このページが出ていればOK!
<img width="1280" alt="スクリーンショット 2020-04-04 午前11.50.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/17678718-e404-13a7-bf50-95dd90db2474.png">

## コードをGitHubに追加

Visual Studio Codeを開き、赤い部分にコマンドを打って行きます。（Windowsの人は、[別途設定](https://prog-8.com/docs/git-env-win)必要）
※下は、Visual Studio Codeを使った例
<img width="1280" alt="スクリーンショット 2020-04-03 午後7.21.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/dcd101d4-bb7d-3d2c-6271-e05aacb3a181.png">

赤く囲った部分に、下記のコマンドを順番に打って行きます。

```terminal
$ git init 
$ git add .
$ git commit -m "first commit" 
$ git remote add origin https://github.com/TakayukiNJ/YnoSDGs.git
$ git push -u origin master
```

↓Visual Studio Codeはこんな感じに表示されていればOKで、
<img width="1280" alt="スクリーンショット 2020-04-04 午前11.56.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/55fd04ae-a692-edd7-8575-d82d5e51dc77.png">
↓GitHubに戻ってリロードします。こんな感じに表示されていれば成功です。
<img width="1280" alt="スクリーンショット 2020-04-04 午後0.01.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/0dcf9319-bfc5-6d9c-2c74-c352b894c682.png">

# 編集内容をGitHubに反映する方法
コードを書き直したり、画像を追加したりした時、GitHubのコードも最新にしたいですよね。
以下のコマンドを順番に打って行きます。

```terminal
$ git add .
$ git commit -m "変更内容をここに記述" 
$ git push -u origin master
```

↓Visual Studio Codeはこんな感じに表示されていればOKで、
<img width="1280" alt="スクリーンショット 2020-04-04 午後0.07.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/0a20220b-d8c1-3470-d825-b95fc065247d.png">
↓GitHubに戻ってリロードします。こんな感じに表示されていれば成功です。
<img width="1280" alt="スクリーンショット 2020-04-04 午後0.11.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/3c5e27be-5cc1-ff58-2bf2-44a817dcf4bc.png">
AWS CodeCommitを利用してソースコードを管理する

# はじめに

AWS CodeCommitは、AWS上でソースコード管理が出来るサービスです。


# 前提条件

- Python
 - pip 
 - git-remote-codecommit
- Git
- AWS CLI v2

# 設定手順

基本以下の手順通りですが、IAMのユーザ作成はアクセス権の付与が分かり辛かったです。

- [git-remote-codecommit を使用した AWS CodeCommit への HTTPS 接続の設定手順](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-git-remote-codecommit.html#setting-up-git-remote-codecommit-connect-console)


最初以下の注記から、**AWSKeyManagementServicePowerUser**のアクセス権も付与していましたが、検証したところ必要なかったです。
> 注記
CodeCommit には AWS Key Management Service が必要です。既存の IAM ユーザーを使用している場合は、CodeCommit で必要な AWS KMS アクションを明示的に拒否するユーザーにポリシーがアタッチされていないことを確認します。詳細については、「AWS KMS および暗号化」を参照してください。

おおまかな流れは以下の通りです。

| 項番 | 手順 | インストール |
|:-:|:-:|:-:|
| １ | CodeCommit用のIAMユーザの作成 | [IAMコンソール](https://console.aws.amazon.com/iam/) |
| ２ | AWS CLIをインストール | [Windows版](https://awscli.amazonaws.com/AWSCLIV2.msi) |
| ３ | git-remote-codecommitをインストール  | pip install git-remote-codecommit |
# IAMユーザの追加

## AWS CodeCommit用のユーザを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/a761d99f-1131-9682-2f8c-0f01d50a577b.png)

## AWS CodeCommit用ユーザにアクセス権を付与する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/d13dd501-d92f-d785-eb59-259b8c881cea.png)

## タグの追加(オプション)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/ad9c74ea-04c7-2cb6-a9ae-67c8958f6d99.png)

## ユーザを追加 -成功-

![aws_codecommit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/f9f97b80-612f-f08a-8dc2-bd1f31fc7280.png)


# AWS CLIを設定する

```text:東京リージョンの入力例
C:\AWS> aws configure
AWS Access Key ID [None]:IAMユーザ作成時に生成されたAccess Key ID
AWS Secret Access Key [None]:IAMユーザ作成時に生成されたSecret Access Key
Default region name [None]:ap-northeast-1
Default output format [None]:json
```

# git-remote-codecommitをインストールする

```text:
C:\AWS> pip install git-remote-codecommit
```


# おわりに

- AWS上でソースコード管理が出来るようにはなれた。
- 次は、デプロイの仕方かな。
[Microsoft] CLIから始めるSQL Server

# これはなに？

docker pullしてrunしたはいいけれど、SQL Server Management Studio (通称SSMS)がないゆえに、CLIからSQL Serverを使うことになった男のメモです。

# 接続

```console
sqlcmd -H ホスト名 -U ログインID -P パスワード
```

データベースを指定する場合は`-d データベース名`をつける

例）

```console
sqlcmd -H localhost -U sa -P password2020! -d mydb
```

# SQLファイルを読み込み

```console
sqlcmd -H ホスト名 -U ログインID -P パスワード -i ファイル名
```

ファイルがいくつもある場合は、こんな感じでどうでしょうか。bash/zsh使いのひと用です。

```zsh
for a in *.sql; do
  sqlcmd -H ホスト名 -U ログインID -P パスワード -i "$a"
done
```

`xargs`のほうがいいかもしれません。

```zsh
ls -1 *.sql | xargs -I% sqlcmd -H ホスト名 -U ログインID -P パスワード -i %
```

ファイル名にバージョン番号がついている（例えば、migration-1.0.0.sqlとか）場合は、`sort --version-sort`で並べ直すと幸せになれます。


# （おまけ） Dockerから始めるSQL Server

Macのひとは、[Docker Desktop](https://www.docker.com/products/docker-desktop)をインストールします。

[Docker hub](https://hub.docker.com/_/microsoft-mssql-server)を参照して、好みのバージョンのSQL Serverをpullします。

下記は2017を落とす場合です。

```console
docker pull mcr.microsoft.com/mssql/server:2017-latest
```

コンテナを起動します。
**mssql**という名前をつけました。
カレントディレクトリを`/mnt`にマウントして、コンテナ内から見えるようにしました。

```console
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=password2020!' -p 1433:1433 --name mssql -v "$PWD:/mnt" -d mcr.microsoft.com/mssql/server:2017-latest
```

`sqlcmd`コマンドはこのように実行します。
作業ディレクトリを`/mnt`にしています。

```console
docker exec -it -w /mnt mssql /opt/mssql-tools/bin/sqlcmd
```
（なんでPATH通ってないんや。。。）

# （おまけその2） SQLから始めるSQL Serverデータベース

データベースを作ったり、ユーザーを作ったりするSQLは別記事に書きました。

[[Microsoft] SQLから始めるSQL Serverデータベース](https://qiita.com/sengoku/items/d628d0ac50ef54da4268)
Python＆機械学習 勉強メモ④：バックプロパゲーションによる機械学習

#はじめに
① https://qiita.com/yohiro/items/04984927d0b455700cd1
② https://qiita.com/yohiro/items/5aab5d28aef57ccbb19c
③ https://qiita.com/yohiro/items/cc9bc2631c0306f813b5
の続き

- 参考教材：[Udemy みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習](https://www.udemy.com/course/learning-ai/)
- 課題設定：緯度・経度を与えると、東京・神奈川のどちらに属するかを判定するプログラムを作成する.
- 判定方法：入力層2つ・中間層2つ・出力層1つのニューラルネットワークで判定する。

#バックプロパゲーションによる機械学習
出力層のニューロンの重みは、出力と正解の誤差を元に調整する。
また、出力層のニューロンの重みを元に、中間層のニューロンの重みを調整する。

#中間層-出力層の重みの調整
中間層-出力層の重みの調整は以下の式で得られる

```math
\delta_{mo} = (出力値 - 正解値) \times 出力の微分 \\
修正量 = \delta_{mo} \times 中間層の値 \times 学習係数
```

##シグモイド関数の微分
上記式の「出力の微分」について、今回のニューラルネットワークの活性化関数に用いているシグモイド関数$f(x) = \frac{1}{1+e^x}$の微分は以下の式で得られる。

```math
f(x)' = f(x)\cdot(1-f(x))
```

参考：https://qiita.com/yosshi4486/items/d111272edeba0984cef2

##ソースコード

```python
class NeuralNetwork:
    # 入力の重み
    w_im = [[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]]  # [[i1-m1, i1-m2], [i2-m1, i2-m2], [bias1-m1, bias1-m2]]
    w_mo = [1.0, 1.0, 1.0]  # [m1-o, m2-o, bias2-0]
    # 各層の宣言
    input_layer = [0.0, 0.0, 1.0] # i1, i2, bias1
    middle_layer = [Neuron(), Neuron(), 1.0] # m1, m2, bias2
    ouput_layer = Neuron() # o

    def learn(self, input_data):

        # 出力値
        output_data = self.commit([input_data[0], input_data[1]])
        # 正解値
        correct_value = input_data[2]
        # 学習係数
        k = 0.3

        # 出力層 → 中間層
        delta_w_mo = (correct_value - output_data) * output_data * (1.0 - output_data)
        old_w_mo = list(self.w_mo)
        self.w_mo[0] += self.middle_layer[0].output * delta_w_mo * k
        self.w_mo[1] += self.middle_layer[1].output * delta_w_mo * k
        self.w_mo[2] += self.middle_layer[2] * delta_w_mo * k
```

#入力層-中間層の重みの調整
入力層-中間層の重みの調整は以下の式で得られる。
後段ニューロンの調整結果をもとに前段ニューロンの重みを調整する方式にすることで、層がいくつであっても調整が可能。

```math
\delta_{im} = \delta_{mo} \times 中間出力の重み \times 中間層出力の微分 \\
修正量 = \delta_{im} \times 入力層の値 \times 学習係数
```

##ソースコード
```python
class NeuralNetwork:
        ...
        # 中間層 → 入力層
        delta_w_im = [
            delta_w_mo * old_w_mo[0] * self.middle_layer[0].output * (1.0 - self.middle_layer[0].output),
            delta_w_mo * old_w_mo[1] * self.middle_layer[1].output * (1.0 - self.middle_layer[1].output)
        ]
        self.w_im[0][0] += self.input_layer[0] * delta_w_im[0] * k
        self.w_im[0][1] += self.input_layer[0] * delta_w_im[1] * k
        self.w_im[1][0] += self.input_layer[1] * delta_w_im[0] * k
        self.w_im[1][1] += self.input_layer[1] * delta_w_im[1] * k
        self.w_im[2][0] += self.input_layer[2] * delta_w_im[0] * k
        self.w_im[2][1] += self.input_layer[2] * delta_w_im[1] * k
```

#学習結果
学習データとして以下を用意する
![learning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571638/2d2c5012-2a39-94e6-8d2a-fc1953f71ad5.png)

上記で学習させたニューラルネットワークに以下のデータを放り込むと・・・

```python
data_to_commit = [[34.6, 138.0], [34.6, 138.18], [35.4, 138.0], [34.98, 138.1], [35.0, 138.25], [35.4, 137.6], [34.98, 137.52], [34.5, 138.5], [35.4, 138.1]]
```

東京・神奈川どちらに分類されるかを判定できていることがわかる

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571638/baa1e8cd-4e44-94a3-abbb-5b952d202a46.png)
Laravelではモデルはコマンドで作る。Base table or view not found: 1146 Table 'XXXX' doesn't existの対応

Laravelに慣れてきた（初心者レベルで）と調子に乗ってたら、ハマって意外と知らなかった基礎知識があったので、自分のためにメモ。

サクサクとデータベースやらモデルやらを作っていたら、明らかにテーブルなどが合っているのに、

Base table or view not found: 1146 Table 'ZZ.XXXX' doesn't exist

というエラー。

調べると「テーブルがありません」というエラーのよう。
合ってるはずなのに、なぜか「zz.」と文字列が付与される。

結論、Laravelではartisanコマンドでモデルを作った時にテーブル名が定義されるようで、今回は他のモデルをコピーして作ってしまったので、Laravel側でテーブル名が定義されていなかったという事象。

「zz.」は、Laravelの親ディレクトリの名前でした。

https://qiita.com/igz0/items/d14fdff610dccadb169e

コントローラーやマイグレーションファイルも、コピーして作った方が早いのでつい作っていましたが、きちんとartisanコマンドで作らないと、知らないところで同じような事故の元が増えそう。
今後は、面倒くさがらずにコマンドで各ファイルを作ることにします。
ZoneMinder インストール方法


taskselのインストール
※次のlamp-serverインスコのためtasksel導入しましょう
sudo apt -y install tasksel
lamp-serverの導入
sudo tasksel install lamp-server
このままだと動かないので古いverのPHP追加
リポジトリ追加

```
sudo add-apt-repository ppa:ondrej/php
sudo apt update
php7.2と必要群
sudo apt install -y php7.2 php7.2-common 
php7.2-cli php7.2-fpm php7.2-mysql php7.2-dev php7.2-mbstring php7.2-zip

nano /etc/apt/sources.listに追加
deb http://archive.ubuntu.com/ubuntu bionic main multiverse restricted universe
deb http://archive.ubuntu.com/ubuntu bionic-security main multiverse restricted universe
deb http://archive.ubuntu.com/ubuntu bionic-updates main multiverse restricted universe
```


権限の昇格
”sudo su -”

zoneminderインストール用シェルの作成

```
#!/bin/sh
clear
read -p "This script installs Zoneminder 1.32.x on Ubuntu 18.04 AMD64 with LAMP (MySQL) installed...
Press Enter to continue or Ctrl + c to quit" nothing
clear
read -p "You must be logged in as root using sudo su ...
Press Enter to continue or Ctrl + c to quit" nothing
clear
read -p "Next we will add the PPA repository, install and configure the system to run Zoneminder. 
Press enter to continue" nothing
apt install -y software-properties-common
clear
add-apt-repository ppa:iconnor/zoneminder-1.32
apt update
clear
awk '$0="date.timezone = "$0' /etc/timezone >> /etc/php/7.2/apache2/php.ini
clear
apt install -y zoneminder
systemctl enable zoneminder
service zoneminder start
adduser www-data video
a2enconf zoneminder
a2enmod rewrite
chown -R www-data:www-data /usr/share/zoneminder/
service apache2 reload
clear
read -p "Install complete.Press enter to continue" nothing
clear
```

アクセス権の変更
"chmod 755 zm-install"

シェルの実行
"./zm-install"
→確認が来るので[Enter]を入力
4回確認が来ますので[Enter]キーを押下します。

後は
192.168.x.x/zmでアクセスすればおｋです
Installing the AWS Tools for PowerShell on Windows メモ

# Powershell 7 に AWS Tools インストール

モジュールのインストール状態の確認
※出力結果はインストール後の状態です。

```
PS> Get-Module -ListAvailable


    Directory: C:\Users\%username%\Documents\PowerShell\Modules

ModuleType Version    PreRelease Name                                PSEdition ExportedCommands
---------- -------    ---------- ----                                --------- ----------------
Binary     4.0.5.0               AWS.Tools.Common                    Core,Desk {Clear-AWSHistory, Set-AWSHistoryConfigu…
Script     1.0.1.0               AWS.Tools.Installer                 Core,Desk {Uninstall-AWSToolsModule, Install-AWSTo…
Binary     4.0.5.0               AWSPowerShell                       Desk
Binary     4.0.5.0               AWSPowerShell.NetCore               Desk
Script     5.3.0                 Azure                               Desk      {Get-AzureAutomationCertificate, Get-Azu…
Script     4.6.1                 Azure.Storage                       Desk      {Get-AzureStorageTable, New-AzureStorage…
Script     5.8.3                 AzureRM.profile                     Desk      {Disable-AzureRmDataCollection, Disable-…
Script     2.2.3                 PowerShellGet                       Desk      {Find-Command, Find-DSCResource, Find-Mo…

    Directory: C:\program files\powershell\7\Modules
```
比例ハザードモデル

```{r}

#Cox比例ハザードモデル　中村剛著：医学統計学シリーズ

library(dplyr);library(dummies);library(survival)

data(kidney)

kidney=data.frame(kidney)

delta=kidney$status

kidney=kidney[order(kidney$time),]

disease=dummy(kidney$disease)

kidney=kidney%>%select(-c(disease,id))

kidney=data.frame(kidney,disease)


ite=1000

eta=0.0001

beta=rep(0.1,ncol(kidney)-2)

num=sort(unique(kidney$time))

log_lik=0;log_lik_pre=-100

for(l in 1:ite){
  
if(abs(log_lik-log_lik_pre)>0.01){
  
log_lik_pre=log_lik  
  
dl=rep(0,length(beta))

dl2=array(0,dim=c(length(beta),length(beta)))

log_lik=0;

for(i in num){
  
kidney_sub=kidney%>%filter(time<=i)%>%select(-time)

status=kidney_sub$status

kidney_sub=kidney_sub%>%select(-status)

dv1=apply(as.matrix(kidney_sub)*c(exp(as.matrix(kidney_sub)%*%beta)),2,sum)

dv2=sum(exp(as.matrix(kidney_sub)%*%beta))

dl=dl+apply(t(t(as.matrix(kidney_sub))-c(dv1/dv2))*c(status) ,2,sum)


dv1=array(0,dim=c(length(beta),length(beta)));dv2=rep(0,length(beta))

for(j in 1:nrow(kidney_sub)){
  
vec=as.numeric(kidney_sub[j,])
  
dv1=dv1+t(t(vec))%*%t(vec)*as.numeric(exp(t(vec)%*%t(t(c(beta)))))*status[j]
  
dv2=dv2+((vec)*exp(sum(vec*beta)))*status[j]
  
}

dl2=dl2+dv1/sum(exp(as.matrix(kidney_sub)%*%beta))-t(t(c(dv2)))%*%t(c(dv2))/(sum(exp(as.matrix(kidney_sub)%*%beta))^2)

log_lik=log_lik+sum(as.matrix(kidney_sub)%*%beta-log(sum(exp(as.matrix(kidney_sub)%*%beta))))


  
}
  
dl2=-dl2

beta=beta-eta*((svd(dl2)$u%*%diag(1/svd(dl2)$d)%*%t(svd(dl2)$v))
%*%dl)

}
 
print(log_lik)

}

#H:beta=0

var_beta=-((svd(dl2)$u%*%diag(1/svd(dl2)$d)%*%t(svd(dl2)$v)))

W_C=t(c(beta-rep(0,length(beta))))%*%solve(var_beta)%*%t(t(c(beta-rep(0,length(beta)))))    

qchisq(1-0.01,df=ncol(kidney_sub))

#個別に比較

(beta-rep(0,length(beta)))/sqrt(diag(var_beta))

qnorm(1-0.01)
           
```
Javaでsuperメソッドを呼び出す

##はじめに
簡単なことからコツコツとjavaのアウトプットをします。
javaシルバーに合格することを目標に勉強中。

##superとは
スーパークラスのインスタンスや変数を参照する際に使用する。

##superを用いての親クラスメソッドの呼び出し方
super.メソッド名

##書いてみる
```Main.java

//スーパークラス
class hoge {
	public void print() {
		System.out.println("hello from スーパークラス");
	}
}

//子クラス
class huga extends hoge {
	public void print() {
		System.out.println("hello from 子クラス");
	}

	public void executePrint() {
		//子クラスのprint
		print();
		
		//スーパークラスのprint
		super.print();
	}
}

public class Main {
	public static void main(String[] args) {
		huga obj = new huga();
		obj.executePrint();
	}
}
```

実行結果

```
hello from 子クラス
hello from スーパークラス
```

子クラスから親クラスのメソッドを明示的に呼び出せていることが分かる。

##おわりに
コンストラクタの場合は子クラスをインスタンス化すると
`スーパークラスのコンストラクタ`→`子クラスのコンストラクタ`が実行される。

詳細は別の記事で書く予定。

##参考文献
この記事は以下の情報を参考にして執筆しました。

- [オラクル認定資格教科書 Javaプログラマ Silver SE11](https://www.shoeisha.co.jp/book/detail/9784798162041)
CSS position: absoluteとrelativeの学習

【やったこと】
　①下記の記事を参考に学習
　　[CSSのposition: absoluteとrelativeとは](https://uxmilk.jp/63409)
　②上記で子要素にあたるえる影響が疑問になったなため別途調査を実施

【わかったこと】
　- absoluteとrelativeの基準位置の違い
　- 後続の要素位置に与える影響の違い
　- 親要素にposition: absoluteまたはrelativeを指定すると親要素を基準とした位置となること

※詳細は下記ブログに記述
[【第2回】CSSの position: absoluteとrelativeのについてWebサイトの記事を参考にやってみた](https://stchan-web.blogspot.com/2020/04/2css-position-absoluterelative.html)
masoniteアプリをHerokuでデプロイ2020

## Masonite
masoniteはPython製のWebフレームワークです。
[公式ドキュメント](https://docs.masoniteproject.com/)とチュートリアルも用意されており、わりと簡単にはじめられると思います。

### 準備

Python環境にはvirtualenvを使いました。

```
$ sudo apt install python3-dev python3-pip libssl-dev build-essential python3-venv
$ mkdir masonite_tutorial && cd masonite_tutorial/
$ virtualenv -p python3.6 venv
$ source venv/bin/activate
```

次にmasoniteのインストール。```craft new``` コマンドでmasoniteプロジェクトを作成できます。

```
$ pip3 install masonite
$ craft new
```

サーバーの立ち上げは以下のコマンド。

```
$ craft serve
```

http://localhost:8000 にアクセスすると以下のような画面が立ち上がると思います。

![root.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263384/223ba507-f6d7-892a-1c12-89f77b5b89d1.png)

### ログイン機能の追加
上記のページだけだとなんか物足りないので、ユーザー登録・ログイン機能を追加します。

```
$ craft auth
```

データベースの設定をします。.envファイルがあると思うのでそれを以下のように編集。
そのまえにローカルのpostgresでデータベースを作成するのを忘れずに！

```
DB_CONNECTION=postgres
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=hello_masonite_dev
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_LOG=True
```

それができたら、以下のコマンド

```
$ craft migrate
```

これで機能追加は完了です。
http://localhost:8000/register からユーザー登録ができます。

![register.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263384/e2a4c15b-c3d8-5c6f-3565-06a07c9210d2.png)

ここまででコードをgitにあげ、テンプレートにしておくと、今後使いまわせて便利かもしれないです。

## Heroku

Procfileを追加

```
web: gunicorn -w 2 wsgi:application
```

herokuへのデプロイはコマンドから行いました。

```
$ heroku git:remote -a masonite-app
$ git push heroku master 
$ heroku run craft migrate
```

デプロイした後の設定として以下を行います。

- postgreSQLの追加
    - postgreSQLを追加した後発行されるurlは以下のようになっているので分解して環境変数にセットします
    - postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_DATABASE
- 環境変数の設定（各環境変数の値は各自のenvファイルを参照）
    - KEY
    - APP_DEBAG
    - DB_CONNECTION
    - DB_HOST
    - DB_PORT
    - DB_DATABASE
    - DB_USERNAME
    - DB_PASSWORD
    - DB_LOG


## 参考
- 
- [Deploying a Masonite Application to Heroku](https://dev.to/masonite/deploying-a-masonite-application-to-heroku-45jp)
- [Masonite をHerokuで公開する方法](https://qiita.com/kentaro0919/items/8ac362d1596d3cdc212f)
自然言語処理をtransformersでやってみた。

自然言語のライブラリのtransformersで遊んでみた。
https://huggingface.co/transformers/main_classes/pipelines.html
https://github.com/huggingface/transformers

"I am happy"を入力するとポジティブと出力されました。

```
$pip install -q transformers

str = "I am happy"
nlp_sentence_classif(str)

[{'label': 'POSITIVE', 'score': 0.9998802}]
```

質問にも答えられます。
'I am a student who likes computer science.'という文章に対して'What do you like?'と質問すると'computer science'と返ってくる。

```
nlp = pipeline('question-answering')
nlp({
    'question': 'What do you like?',
    'context': 'I am a student who likes computer science.'
})

{'answer': 'computer science.',
 'end': 41,
 'score': 0.978939160814079,
 'start': 25}
```

いいですね。

このライブラリはデフォルトでなんのモデルを使っているのか探し出せなかった。(~_~メ)
form_for,form_with,form_tag??ヘルパーメソッドの使い分け

#form_forとform_with
違いってなんだっけ？の人向けです。

#概要
railsの環境をデプロイのために合わせる必要があリます。

#使い分けとは？

railsで投稿フォームを作成するにはセキュリティの面から直接inputタグを利用して書くことはありません。
投稿フォームを作成するにはform_tagやform_for、form_withといったヘルパーメソッドを使用します。

#####保存するテーブルが存在する場合

投稿フォームに投稿された内容を保存するテーブルが存在するときにはform_forを使います。


#####保存するテーブルが存在しない場合

検索フォームのようなフォームは検索ワードを入力してもらうだけでそのワードはデータベースに保存する必要はない場合、フォームはform_tagで作成します。

#####rails5.1からはform_withを使うことが推奨されています

form_withはrails5から使えるようになったヘルパーメソッドで、保存する内容がない場合でもform_forと同じようなコードで書くことができます。


#共通の特徴
form_forとform_withの間には細かな違いはあるものの、使用感が大きく異なることはありません。

自動でパスを選択してくれて、HTTPメソッドを指定する必要が無いこと
コントローラーから渡された、ActiveRecordを継承するモデルのインスタンスが利用できること
inputタグは用いないこと
これらの特徴は共通です。

form_forとform_withで書いた時の違いを比較しましょう。
######【例】form_forで書いたフォーム

```
<div class="contents row">
  <div class="container">
    <%= form_for @tweet do |form| %>
      <h3>
        投稿する
      </h3>
      <%= form.text_field :name, placeholder: "Nickname" %>
      <%= form.text_field :image, placeholder: "Image Url" %>
      <%= form.text_area :text, placeholder: "text", rows: "10" %>
      <%= form.submit "SEND" %>
    <% end %>
  </div>
</div>
```
######【例】form_withで書いたフォーム

```
<div class="contents row">
  <div class="container">
    <%= form_with(model: @tweet, local: true) do |form| %>
      <h3>
        投稿する
      </h3>
      <%= form.text_field :name, placeholder: "Nickname" %>
      <%= form.text_field :image, placeholder: "Image Url" %>
      <%= form.text_area :text, placeholder: "text", rows: "10" %>
      <%= form.submit "SEND" %>
    <% end %>
  </div>
</div>
```
上記は双方とも、コントローラーで@tweetを定義していると仮定します
ご覧の通り、大きく違いはありません。

正確には、form_withは、form_forとform_tagの機能を組み合わせたものです。しかしながら、学習中の現段階では「form_forと同じように使える」と把握するだけでも良いでしょう。

#local: true オプション
form_withでは、デフォルトの状態ではremote: trueというajaxでの通信が行われる設定になっています。現状ではこのajax通信は必要のない機能です。それをキャンセルするためにlocal: trueというオプションを付与する必要があります。local: trueオプションを付与すれば、これまで学んできたRailsのフォームと同様に使用することが出来ます。
【Rails 】部分テンプレート使用時のディレクトリ命名方法について／partialディレクトリとsharedディレクトリの使い分け

★気になっていたこと
RailsではDRYの原則が定められていることから、頻繁に使用する「部分テンプレート」。

使用していく中で、「partial」「shared」と
似たような意味合いを持つ単語が出てきて混乱していました。


★結論
大変ざっくりとしていますが、「partial」「shared」の使い分けは以下のようです。

①「shared」を使用する状況としてはdeviceのgemを使用しているタイミング。

device入れたときは自動でsharedディレクトリが生成されるので、
その中に使用するファイルを格納する。
<img width="216" alt="スクリーンショット 2020-04-04 10.58.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565338/9903ee21-e73a-1b87-803f-808a98bb52d7.png">


②device外で使用するファイルについては、現場によってディレクトリ名は異なる。
「partial」と絶対命名するわけではない。

細かい部分ですが、少し気になったので備忘録として残します。

※例
<img width="189" alt="スクリーンショット 2020-04-04 11.02.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565338/76666ac8-13b9-272b-4eaa-200df52c3d11.png">
GitLab Runner で Unity の Android SDK が見つからない場合の対処法

# GitLab Runner で Unity の Android SDK が見つからない場合の対処法

## 症状

GitLab Runner で Unity の Androidアプリのビルド時に、下記のエラーが発生。

```
DisplayProgressbar: Detecting Android SDK
UnityException: Android SDK not found
Unable to locate Android SDK.
```

## 解決法

- システム環境変数に「ANDROID_SDK_ROOT」を追加。
- サービス「gitlab-runner」を再起動。

## 説明

Unity 2018.4.20f1 の Preferences -> External Tools で Android SDK の設定はしているが、GitLab Runner でコマンドラインビルドを実行すると、上記のエラーが発生。
サービス「gitlab-runner」は別のアカウントで Windows 10 にログインしているため、レジストリに保存されている Android SDK の設定は参照されていない模様。
Python で web スクレイピングをして文字化けした時の解決方法

# 経緯
2020年4月時点の情報となります。
Python で web スクレイピングをしたら、日本語文が文字化けしたのでその対処方法をまとめました。
スクレイピング初心者向け。

# 環境
Windows: Windows 10
Python: Python 3.8.0
Requests: requests 2.23.0
Beautiful Soup: beautifulsoup4 4.8.2

# 準備
requests とBeautiful Soup 4 を使いますので、
pip でも conda でも、自分の環境に合う方法でインストールしておいてください。

```
# pip 利用の場合
$ pip install requests
$ pip install beautifulsoup4
```

```
# conda 利用の場合
$ conda install -c anaconda requests
$ conda install -c anaconda beautifulsoup4
```

# スクレイピング
requests とBeautiful Soup 4 を使って web スクレイピングしたところ、日本語が文字化けしてしまいました。
*基本的には以下のコードで上手くスクレイピングしてくれるようです。

```sample.py
import requests

url = 'URL'
response = requests.get(url) # ここまでだと文字化けの可能性が
response.encoding = response.apparent_encoding # 呪文

print(response.text) # textに入ってくる
```
(引用を一部改変。引用元: https://qiita.com/naka-j/items/ef38498273e036c26f4d)


ただ私の場合上手くいかなかったので、代わりに

```.py
import requests
from bs4 import BeautifulSoup

url = 'URL'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
```
(引用を一部改変。引用元: https://orangain.hatenablog.com/entry/encoding-in-requests-and-beautiful-soup)
を試したら文字化けが解消されました！

## まとめ
response.apparent_encoding を基本使ってみて、ダメなら . content という順番で試すのが良さそうです！

## 参考・引用元

[Pythonでスクレイピング](https://qiita.com/naka-j/items/ef38498273e036c26f4d)
[RequestsとBeautiful Soupでのスクレイピング時に文字化けを減らす](https://orangain.hatenablog.com/entry/encoding-in-requests-and-beautiful-soup)
[Python - Scrapyを使ってクローラーを作る](https://qiita.com/naka-j/items/4b2136b7b5a4e2432da8)
リモートでつながるオンライン会議ツール remo.co を試してみた

![remo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/2769c639-1741-5fd6-fe89-0b1c4ffb653c.png)

まず、冒頭で誤っておかないといけないことは、この表題に「オンライン会議ツール」とつけたことだ。

https://remo.co

は、会議だけに留まらないツールなのだが、わかっていただきやすいよう、こういう表題になったことを関係各位にお詫びしておく。

# 一番の特徴

数十人、数百人がはいれるオンラインの会場がある。

そこに集まった人たちが、少人数ごと（数名ごと）に、ビデオチャット（音声チャット）がつながることができる。

ブラウザ上に、会場の俯瞰図が表示されていて、そこにテーブルと椅子が、何セットも並んでいる。
それらのテーブルの任意のひとつをダブルクリックすることで、そのテーブルに着席したことになる。
テーブルごとに集まった参加者だけが、ビデオチャットでつながれる。

このテーブルごとに分かれる仕組みが、remo の一番の特徴だ。

この説明だと

　「サーバーの入り口にロビーみたいなのがあって、そこからわかれて部屋に入るチャットと同じだよね」

と思われるかもしれないが、いろんな部屋間の移動（Room A から Room B への移動）がとても簡単だったりするのが、それが気持ちよく使いやすい。

これはコトバでは伝わらないと思うので、2週間無料お試し期間もあるので、ぜひ体験してみてほしい。

文字チャットは、全体チャットと、テーブルごとのチャットと、個人同士のチャットが用意されている。

例）「席替えターイム！」などのアナウンスは、全体チャットを利用できる。

※ 席替えについては、Session Timer という専用のアナウンス機能も用意されている。

# たとえば

- ワークショップなら、ワールドカフェ形式のような「少人数であつまって会話し、一定時間がすぎたらメンバーをかえて、また会話する」。そういう形式のものにはジャストフィットするのではないだろうか。

- オンライン飲み会も、２０〜３０人となってくると、全体での会話が成立しにくい。これはリアルの飲み会でも、会話って6人くらいじゃないと成立しないのではないか。それくらいの人数のテーブル構成にあっている。


# コロンブスのたまご

言葉の説明だけだと、「そういうサービスあったよね」「あれに近いよね」と思われるかもしれない。

ビデオチャットで、人数がわかれたりしやすいだけのことだから。誰でも思いついたり、つくったり、しているのかもしれない。

しかし、remo には、コトバで説明しづらい（わたしの文章力がないだけ）、ユーザー体験というものが確かに、わかりやすく存在する。

2〜30人で試すとその面白みも体験できそうだけれど、まず 5〜6人からでも、その楽しみ方は感じられるだろうから、試しにつかってみてほしい。

ほんとうに、おもしろいサービスだ。

# remo にかかわず、オンライン飲み会に思うこと

## いいなと感じたこと

- 完全割り勘なかんじが気持ちいい。ノンアルのひとも食べたいものや飲みたいものを用意しやすいし、たくさん飲む人も気遣いなく飲める。
    - 「オンライン飲み会」ってわかりやすいからそう呼んでいるけれど、「飲み会」ってつけなくてもいい時代がすぐそこにありそう。新しい名前がつきそうだ。
    - 飲み会だけじゃなく、いろいろあるから、「Zoom する」とか、「remo する」とか、「ググル」みたいなコトバになるのかしら。あ、脱線した。
- 会話の流れから、、、唐突に誰か（未参加の友人）を呼びだしやすい
- 肉体的なセクハラ（おさわり）が、絶対に発生しない

## いまいちだなと感じたこと

オンライン飲み会の、デメリットや足りなかったりすることも、いくつか感じたりもしているけれど、オンライン飲み会というもの自体が、いま、いろいろ進化中（機能も人間も）だから、ここにはネガティブなことは書かないことにする。

あ、ひとつだけ

- 酔っぱらい中の録画ってやつは「見返すと黒歴史」ってのも大量に生み出しそうで、こわい。ｗ

うん、なんだ。がんばろっと。
健康についての警告 - 米国大使館、東京 (2020/4/3)

# 健康についての警告 - 米国大使館、東京 (2020/4/3)

[original](https://jp.usembassy.gov/health-alert-us-embassy-tokyo-april3-2020/)

場所:日本
日付:2020/4/3

日本はCOVID-19の感染数が、急激に増えている。
この72時間で、全国で650以上の陽性を検出した。
大まかに1日200件の増加である。
4/2, 日本は、このウィルスのアウトブレーク後、最大の増加となった。

『爆発的感染は、差し迫っている』と口にする医療・政策のリーダーが多くなっている。
米大使Chargé d’Affaires Joe Youngは、[ビデオメッセージ](https://www.youtube.com/watch?v=Wyeh4uXBBzM)を
COVID-19の世界的なパンデミックを懸念して、4/2に日本の米国市民に発行した。

## 日本の医療システムのキャパシティ

欧米における、陽性ケース数と入院数に比較して、日本が発表するCOVID-19のケース数は、小さく止まっている。
日本政府の、『コロナ検査の数を抑える』という決定は、COVID-19の流布度合いを把握することを妨げている。
我々の外交施設は、アトランタ・アメリカ疫病管理・予防センターに連絡を取り、
日本における東京、大阪、名古屋、福島、札幌、那覇の医療システムのキャパシティをモニターし続けている。

日本の医療システムは信頼に値するが、ここ数週間で、医療システムを維持することが難しくなると考えている。

もしそうなってしまえば、日本の医療機関にかかっている疾患持ちのアメリカ市民が、医療ケアを受けられなくなってしまう。
なぜなら、日本は、COVID-19のパンデミックに手一杯になってしまうからである。

## Border Control Measures

日本は外務省がLevel3と定めた国からの渡航を、感染防止のため、禁じている。
アメリカはLevel3である。
アメリカからの旅行者は、日本に入ることはできないし、飛行機に乗ることもできない。

詳細と免責については、以下を参考にして欲しい：

- The Japan National Tourism Organization’s website.

- An April 3, 2020 Ministry of Justice document that describes “special exceptional circumstances” and specific rules that apply to foreign nationals who are permanent residents of Japan or immediate family members of Japanese citizens.

- Japan’s Ministry of Foreign Affairs website on strengthened border control and visa restrictions put in place due to COVID-19.

## 国際便の減少

4/3の時点で、日本発アメリカ箸のフライト数は11%にまで減少している。
先行きが不透明ないまの状況においては、近いうちにさらにフライト数が減ると考えておいた方が安全である。
強く懸念をする事の一つとして、家族の危篤の際に、アメリカに帰ることができなくなることがある。

(間違ってるかも。)
現時点において、日本の情報筋によると、日本から海外に向けての便は、しばらく許容されるが、
国際便から国内便への乗り換えは、禁止されることになるとのことである。

At this time, Japanese authorities advise that passengers transiting Tokyo’s Narita or Haneda airports without clearing immigration will still be allowed to proceed to their onward destinations in other countries. Passengers will not be permitted to transit between airports or transfer from an international flight to a domestic flight.

以下、連絡先情報
AWS入門する前に知って良かったこと

# はじめに

新型肺炎コロナウィルスが猛威を振るっております。
今後の事を考えると、クラウド技術に触れておくことも必要かと思いAWSに入門しました。

不要不急の外出を控え、ただただ新型肺炎コロナウィルスの収束を願うばかりです。


# AWSをはじめる前に読むと良い記事

過去にAWSでやらかしてしまった人の記事を読んで「AWS怖っ！」って、なっていたのですが、
以下の記事を読んで、勇気を貰い一歩踏み出せました。

- [AWSアカウントを作成したら最初にやるべきこと -セキュリティ編-](https://qiita.com/yanyansk/items/3a989b70d2d3d49eff16)
- [AWS初学者が「うっかり課金」されがちなポイントとその対策まとめ](https://qiita.com/Yuji-Ishibashi/items/bb1c0042fd16a9350c5a)

AWS初心者にとって、大変ありがたい記事を共有して頂き、感謝しかありません。


# AWS無料枠

無料枠で何が出来るのかと、各サービスの制約事項は確認しましょう。

- [AWS無料枠](https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=tier%2312monthsfree%7Ctier%23always-free)


# AWSチュートリアル

お手軽にAWSを楽しむには、10分間チュートリアルがお勧めです。

- [10 分間チュートリアル](https://aws.amazon.com/jp/getting-started/tutorials/?awsm.page-tutorials-all=1)

# AWSトレーニング
- [AWSトレーニング](https://www.aws.training/LearningLibrary?filters=language%3A2&search=&tab=view_all)

# AWSオンラインセミナー

AWSオンラインセミナーに参加して、脱初心者を目指しましょう。

- [AWSオンラインセミナー](https://aws.amazon.com/jp/about-aws/events/webinars/)


# AWSに慣れたら読みたい記事

- [AWS を安全に使うために（IAM のベストプラクティス）](https://dev.classmethod.jp/articles/sugano-042-iam-best-practices/)
- [【2020年】AWS全サービスまとめ](https://dev.classmethod.jp/articles/aws-summary-2020/)
- [AWS ホワイトペーパーとガイド](https://aws.amazon.com/jp/whitepapers/?nc2=h_ql_exm_wp&whitepapers-main.sort-by=item.additionalFields.sortDate&whitepapers-main.sort-order=desc)
- [AWS ドキュメント](https://docs.aws.amazon.com/index.html?nc2=h_ql_doc_do)


# おわりに

- AWS無料枠だけでも十分に楽しめています。
- 地元のJAWS-UGは廃れていて悲しい。
Emscripten APIのRust向けFFIバインディングの作成

bindgenのコマンドラインツールを使って、Emscripten APIのFFIバインディングを作る方法

### bindgenツールのインストール
cargoで、`~/.cargo/bin`にインストールする。

```bash
$ cargo install bindgen
```

### 必要なヘッダーファイルを探す
バインディングを作りたいヘッダーファイルへのパスを見つけてくる。ヘッダーファイルは、emsdkの`upstream/emscripten/system/include`にある。例えばここから、emscripten.hや、emscripten/fetch.h等をピックアップする。

```bash
{emsdkディレクトリ}/upstream/emscripten/system/include/{emscripten.h, emscripten/fetch.h}
```

### llvm-configを探す
バインディングを使うパッケージのコンパイルに使うllvmの、llvm-configへのフルパスを探す。

例：

```bash
$ llvm-config- 
llvm-config-6.0  llvm-config-8    
$ which llvm-config-8
/usr/bin/llvm-config-8
```

### *.rsファイルの作成
各ヘッダーファイルについて、以下の形でbindgenを実行して`*.rs`ファイルにコードを保存する。

1. llvm-configの場所をLLVM_CONFIG_PATHに指定
1. emscripten向けのヘッダーファイルを作るために`__EMSCRIPTEN__`マクロを定義
1. emsdkのincludeディレクトリをclangのヘッダーファイルのサーチパスに追加

3 は`emscripten/fetch.h`等、emscriptenのヘッダーファイルを`<emscripten/x.h>`の形で参照しているヘッダファイルのバインディングの作成に必要。`emscripten.h`には不要。

例

```bash
# EMSDKはemsdkのインストールディレクトリで、`source emsdk_env.sh`で設定されるもの。 
$ LLVM_CONFIG_PATH=/usr/bin/llvm-config-8 \
bindgen $EMSDK/upstream/emscripten/system/include/emscripten/emscripten.h -- \
-D__EMSCRIPTEN__ \
-I$EMSDK/upstream/emscripten/system/include > emscripten.rs
```

### *.rsファイルをメインモジュールに組み込む
`*.rs`ファイルを、メインモジュールにそのまま組み込むとwarningが出るので、warningを抑える必要がある。バインディング用のディレクトリを作って、そこに`*.rs`ファイルを入れる場合は以下のような感じ。

例

```rust
#![allow(non_snake_case)]
#![allow(dead_code)]
#![allow(non_camel_case_types)]
#![allow(non_upper_case_globals)]

pub mod emscripten;
pub mod fetch;
```
Git pushでXSERVERのWebsite更新をする（備忘録）

XSERVERのWebsiteをgit push コマンドで可能にします。GitやSSH公開鍵認証を学ぶ上でもいいトレーニングになります。参考にさせて頂いたサイトの方々ありがとうございました。

##環境と準備
- Windows 10 home
- Windows Powershell
- gitのインストール（ローカル）
- github登録
- XSERVER契約

##システムのイメージ
XSERVERをRemote Repositoryとして、Public_html上に作成した本番repositoryを、同サーバー別directoryに作ったbare-repositoryをそのcloneとして作成。Localからbare-repositoryにpushでbareのhooksが感知してpost-receiveが作動し、本番repositoryがpullをし、bareのデータを本番repoに持ってくるシステム。
public_html内でgit作業するリスク回避のためbare-repositoryを用意し、管理していると認識。

##ステップ
- SSH鍵作成（ローカルで用意）後々githubとXSERVERで鍵を使いまわせるから、同時pushで便利。
- SSH config 作成
- XSERVERにSSH接続し、gitをインストール
- Public_htmlにgit initし、本番nonbare-repositoryを作成、git init
- git cloneでbare-repositoryをpublic_htmlと同じ階層に作成
- bare-repositoryのhooksにpost-receiveを作成
- localの作業フォルダに移動し、bare-repositoryをremote-repoとして追加する。
- localからpushテストし、public_html内で更新内容確認

####githubにも同時にpushそして、pull先はgithubに設定の場合
- githubでSSH公開鍵登録、git remote set-url --addでgithub内repoを紐づけ。(同時push)
- git pullのリモート先をgithubにする
    1. git remote rm origin
    2. git remote add origin git@github.com:~~~~~~/~~~~~~ (SSH接続のpath)
    3. git remote set-url --add origin xsrv:~/~~~/~~~

##参考URL
- [gitpushで本番環境に自動デプロイできる環境を作ってみよう！](http://vdeep.net/git-push-deploy)
- [今日からはじめるGitHub](https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000)
- [XSERVERにgitを導入する手順](https://blog.ko31.com/201606/xserver-git-install/)
- [エックスサーバーにGitを導入する手順](http://vdeep.net/xserver-git)
- [秘密鍵・公開鍵を作成する手順](https://qiita.com/reflet/items/5c6ba6e29fe8436c3185)
- [How to generate SSH keys in OpenSSH for Windows 10](https://www.techrepublic.com/blog/10-things/how-to-generate-ssh-keys-in-openssh-for-windows-10/)
- [エックスサーバーにssh接続する方法](https://qiita.com/ryo2132/items/38b5a93b3df476dd2b44)