OmniAICreator/Qiita-1.07M huggingface dataset:
CloudBeesのJenkinsでgithubのsbtのプロジェクトをGAEにデプロイ

タイトルの通り、CluodBeesのJenkinsを使ってsbtのScalaプロジェクトをGAEにデプロイする設定をしたときのメモ（初Jenkins）。

# CloudBeesのアカウントを取る
http://www.cloudbees.com/ からサインアップ。
googleアカウント/githubアカウントが使えた。
ビルドサーバの起動時間に制限があるけど無料プラン有り。
よく分かってないけど、DEV@cloudっていうのがJenkinsとかgitとかのSaaSで、RUN@cloudっていうPaaSもあるっぽい。

# CloudBees Jenkins for Google App Engineの登録
デフォルトだとGAE用のJenkins Plugin?が入って無いのでここから登録しないといけないっぽい。
https://appengine.cloudbees.com/index.html
GAEの管理権限のあるGoogleアカウントで認証。

結構時間がかかるけどこんな画面になったら完了。
![スクリーンショット 2014-06-08 23.01.47.png](https://qiita-image-store.s3.amazonaws.com/0/9490/83efa0c7-9094-0a79-f05e-e2c425da4d3e.png)

To Jenkins!のボタンでJenkinsに戻れる。

※こちら→http://sboxsharp.blogspot.jp/2013/01/cloudbees-jenkins-for-google-app-engine.html# 参考にしました。
（レポジトリはgithubを使ったのでCloudBees上にはレポジトリ作らなかった）

# sbtを使える様にセットアップ
## Jenkins sbt pluginの追加
Builds > Jenkinsの管理 > プラグインの管理 からチェックしてインストールするだけ。

## 使いたいsbtのバージョンのsbt-launch.jarをWebDAVにアップロード
こちらを参考に→http://blog.shinichy.com/2013/07/cloudbees-devcloudjenkinssbt.html#

手順だけまとめると

- sbt-launch.jarをCloudBeesのWebDAVにアップロード
- Jenkinsのシステム設定でsbtのパスをアップロードしたやつに指定
- Jobの設定 > Build EnvironmentでPrivate WebDAVをマウントするようにチェック

## sbtのプラグインsbt-appengineを使っている場合はAPPENGINE_SDK_HOME環境変数を指定

JenkinsのGAE Pluginで使われるSDKの場所は`/opt/google/gae_java_sdk/1.8.latest`だったので Jenkinsの管理 > システムの設定 から環境変数を指定。

![スクリーンショット 2014-06-08 23.12.25.png](https://qiita-image-store.s3.amazonaws.com/0/9490/d773df3e-2855-2933-0b05-e5b48ee8107d.png)

# ビルドの設定

- sbtでpackageして、
- target/webapp/ をデプロイする様に設定

![スクリーンショット 2014-06-08 23.13.40.png](https://qiita-image-store.s3.amazonaws.com/0/9490/49238708-c338-790e-405a-a143757c9876.png)

※app-idとversionはappengine-web.xmlに書かれているのを設定でオーバーライドできるので便利
Groovy on Androidで簡単なアプリを作ってみる

[Groovy](http://groovy.codehaus.org/Japanese+Home) 2.4でAndroidのサポートが始まったので､練習がてら卓球ハウスの[在宅API](http://naoty.tumblr.com/post/66283525259/tqkey)を閲覧できるアプリを作りました｡
ソースコードはGitHubに公開しています｡

https://github.com/hotchemi/tqkey-groovy

![](https://camo.githubusercontent.com/3c58643cf380c1c13656df26ece1c5f41e3df538/687474703a2f2f662e73742d686174656e612e636f6d2f696d616765732f666f746f6c6966652f682f686f746368656d692f32303134303630382f32303134303630383131303830352e706e67)

## Groovyで書いてみてどうか

### Jsonの扱いが楽

基本的にGroovyで書けるのは便利で､例えばAndroidでjsonをパースする時はJavaだとJsonObjectを使って手動パースしたり､あるいはGsonとかJacksonを使う事が多いと思いますが､GroovyはJsonの読み書きをネイティブサポートしているので､例えばこんな感じで柔軟に処理する事ができます｡ただ､JsonSlurper#parseTextのreturnはObject型なのでIDEの恩恵が受けられなくなるのがちょっと不便でした｡

```groovy
package tqkey.android.events

import groovy.json.JsonSlurper
import tqkey.android.entity.User

class SuccessCallApiEvent {

    List<User> users

    SuccessCallApiEvent(String content) {
        users = new ArrayList<User>()
        new JsonSlurper().parseText(content).users.each {
            users.add(new User(it))
        }
    }

}
```

### Injection系のライブラリが使えない

ButterKnifeとかアノテーションプロセッサを利用できないのが結構不便です｡只､JavaとGroovyを混在させる事ができるので必要に応じて使い分けるのが良いのかもしれません｡試していませんが｡

後､変数やメソッドのシグニチャで型宣言をしないと色々IDEの恩恵が受けられなかったり､publicを省略したりする(defaultでpublic)事もできるのですが､万が一拡張子を変更する時に修正する所が増えるので､そこら辺も考えて必要に応じてGroovyのシンタックスで書く､というスタイルが良いのではないかと思いました｡

### gradle-groovy-android-plugin

GroovyでAndroidを利用する為にはbuild.gradleにゴニョゴニョおまじないを書く必要がありますが､既に[gradle-groovy-android-plugin](https://github.com/melix/groovy-android-gradle-plugin)という便利プラグインが公開されているので､こちらを利用するのがいいと思います｡

`build.gradle`にこんな感じで追記します｡`oss.jfrog.org`にGroovy 2.4.0-SNAPSHOTがホストされているのでそっちを使うとローカルでビルドしなくて良くて便利です｡

```groovy
buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.11.+'
        classpath 'me.champeau.gradle:gradle-groovy-android-plugin:0.1'
    }
}

allprojects {
    repositories {
        mavenCentral()
        maven {
            url='https://oss.jfrog.org/oss-snapshot-local/'
        }
    }
}

apply plugin: 'groovy-android'
```

Android Studioを0.6.0にアップデートするとandroid plugin 0.11+が必須になってver:0.1が利用できなくなったのですが､先程対応済の0.0.2が公開されたようです｡

<blockquote class="twitter-tweet" lang="ja"><p>Release 0.2 of the <a href="https://twitter.com/search?q=%23groovylang&amp;src=hash">#groovylang</a> plugin for <a href="https://twitter.com/search?q=%23android&amp;src=hash">#android</a> is out, supporting <a href="https://twitter.com/search?q=%23android&amp;src=hash">#android</a> plugin 0.11+ <a href="http://t.co/oVlixlGEgS">http://t.co/oVlixlGEgS</a> /cc <a href="https://twitter.com/pledbrook">@pledbrook</a></p>&mdash; Cédric Champeau (@CedricChampeau) <a href="https://twitter.com/CedricChampeau/statuses/475570875157458944">2014, 6月 8</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
【Java初心者】参照型を引数として渡したときの挙動

**20190422追記**
「参照渡し」への間違い部分に修正を入れています。
一部取り消し線で対応していますが、取り消し線での対応が難しい部分は大きく改変しています。(該当部分にはその旨を書いています)
**追記ここまで**


以前、[【Java初心者】値渡しと参照の値渡し(”参照渡し”という言葉は誤解を生むとのことで修正しています)](http://qiita.com/chihiro/items/d3d9a028cd5dd8e84649)という記事を投稿したのですが、さらに詳しく知ることができたのでまとめます。

##値渡しと参照の値渡し
メソッドの引数には、基本データ型も参照型も指定できます。しかし、どちらの型を使うかによって挙動がかわってきます。

基本データ型を指定した場合は値のコピーがメソッドに渡されます。値のコピーが渡されるので、メソッドの中で引数に対して行われた操作は、呼び出し元には影響しません。

参照型を指定した場合はその値の**参照のコピー**をメソッドに渡します。そのためメソッドの中で引数に対して行われた操作は、呼び出し元にも影響します。
ここまでが前回の記事の内容です(詳しくは[【Java初心者】値渡しと参照の値渡し(”参照渡し”という言葉は誤解を生むとのことで修正しています)](http://qiita.com/chihiro/items/d3d9a028cd5dd8e84649)をどうぞ)。

##参照の値渡し
~~基本的には上に書いたようなことなのですが、正確にいうと少し違うというか、誤解を与えてしまうかもしれません。
参照型の場合、参照情報を渡すので、メソッド内での操作は呼び出し元に影響を与えます。
このことを以下のサンプルで説明します。~~

参照の値渡し(参照のコピーを渡している)という部分を以下のサンプルで説明します。


まずはsample1です。

```java:sample1

int[] array = {10,20,30};
System.out.println("呼び出し前:" + array[0]);
method(array);
System.out.println("呼び出し後:" + array[0]);

void method(int[] arrayInMethod){
     arrayInMethod[0] = 100;
} 

```

```java:sample1の結果
呼び出し前:10
呼び出し後:100
```


続いて、sample2です。

```java:sample2
int[] array = {10,20,30};
System.out.println("呼び出し前:" + array[0]);
method(array);
System.out.println("呼び出し後:" + array[0]);

void method(int[] arrayInMethod){
     int[] nums = {100,200,300};
     arrayInMethod= nums;
} 

```

```java:sample2の結果
呼び出し前:10
呼び出し後:10
```

**追記：以下、大幅に改変しました。**
**sample2**では、method内で`arrayInMethod`に新しく生成した配列である`nums`を入れています。
この操作により、メソッド内の`arrayInMethod`の参照先が`array`から`nums`にかわっています。
もともと、`arrayInMethod`には`array`の参照先のコピーが入っていましたが、`nums`の参照先のコピーが入るようになっただけなので、`array`には影響を与えません。

一方、**sample1**では、メソッド内の`arrayInMethod`が参照している先の値を書き換えています。
そのため、呼び出し元の変数の`array`にも影響が出ます。
**追記ここまで**

##まとめ
参照にかかわる部分はとても難しいと感じました。特にJavaをやり始めた段階、Javaが初めて勉強する言語の場合、にはなかなか理解するのが難しいなと。

今度は「参照型」についてまとめたいと思います。(一番初めに書けばよかったですね。。。)
Unity オブジェクトの画像（Sprite)を動的に変更する方法




**SpriteRendererのspriteを外部設定可能にし、またspriteの変更処理を書く**

```c#

public class Player : MonoBehaviour {
    SpriteRenderer MainSpriteRenderer;
    // publicで宣言し、inspectorで設定可能にする
	public Sprite StandbySprite;
	public Sprite HoldSprite;
	public Sprite SlashSprite;

	void Start ()
	{
       // このobjectのSpriteRendererを取得
		MainSpriteRenderer = gameObject.GetComponent<SpriteRenderer>();
	}

	// 何かしらのタイミングで呼ばれる
	void ChangeStateToHold()
	{
       // SpriteRenderのspriteを設定済みの他のspriteに変更
       // 例) HoldSpriteに変更
		MainSpriteRenderer.sprite = HoldSprite;
	}
}

```

**inspectorで、変更したいscriptを設定**

![スクリーンショット 2014-06-08 22.45.39.png](https://qiita-image-store.s3.amazonaws.com/0/19638/94851e87-4970-89c8-87e6-d4566e70dd9e.png "スクリーンショット 2014-06-08 22.45.39.png")
ソフトウェア開発で参考になりそうな資料まとめ

いろいろ書いてますが、筆者は開発現場で働いたことがないので知識として知っていることです。
間違い・不足点がありましたらお知らせください。

上流工程
=====
要件定義など上流工程で役立つ記事がITproで多く公開されています。

* [開発プロセス](http://itpro.nikkeibp.co.jp/upper/)

要件定義フェーズ
=====
## UMLを使う
UMLはソフトウェアの動作（仕様）をビジュアル化するための記述方法のルールの体系です。
UMLの作成には次のサイトが参考になります。

* [UML超入門 第2章](http://objectclub.jp/technicaldoc/uml/umlintro2)：UMLの種類とそれぞれの書き方を解説しています

### UMLを書くためのツール
UMLを書くには有料ソフトでは[Microsoft Visual Studio](http://www.microsoft.com/japan/visio/)がおすすめです。
数々のシンボルが揃っており、UMLだけでなくネットワーク図なども書けるのでなおさらです。
無料ソフトでは[astah* community](http://astah.change-vision.com/ja/product/astah-community.html)などがあります。

### UML小ネタ
シーケンス図・フローチャート図はJavascriptを利用して書くことができます（驚）

* js-sequence-diagrams: [http://bramp.github.io/js-sequence-diagrams/](http://bramp.github.io/js-sequence-diagrams/)
* flowchart.js: [http://adrai.github.io/flowchart.js/](http://adrai.github.io/flowchart.js/)

[Stackedit](https://stackedit.io/)の[ベータ版](https://stackedit-beta.herokuapp.com/)ではmarkdownの編集画面から同様にして作成できるので試してみては？
 

テストフェーズ
=====
## テストケース作成のアプローチ
テストの種類として、ホワイトボックステストとブラックボックステストがあります。

ホワイトボックステストはテスト実施者が対象コードを把握しているという前提で実施するものです。具体的には条件分岐を網羅するような入力を複数与えたり、メモリ確保の妥当性を検証するような入力を与えたりします。ホワイトボックステストは単体テストなど対象のコードが小さいときに有効な方法です。

ブラックボックステストはテスト実施者が対象コードを把握していない前提で実施するものです。コードを把握しない代わりに仕様書を参照しながらテストケースを設計します。具体的には、同値分割した上で境界値に着目して入力を与えたり（境界値テスト）、ユーザーの使用状況を想定してテストケースをつくったり（ユースケーステスト）します。以下の文書ではもっと具体的に、多くの項目について扱っています。

（※上の説明はこの文書を参考にしています）

* [ソフトウェアテスト見積もりガイドブック](http://www.ipa.go.jp/files/000004206.pdf)


## ソフトウェア品質分析
通常では信頼度成長曲線と呼ばれるグラフを作成します。これはテスト項目の消化数（消化とは当該テストが仕様に従って実行されたことを意味する）とバグの検出数を並べて書くものです。予想値と実際の値の動きを比較してバグの残存状況について分析することができます。基本的にテストが順調に消化でき、バグの検出数が横ばいになったときバグを除去できたと推定できます。しかし、テストの質やバグの検出数の増加曲線によっては一概にそうとはいえない場合があり要注意です。

信頼度成長曲線の分析では次のサイトが参考になります。

* [テスト消化曲線とバグ発生曲線の7パターン診断](http://monoist.atmarkit.co.jp/mn/articles/1002/18/news101.html)
RuboCopの警告をコメントで無効化する方法

# RuboCopの警告をコメントで無効化する方法

## 概要
RuboCopの警告をコメントで無効化する方法
## 詳細
基本的には .rubocop.yml の設定に応じて規約をチェックするが、
一部だけ例外的に警告対象外にしたいケースがあると思います。

例えば通常の処理は1行80文字でチェックしたいが、
長文のリテラルを定数化する場合など、どうしても80文字を超えてしまうような
場合だけ警告対象外にしたい、など。
## 指定範囲の全ての警告を無効化したい場合
~~~ruby
# rubocop:disable all
[...]
# rubocop:enable all
~~~
## 指定範囲の特定の警告を無効化したい場合
Style/LineLength, Style/StringLiteralsの部分は無効化する警告です。

~~~ruby
# rubocop:disable Style/LineLength, Style/StringLiterals
[...]
# rubocop:enable Style/LineLength, Style/StringLiterals
~~~

## 単一行の全ての警告を無効化したい場合
~~~ruby
for x in (0..19) # rubocop:disable all
~~~
## 単一行の特定の警告を無効化したい場合
Style/AvoidForの部分は無効化する警告です。

~~~ruby
for x in (0..19) # rubocop:disable Style/AvoidFor
~~~
## サンプル コメント無効化前
~~~ruby
# Hoge
class Hoge
  def A
    b=1+2
    c=2*3
    d=3/4
    "hoge"
  end
end
~~~

rubocop実行

~~~bash
Inspecting 1 file
W

Offenses:

before.rb:3:7: C: Use snake_case for methods.
  def A
      ^
before.rb:4:5: W: Useless assignment to variable - a.
    a=1+2
    ^
before.rb:4:6: C: Surrounding space missing for operator '='.
    a=1+2
     ^
before.rb:4:8: C: Surrounding space missing for operator '+'.
    a=1+2
       ^
before.rb:5:5: W: Useless assignment to variable - b.
    b=1-2
    ^
before.rb:5:6: C: Surrounding space missing for operator '='.
    b=1-2
     ^
before.rb:5:8: C: Surrounding space missing for operator '-'.
    b=1-2
       ^
before.rb:6:5: W: Useless assignment to variable - c.
    c=2*3
    ^
before.rb:6:6: C: Surrounding space missing for operator '='.
    c=2*3
     ^
before.rb:6:8: C: Surrounding space missing for operator '*'.
    c=2*3
       ^
before.rb:7:5: W: Useless assignment to variable - d.
    d=3/4
    ^
before.rb:7:6: C: Surrounding space missing for operator '='.
    d=3/4
     ^
before.rb:7:8: C: Surrounding space missing for operator '/'.
    d=3/4
       ^
before.rb:8:5: C: Prefer single-quoted strings when you don't need string interpolation or special symbols.
    "hoge"
    ^^^^^^

1 file inspected, 14 offenses detected
~~~

## サンプル コメント無効化後
下記の設定を加えました。

* Aメソッドの1行警告コメント無視
* a=1+2,b=1-2 の範囲の「SpaceAroundOperators」警告のみ無効化しました
* c=2*3,d=3/4 の範囲のすべての警告を無効化しました

※"hoge"の行は全ての警告が有効です

この設定により、1+2,b=1-2 の範囲の「SpaceAroundOperators」以外の警告と
"hoge"の行の警告のみが出力されることを確認します。

~~~ruby
# Hoge
class Hoge
  def A # rubocop:disable MethodName
    # rubocop:disable SpaceAroundOperators
    a=1+2
    b=1-2
    # rubocop:enable SpaceAroundOperators
    # rubocop:disable all
    c=2*3
    d=3/4
    # rubocop:enable all
    "hoge"
  end
end
~~~

rubocop実行

~~~bash
Inspecting 1 file
W

Offenses:

after.rb:5:5: W: Useless assignment to variable - a.
    a=1+2
    ^
after.rb:6:5: W: Useless assignment to variable - b.
    b=1-2
    ^
after.rb:12:5: C: Prefer single-quoted strings when you don't need string interpolation or special symbols.
    "hoge"
    ^^^^^^

1 file inspected, 3 offenses detected
~~~
Xamarin.Forms は Windows.Forms じゃないよ


* [iOS／Androidの画面レイアウトを共通化するには？（Xamarin.Forms） - Build Insider](http://www.buildinsider.net/mobile/xamarintips/0005)

に書ききれなかったことなど。

## 名前どうよ？

**Xamarin.Forms** って名前、どうしても Windows.Forms を連想するけど全然別ものだから。とはいえ、あんまり WPF の経験がないので、Windows.Forms にそれほどイヤな印象がない。VB6時代なんて、画面に Fill するのすらゴリゴリ実装が必要だったし。

## 前身は MonoTouch.Dialog じゃないかと思います

MonoTouch.Dialog というのは、Xamarin の CTO でありスーパーハッカーのミゲル氏が開発した、簡単なコードで iOS の UI を実装できるライブラリ（「Dialog」だけど、「ダイアログボックス」とは関係ない。 ）

* [migueldeicaza/MonoTouch.Dialog](https://github.com/migueldeicaza/MonoTouch.Dialog)

たぶんだけど、Xamarin.Forms はこれの思想がベースにあって、他のプラットフォームやXAML対応が行われたんじゃないかと勝手に思ってます。（いつか紹介しようと思ってたけどこれでお役御免になってしまったかも）

## Android の UIフレームワークに似てるような…

[StackLayout](http://developer.xamarin.com/guides/cross-platform/xamarin-forms/controls/layouts/) は LinearLayout相当、RelativeLayout も、同名クラスがあるし、割と Android の UI の考え方をベースにしてるのかなと予想。Windows Phone はあまり経験がないので知らない。。。

## Hoge.iOS というプロジェクト名がキライ

プラットフォームの識別子をプロジェクト名につけるのが良いんだけど、 ``HelloForms.iOS`` とか「iOS」とつけるのが嫌い。名前空間名とかが小文字で始まってしまうのが気持ち悪くて。
MvvmCross などでは、iOS は ``XXX.Touch`` 、Android は ``XXX.Droid`` としていて、こっちの方が好み。

## XAML はデザイナーが無いとツラい

WPFじゃなくてもXAMLって言っていいんだ、というのを初めて知ったｗ
Xamarin Studio のXMLデザイナーは補完も効かないしツラい。コードでUI作るのにも限界があるので、今年の [Evolve](https://evolve.xamarin.com/) あたりで「Xamarin.Forms のUIデザイナー発表ばばーん！！」を期待してます。

## タブの位置が上とか下とかどうでもいい

「UIはプラットフォームの流儀に合わせるべき」という説明に必ずと言っていいほど登場するのがタブバーの位置が Androidだと上で、iOSだと下、ってやつ。
個人的にはどうでもいい。タブの切り替えをよく使うなら指の届きやすい画面下部に配置すべきだし、同じアプリならiOS版とAndroid版でUIを変えるべきでないと思っている。（かと言って、iOS版のUIをそっくりそのままAndroidに移植すればいいという話でもない）。 **プロダクトのUXは、プラットフォームのUXより優先されるべき** 、と思ってる。

## 上司への提案には好材料かと

私「iOS/Android 両方開発するなら Xamarin 使いましょう！」
上「そうか、それは１ソースで両対応できるのか？」
私「いえ、画面はプラットフォーム毎に書きます、カメラとかも別です。共通化できるのはコアロジックです。」
上「なんだその程度か」
私「…」

というよくある話には、「画面が１ソースで共通にできる Xamarin.Forms」は、説得材料としては、とりわけ対PhoneGapには効果高いんじゃないかと思います。毒りんごかどうかはともかく。。。
日本語でpythonを書いてみた

今さら日本語の変数名などが使えるようになっていることに気づいたので、どこまで日本語で書けるか試してみました。

```python3
# -*- coding: utf-8 -*-
from おまじない import *


# 販売商品を作る
価格表 = 辞書()
価格表["りんご"] = 100
価格表["みかん"] = 50
価格表["メロン"] = 200

購入履歴 = リスト()

# 購入履歴を適当に作る
for 回数 in 連番リスト(10):
    商品名リスト = 価格表.全部の名前をゲット()
    商品名番号 = ランダムの数をゲット(0, 長さ(商品名リスト) - 1)
    購入履歴.くっつける(リスト(商品名リスト)[商品名番号])

表示("=====購入履歴=====")
for 回数, 購入品 in 数えあげる(購入履歴):
    表示("%d回目:%s" % (回数 + 1, 購入品))

# 支払合計を計算
支払合計 = 0
for 購入品 in 購入履歴:
    支払合計 += 価格表[購入品]
表示("=====支払合計=====")
表示(支払合計)
```

# 出力
```text
=====購入履歴=====
1回目:みかん
2回目:メロン
3回目:りんご
4回目:メロン
5回目:メロン
6回目:みかん
7回目:みかん
8回目:みかん
9回目:みかん
10回目:メロン
=====支払合計=====
1150
```

# おまじない.py
日本語でプログラム書くためのおまじない

```python3:おまじない.py
# -*- coding: utf-8 -*-
import builtins
import random

_builtin_list = builtins.list
_builtin_dict = builtins.dict


# リスト置き換え用クラス定義
class リスト(_builtin_list):
    くっつける = _builtin_list.append
    リストをくっつける = _builtin_list.extend
    いれる = _builtin_list.insert
    消す = けす = _builtin_list.remove
    取り出す = とりだす = _builtin_list.pop
    全部消す = ぜんぶけす = _builtin_list.clear
    探す = さがす = _builtin_list.index
    数える = かぞえる = _builtin_list.count
    並べる = ならべる = _builtin_list.sort
    逆さに並べる = さかさにならべる = _builtin_list.reverse
    コピー = _builtin_list.copy


# 辞書置き換え用クラス定義
class じしょ(_builtin_dict):
    全部の名前と内容をゲット = ぜんぶのなまえとないようをゲット = _builtin_dict.items
    全部の名前をゲット = ぜんぶのなまえをゲット = _builtin_dict.keys
    全部の内容をゲット = ぜんぶのないようをゲット = _builtin_dict.values

    全部消す = ぜんぶけす = _builtin_dict.clear
    コピー = _builtin_dict.copy
    ゲット = _builtin_dict.get
    取り出す = とりだす = _builtin_dict.pop
    名前と内容を飛び出す = なまえとないようをとりだす = _builtin_dict.popitem
    組み込む = くみこむ = _builtin_dict.setdefault
    合体する = がったいする = _builtin_dict.update


# 組込み関数別名定義
表示 = ひょうじ = print
長さ = ながさ = len
ランダムの数をゲット = ランダムのかずをゲット = random.randint
ランダムの少数をゲット = ランダムのしょうすうをゲット = random.random
連番リスト = れんばんリスト = range
数えあげる = かぞえあげる = enumerate

辞書 = じしょ

# 組込オブジェクト置き換え
builtins.list = リスト
builtins.dict = じしょ


def __test():
    # 問題点の検証コード
    data_list = list()
    data_リスト = リスト()
    data_内包表記リスト = []

    print(["data_list", type(data_list)])
    print(["data_リスト", type(data_リスト)])
    print(["data_内包表記リスト", type(data_内包表記リスト)])
    """
    出力
    ['data_list', <class '__main__.リスト'>]
    ['data_リスト', <class '__main__.リスト'>]
    ['data_内包表記リスト', <class 'list'>]

    内包表記のリストが置き換えられない問題があるのが残念
    """


if __name__ == "__main__":
    __test()

```

`__test()`で試している通り内包表記のListやDictクラスが置き換えられないようなのが残念です。
iOSのOS登録情報を使って認証なしでFacebook・Twitterでシェアする（LINEも追加）

メモ

事前に`Project>TARGET>Build Phases>Link Binaly With Libraries`で、`Social.framework`を追加しておく。

↑LINEだけなら必要ないです。

```objc:Social.h
#import <Foundation/Foundation.h>

@interface Social : NSObject
+(void)facebookShare:(UIViewController *)vc;
+(void)twitterShare:(UIViewController *)vc;
+(void)lineShare:(UIViewController *)vc;
@end
```

```objc:Social.m
#import "Social.h"
#import <Social/Social.h>

@implementation Social

+(void)facebookShare:(UIViewController *)vc
{
    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
        SLComposeViewController *composeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
        void (^completion) (SLComposeViewControllerResult result) = ^(SLComposeViewControllerResult result) {
            [composeViewController dismissViewControllerAnimated:YES completion:nil];
        };
        [composeViewController setCompletionHandler:completion];
        [composeViewController setInitialText:@"テスト"];
        [composeViewController addURL:[NSURL URLWithString:@"http://google.com"]];
        [vc presentViewController:composeViewController animated:YES completion:Nil];
    }
}


+(void)twitterShare:(UIViewController *)vc
{
    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) {
        SLComposeViewController *composeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
        void (^completion) (SLComposeViewControllerResult result) = ^(SLComposeViewControllerResult result) {
            [composeViewController dismissViewControllerAnimated:YES completion:nil];
        };
        [composeViewController setCompletionHandler:completion];
        [composeViewController setInitialText:@"テスト"];
        [composeViewController addURL:[NSURL URLWithString:@"http://google.com"]];
        [vc presentViewController:composeViewController animated:YES completion:Nil];
    }
}

+(void)lineShare:(UIViewController *)vc {
    NSString *plainString = @"テスト";
    NSString *contentKey = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)plainString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );
    NSString *contentType = @"text";
    NSString *urlString = [NSString stringWithFormat: @"http://line.naver.jp/R/msg/%@/?%@", contentType, contentKey];
    NSURL *url = [NSURL URLWithString:urlString];
    [[UIApplication sharedApplication] openURL:url];
}

@end
```

呼び出し時

```objc:SampleViewController.m
#import "Social.h"
・・・
[Social facebookShare:self];
or
[Social twitterShare:self];
or
[Social lineShare:self];
```
[決定版]Cygwin(64bit)でBerkshelf v3をインストールする方法

超絶に難易度が高くて有名なCygwin環境での Berkshelfのインストールについて、ついにうまく行く方法を発見したのでまとめます。

下記手順に従えば Berkshelf ver 3インストールすることができます。
(2014/6/8現在、v3.1.3が入ります)

# 環境
Cygwin 64bit
(Windows7でやりましたがWindows8でもたぶんいけると思います)

# 必要となる前提
* rbenv , ruby 2.1系
* apt-cyg

をインストールしておいてください。

http://dqn.sakusakutto.jp/2013/12/cygwin_rbenv_ruby-build_ruby.html
http://dqn.sakusakutto.jp/2013/12/64bit_cygwin_apt-cyg.html

# Berkshelfのインストールはなぜ難しいのか？
依存しているgemモジュールの中で、インストールが難しいものがあるからです。
* ffi
* dep-selector-libgecode

逆に言うとこの２つさえインストールできればよいわけです。

# berkshelf をインストールする方法
さてインストールしてみましょう！

## ffi をインストールする
https://github.com/ffi/ffi/issues/284#issuecomment-33752957
上記のRSmirnovさんのコメント通りにやればいけます。

```
apt-cyg install libffi6 libffi-devel pkg-config
export PKG_CONFIG_PATH="/lib/pkgconfig"
gem install ffi
```

## dep-selector-libgecode をインストールする
http://qiita.com/yositani2002/items/6e9b765452676a40a2ef
上記の記事どおりにやればいけます。
簡単にまとめると下記のようになります。

```shell-session

# gcc48.exe, g++48.exeという名前のシムリンクを作成
ln -s gcc.exe /usr/bin/gcc48.exe
ln -s g++.exe /usr/bin/g++48.exe

# gecode 3.7.3 を取得して解凍
wget "http://pkgs.fedoraproject.org/repo/pkgs/gecode/gecode-3.7.3.tar.gz/7a5cb9945e0bb48f222992f2106130ac/gecode-3.7.3.tar.gz"
tar xvfz gecode-3.7.3.tar.gz
cd gecode-3.7.3

# コンパイル
./configure CC="gcc48"  --disable-doc-dot --disable-doc-search --disable-doc-tagfile --disable-doc-chm --disable-doc-docset --disable-qt --disable-examples --disable-flatzinc
make
make install
# ライブラリを手動で配置
cp libgecode* /lib/
cp -r gecode/* /usr/include/
```

## berkshelfをインストール

```
USE_SYSTEM_GECODE=1 gem install berkshelf
```

## インストールできたか確認
```shell-session
$ berks --version
DL is deprecated, please use Fiddle
3.1.3
```

うまく行きましたか？

先人の偉業に深く感謝です。
EventMachineを使ってpopen3で開いたプロセスの出力を受け取る



    #!/usr/bin/env ruby
    # coding: utf-8

    require 'open3'
    require 'eventmachine'

    # 受信用のクラス
    class Recver < EventMachine::Connection
      # 初期化時に指定された引数を受け取る
      def initialize(arr)
        @arr = arr
      end

      # popen3したプロセスからの出力を受信
      def receive_data(data)
        res = data.scan(/^(\d+) bytes from (\S+?): icmp_seq=(\d+) ttl=(\d+) time=([\d\.]+) ms$/)
        res.each do |r|
          @arr.push(r[4].to_f)
        end
      end
    end

    arr = []
    EM.run do
      # popen3のイベントとは別にタイマーを設定
      EM.add_periodic_timer(5) do
        # 5秒毎に出力結果をまとめたArrayを表示してからクリア
        p arr
        arr.clear
      end

      stdin, stdout, stderr = Open3.popen3("ping 8.8.8.8")
      stdout.sync = true
      # attach時に引数を指定する
      EM.attach(stdout, Recver, arr)
    end
Layoutを継承するには

http://merrill777.blog135.fc2.com/page-3.html へ辿り着いた。

ネストされた layout、サブテンプレートなどの言葉で呼ばれるらしい。


```erb
<% content_for :stylesheets do %>
　#top_menu {display: none}
　#right_menu {float: right; background-color: yellow; color: black}
<% end %>
<% content_for :content do %>
　<div id="right_menu">Right menu items here</div>
　<%= content_for?(:news_content) ? yield(:news_content) : yield %>
<% end %>
<%= render :template => 'layouts/application' %>
```
DatePickerDialogで日付の選択範囲を指定


DatePickerDialogで日付の選択可能な範囲を指定する方法。
Webにもあまり情報がなかったので、メモ。



```Java:

// 現在の日付を取得
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

DatePickerDialog dlgDatePicker = new DatePickerDialog(this, year, month, day);

```


今回は、2014/1/1 〜 2020/12/31に設定。


```Java:
// 最大値
// 月は0が1月となる。
GregorianCalendar maxDate = new GregorianCalendar();
maxDate.set(2020, 11, 31);

// 最小値
GregorianCalendar minDate = new GregorianCalendar();
minDate.set(2014, 0, 1);

DatePicker datePicker = dlgDatePicker.getDataPicker();
if (datePicker != null) {
	datePicker.setMaxDate(maxDate.getTimeInMillis());
	datePicker.setMinDate(minDate.getTimeInMillis());
}

```

設定する値はlong型なっている。
この値は1970年1月1日からの経過時間（単位：ミリ秒）となっているので注意。
EclipseとVisual Studioで私がよく使うコマンドのまとめ


EclipseとVisual Studioで私がよく使うコマンドをまとめています

||Eclipse|Visual Studio|
|---|---|---|
|新規|Alt+Shift+N|Alt+P|
|検索と置換はいつか|
|補完|Ctrl+Space|Ctrl+Space|
|パラメータヒント|Ctrl+Shift+Space|Ctrl+K, P|
|クイックフィックス|Ctrl+1|
|スマートタグ||Alt+Shift+F10|
|コメント|Ctrl+/|Ctrl+E, C|
|コメントを解除|Ctrl+/|Ctrl+E, U|
|フォーマット|Ctrl+Shift+F|Ctrl+E, D|
|import, usingの整理|Ctrl+Shift+O|Alt+E, I, O, A|
|名前の変更|Alt+Shift+R|Ctrl+R, R|
|宣言を開く|F3|F12|
|呼び出し階層を開く|Ctrl+Alt+H|Ctrl+K, R|
|リソースを開く|Ctrl+Shift+R|
|クイックアウトライン|Ctrl+O|
|次へ|Ctrl+.|F8|
|前へ|Ctrl+,|Shift+F8|
|戻る|Alt+Left|Ctrl+-|
|進む|Alt+Right|Ctrl+Shift+-|
|実行|Ctrl+F11|Ctrl+F5|

## 補足

### 補完、パラメータヒント
ADT BundleのEclipseは、`Ctrl+Space`をすると、カーソルの直前が単語境界文字だと補完し、
非単語境界文字だとパラメータヒントを表示するので賢い
他のEclipseではそうならないのだけれど何のプラグインのおかげだろう？

### スマートタグ - Visual Studio
- カーソルが継承したインターフェース名や抽象クラス名の上にあるときに  
`Alt+Shift+F10`するとスタブを生成してくれる
- 例えば、ファイル先頭に`using System;`がなく、カーソルがクラス文字列である`Console`の上にあるときに  
`Alt+Shift+F10`するとファイル先頭に`using System;`を挿入してくれる

Eclipseの方が両方`Ctrl+Space`で可能なうえ、クラス文字列が完全一致している必要がなくて便利

### フォーマット、import, usingの整理
Eclipseは保存すると、フォーマットとimportの整理をしてから保存するような設定ができるが、
Visual StudioはExpress(無償版)ではできない模様

### 呼び出し階層を開く
変数のすべての参照箇所や関数のすべての呼び出し箇所を列挙して順番に見ていきたいときに使う
それができる`Ctrl+K, R`を上記の表に載せている

### リソースを開く
プロジェクト内のすべてのファイルの中からファイルを開きたいときに使う
プロジェクトの設定を適切にしたSublime Textの`Goto Anything Ctrl+P`が挙動としては理想

### 次へ、前へ、戻る、進むの違い
- 検索結果の一覧やエラーの一覧などのカーソルの移動先の一覧を巡回するのが次へ、前へ
- 検索、宣言を開く、クイックアウトライン、次へ、前へなどによるカーソル移動の履歴を巡回するのが戻る、進む

次へと戻るがよく使うのでVisual Studioの割り当てが好み
EmacsでTextExpanderが動かない？


[TextExpander](http://smilesoftware.com/TextExpander/index.html )が便利と薦められて導入。

でもEmacsでうまく展開されない。

こんな記事を発見
http://dreadedmonkeygod.net/home/archive/2584

なるほど、TextExpanderは`Command+v`でペーストするようですね
で、MacのEmacsでは`Command+v`はスクロールになってしまうと。

というわけで、`Command+v`をyankにして、
scroll-downは`Option-v`としました。


	(define-key global-map [(super ?v)] 'scroll-down)
	(define-key global-map [(meta ?v)] 'yank)


解決・・なのか
オブジェクトのプロパティを指定する[]と.の違い


普段何気なく使っている、`[]`と`.`。
個人的には ***ラクだしなんかカッコいい*** という理由で`.`しか使っていないが、
`[]`が活躍するシーンがあったのでメモ。

# []の使いドコロ

## 文字列からプロパティを指定したいとき

以下に例。

```Javascript
var hoge = { hoge1:'Yes!' }; //オブジェクト作成
var p = 'hoge1';
hoge[p]; //'Yes'
hoge.p; //undefined
```

これを見ると、
hoge[p]の場合は、pに格納された文字列'hoge1'はhogeのプロパティとして機能するが、
hoge.pの場合は機能しない。
hoge.pの場合は、hogeオブジェクトの「p」というプロパティ名を指定することになってしまいます。

このように、
***文字列を利用してプロパティの指定をしたいときは[]***
を使わなければなりません。
***動的に変数に文字列が格納されて、それをプロパティ名として用いたい時***
などに使用する。
objective-cでfloat値のゲーム・ランキングのロジックを作る

苦戦したので、メモがてら残します。
もっといい方法があると思いますが。。。

**得点など（float値）の保存**

値を格納するarrayに初期値を登録する。
これをやらないと、呼び出すときにエラーになる模様。

```lang:objective-c
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
NSArray *testArray=[NSArray array];
[defaults setObject:testArray forKey:@"RECORDS"];
[ud registerDefaults:defaults];
```

**今回の得点などを追加する**

NSUserDefaultsにはNSMutableArrayは保存できないようなので
保存するのはあくまでNSArray。

ゲーム終了時に今回の得点などをarrayに追加して再保存するのですが
そのために一旦mutableCopyする必要があります。

```lang:objective-c
NSArray *recordArray =[ud objectForKey:@"RECORDS"];
NSMutableArray *mutableRecordArray= [[NSMutableArray alloc]init];
        
mutableRecordArray = [recordArray mutableCopy];
[mutableRecordArray addObject:[NSNumber numberWithFloat:score]];
//scoreは今回の結果
        
recordArray=[mutableRecordArray copy];
//NSArrayに戻して再保存
[ud setObject:recordArray forKey:@"RECORDS"];

```
**最高記録のランキングを表示する**
保存してあるarrayを取り出してソートします。
float値のソート方法は[こちら](http://stackoverflow.com/questions/7610379/how-to-sort-an-nsarray-of-float-values)で教えてもらいました。

[こちら](http://technical-iphone.blogspot.jp/2013/03/nsarray.html)を参考に
intをfloatに換えて

```lang:objective-c
NSArray *sorted_array = [recordArray sortedArrayUsingComparator:^NSComparisonResult(NSNumber *a, NSNumber *b) {
  return b.floatValue - a.floatValue; // ソート
 }]; //ダメな例
```
とかも試してみたんですが、何故かダメでした。
（数値が５つぐらいになるとランキングが前後する）

ちなみに今回の値を表示させたい場合はソートする前のarrayの
最後の値を取ってくればいいのでlastObjectメソッドが使えます。

```lang:objective-c
NSArray *recordArray=[ud objectForKey:@"RECORDS"];
//float score =[[recordArray lastObject]floatValue];
NSArray *sorted_array =[recordArray sortedArrayUsingSelector:@selector(compare:)];
```

あとはsorted_arrayから順番に取り出せば
ランキングが作成できます。
MariaDB10でsysbenchを使う

DB: MariaDB 10.0.11
OS: Ubuntu 14.04
マシン: thinkpad t440p

##sysbenchのブランチを取得してコンパイル
```
bzr branch lp:sysbench
```
configure.acの編集
AC_PROG_LIBTOOLをコメントアウト
AC_PROG_RANLIBを追加

```
./autogen.sh
./configure --prefix=PATH --without-drizzle --with-mysql-includes=/PATH/mariadb/include/mysql --with-mysql-libs=/PATH/mariadb/lib
make
make install
```
mysql-includesとmysql-libsにはmariadbをインストールしたディレクトリのincludeとlibディレクトリを指定
共有ライブラリの位置を環境変数に追加
```
export LD_LIBRARY_PATH=/PATH/mariadb/lib
```

##テストデータ準備
testで指定するスクリプトはsysbenchブランチの中にluaスクリプトがいくつか用意されているのでそれを使用
table-sizeはレコード数
```
sysbench --test=/branch_sysbench_path/sysbench/tests/db/oltp.lua --db-driver=mysql --oltp-table-size=100000 --mysql-user=user_name --mysql-password=user_pass --mysql-host=127.0.0.1 --mysql-db=test_db_name --mysql-table-engine=innodb prepare
```

##実行
スレッド数4,innodb_buffer_pool_sizeを4Gで実行
```
./bin/sysbench --test=/branch_sysbench_path/sysbench/tests/db/oltp.lua --db-driver=mysql --oltp-table-size=100000 --mysql-user=user_name --mysql-password=user_pass --mysql-host=127.0.0.1 --mysql-db=test_db_name --mysql-table-engine=innodb --num-threads=4 --max-requests=100000 --max-time=300 --oltp-test-mode=simple run
```
結果

```
sysbench 0.5:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 4
Random number generator seed is 0 and will be ignored


Threads started!

OLTP test statistics:
    queries performed:
        read:                            655326
        write:                           187236
        other:                           93618
        total:                           936180
    transactions:                        46809  (156.02 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 842562 (2808.36 per sec.)
    other operations:                    93618  (312.04 per sec.)

General statistics:
    total time:                          300.0197s
    total number of events:              46809
    total time taken by event execution: 1199.9333s
    response time:
         min:                                  9.63ms
         avg:                                 25.63ms
         max:                                292.34ms
         approx.  95 percentile:              36.49ms

Threads fairness:
    events (avg/stddev):           11702.2500/10.94
    execution time (avg/stddev):   299.9833/0.00
```
[FuelPHP]開発環境によってSSLの適用を変更する


今回は、
http://qiita.com/maximum80/items/5f262cda259036e79346

を活用して、
「本番環境ではSSLを適用したいけど、開発環境（ローカル）では、SSLは対応させたくない！」という事例を実際に対応してみたいと思います。

#1.uri.phpの設定

SSLの判別にはUriクラスを活用しています。

http://fuelphp.jp/docs/1.7/classes/uri.html#/method_create

上記を参照してみてください。

```
$ mkdir fuel/app/classes/extension/
$ vim fuel/app/classes/extension/uri.php
```
で、uri.phpを作成します。
中身は

```uri.php
<?php

class Uri extends Fuel\Core\Uri
{
        public static function generate($uri = null, $variables = array(), $get_variables = array(), $secure = null)
        {
                //開発環境（ローカル）の場合はhttps通信をOFFにする
                $secure = Config::load('secure');
                $secure = $secure['validation'];

                return \Uri::create($language.$uri, $variables, $get_variables, $secure);
        }
}
```

的な感じで、config内のsecure.phpを読み込むように設定します。
この場合、secure内の'validation'の値を返すようにしています。
（Trueならhttps、Falseならhttpになる）

#2.secure.phpの設定

```
$ cd fuel/app/config
$ vim secure.php
```
で、secure.phpを作成

```secure.php
<?php

return array (
        'validation' => True
);
```
てな感じで、基本的にはTrueを返すようにする。

次に、

```
$ cp secure.php /development
```
で、コピー。develop内のsecure.phpを

```secure.php
<?php

return array (
        'validation' => False
);
```

で保存。

これで開発環境では$secureがFalse
それ以外では$secureがTrue

という設定が完了。

#3. viewファイルの設定

それぞれのviewファイルでの読み込みを

```
<a href="<?php echo Uri::generate("contact", array(), array(), null); ?>
```

といった具合の書き方をします。
[FuelPHP]開発環境による設定変更を活用する


前回、.gitignoreを使った設定ファイルの変更を無視するやり方を書きました
（http://qiita.com/maximum80/items/21d400b4ba3463cd9a87）

が、調べてみたところ、FuelPHPでは、開発環境によって読み込む設定ファイルを変更する事が出来るので、そのやり方を。

```
$ vim fuel/app/bootstrap.php
```

でbootstrap.phpをみると

```bootstrap.php
/**
 * Your environment.  Can be set to any of the following:
 *
 * Fuel::DEVELOPMENT
 * Fuel::TEST
 * Fuel::STAGING
 * Fuel::PRODUCTION
 */
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

// Initialize the framework with the config file.
Fuel::init('config.php');
```

と書かれています。
これは、それぞれの開発環境によって変更が必要なファイルを指示してくれれば、
'FUEL_ENV'で指定された環境のconfigファイルを読みますよ。
という事。

また、configのディレクトリをみると

```
$ ls fuel/app/config
db.php config.php /development /test /staging /production
```

というような構成になっているのがわかります。

例えば、

「開発環境のときはデフォルトのエンコードをutf-8からshift-JISにしたい！」
という時は、

①config直下のconfig.php →　設定をutf-8に
②development内にconfig.phpをコピー　→　設置をshift-JISに

という形にしておけば、それぞれの環境で別の対応をする事が可能です。

詳しいリファレンスはこちらをご覧ください。
http://press.nekoget.com/fuelphp_doc/general/environments.html
#dockercon14 注目発表まとめ

（追記）資料へのリンク見つかる限りは追加した

いよいよ明日ですね、[DockerCon](http://dockercon/)。

dockercon の発表 http://www.dockercon.com/talks.html で気になるやつを集めてみた
資料アップされてから探すときに忘れないようの自分メモ。

* Be a Happier Developer with Docker: Tricks of the Trade
Nicola Paolucci, Developer Advocate at Atlassian
  * この人 http://japan.blogs.atlassian.com/2013/12/deploy-java-apps-with-docker-awesome/ の発表。多分似たような内容。
  * http://japan.blogs.atlassian.com/2014/06/docker-automated-builds-bitbucket/
* Tupperware: Containerized Deployment at Facebook
Aravind Narayanan, Facebook

 * まず Tupperwareって名前がおもしろい、facebookで使っているデプロイツールとサービス管理ツールの説明。
Docker じゃなくてLXCだが。
  * (Facebook Tupperwareで検索するとアムウェイが大量に引っかかる）

* Performance Characteristics of Traditional VMs vs Docker Containers
Boden Russell, Advanced Cloud Solutions at IBM

  * VMとDockerのパフォーマンスの特徴の話。IBMらしい。
  * http://bodenr.blogspot.jp/2014/05/kvm-and-docker-lxc-benchmarking-with.html


* High-Speed Shipping Lanes: How Containers are
Revolutionizing Distributed Computing at Scale
Benjamin Hindman, Engineering at Twitter & Co-Creator of
Apache Mesos Company

  * DockerとMeosの話。 "this presentation will show you how easy it is to deliver web-
scale, fault-tolerant, easy to deploy applications and services"とのこと。
Apache MeosとDockerの組み合わせはeBayの人も発表するぽい。


* NetDevOps: Empowering the Next Generation of Dockers
John Deatherage, Automation Architect at Juniper Networks
... or “How your Network and Security teams learned to
stop worrying, and love containers.” 

  * タイトルがおもしろいので。。。


* Cloud Native NetflixOSS Services on Docker
Andrew Spyker, STSM, Cloud Performance Architect and Strategist
at IBM & Sudhir Tonse, Senior Engineering Leader at Netflix

  * Netfilixでやってるfault toleranceとfailure/recoveryの話。
Acme Airというソフトを紹介。
  * http://www.slideshare.net/aspyker/ibm-cloud-nativenetflixossfinal

* Test What You Write - Ship What You Test
Seth Lochen, Sr. Manager, Release and Production Tools at
Groupon

  * テストの話、手元では動くけどCI、ステージングでは動いてたけどproductionで落ちる、これを解決するためにdockerを使った。デリパリーパイプラインでのdocker。

* SELinux and Docker
  * http://people.fedoraproject.org/~dwalsh/SELinux/Presentations/DockerSecurity/

* Evolution of a Docker PAAS
Gabriel Monroy, CTO at Deis

  * Docker PaaSのDenisの紹介。
  * http://gabrtv.github.io/deis-dockercon-2014/#/

* Contributing to Docker
Andrew “Tianon” Page, VP of Development at Infosiftr

  * Docker へのコントリビューションの仕方。あまり聞かないので気になる。

* Automated Chef Cookbook Testing with Drone.IO
and Github
Paul Czarkowski, System Engineer at Rackspace

  * chef cookbookのテストにDroneIOを使っている話。
  * http://www.slideshare.net/pczarkowski/dockercon-building-a-chef-cookbook-testing-pipeline-with-droneio-and-docker

* AWS Elastic Beanstalk and Docker
  * http://www.slideshare.net/EvanBrown4/aws-elastic-beanstalk-and-docker-dockercon-2014

-- 
発表じゃないけど探してて見つけたやつ。

* この人が今流行りの言葉で言うとtsudaるみたいなことしてる http://scribes.tweetscriber.com/RealGeneKim/330
* Dockerの本、pre-order http://www.dockerbook.com/
* http://www.youtube.com/watch?v=a_YbxWbHgQA&feature=youtu.be
SwiftでObjective-CのFrameworkを読み込む方法

Objective-Cで作成されたFrameworkを読み込み、Swiftで呼び出す。
サンプルとしてGameFeatSDKを使用。

(1)Bridging-Header.hを作成
----

Objctive-CのFrameworkをimportするため
「GameFeatKit-Bridging-Header.h」
というヘッダーファイルを作成する。
※「GameFeatKit」の部分は任意で変更可能。

(2)Bridging-Header.hを編集
----

```lang:GameFeatKit-Bridging-Header.h
#import <GameFeatKit/GFController.h>
```

(3)Bridging-Header.hを読み込む
----
[Build Settings]の[Objective-C Bridging Header]に
**GameFeatKit-Bridging-Header.h**
を指定する

`$(SRCROOT)/$(PROJECT)/GameFeatKit-Bridging-Header.h`

![スクリーンショット 2014-06-08 17.47.51.png](https://qiita-image-store.s3.amazonaws.com/0/44447/695af2cb-4e8e-70de-6454-5d8566887ec3.png)

=====

■呼び出し方法
----

@Obj-C
`[GFController activateGF:@"メディアID" useCustom:YES useIcon:YES usePopup:YES];`

@Swift
`GFController.activateGF("メディアID", useCustom: true, useIcon: true, usePopup: true);`

このような形で呼び出すことができる。

Delegateに関しても同様に

@Obj-C
`@interface UITestViewController : UIViewController <GFViewDelegate> {`

@Swift
`class UITestViewController: UIViewController, GFViewDelegate {`

@Obj-C
`- (void)didShowGameFeat{
　NSLog(@"didShowGameFeat");
}
- (void)didCloseGameFeat{
　NSLog(@"didCloseGameFeat");
}
- (void)didGetGfAds:(NSArray *)lists {
　NSLog(@"didGetGfAds");
　NSLog(@"%@", lists);
}
- (void)failGetGfAds {
　NSLog(@"failGetGfAds");
}`

@Swift
`func didShowGameFeat(){
　println("didShowGameFeat");
}
func didCloseGameFeat(){
　println("didCloseGameFeat");
}
func didGetGfAds(lists:NSArray){
　for v:NSDictionary! in lists as AnyObject[]{
　　let app:String = v.objectForKey("app") as String;
　　let strTitle:String = v.objectForKey("title") as String;
　　let strUrl:String = v.objectForKey("url") as String;
　　println("\(app) : \(strTitle) \(strUrl)");
　}
}
func failGetGfAds(){
　println("failGetGfAds");
}`

と指定する。
Vagrant + GitHub(Pages) + Bitbucket + Octopress で本格的にblogを作成（その３）

# ようやっと
Octopress で記事を書くより環境を調査する方が楽しくなってきて本末転倒っぽくなってますｗ
[その２](http://qiita.com/murachi1208/items/cdbde599b764267b0b3b) の環境を作ったものの複数の環境から編集＆```deploy```するのがまた少しハマって苦労したので細かい点を残しておいてます。

## 構成
GitHub に Octopress で出力した結果を保存、Bitbucket に記事を[保存](http://qiita.com/murachi1208/items/cdbde599b764267b0b3b)する環境構築済みであること。
位置付けとして、```deploy``` するのは、チームの代表者が行う。他のメンバーは執筆者としての役割なので記事のみ編集とします。
※Jenkinsを使って自動デプロイを行うとかを将来的に考慮したりしてｗ

## deploy だけする人の環境
とにかくマージする、deployするだけと、bitbucket からマージする。確認する。okだったら deployする。これをルーチンワーク化する。
※１人でこれやってると疲れるよねｗ

```
$ git pull bitbucket source 
$ rake generate
$ rake preview
$ git push -u bitbucket source
```

## 記事のみ編集する人の環境
Vagrant の環境に Ruby Setup が構築済みであること。
(1). Octopress Setup

```
$ git clone git://github.com/imathis/octopress.git username.github.io
$ cd username.github.io
$ bundle install
$ rake install
$ rake setup_github_pages
Enter the read/write url for your repository
(For example, 'git@github.com:your_username/your_username.github.io.git)
           or 'https://github.com/your_username/your_username.github.io')
Repository url: 
```

(2). Bitbucket から clone

```
$ cd username.github.io
$ git clone git@bitbucket.org:your_username/your_username.github.io.git
$ git remote add bitbucket git@bitbucket.org:your_username/your_username.github.io.git
```

(3). Bitbucket から pull
初回自動的に生成されるファイルは不要なので移動しておく。細かいとこで CONFLICT が発生した場合は適宜手対応する。

```
$ mv Rakefile Rakefile.old
$ mv _config.yml _config.yml.old
$ mv sass sass.old
$ mv source source.old
$ git pull bitbucket source 
```

(4). ページを編集＆push
色々と編集 ```rake preview``` で確認が終わったら。```git push```する前に変更がないか念のため```pull```を行う癖をつけておく。

```
$ git add -A
$ git commit -m "add post"
$ git pull bitbucket source 
$ git push -u bitbucket source
```

(5). 注意点
この環境から Github に push しちゃった場合、** deploy だけする人の環境 ** の環境で問題が生じます。そんなときは、deploy だけする人の環境で [Octopressでrake deployした際にrejectedされた場合の対処](http://qiita.com/takuma7/items/2d6f6e786eb6c0afbefb) を行うよろし。

(6). 常に
常には、(4)だけのルーチンでok。

# Octopress のカスタマイズ
[Octopressのテーマを変更してみる。](http://blog.yug1224.com/2013/11/07/theme/) さんの記事を参考にしながらBootstrapデザインのテーマを適用してみました。結構簡単にできるのね。

> [octopress-category-list](https://github.com/ctdk/octopress-category-list)
> [Category List Aside](http://kaworu.github.io/octopress/blog/2013/10/03/category-list-aside/)
> [Yug_1224BlogOctopress](http://qiita.com/syui/items/6f15eb97cd7b5fdafaaa)
> [Octopressの初期設定時に気にしておきたい9箇所](http://tantant.jp/blog/Octopress/configuring-octopress/)
> [GitHub Pages + Octopress カスタマイズ vol.2](http://qiita.com/syui/items/6f15eb97cd7b5fdafaaa)




# その４に続く
Jenkinsを使って自動デプロイを行う環境とか考えてみるｗ
縦対応(Portrait)しかしていないアプリでUIWebViewで動画を再生したときに横回転(Landscape)するようにする

ちなみに、今回はUITabBarController>UIWebViewなアプリケーションの場合です。

```objc:AppDelegate.m
// 回転時に呼ばれる
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    NSString *className = NSStringFromClass([window class]);
   
    // ネストしているViewがMPFullscreenWindowやMPInlineVideoFullscreenViewControllerである場合があるので確認する
    if ([((UITabBarController *)window.rootViewController) respondsToSelector:@selector(presentedViewController)]) {
        className = NSStringFromClass([((UITabBarController *)window.rootViewController).presentedViewController class]);
    }
    
    // MP*FullscreenWindowなどがYouTube再生時のViewの名称なので
    // そのときは全部の回転を許可する
    if ([className isEqualToString:@"MPFullscreenWindow"] || [className isEqualToString:@"MPInlineVideoFullscreenViewController"]) {
        return UIInterfaceOrientationMaskAll;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}
```

参考：
http://stackoverflow.com/questions/22095982/how-to-rotate-a-video-embed-in-uiwebview-for-ios-7-only
iOSアプリ開発:配列について

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2014/06/08/ios_dev_array/)のほうで更新します。

変更のない配列を手間少なく用意したい！となる場面は多々あるかと思います。(自分は結構あります)
文字列を入れるならそこまで大変ではありませんが、intやfloatになるとそのままだとエラーとなってしまいます。

```objc:Test.m
NSArray *test = [NSArray arrayWithObjects:@"a", nil];
```

記述について、大分楽な書き方があるのを知りましたので書いておきます。


##1次元配列を用意

####パターン1
そのまま値を入れようとするとエラーとなってしまう為、NSNumberでゴリゴリと入れて大変見にくくなっています。

```objc:Test.m
NSArray *test = [NSArray arrayWithObjects:[NSNumber numberWithInteger:0], [NSNumber numberWithInteger:1], [NSNumber numberWithInteger:2], [NSNumber numberWithInteger:3], nil];
```
####パターン2
なんと、`@`を使う事により、こんな見やすく記述出来ました。

```objc:Test2.m
NSArray *test = @[@0, @1, @2, @3];
```


##1次元配列を用意(変数)
ほぼ直接値を入れる場合と同じです。
が、括弧が無いとパターン2で怒られてしまいます。

####パターン1
こちらもそのまま値を入れようとするとエラーとなってしまう為、NSNumberでゴリゴリと入れて大変見にくくなっています。

```objc:Test.m
int val = 0;
NSArray *test = [NSArray arrayWithObjects:[NSNumber numberWithInteger:val], [NSNumber numberWithInteger:val], [NSNumber numberWithInteger:val], [NSNumber numberWithInteger:val], nil];
```
####パターン2
なんと、こちらも`@`を使う事により、こんな見やすく記述出来ました。
あと、括弧も付けないとエラーが出てしまうので注意。

```objc:Test2.m
int val = 0;
NSArray *test = @[@(val), @(val), @(val), @(val)];
```


##2次元配列を用意

####パターン1
1次元同様、NSNumberでゴリゴリと入れて更に大変見にくくなっています。

```objc:Test.m
NSArray *test = [NSArray arrayWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithInt:0], [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], nil], [NSNumber numberWithInt:10], [NSNumber numberWithInt:20], [NSNumber numberWithInt:30], nil];
```

####パターン2
1次元同様、こんな見やすく記述出来ました。

```objc:Test2.m
NSArray *test = @[@[@0, @1, @2, @3], @10, @20, @30];
```


##配列から値を取得
###パターン1
やや面倒ですね。

```objc:Test.m
int testValue = [[[mPosTbl objectAtIndex:0] objectAtIndex:0] intValue];
```

###パターン2
結構すっきりした記述で出来ます。

```objc:Test2.m
int testValue = [mPosTbl[0][0] intValue];
```


もっと楽に記述出来る！ここ間違ってる！等、何かありましたら教えて頂けると助かります。
【php】destructでのrmdirでフォルダ削除失敗と対策


```php:test.php
<?php

header('Content-type: text/html; charset=UTF-8');

class sample{
 private $name;
 private $a_name;
 
 function __construct($name){
  $this->name = $name;
  $this->a_name = "C:/xampp/htdocs/sample/tmp/".$this->name;//成功
  //$this->a_name = "tmp/".$name;//失敗
 }
 
 function __destruct() {
    if(@rmdir($this->a_name)){
     print("削除成功\n");
    }else{
     print("削除失敗\n");
    }
  }
 
}

$obj = new sample("aa");

?>

```

##環境
OS:windows7 32bit (自作機)
xampp windows版1.74
PHP Version 5.3.5

##解説
htdocs/sample/test.phpとし、htdocs/sample/tmp/にaaフォルダを作成しておく。
この時、destructでフォルダ削除をやってみたが、相対パスだと削除されなかった。
絶対パスに変えるとフォルダ削除ができた。
Fluentdでパラメータの値を分割して次に渡したい時

fluentdで特定のパラメータを分割して別のパラメータにして次に渡すシンプルなプラグイン作りました。

https://github.com/dtaniwaki/fluent-plugin-fork

以下のようなケースに最適。

## input

```rb
{"id": "1", "key": "2", "segments": "1,2,3"}
```

## output

```rb
{"id": "1", "key": "2", "segments": "1"}
{"id": "1", "key": "2", "segments": "2"}
{"id": "1", "key": "2", "segments": "3"}
```

分割するパラメータの値の重複をなくしたり、最大分割サイズを指定するオプションもあります！
rbenv


## rbenv とは?

[rbenv](https://www.ruby-lang.org/ja/installation/#rbenv)とは複数の[Ruby](https://www.ruby-lang.org/ja/)を管理するためのサードパーティツールです。

##インストール
###システムワイドにインストール

```
# cd /usr/local
# git clone git://github.com/sstephenson/rbenv.git
```

rbenv へパスを通す設定と初期化を行うため下記を追記します。

```/etc/profile.d/rbenv.sh
# rbenv
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

##rbenvの確認

```
# rbenv --version
rbenv 0.4.0-89-g14bc162
```
Vagrant + GitHub(Pages) + Bitbucket + Octopress で本格的にblogを作成（その２）

# とりあえず
[酒と泪とRubyとRailsと](http://morizyun.github.io/blog/octopress-gitpage-minimum-install-guide/) さんの記事をなぞってみています。少しだけ異なる点があるとすれば、いつものごとくハマって苦労した点、あと仮想環境使って何度も検証したので細かい点を残しておいてます。
※まだgitのこと勉強中なので表現方法が間違っていたら指摘して頂きたいｗ

## 構成
GitHub に Octopress で出力した結果を保存（master ブランチ）、Bitbucket に記事を保存（source ブランチ）します。あと、チーム（複数人）でブログ管理できるようにします。あと Vagrant には、CentOS 6.5 を入れてます。

### 事前準備
1. 仮想環境 Vagrant を[作成している](http://qiita.com/murachi1208/items/5b429cb7cedf76164e67)こと（できれば複数）かつ、github.com にsshで接続できる環境設定済みであること。
2. GitHubで「your_username.github.io」リポジトリを作成済みであること。
3. BitBucket にアカウントを作成しておくこと。

### Ruby Setup
[Octopress Start](http://octopress.org/docs/setup/rvm/) をみると「Install Ruby 1.9.3 or greater using either rbenv or RVM.」と指示されているので rvm にて ruby をインストールします。ruby 2.1.2p(2014/5/31現在) がインスコされるけどHTMLのレンダリング動作に問題ないのでこのまま使います。

```
$ sudo su
# curl -L https://get.rvm.io | bash -s stable --ruby
# source /usr/local/rvm/scripts/rvm
# gem install bundler
# exit
```

### Octopress Setup
GitHub に Octopress で出力した結果を保存（master ブランチ）するため Octopress をセットアップします。```rake setup_github_pages```で指定するurlは、必ず Github 側を指定すること。

```
$ git clone git://github.com/imathis/octopress.git username.github.io
$ cd username.github.io
$ bundle install
$ rake install
$ rake setup_github_pages
Enter the read/write url for your repository
(For example, 'git@github.com:your_username/your_username.github.io.git)
           or 'https://github.com/your_username/your_username.github.io')
Repository url: 
```

Repository url: には ```git@github.com:your_username/your_username.github.io.git``` を指定すること。※your_username は、自分のアカウント名

とりあえず記事を作成しGitHub に Octopress で出力した結果を保存（master ブランチ）にデプロイします。デプロイすると Master ブランチが **Github** に push されます。

```
$ rake generate
$ rake deploy
```

### Github の Collaborators
GitHubでリポジトリを開き、Settings をクリック。「Restrict editing to collaborators only」をチェックします。
![102.png](https://qiita-image-store.s3.amazonaws.com/0/44540/2f1fb3f3-b4da-d6d5-220e-5017151a53ba.png)

また、Collaborators をクリックし 共同管理者を追加します。

### Bitbucket に 記事を保存
```rake deploy``` コマンドは、Octopress(Jelly)で生成されたHTMLのみレポジトリにpushされるので元ネタ記事を管理したい場合は、別にレポジトリを作成しておく必要があります。Github だと常に公開（有料版なら非公開ができる）されるので、お金をかけな方法としては Bitbucket でレポジトリを作るのが得策。

### Bitbucket で リポジトリを作成
BitBucketにログインし「作成」からリポジトリを作成します。名前には「your_username.github.io」を指定します。
![103.png](https://qiita-image-store.s3.amazonaws.com/0/44540/2005d910-a760-83e9-da65-f1ee41b9df14.png)

### Bitbucket に 記事を保存
Bitbucket で記事を保存ソースを管理するようにしてみる。コマンドからの使い方は、Github と同様なので push するだけ。

```
$ git remote add bitbucket git@bitbucket.org:username/username.github.io.git
$ git add -A
$ git commit -m "add source post"
$ git push -u bitbucket source
```

### その３に続く
Vagrant + GitHub(Pages) + Bitbucket + Octopress と環境ができた。次は複数人 で１つのBlogを編集できる[環境の構築](http://qiita.com/murachi1208/items/98cf8342c31e73b9065a)をしてみましょう。