OmniAICreator/Qiita-1.07M huggingface dataset:
Rails gem MiniMagick を利用して画像ファイルをリサイズする

アップロードした画像のリサイズ等を簡単に実装出来る gem MiniMagick の設定、インストールを行う。

**GitHub リポジトリ MiniMagick**
( https://github.com/minimagick/minimagick )

※ インストールの方法から、利用方法までは上記 GitHub に全てまとまっています。


## 前提

||バージョン|
|:--|:--|
|Ruby|2.1.1|
|Rails|4.2.0|
|MiniMagick|4.2.0|

ImageMagick が必要となるので、事前に homebrew や、Cactuslab で配布しているパーーケージを用いてインストールを済ませておく。

CarrierWave を利用して、アップロードした画像をリサイズする想定で説明を進めるので、ファイルのアップロードについて、以下を先に読んでおくと良いかも。

[Rails gem CarrierWave を利用してファイルをアップロードする]
(http://qiita.com/ryo-ichikawa/items/9ea8a03d78dbaa3106f4)

## 1. インストール

Gemfile へ MiniMagick を追記

```rb:Gemfile
gem 'mini_magick'
```


Gemfile をインストール。
( rails プロジェクト内に閉じた状態で gem をインストールしたいため --path オプションを利用 )

`$ bundle install --path vendor/bundle`


## 2. CarrierWave の uploader クラス修正

元画像の縦横比を維持したまま width を最大 300px、height を最大 200 pxにリサイズする。

```app/uploaders/image_uploader.rb
process resize_to_limit: [300, 200]
```


元画像から width 100px, height 100px で切り抜きを行う。
第三引数で、切り抜きを行う際の中心点を指定。
( default: 'Center'; options: 'NorthWest', 'North', 'NorthEast', 'West', 'Center', 'East', 'SouthWest', 'South', 'SouthEast' )

```app/uploaders/image_uploader.rb
process resize_to_fill: [100, 100, "Center"]
```


元画像の縦横比を維持したまま width を最大 300px、height を最大 200 pxにリサイズする。
リサイズ後のファイルが 300px × 200px になるよう、余白部分を指定色でぬりつぶす。
第三引数で塗りつぶしの色を指定。
第四引数で、余白が発生した際の画像の配置を指定。

```app/uploaders/image_uploader.rb
process resize_to_limit: [300, 200, "#ffffff", "Center"]
```


サムネイル用、フォトギャラリー用等、別バージョンでリサイズした画像を作成する。

```app/uploaders/image_uploader.rb
version :thumb do
  process resize_to_fill: [50, 50]

  # thumb.jpg という固定ファイル名で作成 ( full_filename メソッドをオーバーライド )
  def full_filename for_file
    "thumb.jpg"
  end
end

version :gallery do
  process resize_to_limit: [300, 200]

  # gallery.jpg という固定ファイル名で作成 ( full_filename メソッドをオーバーライド )
  def full_filename for_file
    "gallery.jpg"
  end
end
```

---

以上。
Rails gem CarrierWave を利用してファイルをアップロードする

ファイルアップロード機能をお手軽に作成出来る gem CarrierWave のインストール・設定を行う。

**GitHub リポジトリ CarrierWave**
(https://github.com/carrierwaveuploader/carrierwave)

※ インストールの方法から、利用方法までは上記 GitHub に全てまとまっています。


## 前提

||バージョン|
|:--|:--|
|Ruby|2.1.1|
|Rails|4.2.0|
|CarrierWave|0.10.0|


## 1. インストール

Gemfile へ CarrierWave を追記

```rb:Gemfile
gem 'carrierwave'
```

Gemfile をインストール。
( rails プロジェクト内に閉じた状態で gem をインストールしたいため --path オプションを利用 )

`$ bundle install --path vendor/bundle`


## 2. uploader クラス作成

CarrierWave では uploader というジェネレータが提供されるので、任意の名前でクラスを作成。
以下では image という名前で uploader クラスを生成。

`$ rails g uploader image`


## 3. モデルクラスへ作成した uploader を設定

store という店舗情報を扱うモデルクラスへ、image という string 型のカラムを追加する想定で説明。
カラム名は必ず、作成した uploader と同じ名前にする。


マイグレーションを作成 & 実行。

`$ rails g migration addImageToStores image:string`
`$ rake db:migrate`


store モデルへ uploader を設定。

```app/models/store.rb
mount_uploader :image, ImageUploader
```


## 4. ビューの修正

form へファイル選択ボックスを追加。
また、バリデーションでエラーが発生し、フォームが再表示された場合もアップロードされたファイルが保持されるように カラム名_cache という hidden フィールドを用意しておく。

```app/views/stores/_form.html.erb
<div class="field">
  <%= image_tag @store.image.url if @store.image? %>
  <%= f.label :image %><br>
  <%= f.file_field :image %>
  <%= f.hidden_field :image_cache %>
</div>
```

※ Rails4 から、form 内に file_field を含む場合、自動的に multipart オプションをつけてくれるので、form_for ヘルパー等の修正は不要。

画像を表示する。

```app/views/stores/show.html.erb
<p>
  <strong>Image:</strong>
  <%= image_tag @photo.image.url %>
</p>
```


## 5. コントローラの修正

strong params へビューで追加した image と image_cache を追記する。

```app/controllers/stores_controller.rb
params.require(:store).permit(:name, :address, :image, :image_cache)
```


## おまけ

uploader クラスで、ファイルアップロード時の処理を制御。
ジェネレータで作成したクラスを見ると、よく使われる設定がコメント書きされているので、それをもとに変更するとよいかも。

```app/uploaders/image_uploader.rb

# JPEG 形式に変換して保存
process convert: "jpg" 

# 拡張子 jpg jpeg gif png のみ許可
def extension_white_list
  %w(jpg jpeg gif png)
end

# ファイル名は original.jpg で保存 (jpeg変換しているので拡張子は固定)
def filename
  "original.jpg" if original_filename
end
```

---

以上。
CentOS6にてCakePHP3.0を動かすまでの覚書

VirtualBoxにてCentOS6を立ち上げ、CakePHP3を動かすまでのメモ。

---

## 状況
CentOSはminimalでインストールしたまっさらな状態。
外部のネットワークにつながること。

## システムを最新の状態に更新

```bash
yum update -y

cat /etc/centos-release
# CentOS release 6.6 (Final)
```

## remiからPHP5.6をインストールする
> 参考
> [CentOSにPHP5.6をインストール](http://qiita.com/pakiln/items/645e8a97cde46b59f9f8)

```bash
# EPELリポジトリを登録。
yum install -y epel-release

# remiリポジトリを登録
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# PHP5.6をインストール
yum install --enablerepo=remi --enablerepo=remi-php56 -y php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof

php -v
# PHP 5.6.7 (cli) (built: Mar 19 2015 15:09:09) 
# Copyright (c) 1997-2015 The PHP Group
# Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
#    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend 
# Technologies
#    with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans


# php-intl をインストール
yum install --enablerepo=remi --enablerepo=remi-php56 -y php-intl

```

## Apacheをインストール

```bash

yum install -y httpd httpd-devel
service httpd start
chkconfig httpd on

# httpd.confを編集
vi /etc/httpd/conf/httpd.conf 
```

```apache

# 276行目あたり
# ServerNameのコメントアウトを外しておく
# 試験環境なのでServerNameは設定せず...
#ServerName www.example.com:80
ServerName www.example.com:80

# 330行目あたりから
# DocumentRootの設定にて

# Options Indexesを変更
Options All

# AllowOverrideを変更
AllowOverride All

```
```bash

# confファイルをテスト
httpd -t
# Syntax OK

# Apache再起動
service httpd restart
```

## CakePHPをインストールするためにComposerをインストール

```bash
# Composerを取得
curl -s https://getcomposer.org/installer | php

# ローカルにダウンロードしたcomposer.pharファイルを
# /usr/local/bin にリネームして移動
mv composer.phar /usr/local/bin/composer

```

## CakePHPをインストール

```bash

# ApacheのDocumentRootに移動
cd /var/www/html/

# Composerを用いて展開
# 時間がかかるので待つ
composer create-project --prefer-dist cakephp/app ./

ls
# README.md  bin  composer.json  composer.lock  config  index.php  logs  phpunit.xml.dist  plugins  src  tests  tmp  vendor  webroot
```

## ブラウザで確認
![CakePHP3.0](https://qiita-image-store.s3.amazonaws.com/0/37765/bf6b8f75-13fe-db38-f44e-33ee4463cea2.png)

以上。
あとはコーディングしていく感じです。
ある点と多角形の内外判定

点と多角形の各点とのなす角の合計が360°になる場合、その点が多角形に内包されている、ということになるらしい。

この判定用の関数をJavaScriptで書いたものが以下。

    judgeInclusion = function(p1, comparisonArr) {
      var deg = 0;
      var p1x = p1.x;
      var p1y = p1.y;
      
      for (var index = 0; index < comparisonArr.length; index++) {
        var p2x = comparisonArr[index].x;
        var p2y = comparisonArr[index].y;
        if (index < comparisonArr.length - 1) {
          var p3x = comparisonArr[index + 1].x;
          var p3y = comparisonArr[index + 1].y;
        } else {
          var p3x = comparisonArr[0].x;
          var p3y = comparisonArr[0].y;
        }
        
        var ax = p2x - p1x;
        var ay = p2y - p1y;
        var bx = p3x - p1x;
        var by = p3y - p1y;
        
        var cos = (ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by));
        deg += getDegree(Math.acos(cos));
      }
      
      if (Math.round(deg) == 360) {
        return true;
      } else {
        return false;
      }
    };

独自の衝突判定を書きたい場合などに使えそう。

# デモ

http://codepen.io/ykob/details/zxJjxg/

# 参考

http://kone.vis.ne.jp/diary/diaryb09.html
http://www.sousakuba.com/Programming/gs_two_vector_angle.html
Rails + BrowserSync でViewをシームレスに開発する

RailsでHTMLやCSSを変更するたびにブラウザをリロードするのも面倒だし、
種類の違うブラウザで同じ挙動の確認をするのも面倒だなと思っていました。

そこでBrowserSyncをRailsと組み合わせてViewをシームレスに開発してみます。
BrowserSyncについてはQiitaで記事検索すると色々わかると思います。
http://qiita.com/search?q=BrowserSync&sort=rel&utf8=%E2%9C%93

作成したアプリケーションのコードはGithubに置いてあります。
https://github.com/hiro-su/rails-browser_sync

## 構成
RailsのViewにBrowserSync用のコードを挿入したくないので、BrowserSyncをプロキシモードで起動します。```http://localhost:3002``` にアクセスするとRailsアプリへとリバースプロキシされます。

| Rails アプリ | BrowserSync UI | BrowserSync Proxy |
|:-----------:|:--------------:|:-----------------:|
| localhost:3000 | localhost:3001 | localhost:3002 |

ちなみに作業環境はMacです。

## Railsアプリケーションの作成
 
### プロジェクト作成
 
```bash
$ rails new rails-browser_sync --skip-bundle
$ cd rails-browser_sync
```

### turbolinksを無効にする
turbolinksが有効だと画面遷移時にBrowserSyncのproxyが刺さるため無効にします。
 
```bash
$ git diff Gemfile

-gem 'turbolinks'
+#gem 'turbolinks'
```

```bash
$ git diff app/assets/javascripts/application.js

-//= require turbolinks
```

```bash
$ git diff app/views/layouts/application.html.erb

-  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
-  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
+  <%= stylesheet_link_tag    'application', media: 'all' %>
+  <%= javascript_include_tag 'application' %>
```

### bundle install

```bash
$ bundle install --jobs=10
```

### scaffoldでアプリケーション作成

```bash
$ rails g scaffold Bookmark title:string url:string
$ rake db:migrate
```

## BrowserSync

### インストール
BrowserSyncのインストールがまだの場合はインストールします。

```bash
npm install -g browser-sync
```

### 設定ファイルの作成
カレントディレクトリに```bs-config.js```というファイルが作成されます。

```bash
$ browser-sync init
[BS] Config file created bs-config.js
[BS] To use it, in the same directory run: browser-sync start --config bs-config.js
```

### 設定ファイルの編集
変更を監視するファイルの指定とBrowserSyncをプロキシモードで動かすための指定を行います。

```bash
$ git diff bs-config.js

-    "files": false,
+    "files": ["app/assets/stylesheets/*.css.*","app/views/**/*.html.*","app/assets/javascripts/**/*.js.*"],  // 変更を監視するファイル
     "server": false,
-    "proxy": false,
-    "port": 3000,
+    "proxy": "localhost:3000", // Railsアプリのポート番号
+    "port": 3002,              // BrowserSyncのポート番号
     "middleware": false,
     "ghostMode": {
         "clicks": true,
```

## Foreman

Foremanを使って起動させます。
Foremanのインストールがまだの場合はインストールします。

```bash
$ gem install foreman -N
```

### Procfileの作成

Railsが起動してからBrowserSyncを起動するようにしています。

```bash
$ vim Procfile
web: rails s
bs: ruby -e "sleep 1 until File.exists?('tmp/pids/server.pid')" && browser-sync --config bs-config.js start
```

### 起動

```bash
$ foreman start
```

BrowserSyncが起動すると http://localhost:3002 が開くと思います。
ChromeとFirefoxなど複数のブラウザで http://localhost:3002/bookmarks を開き、
```app/views/bookmarks/index.html.erb``` 等のhtmlファイルを編集してみてください。

Viewをシームレスに開発する環境が整いました :-)

![スクリーンショット 2015-03-30 17.13.27.png](https://qiita-image-store.s3.amazonaws.com/0/19011/a5734a33-9b35-3428-c947-84d306b99e88.png)

BrowserSync UI (http://localhost:3001) にアクセスするとSyncオプションを設定できます。

![スクリーンショット 2015-03-30 17.36.43.png](https://qiita-image-store.s3.amazonaws.com/0/19011/fdc1548f-f06f-7287-45be-de73db933b2f.png)
PlayMakerでAnimatorを使っていても特定のAnimationの終了通知を受け取るカスタムアクション

# PlayMakerのAnimator系アクション
実はAnimator系はあまり充実してない。
Animationは揃ってる。Play AnimationアクションならAnimationを再生開始しつつ終了通知を受け取るイベントを設定できるが、今時UnityでAnimation単位で制御しない。MecanimだのAnimatorだのを使う。

EcosystemでもAnimatorで一件もヒットしない。なんたることか。

で、アニメはAnimatorで変数制御したいけど特定のAnimationの終了をイベントで受け取って遷移したいというときのためのカスタムアクション。

```csharp:AnimationFinishedEvent.cs
using UnityEngine;
using HutongGames.PlayMaker;
namespace HutongGames.PlayMaker.Actions {
	[ActionCategory(ActionCategory.Animation)]
	[Tooltip("Observe an animation finished and send the event.")]
	public class AnimationFinishedEvent : FsmStateAction {

		[RequiredField]
		[CheckForComponent(typeof(UnityEngine.Animator))]
		[Tooltip("The GameObject to be observed.")]
		public FsmOwnerDefault gameObject;

		[RequiredField]
		[Tooltip("Send this event when animation finished.")]
		public FsmEvent sendEvent;

		[RequiredField]
		[Tooltip("The name of the animation to be observed.")]
		public FsmString animationName;

		private Animator animator;

		public override void Reset() {
			gameObject = null;
			sendEvent = null;
			animationName = null;
		}

		// Code that runs on entering the state.
		public override void OnEnter() {
			var go = Fsm.GetOwnerDefaultTarget(gameObject);
			animator = go.GetComponent<Animator>();
		}

		// Code that runs every frame.
		public override void OnUpdate() {
			var a = animator.GetCurrentAnimatorStateInfo(0);
			if (a.IsName(animationName.Value) && a.normalizedTime >= 1f) {
				Fsm.Event(sendEvent);
			}
		}
	}
}
```
擬人化オブジェクト指向 - 第4話「多重継承」

![](http://lorempixel.com/640/396/people/?14fgFZqkleLPnqCZ)
フレームワーク「あなた方は北斗神拳伝承者ですか？」
ケンシロウ「はい」
レイ「いいえ」
ジャギ「はい」
フレームワーク「あなた方は南斗聖拳伝承者ですか？」
ケンシロウ「いいえ」
レイ「はい」
ジャギ「はい」

----
![](http://lorempixel.com/640/396/sports/?i8iN4gZP13ynnTam)
フレームワーク「それの秘孔を突いてください」
ケンシロウ「はい」
レイ「無理です」
ジャギ「はい」

----
![](http://lorempixel.com/640/396/people/?6aIBxnvrOL02erA5)
フレームワーク「それを切り刻んでください」
ケンシロウ「無理です」
レイ「はい」
ジャギ「はい」

----
![](http://lorempixel.com/640/396/technics/?tu9SHEAbZnSNZiue)
フレームワーク「それをkillしてください」
ケンシロウ「はい」
レイ「はい」
ジャギ「（あれ、どっちを使えばいいんだ？）」
Unity C# MessagePackをいじる

こちらのページを参考につくりました。
　http://qiita.com/snaka/items/8da9f89deeef17b1923a

今はAPI作る能力ないので、内部でPackして内部でUnPack

**・データクラス側**

```csharp:MessagePackData.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class PersonalData
{
    public int id;
    public string name;
    public long money;
    public float weight;
    public double height;
}

public class JobData
{
    public string company;
    public string langage;
}


public class MessagePackData
{
    public PersonalData PersonalData;
    public List<JobData> JobDataListl;
}
```

・Pack・UnbPack側

```csharp:MsgPackMakeAndLoad.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public class MsgPackMakeAndLoad : MonoBehaviour {

    public MessagePackData PackData = new MessagePackData();
    public byte[] body;

	// Use this for initialization
	void Start () {

        PersonalData personalData = new PersonalData();

        personalData.id = 1;
        personalData.name = "あいうえお";
        personalData.money = 9876543210;
        personalData.weight = 1234.567f;
        personalData.height = 321654987.123456789d;

        List<JobData> JobList = new List<JobData>();

        for(int i =0; i < 5; i++)
        {
            JobData jData = new JobData();
            jData.company = "株式会社〇○" + i.ToString();
            jData.langage = "日本語" + i.ToString();
            JobList.Add(jData);
        }

        PackData.JobDataListl = JobList;
        PackData.PersonalData = personalData;



        // buffer に何らかのデータを格納する処理...
        var packer = new MsgPack.ObjectPacker();
        body = packer.Pack(PackData);

	}
	

    public void  OnClickUnPackApiData()
    {

        var packer = new MsgPack.ObjectPacker();
        MessagePackData result = packer.Unpack<MessagePackData>(body);

        Debug.Log(result.PersonalData.id.ToString());
        Debug.Log(result.PersonalData.name);
        Debug.Log(result.PersonalData.money.ToString());
        Debug.Log(result.PersonalData.weight.ToString());
        Debug.Log(result.PersonalData.height.ToString());

        foreach(JobData jdata in result.JobDataListl)
        {
            Debug.Log(jdata.company);
            Debug.Log(jdata.langage);
        }
    }
}
```
Gitのプッシュでデプロイとアプリケーションサーバーの再起動をする


Gitのプッシュでデプロイするようにする設定。
毎回、ググってるので、メモ。

Gitでプッシュしたら、チェックアウトして、upstartに登録したアプリケーションサーバーを再起動する。

参考：[How To Set Up Automatic Deployment with Git with a VPS](https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps)

# Gitのレポジトリを設定

レポジトリのフォルダを作って、そこに移動して、git init。

## git init

```bash
git init --bare
```

## フックの設定

```bash:[Gitのレポジトリ]/hooks/post-receive
#!/bin/sh
git --work-tree=[アプリケーションサーバーの設定を置いてあるフォルダ] --git-dir=[gitのレポジトリ] checkout -f [ブランチ名]
sudo restart [upstartのサービス名]
```

post-receiveの権限を、他に合わせて775にする。（755でもいいかも。）

# アプリケーションサーバーを再起動できるようにsudoを設定する

ファイルをアップするユーザーで、アプリケーションサーバーを再起動できるように、ファイルのアップに使ってるユーザーをsudoに設定する。

visudoで、sudoersを開く。
元のファイルをいじっちゃうと、ゴチャゴチャする気がしたんで、分けることに。

```bash
sudo visudo -f /etc/sudoers.d/[適当な名前]
```

で、設定内容。

```/etc/sudoers.d/[適当な名前]
Defaults:[ユーザ名] !requiretty

[ユーザ名] ALL=(ALL) NOPASSWD:/sbin/restart [upstartのサービス名]
[ユーザ名] ALL=(ALL) NOPASSWD:/sbin/stop [upstartのサービス名]
[ユーザ名] ALL=(ALL) NOPASSWD:/sbin/start [upstartのサービス名]
```

sudoは、デフォルトでrequirettyがonなんで、これを外してあげないと、git経由でsudo実行できないとこに注意。
参考：[特定ユーザにのみtty無しでのsudoを認める](http://qiita.com/yuku_t/items/0f15d487ed6232d21410)
ベジェ曲線を使ってcanvasに円を書く

![Bezier-Curve-Circle.png](https://qiita-image-store.s3.amazonaws.com/0/44895/8c57ba45-c2ce-3818-033e-7ca593983f05.png)

円をarc()で描画するのでなくbezierCurveTo()で描画すれば、湾曲させたり変形させたりできる。
[bezierCurveTo()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/bezierCurveTo)の詳細は調べればわかるので省く。

    r = 10 // 任意の半径
    kappa = 0.5522848;
    o = r * kappa;

この`o`が各制御点を計算するための基礎の値になるらしい。
`kappa`が何故その値なのかは完全に理解していない。理屈については参考URLを参照のこと。

円周上の各点とその制御点の計算は以下。

    p1.x = x - r * Math.cos(getRadian(deg));
    p1.y = y - r * Math.sin(getRadian(deg));
    p1.c1x = p1.x + o * Math.cos(getRadian(deg - 90));
    p1.c1y = p1.y + o * Math.sin(getRadian(deg - 90));
    p1.c2x = p1.x + o * Math.cos(getRadian(deg + 90));
    p1.c2y = p1.y + o * Math.sin(getRadian(deg + 90));

ここで計算した点、制御点をbezierCurveTo()で繋げば円が描ける。

※getRadian() はradianをdegreeに変換する関数のつもり。

# デモ

http://codepen.io/ykob/pen/bNWKzW?editors=001

# 参考

http://cat-in-136.github.io/2014/03/bezier-1-kappa.html
Retrofitで使われるdefault clientの注意点

Retrofitは、REST APIとのやり取りをシンプルに行うインターフェースを提供するライブラリです。HTTP通信に使うclientをセットできるんですが、明示的にセットしていない場合の挙動でちょっとハマったのでメモしておきます。

# OkHttpのクラスパスがあるかどうかで挙動が変わる
結論から言うと、プロジェクト内にOkHttpのクラスパスがあるかどうかで挙動が変わります。
`retrofit.RestAdapter#ensureSaneDefaults()` を見ると、デフォルトのclientProviderをセットしています。

```java
private void ensureSaneDefaults() {
  if (converter == null) {
    converter = Platform.get().defaultConverter();
  }
  if (clientProvider == null) {
    clientProvider = Platform.get().defaultClient();
  }
  // 略
}
```

`Platform#defaultClient()` を見ると、OkHttpのクラスパスがあるかどうかで AndroidApacheClient か UrlConnectionClient を使うようになっています。

```java
@Override Client.Provider defaultClient() {
  final Client client;
  if (hasOkHttpOnClasspath()) {
    client = OkClientInstantiator.instantiate();
  } else {
    client = new UrlConnectionClient();
  }
  return new Client.Provider() {
    @Override public Client get() {
      return client;
    }
  };
}
```


RetrofitでOkHttpを使う場合は、[公式ページ](http://square.github.io/retrofit/)のINTEGRATION WITH OKHTTPに書いてあるとおり、 `okhttp` と `okhttp-urlconnection` を依存関係に追加しなければなりません。

> When using Retrofit together with OkHttp, OkHttp (version 1.6.0 or newer) and OkHttp-UrlConnection are now required.

```gradle
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
compile 'com.squareup.okhttp:okhttp:2.0.0'
```

# 何が問題か
okhttp、okhttp-urlconnectionを明示的に依存関係に入れている場合は問題ないです。
問題があるのは、気づかないうちに他のライブラリがokhttpに依存していて、意図せずclientがokhttpに切り替わり挙動が変わるケースです。

一例をあげると、OkHttpを使うとFollowRedirectが有効になっているので問題ないですが、AndroidApacheClientだとデフォルト無効なので、予期せず `302 Moved Temporarily` エラーが発生することがあります。

# 結論
**Retrofitを使う場合は、clientを明示的にセットするか、okhttpを依存関係に加えましょう。**

ちなみにまだリリースされていないですが、[retrofit:2.0.0](https://github.com/square/retrofit)はデフォルトが必ずokhttpを使うようになっているので問題なさそうです。

以上です！
modelのattributeをoverrideしたあと元のmethod呼ぶ方法



例えば以下のような本のモデルがあるとします

```ruby:book.rb
# create_table "books" do |t|
#   t.string :title
# end

class Book
end

```

## Titleをprivateにしたい。

```ruby:book.rb
class Book

  private
  
  def title=(val)
    write_attribute :title, val

  end
  def title
    self[:title]
  end
end
```

## 外部からは書き込めないようにしたい
```ruby:book.rb
class Book

  def title
    self[:title]
  end

  private
  
  def title=(val)
    write_attribute :title, val
  end
end
```

ActiveSupportさんが、「該当のメソッドが定義されてなかったら attrのアクセサーだとみなす」みたいな動きなので、（親クラスに実装されているメソッドとかではない）のでsuperじゃ動かん
Pythonサーバーの設定（nginx + Gunicorn）


2014年に調べて、個人的にこれだっていう、PythonのAPIサーバーの設定。

nginxをフロントに立てて、アプリケーションサーバーに[gunicorn](http://gunicorn.org/)を使って、リバースプロキシする。

ちょっと古いけど、instagramを参考にしてこれに決めた。[INSTAGRAM ENGINEERING](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances)

AWS EC2に設定した時のメモ。

#gunicornのインストール

virtualenv上でpipを使ってインストール。
virtualenvは、OSのPythonをいじるとyumが動かなくなっちゃたりするのが嫌なのと、Pythonのバージョンをあげたかったりするんで使用。

##gunicornを起動時に立ち上げるようにする

あんまり詳しくないけど、upstartに登録。

以下の設定ファイルを記述。

```/etc/init/myapp.conf
description "[APP NAME] API Server"
 
start on runlevel [2345]
stop on runlevel [016]
 
respawn
 
script
su - www
/home/www/[APP NAME]/virtualenv/bin/gunicorn -b 127.0.0.1:8000 -w 4 -u www --chdir /home/www/[APP NAME]/server/python --log-file /home/www/[APP NAME]/logs/error_log --pythonpath /home/www/[APP NAME]/server/python server:application
end script
```

centos7の時は、upstartが入ってないんで、systemctlに設定する。
設定ファイルも含めて、Gunicornのサイトに載ってる。

参考：[Deploying Gunicorn - Gunicorn 19.3.0 documentation](http://gunicorn-docs.readthedocs.org/en/latest/deploy.html)

#nginxのインストール

yumでインストール。

nginxの設定ファイル。

```/etc/nginx/nginx.conf
user  www;
worker_processes  1;

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile        on;

    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;

    index   index.html;

    upstream app_server {
        server 127.0.0.1:8000 fail_timeout=0;
    }

    server {
        listen       80;
        server_name  [DOMAIN];
        root         /home/www/[APP NAME]/server/html;

        access_log  /var/log/nginx/[APP NAME].access.log  main;

        location / {
            try_files $uri @proxy_to_app;
        }

        location @proxy_to_app {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass   http://app_server;
        }

        error_page  404              /404.html;
        location = /40x.html {
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        }

    }

}
```

主な設定内容は、以下の2つ。

* nginx用のユーザー（www）を作って、そのユーザーでnginxを動かすようにする。
* 物理ファイルがないとき、全部のリクエストをgunicorn（127.0.0.1:8000） にリバースプロキシ。
cakephpで10分前を検索するモデル

# cakephpで10分前を検索する
cake初心者のため、PHPで時刻取得することに。


```lang:php
public function search(){
  // 検索用に10分前を取得
  $from_date = date("Y-m-d H:i:s", strtotime( "-10 minute" ));

  $data = $this->find('count', array(
          'conditions' => array(
              'created >=' => $from_date
          )
      )
  );
}
```
CoreGraphics をつかって画像を加工する(Mac OSX/iOS)


CoreGraphicsを使ってJPEG等を加工するためのメモ。
NSImageとかUIImageとかの説明は省略。

# Core Graphicsとは
Core Graphics は Mac OSX/iOSで使われるGrahics関連のフレームワーク。

``CoreGraphics.framework``を使って、CGXXXXといった名前のAPIを使う。


# Core Foundation
* CocoaのFoundationに相当するもの
* C言語で記述されている
* CFXXXという名前のAPI


# CoreGraphics
## CGImageRef 
ビットマップイメージへの参照を表す型。

```Objective-C:
NSImage *image;
CGImageRef imageRef = [image CGImageForProposedRect:NULL context:nil hints:nil];
```


みたいに取得できる。
CGImageRefはいろんな関数が用意されており、
1行のバイト数は

```Objective-C:
size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);
```

で取得可能。

## CGImageRefからピクセル値を取得

CGImageRefのピクセル値を取得するには、
CGImageをCFDataとして扱える CGDataProviderRefに変換してあげる必要がある。

```Objective-C:
    CGDataProviderRef provider = CGImageGetDataProvider(imageRef);
    CFDataRef dataRef = CGDataProviderCopyData(provider);  /* CGDataProviderRefからCFDataRefとしてデータを取得 */
    CFMutableDataRef mDataRef = CFDataCreateMutableCopy(0, 0, dataRef);　/* ピクセル値を加工するのにCFDataRefから複製 */
    void *pixels = (void *)CFDataGetBytePtr(mDataRef);
```

一度CFMutableDataRefにしないと、pixelsを操作するときにアクセス違反で落ちるので注意。


## CGImageを作る
加工したGFDataを使った新しく画像を作り直すには、
``CGImageCreate``を使う

```Objective-C:
CGDataProviderRef resultDataProvider = CGDataProviderCreateWithCFData(mDataRef);
CGImageRef resultCgImage = CGImageCreate(CGImageGetWidth(imageRef),
                                        CGImageGetHeight(imageRef),
                                        CGImageGetBitsPerComponent(imageRef),
                                        CGImageGetBitsPerPixel(imageRef),
                                        bytesPerRow,
                                        CGImageGetColorSpace(imageRef),
                                        CGImageGetBitmapInfo(imageRef),
                                        resultDataProvider,
                                        NULL,
                                        CGImageGetShouldInterpolate(imageRef),
                                        CGImageGetRenderingIntent(imageRef));
NSBitmapImageRep *retImageRep = [[NSBitmapImageRep alloc] initWithCGImage:resultCgImage];
NSImage *resultImage = [[NSImage alloc] init];
[resultImage addRepresentation:retImageRep];
```

ちなみにつくったCFXXXXは ``CFRelease()``を呼んであげることを忘れずに。
php-fpm の reload は実行中の worker がおなくなりになる

# 背景

処理中の worker を影響を与えずに、ログレベルを debug にしたかった

# 環境

Ubuntu 14.10 + php5-fpm 5.5.12

# man

```
PHP-FPM(8)                                                          Scripting Language


SIGNAL
       Once started, php-fpm then responds to several POSIX signals:

              SIGINT,SIGTERM      immediate termination
              SIGQUIT             graceful stop
              SIGUSR1             re-open log file
              SIGUSR2             graceful reload of all workers + reload of fpm conf/binary
```

`SIGUSR2` で大丈夫そうですね。

# init script

`/etc/init.d/php5-fpm` の中身

```
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}
```

USR2、想定どおりですね。

# 動作確認

`/sleep.php` をこしらえる

```php
<?php
sleep(100);
```

そして、

```
curl http://127.0.0.1/sleep.php
```

を叩いて、別の console で

```
kill -USR2 $(/usr/local/bin/supervisorctl pid php5-fpm)
```

をたたく。期待するのは curl がずっとレスポンス待ちであること。

が、

```
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx</center>
</body>
</html>
```

おっと、 worker がおなくなりになりました。。。

# 追記

もう少し調べてみると、 [Bug #60961: Graceful Restart (USR2) isn't very graceful](https://bugs.php.net/bug.php?id=60961) が2012年にあがっていますが、ずっと放置されているようです。。。
Android Studioでエミュレータを横画面表示にする方法

横画面固定のアプリを作成することになり、ふと思いました。
Android Studioのエミュレータで横画面表示する方法がわからない・・・
デフォルトは縦表示です。

そこで調べてみました。

#### ■ Android Studioでエミュレータを横画面表示にする方法 ####

```rb:Mac
fn + control + F11
```

```rb:Windows
Ctrl + F11
```

以上、メモでした。
CoffeeScriptで書くSingletonパターン

## プライベートクラスを使い、staticメソッドでアクセスさせる実装

```coffeescript
class Singleton
  [instance] = []

  @getInstance: ->
    instance ?= new PrivateClass()

  class PrivateClass
    constructor: ->

console.log Singleton.getInstance() is Singleton.getInstance() #=> true
```

[CoffeeScript Cookbook » Singleton Pattern](https://coffeescript-cookbook.github.io/chapters/design_patterns/singleton) に載っている方法。[-> JS Binでみる](http://jsbin.com/gucexo/1/watch?js,console)

インスタンス化するクラスをプライベートにする実装。

インスタンス化するクラス`PrivateClass`に外部からアクセスできないため、`instanceof`によるプロトタイプチェーンの検査ができない。個人的には、言語機能の一部が失われる邪悪な実装だと思っている。

## インスタンスをキャッシュし、returnする実装

```coffeescript
class Singleton
  [instance] = []

  constructor: ->
    return instance if instance?
    instance = @

console.log new Singleton() is new Singleton() #=> true
```

[javascript - Singleton class in coffeescript - Stack Overflow](http://stackoverflow.com/questions/25828901/singleton-class-in-coffeescript/25880180#25880180) で紹介されている方法。[-> JS Bin でみる](http://jsbin.com/cijibu/1/watch?js,console)

1度目のコンストラクトでインスタンスをキャッシュする。2度目以降のコンストラクタのコールでキャッシュしたインスタンスをreturnするパターン。

暗黙的にキャッシュされたインスタンスが戻されるので、シングルトンなのかを意識する必要がなくなる。しかし、これは同時にシングルトンなのかを意識することができなくなるというデメリットとも考えられる。もっと明示的な実装をしたい場合は次の実装がよい。

## インスタンスをキャッシュし、staticメソッドでアクセスさせる実装

```coffeescript
class Singleton
  [isInternal, instance] = []

  @getInstance: ->
    return instance if instance?
    isInternal = true
    new Singleton

  constructor: ->
    throw new Error "Can't call new #{@constructor.name}(), use #{@constructor.name}.getInstance() instead." unless isInternal
    isInternal = false
    instance = @
    
console.log Singleton.getInstance() is Singleton.getInstance() #=> true
```

[-> JS Bin でみる](http://jsbin.com/mahobo/1/watch?js,console)

直接コンストラクタを呼ぶとエラーする。`Singleton.getInstance()`経由でインスタンスを取得するとインスタンス未生成の場合は生成しキャッシュしreturnする。生成済みの場合はキャッシュしたインスタンスをreturnする。

注意しなければならないのは

```coffeescript
class Singleton
  [isInternal, instance] = []

  @getInstance: ->
    return instance if instance?
    isInternal = true
    instance = new Singleton # BAD WAY

  constructor: ->
    throw new Error "Can't call new #{@constructor.name}(), use #{@constructor.name}.getInstance() instead." unless isInternal
    isInternal = false

console.log Singleton.getInstance() is Singleton.getInstance() #=> true
```

のように`instance`へのキャッシュ登録をコンストラクタの戻りで行うのではなく、コンストラクタ内で`instance = @`とすること。
これをミスると、コンストラクタから呼ばれた他のメソッドの中から`Singleton.getInstance()`していると`instance`が`null`のまま`getInstance()`が呼ばれ[コンストラクタのコールがスタックに積み上がるループに嵌る](http://jsbin.com/jefacu/1/watch?js,console)。
AngularJsで滑らかなswipeを実装するのに参考になったリンクまとめ

# **概要**

AngularJsで滑らかなswipeを実装するのに参考になったリンクのまとめです。


# **参考記事**

* <a href="https://docs.angularjs.org/api/ngTouch/service/$swipe" target="_blank">AngularJS: API: $swipe</a> - 公式リファレンス。
* <a href="http://cwspear.github.io/angular-menu-slideout/#" target="_blank">Menu Slideout Demo</a> - 滑らかなスワイプのデモが見れます。<a href="https://github.com/CWSpear/angular-menu-slideout" target="_blank">こちら</a>にソースコードがあり、非常に参考になります。
* <a href="https://mango.github.io/slideout/" target="_blank">Slideout.js</a> - AngularJsに限らず、ライブラリ依存なしで滑らかなドロワーメニューが実装できます。
* <a href="http://iwb.jp/angularjs-swipe-position-time-event/" target="_blank">AngularJSの$swipeで位置と時間からスワイプイベントを検出</a>
* <a href="http://kinjouj.github.io/2014/04/angularjs-23-ng-touch-swipe-event.html" target="_blank">angular.jsをやってみる (23) - ngTouchを使ってスワイプイベントを利用</a>
列が増える可能性のあるテーブルのmysqldump

# 列が追加されないテーブルのバックアップ
MySQLの特定テーブルのバックアップには次のmysqldumpがよく利用されるだろう。

```bash:shell
mysqldump -h host  -u user -ppass database table --no-create-info --single-transaction 
```

実行した結果は次のとおりである。

```sql:dumped.sql
LOCK TABLES `table` WRITE;
/*!40000 ALTER TABLE `table` DISABLE KEYS */;
INSERT INTO `table` values (`val1`, `val2`, ...
```
テーブルに列が追加されないことを前提しているのであれば良いが、列が増える可能性があるならばリストアに手間取ることになるだろう。

# 列が追加される可能性のあるテーブルのバックアップ

列が増えてもリストア簡単にリストアできるバックアップを取得するために、`--complete-insert`オプションを付与して実行する。`--complete-insert`オプションにて列名をダンプに含めることができる。

```bash:shell
mysqldump -h host  -u user -ppass database table --no-create-info --single-transaction --complete-insert
```

```sql:dumped.sql
LOCK TABLES `table` WRITE;
/*!40000 ALTER TABLE `table` DISABLE KEYS */;
INSERT INTO `table` (`col1`, `col2`, ...) values (`val1`, `val2`, ...
```

### 参考
http://stackoverflow.com/questions/5467517/mysqldump-create-column-names-for-inserts-when-backing-up
DirectX 10とDXUTで、垂直同期をOFFにする方法

以下のようなコードで可能です。

```
auto ds = DXUTGetDeviceSettings();
ds.d3d10.SyncInterval = 0;
DXUTCreateDeviceFromSettings(&ds);
```

これだけですが、ネットで検索しても情報が少なく、はまりました。
KVMホスト名を変更するとnovaがVMをすべてundefineすることの対処

ホスト名を変更すると嘘みたいに全部消えます。（http://osdir.com/ml/openstack-dev/2015-02/msg02240.html）

```bash
# virsh list --all
Id    Name                           State
----------------------------------------------------
```

空！何か理由があるんだとは思うが、あまりに強力な手法すぎやせんか…。Novaから見えるVMの状態も`ACTIVE`のまま、更新されていない様子。

undefineされるだけでディスクイメージは`/var/lib`に残っているのでまずは落ち着く。どうせVMはシャットダウン状態だし、いまさら慌ててもしょうがないよねうんしょうがない。ホスト障害みたいなもんだよ。

まず古いホスト名を持つVMを探して作業対象を洗い出す。

```bash
$ nova list --host old-host
+--------------------------------------+-----------------------------------------+--------+--------------+-------------+---------------------------------+
| ID                                   | Name                                    | Status | Task State   | Power State | Networks                        |
+--------------------------------------+-----------------------------------------+--------+--------------+-------------+---------------------------------+
...snip...
```

MySQLに入ってメタデータを直接編集する。

```sql
UPDATE instances SET
host = 'new-host',
launched_on = 'new-host',
node = 'new-host'
WHERE uuid IN (
  '1a3c18e3-104e-48e2-a817-cbb5f1c7cfe9',
  '3a7ccd6f-4f25-45e1-9160-1a271d32ff53',
  'a657d7f1-e0f5-4a34-8f4b-bd683bea14db',
  '36e45292-d2cf-466f-9f0b-4b344bdb539b',
  'ad0bf0a6-4bef-4c19-8aa7-ff400796581e',
  'c1ad367c-43fc-4967-8827-c50db2e064c1',
  '4b323cc6-6aaf-45f3-aed4-2d1e1d2ff826',
  'ffb0b8e1-a8ac-44cc-996d-6bb0262b8019'
);
```

うおおおお`UPDATE`こえぇぇぇぇぇ！3回ぐらい同じ`IN`句で`SELECT`打ちましたね。

undefineされているのでdefineしなおし

```bash
virsh define --file /var/lib/nova/instances/1a3c18e3-104e-48e2-a817-cbb5f1c7cfe9/libvirt.xml
```

VMのstateを再設定する

```bash
nova reset-state --active 1a3c18e3-104e-48e2-a817-cbb5f1c7cfe9
```

起動する

```bash
nova reboot 1a3c18e3-104e-48e2-a817-cbb5f1c7cfe9
```

状態によっては代わりに`nova start`する必要があるかもしれない。

まとめると、

* AMQPのキュー名にホスト名が含まれているので、ホスト名が変わると違うキューを見にいってしまう
* ホスト名を変更するとそのホストのdomainは全部undefineされる
* 落ち着けデータは消えていない。素数を数えろ。

NeutronポートやCinderボリュームの紐付けも問題なかった。ホスト名を変更しただけなので、紐付けは壊れなかったようだ。
CSS　背景の下が切れないようにするには

現在Java、Seasar2(SAStrats/S2JDBC)、JSP、PostgreSQLで
DBを使ったWebアプリケーションを作っています。

Bootstrap3でログイン画面を再構築しています。

そこで質問があるのですが
結論から言うと

**画面の背景の下が切れないようにするにはどうしたらよいでしょうか？**

次のように下の方に余白ができ不細工になってしまいます。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/60528/532f486f-1dca-6463-e315-bcf41c501f95.png)


次のことを試しましたがうまくいきませんでした。

```r:css
html , body {
min-height: 100%;
height: auto !important;
height: 100%;
}
```

```r:css
body > .header{
  height: auto; /* 要素を超えた分の背景が伸びないブラウザ用 */
}
```

実際の現在のソースは次のようになっています。

```r:login.jsp
<body>
<s:form action="verify">
<header id="top" class="header">
<div class="text-vertical-center">
<h1>Tennis DataBase</h1>
<br>
<div Align="center"><html:errors /></div>
<div Align="center"><html:text styleId="hoge" property="loginId" styleClass="form-control" style="width:250px;"/></div><br>
<div Align="center"><html:password styleId="hoge2" property="password"  styleClass="form-control" style="width:250px;"/></div><br>
<html:submit value="ログイン" styleClass="btn btn-dark btn-lg"/><br><br>
<s:link href="./registPage">アカウント登録はこちら</s:link>
</div>
</header>
</s:form>
</body>
```

```r:css
html,
body {
    width: 100%;
    height: 100%;
}

body {
    font-family: "Source Sans Pro","Helvetica Neue",Helvetica,Arial,sans-serif;
}

.text-vertical-center {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
}

.header {
    display: table;
    position: relative;
    width: 100%;
    height: 110%;
    background: url(../img/bg.jpg) no-repeat center center scroll;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    background-size: cover;
    -o-background-size: cover;
}
```

CSSの問題以前にタグが邪魔していたりするのかもしれません。
もしわかる方がいれば教えて頂けるとうれしいです。
ファイル群から特定の文字が含まれるものを抽出する方法あれこれ


「Webサイトの中からXXXって文字消したいんだよね〜」のように、対象のファイル群から、指定した文字列が含まれるものを抽出したいことってよくあると思います。そんな時に参考にしてください。


例：カレントディレクトリ以下で、文字列「しいたけ」が含まれるファイルの一覧を`result.txt`に保存する。

```
$grep -rl 'しいたけ' ./ > ~/result.txt
```

特定のパターンのファイル群に対して検索する場合は、`find`を組み合わせる。
例：カレントディレクトリ以下のhtmlファイルに対して、ワード「しいたけ」が含まれる一覧を抽出する。

```
$find . -type f -name '*.html' -print | xargs grep 'しいたけ' -l
```

`egrep`を使えば、複数パターンの同時検索もできるようです。
例：カレントディレクトリ以下のhtmlファイルに対して、ワード「しいたけ」「まいたけ」が両方含まれる一覧を抽出する。

```
$find . -type f -name '*.html' -print | xargs egrep 'しいたけ|まいたけ' -l
```

出力フォーマットについては、ファイル名だけ出力したり、対象の行番号を合わせて出力したり、等コマンドのオプションで対応できるので、マニュアルを読むべし。

- [Man page of FIND](http://linuxjm.sourceforge.jp/html/GNU_findutils/man1/find.1.html)
- [Man page of GREP](http://linuxjm.sourceforge.jp/html/GNU_grep/man1/grep.1.html)

【追記】`find`組み合わせなくてもできる旨コメントで教えていただきました。こちらの方がパフォーマンスよさそうですね。 `--include`や`--exclude-dir`オプションを使えば対象範囲を柔軟に設定できそうですね。

```
$grep --exclude-dir ".svn" --include "*.html" "しいたけ" -l
```

@budougumi0617 さんありがとうございます！
[React Native] iOSのUISegmentedControlクラスのブリッジを書いて画面に表示させてみる


[React Native に UISegmentedControl がないじゃん](https://twitter.com/ushisantoasobu/status/582137990673100800) っていうのを見かけて。どうやって実装しているのか興味あったのでやり方を覚えた。

ソースコード直接みてるのでドキュメントちゃんと読んでないので間違ったこと書いているかもしれないことを留意。

まず [Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js](https://github.com/laiso/react-native/blob/segmentedcontrol/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js) を掘ってJSでReactコンポーネントを作る

```js
var SegmentedControlIOS = React.createClass({
  mixins: [NativeMethodsMixin],

  propTypes: {
    tintColor: PropTypes.string,
  },

  getDefaultProps: function(): DefaultProps {
    return {
      tintColor: "#007AFF",
    };
  },

  render: function() {
    return (
      <View
        style={[{height: 29, width: 140}, this.props.style]}>
        <UISegmentedControl style={[{height: 29, width: 140}]} />
      </View>
    );
  }
});

```

Viewでラップする。試したいだけだからheight,widthはとりあえずハードコードしちゃう。

```objc
var UISegmentedControl = createReactIOSNativeComponentClass({
  validAttributes: {},
  uiViewClassName: 'UISegmentedControl',
});
```

`createReactIOSNativeComponentClass` で呼び出したいクラスを書く。

`Libraries/react-native/react-native.js` の中に追加する

```objc
   PickerIOS: require('PickerIOS'),
   Navigator: require('Navigator'),
   ScrollView: require('ScrollView'),
+  SegmentedControlIOS: require('SegmentedControlIOS'),
   SliderIOS: require('SliderIOS'),
   SwitchIOS: require('SwitchIOS'),
   TabBarIOS: require('TabBarIOS'),
```

[React/Views/RCTUISegmentedControlManager.m](https://github.com/laiso/react-native/blob/7c6a95788ffabc1602465585b3782a0a908cfd0d/React/Views/RCTUISegmentedControlManager.m) で呼び出される側のObjective-Cのクラスを書く。

```objc
@interface RCTUISegmentedControlManager : RCTViewManager
```

`RCTViewManager`を継承したクラスがそのViewの管理をする。


```objc
- (UIView *)view
{
  UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"WIP1", @"WIP2", @"WIP3"]];
  [segmentedControl addTarget:self action:@selector(onChange:) forControlEvents:UIControlEventValueChanged];
  return segmentedControl;
}
```

`-view` が目的のViewを初期化返す。上記は仮のコード。
これは UISegmentedControl を直接使っているけど、React Native 用の処理を加えたかったら継承して `RCTSegmentedControl` のような名前のクラスをつくるのが作法のようだ。


```objc
- (void)onChange:(UISegmentedControl *)sender
{
    [self.bridge.eventDispatcher sendInputEventWithName:@"topChange" body:@{
      @"target": sender.reactTag,
      @"value": @(sender.selectedSegmentIndex)
    }];
}
```

`onChange:` ではJavaScript側に送信する処理を書く。上記はとくに何もやってない仮のコード。

```objc
RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor);
RCT_EXPORT_VIEW_PROPERTY(momentary, BOOL);
```

クラスのプロパティを`RCT_EXPORT_VIEW_PROPERTY`で公開して、JSXから設定できるようにする(ここも仮)。

そうすると

```js
return (<SegmentedControlIOS />);
```

でとりあえず描画できるようになった。

![スクリーンショット 2015-03-30 2.58.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/fa09a7b0-74a8-25d6-a89c-ab842a376100.png "スクリーンショット 2015-03-30 2.58.12 PM.png")
JenkinsのPAMプラグインでログインできない場合の対応

すでに動いているJenkinsの環境を別のマシンにコピーして実行しようとしたが、ログインに失敗する現象が発生。
しかし、ログには何も記録されないため、何が起きているかわからない。

Jenkinsの`config.xml`でセキュリティを無効化して、PAM関連の設定を見ていたところ、`/etc/shadow`などに関する注意書きが記されていた。

1. Jenkins実行ユーザーをrootグループに設定（またはrootユーザーで起動）
1. `/etc/shadow`をJenkins実行ユーザーが読み込めるような権限を設定

と言う設定が必要だった。
（もちろん、初期導入時には読んでいて、設定していた内容である。）
git commitをhookしてUnitTestを実行

#背景
githubを立てないような一人プロジェクトでもUnitテストを導入したいなと思いたった。
完全自分用メモ。

#実装
`pre-commit.sample`を`pre-commit`にリネーム後、下記を追加

```lang:shellScript
errors=$(xcodebuild -project {対象プロジェクト}.xcodeproj -scheme {テストスキーム} -destination 'platform=iOS Simulator,name={テスト対象のシミュレータ名}' test | grep 'XCT.* failed')

if [ -z "$errors" ]; then
	echo "test Success!!!"
else
	echo "\033[0;31m ********** Test Failed ********** \033[0;39m"
	echo "\033[0;31m${errors}\033[0;39m"
	echo "\033[0;31m ********** Test Failed ********** \033[0;39m"
	exit 1
fi
```

`xcodebuild`を使ってターミナルからテストを実行、結果から「XCT(ほにゃらら) failed」を含む行を`grep`するという簡単なscriptです。

次にサンプルとして失敗するテストコードを用意。

```lang:swift
    func testExample() {
        XCTAssert(false, "test failed")
    }
```

#実行結果

ターミナルから、`git commit`を行うとテストが実行されます。
テストに失敗した時は下記の形でターミナルに表示されます。

![sc.png](https://qiita-image-store.s3.amazonaws.com/0/61909/7d71b45b-3612-cb71-1a6c-526649cd0ab3.png)
エラー文言の中黒を中央揃えにするには

現在Java、Seasar2(SAStrats/S2JDBC)、JSP、PostgreSQLで
DBを使ったWebアプリケーションを作っています。

Bootstrap3でログイン画面を再構築しています。

そこで質問があるのですが
結論から言うと

**エラー文言の中黒を中央揃えにするにはどうしたらいいでしょうか？**

今の状況として下記のように赤い中黒だけが左にある状態です。文言は中央なのに。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/60528/d9882e22-37f8-312b-59b6-6f9052b9a3ba.png)


この中黒を中央揃えにしたいです。
&lt;div Align="center">タグを使ったりしたのですが、中黒だけは中央に行きません。

ソースは以下です。

```rba:login.jsp
<body>
<s:form action="verify">
<header id="top" class="header">
<div class="text-vertical-center">
<h1>Tennis DataBase</h1>
<br>
<div Align="center"><html:errors /></div>
<div Align="center"><html:text styleId="hoge" property="loginId" styleClass="form-control" style="width:250px;"/></div><br>
<div Align="center"><html:password styleId="hoge2" property="password"  styleClass="form-control" style="width:250px;"/></div><br>
<html:submit value="ログイン" styleClass="btn btn-dark btn-lg"/><br><br>
<s:link href="./registPage">アカウント登録はこちら</s:link>
</div>
</header>
</s:form>
</body>
```

もしわかる方がいれば教えて頂きたいです。
レスポンシブに対応した画像内リンク (イメージマップ) のやり方

備忘録として。

イメージマップは、画像を埋め込むimg要素、マップを定義するmap要素、リンク領域を設定するarea要素、この3種類の要素で構成されている。

<ポイント>
・map要素の座標指定は画像の左上が(0,0)で基準となる

```html

<img src="hoge/img1.png" height="193" width="560" alt="hogehoge" usemap="#button">

<map name="button">
  <area shape="rect" coords="0,84,800,250" href="http://www.testhomepage.html" alt="testhomepage" target="_blank" >
     </map>

```

又、レスポンシブ対応させる場合は
jquery.rwdImageMaps.js を使用すると簡単にできる。

その際iPhoneのchromeでリンクが効かなくなる対応として、

```html

<img src="hoge/img1.png" height="193" width="560"

```

のように横・縦幅を必ず指定する。CSSで指定したところ
ダメだったので必ずHTMLファイル上で指定しましょう。
HomebrewをBrewfileにdumpして楽々お引っ越し


# あいさつ

Macの引っ越しをするときに、`Homebrew`公式から提供されている`brewdle`（RubyでいうBundlerの様なもの）のdump機能を使いましたらちょっと気持ち良かったので紹介します.

(brew-caskを使用している場合はcaskのも含まれます！）

# brewdler

`brewdler` をまだ導入していない場合は

    $ brew tap Homebrew/brewdler

でOK

brewdleっで語呂が悪い気が

# brewdler dump

    $ brew brewdle dump 

`Brewfile` というファイルが吐き出される


    $ less Brewfile

```:Brewfile
tap 'caskroom/cask'
tap 'homebrew/brewdler'
tap 'komagata/mycask'
tap 'peco/peco'
brew 'ansible'
brew 'autoconf'
brew 'brew-cask'
brew 'chromedriver'
brew 'cloog'
brew 'cmake'
brew 'curl'
brew 'dirmngr'
brew 'emacs'
brew 'ffmpeg'
brew 'ffmpeg2theora'
brew 'freetype'
brew 'gcc'
brew 'gdbm'
brew 'ghc'
brew 'git'
brew 'gmp'
brew 'gnupg'
brew 'gnupg2'
brew 'gpg-agent'
...
```


おお、アルファベティカルに並んでる


# brew brewdle


あとは新しいパソコンなどにBrewfileを移して要らないもの消すなり適当にやって


    $ brew brewdle


`brew list` で確認

    $ brew list

```
ansible		ffmpeg		gnupg2		libgpg-error	libvorbis	phantomjs	redis		xvid
autoconf	ffmpeg2theora	gpg-agent	libksba		libyaml		pidof		ruby-build	xz
brew-cask	freetype	imagemagick	libmpc		memcached	pinentry	scala		z
chromedriver	gcc		isl		libogg		mongodb		pkg-config	sqlite
cloog		gdbm		jpeg		libpng		mpfr		postgresql	theora
cmake		ghc		lame		libtool		node		pth		tmux
curl		git		libassuan	libusb		openssl		python3		tree
dirmngr		gmp		libevent	libusb-compat	ossp-uuid	rbenv		wget
emacs		gnupg		libgcrypt	libvo-aacenc	peco		readline	x264
```

ふむ！
Google Siteの更新通知をGmail経由でSlackに流す

Google Siteはどうにも放置気味っぽく、APIもよくわからないし他サービスとの連携がしづらくて困る。

なんとか更新情報流せないかなあと思ってたのですが、うまい方法が思いつかなかったので、荒業で何とかしました。
※追記
インターネットに公開しているのであれば、RSS取得により情報を流せるようですが、非公開サイト（ログインが必要）の場合の方法が思い浮かばなかったので、下記のような面倒なことをしています。
いい方法があれば知りたい…。

# ざっくりと手順

1.Google Siteで「サイトの変更通知」をオンにする
2.IFTTTで、Gmailに通知されたメールの内容をSlackに通知する

こんな感じで1段噛ませます。

# サイトの変更通知をオンに

Googleサイトの画面右上ぐらいに歯車のアイコンがあるので、それをクリックするとダイアログが出てきます。
その中から「サイトの変更通知を受け取る」をクリック
※「ページの変更通知」もありますが、こちらは今表示しているページのみの通知です。
特定のページのみ通知したい場合はそちらでやるといいかもしれません。

「サイトの変更通知を受け取らない」となっていた場合、既に通知が飛ぶ状態になってます。念のため。

# IFTTTを使う

https://ifttt.com/ という、異なるサービス同士を連携させられるサービスがあります。
ざっくりとした説明だけど、細かくは見てください。

IFTTTのレシピとして、THENにGmail、THATにSlackを選択します。
Gmailの側では、「New mail in inbox from search」を選択。
検索条件に「from:（Siteの名前）」を使って、該当のSiteから通知されるメールのみが対象になるようにします。
※Siteの変更通知の差出人名はそのSiteの名前になるみたいです。

あとはSlackの側の設定で、通知したいChannelを選択。
Messageの項目に通知させたい内容を記載すればOK。
とりあえずSubject、必要に応じて本文を入れておけばいいかなと思います。

# 課題

とりあえず、これで通知させることはできなくはないのですが、以下が課題です。

- メールが減らせない
    - 特定の人物にメールを飛ばすので人依存になるのも微妙。
- 本文を通知させても日本語がSlack側に表示されない
    - 日本語部分が全部見えないのでわけのわからない内容が通知されます。

メールを飛ばすのはもう我慢するしかないのかな…と思ってますが、2つ目についてはどうにかしたいなあ、と。

GASでサイトの更新履歴ページが更新された時、更新内容をチェックして、PlainTextでメール通知させる、みたいなことできないかなあと。
せめて誰がどこを更新したかぐらいはわかるようにできればなあと思ってます。
Slackで二段階認証(Two Factor Authentication)を有効にする


社内向けに書いたやつをそのまま流用。

# 二段階認証とは
一般的な認証方法だとユーザ名、パスワードが不正使用される他者にログインされてしまう。
これらの二段階認証のステップを設定することにより、ログイン時にユーザ名+パスワードに加えて携帯端末本体が必要になるため、アカウントの個人情報を他者に盗まれる可能性が大幅に少なくできる。

# 設定手順

### 1. 二段階認証を行うトークンアプリをインストール
デバイスごとに、それぞれ以下の中から1つ任意のものを選択してインストールする
既にインストールしてある場合は既存のものを使用できます。

- iPhone: [Google Authenticator](https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8)  [1Password](https://guides.agilebits.com/1password-ios/5/en/topic/setting-up-one-time-passwords) [Authy](https://itunes.apple.com/us/app/authy/id494168017?mt=8)

- Android: [Google Authenticator](https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8) [Authy](https://itunes.apple.com/us/app/authy/id494168017?mt=8)

- Windows Phone: [Microsoft Authenticator](https://www.windowsphone.com/en-us/store/app/authenticator/e7994dbc-2336-4950-91ba-ca22d653759b)

### 2. 二段階認証を有効にする
以下のURLにアクセスし、パスワードを入力して設定画面へアクセスする。
https://slack.com/account/settings#two_factor

![kobito.1427677873.029927.png](https://qiita-image-store.s3.amazonaws.com/222/20074/43d5ad99-da0f-94dd-7ea6-48d5fd3b16da.png "kobito.1427677873.029927.png")

QRコードが表示されるので、インストール済の二段階認証トークンソフトウェアからQRコードを読み取る。

![Account_Settings___ponshu_Slack.png](https://qiita-image-store.s3.amazonaws.com/222/20074/01840540-4ad1-fcf7-dc78-81f4b244e9db.png "Account_Settings___ponshu_Slack.png")

読み取った端末側に6桁の数字が30秒ごとに切り替わって表示される。

![kobito.1427678482.823265.png](https://qiita-image-store.s3.amazonaws.com/222/20074/a99f6743-f167-bdbe-d152-c258e751568d.png "kobito.1427678482.823265.png")

上記で現在表示されている数字を、以下の `Entery Verification Code` に入力し、設定を完了する。

![kobito.1427678550.450745.png](https://qiita-image-store.s3.amazonaws.com/222/20074/597edf3f-bebc-b27b-8887-15c24b46afcd.png "kobito.1427678550.450745.png")

設定完了後、設定画面に `You have 10 unused backup codes` という項目と共に9桁の数字が10個表示される。
これはデバイス紛失などで二段階認証できずログインできなくなってしまった時のログインなどに使用するコードとなるので安全な場所に控えておく。

### 3. 再度ログインする
二段階認証を有効にすると、現在のセッションからログアウトされるので、再度ログインする。

ログインしようとすると、 `two factor authentication code` を求められるので、先ほどの二段階認証アプリを確認し、6桁の数字を入力してログインする。

![kobito.1427678786.043070.png](https://qiita-image-store.s3.amazonaws.com/222/20074/1c5f60e8-5ddc-59a7-38f8-bbb24df08bc4.png "kobito.1427678786.043070.png")


設定手順の引用元: https://slack.zendesk.com/hc/en-us/articles/204509068-Enabling-two-factor-authentication
Crashlyticsが勝手に追加したREAD_PHONE_STATE権限を削除する方法

先日CrashlyticsとAndroidStudioをアップデートすると突然 ```READ_PHONE_STATE``` 権限が付いてしまって驚きました。

具体的には勝手に下記の権限が付くようです。

```xml
    <android:uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />
    <android:uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <android:uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />
```

自分のアプリでは元々 ```WRITE_EXTERNAL_STORAGE``` と ```READ_EXTERNAL_STORAGE``` を付けていたので ```READ_PHONE_STATE``` が追加されてしまいました。

Crashlyticsの動作自体にはこれらの権限を削除してしまってもかまわないようなのでGradleの機能でさくっと削除します。

```xml
    <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
```

```[ProjectRoot]/app/build/intermediates/manifests/full/[Flavor]/release``` にある AndroidManifest.xml を確認すると確かに削除されていました。


# 参考

- [android - unrequested permissions not declared in androidmanifest--crashlytics maybe? - Stack Overflow](http://stackoverflow.com/questions/27410382/unrequested-permissions-not-declared-in-androidmanifest-crashlytics-maybe)