OmniAICreator/Qiita-1.07M huggingface dataset:
マイニングプールの自動切り替えをした

# TL;DR
> マイニングプールが落ちた時に自動的に切り替わるといいなぁ
> haproxyを使って各マイニングプールを自動で切り替えよう

```bash
#!/bin/bash

minerd -a yescrypt -o stratum+tcp://mproxy.coiner.site:11000 -u User.worker -p password
```

**振り分け先**

| 名称      |    stratum接続先   |
|:-----------------|:-------------------|
| [銭プール(ZNY)](https://zny.coiner.site) |stratum+tcp://zny.coiner.site:19666|
| [bunnymining](https://bunnymining.work)|stratum+tcp://mining.bunnymining.work:19332|

※ポートは変わっても大丈夫。ユーザー名とワーカー名・パスワードは同一！

## 手順書 haproxyをインスコ

環境：Ubuntu16.04TLS

```shell
$ sudo apt-get install haproxy
$ sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.org
$ vim /etc/haproxy/haproxy.cfg
```

## config書くよ

```config:haproxy.cfg
global
        maxconn 32768 # concurrent connections limit
        user nobody 
        spread-checks 5

defaults
        timeout connect 50000
        #timeout client 5000ms
        timeout server 50000

frontend http-in
       bind *:80
       mode http
       stats enable
       stats uri /admin?stats	

frontend stratum-in
        # proxy stratum
        bind *:11000
        default_backend stratums
    
backend stratums
       balance source
       hash-type consistent
       server stratum1 zny.coiner.site:19666 check inter 20s rise 5 fall 2
       server stratum2 mining.bunnymining.work:19332 check inter 20s rise 5 fall 2
```
※check inter 20sやtimeoutの部分はstratum (yay!!!) の出る秒数以上に設定！

## 接続テストする（Failoverテスト）

```bash:stratum接続
./minerd -a yescrypt -o stratum+tcp://mproxy.coiner.site:11000 -u User.worker -p password
```

```bash:haproxyサーバーダウン
$ nc -U /tmp/haproxy-cli.sock
prompt
> set weight stratums/stratum1 0 #接続先が変わるか確認
> set weight stratums/stratum1 1 #元に戻す
```

## 作った理由

しばしば自分のサーバーが落ちてしまうのでマイニングのダウンタイムを減らすためにLB導入した。

## 悩んだ点

初回はroundrobinで設定をしていましたが、server1に接続、server2に接続と繰り返すとリクエスト<=>レスポンスの宛先がおかしくなり正常稼働せず。
出来る限り、スティッキーセッションのように接続されるようにしました。

## 参考

[HAProxy Configuration Manual](http://cbonte.github.io/haproxy-dconv/1.7/configuration.html)
[間宮さんのさくっと仮想通貨](https://cryptomamiya.com/)
[暗号通貨ＢｉｔＺｅｎｙまとめＷｉｋｉ](http://bitzeny.cswiki.jp/index.php?%E3%83%97%E3%83%BC%E3%83%AB%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0)
[bunnymining](https://bunnymining.work)

## 追記

マイニングプール、各種コインに対応したよ！

| 名称      |    stratum接続先   |
|:-----------------|:-------------------|
| [Riecoin マイニングプール](https://rie.coiner.site/) |stratum+tcp://ric.coiner.site:12100|
| [Zcashほしいなー(ZNY)](https://zec.coiner.site/) |stratum+tcp://zec.coiner.site:11100|
| [ドージ鯉なープール](https://doge.coiner.site/)|stratum+tcp://doge.coiner.site:19000|
ReactNativeで超速簡単チャットUI実装

ReactNativeでチャット機能を持つアプリを作りたかったのですが、チャットのUI作るの面倒だなーと思っていたら超速でいい感じのチャットUI作れちゃう`react-native-gifted-chat`というコンポーネントがあったので紹介します。

#完成図
裏側の処理はまだ実装していませんが、firebase使って実装する予定。
なのでUIと表の動作だけになります。

![chat2.gif](https://qiita-image-store.s3.amazonaws.com/0/121811/31f3c12a-a442-6bf4-4100-25882b732b54.gif)


#`react-native-gifted-chat`のインストール
・`npm`の場合

```
npm install react-native-gifted-chat --save
```
(--saveを入れることで`package.json`に記録してくれます)

・`yarn`の場合

```
yarn add react-native-gifted-chat
```

#`react-native-router-flux`のインストール

```
npm install react-native-router-flux --save
```


これで準備完了。



#コード

##App.js
`react-native-router-flux`の`Router`コンポーネントや`Scene`コンポーネントを使い、`Chat`コンポーネントへのrouteを定義しています。

```javascript
//App.js
import React, { Component } from 'react';
import {
  Router,
  Scene,
} from 'react-native-router-flux';
import Chat from './src/component/Chat';

export default class App extends Component<{}> {
  render() {
    return (
      <Router>
        <Scene key='root'>
          <Scene key='Chat' component={Chat} title='チャット'/>
        </Scene>
      </Router>
    );
  }
}
```

##Chat.js

```javascript
import React, {Component} from 'react';
import {
    View,
    Text,
} from 'react-native';
import {
    GiftedChat
} from 'react-native-gifted-chat';

export default class Chat extends Component {

    //メッセージ内容をstateで管理
    state = {
        messages:[],
    };
    //「Send」ボタンが押された時に実行されるメソッド
    onSend = (messages = []) => {
        this.setState((previousState) => ({
            //stateで管理しているmessagesに送信されたメッセージを追加
            messages: GiftedChat.append(previousState.messages, messages),
        }));
    }

    render() {
        return (
            //react-native-gifted-chatが提供するコンポーネント
            <GiftedChat
                messages={this.state.messages}//stateで管理しているメッセージ
                onSend={(messages) => this.onSend(messages)}//送信ボタン押した時の動作
                user={{
                _id: 1,
                }}
            />
        )
    }
}

```

`GiftedChat`コンポーネントを使うことで特にスタイルなど調整せずにいい感じのチャットUIが出来ました。
今後は、
・送信ボタンを押したタイミングで裏でメッセージを保存する
・保存されたメッセージを読み込む
等の処理を実装しようと思います。

(参考)
[react-native-gifted-chat](https://github.com/FaridSafi/react-native-gifted-chat)
[react-native-router-flux](https://github.com/aksonov/react-native-router-flux)
[Build React Native Chat App In 30 Minutes(英語動画)](https://www.youtube.com/watch?v=7Ot5LSGHLyY)
[VBA]UTF-8(BOM制御)ファイルを出力する

#はじめに
利用シーンはあまり無いとおもいますが、[[VBA]UTF-8ファイルを出力する](https://qiita.com/kuri734/items/96b94c6f16346e69309e) でUTF-8出力に対応したので、BOMの制御にも対応してみました。
ポイントは、テキストデータをバイナリに変換してBOM(先頭3バイト)を取り除くだけです。

#準備
Visual Basic Editor のメニューから、[ツール]→[参照設定]で、リストから参照設定する。
・Microsoft ActiveX Data Objects x.x Library (最新バージョンのみでOK)


#実装
```vbnet
Public Sub SaveFile(ByVal filename As String, ByVal text As String, _
                    Optional ByVal enc As String = "UTF-8", Optional ByVal bom As Boolean = True)
    
    'BOM対応するために、バイナリにに変換
    Dim Stream: Set Stream = New ADODB.Stream
    Stream.Type = adTypeText
    Stream.Charset = enc
    Stream.Open
    
    Stream.WriteText text
    
    Stream.Position = 0
    Stream.Type = adTypeBinary
    
    'BOMなしにする
    If InStr(enc, "UTF") <> 0 And bom = False Then Stream.Position = 3
    Dim buf: buf = Stream.Read
    Stream.Close
    
    'ファイル出力
    Dim output: Set output = New ADODB.Stream
    output.Type = adTypeBinary
    output.Open
  
    output.Write buf
    output.SaveToFile filename, adSaveCreateOverWrite
    output.Close

End Sub
```
【Java】Lombokでprivateコンストラクタを省略する方法

職場の先輩が使っていたテクニックをメモ

# 1. Lombokとは
ボイラープレートコード（言語仕様上省く事ができない定型的なコード）をコンパイル時に自動生成してくれる便利なライブラリです。
例えるとJavaBeanのgetter/setter等をアノテーションで済ませられます。

# 2. やりたいこと

staticメソッドしか持たないUtility的なクラスで、インスタンス化を防ぎたい！

# 3. privateコンストラクタを作ってみる

## 3-1. 一般的なprivateコンストラクタ
EffectiveJavaにもこのような感じで記載されていた記憶があります。

```java:サンプル
public class HogeUtils {

  private HogeUtils() {
    // some exception
  }

  // some static method

}
```

## 3-2. Lombokで省略したprivateコンストラクタ
`@NoArgsConstructor`をクラスにアノテートするだけです:angel:

```java:サンプル
@NoArgsConstructor(access=AccessLevel.PRIVATE) // <- ここ
public class HogeUtils {

  // some static method

}
```

# 4. つまりどういうこと？
> `@NoArgsConstructor`
> デフォルトコンストラクタを生成するためのアノテーション。
> [TERASOLUNA Server Framework for Java (5.x) Development Guideline | 11.2. ボイラープレートコードの排除(Lombok)](http://terasolunaorg.github.io/guideline/5.3.1.RELEASE/ja/Appendix/Lombok.html)

オプションの`access=AccessLecel.PRIVATE`はその名の通り、アクセス修飾子をprivateで設定しています。
このアノテーションがついていると、よくやるやり方と同じコードが生成されるということになります。

Lombokすごい、以上。
【Java】springのコンストラクタインジェクションをLombokで省略する方法

職場の先輩が使っていたテクニックをメモ

追記：全部こちらのブログ様に載っていた
http://pppurple.hatenablog.com/entry/2016/12/29/233141

# 1. Lombokとは
ボイラープレートコード（言語仕様上省く事ができない定型的なコード）をコンパイル時に自動生成してくれる便利なライブラリです。
例えるとJavaBeanのgetter/setter等をアノテーションで済ませられます。

# 2. コンストラクタインジェクションをしてみる
`HogeLogic`が`FugaLogic`を利用していて、DIコンテナから取得したいものとします。

## 2-1. 一般的なSpringのコンストラクタインジェクション

通常のSpringのコンストラクタインジェクションを書いてみます。

```java:サンプルA
@Component
public class HogeLogic {

  private final FugaLogic fugaLogic;

  @Autowired // <- 4.3以降は省略可
  public HogeLogic(FugaLogic fugaLogic) {
    this.fugaLogic = fugaLogic;
  }

  // some method
}
```

重要なのは、**spring4.3以降はコンストラクタが1件の場合`@Autowired`を省略できる**ことです。

## 2-2. Lombokで省略したコンストラクタインジェクション

Lombokで省略したコンストラクタインジェクションを書いてみます。
`@RequiredArgsConstructor`をクラスにアノテートするだけです:angel:

```java:サンプルB
@RequiredArgsConstructor // <-ここ
@Component
public class HogeLogic {

  private final FugaLogic fugaLogic;

  // some method
}
```

## Tips. delombokしてみる
自動生成されるコードを見てみると以下のようになります。

```java:サンプルC
@Component
public class HogeLogic {

  private final FugaLogic fugaLogic;

  public HogeLogic(FugaLogic fugaLogic) {
    this.fugaLogic = fugaLogic;
  }

  // some method
}
```

`サンプルA`の`@Autowired`ナシ版が出来上がっています。

# 3. つまりどういうこと？

> `@RequiredArgsConstructor`
> 初期化が必要なフィールド(finalフィールドなど)の初期化パラメータを引数に持つコンストラクタを生成するためのアノテーション。
> [TERASOLUNA Server Framework for Java (5.x) Development Guideline | 11.2. ボイラープレートコードの排除(Lombok)](http://terasolunaorg.github.io/guideline/5.3.1.RELEASE/ja/Appendix/Lombok.html)

`@RequiredArgsConstructor`の効果によりコンストラクタが生成され、
コンストラクタが1件であるため`@Autowired`を省略したことになり、
自動的にコンストラクタインジェクションされた...というわけです。

複合技すごい。
メールの無害化処理を回避して一太郎ファイルをWAN内端末に取り込む

##私の職場では、インターネットにつながるネットワークとWANが分離されました
　ネットワークの分離は、ネットワークを通じた侵入が難しくなるという点ではいい方針ですが、ネットワーク相互のファイルのやり取りが面倒です。
　私の環境では、WAN内の端末(Windows)からWindows Server上の仮想デスクトップ環境に接続し、インターネットからダウンロードしたファイルは仮想デスクトップ環境に置かれます。
　インターネットからダウンロードしたファイルをWAN内の端末へ移動させる方法は、インターネットのメールアドレスからWANのメールアドレスに対して、ファイルを添付したメールを送ることしかありません。
##無害化プログラムがメールに添付した一太郎ファイルをすり替える
　一太郎ファイルをメールに添付してWANのメールアドレスに送ったところ、メールに対して無害化処理がされ、一太郎ファイルが「無害化処理により削除しました」という文章が入ったpdfファイルにすり替えられてしまいました。
　なぜそうなるのか。
　メール配送の途中で無害化処理プログラムが添付ファイルを監視していて、WordファイルやExcelファイルであれば有害か無害かを無害化処理プログラムが判別できるため、無害なファイルはそのまま届けられます。しかし、一太郎ファイルは無害化処理プログラムが判別できないため、一律にすり替えられています。
　一太郎ファイルをWordファイルその他の無害化されないファイルに変換して添付したら、すり替えられることはありませんが、そんな馬鹿な無害化処理プログラムのために不便を強いられるのはいやです。
というわけで、メールの無害化処理を回避して一太郎ファイルをWAN内端末に取り込む方法を考えました。


##一太郎ファイルをWAN内端末に取り込む方法
###前提
Windows Server上の仮想デスクトップ環境からWindows Serverの\Windows\System32内のプログラムを起動させられる
###手順
仮に、取り込む一太郎ファイル名を「様式.jtd」とします。
1. 仮想デスクトップ上でショートカットを新規作成し、ショートカット先として\Windows\System32\cmd.exeを入力。
2. ショートカットをダブルクリックしてコマンドプロンプトを起動。
3. コマンドプロンプトで'\Windows\System32\certutil.exe -f -encode'と入力。半角スペースを入れて、次に一太郎ファイル（様式.jtd）を入力ファイルとしてコマンドプロンプトにドロップ。 半角スペースを入れて、出力ファイル名（様式.txt）を入力して、certutilを実行。
<details><summary>成功した場合の出力例</summary><div>
入力長 = 632733<br />
出力長 = 870064<br />
CertUtil: -encode コマンドは正常に完了しました。
</div></details>
4. コマンドプロンプトで'\Windows\System32\notepad.exe'と入力してメモ帳を起動。
5. 出力ファイル（様式.txt）をメモ帳にドロップ。念のため、-----BEGIN CERTIFICATE-----と-----END CERTIFICATE-----の前に「'」を入力し、すべて選択してコピー。
6. Outlookを起動し、メールを新規作成して、本文にペースト。WANのメールアドレスに対して送信。
7. WAN内の端末でメールを受け取り、本文をすべて選択してコピー。
8. メモ帳を起動して、ペースト。-----BEGIN CERTIFICATE-----と-----END CERTIFICATE-----の前の「'」を削除。ファイル名を様式.txtとして保存。
9. コマンドプロンプトで'\Windows\System32\certutil.exe -f -decode 様式.txt 様式.jtd'と入力してcertutilを実行。
<details><summary>成功した場合の出力例</summary><div>
入力長 = 870064<br />
出力長 = 632733<br />
CertUtil: -decode コマンドは正常に完了しました。
</div></details>

##参考リンク
[Windowsでbase64エンコード・デコードする方法 - Eiji James Yoshidaの記録](http://d.hatena.ne.jp/EijiYoshida/20140618/1403092855)
ShellScriptまとめ

#はじめに
シェルスクリプトで学んだことをまとめていきます．
ほとんど自分用です．


#CURRENT=$(cd $(dirname $0) && pwd)の意味
これはどこでスクリプトを実行しても同じ結果になるためによく使うコマンドだそうです．
スクリプトが置かれている場所の絶対パスをCURRENTに入れます．

実行するシェルがこちら

```bash:/Users/***/Downloads/shell/hello.sh
CURRENT=$(cd $(dirname $0) && pwd)
echo $0
echo $(dirname $0)
echo $CURRENT
```

これを
`/Users/***/Downloads`
で
`shell/hello.sh`
として実行します.結果はこちら

```bash
shell/hello.sh
shell
/Users/***/Downloads/shell
```

まずそれぞれの意味はこんな感じです．

| コマンド等      |意味　|
|:------------|:---|
| $0          |スクリプトの名前|
| dirname hoge|hogeのディレクトリ部分を返す|
| $(~)        |コマンド置換．~の部分の標準出力で $(~)を置き換える|
| a && b         |aが実行され，正常終了し戻り値が0であればbを実行|
| pwd         |カレントディレクトリを返す|

流れとしては

```
dirname $0 で実行ファイルのあるディレクトリを標準出力に出力
↓
$( dirname $0)を出力で置き換える
↓
cd　$( dirname $0)が正常に行われれば
↓
&&の右の　pwd　が実行される
↓
最後に$()でコマンド置換
```

といった感じだと思います．


$0はスクリプトの名前と書いてますが，Downloadsディレクトリで実行した場合，shell/hello.shと帰ってきてるので，実行コマンドみたいなものでしょうか？

#文字列の処理
##右から抽出
```bash:
str=$(echo 'hogehoge' | rev | cut -c 1-2 | rev)
echo $str
# ge
```
反転してから1-2文字目を抽出し，反転し元に戻す感じですね．

##'hoge'を含むかの判定
```bash:
if [ $(echo 'asfhogeagj' | grep 'hoge') ]; then
	echo 'yes'
fi
# yes
```
moviepyによる動画変換処理 with ndarray

動画を処理するためのtipsです。

moviepyのインストールは

```bash
pip install moviepy
```
と簡単です。

`VideoFileClip`クラスのメソッド`fl_image`にコールバック関数をセットします。
このコールバック関数は、各フレームの画像を'(Height, Width, Channel)'の`ndarray`として受け取り、同様の形式の`ndarray`を返すことで動画を変換できます。便利ですね。

下記は、各ピクセル0〜255で表現されている`ndarray`を反転させることで色の反転を行った例です。

```python3
from moviepy.editor import VideoFileClip

def func(frame):
    """
    :param frame: (H, W, Channel) [ndarray]
    :return: (H, W, Channel) [ndarray]
    """
    return -frame + 255 # 色を反転

inpout_video = "test_input.mp4"
output_video = 'test_output.mp4'

clip1 = VideoFileClip(inpout_video)
project_clip = clip1.fl_image(func)

project_clip.write_videofile(output_video, audio=True)
```
Python3始めてみました。

#テキストファイルを読み込む

研究で死ぬほどニッチなプログラム言語を使っているので、なんとなく今日からpython始めてみました。ほぼ自分用メモ。
###テキストファイルの読込み

```python3:read_file.py
f = open(filename, 'r')
for line in f:
  print(line)
f.close()
```

これでテキストファイルを読めた。しれっと for in の部分はfを1行ずつ出力してるだけ。
おわりは.close()。

めっちゃ簡単。なにゆえ自分たちの研究界隈は1ライセンス数十万するような言語使ってるのかやっぱりまだ理解できない。数学系ライブラリとかプロット用のパッケージとかいっぱいあるしなあ。というか理解できるほど使いこなせてないのが事実か...

次、1行に複数の要素があるときの処理。例えば以下のようなテキストファイルがあったとする。

```text:test.txt
俺　　お前　　母ちゃん　　父ちゃん　　弟　　妹
```

これを各要素で分けて配列に格納したいときとか、

```python3:read_file.py
f = open(filename, 'r')
for line in f:
  elements = line.split()
f.close()
```

mapとか使うと別々の変数とかに入れられる気がする。あんまりわからんですが...。
こんな感じでぼちぼちメモして行こうと思います。
[macOS Sierra] Homebrewのupdateが出来ない。

# Sierraにしてから久しぶりのupdate。でも出来ない。
`$ brew update` をすると、


```
Error: /usr/local is not writable. You should change the ownership
and permissions of /usr/local back to your user account:
  sudo chown -R $(whoami) /usr/local
```
↑エラー①とする。

と出てくる。

`$ sudo brew update` をすると、

```
Error: Running Homebrew as root is extremely dangerous. As Homebrew does not
drop privileges on installation you are giving all build scripts full access
to your system. As a result of the OS X sandbox not handling the root user
correctly HOMEBREW_NO_SANDBOX has been set so the sandbox will not be used. If
we have not merged a pull request to add privilege dropping by November 1st
2016 running Homebrew as root will be disabled. No Homebrew maintainers plan
to work on this functionality.
```
rootでhomebrewを動かすのは大変危険やからとアップデートさせてくれない。

## /usr/local の所有者を変更する。

エラー①の最後に記載されていたお告げ、
> `sudo chown -R $(whoami) /usr/local`

を行う。
`$ sudo chown -R 【username】 /usr/local`
※【username】は人それぞれ違うのでご注意を。

[chownとそのオプション](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230729/)

## 再チャレンジ
`$ brew update`

```
==> Downloading https://homebrew.bintray.com/bottles-portable/portable-ruby-2.3.3.leopard_64.bottle.1.tar.gz
Warning: Failed to create the file
Warning: /Users/【username】/Library/Caches/Homebrew/portable-ruby-2.3.3.leopard_64
Warning: .bottle.1.tar.gz.incomplete: Permission denied
```
別のエラーが出た。

## エラー文に従って、Homebrewの所有者を確認してみる。
1.ディレクトリ移動
`$cd /Users/【username】/Library/Caches/`

2.Homebrewディレクトリの詳細情報を確認する。
`$ls -l | grep Homebrew`
すると、

```
drwxr-xr-x   7 root      staff      238  7 11  2016 Homebrew
```
あ、rootが所有しているみたい。
今のままだとrootアカウントでbrew updateでもしない限りはpermission deniedになるわけだ。

## Homebrewの所有者を変更する。
`$ sudo chown -R 【username】 Homebrew/`

その後、確認。
`$ ls -l | grep Homebrew`

```
drwxr-xr-x   8 【username】  staff      272 12 28 23:18 Homebrew
```

よし、変更されている。

## 再々チャレンジ
`$ brew update`

```
==> Downloading https://homebrew.bintray.com/bottles-portable/portable-ruby-2.3.3.leopard_64.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring portable-ruby-2.3.3.leopard_64.bottle.1.tar.gz
Already up-to-date.
==> Migrating HOMEBREW_REPOSITORY (please wait)...
==> Migrated HOMEBREW_REPOSITORY to /usr/local/Homebrew!
Homebrew no longer needs to have ownership of /usr/local. If you wish you can
return /usr/local to its default ownership with:
  sudo chown root:wheel /usr/local
```

とりあえず成功！
どうやら/usr/localの所有者について言っているがこれについてはまた今度。

## 参考URL
[Mac Os をSierraにしたらHomebrewがupdateできなくなった？](https://qiita.com/ARTS_papa/items/6928b36bf08217846a3b)
[brew install redisでErrorが発生したときの解決策](https://qiita.com/hujuu/items/ffcf431de1d1285f849c)
なるべく安く、子供にコンピュータを。プログラミングの勉強ができる環境づくり

# 対象読者
Google検索とかから来たであろう...

- **子供**
- **親御さん**
- 学校の先生とか...?

エンジニアの方々にとっては常識的だと思います。

# 背景
## パソコンは高い!
実際高い。
クリスマスプレゼントにでも、はいどうぞとできる値段でもない。
自分が数年前まで中学生で、プログラミングやってみたかったものの自分用のパソコン買ってもらえなかったから悲しかった(結局奨学金制度を利用して中3のとき購入できた)
### 子供に買ってやれない家庭も割と多いのでは
日本の子供の7人に1人は貧困状態とか言われる今。親としては買ってあげたいけど、経済的な理由から子供にまでパソコンなんてとても...という家庭もかなり多いはず。


## 親の理解
親の理解が得られなかったりすると大変。
なんで7、8万も出して子供におもちゃ買ってあげなきゃいけないんだスマホでいいだろ。

# なるべく安くプログラミングができる環境を整えよう
- 決して安くはないが、貧困状態であってもなんとか子供に買ってやれる値段(僕の感覚がずれていたらご指摘ください)
- 親の理解が得られなくとも、子供がお年玉で買えちゃう(小学生の平均は26000円、中学生の平均は44000円程度だそうです。まじかよ!いいなぁ...)

# これが構成だ! なんとお値段9968円!!!
## コンピュータ本体
### Raspberry Pi 3 Model B: 5980円 ([Amazonリンク](http://amzn.asia/0upXL77)) ([Wikipediaリンク](https://ja.wikipedia.org/wiki/Raspberry_Pi))
ちっこいパソコンです。デスクトップのパソコンがめちゃくちゃ小さくなったものと考えてもらえば結構です。詳細はググるなりWikipedia見るなりで確認してください。
OSはWindowsではなくLinuxです。素晴らしい!
電子回路工作も可能なので、子供のイマジネーションを最大限に引き出せます。
僕も一時期使っていましたが、プログラミング学習などの用途ならスペック的にも特に問題ないと思います。3Dゲームを作りたい!となると厳しいものがあると思いますが...

## キーボード
### エレコム キーボード TK-FFCM01BK: 900円([Amazonリンク](http://amzn.asia/4LN9GvV))
Raspberry PiのUSB端子に挿して使います。適当にAmazonで安そうなやつを探してきましたが、これ以外にも同じような価格帯でたくさんあります。
もっと安く手に入れたければ、ハードオフのジャンクコーナー行けば300円くらいで置いてあります。

コードを書く上でキーボードというのは非常に重要です。とりあえずこれを買っておいて、あとから余裕があればもっといいものを買いましょう。最初からもっといいものを買っておくのも手かもしれません。

## マウス
### エレコム ワイヤレスマウス: 810円 ([Amazonリンク](http://amzn.asia/gj6Wj27))
とりあえず安かったのでこれを挙げておきましたが、同価格帯で種類はたくさんあるので気に入ったものを買うといいでしょう。

キーボードと同じく、あとからもっといいものにグレードアップするといいと思います。

## SDカード
### Samsung microSDカード 32GB: 1680円 ([Amazonリンク](http://amzn.asia/fop5qTE))
Raspberry Piは、なんとハードディスクの代わりにmicroSDカードを使っています。8GBあれば動くようですが、今後のことも考え32~64GBあたりを購入しておくのが無難なのではないでしょうか。

## HDMIケーブル
### Amazonベーシック ハイスピード HDMIケーブル: 598円 ([Amazonリンク](http://amzn.asia/6uZ6ebt))
家にあるテレビ(またはディスプレイ)をRaspberry Piとつなぎます。

## その他
- ディスプレイ  
家のテレビがRaspberry Piのディスプレイとして使えます。最近はテレビのない家庭も多いと思いますが、その場合はディスプレイ買ってください。20インチ以下のものなら新品でも1万円しません。この記事ではテレビに接続するものと仮定します。(もちろん使わないディスプレイがある場合はそちらに接続)
- ネットワーク  
Raspberry PiはWi-FiやBluetoothといったワイヤレス機能が付いています。もし家にWi-Fiが飛んでいない場合は、有線LANケーブルを購入して有線でインターネットに繋げないといけません。この記事ではWi-Fiが飛んでいるものと仮定します。
- 電源  
電源はmicroUSBから取ります。Androidスマホの充電器などに繋げばよいので、もしそういったものを持っていない場合は購入する必要があります。

# これで1万以内で子供がパソコンでプログラミング学習できる
やったね!
確かに9968円って全く安くはないと思いますが、ぜひ子供にコンピュータを買ってあげてください。全国の親御さんよろしくお願いします。本当に。

<hr><h6>どうしてもノートPCがほしければRaspberry PiをノートPC化する[Pi-Top](https://jp.rs-online.com/web/p/processor-microcontroller-development-kits/1245265/)という代物が</h6>
<hr><h6>※記載されている価格は記事執筆時のものです。</h6>
新規Railsプロジェクトの作成手順まとめ

`rails new` するときにいつも手順を忘れてしまい、
いろいろなサイトや記事を見ることになるので、自分用のメモとしてまとめておきます。

## 1. Gemfileを生成してvendor/bundle以下にRailsをインストールする
まずはRailsプロジェクトを作成します。

Rails Tutorialや入門書では

```
$ gem install rails
$ rails new project-app
```
と書かれていますが、これではシステムのgemにインストールされてしまいます。システムのgemはできるだけクリーンに保ち、gemは`vendor/bundle`に入れて`bundle exec`で呼び出すようにするのが良いそう。

ですので、先にディレクトリを作成し、`vendor/bundle`にrailsをインストールします。

```
$ mkdir test-app
$ cd test-app
$ bundle init
Writing new Gemfile to /path/to/project_name/Gemfile
```

生成されたGemfileを下記のように編集します。（railsのコメントを外すだけ）

```rails:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"
```

これで準備ができたので、下記のコマンドでRailsをインストールします。

`$ bundle install --path vendor/bundle`

この時に`--path vendor/bundle`を忘れずにつけること。
このオプションを付けることによって、プロジェクトの`vendor/bundle`以下にgemが格納されます。（一度オプションをつけて`bundle install`したら、次回以降はオプションを付けなくてもvendor/bundle以下に格納されるようになります）

## 2. Railsプロジェクトを生成する
準備が整ったのでRailsプロジェクトを生成します。

`$ bundle exec rails new . -B -d mysql --skip-turbolinks --skip-test`

Rails Tutorialなどでは `$ rails new test-app` のようにプロジェクト名を指定していますが、ここを`.（ドット）`にすると現在のディレクトリにRailsプロジェクトが生成されます。

使用しているオプションは以下の通りです。

| オプション | 効果 |
|:-----------|:------------|
| -d, --database=DATABASE | 指定したデータベースに変更する（railsのデフォルトのDBはsqlite3） |
| --skip-turbolinks | turbolinksをオフにする　|
| --skip-test | railsのデフォルトのminitestというテストを使わない時に付ける。RSpecなどほかのテストフレームワークを利用したい時に使うと良い |
| ｰB, --skip-bundle | Railsプロジェクト作成時にbundle installを行わないようにする |

ほかにも様々なオプションがあるのですが割愛します。コマンドがわからなくなった時や使えるオプションを調べたい時は `$ rails new -h` を実行してみましょう。ヘルプが表示され、使用できるオプションが確認できます。

Railsのインストール実行時にGemfileを上書きしていいか聞かれますが、yesにして続行します。

## 3. 必要なgemをインストールしてmasterにpush
Railsプロジェクトが生成できたら、Gemfileを編集して必要なgemをインストールしましょう。

Gemfileを編集したら`bundle install`を実行したら、gitの管理下に置いてgithubに公開します。
このとき、`.gitignore`を編集しておくこと。私は https://www.gitignore.io/ でRails用に生成してくれる`.gitignore`ファイルをそのまま使っています。

```
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin https://github.com/username/hoge.git
$ git push -u origin master
```

これでWebアプリを作る土台ができました！

## 参考にしたサイトや記事
* [Ruby on Rails チュートリアル](https://railstutorial.jp/)
* [Railsドキュメント](http://railsdoc.com/rails)
* [rails new 手順書](https://qiita.com/youcune/items/312178c54c65f3ab4d42)
Docker上にApache Zeppelin + Apache Spark + Python(Keras, TensorFlow)の環境を作ってみた

# 目的
[前の投稿](https://qiita.com/tw_trader1/items/3cbae70fc9a95c0d55e5)で[QRNNでカオス時系列データ予測](https://qiita.com/yukiB/items/681f68690ffabbf3e1e1)を使って為替予測にチャレンジしてみたかったが、環境がないと始まらないということでdockerを使ってApache Zeppelin + Apache Spark + Python(Keras, TensorFlow)の環境を作ってみた。

# Apache Zeppelin with Apache Spark + Python(Keras, TensorFlow) over Docker
現在業務でApache Sparkを使ってデータのクレンジング・集計・統計を行なっているが、いちいちシェルやプロジェクトでデータ整形・統計を行なってると何が何だかわからなくなるので、GUIでインタラクティブなツールとして[Apache Zeppelin](https://zeppelin.apache.org/)を利用している。

![notebook.png](https://qiita-image-store.s3.amazonaws.com/0/224915/9ea4eb65-cefb-4735-8283-322d1dba0191.png)


notebookとして処理をまとめられるのでなかなか便利だ。
(ipythonのSpark特化版みたいなもの)

また、Apache Zeppelinはdocker上で動作させている。
(処理は完全分散モードで動作しているsparkに投げているので、zeppelin自体のリソースはさほど必要ないため)

この環境ではデータのクレンジング・集計・統計作業を楽々行えるが機械学習の環境整備はまだできていない。
特にDNNを使用したい場合、Spark MLlibでは対応していないので他のライブラリが必要となる。

そこで、上記環境にPython(Keras, TensorFlow)を追加しクレンジング・集計・統計・機械学習まで一気に行える環境にする。

想定している処理分担は以下の通り。
 - クレンジング : Spark(Scala)
 - 集計 : Spark SQL
 - 統計 : Spark SQL
 - 機械学習 : Spark MLlib, Python(Keras, TensorFlow)

## D-Zeppelin
Apache Zeppelin with Apache Spark + Python(Keras, TensorFlow) over DockerをD-Zeppelinとして[githubに公開しました。](https://github.com/YoshihisaMaruya/D-Zeppelin)

使い方はReadmeを読んでください。
(hiveのmetasotreの扱いに苦労しました...)

# 今後
D-ZeppelinのGPU対応と環境ができたので実際に為替予測を始めたいな.
SVGをネストした場合のouterHTMLでxmlnsが補完された話

# TL;DR
**事象**
svgタグをネストした場合に、ネストしているsvgタグに勝手に`xmlns=""`が付加されていた。（ChromeとFirefoxで再現。Safariは再現しない）

**何が起こる？**
表示して欲しいsvg（ネストしているsvg）が表示されない。

**解決策**
1. ネストするsvgを作るときにちゃんとxmlnsを指定しておく。
2. 勝手に付加された`xmlns=""`を削る。
3. 事前に`setAttribute`でxmlnsを指定してあげる。

# はじめに
そもそも何をしたかったのかと言うと、svgでテンプレートを作っておいて、後から作成したsvgをそのテンプレートに埋め込んでダウンロードさせたかった。
svgはネストできるので、問題なくできるだろうと思っていたら意外とハマった、という話の備忘録。

# 事象
まず、以下のコードをjsfiddleとかで実行すると再現できると思います。（2017/12/28現在のChromeとFirefoxでは再現確認）
本来のコードではちゃんとwidthとかviewboxとか様々指定していますが、今回は事象再現のためだけに簡略化しています。

```js:sample.js
const parser = new DOMParser();
const doc = parser.parseFromString( `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>`, "image/svg+xml" );

const templateSVG = doc.childNodes[ 0 ];
const savingSVG = parser.parseFromString( `<svg></svg>`, "image/svg+xml" ).firstElementChild;

templateSVG.appendChild( savingSVG );

console.log(doc.documentElement.outerHTML);
```

ChromeかFirefoxで実行した結果、コンソールに出力されるのは以下のような文字列です。

```html
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><svg xmlns=""/></svg>
```

Safariだと以下になります。

```html
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><svg/></svg>
```

差としては、ネストされているsvgの属性に、勝手に`xmlns=""`が付加されているかどうか。

この状態のsvgをBlobにしてダウンロードして、それを開くとあら不思議。
ネストしたsvgの方だけ表示されない。。。

ちなみに、ネストしている方のsvgを単体で保存した場合にはちゃんと表示されます。

# 原因と解決策
調べてみると、どうやらタイミング的にはouterHTMLで書き出した時に`<svg xmlns=""></svg>`といった具合に`xmlns=""`が補完されていました。

`xmlns=""`を削れば動きます。
ただ、outerHTMLをすると勝手についてしまうので、ちゃんと`setAttribute`で`xmlns`の値を指定してあげました。

これで解決！

```ts
const parser = new DOMParser();
const doc = parser.parseFromString( templateString, "image/svg+xml" );
const templateSVG = doc.childNodes[ 0 ];

const partSVG = parser.parseFromString( svgString, "image/svg+xml" ).firstElementChild;

// xmlnsは必須。ない場合はouterHTMLで勝手にxmlns=""が追加され、結果的に表示されない。
partSVG.setAttribute( "xmlns", "http://www.w3.org/2000/svg" );
templateSVG.appendChild( partSVG );

console.log(doc.documentElement.outerHTML);
```

ただ、そもそも上記のコードでいうところの`svgString`を作る際にxmlnsを指定しておけば良かったという。。。
pythonの文字コードについてメモ

# pythonでの文字コードの挙動についてのリンク集
5分で理解するpython文字コード　http://yut.hatenablog.com/entry/20110106/1294337077

Python3でUnicodeDecodeErrorに遭遇したときのTODOリスト
https://qiita.com/narupo/items/c6ea890c485fecee440a
2018年から誰でも始められるJavaScript

[ECMAScript® 2017 Language Specification (ECMA-262, 8th edition, June 2017)](https://www.ecma-international.org/ecma-262/8.0/) を読みましょう。また現時点でStage 4になっていてECMAScript 2018に含まれることが確定している[Template Literal Revision](https://tc39.github.io/proposal-template-literal-revision/)と[s/dotAll flag for regular expressions](https://tc39.github.io/proposal-regexp-dotall-flag/)も併せて読むと良いでしょう。
Vulsのレポートを使ってCentOSでyum --security updateしたい

## 背景
* Vulsは便利
* 放置してたサーバはパッケージ数が多くて大変
* 簡単にセキュリティに関するアップデートだけしたい

## 調査
CentOSはyum --security update が機能しない
→ [yum-security-plugin in Centos](https://www.centos.org/forums/viewtopic.php?t=51300)
※yumリポジトリ用のセキュリティに関するメタデータが提供されていない模様

---

[CEFS](http://cefs.steve-meier.de/) で提供されるCentOSのエラッタ情報を [generate_updateinfo.py](http://blog.vmfarms.com/2013/12/inject-little-security-in-to-your.html) に食わせればyum用メタデータが作れる！
→ [CentOS6 でセキュリティに関するパッケージの更新のみ行う](http://vogel.at.webry.info/201402/article_4.html)  

* が、ダメ。Vulsのレポート結果と食い違う(過少)
* rpmにepoch情報を持ったパッケージがリストアップされない
    * CEFS提供のメタデータにはepochが含まれていないっぽい
    * generate_updateinfo.pyでもepochは補完されない

---

Vulsのレポートからyum用リポジトリのメタデータ(updateinfo.xml)を作ればいいじゃん！

* そのようなものはない
* じゃあ、どうする

## 解決策
作った → [vuls_to_updateinfo](https://github.com/GEROMAX/vuls_to_updateinfo)
使い方はギフハブ参照。
アセンブラ学習log_1

# モチベーション
- `エンジニアならアセンブラ読めて当然だよね`的な煽り文句を**はてぶ**で受けた
- 年末年始でとりあえず入門してみよう
- 飽きたら即終了の予定

# 参考書籍
http://amzn.asia/36bcPcT


# 2017_12_28 基礎知識と計算式

## アセンブラの単位

アセンブラの命令 = 各CPUが実際に実行する命令



## アセンブラ/アセンブリ/アセンブル
- アセンブリ => アセンブリ言語プログラム
- アセンブラ => ソフトウェア、命令の全てが整数
- アセンブル => アセンブラが行う操作のこと

まとめ `アセンブリ言語をアセンブラを通してアセンブルする`

アセンブリ言語の1行1行は`ニモニック ソースオペランド デスティネーションオペランド`で構成される


## アセンブラの種類

この二つ、パラメータの順序もコマンドも異なる

- Intel表記
- AT&T表記
  - GNUアセンブラ(GAS)はこちら

## 書き方

▼コメント

```
 XXXXX YYYYYYYY    ;{この部分はコメント}
```

▼値の移動

```
mov 2h ah,02
```

2という値をCPUの`2h`に転送(=値の移動)させる



▼値の移動

```
mv1  $88, %ecx
```

88($88=10進数的に88)を`ecx`というところに転送している





▼値の移動

```
mv1  $1  -4(%rbp)
```

1を `RBPというレジスタから−４引いた場所`に転送する



▼値の計算

計算した値は全てデスティネーションに保存される

加算処理

```
addl %edx %eax
```

減算処理

```
sub1 -8(%rbp) %eax
```

商算処理

```
imul1 -8(%rbp) %eax
```

除算処理

```
idiv -8(%rnp) %eax
```

- ソースにはメモリもレジスタも可能
- デスティネーションはレジスタのみ

▼アドレスを保存

サイズは`q`

ソースのアドレスをデスティネーションに保存(転送では無い)

```
leaq .LC0(%rip), %rcx
```

▼出力

```
leap .LC0(%rip), %rcx
call prinf
```

`.LC0(%rip)`は、printfが使うアドレス、前もってprintfで使用する書式を設定している


▼64bit拡張

32bitから64bitに符号拡張する

```
mov1 -4(%rbp) %eax
cltd
```


## レジスタ/メモリアドレス

レジスタとメモリアドレスは別物

- レジスタ
  - 計算する場所
  - RBP
  - EDX
  - EAX
- メモリアドレス
  - 保存する場所
  - RBP-4
  - RPB-8

最重要なレジスタ => `RAX`レジスタ（別名`アキュムレータ`）

- 64bitを扱うときは`RAX`レジスタ
- 32bitを扱うときは`EAX`レジスタ(RAXレジスタの下位32bit)
- 16bitを扱うときは`AX`レジスタ(EAXレジスタの下位16bit)
- 8bitを扱うときは`AH`レジスタまたは`AL`レジスタ(AXレジスタの上位8bitを`AH`, 下位8bitを`AL`)

- RAX
  - 最頻出
  - アキュムレータ
  - 算術演算
  - 操作結果保存
- RBX
  - ベースレジスタ
  - メモリアドレス保存
- RCX
  - カウンタレジスタ
  - シフト/ローテート命令
  - ループ命令
- RDX
  - データレジスタ
  - 算術演算操作
  - I/O操作データ保存
- RBP
  - スタックベースポインタ
  - スタックのベースの場所を示す
react-native-svg-uriで静的SVGを使った時にハマった

こんにちは、バイトでreact-nativeでsvgを描画する必要があったので、描画しようとしたら色んな所でハマったので、同じことやる人に伝われば嬉しいです。鈴木です。
## まず動かねえ
ちなみにreact-native-svg-uriっていうのは[コレ](https://github.com/vault-development/react-native-svg-uri)で、RNでuriからsvgを描画できるライブラリです。名前の通りですね。
依存先の[react-native-svg](react-native-svg)のNOTICEにあるように、バージョンをよくみてインストールしないと動きません。自分の場合は`react-native 0.50.3`だったので、`yarn add react-native-svg-uri react-native-svg@^5.5.1`したらいけました。
## 静的ファイルが描画できねえ
Sketchで作られたsvgファイルを描画しようとして、READMEのUsageにあるように`require('../assets/hoge.svg')`とやったら「生のテキストを`<Text>`タグの外で使うな」という旨のエラーで怒られ、んなことしとらんがなと思いつつもエラーメッセージを読んでいくと、なにやら「Sketch」の文字があり、Sketchでsvgを吐くと一行コメントが入ってしまうみたいですね。このライブラリはコメントアウトをスルーしてくれないみたいなのでsvgファイルからそのコメントを削除してもう一度やりました。
そうしたら今度は空文字列と改行文字でひっかかりました。そうこのライブラリ、空白と改行もスルーしてくれないので、改行と空白のあるsvgだと描画できません。辛い。
ので、svgをminifyするライブラリやらツールやらを使ってminifyし、テキストエディタの文字置換で改行を削除したら普通に描画されるようになりました。
## Androidで描画できん
最初iosシュミレータでやっていて、やったぜうごいたぜと喜んでandroidでビルドしてみたら真っ赤な画面が出、ぐぐってみたら同じエラーのIssueがありました。[コレ](https://github.com/react-native-community/react-native-svg/issues/135)です。このコメントの中で解決策があって、依存パッケージが`RNSvgPackage`から`SvgPackage`に変更されたことで、`MainApplication.java`を書き換える必要があるらしいです。

```java:MainApplication.java

import com.horcrux.svg.SvgPackage;
...
@Override
protected List<ReactPackage> getPackages() {
    return Arrays.asList(
        ... other packages ...
        new SvgPackage()
    );
}
```
## 直って（直そうかな
react-native-svg-uriに上がっているプルリクを見ていないので、既出だったらしませんが、時間があるときに直すプルリクを投げたいですね。面倒すぎるので、、、
Pythonでのガウス法を用いた連立方程式の求解

#環境
* Linux Mint MATE 18.2
* Python3.6.3
* Atom エディター

# コーディング
線形の連立方程式をガウス法と呼ばれる最も簡単な方法を用いて解きたいと思います。

連立方程式をプログラムで解くという話は[C言語でのガウス法による線形連立方程式の求解](https://qiita.com/haya_walker/items/d64a5fc624c65a324fa2)で一度しています。このアルゴリズムの詳細についてはこの記事とそのリンクを見てください。この記事ではC言語を用いてコードを書きましたが、このような行列計算はPythonが得意としています。ですので、今回はPython3を用いて記事のコードを書きなおしてみたいと思います。

Cで書いたコードは、Pythonでnumpyを使うことでかなり簡潔に書くことができます。

```python3
import numpy as np

# solve "mat * x = b" about x
mat = np.array([[1., 2., 4.], [3., 4., 8.], [-1., 4., 2.]])
b = np.array([7., 15., 5.])

print(mat)  #original matrix
for i in range(len(mat)-1):
    for j in range(i+1, len(mat)):
        coef = mat[j][i] / mat[i][i]
        mat[j] -= mat[i] * coef
        b[j] -= b[i] * coef

for i in range(len(mat)-1, 0, -1):
    b[i] /= mat[i][i]
    mat[i] /= mat[i][i]
    for j in range(i):
        b[j] -= b[i] * mat[j][i]
        mat[j][i] = 0

print(b) #Solution
```

このコードでは、例として

```math
\begin{align}
\begin{cases}
x+2y+4z=7 \\
3x+4y+8z=15 \\
-x+4y+2z = 5
\end{cases}
\end{align}
```
を解いています。これを実行すると[1.,1.,1.]が得られます。
Vagrant 簡単構築

# Vagrantの公式通りの簡単構築
参考：
[Vagrant 公式](https://www.vagrantup.com/)
[Vagrant Boxes](https://app.vagrantup.com/boxes/search?_ga=2.110470605.990500777.1514463201-1143016773.1511451923)

公式サイトのBoxes（Vagrantのボックスを探す場所）でCentOS7を探した結果は、こんな感じです。

<img width="1179" alt="スクリーンショット 2017-12-28 21.30.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/205341/20b59b84-d500-43f8-80cb-add35bbd70f1.png">
   

---
[centos/7]というものをクリック。
<img width="927" alt="スクリーンショット 2017-12-28 21.31.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/205341/0e8dbf0f-4aa4-050b-f6aa-7774e2064f62.png">

ここに出てくる
Vagrantfileの情報は、あとで使う。

## 実際の方法

まずvagrantを起動するディレクトリ作成

```:terminal
$ mkdir Vagrant
$ cd Vagrant
$ mkdir CentOS7
$ cd CentOS7
```

次にVagrantを構築。

```:terminal
$ vagrant init
```

すると、Vagrantfileが今のディレクトリに出力される

```:terminal
$ ls
Vagrantfile
```

このVagrantfileを編集

```:terminal
$ vim Vagrantfile
```

内容は、先ほどのBoxesのサイトで検索した結果を入力する。
config.vm.box = "base"という箇所だけ書き換える。

```:Vagrantfile
Vagrant.configure("2") do |config|

# ~~~
  #config.vm.box = "base"
  config.vm.box = "centos/7"

# ~~~
end
```

Vagrantを起動

```:terminal
$ vagrant up
```
この作業は、結構長い...

最後にVagrantにログイン！！

```:terminal
$ vagrant ssh
```

お疲れ様でした。
TensorFlowで強制的にallow_growth = Trueをする

TensorFlowは `allow_growth` を設定しないとGPUのメモリを全部使おうとしてしまうけど、色々困るので強制的に設定するようにしてみた。

# おことわり

世の中こういう事をやりたい人はそれなりにいると思うけど、「バグ報告のときとかに問題になるからやめとけ [^1]」[みたいな話もあったりする](https://github.com/tensorflow/tensorflow/issues/8040)のでその辺は認識した上でどうぞ。

[^1]: …とまでは言ってないけど。

# やり方

`site-packages` ディレクトリ (Minicondaとかの場合、`インストール先/lib/python3.6/site-packages/` とからへん)直下の `sitecustomize.py` (無ければ作る) に、以下のようなコードを入れる。

```py3
import importlib.machinery
import sys


class CustomFinder(importlib.machinery.PathFinder):

    def find_spec(self, fullname, path=None, target=None):
        if fullname == 'tensorflow.python.client.session':
            spec = super().find_spec(fullname, path, target)
            loader = CustomLoader(fullname, spec.origin)
            return importlib.machinery.ModuleSpec(fullname, loader)
        return None


class CustomLoader(importlib.machinery.SourceFileLoader):

    def exec_module(self, module):
        r = super().exec_module(module)
        self._patch(module)
        return r

    def _patch(self, module):
        original_init = module.Session.__init__

        def custom_init(self, *args, config=None, **kwargs):
            import tensorflow as tf
            if config is None:
                config = tf.ConfigProto()
            config.gpu_options.allow_growth = True
            return original_init(self, *args, config=config, **kwargs)

        module.Session.__init__ = custom_init
        return module


sys.meta_path.insert(0, CustomFinder())
```

import されたときに `__init__` にmonkey patchする感じ。

# 動作確認

```shell
$ python -c 'import tensorflow as tf; print(tf.Session()._config)'
(略)
gpu_options {
  allow_growth: true
}
```
【Rust】標準入力から文字列を読み取り、指定の型に変換する関数

競技プログラミング用です。コピペしてそのまま使えます。

#### 標準入力から一行を読み取り、指定の型に変換する関数

```rust
fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}
```

#### 標準入力から一行を読み取り、空白文字で分割し、各要素を指定の型に変換する関数

```rust
fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().split_whitespace()
        .map(|e| e.parse().ok().unwrap()).collect()
}
```

#### 標準入力からn行を読み取り、各行を空白文字で分割し、各要素を指定の型に変換する関数

```rust
fn read_vec2<T: std::str::FromStr>(n: u32) -> Vec<Vec<T>> {
    let mut v2 = Vec::new();
    for _ in 0..n {
        let mut s = String::new();
        std::io::stdin().read_line(&mut s).ok();
        let v = s.trim().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect();
        v2.push(v);
    }
    v2
}
```

#### すべての関数を一つのソースコードにまとめたもの

```rust
fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}
 
fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>().split_whitespace()
        .map(|e| e.parse().ok().unwrap()).collect()
}
 
fn read_vec2<T: std::str::FromStr>(n: u32) -> Vec<Vec<T>> {
    (0..n).map(|_| read_vec()).collect()
}
```
No such module を消し去るには？

# 状況
クリーンや再起動しても消えない！
Podfileの書きかたは合ってるしもうわからん！！
って時

→　リセットする！

# 1 CocoaPodsのリセット
`pod deintegrate`

# 2 インストール
`pod install`

これでいけた
Web決済を快適にするPayment Request API

## Payment Request APIとは

Googleの調査では、ユーザーはPCで購入する場合より2倍も多く、モバイルでの購入を取りやめており、そのほとんどの原因が入力フォームの使いづらさにあるそうです。

この問題を解決するために「ブラウザ自体に決済フォーム機能を付けちゃえば良いのでは？」と考えられたのがPayment Request APIです。

実際どんなものなのかはこちらの動画で確認できます。
https://www.youtube.com/watch?v=undqD82MBvA


ここで表示されるUIはサイト開発者が作ったものではなくブラウザの機能として提供しているもので、これにより従来のフォームよりも手軽に正確な情報をユーザーから取得することが可能になります。

## どう便利なのか

Payment Request APIのもっとも大きなメリットは、Googleアカウント、Microsoftアカウント等からユーザーの支払い情報を取得、またはブラウザに保存された情報からフォームの自動入力が行われユーザーの負担を大きく減らすことができるということです。

また、サイトによってバラバラだった入力項目、入力方法（全角・半角、ハイフンのありなし、ふりがなとフリガナ）が統一され一貫性のあるUI/UXを提供できるようになります。

開発者側のメリットとしては、Web標準に則ったフォーマットで情報を扱えるようになることや豊富な支払いオプション、配送オプションを手軽に実装できることが挙げられます。

## 実装してみた

実際に実装してみたサンプルが次のURLになります。
PCからはChromeまたはEdgeで、モバイルからはChromeからアクセスしてみてください。
https://paymentapi-de226.firebaseapp.com/

ソースコードはこちらです。
https://github.com/taquaki-satwo/paymentAPI

メインのコードは以下です。

```JavaScript
window.onload = function () {
  var $btn = document.getElementById('btn');
  // 支払いボタンをクリックでAPIをキック
  $btn.addEventListener('click', onBuyClicked, false);
}

function onBuyClicked() {
  // Payment Request APIが使用できない環境では従来の決済ページ（/checked）に移動させる
  if (!window.PaymentRequest) {
    location.href = '/checkout';
    return;
  }

  // 支払いオプションの設定をする
  var supportedInstruments = [{
    supportedMethods: ['basic-card'],
    data: {
      supportedNetworks: [
        'visa', 'mastercard', 'amex', 'discover', 'diners', 'jcb', 'unionpay'
      ]
    }
  }];

  // 支払い金額を設定する
  var details = {
    displayItems: [
      {
        label: '通常商品',
        amount: { currency: 'YEN', value: '10000' }
      },
      {
        label: 'クーポン',
        amount: { currency: 'YEN', value: '-2000' }
      }
    ],
    total: {
      label: '合計',
      amount: { currency: 'YEN', value: '8000' }
    }
  };

  // PaymentRequestオブジェクトを生成しブラウザに表示する
  var request = new PaymentRequest(supportedInstruments, details);
  request.show();
}
```

## 実際問題使えるのか

さて、良い事だらけに見えるPayment Request APIですが欠点もあります。
まずブラウザの実装状況です。

<img width="1033" alt="スクリーンショット 2017-12-23 00.05.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/45634/757987eb-99e6-0989-f46b-aa5470d7a25b.png">

Can I Useで確認したところ、Edge、Chromeが先行してますが、日本では特にユーザーが多いiOS Safariの実装が進んでいません。polyfill（古いブラウザ向けの機能拡張のようなもの）の提供もないそうです。Firefoxに至っては…。

次にもっと重要な話をすると、Payment Request APIは入力フォームを提供するだけのものであり、サーバーサイドの実装は全然別の話であるという点です。

ただ前述のSafariですが、Mac開発者用ベータ版でプレビューが進んでおり来年以降のiOS Safariにも実装されることが予想されます。そうなると事例や利用者が増え導入の動機が高まりそうです。

## 参考

Payment Request API: 統合ガイド
https://developers.google.com/web/fundamentals/payments/?hl=ja

Payment Request API で簡単・高速な決済を実現する
https://developers.google.com/web/updates/2016/07/payment-request?hl=ja
JSerがGolang始めてみた 〜 2. WebApp入門（ほぼDocker）

[前回](https://qiita.com/k_tada/items/dec72d597ebcb8305e6a)はGolangの環境を構築して挨拶を済ませたところまでだったので、今回はWebAppを作ってみます。

# Framework
GolangのWebフレームワークは色々あるみたいですが、今回は早い軽いと評判の[gin](https://github.com/gin-gonic/gin)とやらを使ってみることにします。

# パッケージマネージャ
Golangのパッケージマネージャも検索するといろいろヒットするので、とりあえず新しそうな[dep](https://github.com/golang/dep)を使ってみます。

# Docker環境作る
せっかくなのでDockerで動かしてみようと思います。ローカルで`go get`叩きたくないしね。
イメージは`golang:1.9.2-alpine`を使います。

まずはDockerfileを作ります。`alpine`イメージにGitがなかったので合わせて入れてます。

```dockerfile:Dockerfile
FROM golang:1.9.2-alpine

ENV GOBIN /go/bin

ADD . /go/src/app
WORKDIR /go/src/app

RUN apk add --no-cache git \
  && go get -u github.com/golang/dep/cmd/dep \
  && dep ensure

RUN go build -o /go/bin/myapp .
CMD ["/go/bin/myapp"]
```

ついでにdocker-compose.ymlも。

```yaml:docker-compose.yml
version: '2'

services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    volumes:
      - '.:/go/src/app'
      - '/go/src/app/vendor'
    environment:
      PORT: 9800
    ports:
      - '9800:9800'
```

Dockerfile内で`dep ensure`叩いてますが、このままだと`Gopkg.toml`, `Gopkg.lock`が無いため失敗します。
`dep init`は初回以外では必要無いので、Dockerfileには含めたくないですが、ローカルで叩くのも嫌なのでDocker使って叩きます。

```sh
docker run -v $PWD:/go/src/app -it golang:1.9.2-alpine /bin/sh

# ここからdockerコンテナ内
$ apk add --no-cache git
$ go get -u github.com/golang/dep/cmd/dep
$ dep init
```

これでローカルに`Gopkg.toml`, `Gopkg.lock`が生成され、Docker立ち上げる準備が出来ました。

## Hello World
GinでHello Worldを書いてDockerで動かしてみます。

```go:main.go
package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/hello", func(ctx *gin.Context) {
		ctx.JSON(200, gin.H{
			"message": "Hello World",
		})
	})
	r.Run()
}
```

あとは`docker-compose up -d --build`を叩けばDocker上でGinを動かすことが出来ます。

ブラウザから`http://localhost:9800`にアクセスして`{"message":"Hello World"}`と表示されればOKです。

# Live Reloadを有効にする（※ 2018/01/04 追記）
しばらくは上述のDockerfileで運用してたんですが、いちいちリビルドしにいかないといけないのが非常に面倒だったので、Live Reload出来ないか試行錯誤してました。
そしたら[こんなもの](https://github.com/codegangsta/gin)を見つけたので使ってみることにします。
※ このginはFWのginとは別物らしいです。

まずは`main.go`を環境変数の`PORT`を使うよう修正。

```diff:main.go
  package main

  import (
+ 	"os"
  	"github.com/gin-gonic/gin"
  )

  func main() {
  	r := gin.Default()
  	r.GET("/hello", func(ctx *gin.Context) {
  		ctx.JSON(200, gin.H{
  			"message": "Hello World",
  		})
  	})
+ 	port := os.Getenv("PORT")
+ 	if len(port) == 0 {
+ 		port = "9800"
+ 	}
+ 	r.Run(":" + port)
- 	r.Run()
  }
```

そして`Dockerfile`を`gin`を使うように修正します。

```diff:Dockerfile
  FROM golang:1.9.2-alpine

  ENV GOBIN /go/bin

  ADD . /go/src/app
  WORKDIR /go/src/app

  RUN apk add --no-cache git \
    && go get -u github.com/golang/dep/cmd/dep \
+   && go get -u github.com/codegangsta/gin \
    && dep ensure

- RUN go build -o /go/bin/myapp .
- CMD ["/go/bin/myapp"]
+ CMD gin -p 9800
```

これで`docker-compose up -d --build`すれば、Live Reload対応の環境が出来ます。
試しに`main.go`を適当に書き換えてみると、`gin`でリビルドが走るのが確認出来ます。

```
app_1  | 2018-01-04T11:35:44.985528373Z [gin] Building...
app_1  | 2018-01-04T11:35:50.423585321Z [gin] Build finished
```

(・∀・)ｲｲﾈ!!

次はGinをつかった簡単なWebAppを作ってみます。

[続く](https://qiita.com/k_tada/items/421a40f3839bfb14fa94)。
JSerがGolang始めてみた 〜 1. 環境構築

この言語がいいねと同僚が言ったから12/20はGolang記念日
ということでここ最近FrontendもServerSideもほぼJSしか使ってないエンジニアがGolang始めてみるまでのまとめです。

# 環境構築
## Goインストール
~~各言語のバージョン管理にAnyenvを使っているので、GolangもAnyenv経由でgoenvを使ってインストールします。~~


なぜかAnyenv経由だとこのあとの`go get`が上手く動かなかったので、Homebrew経由でgoenv入れることにしました。

```
brew install goenv
exec $SHELL -l
goenv install --list
goenv install 1.9.2
goenv global 1.9.2
exec $SHELL -l
```

```
$ go version
go version go1.9.2 darwin/amd64
```
これでおｋ

## GOPATH設定追加
Golangを動作させるためには環境変数に`GOPATH`を追加しなければいけないとのこと。
`GOPATH`には`go get`で追加するパッケージが置かれる他に、どうやらGolangで書くプロジェクトも`GOPATH`の下に置いたほうがいいみたいです。
~~できればその辺は分けたいので2つ`GOPATH`を設定することにしました。~~
基本的にはDockerで動作させるので、一旦はパッケージが置かれるディレクトリのみを設定します。何故か２つ定義するとvim-goが荒ぶるので。。。

```zsh:.zshrc
# Golang
export GOPATH="$XDG_CACHE_HOME/go"

# PATHs
path=(
  /usr/local/{bin,sbin}
  $XDG_CACHE_HOME/go/bin # これを追加
  $path
)
```

## Vim環境構築
VimmerなのでVim用の開発環境を構築します。

### 必要なライブラリのインストール
補完用の`gocode`とLinterの`golint`をインストールします。

```
go get -u github.com/nsf/gocode
go get -u github.com/golang/lint/golint
```

### Vim用プラグインの追加

```toml
[[plugins]]
repo = 'zchee/deoplete-go'
on_ft = ['go']

[[plugins]]
repo = 'neomake/neomake'
on_ft = ['go']

[[plugins]]
repo = 'fatih/vim-go'
on_ft = ['go']
```

`vim-go`で利用するパッケージをインストールするために、vim起動後に`:GoInstallBinaries`を叩きます。

# まずはGolangに挨拶（HelloWorld)
これで環境構築出来たっぽいので、GolangのHello World書いてみます。

```go:main.go
package main

func main() {
	fmt.Printf("Hello World\n")
}
```
こんな感じで書いたら、Vimから`:GoImport fmt`を実行すれば`fmt`の`import`文が自動生成され、`:GoRun`すれば実行されます。(・∀・)ｲｲﾈ!!

![スクリーンショット 2017-12-21 22.54.06.png](https://qiita-image-store.s3.amazonaws.com/0/16629/fc26964c-5adc-3d14-ac99-8798c7f1857d.png)

これでGolangに挨拶できました。
次はWebApp作ってみます。

[続く](https://qiita.com/k_tada/items/172a89c12bc2d8d186d2)。
la_outer_productはベクトル外積にあらず

#問題
swiftでAccelerateをimportして利用できる行列ライブラリla_xxxにあるla_outer_productでベクトルを入力しても外積ベクトルが得られない

#原因
la_outer_productは[テンソルの直積](https://ja.wikipedia.org/wiki/直積_(ベクトル))を返すライブラリでした。例えば、2つの3次元ベクトル（正確には、3行1列の行列）を入力すると、戻りは3行3列の直積行列になります。
swiftには[Basic Linear Algebra Subprograms (BLAS)](https://developer.apple.com/documentation/accelerate/blas)も用意されていますが、こちらにもベクトル外積のライブラリは見当たりませんでしたので、自身で実装しました。
JSHintでasync/awaitに対応する

CodeMirrorをつかったweb上のJSエディタを作っているときに
JSのコードのエラー検知をしてくれるJSHintを使っていたけれど，
async/awaitに対応していなかったので，どうにか対応させてみた

##対応前
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/227015/dd358f79-0b2b-8fdd-2776-18f3862a7988.png)

対応していない状況だと，awaitがあるとエラーになる

```text
Missing semicolon.
Missin name iin function declaration
```

CodeMirror(Html上のエディタ)を使っているけれども，そっちのキーワードとしては認識されているので，ちゃんとasyncの色が変わっているのが憎い・・・．

キーワード抽出とエラー検知はロジックが全く別のため，こういう現象が起きている.

##対応後
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/227015/f6d9f541-29fb-11d9-4a8a-259aa7f6e5e1.png)

きちんとエラーが出なくなっている

##対応方法

本家のJSHintはまだasync/awaitに対応していなかった

かわりにJSHintをフォークしてasync/awaitを追加してくれている人がいるので，ありがたくそのコードを使わせてもらう
ただし，JSHint自体はnodejs向けに作られているので，browser向けにビルドされたものを抽出するのが必要

ビルドと言っても，nodejs向け→browser向けに変換できるコードがついているので，それを使って作られたjsファイルを一つ追加するだけ

async/awaitが追加されているJSHint
https://github.com/marcominetti/jshint

これのdist/jshint.jsがブラウザ向けにビルドされたもの

awaitの対応を有効にするには，オプションに以下を追加．
やりたいことによっては”asyncawait”のみでもOK

```javascript
var jshintconfig = {
 experimental:['asyncawait', 'asyncreqawait']

  // asyncawait    : enables async/await functions support.
  // asyncreqawait : requires async functions to contain at least
  //                  one await statement.
}
```

これで，async/awaitを使ってもエラーがでなくなる

もちろん，async/await関連のエラーも検知する
具体的には下記の3つを検知してくれる模様

```javascript
E999: "A await statement shall be within an async function (with syntax: `async function`)."
W998: "An async function shall contain an await statement.",
W999: "'{a}' is available in async/await extension(use asyncawait option)."
```

##参考
Stackoverflow
https://stackoverflow.com/questions/42637630/does-jshint-support-the-node-7-async-await

JSHint Options 日本語訳
https://qiita.com/xorphitus/items/f26ec8fbe17c317d3994
PostHTMLプラグインの作り方

## [PostHTML](https://github.com/posthtml/posthtml)について

PostCSSのHTMLバージョンを目指すもPostCSSでいうautoprefixerのようなものがないためにあまり注目されていません。
他のプラグインは全く使ってないですが、自分用にプラグイン作って使うにはちょうどいいような気がします。
結構簡単に作れるので簡潔に説明してみます。

## 作り方

[ガイド](https://github.com/posthtml/posthtml/tree/master/docs/plugins)があるので一度読んでおくといいです。

作りがシンプルなので例を見たほうがはやいと思います。
全てのspanタグをpタグに変えるプラグインの例です。

```index.js
export default tree => {
  tree.match({ tag: 'span' }, node => {
    node.tag = 'p';
    return node;
  });
}
```
treeはASTにPostHTMLのAPIをつけたものです。
ASTの構成は[posthtml-parser](https://github.com/posthtml/posthtml-parser)に書いています。

APIが`tree.match(expression, cb)`と`tree.walk(cb)`の2つしかなく、walkのほうは全ノード見ることになるのであまり使わないと思います。
なので基本的に`tree.match()`で処理していくことになります。　　
[posthtml-match-helper](https://github.com/rasmusfl0e/posthtml-match-helper)を使えばセレクタ指定っぽくもできます。

ちなみにAPIを使わずに直接操作しても問題ありません。
親要素や兄弟要素にアクセスしたくなったときなどは直接触るしかありません・・・。

上記を覚えておけばとりあえずはつまることもなく作れると思います。
ベースが欲しい場合は[posthtml-plugin-boilerplate](https://github.com/posthtml/posthtml-plugin-boilerplate)を使いましょう。

## その他

PostHTMLは一応二種類の使い方があります。

+ async `posthtml([plugin1, plugin2]).process(html).then(res => res.html)`
+ sync `posthtml().use(plugin1, plugin2).process(html, {sync: true}).html`

[こういう](https://github.com/Tsuguya/posthtml-sugar-srcset)のを作っています。
srcsetがとても嫌いなのでどうにかして楽に書きたいです。
[Swift] Processを使おう！(2)

### Processってなに？
ちょっと前までNSTaskと呼ばれていた、主にコマンドラインツールを実行してデータのやり取りを行うためのクラスです。
SwiftでできることはSwiftでやってしまってもいいのですが、swiftcを呼びたいとかそういう時に使います。

の2回目。

[第１回](https://qiita.com/masakihori/items/0639526a3baf0d6cb621)
[第２回](https://qiita.com/masakihori/items/a85d1667b0af86d6f6e7)
[第３回](https://qiita.com/masakihori/items/fe094ca1f66d56f38d92)
[第４回](https://qiita.com/masakihori/items/3d6a2c083182076f2e0f)

### 振り返り
前回カスタムオペレーションを2個追加して下のようになりました。

```swift:Operations.swift
precedencegroup ArgumentPrecedence {
    associativity: left
    higherThan: AdditionPrecedence
}
func <<< (lhs: Process, rhs: String) -> Process {
    
    lhs.executableURL = URL(fileURLWithPath: rhs)
    return lhs
}

func <<< (lhs: Process, rhs: [String]) -> Process {
    
    lhs.arguments = rhs
    return lhs
}
```

```swift
let echo = Process() <<< "/bin/echo" <<< ["Hello, World."]

let pipe = Pipe()
echo.standardOutput = pipe

echo.launch()

let readHandle = pipe.fileHandleForReading
let data = readHandle.readDataToEndOfFile()
if let output = String(data: data, encoding: .utf8) {

    print(output)
}
```

**まだ長いわ――！！！！**

出力を得るのために長々書かないとだめなのがつらいです。
ここに手を入れます。


## 出力の取得を簡単に

まず、出力を型にします

```swift
struct Output {
    
    private let fileHandle: FileHandle
    
    init(fileHandle: FileHandle) {
        self.fileHandle = fileHandle
    }
    
    var data: Data {
        return fileHandle.readDataToEndOfFile()
    }
    
    var string: String? {
        return String(data: data, encoding: .utf8)
    }
    
    var lines: [String] {
        return string?.components(separatedBy: "\n") ?? []
    }
}
```

`FileHandle`から`Data`や`String`あるいは行の配列を簡単に取得するための補助的な型です。

### 使用法

```swift
let echo = Process() <<< "/bin/echo" <<< ["Hello, World."]

let pipe = Pipe()
echo.standardOutput = pipe

echo.launch()

let output = Output(fileHandle: pipe.fileHandleForReading)
if let string = output.string {
    print(string)
}
```

短い！　わかりやすい！

わかりやすい...？？



じゃあまた次回！！

[第３回](https://qiita.com/masakihori/items/fe094ca1f66d56f38d92)
[第４回](https://qiita.com/masakihori/items/3d6a2c083182076f2e0f)
Mackerelでコマンド結果を監視する

```
[plugin.checks.2018]
command = "tmpfile=$(mktemp) && date > $tmpfile && (check-log -f $tmpfile -p 2018 -r --no-state); RC=$?; rm $tmpfile; exit $RC"
```

2018年になったらアラートが来ます。

`date`の部分でコマンド、
`2018`の部分で監視したいパターンを書いてください。

check-logの-fileに標準入力を受け付けるかなと思いながら作り始めたので
自分でも何に役に立つのかはわかりません。

もっとまともな方法があると思う。
ページングとは

##ページングとは
http://wa3.i-3-i.info/word13352.html
https://qiita.com/egnr-in-6matroom/items/e1beba82d5dc76c85596
https://qiita.com/mpyw/items/4ab192e04430119d5599
http://blog.n1n9.jp/opinion/paging.php
exiftoolで、JPEGファイルからgeotagを消す


スマホで写真を撮影して、PCに持ってきものを公開したい時にgeotagを消したいものです。

こんなコマンドを利用すると、geotagを消せます。


```

$ exiftool -gps:all= -xmp:geotag= *.JPG

```