OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu18.04でOpenCVをJavaWrapper付きでビルド

#前提
JDKはインストールされているものとする。

#手順
Apache Antをインストールしておく。ここが重要。AntがないとJarが作られない。

```
sudo apt-get install ant
```
- opencvのカレントバージョンをダウンロードして展開
パスに全角が含まれない場所へ移動。例えば、/home/UserName/Documents/opencv-4.1.2
- opencvソースを展開したフォルダに空の「build」フォルダを追加作成

![Screenshot from 2019-10-27 23-19-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/25f4ad15-b00f-228c-04ab-9bdda53aeaf0.png)

- Cmake-GUIを使って、ソースにopencvソースの親フォルダ、buildに作成したbuildフォルダまでのパスを設定。

![Screenshot from 2019-10-27 23-20-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/f7a8f47b-1098-a445-8c71-32ebe75fa437.png)

- GroupedとAdvancedにチェックを入れて、一度、Configure
- default native compilersでそのままFinish
- BUILDのツリーから「BUILD_SHARED_LIBS」をオフに。

![Screenshot from 2019-10-27 23-25-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/240ef396-6081-c819-18cc-3aeea7c780d6.png)

- もう一度Configure
- 更新された画面で、Ungrouped EntriesからBUILD_FAT_JAVA_LIBにチェック。

![Screenshot from 2019-10-27 23-26-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/c8a16957-6a3b-90ff-413d-4dd1bdefde52.png)

- もう一度Configure。
- そして、Generate。
- ここまでできたらcmake-guiは終了。
- ターミナルから作成済みのbuildフォルダに移動して、makeコマンド。

```
~/Documents/opencv-4.1.2/build$ make -j4
```
-j4オプションはコア数の指定。なくてもいい。

- 最後に、binフォルダにjarファイルが出来ていることを確認する。
nativeライブラリはlib内にある。

以上

### その他

eclipseの開発でNative libraryをプロジェクト内で使うときは、ビルドパスの設定からJREのライブラリ設定を展開して、Nativeライブラリのパスを編集する。

プロジェクトをリリースするときは起動オプションにネイティブライブラリまでのパスを設定するスクリプトを書くか、利用する環境のOSでopencvをインストールする。

Mavenから以下のライブラリを使ってJavaCVを使うのも良いかもしれない。
- javaCV
- javaCPP
- javacv-platform
- opancv-platform

dcm4cheの圧縮/解凍処理で使う場合は、dcm4cheライブラリに同梱されているopencvのnativeライブラリを使うこと。
【Cassandra】nodetool status

## 0. はじめに

・本記載は、ディストリビューション、バージョン = DSE 4.8.16をベースに記載

## 1. 統計値の説明

気になる統計値についてのメモ

### ① Owns列

( キースペースを指定しないで実行した場合 )
・キースペースを指定しないと、Own列は ? 表示になる。

```
# nodetool status 
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens  Owns    Host ID                               Rack
UN  10.0.2.121  479.96 KB  256     ?       e52df442-eebb-490a-8787-372d4e2705c2  RAC1
UN  10.0.2.122  433.09 KB  256     ?       b1ccdf1e-a6ee-4f71-95c3-b3b5bd0f3e81  RAC1
UN  10.0.2.123  488.47 KB  256     ?       a4cfeb3a-1fa2-4f99-ac8b-e14e2aa44ec4  RAC1

Note: Non-system keyspaces don't have the same replication settings, effective ownership information is meaningless
# 
```

( キースペースを指定して実行した場合 )
・Owns列に利用可能なトークン範囲の割合を表示 
 ・トークン範囲の割合は、各ノードが所有するトークンの割合とレプリケーション係数を乗算した値
　・そのキースペースのreplication factorが2なら%の合計は200%、3なら300%になる。

