OmniAICreator/Qiita-1.07M huggingface dataset:
Cyclone V GX Starter Kit(C5G)+HSMC-NETでNIOS IIのSimple Socket Serverを動かす

#環境
- Windows 10 Home
- Cyclone V GX Starter Kit ⇒ [これ](http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=165&No=830&PartNo=1)
- ETHERNET-HSMC Card ⇒ [これ](http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=71&No=355&PartNo=1)
- Quartus Prime Version 17.0.0 Build 595 04/25/2017 SJ Lite Edition

#方法
###ハードウェア
1. [ここ](http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=165&No=830&PartNo=4)のDaughter Card Demonstations->NETよりC5G_NET.zipをダウンロードして任意のディレクトリに解凍する
2. IPをアップグレードしろとか出る(C5G_NETはQuartus13.0で開発されていた模様)のでする
3. コンパイルしてUSB-Blasterからコンフィグレーション

###ソフトウェア
1. QuartusからTools->Nios II Software Build Tools for Eclipse
2. Workspaceを`C5G_NET/software`にしてOK
3. Project ExplorerにすでにC5G_ETHERNET_HSMC_CardとC5G_ETHERNET_HSMC_Card_bspが存在するがincludeディレクトリがおかしかったりソースコードが古いせいかwarningが出たりするので最初から構成する
    1. File->New->Nios II Application and BSP from Template
    2. SOPC Information File nameに`C5G_QSYS.sopcinfo`を指定
    3. Project nameを指定（ここでは`SimpleSocketServer`とする）
    4. TemplatesからSimple Socket Serverを指定してfinish
    5. Project Explorerから`SimpleSocketServer`を選択してProject->Build Project
    6. すると`EXT_FLASH_NAME`と`EXT_FLASH_BASE`が未宣言と出るが`SimpleSocketServer_bsp/system.h`に`MEM_IF_LPDDR2_EMIF_NAME`,`MEM_IF_LPDDR2_EMIF_BASE`が定義されているので`SimpleSocketServer/network_utilities.c`内部で、`EXT_FLASH_NAME`を`MEM_IF_LPDDR2_EMIF_NAME`に、`EXT_FLASH_BASE`を`MEM_IF_LPDDR2_EMIF_BASE`にそれぞれ置き換える
    7. `SimpleSocketServer_bsp/drivers/src/iniche/ins_tse_mac.c`の325行目に`marvell_cfg_gmii(tse[iface].mi.base);`を追加![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/138078/8b12d28e-35ab-2ee9-80f3-1a63b6fd6552.png)

    8. `SimpleSocketServer/simple_socket_server.h`でIPアドレスとゲートウェイとサブネットマスクを指定する![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/138078/1d52b22d-7641-cb52-966f-93b055ae0f7e.png)

    9. 再度、Project->Build Project
