OmniAICreator/Qiita-1.07M huggingface dataset:
OpenSSLで楕円曲線暗号を使う

OpenSSLで楕円曲線暗号を使った署名を試してみました。

#### OpenSSLで利用できる楕円曲線

`ecparam -list_curves` で利用できる楕円曲線の一覧を表示できる。

```shell
openssl ecparam -list_curves
  secp112r1 : SECG/WTLS curve over a 112 bit prime field
  secp112r2 : SECG curve over a 112 bit prime field
  secp128r1 : SECG curve over a 128 bit prime field
  secp128r2 : SECG curve over a 128 bit prime field
  ...
  sect113r1 : SECG curve over a 113 bit binary field
  sect113r2 : SECG curve over a 113 bit binary field
  sect131r1 : SECG/WTLS curve over a 131 bit binary field
  sect131r2 : SECG curve over a 131 bit binary field
  ...
```

#### ECDSAで署名の生成・検証をする

```shell
echo abcde > plain.txt
# 公開鍵・秘密鍵を生成する
openssl ecparam -genkey -name secp112r1 -out key-pair.pem
openssl ec -in key-pair.pem -outform PEM -pubout -out public.pem
openssl ec -in key-pair.pem -outform PEM -out private.pem
# 署名を生成する
openssl dgst -sha1 -sign private.pem plain.txt > signature.dat
# 生成した署名を検証する
openssl dgst -sha1 -verify public.pem -signature signature.dat plain.txt
```

##### 署名のサイズ

```shell
# 署名の構造を表示する
openssl asn1parse -inform DER -in signature.dat
```

ここで、この112bitのECDSA署名のサイズは実行する度に34～36 byteで変化する。これは署名がDER形式でエンコードされているためである。
署名の構成要素である2つの112 bit (= 14 byte) の数値 $r$、$s$ は2の補数表現でエンコードされるため、$8^{13}-1$ より大きい場合は符号ビットを確保するために 15 byte が必要になる。  

##### sが15byteになる場合の署名データ構造

```
30 21 # Sequence (0x30) が以後33バイト (0x21) 続く
02 0e # Integer (0x02) が以後14バイト (0x0e) 続く
(rのバイト列 14バイト)
02 0f # Integer (0x02) が以後15バイト (0x0f) 続く
00 (sのバイト列 14バイト) # 先頭に符号バイトが足されている
```

#### 参考

