OmniAICreator/Qiita-1.07M huggingface dataset:
ウェブキャッシュサーバnuster入門-3(管理)

前回は [ウェブキャッシュサーバnuster入門-1(基本)](https://qiita.com/kbe/items/d366d7a387de3d18fb96) と[ウェブキャッシュサーバnuster入門-2(Purge)](https://qiita.com/kbe/items/f51e50b2df78fcca4379)でnusterを簡単に紹介しました。今回はcache管理について紹介したいと思います。

仕様は変更されるかもしれないので、最新のものはhttps://github.com/jiangwenyuan/nuster/blob/master/README.md を参照してください。

# cache 管理

cacheはランタイムでAPIで管理できます。まずは`uri`を定義する：

    nuster cache on uri /nuster/cache

そして、このURIにたいしてHTTPを投げることで、管理できます。

## cacheを有効無効にする

***headers***

| header | value           | description
| ------ | -----           | -----------
| state  | enable          | 有効にする
|        | disable         | 無効にする
| name   | nuster-rule NAME | NAMEという名前のcache-ruleを有効無効にする
|        | proxy NAME      | NAMEという名前のProxyのすべてのcache-ruleを
|        | *               | すべてのcache-rulesを

***Examples***

* cache-rule r1を無効にする

  `curl -X POST -H "name: r1" -H "state: disable" http://127.0.0.1/nuster/cache`

* proxy app1bのすべてのcache-ruleを無効

  `curl -X POST -H "name: app1b" -H "state: disable" http://127.0.0.1/nuster/cache`

* すべてのcache-ruleを有効

  `curl -X POST -H "name: *" -H "state: enable" http://127.0.0.1/nuster/cache`

## TTL

cacheのTTLを変更する、既存のキャッシュは変更されません。

***headers***

| header | value           | description
| ------ | -----           | -----------
| ttl    | new TTL         | TTLに変更
| name   | cache-rule NAME | NAMEという名前のcache-ruleのTTLを変更
|        | proxy NAME      | NAMEという名前のProxyのすべてのcache-ruleを
|        | *               | すべてのcache-rulesを

***Examples***

```
curl -X POST -H "name: r1" -H "ttl: 0" http://127.0.0.1/nuster/cache
curl -X POST -H "name: r2" -H "ttl: 2h" http://127.0.0.1/nuster/cache
```

## stateとTTLを同時に変更

```
curl -X POST -H "name: r1" -H "ttl: 0" -H "state: enabled" http://127.0.0.1/nuster/cache
```

## stats

`curl http://127.0.0.1/nuster/cache`

## Output

* used\_mem:  HTTPリスポンスが使っているメモリ
* req\_total: トータルrequest数、cacheが有効にしてないproxyのrequestは含まない
* req\_hit:   cache hitのrequest数
* req\_fetch: バックエンドから取得して返すrequest数
* req\_abort: abrotしたrequest数
[Xcode] agvtoolでバージョン管理

# agvtoolとは
Apple Generic Versioning Toolの略。バージョン・ビルド番号設定やインクリメントをしてくれるもの。fastlaneなどで管理している場合はあまり使う場面はないかもしれないが、target毎にいちいち設定するのが面倒な場合におすすめ

# 設定方法
 PROJECT > Build Setting > Versioning > Versioning System で Apple Generic を選択

# 更新方法
プロジェクトルートで以下のコマンド実行してバージョン、ビルド番号の更新をする

バージョン番号

```
agvtool new-marketing-version <versString>
```

ビルド番号

```
agvtool new-version -all <versString>
```

# その他のコマンド
```
// Current Project Versionの更新
agvtool new-version <versString>

// ビルド番号のインクリメント
agvtool next-version -all

// Current Project Versionの確認
agvtool what-version

// 各Info.plistのバージョン確認
agvtool what-marketing-version
```

# Info.plistが見つからないというエラー
`Cannot find "....Info.plist" `と言われたらパスが間違ってる可能性があるので
TARGETS > Packaging > Info.plist File でパス設定をする
Espruino HTTP POST

[Espruino](https://www.espruino.com/) で HTTP GET リクエストは[例がある](https://www.espruino.com/Internet)ので簡単にできる。POST でデータ送信する例がなかったので、調べたメモ。

```javascript
var data = JSON.stringify({"metrics1":10.0});
var request = require("http").request(
	{host:"harvest.soracom.io", method:"POST", path:"/", headers:{
		"content-type":"application/json",
		"content-length": data.length,
		"connection":"close"
	}},
	response=>{
		var content = "";
		response.on("data", data=>{
			content += data;
		});
		response.on("close", ()=>{
			console.log(content);
		});
		response.on("error", err=>{
			console.log("error", err);
		});
	});
request.write(data);
request.end();
```

`Content-length` は、サーバ側の実装の都合上、たいてい必要になる。`Connection: close` は、開発時サーバが single thread の時のための安全設定。
E2E testをheroku ciで実施する

heroku ciでe2eテストを実施


## 構成
* heroku ci
* php7
* phpunit
* facebook/webdriver
* chromedriver

### Setting
* heroku のbuildpackで提供されるgoogle chromeはbinaryの場所が環境変数GOOGLE_CHROME_SHIMで定義されているディレクトリにあるのでwebdriverにsetする必要がある
* seleniumで入力などのオペレーションさせたい場合はheroku-buildpack-xvfb-google-chromeを使う
* heroku-buildpack-xvfb-google-chromeを使う場合はheroku-16のstackでは動かないcedar-14を使う

## Heroku settings


``` composer.json
{
  "name": "e2e",
  "description": "This app does one little thing",
  "stack": "cedar-14",
  "env": {
    "GOOGLE_CHROME_CHANNEL":"stable"
  },
  "environments": {
    "stack": "cedar-14",
    "test": {
      "buildpacks": [
        { "url": "heroku/php" },
        { "url": "https://github.com/heroku/heroku-buildpack-chromedriver" },
        { "url": "https://github.com/heroku/heroku-buildpack-xvfb-google-chrome" }
      ],
      "scripts": {
        "test": "phpunit tests"
      }
    }
  }
}

```

## Test example

``` E2eTest.php
<?php
use PHPUnit\Framework\TestCase;
use Facebook\WebDriver\Chrome\ChromeDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
class E2eTest extends TestCase
{

    protected $driver;

    protected function setUp()
    {
        putenv('webdriver.chrome.driver=/app/.chromedriver/bin/chromedriver');

        $options = new ChromeOptions();

        $chromeBinary = getenv("GOOGLE_CHROME_SHIM");

        $options->setBinary($chromeBinary);

        $capabilities = DesiredCapabilities::chrome();

        $capabilities->setCapability(ChromeOptions::CAPABILITY, $options);

        $this->driver = ChromeDriver::start($capabilities);
    }

    /**
     * @large
     */
    public function testTitle()
    {
        $this->driver->get('https://www.google.co.jp/');
        $title = $this->driver->getTitle();
        $this->assertEquals($title, 'Google');
    }
}
?>
```

``` composer.json
{
  "require": {
    "php": ">=7.1.0",
    "facebook/webdriver": "^1.5"
  },
  "require-dev": {
      "phpunit/phpunit": ">=7.0"
  }
}

```
ActiveRecordが生成するSQLをRailsのコンソールで確認する

## 概要

ActiveRecordが生成するSQLをRailsのコンソールで確認する方法。
ログ出力が無効になっていたり、ファイルに出力されるようになっていたりした場合に。

## やり方

コンソールで以下のコマンドを実行

```
ActiveRecord::Base.logger = Logger.new(STDOUT)
```

`.pryrc` に書いておいてもよいかも
Dockerで.envを活用してみたいメモ

# やりたいこと
.envを活用して色々やってみる。

## 使う時
前準備として、以下のようなファイルをdocker-compose.ymlと同じディレクトリに作っておく

```bash
SAMPLE_VAR=local.sample.jp
```

### docker-compose.ymlで使う
`${変数名}` で参照できる

```yml
version: 3
services:
  name: sample
  environments:
    - SAMPLE_VAR: ${SAMPLE_VAR}
  extra_hosts:
    - 127.0.0.1: ${SAMPLE_VAR}
```

### Dockerfileで使う
docker-compose.ymlのenvironmentsに書いておけば`${SAMPLE_VAR}`を受け取れる。

docker-compose.yml

```yml
version: 3
services:
  name: sample
  environments:
    - SAMPLE_VAR: ${SAMPLE_VAR}
```

Dockerfile

```dockerfile
RUN echo $SAMPLE_VAR
# 出力: local.sample.jp
```

### マウントしたファイルの中身に環境変数をセットさせる(番外編)
※`envsubst`が必要

text.txt.template

```txt
${SAMPLE_VAR}
```

docker-compose.yml

```yml
version: 3
services:
  name: sample
  environments:
    - SAMPLE_VAR: ${SAMPLE_VAR}
  volumes:
    - ./text.txt.template: ./text.txt.template
  command:
    - envsubst '$$SAMPLE_VAR' < ./text.txt.template > ./text.txt
```
GitHub > 表示コード数 > 130 chars for 960px, 140 chars for 1920px

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
Google Chrome バージョン: 65.0.3325.181（Official Build） （64 ビット）
```

GitHubをwebブラウザで見たときの表示コード数が知りたくなった。

https://stackoverflow.com/questions/22207920/what-is-githubs-character-limit-or-line-length-for-viewing-files-on-github

実際に見えている文字列をコピーしエディタで見たところ、以下だった。

- 130 chars: 960px (1920を半分に)
- 140 chars: 1920px

2014年の情報なので、GitHubのシステムが変更されたのかもしれない。

Pythonの場合、PEP8に準拠することで、関数の引数の最後あたりが読めないという問題は生じなくなるだろう。
「1月31日の一ヶ月後はいつですか」にCarbon や Chronos はどう答えるか

日時を扱う処理を書くとき、月をまたぐ部分はうっかりすると不具合の原因になりがち。

たとえば現在の日付が31日であるタイミングでこういうことをやると

```php
\DateTime::createFromFormat('Y-m', '2018-02')
```

「年」は2018で「月」は2だけど「日」が現在日時の30になるため、月をこえてしまって結果は3月3日になるという悲劇が起きます。

さて今回は日時を生成するときじゃなくて「一ヶ月後」などのお話。
このへん、PHP の日時ライブラリ Carbon と Chronos はどう扱っているのか確認してみます。

## Carbon の場合

### 動作

1月31日の一ヶ月後を求めようとして

```php
\Carbon\Carbon::create(2018, 1, 31)->addMonths(1)
```

とすると、

    2018-03-03

になります。

ただし先にこれをやっておくと

```php
Carbon::useMonthsOverflow(false);
```

結果はこうなる。

    2018-02-28

### 実装

Carbon の `addMonths()` ではこういう判定をしてます。

```php
public function addMonths($value)
{
    if (static::shouldOverflowMonths()) {
        return $this->addMonthsWithOverflow($value);
    }

    return $this->addMonthsNoOverflow($value);
}
```

`static::shouldOverflowMonths()` が見ているのはこれで

```php
public static function shouldOverflowMonths()
{
    return static::$monthsOverflow;
}
```

さきほどの `Carbon::useMonthsOverflow(false);` によって `$monthsOverflow` がセットされます。

```php
public static function useMonthsOverflow($monthsOverflow = true)
{
    static::$monthsOverflow = $monthsOverflow;
}
```

実際に月を足し引きしてるのはこのふたつ。

```php
public function addMonthsWithOverflow($value)
{
    return $this->modify((int) $value.' month');
}

public function addMonthsNoOverflow($value)
{
    $day = $this->day;

    $this->modify((int) $value.' month');

    if ($day !== $this->day) {
        $this->modify('last day of previous month');
    }

    return $this;
}
```

`$monthsOverflow` のデフォルト値は `true` になってるからそのままだと月をこえて計算されるけど、これを `false` にすることによって

> 一ヶ月後を計算して `day` が変わるようならそれは月を越えたサインだから、前月の末日に戻す

という処理になります。

## Chronos の場合

### 動作

```php
\Cake\Chronos\Chronos::create(2018, 1, 31)->addMonths(1)
```

は最初から

    2018-02-28

になります。

### 実装

これは Chronos の実装がこうなっているためで

```php
public function addMonths($value)
{
    $day = $this->day;
    $date = $this->modify((int)$value . ' month');

    if ($date->day !== $day) {
        return $date->modify('last day of previous month');
    }

    return $date;
}
```

もう月を越えたら無条件に前月の末日に巻き戻してる。

Carbon のデフォルト処理のように月を越えてもそのまま使いたい場合は、明示的に

```php
\Cake\Chronos\Chronos::create(2018, 1, 31)->addMonthsWithOverflow(1)
```

とすることになるようです。

「一ヶ月後」という処理をするときには Chronos のデフォルト動作の方が求められていることが多いような気もするけど、「Chronos は Carbon の immutable 版」とだけ覚えてしまうとこのへんの違いで思わぬ問題が起きるかも。テストだいじ。
sudoで実行するスクリプトに環境変数を渡すには-Eオプション

# 流れ

* Jenkinsを「ビルド→シェルの実行」メインで使いたい。
* Jenkinsのヘルプのベストプラクティクスとして、Jenkinsのジョブから別途用意したシェルスクリプトを起動することにした。
* jenkinsユーザーでは権限の問題が多発するので、sudoersに追加のうえ、シェルスクリプトは`sudo`で起動することにした。
* 起動したシェルスクリプトで`$WORKSPACE`など、Jenkinsのビルド時の環境変数が使えないことが判明した。
* `sudo`する側のシェルスクリプトでは正しく環境変数が揃っていた。
* 調べてみるものの`export WORKSPACE`は効かず、もしかして引数で渡すのか？と悩んだ。


結論としては`sudo`のオプション
`-E            preserve user environment when executing command`
で環境変数を引き継ぐことができた。

# 関連

* [linux - シェルスクリプトをsudoしても環境変数を引き継ぎたい - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/16487/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92sudo%E3%81%97%E3%81%A6%E3%82%82%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E5%BC%95%E3%81%8D%E7%B6%99%E3%81%8E%E3%81%9F%E3%81%84)

本質的に別問題なのだが、ここで`-E`オプションの存在に気づけた。

* [環境変数の一覧を表示するには](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/107showenv.html)

Jenkins固有という考えから問題を`$WORKSPACE`に限らず、まず全ての環境変数の差を確認しよう→環境変数を引き継げるのか？ という思考シフトの契機。


* [環境変数 引継ぎ shellscript - Google 検索](https://www.google.co.jp/search?client=firefox-b&dcr=0&ei=8s69WufYPIO10gS1wrPADQ&q=%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0+%E5%BC%95%E7%B6%99%E3%81%8E+shellscript&oq=%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0+%E5%BC%95%E7%B6%99%E3%81%8E+shellscript)
 
`jenkins workspace shellscript`など、Jnekins方面から攻めてもあまりうまくいかないので、最初からもっと本質的に調べればよかった。


* [Jenkinsでsudo実行時のエラー - Qiita](https://qiita.com/gozuqi/items/6ebb2e6a4d49dfeb080f)
* [Jenkinsでsudoが必要な場合 - Qiita](https://qiita.com/yshishido/items/2f32dae7fa28a2b45801)

こっちはそのまま使えそう

* [Jenkinsでシェルスクリプトを他のユーザとして実行 - Qiita](https://qiita.com/tmtysk/items/37c8c58cd59f834b1939)

こっちを最初にコピペして、`(user)`や`/home/user/foo.sh`に気づかず躓いていた。

* [Building a software project - 日本語 - Jenkins Wiki](https://wiki.jenkins.io/pages/viewpage.action?pageId=31719431)

使える環境変数一覧。
ここでしているようなパラメーターとして渡す方法はとりたくなかった。
obat disentri

ttp://www.rumahwalatraherbal.com/nama-obat-disentri-paling-ampuh-di-apotik/
Kami menyediakan berbagai jenis pengobatan herbal yang bagus untuk meningkatkan kesehatan pada tubuh dan bisa membantu memulihkan berbagi jenis penyakit kronis. Kami juga merupakan pusat distributor obat yang paling terpercaya dan selalu mengutamakan kepentingan konsumen. Salah satu penyakit yang bisa kami sembuhkan yaitu penyakit disentri
Swiftでfor文を使わないで書く

[この記事](https://qiita.com/ukiuni@github/items/abad07524856c65a20ea)が話題になっていたのでSwiftでのサンプルコードを示します。

---

問題： 0から100未満の偶数の和を求めよ。

```swift:for文を使った解答
var t = 0
for i in 0..<100 {
    if i % 2 == 0 {
        t += i
    }
}
print(t) // 2450
```

```swift:関数型を使った解答
print((0..<100).filter { $0 % 2 == 0 }.reduce(0, +)) // 2450
```

自分としては、map, filter, reduceあたりを使って簡潔に関数型で書けるなら、for文は使わない方が良いと思うので上記の記事に賛成です。
WRF > WPS > NCEP FNL dataの生成スケジュール (wgetしたファイル日時から推定)

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS、およびWRFの後続処理のF***T関連。

WPSで処理するNCEP FNL Operational Model Global Tropospheric Analysesデータについては自分の対象とするデータは未処理となっている。

いつファイルが生成されるのか気になった。

```shell-session
$ ls -l fnl*
...
-rw-rw-r-- 1 xxx xxx 18697628 Apr  1 04:02 fnl_20180331_12_00.grib2
-rw-rw-r-- 1 xxx xxx 18679374 Apr  1 10:02 fnl_20180331_18_00.grib2
-rw-rw-r-- 1 xxx xxx 18728274 Apr  1 16:02 fnl_20180401_00_00.grib2
-rw-rw-r-- 1 xxx xxx 18818865 Apr  1 22:02 fnl_20180401_06_00.grib2
-rw-rw-r-- 1 xxx xxx 18890728 Apr  2 04:02 fnl_20180401_12_00.grib2
```

6時間おきに作られている。
タイムスタンプはこちらのJST(UTC + 9.0h)の方だろうか?

https://www.jal.co.jp/worldclock/
によると米国の地点では4月1日17時57分(ドイツの場合、4月2日02時57分)なので、上記のタイムスタンプはJSTと思われる。

あと5分程度で次のファイルが生成されるだろう。

生成された。
超簡単にJavaScript開発

ウェブサイト上で、簡単にJavaScriptのプログラミングできるサービスを知りました。
https://playcode.io/

作ったページのURLが直ぐに発行できるので、ブラウザを使ったデバッグも容易です。

GitHubアカウントでログインすると、便利だと思います。

共同でプログラミングするときも、簡単に開発画面をシェアできるので役立つと思います。

プロジェクト名でURLが作られるので、このURLが外部に守れなければ、ブロジェクトの改ざんなどを防ぐことができると思います。

今回スマホのセンサーを使う方法を探している中で、とても役立つ記事を見つけました。
http://bashalog.c-brains.jp/17/11/24-170000.php

このサイトの記事を参考にして、シェイクの検出をすることができました。

今回ご紹介した開発サービスを活用して、スマホでもソースの修正をすることができました。
パソコンとスマホと両方からアクセスできるので、ネット環境が悪い私は、とても助かっています。
GPU（CUDA）で高速に「売れた商品をカテゴライズする」までの試行錯誤。GPUすごいし、Elasticsearchと組み合わせると便利

#きっかけ
　大量のデータから何が売れ線なのかをみたくて、Kibanaでポチポチと見ていたら商品名称や説明からカテゴライズしたくなった。カテゴライズしたデータのトレンド線が上向いてたらこれは、流行ってるんだな？とか、「寒いと売れると思ってたのに・・売れない品もあるんだな」といったことが分かるかも？と仮設をたててみる。カテゴリ分類は人間が決めているので、やっぱり恣意性がある。機械的に分類したい。経産省の「日本標準商品分類」ってのにできたらいいのか？とりあえず教師無し学習で分類してみる。

#結果
・ビジネス的には希望の光が見えるかも・・くらい。
・カテゴライズするにはする！がノイズが多くて変なところで引きあってしまう。
・データのクリーニングにとても時間がかかる。
・とにかくCPUベースでは遅い。GPUにしたら結果的に最適化されてないPHPソース比で1000倍くらい早くなった気がする。
・PythonではGPUのパワーは出しきれない。CUDA-Cのパワーはすごい。
・Elasticsearchに放り込んだら、便利すぎて涙が出た。

ここから下は説明


#教師無し学習でやる
そもそもどうやって文章をカテゴライズするの？って状態だったのでイロイロ調べ、論文読んだりしてみました。
「何言ってんのかわかんないっす」って脳みそだったのが、たくさん読んでると理解してくる。
文章クラスタリングというらしい。


##文章が似ている、似ていないとは？？
文章が似ているか？似ていないか？の判断は二つの文章を比較してスコアをつけてあげればいい
以下の例文を採点する
A：「青りんごが盗まれた」→「青」「リンゴ」「盗む」
B：「赤リンゴが盗られた」→「赤」「リンゴ」「盗む」
C：「リンゴが潰れた」→「リンゴ」「潰す」
D：「おいしいミカンが無くなった」→「おいしい」「ミカン」「無くす」

「→」これは、文を単語に分解して原形に戻す（ほんとに原形になってるか？自信ないです）＋カタカ揺れを直す。
この辺はkuromojiとかの形態素解析で頑張る。
シノニムで展開してやるとさらに精度があがるかも。

AとBを比較すると
A＋Bのベクトルを作る。（ベクトルって・・・って人はググってください）
「青」「赤」「リンゴ」「盗む」→これが軸

|#    | 青 | 赤 | リンゴ | 盗む |
|:----|----|---|--------|-----:|
|A    | 1  | 0 | 1      | 1    |
|B    | 0  | 1 | 1      | 1    |

できたー
なんとなく、数学的に似ているか判断できそう。

形態素解析を通さない場合は２～３グラムでベクトルを作ってもいいかも。
でも次元数は半端ない。

##コサイン類似度
この値をコサイン類似度ってやつに通すと・・・
数学的に0.5似ているって言えることが導き出せます。
コサイン類似度でググるとでてくるよ。

K-MEANSとかクラスタリングは、↑の行が山ほどあるのもをクラスタ化するんですが
文章の場合は次元数が1000とか軽くいってしまうし、軸を足し合わせていったら次元数がとんでもないことになって計算時間が増えてしまう。



#集合の計算方法
上記の方法で2つの似ている値（以下スコア）が算出できるので
あとは全ての組み合わせでスコアが一番高い組が一番にていることになる。

A、B、C、D・・・・と品があったとき
A:B、A:C、A:DのなかでAが最も似ている品を算出する
同じように
B:A、B:C、B:DのなかでAが最も似ている品を算出する
全組み合わせ表を算出する

つまり・・・
O(n^2)の計算量になる。

#実際にやってみる（すごい時間かかる）
１００万超える品（ちょっと名前が変わったら違う商品）をPHPで分類してみたら。。
終わらない。
1万品とかにしてみるけど終わらない。
1000品とかにしてみたら30分くらいで終わった。
これは・・・O(n^2)だから・・・まともにやったら１００年とかかかるような気がする。

#試行錯誤やってみた
・とにかく遅い
・日本語の突き合わせはすべて転置インデックスにした
・ノイズを可能な限り除去した
・マルチプロセスでCPUコアをちゃんと使えるようにしようとしたけどPHPはだめだ
・PHPは遅いのでPythonでやってみたけど・・やっぱり遅いので・・Cで組んでみたが１０倍早くなったくらい。。悲壮感漂う
・スーパーコンピュータ使いたい
・GPU(GTX1050ti)をとりあえず買ってみた。

ここからGPUの試行錯誤

・CUDAコードに起こすのが難しい！Pythonや！→やっぱり遅い！！
・GPUがフルパワー出さない
・PythonからGPU使っても遅いからCUDAコード書く！
・そもそもN万スレッドを立ち上げる感覚がわからない。
・なんとかしてN万スレッドを立ち上げる感覚が身に付く！
・早い！CPU比で２０倍くらいはやい！
・CUDA難しいけど楽しい！
・カーネルコードはCPUコードでも動くようにコピーを作っておく
・CPUコードでテストして、GPUコードでテストすると動作確認、デバッグがやりやすい
・マシン語の部分を意識してやればもっと早くなりそう！！
・ifの除法、forの除法やってみる。早い。
・CUDAは無限にリファクタリングできそうだから・・あきらめた
・GTX1050tiでは遅い！！もっといいGPUがほしい！

GPUがうまく動かないとき
・GPU独特の制限を回避しないとWindowsでは長時間カーネル実行ができない「n秒問題」
・計算結果が間違えてるのか、コードが間違えてるのかわからなくなる時がある
・「n秒問題」を設定で回避しても動作が不安定になったら、再起動
・再起動でもだめならコードのバグ


#100万品
普通に100万品やってみると、O(n^2)になるからどうやっても終わらない
なのでK-MEANSみたいにすることにした
・５万品を持ってきて２５００個に分類する
・一番近いもを足し合わせる
・重心をもとめて
・再度足し合わせる

これで２５００の位置（と言っていいのだろうか？）ができるので
位置と品データを比較して、２５００の中で最も近いグループに属するようにした。
１００万品だとGPUつかっても14日（途中で落ちたりなんかんだと）かかりました。


もっといい方法があるんだろう。。。

#感想
・品のカテゴリ分けはデータのクレンジング次第で成功すると思う
・それよりもGPUの衝撃がすごい
・GPUパワーを使えるようになったので、武器が増えた感じがする
・CPUバウンドならGPUで解決できるかもしれない希望が持てる
・CUDA-Cが難しい。
・ヘテロジニアスが分かってないとGPUパワーの恩恵にあずかれない
・アセンブラが少しでもわかると分岐と繰り返しの除法に手が出せる
・CUDAのIDEがすごい。ヘテロジニアスなのに楽
・Elasticsearch、KIBANA、機械学習の組み合わせがすごい
Android Studioが「com.example.hogehoge.databindingは存在しません」「Invalid byte 3 of 3-byte UTF-8 sequence」エラーを吐くときの対処法

ある日，他の人が作ったandroidアプリのソースをgithubを経由して自分のパソコンに持ってきて、いざビルドしようとしたら、android studio画面下部のMessage欄に

```
エラー: パッケージcom.example.hogehoge.databindingは存在しません
```

とかいうエラーメッセージが表示されてビルドできない。どうやらdatabindingがうまく動いていないらしい…？

そこでGradle Console欄も見てみた所、実は

```
> android.databinding.tool.util.LoggedErrorException: failure, see logs for details.
  Exception while handling step android.databinding.annotationprocessor.ProcessExpressions@186feb09 javax.xml.bind.UnmarshalException
   - with linked exception:
  [org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence.]
  	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:333)
    at …
    at …

(中略)
    at …
    at …
Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence.
    at …
    at …

(以下略)
```
とかいうエラーメッセージが出ている。

さて、アプリ製作者の環境ではちゃんとビルド出来ているようなのに自分の環境ではなぜエラーが出てしまうのか…？**Invalid byte 3 of 3-byte UTF-8 sequence**とは何…??

# 原因と解決方法
## 原因
製作者の開発環境がLinuxやMac OSだったアプリで、~~データバインディングを使用していて~~ `<layout>`タグを使用していて且つソース中に直接日本語が使われているlayoutファイルが存在しているアプリのソースをwindowsに持ってきてビルドしようとするとこのエラーが出るらしい。

## 解決方法
日本語をすべてstringsファイルに移して@string/hogehogeで参照するように修正するとビルドできるようになります。


例：

-  変更前
 
*res/layout/activity_main.xml*

``` xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
    <variable name="hoge" type="String"/>
</data>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="こんにちは"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="@{hoge}"/>


</android.support.design.widget.CoordinatorLayout>
</layout>

```

- 変更後

*res/values/strings.xml*

```xml

<resources>
    <string name="hoge_str">こんにちは</string>
</resources>
```

*res/layout/activity_main.xml*

```xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
    <variable name="hogehoge" type="String"/>
</data>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@strings/hoge_str"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="@{hogehoge}"/>


</android.support.design.widget.CoordinatorLayout>
</layout>
```


# 後日談
android studioのバージョンを3.1.4にアップデートしたらこのエラー出なくなりました。
やはりandroid studio側のbugだったらしい…。修正に感謝。
Rails5.1のWebpackerにBootstrap4をいれたい！

```shell
yarn add bootstrap jquery popper.js postcss-loader sass-loader
```

```ruby:app/javascript/packs/application.js
import 'bootstrap'
import '../stylesheets/application'
```

```ruby:app/javascript/packs/stylesheets/application.scss
@import "custom";
@import "~bootstrap/scss/bootstrap";
```

```ruby:app/views/layouts/application.html.haml
= javascript_pack_tag 'application'
= stylesheet_pack_tag 'application'
```
ファイルの修正時刻を変更する

ターミナルで以下のコマンドを入力する

```
$ touch -mt 201011111111 WantChangeTimeStamp.txt 
```

例えばファイルの更新時間によって実行結果を変えるプログラミングを作成する場合、このコマンドを知っていればテスト時に時間別のファイルをわざわざ用意しなくても良くなる。

http://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230905/
pyenv global xx したのに反映されない

## 状況
`pyenv global xx`としたのにpythonのバージョンが変わらない

```shell

$ pyenv global anaconda3-5.1.0 (set by /Users/user1/.python-version)
$ python -V
Python 3.4.1
$ pyenv versions
 system 
* 3.4.1(set by /Users/user1/.python-version)
 anaconda3-5.1.0 
```

## 原因・解決方法
以前にユーザのホームディレクトリ（/Users/user1)で`pyenv local 3.4.1`を行なっていたため。

`pyenv local some_version`はそのディレクトリに`.python-version`ファイルを作成し、その中身を`some_version`に書き換える。
ホームディレクトリ上で`pyenv local some_version`してしまうとその下の階層全てでこの設定が有効になるためいくら`pyenv global other_version`してもlocalの方の設定が優先されてしまう。

globalとlocalでどちらの設定が優先されているかはpyenv versionsしたときに
 **(set by /Users/user1/.python-version)ならlocal設定が優先**
**(set by /Users/user1/.pyenv/version)ならglobal設定が優先**
されている。

初心者のころ訳も分からずホームディレクトリでpyenv localすると、数ヶ月後にこのような形でトラブります。

## 補足
`pyenv`の動作として、
`pyenv global some_version`したときは/Users/user1/.pyenv/versionのファイルの内容を`some_version`に置き換え、
`pyenv local some_version`したときはカレントディレクトリ上に`.python-version`のファイルの内容を`some_version`に置き換える。
単にファイルを書き換えているだけだと思われる。
(ファイルをviで編集しても設定は反映された）

pythonを呼び出すときに
`/Users/user1/.pyenv/version`を読み込み、
カレントディレクトリより上のディレクトリから`.python-version`があるか確認し、ファイルがあればそれを読み込んでいくようです。
【C#】string.Format() をやめて $"{}"（文字列補間式）を使う

文字列補間式 `$` について学習したので自分用メモとしてまとめました。
何か間違っていたら教えていただけると嬉しいです。

## 読みやすい

## `string.Format` を使って書くと...

```c#
string name = "Sanonosa";
int hour = DateTime.Now.Hour;
string message = string.Format("こんにちは、{0}さん。今は{1}時です。", name, hour);
```

`string.Format` と書くのが長いし、第二引数以降がどの `{n}` と対応しているかわかりにくいです...。

## 文字列補間式 `$` を使って書くと

文字列の先頭に `$` をつけるだけオーケー。
字列の中に直接埋め込むことができます。

```c#
string name = "Sanonosa";
int hour = DateTime.Now.Hour;
Console.WriteLine($"こんにちは、{name}さん。 今は{hour}時です。");
```



## 実行時エラーをコンパイルエラーとして検出できる

以下のコードは実行時にエラーが発生しますが、コンパイルが通ってしまいます。
実行されないとエラーにならないため見落とす危険性があります。

```c#:埋め込む文字列が足りない
string.Format("こんにちは、{0}さん。今は{1}時です。", name);
```
埋め込む文字列が増えてくるとやってしまいがちです。
`$` なら不注意な僕でもまず間違えようがないです。

以下のコードは書式文字列を設定する際、誤って `:` （コロン）ではなく `;` （セミコロン）が使われていますが、これも実行されて初めて例外が発生します。

```c#:書式文字列の設定が間違っている
var text = string.Format("この本は{1000;c}です");
```

`$` を使っておけばコーディング中にIDEがエラーを教えてくれますし、気づかなくてもコンパイルが通らないので安心です。

```c#:静的解析やコンパイルでエラーになる
var text = $"この本は{1000;c}です";    // エラー
```

## 書式設定できる

すでに書きましたが、 `string.Format` と同様に書式設定ができます。

```c#
var now = DateTime.Now;
Console.WriteLine($"{now:yyyy年MM月dd日}");  // "2018年04月01日"

var today = DateTime.Today;
Console.WriteLine($"{today.Year}年{today.Month,2}月{today.Day,2}");   // "2018年 4月 1日"

var num1 = 1234567890;
Console.WriteLine($"{num1:#,0}");   // "1,234,567,890"

var num2 = 123;
Console.WriteLine($"{num2:00000}");  // "00123"
```

## エスケープ

`{` 自体を出力したい場合 `{{`と書きます。

```c#
var framework = "Angular";
Console.WriteLine($"{framework}のデータバインドは{{{{}}}}と書きます");
    // "Angularのデータバインドは{{}}と書きます"
```


読んでいただきありがとうございました。
`$` は読みやすいしエラーも減るということで積極的に使っていこうと思います。
Rust by Examples のお勉強 - Primitives

## `char` は Unicode codepoint なので 4 バイト

Unicode codepoint は最大で 21 ビットなので、4 バイトになるということだろうか？

## tuple

tuple は異なる型の値を格納できる。こんな風に中身に bind するのも可能。

```rust
let tuple = (1, "hello", 4.5, true);
let (a, b, c, d) = tuple;
```

## array と slice

array の型は `[T; len]`、slice の型は `&[T]`。

slice は array からの borrow なので、`&` が必要。

```rust
fn print_slice(slice: &[i32]) {
    print!("[");
    for (i, x) in slice.iter().enumerate() {
        if i > 0 {
            print!(", ");
        }
        print!("{}", x);
    }
    println!("]");
}

fn main() {
    let a: [i32; 5] = [1, 2, 3, 4, 5];
    print_slice(&a);
    print_slice(&a[1..4]); // a[1, 4)
}
```
Juliusに音声ファイルを解析させる

# はじめに
[Raspberry Pi＋Juliusで音声を認識する](https://qiita.com/mininobu/items/609aed76f5767f0aa99b)では、Juliusを用いて、USBマイクから取り込んだ音声を直接解析しました。Juliusでは、オプション``-input -rawfile``を使用すると、音声ファイルを解析することができます。

# 実現方法
[Raspberry Pi＋Juliusで音声を認識する](https://qiita.com/mininobu/items/609aed76f5767f0aa99b)の「[動作確認](https://qiita.com/mininobu/items/609aed76f5767f0aa99b#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)」のコマンドを下記のように変更します。

```shell:変更後のJuliusコマンド
~/julius/julius-4.4.2.1/julius/julius -C ~/julius/julius-kit/dictation-kit-v4.4/main.jconf -C ~/julius/julius-kit/dictation-kit-v4.4/am-gmm.jconf -nostrip -input rawfile
```

コマンドが実行され、下記のコンソールが表示されます。

```shell
### read waveform input
enter filename->
```

``enter filename->``に続いて、音声ファイル名を入力します。
音声ファイルが認識されると、次のように音声認識の結果が表示されます。
下記の例では「おはよう」という音声のファイルを解析させています。

```shell
------
### read waveform input
enter filename->ohayo.wav
Stat: adin_file: input speechfile: ohayo.wav
STAT: 17554 samples (1.10 sec.)
STAT: ### speech analysis (waveform -> MFCC)
### Recognition: 1st pass (LR beam)
............................................................................................................pass1_best:  おはよう 。
pass1_best_wordseq: 
 おはよう+感動詞 

pass1_best_phonemeseq: silB | o h a y o: | silE
pass1_best_score: -2833.220215
### Recognition: 2nd pass (RL heuristic best-first)
STAT: 00 _default: 20145 generated, 2524 pushed, 298 nodes popped in 108
sentence1:  おはよう 。
wseq1: 
 おはよう+感動詞 

phseq1: silB | o h a y o: | silE
cmscore1: 0.711 0.219 1.000
score1: -2865.781006
```

# おわりに
無事に解析できました。音声ファイルを解析する場合、Juliusのデフォルトでは音声ファイルは「モノラル」「サンプリングレートが16000」である必要があります。解析対象の音声ファイルがこれら条件に合わない場合は、下記のサイトを参考にjuliusコマンドのオプションで変更するか、音声ファイルの形式を変更しましょう。

[公式ドキュメント 第3章 音声データ入力](http://julius.osdn.jp/juliusbook/ja/desc_adin.html)
[Julius 音声認識ソフト part2 録音音声認識実行](http://www.mizutan.com/wordpress/?p=1842)
初心者に送るLinuxチートシート

##対象
Linuxにほとんど触っていないけど仕事の都合上触ることになった人。
かつ本当に初歩しか頭に入っていない人。

##検索ワード
※記載コマンドは以下ワードのいずれかに該当
記号
作成
変更
表示
動作
構文

##ショートカット
**ctrl + C**
　処理のキャンセル

**ctrl + Z**
　処理の中断

**ctrl + L**
　画面のクリア
　= clearコマンド

**ctrl + W**
　単語の消去

**ctrl + Y**
　直前に消去した単語の貼付け

##コマンド

**ln -s to from**
　作成：シンボリックリンク

**telnet IP**
　動作：対象のサーバーに対話モードで接続する

**cmd1 | cmd2**
　記号：コマンド1の結果をコマンド2に渡して実行

**cmd1 &**
　記号：コマンド1をバックグランドで実行

**cmd1 && cmd2**
　記号：コマンド1実行、成功したらコマンド2も実行

**cmd1 || cmd2**
　記号：コマンド1実行、失敗したらコマンド2も実行

**ps -ef**
　表示：プロセスを一覧で示す

**jobs**
　表示：ジョブを一覧で示す
　　**bg jobID**
　　　　バックグラウンドで実行
　　**fg jobID**
　　　　フォアグラウンドで実行
　　**kill jobID**
　　　　ジョブを停止する

**source file**
　動作：対象ファイルを実行する。変数変更などの影響を受ける

**bash file**
　動作：対象ファイルを実行する。変数変更などの影響を受けない

**export**
　作成：環境変数を設定する
　　**export -p**
　　　環境変数を一覧表示する
　　**export -n 変数名**
　　　環境変数を消去する

**wc file**
　表示：テキストファイルの行数、単語数、バイト数を示す

**head file**
　表示：最初の10行表示

**tail file**
　表示：最後の10行表示

**find -type d hoge**
　表示：ディレクトリ検索
**find -type f hoge**
　ファイル検索

**cmd1 > file1**
　作成：cmd1の結果をfile1として出力

**cmd1 >> file1**
　作成：cmd1の結果をfile1に追加（なければ作る）

**$1**
　記号：引数の1つ目を示す

**sed**
　変更：文字列を置換して標準出力する
　　**cat hoge.txt | sed -e 's/a/A/g' | diff - hoge.txt**
　　**cat hoge.txt | sed -e 's/a/A/g' > hoge.txt**
　　　hoge.txtのaをAに置換。確認した後上書き

**rm -r (file or dir)**
　変更：対象を削除する
　　**rm**
　　　ファイル削除
　　**rmdir**
　　　ディレクトリ削除

**cp -r from to**
　作成：対象をコピーする

**grep 'word' file**
　表示：対象文字列を検索する
　　**'\\.'**
　　　. (エスケープ)
　　**'test[1-4]'**
　　　test1~4
　　**'t[eo]st'**
　　　test または tost
　　**'te*st'**
　　　eが0回以上繰り返し
　　**'te{1,4}st'**
　　　eが1回以上4回以下繰り返し
　　**'my {test | task}'**
　　　「my test」または「my task」　　　


```
for var in *.txt
 do
  wc $var 
 done
```
　構文：for文


```
case "$var" in
  "yes" | "YES" ) echo "はい" ;;
  [nN]o | "NO" ) echo "いいえ" ;;
  * ) echo "どちらでもない" ;;
esac
```
　構文：case文


```
while :
do
  case "$var" in
    "[A-Z]*" ) echo "大文字で始まる" ;;
    "?a*" ) echo "2文字目がa" ;;
    "[!ab]*" ) echo "1文字目がaまたはbではない" ;;
    "q" ) echo "終了"
          break ;;
  esac
