OmniAICreator/Qiita-1.07M huggingface dataset:
python3x: ternary operators、if-elif-elseを一文で

<a href="http://cs61a.org/hw/hw02/#q3" target="_blank">宿題</a>をやっていたら`ternary operator`という概念にぶつかる。pythonらしいユニークな考え方だなと思ったので備忘録として書いておきます。どうせこういうの複雑にしてテストに出してくると思うので。

#ternary operatorとは

一言でいうと「`if else`を使って一行でexpressionを書くことが出来る」テクニック的なもの（一応operator）。statementの中では使えずexpressionの中でしか使えないという規制がある上にpython上の全てのoperatorの中で一番低い優先順位を持っているという特徴があるがそれを除けば中々ハンディーなテクニックだと思う。

>
_The expression x if C else y first evaluates the condition, C rather than x. If C is true, x is evaluated and its value is returned; otherwise, y is evaluated and its value is returned._

もっと砕いた言い方をすると:

```
if test(some value):
    return a
else:
    return b
```

を`ternary operator`を使って書き直すと

`a if test else b`

`a`が`when test == True`で`b`が`else`になる感じ。

#ちょっとした応用(w/ elif)

そこで「`elif`は使えないの？」と思う方もいるだろう。答えはイエスだ。ただコードが複雑になってくると読みにくくなることからあまり好まれてなさそうだ。

```
>>> i=100
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
0
>>> i=101
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
2
>>> i=99
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
1
```

`elif`を使わずに最初の一文の`else`から更にもう一つ`if/else`をくっつけて枝を増やしていくイメージだ。そのため一般化すると`x if test(some_value) else y if test2(some_value) else z`となる。無理矢理if statementの形に戻すとこんな感じだろうか。~~正直あたっている自信はないのであまり参考にし過ぎないように。。~~:

```
if test(some_value):
    return x
else:
    if test2(some_value):
        return y
    else:
        return z
```

要は必要な数に応じて`else`を足していけばいいのだ。


#参考にしたリンク

- [Does Python have a ternary conditional operator?](http://stackoverflow.com/questions/394809/does-python-have-a-ternary-conditional-operator)
- [Python putting an if-elif-else statement on one line](http://stackoverflow.com/questions/14029245/python-putting-an-if-elif-else-statement-on-one-line)
- [Conditional expressions](https://docs.python.org/3.4/reference/expressions.html#conditional-expressions)
MacにHomeBrewをインストールしよう。

##HomeBrewのサイトを確認
googleでHomeBrewで検索すれば出てきます。
アドレスはhttp://brew.sh/index_ja.html

![スクリーンショット 2016-02-16 11.57.23.png](https://qiita-image-store.s3.amazonaws.com/0/57916/0a449c59-6f0a-698a-b28c-f02923bf7afa.png)

ターミナルを起動し、インストール部分に書いてあるスクリプトをコピペしEnterキーを押します。

しかし

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
You have not agreed to the Xcode license.
Before running the installer again please agree to the license by opening
Xcode.app or running:
    sudo xcodebuild -license
```

と言われるのでxcodebuildライセンスに同意しないといけないので。
`sudo xcodebuild -license`をターミナルで実行さ同意する。

そのあと、インストールのスクリプトを実行させるとインストールされる。
gitconfigで何のエイリアスを設定していたかを確認するエイリアス


「あれいいな」、「これいいな」とgitconfigにエイリアスをあれこれ設定していくと、「あれ、なんのエイリアス設定していたっけ？」ってなることがたまにあります。
そうなった時に、

```bash:
less ~/.gitconfig
```

として見に行くのも手なのですが、せっかくなのでエイリアスを確認するエイリアスを用意します。笑

## エイリアスを設定する

.gitconfigを開いて、[alias]の項目に、以下を追加します。

```bash:
aliases = !git config --get-regexp alias | grep -v aliases | sed 's/^alias.//g' | sed 's/ / = /1' | sort
```

コマンドラインから追加するばあいは、

```bash:globalに設定するばあいは--globalを付け忘れずに!
git config --global alias.aliases "\!git config --get-regexp alias | grep -v aliases | sed 's/^alias.//g' | sed 's/ / = /1 | sort'"
```

とします。


これで、

```bash:
git aliases
```

と入力したときに、

```bash：output
co = checkout
pu = push
st = status -sb
```

のように表示することができます。
設定しておいても損はないので是非！

## ちなみに

```bash:output
!git config --get-regexp alias
```

でもエイリアスの表示としては十分なのですが、

```bash:output
alias.co checkout
alias.st status -sb
alias.pu push
```

といった感じで"alias."が付くのと、どこからが実部分なのか分かりづらいので、若干整形しています。
c++ builder / FastReport > page header / footer の追加

```txt:動作確認
C++ Builder XE4
FastReport v5.3 (XE4標準からアップデート済み)
```

FastReportでページヘッダ、フッターを追加する方法の整理。

[FastReport 4 User's Manual](https://www.fast-report.com/documentation/UserMan/index.html?bands_in_fastreport.htm)

によると「バンド」というものを使うようだ。

FastReportにてfr3ファイルを開いている状態で、左メニューの「バンドの挿入」(行の挿入のイメージのアイコン）にて以下のようにメニューがあった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/86a42c27-c5f6-f0ca-0f9f-cf03cf7e90ef.png)
CentOSのMySQLを5.1から5.6へupgrade

色々躓いたのでメモ

1.MySQL停止
> $ sudo /etc/init.d/mysqld stop

2.リポジトリ更新
>$ wget http://dl.iuscommunity.org/pub/ius/stable/CentOS/6/i386/ius-release-1.0-14.ius.centos6.noarch.rpm
>$ wget http://dl.iuscommunity.org/pub/ius/stable/CentOS/6/i386/epel-release-6-5.noarch.rpm
>$ rpm -Uvh ius-release-1.0-14.ius.centos6.noarch.rpm
>$ rpm -Uvh epel-release-6-5.noarch.rpm

3.更新確認
>$ rpm -qa|grep ius-release
>ius-release-1.0-13.ius.centos6.noarch
>$ rpm -qa|grep epel-release
>epel-release-6-8.noarch

4.今あるのを消す
一覧表示して…
>$ rpm -qa | grep mysql | sort

yum removeで消す。

5.version確認
> $ mysql --version

5.6になってるかどうかチェック

6.mysqldをスタート
> $/etc/init.d/mysqld start

ここでコケた。

ログ（/var/log/mysqld.log）に"INNO DBが云々～"
>  [ERROR] InnoDB: auto-extending data file ./ibdata1 is of a different size
640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant
if non-zero) pages!

7.InnoDBをどかす
> $ cd /var/lib/mysql
> $ mv ibdata1 ibdata1_bk

8.再度起動
> $/etc/init.d/mysqld start

またコケた。

ログにib_logfileが開けないとあるので

8.ib_logfileもどかす。
> $ cd /var/lib/mysql
> $ mv ib_logfile1 ib_logfile1_bk
> $ mv ib_logfile101 ib_logfile101

なぜか101というのもあるのでついでにどかす

9.再度起動
> $/etc/init.d/mysqld start

でOK。
新規に追加したファイルを出す方法

#必要な人
改修PJを行っていて、報告書を書く時に「新規に作成したファイル一覧」を書かなくては行けない場合の人

#条件
gitでソースファイルを管理していること

#やり方
## 条件
期間：2016/01/01 〜 2016/02/16
ファイル種類：javaファイル
testファイルは除きたい。

```
git log --after="2016-01-01 00:00:00" --before="2016-02-16 23:59:59" --name-status | grep "^A.*.java$" | grep -v "\/test\/"
```

毎回「新規に作成したファイル一覧」を報告書に書くたび、毎回調べているので備忘録として。
mysql rootのパスワードを忘れてしまったら

参考記事
[mysqlのリファレンス](http://dev.mysql.com/doc/)

エラー内容は以下のような感じになるとおもいます。
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

## 1.mysql serverの停止
`mysql.server stop`

MySQLサーバの起動と停止
`mysql.server start
mysql.server stop`

プロセスの確認
`ps ax | grep mysql`
ここで止まってなかったら、killコマンドでとめます。

プロセス停止
kill (PID)
プロセス強制停止
kill -9 (PID)
(-9)は送信するシグナルの指定
9 もしくは SIGKILL を指定

## 2.mysql_safeで起動
`mysqld_safe --skip-grant-tables`

[--skip-grant-tablesコマンドについて](https://dev.mysql.com/doc/refman/5.6/ja/server-options.html)
>通常の起動では、サーバーは mysql.plugins システム変数を読み取ることによって、ロードするプラグインを判別します。サーバーが --skip-grant-tables オプションで起動された場合、サーバーは mysql.plugins テーブルを参照せず、そこにリストされているプラグインをロードしません。--plugin-load により、--skip-grant-tables が指定されている場合でもプラグインのロードを可能にします。--plugin-load は、プラグインを実行時にロードできない構成で、プラグインを起動時にロードできるようにします。

## 3.rootユーザーでログイン
`mysql -u root`

## 4.パスワードの再設定
`use mysql;`
`update user set password=PASSWORD("ここにパスワードを記述") where User='root';`
`flush privileges;`

## 5.mysqlサーバーの再起動
`mysql.server stop
mysql.server start`

以上でできました。

## おまけ
今回はpostgresで作っていて途中でmysqlに変更したのですが、
その際にdeviseのmigrateファイルでエラーがでました。

[devise/lib/generators/active_record/devise_generator.rb](https://github.com/plataformatec/devise/blob/dd5de829c944dd955e4b35074c60798c3ad4b947/lib/generators/active_record/devise_generator.rb)

```text:devise/lib/generators/active_record/devise_generator.rb
 ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.#{ip_column} :current_sign_in_ip # ここがエラーになった箇所です。
      t.#{ip_column} :last_sign_in_ip    # postgresではinet,mysqlではstringになるようです。

~中略

      def ip_column
        # Padded with spaces so it aligns nicely with the rest of the columns.
        "%-8s" % (inet? ? "inet" : "string")
      end

      def inet?
        postgresql?
      end

      def rails5?
        Rails.version.start_with? '5'
      end

      def postgresql?
        config = ActiveRecord::Base.configurations[Rails.env]
        config && config['adapter'] == 'postgresql'
      end

```
WebViewClient.onReceivedSslErrorのセキュリティアラートの対処法

#概要
GooglePlay DeveloperConsoleでアプリに含まれるWebViewのWebViewClient.onReceivedSslErrorのセキュリティアラートで怒られた時の対処法です。

##こんなアラート
実際のスクショです。
![スクリーンショット 2016-02-15 18.59.23.png](https://qiita-image-store.s3.amazonaws.com/0/34084/c6e325cd-6ff8-5531-4650-c0351e72ed14.png)

##アラートの内容
WebViewにてhttpsのページでサーバー証明書が正しくないページ(PCのChromeで「この接続ではプライバシーが保護されません」という表示が出るページ)を開こうとするときの挙動が実装されていないのが原因です。

##対処
まずGoogle Playから警告内容の詳細がメールで来ているはずなので内容を確認し該当クラスを明確にしましょう。

該当クラスが広告などのSDKの場合はSDKのアップデートで解決しないか確認しそれでも直らない場合は、SDKの制作元に確認しましょう。

該当クラスが自分で作成したクラスの中のWebviewだった場合には2パターンの対処法があります。
- onReceivedSslErrorのオーバライド削除する
    - 使っていないのであれば削除しましょう。
- ユーザーに確認してハンドリングする
    - 下に書きます。

##ユーザーに確認してハンドリングする方法

WebViewのWebViewClientのonReceivedSslErrorをオーバライドして実装します。
onReceivedSslErrorの中で開いていいページなら```handler.proceed();```をいけないページなら```handler.cancel();```を呼んであげます。
下記はDialogでページ遷移を確認する例です。


```java
 webView.setWebViewClient(new WebViewClient() {
           @Override
            public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setMessage("ssl証明書が正しくないページですが開いてもいいですか");
                builder.setPositiveButton("yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        handler.proceed();
                    }
                });
                builder.setNegativeButton("no", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        handler.cancel();
                    }
                });
                builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
                    @Override
                    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                            handler.cancel();
                            dialog.dismiss();
                            return true;
                        }
                        return false;
                    }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
            }
        });
