OmniAICreator/Qiita-1.07M huggingface dataset:
gtags.vimでエラーが出る

Ubuntu 15.04でGNU GLOBALをvimで使おうとして、gtags.vimを利用しようとしたらエラーが出た。

```
Error: invalid arguments. (gtags.vim requires GLOBAL 5.7 or later)
```

GNU GLOBALのバージョンは5.7.1
vimのバージョンは7.4.488
何れもapt-getで入れた。

ただし、gtags.vimはNeoBundleに頼んで`NeoBundle 'vim-scripts/gtags.vim'`で入れた。

こうすると古いGNU GLOBALと新しいgtags.vimが混ざってしまい問題が起きる。

ググってみると同じ問題起きてる人が世界中にいるけど、原因に気付いていないっぽいので書いておく。

応急処置
-------

gtags.vimの215行目付近を次の様に書き換える

```:before
if !exists("g:Gtags_Result")
    let g:Gtags_Result = "ctags-mod"
endif
```

```:after
if !exists("g:Gtags_Result")
    let g:Gtags_Result = "ctags"
    let g:Gtags_Efm = "%m\t%f\t%l"
endif
```

とりあえず動く。

真の対処法
---------
新しいバージョンのGNU GLOBALを入れるか、古いgtags.vimを手動管理する。
elfsharp > ReadSectionHeader(int index)の構造 > SectionHeader() > ReadSectionHeader()

