OmniAICreator/Qiita-1.07M huggingface dataset:
Windows Updateから、直接ドライバを持ってくるお話

#Windows10で、cups使ってハマりましたとさ
Raspberry piをプリントサーバにしてみたのだけれど、ふっるいプリンタだったので、メーカーサイトに、、、
```
標準ドライバーは、OSに同梱されていたり Windows update より入手できるドライバーで、基本的な機能をサポートしています。
```
とか書いてありまして、、、。
んで、Windowsには、プリンタドライバ入って無くて、どーやらWindows Update経由で、ぽい感じ。
一度直接PCにプリンタを繋げばWindows Update経由でドライバ入るのですが、重苦しいレーザープリンタも、でっかいパソコンも、移動したく無いわけで・・・。

ちなみにcupsは、/etc/cups/cupsd.confの「Listen」からlocalhostを外し、「Location」に「Allow from all」をくっつけて、設定用ユーザーを「lpadmin」グループに突っ込めば動きます。

#Windows Update カタログで検索だ！
割と頑張って探したのですが、ドライバ単体では落ちていませんでした。
が、答えは簡単でした。
「[Windows Update カタログ](http://www.catalog.update.microsoft.com/Home.aspx)」で製品型番（の一部）を検索すればOKな感じです。
例えば、こんな感じに。

![hl_dl.png](https://qiita-image-store.s3.amazonaws.com/0/216885/c784ec18-3239-f1b9-afea-c1e409236034.png)

なんで同じのが沢山出てくるのん？、ってこれ、アーキテクチャ別に並んでるだけでした。
Windows10の場合、上の３つをダウンロードすればOKです。
cabファイルを解凍すると、それぞれ「i386」「AMD64」「ia64」用のディレクトリを含んだinfファイルがゲットできます。

あとは、プリンタ検索時に、「ディスク使用」から、お使いのアーキテクチャーなcabファイルを解凍したディレクトリを指定すればOKです！。

![hl_dl3.png](https://qiita-image-store.s3.amazonaws.com/0/216885/dbb98a16-134a-4e9b-8e13-0974e24e7e0a.png)


やったー！。
![hl_dl2.png](https://qiita-image-store.s3.amazonaws.com/0/216885/bc9c3c7a-0323-ca41-9145-eb2251b555ad.png)
composerのsecure-httpの設定を変更する

composerを利用している時に以下のようなエラーが出ました。

`Your configuration does not allow connection to http://~...`

現在の最新のcomposerでは`secure-http`の設定はデフォルトで`true`になっていて、
取ってくるパッケージがhttpに置かれているとDLに失敗します。

`composer.json`に下記のconfigを追記してあげることで、
`secure-http`を`false`にしてあげることができます。

```json:composer.json
{
    "require": {

    },
    "config": {
        "secure-http": false
    }
} 
```

これでエラーが出なくなりました。
よちよちrubistがハマった備忘録

言われてみればあたり前田のクラッカーだが得心するまで微妙にどっちだったか？と考えてしまうことが何度かあったので備忘録として残しておく。
わかりにくいこと、わかったが忘れそうなことのメモ置き場として適宜更新追加していく予定。

rails、基本的に便利なのだけどいろいろな書き方ができるのでわかったときは「なるほど！」となるがしばらくして「確かこういうケースのときはもっとRails Wayな書き方があったけどどうやるんだっけ？」みたいなことが起こりがち。

慣れてしまえばいいんだけど他言語から入ってきた勢としてはなかなかスイッチングコストが大きい。

あとタイトルでrubistと書いてるがほぼrailsの話し。

## モデルは単数形、belongs_toは単数形、has_manyは複数形
モデルは単数形(Railsの思想的な問題？)

belongs_toなど対象が単数であることが自明なら単数、has_manyのようにモデルだが複数所有するケースは複数形になる。

```
belongs_to :item

has_many :items
```

言われてみればまあそうだなって話しなんだけど最初は「こっちは単数形だけどこっちは複数形…え？どういうこと？？？」ってなった。

## validateでハマったところ。

```
validates :name, length: {in: 1..10_00_00}
```

みたいな実装があり、これがエラーにならなくて「どう解釈されているのか？」と思ってたがrubyではこの実装をしてもエラーにはならない。

理由は数字の連結を行っていると解釈されるため。

[Ruby 文字列と数値の連結](https://chaika.hatenablog.com/entry/2016/01/08/140310)

つまり`1..100000`と`1..10_00_00`は等価。
元々はお金とか数字が大きい際の区切り文字として入れておくことで人間に優しくなるということだと思うのだけど使ってる場所が悪く理解するのに時間がかかった。
なお問題の箇所で使われていた`_`はただのタイポだった。

## 三項演算子よりもrails wayな実装

before:

```
result = rows.present? ? rows : "エラーメッセージとか空配列とか指定するよ"
```

after:

```
result = rows.presence || "エラーメッセージとか空配列とか指定するよ"
```

`present?`は`true`/`false`を返すが`presence`は成功なら自身を返す。
この場合は`rows`が返り、失敗すると`false`が返る。

そしてRubyの構文で`[A] || [B]`を使用しているため、Aが`true`でなければBを返す…という実装になっている。
そういえば最初の頃は`[A] || [B]`という書き方になれなかったが最近だいぶ考えずにすっと読めるようになってきた。
似た書き方に`result ||= "デフォルト値だよ"`とかもある。

こういうの地味にググりにくく困ることがある。
vagrant + laravel環境構築トラブルシューティング

## laravel環境構築
https://readouble.com/laravel/5.6/ja/homestead.html
主に上記リンクに従ってやってみたが、思いの外詰まったので共有。
上記リンクに従ってやってみてうまくいかなかったら参照してみてください。

### box追加できない
```
vagrant box add laravel/homestead
```
が失敗する場合は以下リンクよりvagrantを更新する。*vagrantが起動している場合はvagrant haltしておく。
https://www.vagrantup.com/downloads.html  
更新したらaddしてみる。
それでもダメな場合は以下を試してからaddしてみる。

```
rm -rf ~/.vagrant.d/tmp
```
これでaddは成功するはず。だが、

### vagrant upできない  
WiFiのipアドレスとバッティングしていた模様。
以下のサイトでvirtualBox側を修正。
http://gamushiros.hatenablog.com/entry/2016/08/07/074230 
この修正でvagrant upは成功するはず。だが、

### ブラウザからアクセスできない  
ので、その前にcloneしてきたプロジェクトのipアドレスの変更が必要。
自分の場合は192.168.22.10をブラウザからアクセスするipアドレスにすることにした。
Homestead.yamlのipを変更すればいいだけではないので注意。僕はこれだけ変更していて数時間無駄にしt。
cloneしてきたプロジェクト内のスクリプトを以下のように変更する。

```
192.168.10.1  -> 192.168.22.1
192.168.10.10 -> 192.168.22.10
192.168.10.11 -> 192.168.22.11
```

自分の場合は以上を踏まえてbox追加、vagrant up、ブラウザからアクセスできるようになりました。

### 参考
[Laravel HomesteadでLaravel5.4の環境を作りながら、レンタルサーバにwebアプリケーションを公開する(追記あり)](https://qiita.com/Fendo181/items/a6b9017f6ef490995aba)
GlassFish/Payara での HikariCP の利用

#手順
HikariCP に JNDI へのデータソース登録用の Factory クラスが用意されているので、glassfish-resources.xml に以下のように設定するだけで OK
※ 以下は MySQL 使用時の例

```XML:glassfish-resources.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC
    "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN"
    "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>

    <custom-resource
        jndi-name="java:app/jdbc/sample"
        res-type="javax.sql.DataSource"
        factory-class="com.zaxxer.hikari.HikariJNDIFactory">
        <property name="dataSourceClassName" value="org.mariadb.jdbc.MariaDbDataSource" />
        <property name="poolName" value="sample" />
        <property name="dataSource.url" value="jdbc:mysql://localhost:3306/sample?useServerPrepStmts=true" />
        <property name="dataSource.user" value="xxx" />
        <property name="dataSource.password" value="xxx" />
    </custom-resource>

</resources>
```

#参照
[JNDI DataSource Factory (Tomcat, etc.) · brettwooldridge/HikariCP Wiki](https://github.com/brettwooldridge/HikariCP/wiki/JNDI-DataSource-Factory-(Tomcat,-etc.)
)
Singleton Pattern

# Singleton Pattern
Singleton Pattern is a software design pattern that restricts the instance of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. The concept is sometimes generalized to systems that operate more efficiently when only one object exists, or that restrict the instance to a certain number of objects.

## overview
The singleton design pattern solves these problems

- How can it be ensured that a class has only one instance?
- How can the sole instance of a class be accessed easily?
- How can a class control its instantiation?
- How can the number of instances of a class be restricted?

## implementation
~~~ Singleton.java
public final class Singleton {
    // #1 private instance
    private static final Singleton INSTANCE = new Singleton();

    // #2 private constructor
    private Singleton() {}

    // #3 public method to get a Singleton instance
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
~~~

## Reference
- [TECHSCORE design pattern](http://www.techscore.com/tech/DesignPattern/index.html/)
- [java design pattern in GitHub](https://github.com/iluwatar/java-design-patterns)
- [Singleton Pattern](https://en.wikipedia.org/wiki/Singleton_pattern)
Ubuntu16.04にPython3.6をインストールするとget-pip.py実行時にエラー

5月に入ってから急に失敗するようになったのでメモ。

インストールの仕方は公式ページより
https://www.python.jp/install/ubuntu/index.html

4月までは大丈夫だったのに、上記の「get-pip.py」を実行すると以下のようなエラー

```
ImportError: cannot import name 'sysconfig'
```

python3.6を起動して、```import sysconfig```をすると特に問題なし。原因がよくわからない。

##暫定的な解決策
PPAを変えたらいけた。

```
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6 python3.6-dev
wget https://bootstrap.pypa.io/get-pip.py
sudo python3.6 get-pip.py
```

##追記
apt installを使って```pip```と```setuptools```をインストールする方法。Ubuntu18.04などで初期状態からpython3.6がインストールされている場合に有効

```
sudo apt install python3-pip
sudo apt install python3-setuptools
```

python3のコマンドは必要に応じて読み替えてください。Ubuntu18.04でpipがついていませんでしたが、これでインストールできました（get-pip.pyは相変わらずエラー出る）。

##参考情報
* https://stackoverflow.com/questions/6587507/how-to-install-pip-with-python-3
* https://ru.stackoverflow.com/questions/822855/pip-cannot-import-name-sysconfig
* https://github.com/pypa/pip/issues/5356
確率微分方程式のシミュレーション

1変数の確率微分方程式は一般に次の形で表されます。

<div>$$
dX(t) = f(X(t))dt+g(X(t))dW(t),\ \   X(0)=X_0, 0\leq t \leq T \ \ .
$$</div>

ここで$f,g$はスカラー関数、$W(t)$はウィーナー過程です。この方程式の数値計算をしてみます。

数値計算をするためには、離散化をする必要があります。確率微分方程式の離散化には大きく2つの方法があり、それぞれEuler-Maruyama法とMilstein法と呼ばれています。今回は、精度は劣るものの、簡単であるEuler-Maruyama法を用いて計算します。

まず、区間$[0,T]$を離散化します。じゅうぶん大きな正の整数$N$を用いて、$\Delta t := T/N$、$\tau_j := j \Delta t$とします。また、$X_j:=X(\tau_j)$と表すことにします。

Euler-Maruyama法では次の形式によって方程式を離散化します。

<div>$$
X_j = X_{j-1}+f(X_{j-1})\Delta t + g(X_{j-1}) (W(\tau_j)-W(\tau_{j-1})), j=1,2,\cdots L \ \ .
$$</div>

ここで、$W(t)$はウィーナー過程であることから、$W(\tau_j)-W(\tau_{j-1})$ は平均0、分散 $\tau_j-\tau_{j-1}$ の正規分布 $N(0, \tau_j - \tau_{j-1})$ に従う確率変数です。

Euler-Maruyama法を使って、下式で表される幾何ブラウン運動を計算してみます。

```math
dX(t) = \sigma X(t) dt +  \mu X(t) dW(t), \ \ X(0)=X_0 \  \ .
```

ここで$\sigma, \mu$は定数です。幾何ブラウン運動は解析解を求めることができ、解は次の通りです。

```math
X(t) = X(0) \exp ( (\sigma-\frac{1}{2}\mu^2)t+\mu W(t) ) \ \ .
```

Euler-Maruyama法の結果と解析解の結果を比較するコードは以下の通りです。

```python
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sigma = 2
mu = 1
Xzero = 1

T = 1.0
N = 2**8
dt = T / N

t = np.arange(0.0, T, dt)
dW = np.sqrt(dt) *  np.random.randn(N)
dW[0] = 0
W = np.cumsum(dW)
Xtrue = Xzero * np.exp(  (sigma - 0.5 * mu**2) * t +(mu*W)  )

Xem = np.zeros(N)
Xtemp = Xzero
Xem[0] = Xtemp
for j in range(1, N):
    Xtemp = Xtemp + dt * sigma * Xtemp + mu * Xtemp * dW[j]
    Xem[j] = Xtemp

plt.plot(t, Xtrue, label='Analytic')
plt.plot(t, Xem, label='Euler-Maruyama')
plt.legend()
```
![sde.png](https://qiita-image-store.s3.amazonaws.com/0/35175/4323eb3d-cc30-17f6-8266-f8d8e7ec935c.png)

## 参考文献
* [Learning SDEs in Python](https://www.quantopian.com/posts/learning-sdes-in-python)
Ethereum の Block Gas Limit を取得

Ethereum のブロックごとの Gas Limit を取得する方法をいくつか紹介します。

# geth のコマンドで Block Gas Limit 取得

```
eth.getBlock("latest").gasLimit
```

# geth の JSON RPC API で Block Gas Limit 取得
- 次のサンプルでは、Infura を使用しています。
- 次のコマンドを叩くと JSON が返されるので、そのなかの `gasLimit` の値をチェックします。

```
curl -i -X POST \
-H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest", true],"id":1}' \
"https://mainnet.infura.io/YOUR_API_KEY"
```

# etherscan で取得
- 一番簡単な方法です。
- Mainnet: https://etherscan.io/blocks
- Ropsten: https://ropsten.etherscan.io/blocks

# メモ
- Ethereum では、ブロックごとに miner の投票によって Gas Limit が変わる
- ブロックの Gas Limit を超える Gas Limit を設定してトランザクションを実行しようとすると、`Exceeds block gas limit` というエラーが出る
- 現在のところ、Mainnet での Block Gas Limit はおよそ 8000000
- Ropsten では 4712388
  - どうやら、この値は固定されている模様
  - 16進数だと: 0x47e7c4
- Mainnet と Ropsten で Block Gas Limit が異なることに注意！！
  - 僕はこれで数時間ハマった
  - Ropsten の gasLimit を上げないか？という [Issue](https://github.com/ethereum/ropsten/issues/19) が作られている
- Geth の起動時に `--targetgaslimit` で目標とする Block Gas Limit を設定できるので、開発時はこのフラグを活用するとよいと思います。
  - デフォルトは 4712388

# 参考
- http://blog.playground.io/entry/2018/05/04/124926

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ethereum_の_Block_Gas_Limit_を取得
python 統計 t-test

ググったら、pythonでのt-検定のやり方が日本語で少なかったため、メモ。

１、_indと_rel
t-検定　scipy.stats.ttest_ind()
対応のあるt-検定　scipy.stats.ttest_rel（）（自信ない）

２、P値とt値
P値は以下でみれる。
 scipy.stats.ttest_ind().pvalue

t値は以下でみれる。（自身ない）
scipy.stats.ttest_ind().statistic

３、stats.ttest_ind(df_true["age"],df_false["age"])
引数は、pandasのデータフレームから列指定（シリーズ）を二つ並べたらできた。



参考リンク
https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.stats.ttest_rel.html
https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.stats.ttest_ind.html#scipy-stats-ttest-ind
http://esu-ko.hatenablog.com/entry/2016/03/07/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%82%92Python%E3%81%A7%E8%A9%A6%E3%81%99%281%3A%E6%A4%9C%E5%AE%9A%29
StringやDataに意味を持たせる手段として列挙型を使う

Swiftの列挙型（=enum)のassociated valuesの仕組みを使ってコードの保守性を向上させよう、という記事です。
※この記事が前提にしている開発環境はXcode9.3 / Swift4.1です。

## `String`型や`Data`型を列挙型のassociated valuesにして意味を与える
文字列やバイナリデータって、変数名に気をつけないと可読性・保守性が凄く落ちますよね。
例えば以下のような「暗号化された画像をWEBからロードしてきて表示する」コードの場合↓

```swift
func load() -> Data? {
  let imageUrl = URL(string: "https://www.example.com/some/secret/image")!
  let data = try? Data(contentsOf: imageUrl) // dataは暗号化されている
  return data
}

if let data = load() {
  imageView.image = UIImage(data: data) // ❌dataはまだ複合されていないので表示できない
}
```

この例では`data`が復号化されないまま`UIImage`のイニシャライザに渡されているので画像が表示されなくなります。
この例はとても単純な実装なのでこういったミスをすることは想像しにくいかもしれませんが、暗号化されたデータが複数のfunctionを跨る設計になっていると、こういった不具合が起きやすくなると思います。
※余談ですが、先日[Twitterさんが誤ってハッシュ化する前のパスワードをログに書き込んでしまっていた件](https://blog.twitter.com/official/en_us/topics/company/2018/keeping-your-account-secure.html)はそういった実装が原因で「ハッシュ化前のパスワード」と「ハッシュ化後のパスワード」が区別できないような実装になっていて起きたのではないか？と想像しています。

この問題をSwiftの列挙型を使って解消する一例を挙げると、以下のようになります。

```swift
enum ImageData {
  case encrypted(Data)
  case decrypted(Data)
}

func load() -> ImageData? {
  let imageUrl = URL(string: "https://www.example.com/some/secret/image")!
  if let data = try? Data(contentsOf: imageUrl) {// dataは暗号化されている
    return .encrypted(data) // 暗号化されているDataだということを明示した値を返却する
  }
  return nil
}

if let imageData = load(), case .decrypted(let data) = imageData {
  imageView.image = UIImage(data: data) // ⭕️imageDataが複合されているときだけこの行が実行される
}
```

この実装でも`Data`の復号化処理は書いていないので結局画像は表示されないのですが、`ImageData.decrypted`であること（=復号化済みであること）を判定する`if`文が書けるおかげで`UIImage`に暗号化されたままの`Data`を渡すことがなくなり、不意の事故を防いで適切なエラーハンドリングを実装する事ができるようになりました。

このような形で、`Data`型や`String`型の値をenumでラップしてあげることでそれらの値に意味を持たせる事ができます。
今回は暗号化済データ／復号化済データの区別に用いましたが、実行ステップを経ていく中でデータの形が変わる類の値であれば、何にでも活用できるTipsだと思います。

チーム開発では分かりやすい変数名をつけたりすることも大切ですが、こういうアプローチで保守性を上げることもできますよ、というご紹介でした。
どなたかのお役に立てば幸いです。
ウィーナー過程のシミュレーション

ウィーナー過程 (Wiener Process) $W(t), \ t\in [0,T]$は次の性質を満たします。

1. $W(0)=0$
2. $0\leq s < t \leq T$である$s,t$において、$W(t)-W(s)\sim  N(0, t-s)$である。ただし、$N(\mu,\sigma^2)$は平均$\mu$、 分散$\sigma^2$の正規分布
3. $0\leq s < t \leq u < v \leq T$のとき $W(t)-W(s)$と$W(v)-W(u)$は独立

ウィーナー過程の離散化は、正の整数$N$をとり、$\Delta t := T/N$とおき、$t_j := j \Delta t, \ j = 0, \cdots N$、$W_j := W(t_j) $とすれば、

$$
W_j = W_{j-1} + N(0, \Delta t ) \ \ ,
$$

とできます。数値計算では、この差分方程式を計算します。Pythonによるサンプルコードは次の通りです。

```python
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

N = 100000
dt = 1.0 / N
t = np.arange(0, 1, dt)
dW = np.sqrt(dt)*np.random.randn(N)
dW[0] = 0
W = np.cumsum(dW)
plt.plot(t, W)
```
![wiener.png](https://qiita-image-store.s3.amazonaws.com/0/35175/379f5585-cea7-a2e7-61af-c8a0a17f6356.png)
Unityで作成したPCゲームのエラーと例外のログファイルを保存する

## 環境

Windows10
Unity 5.5.* **Pro**

## やりたかったこと
PCのスタンドアローン向けにビルドしたゲームのエラー/例外のログ(テキストファイル)を保存したい。

## ログの設定
デフォルトだと Debug.Log が全てログファイルに記録されてしまうため、
以下の設定を変更する。
(Edit > Project Settings > Player > Other Settings > Logging)
![Logging.jpg](https://qiita-image-store.s3.amazonaws.com/0/119600/b711626d-c18e-de3a-8c2d-500615cefd51.jpeg)


しかし、これだとエディター上で確認中も表示されなくなってしまうため、
ビルドのスクリプトを作成し、ビルド時に以下のコードを実行するように追加する。

```cs:ビルドスクリプト抜粋
PlayerSettings.SetStackTraceLogType(LogType.Error, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Assert, StackTraceLogType.None);
PlayerSettings.SetStackTraceLogType(LogType.Warning, StackTraceLogType.None);
PlayerSettings.SetStackTraceLogType(LogType.Log, StackTraceLogType.None);
PlayerSettings.SetStackTraceLogType(LogType.Exception, StackTraceLogType.ScriptOnly);
```

さらに、ゲーム起動時に以下のコードを追加する。
LogType.Error を指定すると、エラーだけでなく例外もログファイルに記録される。

```cs:起動時の処理抜粋
#if UNITY_EDITOR || DEVELOPMENT_BUILD
#else
    // フィルターをかけてエラーと例外以外ログに記録しない。
    Debug.logger.filterLogType = LogType.Error;
#endif
```


このあたりを参考にさせていただきました。(ちょっと古いけど）
[コマンドラインからUnityのビルドを走らせる。 -基礎編-](http://qiita.com/sango/items/474efb4c016a136c84ce) 
[コマンドラインからUnityのビルドを走らせる。 -ステップアップ編-](http://qiita.com/sango/items/582468d3038330c59308)
[【Unity】Unity 5.3 新機能メモ](https://qiita.com/baba_s/items/26bcc2a5f418f6aba89e)

## ログファイルの出力

ゲーム起動時に「-logFile」のオプションを指定すればよい。
ファイルが上書きされていってしまうので、1日ずつ別のファイルにするように今日の日付をファイル名に含めた。
・・・が、うまくいかなかった。

``` :問題有り
set unity_log_file=log_%date:~0,4%-%date:~5,2%-%date:~8,2%.txt
start \B \WAIT game.exe -logFile D:\log\%unity_log_file%
```

ゲームをバッチファイルから起動したところ、なぜかカレントディレクトリにログが出力された。
色々やってみたところ、**「unity_log_file」の環境変数が -logFile よりも優先されるらしい。**
unity_log_file を ulogfile のように名前を変更したらうまくいった。

``` :修正版
set ulogfile=log_%date:~0,4%-%date:~5,2%-%date:~8,2%.txt
start \B \WAIT game.exe -logFile D:\log\%ulogfile%
```
Node.js の http クライアントの使い方 (Post)

```js:http_post.js
// ---------------------------------------------------------------
//	http_post.js
//
//					Apr/08/2023
//
// ---------------------------------------------------------------
import https from "https"

const data = JSON.stringify({user: "jiro", password: "123456"})

const options = {
	method: "POST",
	headers: {
		"Content-Type": "application/json",
		'Content-Length': data.length
		}
}

const url = "https://httpbin.org/post"

const request = https.request(url, options, response => {
  console.log(`statusCode: ${response.statusCode}`)
response.on('data', (dd) => {
    process.stdout.write(dd)
  })
})

request.write(data)
request.end()

// ---------------------------------------------------------------
```

```json:package.json
{
  "type": "module"
}
```

実行結果

```text
$ node ./http_post.js
statusCode: 200
{
  "args": {}, 
  "data": "{\"user\":\"jiro\",\"password\":\"123456\"}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Content-Length": "35", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "X-Amzn-Trace-Id": "Root=1-621b0c76-6f84d16d48a282e0407c6bcb"
  }, 
  "json": {
    "password": "123456", 
    "user": "jiro"
  }, 
  "origin": "219.126.139.79", 
  "url": "https://httpbin.org/post"
}
```

次のバージョンで確認しました。

```text
$ node --version
v22.3.0
```
Node.js の http クライアントの使い方 (Get)

```js:http_get.js
// ---------------------------------------------------------------
//	http_get.js
//
//					Apr/08/2023
//
// ---------------------------------------------------------------
import https from "https"

const url = "https://httpbin.org/get" 

const options = {
  method: 'GET'
}

const req = https.request(url,options, res => {
	console.log(`statusCode: ${res.statusCode}`)

	res.on('data', d => {
	process.stdout.write(d)
	})
})

req.on('error', error => {
	console.error(error)
})

req.end()

// ---------------------------------------------------------------
```

```json:package.json
{
  "type": "module"
}
```

実行結果

```text
$ node ./http_get.js 
statusCode: 200
{
  "args": {}, 
  "headers": {
    "Host": "httpbin.org", 
    "X-Amzn-Trace-Id": "Root=1-621b0fb0-6e50432b6633e6453e34e664"
  }, 
  "origin": "219.126.139.79", 
  "url": "https://httpbin.org/get"
}

```

次のバージョンで確認しました。

```text
$ node --version
v22.3.0
```

Ubuntu 系で最新の node.js をインストールする手順

```bash
sudo apt install nodejs npm
sudo npm install -g n
n ls-remote --all | less
sudo n 22.3.0
sudo apt purge nodejs npm
sudo apt autoremove
```
【GCP】超超初心者がGoogle speech api を使うところ。(wav形式)


# 目的

wavファイルの音声データのテキスト化

文字おこしをしなければならない状況になっため、めんどくさいのでどうにか機械でできないかと思いgoogle speech apiの利用を考えました。
実際使えるようになるのに1週間かかってしまいましたが・・・・

この内容は他の記事とは違った部分だけ書きますので、準備段階はほかの記事をご参照ください。

#準備

・GCPでアカウント作成
・Speech apiの有効化
・storageでバケット作成(音声データアップロード)
・サービスアカウントの作成(jsonファイルの用意)
・音声ファイルの用意(自分はサンプルのFLACファイルとWAVを使用しました)
※音声ファイルはビットレートを16,000もしくは44100にして使用しています。
※音声ファイルはモノラルにしておいてください。


# 参照記事
[Google Cloud Speech API を使った音声の文字起こし手順](https://qiita.com/knyrc/items/7aab521edfc9bfb06625)
[超初心者でもgoogle-cloud-speechを使えるが、つまずいた所はある。](https://qiita.com/hanlio/items/875b91e0d4931a57e86b)
[Google Cloud Speech APIで音声の自動文字起こし](https://qiita.com/kokky/items/659bde4cdc8ce5c78e29)
[Cloud Speech API の基本](https://cloud.google.com/speech/docs/basics?hl=ja)


# 手順
基本は参照指示に沿って作業を行ったのだが、異なる部分が出てきた。

**`google.api_core.exceptions.PermissionDenied: 403 The caller does not have permission`**

これは@hanlioさんとは違うかな？と考えてしまった。また日をまたいで何回かサービスアカウントを作成しなおしたり
していたので問題ないかと思っていた。

なので同じくteratailで質問をすると、
[403 The caller does not have permission](https://teratail.com/questions/124652)
前の記事と同じですよ！と回答をいただく。（ごめんなさい！）

一度上記のエラーが出た後に、サービスアカウントを作り直したら、このエラーは出なくなりました。


さぁ次のエラーです
**`google.api_core.exceptions.InvalidArgument:
400 sample_rate_hertz (16000) in RecognitionConfig must either be unspecified or match the value in the FLAC header (44100).`**

これは文字通りサンプリングレートをチェックしてほしいとのことで、このときはまだ音声ファイルの調整はしてなかったので
音声ファイルのサンプリングレートを確認の上、作成したpythonファイルと合わせます。


さぁ、サンプルレートを合わせました！


そしたら次のエラーです（泣）

**`google.api_core.exceptions.InvalidArgument: 400 Invalid audio channel count.`**

channel count ということでチャンネルの数が違いますとのこと
音声ファイルがステレオでとられていたのでモノラルに変更しました。

さぁ今度こそ！

**`Waiting for operation to complete...
:~$　`**

・・・何もおこらないぞ？
もう一回だ！

**`Waiting for operation to complete...
:~$　`**
（※注　shell未経験者）

何も起こらない・・・でもほかの人は直下にデータが出ているといっている。
shellにファイル一覧するコマンドがあったようなと探してみる。

現在のディレクトリの一覧は**` ls`** ということなので
打ってみると、あった！ありました！output.txtが！

次は表示です！どうやるんだ！ローカルに保存はどうするんだ！　調べてみると・・・
**`dl 【ファイル名.txt】`**
でダウンロードできました！

変換されてる！やったね！

さてここまででサンプルのFLACは読み込めたぞ！


実際は自分が使いたかったのはwavファイルなので修正します。

pythonファイルの
**`encoding=enums.RecognitionConfig.AudioEncoding.FLAC,`**
を
**`encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,`**
に変更

さて8分で20MBのwavファイルを使用して、実行する。

無事ファイル生成完了です。


# 感想

参考記事を書いてくださった皆様、助かりました。ありがとうございます。
音声認識も期待通りの精度でしたので、うれしいですね。
久々にやり切った感がありました。
Play Framework勉強めも　複数Modelの連携／ModelをOne To Oneで連携する


#memberフィールドの追加

```java
//Message.java
@OneToOne(cascade = CascadeType.ALL)
	public Member member;
```

`cascade`とはエンティティが更新された時に、関連付けられたエンティティまで更新するかどうか。
（今回でいうと、Messageが更新された時に関連付けられた、Memberも更新するかどうか）
`CascadeType.ALL`とする事で、関連付けられたもの全てを更新するようになる。
※cascadeは必ず設定する必要は無い。場合によっては手動でもOK。


#toStringの修正

```java
//Application.java
	@Override
	public String toString() {
		return ("[id:" + id + "member:<" + member.name + "," + member.mail + ">,message:" + message + "," + "date:"
				+ postdate + "]");
	}
```
toStringはインスタンスを出力する。上記ではその際、どのように表示するかを設定している。
ちなみにインスタンスを受け取って表示しているのは、以下。

```java
//index.scala.html
@(msg: String,datas:List[Message],datas2:List[Member])

@main("Sample Page") {
    <h1>Hello!</h1>
    <p>@msg</p>
    <hr>
    <p>Message Model</p>
    <p>@datas</p>
    <hr>
    <p>Member Model</p>
    <p>@datas2</p>
}
```

#createメソッドの変更
```java
//Application.java
public static Result create() {
		Form<Message> f = new Form(Message.class).bindFromRequest();
		if (!f.hasErrors()) {
			Message data = f.get();//①
			data.member = Member.findByName(data.name);//②
			data.save();
```

①：入力された「Message」データを取り出す
②：入力された「Message」データの「name」と一致する「Member」を取り出す

#動作内容
##①add2(Member)へ入力
<img width="261" alt="スクリーンショット 2018-05-04 11.10.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/6c716b8d-946b-550f-ace0-528d8985d4c1.png">

##②Memberへ入力結果が保存される
<img width="721" alt="スクリーンショット 2018-05-04 11.16.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/eac0bc58-f888-6ef6-c9ad-270573d24892.png">

##③add(Message)へ入力
<img width="259" alt="スクリーンショット 2018-05-04 11.16.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/71b1805c-5f14-bb41-cd28-b0392f9375c9.png">

##④MessageへMemberの内容も出力される
※今回はtoStringで出力するように編集した「名前＋メールアドレス」が、Messageで表示される
<img width="1010" alt="スクリーンショット 2018-05-04 11.16.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/3bb01c22-0e98-b84e-6468-b7b5b64c846f.png">

#生成されるSQL文について
<img width="664" alt="スクリーンショット 2018-05-04 11.40.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/e5186ebc-da3f-fc2b-ad16-7a58ee10159d.png">

messageのテーブルに、member_idが入っている。
テーブルにはMemberインスタンスのようなオブジェクトを保管する事は出来ないので、関連するMemberのIDを保管して、Memberを取得している。PlayFrameworkではフィールドを作るだけで、自動でその外部キーから関連するレコードを取り出してエンティティ化してくれている。
Google Homeからツイートしたい

# 序文
Google Homeを購入したら真っ先にやるのが家電の操作。
それに飽きた頃手をつけるのが SNS などにアウトプットする作業の簡易化。
Google Homeからツイートできれば、まさにつぶやきを記録できるはずです。
# 目的
どんな手段でも良いのでGoogle Home からツイートする。
# 構成
ifttt を使います。
thisに Google アシスタント。 that に Twitter を選ぶだけ。
後は Twitter 側にiftttが操作できるように 許可します。
もう何も難しくありませんし 同じことをやっている記事が既に山ほどあります。
[Google HomeにつぶやくとTwitterでつぶやくやつ、IFTTTですぐできた。](https://qiita.com/kazunori279/items/fdadbfde58ed133bb9d5)

成功したスクリーンショットを撮るまでもない。
 
今後の課題
とっても簡単にifttt-twitter連携できたものの、内容には不満があります。

- 喋り損ねた際にそのまま送信される
- メッセージに謎のスペース
- 短いメッセージしか認識してくれない 

使用頻度がまれであれば、これで見逃しても良いのですが、日常的に利用するつもりなのでちょっとこのままでは許せません。
噛みまくって同じようなツイートを繰り返すのは恥ずかしすぎますよね。
誤変換が確認できないのも辛い。メッセージが20文字を超えると認識が怪しくなってきます。あと、グーグルホームに何度も分かりませんと言われると正直へこみます。 
多少手順が煩雑になっても良いので、もう少し確実に発信内容をコントロールできるようにしたいです。
GridSearchCVの結果をヒートマップで表示する

scikit-learnでGridSearchCVを使ってパラメータをチューニングする際に、各パラメータでの結果をヒートマップで表示して観察することがよく行われる。このヒートマップをGridSearchCVオブジェクトから簡単に作成する方法を調査した。

#### ヒートマップを簡単に作成する方法

GridSearchCV.cv_results_（グリッドサーチの結果が格納されている）を一度pandas.DataFrameに変換して、seaborn.heatmapに渡してヒートマップを表示する。

* DataFrameに変換することでヒートマップに軸名を別途指定する必要がなくなる。
* cv_results_をDataFrameに変換するときには必要なキーのみ抽出すること。（cv\_results\_に含まれる非推奨のキーを参照することで警告が出るのを防ぐため。）

#### 実装例

* [Jupyter Notebook（GitHub）](https://github.com/unhurried/grid-serach-cv-heatmap/blob/master/notebook.ipynb)

```python
# GridSearchCVの結果をヒートマップで表示する。
def plot_heatmap_from_grid(grid):
    # チューニング対象のパラメータを特定する。
    params = [k for k in grid.cv_results_.keys() if k.startswith('param_')]
    if len(params) != 2: raise Exception('grid has to have exact 2 parameters.') 

    # ヒートマップの行、列、値に使うキーを定義する。
    index = params[0]
    columns = params[1]
    values = 'mean_test_score'

    # gridから必要なキーのみを抽出する。
    df_dict = {k: grid.cv_results_[k] for k in grid.cv_results_.keys() & {index, columns, values}}

    # dictをDataFrameに変換してseabornでヒートマップを表示する。
    import pandas as pd
    df = pd.DataFrame(df_dict)
    data = df.pivot(index=index, columns=columns, values=values)
    import seaborn as sns
    sns.heatmap(data, annot=True, fmt='.3f')
```
ベンチマークの取り方の勉強を兼ねて、Write系関数の速度を比較

```io_test.go
package bench

import (
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"testing"
)

func BenchmarkWriteString(b *testing.B){
	for i := 0 ; i < b.N ; i++ {
		io.WriteString(ioutil.Discard,"hogehoge")
	}
}

func BenchmarkFmtFprint(b *testing.B){
	for i := 0 ; i < b.N ; i++ {
		fmt.Fprint(ioutil.Discard,"hogehoge")
	}
}

func BenchmarkWriteWithStr2Byte(b *testing.B){
	for i := 0 ; i < b.N ; i++ {
		ioutil.Discard.Write( []byte("hogehoge") )
	}
}

func BenchmarkWrite(b *testing.B){
	hogehoge := []byte("hogehoge")
	for i := 0 ; i < b.N ; i++ {
		ioutil.Discard.Write( hogehoge )
	}
}

func BenchmarkWriteStringReal(b *testing.B){
	fd,_ := os.Create("nul")
	fd.Close()
	for i := 0 ; i < b.N ; i++ {
		io.WriteString(fd,"hogehoge")
	}
}
```

* ソースファイル名は、テスト系の機能なので「`_test.go`」とつけておくこと

```run.cmd
go test -bench .
```

```
goos: windows
goarch: amd64
pkg: github.com/zetamatta/experimental/bench
BenchmarkWriteString-4          100000000               18.8 ns/op
BenchmarkFmtFprint-4            20000000                74.7 ns/op
BenchmarkWriteWithStr2Byte-4    50000000                28.9 ns/op
BenchmarkWrite-4                500000000                3.61 ns/op
BenchmarkWriteStringReal-4      10000000               124 ns/op
PASS
ok      github.com/zetamatta/experimental/bench 8.550s
```

結論

* 速い ：Write([]byte) ＞ io.WriteString ＞ fmt.Fprint：遅い（これは当然の結果）
* ただし、下手に Write([]byte("...") とキャストを入れるよりは io.WriteString("...") の方がマシ
【PHP】正規表現で置換するpreg_replace【サンプルコード付き】

## はじめに
プライベートでLaravelを勉強しています。
PHPを完全に習得している訳ではないので、ちょくちょく調べ物をしながら進んでいます。
調べたものをアウトプットしたいので、備忘録として残しておきます。


## preg_replaceを使う
結論から言うと、下記のような使い方です。

```php
preg_replace($正規表現パターン, $置換後の文字列, $置換対象)
```
<br>
## 例として書いてみた
サンプルだけ見てわかった気になると危ないので、例として書き換えてみました。
h1タグをaタグに置換するコードです。

```php:substitution.php
<?php

$str = '<h1>Google.com</h1>へのリンクです';
$pattern = '/<h1>(.*)<\/h1>/u';
$replace = '<a href="http://$1">$1</a>';

$content = preg_replace($pattern, $replace, $str);

echo $content;

?>
```
<br>
結果はこんな感じです。

```php

Google.comへのリンクです
```

## 感想
preg_replace()というより、正規表現に苦戦しました。
がっつり正規表現を使った経験がないので、取り組むたいです。

### 参考
- [【PHP入門】正規表現で置換する方法](https://www.sejuku.net/blog/22175)
- [PHPの正規表現 初心者向け基本～ 早見表掲載！](http://wepicks.net/phpref-regular_expression/)
jQuery SmartWizard4でウィザード形式ぽいフォームを作る

#SmartWizard4でウィザード形式みたいな入力フォームを作る

## 背景

項目の多いWeb入力フォームを作っていて、見通しが悪いという意見があったのでWindowsとかでよくあるウィザード形式でカテゴリ別にぼちぼちと入力していくようにしたかった。
ググるとjQueryを使ったライブラリがいくつかあるけど、[デモ](http://techlaboratory.net/smartwizard/demo)をみるとテーマを切り替えられたりできて見栄えもいい[jQuery Smart Wizard](http://techlaboratory.net/smartwizard)を選定…したのだが、よくあるバージョン間の断絶的な罠があったのでメモ的に。

## 前提ライブラリ

2017.5.1現在、npmで入れた時点のもの。

- jQuery : 3.3.1
- Bootstrap : 4.1.1
- BootstrapValidator: 0.11.9
- SmartWizard : 4.3.1

SmartWizardについてはドキュメント等検索するとけっこうhitするもののSmartWizard3を前提とされているものも、バージョンがかかれていないときがあるので注意が必要。

## インストール

雑だけどザックリと。

```
npm install jquery bootstrap bootstrap-validator smartwizard
```

## 使う

基本的な部分はExampleがしっかりしてる。
そして詳しい部分は [公式ドキュメント](http://techlaboratory.net/smartwizard/documentation) をあたるの
が一番なのだが、なぜかpublic methodの記述がなくeventとparameterのことだけでコメント欄も困ってる感。

つたないJavascript力でなんとか読み解くと、ページ遷移についてBootstrapValidatorのエラー有無に頼ってる。
逆にいえばそのあたりの使い方はBootstrapValidatorの流儀におまかせ。

### 基本設定した部分

デフォルトだとカーソルキーの左右でステップ状態の移動ができてしまうので、keyNavigationをfalseにした。
また前後のボタンは日本語にしようとしたところ、SmartWizard3と記述方法がかわっているので、下記のとおりに。

```:javascript
$('#smartwizard').smartWizard({
 selected: 0,
 keyNavigation: false,     // カーソルキー左右でステップを移動しないように 
 theme: 'arrows',
 transitionEffect: 'fade', // fade か slide が選べる
 lang: {
  next: "次へ",            // Nextボタンの表面
  previous: '戻る'         // Prevボタンの表面
 },
 toolbarSettings: {
  toolbarPosition: 'bottom'
 }
});
```

ちなみにSmartWizard3だとパラメータで下記のとおり設定していた様子。

```:javascript
//古い書き方
    labelNext:'Next', // label for Next button
    labelPrevious:'Previous', // label for Previous button
```

### 別の関数からステップを遷移させる

前述のPublic Methodだが、ソースを読むと書いてある。
SmartWizard3でいうところの goForward() 等にあたる（とおもわれる）

```:javascript
//$("#smartwizard").smartWizard(メソッド名);

$("#smartwizard").smartWizard('next'); //次のステップに移動
$("#smartwizard").smartWizard('prev'); //前のステップに戻る
$("#smartwizard").smartWizard('reset'); //ステップをリセット
$("#smartwizard").smartWizard('theme', 'dots'); //テーマを切り替える
```
というわけで、何らかの入力をうけて当該ステップから次に移るには下記のようにする。

```:javascript
$("#hoge_button").on('click', function(){
  $("#smartwizard").smartWizard('next');
});
```

validation結果を反映してくれるので、強制的に次ステップに移行するわけではないので安心。
【コピペで使える】WPで管理画面のカテゴリをまとめ上げた時にスコープの神秘さに触れた

#\#やった事
WordPressの投稿時に、カテゴリ選択がとてもやりにくそうだったので、トグルでうまくまとめてみた。
以下のようにぐちゃぐちゃなまま表示される。
<img width="281" alt="スクリーンショット 2018-05-04 10.25.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/03f2d3a4-c55c-2399-317f-8995deac2638.png">

これを以下のように実装しました。
<img width="280" alt="スクリーンショット 2018-05-04 10.27.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/6b541c6a-b0a9-40d2-3194-ebaf7253b2ef.png">

ポイントとして、以下が挙げられます。
1.子カテゴリを持っているカテゴリを選択させない（ユーザーの動きの中で該当記事が見つかりにくくなってしまう）
2.子カテゴリを持っていない階層になった場合のみ、選択できるようにする
3.見る必要のないカテゴリは非表示にしておく

#\#ソースコード
```functions/admin_custom.php
<?php
add_action( 'admin_head','category_toggle' );

// 投稿画面のカテゴリをトグルで見やすくするメソッド
function category_toggle(){
?>
<script type="text/javascript">
  jQuery(function() {
    jQuery( '.categorydiv div.tabs-panel' ).css({'max-height':'100%'});
    jQuery( '#categorychecklist > li').each(function()
    {
      // 大カテゴリが中カテゴリを持っていたら、トグルでまとめる
      if(jQuery(this).children('ul').hasClass('children'))
      {
        jQuery(this).children('label').before('<span class="toggle-switch">▼</span>&nbsp;').css({'cursor':'default'});
        jQuery(this).children('label').children('input').css({'display':'none'});

        jQuery(this).children('ul').children('li').each(function(){
          // 中カテゴリが小カテゴリを持っていたら、トグルでまとめる
          if(jQuery(this).children('ul').hasClass('children'))
          {
            jQuery(this).children('label').before('<span class="toggle-switch">▼</span>&nbsp;').css({'cursor':'default'});
            jQuery(this).children('label').children('input').css({'display':'none'});
          }
          
          jQuery(this).children('ul').children('li').each(function(){
            // 小カテゴリが小小カテゴリを持っていたら、トグルでまとめる
            if(jQuery(this).children('ul').hasClass('children'))
            {
              jQuery(this).children('label').before('<span class="toggle-switch">▼</span>&nbsp;').css({'cursor':'default'});
              jQuery(this).children('label').children('input').css({'display':'none'});
            }
          });
        });
      }

　　　　　　　　　　　　　// トグルでまとめた子カテゴリ達を非表示にする
      jQuery('#categorychecklist > li > .children').hide();
      jQuery('#categorychecklist > li > ul > li > .children').hide();
      jQuery('#categorychecklist > li > ul > li > ul > li > .children').hide();
    });

　　　　　　　　// トグルをクリックした時に隠していた子カテゴリたちを再表示
    jQuery('.toggle-switch').click(function () {
      jQuery(this).siblings('ul').toggle("fast");
    });
  });
</script>
<?php
}
```

とてもカオスな感じになってますが、僕の中では、以下の部分にスコープの神秘的さを感じました。
```
// 大カテゴリが中カテゴリを持っていたら、トグルでまとめる
// 中カテゴリが小カテゴリを持っていたら、トグルでまとめる
// 小カテゴリが小小カテゴリを持っていたら、トグルでまとめる
```
子カテゴリを持っている`<li>`の中に`<ul>`が存在していて、その`<ul>`内にある`<li>`に対してeachをかけています。
よって、`jQuery`の引数である`this`を使っていけば、eachするところから終了までが全て同じ記述になるのです！！！
処理をまとめていけば、簡単なファンクションになり、カテゴリの階層がどんなに深くても適応することができます。

#\#学んだこと
ブログサイトのリニューアル業務を行ったのですが、全300カテゴリ近くあり、階層は最初多くて5階層もありました。。。
カテゴリは管理者のためのものではなく、ユーザーが興味のある記事を探しやすくするためのツールであると言うことを学んだ気がする。
また、ネストをしすぎて新人時代（今でも新人）には無頓着だった「リーダブルコード」の概念を気にするようになった。

#\#最後に
当たり前のことを記述しましたが、この実装をする際に同じことをしている人いないかなーって思って調べていたのですが、意外と階層が深いバージョンで実装している人はいなかったので、今回のリニューアル対象のブログサイトが一般的じゃないと言うことですね。笑
adbコマンドが利用可能な環境を作る

#adbコマンドを利用するための環境の作り方
##手順概要
下記の「参考にしたサイト」通りの手順でadbコマンドが使えるようになります。

##手順詳細
Android SDKに内包されている「E:\Android\sdk\platform-tools」に環境変数のPathを通すだけ。
（Android SDKをダウンロードしていない方は、「platform-tools」のみをダウンロードすることも可能です。）

#参考にしたサイト
もっと簡単！adbコマンドを使えるようにする方法－ダウンロードして解凍してパスを通すだけでOK
https://www.orefolder.net/blog/2017/03/platform-tools/
OCamlでFizzBuzzを書く

OCamlの勉強を始めました。
まず最初に基本のFizzBuzzを書こうと思います。

# FizzBuzzとは

FizzBuzzとは、

* 3の倍数の時は、Fizz
* 5の倍数の時は、Buzz
* 3の倍数かつ5の倍数の時は、Fizz Buzz
* それ以外は数字を出力

するプログラムです。

基本的な分岐やループがわかっていることが確かめられます。

# 関数

関数の書き方は、

```ocaml
let f a b =
    a + b ;;
```

と書けます。

```ocaml
# f 1 2;;
- : int = 3
```

関数呼び出しは上記の様になります。引数にはかっこはつきません。

## 分岐

分岐はif文が使えます。

```ocaml
# let max a b =
    if a > b then a
    else b;;
```

と書けば良いです。
`` if (条件) then (実行する文)``　となります。


## 再帰

再帰には関数に `rec` とつける必要があります。
下記に階乗のプログラムを載せておきます。

```ocaml

# let rec fact a b =
  if b == 1 then a
  else fact (a * (b - 1)) (b - 1);;
val fact : int -> int -> int = <fun>
# let f a =
    fact a a;;
val f : int -> int = <fun>
# f 6;;
- : int = 720
```

関数名の前に　`rec`　をつけると再帰呼び出しが可能になります。

# FizzBuzz実装

ちなみにOCamlで剰余算は `mod` です。

```ocaml:fizzbuzz.ml

let rec fizzbuzz n max =
  if n mod 15 == 0 then Printf.printf "fizz buzz\n"
  else if n mod 3 == 0 then Printf.printf "fizz\n"
  else if n mod 5 == 0 then Printf.printf "buzz\n"
  else Printf.printf "%d\n" n;
  if n < max then fizzbuzz (n + 1) max

let () =
  fizzbuzz 1 30
```

最大値はハードコードしてしまいました。
以下に結果を出します。

```shell-session
$ ocaml fizzbuzz.ml
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizz buzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizz buzz
```
Windows Subsystem for Linux(Ubuntu)からWindows側のファイルパーミッションを変更

Windows 10 にアップデート(1803)がきて Windows Subsystem for Linux(Ubuntu) で Windows側のファイルパーミッションが変更できるようになったので試してみました。

#環境
Windows 10 April 2018 Update バージョン 1803
Ubuntu 16.04.4 LTS

#パーミッション変更

Windows 10 をアップデートして早速試してみるもパーミッションが変更できない・・・。

こちらの記事を参考にして変更できるようになりました。
http://ascii.jp/elem/000/001/623/1623594/

いったんアンマウントして metadataオプションをつけてマウントするとパーミッションが変更できるようになります。

```bash:Cドライブをマウント
$ sudo umount /mnt/c
$ sudo mount -t drvfs C: /mnt/c -o metadata
```

#マウントオプション設定

ただ、上記の方法ではWSLを閉じると設定が元に戻ってしまいます・・・。

こちらの記事を参考にwsl.confを作成することで、起動時にマウントオプションを設定できるようになりました。
http://ascii.jp/elem/000/001/634/1634120/

最初は /etc/wsl.conf ファイルがないので新しく作成します。

```bash:
$ sudo vim /etc/wsl.conf
```

以下のように設定することで起動時に自動でマウントオプションが設定されるようになります。

```:/etc/wsl.conf
[automount]
enabled = true
options = "metadata"
mountFsTab = false
```

#デフォルトパーミッション

デフォルトのファイルパーミッションは「666」、ディレクトリパーミッションは「777」になっていますが、
これをファイルは「644」、ディレクトリは「755」で作成されるようにするには.profileの以下の行のコメントを削除します。

```:.profile
umask 022
```
YOLOの使い方

YOLOの使い方

YOLOは物体認識のアルゴリズムで詳しくは[公式ページ](https://pjreddie.com/darknet/yolo/)を見てください。

# 事前準備

opencvが必要なので先に入れる

```
$ sudo apt-get install libopencv-dev -y
```

# ダウンロードとMake

まずダウンロードする。

```
git clone https://github.com/pjreddie/darknet
cd darknet
```

次に、Makeファイルを変更する

```
$ nano Makefile
```

GPUとCUDNNとOPENCVを使いたいので`1`にする。
```
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
```
Makeする

```
$ make
```

# 学習済みNetをダウンロードする

場所は、darknetのフォルダ内でいいです。

```
wget https://pjreddie.com/media/files/yolov3.weights
```

# Webカメラで実行する

Logicoolのコスパがいいカメラをつないで以下のコマンドを実行する。

```
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
```

ホストでも、docker上でも、リモートPC上のdockerコンテナ上でも動きました。

Pythonでの実行を今後追記します。

# 追記 2018.5.5

PythonでのYOLOv3のWebカメラ実行はできませんでした。

- jpegの実行と物体認識はできた。
- darknet.pyだけでなく，CコードおよびMakefileの構造を理解して変更する必要がある。

以下，参考にしたページです。

<https://ja.stackoverflow.com/questions/43352>

このページを参考にしてpythonでjpegまでできました。

<https://github.com/pjreddie/darknet/issues/289>

<https://github.com/braca51e/nparray_image_darknet>

ここを参考にするとyolov2だとwebカメラで物体認識できるそうです。

時間があれば，またトライしてみます。
タイムラインでいいね機能をつけたい！！~後編~

#前説
ここ最近サボっていたので、気を取り直して書いていきます。

#非同期通信
https://qiita.com/networkyohan69/items/40cf567880557148d8f4
上記の記事は同期通信を行った時のいいね！取得です。こちらでいいねボタンを押す▶︎リロード▶︎データベースに保存までを実装できました。

いくつか実装パターンがあると思いますが、分類分けしてみました。

#Aパターン、Ajaxでゴリゴリ
<img width="655" alt="スクリーンショット 2018-05-04 8.45.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/5c1bf42b-989f-4c2e-986a-9257600b1407.png">

https://qiita.com/yukisaibai/items/0a84e8c02f423faa7891
上記の方はゴリゴリ書いてらっしゃいます。

##メリット
- ajaxの勉強になる
- 応用性が効く

##デメリット
- 学習コスト

新しいものにチャレンジしたい人におすすめ

#Bパターン、Railsでゴリゴリ
<img width="678" alt="スクリーンショット 2018-05-04 8.39.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/a2db56f5-f432-61cd-1c3f-96d770412493.png">

僕はこちらで書いてました。
#メリット
- railsをもっと勉強したい
- railsやっている人ならこちらの方が早い？

#デメリット
- 応用性

##コード

```html:_product.html.erb
<li id="product-<%= a_product.id %>" class="collection-item" >
  <span class="timestamp"></span>
  <div class="like-button-<%= a_product.id %>">
    <%= render 'products/likes' , a_product: a_product %>
  </div>
</li>
```
```html:_like.html.erb
<span class="like">
  <% if current_user %>
    <% if a_product.user_exist?(current_user) %>
        <div class = "action">
      <!--すでにいいね！を押してるかどうかの判定　それに応じて画像を変更している-->
           <%= form_for [a_product,@like],url: product_like_path(a_product.id,@like.id),method: :delete, remote: true do |f| %>
            <%= image_submit_tag("like.png",class: "main_img" )%>
           <% end %>
        </div>

    <% else %>
        <div class = "action">
        <!--, url: product_likes_path(a_product.id)はpathが複数形なのでなくても良い-->
          <%= form_for [a_product, @likes], method: :post, remote: true do |f| %>
            <%= image_submit_tag("unlike.png",class: "main_img" ) %>
          <% end %>
      </div>
    <% end %>
  <% end %>
</span>
```

form_for,remote:trueで非同期通信を用いてパスやメソッドを投げている。

```javascript:create.js
$(".like-button-<%= @product.id %>").html("<%= j(render partial: 'products/likes', locals: { a_product: @product }) %>")
```

_product.html.erbのclass名を指定して、render先のhtml.erbを読み込んでいる。

```javascript:destroy.js
$(".like-button-<%= @product.id %>").html("<%= j(render partial: 'products/likes', locals: { a_product: @product }) %>")
```
_product.html.erbのclass名を指定して、render先のhtml.erbを読み込んでいる。

##Bパターンの流れ
- いいね押す
- form_for,remote:trueでデータベースに非同期で変更
- (いいね画像の変更をしてほしい)
- 非同期で_like.html.erbを読み込む
- データベースの情報が反映されていいねの切り替えがうまくできた

Aパターンのコードでは画像の切り替えを行っているが、Bパターンではデータベースの情報を元に非同期でパーションされた部分テンプレートを読み込んでいるという感じですね。

##苦戦原因
- どのいいねを押したか、固有のidを取得できない
  - $(".like-button-<%= @product.id %>")とすることによってどのいいねボタンのclassを読み込むのか明確化させる
  - 最初、なぜかidで指定していた（固有のproduct.idを持つので別にいいが、念のため)
- javascriptが動かない
  - render先の_like.html.erbを読み込むはずが、対象の_like.html.erb内のクラスを指定していたので無限ループ状態になっていた。

<img width="495" alt="スクリーンショット 2018-05-04 9.11.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/19e3eff0-fba8-8071-325a-766574b62e03.png">

##終わりに
気づいたらBパターンで書いていた。
- Railsのform_forの使い方を見つめ直せたのでよかった。　
- rubyがしっかり書けていないなあと猛省。
- javascriptでしっかりコードを書いていきたいなあと思いました。
M5GO で遊んでみた

# M5GO IoT Starter Kit とは

![m5go](http://buym5go.m5stack.com/images/p1.png)

M5Stack をLEGOっぽい感じにして、GroveなExtensionをつけて売り出されている、便利でなんだかかわいいやつです。

http://buym5go.m5stack.com/

# 最初に軽くひっかかること

+ 電源をきるときは、電源ボタンを2回押すこと。（1回押すだけだと、再起動）

+ オンライン開発環境のURLは、LCDには m5go.com と表示されるのだけれど、QRコードを読むと、io.m5go.com だから パソコンやMacから開くときは http://io.m5go.com/ をアドレス指定するよう注意すること。というか、完全なURLは、http://io.m5go.com/#/xxxxxxxxxxxx となっており、xxxxxxxxxxxx は、固有のIDなので、QRコードをきちんと読んで、もしパソコンのブラウザから開く際も、きちんとそれを入力する必要があるような気がする。

# 調査中

+ RGB LED Extension が、Guide の デモプログラム を試すも光らない。
    + まだ Reference Document がみあたらないので、初期不良なのか、デモプログラムにバグがあるのかがわからない。調査はすこし後回し
        + ソースコードを発見 https://github.com/m5stack/M5GO/blob/master/lib/units.py
            + 適当に書いたら、LEDは無事光った。後ほど整理整頓する。   
    + もし、光っている方いたら、どのように光るのか、コメントか何かで教えていただけるとうれしいです。
    + デモ動画をみつけたけど、RGB LED Extension は含まれてない状態だった。https://twitter.com/M5Stack/status/989131203755229185

+ とりあえずの RGB LED Extension の光らせ方

```
from m5stack import *
import units

lcd.clear()
lcd.print("Hello World!")

rgb = units.RGB(units.PORTB)

while True:
    rgb.setHSB(0,1,.2,1)  # 赤
    rgb.setHSB(120,1,.2,2)  # 緑
    rgb.setHSB(240,1,.2,3)  # 青
```



+ http://cloud.m5stack.com に Add Device するための Check Code (6桁の英数字）がみあたらない。
    + Guide を Skip したあとの、左ボタン [Check Code] が怪しいのだけれど、左ボタンを押しても、なにも表示が変わらない。
![5-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/57516/b314e53a-8858-63ff-4f06-ce25b8b87f89.jpeg)

+ このあたりについて、forum にいい情報がいないか、さがしてみる。http://forum.m5stack.com/
    + が、2018.5.4 9:00 (JST) 現在、 'm5go' で検索しても1件もヒットしない。
VS Code1.23の新機能 - インデントガイドのハイライト

# Visual Studio Code 1.23の新機能
## インデントガイドのハイライト

https://code.visualstudio.com/updates/v1_23#_highlighted-indent-guides

現在のカーソル行の一番内側のインデントのインデントガイドがハイライトされるようになった。

![indentguide.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/d7292e73-06b3-169f-8f76-9745d0d1d79f.gif)

ちなみに、設定`editorIndentGuide.activeBackground`で色を変えられるような説明が書いてあったが、Windows版には今のところ該当する設定は見当たらない。
Cドライブ直下にある消してもいいフォルダ

- Windowsを使っていると、Cドライブの容量が逼迫してきて困りますよね？（256GBのSSD使っている私が悪いんですが😥）
- 無駄に容量食っている割に、必要ないフォルダが結構あったのでまとめました😁
- 多分大丈夫だと思いますけど、削除するときは自己責任でお願いしますm(_ _)m

###windows.oldフォルダ
容量：10G～20Gくらい
Widowsアップデートした際にできる前バージョンのバックアップフォルダです
前バージョンに戻す必要がないなら削除しちゃって構いません
[スタートメニュー]>[Windows管理ツール]>[ディスクのクリーンアップ]
で「以前のWindowsのインストール」を選択して消すのが安全です❗

###$WINDOWS.~BTフォルダ
Windowsアップデートする際に作られるインストールファイルです
こちらも[ディスクのクリーンアップ]で「一時Windowsインストールファイル」を選択して消せます❗

###AMDフォルダ
容量：1G～5Gくらい
AMD製品(Radeonのグラフィックボードなどなど)のソフトウェアをインストールする際にできた一時フォルダです
削除しちゃって構いません。フォルダごとゴミ箱に捨てましょう❗

###MATSフォルダ
容量：数百MB
Microsoft easy fixなどを使用したときにできるバックアップフォルダです
削除しちゃって構いません。フォルダごとゴミ箱に捨てましょう❗

###$GetCurrentフォルダ
Windows10 Anniversary Updateをするときに作られた（と思われる）フォルダです
削除しちゃって構いません。フォルダごとゴミ箱に捨てましょう❗

###$WINRE_BACKUP_PARTITION.MARKERファイル
Windows７からWindows10にアップグレードしたときに作られたファイルです
削除しちゃいましょう❗

###eula.xxxx.txtとかinstall.res.xxxx.dllとか
Visulal C++をインストールしたときにできることがあるらしいファイルです
削除しちゃいましょう❗
OpenStackをESXi 6.5上で立ち上げる時にハマったこと

自分のための備忘録

- ESXi側でのNested Virt設定
- OpenStack側でのKVM有効化
    - Booting from Hard Disk.. で止まる件の解消
- その他
    - packstackでのインストール時、次のオプションのどれかでネットワークが死んだ。時間がなかったので深堀はせず。
        - `--neutron-fwaas=y`
        - `--os-neutron-vpnaas=y`
        - `--os-trove-install=y`
        - `--os-panko-install=y`

# ESXi 6.5

## 全体

```:/etc/vmware/config
vhv.enable = "TRUE"
```

```bash
/etc/init.d/hostd restart
```

- http://zokibayashi.hatenablog.com/entry/2015/04/17/005106

## VM

- CPUのハードウェア仮想化にチェック
- 仮想マシンオプション
    - 構成パラメータ
        - hypervisor.cpuid.v0 : FALSE (多分いらない)
- BIOS設定とかもいるのかな～っと思ってBIOSも確認したけど設定箇所自体無かった
- VMが属してるvSwitchで無差別モード（promisc）の承認が必要かも


# OpenStack / CentOS 7.4

```bash
# 2.0GHz*4Core*2CPU 64GB RAMでインストールに3000秒くらい
packstack ¥
  --allinone            ¥
  --provision-demo=n    ¥
  --os-neutron-ovs-bridge-mappings=extnet:br-ex      ¥
  --os-neutron-ovs-bridge-interfaces=br-ex:ens192    ¥
  --os-neutron-ml2-type-drivers=vxlan,flat           ¥
  --os-ssl-cert=/etc/pki/tls/certs/domain.tld.cer    ¥
  --os-ssl-key=/etc/pki/tls/private/domain.tld.key   ¥
  --os-ssl-cachain=/etc/pki/tls/certs/ca.cer         ¥
  --nova-ssl-cert=/etc/pki/tls/certs/domain.tld.cer  ¥
  --nova-ssl-key=/etc/pki/tls/private/domain.tld.key ¥
  --os-horizon-ssl=y    ¥
  --os-manila-install=y ¥
  --os-sahara-install=y ¥
  --os-heat-install=y   ¥
  --os-magnum-install=y ¥
  --os-neutron-lbaas-install=y ¥
  --cinder-volumes-create=n    ¥
  --default-password=hogefuga

. keystonerc_admin
neutron net-create external_network --provider:network_type flat --provider:physical_network extnet  --router:external
neutron subnet-create --name public_subnet --enable_dhcp=False --allocation-pool=start=192.168.10.100,end=192.168.10.150 --gateway=192.168.10.1 external_network 192.168.10.0/24
openstack image create --file CentOS*.qcow2 --container-format bare --disk-format qcow2 --public CentOS7
openstack project create --enable internal
openstack user create --project internal --password `grep OS_PASSWORD keystonerc_admin | awk -F= '{print $NF}' | sed -e "s@'@@g"` --email admin@domain.tld --enable internal
openstack role add --project internal --user internal _member_
sed -e "s@admin@internal@g" keystonerc_admin > keystonerc_internal
. keystonerc_internal
neutron router-create router1
neutron router-gateway-set router1 external_network
neutron net-create private_network
neutron subnet-create --name private_subnet private_network 192.168.100.0/24
neutron router-interface-add router1 private_subnet
openstack keypair create host --public-key .ssh/id_rsa.pub
openstack security group rule create --protocol icmp --ingress default
openstack security group rule create --dst-port 22 --protocol tcp --ingress default
```

ここまでの設定でも動きはするものの`accel=tcg`のせいか？異常に重い。
http://uramocha02.blogspot.jp/2016/06/kvm3.html

調べてみるとKVMを使えという回答が主流なので使おうとするが、`booting from hard disk`と表示される部分でスタックする。
下記にhw_machine_typeを設定しろというコメントがあったため設定してみると、確かに改善された。
https://bugs.launchpad.net/kolla/+bug/1688496

```bash:/etc/nova/nova.conf
virt_type=kvm
#virt_type=qemu

#hw_machine_type=<None>
hw_machine_type= x86_64=pc-i440fx-rhel7.2.0
```

ほかの設定可能値は`/usr/libexec/qemu-kvm -machine help`で確認可能。
GithubのReadmeに荒くないgifを作成から貼り付けまで

この半年の成果物をGithubにあげるのに感覚的にわかってもらう為にgifをどうしても貼りたかった。
ほぼ他の方のPostと内容は同じですが、個人的に忘れると思うので備忘録を残す。
Githubにすでにリポジトリがある前提で話を進めます。

# ffmpeg、Image Magicのインストール
- **ffmpeg** - 無料で使える動画や音声のエンコーダです。
- **Image Magick** - スクリーンショットや画像の圧縮や変換などをしてくれます。

どちらもCLI上で操作できます。

homebrewでインストールて行きます。
※homebrewがインストールがまだの方は[こちらから](https://brew.sh/index_ja)

```
brew install ffmpeg
brew install imagemagick
```

# .gifへ変換
Quicktime Playerの画面収録作った.movや.mp4の動画ファイルをgifに変換します。

```
cd 動画のあるディレクトリ
ffmpeg -i sample.mp4 -an -r 10 %04d.png  // 10frames/secでpng作成
convert *.png -resize 40% output_%04d.png  // 作成したpngを40%にリサイズ
convert output_*.png result.gif  //  gifに変換
```

そうするとoutのフォルダにresult.gifが生成される。

#  リポジトリに貼り付け
Githubに.gifをあげる方法はいくつかある。

- ブランチを切ってそこにアップロード
- Github wikiにアップロード
- issueにアップロード ←今回はこれ

issueを新しく作ってそこに先ほど作ったファイルをドロップ。
上限が10MBまでのなので注意！

<img src="https://qiita-image-store.s3.amazonaws.com/0/229570/dc5fbc5b-0476-4b76-fd56-48a863f52be8.png" width=50%>

すると上のURLがでるのでそのままReadmeにコピー。

### 完成!

![qiita.gif](https://qiita-image-store.s3.amazonaws.com/0/229570/29d0c763-9936-e535-9ae5-a7f1a36099e4.gif)



# 参考 & メモ
- [ffmpegとimageMagickを使ってmp4からいい感じにgifに変換する](https://qiita.com/tomoima525/items/acab0f7badf6fa6f34ad)
- [macでffmpegを導入してmovファイルをgifファイルへ変換するところまで](https://qiita.com/Ryosuke-Hujisawa/items/6a1c47d31ac299dc1c46)
- [GitHub のREADME にgif 画像を表示する1番簡単な方法](http://uchimanajet7.hatenablog.com/entry/2017/08/14/083001)
- [わかりやすいREADME.mdを書く](https://deeeet.com/writing/2014/07/31/readme/)
- [EMOJI CHEAT SHEET](https://www.webpagefx.com/tools/emoji-cheat-sheet/)
- [Markdown記法 チートシート](https://gist.github.com/mignonstyle/083c9e1651d7734f84c99b8cf49d57fa)
AWS VPCにおけるフルマネージドサービスの配置設計

## 概要

VPC設計時において、フルマネージドサービスをどのサブネットに配置するべきか検討した。

## サブネットの設計

サブネットは一般的に2階層、あるいは3階層に分けて設計することが多い。

| 階層　| インバウンド | アウトバウンド | 概要　|
|:---:|:---:|:---:|:---|
| public | ○ | ○ | グローバルIPを持つことでインターネットと通信ができる　|
| protect | × | ○ | NAT経由でアウトバウンド通信ができる　|
| private | × | × | インターネットに接続されていない閉ざされたネットワーク　|

図にするとこんな感じ。

![Untitled Diagram (4).png](https://qiita-image-store.s3.amazonaws.com/0/27454/2a1fee69-612c-f22b-a315-06c14df776d4.png)

## NTPの考慮は必要か?

VPC内にEC2を設置する場合、NTPの利用を考慮すると、インスタンスは `public`　あるいは `protect` に配置する必要がある (※Amazon Time Sync Serviceを使えば `private` にも配置可能)。

ではサブネットを3階層モデルで設計した場合、RDSを始めとするフルマネージドサービス (ElastiCacheやRedshift) は `private` には置けないのか?

サポートに問い合わせたので結論だけ述べると、NTPの考慮に関して言えば `private` サブネットに配置することは問題ないとのこと。

フルマネージドサービスにおけるNTPの動作はオフィシャルに明示されてない (ように見える) が、時刻調整に関してはインターネットにアクセスすることはないらしい。