OmniAICreator/Qiita-1.07M huggingface dataset:
ternaryとspread operatorを使い（if文使わない）object生成


## 例

webpack/gulpとかでよくみるやつ

```js
var env = process.env.NODE_ENV;
var config = {
  format: 'umd',
  moduleName: 'Redux',
  plugins: [
    nodeResolve({
      jsnext: true
    }),
    babel({
      exclude: 'node_modules/**'
    }),
    replace({
      'process.env.NODE_ENV': JSON.stringify(env)
    })
  ]
};

if (env === 'production') {
  config.plugins.push(
    uglify({
      compress: {
        pure_getters: true,
        unsafe: true,
        unsafe_comps: true,
        warnings: false
      }
    })
  );
}
```

とか

```js
if (env === 'developent') {
  config.sourceMap = true;
}
```

- reduxリポジトリの`rollup.config.js`からコードは取ってきた
 - `config.sourceMap = true;`は書き足し
- `if..else`とかなしですっきり書きたい
- es2015/babel以後のjsならもう少しすっきりかけるのでは？

と考え、やってみた

## spread operatorをつかう

```js
const obj1 = { foo: 1 };
const obj2 = { ...{}, foo: 1 }; // => { foo: 1}

const arr1 = [1, 2, 3];
const arr2 = [...[], 1, 2, 3]; // => [1, 2, 3]
```

`obj1`と`obj2`、`arr1`と`arr2`が同じになるのを利用する


## ternaryとspread operatorを組み合わせる

```js
const env = process.env.NODE_ENV;
const config = {
  format: 'umd',
  moduleName: 'Redux',
  plugins: [
    nodeResolve({ jsnext: true }),
    babel({ exclude: 'node_modules/**' }),
    replace({ 'process.env.NODE_ENV': JSON.stringify(env) }),
    ...env === 'production'
      ? [
          uglify({
            compress: { pure_getters: true, unsafe: true, unsafe_comps: true, warnings: false }
          })
        ]
      : []
  ],
    ...env === 'development' ? { sourceMap: true } : {}

};
```
## diff

```diff
-    replace({ 'process.env.NODE_ENV': JSON.stringify(env) })
+    replace({ 'process.env.NODE_ENV': JSON.stringify(env) }),
+    ...env === 'production'
+      ? [
+          uglify({
+            compress: { pure_getters: true, unsafe: true, unsafe_comps: true, warnings: false }
+          })
+        ]
+      : []
+  ],
+    ...env === 'development' ? { sourceMap: true } : {}

-if (env === 'production') {
-  config.plugins.push(
-    uglify({
-      compress: {
-        pure_getters: true,
-        unsafe: true,
-        unsafe_comps: true,
-        warnings: false
-      }
-    })
-  );
-}

-if (env === 'developent') {
-  config.sourceMap = true;
-}
```

- prettierを通してるが、ternaryの式を`(...)` で囲む挙動だけ利用してない
SQLみたいにjoinしたテーブルのColumnを使うようにlinqのSelectManyでも同じようにしたい

SelectMany parent class add coulmun list.
なんやかんやでこうしたいことあるじゃないですか。


```

select 
    s.LastName,
    e.CourseID 
from Student s
left outer join Enrollment e on
s.ID = e.StudentID

```

```
using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
    public class Student
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }
}

namespace ContosoUniversity.Models
{
    public enum Grade
    {
        A, B, C, D, F
    }

    public class Enrollment
    {
        public int EnrollmentID { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
        public Grade? Grade { get; set; }

        public Course Course { get; set; }
        public Student Student { get; set; }
    }
}
```

こうできる

```

Student.SelectMany(s => 
    s.Enrollment.Select(e => 
        new {s.LastName, e.CourseID }));

```
金の正解！銀の正解！【数列の和編】

プログラミングの学習を始めた人は、一度は数列の和を求めるプログラムを書いたことがあると思う。Javaプログラムで数列の和を求めるプログラムを書くとき、人によって出来上がるものが違うので、フジテレビのクイズ番組風にまとめてみた。

# 問題
二つの整数 a と b を引数とし、 a から b までの整数の和を返却するメソッドを作る。ただし、引数は以下の条件とする。

- a < b である
- a >= 0 である
- b < 100000 である

# 鉄の正解
定番のfor文を使った実装。
だいたいの人がこれ、もちろん僕も。無意識にこれ書いてる。
ただ、これだとコード量も多いし速度も遅い。

```java
int iron (int a, int b) {
	int result = 0;
	for (int i = a; i <= b; i++) {
		result = result + i;
	}
	return result;
}
```


# 銀の正解
Java8から導入された便利な機能を使ってスマートに実装する。
新技術に敏感な人はこれを書いてくる。

```java
int silver (int a, int b) {
	return IntStream.range(a, b + 1).sum();
}
```

# 金の正解
[等差数列 和の公式](https://ja.wikipedia.org/wiki/等差数列)を持ち出してくる。
賢いやつはこれを書いてくる、信じられん。
（コメント欄の[saka1029さん](http://qiita.com/saka1029)の関数を採用）

```java
int gold (int a, int b) {
	return (a + b) * (b - a + 1) / 2;
}
```

# 最後に
Javaプログラミングの学習を始めたばかりの人、金の正解で先輩を驚かせてやってくれ。
kotlinでGUI

##kotlinでawtとswingを使った描画
まずはAWTで線の出力

```kotlin:line.kt

import java.awt.*

internal class MyCanvas : Canvas() {
    override fun paint(g: Graphics) {
        g.drawLine(1, 1, 500, 500)
    }
}
internal class LineTest : Frame("LineTest") {
    init {
        setSize(500, 500)
        layout = BorderLayout()
        val mc1 = MyCanvas()
        add(mc1, BorderLayout.CENTER)
        show()
    }
    companion object {
        @JvmStatic fun main(args: Array<String>) {
            LineTest()
        }
    }
}
```
次にswingで線の描写

```kotlin:linetest.kt
import java.*
import java.awt.*
import javax.*
import javax.swing.*

internal class MCanvas : Canvas() {
    override fun paint(g: Graphics) {
        g.drawLine(1, 1, 500, 500)
    }
}
internal class JLineTest : JFrame("Jlinetest") {
    init {
        setSize(500, 500)
        layout = BorderLayout()
        defaultCloseOperation = JFrame.EXIT_ON_CLOSE
        val mc = MCanvas()
        add(mc, BorderLayout.CENTER)
        show()
    }

    companion object {
        @JvmStatic fun main(args: Array<String>) {
            JLineTest()
        }
    }
}
```

![スクリーンショット (160).png](https://qiita-image-store.s3.amazonaws.com/0/187924/b96d4799-a5aa-22d2-f953-b02e5db6fefb.png)


swingはAWTをベースに、強化されたものらしい
IntelliJ IDEA を使えば簡単に画像を表示できる。
[CentOS7]Laravel5がWebサーバ上で500を返してきた時に確認してほしいこと

# はじめに

CentOS7にてLaravel5.2を動かそうとしましたが，500 Internal Sever Errorが返されてしまいました．
それを解決した方法をメモがてら残しておきたいと思います．

以下は実行環境です

- CentOS 7.3.1611
- PHP 7.1.8
- Laravel 5.2

# 本題

一つ一つ確認していきたいと思います．

## 1.インストールの要件を満たしているか？

[公式](https://readouble.com/laravel/5.2/ja/installation.html)に書いてある通りですが，Laravelを動作させるためにはいくつかのモジュールを読み込む必要があります（下記はLaravel5.2の場合）．

    - PHP >= 5.5.9
    - OpenSSL PHP拡張
    - PDO PHP拡張
    - Mbstring PHP拡張
    - Tokenizer PHP拡張

これらを読み込んでない方は読み込みましょう．


```
$ yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

```
$ yum -y install httpd php71 php71-php
```

```
$ yum install -y --enablerepo=remi-php71 php-mcrypt php-mbstring php-pdo php-mysqlnd php-tokenizer php-pear php-fpm php-devel php-xml
```

/etc/php.ini 編集も忘れずに！

## 2. .envファイルのミス

.envファイルにはDB系の設定を記入しますが，ここがマルチバイトでも500が返されます．

## 3. 権限エラー

私はズバリこれが原因でした．
Laravelは bootstrap/cache/ や storage/ に対して書き込みを行います．
なので，Laravelからの書き込み権限を与えてあげる必要があります．

```
$ chmod 777 -R [projectName]/bootstrap/cache
$ chmod 777 -R [projectName]/storage/
```

Laravelは権限にうるさいらしいので，エラーが出たらまずこの辺りを疑ってみるといいのかもしれません．
また，初めにプロジェクト自体を `chmod 777 -R` で設定してしまってから，徐々に権限を狭めていく形でもいいと思います．

-----


以上，快適な開発生活を送りましょう！
ゼロから作る DeepLearning 5.2 節

# 但し書き
内々の勉強会用の資料です。
教科書どおりの説明だと天下り的に計算方法が与えられてわかりにくかったので自分なりの解釈をしました。

---
# 元々の目的
- 損失関数（$L$）を作った
    - 予測誤差とか
- ネットワークの学習 == $L$ の最小化
- $L$ の $W=(w_1,w_2, ..., w_n)$ に対する偏微分を求めれば L を小さくできる
    - $\frac{∂L}{∂W} = (\frac{∂L}{∂w_1}, \frac{∂L}{∂w_2}, …, \frac{∂L}{∂w_n})$
    - $W := W - η\frac{∂L}{∂W}$
- 偏微分を求めるには数値微分を使った
    - $\frac{∂L}{∂w_i} = \lim_{h -> 0}\frac{L(w_i+h) - L(w_i-h)}{2h}$
- すべての $w_i$ について L の偏微分は計算量が大きすぎる
    - L は超複雑な合成関数
- -> 誤差逆伝搬法なら計算量が小さいらしい・・ぞ！

---
# 連鎖律
```math
y = g(t) \\
t = f(x) \\
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/9a3cb9dd-50f6-afa1-e78f-5c9c92a010b2.png)
↑$∂t$ で約分ぽいことができる

---
# 連鎖律をグラフで
y = g(t) t = f(x)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/2ea78b1a-4d68-029f-bc9e-4bd96874a2b2.png)

---
# 連鎖律をグラフで
y = g(t) t = f(x)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/baaccfca-cf98-6ab3-d818-d61d580d0b05.png)

---
# どんどん連鎖しよう
最初は左($\frac{∂E}{∂t}$)から見ていく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/da528984-a260-32fe-3bee-9fabd31c7d5c.png)