4. Run->Run Configurations
    1. ProjectタブでProject nameを`SimpleSocketServer`に
    2. Target Connectionタブで右の方にあるRefresh Connections
    3. Runボタンで実行(ただしこの時ハードウェアのコンフィグがうまくいっていないとSystem ID checksに引っかかる）
    4. 表示がこうなったらMACを生成するために９桁の数字を入力する（多分なんでもいい）![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/138078/0b579262-234f-9d6c-9333-b9f9269351c1.png)
    5. DHCPからIPを取得できたらそのアドレスに`telnet <IPアドレス> <ポート(おそらく30)>`すると接続できる
[Unity]Editor拡張で等間隔に並べたい時はBegin/EndよりScopeを使おう

#概要

Editor拡張でいつも項目を縦横で等間隔に揃えたい時のコードを書く時に

```c#
        EditorGUILayout.BeginHorizontal();
        {
            //横に並べたい項目
        }
        EditorGUILayout.EndHorizontal();
        
        EditorGUILayout.BeginVertical();
        {
            //縦に並べたい項目
        }
        EditorGUILayout.EndVertical();
```

みたいにやっていました。
中括弧のスコープを付けてどこからどこまでが範囲なのかわかりやすくしようと思いつけていたのですが、たまたまこういう記事を見つけて読んでいました。

>Unity5のGUIクラスに追加されたScopeについて
https://qiita.com/kyusyukeigo/items/4642ae85d6ff075acf31

Scopeという存在を全く知らなくて、挙動も同じだったのでそちらのほうが便利なのではないか?と思い、忘備録として書きます。


#スコープにしてみる
先程と同じく縦横に等間隔に並べたい時のコードです。

```c#
        using (new EditorGUILayout.HorizontalScope())
        {
            //横に並べたい項目
        }
        using (new EditorGUILayout.VerticalScope())
        {
             //縦に並べたい項目
        }
```

先程のコードと比べてBegin/Endがなくなったのでスッキリしましたね。
また、usingを使っているのでVisualStudioのコードスニペットが使えるので楽に記述出来ると思います。

#終わりに
ずっとEditorGUILayout.Begin/Endを使っていたので、
こういう便利な存在をもっと早く知りたかった…。

良いコードを書くためには逐一調べないと駄目だなと思いました。
MongoDBをDockerコンテナ上で動かしたときに出るWARNINGの消しかた

# 概要

Dockerコンテナ上でMongoDBを動かしているとき、ログファイルにtransparent_hugepage関連のWARNINGが出ていることに気がつきました。

```
2018-08-15T06:38:47.743+0000 I CONTROL  [initandlisten]
2018-08-15T06:38:47.743+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-08-15T06:38:47.743+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-08-15T06:38:47.743+0000 I CONTROL  [initandlisten]
2018-08-15T06:38:47.743+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-08-15T06:38:47.743+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-08-15T06:38:47.743+0000 I CONTROL  [initandlisten]
2018-08-15T06:38:47.745+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/opt/storage/diagnostic.data'
2018-08-15T06:38:47.753+0000 I NETWORK  [HostnameCanonicalizationWorker] Starting hostname canonicalization worker
```

それぞれのWARNINGで `never` を設定するように促されました。

そもそもTransparent Huge Page (THP) とは何なのかを調べてみると、[MongoDBの公式ドキュメント](https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/)に以下の記事がありました。

**原文**
> Transparent Huge Pages (THP) is a Linux memory management system that reduces the overhead of Translation Lookaside Buffer (TLB) lookups on machines with large amounts of memory by using larger memory pages.
> 
> However, database workloads often perform poorly with THP, because they tend to have sparse rather than contiguous memory access patterns. You should disable THP on Linux machines to ensure best performance with MongoDB.

**日本語訳**
> Transparent Huge Pages（THP）は、大きなメモリーページを使用して大量のメモリーを持つマシンでTranslation Lookaside Buffer（TLB）ルックアップのオーバーヘッドを削減するLinuxメモリー管理システムです。
> 
> ただし、データベースワークロードは、連続したメモリアクセスパターンではなく、希薄な傾向があるため、THPでパフォーマンスが低下することがよくあります。 LinuxマシンでTHPを無効にして、MongoDBで最高のパフォーマンスを確保する必要があります。

THPの仕組みはメモリを大きな単位で扱えるようにして一般的には性能の向上が図れますが、MongoDBなどのデータベースシステムとは相性が良くないようです。そのためTHPを無効化するようにログファイルからWARNINGとして促しています。

# 対処方法

`sysfsutils` パッケージをインストールして `/etc/sysfs.conf` ファイルへTHPを無効化する行を追記することでWARNINGを消すことができます。

```Dockerfile
...(略)...
RUN yum install -y sysfsutils
RUN echo 'kernel/mm/transparent_hugepage/enabled = never' >> /etc/sysfs.conf \
 && echo 'kernel/mm/transparent_hugepage/defrag = never' >> /etc/sysfs.conf
```

これでTHPによるMongoDBのパフォーマンス劣化が改善できます。

# 試したこと (失敗編)

THPを無効化するためDockerfileから以下のように `never` を該当のファイルへ追記してみました。

```Dockerfile
RUN echo never > /sys/kernel/mm/transparent_hugepage/enabled \
 && echo never > /sys/kernel/mm/transparent_hugepage/defrag
```

すると、Dockerイメージのビルド時に以下のエラーで怒られてしまいました。

`/bin/sh: /sys/kernel/mm/transparent_hugepage/enabled: Read-only file system`

どうやら読み取り専用のファイルのためDockerfileからechoコマンドによる追記はできないようです。
Word2VecのモデルをGloVeのフォーマットへ変換する方法

Word2VecのモデルをGloVeのフォーマットへ変換する方法についてまとめます。

# 方法
1. 以下のコマンドを実行し、gensimをインストールします。

    ```bash
    $ pip install gensim
    ```

1. 以下のPythonスクリプトを実行し、Word2Vecのモデルをバイナリ形式からテキスト形式へ変換します。

    ```binary2text.py
    from gensim.models import KeyedVectors
    
    KeyedVectors.load_word2vec_format({Word2Vecのモデル (バイナリ形式) のパス}, binary=True).save_word2vec_format(Word2Vecのモデル (テキスト形式) のパス)
    ```

2. 以下のコマンドを実行し、Word2Vecのモデル (テキスト形式) をGloVeのフォーマットへ変換します。

    ```bash
    $ tail -n +2 {Word2Vecのモデル (テキスト形式) のパス} > {GloVeのフォーマットに変換したモデルのパス}
    ```

# 関連記事
* [GloVeが出力したモデル(txt)をgensim.word2vecで読み込めるように整形する。 - Qiita](https://qiita.com/kanjirz50/items/9d1c79d64dde46604395)
UnityCG.cgincと、モノクロ調エフェクトの解説

UnityでShaderを書く際、`#include "UNityCG.cginc"`や`"pragma vertex vert_img`と書くことがあります。これらの意味を自分なりに解説しようと思います。

#1.`#include "UNityCG.cginc"`とは
[公式リファレンス](https://docs.unity3d.com/ja/current/Manual/SL-BuiltinIncludes.html)によると、
***
UnityCG.cginc のデータ構造

- struct appdata_base: 位置、法線、テクスチャ座標、頂点シェーダー入力。
- struct appdata_tan: 位置、法線、接線、ひとつのテクスチャ座標、頂点シェーダー入力。
- struct appdata_full: 位置、法線、接線、頂点カラー、ふたつのテクスチャ座標、頂点シェーダー入力。
- struct appdata_img: 位置、ひとつのテクスチャ座標、頂点シェーダー入力。

***
となっている。
つまり、Unity上における物体の頂点や法線の情報を引き渡してくれるものだと考えられます。

#2.モノクロ調を使った解説
今回は[おもちゃラボ様](http://nn-hokuson.hatenablog.com/entry/2016/11/17/204831)のCustom/monoToneスクリプトを使用させていただきます。
詳しい作り方はリンク先をご覧ください。

```
Shader "Custom/monoTone" {
    Properties {
        _MainTex("MainTex", 2D) = ""{}
        //インスペクタ表示できる2D型のメインテクスチャを宣言
    }

    SubShader {
        Pass {
        //今回はPassは1つだが、2パスにしたい場合はPass{}の後にもう一度Pass{}を追加する

            CGPROGRAM
　　　　　　　//ここから描画処理

            #include "UnityCG.cginc"
　　　　　　　//物体の頂点や法線データの取得

            #pragma vertex vert_img
            //3D空間の頂点座標をカメラで見る2D座標に変換した値
            #pragma fragment frag
            //頂点座標に付随する色。その場所には何色があるかの値。

            sampler2D _MainTex;
            //Propertiesで宣言した変数はCGPROGRAM内でもう一度宣言しないと使用できない

            fixed4 frag(v2f_img i) : COLOR {
            //v2f_img型は2次元のx,y座標をもつ。この座標に対してどう色をつけるかをこの関数で決定する。

                fixed4 c = tex2D(_MainTex, i.uv);
                //_MainTexのテクスチャのi.uv座標の色の値を取得

                float gray = c.r * 0.3 + c.g * 0.6 + c.b * 0.1;
                c.rgb = fixed3(gray, gray, gray);
                return c;
　　　　　　　　　////座標iにおける、グレースケール化した色値cを返す
            }

            ENDCG
        }
    }
}
```
macOS High Sierra version 10.13.5 にnginxをインストールする

nginxの有効化まで

#nginxのインストール

```terminal
$ brew install nginx
Warning: You are using OS X 10.13.
We do not provide support for this pre-release version.
You may encounter build failures or other breakages.
```
を実行すると、エラーが返ってくる
HighSierraとhomebrewの相性？の問題らしいので、
以下のコードでhomebrewを再インストールする。

```terminal
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
バージョン確認

```terminal
$ brew -v
Homebrew 1.7.1
```

(参考)
['brew update' errors on MacOS 10.13 (High Sierra)](https://github.com/Homebrew/brew/issues/3285#issuecomment-334976806)
[HomeBrewでmacOS 10.13(Hight Sierra)にCarthage入れる時のエラー](https://qiita.com/gaikitan/items/5f29351c4fcea5d985f1)

これで晴れて

```terminal
brew install nginx
```
インストール完了

```terminal
$ nginx -V
nginx version: nginx/1.15.2
```
初学者がJavascriptの構文でびっくりした点（バッククオーテーションによるテンプレートリテラル）

# はじめに
夏休み期間を利用してJavascriptについて勉強しようと考え、[Progate](https://prog-8.com) で学習を行っていますが、他の言語であまり見ない構文を目にすることがあり、少しびっくりしたので書き残しておきます。

## バッククオーテーションによるテンプレートリテラル
jsにおいて、テンプレートリテラルを用いて文字列の中で変数を展開したい時は、バッククオーテーション(``` ` ```)の中に文字列を記述し、展開する変数を```${}```の中に記述することで一つの文章中で変数を展開することができます。

```javascript
let difference = "GOD";
console.log('★LittlE HearTs★ (${difference})');// ★LittlE HearTs★ (${difference})
console.log("★LittlE HearTs★ (${difference})");// ★LittlE HearTs★ (${difference})
console.log(`★LittlE HearTs★ ($(difference))`);// ★LittlE HearTs★ (GOD)
```

テンプレートリテラルによる文字列展開は様々な言語に存在する記法ですが、その際のクォーテーションがバッククオーテーションであることは意識していないと忘れてしまいそうですね。

また、jsにおいてはシングルクォーテーションとダブルクオーテーションの差はあまりないそうなので、プロジェクトの企画や文章中の```'```や```"```の兼ね合いで使用するクオーテーションを選択すればよいみたいですね。Shift押す分楽なのでシングルを使えると嬉しい気がします。
tarでディレクトリを圧縮しS3に置くワンライナー

```console
$ tar zcf - dist | aws s3 cp - s3://example/dist.tgz
```

`tar`および`aws s3 cp`コマンドは`-`での標準出力/標準入力を受け付けるので、
ビルドしたディレクトリを、固めてS3に保存。という用途で力を発揮します。
Hook url change on SPA application

There's no event like `onurlchange`, so you need to implement it manually. There are 3 ways for changing url on SPA(=without refreshing page):

1. window.history.pushState
2. window.history.replaceState
3. window.location.hash (only for hash(#) parameter)

So all you have to do is extend these functions (window.onhashchange is used for case 3).

```javascript
function insertCallback(parent, funcname, callback, ...args) {
	let oldFunc = parent[funcname] ? parent[funcname] : function (){}
	parent[funcname] = function() {
		oldFunc.apply(this, arguments)
		return callback(...args)
	}
}

function doSomething(args) {
	// do what you want
}

let args1 = [] // arguments of callback function
let args2 = [] // arguments of callback function
let args3 = [] // arguments of callback function

insertCallback(window.history, "pushState", doSomething, args1)
insertCallback(window.history, "replaceState", doSomething, args2)
```

*It may affect outer javascript and framework(like vue, angular, react etc...). I <b>strongly recommend you use it in unavoidable case</b>.
MacとVMwareFisionのゲストOSでClosedネットワークを作る

#背景
ホストのMac上で動作するsinatoraの開発サーバにゲストOS(Win7Pro)から接続して試験したい
セキュリティなんかの問題で外部には通信を出せない

因みに、締切に追われた状態で出先での空き時間に急遽思いついた方法
技術的なTipsというより、ただのネタですみません。。。

#持っていたもの
- Mac
    - VMware Fusion上にWin7Proインストール済
    - sinatraのWebアプリ
- モバイルWiFiルータ L-01G
    - プライバシーセパレータはOff

#やったこと
1. モバイルWiFiルータの外部ネットワークを無効にする
    + ネットワーク検索をGSMにして接続出来ない状態に設定
    + もしくはダミーのプロバイダ情報を設定
2. モバイルWiFiルータでMacに固定IPを割り当てるように設定
3. ゲストOSのネットワーク設定をブリッジに指定
3. Macにdnsmasqをインストール
    + 参考URLを見ながらdmsmasqをインストール
    + ワイルドカードでcom,jp,netなどに,ホストOSのIPアドレスで応答する
    + ゲストOSのDNSサーバにホストOSのIPアドレスを設定
4. sinatoraの開発サーバを起動
5. ゲストOSから対象のURLに接続

#参考URL
https://scientre.hateblo.jp/entry/20150521/ad_block_with_dnsmasq
https://qiita.com/ono_matope/items/cd3be40b5179731d4460


###最後に補足というか言い訳
VMware Fusionのネットワークをホストオンリーにしてネットワークに接続した状態のMacを使えば、上手いことできるのかも知れません。(知ってる人教えてください)
が、かなり追い詰められた状況で、咄嗟に思いついた割には良くやった方かと。。。
モバイルWiFiルータで固定IP割当が出来たのはラッキーでした。やっぱり、良い物買わんとあかんです。
3.のdnsmasqのところは、ゲストOSのhosts書き換えなどでも対応可能です。
今回は、複数のサブドメインを持っていたり、ドメインが異なるいくつかの設定を試す必要があったので、全部登録するのが面倒でdmsmasqを入れました。

~~因みに最初ゲストOSのhostsを変更していたのを、途中から方針を変更したために、後日ホストOSのdnsmasqを変更しても接続先が変わらなくて泣きそうになったと言うのは内緒。~~
How to Install Raspbian Stretch in Raspberry Pi?


# 1. Download https://www.raspberrypi.org/downloads/raspbian/

# 2. Check SDCard mount point
```shell
$ lsblk
...
...
...
sdb                     8:16   1   7.4G  0 disk                       <-- Example: sdb
├─sdb1                  8:17   1  43.2M  0 part /media/johnnychu/boot
└─sdb2                  8:18   1   7.4G  0 part /media/johnnychu/rootfs
```

# 3. Use dd to build image
```shell
$ sudo dd bs=1M if=2018-06-27-raspbian-stretch.img of=/dev/sdb conv=fsync status=progress

1822425088 bytes (1.8 GB, 1.7 GiB) copied, 210 s, 8.7 MB/s 
4823449600 bytes (4.8 GB, 4.5 GiB) copied, 748 s, 6.4 MB/s
4600+0 records in
4600+0 records out
4823449600 bytes (4.8 GB, 4.5 GiB) copied, 919.787 s, 5.2 MB/s

```

# 4. Autohiding the Mouse Pointer
```shell
$ sudo apt-get install unclutter
```

```shell
$ vim ~/.config/lxsession/LXDE-pi/autostart
```
```diff:autostart
++ @unclutter -display :0 -idle 3 -root -noevents
```

# 5. Changed Screen Resolution to 800x480
```shell
$ sudo vim /boot/config.txt
```

```diff:config.txt
# uncomment if hdmi display is not detected and composite is being output
-- # hdmi_force_hotplug=1
++ hdmi_force_hotplug=1
 
# uncomment to force a specific HDMI mode (here we are forcing 800x480!)
-- # hdmi_group=2
++ hdmi_group=2
-- # hdmi_mode=4
++ hdmi_mode=87
++ hdmi_cvt=800 480 60 6 0 0 0
```

# 6. Install NVM for NodeJS
```shell
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
$ nvm install 8.11.4
$ nvm use 8.11.4
```


https://learn.adafruit.com/adafruit-5-800x480-tft-hdmi-monitor-touchscreen-backpack/raspberry-pi-config
https://github.com/MichMich/MagicMirror/wiki/Configuring-the-Raspberry-Pi
https://www.raspberrypi.org/downloads/raspbian/
https://www.raspberrypi.org/documentation/installation/installing-images/linux.md
LND を立ててみよう with bitcoind on Mac

## はじめに

Lightning Network のデーモンの実装である `lnd` を立てるチュートリアルです。某connpass のイベントで、建てられなかった人が多かったということで、需要があると思い書いた次第。
 lnd は、btcd という Go 製のフルノードを使うことを想定して作られていますが、bitcoind も使えますし、macOSならインストールも簡単です。ほとんど迷いなく建てられると思います。今回は testnet です。

## bitcoind のインストール

コマンド一発です。

```
$ brew install bitcoin
```
bitcoind ではないことに注意。

## bitcoind の設定と同期

bitcoind の設定ファイルを書きます。Mac の場合は `~/Library/Application Support/Bitcoin/bitcoin.conf` にあります。

```bitcoin.conf
testnet=3
txindex=1
daemon=1

server=1
rest=1

rpcuser=REPLACEME
rpcpassword=REPLACEME
rpcport=18332

zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333

minrelaytxfee=0.00000000
incrementalrelayfee=0.00000010
```

設定を書いたら起動します。

`$ bitcoind`

すると同期が始まります。同期の様子は、

```
$ tail -f ~/Library/Application\ Support/Bitcoin/testnet3/debug.log
```

などで見ることができます。また、 `$ bitcoin-cli getblockcount` でいくつブロックが同期されたが確認できます。

全ブロック同期までには数時間かかりますが、たしかすべての同期を待たずして lnd を建てられた気がします。

## lnd のインストール

### go言語のインストール

```
$ brew install go
```

簡単だなあ。

次に、 `$GOPATH` というものを設定します。どこでもいいのですが、今回はホームディレクトリに設定しましょう。

```
$ cd && mkdir go
```

PATHを通します。

```~/.bashrc
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

```
$ source ~/.bashrc
```

### lnd を github から clone してビルド

```
$ go get -d github.com/lightningnetwork/lnd
$ cd $GOPATH/src/github.com/lightningnetwork/lnd
$ make && make install
```

ビルドが終了したら、立ち上げてみます。

```
lnd --bitcoin.active --bitcoin.testnet --debuglevel=debug --bitcoin.node=bitcoind --bitcoind.rpcuser=REPLACEME --bitcoind.rpcpass=REPLACEME --bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 --bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
```

すると画面に文字が流れ、ウォレットを unlock するか create しろと言われます。はじめなのでもちろん create します。

```
$ lncli create
```

適当にパスワードを入力したら終了です！

## lnd と会話してみる

lnd の情報を見てみるコマンド

```
$ lncli getinfo
```

peer を確認して孤独を癒やすコマンド

```
$ lncli listpeers
```

peer につないだり、チャネルを張ったり、送金したりする手順は他の記事に譲ります。

## 簡単に lnd を立ち上げる

bitcoind と同様に、 `~/Library/Application\ Support/Lnd/lnd.conf` に設定を書くことができます。

```
[Application Options]
debuglevel=debug
maxpendingchannels=10
MinChanSize=20000
maxlogfiles=0
maxlogfilesize=10

[Bitcoin]
bitcoin.active=1
bitcoin.testnet=1
bitcoin.node=bitcoind

[Bitcoind]
bitcoind.rpcuser=REPLACE
bitcoind.rpcpass=REPLACE
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333

[Autopilot]
; autopilot.active=1
; The maximum number of channels that should be created.
; autopilot.maxchannels=5
; The percentage of total funds that should be committed to automatic channel
; establishment
; autopilot.allocation=0.6
```

こんな感じです。 lnd.conf を書くと、煩わしいオプションを指定する必要がなくなり、 

```
$ lnd
```

だけで lnd が立ち上げられます。
jsでforのindexをletで宣言した時にsetTimeoutを実行した時のトランスパイル結果を調べてみた

<!-- jsでforのindexをletで宣言した時にsetTimeoutを実行した時のトランスパイル結果を調べてみた -->
## はじめに

es5まではvarでしか変数を宣言できなかったため、ブロック単位で変数を宣言できませんでした。

そのため、以下のようなことが起こります。

```js:es5.js
for (var i = 0; i < 10; i++) {
  setTimeout(() => console.log(i), 1000)
}

/* 結果
(1秒待つ)
10
10
10
10
10
10
10
10
10
10
*/
```
setTimeoutのラムダ式の中のiはクロージャとしてforのiを読み込みますが、

- setTimeoutにより、1秒後にiの値が読まれる
- iはvarで宣言されているため、forのブロックを抜けても宣言されている

以上の理由から、for文が終わったi = 10の状態で1秒後に一斉に標準出力されるといった感じですね

ところがlet、constが追加され、ブロック単位で変数を宣言できるようになりました。

for文のindexの宣言に関しても、forのブロック単位のスコープになります。
setTimeoutのような非同期だと以下の結果になります。

```js:es2015.js
for (let i = 0; i < 10; i++) {
  setTimeout(() => console.log(i), 1000)
}

/* 結果
(1秒待つ)
0
1
2
3
4
5
6
7
8
9
*/
```

しかしjsに慣れてるとこの挙動に少し違和感を感じたので少し調べてみることにしました。
ただ、jsの実装をみるのもめんどくさいのでbabelとtypescriptでトランスパイルしてみました。

## babel

[公式サイト](https://babeljs.io/)でトランスパイルを試せるので、上記のコードを入力してみました。

```js:トランスパイル前.js
for (let i = 0; i < 10; i++) {
  setTimeout(() => console.log(i), 1000)
}
```


```js:トランスパイル後.js
"use strict";

var _loop = function _loop(i) {
  setTimeout(function () {
    return console.log(i);
  }, 1000);
};

for (var i = 0; i < 10; i++) {
  _loop(i);
}
```

こちらがbabelでのトランスパイルの結果です。
なるほど、関数に値を渡してsetTimeoutを実行しているんですね

もう少し調べてみると、以下のようなfor文にiをクロージャとしてラムダ式に渡すと、関数として展開されるようです。

```js:トランスパイル前.js
for (let i = 0; i < 10; i++) {
  let func = () => i
  console.log(func())
}
```
```js:トランスパイル後.js
"use strict";

var _loop = function _loop(i) {
  var func = function func() {
    return i;
  };
  console.log(func());
};

for (var i = 0; i < 10; i++) {
  _loop(i);
}
```

## typescript

typescriptでも似たような(というかほぼ同じな)結果が得られました

```ts:トランスパイル前.ts
for (let i = 0; i < 10; i++) {
  setTimeout(() => console.log(i), 1000)
}
```

```js:トランスパイル後.js
var _loop_1 = function (i) {
    setTimeout(function () { return console.log(i); }, 1000);
};
for (var i = 0; i < 10; i++) {
    _loop_1(i);
}
```

こちらの結果もほぼ変わらずでした。

```ts:トランスパイル前.ts
for (let i = 0; i < 10; i++) {
  let func = () => i
  console.log(func())
}
```
```js:トランスパイル後.js
var _loop_1 = function (i) {
    var func = function () { return i; };
    console.log(func());
};
for (var i = 0; i < 10; i++) {
    _loop_1(i);
}
```

## あとがき
以前[Effective JavaScript](http://amzn.asia/2tJYJwb)を読んだ時、for文で非同期を実行する際は即時実行関数の中に変数を宣言するやり方が載っていたのですが、その意味がやっとわかった気がします。

jsの仕様は知れば知るほど他の言語と違うし、奥が深くて面白いですね:thinking:
Raspberry Pi 1 Model BにNode.jsをインストールする

# はじめに
Raspberry Pi 1 Model Bには、aptやnを使用した一般的なインストール方法でNode.jsをインストールすることはできません。
今回は、（いまさら感がありますが）Raspberry Pi 1にNode.jsをインストールする方法を説明します。

![Front_of_Raspberry_Pi.jpg](https://qiita-image-store.s3.amazonaws.com/0/43330/23ac82d9-ada9-37e7-4d10-59680f8b1497.jpeg)

# なぜaptやnではインストールできないのか？
これはCPUに原因があります。
aptやnでRaspberry PiにインストールされるNode.jsはARMv７用にビルドされたバイナリファイルで配布されます。ですがRaspberry Pi 1シリーズはCPUがARMv6であるため、動作しません。
※Raspberry Pi 2以降はARMv7,v8

# どうしたらいいのか？
ARMv6用にビルドされたNode.jsのファイルが公式サイトに公開されているので、
Raspberry Piから取得し、手動でインストールします。

# インストール手順
## ローカル環境のNode.jsをアンインストールする。
既にaptなどでNode.jsをインストールされている方はアンインストールしてください。
※アンインストール方法はインストール方法によって異なるため、ここでの説明は割愛します。
アンインストール時に、ユーザディレクトリに作成されているキャッシュなどの情報を格納した.npmフォルダも削除しましょう。これが残っていると、インストール後にNode.jsが正常に動作しない場合があります。
※私の場合は、これが原因でその後のnpmモジュールのインストールに失敗しました。

```shell:~/.npmを削除
rm -Rf ~/.npm
```
## ARMv6用のNode.jsをダウンロードする
8/16時点の安定版だとv8.11.3が最新です。wgetコマンドでダウンロードしましょう。
ファイル名の最後が「armv6l」であることを確認してください。

```shell:Node.jsをダウンロード
wget https://nodejs.org/dist/latest-v8.x/node-v8.11.3-linux-armv6l.tar.gz
```

## Node.jsをインストールする
インストールといっても、ダウンロードしたtar.gzファイルを解凍し、ファイルを環境にコピーするだけです。簡単ですね。

```shell:Node.jsを手動でインストール
tar -zxvf node-v8.11.3-linux-armv6l.tar.gz 
cd node-v8.11.3-linux-armv6l/
sudo cp -R * /usr/local/
```

## 動作確認
インストールできたら、node、npmのバージョンを表示し、正常に動作することを確認しましょう。

```shell:動作確認
node -v   # node(8.11.3)のバージョンが表示されれば成功
npm -v    # npm（5.6.0）のバージョンが表示されれば成功
```

# おわりに
Raspberry Pi 1にインストールするのが意外と試行錯誤しました。今どきRaspberry Pi 1を使おうという方が少ないせいか、なかなか情報がありませんでした。エラーメッセージもとてもわかりづらく、原因の特定まで時間がかかりました。
ですが、無事動作するまでこぎつけたので、使っていきたいと思います。
Pythonでforをできるだけ書きたくないマンのためのスニペット

# はじめに
forをできるだけ書かずに縛りプレイやってみました。「読みにくい」とか「PEP8がー」とか知りません。
(※思いついたら随時更新します。)


# 同じ長さのリストで辞書を作る
```python
list1 = ['a', 'b', 'c', 'd', 'e']
list2 = [1, 2, 3, 4, 5]
result = {}
for key, value in zip(list1, list2):
    result[key] = value
```

↓

```python
list1 = ['a', 'b', 'c', 'd', 'e']
list2 = [1, 2, 3, 4, 5]
result = dict(zip(list1, list2))
```
<br>

# パースして辞書を作る
```python
val1 = 'x=1;y=2;z=3'
val2 = 'a:5,b:1,c:8'
result = {}
for v in val1.split(';'):
    key, value = v.split('=')
    result[key] = value
for v in val2.split(','):
    key, value = v.split(':')
    result[key] = value
```

↓

```python
val1 = 'x=1;y=2;z=3'
val2 = 'a:5,b:1,c:8'
result = {
    **dict(map(lambda x: x.split('='), val1.split(';'))),
    **dict(map(lambda x: x.split(':'), val2.split(',')))
}
```

<br>

# リストからn個ずつ要素を取り出してリストを作る

```python
list1 = [1, 2, 3, 4, 5, 6]
n = 2
result = []
for i in range(0, len(list1), n):
    result.append(list1[i:i+n])
```

↓

```python
list1 = [1, 2, 3, 4, 5, 6]
n = 2
result = [*zip(*[iter(list1)]*n)]
```
AndroidでFCMとAuthenticationを使うときのメモ 2018/08

#はじめに
AndroidアプリにFirebaseのAuthentication実装していて後からFCMを追加したときにはまったのでその時の覚書です。

#FCM追加前のbuild.gradle
```gradle:build.gradle
        implementation "com.google.firebase:firebase-core:16.0.1"
        implementation "com.google.firebase:firebase-auth:16.0.1"
```
#FCM追加後のbuild.gradle
```gradle:build.gradle
        implementation "com.google.firebase:firebase-core:16.0.1"
        implementation "com.google.firebase:firebase-auth:16.0.3"
        implementation 'com.google.firebase:firebase-messaging:17.3.0'
```
バージョン揃えるとビルドエラーになってしまうので、全部最新にしたら無事動きました。
EC-CUBE4 の APP_ENV=prod でデバッグツールバーを使用する

邪道かもしれませんが、 Production モード(`APP_ENV=prod`)で、 Symfony Profiler を使用したい場合だってありますよね。

```shell
composer install --dev
```
を実行してから、

以下の修正でデバッグツールバーを使用できるようになります。


```patch
diff --git a/app/config/eccube/bundles.php b/app/config/eccube/bundles.php
index 9f22986894..5543baeee8 100644
--- a/app/config/eccube/bundles.php
+++ b/app/config/eccube/bundles.php
@@ -21,9 +21,9 @@
     Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
     Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true],
     Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
-    Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true, 'install' => true],
-    Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['dev' => true, 'install' => true],
-    Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true, 'install' => true],
+    Symfony\Bundle\DebugBundle\DebugBundle::class => ['all' => true],
+    Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['all' => true],
+    Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['all' => true],
     DAMA\DoctrineTestBundle\DAMADoctrineTestBundle::class => ['test' => true],
     Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
     SunCat\MobileDetectBundle\MobileDetectBundle::class => ['all' => true],
diff --git a/app/config/eccube/packages/prod/web_profiler.yaml b/app/config/eccube/packages/prod/web_profiler.yaml
new file mode 100644
index 0000000000..e92166a7fd
--- /dev/null
+++ b/app/config/eccube/packages/prod/web_profiler.yaml
@@ -0,0 +1,6 @@
+web_profiler:
+    toolbar: true
+    intercept_redirects: false
+
+framework:
+    profiler: { only_exceptions: false }
diff --git a/app/config/eccube/routes/prod/web_profiler.yaml b/app/config/eccube/routes/prod/web_profiler.yaml
new file mode 100644
index 0000000000..c82beff2f6
--- /dev/null
+++ b/app/config/eccube/routes/prod/web_profiler.yaml
@@ -0,0 +1,7 @@
+web_profiler_wdt:
+    resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
+    prefix: /_wdt
+
+web_profiler_profiler:
+    resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
+    prefix: /_profiler
```

ワンライナーでやりたい方は、以下をどうぞ

```shell
curl -sS https://gist.githubusercontent.com/nanasess/ca8312478d565acc5f3563e9e50022a5/raw/9cb8bcd0616cbe5d409232f997ed0585877aa4f5/symfony-profiler-on-production.patch | git apply --no-add
```
ubuntuでのgo開発環境構築

- golangのインストール  

```
sudo apt update
sudo apt install golang-1.9
```

- シンボリックリンクを張り使えるようにする

```
sudo ln -s /usr/lib/go-1.9/bin/gofmt /usr/bin/gofmt
sudo ln -s /usr/lib/go-1.9/bin/go /usr/bin/go
go version
# go version go1.9.2 linux/amd64
```
Gitで現在のtag名もしくはbranch名を取得するワンライナー

```console
$ git describe --tags 2> /dev/null || git rev-parse --abbrev-ref HEAD
```

tagの場合`git describe --tags`で取得でき、
失敗した場合は`git rev-parse --abbrev-ref HEAD`でbranch名が取得できる
数学-三角関数-円周角の定理の証明

# 円周角の定理の証明

## 円周角の定理

- **１つの孤に対する円周角の大きさは、中心角の大きさの半分になる**

<img src="https://qiita-image-store.s3.amazonaws.com/0/4641/364848f4-21b9-c96d-a9be-9cc8a61083aa.png" width="50%">


- **同じ孤に対する円周角は等しい**

<img src="https://qiita-image-store.s3.amazonaws.com/0/4641/b2d6033e-a5e1-0b6e-ccd2-3a5dcbbbe869.png" width="50%">




## ACが円の中心を通る場合

<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/4641/c88f6bb9-6e43-35fa-6a55-9ebaf32695f1.png" width="50%">
</div>

```math
OB と OC は円の半径だから、OB = OC\\
\triangle{OBC}は二等辺三角形になるので、\angle{OBC} = \angle{OCB}\\
　\\
\angle{AOB} + \angle{BOC} = 180^\circ (\because 直線)　①\\
\angle{OBC} + \angle{OCB} + \angle{BOC} = 180^\circ　 (\because \triangle{OBC}内角の和)　②\\
①②より、\angle{AOB} = \angle{OBC} + \angle{OCB} = 2 \angle{OCB} (\because \angle{OBC} = \angle{OCB})\\


```


## 円周角の内に円の中心がある場合

<img src="https://qiita-image-store.s3.amazonaws.com/0/4641/c15ce18e-e1d7-77de-45fc-4662dda2aca6.png" width="50%">

```math
C から 円の中心 O を通る線を引き円との交点をDとする。\\
OA = OB = OC は円の半径だから、\triangle{OAC} と \triangle{OBC} は二等辺三角形になるので、\\
\angle{OAC} = \angle{OCA}\\
\angle{OBC} = \angle{OCB}\\
180^\circ = \angle{AOD} + \angle{AOC} = \angle{OAC} + \angle{OCA} + \angle{AOC} (\because \triangle{OAC}の内角の和)\\
よって、\angle{AOD} = \angle{OAC} + \angle{OCA} = 2 \angle{OCA}\\
同様に、\angle{BOD} = \angle{OBC} + \angle{OCB} = 2 \angle{OCB}\\
　\\
\angle{AOB} = \angle{AOD} + \angle{BOD} = 2 \angle{OCA} + 2 \angle{OCB} = 2 (\angle{OCA} + \angle{OCB}) = 2 \angle{ACB}\\
```



## 円周角の外に円の中心がある場合

<img src="https://qiita-image-store.s3.amazonaws.com/0/4641/b5d67438-52e6-562f-7b4a-e354c9b197ab.png" width="50%">
Windows10へAndroid Studio Version 3.1.4のインストールとHello World!(2018年8月版)

Androidアプリの開発環境を整えるために、
まずはAndroid Studioをインストールしてみた。

ちょっと調べると古い記事がいろいろ出てきたり、
Macの手順しか書いてなかったりしたのでメモとして残しておく。

# 結論
ダウンロードして実行するだけでした。
所要時間は8分程度。

詳しくは[公式サイト](https://developer.android.com/studio/install?hl=ja)を読んでください。
動画付きでメッチャ詳しいので。
ちなみに明示的にJDKをインストールする必要性はありませんでした。

# Hello World!
さすがにそれだけでは味気ないので…。
おなじみ「Hello World」をやってみたいと思います。

前提としてインストールが終わり、以下の画面まで表示されたところからスタート。
![android_studio_inst_0001.png](https://qiita-image-store.s3.amazonaws.com/0/277397/23beb1c4-0a87-fed5-170f-fdc6d654552d.png)

1. Start a new Android Studio projectを選択。
2. プロジェクト情報は以下のように適当に入力。
　Application nameは、Hello_World
　Company domainは、デフォルトのママ
　　(デフォルトはユーザー名.example.comになるっぽい?)
　Project locationは、適当で。
　以下のチェックはしない(今回はJavaで開発するので)
　　Include C++ support
　　Include Kotlin support

3. サポートする環境の選択(Select the from factors and minimum SDK)
お試しなのでデフォルトのままで良いと思う。
実際に公開するときは利用数とかを見て考えるのが定石だと思う。

4. アクティビティの選択(Add an Activity to Mobile)
今回はラベルに「Hello World」が出せればいいので、
Empty Activityで。

5. アクティビティの設定(Configure Activity)
ここもデフォルトのままで。

6. そのまま進めていくとプロジェクトの環境構築?ぽいものが走る。
Cancelをクリックしないように注意。
1～2分程度待っているとIDE画面が表示される。

7. Tipsの非表示(お好みで)
初回起動時はTipsが表示されるようなので、
Show tips on startupのチェックを外してClose。

8. IDEでxmlファイル(activity_main.xml)をクリックしたらエラーが出た場合
「Gradle 'Hello_World' project refresh failed」というエラーが出た。
画面左下のBuildタブを開いてビルド結果を見ると以下の通り。
　Failed to find Build Tools revision 27.0.3
　Install Build Tools 27.0.3 and sync project
Install...はリンクなのでクリックしてインストールする。
インストールされると自動でビルドが走る。

9. 実機で実行するためにスマホで開発者向けオプションを表示する。
Xperia Z3 Compactが手元にあったのでこれで実行してみる。
開発者向けオプションは端末情報のビルド番号を連続タップすれば表示される。

10. 開発者向けオプションでUSBデバッグを許可する

11. Android Studioで実行ボタンを押す。
右上に緑色の右向き三角があるのでクリックする。
Select Deployment Targetにスマホが表示されるはず。
表示された端末を選んで次へ。

12. Instant Runというポップアップが表示された。
恐らく接続した端末のAndroidが古いバージョンなので、
デバッグ側の環境を整える必要があるっぽい。
この端末で開発するのでInstall and Continueをクリック。
インストールが終わると端末にアプリがインストールされる。
(所要時間2分ほど)

13. Hello World!
![Screenshot_2018-08-16-16-35-23.png](https://qiita-image-store.s3.amazonaws.com/0/277397/e6d3f270-7667-c419-ea75-f3b1527c0c6f.png)

# 終わりに感想
インストールがあっさり簡単過ぎたので、
Hello World!までやってみました。
案の定いくつか問題は出ましたが、すぐ解決できて良かった。

ここまではチュートリアルもチュートリアルなので、
ここからが本当の地獄だ…って印象。

まずはパッケージの設計とかするべきなんだと思うが、さて…。
Extend native function of javascript (callback)

*It may affect outer javascript and framework(like vue, angular, react etc...). <b>I strongly recommend you use it in unavoidable case</b>.

```js
function insertCallback(parent, funcname, callback, ...args) {
	let oldFunc = parent[funcname] ? parent[funcname] : function (){}
	parent[funcname] = function() {
		oldFunc.apply(this, arguments)
		return callback(...args)
	}
}
```

sample is [here](https://qiita.com/jiyu/items/1a117141f207b1faa925)
c++ で 「組み合わせ」

C++ 標準ライブラリの順列で next_permutation があるなら next_combination があっても良いよね！とか思ってたら無かったので、組み合わせ関数を書いてみたのです。

イテレータとかの対応はしようと思ってたけどめんどくさくなった感じで。

```cpp
#include <iostream>
#include <cstdlib>
#include <functional>
#include <vector>
#include <stack>

  void EnumerateCombination(
      const int *first, const int *const end, const int r,
      std::function<void(const std::vector<int> &)> callback) {
    using T = int;

    std::vector<int> pre;
    pre.resize(r);

    struct Stack {
      int iPre;
      const T *_f;
      int r;
    };
    std::stack<Stack> _stack;

    _stack.push({0, first, r});

    while (_stack.empty() == false) {
      auto curr = _stack.top();
      _stack.pop();

      if (curr.r == 0) {
        callback(pre);
        continue;
      }

      if (curr._f + curr.r == end) {
        pre.resize(curr.iPre);  //ここがちょっとアレ
        pre.insert(pre.end(), curr._f, end);  
        callback(pre);
        continue;
      }

      if (curr._f == end) {
        continue;
      }

      _stack.push({curr.iPre, curr._f + 1, curr.r});
      pre[curr.iPre] = *curr._f;
      _stack.push({curr.iPre + 1, curr._f + 1, curr.r - 1});
    }
  }

int main()
{
  int array[] = {1,2,3,4,5};
    
  auto callback = [](const std::vector<int> &vec){
    for(auto i : vec) {
      std::cout << i << ",";
    };
    std::cout << std::endl;
  };
  
  EnumerateCombination(array, array + 5, 3, callback);

  return 0;
}
```

```
1,2,3,
1,2,4,
1,2,5,
1,3,4,
1,3,5,
1,4,5,
2,3,4,
2,3,5,
2,4,5,
3,4,5,
```

説明すると、再帰的に処理してるだけ。再帰関数を使うとスタックオーバーフローするので普通の stack を利用してます。

で、たとえば ABCDE のうちから 3 つを取り出す場合だと、
まず、指定された通りの情報をスタックに積む。

```
=> ({},{ABCDE},3)
```

ここで、スタック情報は

- 第一引数は確定した要素列。
- 第二引数は組み合わせに使用する要素列。
- 第三引数は第二引数で指定した要素列から取得する要素数。

として書いてます。

で、次にスタックから一つ取り出して、最初の一要素を除いたもの、最初の一要素を確定させたもの、の２つをスタックに積む。

```
=> ({},{BCDE},3) + ({A},{BCDE},2)
```

繰り返し。

```
=> ({},{BCDE},3) + ({A},{CDE},2) + ({AB},{CDE},1) 
=> ({},{BCDE},3) + ({A},{CDE},2) + ({AB},{DE},1)  + ({ABC},{DE}, 0)
```

スタックから取り出したら 第三引数が 0 なので コールバック

```
=> ({},{BCDE},3) + ({A},{CDE},2) + ({AB},{DE},1) 、callback ({ABC})
```

繰り返し

```
=> ({},{BCDE},3) + ({A},{CDE},2) + ({AB},{E},1)   + ({ABD},{}, 0)
=> ({},{BCDE},3) + ({A},{CDE},2) + ({AB},{E},1)  、callback({ABD})
```

スタックから取り出したら 第三引数と第二引数の要素数が同じなのでコールバック

```
=> ({},{BCDE},3) + ({A},{CDE},2)、callback({ABE})
```

繰り返し

```
=> ({},{BCDE},3) + ({A},{DE},2)  + ({AC},{DE},1) 
=> ({},{BCDE},3) + ({A},{DE},2)  + ({AC},{E},1)   + ({ACD},{},0) 
=> ({},{BCDE},3) + ({A},{DE},2)  + ({AC},{E},1)  、callback({ACD}) 
=> ({},{BCDE},3) + ({A},{DE},2) 、callback({ACE})
=> ({},{BCDE},3)、callback({ADE})
...
```

以上。
Re:viewでつまづいたところを、つらつらと

Re:Viewを動かしてみてつまづいたところのメモ書き

# Macでヒラギノフォントが使えない

vvakameさんのdockerをHigh Sierra + MacTeX 2018で使ったところ、
最終pdfにヒラギノフォントがどうしても使えなかった。
結局、docker上でなくNative環境でrake pdfしたらうまくいった

# pdf作成時に「! LaTeX Error: Cannot determine size of graphic in filename (no BoundingBox). 」がでる

Macでスクリーンショットを撮ると、「スクリーンショット 2018-08-14 14.41.50.png」のようなファイル名になる。
この拡張子以外の「.」がくせ者で、これがあるとLaTeXでエラーがでる。
「ss2018-08-14-14-41-50.png」に変更したらうまくいった

# iPhoneで撮った写真が上下逆になる

iPhoneで撮った写真をRe:Viewにいれると上下が逆になった。
色々試したのだがうまくいかず、一度スクリーンショットを撮ってトリミングした。
[2018-9-9追記]
kmutoさんから助言いただき、EXIF情報を正規化するgoのパッケージがあると教えてもらった。
https://qiita.com/minodisk/items/b7bab1b3f351f72d534b
graphics-goのパッケージのインストールに苦労したが、以下のコマンドでOK

```
go get github.com/BurntSushi/graphics-go/graphics
```

プログラムはこんなかんじ

```
func main() {
	flag.Parse()
	args := flag.Args()
	r, err := os.Open(args[0])
	if err != nil {
		panic(err)
	}
	defer r.Close()
	fixed, err := processor.Process(r)
	if err != nil {
		panic(err)
	}
	w, err := os.Create("output.jpg")
	if err != nil {
		panic(err)
	}
	defer w.Close()
	jpeg.Encode(w, fixed, nil)
}
```

# cmdでのコマンドが長すぎると自動で折り返さない

これはコマンドそのものが長すぎる場合に発生。
「長すぎる」とエラーはでるか自動では折り返さない。
仕方ないので適当に改行した。
UISearchBarDelegate でインクリメンタルサーチ用のテキスト入力検知

UISearchBarDelegate を使ってインクリメンタルサーチをするためのテキスト入力検知を実装してみたので、その備忘録。
日本語の入力はちょっと怪しい。（濁音、半濁音とか）
**細かくテストはしていないので、バグがあるかもしれません。**

```objc
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    // ここでは空文字列検索はしない
    if (![searchText isEqualToString:@""]) {
        NSLog(@"keyword: %@", searchText);
        [self searchKeyword:searchText];
    }
}

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSLog(@"%@, %@, len:%@, loc:%@", searchBar.text, text, @(range.length), @(range.location));
    BOOL isFirstCharacter = (range.location == 0 && range.length == 0);
    BOOL isDeleteText = ([text isEqualToString:@""] && range.length > 0);
    BOOL isInputtingText = (![searchBar.text isEqualToString:@""] && ![text isEqualToString:@""]);
    BOOL hasNotEnterdYet = (isInputtingText && range.length == 0);
    if (isFirstCharacter || isDeleteText || hasNotEnterdYet) {
        [self searchKeyword:[self replceKeyword:searchBar.text
                                          range:range
                                     withString:text]];
        return YES;
    }
    return YES;
}

