OmniAICreator/Qiita-1.07M huggingface dataset:
npmライブラリを書くときのtravisの設定

だいたい以下のような`travis.yml`を書けばいいです。

```yml
language: node_js
node_js:
  - '8'
  - '6'

cache:
  yarn: true
  directories:
    - ".eslintcache"
    - "node_modules"

notifications:
  email: false
```

#### yarn
基本的に`yarn`を使います。

before_installを使ってインストールします。

デフォルトでサポートしているようです。`yarn.lock`があれば自動的にyarnが使用されます。なお`before_install`で`yarn`をインストールしていてもCIの実行時間的には差はありません。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">travisってロックファイルがあればyarnを使うんか...知らなかった  <a href="https://t.co/Z6AkcrF8a4">https://t.co/Z6AkcrF8a4</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/951784419785826304?ref_src=twsrc%5Etfw">January 12, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


### notifications
`notifications`は完全にスパムになるので`false`にした方がいいと思います。


### node_js

```
node_js:
  - '8'
  - '6'
```

の部分ですが、`babel`環境なら8だけ書いておけばいいです。また、個人にはnode4系はサポートする必要はもうないと思います。

## +α

`touch-alt`を使っていれば、一度`touch -a .travis.yml`すると今後は`touch .travis.yml`で上記のテンプレートが作られるので便利です。

https://github.com/akameco/touch-alt
wercker導入手順②

[wercker導入手順①](https://qiita.com/k_g/items/7188c59ed79b0c875dd0)
前回はwerckerの登録とアプリケーションの作成まで行いましたので、今回はymlというwerckerの設
定ファイルの作成から配備までを行います。
ここまでで一旦最低限の導入は完了となります。

##ymlって？
YAMLという表現記法の拡張子です。YAMLとは何か？というと構造化したデータを記述するための表現記法で、Rubyやフレームワーク、ツールの設定ファイルなどでよく使います。
詳しくは[こちら](https://qiita.com/gctfuji/items/5f8e4c5795ce41b214d1)の記事で分かりやすくまとめられています。
WerckerではこのYAMLを使ってビルドやデプロイの手順を記載していきます。

##wercker.ymlの設定
作成したアプリケーションを選択し、「runs」タブから使用言語を選択。
（ここではrubyを選択）
![yml.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/b1dd73ba-3f46-a05e-aa3d-fd6468ce7999.jpeg)

ymlの内容をコピーし、ファイル名を"wercker.yml"として保存する。

```ruby:wercker.yml
box: ruby:2.4.2

services:
  - id: postgres
    env:
      POSTGRES_PASSWORD: secret_password
build:
    steps:
      - bundle-install
      - rails-database-yml:
          service: postgresql-docker
      - script:
          name: echo ruby information
          code: |
              echo "ruby version $(ruby --version) running"
              echo "from location $(which ruby)"
              echo -p "gem list: $(gem list)"
      - script:
          name: Set up db
          code: RAILS_ENV=test bundle exec rake db:schema:load
      - script:
          name: rspec
          code: bundle exec rspec
```

##Gitリポジトリへ配置
wercker.ymlをリポジトリのルートディレクトリにコミット。
![ymlpush.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/188a9709-307c-5bb4-1357-334e349bad1f.jpeg)

##起動確認
すると、werckerでymlに記載されたステップが実行されます。
![run.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/d35fff66-bd5c-bf44-cfca-bb2a83739337.jpeg)

しばらく待つと・・・

完了しました!
![result.jpg](https://qiita-image-store.s3.amazonaws.com/0/222268/9783da32-4241-739f-8dc4-0aa6b762e0b3.jpeg)

今回は導入手順の説明なのでビルドのみ行いましたがHeroku等へのデプロイも自動で行えます。

##まとめ
・導入さえしてしまえばあとはコミットをトリガーにビルド・テスト・デプロイまで自動化してくれるので非常に楽。
・あまりメジャーではないのかエラー時に調べても解決法がなかなか出てこない・・・
・boxやstepを自作すればもっとカスタマイズが可能なのでやりたいことを柔軟に実現できそう。
プログラム超初心者メモ　ループ系サンプルコード　（Switch文の復習を兼ねて）

ループ系サンプルコード　（Switch文の復習を兼ねて）

https://unity3d.com/jp/learn/tutorials/topics/scripting/loops

このリンクを見て改めて･･･なんとなく、最初に学んだのが
forだったからか、forが好き。
基本、1行でいろいろ定義できる。
配列を使う場合に、配列のLengthが、実際の要素数より1多い事に注意が必要。
10個の要素があっても０番から始まるので、当然だが･･･
そういう問題点はあると思うが、基本自由度が高い印象。

foreach　は簡潔に書けるが汎用性が低そう。
配列系を全部なめるときは良さそう。
もっと使っていいと思うが、現状はなんでもfor文になってるかも･･･

whileは、とても使いやすそうに見えるが･･･
とりあえず試し書きしながらというのが今の環境だと難しい。
コンパイルエラーがでなくても、Unityがプレヴュー実行可能で、脱出条件を書き忘れると
無限ループになって固まってしまうので慣れないと使いにくい。
その問題がなければ使いやすそうだが、現環境では学習効率上、致命的な欠点なので･･･
なので躊躇して書かないから、一年後も書けるようにならない気がする。


以下テストコード丸ごと
※ Unity Mac VScode 利用でのテスト用
　てきとうなゲームオブジェクトにこのコードを貼り付けてインスペクタで
　ループモードを変えれば、プリント内容が変わります。

```csharp

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Foreach_For_While : MonoBehaviour {

 private int[] IntArray ={0,11,222,3333,44444,555555};
 public enum LoopMode {Foreach,For,While,Stop};
 public LoopMode MyLoopMode;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		switch(MyLoopMode)
		{
			case LoopMode.Foreach:
			    // int count=0;
				//　▲　Switch文はif文と違ってスコープが別れていないので、同名のローカル変数を作りにくい？
				//　▼ ・・・と思ったけどスコープの外に書いているからダメだったのがアドバイスで解りました。
				{
					int count=0;
					foreach(int num in IntArray)
					{
						print("foreach__"+num.ToString());
						count++;
						if(count==IntArray.Length){MyLoopMode=LoopMode.Stop;}
					}
					break;
				}
			case LoopMode.For:
			    int maxF=IntArray.Length-1;	
				for(int i=0;i<=maxF;i++)
				{
					print("for__"+IntArray[i].ToString());
					if(i==maxF){MyLoopMode=LoopMode.Stop;}
				}
				break;
			case LoopMode.While:
				int countW=0,maxW=5;
				//while(int id < IntArray.Length)
				//　　　　　↑　と　型を書いて定義することはできないっぽい。
				//ちょっとしたミスで、無限ループになる可能性がそこそこある…Unityが固まる。
				while( countW <= maxW)
				{
                     print("while__"+IntArray[countW].ToString());
					 if(countW==maxW){MyLoopMode=LoopMode.Stop;}
					 countW++;
				}
				break;
			case LoopMode.Stop:
				break;
		}
	}
}
```
Twitter アカウント、および、TwitterでAPIアクセスするためのOAuthクレデンシャル取得方法

# はじめに

Twitterアカウントの取得方法とAPIアクセスするためのOAuthクレデンシャルを取得方法について記載します。

# Twitterアカウントの取得

[Twitterのサイト](https://twitter.com/)にアクセスして、「アカウント作成」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/f4bb9352-6e8c-17fb-4aae-8725a0fa8069.png)

名前（またはニックネーム）、電話番号またはメールアドレス、パスワードを入力してアカウントを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/5df0c690-4ac5-047b-4bbe-9cf80a08b491.png)

SMSメッセージが利用出来る携帯電話番号を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/cf65e6c8-198e-f785-5e53-02264d6e5113.png)

携帯電話に届いたSMSメッセージの認証用コードを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/4bcd4a7c-e35d-423e-a2b3-f516ce6afeeb.png)

ニックネームや興味のカテゴリのアンケート、フォローするユーザの画面が表示されるので適当に入力および選択して進むと、Twitterのホーム画面が表示されます。アカウントの確認メールが届いているのでメールの「確認する」ボタンをクリックすると全機能利用出来るようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/3d482303-20bd-ce76-db30-c212ae5ab0ba.png)

それでは、キーワードウィンドウから適当な会社名や製品を入力して、いくつかきになるTwitterアカウントをフォローします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/c878ce16-342f-f3e4-0be2-13eb7ab45a2e.png)

また、「今どうしてる」のウィンドウからツイートしてみます。「例：cdataハンズオン #cdata」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/cecd88e9-0c77-42eb-80da-5010644eb393.png)

タイムラインにツイート情報が表示されることを確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/de7b40ae-40ed-18b1-bc5a-5b713419baf2.png)