```
Railsでunicornがforkするタイミング

Amazon Linux + Rails 4.2.3 + unicorn 4.9.0
`preload_app true`にしている環境。

unicornがどのタイミングでforkするのか知りたくてこんなログを仕込んでみた。
結果、`config/environments/development.rb`の読み込みよりは後だと分かった。
Railsがある程度の初期化を行った後でforkしているのだろうが、どうやって「Railsの初期化完了」を検知しているのだろうか。
誰か知っていたら教えて下さい。

```rb:config/environments/development.rb
Rails.application.configure do
  open("/path/to/log", "a") do |f|
    f.puts "in configure #{Time.now}"
  end
end
```

```rb:config/unicorn.rb
worker_processes 3

before_fork do |server, worker|
  open("/path/to/log", "a") do |f|
    f.puts "before_fork"
  end
end

after_fork do |server, worker|
  open("/path/to/log", "a") do |f|
    f.puts "after_fork"
  end
end
```

結果

```
in configure 2016-02-16 11:12:29 +0900
before_fork
before_fork
before_fork
after_fork
after_fork
after_fork
```

**[2016-02-17]**
straceしてみた。初めstraceログをforkで検索したところ見つからず。代わりにcloneがログに残っていた。
forkは内部でcloneを呼んでいる単なるglibcレベルのラッパーらしい。
http://thorstenball.com/blog/2014/06/13/where-did-fork-go/
さて、昨日仕込んでopen()のおかげで、before_forkが呼ばれた直後にcloneしていることはわかったが、まだ詳細は不明。
次はunicornのソースでpreload_appの周辺を調べてみよう。

**[2016-02-20]**
`build_app! if preload_app`のようにして`build_app!`を呼んでいる箇所がある。

```
  def build_app!
    if app.respond_to?(:arity) && app.arity == 0
      if defined?(Gem) && Gem.respond_to?(:refresh)
        logger.info "Refreshing Gem list"
        Gem.refresh
      end 
      self.app = app.call
    end 
  end
