OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift] Property のベストプラクティスを考える

## これはなに
Swift には Property という機能があります。それにより setter/getter が手軽に書けるようになりました。
どのようにしたら可読性に優れ、簡潔になるかを考えてみたという記事です。

## Property とは
公式ドキュメント：https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html
Swift は相変わらず公式ドキュメントが読みやすくてよいですね。

Objective-C でも property はありましたね。プロパティ宣言をよくしていたと思います。

```:Objective-C
@interface Hoge: NSObject {
    NSString *_string = @"";
}
@property (nonatomic, strong, getter = getString, setter = setString:) NSString *string;
@end

@implementation Hoge: NSObject
- (NSString*) getString {
    return _string;
}

- (void) setString: (NSString*) newValue {
    _string = newValue;
}
@end
```

まあここまで明示的に書くことはなかなかないですが、Objective-C ではプロパティ宣言で getter/setter を指定していました。
読み取り専用の場合は **readonly** をつけたりしましたね。

全く同じものは、Swift では以下のように書くことができます。

```:Swift
class Hoge {
    var _string = ""
    var string: String {
        get {
            return _string
        }
        set {
            _string = newValue
        }
    }
}
```

まあこれだと、「なんだかカッコつけたようになったな」という感想があると思います。

### それって、これで済むよね

```:Swift
class Hoge {
    var string = ""
}
```

Objective-C のプロパティ宣言で getter/setter の記述を省略できるのと同じように、 **getter/setter で代入、取り出し以外の操作をしないならば** プロパティを使う必要はないと思います。

## プロパティを使いたい場面

- setter にもう一手間加えたい

例えば、代入されたらそれを NSUserDefaults に保存したいとき。

```:Swift
class Hoge {
    var _string = ""
    var string: String {
        get {
            return _string
        }
        set {
            _string = newValue
            NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "string")
        }
    }
}
```

おお、これだとわざわざ setter を書いた意味がありそう。

### でもそれって、これで済むよね（二回目）
```:Swift
class Hoge {
    var string: String = "" {
        didSet {
            NSUserDefaults.standardUserDefaults().setObject(string, forKey: "string")
        }
    }
}
```

Property には、 `didSet`, `willSet` というセット直後・直前に呼ばれる場所を定義することができます。
だから、 setter に一手間ならば `didSet`, `willSet` でやればいいですね。

## getter/setter を本当に使いたいケース
### readonly な変数

```:Swift
class Hoge {
    var string: String {
        get {
            return "hoge"
        }
    }
}
```