done
```
　構文：while文


```
if [ $hoge -eq $fuga ]; then
  echo "同じ"
else
  echo 異なる"
fi
```
　構文：if文
　　**hoge -gt huga** >
　　**hoge -lt huga** <
　　**hoge -ge huga** >>
　　**hoge -le huga** <<
Check Point ClusterXLを学ぶ

# はじめに
Check Point Software Technologiesのファイアウォールで使われている技術ClusterXLについて勉強します。

# ClusterXLとは何か
ClusterXLは複数のCheck Pointファイアウォールで冗長構成を組むために使われている技術です。他のネットワーク機器の冗長化技術と同じく、筐体間のHelloやコネクション同期等の機能を持っています。
以下、私が普段運用している「2台の筐体でActive-Standby構成を組む構成」の場合で記述していきます。

# ClusterXLが動作するための条件
以下の条件を満たしている必要があります
・2台の筐体が同じバージョンで動作していること
異バージョンで動作させる場合にはActive-Standby構成を組むことができず、またコネクション同期も行うことができません。
・アプライアンスの場合、2台の筐体が同じ型番であること
・2台の筐体が時刻同期されていること
時刻同期は製品によってはたまに問題になることがありますね。BIG-IPでは数分のずれでHA構成が組めなくなっていたと記憶しています。Check Pointの場合ある程度のずれは許容されるようですが、同期させておくべきなのは間違いありません。

# ClusterXLの動作
ClusterXLはHelloと同期の機能をどちらもCluster Control Packet (CCP)というパケットを使って行っています。CCPはudp/8116に対してマルチキャストで送信されます。どのインターフェースがCCPを送信するかはTopologyの設定によって変更することができます。

# 各インターフェースの役割について
各インターフェースは以下の4つのうちどれか1つの役割を持たせることができます。設定は管理サーバのTopologyで実施し、確認は実機上で`cphaprob -a if`コマンドでできます。4つの役割の違いは「CCPでHelloを送る/送らない」「CCPで同期情報を送る/送らない」「インターフェースが落ちた時にフェイルオーバーが起きる/起きない」です。表にまとめると次のようになります。

| 役割       | Hello送信       |    同期情報送信    |監視|用途|
|:-----------------|:------------------|:------------------|:-----|:--|
| Cluster             |              ○ |        ×        | ○|通常のインターフェース|
| Sync           |            ○ |       ○       | ○|コネクション同期用インターフェース|
| Monitored Private           |         ×      |        ×        |○ |特殊|
| Non-Monitored Private               |  × |         ×         |× |管理ポート|

Clusterインターフェースは通常の通信で使われるインターフェースです。
それに対してSyncはコネクション同期情報をやり取りするためのインターフェースです。転送量が多くCluster機能の根幹を担うインターフェースのため、クロスケーブルで直結することが推奨されています。
Monitored Privateはクラスターではない（仮想IPを持たない）がインターフェースダウン時には障害とみなしてフェイルオーバーするインターフェースです。タグVlanを使っているときの物理ポートに設定します。
Non-Monitored Privateはクラスターではなく、ダウンしても障害とみなさないポートです。リモートログイン用の管理ポートはこれですね。

実機で`cphaprob -a if`コマンドで確認すると、Clusterインターフェースは「non secured」、Syncインターフェースは「secured」と表示されます。正直この名前規則の違いはミスリーディングなのでやめて頂きたいです。。。

# IPとMacについて
Clusterインターフェースで利用されるIPはインターフェースにアサインするIPアドレスとは異なるVIPとなります（CiscoのHSRPを想像しましょう）。MacアドレスはActiveとして動作しているインターフェースのMacがそのまま使われます(CiscoのHSRPとは違いますね）。フェイルオーバーの際にはGARPが送信され、隣接機器のARPテーブルが変更されます。

# HAステータスについて
HAステータスは筐体上で`cphaprob state`コマンドで確認できます。Active、Standby、Down、Active Attention、Ready、ClusterXL inactive or member is downの6種類を覚えておけば大丈夫です。

Active：正常にActiveとして動作している
Standby：正常にStandbyとして動作している
この2つは正常な状態を示しています。

Down：異常であり、パケットの送受信は行えない。他の筐体にActiveを任せている。
Critical Device（後述）に問題が起きており、ActiveにもStandbyにもなれない状態です。通信用インターフェースで障害が起きた場合にはこの状態になります。

Active Attention：異常であるが、他の筐体にActiveを任せられないため自分が送受信を行っている。
両方の筐体で障害が発生した場合、どちらもActiveになれずこの状態になります。

Ready：正常であるが、ActiveにもStandbyにもなれない
あまり見ることがない状態です。両方筐体のバージョンが異なる場合には、より「新しい」バージョンがReadyとなります。この時古いバージョンはActiveとなります。Standbyではないためコネクション同期はできません。

ClusterXL inactive or member is down：正常であり、他の筐体が見つからない
クラスターのうち1台が筐体故障等でいなくなると、もう1台はこの状態になります。

# フェイルオーバーとCritical Deviceについて
ClusterXLは自分の筐体のうち、インターフェース及び幾つかのプロセスを監視しており、このいずれかで問題が発生した場合にフェイルオーバーが発生します。この監視対象をCritical Deviceとよび、`cphaprob -l list`コマンドで確認できます。

# 参考文献
[ClusterXL Administration Guide R77 Versions](http://downloads.checkpoint.com/dc/download.htm?ID=24800)
[Understanding Check Point ClusterXl Part 1](https://www.youtube.com/watch?v=8vMkZZZCZl4)
[Java]byte型変数に格納されているビット列をコンソールに表示する

# byteに格納されているビット列
Javaの`byte`型には8ビット(=1バイト)のデータが格納されています。
`byte`に格納されているビット列(2進数)を16進数、10進数で表現すると以下のようになります。

|ビット列(2進数)|16進数|10進数|
|--:|--:|--:|
|00000000|00|0|
|～|～|～|
|01111111|7F|127|
|10000000|80|-128|
|～|～|～|
|11111111|FF|-1|

# ビット列をコンソールに表示する
2進数表記で表示する方法と、16進数表記で表示する方法について説明します。

- 2進数表記

```java
1:  byte b = 10;
2:  int i = Byte.toUnsignedInt(b); // 符号なし変換
3:  String str = Integer.toBinaryString(i); // バイナリ文字列を取得
4:  str = String.format("%8s", str).replace(' ', '0'); // 0パディング
5:  System.out.println(str);
```

- 16進数表記

```java
1:  byte b = 10;
2:  System.out.print(String.format("%02X", b));
```

それぞれの出力結果は以下の通りです。

```
 2進数：00001010