- (nonnull NSString *)replceKeyword:(nonnull NSString *)keyword
                              range:(NSRange)range
                         withString:(nonnull NSString *)string
{
    NSParameterAssert(keyword);
    NSParameterAssert(string);
    NSMutableString *result = [keyword mutableCopy];
    BOOL isDeleteText = [string isEqualToString:@""];
    if (isDeleteText) {
        [result replaceCharactersInRange:range withString:string];
    } else {
        [result insertString:string atIndex:range.location];
    }
    NSLog(@"keyword: %@", result);
    return result;
}

- (void)searchKeyword:(nonnull NSString *)keyword
{
    // Search API
}
```

# Documents
* [UISearchBarDelegate](https://developer.apple.com/documentation/uikit/uisearchbardelegate?language=objc)
run scriptの作成とlogを確認する方法

記事の中で使っているxcodeのバージョンは`9.4.1`である

## run scriptをつくる
projectのbuild phasesで「+」ボタンをタップして、`New Run Script Phase`を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/d96a52b7-339b-a61c-80ef-5f4f4a3b6284.png)

これで空のrun scriptを作った
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/369b60f1-6b02-ad0c-7e5e-04d54bc2ee14.png)

run scriptは上から順番で実行しているから、必要がある時並び替えしてね

## run scriptのlogを確認する
run scriptの中身を簡単に書き換える

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/069416c8-11fb-8e1c-9d94-7f56b9d9e550.png)

実行する...
xcodeで`report navigator`を選択し、先のbuildを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/5b8d6c16-0282-50e9-3a57-45a2fd9d03aa.png)

これで`All Messages`の中でTest Run Scriptの実行logが確認できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/cf911049-82e1-0fdb-679e-94db7248bb9c.png)
UTF-8で4バイト以上の文字を判定するカスタムバリデータをつくる

はじめに
---
DBがUTF-8の4バイト以上の文字に対応してなかったので、アプリケーション側で対応します :muscle: 

環境
---
ruby 2.5.1
Rails 5.0.6

カスタムバリデータをつくる
---

今回、個別の属性を検証したかったので、`ActiveModel::EachValidator`を利用します。
[Active Record バリデーション | Rails ガイド](https://railsguides.jp/active_record_validations.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF)

```rb
class Lt4bytesValidator < ActiveModel::EachValidator
  # UTF-8で4バイト以上の文字かを判定する
  def validate_each(record, attribute, value)
    return if value.blank?

    unavailable_chars = value.scan(/[^\u0000-\uFFFF]/)

    record.errors.add(attribute, :unavailable, chars: unavailable_chars.uniq.join(', ')) if unavailable_chars.present?
  end