このように、getter のみを記述すればその変数は readonly となります。
この記法だとカッコが多いので、以下のように省略できます。また [GitHubのスタイルガイド](https://github.com/github/swift-style-guide#prefer-implicit-getters-on-read-only-properties-and-subscripts) で可読性とコード行数の観点から省略形が推奨されています。

```:Swift
class Hoge {
    var string: String {
        return "hoge"
    }
}
```


### 他の変数と組み合わせて使う

```:Swift
class Rect {
    var width: Float = 0
    var height: Float = 0
    var area: Float {
        return width * height
    }
}
```

この場合は `area` はクラスの他の2変数から常にかけ算の結果を返します。また、readonly なので安心です。


## まとめ

Swift の Property は Objective-C のそれと比べ読みやすく、わかりやすくなっていると感じます。
また複数の方法で同じ処理を実現することができます。
なので、いつも同じ書き方、ではなく状況に応じて最も読みやすく、簡潔な書き方を心がけていきたいものです。
(greenrobot)EventBus3ではAnnotationで指定するようになるらしい


のっけから余談が混じってるんですが、先日greenrobotのEventBus用のPluginを公開しました。

[eventbus-intellij-plugin](https://github.com/kgmyshin/eventbus-intellij-plugin)

postしているところからonEventやonEventMainThreadに、またその逆方向にサクサク飛べるというものです。(ottoの方は前からありましたよね)

![](https://raw.githubusercontent.com/kgmyshin/eventbus-intellij-plugin/master/art/cap.gif)

で、公開した後に、greenrobotのgithubを見に行って気づいたのですが、 **Annotation** 形式になるみたいですね。

(いきなり作ったpluginが葬られるやないか。。)

ということで本題です。

EventBus3で実際どういう風に変わるのか調べたので、紹介します！


## 導入方法

まだbetaです。いま使ってみたいという方向け。

```build.gradle
    compile 'de.greenrobot:eventbus:3.0.0-beta1'
    provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'
```


## どう変わるのか？

#### onEvent

これが

```EventBus3より前
public void onEvent(MyEvent event) {
  // 
}
```

こうなります。

```EventBus3
@Subscribe
public void hanlde(MyEvent event) {
  //
}
```

#### onEventMainThread

これが

```EventBus3より前
public void onEventMainThread(MyEvent event) {
  //
}
```

こうなります。

```EventBus3
@Subscribe(threadMode = ThreadMode.MainThread)
public void handle(MyEvent event) {
  //
}
```

#### registerSticky

これが

```EventBus3より前
{ registerSticky(this); }
 
public void onEvent(MyEvent event) {
  //
}
```

こうなります。

```EventBus3
{ register(this); }
 
@Subscribe(sticky = true)
public void handle(MyEvent event) {
  //
}
```

## とはいえまだまだ開発中みたい

Droidconでbeta1を発表したばかりでまだ開発中らしいです。
詳細は下記から。

- http://androiddevblog.com/eventbus-3-droidcon/
- http://androiddevblog.com/wordpress/wp-content/uploads/EventBus3.pdf

## 最後に

EventBus3用にも作りました。

[eventbus3-intellij-plugin](https://github.com/kgmyshin/eventbus3-intellij-plugin)

![](https://raw.githubusercontent.com/kgmyshin/eventbus3-intellij-plugin/master/art/cap.gif)


## ちなみに

同じイベントを2つSubscribeしておくと、どっちにも飛んでくるみたいです。

```
    @Subscribe
    public void handleAEvent1(AEvent event) {
        //
    }

    @Subscribe
    public void handleAEvent2(AEvent event) {
        //
    }
```

さらに、いままでの指定の仕方では無反応でした。

```
    public void onEvent(AEvent aEvent) {
        //
    }

```
xibで作ったCustomViewをStoryboardで使う

(2015/6/30) CustomViewをCustomViewにaddSubviewしてる状態になってたので、[こちらの記事](http://qiita.com/gonsee/items/230cea1ee511d54b3e85)を参考に修正しました。

## CustomViewの作成

```objc:CustomView.h
#import <UIKit/UIKit.h>

@interface CustomView : UIView

@end
```

```objc:CustomView.m
#import "CustomView.h"

@interface CustomView () 
//xibのViewをこのプロパティに紐づける
@property (strong, nonatomic) IBOutlet UIView *contentView;

@end

@implementation CustomView

- (void)commonInit {
  NSString* className = NSStringFromClass([self class]);
  [[NSBundle bundleForClass:[self class]] loadNibNamed:className owner:self options:nil];

  self.contentView.frame = self.bounds;
  [self addSubview:self.contentView];
}

- (instancetype)init {
  self = [super init];

  if (self) {
    [self commonInit];
  }

  return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
  self = [super initWithCoder:aDecoder];

  if (self) {
    [self commonInit];
  }

  return self;
}

- (instancetype)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];

  if (self) {
    [self commonInit];
  }

  return self;
}

@end
```

## xibの作成
`CustomView.xib`という名前でxibを作成します。

![create_xib.png](https://qiita-image-store.s3.amazonaws.com/0/38151/55adee68-2a8b-d3ce-7df9-a7a18c434697.png)

xibがloadされてることを確かめやすいように、UILabelを一つ配置しときましょう。

`CustomView.xib`
![xib_label.png](https://qiita-image-store.s3.amazonaws.com/0/38151/5344755b-1c07-a9ac-7dd5-84c8ae18167e.png)

## xibのViewを, contentViewに紐づける
CustomView.xibでViewを選び、CustomView.mのcontentViewプロパティに接続しておきます。
![20150630162751.png](https://qiita-image-store.s3.amazonaws.com/0/38151/fa542ab5-7083-4274-d412-9c0c219e5819.png)


## xibのFile's OwnerをCustomViewに設定する
CustomView.xibでFile's Ownerを選び、IdentityInspectorでCustom Classを`CustomView`にします。
![inspector.png](https://qiita-image-store.s3.amazonaws.com/0/38151/84b71c3d-ccc0-a619-0c34-498526d1a5a4.png)

## Storyboardへの配置
Main.storyboardで、ViewControllerにUIViewを貼っつけて、Custom ClassにCustomViewを設定します。
四辺にConstraintも設定しときましょう。
(見やすくするため、親viewを灰色にしてます)

![main_sb.png](https://qiita-image-store.s3.amazonaws.com/0/38151/68557e20-04a9-1fe5-0e4b-5b34bfb690f8.png)

## 動作確認
Runすると、ちゃんとLabelが貼りついていて、xibがロードされていることがわかります。

![iOS Simulator Screen Shot Jun 8, 2015, 9.30.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38151/9a68ab3a-b987-9e2e-87f8-f3a33cf2c467.png)
ListView⇒RecyclerViewの置き換えメモ

ListViewをRecyclerViewに置き換えるときのメモです。

だいたいこんな風に置き換えればよさそう。

|ListView|RecyclerView|
|---|---|
|ListView.setSelectionFromTop(pos, offset)|LinearLayoutManager.scrollToPositionWithOffset(pos, offset)|
|ListView.getFirstVisiblePositionなど|LinearLayoutManager.findFirstVisibleItemPositionなど|
|setFastScrollEnabled|自作するしかなさそう([参考](http://stackoverflow.com/questions/26450683/android-l-fast-scroll-for-the-recyclerview))|

onItemClickとかonItemLongClickは実装方法が色々あるのでググればいいと思う。
自分は RecyclerView.Adapter#onCreateViewHolder 内で inflate した view に直接貼った。
Linux(CentOS) P2V KVM化

# 概要
物理サーバ（普通のLinuxサーバ）をkvmのゲストサーバ化する。
変換元サーバのOSイメージを
稼働先KVMホストにネットワーク経由で転送する。
※当然出力先を変更すれば、ローカル内やDASに保存も可能

# 前提条件
稼働先KVMホストで既にkvmを動かせる環境であること。

# 対象
変換元サーバ ：Linuxサーバ（RedHat系/centOS 4/centOS 5)
稼働先KVMホスト：Linuxサーバ（centOS 6系）


# 前準備
kvm化した後、コンソール接続できるように
予め変換するサーバで設定ファイルを追記する。
以下の3箇所を追記することにより virsh console が可能になる。

```linux:追記
vi /etc/inittab
+ co:2345:respawn:/sbin/agetty ttyS0 9600 vt100-nav
```



```linux:追記
vi /etc/securetty
+ ttyS0
``` 

```linux:追記
vi /etc/grub.conf
(hiddenmenuの下に追加)
 + serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
 + terminal --timeout=5 serial console
```

# OSシャットダウン

```linux:command
shutdown -h now
```

# イメージ吸い出し・転送

シングルユーザモードで起動する。
（レスキューCDを入れてブートが可能であればそれがベスト）

```linux:command
/etc/init.d/network start
/sbin/ifconfig
```

```linux:command
df -k
``` 
で表示されるファイルシステムを転送する

```linux:command
dd if=/dev/sda | ssh root@稼働先KVMホスト " dd of=/転送先ディレクトリ/server.sda.img"
dd if=/dev/sdb | ssh root@稼働先KVMホスト " dd of=/転送先ディレクトリ/server.sdb.img"
``` 

DISKを全て読み込むので長時間かかる。
# バックグラウンドへ移す
長時間かかるため、万が一回線が切れた事を考慮してバックグラウンドに移すとよい。

```linux:command
ctrl + z
jobs
bg 1
```


# 設定ファイル作成
http://think-t.hatenablog.com/entry/20130224/p2
が参考になる。


# KVMイメージ起動
稼働先KVMホストにログインする。

```linux:command
virsh define 設定ファイル
virsh start 定義した仮想サーバ名 --console
``` 

# 注意事項
KVM化した後、稀に物理サーバの時のmacアドレスを保持し続けて
ネットワークに接続できなくなることがある。
その際は以下のファイルを削除する。

centOS 4,5,6系の場合
以下のファイルを念のためバックアップ取得して削除する。

``` command
cp -p /etc/udev/rules.d/70-persistent-net.rules /tmp/.
:>/etc/udev/rules.d/70-persistent-net.rules
``` 

# 余談
今回、イメージの吸い上げはddコマンドで行っているが、このddコマンドは何かと便利である。
ddコマンドの他の便利な使い方について、以下参照。
https://tsukada.sumito.jp/2018/09/14/linux-mac%E3%81%A7%E5%A5%BD%E3%81%8D%E3%81%AA%E5%AE%B9%E9%87%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/
X = 4.3 - 4.2　このとき、Xの値は？（Decimal in PowerShell編）


#はじめに


[X = 4.3 - 4.2　このとき、Xの値は？（後編）](http://qiita.com/minr/items/a5dace561fa8ebe2b123)では、PowerShellとHaskellの連携による、小数どうしの計算方法を紹介した。

その後、[iakio](http://qiita.com/iakio)さんからのアドバイスで、Decimal型どうしの演算で誤差がなくせることが分かったので、関数化してみた。

せっかくなので、比較演算子の記号を分かりやすくしたり、%（パーセント）での計算も可能にしてみた。

#定義

```ps1:PowerShell
function Calculate-Expression([string]$Expression){
  [string]$Expression_Parsed = `
    (((((((( $Expression `
      -replace '([\+\-\*\/\(\)])',' $1 ') `
      -replace '%' ,' / 100 ') `
      -replace '<=',' -le ') `
      -replace '>=',' -ge ') `
      -replace '!=',' -ne ') `
      -replace '=' ,' -eq ') `
      -replace '<' ,' -lt ') `
      -replace '>' ,' -gt ').Split(" ") | `
    ForEach{
      $r = 0
      if([Decimal]::TryParse($_,[ref]$r)){
        [string]$r + 'd'
      }else{
        [string]$_
      }
    }
  Invoke-Expression $Expression_Parsed
}

Set-Alias calc Calculate-Expression
```

#使用例

```ps1:PowerShell
calc "4.3 - 4.2" #誤差なく計算できる
#0.1

calc "4.3 - 4.2 = 0.1" #比較演算子を分かりやすく
#True

calc "50 * 80%" #パーセントでの計算もできる
#40
```

#解説

###１．PowerShell形式に変換＋各項に分解

```ps1:PowerShell
    (((((((( $Expression `
      -replace '([\+\-\*\/\(\)])',' $1 ') `
      -replace '%' ,' / 100 ') `
      -replace '<=',' -le ') `
      -replace '>=',' -ge ') `
      -replace '!=',' -ne ') `
      -replace '=' ,' -eq ') `
      -replace '<' ,' -lt ') `
      -replace '>' ,' -gt ').Split(" ")
```

・文字列で渡ってきた計算式を、PowerShellで演算できる形式に変換（=⇒-eq、!=⇒-neなど）
・%は1/100を表す（例：90%=0.9）
・演算子の前後に半角スペースを付加
・計算式を各項に分解（Split関数）
例えば、式「1+2=3」は、以下のように分解される

```ps1:
1
+
2
-eq
3
```

###２．数値をDecimal変換

```ps1:PowerShell
    ForEach{
      $r = 0
      if([Decimal]::TryParse($_,[ref]$r)){
        [string]$r + 'd'
      }else{
        [string]$_
      }
    }
```

・項ごとにTryParse関数を使い、Decimal型への変換を行う
・Decimal型へ変換できる場合は、後ろにdを付ける（後でDecimal型として計算するため）
・上記以外はそのまま文字列を返す
例えば、式「1+2=3」は、以下のように変換される

```ps1:
1d
+
2d
-eq
3d
```

上記配列をstring型変数「$Expression_Parsed」に格納する

```ps1:PowerShell
$Expression_Parsed
#1d + 2d -eq 3d
```

$Expression_Parsedを実行（計算）する

```ps1:PowerShell
  Invoke-Expression $Expression_Parsed
```

エイリアス（別名）を定義

```ps1:PowerShell
Set-Alias calc Calculate-Expression
```

Calculate-Expression関数のエイリアスとしてcalcを指定。
※エイリアスの詳細については[こちら](https://technet.microsoft.com/ja-jp/scriptcenter/powershell_owner07.aspx)を参照

#おわりに

今回紹介した関数を応用すれば、例えば、ユーザがテキストボックスで入力した式を誤差なく計算したい場合に活用できるかもしれない。

そもそも、小数どうしの四則演算くらい、特に工夫しなくても正確に計算して欲しいところだが。
入力値が2つ以上あるときの、MyWidget::updateの書き方

####はじめに

Wordpressにウィジェットというのがありまして、元から用意されているのとか、プラグイン付属でついてくるやつとかあります。
さらにその他に、自分でウィジェット作って、functions.phpから登録することもできます。

そのやりかたはこちらにバッチリまとまっています。
http://liginc.co.jp/web/wp/112370

これを参考にしていったときに、ウィジェット更新処理のところで引っかかりました。

####更新処理

ウィジェット設定画面は、外観→カスタマイズ（から、ウィジェットボタンを押す）の画面にあります。例えばデフォルトのRSSウィジェットだと、こんな感じです。
![de182ce293347ee1a2f843a2a69e9caa.png](https://qiita-image-store.s3.amazonaws.com/0/28556/7ec68387-276f-6235-f67d-07e51638d85e.png)


ここでテキストボックスに入力とかしたときにupdateメソッドが走る。1個フォーカス離したタイミングとかで1個ずつバリデーションされて、登録されます。
バリデーションに引っかかると、登録されない。

先ほどの記事に書かれている更新処理のupdateメソッドがこんな感じです。

```php:MyWidget.php
    /** 新しい設定データが適切なデータかどうかをチェックする。
     * 必ず$instanceを返す。さもなければ設定データは保存（更新）されない。
     *
     * @param array $new_instance  form()から入力された新しい設定データ
     * @param array $old_instance  前回の設定データ
     * @return array               保存（更新）する設定データ。falseを返すと更新しない。
     */
    function update($new_instance, $old_instance) {
        if(!filter_var($new_instance['email'],FILTER_VALIDATE_EMAIL)){
            return false;
        }
        return $new_instance;
    }
```

入力値が1個の時はこれでいいんですが。入力値が複数の時にうまく動かない。
ifのとこには成功判定を書くようにしました。

```php:MyWidget.php
    function update($new_instance, $old_instance) {
        if ( !empty($new_instance['text']) ){
            $new_instance['count'] = $old_instance['count'];
            return $new_instance;
        }
        if ($new_instance['count'] > 0 
            && $new_instance['count'] < 10
            && is_numeric($new_instance['count'])
            ){
            $new_instance['text'] = $old_instance['text'];
            return $new_instance;
        }
        return false;
    }
```

if(テキスト1の成功判定){
  // $new_instanceにテキスト2のデータを入れる
  return $new_instance;
}
if(テキスト2の成功判定){
  // $new_instanceにテキスト1のデータを入れる
  return $new_instance;
}
return false;

という感じです。

なので、記事の書き方を生かすとこんな感じか。

```php:MyWidget.php
    function update($new_instance, $old_instance) {
        if(!filter_var($new_instance['email'],FILTER_VALIDATE_EMAIL)){
            return false;
        } else {
            $new_instanct['text'] = $old_instance['text'];
        }
        return $new_instance;
    }
```
(ﾉ-o-)ﾉ ┫;:･. Githubの2要素認証ができなくなったら

# ある日突然、Githubの2要素認証ができなくなった(´･ω･)?

## 原因

不明。謎。Why?

## 結論

2要素認証を無効してから再度有効にする
... これってPCログイン済みじゃないとアウトじゃね？
リカバリーコードって大切だね
( ﾟ∀ﾟ) ｱﾊﾊﾊﾊﾉヽﾉヽﾉ ＼ / ＼ / ＼

## 結論に至るまで

### 1.とりあえずスマホの時間修正

自動修正がONになってなかったから、有効にして時間が直ってから再度認証...
**ダメでした。**

### 2.もしかしてコード発行するアプリがダメかも？

Google認証システム使ってたので、Duo mobileにしてみた。
DuoさんQRコード読みこむたびにシークレット違うっぽいんだけど...
**ダメでした。**

### 3.もしかして全体的におかしくなってるのでは？

Googleの2段階認証とかは普通でしたorz

### 4.もういいや、無効にしちゃえ！！

**危険です！**

### 5.これでもう一回有効にしたらどうなるんだろう？

**とおりました**

めでたしめでたし (ノTДT)ノ彡┻━┻
CircleCIの並列処理を１行でバランシング！

今回はCircleCIを１行追加するという簡単な作業で複数コンテナにバランシングしてしまうよ！というお話です。
CircleCIで並列処理をやっている方は是非試してみてください！

詳しい内容は以下。（英語）
http://blog.circleci.com/announcing-automatic-test-balancing/

# 何が変わるの？

今までは複数コンテナへちょうどよくテストを振り分けるのを手動なり何なりでやってました。
https://circleci.com/docs/parallel-manual-setup

これが１行Gemを追加することで上記作業が必要なくなったというわけです！

# どうするの？

さて肝心の追加する行ですが、Gemfileに以下の１行を追加して下さい。

````Gemfile
gem 'rspec_junit_formatter', '0.2.2'
````

以上！終わり！

これで上手いこと並列処理ができることでしょう。

あまりこの記事に言及している人がいませんでしたので、記事にしてみました。
間違っている点など御座いましたらコメント欄にてご教授頂けると幸いです！
Sprite.Create

sprite差し替えをやる必要があるので、いろいろ調べてたけど、わかってきたのでまとめ

Sprite.Create(Texture2D texture,Rect rect,Vector2 pivot, float pixelPerUnit)

<dl>
<dt>texture</dt>
<dd>テクスチャ</dd>
<dt>rect</dt>
<dd>スプライトの大きさ</dd>
<dt>pivot</dt>
<dd>中心(回転の中心)</dd>
<dt>pixelPerUnit</dt>
<dd>Unit内のピクセル数</dd>
</dl>

で、試してみた

    Texture texture = Resource.Load<Texture>("/Asset/Resources以下のpathとファイル名");
    
    Sprite spr = Sprite.Create( texture,
        new Vector3( texture.width, texture.height, 0.1f ), // 厚みほぼなし
        new Vector2( 0.5f, 0.5f ) // 中心
    );


pixelPerUnit は100にすると等倍、50にすると倍の大きさ
でも、そのままの4点ポリゴンにテクスチャはっつけるだけであれば、指定しなければ等倍なので指定しなくてもいい気がする。
page-objectモジュールの使い方

SeleniumWebDriverを使ったE2Eテスト(ブラウザテスト?)の自動化について、PageObjectデザインパターンを使うといいよ、というのはわかったのですが、`page-object`モジュールなるものがあるようです。

[cheezy/page-object](https://github.com/cheezy/page-object)

じつは手元にある(前任者が書いた)テストがコレを使っていて、その使い方をちゃんと理解できていなかったので調べてみました。(初歩的なことだけですが)

- 環境
    - Windows8.1
    - Ruby 2.2.2
    - `gem install page-object`しとく
- Rubyもプログラムも未熟者なので、書き方とか改善点をご指摘いただけると嬉しいです。。。
- 今回はページの操作を試してみました。今回Pageオブジェクトとそれを使う側を同じファイルに書いてしまいましたが、実際のテストではRSpecを使っているので`xxx_page.rb`と`xxx_spec.rb`になってます。
- やっていること
    - googleで「日本武道館」を検索する


# page-objectモジュールを使わない場合

```rb:testA.rb
# coding: utf-8
require 'selenium-webdriver'

# Pageクラス
class TestAPage

  def initialize(driver)
    @driver = driver
  end

  def search_query(q)
    # 要素の特定に find_element 使う
    @driver.find_element(:name, "q").send_keys(q)
    @driver.find_element(:name, "btnK").click
  end
end

# Pageを操作する
driver = Selenium::WebDriver.for :firefox
driver.get("https://www.google.co.jp/")
search_page = TestAPage.new(driver)
search_page.search_query("日本武道館")
```

実行は

```
> ruby testA.rb
```

![result.png](https://qiita-image-store.s3.amazonaws.com/0/8612/ed056231-ea46-99a6-e53a-245cbe6ceb67.png)

こんな感じで日本武道館を検索してくれます。(その結果、何がどうなってたらテストとしてOKと判断していいのか、というのは別な話としてw)


# page-objectモジュールを使う場合

```rb:testB.rb
# coding: utf-8
require 'page-object'

# Pageクラス
class TestBPage

  # includeします
  include PageObject

  # これで要素を操作できるようになります
  text_field(:query, :name => 'q')
  button(:search_btn, :name => 'btnK')

  def search_query(q)
    self.query = q
    self.search_btn
  end
end

# Pageを操作する
driver = Selenium::WebDriver.for :firefox
driver.get("https://www.google.co.jp/")
search_page = TestBPage.new(driver)
search_page.search_query("日本武道館")
```

実行は

```
> ruby testB.rb
```

結果はTestAと同じになります。


# まとめ

今回は要素が2つですが、実際のテストでは大量に`find_element`しなければならないことが多いです。そんな時に便利そう。


その他に`text_field`がどんなことしてくれるのかは 
http://www.rubydoc.info/github/cheezy/page-object/PageObject/Accessors#text_field-instance_method にあります。

> adds four methods to the page object - one to set text in a text field, another to retrieve text from a text field, another to return the text field element, another to check the text field's existence.

text_fieldに対して「set」「get」「element取得」「存在確認」の4つのメソッドが用意されているようです。


追記：要素の操作については
https://github.com/cheezy/page-object/wiki/Elements
に詳しく書かれています。


# 謎なこと

`page-object`モジュールを使うときに

```rb
require 'selenium-webdriver'
```

をしなくても動くのはなんでかな。
PowerShellでHTTPサーバー的なものを作る

MDwikiというツールがあります。
http://dynalon.github.io/mdwiki/#!index.md

MarkDownで書かれたmdファイルを、サーバー側ではなくJavaScriptによりクライアントサイドで処理させてWebコンテンツにしてしまおうというようなツールで、日本語の紹介記事などもあるのでぐぐっていただくと良いと思います。

このMDwikiですが、その作りからしてローカルフォルダに展開したmdwiki.htmlとmdファイルだけでブラウザから使えそうなポテンシャルを感じるのですが、実際試してみますとローカルファイルでのJavaScriptが動かず、IE,Chromeではデフォルトで動作しないという状況があります。Firefoxは大丈夫です。

というわけでFirefoxで使いましょうというのが一つの結論となるのですが、とはいえやはり他のブラウザも使いたい。
Webサーバーをlocalhostで動かせば良いのだけれども、何を使うにしても可搬性が今一つ・・・いやPowerShellでどうにかなるんじゃ？
たしか.NET Frameworkに即興HTTPサーバー用クラスがあったはず…等と思い、とりあえず作ってみたという経緯です。

# HTTPサーバーのサンプル
下記のテキストを、mdwiki.htmlのあるフォルダにhttpListener.ps1の名前で保存します。

```ps1:httpListener.ps1
param($Port=18080, $HomePage='mdwiki.html', $DefaultPage=$HomePage)
$urlRoot = "http://localhost:$Port/"
$urlMain = $urlRoot+$HomePage
$parentPath = [IO.Path]::GetDirectoryName($MyInvocation.InvocationName)

$listener = New-Object Net.HttpListener
$listener.Prefixes.add($urlRoot)

try{
	"localhostで簡易httpサーバーを作動させます。"|oh
	try {
		$listener.Start()
	} finally {
		#起動ついでにブラウザで開いてやる
		#Start()に失敗するケースでも既にHttpサーバーが動いているケースを期待してURLは開く
		"$urlMain を開きます。"|oh
		start $urlMain
	}

	$running = $true
	while($running){
		$context = $listener.GetContext()
		$request = $context.Request
		$response = $context.Response

		($url = $request.RawUrl)|oh
		$path = $url.TrimStart('/').split("?")[0]
		if(!$path) {
			"def:"+$DefaultPage|oh
			$path = $DefaultPage
		}
		
		$fullPath = [IO.Path]::Combine($parentPath, $path)
		$content = [byte[]]@()
		if( [IO.File]::Exists($fullPath) ){
			$content = [IO.File]::ReadAllBytes($fullPath)
		} else {
			$response.StatusCode = 404
		}

		$response.OutputStream.Write($content, 0, $content.Length)
		$response.Close()
	}
} finally {
	#スクリプトではあまり真面目にリソース管理しようとは思わないけれども一応
	$listener.Dispose()
}
'終了します。'|oh
pause
```

ファイルが存在すればその内容を返すだけの、最低限レベルのサンプルとなります。
本当はContent-TypeやEncoding指定の処理も入れた方が無難ですが、拘り始めると行数が増えてサンプルとして見通しが悪くなりそうので、やめました。
ps1ファイルを指定したときはスクリプトを実行する等の遊びも面白いかと思います。

# 起動について

下記のようなコマンドで起動できます。バッチファイルかショートカット等を作れば良いでしょう。

```bat:httpListener.ps1起動
powershell -ExecutionPolicy RemoteSigned -File .\httpListener.ps1
```
実行して、ブラウザが開きMDwikiのindexページが出れば成功です。
ああ、index.mdも予め作成しておかなければ、コンテンツがありません。

```text:index.md
Hello MDwiki
```

終了処理は入れていませんので、終了する時はコンソールを閉じて強制終了してください。

一応、ポートの変更もできるようにしています。デフォルトは18080で、以下は19999を指定する例です。

```bat:httpListener.ps1起動
powershell -ExecutionPolicy RemoteSigned -File .\httpListener.ps1 19999
```

#参考：Content-Typeを指定するコード断片
```ps1:Content-Type指定
	$response.ContentEncoding = [Text.Encoding]::UTF8
	$response.ContentType = 'text/html; charset='+$response.ContentEncoding.HeaderName
```

#参考：PowerShellスクリプトを処理するコード断片
```ps1:ps1処理
	if( [IO.Path]::GetExtension($fullPath) -eq ".ps1" ){
		$response.ContentEncoding = [Text.Encoding]::UTF8
		$response.ContentType = 'text/html; charset='+$response.ContentEncoding.HeaderName
		try{
			& ($fullPath)|foreach{
				$resText = if($_ -is [string]){ $_ }
				elseif( $_ -eq $null){ '' }
				else{ $_.ToString() }
				$bytes = $response.ContentEncoding.GetBytes($resText)
				$response.OutputStream.Write($bytes, 0, $bytes.Length)
				$response.OutputStream.Flush()
			}
		}catch{
			$_|oh
		}
	}
```
※組み込みは適当に工夫する必要があります
cakePHP3でAPIを叩く！

# cakePHP3でAPI叩きたい！

cakePHP3でAPI叩きたくないですか？
しかもajax使って。

## jquery使う？

最初はjqueryだけを使おうかなって思ってたんですけど、[クロスドメイン](http://d.hatena.ne.jp/satosystems/20140108/1389173683)の問題があるということと、APIを叩くためのtokenが必要で、それをhtmlの中に書きたくないなぁということで、
cakePHP3のサーバサイドでAPIを叩き、jqueryを使ってcakePHP3が叩いたAPIの結果をjsonで取得するという方法にしてみました。

## cakePHP3でjsonを返す

[SIMPLE JSON RESPONSE WITH CAKEPHP 3](http://securityblog.gr/2549/simple-json-response-with-cakephp-3/)を見ると良いと思います。

コードはこんな感じ。

```php:controller
namespace App\Controller;
 
class MyCustomersController extends AppController
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
    }
 
    public function customers()
    {
        $customers['id'] = '123';
        $this->set('customers', $customers);
        $this->set('_serialize', ['customers']);
    }
}
```

これで、getJSON()すれば大丈夫です。

```html
<script>
$(function() {
    $.getJSON('/mycustomers/customers',
        null,
        function(data, status) {
            console.log(data);
        }
    );
});
</script>
```

## cakePHP3でAPIを叩く！

まぁ、ここがメインというか・・。

"php", "API", "叩く"とかでググると出てきますよね、file_get_contents()。
ふんふんなるほど。
そして、正しく取得できたかどうかを[$http_response_header](http://ysklog.net/php/2370.html)を見て・・・。

何か、かなり原始的な処理を書こうとしている予感(´・ω・｀)
Requestクラスとか、Responseクラスとか、そういうのあると思うんですよ、cakeにも。

というわけで調べたら、ありました、[Clientクラス](http://book.cakephp.org/3.0/en/core-libraries/httpclient.html)。
使い方は簡単！

```php
$http = new Client();
$response = $http->get('http://hogehoge.com');
```

jsonが返ってくるようなAPIであれば、さらにこうすると良いと思います。

```php
if ($http->isOk) {
    $json = json_decode($response->body());
}
```

詳しくは[公式Reference](http://book.cakephp.org/3.0/en/core-libraries/httpclient.html)をチェケラ(・ω<)
vue.js の {{name}} とかが html に表示されるのを防ぐ(v-cloak)

なんだかんだ vue.js 派です（既存プロジェクトに組み込みやすいあたりが。この辺り記事にしたいかも）。

普通だと {{name}} って表示されちゃってちょっとみっともないのが、HTML タグに v-cloak を付けて下記のような CSS を書くと binding が済むまで非表示にできます。

```html
<p>※5秒後にbindingされます</p>
  
<ul>
  <li>v-cloak ある版 : <span id="user1" v-cloak>{{name}}</span></li>
  <li>v-cloak ない版 : <span id="user2">{{name}}</span></li>
</ul>
```

```js
setTimeout(function() {
  new Vue({
    el: "#user1",
    data: {
      name: "user1"
    }
  });
  new Vue({
    el: "#user2",
    data: {
      name: "user2"
    }
  });
}, 5000);
```

```css
[v-cloak] {
  display: none;
}
```

[サンプル(jsbin)](http://jsbin.com/liroziwaha/1/)
SVGを画像に変換してダウンロードする方法


[D3.js](http://d3js.org/)や[flowchart.js](http://adrai.github.io/flowchart.js/)など、SVGで出力された画像を保存したくなるときが多々あります。
そんなときに使うjavascript。Chromeのデバッガーツールのconsoleから入力するだけでOK。

## 出力処理
```javascript
var svg = document.querySelector("svg");
var svgData = new XMLSerializer().serializeToString(svg);
var canvas = document.createElement("canvas");
canvas.width = svg.width.baseVal.value;
canvas.height = svg.height.baseVal.value;

var ctx = canvas.getContext("2d");
var image = new Image;
image.onload = function(){
    ctx.drawImage( image, 0, 0 );
    var a = document.createElement("a");
    a.href = canvas.toDataURL("image/png");
    a.setAttribute("download", "image.png");
    a.dispatchEvent(new MouseEvent("click"));
}
image.src = "data:image/svg+xml;charset=utf-8;base64," + btoa(unescape(encodeURIComponent(svgData))); 
```
## 参考
* [D3.jsなどで出力されるsvgを画像として表示する方法](http://qiita.com/ka215/items/a709665cb34c505ccf1f)
Android 5.0のテーマでボタンが大文字のみになっているのを解除する方法

Android 5.0向けにプロジェクトを作ってボタンを配置してみたら、英字が大文字のみになってしまっていたのでそれを解除する方法。

http://qiita.com/tomoima525/items/3158320777a08e6c7ade

にあるように、これは5.0のテーマで決められてしまっているらしい。

ひとまずその他の要素には触れたくなかったので、res/style.xmlに

```xml
<style name="Button2" parent="Base.Widget.AppCompat.Button">
        <item name="textAllCaps">false</item>
</style>
```
を追加して、これをButtonのStyleに指定する。
parentに指定したスタイルを引き継いで上書きしてくれるよう。

テーマまるごとに適用したいときは、その上のAppThemeに

```xml
    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        <item name="android:buttonStyle">@style/Button2</item>
    </style>
```
というようにbuttonStyleを追加する。
TreasureDataでHiveクエリを書くとき - TD_LAST,TD_FIRST

# はじめに
Treasure DataはHiveの関数以外に独自関数を。。。（略

[ドキュメント：Supported Hive UDFs](http://docs.treasuredata.com/articles/udfs)

ドキュメントを見れば、ここから下は不要だ。

# TD_LAST
Group by で集約された値の中で第二引数以降の値でソートを行い、一番最後になった行の第一引数に指定されたカラムの値を返します。

```sql:Signature
TD_LAST(ret_col, cmp_col1, cmp_col2, ...)
```

# TD_FIRST
TD_LASTの逆です。

```sql:Signature
TD_FIRST(ret_col, cmp_col1, cmp_col2, ...)
```

# 使用例
下記のようなテーブルの場合の例です。

|time|a|b|c|str|
|:----:|:----:|:----:|:----:|:----:|
|2015-06-06 21:00:00|1|1|4|aaa|
|2015-06-06 20:00:00|1|2|4|bbb|
|2015-06-06 19:00:00|2|3|4|cccc|
|2015-06-06 18:00:00|2|4|3|dddd|

aでgroup byして、その中でbの値でソートして一番最後の行のstrの値を返す

```sql:sample1
select a,TD_LAST(str,b) as b_str
from test
group by a
```

|a|b_str|
|:---:|:---:|
|1|bbb|
|2|dddd|

```sql:sample2
select a, TD_FIRST(str,b) as b_str
from test
group by a
```

|a|b_str|
|:---:|:---:|
|1|aaa|
|2|cccc|

# まとめ
とある列の最大値や最小値を探すならmax,minでよいのですが、とあるカラムで並べ替えて別のカラム値を得たい場合、いっぱいSQLを書かないといけない気がしますが、これらを使ったら簡単にかけて幸せですね。
Windowsメモ帳の「右端で折り返す」で入る謎の改行コード

# 概要

[Windowsの「メモ帳」で「右端で折り返す」にすると「右端」で勝手に改行される件について](http://d.hatena.ne.jp/takemita/20110119/p2) でも報告があるが、Windowsのメモ帳の「右端で改行」の動作がわりとファンタジック(同僚氏談)だったのでまとめてみた。

**注：** 本挙動はWindows 7までは再現しますが、Windows 10では修正されているそうです。Windows 8でどうなっているかは手元に無いのでわかりません。

# 再現手順

* Windowsのメモ帳を起動し、「書式」の「右端で折り返す」にチェックを入れてから、長い文章を入力する。 この状態では、ウィンドウサイズを変えると、入力された内容が追従する。

 ウィンドウサイズ変える前
![150608_memo1.png](https://qiita-image-store.s3.amazonaws.com/0/79744/08081d06-64e3-cb10-0b96-147e53564e11.png)

ウィンドウサイズ変えた後(ちゃんと追従する)
![150608_memo2.png](https://qiita-image-store.s3.amazonaws.com/0/79744/3d3c1559-8ad7-4215-e5ca-0b901606aa76.png)

* 「名前をつけて保存」する(例えばtest.txt)。すると、右端に改行コードが挿入され、ウィンドウサイズを変えても入力された内容が追従しなくなる。

保存直後
![150608_memo3.png](https://qiita-image-store.s3.amazonaws.com/0/79744/94e6591a-008b-01ec-7049-1cfcbfb9439a.png)

ウィンドウサイズを変えた後(表示が追従しない)![150608_memo4.png](https://qiita-image-store.s3.amazonaws.com/0/79744/3f8079a2-c625-ca73-69c4-32973aadd316.png)

* メモ帳の内容を別のエディタ(例えばsakuraエディタ)にコピペすると、改行が入っていること、さらに挿入されたコードが「CRCRLF」であることがわかる。ちなみにメモ帳で開いたまま、先ほど保存したファイル(test.txt)を別のエディタで開いても、改行コードは入っていない。つまり、ファイルには保存していない。 

![150608_memo5.png](https://qiita-image-store.s3.amazonaws.com/0/79744/16201a7f-209b-71d5-1ea9-add720ec9958.png)

* ここからファンタジー度が増してくる。メモ帳で「保存」してからウィンドウサイズを変更しても内容が追従しないが、その追従していない状態でさらに「保存」してから、「全て選択(Ctrl+A)」すると、慌てて追従する。 

* サイズ変更の方法によっては、表示が正しくなくなる。「保存」してから、「全て選択(Ctrl+A)」した後に、ウィンドウサイズを大きくして、さらに「保存」すると、画面更新に失敗し、一時的に画面に本来よりも多い文字数が表示されてしまう。一度フォーカスを外してから戻すと正しく表示される。

全選択して「保存」
![150608_memo6.png](https://qiita-image-store.s3.amazonaws.com/0/79744/626e746a-4e89-b93a-3801-7d8dd40ac142.png)

ウィンドウサイズを変えてから「保存」。選択されていない文字が出現する。
![150608_memo7.png](https://qiita-image-store.s3.amazonaws.com/0/79744/26d66e14-bf1a-62aa-73f2-a34107e836f3.png)

# コード「CRCRLF」

「表示では改行されているが、保存されない」という改行コードは「CRCRLF」で表現されている。そこで、CRCRLFを吐くコードを書いてみる。

```cpp:test.cc
#include<stdio.h>

int
main(void){
  const char cr = 0x0d;
  const char lf = 0x0a;
  for(int i=0;i<10;i++){
    printf("%c%c%c%c",'a',cr,cr,lf);
  }
}
```

上記を実行して、test.txtに吐く。

```shell-session
$ g++ test.cc
$ ./a.out > test.txt
$ cat test.txt
a
a
a
a
a
a
a
a
a
a

```

メモ帳で読み込んで「右端で改行」にチェックは入った状態で「保存」すると、改行が消える。

```shell-session
$ cat test.txt
aaaaaaaaaa
````

# まとめ

Windowsのメモ帳は、「右端で改行」をするときには内部的に「CRCRLF」を挿入するが、これは「ファイルに保存されない」のではなく、「保存」するときに自動で削除されている。別のプログラムで作成された、CRCRLFを含むテキストを読み込んで保存するときにも削除する。
Object#tryの意外な挙動

Railsで導入されるActiveSupportには、`nil`かもしれない値のハンドリングに便利な、`try`メソッドがあります。ただ、意外と知らない使い方も多いなあと思ったので、メモ程度に書いていきます。

# メソッド以外の引数を付ける
`try`メソッドに複数の引数を渡すと、2つ目以降はメソッドの引数となります。

```rb
# sliceメソッドを呼ぶ
some_obj.try(:slice, 1, 1)
```

これを利用することで、[HashやArrayからの値取得](http://qiita.com/saicologic/items/e8414dcc7f3641632d99)に`try`を使うこともできます。

# `nil`に適用した場合は必ず`nil`
`try`の要になる、`NilClass`での実装ですが、極めてシンプルです。実際のコードから`NilClass#try`の定義だけ抜粋してみました。

```rb:active_support/core_ext/object/try.rb
class NilClass
  def try(*args)
    nil
  end
end
```

このように、ただ`nil`を返しているだけです。このため、`.try(:to_s, :delimited)`のように、本来`nil`に適用すれば`ArgumentError`となってしまうような引数をつけていてもエラーを出さずに`nil`を返してくれますが、`nil.try(:nil?)`のように、`nil`にきちんと適用できるメソッドであっても返り値は`nil`となってしまいます。

# ブロックを渡す
`try`にブロックを渡す場合、2通りの意味があります。

まず、メソッド指定をした上でブロックも渡す場合、ブロックはそのメソッドに渡されます。Enumerableかもしれない値に集計メソッドを`try`で渡す場合に、威力を発揮します。

一方で、メソッドを渡さずに、ブロックだけを渡すこともできます。この場合、レシーバーが`nil`でなければ、そのオブジェクトを`self`としてブロックが実行され、その値が返り値になります。例えば、

```rb:ブロックだけのtry
number_or_nil.try { "#{self}人" }
```
のように、1メソッドで済まない処理を行うことができます。
concern や concerning の位置にもタグジャンプする方法

次のように設定してみると、module構文で定義していたのと同じように飛べるようになりました。

```text:~/.ctags
--regex-ruby=/^[[:space:]]*(concern|concerning)[[:space:]]+:([a-zA-Z0-9_]+)/\2/
```

2017-01-06 追記
正規表現の仕様が変わったのか以前の定義では動かなくなっていたので修正しました。

## 参考
Exuberant ctags、attr_readerやActiveRecordの関連定義に対応する - gnarl技術メモ
http://d.hatena.ne.jp/gnarl/20120411/1334138786

Create ctags for developping Rails applications.
https://gist.github.com/yoppi/1923209
mackerelを導入しているサーバのインスタンスタイプを変更したときにはまったこと

## 内容
mackerel-agentが導入されているインスタンスのインスタンスタイプをあげようとしたときに起こった話。一部思い出しながら書いているので、間違いがあるかもしれません。

## システム概要
* AWS
* mackerel-agent 0.16.1
* Centos7

## 起こったこと
* インスタンスタイプを変更するため、稼働中のサーバを管理コンソールからStopさせ、インスタンスタイプを選択し再起動した
* 再起動後Mackerelの管理コンソールを見るとConnectivityのアラートが出たままだった。
* mackerel-agentを見ると下記のエラー

```
2015/06/08 12:45:39 CRITICAL main Failed to prepare host: Failed to find this host on mackerel (You may want to delete file "/var/lib/mackerel-agent/id" to register this host to an another organization): Get https://mackerel.io/api/v0/hosts/XXXXXXX: dial tcp: lookup mackerel.io on 10.0.0.2:53: dial udp 10.0.0.2:53: network is unreachable
```

* organizationがかぶってるとのログ？

## 解決方法
* ログの内容はよくわからないです
* `systemctl status mackerel-agent` を実行するとstatusはactiveになっていた
* psを確認するとプロセスはおらず
* 一度mackerel-agentを停止させるとsystemdがerrorを吐いた
* `/var/run/lock/subsys/mackerel-agent` が存在していて、systemdとしてはmackerelが起動していると判断していた？
* このファイルを削除したら無事起動しました。

## よくわかってないところ
* `/var/run/lock/subsys/mackerel-agent`はOS停止時にスクリプトで削除されないのでしょうか
* 停止のさせ方の問題なのかもしれないです（`shutdown -h now` だったら問題なかったかも）
* mackerelというよりsystemdの問題でしょうか
Django1.8からはforms.ChoiceFieldのchoices属性にcallableオブジェクトが渡せて地味便利

Django1.8から、forms.ChoiceFieldのchoices属性にcallableオブジェクトが渡せるようになりました。
フォームの選択肢を動的に求めたい時に地味に便利です。

以下の例では、現在日時から1時間おきに10件分の選択肢を選べるようにしています。[^1]

```py:forms.py
# -*- coding: utf-8 -*-
from django import forms
from dateutil import rrule
from datetime import datetime


class ExampleForm(forms.Form):
    start_at = forms.ChoiceField(
        choices=lambda: (
            (str(t), t.strftime('%H:%M:%S'))
            for t in rrule.rrule(rrule.HOURLY, dtstart=datetime.now(), count=10)
        ),
    )
```

この書き方にしておくと、ブラウザをリロードするたびに選択肢が変化します。

参考URL: [Form fields | Django documentation | Django](https://docs.djangoproject.com/en/1.8/ref/forms/fields/#choicefield)

[^1]: [python-dateutil](https://pypi.python.org/pypi/python-dateutil)を使っています。
sunspot使ってみた

検索エンジンのsunspotを使ってみた。


## モデル定義
```
class Post < ActiveRecord::Base
  searchable do
    text :title, :body

    boolean :featured
    integer :blog_id
    integer :author_id
    integer :category_ids, :multiple => true
    double  :average_rating
    time    :published_at
    time    :expired_at
  end
end
```
こんな感じで定義する

relationの定義を行いたいときは

```
  text :comments do
    comments.map { |comment| comment.body }
  end

  string :comment_title, multiple: true do
    comments.map { |comment| comment.title }
  end
	
  string :author_name do
    author.name
  end
```
こんな感じで。text型はmultipleオプションを付けられない。
アソシエーション先がnilの場合があるのであれば、tryとか使ってうまく回避。



## 検索してみる
```
search = Post.solr_search do |query|
  fulltext('hoge', fields: :title)
end
```

単純にtext型の複合（AND)条件であれば、

```
search = Post.solr_search do |query|
  fulltext('hoge', fields: :title)
  fulltext('fuga', fileds: :body)
end
```

これでOK
OR条件にするのであれば

```
search = Post.solr_search do |query|
  query.any do
    fulltext('hoge', fields: :title)
    fulltext('fuga', fileds: :body)
  end
end
```

fulltext以外の項目ならば、**any do** が**any_of do**に変わります・・・。

```
search = Post.solr_search do |query|
  query.any_of do
    with(:blog_id, 111)
    with(:author_id, 222)
  end
end
```

これらを組み合わせて使うと・・・

```
search = Post.solr_search do |query|
  query.any do
    fulltext('hoge', fields: :title)
    fulltext('fuga', fileds: :body)
  end
  query.with(:blog_id, 111)
  query.with(:author_id, 222)
end
```

ページネートにも対応しているので、
項目を追加してやると良いです。
ちなみにデフォルトでページネートされ、1ページに全件を指定はできないそうなので、
その場合はper_pageに最大値の1000万を指定するか、Post.countとか渡して対応しましょう


```
  paginate(page:1, per_page:50)
```

あとは結果を取得するだけ(results or hits)

```
search.results
```

管理画面なども用意されているので、ブラウザでアクセスして
クエリやindexの確認ができます。


なかなか使う機会は限られるかもしれませんが、参考まで。



sunspot
https://github.com/sunspot/sunspot
Push Notification のパーミッションアラートをリセットする方法

　Push Notification の登録をしようとする際に表示されるパーミッションアラート、あれは1回しか表示されません。他のプライバシー設定とは違ってアプリを消しても設定は残ってしまうのです。それをリセットする方法が Apple の資料に記載されていました。以下の通りです：

1. 端末からアプリを削除する
* 端末の電源を切り、再び電源を投入する
* 設定 > 一般 > 日付と時刻： 未来の日付に設定する
* 再び端末の電源を切り、再投入する

　終わったら日付は元に戻しても大丈夫の模様。しかしもっと簡単な方法はないのでしょうかね……。

> https://developer.apple.com/library/ios/technotes/tn2265/_index.html#//apple_ref/doc/uid/DTS40010376-CH1-TNTAG42

追記：iOS 9からは Device Token がアプリ毎に紐づけられるようになりました。なのでアプリの再インストールでリセットが行えます。
参考：http://qiita.com/mono0926/items/9ef83c8b0de0e84118ac

ただ一部のASPにおいて古いデバイストークンが無効化されない現象が発生しており（曰く、Apple側が対応しないと直らないらしい）、結果的に複数の通知が同時に飛んできてしまうという事態になってしまっています。対処法はわからずお手上げです。
Yahoo! JavaScriptマップAPI [Circle]でスマホを使うとイベントが発生しない

Yahoo! JavaScriptマップAPIで円を表示（Y.Circle）を使った場合、PCのブラウザーで表示するとマウスでクリックした場合
circle.bindInfoWindow('test')のようなイベントハンドラを記述すると反応しますが、スマホ（IOS、Android）だと反応しません。
反応するような設定は可能でしょうか？
検証したサンプルコード（全角文字にしています）
＜ｈｔｍｌ＞
＜ｂｏｄｙ＞
＜ｄｉｖ　ｉｄ＝”ｍａｐ”　ｓｔｙｌｅ＝”ｗｉｄｔｈ：４００ｐｘ；　ｈｅｉｇｈｔ：３００ｐｘ”＞＜／ｄｉｖ＞

＜ｓｃｒｉｐｔ　ｔｙｐｅ＝”ｔｅｘｔ／ｊａｖａｓｃｒｉｐｔ”　ｃｈａｒｓｅｔ＝”ｕｔｆ－８”　ｓｒｃ＝”ｈｔｔｐ：／／ｊｓ．ａｐｉ．ｏｌｐ．ｙａｈｏｏａｐｉｓ．ｊｐ／ＯｐｅｎＬｏｃａｌＰｌａｔｆｏｒｍ／Ｖ１／ｊｓａｐｉ？ａｐｐｉｄ＝ＸＸＸ”＞＜／ｓｃｒｉｐｔ＞
＜ｓｃｒｉｐｔ　ｔｙｐｅ＝”ｔｅｘｔ／ｊａｖａｓｃｒｉｐｔ”＞
ｗｉｎｄｏｗ．ｏｎｌｏａｄ　＝　ｆｕｎｃｔｉｏｎ（）｛
ｖａｒ　ｙｍａｐ　＝　ｎｅｗ　Ｙ．Ｍａｐ（”ｍａｐ”）；
ｙｍａｐ．ｄｒａｗＭａｐ（ｎｅｗ　Ｙ．ＬａｔＬｎｇ（３５．６６５７２，　１３９．７３１００），　１７）；

ｖａｒ　ｃｉｒｃｌｅ　＝　ｎｅｗ　Ｙ．Ｃｉｒｃｌｅ（ｎｅｗ　Ｙ．ＬａｔＬｎｇ（３５．６６４７２，　１３９．７３１００），　ｎｅｗ　Ｙ．Ｓｉｚｅ（１０，　１０））；
ｃｉｒｃｌｅ．ｂｉｎｄＩｎｆｏＷｉｎｄｏｗ（’ＴＥＳＴ’）；
ｙｍａｐ．ａｄｄＦｅａｔｕｒｅ（ｃｉｒｃｌｅ）；
｝
＜／ｓｃｒｉｐｔ＞
＜／ｂｏｄｙ＞
＜／ｈｔｍｌ＞
残業は安全配慮義務の上で成り立つ(追記希望)

## 労働基準法での所定労働時間は１週間で４０時間、１日で８時間と決められています。

* [残業命令を拒否されたら、解雇できるか？ | 労使トラブル解決マニュアル](https://www.roumu55.com/knowhow/2013/06/post-255.html)

> ３６協定の有効期間は１年（自動更新はできません）。
> 残業命令を出す場合は、「有効な３６協定」が締結されていることが必要です。　
> アフター５の予定の内容にも配慮すべきですし、
> 健康上の問題も考える必要があります。
> また、育児、介護などの事情も十分考慮する必要があるでしょう。
> 結果として、３６協定が有効であっても、
> 総合的な状況の中で判断することが最も重要なことです。


## [残業を命じるときの注意点(時間外労働の拒否)](http://www3.plala.or.jp/kisoku/troub5.html)

### 従業員はその残業命令が「正当なもの」であるかぎり、拒否できなくなります。

> 正当なものとは、次の条件を満たしているものをいいます。
> 1.36協定の範囲内の残業であること（月45時間以内）。
> 2.時間外労働をさせる業務上の必要性があること。
> 3.残業命令が社員の健康を害さないこと。
> 4.社員の生活設計（家族の保育や病人への配慮）を害さないこと。
> 5.社員が残業ができない理由を具体的に述べて拒否した場合、その
> 　拒否理由に正当性があるか考慮していること。



## ＳＥは裁量労働制の対象だがプログラマーは対象外

* [ＳＥは裁量労働制の対象だがプログラマーは対象外？「IT企業は残業代いらぬ」残業代を払わない口実に](http://lifepln.info/csr/377)

## 時間外労働をさせる場合の限度時間

[３６協定の限度時間に注意！](http://www.roukitaisaku.com/taisaku/gendojikan.html)

> 「（限度時間を超える期間、時間につき）、納期の変更、大きなクレーム処理等逼迫した期限により、通常の業務量を超える業務が発生し、臨時に業務を行う必要がある場合には、労使の協議を経て１ヶ月に８０時間、１年間を通じて７５０時間まで延長することができるものとする。この場合、限度時間を更に延長する回数は６回までとする。」
> このような、特別条項付の３６協定を締結していたとしても、特別条項により協定された延長時間を超えた場合や、延長する回数制限を超えた場合、そして限度時間を超えて時間外労働を行わせる場合に、協定されている手続きを踏んでいないのであれば、労働基準法３２条違反ということになります。

## [長時間労働と安全配慮義務違反｜労働者のための労働相談所](http://www.sr-partners.or.jp/trouble-1.html)

### 長時間労働は睡眠時間を減少させ、疲労の回復を妨げ、健康障害を引き起こす要因となります。
> 使用者には「労働契約に伴い、労働者がその生命、身体等の安全を確保しつつ労働することができるよう、必要な配慮をする」ことが義務付けられています。（労働契約法第５条）
> また、労働安全衛生法第６５条の３は「事業者は、労働者の健康に配慮して、労働者の従事する作業を適切に管理するよう努めなければならない」と定めています。

### 月４５時間を超える時間外労働を行わせることができる月数は１年に６回まで

> 労働基準法では労働時間そのものに制限を設けています。
> たとえ特別条項付３６協定を締結した場合であっても`月４５時間を超える時間外労働を行わせることができる月数は１年に６回まで`で、`臨時的な事情がある場合に限られます。`
> 残業代を支払ってさえいれば際限なく労働者を酷使しても構わない、と勘違いしている経営者もいますが、
> 恒常的な長時間労働を課し、労働者の心身の健康に配慮しない労務管理を行えば安全配慮義務違反となります。

### 判例

> 実際、安全配慮義務を怠った使用者に対し、民法の不法行為責任（７０９条）、使用者責任（７１５条）、債務不履行（４１５条）等を根拠に損害賠償を命じる判例が多数あります。

## [過重労働と安全配慮義務 | 佐々木社会保険労務士事務所](http://www.5s-office.com/tips/overwork.html)


### 過労死発生のリスクを示す時間外・休日労働時間の目安

![](http://www.5s-office.com/tips/img/overwork_pic1.gif)

## 6時間以下なら、徹夜と同じ！？睡眠時間と作業効率の関係

* [6時間以下なら、徹夜と同じ！？睡眠時間と作業効率の関係 | TABI LABO](http://tabi-labo.com/135190/sleep-science/)

> 寝不足になると老廃物が脳に溜まって、アルツハイマーの引き金になる

* 健康に関わる。


### 面接指導の実施に係る流れ

![](http://www.5s-office.com/tips/img/overwork_pic2.gif)


## 闘う場合

* [【労働問題】病気で残業禁止なのに残業 安全配慮義務 損害賠償 労災 労働 | つまこい法律事務所 | 弁護士　佐久間大輔の公式ホームページ](http://tsumakoi-law.com/sakuma-daisuke/column/labor-_incident/health-issue/health-issue09/)

> 弁護士が代理人となって、労働審判や訴訟を提起するなどし、残業代や損害賠償を請求することができます。


## リンク集

* [残業にひそむ、もう一つのリスクとは？](http://www.nakamura-j.jp
/zangyou/dai7syou.html)
nilの可能性がある、ネストしたHASHの値を１行で取得する方法

# 解決したいこと
if文を使わずに、`params[:foo][:bar]`のとき、`bar`がnilでなければ、`params[:foo][:bar]の値を返したい
また、nilの場合は、nilを返したい。

よくあるエラー

```
> params[:foo][:bar]
NoMethodError: undefined method `[]' for nil:NilClass
```

# 解決策

ActiveSupportのtryを使う。HASHの場合は、`:[]`が大事

```
params[:foo].try(:[], :bar)
```

# 参考

http://guides.rubyonrails.org/active_support_core_extensions.html
http://stackoverflow.com/questions/6224875/equivalent-of-try-for-a-hash
[Writing Ruby Square Bracket Methods](http://datamelon.io/blog/2015/square-brackets-in-ruby.html)
Swift で "関数を返す関数" を定義する


Swift では（例えば JavaScript のように）関数はオブジェクトとして扱えるので、次のように関数を返す関数、というのも定義できる。

> 手元の Swift のバージョン：`1.1`

```swift
func makeCounter() -> (Void -> Int) {

  var n:Int = 1

  return { () -> Int in
    return n++
  }
}

var count = makeCounter()

println(count()) // => 1
println(count()) // => 2
println(count()) // => 3
println(count()) // => 4
```

ちなみに `{ (引数) -> 戻り値の型 in 処理内容 }` は無名関数のようなもの（Swift ではクロージャと呼ばれている模様）

また１行目の `(Void -> Int)` は「引数なし(Void)で戻り値の型Intの関数」を、関数 `makeCounter` の戻り値の型とする、という意味。説明がややこしいですが..
Swift で関数プログラミングっぽいリスト処理


> 手元の Swift のバージョン：`1.1`

### map

*例：リストの各値を２倍*

```swift:
var arr = [1, 2, 3, 4, 5].map({ (currentValue) -> Int in
  return currentValue * 2  
})

println(arr) // => [2, 4, 6, 8, 10]
```

> 上記 `currentValue` の型は Int であるが、この場合は型推論されるので明示的に定義しなくても Swift 的には不要ぽい。下記 filter、reduce のサンプルコードでも同様。

### filter

*例：リストから３以上のものを抽出*

```swift:
var arr = [1, 2, 3, 4, 5].filter({ (currentValue) -> Bool in
  return currentValue >= 3
})

println(arr) // => [3, 4, 5]
```

### reduce

*例：リストの各値の合計を算出*

```swift:
var sum = [1, 2, 3, 4, 5].reduce(0, { (previousValue, currentValue) -> Int in
  return previousValue + currentValue
})

println(sum) // => 15
```

> 上記 `reduce()` の第一引数 `0` は `previousValue(=トータル値)` の初期値。

## 処理をつなげる場合

次のように普通につなげて書けばよい。

*例：リストの各値を２倍した上で5以上のものを抽出*

```swift:
var arr = [1, 2, 3, 4, 5]
  .map({ (currentValue) -> Int in
    return currentValue * 2  
  })
  .filter({ (currentValue) -> Bool in
    return currentValue >= 5
  })

println(arr) // => [6, 8, 10]
```
dos画面を最前面にしないでバッチ処理実行

### dos画面を最前面にしないでバッチ処理実行


```vbnet:MSSQLSERVER-start.vbs
Option Explicit

Const vbHide = 0             'ウィンドウを非表示
Const vbNormalFocus = 1      '通常のウィンドウ、かつ最前面のウィンドウ
Const vbMinimizedFocus = 2   '最小化、かつ最前面のウィンドウ
Const vbMaximizedFocus = 3   '最大化、かつ最前面のウィンドウ
Const vbNormalNoFocus = 4    '通常のウィンドウ、ただし、最前面にはならない
Const vbMinimizedNoFocus = 6 '最小化、ただし、最前面にはならない

Dim objFso
Dim currentFolder
Dim objWShell

Set objFso = createObject("Scripting.FileSystemObject")
'自分自身のパスを取得
currentFolder = objFso.GetFile(WScript.ScriptFullName).ParentFolder.Path

Set objWShell = CreateObject("WScript.Shell")
'自分自身のパスをカレントにする
objWShell.CurrentDirectory = currentFolder
objWShell.Run "MSSQLSERVER-start.cmd", vbMinimizedNoFocus, False

Set objWShell = Nothing

```
Python："[Errno 111] Connection refused" easy_installでpipがインストールできない

 
####[現象]
[Errno 111] Connection refused となりインストールできない。
####[原因]

* 自前リポジトリサーバにpipが無かった為
* Connection refusedなので認証かネットワークかと考えたが、
対象が存在しない場合もこういったメッセージのようだ。

####[対応]
一時的に自前リポジトリサーバを無効にする

```
//pipの導入を試みる
$ easy_install-2.7 pip
Searching for pip
Reading http://10.70.0.2:8080/simple/pip/
Download error on http://10.70.0.2:8080/simple/pip/:     [Errno 111] Connection refused -- Some packages may not be found!
                             ：

//自前リポジトリサーバを無効化
$ vi ~/.pydistutils.cfg
#[easy_install]
#index_url = http://10.70.0.2:8080/simple/

//もう一回。オフィシャルに取得しに行く
$ easy_install-2.7 pip
Searching for pip
Reading https://pypi.python.org/simple/pip/
Best match: pip 7.0.1
Downloading         https://pypi.python.org/packages/source/p/pip/pip-7.0.1.tar.gz#md5=5627bb807cf3d898a2eba276685537aaProcessing pip-7.0.1.tar.gz
                        :
Finished processing dependencies for pip
```
DynamoDBで予約語を使う時は置換しないと怒られる

### 概要
Node.jsでDynamoDBからscanしようとしたら、予約語を使っていたため怒られた

#### 間違った例

```
var dynamodb = AWS.DynamoDB();
var params = {
  TableName                : "a_table",
  ProjectionExpression     : "DateTime,Attr1,Attr2",
};
dynamodb.scan(params, function(err, data) {
  if (err) return console.log(err, err.stack);
  console.log(data.Items);
});
```

```
ValidationException: Invalid KeyConditionExpression: Attribute name is a reserved keyword; reserved keyword: DateTime
```

#### 正しい例

```
var dynamodb = AWS.DynamoDB();
var params = {
  TableName                : "a_table",
  ProjectionExpression     : "#dt,Attr1,Attr2",
  ExpressionAttributeNames : {
    "#dt"  : ATTR_DATE_TIME,
  },
};
dynamodb.scan(params, function(err, data) {
  if (err) return console.log(err, err.stack);
  console.log(data.Items);
});
```
【Unity】transform.eulerAnglesをClampする工夫

Unityの話というか、角度の話です。

transform.eulerAnglesは0°から360°で表現されます。

例えば、-10°を代入したら、次に取得すると350°になっています。

このため、
-45°<θ<45°
で角度に制限をかけたい場合、少し困ります。

0°<θ<45°、315°<θ<360°
で制限をかければいいだけだ、と
思ってしまう方もおられるかと思われますが、
値がどちらにClampされるべきかよくわからなくなってしまいます。

これは-10°が350°となり、情報が減ったためです。

http://answers.unity3d.com/questions/227736/clamping-a-wrapping-rotation.html
ここらへんの方法で180°を境にifで場合分けをしたとしても、
なんだか汚い感じがします。

**私はtransform.eulerAnglesに代入しない、他のeulerAnglesを別に保存する方法がきれいだと思いました。**
仮に、1つの要素をeulerAngleXとすると

```csharp:
// （-∞ < eulerAngleX < ∞）
private float eulerAngleX;

// eulerAngleXに何か代入する

eulerAngleX = Mathf.Clamp(eulerAngleX, min, max);

transform.eulerAngles.x = eulerAngleX;
```

ということです。

他に何か良い方法があれば、教えて下さい。
SlackのIncoming WebHooksを使わないで指定のChannelにPOSTする方法

# SlackのIncoming WebHooksを使わないで指定のチャンネルにPOSTする方法

Slackを無料枠で使っていて、integration limitに到達して、あーんもうってなっちゃった人向けです。
無料枠でもintegration色々試したいですよね！？　Incoming WebHooksに貴重なintegration枠を使うのがもったいない！
という貧乏精神ですw
![インテグレーションいっぱい.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/89fa9e02-1dd3-2892-6bd4-bc6f9247c3e8.png)


## 目次
1. 準備
2. PythonでPOSTしてみる 

## 準備
### 以下のページにアクセスして、個人ごとのtokenを取得します。
***
`https://api.slack.com/web`
上記ページの一番下の`Authentication`の項目になります。
![認証前.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/a6941f79-b0fc-52c9-3644-da21b3073aff.png)


画像の`Create token` をクリックするとユーザーごとのtokenが生成されます。
あとで使うので、メモしておきます。

![認証トークン発行済.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/13205782-4607-2f38-4c99-0ce7fead04a8.png)


### サンプルで適当にChannelを作ります。 
***
tokenを発行したチームのSlackから、適当にChannelを作ります。
今回は、`sample`というChannelを作ったとします。
既存のChannelにもPOSTすることができるので、新しく作らなくても大丈夫です。

これで準備は完了です！

## PythonでPOSTしてみる 
以下のページにAPIメソッドの一覧があります。
　　`https://api.slack.com/methods`
今回は、この一覧の[chat.postMessage](https://api.slack.com/methods/chat.postMessage)メソッドを使います。

```py:sample.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests

#proxyの設定、あれば
PROXIES = {
  "http": "http://hogehoge:port/",
  "https": "https://fugafuga:port/",
}

class SlackWrapper:
    #slack
    __token = 'your_slack_token' #先ほど取得したtokenをここに書く
    __channel = '#sample' #POSTしたいチャンネル名
    __postSlackUrl = 'https://slack.com/api/chat.postMessage' #ここは固定
    __icon_url = 'iconのURL' #Slackに投稿するアイコンのURLを指定する。
    __username = 'sample' #Slackに投稿するユーザー名
    
    def __init__(self):
        pass

    def post(self, posttext):
        params = {'token': self.__token, 
                  'channel': self.__channel , 
                  'text':posttext,
                  'icon_url': self.__icon_url,
                  'username':self.__username,
                  'unfurl_links': 'false'
                  }
        # SlackにPOSTする
        r = requests.post(self.__postSlackUrl, params=params, proxies=PROXIES)  
        # proxyがないとき
        # r = requests.post(self.__postSlackUrl, params=params)  

if __name__ == '__main__':
    slack = SlackWrapper()
    slack.post('こんにちは！　Slack！')
    
```


これでIncoming WebHooksを使わないで指定のチャンネルにPOSTすることができます！
やったね！
Knockout.jsでラジオボタン・チェックボックスにclickイベントをbindするときの注意

clickイベントをbindした時、ラジオボタンの選択が効かなくなった場合、下記のようにtrueを返却すれば後に続く処理（ラジオボタンのクリックが反映される）が実行されるようになります。
チェックボックスも同じです。

```coffeescript:
class Hoge
  click_button: (value) =>
    alert value
    # tureを返却すればラジオボタンまたはチェックボックスの本来の動作を実施する
    true
```
自作のコマンドを作成した


研究の一環で何度も同じ作業するのが面倒くさくなってスプリクトを作った。だが、どうせならコマンドにしてかっこ良くしたいと思い調べた結果、サイトによってバラバラだしなんじゃこりゃってなったのでメモ。

環境はCentOS7でrootログインで説明します。

##$PATH

まずコマンドを入れるところだが、環境変数である$PATHでわかる。

```
# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
```
つまり、デフォルトの状態だと以下の6つが$PATHに入ってる。
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/bin
/root/bin

というかそもそも$PATHとは何なのか。
何気なく打ち込んでいるコマンド。もちろんLinux内にあるファイルを実行することを示しているが、全ファイルを検索して実行しているのか。

そんな馬鹿なわけがない。

環境変数である$PATHで指定されたディレクトリ限定で検索して実行している。

例えば**echo**コマンドだって実際は**/bin/echo**が実行されているわけで、/root/echo があったところで見向きもされない。

だが、逆を返せば$PATHで指定されたところにファイルを置けばコマンドとして認識されるわけだ。

ちなみに、コマンドの場所をフルパスで調べたい場合は**which command_name**でエンターキーｶｯﾀｰﾝしよう。

##Let's try

テキトーなディレクトリ上でコマンドの中身を作成。

```
# vim testhello
#!/bin/sh

echo "HelloWorld!"
```

見て分かる通りechoコマンドで"HelloWorld!"を出す猿でも作れるスプリクトです。

そんでもって次は誰でも実行できるようにしないと行けないので権限あたりを弄ります。

```
# chmod a+x testhello
```
一応説明するとchmodは権限変更するコマンドで"a+x"は「全てのユーザーに実行権限を与える」という意味合いです。

そして仕上げに$PATHのどれかにぶち込んで、確認、実行で終了。

```
# cp testhello /usr/local/bin/
# which testhello
/usr/local/bin/testhello
# testhello
HelloWorld!
```

以上でスプリクトをコマンドにする方法終わり。


##$PATHに追加する
「なんで俺が$PATHに合わせないといけないんだよ」

って人は$PATHにディレクトリを追加しましょう。
例として**/root/bin**を$PATHに入れる。

ユーザー限定で指定したい場合は~/bash_profile
ユーザー全体で指定したい場合は/etc/profile (末尾に追加)
に以下のコマンドを追加すればOK

```
# PATH=$PATH:/root/bin
# export
```
↑のコマンド直接入力しても構わないが、毎回ログインのたびにリセットされるので注意。

##被りの場合の優先度
色々コマンドを増やしていると他のディレクトリと被ることもある。

例えば**/usr/local/bin**と**/sbin**で同じ名前のコマンドを入れてしまた場合$PATHの左側から優先されるので**/usr/local/bin**に入っているコマンドが優先される。