16進数：0A
```

出力方法を比べてみると、2進数表記は色々と変換が必要となっていることが分かります。

## 2進数表記の時にどんな変換を行っているのか
2進数表記で具体的にどんな変換を行っているか説明します。
まずは2行目から。

2行目：`byte`型から`int`型へ変換する

```java
2:  int i = Byte.toUnsignedInt(b); // 符号なし変換
```

この時、符号なしの変換を行っている点がポイントです。
理由は、int型の上位24ビットを0にするためです。

|byte型(整数)|int型<符号なし変換>(整数)|int型<符号あり変換>(整数)|
|--:|--:|--:|
|00000001(1)|00000000000000000000000000000001(1)|00000000000000000000000000000001(1)|
|11111111(-1)|00000000000000000000000011111111(255)|11111111111111111111111111111111(-1)|

3行目：`int`型変数のバイナリ文字列(ビット列)を取得する

```java
3:  String str = Integer.toBinaryString(i); // バイナリ文字列を取得
```

この時、上位の0は無視されます。符号なしの変換を行っていたのはこのためです。

|int型(整数)|バイナリ文字列|
|--:|--:|
|00000000000000000000000000000001(1)|1|
|00000000000000000000000011111111(255)|11111111|

4行目：取得した文字列を0パディングする

```java
4:  str = String.format("%8s", str).replace(' ', '0'); // 0パディング
```

具体的には、書式付き文字列を使って空白でパディングした後に、空白を`0`に`replace`してます。

# まとめ
プログラムの動作確認をしている時にふとbyte[]の中身を確認したくなり、方法を探したところ意外と苦戦してしまったため、実現方法をメモとして記事に残させていただきました。
小ネタですが誰かの役に立てれば幸いです。
気に入ってちゃんと保管している技術書のメモ(2018)

# 気に入ってちゃんと保管している技術書のメモ

## 選定基準

- 他の言語である程度、プログラムの組み方が分かっていること
- 初心者向けだと逆に分からないので、一歩進んだ内容の本を紹介

## Python系

### オライリー系

#### [退屈なことはPythonにやらせよう](https://www.amazon.co.jp/dp/487311778X/ref=cm_sw_r_tw_dp_U_x_qWpWAb1FCM3DG)

> 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

Pythonについて二の足を踏んでいたところに目に入り、「あ、バッチ処理でも良いんだ」と気づいた1冊。
選定基準にあるような「初心者向け」の内容を6章までの第1部、本格的な自動化処理の内容を書いた第2部という構成。

#### [Pythonではじめるデータラングリング](https://www.amazon.co.jp/dp/4873117941/ref=cm_sw_r_tw_dp_U_x_f6pWAbXB3G4N7)

> Pythonではじめるデータラングリング ―データの入手、準備、分析、プレゼンテーション

「退屈なことはPythonにやらせよう」と比べて、よりデータ分析に重きを置いた内容。 
まだしっかりとは読み込んでいないので、これから必要があれば手に取る感じ。

#### [Effective Python](https://www.amazon.co.jp/dp/4873117569/ref=cm_sw_r_tw_dp_U_x_biqWAbMW7MXT5)

> Effective Python ―Pythonプログラムを改良する59項目

Pythonの文法から文化における書き方について詳しい本。
Pythonのコードを見直したい人、Pythonのプロジェクトに貢献したい人に。

### 非オライリー系

#### [Python ライブラリ厳選レシピ](https://www.amazon.co.jp/dp/4774177075/ref=cm_sw_r_tw_dp_U_x_mlqWAbNBWE2R6)

> Python ライブラリ厳選レシピ

色んなライブラリを知りたいという人にお薦め。
使い方の逆引きが出来るかもしれない。

## .Net系

（随時追加）
webpack4 + TypeScript + React CSS Modules

最近TypeScriptを本格的に導入し始めたんですが webpack + ES201X + React CSS Modules な環境をTypeScriptでも導入したかったので備忘の意味も込めて残しておきます。


# やりたいこと
- TSXで書くReactコンポーネントにCSS Modulesを利用したい
- このためだけにBabelをインストールしたくない
- Autoprefixer欲しい

# 環境
- TypeScript 2.8.1
- webpack 4.4.1
- React CSS Modules 4.7.2
- CSSは今回はPostCSSを利用（Sassでもいいけどお好みで）

# 設定
## tsconfig.json（一部）
```json
{
  "compilerOptions": {
    ...
    // デコレータを使用するため true にする
    "experimentalDecorators": true,
    // React指定
    "jsx": "react",
    // 型定義ファイルを作るのでディレクトリを指定
    "typeRoots": [
      "typings",
      "node_modules/@types"
    ]
  },
  ...
}