end
```

localeもちゃんと設定しましょう :bulb:  

```yml
ja:
  errors:
    messages:
      unavailable: 'に使用できない文字(%{chars})が含まれています。'
```


モデルに取り込む
---

今回作成した`Lt4bytesValidator`を使うには`lt4bytes`オプションを渡せばOKです :ok_hand: 

```rb
class Article < ApplicationRecord
  validates :content, lt4bytes: true
  ...
```

挙動チェック
---
rails consoleで試してみます。 

```rb
article = Article.new
article.content = '🤓'
article.validate
article.errors[:content]
=> ["に使用できない文字(🤓)が含まれています。"]
```

以上です。

それでは〜 :wave: 

参考
---
- [UTF-8 - Wikipedia](https://ja.wikipedia.org/wiki/UTF-8)
- [scan (String) - Rubyリファレンス](https://ref.xaio.jp/ruby/classes/string/scan)
Vue.js のサンプル (JSON の取り込み）

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<script src="https://unpkg.com/vue@2.6.14"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<title>vue.js ex02</title>
</head>
<body>
<div id="app">
<table>
<tr v-for="(value,key) in cities">
	<td> {{key}} </td>
	<td> {{value.name}} </td>
	<td> {{value.population}} </td>
	<td> {{value.date_mod}} </td>
</tr>
</table>
</div>
<script src="ex02.js"></script>
<p />
Aug/16/2018<p />
</body>
</html>
```

