OmniAICreator/Qiita-1.07M huggingface dataset:
WiresharkのPermissionエラーの対応（iPhoneのパケットをキャプチャしたい場合）

# 動機
iOSアプリを開発中、サーバーからレスポンスが来ないのでパケットをキャプチャするためにWiresharkを使ったのですが、
その時にPermissionエラーが発生したのでその対応策を残しておきます。

# 前提
下記サイトで、Macに接続したパケットを取得するための設定を行っていること。
[https://qiita.com/tenten0213/items/345b644e1212ea165ae8:embed:cite]

# 事象
Wiresharkのキャプチャオプションで 「rvi0」のネットワークインターフェースを選択した際に、エラーが発生。

![wireshark1.png](https://qiita-image-store.s3.amazonaws.com/0/261954/a026e885-d567-55ad-32b1-5e6203e37cc1.png)

デバイスにキャプチャを取るための権限が無いと言っているので、権限を与えてやりましょう。

# 手順

### 1.  次のコマンドを入力する
```
cd /dev
ls -la | grep bp
```
ユーザー名とグループ名がユーザー自身ではないことを確認します。

![wireshark2.png](https://qiita-image-store.s3.amazonaws.com/0/261954/7e9ca96d-86f9-2caa-c2d1-69189e12b1eb.png) <br>

※ちなみにbpとはbpf(Berkeley Packet Filter)のことで、キャプチャしたパケットをフィルタリングするものです。
（自分も詳しくないので興味がある方は、「linux bpf」とかでググってみてください）

### 2. bpfの所有権のユーザー名を自分自身に、グループ名をadminにします。
```
sudo chown uematsu:admin bp*
```

### 3. 所有権が変更されていることを確認します。
```
ls -la | grep bp
```

![wireshark3.png](https://qiita-image-store.s3.amazonaws.com/0/261954/ae07a01e-9255-b61c-06eb-24a5ecb1ae6f.png)

これで権限の変更は終了です。
再度Wiresharkのキャプチャオプションで 「rvi0」を選択してみてください。
パケットがキャプチャできるはずです。
Windows10(64bit)でMeCab-Pythonを使えるようにするシンプルな方法（2018/6） 

# はじめに
WindowsでMeCabを入れようとした際、はまったのでメモ。
導入記事はたくさんあるが、個々の環境で違ったりするので
2018年6月時点での成功事例を記載します。

# 環境
OS:Windows10(64bit)
Python:Anaconda3系

# 用意するもの
MeCab（64bit版）
https://github.com/ikegami-yukino/mecab/releases

mecab-python-0.996.tar.gz
http://taku910.github.io/mecab/#download

# 導入手順
## 1. MeCab（64bit版）のインストール
- mecab-0.996.exeを実行する
- 文字コードはutf-8を指定する

## 2. 環境変数を設定
- 環境変数『PATH』に「~MeCabのインストール先~\bin」を設定（例 C:\Program Files (x86)\MeCab\bin）
- 環境変数『MECABRC』に「~MeCabのインストール先~\etc\mecabrc」を設定（例 C:\Program Files (x86)\etc\mecabrc）
  ※ MECABRCがないとPythonからMeCabを使用するときにエラーが出た。

## 3. mecab-python-0.996のセットアップ
- mecab-python-0.996.tarを解凍する
- mecab-python-0.996フォルダ内のsetup.pyを編集する

```python:setup.py（編集後）
#!/usr/bin/env python

from distutils.core import setup, Extension

setup(name = "mecab-python",
    version = '0.996',
    py_modules=["MeCab"],
    ext_modules = [
        Extension("_MeCab",
            ["MeCab_wrap.cxx",],
            include_dirs=[r'C:\Program Files (x86)\MeCab\sdk'],
            library_dirs=[r'C:\Program Files (x86)\MeCab\sdk'],
            libraries=['libmecab'])
            ])
```

- Anaconda Promptからmecab-python-0.996フォルダ内に移動してビルドする

```:
> python setup.py build
```

- 続けてインストール

```:
> python setup.py install
```
\Anaconda3\Lib\site-package以下にセットアップされているか確認。

## 4. 実行確認

```python:テスト
import MeCab
mecab = MeCab.Tagger ("-Ochasen")
print(mecab.parse("すもももももももものうち"))
```
```:実行結果
すもも	スモモ	すもも	名詞-一般		
も	モ	も	助詞-係助詞		
もも	モモ	もも	名詞-一般		
も	モ	も	助詞-係助詞		
もも	モモ	もも	名詞-一般		
の	ノ	の	助詞-連体化		
うち	ウチ	うち	名詞-非自立-副詞可能		
EOS
```
Unityのバージョン上げたら外部URLから取得した画像の表示がおかしくなったので直した。

#結論
UnityWebRequestTexture.GetTexture(url) を使えば治る。

#経緯
1.
iOS/Android用ゲームを、Unity5.3からUnity2018.1に更新する際に
「外部サーバーから引っ張ってきた画像が、何故かUnity2018.1で異様に画質劣化する」
という現象が発生し何だこいつ、と思って調査。

2.
スマホ実機での画質劣化が判明。
Unity5.3とUnity2018.1をエディタ並べて比較調査してたところ、
300KBぐらいのpng画像がUnity2018では何故か400KBぐらいに容量膨れていることが発覚。

コルーチン内で new WWW(url) して www.texture で取得していただけだったので
特になにか加工していたわけでもなく「？？？」となる

3.
Unity公式リファレンスを見に行ったら、こっちが推奨されてた。
https://docs.unity3d.com/ja/current/ScriptReference/Networking.UnityWebRequestTexture.GetTexture.html

4.
差し替えてエディタで確認したところ普通に直った。
え、なんでWWWクラスの挙動変わってるんですかね、こわ……

#あとがき
Unity2017系とかでもあったのかもしれないがそこは知らない。
とりあえず公式リファレンスを信じろ

---
#補足
###原因推察：
www.texture 勝手にミップマップ作って肥大化してた可能性あり。
WWWクラスじゃなくて、Texture2Dクラスの仕様変更？？
まぁどちらにしろ面倒なんですけれどもね？

###新バグ：
https://forum.unity.com/threads/assertion-failed-on-expression-m_instanceid-instanceid_none.466327/
UnityWebRequestTexture、ここの#7～#9で報告されてるバグと同じログのものが発生。
Unity2018.1.9f1のリリースノートでTexture2D修正が報告されてますけど、この件との関係どうなんですかね……

###対応（元々バグ再現率は低いので、効果あるか不明）：
先のフォーラム記事によると、
「シーン変更と画像取得のタイミングが重なると死ぬ（超意訳）」らしいので、
下記URL先を参考に、取得したバイト列から直接Texture2D作成しました。
https://qiita.com/r-ngtm/items/6cff25643a1a6ba82a6c

ミップマップが作成されると困るので、コンストラクタは下記の方を使用。
`new Texture2D(width, height, TextureFormat.RGBA32, false)`

TextureFormat.RGBA32については、
公式リファレンスでデフォルトがこれだと書いてあるのでそうしてます。
https://docs.unity3d.com/ScriptReference/Texture2D-ctor.html
Swift 4 Alamofire 4.0を使って、multipart/form-dataのリクエスト

## はじめに
[Alamofire 4.0](https://github.com/Alamofire/Alamofire)を使って、multipart/form-data のPOSTリクエストを行う方法です。
ライブラリの導入方法は割愛します。


## サンプルコード
```swift
let requestUrl = "http://localhost:8080/"

let filePath = ... // 送信データのファイルパス

let dataA = "hogehoge".data(using: .utf8)!
let dataB = "fugafuga".data(using: .utf8)!
let dataC = URL(fileURLWithPath: filePath)

Alamofire.upload(multipartFormData: { (multipartFormData) in
    // 送信データを設定
    multipartFormData.append(dataA, withName: "dataA", mimeType: "text/plain")
    multipartFormData.append(dataB, withName: "dataB", mimeType: "text/plain")
    multipartFormData.append(dataC, withName: "dataC", fileName: "send.png", mimeType: "image/png")
}, to: requestUrl) { (encodingResult) in
    switch encodingResult {
    case .success(let upload, _, _):
        upload.responseJSON { response in // ← JSON形式で受け取る
            if !response.result.isSuccess {
                print("# ERROR")
            } else {
                print("# SUCCESS")
                print(response)
            }
        }
    case .failure(let encodingError):
        print(encodingError)
    }
}

```

## POST結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112186/22043539-223d-5cc4-88bd-e49f02ad7be8.png)

上記のログは [node.js](https://nodejs.org/ja/) を使って出力しました。

```js:post.js
var express = require('express');
var fs = require('fs');
var app = express();

app.listen(8080);
console.log('Server is online.');

app.post('/', function (req, res) {
    var body = '';
    req.on('data', function (data) {
        body += data;
    });
    req.on('end', function () {
        fs.writeFile("request.log", body, () => {});
    });
    res.json('{"result":"OK"}');
})
```
C# の const の間違った使い方をやめよう


## `public` な `const` を定義するのはやめよう

`const`で定義した変数をアセンブリ外に公開すると「const のバージョニング問題」と言われる問題が発生します。
どういうことかと言うと...

クラスライブラリ **Sub.dll** に `const` で `TAX`（消費税率）が定義されていたとします。

```csharp
public class AppConstants
{
    public const double TAX = 5D;
}
```

**Sub.dll** を参照して、アプリケーション **MyApp.exe** を作成したとします。

```csharp
class Program
{
    static void Main(string[] args)
    {
        ...略
        var includeTax= price * AppConstants.TAX;
    }
}
```

この後、`AppConstants` の `TAX` を `8` に変更し **Sub.dll**だけ差し替えました。
**しかし、AppConstants.TAXの値は `5` のままです。**

> 定数は、コンパイル時にリテラルと全く同じように値が展開されてしまうため、 定数を定義しているライブラリの方だけでなく、参照しているアプリ側も再コンパイルしないと、値の変化が反映されません。
> 参考： C# によるプログラミング入門  [基礎] 定数 

定数を公開するときは`static readonly`を使うとよいです。
`readonly`で定義した値は実行時に参照されます。
そのため**Sub.dll**だけを差し替えるだけで正しく動作します。

```csharp
public class AppConstants
{
    public static readonly double TAX = 5;
}
```

## `Enum` の代わりに `const` を使うのをやめよう

`Enum` の代わり `const` を使用すると意図せぬ値が入った場合でもビルドが通っていしまいます。

```csharp
struct Mode
{
    public const int CREATE = 0;
    public const int READ = 1;
    public const int UPDATE = 2;
    public const int DELETE = 3;
}

...略

// 意図通りのコード
var mode = Mode.READ;

// 想定外の値も入ってしまう!
mode = 4;
```

列挙型(`enum`)を使えば、`CREATE`,`READ`,`UPDATE`,`DELETE`以外の値は入りません。


```csharp
enum Mode
{
    CREATE = 0,
    READ = 1,
    UPDATE = 2,
    DELETE = 3,
}

...略

var mode = Mode.READ;

// ビルドエラー!!
mode = 4;
```

`const`ではうっかり間違った値を入れても気づきにくいですが、`enum`ならIDEがミス教えてくれるので安心です！。
gRPC クライアントの keepalive の薦め

以下では grpc-go (v1.12.2) を前提に書きます。
ただ、 grpc/proposal を参照しているので、ほかの言語のライブラリにも当てはまるところがあると思います。

# gRPC クライアントの再接続

gRPC クライアントがサーバーと接続を確立したあとにネットワークが切れた場合、gRPC ライブラリ側で再接続を期待すると思います。
しかし、keepalive が適切に機能していない場合、基本的に再接続は行われません。
grpc-go では、デフォルトでアプリケーションレイヤーでの keepalive は無効です。

RPC タイムアウトが短く設定されているかどうかによって次のように動作します。

- 設定されている場合、再接続しない。以降のリクエストもタイムアウトしたまま。
- 設定されていない場合、 20 秒ほどで `transport is closing` エラーが返ってきて、再接続が行われる。以降のリクエストは正常に処理されるようになる。

GRPC_GO_LOG_SEVERITY_LEVEL 環境変数に info を渡すと、接続状態がログに出るのでいつ接続が確立していつエラーになるのかが確認できます。

この挙動は gRPC を直接利用している場合だけでなく、 例えば cloud.google.com/go のように内部で gRPC を利用しているクライアントライブラリにも当てはまります。

ちなみに、サーバーがシャットダウンするようなケースでは http/2 の GoAway フレームを受信するので、 keepalive に関係なく再接続が行われます。

# gRPC クライアントの keepalive

gRPC クライアントで考慮するべき keepalive は 2 種類あります。

- TCP レイヤーの keepalive
 - これは TCP ソケットの SO_KEEPALIVE オプション
 - 細かい設定をアプリケーションから行えないので、アプリケーションレイヤーの実装が提供されている
- アプリケーションレイヤーの keepalive
 - http/2 の PING フレームを定期的に送ってタイムアウトしたら再接続する
 - クライアントのバッテリーや DDos 配慮のため、アクティブなストリームがない場合は PING フレームを送らないオプションが提供されている

アプリケーションレイヤーの keepalive は現時点で C, Go, Java のライブラリで実装されています。

- ref. https://github.com/grpc/proposal/blob/bb89a93b3243efaaf603f568a45cb8ac1670597f/A8-client-side-keepalive.md

# keepalive を有効にするコード例

keepalive.ClientParameters が keepalive の設定。
PermitWithoutStream はアクティブなストリームがないときも probe を送るかどうかを表す。

```go
const (
	// GRPCClientKeepaliveTime は活動がなくなってから PING を送るまでの間隔を表す。
	GRPCClientKeepaliveTime = 1 * time.Second
	// GRPCClientKeepaliveTimeout は PING 応答を待つ時間を表す。
	GRPCClientKeepaliveTimeout = 5 * time.Second
)
```

```go
client, err := storage.NewClient(ctx, option.WithGRPCDialOption(
	grpc.WithKeepaliveParams(keepalive.ClientParameters{
		Time:                GRPCClientKeepaliveTime,
		Timeout:             GRPCClientKeepaliveTimeout,
		PermitWithoutStream: true,
	}),
))
```
Swift4 文字列の置換


replacingOccurrencesを使用する。
ofに置換前、withに置換後の文字列を設定する。

```Swift
import Foundation

// 置換前の文字列
var str: String = "ABC"

// 置換を行う
var newStr = str.replacingOccurrences(of: "A", with: "4")

// "4BC"と出力される。
print(newStr)
```
【C#】和暦西暦変換(2018/6/12時点)

# 和暦変換にかかる問題
2019年5月1日から新元号になるということで。
でも、新元号が何？ということは決まってません。発表もいつになるのかが流動的。
和暦西暦変換をしているところは結構切実ですよね。

## .NET Frameworkのカレンダー
平成が2019年4月30日まで、というのは決定事項なので、
じゃあ、JapaneseCalendarってどうなってるの？ということで、境界値周辺を確認。

### 確認用コード
```csharp
System.Globalization.CultureInfo ci =
    new System.Globalization.CultureInfo("ja-JP", false);
ci.DateTimeFormat.Calendar = new System.Globalization.JapaneseCalendar();
DateTime date = new DateTime(2019, 4, 29);

for (int i = 0; i <= 3; i++)
{
    var date1 = date.AddDays(i);
    var datestr = date1.ToString("gy年MM月dd日", ci);
    var date2 = DateTime.ParseExact(datestr, "gy年MM月dd日", ci);
    Console.WriteLine($"西暦={date1.ToString("yyyy/MM/dd")},和暦={datestr},逆変換={date2.ToString("yyyy/MM/dd")}");
}
```

### 出力結果
> 西暦=2019/04/29,和暦=平成31年04月29日,逆変換=2019/04/29
> 西暦=2019/04/30,和暦=平成31年04月30日,逆変換=2019/04/30
> 西暦=2019/05/01,和暦=？？1年05月01日,逆変換=2019/05/01
> 西暦=2019/05/02,和暦=？？1年05月02日,逆変換=2019/05/02

新元号は「？？1年」って変換された。
で、「？？1年」を西暦に戻すと「2019」に戻った。
決まったら、WindowsUpdateで新しい元号になってくれるっぽいね。

## おまけ
2019年5月1日以降も平成表記されるものもあるので、その和暦が西暦変換できるの？ということで確認。
運転免許証とか、平成33年まで有効、とかあるし。

### 確認用コード
```csharp
System.Globalization.CultureInfo ci =
    new System.Globalization.CultureInfo("ja-JP", false);
ci.DateTimeFormat.Calendar = new System.Globalization.JapaneseCalendar();

var s = "平成31年05月01日";
var date3 = DateTime.ParseExact(s, "gy年MM月dd日", ci);
Console.WriteLine($"和暦 {s} -> 西暦={date3.ToString("yyyy/MM/dd")}");
```

### 出力結果
> 和暦 平成31年05月01日 -> 西暦=2019/05/01

ちゃんと変換できるようだ。
Vagrant up時のエラー

### Vagrant upするとエラーが出た

```
The name of your virtual machine couldn't be set because VirtualBox
is reporting another VM with that name already exists. Most of the
time, this is because of an error with VirtualBox not cleaning up
properly. To fix this, verify that no VMs with that name do exist
(by opening the VirtualBox GUI). If they don't, then look at the
folder in the error message from VirtualBox below and remove it
if there isn't any information you need in there.

VirtualBox error:

VBoxManage: error: Could not rename the directory '/Users/janet/VirtualBox VMs/ubuntu-18.04-amd64_1528921299791_36157' to '/Users/janet/VirtualBox VMs/laravel-base' to save the settings file (VERR_ALREADY_EXISTS)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "SaveSettings()" at line 3060 of file VBoxManageModifyVM.cpp
```

以下のコマンド実施する

```
$cd /Users/janet/'VirtualBox VMs'
$rm -rf laravel-base
```

するとエラーの内容が変わった

```
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

/sbin/ifdown 'eth1' || true
/sbin/ip addr flush dev 'eth1'
# Remove any previous network modifications from the interfaces file
sed -e '/^#VAGRANT-BEGIN/,$ d' /etc/network/interfaces > /tmp/vagrant-network-interfaces.pre
sed -ne '/^#VAGRANT-END/,$ p' /etc/network/interfaces | tac | sed -e '/^#VAGRANT-END/,$ d' | tac > /tmp/vagrant-network-interfaces.post

cat \
  /tmp/vagrant-network-interfaces.pre \
  /tmp/vagrant-network-entry \
  /tmp/vagrant-network-interfaces.post \
  > /etc/network/interfaces

rm -f /tmp/vagrant-network-interfaces.pre
rm -f /tmp/vagrant-network-entry
rm -f /tmp/vagrant-network-interfaces.post

/sbin/ifup 'eth1'

Stdout from the command:



Stderr from the command:


bash: line 5: /sbin/ifdown: No such file or directory
bash: line 21: /sbin/ifup: No such file or directory
```
とりあえず下記をやってみます。

```
rm -f /tmp/vagrant-network-interfaces.pre
rm -f /tmp/vagrant-network-entry
rm -f /tmp/vagrant-network-interfaces.post
```

### もう一度 vagrant up
上手くいった。

## Vagrant ssh したあとのディレクトリ構成がおかしい場合
そんな場合は

```
rm Vagrantfile
```
で消して

```
vagrant init <指定のbox list>
```
※vagrant box listで一覧みれます。

```
vagrant up
vagrant ssh
```

すると大丈夫（多分）
AtCoder Beginner Contest 092 解説備忘録

#前書き
AtCoder Beginner Contest 092 を解いてみた．解けなかった問題の備忘録．

#D問題
[[問題はこちら]](https://abc092.contest.atcoder.jp/tasks/arc093_b)

・100×100マスのグリッドを用意．

・上半分(50×100)を白，下半分(50×100)を黒に塗る．これで白の連結成分は1，黒の連結成分は1となる．

・【白の連結成分を作る】
Aの数だけ，下半分の黒部分から白にくり抜いていく．ここで，ちょうどビルの窓のように，隙間をあけてくり抜くことで，黒の連結成分を減らすことなく白の連結成分を増やせる．(初期で上半分に白の連結成分が1あるので，A-1個を下半分でくり抜くことに注意)

・【黒の連結成分を作る】
同様に，Bの数だけ，上半分の白部分から黒にくり抜いていく．ここで，ちょうどビルの窓のように，隙間をあけてくり抜くことで，白の連結成分を減らすことなく黒の連結成分を増やせる．(初期で下半分に黒の連結成分が1あるので，B-1個を下半分でくり抜くことに注意)

以下ACのコード：

```main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <sstream>
#include <bitset>
#include <stack>
#include <cstdlib>

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

typedef long long ll;

using namespace std;

int main() {
    
    int a,b;
    cin >> a >> b;
    
    cout << 100 << " " << 100 << endl;
    
    vector<vector<char>> x(50, vector<char>(100,'.')); //上半分は最初白
    vector<vector<char>> y(50, vector<char>(100,'#')); //下半分は最初黒
    
    //白の個数を調整
    int p,q;
    p = (a-1)/49 + 1; //p段に及ぶ
    q = (a-1)%49; //最終段の個数
    
    FOR(i, 0, p){
        if(i!=p-1){
            FOR(j, 0, 49){
                y[2*i+1][2*j+1] = '.';
            }
        }else{
            FOR(j, 0, q){
                 y[2*i+1][2*j+1] = '.';
            }
        }
    }
    
     //黒の個数を調整
    p = (b-1)/49 + 1; //p段に及ぶ
    q = (b-1)%49; //最終段の個数
    
    FOR(i, 0, p){
        if(i!=p-1){
            FOR(j, 0, 49){
                x[2*i+1][2*j+1] = '#';
            }
        }else{
            FOR(j, 0, q){
                x[2*i+1][2*j+1] = '#';
            }
        }
    }
    
    
    FOR(i, 0, 50){
        FOR(j, 0, 100){
            cout << x[i][j];
            if(j==99){
                cout << endl;
            }
        }
    }
    FOR(i, 0, 50){
        FOR(j, 0, 100){
            cout << y[i][j];
            if(j==99){
                cout << endl;
            }
        }
    }
    
    
    return 0;
}

```

#あとがき
思いつかん．
精進します．
MacでFortranエラー: malloc [エラーまとめ]

# プログラム概要
    main program
      implicit none # 6/13追記
      integer, parameter :: n = ** 
      real*8 :: x(0:n), y(0:n,1:5)
      real*8 :: p_input_1, p_input_2, ...
      integer :: i
      
      do i = 1, 5
        ! 入力パラメータを変えながら繰り返し計算
        call subroutine_1(n,p_input_1,p_input_2,...,x)
        y(0:n,i) = x(0:n)
      end do
      
      stop
    end program
    
    subroutine subroutine_1(n,p_input_1,p_input_2,...,x)
      implicit none
      integer, intent(in) :: n
      real*8,  intent(in) :: p_input_1, p_input_2, ...
      real*8,  intent(out) :: x(0:n)
      real*8 :: p_1(0:n,0:n), p_2, p_3, ...

      ! 処理色々

      return
    end subroutine subroutine_1

# システム
- OS: maxOS High Sierra ver 10.13.5
- コンパイラ: gfortran (gcc ver 6.3.0)

# 実行結果
|配列数(n) |  実行結果  | 備考 |
|--------:|:----------:|:------------:|
|      400|       できた|             | 
|      300|       できた|             | 
|      200|       できた|10回中10回成功| 
|      150|       できた|             | 
|      101|       できた|10回中10回成功| 
|      100| できなかった|20回中7回成功| 
乱数は一切使っていないにも関わらず！

## "n=100"の場合の実行結果
|          | 回数 |
|---------:|:----:|
|   成功   |     7|
|Seg. Fault|    11|
|  malloc  |     2|
ちなみに，エラーを吐く場合も, i=1の時にエラーがでることもi=3の時にエラーが出ることもあり

どうしたらいいんでしょうね，ほんと

# 6/14追記
関連しそうなページを発見
https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/271391

ははーん，解決策が見えん
自分のメモ@画面モック開発

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>画面モック</title>
	<link rel="stylesheet" href="css/styles.css">
</head>
<body>
  <div class="pack">
    <table>
      <tbody>
        <tr>
          <th>見出し</th>
          <td>説明</td>
          <td class="btn">
            <input type="radio" id="radio_sel" class="radio_sels" onclick="btnClicked(this.parentNode)">
            <label for="radio_sel">選択</label>
          </td>
        </tr>
      </tbody>
    </table>
  </div>

  <div class="table_pack">
    <!-- <div class="table_pack_row"> -->
      <div class="head">
        見出し
      </div>
      <div class="body">
        <div class="body_row">
          <table class="body_row_table">
            <tbody>
              <tr>
                <td>説明</td>
                <td class="btn">
                  <input type="radio" id="radio_sel_1" class="radio_sels" onclick="btnClicked(this.parentNode)">
                  <label for="radio_sel_1">選択</label>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
        <div class="body_row">
          <table class="body_row_table">
            <tbody>
              <tr>
                <td>説明</td>
                <td class="btn">
                  <input type="radio" id="radio_sel_2" class="radio_sels" onclick="btnClicked(this.parentNode)">
                  <label for="radio_sel_2">選択</label>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    <!-- </div> -->
  </div>

	 <script src="js/main.js"></script>
</body>
</html>

```
```css:styles.css
div {
  display: block;
}
.pack {
  border: 2px solid #32b7b2;
  margin-top: 20px;
}
table {
  width: 100%;
  border: none;
}
th {
  width: 30%;
  background: #32b7b2;
  color: #ffffff;
}
td {
  padding: 25px 20px;
}
.radio_sels{
  display: none;
}
.btn {
  width: 30%;
  background: #dbf5f0;
  color: #32b7b2;
  border-top: 2px solid #32b7b2;
  border-left: 2px solid #32b7b2;
  border-right: 2px solid #32b7b2;
  border-bottom: 4px solid #32b7b2;
  text-align: center;
}
.btn:hover {
  background: #32b7b2;
  color: #ffffff;
}
.btn_checked  {
  width: 30%;
  background: #32b7b2;
  color: #ffffff;
  border-top: 2px solid #dbf5f0;
  border-left: 2px solid #dbf5f0;
  border-right: 2px solid #dbf5f0;
  border-bottom: 4px solid #dbf5f0;
  text-align: center;
}
.table_pack {
  display: flex;
  border: 2px solid #32b7b2;
  margin-top: 20px;
  padding: 10px;
}
.head {
  width: 30%;
  border: 2px solid #32b7b2;
  float: left;
  margin: 0 5px 0 0;
  background: #32b7b2;
  color: #ffffff;
  text-align: center;
  vertical-align: middle;
  font-weight: bold;
}
.body {
  width: 70%;
  border: 2px solid #32b7b2;
  float: left;
}
.body_row {
//  border: 2px solid #32b7b2;
  padding: 10px;
  margin: 5px;
}
.body_row_table {
  height: auto;
}
.table_pack_row {
  float: none;
}
```
```javascript:main.js
var btnClicked = function(obj){
  obj.className = "btn_checked";
}

```
StyleLintの導入手順まとめ

StyleLintの導入したときの手順をまとめる

## yarn add 
`yarn add --dev stylelint stylelint-scss stylelint-config-standard`

## 設定ファイル
プロジェクト直下の内容のファイルを置く

```json:.stylelintrc.json
{
  "plugins": [
    "stylelint-scss"
  ],
   "extends": "stylelint-config-standard"
}
```

## StyleLintの実行
Railsで `app/frontend/stylesheets`にscssファイルを配置するときの例
`--fix`オプションは可能なものは自動修正するオプション

以下の様に`packge.json`の`scripts`に追加して
`yarn run lint:stylesheet`で実行

```json:package.json
...
  "scripts": {
    "lint:stylesheet": "stylelint --fix app/frontend/stylesheets/**/*.scss"
  },
...
```
Linux/UNIXの本読んでて、へぇとおもったこと。

備忘録です。
とはいえ、（私が機械系だからか）講義などでこの内容を教わったことはない気がするので、その程度の超ライト層には需要があると思っています。

底本
林晴比古, 「新Linux/UNIX入門第3版」, 林 晴比古 実用マスターシリーズ

#テスト用ファイル生成
ファイルはh始まり、中身はf始まり。

```bash:echo利用
echo foo > hoge.txt
```

```bash:cat利用
cat > homhom.txt
fumfum
femfem
[Ctrl+D]
```

```bash:touch利用
touch hoihoi.txt
```

touchではサイズが0になる。

#ファイルを探すなら
次の手法をとると、比較的詳しく出るよう。これはファイル本体を探しに行く。

```bash:find
find place -name hom -ls
```

-sizeやら-typeなんかが指定できる。使うとき調べればいいや。

上記だと、権限で阻まれることがある。

```bash:locate
locate homhom
```

こちらは自動実行されるファイルリストのデータベースを探す。権限に阻まれず、調べることができる。

#cpの-pオプション
以前の私の記事で適当なことを書いたが、これを指定すると、ファイルの権限（chown, chmodのあたりか）をもそのままコピーできる。なるほど便利。
以前の記事を書いた時には、更新日時が変わらない、みたいな理解の仕方をしていて、そのせいで「使うことあるのかなぁ」みたいな印象だった。

#ディレクトリを一時的に移動
これまでは、一時的な移動でもcdを使っていたが、愚かだった。

```bash:pushd/popd
pwd
/home/uname/mm
pushd ~/kk
~/kk ~/mm
pushd /tmp
/tmp ~/kk ~/mm
popd
pwd
/home/uname/kk
```
CentOS7にNetworkManagerをインストールする

# はじめに
AWSでnmcliコマンドが使えなくて少しはまったので、メモを残します。

# NetworkManagerのインストール
NICの設定ファイル等は/etc/sysconfig/network-scripts/配下にあります。CentOS6まではここにifcfg-eth0等のファイルを作成して設定していましたが、CentOS7からはファイルの直接編集が推奨されず、nmcliコマンドを使って設定するようになりました。
……なのですが、数日前にAWSで作成したCentOS7のインスタンスではnmcliコマンドが入っていませんでした。

```
$ nmcli
-bash: nmcli: command not found
```

入っていない理由は不明ですが、[Redhatのページによると](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-installing_networkmanager)「NetworkManager」というパッケージに入っているようなので、これをインストールしてみます。

```
$ sudo su -
Last login: Wed Jun 13 16:34:09 UTC 2018 on pts/0
[root@ip-172-31-0-6 ~]# yum install -y NetworkManager
```

インストールするパッケージは大文字小文字の区別をしているので、networkmanagerと打つとエラーになります。

インストールできたら、起動します。

```
[root@ip-172-31-0-6 ~]# systemctl start NetworkManager
[root@ip-172-31-0-6 ~]# systemctl enable NetworkManager
[root@ip-172-31-0-6 ~]# systemctl is-active NetworkManager
active
[root@ip-172-31-0-6 ~]# nmcli device
DEVICE  TYPE      STATE      CONNECTION         
eth0    ethernet  connected  System eth0        
eth1    ethernet  connected  Wired connection 1 
lo      loopback  unmanaged  --                 
```

無事使えるようになりました！

# おわりに
使えるようにはなったのですが、標準で使えるはずのパッケージをなぜAWSでは削除しているかが気になります。少し調べたくらいでは分かりませんでした。。。
1/fゆらぎでフルカラーLチカ

# 1/fゆらぎをフルカラーLEDに使ってLチカする

LEDをチカチカさせるLチカ。  応用形でロウソクのような不規則なちらつきを表現する1/fがよく作られているようです。  そのまま真似しても面白くないのでフルカラーLEDを使ってみた。

# 環境

* Mac OS High Sierra 10.13.4
* Arduino IDE 1.8.5
* Digispark互換品
* マイコンWS2811内蔵フルカラーLED PL9823-F8 ([秋月電子の例](http://akizukidenshi.com/catalog/g/gI-08412/))

# 動作

![1fFluctuation.gif](https://qiita-image-store.s3.amazonaws.com/0/101760/08fe633e-06b3-0cbc-e459-8c08d8cfa5d9.gif)

#回路図

 配線3本しかありませんが。
![DIGISPARK-WS2811.jpeg](https://qiita-image-store.s3.amazonaws.com/0/101760/3acd5620-facd-3594-e659-b2b43ca0f7e6.jpeg)


# ソースコード

1. 0.05以下や0.995以上になると揺らぎにくくなるらしいので近辺でランダムに。
2. RGBそれぞれ1/f揺らぐだけだと明る過ぎて面白くないので全体の明るさも揺らがせた。

```
#include <Adafruit_NeoPixel.h>

#define PIN 0       //信号端子のピン番号

Adafruit_NeoPixel ledtape = Adafruit_NeoPixel(LED_NUM, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  ledtape.begin();
  ledtape.show();   //一旦全てOFFの状態で反映
}

int blue;
float redRatio = 0.8;
float greenRatio = 0.8;
int delayMsec = 100;
int minimum = 20;
float fIntensity = random(10, 90) / 100.0;;
float fRed       = random(10, 90) / 100.0;;
float fGreen     = random(10, 90) / 100.0;;
float fBlue      = random(10, 90) / 100.0;;

void loop() {
  fIntensity = f1Fluctuation(fIntensity);
  fRed       = f1Fluctuation(fRed);
  fGreen     = f1Fluctuation(fGreen);
  fBlue      = f1Fluctuation(fBlue);
  int intensity = 255 * fIntensity;
  light(fRed * intensity, fGreen * intensity, fBlue * intensity);
  delay(delayMsec);
}

void light( int red, int green, int blue ) {
  int number = 0;
  ledtape.setPixelColor(number, red, green, blue);
  ledtape.show();
}

float f1Fluctuation(float x){
  if( x < 0.5 ){
    x = x + 2 * x * x;
  } else {
    x = x - 2 * (1.0 - x) * (1.0 - x);
  }
  if( x < 0.05 ){
    x = random( 5, 10) / 100.0;
  }
  if( x > 0.995 ){
    x = random(90, 99) / 100.0;
  }
  return x;
}
```

# 参考

1. http://satotoshio.net/blog/?p=1348
JettyでIllegalStateExceptionが起きた話。

#はじめに
JettyでPOSTデータを受け取ろうとしたら、様子が変だ。
確認してみよう。

#環境
Jetty embedded

```
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>9.4.6.v20170531</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.eclipse.jetty.aggregate/jetty-all-server -->
        <dependency>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>jetty-all-server</artifactId>
            <version>8.2.0.v20160908</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty.orbit</groupId>
            <artifactId>javax.servlet</artifactId>
            <version>3.0.0.v201112011016</version>
        </dependency>
```

#すでに使える変数
Request baseRequest, HttpServletRequest request, HttpServletResponse response


#ログ
```console
p1p2p3p4[Thu Jun 14 00:29:21 JST 2018][LowerLobby]:null
p6p1p2p3java.lang.IllegalStateException: STREAMED
	at org.eclipse.jetty.server.Request.getReader(Request.java:1149)
	at com.haniokasai.mc.SteadyMistress.web.handlers.srvtools.pluginmanager_handler.pluginmanager_handler(pluginmanager_handler.java:59)
	at com.haniokasai.mc.SteadyMistress.web.WebHandler.handle(WebHandler.java:63)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.Server.handle(Server.java:564)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
	at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128)
	at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:673)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:591)
	at java.lang.Thread.run(Thread.java:748)
```
#解決策
こいつは何だ？

割とすぐに記述が見つかった。
＝＝＞＞http://apache-wicket.1842946.n4.nabble.com/java-lang-IllegalStateException-STREAMED-Consuming-JSON-fails-td3850442.html

> This exception says "Don't use the reader but use the input stream 
because something (maybe header) has been already read from the 
stream". 

>> この例外は"readerを使わないでinput streamを使え。何故なら、なにか（たぶんヘッダー）がstreamをすでに使ってるからだよ。"と表してるよ。

ほほ、そうかね。

つまり、すでに用意されているbufferreaderを使わなければいい。

```java
BufferedReader in = baseRequest.getReader();
```

から

```java
BufferedReader in = new BufferedReader( new InputStreamReader(request.getInputStream()));
```
にすればよい！って質問者が言ってるね！

以上！
はじめての X Window System

たけしさんのおかげでやっと意味がわかった。

X Window は ウインドウしかやらない。GNOM DESKTOPはデスクトップもやる。

そう、**Xはウインドウだけ** なのだ！デスクトップはないのだ！！！

ウインドウ出すにはデスクトップが必要なのだ。

だから**Xはデスクトップ(run level 5) の上で動く** のだ。

GNOMEの上でXすれば、**他のマシンに表示されるはずのウィンドウがなんとこっちに表示される** のだ。

これ、remote desktop/vncに慣れてる人間からすると事故の元でしかない。だってどう見てもローカルで動いてるアプリのwindowがなんと違うの。ローカルのfirefoxと、相手のfirefoxと、見た目まったく同じよ。やばいよ。

X windowの起動。何がやばいって、**「画面出せ！」って叩いたマシンには画面出ない**。`違うマシンの方に、画面出る`。やばすぎる。

しかも「画面出せ」コマンドがどう見ても **ただの変数** 。ヤバすぎる。

![スクリーンショット 2018-06-14 00.56.50.png](https://qiita-image-store.s3.amazonaws.com/0/24737/3b3c7aac-256a-9039-701c-05057232d491.png)

画面出された側には、ローカルファイルを表示するFirefoxが出る。でも、そのファイルはローカルにない。 **クライアント側にあるファイルなのに、 `file:///` で見れちゃう**。 やばすぎる。事故の匂いしかしない。

![スクリーンショット 2018-06-14 00.58.04.png](https://qiita-image-store.s3.amazonaws.com/0/24737/84a326c5-e87e-6775-39a2-d2f7f86a6fa7.png)

クライアント側で強制終了してみると、サーバ側が勝手に落ちる！

![スクリーンショット 2018-06-14 00.59.07.png](https://qiita-image-store.s3.amazonaws.com/0/24737/ca9c6f27-a516-8def-71bd-af0f546668b1.png)

# 結論
**X Window Systemはヤバかった**
Python 3 で flatten する方法いろいろ

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Python 3 の些細な不満の一つは flatten が欲しいときに毎回自分で再発明しないといけないところ</p>&mdash; ほと (@hoto17296) <a href="https://twitter.com/hoto17296/status/1006922066719731713?ref_src=twsrc%5Etfw">June 13, 2018</a></blockquote>

何度も再発明してるのが面倒になったのでまとめておく。

## まとめ
1階層だけならこれでいい (ついでに型もつけた)

``` python
def flatten[T](arr: list[list[T]]) -> list[T]:
    return sum(arr, [])
```

## 単純な flatten
１階層だけ flatten する方法。

いずれの方法も<del>何らかのモジュールを import する必要があるし</del>、`[1, [2, [3]]]` みたいな変な形の配列には使えない。

### reduce を使うパターン
``` python
from functools import reduce

reduce(lambda a, b: a + b, [[1,2,3],[4,5,6],[7,8,9]])  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

### chain を使うパターン
``` python
from itertools import chain

list(chain.from_iterable([[1,2,3],[4,5,6],[7,8,9]]))  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

### NumPy を使うパターン
``` python
import numpy as np

np.array([[1,2,3],[4,5,6],[7,8,9]]).flatten()  #=> array([1, 2, 3, 4, 5, 6, 7, 8, 9])
```

この場合は当然だけど返ってくるのは NumPy 配列になる。

### sum を使うパターン
``` python
sum([[1,2,3],[4,5,6],[7,8,9]], [])  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

**[追記]** 当初 sum は「Python 2 では使えたが Python 3 ではできなくなったパターン」と書いていたが、やり方が間違っていただけでそんなことはなかった。何も import しなくてもいいし、１階層だけの flatten ならもうこれでいいのでは。

## 再帰的 flatten
リスト内包表記を使うと再帰的に flatten できる。

``` python
flatten = lambda x: [z for y in x for z in (flatten(y) if hasattr(y, '__iter__') and not isinstance(y, str) else (y,))]

flatten([[1,2,3],[4,5,6],[7,8,9]])  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

この方法は変な形の配列に対しても適用できるので汎用性が高い。

**[追記]** 「文字列が含まれると無限再帰になってしまう」と指摘いただいたので `and not isinstance(y, str)` を追加した。

``` python
flatten([1,[2,[3]]])  #=> [1, 2, 3]
```

ただし配列のみならず iterable なオブジェクトをすべて展開してしまうので、配列の中に iterable なオブジェクトを入れている場合は注意する必要がある。
GolandでDocker上のサーバーをRemote Debug

# 今回やりたかったこと
会社の同僚から以前作成していたアプリを配布するためのサイトをDocker上でリバースプロキシで接続できるようにしてくれ。ということで、なんとかサーバーを起動するまではできたのですが、Docker上でデバッグすることにはどうすればいいかわかりませんでした。

ということで、今回やりたかったことは、docker-composeでechoサーバーをDockerに立ち上げて、Remote Debugすることです。

docker-composeで複数のコンテナを管理したかったのですが、Golandの[ブログ](https://blog.jetbrains.com/go/2018/04/30/debugging-containerized-go-applications/)ではDockerfileのRemote Debugの方法しかなかったので苦戦しました。

（成果物は[Github](https://github.com/h-shiraishi/dockerRemoteDebug)にアップしています。）

# ディレクトリ構成
echo+MySQL+Nginx（リバースプロキシサーバー）の構築を想定しています。

![スクリーンショット 2018-06-13 23.34.02.png](https://qiita-image-store.s3.amazonaws.com/0/33300/2113e1a4-25fe-2ca0-afc4-97ddcd36d978.png)

#docker-compose.ymlの設定
ブログにあるように

```
–security-opt=”apparmor=unconfined” –cap-add=SYS_PTRACE
```
をdocker-compose.ymlに追加します。
デバッガに使用するdelveのために2345を公開します。

```docker-compose.yml

version: '3'
services:
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: archive
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - ./mysql/volumes:/var/lib/mysql
  web:
    build: ./go
    privileged: true
    ports:
      - "9000"
      - "2345:2345"
    links:
      - db
    security_opt:
      - apparmor:unconfined
    cap_add:
      - SYS_PTRACE
  proxy:
    build: ./proxy
    ports:
      - "80:80"
    links:
      - web
```

#GoのDockerfileの設定
必要なライブラリを取得して、delveを起動するように書きました。
(最後のコマンドが実行されても、サーバーは起動していない状態です。)

```dockerfile:Dockerfile
FROM golang:1.10

RUN go get github.com/labstack/echo
RUN go get github.com/labstack/echo/middleware

RUN go get github.com/derekparker/delve/cmd/dlv

COPY ./src /go/src
WORKDIR /go/src/app

RUN go build -gcflags "all=-N -l" -o /server app.go

CMD ["dlv", "--listen=:2345", "--headless=true", "--api-version=2", "exec", "/server"]
```

#デバッグの設定
受話器を持ったゴーファーくんがかわいい。
![スクリーンショット 2018-06-14 0.18.40.png](https://qiita-image-store.s3.amazonaws.com/0/33300/3e328e13-9280-6ed2-7757-d56ecbf3a0d1.png)

#GOPATHの設定
この設定にたどり着くのに数時間かかりました...。デフォルトの設定ではGlobal GOPATHに最初に設定したであろうGOPATHが設定されています。Project GOPATHに注目してください。2種類GOPATHが設定されています。

まず1つ目のGOPATHはDockerのgoコンテナのGOPATHである```/go```に合わせたGOPATHです。これを設定することでブレイクポイントで止めることができるようになりました。

次に2つ目のGOPATHはGlobal GOPATHに設定されていたGOPATHです。これがないとコード補完が機能しなくなります。

![スクリーンショット 2018-06-14 0.20.47.png](https://qiita-image-store.s3.amazonaws.com/0/33300/77f32a44-6c63-0392-b38e-9cd0d7c1e6bf.png)

#docker-compose up
echoのコンテナ、MySQLのコンテナ、nginxのコンテナが立ち上がった状態です。
![スクリーンショット 2018-06-14 0.32.25.png](https://qiita-image-store.s3.amazonaws.com/0/33300/f644d16d-42f8-0ea4-5411-f20078ef5bd2.png)

#デバッグ
先程設定したデバッグの設定でDebugボタンを押します。
![スクリーンショット 2018-06-14 0.35.16.png](https://qiita-image-store.s3.amazonaws.com/0/33300/1f47a5c7-4b0f-a3ae-74cf-9ead77d4cafd.png)

http://localhost/app/index
にアクセスしてブレイクポイントで止まったら成功です。
Node.js + Express + HerokuでHello World for Windows


前回、ローカル環境でHelloWorldしたので、今回はHerokuでHelloWorldしてみます！
**とりあえず動かしたいんだよ！！という方向けです。**

前回 -> [【10分】Node.js + ExpressでHello World for Windows](https://qiita.com/tsumasakky/items/c1785a0ede0f3af48613)

# 環境
* Node.js（v8.10.0）
* Express（v4.16.0）
* Heroku（heroku-cli/v6.16.3）
* Git（v2.16.3.windows.1）

# package.jsonの編集
アプリルートフォルダにpackage.jsonというファイルがあると思います。

そのpackage.jsonに"engines"を追加します。
ここでは、node -v と npm -v で得られたバージョンを記載します。

```JSON
{
  "name": "nodewebapp",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "morgan": "~1.9.0"
  },
  "engines": {
    "node": "8.10.0",
    "npm": "5.6.0"
  }
}
```

# Herokuの登録

まずはHerokuにアカウントを登録します。
https://signup.heroku.com/
![herokusignup.png](https://qiita-image-store.s3.amazonaws.com/0/147118/43cca721-ebac-d395-94ca-e6eae1a02a5a.png)


次にHerokuをコマンドラインで使用するために「Heroku Toolbelt」をインストールします。
https://devcenter.heroku.com/articles/heroku-cli
![herokutoolbelt.png](https://qiita-image-store.s3.amazonaws.com/0/147118/be554ce7-912f-33fe-f99d-5f20a0e331e7.png)

# Herokuの使用

コマンドラインで下記のコマンドを入力し、上で作成したアカウントのEmailとPasswordを入力します。

```DOS
$ heroku login
Enter your Heroku credentials.
Email: [Email]
Password: [Password]
Authentication successful.
```

そして、Herokuに新しいアプリケーションを作成します。

```DOS
$ heroku create [アプリ名]
```

するとこんなURLが返ってくるかと思います。保管しておいてください！

```DOS
https://xxxxxxxxxx.herokuapp.com/ | https://git.heroku.com/xxxxxxxxxx.git
```
僕の場合はこんな感じでした
![createheroku.png](https://qiita-image-store.s3.amazonaws.com/0/147118/f0f59d5c-7c7e-c703-109b-3c2ec4a82386.png)

# Gitのインストール
HerokuへのデプロイはGit経由で行います。
下記サイトよりダウンロードし、インストールします。
https://git-scm.com/downloads

インストーラーで色々聞かれます。
改行コードの設定とか先にしておくと楽なんですが、デフォルト値で次へ次へしても使えます。

## .gitignoreファイルの作成
コミットしたくないファイルやフォルダを設定できます。
アプリフォルダ直下に「.gitignore」というファイルを作成してください。

中身はとりあえずこれだけです。

```
node_modules
```

## Procfileファイルの作成
Herokuで使用するプロセスの記述ファイルです。

```
web: node ./bin/www
```
# Gitリポジトリの作成

アプリケーションフォルダで下記コマンドを実行してください。
リモート先にはHerokuアプリ登録の際に取得したURLを入力します。

```DOS
$ git init
$ git add .
$ git commit -m "Init"
$ git remote add heroku https://git.heroku.com/xxxxxxxxxx.git

$ git push heroku master
```

なにやらごちゃごちゃでます。
赤枠のURLがデプロイされたアプリのURLなので、ブラウザで開いてみましょう！
![herokudeployed.png](https://qiita-image-store.s3.amazonaws.com/0/147118/ccf65c62-dacf-4891-6cb4-2fe65fde169d.png)

やったー！！

![herokuhelloworld.png](https://qiita-image-store.s3.amazonaws.com/0/147118/2b6d9117-58da-1c0a-93d5-f2d276e0d92f.png)

動かない～という方はぜひコメントくださるとうれしいです！
次回はHerokuにデプロイしたアプリでDBを使う！（PostgreSQL）にトライしてみたいと思います！

# 参考情報
* Heroku Node.js Support | Heroku Dev Center
https://devcenter.heroku.com/articles/nodejs-support
* The Procfile | Heroku Dev Center
https://devcenter.heroku.com/articles/procfile
* Using .gitignore | Heroku Dev Center
https://devcenter.heroku.com/articles/gitignore
* Git Push | Atlassian Git Tutorial
https://www.atlassian.com/git/tutorials/setting-up-a-repository
第12話 ゼータ関数の解析接続

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第12話です。

```math
-\frac{1}{ζ(-1)}=12
```

ゼータ関数の式です。わかりやすく書き直すとこうです。

```math
ζ(-1)=1+2+3+4+⋯=-\frac{1}{12}
```

自然数の和は-1/12という常識はずれな式です。このような式はいくつかあります。

```math
1+1+1+1+⋯=-\frac{1}{2}\\
1+2+4+8+16+⋯=-1\\
1-2+4-8+16-…=\frac{1}{4}
```
もちろん、これらの式は発散したり振動したりで、普通に考えれば、こんな値になりません。
実際このような書き方は正確とはいえません。

```math
1+2+3+\cdots=1+(1+1)+(1+1+1)+\cdots=1+1+1+\cdots
```

この式はどこもおかしい場所はありません。
しかし、上の例から見ると値が違っています。
ですから、先程までに出てきた不思議な式は、こういう変形ができない形で計算します。

具体的にはこのようにします。

```math
ζ(s)=\frac{1}{1^s}+\frac{1}{2^s}+\frac{1}{3^s}+\cdots
```

これはゼータ関数と呼ばれる関数です。
もし、これにs=2を入れると、第6話に出てきたバーゼル問題になります。
もちろんその時の値は$\frac{\pi^2}{6}$です。

s=-1を入れると、1+2+3+4+…という式を表します。
その時の値は普通に考えれば無限大、となるでしょう。

そこで、この式を別の形で表します。

```math
ζ(s)=\frac{1}{1−2^{1−s}}\sum_{m=1}^{∞}2^{−m}\sum_{j=1}^{m}(−1)^{j−1}
\Bigl(
\begin{matrix}
m−1\\
j−1
\end{matrix}
\Bigr)
j^{−s}
```

ややこしいですが、式の中身を見る必要はありません。
重要なのは以下の三点です。
・どちらの式も、s>1の範囲だと同じ値になる
・1個めの式は、s<1では定義されていない
・2個めの式は、s≠1の範囲で定義されている

つまり、定義されている領域では同じ値になる関数ですから、全く同じ式とみなします。
これを、解析接続といいます。

解析接続をする条件はいくつかあり、その条件を守れば別の値が出ません。
自然数の和を無限大以外に定義するなら、必ず-1/12になります。

そして、この意味不明な式が現実的に役に立つものなのか、という疑問が浮かびますが、
実際には物理学の世界で「繰り込み」という方法で利用されています。
 
つまり、
・実際に役に立つ場面がある
・無限大と-1/12以外に適切な値が出ない
というところから、この不思議な式も認められているわけです。
docker-composeアラカルト

###よく使うんだけどいつも忘れちゃうdocker-composeのコマンドを自分メモ

##はじめに
どのコマンドも、基本的にはdocker-compose.ymlファイルがある階層で行うと吉。

##コンテナ起動

```shell
$ docker-compose -f <docker-compose-file> up -d
```
`docker-compose-file`に記述のある全ての`service`のコンテナを起動＋設定適用。
-f : `docker-compose-file`を明示的に指定。つけない場合、デフォルトの`docker-compose.yml`とみなされる。存在しなければもちろん`ERROR`
-d : バックグラウンドモード。opつけなければ、コンテナ起動後tail的なログ出力モード。

```shell
$ docker-compose -f <docker-compose-file> run <service>
```
`docker-compose-file`に記述のある全ての`service`の中で、指定したもののコンテナを起動。
-f : `up`に同じ

##コンテナ停止
```shell
 #コンテナ停止
$ docker-compose stop
```
```shell
 #コンテナ停止した上でさらに削除
$ docker-compose down
```

##起動状況の確認
```shell
 #当該`docker-compose-file`配下の起動中コンテナをリスト
$ docker-compose ps
```

```shell
 # 当該`docker-compose-file`配下の実行中プロセスをリスト
$ docker-compose top
```


##ログを確認

```shell
$ docker-compose logs -f <service>
```
実行中コンテナのログを出力。
-f : tail的な

##起動中コンテナにログイン

```shell
$ docker-compose exec <service> bash
```
指定のサービスにbashでログイン
Ubuntu16.04LTSでrails sするまで

##はじめに
古いPCを復活させた時のメモ
GitHubにリモートリポジトリがあるものとする
##環境
Ubuntu 16.04 LTS 32bit
ruby 2.4.4
rails 5.1.6
DB
　develop：mysql 14.14
　product：postgresql
##ネックになったもの
gem mysql2
gem pg
rails db:create
##'bundle install' まで
・GitHubからクローンを持ってくる

```terminal
git clone https://github.com/hoge/piyo.git
cd piyo
git init
```

・とりあえず

```terminal
bundle install
```

結果

```terminal
mysql client is missing. ～～～ 'apt-get install libmysqlclient-dev' or ～～～
```

とあるので

```terminal
sudo apt install libmysqlclient-dev
```

_※前までubuntuのパッケージインストールは'apt-get'だったが、
　いつの間にか'apt'推奨になったらしい_

・気を取り直して

```terminal
bundle install
```

結果

```terminal
No pg_config... trying anyway.　～～～ please try again with --without ～～～
```

また怒られる。
ちなみに'--without'以降を付けても上手くいかない。
[こちら](https://qiita.com/youcune/items/5b783f7fde45d0fd4b35)を参考に

```terminal
sudo apt install libpq-dev
```

これでbundle installが通る。

##rails db:migrate
・やってみる

```terminal
rails db:migrate

Could not find a Javascript runtime.
```

'Javascript runtime'が無いらしい。
調べたらnode.jsのこと？

```terminal
sudo apt install nodejs
```

versionはとりあえず気にしない。

```terminal
rails db:migrate

Unknown database 'mysql_development'
```

DBが無いらしいので作る。

```terminal
rails db:create
rails db:migrate
rails s
```

終わり。
GitHubの使用方法（Windows10+Git GUI）

## **1.Git GUIインストール（Ver 1.2.3）**
　[GitHub Desktop](https://desktop.github.com/)のサイトにアクセスし、Download for Windows(64bit)のボタンを
　クリックし、msiファイルをダウンロードします。
　その後、msiインストーラーを起動し、デフォルトのままインストールを行います。

## **2.GitHubの会員登録**
　[GitHub公式サイト](https://github.com/)にアクセスし、Username,Email,Passwordの欄があるので
　全て入力し、「Sign up for GitHub」ボタンを入力します。Usernameは、
　自分の希望のIDを入力しましょう。IDは変更できませんが、登録後の表示名が
　別にありそれを変更できるようになっています。（初期:表示名=希望のID）
　その後、プランなど聞かれますが、Freeプラン（無料プラン）を選択でOKです。

## **3.GitHubへのプロジェクト作成（Webサイト）**
　①WebよりGithubにログインを行う。[GitHub公式サイト](https://github.com/)のSign inをクリックし、
　入力項目（Username,Password）を入力し、ログインを行います。
　※Sign in・・・登録済Usernameでログイン、Sign up・・・Username新規登録
　　Sign out・・・ログアウト

　②「Start a Project」のボタンが表示されているのでそれをクリックします。

　③「Repository name」に作成するフォルダ名を入力し、「Create Repository」を
　　クリックします。すると、空のリポジトリが作成されます。

## **4.GitHubDeskTopToolとの連携と資源配備**

　①1の手順でインストールしたDesktopアプリを開きます。もしデスクトップ上に
　　存在しない場合は、C:\Program Files (x86)\GitHub Desktop Installerにあるかも。

　②開くと、「Create new repository」、「Add new repository」、
　「Clone a repository」の3種類表示されているので「Clone a repository」を
　　選択します。

　③URLのタブを選択して、以下の項目を入力し、Cloneボタンを押します。
　　<1>Repository URL：<font color="Red"><b>Username/3の③で入力したリポジトリ名</b></font>
　　<2>LocalPath：<font color="Red"><b>登録を行う資源の絶対パス</b></font>

　④③で入力したものを例として以下説明します。
　　【Repository URL】airu/test1、【LocalPath】E:\test1<font color="Red">\test1</font>　←最後のtest1は、
　　自動的に付与されるもの。
　　この状態で、test1フォルダにgit用のtest1フォルダがさらに作成されます。
　　この中にE:\test1内に入っている資源（ソースファイル）をE:\test1\test1に
　　コピーします。

　⑤ソースをgit用のフォルダにコピーするとGUIツールが自動で認識します。
　　以下です。
![無題5.png](https://qiita-image-store.s3.amazonaws.com/0/264122/a9e87471-86e1-1e53-9b0a-7c812629501c.png)
　　左下にある、Summary(required)の部分にコミットコメントを入力し、
　　「Commit to master」を押し、資源をコミットします。
　　<font color="Red">※この操作は、ローカル上のデータ内でのコミットでありOnline上の
　　　Githubには、まだ反映されません。</font>

　⑥⑤の写真中にある、「Publish branch」ボタンを押すとOnline上のGitHubに
　資源コミットが完了します。
　※資源を世代別管理を行いたい場合（例えば、PHP5.2用で動作する用、
　　PHP7.0で動作する用と2つに分けたい場合、GUIツールのBranchよりnew Branchで
　　新たなBranchが作成できるので作成後、両方に対して、「Publish branch」を
　　行ってください。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/264122/83020995-4f2d-e495-4e06-716b65af91d6.png)
　　デフォルトで、masterブランチはありますが、別にRecentというもので
　　追加Branchは、管理されます。また、両方の資源反映の場合は、ここで切り替えを
　　行います。

次回は、Githubの差分コミット、インシデント対応時のレポート、不要になった
リポジトリの削除方法について記載したいと思います。
デコレータを使ってバリデーションチェックしてみた

Pythonでのバリデーションチェックについて考えてみた。
結論だけ言うと、CerberusやSchematicsのライブラリを使おうってところなんだけど、自分でも書いてみたので残しておく。

簡易的には、以下のように書くとチェックできる。

```
class User:

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__check_validate()

    def __check_validate(self):

        if self.name:
            print('validation check:OK')
        else:
            print('validation check:NG')

        if 0 <= self.age <= 100:
            print('validation check:OK')
        else:
            print('validation check:NG')
```

ただし、これだと毎回チェック内容をコーディングしなきゃいけなくなる。
なので、デコレータを使って簡単に書けるようにしてみた。

```
from functools import wraps


def required(func):

    @wraps(func)
    def __wrapper(*args, **kwargs):
        if args[1]:
            print('validation check:OK')
        else:
            print('validation check:NG')
        func(*args, **kwargs)

    return __wrapper


def int_range(minimum, maximum):
    def __int_range(func):

        @wraps(func)
        def __wrapper(*args, **kwargs):
            if minimum <= args[1] <= maximum:
                print('validation check:OK')
            else:
                print('validation check:NG')
            func(*args, **kwargs)

        return __wrapper
    return __int_range


class User:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name + ':' + str(self.age)

    @property
    def name(self):
        return self.__name

    @name.setter
    @required
    def name(self, name):
        self.__name = name

    @property
    def age(self):
        return self.__age

    @age.setter
    @int_range(0, 100)
    def age(self, age):
        self.__age = age


user1 = User('Sato', 33)
print(user1)

user2 = User('', 34)
print(user2)

user3 = User('Suzuki', 101)
print(user3)
```

バリデーションチェックするデコレータを作成して、setterにつける。

デコレータをつけるだけなので何のチェックをしてるかわかりやすくなったけど、そのためにgetterとsetterを書かなきゃいけなくなるのがめんどう。
メソッドだけじゃなく、変数定義にもデコレータつけられるといいのにな。

ちなみにPyCharmだと、setter部分でインスタンス変数の定義は\_\_init\_\_でやるべきだ、と言われてしまいます。
でも、\_\_init\_\_の代入でもsetterを呼ぶ必要があるので、例外でsetterは許してほしい。
DispatchLabsのtest nodeをMacにセットアップする

# DispatchLabs

##特徴

1. DAPoSという独自コンセンサスで、高いトランザクション処理量を実現。トランザクションコストがない。
2. DispatchLabsのバーチャルマシンはEVM製なので現状のスマコンがそのまま使える。
3. "Artifact"という概念を導入しており、データはDispatchLabsのOff-Chain上で処理できる。

詳しい内容はこちら: https://dispatchlabs.attach.io/rJoHHA0Ez
技術的な質問はこちら: https://discordapp.com/invite/gYTSxR3
website: https://dispatchlabs.io/

## ローカルノードのセットアップ

Goインストール

+ `curl -O https://dl.google.com/go/go1.9.4.darwin-amd64.pkg`
+ `go1.9.4.darwin-amd64.pkg` then next/next/finish the thing

or

+ `brew install go`

`$GOPATH`は一意の適当なパスでいい。

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

### Dev Box

+ `go get github.com/dispatchlabs/disgo`
+ `cd ~/go/src/dispatchlabs/disgo`

2018.06.13時点 working branchが`dev`なので切り替えておく

+ `git checkout dev`
+ `go get ./...`
+ `go build`

ノード開始

+ `./disgo`

動作する。
デフォのconfigファイルが生成される。変更する場合は一度削除して再起動。
Firefox コンソールでJavaScriptデバッグ

#はじめに
Firefoxのアドオンを書いてデバッグするのに console.log でログを出力して確認する方法です。

#FireFoxでの開発ツールの表示
FireFoxで開発ツールを表示するなら F12キーです。

自作のアドオンを読み込むにはアドレスバーに

about:debugging

と入れて、一時的なアドオンを読み込むで 作成した manifest.json を選択するとロードができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262366/f0661026-053d-8299-e09e-99eeb72e9fef.png)

エラーがでたらうまくいくサンプルと比較して修正します。読み込んだアドオンの左下に出ている デバッグ をクリックするとこのアドオンの開発ツールが表示できます。HTMLページをみながらF12キーで console.log の出力を確認しようとしたところ何も表示されず、試していたところここだった事がわかりました。

[browser extension の設定ページ](https://qiita.com/keniooi/items/33965fbdffb5f67d10ae)

にある background.js 中の console.log での出力です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262366/8ccbc704-36b2-ce35-187b-7177c39a02a8.png)

HTMLページでのコンソールは"content_scripts"にある js で使えます。先の紹介ページ中の manifest.json だと sample.js になります。sample.js に

```javascript:sample.js
console.log("sample.js is loaded");
```

と入れておくとページの表示とともにログが確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262366/d5145538-8ae8-e3c6-0de9-82658db950cc.png)


#まとめ
今回は参考ページはなく、試してみてわかったことのご紹介でした。簡単そうなことですが、ログの場所がわからないとデバッグも不便ですね。
RubyでFizzBuzz改

Rubyに慣れるためFizzBuzzやってみた。

[初心者も上級者も。FizzBuzz問題について考えてみよう](https://sitest.jp/blog/?p=3822)

>2人以上のプレイヤーが1から順番に数字を発言していく
>3で割り切れるときは「Fizz」を発言
>5で割り切れるときは「Buzz」を発言
>両方で割り切れるときは「FizzBuzz」を発言

繰り返しの回数と発言者を変数にした。

```ruby:FizzBuzz.rb

def sayFizzBuzz(endNum,*talker)
  i = 0
  talkerNum = talker.length

  if endNum < talkerNum then
    puts '繰り替えし回数は発言者数より多く設定してください。'
  end
  talker.cycle(endNum/talkerNum){|talker| print "#{talker}  says  "
    i += 1
    if i % 3 == 0 && i % 5 == 0 then
      p 'FizzBuzz'
    elsif i % 3 == 0 then
      p  'Fizz'
    elsif i % 5 == 0 then
      p 'Buzz'
    elsif
      p i
    end
  }
end

sayFizzBuzz(30,'taisuke','yasuda','sho')

```

```ruby
taisuke  says  1
yasuda  says  2
sho  says  "Fizz"
taisuke  says  4
yasuda  says  "Buzz"
sho  says  "Fizz"
taisuke  says  7
yasuda  says  8
sho  says  "Fizz"
taisuke  says  "Buzz"
yasuda  says  11
sho  says  "Fizz"
taisuke  says  13
yasuda  says  14
sho  says  "FizzBuzz"
#以下略
```

発言者より繰り返し回数が少ない場合は、今回対応できていない。また考える。