```

## webpack.config.ts（一部）
```typescript
const config: webpack.Configuration = {
  ...
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        use: 'awesome-typescript-loader'
      },
      {
        test: /\.css$/,
        exclude: /node_modules/,
        use: [
          'style-loader',
          'css-loader?modules&importLoaders=1&localIdentName=[name]--[local]--[hash:base64:5]',
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true,
              plugins: [
                autoprefixer()
              ]
            }
          }
        ]
      }
    ]
  },
  ...
};

export default config;
```

## 型定義ファイル
```typescript

declare module "*.css" {
  const classes: {[className: string]: string}
  export default classes
}
```
# 使用例
## CSS
```css

.title {
  color: blue;
}
```
## React
```tsx

import * as React from 'react';
import * as CSSModules from 'react-css-modules';
import * as styles from 'style.css';

@CSSModules(styles)
export default class Component extends React.Component {
  render(): JSX.Element {
    return (
      <div>
        <h1 styleName="title">Hello World</h1>
      </div>
    );
  }
}
```

webpack3でも同じ感じで使えるはず。

[ソース](https://github.com/laqu/webpack-typescript-react-css-modules)
Pythonのall(list)が便利だったので、C#/VB.netに置き換えた

# Pythonのall(list)が便利だったので、C#/VB.netに置き換えた

趣味で研究しているPythonの書き方が便利だったので、.Net系で実装出来ないか試行錯誤したのでメモを書きます。

## IsAllTrueの実装

### 例: Pythonの実装

```Python:IsAllTrue.py
def IsAllTrue(boolList)
    return all(boolList) # 本来はこのまま呼び出し元に書ける