# OAuthクレデンシャル取得

[Application Management画面](https://dev.twitter.com/apps)にアクセスして「Create New App」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/0c5ec037-c658-3b8e-bd1b-055b316790e4.png)

Name(任意),Description（任意）、Website（http://127.0.0.1/）、CallbackURL（http://127.0.0.1/）を設定して、Derveloper Agreementをチェックして「Create your Twitter Application」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/66a3267c-415d-8c79-0372-16a400ed3c80.png)

アプリケーションが作成されたことを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/d7bf60ca-d3a5-912c-6437-babd3626676a.png)

「Keys and Access Tokens」タブに移動して、下の方の「Create my access token」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/6552dfc1-c406-a9d0-d8c2-0d9d474b916f.png)

発行された「Consumer Key (API Key)」「Consumer Secret (API Secret)」「Access Token」「Access Token Secret」を手元に控えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/da6508a9-177a-5160-abcd-8a78b7ccca6d.png)

# まとめ

Twitterアカウントを取得してAPIアクセスするためのOAuthクレデンシャルを取得する事ができました。
Mongoid6のモデルでRegexpを使うと妙なことが起きる

Mongoidを使っているRailsアプリを、Rails4から5にあげるときに奇妙なことが起きた。
Rails4から5にあげるのに伴って、Mongoidを5.xから6.xに更新したのだが、テストが通らなくなった。

問題の箇所を抜粋すると以下のようなコードになる。

```my_model.rb
class MyModel
  include Mongoid::Document
  field :key, type: String
  field :default, type: String
  field :format, type: String

  validates :key, presence: true, uniqueness: true, format: {with: /\A\w+\z/}
  validate :default_value_conform_to_format

  private
  def default_value_conform_to_format
    regexp = Regexp.new(self.format.to_s)
    unless regexp =~ self.default.to_s
      errors.add(:default, "does not match regexp #{self.format}")
    end
  end
end
```

Mongoidを6にあげると`default_value_conform_to_format`でvalidationエラーが発生するようになる。
ちなみにテストケースでは、`default`も`format`もどちらもnilになっている。
空の正規表現は、空文字列にマッチするはずなので、エラーが起きるはずはないと思っていた。

```rb
// =~ ""  #=> 0
```

問題となっていたのは、実はRubyの標準ライブラリの`Regexp`ではなくて、Mongoidの中の`Mongoid::Matchable::Regexp`というクラスを参照するように変わってしまっていたことだった。
どうやらMongoidが勝手にこのような名前のクラスを追加してしまっていたようだ。しかもタチの悪いことに標準の`Regexp`と挙動が異なる。

```diff
-    regexp = Regexp.new(self.format.to_s)
+    regexp = ::Regexp.new(self.format.to_s)
```

としたところ解決した。
バリバリの文系出身新卒エンジニアが一年目に読んだ本

# UNIX系
- 『UNIXという考え方―その設計思想と哲学』

# shellプログラミング
- 『入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界』
    - シェルスクリプトを触ったことがない初心者がいきなり取り組むにはやや難しめ。
- 『新しいLinuxの教科書』
    - シェルスクリプトを触るならまずはこの一冊からが近道。
    - Linuxの基本コマンドを覚えられる。
    - この本で基本コマンドを知っているレベルになれば、（覚えなくていい。検索すればいいから）上のシェルプログラミングの本をやるとスムーズにレベルをあげられる。
- 『sed & awkプログラミング 改訂版 (A nutshell handbook)』
    - シェルプログラミングをやっていて、いずれぶち当たる壁がawkとsed。
    - この壁をぶち破るには、この一冊。

# スクレイピング
- 『Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド』
    - スクレイピングするならこの一冊をとりあえず読めば十分
    

# 機械学習
##scikit-learn
- 『Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎』
    - いろいろ機械学習の本を読み漁った結果、これくらい詳しく書いてないと、自分がどんなコードを書いているか全くわからないので、これから始めるのがいいかも。

## DeepLearning
- 『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』
    - 言うほど難しくない。DeepLearing知らねっていう自分でもわかった。
Elastic Beanstalkの.ebextensions集

# timezoneをJapanにする

```yaml:timezone.config
commands:
    timezone:
        command: cp -p /usr/share/zoneinfo/Japan /etc/localtime
files:
    "/etc/sysconfig/clock":
        mode: "000644"
        owner: root
        group: root
        content: |
            ZONE="Japan"
            UTC=true
```


# swapを有効にする

swapのサイズは、ddの引数を適宜変更してください。以下の例だと、4GBになります。
（Linuxディストリビューションによっては、`/var/run` がRAMディスク等の大きいファイルが作れないファイルシステムに割り当てられているので、その場合は `/var/swap` 等、ディレクトリを変更するようにしてください）

```yaml:swapon.config
commands:
  create_swap:
    test: test ! -f /var/run/swap/0
    command: test ! -f /var/run/swap/0 && mkdir -p /var/run/swap && dd if=/dev/zero of=/var/run/swap/0 bs=1M count=4096 && chmod 600 /var/run/swap/0 && /sbin/mkswap /var/run/swap/0 && /sbin/swapon /var/run/swap/0
```

# sysctlでチューニングする

内容は各自秘伝のタレを入れてください。

```yaml:sysctl.config
files:
    "/etc/sysctl.d/90-beanstalk.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            vm.swappiness = 40
            net.core.somaxconn = 2048
            net.ipv4.tcp_fin_timeout = 15
            net.ipv4.tcp_slow_start_after_idle = 0
            net.ipv4.ip_local_port_range = 2048 65535
            net.core.rmem_max = 16777216
            net.core.wmem_max = 16777216
            net.ipv4.tcp_rmem = 4096 1048576 16777216
            net.ipv4.tcp_wmem = 4096 1048576 16777216

commands:
    sysctl:
        command: sysctl -p /etc/sysctl.d/90-beanstalk.conf
```


# mecabを入れる