```js:ex02.js
// ---------------------------------------------------------------
//	ex02.js
//
//					Aug/18/2018
//
// ---------------------------------------------------------------
var app = new Vue({
	el: '#app',
	data: {
	cities: []
	},
	methods: {
		async getCities() {
		var url = 'http://localhost/tmp/json/cities.json'
		await axios.get(url).then(x => { this.cities = x.data })
		}
	},
	mounted() {
		this.getCities()
	}
})

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

実行結果
![vue_aug1602.png](https://qiita-image-store.s3.amazonaws.com/0/179446/5a1e8f18-b24d-9f0c-a749-4830e7c5f006.png)

サーバーに置いた JSON

```json:cities.json
{
  "t0921": {
    "name": "宇都宮",
    "population": 68714,
    "date_mod": "1950-9-24"
  },
  "t0922": {
    "name": "小山",
    "population": 29157,
    "date_mod": "1950-3-15"
  },
  "t0923": {
    "name": "佐野",
    "population": 65741,
    "date_mod": "1950-10-7"
  },
  "t0924": {
    "name": "足利",
    "population": 38164,
    "date_mod": "1950-6-22"
  },
  "t0925": {
    "name": "日光",
    "population": 49675,
    "date_mod": "1950-8-28"
  },
  "t0926": {
    "name": "下野",
    "population": 65813,
    "date_mod": "1950-9-12"
  }
}
```

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

```text
Vue.js v2.6.14
axios v0.27.2
```
ページまとめ

# 各リンクのまとめ

## リンク

- [記法（数式）](https://qiita.com/bobchin/private/cb77ccf68a6ce9c39b46)

- 数学
  - [数学まとめ](https://qiita.com/bobchin/private/eb2ee12608a969cea3e4)
  - [ベクトル解析](https://qiita.com/bobchin/private/aafe7e0e25ff4e8689bc)

- 物理
  - [物理の公式（力学）](https://qiita.com/bobchin/private/59ac35996b0df4725b0e)
  - [物理の公式（電磁気学）](https://qiita.com/bobchin/private/c4eaa325e57fb3b62265)
  - [電磁気学まとめ](https://qiita.com/bobchin/private/60cc40a76c9ad0ba4053)
Vue.js のサンプル (Hello World)

Vue.js v3 の簡単なサンプルです。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<script src="https://unpkg.com/vue@3.2.33"></script>
<title>vue.js ex01</title>
</head>
<body>
<h2>ex01</h2><p />
<div id="app">{{ message }}</div>
<div id="app2">{{ message }}</div>
<div id="app3">{{ message }}</div>
<script src="ex01.js"></script>
<p />
Aug/16/2018 AM 08:25<p />
</body>
</html>
```