```

### C#の場合

```list.All(b => b)```で実装出来る。（ちゃんと確認します）

```C#:IsAllTrue.cs
bool IsAllTrue(List<bool> boolList){
    return boolList.All(b => b)
}
```

### VB.netの場合

```list.All(Function(Boolean b) b)```で実装出来る。

```VB:IsAllTrue.vb
Function Boolean IsAllTrue(List(Of Boolean) boolList)
    Return boolList.All(Function(Boolean b) b)
End Function
```

## IsDictAllTrueの実装

基本的には、一旦valuesを取り出すことになります。  
ただし、keysの取り出しが必要な場合、.Net系の方が強みを持ちます。  
（取り出し方は要調査）

### 例: Pythonの実装

```Python:IsDictAllTrue.py
def IsDictAllTrue(boolDict)
    boolList = boolDict.values()
    return all(boolList) # 本来はこのまま呼び出し元に書ける
```

### C#の場合

```C#:IsDictAllTrue.cs
bool IsDictAllTrue(List<string, bool> boolDict){
    var boolList = boolDict.Values
    return boolList.All(b => b)
}
```

### VB.netの場合

```VB:IsDictAllTrue.vb
Function Boolean IsAllTrue(List(Of String, Boolean) boolDict)
    Dim boolList = boolDict.Values
    Return boolList.All(Function(Boolean b) b)
