OmniAICreator/Qiita-1.07M huggingface dataset:
SauceLabs + AppiumでAndroidアプリのテストを走らせる

# はじめに

## Appiumとは

* 公式サイト：http://appium.io/
 * 公式サイトからAppiumの紹介ビデオ(Youtube)を見ることができるので、初めての方はそれをみると掴みやすいかもしれません
* Appiumとは「モバイルアプリを対象としたテスト自動化のためのフレームワーク」
* Seleniumの流儀でモバイルアプリのテスト自動化のコードを書くことができるのが特徴
* Seleniumを使ったテスト自動化経験のあるエンジニアにとっては、比較的簡単にモバイルアプリのテスト自動化のコードを書くことができます

## SauceLabsとは
* 公式サイト：https://saucelabs.com
* SauceLabsとは、OS/ブラウザ横断の自動テスト実行環境をクラウド上に提供しているサービス
* SauceLabsはSeleniumの実行環境の他に以下もサポートしている
 * JavaScriptのユニットテスト
 * Appium によるモバイルアプリテスト
    * マニュアルテスト
        * もっさりしていますm(__)m

# 事前準備
* SauceLabsのアカウントを作成しておいてください

# Appiumの環境構築
* 以下のチュートリアルをもとに環境構築しました
 * [qte-study-vol15-appium-workshop-doc-v1.0.1.zip](https://bitbucket.org/skinoshita/qte-study-vol15-appium-workshop-doc/downloads/qte-study-vol15-appium-workshop-doc-v1.0.1.zip) 
 * Windows/Mac OS両方の手順が書かれておりとても親切なチュートリアルです
* ほんとこのチュートリアルだけでできます！！

# SauceLabsでのお試し実行
* 以下を実行する

```
# チュートリアルの途中でサンプルコード取得するところがあります
# サンプルコードをDL、展開したディレクトリに移動してください
$ cd sample-code-master/sample-code/examples/ruby
$ gem install bundler # bundlerが入っていなければ
$ bundle install
$ export SAUCE_USERNAME=[ユーザ名]
$ export SAUCE_ACCESS_KEY=[アクセスキー]
$ bundle exec ruby android_on_sauce.rb
```

* [ダッシュボード](https://saucelabs.com/beta/dashboard)に **Ruby Appium Android example** というテストが実行されている
* 
![appium.png](https://qiita-image-store.s3.amazonaws.com/0/19778/3cd060ae-f73d-3864-dbe9-0c2b5fd0952b.png)
* 以上です！！！



## SAUCE_USERNAME、SAUCE_ACCESS_KEYはどこで確認すればいいの？
* https://saucelabs.com/account/profile を開きます
* 画面右上の赤枠部分にSAUCE_USERNAME、左下の赤枠部分にSAUCE_ACCESS_KEYが表示されています
* ![appium.png](https://qiita-image-store.s3.amazonaws.com/0/19778/bb670393-c233-750d-cab0-bbb5d0f66f9a.png)

----

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Rasberry Pi2 (raspbian) での gpio permission 関係


raspi2 + raspbian 環境で、rpi-update して最新(2015/8/5現在は [2344e1134](https://github.com/Hexxeh/rpi-firmware/tree/2344e11340a8a26dbb68f2356845b13e68655233))  の Linux Kernel 4.x 系統にすると

```
echo 17 > /sys/class/gpio/export 
```

等で sysfs 作った後の ```/sys/class/gpio/gpio17``` 以下の permission が root:root になってしまい gpio グループ権限で書き込めなくて困った。

一応 Linux Kernel 3.18 の最新リビジョン ([4f95c894](https://github.com/Hexxeh/rpi-firmware/tree/4f95c894c6a96b265d98f04a889e469833f7e996)) に rpi-update すると

```bash
$ sudo rpi-update 4f95c894c6a96b265d98f04a889e469833f7e996
# 再起動する
$ uname -a
Linux raspberrypi 3.18.14-v7+ #792 SMP PREEMPT Sat May 23 16:19:32 BST 2015 armv7l GNU/Linux
$ echo 17 > /sys/class/gpio/export 
$ ls -alh /sys/class/gpio/gpio17/
total 0
drwxrwx--- 2 root gpio    0 Aug  5 07:57 .
drwxrwx--- 4 root gpio    0 Aug  5 07:57 ..
-rwxrwx--- 1 root gpio 4.0K Aug  5 07:57 active_low
lrwxrwxrwx 1 root gpio    0 Aug  5 07:57 device -> ../../../3f200000.gpio
-rwxrwx--- 1 root gpio 4.0K Aug  5 07:57 direction
-rwxrwx--- 1 root gpio 4.0K Aug  5 07:57 edge
lrwxrwxrwx 1 root gpio    0 Aug  5 07:57 subsystem -> ../../../../../class/gpio
-rwxrwx--- 1 root gpio 4.0K Aug  5 07:57 uevent
-rwxrwx--- 1 root gpio 4.0K Aug  5 07:57 value
```

だと root:gpio になって gpio グループ権限で書き込めるようになる。けどもっと良い方法ありそう…。
インテル® RealSense™ 3Dカメラ を動かしてみる【Depth、IR画像の表示】


RealSense3Dカメラ(F200)のIRカメラで取得できるDepth,IR画像を表示するプログラムを書いてみます。

#前提
以下の記事の処理をベースにしています。

[インテル® RealSense™ 3Dカメラ を動かしてみる【Colorカメラ画像の表示】](http://qiita.com/n_kimura/items/88b46d1ea02eed7f4ab1)

Depth,IR画像を表示する処理を追加しているので、ポイントとなる部分だけ記事に書いていきます。

#ソース
本記事の全ソースは以下に置きました。
https://github.com/aquaring/RealSenseTestCode
「RealSenseAllCameraWPF」というプロジェクトです。

※ソースはあくまでテストコードですので、厳密にエラー処理を書いていませんし、
　カメラ制御の処理はクラスなどにせずxaml.csにべた書きにしています。
　あくまで基本的に使用方法を押さえる目的で書きました。

#Depth,IRストリームの有効化
Color,Depth,IR画像を取得するためにストリームを有効化します。

```csharp:MainWindows.xaml.cs
m_Cm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, 1920, 1080, 30);
m_Cm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_DEPTH, 640, 480, 30);
m_Cm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_IR, 640, 480, 30);
```

Depth,IR画像は最高で640x480の解像度でしか取れないのでこの値にします。
これで、フレームをサンプリングして各画像を取得できるようなります。

#WriteableBitmapの作成とImageDataの取得
Color,Depth,IRのそれぞれの画像を表示するためにWritableBitmapを作りますが
以下のようにしています。

```csharp:MainWindows.xaml.cs
m_ColorWBitmap = new WriteableBitmap(1920, 1080, 96.0, 96.0, PixelFormats.Bgr32, null);
m_DepthWBitmap = new WriteableBitmap(640, 480, 96.0, 96.0, PixelFormats.Gray16, null);
m_IrWBitmap = new WriteableBitmap(640, 480, 96.0, 96.0, PixelFormats.Gray8, null);
```

どのPixelFormatsを使うかというのは、AcquireAccessメソッドで取得するPXCMImage.ImageDataのピクセルフォーマットに合わせる必要があるので、以下リファレンスを見て
[Intel® RealSense™ SDK Documentation PixelFormat](https://software.intel.com/sites/landingpage/realsense/camera-sdk/v1.1/documentation/html/index.html?pixelformat_pxcimage.html)

このような組み合わせにしました。

|ストリーム|AcquireAccessの指定|WriteableBitmapの指定　|
|:--|:--|:--|
|Color|PXCMImage.PixelFormat.PIXEL_FORMAT_RGB32 |PixelFormats.Bgr32|
|Depth|PXCMImage.PixelFormat.PIXEL_FORMAT_DEPTH_RAW|PixelFormats.Gray16|
|Ir|PXCMImage.PixelFormat.PIXEL_FORMAT_Y8|PixelFormats.Gray8|

ちなみにリファレンスを抜粋すると
**・PIXEL_FORMAT_RGB32**
The 32-bit RGB32 color format. On little endian machines, the memory layout is BGRA. See fourcc.org for the description and memory layout.

**・PIXEL_FORMAT_DEPTH_RAW**
The depth map data in 16-bit unsigned integer. The value precision is device specific. The application can get the device precision via the QueryDepthUnit function;

**・PIXEL_FORMAT_Y8**
The 8-bit gray format. Also used for the 8-bit IR data. See fourcc.org for the description and memory layout.

このように記述があるので
AcquireAccessメソッドで取得したImageDataをバイト配列に変換してWriteableBitmapにピクセルを書き込むと表示ができるという訳です。

AcquireAccessメソッドでImageDataを取得する個所は以下のようにしています。

```csharp:MainWindows.xaml.cs
sample.color.AcquireAccess(
        PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_RGB32, out colorImageData);
sample.depth.AcquireAccess(
        PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_DEPTH_RAW, out depthImageData);
sample.ir.AcquireAccess(
       PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_Y8, out irImageData);
```

#所感
これで、Color,Depth,Irフレームを取得してWriteableBitmapを使って画面に描画する処理が書けました。
Color、Depth、Irが全く別々で取得可能なのでSDKとしては非常に使いやすく感じました。

今後は、指・顔の検知、Blobの処理など基本的な機能を押さえた上で
OpenCV、OpenGL、Unityなどと組み合わせて色々やってみたいと思います。
Bogo プラグインで、WP_Query の言語絞り込みを指定＆解除する

WordPress の多言語化プラグイン「Bogo」の、公式ページにはまだ載っていない機能です。[3月7日に行われた WordBench 福岡](https://fukuokawp.doorkeeper.jp/events/21311)にて**作者の三好さん直々に**教えていただいたので共有します。

## まず、**言語指定をする**方法
この方法は [WordPress 日本語フォーラム](https://ja.forums.wordpress.org/topic/104088)で三好さんが回答してました。

Bogo では、 WP_Query の中を現在表示している言語で絞り込んでいます。

手動で指定する場合はこうです。

```lang:singular.php
$query = new WP_Query();
$args = array(
	'post_type' => 'post',
	'posts_per_page' => 10,
	'lang' => 'ja'
	);
$posts = $query->query( $args );
```

lang パラメタでロケール値を指定します。配列を渡すことはできません。


## 言語指定を解除するには

デフォルトではいずれかの言語が設定されているので、全ての言語の記事を持ってきたい場合は、解除しなくてはなりません。
`bogo_suppress_locale_query` パラメタをセットするだけです。

```lang:singular.php
$query = new WP_Query();
$args = array(
	'post_type' => 'post',
	'posts_per_page' => 10,
	'bogo_suppress_locale_query' => true
	);
$posts = $query->query( $args );
```

## どういう場面で解除するの？
私の場合、**母語が違う人と、WordPress を使って情報共有しています**。

* UI→それぞれの母語
* 記事→全員同じものが出る

というブログを作りたかったので、ぴったりでした！

## おまけ

### トップページはどの言語が表示されるのか
言語を特に指定しない場合、トップページはブラウザの言語ではなく、サイトでデフォルトに設定した言語が出力されます。WordPress の管理画面から「**設定**」>「**一般**」>「**サイトの言語**」から設定します。

そこから更に、ランゲージスイッチャーで言語を切り替えれば、そのときの言語が WP_Query に自動で指定されます。
Beta by Crashlytics (fabric.io) のテスターのUDID一覧を取得する

Beta by Crashlytics にはUDIDのエクスポート機能がないのでテスター一覧画面からJavaScriptでがんばって抜き出します（泣ける）

```js:es6
$(".device-toggle").click();

setTimeout( () => {
  var testers = $('.device .identification');
  var udids = [].map.call(testers, (tester) => {
    var udid = tester.querySelector('.identifier').textContent;
    var name = tester.querySelector('.device-name').textContent;
    return `${udid}, ${name}`
  });

  console.log(udids.join("\n"))
}, 3000);
```
URLの一部を組み替える

URL クラスを使うと、以下のように URL をパーツに分解するのが可能ですが：

```
> new URL('http://example.com/foo/bar?x=1#hash')
{
  hash: "#hash"
  host: "example.com"
  hostname: "example.com"
  href: "http://example.com/foo/bar?x=1#hash"
  origin: "http://example.com"
  password: ""
  pathname: "/foo/bar"
  port: ""
  protocol: "http:"
  search: "?x=1"
  username: ""
}
```

もし、その一部を書き換えて再構築したい場合はこうする：

```
> var urlObj = new URL('http://example.com/foo/bar?x=1#hash')
> urlObj.hostname = 'qiita.com'
> urlObj.pathname = '/unk'
> urlObj.hash = 'cnk'
> urlObj.toString()
"http://qiita.com/unk?x=1#cnk"
```
git stashで保存したものをpopやclearで消してしまったファイルの復旧

```git stash clear```

や

```git stash pop ***```

とstashしたものを間違って消してしまった時の復旧方法


1. 以下コマンドを打つ

```git fsck --unreachable | grep commit | cut -d\  -f3 | xargs git log --merges --no-walk --grep=WIP``

2. 該当するcommitNo（SHA-1形式）をmemo

3. git cherry-pick -n -m1 <2でmemoしたもの>

とするとインデックスに返ってくる
SpriteStudio Ver.5.5で作成した「SSP for Corona SDK」エクスポートファイルをSSPlayerForCCHで動作確認しました。

> ## 各種SS5PlayerのOPTPiX SpriteStudio Ver.5.5対応について
OPTPiX SpriteStudio Ver.5.5 での機能追加に伴いアニメーションファイルのフォーマットを変更(新機能分の情報が追加)いたしました。 
フォーマットの変更に伴い、Ver.5.5で作成したデータを読み込み再生できる様に各種SS5Playerを整備いたしました。

<cite><a href="http://www.webtech.co.jp/help/ja/spritestudio/download/tool_sample_download/" target="_blank">公式「補助ツール・ライブラリ群・サンプルのダウンロード」</a><cite>より。

SpriteStudioに新機能が追加されたので、各SSPlayer向けエクスポートファイルのフォーマットが変更になり、その対応のため各種SSPlayerにも変更が入った模様です。

以前から、<a href="https://github.com/SpriteStudio/SSPlayerForCCH/wiki" target="_blank">Corona SDK向けのSSPlayer（SSPlayerForCCH）</a>は、「今後ウェブテクノロジによる本ソフトウェアのアップデートは予定していません。」とのことでした。

SpriteStudioでのエクスポートファイルに変更が入ったら、SSPlayerForCCHでアニメーションが動かなくなるかも…？
と少しだけ心配になり、念のため動作確認してみました。

## 動作確認結果

結論から言うと、問題なく動きました。

SpriteStudioで「アニメーションデータのフォーマット：SSP for Corona SDK」でエクスポートしたファイルのソースは、以前のバージョンと変わりないようです。

今回、新機能は使わずシンプルなコマアニメーションを作成して確認しましたが、新機能を設定した場合はそのデータのみファイルに含まれないなど、何らかの形で制限があるのではないでしょうか（ドキュメントに書いてあるかも）。

## 動作確認環境

- SpriteStudio Version:5.5.0.5720
- SpriteStudio Player For Cocos2d-x/CoronaSDK/HTML5 v1.0.0（安定版）
- Corona SDK on Mac OS X | Build 2015.2646
vim-quickrun シンプルかつまともに使える設定

シンプルなvim-quickrunの設定を紹介する。
使用するプラグインはvim-quickrun,vimprocのみ。
これらの導入方法については省略。

#成功時はbufferに、失敗時にはquickfixに出力する。
vimprocで動作。
bufferが空なら自動で閉じる。

```vim
let g:quickrun_config = get(g:, 'quickrun_config', {})
let g:quickrun_config._ = {
      \ 'runner'    : 'vimproc',
      \ 'runner/vimproc/updatetime' : 60,
      \ 'outputter' : 'error',
      \ 'outputter/error/success' : 'buffer',
      \ 'outputter/error/error'   : 'quickfix',
      \ 'outputter/buffer/split'  : ':rightbelow 8sp',
      \ 'outputter/buffer/close_on_empty' : 1,
      \ }

```

#おまけ

q でquickfixを閉じれるようにする。

```vim
au FileType qf nnoremap <silent><buffer>q :quit<CR>
```

\\r で保存してからquickrunを実行する。

```vim
let g:quickrun_no_default_key_mappings = 1
nnoremap \r :write<CR>:QuickRun -mode n<CR>        
xnoremap \r :<C-U>write<CR>gv:QuickRun -mode v<CR> 
```

\\r でquickfixを閉じて、保存してからquickrunを実行する。

```vim
let g:quickrun_no_default_key_mappings = 1
nnoremap \r :cclose<CR>:write<CR>:QuickRun -mode n<CR>
xnoremap \r :<C-U>cclose<CR>:write<CR>gv:QuickRun -mode v<CR>
```


\<C-c> でquickrunを停止

```vim
nnoremap <expr><silent> <C-c> quickrun#is_running() ? quickrun#sweep_sessions() : "\<C-c>"
```
〔質問〕【解決】Promiseで実装されているか判定する方法

JS の API などで、同じ API でも古いスペックでは callback だったものが、新しいスペックになると Promise で実装されてきています。そこで、質問なのですが、その関数が Promise で実装されたものかどうかを関数の実行することなく判定したいのですが、可能でしょうか？

##解決
hikaru_oao さんからコメントをいただき、func.lengthというのがあるのを知りました。
これで、関数が期待する引数の数を取得することができますので、判定することができました。
rspecでActionController::UrlGenerationError

# 環境

* **Rails engineを利用**
* Rails 4.2

Controllerのテストを追加したら発生

# エラー
```
  1) EngineName::HogeController GET #index
     Failure/Error: get :index
     ActionController::UrlGenerationError:
       No route matches {:action=>"index", :controller=>"engine_name/hoge"}
```

# 対応

*hoge_controller_spec.rb*に下記を追加

```rb:hoge_controller_spec.rb
routes { EngineName::Engine.routes }
```

## 参考

http://pivotallabs.com/writing-rails-engine-rspec-controller-tests/
解決方法が3つ載っています
NSStringにstringValueは無い

```objc
NSLog(@"NSNumber.intValue    = %d", (@98765).intValue);
NSLog(@"NSString.intValue    = %d", @"01234".intValue);
NSLog(@"NSNumber.stringValue = %@", (@98765).stringValue);
NSLog(@"NSString.stringValue = %@", @"01234".stringValue);
```

こうすると、最後の行でエラーが出る。

```
Property 'stringValue' not found on object of type 'NSString *'
```

エラーが出るならいいけど、

```objc
NSDictionary *dic = @{ @"num": @98765, @"str": @"01234" };
NSLog(@"NSNumber.intValue    = %d", [dic[@"num"] intValue]);
NSLog(@"NSString.intValue    = %d", [dic[@"str"] intValue]);
NSLog(@"NSNumber.stringValue = %@", [dic[@"num"] stringValue]);
NSLog(@"NSString.stringValue = %@", [dic[@"str"] stringValue]);
```

なんてことをしていると、

```
NSNumber.intValue    = 98765
NSString.intValue    = 1234
NSNumber.stringValue = 98765
-[__NSCFConstantString stringValue]: unrecognized selector sent to instance 0xe65284
NSInvalidArgumentException
```

落ちる。

# いつの間にか

落ちなくなってる。（Property〜のエラーは出る）
iOS 13から？

```
NSNumber.intValue    = 98765
NSString.intValue    = 1234
NSNumber.stringValue = 98765
NSString.stringValue = 01234
```
Git 的街頭巷弄小招式


這篇的內容將會不定期更新～ :smiling_imp: 

# 取得當前的 branch name

``` bash
$ git rev-parse --abbrev-ref HEAD
```

如果要直接匯入剪貼簿，白話說就是直接「複製」 branch name

``` bash
$ git rev-parse --abbrev-ref HEAD | pbcopy
```
Microsoft Edgeのユーザーエージェントがカオスなので注意

Windows 10の標準ブラウザ「Microsoft Edge」のユーザーエージェントがカオスです。下記の太字部分に注目してください。

Mozilla/5.0 (Windows NT 10.0; Win64; x64; ServiceUI 11) **AppleWebKit**/537.36 (KHTML, like Gecko) **Chrome**/58.0.3029.110 **Safari**/537.36 Edge/16.16299

（Microsoft EdgeHTML 16にて確認）

なんと、Microsoft EdgeはWebkit系エンジンではない（EdgeHTMLエンジンといいます）にも関わらず、AppleWebkit、Chrome、Safariという文字列が入っています。これは、**Webkit系ブラウザと互換性を持たせ、WebKitブラウザ用の処理も実行できるようにするため**です。
(*参考：[Microsoft曰く、Microsoft EdgeではWebKitと動作が異なる場合はバグ](http://www.excite.co.jp/News/it_g/20150621/Slashdot_15_06_20_1637219.html)* )

# Web制作者が注意すべきこと
ユーザーエージェントを使ってWebkit系ブラウザ向けの処理を行っている場合は注意が必要です。Google ChromeやSafariのユーザーエージェントにも「AppleWebKit」という文字列が含まれているので、**Webkitブラウザ用の処理がMicrosoft Edgeでも動作してしまいます**。例えばJavaScriptでWebkit系のブラウザのみの処理を行いたい場合は、Edgeという文字列の存在を確認するとよいでしょう。

```js:JavaScript
// Webkitブラウザ用でのみ処理を実行する例
var ua = navigator.userAgent;
if (ua.indexOf("AppleWebkit") >= 0 && ua.indexOf("Edge") == -1)
{
    // 処理
}
```
Kotlin vs Swift

Kotlin勉強しながらまとめてみています。進める

| 内容 |Swift|Kotlin|
|---|---|---|
| 定数 | let  | val  |
| 変数 | var  | var  |
| 文字列内の変数 | "I have \\(number) apples"  | "I have ${number} apples"  |
| 配列 | var arr = ["A", "B", "C"] | var arr = array("A", "B", "C") |
| ディクショナリ | var dic = ["key":"value"] |   var dic = hashMapOf("key" to "value" ) |
| Optional Value | var optionString: String? = "Hello" <br> if let str= optionalString {} | var optionString: String? = "Hello" <br> if (optionalString != null) {}  |
| 三項演算子 |var max = (a>b)?a:b  | var max = if(a>b) a else b |
| for | for item in list {} | for (item in list) {}  |
| 条件分岐（複数）  |switch (obj) { <br>case 1: println("one")<br>default: <br> break }|  when(obj) { <br> 1 -> print("one") <br> else -> ... }  |
| 範囲(range) | for i in 0..3  {} | for (i in (0..3)) {} | 
| 関数宣言 | func  | fun  |
| 関数の返すデータ | func()-> DataType | func(): DataType |
| 関数内の関数 | func A() {<br>func B() {} <br> B() <br>}  | fun A() {<br>fun B() {} <br> B() <br>} |
|関数のオブジェクト| func A (list: [Int], condition: Int -> Bool) -> Bool {}<br> func B(number: Int) -> Bool {}<br> A(array, B) | fun hasAny (list: Array<Int>, condition: (Int) -> Boolean) : Boolean {} <br> val B:(Int) -> Boolean{}<br> A(array, B)|
|匿名の関数| numbers.map({<br>(number: Int) -> Int in <br> let result = 3*number<br>return result<br>})| numbers.map({<br> val result = 3*it <br> result <br>})|
| 簡単なクラス | class A { <br> func simpleDescription() -> String { <br> return "" } <br>} <br> var A = A() <br> A.simpleDescription() | class A { <br> fun simpleDescription() : string { <br> return "" } <br>} <br> var A = A() <br> A.simpleDescription() |
| イニシャライザ | class A { <br> init(name: String ) {...} <br>} | class A (var name: String) {...} |
MySQLで"Range checked for each record"が出ちゃってJOIN時にインデックスが使われない件

あっはは あははは そういったわけで、そんな事象にハマったんだよ。

1. まずJOINするキーとなるカラム同士が同じ型、同じサイズかどうかチェック！
1. 文字列型なら**COLLATE**も同じかどうかチェック！！

後者でハマりました。
.gitignore 動かないこと

#現象：
git pushした後、github上に要らないのvendorフォルダ下の全部ファイルがプッシュされてしまいましたこと気づいたんです、その後、.gitignoreに「/vendor/*」を追加したんだけど、
なんか効かない状態です。

#原因：
vendorフォルダがすでにrepoにチェックされてしまうので、.gitignoreに「/vendor/*」を記述しても、効けないです。

#対策：
git rm -r --cached vendor
.gitignoreに「/vendor/*」を追加

```rb
# Ignore all logfiles and tempfiles.
/log/*
!/log/.keep
/tmp
/vendor/*
```

#補足
git rm -r --cached vendorを実行してから、git statusを発行すると、
vendor/下のファイルがUntracked filesとして、表示されました

この方法で、無視されるかとうか検証できる
例：

１：今はクリアです

```rb
➜  demo git:(fully_use_RESTful) git status 
On branch fully_use_RESTful
nothing to commit, working directory clean
➜  demo git:(fully_use_RESTful) 

```

２：わざと/log/*をコメントアウトして

```rb
#/log/*
!/log/.keep
/tmp
/vendor/*
```

３：git statusで確認して【log/development.log】が出てしましました


```rb
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	log/development.log

```

http://stackoverflow.com/questions/18748942/why-git-is-looking-inside-vendors-directory
jq で連続する JSON を特定のキーでソートする

# やりたいこと

jq で以下のような JSON を入力として、

```json
{"id":5}
{"id":2}
{"id":1}
{"id":4}
{"id":3}
```

特定のキーの値 (この場合は `id`) でソートして出力したい。

```json
{"id":1}
{"id":2}
{"id":3}
{"id":4}
{"id":5}
```

# 結論

```
$ jq 'sort_by(.id) | .[]' --slurp input.json
```

以下、やっていることの詳細を説明します。

## `sort_by`

ソートについて jq のマニュアルを調べると、 `sort_by` という関数が見つかります。

[sort, sort_by(path_expression)](http://stedolan.github.io/jq/manual/#sortsort_bypath_expression)

しかしこれは、今回やりたいことと微妙に異なるものです。
`sort` や `sort_by` は `Array` を入出力にするもので、たとえば以下のようにしてもエラーになります。

```
$ jq 'sort_by(.id)' input.json
jq: error: Cannot index number with string
jq: error: object and array cannot be sorted, as they are not both arrays
...
```

`jq` では連続する JSON をストリームのように受け取れますが、これはあくまでストリームであって `Array` ではありません。
とはいえ、これを `Array` に変換することができれば `sort_by` が使えそうです。

## `--slurp`

コマンドラインオプションの `--slurp` がまさに連続する JSON を `Array` にするためのものです。

つまり、通常以下のようになる入力であれば、

```
$ jq '.' input.json
{"id":5}
{"id":2}
{"id":1}
{"id":4}
{"id":3}
```

`--slurp` をつけると以下のようになります。

```
$ jq '.' --slurp input.json
[
  {"id":5},
  {"id":2},
  {"id":1},
  {"id":4},
  {"id":3}
]
```

※一部インデントを調整しています。

というわけで連続する JSON を `Array` にすることができたので、あとはこれを `sort_by` すればよいことになります。
出力が `Array` にくるまれてほしくないのであれば、さらに `| .[]` にパイプして `Array` の皮をむいて完成です。

# おまけ: jr ならもっと直感的にできるよ

拙作の [`jr`](https://github.com/yuya-takeyama/jr) であれば、より直感的に書くことが可能です。

```
$ jr 'sort_by(&:id)' input.json
```

`--slurp` オプション無しでできました。
(そもそも `--slurp` オプション自体ないんですが)

`jr` では連続する JSON を `Enumerable` として受け取るので、`Enumerable` が持つメソッドなら何でも適用することができます。
普段から Ruby を書いているかたであればオススメです。
wordpress 一覧出力でカスタムフィールドを条件にする

一覧の出力って、カテゴリとか投稿タイプだけかと思っていたのですが、カスタムフィールドも可能なんですね。
知らんかった。

以下はquery_postsを使用しており、（ほんとはダメなの分かってるけど）
「statusというカスタムフィールドがfinish以外またはtodayというカスタムフィールドが空白以外の時」の記述。

```
$args = array(
'meta_query' => array(array(
                            'key' => 'status',
                            'value' => 'finish',
                            'compare' => '!='
                        ),
						array(
                            'key' => 'today',
                            'value' => '',
                            'compare' => '!='
                        ),
						'relation'=>'OR'
					),

);

```

条件を増やす場合は、array（）を追加していけば良い。relationはANDとORが可能。



http://elearn.jp/wpman/column/c20110915_01.html
MongoDBの基礎


```text
随時追記していくかと思います。メモ程度の物なので不親切極まりないです。
参考にしていただければ幸いですが、参考にして不具合等が起きた場合、保障はできませんのであしからず。
間違い等あればご教授いただけると助かります。
```

# MongoDBとは
- NoSQL
- コレクションのメソッドを用いてCRUD操作をする
- 高度な結合操作を効率的に行うことは難しい
- データの追加/更新/削除処理は高速。
- １３言語に対して公式ドライバを提供している（非公式ドライバも大量に存在する）

# 名称について（RDBMSとの比較）
- Database
『Database』
- Table
『Collection』
- Record
『Document』
- Column
『Field』
- Primary key
『_id』

# インストール
[仮想環境にMongoDBを入れる](http://qiita.com/CyberMergina/items/402ca56cd3b9e318ce7a)

# シェルの立ちあげ(MongoDBが起動している状態で)
```shell-session:shell
$ mongo
```

# 基本的な操作（シェル上で）

## データベース

#### ＠ 一覧
```
show dbs
```

#### ＠ 選択/追加
```
use testdb
```

#### ＠ 削除
```
use testdb
db.dropDatabase()
```

## コレクション

#### ＠ 追加
```
db.createCollection("users")
```

#### ＠ 一覧
```
show collections
```

#### ＠ 削除
```
# コレクションを残し、データのみ削除
db.users.drop()
# コレクションごと、データ削除
db.users.remove()
```

## ドキュメント

### ＠ 登録
```
db.users.insert({name: "Cyber Mergina", age: 21})
```

### ＠ 更新
```
# db.users.update({WHERE条件}, {データ}※1, ※2, ※3)
db.users.update({_id: ObjectId("55c15b0199a76392e0a095p3")}, {name: 'CyberMergina', age: 22})
```

※1：データの部分は一部書き換えだとしても全て渡すようにしてください。
※2：WHERE条件に一致するデータが無ければinsertするかを *true* か *false* で指定
※3：WHERE条件に一致した全てのドキュメントを更新するかを *true* か *false* で指定

### ＠ 削除
```
db.users.remove({_id: ObjectId("55c15b0199a76392e0a095p3")})
```

### ＠ 検索

#### ＋ コレクションのデータを全て表示
```
db.users.find()
```

#### ＋ コレクションのデータを絞り込み表示

##### - 条件一つ
groupというフィールドに1を持っている

```
db.users.find({"group": 1})
```

##### - AND条件
groupというフィールドに1を持っている、かつageが20以下

```
db.users.find({$and: [{"group": 1}, {"age": {$lte: 20}}]})
```

##### - OR条件
groupというフィールドに1か3を持っている

```
db.users.find({$or: [{"group": 1}, {"group": 3}]})
```

##### - IN句
ageが18,20,25いずれかを持っている。
その逆は *$nin*

```
db.users.find({"age": {$in: [18, 20, 25]}})
```

##### - 比較演算子

| 名称 | 書き方 | 例 |
|---|---|---|
| 未満（age < 20） | $lt | {"age": {$lt: 20}} |
| 超過（age > 20） | $gt | {"age": {$gt: 20}} |
| 以下（age <= 20） | $lte | {"age": {$lte: 20}} |
| 以上（age >= 20） | $gte | {"age": {$gte: 20}} |
| 等しい（age == 20） | $eq | {"age": {$eq: 20}} |
| 等しくない（age != 20） | $ne | {"age": {$ne: 20}} |

##### - 並び替え
nameを昇順、ageを降順に並び替える

```
db.users.find().sort({ name : 1, age: -1 })
```

##### - 件数
全件検索。find句の後につけると絞り込み後の件数が取得できる。

```
db.users.count()
```
instance_evalの第2引数でファイル名を与える

Rubyで`BasicObject#instance_eval()`には第2引数にファイル名を渡すことができる。

### サンプルコード

例えばConfigクラスがあり、DSLで書かれたコンフィグファイルをロードするようなコードを書いたとする。

```ruby:config.rb
class Config
  def initialize
    @config = {}
  end

  def load
    instance_eval File.read('./conf/setting.rb')
  end

  def set(key, value)
    @config[key] = value
  end
  
  def fetch(key)
    @config[key]
  end
end
```

```ruby:conf/setting.rb

set :app, 'My App'
set :url, 'http://example.com'
set :log_leve, :info
```

```ruby:bin/runner
require_relative '../config'
config = Config.new
config.load
p config.fetch(:url) # => "http://example.com"
```

### サンプルコードの問題点

上のコードにはinstance_evalに関連して以下の問題がある

1. conf/setting.rbの中でユーザ(DSLを利用するユーザ)がタイポするとエラーメッセージが分かりづらい
2. conf/setting.rbの中でユーザが任意のコードを書き`__FILE__`ディレクティブを使うと動かない

1についてはconf/setting.rbの中でタイポしても、コンソールに表示されるエラーメッセージは```config.rb:7:in `instance_eval': undefined method `settt' for #<Config:0x007f8c6a88af88 @config={}> (NoMethodError)```こうなり一見どこでタイポしたか分からない。そうではなくタイポしたファイル名 + 行番号 conf/setting.rb:行番号 を表示してほしい

2についてはconf/setting.rbの中で`__FILE__`の値は`setting.rb`ではなくinstance_evalをcallした`config.rb`になってしまう。

そこでinstance_evalの第2引数にファイル名を渡しておけば良い。

```ruby:config.rb
class Config
  ..snip..
  
  def load
    path = File.expand_path('./conf/setting.rb')
    instance_eval File.read(path), path
  end

  ..snip..
end
Realmのマイグレーションでハマった【Relationship付きObject】


Relationship付きのRLMObjectのマイグレーションでハマった。

##環境

Objective-C版のRealmをSwiftから使っています。
**RealmSwiftじゃないのでご注意下さい。**

##データ構造

例えば、イベントを管理するアプリを作っていたとして

* Event
	* title:String
	* atendees:RLMArray\<Person>
* Person
	* name

という構造を以下のように変更しようとしてハマった。（実際にはありえない設計なのはご愛嬌）

* Event
	* title:String
	* names:[String]


##migration

データ構造を変更すると、SchemaVersionを上げてマイグレーションを書く必要があり、この場合は↓のようなmigrationブロックを書く必要があり、

```swift
RLMRealm.setSchemaVersion(version, forRealmAtPath: RLMRealm.defaultRealmPath()) { (migration, oldVersion) -> Void in
	if oldVersion < newVersion {
		migration.enumerateObjects(Event.className(), block: { (oldObject, newObject) -> Void in
		
			// ここにatendeesのデータをnamesに移行する処理を書いていく
			
		})
	}
})
```

atendeesは以下のように取り出すのですが、

```
let atendees = oldObject["atendees"] as RLMArray
```

このatendeesのnameプロパティを直感的に呼び出そうとして以下のようなコードを書くかもしれません。(というか自分はこうやって書いてた)

```
for atendee in atendees {
	let person = atendee as! Person // ここでキャストできないよとエラーがでる
	let name = person.name
}
```

それではどうやってnameを取り出すかというと

```
for atendee in atendees {
	let name = atendee["name"]
}
```

これだけでした。

今考えると最初からこう書けば良かったなって思うんですが、relationship付きのRealmObjectのマイグレーションの情報がなかったのでまとめました。

同じようにハマっている人の助けになれば！
libc6-devのバージョンでエラーが出てパッケージのアップデートができなくなった時の対処

# **2022/04/03 追記：**

コメント欄にある通り、この手順で環境を壊してしまうケースもあります。
実行に際しては、バックアップを取るなどの対策をお願いします。

また、本記事は 2015年に書かれた Ubuntu 12.04 向けの記事であり、それ以外の環境においてはもっと適切な方法があるかもしれません。

本記事はあくまで参考として見ていただき、実行についてはご自身の責任で実行していただけると幸いです[^1]。

[^1]: Qiita や Zenn など投稿型情報サイトの記事全般に言えることでもあります。

---

こんな時。

```
dpkg: dependency problems prevent configuration of libc6-dev:
 libc6-dev depends on libc6 (= 2.15-0ubuntu10.10); however:
  Version of libc6 on system is 2.15-0ubuntu10.12.
 libc6-dev depends on libc-dev-bin (= 2.15-0ubuntu10.10); however:
  Version of libc-dev-bin on system is 2.15-0ubuntu10.12.
```

ガチャガチャコマンド打っているとこんなメッセージも出てくるが、`apt-get -f install`では直らない。
```
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
```

結局、以下で対処できた。

```shell-session
sudo dpkg --purge --force-depends libc6-dev
sudo apt-get install -f
```

依存を断ち切って`libc6-dev`を削除することが必要のようだ。
我的第一次 airbnb 房东体验

从6-28到东京, 次日从中介那里拿到租房合同,然后周末拿到钥匙入住, 我就已经迫不及待的体验一把 airbnb, 因为作为咱们互联网人,谁还不想体验一下当今炙手可热的新创公司的服务模式呢. 事实上, 我为了能够体验到做客人的机会, 我来东京前就很巧的在 airbnb 上找到了离公司很近的一个房间. 房东是一个年轻小夫妇, 虽然房间不是很大,但是很日式那种. 虽然短短2天, 但是还是能够体验到在日本人的家庭中, 他们的一些生活小细节.

 在日本这边租房,和国内不一样的是, 在这里租房,他们都不给配基本家具家电的. 所以如果要想很快能够成为一个合格的房东把房子放到 airbnb 上出租, 还是需要购置很多的基本设施的. 其实不过吧这些东西也是我生活所需要的. 在陆陆续续通过网店实体店的购置, 在7月底, 基本上全活儿了. 该有的都有了. 而且我认为还是很不错的. 包括自己从宜家买桌子沙发来自己组装一切都是不错的体验.
 
其实在购置这些家具的同时,我已经开始在 airbnb 上添加编辑自己的房源了. 因为我没有多余的一个卧室, 是一个大约35平米的1LDK. 所以最多能够容纳2个人, 一个人最好的状态, 让他可以在沙发上休息. 沙发还是不错的, 取了靠背之后,长度宽度都是能够让你睡一个好觉的. 为什么我会 **不错** 呢?是因为我刚来这里的时候,住在那个小夫妇家里的时候就是这个条件. 他们没有沙发, 而是一个地铺,那种日式的垫子. 而且我的定价非常便宜! 在参考我之前的经历, 我定价是他们的半价.很巧, 在8月1号我买的家电最后一件电冰箱也到货了。我收到了一个订单。 但是我有点犹豫此时。为什么尼。 因为这个人不会英语， 而且是一个在日韩国人（不确定是否是朝鲜人，或者那些在日本这里做pachinko的主儿），不过尼 纠结着，这是第一个顾客啊。 而且我有点不安，有点不自信，再三去网站上确定了我的情况是否都有描述到了。我怕因为我有什么遗漏而这些正是人家在乎的，就怕人家来了之后说我老子骗他，这样就不好了。然后我就和他在网上通过官方的沟通方式前后沟通了几句。这样吧，来吧我接受了预订。

周六上午12点，他来了。taxi，好有钱的主儿吧。一个让我都感觉是老男人的男人！ 其实他丫的就是笨找不到路而已。 然后（此时我相信第一印象）进来拖鞋放下包就要走。而且说是晚上有可能不回来而第二天白天早上回来什么的。从表情和说话时候的气场，我就已经感觉这厮不怎么样了。 不过这些我都有预料，因为毕竟渣人很多，而且自己也很渣，两渣一起肯定各自看不过眼。然后有个情况就是我从中介那里只拿到了一把钥匙。然后后来和他们沟通的结果是房东就只有一把钥匙，需要的话自己去配， 好吧，这样就当场不能够给人家钥匙了。而且门口使用的邮箱不是那种密码拨号的，不然就直接扔那里好了。我说我今天不出家门，你回来肯定能够进来。

晚上11点左右他回来了，然后进门就说要取消后面3天的预订。此时我有点解放的感觉，好啊， 然后他不能够从airbnb上自己变更预订，需要打电话给客服，然后打通了之后日语的客服已经没有了，只有英语的。丫不会啊，好吧哥帮你。我和客服说我们双方已经同意的。取消后来3天的预订，只住今天一晚。好，我早早洗洗睡。让他自己搞吧， 给他空间。我在浴室里放了花王的泡澡的累死肥皂那种的泡腾片。好像人家不仅仅调节了我的温度设定还有bath的水量，好嘛 你丫真是什么都给我调了。

第二日早上起床，我出卧室，然后人家又说要再住一晚，尼玛搞什么，你丫想搞就搞？他说他直接私下给我钱， 这样不需要经过airbnb，然后钱全部可以到我这里。（尼玛，贼啊，不是日本人能够干出来的，果然是韩国人（丫韩国人没说尼））。我先是答应了，然后我去拉屎了。不过在拉屎的过程中，我想明白了一件事情。airbnb不是完全赚钱的事情吧， 这个应该按 **情怀** 来玩的，为什么我不喜欢这个老男人，而且还是要让他住呢， 我有病吧，我缺钱吗！拉完屎出去我就告诉他，今天让你继续住的事情（やっぱりダメが！）。在拒绝他之后就是一个爽子。10点你丫收拾东西走人吧。为什么你昨晚风风火火不住了，而早上又改主意？而为什么我写了交通方式你却说找不到打车？你火星来的?

恩，情怀。这很重要！
アイディアを投稿して、需要があるか調べられるサービスを作った



![スクリーンショット 2015-08-05 13.46.10.png](https://qiita-image-store.s3.amazonaws.com/0/36652/3097a66e-5427-d590-f2e2-c8727d9a2f8d.png)
![スクリーンショット 2015-08-05 13.44.12.png](https://qiita-image-store.s3.amazonaws.com/0/36652/eb07f021-ca75-a2e6-991b-93ff9aa51e7f.png)



アイディアを思いついて、それを作ろうとしたとき。そもそもそのアイディアがどれくらい需要あるのかを知れたら素敵だなーと思ってwebアプリ作りました。名前はiSeed。

「アイディアはあるけど、プログラミングのモチベが無い」って人の背中を押せればいいなと思ってます。

http://iseeds.tk/

※下の赤ボタンから投稿できます。

###相互フォロワー募集中
https://twitter.com/endows_takashi
SwiftでのlocalNotification

# 登録

```lang:swift
UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil))
```

#通知の登録
```
ndate = NSDate() // ndateには好きな時間をNSDate形式で指定
var notification = UILocalNotification()
notification.fireDate = ndate
notification.timeZone = NSTimeZone.defaultTimeZone()
notification.alertBody = "BODY" // 通知メッセージ内容
notification.alertAction = "OPEN" // ダイアログのボタンラベル
notification.soundName = UILocalNotificationDefaultSoundName
UIApplication.sharedApplication().scheduleLocalNotification(notification);
```
Ruby on Railsチュートリアル十章で起こったNoMethodErrorとその解決

###状況
Ruby on Railsチュートリアル第二版(ver4.0用)を、頭からほぼ手順通りに進めていたところ、[10章](http://railstutorial.jp/chapters/user-microposts?version=4.0#sec-dependent_destroy)で通るはずのテストが通らない問題が発生。

リスト10.13で

```ruby:app/models/user.rb
class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
	#中略
end
```

とモデルUserのレコードが消去されたときに関連するモデルMicropostのレコードを一緒に消去するコードを挿入し

リスト10.12のテスト

```ruby:spec/models/user_spec.rb
require 'spec_helper'

describe User do
  
  #中略
  
  describe "micropost associations" do

    before { @user.save }
    let!(:older_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
    end
    let!(:newer_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
    end
    
    #中略
    
    it "should destroy associated microposts" do
      microposts = @user.microposts.to_a
      @user.destroy
      expect(microposts).not_to be_empty
      microposts.each do |micropost|
        expect(Micropost.where(id: micropost.id)).to be_empty
      end
    end
  end
end
```

このテストを実行したところ以下のようなエラーが発生。

```
Failures:

  1) User micropost associations should destroy associated microposts
     Failure/Error: @user.destroy
     NoMethodError:
       undefined method `name' for nil:NilClass
     # ./spec/models/user_spec.rb:133:in `block (3 levels) in <top (required)>'

Finished in 4.82 seconds

88 examples, 1 failure



Failed examples:
```

コンソールからレコードの削除を試行錯誤をしてみたところ
リスト10.13のところで追記した
`dependent: :destroy`
ってところで詰まってる模様。


###とりあえず解決
んで、いろいろ調べた結果[このStackOverflowのページ](http://stackoverflow.com/questions/28545975/nomethoderror-in-cartscontrollerdestroy-agile-web-development-with-rails-4)に辿り着いた。

どうもRailsチュートリアルで指定されたRails4.0.5に含まれるActiveRecodeのバグらしい。

GemfileでRailsのバージョン指定を
`gem 'rails' '4.1.2'`
書き換えて、
ターミナルから
`bundle update rails`
とRailsをアップデートしたのち
`bundle exec rspec spec/`
とテストを実行したら無事成功しました。
EMRがsparkに標準対応したのでBootStrapActionから切り替えた


特に何も考えずに切り替えても動いたが、何故かジョブの実行時間がものすごく伸びた

調査するとbootStrapActionではspark-defaultに設定してくれていた以下の設定がaws標準だとなくなっていた


/home/hadoop/spark/conf/spark-default.sh

```
spark.executor.instances        5
spark.executor.cores    8
spark.executor.memory   9404M
spark.default.parallelism       40
```

stepを投入するスクリプトに手を入れて対応した。

```
STEP_ID=`aws emr add-steps --cluster-id $EMR_CLUSTER_ID --steps \
Type=CUSTOM_JAR,Name="$STEP_NAME",\
Jar=s3://ap-northeast-1.elasticmapreduce/libs/script-runner/script-runner.jar,\
Args=[\
/home/hadoop/spark/bin/spark-submit,\
--master,yarn-cluster,\
--driver-java-options,"-Dspark.akka.frameSize=128 -DXss=10m -Dspark.driver.maxResultSize=$DRIVER_MAX_RESULT_SIZE -Dspark.executor.instances=$EXECUTER_INSTANCES -Dspark.default.parallelism=$DEFAULT_PARALLELISM",\
--driver-cores,$DRIVER_CORES,\
--driver-memory,$DRIVER_MEM,\
--executor-cores,$EXECUTER_CORES,\
--executor-memory,$EXECUTER_MEM,\
--conf,spark.hadoop.validateOutputSpecs=false,\
--class,$MAIN_CLASS,\
"$JAR_NAME","$ARGS"],\
ActionOnFailure=CONTINUE --query 'StepIds[0]' --output text`
```
[MongoDB .NET Driver] Indexes.CreateOneAsync sample

##2.0 .NET Driver
`the driver is 100% async down to the lowest level`
根據官網說明
底層100%實作async的方法

##Environment Version
* .NET 4.5

* MongoDB 3.0

##Initialization
```csharp
var client = new MongoClient(connectionString);
var db = client.GetDatabase(databaseName);
```

##Mapping Class
假設Collection是用來儲存會員資料
Mapping Class設計如下

```csharp
public class Member 
{
    public ObjectId Id { get; set; }

    public string PersonId { get; set; }

    public string Name { get; set; }

    public int Gender { get; set; }

    public string Phone { get; set; }

    public int ZipCode { get; set; }

    public string Address { get; set; }
}
```

##Single Index
假設查詢PersonId次數很頻繁
則可以對PersonId建立升冪[^1]的index

```csharp
var singleIndex = await db.GetCollection<Member>(colName).Indexes.CreateOneAsync(Builders<Member>.IndexKeys.Ascending(_ => _.PersonId)).ConfigureAwait(continueOnCapturedContext: false);
```

##Combine Index
假設需要查詢某地區特定性別的會員
則可以對Gender及ZipCode建立升冪[^1]的複合index

```csharp
var combineIndex = await db.GetCollection<Member>(colName).Indexes.CreateOneAsync(Builders<TaMember>.IndexKeys.Combine(
    Builders<Member>.IndexKeys.Ascending(_ => _.Gender),
    Builders<Member>.IndexKeys.Ascending(_ => _.ZipCode))).ConfigureAwait(continueOnCapturedContext: false);
```

[^1]: 降冪則改寫為IndexKeys.Descending即可
Redmineに入れるテーマ

Redmine は 2.5.2 を利用しています。

日本語が変に表示されないようであれば、じゃんじゃん入れます。
Redmine Theme Changer plugin を利用しているので、メンバーに選ぶ楽しさを提供することを優先しています。

* Alternate
* Basecamp-with-icon
* Classic
* Coffee
* Farend fancy
* Flatly light
* Gitmike
* Metro redmine
* Minimalflat
* Railsgun
* Red-Andy


日本語フォントがイマイチな時はapplication.css のbody のfont-family を修正します。
メイリオを入れておけば、なんとなくイイ感じになります。
Swift初心者メモ    ボタンおしたらアラート表示

window.alert("アラート！");
「わあ プログラミングっぽい」

はじめてjsでアラートを出した時の感動を今でも覚えています。

iOSでもアラートを出したい。
そう思ったのでボタンおしたらアラートをやってみました。

```swift:ViewController.swift

import UIKit

class ViewController: UIViewController {

    func showAlert() {
        
        // OSのバージョンを取得
        let VERSION: Float = (UIDevice.currentDevice().systemVersion as NSString).floatValue

        // 8.0以上の場合
        if VERSION >= 8.0 {
            let alertController = UIAlertController(title: "タイトル", message: "ここにメッセージ", preferredStyle: .Alert)

            // OKボタン
            let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
            alertController.addAction(defaultAction)
            self.presentViewController(alertController, animated: true, completion: nil)
        }
 
        // それ以外
        else {
            let alert = UIAlertView()
            alert.title = "タイトル"
            alert.message = "ここにメッセージ"
            alert.addButtonWithTitle("OK")
            alert.show()
        }
    }

    // ボタンつくって接続しとく
    @IBAction func OnClickBtn(sender: AnyObject) {
        showAlert()
    }


    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.showAlert()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}
```
【備忘録】@mixinの宣言で#{}が使えない

```scss

@each $key, $value in $hoge {
  @mixin #{$key}-size {
  }
}

```

みたいなコードが書きたいけど書けない。
というより、`@mixin`に`#{}`で指定するとエラーが出る…。
`@media`とか一部は対応しているようですが、`@mixin`に1番欲しい…。

さてどう対応するか…。
legendやfacet_*のラベルの表示を変えたい

# Q.
legendのラベル（図中のAの部分）やfacet_*のラベル（図中のBの部分）を短く変えたいのですが、どうすればよいでしょうか？

```example.R
library(ggplot2)

ggplot(data=iris, aes(x=Petal.Length, fill=Species)) + geom_histogram(alpha=0.4, position="identity")
ggplot(data=iris, aes(x=Petal.Length)) + geom_histogram(position="identity") + facet_grid(Species ~ .)
```

![example.png](https://qiita-image-store.s3.amazonaws.com/0/12869/541187a8-cb4b-cab4-f3dc-b6518415fa78.png)

# A.
`levels`関数を使ってfactorのlevelの名前（level attribute）を変えます。

```OK_example.R
library(ggplot2)

levels(iris$Species)
# [1] "setosa"     "versicolor" "virginica"
levels(iris$Species) <- c("S", "Ve", "Vi")

ggplot(data=iris, aes(x=Petal.Length, fill=Species)) + geom_histogram(alpha=0.4, position="identity")
ggplot(data=iris, aes(x=Petal.Length)) + geom_histogram(position="identity") + facet_grid(Species ~ .)
```

`levels(x)`では今のlevel attributeが取得されます。このlevelの順序は保持したまま、表示名を変えるには`levels(x) <- value`を使います。詳しくは`levels`関数のヘルプをみてください。結果は以下になります。
![OK.png](https://qiita-image-store.s3.amazonaws.com/0/12869/1067af2d-ab0d-3286-36a3-0ea40d49d9bc.png)
ちなみに表示名ではなくて表示順序を変えたい時は「[x軸を並べ替えたい](http://qiita.com/kazutan/items/7840f743d642122d1219)」を参考にしてください。

# 参考資料
http://stackoverflow.com/questions/3472980/ggplot-how-to-change-facet-labels
LaravelにフォームからPUT/DELETEリクエストを送る

LaravelのRESTfulなルーティングにたいして、フォームからPUTやDELETEメソッドでリクエストを発行する必要がある。このときformタグのmethodにPUTやDELETEを指定しても、HTML formがそもそもこれらのメソッドに対応していないため、リクエストを発行できない。

```だめな例
<form method="put" action="/sample/100">
    <input type="text" name="name" />
    <input type="submit" />
</form>
```

こういうときは、formではPOSTメソッドを指定して、hiddenで_methodプロパティを投げれば良いらしい。

```いける例
<form method="post" action="/sample/100">
    <input name="_method" type="hidden" value="PUT">
    <input type="text" name="name" />
    <input type="submit" />
</form>
chef-solo実行までのまとめ

AWS上に構築したAmazon Linux上でchef-solo実行までのまとめ。

動作環境

* OS：Amazon Linux 2015.03.0 x86_64 HVM 

## chefのインストール

chef、chef-soloがインストールされます。

```bash
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
```

## knife soloのインストール

chef-solo実行のためにknife soloをインストールします。

```bash
$ sudo /opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc
```

## chefリポジトリ作成

```bash
$ knife solo init chef-repo
```

## cookbook作成

```bash
$ knife cookbook create hello -o chef-repo/site-cookbooks
```

## レシピの編集

レシピにログの出力を設定

```bash
$ vi chef-repo/site-cookbooks/hello/recipes/default.rb
log "Hello"
```

## solo.rbを作成
cookbookのパスなどを設定するためのファイルを作成します。
今回のレシピはsite-cookbooks配下に作成したので、site-cookbooksを参照する設定にします。
site-cookbooksまでのパスは自分の環境に合わせて設定してください。

```bash
$ vi chef-repo/solo.rb
cookbook_path ["/home/ec2-user/chef-repo/site-cookbooks"]
```

## chef-soloを実行するjsonを作成
chef-soloを実行するターゲットの設定ファイルを作成します。

```bash
$ vi chef-repo/nodes/chef.json
{
  "run_list": [
    "recipe[hello]"
  ]
}
```

## chef-solo実行
```bash
$ sudo chef-solo -c chef-repo/solo.rb -j chef-repo/nodes/chef.json
```

実行結果に log[Hello] action write が出力されていれば成功です。
これでchef-soloの実行環境が構築できたので、必要なレシピを作成して実行してください。
RHELでisoからyumを行う方法

#Yumさせろ！！

RHELはライセンスを買うか、評価版を入手しない限り`yum`が使えません。

インストールの時に、RPMパッケージを入れ忘れるととても最悪なことになり、手動で依存関係を解決する羽目になります。


しかし、今回のテクニックを使えば、ISOイメージにたいして`yum`をすることができます！

もう依存関係に悩む必要はありません！


##1.ISOを用意

ISOをマシンにマウントしましょう。物理マシンの方はメディアを挿入するか、isoイメージをOS上に用意しましょう。

仮想マシンの方は仮想ホストにisoイメージを割り当てるか、isoイメージをOS上に用意しましょう。

※インストールに使ったやつですよ


##2.ISOをマウント

###マシンに割り当てている場合

```bash
mount /dev/cdrom /media
```
マウントポイントや、ディスクの割り当てられている場所が違う場合は環境によって変更して下さい。


###ISOをマウントする場合

```
mount -o loop -t iso9660 xxx.iso /media
```

いずれも`ls /media`直下にファイルが見えれば成功です。


##3.リポジトリ追加
viで`/etc/yum.repos.d/dvd.repo`を作成・編集します。

```vi:/etc/yum.repos.d/dvd.repo

[dvd]
name=dvd
baseurl=file:///media/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
```


##4.yumします

```
yum search zsh

[root@ ~]# yum search zsh
読み込んだプラグイン:langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
dvd                                                                                | 4.1 kB  00:00:00
(1/2): dvd/group_gz                                                                | 134 kB  00:00:00
(2/2): dvd/primary_db                                                              | 3.4 MB  00:00:00
============================================ N/S matched: zsh ============================================
zsh.x86_64 : Powerful interactive shell

  Name and summary matches only, use "search all" for everything.
```

はい！成功しました！
プロセスをループさせたときの対処方法

なんかラッパー的なシェルスクリプトを作ろうとして、うっかり

```bash:wrapper.sh
#!/bin/sh

./wrapper.sh
```

と自分自身を再帰呼び出しするように書いて、ループさせてしまったときの対処方法。

```shell-session
% ps -f
kawasima 4001 4000 ./wrapper.sh
kawasima 4002 4001 ./wrapper.sh
kawasima 4003 4002 ./wrapper.sh
kawasima 4004 4003 ./wrapper.sh
kawasima 4005 4004 ./wrapper.sh
・・・
% kill 4000
```
親プロセスを追っかけて、killしてもダメ。やつらはどんどん増殖するぞ!

.
.
.
.
.
.

おちついて、wrapper.shの方を書き換えましょう。

```bash:wrapper.sh
#!/bin/sh

#./wrapper.sh
```
Pacemaker/Heartbeat環境でVIPが切り替わらないケースと対応

---

同様の事象にハマった先人の教えが全くそのままであった・・・。

　→　http://mokky14.hatenablog.com/entry/2014/08/01/044235

---
■原因

構築時に動作確認として以下を実施していたため。

    crm resource move VIP ホスト名 force　→VIP強制移動
    crm resource move VIP ホスト名 force　→VIP強制移動

これを実行すると

    WARNING: Creating rsc_location constraint 'cli-standby-vip' with a score of -INFINITY for resource vip on host1
            This will prevent vip from running on host1 until the constraint is removed using the 'crm_resource -U' command or manually with cibadmin
            This will be the case even if 0270-host1 is the last node in the cluster
            This message can be disabled with -Q

と出る。
そして以下の location 定義が追加される。

    crm configure show
    ：
    location cli-prefer-VIP VIP \
            rule $id="cli-prefer-rule-VIP" inf: #uname eq tomi-test-001
    location cli-standby-VIP VIP \
            rule $id="cli-standby-rule-VIP" -inf: #uname eq tomi-test-001
    ：

このlocationの定義があると
tomi-test-rediss001には絶対にVIPは切り替わらない(-inf)ことが分かった。

---
■修復方法

location 定義を以下のコマンドをマスタ or スレーブどちらかで発行して消す。

    crm resource unmigrate VIP

---
■今後の再発防止策

まず今後は以下のコマンドは使わないことにする。

    crm resource move VIP <host名> force

その代わりに構築時にVIPが切り替わるか確認するために

    /etc/init.d/heartbeat stop
    もしくは
    OS再起動

を実施したほうが良さそうだ。

※コマンドでnodeを操作することもできるので参考まで。(現実的な障害想定ではない)
1)マスタ落ちた想定(standbyステータスにする)

    crm node standby <マスタホスト名>
　　→VIPがスレーブに切り替わる
　　
2)マスタ復活想定(onlineステータスにする)

    crm node online <マスタホスト名>
　　→VIPはスレーブのまま

3)スレーブ落ちた想定(standbyステータスにする)

    crm node standby <スレーブホスト名>
　　→VIPがマスタに切り替わる

4)スレーブ復活想定(onlineステータスにする)

    crm node online <スレーブホスト名>
　→VIPはマスタのまま

---

本当に冒頭の先人の方の記事は助かりました。感謝。
Interface Builderでconstraintに0.5刻みの値を設定する

:warning: **Xcode 8** からsize inspectorなどでも普通に0.5刻みの値を使えるようになりました。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ようやく、よーやく！ Interface Builderで座標の値に0.5が使えるようになった。</p>&mdash; Shingo Sato (@gonsee) <a href="https://twitter.com/gonsee/status/775958085877719044">September 14, 2016</a></blockquote>

以下は古い情報ですのでご注意ください。

----

StoryboardやxibをInterface Builderで編集するとき、ビューの座標に0.5刻みの値を使いたいことがあると思います。例えばセルに高さ0.5の罫線を乗せたいときなどです。こういう場合に、右カラムのsize inspectorでheightに0.5と入れても1に切り上げられてしまってうまくいきません。

しかしAuto Layoutのconstraintに限っては、AlignやPinから0.5刻みの値を設定することができます。

![IBTips101.png](https://qiita-image-store.s3.amazonaws.com/0/32084/87433eea-aa5f-14a5-6f29-31ff87499532.png)

これで高さ0.5のconstraintが設定できました。

![IBTips102.png](https://qiita-image-store.s3.amazonaws.com/0/32084/bdd1482c-7ef7-ae32-be17-f0993d4d062c.png)

ただしsize inspectorでは相変わらず0.5刻みの設定ができないので、Editを押すと0にまるめられてしまいます。

![IBTips103.png](https://qiita-image-store.s3.amazonaws.com/0/32084/07106f23-0a60-528a-a8a5-c616fee9703f.png)

また、constraintで高さ0.5としながらもframeの高さは0になっていることに注意してください。この状態でも制約は満たされていると見なされるようで、misplacedの警告は出ません。frameの方に0.5刻みの値が入ってしまうと、次回このファイルを開いたときに勝手にまるめられてしまいます。

特に複数人で開発しているときなど、これによって意図せぬ差分が出てしまうので注意が必要です。

![IBTips104.png](https://qiita-image-store.s3.amazonaws.com/0/32084/7e2f9dc3-1360-2191-8696-dddcb96aaa7b.png)
Swift初心者メモ    Storyboardのsegueで遷移した画面に値を渡すす

segueを使って画面遷移できたけど、値を引き継ぎたい時のメモ

FirstViewController
↓
SecondViewController

にtextFieldの値を渡す想定

(ドットインストール参考)

※prepareForSegueというメソッドを使って渡すらしい
※segueのidentifierに名前つけとく 今回は(SecondView)

```swift:FirstViewController.swift
import UIKit

class ViewController: UIViewController {

    // テキストフィールド
    @IBOutlet weak var textField: UITextField!
    
    // このメソッドで渡す
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

      if segue.identifier == "SecondView" {

        let secondViewController:SecondViewController = segue.destinationViewController as SecondViewController

        // 変数:遷移先ViewController型 = segue.destinationViewController as 遷移先ViewController型
        // segue.destinationViewController は遷移先のViewController
        
        secondViewController.sendText= self.textField.text
      }
        
    }

}
```



```swift:SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {
        
    // ここで受け取る
    var sendText:String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        println(sendText)
    }
}
```
[デザイナー向け］iOSアプリ用の素材をPDFで納品してみよう！

# なぜそうするのか
1. 現状、PNGで素材を納品している場合、1x・2x・3xで素材を納品している地味にちょっと大変！
* Xcode6から、Assets CatalogにPDF（ベクター素材）を設定できるようになった（らしい）！
* つまり、**1種類のサイズを用意すればいい！**やってみよう！

# 作成方法
ベクターで書きだす必要があるため**Illustratorで作成**
![20eb4b09a9693dc5a8620a3dea4ca80e.png](https://qiita-image-store.s3.amazonaws.com/2138/68771/2b80cfd1-d097-9b4e-b81d-c41c65ee968b.png)


## 注意点（結構多いよ）
1. **1x（見えるそのままのサイズ）**で作成する。
2. アートボードサイズを意識する。**アートボードがそのまま画像サイズ**になります。
![4a4fbc85ae3be42051fdc4580f738433.png](https://qiita-image-store.s3.amazonaws.com/2138/68771/a853df5a-863d-784f-de2e-37c5e18dbff7.png)
（↑正方形にしたいときはこう）

3. **トンボは付けない。**トンボの分も画像サイズに含まれるというミスを経験。
4. PDFで保存する際の設定で、**Illustratorの機能を保持を外す。**容量軽減対策です。
 ![7b3506b19ecede3fc8270c243d7c0a61.png](https://qiita-image-store.s3.amazonaws.com/2138/68771/6e127e85-fdff-e8f5-8c78-e3da16486394.png)


# PDFで書きだすのに最適な素材は？
ここまで読んでお気づきだと思われるのですが、PDFに書き出した素材は、**単純に拡大縮小して使われる**ということです。
そのため、「横方向だけに素材を伸ばしたい！」のように、**9patch的使われ方とは別**です。**縦横比固定で使われる想定のもの限定**で利用がマストです！

また、Photoshopのレイヤー効果等の複雑な加工が出来ないため、フラットなデザインのものに最適です。

ナビゲーションで使うアイコンやロゴはPDFで納品、その他の素材はPNGで納品と**使い分けるとことおすすめ**します！
![8587411053326e96b554b663d086035b.png](https://qiita-image-store.s3.amazonaws.com/2138/68771/9f803c7e-1308-26ad-c030-365561cb1e6f.png)

![503710fd6a2ba41afef4656146ce23a8.png](https://qiita-image-store.s3.amazonaws.com/2138/68771/60bfc3fc-6a21-c54d-28ba-090f9599b491.png)

# まとめ
1. 素材をIllustratorで1xサイズで作成
2. PDFで書き出し
3. 完了！サイズ展開は必要ない！Happy!

最初にアプリデザインを始める段階から、**UIデザインはPhotoshop**で行い、**Illustratorで作成したアイコン**等のモチーフを**スマートオブジェクト（またはリンクを配置）で配置**すると、とても便利です！

※まだ、実験途中なので今まで通りPNGのみでも構いません！
Google Maps API のロードで HTTPステータス404 となってしまうバグを回避する

昨日から、Google Maps Javascript APIを使用しているWebページで突然地図が表示されなくなってしまい調査を続けておりましたが、やっと解決したので情報共有します。

結論から言うと、ロードするAPIのドメイン名を https://maps-api-ssl.google.com から  https://maps.googleapis.com/ に変更することで元通り正常に動くようになりました。

まさに問題が発生したのとほぼ同時刻に下記のエントリーが出てました。
[Bug: Google JavaScript API over SSL failing with a 404 errror](https://code.google.com/p/gmaps-api-issues/issues/detail?id=8431)

問題発生時にChromeのデバッガで確認すると、ロード途中で他のjsを読み込もうとしているがそのファイルが存在しない状態になっているようでした。この辺りを手掛かりに上記リンクになんとかたどり着けました。
>Failed to load resource: the server responded with a status of 404 (OK)
gmaps:1 Uncaught TypeError: Cannot read property 'prototype' of undefined
taxicall:1 Uncaught TypeError: google.maps.MVCArray is not a function
taxicall:1 Uncaught TypeError: google.maps.LatLng is not a function

もしお困りの方がいらっしゃいましたら、ご参考になれば幸いです。
[デザイナー向け］UIデザインをするときに参考にするサイト

# 概要
- UIデザインを行う上で参考にしているサイトをまとめました。
- 追記したら更新記録に載せます

# 更新記録
- 2015/06/04 記事を作成しました

# コミュニティ系
- https://dribbble.com/
- https://www.behance.net/
- http://jp.pinterest.com/
- https://www.designernews.co/

# UI design
- http://uxplore.francescobalducci.com/
- http://pttrns.com/
- http://www.mobile-patterns.com/
- http://www.lovelyui.com/
- http://www.mobilemozaic.com/
- http://capptivate.co/
- http://www.materialup.com/
- http://littlebigdetails.com/
- http://useyourinterface.com/

# UI design （Apple Watch）
- http://watchaware.com/watch-apps
direnvを使ってgitのユーザ名とメールを切り替え

[gitのuser.nameとuser.emailを会社/個人で自動的に切り替える方法](http://qiita.com/fmy/items/653557279c2209a1bc88) を見て。

`direnv`を使って`.envrc`に以下のようにしておけば、簡単に切り替えられます。

```bash
if has git; then
    git config user.name "Isao Sugimoto"
    git config user.email "d6rkaiz@gmail.com"
fi
```

`has` についてはdirenvをインストールしていれば使える関数です。