OmniAICreator/Qiita-1.07M huggingface dataset:
aws-mobile-react-native-starterの紹介


ReactNativeでv4signをどのように実装すれば良いのか調べていたところ、[aws-mobile-react-native-starter](https://github.com/awslabs/aws-mobile-react-native-starter)というリポジトリを見つけました。

このリポジトリはReactNativeの実装のサンプルで、AWSを利用したサーバーレスアーキテクチャでペットトラッカーというペットの情報を登録することができるアプリとサーバーサイドのサンプルになっています。
ReactNativeとAWSを利用してアプリ開発を初めてする時の参考になりそうです。


# 使い方
## MobileHubセットアップ
このアプリをビルドして使用するには、AWSのMobileHubのセットアップが必要です。
以下の手順でMobileHubのプロジェクトを作成します。

1. MobileHubのプロジェクトの作成ページからimportをクリックします。
![rn_starter_1.png](https://qiita-image-store.s3.amazonaws.com/0/18273/a0513e1b-f1b1-8c22-6915-118a3466859a.png "rn_starter_1.png") 

2. `backend/import_mobilehub/reactnative-starter.zip`をインポートして、MobileHubのプロジェクトを作成します。
![rn_starter_2.png](https://qiita-image-store.s3.amazonaws.com/0/18273/5956e4f9-25f7-67b1-34eb-3174a39144d3.png "rn_starter_2.png")

3. 正常にプロジェクトが作成できると次のような画面になるので、Get Startedをクリックして使用開始しましょう。
![rn_starter_3.png](https://qiita-image-store.s3.amazonaws.com/0/18273/b0be6739-3056-3d2f-52d8-598d6bc5c9be.png "rn_starter_3.png")

4. 作成したプロジェクトのページをスクロールして、Hosting and Streamingをクリックします。
![rn_starter_4.png](https://qiita-image-store.s3.amazonaws.com/0/18273/8b8b6c3c-b14c-7d84-1a2d-bb4a3805c825.png "rn_starter_4.png")

5. スクロールして、Download aws-exports.js fileをクリックして、aws-exports.jsをダウンロードします。 このファイルにいま作成したMobile HubのプロジェクトやAWSへの接続情報などが含まれるので、この後アプリに組み込んで使用します。
![rn_starter_5.png](https://qiita-image-store.s3.amazonaws.com/0/18273/01faf0a3-d954-3530-58cf-e37821d1835c.png "rn_starter_5.png")

## アプリの実行

1. ダウンロードしたaws-exports.jsを`client/`に保存します。
2. `cd client` します。
3. `npm install` で必要なパッケージのダウンロード
4. `npm start` します。
5. `npm start`が正常に待ち受け始めたら、別のターミナルから`cd client`して、`react-native run-ios`します。 

これでiOSシミュレータが起動し、アプリが起動されます。

# アプリの機能
アプリの機能を紹介します。

## ユーザー登録
新規にユーザー登録することができます。Cognito User Poolに登録されます。
![rn.png](https://qiita-image-store.s3.amazonaws.com/0/18273/5a2b2338-0341-3b8b-47bc-58862f305346.png "rn.png")

### パスワード
8文字以上で記号と大文字小文字が必要です。次のパスワードは利用できました。
`Hoge_123`

### 電話番号
ちょっと分かりにくいですが`+<国コード><携帯番号番号>`を入力します。
電話番号が`08012345678`だとしたら、入力する値は`+8108012345678`とします。

### 2要素認証
入力した電話番号にSMSが届くので、確認コードを入力するとユーザー登録が完了します。



## ログイン
ユーザー名、パスワードを入力してSIGN INをクリックすると、SMSに2要素認証のコードが届くので、それを入力することでログインできます。

|||
|---|---|
|![a](https://qiita-image-store.s3.amazonaws.com/0/18273/7886349f-80f4-a858-6038-59ce0fb34f91.png)| ![a](https://qiita-image-store.s3.amazonaws.com/0/18273/19276b17-1dac-c040-f680-beabb445f327.png "Simulator Screen Shot - iPhone 6 - 2017-11-11 at 09.28.56.png")|

## ペット登録
ペットを登録できます。画像のアップロードやDatePicker、SegmentedControl的なものの使用方法がわかります。画像はS3に、データはAPIGatewayを経由してDynamoDBに保存されます。

![a](https://qiita-image-store.s3.amazonaws.com/0/18273/9a76f117-89a1-fccb-8841-f31c4cf71c23.png "Simulator Screen Shot - iPhone 6 - 2017-11-11 at 09.38.51.png")

## ペット一覧
ペットが登録されているとリストで確認することができます。
ListView的なものの使用方法がわかります。
`+`ボタンを見るとマテリアルデザインですね。

## その他
パスワードの変更や、サインアウトすることもできます。
特に認証周りを手厚く実装しているサンプルですね。



# まとめ
いかがでしたでしょうか。
ReactNativeとAWSを使ったサンプルアプリの紹介でした。このような参照実装があると便利でありがたいですね。
このアプリ使ってみてReactNativeいい感じなので、次にプライベートで作るアプリはReactNativeで作ろうかなと思います。

# 追伸
v4signは `aws4-react-native`というパッケージを使用しているみたいでした。
MATLAB > freeBoundary()を試してみた > tetmeshを処理してみた > 疑問点

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

https://github.com/gradywright/spherepts/blob/master/code/getIcosNodes.m
にて使われているfreeBoundary()。
その中身を理解してNumpy実装できるだろうか。

https://jp.mathworks.com/help/matlab/ref/trirep.freeboundary.html
にある例を実行してみる。

```
trisurf(tri, xf(:,1),xf(:,2),xf(:,3), ... 'FaceColor','cyan', 'FaceAlpha', 0.8);
```
はそのままでは実行できないので、以下のようにした。


```MATLAB
load tetmesh
trep = TriRep(tet, X);
[tri xf] = freeBoundary(trep);
trisurf(tri, xf(:,1),xf(:,2),xf(:,3), 'FaceColor', 'cyan', 'FaceAlpha', 0.8);
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2aaefbb5-7f55-fd4c-4032-ce7d22704cb6.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/34e7f71f-4bcb-0c34-6002-cdfcf8fe7d7b.png)

### 疑問点

- 1456(Xの項目数）の座標から1079(xfの項目数）の座標に減っている
- 4969(tetの項目数)のインデックス組合せから2174(triの項目数)のインデックス組合せに減っている

一方で、[MATLAB > freeBoundary() > 四角形をfreeBoundaryしてみる > 2つでなく4つの三角形のインデックスが得られる](https://qiita.com/7of9/items/5d7008d974d256fd5da3)で試したところ、座標やインデックス組合せは減るのではなく、増えている。


### link

https://jp.mathworks.com/help/matlab/ref/trisurf.html
MATLAB > clear [変数名] > ワークスペースから変数を消す

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a60d1666-5a11-3969-9eed-5458a030d71a.png)

ワークスペースから不使用変数を消したい。
clearを使うようだ。

https://jp.mathworks.com/help/matlab/ref/clear.html

```matlab
clear R
```

変数Rが消える。

clearだけだとすべての変数が消える。
【AWS SDK】IAMロール情報での認証に失敗したらcredentialsが邪魔をしている。かも

# 前提
EC2からDynamoDBへIAMロール情報を使って認証しようと試みる(AWS SDK for PHP)

# IAM認証が働かない
ソースコード内でアクセスキー/シークレットキーを明記しなかったので、IAMロール情報を使ってくれる、と思いきやその前にcredentialsファイルを勝手に読みに行く。credentialsファイルに書かれたアクセスキー/シークレットキーを使って認証を試みるので認証に失敗する。

# 解決策
環境変数AWS_PROFILEでアクセスキー/シークレットキーの記載のないプロファイルを指定する。
(credentialsファイルを読めないようにしてもいいけど)
※最初はdefaultを勝手に読んでる？？

# まとめ
関係のないアクセスキー/シークレットキーが、IAMロール認証を邪魔している事がある

# 参考
より詳細な認証順番は公式のドキュメント見てください。credentialsより早く探される認証情報もあります。(ちなみにIAMロール情報は最後に検索される)
https://docs.aws.amazon.com/ja_jp/sdk-for-java/v1/developer-guide/credentials.html
技術師匠の皆様の教えを記録する

私には何名かの師匠がいる。私は技術力は３流なので、ちゃんとしたプログラマになりたい。だから、イケてる人をみると教えを得るようにしている。見返すことができるように、その内容をまとめておく。

# 1. 小さなハローワールドを繰り返し、ブログに記録する

私のNo.1 師匠である、かずきさんから教えてもらったこと。彼と Hackfest に参加した時に、APIリファレンスを見ることなく、APIの中身のアーキテクチャまで理解していながら、高速に開発する姿は最高だった。一方私は、何しても人の三倍かかって、しょっちゅう Google のお世話になっている。

彼に教えてもらったことが、このことで、「小さなハローワールド」を繰り返すということだ。何か新しいこと、に出会ったら、難しいことをしなくていいので、自分の手の届くような小さなハローワールドレベルのプログラムを書く。その時に重要なのは、ドキュメントにあるコードをそのままではなく、自分なりに少し変えて作る。そしてそれをブログに書く。

コードを変えるのは、やっぱり自分でできるようになっているかすることもあるだろうし、ブログに書く時に、他人に説明する程で書くのがいい。自分で理解できていないことがその時にわかる。他の人のためにブログを書いているわけではないので、アクセスとかは気にしなくていいが、「他の人が理解」できるように書くことで、理解を深めて、自分にも記憶に残りやすくなる。また忘れた時も便利。

これを実践している時に感じたポイントは、「問題を小さく分ける」ということ。結構難しいが、複数のことが絡み合うから、ややこしい。だから、同時に試す要素は１要素にする。そのために、面倒でも、新しいプロジェクトを作ると良い。人間は難しいことを一気に解決できない。こうしたハローワールドを繰り返しているといつしか高いところにいることに気づくとのこと。このメソッドは相当強力であると感じている。

<img width="889" alt="Screen Shot 2017-11-11 at 10.24.05 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/3bb69cf6-3580-5f62-cf2b-2e21cd3d2c67.png">

私のQiita のエントリがそれなのだが、いかに他の人にとってどうでもいい内容をブログにしているかわかるだろう。ポイントは、自分にとってわからないことか、そして、自分にとって小さなハローワールドかだ。だから、他の人にとって役に立つか、とか既知の情報であるかは気にしていない。

ちなみに、他の人に役立ちそうだなと思った時で、英語にも既存のリソースがなさげな時は英語で書いている。

*[Live DevOps in Japan](https://blogs.technet.microsoft.com/livedevopsinjapan/)

# 2. コマンドを使ったらその前後で何が変わるかを理解する

どんな技術でも使いこなし、とてつもなく学習が早く、衝撃的な Hack力を持つ Ken さんに教えてもらったこと。彼は、新しいコマンドを使うときは、なんとなく動いたとかではなくて、コマンドを使ったら前後で何が変化するか？を理解するという。diff みたいなものを使って、前後でどう状態が変化したかまでを理解すると良いとのこと。

# 3. ドキュメントを読む

Ken さん曰く、ドキュメントは、正しい、もしくは、過去正しかったことが書かれていることが基本なので、ここをしっかり読むことが重要という話だった。とても当たり前のように感じるが、最近英語のドキュメントを読むことが多いが、英語だと特に億劫になって、「多分こんな感じだろー」みたいな感じで飛ばし読みすることが多い。そうすると、読み飛ばしていたところに、注意事項が書いてあったりして無駄にどはまりしてしまったりも良くする。私の場合英語力がいまいちなのでそれでもミスることも多いが、まず焦らずドキュメントを読むところから始めている。

# 4. ジタバタしない

同じく Ken さんのアドバイスで、何かに詰まったら、そこであーでもない、こーでもない、と試行錯誤しないということ。まずは、誰かに聞く（MLなど）そして、投げた後は他のことをする。確かにそっちの方が効率が良い。やはりジタバタの時間はいつも相当無駄になっている。

# 5. トリプルディスプレイを使う

Ken さんに、ディスプレイ４つだと扱えない。３つが最高と聞いたので、実際やってみた。これは最高だ。持ち運び用のセカンドディスプレイも検討中。後、エディタのショートカットとか、terminal とかのコマンドは、時間をかけて覚えた方がいいとのこと。普段動作のものなので、生産性に効いてくるからとのこと。

# 6. ARM を愛でる、コードを読む

これはインフラ野郎、真壁さんの教え。彼に、なんでどこにもドキュメントに出ていないような情報を知れるのですか？と聞くと、疑問に思ったことは、MLで聞いてみたり、試しているみたい。Managed で背景は一瞬見えなさそうでも、どう動いているかを把握されようとしていた。また、AKS の仕組みの調査も、ARMを愛でたりしているらしい。それでビールが飲めるらしい。他にアーキテクチャ的な部分も、コードを読んで確かめている様子。彼から聞いたのではないが、疑問があったらほっておかずに、調べてみるのがいいのかもしれない。確かにどうしてもわからなければ、聞けば良いかも。

# 7. ビデオを見る、アーキテクチャに時間を使う

同僚の超絶センスいい Kanio の言葉。コードを書いてばかりではなく、アーキテクチャにも時間を使うのが重要らしい。なぜ、そんなインターナルを知っているのか聞くと、ビデオをみたり、わからないところを質問したりしているとこのこと。コードと、アーキテクチャのバランスを取るのが必要らしい。そういえば私はコードばかりで、こちらの方はやっていなかったので、もう少しこちらもやってみる。

# 8. わからないところは質問する

達人から複数いただいた回答で、インターナルの様子など、わからない時は、質問する。確かに単純だけど、ドキュメントなかったら諦めてしまっていた。やってみる。

# 9. マイクロソフト内で検索する

マイクロソフト内限定だけど、社内の検索サイトで検索すると色々情報が落ちているらしい。それを読んでみる。

# 10. ログやメッセージを読む

イケメンを観察していると、自分だとあまり気にしない、画面にでているログとか、メッセージをちゃんと読んでいる（自分よりずっと早いけど）。自分は遅いのでゆっくりだけど、コマンド叩いて出てきたものに注意を払おう。

# まとめ

このブログも自分のためにまとめてみた。今後こっそりアップデートされるかも。
Ubuntu 16.04 > MATLAB起動 > Licensing error: -9,57. > .licファイルを削除後にMATLAB起動し、アクティベーションを再実施する

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
MATLAB R2017b (Home Edition)
```

[Ubuntu 16.04 > MATLABセットアップ > Home Edition](https://qiita.com/7of9/items/1ecbe50228c2580a7220)
の手順でMATLABをインストールした。

MATLAB起動時、下記のエラーが出る。

```
Licensing error: -9,57.
```

https://jp.mathworks.com/matlabcentral/answers/92287-license-manager-error-9
> - licenses フォルダーを開き、そのフォルダー内のライセンス ファイルをすべて削除します。
>
- 1つ上の階層に戻り、Activationフォルダーを探し、存在する場合は、削除します。
>
- MATLABを起動すると、アクティベーション画面が表示されますので、画面に従ってアクティベーションを実施します。

`/usr/local/MATLAB/R2017b/licenses`にある.licのファイルを削除し、MATLABを再起動した。
アクティベーション処理になり、MathWorksアカウントで再登録したらMATLABが使えるようになった。
引数オブジェクト（parameter object）を使ってみる

Railsのプロジェクトで、「引数オブジェクト（parameter object）」というようなパターンを使ってみました。

## ご注意

なお、ここでの「引数オブジェクト」は「コントローラーとビューのやり取りに使うもの」に限定しています。もちろん、他の場面にも使える手法ではあるのですが、今回はここだけ考えてみます。

## 前提となる問題

Railsの場合、モデルに値を登録するようなフォームであれば、Active Recordが強力なので、あまり悩むこともなく実装が可能です。一方で、検索や集計ページを何も考えずに実装していくと、細かい引数だらけになって、引数を処理するコードが「コントローラーで、ビューから来た引数のパース」「コントローラーで、引数を使った実際のデータ抽出処理」「ビューで、値の再表示処理」など、あちこちに散らばってしまって、コントローラーの見通しも悪くなるなど、あまりきれいでないコードとなってしまいます。

## 解決策としての引数オブジェクト

では、引数オブジェクトを作ってみましょう。このオブジェクト自体には

* `params`など入力からの変換機能
* パラメーターとして使うハッシュの生成機能
* パラメーターとして受け取った値から、関連するモデルなどを生成する機能

これらの機能をもたせることで、コントローラーの仕事はほぼ「この引数オブジェクトを生成するだけ」になります。

なお、この引数オブジェクトをActive Modelで作る、という選択肢もありますが、バリデーションが不要なら単なるオブジェクトでもいい気がします。

## この観点で見直してみる

引数のハンドリングを担う「引数オブジェクト」という観点から他のRailsコードを見てみると、Active Record自身や、検索を行うRansackも、この引数オブジェクトとして働いていることが見えてきます。
Ubuntu 16.04 > MATLABセットアップ > Home Edition

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
MATLAB R2017b (Home Edition)
```

### セットアップ

matlab_R2017b_glnxa64.zipを解凍し、以下を実行。

```
sudo ./install
```

- MathWorksアカウントにログインする
- ライセンス選択: Home - Individual
- インストールフォルダー
    - /usr/local/MATLAB/R2017b
- インストールする製品の選択
    - MATLAB9.3 (ダウンロードが必要)
- 希望するインストールオプション
    - MATLABスクリプトへのシンボリックリンクの作成
        - チェックせず

インストール作業の後に下記のチェックボックスが表示される。

- MATLABのアクティベーション
    
MathWorksアカウントを使ってアクティベーションした。

MATLAB起動時にエラーが出たため、下記の方法で対処した。
https://qiita.com/7of9/items/dfb2853a0b6bc468cef3#_reference-a0e6018e8595ed033e43


### link

- [MATLAB が本体 1万4,950円、ToolBox 4,500円で、MathWorks社 公式ウェブサイトから購入できた件](https://qiita.com/HirofumiYashima/items/27d03f2a64fb6f3488b2)
- [社会人が激安で最新のMATLABを手に入れる方法](http://myenigma.hatenablog.com/entry/20140429/1398772583)

情報感謝です。
MATLAB > load tetmesh > tetとX > nodeとelement

https://jp.mathworks.com/help/matlab/ref/trirep.freeboundary.html

例1

```matlab
load tetmesh;
trep = TriRep(tet, X);
```

load tetmeshをするとtet, Xが利用できるようだ。
これらは何か?

https://jp.mathworks.com/help/pde/ug/create-and-view-3-d-geometry.html?searchHighlight=tetmesh&s_tid=doc_srchtitle
3-D Geometry from a Finite Element Mesh

```
load tetmesh
```

> Examine the node and element sizes.

```
size(tet),size(X)
```

上記の文章より、以下と推測する。

- tet: node
- X: element
link > Numerical instructions in Matlab (M), Octave (O) or both ones  > 関数有無の比較

MatlabとOctaveの数値計算関数の有無比較。

http://ocw.uniovi.es/file.php/146/T4MaterClase/MATLAB/MatlabVsOctave.pdf

- O: Octaveのみ
- B: Both
- M: Matlabのみ

例として、[freeBoundary()](https://jp.mathworks.com/help/matlab/ref/trirep.freeboundary.html)はMatlabにしかない。
(メモ)1Uサーバー選定

# 他のショップ

* JCS
    * [JCS Type 1U-XEPDL-T インテル Xeonプロセッサー E5-2600 v3シリーズ搭載](http://www.jcsn.co.jp/products/spec4/vin_rack_1u_xepdl_t.html)
* サードウェーブ
    * [サーバー RS5222-WT1 ｜ドスパラ公式通販サイト](https://www.dospara.co.jp/5info/share.php?contents=rs_5222_wt1)


# サードウェーブ(x2110)

DISKは80GBで十分なのに最近のサーバー製品は1TBとか大きすぎる。
CPUを[intel第7世代(Kaby Lake)](https://pssection9.com/archives/intel-corei7-corei5-corei3-gen-list-how-to-identify.html#Core_i7_Core_i5_Core_i3)の[Xeon E3-1270v6](https://secure.earena.co.jp/cgi-bin/akibapc/p_gallary.asp?JX=0&STEP=1&ID=60881&IMG=0)にした場合、他社のオンラインストアだと15万円も値段が上がるが、サードウェーブだと`22,500円(+税)`と良心的に感じた。

## 構成 (X2110)

* [サードウェーブサーバーX2110 基本構成モデル｜ドスパラ - スペック確認・変更](http://www.dospara.co.jp/5goods_pc/pc_bto.php?h=d&f=d&m=pc&mc=7244&sn=1818&vn=1&lf=1)
    * [ITmedia 2017年10月11日](http://www.itmedia.co.jp/pcuser/articles/1710/11/news093.html)


![server.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7dbb5818-ea02-338e-058a-ba1be0b36568.png)

* OS部分はソフトウェアRAID
* 大切なデーター領域はハードウェアRAID
    * RAIDコントローラーを載せてホットスワップ対応]
    * [LSI Megaraid SAS 9271iでRAIDを組んでcentos6.5をインストールする](http://roserogue.blogspot.jp/2014/06/lsi-megaraid-sas-9271iraidcentos65.html)

## X2110 で不足な場合、旧モデルのRS5222-WT1があるが

[ASCII.jp 2016年04月05日](http://ascii.jp/elem/000/001/145/1145410/)
39万8520円とのことでここからカスタマイズすると60万円くらいになりそう・・・。

X2110だと2CPUにできない、DISKがもっと欲しい場合は、RS5222-WT1が良い。
なお見積もりはお問い合わせになる。

RS5222-WT2は2Uタイプのため、1UにこだわるならRS5222-WT1。

## CPU比較

* [cpuboss | Intel Xeon E3-1270 v5 vs E5-2620V4](http://cpuboss.com/cpus/Intel-Xeon-E3-1270-v5-vs-Intel-E5-2620V4)
kaggleでデータサイエンスの問題に挑戦してみよう

この投稿は 関西オープンフォーラムのセミナー企画 [kaggleでデータサイエンスの問題に挑戦してみよう](https://k-of.jp/2017/session/1035) のアウトライン資料です。

# このセミナーの目的

1. [kaggle](https://www.kaggle.com/) のコンペに問題予測結果を投稿し，kaggleがどのようなものか雰囲気を感じとってもらうこと
2. 1. の先にはどのような世界があるか，を示すこと

# 聴衆ターゲット

- データサイエンスに興味がある方
- kaggleに興味はあるがまだ何も手をつけることができていない方
- kaggleをちらっと見てみたが自分の好みと違うかなと感じて離れた方

# なぜkaggleの利用を勧めるのか?

データ分析の

- モチベーションを絶やさないためのシステムがよくできている
  - 漸次的な進歩を誘導するシステム
  - 賞金や称号など
- 実践的な情報が集まっている

# ハンズオンの概要

**ハンズオン参加者のみなさんに行っていただきたいことはチェックボックスにしています。**

1. kaggle概要 (約5分間)
  - [ ] kaggle ユーザ登録
  - kaggle の menu 各項目を回り，軽くその意味を說明

2. Titanic: Machine Learning from Disaster への挑戦 (約10分間)
  - このコンペの目的の說明
  - コンペ各項目(Kernels, Discussion, Leaderboard, Rulesなど)の說明 (例 Rules における private sharing とは, など)
  - [ ] Kernel の作成

3. [Titanicのカーネル](https://www.kaggle.com/kozonishida/mytitanic2?scriptVersionId=1553522)の說明 (約20分間)
  - pandasを使ったdataの探索の仕方
  - seabornを使ったdataの可視化の仕方
  - scikit-learnを使った「回帰モデルの作成」と「問題の結果の予測」
  - [ ] 予測結果のsubmit

4. Titanicの先をどうする? (約5分間)
  - [Kaggle Progression System](https://www.kaggle.com/progression) を說明
  - kaggle kernel, dataset award の紹介
  - kaggler 紹介
  - [日本Kagglerのslack](https://kaggler-ja.herokuapp.com)

5. 質疑というか雑談 (約5分間)
》》Extracting knowledge from evaluative text

#GENERAL
- University of British Columbia Vancouver, Canada
- First Author: [**Giuseppe Carenini**](https://scholar.google.com/citations?user=HNNL22kAAAAJ&hl=ja), Associate Professor of Computer Science, University of British Columbia
- **Work series on same topic of Giuseppe Carenini**
    - [》》](https://qiita.com/badrabbit/items/6eeee8a5cc34043f5b65)[MULTI-DOCUMENT SUMMARIZATION OF EVALUATIVE TEXT, journal version](/10.1111/j.1467-8640.2012.00417.x), Journal of Computational Intelligence 2013
    - [》》](https://qiita.com/badrabbit/items/66dc93b6a0fc7bc20735)[Extractive vs. NLG-based abstractive summarization of evaluative text: The effect of corpus controversiality](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.186.3640&rep=rep1&type=pdf), INLG 2008 ([rank B/B2](http://www.conferenceranks.com/#data)) 
    - [》》](https://qiita.com/badrabbit/items/22b3d5a271aa8c3b0cb9)[Multi-Document Summarization of Evaluative Text](#), EACL 2006 (rank A/A2)
    - [》》](https://qiita.com/badrabbit/items/f96c684d33b5064c1221)[Extracting knowledge from evaluative text](https://www.cs.ubc.ca/~rng/psdepository/kcap2005.pdf), K-Cap 2005 (rank A/B1), 196 citations
》》Extractive vs. NLG-based abstractive summarization of evaluative text: The effect of corpus controversiality

#GENERAL
- University of British Columbia Vancouver, Canada
- First Author: [**Giuseppe Carenini**](https://scholar.google.com/citations?user=HNNL22kAAAAJ&hl=ja), Associate Professor of Computer Science, University of British Columbia
- **Work series on same topic of Giuseppe Carenini**
    - [》》](https://qiita.com/badrabbit/items/6eeee8a5cc34043f5b65)[MULTI-DOCUMENT SUMMARIZATION OF EVALUATIVE TEXT, journal version](https://10.1111/j.1467-8640.2012.00417.x), Journal of Computational Intelligence 2013
    - [》》](https://qiita.com/badrabbit/items/66dc93b6a0fc7bc20735)[Extractive vs. NLG-based abstractive summarization of evaluative text: The effect of corpus controversiality](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.186.3640&rep=rep1&type=pdf), INLG 2008 ([rank B/B2](http://www.conferenceranks.com/#data)) 
    - [》》](https://qiita.com/badrabbit/items/22b3d5a271aa8c3b0cb9)[Multi-Document Summarization of Evaluative Text](#), EACL 2006 (rank A/A2)
    - [》》](https://qiita.com/badrabbit/items/f96c684d33b5064c1221)[Extracting knowledge from evaluative text](https://www.cs.ubc.ca/~rng/psdepository/kcap2005.pdf), K-Cap 2005 (rank A/B1), 196 citations
スライドモードのススメ(社内LTでのおはなし)

スライドモードについてはこちらhttps://qiita.com/Qiita/items/4ff5873776992f0511d6

あえてスライドモードで書かない

## QiitaスライドモードでLTやってみた

- 先日社内のLT大会なるものが開催された。
- 私はスピーカーとして参加しました。
- スライドを作る時間がなかったので(当日の昼休みに作った)Qittaスライドモードを利用してみました。
- 後日使ったスライド公開(今は限定公開)します。

## 使ってみた感想

- LTくらいならこれで全然いける
- フォントサイズ？レイアウト？アニメーション？いりませんって場合におすすめ

## メリットとデメリット

### メリット:ok_woman:

- markdownで書けるので仕様とかメモがそのまま使える、早い:hugging:
- 端末を選ばず編集できる
- レイアウトやアニメーションを考えなくて済むので内容に集中できる。
- 本番の時にプレゼン用PCにいれて〜とかの準備がいらない。googleで検索すればいい
- スクロールすれば長めのコードでもページ分けなくてすむ
- スライドに書かない内容をコメントアウトしておけば、そのままカンペになる

<!---
  コメントはスライドモードでも非表示
-->

``` markdown

## タイトルどーん、画像どーん

- 必ずコメントアウト行の前後を開ける

<!---
  これは口頭で言う
-->

```

### デメリット:no_good:

- レイアウトやらフォントサイズが変更できないので、改行の位置がめちゃくちゃで読みづらくなる時がある:fearful:
- ネット繋がらないと無理(今時ないと思うけど)
- 文字だらけにならないよう気をつける必要がある
- もちろん社外秘の内容は書けない。限定公開でも微妙
- 背景真っ白だと浮く

## 今一歩惜しいと思った点

- Twitter埋め込み等の動画は再生できたらいいな。。。
- ここからここまではスライドモードみたいなのが欲しい。記事全部がスライドモードになるので、スライドと詳細記事を分けて投稿することになる

## でも全然アリ

- もしかしたらLTには最適なスライドツールかもしれない
- スライド作るのが苦手なので、すごい助かる:muscle:
- なにより早い。当日の昼休みに作り始めて間に合うくらいには。

社内LTが続くといいなぁ。。。
ShaderForge での Grab Pass Texture が iOS 環境において上下反転する問題への対処

# 要旨
　Unity において屈折表現などを行うには、直前までの描画内容を取得する Grab Pass[^1] という機能が用いられる。 Grab Pass で得られる Grab Texture はプラットフォームによって座標系が異なる[^2] ため、直接 Shader を記述する場合は  `ComputeGrabScreenPos` マクロを使用して座標を得る。しかし ShaderForge の `Screen Position` ノード[^3] は `ComputeGrabScreenPos` を使用しておらず、 iOS 環境などで上下が反転する問題がある。
　この記事では ShaderForge のノードエディタ上で `ComputeGrabScreenPos` を用いて Grab Texture を正しく取得する。

# 環境
- Unity 2017.2.0f3
- ShaderForge v1.38

# 実装
![実装ノード](https://qiita-image-store.s3.amazonaws.com/0/48638/1722213f-0a14-a5b0-1376-ab2ad7c854de.png)

以上！

# 解説
　この問題に対処する一番シンプルな方法は、出力済みのシェーダコードに含まれる `ComputeScreenPos` を `ComputeGrabScreenPos` に置換することである。しかしこのシンプルな方法はシェーダファイルを ShaderForge で編集したが最後、置換内容はすべて吹き飛んでしまう。また `ComputeGrabScreenPos` マクロの内容をノードエディタ上で再実装することもできるが、今後の Unity の仕様変更で **いつの間にか** バグってしまう恐れがある。
　そこでこの記事の手法はポリゴンのワールド座標を用いて Projection 座標を Fragment Shader で再計算することで `ComputeGrabScreenPos` マクロを使用可能とし、今後の Unity の仕様変更にも追従可能としている。

# 脚注
[^1]: https://docs.unity3d.com/Manual/SL-GrabPass.html
[^2]: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html
[^3]: http://acegikmo.com/shaderforge/nodes/?search=ScreenPos
》》Building a Sentiment Summarizer for Local Service Reviews

#GENERAL
- [PDF](https://s3.amazonaws.com/academia.edu.documents/11179325/paper3.pdf?AWSAccessKeyId=AKIAIWOWYYGZ2Y53UL3A&Expires=1510335318&Signature=hgqYBjoSY0Hy16q%2Fgi%2B4cVd%2Frms%3D&response-content-disposition=inline%3B%20filename%3DBuilding_a_sentiment_summarizer_for_loca.pdf)
- SLIDE
- 313 citations
- WWW-2008 workshop on NLP in the Information Explosion Era
》》MULTI-DOCUMENT SUMMARIZATION OF EVALUATIVE TEXT, journal version

#GENERAL
- [PDF](https://10.1111/j.1467-8640.2012.00417.x)
- Journal of Computational Intelligence
- University of British Columbia Vancouver, Canada
- First Author: [**Giuseppe Carenini**](https://scholar.google.com/citations?user=HNNL22kAAAAJ&hl=ja), Associate Professor of Computer Science, University of British Columbia
- **Work series on same topic of Giuseppe Carenini**
    - [》》](https://qiita.com/badrabbit/items/6eeee8a5cc34043f5b65)[MULTI-DOCUMENT SUMMARIZATION OF EVALUATIVE TEXT, journal version](https://10.1111/j.1467-8640.2012.00417.x), Journal of Computational Intelligence 2013
    - [》》](https://qiita.com/badrabbit/items/66dc93b6a0fc7bc20735)[Extractive vs. NLG-based abstractive summarization of evaluative text: The effect of corpus controversiality](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.186.3640&rep=rep1&type=pdf), INLG 2008 ([rank B/B2](http://www.conferenceranks.com/#data)) 
    - [》》](https://qiita.com/badrabbit/items/22b3d5a271aa8c3b0cb9)[Multi-Document Summarization of Evaluative Text](#), EACL 2006 (rank A/A2)
    - [》》](https://qiita.com/badrabbit/items/f96c684d33b5064c1221)[Extracting knowledge from evaluative text](https://www.cs.ubc.ca/~rng/psdepository/kcap2005.pdf), K-Cap 2005 (rank A/B1), 196 citations

#ABSTRACT
- **PROBLEM**
    - A framework for summarizing a corpus of evaluative
documents **about a single entity** by a **natural language summary**
- **Series of previous work by same first author**
    - first paper: extract & organize evaluative info 
    - 1st study: compared the two summarizers: extractive vs. abstractive. The summarizers have different strengths and weaknesses. 
    - 2nd study: when corpus is controversial, Evaluative text abstraction
tends to be more effective than extraction. 
    - 3rd study: assessed the effectiveness of our user tailoring strategy. User tailored summaries are more informative than un-tailored ones.

#TASK of TEXT SUMMARIZATION
- a task of annual **Document Understanding Conference, DUC** (renamed to **Text Analysis Conference (TAC)** since 2008)
- most of previous work focused on **factual, edited text and biographies**, for which the goal is **extract & order the most informative sentences** in a domain-independent way, while **avoiding repetition**
- **when documents contain inconsistent info**, the summarizer needs to identify overlaps and inconsistencies and produce summary that explains those inconsistencies.
- basic steps
    - extract & analyze the evaluations expressed in the corpus (been studied extensively)
    - summarize them (received less attention)
        - **extraction-based summarizer**: extract 
- a
dnsmasqとnginxでバーチャルホストっぽい何か

# 何やるの

dnsmasqでワイルドカードDNS的なことをして、nginxでHTTPリクエストをホスト名から違うポートに転送するバーチャルホストっぽいことをやってみたらとりあえず動いたからメモを残すよ。

# どこで動かすの

ubuntu 17.10 でうごいたよ。

# どうやるの

* dnsmasqいれて設定するよ

```
apt-get install dnsmasq
```

/etc/dnsmasq.confにこんな感じで書くよ

```
address=/.srv/192.168.1.2
```

dnsmasqを再起動だ

```
systemctl restart dnsmasq
```

これで*.srvにアクセスすると192.168.1.2にアクセスできるようになるよ。

適当なクライアントの端末でdnsmasqを入れたマシンをDNSサーバに設定してpingとかでa.srvとか打って通るか確かめてみたほうがよいかも。

* nginxいれて設定するよ

```
apt-get install nginx
```
実はnginxのホームページにnginxのパッケージのリポジトりを追加する方法があったから、先にやらないといけないけど。

/etc/nginx/conf.d/srv.confを作ってこんな感じにかくよ。

<pre>
server {
        listen 80;
        server_name dev.srv;
        location / {
                proxy_pass      http://127.0.0.1:8080;
        }
}
server{
        listen 80;
        server_name prod.srv;
        location / {
                proxy_pass      http://127.0.0.1:8081;
        }
}
</pre>


nginxを再起動するよ。

```
systemctl restart nginx
```

これでdev.srvにアクセスしたら8080に振り分けられるし、prod.srvにアクセスしたら8081に振り分けられるようになったよ。

* 動かしてみるよ

devとprodサーバを動かすよ。

```
mkdir dev ; cd $_ && echo dev > index.html && python -m SimpleHTTPServer 8080 &
mkdir prod ; cd $_ && echo prod > index.html && python -m SimpleHTTPServer 8081 &
```

curlコマンドで振り分けられるか試してみるよ。

```
$ curl dev.srv
127.0.0.1 - - [11/Nov/2017 01:50:20] "GET / HTTP/1.0" 200 -
dev
$ curl prod.srv
127.0.0.1 - - [11/Nov/2017 01:50:28] "GET / HTTP/1.0" 200 -
prod
```
VimでCSVファイルの3列目をキーにしてソートする

Vimには`:sort`コマンドが用意されています。これを使えば、バッファ内の行を柔軟にソートすることができます。

# `:sort`の基本
以下のようなファイルに対して、`:%sort` とすればファイル全体が辞書順でソートされます。

```names.txt
charlie
alice
bob
dave
eve
```

以下のように数値であれば、`n`オプションをつけて`:%sort n`とすれば数値順でソートされます。

```number.txt
100
10
1
```

# CSVを3列目でソートする
以下のようなファイルを開いているとします。`:%sort /,\zs[^,]*\ze$/ nr`を入力します。

```sample.csv
alice,5,10000
bob,4,1000
charlie,1,1
dave,8,100
eve,2,10
```

すると、3列目でソートしたファイルが得られます。

```sample.csv
charlie,1,1
eve,2,10
dave,8,100
bob,4,1000
alice,5,10000
```

もっと汎用的に考えてみます。以下のファイルがあったときに、任意のカラムでソートしたいとします。ソートのキーとなるカラムは数値で指定するとしましょう。

```sample2.csv
alice,5,10000,d
bob,4,1000,e
charlie,1,1,a
dave,8,100,b
eve,2,10,c
```

3列目をキーとしたければ、 `:%sort /\([^,]*,\)\{2\}\zs[^,]*/ r` とします。`2`を書き換えれば任意のカラムでソート可能です。4列目をキーとしたければ、`3`とします。

# 応用
CSVはシェル・コマンドの`sort`で簡単にソートできますが、Vimのソートはより柔軟です。

以下のようなPHPファイルがあると仮定します。

```before.php
<?php
$users = [
    ['name' => 'P=NP', 'department' => 'Production'],
    ['name' => 'alice', 'department' => 'Planning'],
    ['name' => '=bob=', 'department' => 'Customer Support'],
    ['name' => 'eve', 'department' => 'Planning'],
    ['name' => 'dave', 'department' => 'Sales'],
    ['name' => 'jack', 'department' => 'Human Resources'],
    ['name' => 'kay', 'department' => 'Human Resources'],
];
```

ここに対して、 ソート箇所をVisualモードで選択し、 `:'<,'>sort /department' => '\zs[^']*\ze'/ r`を打つと部署をキーとしてソートした結果が得られます。

```after.php
<?php
$users = [
    ['name' => '=bob=', 'department' => 'Customer Support'],
    ['name' => 'jack', 'department' => 'Human Resources'],
    ['name' => 'kay', 'department' => 'Human Resources'],
    ['name' => 'alice', 'department' => 'Planning'],
    ['name' => 'eve', 'department' => 'Planning'],
    ['name' => 'P=NP', 'department' => 'Production'],
    ['name' => 'dave', 'department' => 'Sales'],
];
```

## tips
正規表現を書きたくない人で、シェルコマンドが分かる人なら、`:%!sort -t',' -k=3`としてもソートできます。

# 詳しくは
`:help :sort`
ListPreferenceで各項目の数値とフォントサイズを連動させる

#ListPreferenceで各項目の数値とフォントサイズを連動させる

xmlで設定されたvaluesをコード中で取得→編集→再設定でむりやりサイズ変更
カスタムPreferenceのほうが綺麗なんだろうけどとりあえず実装するならばという感じで。

![Screenshot_2017-11-11-01-09-242.png](https://qiita-image-store.s3.amazonaws.com/0/212751/abcc19de-6961-4ca6-8033-40e5c6fc200e.png)



preferece用xml

    <ListPreference
        android:defaultValue="40"
        android:entries="@array/pref_font_size_titles"
        android:entryValues="@array/pref_font_size_values"
        android:key="font_size"
        android:negativeButtonText="@null"
        android:positiveButtonText="@null"
        android:title="@string/pref_title_font_size" />


strings.xml

    <string name="pref_title_font_size">文字サイズ</string>
    <string-array name="pref_font_size_titles">
        <item>30</item>
        <item>35</item>
        <item>40</item>
        <item>45</item>
        <item>50</item>
        <item>55</item>
        <item>60</item>
        <item>65</item>
        <item>70</item>
    </string-array>
    <string-array name="pref_font_size_values">
        <item>30</item>
        <item>35</item>
        <item>40</item>
        <item>45</item>
        <item>50</item>
        <item>55</item>
        <item>60</item>
        <item>65</item>
        <item>70</item>
    </string-array>

このpreferenceを管理するpreferenceFragmentのonCreate()内

    ListPreference basePreference = (ListPreference) findPreference("font_size");
    // 取得
    CharSequence[] entrys = basePreference.getEntries();
    CharSequence[] entryValues = basePreference.getEntryValues();
    // 編集
    SpannableString[] createEntrys = new SpannableString[entrys.length];
    for (int i = 0; i < basePreference.getEntries().length; i++) {
        String name = entrys[i].toString();
        int size = Integer.parseInt(entryValues[i].toString());
        SpannableString entry = new SpannableString(name);
        entry.setSpan(new AbsoluteSizeSpan(size), 0, name.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
        createEntrys[i] = entry;
    }
    // 再設定
    basePreference.setEntries(createEntrys);
    bindPreferenceSummaryToValue(basePreference);
Github API v4にgraphql-client gemを使ってアクセスする

# コード

あるレポジトリで所定のメンバーがあげて所定の日時以降にマージされたPRの一覧取得

```Gemfile
source 'https://rubygems.org'

gem 'graphql-client' # 0.12.1
```

```get_pull_requests.rb
#! /usr/bin/env ruby

require 'graphql/client'
require 'graphql/client/http'

h = GraphQL::Client::HTTP.new('https://api.github.com/graphql') do
  def headers(context)
    {
      "Authorization" => "Bearer #{ENV['ACCESS_TOKEN']}"
    }
  end
end
s = GraphQL::Client.load_schema(h)
c = GraphQL::Client.new(schema: s, execute: h)
Q = c.parse <<-GraphQL
query($after: String) {
  repository(owner:"our_company", name:"awesome_project") {
    pullRequests(first: 100, states: [MERGED], orderBy: {field: UPDATED_AT, direction: DESC}, after: $after) {
      edges {
        cursor
        node {
          number
          title
          updatedAt
          mergedAt
          author {
            login
          }
        }
      }
    }
  }
}
GraphQL

all_nodes = []
after = nil
loop do
  r = c.query(Q, variables: { after: after })
  nodes = r.data.repository.pull_requests.edges.map(&:node)
  nodes_in_time = nodes.select { |n| Time.parse(n.updated_at) > Time.new(2017, 10, 30) }
  all_nodes += nodes_in_time.select { |n| %w(alice bob carol).include?(n.author.login) }
  break if nodes.size > nodes_in_time.size
  after = r.data.repository.pull_requests.edges.last.cursor
end

puts all_nodes.map { |n| "##{n.number}\t#{n.author.login}\t#{n.merged_at}\t#{n.title}" }
```

# 雑多な解説

* アクセストークンは[Personal access tokens](https://github.com/settings/tokens)のページで作れる
* Qが定数なのはgraphql-clientの仕様で、queryメソッドに引数で渡すクエリ文字列が定数で無かった場合はエラーになる
* orderByに何を指定したら良いかは[ドキュメント](https://developer.github.com/v4/reference/input_object/issueorder/)にはほとんど書かれていないが[Explorer](https://developer.github.com/v4/explorer/)で適当に打つと補完されるのでわかる
* 1回の取得件数が100件までなので、複数回に分けて取得する必要がある
* edgeとnodeとcursorの仕組みはgraphQLではスタンダードとのこと
  * cursorを指定してここ以降を取得、とやることでデータを取得していく
* 結果のオブジェクトはHashieよろしくメソッドで項目にアクセスできるが、元がmergedAtのようにcamelCaseであるものはmerge_atのようにsnake_caseのメソッド名になる
》》Model for Improving Relevant Feature Extraction for Opinion Summarization

# GENERAL
- [PDF](https://www.researchgate.net/profile/Ashwini_Rao3/publication/280082824_Model_for_Improving_Relevant_Feature_Extraction_for_Opinion_Summarization/links/55bb158e08ae9289a092823c/Model-for-Improving-Relevant-Feature-Extraction-for-Opinion-Summarization.pdf)
- MPSTME Mumbai, India
- IACC 2015 (IEEE International Advance Computing Conference) (**no rank conference**)
- Personal evaluation: not much insights about machine learning, but more details about preprocessing and feature generation rules
- Valuable points
    - Details about pre-processing before feature extraction
        - removal of URL, HTML tags, special symbols, stop words and repeated words
        - handle abbreviations
        - determine boundary of sentences
    - Multi-step feature extraction
        - automatic rule generation 
        - threshold to filter infrequent
        - manually? filter in-relevant rules
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/209734/42cf6021-02b7-0876-db59-7d997630250f.png)

- Effectiveness
    - reduce the size of feature set a lot
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/209734/e2357578-e3fc-0d96-d550-eea0642921f5.png)
〜備忘録〜　SCIPを使って問題を解いてみる

#実行するにあたっての前提の環境

scipoptsuite-4.0.0がインストールされている。
ターミナル
[〜備忘録〜 SCIP scipoptsuite-4.0.0をMacにインストール](https://qiita.com/shut_up_n_play_yer_guitar_taka/items/fdd2513a579dcdd5eec2)

#実行手順

ターミナル上でscipを起動する

*MacBook-Pro:local user$ scip*

すると、

*SCIP>*


このような表示に変わる。

輸送問題を記述したmondai.lpというファイルを読み込む。

#lpファイルの作り方メモ

lpファイルの作り方はまずテキストエディタなどで編集してから拡張子を.txt→.lpに変更するだけ。

因みにmondai.lpの中身、輸送問題を定式化したものは以下のものになる。

*minimize
obj: x(a1,b1) + 5 x(a1,b2) + 6 x(a2,b2) + 5 x(a2,b3)
+ 2 x(a3,b2) + 4 x(a3,b3)
subject to
const(a1): x(a1,b1) + x(a1,b2) <= 5
const(a2): x(a2,b2) + x(a2,b3) <= 4
const(a3): x(a3,b2) + x(a3,b3) <= 7
const(b1): x(a1,b1) >= 1
const(b2): x(a1,b2) + x(a2,b2) + x(a3,b2) >= 5
const(b3): x(a2,b3) + x(a3,b3) >= 10
end*

である。

**メモ**

minimize は予約語．最大化の場合は maximizeと書く

subject toは予約語であり、ここから後ろに制約式を書く

制約式を書くときは、（制約名）＋コロン　＋制約式
制約名は任意で変えられる（c(1),c(2)などでもよい）

endは予約語でファイルの最後に書く


#問題を解く

mondai.lpを読み込むためには、以下のreadコマンドを用いる。

*SCIP> read /Users/user/Desktop/mondai.lp*

読み込む際はデスクトップ上などにlpファイルを配置しておいてターミナル上にドラッグ＆ドロップすると楽。

読み込むと、


original problem has 6 variables (0 bin, 0 int, 0 impl, 6 cont) and 6 constraints

と表示される。

次に最適化を実行するためにoptimizeコマンドを実行する

*SCIP> optimize*

すると、以下のように表示される。

presolving:
(round 1, fast)       1 del vars, 2 del conss, 0 add conss, 9 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs
(round 2, fast)       3 del vars, 4 del conss, 0 add conss, 13 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs
(round 3, exhaustive) 5 del vars, 4 del conss, 0 add conss, 13 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs
presolving (4 rounds: 4 fast, 2 medium, 2 exhaustive):
 6 deleted vars, 6 deleted constraints, 0 added constraints, 14 tightened bounds, 0 added holes, 0 changed sides, 0 changed coefficients
 0 implications, 0 cliques
presolved problem has 0 variables (0 bin, 0 int, 0 impl, 0 cont) and 0 constraints
transformed objective value is always integral (scale: 1)
Presolving Time: 0.00

 time | node  | left  |LP iter|LP it/n| mem |mdpt |frac |vars |cons |cols |rows |cuts |confs|strbr|  dualbound   | primalbound  |  gap   
t 0.0s|     1 |     0 |     0 |     - | 557k|   0 |   - |   0 |   0 |   0 |   0 |   0 |   0 |   0 | 6.700000e+01 | 6.700000e+01 |   0.00%

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 0.00
Solving Nodes      : 1
Primal Bound       : +6.70000000000000e+01 (1 solutions)
Dual Bound         : +6.70000000000000e+01
Gap                : 0.00 %*

最後に変数ごとの値を表示するには

*SCIP> display solution*

とすると、

objective value:                                   67
x(a1,b1)                                            1 	(obj:1)
x(a1,b2)                                            4 	(obj:5)
x(a2,b3)                                            4 	(obj:5)
x(a3,b2)                                            1 	(obj:2)
x(a3,b3)                                            6 	(obj:4)


と表示される。
ここで目的関数の最小値が67、そのときの各変数の値がわかる。
※メモ
67=1*1+4*5+4*5+1*2+6*4
ここでx(a2,b2)の値は0であるので無視されている。
Codilityを解く #2　抜けている数字は？

##問題
公開されてるとはいえ、問題文を直接載せるのはまずそうなので概要のみ。
配列A[n]の要素には、1~(n + 1)の値が一つずつ出てくるが、
一つだけ出てこない数が1~(n + 1)の中にあるので、その数を当てる関数を作る。

```example.
solution([2,3,1,5]):　　　//入力
4　　　　　　　　　　　　　　//出力
```
#アプローチ（Python）
####１．配列数nを取る。
Aの配列数nはlen(A)で取得できる。

```1.py
def solution(A):
    n = len(A)
```

####２．1 ~ n+1の総和aを取る。
繰り返し式でも取れるが、1~nの総和n!は以下で計算したほうが楽。
n! = n(n+1)/2
n → n+1 とすれば、
(n+1)! → (n+1)(n+1+1)/2 = (n+1)(n+2)/2

```2.py
def solution(A):
    n = len(A)
    a = (n + 1 )* (n + 2) / 2
```
####３．配列Aの総和bを取る。
forとrangeを使って配列の総和を求める。

```3.py
def solution(A):
    n = len(A)
    a = (n + 1 )* (n + 2) / 2
    b = 0
    for i in range(0,n):
        b += A[i]
```
####４．aとbを比較。
1~n+1の合計a > 1~n+1のうち何か欠けているb
a-bで欠けている数字が求まる。

```finish.py
def solution(A):
    n = len(A)
    a = (n + 1 )* (n + 2) / 2
    b = 0
    for i in range(0,n):
        b += A[i]
    return(a - b)
```
これで100点、計算量はO(n) または O(n * log(n))でした。

#終わりに
returnとprintを勘違いして半日悶絶していた。
問題文はちゃんと読みましょう。
macOS High SierraにしてからTensorBoardが動かなくなった件について。

# TensorBoardが起動できない
macOS High SierraにしてからTensorBoardが起動できなくなりました。

原因は私には、わかりませんが一応救済方法があるので記載しておきます。
以下のコマンドを実行することにより、無事TensorBoardが復活しました。
また、原因などがわかる方はご指摘ください。

```
$ python3 -m pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.0-py3-none-any.whl
```
Webサイトのmeta情報(タイトル、概要、カノニカル)を取得してGoogleスプレッドシートで一覧にする

#はじめに
サイトの分析などを行う際にmeta情報(タイトル、概要、カノニカル)を取得して、Googleスプレッドシートで一覧にする手順です。
タイトルと概要を取得できるGoogleChromeのプラグインなども多くありますが、カノニカルを取得できるものが無く、スプレッドシートで一覧にしやすいものも無かったため自作してみました。

#このポストの対象者
- サイトの分析をサクッと情報を取得したい方(例えば検索情報によってタイトルが変化するようなサイトを分析する場合)
- 特に非エンジニアの方でもサクッと取得できるような手順にしています

#今回使用するコード
最初に結論から言うと今回使用するコードはこれだけです。
こちらからもご確認頂けます。https://gist.github.com/ogaaryo/9119f7ca9309391b24d40a0329c6fcbd


```get_meta_information.js
var url = location.href;
var title = document.title;
var description = document.getElementsByName ('description').item(0).content;
var canonical_url = getCanonicalUrl();
console.log(url + '☆' + title + '☆' + description + '☆' + canonical_url)
function getCanonicalUrl() {
    var links = document.getElementsByTagName("link");
    for (var i = 0; i < links.length; i++) {
        if (links[i].rel) {
            if (links[i].rel.toLowerCase() == "canonical") {
                    return links[i].href;
            }
        }
    }
    return null;
}
```

# Chromeに「jsshell」のプラグインをインストールする
[Chromeウェブストアのプラグイン配布ページ](https://chrome.google.com/webstore/detail/jsshell/kmgmkbicahmbceidoidjbkbpkfogaldh)からｊｓshellのプラグインをインストールして下さい

# chromeのdeveloperツールを起動する
1. 分析したいサイトを開き、 chromeのdeveloperツールを起動します<br>
※右クリック＞検証をクリックでdeveloperツールを起動することができます
1. developerツールのconsoleをクリックしておきます<br><img width="714" alt="スクリーンショット 2017-11-10 23.56.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/191069/8980e488-929e-3a09-9dff-94edd30aafc3.png">

# jsshellでコードを実行して情報を取得する
1. chromeのツールバーからjsshellを起動します
2. jsshellに[コード](https://gist.github.com/ogaaryo/9119f7ca9309391b24d40a0329c6fcbd)を貼り付けてrunをクリックします<br><img width="334" alt="スクリーンショット 2017-11-11 0.00.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/191069/40ce1b26-2a09-bc53-1e52-24c225056fb5.png">
3. developerツールのconsoleに出力された内容をコピーします

# Googleスプレッドシートで一覧にする
1. ヘッダーを以下のように準備しておきます<br><img width="452" alt="スクリーンショット 2017-11-11 0.05.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/191069/59c7f45f-d294-0302-d9d9-843f1261c3ed.png">
2. コピーした情報を貼り付けます<br><img width="475" alt="スクリーンショット 2017-11-11 0.07.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/191069/def70db5-cb07-a9ff-b972-5ac884e36429.png">
3. データ＞テキストを列に分割を選択します<br><img width="283" alt="スクリーンショット 2017-11-11 0.08.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/191069/652e608d-81b4-6678-089b-b6ba4884b80c.png">
4. 区切り文字＞カスタムを選択します<br><img width="413" alt="スクリーンショット 2017-11-11 0.08.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/191069/34cd0aff-cde0-7f8b-cfbc-89fdf61d4f5a.png">
5. 区切り文字に☆を入力します<br><img width="427" alt="スクリーンショット 2017-11-11 0.08.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/191069/21f4c1f0-1832-257a-33fa-be666f33d021.png">
6. 列に分割された状態でmeta情報を一覧にすることができます<br><img width="457" alt="スクリーンショット 2017-11-11 0.12.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/191069/dfac079b-bdfd-bfe5-58a5-4f691bddbd96.png">


この手順をある程度コピーする情報を増やしてから一括で実行すると、いい感じに一覧を作成することができます！
CentOS7にxrdpを導入しWindowsからリモートデスクトップで接続

CentOS7のGUI環境をWindows側からリモートデスクトップを用いて使用する方法です。
CentOS側にGNOME Shellが既にインストールされてる状態を想定しています。

インストール環境
Centos7：CentOS Linux release 7.4.1708
Windows：Windows 10 Enterprise
xrdpバージョン：xrdp-0.9.4-1.el7.x86_64

#Centos7側の設定（xrdpのインストール等）
Windows側からリモートデスクトップ接続するにはCentOS側にxrdp, tigervnc-serverをインストールする必要があります。
また、それらのパッケージをインストールするには「エンタープライズLinux用拡張パッケージ」を利用する必要があります。
その拡張パッケージを利用するには
epel-releaseをyumでインストールします。

```shell-session:epel-releseのインストール
$ su -
# yum install y epel-release
```
また、今後yumコマンドを利用する際にepel-releaseを参照しないようにしたい場合にはepel.repoファイルの一部(enableの値：1→0)を変更しましょう。

```shell-session:epel.repoの編集
# vi /etc/yum.repos.d/epel.repo
変更前
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
以下略...

変更後
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
```

xrdpとtigervnc-serverをインストールする。
その際、先ほどインストールしたepel-releaseを一時的に有効にしインストールします。

```shell-session:xrdpとtigervnc-serverのインストール
# yum --enablerepo=epel install y xrdp
# yum --enablerepo=epel install y tigervnc-server	
```

次にリモートデスクトップ接続した際に日本語キーボードが使用できるようにします。
日本語キーボードを対応させるための参考Webページがありましたのでこちらを参考にしています。
https://forums.ubuntulinux.jp/viewtopic.php?id=13399

km-e0010411.iniの中身は
https://www.mail-archive.com/xrdp-devel@lists.sourceforge.net/msg00263/km-e0010411.ini
となります。vimもしくはwgetコマンド等でダウンロードしてください。今回はvimでファイルを作成し編集しています。

```shell-session:日本語キーボードの適用
# cd /etc/xrdp/
# vi km-e0010411.ini
# cp km-e0010411.ini km-0411.ini
# cp km-e0010411.ini km-e0200411.ini
# cp km-e0010411.ini km-e0210411.ini
```
xrdp.serviceを起動し、OS起動時に自動実行させるようにします。

```shell-session:xrdp.serviceの起動
# systemctl start xrdp.service
# systemctl enable xrdp.service
```

リモートデスクトップ接続を可能にするためにファイヤーウォールの変更（TCP3389）を許可する。
--permanentを入れることで恒久的に変更することができます。環境に応じで--zone部分の変更を行ってください。この環境ではpublicゾーンを利用しています。
--list-allで設定が完了しているかの確認をするといいと思います。

```shell-session:firewallの変更
# firewall-cmd --permanent --zone=public --add-port=3389/tcp
# firewall-cmd --reload
# firewall-cmd --list-all
```
#windows側からのリモートデスクトップ接続
windowsにデフォルトでインストールされている「リモートデスクトップ」を起動します。
コンピュータ欄にCentOS側のIPアドレスを入力し接続する。

接続画面
![SnapCrab_NoName_2017-11-10_23-50-4_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/212451/a85cc528-e436-7f3f-5802-a4e08676c3f2.png)

「username」と「password」はCentOS側で追加しているユーザ名とパスワードを入力することでリモートデスクトップ接続が完了します。

#参考ページ
xrdpの導入方法
https://kogelog.com/2015/03/02/20150302-01/

Ubuntu日本語フォーラム 日本語キーボード適応時に参照
https://forums.ubuntulinux.jp/viewtopic.php?id=13399
gradleの導入でワーニング

gradleを導入したときにWARNINGがでたのでそれの対処方法を備忘録として残しておこうと思いました。

##環境情報
OS：Windows10
Java：Java9
gradle：4.3.1

gradleのバージョンを表示させようとすると、以下のように出力されました。

```bat
>gradle -v
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/C:/Gradle/gradle-4.3.1/lib/groovy-all-2.4.12.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

------------------------------------------------------------
Gradle 4.3.1
------------------------------------------------------------

Build time:   2017-11-08 08:59:45 UTC
Revision:     e4f4804807ef7c2829da51877861ff06e07e006d

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          9.0.1 (Oracle Corporation 9.0.1+11)
OS:           Windows 10 10.0 amd64
```

めっちゃwarningが出てる。
これは、JVMのブートストラップによって出力されているらしく、JVM_OPTSに以下の文言を設定すればよいらしい。

```bat
--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED
```

「%GRADLE_HOME/bin」配下のgradle.batに「set DEFAULT_JVM_OPTS=」というところがあるのでそこに追記してください。

```bat
@remこうなっている
set DEFAULT_JVM_OPTS=
@remこっちに変更
set DEFAULT_JVM_OPTS=--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED
```

調べてみた感じJava9から参照できなくなるクラスがあるっぽい。
（Jigsawの導入によりJava APIのnon-publicメンバへのアクセスが許可されなくなった）
publicにしたらどこからでも呼び出せるのが嫌だーってことらしい。

それを無効にするようなオプションらしい。
正直ほとんどわからないので知っている人教えてほしいです。
asciidoc (asciidoctor) で索引（インデックス）を作る方法

# はじめに
タイトルのとおりです。そのものズバリの説明を見つけることができなかったので、メモがてら書いてみました。参考になれば幸いです。

# 索引リストに載せたい単語の指定
索引に載せない用語を二重丸括弧で囲めば OK です。以下の例では、dup という用語を索引リストに載せるよう指示しています。

注：現時点（2017.11.10）では、Qiita が asciidoc を言語として認識していないらしく、正しく asciidoc のソースコード（？）が表示されません。そのため、今回は pre タグで囲って表示するようにしておきます。

<pre>

= Forth のワード例
((dup))::
　TOS を複製します。

</pre>

# 索引リスト作成
この方法がなかなか分からず苦労しました。結論から言うと、以下のように書けば、自動的に二重丸括弧で指定した用語のリストが索引化されます。

<pre>

[index]
= 索引

</pre>

備考：現時点では、索引リスト生成に対応しているのは PDF 生成と DocBook を援用する時のみだそうです（参考： http://asciidoctor.org/docs/user-manual/#index-catalog ）。個人的には、HTML 文書にこそ索引が欲しかったので、困ったものです（DocBook の使い方も調べなければならないのか…とほほ）。


# おまけ
ディレクトリ中の .adoc から .html と .pdf を作成する Makefile を載せておきます（もっと洗練された方法がきっとあると思いますが、とりあえず）。

注：Makefile もソースリストとして認識されないので、こちらも pre タグで囲んで表示しておきます。

<pre>
.SUFFIXES: .pdf .html .adoc

SRC = $(wildcard *.adoc)
OBJECTS = $(SRC:%.adoc=%.pdf) $(SRC:%.adoc=%.html)

.PHONY: all
all: $(OBJECTS)

.adoc.html:
	asciidoctor $<

.adoc.pdf:
	asciidoctor-pdf -r asciidoctor-pdf-cjk $<
</pre>
railsのログインの仕組み

HTTP はステートレスなので、ログインを維持するのは HTTP という通信内ではありません。ログイン情報は、ブラウザ内部と、サーバ（Rails）内部で保存されることになっています。そのブラウザとサーバが保存しているログイン情報を、ブラウザがサーバにアクセスするたびに毎回 HTTP で送受信します。そしてサーバ側はブラウザからのアクセスがあるたびに、受け取ったブラウザからのログイン情報を毎回自分（サーバ）の持っているログイン情報と照合して、ログインされているかを判定します。

このとき、ブラウザが持っているログイン情報は Cookie として保存され、サーバが持っているログイン情報は Session として保存されます。Cookie はブラウザ側の情報保管所で、Session はサーバ側の情報保管所です。

つまり、ログインしているかどうかは、お互いを照合することのできる情報が、ブラウザの Cookie と、サーバの Session に保存されているかどうかで決まります。
ネットワーク構成図の自動作成を目指す！（1）

　初めまして、Fortranと申します。
　普段はネットワーク中心のインフラエンジニアをしておりますが、休みの時には趣味で私用VPS上でPythonやPerlのコードを書いてます。
　勉強がてら、学んだことをアウトプットしていきたいと思いますのでよろしくお願いいたします。

#なぜこのテーマなのか？
- インフラを作っていく時に、色々な方々からこういうことを聞きます。 
 - 最新のネットワーク構成図が乱立して見つけにくい。
 - ネットワークが複雑になってきて、構成図を作るのが~~面倒くさい~~大変になってきた。
 - 自動で作ってくれるようなソリューションは見かけるけど、値が張るんだよなぁ。
- それを聞いて「完全内製でシステムを作れないかな」と思い立ったのがきっかけです。

#どうやって実現する？
　さっと、こんな構成でできないかなぁ、と考えています。
　構成図を自動で出力する仕組みは、nwdiagと呼ばれるPythonで書かれたオープンソースのツールがあるのでこれを利用していきたいと思います。
![プレゼンテーション1.png](https://qiita-image-store.s3.amazonaws.com/0/213134/e4aa6e1d-7756-3715-6d65-c8d8892ebc84.png)

#どういう手順で作っていく？
- PerlでIPレンジに対して、Pingスキャン/snmpwalkを実行するスクリプトを書いていく
- MySQLから情報を抽出して.diagファイル（構成図を作るための元ファイル）を作成するスクリプトをPerlで書いていく
- できれば構成図をWebブラウザ上で編集したいよね、な要求にこたえられるようコードで書いていく（できんのかよ…）
- スイッチ／ルータ類はconfigからNW構成図を作れるようにしたいよね、というムチャぶりに答えられるようにコードを書いていく
Fragmentの子カスタムViewの動的な幅計算

# Fragmentの子カスタムViewの動的な幅計算

親のViewの高さに連動して幅が変わるカスタムViewを作っていたのだが、
１．カスタムViewのonMeasureでは、配置された高さが0のままで渡されてきて
２．それにより幅が確定できず
３．カスタムViewがsetMeasuredDimensionをコールしてサイズの変更を通知することができず
４．最後まで親の高さが通知されてこない

カスタムViewにmatch_parentを指定してもonMeasureでサイズが渡されてくるわけではないらしい。
onMeasure内で親のサイズを知ることもうまくいかない。

仕方ないので親から明示的にサイズを渡すことにする。
Fragmentが作られた直後のonCreateViewではまだレイアウトが終わっていないのでその瞬間のサイズは0。
ActivityはonWindowFocusChangedで出来るようだがFragmentには該当のイベントはないし…。

ということで下記をonCreate内で実行。

    view = フラグメントレイアウト
    ViewTreeObserver observer = view.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Log.d("Fragment", view.getWidth() + ":" + view.getHeight());
                子View.getLayoutParams().height = view.getHeight();
                子View.getLayoutParams().width = view.getWidth();
            }
        });

あとはカスタムViewのonMeasureで

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);

        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        描画範囲.計算(widthSize,  heightSize);
        int drawheight = 描画範囲.結果高さ;
        int drawWidth = 描画範囲.結果幅

        this.setMeasuredDimension(drawWidth, drawheight);
    }


ありなのかな？Layoutの勉強しないと・・・。
レスポンシブサイトの画像切り替え

##こんな人におすすめ
メディアクエリ？難しいことはよくわからないが、とにかく簡単にパソコンとスマホで別の画像を表示させることのできる方法を探しているんだという方。

##実装方法
スクリーンサイズによって異なる画像を表示したい場合には、「picture」要素の使用がおすすめです。

これを利用すると、使用中のデバイスごとに最適な画像のみが読み込まれ、CSSでの指定よりも速い表示が期待できます。

```html:html
<picture>
  <!-- ビューポートの幅が751ピクセル以上の場合にPC用画像を表示 -->
  <source media="(min-width: 751px)" srcset="img/forPc.png">
  <!-- ビューポートの幅が750ピクセル以下の場合にスマホ用画像を表示 -->
  <source media="(max-width: 750px)" srcset="img/forSp.png">
  <!-- ブラウザが<picture>タグをサポートしていない場合のフォールバック画像 -->
  <img src="img/fallback.png" alt="フォールバック画像">
</picture>
```
このコードでは、「source」要素を使って、スクリーン幅が751ピクセル以上であればPC用の画像を、それ以下であればスマホ用の画像を表示するように設定します。<img>タグ内に指定されている画像は、万が一ブラウザがsource要素を認識できなかった場合でも適切な画像が表示されるためのものです。（回線が遅い、ブラウザが古いなどが主な理由です。）

**media**
メディアクエリを指定
**img**
イメージ要素は最後に指定

急ぎで簡単なランディングページ（LP）を公開したい場合などに、おすすめです。
リンクを画像に設定したい場合は、「picture」タグ全体をaタグで囲んでください。

（2017/11/12）良いコメントをいただいたので、記事を一部編集しました。