OmniAICreator/Qiita-1.07M huggingface dataset:
Atomがよくフリーズするようになったらすること

**制作者さまの対応によりJapanese Wrapの問題は解消されました。問題が発生する方はパッケージのアップデートをしてみてください**

====================================================

ここ数日、特定のファイル開くとフリーズすることに気付く。

**"editor is not responding"**

っていうアラートが何度も何度も出る。
パッケージ入れすぎてたかな？って思ったけど、別に容量の大きくないファイルでもフリーズするからたぶんそういう問題じゃない。

そこで解決策を見つけたので投稿。

## 原因は外したくないあのパッケージ
たどりついた原因は [**Japanese Wrap**](https://github.com/raccy/japanese-wrap) でしたと。
アンインストールすると例の問題は起きなくなりました。
しかし、MarkdownをほとんどAtomで編集する身としては外したくない。

## 日本語の禁則処理をしない
日本語の禁則処理をしないようにするだけでアラートが出なくなることを確認。エディタが止まることに比べたら、禁則処理などね。

Setting - Package - Japanese Wrap - Setting から 『日本語禁則処理を行う』のチェックを外す。

![pasted_image_at_2015_04_06_18_46_720.png](https://qiita-image-store.s3.amazonaws.com/0/58800/bf003e27-ff5e-707f-f839-b28a95de7308.png)

## なぜかセッティングにその項目がない場合
私の場合はなぜかその項目が出ないという現象に出会ったので、config.csonに追記する場合もあると思うので、以下の画像のように ```japanese: false``` を加える。
![Screenshot 2015-04-06 20.50.48.png](https://qiita-image-store.s3.amazonaws.com/0/58800/271503e1-a3e2-1fe5-539b-5d73ee3c263f.png)

以上です。今は快適に使えてる模様です。

それではみなさんよいAtomライフを。  
【参考】[atomのjapanese-wrap](http://lewa.jpn.org/2015/04/atom_japanese-wrap/)
[Blender] EnumPropertyの選択項目を動的に設定する方法

Blenderには、ユーザから値を指定できるようにUIを提供するためのProperty系の関数があり、その中でも**セレクトボックスを作成するEnumProperty**というものがあります。
この関数、選択項目を静的に設定する分には問題なかったのですが、**選択項目を動的に設定する場合**に少し戸惑ってしまったので、同じ問題に当たってしまっている人向けに紹介したいと思います。

# 選択項目を静的に設定

動的に設定する場合との比較のため、選択項目を静的に設定するサンプルコードを以下に示します。
**あらかじめ作成しておいたリストをitemsに指定**することで、セレクトボックスを作成しています。

```py:static_append.py
import bpy
from by.props import *

# セレクトボックスに表示したい項目
axis = (
    ("X", "X-axis", ""),      # (識別子, UI表示名, 説明文)
    ("Y", "Y-axis", ""),
    ("Z", "Z-axis", ""))

transform_axis = EnumProperty(
    name = "Transform Axis",          # 名称
    description = "Transform Axis",   # 説明文
    items = axis)                     # セレクトボックスに表示したい項目リスト
```

# 選択項目を動的に設定

続いて選択項目を動的に設定するサンプルコードを以下に示します。
こちらでは、**itemに項目リストを作成する関数を指定**しています。

項目リストを作成する関数内で設定したい項目を設定し、作成した項目リストを関数の戻り値として返しています。
**変数object_listが参照される度にitemsに指定した関数が呼ばれる**ため、選択項目を動的に設定することができます。

```py:dynamic_append.py
import bpy
from bpy.props import *

# セレクトボックスに表示したい項目リストを作成する関数
def get_object_list_callback(scene, context):
    items = []
    # itemsに項目を追加する処理...

    return items

object_list = EnumProperty(
    name = "Object List",               # 名称
    description = "Object List",        # 説明文
    items = get_object_list_callback)   # 項目リストを作成する関数
```

# 参考情報

* http://www.blender.org/api/blender_python_api_2_66_4/bpy.props.html
* http://blender.stackexchange.com/questions/10910/dynamic-enumproperty-by-type-of-selection
文字列の長さによりUILabelのheightが自動調整し、かつ、TableViewCellのheightもそれに合わせて自動調整する

## NOTE
* If an app runs on iOS8 or more, see http://qiita.com/nari6a/items/9e1388e7524c6028a885

## Case 1) 文字列の長さによりUILabelのheightが自動調整し、かつ、TableViewCellのheightもそれに合わせて自動調整する

### UILabel(UIView)
* "Lines"をゼロに設定
* top/left spaces and (bottom/right spaces or width/height)のConstraintsを設定
* 最下部のUIViewのbottom space Constraintのpriorityを下げる

### UITableViewCell
* UIView.preferredMaxLayoutWidthを設定

```
e.g.)
- (void)layoutSubviews {
    CGRect bounds = self.bounds;
    self.messageLabel.preferredMaxLayoutWidth = bounds.size.width - 12 - 12; // horizontal spaces in Constants
    [super layoutSubviews];
}
```

  * see: http://blogios.stack3.net/archives/1966, http://blogios.stack3.net/archives/1983

### UITableView
* tableView:cellForRowAtIndexPath:にて、コンテンツを設定

```
e.g.)
TableViewCell02 *c = [tableView dequeueReusableCellWithIdentifier:@"TableViewCell02" forIndexPath:indexPath];
[c setMessage:_message021];
cell = c;
```

* tableView:heightForRowAtIndexPath:にて、[UIView systemLayoutSizeFittingSize]よりheightを取得/設定(iOS7の場合)
* tableView:heightForRowAtIndexPath:にて、UITableViewAutomaticDimensionをheightに設定(iOS8の場合)

```
e.g.)
CGFloat height;
if (SYSTEM_VERSION_GREATER_THAN(@"8.0")) {
    height = UITableViewAutomaticDimension;
}
else {
    [_stubCell02 setMessage:_message021];
    [_stubCell02 setNeedsLayout];
    [_stubCell02 layoutIfNeeded];
    height = [_stubCell02.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
}
```

* tableView:estimatedHeightForRowAtIndexPath:にて、estimate heightを設定

```
e.g.)
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 43.0;
}
```

### UIViewController
* "Simulated Size"は、"Fixed"に設定 (Because, on iOS7, [UIView systemLayoutSizeFittingSize:] doesn't return a correct size)

## Case 2) Case1にheightの最大値を設ける

### UILabel(UIView)
* HeightのConstraintsを設定

## See
* [Flexible Custom View, Constraint, preferredMaxLayoutWidth](http://blogios.stack3.net/archives/1966)
* [Flexible TableViewCell, Constraint, preferredMaxLayoutWidth, systemLayoutSizeFittingSize](http://blogios.stack3.net/archives/1983)
* https://github.com/stack3/iOSAutoLayoutSamples
* https://github.com/hirayaCM/AdjustableLabelCellSample
* https://github.com/usagimaru/SelfSizingCells
Play WS SSL のデバッグ


Play WS SSL でクライアント証明書が渡せているかを調べた際のメモ

Play Framework は 2.3.x 以上

conf/application.conf に以下を追加してアプリ再起動

```
ws.ssl.debug = [ "ssl", "trustmanager", "keymanager" ]
```

標準出力にSSLの情報のトレースがでている

サーバの証明書情報

```
*** ServerHello, TLSv1.2
RandomCookie:  GMT: 1428301896 bytes = { 111, 222, ..., 789 }
Session ID:  { 999, 888, ..., 123 }
Cipher Suite: TLS_ECDHE_RSA_WITH_RC4_128_SHA
Compression Method: 0
Extension renegotiation_info, renegotiated_connection: <empty>
Extension ec_point_formats, formats: [uncompressed, ansiX962_compressed_prime, ansiX962_compressed_char2]
***
%% Initialized:  [Session-1, TLS_ECDHE_RSA_WITH_RC4_128_SHA]
** TLS_ECDHE_RSA_WITH_RC4_128_SHA
New I/O worker #26, READ: TLSv1.2 Handshake, length = 3745
*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=xxxx, OU=yyyy, O=hoge.com, L=Minato-ku, ST=Tokyo, C=JP
  Signature Algorithm: SHA1withRSA, OID = x.y.zzz.aaaaaa.b.c.d

  Key:  Sun RSA public key, 2048 bits
  modulus: 
123456...
  public exponent: 65537
  Validity: [From: Tue Jan 20 12:16:57 JST 2015,
               To: Wed Jan 20 23:59:00 JST 2016]

```

クライアントの証明書情報

```
*** ServerHelloDone
matching alias: 1
*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=yyyy, OU=zzzzz, O=hoge.com, L=Minato-ku, ST=Tokyo, C=JP
```

参考

https://docs.oracle.com/javase/jp/6/technotes/guides/security/jsse/ReadDebug.html
比較演算子を使うときの値の記述順序

# はじめに

ふとしたきっかけで"みんな何も言わずにこういうルールでやってるんだろう"という自分の思い込みに気づいた。

# ifを使うときの比較演算子

最近人のコードを見ていて次のようなコードが合って

```c
if (a > b) {
  // 処理
}
```

これは次のようにしたほうがわかりやすいんじゃないかなと思ったわけです

```c
if (b < a) {
  // 処理
}
```

理由としては、条件として値の比較を使う場合に"比較演算子の左側を常に小さいものを置く"というルールを縛っておくと一貫性がありますよと。

また、比較したい値の条件は複数ある場合が多く、下記のようなコードを書くことが多いですよね。

```c
if (b < a && a < c) { // 数学でよくみるこういうやつ b < a < c をやりたい
  // 処理
}
```

これを同じ結果のまま最初のやり方でやろうとすると次のようになります

```c
if (a > b && a < c) { // 数学でよくみるこういうやつ b < a < c をやりたい
  // 処理
}
```

前者は数学でよく見る範囲の関係性に近づけていると読む方はスムーズに読めて、
後者は日本語で表現すると「値aがbより大きい時」かつ「値aが値cより小さい時」っていう考え自体をそのままコーディングしているわけです。主語がaという値で考えて比較をしてるという表現ですかね。

自分の頭のなかでも一旦日本語で主語があり比較を考えてるのかもしれないけど、自然に置き換えてて前者の範囲で捉えるやり方で書いたりしてたわけですよ。みんなそうだと思ってて疑いもしなかった。

## ここまでのまとめ

- 条件で比較を表すときに左に小さい方を置く方法を"範囲比較法"としとく
- 条件で比較を表すときに比較の主語になる値を左に置く方法を"主語比較法"としとく
- コーディングしてる時は頭のなかで"主語比較"をしてるかもしれないけど実際にコードにするときは"範囲比較法"をとっていた
    - 自分はこれがあたりまえだと思っていた

# forでの比較演算子

forではみんな範囲比較してるんじゃないのという気がしたのでforについて考える。

例えばfor文でこんなのあるじゃないですか

```c
for (i = 0; i < max; i++)
```

これもiを左においている。ここでは

- 条件として成立するとき小さくなる方を左においている（範囲比較法）

とも考えられるけど

- iに対して条件を設定している（主語比較法）

とも考えられるのでどっちとも取れる。

じゃあmaxの値から0になるまでカウントダウンするならどうかと考えると自分だと"範囲比較法"で次のようになる

```c
for (i = max; 0 <= i; i--)
```

分かりやすい...めっちゃ分かりやすいしこれ以外ないでしょ...と思ってたら教えてもらったのがGitHubで"for i--"を条件に検索した結果

https://github.com/search?l=Objective-C&q=for+i--&type=Code&utf8=✓

大半が下記のようにまずiを左においていて主語比較法になっていました。

```c
for (i = max; i >= 0; i--)
```

# 結論

GitHubの検索結果として大半がi >= 0を使っているということはifでの比較も主語比較を行っていると思えるのでかなり衝撃ですわ（ですわっていうのはお嬢様が今日はお天気もよくピクニック日和ですわ、に使われるですわではない方）。

思い込みと習慣ってすごい。これから主語比較法で書いてったほうがいいかもしれないがかなりの違和感がある。
関数のInvokeによるCFunctionPointer使う

InvokeFunction.h

```c
#include <stdio.h>

int invoke_fun(int (*f)(void));

#endif /* defined(__LiveCyalume__InvokeFunction__) */
```

InvokeFunction.c

``` c
#include "InvokeFunction.h"


int invoke_fun(int (*f)(void)) {
    return f();
}
```

{ProjectName}-Bridging-Header.h

```c
int invoke_fun(int (*f)(void));
```

ViewController.swift

```swift

let handle = dlopen("/usr/lib/libc.dylib", RTLD_NOW)
let sym : UnsafeMutablePointer<Void> = dlsym(handle, "random")
let rawPointer = UnsafeMutablePointer<() -> Int32>(sym)
let opaquePtr : COpaquePointer = COpaquePointer(rawPointer)
let cFunPointer  = CFunctionPointer<() -> Int32>(opaquePtr)
println(invoke_fun(cFunPointer))
```

ただし、RetrunタイプがObjectの場合には使えない。
rakeのruleを理解する


```
rule ".c" do |t|
 p t
end
```
これでhoge.cというタスクが作られている。

```
rake a.c
<Rake::FileTask a.c => []>
```

```
rake d.c
<Rake::FileTask d.c => []>
```

依存関係を使うと

```
rule ".o" => ".c" do |t|
 p t
end

rule ".c" do |t|
 p t
end
```
とすれば

```
rake d.o
<Rake::FileTask d.c => []>
<Rake::FileTask d.o => [d.c]>
```
firewall-cmdでIPアドレスの許可




192.168.0.1からのアクセスを許可

`firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.1/32" accept'`

192.168.0.1からのアクセスを削除

`firewall-cmd --permanent --remove-source=192.168.0.1/32`

firewall-cmdのリロード

`firewall-cmd --reload`
OmniAuthのTwitterログインが、Herokuにデプロイしたらエラーになった

パーフェクトruby on railsでイベントアプリを作って、それをherokuにデプロイしたら、ローカルでは動いていたTwitterログインが動かなくなりました。なかなか解決するまで時間がかかったのでメモ。

http://qiita.com/hirokishirai/items/5a43977a38ecd922bfb9
この辺の記事を読んでみてもダメだったら、環境変数が原因かもしれません。

#1. herokuに環境変数が設定されていなかった
結論から言うと、どうやらこれが原因らしいです。環境変数は"config/secrets.yml"に書いてあります。
（yourから始まる部分は、各自で異なります。念のため。）

```lang:secrets.yml
default_twitter: &default_twitter
  twitter_api_key: 'your_twitter_api_key'
  twitter_api_secret: 'your_twitter_api_secret'


development:
  secret_key_base: your_secret_key_base
  <<: *default_twitter


test:
  secret_key_base: your_secret_key_base
  <<: *default_twitter


# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  twitter_api_key: <%= ENV["TWITTER_CONSUMER_KEY"] %>
  twitter_api_secret: <%= ENV["TWITTER_CONSUMER_SECRET"] %>

```

一番下の、本番環境で設定される環境変数

```lang:secrets.yml
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  twitter_api_key: <%= ENV["TWITTER_CONSUMER_KEY"] %>
  twitter_api_secret: <%= ENV["TWITTER_CONSUMER_SECRET"] %>
```

を、herokuに登録します。
#2. heroku に環境変数を登録する
簡単です。
アプリケーションのある階層まで移動して、以下のコマンドを打ちます。

```
$ heroku config:add TWITTER_CONSUMER_KEY="your_twitter_api_key"
$ heroku config:add TWITTER_CONSUMER_SECRET="your_twitter_api_secret"
```

以上です。念のため、以下のコマンドを打ってherokuに環境変数が追加されていることを確認しましょう。

```
$ heroku config
```
Struts2におけるリクエストパラメータの扱い（中級）～ScopedModelDriven

# ScopedModelDrivenとは

ScopedModelDrivenはActionクラスを拡張するStruts2標準インタフェースの1つです。これを使うことで、リクエストパラメータの内容をActionクラス自身ではなく、Actionクラスが持つ別のクラスへ格納します。

## 利用法

使うためには、Actionクラスに以下の実装をするだけです。

* ActionクラスにScopedModelDrivenインタフェースを実装する
* ScopedModelDrivenのメソッドを実装する
* Actionクラスのフィールドに、ScopedModelDrivenのメソッドの内容を格納する

言葉で書くとわかりにくいので、実際に実装した例を示します。

```java:ScopeSampleAction.java
public class ScopeSampleAction extends ActionSupport implements ScopedModelDriven<User> {

	@Getter @Setter
	private User model;

	@Getter @Setter
	private String scopeKey;
}
```

ScopedModelDrivenでは、modelとscopeKeyのset/getメソッドを実装します。modelはリクエストパラメータを格納するクラス、scopeKeyは後述するScopeへ格納する時の名称です。

こうすることで、HTMLの送信パラメータを修正せずに、直接modelへ値の格納を行います。

## Scopeについて

ScopeはJavaのWebアプリケーションスコープと同じスコープが使えます。ScopedModelDrivenでは、ServletRequest属性ないしはHttpSession属性のどちらかです。デフォルトはServletRequest属性です。

scopeKeyの値はHttpSession属性へ格納するときの名前で、Struts2の内部で自動的に生成した値が入ります。

## HttpSession利用の設定方法

ScopedModelDrivenの動作はStruts2の標準機能として有効になっています。HttpSessionの利用、つまりScopedModelDrivenで扱うクラスをセッションへ格納するには、ScopedModelDrivenの設定を変更します。

以下の例は、標準のインターセプタ設定に、ScopedModelDrivenの設定を変更する例です。

```java:ScopeSampleAction.java
@InterceptorRefs(
		value = {
				@InterceptorRef(value="defaultStack" , params={"scopedModelDriven.scope","session"}) ,
		}
)
public class ScopeSampleAction extends ActionSupport implements ScopedModelDriven<User> {

	@Action("scope")
	public String start() throws Exception {

		if ( model == null ) {
			model = new User();
		}

		return SUCCESS;
	}

	@Getter @Setter
	private User model;

	@Getter @Setter
	private String scopeKey;
}
```

@InterceptorRefs,@InterceptorRefはStruts2のAction実行前後に動くインターセプタと呼ばれる、フィルタリング機能を設定するアノテーションです。
ScopedModelDrivenは、scopedModelDrivenの名前で struts-default.xmlで定義済みなため、params属性にて指定します。

設定の書き方は、

```
params={"設定名","設定値" , "設定名","設定値" , …(以後繰り返し)… } 
```

となります。

設定名については設定の階層構造に沿って定義できるようになっています。今回はScopedModelDrivenのscope値を変更するため、scopedModelDriven.scope が設定値となります。

このインターセプタ設定については高度な設定方法となりますので、また別途。
正規表現の練習


をしてみた。


#問題
### Q1 a$

行末のaにマッチ


### Q2 .*a$

行末のaがある行にマッチ

### Q3 ^a

aで始まる行のaにマッチ


### Q4 ^a.*

aではじまる行にマッチ


### Q5 a|b

aかbにマッチ

### Q6 \s

空白文字(\t\n\r\f)にマッチ


### Q7 \d

半角数字にマッチ

### Q8 \D

半角数字以外にマッチ

### Q9 [abc]
a,b,cにマッチ

### Q10 [a-c] 
a,b,cにマッチ


### Q10 [^a-c]
a,b,c以外にマッチ

### Q11 (c)\1
ccにマッチ
Automatorでテキストファイルを結合する


あるテキストファイルを複数連結させて１つのテキストファイルにする方法です。

## Automator

Mac OSには便利なアプリがデフォルトで利用できます。
Automatorと言い、意外と皆さん知らないかも？

こんなアイコンです。
![image001.png](https://qiita-image-store.s3.amazonaws.com/0/6311/e43b9945-5b8b-b2d9-0914-b796d7b6f262.png "image001.png")

Spotlightで **Automator** と検索してみましょう。

## ワークフローを設定する

種類の選択で、ワークフローを選択します。

![image002.png](https://qiita-image-store.s3.amazonaws.com/0/6311/90891af1-eadd-6fe0-9778-c727ddf70080.png "image002.png")

左側のメニューから、 **ライブラリ > テキスト > テキストファイルを結合** を選択します。

![image003.png](https://qiita-image-store.s3.amazonaws.com/0/6311/b6a122ed-dad2-338c-503f-46c58a979b8c.png "image003.png")


結合したいファイルを選択し、右側の窓にドラッグ＆ドロップ（テキストファイルを結合の上）します。
![image004.png](https://qiita-image-store.s3.amazonaws.com/0/6311/1a51134e-7ec7-4832-eef6-b53080e674c7.png "image004.png")


左側のメニューから、 **ライブラリ > テキスト > 新規テキストファイル** を選択します。
![image005.png](https://qiita-image-store.s3.amazonaws.com/0/6311/a18ed448-cdb5-df87-64a7-de3f4b212a52.png "image005.png")


右上の **実行** をクリックしてワークフローを実行します。
![image006.png](https://qiita-image-store.s3.amazonaws.com/0/6311/eaf34712-bd94-087d-38c6-b8ac14e4a5f2.png "image006.png")

ワークフローが実行され、結合されたテキストファイルが作成できます。
![image007.png](https://qiita-image-store.s3.amazonaws.com/0/6311/6e1490ce-7efa-d872-b449-2f77421de5e0.png "image007.png")


## まとめ
AutomatorはExcelでいうとマクロのようなもの、
使いこなすと色々な定型タスクが楽になります。是非沢山設定して自分のタスクを効率化させてみましょう。
【メモ】gulp-rsyncで#<SyncWriteStream> has no method 'cursorTo'

```coffeescript
  gulp.src('/var/apps/statics/font/**')
  .pipe(rsync({
    root: '/var/apps/statics/font/',
    hostname: 'hoge-static01',
    destination: '/var/apps/statics/font/',
    progress: true,
    recursive: true ,
    compress: true,
    clean: true,
    exclude: [
      '.git',
      '.gitignore',
      'node_modules'
    ]})
  ).on('error',function(msg){console.log(msg)});
```
watchからこんな感じで実行したら以下のようなエラーでこけた

```coffeescript

/etc/gulp/node_modules/gulp-rsync/log.js:8
  process.stdout.cursorTo(0);
                 ^
TypeError: Object #<SyncWriteStream> has no method 'cursorTo'
    at Console.log (/etc/gulp/node_modules/gulp-rsync/log.js:8:18)
    at module.exports (/etc/gulp/node_modules/gulp-rsync/node_modules/gulp-util/lib/log.js:8:15)
    at module.exports (/etc/gulp/node_modules/gulp-rsync/log.js:15:26)
    at /etc/gulp/node_modules/gulp-rsync/index.js:112:13
    at Array.forEach (native)
    at /etc/gulp/node_modules/gulp-rsync/index.js:111:29
    at Array.forEach (native)
    at Socket.handler (/etc/gulp/node_modules/gulp-rsync/index.js:110:37)
    at Socket.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:764:14)

```

[issue発見](https://github.com/jerrysu/gulp-rsync/issues/9)

＿人人人人人人人人人人人人人人人人人＿
＞　　　Seems project is abandoned　　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣


silent: true
つけてとりあえずこけなくなったけど、なんだかなぁ

```coffeescript
  gulp.src('/var/apps/statics/font/**')
  .pipe(rsync({
    root: '/var/apps/statics/font/',
    hostname: 'hoge-static01',
    destination: '/var/apps/statics/font/',
    progress: true,
    recursive: true ,
    compress: true,
    silent: true,
    clean: true,
    exclude: [
      '.git',
      '.gitignore',
      'node_modules'
    ]})
  ).on('error',function(msg){console.log(msg)});
```
HomebrewでインストールしたEmacsのemacsclientを使う

MacOSX上でHomebrew版のEmacsを使っている人向けの記事です。

うっかり/usr/bin/emacsclientを起動すると、普段使いのEmacsとバージョンが異なっているため、うまくEmacsと通信できません。そこで、$HOME/bin/emacsclientを作ってそれを使いましょう。

```bash
#!/bin/bash
$(brew --prefix emacs)/bin/emacsclient $@
```

対応するシンボリックリンクを作ってもいいんですけど、こうしておくとEmacsのバージョン上がったときも使い続けられるので便利です。

同じノリで$HOME/bin/emacsなども作っておくと良いかもしれません。
Vagrant 1.7.2 + CentOS 7.1.1503 で、private_networkの ip address が消える

##現象##
Vagrant 1.7.2でCentOS 7.1.1503をデプロイすると、vagrant up（初回）後、しばらくすると Private NetworkのIP Addressが消えてしまう（もちろん、sshでも private network側 interface には入れない）。network.serviceをrestartしたり、/etc/init.d/network restartすると一時的に復活するが、しばらくすると、また消えてしまう。vagrant reload すると、復活して以後は消えなくなる(Nat側は問題ない)。

##環境##
* vagrant 1.7.2
* Windows 8.1 Pro(vagrantが動作しているOS)
* VirtualBox 4.3.26 r98988
* CentOS 7.1.1503(デプロイするOS)


##Box##
* ATLASに上がっている alexandrem/centos-7.1
* minimal の iso から自分でpackageしたboxも同様

##対処方法##
Vagrantfileに、下記のインラインスクリプトを記述したところ、初回のvagrant up直後も問題は発生しなくなった。

```lang:Vagrantfile
    config.vm.provision "shell",
      inline: "nmcli connection reload;systemctl restart network.service"
```

ちなみに、network.serviceのrestartだけとか、NetworkManager.serviceのrestartでは解決しなかった。/etc/sysconfig/network-scripts/を見ると、vagrantがprivate network用のスクリプトを配置している。ネットワークスクリプト中では、"NM_CONTROLLED=no"としているが、恐らく、このネットワークスクリプトを配置したことをNetworkManagerに知らせていないので、スクリプトの設定をNetworkManagerが掃除してしまうのではないかと推測するがどうだろう。
ubuntuにElasticsearchを入れる

過去にApacheSolrは触ったことがあるのですが、
最近Elasticsearchなるものが話題になっているので
触ってみることにしました。

# 環境
 * VirtualBox 4.3
 * ubuntu 14.04
 * java8(1.8.0_25)
 * Elasticsearch(1.5.0)

# 準備から起動まで
今回はアーカイブを利用します

## インストール

```bash
$ cd
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.5.0.tar.gz
$ sudo mv elasticsearch-1.5.0.tar.gz /usr/local/src/
$ cd /usr/local/src
$ sudo tar zxvf elasticsearch-1.5.0.tar.gz
$ cd /usr/local/
$ sudo ln -s ./src/elasticsearch-1.5.0 elasticsearch
```
※保存先、シンボリック等はお好みで。

## 起動

```bash
$ cd /usr/local
$ sudo ./elasticsearch/bin/elasticsearch
※標準出力になります。daemon起動する場合は「-d」を付けます
$ sudo ./elasticsearch/bin/elasticsearch -d
```

## 確認

```bash
$ sudo curl 'http://localhost:9200/?pretty'
{
  "status" : 200,
  "name" : "Golem",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.5.0",
    "build_hash" : "544816042d40151d3ce4ba4f95399d7860dc2e92",
    "build_timestamp" : "2015-03-23T14:30:58Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}
```

リクエストをしたら何やら返却されました。

次回はElasticsearchの設定周りを触ってみようと思います。
shell script > [ ] / [[ ]] / $(( )) / (( )) / ( ) / expr などなど

bashなどのシェルスクリプトにおいて [ ] や( )などを詳しくは調べずに使ってきた。

[こちら](http://qiita.com/YU81/items/b1bde03c06b45f7d267f)の投稿の内容で気になったので調べて、以下のサイトを見つけた。

[hyperpolyglot](http://hyperpolyglot.org/unix-shells#arith-conditional-expr)


表記と名前は以下のものらしい (bashに関して)。

| 表記 | name |
|:---:|:---:|
| [ ] | test command |
| [[ ]] | conditional command |
| $(( )) | arithmetic expansion | 
| (( )) | arithmetic command |
| ( ) | subshell または array記法 |
| expr | external expression |

これらの使い分けをきちんとしていないと、間違った使い方をしてはまるかもしれない。

コマンドなのか、式計算なのか、条件式なのか、といった識別が大切かもしれない。
GameObject.FindWithTag とGameObject.FindGameObjectWithTag の違い

##GameObject.FindWithTag とGameObject.FindGameObjectWithTag の違い
特になし。ただし、FindWithTagを使ったほうがいいと思う。

GameObject.FindGameObjectWithTagは、Unityのドキュメントに検索しても引っかからない
GameObject.FindWithTagは、Unityのドキュメントに検索しても引っかからない
なので、FindGameObjectWithTagはこれからFindWithTagに吸収されると思われる。
なのでFindWithTagを使ったほうがいいと思う。

ちなみにGameObject.FindGameObjectsWithTagはUnityのドキュメントに載ってる。
Android StudioでJDKのパスを変更する　　

OS XでプリインストールされているJDKは6ですが、Android StudioでLollipop以上のコードを書こうとするとJDKバージョン7以上を求められるので、案内に従ってOracleのページからJDK8をインストールして再起動してもやっぱり7以上が入ってないと言われてしまいます。

インストールされていないわけではなく、参照するパスが間違っているからのようです。（なんどもJDKインストールしてしまったのは内緒です。）

>Fileメニュー
>└ Project Structure

をひらき、SDK Locationをみると

`/System/Library/Java/JavaVirtualMachines/`

を指していると思います。Oracleのサイトからダウンロードした場合は、

`/Library/Java/JavaVirtualMachines/`

になるので、こんな感じで設定してあげましょう。

`/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home`
wordpress サイト移設方法

wordpressを開発環境で作業した後に、本番環境に移設することがあるかと思います。そのための方法をまとめます。基本的に以下の4ステップで出来ると思います。

# 1.wp/wp-configの削除
wp-configを削除した後に、/にアクセスするとconfig 作成画面にアクセスできる。（もちろん、データベースの設定は前もってしておく。）
そして、指示に従ってconfigの設定をする。(データベース設定など)

# 2.データベースの移設
元サイトのデータベースをエクスポートする。
新しいデータベースのテーブルを全削除して、エクスポートしたファイルをインポートする。

# 3.url設定の変更
データベースの中のテーブル「wp-options」の中の「siteurl」、「home」の設定する。
siteurl:(サイトのURL)
home:(サイトのURL）

# 4.wp直下の.htaccessの変更
ー3.まででサイトにアクセスできればオーケー。
ロリポップだと勝手に設定されていて、上手くいかないので変更。

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
```
activatorで「unresolved dependencies」が出た時


# activatorで「unresolved dependencies」が出た時

play frameworkのテンプレート作成において、activatorで
```
activator run
```
を実行したときに、「unresolved dependencies」エラーになる場合



## resolversを追加してみる

libraryのdownloadが失敗しているので、build.sbtに以下を追加するとうまく行くことがあった。

```
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
resolvers += "Typesafe repository mwn" at "http://repo.typesafe.com/typesafe/maven-releases/"
```

しかし、これがうまく行かない場合も多々ある


## ivy2のcacheを削除してみる

ivy2のcacheがおかしくなっている可能性も高い
例えば

```
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	::          UNRESOLVED DEPENDENCIES         ::
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	:: commons-io#commons-io;2.0.1: configuration not found in commons-io#commons-io;2.0.1: 'master(compile)'. Missing configuration: 'compile'. It was required from com.typesafe.play#routes-compiler_2.10;2.3.8 compile
```

のような場合だったら、

```
rm -fr (HOME)/.ivy2/cache/commons-io/
```

みたいにcacheディレクトリを削除してみるとうまく行った。
rm -frは自己責任でお願いします。
ブラウザごとに適用されるCSSハック

覚書～。

chromeとoperaだけに効くスタイル

```
@media all and (-webkit-min-device-pixel-ratio:0) and (min-resolution: .001dpcm) {
  .box {
    background-color: red;
  }
}
```

firefoxだけに効くスタイル

```
@-moz-document url-prefix() {
  .box {
    background-color: red;
  }
}
```
CLI | terminalで１行 while Loop

 最近 `github`でプッシュしにくいなった。プッシュのときに下のコマンドやってた。プッシュ失敗したら、Loopだから毎回プッシュしていく

```bash
$ while true; do push_current_branch; sleep 5; done
```

サーバーのメモリー管理時とか

```bash
$ while true; do free -m; sleep 5; done
```

いろんなツールとかあると思いますが、たまにシンプルなコマンドでも便利。
OSX版Chromeでプロファイルごとに別々のアイコンをDockに表示する

情報元： http://apple.stackexchange.com/questions/66670/is-there-a-simple-way-to-have-separate-dock-icons-for-different-chrome-profiles

For having two Chrome running at the same time you need to create a second runnable Google Chrome App.

You can create that second application by running the following script. It comes from this site, I copy and paste for readers' convenience:

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

PROFILE_NAME=$1
mkdir -p "/Applications/Google Chrome $1.app/Contents/MacOS"

F="/Applications/Google Chrome $1.app/Contents/MacOS/Google Chrome $1"
cat > "$F" <<\EOF
#!/bin/bash

#
# Google Chrome for Mac with additional profile.
#

# Name your profile:
EOF

echo "PROFILE_NAME='$PROFILE_NAME'\n" >> "$F"

cat >> "$F" <<\EOF
# Store the profile here:
PROFILE_DIR="/Users/$USER/Library/Application Support/Google/Chrome/${PROFILE_NAME}"

# Find the Google Chrome binary:
CHOME_BIN="/Users/$USER/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
if [[ ! -e "$CHOME_BIN" ]]; then
  CHOME_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
else
  echo "ERROR: Can not find Google Chrome.  Exiting."
  exit -1
fi

# Start me up!
exec "$CHOME_BIN" --enable-udd-profiles --user-data-dir="$PROFILE_DIR"
EOF

sudo chmod +x "$F"
```

Save it in a file (let's say create_second_chrome.sh in the Desktop folder), open the shell and execute it by passing as parameter the profile folder you want to associate to the second Chrome App. It will be called Google Chrome profile_folder_name. Let's suppose Google Chrome Development:

```shell-session
$ chmod 755 create_second_chrome.sh
$ ./create_second_chrome.sh Development
```

Now you can launch the new version of Chrome (Google Chrome Development) from the ~/Applications directory. You can set a different icon by right-clicking on the app and selecting 'Get Info'. You will see that this new version has its own icon on the dock and can be docked there if needed.
Selenium IDEの属性取得の優先順位変更方法


# はじめに
[日本Seleniumユーザーコミュニティ](https://groups.google.com/forum/#!topic/seleniumjp/q2yJTxrpL90)でこんな内容のやりとりがあったのと、自分もそんな機能を知らなかったので試してみて共有をします！

# 優先順位変更方法
* まず、はじめに...SeleniumIDEには自動でブラウザ入力操作を記録できる機能があります
* クリックや入力などの操作をする対象となる要素取得はcss,xpath,idやlink,name属性の名前などいくつか形式があります
* その優先順位を決めることが出来るのでそれをご紹介！
 * Selenium6年目ですが気付かなかった(というか自分でcssとかで書いちゃうので自動記録を使うことがあまりなかったw)
* 簡単なHTMLで属性の取得方法を変更してみると以下の結果になりました
 * 変更方法は「オプション」⇒「設定」⇒「Locator Builders」
 * 以下の例ではname, id, css, xpathの順に最優先を毎回変えて取得を繰り返して検証しています

```html
<!DOCTYPE html>
<html>
<body>
  <input id='login' name='username' class='name' type='text'>
</body>
<html>
```

![default.png](https://qiita-image-store.s3.amazonaws.com/0/19778/0c176cfb-24ac-0ef5-1427-a49e03558840.png)

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
【AppleScript＋InDesign】InDesignドキュメント上の使用フォントのPDF埋め込み許可を調べる

開かれている最前面のInDesignドキュメント上（配置されたInDesignドキュメントも含む）で使用されているフォントのPDF埋め込み許可を検査して、許可されていないフォントが存在した場合は、フォント名の一覧をダイアログに表示します。

InDesignドキュメント内にInDesignドキュメントが配置されている場合、使用フォントをfontsでまとめて取得すると、配置されているドキュメント上の使用フォントが、なぜかひとつだけ取得されるという不思議な挙動が…。（しかも、このフォントへのプロパティ参照はエラー…。）
ということで、フォント数のみを取得して以下の様な処理で回避。

※使用環境にインストールされていないフォントが使用されている場合などは、デフォルトフォントに置き換えられたりして正常に判定ができませんのでご注意を。

```applescript
on run
	try
		tell application id "com.adobe.InDesign"
			activate
			if (count of documents) is 0 then error "ドキュメントが開かれていません。"
			
			set no_emb to ""
			tell document 1
				repeat with i from 1 to (count of fonts)
					if (allow PDF embedding of font i is false) then set no_emb to no_emb & "\r・" & (full name native of font i)
				end repeat
			end tell
			
			if (no_emb is "") then
				error "すべての使用フォントのPDF埋め込みが、許可されています。"
			else
				error ("以下のフォントのPDF埋め込みが、許可されていません。" & no_emb)
			end if
		end tell
		
	on error err_txt
		activate
		display dialog err_txt buttons {"OK"} default button 1 giving up after 60 * 10
		return
	end try
end run
```
Windows版Apacheのconfigテスト

Windows版apacheなんて久々に触ったー
で、起動に失敗してるんでconfig編集を失敗している可能性がとっても高い。
Linuxならconfigtestでサクッと解決！なんだけど、Windowsさんにはどうやら見当たらない。
どうしたものか。。。
コマンドラインのオプションでも見てみましょうかね。
`httpd.exe -h`
いっぱいでてきました。

```
Usage: c:\\xampp\\apache\\bin\\httpd.exe [-D name] [-d directory] [-f file]
                                     [-C "directive"] [-c "directive"]
                                     [-w] [-k start|restart|stop|shutdown]
                                     [-k install|config|uninstall] [-n service_name]
                                     [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -n name            : set service name and use its ServerConfigFile
  -k start           : tell Apache to start
  -k restart         : tell running Apache to do a graceful restart
  -k stop|shutdown   : tell running Apache to shutdown
  -k install         : install an Apache service
  -k config          : change startup Options of an Apache service
  -k uninstall       : uninstall an Apache service
  -w                 : hold open the console window on error
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed settings (currently only vhost settings)
  -S                 : a synonym for -t -D DUMP_VHOSTS
  -t -D DUMP_MODULES : show all loaded modules
  -M                 : a synonym for -t -D DUMP_MODULES
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check
```

この中から「syntax check」っての探します。
居ました。　`-S`と`-t`ですね。
ぶつかりそうだからそれぞれ単独でチェックかけましょう。
`httpd.exe -S`
`httpd.exe -t`
これでダメだった原因もわかって、無事解決いたしました。

ちなみにXAMPPのapacheです。
Raspberry Piで1-Wireデジタル温度センサのDS18B20を使う

Raspberry PiのGPIOはデジタルなのでArduinoで使っていたTMP36やLM35DZなどのアナログセンサを使う場合はADコンバータが必要になります。今回は1-Wireデジタル温度センサのDS18B20を使ってみます。

## ブレッドボード配線

DS18B20を搭載したセンサモジュールはaitendoから[1820-3PL](http://www.aitendo.com/product/10812)を395円で購入しました。こちらは完成品のモジュールになっています。

* + (DS18B20) -> 3.3V  (Raspberry Pi)
* S (DS18B20) -> GPIO4 (Raspberry Pi)
* - (DS18B20) -> GND (Raspberry Pi)

## セットアップ

最初にパッケージを最新にしてアップグレードします。

``` bash
$ sudo apt-get update
$ sudo apt-get upgrade
```

カーネルのバージョンを確認します。

``` bash
$ uname -a
Linux raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux
```

[Raspberry Piで遊ぼう! 改訂第3版 最新情報お知らせページ](http://v7.com/raspi3/?page=3)に以下のような情報がありました。

> Raspbian 2015-01-31（NOOBS 1.3.12）以降では、1-wireを有効にするための設定手順が増えました。

`/boot/config.txt`の書き方が変更になったようです。以下の行をファイルの最後に追記します。

```txt:/boot/config.txt
dtoverlay=w1-gpio-pullup,gpiopin=4
```

再起動します。

``` bash
$ sudo reboot
```

w1-gpioとw1-thermのカーネルモジュールをロードします。

``` bash
$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm
```

## 使い方

カーネルモジュールをロードすると`/sys/bus/w1/devices`ディレクトリが作成されます。

``` bash
$ cd /sys/bus/w1/devices
$ ls
28-0314626a2cff  w1_bus_master1
```

'28-'で始まる値は温度センサーのデバイスIDです。この値はデバイス毎に異なります。'28-'のディレクトリに移動して`w1_slave`ファイルを読みます。


``` bash
$ cd 28-0314626a2cff 
$ cat w1_slave
b3 01 55 00 7f ff 0c 10 63 : crc=63 YES
b3 01 55 00 7f ff 0c 10 63 t=27187
$ cat w1_slave
b4 01 55 00 7f ff 0c 10 b3 : crc=b3 YES
b4 01 55 00 7f ff 0c 10 b3 t=27250
```

1行目にYESと表示されていると温度の計測が成功しています。`t=27187`の数字を1000分の1をすると摂氏になります。摂氏27.187度と摂氏27.250度が計測できました。
Struts2におけるリクエストパラメータの扱い（初級）

# リクエストパラメータの格納先

Struts2では、ブラウザからのリクエストをActionクラスへ反映します。リクエストパラメータ名と同じフィールド名に対して値を格納します。

例えば http://localhost:8080/sampleApp/start.action?userid=ZZ12345&username=capybara がリクエストされたときに、StartActionクラスが動作する場合では、以下の動作をします。

* ブラウザから呼び出すActionクラスは start.action にマッピングされたActionクラスを実行する
* リクエストパラメータは userid , username の2つ

これを受け取るActionクラスは以下のようになります。

```java:StartAction.java
public class StartAction extends ActionSupport {
	@Action("start")
	public String start() throws Exception {
		return SUCCESS;
	}

	@Getter @Setter
	private String userid;

	@Getter @Setter
	private String username;
}
```

* @Action は Struts2-Conventionプラグインのアノテーション
* @Getter @Setter は project lombokのアノテーションで、フィールドに対するgetメソッド、setメソッドを提供します。

## パラメータに過不足があった場合の振る舞い

* リクエストに対するActionクラスが存在しなかった場合は、Struts2の標準エラー画面になります。
* リクエストパラメータに対するActionクラスのフィールドとget/setメソッドがなかった場合は、そのパラメータは破棄されます。
 * 開発モードがONのときは、「リクエストパラメータに対するフィールドが存在しない」旨の警告がメッセージに追加されます。

## パラメータを別のクラスへ渡せる

Actionクラスにパラメータ用のフィールドをすべて用意すると、個数に応じてActionクラスのコードが長くなり、パラメータの変更があるたびにActionクラスを修正しなければならないので、メンテナンス性が悪くなります。

そこでStruts2では、Actionのフィールドに、値を格納するためのクラスを置けるようにしています。Struts1時代のActionFormのようなものですね。

先ほどの例から、useridとusernameを格納するクラスをUserDtoとします。

```java:UserDto.java
@Data
public class UserDto {
	private String userid;
	private String username;
}
```
@Dataはlombokのアノテーションです。すべてのフィールドに対しget/setメソッドを付与し、toString()メソッドの実装も提供します。

これを扱うActionクラスは次のようになります。

```java:SampleAction.java
public class StartAction extends ActionSupport {
	@Action("start")
	public String start() throws Exception {
		return SUCCESS;
	}

	@Getter @Setter
	private UserDto user;
}
```

Actionクラスのuserフィールドに、UserDtoを格納します。
少しすっきりしましたね。

ただし、Actionクラスのフィールド名を変更してしまい、UserDtoの内部へuseridやusernameを移動したため、先ほどのURLでは送信できません。

Actionクラスの **userフィールドが持っているuseridとusername** であるため、リクエストパラメータの名前を次のように変更します。

http://localhost:8080/sampleApp/start.action?user.userid=ZZ12345&user.username=capybara

このようにStruts2では、JavaScriptのようにクラスの階層をたどって値を格納しようと試みます。
しかしパラメータ名を毎回 fieldAAAAA.fieldBBBB のように記述するのは冗長だし、fieldAAAAAの部分は1種類しかない場合、Struts2にはこれを省略できる ModelDriven / ScopedModelDriven と呼ばれる拡張機能が使えます。

ModelDriven / ScopedModelDrivenについてはまた別途。
Eclipse WEB application 外部から接続

eclipse上で動作しているWEBアプリにそのマシン外部から接続する方法です。

# 試した環境
* OSX 10.10 
* Eclipse 4.4.2
　　
　　
　　

**Run Configurationsを開く**
![スクリーンショット 2015-04-06 11.54.31.png](https://qiita-image-store.s3.amazonaws.com/0/74328/9ea321b8-73e3-d56f-3d05-199283c6e7ba.png)
  
  
  
  
**Argumentsに `--address=0.0.0.0` を追加**
![スクリーンショット 2015-04-06 11.54.49.png](https://qiita-image-store.s3.amazonaws.com/0/74328/1e78d09e-5866-2080-9530-4a5425b50f97.png)
  

> 0.0.0.0の意味は全てのインターフェースからこのWEBアプリにアクセスできるようにする、です。特定のインターフェースからのみアクセスできるようにする場合には、そのインターフェースから振られたIPアドレスを指定してください。
  
  
  
  

**アクセスする**

レッツトライ！
Pythonでgitの操作をラッピング

自分用メモ。
PythonでGitの動きを把握するには、**subprocess** モジュールの **Popen** を使う。

```py

class GitError(BaseException): pass


def git(cmd, *args):
     command = ("git", cmd) + args
     proc = Popen(command, stdin=-1,stdout=-1,stderr=-1)
     out, err = proc.communicate()

    if len(err) == 0:
        return out.strip()
    else:
        raise GitError(err.strip())

```

これを応用した、**GitUtility** というクラスを作ってみる。

```py
from subprocess import Popen

class GitError(BaseException):
    """
    This Error raises when git command runner has error.
    """

    pass

class GitUtility(object):
    """
    The GitUtility contains utility functions for operate git.
    """

    def __init__(self):

        return

    def run(self, cmd, *args):
        """
        This command is git command runner by subprocess.
        Return output or raise GitError if runner has error.
        """

        if isinstance(args[0], tuple):
            # Avoid duplicate tuple
            # ex. self.rev_parse("--show-toplevel")
            #   ->('git', 'rev-parse', ('--show-toplevel',))
            command = ("git", cmd) + tuple([arg for arg in args[0]])
        else:
            command = ("git", cmd) + args

        proc = Popen(command, stdin=-1,stdout=-1,stderr=-1)

        out, err = proc.communicate()

        if len(err) == 0:
            return out.strip()

        else:
            raise GitError(err.strip())

    def add(self, path):
        """
        Run git add command
        """

        self.run("add", path)

    def commit(self, commit_msg):
        """
        Run git commit
        """

        return self.run("commit", "-m", commit_msg)

    def rev_parse(self, *args):
        """
        Run git rev-parse command
        """
        return self.run("rev-parse", args)

    def get_toplevel(self):
        """
        Return git top level path using git rev-parse
        """

        return self.rev_parse("--show-toplevel")
```

たとえば自動でコミットさせたいとか、`rev-parse` を使ったリポジトリのパスを取得したいとか、そういうことができる。
もっと応用すれば、ログのパースとか、あるコミット時点のファイルの中身を取得できたりもする。
Tumblr 独自ドメインをあてつつメールはそのままにする方法


下記を参考にできたよって話。
[参考:HK | メールは現状サーバそのままで、Tumblerにドメインお引越しの話。](http://h-k.so/post/102958123308/tumbler)


# 1. DNSの設定

####トップレベルドメインはAレコード
```
A: 66.6.44.4
```
####サブドメインはCNAME
```
CNAME: domains.tumblr.com
```

https://www.tumblr.com/docs/ja/custom_domains


ここで、重要なのはメールの設定はMXレコードで残すこと。
既存のMXレコードを調べるのは下記で
 [nslookup](http://www.makko.biz/nslookup/) 

```
MX: いま調べたやつ
```

# 2. Tumblrの設定
下記からTumblr URLを独自ドメインに設定すればおｋ．
[https://www.tumblr.com/settings/blog/設定したいブログ](https://www.tumblr.com/settings/blog/設定したいブログ)
もしかしたら、反映に時間かかるかもしれないので時間を置いてトライ。

以上。

ブラウザで独自ドメインのほうにアクセスして反映されてるはず。されてなければ、[OS X：DNS キャッシュをリセットする方法](https://support.apple.com/ja-jp/HT202516)を試してみる。

念のためメールも送信できるかテストしておくと吉。

以上です。お疲れ様でした。
一撃必殺！踏み台を経由のssh接続、ついでに接続先毎にターミナルの背景色を変える。(iTerm)


# ざっくり
- 踏み台サーバー経由でsshする時に面倒くさい(特にscp)
- でも一撃で本番環境とかテスト環境とかssh出来ると楽ちん過ぎてオペミスが・・・
- ターミナルの背景変えて緊張感を持たせる

# 多段sshを一撃で実施する

ssh時に読み込まれる設定ファイル(```~/.ssh/config```)にProxyコマンドを登録する事で解決出来る。

踏み台サーバーを```bastion```、接続したいサーバーを```stage```としたサンプル。

```~/.ssh/config
Host bastion-server                            # 名前は何でもOK。エイリアス。 ...[1]
    User         bastion-user                  # bastionサーバーに接続するユーザー名
    HostName     bastion-server.example.com    # bastionサーバーのhost名 or ip
    Port         10022                         # bastion踏み台サーバーのport番号(22の場合は省略可能)
    IdentityFile ~/.ssh/id_rsa_bastion         # bastion踏み台サーバーの秘密鍵

Host stage-server                              # 名前は何でもOK。エイリアス。
    User         stage-user                    # stageサーバーに接続するユーザー名
    HostName     stage-server.example.com      # stageサーバーのhost名 or ip
#    Port         22                            # 踏み台サーバーのport番号(22の場合は省略可能)
    IdentityFile ~/.ssh/id_rsa_stage           # stageサーバーの秘密鍵
    ProxyCommand ssh bastion-server -W %h:%p   # [1]で設定したエイリアスが生きる
```

これで一撃でstageサーバーにログイン出来る。

```iTerm
% ssh stage-server
% scp stage-server:/var/log/hoge.log ~/temp/.
% sftp stage-server
```

楽ちん。


## 複数接続先がある場合

```bastion-server1``` → ```bastion-server2``` → ```prod-server```
など複数踏み台がある場合も同様に書いていけば良い。

```~/.ssh/config
Host bastion-server1
  User         bastion-user1
  HostName     bastion-server1.example.com

Host bastion-server2
  User         bastion-user2
  HostName     bastion-server2.example.com
  ProxyCommand ssh bastion-server1 -W %h:%p

Host prod-server
  User         prod-user
  HostName     prod-server.example.com
  ProxyCommand ssh bastion-server2 -W %h:%p
```

## 残念だったこと
これを設定すればアヒル(cyber duck)からも一撃でつながるかと思ったけどダメだった。
たぶん、鍵+パスワード認証のせいかな。


# iTermの背景色を接続先毎に変更する
多分、改良すればデフォルトのターミナルやMac以外でも使える？？？

- url(github)から[ssh-host-color](https://gist.github.com/thomd/956095)のコードをDL(コピペでもOK)する
- パスの通ったディレクトリに配置する。<br/>実行権限付与も忘れずに。
- if文に適当にホスト名を設定して、好きな色を設定する。

上記の```~/.ssh/config``` を例にすると ```ssh-host-color```のif文はこんな感じに設定すると良い感じ？
色のセンスはお任せ。

```bash
# 踏み台サーバー
if [[ "$@" =~ bastion-server ]]; then
  set_term_bgcolor 0 0 40
# stageサーバー
elif [[ "$@" =~ stage-server ]]; then
  set_term_bgcolor 0 90 90
# 本番サーバー
elif [[ "$@" =~ prod-server ]]; then
  set_term_bgcolor 90 0 0
fi
```


以下のコマンドで背景色を変えつつ、ssh接続できる。
(exitすると元の色に戻る。サーバー側からの自動切断は・・・ごめんなさい。)

```iTerm
% ssh-host-color stage-server
```

ssh-host-colorのHeaderコメントにもあるように、シェルのプロファイルにエイリアスを追加すると便利。

```iTerm
% echo "alias ssh=~/bin/ssh-host-color" >> ~.zprofile
% source ~/.zprofile
% ssh stage-server
```

### iTerm以外で実施する場合(が分からない)
~~デフォルトのターミナルでやりたい場合は```tell application "iTerm"```ブロックを消すか、```tell application "teminal"```みたいに変えれば大丈夫かも？~~

```tell application "iTerm"```ブロックを消す。
```tell application "terminal"```にする。
```tell application "ターミナル"```にする。
いずれもダメでした。
lodash.mergeで配列自体をマージする

マニュアルに明記してあるのだが、挙動を抑えづらいのでJSBinで実際にコードを走らせつつ確認する。


## lodash.mergeとは

再帰的にObjectを合体する関数。配列に対しては、中身がObjectなら同インデックスのObject同士を合体する。[JSBinでみる](http://jsbin.com/tayeti/2/watch?js,console)

```js
var merged;

merged = _.merge([
  {
    name: 'banana',
    price: 80
  }, {
    name: 'apple',
    price: 120
  }
], [
  {
    color: 'yellow',
    category: 'vegetable'
  }, {
    color: 'red',
    category: 'fruit'
  }
]);

console.log(merged); /*=>
[{
  category: "vegetable",
  color: "yellow",
  name: "banana",
  price: 80
}, {
  category: "fruit",
  color: "red",
  name: "apple",
  price: 120
}]
*/
```


## 配列自体を合体する

配列の中身がObjectでない場合はマージ不能と判定されて後に指定した配列が適用されるのだが、下の例のように配列自体を合体して欲しい場合がある。[JSBinでみる](http://jsbin.com/vulihu/3/watch?js,console)

```js
var merged;

merged = _.merge({
  name: 'banana',
  tags: ['yellow']
}, {
  price: 80,
  tags: ['vegetable']
});

console.log(merged); /*=>
{
  name: "banana",
  price: 80,
  tags: ["vegetable"] -> tags: ["yellow", "vegetable"] となってほしい！
}
*/
```

この問題は第三引数でカスタム関数を指定することで解決できる。2つの値をどのようにマージするのか指定できるので、配列なら`Array#concat`するよう実装する。[JSBinでみる](http://jsbin.com/hoxino/3/watch?js,console)

```js
var merged;

merged = _.merge({
  name: 'banana',
  tags: ['yellow']
}, {
  price: 80,
  tags: ['vegetable']
}, function(a, b) {
  if (_.isArray(a) && _.isArray(b)) {
    return a.concat(b);
  }
});

console.log(merged); /*=>
{
  name: "banana",
  price: 80,
  tags: ["yellow", "vegetable"]
}
*/
```


## 関連

- [lodash documentation | merge](https://lodash.com/docs#merge)
- [_.difference and _.merge on two different arrays with common elements · Issue #578 · lodash/lodash](https://github.com/lodash/lodash/issues/578#issuecomment-45342725)
FuelPHPのRESTコントローラーのRouting

FuelPHPで、REST Controller に関するRoutingのメモ。

- `http://example.com/blog/1/hoge.json`
- `http://example.com/blog/1/jack.json`
- `http://example.com/blog/2/hoge.json`
- `http://example.com/blog/2/jack.json`

などのように、```コントローラー/ID/メソッド.json``` と、コントローラー名とコントローラーメソッド名の間にIDが入っているURL設計で、Controller_RESTを継承してゴニョゴニョしたい場合。

# routes.php

```
<?php
return array(
    'user/:id/(:any)' => 'user/$2/$1' ),
);
```

# Controller_Rest を継承したコントローラー

```
<?php

class Controller_Blog extends Controller_Rest
{
    public function get_index()
    {
        $this->response( "index is called" );
    }

    public function get_hoge( $id )
    {
        $this->response( "hoge is called for " . $id);
    }

    public function get_jack( $id )
    {
        $this->response( "jack is called for " . $id);
    }
}

```
超簡単!? Linuxの使用メモリを下げる方法

![](http://farm5.static.flickr.com/4087/5220969362_79d8594f2f.jpg)

# 超簡単!?

上の画像は、さくらのVPS@Ubuntu Server 10.04TLS の最小起動モード。必要最小限!

gettyは、1つ500kB~600kBを使うので、メモリが512MBしかないさくらのVPSでは使わないgetttyを削減してメモリを増やそう!っていうトピックスです。Ubuntu Server 10.04TLSは、デフォルトで6つのgetttyを起動させるので、それを2つにすると…
`
600kb x 6 = 3600kb = 3.6MB
600kb x 2 = 1200kb = 1.2MB
3.6MB - 1.2MB = 2.4MBの削減!
`
**地味～**ですが、結構効果的です。gettyって、500kB～600kBらしいんですが、それ以上にメモリが削減できるような…まあ、効果的なので、ここは実施しましょう!
# やり方!

全部、root権限で作業してください。sudo vi hoge でも良いけど。

1. /etc/default/console-setup の以下の部分を編集します。ACTIVE_CONSOLES="/dev/tty[1-6]"
↓ 6から2に変更します。
ACTIVE_CONSOLES="/dev/tty[1-2]"
2. /etc/init/tty3.conf を開いて、すべて全てコメントアウトします。
3. /etc/init/tty4.conf から /etc/init/tty6.conf まで、上のコメント作業をします。
4. Ubuntu Server 10.04TLSを再起動させます。

ps –A f すると、/sbin/getty -8 38400 tty1 と /sbin/getty -8 38400 tty2 の2つしか起動していない事が確認できます。top コマンドでメモリ使用率がグッと下がっている事が判ります。

簡単なのに、結構メモリを削減できるのでやってみると良いと思います。
[Swift] Archiveした時限定で、型変換が上手くいかない問題

Archiveしてインストールすると、以下のコードで落ちる問題が発生して、ハマった。
Runで実機実行しても落ちない。

多分Swiftのバグだと思う。
環境は、Xcode6.2 (6C131e) / iPhone6 / iOS8.1.3

```swift:MyUIViewController.swift
import UIKit

class ViewController: UIViewController {
    @IBAction func push() {
        track(["hoge": "piyo"])
    }
    
    func track(params: [String: AnyObject]?) {
        var p = params ?? [String: AnyObject]()
        p["foo"] = "bar"
    }
}
```
どうやら、pが正しく初期化されていないっぽい。
pの初期化を以下のようにしても落ちた。

```swift
if params != nil {
    p = params!
} else {
    p = [String: AnyObject]()
}
```

以下だと落ちなくなるが意味が無い。

```swift
var p = params!
```
今回は、

```swift
var p = [String: AnyObject]()
if let params_ = params {
    p = params_
}
```
こうすることで回避できた。

言語のバグは怖い。
grunt-uglifyメモ

grunt-uglifyの使い方メモです。

# 結合順を指定したい場合

マニュアルみてもはっきり書いてなかった気がするので試したところ、
やはり、srcで配列指定したうちindexが小さいものから結合されます。

ディレクト単位でワイルドカード指定した場合はそのディレクトリのワイルドカードに該当する
ファイルを結合してから、次のindexの結合に入ります。

```js
        uglify: {
            debug: {
                src: [
                    //圧縮対象のファイル
　　　　　　　　　　　　//このリストの先頭からcat。ワイルドカードの場合は実行環境依存。
　　　　　　　　　　　　//ディレクトリ単位でも、ファイル単位でも指定可能。
                    rootPath + '/pc/static/javascript/common/*.js',
                    rootPath + '/pc/static/javascript/model/*.js',
                    rootPath + '/pc/static/javascript/extentions/*.js',
                    rootPath + '/pc/static/javascript/componets/**/*.js',
                    rootPath + '/pc/static/javascript/viewModel/*.js',
                    rootPath + '/pc/static/javascript/myApp.js'
                ],

```

# 結合だけしたい場合

下記の通り設定します。sourceMapは任意です。

catを使ってもいいのですが、uglifyのほうが高速でsourceMapも優秀でした。

```js
                options: {
                    beautify: true,//インデントやスペース入りでだすかどうか。
                    mangle: false,//変数置換
                    compress: false,//圧縮するかどうか。
                    sourceMap: true//ソースマップを出力するか。
                }
            },
```
「tail -f」じゃなくて「less +F」を使うように矯正したいときの.bashrc

[「tail -f」を使うのは情弱、情強は「less +F」を使う](http://www.softantenna.com/wp/unix/stop-using-tail-f/)という話題がありましたが、
手癖でつい「tail -f」と打ってしまうのを矯正したいときに
以下を .zshrc とか .bashrc の下のほうにでも足してください。
※「-f」をつけない場合は普通のtailとして動きます。

```
tail () {
  if [ "$1" = "-f" ];then
    echo 'tail -f　より　less +F の方が機能が多くていいですよ'
    echo 'Use `less +F`'
  else
    /usr/bin/tail $*
  fi
}
```
homebrew CASKを一気に更新するワンライナー


明示的にバージョンが指定されているもののみになりますが、一気に自動更新する場合のワンライナーとなります。
currentなどで扱われるものはそれぞれ `--force` で扱う必要があります。

```shell-session:
for a in `brew cask list`;do brew cask install ${a};done
```
VirtualBoxとVagrantの紐付けをやり直す方法

いつも通り

```
$ vagrant up
```
すると

```
creating...
```
違う違う！
となる事が頻繁になってきたので、紐付け直しメモ。


# 開発環境
Mac OS X 10.9.5
Vagrant version 1.7.2
Virtual Box 4.3.26 r98988

# Vagrantの情報を調べる
まずVagrantfileのある場所(vagrant直下)で

mac

```
$ VBoxManage list vms
```

windows

```
$ VBoxManage.exe list vms
```

すると
virtualboxのbox一覧が表示されます。
"boxname"{id}

```
"**-vagrant_default_1428282785450_80674" {hoge}  # 本来のvagrant
"**-vagrant_default_1428282785450_80674" {piyo}  #  新たにできたvagrant
"Google Nexus 5 - 5.0.0 - API 21 - 1080x1920" {137ef325-c516-4293-af48-5a2b785eab17}
"Sony Xperia Z - 4.3 - API 18 - 1080x1920" {805c3fc0-2138-4e47-adf1-826b121b8a5d}
```

# VirtualboxとVagrantを紐付けしている場所
上記とおなじ場所で

```
$ cat .vagrant/machines/default/virtualbox/id
```

```
piyo%
```

とでてくると思うので、本来のvagrantのid(hoge)に書き換えます。

# 最後に

```
$ vagrant up
```

今まで泣く泣く削除していたvagrantが使えるようになりました。


参考記事（ありがとうございます。）
[Vagrantの仮想マシンとの紐付けの直し方]
(http://elm-arata.hatenablog.com/entry/2013/09/25/175547)
Deadline scheduler 覚書


Earliest Deadline First (EDF)

- runtime … 実行可能時間
- period / deadline … 次の実行までのサイクルタイム（データが到着する感覚とか）

プロセスは period マイクロ秒毎に runtime マイクロ秒だけ実行できる。  
runtime は period から deadline 内の線分上にある。  

ただし EDF だけでは runtime が長いプロセスがいるときに deadline を守れないケースが出てくる。  
そこで Linux の deadline スケジューラでは Constant Bandwidth Server (CVS) を利用している。

CBS では runtime, deadline, period に加えて scheduling deadline と current runtime を用いる。

- scheduling deadline … プロセスを実行させなければならない絶対時間の deadline
- current runtime … プロセスが実行できる残り時間

動作は次のようになる。

1. プロセス生成時に scheduling deadline, current runtime を 0 に設定
2. プロセスが ready になったとき次の条件判断
     - scheduling deadline が現在時刻より前である（既に過ぎてしまった）
     - current runtime / (scheduling deadline - current time) > runtime / period
          - 現状の runtime 比率 > period で実行されるべき runtime 比率
          - 右辺の定義を超えてしまうと scheduling deadline に間に合わない
3. 条件式が真であれば scheduling deadline を延長すると共に current runtime もフルにする
     - scheduling deadline = 現在時刻 + deadline; current runtime = runtime;
     - 間に合わないので猶予を持たせる
4. current runtime がプロセスを実際に実行した時間分減らされる
5. current runtime が 0 以下になったらプロセスを throttle した後、replenishment time（現在の schedule deadline）までプロセスは実行されなくなる
6. replenishment time になると current runtime が正になるまで次の式を実行
     - scheduling deadline += period; current runtime += runtime;
     - scheduling deadline を更新して runtime を補給
NotiffanyのエラーでGuardの起動に失敗するとき


#概要
- Railsアプリでbundle exec guardで、guardを起動しようとしたところ、以下のエラーで起動ができない

```
/path_to_yours/vendor/bundle/ruby/2.2.0/gems/notiffany-0.0.6/lib/notiffany/notifier/notifysend.rb:35:in `_check_available': undefined method `empty?' for nil:NilClass (NoMethodError)
```
- CentOS7 -> CentOS6へアプリの動作環境を変更したら急にこのエラーが出た(このエントリーではその原因究明には至っていない)

#対応内容
- まずdebug optionをつけて実行してみる

```
% bundle exec guard -d
11:00:40 - DEBUG - Notiffany: gntp not available (Please add "gem 'ruby_gntp'" to your Gemfile and run your app with "bundle exec".).
11:00:40 - DEBUG - Notiffany: growl not available (Unsupported platform "linux-gnu").
11:00:40 - DEBUG - Notiffany: terminal_notifier not available (Unsupported platform "linux-gnu").
11:00:40 - DEBUG - Notiffany: libnotify not available (Please add "gem 'libnotify'" to your Gemfile and run your app with "bundle exec".).
11:00:40 - DEBUG - Command execution: which notify-send
/path_to_yours/vendor/bundle/ruby/2.2.0/gems/notiffany-0.0.6/lib/notiffany/notifier/notifysend.rb:35:in `_check_available': undefined method `empty?' for nil:NilClass (NoMethodError)
```

- いろいろnot availableとのこと
- Notificationの出力先がないようだ。複数のログ出力とNilClassなエラーから推察するに、どれか一つでもNotificationの出力先があればよさそう
- Growlに出したいわけでもないので、libnotifyをセットする。ログの指示通りに、`gem libnotify`をGemfileに追記したら、起動した

#おまけ
- Guardfileには３つのプロファイルが定義されていた。

```Guardfile
guard :rspec, cmd: 'spring bundle exec rspec' do
...
guard :rubocop do
...
guard 'livereload', host: '0.0.0.0', port: '35729' do
...
```

どのプロファイルに依存したエラーかわからない場合、`bundle exec guard -P livereload`のように指定することができる。ただし、今回のケースは全てで同じエラーが出た。