OmniAICreator/Qiita-1.07M huggingface dataset:
jsonのフォーマットチェックを行うコマンド json_verifyのインストール (Mac)



yajl というパッケージに入っているらしい。brew からインストール。

```
% brew install yajl
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/yajl-2.1.0.yosemite.bottle.3.tar.gz
######################################################################## 100.0%
==> Pouring yajl-2.1.0.yosemite.bottle.3.tar.gz
?  /usr/local/Cellar/yajl/2.1.0: 15 files, 232K
```

チェック成功例

```
% cat composer.json | json_verify
JSON is valid
```

失敗するとこんな感じ

```
% cat dame.json|json_verify
lexical error: invalid string in json text.
                                        {"hoge: "foga", "fff": "bbb"}
                     (right here) ------^
JSON is invalid
```

その他にも、json_reformat というコマンドもインストールされました。
Android の Linux 環境をターミナルから構築する

# Android SDK のダウンロード

```zsh
wget http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz
tar zxvf android-sdk_r24.0.2-linux.tgz
sudo mv android-sdk-linux/ /opt/
rm android-sdk_r24.0.2-linux.tgz
```

# Android SDK の ANDROID_HOME と PATH 設定

```zsh
export ANDROID_HOME=/opt/android-sdk-linux
export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
```

`printenv` コマンドで設定ができたかどうかの確認ができます.

# Android SDK のアップデート

```zsh
android update sdk --no-ui
```

`android list sdk --all` で確認 
`yes` コマンドを使うといろいろ捗るかもしれない

# Android NDK のダウンロード

環境を確認

```zsh
uname -m
```

`x86_64` の場合は `Linux 64-bit (x86)` をダウンロードする

```zsh
wget http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin
chmod a+x android-ndk-r10d-linux-x86_64.bin
./android-ndk-r10d-linux-x86_64.bin
sudo mv android-ndk-r10d /opt/
rm android-ndk-r10d-linux-x86_64.bin
```

# Android NDK の ANDROID_NDK_HOME と PATH 設定

```zsh
export ANDROID_NDK_HOME=/opt/android-ndk-r10d
export PATH=${PATH}:$ANDROID_NDK_HOME
```

`printenv` コマンドで設定ができたかどうかの確認します.

# おまけ

## ndk_download.sh

```zsh
if [ `uname -m` = x86_64 ]; then 
  wget http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin -O ndk.bin; 
else 
  wget http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86.bin -O ndk.bin; 
fi
sudo apt-get install -y p7zip-full
7z x ndk.bin > /dev/null
```

## local_properties.sh

```zsh
cd Project
touch local.properties
echo "sdk.dir=$ANDROID_HOME" >> local.properties
echo "ndk.dir=$ANDROID_NDK_HOME" >> local.properties
```
Python で Project Euler #12「高度整除三角数」

[Problem 12 「高度整除三角数」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2012)

> 三角数の数列は自然数の和で表わされ, 7番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 である. 三角数の最初の10項は:
> 
> ```math
> 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
> ```
> 
> となる.
> 最初の7項について, その約数を列挙すると, 以下のとおり.
>
> ```
>  1: 1
>  3: 1,3
>  6: 1,2,3,6
> 10: 1,2,5,10
> 15: 1,3,5,15
> 21: 1,3,7,21
> 28: 1,2,4,7,14,28
> ```
>
> これから, 7番目の三角数である28は, 5個より多く約数をもつ最初の三角数であることが分かる.
> では, 500個より多く約数をもつ最初の三角数はいくつか.

```py:Python
import math

# limit = 5
limit = 500

def compute_factors(num):
  factors = [1]
  if(num == 1): return factors
  for i in range(2, int(math.floor(math.sqrt(num))) + 1):
    if(num % i == 0):
      factors.append(i)
  factors_rev = list(factors)
  factors_rev.reverse()
  for i in factors_rev:
    fac = num // i
    if(fac not in factors):
      factors.append(fac)
  return factors

triangular_nums = [1]
factors = []
n = 2
while True:
  triangular_num = triangular_nums[n-1-1] + n
  triangular_nums.append(triangular_num)
  factors = compute_factors(triangular_num)
  if(len(factors) > limit):
    break
  n += 1

result = triangular_nums[-1]

print result
print result == 76576500
print n
print factors[:10]
```

```:結果
76576500
True
12375
[1, 2, 3, 4, 5, 6, 7, 9, 10, 11]
```
Cookie切り替え

### エクステンションを使う
***
#### [Swap My Cookies](https://chrome.google.com/webstore/detail/swap-my-cookies/dffhipnliikkblkhpjapbecpmoilcama?utm_source=chrome-ntp-icon)