End Function
```
React16 最小構成のビルド環境 browserify babelify JSXあり

# 関連記事
 
React16 最小構成のビルド環境 browserify reactify JSXあり - Qiita
https://qiita.com/standard-software/items/781ec3f491f4f1bea7b6

こちらの記事では Browserify で Reactify を使ったのですが、Babelも同時に使いたいという要望があると思われるので、React のための変換を Babelでやるようにするのがはやりのようですね。

ですので、Browserify の transform モジュールの babelify を使って変換を行います。

# はじめに

環境は Windows 。 node.js インストール済みとします。

# インストール

今回は browserify と reactify を使います。フォルダを決めてローカルインストールします。

```
  npm init -y
  npm install --save react
  npm install --save react-dom
  npm install --save browserify
  npm install --save-dev babel-cli
  npm install --save babel-preset-env
  npm install --save babel-preset-react
  npm install --save babelify
```

フォルダに、package.json が作られてその中身の一部はこのようになります。

```js
  "dependencies": {
    "browserify": "^16.1.1",
    "react": "^16.3.0",
    "react-dom": "^16.3.0",
    "babel-cli": "^6.26.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "babelify": "^8.0.0"
  },
```

# ファイル

次の構成にします。決めたフォルダの中に次のファイルがある状態にしてください。

```
  index.html
  src フォルダ
    hello.jsx
  build フォルダ
    build.js