次に右($\frac{∂E}{∂E}=1$)から見ていく。
右から順に、次々$\frac{∂E}{∂*}$が求まっていく。
=> 逐次的に右から計算してけば　OK!

---
# 計算効率がいい！
分岐グラフでは途中までの計算が再利用可！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/7afea446-fb52-16f0-bb7e-313631ebd028.png)
$\frac{∂E}{∂v}$ の結果は共用可

---
# 5.3 節へ向けて
局所的に考えよう！
下図で $\frac{∂E}{∂u}$ を求めたければ、必要なのは２つだけ！

- u->v の関数(ここでは足し算)
- 一つあとの偏微分: $\frac{∂E}{∂v}$

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/7afea446-fb52-16f0-bb7e-313631ebd028.png)
【Rails】短縮コマンド

Railsサーバー起動```
rails serve　　→　　rails s```
<br>
rails の環境を読み込んだ状態でrubyコードを実行```
rails console　　→　　rails c```
<br>

```rails generate　　→　　rails g```
<br>
```rails test　　→　　rails t```
<br>
Gemfileに指定されたGemをインストールする
```bundle install　　→　　bundle```
【勉強会用メモ】STARDUST

# はじめに
「標的型攻撃」による情報窃取事例は国内外で後を絶たない。しかしその研究対策はあまり進んでいない。
理由としては、攻撃者がどのようなコマンドを使ったのか、何を持ち出したのか等の具体的な情報が得られないことにある。
攻撃の起点となったマルウェアを解析するだけでは、どうやってネットワークに侵入したか、までしかわからない。また、持ち出された情報等は組織の機密事項にあたるためまず公開されない。

標的型攻撃対策の実践的な研究開発を行うため開発されたのが「STARDUST」である。今回はこれについてまとめてみる。

# 本題
### 「STARDUST」
国立研究開発法人情報通信研究機構(NICT)サイバーセキュリティ研究室が開発した、サイバー攻撃誘引基盤。2017年5月にその成果が公表された。

### 動き
標的型攻撃が始まると、政府や企業等の組織を精巧に模擬したネットワークである「並行ネットワーク」を高速（数時間程度）で構築する。そして攻撃者を模擬環境である並行ネットワークに誘引し、そこで攻撃者を自由に泳がせる。こうすることで実ネットワークに影響を与えることなく、攻撃者の挙動をリアルタイムに観測・分析することができる。

### 課題
・攻撃者に偽装環境と気付かれないようにする必要がある
・偽装環境構築のためのリソースとコスト
・など

# 参考
サイバー攻撃を偽装環境に誘引する攻撃誘引基盤「STARDUST」
http://www.keyman.or.jp/at/30009756/

サイバー攻撃誘引基盤“STARDUST”（スターダスト）を開発
https://www.nict.go.jp/press/2017/05/31-1.html
【Pusher】SwiftプロジェクトにPusher SDKを導入してサーバからメッセージをリアルタイムに受け取る

# Pusher とは

https://pusher.com

WebSocketを介したリアルタイムな双方向通信を、簡単にかつ安全に行える機能を提供するサービス。
公式から様々な言語に対してSDKが展開されており、SDK導入後わずか数行のコードで上記が実現できる。

今回は、クライアント側をSwiftを使用したiOSアプリケーション、サーバ側をPHPサーバとする。


# 主な流れ

1. Pusher側の準備
  1. ユーザ登録 (割愛)
  2. アプリケーションの作成
2. クライアント側の実装
  1. 新規Swiftプロジェクトの作成 (割愛)
  2. `PusherSwift`SDKの導入
  3. WebSocketからのイベントをキャッチする実装
3. サーバ側の実装
  1. MAMPでPHPサーバの用意 (割愛)
  2. `pusher-php-server`SDKの導入
  3. イベントを発行する実装


# Pusher側の準備

https://pusher.com からユーザ登録を行う。

## アプリケーションの作成

ユーザ登録後、最初のアプリケーションの作成が促される。

![スクリーンショット 2017-08-03 17.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/85825/abdb6856-2066-536f-09bb-6d009e893fec.png)

画面上の番号に沿って、

1. アプリケーション名を入力
2. クラスタ(俗に言うリージョン)を選択
3. クライアント側の実装を選択 - 今回は`iOS / OS X`を選択
4. サーバ側の実装を選択 - 今回は`PHP`を選択
5. 任意のメモ


# クライアント側の実装

新規に`Single View Application`を作成。

## `PusherSwift`SDKの導入

PusherのSwift向けSDKである`PusherSwift`は、cocoapodsで配信されている。
cocoapodsのインストール方法は割愛する。

`$ pod init`後、`Podfile`に`pod 'PusherSwift'`を追記し`pod install`実行。
cocoapodsを利用したので、以降は`.xcodeproj`ではなく`.xcworkspace`ファイルを開く。

## WebSocketからイベントをキャッチする実装

ソースコードは公式のサンプルコードを丸コピで動いた。
以下のコードは、StoryBoardでUILabelを用意し、PusherのAPIで送信された内容をそこに反映するよう改変したものである。

```swift
self.pusher = Pusher(key: "your_key", options: PusherClientOptions(host: .cluster("ap1")))
let channel = pusher?.subscribe("my-channel")
pusher?.connect()

channel?.bind(eventName: "my-event", callback: { (data: Any?) -> Void in
    if let data = data as? [String : Any] {
        self.label.text = data["message"] as? String
        self.label.sizeToFit()
    }
})
```

これを`ViewController`の`viewDidLoad()`に書いたが、注意としては`Pusher`のインスタンスを`ViewController`のインスタンス変数に持たせないと、コイツが解放されるとイベント購読が解除されるという点である。
そうなった場合、Xcodeのデバッグコンソールに以下のメッセージが表示される。
```
Your Pusher instance has probably become deallocated. See https://github.com/pusher/pusher-websocket-swift/issues/109 for more information
```

やっている事としては、`ap1`クラスタの`your_key`における`my-event`を購読。`my-event`イベントが発火したらデータをキャッチし、`[String:Any]`型、いわゆるJSONオブジェクトに落とし、`message`キーの値をラベルに反映、である。
※ 公式のサンプルコードは`[String:AnyObject]`となっているが、Swift3から`AnyObject`型は非推奨、`Any`が推奨されている。


# サーバ側の実装

MAMPでPHP環境を用意。

## `pusher-php-server`SDKの導入

PusherのPHP向けSDK、`pusher-php-server`はcomposerで配信されている。
composerのインストール方法は割愛。

```
$ composer require pusher/pusher-php-server
```
を実行。

## イベントを発行する実装

こちらも公式のサンプルコードを丸コピで動いた。

```php
<?php
  require __DIR__ . '/vendor/autoload.php';

  $options = array(
    'cluster' => 'ap1',
    'encrypted' => true
  );
  $pusher = new Pusher\Pusher(
    'your_key',
    'your_secret',
    'your_app_id',
    $options
  );

  $data['message'] = 'foo';
  $pusher->trigger('my-channel', 'my-event', $data);
?>
```

