OmniAICreator/Qiita-1.07M huggingface dataset:
UIButtonやUILabelなどのテキストにアニメーションをつける

今回は、CAAnimationを用いてUIButtonやUILabelなどのテキストにアニメーションをつけるやり方を紹介したいと思います。今回の記事が初投稿になりますので、何か気になる点があれば気軽にコメントください。

# 実装
CAAnimationを用いることによって、テキストでも色々なアニメーションをつけることができます。実装の流れは以下の通りです。今回はUIButtonを例に紹介したいと思います。

1. UIButtonのテキストをCATextLayerに置き換える
2. CAAnimationでアニメーション

## UIButtonのテキストをCATextLayerに置き換える
まずはCAAnimationを使うためにCALayerクラスを継承しているCATextLayerをUIButtonのテキストと置き換えます。UIButtonの継承クラスでも作ってTitle系のメソッドをオーバーライドしてあげるといいんじゃないでしょうか。

```swift
public class MyButton: UIButton {

・・・

    override public func setTitle(title: String?, forState state: UIControlState) {
        super.setTitle(title, forState: state)

        self.setTitleColor(UIColor.clearColor(), forState: state)
        self.setTextLayerToLayer()
    }

    override public func setTitleColor(color: UIColor?, forState state: UIControlState) {
        super.setTitleColor(UIColor.clearColor(), forState: state)
        self.textLayer.foregroundColor = color?.CGColor
    }
```

UIButtonのタイトルの色をclearColorに設定してあげて、その上にCATextLayerをセットしていきます。

```swift

private let textLayer = CATextLayer()

・・・

private func setTextLayerToLayer() {
        let font = self.titleLabel?.font
        let text = self.currentTitle
        
        var attributes = [String: AnyObject]()
        attributes[NSFontAttributeName] = font
        let size = text!.sizeWithAttributes(attributes)
        
        let x = (CGRectGetWidth(self.frame) - size.width) / 2
        let y = (CGRectGetHeight(self.frame) - size.height) / 2
        let height = size.height + self.layer.borderWidth
        let width = size.width
        
        textLayer.frame = CGRectMake(x, y, width, height)
        textLayer.font = font
        textLayer.string = text
        textLayer.fontSize = font!.pointSize
        
        textLayer.contentsScale = UIScreen.mainScreen().scale
        
        textLayer.alignmentMode = kCAAlignmentCenter
        self.later.addSublayer(textLayer)
    }
```

CATextLayerをButtonのLayer上に中央揃えで配置します。CATextLayerのFontは元のFontと合わせることでFontの違いによるずれを防ぎます。

（CATextLayerの上下中央揃えは http://qiita.com/morizotter/items/1a89bc60ba870a51d251 を参照）

## CAAnimationでアニメーション

CAAnimationでCATextLayerにアニメーションをつけます。文字色が点滅するようなアニメーションにしています。

```swift
public func animateText() {
        let textColorAnimation = CABasicAnimation(keyPath: "foregroundColor")
        textColorAnimation.duration = 2.0
        textColorAnimation.autoreverses = true
        textColorAnimation.repeatCount = 1e100
        textColorAnimation.fromValue = UIColor.clearColor().CGColor
        textColorAnimation.toValue = self.blackColor().CGColor
        textLayer.foregroundColor = self.blackColor().CGColor
        textLayer.addAnimation(textColorAnimation, forKey: "TextColor")
    }
```

# 最後に
CAAnimationを用いてテキストにアニメーションをつける方法を紹介しました。
同じような方法でUILabelなどのテキストもアニメーションをさせることができると思います。CAAnimationを用いることで他にも移動や回転などのアニメーションもできるので色々試してみるといいと思います。
代入と出力

Playgroundで打ち込んでみよう！

##例題：hello world

```swift
print("Hello World!")
```

##例題：変数への代入と出力

```swift
var a = 1
print(a)

a = 3
print(a)
```

##例題：四則演算

```swift
var a = 4
var b = 2

//加算
print(a + b)

//減算
print(a - b)

//乗算
print(a * b)

//除算
print(a / b)

//余り
a = 5
print(a % b)
```


##例題：比較演算

```swift
var a = 4
var b = 2

//より小さい
print(a < b)

//以下
print(a <= b)

//より大きい
print(a > b)

//以上
print(a >= b)

//等しい
print(a == b)

//等しくない
print(a != b)

```
c++ builder XE4, 10.2 Tokyo > Components[] > FindComponent()はif(Components[idx]->Name == aName)より速い

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

ふと疑問に思ったのは`FindComponent()`を使う場合と、`Components[idx]->Name`をチェックするのとどちらが速いのかということ。

以下を実装した。

```cpp
void __fastcall TPDF_options2::Button1Click(TObject *Sender)
{
	int num = ComponentCount;

	String name = L"P03BL6";
	TComponent *ptr;

	String msg;
	int maxLoop = 10000;

	DWORD start,duration;

	// 1.
	msg = L"";
	OutputDebugString(Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz").c_str());
	start = GetTickCount();
	for(int loop=0; loop < maxLoop; loop++) {
		ptr = FindComponent(name);
		if (ptr != NULL) {
			msg = msg + L";";
		}
	}
	OutputDebugString(Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz").c_str());
	OutputDebugString(msg.c_str());

	// 2.
	msg = L"";
	OutputDebugString(Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz").c_str());
	for(int loop=0; loop < maxLoop; loop++) {
		for(int idx=0; idx < ComponentCount; idx++) {
			if (Components[idx]->Name == name) {
				String res = Components[idx]->Name;
				msg = msg + L".";
				break;
			}
		}
	}
	OutputDebugString(Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz").c_str());
	OutputDebugString(msg.c_str());
}
```

条件として、フォームのコンポーネント数は651個。
`P03BL6`というコンポーネントはComponents[]の真ん中に来るものを選択。