```

用意するのは、index.html と hello.jsx で、build.js は browserify によって生成されます。

```index.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div id="app01"></div>
    <div id="app02"></div>
  <script src="./build/build.js"></script>
  </body>
</html>
```

```jsx:hello.jsx
const React = require('react');
const ReactDOM = require('react-dom');

class HelloWorld extends React.Component {
  render() {
    return <div>Hello World {this.props.name}</div>;
  }
}

const hwElement = <HelloWorld name="01" />;
ReactDOM.render(hwElement,
  document.getElementById('app01'));

const hwFactory = React.createFactory(HelloWorld);
 ReactDOM.render(
  hwFactory({name: '02'}),
  document.getElementById('app02')
);
```
[前の記事](https://qiita.com/standard-software/items/781ec3f491f4f1bea7b6)と同じです。


次にBabel用の設定ファイルを用意します

```json:.babelrc
{
  "presets": ["env", "react"],
}
```

# 実行

ビルドコマンドは次のとおりです。決めたフォルダをカレントディレクトリにしてコマンド実行してください。

```
.\node_modules\.bin\browserify -t babelify .\src\hello.jsx -o .\build\build.js
```

実行結果は次のとおりになります。

```html
<body>
    <div id="app01"><div data-reactroot="">Hello World 01</div></div>
    <div id="app02"><div data-reactroot="">Hello World 02</div></div>
