OmniAICreator/Qiita-1.07M huggingface dataset:
NW.js (node-webkit) の開発をすぐ始める

![icon] (http://www.softantenna.com/wp/wp-content/uploads/2015/01/INW.js.png)

[NW.js (node-webkit)] (http://nwjs.io/) は HTML+CSS+Node.jsでネイティブGUIアプリが作成できる凄いやつです．
[githubページ] (https://github.com/nwjs/nw.js)を見ると，開発を始めるにはまず本体をダウンロードする必要があるかのような記述ですが・・・

実際は，__npmコマンド__で始められます！

# 1. 適当なindex.htmlを作る
```html
<!DOCTYPE html>
<html>
  <head>
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using node.js <script>document.write(process.version)</script>.
  </body>
</html>
```

# 2. npm initする
```zsh
$ npm init
entry point (index.js) <== ここで index.html と答える
$ npm install --save nw
```

# 3. nwをインストール
```zh
$ npm install --save nw
```

# 4. package.jsonの中身に1行追加
```diff
{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.html",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
+   "start": "nw"
  },
  "author": "",
  "license": "ISC"
}
```

# 5. 起動
```zsh
$ npm start
```

![スクリーンショット 2015-02-06 23.25.01.png](https://qiita-image-store.s3.amazonaws.com/0/10713/811c4b49-00d3-4332-a248-f971ed94c4ab.png)

これでnw.jsアプリが起動しました！らくらくですね！
Swift 指定位置の文字列を置換する

swiftで指定位置の文字を置換。

```swift:
var str:NSString = "ABCDEFGHIJKLMNOP"
var pos = NSMakeRange(4,4) // 位置
println(str.stringByReplacingCharactersInRange(pos, withString: "hoge"))
```

NSString型でないとエラーになってしまいますのでご注意を。
ProGuardのカスタマイズに必要な「proguard.cfg」ファイルが無い

AndroidプロジェクトProGuardをカスタマイズしようとした時、必要なファイル`proguard.cfg`が無くて困った時の対応法です。
結論から言うと「無くても問題ない」という事ですが、、、ちょっとハマったのでメモしておきます。

>環境：Windows 7 Pro / Android Studio 1.0.2



##「proguard.cfg」ファイルが作成されない
Androidの公式サイト（[URL](https://developer.android.com/tools/help/proguard.html)）のProGuardの設定ドキュメントを見ると下記のように記載されています。
>When you create an Android project, a proguard.cfg file is automatically generated in the root directory of the project.

>*(訳) Androidプロジェクトを作るとrootディレクトリに「proguard.cfg」ファイルが自動的に作成される。*

ただ私がAndroid Studioを使って新しいプロジェクトを作成しても、`proguard.cfg`は作成されませんでした。

　
##「proguard.cfg」ファイルが作成されなくても問題ない
結論から言うと`proguard.cfg`ファイルが作成されなくても問題ありません。
アプリケーションのビルドファイルを見たところ下記のように記載されていました。

```groovy:project_directory/app/build.gradle
android{
    ...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
```
`proguardFiles`として指定されているのは、`proguard.cfg`ではなくて`proguard-rules.pro`ですね。
と言うことで、`<project-root>/app`の中を探してみたら`proguard-rules.pro`ファイルが有りました！
このファイルを`proguard.cfg`の代わりに使用すれば問題ありません。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/68456/30215af9-c7c7-0dd0-08fe-7d497017bef1.png)
2台の Raspberry Pi を無線でつないで 一台のカメラで撮影した映像を家の TV にフルハイビジョンで中継（ちょっと遅延あり）


#始めに
某所での発表の準備として用意させていただいた内容なのですが、私自身の参照の便も含めて誠に僭越ではございますがこちらに公開させていただきました次第です。すみませんがよろしくおねがいいたします

#内容
　一万円以下で作れる、簡易監視カメラのソリューションです。２台の Raspberry Pi を用意し、一台にカメラモジュールを接続して撮影した映像をストリーミング配信、もう一台はテレビに接続して、受信したストリーミング映像をTVに映します。受信側 Raspberry Pi を例えば xbmc とかの media renderer にして、UPnP のPULL なり PUSH なり（要するに DLNA）で配信する方法もあると思いますが、映像だけでなく例えばセンサーのデータとかも映像の横とか表示することも可能にしておきたいので送受信両方を Raspbian で実装します

![スクリーンショット 2015-02-06 21.59.46.png](https://qiita-image-store.s3.amazonaws.com/0/46544/04b77e0d-badc-25a3-65e5-c9b069798c0c.png "スクリーンショット 2015-02-06 21.59.46.png")

#完成図



　下記はその様子で、右下の iPad で動かしているカンファレンスクロックの映像を 1台の Raspberry Pi で撮影して rtsp で 配信しています。それを、TV につないだもう一台の Raspberry Pi と、Mac の VLC で受信しています。MJPEG とかで配信するのとくらべるとちょっと遅延がおおきいですがフルハイビジョンはちょっと魅力です。配信中継の様子をこちらに[動画](https://www.youtube.com/watch?v=vFfhVs3EmAg)で用意しました。


![スクリーンショット 2015-01-29 23.53.20.png](https://qiita-image-store.s3.amazonaws.com/0/46544/e9f5242f-0572-ea7a-9c9a-8612d7ebe7ce.png "スクリーンショット 2015-01-29 23.53.20.png")

#実装
##配信側
raspivid で撮影した h.264 の映像を vlc で配信します
vlc がまだインストールされていないのであれば以下のようにインストールします

```bash:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install vlc
```

そして、以下のようにraspivid で撮影して配信します。尚、私の使い方ではカメラがひっくり返っているので -hf -vf で画像を反転させています

```bash:
raspivid -o - -t 0 -hf -vf -w 1920 -h 1080 -fps 30 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554}' :demux=h264
```

## 受信側
受信側は配信側の Raspberry Pi の IP アドレス（以下、例として 192.168.11.16 としています。ご自身の環境での IP アドレスに置き換えて実行してください）を指定して rtsp で omxplayer で受信して再生します

```bash:
omxplayer -o local rtsp://192.168.11.16:8554/
```

#参考文献
[こちら](http://raspberrypi.stackexchange.com/questions/23182/how-to-stream-video-from-raspberry-pi-camera-and-watch-it-live)の記事を参考にさせて頂きました

また、Raspberry Pi でのストリーミング中継一般についてこちらの本の８章 “Chapter 8. Streaming Live HD Video” が大変詳しく、参考になりました。尚、Packet Pub の本ではいつもの事なのですがサンプルコードに typo が沢山あって緊張感がありました
<a href="http://www.amazon.co.jp/gp/product/1783284692/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=1783284692&linkCode=as2&tag=grenouille0d-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=1783284692&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=grenouille0d-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=grenouille0d-22&l=as2&o=9&a=1783284692" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
Vimの起動オプションでファイルにテンプレートを追記して挿入モードに移行する


## 動機
bashのエイリアス/関数定義ファイルに追加する際、テンプレートを追加してから編集したい。

あるいは、下記記事でサラッと使ったオプションの補足。

環境はMac。

* [Mac - bashの各種コマンドを編集するシェルスクリプト - Qiita](http://qiita.com/catfist/items/d77067983e68c18496f1)

## Vimの起動オプション
Vimは、起動時に`+`(`-c`)オプションを追加することで、起動直後に指定のEXコマンドを実行させることができる。

これを利用して、バッファにテンプレートを書き込む。

## 使用するEXコマンド

### $
最終行に移動。

```vim
:$
```

### +(数字)/-(数字)
(数字)行下/上に移動。

```vim
:+1
:-10

" これだと10行目に移動
:10
```

### a
続けて入力したテキストをカレント行の下に追加。

EXモードでは同じ方法は使えないが、起動オプションではパイプを使ってワンライナーで表現できる。

```bash
$ vim hoge.txt +"a|aaa"
```

EXモードで実行すると、入力を求められた後、'aaa'コマンドが実行される(エラーになる)。

なお、EXモードでaコマンド（iコマンド）でテキストを挿入するには、コマンド実行後にテキストを入力してから、⌃+cを押す。

```vim
:a|aaa
```

bashで改行すれば複数行のテキストも挿入できる。ただし、関数またはシェルスクリプトでインデントすると、インデントごと挿入される。

```bash
# >はヒアドキュメントのプロンプトであり入力テキストではない
$ vim hoge.txt +"a|aaa
>   bbb # この行はインデントされる
> ccc"
```

### normal/norm
引数をノーマルモードのコマンドとして実行。行内の移動や、空行の挿入に便利。

```vim
" 行末に移動
:normal $

" ;の位置に移動
:normal f;

" 空行を挿入
:norm o
```

ただし、この方法で挿入モードに変更することはできない。

```vim
" 何も起こらない（0文字を挿入する）
:normal i

" hogeを挿入する
:normal ihoge
```

### ! (コマンド)
シェルを起動し、外部プログラムを実行する。

いくらでも使い道があるが、**自動的に挿入モードに移行する**のにも使える。

`silent`によって、シェルを表示せず実行結果のみを得る。

```vim
" AppleScriptで'i'キーを押下し挿入モードに移行
:silent ! osascript -e 'tell application "System Events" to keystroke "i"'
```

Vimの構文としては`!`とコマンドの間のスペースを省略することも適正であるが、それをやるとbashでエラーになる。

```bash
$ vim sample.txt +"silent !ls" # 右のダブルクォートがコマンドの一部と見なされている
bash: !ls": event not found
```

```bash
$ vim sample.txt +"silent ! ls" # Vimを終了すると、シェルでlsコマンドが実行されている
sample.txt hoge.txt   fuga.txt
```

なお、`r ! (コマンド)`とすると、プログラムの実行結果をバッファに挿入することができる。

## bashの関数定義ファイルに雛形を追加、挿入モードに移行する例

```function-init.bash
# in ~/.bashrc
# export bash_function=~/.bash/conf/function-init.bash
# source "$bash_function"

afunc () {
  vim "$bash_function" +$ +"a|$1 () {" +"a|  " +"a|}" +-1 +"normal $" +"silent ! osascript -e 'tell application \"System Events\" to keystroke \"i\"'"
  source "$bash_function"
}
```

```bash
$ afunc somefunc
```

AppleScriptを使わずにコマンドラインで挿入モードに入る方法を探しているが、どうも見つからない。
shor's algorithm に関するメモ

$N$ を因数分解するにあたり, $a$  は $N$ に対して素な数とし, $a$ の $N$ に関する位数,
$
min \\{ x | a\^x = 1 \begin{eqnarray}\pmod{N}\end{eqnarray}\\}
$
つまり, $a^x$ の周期 $r$ を求める.
* * *

$N = 15$
$a = 7$
とする.

$7\^1 = 7 \begin{eqnarray}\pmod{15}\end{eqnarray}$
$7\^2 = 4 \begin{eqnarray}\pmod{15}\end{eqnarray}$
$7\^3 = 13 \begin{eqnarray}\pmod{15}\end{eqnarray}$
$7\^4 = 1 \begin{eqnarray}\pmod{15}\end{eqnarray}$
$7\^5 = 7 \begin{eqnarray}\pmod{15}\end{eqnarray}$
$7\^6 = 4 \begin{eqnarray}\pmod{15}\end{eqnarray}$
$7\^7 = 13 \begin{eqnarray}\pmod{15}\end{eqnarray}$
$7\^8 = 1 \begin{eqnarray}\pmod{15}\end{eqnarray}$
$7\^9 = 7 \begin{eqnarray}\pmod{15}\end{eqnarray}$
...

$7,4,13,1,7,4,13,1,7... $という周期$4$の数列が生成される. 
よって,周期 $r =min \\{ x | 7\^x = 1\begin{eqnarray}\pmod{15}\end{eqnarray}\\} = 4$  
***

* 周期 $r$ から $N = 15$ の約数を導く.   

1. $r = 4$ を $2$ で割る.<!--2で割るのは何故か?--> 
$4\div 2 = 2$ 

1. $a = 7$ を周期 $\frac{r}{2}$ 乗する.  <!--r/2乗するのは何故か?-->
$7\^(\frac{r}{2}) = 49$  

1. $49$ の両隣の整数 $48,50$ を取り上げ,この2つの数と,もとの数 $15$ との最大公約数を求める.  <!--両隣の整数を取り上げることと,最大公約数を求めるのは何故か?-->
$48$ と $15$ の最大公約数は $3$
$50$ と $15$ の最大公約数は $5$  
よって, $15$ は約数として $3$ と $5$ を持つ.
swift 指定の文字列の位置を最後から検索


最後から検索する場合は、
rangeOfStringのoptions:NSStringCompareOptions.BackwardsSearchを指定する。


```swift:swift
var hogeNsStr:NSString = "yoshiganbaruzou yoshiyoshi"
var pos = hogeNsStr.rangeOfString("yoshi", options:NSStringCompareOptions.BackwardsSearch).location
println("pos \(pos)")
```


String型ではなく、NSString型でないとlocationはとれなかった。

あと、検索にひっかからない場合には下記ような値が入るので注意！

```
pos 9223372036854775807
```
fstab間違えてOSが起動しない時の対処(クラウドでマシン複製する時とか)


クラウド環境と仮想環境で、仮想マシンを複製したりする時にスナップショットから新しいマシンを作ったりすると思う。

今使っているクラウドでは、マウントを正常に行う為に/etc/fstabに下記のようにUUIDを明記してボリュームをマウントしておく事が推奨されている。

```/etc/fstab

UUID=f4713aa1-3a33-4933-85e8-94c421269a98 /     ext4    defaults        1 1
```

####ところが、このfstabでUUIDをマッピングするのはテンプレートからマシン複製する時に思わぬトラップになる。。

というのも、fstabでマッピングしているUUIDはあくまでスナップショットを取得した元の仮想マシンにマウントしているディスクのものなので、複製した新しい仮想マシンは別のUUIDを持ったディスクがマウントされる。
で、OS起動時に下記のようなエラーで止まる。。

![スクリーンショット 2015-02-06 20.48.51.png](https://qiita-image-store.s3.amazonaws.com/0/40850/86f8292b-f8e8-7f6b-3efd-7443237e876f.png "スクリーンショット 2015-02-06 20.48.51.png")

こうなった時は下記で対応

①まずは、rootのパスワードをいれてログイン

②この状態だと、ディスクがリードオンリーモードでマウントされているので下記コマンドでリードオンリーからリードライトモードへ変更する

```
mount -o remount ,rw /
```

③先程のfstabでUUIDマッピングしている行を削除

```/etc/fstab

#UUID=f4713aa1-3a33-4933-85e8-94c421269a98 /     ext4    defaults        1 1
```


で再起動すれば無事起動する

##ついでに

NW関連も下記ファイルがmacアドレスとネットワークインターフェースのマッピングを持っているので、一度削除する
再起動後に、現在のデバイス情報で再作成されるので、その情報を元にifcfg-ethxxあたりでmacアドレスを変更すればうまく疎通する。

```
rm -f /etc/udev/rules.d/70-persistent-net.rules 
```

覚えてはいるけど、この作業する度に何回も同じミスしてるのでまとめてみた。

#####そもそもスナップショットを取る時点でfstabの該当行をコメントアウトしておけばもちろんこんな事象は起きない。
indentLineがそこまでイケてなかったのに気付いた


https://github.com/Yggdroot/indentLine

最近使ってる人多いんじゃないかなーというこちら。

http://qiita.com/0829/items/261225a51439776b36bf#1-2

こちらで、紹介されてて自分も[vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides)から乗り替えたんですが、最近になって気付いたんですよ。

**あれ?これSyntax Highlight効いてなくね?**

一番分かりやすかったのがJadeだったんですが。調べてみるとこんな[issue](https://github.com/Yggdroot/indentLine/issues/69)がありました。

要はindentLineを有効にしていると、シンタックスハイライトが効かないファイルタイプがあるようで。自分の分かる範囲では以下でした。

- jade
- stylus
- yaml
- scss

俺フロントエンドエンジニアなので、これ結構致命的じゃね?

前述のissueによるとindentLineの方での修正はムリっぽいことが書いてあって、syntaxの方の修正をしないといけないらしいです。

ということで、vim-indent-guidesに戻りました…。シンプルなindentLineの見た目に慣れてしまったんで、以下のような設定にしておいてなるべく違和感無くすようにしました。

```vim
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_start_level = 2
let g:indent_guides_guide_size = 1
let g:indent_guides_exclude_filetypes = ['help', 'nerdtree', 'tagbar', 'unite']
```

ということで、使ってるみなさまも一度、自分が良く開くファイルで問題ないか見てみると良いかもしれません。
PhoneGapアプリ Androidのバックボタンを制御

##概要
PhoneGap（Cordova）でのアプリ開発の際、Androidのバックボタンを押されると困る（意図しない動きをする）ことがあります。
その場合に、標準のブラウザバック以外の処理を実行する方法です。

##JavaScriptコード

```js
document.addEventListener("backbutton", function(e){
	e.preventDefault();
	//処理したいコードをこの下にかく
}, false);
```

##ここでつかえそうなTIPS
アプリを終了する

```js
navigator.app.exitApp();
```
UILabelの上下左右に任意に枠線をつけるには

# はじめに
例えばUILabelの右端のみ、下辺のみ枠線をつけようとした場合、標準の機能ではなかなか手軽にできなかったりします。

色々な解決法があると思いますが、実運用でも使用している一例として以下の方法を共有します。

UILabelに限らず適用できます。

# 解決方法「UIViewを4辺に置く」

任意のUIViewの4辺にUIViewを付加することで実現しています。
シンプルに。

## 付加用メソッド作成

```lang:ユーティリティクラスにて定義
+ (void)assignBorders:(UIView *)view borderTop:(BOOL)borderTop borderBottom:(BOOL)borderBottom borderLeft:(BOOL)borderLeft borderRight:(BOOL)borderRight
{
    UIView *border = nil;
    UIColor *color = [UIColor darkGrayColor];
    
    if (borderTop) {
        border = [[UIView alloc] initWithFrame:CGRectMake(0, 0, view.bounds.size.width, 1)];
        [border setBackgroundColor:color];
        [view addSubview:border];
        [border release];
    }
    
    if (borderBottom) {
        border = [[UIView alloc] initWithFrame:CGRectMake(0, view.bounds.size.height - 1, view.bounds.size.width, 1)];
        [border setBackgroundColor:color];
        [view addSubview:border];
        [border release];
    }
    
    if (borderLeft) {
        border = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, view.bounds.size.height)];
        [border setBackgroundColor:color];
        [view addSubview:border];
        [border release];
    }
    
    if (borderRight) {
        border = [[UIView alloc] initWithFrame:CGRectMake(view.bounds.size.width - 1, 0, 1, view.bounds.size.height)];
        [border setBackgroundColor:color];
        [view addSubview:border];
        [border release];
    }
}
```

## 使用する

```lang:UILabelに対して使用
    [XXX assignBorders:[ラベル] borderTop:NO borderBottom:NO borderLeft:NO borderRight:YES];
```

```lang:UIImageViewを生成し使用した場合
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 105, 105)];
    [imageView setImage:[UIImage imageNamed:@"noImage"]];
    [XXX assignBorders:imageView borderTop:YES borderBottom:YES borderLeft:NO borderRight:YES];
```


## コードでコントロール生成時に使用するパターン

[コードでコントロールを生成する](http://qiita.com/satoshi0212/items/52578c5e0f9b79a58e78)
こちらと連動しコントロール生成時に枠線を指定するパターン。

```
+ (UILabel *)newLabel:(CGRect)rect text:(NSString *)text alignment:(int)alignment borderTop:(BOOL)borderTop borderBottom:(BOOL)borderBottom borderLeft:(BOOL)borderLeft borderRight:(BOOL)borderRight
{
    UILabel *label = [[UILabel alloc] init];
    
    [label setFrame:rect];
    [label setText:text];
    [label setFont:[UIFont systemFontOfSize:16]];
    [label setTextColor:[UIColor blackColor]];
    [label setTextAlignment:alignment];
    [label setNumberOfLines:0];
    [label setLineBreakMode:NSLineBreakByWordWrapping];
    [label setBackgroundColor:[UIColor clearColor]];
    
    [self assignBorders:label borderTop:borderTop borderBottom:borderBottom borderLeft:borderLeft borderRight:borderRight];
    
    return label;
}
```

```lang:ラベル生成メソッドと同時使用
    UILabel *lbl = [XXX newLabel:CGRectMake(100, 100, 120, 30) text:@"サンプル" alignment:NSTextAlignmentCenter borderTop:YES borderBottom:YES borderLeft:YES borderRight:YES];
    [self addSubview:lbl];
```

# おわりに
同じ課題で悩んだ人の参考になりましたら幸いです！
Postfixのメールキュー操作

Postfixのメールキュー操作

現在のメールキューの一覧は、postqueue コマンドのオプション -p コマンドで確認。

postqueue -p

メールキューを削除する場合は、postsuper -d　を使用し、キューIDを指定。

postsuper -d [キューID]

全てのメールキューを削除する場合

postsuper -d ALL

メールキューを全て再送信

postfix flush
WordPress: Advanced Custom Fieldで作ったフィールドをまとめて取得

例：ACFで作成したフィールドグループ

- Name: text
- Age: number
- Sex: text

みたいなデータを作ったとする。
Name: Taro, Age: 20, Sex: Male
Name: Jiro, Age: 18, Sex: Male


```php:index.php
<?php
// 配列作成
$entries = array();
// クエリのパラメータ
$args = array( 'posts_per_page' => -1, 'post_limits' => -1, 'post_type' => 'post', 'orderby' => 'ID', 'post_status' => 'publish' );
// WP_Queryを作成
$wp_query = new WP_Query( $args );
// 投稿の数だけループ
while($wp_query->have_posts()) : $wp_query -> the_post();

// 配列作成
$ary = array();

// カスタムフィールドの一覧をループさせる
foreach( get_post_custom_keys() as $cf_name ){
    // アンスコで始まるKeyがあるのでそれを省く
    if( !preg_match('/^_/', $cf_name ) ){
        // 配列に入れ込む
        $ary[$cf_name] = get_field( $cf_name );
    }
}
// 2次元配列にする
array_push( $entries, $ary );

endwhile;
?>
```

printするとこうなる。

```html:index.html
Array
(
    [0] => Array
        (
            [Name] => Taro
            [Age] => 20
            [Sex] => Male
        )
    [1] => Array
        (
            [Name] => Jiro
            [Age] => 18
            [Sex] => Male
        )
)	
```

使用頻度は極めて低いですが、
JSONとかで一部のカスタム投稿とかを外に出したい時とかに使える気がします。
あとRepeaterでも使えると思います。

```php:functions.php
// 記事保存時に実行
function generate_json( $data, $postarr ) {

// ここに上記の処理とか追加してJSONで出力したり？

}
add_filter( 'wp_insert_post_data'  , 'generate_json' , 99 , 2 );
```
NTP/UDPをport fowardingしてネットに出られない機器でもNTP同期させる

CentOS7で実施。イントラの機器はNTPサーバ建てないと同期できないですよね。
しかしNTPサーバ自身が時刻狂ったら・・・と思うと外部のNTPサーバを利用したい。

sshだとUDPのport fowardingが出来ない。
stoneなら出来る。

## stoneのビルド

```bash:
cd /opt/
wget http://www.gcd.org/sengoku/stone/stone-2.3e.tar.gz
tar xzf stone-2.3e.tar.gz
cd stone-2.3d-2.3.2.7/
```

ビルドには`-D_GNU_SOURCE`を付ける必要がある。

```diff:Makefile
--- Makefile.org	2015-02-06 19:49:53.000000000 +0900
+++ Makefile	2015-02-06 19:50:17.000000000 +0900
@@ -97,7 +97,7 @@
 	$(MAKE) FLAGS="-DNT_SERVICE $(FLAGS)" LIBS="$(LIBS) $(SVC_LIBS) -ladvapi32 -luser32 -lshell32 -lkernel32" $(TARGET)

 linux:
-	$(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL $(FLAGS)" LIBS="-lpthread $(LIBS)" stone
+	$(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -D_GNU_SOURCE $(FLAGS)" LIBS="-lpthread $(LIBS)" stone

 linux-pop:
 	$(MAKE) TARGET=linux pop_stone
```

参考: [CentOSにstoneをインストールしてみた](http://doruby.kbmj.com/taka/20131125/CentOS_stone_)

## ビルド

```bash:
make linux
```

/opt/stone-2.3d-2.3.2.7/stone が生成される。

## 使い方

> `stone destinationhost:port port`

```bash:
/opt/stone-2.3d-2.3.2.7/stone 11.11.11.11:ntp/udp ntp/udp
```

* 11.11.11.11:ntp/udp を0.0.0.0:ntp/udp にport forwarding


## ciscoの機器

### NTP同期できない状態

```bash:
#show ntp associations detail
192.168.11.11 configured, insane, invalid, unsynced, stratum 16
ref ID 0.0.0.0, time 00000000.00000000 (09:00:00.000 JST Mon Jan 1 1900)
our mode client, peer mode unspec, our poll intvl 64, peer poll intvl 64
root delay 0.00 msec, root disp 0.00, reach 0, sync dist 0.000
delay 0.00 msec, offset 0.0000 msec, dispersion 16000.00
precision 2**5, version 3
org time 00000000.00000000 (09:00:00.000 JST Mon Jan 1 1900)
rcv time 00000000.00000000 (09:00:00.000 JST Mon Jan 1 1900)
xmt time AF3BD40B.4743EEB5 (09:15:07.278 JST Mon Mar 1 1993)
filtdelay =     0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
filtoffset =    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
filterror =  16000.0 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0
```

```bash:
#show clock
*09:14:58.394 JST Mon Mar 1 1993
```

### NTP同期できる状態

```bash:
#show ntp associations detail
192.168.11.11 configured, our_master, sane, valid, stratum 2
ref ID 10.84.87.146, time D87F1D37.F4E3026A (20:00:07.956 JST Fri Feb 6 2015)
our mode client, peer mode server, our poll intvl 64, peer poll intvl 64
root delay 1.77 msec, root disp 0.06, reach 1, sync dist 15877.151
delay 2.40 msec, offset -0.4845 msec, dispersion 15875.02
precision 2**20, version 3
org time D87F1D5A.38416368 (20:00:42.219 JST Fri Feb 6 2015)
rcv time D87F1D5A.38AFA7C9 (20:00:42.221 JST Fri Feb 6 2015)
xmt time D87F1D5A.38104702 (20:00:42.218 JST Fri Feb 6 2015)
filtdelay =     2.40    0.00    0.00    0.00    0.00    0.00    0.00    0.00
filtoffset =   -0.48    0.00    0.00    0.00    0.00    0.00    0.00    0.00
filterror =     0.02 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0
```

```bash:
#show clock
20:01:41.634 JST Fri Feb 6 2015
```
make の make


昔ながらのコマンドのソースからのインストール方法は、

```shell-session:
./configure && make && make install
```

んじゃ、コレも make にしちゃえば？

## Makefile

```Makefile:
tgt     ?= 
confopt ?=
makeopt ?=
taropt  ?= zxf
arc := $(wildcard $(tgt)*)
all: .PHONY
.PHONY:
	tar $(taropt) $(arc)
	cd $(tgt) &&  ./configure --prefix=/Users/XXX/cmd/ $(confopt)
	make -C $(tgt) $(makeopt)
	make -C $(tgt) install
	rm -rf $(tgt)
```

## 実行

```shell-session:
$ wget -q http://ftp.gnu.org/gnu/wget/wget-1.12.tar.gz
$ tgt=wget-1.12 confopt='--with-ssl=openssl' make
```


#### 一言
こんなものメモってたんだなあ。
Eclipse の 一般の Java project を Maven project にす


たとへば Maven の repository に のみ 有る modules を 用ゐるとき など。

* Package Explorer の 當該 project を 右 click にて menu を pop-up す。
* Configure → Convert to Maven Project を 選ぶ。
* 適當に Group Id を 定む。
* Run As → Java Application にて building より Maven にての build となりぬ。

上にて 作られにし pom.xml の /project 下に /dependencies/dependency を加ふ。

```xml:pom.xml
<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <dependencies>
    <dependency>
      <groupId>net.sf.saxon</groupId>
      <artifactId>Saxon-HE</artifactId>
      <version>9.6.0-4</version>
    </dependency>
    ...
  </dependencies>
</project>
```

この dependency には Maven の repository に 記されたる ものを 記すべし。
公の repository は たとへば http://mvnrepository.com/ など。
今のところ これらを 探すには web を 瀏覽する ほかは 知らず。

なほ この dependencies により web より download さるゝ modules は default にては ~/.e2/repository/ の 下に 構築さる。
これを project directory 下に lib/ を 掘りて 持ち出だすには

```bash:console
$ cd PROJECT
$ mvn dependency:copy-dependencies -DoutputDirectory=lib
```

などゝ せば よろし。
この project は mvn command にて building も なし得。

```bash:console
$ cd PROJECT
$ mvn compile
$ mvn package
```
DockerHub に GitBucket イメージを登録してみました



#1. はじめに

GitHubクローンを探していて見つけたのが [GitBucket](https://github.com/takezoe/gitbucket) でした。

※ [GitBucket](https://github.com/takezoe/gitbucket) は Naoki Takezoe さんが作成した和製の GitHub クローンです。

管理者にとってありがたい、

- インストールと起動が簡単なこと（配置したjavaのwarファイルを起動するだけ！）
- データ領域が一つのフォルダーにまとまっていること（デフォルトでサービスを起動したユーザの~/.gitbucket）

という特徴を持っており、 Dockerでデータの永続化をする際にも非常に相性が良いように思いす。

#2. DockerHub Registry の URL

[https://registry.hub.docker.com/u/sken/gitbucket/](https://registry.hub.docker.com/u/sken/gitbucket/)

Dockerfile を読むと構成の単純さが良くわかります。

#3. docker run

たった2行でGitHubクローンをサービスできます。

```bash
$ sudo mkdir -p /opt/data/gitbucket
$ sudo docker run -d -p 8080:8080 -v /opt/data/gitbucket:/gitbucket sken/gitbucket
```

なお、データはホストOS上の /opt/data/gitbukcet に格納されます。

```bash

$ ls -al /opt/data/gitbucket
合計 64
drwxr-xr-x 3 root root  4096  2月  6 18:46 .
drwxr-xr-x 3 root root  4096  2月  6 18:43 ..
-rw-r--r-- 1 root root 45056  2月  6 18:47 data.mv.db
-rw-r--r-- 1 root root  3820  2月  6 18:46 data.trace.db
drwxr-xr-x 3 root root  4096  2月  6 18:46 tmp
-rw-r--r-- 1 root root     3  2月  6 18:46 version
```

#2015/10/22追記

##gitbucket のアップデート方法

データはホストOS上に格納されていますので、例えば、コンテナとイメージを削除した後に改めてコンテナを作成すればOK[^1]です。

```bash
$ sudo docker stop gitbucketのコンテナID
$ sudo docker rm gitbucketのコンテナID
$ sudo docker rmi gitbucketのイメージID
$ sudo docker run -d -p 8080:8080 -v /opt/data/gitbucket:/gitbucket sken/gitbucket
```

[^1]: docker1.3.2にて、上記手順でgitbucketを3.0から3.7にアップデートできることを確認済み。
trusterdでリクエストを受け付けてみた

# やり方

trusterd.conf.rbを編集する。

## callbackをtrueにしてHTTP2サーバーを生成する。

```rb
s = HTTP2::Server.new({
:port           => 8080,
  :document_root  => "#{root_dir}/htdocs",
  :server_name    => SERVER_DESCRIPTION,
  :worker         => "auto",
  :key            => "#{root_dir}/ssl/key.pem",
  :crt            => "#{root_dir}/ssl/cert.pem",
  :callback => true,
})
```

## callbackの設定

```
s.set_map_to_strage_cb {
  if s.request.uri == "/py_exec"
    # PyCall.py_exec("print('Hello,This is trusterd!')")
    puts "test!"
    # 表示はindex.html
    s.request.filename = "#{root_dir}/htdocs/index.html"
  end
```

# 試す

ChromeやFirefoxで

```
https://127.0.0.1:8080/py_exec
```

# 関連投稿

- [mruby - trusterdでPOSTリクエストを処理する第一歩 - Qiita](http://qiita.com/kjunichi/items/121a51fa5e0409b1b0cf)
近代的WindowsTips

しばらく他のOS使っていたら「最近のWindows」特有の便利機能についていけてなかった。Vista以降で大分変わっているらしい。
知らなかったことまとめ。

### Shift + 右クリック が便利

Windowsの特徴として、とりあえず右クリックメニューからやりたい事を探せば大体見つかる、というのがある。
今は、Shiftキーを押しながら右クリックするとさらに出来ることが増える。

特に「パスとしてコピー」は使用頻度が高い。
昔は常駐型のユーティリティを使ってなんとかしていた記憶があるが、もう不要。

### マルチディスプレイ環境なら、Windowsキー + 矢印キー が大活躍

マルチディスプレイ環境では、Windowsキー + 矢印キーでウィンドウを違うディスプレイに動かせる。
とにかく押してみればわかる。

### ウィンドウの幅を、マウスドラッグでディスプレイ半分に出来る

ウィンドウのタイトルバーをドラッグして、画面の左右端にウィンドウを押し付けると、ディスプレイの半分の幅のウィンドウになる。
ワイドモニタが主流になったから、とても便利。

### 「名前の変更」で、拡張子を表示する設定でもファイル名のみの変更がデフォルトになった

昔は拡張子ごと入力し直しになるような挙動だったのが、いまはファイル名のみの入力になるように改善されている。

###### 以上Windows7までの話。Windows8はいくら使っても何がいいのやら・・・
Twitter gem で自分のTwitterアプリの制限数を見る



https://apps.twitter.com/ で登録したTwitterのアプリケーションの各APIの制限数を見たいとき

```rb

client = Twitter::REST::Client.new do |config|
  config.consumer_key = "KEY"
  config.consumer_secret = "SECRET"
  config.access_token = "TOKEN"
  config.access_token_secret = "TOKEN_SECRET"
end


# 検索のAPIの制限を取得する

Twitter::REST::Request.new(client, :get, 'https://api.twitter.com/1.1/application/rate_limit_status.json', resources: "search").perform

#=> {:rate_limit_context=>{:application=>"hogehoge"},:resources=>{:search=>{:"/search/tweets"=>{:limit=>450, :remaining=>450, :reset=>1423217428}}}} 

```

```limit``` は制限数、 ```remaining``` は15分間で残っているリクエスト数、```reset``` はこの制限がリセットされる時間


## 参考

- [GET application/rate_limit_status always returns application rate_limit_context · Issue #589 · sferik/twitter](https://github.com/sferik/twitter/issues/589)

→ ここで ```client.get('https://api.twitter.com/1.1/application/rate_limit_status.json', resources: "search")``` の使い方を知ったんだけど、 Deprecatedのアナウンスが出た。

- https://github.com/sferik/twitter/blob/master/lib/twitter/rest/utils.rb#L51
Go by Example: Recursion


(この記事は [Go by Example: Recursion](https://gobyexample.com/recursion) を翻訳したものです。)

Goは[recursive function](http://en.wikipedia.org/wiki/Recursion_(computer_science))をサポートしています。ここでは、古典的な階数の例をあげます。

```go
package main

import "fmt"

	// この関数は基礎であるfact(0)にたどり着くまで自分自身を呼び続けます。
func fact(n int) int {
    if n == 0 {
        return 1
    }
    return n * fact(n-1)
}
func main() {
    fmt.Println(fact(7))
}

```

```
$ go run recursion.go 
5040
```
cocos2d-xでArmatureにシェーダを反映させる

cocos2d-xでETCのアルファマスクをシェーダを使って実装する際にArmatureで苦戦したので残しておこうと思います。
とりあえず調べた限りは日本語による記事は存在しなかったので何か役に立てば嬉しい。
(なお中国語の記事はあった模様。というかそれを参考にした。)

# とりあえず書いてみた #
```hoge.cpp
// 初期化系統の処理内にぶち込む
void onEnter()
{
   // 頂点シェーダとフラグメントシェーダを使ってシェーダを作成
   auto shader = GLProgram::creatWithByteArrays();
   auto shader_state = GLProgramState::getOrCreateWithGLProgram(shader);

   // 自前のシェーダをセット
   setCustomShader(shader_state, getChildren());
}

// シェーダセット
void setCustomShader(GLProgramState *glpstate, Vector<Node*>& childrens)
{
   if(chidrens.empty()) return;

   for(auto& child : childrens)
   {
       // 再帰
       setCustomShader(glpstate, dhild->getChildren());

       // dynamic_castでSpriteに
       auto sp = dynamic_cast<Sprite*>(child);

       // nullptrじゃなければシェーダ突っ込む
       if(sp != nullptr){
         sp->setGLProgramState(glpstate);
       }
   }
}
```
と上記の書き方で基本的には対応出来たけど、Armatureだけ見事にマスク効いてない。
どうやらArmatureは違うらしい。

# Armatureの中を潜っていくと... #
いた。
**Armature -> Bone -> DecorativeDisplay -> Node** に対してシェーダ突っ込まないと駄目らしい。
なので

```
auto arm = dynamic_cast<Armature*>(child);

auto& map = arm->getBoneDic();
for(auto& entry : map){
   auto bone = entry.second;
   if(bone != nullptr){
      auto list = bone->getDisplayManager()->getDecortaiveDisplayList();
      for(auto dd : list){
         dd->getDisplay()->setGLProgramState(glpstate);
      }
   }
}
```
という感じで対応すると、Armatureに対してシェーダが反応しました。
もっと良い記述に出来ると思うけど、まぁ多少はね？


記事投稿初めてなのでこういう書き方でいいか分かりませんが、
とりあえず今回はこんな感じで。
CDIコンテナにSeasar2のコンポーネントを移す (その２)

前回の、[CDIコンテナにSeasar2のコンポーネントを移す (その１)](http://qiita.com/hirokapi/items/fee17dca7f7811e7e9dd)に書いた記事の続きです。

## サーバーの起動処理（例）

```java:
import org.eclipse.jetty.server.Server;
import org.glassfish.jersey.jetty.JettyHttpContainerFactory;

public class HogeMain {
    public static void main(String[] args) {
        HogeConfig config = new HogeConfig();
        Server server = JettyHttpContainerFactory.createServer(URI, config, false);
        server.start();
    }
}
```

## S2コンテナの中身を CDIコンテナに移す処理のサンプル

処理の説明はまた今度。。

```java:
import org.glassfish.jersey.server.ResourceConfig;

public class HogeConfig extends ResourceConfig {

    public HogeConfig() {

        packages(this.getClass().getPackage().getName());

        register(new AbstractBinder() {
            @Override
            protected void configure() {
                for (ComponentDef def : getComponentDefs()) {
                    Class<?> clazz = def.getComponentClass();
                    String name = def.getComponentName();
                    Descriptor descriptor;
                    if (InstanceDef.SINGLETON_NAME.equals(def.getInstanceDef().getName())
                            || InstanceDef.APPLICATION_NAME.equals(def.getInstanceDef().getName())) {
                        descriptor = BuilderHelper.createConstantDescriptor(def.getComponent(), name,
                                clazz.getInterfaces());
                    } else {
                        DescriptorBuilder builder = BuilderHelper.link(clazz).named(name).in(PerLookup.class);
                        for (Class<?> contract : clazz.getInterfaces()) {
                            builder = builder.to(contract);
                        }
                        descriptor = builder.build();
                    }
                    this.bind(descriptor);
                }
            }

            private List<ComponentDef> getComponentDefs() {
                S2Container container = S2ContainerFactory.create();
                container.init();
                List<ComponentDef> componentDefList = new ArrayList<ComponentDef>();
                componentDefList.addAll(getComponentDefs(container));
                return componentDefList;
            }

            private Set<ComponentDef> getComponentDefs(S2Container container) {
                Set<ComponentDef> componentDefSet = new LinkedHashSet<ComponentDef>();
                for (int i = 0; i < container.getComponentDefSize(); i++) {
                    ComponentDef componentDef = container.getComponentDef(i);
                    componentDefSet.add(componentDef);
                }
                for (int i = 0; i < container.getChildSize(); i++) {
                    S2Container child = container.getChild(i);
                    componentDefSet.addAll(getComponentDefs(child));
                }
                return componentDefSet;
            }
        });
    }
}
```

## 続く

・・・かも。。
Go by Example: Closures


(この記事は [Go by Example: Closure](https://gobyexample.com/closures) を翻訳したものです。)


Goは[closure](http://en.wikipedia.org/wiki/Closure_(computer_programming))の形にできる[anonymous functions](http://en.wikipedia.org/wiki/Anonymous_function) anonymous functionは名前を与えず関数を定義するときに便利です。



```go
package main

import "fmt"

// このintSeqの関数はintSeqのbodyで定義されたanonymous functionを返します。帰ってくる関数はclosureを作るために変数iを含んでいます。
func intSeq() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}
func main() {

	// intSeqを呼んで、結果（関数）をnextIntを代入します。この関数はnextIntを呼ぶたびに更新される変数iを含んでいます。
    nextInt := intSeq()

	// nextIntを何回か呼ぶことでclosureの影響を見てみましょう。
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

	// その状態は特定の関数で一意であることを確認するために新しい物を作ってテストしてみましょう。
    newInts := intSeq()
    fmt.Println(newInts())
}
```


```
	
$ go run closures.go
1
2
3
1

```
今回見る最後の関数の特徴は再帰です。
[memo] gulp+broserify+uglify

# [memo] gulp+broserify+uglify

この記事は個人的なメモになります

## 簡単なやつ

```
var gulp = require('gulp');
var browserify = require('browserify')
var uglify = require('gulp-uglify')
var source = require('vinyl-source-stream')
var buffer = require('vinyl-buffer')

gulp.task('build', function() {
    browserify({
          entries: ['./app.js'],
          extensions: ['.js']
        })
        .bundle()
        .pipe(source('bundle.js'))
        .pipe(buffer())
        .pipe(uglify())
        .pipe(gulp.dest('build'))
});
```

* gulp build を実行すると
* ugligy でminifyされている
* browserify でモジュールがまとめられた
* build/bundle.js ができる
AngularJSでE2Eテスト用バックエンド疑似APIサーバを構築する方法


# **概要**

AngularJSのProtractorでe2eテストをするとき、例えば、**$httpでレスポンスするデータが毎回違う場合**があるとする。そうすると、DOMのテキストなども変わってしまうので、e2eのテストが書きにくい。

そんなときに便利なのが**<a href="https://docs.angularjs.org/api/ngMockE2E/service/$httpBackend" target="_blank">ngMockE2Eの$httpBackend</a>**だ。

**<a href="https://docs.angularjs.org/api/ngMockE2E/service/$httpBackend" target="_blank">$httpBackend</a>をつかうと、特定の$http通信の送受信の結果を指定することができ**、仮のデータで安心してe2eのテストを書くことができる。また、**サーバを用意しなくてもモックでテストが書ける**。

# **使い方**

導入（？）までは以下を見ればわかると思う。基本的にYeomanベースでつくったアプリケーションを想定している。

* <a href="http://qiita.com/hkusu/items/5680d5e74105640c46fc" target="_blank">AngularJSでバックエンドの疑似APIサーバ(スタブ)を構築する - Qiita</a>

## **whenGET**

$httpBackendのメソッドは、`whenGET`,`whenPOST`などがあり、例えば`whenGET`は以下のように書く。

```coffeescript:test/mock/sample-mock.coffee
module.exports =
  Mock = ->
    angular.module("httpBackendMock", ["ngMockE2E"]).run ($httpBackend) ->
      $httpBackend.whenGET('/api/search_user/').respond({
        [{
          'user_id': '1'
          'name': 'Tarou'
          'type': 'male'
        }
        {
          'user_id': '2'
          'name': 'Yuka'
          'type': 'female'
        }]
      })
```

`sample-mock.coffee`は`test/e2e/sampleE2Etest.coffee`に対応するmockで、`sampleE2Etest.coffee`の中で`sample-mock.coffee`を呼び出してやればいい。



```coffeescript:test/e2e/sampleE2Etest.coffee
describe "sampleE2Etest", ->
  ptor = undefined
  beforeEach ->
    ptor = protractor.getInstance()
    mock = require '../mock/sample-mock.coffee' # ここにパスを指定
    ptor.addMockModule('httpBackendMock', mock) # addする
```

これをかくと、`sampleE2Etest.coffee`実行中に**`/api/search_user/`にgetのhttpリクエストが送られた場合、`respond()`の中に指定したデータが返ってくる**。これにてe2eテストがしやすくなる。

## **whenPOST**

`whenPOST`も基本的には同じである。

```coffeescript:test/mock/sample-second-mock.coffee
module.exports =
  Mock = ->
    angular.module("httpBackendMock", ["ngMockE2E"]).run ($httpBackend) ->
      $httpBackend.whenPOST("/api/somepost").respond({
        "status": 200
        "message": "OK"
      })
```

上を`sampleSecondE2Etest.coffee`で`addMockModule`すれば、**`/api/somepost/`にpostのhttpリクエストが送られたとき、`respond()`の中に指定したデータをレスポンスするようになる。**

## **エラー時**

エラーが起きた時も以下のように指定できる。**`whenPOST`の第2引数は送信を仮定するデータで、`respond()`は、これまでと同じように、その結果である**。以下は、ユーザーがログインに失敗したパターンを想定している。

```coffeescript
$httpBackend.whenPOST("/api/login",
    {
      user:
        email: "test@example.com"
        password: "password"
        password_confirmation: "passwordpassword"
    }
  ).respond(422, {
    "status": 422,
    "messages": "パスワードが一致しません。"
})
```


# **まとめ**

`$httpBackend`をつかうと、特定のAPI通信の送受信の結果を指定することができるので、安心してe2eのテストを書くことができる。また、サーバを用意しなくてもモックでテストが書ける。



# 参考

* <a href="https://docs.angularjs.org/api/ngMockE2E/service/$httpBackend" target="_blank">AngularJS: API: $httpBackend</a>
* <a href="http://qiita.com/katahirado/items/a9a71c66c10bd9970b9b" target="_blank">AngularJSのProtractorでngMockE2Eの$httpBackentを使ってテストを書く際に気をつけること - Qiita</a>
JavaScriptを使用したdisplayプロパティの実装メモ

# JavaScriptを使用したdisplayプロパティの実装メモ


## メモ
出向先で実装するように言われたので実装しました。
JavaScriptを使用したdisplay のメモです。div と tr で若干違うのでメモ。
Webページの一部を折りたたんで表示する際に、JavaScriptで要素のdisplayプロパティを書き換えることがよく行われます。divなどのブロックレベル要素の場合、「要素.style.display = 'none';」でその要素が非表示になり、「要素.style.display = 'block';」で表示されます。ところが、この手法を使って、表のある行（tr要素）の表示／非表示を切り替えようとしたところInternet Explorerでは希望通りの動作になりましたが、その他のブラウザでは表が崩れてしまうようですのでその対応メモ。 


## div のdisplay

```html:

<select name="Goods" onchange="chkSelect();">
	<option value="hoge" >ほげ</option>
	<option value="piyo" >ぴよ</option>
	<option value="fuga" >ふが</option>
</select>

<div style="display: block;" id="default">
でふぉると
</div>

<div style="display: none;" id="hoge">
ほげ
</div>

<div style="display: none;" id="piyo">
ぴよ
</div>

<div style="display: none;" id="fuga">
ふが
</div>


```


```js:イベントドリブン箇所

function chkSelect() {
	$val = $("select[name='Goods']").val();
	
	if($val == 'hoge'){
		document.getElementById("hoge").style.display="block";
	}else {
		document.getElementById("hoge").style.display="none";
	}
	
	if($val == 'piyo'){
		document.getElementById("piyo").style.display="block";
	}else {
		document.getElementById("piyo").style.display="none";
	}
	
	if($val == 'fuga'){
		document.getElementById("fuga").style.display="block";
	}else {
		document.getElementById("fuga").style.display="none";
	}
}

```


## テーブル箇所メモ
HTML 4.0やXHTML 1.0等では、tr要素はブロックレベル要素には含まれていないため"block"ではなく代替として''を使用することになります。Internet Explorerだけ例外なのはInternet Explorerオレオレ仕様だからだそうです。


## tr のdisplay



```html:

<table>
	<tr id="default" style="">
		<td>でふぉると</td>
	</tr>

	<tr id="toggle_row_1" style="display: none;">
		<td>ほげ</td>
	</tr>
	<tr id="toggle_row_2" style="display: none;">
		<td>ふが</td>
	</tr>
	<tr id="toggle_row_3" style="display: none;">
		<td>ぴよ</td>
	</tr>
</table>

<input id="" name="" type="button" value="項目を追加する" onclick="return toggle_row();">

```


```js:イベントドリブン箇所

var cnt = '1';

function toggle_row() {
	var obj1 = document.getElementById('toggle_row_1');
	var obj2 = document.getElementById('toggle_row_2');
	var obj3 = document.getElementById('toggle_row_3');
	
	if(cnt == '1'){ obj1.style.display = '';}
	if(cnt == '2'){ obj2.style.display = '';}
	if(cnt == '3'){ obj3.style.display = '';}
	
	cnt++;
	return false;
}

```
標準ライブラリ csv に Missing or stray quote in line *** とか言われたら

このような CSV ファイルがあって、

```csv:test.csv
foo,bar,baz
hoge,"f\"u\"ga",piyo
```

適当にパースしようとしたところエラーになりました。

```
$ cat test.csv | ruby -rcsv -e 'CSV(STDIN).each {|r| p r }'
["foo", "bar", "baz"]
/home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1844:in `block (2 levels) in shift': Missing or stray quote in line 2 (CSV::MalformedCSVError)
        from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1817:in `each'
        from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1817:in `block in shift'
        from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1777:in `loop'
        from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1777:in `shift'
        from /home/vagrant/.rbenv/versions/2.1.2/lib/ruby/2.1.0/csv.rb:1719:in `each'
```

よくみるとダブルクォートのエスケープが変ですね。
`\"` を `""` に置換してから再度チャレンジ。

```
$ sed -e 's/\\"/""/g' test.csv | ruby -rcsv -e 'CSV(STDIN).each {|r| p r }'
["foo", "bar", "baz"]
["hoge", "f\"u\"ga", "piyo"]
```

[RFC4180](http://www.ietf.org/rfc/rfc4180.txt) に軽く目を通した限りではバックスラッシュによるエスケープ方法はなさそうですが、どうやってこのファイルができたのか謎は深まるばかり。
でもとりあえず問題は解決したのでよしとする。
EdisonをIntel IoT Platformでアクティベートした時のdeviceTokenの保存場所

##困ったこと

Edisonを使ってIntel IoT Platformにセンサーデータを送るために、iotkit-adminコマンドを使ってアクティベーションをかけたのはよいが、後々APIを使ってアクセスする際に使うことになるdeviceTokenのありかが分からなかった。iotkit-adminの実行中のログにはsaving device tokenのメッセージが出るのだけど、どこに保存しているのかのメッセージは出ず。IoT Platformのgetting startのドキュメントにも記載がなかった（もしかしたら他のドキュメントには記載があるのかも。まだ全部読んでません。）。

##調べた

Edisonをデバイス登録し、アクティベーションをかけた際に発行されるdeviceTokenは、以下のファイルに保存されている模様。

`/usr/share/iotkit-agent/certs/token.json`

こちらのファイルを開くと

```json:token.json
{
    "deviceToken":"xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "accountId":"yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
}
```

とあるので、こちらのdeviceTokenを使えばよい。

##使ってみた

EdisonからNodeを利用してアクセスする場合は、jsonのファイルなのでrequireを利用して読み込んで使うだけ。
以下コードの一部抜粋。

```js:利用例
var util = require('util'),
async = require('async'),
SensorTag = require('sensortag'),
request = require('request'),
token = require('/usr/share/iotkit-agent/certs/token.json'); //requireでtoken.jsonを読み込む
                                      //
                                      //
                                      //
                                      //
var sendObservation = function(observation,callback) {
  console.log(JSON.stringify(observation));
  var options = {
    "url":util.format("%s/data/%s",BASE_URL,DEVICE_ID),
    "proxy":null,
    "method":"POST",
    "json":true,
    "followAllRedirects":true,
    "strictSSL":false,
    "body":observation,
    "headers":{"Authorization":"Bearer " + token.deviceToken}
  };
  request(options,function(err,res,body){
    var statusCode = res.statusCode;
    var data = null;
    if(!err && (statusCode===200||statusCode===201||statusCode===204)){
      if(statusCode===200||statusCode===201){

                                      //
                                      //
                                      //
                                      //
```
【FileMaker】ボタンのこれはどう書く？　「全レコード削除」

:::note info
2022年12月にリリースされたFileMaker バージョン19.6.1の情報も含めた新しい内容でレコード削除の記事を公開しています。
こちらもぜひ参考にしてください。

【FileMaker】「全レコード削除」更新版
https://qiita.com/tyuma/items/cdb6526b649539daef69
:::

前も書いたかもしれないけれど、使い始めた時、Excelのマクロ記録のような機能があったらどんなに便利か。。。と思ったボタン動作のスクリプトでの表現。

ということで、今回は「全レコード削除」です。

気づけば、「あぁ〜」なんですけどね。

```
レイアウト切り替え [「レイアウト１」 (レイアウト１データ)]
全レコードを表示
対象レコード削除 []
```

以上！

「あぁ〜」だったでしょ？

「全レコードを表示」すると「対象レコード」の範囲設定ではなくなると思っていた（思い込み）ので、「全レコードを表示」した後にどうやって全レコードを選択するのか分からなかったけれど、「全レコードを表示」すれば、「**全レコードが対象**」になるんですね〜。
JavaScriptを使用したバリテーションの実装メモ

# JavaScriptを使用したバリテーションの実装メモ


## メモ
出向先で実装するように言われたので実装しました。
JavaScriptを使用したバリテーションです。未選択の場合、アラートで対応しサブミットしません。値がセットされているときだけサブミットします。image ですがSmartyなどでissetで確認しテンプレートに非表示か否かで空を出すことでJavaScriptで認識させられます。今回はヌル値チェックだけですが正規表現でもいけそうです。



```html:

<form id='SendForm' action="ポスト先" method="post" enctype="multipart/form-data">
	<input id="text_1" type="text" name="text_1" size="25" maxlength="256" value="" />
	<input id="file_1" type="file" name="file_1">
	<image id="image_1" alt="" src="">

	<input id="register-button" type="button" value="登録" >
</form>

```


```js:イベントドリブン箇所

$(document).ready(function(){
	//登録ボタンイベント
	$("#register-button").click(function(e) {
	var error = '';
	error = chkValidation();
		if(error == ''){
			e.preventDefault();
			$("#SendForm").submit();
		}else {
			alert(error);
		}
	});
});


```



```js:バリテーション箇所

function chkValidation(){
	var error = '';

	var text_1 = document.getElementById("text_1").value;
	var file_1 = document.getElementById("file_1").value;
	var image_1 = document.getElementById("image_1").getAttribute('src');
	
	if(text_1 == ''){
		error = error + 'テキストが未入力です。\n';
	}
	if(file_1 == ''){
		error = error + 'ファイルが未選択です。\n';
	}
	if(image_1 == ''){
		error = error + '画像がセットされていません。\n';
	}

	return error;
}


```
Vagrantコマンドメモ : global-status

# Vagrantコマンドメモ global-status
全てのVagrantマシンの状態を確認するコマンド。

## global-statusコマンド
`vagrant global-status`

global-statusを実行すると現在ログインしている環境にある、全てのVagrant環境の状況がわかります。

注意点としては、キャッシュを元にしたデータがリストるため、実際の状態かどうかがわかるわけではなく、例えば、直接ファイルを削除した場合、global-statusに表示されてしまいます。

## --pruneオプション
無効なエントリーを取り除きたい場合、`--prune`　フラグをつけて実行します。

`vagrant global-status --prune`

## VagrantマシンIDの利用
global-statusで表示される”a1b2c3”のようなIDは、Vagrantマシンを操作する時に使用することが出来ます。
他のコマンドと異なり、どこのディレクトリにいても操作できるようになります。

*例*
`vagrant destroy a1b2c3`


* * *
参考サイト：[Vagrant Docs global-status](https://docs.vagrantup.com/v2/cli/global-status.html)
Rails で 指定した ID 順に取得する

# やりたいこと

Rails で API サーバーとか作ってると、データを取得する際、一旦 id の配列だけを返して、
実データは別途その id の配列を送信して取得するみたいな処理をやることが多々ある。

その返却した id の配列の順序に意味がある場合、そのまま単純に ActiveRecord でデータを取得すると、
id 順 ( scope で順序を指定してるとそれ順 ) になってしまうので、それをもらった id の配列順でデータを
返却する際のやり方を調べた際のメモ。

# サンプルコード
ユーザーの id の配列をアクセス日時の降順で返却するエンドポイント ( ids ) があって、
ids 順どおりに、ユーザー情報を返却するエンドポイント ( lookup ) の場合

```ruby:app/users_controller.rb
class UsersController < ApplicationController

  # GET /users/ids
  def ids
    @users = User.all.order(accessced_at: :desc)
    render json: @users.pluck(:id)
  end

  # GET /users/lookup?ids[]=1&ids[]=2
  def lookup
    @users = User.where(id: params[:ids]).sort_by{|c| params[:ids].map(&:to_i).index(c.id)}
    # view が用意されている前提です。
    # app/views/users/lookup.json.jbuilder
  end
end
```

`params[:ids].map(&:to_i)`については、JSON を POST する場合 ( `"ids": [1,2,3]` ) などは、
`prams[:ids]` の中身は数値の配列 ( `[1,2,3]` ) なんだけど、GET パラメータでの場合は、`["1","2","3"]` と文字列で受け取るので、GET パラメータにも対応するために map で数値に変換してます。
JenkinsでリモートJOB実行する際に500エラー(java.lang.IllegalStateException: Form too large)とか出るときの対処

# 起きたこと
* GithubのWebhookを利用してリモートからJobを実行していた
 * やりたかったのは以下の様なこと
 * [JenkinsがGithubにpushされたbranchをテストする](http://r9.hateblo.jp/entry/20130522/p1)
* ファイルを多く更新したPushからのWebhookで500エラーになっている
* 以下の様なエラーがbodyで返っていた・・・
 
```
javax.servlet.ServletException: java.lang.IllegalStateException: Form too large 2424624>200000
```
* ようするにPOSTで送信するデータサイズの制限エラー

# Jenkinsのjetty.xmlどこ？
* jettyで設定するのかと色々頑張ったが見つからん
* わからん

# /etc/sysconfig/jenkinsの以下部分で設定してJenkins再起動
## デフォルト
```
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
```
## 設定後
```
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dorg.eclipse.jetty.server.Request.maxFormContentSize=-1"
```
* -1は無制限
* デフォルトは200000
* 必要な分を設定してください

失敗していたリクエストをRedeliverしてみると無事成功した。
change_column で 型を integer や boolean に変更すると失敗する問題の解決方法

# はじめに

change_column で string 型 だったフィールドを boolean に変更しようとしたら、失敗しました。`Specify a USING expression to perform the conversion.` と言われました。

```bash
[~/RubymineProjects/drwallet]$ rake db:migrate
==  ChangeColumnsToCreditCards: migrating =====================================
-- change_column(:credit_cards, :etc_issuance, :boolean)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::Error: ERROR:  column "etc_issuance" cannot be cast automatically to type boolean
HINT:  Specify a USING expression to perform the conversion.
: ALTER TABLE "credit_cards" ALTER COLUMN "etc_issuance" TYPE boolean/Users/gam0022/RubymineProjects/drwallet/db/migrate/20150206071431_change_columns_to_credit_cards.rb:3:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
```

# 解決方法

検索したらありました。

http://stackoverflow.com/questions/13170570/change-type-of-varchar-field-to-integer-cannot-be-cast-automatically-to-type-i

変更後の型を、通常であれば `:integer` とするところを、`'integer USING CAST(column_name AS integer)'`のようにすれば良いみたいです。

:boolean の場合でも同様の方法で解決できます。

```diff:migration.rb
-change_column :table_name, :column_name, :integer
+change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
```

## 補足

string から boolean にするときなどは、'true' や 'false' 以外のデータが入っていると上の方法でも失敗するので、全てのデータを 'false' などに置き換えて下さい。
テスト用に Linux で Subversion を最速で最低限の設定で稼働させる方法

こんにちは。エクセルソフトの田淵です。

Xamarin Studio / Visual Studio の両方で Subversion を使う必要があり、テスト用に最低限のそれっぽい設定で動かしたかったのですが Web にあるのは Apache 経由などばかりなので備忘録としてエントリーを残しておきます。

# 環境

Linux は VMware で Cent OS 6.4 x64 を作ってあったのでそれを使いましたが、なんでもよいでしょう。
Visual Studio のアドインは [VisualSVN](https://www.visualsvn.com/visualsvn/download/) にし、Windows の Subversion クライアントは [TortoiseSVN](https://www.visualsvn.com/visualsvn/download/tortoisesvn/) を使用しましたがこれもお好きなものをお使いください。

# インストール

```shell-session
# yum install svn
# svnserve --version
svnserve, バージョン 1.6.11 (r934486)
```
Cent なので yum にしてますが、Debian 系お使いの方は apt-get でもなんでも。CentOS 6.4 だと svnserve 1.6.11 がインストールされるようです。

# 設定

デフォルトで ```/var/svn``` にレポジトリが出来るとどこかに書いてありましたがアクセス出来ませんでしたので、起動スクリプト (```/etc/init.d/svnserve```) にあるように ```/etc/sysconfig/svnserve``` ファイルに ```/var/svn/repos``` を root ディレクトリとして指定したいと思います。またテスト用なので Anonymous に write 権限与えてますし、trunk/branches/tags なども作成していませんが適宜設定してください。

### ディレクトリ作成とレポジトリ作成

```shell-session
# mkdir -p /var/svn/repos
# svnadmin create /var/svn/repos/
```

### レポジトリの設定

```shell-session
# vi /var/svn/repos/conf/svnserve.conf
```

```anon-access = read``` のコメントとスペースを外し**行頭から** anon が来るようにし、保存 (行頭に文字が無いと ```Unable to connect... /var/svn/repos/conf/svnserve.conf: 12: Option expected``` というエラーで接続できません。)

### svnserve の設定

```shell-session
# vi /etc/sysconfig/svnserve
```

```OPTIONS="-r /var/svn/repos"``` と書いて保存

### 起動と chkconfig

```shell-session
# service svnserve start
# chkconfig svnserve on
```

これで ToroiseSVN などでアクセスできるはずです。

![スクリーンショット 2015-02-06 16.02.39.png](https://qiita-image-store.s3.amazonaws.com/0/32453/b8eb3c68-708f-f70c-7b01-480d011e5851.png)


# VS から Commit してみましょう

プロジェクトを作成/開いて ```VISUALSVN > Add Solution to Subversion``` を選択します。
![スクリーンショット 2015-02-06 16.20.08.png](https://qiita-image-store.s3.amazonaws.com/0/32453/eb3a0356-7c59-ccfc-d499-6de119e30814.png)

![スクリーンショット 2015-02-06 16.01.51.png](https://qiita-image-store.s3.amazonaws.com/0/32453/cf7a278f-95de-228f-19ed-f59d4a9a5787.png)

![スクリーンショット 2015-02-06 16.02.51.png](https://qiita-image-store.s3.amazonaws.com/0/32453/a84379c6-0920-5f49-d59c-5519b502cf8b.png)

Import が完了したらそのまま ```VISUALSVN > Commit``` します。
![スクリーンショット 2015-02-06 16.03.43.png](https://qiita-image-store.s3.amazonaws.com/0/32453/c621a58b-f61d-54ff-b0e5-174437b4a03f.png)

TortoiseSVN からレポジトリに Commit されているのを確認できました。

![スクリーンショット 2015-02-06 16.04.12.png](https://qiita-image-store.s3.amazonaws.com/0/32453/d7365937-6cea-dd51-907f-922e7bf09ed5.png)

## 以上です

とりあえず最低限動かすところまで纏めました。
ある程度ちゃんとやる場合は、
[Subversion/サーバ側 - Global Wiki](http://www.betatechnology.jp/pp/index.php?Subversion%2F%E3%82%B5%E3%83%BC%E3%83%90%E5%81%B4)
[Subversion1.5.2 svnserve.confでのセキュリティ保護 | 世界はどこまでもシンプルである](http://daipresents.com/2008/subversion152svnserveconf/)
などを参照いただくと良いかと思います。