設定はここから
![swapmycookies.png](https://qiita-image-store.s3.amazonaws.com/0/68491/3a80d223-82d2-d85e-88e2-cc5a576bf5f1.png)

* Option（使いそうな項目だけ）
<dl>
<dt>Refresh tabs after changing the profile?</dt>
<dd>切替をそのタブだけにしたければ**Only Tab**にする</dd>
<dt>Restore default profiles</dt>
<dd>選択中のProfiles以外をクリアする</dd>
</dl>
* Profile<br>
名前を編集するとき、チェックマークをクリックしないと変更が確定しないので注意する

#### [Chrome Cookie Switcher](https://chrome.google.com/webstore/detail/cookie-switcher/lbgngibmlgcicanoijcnijbkmjpkifkb?utm_source=chrome-ntp-icon)

Webサイト単位で設定するため、異なるサイト間を行き来するようなテストは不向き？

[複数アカウントを切り替えるときに便利なGoogle Chrome機能拡張「Chrome Cookie Switcher」](http://www.moongift.jp/2011/11/20111105-2/)


#### [MultiLogin](https://chrome.google.com/webstore/detail/multilogin/nccllfnllopfpcbjdgjdlfmomnfgnnbk?utm_source=chrome-ntp-icon)

アイコンをクリックするとシークレットモードで別タブが開く

[複数のアカウントで同時にログインできるようにする！「MultiLogin」。](http://www.gigafree.net/internet/googlechrome/MultiLogin.html)

### エクステンションを使わない
***
[複数のCookieを頻繁に切り替える必要があるテスト](http://qiita.com/kalibora/items/91ec3a006bb8ff13f06e)
AIR製のアプリにて特定のAndroid端末にて電話後の復帰画面がブラックアウトする現象

# 概要

結構強烈な端末依存のバグですが、Adobe AIRのバグフォーラムにてバグ報告済み。
https://bugbase.adobe.com/index.cfm?event=bug&id=3364803
現状は上記URL先にて有志の動画がアップされてるので、それ見るとはやい。

# Fixした人がいる
http://forum.starling-framework.org/topic/ane-fix-for-blackblank-screen-bug-when-returning-to-air-android-apps
直し方ですが、電話からの復帰時に画面を無理やり回転させて描画し直す。
なので復帰時に端末如何では一瞬横向き画面が描画されてしまう。
AIR製アプリのiOS 64bit対応顛末メモ

# 経緯と顛末
Appleより
https://developer.apple.com/news/?id=10202014a
2015年から申請されるアプリは64bit対応しないとダメだよ通知

これを受けてAdobeは
http://blogs.adobe.com/flashplayer/2014/10/adobe-air-to-support-upcoming-ios-x64-requirement.html
全力サポートするとのこと。
んで迎えたAIR16.0Beta版…

iOS7系の64bit対応機iPhone5s、iPadAirにてANEを積んでビルドすると
アプリ起動すらしないバグが発覚
https://bugbase.adobe.com/index.cfm?event=bug&id=3927984
悲鳴が上がる。審査もOS7系対応ならもちろん落ちる。

→その後AIR17.0Beta発表
バグレポート上はFixしてないが無事動く模様。

→その後
無事Fixedに。
ponydebuggerを試してみる

先週のiosオールスターズは行ってないのですが、スライドシェアを見ていて、
ponydebuggerを使ったことなかったので試してみました

# まずは、インストールから
http://qiita.com/edo_m18/items/d0c42a988010e1504f1c

```
curl -sk https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py | \
pipe>   python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger
```
あれ、うまくいったのかわからない

```
curl -k https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py | \
pipe>   python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger
```

いきなりコケる
```
curl: (35) ssl peer handshake failed, the server most likely requires a client certificate to connect
```
curlのオプションつけるのやめる

```
curl https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py | \
  python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger
```

```
Collecting pybonjour (from ponydebugger)
  Could not find any downloads that satisfy the requirement pybonjour (from ponydebugger)
  Some externally hosted files were ignored as access to them may be unreliable (use --allow-external pybonjour to allow).
  No distributions at all found for pybonjour (from ponydebugger)
Traceback (most recent call last):
  File "<stdin>", line 2462, in <module>
  File "<stdin>", line 946, in main
  File "<stdin>", line 1794, in after_install
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 542, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/Users/shhirats/Library/PonyDebugger/bin/pip', 'install', '-U', '-e', 'git+https://github.com/square/PonyDebugger.git#egg=ponydebugger']' returned non-zero exit status 1
```

コケた際ってのを試す
```
pip install -U -e git+https://github.com/square/PonyDebugger.git#egg=ponydebugger --allow-external pybonjour --allow-unverified pybonjour
zsh: command not found: pip
```

あれ、入ってなかったっけ。ってことで入れる
http://www.sicafe.net/macPackageManageTips/html/homebrewPythonInstall.html

上の通りにやったあと、リトライ

したら、以下のエラーでコケたので質問、そして解決
http://ja.stackoverflow.com/questions/6538/ponydebugger%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%93%E3%81%91%E3%82%8B?noredirect=1#comment5595_6538

シングルクォーテーションでうまくいくとは。。。

# サンプルを試す

そのあと、
https://github.com/square/PonyDebugger
のサンプル試したけど、うまくいかず。。。

```
/Users/xxxxx/PonyDebugger-master/ObjC/PonyDebugger/PDDebugger.m:12:9: 'SocketRocket/SRWebSocket.h' file not found
```
うん、何故だろう。

最終的に
自分のカフェさがしを試したら、うまく動いた！

ネットワークとかで実行にかかってる秒数とかわかっていいですね！（画像あとで載せます）
あとで画像載せます

自分の備忘録として書きました。ハマリポイントも合ったので参考になれば幸いです。

# 起動
ローカルで以下コマンド
```
{15-03-03 0:07}[ruby-2.1.0]server:~@master✗✗✗✗✗✗ shiratsu% ponyd serve --listen-interface=127.0.0.1
```

あとは、シミュレータでアプリ実行すれば動きます
残念ながら多分実機は無理なきがする。
プルリク＆イシューは、ターミナルからでしか開かない

[hubコマンド](http://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3)を使って、コマンドラインからgithubを開きます。

`$ hub browse`は現在いるレポジトリから`https://github.com/{owner}/{repo}/`に飛べるものなので、コマンドラインからgithubに飛ぶのは向いていると思います。

だいたいgithubにアクセスしたらよく見るであろうものをaliasにしました。
お好みで編集してください。

```bash:.gitconfig
[user]
  username = yoshimikeisui # githubのユーザ名を入れておくと便利
...
[alias]
  # 自分が作った全てのPull Request、Issueを開く
  byme = !hub browse -- issues/created_by/$(git config user.username) && hub browse -- pulls/$(git config user.username)

  # 自分にアサインされている全てのPull Request、Issueを開く
  tome = !hub browse -- issues/assigned/$(git config user.username) && hub browse -- pulls/assigned/$(git config user.username)

  # 現在いるブランチのPull Requestを確認する
  see  = !hub browse -- pull/$(git symbolic-ref --short HEAD)

  # 現在いるブランチのPull Requestを新規作成する
  pr = !hub browse -- compare/$(git symbolic-ref --short HEAD)'?'expand=1'&'body=%23%23%20%E7%9B%AE%E7%9A%84%0A%0A%23%23%20%E5%A4%89%E6%9B%B4%E5%86%85%E5%AE%B9

```

ちなみに一番したの「現在いるブランチのPull Requestを新規作成する」やつは、paramsを渡してあるので自動でフォーマットが入ります。([参考](http://qiita.com/yoshimikeisui/items/3e1873e3bf1bbafe8733))
![スクリーンショット 2015-02-16 18.28.14.png](https://qiita-image-store.s3.amazonaws.com/0/41657/2dc2da1b-4d2c-0417-9322-119fd93797b1.png)
Chefレシピ内で任意のIPアドレスを付与する

任意のIPアドレスを付与する際困ったのでその時の対応メモ。
ohaiでホストのIPを取得しようとするとValueではなくKeyにIPがあるので普通の値取得ができなかった。
できるだけDSLだけでスマートに解決したかったが未熟であるがゆえ無理やりコードを挿入して対応した。

####前提
* プロビジョン対象インスタンスは複数インターフェース・IPアドレスを持っている
* eth0 172.〜、eth1 192.〜、eth1:0 10.〜など使い分けている
* IPアドレスについてはohaiで取得できる値を使いたい
* template内のロジカルな記述は避け参照のみにしたい

####問題
* node["ipaddress"]で取得できる値はnode["network"]["default_interface"]に対して設定されているアドレスのみである。
したがってnode["network"]["default_interface"]がeth0である場合172.〜以外はnode["ipaddress"]で取得できない。
* node["network"]["interfaces"]["eth1"]["addresses"]でインターフェース毎のIPを取得しようとするとアドレスはvalueではなくkeyに格納されているのでシンプルに参照できない。

**ohaiのeth1出力例**
>"eth1": {
>      〜省略〜
>        "192.168.1.11": {
>          "family": "inet",
>          "prefixlen": "24",
>          "netmask": "255.255.255.0",
>          "broadcast": "192.168.1.255",
>          "scope": "Global"
>        },
>      〜省略〜

####解決
* recipe内でohaiの値をhash.selectで取り出し、hash.keysで格納し直したものをtemplateで使用する


```rb:site-cookbooks/hoge/recipes/default.rb

template "/etc/hoge.conf" do
 mode 0644
 source "hoge.conf.erb"
 ohai_val = Ohai::System.new
 ohai_val.all_plugins
 host_address_val = ohai_val["network"]["interfaces"]["eth1"]["addresses"].select { |address_key, address_val| address_val["family"] == "inet" }
 host_address_array = host_address_val.keys

 variables({
   :eth1_address => host_address_array[0]
 })

end

```

```erb:site-cookbooks/hoge/templates/default/hoge.conf.erb
CLIENT_IP=<%= @eth1_address %>
```
macでphpからmemcachedを使用できるようにする手順

# memcachedのインストール

memcachedをインストールしていない場合は[こちら](http://qiita.com/makotok7/items/9998b15f79fc7a53af24)

# libmemcachedのインストール

`brew install libmemcached`

下記のような表示がされれば成功。

```
$ brew install libmemcached
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/libmemcached-1.0.18_1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring libmemcached-1.0.18_1.yosemite.bottle.tar.gz
?  /usr/local/Cellar/libmemcached/1.0.18_1: 227 files, 2.2M
```

# PECL PHP拡張(memcached)のインストール

`curl -O http://pecl.php.net/get/memcached-2.2.0.tgz`
*※最新は http://pecl.php.net/package/memcached を確認してください。*

を実行し、memcachedの圧縮ファイルをダウンロード。

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 70449  100 70449    0     0  41147      0  0:00:01  0:00:01 --:--:-- 41174
```

ダウンロードしたファイルを解凍する。

`tar zxvf memcached-2.2.0.tgz`

ビルドおよびインストールする。

```
cd memcached-2.2.0
phpize
./configure
make
make test
make install
```

php.iniを編集し、下記の1行を追加する。

`extension=memcached.so`

保存後、php再起動する。
[JAWS-UG CLI] DynamoDB:#4 テーブルの削除

http://jawsug-cli.doorkeeper.jp/events/18571 でのハンズオン資料です。

AWS CLIを利用して、DynamoDBのテーブルを削除してみます。

* describe-table
* delete-table

前提条件
========

## DynamoDBへの権限

* DynamoDBに対してフル権限があること。

## AWS CLIのバージョン

以下のバージョンで動作確認済

* AWS CLI 1.7.18
* AWS CLI 1.7.7

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.7.18 Python/2.7.5 Darwin/13.4.0
```
0. 準備
=======


0.1. リージョンの決定
---------------------

作成するユーザのデフォルトリージョンを決めます。
(カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:コマンド(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルとリージョンが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile      iam_full-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION
```


1. 事前確認
===========

1.1. 変数の確認
------------------------

```bash:変数の確認:
cat << ETX

DYNAMO_TABLE_NAME:  ${DYNAMO_TABLE_NAME}

ETX
```

DYNAMO_TABLE_NAMEが空か、想定と異なる場合は指定しなおします。

```bash:コマンド(例):
DYNAMO_TABLE_NAME='ProductCatalog'
```




1.2. テーブルの確認
------------------------


```bash:コマンド:
aws dynamodb describe-table --table-name ${DYNAMO_TABLE_NAME}
```

```json:結果:
{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "Id", 
                "AttributeType": "N"
            }
        ], 
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 1, 
            "WriteCapacityUnits": 1, 
            "ReadCapacityUnits": 1, 
            "LastDecreaseDateTime": 1424069183.78
        }, 
        "TableSizeBytes": 0, 
        "TableName": "ProductCatalog", 
        "TableStatus": "ACTIVE", 
        "KeySchema": [
            {
                "KeyType": "HASH", 
                "AttributeName": "Id"
            }
        ], 
        "ItemCount": 0, 
        "CreationDateTime": 1424066269.294
    }
}
```

2. テーブルの削除
=================


```bash:変数の確認:
cat << ETX

DYNAMO_TABLE_NAME:  ${DYNAMO_TABLE_NAME}

ETX
```

```bash:コマンド:
aws dynamodb delete-table --table-name ${DYNAMO_TABLE_NAME}
```

```json:結果:
      {
        "TableDescription": {
          "TableStatus": "DELETING",
          "TableSizeBytes": 0,
          "ItemCount": 0,
          "TableName": "ProductCatalog",
          "ProvisionedThroughput": {
              "NumberOfDecreasesToday": 0,
              "WriteCapacityUnits": 5,
              "ReadCapacityUnits": 10
          }
        }
      }
```


3. 事後確認
=============

```bash:コマンド:
aws dynamodb describe-table --table-name ${DYNAMO_TABLE_NAME}
```

```text:結果:
A client error (ResourceNotFoundException) occurred when calling the DescribeTable operation: Requested resource not found: Table: ProductCatalog not found
```


完了
====

以上で、DynamoDBは完了です。
rakeをbundle execなしで利用する

* rbenv-binstubsプラグイン

```shell-session
mkdir ~/.rbenv/plugins
cd .rbenv/plugins
git clone git://github.com/ianheggie/rbenv-binstubs.git
```

*　bundle install

```shell-session
bundle install --path=vendor/bundle
```
ターミナル再起動しましょう！
中国のAndroidアプリストアで開発者アカウント登録するのは結構大変

中国って国内からGoogle Playにアクセス出来ないんですね。全然知りませんでした。。。（2015/2/16現在）
というわけで、中国のアプリストアにどうやって開発者アカウント登録するのか。
メジャーどころを一覧にしてみました。
ID番号が必要であったり、どこも難易度が高いです。
①、②は英語ページがある分まだマシなのかも。


①MyApp (Tencent)
http://android.myapp.com/
　開発者向けページ
　http://open.qq.com/
　開発者向けページ（英語）
　http://open.qq.com/eng/reg
　　登録にはDeclaration of AuthorizationとCompany Licenseの
　　写真のアップロードが必要
　　APKファイルを添えて、登録と同時にアップロード可能

②Qihoo 360 Mobile Assistant
http://zhushou.360.cn/soft/
　開発者向けページ
　http://dev.360.cn/
　開発者向けページ（英語）
　http://developer.360.cn/distribution
　　登録にはDeclaration of AuthorizationとCompany Licenseの
　　写真のアップロードが必要
　　APKファイルを添えて、登録と同時にアップロード可能

③Wandoujia
http://www.wandoujia.com/apps
　申請ページ（QQまたはWeiboのアカウントでログイン可能？）
　http://open.wandoujia.com/home

④MIUI (Xiaomi)
http://app.mi.com/
　申請ページ
　http://dev.xiaomi.com/
　日本の電話番号で登録可能
　開発者アカウント登録ページでID番号が必要（個人の場合）
　企業の場合は、ビジネスライセンス登録番号、ビジネスライセンスの写真、
　税務登録番号、税務登録証明書のコピーの写真が必要

⑤Baidu App Store
http://as.baidu.com/
　※開発者アカウント登録に中国の電話番号、IDが必要
　アプリ申請ページ
　　http://app.baidu.com/
　開発者アカウント登録ページ
　　http://app.baidu.com/user/register

⑥91 Mobile Assistant
http://zs.91.com/feature/v4/index_android.shtml
　登録にID番号が必要
　申請ページ
　http://market.sj.91.com/Users/Login.aspx
　申請方法
　http://ibbs.91.com/thread-2129799-1-1.html

⑦HiMarket
　http://apk.hiapk.com/
　開発者向けページのログインにBaiduのアカウントが必要


⑧AppChina
http://www.appchina.com/account/register
開発者アカウント登録に中国の電話番号が必要

⑨Anzhi
アカウント登録に中国の電話番号が必要
http://i.anzhi.com/web/account/register?serviceId=006&serviceVersion=1.0&redirecturi=http://dev.anzhi.com

⑩Lenovo MM
http://open.lenovo.com/developer/matchdev_reg.jspx
最初のユーザー登録はできるが、企業アカウント、個人アカウント共に中国在住者対象
FMDBでSQL実行後に影響のあった行数を取得(INSERT OR REPLACEの挙動に注意)

# はじめに
SQLiteを使うため、FMDBを使用しています。
Insert・Updateを実行後、影響のあった行数を取得する必要がありました。

# changesで取得できます

```objc:
@property (nonatomic, retain) FMDatabase *db;
```

SQL実行直後に、FMDatabaseのインスタンスのchangeメソッド呼び出し。

```objc:
        [self.db executeUpdate:sql withParameterDictionary:dic];
        result += [self.db changes];
```

FMDBでの実装は以下のようになっています。

```objc:FMDBより
- (int)changes {
    if (_isExecutingStatement) {
        [self warnInUse];
        return 0;
    }
    
    _isExecutingStatement = YES;
    
    int ret = sqlite3_changes(_db);
    
    _isExecutingStatement = NO;
    
    return ret;
}
```

# おわりに
Updateで結果が0件の場合にInsertする、という場合で使用しました。

SQLiteのReplace句の挙動が予想と違ったためです。
予想「PK項目が存在しない場合はINSERT、存在する場合はUPDATEを行う」
実際「PK項目が存在しない場合はINSERT、存在する場合はDELETE後、INSERTを行う」

何かの参考になりましたら幸いです。

# 関連
[FMDB](https://github.com/ccgus/fmdb)
AWS S3をWEBサーバにする方法


静的コンテンツのみですが、AWSではS3をWEBサーバにすることができます。


以下の方法では、Bucket配下のフォルダは全て公開されます。


1.Bucketを作成する。(例として、examplebucket ）

その後、設定するところはこの２つです。

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/44315/d724e725-b3ae-3453-d354-08ac9fc9f442.png "S3_Management_Console.png")



2.作成したBucketのpermissionを変更する。
	Permission→Edit BucketPolicy　で以下の設定をいれます。



```
{
  "Version":"2012-10-17",
  "Statement":[{
	"Sid":"AddPerm",
        "Effect":"Allow",
	  "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"
      ]
    }
  ]
}
```

念のため、元ネタもリンクしておきます。
https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html


3.Static Website Hostinを設定する。
・Enable website hostingにチェックを入れる

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/44315/ed5a8517-0158-7fbf-a48a-c634a210d1a8.png "S3_Management_Console.png")

そして、Bucketにファイルを配備すると、WEBサーバになっていることがわかります！

---
１秒あたり、どの程度のアクセスが受けられるのかはこのあたりを参考に
http://aws.typepad.com/aws_japan/2012/03/amazon-s3-performance-tips-tricks-.html
iOSでFramework を参照するときの RequiredとOptional.


# Frameworkのstatus

Xcode上でframeworkをimportするときに、下記のようにframeworkのstatusが出てくる。
よくわからなかったので調べました。

![スクリーンショット 2015-02-16 17.20.58.png](https://qiita-image-store.s3.amazonaws.com/0/15000/1e8a706a-a1ff-a1a8-998c-09963b16c137.png)

# Required / Optional

[Document](https://developer.apple.com/library/ios/recipes/xcode_help-project_editor/Articles/AddingaLibrarytoaTarget.html) にきちんと載ってました。

原文:

    Libraries and frameworks are designated as Required by default, but you can change this designation to Optional. Required libraries must be present on the host computer for the product to load. Optional libraries do not have to be present for the product to load. A Required framework will always be loaded into memory, but an Optional framework will be loaded only if needed. The initial load of the application will be faster if a large library that is never needed is designated as Optional.

日本語訳:

    ライブラリとフレームワークはデフォルトでRequiredになるように選択されています、しかしOptionalに変更することも可能です。Required ライブラリは そのproductがロードされるときにマシン上に出現していなくてはなりません。Optional ライブラリは ロードされるときに出現している必要がありません。Required フレームワークは常にメモリ上にロードされるのに対して、Optional フレームワークは必要になった時だけロードされます。もしそれ以上は必要のない大きなライブラリがあってOptionalに選択されていれば、アプリケーションの初期ロードが早まります。

要はロードを早めるために利用頻度が少ないものはOptionalにしつつ、常時必要そうなものはRequiredにしましょうねってことだと理解してる。
もし全然違ってたら、ご指摘ください・・・

# 参考

- [Linking to a Library or Framework](https://developer.apple.com/library/ios/recipes/xcode_help-project_editor/Articles/AddingaLibrarytoaTarget.html)
VMware製品へのGHOSTの影響情報

## 概要

VMware社からナレッジ「[VMware KB: VMware Response to CVE-2015-0235 - glibc gethostbyname buffer overflow, aka "GHOST" (2105862)](http://kb.vmware.com/kb/2105862)」が発行されており、現在のところ評価中だが、評価範囲内では影響がないとしている。

## 詳細

VMware製品への影響や対策は、[ナレッジベース](http://kb.vmware.com/)および[セキュリティアドバイザリ](https://www.vmware.com/security/advisories/)で確認する。以下に確認できた範囲で情報をまとめる。

### 背景

2015年1月28日に、National Vulnerbility Databaseに[CVE-2015-0235](http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-0235)が登録されている。またJPAから「[JVNVU#99234709: glibc ライブラリにバッファオーバーフローの脆弱性](https://jvn.jp/vu/JVNVU99234709/index.html)」、IPAから「[glibc の脆弱性対策について(CVE-2015-0235)](https://www.ipa.go.jp/security/announce/20150129-glibc.html)」が発信されている。この問題は、[QUALYSの報告](https://www.qualys.com/research/security-advisories/GHOST-CVE-2015-0235.txt)にもある「GHOST」の通称でも情報が広まっている。

### VMware社からの発信情報

GHOSTのVMware製品への影響については、VMware社から(1)VMware社製品に関する影響調査状況のナレッジが出されている。

1. [VMware KB: VMware Response to CVE-2015-0235 - glibc gethostbyname buffer overflow, aka "GHOST" (2105862)](http://kb.vmware.com/kb/2105862)

現在のところ、セキュリティアドバイザリは発行されていない。ナレッジで説明されている影響度を考えると、特に発行されないかもしれない。

### 関連ナレッジの和訳

現在のところ、関連ナレッジの和訳はない。

### 対策

現在のところ、特別なアクションは必要ないと思われる。ナレッジでは、以下のように説明している。

> While some VMware products do ship with the vulnerable versions of glibc, based on our current analysis VMware products are not affected by this issue. This conclusion is based on not finding a method to pass untrusted input to the vulnerable glibc function in any VMwareproduct.

> VMware products that ship with vulnerable versions of glibc will be updated in upcoming releases in accordance with our security response policy found [here](https://www.vmware.com/support/policies/security_response).

以下に私訳を乗せる。

> いくつかのVMware製品は脆弱性のある版数のglibcを含んで出荷されているが、私たちの現在までの調査では、VMware製品はこの問題の影響を受けない。この結論は、どのVMware製品においても、脆弱性のあるglibc関数に信頼できない入力値を受け渡す方法が見つからなかったことによる。

> 脆弱性のある版数のglibcを含むVMware製品は、[こちら](https://www.vmware.com/support/policies/security_response)のセキュリティ対応ポリシーに従って、次回のリリースで更新される。

セキュリティ製品ベンダであるTrendmicroが、一般論として「[Linuxに存在する脆弱性「GHOST」、システム管理者は落ち着いて対処を](http://blog.trendmicro.co.jp/archives/10818)」（[原文](http://blog.trendmicro.com/trendlabs-security-intelligence/not-so-spooky-linux-ghost-vulnerability/)）というブログエントリを公開しており、同様の提言をしている。

> システム管理者はこの脆弱性問題を放置することはできませんが、冷静に落ち着いた対応を取ることができるでしょう。すでに各Linuxディストリビューションからは、使用中の glibc のバージョンを更新する修正プログラムが公開されています。管理者は公開され次第、修正プログラムを適用して下さい。

## 参照

本脆弱性の内容。

* [JVNVU#99234709: glibc ライブラリにバッファオーバーフローの脆弱性](https://jvn.jp/vu/JVNVU99234709/index.html)
* [glibc の脆弱性対策について(CVE-2015-0235)](https://www.ipa.go.jp/security/announce/20150129-glibc.html)
* [QUALYSの報告](https://www.qualys.com/research/security-advisories/GHOST-CVE-2015-0235.txt)
* [Linuxに存在する脆弱性「GHOST」、システム管理者は落ち着いて対処を](http://blog.trendmicro.co.jp/archives/10818)

VMware社からの発信情報。

* [VMware KB: VMware Response to CVE-2015-0235 - glibc gethostbyname buffer overflow, aka "GHOST" (2105862)](http://kb.vmware.com/kb/2105862)

VMware社のナレッジやセキュリティアドバイスは、随時更新されるので、適宜、原文を確認されたい。

----

本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
Reactで外からvalueを変更できるinput要素を作りたい


こんな感じでpropsでデフォルトのテキストを渡せるようにしたい。

```
var InputBox = React.createClass({
  render: function() {
    return <input type="text" value={this.props.text} />
  }
});
```

しかしこれだと動かない。

http://jsfiddle.net/hokaccha/5edoqsnk/

理由はこちらにある通り。

[reactjs - React.jsでFormを扱う - Qiita](http://qiita.com/koba04/items/40cc217ab925ef651113#linkedstatemixin)

defaultValueを使えばいいらしい。

```
var InputBox = React.createClass({
  render: function() {
    return <input type="text" defaultValue={this.props.text} />
  }
});
```

と思ってやってみたけど、propsが変更されたときに追従してくれない。

http://jsfiddle.net/hokaccha/fqb9k156/

valueにしてstateで管理するようにして`componentWillReceiveProps`で`setState`することで動くようになった。

```
var InputBox = React.createClass({
  getInitialState: function() {
    return { text: this.props.text };
  },
  componentWillReceiveProps: function(nextProps) {
    this.setState({ text: nextProps.text });
  },
  onChange: function(e) {
    this.setState({ text: e.target.value });
  },
  render: function() {
    return <input type="text" value={this.state.text} onChange={this.onChange} />
  }
});
```

http://jsfiddle.net/hokaccha/apxycw0c/

ホントにこれでいいのかは謎。
2文字以上の空白で区切られた固定長テキストの解析

# 概要

コマンド出力等にありがちな、以下の条件の固定長テキストを解析するためのサブルーチン。

* 全体としては固定長テキスト
* 先頭はヘッダ行
* カラムは実行ごとに異なる（例えばコマンド実行時の引数で変わる）
* カラムの幅は実行ごとに異なる（例えば出力されるデータにあわせて変わる）
* カラムの間は2文字の空白で区切られている
* レコードによっては、あるカラムが空のこともある

## 解析方法

以下の方針で解析します。

* 1行目をヘッダ行として処理します。
* ヘッダ行の「2文字以上の空白」の出現場所から、各フィールドの長さを判断します。
* 残りの行を、固定長テキストとして解析します。
* 結果は、ハッシュリファレンスの配列の形で返します。

ヘッダ行から「固定長」の長さを取得するので、事前に各フィールドの長さを定義する必要がなくなります。レコード行には、空のフィールドや、2文字以上の空白を含むフィールドがあっても大丈夫です。

## サブルーチン

    sub parse_multispaces_separated {
        my $text   = shift;
        my @rows   = ();
    
        # split each lines
        my @lines  = grep { /\S/ } split(/\n/, $text);
        my @length = map { length($_) } ($lines[0] =~ /(\S(?: ?\S)* {2,})/g);
        foreach my $line (@lines) {
            my @values = map { substr($line, 0, $_, '') } @length;
            push(@values, $line);
            s/^\s+|\s+$//g foreach (@values);
            push(@rows, \@values);
        }
    
        # get column names and hash-nize
        my @columns = @{shift(@rows)};
        foreach my $row (@rows) {
            my @values = @{ $row };
            my %hash = map { $columns[$_] => $values[$_] } (0..$#values);
            $row = \%hash;
        }
        
        return @rows;
    }

## 使用例

    my $text = <<EOF;
    Customer Name   Location       email
    Akai Isao       Tokyo, Japan   akai@example.com
    Uda Eijiro      Osaka, Japan   eijiro.uda@example.com
    Oswald Kahn     Aidaho, U.S.   kahn-oswald@oswald-inc.example.com
    Silvia Tolen                   silvia@example.com
    EOF
    
    my @rows = &parse_multispaces_separated($text);
    
    use Data::Dumper;
    print Dumper(\@rows);
    
    sub parse_multispaces_separated {
        (略)
    }

## 使用例の出力

    $VAR1 = [
        {
            'email' => 'akai@example.com',
            'Location' => 'Tokyo, Japan',
            'Customer Name' => 'Akai Isao'
        },
        {
            'email' => 'eijiro.uda@example.com',
            'Location' => 'Osaka, Japan',
            'Customer Name' => 'Uda Eijiro'
        },
        {
            'email' => 'kahn-oswald@oswald-inc.example.com',
            'Location' => 'Aidaho, U.S.',
            'Customer Name' => 'Oswald Kahn'
        },
        {
            'email' => 'silvia@example.com',
            'Location' => '',
            'Customer Name' => 'Silvia Tolen'
        }
    ];
railsデータベースの構造を更新する

rails初心者なので完全にフィーリングでやっています。
なので個人的なメモです。

データベースのテーブルを一度作ってしまって、後からString型でvalueという要素を追加したい！というとき、マイグレーションを更新します。
ただ、既にあるマイグレーションのファイルを弄ってrake db:migrateしてもダメです。ダメでした。

`rails g migration {分かる名前}`

で新しくマイグレーションスクリプトファイルを作ります。
{分かる名前}の部分は大文字とか小文字とか気にする必要はありませんでした。
なんと入力しても結局更新するテーブル名は自分で書く事になります。
どんな変更をしたのか分かりやすく書けばいいと思います。

生成したら内容を編集します。
間違っても焦ってrake db:migrateしないでください。そのせいで２時間くらい無駄になりました。

スクリプトファイルはdb/migrate/にあります。指定したのと似たような名前になっていると思うのでそれを編集します。勝手にアンダーバーとかが付いてますが問題無いです。

```rb
def change
    add_column :Users, :value, :string
end
```

changeの中に変更点を書きます。ググるとupやdownがありますが、upは更新、downは戻す時につかいます。
changeはその辺をいい感じにやってくれるんだと思います。たとえばadd_coumnとかはremove_column溶かしてくれるんだと思います。

書いているのは

add_culumn　:モデル名の複数形, :追加したい要素名, :型

です。

あとはmigrateすればいい感じです。
gitでプッシュした時に「error: RPC failed; result=22, HTTP code = 411」と表示された時の対処

# 事象

gitで画像ファイルをプッシュしようとした際に下記のエラーメッセージが表示され、実行に失敗する。

```
git.exe push --progress  "origin" master:master

Counting objects: 78, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (71/71), 11.50 MiB | 3.43 MiB/s, done.
Total 71 (delta 8), reused 0 (delta 0)
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
error: RPC failed; result=22, HTTP code = 411
Everything up-to-date


gitは正常に終了しませんでした (終了コード 1) (1841 ms @ 2015/02/16 15:49:55)
```

# 原因

「HTTP code = 411」はLength Required(コンテンツ長の指定が必要)という意味のエラーです。
Content-Lengthの指定がないのでサーバ側からアクセスが拒否されています。
gitではポストできるファイルサイズがデフォルトで1MBとなっています。
上記の事象の場合だと、11.5MBとなっているのでポストできるファイルサイズ上限1MBを超えてしまっている為にエラーが発生しています。

# 対策

## ポストできるファイルサイズの上限値を変更する

上限を1MBから50MBに変更する場合
*指定はバイトで行う必要があるので50MBの場合は 50 × 1024 × 1024 = 52428800となる*

### コマンドライン

`git config http.postBuffer 52428800`

### TortoiseGit

1. 右クリックして「TortoiseGit」-> 「Settings」を選択する。
2. 左画面で「Git」を選択し、右画面の「Edit local .git/config」を選択する。
3. 下記の内容を追記する。

```text:config
[http]
  postBuffer = 52428800
```

これでプッシュができるようになっているはずです。

# 備考

ちなみに今回はすべて必要なファイルのプッシュだったので上限値を上げる対応してますが、プッシュしている対象は本当に必要なファイルかをまずはチェックしましょう。
(私の経験では、リポジトリ管理が不要なaiファイル、psdファイルもプッシュされていて上限値を超えているということがあったので)
メモ：ときどき使うWindowsコマンド

#ちょっとしたbatファイル作成時のフォーマット例

* @echo off
コマンドの実行を画面に表示しない

* pause
コマンド実行後に「"続行するには何かキーを押してください . . ."」というメッセージが表示され処理を一時停止することができる。
うっかり意図しないbatファイルを実行してしまった時のために入れておく。

* exit
バッチプログラムの終了

````sample.bat
@echo off

～処理～

pause
exit
````

#半角スペースを含むディレクトリ配下のファイルを取得し特定のディレクトリにコピーする
````sample.bat
@echo off

for /f "usebackq delims=" %%a in (`dir /s /b d:\aaa\*.jpg`) do xcopy "%%a" d:\bbb\

pause
exit
````

* batファイル内で使用しない場合は%ひとつ

````
for /f "usebackq delims=" %a in (`dir /s /b d:\aaa\*.psd`) do xcopy "%a" d:\bbb\
````

# Windowsでシンボリックリンクを貼る
D:\sample\htdocsディレクトリから、D:\htdocsディレクトリにシンボリックリンクを作成する。
（D:\sample\htdocsはD:\htdocsへのシンボリックリンクになる）

````
MKLINK /D "D:\sample\htdocs" "D:\htdocs"
````
wekaにDB2を設定

参考ページ：http://weka.wikispaces.com/Databases

前提条件、ibmのクライアントインストール済み

#1. データベース設定ファイルの作成
DB2のデータベース設定を記述するために、サンプルコードをweka.jarのexperimentフォルダから取得します。

```
C:\Program Files\Weka-3-6\weka.jar
```

をコピーして拡張子をzipに変更。
zipファイルを展開して、experimentフォルダにあるDatabaseUtils.props.odbc
をコピーして下記のディレクトリに配置する。
```
C:\ユーザー\ユーザー名
```
* 3.6では拡張子がpropsでないと認識されないようなので、.odbcの拡張子を削除。
（zip, 展開したフォルダはいらないので、削除する。）

配置したDatabaseUtils.propsの編集。

```DatabaseUtils.props
# JDBC driver (comma-separated list)
jdbcDriver=COM.ibm.db2.jdbc.app.DB2Driver

# database URL
jdbcURL=jdbc:db2:データベース名
```

#2. Wekaで開く
以上でwekaのDBを開くに設定したデータベースが表示され
接続が可能になるはず。
nullを使うのはやめよう

# nullを使うのはやめよう

> null参照の発明は10億ドルにも相当する誤りだった。
>
> アントニー・ホーア

## nullとは？
null は未定義なことを表す特殊な参照。
型として考えると、すべての型の部分型といえる最小の要素といえます（Bottom型）。

### Java
null は Java において当たり前のように使われる。

## null は使ってはいけない
*型システムに守られたプログラミングが崩壊します。*

nullはどのような型にでもなれる特殊な型です。
ある型の値 a に対して、内部にnullが入っているか入っていないかを静的に判断することはできません。

### null参照を使うとどうなるか

```java
public Foo getFoo(int n) {}
```
上記のようなちゃんと型付けされた関数でも、nullが返ってくるかもしれないので返ってきた値をそのまま使うことはできません。
常にオブジェクトが、nullかそうじゃないかを意識してプログラミングする必要があります。
→ 面倒だし、よく忘れます。容易にバグが入り込みます。

ぬるぽが起きた時、null参照がどこから渡ってきたか追跡するの大変です。
安易にどんな型にでもなれる型を返すのはやめましょう。

*nullを使うのは安易にキャストしまくるプログラミングと同じです*

### Java における一般的なプログラミング
```java
User user = list.getUser();
if (user != null) {
    name = user.getName();
    if (name != null) {
    // 何かしらの処理
    }
}

// こんな辛いプログラミングはもういやだ。
```

## 解決手法
### null object
マーチン・ファウラーのリファクタリングが詳しいです。

nullの代わりに、オブジェクトとして表現する。
あるインターフェースに対して、未定義なことを表すオブジェクトを実装します。

デメリットはとにかく面倒くさい。

### Maybe (Option) 型
関数型言語で一般的に使われる手法です。

```haskell
data Maybe a = Nothing | Just a
```

Maybe型は、失敗するかもしれないということを表す型です。
Maybe が付いている場合は値がない可能性があると静的に理解でき、Maybe を外してさえしまえば以降はただの値として扱えます。

私的にはこれがお手軽でオススメです。(Java 8 からは Optional としてありますが、Android開発では使えないです。)
FluentdでMySQLの日付をElasticsearchの@timestampに使う


# 目的

MySQLのデータをFluentdを使ってElasticsearchに流し込むとき、logstash形式にして@timestampにMySQL内の日付データを使う。

(DBに格納しているログイン履歴を、そのままKibanaでも見えるようにしたいなーというのが要件)

# 使うもの

* https://github.com/uken/fluent-plugin-elasticsearch
* https://github.com/y-ken/fluent-plugin-mysql-replicator
 * インストールでつまづいたが、gem install mysql を単体で先に実行することで回避。
 * [MySQLテーブルへの更新/削除イベントを逐次取得するFluentdプラグイン「fluent-plugin-mysql-replicator」をリリースしました](http://y-ken.hatenablog.com/entry/fluent-plugin-mysql-replicator-has-released) が役に立つ。

# 状況

* MySQL
 * Host: localhost
 * User: dbuser
 * Password: dbpass
 * Database: testdb
 * Table: history
 * Schema: この中の loginTime を @timestamp として使いたい

| Field      | Type         |
|:-----------|-------------:|
| login      | varchar(255) |
| userId     | bigint(20)   |
| loginTime  | datetime     |
| sessionId  | varchar(255) |

* Elasticsearch
 * Host: localhost
 * Port: 9200

# 設定ファイル

```
<source>
  type mysql_replicator
  host localhost
  username dbuser
  password dbpass
  database testdb
  query SELECT login,userId,loginTime,sessionId,DATE_FORMAT(loginTime, '%Y-%m-%dT%k:%i:%s+09:00') as "@timestamp" FROM history WHERE DATE_ADD(loginTime, INTERVAL 1 MINUTE) > NOW();
  primary_key sessionId
  interval 1m
  enable_delete no
  tag replicator.testdb.history.${event}
</source>
```

* [README](https://github.com/uken/fluent-plugin-elasticsearch/blob/master/README.md) には、```"@timestamp":"2014-04-07T000:00:00-00:00"```
や```"@timstamp": "2014-12-19T08:01:03Z"```
などの表記があるが、```DATE_FORMAT(loginTime, '%Y-%m-%dT%k:%i:%s+09:00')``` で動いてくれた。(```'%Y-%m-%dT%k:%i:%sZ'```は動かず。)

```
<match replicator.**>
  type copy
  <store>
    type_name dbsync
    type elasticsearch
    include_tag_key true
    tag_key @log_name
    host localhost
    port 9200
    logstash_format true
  </store>
  <store>
    type file
    path /tmp/login_history
  </store>
</match>
```

# 動作確認

1. td-agent を再起動する
2. Kibana でDBのデータが見える

```
{
  "_index": "logstash-2015.02.16",
  "_type": "dbsync",
  "_id": "iXONkf2-SWWbYXN7ZngtdQ",
  "_score": null,
  "_source": {
    "login": "TEST_LOGIN",
    "userId": 123,
    "loginTime": "2015-02-16 16:02:01 +0900",
    "sessionId": "ab533450625c7e849272fea658426545",
    "@timestamp": "2015-02-16T16:02:01+09:00",
    "@log_name": "replicator.testdb.history.insert"
  },
  "sort": [
    1424070121000,
    1424070121000
  ]
}
```
YosemiteのNative JavaScriptでHello Worldしてみた



```hello.js
#!/usr/bin/osascript
console.log("hello World!");
```

実行結果

```
$ chmod 0755 hello.js
$ ./hello.js
hello world!

```

ステキ!!
shebangも使える!!

従来bashやperlなどで書いていたスクリプトをJSで置き換える日が来るかも？

WindowsのWSHが懐かしい...(遠い目

あ、そしてJavaScriptでCGIが書けるかもしれない・・・！
Adobe AIRのAndroidパッケージ名から「air.」を消す方法

Window環境基準

[システムの詳細] → [詳細設定]タブの[環境変数] → [システム環境変数]の[新規]

変数名：AIR_NOANDROIDFLAIR 
変数値：true


![no_air.JPG](https://qiita-image-store.s3.amazonaws.com/0/57054/59dda679-b096-3ac0-4c51-cd42ca630f95.jpeg)
さくらクラウドでLVMのディスク拡張

#LVMについて

>LVM（logical volume manager）とは、複数のハード・ディスクやパーティションにまたがった記憶領域を一つの論理的なディスクとして扱うことのできるディスク管理機能。

引用元：[Linuxキーワード - LVM とは：ITpro](http://itpro.nikkeibp.co.jp/article/Keyword/20071012/284413/)


LVMでは、下記のような単位でディスクを管理している。

- PE：物理エクステント
- PV：物理ボリューム
- VG：ボリューム・グループ
- LV：論理ボリューム

参考：[Pantora Networks » 1章 LVM入門](http://pantora.net/pages/linux/lvm/1)
　

#LVMのディスク拡張方法
##＊事前作業＊
下記作業が既に終了しているものとする。

- サーバーに既存のディスクと拡張ディスクを接続する

[resize2fsでディスク容量を拡張する - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/925/)
　

##＊ディスク追加作業＊
###1. PVの作成

下記コマンドで、PVを作成する。

```
pvcreate <ディスク名>
```

※指定したディスクに存在する全てのデータが削除される。<br>
※[rawデバイス](http://itpro.nikkeibp.co.jp/word/page/10003350/)として指定する必要がある。

参考1：[Pantora Networks » 2章 LVM操作 基本編](http://pantora.net/pages/linux/lvm/2/)
参考2：[日本HP - はじめてのHP-UX 第11回：LVMによるディスクボリューム管理・その2 -Pantora Networks-](http://h50146.www5.hp.com/products/software/oe/hpux/developer/column/beg_integrity_11/)
　

###2. VGを確認する
既存VGに追加する前に、既存VGの名称を確認する。(VGの一覧表示)

```
vgs
```
参考：[vgs,vgdisplayでボリュームグループの確認 - OpenGroove](http://open-groove.net/linux/vgs-vgcreate/)
　

###3. VGを拡張する

1で作成したPVを既存VGに関連付ける

```
vgextend <既存VG名> <ディスク名(1.で使用したものと同じ)>
```

参考：[LVMボリュームの拡張・縮小 - GreenLeaf](http://greenleaf.sakuraweb.com/index.php?LVM%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%81%AE%E6%8B%A1%E5%BC%B5%E3%83%BB%E7%B8%AE%E5%B0%8F)
　

###4. LVを拡張する
LVを拡張する。LVのパスは<b>lvdisplay</b>で調べられる。

```
lvextend -l +100%FREE <lv名>
```

参考1：[lvextend | 彼方此方](http://www.ys-network.info/?tag=lvextend)
参考2：[LVM上のファイルシステム(ext3)を拡張する＠Debian Lenny - sakurako_sの日記](http://d.hatena.ne.jp/sakurako_s/20110414/1302721373)
　

###5. ファイルシステムを拡張する
ファイルシステムを拡張する。

```
resize2fs <lv名>
```

参考：[resize2fs - システム管理コマンドの説明 - Linux コマンド集 一覧表](http://kazmax.zpp.jp/cmd/r/resize2fs.8.html)
　

###＊追記＊
KVMの場合は下記URLを参考に実施。(ほぼLVMと手順は同じ)

- バックアップについて：[KVMにおけるゲストOSのバックアップ/リストア - OSSでLinuxサーバ構築](http://www.oss-d.net/virt/kvm/backup)
- ホストOSでの仮想ディスクの拡張について：[KVMの仮想ディスクを拡張する方法 - Qiita](http://qiita.com/nouphet/items/fea026c03ca86ec54111)
- ゲストOSのディスク拡張手順：[KVMのゲストOSのディスク容量を増設・拡張する方法 | KumanBlog](http://b.ruyaka.com/2014/05/08/kvm-guest-os-increase-disc/)
Macでembulkを使う（セットアップ編）


Treasure Dataからembulkが発表されましたが、`dt`コマンドの様に`embulk`コマンドを実装出来ないかと思って設定してみました。

### embulkのjarファイルをダウンロード

```bash
$ sudo mkdir /opt/embulk /opt/embulk/lib
$ sudo wget https://bintray.com/artifact/download/embulk/maven/embulk-0.4.0.jar -O /opt/embulk/lib/embulk.jar
```

### シンボリックリンクをはる

embulk.jarに実行権限をつけてPATHを通す。

```bash
$ sudo chmod 755 /opt/embulk/lib/embulk.jar
$ sudo ln -s /opt/embulk/lib/embulk.jar /usr/bin/embulk
```

確認してみると、

```bash
$ embulk --version

embulk 0.4.0
```

こんな感じ。
Objects::nonNullを使おう


stream処理でnullをフィルターする処理を書くと以下のようになりますが、

```java

Arrays.asList("aa", null, "bb")
	.stream()
	.filter(s -> s != null)
	.collect(Collectors.joining("\n"))); // aa\nbb

```

ObejctsクラスのnonNullを使うとほんの少しスマートに書けます。

```java

Arrays.asList("aa", null, "bb")
	.stream()
	.filter(Objects::nonNull)
	.collect(Collectors.joining("\n"))); // aa\nbb

```

Objectsは他にもtoString(obj)等、nullセーフなメソッドが幾つか揃っているので地味に便利ですね。

ちなみにkotlinだとこんな感じ。もうkotlinでいいような。

```kotlin
arrayListOf("aa", null, "bb")
          .filterNotNull()
          .joinToString("\n")
```
grunt-contrib-connectでGZip対応

## あらすじ

1. cssとかjsをGZip化したいぜ～
2. grunt-contrib-compressでGZip生成できたぜ～
3. grunt-contrib-connectで、1のcssとjsを読み込んだhtml閲覧してみるぜ～
4. gzipが読み込まれないぜよ？！

ってなことがありまして。

grunt-contrib-connectのoptionをアレコレ調べましたら、なんかGZip対応できたっぽいのでソースさらしておきます。

## 環境

* OS: Windows7
* Node.js: v0.10.8
* grunt-contrib-connect: v0.9.0  
バージョンが古いと引数middlewaresの情報がわたってこないので注意。

## その他注意

* ※GZipファイルを生成する際、.gzの前にファイルの拡張子を残しておくことが前提となります。その拡張子でContent-typeを割り当ててるので。
* ※そもそもブラウザがGZipファイル対応している場合に限ります。

```
module.exports = function(grunt) {
    var compression = require('compression');

    grunt.initConfig({
        connect: {
            options: {
                port: 8000,    //ここはご自由に
                hostname: '*', //ここはご自由に
                middleware: function(connect, options, middlewares) {

                    // gzip対応
                    // Content-typeの振り分けは、リクエストURL名から判定
                    function gzipFilter(req, res) {
                        var url = req.url;

                        // リクエストURLに.jz.gzが含まれる場合
                        if (url.indexOf('.js.gz') > -1) {
                            res.setHeader('Content-Encoding', 'gzip');
                            res.setHeader('Content-Type', 'text/javascript');
                        // リクエストURLに.css.gzが含まれる場合
                        } else if (url.indexOf('.css.gz') > -1) {
                            res.setHeader('Content-Encoding', 'gzip');
                            res.setHeader('Content-Type', 'text/css');
                        // リクエストURLに.html.gzが含まれる場合
                        } else if (url.indexOf('.html.gz') > -1) {
                            res.setHeader('Content-Encoding', 'gzip');
                            res.setHeader('Content-Type', 'text/html');
                        }

                        if (req.headers['Content-Encoding'] === 'gzip') {
                            return compression.filter(req, res);
                        } else {
                            return false;
                        }
                    }

                    middlewares.unshift(
                        compression({filter: gzipFilter})
                    );

                    return middlewares;
                }
            },

            //ここはご自由に
            hoge: {
                options: {
                    base: './hoge_root'
                }
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-connect');
    grunt.registerTask('default', ['connect:hoge']);
};
```

でも、livereloadと同時に使うことができませんでした。なんぞ。。。

当方、サーバーサイドの知識に明るくないので、お問い合わせもらっても答えられない気がします。。  
動いた一例として参考にしていただければと。。。m(_ _)m

## 参考URL

* https://github.com/gruntjs/grunt-contrib-connect
* https://github.com/gruntjs/grunt-contrib-connect/issues/77
* http://stackoverflow.com/questions/27964209/applying-gzip-compression-to-files-served-by-grunt-contrib-connect
* http://qiita.com/pirosikick/items/cadd77e85408e863b27e
OSXのアプリケーションをJavaScriptで作る


Yosemiteから出来るようになったらしいので作ってみます。

早速ソースです。

```javascript:win.js
// Generated by CoffeeScript 1.9.0
(function() {
  var win;

  ObjC["import"]('Cocoa');

  win = $.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer($.NSMakeRect(0, 0, 160, 90), $.NSTitledWindowMask | $.NSMiniaturizableWindowMask | $.NSClosableWindowMask, $.NSBackingStoreBuffered, false);

  win.title = 'my win';

  win.center;

  win.makeKeyAndOrderFront(win);

}).call(this);
```

`ObjC["import"]('Cocoa');`でCocoaフレームワークをインポートして`$.NSWindow`でウインドウを作ってます。

`osacompile -s -l JavaScript -o win.app win.js`
とコマンドをうてばwin.appが作られるのでopen win.appで実行出来ます。

![スクリーンショット 2015-02-16 14.18.52.png](https://qiita-image-store.s3.amazonaws.com/0/54292/7b7d492f-6f9e-1e3b-6ae7-8caa27dbbdcc.png "スクリーンショット 2015-02-16 14.18.52.png")

上の例ではosacompileに-sを渡すことでウインドウを作るだけで完結した、実行できるアプリケーションを生成してます。ところが
`osascript win.js`
として実行した場合、実行はされるものの、プログラムはすぐに終了してしまいます。

そこで次の例ではosascriptコマンドでも動くよう改善をしました。


```javascript:win2.js
// Generated by CoffeeScript 1.9.0
(function() {
  var app, win;

  ObjC["import"]('Cocoa');

  ObjC.registerSubclass({
    name: 'WinDelegate',
    superclass: 'NSObject',
    protocols: ['NSWindowDelegate'],
    methods: {
      'windowWillClose:': {
        types: ['void', ['id']],
        implementation: function(notification) {
          return app.terminate(0);
        }
      }
    }
  });

  win = $.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer($.NSMakeRect(0, 0, 160, 90), $.NSTitledWindowMask | $.NSMiniaturizableWindowMask | $.NSClosableWindowMask, $.NSBackingStoreBuffered, false);

  win.delegate = $.WinDelegate.alloc.init;

  win.title = 'my win2';

  win.center;

  win.makeKeyAndOrderFront(win);

  app = $.NSApplication.sharedApplication;

  app.setActivationPolicy($.NSApplicationActivationPolicyRegular);

  app.activateIgnoringOtherApps(true);

  app.run();

}).call(this);
```

$.NSApplicationを自前で用意して、ウインドウのクローズに合わせてterminateするようにしています。この際のwindowWillCloseメッセージを取り扱うために、ObjC.registerSubclassを使っています。

`osascript win2.js`とすれば先ほどのようなウインドウが現れ、クローズボタンでの終了が確認できると思います。

ソース一式:
https://github.com/ymmtmdk/osx-app-js

参考：
https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/index.html
http://tylergaw.com/articles/building-osx-apps-with-js
http://qiita.com/zakuroishikuro/items/1b02378bf9e940602d87
[Mysql]db:migrate時にadd_indexで失敗するとハマる

# MysqlとPostgreSQLの意外な機能差

MysqlとPostgreSQLってどっちもオープンソースだし似たようなもんでしょ、と思っていたんだけど、体感できる差を知ってしまった。

Mysqlでは、トランザクションの最中にcreate indexしようとすると、その時点でcommitしてしまってトランザクションじゃなくなってしまう。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.4.3 暗黙のコミットを引き起こすステートメント : http://ftp.nchu.edu.tw/MySQL/doc/refman/5.1/ja/implicit-commit.html

PostgreSQLはちゃんと処理してくれるらしい。
Transactional DDL in PostgreSQL: A Competitive Analysis - PostgreSQL wiki : https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis

MySQLでTruncateはRollback出来るのか？ | SRIA BLOG : http://www.sria.co.jp/blog/2014/08/mysql-can-do-rollback-truncate/

railsだと、下記のようなケースでこの差が顕在化する

# add_indexのミス

Migrationを書くときに、

```rb
class CreateActionLogs < ActiveRecord::Migration
  def change
    create_table :action_logs do |t|
      t.integer :user_id
      t.string :log_type
      t.timestamps
    end
    add_index :action_logs, [:log_type, :log_type], length:64
  end
end
```

みたいなコードを書いたんだけど、このadd_indexの書き方はMysqlだと通らない(sqliteだと通る)
これをうっかり実行した結果、add_indexでエラーになってmigrationがとまってしまった。

mysqlでは、add_indexの手前のcreate tableの時点でコミットが行われてしまうけど、migration全体としては失敗しているので、rails的にはこのマイグレーションは実行していないものと認識される。
でも実際にはaction_logsテーブルはすでに作成されているので、add_index部分を直してdb:migrateしてもtable already existsでエラーになってしまう。
逆に、db:rollbackでaction_logsテーブルを削除しようとしても、まだ実行されていないマイグレーションと認識されるので、rollbackしてもらうことも出来ない。ハマり状態。

これがPostgreSQLだと、create tableも含めてトランザクション(DDLトランザクション)でひとまとめに扱ってくれるので、add_indexが失敗した時も、全部ロールバックしてくれるらしい。へー。

# 脱出方法

ちなみにこのハマり現象は、migrationファイルを一時的に書き換えてmigrateを通したあと、元に戻してrollback→migrateして正しい状態に戻すことが出来た。

```rb
class CreateActionLogs < ActiveRecord::Migration
  def change
#     いったんコメントアウトした状態でmigrateする
#    create_table :action_logs do |t|
#      t.integer :user_id
#      t.string :log_type
#      t.timestamps
#    end
    add_index :action_logs, [:log_type, :log_type], length:64
  end
end
```

railsのみんながMysqlじゃなくてPostgreSQLをすすめるのはこのへんに理由があるのかな。
Arquillian+Glassfish Embedded Containerでは、ConversationScopedなbeanをインジェクトできない！？

# 環境 #

 * JDK 1.8.0 u31 (x64)
 * NetBeans IDE 8.0.2
 * Arquillian core 1.1.7.Final
 * Arquillian Glassfish container 1.0.0.CR4

# ソース #

こんな風にConversationScopedをつけたクラスを用意しました。

```java:MyBean.java
@ConversationScoped
public class MyBean implements Serializable {
  // (略)
}
```

上記クラスをテストするためのクラスを用意しました。

```java:MyBeanTest.java
@RunWith(Arqullian.class)
public class MyBeanTest {
    @Deployment
    public static Archive<?> createDeployment() {
        return ShrinkWrap.create(WebArchive.class).addClass(MyBean.class);
    }

    @Inject
    private MyBean myBean;
    // (略)
}

```

# 結果 #

テストを実行すると、MyBeanをインジェクトできなくて失敗します。

```text:
Caused by: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001408: Unsatisfied dependencies for type MyBean with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private MyBeanTest.instance
  at MyBeanTest.instance(MyBeanTest.java:0)
```

# 考察 #

こんなコードを付け加えてBeanManagerに取り扱ってもらえているかどうか確認すると、```MyBean```は入っていません。

```java:
BeanManager bm = CDI.current().getBeanManager();
Set<Bean<?>> beans = bm.getBeans(Object.class, new AnnotationLiteral<Any>(){});
for (Bean<?> bean:beans) {
    System.out.println(bean.getBeanClass().getName());
}
```

ConversationScopedではなく、ApplicationScopedやRequestScopedなどではちゃんとインジェクトできます。

何か追加で書かないといけないコードがあるのかもしれません。
Sass で 設定無しで RGB 出力する簡単な方法

## はじめに

普通は色の出力はSassに任せていれば問題ないんですが、
JavaScriptでrgbを操作するときに、
sassで書いてコンパイルしたcssの色指定が色名や16進になるので困りました。

そこでRGB出力を強制しようとしてちょっと迷ったので、メモします。

これが一番簡単だと思ったんですが、Sassの色指定のメリットが生かしきれないので、簡単でいい方法があったら教えてください。

## どうやるか

当たり前ですが、rgbの指定を```#{" "}```で囲むだけです。

## 例

Sass(scssじゃない)の例です。

### コンパイル前

```sass
body
  /* 普通の指定 */
  color: rgb(255, 255, 255)
  /* 記述した通りに出力させる */
  color: #{"rgb(255, 255, 255)"}
```

### コンパイル後

```css
body {
  /* 普通の指定 */
  color: white;
  /* 記述した通りに出力させる */
  color: rgb(255, 255, 255); }
```
[swift]RGB値でUIColorを作成するextension

swiftのUIColorがデフォルトでは0~1.0の値をしてしてインスタンスを作成する仕様になっていて、微妙に使いづらいなと思ったので作った。
ついでにextensionにアプリでよく使う色を定義すると使いやすい。

``` UIColorExtension.swift
import UIKit

extension UIColor {
    class func rgb(#r: Int, g: Int, b: Int, alpha: CGFloat) -> UIColor{
        return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: alpha)
    }
    class func MainColor() -> UIColor {
        return UIColor.rgb(r: 24, g: 135, b: 208, alpha: 1.0)
    }
}
```