[全文検索エンジンGroongaプロジェクト](http://groonga.org/ja/)の配布されているyumリポジトリを利用します。（感謝！）

```yaml:01-groonga.config
packages:
    rpm:
        groonga: https://packages.groonga.org/centos/groonga-release-1.3.0-1.noarch.rpm

commands:
    groonga:
        command: perl -pi -e "s;/centos/.releasever/;/centos/7Server/;g" /etc/yum.repos.d/groonga.repo
```

```yaml:02-mecab.config
packages:
    yum:
        mecab: []
        mecab-ipadic: []
        mecab-devel: []
        gcc-c++: []
```

# [prestissimo](https://github.com/hirak/prestissimo)を入れてcomposerを高速化する

PHPでcomposerを使ってパッケージを入れる前に、[prestissimo](https://github.com/hirak/prestissimo)を入れておいてデプロイを高速化します。


```yaml:install-prestissimo.config
commands:
    install:
        env:
            COMPOSER_HOME: /root
        command: composer.phar --no-ansi --no-interaction global require hirak/prestissimo
```

# その他参考

* EC2インスタンスのメモリとディスクのメトリクスのモニタリングをする
 * https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-cw.html
* Amazon CloudWatch Logsでログファイルをストリーミングする
 * https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.cloudwatchlogs.html
PostgreSQLのメモリ設計

# はじめに
PostgreSQLの設計を行う際の、メモリに対する考え方についてまとめました。
PostgreSQLで使用するメモリは大別すると、PostgreSQLサーバプロセス全体で共有される共有メモリと、バックエンドプロセスで確保されるプロセスメモリの二つになります。

*PostgreSQLで使用するメモリ = 共有メモリ + プロセスメモリ*

本記事では、特に重要な、共有メモリの共有バッファ(shared_buffers)と、プロセスメモリの作業メモリ(work_mem)について記載しています。

## 共有バッファ(shared_buffers)
共有バッファは、テーブルやインデクスのデータをページ単位でキャッシュします。データアクセス時にデータベースファイルをページ単位でメモリ上に展開し、繰り返しデータにアクセスするときの処理性能を向上させます。

しかし、共有バッファが大きいほど性能が良いというわけではなく、サイズが大きくなると、バッファ探索に時間がかかったり、チェックポイント処理の負担も大きくなります。

なお、PostgreSQLでは、目安としてメモリを1GB以上搭載したサーバの場合、搭載メモリ量の25％程度を設定するのが推奨になります。

*見積りサイズ = サーバのメモリ容量 * 25 / 100*

## 作業メモリ(work_mem)
作業メモリの「work_mem」を大きくすると、ソートやハッシュをメモリ上で行えるため、基本的には性能が向上しますが、複雑な問い合わせの場合には、ソートやハッシュが問い合わせの中で複数回実行されることがあります。この場合、work_memサイズの数倍のメモリが必要になります。またwork_memはクライアント同時接続数に比例し、さらにその数倍の物理メモリを消費します。よって、メモリ不足からスワップが発生しかえって性能が悪くなるため、注意が必要になります。

*見積りサイズ = サーバのメモリ容量 - (shared_buffers + その他(※)) / max_connections*

(※)OS及びMWで消費するメモリ等

## その他
- max_connectionsは、アプリケーションに対する同時接続数及びPostgreSQLのスーパユーザによる接続(※)を考慮して設計します。
(※)superuser_reserved_connections

- データベースの障害対策として接続確立後のデータベース処理時に、アプリケーションが異常終了した場合、タイミングによってはデータベースがアプリケーションの異常を検知できず、不要なプロセスが残存する状態が発生します。本現象の発生により、不必要なメモリが獲得されたままになる可能性がある為、コネクションのタイムアウトとして、「tcp_keepalives_idle」及び「tcp_keepalives_interval」を設定するのが望ましいです。
- さくっと設定値見積もるなら、[PgTune](http://pgtune.leopard.in.ua/)がおすすめです。
ESP32でBluetoothスピーカーを作ってみた (I2S編)

![DSC_0001.JPG](https://qiita-image-store.s3.amazonaws.com/0/174906/f5d70ccc-28d2-0b84-cade-dbc48b56d68d.jpeg)



ケータイなどからBluetoothを通じて無線で音楽を聴くことができます。今回は音の出力にI2S入力のD級アンプを使いました。小型ですが大音量が得られます。

#準備
以下のものを使用しました。

- [ESP32-DevKitC] (http://akizukidenshi.com/catalog/g/gM-11819/) 1480円：秋月
- [セラミックコンデンサ 22pF] (http://akizukidenshi.com/catalog/g/gP-11137/) 5円：秋月
- [I2S入力 D級アンプ] (https://www.switch-science.com/catalog/2749/) 831円：スイッチサイエンス
- [3Wスピーカー] (https://www.switch-science.com/catalog/2749/) 1058円：スイッチサイエンス


#配線
ESP32とD級アンプを以下のように配線します。またBCLKとGNDの間にコンデンサを配線します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/174906/e97399f6-44ba-7568-941f-6fe8a494944d.png)


# プログラム
プログラムは[ESP-IDF A2DP-SINK demo](https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/a2dp_sink)になります。元々A2DP(Bluetoothで音楽を送るプロファイル)だけのサンプルコードだったのですが去年10月にI2S出力が追加されました。これをesp-idfでESP32に書き込みます。

# ペアリングと再生
スマホなどからBluetoothデバイスをサーチするとESP_SPEAKERというのが出てきます。これとペアリングします。このままスマホで音楽を再生するとこのBluetoothスピーカーから音がなります。D級アンプを二つ使えばステレオ出力も出来ます。やり方はD級アンプの仕様書に記載されています。
git diff で特定のファイル、ディレクトリを除外する方法（ワンライナー）


コードチェックするときに、画像ファイルのコミットは除外したかったりするので、メモ


```
git diff --name-only origin/master...HEAD | grep -v [除外したいファイル・フォルダの名前] |  xargs git diff origin/master...HEAD
```

## iOSでdiffから画像のコミットを除外したい例

```
git diff --name-only origin/master...HEAD | grep -v Assets.xcassets |  xargs git diff origin/master...HEAD
```
AWS SDK で SQS を Python で操作する

今回はPythonのAWS SDKでSQSメッセージの送受信を行います．

#前提
- aws cli の configure を済ませている

#ソースコード
設定は`configparser`モジュールを使用します．

```config.ini
[sqs]
url : https://sqs.ap-northeast-1.amazonaws.com/YYYYYYY/XXX
```

それではソースコードです．

```sqs.py
# -*- coding: utf-8 -*-

import configparser
import boto3
import json

# configファイルの読み込み
ini = configparser.SafeConfigParser()
ini.read("./config.ini")

sqs = boto3.client('sqs')
url = ini.get("sqs", "url")

# 送信するJSON
body = {"type": "Right", "Action": "On"}

# SQSへJSONの送信
response = sqs.send_message(
    QueueUrl=url,
    DelaySeconds=0,
    MessageBody=(
        json.dumps(body)
    )
)

# SQSからJSONを受信
response = sqs.receive_message(
    QueueUrl=url,
    AttributeNames=[
        'SentTimestamp'
    ],
    MaxNumberOfMessages=1,
    VisibilityTimeout=0,
    WaitTimeSeconds=0
)

message = response['Messages'][0]
body = json.loads(message['Body'])
print(body)

# メッセージを削除するための情報を取得
receipt_handle = message['ReceiptHandle']

# メッセージを削除
sqs.delete_message(
    QueueUrl=url,
    ReceiptHandle=receipt_handle
)
```
実行します．

```shell
$python3 sqs.py
{'Action': 'On', 'type': 'Right'}
```

無事JSONを受信できました．
Alexaを使って遊ぼうと考えているので今日はその準備にSQSを使用してみました．

#参考文献
- [【AWS】SDKからSQSを操作する（送受信）【Python】【Node.js】](https://qiita.com/Yuki_BB3/items/5b17f1254b6fb6295129)
- [Sending and Receiving Messages in Amazon SQS](http://boto3.readthedocs.io/en/latest/guide/sqs-example-sending-receiving-msgs.html)
- [SQS API Reference](https://boto3.readthedocs.io/en/latest/reference/services/sqs.html)
Beebotte のメッセージを Node-RED で受ける

自宅に設置したRaspberry Pi と外部サービスと連携する場合、Raspiをインターネットに晒してHTTP等でリクエストを受けられるプログラムを稼働させておく必要があったりするが、次を組み合わせればインターネットに晒すことなく、外部からメッセージを受信することができる。

- Beebotte
- Node-RED

以下にその方法を記述する。

## beebotte の設定
[Beebotte](https://beebotte.com/home) はIoT向けのクラウドサービス。REST API や MQTTをサポートして、接続された機器にリアルタイムでメッセージを通知することができる。
今回はこのサービスをMQTTブローカーとして利用する。
１日50000メッセージまでならフリープランで利用できる。個人ユースには十分だと思う。

まずはアカウントを登録する。フリープランならユーザ名、メールアドレスとパスワードだけで登録できる。
特に迷うところはないと思う。登録後、確認のメールが届くのでメールに記載されたリンクを踏めば先にすすめる。

アカウント作成後はチャネルとリソースを登録するよう促される。
これも特に難しいところはないと思う。

Channel名とresource名で REST API や MQTTのエンドポイントが決まる。
そのことを踏まえて、任意の名前をつければ良い。

登録するとこんな感じ。
発行される `Channel Token` は後にNode-REDと接続する場合に必要となる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32533/70151c9f-de9d-d12d-d6d8-359bde1fc5ec.png)

スクショの例だと、メッセージをpublishするREST API のURLは次のようになる。

```
http://api.beebotte.com/v1/data/publish/MyIoT/light_at_bed_room?token=[Channel Token]
```

Beebotteの管理画面には動作確認に便利なコンソールも備わっているので APIを叩かなくても、コンソールを使ってメッセージを送信を試すことができる。

## Beebotte に Node−REDで接続
NodeREDではデフォルトで MQTTがサポートされている（というかもともとMQTTのためのツールだったそうな）。
Beebotte と連携するには *mqtt in* ノードを利用する。

*mqtt in* ノードのサーバ設定は次の通り。
ユーザ名に `token:[Channel Token]` を設定するのが肝。

|設定項目|設定値|
|---|---|
|サーバ|mqtt.beebotte.com|
|ポート|8883|
|SSL/TLS接続を使用|ON|
|ユーザ名|token:[Channel Token]|

トピックには `[Channel名]/[resource名]`を設定する。

設定が正しく、beebotte に接続できる場合にはフローのデプロイ後、次のようにノードに *接続済* と表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32533/9336e0de-c7b3-0b89-2bf1-8b1f7b6f5e7c.png)

## 動作確認
さて、Beebotteからメッセージを受信する動作確認をするには、例えば、次のようなフローを作って、Beebotteのコンソールからメッセージを送信してみてNode-REDのデバッグコンソールでメッセージを観察してみれば良い。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32533/892bed46-d1bb-ab42-0f1e-60e56343121e.png)

## その後は…
ここまでできれば、あとは BeebotteのAPIをIFTTTから叩くなり、自分のプログラムからメッセージを送れば、手元で動いているRaspberry Pi等で稼働する Node-REDでメッセージをリアルタイムで受信することができる。

自宅で使う場合でも、**機器やサーバをインターネット側に晒さなくてもリアルタイムにメッセージを受けられる**ところがよい。

受けたメッセージの内容によりNode-REDのフローで様々な処理を実行することもできる。
例えば、家電のリモコンの赤外線信号を出力できれば、ホームオートメーションも可能だろう。
Google Homeからの音声入力で電灯のON/OFFができるだけでも実際やってみると結構便利だったりする。
Salesforce Sales Cloud 開発者アカウント、および、セキュリティトークン取得方法

# はじめに

Salesforce Sales Cloud 開発者アカウントの取得方法とAPIアクセスに必要なセキュリティトークンを取得方法について記載します。

# Salesforce Sales Cloud 開発者アカウント取得

Salesforceには、無償で利用できるライセンスとして「30日間の無償評価版」と、「開発者ライセンス」の２種類があります。「30日間の無償評価版」は、APIの利用制限があるので、本手順では「開発者ライセンス」を取得します。

[こちらのリンク](https://developer.salesforce.com/signup)からご登録ください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/8371dbdc-7766-5325-e3a1-f516dccdcb81.png)

登録したら以下の情報が必要となるので、手元に控えておいてください。

- ユーザID
- パスワード

ブラウザからSalesforce Sales Cloudの画面にログイン出来ることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/293daecc-b055-01ef-93b8-e264bf241a58.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/a4ea9032-6ee3-861b-8197-fede65a73948.png)

# セキュリティトークン取得

Lightningホーム（Salesforce Classic画面でも同じ）画面右上のユーザアイコンの「設定」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/06af3a6d-7ada-c017-c2d0-17bdbd2c6827.png)

左側のメニューバーより「私のセキュリティトークンのリセット」を選択して、リセットボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/30167697-b54f-a15e-0779-d0d258e5f3b9.png)

登録したメールにセキュリティトークンが記載されたメールが届くので本トークン文字列をユーザID・パスワードと併せて控えておいてください。

# まとめ

Salesforce Sales Cloud 評価版・開発者アカウントを取得して、APIアクセスに必要なセキュリティトークンを取得できました。
Phalcon 「Action was not found on handler Controller」の一般的な対応方法

```php
$di->set('dispatcher', function () {

    $em = new \Phalcon\Events\Manager();

    $em->attach("dispatch", function ($event, $dispatcher, $exception) {
        // controller or action doesn't exist
        if ($event->getType() == 'beforeException') {
            switch ($exception->getCode()) {
                case \Phalcon\Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:
                case \Phalcon\Dispatcher::EXCEPTION_ACTION_NOT_FOUND:
                    $dispatcher->forward(array(
                        'controller' => 'index',
                        'action' => 'route404'
                    ));
                    return false;
            }
        }
    });

    $dispatcher = new \Phalcon\Mvc\Dispatcher();
    // Set default namespace
    $dispatcher->setDefaultNamespace("Your\Controllers");

    $dispatcher->setEventsManager($em);

    return $dispatcher;
});
```

```php:IndexController.php
namespace Your\Controllers;

class IndexController {

    public function route404Action()
    {
    }

}
```
history コマンド結果の表示変更（日付表示、除外コマンド設定）とサジェスト検索方法

history コマンドが、さらに使いやすくなるコマンドを知りました。

## history コマンド結果に日付を表示させる

### 設定

```
$ echo "HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '" >> ~/.bashrc
$ source ~/.bashrc
```
### 確認

```
$ history 10
  513  18/01/11 13:24:09 echo "HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '" >> ~/.bashrc
  514  18/01/11 13:24:10 vi ~/.bashrc
  515  18/01/11 13:24:23 source ~/.bashrc
  516  18/01/11 13:24:27 history 10
```

### historyコマンド結果のサイズを変更する

＊Macの初期値は、「500」になっていました

```
$ echo "HISTSIZE=10000" >> ~/.bashrc
$ source ~/.bashrc
```

### 特定のコマンドはhistoryコマンド結果に表示しない

```
$ echo "HISTIGNORE='ls*:history*'" >> ~/.bashrc
$ source ~/.bashrc
```

ls で始まるコマンドとhistory で始まるコマンドは、
historyコマンド結果に表示されなくなりました。

### サジェスト機能で、コマンド履歴検索を行う

「ctrl　＋　r」 をクリック

下記の表示がされたら、検索キーワードを入力する

```
(reverse-i-search)`': 
```

＊これまでは、検索機能を知らず、「history | grep cat」のように検索していました。。
めんどうなSQLをシェルスクリプトで自動化し、csvで書き出す

## はじめに
- 繰り返しSQL打つのは手間
- しかも、csvに書き出してゴニョゴニョするかもなー... って人のために

## やってること
1. SQLを叩き
2. CSVで確認するために、カンマ区切りにし
3. Fileに書き出す!


```shell:create_csv.sh

echo "start sql!"
output_path="/home/banaoh/Development/exp/" #任意のPath

for motion_id in 0 1 2 3 4 5 6 7
do
  for side_id in 0 1 2
  do
    mysql -u <user_name> <使用するデータベース名> -e
    # 1. sqlの発行
    "select *
     from <テーブル名> as t
     where motion_id = ${motion_id} and side_id = ${side_id}"
    # 2. カンマ区切りにする
     | sed -e "s/\t/,/g"
    # 3. csv fileに書き出し
     > "${output_path}${motion_id}_${side_id}.csv" 
  
    echo "Current output file is ${output_path}${motion_id}_${side_id}.csv"
  done
done

echo "end sql!"
```

## 使ってみる

```shell-session

banaoh@ubuntu:~$ sh create_csv.sh
start sql!
Current output file is/home/banaoh/Development/exp/0_0.csv
Current output file is/home/banaoh/Development/exp/0_1.csv
Current output file is/home/banaoh/Development/exp/0_2.csv
Current output file is/home/banaoh/Development/exp/1_0.csv
Current output file is/home/banaoh/Development/exp/1_1.csv
Current output file is/home/banaoh/Development/exp/1_2.csv
Current output file is/home/banaoh/Development/exp/2_0.csv
Current output file is/home/banaoh/Development/exp/2_1.csv
Current output file is/home/banaoh/Development/exp/2_2.csv
Current output file is/home/banaoh/Development/exp/3_0.csv
Current output file is/home/banaoh/Development/exp/3_1.csv
Current output file is/home/banaoh/Development/exp/3_2.csv
Current output file is/home/banaoh/Development/exp/4_0.csv
Current output file is/home/banaoh/Development/exp/4_1.csv
Current output file is/home/banaoh/Development/exp/4_2.csv
Current output file is/home/banaoh/Development/exp/5_0.csv
Current output file is/home/banaoh/Development/exp/5_1.csv
Current output file is/home/banaoh/Development/exp/5_2.csv
Current output file is/home/banaoh/Development/exp/6_0.csv
Current output file is/home/banaoh/Development/exp/6_1.csv
Current output file is/home/banaoh/Development/exp/6_2.csv
Current output file is/home/banaoh/Development/exp/7_0.csv
Current output file is/home/banaoh/Development/exp/7_1.csv
Current output file is/home/banaoh/Development/exp/7_2.csv
end sql!
banaoh@ubuntu:~$
```
bash：変数への代入の仕方＆ファイルの中身を取得する方法備忘録

# 変数
## コード
```bash:test.sh
#!/bin/bash

var="hello world"

echo "${var}"

```
## 実行
```
$ bash ./test.sh
hello world
```





# ファイルの中身を取得する


## 読み込むファイル
```json:test.json
{
  "test1":1,
  "test2":2,
  "test3":3
}
```

## コード
```bash:test.sh
#!/bin/bash

var=`cat test.json`

echo "${var}"
```



## 実行
```
$ bash ./test.sh
{
  "test1":1,
  "test2":2,
  "test3":3
}
```
UbuntuでopenFrameworksが動かないときは、Dockerを使おう

# はじめに
ubuntuでopenFrameworksを動かすのに非常に手間取りました。
エラーになりうる原因は、
Ubuntu, oF, cuda, cudnn, gcc, boost... などなどのバージョンが合っていないためで、
多すぎます。

イライラしてやる気が失せ始めたら、dockerを使ってみましょう。

# 前提
- nvidia-dockerが動く  

参照: [Ubuntu 16.04 LTS で NVIDIA Docker を使ってみる](http://blog.amedama.jp/entry/2017/04/03/235901)

# openFrameworksのサンプルを動かしてみる
$で始まる行はローカル環境、
\#で始まる行はdocker環境とします。

このとき、以下のコマンドを打つだけで動くはずです。

```
$ sudo docker pull ryokomy/openframeworks-cuda
$ xhost +
$ xhost local:
$ sudo nvidia-docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged ryokomy/openframeworks-cuda bash

# cd /root/src/openFrameworks/examples/gl/shaderExample
# make
# make run
```

[![https://gyazo.com/55536b2b559591e38a31004848de49ed](https://i.gyazo.com/55536b2b559591e38a31004848de49ed.png)](https://gyazo.com/55536b2b559591e38a31004848de49ed)

参照: [Dockerコンテナの中でGUIアプリケーションを起動させる](https://unskilled.site/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%B8%AD%E3%81%A7gui%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B/)


# 終わりに
今回openFrameworksを動かしたdocker内の環境は以下のようになっています。
- OS: Ubuntu14.04
- openFrameworks: 0.9.8
- Cuda: 8.0
- cudnn: 5
もしみなさんの環境ですぐに動いてくれたのなら幸いです。
【初心者でもできる！】Solidityの文字列結合とRemix-Solidityの使い方

「Solidityで文字列結合ができない！？」
と、悩まれる方多いのではないでしょうか？

ライブラリを使用することで、初心者でも簡単に文字列結合をすることができます。
日本語の記事が無かったので書いてみようと思いました。

英語ですが、下記のページに詳細が書いてあります。
https://github.com/Arachnid/solidity-stringutils

では早速見てみましょう。
３つの文字列を結合するサンプルです。

```sample.sol
import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract Solidity {
  using strings for *;
  string public s;
  string public ss;

  function foo(string s1, string s2, string s3) {
    s = s1.toSlice().concat(s2.toSlice());
    ss = s.toSlice().concat(s3.toSlice());
  }
}
```

このコードを、統合開発環境のRemix-Solidityで試してみたいと思います。
ついでなので、丁寧にRemix-Solidityの使い方も画像と一緒に説明していきます。
[Remix−Solidity](https://remix.ethereum.org/#optimize=false&version=soljson-v0.4.19+commit.c4cbbb05.js)

<img width="985" alt="スクリーンショット 2018-01-11 20.25.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/206431/90f6a269-d44b-d552-b800-b556c31900c8.png">

上記のような画面になったと思います。
そしたら、右側のEnvironmentをJavaScript VMに変えます。

<img width="845" alt="スクリーンショット 2018-01-11 20.28.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/206431/1137af1d-9898-eb0e-e437-2287c36a09b3.png">

そのあと、右側のCreateをクリックします。
<img width="982" alt="スクリーンショット 2018-01-11 20.31.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/206431/f6d18980-bb0f-74bd-8da8-c6131f1bcee9.png">

foo関数に結合したい文字を３つ入れます。
今回、`"Hello ", "World ", "Solidity"`といれてみます。

<img width="878" alt="スクリーンショット 2018-01-11 20.35.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/206431/848b9196-e9f8-847c-8498-6037d11607c2.png">

結合できました！

##参照元

https://github.com/Arachnid/solidity-stringutils
https://stackoverflow.com/questions/32157648/string-concatenation-in-solidity
Redux Devtools Extensionを使った時のこの感動を伝えたい

Reduxというものを知って、さらにこのツールに出会った時に感動したので、ぜひ伝えたいと思います。

## Reduxについて
色々解説してくれてますので、それを参考にしてください。  
https://qiita.com/kiita312/items/49a1f03445b19cf407b7

ようはUIの状態を管理するフレームワークだそうです。

## Redux Devtools Extensionについて
Reduxアプリの開発ツールの一つで、
ブラウザの拡張機能からReduxの状態管理を可視化してくれます。

https://github.com/zalmoxisus/redux-devtools-extension

chromeやfirefoxで使えるようです。

## デモ
![redux.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/52622/5fde856c-9123-11ab-00f9-621342a03f89.gif)



## 何がいいのか？

### 1. デバッグが便利
どのアクションでどの状態になり、どんな値を持つのか一発でわかります。
状態遷移後の値の差分もみれたりします。


### 2. テストでも活躍するかも
テスト時にバグを発見した場合、そのバグを開発者側で再現したい時があります。  
このツールを使うと、状態遷移をリプレイしたり、エクスポート/インポートできます。  
テスターが自分が実行した状態遷移データを、開発者に渡して、開発者側でそのエラーを再現して確認することができます。

## インストール
Chromeだったら、[Chrome Web Store] (https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd) でインストールできます。

詳しくは以下で、
https://github.com/zalmoxisus/redux-devtools-extension

## 使ってみる
Reduxのサンプルで用意されている、Todoアプリにセットアップしてみましょう。

### Todoサンプルを用意

```
git clone https://github.com/reactjs/redux.git
cd redux/examples/todos
npm install
npm start
```

ブラウザで `localhost:3000` にアクセスするとTodoアプリが起動します。


### セットアップ

`/src/index.js` をちょっと編集するだけでいけます。

``` /src/index.js
import React from 'react'
import { render } from 'react-dom'
import { createStore, compose } from 'redux'
import { Provider } from 'react-redux'
import App from './components/App'
import reducer from './reducers'

const store = createStore(
  reducer,
  compose(
    process.env.NODE_ENV === 'development' && window.devToolsExtension ? window.devToolsExtension() : f => f
  )
)

render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)

```

### 確認してみる

Todoアプリを開いている状態で開発者ツールを開いて `Redux` を選択すると、見れます。

## 使ってみた感想
Redux Devtools Extensionを導入したことで、データの流れが追いやすくなり、
開発効率が上がった気がします。

テスト時にも導入することで、もしかしたらバグの原因の早期発見につながるかもしれないので、機会があれば使ってみたいです。
親クラスから子クラスを操作しようと頑張ってみた

:::note warn
この記事はQiitaの下書きに放置していた記事の一つですが、久しぶりにタイトルを読むと何がしたいのか分からなかったため、残っている内容から頑張って読み解いて意訳しています。
:::

▶️オブジェクト指向を教える時にタイトルのような相談を受けるので、本気で考えてみようと思います。
▶️結論から言うと、is aとhas aをきちんと理解してないとこういう発想になってしまうんだろうな、と反省しきりです。

## やりたいこと
- Baseクラスで宣言したものをそれぞれのクラス間で使えるようにしたい
- 親クラスで子クラスを管理したい
  - ▶️そもそもこのアプローチが既に設計レベルで問題です。呼び出し元で管理すべきです。
  - 【未検証】Javaでいうstaticな配列フィールドをBaseクラスに作ってBaseクラス型で宣言しておき、子クラスのコンストラクタで参照先アドレスを渡すとか、運用対処でインスタンス化した後に必ず実行するメソッド（セッター）を決めてそちらから格納するとか？

ちょっと考えてみました。

## クラスの中にクラスを作ってみる方法
コードが古い上に意味があると思えないので、興味があればどうぞ。

<details>
<summary>展開</summary>

今回はPython2系で。

``` inbound_class.py
class Base:
  def __init__(self, arg):
    self.arg = arg
    self.hoge = self.Hoge(arg)
    self.fuga = self.Fuga(arg)

  def print_classname(self, string)
    print self.arg, string

  class Hoge:
    __hoge_var = 'hoge'
    def __init__(self, arg):
      self.arg = arg
    def print_classname(self)
      print self.arg + __hoge_var

  class Fuga:
    __fuga_tuple = ['fuga']
    def __init__(self, arg):
      self.arg = arg
    def print_classname(self)
      print self.arg + __fuga_tuple[0]

print Base('test').hoge.print_classname()

### クラスを継承する方法

``` inheritance.py
class Base:
  def __init__(self, arg):
    self.arg = arg
    self.hoge = self.Hoge(arg)
    self.fuga = self.Fuga(arg)

class Hoge(Base):
  __hoge_var = 'hoge'
  def __init__(self, arg):
    self.arg = arg
  def print_classname(self)
    super().print_classname(self.arg + __hoge_var)

class Fuga(Base):
  __fuga_tuple = ['fuga']
  def __init__(self, arg):
    super().__init__(arg)
  def print_classname(self):
    super().print_classname(self.arg + __fuga_tuple[0])

print Base('test').hoge.print_classname()
```

## 課題
なんとなくやりたい事が伝わればいいんですが、要は同じ要素をそれぞれの子クラスに入れるんじゃなくて、親クラスに入れて子クラスからもそれぞれに呼べるようにしたい、と。
そういう話なんですが、こういう事をやる場合はdefだと上位の階層に変数を定義するとか、classだとselfとかが使えますね。

とはいうものの、上記コードはエラーになります。
正直、この辺り（やりたい事は上記、ただし実装をどうすれば良いか、よく分からなかっていない）でいつもdefをネストして作っています。
defのネストも好きじゃないのでやりたくないんですが、こちらの方が直感的というか、とりあえず動くものが出来るんで扱いやすいんですよね。
このコードもclassをdefに変えてメソッドのselfを消したら期待した通りに動くものになります。
defでネストしまくればやりたい事は実現できていますが、あまりにもスマートからかけ離れていることと、見やすくするためだけにdefを使っている面があるので、あんまり良い使い方・作り方ではありません。

</details>

## 伝えたいこと（当時を振り返っての反省）
そもそも親クラスを子クラスで管理する、というアプローチの目的が分からないのですが、当時superクラス・subクラスという表現の関係性をparentクラス、childクラスという名前で作成していたからこのような混乱が発生してしまったのかな、という印象です。
人間的な発想だと親が子供を知らないのはおかしいでしょ、というのでなんか質疑応答していた記憶がぼんやりとありますが、結局のところクラスを継承して使う目的が管理ではなくて拡張なので、クラスを人ではなく設計図として認識できるように指導していればこんな話にはならなかったのかもしれません。
リモート先ディレクトリの存在を判定する

# やり方

```bash
USER=<Your SSH user>
IP=<Your IP>
PATH=<Your target dir path> # ~は使えない

if [ $(ssh $UESR@$IP "[ -d $PATH ];echo \$?") -eq 0 ]; then
    echo "exist"
else
    echo "nowhere"
fi
```

elseの処理がいらないのであれば、ワンラインで以下の方に記述もできます。

```bash
[ $(ssh $UESR@$IP "[ -d $PATH ];echo \$?") -eq 0 ] && echo "exist"
```

## 注意点
コメントでも記載したように、ディレクトリのパスに`~`が使えません。というもの、`$()`でコマンドを包括する際に、`~`をリモートではなくローカル側のパスに変換してしまうようです。

このあたりをスマートにできればいいんですが、気力が尽きました。
個人用Local Redmineのバックアップコマンド

Bitnamiでほいほいとローカルインストールしたredmineのバックアップ方法です。

スモールスタートしたものの、バックアップなしは怖い、に対処する程度です。

# 元となるbatファイル

redmineフォルダにあるuse_redmine.batファイルを複製して改造します。（私はDドライブにインスコ）

```winbatch
@echo off
CALL "D:\Bitnami\REDMIN~1.3-1\scripts\setenv.bat"
D:
cd "D:\Bitnami\redmine-3.4.3-1"
START "Bitnami Redmine Stack Environment" cmd
```

# mysqlをコピーする

[Redmine JP:データのバックアップ方法](http://redmine.jp/faq/system_management/backup/)

```winbatch
mysqldump -u MySQLユーザー名 -pMySQLパスワード Redmineデータベース名 > データ出力先ファイル名
```

* テーブルロックを掛けずにバックアップ

[http://blog.seeds-std.co.jp/entry/3405.html](http://blog.seeds-std.co.jp/entry/3405.html)

バックアップ中に更新が掛かって整合性が壊れないように、innodbで使える--single-transactionオプションを指定します。
現行bitnamiではすべてのテーブルがinnodbになっていることは確認しました。
（[MySQLサーバのストレージエンジン確認方法](https://qiita.com/jinnai73/items/e1bb8d7c82498175e311)）

* Mysqlパスワードの確認（[windowsでRedmine (bitnami) バックアップとリストア](http://manbou404.blogspot.jp/2014/03/windowsredmine-bitnami.html)）

```
{インスコフォルダ}\apps\redmine\htdocs\config\database.yml
production:
  adapter: mysql2
  database: bitnami_redmine
  host: 127.0.0.1
  username: bitnami     ← ユーザ名
  password: XXXXXXXX    ← パスワード
  encoding: utf8
```


# 添付ファイルの保管フォルダを階層ごと保存する

[robocopyを使って差分コピーをする方法](http://komitsudo.blog70.fc2.com/blog-entry-174.html)

* 高度なコピーを実現してくれるrobocopyコマンド
* オプション
    * /MIR　ブランクフォルダも含めて階層ごとミラーリングコピー（コピー元に存在しないファイルはコピー先から削除）
    * /XA:SH　指定した属性のファイルを対象から除外（S:システム、H：隠し）
    * /XO　古いファイルを対象から除外

# 最終物

```winbatch
@echo off
CALL "D:\Bitnami\REDMIN~1.3-1\scripts\setenv.bat"
D:
cd "D:\Bitnami\redmine-3.4.3-1"
mysqldump -x -u bitnami -pXXXXXXXXX --single-transaction bitnami_redmine > d:\redmine_backup\mysqldump
Robocopy .\apps\redmine\htdocs\files\ d:\redmine_backup\files\ /MIR /XA:SH /XO
pause
exit
```
技術者のための、10分で判るブロックチェーン技術の説明

これを読むには、以下の技術の概要を理解している必要があります。

- ハッシュ関数

## 1. ブロックチェーンとはなんですか？
以下のような形式で保存されたデータです。
たとえばビットコインでは、ブロックチェーンの中に「誰が誰にコインを譲渡したか」といったデータを保存しています。

	(ブロック1)
	任意データのかたまり

	(ブロック2)
	任意データのかたまり＋ブロック1のハッシュ値

	(ブロック3)
	任意データのかたまり＋ブロック2のハッシュ値

	(ブロック4)
	任意データのかたまり＋ブロック3のハッシュ値

	　：


## 2. なぜブロックチェーンに保存されたデータは改ざんできないのですか？
改ざんできないのではなく、「改ざんを検出できる」のです。
あるブロックを改ざんすると、ブロックから算出したハッシュ値と、次のブロックに含まれるハッシュ値が一致しなくなります。

ハッシュ値が一致するように次ブロックも改ざんすると、今度は次ブロックの算出ハッシュ値と、次次ブロックに含まれるハッシュ値が一致しなくなります。


## 3. 改ざんしたブロック以降の全ブロックを改ざんすれば、改ざん検出ができないのでは？
その通りです。
そこでブロックチェーン技術では、ブロックを自由には作成できなくなる仕様が入れられています。
例えば、ビットコインの場合は10分程度の計算をしなければブロックを作成できません。


## 4. しかし、時間をかければ改ざんができるのでは？
その通りです。
そこでブロックチェーン技術では以下の仕様でその問題を回避しています。
・24時間365日、常に新しいブロックを追加し続けている
・最も多くのブロックを含むブロックチェーンを正しいデータだと判定する

長い時間をかけて改ざんしたデータを作っても、それは正しいデータだと判定されないため改ざんは失敗します。


## 5. 誰が、どのような目的で、常に新しいブロックを作成し続けるのですか？
それはブロックチェーン技術の実装ごとに異なります。
ビットコインを始めとした多くの実装では、新しいブロックを作成することである量のコインが生成され、ブロックの作成者がその所有権を得られるよう仕様が決まっています。
そのため、不特定多数の人が、コインを入手したいという目的で、ブロックを作成し続けます。
アロー関数の簡潔文体とブロック文体の違いに手間取った

# 事の発端
関数ポインタを使用する以下のコードを実行。
しかし、実行結果が変数に入らない。
以下、その時のコードをかなり簡略化したもの。

```javascript
const validate = {
  isNotEmpty: {引数が空かどうかチェックし、Booleanを返す。}
}

const hoge = {
  validate: {
    logic: (v) => { validate.isNotEmpty(v); }
  }
}

const value = 'input_value';
const validateFunc = hoge.validate.logic;
const isValid = validateFunc(value);

console.log(isValid); // なぜかundefined!!
```


# 原因
`validate.isNotEmpty(v)` の戻り値が`return`されていなかったため。
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions#Function_body)を参照すると、どうやらブロック文体では明示的に`return`を記述して上げないと実行結果が`return`されないらしい。
そこで、コードを以下のように変更して見た。

```javascript
const validate = {
  isNotEmpty: {引数が空かどうかチェックし、Booleanを返す。}
}

const hoge = {
  validate: {
    logic: (v) => { return validate.isNotEmpty(v); }
  }
}

const validateFunc = hoge.validate.logic;
const isValid1 = validateFunc('input_value');
const isValid2 = validateFunc('');

console.log(isValid1); // true
console.log(isValid2); // false
```

これで動作するようになったが、この書き方はESLintに引っかかる。
正しくは以下。

```javascript
const validate = {
  isNotEmpty: {引数が空かどうかチェックし、Booleanを返す。}
}

const hoge = {
  validate: {
    logic: (v) => validate.isNotEmpty(v)
  }
}

const validateFunc = hoge.validate.logic;
const isValid1 = validateFunc('input_value');
const isValid2 = validateFunc('');

console.log(isValid1); // true
console.log(isValid2); // false
```

# 感想
アロー関数はしょっちゅう使用しているので、この仕様は把握していた。
しかし、ブロック文体の中で関数を実行すれば必ず戻り値を返すだろうという謎の思い込みがあって悩む結果となった。
仕様を把握した気になっていただけで、本当は把握できていなかったのだと認識できた。
まだまだ勉強が足りないと感じました。
kintone評価版アカウント取得、および、サンプルアプリケーションの作成方法

# はじめに

kintone 評価版アカウントの取得方法とアプリテンプレートを利用してUIからデータを登録する手順です。

# kintone無償アカウント取得

kintoneには、無償で利用できるライセンスとして、３０日間であれば制限なく利用できる「30日間の無償評価版」と、利用用途やユーザ数に制限がある「開発者ライセンス」の２種類があります。違い、および、開発者ライセンスの取得方法の詳細についてはサイボウズ社のスライドに詳細の記載があるのでこちらをご覧ください。

- [kintone 開発者ライセンスの取得](https://www.slideshare.net/kintone-papers/kintone-66244855)

30日間の無償評価版だと、アプリ内にテスト用のデータも含まれているので、今回はこちらの「30日間の無償評価版」を利用します。こちらのリンクからご登録ください。

- [5分でできる! 30日間無料お試し](https://www.cybozu.com/jp/service/com/trial/)

登録したら以下の情報が必要となるので、手元に控えておいてください。

- kintoneのサブドメイン　（例：https://<font color="Red">****</font>.cybozu.com　の赤文字部分）
- ユーザID
- パスワード

ブラウザからkintoneの画面にログイン出来ることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/502112fd-f407-780e-623e-4c545bba2062.png)

# 営業支援パック アプリケーションの作成

ポータル画面「アプリ」の「＋」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/96e354cd-7c1e-426d-1282-a0e4bcb69bad.png)

営業支援パックを選択して追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/9a098f79-107a-d7d9-a11c-a3b8d6f7e7a9.png)

「活動履歴（営業支援パック）」「顧客管理（営業支援パック）」「案件管理（営業支援パック）」アプリが追加されたことを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/f354a6f5-f176-2d5b-3e61-8eaa96fe95bf.png)

各アプリを開き、サンプルデータが格納されていることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/87506472-7b4b-015c-1a94-2d40ec371193.png)

# まとめ

kintoneの評価版アカウントの取得して、ノンプログラミングでテンプレートからアプリケーションを作成しました。
Macにpython3系をインストール

新しいMacにpython3をインストールする機会があったので、
備忘録としてインストールの仕方を残しておきます。

python3は特殊な設定は不要で、とても簡単にインストールできます。


###今回実行した環境
MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)
OSバージョン： 10.13.2

###状況確認
Macはデフォルトだと、python2系が入っています。
自分の環境では、pythonコマンドを打つと、Python 2.7.10が起動しました。

```
$ python
Python 2.7.10 (default, Jul 15 2017, 17:16:57) 
```

この時点で、python3とコマンドを打っても、起動はしません。

###インストール手順
python3を以下のサイトでダウンロードします。
https://www.python.org/downloads/

<img width="1129" alt="スクリーンショット 2018-01-11 17.39.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/8222/75455258-a05f-e21b-80f3-43f6b42c8a15.png">

ダウンロードしたパッケージインストーラを起動して、インストールを進めます。

インストール完了後に、ターミナルでpython3コマンドをたたくと以下のようにpython3が起動します。

```
$ python3
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) 
```

python3が起動すれば、インストール完了です！！

ちなみにpython3をインストールしてもpython2系が消えるわけではないので、
pythonとコマンドをたたけば、pythonが2系で起動します。

あとは、Pycharmとかpython向けIDEを入れると楽しくコーディングできます。
https://www.jetbrains.com/pycharm/

ちょっと短いですが、今日はここまで。
プールマイニングサーバーのyiimpをUbuntu 14.04にインストールするためのアレコレ

プールマイニングサーバーのyiimpを**Ubuntu 14.04**にインストールしてプールマイニングサーバー([バーチャル夕張](http://vyuubari.com/))を立てた時のメモ

---

* [yiimp_install_scrypt](https://github.com/coelacanthus/yiimp_install_scrypt)をclone

[元](https://github.com/xavatar/yiimp_install_scrypt)はUbuntu 16.04用なのでforkして改造しています。

```
	git clone https://github.com/coelacanthus/yiimp_install_scrypt
```

* Ubuntu 14.04にPHP7.0をインストールする準備

```
	# add-apt-repositoryするのに必要
	sudo apt-get install software-properties-common
	# 野良パッケージを配布してくださってるリポジトリを追加
	sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
```

* nginxの最新版をインストール([参考](https://qiita.com/hiroq/items/420424bc500d89fd1cc8))

```
	sudo ./install-latest-nginx.sh
```

* yiimpのインストール

```
	./install.sh
```

* マイニングを行う通貨のアルゴリズムを設定

```bash:stratum.py
	# 以下の部分を目的のアルゴリズムの識別子の配列に変更する
	algos = ['lyra2v2', 'neo']
```

* yiimpd.pyとstratumd.pyをUpstartデーモンとして登録する

```
	sudo cp yiimpd.conf /etc/init/
	sudo cp stratumd.conf /etc/init/
```
```text:/etc/init/yiimpd.conf
	# yiimpd.pyがあるパスに修正する
	chdir /path/to/yiimp_install_scrypt
```
```
	# 設定のリロード 
	sudo initctl reload-configuration
```


* yiimpd、stratumdの起動と終了

```text:起動
	sudo initctl start yiimpd
	sudo initctl start stratumd
```
```text:終了
	sudo initctl stop yiimpd
	sudo initctl stop stratumd
```

---

yiimpの設定やプールに必要なコインデーモンの導入などは、それぞれのドキュメントを参照してください。

Bitcoin: 1PGrE58W6921iVNTMFPAQGBsiHTx7WmdY2
自分用のコイン（トークン）を作成して、別のユーザーに渡す（ethereum8）


前回はこちら。[スマートコントラクト開発で知っておくべきことのメモ](http://qiita.com/joji/items/a822596ec5cae0a491ca "スマートコントラクト開発で知っておくべきことのメモ")

ブロックチェーンでは「トークン(token)」という言葉がよく使われています。トークンとは、証拠、 記念品、代用貨幣、引換券、商品券などの意味を持つ英単語です。ブロックチェーンのトークンとは、基本 ビットコインや Ether と同様に、アカウントに紐づいて管理され、任意の量を任意のアカウントへ転送 的な できるもので、通貨よりも抽象的な概念となります。

```
pragma solidity ^0.4.8;

contract OreOreCoin {
    //トークンの名前
    string public name;
    //トークンの単位
    string public symbol;
    //小数点以下の桁数
    uint8 public decimals;
    //トークンの総量
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;
    //イベント通知
    event Transfer(address indexed from, address indexed to, uint256 value);
    
    //コンストラクタ
    function OreOreCoin(uint256 _supply, string _name, string _symbol, uint8 _decimals){
        balanceOf[msg.sender] = _supply;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _supply;
    }
    //送金
    function transfer(address _to, uint256 _value){
        if (balanceOf[msg.sender] < _value) throw;
        if (balanceOf[_to] + _value < balanceOf[_to]) throw;
        
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        
        Transfer(msg.sender, _to, _value);
    }
}
```

ブラウザから作成
コンストラクタに下記の値を入力

```
10000, "OreOreCoin", "oc", 0
```

![スクリーンショット 2018-01-09 19.26.35.png](https://qiita-image-store.s3.amazonaws.com/0/39073/4915261c-b1d1-3a7f-7dfe-dfa93517c3bd.png "スクリーンショット 2018-01-09 19.26.35.png")

balanceOfに、起動時に指定したユーザーAのアドレスを入力してボタンを押下すると、10000という値が表示されます。

![スクリーンショット 2018-01-09 19.42.47.png](https://qiita-image-store.s3.amazonaws.com/0/39073/1680a2fa-71d7-0008-c51d-d450971a118b.png "スクリーンショット 2018-01-09 19.42.47.png")

次に別のユーザーBのアドレスを入力してbalanceOfを入力すると「0」であることが確認できます。

![スクリーンショット 2018-01-11 18.49.45.png](https://qiita-image-store.s3.amazonaws.com/0/39073/1da6a5e5-7064-7ddf-a979-243fb7db7f4a.png "スクリーンショット 2018-01-11 18.49.45.png")

起動時に指定したユーザーからユーザーBにお金を移動させます。
この値をtransferに入力しました。addressは自分の環境に書き換えて下さい。

```
"0x32a39ca8fd074a9c1e49b77b6613ca5287592305", 2000
```
![スクリーンショット 2018-01-11 18.54.13.png](https://qiita-image-store.s3.amazonaws.com/0/39073/bd628823-fdf6-3380-60b7-7439ddb243b7.png "スクリーンショット 2018-01-11 18.54.13.png")

改めてbalanceOfをチェックします。
今回は2000が表示されました。
![スクリーンショット 2018-01-11 18.55.26.png](https://qiita-image-store.s3.amazonaws.com/0/39073/e37c854b-ae1f-7c11-85ac-270ccdb3ffd9.png "スクリーンショット 2018-01-11 18.55.26.png")

ユーザーAの方は8000になっています。
![スクリーンショット 2018-01-11 18.56.51.png](https://qiita-image-store.s3.amazonaws.com/0/39073/54a7ef05-31f8-2ce5-cb13-2ea76b0f300e.png "スクリーンショット 2018-01-11 18.56.51.png")
PPTPについて


## はじめに

15年振りだろうか・・・
久々に、ルータでインターネットVPNを設定する事になった。なので、15年振りにVPNについて復習をしてみた。

## PPTPについて

さて、インターネットVPNを構築するとなると、鉄板となるプロトコルは**IPsec**だと思っていた。だが、今回は、IPsecではなく、**PPTP**というプロトコルを使う事になる。
調べてみた。

PPTPもIPsecと同じ、インターネットVPNを張るためのプロトコルである事には違いない。何が違うのかといえば、

- IPsecは、**ネットワーク層**でカプセル化をするのに対し、
- PPTPは、**データリンク層**でカプセル化するプロトコルとなる

同じデータリンク層でカプセル化するプロトコルに**L2TP**というのもあるが、今回は割愛する。

PPTP,L2TPは共に、IPsecよりセキュリティが弱いのは明らか。
PPTPを利用するメリットはどこにあるのかは不明。たぶんない。

だが、１つあった。TCP/IPのレイヤが一つ下がる事により、IPsecよりネットワーク技術の敷居が低くなるらしい。なので、ネットワーク技術者の難易リスクを下げたいのであれば、PPTPを選択する事になる。エンドユーザーからしてみれば、どっちにしろ、インターネットVPNである事には違いはない。素直に喜んでおくべし。

さて、PPTPを聞いて、**PPP**プロトコルを連想してしまうのも無理はない。

PPTPはPPPの技術を使ってトンネリングする仕組みらしい。

ああ、もう、20年も前の話になるだろうか。ISDNって回線があった時代に、PAPとかCHAPとかいう認証方式があった気がする。そして、時代は移り変わり、ADSLってのが出てきた。んで、PPPoEってのが出てきた気がする。

PPTPにもCHAPに似た認証アルゴリズムがあるみたいで、**MS-CHAP**というのを使っている。MSってなんだ？と一瞬思ったが、嫌な予感は的中する。そう、MSとはつまりマイクロソフトの事。マイクロソフトが開発したんや！！

さて、VPNの復習。VPNの大きな技術は３つ。

1.認証
2.暗号化
3.カプセル化

基本的な手順は、IPsecもPPTPも同じらしい。違う点が、VPNトンネルの数。
PPTPは、１本のトンネルを作って、その中で送信と受信を行うのに対し、
IPsecは送信の時に１本トンネルを作って、受信の時はまた別のトンネルを作ってやりとりするらしい。この方がセキュリティ的にはよさげな気がするよな。エンドユーザーからしてみればどうでもいい話ではある。

PPTPは認証にPPPをパクっているが、IPsecはIKEという仕組みを使う。この辺のアルゴリズムは全然違う。PPPで必要な情報は、ユーザーIDとパスワード。ばれたら終わりだよ。そんで、PPTPはRC4という暗号化アルゴリズムを使って、カプセル化してGREというヘッダー情報を付加するみたいだ。

まあ、名称だけ覚えて置いて、コンフィグの設定事例を読んでみて「あっ、なんか聞いた事のある名称だな」と思い出せれば、それ程、焦る事はなくなるだろう。

つー事で、おしまい。
【JUnit】throw される例外をテストする

Java コードに対して JUnit で単体テストを書く際に、throw される例外をテストします。
調べたこと自体はかなり以前なんですが、少しの間フロントエンドに行ってたら、
戻ってきたときに「どうだっけ？」ってなってしまったので、備忘録としてまとめておきます。

### 検証環境
JUnit: 4.12

### 方法
以下の 2 つについて記載します。
1. `@Test` のオプション `expected` を使用して throw される例外クラスを指定する
2. `@Rule` で `ExpectedException` を指定して throw される例外などをテストメソッド内で指定する

### `@Test` のオプション `expected` を使用して throw される例外クラスを指定する
シンプルではあるものの、throw される例外クラスの検証のみにとどまります。
コードサンプルは以下の通りです。

```java
@Test(expected = IllegalArgumentException.class)
public void createAccountUserNameIsEmpty() {
    // followings are test-code should throw IllegalArgumentException
    // ...
}
```

オプション `expected` のコードに書いてありますが、メッセージなども検証するためには、
後述する `ExpectedException` を利用しましょう。Caused by な例外も検証できます。
Caused by な例外の検証については以下の記事に書かれています。
https://qiita.com/komiya_atsushi/items/082d6a71e475a613338a


### `@Rule` で `ExpectedException` を指定して throw される例外などをテストメソッド内で指定する
先に少しだけ触れましたが、throw される例外クラスだけではなく、例外メッセージも検証できます。
コードサンプルは以下の通りです。

```java
// usage より、必ず public にすること
// constructor が private であることから単に new することはできないため .none() によりオブジェクト生成する
// none() の意味するところは、テスト対象が必ずしも例外を投げるわけではない、ということの模様
@Rule
public ExpectedException expectedException = ExpectedException.none();

@Test
public void createAccountUserNameIsEmpty() {
    // 例外クラスの検証
    expectedException.expect(IllegalArgumentException.class);
    // 例外メッセージの検証
    expectedException.expectMessage("Failed to create an account; user name is empty.");
    // followings are test-code should throw IllegalArgumentException
    // ...
}
```


### 気になるけど調べてないこと
コードの説明文をしっかり読んでないという怠惰でもある……。
* `@Rule` とは何者か。`@Rule` を使いこなせば、より効率的にテストを書ける気がする
* `ExpectedException` は `TestRule` の実装クラスだが、`TestRule` とは何者か
Spectre 脆弱性について

## 投機実行とは

1990 年代までは、クロック数の増加によりプロセッサーの性能は、線形的に向上していた。

しかし 1995 年ごろともなると、光速度の限界など物理的な制約により、単純にクロックアップすれば性能が向上するという状況ではなくなってきた。

そこで、1 つの命令の実行完了時間が頭打ちになったとしても、1 つの命令を多くのステップに細分化し、それぞれのステップを並列で動作させることで、
単位時間当たりの命令実行数を向上させるという手法がとられるようになった。(スーパーパイプライン)

この手法の問題点としては、演算順序の依存性により、計算の完了していないデータを待たなければならないということがある。
その場合、計算が確定するまで、次の計算ができないので、その後の処理が一時停滞してしまい、性能に影響する。(パイプラインストール)

そのため、計算が確定しないデータがあったとしても、ある予測のもとに値を仮定し、継続する処理を実行するという手法が考案された。
その場合、計算が確定した段階で、予測が当たっていたらそのまま処理を続行し、間違っていたら、実行状態を元に戻すことになる。
これは予測が間違っていて、やり直すことがあるというリスクを許容して処理を行うということから、投機実行と呼ばれている。

予測が間違うことがあるにしても、計算リソースを遊ばせておくよりも処理効率が向上するので、現行のプロセッサーでは当たり前に実装されている。


## Spectre 脆弱性とは

一見して問題なさそうな以下のコードを考察してみよう。

```
array1 : [size_of_array1] uint8
array2 : [0x10000] uint8

x : uintptr

if x < size_of_array1 {
  y = array2[array1[x] * 0x100];
}
```

ここで、悪意ある実行者が x として array1 のサイズ範囲外の値を指定して、領域外読み取りを試みたとする。
論理的には、if 文の条件によって、サイズチェックが行われるため、if 節は実行されることはなく、事なきを得る。

しかしながら、投機実行の仕組みによって、if 条件が確定する前に、if 条件が真であると予測されて、

```
1) t := array1[x];
2) t = t * 0x100;
3) t = array2[t];
```

までが、投機的に実行されてしまうことあり得る。

その後、予測が誤りであることが判明すると、投機実行された計算は取り消しとなり、1) で読みだされた値は、闇に葬られるはず、であった。


ここで、現在のプロセッサーには、メモリーアクセスの性能を向上させるために、キャッシュメモリーが実装されていることを思いだしてみよう。

悪意ある実行者が、あらかじめ array2 のメモリー領域を、キャッシュから追い出していたとする。

投機実行によって、3) の操作が実行されると、array2 の特定の領域が読み込み操作によって、キャッシュメモリーに取り込まれることになる。


悪意ある実行者は、array2 の該当アドレスを順次読み取り、その読み込み速度の変化を観察することで、闇に葬られたはずの値を推定することが可能となる。


これが、

(投機的実行における)条件付き分岐における境界チェックの回避 "bounds check bypass" (CVE-2017-5753)

のあらましである。