[elfsharp/ELFSharp/ELF/ELF.cs](https://github.com/konrad-kruczynski/elfsharp/blob/0a361d9feaa4b4282c929a3de060198e1385d571/ELFSharp/ELF/ELF.cs)
にある private SectionHeader ReadSectionHeader(int index) の処理は

```csharp
private SectionHeader ReadSectionHeader(int index) {
  Seek(...); // indexに基づく読み取り位置のシーク
  SectionHeader(...) : {
    this.reader = reader;
    this.table = table;
    this.elfClass = elfClass;
    ReadSectionHeader() : {
      NameIndex = reader.ReadUInt32();
      if(table != null)
      {       
      ...
      EntrySize = ReadAddress();      
    }  
  }
}
```

上記において `SectionHeader() : { 処理A }` という書き方は SectionHeader()という関数内で処理Aをしている、という意味とする[思いつきの独自表記です]。

混乱を生じたのは ```ReadSectionHeader(index)```の2つ下層の処理にて同じ名前の```ReadSectionHeader()```という引数なしの関数で処理していることだった。
input や textarea で size や cols を使ってはならぬ

HTML フォームの入力欄の長さがある日突然長～く伸びてしまい，レイアウトが狂いまくりました。

[もずはっく日記(2015年8月)](http://www.d-toybox.com/studio/weblog/show.php?mode=single;id=2015081600) によると，input の長さを size 属性で指定している場合，Windows 7 + Firefox 40 の組み合わせでそうなるようです。
詳細が載っていますので，ぜひご一読を。

それによると，上記の組み合わせが悪い，という単純な話ではないようです。
そもそも input の size 属性や textarea の cols 属性を指定した場合に，実際にどういう大きさになるかはウェブ標準ではハッキリせず，これを用いたレイアウトはスジ悪ということみたいですね。
CSS の width とか max-width などのプロパティーでやりましょう，と。
【Javascript】Object.createとfor in文


##for in 文はプロトタイプチェーン上のプロパティも取得する
for in文を利用すると、オブジェクト内に存在するすべてのプロパティの名前を順に取り出すことができる。ただし、そこには、関数やプロトタイプチェーン上のプロパティも含まれる。
「プロトタイプチェーン上のプロパティとは何のことを言っているのか？」をObject.createを使って説明する。
Object.createは新しいオブジェクトを生成する。この生成されるオブジェクトはObject.createの第一引数に渡したオブジェクトをプロトタイプとする。また、プロトタイプとするオブジェクトをプロトタイプオブジェクトと呼ぶ。
下記のように、stoogeオブジェクトをプロトタイプする新しいオブジェクトanother_stoogeをObject.createを使って生成する。
このとき、for in文でanother_stoogeオブジェクトのプロパティを取り出すと、another_stoogeのプロパティ「first-name: Harry」、「middle-name: Moses」、「nickname: Moe」以外のプロパティが取り出される。
another_stoogeオブジェクトはstoogeオブジェクトをプロトタイプとして生成されたため、stoogeオブジェクトのプロパティである「last-name: Howard」、「profession: actor」も取り出される。
また、すべてのオブジェクトはObject.prototypeオブジェクトとリンクしてるので、Object.prototypeに設定した。barとbar_funcも取り出される。このようなオブジェクトのプロトタイプの連鎖をプロトタイプチェーンと言い、for in文はプロトタイプチェーン上のプロパティも取得する。another_stoogeのプロパティのみを取り出したいときは、hasOwnPropertyメソッドを使用する。

```js:

if (typeof Object.create !== 'function') {
     Object.create = function (o) {
         var F = function () {};
         F.prototype = o;
         return new F();
     };
}

Object.prototype.bar = 1; 
Object.prototype.bar_func = function(){alert();}

var stooge = {
"first-name": "Jerome",
"last-name": "Howard"
};

//stoogeオブジェクトをプロトタイプする新しいオブジェクトanother_stoogeをObject.createを使って生成する。
var another_stooge = Object.create(stooge);

another_stooge['first-name'] = 'Harry';
another_stooge['middle-name'] = 'Moses';
another_stooge.nickname = 'Moe';

stooge.profession = 'actor';

for (var nm in another_stooge) {
  document.writeln(nm + ': ' + another_stooge[nm]+"<br/>");
}

/*
結果

first-name: Harry
middle-name: Moses
nickname: Moe
last-name: Howard
profession: actor
bar: 1
bar_func: function (){alert();}

*/


for (var nm in another_stooge) {
  if(another_stooge.hasOwnProperty(nm)){
    document.writeln(nm + ': ' + another_stooge[nm]+"<br/>");
  }
}

/*
結果

first-name: Harry
middle-name: Moses
nickname: Moe

*/

```



##参考文献
Douglas Crockford 著 水野貴明 訳『JavaScript:The Good Parts』(オライリー・ジャパン発行、2008) p26-27
【Go】Goのsort.SearchInts()はPHPのin_array()とは全然違った！

最近Goを始めたばかりのPHPerなのですが、PHPのin_array()のようなものをGoでも使いたいな、、と。
調べると、「sort」というパッケージを発見しました。

ちょうどその時やりたかったことが、sort.SearchInts()で実現できるのでは！？
と思ったのですが、全然違った、というお話です。

## Go公式サイトの日本語翻訳サイトで調べてみた
http://golang.jp/pkg/sort

上記のSearchInts()の説明では、

>SearchIntsは、ソート済みintのスライスからxを検索し、Searchで規定されているインデックスを返します。

とあります。

返り値がそもそも真偽値ではないのでin_array()と違うのは当然ですが、
それでも、検索結果がなければ、ないことがわかるような値が返ってくるのではと漠然と思っていました。

```go
package main

import (
    "fmt"
    "sort"
)

func main() {
    a := []int{1,9,3,7,5}
    // まずソートする
    sort.Ints(a)
    fmt.Printf("%v\n", a) // [1 3 5 7 9]

    // インデックス3が返ってくるはず...
    b := sort.SearchInts(a, 7)
    fmt.Printf("%v\n", b) // 3

    // スライスの中にないことが分かるような値が返ってきてほしい...
    c := sort.SearchInts(a, 4)
    fmt.Printf("%v\n", c) // 2
}
```

！？

```go
c := sort.SearchInts(a, 4)
fmt.Printf("%v\n", c) // 2
```

スライスの中に値がなくても数値が返ってきました。。

## 本家のドキュメントで確認しよう
そこで、改めて[本家のドキュメント](https://golang.org/pkg/sort/#SearchInts)を見てみると、

```go
func SearchStrings(a []string, x string) int
```
>SearchStrings searches for x in a sorted slice of strings and returns the index as specified by Search. **The return value is the index to insert x if x is not present (it could be len(a)).** The slice must be sorted in ascending order.

おや...

>**The return value is the index to insert x if x is not present (it could be len(a)).**

英語あんまりわからないけど、´・ω・
「xがない場合は、xが挿入される箇所のインデックスが返される」みたいなことが書いてあります。（あってるかな？）

なので、

```go
c := sort.SearchInts(a, 4)
fmt.Printf("%v\n", c) // 2
```
の例だと
「4はスライスの中に値はないけど、対象のスライスのソート順だとインデックス2の位置に入りますよ。」
という情報が得られるようです。

間違っていたらご指摘いただけるとありがたいです・ω・


## 結局
in_array()は下記を参考に自前で用意します。。
http://qiita.com/taro_sakura/items/32552e2d953cd73f578b
https://gist.github.com/kn9ts/3b9833758283993264b0
csharp > usingステートメント > 自動的にDispose()を呼び出してくれ、しかも、例外にも対応してくれる便利な構文


usingについて
MSDNのマニュアルより以下の方がわかりやすかった。

http://www.divakk.co.jp/aoyagi/csharp_tips_using.html

> C#には、自動的にDispose()を呼び出してくれ、しかも、例外にも対応してくれる便利な構文があります。 それがusingです。 usingを使うとこんな風に書けます。

```csharp
public void Func() {
    using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read)) {
        using (StreamReader sr = new StreamReader(fs)) {
            // 処理する
        }
    }
}
```

> このコードは下記のコードとまったく同じ意味です。 実際、これらのコードのILを見比べると100%まったく同じです。

```csharp
public void Func() {
    FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read);
    try {
        StreamReader sr = new StreamReader(fs);
        try {
            // 処理する
        }
        finally {
            if (sr != null) {
                sr.Dispose();
            }
        }
    }
    finally {
        if (fs != null) {
            fs.Dispose();
        }
    }
}
```

> ただ、逆に言うとusingは自動的にtry ... finally を作ってくれて、finallyで必ずDispose()を呼び出すようにしてくれるだけです。 なので、例外に対処するために下記のようなコードになることが多いでしょう。

```csharp
public void Func() {
    using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read)) {
        using (StreamReader sr = new StreamReader(fs)) {
            try {
                // 処理する
            }
            catch () {
                // 例外処理
            }
        }
    }
}
```

<hr>
(2015/08/25 追記)
@muro さんからnew時の例外についてのコメントをいただきました。
また、FileStream()の引数についても訂正コメントいただき、対応箇所を訂正しました。
Aws::S3::Clientでリージョンをまたぐコピーをするときは、コピー先のリージョンを明示してやる。

たとえばダウンロード販売のコンテンツを置く場合など

- 長期間ホストするファイルの容量が大きい
- 頻繁なリージョン間転送（EC2など）は発生せず、インターネットへの転送がメイン
- そこまでダウンロード速度を要求しない

こんなとき、S3バケットを価格の安いリージョンに作るのがよいです。

今回、東京リージョンのS3にアップロードされたオブジェクトの一部をシンガポールリージョンにコピーする必要があったのでそのメモです。

## サンプルコード

確認環境

- aws-sdk-core (2.1.11)


### リージョンをまたがないとき

```ruby
s3 = Aws::S3::Client.new
resp = s3.copy_object(
    copy_source: ['src-bucket', 'path/to/src'].join('/'),
    bucket: 'dst-bucket',
    key: 'path/to/dest')
```

## リージョンをまたぐとき

Aws::S3::Client.newのコンストラクタで、<b>コピー先のリージョン</b>を明示してやらないと`AWS::S3::Errors::PermanentRedirect`が発生します。

コピー元のリージョンではだめです。

```ruby
s3 = Aws::S3::Client.new('ap-southeast-1') # シンガポールリージョン
resp = s3.copy_object(
    copy_source: ['src-bucket', 'path/to/src'].join('/'),
    bucket: 'dst-bucket',
    key: 'path/to/dest')
```
elfsharp > private SectionHeader ReadSectionHeader(int index)

http://qiita.com/7of9/items/7f9fe4f064e1e23c86ac
で使われている ReadSectionHeader()の実装

[elfsharp/ELFSharp/ELF/ELF.cs]
(https://github.com/konrad-kruczynski/elfsharp/blob/0a361d9feaa4b4282c929a3de060198e1385d571/ELFSharp/ELF/ELF.cs)

```csharp
private SectionHeader ReadSectionHeader(int index)
        {
            if(index < 0 || index >= sectionHeaderEntryCount)
            {
                throw new ArgumentOutOfRangeException("index");
            }
            stream.Seek(
                sectionHeaderOffset + index*sectionHeaderEntrySize,
                SeekOrigin.Begin
            );
            using(var reader = localReaderSource())
            {
                return new SectionHeader(reader, Class, SectionsStringTable);
            }
        }
```
elfsharp > ReadStringTable()


ELFの処理の上位

```csharp:ELF.cs
internal ELF(string fileName)
        {
            this.fileName = fileName;
			if(ELFReader.CheckELFType(fileName) == Class.NotELF)
			{
				throw new ArgumentException("Given file is not proper ELF file.");
			}
            stream = GetNewStream();
            ReadHeader();            
            ReadStringTable();
            ReadSections();
            ReadSegmentHeaders();
        }
```

ここでコールされている ReadStringTable() の実装は以下の通り。

```csharp
 private void ReadStringTable()
        {
            if(!HasSectionHeader || !HasSectionsStringTable)
            {                
                return;
            }
            var header = ReadSectionHeader(stringTableIndex);
            if(header.Type != SectionType.StringTable)
            {
                throw new InvalidOperationException("Given index of section header does not point at string table which was expected.");
            }
            SectionsStringTable = new StringTable<T>(header, readerSource);
        }
```

上記で問題となる stringTableIndex は ReadFields() で読込む。


ReadStringTable()内でReadSectionHeader()がコールされている。
ReadSectionHeader()内でReadStringTable()で読み込んだtableが使われる、という一種無限ループ状態になっているかと思ったが、

```
if (table != null) {
    Name = table[NameIndex];
}
```
という仕組みでうまく動いているようだ。
elfsharp > private void ReadSectionHeader() の実装と使用例


[elfsharp/ELFSharp/ELF/Sections/SectionHeader.cs](https://github.com/konrad-kruczynski/elfsharp/blob/0a361d9feaa4b4282c929a3de060198e1385d571/ELFSharp/ELF/Sections/SectionHeader.cs)

```csharp
private void ReadSectionHeader()
        {
            NameIndex = reader.ReadUInt32();
            if(table != null)
            {
                Name = table[NameIndex];
            }
            Type = (SectionType)reader.ReadUInt32();
            RawFlags = ReadAddress();
            Flags = unchecked((SectionFlags)RawFlags);
            LoadAddress = ReadAddress();
            Offset = ReadOffset();
            Size = ReadOffset();
            Link = reader.ReadUInt32();
            Info = reader.ReadUInt32();
            Alignment = ReadAddress();
            EntrySize = ReadAddress();
        }
```

上記によりSectionHeaderを読み込んでいる。

---
table[NameIndex]はあらかじめtableを読み込んでおかないといけない。

実際にはtable[]には以下のような0x00が途中に含まれるstringTableが格納される。

```
[0] = 0x00
[1] = '.'
[2] = 's'
[3] = 'h'
[4] = 's'
...
[10] = 0x00
[11] = '.'
[12] = 's'
...
```
そして、NameIndexには0,1,2という連番でなく、上記のstringTableの項目が始まるインデックス(0, 1, 11, ...)が入るようだ。

---

ReadAddress()とReadOffset()は以下。

```csharp
        private ulong ReadAddress()
        {
            return elfClass == Class.Bit32 ? reader.ReadUInt32() : reader.ReadUInt64();
        }

        private long ReadOffset()
        {
            return elfClass == Class.Bit32 ? reader.ReadUInt32() : reader.ReadInt64();
        }
```

ReadSectionHeader()をどう使っているかというと

[ELFSharp/ELF/ELF.cs](https://github.com/konrad-kruczynski/elfsharp/blob/0a361d9feaa4b4282c929a3de060198e1385d571/ELFSharp/ELF/ELF.cs)

```csharp
248  for(var i = 0; i < sectionHeaderEntryCount; i++)
249	            {
250	                var header = ReadSectionHeader(i);
…	
306	            var header = ReadSectionHeader(stringTableIndex);
307	            if(header.Type != SectionType.StringTable)
```
【lightbox2】サムネイル画像があるもにはlightboxを適用させ、無いものはそのままで

この間、詰まってしまって色々ググったのだけど中々出てこなかったのでメモ程度に

###サムネイル画像があるもにはlightboxを適用させ、無いものはそのままで
***
（動的に並べていくとき、サムネイル画像があるものにはlightbox2を適用し、無いものにはnoimageサムネイルのみを表示させるやり方）

lightbox2を適用　ファイル名の数字の部分（連番や商品コードなど）が動的に変わるイメージです

```html
<a href="/Picture/Large_00.jpg" rel="lightbox">
      <img src="/Picture/Thumb_00.jpg">
</a>
```

まず、サムネイル画像が無いものに、noimageサムネイルを表示させます。

```html
<img src="/Picture/Thumb_00.jpg" onerror="this.src = '/Content/img/Contents/noImage.jpg';" />
```


サムネイルをクリックさせなくさせるために、以下のコードを書いていきます。

親のノードを削除するjavascriptでrel="lightbox"を削除します

```js
this.parentNode.removeAttribute('rel');
```

次にクリックできないようにします

```js
this.onclick = function () { return (false); };
```

最後にカーソルを人差し指に変えないようにidを付与してcssに書きます

```js
this.parentNode.setAttribute('id', 'none_img');
```
```css
#none_img {cursor:default}
```

全部まとめるとこうなります

```html
<a href="/Picture/Large_00.jpg" rel="lightbox">
   <img src="/Picture/Thumb_00.jpg" onerror="this.parentNode.setAttribute('id', 'none_img'); this.parentNode.removeAttribute('rel'); this.onclick = function () { return (false); }; this.src = '/Content/img/Contents/noImage.jpg';" />
</a>
```

こうすると、動的にサムネイル画像を並べていってもサムネイル画像の無いものにはlightbox2が適用されないです。

しかし長い・・・　もっと良い方法がありましたら教えてください＞＜
elfsharp > sectionIndicesByName.TryGetValue() > Dictionary使用

http://qiita.com/7of9/items/6dcc521c648598f3ab23
で出てきた`sectionIndicesByName.TryGetValue(name, out index)`の実装を探したが、出てきたのは以下のものだった。

link: [ELF.cs](https://github.com/konrad-kruczynski/elfsharp/blob/0a361d9feaa4b4282c929a3de060198e1385d571/ELFSharp/ELF/ELF.cs)

```csharp:ELF.cs
            if(HasSectionsStringTable)
245	            {
246	                sectionIndicesByName = new Dictionary<string, int>();
247	            }
248	            for(var i = 0; i < sectionHeaderEntryCount; i++)
…	
252	                if(HasSectionsStringTable)
253	                {
254	                    var name = header.Name;
255	                    if(!sectionIndicesByName.ContainsKey(name))
```

つまりは sectionIndicesByName.TryGetValue()というのはDictionary()の名前検索によりインデックスを取得している。
elfsharp > ELF.cs > TryGetSectionInner(string name, out Section<T> section)

GetSection()で使われているTryGetSetionInner()の実装。


[elfsharp/ELFSharp/ELF/ELF.cs](https://github.com/konrad-kruczynski/elfsharp/blob/0a361d9feaa4b4282c929a3de060198e1385d571/ELFSharp/ELF/ELF.cs)

```csharp
private GetSectionResult TryGetSectionInner(string name, out Section<T> section)
        {
            section = default(Section<T>);
            if(!HasSectionsStringTable)
            {
                return GetSectionResult.NoSectionsStringTable;
            }
            int index;
            if(!sectionIndicesByName.TryGetValue(name, out index))
            {
                return GetSectionResult.NoSuchSection;
            }
            if(index == SectionNameNotUniqueMarker)
            {
                return GetSectionResult.SectionNameNotUnique;
            }
            return TryGetSectionInner(index, out section);
        }
```

1. sectionIndicesByName.TryGetValue()でindexを取得する。
2. TryGetSectionInner(index, out section)でsectionを取得する。
IDとCLASSのセレクタ詳細度を同等にする方法

idセレクタとclassセレクタの詳細度を同等にする方法です。

属性セレクタを使います。

```css

[id="hoge"] {
  /* css style */
}
[class="huga"] {
  /* css style */  
}
 
/* [id="hoge"]と[class="huga"]の詳細度は同等 */

```

おわり
grepコマンドでヒットした数をカウントしました

grepコマンドでヒットした件数をカウントしたくなりました。

# -cオプションをつける
grepコマンドに`-c`を付けるみたいです。

```bash:ヒットした件数をカウント
grep -c "hoge"

#出力
14
```
`hoge`にヒットした件数が表示されました。これは便利(╹◡╹)
gatewayサーバを経由してDBにアクセスする方法(ポートフォワーディング)

# 概要

* とあるDBサーバに踏み台を経由して接続したい
* こんなかんじ

```
× : local → DB
○ : local → gateway → DB
```

* 全体像は分かったけど、実際どうすればいいんだ...?
* ってことで、やっとこさ出来たのでメモ代わりに

# 事前準備
* local → gatewayへsshできるように設定
* gateway → DBへ接続できるアカウントの作成
* localhostの開いているportと目的地のportを調べておきます
 * 以下のコマンドを打って、何も出てこなければ未使用です

```
 lsof -i :port番号
```

# コマンド
* gateway = 192.168.3.10
* DB = 192.168.3.11

```
ssh gateway-user@192.168.3.10 -f -N -L 55439:192.168.3.11:5439
psql -h localhost -p 55439 -U test_user -d Test
```

##　解説
* gateway-user@192.168.3.10
 * gatewayサーバのユーザ名@gatewayのIP or ドメイン
* -f 
 * バックグラウンドで実行
* -N 
 * トンネルとして接続(ssh先で何もしない)

*  55439:192.168.3.11:5439
 * 55439 → 自分の使いたいport
 * 192.168.3.11 → DBサーバのIP(目的地)
 * 5439 → 目的地のport 

# まとめ
* ポートフォワーディングの設定をして、gatewayサーバを経由し目的地に設定できるようにしました。

```
localhost:55439 → 192.168.3.10　→ 192.168.3.11:5439
```

* localの55439が192.168.3.11にひも付けられるってイメージかな?

とりあえず調べてTry&Errorで出来た！って感じなのでもっといい方法とか、簡単な方法とかを見つけたら修正していきます。
仮の画像の作る

# テーマ

>*『[あとで作る画像をとりあえず仮で速攻作る](http://qiita.com/akicho8/items/4296fe7266820ffe9d43#comment-ac0af2ba4b762e2452f5)』* - @akicho8

# [placeholder.com](https://placeholder.com/)

- `https://via.placeholder.com/[画像サイズ]`で必要なサイズの仮画像を取り寄せられる。

## 使用例

画像サイズを指定。

```html
<img src="https://via.placeholder.com/350x150">
```

![](https://via.placeholder.com/350x150)

さらに背景色、文字色、表示したい文も指定できる。

```html
<img src="https://via.placeholder.com/350x150/8ad5f0/08088A?text=Hello+world!">
```

![](https://via.placeholder.com/350x150/8ad5f0/08088A?text=Hello+world!)


# [ImageMagick](http://www.imagemagick.org/script/index.php)

- ターミナルで`convert`コマンドにより、ダミー画像ファイルを作ることが可能。

## 使用例

```
$ convert -background '#ccc' -fill '#555' -size 350x150 -gravity center -font Helvetica -pointsize 32 label:"Hello world\!" temporary.png
```

![temporary.png](https://qiita-image-store.s3.amazonaws.com/0/82804/0374432a-727d-42d6-8a0d-90adfcb5d858.png)

# Rails用ヘルパーメソッド - `placehold_img_tag`

- コーディングの練習を兼ねて作成。
- [placeholder.com](https://placeholder.com/)のラッパー。

```rb:/app/helpers/application_helper.rb
def placehold_img_tag(options={})
  opts = { dimension: "350x150", background_color: "ccc", text_color: "555", text: "" }.merge(options)
  image_tag("https://via.placeholder.com/#{opts[:dimension]}/#{opts[:background_color]}/#{opts[:text_color]}?text=#{opts[:text].tr(" ", "+")}")
end
```

## 使用例

```haml:index.html.haml
= placehold_img_tag dimension: "600x450", background_color: "abc", text_color: "567", text: "Hello world"
```
Ubuntu14.04LTSで出来るだけSecureなサーバを構築する


# 概要
VPSやEC2等のクラウドサーバ、ないしは外部向けの自宅サーバをUbuntuで建てるときに攻撃されない、攻撃の手助けをしないsecureなサーバを建てたいと思い、やったことの備忘録。

# ウィルス対策
clamav入れればよいようだ。絶対安心ではないが、ないよりは多分いいと思う。

```bash
$sudo apt-get install clamav-base clamav-daemon clamav-freshclam
```

おそらくインストール時にclamav-daemonが起動しようとして失敗する。ウィルス定義ファイルがないのに起動しようとして失敗する。なので、インストール後に、

```bash
$sudo /etc/init.d/clamav-freshclam start
```
として定期的にウィルス定義ファイルを更新してくれるデーモンを走らせる。参考までにプロキシ環境下の場合は以下の設定を行う。

```lang:/etc/clamav/freshclam.conf
HTTPProxyServer proxy.server.com
HTTPProxyPort 8080                      
HTTPProxyUsername myusername
HTTPProxyPassword mypass
```
プロキシによってはユーザ認証が無いかもしれない。その場合はusernameとpasswordの設定部分は記載不要である。

ログは`/var/log/clamav/freshclam.log`に格納されるので、確認して定義ファイルの取得が完了してから、

```bash
$sudo /etc/init.d/clamav-daemon start
```
として定期的（デフォルトだと1時間おき）にウィルスチェックが走る。1時間おきとか頻繁すぎるとか、もっと細かくチェックしてよ！という場合は以下の数値を変更する。

```lang:/etc/clamav/clamd.conf
SelfCheck 3600
```
他の設定項目についてはオフィシャルのドキュメントを参照されたい。

# Securityパッチを勝手に適用させる
これについては賛否両論あるだろうが、ずぼらな人にはオススメ。毎日確認しているような本物の管理者には不要の手順。

```bash
$sudo apt-get install unattended-upgrades
$sudo dpkg-reconfigure -plow unattended-upgrades
```
`dpkg-reconfigure`でYes/Noを問われるのでYesとしておく。
security update以外を適用したい場合は以下のコメントアウトを適宜はずす。あまりオススメはしないけど。

```lang:/etc/apt/apt.conf.d/50unattended-upgrades
// Automatically upgrade packages from these (origin:archive) pairs
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};
```

更新ログは`/var/log/aptitude`に格納されるので確認しておいたほうがいいと思う。

# Firewallを設定する
ufwを使うと楽。[Ubuntu14.04LTSにufwを入れてFW設定をする](http://qiita.com/ystkspr/items/41a7c784c8dba691453f "Ubuntu14.04LTSにufwを入れてFW設定をする")を参照されたい。
【さくらVPS】お名前.comで取得したドメインをさくらのVPSで使用する

何気にお名前.comでドメインを取得したことがなく、今回初めて使ったので表題の備忘録。
いろいろ調べましたが以下のページが最もわかりやすかった。
[お名前.comで取得したドメインをさくらサーバーで使用する](http://kaizensite.info/server/domain-sakura/)

結論から言うとさくら側とお名前.com側両方での設定が必要。
順番は 1.さくら側を設定→2.お名前.com側を設定。

#さくら側の設定
####1. コントロールパネルにログイン
####2. 左カラムのドメイン設定を選択<br>
![Screen Shot 2015-08-21 at 7.25.00 PM.png](https://qiita-image-store.s3.amazonaws.com/0/69560/c883c5ff-af2b-38d0-e139-a7272680e3f2.png)
<br>
####3.新しいドメインの追加をクリック<br>
![Screen Shot 2015-08-21 at 7.25.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/69560/d4127e67-8370-ecb1-8266-b646121c8481.png)
<br>
####4.「他社で取得したドメインを移管せずに使う、、」から「ドメインの追加へ進む」をクリック<br>
![Screen Shot 2015-08-21 at 7.25.19 PM.png](https://qiita-image-store.s3.amazonaws.com/0/69560/a6513cba-abfe-1ae2-5fe9-cf9de51f87e4.png)
<br>
####5.　「ドメイン名」にwww無しでドメインを記入。ここで表記されているネームサーバアドレスは後にお名前.comの設定で使う。<br>
![Screen Shot 2015-08-21 at 7.25.39 PM.png](https://qiita-image-store.s3.amazonaws.com/0/69560/bcb0ea35-1002-678c-284b-9893f4b1a123.png)

<br>
#お名前.com側の設定
####1. [ドメインNavi](https://www.onamae.com/navi/domain.html)にアクセス
####2. 会員ID(ドメイン登録時に届いているはずの「ネームサーバー情報変更 完了通知」メールに記載)と、ドメイン取得時に設定したパスワードを記入しログイン<br>
![Screen Shot 2015-08-21 at 7.28.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/69560/eff0a9f7-0655-8de1-ea69-df894e99074a.png)

<br>
####3. 左カラムから「ネームサーバーの変更 」を選択。<br>
![Screen Shot 2015-08-21 at 7.28.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/69560/a5bf523e-0498-a205-c2c9-4354a80e74db.png)
<br>
####4. アラートが表示されるが無視して手続きを進める。<br>
![Screen Shot 2015-08-21 at 7.29.44 PM.png](https://qiita-image-store.s3.amazonaws.com/0/69560/310105c9-643f-0a6e-8ab2-873d9f1efc95.png)
<br>
####5. 「他のネームサーバーを使用」タブを選択し、先ほどさくら側で確認したプライマリネームサーバー、セカンダリネームサーバーを記入。<br>
![Screen Shot 2015-08-21 at 7.25.39 PM copy.png](https://qiita-image-store.s3.amazonaws.com/0/69560/08b72334-f599-f9d5-5625-143d0df922a8.png)


<br>
<br>
以上で反映されるはずです。
僕は一瞬で反映されましたが、数時間〜２４時間かかる場合もあるようです。
MongoDB - シャード＋レプリカセット構成でのユーザ作成について


シャード＋レプリカセット構成でユーザ作成をする場合は、順番は多少前後してもよさそうだけど、まずレプリカセットでユーザを作成したあと、シャードでユーザを作成するのがよさそう

### 前提条件
* レプリカセットは構築済み
* シャード構成は構築済み
* mongosのポートは27017
* mongodのポートは27018
* mongocのポートは27019
* 「/etc/mongod/mongodb-keyfile」の権限は600で作成済み

### レプリカセットでユーザ作成
#### noauthモードでmongod起動
* mongodのauth関連の設定ファイルはこんな感じ

```
noauth=true
#auth=true
#keyFile=/etc/mongod/mongod-keyfile
```

#### 管理ユーザ作成
* mongodのPRAIMARYで実行する
* PRIMARYで実行するとSECONDARYに同期される

```
mongo --port 27018 admin
db.createUser( { user: "root", pwd: "PASSWORD", roles: [ "root", "backup", "restore", "readWriteAnyDatabase", "userAdminAnyDatabase", "dbAdminAnyDatabase" ] } )
db.createUser( { user: "admin", pwd: "PASSWORD", roles: [ "root", "backup", "restore", "readWriteAnyDatabase", "userAdminAnyDatabase", "dbAdminAnyDatabase" ] } )
exit
mongo --port 27018 admin -u root -p PASSWORD
use sg2
db.createUser( { user: "app", pwd: "PASSWORD", roles: [ { role: "dbOwner", db: "appdb" },  { role: "dbOwner", db: "appdb" } ] } )
use admin
db.system.users.find()
exit
```

#### authモードでmongod起動
* mongodのauth関連の設定ファイルはこんな感じ
* レプリカセットの場合はkeyFileがないとレプリケーションできない

```
#noauth=true
auth=true
keyFile=/etc/mongod/mongod-keyfile
```

### シャードでユーザ作成
#### authモードでmongoc起動
* mongocのauth関連の設定ファイルはこんな感じ

```
#noauth=true
auth=true
keyFile=/etc/mongod/mongod-keyfile
```

#### noauthモードでmongos起動
* mongosのauth関連の設定ファイルはこんな感じ

```
noauth=true
#auth=true
#keyFile=/etc/mongod/mongod-keyfile
```

#### 管理ユーザ作成
* mongosで実行する
* mongosで実行するとmongocに同期される

```
mongo --port 27018 admin
db.createUser( { user: "root", pwd: "PASSWORD", roles: [ "root", "backup", "restore", "readWriteAnyDatabase", "userAdminAnyDatabase", "dbAdminAnyDatabase" ] } )
db.createUser( { user: "admin", pwd: "PASSWORD", roles: [ "root", "backup", "restore", "readWriteAnyDatabase", "userAdminAnyDatabase", "dbAdminAnyDatabase" ] } )
exit
mongo --port 27018 admin -u root -p PASSWORD
use sg2
db.createUser( { user: "app", pwd: "PASSWORD", roles: [ { role: "dbOwner", db: "appdb" },  { role: "dbOwner", db: "appdb" } ] } )
use admin
db.system.users.find()
exit
```

### ※参考
http://makaaso.hatenablog.com/entry/2015/08/20/190227
MongoDB - ユーザ権限(Privilege Actions)について


MongoDBのユーザを作成する時ロールを付与するだけでなく、細かくユーザ権限を指定して付与することも可能。
ユーザ権限について纏めたのでメモ

### Query and Write Actions
ドキュメント操作についての権限

- find
- insert
- remove
- update

### Database Management Actions
DB管理用権限

- changeCustomData
- changeOwnCustomData
- changeOwnPassword
- changePassword
- createCollection
- createIndex
- createRole
- createUser
- dropCollection
- dropRole
- dropUser
- emptycapped
- enableProfiler
- grantRole
- killCursors
- revokeRole
- unlock
- viewRole
- viewUser

### Deployment Management Actions
DB管理・操作用権限

- authSchemaUpgrade
- cleanupOrphaned
- cpuProfile
- inprog
- invalidateUserCache
- killop
- planCacheRead
- planCacheWrite
- storageDetails

### Replication Actions
レプリケーション管理・操作用権限

- appendOplogNote
- replSetConfigure
- replSetGetStatus
- replSetHeartbeat
- replSetStateChange
- resync

### Sharding Actions
シャード管理・操作用権限

- addShard
- enableSharding
- flushRouterConfig
- getShardMap
- getShardVersion
- listShards
- moveChunk
- removeShard
- shardingState
- splitChunk
- splitVector

### Server Administration Actions
システム管理用権限

- applicationMessage
- closeAllDatabases
- collMod
- compact
- connPoolSync
- convertToCapped
- dropDatabase
- dropIndex
- fsync
- getParameter
- hostInfo
- logRotate
- reIndex
- renameCollectionSameDB
- repairDatabase
- setParameter
- shutdown
- touch

### Diagnostic Actions
システム調査用権限

- collStats
- connPoolStats
- cursorInfo
- dbHash
- dbStats
- diagLogging
- getCmdLineOpts
- getLog
- indexStats
- listDatabases
- listCollections
- listIndexes
- netstat
- serverStatus
- validate
- top

### Internal Actions
MongoDB内部用権限（余程のことがない限りは使用しないほうがよさそう）

- anyAction
- internal

### ※参考
http://makaaso.hatenablog.com/entry/2015/08/20/154621
MongoDB - デフォルトで提供されているロール(Built-in Role)について


MongoDBのユーザを作成する時にデフォルトでどのようなロールが付与できるか調べたのでメモ

### Database User Roles
ユーザDB操作用ロール

- read
    - ユーザDBの読み取り専用ロール
- readWrite
    - ユーザDBの読み書き用ロール

### Database Administration Roles
システムDB含む各DB単位のロール

- dbAdmin
    - DB管理用ロール
- dbOwner
    - システム管理用ロール
    - dbAdmin,userAdmin,readWriteロール含む
- userAdmin
    - ユーザ管理用ロール

### Cluster Administration Roles
クラスタ管理・操作用ロール

- clusterAdmin
    - クラスタ管理用ロール
    - clusterManager,clusterMonitor,hostManagerロールとdropDatabaseアクション含む
- clusterManager
    - クラスタ管理用ロール
- clusterMonitor
    - クラスタ読み取り専用ロール
    - MongoDB Cloud Manager,Ops Manager用
- hostManager
    - クラスタ操作用ロール

### Backup and Restoration Roles
バックアップ・リストア用ロール

- backup
    - バックアップ用ロール
- restore
    - リストア用ロール

### ALL-Database Roles
全DB管理・操作用ロール

- readAnyDatabase
    - 全DBの読み取り専用ロール
- readWriteAnyDatabase
    - 全DBの読み書き用ロール
- userAdminAnyDatabase
    - 全DBのユーザ管理用ロール
- dbAdminAnyDatabase
    - 全DB管理用ロール

### Superuser Roles
システム管理用ロール

- root
    - システム管理用ロール

### Internal Role
MongoDB内部で使用しているロール

- __system
    - Mongo内部で使用するロール

### ※参考
http://makaaso.hatenablog.com/entry/2015/08/20/150455
AndroidでIPv6を無効化する

2015年8月上旬頃よりWi-Fi環境で(公式アプリ、非公式アプリに関係なく)Twitter画像が表示されないという事象が発生しています。どうやらauひかり回線で特定のプロバイダ(または特定の端末)の場合に IPv6 の通信に問題が発生するようです。

仕方ないのでIPv6を無効化(IPv4を優先)する方法を探したところ、どうやら下記のコードでうまくIPv4を優先してくれるようです。

```java
java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
```

IPv6を無効化しなきゃいけない状況がまずおかしいとは思うんですけどね－。


# 参考

- [java - Selector on Android sockets behaves strangely - Stack Overflow](http://stackoverflow.com/questions/7450758/selector-on-android-sockets-behaves-strangely)
- [ネットワークのプロパティ](https://docs.oracle.com/javase/jp/1.4/guide/net/properties.html)

- [Twitterの画像取得が遅い・できない時の対処法 - AndroPlus](https://androplus.org/Entry/663/)
 - root化する前提でWiFi通信のIPv6を無効化することもできます。参考まで。
チェックボックスのラベルが、２行以上になってもボタンの下に表示させない

```lang:html

<input type="checkbox" name="feature[]" value="5" id="SearchFeature5"><label for="SearchFeature5">てすと</label>
```

```lang:css
input{float:left;}
label{display:block; overflow:hidden;}
```

こんな感じでできた。・・・気がする。


https://www.xenophy.com/webdesign/2426
YAPC::ASIA2015 2015/08/21の感想


# はじめに

トークの内容はそのうちにスライドが出回ってくると思うので書かず、
ただただ感想を書いています。ごめんなさい :bow:

# メリークリスマス！ by Larry Wallさん

Perl5 -> Perl6 = ホビットの冒険 -> 指輪物語

だって！
例えが全部トールキンで、だいぶ親近感が！
毎年いつかのクリスマスといわれてきたけれど、今年のクリスマスの正式リリースに向けてがんばっているそう。
ホビットの冒険のプロットを踏襲して、指輪物語が書かれたように
Perl6は表面上はいろいろ変わるかもしれないけれど、根底を流れる思想はPerl5を受け継いでるんだそうで…
そうそう、正規表現はよりよいように変えるそうで…
なんか楽しみになってきた :smile:

# DeepLearning の前に知っておくことがある！ 再帰型のニューラルネットワークや自己組織化マップについて語ろう by muddydixonさん

最近DeepLearningが流行っているけれど、ニューラルネットワークについてちゃんと知っておくと、チューニングがしやすいそうです（当たり前か）。
講演の中で、神経細胞、ニューラルネットワークモデルの説明、逆伝搬による学習や、自己組織化マップの話がかなりの駆け足で説明されました。

自己組織化マップのところで、刺激を受けたニューロンの近傍もまた少し刺激を受けるというモデルは、ちょっと納得。
…ちょっと何か作ってみたい。うーむ。

# それは僕たちのドメイン・DNS運用 by jigyakkumaさん

自社で運用しているDNSが本番200、開発環境が400超だそうで…
増えていくドメインの運用について、管理方法を徐々に
1. 人力
2. フォーム化
3. Route53化
4. roadworker / github
5. CI

と変えていった話でした。
うまく設定できたかどうかのテストはまだ未実装だそうです。
最後に言われていた、「常に改善を意識してる」はホントすごい。真似しないとー。

# TBD by Yukihiro "Matz" Matsumotoさん

運営の手違いで10分早く始まってしまったそうで、「TBD」のままだったのをどのように言い訳してたか聞きそびれたのが残念(w

トークは、Rubyの良くないと思っている部分と、新しく開発を始めた、streem の話でした。
確かに長く言語が使われていれば、当然コンピュータのテクノロジーも進んでいるわけで…
最適な言語のタイプや実装も移り変わっていくよね。
マルチコア、高レベル抽象、関数型言語…
streem は「見た目のシンプルさが重要」だと考えているそうで楽しみ。

そうそう、便利だから使っていたUNIXのパイプライン。複数のコアをそれなりに効率よく使ってくれるそうで…
もっと活用しようっと。

# Perlで学ぼう！文系プログラマのための、知識ゼロからのデータ構造と計算量 by Shinpei Maruyamaさん


しんぺいさんはもともと文学部卒だったそうですが、Perlのコミュニティに助けられてコンピュータを学んできたそうです。
どうやって、コンピュータについて学んできていない文系の人たちに説明するのだろうと思って、聴きに来たのですが…
説明はなんとCを使いながら、変数やポインタとメモリの話をしたり、配列から二分木、B木の話やそれらの計算量の説明をしたり、内容はガチでした。
ただし、アニメーションを使ってイメージしやすいようにしたり、柔らかい言葉や表情なども駆使していたり…
勉強になりました。

# うっかりをなくす技術 by karupaneruraさん

[スライド](http://www.slideshare.net/karupanerura/technology-for-reduce-of-mistakes)

大学で少し安全工学を齧ったのだそうで、その観点から、開発におけるうっかりをなくすための方法を話してくれました。
ほかの開発者が見る、ということを常に意識して、コードを書こう…
そして、「リーダブルコード」をまた読もう。

# Lightning Talk

cpanm クライアント cpm は並列実行なのでめっちゃ速かった。これは気になる…

# 聞けなかったけど気になってたトーク

* [Effective ES6](http://www.slideshare.net/teppeis/effective-es6)
ペアプロをやってみた感想まとめ（執筆中）


[アジャイらないひよこクラブのイベント](https://agile-hiyoko-club.doorkeeper.jp/events/22508)でペアプロのやり方を学んで刺激をうけ、今週から本格的にペアプロを始めました。ペアプロをやってみた感想と変化とTipsを時系列で掲載します。

## 参考にした情報
* [エクストリームプログラミング](http://amzn.to/1E9AEqT)
* [ペアプロミングのやりかた](http://www.hyuki.com/yukiwiki/wiki.cgi?%A5%DA%A5%A2%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%A4%CE%A4%E4%A4%EA%A4%AB%A4%BF)
* [ペアプログラミングをうまくやるためのチェックリスト](http://web.archive.org/web/20110613064530/http://lab.cirius.co.jp/blog/2008/09/post-8.php)

## ペアプロの目的(僕の理解）
1. チームビルディングを加速する（言いたいことを忌憚なく言い合える関係性づくり）
1. 複雑な箇所でより良い設計を作る
1. 暗黙知＆形式知の共有（仕様、コード規約etc）
2. メンバー全員のスキルアップ（経験問わず）

## ペアプロに対する疑問
* 本当にベロシティはあがる？（作業効率があがる？）<-- イベントで講師の林さんによると3ヵ月後に聞いてくるとか
* 経験者＆初心者の組み合わせでは、一方的に教えることにならない？ <-- 初心者の質問には、経験者でも学ぶことは多いそう
* チーム内の関係性は良くなるか？ <-- 目的１が私にとって目から鱗だった

## ペアプロ実践
* 新規プロジェクト（Webサービスの開発）で実施
* 開発メンバー２人（Rails経験4年の僕、経験３ヵ月のS氏）
* 1日5時間程度*週2日実施
* 30分ごとにドライバーとナビゲータをチェンジ
* ドライバーのPCで開発、ドライバーPC画面を別スクリーンに表示
* チェンジのタイミングでcommit&pushし、パートナにソースを共有

## 感想
### 第1週目(8/17〜)
#### 困ったこと
* ドライバが何してるか分からない　→ドライバは今やっていることを声に出していく
* 見られていることにドライバが緊張する、特に初心者（経験が浅い）側
* 経験がある方が一方的に修正を指摘しがちになってしまう

#### 良かったこと
* 設計について意識を合わせながら進められるのでレビューによる手戻りが少ない
* 文法やメソッドを調べる時などはナビゲータが検索してくれるから楽
* 仕様（項目名など）をナビゲータが調べてくれるので手間が省ける

### 継続中
LaravelでSQLServerのトランザクション管理

# 背景
LaravelではDB操作にPDOを利用しているが、
PDOのトランザクションメソッド（beginTransaction等）がSQLServerに対応していないので、
Laravel標準の

```php:
DB::transaction(function()
{
    ...
});
```

や、

`DB::beginTransaction();`

ではSQLServerのトランザクション管理ができない。

# 解決策
トランザクション処理のSQLを直接実行する。

# サンプルコード
```php:
use DB;
use Exception;

try {
    DB::connection('sqlsrv')->statement('BEGIN TRANSACTION');

    ...

    DB::connection('sqlsrv')->statement('COMMIT TRANSACTION');
} catch (Exception $e) {
    DB::connection('sqlsrv')->statement('ROLLBACK TRANSACTION');
}
```

# 参考
http://blog.livedoor.jp/alpha1280/archives/51751515.html
Jenkins 経由でNodejsインストール・JSファイル実行・権限設定 メモ

インストールに失敗しまくったのでメモ

●Jenkins側の設定画面を開く
●ビルド手順の追加⇒シェルの実行
●シェルスクリプトの中に **who am i** と記述する。
　これでJenkinsが何ていうユーザーのどの権限で実行されているかわかる
●ジョブの実行

●Jenkinsの起動しているマシンにて、ターミナルを開く
● **sudo visudo** を実行。
●編集モードに切り替えて下記追加、
　**ユーザー名の部分に who am i コマンドで表示されたユーザーを記入する**

    Defaults:ユーザー名 !requiretty   # ユーザjenkinsはtty無しでsudo可能
    ユーザー名 ALL=(ALL) NOPASSWD:ALL # ユーザjenkinsはパスワード無しでsudo可能


## 追記１

　このままだとnode コマンド実行するとエラーになる。

　どうやらパスが通ってないみたい

　最初、Jenkinsのシェルスクリプトに

    export= /usr/local/bin
    echo $PATH

　としたら　

    /usr/local/bin　以外なくなってしまった。
　これの影響だと思うけど、 

    cp コマンドが not found になる。
上書きになったみたい、ほんとは　

    /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin　
ってなる予定だったのに・・・

だもんで

    export= /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    echo $PATH
に変更
　これで、

    node [javascriptファイル]
 が動いたし、cpのコマンドエラーもなくなりました。

※（注）
　自分のMacには**.bash_profile**なかったけど
　本来は下記の型のように**.bash_profile**にちゃんと環境変数を設定する必要があると思う。
　Jenkinsのあるサーバーは勝手にいじっていい環境じゃないので今は上記で対応
　http://qiita.com/nbkn/items/01a11392921119fa0153


## 追記２

Jenkinsのジョブが完了しませんでした。

■問題点

node **.js
と実行するとファイルサーバーが起動中となり
コマンドラインにレスポンスが返ってこないため
Jenkinsのジョブがいつまでも実行中となり
ファイルサーバー起動中はジョブが終了となりません。

■解決
　バックグラウンド実行すれば完了した。
　コマンドラインは奥が深いなあ、おもしろい

    node **.js &

## 追記３
　プロセスをkillする方法も書いておく、
　nodeは基本的に２重起動できない

    pkill -kill -f node

## 追記４
　**バックグラウンドで実行する時に、プロセスをKillしないよう記述しないと
　Jenkinsはジョブ実行中に起動したプロセスをすべてKillする。**

    BUILD_ID=dontKillMe　
を入れないとJenkinsは起動したプロセスをすべてkillするため修正

    BUILD_ID=dontKillMe node **.js &

■下記の方のページを参照
　http://d.hatena.ne.jp/penkoba/20130622/1371894105

「これは https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller に書いてある通り、
この変数をなにか適当な値で上書きしないとJenkinsのProcessTreeKillerという仕組みによって
ビルドのジョブが完了した時点でその中で起動したプロセスはすべて殺されてしまいます。」との事
validationのエラーメッセージでattributesを日本語にできなくてハマった話。

## モデルの名前を名前空間で区切ってた
class Hoge::Fuga::Mogeみたいな感じ。
テーブル名はhoge_fuga_mogeになってる。

## ダメなパターン
```
ja:
  activerecord:
    attributes:
      hoge_fuga_moge:
        name: 氏名
        tel: 電話番号
```
日本語が適用されません。（当たり前）

## 正しいパターン
```
ja:
  activerecord:
    attributes:
      hoge/fuga/moge:
        name: 氏名
        tel: 電話番号
```
スラッシュで区切りましょう！

普段、名前空間を分けることがなかったので、ハマりました。
UICollectionViewで、プログラム側からCellを選択状態にしようとしたら、ハマったお話

## そもそもCellを選択状態にするにはどうするの？
(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
の中で、UICollectionViewCellを取得して、selectedプロパティをYESにすればいいんですけど。

## 何にハマったの？
選択状態になったことはなったんですが、UIでタップしても非選択状態にならなくなりました。

## どうやって解決するの？
<del>
UICollectionViewCellのselectedをYESにした後で、
[collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
って呼んであげましょう。
</del>
セルのselectedプロパティをYESにする方法は正しくありません。
最終的にはviewWillAppearでselectItemAtIndexPathを呼び出しました。
ただ、これは私のプログラムで選択状態にしたいデータを取ってくるタイミングがここだったからです。おそらく、viewDidLoadでも可能じゃないかと思います。（未確認）
nodejsで環境によってconfigを使い分ける

node-configを使う。
https://github.com/lorenwest/node-config
開発元のドキュメントがかなりしっかりしているので詳しくはそっち読めばいい。簡単に使うには上記URLにもそのまんまのっているけど

```bash
npm install config
mkdir config
```
configディレクトリにコンフィグファイルを置くだけ。
default.json
は自動的に読んでくれる。後は「環境変数NODE_ENV」.jsonのファイルを読んでdefault.jsonに上書きする。
例えば、NODE_ENV=developmentとしておけばdevelopment.jsonを読み込む。

環境変数はexportしてもいいけど、node.jsを起動するときに環境変数をつけるのが楽。

```bash
NODE_ENV=development node app.js
```
みたいな。あとはjsファイル内で

```javascript
var config = require('config');
```
って書くだけでconfigの中にさっきのjsonの内容がそのまんま入っている。非常にシンプルで使いやすい。
OS X YosemiteでSpotlight用プラグインのFlashlightがやっと動いた


## Spotlight全然動かない

__「YosemiteになってからSpotlight便利だしFlashlight入れればAlfredにもサヨウナラ！」__  などという文句に惹かれて、 [Alfred](https://www.alfredapp.com/) の無料枠くらいしか使ってなかったユーザーは Spotlight に戻ってきた、という人もいた事と思います。

で、Spotlight用プラグインの [Flashlight](http://flashlight.nateparrott.com/) をインストールしてみる→何故か全然動かない。

orz...


## 解決手順

`Spotlight Flashlight 動かない` とか `not working` とかでググりまくっては諦めてましたが、公式のissueに情報がありました。ちゃんと英語読まないとダメすね。
「on 10.10.4」と書いてありますが、10.10.5でも同じ手順を踏んだら動作するようになりました。

[Steps to make Flashlight work on 10.10.4 (doesn't work for El Capitan) · GitHub](https://gist.github.com/selaromi/59666a71387d39b5bfac)


### ざっくり手順 (詳細は↑のリンク先を読んでね) ###

* [SIMBL](http://culater.net/software/SIMBL/SIMBL.php) をインストール
* `/Applications/Flashlight.app` 以下奥深くにある `SpotlightSIMBLE.bundle` と `Flashlight.osax` をコピー
* Flashlight を無効化→有効化
* スクリプトエディタで1行書いたものを `アプリケーション` として保存し実行

ちょっとややこしいですが、ちゃんと丁寧にやれば10分もかからず動くようになると思います。Flashlightを起動後にAppleScriptを動かすのがキモな感じがしました。
ファイル名に誤ってハイフンを入れてしまって消したくなったときの為のメモ

うっかり `-p` みたいなファイルやディレクトリを作ってしまうことがたまーにありませんか？

```
$ ls -l
total 4
drwxrwxr-x 2 vagrant vagrant 4096 2015-08-21 17:33 -p
```

いざこいつを消そうと思っても `-` が付いていることによってオプションと解釈されてしまい、なかなか消えなかったりしますよね・・・。

```
$ rmdir -p
rmdir: missing operand
Try `rmdir --help' for more information.
```

そんな時は削除対象のファイル／ディレクトリの前に `--` をつけてあげると削除できます。

```
$ rmdir -- -p
$
```

という誰でも知ってそうなプチTipsでした(´•ω•`)
EclipseでXMLの整形時、インデントをタブではなく、半角スペースにする方法

EclipseでXMLファイルの編集時、右クリック-> Source -> Format（または、Ctrl+Shift+F）で、一発で整形できます。
この時のインデントがデフォルトではタブですが、以下の設定を変えることで半角スペースに変更できます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/51291/7ed257bb-f55f-fd81-22f9-87039269e1e8.png)
全国移住ナビにクエリ文字列を渡して検索を便利にする

「全国移住ナビ」
https://www.iju-navi.soumu.go.jp/ijunavi/
総務省が運営する、移住を検討する人のためのポータルサイト。
仕事・住まいなどの情報を検索することができる。
サイト内のリンクはJavaScriptのパラメータ渡しで管理されているため、
<font color="red">・"市町村を指定した状態で、求人情報検索画面を呼び出す"</font>
などの指定ができなかった。

そこで、Webサイトを解析したところ、クエリ文字列として<font color="red">"自治体コード"</font>を渡すことで上記の条件で検索画面を呼び出すことに成功した。

全リンクを掲載する。
仕事を探す
https://www.iju-navi.soumu.go.jp/ijunavi/shigoto/?cd_jichitai=xxxxx
※県のコードは非対応

自治体から集めた求人情報から探す
https://www.iju-navi.soumu.go.jp/ijunavi/shigoto/jichitai/?cd_jichitai=xxxxx

民間求人サイトが集めた求人情報から探す
https://www.iju-navi.soumu.go.jp/ijunavi/shigoto/minkan/?cd_jichitai=xxxxx

全国新規就農相談センターが集めた求人情報から探す
https://www.iju-navi.soumu.go.jp/ijunavi/shigoto/nousui/?cd_jichitai=xxxxx

ハローワークインターネットサービスの求人情報から探す
https://www.iju-navi.soumu.go.jp/ijunavi/shigoto/helloWork/?cd_jichitai=xxxxx


住まいを探す
https://www.iju-navi.soumu.go.jp/ijunavi/sumai/homeMenu/?jichitai=xxxxx
※県のコードは非対応

希望条件から住まいを探す(自治体)
https://www.iju-navi.soumu.go.jp/ijunavi/sumai/jichitaiHomeMenu/?jichitai=xxxxx

自治体が集めた不動産情報から探す(購入)
https://www.iju-navi.soumu.go.jp/ijunavi/sumai/articlePurchase/?jichitai=xxxxx

自治体が集めた不動産情報から探す(賃貸)
https://www.iju-navi.soumu.go.jp/ijunavi/sumai/articleLease/?jichitai=xxxxx

希望条件から住まいを探す(民間)
https://www.iju-navi.soumu.go.jp/ijunavi/sumai/minkanHomeMenu/?jichitai=xxxxx

民間の物件情報サイトが集めた不動産情報から探す(購入)
https://www.iju-navi.soumu.go.jp/ijunavi/sumai/articlePurchaseMin/?jichitai=xxxxx

民間の物件情報サイトが集めた不動産情報から探す(賃貸)
https://www.iju-navi.soumu.go.jp/ijunavi/sumai/articleLeaseMin/?jichitai=xxxxx

自治体コード
http://www.soumu.go.jp/denshijiti/code.html
<font color="red">※コード先頭5桁を使用してください</font>

****
岐阜県白川町地域おこし協力隊
天川伊織(あまかわ いおり)

Blog: http://amakawaiori.com/
ASP.NET MVCでKnockout.jsを使うときにはまる罠4選


ASP.NET MVCとknockout.jsを使って以下の割と基本的なことをやろうとしたら結構はまったのでまとめてみました。

- データベースから取得したデータを元にJSONを生成する
- それをAJAXで取得しknockout.mappingでビューモデルにする
- AJAXでJSONをPOSTしてサーバに保存する

##Entity Frameworkのデータオブジェクトを直接JSONシリアライズするとエラーになる

まずはサーバからJSONを返すためにコントローラのJson()メソッドを呼んでJSONを生成するわけですが、ここに横着してデータベースから取得した値、つまりEntity Frameworkのデータオブジェクトをそのまま入れようとすると、よほど単純なモデルでないかぎり「オブジェクトのシリアル化を実行中に循環参照が見つかりました」という例外が発生します。

これはオブジェクトに含まれるすべてのpublicなプロパティがシリアライズされる時に、関連付けのプロパティもシリアライズされてしまうためです。関連付けの接続先がめぐりめぐって自分のデータオブジェクトに返ってきていると循環が発生してしまうためシリアライズできません。双方向の関連付けがある場合、もうそれだけでアウトです。

なので、ASP.NET MVCのビューモデルを作って、モデルに必要なプロパティをひとつずつ移して余計なものが含まれないようにする必要があります。また、knockout.mappingを使うとサーバから来たものだけサーバに送り返す挙動になるので、サーバから返す必要がなくてもプロパティは用意しておく必要があります。つまり、出力でも入力に使うビューモデルと同じものを使用することになります。

##JSONに日付を出力すると変なフォーマットの文字列になる

dateTime型のオブジェクトをJSONにシリアライズすると``/Date(62831853071)/``みたいな文字列になります。これはそういう仕様なのでしかたありません。

ASP.NET AJAX: Inside JSON date and time string
https://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_sidebarb

幸いPOST時はモデルバインダがさまざまなフォーマットを受け付けてくれるので、knockout.jsのビューモデルを生成するときに、この謎フォーマットから人間が編集するためのフォーマットに変換するだけで対応できます。

なので以下のような謎フォーマットからYYYY/MM/DD形式の文字列への変換関数を用意して、

```js
var fromJsonDateStr = function (value) {
    var match = /\/Date\((\d+)\)\//.exec(value);
    if (match) {
        var date = new Date(parseInt(match[1]));
        value = date.getFullYear() + '/' + ('00' + (date.getMonth() + 1)).slice(-2) + '/' + ('00' + date.getDate()).slice(-2);
    }
    return value;
};
```

knockout.mapping用のマッピングを以下のように用意すれば対応できます。

```js
var mapping = {
    Date: {
        create: function (options) {
            return ko.observable(fromJsonDateStr(options.data));
        },
        update: function (options) {
            return fromJsonDateStr(options.data);
        }
    }
};
```

createではobservableを返さなければならないのに、updateではむしろobservableではダメというのは罠っぽいです。

##nullが"null"という文字列でPOSTされてしまう

x-www-form-urlencoded形式でPOSTするとnullが"null"という文字列でPOSTされてしまいます。単純にnullを文字列化したものを送るのでこうなってしまうようです。受ける側の型が``int?``だったりするとモデルバインダが数値に変換できないというエラーを出します。

解決方法はJSONをPOSTするようにすることしかありません。
以下のようにすればJSONでPOSTすることができます。

```js
$.ajax({
    url: "...",
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify(model),
});
```
##JSON形式でPOSTすると例外HttpAntiForgeryExceptionが投げられる

アクションにValidateAntiForgeryToken属性を付けている時にJSON形式でPOSTすると以下の例外が投げられます。

> System.Web.Mvc.HttpAntiForgeryException: 必要な偽造防止フォーム フィールド "__RequestVerificationToken" が存在しません。

おそらく、モデルバインダは何事も無くJSON形式のリクエストを解釈するが、その他の部分はx-www-form-urlencoded形式しか解釈できないためリクエストから取り出すことができないのではないかと思います。

この問題は割とどうにもならなくて、自前でトークンを検証する仕組みを用意するしか方法が無いようです。以下のページにトークンをリクエストヘッダに入れてサーバに渡す実装の例があるので、それを参考に用意するなどします。

Validating .NET MVC 4 anti forgery tokens in ajax requests
http://richiban.uk/2013/02/06/validating-net-mvc-4-anti-forgery-tokens-in-ajax-requests/

トークンの検証関係はSystem.Web.Helpers.AntiForgeryクラスに閉じ込められていて外からは割と何もできないのですが、なぜかトークンを与えて検証できるpublicなメソッド``Validate(cookieToken, formToken)``が用意されています。前述のページはこれを利用しています。トークンを取得するメソッドは無いのでそこはがんばって何とかする必要があります。ちなみにcookieTokenがクッキーに保存されている検証元のトークン、formTokenがフォームに入れられる検証対象のトークンになります。
プロンプト入力で違った結果を表示させる

備忘
とりあえず、プロンプトで入力（green,red,yellow）を求めて該当した入力で分岐する。
\green,red,yellowの頭文字を正規表現にするにはどうすればいいのか。。。

```
#!/bin/bash

while :
 do
 echo "input signal (green/yellow/red)"
 read signal
  case $signal in
   [Rr]ed)
   echo "Stop"
   ;;
   [Gg]reen)
   echo "Go!"
   ;;
   [Yy]ellow)
   echo "Caution"
   ;;
   *)
   echo "end"
   ;;
  esac
 break;
 done

```
###### Output 1

```
# ./input.sh 
input signal (green/yellow/red)
green
Go!
```

###### Output 2
```
# ./input.sh 
input signal (green/yellow/red)
yellow
Caution
```
###### Output 3
```
# ./input.sh 
input signal (green/yellow/red)
red
Stop
```
PsToolを使う際、つまづいたこと（メモ）

クライアント側のPCが64bitだったので下記のサイトを参考にコマンドを管理者として実行した
>http://orebibou.com/2014/05/%E3%82%B5%E3%83%BC%E3%83%90%E5%A4%A7%E9%87%8F%E6%A7%8B%E7%AF%89%E6%99%82%E3%81%AE%E3%82%AD%E3%83%A2-%EF%BD%9Epsexec%E3%81%AB%E3%82%88%E3%82%8Bwindows-os%E3%81%AE%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88/

```
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v "LocalAccountTokenFilterPolicy" /t REG_DWORD /d 1
```

だが、その後psexecを使おうとしてもアクセスできない問題があった。
何故だろうかとふと、管理者としてコマンドプロンプトを立ち上げたらうまくいった。
子 View の onClick で ListView の onItemClick をコールする

ListView で各 item 自体の選択やイベントは起こしたく無いけど、その中にあるボタンや画像をタップした際に onItemClick で処理したい場合。

```java:YourAdapter
        @Override
        public boolean isEnabled(int position) {
            return false;  // ListView アイテムの選択を無効にする場合
        }

        @Override
        public View getView(final int position, View view, final ViewGroup parent) {
            if (view == null) {
                view = mInflater.inflate(R.layout.item_list, parent, false);
                view.setTag(new ViewHolder(view));
            }
            ViewHolder holder = (ViewHolder) view.getTag();
            final Item item = getItem(position);

            holder.thumbnail.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // ListView の onItemClick 側に処理を任せる
                    // 必要なら view を渡したり id も渡す
                    ((ListView) parent).performItemClick(null, position, 0);
                }
            });

            return view;
        }

```

parent に ListView が来ることを前提にキャストしてるのが正しいのか微妙だけどまあ動く。
arduinoでLCD

オークションで手に入れたLCDをarduino unoに、つないで見ました。
##写真
![MVC-017S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/14bc3cd1-b2d3-2800-5045-b6beb87898b2.jpeg)
##回路図
![lcd.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/13aaf2b7-1b9e-e193-c9dd-8156576076aa.png)
##ライブラリー作ってみました。
https://github.com/ohisama/Lcd8574
##サンプルコード
```
#include <Wire.h> 
#include <Lcd8574.h>

Lcd8574 lcd;

void setup()
{
	pinMode(13, OUTPUT);
	lcd = Lcd8574();
	lcd.begin(16, 2);
	lcd.print("hello, world!");
}
void loop()
{
	digitalWrite(13, HIGH);
	delay(1000);
	digitalWrite(13, LOW);
	delay(1000);
}

```
DTDファイルの属性変更例

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" [<!ATTLIST bean singleton (true | false) "false">]>

■例：


**t1.xml**

```xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
        <bean id="triangleAlone" class="dto.Triangle" >
        </bean>
        <import resource="t1_1.xml" />
    </beans>
```

***
**t1_1.xml**

```xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" [<!ATTLIST bean singleton (true|false) "false">]>
    <beans>
        <bean id="triangleParent" class="dto.Triangle">
        </bean>
        
        <bean id="triangleChild" class="dto.Triangle" parent="triangleParent">
        </bean>
    </beans>
```

**確認**
```java

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import dto.Triangle;
    
    public class Test {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("dto/t1.xml");
            
            for (int i = 0; i < 3; i ++) {
                Triangle triangle1 = (Triangle) context.getBean("triangleAlone");
                System.out.println(triangle1);
            }
            
            for (int i = 0; i < 3; i ++) {
                Triangle triangle1 = (Triangle) context.getBean("triangleParent");
                System.out.println(triangle1);
            }
            
            for (int i = 0; i < 3; i ++) {
                Triangle triangle2 = (Triangle) context.getBean("triangleChild");
                System.out.println(triangle2);
            }
        }
    }

```