OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftでWith...End Withステートメントっぽい書き方をする


# はじめに

UILabelに限った話ではないのですが、同じオブジェクトに対してそれなりの数のプロパティを設定することは以外と多いです。

（わざとらしい例ですが）以下のように。

```swift
fooBarHogeLabel.frame = CGRect(x: 10, y: 10, width: 100, height: 60)
fooBarHogeLabel.backgroundColor = UIColor.blueColor()
fooBarHogeLabel.textColor = UIColor.yellowColor()
fooBarHogeLabel.font = UIFont.boldSystemFontOfSize(15)
fooBarHogeLabel.textAlignment = NSTextAlignment.Center
fooBarHogeLabel.text = "Hello, world!"
```

個人的に、`fooBarHogeLabel.`というのが続いているのがどうも好きになれません。特に長い変数名の場合は可読性の低下にもつながります。

今日日、上記のような設定はStoryboard/xibでやれ（`@IBInspectable`で独自ViewについてもXcodeのデザイナ上で設定できるようになったこともあり）という話ではあるのですが、コード上で書きたいケースだってあります。

# With...End Withステートメント

短い一時変数（`label`とか`l`とか）を使うというのも手ではあるのですが、その為だけに一時変数を用意するのも・・・という感じもします。

そこでOptionalを拡張して、VB.NETで用意されている`With...End With`ステートメントっぽく書いてみることにしました。

```swift
// Optionalを拡張してwithメソッドを追加
extension Optional {
    func with(f: T -> ()) {
        switch self {
        case .None: return
        case .Some(let x): f(x)
        }
    }
}

// withメソッドを利用したコード
let fooBarHogeLabel = UILabel()
Optional.Some(fooBarHogeLabel).with {

	// Swiftのクロージャ仕様で$0でアクセスできる
    $0.frame = CGRect(x: 10, y: 10, width: 100, height: 60)
    $0.backgroundColor = UIColor.blueColor()
    $0.textColor = UIColor.yellowColor()
    $0.font = UIFont.boldSystemFontOfSize(15)
    $0.textAlignment = NSTextAlignment.Center
    $0.text = "Hello, world!"
}
```

Optinalでない場合は上記のように一度ラップしてあげる必要がありますが、クロージャ内では`$0`という2文字でアクセスできます。

クロージャを利用しているので必然的にインデントを入れることになり、そのオブジェクトに対しての設定コードであることが分かりやすくなったようにも感じます。

**追記：
コメントにてOptionalを利用しないベターな書き方を教えていただきました（Thanks! @satoshia）**

```swift
func with<T>(obj: T, setup: T -> T) -> T {
    return setup(obj)
}

let fooBarHogeLabel = with(UILabel()) {
    $0.frame = CGRect(x: 10, y: 10, width: 100, height: 60)
    $0.backgroundColor = UIColor.blueColor()
    $0.textColor = UIColor.yellowColor()
    $0.font = UIFont.boldSystemFontOfSize(15)
    $0.textAlignment = NSTextAlignment.Center
    $0.text = "Hello, world!"
    return $0
}
```

# はたしてこれは読みやすいか？

どうしてこんなコードを書こうかと思った経緯を話しておくと、この前はじめてSpriteKitのコードを書いてみた時に、 **1オブジェクトに対して設定するプロパティが多くて「わずらわしい！」と思った** のがきっかけです。

で、問題はこの書き方が **本当に読みやすいか？** ってことです。

個人的にはブラケットを利用したObjective-Cの初期化構文（ちょっと名前を忘れてしまいましたが）と似ているようにも感じられ、今のところ読みやすいと感じているのですが、一般的な書き方ではないですし、Xcodeを活用すればコーディング速度の面で有利とは感じません。

可読性は究極のところ好みの問題なので、プロジェクト内で一緒に開発するメンバーが書きやすいと思ったらこういう書き方もありなんじゃないでしょうか？

（という無難な締め方で）

--
P.S.
仕事仲間のSwift書きに意見を聞いてみたいと思ってます。
Rubyでメソッドがあるかをrespond_to?で調べました。

Rubyでオブジェクトにメソッドがあるか調べたくなります。

# respond_to?を使う
調べたいオブジェクトでrespond_to?を使用します。

```rb:メソッドを判定する
hoge.respond_to?("message")
```
hogeオブジェクトがmessageを持っているとtrueが返りました。
Symbolか文字列で指定するメソッド名です。

# おまけ：メソッド一覧は methods を使う
メソッド一覧を調べたいときはmethodsが便利と教えてもらいました。

```rb:メソッド一覧を表示
hoge.methods
```

# 参考
http://docs.ruby-lang.org/ja/2.2.0/method/Object/i/respond_to=3f.html
Azure仮想マシンのカスタムイメージの扱い方（基本めも）



Azureの仮想マシンやカスタムイメージを扱う上で、知っておいた方が良い事をメモ。
超基本的な事だが、知らないと厄介なこともあるので、記録しておきます。



##カスタムイメージ取得時の基本
仮想マシンを複製したいときは、必ずSysprepを実行してからイメージ取得する。
イメージ取得時は、その仮想マシンは削除される。

##日本語化OSのカスタムイメージ作成方法（手動）
例えばOSを日本語化しておき、そのイメージを取っておきたい場合、以下の設定をしておく。

1. 言語パックを追加。
  1.1. [Control Panel] - [Clock, Language. And Region] - [Language] より
  　　　"Add a language" を選択して、日本語を追加
  1.2. 日本語を最上位に設定
  1.3. [Options] を選択し、"Download and install language pack" をダウンロードしてインストール。
       ※ もし日本語がプライマリになっていなければプライマリに設定。
  1.4. インストール完了後ログアウトを行い、再度ログインすると表示言語が日本語になる
       
2. 場所 (ロケール) の変更
  2.1. [コントロール パネル] - [時計、言語、および地域] - [地域] から "場所の変更" を選択して、
       [主な使用場所] を "日本" に変更し、[適用] をクリック。
3. 現在のユーザー設定を、"ようこそ画面" や "新しいユーザー" にコピー。
  3.1. [地域] ダイアログの [管理] タブより、[設定のコピー] を選択。
  3.2. 表示言語、入力言語、形式、場所が "日本語", "日本" となっている事を確認。
  3.3. "現在の設定のコピー先" にて、チェックボックス 2 つを選択し、[OK] をクリックして、コピー。
  3.4. 指示に従って、再起動。

4. Sysprep を行い、ポータルからマイ イメージとして取り込みを実施。
  4.1. C:\Windows\System32\Sysprep\Sysprep.exe
  4.2. "一般化する" にチェックを入れ、"シャットダウン オプション" にて
       シャットダウンを選択し、[OK] をクリック。
  4.3. Sysprep の完了によって、シャットダウンが行われ、リモート デスクトップ接続が切断されるまでの間、しばらく待つ。
  4.4. 管理ポータルから、仮想マシンの [シャットダウン] を行う。
  4.5 [取り込み] を選択し、マイ イメージとして取り込みを行う。


##タイムゾーン
日本時間に変更してイメージを取っても、タイムゾーン設定は維持されず、UTCに戻ってしまう。
なので、-TimeZone "Tokyo Standard Time"を指定するようにする。

##カスタムイメージの保存場所
カスタムイメージは、その仮想マシンが存在していたStorage Account、コンテナーに作成される。
つまり、カスタムイメージから仮想マシンを作成する場合は、カスタムイメージが保存されているリージョン、Storage Accountのvhdsコンテナーにvhdが作成される。
要するに、他のリージョンや、他のStorage Account、強いては他のコンテナーを指定できない。
変更したい場合は、カスタムイメージを取得する前にvhd実体を移動しておき、そこでイメージをとる。

##追加ディスク
追加ディスクは、Powershell実行した場合はカレントStorage Accountに生成される。
管理ポータルからだと、、、不明。。。



##Sysprepしないイメージ
単純バックアップはsnapshotでOK。同時起動できないので注意（同時起動しなければ2台あっても大丈夫）。



追加あり次第、随時追記予定。
capistrano 3 のログ出力でよく分からないハッシュ文字列の代わりにホスト名を出す

本当は sshkit の log formatter を自作すればいいんだろうけど、面倒くさいのでとりあえず Capfile で下記のようなモンキーパッチを行ったらうまく行った。

```rb
class SSHKit::Formatter::Pretty
  def uuid(obj)
   "[#{c.green(obj.host.to_s)}] "
  end
end
```

追記 (2015/06/19)：

これだとあんまりなので、モンキーパッチではなく SSHKit::Format::Pretty を継承した子クラスを作成し、
別ファイルに切り出すようにした。

lib/sshkit/formatters/hostname.rb

```rb
class SSHKit::Formatter::Hostname < SSHKit::Formatter::Pretty
  def uuid(obj)
   "[#{c.green(obj.host.to_s)}] "
  end
end
```

Capfile

```rb
$:.unshift File.dirname(__FILE__) + '/lib' unless $:.include? File.dirname(__FILE__)
require 'sshkit/formatters/hostname'
```

config/deploy.rb