( 正確には、DATASTAXのドキュメントの「重要: クラスターに、レプリケーション・ストラテジまたはレプリケーション係数の異なるキースペースがある場合、有意な所有権情報を得るには、nodetool status実行時にキースペースを指定してください。」というのが適切らしい。
 ( https://docs.datastax.com/ja/dse/5.1/dse-admin/datastax_enterprise/tools/nodetool/toolsStatus.html ) )

```
# nodetool status test01
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens  Owns (effective)  Host ID                               Rack
UN  10.0.2.121  479.96 KB  256     31.7%             e52df442-eebb-490a-8787-372d4e2705c2  RAC1
UN  10.0.2.122  433.09 KB  256     30.9%             b1ccdf1e-a6ee-4f71-95c3-b3b5bd0f3e81  RAC1
UN  10.0.2.123  488.47 KB  256     37.4%             a4cfeb3a-1fa2-4f99-ac8b-e14e2aa44ec4  RAC1

# 
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497751/0434aea5-0e8c-b980-1d0e-2ceb0e3eff89.png" width=25%>
本当に伝えたいことをプレゼンするためのフラッシュトークの技術

プレゼン能力を鍛えるための新しい方法を知ったので紹介します。

その名も、「**フラッシュトーク**」です。

ライトニングトークは5分ですが、フラッシュトークは**1分**です。1分に収めることで、自分が本当に言いたいことのみ伝えることが出来ます。

フラッシュトークは以下の勉強会で知りました。残念ながら体調不良により参加できませんでしたが、具体的にどんな準備をしたか振り返ります。

勉強会URL：
https://engineers.connpass.com/event/145032/

以下の記事でフラッシュトークの概要を知ることができます。興味のある方はぜひ覗いてみてください：
https://note.mu/ariakira/n/n51b943dcad92

## どのように準備をしたか

### トークスクリプト作成
とりあえず、**文字数は300文字程度に収めることと、内容は1つに絞ること**を意識しようと思いました。トークのテーマは「自己紹介」と「技術」の２つです。それぞれトークスクリプトを作りました。

```:自己紹介(324文字)
はじめまして面川といいます。
サーバサイトエンジニアをしています。
最近、パフェ鑑賞という愉しみが出来ました。
食べるのも大好きですが、よりおいしく食べるために、まず見て愉しもうというものです。

はい、まず俯瞰です。パフェの顔ですね。色とりどりのパーツが食欲を誘います。

次に、断面です。パフェを横から見た図ですね。ここで、食べ進めていったらどんな味になるだろうとか、食感の変化を想像して楽しむわけです。

最後に、アオリ、つまり上から見上げた図ですね。普段見ることの無い視点から見ることによって、パフェを食べた後に広がる満足感を想像して楽しむわけです。

皆さんの好きなパフェも、是非教えていただいて、語り合いましょう！よろしくお願いします。
```

```:技術(330文字)
はい、求職者を成長させる面接フィードバックの技術ということですけれども。

結論から言うと、「具体的に指摘してあげられること」です。なぜなら、「自分のことを理解してくれようとしてるんだな」と相手に伝わるからです。

たとえば技術開発職に応募されたけれど、実際の経歴では他部署との調整が非常にスムーズにできたことをアピールされた方がいたとします。

そのとき、「調整をスムーズに出来ることがアピールポイントなのですね。でしたら、実際に手を動かすよりもマネジメントの領域で活躍できるように見えますが、いかがでしょうか？」と言います。「具体的に向いてそうなのはこの会社のこの部署」くらいまで言えると、良いフィードバックになると思います。

以上です。ありがとうございました
```
### トークスクリプト推敲
次に、スクリプトの内容を実際に喋って推敲していきます。だいたい30回くらいずつやりました。最初の10回で内容を絞り、次の10回は喋り方を意識し、最後の10回で1分以内に収めるようにしました。

### スライド作成
最後にスライドを作りました。これについては、他の参加者の方のスライドを参考にしました。皆トピックを絞って、その代わりにイラストを使って情報量を増やしていました。

#### 自己紹介
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34636/152645c3-1988-c509-7eb4-a4b43415ddb6.png)

#### 技術
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34636/c73a17d3-7917-4a60-eade-b218d2fea64e.png)

自己紹介は、トピックを「パフェ」で統一しました。それ以外の情報は入れないようにしました。「パフェ鑑賞」にしたのは、単純に「パフェが好き」だけでは印象に残らないと思ったからです。「**要するに、この人は何の人？**」とラベル付けしてもらうことを心掛けてみました。

技術は失敗したなと思いました。タイトルに喋りたいことを集約させるように意識しましたが、LTと同じ感覚で作ってしまいました。「まとめ」スライドをタイトルに持ってくる感覚でやれたら良かったです。

## 次に向けて
文字数は300以内にすれば良かったと思いました。意識してゆっくり喋っても1分ギリギリだったので、50秒くらいになると良かったかもしれません。

スライドはイラストを使って、文字を詰め込まないように意識すると良かったかもしれません。

**内容を絞れば、文字数が少なくても相手に伝わる情報量は減らないんだな**と感じました。

良い方法を教えてくださった主催者の皆さま、ありがとうございました！
Laravel で JavaScriptをやるときの手法

LaravelでのJSの書き方が色々出来てしまうので、纏めました。
独断と偏見でおすすめ度をつけているので指標程度によろしくおねがいします。

ミスやより良い方法がございましたらご指摘お願いいたします。

[変数を渡したい場合はこちら](https://qiita.com/ntm718/items/638a8f56d30d047ead0f)

#JS用のBladeに直接記述 オススメ度0
`js-app.blade.php`のようなBladeをファイルを作成し、そこにJSを記述し、必要なBladeファイルでincludeする手法
slotを使えば色々渡して使えるかも

これをやるなら、Bladeはテンプレートエンジンなので
同一ファイルに書くか、JSファイルを切り出すべき。

```HTML:hoge.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
~何らかの記述~
@include('js-hoge')
</body>
</html>

```

```HTML:js-hoge,blade.php
<script>
~何らかの記述~
</script>
```


#Bladeに直接記述 オススメ度★
一つのHTMLファイルにJavaScriptを書くのと同等だと思います。
記述量が少量の場合、PHPから変数を渡してJSで使いたい場合は簡単なので良いかも

```HTML:hoge.blade.php

<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
~何らかの記述~
<script>
    var app = @json($array);
</script>
</body>
</html>

```

#JSファイルを作成して読み込む オススメ度★★
'public/js'内に`.js`のファイルを作成し、Bladeファイルでヘルパメソッドの`asset()`を使って読み込む。
お手軽にできるし、ファイルを分割できるので悪くはない

```HTML:hoge.blade.php

!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
~何らかの記述~
<script src="{{ asset('/js/hoge.js') }}"></script>
</body>
</html>
```

#JSファイルを作成し、Laravel Mixでコンパイルして読み込む オススメ度★★★
`resources/js/`内に`.js`のファイルを作成し、
`npm run dev`(開発用)や`npm run production`(デプロイ用)でコンパイルされ`public/js`にjsファイルが作成されます。

>MixはECMAScript 2015のコンパイル、モジュール結合、圧縮やJavaScriptファイルの結合などの操作を手助けする、多くの機能を提供しています。

用いるには`node`が必要となります。

ここでは、`hoge.js`を`resources`作成し、`public/js/hoge.js`としてコンパイルする想定で行ってみます。
ディレクトリは下記のようになります。

```
-resources
　-js
　　-components/
　　-app.js
　　-bootstrap.js
　　-hoge.js ※
```

```js:webpack.mix.js

const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/js/app.js', 'public/js')
   .js('resources/js/hoge.js', 'public/js') //←追加 出力元、先（出力名は元のが引き継がれる）
   .sass('resources/sass/app.scss', 'public/css');
```
もしも、`app.js`にまとめたい場合、`resources/js/app.js`にて
`import "hoge.js"`を記載してください。(その場合上記の追加は不要)


```HTML:hoge.blade.php

!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
~何らかの記述~
<script src="{{ mix('js/hoge.js') }}"></script>
</body>
</html>
```

```
npm run dev
```

上記でコンパイルしています。

scssの使用、ベンダープレフィックスの付与など他にも使えるのでおすすめです。

以上ですが、他におすすめがありました教えていただけますと幸いです

----
ブログ始めました

https://blog.collapse-natsu.com/
【Xamarin】C#でAndroidアプリを作ってみる 1 (Xamarinインストール)

# 概要
Xamarinを学習したときの備忘録です。
生年月日を入力したら干支と星座を教えてくれる簡単なアプリを作成していきます。
最後に自分のスマホ(Android 7.1.1)で動かしてみます。

Xamarinには、AndroidとiOSのアプリを共通で作れる「Xamarin.Forms」がありますが、
今回の目標は自分のスマホ(Android 7.1.1)で動かすこと、としたので、「Xamarin.Android」で作ります。
Xamarinについては[こちら](https://docs.microsoft.com/ja-jp/xamarin/get-started/what-is-xamarin)を参照しました。

# 開発環境をつくる
1．[Visual Studioのダウンロードサイト](https://visualstudio.microsoft.com/ja/downloads/)で、Communityエディションのインストーラをダウンロードします。
2.ダウンロードした「vs_community__xxxxx.exe」を実行します。
3.ワークロードで「モバイル＆ゲーム」の「.NETによるモバイル開発」を選択します。
![インストーラ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/1e1cbbdf-7d2f-7f82-1671-5a15bfff84c9.png)
4.インストールが始まるので、しばらく見守ります。
5.インストールが完了すると、Visual Studio Community 2019が起動します。
6.サインインする。「後で行う」でも大丈夫です。
![vs起動①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/1356d08b-12e6-6396-13c7-8ea291a1b395.png)
7.配色テーマを選択します。
![vs起動②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/c66febda-52fb-804e-5786-40e5ce7e871a.png)
8.「visual studioの開始」を押下します。
9.「新しいプロジェクトの作成」を選択します。
![vs起動.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/455be529-e7d6-bfae-f491-91992360f018.png)
10.Androidアプリ(Xamarin)を選択します。
![プロジェクト作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/170abc88-30ab-4cf2-0070-a78f41128adc.png)
11.プロジェクト名、ソリューション名を「ZodiacSignApp」と命名しました。
![プロジェクト構成①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/bf803657-a804-1b8f-40f5-6c93e8424f4b.png)
12.テンプレート「空のアプリ」を選択します。
Minimum Android Versionは、自分のスマホの環境に合わせて「Android 7.1」としました。
![プロジェクト構成②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/f7b61af0-98ff-1981-d4d9-9811e3240332.png)
13.プロジェクトが完成しました。実行してみます。
![プロジェクト完成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/790c0f5c-adc3-ca46-0b3f-e72def79ef7f.png)
14.エミュレータが立ち上がって、下図のように表示されれば成功です。
エミュレータの起動からアプリ実行まで、少し時間がかかります。
![エミュレータ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/aadba74f-440e-89cb-134f-040f62f0087b.png)

# まとめ
今回は、Visual StudioのインストールとXamarin.Androidプロジェクトの作成までを行いました。
次回は、作成したZodiacSignAppを実機でデバッグ実行してみます。
次回分はこちら⇒[C#でAndroidアプリを作ってみる 2 (デバッグ実行)](https://qiita.com/plusM/items/87b386f4051c74cad461)
勉強ログ_day3_MySQL入門②(MySQLをさわる）

# はじめに
非エンジニアの勉強ログ。
**超初心者プレイ**のため、内容は自分の勉強メモです。

### 今日のゴール
- MySQLとやらにもう少し触ってみる

### 環境
- ホストOS：Windows10 Pro 1903
- [こちら](https://qiita.com/kantan/items/099e2c3ed700f1781df8)で構築した環境を利用する
- MySQL:5.7.27

### 参考資料・引用元など
- ドットインストール：[MySQL入門](https://dotinstall.com/lessons/basic_mysql_v3 "MySQL入門")
- Qiita：[【新人教育 資料】SQLへの道 〜DB編〜](https://qiita.com/devopsCoordinator/items/9b70e506150888e190be)
- Qiita：[よく使うMySQLコマンド集](https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4)
- わわわIT用語辞典：[DBサーバ](https://wa3.i-3-i.info/word14407.html)
- わわわIT用語辞典：[固定長と可変長](https://wa3.i-3-i.info/diff358db.html)
- [MySQLサーバを動かす](https://www.yokoweb.net/2018/05/13/ubuntu-18_04-server-mysql/)

# データ型
### データ型とは
カラム（列、フィールド）に、あらかじめ指定しておくルール 
ルールが無いと「数字の列に、日本語が入ってる！」とか、想定しない値が入っちゃう。

### MySQLのデータ型
- 数値関連
    - int：整数
    - float：浮動小数点（小数点を使う必要があれば）
    - double：floatより精度が高いらしい。詳細はナゾです
    - int unsigned：整数の中でも、プラスしか使わなくていいやつ。その分整数の桁数が増える
- 文字列関連
    - char：固定長（長さが決まっている。長くも短くもならない）
    - varchar：可変長その１。最大文字数を指定する
    - text：可変長その２。何文字になるかもわからない場合
- 日付関連
    - date：日付
    - time：時間
    - datetime：日付と時間
- 真偽値
    - boolean型：trueは1(0とnull以外すべて）、falseは0（0とnull）


# MySQLをコマンドでいじる
### テーブルをつくる
カラム名と、そのデータ型を指定してく。
「;」忘れないようにね

```ruby:mysql
create table testtable01 (
  id int unsigned,
  name varchar(30),
  number float
);
```

### テーブルに行追加
```ruby:mysql
insert into testtable01 (id, name, number) values (1, 'sato', null);
```

### カラム（列・フィールド）に条件設定
nullを許したくない場合は「not null」つけてあげる

```ruby:mysql
create table testtable01 (id int not null);
```

重複してほしくないカラムは「フィールド」

```ruby:mysql
create table testtable01 (id int unique);
```

テーブル上での主キー設定（絶対に重複しない、データを一意に識別する）は「primary key」
よく自動連番設定にするので「auto_increment」をつけるよ

```ruby:mysql
create table testtable01 (id int primary key auto_increment);
```


# あとがき
ホントはday3とかその前に、Accessもやっていたが、つまらなさすぎて途中放棄した
Masoniteでブログを作るチュートリアル①(ブログ的Hello World)

# Masonite

Masonite自体の紹介は[こちらの記事](https://qiita.com/dumblepy/items/65b975302618cb6a8f64)が大変参考になります

この記事は[公式チュートリアル](https://docs.masoniteproject.com/creating-a-blog) の通りに進めていきます.
公式チュートリアル以上の情報はありません.
サクッとキャッチアップしたい人向けの日本語訳的な位置づけです.

# 今回の範囲

2. ルーティング作成
3. コントローラー作成
4. View作成

## ルーティング作成

ルーティングの記述は```routes/web.py``` で行います.

```routes/web.py``` を見てみましょう

```routes/web.py
"""Web Routes."""

from masonite.routes import Get, Post

ROUTES = [
    Get('/', 'WelcomeController@show').name('welcome'),
]
```

ROUTES listに 初期ページのルーティングが設定されていますね.

同様にblogのルーティングを書きます.

```
ROUTES = [
    Get('/', 'WelcomeController@show').name('welcome'),

    # Blog Routes
    Get('/blog', 'BlogController@show')
]
```

これで /blogにGETでアクセスされたときにBlogControllerのshow関数が実行されます.

それでは,次に実行されるべきBlogControllerを作っていきましょう

## コントローラー作成

コントローラーのファイルは```app/http/controllers``` 下に置きます.
(もちろん変更することもできます)

コントローラーの作成はコマンドから行います.

```bash

$ craft controller Blog
```
コマンドが実行されると `app/http/controllers` 下に`BlogController.py` が作成されています.

```python:app\http\controllers\BlogController.py

"""A BlogController Module."""

from masonite.request import Request
from masonite.view import View
from masonite.controllers import Controller


class BlogController(Controller):
    """BlogController Controller Class."""

    def __init__(self, request: Request):
        """BlogController Initializer

        Arguments:
            request {masonite.request.Request} -- The Masonite Request class.
        """
        self.request = request

    def show(self, view: View):
        pass
```
BlogControllerにshow関数が用意されていますね?

今は pass で何もしませんが,これにBlogのViewを返せば良さそうです.

pass のところを下記のように書き換えます.

```python
def show(self, view: View):
    view.render('blog')
```

これでshow関数が実行されたらblogのViewをレンダリングしてくれるはずです.

おっと,返すべきViewを作成していませんでしたね.

## View作成

返すべきViewを作成していきましょう

Viewは ```resources/templates/``` に置かれています.

ファイルを作成してもいいですが,せっかくなのでcraftコマンドから作成してみましょう

```bash
$ craft view blog
```

`resources/templates/blog.html` が作成されています.

```resources/templates/blog.html
This is a Blog
```

とでも書いておきましょう


## 最後に

これで,

1. ルーティング作成
2. コントローラー作成
3. View作成

が終わりました.

つまり, `http://localhost:8000/blog` にアクセスすると`This is a Blog`と表示されるはずですね.

```bash
$ craft serve
```
で サーバー起動して `http://localhost:8000/blog` にアクセスします

きっと`This is a Blog` と表示されているはずです.

次回は認証をやります
VMWare Fusionでレジュームできなくなった

VMWare Fusion7を利用していましたが、
macOS CatalinaにアップグレードしたらUbuntuの画面が表示されなくなりました。
起動はするので、どうやら画面だけが真っ黒で見えなくなっているだけのようです。

セキュリティーとプライバシーの画面収録で制限されているという記事がありましたが、画面収録にVMWareがありません。

試したこと：
・Fusion7を再インストール
　→ なんか、レジュームできなくなりました。
・とりあえずWebで検索していて、何かしらのコマンドを実行
　→ /dev/vmmonが読み込めないとかなんとかのエラーがでるようになった。
・しかたなく、Fusion11.5の評価版をインストール
　→ 現象かわらず、レジュームできず。
・.vmxファイルのフォルダにある .nvram を削除
　→ レジューム状態をなくし、電源を落とした状態からスタートできるようになった。しかし、/dev/vmmonが読み込めないエラーは変わらず。
・セキュリティーとプライバシーの一般で拒否られてたようなので、許可を押す
　→ エラーは変わらず。。。
・Macを再起動
　→ やった、治った！

誰かの役に立つとよいです。
Railsで選択リストを作るときにやること

意外と1日かかってしまった。。。

# View
まずビューを作ろうと思った。

## form_with
form_withを使おう。form_tagとかform_forは非推奨らしい。
書き方は以下のような感じ。

```erb:top.html.erb
<%= form_with url: home_changeMember_path do |form| %>
  <%= form.select :member,
  [["水野", "mizuno"],
   ["安曇", "azumi"],
   ["比良", "hira"],
   ["西尾", "nishio"]]
   %>
   <input type="submit" name="commit" value="Send" />
<% end %>
```

選択リスト値については、[表示の値,コントローラに送る値]で
submitした時に、コントローラで params[名前] で受け取れる。

今回の名前は ":menber"なので、「水野」を選んでsubmitしたら
コントローラで params[:member] で"mizuno" を受け取れる。

## undefined local variable or method `home_changeMember_path'

今のままだとエラーになる。
```home_changeMember_path```ってなんやねーんって感じ。
<img width="717" alt="スクリーンショット 2019-10-26 16.49.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/c71f6bbd-aa2c-7ed5-b452-f36ea7bad35c.png">

実際 ```home_changeMember_path``` って何かと言うと、submit先のメソッドへのパス。
まだパスもコントローラも用意していないので、当然エラーになる。


つまり、必要なのは
1.routes.rbに「homeクラスにchangeMemberメソッド」へのpostを記載
2.homeクラスにchangeMemberメソッド

# routes
##ルーティング追加

```ruby:routes.rb
post "home/changeMember"
```

## AbstractController::ActionNotFound (The action 'changeMember' could not be found for HomeController)

この時点でページを開くことはできているはず。
<img width="152" alt="スクリーンショット 2019-10-27 22.48.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/e89fb655-a410-c037-c10d-31adaa13d45d.png">

しかしsubmitのボタン”Send”をクリックしても何も起こらない。

ターミナルを見てみると以下のようになる。
<img width="566" alt="スクリーンショット 2019-10-27 23.20.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/6ee13cd8-4ca0-6af7-1e72-6d04090079ac.png">


まあコントローラ作ってないので当たり前ですね。

# Controller
とりあえず選んだ選択リストをターミナルに出してみる。

## メソッド追加

```ruby:HomeController
def top
  # 初期表示の処理
end

def changeMember
  puts params[:member]
end
```
##No template found for HomeController#changeMember, rendering head :no_content

「安曇」を選んで”Send”をクリックしてみる。
<img width="116" alt="スクリーンショット 2019-10-27 22.48.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/c31c0aea-d1b9-80a9-211e-9035ab913962.png">

ターミナルは以下のようになる
<img width="570" alt="スクリーンショット 2019-10-27 22.56.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/97ab9008-c14f-95aa-3a0b-19275bf090e5.png">
"azumi"って出力されてる。やったね〜。

でもよく見たらその下にエラーが出ている。。。
No template found for HomeController#changeMember, rendering head :no_content
Completed 204 No Content in 96ms (ActiveRecord: 0.1ms)

changeMember用のページがないって言ってる。
コントローラでrenderがない場合は app/views/コントローラ名/アクション名.html.erb が省略されていると解釈されるらしい。

##コントローラ修正

```ruby:HomeController
def top
  # 初期表示の処理
end

def changeMember
  puts params[:member]
  redirect_to action: :top #同じコントローラのtopメソッドを呼ぶ
end
```
で、同じように「安曇」選んで"Send"をクリックしてターミナルみる
<img width="565" alt="スクリーンショット 2019-10-27 23.04.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/e57525f9-d0fc-011d-7aa1-8f4de2bdd8a6.png">

OKっぽい。完成。
Tensorflowで使用するGPUのメモリを制限したいとき

例えば、使用するメモリをGPUが持つ**メモリ容量の半分=50%に制限したいとする**。
このとき、

```import tensorflow as tf
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.5)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))```

のように書くと、

`module 'tensorflow' has no attribute 'GPUOptions'`

のようなエラーが出た。**なぜ・・・**

どうやら、Tensorflow2.0にはこれらのGPUに関するモジュールがなくなったらしい。（なんで消すねん）
そこで、

`tf.ConfigProto`
を
`tf.compat.v1.ConfigProto`
に**置き換え**ればTensorflow1.0を使用することができる。

したがって、**以下のように書けば動く**
```gpu_options = tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.5)
sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(gpu_options=gpu_options))```
Kubernetes DeamonSetを理解したい！

# DeamonSetとは

- ReplicaSetと似てる
- 各ノードにPodを１つづつ確実に配置する
- ReplicaSetでは指定した数上がってればよくてどのノードで起動するかはk8sがよしなに決める
- 1ノードに2Podずつの配置もできる
- Podを配置したくないNodeがあるときはnodeSelector,Node Anti-Affinityを使う

## コンフィグファイル

```sample-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: sample-ds
spec:
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.12

```

## deploy

```
kubectl apply -f sample-ds.yaml
```

## 各ノードへきれいにばらけて配置される

ノードは２つ

```
kubectl get nodes
```

出力結果

```
NAME                            STATUS   ROLES    AGE     VERSION
ip-172-16-109-200.ec2.internal   Ready    <none>   4h48m   v1.11.10-eks-17cd81
ip-172-16-117-100.ec2.internal   Ready    <none>   4h48m   v1.11.10-eks-17cd81
```

```
kubectl get pods sample-ds-sr6gh -o wide
```

Podその１

```
NAME              READY   STATUS    RESTARTS   AGE    IP               NODE                            NOMINATED NODE   READINESS GATES
sample-ds-sr6gh   1/1     Running   0          112s   172.16.112.125   ip-172-16-117-100.ec2.internal   <none>           <none>
```

Podその２

```
kubectl get pods sample-ds-txhrv -o wide
```

```
NAME              READY   STATUS    RESTARTS   AGE     IP               NODE                            NOMINATED NODE   READINESS GATES
sample-ds-txhrv   1/1     Running   0          2m46s   172.16.109.101   ip-172-16-109-200.ec2.internal   <none>           <none>
```
golang インタフェース

# インタフェースとは
インタフェースはメソッドのシグネチャを定義した、メソッドをひとまとめにしたものである。
また、空のインタフェースなど使い方は色々あるが、今回は私が抱いていたインタフェースはなんのためにあるのかを書いてみたいと思う。

```go
type <型名>　interface {
メソッド
・
・
}
```

## インタフェースの役割
golangにおいて継承という概念はないため、インタフェースを用いて抽象化を行います。また、golangではインタフェースでしか抽象化ができない。ここで、抽象化とは具体的な実装を振る舞いによって共通化することである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340562/cce01eb8-ebef-a2cb-62b3-1a9da9e7ed2b.png)

例えば上の図のように機能Aが共通している場合、インタフェースを用いて機能Aを共通化する。こうすることで、機能Aを修正するときに抽象化した１箇所を修正すればよくなる。逆に機能Aを抽象化していない場合、機能Aが実装されている箇所を全て書き換える必要が出てきてしまう。

## 今回伝えたいこと
1. *golangにおけるインタフェースは抽象化を行う役割をもつ*
2. *インタフェースを用いて抽象化することで依存を最小限にし、修正をする際に手間が省ける*
mysqlデータベースが作成出来ない。ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

#データベースが作成出来ない

composerでlaravelを立ち上げた後にmysqlデータベースの作成を試みた。


```
$ sudo mysql --user="root" -e "CREATE DATABASE laravel character set UTF8mb4 collate utf8mb4_bin;"
```
エラー↓

```
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
```
ふむふむ。
> Access denied

という事でどうやらアクセス権に問題がありそう。。。

という事でログを読んで見ることに。

```
$ vi /etc/my.cnf
```
とするとエラー↓
```
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
 Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
 Settings user and group are ignored when systemd is used.
 If you need to run mysqld under a different user or group,
 customize your systemd unit file for mysqld according to the
 instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
```


<br>

なんやらよー分からんがlog-error(エラー内容)は/var/log/mysqld.logにあるよって事らしい。

```
$ cd /var/log/mysqld.log
```

とするとパスワードが違うなどのメッセージが書かれているらしい。
```
W10: Warning: Changing a readonly file
```
ふむふむ。インストールプログラムの以下の実行時にうまく動作していない？
↑ここでなんと衝撃の事実に気づく。。。
#再インストールは何回もやり直したが、そういえばアンインストールしてないやん。。。

幸いなことに全てデータベースの内容が消えても良い状態だったのでアンインストールすることに。
<BR>

mysqlに関するパッケージを削除する。

```
$ sudo yum -y remove mysql*
```
上記のコマンドをおこなってもデータの残っているディレクトリが存在するので、それも削除します。


```
$ sudo rm -rf /var/lib/mysql

```

の流れから再度インストールしたら正常に動作しました。

困った時のアンインストール→インストール

困った時の再起動

困った時の電源入切（機械系）

を完全に忘れてかなりの時間引っかかってしまったので自分用のメモとして残しておきます。

＃補足情報

php 7.2.23
mysql  Ver 14.14 Distrib 5.7.27, for Linux (x86_64) using  EditLine wrapper
AmazonLinuxでのyum利用
ChromebookのCrostiniにKiCADをインストール

# はじめに
ChromebookでもPCB設計できるのかなぁと思って、基板設計CADツールをインストールしてみた。
「Chrome OSで使えます」って宣言してるのはなさそうやったので、Linuxで使えそうなの探した。
EAGLEかKiCADか迷ったけど、KiCADがCERNにサポートされてるって知ったので、KiCADにしてみた。物理好きなので。

いくつかつまづいたので、時系列順に記載する。

# 環境
Chrome OS
Version 79.0.3943.1 (Official Build) dev (64-bit)

# インストール手順

まずは、Ubuntu向けのインストール方法を試すことにした。
[Ubuntu | KiCad EDA](http://kicad-pcb.org/download/ubuntu/)

```
$ sudo add-apt-repository --yes ppa:js-reynaud/kicad-5.1
sudo: add-apt-repository: command not found
```

しょっぱなからだめやった。
調べたら、`software-properties-common`っての入れたら良さそうやった。
[Can I add repositories /ppas? : Crostini](https://www.reddit.com/r/Crostini/comments/8lzr25/can_i_add_repositories_ppas/)

入れてみる。

```
$ sudo apt update
$ sudo apt install software-properties-common
```

通ってそう。
続ける。

```
$ sudo add-apt-repository --yes ppa:js-reynaud/kicad-5.1
$ sudo apt update
(省略)
Err:12 http://ppa.launchpad.net/js-reynaud/kicad-5.1/ubuntu focal Release
  404  Not Found [IP: 91.189.95.83 80]
Hit:13 https://cdn-aws.deb.debian.org/debian stretch-backports InRelease
Reading package lists... Done 
E: The repository 'http://ppa.launchpad.net/js-reynaud/kicad-5.1/ubuntu focal Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details
```

あやしげなエラー出てる。
とりあえず、続けてみる。

```
$ sudo apt install kicad
```

入ったっぽい。
ちなみに、全部入れようとおもったら、下記コマンドで入るっぽい。
はじめこっちで試してたら、むっちゃ時間かかったので、途中であきらめた。

```
$ sudo apt install --install-suggests kicad
```

# 動作確認
アプリ一覧では、こんな感じ。
![Screenshot 2019-10-27 at 10.06.01 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/9f517829-b3b3-83e0-946f-8d462d297308.png)

立ち上げ画面はこんな感じ。
![Screenshot 2019-10-27 at 10 16 02 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/db762c0e-e80c-a0b9-a54e-bf4f119c3361.png)

回路図はこんな感じのインターフェース。
なんか、カーソルのあとに点線が残る。仕様？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/464ec3cf-3741-40fb-9904-e917bab7aba7.png)

ファンクションキーのショートカットは、`F1`だったら`Search + 1`とか`Search + ←`で代用できた。

# おわりに
インストールは、すんなりいった。
使い方をよくわかってないから、ちゃんと動作するかはもうちょい試さないとわからなさそう。
Chromebookでできること多くて素晴らしい。
標本平均の期待値が母平均となることを数値実験で確認する

# 背景
最近、数理統計学の勉強を始めました。紙とペンで計算を追うのも楽しいのですが、数値実験も楽しいし、よい勉強になるので、少しずつ遊んでみることにしました。

まずは準備体操として、標本平均の期待値が母平均となることを数値実験で確認してみます。

#数値実験
言語はC++を用います。確率分布関数は一次元の一様分布[-1,+1)とします。標本サイズは10とし、10000回抽出を繰り返し、標本平均の平均値が収束することを確認しました。

```c++
#include <iostream>
#include <random>

int main()
{
	std::mt19937 mt(0);
	double a = -1, b = 1;
	std::uniform_real_distribution<double> r(a, b);

	int num_of_sample = 10;//標本サイズ
	int Iter = 10000;//試行回数

	double sum = 0;
	for (int iter = 0; iter < Iter; iter++)
	{
		double avr = 0;//標本平均
		for (int n = 0; n < num_of_sample; n++)
		{
			avr += r(mt) / (double)num_of_sample;
		}
		sum += avr;

		std::cout << iter << " " << sum / (double)(iter + 1) << std::endl;
	}

	return 0;
}
```
![plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/bdf6e4da-5405-3190-eaea-2bd4c4e29082.png)
母平均0に収束することが確認できました。

#まとめ
標本平均の期待値が母平均となることが数値的に確認できました。標本サイズを変えたり、確率分布を変えたりして試してみてもよいですね（というか本来はすべき）。
次回：[標本平均の分散が母分散/標本サイズとなることを数値実験で確認する](https://qiita.com/jajagacchi/items/ddf58418c566183206d4)
必要最低限のvimrc

vimの設定はなるべく少なくすませたいと思っています

私のシンプルなvimrcです

```vim:.vimrc
noremap j gj
nnoremap k gk
set incsearch
set ignorecase
set smartcase
set hlsearch
nnoremap <ESC><ESC> :nohl<RETURN>
set expandtab
set shiftwidth=4
set tabstop=4
set autoindent
set visualbell


if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif

```

## 解説

### 複数行にわたる長い文中でもj、kで上下移動

```vim
noremap j gj
nnoremap k gk
```

### インクリメント検索

```vim
set incsearch
```

### 小文字で入力した場合大文字と区別しないが、大文字の場合は小文字と区別する

```vim
set ignorecase
set smartcase
```

### 検索結果をハイライト。ESC2回押しでハイライトを消す

```vim
set hlsearch
nnoremap <ESC><ESC> :nohl<RETURN>
```

### タブの変わりにスペース4個を使う

```vim
set expandtab
set shiftwidth=4
set tabstop=4
```

### 自動インデント

```vim
set autoindent
```

### ベルをオフ

```vim
set visualbell
```

### ファイルを再度開いた際に、以前編集した場所にカーソルを移動

[How do I get VIM to remember the line I was on when I reopen a file?](https://askubuntu.com/questions/202075/how-do-i-get-vim-to-remember-the-line-i-was-on-when-i-reopen-a-file)

```vim
if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif
```
無料GPU (Google Colaboratory)でDeep Learningやってみた

#Deep Learningをするための環境設定
Google Colabratory利用のメモです。

Deep Learningの勉強をしたいと思ったのですが、GPUも持っていないしどうしよう…と思っていたときに友達に勧めていただいたのがGoogle Colabratoryです。

#無料GPU (Google Colabratory)について
無料でGPUとTPUを使うことができるGoogleのサービスです。
ブラウザ上で動作するJupyter Notebookで、**環境構築が無用である**ことが大きなメリットです。
ルールは簡単で、12時間以内に処理が終わること (連続12時間で終了してしまう)
それ以外は細かなルールのみなので省きます。
[ここ](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)を参考にしてください。

#Tensorflowの利用
Jupyter Notebook上で以下を入力してTensorflowのバージョンを確認する。

```ruby
import tensorflow as tf
print(tf.__version__)
```
ランタイム/ランタイムのタイプを変更でハードウェアアクセラレータをGPUに変更
以下のコマンドでGPUに対応したTensorflowをインストールする。

```ruby
!pip install tensorflow-gpu
```
インストールが完了したらランタイムをリスタートして、以下のコマンドでGPUが有効であることを確認する。

```ruby
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```
これでTensorflowが使えるようになります。

#東大松尾研のDL4USに挑戦！
Tensorflowが使えるようになったので、実際にDeep Learningを回してみたいと思います。
-- [ここ](https://github.com/matsuolab-edu/dl4us)からzipをダウンロードして解凍
-- 解凍出来たら、Google Driveに適当なフォルダを作成
-- 作成したフォルダに解凍した全ファイル、フォルダをアップロードします。
-- あとは、各Lessonごとに.ipynbのファイルがあるので、「アプリで開く」からGoogle Colaboratoryを選ぶだけ
これだけで、DL4USにあるDeep Learningツールは使えるようになります。
また、これはとても勉強にもなりますので、是非お勧めします。

#終わりに
今回はDeep Learning入門ということでGoogle Colaboratoryを用いて東大松尾研のDL4USを使う準備をしました。 (実際にはすべてJupyter Notebookで書かれているので私がここに記述することがなかっただけですが…)
Gemfile.lockがなぜかコミットされていなくてHerokuでビルドできなかった

Railsチュートリアルで嵌ったので備忘録的に書いていきます。

# Herokuでビルドに失敗する
Railsチュートリアルの指示に従い下記コマンドを実行する。

    git push heroku master

HerokuをのぞいてみるとBuild failedが表示されている。
チュートリアルに従っているのになぜ・・・と思いつつビルドログを除くと

    -----> Ruby app detected
    -----> Compiling Ruby/Rails
    -----> Using Ruby version: ruby-2.5.6
    -----> Installing dependencies using bundler 1.17.3
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
       You are trying to install in deployment mode after changing
       your Gemfile. Run `bundle install` elsewhere and add the
       updated Gemfile.lock to version control.
       
       The dependencies in your gemfile changed
       
       You have added to the Gemfile:
       * pg (= 0.20.0)
       Bundler Output: You are trying to install in deployment mode after changing
       your Gemfile. Run `bundle install` elsewhere and add the
       updated Gemfile.lock to version control.
       
       The dependencies in your gemfile changed
       
       You have added to the Gemfile:
       * pg (= 0.20.0)
     !
     !     Failed to install gems via Bundler.
     !
     !     Push rejected, failed to compile Ruby app.
     !     Push failed

update Gemfile.lockとあるのでGemfile.lockを確認してみることに

# Gemfile.lockがコミットされていなかった
git statusを実行してみる。
どうやらGemfile.lockがコミットされていないようだ。
ステージングエリアに移行するときは以下のコマンドを実行しているので、なぜ漏れているのかは分からない。。。

      git add -A


Gemfile.lockをコミットしたら、ビルドに成功しました。
Open API で開発する時の環境を整える

## 注意

自分用メモです。
業務で使うことになったので。
自分用のめもなので、当てにしないで下さい。
一時リソースは公式を見ましょう。

## ちょっ早でやりたい人

```
git clone git@github.com:Asya-kawai/swagger-env.git
cd swagger-env
```

エディタを起動する。

```
docker-compose -f docker-compose-swagger-editor.yaml up
```

8001で起動するので後はAPIを作って下さい。
APIはyamlとかjsonでファイルに出力できるので。

リポジトリで公開。

```
bash install-docs.sh <APIを公開したいリポジトリ名> <↑で作ったAPIファイル>
```

以降は、ゆっくりしたい人のもの。

## 用意するもの

* Docker
* Docker compose

Docker や Docker compose のインストールはここ見てインストールしてな。
https://github.com/docker/compose/releases

見ても分からなければ、思考停止でこれうって。

```
curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

* swagger-editor (swaggerエディタ。open api を開発するためのエディタ)
* swagger-ui (open api な yamlとかjsonを表示するためのWebアプリケーション)

## 今回の仕様

* エディタをローカルホストの8001ポートで起動し
* ローカルホストの8000ポートでUIを表示し確認する

## swagger-editor のインストール

ここみて、ほしいバージョンをインストール
https://hub.docker.com/r/swaggerapi/swagger-editor/

見ても分からなければ、思考停止で以下のコマンドうって、エディタ起動してみて。

```
docker pull swaggerapi/swagger-editor
docker run -d --rm -p 8001:8080 swaggerapi/swagger-editor
```

## swagger-ui のインストール

ここみて、ほしいバージョンをインストール。
https://hub.docker.com/r/swaggerapi/swagger-ui/

見ても分からなければ、思考停止で以下のコマンドうって。

```
docker pull swaggerapi/swagger-ui
```

## 使い方

* swgger-editor で編集
* 上部のFileタブから「Save as YAML」を選択
* Downloads以下にXXXX.yamlが保存されるたことを確認

今回は、openapi.yaml で出力した。

```
ls openapi.yaml
openapi.yaml
```

* そのあと上記のXXXX.yamlファイルを swagger-ui にマウントさせて表示

```
docker run --rm \
  -v $(pwd)/openapi.yaml:/usr/share/nginx/html/openapi.yaml \
  -e API_URL=openapi.yaml \
  -p 8000:8080 swaggerapi/swagger-ui
```

## おまけ

githubで swagger-ui を公開する方法は以下の通り。

まずは、自分のリポジトリにdocsディレクトリを作成。

```
cd <Your-repository>
mkdir docs
```

その後。swagger-ui の dist ディレクトリ内を全てコピー。

```
git clone https://github.com/swagger-api/swagger-ui.git
cd swgger-ui
cp -r dist/* <Your-repository>/docs/
```
以下の行を書き換え

```diff
    window.onload = function() {
      // Begin Swagger UI call region
      const ui = SwaggerUIBundle({
-     url: "https://petstore.swagger.io/v2/swagger.json",
+     url: "./openapi.yaml" 
```

## 参考

* [Dockerを使ってswagger.yamlをサクッとみる (swagger-ui 3.x)](https://qiita.com/NewGyu/items/6a00e0f09a7f8a93cfd5)
* [GitHubPagesでSwaggerUIホスティング](https://qiita.com/gyamoto/items/b2055e1bcd35bdb3dc31)
* [SwaggerUIを簡単にGithub Pagesで公開する方法](https://qiita.com/youdays/items/38f15b90402d097fb13e)
* [swagger yaml → html変換メモ](https://qiita.com/mokkos/items/3dc977b8b231adbbedf7)
* [【Docker】Dockerでホストのディレクトリをマウントする](https://qiita.com/Yarimizu14/items/52f4859027165a805630)
ずんだの二桁の整数の桁入れ替えと合計と剰余問題 Ruby編

2桁の自然数と、その1桁目と2桁目を入れ替えた数の合計が11の倍数になっていることを個別の計算結果で表示してみましょう。

## ルール
1. 10 から 99 までの自然数を A とする
2. A の1桁目と2桁目を入れ替えた数を B とする
3. A と B の合計を C とする
4. C を 11 で割った場合の剰余を D とする
5. 10 から 99 までの自然数に関して A , B, C, D を Mardown で出力する
6. Markdown のフォーマットは以下のような形式とする

```
base|reverse|sum|surplus
---:|---:|---:|---:
10|1|11|0
※中略
99|99|198|0
```

## プログラム
```ruby
base = [*10..99]
sums = base.each_with_object([]).with_index do |(e, a), i|
  reverse = base[i].to_s.reverse.to_i
  sum = base[i] + reverse
  a << [base[i], reverse, sum, sum % 11]
end
sums

puts "base|reverse|sum|surplus"
puts "---:|---:|---:|---:"
sums.each do |numbers|
  puts numbers.join("|")
end
```

### 出力
```
base|reverse|sum|surplus
---:|---:|---:|---:
10|1|11|0
11|11|22|0
12|21|33|0
13|31|44|0
14|41|55|0
15|51|66|0
16|61|77|0
17|71|88|0
18|81|99|0
19|91|110|0
20|2|22|0
21|12|33|0
22|22|44|0
23|32|55|0
24|42|66|0
25|52|77|0
26|62|88|0
27|72|99|0
28|82|110|0
29|92|121|0
30|3|33|0
31|13|44|0
32|23|55|0
33|33|66|0
34|43|77|0
35|53|88|0
36|63|99|0
37|73|110|0
38|83|121|0
39|93|132|0
40|4|44|0
41|14|55|0
42|24|66|0
43|34|77|0
44|44|88|0
45|54|99|0
46|64|110|0
47|74|121|0
48|84|132|0
49|94|143|0
50|5|55|0
51|15|66|0
52|25|77|0
53|35|88|0
54|45|99|0
55|55|110|0
56|65|121|0
57|75|132|0
58|85|143|0
59|95|154|0
60|6|66|0
61|16|77|0
62|26|88|0
63|36|99|0
64|46|110|0
65|56|121|0
66|66|132|0
67|76|143|0
68|86|154|0
69|96|165|0
70|7|77|0
71|17|88|0
72|27|99|0
73|37|110|0
74|47|121|0
75|57|132|0
76|67|143|0
77|77|154|0
78|87|165|0
79|97|176|0
80|8|88|0
81|18|99|0
82|28|110|0
83|38|121|0
84|48|132|0
85|58|143|0
86|68|154|0
87|78|165|0
88|88|176|0
89|98|187|0
90|9|99|0
91|19|110|0
92|29|121|0
93|39|132|0
94|49|143|0
95|59|154|0
96|69|165|0
97|79|176|0
98|89|187|0
99|99|198|0
```

## 出力を実際に Markdown として貼り付け
base|reverse|sum|surplus
---:|---:|---:|---:
10|1|11|0
11|11|22|0
12|21|33|0
13|31|44|0
14|41|55|0
15|51|66|0
16|61|77|0
17|71|88|0
18|81|99|0
19|91|110|0
20|2|22|0
21|12|33|0
22|22|44|0
23|32|55|0
24|42|66|0
25|52|77|0
26|62|88|0
27|72|99|0
28|82|110|0
29|92|121|0
30|3|33|0
31|13|44|0
32|23|55|0
33|33|66|0
34|43|77|0
35|53|88|0
36|63|99|0
37|73|110|0
38|83|121|0
39|93|132|0
40|4|44|0
41|14|55|0
42|24|66|0
43|34|77|0
44|44|88|0
45|54|99|0
46|64|110|0
47|74|121|0
48|84|132|0
49|94|143|0
50|5|55|0
51|15|66|0
52|25|77|0
53|35|88|0
54|45|99|0
55|55|110|0
56|65|121|0
57|75|132|0
58|85|143|0
59|95|154|0
60|6|66|0
61|16|77|0
62|26|88|0
63|36|99|0
64|46|110|0
65|56|121|0
66|66|132|0
67|76|143|0
68|86|154|0
69|96|165|0
70|7|77|0
71|17|88|0
72|27|99|0
73|37|110|0
74|47|121|0
75|57|132|0
76|67|143|0
77|77|154|0
78|87|165|0
79|97|176|0
80|8|88|0
81|18|99|0
82|28|110|0
83|38|121|0
84|48|132|0
85|58|143|0
86|68|154|0
87|78|165|0
88|88|176|0
89|98|187|0
90|9|99|0
91|19|110|0
92|29|121|0
93|39|132|0
94|49|143|0
95|59|154|0
96|69|165|0
97|79|176|0
98|89|187|0
99|99|198|0
Railsのlink_toの引数にオブジェクトを指定してなぜリンクが生成されるのか

# link_toの遷移先にオブジェクトを指定してリンクができる仕組みが分からない

Railsチュートリアルに以下のコードがある

```ruby:index.html.erb
  <% @users.each do |user| %>
    <li>
      <%= gravatar_for user, size: 50 %>
      <%= link_to user.name, user %>
    </li>
  <% end %>
```
この、<%= link_to user.name, user %>はブラウザ上で何が生成されたかを見ると

\<a href="/users/1">Example User\</a>

のような形式となる。Example Userはuserのオブジェクトのname要素をそのままリンクの文字として渡しているので分かるとして
第二引数のuserがどうして画面上都合よく/users/1と解釈されるのか

# link_toのリンク先の生成はurl_forに依存する
https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

API仕様によると、link_toでオブジェクトを指定した場合
オブジェクトはurl_forで解釈される
そのため、<%= link_to user.name, user %>のuserはurl_for(user)となる。
それにより、users/1へと変換される
AWS(EC2)でFlaskを使用したサーバーを実装

#概要
webアプリケーションを作成したい。
flaskを使用してローカルで作成することはできる。
サーバーを使ってみた。
もっと簡単な方法とかありそうだけどよくわかっていない。

#やること
- [1. AWSアカウントの作成](#1-awsアカウントの作成)
- [2. インスタンスの作成](#2-インスタンスの作成)
- [3. sshでインスタンスへ接続](#3-sshでインスタンスへ接続)
- [4. セキュリティを変更して5000を通す](#4-セキュリティを変更して5000を通す)
- [5. flaskを実装して実行](#5-flaskを実装して実行)

#1. awsアカウントの作成

[AWS](https://aws.amazon.com/jp/) で作成する

#2. インスタンスの作成
ec2にアクセス。
インスタンスの作成を選択
Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type を選択
無料利用枠のを選択して作成する。
プライベートキー(hoge.pem)を保存する。

#3. sshでインスタンスへ接続
公式の [SSH を使用した Linux インスタンスへの接続](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)を参照。
やることは
- プライベートキー(hoge.pem)のパスを指定
- AMI のユーザー名を指定(ec2-userでよし)
- パブリックDNS名(dns)を取得 ec2のインスタンスに書いてある
`ssh -i path/hoge.pem ec2-user@dns.amazonaws.com`

#4. セキュリティを変更して5000を通す
ec2の、セキュリティグループ、インスタンス、インバウンド、編集、を選択しカスタムTCPを追加する。
<img width="803" alt="スクリーンショット 2019-10-27 22.20.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/cae470ee-475e-6932-6fe4-1c6b09e00bf2.png">

#5. flaskを実装して実行
##5.1 gitのインストール
`sudo yum install git`
##5.2 pyenvをインストール
[CentOS に pyenv で Python インストールしてみた](https://enomotodev.hatenablog.com/entry/2016/12/29/142900)を参考。
- `sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel git`
- `git clone git://github.com/yyuu/pyenv.git ~/.pyenv`
- `echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile`
- `echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile`
- `echo 'eval "$(pyenv init -)"' >> ~/.bash_profile`
- `source ~/.bash_profile`

インストールの確認は `pyenv --version`

##5.3 python3をインストール
- `pyenv install 3.7.4`
- `pyenv local 3.7.5` ローカル環境でpythonのバージョンを指定
- `python -V` で確認

flaskの実装して実行する。

# 参考 
[EC2サーバにPython3環境構築](https://qiita.com/tisk_jdb/items/01bd6ef9209acc3a275f)
[Amazon AWS(EC2)でのFlask環境の作成方法](https://newtechnologylifestyle.net/amazon-awsec2-flask/)

# 終わりに
思っていたより簡単だった。
「無料利用枠」を信じているけど、大丈夫だよね
Swift Package Managerでライブラリを入れたらTestsターゲットでエラーが出てSwiftUIプレビューが使えなくなった場合

##開発環境
Xcode 11.1
SwiftUI

##発生事象
SDWebImageSwiftUIをSwift Package Manager(以下、SPM)を用いて追加したら、SwiftUIのプレビュー機能がビルドエラーで使えなくなってしまいました。

エラー一覧を確認すると、Testsターゲットで `SDWebWebImage` と`SDWebImageObjc` が見つからないよ！
と怒られていました。

##対処法
プロジェクトを選択し、`TARGETS` からテストターゲット（`XXXTests`）を選択し、
`Build Phases` -> `Link Binary With Libraries` にSDWebImageSwiftUIを追加したら解決しました。

<img width="906" alt="スクリーンショット 2019-10-27 22.13.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/94fda591-6d3c-ee69-64a7-e6b1acd3e5a0.png">

他のライブラリでは起こらなかったような気がするのですが、次に遭遇した時の備忘録として書き残しておきます。
自分用

metaタグはサイトの情報を検索エンジンやユーザーに伝えるために必要なタグ
head内に書く

meta charset="utf-8"(文字エンコード)必須

meta name＝"description" content="サイトの概要説明"(メタディスプリクション)
検索結果に表示される部分、アクセスアップにつながる大事な部分。


meta  name＝"viewport" 
      content＝"width＝devise-width"
(スマホページの最適化)必須
【ServiceNow】Developer Instanceのバージョンアップグレードしよう。

2023/08/07更新 My Instanceの画面変更に伴い、画像を差し替えました。また選択できるバージョンはUtah,Tokyo,Sandiegoとなります。

前回払い出したServiceNowインスタンスのバージョン払い出しはMadridで行いました。今回の記事では現在最新バージョンである[NewYork]へアップグレードする手順となります。


※本番環境のバージョンアップ
本番環境にてバージョンアップ、パッチ適用などを実施する場合は各環境の管理者がServiceNowとHi Portal（https://hi.service-now.com/hisp）
上で調整して実施ください。

では、初めて行きたいと思います。

#1.管理画面にログインします。

以下にアクセスし、管理画面にログインしましょう。
https://developer.servicenow.com/app.do

※ユーザ登録が済んでいない方は以下URLの[ユーザ登録]を行いましょう。
https://qiita.com/d_karunwork82/items/dcf9453eb442936c68b2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/403d172d-ffdb-c7ee-fb4a-cb902780a24e.png)

#2.リクエストを行います。

[Action] 〉[Upgrade Instance]と選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/34d31b03-505a-69cf-9663-600cecc98240.png)

Upgrade先を指定後、Upgrade Instanceを選択しましょう。

リクエストが完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/b89ef686-3e24-681f-b658-25afedd387fe.png)


#3.Upgrade完了のメールを受信して、更新を確認。
※この時は2時間弱でメールを受信していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/7f5fe7fa-90a8-2590-cf62-0c5fc7c9c9e4.png)

ログインして確認してみましょう！
無事バージョンが上がりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/520970b0-3157-b844-05e6-5b3d4f75408e.png)

次回は、
Update sets、Add to Update sets Pluginに関する記事を公開予定です。

宜しくお願いします。('ω')
SwiftUIでTextViewを使う

SwiftUIではUIKitのUITextViewに対応する物がありません。
TextFieldには[LineLimit](https://developer.apple.com/documentation/swiftui/textfield/3277098-linelimit)なるプロパティーも存在して複数業の入力ができそうですが、
2019年10月現在では、SwiftUIでT複数行入力できるViewを使うにはUITextViewをラップするしかなさそうです。

ここら辺も普通のUIViewRepresentableのお作法ですが、

``` .swift
struct TextView: UIViewRepresentable {
    @Binding var text: String

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        textView.delegate = context.coordinator
        textView.isScrollEnabled = true
        textView.isEditable = true
        textView.isUserInteractionEnabled = true
        textView.backgroundColor = .green
        return textView
    }

    func updateUIView(_ textView: UITextView, context: Context) {
        textView.text = text
    }
}

extension TextView {
    final class Coordinator: NSObject, UITextViewDelegate {
        private var textView: TextView
        
        init(_ textView: TextView) {
            self.textView = textView
        }
        
        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            return true
        }
        
        func textViewDidChange(_ textView: UITextView) {
            self.textView.text = textView.text
        }
    }
}
```


[stack overflow](https://stackoverflow.com/questions/56471973/how-do-i-create-a-multiline-textfield-in-swiftui)



---

余談: UITextViewの初期化部分をクロージャーで使う側で設定して見るのはどうなのか・・

``` .swift
struct TextView {
    @Binding var text: String
    let configure: (UITextView) -> ()
    
    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        configure(textView)
        return textView
    }
}


TextView("text") { textView in 
    textView.isScrollEnabled = true
    textView.isEditable = true
    textView.isUserInteractionEnabled = true
}
```
AWSのAthenaでS3のファイルを分析しようとしたらトラブった話

## トラブル概要

S3にあるtsvファイルをAthenaでテーブル化してQuickSightで可視化したい。

```sql
CREATE EXTERNAL TABLE `2019101919_sample_data`(
  `created_at` string, 
  `updated_at` string, 
  `id` string, 
  `title` string, 
  `user` string, 
  `likes_count` bigint, 
  `comments_count` bigint, 
  `page_views_count` string, 
  `url` string, 
  `tags` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://test-playground/2019/10/2019101919_sample_data.tsv'
```

このクエリ文自体は成功する。
が、なぜか結果が返ってこない。

<img width="1039" alt="スクリーンショット 2019-10-27 21.37.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166931/3d02e257-0f59-e022-a31f-145bb1e703bb.png">


## 解決策

`Zero records returned`というエラーが出ているが、そもそも結果をよくみるとData scanned: 0KBと出ている。これは`LOCATION`句のS3のパスが間違っているのが原因であるらしい。

別にファイルの場所は間違ってないし、アクセス権限も問題ないんだが…

公式のマニュアルをよくみてみる。

>ファイルの場所を指定するために、ファイル名、アンダースコア、ワイルドカード、または glob パターンを使用しないでください。
[Amazon S3 のテーブルの場所 - Amazon Athena](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/tables-location-format.html?shortFooter=true)

Athenaでファイル名をダイレクトに指定するのはダメ！

ということで分析したいファイルの場所をどこか適当なフォルダ配下に移行する。
~~例えば```s3://test-playground/2019/10/19/19/data.tsv```など~~　※後述


例えば2019/10/19 19:00のデータを
```s3://test-playground/sample-data/dt=2019-10-19/19.tsv```
というように格納する。

```sql

CREATE EXTERNAL TABLE `2019101919_sample_data`(
  `created_at` string, 
  `updated_at` string, 
  `id` string, 
  `title` string, 
  `user` string, 
  `likes_count` bigint, 
  `comments_count` bigint, 
  `page_views_count` string, 
  `url` string, 
  `tags` string)
PARTITIONED BY ( 
  `dt` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' -- ここがただの空白になっていないことを確認する
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://test-playground/sample-db/dt=2019-10-19/' --　ここをフォルダ名にする！
```

これでうまく結果が返ってくるようになった。

ちなみにtsvの区切り文字だが、Athenaのコンソール画面からテーブル作成するとただの空白になっているので注意。

## 学び

### GlueのデータカタログをAthenaに統合する場合は注意！
そもそも何でこんなエラーにぶち当たったかというと、

- Lambdaで一時間に一回データを収集してS3に保存
- GlueでS3のファイルを全部テーブル化
- Athenaで分析

こういうシナリオだった。

この場合Glueで素直にクローラーを作ってテーブルを作ると**1ファイルにつき1テーブル**作成されてしまう。
Glueのコンソールからはしっかりテーブル作成できているように見えるが、いざAthenaで分析しようとすると結果が返ってこないというエラーにぶち当たるわけだ。


### データを格納するときにHiveのパーティション形式で保存すると便利

※tokusyuさんのコメントを反映しました。

そもそものデータ収集の際のoutput先を下記のように指定しておくと便利。

~~`s3://<bucket>/<year>/<month>/<day>/<hour>/data.tsv`~~
`s3://<bucket>/<適当なディレクトリ名>/dt=<year>-<month>-<day>/<hour>.tsv`


こうしておけば、データを格納すると同時にパーティショニングも実行できる。

あとはAthenaから下記のようにパーティションをロードすればOK。

```sql
MSCK REPAIR TABLE <テーブル名>;
```

![スクリーンショット 2019-10-28 16.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166931/56605f4a-5bd5-929e-68bb-d59ecbd75628.png)


パーティション分割を行うことでデータのスキャン量が削減できる。そのため時間短縮やコスト削減につながるのでぜひやっておきたい。
Git for windowsを設定する

Gitをインストールすればすぐ使えるのかと思ったら、いろいろな設定が必要だったので
フォルダの作成、フォルダの移動、レポジトリの設定までをまとめてみる。

#名前とメールアドレスの設定
GitBushを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/349e50c7-898e-ed8a-7242-e0b158de39df.png)
ユーザー名を設定するため、以下のように入力する。

```
$ git config --globaluser.name "自分の名前"
```
次にメールアドレスを設定するため、以下のように入力する

```
$ git config --globaluser.email XXXXX@yyy.com
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/ca743c44-8572-a702-1cb9-91697e22f15c.png)

設定内容を確認するため

```
git config --list
```
と入力し、下図の赤枠部に設定した名前とメールアドレスが表示されればOK/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/597379ea-6868-e959-0b9c-b54a721e3d8b.png)

#リポジトリの初期化
###リポジトリ用のフォルダを作成する
「Git Bash」起動時のホームディレクトリーは、「C:\Users\UserName」になっているので、まずGit_repositoryというフォルダを作成する

```
mkdir Git_repository
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/a7764307-0f44-5561-5e47-94175adf9f87.png)

###作成したフォルダに移動する

```
cd Git_repository
```
以下のようにコマンドプロンプトに移動したいフォルダ名が表示されていれば移動完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/2be48772-2670-77ff-df3e-b23decd738d0.png)

###ローカルリポジトリを作成する

```
git init
```

以下のようにInisialized empty Git repository in *****と表示されればローカルレポジトリが無事作成されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273281/b151238f-f12b-b778-2ee7-eedf0fc98b4c.png)

ここまで設定してようやくGitを使えるようになるので、次はGitを使ってEvernoteSDKをインストールする。
jspのurl prefix(メモ)

<img width="1076" alt="スクリーンショット 2019-10-27 21.49.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100352/dd760fa0-9564-75aa-45d9-5bb3e01b0240.png">

Application contextを変更する