コイツを叩いてやればクライアント側のラベルが`foo`に変わる。

`trigger(channel_name, event_name, data)`の第三引数に連想配列を渡してやれば勝手にJSONに落として送信してくれるっぽい。
クライアント側もサーバ側も実装コードは簡単かつ直感的で量も少ない。
２ちゃんねる風の掲示板でアンカーを付ける。

２ちゃんねるっぽいものを作っています。

アンカーの作り方がすごく勉強になったのでメモです！

それぞれの本文にクラスを付けておいて、`map`メソッドで処理。
こんな感じで書くと、全部置き換えてリンクを付けてくれます。

```js
$(function() {
var res = ""
  $(".text").map(function() {
    res = $(this).text().match(/>+\d{1,3}/)
    if (res) {
      var thread_id = parseInt($(this).parents('.thread').attr('id'))
      var new_text = $(this).text().replace(/(>+)(\d{1,3})/g,'<a href="/threads/' + thread_id + '/$2">$1$2</a>')
    }
    $(this).html(new_text);
  });
});
```

replace＋正規表現です！

`/(a)(b)/`という感じで書きますと、
`<a href="$1">$2</a>`で
それぞれ`<a href="a">b</a>`という風に置き換えてくれます。

## 参考にしたサイト
[replace()の機能のまとめ！『正規表現、function()、arguments、RegExp()』：JavaScript](http://mmorley.hatenablog.com/entry/2016/05/26/010042)
SORACOM Funnel の `timestamp` を Elasticsearch で自動mappingする方法

## TL;DR

これを Elasticsearch に流し込んでおくことで、 SORACOM Funnel から出力される `timestamp` メタデータを Elasticsearch 上で Timestamp として認識できます

```console
$ curl -X PUT -H "Content-Type: application/json" -d @- <<EOT https://$ES_HOST/_template/my_map_tpl
{
  "template": "YOUR_INDEX_NAME*",
  "mappings": {
    "YOUR_TYPE_NAME": {
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "epoch_millis"
        }
      }
    }
  }
}
EOT
```

## SORACOM Funnel とは？

ざくっと言ってしまうと `funnel.soracom.io` にデータを送信すると、SORACOM上で指定したクラウドサービスへデータを転送してくれるサービスです
下記のように `funnel.soracom.io` にデータを渡すと...

```console
$ echo '{"my_data":1}' | curl -H "Content-Type: application/json" -d - funnel.soracom.io 
```

クラウド側では下記の通りのJSONを受け取ることができます

```json
{
    "operatorid": "ソラコムのアカウントID",
    "timestamp": "funnelがデータを受け取った日時(unix time)",
    "destination" : {
        "resourceUrl": "送信先クラウドサービスのURL",
        "service": "(aws-iot|kinesis|firehose|eventhubs|pubsub)",
        "provider":"(aws|azure|google)"
    },
    "credentialId": "ソラコムの認証情報のID",
    "payloads": {
        "my_data": 1 //実際のデータ
    },
    "sourceProtocol": "(tcp|udp|http|unspecified)",
    "imsi": "送信元のSIMのIMSI"
}
```

どんなクラウドサービスに送れるのか等の概要は[SORACOM Funnelの概要](https://soracom.jp/services/funnel/)を見てください

## SORACOM Funnel の `timestamp`

SORACOM Funnel ではタイムスタンプを SORACOM側 で付与してくれます。送信側で付ける必要がありません
この `timestamp` ですがフォーマットは **epoch millis** です。即ち、millisecondsまでくっついた UNIX time になります

※余談： [current millis](http://currentmillis.com/)なんてサイトがあるんですね

### Elasticsearch で自動認識させる方法

SORACOM Funnel から Elasticsearch へは直接データを流すことができませんので、AWS IoT や AWS Lambda のようなものを経由する必要があります
たとえば **デバイス ⇒ SORACOM Funnel ⇒ AWS IoT ⇒ Amazon Elasticsearch Service** という構成があります

Elasticsearchは残念なことにUNIX timeっぽい数値を Number型 として認識してしまい、Date型として自動mappingされません
ただし、[Elasticsearch自体は milliseconds付きのUNIX time(epoch time)をサポートしてます](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html)ので [Elasticsearchの自動マッピングの一部を上書きする方法](http://qiita.com/ma2shita/items/f534d8fafbd285570efd) を使ってmappingすることができます

マッピングテンプレートは下記のとおりです。 `YOUR_INDEX_NAME*` と `YOUR_TYPE_NAME` を環境に合わせれば動きます

```json:epoch_millis_mapping.json
{
  "template": "YOUR_INDEX_NAME*",
  "mappings": {
    "YOUR_TYPE_NAME": {
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "epoch_millis"
        }
      }
    }
  }
}
```

## あとがき

ひさびさにちゃんと書いた

EoT
分散型仮想通貨取引所「BitShares」の起動までの手順

## BitSharesについて

BitSharesとは、仮想通貨の取引所やウォレット機能などを備えた分散型システムの名称です。

 - 非中央集権的システムであり取引所運営会社がデータ消失してコインが消えたりしない(マウントゴックス事件怖い)
 - OSSとしてシステムが公開されている。
 - GUIで簡単に独自通貨を発行できる。
 - UIはReact

非中央集権的であることが特徴で推されているのですが、独自通貨を簡単に発行できるっていうのも凄いと思いますね。誰でも簡単にICO的なことができるわけですから。

こういった特徴を利用して国内でもICO的に開発資金を募るプロジェクトが生まれています。
最近ICOプラットフォームのcomsaが発表されましたが、BitSharesでなら個人や小規模な団体でも導入できそうです。

https://ninjasoul.net/

## マシン要件

OS: Ubuntu16.04
メモリ: 最低8GB以上、できればもっと
CPU: ２コア以上
ディスク: 20GB以上の空きはあった方が良い

注意: 
初回起動に非常にCPUを消費するため、クラウドで多コアのハイスペックマシンを借りてすぐに終わらせようと思うと痛い目を見ます。ブロックチェーン処理の性質的なところが原因と思うのですが、基本的にコア数に応じてスケールしません。ですので、コア数を２つ以上増やしても大きな効果は見込めません。

## bitshares-coreの起動

bitshares-coreがBitSharesの本体ともいえるサーバー・ソフトウェアです。どの仮想通貨にも似たようなものがあり、bitcoinならbitcoind、monacoinならmonacoindに相当するものです。

https://github.com/bitshares/bitshares-core

たぶんREADME通りに起動しようとしてもうまくいかないです。なのでメモとしてこれを書いています。

OSはUbuntu16.04が推奨されているので、Ubuntu16.04を使う。

１. 必要なファイルをインストール

```bash
apt-get install -y wget gcc g++ make automake autoconf cmake git libtool 
libboost-all-dev libssl-dev
```

２. openssl1.0系の手動インストール

bitshares-coreはopenssl1.1系では動作しません。このため手動インストールする必要があります。

```bash
wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
tar zxf openssl-1.0.2l.tar.gz
cd openssl-1.0.2l
CFLAGS=-fPIC ./config shared --prefix=/usr/local/openssl-1.0
sudo make install
```

３. bitshares-coreのビルド

developブランチは不安定なのでmasterブランチを使うか最新リリースタグをチェックアウトします。
cmakeでさきほどインストールしたopenssl1.0を指定します。
かなり時間がかかります。30分以上かかるかもしれません。

```bash
git clone https://github.com/bitshares/bitshares-core.git
cd bitshares-core
git checkout 2.0.170710 && git submodule update --init --recursive

cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DOPENSSL_INCLUDE_DIR=/usr/local/openssl-1.0/include \
    -DOPENSSL_SSL_LIBRARY=/usr/local/openssl-1.0/lib/libssl.so \
    -DOPENSSL_CRYPTO_LIBRARY=/usr/local/openssl-1.0/lib/libcrypto.so
make witness_node cli_wallet delayed_node
```

４. bitsharesノードの起動

初回の起動はブロックチェーンの同期が行われます。これには半日くらいを要し、メモリも初回起動の場合は6.5GBほど使います。
いくつかオプションがついていますが、このオプションなしだと32GBメモリがあっても足りませんでした。
同期が終わるまではCPUをかなり消費します。

```bash
./programs/witness_node/witness_node --partial-operations true --max-ops-per-account 100
```

２回め以降の起動ではメモリ使用量やCPU消費も少なくなります。

### 注意

1. witness_nodeはCtrl+Cで止められますが、終了にもかなり時間がかかります。２回Ctrl+Cをするとすぐに止まりますが、次回起動時にまたデータの同期が発生してとてつもない時間を使うことになりますので注意が必要です。

## dockerで起動

Dockerfileを作りました。Docker好きな方はこちらで。
VOLUME周りはご自身で設定をお願いします。

https://github.com/dotneet/bitshares-core-docker

## APIで通信

こちらのライブラリでbitshares-coreのAPIを簡単に扱うことができます。
BitShares本体の中の人が書いているライブラリでAPIのドキュメントは公式ドキュメント内にあります。

https://github.com/xeroc/python-bitshares

所持している仮想通貨を取得する例

```py
from bitshares.account import Account
account = Account("xeroc")
print(account)
print(account.balances)
```

通信するにはwitness_nodeに`--rpc-endpoint 127.0.0.1:8090`にオプションを付けておく必要があります。たぶん。

## その他

UIはこちらのリポジトリになっていて、これと合わせれば自分で取引所的なものを開設できそうです。
https://github.com/bitshares/bitshares-ui

そのうちこちらも試してみたいと思います。
GoglandでPubNubをimportしてbitFlyerのAPIを実行してみた

# きっかけ
JetBrainsさんがGo用のIDEを公開しはじめ、Go言語利用に乗り遅れがちな自分としては
この機会を逃す訳にはいきませんでした。結論は、「素晴らしいIDEである」の一言です。
語弊を招きますが、Goを理解しなくても作業が進められました。

## やったこと
Goプロジェクトの作成
PubNubのインポート
bitFlyerさんの取引手数料を取得するリアルタイムAPIの試打

### ソース

```go:pubnub_go.go
package main

// PubNub試す参考URL
// https://www.pubnub.com/docs/go/data-streams-publish-and-subscribe
import (
	"fmt"
	"html"
	"net/http"
	// 記載するだけでExternal Librariesに勝手に追加・・・
	"github.com/pubnub/go/messaging"
	"encoding/json"
)

func handler2(w http.ResponseWriter, r *http.Request) {
// PubNubのバージョンを表示
	fmt.Fprintf(w, "PubNub SDK for go;, %q", messaging.VersionInfo())
}

// サンプルべた書き
func main() {
	http.HandleFunc("/hello", handler2)

	pubnubTest := messaging.NewPubnub("demo", "sub-c-52a9ab50-291b-11e5-baaa-0619f8945a4f", "", "", false, "", nil)

	successChannel := make(chan []byte)
	errorChannel := make(chan []byte)

	go pubnubTest.Subscribe("lightning_ticker_BTC_JPY", "", successChannel, false, errorChannel)

	for {
		select {
		case response := <-successChannel:
			var msg []interface{}

			err := json.Unmarshal(response, &msg)
			if err != nil {
				fmt.Println(err)
				return
			}

			switch m := msg[0].(type) {
			case float64:
				fmt.Println(msg[1].(string))
			case []interface{}:
				fmt.Printf("Received message '%s' on channel '%s'\n", m[0], msg[2])
				return
			default:
				panic(fmt.Sprintf("Unknown type: %T", m))
			}

		case err := <-errorChannel:
			fmt.Println(string(err))
		case <-messaging.SubscribeTimeout():
			fmt.Println("Subscribe() timeout")
		}
	}

	http.ListenAndServe(":8080", nil)

}
```

### やってみた感想

Goの敷居がぐっと下がった様に感じます。
ただ、下がりすぎて詳細を追えていません・・・

夏休みの宿題にします。必ずやります。
【Rails】アプリケーション作成

アプリケーションの作成をするには以下のコマンドを入力
```rails new　作成したいアプリケーション名 
```

今回Errno:でgem install bindex -v '0.5.0'と表示されたので

```gem install bindex -v '0.5.0'```
を実行

<br>

```cd 作成したアプリケーション名```
でディレクトリの中に入る
<br>


ちなみにもしGemfileを書き換えた際は一番初めだけは以下のコマンドを実行
```bundle install --path vendor/bundle
```
**Gemfileはbundler用の設定ファイル
  アプリケーションを実行するrubyやsqlite3などのバージョンを指定することができる


<br>
２回目以降にGemfileを書き換えたら必ず以下のコマンドを実行する
```bundle install
```
そうしないと
```rails s
```でサーバー起動してもサーバーが更新されず書き換えたものが更新されない
<br>
サーバー起動したら
```localhost:3000/```
をURLタブに入力すれば作成したアプリケーションのwebサイトが開ける

うまく行かない場合
bundle install --path vendor/bundleの後に
```bundle update```
を実行し、再度rails s で起動してみるといいかもしれない
Atomで特定のディレクトリ配下のファイルを検索したい

#Atomで特定のフォルダの中のファイルだけを検索したい
色々と記事が出ていますが、仕様が変わったのか、
備忘録として残しておきます。

![スクリーンショット 2017-08-08 11.41.44.png](https://qiita-image-store.s3.amazonaws.com/0/115664/88aab872-d537-63ce-d1ab-6799ba21c201.png)
↑ 検索窓の3段目に指定したいディレクトリ名を入力



root/
　├ bin/
　├ etc/
　├ usr/
　│　└ local/
　│　　　└ koko/
　└ lib/

↑ 「koko」を検索したい場合

##間違い（記入方法）
koko と入力する

これでは、検索結果に全く何もひょうじされません。

##正しい記述方法
![スクリーンショット 2017-08-08 11.36.10.png](https://qiita-image-store.s3.amazonaws.com/0/115664/aaaf5fee-96ab-5659-ef5b-f8d51a1e4a32.png)

↑ このように記述しないと何もヒットしません。
SmalltalkからScratchをいじる 目次



[SmalltalkからScratchをいじる(0) 状態の保存(イメージの説明)](http://qiita.com/maeda_/items/7076dc32816259a0117a)

[SmalltalkからScratchをいじる(1) スプライトの大量生成](http://qiita.com/maeda_/items/7a525cae6b3c1ca45773)
[SmalltalkからScratchをいじる(2) スプライトの一括削除](http://qiita.com/maeda_/items/9cd1c818f964faaa1a08)
[SmalltalkからScratchをいじる(3) スプライトの位置を表示する](http://qiita.com/maeda_/items/0a9ddc5c3816d4a94463)
[SmalltalkからScratchをいじる(4) スプライトをドラッグさせた時の軌道を記録/再生](http://qiita.com/maeda_/items/2d68d440ead4c9134fcb)
[SmalltalkからScratchをいじる(5) ブロックの動作を調べる](http://qiita.com/maeda_/items/e12187eb3dda4f62939a)
homesteadのnginxでCakephpを使う

## SSHにログインする

```
vagrant ssh
```

## rootに昇格
```
sudo su -
```

## 設定ファイルを編集する
```
cd /etc/nginx/sites-available
vi 対象のファイル.app
```

## 下記のように編集する
```
server {
    listen   80;
    server_name 【サーバー名】;

    # root directive should be global
    root   /home/vagrant/【プロジェクトのパス】/app/webroot/;
    index  index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/【エラーログのファイル名】 error;

    sendfile off;

    client_max_body_size 100m;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }

    location ~ /\.ht {
        deny all;
    }

    ssl_certificate     /etc/nginx/ssl/digmee.homestead.app.crt;
    ssl_certificate_key /etc/nginx/ssl/digmee.homestead.app.key;
}

```

## 再起動

```
sudo nginx -s reload
```
CakePHP3 フォームの利用について


#フォームの作成(GETパターン)

name="text1"のvalueを格納する方法

```
//get方式でnameがtext1のデータを受け取る記述
$str = $this->request->query['text1'];
```

```/src/Template/Hello/index.ctp

<h1>サンプル見出し</h1>
<form action="hello/sendForm" method="get">
	<input type="text" name="text1">
	<input type="submit">
</form>


```

```HelloController.php
<?php 
	namespace App\Controller;

	class HelloController extends AppController {
		// クラス全体に適用される設定　initializeメソッドはクラスのインスタンスが作成される際に自動的に呼び出される
		public function initialize(){
			$this->viewBuilder()->layout('hello');
			$this->set('msg','Hello/index');
			$this->set('footer','Hello/footer2');
			
		}
		
		public function sendForm() {
			$str = $this->request->query['text1'];
			//こちらでも大丈夫　$str = $this->request['url']['text1'];
			$result = "";
			if($str !="") {
				$result = "you type:".$str;
			} else {
				$result = "empty.";
			}
			$this->set("str",$str);
			//htmlspecialchars(string)のショートハンド関数
			$this->set("result",h($result));
		}
	}
```
```/src/Template/Hello/send_form.ctp　(sendForm.ctpでないことに注意)
<h1>送信結果</h1>
<p><?=$result ?></p>
```

##一括でデータを出力する方法
/src/Template/Hello/index.ctp、/src/Template/Hello/send_form.ctp　は同じ

```HelloController.php
<?php 
	namespace App\Controller;

	class HelloController extends AppController {
		// クラス全体に適用される設定　initializeメソッドはクラスのインスタンスが作成される際に自動的に呼び出される
		public function initialize(){
			$this->viewBuilder()->layout('hello');
			$this->set('msg','Hello/index');
			$this->set('footer','Hello/footer2');
			
		}
		
		public function sendForm() {
			$result = "送信された情報";
			foreach($this->request->query as $key => $val) {
				$result .= $key . "=>".$val."<br>";
			}
			$this->set("result",$result);
		}
	}
```

```結果
送信結果

送信された情報
check1=>on
radio1=>on
radio2=>on
text1=>あ
select1=>Windows
```


#フォームの作成(POSTパターン)

```
//post方式でnameがtext1のデータを受け取る記述
 $str = $this->request->data['text1'];
```


```index.ctp
<h1>サンプル見出し</h1>
<form action="hello/sendForm" method="post">
	<input type="text" name="text1">
	<br><br>
	<input type="submit">
</form>
```

```HelloController.php
<?php 
	namespace App\Controller;

	class HelloController extends AppController {
		// クラス全体に適用される設定　initializeメソッドはクラスのインスタンスが作成される際に自動的に呼び出される
		public function initialize(){
			$this->viewBuilder()->layout('hello');
			$this->set('msg','Hello/index');
			$this->set('footer','Hello/footer2');
			
		}
		
		public function sendForm() {
			$str = $this->request->data['text1'];
			$result = "";
			if($str !="") {
				$result = "you type:".$str;
			} else {
				$result = "empty.";
			}
			$this->set("str",$str);
			//htmlspecialchars(string)のショートハンド関数
			$this->set("result",h($result));
		}
	}
```
mixhostでwww統一

mixhostのサポートは神レベルですね。
素晴らしい。

まぁ、レンタルサーバーはどこも素晴らしいですがね。

ということで、今回mihostにて https かつ www 無し統一ができなかったのでメモ。

メールで答えていただいたので共有します。


---

平素は当サービスをご利用いただき誠にありがとうございます。
mixhost カスタマーサポートでございます。

この度は、お手数をお掛けし、申し訳ございません。
.htaccess内の他の記述が原因となり正しくリダイレクト処理が行われいなかったようでございますので
弊社にて、お客様の.htaccess内の以下の301リダイレクト処理を追加させて頂きました。

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.xn--ecki4eoz8423cot4au0h884h\.net
RewriteRule ^(.*)$ https://xn--ecki4eoz8423cot4au0h884h.net/$1 [R=301,L]

上記の記述によって、wwwつきで当該サイトへアクセスされた際に、全てのディレクトリでhttpsのwww無しのURLへ
リダイレクトされるようになっておりますので、問題がないことをご確認頂ければ幸いでございます。

ご不明な点などございましたら、お気軽にお問い合わせください。
今後ともmixhostをよろしくお願いいたします。

---

以上。

サーバー側で設定してもうまく www 統一できない場合は htaccessをいじれるばいいってことですね。

大変勉強になります。
Heroku 及び Bluemix で、Python の PIL を使う方法

Heroku 及び Bluemix で、Python の PIL を使う時に、requirements.txt には、Pillow と書く必要があります。
flask で確認しました。

```text:requirements.txt
Flask==1.0.2
requests==2.20.1
Pillow==5.3.0
```
【Rails】マイクロポストの存在確認用のバリテーョンの追加方法 

Userモデルの名前属性とメール属性が存在するかどうかのバリテーョンを行う方法

railsのどこを見てFILL_INを記載するかは
views/users/index.html.erbで定義したものを記載

FILL_INの箇所にカラム名を書き込む

```rails
class User < ActiveRecord::Base
  has_many :microposts
  validates FILL_IN, presence: true
  validates FILL_IN, presence: true
end
```

のFILL_INをどのように記載するか
実際のコードは

```rails
class User < ApplicationRecord
   has_many :microposts
   validates :name, presence: true
   validates :email, presence: true
end
```

nameやemailだけだとその名前の変数ということになるので
:nameや:emailと記載する必要がある
CircleCI2にsshした時にDockerデーモンと通信できない時

## こんなの

```bash
# 接続
ssh -p 32768 x.x.x.x    
# ...
docker ps
# Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

docker-compose ps
# ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

# If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
```

## 解決

DockerとかDockerComposeを使う時の`setup_remote_docker`が**実行された後**に、`ssh`すると治ります。

### これ！！！！
![config_yml_—____work_repository_amskai.png](https://qiita-image-store.s3.amazonaws.com/0/84144/2a614655-9325-1089-5f6b-7e2384d81567.png)

![CircleCI_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/84144/3950686e-91fb-a5bf-1c17-76fcc6f289b7.png)

 この後に再度ログイン。

```bash
exit
# Connection to x.x.x.x closed.
ssh -p 32768 x.x.x.x
# ...                                                                                                                                                                                  
docker ps
# CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS              NAMES
# 34751fa806fe        mysql               "docker-entrypoint..."   5 minutes ago       Up 5 minutes        3306/tcp            db
docker-compose ps
# Name              Command                State      Ports   
# -----------------------------------------------------------           
# db     docker-entrypoint.sh mysqld      Up         3306/tcp 
```

よく分かってないけど、とりあえず`stepup_remote_docker`は`steps:`の頭の方に置いたほうがいいかもですね。
RSA 公開鍵を C# で JWKs(JSON Web Key Set) に出力する

[jose-jwt](https://github.com/dvsekhvalnov/jose-jwt) など C# のライブラリではサポートされていなかったので。

```csharp
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;

namespace TestCommands
{
    class Jwks
    {
        private const string PUBLIC_KEY = @"-----BEGIN PUBLIC KEY-----
MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQB5uVaCLL+DmPblCSJas1iC
MqY2XI4yZ3w5mj9gcXG9RqjWiZ8hSv+In1pUl4MSVoykd/Sd3khd6kKLt5GI40Ix
rs1f/DZBYdUYgNhc1pJU3AiOFx/xFmVFACwJM+fVkuJ/hXrHDsWK3AQdCcvrIBjs
RstK5ZzJOHW6doMsawle1EGbhxazBglVwE6zgyMAeGehZHzekj9bliEB4Pxn4Eir
VAPN6bbZ0CYygUQiKCV/L6lMR6IMtqG165rj32bOFdm3H8p/XUA5Rzn1HJe6T8JU
gEJRVIMrYegHclOmxS/LhhJZ7uXuDjex6NlciBlbwWXO6RBDyupwYuY7m8DWqML3
AgMBAAE=
-----END PUBLIC KEY-----";
        static void Main(string[] args)
        {
            using (var textReader = new StringReader(PUBLIC_KEY))
            {
                var pubkeyReader = new PemReader(textReader);
                RsaKeyParameters KeyParameters = (RsaKeyParameters)pubkeyReader.ReadObject();
                var e = Base64UrlEncoder.Encode(KeyParameters.Exponent.ToByteArrayUnsigned());
                var n = Base64UrlEncoder.Encode(KeyParameters.Modulus.ToByteArrayUnsigned());
                var dict = new Dictionary<string, string>() {
                    {"e", e},
                    {"kty", "RSA"},
                    {"n", n}
                };
                var hash = SHA256.Create();
                Byte[] hashBytes = hash.ComputeHash(System.Text.Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(dict)));
                JsonWebKey jsonWebKey = new JsonWebKey()
                {
                    Kid = Base64UrlEncoder.Encode(hashBytes),
                    Kty = "RSA",
                    E = e,
                    N = n
                };
                JsonWebKeySet jsonWebKeySet = new JsonWebKeySet();
                jsonWebKeySet.Keys.Add(jsonWebKey);

                System.Console.WriteLine(JsonConvert.SerializeObject(jsonWebKeySet));
            }
        }
    }
}
```

https://gist.github.com/nanasess/ff8629c476edfddc1b304f9759b9eaa3
BurpSuiteFreeを使うときの設定をサクサク書いてみた（iPhoneとAndroid） 


BurpSuiteFreeを使ってスマホの通信を見たいときに必要な手順を、簡単に書いてみました。

 - BurpSuiteFree版のインストールと設定
 - iPhoneとAndroidのプロキシ設定
 - 証明書のインストール

以上の設定が終わると、スマホの通信をBurpSuite側で取得できます。
※たまにできない場合もあります。

設定手順を以下に書いていきます。

## 環境

- Windows 7 Pro
- java 8 (1.8.0_66)
- Burp Suite Free Edition v1.7.23
- Nexus 6P (Android 6.0)
- XperiaZ1 SOL23 (Android 4.2.2)
- iPhone6 (iOS 10.3.2)
- iPhone5S (iOS 9.2)

※BurpSuiteFreeは2017/08/08時点で1.7.26がリリースされていました。


## BurpSuiteFree版のインストールと設定
BurpSuiteのFree版をダウンロードして起動します。
>Download Burp Suite Free Edition_
>https://portswigger.net/burp/freedownload/

※Javaをインストールしていない場合は別途インストールが必要です。

インストール後は下記の手順で起動しておきます。

 - 起動画面で「Temporary project」にチェックが入っているのでそのまま次へ
 - とりあえず「Use Burp defaults」のままで「Start Burp」で起動

起動後は下記の手順で設定しておきます。

 - Proxyタブ内のInterceptタブにある、「Intercept is on」 ボタンをクリックして「Intercept is off」 にしておく
 - Proxyタブ内のOptionsタブにある、「Proxy listeners」 の項目を下記のように設定しておく

<img width="80%" alt="proxylistener" src="https://qiita-image-store.s3.amazonaws.com/0/156827/99275bf7-63cd-34d4-3a0d-f2e391223625.png">

※ Bind to port のところは8080に設定していますが、すでに使用している場合もあるので、任意のポート番号に変えてください。

OKを押したあとに、Runningのところにチェックが入っている状態にしておきます。
※チェックが入らない場合は、設定したポートを他のツールが使用している場合があります。


## iPhoneとAndroidのプロキシ設定
BurpSuiteFreeを通って通信するようにスマホ側のプロキシ設定をします。
事前に必要な準備をしておきます。

 - BurpSuiteFreeをインストールしたPCのIPアドレスを取得しておく
 - 上記PCと通信を取得したいスマホを、同じネットワークのWi-Fiにつなげておく


## 端末側の設定
### iPhone端末の設定
 - iPhoneの「設定＞Wi-Fi」から、PCと同じネットワークのWi-Fiをタップ
 - 下のほうにある「HTTPプロキシ」で「手動」を選択して、下記を設定後に保存

>サーバ　→　PCのIPアドレス
>ポート　→　BurpSuiteFree側で設定したポート番号


### Android端末の設定
 - Androidの「設定＞Wi-Fi」から、PCと同じネットワークのWi-Fiを長押しタップ
 - 「ネットワークを変更＞詳細オプション」をタップして、「プロキシ」を「設定しない」から「手動」に変更して、下記を設定後に保存

>プロキシホスト名　→　PCのIPアドレス
>プロキシポート　→　BurpSuiteFree側で設定したポート番号

※Nexus 6P(Android 6.0)とXperiaZ1 SOL23（Android 4.2.2）で確認したところ、同じ手順でできました。


## 証明書の設定
以上の設定で、端末の通信がBurpSuiteFreeを通るようになりますが、
そのままだと証明書エラーが出ることがよくあります。
BurpSuiteFreeの証明書を端末にインストールすることで、証明書エラーを回避することができます。

### iPhone端末に証明書をインストール
 - BurpSuiteFreeと端末のプロキシ設定が完了していて、通信が取れる状態でSafariから下記URLにアクセス

>http://burp

<img width="30%" alt="iPhone_burp" src="https://qiita-image-store.s3.amazonaws.com/0/156827/5c270315-838f-b0b6-a5cd-ff0b85353df3.png">


 - 上記の画面が表示されるので、右上にある「CA Certificate」をタップして証明書をインストール
 - プロファイルのインストール画面が表示されるので、インストールをタップして完了する



### Android端末に証明書をインストール
 - BurpSuiteFreeと端末のプロキシ設定が完了していて、通信が取れる状態でChromeから下記URLにアクセス

>http://burp

 - iPhone端末の場合と同じく、BurpSuiteFreeの画面が表示されるので、右上にある「CA Certificate」をタップして証明書を取得
 - Android端末の場合、ダウンロードした「cacert.der」ファイルの拡張子を「.crt」に変更する必要があるので、変更後に端末上でファイルをタップする

<img width="30%" alt="Android_01" src="https://qiita-image-store.s3.amazonaws.com/0/156827/9e47ad0d-0485-f2a2-0952-bfe40b1a4562.png">
※この記事を作成したときには、Googleドライブに一旦ファイルをアップロードして拡張子を変更後、直接ファイルをタップすることでインストールしました。
拡張子を変更したファイルに端末上でアクセスできれば良いので、やりやすい方法で試してみてください！

 - 変更後のファイルをタップすると、証明書の名前を指定するポップアップが出るので、任意の名前で登録
 
<img width="30%" alt="Android_02" src="https://qiita-image-store.s3.amazonaws.com/0/156827/fd7c5f2f-5b65-5ccd-773f-8f9b5252b1b9.png">

## 完了
BurpSuiteFreenとスマホ側の設定が完了したら、スマホのブラウザから任意のサイトにアクセスしてみます。
証明書エラーにならずに、Proxyタブ内にあるHTTP historyタブに通信データが入ってきていれば完了です！

## 忘れずに！
スマホ側のWi-Fi設定は、作業が終わったらちゃんと解除しておくことを忘れずに！
WPF Settingsを楽に使う方法を考えてみた


# Settingsとは
アプリケーションの状態とか各種設定値とかを保存できる機能
ウィンドウの位置・サイズを記憶させて次回起動時に復元とかよくやると思う
使い方自体は簡単なので参考を見ればわかると思う
参考：[プログラマーズ雑記帳/Settings を使った WPF でのアプリケーション設定の保存 (ウィンドウの表示位置、サイズの保存](http://yohshiy.blog.fc2.com/blog-entry-253.html)

ここではなるべく簡単にSettingsを使う方法を考えてみる(ΦωΦ)

#1.普通に使う

```csharp:MainWindow.xaml.cs
private void MainWindow_Load(object sender, EventArgs e)
{
    //読み込み
}
private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
{
    //保存
}
```

こんな感じでWindowを読み込んだ時閉じる時に処理を書く
これだと設定項目が増えればいちいち書き足す必要がある上、他のタイミングで保存とかしたい時に
また長々と設定項目毎にコードを書かないといけなくなる┐(´д｀)┌
Viewが一つで、設定の読み込み・保存のタイミングが固定ならこれでもいいと思う

#2.処理部分をメソッドにする

```csharp
private Settings settings = Settings;

public void LoadSettings()
{
    //読み込み
}
public void SaveSettings()
{
    //保存
}
```

これなら項目が増えてもメソッドに書き足すだけで済む
しかし、これだとViewが増える度に同じようにメソッドを書かないといけなくなる(ヽ´ω`)

#3.Helperクラスを作る
Settingsへの保存処理などが汎用的にできるクラスを作ればもっと楽になりそう

例えば

```csharp
public class SettingsHelper
{
    private ApplicationSettingsBase settings;

    public SettingsHelper(ApplicationSettingsBase defaultSettings)
    {
        this.settings = defaultSettings;
    }

    public void SaveSettings(Action<ApplicationSettingsBase> action)
    {            
        action.Invoke(this.settings);
        this.settings.Save();
    }
}
```

こんな感じのクラスを作れば、保存時の値の設定が

```csharp
public class Sample
{
    public void Save()
    {
        var helper = new SettingsHelper(settings);
        helper.SaveSettings(s =>
        {
            s["hoge"] = "hogehoge";
            s["piyo"] = "piyopiyo";
        });
    }
}
```

こんな感じに書けるようになる

ただこれだと、インデクサでないとプロパティの指定ができないので、ジェネリックで使いやすくしたものを[作った](https://github.com/Kuro4/SimplifySetting)

## 使い方
SettingsHelper\<T\>をインスタンス化してメソッドを使うだけ
\<T\>はApplicationSettingsBaseを継承している必要がある
コンストラクタには\<T\>型のSettingsインスタンスを指定する
指定しなければ自動的にリフレクションで\<T\>内のDefaultプロパティを探してSettingsとする
(VisualStudioの
追加>新しい項目>設定ファイル 
で追加したものにはデフォルトで記述されている)
Settings自体はstaticとしてキャッシュしているため、あちこちでインスタンス化してもリフレクションで重くなりづらいようにしたつもり
使う際にインスタンス化してもいいが、SettingsHelper\<T\>のインスタンスを提供するクラスを作るなどしたほうが使いやすいと思う

簡単な[サンプル](https://github.com/Kuro4/SimplifySetting/tree/master/SimplifySettingsSample)も置いておく

# 終わりに

Settingsをなるべく楽に使うためにいろいろ考えたらこうなった・ω・
ここのやり方がおかしい・もっといいやり方がある
などなどあれば教えて下さい(人∀・)
Symbolプリミティブは文字列や数値への暗黙的な型変換をしない。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Consistency? What consistency? Where we’re going we don’t need any stinking consistency! <a href="https://twitter.com/hashtag/wtfjs?src=hash">#wtfjs</a> <a href="https://twitter.com/hashtag/fucklogic?src=hash">#fucklogic</a> <a href="https://t.co/hrgI73ZOq3">pic.twitter.com/hrgI73ZOq3</a></p>&mdash; Lea Verou (@LeaVerou) <a href="https://twitter.com/LeaVerou/status/894486050176774146">2017年8月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">TC39 didn&#39;t want implicit conversion (e.g., via + &#39;&#39;) but did want to allow explicit. Neither is too harsh. Both is secret/giant bug farm.</p>&mdash; BrendanEich (@BrendanEich) <a href="https://twitter.com/BrendanEich/status/894606986284748800">2017年8月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

`Symbol("foo").toString()`とすると文字列に変換されるけど `Symbol("foo") + ""`とすると TypeError: Cannot convert a Symbol value to a string となる。ポイントは明示的(explicit)か暗黙的(implicit)かで、Symbolでは明示的にtoString()を使用する分には問題ないけれど、暗黙的に型変換が行われようとすると TypeErrorを返す仕様となっている。暗黙的でなければ良いので、`Symbol("foo").toString() + ""`とすれば問題なく使える。

文字列への型変換（Type Conversion）については、http://www.ecma-international.org/ecma-262/6.0/#sec-tostring のあたりが仕様となる。Objectを文字列へ型変換する場合はtoString()があればそれが使われる。一方、SymbolではTypeErrorとなる（SymbolにもtoStringメソッドはあるのだけど）。数値への型変換でも同様にTypeErrorとなる。

Symbolの利用目的 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol) を考えると、ユニークなはずの値を暗黙的な型変換によってユニークに扱われずに問題を起こす... みたいなことは容易に想像できるので、妥当な感じはある。
> Every symbol value returned from Symbol() is unique.  A symbol value may be used as an identifier for object properties; this is the data type's only purpose.  Some further explanation about purpose and usage can be found in the glossary entry for Symbol.

とはいえ、（console.logに出すとか）何の気なしにSymbolと合わせて文字列作ろうとしてTypeErrorが出て混乱することもありそう。

なので「Symbolでは文字列と数値への暗黙的な型変換はされない」という点は覚えておいてもいいかもしれない。
AWSでバッチ処理をするときの方法を考える

## 概要
### 
AWSでバッチ処理をしたいとき、
AWSではどのサービスを使えば実現できるのか。
それぞれを簡単なサンプルで使いやすさを比較してみます。

## バッチ処理が出来そうなサービス

### Step Functions
	概要
		・Lambdaの処理の流れを可視化し、分岐や順序が意図した動作をしているか、確認をしながらバッチを構築していくことができる。
		・ワークフローをjsonで定義する
		・基本的にLambdaでできることに限る
	特徴
		・既存のLambdaがそのまま呼び出せる
		・リトライ処理や分岐の設計が容易
		・ほとんどの場合でEC2より安価（24hほとんど動いているような処理は割高なことも
	アンチパターン
		・一回の処理時間が長い(Lambdaは5分でタイムアウトしてしまうため
		・重い処理の実行
		・特殊なミドルウェアが絡むような処理はそもそもできない
	ユースケース
		・新規でAWS上にバッチ処理を作る場合
		・汎用的な複数の処理を組み合わせるような場合
		・短時間で終わる軽い処理
		

	


### AWS Batch
	概要
		・負荷の高いジョブを効率よく実行するサービス
		・事前に定義したDockerイメージの実行
	特徴
		・負荷に応じて自動でスケールする
		・dockerに乗る処理であれば何でもできる
	アンチパターン
		・軽い処理(毎回インスタンスが起動してしまう
		・頻繁に実行する処理
	ユースケース
		・シミュレーション
		・データ解析
		・並列実行できる処理

	
## 実際に動かしてみる
[Step Functionsを動かしてみる](http://qiita.com/u3h/items/8b97423979214c0ce547)
[AWS Batchを動かしてみる](http://qiita.com/u3h/items/3921fd9c922613b837b9)


## 使い分けの方針
新規のバッチであれば、まずはStep Functionsで作れないか検討することが良さそうです。
既存からの移行であったとしても、「Batchでなければ動かせない」ものでなければ、
Step Functionsへの移行を検討してみても良さそうです。
Step FunctionsとBatchの双方をゼロから触った印象としては、
BatchはDocker・ECR・Code Commit等 Batch以外にも学習が必要です。
規模にもよるとは思いますが、既存のバッチをそのままAWS Batchに移行するのも、
Step Functionsで新規構築するのも、
全てにかかる時間を考えるとそれほど差はないと思えます。
複数ファイルをbrowserifyするのにgulpを使うのを諦めた話



# 背景
browserifyは大変便利なコマンドです。
それ自体には、複数ファイルを処理するためのオプションはありません。

[gulp](https://gulpjs.com/)と[gulp-browserify](https://github.com/deepak1556/gulp-browserify)を組み合わせて複数ファイルを処理する方法があります。

# 結論
gulp-browserifyは、既にメンテナンスされていません。
npm scriptでnpm-run-allを使って置き換えました。


# npm scriptで置き換え
## gulp-browserifyの場合

srcディレクトリにある`client.js`と`execute.js`を変換します。

```gulpfile.js
const gulp = require('gulp')
const browserify = require('gulp-browserify')

const src = 'src/'
const dest = 'dest/'

gulp
  .task('browserify', () => gulp
    .src([
      `${src}client.js`,
      `${src}execute.js`
    ])
    .pipe(browserify())
    .pipe(gulp.dest(dest))
  )
```

## npm scriptの場合
npm script内の複数コマンドをまとめて実行するのに、大変便利な[npm-run-all](https://github.com/mysticatea/npm-run-all)というモジュールがあります。
実行したいコマンドを`npm-run-all cmd1 cmd2`という形で列挙することで、複数コマンドをまとめられます。

`group-name:*`という指定で、グループ指定することができるので、ここではそれを使います。
まとめて実行するコマンドは、`browserify`コマンドそのものです。

```package.json
  "scripts": {
    "browserify": "npm-run-all browserify:*",
    "browserify:client": "browserify -o dest/client.js src/client.js",
    "browserify:execute": "browserify -o dest/execute.js src/execute.js"
  }
```

## 置き換え手順
1. npm i npm-run-all
2. package.jsonにnpm scriptを追加
3. 動作確認
4. npm uninstall gulp gulp-browserify
5. rm gulpfile.js

# gulp-browserifyをやめた理由

READMEに大きく **NOTE: THIS PLUGIN IS NO LONGER MAINTAINED** と書かれています。
読みましょう（私は読まずに調査して、2時間使いました）。

## gulp-browserifyはメンテナンスされていない

最後にpublishされたのが[Jan 7, 2015](https://github.com/deepak1556/gulp-browserify/commit/db0f8c151458703ea2eedd30f651ae2e2e912475)です。

## gulp-browserifyが使っているbrowserifyが古い
使っているbrowserifyのバージョンは[3.x](https://github.com/deepak1556/gulp-browserify/blob/master/package.json#L14)です。
現在のbrowserifyの最新バージョンは[13.0.1](https://github.com/substack/node-browserify/releases/tag/13.0.1)です。

## ES6のパースに失敗することがある

requireした後で、アロー関数の引数でオブジェクトの分割代入をすると起きます。
具体的には

```js
const {
  EventEmitter
} = require('events')
const em = new EventEmitter()

em.on('data', ({
    one,
    two
  }) => console.log(one + two))
em.emit('data', {one: 1, two: 2})
```

こういう感じです。
browserifyはJavaScriptのパーサーに[Acron](https://github.com/ternjs/acorn)を使っています。
古いAcronのバグなのかな？と思っています。

[issue](https://github.com/deepak1556/gulp-browserify/issues/95) をあげたところで、[メンテされていない情報をもらい](https://twitter.com/shuheikagawa/status/893380708164567040)ました。
これ以上は調べても、gulp-browserifyに取り込まれないので、調査をやめました。

# もっと細かい背景
元々、ES6がブラウザに実装される以前の時代（2014年10月）に実装していました。
ES6をES5に変換するために、browserifyと同時に[babelify](https://github.com/babel/babelify)を使っていました。
現在のバージョンのブラウザで、使用しているES6文法がそのまま動くのが確認でき、直前にbabelifyを外しました。
babelifyを使っていればbrowserifyの実行前に、ES5への変換されます。
ES6のパースエラーは起きなかったのではないかと思います（試していません）。
TouchDesignerとMaxの線をちょっと比較をしてみる

# ノードをつないでプログラムするソフト

最近でてきたTouchDesignerに興味がでてきたので、
Maxと比較してみようと思います。

(TDはこれからなので、Max話多めです、スミマセン）

# 線の違い

## Maxの線
Maxでは、流れる内容によって線のタイプが違います。
プログラムでいうと型が違うのに似ていますが、もう少し決まりがあって、
３種類くらいある。（最近はGenとかさらに増えてる感じだが）

- MIDIとかbangとかの流れるもの（イベントドリブン、ボタンを押したとか、metroのbangで駆動）
- シグナル処理黄色しましま線
- マトリクス（何毎ものプレーンを持った配列のようなもの）緑のしましま線

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/32700eb1-3c4c-b069-de2c-ac6fc9101d27.png)

# 実行タイミングの違い
- MIDIとかbangとかで動くものはすごく遅い
- シグナル処理のはすごく早い

metroとかqmetroでリアルタイムに動いている風にアニメーションするけれど（フレームレベル）
シグナル処理はコマの数がやたら多い。（１秒間に44100回流れるもの）

シグナル処理と混在しているのがMaxらしさ。

# 線の進化
そしてこれらの線が入り乱れます。
都合の良いように、
inlet（オブジェクトの入力）に変換してくれるものもあれば、
自前で変換して入力してあげないといけないものがあります。

```
よくも悪くもMaxは歴史の長いソフト
その時代背景ごとに進化する時、
線を増やす拡張をしていった。

TouchDesignerは
これらの進化後に現れたので、
よく整理されていて入門しやすいと思われる。
```

```
ちなみに、PureDataという
Maxの兄弟アプリがあって、
Maxに似ているPureDataでは
線の進化（拡張）がなく、
PureDataは型の違いが
あんまり意識しなくて良いので
入門はPureDataの方が良いかも。
（型も気にしない　例：floatとintとか）

Maxはオブジェクトに繋がらなかったり、
エラーメッセージで、無理な接続だと気がつける。
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/c6fa9ae2-58bb-258b-d9f2-a27a89edee1c.png)

## TouchDesignerの線
TouchDesigner099では線ではなくOPの種類で異なる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/7d331fed-a168-3ef0-ab07-7631d9a67b80.png)

とりあえず、箱の色が重要！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/c09ba22f-3eda-4a0e-a3ed-65902e82b845.png)

異なるOPをどうつなぐか
は
次回予定・・・　（ヒント chop to）

```
次回予告 
TDとMaxの箱をちょっと比較してみる
箱の違い
Maxでも 
無印 
後ろに~
頭にjit.
で区別してる
```

次回：[TouchDesignerとMaxの箱をちょっと比較をしてみる](http://qiita.com/tatmos/items/982dbc81de5fa822b60c#_reference-032f98192e6579f44303)
LINEのMessaging APIで送られてくるタイムスタンプの変換にはまった

# LINE Messaging APIのWebhockで送られてくるデータ
```json
{
  "events": [
    {
      "replyToken": "(replyToken)",
      "type": "message",
      "timestamp": 1502147710132,
      "source": {
        "type": "user",
        "userId": "(userId)"
      },
      "message": {
        "id": "(messageId)",
        "type": "text",
        "text": "Hello, world"
      }
    }
  ]
}
```
この```timestamp```をPHPで文字列に変換しようとした。
## コード
```php
echo date('Y-m-d H:i:s', $event['timestamp']); // =>"49571-03-03 05:48:52"
```
なぜか49571年03月03日 05:48:52とかになる。

# 原因
APIから送られてくる```timestamp```はミリ秒単位だった。
# 解決策
ミリ秒単位で送られてくるなら**こっちで秒単位に直せばいい**よね

* ミリ秒単位のタイムスタンプを1000で割れば秒単位になる。
* タイムスタンプのデータ型はint型
* 別に秒単位の精度で問題ない

## 解決したコード
```php
echo date('Y-m-d H:i:s', ($event['timestamp'] / 1000)); // =>"2017-08-08 08:15:10"
```
# わかったこと
* ちゃんとAPIリファレンスは読みましょう。
* データは必要な精度まででいい。
* PHPにはミリ秒単位で扱える関数がない?(あったら教えてください。)
ArduinoUno: ブザーを鳴らすサンプルプログラム

Arduino Grove の　「ブザー・モジュール」のサンプルです。
「ブザー・モジュール」を、「D4」コネクタに取り付けます。
![buzzer_arduino.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4dba18a8-e1d8-ce68-0df5-b68765167b99.jpeg)

プログラム的には、配列とループのサンプルです。

## Arduino IDE 上のプログラム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c58fde1b-3d89-568c-9046-41afdbedbda2.png)


```text:sketch_buzzer.ino
int port_buzzer = 4;

void setup() {
  pinMode(port_buzzer,OUTPUT);
  
}

void loop() {
  int tt = 300;
  int freq[] = {262,294,330,349,392,440,494,523};

  for(int it=0; it < 8; it++)
  {
 tone(port_buzzer,freq[it],tt);
 delay(tt);
  }

  delay(500);

for(int it=7; 0<= it; it--)
  {
 tone(port_buzzer,freq[it],tt);
 delay(tt);
  }
  
  
 delay(2000);

}
```
pythonのunittestにおいてsetUpを一回のみ実行する方法

## 確認済み環境
- python3.4

## 概要
unittestが複数のテストを行うとき、setUpはテストを呼び出すごとに実行される。しかし、setUpの処理が重い場合は複数回呼び出されることで実行時間がかかりすぎる。

そこで、setUpを一回だけ呼び出したい場合どのように記述すれば良いか？それは、setUpを使う代わりにsetUpClassを定義することで解決する。

具体例として下記のようなコードを挙げる。

```test_setup.py
import unittest

class HogeTest(unittest.TestCase):

    def setUp(self):
        print('Called `setUp`.')

    @classmethod
    def setUpClass(self):
        print('Called `setUpClass`.')

    def test_called1(self):
        self.assertTrue(True)

    def test_called2(self):
        self.assertTrue(True)

    def test_called3(self):
        self.assertTrue(True)
```

このコードは`setUp`と`setUpClass`の初期化時に実行されるメソッドを持っている。これらはそれぞれunittestから提供されるメソッドである。また、ここでのメソッドは実行される度に文字列を出力するように定義した。またテストは3つ定義されている。

ここで、出力される文字列によってこのコードが期待する動作をするか確かめよう。
`setUp`での文字列が複数回出力されること、また`setUpClass`での文字列が一回出力されることを期待する。

実際に実行した結果がこちらだ。

```bash
$ python3 -m unittest test_setup.py
Called `setUpClass`.
Called `setUp`.
.Called `setUp`.
.Called `setUp`.
.
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK
```
確かに期待した動作をしていることが確認できた。


## 参考
[qiita: python unittestのテンプレート](http://qiita.com/Go-zen-chu/items/ddfe37c00324b1b8941e)
[stackoverflow: Run setUp only once](https://stackoverflow.com/questions/14305941/run-setup-only-once)
Laravelのblade上でURLを短く記述出来るテクニック

###■前提

・掲示板のようなサービスを想定

###ソースコード

通常bladeテンプレートでURLを記述する際は以下のように記述する。

```html
<a href="{{ url('/threads/'.$thread->id ) }}">{{ $thread->title }}</a>
```

Modelに以下のように```path()```メソッドを定義することで、

```php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Thread extends Model
{
    public function path()
    {
    	return '/threads/'.$this->id;
    }
}


```

以下のように短く書ける。

```html
<a href="{{ $thread->path() }}">{{ $thread->title }}</a>
```

以上。
node-red始めました

## はじめに
3日坊主の写経を繰り返してきた人生ですが、この度ずっと気になっていたnode-redに挑戦してみることにしました。もちろん初心者ですが、知識ゼロで挑む方がいれば何かの足しになるかも知れないと思い、投稿を始めてみます。やりながらというより一旦の試行錯誤が終わってから投稿するので、この記事は宣言だけになってしまいます。

## 感想
かなりいいですね。老若男女に優しい感じがします。 

## メリット
何より、ほぼ知識ゼロでできることがたくさんある！こと。カリカリの人たちへのメリットは知りません。カリカリの人たちに聞いてください。ただし、難しいことやろうと思うとnode.jsやjavascriptの世界は避けて通れないので、googleや隣人を頼りながらやっていきます。

## デメリット
3rd party? community?で便利なnodeはあるものの、最新の機能やちょっとはみ出したことをするにはfunctionでいくらか書くなり、場合によりnode自作したりが必要でした。あと特にBluemixで使う限り、セキュリティに関しての課題は大きいかも知れません。

## 今後の計画
- [ ] [まずはnode-redをBluemixで立ち上げます。無料枠で。](http://qiita.com/KURO-BLACK/items/77af2c98940320ca6ce9)
- [ ] [Slackをただ繋げてみます。](http://qiita.com/KURO-BLACK/items/0cb3fac16c26876e5d00)
- [ ] IBM Watson ConversationをSlackから叩いてみます。
- [ ] node-redでSlackとConversationを接続してみます。
- [ ] Google Calendarに予定を投げて秘書に会議を設定してもらいます。

## おわりに
かなり色んな記事を参考にさせていただいています。引用などきちんとするつもりですが、至らない点があればご指摘いただければと思います。また初心者にやさしく教えてくださる方、よろしくお願いします。