```
set :format, :hostname
```
ActionMailerの使い方。



```
rails g mailer UserMailer
```

Mailerディレクトリにはモデルっぽいものが作られる。

```
create  app/mailers/user_mailer.rb
create  app/mailers/application_mailer.rb
```

Viewsディレクトリには、メール文を作成するためのテンプレートが作られる。

```
create  app/views/user_mailer
create  app/views/layouts/mailer.text.erb
create  app/views/layouts/mailer.html.erb
```

Testディレクトリには、テストのためのファイルが作られる。

```
create  test/mailers/user_mailer_test.rb
create  test/mailers/previews/user_mailer_preview.rb
```


# メールを送信するメソッドを作成。
```app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer::Base

  def welcome_email(user)
    @user = user
    @sentence = 'ほげほげとはhogehogeである。'
    
    mail(
     to: @user.email,
     subject: 'ようこそほげほげ'
    )
  end
end
```


# メールを送るメソッドを呼び出す。

```users_controller.rb

def create
  UserMailer.welcome_email(@user).deliver_later
end
``` 


deliver_laterとかdeliber_nowとかあります。


# メールのテンプレートを作る

1. views/user_mailerのディレクトリにメソッド名.html.erb/メソッド名.text.erbを作成
2. welcome_email.html.erb or text.erbにメール内容を書く。


```app/views/user_mailer/welcome_email.html.erb

<%= @user.name %>さんほげほげへようこそ！
<%= @sentence %> 
```
Serfで実装するHigh Availability NAT (ENI付け替えパターン)


#Serfによる冗長化

Serfにて障害を検知し、ENIを付け替え冗長化を図る構成。

## 構成図

