OmniAICreator/Qiita-1.07M huggingface dataset:
What's blackbird?

blackbirdとはなんぞや
-------------------

ってことで、1日目はblackbirdの概要をざっくりお話できればと考えています。blackbirdとは**Monitoring Agent Daemon**です。今のところは各種ミドルウェア_Nginx_, _MySQL_, _Apache_, _Memcached_, _Redis_とか、_Elastic Load Blancing_, _RDS_, _ElastiCache_のようなAWSのコンポーネントの各種メトリックをせこせこと取得してZabbix Serverに送りつける働きをしてくれます。


Zabbix Agent
------------

正直Zabbix Agentでいんじゃね??って話にもなるとは思うんですが、Zabbixでミドルウェアの監視を行っているとよくある問題として、`user_scripts`使って値を取得すると1 keyあたり1 valueになるので、`SHOW ENGINE INNODB STATUS;`を取りたいんよみたいな話だと、いったい`SHOW ENGINE INNODB STATUS;`を何回たたけば気が済むんですかといいたくなるんですよね...

そこで、ぼくたちはZabbix Sender protocolをおしゃべりするDaemonを作ってそいつにデータを送信させることにしました。


How to Install
--------------

細かいInstall方法に関しては[こちら](https://github.com/Vagrants/blackbird)とか[こちら](http://qiita.com/makocchi/items/9166016b2ad4cc43e83f)を参照してくださいまし。

* pip
* RPM(レポジトリのURLは[こちら](https://vagrants.github.io/blackbird/repo/yum/6/x86_64/)なんですが、Indexesが効かなくって、[Repoviewをおいときました](https://vagrants.github.io/blackbird/repo/yum/6/x86_64/repoview/index.html))


っで結局おまえら何のAdvent Calendarやんの?
--------------------------------------

っでだいたいblackbirdが(δ´ω｀)ｶﾕｲところに手が届きそうななにかだということはわかっていただけたと思うので、こんなの取れるよーっていう紹介もかねて、[blackbird Advent Calendar 2014](http://qiita.com/advent-calendar/2014/blackbird)では各種Pluginでどんな値が取得できてZabbix側にどんなグラフができるとか、Plugin作成時苦労したから、似たようなことやりたい人はここを工夫してねって話をしようと考えています。今日は軽めにお話させていただきましたが、明日からはもう少し深いところもお話致します。

それでは[明日の人](http://qiita.com/makocchi)にバトンタッチ！
開発環境のPostgreSQLをパスワードなしでログインできるようにする


開発環境なのにいちいちログインするのは面倒ですよね。

パスワードなしでログインできるように、`/etc/postgresql/9.3/main/pg_hba.conf`の以下を編集します。

```
host    all             all             127.0.0.1/32          md5
host    all             all             ::1/128                 md5
```

md5のをtrustにします。

```
host    all             all             127.0.0.1/32           trust
host    all             all             ::1/128                 trust
```

これで再起動します。

```
$ sudo service postgresql restart
```

以上です。
Excelで上の行とデータ内容が被った場合に次の行のデータの文字色を薄くする

## Excelで上の行とデータ内容が被った場合に次の行のデータの文字色を薄くする


* こんなデータを

![aa.png](https://qiita-image-store.s3.amazonaws.com/0/40160/92ab3937-7db2-3a4a-92ca-53547d78516d.png)

* こうする

![aa.png](https://qiita-image-store.s3.amazonaws.com/0/40160/3ad7b588-bc77-32ec-df80-ba63a2d332c7.png)

```vbnet:VBA
' 開始行
Public Const FirstRow = "5"
' 変更後の文字色
Public Const DupCellColor = "&HAAAAAA"

' メイン処理
Sub UpdateDilColor()
    
    Dim LoopCnt As Integer                         ' ループカウンタ
    Dim CellColArray As Variant                    ' 対象列の配列
    CellColArray = Array("B", "C", "D", "E", "F")  ' 配列初期化

    Dim CurRange As Range                          ' 現在行
    Dim NextRange As Range                         ' 次の行
    
    ' 対象列の配列分ループ
    For LoopCnt = LBound(CellColArray) To UBound(CellColArray)
        ' 現在行セルをセット
        Set CurRange = Range(CellColArray(LoopCnt) & FirstRow)
        ' 次の行セルをセット
        Set NextRange = GetNextRowRange(CurRange)
        ' 色更新
        Call ChangeColor(CurRange, NextRange)
    Next LoopCnt
        
End Sub

' 次の行セル取得
Function GetNextRowRange(argRange As Range) As Range

    Dim val As Range
    Set GetNextRowRange = argRange.Offset(RowOffset:=1)

End Function

' 色変換（選択列の最下行まで再帰呼び出しでループ）
Sub ChangeColor(argCurRange As Range, argNextRange As Range)

    Dim CurRange As Range
    Dim NextRange As Range
    Set CurRange = argCurRange
    Set NextRange = argNextRange

    ' 次の行セルが空なら再帰呼び出し終了（処理なし）
    If NextRange.Value <> "" Then
        ' 現在セルと次の行セルがダブっていたら次の行セルの文字色変更
        If CurRange.Value = NextRange.Value And NextRange.Value <> "-" Then
            If CurRange.Offset(, columnOffset:=-1).Value = NextRange.Offset(, columnOffset:=-1).Value Then
                NextRange.Font.Color = CLng(DupCellColor)
            End If
        End If
        
        ' 現在セル、次の行セルを1行移動
        Set CurRange = GetNextRowRange(CurRange)
        Set NextRange = GetNextRowRange(NextRange)
        
        ' 再帰呼び出し
        Call ChangeColor(CurRange, NextRange)
    
    End If

End Sub
```

* 上と同じデータだけど、左で切り替わりがあったから別データとみなす、みたいなことをしてる部分が汚いけどまぁよしとしよう
bashによるランダム文字列の生成【パスワード生成スクリプト追加】

## bashを使ったランダム文字列の生成

既に、投稿されているような気もするのですが、取りあえず投稿します。
単純にランダムな文字列を生成するのではなく、

- 生成する文字列は英数字だけではなく、記号を必ず入れる。
- 紛らわしい文字は除外する。

という、内容で考えてみました。

パスワード用にランダムな文字列が欲しい時などの場合、コマンドラインに下記のように入力して実行します。
出力されるランダムな文字列は ```"12345678"``` の数字と、```",.+-!"``` の記号を必ず含み、間違い易い ```"0,9(数字の０,９)"```、```"O(英字大文字のO)"```、```"l,o(英字小文字のl,o)"``` を除いています。

```bash:
$ cat /dev/urandom | \
tr -dc '12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ,.+\-!' | \
fold -w 12 | grep -E '[12345678]' | grep -E '[,\.+\-\!]' | head -n 8
```

これで 12ケタのランダム文字列を 8個作成します。実行結果は下記のようになります。

```
+PsPBAIf26u2
D!jd5gXnNqcc
jXW,qmCvE5DY
,Jnk6n1brTQR
Q5XSR!ahdzJu
T57sPc5TnJD,
,tgc!H6jPUFI
.v,-TD.GvJw6
```

先頭に記号が来るのを、避けたかったので下記のように修正しました。

```bash:
$ cat /dev/urandom | \
tr -dc '12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ,.+\-!' | \
fold -w 12 | grep -E '[12345678]' | grep -E '[,\.+\-\!]' | \
grep -E '^[12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ]' | \
head -n 8
```

実行結果は下記のようになります。

```
b.zp+G.26F7w
3UPCySe2D.ui
ZVe6-.DBwTYg
ZxV,wVXLyb3U
MI2SyF.xcpfY
YyXNQ.Byk!q2
d3SkMfVyxKm.
gU5pAfx!.5E!
```

## パスワード生成シェルスクリプト

今までのランダム文字列生成ルールで、パスワード文字列を生成するシェルスクリプトを作成しました。

```bash:mkpasswd.sh
#!/bin/bash
LEN=$1
CNT=$2

if [ -z ${LEN} ] ; then LEN=12 ; fi
if [ -z ${CNT} ] ; then CNT=16 ; fi

cat /dev/urandom | \
tr -dc '12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ,.+!\-' | \
fold -w ${LEN} | grep -E '[12345678]' | grep -E '[,\.+\-\!]' | \
grep -E '^[12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ]' | \
head -n ${CNT}
```

こののシェルスクリプトの場合、引数としてパスワードの長さと出力数を与えることが可能で、
引数が無い場合は、ディフォルトで12桁のパスワードを16個作成するようにしています。

このシェルスクリプトを **ASUS Chromebook Flip C101PA** の Linuxターミナルで、16桁のパスワードを10,000件生成したときの実行結果は下記になります。（*timeコマンドの戻り値がおかしいような気がしますが。。。*)体感的には一瞬で生成されました。

```bash:
$ time ./mkpasswd.sh 16 10000 > passwd_list.txt

real    0m0.133s
user    0m0.221s
sys     0m0.159s
```

生成したパスワードの検証。

```bash:
$ wc -l passwd_list.txt 
10000 passwd_list.txt
```

件数は問題なし。

```
$ sort passwd_list.txt | uniq -c | sort -r | head
      1 z,ZX7DXCcnsBSh86
      1 ZzvPpS!Hm4aSCpDU
      1 zzmvEfGTbNV!3Kug
      1 ZZMtzuhX-1xt,qN+
      1 zzkjzXJH5-Zvn.HI
      1 zzctpetS!4yFP5,W
      1 ZZ+C!3vJWEEuV8y!
      1 zZav7D7sv!CGSmCj
      1 zz8hNaX+6BPGZ2Xx
      1 Z,Z8BQHJMf,2qDug
```

uniqコマンドで重複数をカウント、```sort -r``` で降順にソートして、先頭10行のすべてが 1件のみだけだったので重複なし。

```
$ grep -E '^,' passwd_list.txt | wc -l
0
$ grep -E '^\.' passwd_list.txt | wc -l
0
$ grep -E '^\+' passwd_list.txt | wc -l
0
$ grep -E '^\-' passwd_list.txt | wc -l
0
$ grep -E '^\!' passwd_list.txt | wc -l
0
```

先頭に記号があるパスワードもなし。

## 重複したパスワード文字列を除きたい場合

重複については、特に制限していないので重複した文字列を除く場合は、下記にようにすれば生成可能です。

```bash:
$ ./mkpasswd.sh 16 10000 | \
uniq -c | sort -r | \
awk '$1== "1" { print $2 }' | sort -R > passwd_list.txt 
```

aws コマンドで、重複していない文字列を抽出して ``` sort -R ``` でランダムにソートしてファイルに出力しています。

# 2019.05.01 修正について
QiitaをGoogleアナリティクスでモニタできるように設定したら、何気にこのページの参照が多かったです。
そして内容をよくよく確認するとバグなどが、多々あったので修正しました。
あと、スクリプトの修正と、重複なしのパスワードリストの作成方法の追記をしました。
Vagrant上のCentOS 6.6にPostgreSQL 9.3をインストールする

Vagrant上のCentOS 6.6にPostgreSQL 9.3をインストールする手順のメモ。
CentOS 6.6の標準のPostgreSQLは8.4系だったので、[PostgreSQL RPM Building Project](http://yum.postgresql.org/repopackages.php)からインストールを行いました。

# 環境

今回は`http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.6_chef-provisionerless.box`のboxファイル上に環境の構築を行いました。
具体的には以下の通りです。

```
vagrant$ uname -a
Linux oberon-vagrant 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
vagrant$ cat /etc/redhat-release 
CentOS release 6.6 (Final)
```

# 標準のPostgreSQLをアンインストールする

PostgreSQLサーバを停止し、パッケージをアンインストールします。

```
vagrant$ sudo service postgresql stop
vagrant$ sudo yum remove postgresql postgresql-devel postgresql-libs postgresql-server
```

# PostgreSQL 9.3をインストールする

[PostgreSQL RPM Building Project](http://yum.postgresql.org/repopackages.php)のrpmを使ってインストールを行います。
上記のページからディストリビューションに合ったrpmをインストールすることで、yumリポジトリの設定が行われます。
その後、`postgresql93`パッケージ群のインストール、初期化、起動、自動起動の設定を行います。

```
vagrant$ sudo rpm -ivh http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm
vagrant$ sudo yum install postgresql93-server postgresql93-devel
vagrant$ sudo service postgresql-9.3 initdb
vagrant$ sudo service postgresql-9.3 start
vagrant$ sudo chkconfig postgresql-9.3 on
```

# vagrantユーザを追加する

PostgreSQL上に`vagrant`ユーザを追加します。

```
vagrant$ sudo su - postgres
postgres$ createuser --superuser vagrant
postgres$ exit
vagrant$ psql -l
(テーブル一覧が表示される)
```

# おまけ: Ruby用のPostgreSQLバインディング（pg）をビルドする

`postgresql93`パッケージ群を用いてPostgreSQLをインストールした場合、標準のパスとは異なる場所にインストールするため、`pg`のビルドに失敗します。
そのため、ビルド時に`pg_config`コマンドの場所を指定する必要があります。

`bundle`コマンドを用いる例：

```
vagrant$ bundle config build.pg --with-pg-config=/usr/pgsql-9.3/bin/pg_config
vagrant$ bundle install
```
Swift PlaygroundでExecution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

OK
==

```swift
// Playground - noun: a place where people can play

if true {
    var a1:String? = nil
    a1 = "sss"
    if let a2 = a1 {
        println("xxx")
    }
    else{
        println("yyy")
    }
    var b:String = a1!
}
```


NG
==

```swift
// Playground - noun: a place where people can play

if true {
    var a1:String? = nil
    // a1 = "sss" // !!!
    if let a2 = a1 { // (!) Playground execution aborted: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
        println("xxx")
    }
    else{
        println("yyy")
    }
    var b:String = a1!
}
```


OK
==

```swift
// Playground - noun: a place where people can play

if true {
    var a1:String? = nil
    // a1 = "sss" // !!!
    if let a2 = a1 {
        println("xxx")
    }
    else{
        println("yyy")
    }
    // var b:String = a1! // !!!
}
```

なぜなのか
Oracle LISTAGG関数

#LISTAGG関数について

##用途
selectした結果をカンマ区切りで表示したい時など。

##使い方

__表A__

| ID | 都道府県名 |
|:--|:------|
| 1 | 愛媛県 |
| 2 | 島根県 |
| 3 | 北海道 |

__表B__

| ID | ゆるキャラ名 | ソート |
|:--|:------|:------|
| 1 | バリィさん | 1 |
| 1 | みきゃん | 2 |
| 2 | しまねっこ | 1 |
| 3 | キュンちゃん | 1 |
| 3 | アックマ | 2 |
| 3 | コアックマ | 3 |

上記２つの表をID列で結合して、ゆるキャラ名をカンマ区切りで
表示したいとき

```SQL:yuruchara.sql
select
 tab.id,
 tab.pref,
 listagg(tab.yuruc,',') within group (order by tab.sort_key asc ) yuruc_names
from (
  select
   a.ID id,
   a.都道府県名 pref,
   b.ゆるキャラ名 yuruc,
   b.ソート sort_key
  from
   表A a
  left join
   表B b
  on a.ID = b.ID ) tab
group by tab.id,tab.pref
order by tab.id;
```

結果はこうなります。

| id | pref | yuruc_names |
|:--|:------|:------|
| 1 | 愛媛県 | バリィさん,みきゃん |
| 2 | 島根県 | しまねっこ |
| 3 | 北海道 |キュンちゃん,アックマ,コアックマ |

##ひとこと
listaggのあとのwithin groupは省略できないので、カンマ区切りで表示する値が
ソートキーをもたないとき、

```SQL:yuruchara_nosort.sql
select
 tab.id,
 tab.pref,
 listagg(tab.yuruc,',') within group (order by null) yuruc_names
(以下続く)
```

と記載しておく。

SQLの改行がいけてないのはおいおい・・・(´・ω・｀)
Prolog Cafeで組込述語を作る方法 〜Prolog言語で実装する場合〜

# Prolog Cafeで組込述語を作る方法 〜Prolog言語で実装する場合〜

[Prolog Cafe](http://kaminari.istc.kobe-u.ac.jp/PrologCafe/)はJavaで実装されたPrologの処理系です。

組込述語の作り方をメモしておきます。

## インタプリタの起動

以下のコマンドでPrologのインタプリタが起動します。

```bash
$ java -cp plcafe.jar jp.ac.kobe_u.cs.prolog.lang.PrologMain jp.ac.kobe_u.cs.prolog.builtin:cafeteria

Prolog Cafe 1.2.5 (mantis)
Copyright(C) 1997-2009 M.Banbara and N.Tamura
| ?- halt.
```

Prolog Cafeにはインタプリタを起動するためのスクリプトも同梱されていますがここではJavaコマンドを使って素で実行しています。

このコマンドではクラスパスに`plcafe.jar`を入れて`jp.ac.kobe_u.cs.prolog.lang.PrologMain`のメインメソッドを実行しています。

`jp.ac.kobe_u.cs.prolog.lang.PrologMain`は引数に与えられたゴールを実行します。

引数に与えられた述語`jp.ac.kobe_u.cs.prolog.builtin:cafeteria`はPrologの対話型インタフェースを起動します。終了するには`halt/0`を実行します。

ちなみに、Prolog Cafeでは`パッケージ名:述語名`という形式で述語に名前空間を持たせることができます。これはJavaのパッケージの仕組みを流用しています。

## 組込述語の作成

### Prolog言語で記述する場合

#### ソースコードの作成

まず以下に示す簡単な述語を記述してみます。`example/0`は標準出力に`hello`と改行を出力するだけの述語です。

```example.prolog
example :-
    write(hello), nl.
```

#### 普通に読み込んで呼び出し

次に、普通に読み込んで呼び出してみます。

```bash
$ java -cp plcafe.jar jp.ac.kobe_u.cs.prolog.lang.PrologMain jp.ac.kobe_u.cs.prolog.builtin:cafeteria

Prolog Cafe 1.2.5 (mantis)
Copyright(C) 1997-2009 M.Banbara and N.Tamura
| ?- ['example.prolog'].
{consulting /Users/masayuki/Dropbox/GitLab/maglog/example.prolog ...}
{/Users/masayuki/Dropbox/GitLab/maglog/example.prolog consulted, 42 msec}
| ?- listing.
example :-
        write(hello),
        nl.

yes
| ?- example.
hello

yes
| ?- halt.
```

一応、解説すると`['example.prolog']`でソースコードを読み込んで節としてデータベースに格納します。listing/0で格納された節をリストアップします。`example/0`で述語として呼び出します。最後に`halt/0`で終了します。

#### Prolog言語からJava言語への変換

ソースコードをProlog言語からJava言語に変換し、クラスファイルへコンパイルして、Prolog Cafeのインタプリタの起動時にそれをクラスパスへ配置しておくことで、先ほど記述した述語を組込述語として呼ぶことができます。

Prolog言語のソースコードをJava言語へ変換するには`jp.ac.kobe_u.cs.prolog.compiler.Compailer`のメインメソッドの引数にProlog言語のソースコードを与えて実行します。

```bash
$ java -cp plcafe.jar jp.ac.kobe_u.cs.prolog.compiler.Compailer example.prolog
$ ls PRED_*.java
PRED_example_0.java
```

`PRED_example_0.java`というJavaのソースコードが生成されました。Prolog Cafeのコンパイラでは`名前/アリティ`という述語は、`PRED_名前_アリティ.java`という命名規則でJavaのクラスに変換されます。

ちなみに、Prolog言語で記述されたソースコード内に複数の述語が定義されている場合は、それぞれクラスに変換され、複数のjavaファイルが生成されます。ループへの変換が伴う場合などはさらに増えます。

次に、変換されたjavaファイルをclassファイルにコンパイルします。この時、クラスパスに`plcafe.jar`を入れておく必要があります。

```bash
$ javac -cp plcafe.jar PRED_example_0.java
$ ls PRED_*.class
PRED_example_0.class
```

#### クラスパスへの追加と呼び出し

そして、先ほど生成されたclassファイルをクラスパスに入れてPrologインタプリタを起動します。ここでは`./`をクラスパスに追加しています。

```bash
$ java -cp ./:plcafe.jar jp.ac.kobe_u.cs.prolog.lang.PrologMain jp.ac.kobe_u.cs.prolog.builtin:cafeteria

Prolog Cafe 1.2.5 (mantis)
Copyright(C) 1997-2009 M.Banbara and N.Tamura
| ?- example.
hello

yes
| ?- halt.
```

これでconsultしなくても組込述語として呼び出せるようになります。
Arduinoシミュレーター・エミュレーターまとめ

Arduinoでの開発をガッツリやるのにDTP環境が欲しいなと調べたので自分メモついでに共有。
＊調べながら書いてるので執筆時点でまだどれも試してません＞＜

### CodeBlocks Arduino IDE についてくるシミュレーター
http://arduinodev.com/codeblocks/
> Arduino API-level simulator (very early stage) integrated

### 日本語サイトのあるEmuduino
http://triring.net/program/Arduino/Emuduino/index.html
> お手軽にProcessingを使ってArduino風に動いているように見せている
> もちろん、ProcessingとArduinoは、根本的に異なるシステムなので、割り込みやタイマー動作などのハードに依存した機能までは真似出来ませんが、簡単な入出力やループ動作などの検証には使えると思います。

### Simuino
http://www.simuino.com/
> Simuino is an Arduino UNO/MEGA Pin Simulator.

CUIでのシミュレーター。昔はWeb版もあったようですが、今は公開してないっぽいです。

### Arduino Simulator
http://arduinosim.sourceforge.net/
> A simulator for the Arduino platform written in python. Designed to be cross-platform, easy to use and be well integrated with the Arduino environment.

Pythonで作られてるみたいですね。

### 123D circuits
http://123d.circuits.io/
> Simulate Arduino online and easily create custom circuit boards

オンラインでシミュレートできて、しかも他人が作った回路も見れる！勉強になりそう
Rubyの ブロック、Proc.new、lambdaの違い

ブロックとProc.newはそもそも別物です。
lambdaに関してはProc.newと同じようですが若干違いがあります。

この違いを理解しておかないと、ハマる可能性があります。
#ブロックとProc.new
##ブロックとは
まずブロックとはdo~endまたは{~}の部分で引数のような形で渡すものです。
以下のコードでは{ puts "block" }がそれに相当します。
また、受け取り側で引数を明示的に書かなくても渡す事ができyieldでブロックを評価する事が出来ます。
おそらくlist.each{ |a|  a.hoge }などで使った事があると思います。それがブロックです。

```ruby:example.rb
def method_block
  yield
end
method_block { p "block" }
#実行結果
=>"block"
```

##Proc.newとは
ブロックをオブジェクト化したものがProc.newになります。
受け取り側のメソッドで引数を明示的に書く事が出来ます。
この場合は&によりブロックがメソッドに渡ってきたときにProcオブジェクトになります。
&は引数にブロックが渡ってきたときにProcオブジェクトに変換します。
Procオブジェクトはcallメソッドによって評価する事が出来ます。

```ruby:example.rb
def method_block (&block)
  block.call
end
method_block { p "block" }
#実行結果
=>"block"
```
ProcはクラスなのでProc.newでオブジェクトを作る事が出来ます。


```ruby:example.rb
def method_proc
  proc = Proc.new { p "proc" }
  proc.call
end
method_proc
#実行結果
=>"proc"
```
####引数を使う場合
{ |a,b,c|~ }のa,b,cが引数にあたいします。
このブロック内で使用される引数をブロックパラメータといいます。
callの引数に対応したデータを渡して上げます。

```ruby:example.rb
proc = Proc.new{|a| p a * 2 }
proc.call(2)
#実行結果
=>4
```
##違い
Rubyではほぼすべてがオブジェクトですが**ブロックはオブジェクトではありません**。
そしてブロックを**オブジェクトとしたものがProc.newです**。


#Proc.newとlambda

##lambdaとは
まずlambdaの例を挙げて行きます。
lambda{~}でlambdaを使う事でき変数に代入する事も出来ます。
これはProcのインスタンスを生成して返却しているからです。
なので評価もcallメソッドで行えます。
では一体なにがProc.newと違うのか。

```ruby:example.rb
def method_lambda
  lambda1 = lambda{ p "lambda" }#Proc.new が返却
  lambda1.call
end
method_lambda
#実行結果
=>"lambda"
```

##違い１つ目
lambdaはブロックパラメータの数が違うとエラーを起こしてくれます。


###Proc.newで数の違う引数を渡す場合
このようにブロックパラメータが足りないの部分はnilが入ります。

```ruby:example.rb
proc = Proc.new{ |a,b,c| p "#{a},#{b},#{c}" }
proc.call(2, 4)
#実行結果
=> 2,4,nil
```
###lambdaで数の違うブロックパラメータを渡す場合
このようにエラーが発生します。
なのでlambdaのほうが厳密となります。

```ruby:example.rb
lambda1 = lambda{ |a,b,c| p "#{a},#{b},#{c}" }
lambda1.call(2, 4)
#実行結果
=> wrong number of arguments (2 for 3) (ArgumentError)
```

##違い２つ目
明示的にreturnやbreakを行った場合の挙動が違います。
###Proc.newの場合

```ruby:example.rb
def method_proc
  proc = Proc.new { return p "proc"}
  proc.call
  p "method_proc"
end
method_proc
#実行結果
=>"proc"
```
###lambdaの場合

```ruby:example.rb
def method_lambda
  lambda1 = lambda{ return p "lambda"}
  lambda1.call
  p "method_lambda"
end
method_lambda
#実行結果
=>"lambda"
  "method_lambda"
```
違いが分かりましたよね？
Proc.newの方はcallメソッドを実行した後の処理が評価されてません。それに対してlambdaの方は最後まで評価されています。
これはProc.newの場合、returnを書くとmethod_procメソッド自体を抜けてしまうからです。lambdaの方はreturnした後、method_lambdaメソッドに戻ります。breakの場合、Proc.newでは例外が発生します。lambdaの方は同じように手続きオブジェクトを抜けます。
ただし明示的にreturnを書かなければその後も評価されます。
#まとめ
ブロックはオブジェクトではありません。
ブロックをオブジェクトとしたものがProc.newです。
Proc.newに対してlambdaの方がブロックパラメータに関しては厳密です。
returnなどの動作に関してはProcとlambdaでは異なりlambda方はメソッドに近い動きです。

特にProc.newとlambdaの違いは、ハマる可能性があるので覚えておくといいと思います。
コーディング中はブラウザにガイドを引こう

PSD上でどんなに1px単位でこだわってもマークアップ時に再現されなければPSDは「絵に描いた餅」ですし、
むしろPSD上でのゴネゴネの時間をCSSの微調整に当てるべきと思っています。

そんな時、ブラウザ上で任意のガイド線を得るために自分は下記のようなやり方をしています。

```html:コーディング中だけbodyにid="guide"とでもつけておく
<body id="guide">
```

```scss:こんなscssを用意しコーディング中だけimportする
body:target {
  //ガイド線
  .area-main {
    &::before { //水平方向の中心線を引く
      display: block;
      position: absolute;
      width: 1px;
      height: 100%;
      background: cyan;
      left: 50%;
      top: 0;
      z-index: 10000;
      content: "";
      margin-left: -1px;
      box-shadow: -493px 0 0 0 cyan, 493px 0 0 0 cyan; //中心からのオフセット
    }
    &::after { //垂直方向の中心線を引く
      display: block;
      position: absolute;
      height: 1px;
      width: 100%;
      background: cyan;
      top: 50%;
      left: 0;
      z-index: 10000;
      content: "";
      margin-top: -1px;
      box-shadow: 0 -352px 0 0 cyan, 0 352px 0 0 cyan; //中心からのオフセット
    }
  }
}
```

URLに`#guide`とハッシュをつけた時だけ

![guide.png](https://qiita-image-store.s3.amazonaws.com/0/48396/83eae0d8-e067-7da0-33eb-6c08efd582cd.png)

こんな感じで好きにガイドが表示されます。
bodyのtarget擬似クラスに対するbefore/after擬似要素を使用しています。
もちろん同じことはSASSでなくCSSでもできますね。

上の例では1024x768みたいな決められた画角にガイドを引いている例ですが、
スクロールのある普通のページのガイド線なら、`position: fixed;`にするとよいでしょう。

さらにセクショニングやブロック要素にアウトラインを出しておきたいときは

```scss:scss
body:target {

  //アウトライン
  main, section, nav, aside {
    outline: cyan 1px solid;
  }

  div, ul, ol, nav, dl {
    outline: red 1px solid;
  }
  div div, p, a, li, span, strong, em {
    outline: yellow 1px solid;
  }

}
```

みたいなことを書くのですが、一気に見づらくなります。

コーディングが終わったら、
`@import 'guide';` をやめて、bodyから`id="guide"`を消します。
bodyの方は結構消すの忘れます...。


## 補足
この手法ですが、数年前にGoogle Chromeのウェブサイトのソースを見てた時に#gridでグリッドを敷いていたのが残っていたのを偶然見つけて自分のコーディングスタイルに取り入れたものです。現行のサイト（https://www.google.co.jp/chrome/ ）ではもう使われてないようですが、その時の名残で、bodyに`id="grid"`が残ったままになっています。

## 補足2
続編を投稿しました。

> "CSS3 - 【続】コーディング中はブラウザにガイドを引こう - Qiita"
http://qiita.com/volkuwabara/items/c1c97ac2526e3effcade
開発効率UP！Java開発者が使いこなすべきEclipseの便利ショートカットまとめ


Java開発ならEclipseを使いこなすとかなり効率が上がります。
Eclipseを使いこなす上で、ショートカットキーのマスターは欠かせないと思っています。デフォルトのショートカットもかなり豊富なのですが、逆にたくさんありすぎて使えるものがわかりにくいと思うので、自分が実務でよく使っていたショートカットを簡単にまとめてみました。

一部でも使いこなすと、いい感じにEclipse内を飛び回れると思います。

#1. 基本

| キー | 説明 |
|:-----------:|:------------|
|Control + N|新規作成。クラスでもメソッドでも、何か作るときはここから始まる。|
|Control + 1|クイックフィックス。かなり作業効率がアップする。警告の黄色が出たときの対処とか。作成する予定のClassやらMethodを書いて、そこから「create class|method」とか。メソッドの呼び出しから、その返り値を定義したりとか。|
|Alt + Shift + S|コンテキストメニューの「Source」へのショートカット。|
|Alt + Shift + T|コンテキストメニューの「Refactor」へのショートカット。メソッドの移動など基本的なリファクタリングはここから。|
|Control + Space|コード補完。これ使わないと意味ない。|
|Control + /|行コメント追加/削除。範囲選択して一括実行も可能。|
|Control + F11|実行。テスト時など何度も実行を繰り返したりするときに便利。|
|F5|プロジェクトのリフレッシュ。|
|F11|デバッグモードで実行。|
|F12|テキストエディタにフォーカスを移す。キーボードだけで操作したい人にお勧め。|


#2. 編集 - Editor内

| キー | 説明 |
|:-----------:|:------------|
|Control + O|インクリメンタルに別メソッドや内部Classを指定して移動する。調べたいメソッドがある時にいちいち文字で検索とかしてたらダメです。|
|Control + Shift + 上下矢印|次のメソッド、メンバの定義へ移動。結構使える。
|Control + .|次のエラー or 警告。|
|Control + ,|前のエラー or 警告。|
|Control + Q|最後に編集していた場所へ移動。|
|Alt + 左右矢印|ジャンプして移動していた履歴を戻ったり進んだり。デバッグ時は必須。|
|Alt + Shift + R|Refactorの「名前の変更」一つ一つ変更していくとかダメです。|
|Control + Alt + H|呼び出し階層をひらく。大規模システムではソースを追いまくって不具合見つけることが多いです・・・。|


#3. 編集 - 別ファイルへの移動

| キー | 説明 |
|:-----------:|:------------|
|Control + E|開いているファイルを検索して開くことができる。たくさんのソースを追っているときにとても便利。|
|F3|Control+クリックと同じ。|
|Control + PageDown/Up|開いているファイルの隣へ移動。|
|Control + Shift + T|インクリメンタルにclass名を指定して開く。プロジェクトのclass名を覚えてる人にはオススメ。いちいち深いパッケージ階層をもぐっていかなくてもいいので便利です。jarの中にあるクラスも検索できます。|


#4. 編集 - 別View/Perspectiveへの移動

| キー | 説明 |
|:-----------:|:------------|
|Control + F8|開いているPerspective間を移動できる。Control + 3をメインで使えばヨシ。|
|Control + 3|インクリメンタルに別View/Perspectiveを開く事ができる。|
|Control + F7|開いているView間を移動できる。
企業によるアドベントカレンダーまとめ2014

[2014年のAdvent Calendar一覧 - Qiita](http://qiita.com/advent-calendar/2014)

現状、全てのアドベントカレンダーがフラットに一覧表示されているので、「言語」とか「フレームワーク」とか「ミドルウェア」とか「ジョーク」とか「企業」とかのカテゴリ毎にグルーピングされてると見やすくなってよいと思います。何卒よろしくお願い申し上げます。

# Qiita内

* [HeartRails Advent Calendar 2014](http://qiita.com/advent-calendar/2014/heartrails)
* [Livesense Advent Calendar 2014](http://qiita.com/advent-calendar/2014/livesense)
* [Gunosy Advent Calendar 2014](http://qiita.com/advent-calendar/2014/gunosy)
* [Pepabo Advent Calendar 2014](http://qiita.com/advent-calendar/2014/pepabo)
* [Yahoo! JAPAN Tech Advent Calendar 2014](http://qiita.com/advent-calendar/2014/yahoojapan-tech)
* [株式会社LIG Advent Calendar 2014](http://qiita.com/advent-calendar/2014/lig)
* [株式会社リクルートテクノロジーズ Advent Calendar 2014](http://qiita.com/advent-calendar/2014/recruit-technologies)
* [CYBIRDエンジニア Advent Calendar 2014](http://qiita.com/advent-calendar/2014/cybird)
* [ドワンゴ Advent Calendar 2014](http://qiita.com/advent-calendar/2014/dwango)
* [ピクシブ株式会社 Advent Calendar 2014](http://qiita.com/advent-calendar/2014/pixiv)
* [TECHSCORE(シナジーマーケティング株式会社) Advent Calendar 2014](http://qiita.com/advent-calendar/2014/techscore)

# Qiita外

* [CyberAgent エンジニア Advent Calendar 2014](http://www.adventar.org/calendars/358)
* [ChatWork Advent Calendar 2014](http://www.adventar.org/calendars/519)
* [ドリコム Advent Calendar 2014](http://www.adventar.org/calendars/518)
* [はてなエンジニアアドベントカレンダー](http://developer.hatenastaff.com/entry/2014/12/01/164046)
* [GREE Advent Calendar 2014](http://labs.gree.jp/blog/category/advent-calendar/)

# まとめ

製品名を会社名にしてる会社さんが紛らわしかった
Audioタグで効果音を鳴らすシンプルな方法

## DEMO
追加しました
http://codepen.io/skwbr/full/RPgYbE/
http://codepen.io/skwbr/pen/RPgYbE

## 概要
例えば 'btn' というidの`<a>`タグのクリックで効果音を鳴らしたいとき。


```html:HTML
<a id="btn">クリック</a>
```

```html:こんな感じでaudioをbody末尾にでも書いておく
<audio id="btnsound" preload="auto">
<source src="sound/btnsound.mp3" type="audio/mp3">
</audio>
```

```js:JS側ではこんな感じ(jQuery)
var se = $('#btnsound');
$('').on(_event, function(){
  se[0].currentTime = 0;
  se[0].play();
});
```

## 備考
* `currentTime = 0;` を入れることで連打してもちゃんと鳴ります。
* `<audio preload="auto">`とすることで、音源がプリロードされます。

## プラグイン化

イベントと音源を引数にjQueryプラグイン化してみると場合によっては便利かもしれません。

```js:jQueryプラグイン側

(function (window, $) {
  'use strict';

  $.fn.useSound = function (_event, _id) {
    var se = $(_id);
    this.on(_event, function(){
      se[0].currentTime = 0;
      se[0].play();
    });
    return this;
  };

})(this, this.jQuery);
```

```js:用法
$('#btn').useSound('mousedown touchstart', '#btnsound');
```


## 追記1
* 2015/6/12：Tweetしていただいてアクセスが増えたのでコードのリファクタリング兼ねてcodepenのDEMOを追加しました。

## 追記2
* iOSやAndroidなどモバイル端末では、`preload="auto"`を指定していてもプリロードが効かない使用になっています（ユーザの意図や能動性に関わらずデータを読み込ませるための通信を発生させるべきでない、という思想？）。
* clickなど、音源のトリガーとなるユーザ操作が発生して初めてロードが開始されるので、音源のファイルサイズによっては遅延する点に注意が必要です。
capistrano3-unicorn使う時はちゃんとドキュメントとコードを読む

cap3付近、DSL祭りなので初期値や設定可能な値など毎回ソースみて確認する必要ある。

んで、ちゃんとコードとドキュメントを読めば
何も困ることはないという当たり前のことを学んだので忘れないうちにメモ

### Capfile

```
require 'capistrano3/unicorn'
```

### Gemfile

```
gem 'unicorn'
```

で使えるようにして

`cap production unicorn:start`をしてもうんともすんとも言わんということになったが :tired_face:

そもそも


### unicorn.rake

```rb
namespace :load do
  task :defaults do
    set :unicorn_pid, -> { File.join(current_path, "tmp", "pids", "unicorn.pid") }
    set :unicorn_config_path, -> { File.join(current_path, "config", "unicorn", "#{fetch(:rails_env)}.rb") }
    set :unicorn_roles, -> { :app }
    set :unicorn_options, -> { "" }
    set :unicorn_rack_env, -> { fetch(:rails_env) == "development" ? "development" : "deployment" }
    set :unicorn_restart_sleep_time, 3
  end
end
```

`unicorn_roles`はデフォルトで`app`が指定されている

https://github.com/tablexi/capistrano3-unicorn/blob/master/lib/capistrano3/tasks/unicorn.rake#L5

ので __README.md__ に

```
You can override the defaults by set :unicorn_example, value in the config/deploy.rb or config/deploy/ENVIRONMENT.rb capistrano deployment files.
```
って書いてあるので

`set :unicorn_roles, "hoge" `みたいな設定を`config/deploy.rb`か`config/deploy/ENV.rb`に書く

https://github.com/tablexi/capistrano3-unicorn/blob/master/README.md#conventions

ちなみに

`current_path/tmp/pids/unicorn.pid`みたいなものは

### deploy.rb のテンプレート

https://github.com/capistrano/capistrano/blob/b7067533af823f913fbaf48793d5b38cc5b14de4/lib/capistrano/templates/deploy.rb.erb#L29

この辺に書いてあって
`cap install`した時に生成される`config/deploy.rb`にコメントアウトで記述されているので
コメントアウトを解除すればよしなに作成してくれるので自分でつくる必要はない。
カスタマイズしたければこの辺をよしなにする。

https://github.com/tablexi/capistrano3-unicorn/blob/master/lib/capistrano3/tasks/unicorn.rake#L3

READMEちゃんと読んでコードで確認すれば一瞬でわかることに無駄にはまった。
基本大切にしていこう :pray:
Sails.jsでSSL(HTTPS)を組み込む


最近[Sails.js](http://sailsjs.org/)で遊んでいます。
SSLを利用したくなったのでその方法をメモしておきます。

なお、Sails.jsのバージョンは`0.10.5`です。

Stackoverflowさんに聞いたら、[how to configure https in sails.js](http://stackoverflow.com/questions/17755916/how-to-configure-https-in-sails-js)という回答がありますが、これでは正しく動作しません。

正しく動くのはこちらに従ったパターンです。
[Sails.js and HTTPS (SSL)](http://chrisrogers.me.uk/blog/sails-js-https-ssl/)

上記の例では`config/local.js`に定義されていますが、production環境でのみ設定したいので、
私は`config/env/production.js`に以下の様に設定しました。
`key.pem`と`cert.pem`は`config/ssl/`以下に配置しました。

```javascript
module.exports = {

	// 中略
	ssl: {
		key: require("fs").readFileSync(__dirname + "/../ssl/key.pem"),
		cert: require("fs").readFileSync(__dirname + "/../ssl/cert.pem")
	}
	// 中略
}
```

これで起動後、httpsでアクセス可能になります。


### オマケ

`sails.config.ssl`というのが合ったので設定したのですが、
こちらも駄目でした...。

## 参考サイト
* [how to configure https in sails.js](http://stackoverflow.com/questions/17755916/how-to-configure-https-in-sails-js) <= この方法では正しく動作しない
* [Sails.js and HTTPS (SSL)](http://chrisrogers.me.uk/blog/sails-js-https-ssl/)
QGISでOpenCVリベンジ


<font color="red"><b>※最近のOSGEO4Wリポジトリからはcv2.pydが展開されなくなっているようです。<br>この方法でQGISから試用される方はご注意ください。</b></font>

FOSS4G Advent Calendar 2014 2nd day
=======================
昨年のアドベントカレンダーでは、QGISのPythonコンソールからOpenCVを使う方法についての記事を書きました。

<a href="http://1drv.ms/1ypkWRu" target="_blank">こんなの</a>（別窓で開きます）

実はあの時、QGISのQの字もOSSのOの字も知っているようで知らない状態で、なんとか実装まで漕ぎつけた訳でありますが、色々なところで勉強や資料を読み進めるうちに、実はあまりお勧めできるような方法ではないということがわかりました。

そこで、今回はその反省も含めて正しいであろう実装の仕方について述べていきたいと思います。実装というと非常に堅苦しいですが、要はQGISのPythonからOpenCVのライブラリを使えるようにしよう、という去年とまったく同じネタなのは気にしてはいけない。

※今回の内容は、Windowsに限定したお話になるかと思います。MacOSやLinux利用者の方はまったく参考になりませんが許してください。（前回の記事もですね）

QGISはどうしてる？
------------------------
さてみなさん、QGISのインストール方法はどちらを利用しているでしょうか。大抵の場合、特に理由がなければインストーラを利用してインストールされているかと思います。
<img src="https://qiita-image-store.s3.amazonaws.com/0/59288/ae298094-a071-c14d-9d19-384c7100a441.png" width=70%>

ですが、今回はインストーラを利用するのではなく、OSGeo4Wのリポジトリ？からQGISをインストールします。上の図で言うところの「OSGeo4Wネットワークインストーラ」というやつですね。
最近気づいたのですが、このリポジトリかなりできるやつなんですね。FOSS4Gの大元がFOSSであることを考えれば当然のことなのかもしれませんが、いろんなOSSライブラリとの連携ができるようです。素晴らしいことです。

OSGEO4Wを利用しよう
-------------------------
ここはもう他にもっとお詳しい方々がいるでしょうから流れだけ書いておきます。
1. OSGeo4WネットワークインストーラをDLして管理者権限で実行
2. 最初にセットアップの方法を聞かれるのでエクスプレスデスクトップインストールか、アドバンスインストールを選択します。今回は**アドバンスインストール**にしました。
2. 「次へ」連打
3. 下のような画面に到達したらQGISのとこでインストールしたいバージョンを選択して、さらに「次へ」
　※なんか2.6.1が出てるデスネ・・・
4. 依存関係のパッケージとか権利のお話が出るけどひたすら「次へ」を連打
5. インストールが終わるのを待つ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/59288/93ca8c3f-a92f-5d79-e8cc-3e4413ce7885.png" width=70%>

OpenCVを実装してみる
-------------------------
QGISのインストールが終わりました、次はいよいよOpenCVのインストールです。
手順は非常に簡単です。さっきのパッケージ選択画面からOpenCVを選ぶだけです（下図）
ね、簡単でしょ？
あとは同じように「次へ」をひたすら連打すれば大丈夫のはず。
<img src="https://qiita-image-store.s3.amazonaws.com/0/59288/71725efc-57f3-9785-8e53-8fdb2e46f536.png" width=70%>

※記事の都合上、QGISとOpenCVのインストールは別々に処理していますが、実際は同時に行うこともできると思います。

PythonコンソールからOpenCVをインポート
-------------------------
無事インストールが終われば準備は整いました。前回の方法に比べて、姑息な手段を使わずにあっという間にOpenCVがインストールされています。しかも、ほぼ指示に従うだけでいいというのは素晴らしいです。インストールも終了したので、QGISを立ち上げてPythonコンソールから、ちゃんとOpenCVがインポートできるか確認してみます。

`import cv2`

と打ち込んでエラーがでないことを確認します。出ませんね、きっと出ていませんね。よかったよかった（棒）

まとめ
-------------------------
前回はOpenCVを[公式サイト](http://opencv.org/)からDLしてきて、ビルドされているPythonライブラリをコピーする方法を取りました。さらにバージョンによってはnumpyとの依存関係でエラーが出る場合は強引にnumpyを書き換えることをしました。ただこの方法の場合、他のnumpyに依存するライブラリに影響が出る可能性があるということで、あまり推奨できる方法ではありませんでした。
今回の方法では、OpenCVの最新バージョンを使えない可能性があるものの、QGISの環境を壊す可能性がないのでOpenCVを使ってみるのであればこの方法がいいかな？
また、前回の方法に比べてシンプルになったのではないでしょうか。


おしまい。
nginx でアクセス元のIPを正しく表示させる方法

**The Internet** <-> **nginx(リバースプロキシ)** <-> **nginx(Webサーバ)**

という構成で、Web サーバ側のアクセスログを見ると、
リバースプロキシの IP だけが並んでいて、がっかりします。

そこでアクセス元の IPアドレスを正しく通知するように設定します。

手順としては
1. リバースプロキシ側の nginx で "X-Forwarded-For" というヘッダを追加。
2. Webサーバ側で、"X-Forwarded-For" の値をクライアントの IPアドレスとして使用するように設定。
3. リバースプロキシと Webサーバの nginx を再起動。


Apache なら mod-rpaf で出来るそうですが、今回は nginx なので **HttpRealipModule** を使います。
まずは、Webサーバ側のの nginx に HttpRealipModule が組み込まれているか確認します。

```bash
$ nginx -V
nginx version: nginx/1.7.7
built by gcc 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module **--with-http_realip_module** --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
```

(`--with-http_realip_module`があればOKです)

公式のレポジトリから yum でインストールした nginx はデフォルトで組み込まれているようでしたので、そのまま設定を進めます。

リバースプロキシ側に、"X-Forwarded-For" ヘッダを追加する。

```bash
$ sudo vi /etc/nginx/nginx.conf
server {
      :
    proxy_set_header X-Forwarded-For;
    $proxy_add_x_forwarded_for;
      :
}
```

Webサーバ側に以下の設定をします。

```bash
$ sudo vi /etc/nginx/conf.d/realip.conf
set_real_ip_from   (リバースプロキシの IP アドレス);
real_ip_header     X-Forwarded-For;
```

リバースプロキシ、Webサーバの両サーバで nginx を再起動させます。

```bash
$ sudo systemctl restart nginx
```

これでアクセス元の IPアドレスが記録されるようになります。
Android Studioでアプリをアップデートする際の注意点

*Android Studio*を用いた*Android*アプリ開発を行なっている方が増えていると思うのですが、
情報があまり多くないため、情報不足から来る使いにくさがあると感じている昨今です。
以下、*Android Studio*でアプリをアップデートする手順です。

*Android*アプリをアップデートするとき、*Eclipse*では`androidmanifest.xml`に

```java:androidmanifest.xml(抜粋)
android:versionCode="x"
android:versionName="x.x.x"
```
などを記述していました。
*Android Studio*では、`build.gradle`に以下のように記述するとよいようです。

```java:build.gradle(抜粋)
defaultConfig {
        applicationId "com.test.sample"
        minSdkVersion 14
        targetSdkVersion 20
        versionCode 2
        versionName "1.1"
    }
```
ここで、`applicationId`は適当に入れてますので、ご自身の設定Idが書かれているはずです。
`versionCode`は整数値で、アプリのバージョンアップを出すごとにインクリメントします。
`versionCode`はご自身で設定して下さい。
AirMac Extreme にRaspberry Piを接続してPidoraをインストールする(NOOBS)



家の回線をwimaxから光回線に変更したんですが、その時にルータをAirMac Extremeにしたことで有線ポートができたのでRaspberry Pi使えるんじゃね？
と思ってOSをインストールして接続するところまでやってみました。

# SDカードにNOOBSを入れる

普通にOS入れるより楽そうなのでNOOBSを選択しました。

http://www.raspberrypi.org/downloads/

詳しくはREADMEに書いてあるので割愛しますが

1. SDカードをフォーマット
2. NOOBSを解凍してSDカードにドラッグ＆ドロップ

だけでOKです。

# VNCでRaspberry Piに接続してOSをインストール

外部ディスプレイがないのでVNC経由でOSをインストールします。

こちらの資料を読むと
"recovery.cmdlineに「vncinstall」を追加して、「quiet」を削除"とあるのでその通りにします。
http://www.slideshare.net/Akkiesoft/raspberry-pinoobs

あとはSDカードをRaspberry Piに挿し、AirMac Extremeの有線LANポートと繋いでVNCクライアントから接続するだけです。
ですが、どうもAirMacユーティリティからは有線接続されているデバイスのIPが拾えないらしく、他の方法で探すしかなさそうです。

nmapを使います。

	nmap -p5900 10.0.1.1/24

10.0.1.1の部分はご自分のネットワークで置き換えてください。

数秒待つと

	Nmap scan report for 10.0.1.15
	Host is up (0.0027s latency).
	PORT     STATE SERVICE
	5900/tcp open  vnc

こんな感じで5900番ポートが空いてるデバイスを見つけることができるので接続します。

ですがここでもひとつ問題があって、Mac標準のVNCクライアントでは上手く接続できないそうです。

Real VNCというソフトを使うと良いらしいのでこちらを利用しました。
https://www.realvnc.com/
（接続時のOptionでFullColorをTrueにしないと上手く繋がらないらしいです。）

あとはRealVNCを使ってRaspberry Piに接続し、OSをインストールすれば終わりです。

![スクリーンショット 2014-12-02 16.35.13.png](https://qiita-image-store.s3.amazonaws.com/0/2288/054eb362-afad-b6ac-bc8d-7afcf33925f6.png "スクリーンショット 2014-12-02 16.35.13.png")


これでSSHで接続できるようになるので好きなようにやれば良いと思います。

pidoraの場合は

	ID: root
	PW: raspberrypi

で接続できました。


まぁ今更すぎる記事ですが、AirMac Extremeを使って接続している記事が見当たらなかったのでメモ代わりに書いてみました。
Swift でアラートを出す


フィールドに入力したデータが間違っているなどのときに `UIAlertView` を使ってアラートを出しますが、この実装を Swift でやってみました。
例では、テキストフィールドへの入力キーボードの上部に `Done` のボタンをつけ、このボタンをタップすると、データを調べてデータが防いであると、エラーアラートを表示しています。
あらかじめ２つのテキストフィールドをストーリーボードに置いて `ViewController` クラスにリンクしてあります。

class ViewController: UIViewController, UITextFieldDelegate, UIAlertViewDelegate  {
    
    @IBOutlet weak var myField1: UITextField!   // 入力テキストフィールド
    @IBOutlet weak var myField2: UITextField!   // メッセージ表示フィールド
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // ボタンビュー作成
        var myKeyboard = UIView(frame: CGRectMake(0, 0, 320, 40))
        myKeyboard.backgroundColor = UIColor.darkGrayColor()
        
        // Doneボタン作成
        var myButton = UIButton(frame: CGRectMake(5, 5, 80, 30))
        myButton.backgroundColor = UIColor.lightGrayColor()
        myButton.setTitle("Done", forState: UIControlState.Normal)
        myButton.addTarget(self, action: "onMyButton", forControlEvents: UIControlEvents.TouchUpInside)
        
        // ボタンをビューに追加
        myKeyboard.addSubview(myButton)
        
        // ビューをフィールドに設定
        myField1.inputAccessoryView = myKeyboard
        myField1.delegate = self
        myField2.inputAccessoryView = myKeyboard
        myField2.delegate = self
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
// Done ボタンタップ時に実行するメソッド
    func onMyButton () {
        if myField1.editing {
            var tmpValue: Double = NSString(string: myField1.text).doubleValue
            if tmpValue <= 0 {
                var myAlert = UIAlertView(title: "Data", message: "Invalid Data", delegate: self, cancelButtonTitle: "OK")
                myAlert.show()
            } else {
                self.view.endEditing(true )
            }
            
        } else {
            myField1.text = "Not Editing"
        }
        if myField2.editing {
            myField2.text = "Editing"
        } else {
            myField2.text = "Not Editing"
        }
    self.view.endEditing(true )
    }

}
[angular] mocking $window

 injectでテスト対象を取得する前に$provideを使ってモックを登録しておく．

```js


describe("HowToMock$Window", function(){

  beforeEach(function(){
     // we need to setup $window mock before inject()
     mock(function($provide){
       $provide.factory("$window", function(){
         var $window = {};
         return $window;
       });
     });
    // get service/controller which depends on $window
    inject(function(someService){

    });

  });

});

```
MySQL日毎、周毎、月毎集計

１．日毎
　　group by date(created)

２．周毎
　・日曜日開始
　　group by date(created + interval 1 - DAYOFWEEK(created) day)
　・月曜日開始
　　group by date(created - interval (5 + DAYOFWEEK(created))%7 day)

３．月毎
　　group by date(created + interval 1 - DAYOFMONTH(created) day)
　　或いは
　　group by date_format(created, '%Y-%m')

※createdのデータ型はDATETIME
iOSアプリのlandscape(横向け)対応についての注意点、iOS8とそれ以外との相違点

iOSアプリでlandscapeに固定したアプリを作ることがあると思います。
私の作成してきたアプリは、画面サイズを取得して、そのサイズからoutletやviewなどの位置を動的に計算して
配置するということを行なっていますが、iOS8とそれ以前で、画面サイズを取得させると、値が違っていました。
既存アプリをiOS8対応にするときに、このような情報がなかったので、戸惑いました。
そのような仕様？なのでしょうか？(縦横が逆になる！)

以下実装例です。(xcode6.1で動作確認済み)
なお、storyboardで最初からデバイスのorientationをlandscapeにして立ち上げるということを想定しています。

```objc
float length_x,length_y;
CGRect scsize = [[UIScreen mainScreen] bounds];
        if ( [[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)  {
            // iOS8以降
            length_x = scsize.size.width;
            length_y = scsize.size.height;
        }else{
            // iOS7など
            length_x = scsize.size.height;
            length_y = scsize.size.width;
        }
```
これでクリア出来ました。
これからHybridアプリを作成する予定ですが、このようなことがまたあれば、JavaScriptでも記事を書きます。

私のアプリの一覧は以下からご覧いただけます。
https://itunes.apple.com/jp/artist/masanori-fukui/id473630376
Rubyで``による外部コマンド呼び出しを差し替える

レガシーコードのテストに有用です。。。

```rb:legacy.rb
def file_list
  `ls /path/to/some_dir`.split
end
```

```rb:test.rb
require './legacy'

orig_method = lambda(&method(:`))
Kernel.module_eval do
  define_method(:`) {|*| %w(local lib include).join("\n")}
end

puts file_list #=> ["local", "lib", "include"]

# 元に戻す
Kernel.module_eval do
  define_method(:`, orig_method)
end
```
Beamer で PDF を作成した際に各ページに追加される右下のナビゲーションシンボルを消したい

次に示すとても長いコマンドを追加するだけで消せます。

```tex
\beamertemplatenavigationsymbolsempty
```

Org-beamer なら `BEAMER_HEADER` を使うのがよいでしょう.l

```el
#+BEAMER_HEADER: \beamertemplatenavigationsymbolsempty
```

以上。
Modelクラス内にModelインスタンスを保持する


ステートフルJavaScriptを読んでいたら、面白い記述がありました。
JavaScriptでは割と当たり前の書き方なのかも。

例えばUserモデルがあって、データを読み込みます。
読み込んだデータはUserインスタンスとしてそれぞれ格納します。
データを更新する場合は、Userクラスのインスタンスメソッドに対して実行します。

以下コードです。

```js

// コンストラクタを定義
function User(name){
    this.name = name;
}

// クラス変数を定義、ここにデータを格納します。
User.member = [];

// データ読み込み
User.load = function(){
    for(var i = 0; i < 10; ++i){
        User.member.push(new User(i));
    }
};

User.find = function(index){
    return User.member[index];
};

// インスタンスメソッド
User.prototype.trace = function(){
    console.log(this.name);
};


User.load();
var user = User.find(1);
user.trace();
```

こういう書き方したことなかったので、勉強になりました。
Webフォントについてまとめ

Webフォントを使ってみて、まだいろいろ情報が少なかったので、まとめてみました。
※ 私は、[FONTPLUS](http://webfont.fontplus.jp/)さんの「スマートライセンス」を使わせていただいてます。

## Webフォントってなに？

webフォントとは、CSS3から使えるようになった、Web上からフォントをダウンロードし、ブラウザで表示する技術のことです。
なので、ローカルの環境に依存することなく、そのフォントで表示することができます。

### 今までのフォント指定

今までは、cssで指定し、PCにインストールされているものをブラウザで表示していました。
しかし、フォントはOSやバージョンにより標準でインストールされているものが違います。
なので、多彩なフォントをcssで指定しても、みる人のPCに入っていなければ、表示することはできません。
そのため、なるべく標準でインストールされているものを選び、以下のように、左から順に、なかったら次のフォントを表示するように、いくつか書くのです。

```css
font-family: Verdana, "游ゴシック", YuGothic, "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", "メイリオ", Meiryo, sans-serif;
```

## 何がいいの？

### 1.楽(らく)

PCごとに、表示されるフォントが違えば、サイトの雰囲気やデザインまでもが変わってしまいます。
なので、見出しなどの部分は、画像で表示したりします。

**もう、画像を作らなくていい！！**

画像で表示する場合、変更があったり、増えたりする度に、画像を作らなければならなかったが、Webフォントで表示すれば、テキストを変えるだけで良くなります。

### 2.拡大してもジャギらない

見出しなどを画像で表示した場合、拡大するとジャギーが目立ってしまう。
PCでは、表示サイズと同じサイズの画像を用意すれば、そこまで気にすることはなかったが、Retinaディスプレイが現れ、スマホが普及してきた今、拡大されることが多くなってきた。
しかし、Webフォントを使えば、この心配はすることなく、拡大してもきれいに表示されます。

### 3.データが軽い

1のように、画像が減るため、データは軽くなります。

### 4.文字として表示される

1のように、テキストで表示されるため、テキストのコピーや検索、読み上げ機能や翻訳機能に対応します。　
また、SEO対策にも有利です。

### 5.スマホにも対応

iOSは共通だが、Androidはメーカーによってインストールされているフォントは様々なので、フォント指定を全てに対応させるのとても大変です。
私も、スマホはあきらめることが多かったです。しかし、Webフォントを使えば、

**スマホも対応！！**

私は、これが1番嬉しいかも。スマホにも世界観が(´；ω；`)
レスポンシブであったりしても、テキストなので、折り返してくれます。
このような細かい部分も考えなくて良くなるので、本当に快適です。

## できないこと・デメリット

### 1.ページの読み込みに時間がかかる

数秒というか、コンマ何秒なのですが、サーバやキャッシュの状態によっては、"遅い"と感じるくらいの時間がかかることもあります。
また、外部のサーバを使っている場合には、フォントの読み込みだけが異様に時間がかかるタイミングがあったりします。

※ サービスによっては、軽減するための方法はあります。
これからの改善に期待です！

### 2.一瞬標準フォントが表示される

Webフォントを読み込んでいる時間は標準のフォントが表示され、Webフォントの読み込みが完了すると、Webフォントに変換されます。

※ サービスによっては、対処するための方法はあります。(jsで頑張る方法もあります。)
※ しかし、Webフォントの読み込みが完了するまで文字が表示されない設定であったりすると、読み込み時間がかかっているように感じやすくなってしまいます。

### 3.動的な表示はできない
例えば、静的な状態はフォントA、クリックしたらフォントBになる、という操作。
※ サービスによっては、対処方法はあるが、再読み込みがかかる場合、一瞬消えて表示される等の挙動もある。
(個人的には、この仕様にならないようにデザインするのが良いと思う。)

知らない人もいるみたいなので書いておくと、

* フォントの種類によって、太字(bold)指定ができるものとできないものがある。
* フォントファミリーが分かれていて、cssで指定を変えれば表示できるものもある。

ので注意。


### 4.Windows環境ではフォント表示が乱れることがある

もともと標準フォントでも乱れることはあるみたいなのですが、XPで特に起きるそうです。
ただし、IE7,8あたりでは、比較的きれいなのだとか。

### 5.日本語フォントが少ない

こちらは、Webフォントに限ったことではありませんが、日本語は、ひらがなカタカナ漢字…と、文字数が膨大なため、欧文フォントに比べるととても少ないです。

私は、充実している有料サービスのものを使用していますが、無料フォントの場合は、ライセンスをしっかり確認しましょう。
Webフォントに使う場合は、再配布にあたります。(cssにファイルまでのパスを記述するので)


## まとめ

デメリットはありますが、それを考慮した上でサイトを構築すれば、特に問題はないのではないかと思います。
メリットの方がとても大きく、良いことづくしだと考えています。
デザインの幅が広がります！！

私が携わったサイトは好評価をいただいているので、嬉しいです♪
PHPからGroongaを利用する - PHPバインディング

# GroongaのPHPバインディングを使ってアクセス

[PHP bindings for  Groonga.](https://github.com/Yujiro3/proonga "PHP bindings for  Groonga.")

# インストール

**Groongaライブラリ**

```
$ sudo aptitude install -y libgroonga0 libgroonga-dev
```

Groonga v4.0.7で追加されたC-APIを利用しています。
最新版のライブラリを利用してください。



**Proongaのインストール**

```
$ git clone https://github.com/Yujiro3/proonga.git
$ cd ./proonga
$ phpize
$ ./configure
$ make
$ sudo -s
# make install
# cd /etc/php5/mods-available
# echo extension=groonga.so > proonga.ini
# cd /etc/php5/conf.d
# ln -s ../mods-available/proonga.ini ./30-proonga.ini
```

php_json_encode_exを利用してます。
php5-jsonを有効にしてください。
CentOSなどでは、php-commonに含まれているので
proonga.iniの読み込みタイミングに気をつけてください。

phpの下位互換用の分岐を書いていません。
php5.3.x以上で動くと思いますが、PHP 5.5.18で開発しているためそれ以上のバージョンをオススメします。


# クラス一覧

[Groongaクラス](http://qiita.com/Yujiro3/items/cb03abcc71bbb2f883f7 "Groongaクラス")
[GCommandクラス](http://qiita.com/Yujiro3/items/aa751a66ce4fc37f4aea "GCommandクラス")
[GTableクラス](http://qiita.com/Yujiro3/items/1b5cea045621f67100bc "GTableクラス")
[GColumnクラス](http://qiita.com/Yujiro3/items/241e9f561be14927e6be "GColumnクラス")
[GLoadクラス](http://qiita.com/Yujiro3/items/3f876a277e410fb1b631 "GLoadクラス")
[GDeleteクラス](http://qiita.com/Yujiro3/items/45ee01c107f2fa17c6c3 "GDeleteクラス")
[GSelectクラス](http://qiita.com/Yujiro3/items/c59094e2c83970bf224f "GSelectクラス")


# サンプル

[micro_blog.php](https://gist.github.com/Yujiro3/1ce4908b191cfaf77b5d "micro_blog.php")


# 接続処理

```php
/* GQTPによる接続 */
$gdb = new Groonga('127.0.0.1', 10043);


/* 内部DBとして利用する */
$gdb = new Groonga('./db/test.db');
```

ポート番号を指定するとGQTPで接続するようになります。


# Groonga組み込みコマンド

[Groonga組み込みコマンド](http://qiita.com/Yujiro3/items/4a7f83bda17a5037a16b "Groonga組み込みコマンド")

```php
$gdb = new Groonga('./db/test.db');

$result = $gdb->command('status')->exec();
```
登録されているコマンドは何でも使えるようになります。


# メソッドチェーンで呼び出し

メソッドチェーンで実行できるようにしたらやたらとクラスが多くなりました。
Groongaクラスから各クラスが呼び出される感じです。

**コード**

```php
/* select --table Users --match_columns name,location_str,description --query "New York" --output_columns _key,name */
$result = $gdb->table('Users')
    ->select()
    ->matchColumns('name,location_str,description')
    ->query('"New York"')
    ->outputColumns('_key,name')
    ->exec(true);

echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_BIGINT_AS_STRING);
```

**結果**

```php
[
    [
        [
            1
        ],
        [
            [
                "_key",
                "ShortText"
            ],
            [
                "name",
                "ShortText"
            ]
        ],
        [
            "bob",
            "Bob"
        ]
    ]
]
```

基本はGroongaの組み込みコマンドを実行するクラス群です。
極力ソースを書かないように心がけたのでバグも少ないはずです。

CentOSでzend_call_method_with_*_params()関数がうまく動かなかったので
MongoDBのバインディングとかが使っている方法を試してみました。
とりあえず問題ないようです。

Groongaの組み込みコマンドが楽ちん過ぎて普通の書き方に戻れない。。。
LaTeXのlstlistingの中でLaTeXのコマンドを使いたいときの注意点

*LaTeX*の中にプログラミングソースコードを記述したいときによく用いられるstyとして、
`lstlisting`がありますが、その中に*LaTeX*のコマンドを用いたいときがあります。

しかし、バックスラッシュを`\begin{lstlisting}`と`\end{lstlisting}`の間に書いても
そのまま表記されてしまいます。
`\begin{lstlisting}`と`\end{lstlisting}`の間で*LaTeX*のコマンドを使いたいときに以下のように
エスケープシーケンスを用いると使うことが出来ました。

`\begin{lstlisting}[escapechar=!]`
とかき、
コマンドを`!`と`!`で挟みます。

ここで、`escapechar`の文字を変えることも出来ます。
(`@`とかも用いられているようですので、お好みでどうぞ。)
スマホサイトにアプリダウンロードのバナーを表示させる


備忘録です。

![img.jpg](https://qiita-image-store.s3.amazonaws.com/0/44554/70d94543-1f96-1de8-aadc-bb558229f140.jpeg "img.jpg")
こういうやつを表示させる。

## iOSの場合
iOS版はMobileSafari用のmetaタグが用意されているのでめちゃ簡単。

```
<meta name="apple-itunes-app" content="app-id=表示させたいアプリのID">
```
これだけで上画像のように表示される。

## Androidの場合
AndroidはjQuery Smart Bannerで対応。
jQuery Smart Banner - http://jasny.github.io/jquery.smartbanner/


```HTML
<meta name="google-play-app" content="app-id=表示させたいアプリのID">
<link rel="apple-touch-icon" href="アプリアイコンのパス">
<link rel="stylesheet" type="text/css" href="jquery.smartbanner.css"> 
<script type="text/javascript" src="jquery.smartbanner.js"></script>
```
必要な設定を行い、


```JavaScript
$.smartbanner();
```
実行！
jQuery Smart BannerはiOSにも対応しているため、iOS版GoogleChromeはこっちで表示される。
LaTeXでプログラミングソースコードを記述したいときの注意点

*LaTeX*の中にプログラミングソースコードを記述したいときによく用いられる*sty*として、
`lstlisting`があります。
その簡単な導入について記述します。

#ダウンロード
まず以下に接続して、`listings.sty`をダウンロードします。
http://www.ctan.org/tex-archive/macros/latex/contrib/listings
(`jlisting`は[こちら](http://mytexpert.sourceforge.jp/index.php?Listings)から)

#プリアンプルの設定
そして、プリアンプルに
`\usepackage{listings,jlisting}`
と書きます。(`jlisting`は、日本語を用いたいときのみ書きます。)

さらに以下の設定をプリアンプルに記述します。(この設定は個別に変えられます。)
```\lstset{% 
language={C++},%
basicstyle={\small},% 
identifierstyle={\small},% 
ndkeywordstyle={\small},% 
stringstyle={\small\ttfamily},% 
frame={tb},% 
breaklines=true,% 
columns=[l]{fullflexible},% 
numbers=left,% 
xrightmargin=0zw,% 
xleftmargin=3zw,% 
numberstyle={\scriptsize},% 
stepnumber=1,% 
numbersep=1zw,% 
morecomment=[l]{//}% 
} 
```
#ソースコードの記述
そして、
`\begin{lstlisting}`と`\end{lstlisting}`の間にソースコードを記述します。

これで、ソースコードがきれいに出ます。
プリアンプルの設定を変えたり、`\begin{lstlisting}[...]`
の[...]の部分に、そこの部分だけに適用したいことを記述することも出来ます。
FormオブジェクトのURLの渡し方について

Rails Advent Calendarの2日目の記事である [Rails4でFormオブジェクトを作る際に気をつける3つのポイント｜江の島エンジニアBlog](http://blog.enogineer.com/2014/12/02/rails-form-object/ "Rails4でFormオブジェクトを作る際に気をつける3つのポイント｜江の島エンジニアBlog") を読んだんですが、ちょっと気になる所があったんで突っ込みを入れてみる。

モデル層であるFormオブジェクトにURLを返すためのメソッド定義するのは、あんまりよろしく無いんじゃないかと思う。
そもそもurl_helperをちゃんと動かすためにはホスト名やポート等のリクエスト情報が必要で、この例の様に相対パスを出力するだけなら使えなくもないけどモデル層から呼ばれることは、余り想定されていない。
デコレーター層に生やすか、そもそも組込みのヘルパーを使うべきではないかと思う。

ちなみに`form_for`ヘルパーが中で使っているのは`polymorphic_path`というヘルパーで、地味だし自分も良く忘れるのだが、この例ではこれがそのまま使えるはず。

```haml
- form_for @site_form, url: polymorphic_path(@site_form.site) do
```

これで、Formオブジェクトの`url`メソッドは必要無くなるし、`persisted?`かどうかの分岐も不要になる。こういう感じでいかがだろうか？
もうちょっと出力フォーマットが複雑だったら、やっぱりデコレーターかなあ。


ついでにもう一つ。Rails4なら、

```ruby
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
```
って書かなくても、

```ruby
include ActiveModel::Model
```
で良い。

`ActiveModel::Model`は以下と等価。

- `extend ActiveModel::Naming`
- `extend ActiveModel::Translation`
- `include ActiveModel::Validations`
- `include ActiveModel::Conversion`
CD-ROMのフォーマット

とある学会に応募(3作品)するとき、動作している動画も添付することになり、QuickTimeで撮影したのですが、
提出のためにCD-ROMを用いることに。
(動画は10MB*5ぐらいのため、DVD-Rは容量的にもったいない。)

そのとき、CD-ROMにBurnを用いて焼いたのですが、フォーマットについて久方ぶりに調べました。
メモとして残しておきます。

```ISO-9660：ISOによって標準化された規格。
ISO-9660 Level1拡張 : Joliet
ISO-9660 Level2拡張 : Apple ISO
Romeo : Windows専用ISO9660
UDF : 互換性追求フォーマット
UDF Bridge : ISO9660としてもアクセス出来るUDF
RockRidge : UNIXのISO9600拡張仕様
HFS(+) : Mac専用
```
今回は提出のために、UDFを用いました。
2015年3月に応募した作品の結果が出るので、某らの賞が取れるといいなー