OmniAICreator/Qiita-1.07M huggingface dataset:
kintone 電子回路シミュレータ

#kintone 電子回路シミュレータ

[SimcirJS ](https://kazuhikoarase.github.io/simcirjs/) というおもしろそうな電子回路シミュレータのライブラリを見つけましたので、早速、kintone アプリに組み込んでみました。

ドキュメントを見ても、あまりライブラリの使い方が載っていませんが、サンプルやソースを調べてみると Json データで管理していました。

そこで作成した電子回路データを取り出して、kintone のテキスト項目に格納するとうまく保存できました。
レコード複写すると、電子回路も複写されますので簡単にいろいろ変更を試すことができます。

SimcirJS は、作成した電子回路をさらに部品として登録して使うことができるようなので、その辺もkintone で制御出来れば複雑な回路も組めそうです。

SimcirJS と kintone は、なかなか相性がよさそうに思えます。

![2017-01-06_00h43_30.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5dd03c18-c406-655b-485d-8daabaa2c415.png)

#入力例 PushOn & Toggle

![2017-01-06_00h55_19.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/ac0bc916-f24e-0e48-9cf3-de9b809dbbc6.gif)

#4bit7seg 表示
トグルスイッチでLED表示
昔トグルスイッチで、パチパチして遊んでました。

![2017-01-06_10h48_43.png](https://qiita-image-store.s3.amazonaws.com/0/100572/2a223dc8-216e-6c25-8fcf-ccc2a3e66904.png)


#RS FF
R(Reset) S(Set) Flip Flop. シーソーのようにギッコンバッタンする仕組み。
In, Out 端子をつけておけば、部品登録するとそれが入出力端子になるらしい。

![2017-01-06_20h23_35.png](https://qiita-image-store.s3.amazonaws.com/0/100572/fa81eb0e-832e-8130-6b9c-065a40aab265.png)

「CTL+クリック」で設定内容をJSON形式で表示

![2017-01-06_20h28_31.png](https://qiita-image-store.s3.amazonaws.com/0/100572/8d402bce-e2a0-bfb4-d602-19288f190de5.png)


#Tool Box
ツールボックスに登録されている部品をダブルクリックすると、設定内容を表示できる。

下記は、登録されているRS FFの中身
![2017-01-06_20h25_05.png](https://qiita-image-store.s3.amazonaws.com/0/100572/3b274bd2-bc4d-f0ef-c09a-34cd0268d56e.png)


※下記に続きます。

- [kintone 電子回路シミュレータ ToolBoxをカスタマイズ](http://qiita.com/rex0220/items/9d3df382c2bb035036b8)
- [kintone 電子回路シミュレータ 部品オプション設定](http://qiita.com/rex0220/items/1447fb0cc27cf34173a4)
- [kintone 電子回路シミュレータ 10進カウンター作成](http://qiita.com/rex0220/items/36917057f6a6dc68f838)
- [kintone 電子回路シミュレータ ストップウオッチ作成](http://qiita.com/rex0220/items/3a09b0c59f381bfed795)
- [kintone 電子回路シミュレータ デジタル・ストレージ・オシロスコープ](http://qiita.com/rex0220/items/eef2f3938d751051c6b8)


#関連リンク

[コード描き 荒瀬 一彦 のウェブサイトへようこそ。](http://www.d-project.com/) 
　開発者様です。

[SimcirJS-T(タッチデバイス対応版SimcirJS)](http://www.hara.net.it-chiba.ac.jp/simcirjst/)
　AND(3in) など、いろいろ部品も拡張されています。
CordovaでGradleのバージョンが低いと怒られた


```
Minimum supported Gradle version is 2.14.1. Current version is 2.13. If using the gradle wrapper
```

こんな感じに怒られたらこのファイルを探す


$PROJECT_ROOT/platforms/android/cordova/lib/builders/GradleBuilder.js

この関数内の

```
GradleBuilder.prototype.prepEnv
```

こんな感じの行を探す

```
var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'http\\://services.gradle.org/distributions/gradle-2.2.1-all.zip';
```

指定のバージョンに書き換えて

```
cordova run android
```

でOK
【Ruby】Parallel.mapでno _dump_data is defined for〜のエラーが発生する原因と回避例

# 問題

Rubyで並行処理を扱うGemのParallelで表題のエラーが発生したので原因を探った。

当該コードは以下。

```
require 'parallel'

class Example
end

classes = [Example.new, Example.new]

dump_target = Proc.new{}

# no _dump data is defined for ~~が発生する
results = Parallel.map(classes, in_processes: 2) do |example|
  example.instance_variable_set(:@new_variable, dump_target)
  example
end
```

処理内容としてはParallel.mapをprocess形式で利用し、mapに渡したExample Classのインスタンスを並列実行する。

各プロセス内では渡されたインスタンスに新しくインスタンス変数を定義する。

この際、インスタンス変数の値としてProc.new{}をセットする。

最後にExampleのインスタンスを返し、resultsは各プロセスで並列実行した結果を配列で受け取る。

これが正しく実行されるとresultsは[#<Example:0x007fdb6b0a5548>, #<Example:0x007fdb6b0a5778>]のような値がセットされているはずだ。

しかし、このコードはno _dump_data is defined for Procというエラーが発生する。

# 原因

原因は、Parallelのlib/parallel.rb内にある下記メソッドにてMarshal.dumpするところ。

```
    def process_incoming_jobs(read, write, items, options, &block)
      while !read.eof?
        data = Marshal.load(read)
        item, index = items.unpack(data)
        result = begin
          call_with_index(item, index, options, &block)
        rescue StandardError => e
          ExceptionWrapper.new(e)
        end
        Marshal.dump(result, write)
      end
    end
```

この最後のMarshal.dumpの箇所が表題のエラーの原因。

Marshal.dumpの引数に渡っているresultが先のサンプルコードでいうところの各プロセス内のExampleのインスタンス。

このExampleのインスタンスに新しく追加したインスタンス変数の値がProc.new{}だが、これはMarshal.dumpで書き出しができないオブジェクトになっている。

[Marshal.dumpの公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/Marshal/m/dump.html)によると、

>
ファイルに書き出せないオブジェクトをファイルに書き出そうとすると 例外 TypeError が発生します。 ファイルに書き出せないオブジェクトは以下の通りです。

> ・名前のついてない Class/Module オブジェクト。(この場 合は、例外 ArgumentError が発生します。無名クラスについて は、Module.new を参照。)
・システムがオブジェクトの状態を保持するもの。具体的には以下のイン スタンス。Dir, File::Stat, IO とそのサブクラス File, Socket など。
・MatchData, Data, Method, UnboundMethod, Proc, Thread, ThreadGroup, Continuation のインスタンス。
・特異メソッドを定義したオブジェクト


とある。よってProc.newもこれにあたる。

# 解決法

もし、先のサンプルコードを正しく実行させるなら下記のようにインスタンス変数のcloneを作成する。

こうするとプロセス内で返り値にするインスタンスには変更がないのでエラーが発生しない。

```
results = Parallel.map(classes, in_processes: 2) do |example|
  _example = example.clone
  _example.instance_variable_set(:@new_variable, dump_target)
  example
end

results #=> [#<Example:0x007fdb6b0a5548>, #<Example:0x007fdb6b0a5778>]
```

# 実例

サンプルコードだと一体どこでこんなコード書くのかと疑問になると思うが、例えばPaperclipというファイルアップロードのための便利gemをParallelと利用しようとすると同様の問題にぶち当たる。

例えば下記のようなコード。ユーザーの既存のサムネイルに対して何か処理を加え、処理済みのモデルはそれを示すフラグのバルクアップデートをする場合。

```
User.find_in_batches do |users|
  results = Parallel.map(users, in_processes: 10) do |user|
    thumb_url = user.avatar.url
    
    # サムネイルに対して何か処理をする
    # ...
    # ...
    user.is_converted = 1
    user
  end
  # resultsのuserをバルクアップデートする処理
  # ...
end
```

このとき、user.avatar.urlを実行する箇所でPaperclipはuserに対してattachment_imageというインスタンス変数を定義する。

このattachment_imageはProcオブジェクトなので先のエラーが発生してしまう。


# 参考リンク

- [grosser/parallel](https://github.com/grosser/parallel)
- [thoughtbot/paperclip](https://github.com/thoughtbot/paperclip)
- [module function Marshal.#dump](https://docs.ruby-lang.org/ja/latest/method/Marshal/m/dump.html)
Lombokの@Builderでデフォルト値を指定する

## 追記(2017/9/10)
v1.16.16から``@Builder.Default``アノテーションを付与することでデフォルト値を指定できるようになりました。

```java
@Builder
public class Coupon {
    @Builder.Default
    private UUID id = UUID.randomUUID();
    private String name;
    private String description;
    private ZonedDateTime expireDate;
}
```

ちなみに、Spring Bootではv1.5.3で取り込まれたので、それ以前のものを使っている場合は、明示的にバージョンを指定する必要があります。

## 概要
Lombokの[@Builder](https://projectlombok.org/features/Builder.html)は、指定したクラスにbuilderクラスを自動生成するアノテーションである。

```java
@Value
@Builder
public class Coupon {
    private UUID id;
    private String name;
    private String description;
    private ZonedDateTime expireDate;
}
```

```java
Coupon coupon = Coupon.builder()
        .name("ビックリクーポン")
        .description("ビックリなクーポン")
        .expireDate(ZonedDateTime.parse("2017-01-30T23:59:59+09:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME))
        .build();
```

ただ、builderの呼び出しで値を指定しなかったプロパティは``null``になってしまう。
null以外のデフォルト値を設定しようと以下のように対象クラスに記述してもうまくいかない。

```java
@Value
@Builder
public class Coupon {
    private UUID id = UUID.randomUUID(); // 適用されない
    private String name = "";            // 適用されない
    private String description;
    private ZonedDateTime expireDate;
}
```

そこで、今回はデフォルト値を正しく設定する方法を紹介する。

## ``@Builder``のデフォルト値を設定する方法

デフォルト値を設定するには、以下のように``対象のクラス名+Builder``の命名規則でbuilderクラスを記述すればよい。あとは良しなにLombokが補完してくれる。

```java
@Value
@Builder
public class Coupon {
    private UUID id;
    private String name;
    private String description;
    private ZonedDateTime expireDate;

    public static class CouponBuilder {
        private UUID id = UUID.randomUUID();
        private String name = "";
    }
}
```

## 参考

- [@Builder](https://projectlombok.org/features/Builder.html)
- [Using Lombok’s @Builder annotation with default values](https://reinhard.codes/2016/07/13/using-lomboks-builder-annotation-with-default-values/)
一年分の自分のqiitaアカウントのgoogle analyticsをさらす

qiitaにgoogle analyticsをいれて大分たったので、一年でどのくらいになったかをさらしてみます。

# GAの画像

ページごとのビュー数をみています。（というか、それしかみていない）
2016-01-01 ~ 2017-01-04 の期間にしたときのが下記になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/a0bdd3d0-4b26-4f36-1cda-08c8b8458972.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/e7411e2f-50b9-d20c-ebb2-d670f174ee4e.png)

---

[Qiitaの投稿アクティビティをGitHubのように表示するヤツ](http://qiita.com/snaka/items/7f4e5653496689077ce5) を使わせていただき、１年分の投稿アクティビティの画像も追加


http://labs.snaka.info/2016/0125_qiita_calendar.html

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/dbf70ecb-4624-80d4-4e0d-f6fbdde688f9.png)


# わかること

目検討によるものです。ちゃんと統計とかとってないです。

* 一日のビュー数は300~400くらい
* 土日・祝日はビュー数が1/5くらいになる、明らかに落ちる
* 火水木あたりがビュー数が多め
* 自分が投稿したタイミングでビュー数が増えているわけでもない

[Qiitaの記事はいつ頃投稿されるのか](http://qiita.com/ohtacaesar/items/38ee852612dd046cc9ec) をみると、土日でも投稿数が特に落ちるということはないですから、土日祝でビュー数が落ちるのは、単純に見るユーザがその日は使っていないということでしょう。

たまにビュー数が普段の倍くらいになってたのですが、原因は不明です。その直前で投稿していたわけでもないし、投稿してもビュー数がたいして高くないものだったりします。

[以前に自分が書いた記事](http://qiita.com/n_slender/items/df2a5eb516673f23509a) でも、同じことをいっていましたが、状況証拠が増えたところです。年末年始は土日以上に落ちているので、調べるためにqiitaを使っている層はそんな日まで使う人は少ないのでしょう。（ビュー数の落ち具合をみると、去年は12/28まで仕事があった人が多数派のようです。今年の仕事始まりも、1/4が多数派の模様）

# ページごとのビュー数をみてどうすんの？

ビュー数が高いやつは、ググったときに出やすいので、そういうのはあとで追記いれて、情報の鮮度や質を上げるようにしています。

どういうタイトルや内容だとググられやすいのかも、ここからわかったりします。何気なくつけたのが検索にひっかかりやすかったのが結構あります。

最近になったjava系のものがあがってきました。tomcatのログローテーションの記事が、いまどき需要があるのか不思議なところです。

あとは、最近書いた記事のビュー数をみて一喜一憂したり、ひとり悦に入るのに使っています。
当たり前のことしかわからないのですが、この結果をみて記事を書くきっかけになったりするので、方針決めに使っています。


# 参考サイト

* http://qiita.com/Qiita/items/c7f704e3786df3aa7a11
* http://qiita.com/yaju/items/f0d42b072fad999c9902
* http://qiita.com/AQRiL_1132/items/3b979e0a5476c33f2261
* http://qiita.com/ohtacaesar/items/38ee852612dd046cc9ec
* http://qiita.com/khsk/items/ee915068077e5bea675e
Webアプリの脆弱性診断員も知っておくべきネットワークの基礎の基礎

パソコン同士が通信する際に避けて通れない技術が「プロトコル」

例えば、2人の人が会話をするときに、言語が決まっていなければ意思疎通は難しい。
これはパソコン同士でも言えることで、世の中にはパソコンのメーカーが数多くあります。
基本的な仕組みは同じですが、通信になると、同じ通信の規格でやり取りをしないと、データ自体が送信されません。
そこで、相互に通信（会話）するために決められた約束事や手順がプロトコルという技術というわけです。

でもプロトコルといわれても、ぶっちゃけ根本的な流れをコード書いてみてみないとわからないのが本音。

#どうしたらネットワークの仕組みを自宅で体系的に理解できるのか？
やっぱり手を動かして学ぶのが一番手っ取り早い
最初に学ぶのに一番おすすめするのがソケットプログラミングです。
なぜなら、根本的な通信のやり取りをどのように行っているかというのがコードを通じてわかるから、なんですね。
ネットワークの仕組みを学ぶにはもってこいではないかと。

というわけで、Python3でソケットプログラミングに挑戦してみました。
参考サイトに書いてあるコードは2系のものだったので、ちょっと苦労しましたが、通信の理解が深まった気がします。
ローカルホスト上でチャットをするコードです。

```server.py
import socket

HOST='localhost'
PORT=5007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
soc, addr=s.accept()
print("Connected by",addr)
print("Let's chat!")

while 1:
	data = input('(server) > ')
	soc.send(bytes(data,'utf-8'))
	data = soc.recv(1024)
	print("(client) >" , data)
	if data == "quit":
		break
soc.close()
```
```client.py
import socket

HOST='localhost'
PORT=5007

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

print("just a moment")

while 1:
	data = s.recv(1024)
	print('(server) > ', data)
	data = input('(client)>')
	s.send(bytes(data,'utf-8'))
	if data == 'quit':
		break
s.close()
```

###チャットのやり方
- ターミナルを二つ立ち上げる

- それぞれ起動させる。順番はserver.pyを立ち上げてからclient.pyを起動させる

-  文字を入力する

とまぁこんな感じでした。
通信がbyteで処理されているということがわかるだけでも、今回の学びは価値があるのではないかと。
是非やってみてください。

###参考サイト
Pythonでネットワークプログラミング(1)
http://d.hatena.ne.jp/Megumi221/20110310/1299745785
SQLでFizzBuzzを書いた

使い古されたねたではありますが、プログラミングクイズとしてもっとも有名な問題のひとつである「FizzBuzz」をSQLで解いてみました。動作確認自体はPostgreSQLで行いましたが、可能な限り標準SQLに準拠しています。ただし剰余は標準SQLにはないため、処理依存の関数`mod`を利用しています。もっとも多くの処理系で`mod`はサポートされていると思いますが。

```sql
-- 桁テーブルを作成&初期化する。
create table digits (digit integer);
insert into digits values (1), (2), (3), (4), (5), (6), (7), (8), (9), (0);

-- 連番ビューを作成&初期化する。
create view numbers as (
	select (d1.digit * 10 + d2.digit) as x 
	from digits as d1, digits as d2
	where d1.digit <> 0 or d2.digit <> 0
);

-- FizzBuzzを出力する。
select 
	x,
	case
		when mod(x, 15) = 0 then 'FizzBuzz'
		when mod(x,  3) = 0 then 'Fizz'
		when mod(x,  5) = 0 then 'Buzz'
		else                     cast(x as char(2))
	end as result
from numbers
order by x;

/**
 x  |  result
----+----------
  1 | 1
  2 | 2
  3 | Fizz
  4 | 4
  5 | Buzz
  6 | Fizz
  7 | 7
  8 | 8
  9 | Fizz
 10 | Buzz
 11 | 11
 12 | Fizz
 13 | 13
 14 | 14
 15 | FizzBuzz
 16 | 16
 17 | 17
 18 | Fizz
 19 | 19
 20 | Buzz
 21 | Fizz
 22 | 22
 23 | 23
 24 | Fizz
 25 | Buzz
 26 | 26
 27 | Fizz
 28 | 28
 29 | 29
 30 | FizzBuzz
 31 | 31
 32 | 32
 33 | Fizz
 34 | 34
 35 | Buzz
 36 | Fizz
 37 | 37
 38 | 38
 39 | Fizz
 40 | Buzz
 41 | 41
 42 | Fizz
 43 | 43
 44 | 44
 45 | FizzBuzz
 46 | 46
 47 | 47
 48 | Fizz
 49 | 49
 50 | Buzz
 51 | Fizz
 52 | 52
 53 | 53
 54 | Fizz
 55 | Buzz
 56 | 56
 57 | Fizz
 58 | 58
 59 | 59
 60 | FizzBuzz
 61 | 61
 62 | 62
 63 | Fizz
 64 | 64
 65 | Buzz
 66 | Fizz
 67 | 67
 68 | 68
 69 | Fizz
 70 | Buzz
 71 | 71
 72 | Fizz
 73 | 73
 74 | 74
 75 | FizzBuzz
 76 | 76
 77 | 77
 78 | Fizz
 79 | 79
 80 | Buzz
 81 | Fizz
 82 | 82
 83 | 83
 84 | Fizz
 85 | Buzz
 86 | 86
 87 | Fizz
 88 | 88
 89 | 89
 90 | FizzBuzz
 91 | 91
 92 | 92
 93 | Fizz
 94 | 94
 95 | Buzz
 96 | Fizz
 97 | 97
 98 | 98
 99 | Fizz
**/
```

個人的にもっとも工夫した点としては1から99までの連番をシーケンスではなく直積によって求めているところでしょうか(意外に有名なテクニック!)。つまり__2桁の整数を「1桁の整数を2つくみあわせたもの」として解釈しています__。あるいはRubyでいえば次の例のようなことをしているのと同じです。

```rb
numbers = []
(0..9).each do |d1|
  (0..9).each do |d2|
    numbers << d1 * 10 + d2
  end
end
```

もしくは直積を扱う`Array#product`を利用すると、次のようにも書けるはずです。

```rb
numbers = []
[*0..9].product([*0..9]) do |d1, d2|
  numbers << d1 * 10 + d2
end
```

***
__2017-01-07追記:__

1から99までの連番を生成するところですが、よくよく考えてみると「再帰クエリ」を利用しても書けますね……。なお結果は同じになるので省略しています。

```sql
with recursive numbers (x) as (
		select 1
	union all
		select x + 1 from numbers where x < 99
) 
select 
	x,
	case
		when mod(x, 15) = 0 then 'FizzBuzz'
		when mod(x,  3) = 0 then 'Fizz'
		when mod(x,  5) = 0 then 'Buzz'
		else                     cast(x as char(2))
	end as result
from numbers
order by x;
```

あるいは「連番を生成する部分」と「ロジックによりFizz/Buzz/FizzBuzzを切り替える部分」を同時に処理するなら、次のように書くこともできます。なお利用してるPostgresSQLの関係上、文字列の型を`text`にしています。

```sql
with recursive fizzbuzz (x, result) as (
		select 1, '1'
	union all
		select
			x + 1,
			case
				when mod(x + 1, 15) = 0 then 'FizzBuzz'
				when mod(x + 1,  3) = 0 then 'Fizz'
				when mod(x + 1,  5) = 0 then 'Buzz'
				else                     cast(x + 1 as text)
			end
		from fizzbuzz
		where x < 99
) select * from fizzbuzz 
```
Android StudioでAndroidアプリを作成


Android Thingsを触ってみたくなったので、まずはAndroid Studioのinstallとemulatorでのアプリ起動を試してみます。

# 環境

私の環境は下記の通りです。
* MacBookAir
* MacOS10.11

# Android Studio
## install

* [こちら](https://developer.android.com/studio/index.html)からAndroid Studioをinstallします。

## project作成 & emulator実行

* [Building Your First App](https://developer.android.com/training/basics/firstapp/index.html)に従って、projectを作成します。

* 私は、Nexus 6とAndroid7.1.1(X86)でVirtual Deviceを作成しました。

* [こちら](https://developer.android.com/training/basics/firstapp/running-app.html#Emulator)に従って、emulatorからアプリを実行した際、下記エラーが発生しました。[stackoverflow](http://stackoverflow.com/questions/37281365/emulator-not-running-on-android-studio)を参考に、起動していたDockerを停止し、再度、emluratorを使ってアプリ起動したところ、正常にemulatorが起動しました。

```
Error while waiting for device: The emulator process for AVD Nexus_6_API_25 was killed.
```


以上
Bluemix Node-REDに2行追加して日本時間を簡単に出力する

## 経緯
Bluemixのリージョンに日本（とタイムゾーンの同じ地域）がないため、単純に日付が出力できない。
調べると、Moment.jsの利用で解決できそうなので、Node-REDでの利用方法を含めてまとめた。

## 前提
- Bluemixに登録済み（トライアルでも可）
- ボイラープレートのNode-REDのアプリを作成済み
    - 作成していない人は、[BluemixでGitHubの連携やWeb IDE、Delivery Pipelineを利用できるようにする](http://qiita.com/sear-azazel/items/c69a050f9a661cf00c7d "BluemixでGitHubの連携やWeb IDE、Delivery Pipelineを利用できるようにする")を参照

## 内容
1. package.jsonにMoment.jsの依存関係を追加する

    ```json:package.json(修正前)
    "dependencies": {
            :
        "node-red-nodes-cf-sqldb-dashdb":"0.x"
    },
    ```
    ```json:package.json(修正後)
    "dependencies": {
            :
        "node-red-nodes-cf-sqldb-dashdb":"0.x",
        "moment": "^2.17.1"
    },
    ```
    注意）`"node-red-nodes-cf-sqldb-dashdb":"0.x"`行の末尾にカンマを忘れない。
1. bluemix-settings.jsにmomentを`require`する設定を記載する
 
    ```js:bluemix-setting.js(修正前)
        functionGlobalContext: { },
    ```
    ```js:bluemix-setting.js(修正後)
        functionGlobalContext: {
    	    moment : require("moment")
        },
    ```
    補足）`functionGlobalContext`に`require`を記載すると、function node内で`global.context`から利用できるようになる
1. Deploy
    - Eclipse Orion Web IDEを用いている場合は、「ワークスペースからアプリケーションのデプロイ」ボタンを押す
    - GitHub＆Delivery Pipelineを利用している場合は、コミット＆プッシュする（自動的にデプロイされる）

## 利用
Node-REDのFlowでfunction nodeを追加して、以下のようにmomentを利用する

```js
var date = context.global.moment();
date.locale("ja").tz("Asia/Tokyo"); // ロケールを日本語、タイムゾーンを東京に設定
msg.payload = date.format("LLL");
return msg;
```
Flowイメージ
<img width="327" alt="スクリーンショット 2017-01-05 23.10.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/153015/9901846a-990e-41e0-0dae-c50be0517189.png">

Debug出力
<img width="311" alt="スクリーンショット 2017-01-05 23.12.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/153015/f87657fe-005a-45e9-12d0-a515ab89d7bb.png">

## 備考
Moment.jsの詳細については、http://momentjs.com を参照
ArchLinux インストール覚書

会社で廃棄処分になる予定だった古マシンをもらってきました。

* 機種: Inspiron 530s

個人の趣味で、これに直接ArchLinuxを入れます。個人的趣味丸出しのインストールする予定。

時間が無くて作業がブツ切りになりそうなので、脳内記憶の代わりにメモ記事を量産します。基本は自分の為の覚書ですが、もしかすると誰かの役に立つかも知れないと期待したりしなかったり。

そういうワケなので、この一連のシリーズは文体など他人に見られる事を全く考慮しないつもりです。書き込み時間短縮が最優先。そこんとこ一つ。

# ハードウェア

* [DELL Inspiron 530s](http://www.dell.com/support/home/jp/ja/jpbsd1/product-support/product/inspiron-530s/manuals)
* HDDは適当な手持ちの物。320GB×2台
* ハードウェアRAIDコントローラが組み込まれているらしいので、折角だからRAID1（ミラーリング）を設定
（→ 2017/01/15 追記: どうやらこのマシンに組み込みのRAIDコントローラはLinuxでは使えないらしい、詳細は後日）
* マシン標準装備のEthernetコントローラとは別に、会社に余ってたGigaBitEtherのコントローラボードを譲り受けて搭載。しかし家庭内にGigaBitEtherケーブルが無いので使えない:sweat: とっとと買ってくりゃいいんだけど…

# 予定

## 当面の目標など

* OSは ArchLinux
* ファイルシステムとして Btrfs を設定
* NAS(FreeNAS)とNFSで接続して読み書き

## やりたい・1

最初にコンテナの実験。それもDockerとかsystemd-nspawnじゃなくて、うんと軽いヤツ。chrootベースの [jailing](http://blog.kazuhooku.com/2015/05/jailing-chroot-jail.html) ってのを見つけたので、試してみる。

そしてこの [jailing](http://blog.kazuhooku.com/2015/05/jailing-chroot-jail.html) をシェルスクリプトで書き直す。

jail のバックアップシステムを構築。Btrfsを活かしたバックアップにしたい。

## やりたい・2

CalDAVサーバ構築。やりたいというより必須。

## やりたい・3

FreeNAS の jail 上に立てたサーバ類を、いくつかこっちに持ってくる。具体的な品目は検討中。サーバが FreeNAS マシンと ArchLinux マシンの2台になるので、引っ越し等々によるマシンメンテナンス（破損→マシン交換を含む）を考慮した構成にしたい。

## やりたい・4

フリーのメッセンジャーサーバ [Spika](http://www.spikaapp.com) を試したい。…けどiOSアプリは自分でインストールしなきゃいけないのか？う〜ん…無理かなぁ。その辺の調査も含む。

とりあえず以上。
適当に追加するかも。
実作業の内容は別記事にて。

# 目次

シリーズ全体の目次を追加します。適宜追記します。

| タイトル | 概要 |
|:--------------------------------|:--|
| ArchLinux インストール覚書 | ハードウェア紹介とやりたい事の一覧 |
| 続・ArchLinux インストール覚書 | インストール（失敗） |
| 続々・ArchLinux インストール覚書 | インストール（成功） | 
| 又・ArchLinux インストール覚書 | RAID1構成にしたHDDの片方が壊れた場合 |
| 又々・ArchLinux インストール覚書 | 外部ストレージのプロトコル選択 |
| まだ・ArchLinux インストール覚書 | iSCSIの基礎知識へのリンク集 |
| まだまだ・ArchLinux インストール覚書 | FreeNASでiSCSIターゲット |
| も一つ・ArchLinux インストール覚書 | iSCSIイニシエータ(1/2) |
| なお・ArchLinux インストール覚書 | iSCSIイニシエータ(2/2) |
| なおなお・ArchLinux インストール覚書 | btrfsスナップショット |
| 重ねて・ArchLinux インストール覚書   | データ用外部ストレージもbtrfs |
| 重ね重ね・ArchLinux インストール覚書 | FHSに基づく自作ツール置き場 |
| なおかつ・ArchLinux インストール覚書 | Subversionインストールと/etc管理の導入 |
最適化におけるJulia - JuMP事始め

JuMP — Julia for Mathematical Optimization は、Julia で数理最適化を行うためのドメイン特化モデリング言語です。

- github https://github.com/JuliaOpt/JuMP.jl
- ドキュメント http://www.juliaopt.org/JuMP.jl/0.15/

特徴は、以下の通り。
- 線形計画法以外に、色々なソルバーが用意されています。 ソルバーのリスト → https://jump.readthedocs.io/en/latest/installation.html#getting-solvers
- JuMP の記述はソルバーに依存しません。
- JuMP 本体は Julia のみで書かれています。各ソルバーは下位のバイナリを呼ぶ場合があります。
- JuMP は Mozilla Public License です。(ソルバーのライセンスは種々)
- 速い (そうです)

# インストール

```Julia
Pkg.add("JuMP")
Pkg.add("Clp")
```

`Clp` は線形計画法のソルバーです。




# 事始め

Python の PuLP は、線形計画法パッケージです。
Qiita記事 [『最適化におけるPython』](http://qiita.com/Tsutomu-KKE@github/items/070ca9cb37c6b2b492f0) の 「[pulpの使い方](http://qiita.com/Tsutomu-KKE@github/items/070ca9cb37c6b2b492f0#pulpの使い方)」にある例題を JuMP に移植して見ました。問題はリンク先を参照ください。

### Python - PuLP

```Python
from pulp import *
m = LpProblem(sense=LpMaximize) 
x = LpVariable('x', lowBound=0)
y = LpVariable('y', lowBound=0)
m += 100 * x + 100 * y
m += x + 2 * y <= 16
m += 3 * x + y <= 18
m.solve() # ソルバーの実行
print(value(x), value(y)) # 4, 6
```

### Julia - JuMP

```Julia
using JuMP
using Clp

m=Model( solver=ClpSolver() ) # 数理モデル
@variable(m, x >= 0) # 変数
@variable(m, y >= 0) # 変数
@objective(m, Max, 100 * x + 100 * y ) # 目的関数
@constraint(m, x + 2 * y <= 16) # 制約条件
@constraint(m, 3 * x + y <= 18) # 制約条件
status = solve(m) # ソルバーの実行
getvalue(x) # => 4.0
getvalue(y) # => 6.0
```

PuLP と JuMP は、そっくりですね。
変数、目的関数、制約条件は、マクロで記述します。


■ 2017/05/23 修正---
本記事を執筆した 2017年1月当時は、`using Clp` しておくと

```Julia
m=Model()
```

とするだけで `solver=ClpSolver()` が既定となっていました。現時点は solverを明示する必要があります。
■ 修正終わり ----

# 終わりに

リンク先には、Python のデータ分析パッケージ pandas のデータフレームと、PuLPとの連携が紹介されています。 pandas のデータフレームに相当する Julia パッケージは Dataframes です。Dataframes の変数を使って、問題を記述すれば、見通しがよいでしょうね。
Travis CIでYarn(pkg)を使う設定 (node.js)


## 最小の設定と条件
node.jsのプロジェクトにおいて、Travis CIで`npm install`の代わりに`yarn install`を使う方法は、以下の`.travis.yml`設定と実行条件を両方満たすことです。
（2017/01/05現在）

### .travis.ymlの設定

```.travis.yml
language: node_js
node_js:
  - 4
  - 5
  - 6
  - 7
  - node
dist: trusty
sudo: false
cache: yarn
```

必須なのは`dist: trusty`, `sudo: false`, `cache: yarn`で、それぞれ以下のような意味合いです。

- `dist: trusty`, `sudo: false`: コンテナベースのUbuntu 14.04 (public beta) イメージを利用する設定です。 このイメージには[Yarn(pkg)がプリインストールされ](https://docs.travis-ci.com/user/build-environment-updates/2016-12-01/#Added)ているため、この設定によりユーザ自身による[インストール用設定](https://yarnpkg.com/en/docs/install-ci#travis-tab)が不要となります
- `chache: yarn`: パッケージのインストールを高速化するための[Yarn(pkg)キャッシュを有効にする設定](https://blog.travis-ci.com/2016-11-21-travis-ci-now-supports-yarn)です

なお、[Yarn(pkg)](https://yarnpkg.com/)の実行には、Node4以上を必要とするためテスト対象のNodeバージョンには4以上（`.travis.yml`の`node_js`ディレクティブ）を指定[^1]します。

### yarn installが実行される条件

- `yarn.lock`ファイルがプロジェクトディレクトリ直下に存在すること

正しく動作すると、Travis CIのビルドJobの中で下図のように`yarn`が実行されます。
![Kobito.hGvKu5.png](https://qiita-image-store.s3.amazonaws.com/0/6368/37915336-7874-a097-29f9-4b8931d251ac.png "Kobito.hGvKu5.png")

最小サンプルのTravis CI BuildとGitHubリポジトリを作成してみました。参考にしてみてください。

- [noriaki/yarn-travis-example - Travis CI](https://travis-ci.org/noriaki/yarn-travis-example/builds/189105779)
- [noriaki/yarn-travis-example - GitHub](https://github.com/noriaki/yarn-travis-example)

## 背景

これを書いたのは、[Yarn(pkg)のTravis CI設定ページ](https://yarnpkg.com/en/docs/install-ci#travis-tab)や[Travis CIのYarn(pkg)サポート告知ページ](https://blog.travis-ci.com/2016-11-21-travis-ci-now-supports-yarn)の情報が古くなっていることが背景でした。

それでは、素敵なYarn(pkg)とTravis CIライフをお過ごしください。

[^1]: 4未満を指定した場合はYarn(pkg)のエラーによりテスト失敗になります
Xamarin.Androidで画面向き固定は、Activity属性への指定でいっぱつ！

#ネット上ではいろいろ紹介されていますが...
これらのどれも可能（かつ、それぞれ特性あり）なのだと思われますが、次の方法が一番簡単だと思います（当方比）

Xamarin 公式ガイドページより

- [Device Orientation](https://developer.xamarin.com/guides/xamarin-forms/user-interface/layouts/device-orientation/) （Xamarin.Forms の説明ページ。ただしべたなActivityでも同じ効果）
- [Android.Content.PM.ScreenOrientation Enumeration](https://developer.xamarin.com/api/type/Android.Content.PM.ScreenOrientation/)

#コード例
Blank App のスケルトンをもとに...

```C#
using Android.App;
using Android.Widget;
using Android.OS;

namespace App2
{
    [Activity(Label = "App2", MainLauncher = true, Icon = "@drawable/icon",
     ScreenOrientation = Android.Content.PM.ScreenOrientation.Landscape)] // <--横長画面に固定するときは Landscape。縦長固定なら Portrait。
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);
        }
    }
}

```

[ActivityAttribute](https://developer.xamarin.com/api/type/Android.App.ActivityAttribute/) の [ScreenOrientation](https://developer.xamarin.com/api/property/Android.App.ActivityAttribute.ScreenOrientation/) に値を指定してやります。Activity 属性値指定箇所で、カンマを打って S を打ってみましょう。インテリセンスで自動補完されます。指定する値の意味は [こちら](https://developer.xamarin.com/api/field/Android.Resource+Attribute.ScreenOrientation/)をご参照あれ。ね、簡単でしょう？！
ちなみに、この ActivityAttribute では、ソフトウエアキーボードの挙動指定などもできるようです。

公式ガイド説明では、ActivityAttribute の振る舞いは「『AndroidManifest.xml』の要素を生成します」だそうです。
Java開発環境ではxmlに記載していた内容をC#のコードに集約させる方向なのかな、Xamarinの思想は。。確かに、単一のコードでプラットフォームをまたげることがXamarinの究極の目的ですからね。
berkshelfでcookbookを作成してrun_listでrecipeを指定して実行する方法

# やりたいこと
berkshelfでcookbookの雛形を作った後、インストールしたいパッケージごとにrecipeを作り、run_listでrecipeを指定して実行する。

# 前提
- berkshelfとchefをgemなどでインストールしておく。
- カレントディレクトリは"/home/vagrant/chef-berkshelf/"とする。

# cookbookの雛形を作成
```
$ berks cookbook berks-cookbook
```

# 実行するcookbookのパスを設定
```
$ vi solo.rb
```

```ruby:solo.rb
cookbook_path ["/home/vagrant/chef-berkshelf"]
```

# recipeを作成
```
$ vi berks-cookbook/recipes/apache.rb
```

```ruby:apache.rb
package "httpd" do
  action :install
end

service "httpd" do
  action [ :enable, :start ]
end
```

# 実行するrecipeを設定
```
$ vi chef.json
```

```json:chef.json
{
  "run_list": [
    "recipe[berks-cookbook::apache]"
  ]
}
```

# パッケージのインストール
```
$ sudo chef-solo -c solo.rb -j chef.json
```

recipeをchef.jsonに追加していけば複数のパッケージをインストールできる。
サーバの用途ごとにchef.jsonを用意してやればcookbookを跨いでrecipeを実行することができる。
vim を使ってエンコーディング変換

## Excel と CSV のエンコーディング問題
Excel を使って csv ファイルを開こうとすると、ShiftJIS では確実に文字化けしないんだけど、UTF8 だと、場合によって文字化けが起きる。
というか、ある一例を除いて文字化けが起きる。

Windows の Excel で BOM付きUTF8 で開くと文字化けが起きない。

Mac だと、どうあがいても UTF8 の時点で文字化けする。

という事で文字コードの変換を行いたいけど、なかなか気軽に変換する方法がない。

## あ、あった。 vim だ。
そう。 vim は `:set fileencoding=cp932` としてから `:wq` で保存すると ShiftJISで保存できる。
ちなみに cp932 は最新の ShiftJIS互換のエンコーディング。。。だと認識してる。

## でも、いちいちファイル開いてうんちゃらするのは面倒。。。
ってことで調べたら、vimのコマンドを cli から実行する方法があった！！
さすがです。

```bash:tosjis.sh
#!/bin/bash -ex

vim +"argdo set fileencoding=cp932 | wq" $@
```

## 参考URL
http://stackoverflow.com/questions/2311750/change-file-encoding-to-utf-8-via-vim-in-a-script
Rails Tutorial7.3.4のテストが通らなかった件。

Rails Tutorialも7章まで行きました。
今回は7.3.4のユーザー登録に失敗するテストが通らなかったので書き留めておきます。

##概要
**Rails Tutorial 7.3.4 失敗時のテスト**
教材通りにコードを書いたがテストがエラーになってしまい通らない。
```
ActionController::ParameterMissing: param is missing or the value is empty: user
```

##原因
`post`で送るデータの書き方。

```
assert_no_difference 'User.count' do
  post users_path, params: { user: { name:  "",
                                     email: "user@invalid",
                                     password:              "foo",
                                     password_confirmation: "bar" } }
end
```
この部分です。説明では`params`について
>なおRails 4.2以前では、paramsを暗黙的に省略しても (userハッシュのみでも) テストが通りました。Rails 5.0からは非推奨になり、paramsハッシュを明示的に含めることが推奨されています。

となっています。
私の環境はRails4.2.2ですが、どうやら`params[:user]`にすると逆にダメなようです。

```
post users_path, user: { name: "",
                         email: "user@invalid",
                         password: "foo",
                         password_confirmation: "bar" }
```
に直したところ無事動きました。
Jinja2のmapフィルタの中身に引数が必要なフィルタを指定する

# 動機

Ansibleで、ある変数がDNSサーバのIPアドレスのリストを持っている時に、templateモジュールを使ってIPアドレスをダブルクォートで囲んで、さらにカンマとスペースを区切り文字にして並べて出力したい、というのをやりたかった。
つまり例えば8.8.8.8と8.8.4.4からなるリストを`"8.8.8.8", "8.8.4.4"`と出力したい、という話である。

# mapフィルタを使ってみたが失敗

forでリストを回せば書けるのはわかっているが、長くなって読みづらい。
そこでJinja2に2.7からあるmapフィルタを使って、リストの各項目にregex_replaceフィルタを適用しようとして`map('regex_replace("(^|$)", "\""))`とかやってみたがエラーになるばかり。
http://jinja2.readthedocs.io/en/latest/templates.html#map
（なお、regex_replaceフィルタはAnsibleの独自拡張なのでJinja2のドキュメントには載っていない）

# 正しいmapフィルタの使い方

google検索してみたが答えは見つからず、エラーメッセージを見てみると「template error while templating string: expected token ',', got 'regex_replace'」と書かれている。
これ自体は正しいことを書いていないのだが、しばらく考えてみたところ解答が閃いた。

というわけで以下が正解。（recursorsはDNSサーバのIPアドレスのリストを持っている変数）
`{{ recursors | map('regex_replace', '(^|$)', '"') | join(', ') }}`
mapの2番目以降の引数にregex_replaceの引数を指定してやれば良かった。

答えがわかってしまえばドキュメントの「Alternatively you can let it invoke a filter by passing the name of the filter and the arguments afterwards.」がそういう意味だとわかるのだが。

# なお

mapフィルタなんて使わなくても`"{{ recursors | join('", "') }}"`で良いことに後で気付いた。
とはいえ私はgoogleで見つけられなかった内容なので、Web上に残しておくとそのうち誰かの役に立つかもしれない。
オブジェクト指向のこころ 練習問題解答まとめ

オブジェクト指向のこころの目次と各章の練習問題の解答をまとめた．

### オブジェクト指向ソフトウェア開発入門

[第1章 オブジェクト指向パラダイム 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/04/001112)
[第2章 UML 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/04/005028)

### 従来のオブジェクト指向設計における限界

[第3章 柔軟なコードを必要とする問題 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/04/010839)
[第4章 標準的なオブジェクト指向による解決策 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/04/220709)

### デザインパターン

[第5章 デザインパターンの紹介 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/06/201831)
[第6章 Facadeパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/06/205859)
[第7章 Adapterパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/06/233600)
[第8章 視野を広げる 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/07/214309)
[第9章 Strategyパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/07/222907)
[第10章 Bridgeパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/08/204355)
[第11章 Abstract Factoryパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/08/212334)

### すべてをまとめる：パターンを使って考える

[第12章 エキスパートはどのように設計するのか 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/08/220311)
[第13章 CAD/CAMの問題をパターンによって解決する 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/08/232045)

### 新たな設計パラダイムに向けて

[第14章 デザインパターンの原則と戦略 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/09/215114)
[第15章 共通性/可変性分析 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/09/221543)
[第16章 分析マトリクス 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/09/232421)

### パターンの持つその他の価値

[第17章 Decoratorパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/10/220731)
[第18章 Observerパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/10/223856)
[第19章 Template Methodパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/10/232816)

### ファクトリ

[第20章 生成に関するパターンから得られる教訓 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/11/193307)
[第21章 SingletonパターンとDouble-Checked Lockingパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/12/074113)
[第22章 Object Poolパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/12/131908)
[第23章 Factory Methodパターン 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/12/134302)

### まとめ，そして今後

[第25章 デザインパターンのおさらい：総括と今後 解答](http://yusuke-ujitoko.hatenablog.com/entry/2016/11/12/141727)
GV-USB2殻割り

Raspberry Piでビデオキャプチャしようと、I/OデータのGV-USB2を購入しました。
Webで情報を集めるも、成功者がなかなか見つけられなかったので、殻割りを実施しました。
![IMG_20170104_182902.jpg](https://qiita-image-store.s3.amazonaws.com/0/83170/c18f55c5-8236-a536-c9b3-49e2f3c4cd05.jpeg)
この手の作業は初めてですが、何とかなると思ったのですが、情報を得るのは難しいことを実感しました。
![IMG_20170104_183416.jpg](https://qiita-image-store.s3.amazonaws.com/0/83170/56735412-00b5-cfe1-c4fe-aec58b8b0ee7.jpeg)
この写真を見ての通りシールが貼られていますが、これを剥がせば型番が簡単に見えると思っていました。ところが、型番を消す加工をしてあるのか、全然見えません。光の角度を変えたり、向きを変えたり、ようやく取れた写真が以下二枚。
![IMG_20170104_184934.jpg](https://qiita-image-store.s3.amazonaws.com/0/83170/e66f51ee-de78-7dbd-7399-c2c7c7468db6.jpeg)
![IMG_20170104_185000.jpg](https://qiita-image-store.s3.amazonaws.com/0/83170/4fcc700e-5c31-dd1b-f9f5-04c3485f7fc5.jpeg)
表裏の３つの大型チップのうち型番が読み取れそうなのは２チップのみ。マイコンらしきQFPのチップは型番でネット検索しても、ロゴで画像検索しても引っかからず。かろうじて、２枚目の方はオーディオ関連のチップ、CIRRUS 5340CZZと分かりました。
しかし、この型番ではLinuxのDriverを見つけられず。殻割りは徒労に終わりました。合掌(^o^;)
Electronアプリケーションの環境設定画面を超簡単に実装するモジュール electron-preference を作った

Advent Calendar 初挑戦です。

##問題

Electronでアプリケーションを作成するときに、とてもめんどくさいのは、環境設定の実装ではないでしょうか。
自分用のアプリケーションなら、ソースべた書きで対処してる人がほとんどでしょう。(自分がそうなだけ)
しかし、色んな人が使うアプリケーションとなるとそうはいきません。
ネイティブアプリのような環境設定をしたい。。。。という願いがふつふつと湧き出たので、これを期にモジュール作成をしてみました。

##electron-preference

https://github.com/yujilow1220/electron-preference

###使い方

npmでインストールできます。

```
$ npm install --save electron-preference
```

設定項目の定義ファイルを設置します。jsonで書きます。

```
[
  {
    "name":"Tab1",
    "items":[
    {
      "name":"checkbox1",
      "text":"checkbox1",
      "description":"Please check if you are lucky!",
      "type":"checkbox",
      "default":"true"
    },
    {
      "name":"text1",
      "text": "first name",
      "description":"Your First Name",
      "type": "text",
      "default":"takuya"
    },
    {
      "name":"text2",
      "text":"last name",
      "description":"Your Last Name",
      "type": "text",
      "default":"takahashi"
    }]
  },{
    "name":"Tab2",
    "items":[
      {
        "name":"birthday",
        "type":"date",
        "default":"1992-12-20"
      }
    ]
  }
]
```

そして、ソースコードにて設定ファイルをロードして、デフォ値を作成し、

```main.js
const preference = require('electron-preference');
preference.load('path/to/preference.json');
```

show()すると、Windowが現れます。

```
preference.show();
```

ここまでをmain.jsに全て書くと、こんな感じ。

```
'use strict';

var electron = require('electron');
var app = electron.app;
var BrowserWindow = electron.BrowserWindow;
var preference = require('electron-preference');

var mainWindow = null;

app.on('window-all-closed', function() {
  if (process.platform != 'darwin')
    app.quit();
});

app.on('ready', function() {

  mainWindow = new BrowserWindow({width: 800, height: 600});
  mainWindow.loadURL('file://' + __dirname + '/index.html');
  preference.load(__dirname + '/preference.json');
  preference.show();

  mainWindow.on('closed', function() {
    mainWindow = null;
  });
});

```

すると、こんなに素敵な環境設定画面が！！

![スクリーンショット 2017-01-05 20.48.45.png](https://qiita-image-store.s3.amazonaws.com/0/44954/b076184d-a591-da7c-e902-ee9ae942acd6.png)

Bootstrap Admin Theme v3 を使用させてもらってます。

https://github.com/VinceG/Bootstrap-Admin-Theme-3

apply して、保存したデータへはこうやってアクセスできます。

```
preference.get(function(data){
  // type your code
  console.log(data.Tab1.checkbox1); // true
});
```

かんたん！便利！

##おわりに

冬休みの課題として取り組んだんですが、良いボリュームでなかなかいいものができました。
htmlのviewとして、react.jsを採用しました。単純に書いてみたかったから。
reactの、stateを親だけで持つ考えは、子の状態がスッキリしてわかりやすいですね！

Electronでちょちょっとアプリを作りたい人は是非使ってみてください！
ESP8266 > Battery > Low Power Solutions > Modem-sleep / Light-sleep > Light-SleepでAmazon Dash Buttonの押下検知できた > と思ったが、きちんとLight-Sleepになっていない可能性あり

[AmazonDashButton(以下ADB)を検知するためのESP8266の実装をしている中](http://qiita.com/7of9/items/8712a71c8af267170da4)で、ESP8266のLow Power 使用が気になってきた。

2017/01/05 現在でのLow Power関連の資料として、以下のものが公式の資料のようだ。

http://www.espressif.com/sites/default/files/9b-esp8266-low_power_solutions_en_0.pdf

個人的に気になるのは、以下のモードの違い。

- Modem-sleep
- Light-sleep

上記のPDF資料を読んでみた。

### Table 1-1.

- System Clockについて
   - Modem-sleep: ON
   - Light-sleep: OFF
- CPUについて
   - Modem-sleep: ON
   - Light-sleep: Pending

### Modem-sleep

2.1. Featuresから
> In Modem-sleep mode, ESP8266 will close the Wi-Fi module circuit between the two **DTIM Beacon intervals** in order to save power

### Light-Sleep

3.3. External Wake-upから

> During Light-sleep, the CPU is suspended and will not respond to the signals and interrupts from the peripheral hardware interfaces. Therefore, ESP8266 needs to be woken up via external GPIO.

Light-sleepではGPIOでのwake upをすることになりそう、とのこと。

WiFiの信号を受信するためにはModem-Sleepの方でないといけないのかもしれない。

~~要調査~~。

http://qiita.com/7of9/items/9bcdfa8223b6ec791a5c
のcode v0.4で調べたところ、Light-SleepでもADB検知できた。

(追記 2017/01/07)
http://qiita.com/7of9/items/8712a71c8af267170da4
にLight-Sleepでの試験結果を記載した (「v0.4コードでの試験」節)。

Light-Sleepを使用しない場合と同じ14時間弱までの動作となった。
Light-Sleepのまま動作していない可能性がある。

本当にLight-Sleepが機能しているのか確認するには、消費電流測定が必要だ。
protectedなメソッドとプロパティで可視性が異なる

### [Accessing protected property and method of sibling class is inconsistent](https://bugs.php.net/bug.php?id=73862)

プロパティとメソッドでprotectedの可視性が異なる。

```php
	// ベースクラス
	class BASE{
		protected $foo = 'BASE property';
		protected function bar(){ return 'BASE method';}
	}

	// 兄弟クラス
	class OTHER extends BASE{
		protected $foo = 'OTHER property';
		protected function bar(){ return 'OTHER method';}
	}

	// 自分
	class CHILD extends BASE{
		// 兄弟クラスのprotectedプロパティを見る
		public function hoge(){
			$other = new OTHER();
			echo $other->foo;
		}
		// 兄弟クラスのprotectedメソッドを呼ぶ
		public function fuga(){
			$other = new OTHER();
			echo $other->bar();
		}
	}

	$child = new CHILD();
	$child->hoge(); // Fatal error: Uncaught Error: Cannot access protected property OTHER::$foo
	$child->fuga(); // OTHER method ← ？？？
```

何故か兄弟クラスのprotectedなメソッドが見えてしまっています。

実際に走るメソッドはOTHER::bar()なのに、権限は何故かBASE::bar()のものが使われてしまっているようです。
試しにBASE::bar()を削除すると、正常に`Fatal error: Uncaught Error: Call to protected method OTHER::bar()`になります。
プロパティの場合は常にOTHER::fooの権限を見ているため、メソッドとプロパティで可視性が異なってしまっています。

まあ、これができたからといって特に問題が発生するとも思えませんけどね。

### privateが見える

ところで、同一クラスであれば[別インスタンスからもprivateが見え](http://php.net/manual/ja/language.oop5.visibility.php#language.oop5.visibility-other-objects)ます。

```php
	class FOO{
		
		private $bar;
		
		public function __construct($bar = ''){
			$this->bar = $bar;
		}
		
		public function getFooBar(FOO $foo){
			return $foo->bar;
		}
	}

	$foo1 = new Foo('foo1');

	$foo2 = new Foo();
	$foo2->getFooBar($foo1); // foo1
```

privateってこんな意味だったっけ？
と思ったらJavaやC++でも同じく、privateは`同一クラス`からであれば読めるという仕様でした。
今までずっと`同一インスタンス`じゃないといけないと思ってた。なぜなのか。


### おまけ

[Class Friendship](https://wiki.php.net/rfc/friend-classes)というRFCが提出されています。
friend認定することで、そのクラスからprotectedを読めるようにしようという内容です。
あまりAcceptされそうな気はしませんが。

```php
	// 相手
	class OTHER{
		protected $foo = 'OTHER';
		public function getMe(ME $me){
			return $me->bar;
		}
	}

	// 自分
	class ME{
		friend OTHER; // 相手をフレンド認定
		
		protected $bar = 'ME';
		public function getOthers(OTHER $other){
			return $other->foo;
		}
	}
	
	$me = new ME();
	$other = new OTHER();
	
	$other->getMe($me); // ME 相手をフレンドだと思ってるので相手は自分のprotectedを読める
	$me->getOther($other); // Cannot access protected property 相手はこっちをフレンドだと思ってないので読めない
```

どういう発想なんだこれ、と思ったけど実は[先にC++に実装されている](https://msdn.microsoft.com/ja-jp/library/465sdshe.aspx)ものらしい。

相手の情報を読むためには、自分側ではなく相手側にfriendsって書く必要があるので、どのようなときに役に立つ機能なのかさっぱり想像が付きません。
相手側には`friend LoggerInterface;`とか元々書いておくから使う側で適当に実装すれ、とかそんなかんじですかね。
Amazon Linux 開発環境を削除する

ソースでのコンパイルなどが終わった後に、開発環境を削除しておく

# 開発環境を削除する
```bash
yum groupremove "Development Tools"
```

# 必要に応じてライブラリの開発環境も削除する
* 例 pcre,opensslのライブラリのソースを削除する場合

```bash
yum remove pcre-devel openssl-devel
```
Amazon Linux 2016.09 で nginx 最新版(1.11.8)をyumでインストールする

# ポイント
* 先にamazon linuxでnginxをインストールしておく必要がある。今まではamazon linux標準のnginxを削除してから、nginx公式のレポジトリを追加し、nginxをインストールする手順だったような..。

# Amazon Linux 標準のnginxをインストール
```bash
yum update
yum install nginx
```
nginx-1.10.1-1.28.amzn1.x86_64.rpmをインストール

# nginxの公式レポジトリを追加
```(/etc/yum.repos.d/nginx.repo)
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/
gpgcheck=0
enabled=1
priority=1
```
* ポイントはpriorityの設定とbaseurlが【mainline】,centosのヴァージョンが【6】

# nginxの最新版を再度インストール
```bash
yum install nginx
```
UITableViewとUICollectionViewでUIRefreshControlを実装する

検証したiOSのバージョン`9系`と`10系`です。

## `UIRefreshControl`とは
メールアプリなどで実装されている、下にスワイプして画面を更新するUIを実装する時に使うクラスです。  

## 本記事のゴール
メールアプリのようなUIをゴールに設定します。具体的には次に記載するUIです。

* `UITableView`や`UICollectionView`に裏(?)にIndicatorが表示される。
* Indicatorが表示されてる間は`UITableView`や`UICollectionView`がIndicatorに重ならず、Indicatorが消えるとそのエリアが詰まる。
* スワイプした分だけIndicatorが進む。

## `UITableView`の実装

### `UITableViewController`を使う

`UITableView`でメールアプリのようなUIを実現する場合は、`UITableViewController`を使う必要があります。
`UITableViewController`の`refreshControl`プロパティに`UIRefreshControl`のインスタンスを設定すれば実現できます。

* [UITableViewController#refreshControl](https://developer.apple.com/reference/uikit/uitableviewcontroller/1614752-refreshcontrol)

### `UITableViewController`を使わない

複雑な画面を実装する場合に`UITableViewController`を使えないケースがあると思います。  
その場合は以下のような実装行います。  

```swift

        let refCon = UIRefreshControl()
        if #available(iOS 10.0, *) {
            tableView.refreshControl = refCon
        } else {
            tableView.backgroundView = refCon
        }

```

この実装の場合、メールアプリのようにスワイプしただけIndicatorが進むUIは実現できませんが、それ以外は実装できます。

* [参考にした投稿](http://stackoverflow.com/questions/10291537/pull-to-refresh-uitableview-without-uitableviewcontroller)

## `UICollectionView`の実装

`UICollectionViewController`には`UITableViewController`のように`refreshControl`がありません。  
従って、`UITableViewController`を使わない場合のような実装をする必要があります。

```swift

        let refCon = UIRefreshControl()
        if #available(iOS 10.0, *) {
            collectionView.refreshControl = refCon
        } else {
            collectionView.backgroundView = refCon
        }

```

この実装の場合も、メールアプリのようにスワイプしただけIndicatorが進むUIは実現できませんが、それ以外は実装できます。

## Bad Pattern
本件について検索すると[こちらの投稿](http://stackoverflow.com/questions/28915689/using-uirefreshcontrol-in-uiviewcontroller-with-uitableview)のように、`UITableView`や`UICollectionView`に`UIRefreshControl`を`addSubView`する実装が紹介されていますが、こちらの実装では本記事のゴールで設定したものがすべて実現されませんでした。

## まとめ
* スワイプした分だけIndicatorが進むUIは実装をするには`UITableViewController`を使う。
* `UICollectionView`ではスワイプした分だけIndicatorが進むUIは実装できない。
* 検索すると`UIRefreshControl`を`addSubView`する実装が見つかるがそれよりは`refreshControl`or`backgroundView`に設定する実装をする。

なお、実装できないというのはAppleから提供されているAPIでは実装できないだけで、独自実装して実装することは可能だと思います。(メルカリさんは実現してました）
Rubyのnet/telnetにinteract!メソッドを実装

NetOpsの自動化領域では標準的APIの不足のため、泣く泣く`expect`で対話的プログラムを実現しているケースも多いと思う。私自身あまり`expect`を使ったことはないが、`expect`プログラムには`interact`なるコマンドがありプロセス制御をユーザーに戻すことができる便利機能が実装されている[^1]ことを知った。

[^1]: 自動化領域でユーザに制御を戻すのは負けでは？という当然の意見はこの際無視する


```
spawn telnet $HOSTNAME
expect "login:"
send "$USERNAME\n"
expect "Password:"
send "$PASSWORD\n"
interact
```

同様の機能をRubyの標準モジュールである`net/telnet`にも実装してみる。

要するに標準入力から送られたキーストロークをtelnetセッションへ、またtelnetセッションからの応答を標準出力に転送してやれば良いわけで、複数ソケットからの受信待ち受けにはIO.selectが使える。

```
module Net
  class Telnet

    def interact!
      $stdin.raw!

      loop do
        rs, _ = IO.select([$stdin, @sock])
        rs.each do |fh|
          case fh
          when $stdin
            bs = fh.getc.chr
            if bs == "\e"
              begin
                bs << fh.read_nonblock(3)
                bs << fh.read_nonblock(2)
              rescue IO::WaitReadable
              end
            end

            @sock.syswrite(bs)
          when @sock
            bs = fh.readpartial(1024)
            $stdout.syswrite(bs)
          end
        end
      end
    rescue EOFError
      $stdout.puts "\r\n", "Conneciton closed."
      self.close
    ensure
      $stdin.cooked!
    end

  end
end


# 冒頭のexpectプログラムと同様
session = Net::Telnet.new('Host' => $hostname)
session.login($username, $password)
session.interact!
```
暗号通貨（仮想通貨）プラットフォーム、NEMのウォレットを、ブラウザの拡張機能で動くようにしてみた。

# 暗号通貨（仮想通貨）プラットフォーム、NEMのウォレットを、ブラウザの拡張機能で動くようにしてみた。
## 名前
NanoWalletBrowserAppにした。そのまんま。
## 前書き
なぜ「生成する奴」と表現するかというと、手順が簡単すぎて**作った**というのは少し言い過ぎな気がしたからです。

ここでは、仕組みや技術的（？）解説をします。ダウンロードや使い方は以下のリンクからどうぞ。

https://github.com/onokatio/NanoWalletBrowserApp/releases/tag/v0.0.1
`
### そもそも暗号通貨（仮想通貨）ってなに？という方→

- （…。これといった良いサイトが見つかりませんでした。申し訳ないが自力で…）

### NEMってなに？という方→

- https://www.nem.io/
- http://jpbitcoin.com/bitcoin2/neweconomymovement
- http://newcoin.jp/free/nem

以上のサイト様が参考になるかと思われます。

## 1. 仕組み
Google Chrome 拡張機能、Google Chrome アプリのインストールファイル２つを生成しています。

現在のほとんどのブラウザの拡張機能は、webアプリ形式となっており、実態はhtmlファイル群です。なのでwebアプリであるNanoWalletのファイルを少しだけ弄って、そのままwebアプリとして使っています。

## 2. やってること

Makefileの中では、主に２つのことをしています。

最新版のNanoWalletのダウンロード・ビルド
NanoWalletのビルド成果物を元に、いくつかの設定ファイルを付け加えて、各ブラウザの拡張機能インストーラー形式にコンパイル
これだけです。

2をもう少し詳しく説明します。Makefileを使って説明していきます。 

``` Makefile:Makefile
dist/chrome_extension.crx: src/NanoWallet/build src/chrome_extension/bg.js src/chrome_extension/manifest.json src/logo128.png
	mkdir -p dist/chrome_extension
	cp -R $^ dist/chrome_extension/
	cat src/header.json > dist/chrome_extension/manifest.json
	cat src/chrome_extension/manifest.json >> dist/chrome_extension/manifest.json
	google-chrome --pack-extension=$(shell pwd)/dist/chrome_extension
	$(RM) -rf dist/chrome_extension
	$(RM) dist/chrome_extension.pem
```
これはChrome拡張機能のインストーラーを作る手順です。
二行目から、

- 新しいディレクトリを作成
- 必要なロゴ画像、NanoWallet本体、拡張機能用JSをコピー
- 設定ファイルを、ブラウザ共通のものにChrome拡張専用設定部分を付け足してコピー
- Chromeでコンパイル
- 作業用フォルダを削除
- 生成された拡張機能の署名ファイルを削除（今のところストアに公開等しないため）

の一連の流れを実行しています。

以上です。ブラウザによって多少の差異はありますが、ほとんど変わりません。

それでは、良い暗号通貨沼ライフを〜
VBAで複数シート出力しシートごとにページ数を表示させる方法

## （追記）
ページ数を頑張って取得していたけれど、PageSetupのFirstPageNumberオプションを設定することで簡単に表示することができることがわかったのでわりと根幹部を更新しました。
このオプションをどう使うかというだけの話でしかないですが、検索すると上位にでてくるQAサイトなどではいけていないやり方が多いのでこの記事は残しておきます。

## 前置き

こんにちは。
RubyやRailsだと問題にぶつかってもだいたいググればドキュメントやStackOverflow、Qiitaでいい記事が見つかって解決するのですが、VBAはそうではありません。

玉石混交のQAサイト、情報の少ない公式ドキュメント（もしかしたら本当の情報が掲載されたドキュメントがあるのではという気もする）、なまじエラーメッセージなど日本語対応しているために英語で検索しにくいという問題もあります。

そのために、高度なプログラミングをするエンジニアではない一業務エンジニアの自分がQiitaに書くのはVBAばかりになっています（言い訳）。

今回も、VBAで困った問題をやっていきます。

## 問題

さて、VBAでExcelシートをつくった際、ヘッダーなどにページ数を出力したい場合があります。
印刷するのが1シートであれば簡単。下記のようにすれば右上のヘッダーにページ数が表示されます。
&Nが全ページ数で&Pがその印刷時点でのページ数なのですね。

```vb.net:module1
With ThisWorkbook.Worksheets("test").PageSetup
  .RightHeader = sortBookSheetName & "&P/&Nページ"
End With
```

では、同じブックに複数のシートをつくってこのPageSetupをした場合はどうなるか。
1シートずつ印刷するのであれば問題なくページ数は、そのシートのものが表示されるけれど、複数シートを同時印刷しようとすると、&Nは印刷対象の全シートの全ページ数を表示し、&Pは通算のページ数を表示してしまうのです。
それがいい場合もあるけれど、たとえば、複数の人向けの帳票をVBAで一括してつくってそれぞれ刷って配布する場合は困ります。

## 解決策
PageSetupでFirstPageNumberを指定する。
ポイントは、PageSetupを2つにわけて、ひとつで印刷範囲の設定や印刷設定をして、枚数を確定させてからpagebreakを取得すること。

サンプルコードはこんなかんじ。


```vb.net:module1

Sub test
    '' 変数初期化などは省略

    '' ワークシートを足す際はAfterではなくBeforeにして、シートが作成順に並ぶようにすると全ページ数からの差分を計算しやすい。
    Worksheets.Add before:=Worksheets(1)
    ActiveSheet.name = targetSheetName

    With ThisWorkbook.Worksheets(targetSheetName)
        '' 印刷設定
        With .PageSetup
            .PrintArea = targetRange '' 適当に印刷範囲を設定する
            .FitToPagesWide = 1 '' 横幅を一枚にする
            .Orientation = xlLandscape '' 横向きに印刷する
            .FirstPageNumber = 1 '' 印刷時にページ番号を1から表示する
        End With
    
        Dim page_num As Integer
        page_num = getPageCount(ThisWorkbook.Worksheets(targetSheetName))
    
        '' 印刷設定
        With .PageSetup
            .LeftHeader = "&20" & targetSheetName & "&P / " & page_num & "ページ"
        End With

    End With
End Sub

'' 各シートのページ数を取得する
Function getPageCount(ws As Worksheet) As Integer
    Dim h As Integer, v As Integer
    getPageCount = 0
    h = ws.HPageBreaks.Count
    v = ws.VPageBreaks.Count
    If v = 0 Then
        getPageCount = h + 1
    Else
        getPageCount = (h + 1) * (v + 1)
    End If
End Function

```

はい。

Excel、VBAでの帳票出力は、たくさん作る場合は重かったり（どうしてもテンプレートの行挿入が重い・・・）、印刷のレイアウトが微妙にずれたり問題はあるのですが出力した後にExcelを使える人ならだれでも微修正や編集できるので例外が多い場合は便利です。
とはいえメンテナンス性は悪くなりがちなので、どうしたらよいのでしょうね。

ご意見お待ちしております。
Amazon Linux 2016.09 で nginx 最新版(1.11.9)をソースからインストールする

#　開発ツールをインストールする
```bash
yum groupinstall "Development Tools"
yum install \
pcre-devel \
libxml2-devel \
libxslt-devel \
gd-devel \
perl-ExtUtils-Embed \
geoip-devel \
gperftools-devel
```

OpenSSLとPCREのライブラリソースをインストール

# ソースをダウンロード・解凍
```bash
cd /usr/local/src
wget http://nginx.org/download/nginx-1.11.9.tar.gz
tar xvzf nginx-1.11.9.tar.gz
cd nginx-1.11.9
```

# OpenSSLの最新版をインストールする
```
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.0c.tar.gz
tar xvzf openssl-1.1.0c.tar.gz
cd openssl-1.1.0c
```

# nginx purge moduleをインストールする
```
cd /usr/local/src
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar xvzf ngx_cache_purge-2.3.tar.gz
```

# 設定(yumパッケージと同じconfigureを設定する --with-ipv6オプションは使われなくなったので消す--with-threadsを追加)
```bash
./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/subsys/nginx \
--user=nginx \
--group=nginx \
--with-openssl=../openssl-1.1.0c \
--add-module=../ngx_cache_purge-2.3 \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-pcre \
--with-pcre-jit \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-threads \
--with-google_perftools_module \
--with-debug \
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' \
--with-ld-opt=' -Wl,-E'
```

# コンパイル・インストール
```bash
make
make install
```

# yumに入っていた起動スクリプトを持ってくる
```
/etc/rc.d/init.d/nginx
```

```bash
chkconfig --add nginx
chkconfig nginx on
chkconfig --list nginx
```

# yumに入っていた設定ファイルを持ってくる
```
/etc/nginx/nginx.conf
```

```bash
service nginx configtest
service nginx start
```