```

`app`の引数が0個ならば`app.call`で得られる別のオブジェクトを`app`に代入しなおしている。これによって初期化済みのRailsが返っているのだろうか。Rackの仕様では`call`の引数は`env`1個だと思っていたが、0個の場合とは何かで決まっているのだろうか。
El Catipan 10.11でAfloatを使えるようにする


初心者でもわかるよう回りくどく解説してますので、ご了承下さい。

##SIMBLを有効にする
以下のサイトを参考にSIMBLを有効にする

http://ikm.hatenablog.jp/entry/2015/10/15/054717

リカバリーモードを起動し、メニューのユーティリティーからターミナルを起動。
1〜5はつまずかずに行くと思います。
リカバリーモードの画面は普段見慣れない画面が表示されます。

6 Terminal.app等で次のようにコマンドを叩いてSIMBLを手動でインストールする

ターミナルを開きzipを解凍してできたディレクトリに移動。
例）Downloadsにzipを解凍した場合、「cd 」と入力し、Downloadsディレクトリをターミナルにドラッグしエンター。
後は参考サイトに習ってインストールしていきます。
※「$ 」は必要ありません。

SIMBLをインストールして有効にしたら次はAfloatをダウンロードします。

##Afloatをダウンロード
ダウンロードは以下のサイトを参考。

http://smcomemory.com/mac-app-2930


無事インストールできました。

##変更許可のダイヤログボックスを表示させない

「PlugSuit Agentが変更を加えようとしています。これを許可するには、パスワードを入力してください。」と出るようになり、パスワードを入力して1時間ぐらい経過すると何度も表示されます。

`/ライブラリ/PreferencePanes/PlugSuit.prefPane`を削除すればパスワードを要求されることはなくなりますが、
Afloatが効かなくなったときのために、バックアップをとっておきましょう。

##Afloatが効かなくなったら
急にAfloatが効かなくなってしまったら、

1.削除した`/ライブラリ/PreferencePanes/PlugSuit.prefPane`をもう一度元に戻します
2.`PlugSuit.prefPane`をダブルクリックして開き、左側に「Enable It」のボタンがあるので有効にします。
3.変更許可のダイヤログボックスを表示させないようにするため、`/ライブラリ/PreferencePanes/PlugSuit.prefPane`を削除。

##豆知識
command + control +マウスホイールで簡単にopacityを切り替えることができます。
【UnityAsset】Pixel3D ～夢をカタチに～

ドット絵にはロマンがある。クリエイター達の血と涙の結晶。
そんな**2Dのドット絵を3Dに変えられる**夢のAsset **[Pixel3D](https://www.assetstore.unity3d.com/jp/#!/content/34428)** を使ってみた！

![dekakabocha.png](https://qiita-image-store.s3.amazonaws.com/0/96554/949a8361-7c6d-4e96-a6b2-623cffa02850.png)
**[提供：ぴぽや倉庫](http://piposozai.wiki.fc2.com/wiki/%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%81%E3%83%83%E3%83%97)**

# 使い方
**[ドット絵が3Dに！](http://befool.co.jp/blog/ayumegu/unity-sutudy-Pixel3D/)**

上記参考に。とても簡単です。

- 空のGameObjectを作成(画像では Pixel3D という名前)
- Component->Scripts->Pixel3D->Sprite 3D を設定
- Component->Rendering->Sprite Renderer を設定
- Sprite Renderer に Sprite を設定

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/96554/b595e88b-bbf9-67bd-89a1-3d3d1d57df3e.png)

# 夢のカタチ
![mov.gif](https://qiita-image-store.s3.amazonaws.com/0/96554/4a946d01-b9a0-d685-b6a7-e6382d618f99.gif)

# 恵方巻き！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96554/598f50cd-dff4-0931-e376-2c9425f2a9fc.png)

Pixel Thicness をチートすれば恵方巻きだって作れちゃう。

# 最後に
SetPass が肥大化する傾向があるので、実利用には不向きだが、夢を実現したい方にはオススメ。
その先はあなた次第・・・。
icinga2

# [GitHub - jjethwa/icinga2](https://github.com/jjethwa/icinga2)

## 起動

```bash:起動
sudo docker run -p 3080:80 -t jordan/icinga2:latest
```

## icinga-web

* http://localhost:3080/icinga-web/
* root : password でログイン

![icinga-web.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1d067871-c0b8-178e-928f-4f106626a3de.png)

![icinga-web2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/757c8b9f-bbe6-8332-ecd3-f0caac8e62f6.png)

## icingaweb2

* http://localhost:3080/icingaweb2/authentication/login
* icingaadmin : icinga でログイン

![icingaweb2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/af238129-dbe2-b95a-470b-597dccb5f21d.png)

![icingaweb2-2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fe34fa19-75fa-a5df-f603-c7d62e712d03.png)
Homebrew-Cask を新システムにする(2015年12月現在)


以下を実行する。

```bash
brew uninstall --force brew-cask
brew update
```

# 理由

Homebrew-Cask は Homebrew とともに更新されるようになったから
出典:[GitHubのREADME.mdの最初(2016/02/16アクセス)](https://github.com/caskroom/homebrew-cask)
dockerで要らないimage全部消したい

# いろいろといじっていたら…
大量にいらないDockerイメージができてしまった…

消すのに使ったコマンドをメモ。

```bash
sudo docker rmi -f $(sudo docker images | awk '/^<none>/ { print $3 }')
```

# 同じくいろんなcontainerも作られちゃったので、
削除したい。

これもメモ。

```bash
sudo docker rm $(sudo docker ps -a -q)
```
Arduino M0でSerialUSBを使ってスケッチが動かないときに試すこと

# メモリ容量モリモリでお手頃、動作電源3.3VのArduino M0
![160125_arduino_ESP-WROOM-02_v2_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/209775e1-3b8f-2e9f-796c-677d4198cad9.jpeg)
[Arduino M0](http://www.arduino.org/products/boards/4-arduino-boards/arduino-m0)
Arduino UNOが一般的なので、なかなかArduino M0を使う方もいないと思います。私も最初はArduino UNOで完結しようと思っていたのですが、複数のライブラリを含めたスケッチを書き込もうとするとArduino UNOのメモリ容量では収まらず、スイッチサイエンスで値段も変わらないArduino M0に以降。しかし、情報が少ない、、、

# Arduino M0でのシリアル通信はSerialUSB
Arduino UNOは[Serial](https://www.arduino.cc/en/Reference/Serial)でシリアル通信します。それが普通だと思っていました。
が、Arduino M0ではSerialUSBを使うらしいです(個別のリファレンスページがない、、)。

# SerialUSBを使うとシリアルモニターを開いていないとスケッチ動かず？
記事「[Arduino・Milkcocoa・ESP-WROOM-02で明るさ監視](http://qiita.com/umi_kappa/items/fed4232c717e798ff620#comment-031e0844433791112843)」で[ESP-WROOM-02](http://espressif.com/en/products/wroom/)をArduino M0に接続してWi-Fiでインターネット接続していると、どうやらシリアルモニターを開いていないと処理が止まってしまいました。
スタンドアローンで動作させたいのに、、、詰んだか、、、と嘆いていると

# USBケーブルを抜いて外部電源化すると動いた
試しにそれまで接続していたUSBケーブルを抜いてACアダプターから外部電源を供給すると動きました。詳しい原因はつかめていませんが(ご存じの方がいらっしゃったらご教示いただきたく)、Arduino M0はスケッチを書き込むときに内部でUSBを切り替えているらしく、そのあたりが絡んでいるのかと。憶測です。

# まとめ
外部電源も3.3Vとちょっと取っつきにくいArduino M0。ですが、ハイスペックな上にジャイロセンサーやBluetoohモジュールが搭載されているかつお手頃な[Arduino 101](https://www.arduino.cc/en/Main/ArduinoBoard101)(IntelとArduinoが開発)が投入され、記事「[Intel Curie搭載のArduino 101（Genuino 101）発表、価格は30ドルで「理想的なArduino Unoの後継者」](http://japanese.engadget.com/2015/10/19/intel-curie-arduino-101-genuino-101-30-arduino-u/)」で「Arduino Unoの後継者」と言うほどなので、今後は3.3Vが標準になるかもしれません。憶測です。
javascriptのStringのsubstring slice substr

Stringオブジェクトのsubstringとsliceとsubstrはどれも文字列から指定した範囲で文字を切り出すメソッドだが、微妙な違いがある。


### 文字列の5文字目から7文字目を抜き出す。

#### substring

```js
var str = 'hogeほげーfugaふがー'
str.substring(4, 7)
//ほげー
```

#### slice

```js
var str = 'hogeほげーfugaふがー'
str.slice(4, 7)
//ほげー
```

#### substr

```js
var str = 'hogeほげーfugaふがー'
str.substr(4, 3)
//ほげー
```
  
  
---

substringとsliceは、

```
str.substring[slice](start, end)
```

と書く。(startはn + 1であることに注意)

substrは

```
str.substr(start, startから何文字切り取るか)
```

と書く。

こう見ると一見、substringとslice一緒やんーとなるかもしれない。しかし、この二つにも微妙な違いが存在する。

### start(第一引数) > end(第二引数) の時
第一引数の値が第二引数よりも大きくなった場合に違いがある。
#### substring

```js
var str = 'hogeほげーfugaふがー'
str.substring(7, 4)
//ほげー
```

#### slice

```js
var str = 'hogeほげーfugaふがー'
str.slice(7, 4)
//""
```

substringでは、start(第一引数) と end(第二引数)をひっくり返して処理する。
sliceでは、空文字を返す。


### end(第二引数)に負の値
end(第二引数)に負の値が入ったときの挙動も違う。
#### substring

```js
var str = 'hogeほげーfugaふがー'
str.substring(4, -7)
//hoge
```

#### slice

```js
var str = 'hogeほげーfugaふがー'
str.slice(4, -7)
//ほげー
```

substringでは、負の値は0にキャストされる。
そして先ほどの例で示したように、substringは、start(第一引数) > end(第二引数)だった場合にはひっくり返して処理するので、0から4文字目までを返す。

sliceでは、負の値はキャストされず、末尾から数える。
つまり、slice(4, -7)は、slice(4, 7)と同じになる。
slice(4, -4)ならば、slice(4, 10)と同じ。
(文字列の長さから引いた数と考えるとわかりやすいかも)
zshでtypoしたときのメッセージを可愛くする


```zsh
$ sl
zsh: command not found: sl
```

ｶﾜｲｸﾅｲ(´･ω･`)

zshではコマンドが無い場合`command_not_found_handler`でフック出来るっぽいので、`~/.zshrc`に下記を追加。

```.zshrc:.zshrc
function command_not_found_handler() {
  echo "(」・ω・)」うー！(／・ω・)／にゃー！→「$1」";
}
```

```zsh
$ sl
(」・ω・)」うー！(／・ω・)／にゃー！→「sl」
```
ｶﾜｲｲ(๑˃̵ᴗ˂̵)و

ちなみにbashでは`command_not_found_handle`でフックする。`r`いらない。

```.bashrc:.bashrc
function command_not_found_handle() {
  echo "(」・ω・)」うー！(／・ω・)／にゃー！→「$1」";
}
```

## 参考
http://cpplover.blogspot.jp/2015/05/blog-post_28.html
http://pgmot.hatenablog.com/entry/2015/06/01/125049
Anaconda 2.5 Release

# ニュース

