OmniAICreator/Qiita-1.07M huggingface dataset:
batファイル内の任意の処理の動作時間を計測・表示する

このページでは、batファイルの任意の処理に要した時間を計測し、表示するプログラムをご紹介します。

早速ですがプログラム本体です。

```bat:GetTime.bat
@echo off

:Main
call :GetStartTime
call :GetEndTime
call :PutTime
pause >nul
exit

:GetStartTime
rem 開始時刻の取得
set T=%TIME: =0%
set H=%T:~0,2%
set M=%T:~3,2%
set S=%T:~6,2%
set C=%T:~9,2%

rem 先頭が0の数値が8進数として扱われないようにするための処理
set /a H=1%H%-100,M=1%M%-100,S=1%S%-100,C=1%C%-100
exit /b 0

:GetEndTime
rem 終了時刻の取得
set T1=%TIME: =0%
set H1=%T1:~0,2%
set M1=%T1:~3,2%
set S1=%T1:~6,2%
set C1=%T1:~9,2%
 
rem 先頭が0の数値が8進数として扱われないようにするための処理
set /a H1=1%H1%-100,M1=1%M1%-100,S1=1%S1%-100,C1=1%C1%-100

rem 処理時間の計算
set /a H2=H1-H,M2=M1-M
if %M2% LSS 0 set /a H2=H2-1,M2=M2+60
 set /a S2=S1-S
if %S2% LSS 0 set /a M2=M2-1,S2=S2+60
set /a C2=C1-C
if %C2% LSS 0 set /a S2=S2-1,C2=C2+100
if %C2% LSS 10 set C2=0%C2%
exit /b 0

:PutTime
rem 開始・終了時刻と処理時間の表示
rem Hが時、Mが分、Sが秒、Cがコンマ以下2桁秒
rem 処理時間表示は適宜必要な単位のみ残して削除可
echo.
echo 開始時刻：%T%
echo 終了時刻：%T1%
echo 処理時間：%H2%h %M2%m %S2%.%C2%s
exit /b 0
```

詳しい解説はしません。読めばわかるはずです。

　使用方法ですが、このプログラムはcall文を用いた疑似関数の構造です。
　`:GetStartTime`以下、`:GetStartTime`・`:GetEndTime`・`:PutTime`の3つのラベルを丸ごと測定対象のbatファイルの任意の箇所(末尾で可)に貼りつけ、batファイル内の測定を開始したい箇所の直前に`call :GetStartTime`、測定を終了したい箇所の直後に`call :GetEndTime`、処理時間を表示したい箇所に`call :PutTime`と記述してください。

**注意:** このプログラムを使う時、プログラム内で使用されている全ての変数(T,H,M,S,C,T1,H1,M1,S1,C1,H2,M2,S2,C2)を予約語扱いとし、このプログラムを組み込むバッチファイル内の他の場所で使用しないようにするか、こちらのプログラムの変数名を他の変数名と一致しないように変更してください。

　また、表示される処理時間には、このコード自体の動作時間が含まれます(主に`:GetStartTime`内の計算時間)。大抵の場合で0.01秒ほどですが、1/100秒の誤差を許容しない場合は、上記プログラムのみを1つのbatファイルにして実行し、表示される処理時間がこのコードの動作時間ですので、それを見て適宜補正してください。