```js:ex01.js
// ---------------------------------------------------------------
//	ex01.js
//
//						May/09/2022
//
// ---------------------------------------------------------------
const app = { data() { return { message: '皆さん、こんにちは。' } } }
Vue.createApp(app).mount('#app')


const app2 = { data() { return { message: 'Hello World!' } } }
Vue.createApp(app2).mount('#app2')

const app3 = { data() { return { message: 'Good Morning!' } } }
Vue.createApp(app3).mount('#app3')

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

実行結果
![vue_aug1601.png](https://qiita-image-store.s3.amazonaws.com/0/179446/09557320-27bc-1303-27d3-ae3490f12990.png)

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

```text
Vue.js v3.2.33
```

Vue.js の最新バージョンはこちらで確認できます。
>[vuejs/core](https://github.com/vuejs/core/releases)
LocalDateの中身をDateTimeFormatterで整形する

# これは何か

[java\.time\.LocalTimeのtoString](https://qiita.com/koniatsu/items/0ec3e47f73e6f913baf3) を読んだのでDateTimeFormatter を使う例を備忘録兼ねて書いておく。

どうってことないただのメモ書き。

# コード

ログ出力にslf4jを使っているので実際に動かす際は依存関係に注意すること。

```Java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class App {

    private static final Logger logger = LoggerFactory.getLogger(App.class);
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS");
    private static final DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS");

    public static void main(String... args) {

        var time = LocalTime.now();
        logger.info(time.toString());
        logger.info(time.format(formatter));

        time = LocalTime.of(14,30);
        logger.info(time.toString());
        logger.info(time.format(formatter));

        logger.info("---------------------");

        var datetime = LocalDateTime.now();
        logger.info(datetime.toString());
        logger.info(datetime.format(formatter2));

        datetime = LocalDateTime.of(2018,8,16,10,55);
        logger.info(datetime.toString());
        logger.info(datetime.format(formatter2));
    }
}
```

# 処理結果

```
16:08:49.562 [main] INFO  App - 16:08:49.555999800
16:08:49.572 [main] INFO  App - 16:08:49.555
16:08:49.572 [main] INFO  App - 14:30
16:08:49.572 [main] INFO  App - 14:30:00.000
16:08:49.572 [main] INFO  App - ---------------------
16:08:49.572 [main] INFO  App - 2018-08-16T16:08:49.572009800
16:08:49.573 [main] INFO  App - 2018/08/16 16:08:49.572
16:08:49.573 [main] INFO  App - 2018-08-16T10:55
16:08:49.573 [main] INFO  App - 2018/08/16 10:55:00.000
```
OCSInventoryの立ち上げ方

#　手順メモ

```bash
#ubuntu16.04
sudo apt-get update
sudo apt-get install git