* [OpenSSLによる楕円曲線暗号の利用](http://webframe.osdn.jp/wiki/index.php?OpenSSL%A4%CB%A4%E8%A4%EB%C2%CA%B1%DF%B6%CA%C0%FE%B0%C5%B9%E6%A4%CE%CD%F8%CD%D1)
* https://superuser.com/questions/1023167/can-i-extract-r-and-s-from-an-ecdsa-signature-in-bit-form-and-vica-versa
sosreportのカスタマイズ

# 前書き
sosreportをサーバのOS構築後の情報取得やカスタマーサポートで使ってらっしゃる方は多いと思います。
しかし、デフォルトでは収集してくれない情報もあります。例えば、/etc/passwd や /etc/group など。
おそらくセキュリティ的な理由であえて取得しないようになっていると思われますが、せっかくのOS情報収集ツールなのに少し不便です。そこでsosreportをカスタマイズして、追加の情報も取得できるようにしてみました。

# カスタマイズ方法
sosreport自体の説明や使い方はこちらでは省略します。
sosreportはPythonで書かれているため、カスタマイズして追加の情報を取得するには、Pythoneでpluginを書くことになります。
pluginの書き方はこちらを参照しました。
[How to Write a Plugin](https://github.com/sosreport/sos/wiki/How-to-Write-a-Plugin)

# 環境
- CentOS 7.5（仮想マシン）
- VirtualBox on Mac

# 今回、sosreportで追加で取得する情報
- /etc/passwdファイル
- /etc/groupファイル
- /etc/sudoersファイル
- `localectl status`のコマンド実行結果

単純にOSの設定ファイルをコピーするだけでなく、任意のコマンド結果も取得することができます。今回キーボードの設定をコマンドで取得することにしました。

# sosreportの変更箇所
/usr/lib/python2.7/site-packages/sos/plugins/に下記のファイルを作成します。

```/usr/lib/python2.7/site-packages/sos/plugins/my_plugin.py
from sos.plugins import Plugin, RedHatPlugin

class MyPlugin(Plugin, RedHatPlugin):
    """This plugin copies some stuff"""

    def setup(self):
        self.add_copy_spec([
            "/etc/passwd",
            "/etc/group",
            "/etc/sudoers",

        self.add_cmd_output("localectl status")
        ])

```

後は普通にsosreportを実行するだけです。

# 実行結果
取得したsosreportの結果ファイルを解凍すると以下のファイルが追加されています。
- etc/passwd
- etc/group
- etc/sudoers
- sos_commands/myplugin/localectl_status
origin masterとorigin/masterの違い

例えばよく使うgitコマンド

```
git fetch origin develop
```
```
git merge origin/develop
```

で、`origin develop`と`origin/develop`の違いは分かりますでしょうか。


## origin develop

originはリポジトリの名前でdevelopはブランチの名前になります。
デフォルトの設定の場合、originというリモートリポジトリのdevelopブランチを表します。


## origin/develop

origin/developはリモートリポジトリのdevelopを追跡するリモート追跡ブランチです。


## 解説

```
git fetch origin develop
```
でリモートリポジトリoriginのdevelopブランチをローカルリポジトリのリモート追跡ブランチに落とします。

```
git merge origin/develop
```
ローカルリポジトリ内のリモート追跡ブランチdevelopよりローカルブランチにマージします。



リモート追跡ブランチは以下に分かりやすくまとめられています。
https://qiita.com/uasi/items/69368c17c79e99aaddbf
Alfred の Clipboard history / Snippet でスペース区切り検索する ( 3.6 にアップデート )

どうやったら出来るんだろうと思って探してみたら、普通に出来ることに気付いた。

どうやら3.6でアップデートが入った様子。

## Alfred 3.6

>Clipboard history and snippet search now treats query spaces as wildcards for wider result matching

## スペース区切りの例

![image](https://user-images.githubusercontent.com/13635059/44823832-89d1a300-ac3d-11e8-977f-7d288cdda0e3.png)

## ワイルドカードを使う例

引き続きワイルドカードも利用できる。(使わないかもしれないけれど)

![image](https://user-images.githubusercontent.com/13635059/44823919-f3ea4800-ac3d-11e8-8675-f25445e7795c.png)


## Links

- [Gist](https://gist.github.com/YumaInaura/4557cbdaf3b9e3ee2496f432cb6f0f3d)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
アソシエーション（ビギナー）

この記事は、「RAILS GUIDES」におけるアソシエーションの内容を自分なりに分かりやすくまとめたものである。

引用部分は全て下記のHPより引用している。
[RAILS GUIDES:Active Record の関連付け (アソシエーション)]
(https://railsguides.jp/association_basics.html)

##アソシエーション

>Railsでは、2つのActive Recordモデル同士のつながりを「関連付け(アソシエーション: association)」と言う。

何を言っているのかよくわからないが、とりあえず、親子のつながり＝アソシエーション（関連付け）と捉えておけば良い。
Active Record＝モデル

### belongs_to関連付け（子から見た親）
>あるモデルでbelongs_to関連付けを行なうと、他方のモデルとの間に「1対1」のつながりが設定されます。このとき、宣言を行ったモデルのすべてのインスタンスは、他方のモデルのインスタンスに「従属(belongs to)」します。

例えば、山田太郎さんが自分の子供を産んだ時に、その子供は自動的に山田という苗字が付与され、子供は一族のグループへと加わる（従属）することとなる。このように、「１対１」のつながりとは、物体Aが持つ情報の一つと、と物体Bが持つ情報の一つがつながることを言う。

その時、従属させるための記述が`belongs_to`となる。これを子供のクラスへと記述することで、子供のマイグレーションファイルには`t.belongs_to :○○`と記述される。

マイグレーションファイルに`t.belongs_to :○○`と記述されることにより、そのテーブルのカラムには`○○_id`のカラムが設定され、このカラムに関連付けのデータ（苗字）が保存されることとなる。

子供が生まれた瞬間インスタンスが生成された瞬間から、そのインスタンスのidは主キーのidと連携し、いつでも呼び出される状態にあるのだ。

##主キーと外部キー
>(belongs_to)と宣言すると、2つのモデルのそれぞれのインスタンス間で「主キー - 外部キー」情報を保持しておくようにRailsに指示が伝わります。また、それに伴って幾つかの役立つメソッドもそのモデルに追加されます。

２つのモデルを関連づけるには、当たり前だが関連づけるための目印が必要となる。秘密基地に手ぶらで言っても通して貰えるわけがないように、「私はあなたの仲間である」と言うことを証明する必要がある。

このように、お互いが仲間であることを証明する役割を果たすもの、つまり、2つのテーブルを関連付けるための新たなフィールドを、「キー（主キーまたは外部キー）」と呼ぶ。

主キーとは、ボスが持っているもので、外部キーは子分が持っているものと考えれば良い。

## has_many関連付け（親から見た子）

子が親に属するために(belongs_to）を使うのに対し、親は自分が親であると宣言する必要がある。その宣言が`has_many`である。生みの親（母親）1人に対して複数の子供がいるような関係を「１対多」の関係と言う。


通常、テーブルには自動的にidカラムが付与される。このアソシエーションでは、
そのidを用いて、関連性をもたせたいテーブルのマイグレーションファイルに
't.belongs_to'や`hasmany`とする。

そうすることで、カラムに「○○_id」とカラムが追加され、
元となるテーブルのidと連動するようになる。

マイグレーションファイルにて、
Go言語 — GOPATHを表示するコマンド ( $ go env GOPATH )

## 例

```
go env GOPATH
/Users/yuma/go
```

## 悪い例

```
echo $GOPATH

```

```
printenv GOPATH

```

環境変数で GOPATH を設定しておらず、デフォルトが使われている場合は何も分からない。

## Versions

- go version go1.10.3 darwin/amd64

## Links

- [Gist](https://gist.github.com/YumaInaura/80c3a8ad9685b84a6d9ab221c97e6661)
- [Medium—imported](https://medium.com/supersonic-generation/golang-show-gopath-go-env-gopath-d638cc73166a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【PHP】 GETを使った受け渡しの備忘録02

https://goo.gl/1ACSYG
の続きです。

送信先のtahnks.phpで送られたパラメータ消して表示すると下記画像のようにエラーになってしまう。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/179505/38e13bd0-df77-e290-3471-bb9346ba4ac9.png)

原因としては、index.html入力値である、nameとnenreiがthanks.phpに送られていないので、エラーとなってしまう。
下記コードで対策する

```thanks.php
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>thanks.html</title>
</head>
<body>
	<?php ini_set('display_errors', 1); ?>

	<h1>thanks.php</h1>
	<p>お名前：
		<?php 
			// 入力値nameが存在すれば表示
			if (isset($_GET['name'])) {
				echo $_GET['name'];
			// なければ名前がないよ
			} else {
				echo '名前がないよ';
			};
		?>
	</p>
	<p>年齢：
		<?php 
			if (isset($_GET['nenrei'])) {
			// 入力値nenreiが存在すれば表示
				echo $_GET['nenrei'];
			} else {
			// なければ年齢がないよ
				echo '年齢がないよ';
			}
		?>
	</p>
</body>
</html>
```

これで下記のように入力値が存在していないthanks.phpアクセスしてもエラーがでなくなりました。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/179505/d2ef0d69-2cfa-0d1b-0510-badc57ab9875.png)

## thanks.phpのコードを綺麗にする
html内でphpを混在させると今は単純なコードだから大丈夫らしいんですが、後々ブラックボックス化してくるとのことで。お掃除したコードが下記です。

<html>タグの上で条件分岐を前もって記載しておき、$nameと$nenreiという変数に格納しておき、html内では変数をechoで呼び出します。

これで先ほどと結果は変わらず表示されます。

```tahnks.php
<?php
	if (isset($_GET['name'])) {
		$name = $_GET['name'];
	} else {
		$name = '名前がないよ';
	}
	if (isset($_GET['nenrei'])) {
		$nenrei = $_GET['nenrei'];
	} else {
		$nenrei = '年齢がないよ';
	}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>thanks.html</title>
</head>
<body>
	<?php ini_set('display_errors', 1); ?>

	<h1>thanks.php</h1>
	<p>お名前：<?php echo $name ?></p>
	<p>年齢：<?php echo $nenrei; ?></p>
</body>
</html>
```

### 参考文献
WEBデザイナー・HTMLコーダーのための実践PHP入門 (1) メールフォームを自作する
https://www.udemy.com/phpbasics01/
ARKit Maniacs リファレンス


# 資料

[ARKit Maniacs (.key 動画再生あり: GoogleDrive)](https://drive.google.com/file/d/1wmIq7eJ2t8AL_ymcv4LHgtw55NzLnu_D/view?usp=sharing)

[ARKit Maniacs (動画再生なし: Speaker deck)](https://speakerdeck.com/satoshi0212/arkit-maniacs)

[ARで作る価値のある物についての考察](
https://speakerdeck.com/satoshi0212/ardezuo-rujia-zhi-falsearuwu-nituitefalsekao-cha)

# 参考

Understanding World Tracking in ARKit
https://developer.apple.com/documentation/arkit/understanding_world_tracking_in_arkit

SwiftShot: Creating a Game for Augmented Reality
https://developer.apple.com/documentation/arkit/swiftshot_creating_a_game_for_augmented_reality

Creating a Persistent AR Experience
https://developer.apple.com/documentation/arkit/creating_a_persistent_ar_experience

Adding Realistic Reflections to an AR Experience
https://developer.apple.com/documentation/arkit/adding_realistic_reflections_to_an_ar_experience

Archiving World Map Data for Persistence or Sharing
https://developer.apple.com/documentation/arkit/arworldmap/archiving_world_map_data_for_persistence_or_sharing

What’s New in ARKit 2
https://developer.apple.com/videos/play/wwdc2018/602/

Understanding ARKit Tracking and Detection
https://developer.apple.com/videos/play/wwdc2018/610/

Inside SwiftShot: Creating an AR Game
https://developer.apple.com/videos/play/wwdc2018/605/

Creating Great AR Experiences
https://developer.apple.com/videos/play/wwdc2018/805/
RustでSingletonパターン（ベアメタル(nostd)版）

# はじめに
前回こんな記事を書きました→[Rustでシングルトンパターン](https://qiita.com/segfo/items/7e6f30053185b26cdd5e)

でもこれ、OS自作する場合には結構使いにくいやり方です。
（OSの機能やlibstdに依存しているため）
なので、ベアメタルでも使えるnostd版を作ります。

# ベアメタルで動作するSingletonなコード
``` rs
// 定義
#[derive(Debug)]
pub struct SingletonObject{
    inner:usize,
}
static mut initialized:bool = false;
static mut singleton:SingletonObject = SingletonObject{
            inner:0,
        };
// 実装
impl SingletonObject{
    pub unsafe fn get_instance()->&'static mut Self{
        if initialized{
            return &mut singleton
        }
        singleton.init();
        initialized = true;
        &mut singleton
    }
    
    fn init(&self){//初期化を実装する}
}

```
とりあえず、mutな参照を返却してあげるだけ。
unsafeではあるけど、仕方ないので一旦これはこれで諦めよう。
MYSQL学んだ事まとめ

MYSQLに関して、学んだことを追記していきます。

#テーブルにカラムを追加する方法

【参考】[add_column-リファレンス](http://railsdoc.com/references/add_column)

カラムを追加するマイグレーションファイルを作成するためには、下記のコマンドを実行します。

$ rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型

例えば、userの自己紹介を保存するためのカラム、nicknameカラムをusersテーブルにtext型で追加したいとします。その時は、以下の例のように書きます。

```terminal
$ rails g migration AddNicknameToUsers introduction:text
```

この時、「Add」「Nickname」「To」「Users」と、単語の頭文字が大文字になっていることに注意。

###add_column
add_columnをマイグレーションファイルのchangeメソッド内に書くとカラムの追加ができます。記述方法は以下です。

```rb
add_column :テーブル名, :カラム名, :カラムの型
```

add_columnを書き終えたら、マイグレーションしましょう。




**逆に、テーブルから不要なカラムを削除する場合**

```console
$ rails g migration Removeカラム名From削除元テーブル名 削除するカラム名：型

$ rake db:migrate
```

# n+1問題の解消方法

###includesメソッド
指定された関連モデルをまとめて取得することで、SQLの発行回数を減らすことができます。書き方は、includes(:モデル名)とします。引数で、関連モデルをシンボル型(接頭に:がつく型)で指定します。

例えばTwitterだと、
usersテーブルとtweetsテーブルの間には以下の図のような関係があります。tweetsテーブルのレコードは必ず1つのusersテーブルのレコードに属しているので、includesメソッドを利用することで、tweetsテーブルのレコードを取得する段階で関連するusersテーブルのレコードも一度に取得してしまえば良い

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256717/6d9a6b05-a055-d9c7-11c2-f5450b9787ca.png)

```TweetsController.rb

class TweetsController < ApplicationController

  def index
    @tweets = Tweet.includes(:user).page(params[:page]).per(5).order("created_at DESC")
  end

  #以下省略

end
```
【PHP】 GETを使った受け渡しの備忘録01

メールフォームの基礎GETを使ったファイル間での受け渡しの備忘録です。

## 流れ
0. index.htmlのsubmitボタンを押すと、tanks.phpに遷移
0. 　formタグの中にあるinputタグのnameと入力値(value)の組み合わせが(name)=(value)という形でurlに追加される
0. inputタグが複数ある場合は&で繋げる

## 送信元 index.html
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>index.html</title>
</head>
<body>
  <h1>index.html</h1>
  <form action="thanks.php">
    /<!-- nameの値がthanks.phpに送られる -->
    <p>お名前：<input type="text" name="name"></p>
    <p>年齢：<input type="text" name="nenrei"></p>
    <p><button type="submit">送信</button></p>
  </form>
</body>
</html>
```
![1.png](https://qiita-image-store.s3.amazonaws.com/0/179505/05946080-b664-f285-9c10-b022e9711685.png)


## 送信先 thanks.php
```php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>thanks.html</title>
</head>
<body>
  <h1>thanks.html</h1>
  <p>お名前：<?php echo $_GET['name'] ?></p>
  <p>年齢：<?php echo $_GET['nenrei'] ?>  </p>
</body>
</html>
```
![2.png](https://qiita-image-store.s3.amazonaws.com/0/179505/8b354011-678f-01cc-c9c8-ded5327da548.png)

## メモ
- フォームはあくまでリンク
- URLのパラメータについている値を取得する
- フォームに入力した値を取得しているのではなく、あくまでパラメータについてる値（そのため、ただのリンクの動きになる）

### 参考文献
WEBデザイナー・HTMLコーダーのための実践PHP入門 (1) メールフォームを自作する
https://www.udemy.com/phpbasics01/
ERBタグ関係　学んだ事まとめ

#ERBタグとは
**<%=と%>**で囲まれた部分をERBタグと言います。
ERBタグは拡張子が「erb」のビューファイルで使用することができます。
ERBタグを使用して記述されたコードはビューファイルが読み込まれる際にHTMLコードとなって読み込まれます。
また-%>のように閉じるタグに-をつける形もあります。
このようにすることで、余計な改行を取り除くことができます。

**<%= %>と<% %>の違い**は、ERBタグに囲まれた処理の返り値を出力するか、しないかという違いがあります。

#link_toメソッド
**link_to**はERBタグの中で使用することができるメソッドです。
このメソッドは引数を指定することで様々なリンクを生成します。

通常HTMLコード内でリンクを生成する際にはaタグを使用します。
link_toメソッドを使って記述を行うと、HTMLコードが読み込まれる際にaタグに変換されるので、サイトを表示した際にはaタグと同様に、リンクとして表示されます。

<ol>
<li>第一引数に文字列型で表示する文言</li>
<li>第二引数に文字列型でルーティングのパスを指定します</li>
<li>httpメソッドを変えたければ第三引数で指定できる</li>
</ol>

```html
<%= link_to 'サインアウト', "/users/sign_out", method: :delete %></li>
```


#form_for(ヘルパーメソッド)
特定のモデルを編集・追加するためのフォームを生成するヘルパーメソッドです。
特定のテーブルにレコードだけを新規作成、更新するときに利用します。

form_forは、引数に渡すインスタンスの状態によって、フォームを投稿した際に実行されるアクションを自動で切り替えてくれます。
newメソッドによって新たに生成されたばかりのインスタンスならばcreateアクションを、findメソッドなどによってDBの情報を反映させた状態のインスタンスならばupdateアクションを動かします。

```html
<%= form_for(@モデルクラスのインスタンス) do |f| %>
…
<% end %>
```

###メソッド一覧

[railsの公式ドキュメント](http://railsdoc.com/form)

<table>
 <tr>
  <td>f.label</td>
  <td>labelのlabelタグを表示</td>
 </tr>
 <tr>
  <td>f.text_field</td>
  <td>textのinputタグを表示</td>
 </tr>
 <tr>
  <td>f.date_select</td>
  <td>モデルで設定したフィールドをselectタグで選べるようにして表示</td>
  </tr>
 <tr>
  <td>f.check_box</td>
  <td>checkboxのinputタグを表示</td>
 </tr>
 <tr>
  <td>f.number_field</td>
  <td>numberのinputタグを表示</td>
 </tr>
 <tr>
  <td>f.submit</td>
  <td>submitのinputタグを表示</td>
 </tr>
</table>

###form_forとform_tagの違い
<ul>
<li>form_for: モデルがあるデータを扱うときに使う。
 <br>params.require(:モデル名).permit(:カラム名)で入力した情報が取得できます。</li>
<li>form_tag: 単にデータを特定のアクションに送りたい時に使う。（検索フォームなど） 
 <br>params.permit(:キー名)で入力した情報が取得できます。</li>
</ul>


#hidden_field_tag
hidden_field_tag は、ユーザーが入力する必要の無い自明のデータをパラメーターとして送信したい時に利用します。
LinuxのVisual Studio Codeでpwshのシンタックスハイライトが効かない件の対策

※エディタではなくて統合ターミナルの話です。

シンタックスハイライトどころか `Write-Host -ForegroundColor`等の色指定もすべて効かない。

これの直し方がなかなか見つからなくて時間食ったのでメモ。

# 原因
> You can fix it by changing environment variable TERM from xterm-256color to xterm

No colors in powershell-6.0.4 on Fedora 28 - just black/white · Issue #7511 · PowerShell/PowerShell
https://github.com/PowerShell/PowerShell/issues/7511#issuecomment-412521213

Visual Studio Codeの統合ターミナルでも確かに`TERM`が`xterm-256color`になっていた。

# 設定
どうもpwshを起動したあとでは遅いらしく、`profile.ps1`で設定しても効かない。Visual Studio Codeで最初に起動するシェルをpwshにしている自分は`terminal.integrated.env.linux`も効かず。

仕方がないのでシェルのパスを`/usr/bin/env`にしてTERM注入。

```json:settings.json
  "terminal.integrated.shell.linux": "/usr/bin/env",
  "terminal.integrated.shellArgs.linux": ["TERM=xterm", "/usr/bin/pwsh"],

```
ゼロから作るDeep-Learning学習メモ4.1～

#ニューラルネットワーク
･ニューラルネットワークは重みパラメータを手作業で決定するのではなく、データから自動で決定できる。
･数字等を認識するときには、特微量を抽出して、その特微量のパターンを機械学習の技術で学習する。
　*特微量は入力画像から本質的なデータを的確に抽出できるように設計された変換器のこと。

#損失関数
･損失関数はニューラルネットワークの学習における現在の状態(性能の悪さ)を示す指標。

･一般的に二乗和誤差や交差エントロピー誤差を使うことが多い。
･損失関数の値は教師データからの差
･最適なパラメータを探索するときに、できるだけ小さな損失関数を探索する。
GCP dataprocでpyarrowを使う

# pyarrow, Apache Arrowについて
- pyarrowとはApache Arrowプロジェクトのpythonインタフェースです
- Apache Arrowプロジェクトはインメモリ上のカラムナフォーマットとアルゴリズムとそれらを扱うプログラム言語バインディングです
- Spark, Pandas, Hadoop, HBaseなどがプロジェクトに参画しており、これらのシステムのメモリ構造が統一されることで各システム間でのデータ連携によるオーバーヘッドを減少させることができます
- Spark 2.3ではSpark DataFrameとPandasのデータ変換がArrowにより劇的（数十倍とか）に性能改善しています。以下のようなコードが改善されます。

```
# run on pyspark
import numpy as np
import pandas as pd

# Arrowを有効にするためには以下のパラメータをセットする
spark.conf.set("spark.sql.execution.arrow.enabled", "true")

pdf = pd.DataFrame(np.random.rand(1000000, 3))

# spark dataframeへの変換が高速になる
df = spark.createDataFrame(pdf)

# pandas dataframeへの変換が高速になる
result_pdf = df.select("*").toPandas()

```

# dataprocについて 
- dataprocはGCP上のHadoop, Sparkマネージドサービスです
- Hadoop, Sparkクラスタを作成するときは、GCPが提供しているVMイメージを選択してクラスタ作成するのが普通ですが、pyarrowは含まれていないのでカスタムイメージを作成する必要が出てきます

# 手順
(gcloud等の初期設定は終わっているものと仮定します)

- カスタムイメージを作るためのインストールスクリプトを用意します。下記のインストールスクリプトではpyarrow, pandasのインストールとnumpyのアップグレードを行います。

```
sudo curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python
sudo pip install pyarrow
sudo pip install pandas
sudo pip install numpy --upgrade
```

- Daisyを以下からダウンロードします

  https://googlecloudplatform.github.io/compute-image-tools/daisy-installation-usage.html

- 実行権限つけます

```
chmod +x daisy
```

- cloud-dataprocをgit cloneします

```
git clone https://github.com/GoogleCloudPlatform/cloud-dataproc.git
cd cloud-dataproc/custom-images
```
- generate_custom_image.pyを実行してカスタムイメージを作成します。ここではdataproc 1.3.5をベースにカスタムイメージを作ります。1.3.5はSpark 2.3がインストールされています。

```
python generate_custom_image.py \
    --image-name [カスタムイメージの名前] \
    --dataproc-version 1.3.5 \
    --customization-script [上で作成したインストールスクリプトのパス] \
    --daisy-path [daisyのパス] \
    --zone [GCPのゾーンのいずれか] \
    --gcs-bucket [ログとかをおくGCSのパス] 
```

- dataprocの作成画面のイメージの選択のところから、作成したカスタムイメージを選択することでpyarrowが使えるクラスタが作成されます
<img width="728" alt="スクリーンショット 2018-09-01 8.45.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/276167/37b52f10-93c3-8795-5520-2f84106b4993.png">
半PWAの立替料金計算アプリを作成してみた①

# 作ったもの
細かい立替や割り勘に対応できるPWAアプリを作成しました。

webサイトは[こちらです](https://travelmanager-8eacb.firebaseapp.com/)

▼ 旅行のメンバーを追加
<img width="375" alt="IMG_0650.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/11743/9ebdaaae-734d-26a8-fd70-bf29a030eeeb.png">

▼ 支払い内容と、共有するメンバーを選択
<img width="375" alt="IMG_0651.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/11743/55159382-03bf-ce85-a163-e00f86cec3de.png">

▼ 支払う金額を算出
<img width="375" alt="IMG_0652.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/11743/ffeb8700-9905-f213-926c-4e1951ae7a8e.png">

# 利用したサービス
## Firebase
FirebaseはGoogleが提供しているモバイルプラットフォームで、利用することによって、アプリの開発が断然楽になります。
今回は、アップするサーバーとしても利用しています。

## Nifty mobile backend
今回は、データストアとして、Niftyのmobile backendを利用しています。
無料版を利用しているので、サーバーとのデータのやり取りの回数は制限されてしまうのですが、とても簡単にサーバに保存する仕組みなどを実装することが可能です。

## PWA(一部)
今回は、アプリ画面のようにサービスが利用出来るという点を旅めもに実装しました。
ServiceWorkerは、オフライン環境で利用することを想定していないアプリのために、実装していません。

# 終わりに
作成したサービスは、メンバー間での立替・割り勘の会計を簡潔に行えるようにしてくれるサポートをするアプリです。割と修正なども手軽にできるようになっているので、細かい点にも気がきくようになっていると思います。
[良かったら一度利用してみてください](https://travelmanager-8eacb.firebaseapp.com/)

今回の記事では、アプリの概要と、利用したサービスを紹介させて頂きました。次回アプリの詳細について記載させて頂きたいと思います。
Python3 関数にプロパティを設ける

あんまりググってないし、ドキュメント等を確認できているわけではないのですごくラフな投稿。よく考えればできても不思議ではないと思ったのですが、初見時意外に思ったので、思い付きでポストしてます(要は備忘録)。。突っ込みどころ満載かもしれません(突っ込んでください[^1]。特に用語が曖昧です。この記事では属性とプロパティを混同してます。)

# まず前提として

「オブジェクトにプロパティ」と聞くとclassを定義して云々するのが普通の感覚だと思います。

```python:python3
class Hoge(object):
    def __init__(self, name):
        self.attr = f"{name}'s attr"

if __name__=="__main__":
    h = Hoge("namnium")
    print(h.attr) # => namnium's attr
```

が、なんか関数自体にも属性値をつけられるというね。。JavaScriptみたい[^2]

```python:python3
def f():
    return 0
f.attr = "f's attr"
print(f.attr) # => f's attr
```

```python:python3
a = lambda : "hoge"
a.b = "fuga"
print("a: ", a()) # => hoge
print("a.b: ", a.b) # => fuga
```

[Djangoのチュートリアル](https://docs.djangoproject.com/ja/2.0/intro/tutorial07/)中に出てきたメソッドにこの方法での属性値設定が行われていたので、少し実験してみましたという感じです。。

できないのはわかっていましたが、文字列やリストでもやってみましたけどやっぱり無理でした。。リストでもできないということは `mutable` かどうかとかが関係してるわけでもなさそう...

なにか属性を付けられるオブジェクトに法則性がありそうですが、それについてはこれからドキュメント等を調べようと思います。

Djangoのようにフレームワークで使うならわかりますが機能としては普段は使わなさそう...何かわかり次第追記します。

[^1]: 「ここに書いてるしもっとggrks。こんなゴミ記事量産するな」という方はぜひ教えていただけると幸いです。。「ここは質問サイトではありません」とおっしゃる方がいるかもしれないですけど、質問というわけではなくどちらかというと独り言ですのでスルーしていただけると幸いです。
[^2]: functionが第一級オブジェクトとして扱える、というもので、関数型言語の特徴らしい。。([Wikipedia](https://ja.wikipedia.org/wiki/JavaScript)の受け売り)
p5.jsでpixel操作をするとなんか結果が小さくなる

題の通り。

## 現象

```js
loadPixels();
for (let y = 0; y < height; y++) {
  for (let x = 0; x < width; x++) {
    const idx = 4 * (y * height + x);
    pixels[idx] = 100; // r
    pixels[idx+1] = 100; // g
    pixels[idx+2] = 100; // b
    pixels[idx+3] = 100; // a
  }
}
updatePixels();
```

みたいにやってもキャンバス全体じゃなくて細長い範囲しか描画されない。
みたいな現象。

![ダウンロード (12).png](https://qiita-image-store.s3.amazonaws.com/0/22102/bba1d08e-20f2-0ff9-767d-0db631e67424.png)

## 原因

画面の解像度を考慮していない。
解像度が高いディスプレイだとピクセル情報が 4 * width * height の数よりも多い。

## 解決方法

`pixelDensity(1)` とする。

![ダウンロード (11).png](https://qiita-image-store.s3.amazonaws.com/0/22102/683b35ef-fdd1-6194-250c-6fcaec501c1b.png)

もしくは解像度を考慮したピクセル操作をするか…。
btrfsでDropboxを使う

## はじめに
Linux版Dropboxがext4にしか対応しないというアナウンスが流れた。しかし、Dropboxのために今使ってるbtrfsを変えるのは癪だし、別でpartition切るのは空き作るのが辛かったり容量の管理が面倒くさい。そこで、loopbackで既存fs上にext4のファイルを作ってDropboxを動かす。タイトルはbtrfsだけど他でも流用可能。

ArchLinuxの場合で説明するが、特にArchLinux特有固有の話は無いと思われるので、他のLinuxでも問題なくできる筈である。

## 手順
### 元になるファイル作成
元になるファイルを作成する。ただし、ファイルシステムの都合上予め最大容量を決め打ちする必要がある。作り直すのは面倒くさいのでできるだけデカく作っておきたいが、無駄が多い。ので、0の羅列の場合は容量を省略できるスパースファイルとファイルシステムの透過的圧縮(使っているファイルシステムに依る。最新のext4やbtrfsは対応している)を併用する。

1. `truncate -s 4G loop-dropbox`でスパースファイルを作る
2. 可能であれば`chattr +c loop-dropbox`でファイルに圧縮属性を付与
3. `mkfs.ext4 loop-dropbox`でext4でフォーマット

### マウント・コピー
最初全削除してloopbackファイルを直でマウントしたら全削除されたと判断されて全部吹き飛ばすミスをしたので(復元はしたが)、マウントしたらまずは全ファイルをrsyncする。

1. `mount -o loop -t ext4 loop-dropbox Dropbox2`でマウント
2. `rsync -av Dropbox/ Dropbox2/`
3. dropboxを落とす
4. Dropboxを削除
5. Dropbox2をunmount
6. Dropboxにマウント
7. dropbox再起動

### fstab設定
うまく動いたらmount設定をfstabに永続化しておく

```
/.../loop-dropbox /home/.../Dropbox ext4 loop 0 0
```

これでおしまい。

## Thanks
大体この辺全部筆者がオリジナルで考えたかのように書いてるけど、@syuu1228 先生の技術協力によってできたものです。ありがとうございました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">btrfsの上に仮想でext4作れたりしませんかね</p>&mdash; ぽんこつ@本骨システム (@ponkotuy) <a href="https://twitter.com/ponkotuy/status/1035569726859034624?ref_src=twsrc%5Etfw">2018年8月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">loopback mountなら一応出来るけれども…（なんか変な使い方になるなぁとは思う</p>&mdash; syuu1228 (@syuu1228) <a href="https://twitter.com/syuu1228/status/1035570496962613248?ref_src=twsrc%5Etfw">2018年8月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">スパースファイルもある程度有効だと思うけど、btrfsの圧縮を個別のファイルにかけられないかな…？ chattr +c とかで出来るっぽいことが書いてある気がする（まぁ遅くはなるだろうが） <a href="https://t.co/gMmPAx3mzJ">https://t.co/gMmPAx3mzJ</a></p>&mdash; syuu1228 (@syuu1228) <a href="https://twitter.com/syuu1228/status/1035598959320809472?ref_src=twsrc%5Etfw">2018年8月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 余談
作者はDropboxやめてMEGAに移行したので今も動くかはわかりません!  https://mega.nz/
Gaussianの積と表現

正規分布（Gaussian）は確率論や統計学で最も基本となる確率分布ですね。$N$変数の正規分布はその平均値$\mu$と共分散行列$\Sigma$を定めると一つ決まります。

$$
\mathcal{N}\[\mu, \Sigma\](x) \propto \exp\left(-(x-\mu)^T \Sigma^{-1} (x-\mu) /2\right)
$$

（規格化定数は省略）
$\mu$と$\Sigma$それぞれ次の式を満たします

$$
\mu = \int x \mathcal{N}\[\mu, \Sigma\](x) dx
$$ $$
\Sigma_{ij} = \int (x-\mu)_i (x-\mu)_j \mathcal{N}\[\mu, \Sigma\](x) dx
$$

この表記は畳み込み積
$$
(p * q)(x) = \int p(y-x)q(x)dx
$$
と相性がよく、$p = \mathcal{N}\[\mu_1, \Sigma_1\]$, $q = \mathcal{N}\[\mu_2, \Sigma_2\]$の時、$p*q = \mathcal{N}\[\mu_1 + \mu_2, \Sigma_1 + \Sigma_2\]$が成り立ちます。確率分布の周辺化と聞くと難しそうですが、正規分布の場合にはただの足し算ですね。

さて、確率論ではもう一つ積が出てきます
$$
p(x|y) \propto p(y|x) p(x)
$$
みんな大好きベイズの定理です。$p(y|x)$には真の値$x$に対してノイズの乗った観測値$y$のような場合が典型的に入るので、これは正規分布になっている（仮定する）ことが多いですね。Gaussianはこの積に対してどう振る舞うでしょうか？
$$
\mathcal{N}\[\mu_1, \Sigma_1\](x)\mathcal{N}\[\mu_2, \Sigma_2\](x) \propto \exp\left(-(x-\mu_1)^T \Sigma_1^{-1} (x-\mu_1) /2  -(x-\mu_2)^T \Sigma_2^{-1} (x-\mu_2) /2\right)
$$
この右辺は$x$の二次方程式なので平方完成すればよくて、
$$
\Sigma = (\Sigma_1^{-1} + \Sigma_2^{-1})^{-1}
$$ $$
\mu = \Sigma ( \Sigma_1^{-1} \mu_1 + \Sigma_2^{-1} \mu_2)
$$
となります。なにやら難解な事になりましたが、よく見ると次のように書けます
$$
\Sigma^{-1} = \Sigma_1^{-1} + \Sigma_2^{-1}
$$ $$
\Sigma^{-1}\mu = \Sigma_1^{-1} \mu_1 + \Sigma_2^{-1} \mu_2
$$
この形から察するに、正規分布を$(\mu, \Sigma)$の組ではなく、$(\xi=\Sigma^{-1}\mu, \Omega=\Sigma^{-1})$の組で定めておけば、この積に対して単純に振る舞うことが分かります。
$$
\xi = \xi_1 + \xi_2
$$ $$
\Omega = \Omega_1 + \Omega_2
$$
正規分布が縮退していない（$\Sigma$が正定値行列）の場合にはこれらは1対1に対応するので、$(\xi, \Omega)$の組もまた正規分布を一つ定める事が分かります。実はこの$(\xi, \Omega)$は指数型分布族で言う自然パラーメタと呼ばれる量になっていて、この関係も指数型分布族一般になりたつものです。

このように確率論において確率分布に対する重要な二つの積が正規分布の表現を工夫することで足し算・行列積・逆行列の計算に書き下せることを見ました。

本題
----
この$\xi$と$\Omega$、及び後者の積は名前がついてる概念だと思うのですが、名前を知らないのでプログラムを書くときに困っています。誰か教えてください。。。
HerokuでStaging環境のデータベースを作成するときに使うコマンド


* 'heroku' => 本番環境
* 'staging' => ステージング環境

```
# データベースの利用状況を確認
heroku pg:info -a appname
heroku pg:info -a appname-stg

# データベースのバックアップ状況を確認
heroku pg:backups --remote heroku
heroku pg:backups --remote staging

=== Backups
heroku pg:backups:capture

=== Restores
heroku pg:backups:restore to restore a backup

```
Vue.jsをはじめてみた話

# はじめに
Vue.jsに興味があったけど、まったく触れることがなく過ごしていた私がVue.jsを触ったきっかけと思ったことをまとめます。[^1]

# きっかけ

動的ページを静的ページに移行が必要になったため、API経由での動的表示を行う必要がありました。
そこで、いつもどおりjQueryを使ってJSでHTMLを表示する実装をしてみました。

### jQuery(JS only)での実装抜粋[^2]

```coffeescript:cast.coffee
@build = (item) ->
  id = item["id"]
  name = item["name"]
  age = item["age"]
  src = item["photo"]
  # HTMLタグの生成
  return """
<div>
  <div class="card">
    <a href="/cast/show?id=#{id}">
      <img class="card-img-top" src="#{src}" alt="#{name}">
      <div class="card-body">
        <p>
          #{name}(#{age})
        </p>
      </div>
    </a>
  </div>
</div>
"""

$(document).on 'turbolinks:load', ->
  promise = get('/api/cast/casts')
  promise.done (items) ->
    if items.length == 0
      return

    body = ""
    for item in items
      body += build(item)

    $('#cast-body').html(body);
  promise.fail ->
    showInformation("通信に失敗しました")
```

```html:cast.html
  <div class="row" id="cast-body">
  </div>
```

と、実装は出来たけど・・・

* HTMLをJSで生成する実装って読みやすいのか？:thinking_face: 
* HTMLはHTMLで完結させたい :innocent: 
* もしかしたらVue.jsなら解決する？ :muscle: 

・・・Vue.jsやってみよう！

### Vue.jsでの実装抜粋[^2]


```coffeescript:cast.coffee
#= require vuejs

build = (item) ->
  return {
    id: item["id"]
    name: item["name"]
    age: item["age"]
    src: item["photo"]
  }

$(document).on 'turbolinks:load', ->
  promise = get('/api/cast/casts')
  promise.done (items) ->
    if items.length == 0
      return

    datas = []
    for item in items
      datas.push(build(item))

    # jQuery導入済みのため、axiosは未使用
    new Vue(
      el: '#items'
      data:
        items: datas
    )
  promise.fail ->
    showInformation("通信に失敗しました")
```

```html:cast.html
  <div id="items" v-cloak>
    <div class="row">
      <div v-for="item in items">
        <div class="card">
          <!-- 
               :href="/cast/show?id= + item.id" 
               :href="'/cast/show?id=' + {{ item.id }}" 
               などは変数展開が失敗するので注意
          -->
          <a :href="'/cast/show?id=' + item.id">
            <img class="card-img-top" :src="item.src" :alt="item.name">
            <div class="card-body">
              <p>
                {{ item.name }}({{ item.age }})
              </p>
            </div>
          </a>
        </div>
      </div>
    </div>
  </div>
```

ぱっと見でもVue.js良いですね！

* HTMLはHTMLで完結するので、IDEなどの保管も効いて :ok_hand: 
* [省略記法](https://jp.vuejs.org/v2/guide/syntax.html#%E7%9C%81%E7%95%A5%E8%A8%98%E6%B3%95)を使うことでHTMLの可読性が落ちにくい :ok_woman:  
* 日本語のドキュメントが充実しているので、迷ったときも安心 :muscle: 
* 変数展開で少しハマったのでドキュメントはちゃんと読みましょう :innocent: 

まだまだ学習途中ではありますが、今後学びながらドンドン使っていきたいと考えています！

[^1]: 1時間程度しかまだ触ってません :innocent: 
[^2]: coffeescriptで記述なので、生JSと少し違っています
CentOS7.5にminikubeをインストールする

#はじめに
CentOS7.5の仮想マシンにminikubeをインストールしました。
メモとしてインストール手順を残しておきます。

#環境
- CentOS：7.5.18.04
- Docker：18.06.1-ce
- ネットワーク：プロキシーなし 

#手順
##minikubeをインストールします
```bash
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo cp minikube /usr/bin/ && rm minikube
```
github資料によりますと、/usr/local/bin/に配置しますが、起動時に```sudo: minikube: コマンドが見つかりません```のエラーが発生するため、/usr/bin/に配置します。

##kubectlをインストールします
```bash
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo cp kubectl /usr/bin/ && rm kubectl
```
同様の理由で、/usr/bin/に配置します。

##ブリッジのiptablesを設定します(2018/11/06追記)
ブリッジのiptablesを有効化する必要があります。
ブリッジのiptablesを確認します。 

```bash
sysctl net.bridge.bridge-nf-call-iptables
```
```net.bridge.bridge-nf-call-iptables = 0```が表示されている場合、有効化します。  

```bash
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
```

##ファイアウォールを無効化します。(2018/11/06追記)  

```
sudo systemctl stop firewalld
sudo systemctl disable firewalld
```

##minikube起動を準備します
```bash
export MINIKUBE_WANTUPDATENOTIFICATION=false
export MINIKUBE_WANTREPORTERRORPROMPT=false
export MINIKUBE_HOME=$HOME
export CHANGE_MINIKUBE_NONE_USER=true
mkdir -p $HOME/.kube
touch $HOME/.kube/config

export KUBECONFIG=$HOME/.kube/config
```

##minikubeを起動します
```bash
sudo -E minikube start --vm-driver=none
```
初回起動時に、kubeletとkubeadmを自動的にダウンロードしますので、環境により時間がかかります。
下記メッセージが表示されたら、起動が完了しました。

```bash
[user@localhost ~]$ sudo -E minikube start --vm-driver=none
[sudo] user のパスワード:
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Downloading kubeadm v1.10.0
Downloading kubelet v1.10.0
Finished Downloading kubeadm v1.10.0
Finished Downloading kubelet v1.10.0
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
===================
WARNING: IT IS RECOMMENDED NOT TO RUN THE NONE DRIVER ON PERSONAL WORKSTATIONS
        The 'none' driver will run an insecure kubernetes apiserver as root that may leave the host vulnerable to CSRF attacks

Loading cached images from config file.
[user@localhost ~]$
```

##minikubeを確認します
```bash
minikube status
```
下記内容が表示されます。

```bash
minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 10.0.3.15
```
minikubeインストールはここて終了します。

#参考資料
- https://github.com/kubernetes/minikube
Pythonで競プロに挑む日誌 vol.3-1 ~内包表記との出会い~

# 現在の目標
* 完了: ~~AtCoder をはじめる~~
* 今年の10月内に茶色を取得する **←イマココ**
* 年内に緑色を取得する
* [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す

# 本日の問題
### ABC087B - Coins 
https://beta.atcoder.jp/contests/abs/tasks/abc087_b
**結果**

```answer.py
# coding: utf-8
A, B, C, X = [int(input()) for i in range(4)]
#print(A, B, C, X)
 
# すべての和を出して、X と一致する個数を数える（力技）
cnt = 0
for a in range(A + 1):
    for b in range(B + 1):
        for c in range(C + 1):
            if (a * 500 + b * 100 + c * 50) == X:
                cnt += 1
 
print(cnt)
```
回答時間：30分
実行時間：49 ms
メモリ　：3064 KB
コード長：249 Byte
得点　　：200/200

絶対にもっとスマートな方法があると思ったのですが、今日はいくら粘ってもダメそうな気がしたのでひとまず力技で回答しました。ほかの回答者のすっきりしてそうなコードを眺めても頭に入ってこなかったので今日は寝ます。明日はノートに式を書いて考えてみよう。

# 明日やること
* この問題をもうちょっとスマートに解く。
* [ABC083B - Some Sums](https://beta.atcoder.jp/contests/abs/tasks/abc083_b) 以降を解き進める。
Apache上で動いたPhpのcode coverageをPhpStormで見る方法


##前提条件
* windows10で動かして
* apacheの設定は特にいらない
* xdebugが動くこと
* ローカルで動かす事
* php-7.2.9-Win32-VC15-x64
* Apache 2.4.34 win64 VC15(スレッドセーフ)



## 準備
https://github.com/sebastianbergmann/php-code-coverage

を

composer require phpunit/php-code-coverage

で落としてくる。

以下のサンプルはPHP_CodeCoverage 2.2なのでクラス名とか違うので最新のREADME.mdをみてちょと書き直せばいい。


githubのサンプルで示すような感じでindex.phpから動かすようにする

```php
$coverage = new PHP_CodeCoverage();

$coverage->start('<name of test>');

CodeCoverageXX::$coverage=$coverage;


function shutdown()
{
    $coverage = CodeCoverageXX::$coverage;
    $coverage->stop();

    $writer = new PHP_CodeCoverage_Report_Clover;
    $writer->process($coverage, 'D:\link\var\coverage\\'.date('Ymd_His').'_'.getmypid(). '_Apach.xml');

}

register_shutdown_function('shutdown');

/** shutdownにわたすため **/
class CodeCoverageXX
{
    /* @var PHP_CodeCoverage */
    public static $coverage;
}


```


このコードを常時動かすと遅いのでon/offができるようにしておくこと

Apacheで実行後に

![read01.jpg](https://qiita-image-store.s3.amazonaws.com/0/185049/9d7595d2-b703-cdea-b951-7b5648253a69.jpeg)


Show Code Coverage Dataで取得する

![read02.png](https://qiita-image-store.s3.amazonaws.com/0/185049/c5b5baaa-99bc-41c9-0388-9a519c0e654c.png)


+で追加してチェックボックスをつけて表示する。
たくさんのカバレッジをこれで表示するのは大変なので以下のように書き換える
シリアライズして保存するコード。

```php
$coverage = new PHP_CodeCoverage();

$coverage->start('<name of test>');

CodeCoverageXX::$coverage=$coverage;
function shutdown()
{
    $coverage = CodeCoverageXX::$coverage;
    $coverage->stop();

    file_put_contents('D:\link\var\coverage\\'.date('Ymd_His').'_'.getmypid().'_Apach.txt', serialize($coverage));

}

register_shutdown_function('shutdown');

```


複数のシリアライスされたオブジェクトが保存されるので

以下のコードでマージする

```php
<?php


require __DIR__.'/../../bootstrap/autoload.php';
$list = glob('D:/link/var/coverage/*.txt');

/* @var $coverage PHP_CodeCoverage */
$coverage = null;
foreach ($list as $filePath) {
    echo $filePath . PHP_EOL;
    $c = unserialize(file_get_contents($filePath));
    if ($coverage === null) {
        $coverage = $c;
    } else {
        $coverage->merge($c);
    }
}

if ($coverage === null) {
    $coverage = new PHP_CodeCoverage();
}

$writer = new PHP_CodeCoverage_Report_Clover;
$writer->process($coverage, 'D:\link\var\coverage\\'.date('Ymd_His').'_'.getmypid().'_Apach.xml');

foreach ($list as $filePath) {
    unlink($filePath);
    echo $filePath .'.....unlink'. PHP_EOL;
}
```
実行後Show Code Coverage Dataで取得すれば複数のイベントをまとめて表示できる。

WebDriverでテストを実行してPhpStormで見ることができる！
こりゃ便利(´,,･ω･,,`)
Wit.aiのタグ分けをPythonから利用する方法

#事前に準備したこと
- wit.aiで事前に学習させる
    - https://ferret-plus.com/7736 で説明してくれているのでストーリーの手前まで作成しました
- Python3をインストール

これらのことを前提として話を進めます。
#準備編
##witをpythonで使えるようにしよう
まず、Python3でwit.aiへアクセスするためのモジュールをインストールします。

インストール時にバイパスしている場合は、コマンドプロントからpipでインストールできます。

```
pip install wit
```
これで完了したらpythonからwit.aiへアクセスできます。
##Client Access Tokenの取得
ここからは、wit.aiでの作業になります。
###1.Appを開く
wit.aiで事前に学習させたときの、Appを開きます。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/250596/1be4fe42-bda0-38d0-b651-8dce70abb059.png)

###2.設定を開く
画面右上にある、歯車アイコンから設定画面を開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250596/637184a3-8995-46ab-f5b1-8c090c4d8189.png)
###3.API DetailsのClient Access Tokenを取得
設定ページの下へスクロールするとAPI Detailsがあり、その中にClient Access Tokenと書かれた場所があります。
もし、この時点でキーがない場合はテキストボックス左下の更新アイコンで更新してください。
しばらくするとキーが表示されます。

##Pythonコード
今回は、wit.aiのモジュールを公開しているGithubにサンプルコードがあったのでそのまま使います。

```python:wit_ai.py
from wit import Wit

client = Wit('ここに先ほど取得したClient Access Tokenを入れる')

resp = client.message('ここに分類？したい文を入れる')
print('Yay, got Wit.ai response: ' + str(resp))

```

`from wit import Wit`の最後のWitは大文字なので注意！

とりあえず、私は分類したい文として「明日成田からロンドンまで行きたい」と入れました。

返答は、辞書形式で返ってきているようなので各自見やすいようにしてみるとわかりやすいと思います。

#私なりの使い道
自然言語処理などで、固定抽出表現などを使って特定の単語を取り出すようなことが、簡単にできるのでもっと広がればと思います。
ディープラーニングやアルゴリズムを使わずに、簡易的ではあるものの意図したものは作れるような印象を受けたので今後の使い道を考えて活用していきたいと思います。
【Unity】Entity Component System on WebGL【パッケージ改造】

初透光です（）

リポジトリは[こちら](https://github.com/pCYSl5EDgo/Blank-ECS-WebGL)に置いておきます。LICENSEはMITですので、どうぞご自由にお使いください。

#執筆者環境

 - Unity 2018.2.6f1
 - ECS 0.0.12-preview.11

#問題提起
Entity Component Systemのバージョンは上がる度にかなり破壊的変更が入ります。
大体においてより性能が上昇するよい方向への変化で歓迎できますが、性能向上のために動かなくなる環境もあります。

**WebGL　おめーのことだよ！！！**

##WebGLの限界

 - マルチスレッド処理ができない
  - C# Job Systemが死んだ！　この人でなし！
  - IntelのSpectreとMeltdownさえなければ今年中にWebAssemblyでマルチスレッド処理を行えていたはずだった　（´・ω:;.:…
 - AOT
  - System.EmitやSystem.Text.RegularExpressionが死んだ！　この外道！
 - OpenGL ES 3.0相当の表現力しかもたないシェーダーコード
  - マルチスレッドできないのにComputeShaderが使えないとか追い打ちやめてクレメンス……

それでも、ECSで立ち向かわなくちゃいけないんだ！
**Unity１週間ゲームジャムの提出形式がWebGLだから！**

#解決策
@mao_ さんがTwitterで呟いた「WebGLでECSを使う方法」は[こちら](https://twitter.com/TEST_H_/status/1035199321770053633)。

#解決策その2
できれば最新版使いたいので、最新のECSをWebGLに対応させました。

##対応方法

 - JobComponentSystemを削除
  - 依存するもの全て削除・修正
 - IJobParallelForComponentData削除
 - IJob/IJobParallelForを実装した構造体をScheduleしていた部分を同期的に書き換えた
  - IJobParallelForはfor文にし、return文を適宜continueに書き換えた
  - Job構造体のフィールド名をリファクタリングでローカル変数の名に書き換えることでコピペ効率を上げた
 - JobHandleを扱う部分を削除した
 - JobComponentSystemを継承していたSystemを書き換えてComponentSystemを継承するように変更した
 - NativeContainerのAllocatorのうちTempJobを全てTempに書き換えた

このような手順を丁寧に踏むことでECSがWebGLで動くようになりました。

#苦労した点

メモリリーク周りでエラーが嵐のように吹き荒れました:imp:

 - Unity.Collections.DeallocateOnJobCompletionを付与されていたNativeContainerを書き換えた後Disposeし忘れていた
 - 最適化のためにコードパスの枝刈り(早めのreturn)をしていたが、そうするとDisposeし忘れたコードパスが多々存在した

#結論
https://github.com/pCYSl5EDgo/Blank-ECS-WebGL

これを使って9月3日からのゲームジャムに最新のECSで挑むことが可能です。
Opencvで顔を検出してみた

##はじめに
この記事では以下のようなことについて書きます。
1.opencvで顔を検出
2.顔を検出して切り出し、別のファイルに保存する

##環境
```
windows
juypter notebook
python3.6
```

##下準備
opencvが使えない場合はjuypter notebookに以下を入力してください。


```
! pip install opencv-python
```
特徴ファイルは[こちら](https://github.com/opencv/opencv/tree/master/data/haarcascades)にあります。


##顔を検出


```qiita.py
import cv2
import  matplotlib.pyplot as plt
%matplotlib inline

img=cv2.imread("./Lena.jpg")#画像の読み込み
image=cv2.imread("./Lena.jpg",0)
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#RGBに変換する
HAAR_FILE="haarcascade_frontalface_default.xml"#特徴の読み込み
cascade=cv2.CascadeClassifier(HAAR_FILE)
face=cascade.detectMultiScale(image)#顔検出
for x,y,w,h in face:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),3)#顔を四角で囲む
plt.grid(False)#デフォルトだとグリッドとxy軸ラベルが表示されるので非表示にする
plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
plt.imshow(img)
```

![2019-07-15 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169545/c7807e2b-e430-0e0d-99f1-6785108c3082.png)

##顔を検出して別のファイルに保存
ここからjupyter notebook使用しています


```.py
import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys, os
from PIL import Image
%matplotlib inline


#入力ファイルのパスを指定
in_jpg = "in_nana/"
out_jpg = "out_nana/"

#リストで結果を返す関数
def get_file(dir_path):
    filenames = os.listdir(dir_path)
    return filenames

pic = get_file(in_jpg)

for i in pic:
    # 画像の読み込み 
    image_gs = cv2.imread(in_jpg + i)

    # 顔認識用特徴量ファイルを読み込む --- （カスケードファイルのパスを指定）
    cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

    # 顔認識の実行
    face_list = cascade.detectMultiScale(image_gs,scaleFactor=1.1,minNeighbors=1,minSize=(1,1))

    # 顔だけ切り出して保存
    cnt= 1;
    for x,y,w,h in face_list:

        dst = image_gs[y:y+h,x:x+w]
        #保存する時の名前
        save_path = out_jpg + '/' + 'out_('  + str(i) +')' + str(no) + '.jpg'

        #認識結果の保存
        a = cv2.imwrite(save_path, dst)
        plt.show(plt.imshow(np.asarray(Image.open(save_path))))
        print(cnt)
        cnt += 1
```
![2018-09-01 (1).png](https://qiita-image-store.s3.amazonaws.com/0/169545/45b3137e-5653-81fe-b1a5-6d4dbf5ebf81.png)
このようになりました。上手く切り出せず顔以外の画像も保存されています。
##参考
[大量の画像から顔の部分のみトリミングして保存する方法](https://ai-coordinator.jp/opencv_face)
[OpenCVでの画像処理](https://www.udemy.com/jp/)
##おわりに
質問や間違いがありましたらコメントお願いします。
php-master-changes 2018-08-31

というわけで、ちょうど[はじめてから](https://qiita.com/sj-i/items/8d716a389057d041623f) 1 ヶ月たった
案外続くもの（が、明日も続くかは分からない）

# 2018-08-31
## weltling: Switch to staging series on AppVeyor
- https://github.com/php/php-src/commit/58339f37e5cf8e3d0dbaab925fd4a545cae2221e
- [stable にしていた](https://qiita.com/sj-i/items/b8b8e2ed8aad529b3dc3#weltling-use-stable-deps-on-appveyor-for-now) AppVayor の設定を staging へ戻した
- 当初問題が解決したということかな

## cmb69: Fix [#76820](http://bugs.php.net/bug.php?id=76820): Z_COPYABLE invalid definition
- https://github.com/php/php-src/commit/c5231ad394fa3a6c59b9786af977d61da3f1e208
- deprecate されたマクロ Z_OPT_COPYABLE の定義がコンパイルの通らないものだったのを修正

## weltling: Fix stack underflow in phar
- https://github.com/php/php-src/commit/7fb7869e13999f419787f56340ca4b4dbbb4eef8
- [8/7 のコミット](https://qiita.com/sj-i/items/768e9afbd71f43d13fc8#weltling-fix-stack-underflow-in-phar)をチェリピ

## carusogabriel: Fix tests in some builds
- https://github.com/php/php-src/commit/4fcaebbab82ea5fb66393bdbb5a4d0d57678aaee
- EXPECTREGEX が =DONE= を食ってしまう？のを修正
- すぐ後のコミットでなかったことになる

## carusogabriel: Revert changes in test file
- https://github.com/php/php-src/commit/6dd9fad0c0d388721a3c15c4d3f180f8539447d0
- Windows でだけ流れるべきテストを Linux でも動かそうとしていたのが間違いだったので修正
React+redux-form+styled-componentsのFieldをblurする

# inputをblurする

htmlのinputフォームからフォーカスを外したいときは、blur()を呼び出す。

``` html
<input id="id" type="text" />
```
``` js
document.getElementById("id").blur();
```

# Reactのinputをblurする

reactでglobal変数のwindow.documentは呼びたくないので、React.createRef()を使う。

```react
class BlurTextInput extends React.Component {
  constructor(props) {
    super(props);
    this.textInput = React.createRef();
    this.blurTextInput = this.blurTextInput.bind(this);
  }

  blurTextInput() {
    this.textInput.current.blur();
  }

  render() {
    return (
      <div>
        <input
          type="text"
          ref={this.textInput} />
        <input
          type="button"
          value="Blur the text input"
          onClick={this.blurTextInput}
        />
      </div>
    );
  }
}
```

参考：https://reactjs.org/docs/refs-and-the-dom.html

# redux-formのFieldをblurする

`withRef` を書く。


```react
import { Field } from "redux-form"

class BlurTextInputWithReduxForm extends React.Component {
  constructor(props) {
    super(props);
    this.textInput = React.createRef();
    this.blurTextInput = this.blurTextInput.bind(this);
  }

  blurTextInput() {
    this.textInput.current.blur();
  }

  render() {
    return (
      <div>
        <Field
          type="text"
          ref={this.textInput} 
          withRef
        />
        <input
          type="button"
          value="Blur the text input"
          onClick={this.blurTextInput}
        />
      </div>
    );
  }
}
```

参考：https://redux-form.com/7.3.0/docs/api/field.md/#-code-withref-boolean-code-optional-


# styled-componentsでstyleしたredux-formのFieldをblurする

`innerRef`で指定するとrefを取得できる。
refから`getRenderedComponent()`でDOMを取得して、blurする。

```react
import { Field } from "redux-form"

class BlurTextInputWithReduxFormOfStyledComponents extends React.Component {
  constructor(props) {
    super(props);
    this.textInput = React.createRef();
    this.blurTextInput = this.blurTextInput.bind(this);
  }

  blurTextInput() {
    const inputRefCurrent = this.textInput.current;
    if (inputRefCurrent) {
      inputRefCurrent.getRenderedComponent().blur();
    }

  }

  render() {
    return (
      <div>
        <StyledField
          type="text"
          innerRef={this.textInput} 
          withRef
        />
        <input
          type="button"
          value="Blur the text input"
          onClick={this.blurTextInput}
        />
      </div>
    );
  }
}

const StyledField = styled(Field)`
  border: none;
  flex: 1 0 auto;
  margin: 5px;
  font-size: 17px;
  outline: none;
  height: 30px;
  width: 100%;
`;

```

参考：https://www.styled-components.com/docs/advanced#refs
AWS EC2 WindowsインスタンスにEBSを接続したらdiskmgmt.mscで初期化できなかったときの解決策

俺です。

WindowsインスタンスへEBSをD drive用として接続したのにdiskmgmt.mscで閲覧すると
管理者によりオフラインにされています。操作できません。
のようなエラーが出たときの対応です。
管理者is俺なのにわらう。


# Edition

鯖: Windows 2016 Datacenter


# 答え

[コレ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ebs-using-volumes.html)

```
select disk 1 
attributes disk clear readonly 
online disk 
convert mbr 
create partition primary 
format quick fs=ntfs label="volume_label" 
assign letter="drive_letter"
```

頭パンパンウーマンだよぉ

完
いま

# Angular
https://ryotah.hatenablog.com/entry/2017/08/27/170234


## ng-templateやngTemplateOutlet関連

- https://blog.lacolaco.net/post/ng4-feature-ngif/

ng-templateはTemplateRef型として取得できるため、取得した変数をngTemplateOutletに与えることができる。

# Tutorial

1. `ng new myMdb --style=scss`
  - Angularのプロジェクトのテンプレートが生成される。
  
2. `cd your-angular-project`
3. `npm i angular-bootstrap-md --save`
  - MDBのパッケージ情報がpackage.jsonに追加される
  - 追加される内容→`"angular-bootstrap-md": "^6.2.2",`
4. MDBのモジュールをインポートする
1. `npm install -–save chart.js@2.5.0 @types/chart.js @types/chart.js font-awesome hammerjs angular5-csv`を実行する。
2. `npm start`コマンドを実行し、サーバを開始する。
3. ブラウザからlocalhost:4200にアクセスする

## MDBのモジュールをインポート

```diff:app.module.ts
import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
+import { MDBBootstrapModule } from 'angular-bootstrap-md';

@NgModule({
    imports: [
+        MDBBootstrapModule.forRoot()
    ],
    schemas: [ NO_ERRORS_SCHEMA ]
});
```

# 便利そうなライブラリ

## classlist.js

昔からあるJavaScriptのライブラリ。

- https://www.npmjs.com/package/classlist.js

CSSのクラスを操作するメソッドを提供する。

## easy-pie-chart

## fs-extra

ファイルシステムの操作を便利に行うライブラリ。
ファイルのコピーや作成を再帰的に行うなどの機能が充実している。

- [使い方紹介](http://sourcechord.hatenablog.com/entry/2016/01/16/003438)

## screenfull

- https://www.npmjs.com/package/screenfull

<!--

# 画面構成（画面状態遷移図）

- ダッシュボード画面 (スタート画面)
   - /dashboard
   - TRNS_Dashboard
- ラベルエクスプローラ画面
   - /label-explorer
   - TRNS_LabelExplorer
- カテゴリエクスプローラ画面
   - /category-explorer
   - TRNS_CategoryExplorer
- プレビュー画面
   - /preview
   - TRNS_Preview

現時点では、戻る遷移は状態遷移図に記載しない。

## ネストの表記方法
ネストでの親子関係は、親画面を表示したまま小画面を表示するためのものであるため、
今回の画面構成では、そのような表示箇所がないため使用しない。

# 各画面別インターフェース

戻る遷移は記載しない。

## ダッシュボード画面

## ラベルエクスプローラー画面

## カテゴリエクスプローラ画面
- コンテント詳細表示
   - 選択したコンテントを表示するプレビュー画面へ切り替える。
   - 画面遷移メッセージはBSS内で発行する。

## プレビュー画面

ナビゲーション系API
- 次画像遷移
   - ナビゲーションリストの現在表示位置の次の画像を表示する。
   - 注意: ナビゲーションリストや現在表示位置といった情報は、BSSで管理する。
- 前画像遷移

その他
- 拡大縮小
    - API不要
画面遷移系
ビュー主体の遷移を行う場合は、ここに遷移アクションを定義する。
わかりやすいよう、ビューからの遷移は「アクション(ACT)→遷移(TRNS)」となるようにする。
※遷移(TRNS)はBSS内で発行するイベント

- ダッシュボード画面遷移アクション
 
-->