　最後に、sawa_tsuka氏が、batファイルの各動作に要する時間の測定結果を公開されていますので、batファイルの動作時間の長さに四苦八苦している方はそちらもご覧ください。
[.bat（バッチファイル）の、頻出コマンドの所要時間について](http://qiita.com/sawa_tsuka/items/afd17bb4d0532d5288ad)

　何かご指摘・ご意見などございましたら、コメントでお願いいたします。
Vagrantのboxを共有サーバ上から取得する


# 前提
Vagrantfileに以下のようにboxの在りかを指定して、`vagrant up`すると自動的にBoxをダウンロードする。つまり開発チームにはVagrantfileだけ共有すればよくなる
```rb
config.vm.box_url = "https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box"
```
# 課題
Boxファイルは巨大なので社外のURLから落としてくるのは遅い。
社内サーバーにアップロードしておいて高速化したい。
社内サーバーの場合の指定方法はどうするのか？

# 解決方法
`file://`を利用する

ホスト名：sample-host
```rb
config.vm.box_url = "file:////sample-host/boxes/ubuntu-14.04-amd64-vbox.box"
```
Clojure with-in-str と with-out-str の使い方

Ruby でいう StringIO みたいなもの。標準入力 `*in*` と標準出力 `*out*` をスタブしてくれる感じの便利関数。

どちらも標準入出力を扱う処理のテストに便利そう。あと暗黙に標準出力に書く関数を `with-out-str` でラップして出力をインターセプトし文字列として何か他のことに利用する、などのテクニックも使いたくなることがありそう。

ドキュメント

- https://clojuredocs.org/clojure.core/with-in-str
- https://clojuredocs.org/clojure.core/with-out-str

コードスニペット

- https://github.com/kyanny/playground/blob/gh-pages/clj-with-in-str/src/clj_with_in_str/core.clj
- https://github.com/kyanny/playground/blob/gh-pages/clj-with-out-str/src/clj_with_out_str/core.clj

```clj
(ns clj-with-in-str.core)

(read-line)

(with-in-str "Hello world"
  (read-line))

(with-in-str "Hello world"
  (slurp *in*))
```

```clj
(ns clj-with-out-str.core)

(println "Hello world")

(with-out-str
  (println "Hello world"))
```
Vagrant 基本コマンド

# 一応開発環境
+ iMac OS X Yosemite 10.10.5
    + VitualBox 5.0.12
    + Vagrant 1.8.1

# インストール
VitualBoxのインストール [■](http://www.oracle.com/technetwork/jp/server-storage/virtualbox/downloads/index.html)
Vagrantのインストール[■](https://www.vagrantup.com/downloads.html)

# Vagrant
##boxの追加
`$ vagrant box add {title} {url}`

リストはこちら → [A list of base boxes](http://www.vagrantbox.es/)
こちらを使用する場合、webに配布されているサイトを追加することができる

もう一つの追加の方法は、
Vagrantを開発しているHashiCorp社が運営しているサイト → [Atlas box検索ページ](https://atlas.hashicorp.com/boxes/search)
こちらは使ってる仮装環境も選べて、欲しいOSを検索して、
それをそのまま追加することができるのでかなりお手軽です。

## マシンの作成
例）仮装マシンごとにファイルを作成し、((名前は自由です。
>$ mkdir {name}
$ cd {name}

このコマンドによりVagrantfileが自動で作成されます。
`$ vagrant init`

Vagrantfileの中身です。（（省略して表示しています。

`$ vi Vagrantfile`

```
 Vagrant.configure(2) do |config|
     config.vm.box = "base"
 end
```

config.vm.boxで指定しているboxを使用して起動するということになります
内部に追加してBoxをしてすることでそれを使用して起動も行えます。

また、後ろにbox名を指定することにより初期値を変更することが可能です
> $ vagrant init {box name}

```lang:例
 Vagrant.configure(2) do |config|
     config.vm.box = "{box name}"
 end
```
## 主なコマンド
起動コマンド
`$ vagrant up`

起動確認
`$ vagrant status`

runningは起動中です。poweroffの場合はシャットダウン状態です。

```lang:例
Current machine states:
   default                   running (virtualbox)
(以下略)
```
起動しているマシンへsshでアクセス
`$ vagrant ssh`

起動しているマシンのシャットダウン
`$ vagrant halt`
Mariaexの接続時エラーをがんばってハンドリングする

ElixirのMariaDB/MySQLドライバで[mariaex](https://github.com/xerions/mariaex)というのがあります。

使い方は以下のような感じで難しくはないです。

```ex
{:ok, p} = Mariaex.Connection.start_link(username: "ecto", database: "ecto_test")
Mariaex.Connection.query(p, "CREATE TABLE test1 (id serial, title text)")
```

で、稼働時のエラー、たとえばSQLのSyntaxErrorやらDB落ちてるとかはいくらでもリトライなり、プロセスの再起動なりをすればいいんですが、DB名を間違えた…とかだと致命的なので即刻終了する必要があります。

```ex
IO.inspect Mariaex.Connection.start_link(database: "testx")
```
![スクリーンショット 2016-01-04 1.04.27.png](https://qiita-image-store.s3.amazonaws.com/0/20100/3804971d-d0d6-5c9b-2d5c-31ce4e468f11.png)

`case`文で`{:error, pid}`をハンドルすればいいかと思ったら、コンソールにエラーメッセージが。
まあエラーはいたり死んだりするのはいいんですけど、適切にエラーをハンドリングして整形したメッセージ出して終了したいんですよ。（loggerのフォーマットをいじるのも全体に影響するし、なんか対処が違う気が）

じゃあ`Process.monitor(pid)`してメッセージを捕まえようとしても`start_link`で死ぬのでどうにもこうにも。

GenServerでラップしたり、非同期にしたりといろいろやったんですが、最終的に以下のように。

```ex
# 要mariaex ~> 0.6.1

# 失敗時
Agent.start(fn ->
  Mariaex.Connection.start_link(database: "testx", sync_connect: true)
end)
#=> {:error,
#    %Mariaex.Error{mariadb: %{code: 1044,
#       message: "Access denied for user ''@'localhost' to database 'testx'"},
#     message: nil}}

# 成功時
{:ok, agent} = Agent.start(fn ->
  Mariaex.Connection.start_link(database: "test", sync_connect: true)
end)

{:ok, mysql} = Agent.get(agent, fn mysql -> mysql end)
Agent.stop(agent) # あるいはAgentにコネクション入れっぱなしにして使い続ける？

IO.inspect Mariaex.Connection.query(mysql, "SHOW VARIABLES")
```

その場でエラーハンドリングできるし、変なところにもメッセージを投げない！

…しかし無理矢理感があるような…

識者の方がいたらぜひご教授いただきたいです。


（なんとなーくstart_linkでfailする設計がよくない気もするんですが、mariaexの場合、start_linkと接続処理が明示的に分かれてない。`sync_connect: false`とやっても結局タイミングがあわないとpidをモニタリングする前に死ぬし）
Evernoteのノートをプレーンテキストで取得するAppleScriptハンドラ


* AppleScriptから取得できるノート内容はHTMLまたはENMLのみ
	* 最も有用なプレーンテキストでの取得はサポートされていない
		* プレーンテキストからノート作成はできるのに
* HTMLをプレーンテキストに変換するハンドラを作成
* ついでに`grep`を用いて必要な行だけ簡単に抽出できるように
	* 第2引数で正規表現を使って指定
	* 例：ノートの中で"abc"から始まる行だけ取得するには`^abc`


```applescript:plainContentOfNoteInEvernote.scpt
tell application "Evernote"
	set {aNote} to selection
end tell
return my plainContentOfNoteInEvernote(aNote, "^abc")

on plainContentOfNoteInEvernote(aNote, pattern as text)
	--pattern: 正規表現、grepでマッチした行を返す（使わない場合はpatternを""に、空行のみを除く場合はpatternを"."に）
	try
		return do shell script "osascript -e 'tell application \"Evernote\" to return HTML content of note id \"" & id of aNote & "\" of notebook 1' | textutil -convert txt -stdin -inputencoding UTF-8 -stdout -format html -noload | grep " & quoted form of pattern
	on error number 1
		return ""
	end try
end plainContentOfNoteInEvernote
```


## 更新履歴

* 2011-07-12: HTMLタグを取り除く形式で作成
* 2011-11-18: `textutil`で変換するように変更
* 2012-10-27: `echo`によるパイプからHTMLファイルを指定するように変更
* 2013-02-24: `grep`追加
* 2014-06-30: `textutil`のオプションに`inputencoding`と`format`を入れて文字化け防止
* 2016-01-03: HTMLファイルの指定から`osascript`によるパイプに変更
* 2016-01-04: `textutil`のオプションに`noload`を追加して動作高速化
* 2016-01-21: 必要ない`tell`ブロックを削除
Talend ESB Runtimeの起動でエラーメッセージが表示される件

## 概要

Talend ESB Runtimeの起動においてエラーが出力される.

## 環境

- CentOS 7.2
  - MacOS X 10.9/Vagrant/VirtualBox
- Java
  - OpenJDK 1.8.0_65
  - `yum install java` でインストールしたもの
- Talend ESB 6.1.0
  - TOS_ESB-20151029_1337-V6.1.0.zip

## 発生する事象

```
[vagrant@localhost Runtime_ESBSE]$ ./container/bin/trun
./container/bin/setmem: 70 行: [: -lt: 単項演算子が予期されます
        ______     __            __                 
       /_  __/__ _/ /__ ___  ___/ /                 
        / / / _ `/ / -_) _ \/ _  /                  
       /_/  \_,_/_/\__/_//_/\_,_/                   
        (version 6.1.0)                  

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or 'system:shutdown' to shutdown the TRUN.

karaf@trun()> Exception in thread "JMX Connector Thread [service:jmx:rmi://0.0.0.0:44444/jndi/rmi://:1099/karaf-trun]" java.lang.RuntimeException: Could not start JMX connector server
	at org.apache.karaf.management.ConnectorServerFactory$1.run(ConnectorServerFactory.java:272)
Caused by: java.io.IOException: The server has been stopped.
	at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:351)
	at org.apache.karaf.management.ConnectorServerFactory$1.run(ConnectorServerFactory.java:259)

karaf@trun()>
```

## 原因

- `./container/bin/setmem` の L.48 でJavaのマイナーバージョンが取得できず後続処理でエラーを吐いている.

```
JAVA_VERSION_MINOR=`$JAVA -version 2>&1 | grep "java version" | sed 's/^.*\".*\.\([^\.]\)\..*$/\1/'`
```

実際の`java -version`の出力は以下.

```
[vagrant@localhost Runtime_ESBSE]$ java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
```

なるほど、grepで引っ掛ける文字列を`java version`ではなく`openjdk version`とするべきということがわかる。

そこで以下のように修正.egrepを使い`java version`と`openjdk version`の両方にマッチするようにしてみる.

```
JAVA_VERSION_MINOR=`$JAVA -version 2>&1 | egrep "(java|openjdk) version" | sed 's/^.*\".*\.\([^\.]\)\..*$/\1/'`
```

再度Runtimeの起動を試みる.

```
[vagrant@localhost Runtime_ESBSE]$ ./container/bin/trun
        ______     __            __                 
       /_  __/__ _/ /__ ___  ___/ /                 
        / / / _ `/ / -_) _ \/ _  /                  
       /_/  \_,_/_/\__/_//_/\_,_/                   
        (version 6.1.0)                  

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or 'system:shutdown' to shutdown the TRUN.

karaf@trun()> 
```

無事起動できた.
スプレッドシートで株価管理するための google apps script 向け株式情報取得ライブラリ

自分が株価取得用に作ったgoogle apps scriptのスクリプトをライブラリ化したので紹介します。
これを定期実行の関数から呼び出して、株価の管理をしています。


## できること
- 株式が存在するか
- 現在の株価の取得
- 社名の取得
- 単元株式の取得
- 予想配当の取得
==> サイトにある情報ならmatch使って拡張すれば良いので今後は出来高なども取れるようにする予定

## github

https://github.com/uenoryoichi/googleAppsScript/blob/master/getStockData/GetStockData.gas

## 使い方

- ライブラリを読み込む
- 4桁の株式コードを引数に渡してfactoryでオブジェクトを作成してください

やっていることは単純でyahooスクレイピングしてmatch関数によってデータを取得している


## 改善していきたい点

- 上場廃止のものはページが存在しているので取得できてしまう
- 取得できるものがまだ限られている
- 今まで作ってきた他のスクリプトとの相性上、今回は一つ一つの値を返すようにしたが、連想配列を一括で返すほうが、ライブラリとしては良いのではないかと作ってて思った
Google apps script でGmailの下書き(draft)をつくるライブラリ

Google apps script でGmailの下書き(draft)をつくるライブラリを作成したので紹介します。

https://github.com/uenoryoichi/googleAppsScript/tree/master/createHTMLDraftInGmail

## 背景

Google apps scriptの標準関数だとメール送信はあるけど下書きが作れない！
Gmail APIを利用した形で実現出来たのでライブラリ化しました。

## 使い方

下記のような感じでbuildしてmake()で下書きが作成されます。

### project id

`M6iKsfeXXavjDNzz6EEFRBu141rqerMCH`

### example

```js
var MailLib = new createHTMLDraftInGmail();
MailLib.From('sample@example.com')
       .To('sample@example.com')
       .Title('title')
       .HtmlBody('body<br>test')
       .make();
```
React + Fluxを試した

年末年始1週間くらい片手間でReact + Fluxの勉強をしていた。正確にはGulpとかそういう基本的なパーツ全部からなんだけど……

https://github.com/dmiyakawa/react_gist_app

個人的な印象としてReact + Fluxの組み合わせは素人的にもかなり「アリ」だと思った。

感覚的に「MとVの状態二重管理をどうにかしてくれ」というのがMVCに対する不満としてずっとあったのだけど、React + Fluxにはそういう不満が起こらなかった。FluxのStoreに状態とロジックを詰め込まれていて、React層が「仮想DOM = React(Storeが持つ状態)」という純粋な関数みたいな存在に徹すると、この二重管理をReact自体が仮想DOMを経由して解決してくれる。

Reactを試す気になったきっかけは以下の記事による。

http://qiita.com/joe-re/items/3b6730eb90dbeb2f8272


ReactというよりはFluxという発想が良いかなぁと思う。React自体はAPIがまだ「生臭い」という気がしているので、そのラッパか、仮想DOMに基づく別のAPI層が登場するのが世の中の期待なのかなぁとなんとなく夢想した。

蛇足: JSXはDOMに見えるだけのインスタンス生成ユーティリティだと思えば良いので「生臭い」とは個人的に思わない。どっちかというとisMounted()にやられた。https://facebook.github.io/react/blog/2015/12/16/ismounted-antipattern.html
Androidアプリがリジェクトされた話


勉強がてらAndroidアプリを作ってリリースしました。
https://play.google.com/store/apps/details?id=com.tanatech.matome2

よくある2chのまとめアプリです。


100以上のまとめサイトのRSSを集めて定期的にチェックする作りにしています。
年末に意気揚々とGoogle Playにアップロードしたところ
Googleからこんなメールが・・・。

![[名称未設定].png](https://qiita-image-store.s3.amazonaws.com/0/31507/00b36a9e-06af-1eda-d264-4b6727e6baa5.png "[名称未設定].png")


WebViewで表示していたまとめサイトの広告にアダルト要素があったのが原因でリジェクトされてしましました。

GooglePlayではリジェクトされてしまうと異議申し立てをしてGoogleがアプリを復活させてくれない限りコンソールでの操作は一切できなくなってしまいます。

パッケージ名を変更して新しいアプリとして再度ストア情報などを入力してアップロードし直すほかありません。

iTunesConnectのようにリジェクト後に修正ができないため
まとめアプリ的なものを作るときはそれ相応の対策をしないとダメそうです。

申請がないからAndroidアプリならiPhoneアプリより公開しやすいだろうと安易な考えだったのでまさかリジェクトをされるとは思いもしませんでした。
AndroidアプリもiPhoneアプリ同様にリジェクトに対する意識を持たないといけません。
特にアダルト系にはGoogleも厳しくなっているようです。
Bonfire: title case a sentence、string.charAt(x)とstring[x]の違い

#課題内容
`str`値としていれた単語もしくは文章の最初の一文字を大文字にして返す関数を作れという問題。ちなみに普段なら"the"や"of"などは大きくしないが今回はそれも考慮することになっている。

```
function titleCase(str) {
  return str;
}

titleCase("I'm a little tea pot");
```

##Give it a shot
[ここ](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/bonfire-title-case-a-sentence)を参考にとりあえず書いてみた。

```
function titleCase(str) {
	str = str.toLowerCase().split(" ");
	for (var i = 0; i < str.length; i++) {
		str[i] = str[i].split("");
		str[i][0] = str[i][0].toUpperCase();
		str[i] = str[i].join("");
	}
	return str.join(" ");
}
titleCase("I'm a little tea pot");
```
手順としては、
1. 引数としてもらってきたstrを全て小文字にしてスペースで区切ってその単語を1つずつ`array`に入れる
2. `for loop`でarrayの長さ分だけ（5回分＝区切った単語数）以下の処理を行ってもらう
3. 先程arrayに入れた単語を今度は一文字ずつsplitして別のarrayに入れる（＝array階層の下にもう一つarrayをつくる感じ？）
4. そのarrayの最初の一文字(=`str[i][0]`)を大文字変える
5. `str[i] = str[i].join("")`で大文字の一文字`array`を最初に作った単語`array`とくっつける
6. 最後に`str.join(" ")`で作り上げた材料を全てスペース付きでくっつけて`return`させる

*[全く同じことを紹介している記事](http://wulkan.me/title-case-a-sentence/)を発見。より懇切丁寧に解説してくれています。

##Alternative#1
他の解答方法も勉強になったので載せておきます。

```
function titleCase(str) {
	str = str.toLowerCase().split(' ');
	for (var i = 0; i < str.length; i++) {
		str[i] = str[i].charAt(0).toUpperCase() + str[i].substring(1);
	}
	return str.join(' ');
}
titleCase("I'm a little tea pot");
```

###charAt(x)って？string[x]との差異は？
`charAt`は指定した`string`を返してくれる返してくれるメソッド。概要は[こちら](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt)を参考に。`string.charAt(x)`と`string[x]`の違いがいまいち分からなかったのでぐぐってみたら[こんな質問](http://stackoverflow.com/questions/5943726/string-charatx-or-stringx)を見かけた。どうやらIE7では`str[x]`に対応していないらしくエラー表示されてしまうらしい。一度こちらの方法で書いてしまうと後で直すのに相当な苦労を強いられるとか。よって`charAt(x)`を使ったほうが安全だそう。ソースとして[こちらのサイト](http://blog.vjeux.com/2009/javascript/dangerous-bracket-notation-for-strings.html)が紹介されていたので興味のある方はぜひ。今回のケースではcharAt(x)のほうがわざわざarrayの中にarrayをつくるという手間が省けて楽そう。

###substring()とは？
一言で言うと「選択した範囲の文字を引っ張ってきてくれるメソッド」とでも言うのだろうか。`var str = "hello world";`に対して`var str2 = str.substring(3);`とやると`lo world!`と返ってくる。もしくは`var str3 = str.substring(4, 1);`のようにひとつ目の引数が２つ目の引数より大きい場合は自動的にひっくり返して`ell`と返してくれる。引数が0以下の場合は0としてみなされストリングをまるごと返す。詳しくは[こちら](http://www.w3schools.com/jsref/jsref_substring.asp)を参照。

つまり`str[i] = str[i].charAt(0).toUpperCase() + str[i].substring(1);`一箇所で上記で３行文の仕事をしてくれるわけだ。`str[i].charAt(0).toUpperCase()`で最初の一文字を大きくして残りの単語`str[i].substring(1)`とくっつけてしまうと。

##Alternative#2
正規表現を使ってもっと短くすることも可能。

```
function titleCase(str) {
	str = str.toLowerCase();
	str = str.replace(/(^[a-z]|\s[a-z])/g, function(c){return c.toUpperCase();});
	return str;
}
titleCase("I'm a little tea pot");
```

![Screen Shot 2016-01-03 at 7.40.46 AM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/9480ec51-4a54-2bb4-449c-00466d98724a.png)
02 - How to configure iptables


```bash
#!/bin/sh

# On vide les règles déjà existantes
iptables -t filter -F
iptables -t filter -X

# On refuse toutes les connexions
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
echo "On interdit tout"

# On autorise les connexions déjà établie
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# On autorise le loop-back (localhost)
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

# On autorise le ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# On autorise le SSH (à adapter suivant votre cas)
iptables -t filter -A INPUT -p tcp --dport 1989 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 1989 -j ACCEPT

# On autorise transmission webclient
iptables -t filter -A INPUT -p tcp --dport 9091 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 9091 -j ACCEPT

# allow torrent on 51413
iptables -t filter -A INPUT -p tcp --dport 51413 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 51413 -j ACCEPT

# Si on a un serveur DNS
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

# NTP (pour avoir un serveur à l'heure)
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

# HTTP
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT

# FTP
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# MAIL
## SMTP
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
## POP3
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
## IMAP
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
echo "trafic IMAP sur le port 143 autorisé"
## POP3S
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT

```

```
sudo vim /etc/init.d/firewall
sudo chmod +x /etc/init.d/firewall
sudo update-rc.d firewall defaults
```
瞬き星


変形オセロ. 本当はLINESをハードコーディングせずに書くべきだったと思う.
あと, 指定された点以外に共有点を持つような2曲線だった場合に死ぬ. この場合は反転すべき点一覧を別途保持するしか無いと思う.

```rb:tyama_esm2.rb
#!/usr/bin/env ruby
#https://gist.github.com/mattsan/07674b095908fda117a0

LINES=['AFGD','AJIC','BJFE','BIHD','CHGE']

def dfs(line,d,cur,color)
	return false if cur==-1||cur==line.size
	return true if $colors[line[cur]]==color
	$colors[line[cur]]=color if dfs(line,d,cur+d,color)
end
		
if __FILE__==$0
	while gets
		$colors=Hash[*('A'..'E').flat_map{|e|[e,0]}+('F'..'J').flat_map{|e|[e,1]}]
		$_.chomp.chars{|c|
			$colors[c]^=1
			LINES.each{|l|
				idx=l.index(c)
				if idx
					dfs(l,1,idx+1,$colors[c])
					dfs(l,-1,idx-1,$colors[c])
				end
			}
		}
		puts ('A'..'J').map{|e|'WR'[$colors[e],1]}*''
		STDOUT.flush
	end
end
```
星めぐり


reduce 1発.
先頭要素がreduceのseedになることを活かして書けた.

```rb:tyama_esm2pre.rb
#!/usr/bin/env ruby
#https://gist.github.com/mattsan/38a752dca30423902b0a

T={
	'A'=>{'R'=>'H','W'=>'I'},
	'B'=>{'R'=>'D','W'=>'G'},
	'C'=>{'R'=>'J','W'=>'A'},
	'D'=>{'R'=>'F','W'=>'I'},
	'E'=>{'R'=>'B','W'=>'C'},
	'F'=>{'R'=>'H','W'=>'A'},
	'G'=>{'R'=>'D','W'=>'E'},
	'H'=>{'R'=>'J','W'=>'C'},
	'I'=>{'R'=>'F','W'=>'G'},
	'J'=>{'R'=>'B','W'=>'E'},
}
if __FILE__==$0
	while gets
		puts $_.chomp.chars.reduce{|s,e|s<<T[s[-1]][e]}
		STDOUT.flush
	end
end
```
Androidでリスト操作するなら、Lightweight-Stream-APIが便利

↓こちらです。
aNNiMON/Lightweight-Stream-API
https://github.com/aNNiMON/Lightweight-Stream-API

#Android（Java7）
Java8から導入されたStream API、Androidでは使うことが出来ません。
なのでこんなコードを書いてしまうことも

```java:java7
// 生徒の中からidが10より大きい生徒の名前のリストを取得
List<String> names = new ArrayList<>();
for (Student student : students) {
   if (student.id > 10) {
      names.add(student.name);
   }
}
```

#RxJava
そんな折、RxJavaでリスト操作を代用することも

```java:RxJava（retrolambda使ってます）
// 生徒の中からidが10より大きい生徒の名前のリストを取得
List<String> names = Observable.from(students)
                     .filter(student -> (student.id > 10))
                     .map(student -> student.name)
                     .toList().toBlocking().single();
```
for文とif文がなくなっていいかんじ。
でもRxJavaっていろんな機能があるし、リスト操作のためだけに入れるのもなぁ…

#Lightweight-Stream-API

```java:Lightweight-Stream-API（retrolambda使ってます）
// 生徒の中からidが10より大きい生徒の名前のリストを取得
List<String> names = Stream.of(students)
                     .filter(student -> (student.id > 10))
                     .map(student -> student.name)
                     .collect(Collectors.toList());
```
うん、いいかんじ
Java8のStream APIで出来ることもほとんど出来るっぽい

サンプルプロジェクトもあります。
https://github.com/aNNiMON/Android-Java-8-Stream-Example
メモ：TensorFlowでCSVファイルを読む

#メモなので、いきなり本題へ

TensorFlowでCSVファイルを読む方法は、[公式チュートリアル](https://www.tensorflow.org/versions/master/how_tos/reading_data/index.html#file-formats)に書いてあるのですが、ちょっとわかりづらい。

まず、話の前提として、TensorFlowは非同期処理をQueue（キュー）で管理してます。これは、複数のスレッドで処理を行う際に、決められた順番で処理を行うのに有用です。つまり、たくさんある書類を複数の事務員が処理する時、それらを床に散らかして事務員が適当に書類を拾って処理するのではなく、書類を一つの山に積んでおき、各事務員が下から書類を取ってどんどん処理するイメージです（詳しくは、[公式を参照](https://www.tensorflow.org/versions/master/how_tos/threading_and_queues/index.html)）

このキューによる処理が、ファイルの読み書きでも使われてます。たとえば、

```text:csvTest.csv
0,1,2,3,4,5
10,20,30,40,50
```
というCSVファイルを読む、以下のコードを考えます。CSVファイルは、Docker containerにマウントしているフォルダのtensorflow_dev以下にあります。

```
>>> import tensorflow as tf
>>> filename_queue = tf.train.string_input_producer(["/tensorflow_dev/csvTest.csv"])
>>> reader = tf.TextLineReader()
>>> key, value = reader.read(filename_queue)
>>> sess = tf.Session()
>>> tf.train.start_queue_runners(sess)
>>> sess.run(value)
'0,1,2,3,4,5'
>>> sess.run(key)
'/tensorflow_dev/csvTest.csv:2'
>>> sess.run(value)
'0,1,2,3,4,5'
>>> sess.run(value)
'10,20,30,40,50,60'
```

ここでは、

- ２行目のtf.train.string_input_producerでキューにファイル名を登録します。
- 次の行のreader = tf.TextLineReader()でreaderノードにTextLineReader()の機能を割り当てます。
- 次の行のreader.readメソッドでfilename_queueに指定されたファイルから、1行分を読み出し、 その内容をvalueに、ファイル名と行数に関する情報をkeyに与えるようにします。
- 6行目のtf.train.start_queue_runnersでqueue runnerを開始し、グラフ内のキューが使えるようにします。
- 7行目のsess.run(value)で、最初の行の値を読み出します。その結果、'0,1,2,3,4,5'というアウトプットが得られます。
- 次のsess.run(key)で、２行目を読み出し、その情報が'/tensorflow_dev/csvTest.csv:2'として出力されます。
- 次のsess.run(value)では、最初の行に戻って'0,1,2,3,4,5'が出力されます。それをもう一度行うと、'10,20,30,40,50,60'が出力されます。

sess.runを実行するたびに、読み出す行が一つづつ移動するので、注意してください。

## 改行について
tf.TextLineReader()は、改行として`¥n`しか受け付けないようです（[参考](https://github.com/tensorflow/tensorflow/issues/633)）。特に、Windowsで作業している方は注意してください。
ログイン画面、phpによるログイン処理の作成

正月の空き時間でphpの勉強がてらログイン処理をhtmlとphpで書いてみたのでその忘備録として投稿。
まだ途中でお恥ずかしい状態です。汗

#目次
１、ログイン画面の作成
２、入力値を受け取り正誤判定
３、cookieを用いて設定時間内、自動ログイン


##１、ログイン画面の作成
まず先に完成画面とphpコードです。

<img width="259" alt="スクリーンショット 2015-12-30 16.06.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/89465/fa4871f0-680b-5135-4e69-eecdbed0512b.png">


```html:loginlhtml
<html>
    <head>
        <title>ログイン</title>
    </head>
    <body>
        <form action="session1.php" method = "post">  //（１）
            ユーザーネーム<input type ="text" name="username" value = ""><br />   //（２）
            パスワード<input type = "text" name="pass" value = ""><br />
            <input type="submit" name ="login" value = "ログイン">   //（３）
        </form>
    </body>
</html>
```
###解説
画面は「ユーザー名」と「パスワード」を入力して「ログインボタン」をクリックしてログインする単純なものを作成します。

（１）formタグについて
画面を作成するためにformタグを用います。formタグの中にユーザー入力のためのコントロールを作成して、formタグのaction属性で指定したファイルにユーザの入力データを飛ばすことができます。method属性は後で説明します。
`<form action="session1.php" method="post">`

（２）入力テキストボックス
formタグの中にテキスト入力のためのテキストボックスを設置します。
inputタグのtype属性で"text"を指定するとテキストボックスになります。
`ユーザーネーム<input type="text" name="username" value =""><br />`

（３）情報送信ボタン
formタグの中の入力コントロールに入力された情報を送信するためのボタンを設置します。
inputタグのtype属性で"submit"を指定すると入力値送信ボタンになります。
ボタンが押されると、formタグのaction属性で指定しているphpファイルに情報を送信します。
`<input type= "submit" name="login" value = ""><br />`


##２、入力値を受け取り正誤判定


```php:session1.php
<?php
session_start();
$_SESSION["loginname"] = $_POST["username"];
$_SESSION["pass"] = $_POST["pass"];

if($_SESSION["loginname"] != "komuro" || $_SESSION["pass"] != "pass"){
    ?>
    ログインに失敗しました。<br />
    <a href="login.html">セッション生成ページ</a>
    <?php
    exit;
}
if(isset($_POST["username"])) setcookie("username", $_POST["username"], time()+120);
?>
会員専用画面です。<br />
ログイン認証に成功しました。現在ログインしている状態です。<br />
<a href="cookie.php">マイページへ</a>
会員専用画面です。<br />
ログイン認証に成功しました。現在ログインしている状態です。<br />
<a href="cookie.php">マイページへ</a>
```

###解説
ここではまず
（１）セッションを開始
（２）ユーザー入力データを$_SESSION配列に格納
（３）ユーザー入力データを正誤判定して会員ページを表示またはログイン画面表示

`_POST["username"]`変数は前ページでユーザーが入力した名前です。
phpで定義されているスーバーグローバル変数というものです。

前ページでformタグの中に２つのテキストボックスを設置してname属性を"username""pass"に設定していますが、_POSTの連想配列に入力データが入ります。
AndroidStudioでAPKファイルを作るとき、DebugはできるがReleaseでエラーになる場合の対処方法

AndroidStudioでAPKファイルを作るとき、DebugはできるがReleaseで以下のエラーが出力されビルドできず、嵌ってしまったので対処方法を書いておく。
Error:(13) Error: This class should provide a default constructor (a public constructor with no arguments)

上記エラーメッセージによると対象のクラスにデフォルトコンストラクターを書けといっているようだが、対象のクラスはSQLiteOpenHelperを継承しており、デフォルトコンストラクターは作成できない。全く意味がわからず時間を空費してしまったが以下の方法で対処できた。

参考にしたサイト。
http://stackoverflow.com/questions/29046829/error-building-signed-apk-in-android-studio-this-class-should-provide-default-c

appの配下にあるbuild.gradle内に


```
　lintOptions {
    abortOnError false
　}
```
releaseではエラーがあるとビルドを途中でやめてしまうらしいので、上記のオプションでそれを防ぐとのこと。
<input type="file">でディレクトリを丸ごと送信したい

## 概説
`<input type="file" multiple>`で[複数ファイルを同時に選択して送信することが可能](http://www.w3schools.com/tags/att_input_multiple.asp)ですが、ここでは以下のようなディレクトリ構造を丸ごと送信する方法を説明します。

```
top
├ test.html
└─ second
    ├─ test.html
    └─ third
        └─ test.html
```

## やり方
webkitdirectory属性を指定するだけ。ただし、ベンダープレフィックスがついていることから分かるように今のところこの指定方法はChromeでのみ動作するようです。将来的にはベンダープレフィックスが外れて、`<input type="file" directory>`のようになるんだと思います。

```html:HTML
<input type="file" name="upfile[]" webkitdirectory>
```

## サーバー側(PHP)ではどのように値が渡ってくるのか？
`<input type="file" name="upfile[]" webkitdirectory>`のファイル選択画面で↑で説明したディレクトリの「top」を選択して送信した場合、$_FILESには以下のように値が渡ってきます。

```php:var_export($_FILES['upfile']['name'],1)の結果
array (
  0 => 'test.html',
  1 => 'test.html',
  2 => 'test.html',
)
```

```php:var_export($_FILES['upfile']['tmp_name'],1)の結果
array (
  0 => '/tmp/phpaNxASP',
  1 => '/tmp/php5yTfGo',
  2 => '/tmp/phpT2sVtX',
)
```

なお、`<input type="file" multiple>` で複数ファイルを送信した場合も同じような形式で情報が渡ってきます。

注意点は以下の2点

1. $_FILES['upfile']['name']にはファイル名のみが渡ってくるため、同名ファイルの場合に区別がつかない。
2. 階層構造の情報は渡ってこない。

## 階層構造の情報を送信したい場合

クライアント側で「[webkitRelativePath](http://jsfiddle.net/Sapphion/HcD9c/)」というファイルオブジェクトのプロパティが取得可能なので、これをPOSTデータに含めて一緒に送信し、サーバー側でゴニョゴニョしてあげると良いと思います。

## php.iniでの注意点
アップロード時にディレクトリを指定するということは、たくさんのファイルを同時に送信することが可能ということですので、php.iniの[最大サイズ](http://php.net/manual/ja/ini.core.php#ini.upload-max-filesize)や[ファイル数の上限](http://php.net/manual/ja/ini.core.php#ini.max-file-uploads)などの設定値に注意しておく必要があります。

```ini:php.ini
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
```

ファイルの総サイズについては、「$_FILES['upfile']['size']」の配列のすべての値を加算することで算出可能です。

また、総ファイル数をチェックする場合は、「count($_FILES['upfile']['name'])」のように配列の要素数で確認できます。

## 参考URL
- [[HTML5]Chromeにてアップロードファイルにフォルダを指定するinputタグの記述例](http://d.hatena.ne.jp/nakamura001/20111102/1320256227)
【ver2.1.1】CentOSにElasticSearchを入れて起動するまで

[ElasticSearch](https://www.elastic.co/products/elasticsearch)はよく[solr](http://lucene.apache.org/solr/)と並べて全文検索としてあげられるが、ElasticSearchは分析なども行う方針らしい。
なので今回からElasticSearchの導入からMysqlからデータを突っ込んで実際に集計するところまでを何回かにわけて投稿します

## まず導入編
こういった導入してみた系の記事をよく見かけるが
本家が一番正しい情報をいっているはずだし情報も新しいはず
なので本家のリンクをペタペタ貼っていく

## 概要
CentOS6.5を用意してそれに対してES2.1.1をいれていく。
導入はRPMやZIPなど色々な方法があるが今回は`yum`でお手軽導入していく

## 導入手順
[公式にすべて](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html#_yum)が記載してある
下記は上記のリンクからコピペしてきた

1。 `rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch`
2。 `/etc/yum.repos.d/`配下にelasticsearch.repoなど適当な名前をつけて保存する

```
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
```
3。 インストール
`yum info elasticsearch`で希望のバージョンが存在するかを確認してinstall!

4。ちなみにjavaが入っていないと怒られます
  
  * 下記でrpmをダウンロードしてきて`rpm -ivh ****.rpm`でインストール
 
```
wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/********/jdk-****-linux-x64.rpm
```

## 最終確認
```
$ curl localhost:9200
{
  "name" : "Pitt",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.1.1",
    "build_hash" : "40e2c53a6fasdfsafsafaf450e66f4375bd71",
    "build_timestamp" : "2015-12-15T13:05:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.3.1"
  },
  "tagline" : "You Know, for Search"
}
```

## 終えてみて
導入自体はそんなに躓くことはない。おそらく厳しいのはこっからだろう
underscoreコードリーディング（union）


underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##unionとは


###[underscorejs.orgのunion](http://underscorejs.org/#union)

こんな説明。
>####_.union(*arrays) 
Computes the union of the passed-in arrays: the list of unique items, in order, that are present in one or more of the arrays.


```javascript

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2, 3, 101, 10]

```
------------- 
渡されたarraysの和集合を計算します。つまり、1つ以上あるarraysの中に存在する、ユニークな値のリストを返します。


###[underscore.union](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L549)
コード的にはこのあたり。

```javascript

 // Produce an array that contains the union: each distinct element from all of
  // the passed-in arrays.
  _.union = function() {
    return _.uniq(flatten(arguments, true, true));
  };

```


_.uniqにflattenを渡している。
_.uniqは名前の通りユニークな値のみを返す。
flattenは_.flattenでも利用されているように、複数の配列を1つの配列にまとめる。
flattenは(input, shallow, strict, startIndex)と4つの引数を持つ関数で
第一引数のargumentsは_.unionに渡されたarraysが格納されている。
shallowは階層化されている配列が渡ってきた場合にはflattenしない方がいいためtrue
strictは、配列以外の値が入っている場合などにflattenが返してくる返り値には含まないほうが良いためtrueで渡している。

つまり、渡された*arraysはflattenを用いて1つの配列に格納しなおした後、_.uniqを用いてユニークな値のみに整形し、返している。
JRubyFXで画像を押すと動作するリンクを作りたいとき

# 前書き
JRubyFXって何？
jruby + JavaFX
rubyっぽくかけるが、ローカルではJVMの`write once, run anywhere`の利益を享受できる素晴らしいフレームワーク。

# 今回やりたいこと。
画像リンクや画像をおすと実行される動作を動的に定義したい。

# 本題
buttonに`set_graphic`でimage_viewを入れる。
image_viewはimageをいれる入れ物なので大したことは書かない。
imageには`resource_url :images`で指定したパスをとファイル名をいれる。

```rb 
  include JRubyFX::Controller

  def make_image_button(file_name, image_button_id, action, width, height)
    button(id: image_button_id, on_action: action, width: width, height: height) do
      set_graphic(image_view(image(resource_url(:images, file_name).to_s)))
    end
  end
```


生成されるfxmlはこんな感じ

```xml
<Button onAction="(action名)" ...>
  <Graphic>
    <ImageView ...>
      <Image ... />
    </ImageView>
  </Graphic>
</Button>
```

画像をおすと`onAction`で指定された`action`を実行する。
これで目的は果たされた。
「瞬き星」を解いた


第2回 ESM オフラインリアルタイムどう書く( http://d.hatena.ne.jp/E_Mattsan/20151230/1451449205 )の問題
「瞬き星( https://gist.github.com/mattsan/07674b095908fda117a0 )」を解いた。

※ 初出時、問題名を間違えてましたすいません。

良問だと思う。

所要時間 31分。ちょっとくやしい。

で。

私の実装。

```ruby
M=%w( AJIC CHGE EFJB BIHD DGFA ).map{ |x| "__"+x+"__"}

def try_filp( st, st0, line, ix, dir )
  me=st[line[ix]]
  if me==st0[line[ix+dir*2]]
    st[line[ix+dir]]=me
  elsif me==st0[line[ix+dir*3]]
    st[line[ix+dir]]=me
    st[line[ix+dir*2]]=me
  end
end

def process( st0, pos )
  st=st0.dup
  st[pos]^=1
  M.each do |line|
    ix=line.index(pos)
    next unless ix
    dir = [0,0,1,1,-1,-1][ix]
    try_filp( st, st0, line, ix, dir ) if st[pos] != st[line[ix+dir]]
  end
  st
end

def solve(src)
  st=[*?A..?E].each_with_object({}){|x,o|o[x]=1}
  [*?F..?J].each{|x| st[x]=0}
  src.each_char do |c|
    st=process(st, c)
  end
  [*?A..?J].map{ |x| st[x]==1 ? "W" : "R" }.join
end

DATA.map{ |line|
  src, expected = line.split(/\s+/)
  actual = solve( src )
  ok = actual==expected
  puts( "%s : %s->%s / %s" % [ (ok ? "ok" : "**NG**" ), src, actual, expected ] )
  ok
}.tap{ |x| puts( x.all? ? "all ok" : "something wrong" ) }

__END__
A RWWWWRRRRR
FGHIJABCDE  RRRRRRRRRR
```

いつも通り、テストデータの大半は省略。

31分経過時点のコードそのまま。
まだリファクタリングしていない。

もっと楽に書けたはずだなぁと、書き上がってから思ったり。
フリップをしていく部分とフリップ前の状態を別に持つ必要があるような気がしていたんだけど、不要だった模様。st0 が無駄。
`M` の初期化と `dir` の初期化が汚い感じ。Array にメソッド生やしたほうがよかったか。
グラフのサイズに依存しまくりの `try_filp` も品がない感じ。
Ethereumでコントラクトの監視 - Event -

### （注）変更点: 2018.10.18

- 記事内容が古かったため、イベント発火の記法について現在のバージョン([solidity v0.4.16](https://github.com/ethereum/solidity/tree/v0.4.25))に対応しました。
 イベント発火には `emit EventName(...)`のようにemitを明示的につけることが推奨されているようです。

- 本文中で使用しているCosmo Editorは、現在では使われてないようですので、 [Remix](https://tomokazu-kozuma.com/develop-ethereum-contract-with-browser-solidity/)などを使うことをオススメします。

## Solidityによるスマートコントラクトの監視

今回はSolidityのコードを書いてメソッドを実行、そして実行の監視をしてみます。

* Solidityの詳細解説ページ
http://solidity.readthedocs.org/en/latest/contracts.html#events

* Ethereum JavaScript API document(eventメソッド）
https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events

試すコントラクトはこちら↓

```SimpleStorage.sol
contract SimpleStorage {
    bytes32 storedData;
    //イベント設置
    event Set(address from,bytes32 stored);

    function set(bytes32 x) {
        storedData = x;
        
        //イベント発火
        Set(msg.sender,x);
    }
    function get() constant returns (bytes32 retVal) {
        return storedData;
    }
}    

```

###イベント定義部分
```
 event Set(address from,bytes32 stored);
```

setメソッドに付随するイベントを定義

引数は任意の変数。ここに書いた変数の値がイベント発火時に渡される

###イベント発火部分

```
    function set(bytes32 x) {
        storedData = x;
        
        //イベント発火
        emit Set(msg.sender,x);
    }
```
ここではSet()に値を渡す。第１引数msg.senderはメソッド呼び出し元のアドレス,xは与えた値


#イベント監視
```event-watch.js
var Web3 = require('web3');
var web3 = new Web3();

web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545");

//simplestorageのABI
var ABI = require('./simplestorage.json');

//デプロイしたアドレス
var address = '0xf9f0ce2e38fbe115d2500606ebd7750f8876c8cc
';

var simpleStorage = web3.eth.contract(ABI).at(address);
var event = simpleStorage.Set();
//イベント監視
event.watch(function (error, result) {
 console.log('watching "Set" event!');
  if (!error)
    console.log(result);
});

```

##[cosmo editor](http://meteor-dapp-cosmo.meteor.com/)を使用したデプロイ
![160103-0001.png](https://qiita-image-store.s3.amazonaws.com/0/80546/f75d133b-b3d8-c9c9-082e-b298ddfd6cf5.png "160103-0001.png")

```
//ローカルのコマンドラインでイベント監視スクリプト実行
node event-watch.js
```


##cosmoからsetメソッドで値をセットする。
"hello eth!"をsetする。(transactionの送信）

![160103-0003.png](https://qiita-image-store.s3.amazonaws.com/0/80546/b2715290-95fa-a317-ad7b-42e78d06438c.png "160103-0003.png")



##数十秒待つとターミナルでSetイベントが表示された！！

![160103-0004.png](https://qiita-image-store.s3.amazonaws.com/0/80546/86d82321-d0ed-f527-839d-55b7f7ddee15.png "160103-0004.png")

argsの中身が送信内容
fromが送信元アドレス ,storedが変数に保存した値。

```
args: 
   { from: '0x2a595f16eee4cb0c17d9a2d939b3c10f6c677243',
     stored: '0x68656c6c6f206574682100000000000000000000000000000000000000000000' }
```

このままだと16進数なので、ASCIIコードに変換してみると・・・・
![160103-0006.png](https://qiita-image-store.s3.amazonaws.com/0/80546/ad556c66-da0c-e805-52a0-654a2013ac8c.png "160103-0006.png")


"hello eth!"と表示されました。

トランザクションはこちらでも確認できます
https://www.etherchain.org/account/0xf9f0ce2e38fbe115d2500606ebd7750f8876c8cc#txreceived


以上がコントラクトのイベント監視の流れです。他にもAPIにはfilterなどのメソッドで同様の機能があるようです。
「１」「４」「５」を適当に並べて「114514」が完成したら喋るバッチファイル

　（淫夢要素は）ないです。

　●1,4,5をランダムに表示して、114514と順に並んだら機械音声が「いいよ！来いよ！」と言います。
　●114,514の回数も個別に数えています。
　●ランダムと言いつつ、**同じ数字が３つ並ばないようになっています。**
　　そうしないと10000字とか行っても終わらないので…。

```bat:114514.bat
@echo off
setlocal enabledelayedexpansion
mode con cols=52 lines=46

:Top
cls
color 0F
set /a loop=0,loop2=0,result1=0,result2=0,result3=0,judge=999,judge2=0

:Main
set /a loop+=1,loop2-=1,judge3="!loop!"%%50
call :RndGenerate num[%loop%]
if %judge3% == 0 echo.
set /p <nul=!num[%loop%]!
set judge=!judge:~1!!num[%loop%]!
if %judge% == 114 set /a loop2=3,result1+=1
if %judge% == 514 if %loop2% == 0 goto Finish
if %judge% == 514 if %loop2% neq 0 set /a result2+=1
set judge2=0
if %judge:~1% == 11 set judge2=1
if %judge:~1% == 44 set judge2=4
if %judge:~1% == 55 set judge2=5
goto Main

:Finish
color 65
call :Voice 良いよ！来いよ！
echo.
echo.
echo 総文字数：%loop%
echo    114数：%result1%
echo    514数：%result2%
pause >nul
goto Top

:RndGenerate
set /a num=%random%*3/32768
if %num% == 0 set %1=1
if %num% == 1 set %1=4
if %num% == 2 set %1=5
if !%1! == %judge2% goto RndGenerate
exit /b

:Voice
echo CreateObject^("SAPI.SpVoice"^).Speak"%1">sp114514.vbs
cscript //nologo sp114514.vbs
del /q sp114514.vbs
exit /b
```
CoreLocationで領域外に出ずともすぐに領域内検知できるようにする

これは小技です。

CoreLocationでiBeaconを使って(あ、別にiBeacon関係ないか)領域内に入った、出たってのを検知できると思いますが、なぜかiOSの場合は領域を出たってのを検知するまでに20秒くらいかかります。

おそい！！って思ってついカッとなって、

```objc
[self.manager stopMonitoringForRegion: self.region];
[self.manager startMonitoringForRegion: self.region];
```

としたらすぐにまた領域の検知を開始して、`didExitRegion`してなくても`didEnterRegion`が呼ばれました。。。

やりたい処理が終わったあと、↑みたいにstop & startするといいと思います。

まあこれが良い使い方かわかりませんが、これが便利な場合もあったということで。
iOS8系ではperformance.now()が使えない


iOS9系からは使えるようになっていますが、iOS8系ではperformance.now()が使えないので注意が必要です。
ちなみに、requestAnimationFrameの第一引数にてperformance.now()と同等の値を受け取ることができ、
こちらは問題なく動くようです。
OS X El Capitan‎ で phantomjs をインストールする

# 概要
- homebrewでphantomjsをインストールできない問題が発生

```
$ brew install phantomjs
phantomjs: This formula either does not compile or function as expected on OS X
versions newer than Yosemite due to an upstream incompatibility.
Error: An unsatisfied requirement failed this build.
```

# 原因
- こちらの記事に乗っていました
- http://qiita.com/sato_ryu/items/227b00df1e2b5690a816

# 対策
- でも、バイナリから入れるのはちょっと抵抗あるなぁと思っていろいろ調べたらこんな記事が
- https://github.com/Homebrew/homebrew/issues/44535

- どうやら、npm経由でインストールできるとのこと

```
brew install npm # 入っていない方のみ
npm install phantom phantomjs -g
```

# 結果
- 無事インストールされました

```
$ phantomjs -v
1.9.8
```
- v2.0は入らないのは時間があるときに調査ということで〜
[Swift]Swiftの勉強のためにToDoアプリを作ってみた


いい加減Swiftの勉強をしないといけないなーと思ったので、以前友人から教えてもらったSwiftでToDoアプリを作るチュートリアルのサイトを参考にして、ちょっと書いてみることにした。

参考：[Swiftで作るToDoアプリ開発チュートリアル](http://easyramble.com/swift-todo-app-tutorial.html)


チュートリアルの通りにやって、うまくいかなかったところを挙げておく。

##1. file not found errorがいっぱい

これは原因がはっきりしていて、ファイルパスを通したあとに、ファイルを移動したから。
すごく初歩的なミスだけど、それゆえにちょっと悩んだ。
情けない。

##2. CoreData+MagicalRecord.h file not found と怒られた

ググって調べたらMagicalRecordのバージョンが変わって、ファイル構成が変わったことが原因とのこと。

[CoreData+MagicalRecord.h file not found](http://stackoverflow.com/questions/31026809/coredatamagicalrecord-h-file-not-found)

修正するところは

```
#import "CoreData+MagicalRecord.h"
```

を

```
#import "MagicalRecord.h"
```

と書き換えればOK。

##3. Downcast from 'UITableViewCell?' to 'UITableViewCell' only unwraps optionals; did you mean to use '!'? と怒られた

どうやらXcode7から`dequeueReusableCellWithIdentifier`は常に非オプショナル型を返すようになったらしい。

修正するところは

```
let cell = tableView.dequeueReusableCellWithIdentifier("TodoListItem") as! UITableViewCell
```

を

```
let cell = tableView.dequeueReusableCellWithIdentifier("TodoListItem")
```

と書き換えればOK。

オプショナルうんぬんはややこしい。

-

そのほか、細かい微修正は必要だったけど、ほぼほぼ問題なく実装完了。
Swift、今年は本腰入れて書いていきたいと思う。

今回のソースコードはGithubにアップしておいた。
微修正の部分の参考になれば。

https://github.com/macneko-ayu/SwiftPractice/tree/master/TodoApp
Macで隠しファイルを表示する方法

### Macで隠しファイルを表示する方法

.bash_historyとかのドットファイルをFinderでも表示させる。
defaultsコマンドを使うとできるらしい。
（defaultsはplist(プロパティリスト)と呼ばれる設定ファイルの設定値を変更するコマンド）

```shell-session
$ defaults write com.apple.finder AppleShowAllFiles TRUE
## 確認
$ defaults read com.apple.finder AppleShowAllFiles
TRUE
```

次のコマンドでFinderを再起動して設定を反映。

```shell-session
$ killall Finder
```

sierraからは`.DS_Store`と`.localized`はこの方法でも表示されなくなったようです。

### 環境

* OS X El Capitan version 10.11.2
* macOS Sierra version 10.12.1

### 参考サイト

* Finderで隠しファイル・フォルダを表示 - Mac
http://pc-karuma.net/mac-finder-show-all-files/

* Macギークなら知っておきたいdefaultsコマンドの使い方
http://tukaikta.blog135.fc2.com/blog-entry-209.html

* macOS 10.12 Sierraでは「.DS_Store」など一部の隠しファイルがFinderに表示されない状態に。
http://applech2.com/archives/macos-10-12-sierra-ds_store.html

### 編集履歴

* 2016/12/04
    * macOS sierraでも確認
* 2016/05/07訂正
    * ~~AppShowAllFiles~~->AppleShowAllFilesと誤記を修正しました。
Alcatrazを使ってXcodeに入れた便利なプラグイン 5つ

Alcatraz とはなんぞ？という方はこちらの記事をどうぞ
http://qiita.com/makies/items/de392e4562ef58302cce

# CocoaPods
https://github.com/kattrali/cocoapods-xcode-plugin
podコマンド実行をメニューから行うことができるようになる
`/usr/bin` 以外にある場合（rbenvやrvmを使って入れた場合）は、パスを指定してやる必要がある

```bash
$ which pod  # pod コマンドがどこにあるかを調べる
/Users/USERNAME/.rvm/gems/ruby-2.2.0/bin/pod
```
最後の pod の前までの部分をコピーして GEM_PATH: の欄に入力する

# GitDiff
https://github.com/johnno1962/GitDiff
diffのある行の表示
行番号とソースコードの隙間に色がつく
その行の行番号のあたりをマウスhoverすると変更前のコードが見れる :arrows_counterclockwise: こんなマークをクリックすると変更前の状態に戻すことができる

# KZLinkedConsole
https://github.com/krzysztofzablocki/KZLinkedConsole
consoleログから該当箇所をワンクリックで開いてくれる

# XcodeColors
https://github.com/robbiehanson/XcodeColors
consoleログに色を付ける

# Xvim
https://github.com/XVimProject/XVim
vimの操作感を使えるようにする
Alcatraz導入以前はXcodeをアップデートするたびに毎度cloneしてビルドしてたので、便利になった
Xcodeのパッケージマネージャー Alcatraz を導入

# Alcatraz

**The package manager for Xcode** : Xcode用パッケージマネージャー
http://alcatraz.io

# 動作環境

Alcatraz is available for OSX 10.9+ and Xcode 5+ only.
OSX 10.9以上、Xcode5以上 
（OS X 10.11 El Capitan Xcode7.2で動作確認した）

# インストール方法

ターミナルにこの１行をコピペして実行、待つだけでインストールが終わった
ここで**Xcodeを再起動**する。

```bash
$ curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
```


実際にインストールして使っているプラグインはこちらの記事に書いた
http://qiita.com/makies/items/b41e0b802322f4c1220f
レイアウトの@android:*/* ,?attr/* ,?* ,?android:attr/*  の違い

AppCompatThemeを使っていると、background="?attr/colorPrimary"とか指定したりとかありますよね。
分かりにくいですし、
検索もしにくいです、、

もやもやしていて最近やっとなんとなく分かってきたのでまとめたいと思います。
間違っていたら教えて下さい。

# @android:\*/\*
例: @android:style/TextAppearance.Large
これはAndroidのSDKにあるリソースを直接指定するパターンです。
Andorid Studioで定義に飛んでみると今回は以下の様なものが出てきます。
これがdrawableであれば画像などが出てきます。

```xml
    <style name="TextAppearance.Large">
        <item name="textSize">22sp</item>
    </style>
```

# ?attr/\* ,?\*

?attr/\*も、?\*も同じ意味です。
例 : "?colorPrimary
これはAndroidManifestなどで、Activityのテーマに設定されている要素を取り出しています。
これによりテーマによって動的に要素を変更することが可能となります。
今回は以下のように設定されていたのでそれを参照しています。
今回は、最終的には@color/colorPrimaryが利用されることになります。

```xml
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
```

この`colorPrimary`などの要素そのものはSupport LibraryのAppCompat Library内で定義されており、
declare-styleableで定義されています。
Android Studioで定義に飛ぶと以下の様なものが出てきます。

```xml
    <declare-styleable name="Theme">
<!-- 省略 -->
        <attr name="colorPrimary" format="color"/>
<!-- 省略 -->
    </declare-styleable>
```

ちなみにこの要素をプログラムから取り出すには以下のようにします。

```java
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true);
int color = typedValue.data;
```
http://stackoverflow.com/a/28489543

# ?android:attr/*
?android:attr/textAppearanceLarge
こちらもテーマに設定されている要素を取り出しています。
Theme.AppCompat.Light.NoActionBarの継承関係を辿って行くと以下のようにandroid:textAppearanceLargeの設定を見つけ出すことができました。


```xml
    <style name="Platform.AppCompat" parent="android:Theme">
<!-- 省略 -->
        <!-- Text styles -->
<!-- 省略 -->
        <item name="android:textAppearanceLarge">@style/TextAppearance.AppCompat.Large</item>
<!-- 省略 -->
   </style>
```

この要素の宣言はSDK内で宣言されているため、android:と付きます。
https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/core/res/res/values/themes_material.xml#L54

# まとめ
基本的にテーマと連動して変更できるようにするためにテーマの要素を利用していくのが良いと思います。
それ以外はdeclare-styleableを使うか、直接指定したりするほうがよいと思います。
React/FlumptでTodoMVC作った


今自分で作ってるサービスで[mizchi/flumpt](https://github.com/mizchi/flumpt)を使おうと思って、素振りに[TodoMVC](http://todomvc.com/)を作ってみた。

* [babie/flumpt-todomvc](https://github.com/babie/flumpt-todomvc)

見て。


## 感想

使ってみた感想としては、モデルとビュー以外の何か小難しいこと考えないでもガンガン作っていけるな、って感じです。FluxなんだけどFluxのあの概念図も考えなくて良いぐらい。おすすめ。


## 募集
以下の点が自分でもいかがなものかと思っているので、イシュー/プルリクまたはコメントお待ちしております。

* ファイル名が同格な感じでエントリポイントがわかりにくい
  * `src/index.js` と `src/app.js`
  * `src/components/index.js` と `src/components/main.js`
* ~~コンポーネントにES2015のクラス使ってない~~
  * @takuan_osho さんが[プルリクで対応してくれました](https://github.com/babie/flumpt-todomvc/pull/4)！ありがとうございます！
* `src/app.js`でのステートを新しいものに置き換えるところが多分JSっぽくない
* 非同期リクエストに伴ってガチャガチャ画面が更新されることがないみたいな強みを活かせてない
* モデルが定数以外は空。とはいってもドメインロジックはない。
  * [mWater/minimongo](https://github.com/mWater/minimongo)かなんか使ってリポジトリぐらい作った方が良いのかも
* テストがない

書き出してみると結構ありますね。よろしくお願いいたします。
Qiita投稿直前にNGワードを使用していないか確認するbashスクリプト


## 内容

この前、危うく個人名が入った状態でQiitaに投稿するところだった。
NGワードをチェックするbashスクリプト"check_ngword.sh"を作成し、投稿直前に実行することで回避する。

## 動作
スクリプトの第一引数にチェック対象ファイル名を指定し実行。
NGワードが存在する場合、標準出力にメッセージを表示する。


▼ 実行例

``` bash:
# NGワードチェックスクリプト名を"check_ngword.sh"とする。
# NGワードを"kojinName","kaisyamei"とする。

$ cat test1.md
    # 内容は以下の通り。
    #   -------------------------------------------
    #   # NGワードがあるファイル
    #   テスト用のmdファイル。
    #   ユーザ      ：kojinName
    #   ディレクトリ：/usr/local/kaisyamei/test.log
    #   -------------------------------------------

$ cat test2.md
    # 内容は以下の通り。
    #   -------------------------------------------
    #   # NGワードがないファイル
    #   AAA
    #   BBB
    #   CCC
    #   -------------------------------------------
 
$ check_ngword.sh test1.md
    # 以下の結果が表示される。
    #   == "kojinname" is using ==
    #   3:ユーザ      ：kojinName
    #   == "kaisyamei" is using ==
    #   4:ディレクトリ：/usr/local/kaisyamei/test.log

$ check_ngword.sh test2.md
    # (表示なし)      
```



## 詳細

### 動作環境

- OS

    ``` bash:
    $ sw_vers
        # ProductName:	Mac OS X
        # ProductVersion:	10.11.1
        # BuildVersion:	15B42
    ```

- bash

    ``` bash:
    $ bash --version
        # GNU bash, バージョン 4.3.42(1)-release (x86_64-apple-darwin15.0.0)
    ```

### ソースファイル

▼ check_ngword.sh

``` bash:
#/usr/local/bin/bash
# ------------------------------------------------------------------------------
# Name        : check_ngword.sh
# Description : 指定したMDファイルに、NGワードが使用されていないかチェックする。
#               アルファベットの大文字・小文字は区別しない。
# Synopsis    : checkmd.sh <check_file>
# Arguments   : 'check_file'
#                 チェック対象MDファイル。
# Settings    : NGWORDS変数にチェックするワードを設定する。（スペース区切り）
#               例) NGワード「AAA」「BBB」「CCC」を設定
#                 NGWORDS=('AAA' 'BBB' 'CCC')
# Output      : NGワードがある場合、以下のフォーマットで出力する。
#                 == "NGワード" is using ==
#                 (行数):(NGワードがある行)
# Return      : 0 - NGワードはありません。
#               1 - NGワードがあります。
# Examples    : $ cat test1.md
#                 # NGワードがあるファイル
#                 テスト用のmdファイル。
#                 ユーザ      ：kojinName
#                 ディレクトリ：/usr/local/kaisyamei/test.log
#               $ cat test2.md
#                 # NGワードがないファイル
#                 AAA
#                 BBB
#                 CCC
#               $ check_ngword.sh test1.md
#                 == "kojinname" is using ==
#                 3:ユーザ      ：kojinName
#                 == "kaisyamei" is using ==
#                 4:ディレクトリ：/usr/local/kaisyamei/test.log
#               $ check_ngword.sh test2.md
#                 (表示なし)      
# Remarks     : 
# ------------------------------------------------------------------------------

# NGワードの設定
NGWORDS=('kojinname' 'kaisyamei')

checkfile="$1"
findflg=0
for ngword in ${NGWORDS[@]}; do
  rslt=$(grep -ni --color=always "${ngword}" "${checkfile}")
  if [ ! -z "${rslt}" ] ; then
    echo "== \"${ngword}\" is using =="
    echo "${rslt}"
    findflg=1
  fi
done

exit "${findflg}"
```
RPi / python > plotly > 時系列グラフ > プロットを関数化 > 5個単位でのプロット例

http://qiita.com/7of9/items/01848f80188bf5c876d7
の続き

plotlyプロット部分を関数化した。

```160103-listPlot.py
import plotly.plotly as py
import time
import datetime

def plotly_plot(xlist, ylist, addnum, grpTtl, filnam):
    if len(xlist) < addnum:
        return False

    py.plot({
        "data":[{ "x":xlist, "y":ylist }],
        "layout":{ "title": grpTtl }
    },filename=filnam
    ,fileopt='extend'
    ,privacy='public')

    return True

xlist = [0] * 0
ylist = [0] * 0

graphTitle = "graph as a function of time"
filename = "timegraph160103c"

while True:
    today = datetime.datetime.today()
    xdt = today.strftime("%Y-%m-%d %H:%M:%S")
    yval = 3.1415
    xlist.append(xdt)
    ylist.append(yval)
    time.sleep(3)

    res = plotly_plot(xlist, ylist, 5, graphTitle, filename)
    if res == False:
        continue

    print "added at " + str(xlist[1:])

    del xlist[1:]
    del ylist[1:]
```

結果　https://plot.ly/276/~7of9/