#Install docker-compose
https://docs.docker.com/compose/install/#master-builds

#version3なのでとりあえず最新のdocker-composeを導入
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
#1.22.0になっていることを確認
docker-compose --version
#sudoめんどくさいのでdockerグループにする
sudo groupadd docker
#$MEは現在ログイン中のユーザ
sudo gpasswd -a $ME docker
#とりあえずデーモン再起動
sudo systemctl restart docker
exit
#再ログインして

#OCSInventoryをgitclone
sudo git clone https://github.com/OCSInventory-NG/OCSInventory-Docker-Stack.git
cd OCSInventory-Docker-Stack
docker-compose build
#docker-compose.ymlを編集
#ports :
#- 8083:80
#- 443:443
#80番は使用しているので、portを8083に変更
docker-compose up &

# ブラウザで確認してみる
http://<YourIpAdder>:<Port>/ocsreports
#初期値は以下、ログインしてみる。
ID:admin
PASS：admin

```
【JavaScript】配列から重複を排除する【個人的メモ】

# はじめに
配列を受けとり、重複を排除するコードをJavaScriptで実装したものです。
reduce()関数を使います。

# 補足
下記の、Reactのチュートリアルに関連して派生。
https://reactjs.org/docs/thinking-in-react.html

ProductTableコンポーネント内での、ProductCategoryRowとProductRowの出し分けの処理において、
入力がソート済みの配列であることを前提としていたので、
「ソート済みでない配列の場合はどうするべきか」と考えたのがきっかけです。

関数型での書き方に慣れていないため、復習を兼ねてメモ。


# 実装
## データ構造
### Input
入力データは以下のような構造となります。
サンプルではcategoryごとに値が並んでいますが、順不同のケースでも対応できるようにしたい、というのが意図です。

```javascript
const products = 
[
  {category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
  {category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
  {category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
  {category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
  {category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
  {category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
];
```

### Output
入力となる配列の各要素オブジェクトから"category"を取りだした後、重複を除去してこれを配列に入れて返却します。
下記のような結果を返す関数を実装します。

```javascript
// コード
const result = extract_category(products);
console.log(result);

// 出力結果
["Electronics", "Sporting Goods"]
```

## 実装されたコード

```javascript
function extract_category(items) {
  const categories = items
  .map((item) => {return item.category}) // 1. 各要素オブジェクトから、"category"のみを抽出
  .sort() // 2. "category"の値が格納された配列をソート
  .reduce((array, item) => { // 3. uniqueな値のみ抽出
    if (array.includes(item) === false){
      array.push(item);
    }

    return array;
  },[]);

  return categories;
};
```

処理の流れを整理すると下記のようになります。

1. 各要素オブジェクトから、"category"のみを抽出
map()関数を使うことで、要素オブジェクトから特定の項目のみを抽出することができました。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

2. "category"の値が格納された配列をソート
sort()関数を使い、値をソートします。
stableではない（入力値が同値を持つ場合、入力と同じ順序にならない可能性がある）仕様ですが、今回のケースでは特に問題になりません。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

3. uniqueな値のみ抽出
reduce()関数は、第1引数に処理を行う関数オブジェクト（ここではaccumulatorと呼びます）が、第2引数に初期値が渡されます。
accumulatorは2つの引数をとります。
第1引数には直前の処理で返却された値が、第2引数には処理対象の配列の値が渡されます。
　
今回の処理では、まずreduce()関数の第2引数（初期値）として空の配列（返却値格納用）を渡します。
accumulatorは、第2引数に渡された値を一つ一つ検査し、返却値格納用の配列に存在しなければこれに追加、存在すれば追加しないで次の値の検査に進みます。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
　
ちなみに配列に値が存在するかどうかの検査は、Array.prototype.includes()を使っています。
一部のWebブラウザでは動かないと思います。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

# 実行環境
今回はCodepenを利用しました。思いついたらすぐに試せるのが良いですね。
https://codepen.io/