Python科学技術計算ディストリビューションの[Anaconda](https://www.continuum.io/why-anaconda)の2.5がリリースされました。
[DEVELOPER BLOG](https://www.continuum.io/blog/developer-blog/anaconda-25-release-now-mkl-optimizations)によると、今まで有料版で提供されていたMKL(Intel Math Kernel Library)が無料版でも提供されるようになったようです。

どのくらい高速になったのか確認してみました。
これまでのOpenBLAS[^1]版とMKL版の[docker](https://hub.docker.com/r/tsutomu7/scientific-python/)を用意し、DigitalOceanの一番小さいやつで確認してみました。

[^1]: "conda install nomkl" とすれば OpenBLAS版になります。

2000×2000のランダムな行列の逆行列計算の時間を計ってみました。

```bash
$ docker run -it --rm tsutomu7/scientific-python python -m timeit -c \
         'import numpy as np; np.linalg.inv(np.random.rand(2000, 2000))'
10 loops, best of 3: 2.61 sec per loop

$ docker run -it --rm tsutomu7/scientific-python:mkl python -m timeit -c \
         'import numpy as np; np.linalg.inv(np.random.rand(2000, 2000))'
10 loops, best of 3: 1.61 sec per loop
```

40%ほど速くなったようです。

ちなみに、デフォルトで4コア並列実行可能です。4コアを超えて設定できないようです。

```py3:python
import mkl
mkl.get_max_threads()
>>>
4

mkl.set_num_threads(1)
mkl.get_max_threads()
>>>
1

mkl.set_num_threads(8)
mkl.get_max_threads()
>>>
4
```

以上
Mac版Sylpheedのショートカットキーバインドを変える

MacでSylpheed使ってるようなニッチに生きる人間には不要だとは思いますが、忘れて探すの大変だったので自分のためのメモ。

ちなみにSylpheedとはGTK+ベースのMUAです。
http://sylpheed.sraoss.jp/ja/

SSDにインストールしたubuntuで使ってた時には検索が激速で手放せなかったけど、Macではけっこうまたされる感じ。MacのSSDが遅いのか、OSXとの相性が悪いのか...


## 本題

```
~/Library/Application Support/Sylpheed/menurc
```

を修正すればOK
AWS Lambdaを使ってCircleCIのビルドを実行する

初心者が試しにやってるようなものなので、間違えている部分があったらコメントで教えていただけると大変うれしいです :bow:

***

基本は[[lambda] [middleman] [wercker] 静的ビルドサイトに足りない機能をLambdaで補ってみる - 予約投稿編 | 株式会社フーディソン エンジニアブログ](http://tech.foodison.jp/blog/2015/12/23/middleman-aws-lambda/)を参考にしつつ、AWS LambdaからCircleCIのAPIを叩き新しくビルドを実行させるようにしてみた。

参考記事の"3, 記事の予約投稿"のセクションでLambdaを使いwerckerのAPIを叩いているが、そのコードを参考にしつつCircleCI用に書きなおした。

ここで叩いているのはTrigger a new Build([CircleCIのドキュメント](https://circleci.com/docs/api#new-build))。

```js
var http = require('https');

// Valiables
var circleci_api_token = "<YOUR_CIRCLECI_API_TOKEN>";
var post_data = {};
var post_options = {
  hostname: 'circleci.com',
  port:     443,
  path:     '/api/v1/project/:username/:project/tree/:branch?circle-token=' + circleci_api_token,
  method:   'POST',
  headers: {
    'Content-Type':   'application/json'
  }
};

exports.handler = function(event, context) {
  // Set up the request
  var post_req = http.request(post_options, function(res) {
      res.setEncoding('utf8');
      res.on('data', function (chunk) {
          console.log('Response: ' + chunk);
          context.succeed();
      });
  });

  // Post the data
  post_req.write(JSON.stringify(post_data));
  post_req.end();
};
```

`circleci_api_token` のところと`path`の中身を適宜書き換える必要がある。
CircleCIのAPIトークンは[Account - CircleCI](https://circleci.com/account/api)で取得する。
DomXPathのinnerHTML

# タグ先のinnerHTMLを取出す
`
// HTMLとして取り出す
function getInnerHtml($node){
    $children = $node->childNodes;
    $html = '';
    foreach($children as $child){
        $html .= $node->ownerDocument->saveHTML($child);
    }
    return $html;
}
`

## XPath
### id="xxx"のタグ内にあるspan

`//*[@id=""]//span`
appleの証明書で、"この証明書の発行者が無効です。"エラーで、WWDRの証明書をDLしてもなおらない。

iphoneアプリの証明書エラーで、アプリが、いきなりアップできない！
という事象になり、半日がかりやって解決できたので、メモ。

http://qiita.com/koutalou/items/25903ead2b9ef26fa4d9
http://qiita.com/flat-8-kiki/items/6e4b258dba905ee73377
http://qiita.com/anchen/items/7febe30dc24aed0827c0

最初は上記記事を参考にWWDRという、普段使う証明書とは別の証明書がもんだいでできないのかな、、
とWWDRの証明書をDL、キーチェーンで確認。という作業をやっていたのですが、
WWDRをmember center からDLしてもエラーが消えず、

<img width="468" alt="スクリーンショット 2016-02-16 9.19.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/37406/b88f5eea-1898-c1bd-186e-a0e9436dfc35.png">



macを再起動、、でもダメ。

最新のWWDRをDLしてキーチェーンに登録した上で、新しくiPhone Distributionの証明書を、登録してもだめ。

macのファームウェア＆xcodeのアップデートをしてもだめ。

いったん、**ずっと必要だとおもっていた、WWDRの証明書自体を削除し。
DLせず、いつものiPhone Distributionの証明書をダウンロードして、秘密キーとセット**にしてみると、、
エラーが消えた！！！！！

え、、、

必須だと思っていた、↓これを消して普通にiphone distriution証明書を登録すればエラーが消えました。汗

<img width="468" alt="スクリーンショット 2016-02-16 9.19.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/37406/cf513041-0d86-0e74-cd80-d01f4d1ea152.png">
NginxのTCPロードバランサーを使ってdocker runのIPバインドで接続先の振り分けができない謎事象を無理矢理解決

## 環境
- AWS EC2
- ネットワークインタフェースを２つもっている

## 最初にやりたかったこと
同一マシン上にDockerで２つのRedisインスタンスを立ち上げ、
外部から接続するときに、IPでそのどちらに接続するかを決められるようにしたい。
(Dockerを使っていなければredis-serverのバインドIPを変えるだけ済む話し)

## docker runの-pで試してみる
どうやらdocker runの-pオプションでIPバインドできるらしいことがわかった。

そこで、一方のRedisインスタンスを
-p IP1:6379:6379
もう一方を
-p IP2:6379:6379
のようにして起動した。

これで解決かとおもいきや、IP2(セカンダリのプライベートIP)でredisに繋がらない。
ネットワークの知識が乏しいため、Dockerの問題なのか、AWSの問題なのかも切り分けができなかった。
（誰か同じような経験のある方がいたら教えてください・・・）

## NginxのTCPロードバランサーを使って無理矢理解決
もうわけがわからなかったため、NginxのTCPロードバランサーで切り分けることにしてみた。
TCPロードバランサーはNginxの比較的最近のバージョン(1.9あたり)から入った機能で、TCPレベルでのリバースプロキシを実装できる。

準備として、/etc/hostsに予めdocker inspectで取得したコンテナのIPを設定しておく。

```text:etc/hosts
～
172.17.1.10  redis1
172.17.1.11  redis2
```

Nginxはこんな感じの設定。

```text:nginx.conf
stream {
        upstream stream_redis1 {
                server redis1:6379;
        }

        upstream stream_redis2 {
                server redis2:6379;
        }

        server {
                listen (IP1):6379;
                proxy_pass stream_redis1;
        }
        server {
                listen (IP2):6379;
                proxy_pass stream_redis2;
        }
}
```

これらの設定を行うとどちらのIPにも正しく接続するようにできた。
コンテナのIPが変わるたびに/etc/hostsを編集しないといけないのがダサすぎるという問題はあるものの、
とりあえずIPバインドによる接続の振り分けを実現することができた。

これで解決したということは、docker -pでうまくいかなかったのはDockerの問題である可能性が高いと思われるが
原因はさっぱりわからないままだ。

詳しい人がいたらぜひ教えてくださいm(__)m
5分で終わらせるCentOS7のfirewalld設定

CentOS7からファイアウォールの設定が「iptables」から「firewalld」に変更となりました。5分でfirewalldの設定を完了するための方法です。

# firewalldの開始と停止
```shell-session:firewalldの開始、終了、ステータス
# status
systemctl status firewalld

# start
systemctl start firewalld

# stop
systemctl stop firewalld
```

# mysqlとsshからの通信を許可する設定例

```shell-session:firewalldの設定変更
# 有効な設定を確認
>>> firewall-cmd --list-services --zone=public  --permanent     
dhcpv6-client

# 設定追加(sshとmysqlを追加)
firewall-cmd --add-service=ssh --zone=public --permanent
firewall-cmd --add-service=mysql --zone=public --permanent

# 設定削除(sshを削除)
firewall-cmd --remove-service=ssh --zone=public --permanent

# 設定一覧を表示
ls -lta /usr/lib/firewalld/services/

# 各設定毎の内容確認
cat /usr/lib/firewalld/services/ssh.xml

# 設定をカスタマイズする(ポート変更とか)
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
vi /etc/firewalld/services/ssh.xml
firewall-cmd --reload  # 設定反映

# 有効な設定を確認
>>> firewall-cmd --list-services --zone=public  --permanent     
dhcpv6-client mysql ssh

```

# 独自設定を追加
こちらのページが参考になりました。
[CentOS7のfirewalldをまじめに使うはじめの一歩（systemdも少し）](
http://qiita.com/shrkw/items/8410e9cb65eb789a40e1#%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A33-%E7%8B%AC%E8%87%AA%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B-rocket-)
PostgreSQLアンチパターン：運用DBのREINDEX


最新版マニュアル(9.4/9.5)では、親切に書いてあるんですが、ググったときに、9.3以前のページが真っ先に目に入るかもしれないし、担当しているサービスが9.3のままだからマニュアルも9.3しか見ないという人もいるかもしれない。

# B-tree の充填効率

生きてるTABLEについている INDEX の B-tree 各ページの充填率は、最密充填とはいきません。DELETEされたところ、UPDATEで値が変わったところが抜けていても、近いキー値でのINSERTがこないと、空いたところが埋まりません。
ページがあふれたときの新ページとの分割戦術と、その後に続いてINSERTされてくるキー値の変化傾向が合致しないと、スカスカのUnbalanced-treeになるケースもあります。ランダムケースなら、分割戦術50:50で全体充填率75%ですが、インクリメント傾向だったら、最後尾ばかりが分割していき全体充填率50%ということになります。

# B-tree 再構築

充填効率は悪くても、キー順に並んではいるので、第1ページの空いてるところに、第2ページ以降から順序保存したまま詰められるだけ詰めて、という前へならえコンパクションを最後まで全部やりきれば、最密充填の B-treeに再構成できます。

ときどき、それをやれば、INDEXスキャン時間が早くなる、ディスクスペースの無駄がなくなるので、「定期的にREINDEXコマンドを使用してインデックスを再構築することが価値がある状況があります。」とマニュアルにあるわけです。

# 落とし穴

サービス稼働中のDBの巨大INDEXにREINDEXすると、TABLEの排他ロックをとられて、サービスの一部または全部がその間止まってしまいます。
もちろん、9.3以前のマニュアルにも、REINDEX自体のリファレンスページには、排他ロックのことは記述があります。「定常的なデータベース保守作業」の方に注意書きがなかったというだけのことですが。

# 回避

https://www.postgresql.jp/document/9.4/html/routine-reindex.html
から最後の追記部分をまるっとコピー。

> このコマンド（REINDEX）はテーブルの排他ロックを要求しますので、生成と置き換えの処理を続けて行なうことでインデックスの再構築を実行する方が好ましい場合がしばしばあります。 CONCURRENTLYオプションの付いたCREATE INDEXをサポートする種類のインデックスでは代わりにそのように再構築できます。 それが成功し、結果のインデックスが有効ならば、ALTER INDEXとDROP INDEXを組み合わせて使って、元のインデックスを新しく構築されたものに置き換えることができます。 インデックスが一意性もしくはその他の制約を強制するために使われている場合には、既存の制約を新しいインデックスで強制されるものへ入れ替えるためにALTER TABLEが必要になるかもしれません。 インデックスをこのように再作成するのには制限がありますので、この複数の処理で再構築する代わりの方法を使う前に注意深く検討し、エラーを処理しなければなりません。

# 単純ケースのサンプル
```sql
CREATE INDEX CONCURRENTLY reports_user_id_idx_new
  ON reports
  USING tree (user_id);
DROP INDEX reports_user_id_idx;
ALTER INDEX reports_user_id_idx_new
  RENAME TO reports_user_id_idx;
```

エラーがないことを目視確認しながら、投入する必要があります。

# indexの数が多すぎる pg_repackへ

REINDEX　の一単語を、上記のように長いSQLにするのも、indexが1本や2本ならいいんですが、実用サービスの全indexとなると、うんざりです。主キー制約、外部キー制約があると、上記の単純サンプルとはSQLが違ってくるので、単純なスクリプト技ではうまくいかないのも面倒くさい。

とても期待しているのが、最小限の排他ロックだけで、すぐに解放してくれて、負荷の低いときなら、運用中のまま保守できそうな `pg_repack` です。
[bwtakacyさんの「運用で役立つツールpg_repackのご紹介」](http://qiita.com/bwtakacy/items/3be7a3e1540ccef7c9e3)
技術英語 > [only a handful] of buildings in the country / children full of hope

@ LOE > April 20, 2012

なぜか間違って古い日付のものをやってしまった。
フレーズを拾えたのでよしとする。

http://loe.org/shows/shows.html?programID=12-P13-00016
> There are probably <font color=red>only a handful of</font> buildings in the country that could do a solar installation this large.

<hr>
xxxfull of から思い出したのが

> children full of hope

どこで覚えてのか不明だがLiving on Earthだったような気がする。

希望に満ちた子供たち
MacにElasticsearchとelasticsearch-headをインストール

[Elasticsearchを使ったRailsサンプルアプリの作成](http://morizyun.github.io/blog/elasticsearch-rails-tutorial/)をMac環境でやろうと思ったのですが、セットアップに手間取ってしまったのでその過程を残しておきます。

## 環境
- OS X Yosemite

## Elasticsearchのインストール

```
$ brew update
$ brew install elasticsearch
```

インストールが終わったら自動起動の設定をします。

```
$ ln -sfv /usr/local/opt/elasticsearch/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
```

### PATHを通す

このままでは`plugin`コマンドが使えないので、パスを通します。人によってelasticsearchのバージョンが違うかもしれないので、注意してください（`brew info elasticsearch`で確認できる`plugin script`を参考にするといいと思います）。

```
$ brew info elasticsearch
elasticsearch: stable 2.2.0, HEAD
Distributed search & analytics engine
https://www.elastic.co/products/elasticsearch
/usr/local/Cellar/elasticsearch/2.2.0_1 (211 files, 38.0M) *
  Built from source
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/elasticsearch.rb
==> Caveats
Data:    /usr/local/var/elasticsearch/elasticsearch_yuki/
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_yuki.log
Plugins: /usr/local/Cellar/elasticsearch/2.2.0_1/libexec/plugins/
Config:  /usr/local/etc/elasticsearch/
plugin script: /usr/local/Cellar/elasticsearch/2.2.0_1/libexec/bin/plugin

To reload elasticsearch after an upgrade:
  launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
Or, if you don't want/need launchctl, you can just run:
```

今回の場合だと`plugin script: /usr/local/Cellar/elasticsearch/2.2.0_1/libexec/bin/plugin`の部分を参考に.bash_profileとかにPATHの記述をすることになります。

```shell:.bash_profileとか
export ELASTICPATH=/usr/local/Cellar/elasticsearch/2.2.0_1/libexec/bin
export PATH=$PATH:$ELASTICPATH
```

```
$ exec $SHELL -l
```


必ずしもPATHは通す必要はありませんが、今後`plugin`コマンドを多用する場合はパスを通していないと面倒かと思います。

## elasticsearch-headのインストール

```
$ plugin install mobz/elasticsearch-head
```


`http://localhost:9200/_plugin/head/`を確認すると、それっぽい画面が表示されていると思います。

以上です。

## 参考
- [Elasticsearch in OSX クイックスタート](http://qiita.com/srockstyle/items/207506a79d20ec260926)
- [Elasticsearch 2.1 + Kibana 4.3 + Marvel のMacへのセットアップ](http://morizyun.github.io/blog/elasticsearch-kibana-setup-mac/)
JavaScriptのsort関数の内部挙動がよくわからない

よくあるソート

```js
var nums = [4,1,2,3];
nums.sort(function(a, b){
  return a - b;
});
// [1, 2, 3, 4]
```

sort関数は引数に関数を与えると、その返り値によって昇順ソートになったり降順ソートになったりします。

しかし、内部ではどういった動作をしているのかよく分からず、それが気になったため少し調べたのですが、結果的によくわからなかったため調べた結果をメモとして残しておきます。

以下、console.logで変数nums, a, bを出力した時の記録です。

```js
var nums = [4,1,2,3];
nums.sort(function(a, b){
  console.log('nums: ' + nums);
  console.log('a: ' + a);
  console.log('b: ' + b);
  return a - b;
});
// nums: 4,1,2,3
// a: 4
// b: 1
// nums: 1,4,2,3
// a: 4
// b: 2
// nums: 1,4,4,3
// a: 1
// b: 2
// nums: 1,2,4,3
// a: 4
// b: 3
// nums: 1,2,4,4
// a: 2
// b: 3
// [1, 2, 3, 4]
```

[1,2,3,4]を与えた時

```js
var nums = [1,2,3,4];
nums.sort(function(a, b){
  console.log('nums: ' + nums);
  console.log('a: ' + a);
  console.log('b: ' + b);
  return a - b;
});
// nums: 1,2,3,4
// a: 1
// b: 2
// nums: 1,2,3,4
// a: 2
// b: 3
// nums: 1,2,3,4
// a: 3
// b: 4
// [1, 2, 3, 4]
```

[4,3,2,1]を与えた時

```js
var nums = [4,3,2,1];
nums.sort(function(a, b){
  console.log('nums: ' + nums);
  console.log('a: ' + a);
  console.log('b: ' + b);
  return a - b;
});
// nums: 4,3,2,1
// a: 4
// b: 3
// nums: 3,4,2,1
// a: 4
// b: 2
// nums: 3,4,4,1
// a: 3
// b: 2
// nums: 2,3,4,1
// a: 4
// b: 1
// nums: 2,3,4,4
// a: 3
// b: 1
// nums: 2,3,3,4
// a: 2
// b: 1
// [1, 2, 3, 4]
```

動作確認はchromeのconsoleで行っています。
RealmSwift入門編


#RealmSwift入門編
今更感がやばいですがRealmを触ってみたいと思い今回はRealmの概要と導入編を書きます。
##Realmとは？
![11013065_656713921098259_7867821350336580662_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/48864/fa3cb8c8-c360-d99c-6781-5fcba9d69c4c.jpeg)





RealmはCoreDataやSQLiteに変わると注目されている次世代のモバイルデータベースです。
またRealmはiOS,Androidの両方でサポートしています。
そしてSQLiteより速く動作するみたいです。
ベンチマークが[公式サイト](https://realm.io/news/introducing-realm/#fast)に載ってます。
ちなみに2016年3月2日〜4日の日程で開催される[try!Swift](http://www.tryswiftconf.com/)のDIAMONDスポンサーです。

##インストール方法
[公式サイト](https://realm.io/jp/docs/swift/latest/)によると、インストール方法はDynamic FrameworkとCocoaPods、Carthageでインストールできます。
今回はCocoaPodsでインストールしてみます。
Podfileのアプリケーションとテストのターゲットに

```
# Uncomment this line to define a global platform for your project
# Uncomment this line if you're using Swift
platform :ios, '8.0'
use_frameworks!

target 'RealmToDo' do
 pod 'RealmSwift'
end

target 'RealmToDoTests' do
 pod 'RealmSwift'
end
```
pod 'RealmSwift'を追記します。
Podfileのあるディレクトリで

```
pod install 
```
を実行しCocoaPodsによって作成された.xcworkspaceファイルを開きます。
CocoaPodsをインストールされてない方はこちらの[記事](http://qiita.com/satoken0417/items/479bcdf91cff2634ffb1)が参考になると思います。

##モデル定義
Realmでのモデル定義は以下のようにクラスを作成します。

```Swift
import RealmSwift
class Dog: Object {
    dynamic var name = ""
}
```
##オブジェクトの生成・追加
上記のモデルクラスを用いると

```swift
import RealmSwift
let newDog = Dog()
//オブジェクトを生成しプロパティに値をセット
newDog.name = "Pochi"
// デフォルトRealmを取得
let realm = try! Realm()
// トランザクションを開始して、オブジェクトをRealmに追加
try! realm.write {
  realm.add(newDog)
}
```
になります。
##オブジェクトの更新
オブジェクトを更新するにはトランザクションの中でプロパティに値を代入するだけです。

```swift
let realm = try! Realm()
try! realm.write {
  newDog.name = "taro"
}
```
##オブジェクトの削除・全削除
オブジェクトを削除するにはトランザクションの中でRealm().deleteメソッドに削除対象のオブジェクトを渡します。

```swift
let newDog = Dog()
let realm = try! Realm()
try! realm.write {
  realm.delete(newDog)
}
```
全削除する場合はトランザクションの中でRealm().deleteAllメソッドを使用します。

```swift
try! realm.write {
  realm.deleteAll()
}
```
##まとめ
今回は、とりあえず導入とオブジェクトの生成・追加・更新・削除までをざっくりとまとめてみました。次回は検索クエリについて書きたいと思います。
Kobitoから記事をサルベージ

明日社内で共有する為の技術記事をKobitoで書いていたら突然落ちて
起動しなくなったので取り急ぎ書いたものだけ取り出したい。

##データを取ってくる
```
~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito
```
kobitoで書いた記事のデータはここに格納されている

##読む
SQLiteクライアント使えばとりあえず読める
今回は[DB Browser for SQLite](http://sqlitebrowser.org/)を使用。
```
~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/kobito.db
```
上記をロードする

##読めた
<img width="678" alt="スクリーンショット 2016-02-16 4.27.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/70468/10a9db12-5bb6-2dc1-4221-5a4fd9b25ada.png">

よかった。
maven+djunit 複数プロジェクトでのテスト依存関係設定

# 概要
eclipse+m2eでは問題なかったのに、mavenコマンドライン+djunit実行時に起きる、以下の問題についの対応方法です。

- mavenコマンドラインでテスト実行を行った場合、コンパイルエラーが起きる問題
- VirtualMockObjectが一部有効にならない問題

# 解消方法
- テスト依存関係を設定する
- djUnit実行時にVirtualMockObjectを使用している場合、対象ソースルートを追加する。

# コンパイルエラー
## 原因
テスト依存関係がeclipse上とmavenコマンドラインでは違うため
### eclipse+m2e+djunitの参照関係
eclipse+m2e+junitの場合は、実行時にjava.lang.NoClassDefFoundErrorが起きる。
![01_eclipse_m2e.png](https://qiita-image-store.s3.amazonaws.com/0/113377/1f9dda69-9dcb-3311-c137-becacb210577.png)
### mavenコマンドライン実行時の参照関係
ProjectB test から Project A testが参照されている場合コンパイルエラーとなる。
![maven_command_line_default.png](https://qiita-image-store.s3.amazonaws.com/0/113377/c591b778-37ac-fd8d-b1e2-ffbc07bad37f.png)

## 解消方法
### テスト依存関係を追加する
![maven_command_line_add_settings.png](https://qiita-image-store.s3.amazonaws.com/0/113377/04806584-b7b7-465c-12e8-f05646ae0387.png)
### 具体的な設定について
test-jarをコンパイルするように設定を追加する。   

```xml
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <executions>
          <execution>
            <goals>
              <goal>test-jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
```
test-jarの依存関係を追加する。

```xml
    <dependency>
      <groupId>groupId</groupId>
      <artifactId>artifactId</artifactId>
      <type>test-jar</type>
      <version>version</version>
      <scope>test</scope>
    </dependency>
```
# djunit VirutalMockObjectが有効にならない
## 原因
jp.co.dgic.eclipse.project.source.dirで指定しているパスにVirtualMockObjectを適用するクラスファイルのソースがないとだめ。

## 解消方法
- ダミーのフォルダを設定し、ダミーのファイルを用意する（大規模になると面倒）
- 対象フォルダを追加する。
 - 「-Djp.co.dgic.eclipse.project.source.dir」に「;」区切りでディレクトリを追加する
 - 例：「-Djp.co.dgic.eclipse.project.source.dir="\${project.build.sourceDirectory};${project.basedir}\\..\simple.pattern3.projecta\src\main\java"」

# サンプル
以下のサイトでソースを公開しています。

- [検証用ソース](https://bitbucket.org/umed0025/maven_djunit/overview)

# 参考文献
以下の資料を参考としました。感謝です。

- maven+djunit実行方法
 - [tanigonの日記](http://d.hatena.ne.jp/tanigon/20080416#p1)
- テスト依存関係追加
 - [maven公式](https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html)
NSLocale.preferredLanguages()を使わずに日本語環境か判定する (try! Swift Conference Appから)

## try! Swift Conference Appのソースをのぞいてみた
[try! Swift Conference App](https://github.com/NatashaTheRobot/trySwiftApp)がGithubで公開されていて、ソースを少し覗いていたのですが、
ソースコード見ていて**「こういう判定の仕方があったんだ」**、と気になったので投稿させていただきました。特に目新しいものではないですが。。


端末の使用言語が日本語かどうかの判定をしている記述があって、よく見てみると
`NSLocale.preferredLanguages()`を使わずに判定していました。

## 今まで見てきた日本語判定の実装
だいたい色々な記事をみても、*NSLocale.preferredLanguages()*を使って、

```swift:よくある判定、iOS9問題を考慮したもの
func isJapanese() -> Bool {
    if let language = NSLocale.preferredLanguages().first?.componentsSeparatedByString("-").first {
        return language == "ja"
    }
    return false
}

print(isJapanese())
```

こんな感じで判定しているものが多いです。
特に、iOS9になってから、この`NSLocale.preferredLanguages()`で取得できる文字列は必ずしも`ja`になるとは限らず、`ja-JP、ja-US`となる可能性もあり、iOS9の登場の際は騒ぎになりましたね。
回避するためにも、一度`"-"`を区切り文字としてバラして、先頭の文字列を比較する、といった手法がベストなんじゃないかなって感じで落ち着いたかと思います。

## try! Swift Conference Appでの日本語判定の実装

[try! Swift Conference App](https://github.com/NatashaTheRobot/trySwiftApp)では、

```swift:try!SwiftConferenceAppでのisJapanese
let isJapanese: Bool = {
    if let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String {
        return languageCode == "ja"
    }
    return false
}()

//e.g. (ソースより一部抜粋)
cell.textLabel?.text = isJapanese ? "try! Swiftについて" : "About"
```

と、`currentLocale()`から、 **objectForKey**メソッドで *NSLocaleLanguageCode*を指定して取得した文字列が"ja"かどうかを判定しているみたいです。
試しに使用言語を日本語→英語に切り替えて、[try! Swift Conference App](https://github.com/NatashaTheRobot/trySwiftApp)を起動してみましたが、バッチリ英語表記に変更されていました。
これならiOS9で生じた問題(返ってくる文字列が`ja-JP、ja-US`)を考えずに済みそうですね。
また、isJapaneseを**関数**ではなく、**クロージャの即時実行**を用いて変数として定義しているので、使用するときも、

- × : isJapanese()
- ◯ : isJapanese

といった形で、いちいち`()`を書かなくて済むようになっています。


今のところ単純に使用言語が日本語かどうかを判定するだけにおいては差はないと思っていますが、
こういう時に違う結果になってしまう、という事象がある場合をご存知の方がいらっしゃったら教えて下さい。自分は(おそらく)日本語かどうかの判定だけだったら差異はないと信じてます。

## さいごに
try! Swift Conferenceに行く方も行かない方も、是非一度ストアに並ぶ前にプロジェクトに触れてみるのもいいかもしれませんね！
リポジトリをcloneして、プロジェクトのルートディレクトリで`pod install`すればすぐに試せますので是非。

## 参考
- [try! Swift Conference App](https://github.com/NatashaTheRobot/trySwiftApp) <br />
プロジェクトが公開されているので、cloneしてビルドしてためしてみることができます。正式なAppは近日ストアに並ぶそうです。
- [iOS ユーザーの設定言語が日本語かどうか判定するメソッド](http://qiita.com/eggmobile/items/02801f0a390a024f61d4)
- [iOS9の言語関連](http://qiita.com/sora/items/90ea6ed9a6efc1212fbb)
Haskell でサムネイル生成

Haskell でサムネイルを生成するライブラリ [thumbnail](http://hackage.haskell.org/package/thumbnail) と [thumbnail-plus](http://hackage.haskell.org/package/thumbnail-plus) を評価してみました。

# thumbnail

使い方はこんな感じです。

```ThumbSample.hs
import qualified Data.ByteString.Lazy as LBI
import Graphics.Thumbnail (mkThumbnail', Thumbnail(..))

file :: FilePath
file = "img/original.jpg"

main :: IO ()
main = do
  jpeg <- LBI.readFile file
  Right thumb <- mkThumbnail' ((50, 50), (200, 200)) jpeg
  saveFile thumb "img/thumb1.jpg"
```

`ByteString` から `Thumbnail` を生成して、`saveFile` で任意の場所に保存するだけです。サムネイルのサイズは `((50, 50), (200, 200))` と指定していますが、これで幅と高さが 50px 〜 200px に収まるようなサムネイルが生成されます。

残念なのが、サムネイル生成時に JPEG Exif の Orientation を見てくれないので、元画像によってはサムネイルが横向きや逆さまになってしまうことです。

なおこのサンプルプログラムが依存しているライブラリは：

* base
* thumbnail
* bytestring

です。

# thumbnail-plus

使い方はこんな感じです。

```ThumbPlusSample.hs
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Resource (runResourceT)
import qualified Data.ByteString.Lazy as LBI
import Data.Default (def)
import Data.Either (either)
import Graphics.ThumbnailPlus ( CreatedThumbnails(..)
                              , createThumbnails
                              , Configuration(..)
                              , Size(..)
                              , Thumbnail(..)
                              )
import System.Directory (renameFile)

file :: FilePath
file = "img/original.jpg"

conf :: Configuration
conf = def { maxFileSize = 1024 * 1024 * 100
           , thumbnailSizes = [ ( Size 200 200
                                , Nothing
                                )
                              ]
           }

main :: IO ()
main = do
  jpeg <- LBI.readFile file
  runResourceT $ do
    CreatedThumbnails (_:[t]) _ <- createThumbnails conf file
    liftIO $ renameFile (thumbFp t) "img/thumb2.jpg"
  return ()
```

このライブラリは、使い勝手はあまり良くありません。その理由のひとつ目は、元画像のファイルサイズの最大値を `maxFileSize` で指定しなければならない点です。指定しない場合、デフォルトで 5MiB なのでちょっと高解像度で撮影した写真だとサイズオーバーになってサムネイルが生成できません。このサンプルでは指定していませんが、`maxImageSize` もデフォルトで 3000x3000 ピクセルなので、同様に高解像度で撮影した写真だとアウトです。

ふたつ目は、複数サイズのサムネイルを配列で指定して一気に生成できるようなインターフェイスになっているのですが、オリジナルサイズのサムネイルが常に生成されてしまう点です。場合によっては便利なのかもしれませんが、できれば指定したサイズだけを生成してもらいたいものです。このサンプルではオリジナルサイズは不要なのでリストの先頭を無視しています。

みっつ目は、サムネイルが勝手にテンポラリディレクトリに生成されてしまうことです。さらに生成されたファイルは `/tmp/thumbnail-plus-71103/thumb-200x150-71103` のように拡張子が付いておらず、自前で拡張子を付与してあげなければなりません。さらにさらに、生成されたファイルのパーミッションは 600 だったりするので、別途 644 に変更してあげないとブラウザから読み込めません（サーバサイドの場合）。

そして、やはり JPEG Exif の Orientation がサムネイル生成時に無視されるので、サムネイルが回転してしまっていることがあります。

なおこのサンプルプログラムが依存しているライブラリは：

* base
* thumbnail-plus
* bytestring
* data-default
* resourcet
* transformers
* directory

です。

# まとめ

`thumbnail` がおすすめです。ただし、どちらでサムネイルを作成しても、サムネイルが回転してしまう問題があり、これは別記事 [Haskell でサムネイル #2](http://qiita.com/satosystems/items/669a8b3fdfa535582cb4) で対策を検討することにします。
wpa_supplicuntでEAP-AKA


wpa_supplicunt.conf
ref:wpa_supplicant/wpa_supplicant.conf

```bash
# EAP-AKA without a GSM SIM or USIM
network={
        ssid="eap-sim-test"
        key_mgmt=WPA-EAP
        eap=AKA
        identity="1234"
        password=""
}
```
defconfigをコピーして.configを作成
```bash
# EAP-AKA (enable CONFIG_PCSC, if EAP-AKA is used)
CONFIG_EAP_AKA=y
# Enable USIM simulator (Milenage) for EAP-AKA
CONFIG_USIM_SIMULATOR=y

```
Linux/Mac に javaw コマンドがない…だと…

# javaw コマンドはWindows版JREにしかなかった

本日、初めて知った事実。

[Why javaw is not found on my java installation on ubuntu?](http://stackoverflow.com/questions/14331406/why-javaw-is-not-found-on-my-java-installation-on-ubuntu)

>The javaw utility **is not available or needed on Linux. Just use java instead.**
Explanation:

>* on Windows, the difference between java and javaw is that java launches a new Windows console and javaw doesn't.

>* on Linux, the java command does not launch a new console, and hence there is no need for a javaw variant.

javawはどうもWindowsのために用意されたコマンドみたいですね。Windows環境向けの記事でjavaw.exeを使う解説があった場合、Linux/Mac環境では素直にjavaコマンドに置き換えましょう。

# 事の起こりはeclipse.ini

仕事でLinux(CentOS)上にJava/Eclipse環境を構築することになった。JDK1.8を利用する環境(OSにはインストール済)なのだが、リポジトリからJavaソースを落としてEclipseのプロジェクトエクスプローラで表示すると、JDK1.7がデフォルトで利用されてしまう。んで、手動でJDK1.8に切り替えていたのだが、めんどいので最初からJDK1.8を利用するように設定できないかなぁ、と調べていたら、eclipse.iniファイルを編集してEclipseの起動オプションを指定することで何とかなる、という記事をいくつか発見。

- [Eclipse 起動時に使用する Java VM を指定する
](http://www.hitachi.co.jp/Prod/comp/soft1/cosminexus/useful/tips/090601_specify-eclipse-javavm.html)

>eclipse.ini には、Java VM を指定するための「-vm」オプションを指定することができます。
eclipse.ini ファイルを開き、「-vmargs」オプションの前に

>**-vm "Eclipse 起動時に使用する Java VM"**

>を追加すればOKです。

# Eclipse on Linux 向けの情報は少ない。。。

上記のリンク意外にも同じ情報が記載されている記事はいっぱいあったのだが、どれもWindows環境を前提としていて、eclipse.iniの設定例として

```ini:eclipse.ini(windows)
-vm
{jdkインストールパス}¥bin¥javaw.exe
```

てな感じで紹介されていた。なので、Linux環境上でjavawコマンドを(必死に)探したのだが、これが見つからない。。。んで、冒頭の記事に出会った訳である。
結果、Linux環境下では

```ini:eclipse.ini(linux)
-vm
{jdkインストールパス}/bin/java
```

とすることで解決。

そもそも、Linux環境下でEclipse使う事自体、めずらしいのか…？
LXDでコンテナがstop出来ない場合の対応方法

Ubuntu 15.10 + LXD 2.0.0.beta2で利用していますが、lxc stopやlxc restartを実行しても無反応となるため調べてみたところ、次の方法で強制的にコンテナを停止出来ることが分かりました。

--forceオプションをつけることでとりあえずstopできるようです。

```
$ lxc stop hoge --force
```

--forceしないと止められないのが気持ち悪いですね。

# 参考
- http://yagashira.hatenablog.jp/entry/2015/11/13/151012
- https://github.com/lxc/lxd/issues/1183
LXD上のCentOS7にhttpdをインストールするには（特権コンテナを利用する）

# はじめに
LXD上のCentOS7環境（コンテナ）にhttpd(Apache)をyumでインストールしようとすると、次のようなエラーが出てインストールに失敗します。

```
Installing : httpd-2.4.6-40.el7.centos.x86_64                                                                                                                                                                          6/6
Error unpacking rpm package httpd-2.4.6-40.el7.centos.x86_64
error: unpacking of archive failed on file /usr/sbin/suexec: cpio: cap_set_file
error: httpd-2.4.6-40.el7.centos.x86_64: install failed
```

これは、非特権コンテナであるため発生しているエラーとなります。

LXDでコンテナを作成すると通常は非特権コンテナとなりますが、CentOS7のように非特権コンテナで正常に動作しない、パッケージのインストールに失敗する場合は、特権コンテナを作成することで解決出来る場合があります。

# LXC上のCentOS7にhttpdをインストールするまでの手順

まず最初に、LXDをインストールします。

https://linuxcontainers.org/ja/lxd/getting-started-cli/ より引用

```
# add-apt-repository ppa:ubuntu-lxc/lxd-stable
# apt-get update
# apt-get dist-upgrade
# apt-get install lxd
```

次に、
http://images.linuxcontainers.org/images/centos/7/amd64/default/
より、最新のlxd.tar.xz ファイル（CentOS7イメージ）をダウンロードします。

lxd.tar.xzをダウンロード後、イメージをインポートします。

```
# lxc image import lxd.tar.xz --alias centos/7
```

インポート後、CentOS7コンテナを構築出来るようになります。

rootユーザーで次のコマンドを実行すると、特権コンテナのCentOS7を作成することができます。

```
# lxc launch centos/7 test01 -c security.privileged=true
```

コンテナ作成後、次のコマンドを実行して作成したコンテナのシェルに入ります。

```
# lxc exec test01 /bin/bash
```

コンテナのシェルに入れたことを確認したら、yumを実行します。

```
[root@test01 ~]# yum install -y httpd
```

エラーにならずにyumの実行完了後に

```
Installed:
  httpd.x86_64 0:2.4.6-40.el7.centos
```
と表示されれば、httpdが正常にインストールされています。

# 余談

LXDに関する情報は国内外まだまだ乏しいですね。今回の場合も、ググるとDockerに関するものばかりで困りました・・・（Dockerの場合はaufsのバグ？絡みで同様の問題が発生していたようですね）。

私の場合はDockerよりもLXDの方がしっくりくるというか、Immutable InfrastructureをしたいわけではなくこれまでKVMで構築していたVMのような使い方をしたいために、VMの代替（軽量なLinux仮想環境）としてLXDを使っています。DockerはImmutable Infrastructureのための道具としては良いのですが、initプロセスのような機能が無いので、VMの代替としては使いづらいんですよね。

LXDを使い始めたきっかけは、これまでFreeBSD jailを使っていたので、Linuxにおける同様の使い勝手のものを探していたらLXDがあったとそんな感じです。LXDは、FreeBSDのports installのコンパイルで待たされるようなものが無いので、とても気軽に使えて良いですね。(pkgngはまだ枯れていないのと提供されるパッケージがportsと比べて古かったりするので、やっぱりportsを使ってしまう・・・）

欠点としては、Ubuntuでしか使えないのと、若干動きが怪しいこと（コンテナのstopやrestartが出来ない場合があったり）、まだまだ（これからも？）マイナーであるということでしょうか。

# 参考

- [LXDとは(Linux Containers)](https://linuxcontainers.org/ja/lxd/introduction/)
- [Ubuntu 15.04とLXDではじめるコンテナ型仮想化（infinite loop 技術ブログ）](https://www.infiniteloop.co.jp/blog/2015/05/lets_start_lxd_with_vivid/)
- [Nested container in LXD (Ubuntu insights)](https://insights.ubuntu.com/2015/10/30/nested-containers-in-lxd/)
- [cap_set_file not permitted #1245](https://github.com/lxc/lxd/issues/1245)
- https://github.com/lxc/lxd/blob/master/specs/command-line-user-experience.md
PythonによるEAGLEの.brdファイルの操作

#はじめに
Eagleの.brdファイルの配線をちょっと変えたときに,部品の位置も変わっているとメタルマスクが再利用できなくなります.これはできるだけ避けたいですが,配線の変更を行った際に気づかないうちに武人の位置が少しずれてることがあります.これを避けるため,人の目ではわからないような部品の移動の変化をチェックできるプログラムをPythonで作成してみたので,そのメモです.

#条件
変更前および変更後の部品の"name"は同じである.

#コード
Eagleの.brdファイルがxmlファイルであることを利用しています.
まず,変更前のファイルの"element"要素と変更後のファイルの"element"要素内で同じ"name"のattributeをもつ要素を見つけます.
その後,もしxまたはy座標が違った場合には,その部品の名前と変更前,変更後の(x,y)座標を表示し,もし問題がない場合には"No error"を表示します.

```py
# -*- coding: utf-8 -*-
from xml.etree.ElementTree import *

def check(file1, file2):
    c = 1
    tree1 = parse(file1)
    elem1 = tree1.getroot()
    tree2 = parse(file2)
    elem2 = tree2.getroot()

    for e1 in elem1.getiterator("element"):
        for e2 in elem2.getiterator("element"):
            if e1.get("name", ) == e2.get("name", ):
                if e1.get("x") != e2.get("x") or e1.get("y") != e2.get("y"):
                    print "Error"
                    print "Parts Name = " + e1.get("name")
                    print ("x1=" + e1.get("x")) * (e1.get("x") != e2.get("x"))
                    print ("x2=" + e2.get("x")) * (e1.get("x") != e2.get("x"))
                    print ("y1=" + e1.get("y")) * (e1.get("y") != e2.get("y"))
                    print ("y2=" + e2.get("y")) * (e1.get("y") != e2.get("y"))
                    c = 0
    return c

if __name__ == "__main__":
    file1 = raw_input() #変更前のファイルのpathを入力
    file2 = raw_input() #変更後のファイルのpathを入力
    print "No error" * check(file1, file2)
```

#メリット
Linuxの"diff"コマンドと違い,"element"の順番が違っても適用可能.

#参考URL
参考:[http://hikm.hatenablog.com/entry/20090206/1233950923](http://hikm.hatenablog.com/entry/20090206/1233950923)
Swiftはじめたい...その１７ 正規表現が面倒すぎるので...


+ Swiftってネイティブに正規表現使えないんですね。今時そんなんじゃやってられませんよ！

# やっぱりperlですよね！

+ ...ってawkとかでもいいんですが...

## NSTaskを使えば...

+ Mac専用ですがperlを呼び出しちゃえ！
+ playgroundじゃなくてswiftcでコンパイルしてください。

```swift:perlを呼び出す。
import Foundation

func regexp(str:String)->String {
    let task = NSTask()
    task.launchPath = "/opt/local/bin/perl"
    task.arguments = ["-e","{my $s='\(str)';if ( my @d = ($s =~ m/(\\d*)/g) ) { print join(',',@d) } }"]
    let pipe = NSPipe()
    task.standardOutput = pipe
    task.launch()

    let output = pipe.fileHandleForReading.readDataToEndOfFile()
    
    return String(NSString(data:output,encoding:NSUTF8StringEncoding)!)
}

let result = regexp("0A1B123C190")
print(result)
```

```shell:結果
0,,1,,123,,190,
```

+ なんてね、(๑´ڡ`๑)

## まとめ

+ swift2.2とかswift3.xでは正規表現を簡単に使わせて！