OmniAICreator/Qiita-1.07M huggingface dataset:
Google Colaboratoryが、3D CGレンダリング用途にも有能すぎた件

[Colaboratory](https://colab.research.google.com/)は、Googleが機械学習の教育・研究用途に無償提供していることでお馴染みのWebサービスですが、その素晴らしい計算機パワーが生かせるのは機械学習だけとは限りません。
論より証拠。以下はColaboratory上のBlenderでレンダリングした1920*1080の出力結果です（注：モデルは[Blender公式サイト](https://www.blender.org/download/demo-files/)で公開されており、CC0ライセンスに準拠しています）
![eeca7a5c-dcbc-4fe8-880a-19b8381eecd1.png](https://qiita-image-store.s3.amazonaws.com/0/31788/98bb39ff-8676-4cd7-cc0c-5aff5028fdc9.png)

この1枚のレンダリングに要した時間は28秒。実際のJupyterサンプルは[こちらで公開しております](https://colab.research.google.com/drive/1F1Yip4NwqJfuAZdahzLnAeeClmLQ_TWj)ので、今すぐに試すことができます。

サンプルにもありますが、Colaboratory上でのblenderのインストールは以下のコマンドになります。aptコマンド一発でいけるのが素晴らしいですね。

```
!apt install blender libboost-all-dev libgl1-mesa-dev
```
そして、Blenderのバックグラウンドモードを用いた実行スクリプトは以下のようになります。Eオプションでレンダラを指定しており、ここを"CYCLES"にするとPath Tracingに切り替わります。

```
!blender -b BMW27GE.blend -noaudio -o ./test_ -E BLENDER_RENDER-x 1 -f 1
```
なお、Blender自体はPythonコードで自動制御出来るのですが、残念ながらその制御モジュールである[blenderpy](https://github.com/TylerGubala/blenderpy)がColabにインストールできませんでした。インストールに用いたコマンドは下記のとおりです。

```
!pip install bpy
```
よくREADMEを読むと、Windowsのみの対応だとか。

>I have not tested this for platforms other than Windows at the moment. More to come soon.

もしblenderpyが正しくインストールされれば、GPUレンダリングの検証などが出来ただけに残念です。もし代替案をご存知の方がいましたら、ご教授頂けると嬉しいです。

---
またColabでは、OpenGL ESによるGPUレンダリングも実は可能です。[Pyrender](https://github.com/mmatl/pyrender)をインストールすると、Pythonのみでモデルの読み込みから描画まで記述できます。

```
!pip install pyrender
```
glb(glTFのバイナリフォーマット）形式のファイルを読み込んで、[Pyrender](https://github.com/mmatl/pyrender)で表示する[Jupyterサンプルを公開しました](https://colab.research.google.com/drive/1jPg6FqhA3d_RqOxhu46gP9UzYmB3geAI)。サンプルコードを以下に抜粋しておきます。こちらはGPUだけに瞬時に描画出来ています。

```python

# Render offscreen -- make sure to set the PyOpenGL platform
import os
os.environ["PYOPENGL_PLATFORM"] = "egl"
import numpy as np
import trimesh
import pyrender

# Load the FUZE bottle trimesh and put it in a scene
tri_scene = trimesh.load('pyrender/examples/models/WaterBottle.glb')
scene = pyrender.Scene.from_trimesh_scene(tri_scene)


# Set up the camera -- z-axis away from the scene, x-axis right, y-axis up
camera = pyrender.PerspectiveCamera(yfov=np.pi / 6.0)
s = np.sqrt(2)/2
camera_pose = np.array([
       [0.0, -s,   s,   0.3],
       [1.0,  0.0, 0.0, 0.0],
       [0.0,  s,   s,   0.35],
       [0.0,  0.0, 0.0, 1.0],
    ])
scene.add(camera, pose=camera_pose)

# Set up the light -- a single spot light in the same spot as the camera
light = pyrender.SpotLight(color=np.ones(3), intensity=3.0,
                               innerConeAngle=np.pi/16.0)
scene.add(light, pose=camera_pose)

# Render the scene
r = pyrender.OffscreenRenderer(640*2, 480*2)
color, depth = r.render(scene)

# Show the images
import matplotlib.pyplot as plt
plt.figure(figsize=(16, 12))
plt.axis('off')
plt.imshow(color)
```

Colaboratory、まさかBlenderが普通に動くとは思っていなかったので、びっくりです。他にもいろんな可能性がありそうですね。
Java入門～Progateより基本を紹介～

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている@yuka_ponです。

[HackerRank](https://www.hackerrank.com)でどの言語にするか迷っているときに知った、Java。
世界でよく使われている言語で、処理速度が速いことが特徴的です。
実際に学んでみたら、たくさんの便利なコードや型がありました。

今回は、[Progate](https://prog-8.com)をもとに、Java入門の基本をご紹介します。


#Javaの基本
Javaは、**コンソール**という画面で処理結果が表示されます。
**System.out.println();**を使って、コンソールに表示します。
括弧の中を表示するように命令する働きを持ち、文字列は「”（ダブルクォーテーション）」で囲んで命令を出します。
数列のときは必要ありません。
また、文末は「；（セミコロン）」を付けます。

##文字列の連結
Javaは、足し算を使って文字列を表せます。
これを、**文字列の連結**と呼びます。

これは、次のように表せます。

``` Java 
class Main {
  public static void main(String[] args) {
    // "おはよう"と"山口さん"を連結して出力してください
    System.out.println("おはよう" + "山口さん");
```
このように記載すれば、「おはよう山口さん」と表示されます。

#変数について
Javaでも、変数を用いて文字列などを定義付けられます。

##データ型
**データ型**とは、文字列や数値などのような値を指します。
また、変数を用いる場合は次のように表します。

```java
String name = "山口";  //文字列を使うときはString型を使用//
int age = 15;   //数値を使うときはint型を使用//
double height = 150  //小数を使うときはdouble型を使用//


System.out.println(name);  //「山口」と表示//  
System.out.println(age);   //「15」と表示//
System.out.println(height);   //「150」と表示//
```

##型変換
Javaは、型を自動または手動で変換できます。
自動で変換する**自動型変換**では、例えば、int型とdouble型を計算するとdouble型になります。
一方、**強制型変換**と呼ばれるものもあります。
これは、int型同士の割り算をして答えが小数になる場合、int型ではなくdouble型に強制に変換することを言います。

強制型変換は、次のように表します。

```java
class Main {
  public static void main(String[] args) {
    int number1 = 3;
    int number2 = 2;
   
    System.out.println((double)number1 / number2);
    
  }
}

```
binding.pryでデバッグする

binding.pryのGemをインストール
---

```ruby:Gemfile
group :development do
  gem 'pry-rails'
  gem 'pry'
end
```
bundle installを実行する。

```
$ bundle install
```

コンソールを立ち上げる。

```
$ rails c
```

デバックしたいブレークポイントに**binding.pry**と書く。
viewの場合は、**<% binding.pry %>**

サーバーを起動し、ブレイクポイントを設定したアクションに遷移するとコンソールがとまる。

binding.pryから抜ける
---

```
[1] pry(Hoge)> exit
```
binding.pryから強制的に抜ける
---
プロセスを終了してしまうため、rails sが落ちる。

```
[2] pry(Hoge)> exit!
```

```
[３] pry(Hoge)> !!!
```
Pythonのリスト内包表記のアルゴリズム

こちらはPythonのリスト内包表記が100倍楽しくなる記事です。

さて、Pythonを使っていてリスト内包表記が出てくると初めはとても戸惑うかもしれません。
しかし、なんら臆することはありません。よく見てみたらそれはただの見慣れたネスト文なのです。


# リスト内包表記とは
リスト内包表記とは、`for`文や`if`を使ってある条件のリストのみを取りだしたい場合に使える記述方法のことです。

たとえば、偶数のみの配列をつくりたい場合、人々はズル賢いので`Numpy`の`arange()`メソッドを思い浮かぶかもしれませんがこれだと`list`型を受け取ることができません。
これを純粋なPythonのみで記述しようとすると一気に知能レベルが低下し

```Python
even_numbers = []
for i in range(10):
    if i % 2 == 0:
        even_numbers.append(i)
```

とするでしょう。しかし、人間は学習能力を持ちます。もしかしたらPython特有の<b>リスト内包表記</b>の存在に気づくかもしれません。

```Python
even_numbers = [number for number in range(10) if number % 2 == 0]
```

と一行で記述することができます。

Swiftとかにも<b>三項演算子</b>なんかがありますが、Pythonのすごいところはここから。
<br>

たとえば、こんな二重`for`文は

```Python
years = [2016, 2017, 2018, 2019]
months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

calendar = []
for year in years:
    for month in months:
        calendar.append(f'{year}年{month}月')
```

<br>
リスト内包表記だと

```Python
calendar = [f'{year}年{month}月' for year in years for month in months]
```

こんな感じで一行で書けます。
単に`append()`を先に書くか後に書くかの違いですがこれは動的な型付け言語だからこそ成り立っています。


# リスト内包表記のアルゴリズム

それでは本題に入っていきます。


まず、こんなデータを想定します。
説明のためシンプルにしましたが本来は同一の`key`が複数あることを想像しておいてください。

![json_exp.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/243995/0ad345f3-c869-e4f2-2059-d11b98d89dac.jpeg)

これをjson形式に表すとこんな感じです

```Python
users = {1: {1: "jiro", 2: "goro"}, 2: "aya"}
```
<br>


そして、たとえば、`"goro"`にあたる`value`を取り出す場合、その取りだしたい`"goro"`が複数あることを想定すると以下のように`for`文で記述しますね。

```Python
user = []
for a, b in users.items():
    if a == 1:
        for c, d in b.items():
            if c == 2:
                user.append(d)
```
<br>

一文字変数なんで読みづらいですが抽象化のためなので悪しからず。
こうすると、人々の認識通り、上の`for`から順番に下に降りてきて`"goro"`に辿りつきます。


![Untitled.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/243995/0913b89a-1226-b0a1-e760-3d482946990a.jpeg)


これをリスト内包表記で記述したい場合、

```Python
user = [d for a, b in users.items() if a == 1 for c, d in b.items() if c == 2]
```

となります。本当に`append()`が後か先かだけです。


他の記事で
>外側の`for`文を後ろに書く

という表記をよく見かけますが、これは危険です。
なぜなら結局リスト内包表記も`for`文と同じで記述した順に探索していくからです。
特に今回のようなループしたい変数が上から下に降りてくるようなネストでは記述の順番を変えてしまうと定義前となってしまう可能性が高いです。

これをリスト内包表記で書くと

```Python
user = [d for c, d in b.items() if c == 2 for a, b in users.items() if a == 1]
```

<br>
当たり前ですがこういったエラーが発生します

```Python
'str' object has no attribute 'items'
```
<br>

この場合、データの深度がバラバラなためまずまず探索ができませんというエラーを返します。

しかし、このように深度を揃えたとしても

```Python
users = {1: {1: "jiro", 2: "goro"}, 2: {1: "aya"}}
```
深度を遡って探索することになり、未定義エラーが発生します。

```Python
b is not defined
```

![Untitled.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/243995/d18cbbb5-e963-8e41-8670-71f97eb1dafb.jpeg)


なので、<a href="https://docs.python.org/ja/3/tutorial/datastructures.html">公式ドキュメント</a>にも記載してある通り、リスト内包表記は通常のfor文と同じ順番で`append()`のみを先頭に持ってくる感じで書きましょう。

さしづめ後置`for`文といったところでしょう。

# まとめ

つまり、リスト内包表記に通常の`for`文とのアルゴリズムの差異はありません。
リスト内包表記が高速だと言われているのは初めから変数に内包しているためと、そうすることで`append()`を呼び出す必要がなくなるからでしょう。
JavaでPOSTした結果を取得する

##背景
JavaからWebサイトにデータをPOSTし、結果を取得したい場合のメモです。
今回はヤマト運輸の[荷物問い合わせシステム](https://toi.kuronekoyamato.co.jp/cgi-bin/tneko)に伝票番号をPOSTし、問い合わせ結果を取得します。

##準備
荷物問い合わせシステムのソースからPOSTするデータのname属性を調べます。

```ruby:view-source
 <td align="left">詳細情報　
  <input type="radio" name="number00" value="1" checked>あり
  <input type="radio" name="number00" value="2">なし
 </td>
・・・省略・・・
<td class="input">
  <input name="number01" size="20" maxlength="14">
 </td>
```

ソースから詳細情報を 表示する/表示しない を選択するラジオボタンの名前が number00
伝票番号を入力するテキストボックスの名前が number01 ~ number10 であることが分かります。

##問い合わせ結果の取得
以下のコードで取得を行います。

```ruby:Post.java
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class Post {
	public String getResultPage(String postData, String postURL){
		try{
			String data = postData;
			URL url = new URL(postURL);
			HttpURLConnection uc = (HttpURLConnection)url.openConnection();
			uc.setDoOutput(true); //生成したURL接続からOutputStreamを取得するためのフラグを立てる
			uc.setRequestMethod("POST");
			OutputStream os = uc.getOutputStream();
			os.write(data.getBytes());
			os.flush();
			os.close();
			InputStream is = uc.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(is,"Shift_JIS"));
			String line;
			StringBuffer buf = new StringBuffer();
			while((line = reader.readLine()) != null){
				buf.append(line + "\n");
			}
			is.close();
			uc.disconnect();
			return buf.toString();
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	public static void main(String[] args) {
		String url = "https://toi.kuronekoyamato.co.jp/cgi-bin/tneko";
		String query = "number00=1&number01=伝票番号"; //※データをPOSTする際は name=value&name=value... という形式になる
		System.out.println(new Post().getResultPage(query,url));
	}

}
```

##実行結果
POSTした結果が出力されます

```ruby:
・・・省略・・・
 <table class="meisai">
<tr>
 <th width="55"><br></th>
 <th>荷物状況</th>
 <th>日 付</th>
 <th>時 刻</th>
 <th>担当店名</th>
 <th>担当店コード</th>
</tr>
<tr class="odd">
 <td class="image"><img src="/images/ya_02.gif" alt="経過"></td>
 <td>発送</td>
 <td>02/21</td>
 <td>13:47</td>
 <td><a href="http://sneko2.kuronekoyamato.co.jp/sneko2/Sngp?ID=NET_C&JC=031902&DN=&MD=&F=2" target="_blank">東京法人営業支店</a></td>
 <td>031902</td>
</tr>
<tr class="even">
 <td class="image"><img src="/images/ya_02.gif" alt="経過"></td>
 <td>配達予定</td>
 <td>02/22</td>
 <td>12:30</td>
 <td>最寄りの営業所</td>
 <td>最寄りの営業所のセンターコード</td>
</tr>
<tr class="odd">
 <td class="image"><img src="/images/ya_02.gif" alt="経過"></td>
 <td>配達予定</td>
 <td>02/22</td>
 <td>17:37</td>
 <td>最寄りの営業所</td>
 <td>最寄りの営業所のセンターコード</td>
</tr>
<tr class="even">
 <td class="image"><img src="/images/nimotsu_01.gif" alt="最新"></td>
 <td>配達完了</td>
 <td>02/22</td>
 <td>19:11</td>
 <td><a href="最寄りの営業所へのリンク" target="_blank">最寄りの営業所</a></td>
 <td>最寄りの営業所のセンターコード</td>
</tr>
</table>
・・・省略・・・
```

以上です。
TOEIC285学生のためのAtCoder備忘録

<h1>AtCoderのコンテストに参加してきました。</h1>

１か月前くらいに登録はしたものの、使い方がいまいち分からず放置していたAtCoderのコンテストに初参加してきました。
はじめに、AtCoderコンテストに参加するきっかけを作ってくださったフォロワーさんに感謝申し上げます。
![c8cfcb35c76ca5fc55fc2dc680685e8c_400x400.png](https://qiita-image-store.s3.amazonaws.com/0/364635/93c5ac70-d5c3-0064-2831-349b994bc479.png)
<h3>AtCoderとはなんぞやね？</h3>


**[AtCoder][1]** とは、AtCoder社が主催するプログラミングコンテストサイトです。
オンラインだからネット環境さえあればどこからでも参加できます。
~~まあ、我が家は光回線にも関わらずネット回線が度々切れては同期するかのように誰かがキレるわけですが...~~

ロゴカッコいいですよね、AtCoder社は日本企業ですがコンテストには様々な国の人が参加しています。
コンテストに参加することでランキングに参加できるので自分の実力が分かりやすいのが特徴です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/364635/e8ea0260-a95b-50d3-7430-c777255e640a.png)
<h3>で、早速コンテストに参加してみた</h3>
毎週末に開催される**AtCoder Beginner Contest**という初心者向けのコンテストに参加してみました。
コンテストが始まるまでに参加登録ボタンを押すだけで参加申し込みができます。
なんと参加費用は無料、ありがたい限りです。

今回のコンテストは100分間で4問を解くというもの。プログラム言語の選択は幅広く
よほど~~へんちくりん~~マイナーな言語でなければあるかと思います。

私は今回は「C言語」を用いて参加しました。

<h3>Twitterでフォロワーさんが余裕って言ってたからなんとか解けるやろ</h3>

~~なんて思ってた時期が私にもありました。はい、ついさっきまで~~
読者のみなさまは大丈夫かと思いますが私にとってはとても難しいものでした..........
やはりフォロワーさんは凄い人たちばかりだと痛感しました。
同時に、多数のエンジニア、またエンジニアの卵が同じ課題に取り組んでいると考えると
ランキング機能もあってか、勝負心が芽生えて私としては凄くプラスな経験になりました。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/364635/933b86c6-b946-b35d-5321-34167ec14c53.png)

コンテストが終わってしばらくするとスコアが反映され自分の立ち位置が確認できます。
レーティングを上げていくとランクが灰色から茶色、緑、水色とあがっていくようです。
私は、就職活動と並行してまずはQiitaカラーでもある緑色を目指そうと思います。

次回のコンテストは...~~はやいなだ~~...じゃなくて、わせd...早稲田大学のプログラミングコンテストがあるようで楽しみです。


ご愛読いただきましてありがとうございました。





[1]:https://atcoder.jp/
hamlでの属性の書き方

Hamlで属性を書く時にHashのキーをシンボルにする場合、
-(ハイフン)が使えないという欠点がある。

```
%span{data-hogehoge: 'mokemoke'}
%span{:data-hogehoge => ‘mokemoke'}
```

とかは、エラーになる。

```
%span{"data-hogehoge": 'mokemoke'}
%span{:"data-hogehoge" => 'mokemoke'}
```

これでも構わないが、もっと綺麗に書くなら
ハッシュを階層化することも可能で
Haml側では自動的に「-」区切りしてくれるようになっている。

```
%span{ data: { hogehoge: 'mokemoke' } }
%span{ :data => { :hogehoge => 'mokemoke' } }
```

のように指定することができます。
ちなみにこれは、dataだけが特別なのではなく、
属性として指定するHashの階層は、ハイフンで繋げられる。

```
%span{ fuga: {hoge: { piyo: 'mokemoke' } } }
```

この場合、fuga-hoge-piyo = 'mokemoke'という属性が指定される。
特に、カスタムデータを複数指定したい場合が以下のように記述できるため、
よりスマートに記述することが可能。

```
%span{"data-hoge": 'data1' , "data-fuga": 'data2' , "data-piyo": 'data3'}
```

上記が、

```
%span{ data: { hoge: 'data1', fuga: 'data2', piyo: 'data3'} }
```

こんな風に記述できて、どちらも以下のような変換結果になる。

```
<span data-fuga="data2" data-hoge="data1" data-piyo="data3"></span>
```
ESP32 DevKitCにDHT11つけてみた

# ESP32 DevKitCにDHT11つけてみた

ESP32搭載のマイコン開発ボードに、温湿度センサーであるDHT11をつけました。
取り付け方などは以下のサイトを参考にさせてもらいました。
[esp-wroom-02 で温湿度計dht11を使ってみた](http://www.shangtian.tokyo/entry/2017/06/15/213901)


# DHTライブラリの取得の仕方
過去については知りませんが、現在ではArduinoのメューバーより
スケッチ>ライブラリのインクルード>ライブラリを管理
より「DHT」と検索すればライブラリのインストールができるようになります。


# エラー
簡単にできると思っていましたが、コンパイル時に以下のエラーが出ました

```bash
In file included from C:\Users\ユーザー名\Documents\Arduino\libraries\DHT_sensor_library\DHT_U.cpp:22:0:

C:\Users\ユーザー名\Documents\Arduino\libraries\DHT_sensor_library\DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory

compilation terminated.
```

Adafruit_Sensor.hがない、と言われてます。

よく見たらreadme.mdに、以下のライブラリをインストールしろと書いてあった。
ということで以下からライブラリをダウンロードしてきて、librariesフォルダに突っ込みましょう

[Adafruit Unified Sensor Library](https://github.com/adafruit/Adafruit_Sensor)

Windows10の場合は以下のパスになります。
C:\Users\ユーザー名\Documents\Arduino\libraries\


# スケッチの一例
以下がDHT11を使ったスケッチの一例です。


```c++
#include <DHT.h>

const int PIN_DHT = 4;
DHT dht(PIN_DHT,DHT11);

void setup() {
  Serial.begin(9600);
  Serial.println("DHT11");
  dht.begin();
}

void loop(){

  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
    return;
  } else {
    Serial.print("Humidity:");
    Serial.print(h);
    Serial.print("%\t");
    Serial.print("Temperature:");
    Serial.print(t);
    Serial.println("*C");
  }

  delay(3000);
}
```
Terraformインストール

## 環境
- AmazonLinux2

## 手順
1. ダウンロードしたいバージョンを確認
    https://releases.hashicorp.com/terraform/

2. Terraformダウンロード（2019年3月10日時点の最新バージョンは0.11.12）

    ```
    wget https://releases.hashicorp.com/terraform/0.11.12/terraform_0.11.12_linux_amd64.zip
    ```

3. 解凍

    ```
    unzip terraform_0.11.12_linux_amd64.zip
    ```

4. パスを通す

    ```
    sudo mv terraform /usr/bin
    ```
Vim の "make test" を読み解く 第 3 回 (src/testdir/README.txt)

[前回](https://qiita.com/mnishz/items/f0c389d2fa1e0e4b67bb) では、src/testdir/Makefile の中身を読んで、個々のテストがどのように開始されるのかまで理解しました。今回はそのテストの詳細に入っていこうかと思っていたのですが、その前に src/testdir/README.txt の内容を理解しておこうと思います。

> このディレクトリは Vim の様々な機能のテストを含んでいます。インデントスクリプトのテストについては runtime/indent/testdir/README.txt を参照してください。
> 
> もし意味が通るなら、新しいテストメソッドは既に存在しているファイルに追加してください。コメント行を付けて、その他のテストから分けるのが良いでしょう。
> 
> 数字付きのテストは古いもので、名前付きのテストに切り替わっています。数字付きのテストにはこれ以上追加しないでください。
> 
> それから、Vim script である新しいスタイルのテストと、 ノーマルモードコマンドを使う古いスタイルのテストを選択することができます。可能であれば新しいスタイルのテストを使ってください。+eval 機能なしで実行する必要があるときに古いスタイルのテストを使用します。
> 
> 
> 新しいスタイルのテストを追加する:
> 
> 1) test_\<subject>.vim というファイルを作成します。
> 2) Make_all.mak 内の NEW_TESTS_RES に、test_\<subject>.vim をアルファベット順で追加します。
> 3) Make_all.mak 内の NEW_TESTS にも "test_\<subject>" というエントリを追加します。
> 4) 単体のテストを走らせるには "make test_\<subject>" を実行します。
> 
> 2) においてテストを個々に実行する代わりに、"test_alot" に含めることができます。副作用のない素早いテストにはこれを使ってください。1 つの Vim のインスタンスがたくさんのテストを実行し、都度 Vim を開始する必要がないので幾分早いです。
> 
> 
> 使用できるもの (例については test_assert.vim を参照):
> 
> - assert_equal(), assert_true(), assert_false(), その他の呼び出し。
> 
> - 期待するエラーに対しては assert_fails() を使用します。
> 
> - 例外がテストを中止することを防ぐには try/catch を使用します。
> 
> - メモリ割り当てを失敗させるには alloc_fail() を使用します。これによりメモリ割り当ての失敗が適切に取り扱われるか確認することができます。割り当ての ID を加えるためにソースコードを変更する必要があります。alloc_id() の上にある LAST_ID_USED を使用されている最も大きい ID に更新してください。

(↑の節の内容が古くなっているようです。PR 出そうかな。 -> [b45125b](https://github.com/vim/vim/commit/b45125b374cc3a1cef176b704f518c72c518f24c) で拾ってもらえました。)

> - 例えば、char_avail() がしばらく FALSE を返さなければならないなどのように Vim の振る舞いを変えたい場合、test_override() を使用します。CursorMovedI 自動コマンドを起こしたい場合などの例として、test_cursor_func.vim を参照してください。
> 
> - テスト内にまだ直されていないバグがある場合、これが正しく動くべきということを明確にするために "Skipped" という文字列付きで例外を投げることができます。
> 
> - さらなるヘルプについては runtest.vim の先頭を参照してください。
> 
> 
> 画面ダンプテストを追加する:
> 
> 新しいスタイルのテストを書くのとほとんど同じです。加えて、"terminal-dumptest" のヘルプを見てください。照合するダンプを "dumps/Test_func_name.dump" に置いてください。
> 
> 
> 古いスタイルのテストを追加する:
> 
> 1) test_\<subject>.in および test_\<subject>.ok というファイルを作成します。
> 2) Make_all.mak 内の SCRIPTS_ALL に、test_\<subject>.out をアルファベット順で追加します。
> 3) src/testdir/ で単体のテストを走らせるには "make test_\<subject>.out" を実行します。src/ で単体のテストを走らせるには "make test_\<subject>" を実行します。
> 4) src/Makefile にもエントリを追加します。
> 
> これらのファイルはすべてがタイプされたように使用されることに留意してください:
>
> - コメントを加えるには :" (Ex コマンドのコメントです) を使用します。
> - 改行はエンターを押したように働きます。最後の行でそれが起きた場合、ビープ音が聞こえるでしょう。
PythonでPCが無音状態になったらなんか処理する

#はじめに
なんだかんだあって大変な悲劇が起き、二度目はなんとかして防がねばと書いてみたものをついでにQiitaに投げてみます。初投稿です。

#なにするの？
パソコンが一定時間音を出さなかったらなにか処理します。
今回はpyautoguiを使ってf5キー押してブラウザを力技でリロードします。
ステレオミキサー使うのでとりあえずwindowsでしか動きません。

#参考
[Pythonで音を監視して一定以上の音量を録音する](https://qiita.com/mix_dvd/items/dc53926b83a9529876f7)
(メインのコードはほぼほぼここを参考にさせてもらいました……)

#やること
ステレオミキサーを有効化してパソコンの出力音をパソコンに入力する
↓
pyaudioで音を拾う
↓
音がしばらく切れたらなんやかんやの処理をする

以上。シンプル。


#ステレオミキサーの有効化
ステレオミキサーを有効化するとパソコンが出す音を入力として拾えるようになります。
マイクの音とPCの音を同時に録音するためとかに使うらしいですね、そういう目的だと今はステレオミキサー使わなくていいみたいですけども。

コントロールパネル→ハードウェアとサウンド→サウンドの録音タブを右クリック、無効なデバイスの表示にチェック。
ステレオミキサーを規定のデバイスに設定。
realtekのドライバだと、更にPCにスピーカーなりイヤホン・ヘッドホンなり接続した後再生タブのrealtekのドライバのスピーカーを規定にしないとステレオミキサーに音が行きません。ちょっと引っかかった。

#Pythonのコード
pyaudioとかpyautoguiとかは適当にpipで入れます。

```
pip3 install pyaudio
pip3 install pyautogui
```

これが本体。

```python

import pyaudio
import pyautogui
import numpy

chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 48000

waitseconds = 5.0#待ち時間

p = pyaudio.PyAudio()

stream = p.open(format = FORMAT,
    channels = CHANNELS,
    rate = RATE, #サンプリングレート
    input = True,
    frames_per_buffer = chunk
)

cnt = 0

while True:
    data = stream.read(chunk)
    x = numpy.frombuffer(data, dtype="int16") / 32768.0
    if x.max() < 0.003:#音量、無音とみなす
        cnt += 1
    else:
        cnt = 0
    if cnt > waitseconds / (chunk / RATE): #chunk / RATEは一度に処理する時間、ここでは0.021秒くらい
        pyautogui.typewrite(['f5'])#f5入力
        cnt = 0

stream.close()
p.terminate()
```
x.max()の値はマイクオフにしてパソコンも完全に無音にしても何かを拾っているのか0にはならなかったので適宜調節。値も環境によると思います。
音とったりキーボードの入力飛ばしたり、微妙に面倒な予感がしていたけど想像以上にあっさり&短いコードでまとまりました。流石Python。
PythonでPDFのHTTPレスポンスからサムネイルを生成する ~ ImageMagickを使わない方法

# 概要
pdf2image(Poppler)を使ってPDFの1ページ目をもとにサムネイルを生成するプログラムを作りました。

# 実行環境
- Python 3.7.2 64bit
- MacOS Mojave 64bit

# 必要ライブラリ、アプリケーション
[pdf2image](https://pypi.org/project/pdf2image/) を使っているので、pdf2imageと[Poppler](https://poppler.freedesktop.org/)をインストールする必要がある。
ただし、Popplerのインストールには、Qtが必要ですが、CUIのみのLinux環境などではQtをインストールするのに一苦労します。なので、CUIのみのLinux環境の場合は、[ImageMagickを使う方法](https://qiita.com/tomtsutom0122/items/bb5acaee4f4f7820124c)をお勧めします。

```
$ brew install poppler
# pip install Pillow
# pip install pdf2image
```

# コード
```python
from PIL import Image
from io import BytesIO
from pdf2image import convert_from_bytes

def genThumb(response, thumb_width, thumb_height):
    # 高速化するために先頭ページのみ読み込む(最終ページを1ページ目にする)
    images = convert_from_bytes(response.read(), last_page=1)

    temp = BytesIO()

    # 解像度を落とし、ファイル形式をpngに変更する
    images[0].resize((thumb_width, thumb_height)).save(temp, format="png")

    return temp.getvalue()
```
AWS上のWindowsにiPhoneからリモートデスクトップで接続

#構成図

![zu.png](https://qiita-image-store.s3.amazonaws.com/0/256753/beab9da7-f6e6-7dcd-9d4d-36969623cc89.png)

#やったこと
1.AWSのチュートリアルに従いWindowsの仮装マシンを作成
【Windows 仮想マシンの起動】

2.iPhoneにリモートデスクトップアプリをインストール
「Microsoft リモート デスクトップ」を使用

3.接続
1.のチュートリアルで作成した仮装マシンの以下の情報で接続
・PC名
・ユーザ名
・パスワード
H2 Databaseにてデータベースが自動生成されないケースの対処法

#本来は自動生成されるはずが
devnoteなどなどによると、指定先にデータベースが存在しない場合は自動生成されることになっているらしい

[devnote H2 Database](https://devnote.jp/h2/)
>「JDBC URL」には、「jdbc:h2:」に続けて、接続するデータベース名を絶対パスで指定します。例えば、「C:¥data」フォルダにあるデータベース「example」に接続する場合は、「jdbc:h2:file:C:/data/example」と指定します。もし、指定したデータベースファイルが存在しない場合には、指定した場所に新しく作成されます。

私の環境ではうまく行かず。以下のエラーと共にデータベースの作成ができなかった![Screenshot_2019-03-10 H2コンソール.png](https://qiita-image-store.s3.amazonaws.com/0/374646/ba3b4932-7513-c459-60a4-91b691989c9c.png)

#インジケーターの「create new database」によって新規作成して解決
![クリップボード一時ファイル01.jpg](https://qiita-image-store.s3.amazonaws.com/0/374646/63c09fb4-e297-9d59-e298-af53091f7f13.jpeg)

インジケーターのアイコンを右クリック　→　create new databaseを選択。
データベース作成のウィンドウが表示されるから、任意のパスを入力して「Create」を選択。
![クリップボード一時ファイル01.jpg](https://qiita-image-store.s3.amazonaws.com/0/374646/9ddcb40f-9cbf-437e-12eb-33367534d97f.jpeg)

データベースが存在しない場合は、この手順で自動的に生成してくれた。

以降はdevnoteなどで紹介されている通り、Webブラウザからデータベースへアクセスできる。
vimのコメント入力を高速にするNERD Commenterを簡単に解説

## NERD Commenter

ファイルタイプを自動で判別してコメントの種類をあわせてくれるのがすごいvimプラグイン。
\<Leader\>に続いてccとか入力すればコメントアウトが簡単にできる。

\<Leader\>というのは...
>
\<Leader\> というマッピングには聞き覚えがない人も多いでしょうから、簡単に解説しておきます。<\Leader\> はプラグインやユーザ用に割り当てられたマッピングです。初期設定では、\<Leader\> はバックスラッシュに割り当てられています。しかしこのキーは押しにくいので ”,” にマッピングする人が多いようです。\<Leader\> に割り当てるキーを変更するには .vimrc 内で次のように設定します。
>
let mapleader = ','
ちなみに、\<Leader\> 以外にも \<LocalLeader\> というマッピングがあります。これはファイルタイプ固有のプラグインで利用されることが多いです。


ちなみに\<LocalLeader\>はvimの有名なlatexプラグインであるvimtexとかで出てきます。vimtexでも\<LocalLeader\>はデフォルトでバックスラッシュに割当てられています。

NERD Commenterのインストール方法は以下記事に譲ります。



▼ References

* [NERD Commenterでコメントアウト、アンコメントを楽にする \- Qiita](https://qiita.com/pepo/items/09bacf98a36f6a7285ac)
* [Vim のすゝめ \- コメントアウト \| 株式会社創夢 — SOUM/misc](https://www.soum.co.jp/misc/vim-no-susume/14/)

## よく使うコマンド
公式READMEにわかりやすくまとまってる。

[scrooloose/nerdcommenter: Vim plugin for intensely orgasmic commenting](https://github.com/scrooloose/nerdcommenter#default-mappings)

個人的には、今のところ以下の4つ使いこなせれば十分です。
ちなみに、visual選択してから打てば選択範囲に対して処理行うし、\<Leader\>の前に数字を打てば今の位置からその行数文に対して処理を行えます。

* \cc : コメントアウトする。
* \ci : 選択範囲のそれぞれの行のコメントの状態を切り替える。
* \cA : 行末にコメント追加。
* \cs : ブロックコメントを挿入する。ブロックコメントが存在しない言語の場合は各行に単一行コメントを挿入する。
CentOSのインストールメディアからyumする方法

##背景
インターネットに繋がっていないCentOSにnet-snmpをインストールしたいなと思っていたところ、以下のような方法があったのでメモ


##CentOS-Media.repoを有効化
enabled=0をコメントアウト

```ruby:
[root@test /]# vi /etc/yum.repos.d/CentOS-Media.repo
# CentOS-Media.repo
#
#  This repo can be used with mounted DVD media, verify the mount point for
#  CentOS-7.  You can use this repo and yum to install items directly off the
#  DVD ISO that we release.
#
# To use this repo, put in your DVD and use it with the other repos too:
#  yum --enablerepo=c7-media [command]
#
# or for ONLY the media repo, do this:
#
#  yum --disablerepo=\* --enablerepo=c7-media [command]

[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=1
#enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```

その他の.repoを/tmp等に一旦退避

```ruby:
[root@test yum.repos.d]# ll
合計 4
-rw-r--r--. 1 root root 631  3月 10 00:07 CentOS-Media.repo

```

##CentOSのメディアをマウント
CentOS-Media.repoに記載されているディレクトリを作成しメディアをマウント

```ruby:
[root@test /]# mkdir media/CentOS
[root@test /]# mount /dev/sr0 /media/CentOS
mount: /dev/sr0 is write-protected, mounting read-only
```


##net-snmpをインストール
メディアからnet-snmpをインストール

```ruby:
[root@test yum.repos.d]# yum install net-snmp net-snmp-utils
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * c7-media:
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ net-snmp.x86_64 1:5.7.2-32.el7 を インストール
--> 依存性の処理をしています: net-snmp-agent-libs = 1:5.7.2-32.el7 のパッケージ: 1:net-snmp-5.7.2-32.el7.x86_64
--> 依存性の処理をしています: libnetsnmptrapd.so.31()(64bit) のパッケージ: 1:net-snmp-5.7.2-32.el7.x86_64
--> 依存性の処理をしています: libnetsnmpmibs.so.31()(64bit) のパッケージ: 1:net-snmp-5.7.2-32.el7.x86_64
--> 依存性の処理をしています: libnetsnmpagent.so.31()(64bit) のパッケージ: 1:net-snmp-5.7.2-32.el7.x86_64
---> パッケージ net-snmp-utils.x86_64 1:5.7.2-32.el7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ net-snmp-agent-libs.x86_64 1:5.7.2-32.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

=======================================================================================
 Package                    アーキテクチャー
                                          バージョン             リポジトリー     容量
=======================================================================================
インストール中:
 net-snmp                   x86_64        1:5.7.2-32.el7         c7-media        330 k
 net-snmp-utils             x86_64        1:5.7.2-32.el7         c7-media        198 k
依存性関連でのインストールをします:
 net-snmp-agent-libs        x86_64        1:5.7.2-32.el7         c7-media        704 k

・・・省略・・・                       

完了しました!
[root@test yum.repos.d]# systemctl start snmpd
[root@test yum.repos.d]# snmpwalk -v 2c -c public localhost
SNMPv2-MIB::sysDescr.0 = STRING: Linux test 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (549) 0:00:05.49
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: test
・・・省略・・・ 
[root@test yum.repos.d]#
```

以上です。
VSCodeにAsciidoc執筆環境を構築する

# VSCodeにAsciidoc執筆環境を構築する
## 背景
今までドキュメントはMarkdownで作成していたのですが、もう少し自由度のあるドキュメントを作成したいと思い、Asciidocを採用することにしました。

## 環境
* OS:windows 10 pro
* VSCode:1.31.1

## 手順
### 1. Rubyのインストール
WindowsのRubyインストーラーを[ダウンロード](https://rubyinstaller.org/downloads/)し、インストールしてください。今回は、Ruby 2.6.1を採用しています。

```
$ ruby -v
ruby 2.6.1p33 (2019-01-30 revision 66950) [x64-mingw32]
```

### 2. asciidoctorとエクステンションのインストール
以下のコマンドを実行し、必要なパッケージをインストールします。

```
$ gem install asciidoctor
$ gem install asciidoctor-diagram
$ gem install --pre asciidoctor-pdf
```

### 3. VSCodeの`AsciiDoc`エクステンションを追加する
VSCodeの拡張機能で、`AsciiDoc`で検索するとできてきます。

<img width="598" alt="asciidoc.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/62976/8738aad9-94b1-3cc6-76f0-b341eb97e1ca.png">


### 4. VSCodeの設定を変更する
VSCodeのsetting.jsonに以下を追加します。

```
"AsciiDoc.use_asciidoctor_js": false,
"AsciiDoc.asciidoctor_command": "asciidoctor -a outdir=tmp -a imagesdir=tmp -a imagesoutdir=tmp -r asciidoctor-diagram -o-",
```

上記で環境構築完了です。

<img width="725" alt="プレビュー.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/62976/6c1789df-a648-a08c-2106-bebf0329ebcb.png">



## 参考にさせていただきました。ありがとうございます。
* [AsciiDoc + VSCodeでかっこいい文書作る](http://ai-gaminglife.hatenablog.com/entry/2018/11/13/232608)
ZendFrameworkで"Hello world"を表示するまで

かなりレガシーなPHPのフレームワーク
ZendFrameworkで"Hello world"を表示するまでの備忘録
（今の時代はLaravelだろ！！って声がありますが、仕方がないんです！
だって次に関わるアプリがZendで作られているから）


Zendをするにあたっての一番の壁は、何と言っても
有力なドキュメントが少ない！！！！

ここまで有力なドキュメントがないフレームワークも珍しい。。。


という事で、Hello worldを表示するまでを書いていきます！
（間違っていたらご指摘をお願いします。。。。）

かなり参考にした記事（これがないと上手くいかなかった気がする）
https://codezine.jp/article/detail/1824
https://ameblo.jp/mingw/entry-11125339748.html



PHPの強力な味方XAMPP
<a href="https://www.apachefriends.org/jp/index.html">XAMPPのページでインストールして下さい</a>

ZendFrameworkのデータをダウンロード
<a href="https://framework.zend.com/">ZendFramework公式</a>

今回は、ver1でやります（なぜなら、自分が関わる案件がver1のため 笑）
<a href="https://framework.zend.com/downloads/archives">ZendFramework アーカイブ</a>


ZendFrameworkのファイルをダウンロードしたら
libraryの配下にある「Zend」フォルダだけXAMPPのhtdocsに入れます

「Zend」フォルダ
<img src="https://scontent-nrt1-1.xx.fbcdn.net/v/t1.15752-9/53701955_2178538538873278_2062739021217398784_n.png?_nc_cat=102&_nc_ht=scontent-nrt1-1.xx&oh=a529e092594903b31cc802cb80e6e06d&oe=5D25245D">


「XAMPPのhtdocsにZendフォルダを格納」
<img src="https://scontent-nrt1-1.xx.fbcdn.net/v/t1.15752-9/53591742_373009043549006_8207647296809074688_n.png?_nc_cat=101&_nc_ht=scontent-nrt1-1.xx&oh=aa6703533b1452c0747d0324b189f7a2&oe=5D1DC4F8">


htdocs/Zendにindex.phpを作成し、下記のcodeを入力

```
<?php

// 必要なクラス定義を読み込む
require_once 'Zend/Controller/Front.php';

// アクションコントローラへ丸投げ
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory('application/controllers');
$front->dispatch();

?>

```



htdocs/Zend/Applicationに以下のフォルダを作成
controllers/
models/
views/
　└ scripts/
　　└ index/
　　　└ index.phtml


htdocs/Zend/Application/controllersに「IndexController.php」を作成し、下記のcodeを入力

```
<?php

require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action
{
  public function indexAction() 
  {

  }
}

?>

```


htdocs/Zend/Application/views/scripts/index/index.phtmlに下記のcodeを入力

```
<html>
  <body>
    Hello world!
  </body>
</html>

```

これで、Hello worldと出力される。。。
この設定が出来るまでに7時間はかかった気がする。。
Laravelより本当に難しい。。。
Google Formを事前入力された状態でリンクを渡す

Google Formはアンケートとかに便利ですが送る相手のターゲットが分かってるなら事前に入力しておけばユーザ側も労力が減るはず!(~~そもそもその部分いらねんじゃない？~~)

## 例
 同じフォームをイベントごとに使いまわす
 
 ↓URLから自動入力済みのForm
 
 [You Come From Github](https://docs.google.com/forms/d/e/1FAIpQLSdjIlKHkIijEiOQCeeOx1iIraojvDKadJ_V1Ue4i5eK_JGzpw/viewform?usp=pp_url&entry.574811788=Github)
 
 [You Come From Twitter](https://docs.google.com/forms/d/e/1FAIpQLSdjIlKHkIijEiOQCeeOx1iIraojvDKadJ_V1Ue4i5eK_JGzpw/viewform?usp=pp_url&entry.574811788=Twitter)
 
 利点:フォーム入力者が迷わないようにできる.
 
 
## How To Prefilled

1. Formを作成
2.  **事前入力したURLを取得** を選択
![setting.png](https://qiita-image-store.s3.amazonaws.com/0/150338/412d11f3-31bf-547a-8e46-a8130f0d8b5f.png)

3. 事前入力を行いURLを発行(リンクを取得)
4. 
![query.png](https://qiita-image-store.s3.amazonaws.com/0/150338/e8a6fec1-6907-6f52-3b08-ed76c94c5c6e.png)

 
## Shorten
 
 Link実際のリンクがどうなっているかというと 

> https://docs.google.com/forms/d/e/1FAIpQLSdjIlKHkIijEiOQCeeOx1iIraojvDKadJ_V1Ue4i5eK_JGzpw/viewform?usp=pp_url&entry.574811788=Github
 
 クエリが丸見えなのでgoo.glで短縮したいところだが
  > Starting March 30, 2018, we will be turning down support for goo.gl URL shortener. From April 13, 2018 only existing users will be able to create short links on the goo.gl console. You will be able to view your analytics data and download your short link information in csv format for up to one year, until March 30, 2019, when we will discontinue goo.gl. Previously created links will continue to redirect to their intended destination. Please see this blog post for more details.
  
  goo.glはそろそろ終了なので[Dynamic Link(Firebase)](https://firebase.google.com/support/guides/url-shortener?hl=ja)を使う.
  
#### Dynamic Linkを使用したリンク
  
 * [You Come From Github Short by Dynamic Link](https://ur15h7.page.link/4mGH)
 * [You Come From Twitter Short by Dynamic Link](https://ur15h7.page.link/4mTwi)
 
####  実際のリンク

 > https://ur15h7.page.link/4mGH
 
 > https://ur15h7.page.link/4mGH
 
 開発者側が設定できるのは `ur15h7`の部分と `page.link/` 配下の部分
 
 `page.link/` 配下がリンクごとに実際に違う部分.
任意で設定できるがAndroid用とかiOS用とか面倒なので自動で生成してくれた方がこの場合はいいかな.
 
 ![2019-03-09 23_59_05-ShortenURL – Dynamic Links – Firebase console.png](https://qiita-image-store.s3.amazonaws.com/0/150338/c78f2e66-7cfb-aa83-2227-a71c4f70d781.png)

 
###### かんそう
 page.linkよりもっと短くできなかったのか...  (そういうとこやぞ）
C++のclassとRustのstruct/implとを比較

# C++とRustとの実装比較

Rustにはクラスがないのですが、継承等を考えなければstructとimplで同じことができそうなので、試しに実装を比較してみました。

## C++ ver.

適当なクラス`MyStruct`を作って`main.cpp`から叩くだけ。また、結果を標準出力に書き出しますが、そのために`operator<<`を作っておきます。
ちなみに、名前空間`mystruct`をわざわざ使ってるのもRustとの比較のためです。

### メイン部分 (C++)

```cpp:main.cpp
#include "mystruct.h"
#include <iostream>
#include <string>

using mystruct::MyStruct;
using std::string;

int main() {
  const string name("hoge");
  constexpr unsigned char age = 8;
  MyStruct m(name, age);
  std::cout << "Hello, " << m << std::endl;
}
```

### MyStructのヘッダー (C++)
インクルードガードやnamespaceを入れると少しゴタゴタした感じの見た目になってしまいますね。

```cpp:mystruct.h
#ifndef _MYSTRUCT_H_
#define _MYSTRUCT_H_
#include <iostream>
#include <string>

namespace mystruct {

class MyStruct {
public:
  MyStruct() = delete;
  MyStruct(const std::string &, const unsigned char);

  friend std::ostream &operator<<(std::ostream &, const MyStruct &);

private:
  const std::string name;
  const unsigned char age;
};
} // namespace mystruct

#endif
```

### MyStructの実装 (C++)
`operator<<`の実装がダサい・・・。

```cpp:mistrust.cpp
#include "mystruct.h"

namespace mystruct {
using std::ostream;
using std::string;

MyStruct::MyStruct(const string &name, const unsigned char age)
    : name(name), age(age){};

ostream &operator<<(ostream &os, const MyStruct &m) {
  os << "(" << m.name << ", " << static_cast<unsigned int>(m.age) << ")";
  return os;
}

} // namespace mystruct
```

### コンパイルと実行 (C++)

```sh
$ c++ -std=c++14 -Wall -Wextra main.cpp mystruct.cpp -o a.out 
$ ./aout
Hello, (hoge, 8)
```

コードは[こちら](https://gist.github.com/dskkato/814e5685b61474342d5e30c9dfe2853b
)

## Rustのコード

`cargo`でプロジェクト作成して試してましたが、ここでは関連する最小限だけを抜き出してみます。

### メイン部分 (Rust)

```Rust:main.rs
mod mystruct;
use mystruct::MyStruct;

fn main() {
    let name = String::from("hoge");
    let age = 8;
    let m = MyStruct::new(&name, age);
    println!("Hello, {}", m);
}
```

### MyStructの実装 (Rust)

```Rust:mystruct.rs
use std::fmt;

pub struct MyStruct {
    name: String,
    age: u8,
}

impl fmt::Display for MyStruct {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "({}, {})", self.name, self.age)
    }
}

impl MyStruct {
    pub fn new(name: &String, age: u8) -> MyStruct {
        MyStruct {
            name: name.clone(),
            age,
        }
    }
}
```

### コンパイルと実行 (Rust)
比較のため、`cargo`の代わりに直接`rustc`を使っておきます。

```sh
$ rustic main.rs
$ ./a.out
Hello, (hoge, 8)
```

コンパイルのコマンド短い・・・。
Rustのコードは[こちら](https://github.com/dskkato/struct_example)

## 雑感
この例だと、Rustの手厚い言語仕様のサポートのおかげでとても楽に書けますね。コードが小さすぎてC++のお作法部分のゴタゴタが目立ってるだけかもしれませんが。

やっぱり比較できる程度に慣れてくると楽しいですね。今度はスマートポインターに相当する機能(BoxやらRcなど)を比べてみたいですね。
Ubuntu の OS 入れたら満足してしまった方、もうちょっと遊んでみませんか？ 〜MyMan ビルドして遊ぶ

せっかくインストールした Ubuntu、OS のインストールがゴールで満足した方が結構いらっしゃるのではないかと思いますが、そこで終わるのはもったいなくないですか？もうちょっと遊んでみませんか？というお話。

ここでは、MyMan というパックマンもどきのゲームをビルドしてみます。

### 0. しかし、その前に
使っているターミナル (端末) でコンソール ゲームがまともに遊べそうかチェックしてみましょう。
[Bastet](http://fph.altervista.org/prog/bastet.html) というテトリスもどきをインストールしてみます。

```
sudo apt install bastet
```
インストールしたら、`bastet` を起動して遊んでみます。特に問題なく遊べるかと思います。
![Bastet](https://qiita-image-store.s3.amazonaws.com/0/371960/d2aa06cc-f0f7-434c-c8ab-094736f777e7.png)

Windows 10 1809 の Windows Subsystem for Linux のコンソールではうまくいきません。全体的に表示にズレがあり、直線 4 個のブロックが出てくると表示が異常になります。まだまだ問題は多いですね、WSL。
<img width="973" alt="Bastet on WSL" src="https://qiita-image-store.s3.amazonaws.com/0/371960/a432b1f7-503e-4044-d1e3-dfefe991187b.png">

ところが、Windows 10 May 2019 Update (1903) ではうまくいきます。向上してますね。
<img width="990" alt="Windows 10 1903" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371960/1dba0627-5afb-e72e-29c9-0c07a29d4005.png">


### 1. MyMan をダウンロードする
まずは、ブラウザーで [MyMan](https://sourceforge.net/projects/myman/) を見てみます。もういかにもなスクリーンショットが出てますね。ここから、ダウンロードします。

.gz ファイルはホームに置いておきましょう。続いてファイルを解凍します。

``` 解凍例
tar xvfvz myman-wip-2009-10-30.tar.gz
```

ファイルを見るとやたらテキストファイルが多いと思いますが、実は、ダウンロードしたものはそのままでは遊べません。ビルドという処理を実行して、実行可能にする準備をします。

### 2. ビルドの下準備をする
ビルドをするには、まずプログラムの追加インストールが必要になります。

```
sudo apt install build-essential
```

[[今さら] もう 2019 年だというのに iBook G4 に Ubuntu 16.04 LTS をインストールしてみる](https://qiita.com/comeon_babuu/items/02918802a7e0e48b39a3) の iBook G4 の場合は 30 分ぐらいかかることもあるので気長に待ちましょう。

### 3. ビルドする
慣れている方は、次の手順でサクっとやっちゃって、このセクションは抜けちゃいましょう。

```
sudo apt-get install libncurses5-dev groff
cd ~/myman-wip-2009-10-30
./configure
make
```

ここを読み進めてる方、まずはこれを実行してみます。

```
cd ~/myman-wip-2009-10-30
./configure
```
configure を実行しておかないとビルドがうまくいかないので、必ず実行します。
そして、いよいよビルドを実行します。

```
make
```

しかしながら、ビルドは失敗すると思います。

まず、curses.h が見つからないと言って止まると思います。
必要なファイルが無いということなのですが、作者ではない別の人が作ったファイルを必要としていると考えられます。失敗したファイルは .c で C 言語のソースファイルと考えられるので、多くの場合、lib<ほにゃらら>-dev のパッケージを追加することになるので、まずは探してみます。

```
sudo apt search libcurses
```

すると、リストの中に `libcurses-ocaml-dev` というのが出てきたので、これをインストールしてみます。

```
sudo apt install libcurses-ocaml-dev
```

インストールしたら、再び `make` してみます。
しかしながら、さらに失敗すると思います。ただ、エラー メッセージで groff をインストールした？と言ってきてるので、これをインストールします。

```
sudo apt install groff
```

もう一度 `make` します。今度は最後まで完了すると思います。

### 4. インストールする
つぎのコマンドを実行します。

```
sudo make install
```

### 5. 実行してみましょう

```
myman
```
何回かスペースを押していくとゲームがスタートします。
![myman](https://qiita-image-store.s3.amazonaws.com/0/371960/9a72887e-b30f-f5c9-3676-07387929b606.png)

ちょっと面白いかも。と感じたならば、さらに深入りしてみませんか？プログラミング、面白いかもしれないですよ:smiley:
Alamofire JSONをPOST

## パラメータにJSONを指定する例
curlだとこう

```
curl -X POST \
  http://api.exsample.com/api/v1/login \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "auth": {
        "phone_number": "090xxxxxxxx",
        "password": "password"
    }
}'
```

Alamofireの場合

```swift

let parameters = [
    "auth": [
             "phone_number": "090xxxxxxxx",
             "password": "password"
            ]
    ]

Alamofire.request("http://api.exsample.com/api/v1/login",
  method: .post, 
  parameters: parameters, 
  encoding: JSONEncoding.default, headers: nil)
.responseJSON { response in
    if let result = response.result.value as? [String: Any] {
       print(result)
    }
}
```
Vimの端末機能の色を設定する方法

# Vimの端末モードの色を設定する方法

Vim8.1から導入された端末機能で、色の設定方法を調べたのでメモ。

## そもそもVimの端末機能とは
* Vim8.1から導入された機能
* Vimのwindowとしてterminalを開くことができる

### terminal機能を使用できるか確認する方法
以下のコマンドでterminal modeが有効かどうか確認できる。
1が返ってくれば有効になっているため、ノーマルモードの時に`:terminal`とすれば起動できる。

```vim
:echo has('terminal')
```

## 調べようと思った背景

普段私はterminal上のVimを使用しており、Colorshemeとして[tender.vim](https://github.com/jacoborus/tender.vim)を使用させていただいています。
適用した際のスクリーンショットは上記のGitHubのページを見てもらえればわかると思いますが、黒背景に映える青が非常に気に入っています。ただ、端末機能の背景色には対応していないようで、terminalを起動すると残念な色合いになっていました。そこで、そもそも端末機能の色を変更する方法を調べてみました。

と言っても、Vimのhelpを引けば一発でわかる内容です。

## 設定方法

ヘルプ(日本語)によると以下の通りです。
>新しい端末ウィンドウでデフォルトで使用される16個のANSI カラーは、変数`g:terminal_ansi_colors` を使用して設定することができます。これは、16個の色名または 16進数の色コードのリストでなければなりません。これは、|highlight-guifg|で受け入れられるものと同様です。 GUI カラーを使用しない場合、端末ウィンドウは常に端末基礎の16個の ANSI カラーを使用します。

vimrc内で`g:terminal_ansi_colors`を設定すれば良いので、以下のように記載することで設定可能です。各項目はそれぞれ以下の色を表しています。

```vim
let g:terminal_ansi_colors = [
    \ 'black',
    \ 'red',
    \ 'green',
    \ 'yellow',
    \ 'blue',
    \ 'magenta',
    \ 'cyan',
    \ 'white',
    \ 'black(bright)',
    \ 'red(bright)',
    \ 'green(bright)',
    \ 'yellow(bright)',
    \ 'blue(bright)',
    \ 'magenta(bright)',
    \ 'cyan(bright)',
    \ 'white(bright)'
    \ ]
```

## 自分好みの色を設定する方法

さて、Vimの設定方法がわかりましたので、自分の好みの色を設定したいと思います。
先ほど述べましたように私はVimのColorshemeとして[tender.vim](https://github.com/jacoborus/tender.vim)を使用していますので、この色に合わせた端末の色を設定しようと思います。

しかし、ここで問題が一点。ただ単に自分の勉強不足なのですが、ANSIカラーと言われてもどのように設定すべきなのかわかりませんでした。
困っていたところ、[terminal.sexy](https://terminal.sexy)というサイトを発見しました。iTerm2などのColorsheme設定ファイルをImportして別のターミナル用の設定ファイルをExportできるようです。残念ながらVimの端末はありませんでしたが、カラーコードさえわかれば設定できるので、適当にXresources形式で出力して無事コードを取得できました。

```vim
let g:terminal_ansi_colors = [
    \ '#666666',
    \ '#f43753',
    \ '#c9d05c',
    \ '#ffc24b',
    \ '#b3deef',
    \ '#d3b987',
    \ '#73cef4',
    \ '#eeeeee',
    \ '#666666',
    \ '#f43753',
    \ '#c9d05c',
    \ '#ffc24b',
    \ '#b3deef',
    \ '#d3b987',
    \ '#73cef4',
    \ '#ffffff'
    \ ]
```

## 最後に

設定方法を探してネットを徘徊してしまいましたが、素直にhelpを確認すればよかったです。
Vimのhelpはすごくしっかりと記載してあるので、困った時はまずはhelpを確認する癖をつけておいた方が良いと改めて思いました。
また、ANSIカラーについて、結局よくわかっていないので改めて調べておこうと思います。
BootstrapのModalがスマホで表示されない時の対処法

BootstrapのModalがスマホで表示されない時の対処法を紹介します。
## BootstrapのModalがスマホで表示されない時の対処法

このように、トリガーとなる要素に`style="cursor: pointer;"`を追加する必要があります。

```html
<span class="mr-1" data-target="#exampleModal" data-toggle="modal"  style="cursor: pointer;">
ここをクリック
<span>
```
以上です。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
一般化カイ二乗検定を試してみる

## 一般化カイ二乗検定

資料 -> http://jgss.daishodai.ac.jp/research/monographs/jgssm3/jgssm3_13.pdf

大規模データのように、サンプルサイズが非常に大きい場合、カイ二乗検定はちょっとした差も有意差として検出してしまいます。こんなときに、一般化カイ二乗検定を使います。

一般化カイ二乗検定は、帰無仮説を｢AとBが$p$%離れている｣を帰無仮説、｢AとBが$p$%より大きく離れている｣を対立仮説とするカイ二乗検定です。[^1]

[^1]: $p$が0なら普通のカイ二乗検定になります。なので__一般化__カイ二乗検定です。

自分は理論を理解できているわけではないので、詳しくはpdfを読んでもらいたいです。
ここではサンプルデータを使って、Python, R実装で適合度検定がうまくいくかどうかだけ確認してみることにします。

検定に使うサンプルデータは、2つの値[55000, 45000]であるとします。期待度数は2つの値の平均である[50000, 50000]で、各値はこの期待度数から10%ずれています。サンプルサイズが大きいため、通常のカイ二乗検定であれば当然有意になります。

## 計算手順

カイ二乗適合度検定を行いたい場合、

1. カイ二乗値と自由度を出す
2. 非心カイ二乗分布の非心度を求める
3. カイ二乗値と自由度、逸脱度からp値を求める

でできます。順番に見ていきましょう。


### 1. カイ二乗値と自由度を出す

見出しの通りです。普通に計算します。

```python:python
from scipy import stats

values = [55000, 45000]
chisq_value = stats.chisquare(values).statistic
ddof = len(values) - 1
```

```R:R
values <- c(55000, 45000)
chisq.value <- chisq.test(values)$statistic
ddof <- length(values) - 1
```

### 2. 非心カイ二乗分布の非心度を求める

サンプルサイズが十分に大きいとき、計算に必要な非心度$\delta$は、

- サンプルサイズ$n$
- $p$%ズレているときの逸脱量$d$

を使って$\delta = nd$として表せるそうです。

また、逸脱量$d$はカイ二乗値をサンプルサイズ$n$で割ると出るものなので、結局のところ、$\delta$は$p$%ズレているときのカイ二乗値ということにもなります。

```math
\delta = nd = n \times \frac{\chi^2}{n} = \chi^2
```

とはいえ、期待度数が平均値である場合、$\chi^2$を計算するよりも逸脱量$d$を計算して$n$を掛けるほうが楽なので、そのようにします。実際には$d = p^2$になります。

たとえば2つの値が、その平均から10%ズレてるときの逸脱量は次のように計算します (サンプルサイズで割り算しなくていいように、観測度数の合計が1になるようにしてあります)。

```math
\begin{equation}
\begin{split}
d &= \frac{(0.55 - 0.5)^2}{0.5} + \frac{(0.45 - 0.5)^2}{0.5}\\
&=\frac{0.05^2}{0.5} \times 2\\
&=0.05^2 \times 2 \times 2\\
&=0.05^2 \times 2^2\\
&=(0.05 \times 2)^2\\
&=0.01\\
\end{split}
\end{equation}
```

同様にして、2つの値が$p$%ズレてるときはこうです。

```math
\begin{equation}
\begin{split}
d &= \frac{(0.5p)^2}{0.5} + \frac{(0.5p)^2}{0.5}\\
&=\frac{0.5p^2}{0.5} \times 2\\
&=0.5p^2 \times 2 \times 2\\
&=0.5p^2 \times 2^2\\
&=(0.5p \times 2)^2\\
&=p^2\\
\end{split}
\end{equation}
```

$n$個の値が$p$%ズレている場合はというと、

```math
\begin{equation}
\begin{split}
d &= \frac{(p/n)^2}{1/n} \times n\\
&=(p/n)^2 \times n^2\\
&=(p/n \times n)^2\\
&=p^2\\
\end{split}
\end{equation}
```

ということでどうやっても$p^2$になります。したがって、10%までの逸脱を意味のない逸脱であるとするならば、非心度$\delta$は、

```python:python
delta = sum(values) * 0.1 ** 2
```

```R:R
delta <- sum(values) * 0.1 ** 2
```

です。`sum(values)` のほうがサンプルサイズ$n$、`0.1 ** 2` のほうが逸脱量$d$です。

### 3.カイ二乗値と自由度、逸脱度からp値を求める

こんな感じ。

```python:python
1 - stats.ncx2.cdf(chisq_value, ddof, delta)  # 0.4999...
```

```R:R
pchisq(chisq.value, ddof, delta, lower.tail = T)  # 0.5
```

10%までの逸脱を意味のない逸脱とした場合、実際に、10%のズレでは有意になりませんでした。

参考までに、使う値｢56000, 44000]のように少しずつずらしていくと、p値はこんな感じになります (横軸は大きい方の値です)。

![x-pvalue](https://qiita-image-store.s3.amazonaws.com/0/174322/364f1b0d-e09a-697f-82ba-e3674b9c8d57.png)

## まとめ

大規模データでもまともに動くカイ二乗検定があるというのはありがたいです。ありがとうございます🙌
centOSインストール　初期設定

https://qiita.com/Trouble_SUM/items/8591d7388cd7c0a792bc

1.CentOS7
(1)最新版にアップデート
　yum update
(2)sshでのrootの使用を禁止
	useradd -mG wheel hoge
	passwd hoge
	rootログインを停止
	公開鍵方式に変更
	ローカルで公開鍵を作成
(3)ポート番号の変更
(4)fireWallの設定


2.nginx
(1)グループとユーザを設定
	sudo groupadd webadmin
	sudo useradd -g webadmin webadmin
(2)ユーザーをシステムユーザーから外す
	sudo usermod -s /bin/false webadmin

3.PHPインストール
	sudo yum -y install epel-release
	sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
	
	sudo yum info php --enablerepo=remi-php73
	sudo yum install php --enablerepo=remi-php73
	(2)composer　インストール
	curl https://getcomposer.org/installer | php
	sudo mv -i composer.phar /usr/local/bin/composer
	
	composer --version
未経験でrubyの勉強をしています。分からないので教えてください。

require 'minitest/autorun'
require './lib/rgb'

class RgbTest < Minitest::Test
  def test_to_hex
      assert_equal '#000000', to_hex(0, 0, 0)
      assert_equal '#ffffff', to_hex(255, 255, 255)
      assert_equal '#043c78', to_hex(4, 60, 120)
  end
    
  def test_to_ints
      assert_equal [0, 0, 0], to_ints('#000000')
      assert_equal [255, 255, 255], to_ints('#ffffff')
      assert_equal [4, 60, 120], to_ints('#043c78')
  end
end



def to_ints(hex)
  r = hex[1..2]
  g = hex[3..4]
  b = hex[5..6]
  ints = []
  [r, g, b].each do |s|
    ints << s.hex
  end
  ints
end

上記のテストコードとメソッドでパスを通そうとするとエラーが出ます。
打ち間違いがあると思い見返すのですが
なぜ、通らないか分かりません。
どこに間違いがあるか教えてください。
宜しくお願い致します。

ruby2.6.1を使っています。
参考書は「プロを目指す人のためのRuby入門」
Panジェスチャ後のvelocityを利用した放物線アニメーション

`UIPanGestureRecognizer`で指が離されたときの`velocity`を使って曲線移動するのアニメーションを作ります。

![circle.gif](https://qiita-image-store.s3.amazonaws.com/0/8920/5146de2a-f63f-f765-a90e-0e0ac86ba6f9.gif)

Swift 4.2

```swift
import UIKit

class ViewController: UIViewController {
    var animationSample: AnimationSample?
    override func viewDidLoad() {
        super.viewDidLoad()
        animationSample = AnimationSample(view: view)
    }
}

class AnimationSample {
    let view: UIView

    let circle: UIView = {
        let diameter: CGFloat = 120
        let view = UIView(frame: CGRect(
            x: 0,
            y: 0,
            width: diameter,
            height: diameter))
        view.layer.cornerRadius = diameter * 0.5
        view.backgroundColor = .blue
        return view
    }()

    init(view: UIView) {
        self.view = view
        view.addSubview(circle)
        circle.center = view.center
        let pan = UIPanGestureRecognizer(
            target: self,
            action: #selector(didPan(gesture:)))
        circle.addGestureRecognizer(pan)
    }

    @objc private func didPan(gesture: UIPanGestureRecognizer) {
        let location = gesture.location(in: nil)
        switch gesture.state {
        case .began:
            circle.layer.removeAnimation(forKey: "animation")
            UIView.animate(withDuration: 0.1) {
                self.circle.center = location
            }
        case .changed:
            circle.center = location
        case .ended, .failed, .cancelled:
            circle.center = location
            animate(velocity: gesture.velocity(in: nil))
            break
        case .possible:
            break
        }
    }

    func animate(velocity: CGPoint) {
        let speed: CGFloat = 0.5
        let startPoint = circle.center
        let endPoint = view.center
        let controlPoint = CGPoint(
            x: startPoint.x + velocity.x * speed,
            y: startPoint.y + velocity.y * speed)
        let animation = CAKeyframeAnimation(keyPath: "position")
        let path = CGMutablePath()
        path.move(to: startPoint)
        path.addQuadCurve(to: endPoint, control: controlPoint)
        animation.path = path
        animation.duration = 1.0
        animation.fillMode = .forwards
        animation.isRemovedOnCompletion = false
        CATransaction.begin()
        CATransaction.setCompletionBlock {
            self.circle.center = endPoint
        }
        circle.layer.add(animation, forKey: "animation")
        CATransaction.commit()
    }
}

```
【超入門】入力フォームからGETメソッドでデータを受け取る方法

##GETメソッドについて
`GET`メソッドとはHTTPメソッドの１つであり、HTMLファイルや画像ファイルなどを要求するときに使われるメソッドです。
よく似たHTTPメソッドとして`POST`メソッドがあります。
`POST`メソッドは`GET`メソッドと同様に入力した内容をサーバーへ送ることが可能です。
###`POST`メソッドと`GET`メソッドの違い
ここでは深くは触れませんが、`POST`メソッドと`GET`メソッドの違いとして`GET`メソッドの場合は、リクエストラインにクエリストリングとして、入力した情報を付与してサーバーへ送ります。
その際、情報をURLにくっつけてサーバーに送るのが`GET`メソッドです
その一方で、`POST`メソッドの場合は、メッセージボディに入力した情報を記述してリクエストします。
メッセージボディは、URLのように様々なところに情報は残らないので、ユーザー名やパスワードなど第3者に知られたくない情報は`POST`メソッドを利用します。
今回は`GET`メソッドを用いて簡易的な入力フォームからデータを受け取る方法を解説します。


##HTMLで入力フォームを用意
まずはHTMLで入力フォームを用意します。
＊この時ファイル名は`form.html`のようにファイル名から内容が想像できるようにしておくと後から見返す時に楽になります。

```html:form.html
<!DOCTYPE html>
<html lang="ja">
 <head>
 <title>データを送信</title>
 </head>
 <body>
  <form action="display.php" method="get">
  <input type ="text" name="name">
  <input type="submit" value="送信">
  </form>
  </body>
</html>
```

##入力フォームからの情報を受け取るPHPファイルを用意
```PHP:display.php
<!DOCTYPE html>
<html lang="ja">
 <head>
 <title>データを受信</title>
 </head>
 <body>
 <?php
 echo $_GET['name'];
 ?>
 </body>
</html>
```
##解説
###form.html
htmlのformタグの使い方が重要。
HTMLのformから送信先のを指定するaction属性を用いて
・どのPHPファイルに送信するのか
・どんな方法で送信するのか
を指定する。
今回は「display.phpにGETメソッドで送信する」という内容にするために
```<form action="display.php" method="get">```と書く。

###display.php
PHPにおいて文字列の出力には`echo`を使う。
`form.html`から送られてきたデータを`display.php`で表示させるために
```echo $_GET['name'];```を用いる。
**PHPでは処理コードの区切りを`;`で表す。最初はよく忘れるので十分注意が必要**

##今後のために
学習が進むとGETメソッドで送るデータの数も複数になってくる。
その都度、毎回のように
`echo $_GET['name'];`とやるのは効率が悪いので
`form.html`にてname属性を定めているので

```PHP:display.php
$name = $_GET['name'];
```
このように決めて用いるとよい。
【作品】PHPを用いたトランプゲーム

# High&Lowゲーム

【ゲーム内容】
カード2枚中、右のカードを伏せます。
どちらのカードもランダムにひかれたものですが、左のカードが伏せられている右のカードより大きい(High)か小さい(Low)かを当てるゲームです。

カードの強弱の順番は、
Joker、エース、2・・・・・・・・・・J、Q、K
小さい<----------------------------->大きい

※2枚とも同じ数字の場合は、どちらを選んでも正解とします。

http://localhost:8888/kunimoto_super_intro/ch11/HighAndLowS03.php