```

これで、Babel を使って ESの最新と React の変換を行えます。

# GitHub
2018/04/08追記

少しソースコードをシンプルにして次の場所に配置しました。
https://github.com/standard-software/React_Hello-World_Sample
CDN版 Reactのみ / React+JSX
Browserify版 Reactのみ / React+JSX Reactify / React+JSX Babelify
WebPack版 Reactのみ / React+JSX
これらが全て含まれています。
Dockerから遠隔地のサービスを使う with SSHポートフォワーディング

SSHポートフォワーディングする時にvboxnet1のIPアドレスを指定してやれば良い。

# version
## Mac

10.11.6

## ssh
```
$ ssh -V
OpenSSH_6.9p1, ・・・
```

## Docker
```
$ docker -v
Docker version 18.03.0-ce, ・・・
```

# やり方
1. [host]vboxnet1のIPアドレスを取得

    ```
    $ ifconfig vboxnet1
    vboxnet1: ・・・・・・・
	    ether ・・・・・・・
	    inet 192.168.99.1 netmask ・・・・・・・
    ```

    →この場合は`192.168.99.1`

2. [host]SSHポートフォワーディング

    ```
    $ ssh -v -L 192.168.99.1:[ポート]:[接続先ホスト]:[接続先ポート] [リモートホストのユーザ名]@[リモートホスト]
    ```
    ※`SSHポートフォワーディング`についての詳細は省略

    ※vboxnet1のIPアドレス指定を省略すると、`localhost:[ポート]`がトンネルの口になってしまうため、Dockerから使えない。

3. [guest]接続確認

    ```
    # cat /etc/redhat-release 
    CentOS release 6.9 (Final)
    # rpm -qi nc
    ・・・・・・・
    Version     : 1.84 ・・・・・・・
    Release     : 24.el6 ・・・・・・・
    ・・・・・・・
    ```
    ```
    # nc -v -w 1 192.168.99.1 -z [ポート]
    Connection to 192.168.99.1 [ポート] port [tcp/*] succeeded!
    ```
    ※guestマシンへのログイン方法は省略
    ※ncコマンドの詳細は省略
【Ruby】クラス変数の小さなサンプルメモ

- @@から始まる英数字
- そのクラスの全てのインスタンスで共有される変数↓リンク曰く
- 定数と似ているがクラス変数は何度でも値を変更できる↓リンク曰く
    - https://qiita.com/mogulla3/items/cd4d6e188c34c6819709


```ruby
class Test
  @@num = 1

  def show
    p @@num
  end

  def increment
    @@num = @@num + 1
  end

  def get
    return @@num
  end
end

test1 = Test.new
test2 = Test.new

test1.show #1
test2.show #1

test1.increment

test1.show #2 共通の値を参照
test2.show #2 共通の値を参照

p test1.get #2
```

```sh:実行結果
1
1
2
2
2
```
rsyncみたいなwindowsのコマンド

# xcopyの基本的な使い方

Linuxでrsyncを使うと、以前にコピーしたときから変更がないファイルはそのままで、変更されたファイルと新しいファイルだけコピーしてくれて便利ですよね。私は、別のディスクのバックアップを取りたいときに使っています。

windowsでも同じようなコマンドが使いたいときは、xcopyを使いましょう。

バッチファイルの例を下に示します。

```do_xcopy.bat
xcopy "Y:\userLinux\hnishi\work3\hnishi\kek9\kekex"  "G:\work3\hnishi\kek9\kekex" /e /d /h /r /y 
```

*バッチファイルの名前は、"xcopy.bat"としないようにしましょう。xcopyという、既存のコマンド名と競合して、動きません。

以下、xcopyコマンドのオプションの説明です。

::   /E    Copy folders and subfolders, including Empty folders.
::         can be used to modify /T.
::   /D:mm-dd-yyyy
::         Copy files changed on or after the specified date.
::         If no date is given, copy only files whose
::         source date/time is newer than the destination time.
::   /H    Copy hidden and system files and folders (default=N)
::   /R    Overwrite read-only files.
::   /Y    Suppress prompt to confirm overwriting a file.
::         can be preset in the COPYCMD env variable.

同じようなので、robocopyというものもあります。
"Robust File Copy"という意味らしいです。

## 除外リスト

特定の拡張子を持ったファイルはコピーしたくないというときには、/EXCLUDEオプションを使いましょう。

```do_xcopy.bat
xcopy "Y:\userLinux\hnishi\work3\hnishi\kek9\kekex"  "G:\work3\hnishi\kek9\kekex" /e /d /h /r /y /EXCLUDE:list_xcopy_exclude.txt 
```

下記のように、テキストファイルを作って、オプションの引数にファイル名を指定してください。

```list_xcopy_exclude.txt
.xtc
.trr
.tar.gz
.tar.z
```

## 参考

http://kakakakakku.hatenablog.com/entry/20111209/1323431144
[React]react-router v4で画面遷移時に前のページのスクロール位置が残る

# 概要
react-routerを使用したプロジェクトにおいて、画面遷移時に前のページのスクロール位置が残ってしまい、ページの最上部から表示されない問題を解決したのでメモとして残しておく。

# 解決法
普通にreact-routerの[公式ドキュメント](https://reacttraining.com/react-router/web/guides/scroll-restoration)に解決法があった。

# 実装
## コンポーネントを作る
```ScrollToTop.jsx
import { Component } from 'react';
import { withRouter } from 'react-router-dom';

class ScrollToTop extends Component {
  componentDidUpdate(prevProps) {
    if (this.props.location !== prevProps.location) {
      window.scrollTo(0, 0);
    }
  }

  render() {
    return this.props.children;
  }
}

export default withRouter(ScrollToTop);

```

## インポートする
### react-routerを使用しているコンポーネントにインポートする

```jsx
import ScrollToTop from './components/ScrollToTop';
```
### ラップする
`<ScrollToTop>`でラップします。

```jsx
<Router>
  <ScrollToTop>
    <App />
  </ScrollToTop>
</Router>
```
【Ruby】インスタンス変数の小さなサンプルメモ

- @で始まる変数
- 「インスタンス変数にアクセスできるのは、initializeメソッドとオブジェクトのインスタンスメソッドだけ」↓曰く
    - https://qiita.com/mogulla3/items/cd4d6e188c34c6819709

```ruby
class Test
  @num0 = 0

  def initialize
    @num1 = 1
  end

  def increment
#    @num0 += 1 # Error
    @num1 += 1
  end

  def show
    p @num0 # nil
    p @num1 # 1
  end

  attr_accessor :num1

end

test = Test.new
p test.num1
test.show

test.increment
test.show

# test.@num0 # syntax error
# test.@num1 # syntax error
```

```sh:実行結果
1
nil
1
nil
2

```
QueryExceptionのエラーメッセージのちょっとした不具合？

セッションのHandlerを拡張して書いてたらちょっとエラーのなかで？になった箇所がったので調べてみた。

#環境と前提
- PHP7.1
- Laravel 5.5.39
- セッション保存先にDBを使っている

#現象
とある理由でSQLエラーになったときに本来 ? で記録される場所にbindingsの値が入ってた。

sql
> insert XXX (`id`, `data`, `updated`) values (?,?,?);

bindings

```
[
 'xxxx',
 'a:4:{s:9:"_previous";a:1:{s:3:"url";s:64:"http://xxxxxxx/xxxx/?key=val";}}',
 '2018-03-27 18:55:39'
]
```
QueryExceptionのgetMessageの出力

> insert XXX (`id`, `data`, `updated`) values (xxxx, a:4:{s:9:"_previous";a:1:{s:3:"url";s:64:"http://xxxxxxx/xxxx/2018-03-27 18:55:39key=val";}}}, ?))

#理由
replaceArrayで?をbindingsの値に置き換えてるからこうなる。

> vendor/laravel/framework/src/Illuminate/Database/QueryException.php

```
    /**
     * Format the SQL error message.
     *
     * @param  string  $sql
     * @param  array  $bindings
     * @param  \Exception $previous
     * @return string
     */
    protected function formatMessage($sql, $bindings, $previous)
    {
        return $previous->getMessage().' (SQL: '.Str::replaceArray('?', $bindings, $sql).')';
    }
```

#解決方法
対応するかは別として対応はQueryExceptionをバグ修正したものに差し替えるくらいかなぁ。
FuelPHP 1.8 エラーメッセージを表示させる方法

# 1.やりたいこと
- エラーメッセージを画面に表示させる
- ページ遷移、リダイレクトするとエラーメッセージのSessionは削除される
- エラーメッセージがなければ表示させない

# 2.環境
PHP 7.0.24
FuelPHP 1.8
※controllerはController_Templateを継承

# 3.実装
#### viewにエラーメッセージを表示させる場所を準備
```php:fuel/app/view/test/index.php
<!-- $err_msgが存在した場合は、エラーメッセージを表示 -->
<?php if( ! empty($err_msg)): ?>
    <div class="alert alert-danger" role="alert">
        <strong>WARNING</strong>：<?php echo $err_msg; ?>
    </div>
<?php endif ?>
```

#### エラーメッセージを格納する処理
```php:fuel/app/classes/controller/test.php
// 実行される処理例
public function post_hoge()
{
    try {

        // ifがtrueだった場合はエラー
        if ( ! Input::post() ) {

            // エラーメッセージを作成
            $err_msg = 'エラーです。';

            // エラーをスロー
            throw new Exceotion($err_msg);

        }

        // その他処理

        } catch (Exception $e) {

            // $err_msgをSessionに格納
            Session::set_flash('err_msg', $e->getMessage());

            // リダイレクト
            Response::redirect(Uri::base().'test');

        }

        // 成功時の処理

}
```

#### エラーメッセージをviewに渡す処理
```php:fuel/app/classes/controller/test.php
// リダイレクト先のコントローラー
public function action_index()
{
    // viewに渡す変数を格納
    $data = array(
        'err_msg' => Session::get_flash('err_msg'),
    );

    // viewを呼び出す
    $this->template->content = View::forge('test/index', $data);
}

```

# 4.最後に…
これでできるはず…
Laravelでsingletonで書いてても既存のインスタンスが使われないケース

メモがてら初投稿。
singletonで定義してあっても毎回別のインスタンスになるケースがあって調べてみた。

#環境
- PHP7.1
- Laravel 5.5.39

↓のように定義して

```
        $this->app->singleton(xxxxxClass::class, function ($app, $params) {
            return new xxxxxClass($params);
        });
```

#実装コード
↓のように呼び出す

```
        \App::make(
            xxxxxClass::class,
            ['param' => 12345]
        );
```

この場合は次に同じように呼び出しても既存のインスタンスが使われてない。


# 理由
laravelのコード見てみたらパラメータつきで指定される毎回作り直しになるっぽい。
（たとえ同じパラメータだったとしても）

> vendor/laravel/framework/src/Illuminate/Container/Container.php

```
    /**
     * Resolve the given type from the container.
     *
     * @param  string  $abstract
     * @param  array  $parameters
     * @return mixed
     */
    protected function resolve($abstract, $parameters = [])
    {
        $abstract = $this->getAlias($abstract);

        $needsContextualBuild = ! empty($parameters) || ! is_null(
            $this->getContextualConcrete($abstract)
        );

        // If an instance of the type is currently being managed as a singleton we'll
        // just return an existing instance instead of instantiating new instances
        // so the developer can keep using the same objects instance every time.
        if (isset($this->instances[$abstract]) && ! $needsContextualBuild) {
            return $this->instances[$abstract];
        }
        ~省略~
   }
```

マニュアルあさってみたりしたけど特に記載は無いけどこれって当たり前だから書いてないのかなぁ。