![ha-eni.png](https://qiita-image-store.s3.amazonaws.com/0/49877/7fba1d59-ed83-facd-a3be-636b5f8a6b59.png)


##実装

以下のスクリプトを設置し、serfのトリガーに設定する。

https://github.com/SatoHiroyuki/ha-nat-script/blob/master/ha-nat-eni

実行方法

```
ha-nat-eni -e [ENI_ID]
```
ビルトインオブジェクト

##ビルトインオブジェクトとは

>ビルトインオブジェクトとは、JavaScriptで以下のようなあらかじめ定義されているもので、宣言なしで使用することができる。

##ビルトインオブジェクト一覧

|オブジェクト名|説明|
|---|---|
|Array|配列を作成・操作|
|Boolean|真偽値を作成・操作|
|Date|日付や時刻の取得・設定|
|Function|関数の作成・操作|
|Math|数値計算関連|
|Number|属性を持つ数値を作成|
|Object|ユーザ定義オブジェクトを作成|
|RegExp|正規表現関連|

###Dataオブジェクトの使用例

```
var d = new Date();
alert("今日は"+ d.getFullYear() +"年"+ (d.getMonth() + 1 ) +"月"+ d.getDate() +"日です。");//今日の年月日が表示される
```
※”月”で`+1`しているのは、`１月=January`が`0`に設定されているため。

オブジェクトには状態`プロパティ`と振る舞い`()`を持っている。

##Arrayオブジェクト
`Array`オブジェクトは`配列`を定義するためのオブジェクトである。

###定義方法
`Array`オブジェクトは下記のように定義できる。

```
var array1 = new Array(1, 2, 3); // [1, 2, 3]
var array2 = [1, 2, 3, 4]; // [1, 2, 3, 4]
var array3 = new Array('1'); // ['1']
var array4 = new Array(5); // [undefined x 5]
```

###要素数を取得
`Array`オブジェクトは`length`というプロパティをもっており、`配列の要素数`を保持している。

|プロパティ名|説明|
|---|---|
|`length`|配列要素の数|

###配列要素の追加と削除

|メゾット名|説明|
|---|---|
|`pop()`|配列の最後尾に要素を一つ削除<br>戻り値は取り除かれた要素を返す|
|`push()`|配列の最後尾の要素を一つ追加<br>戻り値は要素追加後のlengthプロパティの値を返す|
|`shift()`|配列の先頭に要素を一つ削除<br>戻り値は取り除かれた要素を返す|
|`unshift()`|配列の先頭に要素を追加<br>戻り値は要素追加後のlengthプロパティの値を返す|
|`splice()`|指定範囲を削除し、削除した部分に新たな要素を追加|
[Grail3]でログ出力

### 2016/05/21 追記

@nobeansさんのご指摘通り、クラスに埋め込まれているlogオブジェクトにて、ログ出力できます。
詳細はコメントをご覧ください。

### いつもの感じで

なんか便利なアノテーションがあるのかなと思って探していたのですが、見つからず。
Slf4jでフツーに書くみたいです。

```groovy:TestController.groovy
package testgrails1

import org.slf4j.LoggerFactory

class TestController {

	private final static def logger = LoggerFactory.getLogger(TestController.class);

	def index() { 
		logger.info("hello")
		render(view:'index')
	}
}
```

### 設定は、logback.groovyです。

```groovy:grails-app/conf/logback.groovy
import grails.util.BuildSettings
import grails.util.Environment


// See http://logback.qos.ch/manual/groovy.html for details on configuration
appender('STDOUT', ConsoleAppender) {
    encoder(PatternLayoutEncoder) {
        pattern = "[%level] [%logger] - %msg%n"
    }
}

//root(INFO, ['STDOUT'])
// testgrails1パッケージは、ＩＮＦＯレベルで出力
logger("testgrails1", INFO, ["STDOUT"])

if(Environment.current == Environment.DEVELOPMENT) {
    def targetDir = BuildSettings.TARGET_DIR
    if(targetDir) {

        appender("FULL_STACKTRACE", FileAppender) {

            file = "${targetDir}/stacktrace.log"
            append = true
            encoder(PatternLayoutEncoder) {
                pattern = "%level %logger - %msg%n"
            }
        }
        logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )
    }
}



```
三方分岐とUFO演算子

プログラムを書いていると、ときどき「過去・現在・未来」とか「赤字・とんとん・黒字」のような3方向への分岐が必要になる場面があります。Rubyでスッキリ書くにはどうすればいいのでしょうか。

# 素直に書いてみる
何も考えずに書くと、次のようになります。

```rb:3way-simple.rb
if foo == bar
  # 等しい時
elsif foo > bar
  # fooのほうが大きい時
else
  # fooのほうが小さい時
end
```

もちろんこれでも動くのですが、同じ値での比較を2度も書いていて、あまりきれいではありません（この例では`foo`や`bar`だからどうということもないのですが、オブジェクトのプロパティなどややこしい式を二度も書くのは、正直めんどうです）。

# UFO演算子
ここで、Rubyには「UFO演算子」とも呼ばれる`<=>`という演算子があります。これは、両辺の値を比較して「左が大きい」「等しい」「右が大きい」というごとに違う値を返します。で、よくそれぞれ「1」「0」「-1」を返すと言われるのですが、この演算子の最大の利用者である[`Comparable`のマニュアル](http://docs.ruby-lang.org/ja/2.0.0/class/Comparable.html)によれば「正の整数」「0」「負の整数」であればいいということで、決まった値は保証されていません。というわけで、UFO演算子を使って書き直すと

```rb:3way-ufo.rb
comp = (foo <=> bar)
if comp == 0
  # 等しい時
elsif comp > 0
  # fooのほうが大きい時
else
  # fooのほうが小さい時
end
```
多少はすっきりしましたが、一時変数を使わずにできないものでしょうか。

## 無限の彼方へ
Rubyの`case`は、単純な一致判定だけではなく、`===`演算子を使った比較をしてくれるので、いろんな操作をできます。「正か0か負か」ということで、こんなこともできなくはないです。

```rb:3way-infinity.rb
case foo <=> bar
when 0
  #等しい時
when 1.0..Float::INFINITY
  # fooのほうが大きい時
else
  # fooのほうが小さい時
end
```

## UFO2機
ここで改めてマニュアルを見てみると、`Numeric#<=>`は（正常に比較できる場合）0、±1を返してくれるとのことでした。ということで、UFOを2つ連ねてしまえば、強制的に値を0、±1のどれかにしてしまうこともできます。

```rb:3way-ufo2.rb
case (foo <=> bar) <=> 0
when 0
  #等しい時
when 1
  # fooのほうが大きい時
else
  # fooのほうが小さい時
end
```

## その他
今までのコードでは省略していましたが、比較不能な場合には`<=>`が`nil`を返すこともあります。数値や文字列、日付といった値で問題となることはありませんが、`nil`が混入するなど型が揃わない場合や、`Module`などのように全順序が決まらない場合もあるので気をつけましょう。
PHPでprivateメソッドをテストしやすくするTestingWrapper



[PHPでprivateメソッドをテストしやすくする - Qiita](http://qiita.com/RyujiAMANO/items/4094483b8ba02e60836e)というのを書いたんですが、毎回元クラスを継承してテスト用クラスを作成するのも面倒だなぁと思ったので、privateやprotectedメソッドにアクセスできるようにするラッパークラスを作ってみました。

```php
class TestingWrapper {
	protected $wrappedInstance;

	public function __construct($wrappedInstance){
		$this->wrappedInstance = $wrappedInstance;
	}

	public function __call($methodName, $params)
	{
		if(substr($methodName,0, 9) == '_testing_'){
			$callName = substr($methodName, 9);
			$method = new ReflectionMethod($this->wrappedInstance, $callName);
			$method->setAccessible(true);
			$result = $method->invokeArgs($this->wrappedInstance, $params);
			return $result;
		}else{
			return call_user_func_array(array($this->wrappedInstance, $methodName), $params);
		}
	}
}
```


##使い方
下記 foo クラスの barメソッドをテストしたいとします。

```php
class foo {
	private function bar($a){
		return $a . 'bar';
	}
}
```

下記の様に、`TestingWarpper`で対象インスタンスをラップして、呼び出したいプライベートメソッドに`_testing_`を頭につけて呼び出します。

```php
$foo = new foo();

$fooTesting = new TestingWrapper($foo);
$result = $fooTesting->_testing_bar('StringA');
$this->assertEqual($result, 'StringAbar');
```
iOSで複数のコンテキスト間でOpenGL ESオブジェクトを共有する


```
// コンテクストのリソースを取得する
- (void)initOpenGL {

    if ([EAGLContext currentContext]==nil) {
        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    }
    else{
        context = [[EAGLContext alloc] initWithAPI:[[EAGLContext currentContext] API] sharegroup: [[EAGLContext currentContext] sharegroup]];
    }
	if (!context || ![EAGLContext setCurrentContext:context]) {
		return;
	}
	
	// ... (略)
	
}

```


Reference:
https://developer.apple.com/library/ios/qa/qa1612/_index.html
https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html
https://developer.apple.com/jp/documentation/OpenGLES_ProgrammingGuide.pdf
Linux（GNU）とMac（BSD）のsedの振る舞いの違いを解決


## 要因

sedでファイルを直接書き換えようとした際に、-iのサフィックスの振る舞いが
Linux（GNU）とMac（BSD）で異なる。

GNU

~~~sh
$ sed -i -e “s/aaa/bbb/g” test.txt
~~~

BSD

~~~sh
$ sed -i “” -e “s/aaa/bbb/g” test.txt
~~~

-iのサフィックスにはバックアップファイル名を指定する。
例えば、”.bak”を指定するとtest.txt.bakが生成される。

GNUはサフィックス無しで、バックアップファイル作成しないが、
BSDはサフィックス無しが許容されず、空文字を指定しなければいけない。

例えば、BSDでGNUと同じ式を使ってしまうと意図しないバックアップファイルが作成される。

BSD

~~~sh
$ sed -i -e “s/aaa/bbb/g” test.txt
$ ls
test.txt test.txt-e
~~~

test.txt-eという意図しないバックアップファイルが作成されている。

## 解決

この振る舞いの違いを解決させるには、aliasを使用する。

bash_profileに設定する場合。

~~~sh
if sed --version 2>/dev/null | grep -q GNU; then
  alias sedi='sed -i '
else
  alias sedi='sed -i "" '
fi
~~~

使用するスクリプト内に設定する場合。

~~~sh
#!/bin/bash

# bashでalias機能をONにする
shopt -s expand_aliases

if sed --version 2>/dev/null | grep -q GNU; then
  alias sedi='sed -i '
else
  alias sedi='sed -i "" '
fi

sedi -e “s/aaa/bbb/g” test.txt
~~~
background-positionプロパティの「%指定値」と「px指定値」を相互変換する計算式

# "50%" は "何px" なのか

CSSのbackground-positionプロパティには値の指定方法がいくつか用意されていますが、その中の「%指定値」と「px指定値」を相互に変換したい場合の計算式を考えてみます。

~~~
#sample { background-position: 50% 20px;}
　　　　　　　　　　　　　　　　 　↓　　↓
#sample { background-position: ??px ??%;}
~~~

この計算に必要となる情報は

- **背景画像を指定する要素の width / height**（px値）
- **背景画像の width / height**（px値）

です。

早速ですが、それぞれの変換式は以下のようになります。

## 「%指定値」→「px指定値」の変換式

~~~HTML:水平方向（X軸）
{px指定値} = ( {背景画像を指定する要素のwidth} - {背景画像のwidth} ) * {%指定値} * 0.01
~~~

~~~HTML:垂直方向（Y軸）
{px指定値} = ( {背景画像を指定する要素のheight} - {背景画像のheight} ) * {%指定値} * 0.01
~~~

## 「px指定値」→「%指定値」の変換式

~~~HTML:水平方向（X軸）
{%指定値} = {px指定値} / ( {背景画像を指定する要素のwidth} - {背景画像のwidth} ) * 100
~~~

~~~HTML:垂直方向（Y軸）
{%指定値} = {px指定値} / ( {背景画像を指定する要素のheight} - {背景画像のheight} ) * 100
~~~

## 具体例

width が 1000px である `<div id="sample">` に対して、
width が 300px の `sample_bg.png` が背景画像として指定されており、
水平方向（X軸）の background-position が 65% であるとします。

~~~css:A
#sample {
	width: 1000px;
	background: url(sample_bg.png) no-repeat 65% 0;
}
~~~

この場合、"65%" の部分をpx値に変換するには以下の計算となります。

~~~
( {背景画像を指定する要素のwidth} - {背景画像のwidth} ) * {%指定値} * 0.01
= ( 1000 - 300 ) * 65 * 0.01
= 700 * 0.65
= 455
~~~

つまり、以下の指定をした場合でも**同じ位置**に `sample_bg.png` が配置されることになります。

~~~css:B
#sample {
	width: 1000px;
	background: url(sample_bg.png) no-repeat 455px 0;
}
~~~

「width: 1000px」「65%」という情報だけを見ると「650pxかな？」と思ってしまいますが、実際に計算してみると全く異なる数値になります。

## そもそも background-position の「%指定」とは？

background-positionプロパティの「%指定」については、リファレンスサイトなどでも
「要素の**左上角から **% の位置**に配置される」
といった説明がされている場合がありますが、これはなかなか曖昧な表現です。
`background-position: 100% 100%` と指定した場合に
背景画像が要素の右下外側に飛び出してしまうかというと、そんなことはありません。

プロパティの仕様をより正確に表現すると、以下のような説明になるでしょう。

~~~
ある要素の水平方向（X軸）の background-position を "n%" と指定した場合、
その要素の水平方向 n% の座標が「基準点」となり、
背景画像は、その画像自体の水平方向 n% の座標が「基準点」と一致するように配置される。

（垂直方向の場合も同様）
~~~

わかりにくいですね。
図で表してみます。

![bgp.png](https://qiita-image-store.s3.amazonaws.com/0/25032/9c9c424d-07b0-8921-fb18-6b67bc55ffc2.png)

この図を見ながら再度計算してみると、前述の「変換式」が妥当なものであることがわかるかと思います。

~~~
{px指定値}
= 1000 * 65 * 0.01 - 300 * 65 * 0.01
= ( 1000 - 300 ) * 65 * 0.01
= 700 * 0.65
= 455
~~~
GMO ConoHa 登録手順とログイン、APIトークンの取得まで

# 会員登録

https://www.conoha.jp/en/login
を開いてしまった場合、日本語か、このはを選べば表示が日本語になります。

![Selection_016.png](https://qiita-image-store.s3.amazonaws.com/0/25728/05cd7e0e-7ac3-f04b-6047-b877b8e55304.png)

## 手順

* メールアドレス、パスワードで登録。
  * パスワードは9桁以上。多くのwebサービスは8桁あればOKとみなすが、9桁。これはパスワードの使い回しの防止として良いと思った。
* 4桁のワンタイムパスワードを電話かSMSで取得し入力。
* 住所など入力
* 支払い方法はクレジットカードか、このはチャージ。
  * このはチャージは500円以上が必要。

![Selection_015.png](https://qiita-image-store.s3.amazonaws.com/0/25728/aef65339-fa62-dd66-714d-640524b0e9b5.png)

ここまできて、そういえば昔会員登録したような・・・と思って日本語ページを見たら
「2015年5月17日以前にアカウント登録されたお客様はこちら」リンクがあった！！

![Selection_017.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b8d5c9ee-b52f-bc5b-5494-ec402f17e1f0.png)

Google+ のアカウントでログインができた。

## ログイン後のページ

![Selection_018.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c6925df5-9135-5678-35bf-c9ff296d6da9.png)

このはモードに切り替えとく

![Selection_020.png](https://qiita-image-store.s3.amazonaws.com/0/25728/858a0df1-f60c-d81a-6c83-5226b80a4cc7.png)



# API

* アカウント -> API
* 使い方は[ガイド](https://www.conoha.jp/guide/guide.php?g=46)を参照。

## トークンの取得

```bash:get_token.sh
$ curl \
 -i 'https://********.jp/v2.0/tokens' \
 -X POST \
 -H "Content-Type: application/json" \
 -H "Accept: application/json"  \
 -d '{"auth": {"tenantName": "1234567", "passwordCredentials": {"username": "1234567", "password": "************"}}}'
```

```bash:jqをインストールしておいたほうが良い。
apt-get install -y jq
```

```bash:
get_token.sh | tail -n 1 | jq '.'
```

* access > token > id の値を用いる。

# ConoHaオブジェクトストレージを使ってみる(REST API編)

* [ConoHaオブジェクトストレージを使ってみよう(REST API編) - このべん(ConoHa)](https://www.conoha.jp/conoben/archives/3429)
bashでTSV（タブ区切り）のデータを配列に入れる


# 要件

TSV（タブ区切り）データを1行分持ってきて、各データを配列に入れたくなりました。

+ なるべく速く
+ 空データは空データとして格納する
+ 特殊文字（タブ以外）を許容する

# 結論

各データをシングルクォーテーションで括って配列に代入します。
TSVデータ行が変数`STR`に入っているとして

```bash
$ eval ARRAY=("$(sed -e "s/'/'\\\\''/g" -e "s/\t/'\t'/g" -e "s/^/'/" -e "s/$/'/" <<< "$STR")")
```

# 原理

`eval`については以前の投稿 [bash で ls 結果を配列に入れる - Qiita](http://qiita.com/ymdymd/items/4121a1c7468451b42c3d) と同じです。
今回は、上記記事で`ls`の`--quoting-style=shell-always`がやってくれていたことを`sed`でやりました。

## sedでやっていること

例を示しながら書いてみます。
タブ部分はわかりやすいように`<TAB>`と書いています。

sed前：`aaa<TAB>b b<TAB><TAB>dd'dd`

`sed`では以下の処理を行っています
1. シングルクォーテーションをエスケープ（`'`→`'\''`）。
    `aaa<TAB>b b<TAB><TAB>dd'\''dd`
2. 先頭と末尾にシングルクォーテーションを配置。
    `'aaa<TAB>b b<TAB><TAB>dd'\''dd'`
3. タブの前後にシングルクォーテーションを配置。
    `'aaa'<TAB>'b b'<TAB>''<TAB>'dd'\''dd'`


sed後：`'aaa'<TAB>'b b'<TAB>''<TAB>'dd'\''dd'`


# お試し

タブ区切りの文字列を用意します。

```bash
$ # テストデータ作成
$ STR=$(echo -e "\tbbb\tc c\t\te'e'e\t")
$ # 確認
$ echo "\"$STR\""
"       bbb     c c             e'e'e   "
```

配列に代入します。

```bash
$ # 配列に代入
$ eval ARRAY=("$(sed -e "s/'/'\\\\''/g" -e "s/\t/'\t'/g" -e "s/^/'/" -e "s/$/'/" <<< "$STR")")
```

結果を確認します。

```bash
$ # 配列の中身を確認
$ for VAL in "${ARRAY[@]}"; do echo "$VAL"; done

bbb
c c

e'e'e

$ # ↑最後の空文字も入っている
```
空のデータもちゃんと入りました。

# 発展：複数行

TSVファイル（複数行）の各行について処理したい場合は

```bash
while read -r LINE; do
    eval ARRAY=("$LINE")
    # 各行についての処理をここに書く
done < <(sed -e "s/'/'\\\\''/g" -e "s/\t/'\t'/g" -e "s/^/'/" -e "s/$/'/" "$FILE")
```
sedの実行が1度で済むのでこれが速そう。

# 発展：TSV以外
区切り文字の判別はsedの`-e "s/\t/'\t'/g"`が要になっている。
カンマ区切りのファイルを入力としたい場合はここを`-e "s/,/'\t'/g"`とすれば良い。
[postgres] ActiveRecordでtruncateしてIDも1から採番するようにする


### 参考
+ [Reset PostgreSQL primary key to 1 - Stack Overflow](http://stackoverflow.com/questions/3819292/reset-postgresql-primary-key-to-1)


```rb
ActiveRecord::Base.connection.execute("TRUNCATE TABLE users")
ActiveRecord::Base.connection.execute("ALTER SEQUENCE users_id_seq RESTART WITH 1")
```
Knife-ZeroとVagrant(単品VM)


Knife-Zeroを試してみようとして、Vagrantでconverge(chef_client)を挫折するのをよく見るので、手順を追ってみた。

> 追記: knife-zero 1.8でbootstrap時のattributeを自動追加するように変更した。

## 素のVagrant VM(VBox)を作成する。

とりあえず何も設定しないでVMを起動してみることにする。

```Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "opscode-ubuntu-14.04"
end
```

up。

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'opscode-ubuntu-14.04'...
....


 SSH address: 127.0.0.1:2201

...

```

途中でSSHの接続情報出てくるよね。後でも取れるけど。


## knife zero bootstrapする。

さっきのSSH情報でBootstrapはできる。

```
$ knife zero bootstrap 127.0.0.1 --ssh-port 2201 --ssh-user vagrant --node-name test -i ./.vagrant/machines/default/virtualbox/private_key --sudo

Doing old-style registration with the validation key at ...
Delete your validation key in order to use your user credentials instead

Connecting to 127.0.0.1
127.0.0.1 Installing Chef Client...
127.0.0.1 --2015-06-18 09:25:51--  https://www.opscode.com/chef/install.sh
127.0.0.1 Resolving www.opscode.com (www.opscode.com)... 166.78.227.233
127.0.0.1 Connecting to www.opscode.com (www.opscode.com)|166.78.227.233|:443... connected.
127.0.0.1 HTTP request sent, awaiting response... 200 OK
127.0.0.1 Length: 18736 (18K) [application/x-sh]
127.0.0.1 Saving to: ‘STDOUT’
127.0.0.1 
100%[======================================>] 18,736      --.-K/s   in 0.003s  
127.0.0.1 
127.0.0.1 2015-06-18 09:25:58 (6.14 MB/s) - written to stdout [18736/18736]
127.0.0.1 
127.0.0.1 Downloading Chef 12 for ubuntu...

...

127.0.0.1 Converging 0 resources
127.0.0.1 
127.0.0.1 Running handlers:
127.0.0.1 Running handlers complete
127.0.0.1 Chef Client finished, 0/0 resources updated in 6.751803888 seconds
```

うむ、`nodes/test.json`がつくられる。


## Nodeで自動取得したIPアドレス(10.0.〜とか)とBootstrapで使用(SSH接続できる先)したIPアドレス(127.0.0.1)が違う

たいていここで詰まる。
NWが少し入り組んだ環境ではゲートウェイに繋がるNICとSSHの接続に使うIPアドレスが異なることもあるので、knife-zeroではbootstrap時に仕込みを入れることにした。

`nodes/test.json`を見ると、Bootstrap時に使用した接続名がnodeのattributeとして保持されている。


```nodes/test.json
{
  "name": "test",
  "normal": {
    "knife_zero": {
      "host": "127.0.0.1"
    },
    "tags": [

    ]
  },
  "automatic": {

-- 以下省略
```


## 接続用のIPを`--attribute`で渡してconverge

保持された接続先を指定するには、`--attribute knife_zero.host`を渡してconverge(chef_client)でOK。


```
$ knife zero converge name:test --attribute knife_zero.host --ssh-port 2201 --ssh-user vagrant  -i ./.vagrant/machines/default/virtualbox/private_key
127.0.0.1 Starting Chef Client, version 12.3.0
127.0.0.1 resolving cookbooks for run list: []
127.0.0.1 Synchronizing Cookbooks:
127.0.0.1 Compiling Cookbooks...
127.0.0.1 [2015-06-18T09:33:49+00:00] WARN: Node test has an empty run list.
127.0.0.1 Converging 0 resources
127.0.0.1 
127.0.0.1 Running handlers:
127.0.0.1 Running handlers complete
127.0.0.1 Chef Client finished, 0/0 resources updated in 6.403417422 seconds
```

これは`knife.rb`に`knife[:ssh_attribute] = 'knife_zero.host'`として省略もできます。
Vagrantでknife-zeroを"試してみるだけ"ならこれで十分。

----

複数のVMをつかう場合や、private_network/hostonly_networkを使うならREADMEに説明を書いています。
Cake3でCake2のJoin的なことをする

#テーブル
今回はこの２つのテーブルを使用。
  

| Tasks |         |           |
|:-----:|:-------:|:---------:|
|     id|task_name|category_id|
|     1 |太郎とご飯に行く|2|
|     2 |取引先に連絡する|1|

| Categories |     |
|:-----:|:--------:|
|     id|     name |
|     1 |     仕事　|
|     2 |プライベート|

#モデル
TasksTableで情報を取りたいTable(今回だとCategoriesテーブル)のTable名を記入

TasksTable.php

```
<?php
namespace App\Model\Table;

use Cake\ORM\Table;

class TasksTable extends Table
{

    public function initialize(array $config)
    {
        $this->belongsTo('Categories');
    }

}

```

#コントローラー
containを使ってCategoriesの情報を集める。
TasksController.php

```
<?php
namespace App\Controller;

use App\Controller\AppController;

class TasksController extends AppController
{
	public function index()
	{
		$query = $this->Tasks->find()->contain(['Categories']);
        $this->set('tasks', $this->paginate($query));
	}
}
```

#テンプレート(View)
Tasks/index.ctp

```
<table cellpadding="0" cellspacing="0">
 <thead>
    <tr>
        <th><?= $this->Paginator->sort('id') ?></th>
        <th><?= $this->Paginator->sort('task_name') ?></th>
        <th><?= $this->Paginator->sort('category') ?></th>
    </tr>
 </thead>
 <tbody>
<?php foreach ($tasks as $task): ?>
    <tr>
        <td><?= $this->Number->format($task->id) ?></td>
        <td><?= h($task->task_name) ?></td>
        <td><?= h($task->category->name) ?></td>
    </tr>
<?php endforeach; ?>
 </tbody>
</table>
```

#実行結果


![スクリーンショット 2015-06-18 午後6.50.31.png](https://qiita-image-store.s3.amazonaws.com/0/54862/2fae0d2b-f172-9f1a-0d5a-ab4557e07a36.png)
img src="" はandroid端末で自ページの多重リクエストを起こす問題

DBにユーザーの記録を書き込む際、androidのある端末でなぜか多重に登録されることがあった。
とくに記述も問題なく悩みに悩んでいたところ、下記のサイトを拝見して理解しました。
>http://lealog.hateblo.jp/entry/2014/03/27/224121

どうやら

```html
<img src="">
```
のようにimgタグのsrcが空だと、一部のandroid端末はそのURLにリクエストを行うせいで同じページをそのタグの分だけ読み込んでしまっていたらしい。解決としては様々らしいが、私は1pxの透明画像をダミーで読み込ませることにしました。
FuelPHPで，リフレクションを使ってOrm\Modelのキャッシュをクリアする

FuelPHPのORMにはキャッシュ機能があるが，場合によっては邪魔になってしまう．

キャッシュ機能については
http://tech.respect-pal.jp/fuelphp-orm-cache/
に詳しい解説がある．

今回，DBへのアクセスが発生するユニットテストで
「テストケースごとにテーブルをTRUNCATEしているのに，ORMのキャッシュ機能のせいで前のテストケースで行われた変更が次のテストケースに影響を与えてしまう」
という問題に遭遇した．
(テストは，https://phpunit.de/manual/current/ja/database.html を参考にし，テストケースごとに自動でテーブルのTRUNCATEとフィクスチャのロードが行われるようにしている）

例えば，テストケースAで

```php
$obj = Model_Foo::forge(array('id' => 1));
$obj->save();
```

したあと，
テストケースBで

```php
if (Model_Foo::find(1))
{
    echo 'exists';
}
```
などとすると，テストケースごとにTRUNCATEしているのにテストケースBで`Model_Foo`のエンティティが取り出されてしまう．

この問題に対し，ORMのキャッシュをクリアすることで解決を図った．

#リフレクションによる解決
`Orm\Model`は`$_cached_objects`という静的プロパティにオブジェクトをキャッシュしているが，
`Orm\Model`にはこの変数をクリアするメソッドが提供されていない．

http://tech.respect-pal.jp/fuelphp-orm-cache/ では`Orm\Model`を継承した独自クラスを作り，`$_cached_objects`をクリアするメソッドを追加して解決している．

~~しかし，既に多くのクラスが`Orm\Model`を継承するようになっているのを，独自クラスを継承するよう書きなおすのはしたくなかったので，~~
（テストでのみ利用される独自クラスを定義してテスト用のbootstrapで読み込むようにしてもよかったのだが，）
今回はリフレクションを使ってキャッシュをクリアするようにした．
これによりメインのコードには変更を加えず，テスト用コードのみの変更で済む．

具体的には，

```php
// Orm\Model::$_cached_objectsをクリアする
$model_reflection = new \ReflectionClass('Orm\\Model');
$prop = $model_reflection->getProperty('_cached_objects');
$prop->setAccessible(true);
$prop->setValue(null, array());
```

のようにする．
これを各テストケース実行時に呼べば良い．

私はDB接続があるテストが共通して継承する親クラスの`setup()`に書いている．

```php
	protected function setup()
	{
		parent::setup();
		
		// Orm\Model::$_cached_objectsをクリアする
		$model_reflection = new \ReflectionClass('Orm\\Model');
		$prop = $model_reflection->getProperty('_cached_objects');
		$prop->setAccessible(true);
		$prop->setValue(null, array());
	}
```
PowerShell_ニコ動ダウンロード

```lang:PowerShell

$vid="smXXXXXXXXX"

#接続先設定
$url1="http://flapi.nicovideo.jp/api/getflv?v=$vid"
$url3="http://ext.nicovideo.jp/api/getthumbinfo/$vid"
$url4="http://www.nicovideo.jp/watch/$vid"

#ログインする
$res1 = Invoke-RestMethod -Uri "https://secure.nicovideo.jp/secure/login?site=niconico" -Method POST -Body @{mail="[ID]";password="[PASS]"} -SessionVariable fb

#URLを取得
$res2 = Invoke-RestMethod -Uri $url1 -WebSession $fb -Method GET
$url2= ($res2| Select-String "&url=(.*?)&").Matches.Groups[1].Value.Replace("%3A",":").Replace("%2F","/").Replace("%3F","?").Replace("%3D","=")
#エンコードがわからんかったので置換

#拡張子取得
$res3 = Invoke-RestMethod -Uri $url3 -WebSession $fb -Method GET
$ext=$res3.nicovideo_thumb_response.thumb.movie_type #拡張子

#ダウンロード前にチラ見する
$res4 = Invoke-RestMethod -Uri $url4 -WebSession $fb -Method GET

#ダウンロードする
$outPath="$vid.$ext"
Invoke-RestMethod -Uri $url2 -WebSession $fb -Method GET -outfile $outPath


```
[PowerShell]カレントディレクトリにあるすべての.umlファイルに対してPlantUMLを実行する

```ps1
ls -r | where { $_.Name -like "*.uml" }|%{java -jar .\plantuml.jar $_ -o ..\img }
```

カレントディレクトリにplantuml.jarが配置されていることが前提。
実行すると1つ上のディレクトリにimgディレクトリができてその中に.pngファイルが出力される。
Android .apk ファイルから .smali や .class, .java ファイルを閲覧する方法 (リバースエンジニアリング)

覚書です.
# 一応はじめに.
ここに書かれていることを自分が作ったアプリケーション以外で行う場合は、利用許諾に違反すると思われますのでやらないようにお願いします。
デコンパイルすることによって、自分のアプリケーションがどうユーザに提供されているか確認し、それによってクラッキングを防いだりすることによってアプリケーションの品質を向上していく、といった使い方が望ましいと思います。

# 利用するツール群

**今回の手順は Windows10 前提です.**

* [apktool](http://ibotpeaches.github.io/Apktool/)
  * [apktool_2.2.1.jar](https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.2.1.jar) をダウンロード.
  * 適当な場所に置いておく.
* [dex2jar](https://github.com/pxb1988/dex2jar)
  * [dex2jar-2.0](http://sourceforge.net/projects/dex2jar/files/dex2jar-2.0.zip/download) をダウンロード.
  * 解凍して適当な場所に置いておく.
* [JavaDecompiler](http://jd.benow.ca/)
  * [jd-gui-windows-1.4.0](https://github.com/java-decompiler/jd-gui/releases/download/v1.4.0/jd-gui-windows-1.4.0.zip) をダウンロード.
  * 解凍して適当な場所に置いておく. 



# 事前準備
* 上記ツール群を、すべて C:\hoge 直下に置きます. (説明簡略化のため)
* Android 端末から APK ファイルを抜き出します. (仮に hoge.apk とする)
  * root 化でもいいし、アプリを使って apk のバックアップ取るでも良いですが、 全ては自己責任で.

# やり方1 (apktool によるリバースエンジニアリング)

```
> mkdir hoge
> cd C:\hoge
> java -jar apktool_2.2.1.jar d hoge.apk
```

これで `C:\hoge\hoge` というフォルダに色々入りました.
.java の代わりに、smali という名前のフォルダが作られており、ここには各クラスに応じて .smali というファイルが作られています.
中身はテキストベースのファイルとなっており、これだけでもある程度解析は可能になっていますが、やっぱり .java で見たほうが見やすい！という方のために、やり方2 を準備しました.

# やり方2 (unzip, dex2jar, JavaDecompiler)

unzip がない場合は [GNUWIN32](http://gnuwin32.sourceforge.net/packages/unzip.htm) からダウンロードして PATH を通しておく.

```
> cd C:\hoge
> unzip -d hoge hoge.apk
> dex2jar-2.0\d2j-dex2jar.bat hoge\classes.dex
> C:\hoge\jd-gui-windows-1.4.0\jd-gui.exe C:\hoge\classes-dex2jar.jar
```

これで、JD によって Java のソースコードにデコンパイルされたものが見られるようになります.

# 最後に
やり方 1 と やり方 2 を紹介したわけですが、.smali ファイルがソースコードと同じぐらい読める人なら、やり方 1 だけで十分です.
実際にデコンパイルしたソースコードをに変更を加えて再度コンパイルしようとした場合、.java のほうは融通が利かないことがあります. (コンパイルに失敗したり)
その点、.smali のデコンパイル、コンパイルはすんなりと通り、実機でも正常な動作を実現できます.

それでは良きエンジニアライフを(^w^)ﾉｼ
Centosで、yumが動かない時の対処

centos6.6(final)をVirtualBoxにインストールして、[ここ](http://d.hatena.ne.jp/yk5656/20131208/1386476543)の通りにセットアップしていたときにちょっと詰まったのでメモ。

yumを実行するとエラーで止まる。いろいろ調べてIPv6とか無効にしたが効果無し。

もろもろやってみた結果、

```ruby:/etc/sysconfig/network-scripts/ifcfg-eth1
ONBOOT=yes
BOOTPROTO=dhcp
```

でipアドレス取ってくるようにして、
「service network start」を走らせてから実行したら動いた。
ネットワーク動かしてなかった・・・
アホすぎるのでメモ。
クリックで波紋を出すエフェクト（Ripple Effect）実装メモ

# はじめに
2014年に発表されたマテリアルデザインのアニメーションの一つとして、Ripple Effectという波紋が広がるような演出があります。今回cssとjsで実装してみたので、それのメモです。

<こんな感じ>
![ripple.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/3e5b264c-164d-0e7e-338b-fb6302c59ddc.gif)



> 実際の動き
> http://nekoneko-wanwan.github.io/demo/mouse-action/click/
> ※cssのプレフィックスは書いていないので動かない環境もあります


# html

- `div.ripple`がクリック範囲の要素、`span`がエフェクトの要素です。
- ここではspanを直接書いていますが、jsの方でDOM生成しても良いかと思います。

```ripple.html
<div class="ripple">
	<span class="ripple__effect is-orange"></span>
</div>
```

# javascript

- エフェクト要素をクリックした座標を中心とした位置に移動させます。
- エフェクトのアニメーション自体はcssで表現しています。
- エフェクトを発動させるための`class`を付け替えます。

```ripple.js
$(function() {
    var $clickable = $('.ripple');

    /* mousedownだと直ぐに発動し、clickだとマウスボタンを離した時に発動する */
    $clickable.on('mousedown', function(e) {
        var _self   = this;
        var x       = e.offsetX;
        var y       = e.offsetY;

        var $effect = $(_self).find('.ripple__effect');
        var w       = $effect.width();
        var h       = $effect.height();

        /* クリックした座標を中心とする */
        $effect.css({
            left: x - w / 2,
            top: y - h / 2
        });

        /* jsではclassの付け替えをするだけ */
        if (!$effect.hasClass('is-show')) {
            $effect.addClass('is-show');

            /*
             * エフェクトアニメーションが終わったらclassを削除する
             * ここでは、単純にcssで設定するdurationと時間を合わせているだけですが
             * keyframes終了のイベント(AnimationEnd)が取れるかと思うので、それで対応した方が良いかも
             */
            setTimeout(function() {
                $effect.removeClass('is-show');
            }, 750);
        }
        return false;
    });

});

```

# css

- エフェクトアニメーションの設定を行ないます。

> プレフィックスは省略しています

```ripple.css
/* クリックできる要素 */
.ripple {
	/* エフェクトに直接関係はない */
	margin: 20px;
	background-color: #f7f7f7;
	height: 100px;
	width: 200px;
	text-align: center;
	line-height: 100px;
	cursor: pointer;

	/* 必須 */
	overflow: hidden;
	position: relative;
}

/* エフェクト要素 */
.ripple__effect {
	/* 値の変更はエフェクト形体・サイズ・スピードに影響する */
	width: 150px;
	height: 150px;

	/* 必須 */
	position: absolute;
	border-radius: 100%;
	pointer-events: none;
	transform: scale(0);
	opacity: 0;
}

/* エフェクト要素の色を指定 */
.ripple__effect.is-orange { background: #f1c40f;}
.ripple__effect.is-blue   { background: #4aa3df;}
.ripple__effect.is-black  {	background: #999;}

/* classが付与されたらアニメーションを実行 */
.ripple__effect.is-show {
	animation: ripple 0.75s ease-out;
}

/* アニメーションの定義 */
@keyframes ripple {
	from {
		opacity: 1;
	}
	to {
		transform: scale(2);
		opacity: 0;
	}
}
```
UNIX講習会#7 Permission編


## Permission とは?

* だれがどのファイルを編集できるかを制限できるもの
* ユーザー，グループ，その他の単位で制限できる
  * 強制アクセス制御を用いることでもっと細かく制限できるがここでは割愛
* 大規模計算機など複数人で共有するマシンでは適切なパーミッションを設定することが重要

---

## Permission の基本

* 制御の単位は「書き込み・読み込み・実行」を「自分・グループ・その他」に対して制御する
* `ls -l`で現在のパーミッションを確認できる

```bash
$ ls -lh
合計 344M
-rw-r--r--.  1 hogehoge foo  36M  6月 10 22:52 Python-2.7.10-centos6.tar.xz
drwxr-xr-x. 15 hogehoge foo 4.0K  6月 11 00:33 R-3.2.0/
```

* 最初の`drwxr-xr-x`となっている部分がパーミッションを表す．
* `hogehoge foo`の部分は最初が所有しているユーザー名，次がグループ名

---

## Permission の読み方

* `drwxr-xr-x`の部分は4つにわけて考える


1. `d`の部分はディレクトリか否かを表す
2. 次の`rwx`は所有しているユーザーの権限を表す
  * `r`は読み込み可（Directoryでは一覧を取得可）
  * `w`は書き込み可（Directoryはファイルの作成や削除ができる）
  * `x`は実行可（Directoryではアクセス可）
3. その次の`r--`はグループに所属するユーザーの権限を表す
  * 各項目は所有ユーザーと同じで，権限がない場合には`-`になる
4. 最後の`r--`はその他のユーザーの権限を表す

---

## 自分の所属するグループの確認法

* `id`コマンドで確認できる

```bash
$ id
uid=1001(hogehoge) gid=1004(foo) groups=1004(foo),1007(bar)
```

* この例ではユーザー`hoge`はグループ`foo`と`bar`に属している
* どのようなユーザーやグループが存在しているかは`getent passwd`と`getent group`で調べることができる
  * ファイルとしては`/etc/passwd`や`/etc/group`に書かれているが，環境によってはすべて書かれているとは限らないので`getent`で調べる

---

## Permissionの変更方法

* `chmod`で変更できる（Change Modeの略）


* すべてのユーザーに対して実行権限を付加する
  * `chmod +x hoge`
* すべてのユーザーに対して実行権限と読み込み権限を付加する
  * `chmod +rx hoge`
* 所有しているユーザーに対して書き込み権限を付加する
  * `chmod u+w hoge`
* 所有しているユーザーとグループに対してに対して読み込み権限を付加する
  * `chmod ug+r hoge`

* `chmod [ugo]+[rwx] FILE` で権限を付加する
  * `u`が所有ユーザー，`g`は所有グループ，`o`はその他
  * `r`は読み込み，`w`は書き込み，`x`は実行権限
* `chmod [ugo]-[rwx] FILE` で権限を剥奪する

* これ以外に現状にかかわらず特定のパーミッションに設定することもできる

* `chmod 600 FILE`は所有ユーザーにのみ読み書きの権限を与える
* 権限の種類で数字を決定する
  * `1`は実行権限
  * `2`は書き込み権限
  * `4`は読み込み権限
  * これらの数字の和を使う
* 3桁の数字は前から所有ユーザー，所有グループ，その他のユーザー

---

## Ownerの変更方法

* ファイルの所有者を変更にするには`chown`コマンドを使用する（Change
  Ownerの略）
* `chown USER:GROUP FILE...`として使う
* 管理者権限がない場合には所有ユーザーを書き換えることはできない

```bash
$ chown hogehoge:bar sample.txt
```

この例では`sample.txt`を所有ユーザーを`hogehoge`に，所有グループを
`bar`に書き換えている

---

## 課題

1. 自分のホームディレクトリに自分と`student`グループに所属する人だけが見れるファイルを作成しなさい
2. 自分のホームディレクトリに自分以外のユーザーが書き込めるけど中身をみることができないディレクトリを作成しなさい

* テスト用環境では学部生は`student`と`undergraduate`に所属し，院生は
  `student`と`graduate`グループに所属している

---

## こたえ

* `chmod 640 FILE`と`chown :student FILE`を実行する
* `chmod 733 DIR`を実行する
  * フォルダの中身にアクセスし，ファイルの作成などはできるが，リストはとれない

---

## まとめて変更する

* `chmod`も`chown`も`-R`オプションをつけることでディレクトリの中身をまとめて変更できる
* 多くの場合，ディレクトリは755にして，ファイルは644にするが，`-R`でやると区別がつかないので注意
   * その場合には`find`と組み合わせるとよいがここでは解説しない

---

## 補足：実行権限とは？

* 実行可能なプログラムには実行権限をつける必要がある
* 実行可能なプログラムはCをコンパイルして作ったバイナリの他，Shell Script や Python のプログラムが含まれる
* Python のプログラムでは`python SCRIPT.py`の様に実行する場合には実行権限をつける必要はないが，`./SCRIPT.py`として，`python`をつけずに実行する場合には権限をつける必要がある
  * 1行目に`#!/usr/bin/env python`といった Shebang を書く必要がある
  * Ruby や Shell Script も同様

---

## 補足：rootユーザーとは？

* rootユーザーはパーミッションを無視してすべてのファイルが読み書き可能
  * 実行権限だけは所有のパーミッションの影響を受ける
* `sudo`を使うことで一時的に`root`ユーザーになれる
  * ただし，許可されている場合のみ

---

## 余談

* 誰がログインしているかは`who`コマンドで調べられる
* 誰が何をしているかは`w`コマンドで調べられる
* 誰がどのようなコマンドが実行しているかは`ps aux`で調べられる

---

## まとめ

* Permission は誰がどのファイルにアクセスでき，読み込みや書き込み，実
  行ができるのかを制限できる
* `chmod`と`chown`でパーミッションを変更したり，所有者を変更することが
  できる
エラー 1366 Incorrect string value: '\xF0\x9F\x92\xA2" ...' for column 

今日はこの絵文字「💢」のおかげで面白いものを知ってしまいました。それは`utf8mb4`です。

utf8のMySQLデータベースに上記の絵文字を保存しようとしたら、次のエラーが発生しました。

![スクリーンショット 2015-06-18 午後5.02.06.png](https://qiita-image-store.s3.amazonaws.com/0/60849/65cacff7-6ebc-600c-267b-b14581c72448.png)

調べたら理由はMySQLのutf8は３バイトまでしか対応していません。しかし、上記の絵文字は４バイトもあります。３バイトまでしか対応していないデータベースに4バイトの絵文字を保存しようとしていたので、エラーが発生しました。

![スクリーンショット 2015-06-18 午後5.20.06.png](https://qiita-image-store.s3.amazonaws.com/0/60849/8891ddae-ed81-12e0-efae-bc1ec8fc912f.png)

ネットで調べたらMySQL5.5以上から`utf8mb4`という4バイトのutf8に対応する文字コードがありまして、さっそく`show character set`で確認したら

![スクリーンショット 2015-06-18 午後6.03.38.png](https://qiita-image-store.s3.amazonaws.com/0/60849/ac015136-0696-3c0e-7ff3-4641c81411fa.png)

本当に4バイトまで対応している`utf8mb4`がありました！！

データベース、テーブルとconnection driverが全部utf8からutf8mb4に切り替えたら上記のエラーが解消しました。
20150618 rails tutorial


### 感想

見ながらやろう
http://railsguides.jp/

rails tutrial を参考資料付きで解説してくれるのはありがたい。

### 参考

select, pluck を比較。手元でやってみたい。
http://blog.livedoor.jp/sasata299/archives/51847390.html

### sign in, sign out
http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#top

### user entry

### secure password

http://railstutorial.jp/chapters/modeling-users?version=4.0#sec-adding_a_secure_password

    rails generate migration add_password_digest_to_users password_digest:string

bcrypt
has_secure_password

http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#top
##

sinatra + rspec で testの時に見るDB変更している部分を記述
http://j-caw.co.jp/blog/?p=1042

capybara
visit
click_button 

bootstrap  span => col-md-x
http://getbootstrap.com/css/#grid

## sublime設定

sass syntax

Sublime text 3で不要な半角/全角スペースをハイライトして知らせてくれるパッケージ「Trailing Spaces」
http://stella-design.biz/2014/08/27/222013.html

### User

正規表現これでみると便利
http://www.rubular.com/

dbを汚さないで確認できる。

    $ rails console --sandbox

test用のdb準備
    $ bundle exec rake db:test:prepare
    $ bundle exec rake db:migrate RAILS_ENV=test

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

rspec の書き方も参考になる。

### user layout

http://railstutorial.jp/chapters/filling-in-the-layout?version=4.0#sec-user_signup
### layout

http://railstutorial.jp/chapters/filling-in-the-layout?version=4.0#top

Bootstrap LESSの変数一覧
https://github.com/twbs/bootstrap-sass/blob/master/assets/stylesheets/bootstrap/_variables.scss


デザイナさんにsass使ってもらうのはどうしたら？
社内CSSフレームワークを作ろう！
http://www.enigmo.co.jp/blog/tech/%E7%A4%BE%E5%86%85css%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86%EF%BC%81/

#### Asset pipeline

ダイジェスト付与はキャッシュ回避のため、とやっと気づいた…


### 

何度もやりたいRailsチュートリアル
http://objectclub.tumblr.com/post/73687093348/rails
Lambda式を使ってIteratorを定義する

#通常のIteratorの使い方

配列の要素を返すIteratorは通常、次のように定義します。

```java
        int[] array = {3, 1, 4, 1};

        Iterator<Integer> iterator = new Iterator<Integer>() {
            int i = 0;
            
            @Override
            public boolean hasNext() {
                return i < array.length;
            }

            @Override
            public Integer next() {
                return array[i++];
            } 
        };
```

Iteratorは`hasNext()`と`next()`の二つのメソッドを定義する必要があるため、これを単純なLambda式に置き換えることはできません。

#二つのLambda式からIteratorを作成する

そこで、二つのLambda式をコンストラクタで受け取るようなIteratorの実装クラスを作成します。

```java
    public class LambdaIterator1<T> implements Iterator<T> {

        final Supplier<Boolean> hasNext;
        final Supplier<T> next;
        
        public LambdaIterator1(Supplier<Boolean> hasNext, Supplier<T> next) {
            this.hasNext = hasNext;
            this.next = next;
        }

        @Override
        public boolean hasNext() {
            return hasNext.get();
        }

        @Override
        public T next() {
            return next.get();
        }
    }
```

これを使って、さっきと同じことをやってみます。

```java
        int[] array = {3, 1, 4, 1};

        int i = 0;
        Iterator<Integer> iterator = new LambdaIterator1<>(
            () -> i < array.length, () -> array[i++]);
```

すっきりしましたが、`i++`の部分がコンパイルエラーになってしまいます。Lambda式が参照する自由変数は変更されてはいけないためです。`final int i = 0;`としても結果は同じです。
以下のようにすればコンパイルはできますが、コンパイルエラーを回避するためだけに`i`を配列化しているため、分かりにくいコードになってしまいます。

```java
        int[] array = {3, 1, 4, 1};

        int i[] = {0};
        Iterator<Integer> iterator = new LambdaIterator1<>(
            () -> i[0] < array.length, () -> array[i[0]++]);
```

#Lambda式が参照するコンテキストを追加する。

自由変数を使用せずLambda式が引数として受け取ることのできるコンテキストを追加してみます。

```java
    public class LambdaIterator2<T, C> implements Iterator<T> {

        final C context;
        final Function<C, Boolean> hasNext;
        final Function<C, T> next;
        
        public LambdaIterator2(C context, Function<C, Boolean> hasNext, Function<C, T> next) {
            this.context = context;
            this.hasNext = hasNext;
            this.next = next;
        }

        @Override
        public boolean hasNext() {
            return hasNext.apply(context);
        }

        @Override
        public T next() {
            return next.apply(context);
        }
    }
```

そうすると先の例は以下のようになります。

```java
        int[] array = {3, 1, 4, 1};

        Iterator<Integer> iterator = new LambdaIterator2<>(
            new Object() { int i = 0; },
            c -> c.i < array.length, c -> array[c.i++]);
```

変数`i`は自由変数ではなくなったので変更可能です。コンテキスト（第１引数）は無名の内部クラスですが、フィールドやメソッドを自由に定義できて、それらをLambda式の中で使うことができます。`Object`のサブクラスである必要もありません。任意のオブジェクトを使用できます。
`LambdaIterator2`に以下のメソッドを追加しておけば、`Iterable`や`Stream`も簡単に作れるようになります。

```java
        public Iterable<T> iterable() {
            return () -> this;
        }

        public Stream<T> stream(boolean parallel) {
            return StreamSupport.stream(iterable().spliterator(), parallel);        
        }

        public Stream<T> stream() {
            return stream(false);
        }

```
AFNetworkingのNSURLSessionへの置き換えについて

http://qiita.com/kenchan1837/items/a9e1de18c7eab75c4145
上記記事の通信周りの説明の補足です。
（主にcocoaPodsが使えなかった時用）

今回作成したアプリでAFNetworkingを利用して通信を行っている部分は
・検索ボタンを押した後のJSONデータの取得
・一覧画面を表示するときのサムネイル画像の取得
の２箇所になっています。

AFNetworkingの利用は必須というわけではないので
標準のframeworkを利用して通信処理を置き換えることも可能です。

標準frameworkを利用する場合iOS7より導入されたNSURLSessionを使うのが一般的ですので
以下に置き換え例を示します。
https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/

・検索ボタンを押した後のJSONデータの取得

```lang:AFNetworking
AFHTTPSessionManager().GET(
                "https://itunes.apple.com/search?term=\(text)&country=JP&lang=ja_jp&media=music",
                parameters: nil,
                success: { (task: NSURLSessionDataTask!, response: AnyObject!) -> Void in
                    if let data = response as? NSDictionary, results = data["results"] as? [NSDictionary] {
                        self.results = results
                        self.tableView.reloadData()
                    }
                },
                failure: nil)
}
```
を以下のように書き換えてください。

```lang:NSURLSession
var url:NSURL = NSURL(string:"https://itunes.apple.com/search?term=\(text)&country=JP&lang=ja_jp&media=music")!
var req:NSURLRequest  = NSURLRequest(URL: url)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: nil)
let task = session.dataTaskWithRequest(req, completionHandler: {(data,response,error) in
    let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil)
    if let data = json as? NSDictionary, results = data["results"] as? [NSDictionary]{
        self.results = results
        dispatch_async(dispatch_get_main_queue(),{
            self.tableView.reloadData()
        })
    }
})
task.resume()
```

・一覧画面を表示するときのサムネイル画像の取得

```lang:AFNetworking
cell.artworkImageView.setImageWithURL(NSURL(string: artworkUrl))
```
を以下のように書き換えてください

```lang:NSURLSession
let req = NSURLRequest(URL:NSURL(string: artworkUrl)!)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: nil)
let task = session.dataTaskWithRequest(req, completionHandler: {(data,response,error) in
    dispatch_async(dispatch_get_main_queue(),{
        cell.artworkImageView.image = UIImage(data:data)
    })
})
task.resume()
```

以上でAFNetworkingを利用しないで通信処理を行うことができます。
Vagrant 個人メモ

使用するBoxのURLを指定する

`config.vm.box_url = "https://vagrantcloud.com/ubuntu/boxes/trusty64/versions/14.04/providers/virtualbox.box"`

以下URLで公開されているBoxはローカルにない場合でもconfig.vm.boxでBox名を指定するだけで自動的にダウンロードされる。
https://atlas.hashicorp.com/boxes/search



定期的に追記します。。
デザインパターン覚書

- PDP-7のコンパイラにはWORD型しか無かった。メモリが8Kしかないコンピュータでは、サイズの大きな型を扱えなかった。
- integer, char型が生れた。
- 最初はグローバル変数しか無かった。gosub + returnでプログラムが制御されており、関数に名前も無ければ、ローカル変数も無かった。
- 割り込みが掛かった時の飛び先に関数名を記述出来る様になる。
- 物理的な割り込みをソフトウェア的なイベントとして取り扱う様になる。
- 関数へのポインタとローカル変数をまとめた、構造体が生れる。
- インスタンス変数とメソッドを備えたクラスが生れる。
- インスタンス変数を持たない、インターフェース、プロトコルが生れる。
- クラスの型、インターフェースの型の両方を備えた型二重性（ポリフォーミズム）が生れる。
- クラスを継承して差分プログラミング出来る様になる。
- ライブラリー（フレームワーク）内のクラスを継承し、ライブラリー（フレームワーク）から呼ばれるカスタムクラスを作れる様になる。カスタムクラスはフレームワークから呼ばれる様になる。（制御の逆転、1988年）
- 制御の逆転の様々な形態をまとめたデザインパターンが生れる。（デザインパターンに気づくGoFが出現する。1993年）
- 普及型クラスライブラリ使用プログラミング言語Javaが生れる。1995年
VB.Netでエクセルに画像を貼り付けたら0x800a03ec

原因はエクセルのシートを複数選択している状態（作業グループ）でした。

テンプレートファイルが複数選択している状態で、
テンプレートファイルからコピーしたファイルに貼り付けようとしていたためエラーとなっていた。

他の原因でなることもあると思いますが参考までに。
re:dash 運用時の Tips

re:dash の設定関連の Tips です。
ドキュメントに書いてない設定があったので、それの使い方などを。

https://github.com/EverythingMe/redash/blob/master/redash/settings.py

## Google Apps 認証をする場合に、パスワード認証を無効にする

無効にしていないと、デフォルトの `admin/admin` でうっかりログインできてしまう。

設定ファイル（デフォルトだと `/etc/redash/.env`）に以下を追加

```bash
export REDASH_PASSWORD_LOGIN_ENABLED=false
```

これだけだと admin 権限でログインできるユーザがいなくなってしまうので、admin 権限を付与したいユーザで一度 Google Apps ログインした後、以下のコマンドを叩いて admin 権限を付与しておくこと。

```bash
$ cd /path/to/redash
$ sudo -u redash bin/run ./manage.py users grant_admin {email}
```

## 使わなくなったキャッシュデータを削除する

re:dash はクエリの結果をローカルの PostgreSQL にキャッシュして表示するという仕組みになっています。
しかし、データを更新したり、クエリを削除したりすると、このキャッシュデータは削除されないため、段々とゴミが溜まってきて、ディスクを圧迫していきます。

このゴミデータをクリーンアップする機能が提供されており、有効化するためには設定ファイルに以下の環境変数を設定します。これで5分に1回、1回あたり最大で100個ずつデータが削除されます。

```bash
export REDASH_QUERY_RESULTS_CLEANUP_ENABLED=true 
```

ディスクに余裕のないマシンで実運用時には指定しておくと良いと思います。

関連 issue: https://github.com/EverythingMe/redash/issues/452
RailsでAngularJSの導入と動作確認（基礎編）



## AngularJSの導入

AngularJS - 公式ページからAngularJSの本体のファイル(angular.min.js)を取得し、`vendor/assets/javascripts/` に配置する。

```
curl https://ajax.googleapis.com/ajax/libs/angularjs/1.3.8/angular.min.js > vendor/assets/javascripts/angular.min.js
curl https://ajax.googleapis.com/ajax/libs/angularjs/1.3.8/angular.min.js.map > vendor/assets/javascripts/angular.min.js.map
```

AngularJSの設定ファイルとなる `app.coffee` を作成する。

```
# app/assets/javascripts/app.coffee


app = angular.module('sampleApp', [])

app.config ($httpProvider) ->
  $httpProvider.defaults.headers.common['X-CSRF-Token'] =
    document.getElementsByName("csrf-token")[0].content

$(document).on 'page:load', ->
  $('[ng-app]').each ->
    module = $(this).attr('ng-app')
    angular.bootstrap(this, [module])
```

jqueryとturbolinksも一緒に動くようにするために、jquery-turbolinksを入れる。

```
# Gemfile
gem 'jquery-turbolinks'
```

jquery.turbolinks、angular.min、appを `application.js` に追記する。
（Railsが記載したjsファイルを読み込むようになる。）

```
# app/assets/javascripts/application.js
//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks
//= require angular.min
//= require app
//= require_tree .
```

application.html.erbにng-appディレクティブを追加。
（ng-appディレクティブ内がAngularJSにより解析されるので、その中でAngularJSが使えるようになる。）

```
# app/views/layouts/application.html.erb
<!-- app.coffee の戦闘のangular.moduleで宣言した名前にする -->
<html ng-app="sampleApp">

...

```

Railsはproducton環境の場合、アセットをコンパイルすることによりAngularJSが動かなくなってしまう。そのため、production.rbにconfig.assets.js_compressor = Uglifier.new(mangle: false)を追加しておく。

```
# config/developments/production.rb

# Compress JavaScripts and CSS.
# config.assets.js_compressor = :uglifier
config.assets.js_compressor = Uglifier.new(mangle: false)
# config.assets.css_compressor = :sass
```


## 動作確認

では、動作確認のために、コントローラーを作成する。

```
rails g controller Templates index --skip-assets
```

次のように記載。テキストフィールドにng-modelでnameを定義し、それを、{{name}}でデータバインティングして動的に表示するようにしている。

```
# app/views/templates/index.html.erb
<h1>Templates#index</h1>

<div>
  <%= label_tag :naem, "名前" %>
  <%= text_field_tag :name, "", "ng-model" => "name" %>
</div>

<p>こんにちは、「{{name}}」さん。</p>
```

テキストフィールドに値をいれると、{{}}で囲んだ箇所が動的に変化することがわかる。もし、うまく動かない場合は、JavaScriptコンソール(Chromeの場合)を開きエラーが発生していないか確認する。
US／JIS配列両方でCtrl-+ をキャッチする


「+」という文字の入力はUS配列だと shift+=, JIS配列では shift+;になる。
問題となるのは、ctrl+shift+αという組み合わせがどういうメタキーの組み合わせとして解釈されるか、キーボードの設定次第で変わる。
US配列だとkeyCode: 187 とctrlKey。JIS配列だと186とctrlKeyとshiftKeyになっていた。

```coffeescript
window.addEventListener "keydown", (e) =>
  #  US / JIS
  if (e.keyCode is 187 and e.ctrlKey) or (e.keyCode is 186 and e.shiftKey and e.ctrlKey)
    e.preventDefault()
    # exec something
    return false
  return true
```

この挙動によって何が起こるかというと、JIS配列を考慮してないキーバインド定義ライブラリを使うと、どう頑張ってもメタ-+をキャッチできないようなことになっていることがある。CodeMirrorお前だ。