結果
![FindComponent.png](https://qiita-image-store.s3.amazonaws.com/0/32870/82dae84f-212c-5db8-37fd-ec4e71b35807.png)

- FindComponent() : 11msec
- Components[idx]->Name比較 : 47msec

FindComponent()は実装が楽かつ処理も速いことがわかった。
Network APIを作成するための環境構築（Ruby、Sinatra、ActiveRecord）

# マシン環境

```bash
cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```

# Rubyインストール
CentOSのdefaultのrubyのバージョンは一旦古いため、削除 :triumph: 
`yum remove ruby`

Rubyソースのコンパイルのために下記をインストール
`yum -y install gcc zlib-devel openssl-devel sqlite sqlite-devel mysql-devel readline-devel libffi-devel`

Ruby2.2.3をインストール（結構時間かかる :sleeping: ）

```
cd /usr/local/src
wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz
tar zxvf ruby-2.2.3.tar.gz
cd ruby-2.2.3
./configure
make
make install
```

確認 :satisfied: 

```
ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
```

# MySQLインストール
`yum -y install mysql`
確認（MariaDBになってる :laughing: ）

```
mysql --version
mysql  Ver 15.1 Distrib 5.5.44-MariaDB, for Linux (x86_64) using readline 5.1
```

これも必要っぽい。
`yum install mariadb-server`

```
systemctl enable mariadb.service
systemctl start mariadb.service
```

初期パスワード設定
`/usr/bin/mysqladmin -u root password 'new-password'`

初期設定
`mysql_secure_installation`

# Sinatra、Nokogiri、Netconfなどなどのインストール

そこそこ時間かかります :sleeping: 

```
gem install sinatra
gem install netconf
gem install nokogiri
gem install activerecord
gem install mysql2
gem install netaddr
gem install sinatra-contrib
gem update
gem update --system
gem uninstall mysql2  #(0.4.1)
gem install mysql2 -v 0.3.20
```

mysql2のバージョンが新しいと上手く動かなかったので、0.3.20に落とした :astonished: 
updateも一応した :dash: 
NetAddrはあんまり使ってる人いなさそうな感じですが、すごく便利 :kissing_heart: 

[こちらのQiita記事](http://qiita.com/inoueissei/items/f2d695087c2f61f5bb1b)もご参考に
Rails activeadmin enumを設定したモデルを登録する方法

activeadminを導入して、データを登録しようとしたらエラーが出たので、対処法を記す。

activeadminのインストールは省略する。
`Anime`をactiveadminの管理下に置く。

```
$ bin/rails g active_admin:resource Anime

```

```ruby:app/admin/anime/rb
ActiveAdmin.register Anime do

  permit_params :title, :update_wday

end
```

`Anime`にはenumが設定されている。
`update_wday`は更新曜日を意味する。

```ruby:app/models/anime.rb
class Anime < ActiveRecord::Base
.
.
.
  enum update_wday: {
    sunday: 0,
    monday: 1,
    tuesday: 2,
    wednesday: 3,
    thursday: 4,
    friday: 5,
    saturday: 6
  }
.
.
.
end
```

上記のように設定すると、下記のような画面になる。

![スクリーンショット 2015-10-30 11.25.48.png](https://qiita-image-store.s3.amazonaws.com/0/74602/e033b8a9-bd56-34d2-c9b3-5c8372ac9f41.png)

`Create Anime`をクリックすると下記のようなエラーが出る。

![スクリーンショット 2015-10-30 11.29.48.png](https://qiita-image-store.s3.amazonaws.com/0/74602/0a50e505-d250-babb-0d78-c4550ccbcde8.png)

enumのキーをPOSTしてやればよいので、下記のような設定を加える。

```ruby:app/admin/anime/rb
ActiveAdmin.register Anime do

  permit_params :title, :update_wday

  form do |f|
     f.inputs "Anime" do
       f.input :title
       f.input :update_wday, as: :select, collection: Anime.update_wdays.keys
     end
     f.actions
   end
end
```

![スクリーンショット 2015-10-30 11.40.17.png](https://qiita-image-store.s3.amazonaws.com/0/74602/65d7b6de-47dc-e550-6478-911eaeff3a3c.png)

これでデータが登録できるようになった。
以上。
iPhone iPad のシミュレータが起動しなくなったら……

Xcodeのバージョンアップをしたり、ユーザのアカウント名を変えたりと、いろいろ環境を変更していました。
そんななかで経験したことの一つを、備忘録兼ねて書いておきます。
（開発経験が浅いので、こんなことでも初体験…）

# The file “Logs” couldn’t be saved in the folder “ライブラリ” because a file with the same name already exists.

iOSのシミュレータを起動してしばらくすると、このメッセージが表示されました。
これが出てしまうと、黒い画面からまったく起動する気配がなくなります。

言わんとしていることはわかる。
>
*ライブラリフォルダに、Logsっていうファイルが既に存在しているから、保存できないっす。*

とはいえ、これに対する解決策を全く提示してくれない。

# iOS Simulator > Reset Content and Settings...

簡単です。左上のメニューから、iOS Simulator > Reset Content and Settings...をするだけです。
簡単すぎます。これで一件落着。

困ったときの、stackoverflowでしたが、
むしろQiitaにも既に投稿されていたんじゃないだろうかと思っちゃいます。
そう思いながら、自分でも備忘録として書いておきます。

参考：
[StackOverflow: Can't run iPhone simulator - file “Logs” couldn't be saved](http://stackoverflow.com/questions/27661598/cant-run-iphone-simulator-file-logs-couldnt-be-saved)
[ZEN WORKS: The file “Logs” couldn’t be saved in the folder エラー対処法](http://www.zen-works.net/app-blog/78)
RedHatでgem時にzlib ERRORが発生する

RedHat7.1の環境で`gem install`しようと思ったらzlib周りでトラブルがあったのでTipsです。

##発生したエラー

```
ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ...(NameError) uninitialized constant Gem::Commands::InstallCommand
```


##事前にやっておくこと

```
yum -y remove ruby
```

RedHat公式のRubyではzlibがリンクされていないようなので、削除しておきます。

##導入手順

###zlib導入

```bash
yum -y install gcc zlib zlib-devel
```

※opensslエラーもあった場合は`yum -y install gcc zlib zlib-devel openssl openssl-devel`となります

###rubyインストール

[Rubyページ](https://www.ruby-lang.org/ja/downloads/)より最新版のパスを取得


```bash
cd /usr/local/src
wget (パスを貼り付け)
tar xvfz ruby-*.tar.gz
```

### Rubyからzlibを使えるように

```bash
cd ruby*/ext/zlib
ruby extconf.rb

cd /usr/local/src/ruby*
./configure
make; make install
```

###バージョン確認

```
ruby -v
```

###gem導入

```
yum -y install gem
```

これでgemが使えるようになりました！


##参考にしたサイト

* [CentOSに ruby と gem と chef をインストールする](http://nijilog.info/2014/06/16/325)
* [Ruby を使っていて「no such file to load --zlib | readline | openssl」エラーに遭遇したときの対処](http://blog.inouetakuya.info/entry/20120320/1332243950)
* [Rubyを最新ソースからインストール](http://centos.bungu-do.jp/archives/34)
* [CentOS に最新版 Ruby on Rails をインストールする](http://blog.akagi.jp/archives/517.html)
naming > 1文字のループ変数を使わない理由 > Ctrl+Dで無関係のものを拾うため > idx / loop / ci, pi

```txt:動作確認
Sublime Text2 on Window 7pro
```

```
for (int i=0; i<ComponentCount; i++) {
  if (/* ある条件 */) {
    return i;
  }
}
```

上記のコードで最初のiにフォーカスをあわせて Ctrl+Dで順次iを拾おうとすると、`if`のiまでひかっかってしまう。
また、`for(int j=0;...)`が中にあると、`int`の`i`も拾われる。

こうならないように自分の中のループ変数のルールは以下

- idx : 配列のインデックスとして使う
- loop : ただの繰り返し処理時に使う
- ciやpiなど : index of cxxx, index of pxxx (参照:Readable Code)

変数iをダブルクリックして使用している箇所のハイライトする場合には上記の問題はおきないが、ループ変数名の変更などのリファクタリング時には`i`では作業しにくい。
WordPress で Notice: Use of undefined constant WPLANG - assumed 'WPLANG' と言われる解決方法

初期状態ではじめたWordPressでNoticeエラーがでて困るまん(☝ ՞ਊ ՞)

# WordPressでエラー
WordPressを起動したところエラーが出ます。

```
( ! ) Notice: Use of undefined constant WPLANG - assumed 'WPLANG' in /var/www/wordpress/wp-content/plugins…
```
WPLANGがないと言われました。

# WPLANGを設定する
wp-config.phpを編集します。

```php:wp-config.phpにWPLANGを追加
define ('WPLANG', 'ja');
```
WPLANGの定義を追加しました。

# エラーが消えました
やったね(☝ ՞ਊ ՞)


# 参考
https://wordpress.org/support/topic/undefined-constant-wplang-error-showing
kibana4 nginxのアクセスログをレスポンスタイム別でグラフ化する

# 最終形 nginxパフォーマンスグラフ

こんな感じのグラフを作成する事がゴール。
nginxのアクセスログを集計して、request_timeの範囲毎に色分けしてグラフ化したい。

- 遅いレスポンスが全体のどのくらいを占めているか
- 特定の時間だけ遅いなどが起きていないか
- 長期的にレスポンスの悪化が起きていないか
- deploy直後でレスポンスが悪くなっていないか
- 障害時のユーザー影響の直感的な理解

とか、色々と確認する時に見える化しておく事は重要。

![スクリーンショット 2015-10-30 10.12.15.png](https://qiita-image-store.s3.amazonaws.com/0/62421/bd11d432-2e2f-9f6d-7eb8-12ec461af8a9.png "スクリーンショット 2015-10-30 10.12.15.png")

# 手順
## Visualizeでグラフを作成
### グラフタイプを選択
今回は、Vertical bar chartで作成する。
新しいクエリを作成するので、次の画面では、From a new searchを選択する。
![スクリーンショット 2015-10-30 10.19.19.png](https://qiita-image-store.s3.amazonaws.com/0/62421/d63bcce8-ae7e-e460-3e60-4db3ee37596a.png "スクリーンショット 2015-10-30 10.19.19.png")

### X軸を設定
Select buckets typeのX-Axisを選択して、AggregationにDate Histogramを指定する。
Applyを押すと反映されるが、この時点では全ログが一色で表示されている状態になる。
![スクリーンショット 2015-10-30 10.24.40.png](https://qiita-image-store.s3.amazonaws.com/0/62421/b859ec10-c0c6-e0d5-4f2b-42f9561fed1a.png "スクリーンショット 2015-10-30 10.24.40.png")

### グラフにフィルターを適用する
kibana3とここが大きく変わった気がするが、ここでAdd Sub Aggretationを選択、Split Barsを選ぶ。
Split Barsなので条件によってBarを分割する事が出来る。
Sub AggregationはFiltersを選び、Queryを入れるところが出てくるのでここに条件を入れる。
今回は、request_time毎にQueryを設定しているので以下のように8個のQueryを入れた。ここは分割したい条件で色々と変えられる。
![スクリーンショット 2015-10-30 10.28.45.png](https://qiita-image-store.s3.amazonaws.com/0/62421/d0772c49-c460-4a77-eb05-52c24de5f19e.png "スクリーンショット 2015-10-30 10.28.45.png")

しかし、これ、普通にクエリをappendする様な方式じゃ駄目だったんだろうか。以前まではそんな方式だったと思うんだが。。。
実はそっちのやり方もあるのだろうか。ご存知の方いましたら教えてください。

### 保存
ここまで来たら、右上の保存アイコンで保存する。
(保存アイコンていつまでフロッピーなんだろうか。。。)

## Dashboardに貼付けて保存
Dashboardに移動すると、プラスボタンで先ほど保存したグラフが選べるので選択して表示する、マウスで動かせたり大きさを変更出来たりしてここはkibaba3に比べると相当便利になっていると感じる。

# 環境
今回は自分で色々と設定するのが面倒だったので、AWSのelasticsearch serviceを利用。
当初の想定だと、elasticsearchだけ提供されていると思ったらが、kibanaも付いてきて感動した。
インフラエンジニアのお仕事が無くなる一方だが、本来のパフォーマンスのチェックとチューニングというお仕事に時間を使えてありがたい。

nginxのログは、各webサーバーでltsvで出力して、fluentdでelasticsearchに突っ込んでいる。
elasticsearchに突っ込むまではこの辺りが詳しく書いてある。
http://blog.zoncoen.net/blog/2013/11/11/logging-system-with-fluentd-elasticsearch-kibana3/

# まとめ
kibana3の黒い画面に慣れていて最初は戸惑うが、4もなかなか色々と設定出来たり相変わらずUIはカッコいいので使い倒したらもっと良くなるのではないかなと思う。
renderとredirect_toの違い

`render`はインスタンス変数を持ち回せるが、
`redirect_to`は作り直し。

ではどいうときに`render`を使えば良いだろうか？
一般的には`def update`で失敗したときに`render :edit`を呼ぶ。

そうすると、`update()`で更新されたモデルを使いまわせる。

ここを`redirect_to`にしてしまっていると、新しくインスタンスが作られてしまうので、ユーザが入れた情報（例えそれがupdateに失敗するデータであっても）が消えてしまう。失敗する情報は残ったままの方が間違っている箇所がわかったり、一度入れたデータが消えたりしないので、ユーザには`render`の方が便利だ。

## 参考
[【Rails】renderとredirect_toの違い - avosalmonのブログ](http://avosalmon.hatenablog.com/entry/2014/05/17/%E3%80%90Rails%E3%80%91render%E3%81%A8redirect_to%E3%81%AE%E9%81%95%E3%81%84)
slackのチャンネル表示を従来通りに戻したい(privateとpublicを分けたい)

slackのバージョンアップ(2015/10/28)   
それにより、privateチャンネルとpublicチャンネルがごちゃ混ぜになって見えにくくなった

戻したかったので、以下の設定をやると戻る

`Preferences > Advanced Options > List public and private channels separately`

![スクリーンショット_2015-10-30_10_10_56.png](https://qiita-image-store.s3.amazonaws.com/0/10333/a0920e11-1362-2f01-d6e0-6e92eb9d5aa8.png)
c++ builder / naming > 02Main.cpp > 有効な識別子ではありません。IDEで管理されるユニットのルートファイル名は有効な識別子でなければなりません。

```txt:動作確認
C++ Builder XE4
```

複数のプロジェクトをプロジェクトグループで管理する時、それぞれのプロジェクトに属するということがわかるようにファイル名を付けようとした。

2つめのプロジェクトのMainユニットを`02Main.cpp`のようにしようとすると以下のようにエラーとなった。

> 有効な識別子ではありません。IDEで管理されるユニットのルートファイル名は有効な識別子でなければなりません。

2つのプロジェクトのソースファイルを１つのフォルダで管理するのが間違いなのかもしれない。
2つめのプロジェクトのソースを別フォルダに入れるなどの工夫が必要がなのかも。そうした場合のデメリットなどは要検討。
RubyとPerlの違い

## map
### Perl

```
use strict;
use Data::Dumper;

my @x;
my @y = map { $_ * 2} @x;
print Dumper @y;
```
結果：なにも表示されない

### Ruby
**定義されてない系エラー**

```
x;
y = x.map{|o| o * 2}
p y
```
結果：
>r.rb:1:in `<main>': undefined local variable or method `x' for main:Object (NameError)

**nil系エラー**

```
x = nil;
y = x.map{|o| o * 2}
p y
```
結果：
>r.rb:2:in `<main>': undefined method `map' for nil:NilClass (NoMethodError)

**解決**

```
x = nil
y = (x||[]).map{|o| o * 2}
p y
```

結果：
> []

**こっちはエラー内容変わらず**

```
x
y = (x||[]).map{|o| o * 2}
p y
```

### x と x=nilの違い
#### x
エラーメッセージを読むに、`main:Object`らしい。
**（下のほう書いてて思ったがこれは違うな）**

#### x = nil
エラーメッセージを読むに、`nil:NilClass`らしい。

**インスタンス変数だと？**

```
class Hoge
  attr_accessor :foo
  def initialize()
    @foo
  end
end

hoge = Hoge.new()
hoge.foo.map {|o| o * 2}
```
結果：
> r.rb:7:in `<main>': undefined method `map' for nil:NilClass (NoMethodError)

`hoge.foo`は`nil:NilClass`らしい。　なんで？？

<br />

```
class Hoge
  attr_accessor :foo
  def initialize()
    @foo
  end
end

hoge = Hoge.new()
p (hoge.foo||[]).map {|o| o * 2}
```
結果：
> []

### インスタンスメソッドで呼ぼうとやっぱりNilクラス
```
class Hoge
  attr_accessor :foo
  def initialize()
    @foo
  end

  def double
    @foo.map{|o| o * 2}
  end
end

hoge = Hoge.new()
hoge.double
```

### インスタンスメソッドで存在しない変数を使うと？
```
class Hoge
  def double
    bar.map{|o| o * 2}
  end
end

hoge = Hoge.new()
hoge.double
```
結果：
> r.rb:3:in `double': undefined local variable or method `bar' for #<Hoge:0x007f964c1152d0> (NameError)
	from r.rb:8:in `<main>'

## 動作からわかること
[変数と定数 (Ruby 1.9.3)](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fvariables.html)
> 初期化されていない インスタンス変数を参照した時の値はnilです。

初期化されてないただの変数は`main:Object`の定義されてない変数？？
Aptana Studio インストールができないときの解決法(Node.jsインストール不要）

Aptana Studioをインストールしようとした際、
次のエラーが発生してインストールに失敗しました。

```
Error 4155. Failed to correctly acquire installer_nodejs_windows.msi
```

エラーの内容をみるに、nodejs_windows.msiが
存在しないからインストールを続行できないみたい。

ググってみると、nodejsとgitをインストールすると
解決するとの情報が。しかし結果は同じく。

そんなときはこうしてみると解決するかもしれません。
私は解決しました。

1.コマンドプロンプトを開く（ファイル名を指定して実行→cmd）

2.コマンドラインに次のコードを入力してEnter ※1 , ※2

```
Aptana_Studio_3_Setup_3.6.1 /passive /norestart
```

3.成功

なお、当方の環境は Win7 x64, ruby 2.1.6p336 です。

---
追記

※1
_3.6.1の部分はバージョン情報。各自のいれたいバージョン名をいれてください

※2
そのインストールしたいファイルのあるディレクトリに移動してから実行してください。たとえばダウンロードしてきたexeファイルがデスクトップにあるのであれば、次のような感じです

```
cd C:\Users\(ユーザー名)\Desktop
```
$HOMEにgoをインストールしてからgo getが使えるようになるまで

homebrewのinstall先が`$HOME`だったせいでハマった

```bash
# homebrewでinstall
brew install go
# goはここに入った
$HOME/homebrew/opt/go/libexec/bin/go
```

- カスタムインストールしたので`GOROOT`の設定が必要
- `GOPATH`はどこにインストールしても必要

```zsh:.zshrc
# GOPATH, GOROOT
export GOPATH=$HOME/go
export GOROOT=$HOME/homebrew/opt/go/libexec

export PATH="$GOPATH/bin:$PATH"
export PATH="$GOROOT/bin:$PATH"
```

- `GOROOT=$HOME/homebrew/opt/go/`ではダメだった
    - `go get`したパッケージが依存してる標準パッケージを探せないらしい。


## 公式documentには書いてあった

[Getting Started - The Go Programming Language](https://golang.org/doc/install)
ググってhitした記事のやり方真似て時間ロスするより、最初から公式のdocument読めばよかった

>Installing to a custom location

>The Go binary distributions assume they will be installed in /usr/local/go (or c:\Go under Windows), but it is possible to install the Go tools to a different location. In this case you must set the GOROOT environment variable to point to the directory in which it was installed.

>For example, if you installed Go to your home directory you should add the following commands to $HOME/.profile:

>`export GOROOT=$HOME/go`
>`export PATH=$PATH:$GOROOT/bin`
>Note: GOROOT must be set only when installing to a custom location.
Commandパターンについて調べた

デザインパターン勉強の一貫として、Commandパターンについて調べたのでまとめてみました。それと、CommandパターンをRubyで書いてみました。

## Commandパターンとは
- 振る舞いに関するパターン(GoF)
- 動作とそれに伴うパラメータをカプセル化したもの
- あるオブジェクトに対してコマンドを送ることでそのオブジェクトのメソッドを呼び出すこと
- 命令・操作をクラス(オブジェクト)で表現し、オブジェクトを切り替えることで操作の切り替えを実現する
- 命令を実行する

## Commandパターンのメリット
- 既存のコードを修正することなく機能拡張できること
- クラスの再利用性を向上させること

## Rubyで書いてみた

Command(命令)

```rb
class BattleCommand
  def initialize
    @battle = BattleReceiver.new()
  end
  def battle()
  end
end
```

ConcreateCommand(具体的な命令)

```rb
class Fight < BattleCommand
  def battle()
    @battle.battle_fight
  end
end

class Magic < BattleCommand
  def battle()
    @battle.battle_magic
  end
end

class Flee < BattleCommand
  def battle()
    @battle.battle_flee
  end
end
```

Receiver(受信者)

```rb
class BattleReceiver
  def battle_fight
    puts 'Fight'
  end
  def battle_magic
    puts 'Magic'
  end
  def battle_flee
    puts 'Flee'
  end
end
```

Invoker(起動者)

```rb
class Controller
  def fight
    battle(Fight.new)
  end
  def magic
    battle(Magic.new)
  end
  def flee
    battle(Flee.new)
  end

  private

  def battle(command)
    command.battle
  end
end
```

Client(依頼者)

```rb
class BattleClient
  def initialize()
    @controller = Controller.new
  end
  def fight
    @controller.fight
  end
  def magic
    @controller.magic
  end
  def flee
    @controller.flee
  end
end
```

```rb
battle = BattleClient.new
battle.fight
battle.magic
battle.flee
```

実行結果

```sh
$ ruby command.rb 
Fight
Magic
Flee
```

## 参考
[命令をクラスにするCommandパターン - 感謝のプログラミング 10000時間](http://blog.codebook-10000.com/entry/20140313/1394667584)
[「Rubyによるデザインパターン」の要点と使いどころ#Commandパターン - Qiita](http://qiita.com/bisque33/items/b21feb26a3369dd10a4a#commandパターン)
[【デザインパターン】コマンドパターン - datchの日記](http://doriven.hatenablog.com/entry/2014/05/17/001248)
[コマンド Ruby 2.0.0 デザインパターン速攻習得[Command][Design Pattern] - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/ruby-design-pattern-06-command/)
スマホの画面をPCに表示させる方法

##やりたいこと
スマホの画面をPCに表示させたい

##採用した方法
1. USBでスマホをPCにつなぐ
1. [Droid@screen](http://droid-at-screen.org/)を使用 

参考
スマホの画面をパソコンで見る方法
http://www.apowersoft.jp/display-phone-screen-on-pc.html#3

インストールと書いてありますが、ダウンロードするだけで使えます。

##使用場面
開発時リモートで画面共有してる時に実機の状態を知らせたい時（エミュレーターがスペック足りなくて使えないため）

##感想
表示させるためにはスマホ用アプリもありましたが、バージョンが対応していないためこの方法をとりました。
かなり簡単！
CygwinからProxy経由でリモートサーバーにsshログインする

メモ。

# 参考

+ [いろいろProxy設定メモ](http://qiita.com/maryco/items/a0afeb1589796a81785b)

# 環境

+ Windowsにcygwinをインストールしており、そこからProxy(HTTP)経由でリモートサーバーにアクセスしたい
+ Proxyのホストはproxy.abc.def.jp、ポートは18080とする
+ リモートログインしたいサーバーホスト名はremote-host、ユーザー名はec2-user、認証は公開鍵認証で`~/.ssh/Hogefuga.pem`とする

# やってみる

+ Cygwinでconnect-proxyコマンドをインストールする。apt-cygからでもsetup.exeを開いてGUIでやるでもOK
+ `~/.ssh/config`に以下のように設定

```lang:~/.ssh/config
Host *
  ProxyCommand connect-proxy -H proxy.abc.def.jp:18080 %h %p

Host localhost 127.0.0.1
  ProxyCommand none
```

あとは以下のようにすればsshログイン可能。

```bash
$ssh ec2-user@remote-host -i ~/.ssh/HogeFuga.pem
```

TeraTermでもGUIで設定すればリモートサーバーにログインできたのでお好みで。
品質について考える

#文章のゴール
誰が・どこで・何を担保すると「品質」とやらは「保たれるのか」

#とりあえず
googleとか辞書を使わないで考えてみる。

## 品質が良くないとどうなるのか

1. 設計者の想定通りに完成したものが動かない
    →　機能・速度
1. 実装に時間がかかる＝機能の拡張性が担保されない：なんかの品質特性に絡んだ話？
2. ユーザーに受け入れられない：前よりも不便・面倒・わかりにくい・楽しくない：ユーザーを理解していない・理解してくれない
3. 予想以上に開発コストがかかる：製造品質
4. 予期していない利用に対する耐性がない・脅威に対して脆弱である

要するに、「期待通りでない」こと？

## 良い品質とは

「期待を裏切らないこと」なのか？
1.  設計者の期待
　　- 想定した動作をした製品ができるか：開発の品質
　　- ユーザーは期待通りに動いてくれるのか：ユーザーの品質
2.  開発者の期待
　　- 仕様書は十分な情報があるか:設計の品質
　　- 開発ツールは使いやすいか
　　- メンテナンス、機能追加は容易か:保守性、拡張性
3.  ユーザーの期待
　　- 使い方を迷わないか
　　- 余計な作業なしで目的が遂行されるか

この範囲だと、あまり違和感なさそう。

ここに、経営者の期待、スポンサーの期待、営業の期待など考えていくと面白いのではないか。
より多くの人の期待を満たすのが よい品質といえるかも。

ただし、セキュリティ攻撃者とかの期待は除く。


## ここで、調べてみた。

wiki によると、```ISO 9000では、「本来備わっている特性の集まりが、要求事項を満たす程度」``` とのこと

「要求事項をみたす」 と 「期待を裏切らない」 。そんなに的はずれではないですね。よかった

##　ゴール
そこで、文章を書いた目的に帰ってみる
```誰が・どこで・何を担保すると「品質」とやらは「保たれるのか」```

- 「品質」って、ターゲットが変わると当然変わる。（要求事項という考え方でも、ステークホルダーが変わると要求が変わる）「誰が」も変わるし「どこで」も変わるし「何を」もかわる
- どれだけ多くのターゲットに対しての期待をカバーするかが「より良い品質」になりそう
- ビジネスとして「品質」を考える場合、「担保対象になるステークホルダーは誰？」という事を念頭に入れると説得力が出てくる気がしてきた。
csharp > boxing型をJoin > 引数:各要素バージョン / 引数:配列バージョン 

intやfloat、stringの型が入った配列をJoinしてみる。

boxingを使う。
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_005/csharp_abc03.html


##try1 (引数に個々の要素を指定するバージョン)
http://ideone.com/tSCeoN

```csharp
using System;

public class Test
{
	public static void Main()
	{
		object []test = new object[5];
		test[0] = (int)1;
		test[1] = (float)3.14;
		test[2] = (string)"Hello!";
		
		string msg;
		msg = string.Join(", ", test[0], test[1], test[2]);
		Console.WriteLine(msg);
	}
}
```

```txt:結果
1, 3.14, Hello!
```

要素数が可変になる場合はどうするのか未消化。

`, test[0], test[1], test[2]`の部分を`test[0..2]`のような書き方にしたかったがやり方がわからなかった。


## try2 (引数に配列を渡すバージョン)
https://msdn.microsoft.com/ja-jp/library/57a79xd0(v=vs.110).aspx
を見て、一旦string[]に入れてからの処理をやってみた。

http://ideone.com/NMXEoq

```csharp
using System;

public class Test
{
	public static void Main()
	{
		object []test = new object[5];
		test[0] = (int)1;
		test[1] = (float)3.14;
		test[2] = (string)"Hello!";
		
		string [] sArr = new string [5];
		for (int idx=0; idx<3; idx++) {
			sArr[idx] = (test[idx]).ToString();
		}
		
		string msg;
		msg = string.Join(", ", sArr);
		Console.WriteLine(msg);
	}
}
```

```txt:結果
Success	time: 0.04 memory: 23912 signal:0
1, 3.14, Hello!, , 
```

Joinした時に配列のサイズ(5)まで", "付きになる点は考慮が必要。

##LINQでの処理 (別の配列不要)
別の配列を用意しなくていいエレガントな方法がozwkさんのコメントにあります。
技術英語 > meet the standard / meet the requirement / make both ends meet

@ LOE > March 30, 2012
http://loe.org/shows/shows.html?programID=12-P13-00013

以下のフレーズが耳に残った。

> So you can effectively <font color=red>meet the standard</font> by building a plant 

<hr>
関連して思い出したのは1

http://ejje.weblio.jp/content/meet+the+requirement
> meet the requirement
条件を満たす

<hr>
関連して思い出したのは2

http://ejje.weblio.jp/content/make+both+ends+meet
> make (both) ends meet
> 収支を合わせる, 収入の範囲内でやっていく.

ひもなり紙なりの両端(both ends)を合わせる(make meet)というイメージだと何かの資料で見たことがあり、そのイメージで覚えた。
シェルって貝殻じゃなくて植物の種の殻だよね

貝殻だと言う人しか見かけなくていつもモヤモヤするので書き留める。

[シェル - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB)
>シェル (shell) はオペレーティングシステム (OS) のユーザーのためにインタフェースを提供するソフトウェアであり、カーネルのサービスへのアクセスを提供する。

「シェル」だけだと何の殻なのか分からないけど「カーネル」は
「 (ウメ・モモなどの果実の核の中にある)仁(じん)」という意味だ。

梅干し食べ終わった後、種を割って仁も食べますよね。食べませんか。
ちなみに杏仁豆腐は仁を粉末にして用いた料理。

で、貝殻は身を守る為の防具だけど
種の殻は果肉と仁の間にあり養分が行き来するインタフェース(接触面)だ。
だから貝殻じゃなくて、植物の種のイメージだと思う。

と、ドヤ顏で書きましたが本当に種の殻なのかはちゃんと調べてはいないです。
でも多分貝殻じゃないと思います。思います。
xargsを使用したファイルへのリダイレクト

性能試験でログを取得する際に、複数のサーバから各ログを取得し、
ログごとにまとめたいと思った時に思いついたので今後のためにメモ。

## XARGSを使用してのリダイレクト手順例

- 下記の様な階層で特定のサーバにログを集めたと仮定する

```text:階層
SERV001/
├ A.log
├ B.log
└ C.log
SERV002/
├ A.log
├ B.log
└ C.log
SERV003/
├ A.log
├ B.log
└ C.log
SERV004/
├ A.log
├ B.log
└ C.log
```


- 各サーバ各ログをまとめるためのディレクトリを作成する

```bash
$ mkdir ./Collect
```

- 各ログをCollectディレクトリ内に集める

```bash
$ ls | grep -v Collect |xargs -n1 -ISERVER bash -c "ls SERVER |xargs -n1 -IFILE bash -c \"cat SERVER/FILE| xargs -n1 -IDATA bash -c 'echo DATA' >> Collect/FILE\""
```
```text:結果
Collect/
├ A.log //SERV001~SERV004のA.logの内容が集約された
├ B.log //SERV001~SERV004のB.logの内容が集約された
└ C.log //SERV001~SERV004のC.logの内容が集約された
```

## XARGSを使用してファイル出力するコツ
- 出力したい内容を`''`や`""`などで、ファイル名より階層を一つ多く増やす

出力したい`ファイル`の名前でのリダイレクトを可能にするために
今回は`サーバ名`、`ファイル`に加えて余分に`データ(１行分)`と階層を一つ深くした

## 余談

最後の`>> Collect/FILE¥""`部分を以下のように`¥" >> Collect/SERVER"`に変更すると
サーバ名単位での各ログをまとめることになるのでご注意ください。

```bash
$ ls | grep -v Collect |xargs -n1 -ISERVER bash -c "ls SERVER |xargs -n1 -IFILE bash -c \"cat SERVER/FILE| xargs -n1 -IDATA bash -c 'echo DATA'¥" >> Collect/SERVER"
```
アコーディオンメニューを実装する


　やっはろー。セクションごとに開閉できるテーブルビュー、いわゆるアコーディオンメニューを実装したい、という話をします。

![346 Production](https://qiita-image-store.s3.amazonaws.com/0/4250/0cac177f-d8b2-f830-e39c-b89848bb677d.png)

## 開閉する

　セクションの開閉とは要するにセル数の増減のことなのでそのようにします。

```swift
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if openedSections.contains(section) {
        return items[section].members.count
    } else {
        return 0
    }
}
```

## タップする

　タップを検知するためにセクションのヘッダにジェスチャを貼ります。タグにセクションの番号を入れるとタップしたセクションがすぐにわかって便利。

```swift
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UITableViewHeaderFooterView()
    let gesture = UITapGestureRecognizer(target: self, action: #selector(sectionHeaderDidTap(_:)))
    view.addGestureRecognizer(gesture)
    view.tag = section
    return view
}
```

```swift
@objc func sectionHeaderDidTap(_ sender: UIGestureRecognizer) {
    if let section = sender.view?.tag {
        ...
    }
}
```

## サンプルコード

　Playground で動くやつです。

```swift
import UIKit
import PlaygroundSupport

class ViewController: UITableViewController {
    private let items = [
        (type: "キュート", members: ["双葉", "緒方", "三村", "前川", "島村"]),
        (type: "クール", members: ["神崎", "多田", "アナ", "新田", "渋谷"]),
        (type: "パッション", members: ["諸星", "城ヶ崎", "赤城", "本田"]),
        (type: "ミシロ", members: ["美城"]),
    ]

    private var openedSections = Set<Int>()

    @objc func sectionHeaderDidTap(_ sender: UIGestureRecognizer) {
        if let section = sender.view?.tag {
            if openedSections.contains(section) {
                openedSections.remove(section)
            } else {
                openedSections.insert(section)
            }

            tableView.reloadSections(IndexSet(integer: section), with: .fade)
        }
    }

    // MARK: Table view data source

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = items[indexPath.section].members[indexPath.row]

        return cell
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if openedSections.contains(section) {
            return items[section].members.count
        } else {
            return 0
        }
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return items.count
    }

    // MARK: Table view delegate

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return items[section].type
    }

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let view = UITableViewHeaderFooterView()
        let gesture = UITapGestureRecognizer(target: self, action: #selector(sectionHeaderDidTap(_:)))
        view.addGestureRecognizer(gesture)
        view.tag = section
        return view
    }
}

PlaygroundPage.current.liveView = ViewController()
```

楽しい！₍₍ (ง╹◡╹)ว ⁾⁾
twilioのiOSサンプルが動かない

twilioをiOSで動かそうと思い、サンプルを落とした。
ちなみに、

```
Quickstart/HelloMonkey.xcodeproj
```

をビルドしました。

<img width="320" alt="IMG_0218.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/74312/4f090025-8b82-60fd-52b5-ff654e697712.png">

画像の下のテキストフィールドに電話番号を入力した後、
青い「Dial」ボタンを押すと、電話がスタートするはずなのですが。。。
いい感じの音がするだけで、電話がつながらない。

https://jp.twilio.com/docs/quickstart/php/ios-client/make-outgoing-call
公式のスタートチュートリアルを見ながらチェックしていると、ある違いを発見。
HelloMonkeyViewController.m の以下の部分が、落としてきた方では

```
 _phone = [[TCDevice alloc] initWithCapabilityToken:token delegate:self];
```

一方、サイトに書いてあるのが、

```
 _phone = [[TCDevice alloc] initWithCapabilityToken:token delegate:nil];

```

あら、delegate が nil と紹介されているのに、落としてきたコードでは、selfになっていた。

なので、落ちしてきたコードも

```
 _phone = [[TCDevice alloc] initWithCapabilityToken:token delegate:nil];

```

に変更。

すると。。。電話つながった！！！

やったね！！

詳細についてはこれから調査しようと思ってます。
apacheのせいでシステムシャットダウンが遅い

Arch Linuxでアップデートしたらシステムシャットダウンに90秒くらいかかるようになった。
コンソールに「A stop job is running for apache web server」とか出ている。

よくわからないけど
http://serverfault.com/questions/501694/systemd-httpd-stop-very-slow-under-arch-linux
の通り
/etc/systemd/system/httpd.service.d/myconfig.conf 新規作成

```
[Service]
KillMode=none
```

と書いたら直った。

なんか起動時のsshd起動も遅くなった気がする。
Dockerと PHPStormとWindows でデバック環境を構築


Dockerも普及してきたことだしPHPの開発環境を試してみました。
DockerはDockerVMを挟むので何か特別なことがあるかと思っていましたが、ありませんでした。

# 準備
Docker Toolboxをインストールしておきます。
osはWindows10でバージョンは以下の通りです。

`PHP Storm 2016.1.2`

```text:
Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      windows/amd64

Server:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      linux/amd64
```

以下のファイルを準備します。

```text:./Dockerfile
FROM fedora:23
RUN yum install -y \
    php \
    php-pecl-xdebug
ADD /15-xdebug.ini /etc/php.d/
EXPOSE 80
ENTRYPOINT /usr/sbin/httpd -DFOREGROUND
```

以下のファイルを準備します。

```ini:./15-xdebug.ini
zend_extension=xdebug.so
xdebug.remote_enable=On
xdebug.remote_connect_back=On
```
以下のファイルを準備します。

```php:./src/index.php
<?php
$message = "hello at " . date('l jS \of F Y h:i:s A');
echo $message . PHP_EOL;
```

以下のコマンドを実行します。

```bash:Console
$ docker build -t php . 
```

```bash:Console
$ IMAGE_ID=作成したImage ID
```

```bash:Console
$ docker run -d -v /c/Users/Kei/PhpstormProjects/docker/src/:/var/www/html -p 80:80 $IMAGE_ID
```

PHPStormのAbsolute path on the serverの設定を以下のように行います。
![absolutepath.png](https://qiita-image-store.s3.amazonaws.com/0/73698/7329f635-2c8c-97f1-cda9-321a1321867a.png)


Chromeの[Xdebug Helperプラグイン](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?utm_source=chrome-app-launcher-info-dialog "XDebug Helperプラグイン")が便利なのでインストールします。

DockerのVMのIPアドレスを確認します。

```bash:Console
docker-machine ip default
```
PHPStormの受話器を上げてChromeの虫のアイコンをクリックしてEnableにし、 http://確認したipアドレス にアクセスするとブレークポイントで止まりました。
同一のフィールドを持つインスタンスがコレクション内に入っていた場合の特殊(?)なアクセス

少しはまったのでメモ。
Groovyでは、コレクション内のインスタンスが同一のフィールドを持っていた場合、`(コレクション).(フィールド)`でアクセスできる。下の例のように、`collect`の簡易表現になりうる。

```groovy:inner.groovy
class A {
    List inner = []
}

class B {
    List inner = []
    Map inner_map = [:]
}

class C {
    List different_inner = []
}

def a1 = new A()
def a2 = new A()
def b1 = new B()
def c1 = new C()

a1.inner.add(1)
a1.inner.add(2)
a2.inner.add(3)
a2.inner.add(4)
b1.inner.add(5)
c1.different_inner.add(6)

def outer = [a1, a2, b1]
println(outer.inner)
// >> [[1, 2], [3, 4], [5]]
// 同一表現?
println(outer.collect {
  it.inner
})
// >> [[1, 2], [3, 4], [5]]

outer.add(c1)
println(outer.inner)
// >> groovy.lang.MissingPropertyException
```
複数画像から共通部分or非共通部分を抽出するツールをJavaで作った

#概要
　タイトルの通りです。GIMP等の画像処理ソフトで差分作成は可能すが、**正直面倒臭い**のでプログラムを書いて済ませます。

#ドラッグ＆ドロップを実装する
　まずとりあえずUIをどうするかなーっと十数分考えた結果、次のような画面になりました。コマンドライン引数から、同時に読み込む画像数は幾らでも増やせるようにしています。
![スクショ](http://i.imgur.com/fqFj3Bo.png)
　で、「参照ボタンを毎回押す」だけでも良いと思っていたのですが、**ファイル選択ダイアログを押す度に毎回カレントディレクトリが元に戻るのでクソ面倒**なことに気づいたので、ドラッグ＆ドロップ機能も付加することにしました。
　ドラッグ＆ドロップ機能自体は、[以前書いたことがある](http://qiita.com/YSRKEN/items/6772903bf6242d8a86b7#%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AB%E3%81%A9%E3%81%BC%E3%83%BC%E3%82%93%E3%81%97%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%99)ので楽々実装できたのですが、問題は「[どのオブジェクトにドロップされたかを判定するか](http://ja.stackoverflow.com/questions/18206/java%E3%81%A7%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0-%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB-%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E4%BD%8D%E7%BD%AE%E3%82%92%E6%8A%8A%E6%8F%A1%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C)」でした。その回答として[ateraiさん](http://ja.stackoverflow.com/users/46/aterai)から教えられたのは、**TransferHandler.TransferSupport#getComponent()でドロップされたオブジェクトを取得する**といったものでした。なるほど……。

#結局「共通」「非共通」とは何よ？
　大きく悩んだのはそれぐらいで、その他はつつがなく実装できました。
　処理結果については、次の画像が参考になるでしょう。
![説明](http://i.imgur.com/fkSFiD1.png)

#GitHubでの配布先はこちら
ソースコードも付いてます！
[pic_diff(画像比較＆差分出力) Ver.1.0](https://github.com/YSRKEN/pic_diff/releases/tag/Ver.1.0)
指定領域内いっぱいに画像をアスペクト比を変えずに表示する

指定領域内いっぱいに、画像をアスペクト比を変えずに表示させます。
ルールは、
横長の画像は中央を縦一杯に表示、
縦長の画像は上部を横一杯に表示です。
小さい画像も引き延ばします。
![2015-10-30_00h41_39.png](https://qiita-image-store.s3.amazonaws.com/0/72794/f1a3725b-1fca-8e0d-b1ae-b76ce0a4e319.png)


```html:html
<div class="selector">
<img src="hoge1.jpg">
</div>
<div class="selector">
<img src="hoge2.jpg">
</div>
<div class="selector">
<img src="hoge3.jpg">
</div>
```

```css:css 
.selector{
	width:300px;
	height:200px;
	overflow:hidden;
	position:relative;
}
	
.selector img{
	opacity: 0;
	position:absolute;
}


```


```js:javascript
$(function(){
var fitImage = function(){
	
	var o = {h : $(this).height(), w : $(this).width()};
	var p = {h : $(this).parent().height(), w : $(this).parent().width()};
	
	if(p.h / p.w > o.h / o.w){
		$(this).css({height : p.h, left : (o.w * p.h / o.h - p.w) / -2});
	}else{
		$(this).css({width  : p.w,  top : 0});
		//中央を表示したい場合は下記	
		//$(this).css({width  : p.w,  top : (o.h * p.w / o.w - p.h) / -2});
	}

	$(this).css({opacity : 1});
};

$('.selector img').on('load', fitImage);
});
```
NFSv4でマウントするとnobodyになる

NFSv4でマウントした時にownerがnobodyに置き換えられないようにします。

全部ここに書いてあります。
[NFS Setup](http://initrd.org/wiki/NFS_Setup) (英語)

CentOSでの設定方法を書きます。他のディストリビューションはリンク先をみて下さい。

### 必要なパッケージのインストール (サーバ・クライアント)

```sh:
# RHEL5 / CentOS5
$ sudo yum -y install portmap nfs-utils nfs4-acl-tools

# RHEL6 / CentOS6 / RHEL7 / CentOS7
$ sudo yum -y install rpcbind nfs-utils nfs4-acl-tools
```

### idmapd.confを編集 (サーバ・クライアント)
補足：Domainはサーバ・クライアントで共通であればなんでもいいようです。(NIS domain?)

```sh:
$ sudo vi /etc/idmapd.conf
[General]
Domain = example.com
```

### /etc/exports の設定とディレクトリ作成 (サーバ)
fsid=0,crossmnt がポイントです。

```sh:
$ sudo vi /etc/exports
/exports/data 192.168.xxx.0/24(rw,no_subtree_check,no_root_squash,fsid=0,crossmnt)
```

```sh:
$ sudo mkdir -p /exports/data
```

### サービス再起動 (サーバ)

```sh:
# RHEL5 / CentOS5
$ sudo service portmap start; chkconfig portmap on
$ sudo service rpcidmapd start; chkconfig rpcidmapd on
$ sudo service nfs start; chkconfig nfs on

# RHEL6 / CentOS6
$ sudo service rpcbind start; chkconfig rpcbind on
$ sudo service rpcidmapd start; chkconfig rpcidmapd on
$ sudo service nfs start; chkconfig nfs on

# RHEL7 / CentOS7
$ sudo systemctl start rpcbind nfs-idmap nfs-server
$ sudo systemctl enable rpcbind nfs-idmap nfs-server
```

### fstabの編集とmount (クライアント)

```sh:
$ sudo vi /etc/fstab
192.168.xxx.xxx:/exports/data /mnt           nfs     defaults        0 0
```

```sh:
$ sudo mount -a
```
Resourcesのアトラスから動的にSpriteインスタンスを取得する方法。


# 概要
Resourcesから画像を読み込む際に、テクスチャに設定したSpriteを取得したいね、というお話を綴ります。

(そもそも標準でTexture2Dのプロパティかなんかで取得できるようにしておいて欲しい…。)

※検証環境は Unity 5.0.x 及び Unity 5.2.x です。

# 事例
こういう時。
![ss_81.png](https://qiita-image-store.s3.amazonaws.com/0/97611/4c18cff8-5654-b6ac-f6bf-dd67a6e9b049.png)
シーンやプレハブ等どこにも参照を持っていないSpriteを動的に読み込んで取得したい場合！

# サンプル
## 実行コード
```csharp:SpriteLoader.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class SpriteLoader
{
	Dictionary<string, Sprite>	m_dic = new Dictionary<string, Sprite>();

	/**
	 * 読み込み関数
	 * @param	path	テクスチャのパス
	 * @retval	読み込んだSpriteの数(エラーの場合-1)
	 */
	public int Load( string path )
	{
		// 読み込み(Resources.LoadAllを使うのがミソ)
		Object[] list = Resources.LoadAll( path, typeof(Sprite) );

		// listがnullまたは空ならエラーで返す
		if( list == null || list.Length == 0 ) return -1;

		int i, len = list.Length;

		// listを回してDictionaryに格納
		for( i = 0; i < len; ++i )
		{
			Debug.Log( "Add : " + list[i] );

			m_dic.Add( list[i].name, list[i] as Sprite );
		}

		return len;
	}

	/**
	 * Sprite取得関数
	 * @param	name	取得するスプライト名
	 * @retval	該当のSpriteインスタンス(なければnull)
	 */
	public Sprite GetSprite( string name )
	{
		if( !m_dic.ContainsKey( name ) )
			return null;

		return m_dic[name];
	}

	public void Dispose()
	{
		m_dic.Clear();
		m_dic = null;
	}
}
```
### 解説
あまり難しく考えずに、 `Resources.LoadAll` に `テクスチャのパス` と `typeof(Sprite)` を与えるのがミソ！

戻り値として、読み込まれたSpriteのインスタンスがObject配列で返ってくるよ。

あとは `as Sprite` で煮るなり焼くなりお好みで！

## 呼び出しコード例

```csharp:main.cs
using UnityEngine;
using System.Collections;

public class main : MonoBehaviour
{
	[SerializeField]
	SpriteRenderer m_renderer = null;

	void Start()
	{
		// 読み込みクラスのインスタンス作成
		SpriteLoader sl = new SpriteLoader();

		// 読み込み
		sl.Load( "sample_atlas" );

		// SpriteRendererに割り当て
		if( m_renderer != null )
			m_renderer.sprite = sl.GetSprite( "star" );
	}
}
```

### 解説

1. 読み込みクラスのインスタンスを作るよ
`SpriteLoader sl = new SpriteLoader();`

2. 読み込み関数にリソースのパスを渡してね
`sl.Load( "sample_atlas" );`

3. あとは使いたい時にGetSprite！
`m_renderer.sprite = sl.GetSprite( "star" );`

とっても簡単ね！
スクロールバーの幅に依存しないスタイル指定

## 問題
CSSで `overflow: scroll;` を指定した要素はスクロールバーが表示されます。

...と、思っていた時期がぼくにもありました。
Yosemite 以降の Mac(OS X 10.10~) では、OS のデフォルト設定でスクロールバーを非表示にしている為、`overflow: scroll;`を指定してもスクロールバーは表示されません。
その為、スクロールバーが表示される前提でスタイル指定していると表示が崩れてしまいます。

>「え？同じブラウザを使っているのに表示崩れが起きるだと！？」
>「OSも影響するよー」「▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂」

そもそもスクロールバーの幅はOSやブラウザによって異なるはずで、本来はこれに依存しないスタイル指定をするのが良いはずです。
とはいっても、面倒であったり難しかったりで一般的なスクロールバーの幅(15pxぐらい)を width の計算などに含める方は少なからずいるのではないでしょうか？
しかし前述のとおりスクロールバーは必ずしも表示されません。この手法では表示崩れが起きる原因となってしまう為、何らかの対策が必要です。
かといってJavaScriptで計算するのは、やり過ぎ感が否めません・・・。

## 具体例
スクロールバーの幅を差し引きたい場面を想定してみました。
下記の例では、`.example`にはスクロールバーが表示されず、`.bad`と`.good`にはスクロールバーが表示される前提です。
それぞれは縦に並んでいて、`.right`に指定した`border`の位置を揃えたいとします。

```html
<div class="example">
  <ul>
    <li class="left">可変幅</li>
    <li class="right">固定幅</li>
  </ul>
</div>
<div class="bad">
  <ul>
    <li class="left">可変幅</li>
    <li class="right">固定幅</li>
  </ul>
</div>
<div class="good">
  <ul>
    <li class="left">可変幅</li>
    <li class="right">固定幅</li>
  </ul>
</div>
```

```css
ul li {
  float: left;
}
.right {
  border-left: 1px solid #000;
}
.example {
  overflow-y: auto;
}
.bad, .good {
  overflow-y: scroll;
}
.example.left {
  width: calc(100% - 100px);
}
.example.right {
  width: 100px;
}

/*
 * 悪い例
 * スクロールバーの横幅を15pxと仮定して差し引いている
 */
.bad.left {
  width: calc(100% - 85px);
}
.bad.right {
  width: calc(100px - 15px);
}

/*
 * 良い例
 * スクロールバーに依存せず 100vw から固定幅を差し引いている
 */
.good.left {
  width: calc(100vw - 100px);
}
.good.right {
  width: 100px;
}

```

## 解説
まず注目したいのは`.example.left`で指定している`100%`と、`.bad.left`でしている`100%`は異なる値という点です。
`.example.left`の`100%`はブラウザの左端からブラウザの右端までの値です。
`.bad.left`の`100%`はブラウザの左端からスクロールバーの左端までの値です。
すなわちスクロールバーの有無によってずれてしまうのは、スクロールバーの影響を受けた値を計算に利用しているためと言えます。

今回の具体例で利用した解決案では、全体の横幅の計算に`100%`ではなく`100vw`という値を利用しています。
`vw`は**viewport width**という値で、`1vw`は viewport で指定された幅の 1/100 です。
(※ viewport についてはググれば沢山記事があるので、ここでは割愛します。)
viewportを指定していない場合はブラウザの横幅が`100vw`となるはずですが、特に理由がなければ指定するのが良いかと思います。
`vw`はスクロールバーの横幅に影響を受けず、常にviewport(≒ブラウザの横幅)を基準にするため、スクロールバーの横幅に依存しない指定ができます。

`vw`はIE9以降であれば利用可能なため、機会があれば是非使ってみてください。
WordPressで外部CSSを簡単に実装する方法

WordPressに実際に実装するまでかなり簡単にできるとタカをくくっていたが、「Wordpress 外部 css」みたいなワードで検索したが簡単な方法が見つからなかった。

WordPressのプラグインを検索したところ"Custom Css"（作者：FRESHFACE）というのを見つけたので、それを使って実装した。

インストールすると左メニューの「外観」に"Custom Code"というのが出てくるのでそこから編集可能。

cssだけでなくLESS記法でも記述可能、jsも書けるよう。

おそらく1ファイルまでなら無料で、それ以上は有料のようだが、css書くだけなら1ファイルで十分。

右メニューの"Custom Code Placement"でコードの保存場所（inline,External File）とHTML内での場所(Header,Footer)を設定可能。

External Fileで保存した場合下記のディレクトリ内に保存されるので、そのファイル（英数字の羅列.css）を直接編集もできるっぽい。
(※WPのプラグイン上でLESSで編集していても外部ファイルはcssになるので注意)

~~~
/wp-content/uploads/freshframework/custom_code
~~~
[bash]プレフィックスが0の数字を含んだ計算ができない

次のコードを**zsh**で実行すると、

```zsh
echo $(( 049*2 ))
98
```
と予想通りの結果になる。

一方、次のコードを**bash**で実行すると、

```bash
bash-4.1$ echo $(( 049*2 ))
bash: 049: ベースの値には大きすぎます (error token is "049")
```
と怒られる。これはbashでは0で始まる数字は**8進数**として解釈されるためだということがわかった。0xあるいは0Xで始まる場合は16進数として解釈されることは知っていたが、これは知らなかった...いい勉強になりました。ではどうすれば10進数として解釈させることができるかですが、次のように数字の前に`10#`と書けばOK。

```bash
bash-4.1$ echo $(( 10#049*2 ))
98
```
一般に、ある数字をn進数で解釈させたい場合は`n#`を数字の前に書けばOK。

# 参考サイト
- http://wiki.bash-hackers.org/syntax/arith_expr
スクロールすると画面上部に固定されるやつ

自分用備忘録でスンマセン。

#なにこれ
固定したい要素はページの最上部には無く、スクロールして表示画面の上部に来たタイミングで固定されるやつ。

固定される要素：`nav`
それをラップする要素：`div#nav`
とする。

`nav`に`position: fixed;`を適用した際に、`nav`より下にある要素が上詰めされてしまう。
それを防ぐため、`div#nav`は`nav`の高さを保持する。

ソースはコアな部分しか書いてないです。

#ケース1
**固定する要素の高さがpx,rem等により指定される場合**

```html:HTML
<div id="nav">
	<nav>
		<ul><!--// 固定される要素の中身の例 //-->
			<li><a href="page1.html">page1</a></li>
			<li><a href="page2.html">page2</a></li>
			<li><a href="page3.html">page3</a></li>
		</ul>
	</nav>
</div>
```

```css:CSS
#nav {
	position: relative;
	width: 100%;
	height: 3rem;
}

nav {
	position: absolute;
	width: 100%;
	height: 3rem;
}

nav.fix {
	position: fixed;
	top: 0;
	max-width: 100vw;
}
```

```js:JavaScript(jQuery)
$(function(){
	$(window).on('load scroll', function(){
		if( $(this).scrollTop() > $('#nav').offset().top ) {
			$('nav').addClass('fix');
		}
		else {
			$('nav').removeClass('fix');
		}
	});
}
```


#ケース2
**固定する要素の高さをJSで取得する場合**
(`nav`の高さにremとpxが混在する場合、`nav`の高さがその中の要素に依存して決まる場合など)

```css:CSS
#nav {
	position: relative;
	width: 100%;
}

nav {
	position: absolute;
	width: 100%;
}
```

```js:JavaScript
$(function(){
	$(window).on('load scroll', function(){
		if( $(this).scrollTop() > $('#nav').offset().top ) {
			$('nav').addClass('fix');
		}
		else {
			$('nav').removeClass('fix');
		}
	});

	$('#nav').height( $('nav').outerHeight(true) );
}
```


#ケース3
**固定する要素より上部にある要素の高さが、レスポシブデザイン等の理由でページ表示中に変化する場合**

(ウィンドウのリサイズで上部の要素の高さが変わる場合は`$(window).on()`に`resize`を追加)

```js:JavaScript
$(function(){
	$(window).on('load scroll resize', function(){
		if( $(this).scrollTop() > $('#nav').offset().top ) {
			$('nav').addClass('fix');
		}
		else {
			$('nav').removeClass('fix');
		}
	});
}
```

#あとがき
`$(window)`の`.on('scroll', function)`中で何度もjQueryオブジェクトを作ってると目に見えてラグが出るんで、やっぱりjQueryオブジェクトは外側のvarに格納しておくべきかな。
speedtest-cliでターミナルからコマンドで回線速度を確認する。

### 背景

インターネットがやたら遅いので
回線速度を知りたくなったので。

### 概要

回線速度を確認するにあたって
speedtest-cli
https://github.com/sivel/speedtest-cli
をつかって測定する

speedtest-cliのインストールに
pipコマンドが必要だったので
brew経由でphthonをインストールする。

### 手順
 
#### brew経由でpythonをインストール

```
$ brew install python
```

※ 依存関係のあるsqlite, opensslも一緒にインストールされるので
　入らない場合はbrewになんかのoption渡せばいいはず。

#### pipコマンドでspeedtest-cliをインストール

```
$ pip install speedtest-cli
```

###　speedtest-cliでターミナルから回線速度を確認する

```
$ speedtest-cli
```

以下のように回線速度が表示される

```
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Kddi Corporation (111.xxx.xxx.xx)...
Selecting best server based on latency...
Hosted by SoftEther Corporation (xxxxx) [75.53 km]: 114.369 ms
Testing download speed........................................
Download: 3.29 Mbit/s
Testing upload speed..................................................
Upload: 5.04 Mbit/s
```

遅！
IntelliJ IDEAで特定のscssだけcssにコンパイルする



みんな大好きIntelliJ IDEAは大変素晴らしいIDEで、
プロジェクト内のscssファイルを監視して変更を感知したら即座にcssにコンパイルしてくれる機能(プラグイン)があります。

ただし初期状態だとプロジェクト内のすべての.scssファイルを監視してcssにコンパイルしてしまいます。
おそらく普通は複数の.scssファイルを@importなどで1つにまとめてコンパイルすることが多いかと思うので、これは困ります。

というわけで複数の.scssから1つだけ.cssにコンパイルする方法をメモしておきます。

## 前提
IDEAで.scssを自動コンパイルするには公式の File Watchers というプラグインが必要になります。
Preference -> Pluginsからインストールしておきます。

おそらくは普通にインストールするだけでプロジェクト内に.scssファイルを作るたびにFile Watchersで監視するかどうか聞かれるようになるはずです。

## ゴール

最終的に

	ProjectDir
		|
		-- css
		|    |
		|    -- style.css
		|
		-- scss
		     |
		     -- style.scss
		     |
		     -- test.scss
		   
		   
という構成で、test.scssはstyle.scssからインポートされるのみで、
style.scssだけがcssにコンパイルされたら成功です。

## 設定
というわけで早速設定していきます。
Preference -> Tools -> File Watchersと進んで設定画面を開きます。
ここには現在のプロジェクトで監視しているルールの一覧が表示されます。

新しくscss用のルールを追加するので、下のAddボタンを押して、表示されたTempletesの中からSCSSを選択します。

設定画面が開くので、

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/66904/19733777-b36d-4391-7cf7-30f092e2201d.png "ss2.png")


Watcher Settingsから

* Scope
* Arguments

を変更します。Scopeで監視対象のファイルを指定し、Argumentsでコンパイルされたcssの出力先を指定しています。

### Scope
Scope右の…からscope追加ダイアログを開きます。
左上の+ボタンを押し、Localを選択します。scope名を聞かれるので適当に入力します。

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/66904/1bcc5bdf-cc6a-9323-fe85-da6bdd141d23.png "ss1.png")


上記の画面真ん中あたりのセレクトボックスからProjetを選択すると現在のプロジェクトディレクトリが開くので、
scss/style.scssを選択し、includeを押します。

上の方のPattern: のところに
``file:scss/style.scss``
が表示されれば大丈夫なので、OKを押します。

ちなみに、今回は特定のファイルだけを対象にしていますが、
このPatternは文字通りパターンで色々と複雑な条件を指定できるようなので、時間がある時に色々と試してみようと思います。
 [参考:https://www.jetbrains.com/idea/help/scopes.html](https://www.jetbrains.com/idea/help/scopes.html)


### Arguments
Argumentsはデフォルトを以下のように変更します

	--no-cache --update $FileName$:$FileNameWithoutExtension$.css
			↓↓
	--no-cache --update $FileName$:../css/$FileNameWithoutExtension$.css




## 終わり
以上で設定は終わりです。
OKを押してエディタに戻り、style.scssを編集したらstyle.scssだけが自動的にcssにコンパイルされるはずです。

```stylle.scss
@import "test.scss";
div{
  color: #501812;
  border-right: 10px;
}
```

```test.scss
p{
  margin-bottom:10px;
}
```



以下のように、ちゃんとtest.scssがインポートされてstyle.scssだけがコンパイルされています


```style.css
p {
  margin-bottom: 10px; }

div {
  color: #501812;
  border-right: 10px; }

/*# sourceMappingURL=style.css.map */
```

以上です。大したことはないんですが、たまにやると忘れてしまいそうなのでメモとして。
正例とラベル無しデータからの学習 (PU Classification)

# この記事を読んでできること
正例とラベル無しデータから，分類器を学習する．
簡単に言うと，こんなデータ：

![pu_data.png](https://qiita-image-store.s3.amazonaws.com/0/37248/cfaf61e3-e16c-ebd4-9f10-1f25e837b191.png)

から，こんな予測ができるようになる：

![result_of_puclassification.png](https://qiita-image-store.s3.amazonaws.com/0/37248/c693ee1f-a330-68ba-74e0-334f27165ef0.png)

# なぜやるのか？
通常の2値分類問題では，正例と負例が与えられています． しかし扱う問題によっては，このようなデータを用意するのが困難な時があります． 例えば，抽出型のタスクです． 抽出型のタスクでは，抽出したい対象を正例と考えます． この場合の負例は「正例以外のデータ」と定義するほかありません． しかし，集めた正例に対し，それ以外のデータを負例と定義してしまうと， それ以外のデータに含まれる正例も負例として扱ってしまいます．

# どうやってやるのか？
正例とラベル無しデータから分類器を学習する，PU classification (Elkan and Noto 2008) という枠組みを使う．

# 詳しくは
実験結果やコードは[正例とラベル無しデータからの学習](https://nktmemo.wordpress.com/2015/10/29/正例とラベル無しデータからの学習-pu-classification/ "PU Classification")を参照してください．
s3cmd sync に必要なIAMポリシー

全アクションをつけた上で1行ずつ消していくというアホみたいなことをやった結果、
下記でよいらしいということが判明。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1446117060000",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListAllMyBuckets",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        }
    ]
}
```

s3cmd sync test-directory s3://bucket-name/ とかやって検証してみました。
s3cmdのバージョンは下記です。

```
# s3cmd --version
s3cmd version 1.5.1.2
```