OmniAICreator/Qiita-1.07M huggingface dataset:
Cocoapods のインストール(Mac OS X 10.10.1 Yosemite)

>この記事は、Xcode ,Swift ,Cocoapods ,の初心者が、Cocoapodsのインストールでハマった際の手順をまとめたものです! ;)

## RubyGemsのアップデート

*\*2014/12/02 時点で、"sudo gem install cocoapods" に対して以下のエラーがあった。*

```ruby
ERROR:  Could not find a valid gem 'cocoapods' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - no such name (https://rubygems.org/quick/Marshal.4.8/cocoapods-0.35.0.gemspec.rz)
ERROR:  Possible alternatives: cocoapods
```

そこで、RubyGems の最新を入れるために以下の操作をした。

##

コンソールより、以下を実行した。

```ruby
sudo gem update --system
sudo gem install rubygems-update
sudo update_rubygems 

```

結果、以下のようにイストールされた。

```ruby
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/gem
```

## Cocoapods のインストール

この状態で、cocoapodsのインストールを実施した。

```ruby
sudo gem install cocoapods

Fetching: nap-0.8.0.gem (100%)
Successfully installed nap-0.8.0

...

Parsing documentation for cocoapods-0.35.0
Installing ri documentation for cocoapods-0.35.0
20 gems installed
```
無事にインストールされたようである。

Cocoapods で扱うライブラリの情報をセットアップする。

```ruby
pod setup
Setting up CocoaPods master repo
Setup completed

```
\*参照記事：
[iOSライブラリ管理の神ツール「CocoaPods」のインストールと使い方 (1/2)](http://www.atmarkit.co.jp/ait/articles/1403/08/news008.html)

cocoapods で、ライブラリのインストールを実施すると autoconf がないなどのエラーが出るので、以下を実行した。

## Xcode commandline toolのインストール
command_line_tools_for_osx_10.10_for_xcode_6.1.1_gm_seed のインストール


1. XCodeのメニューから、「Xcode」-「Open Developer Tool」-「More Developer Tools」を選択する。
2. ブラウザが起動してApple Developerが表示されるので、その中から「command_line_tools_for_osx_10.10_for_xcode_6.1.1_gm_seed」を選択しダウンロード。
3. command_line_tools_for_osx_10.10_for_xcode_6.1.1_gm_seed.dmg　をマウントし、"Command Line Tools (OS X 10.10).pkg"
をインストールする

## Homebrew のインストール
[Homebrew のインストール](http://brew.sh/index_ja.html)
以下のコマンドを実施。

```ruby
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
・・・
==> Installation successful!
==> Next steps
Run `brew doctor` before you install anything
Run `brew help` to get started

brew doctor
```
結果として以下が返された。

```ruby

Warning: You have MacPorts or Fink installed:
  /opt/local/bin/port

This can cause trouble. You don't have to uninstall them, but you may want to
temporarily move them out of the way, e.g.

  sudo mv /opt/local ~/macports
```

MacPorts をインストールしたかが定かではないが、/opt/local/bin/port　が存在した。そのため、以下を実行して Homebrew の環境に合わせるようにした。

```ruby
  sudo mv /opt/local ~/macports
```

再度、brew doctor を実行したところ、以下になった。

```ruby
Your system is ready to brew.
```

## autoconf , automake のインストール

```ruby
brew install autoconf
brew install automake
```

## pods のインストール

podsfileに、以下を記述した。

```
platform :ios, "6.0"
pod 'SpatialDBKit'
```

\*SpatialDBKit は、地理情報関連のライブラリです。

```ruby
pod install
```

を実施したところ、エラーもなくライブラリのインストールができました。
スマホのdevicemotionでAudio.playを使う


加速度などに連動して音を鳴らすというのをやりたかったんですが、
スマホの仕様から単純にはいかなかったのでメモしておきます。

## NG

以下の場合はスマホでは音が鳴りません。(PCでは鳴りました。)

```
var audio = new Audio();

audio.src = 'sample.mp3';

window.addEventListener('devicemotion', function() {
  audio.play();
}, false);

```

理由は以下だそうです。

https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html

英語読めませんが、どうやらスマホではユーザーの行動(clickとかtouchとか)に紐付かないと、Audio.playが有効にならないみたいです。

## OK

あらかじめclickやtouchなどのイベントを介して、その中で`audio.load()`を行っておけば、`devicemotion`内でも音を鳴らすことができました。

```
var button = document.getElementById('button'),
    audio = new Audio();

audio.src = 'sample.mp3';

button.addEventListener('click', function() {
  audio.load();
}, false);

window.addEventListener('devicemotion', function() {
  audio.play();
}, false);
```

このような演出を取り入れたい場合、デザイン上でなんらかのクリック動作をユーザーに促すように設計しておくとよさそうですね。
文字コードの違いにより grep 出来ないファイルを grep する

この世には、普通にgrepが出来ないものが存在する。
それは、文字コードが違うファイルかつ日本語だ。

Webなのに、未だにWindowsで書き足されたShift_JISのシステム。
もちろん、サーバはUTF-8だ。

本来ならば、システム自体をUTF-8に変えるべきだ。
しかし、出来ない政治的な理由がある。


普通に grep してみよう。


```shell:普通のgrep

grep -r "ほげ" ./

```

でない。でないでないでないでない。
ならば変換だ。

検索文字を指定の文字コード(shift_jis)に変換し、
表示の際にさらにUTF-8で変換する。


```shell:変換のgrep

grep -r `echo "ほげ" | nkf -s`  ./  | nkf -w | grep -v .svn | grep --color 'ほげ' 

```

参考サイト様: [文字コードを一時的に変換してgrepする方法　nkfコマンド](http://chiiiiiiiii.hatenablog.com/entry/2013/02/26/181712)
SFINAE機構

みなさん、こんにちわ。アメブロで主にストレージに関して
いろいろ書いていたんですが、どうもやはりコードを載せるには向いていない
感じがしたのでこちらにいろいろと移転してみました^^

さて、最近Cocos2d-xが流行っているので、その記事がたくさん投稿されているので、結構助かっているのですが、そのインターフェースであるC++言語があまりにも難しく扱いずらい為なかなか突っ込んだ事が書かれている記事が少ないことに気づき、僕の知識の範囲でC++のニッチだが、その界隈では有名なテクニックだとかを紹介していこうかと思います。今日は手始めにSFIANE機構っていうのを紹介します。

# SFIANEってなに？

SFIANE(Substitution Failure Is Not An Error)っていう機構がC++にあります。直訳すると置き換えの失敗はエラーではないって意味です。手っ取り早くコードを使って説明すると

```sfiane.cpp

#include <iostream>
using namespace std;

struct A {
    typedef int int_A;
};


template <class T>
void show(typename T::int_A) {
    cout << "クラステンプレートを使ってインスタンス化" << endl;
};

template <class T>
void show(...) {
    cout << "それ以外のインスタンス化" << endl;
};

int main() {
    show<int>(0);       //-> "それ以外のインスタンス化"
    show<int>("hoge");  //-> "それ以外のインスタンス化"
    show<A>(0);         //-> "クラステンプレートを使ってインスタンス化"
    show<A>("hoge");    //-> "それ以外のインスタンス化"
}

```

実はとっても変な事がここでは起きています。引数に関しての関数のオーバーロードであれば、単純に引数が合致してそうなのが呼ばれますが、これに関しては型引数も含めてうまく合致しているものが検出でき、それ以外はオーバーロード候補からはずしています。

つまり、言い換えれば、**型引数と関数の引数によって実体化自体が分岐できる**ということになります。これだけだと何に役に立つのかよくわかりませんが、これを利用すると、想定した機能が実装されたクラスが型引数に渡されたかどうかを検出できます。さらに、想定した型が来なかった場合、例外的に処理できます。

``` is_void.cpp
template <class T>
struct is_void {
    static const bool value = false;
}

template <>
struct is_void<void> {
    static const bool value = true;
}

#include <iostream>
using namespace std;

int main() {
    cout << is_void<void>::value << endl; // -> true
    cout << is_void<int>::value << endl;  // -> false
}

```

これは 型がvoidで実体化される時だけ例外的な処理を行っている例です。

発展すると、decltypeと組み合わせて指定した関数がある場合はその関数を呼び、そうでない場合はコンパイル時に警告を出して、似た挙動の関数を呼ぶとかできそうです。
タッチイベント ACTION_UP を別のビューで拾う

# 概要

あるビューAを押下して指をスライドさせ、別のビューB上で指を離したときにビューBの OnTouchEvent を呼ぶ方法。

# 参考

記事の内容は 100% 下記ページに拠っています。
http://stackoverflow.com/questions/12980156/detect-touch-event-on-a-view-when-dragged-over-from-other-view

# 方法

タッチイベント ACTION_UP は ACTION_DOWN が発生したビューにしか通知されない仕様らしい。
そのため、別のビューに ACTION_UP を送りたいときはタッチイベント発生元から別のビューに人為的に通知してあげる必要がある。

下記はボタンとテキストビューがあるアクティビティサンプル。
ボタンをタッチして指をスライドし、テキストビュー上で指を離すとテキスト内容が変わる。

```java

public class MyActivity extends Activity {

	static final String TAG ="MyActivity";

    /**
     * @brief    入力 x, y がビューの領域内かどうかを判定する.
     * @return   true: 領域内, false: 領域外.
     */
	private boolean inViewBounds(final View view, int x, int y){
		Rect outRect = new Rect();
		view.getDrawingRect(outRect);
		int[] location = new int[2];
		view.getLocationOnScreen(location);
		outRect.offset(location[0], location[1]);
		return outRect.contains(x, y);
	}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

	    final TextView text = (TextView)findViewById(R.id.textView);
	    final Button button = (Button)findViewById(R.id.button);

	    text.setOnTouchListener(new View.OnTouchListener() {
		    @Override
		    public boolean onTouch(View v, MotionEvent event) {
			    switch (event.getAction()) {
				    case MotionEvent.ACTION_UP:
					    TextView vv = (TextView)v;
					    vv.setText(event.getX() + ", " + event.getY());
					    break;

				    default:
					    Log.v(TAG, "another event on view");
			    }

			    return false;
		    }
	    });

	    button.setOnClickListener(new View.OnClickListener() {
		    @Override
		    public void onClick(View v) {
			    // do nothing
		    }
	    });

	    button.setOnTouchListener(new View.OnTouchListener() {
		    @Override
		    public boolean onTouch(View v, MotionEvent event) {
			    int x = (int)event.getRawX();
			    int y = (int)event.getRawY();

			    if(event.getAction() == MotionEvent.ACTION_UP){
				    if(inViewBounds(text, x, y))
				    {
					    Log.v(TAG, "on release text");
					    text.dispatchTouchEvent(event);
				    }
				    else if(inViewBounds(button, x, y)){
					    Log.d(TAG, "on release button");
				    }
			    }
			    return false;
		    }
	    });
    }
}

```

個人的に調べた範囲ではこの方法が一番よさそうだった。
（他の方法はうまくいかなかった）
とあるカラムの値の一部分をさらに分解して取り出したい

## やりたいこと
とあるカラムに入っている商品詳細ページのURLから商品コードを_区切りで分解して取り出したい。
`http://www.example.com/item/detail?shop=XXX&product=AAAA_BBBB_CCCC_DDDD&ref=top`
↑これを、p1=AAAA, p2=BBBB, p3=CCCC, p4=DDDDにしたい、ってこと。
（※なんでURLが入ってて商品コードが入ってないのかというツッコミは今回はスルーでお願いします。）
（※実際、今回本当は他のテーブルに分解されてる値が入ってるからJOINすればよかったけど...まぁいいか。）
（※今回は極端な例だけど、電話番号を-で分解したいとか？需要があるかはしらないけど。）
（※ていうかSQLで頑張る必要あったのだろうか。プログラム側で正規表現とかでどうにかなったのでは。）

動作はMySQL5.5で確認。

## カラムの中身
`http://www.example.com/item/detail?shop=XXX&product=AAAA_BBBB_CCCC_DDDD&ref=top`
（※実際のURLは書けないから適当にそれっぽいの。）
- `XXX`は3桁の数字
- `AAAA_BBBB_CCCC_DDDD`は **_** 区切りの可変長文字列

## SQL
```sql
SELECT
    -- ↓先頭から1つ目の_の前まで
    SUBSTRING_INDEX(product, '_', 1) as p1,
    -- ↓先頭から2つ目の_の前までから、1つ目の_の前まで+_を''(空文字)に置き換えたもの
    SUBSTRING(REPLACE(SUBSTRING_INDEX(product, '_', 2), SUBSTRING_INDEX(product, '_', 1), '') FROM 2) as p2,
    -- ↓先頭から3つ目の_の前までから、2つ目の_の前まで+_を''(空文字)に置き換えたもの
    SUBSTRING(REPLACE(SUBSTRING_INDEX(product, '_', 3), SUBSTRING_INDEX(product, '_', 2), '') FROM 2) as p3,
    -- ↓先頭から4つ目の_の前までから、3つ目の_の前まで+_を''(空文字)に置き換えたもの
    SUBSTRING(REPLACE(SUBSTRING_INDEX(product, '_', 4), SUBSTRING_INDEX(product, '_', 3), '') FROM 2) as p4
FROM (
    SELECT
        REPLACE(
            REPLACE(
                SUBSTRING(
                    REPLACE(item_detail_url, 'http://www.example.com/item/detail?shop=','') -- 頭のいらない部分切り落とし
                FROM 4) -- shop=XXXのXXXを切り落とし
            , '&product=','') -- 更に余計な部分を切り落とし（よく考えたら↑のFROMの数字をずらせばよかった）
        , '&ref=top', '') as product -- 後ろのゴミも切り落とし
    FROM
        items
) as i
```

## 結果
- `http://www.example.com/item/detail?shop=100&product=A0123_45_6789_A&ref=top`
    - p1: A0123
    - p2: 45
    - p3: 6789
    - p4: A
- `http://www.example.com/item/detail?shop=100&product=C101_987_65BB_ZZA&ref=top`
    - p1: C101
        - (16:58 修正しました。)
    - p2: 987
    - p3: 65BB
    - p4: ZZA
        - (16:58 修正しました。)


## まとめ
もっといい方法があるはず...。
rotateYで3D方向の回転を行う際の注意


rotateXやrotateYの回転、つまり平面が3D方向に回転する場合、
z-indexが正しく機能しなくなる。
マークアップ上では上に存在するレイヤーであっても、rotateYを行った結果、クリックが反応しないということが起こる。
そしてタチが悪いことに、特定のブラウザやスマートフォンでは、
奥行きには変化のないはずの rotateY(180deg) でさえ、
クリック対象がおかしなことになるケースがある。(おそらくGPU計算による誤差の影響)


従って、こうした3D回転によるz-index崩壊を補正するには、
強制的にレイヤーを奥に移動させたりするしかない。

つまり、本来裏側にあるはずのレイヤーを、

transform: translateZ(10px)

等をあてることで、奥に移動させる。
CSS3のanimation-timing-function: steps(n) が便利

## DEMO
デモを追加しました (2015-10-16)
http://codepen.io/skwbr/pen/bVoJqw


## 概要
CSS3のanimation-timing-function: steps(n) が便利なのでGifアニメやJSを使用したPNGシーケンスはもう使わないようにしたいな、という話です。
例えば

![sprite.png](https://qiita-image-store.s3.amazonaws.com/0/48396/89b43bef-fb79-c82b-5fcc-876a122fb467.png)


のようにY方向に100pxの間隔で5コマを並べたSprite画像があるとして、
`background-position`でコマ送りアニメーションをさせるときは良くJSが使われていますが、
CSS3の `animation-timing-function: steps(n);` を使うとその代わりができます。

```css

.hoge {
    .....
    animation: parapara 1s steps(5) 0s infinite;
  }

@keyframes parapara {
    0% { background-position: 0    0  ; }
  100% { background-position: 0 -500px; }
}
```
このように書くと、background-position-yが

```
  0%  0.0s時点：1コマ目         ：    0
      0.2s時点：2コマ目(1step目)： -100px
      0.4s時点：3コマ目(2step目)： -200px
      0.6s時点：4コマ目(3step目)： -300px
      0.8s時点：5コマ目(4step目)： -400px
100%  1.0s時点：6コマ目(5step目)： -500px
```

とパラパラアニメーションします。
`steps()`を書かないと、ヌルーっと背景がスライドしてしまいます。
(0%の指定はブラウザによっては省略可能ですが念のため書いておきましょう。)

もし最初のフレームだけ長めに取りたいと思ったら、

```css
@keyframes parapara {
    0% { background-position: 0    0  ; }
   50% { background-position: 0    0  ; }
  100% { background-position: 0 -500px; }
}
```
のように書きます。
すると今度は

```
  0%  0.0s時点：1コマ目         ：    0
 50%  0.5s時点：　〃            ：    0
      0.6s時点：2コマ目(1step目)： -100px
      0.7s時点：3コマ目(2step目)： -200px
      0.8s時点：4コマ目(3step目)： -300px
      0.9s時点：5コマ目(4step目)： -400px
100%  1.0s時点：6コマ目(5step目)： -500px
```
のように最初のコマでの時間が長くなります。
同様の理屈で、途中や最後のコマの尺を伸ばすこともできます。

`animation-duration` で全体の尺
`animation-delay` でアニメ開始までの待ち時間(ループする場合2周目からは待ち無しとなる)
`animation-timing-function` でコマ数
`keyframe` でシーケンスの緩急

といった具合に、CSS上だけでモーションのチューニングができる点が便利です。
これらを引数にしつつmixinにしてもいいですよね。

（ベンダープレフィックスは心の中で補ってください）
新卒で入社してから僕が気をつけていること

## 目の前の仕事をガムシャラに圧倒的なスピードでやる
新卒で入社して1,2年目まではとにかくこれを自分の中で大事にしていました。 
ちょっとつまらないこと、あまりスキルにならないことでも、早く全力でやることで周りからの信頼が得られ、それによって面白い仕事やチャンスを得られる可能性が高まると思います。 
メールの返信が遅いとか見てないなどは信頼を大きく損なうので特に注意。

## わかったふりをしない
私がよくやってしまいがちなことでした。
自分がきちんと理解していないのに、あたかも理解したような顔をしたり、質問を途中でやめてしまうことはとても危険です。わかったふりをするのを続けていると、だんだんそれが上手くなってきて、どんどんごまかすようになります。全く良いことはありません。 
特に用語を覚えただけで詳しくなった気になりやすい人は要注意。

## エンジニアだから〜しなくてよいと思わない
エンジニアだから、プロデューサーだからという理由で何かしなくて良いということは全くありません。 
特にエンジニアは作ることに集中して、プロダクトを考える部分を愚かにしがちだと思います。 
しかし、実はプロダクトがどういうユーザーの課題を解決しているかという部分を真剣に考えることによって、開発するスピードやコードの品質が以外にも上がったりするんですよね。 
コードを書く時間を増やすことだけが効率化である、という考えは間違っていると思っています。

## 真面目になり過ぎない
1つ目に書いたことと矛盾してしまいますが、目の前のタスクをガムシャラにこなすことだけが良いことではありません。周りのプロジェクトに興味を持って人のコードを読んだり、わからないことがあったら少し時間がかかっても芋づる式に調べたり。 
仮にそれによってメインの業務がちょっと遅くなったとしても、そういう時間もとても大事だと思います。

## 必ずWhyを考える
自分がやっていること、作ろうとしているものが「なぜ」「何のために」やるのか、作るのかということを必ず考えるようにすること。 
たとえ「受託案件」「簡単なタスク」だったとしても、必ず考える癖を付けるようにしましょう。
依頼された場合は依頼者に必ず聞くようにし、もし「理由はいいからやれ」と言われたら、それを言った以外の人に相談しましょう。

## 自分のできることや知っていることだけで解決しようとしない
これは新卒1年目の時に、当時のOJTの先輩に言われた言葉です。 
特にエンジニアになりたての頃は知らないことばかりで、自分が想像できない解決方法があったりするはずです。自分の知っている実装方法だけでやろうとせず、もっと良い方法やスマートな方法がないか必ず探すようにしましょう。

## できない理由を探さずに、できる方法を探そう
学生時代に聞いた講演で、ビズリーチの南さんもこんなことを言っていました。

```
ヒトはできない理由を探すのが得意。どうやったらできるかを考えると人生はがentertainmentになる
```
エンジニアに限っても、実装方法がイメージがつかないからとか、面倒そうだからという理由でできませんということは許されませんね。  
あるエンジニアではない人に言われましたが、色々なエンジニアと接していると技術的に困難なのか、それとも怠けているかはすぐに分かるそう。 
もちろん、何でも出来るわけはありませんけど。技術的やスキル的に困難だったとしても、その代替の手段をなるべく提示できるようにしたいですね。

## ホームポジション
ピアノと一緒で、正しい指使いは速く正確にタイピングをするための一番の近道です。 
ミスが多い人はまずこれをマスターしましょう。

## 最後に
なんか偉そうに書いているけど、2年半くらいたっても全然できてないと思います。 
でも、意識して働いているかいないかでは大きく違うと思います。 
最後に尊敬する人に大学を卒業するときに言われた言葉を書いておきます。

```
「20代にどれだけスキルを身につけるかで、その先の社会人生活は決まります。とにかく最初の3年間をガムシャラに働いてください。そうすれば自ずと先は見えてくると思います。」
```

## 好きな記事
- ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習  
http://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7
CocoaPod install が止まってしまった場合の対処

問題
-----
`pod install` が、Analyzing dependenciesの途中で止まってハマってたのでメモ。（他の、pod install できないよ失敗するよ問題についてはリポジトリ入れ直しとか再setupとかで大抵直ると思う。そこらへんは関連記事もたくさんあるので省きます。）

cocoapods入れ直したり何度もしてたけど警告を見落としていたのが問題だった。英語は苦手でもちゃんと読もう。。。

```
WARNING: CocoaPods requires your terminal to be using UTF-8 encoding.
Consider adding the following to ~/.profile:

export LANG=en_US.UTF-8
```

原因
-----
文字コードの問題。
自分の場合はターミナルの言語設定がEUCになっていた。
動かすにはUTF−8じゃないとダメってことみたいですね。

解決策
------
案内されている通りに ~/.profile に `export LANG=en_US.UTF-8`を書いて保存。

存在確認

```
$cat ~/.profile
```

いなかったらファイルを作る。

```
$vi ~/.profile
```
export~ の一行足して、保存。


ターミナル開き直して確認してみる。

```
$source ~/.profile
$echo $LANG
```

これで

```
en_US.UTF-8
```
になっていたらOK.
Apacheにおける POODLE SSLv3.0 脆弱性問題とか

# Apache httpd + mod_ssl SSL 3.0 を無効
※自分用のメモ的な扱い。

世間一般の解説にあるSSLv2 および SSLv3 を無効に
(SSLv2 と SSLv3 以外はすべて有効にする)といった下記方法

SSLProtocol All -SSLv2 -SSLv3

では、

SSL Server Test
https://www.ssllabs.com/ssltest/index.html

にてチェックをかけると、無効っぽいけどinsecureとか出て、
なんだか気持ち悪い。

TLSv1.x 以外をすべて無効にする記述の
SSLProtocol -All +TLSv1

https://access.redhat.com/ja/node/1232613
application plist setting


> application icon

    "Icon file" (..iOS.. value = "icon.png")
    "Icon already includes gloss effects" (取消高光效果 value = YES)
    "UIPrerenderedIcon" (..iOSX.. value = true or checked)

    iPhone程序:
    图标名称             大小        圆角   用途                 必需
    Icon.png    	    57 X 57    10px  用于商店iPhone/iPod显示 必需
    Icon@2x.png		    114 X 114  20px  Icon.png的高清模式     
    Icon-Small.png	    29 X 29    20px  用于设置和Spotlight搜索
    Icon-Small@2x.png	58 X 58    8px   Icon-Small.png的高清模式
    
    ipad程序:
    图标名称        大小        圆角   用途              必需
    Icon-72.png    72 X 72    20px  用于在iPad桌面中显示  必需
    Icon-50.png    50 X 50    8px   用于iPad中的Spotlight搜索     
    Icon-29.png    29 X 29    10px  设置页面     
    
    通用程序:
    图标名称       大小        圆角   用途                必需
    Icon-72.png   72 X 72    20px  用于在iPad桌面中显示    必需
    Icon.png      57 X 57    10px  用于商店iPhone/iPod显示 必需
    Icon-50.png   50 X 50    10px  用于iPad中的Spotlight搜索     
    Icon-29.png   29 X 29    20px  用于设置和Spotlight搜索     
    
> Status bar

    "Status bar is initially hidden" (value = YES)
    "View controller-based status bar appearance" (value = NO)
    Setting: *.storyboard > View Controller > Status bar : None
API ヤフオク 開始時間

ヤフオクで出品の開始時間を収集できるAPIは無いでしょう?

下記商品リストAPIで終了時間はありますが開始時間はありません。 
http://auctions.yahooapis.jp/AuctionWebService/V2/categoryLeaf

よろしければ御意見お願いします。
MacOSのメニューバーはOptionキーでかゆいところに手が届く

`Option` (Alt)キーを押しながらクリックすれば
↓みたいに細かい情報が得られるし、

![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/48396/063eb14c-2135-8873-cae6-46b886a8697e.png)

↓みたいにサウンドの使用デバイス切り替えも簡単

![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/48396/b8ca63f7-757b-ea08-22be-98a54006ecea.png)

F11, F12で音量を変えるときや
F1, F2で画面の照度を変えるときなんかも

`Option`を組み合わせると環境設定にすぐ飛べるので便利。
MacOSX Yosemiteでlocalhostのドキュメントルートを変更する


Yosemiteでlocalhostを使う場合はこちらが参考になるかもしれません→[MacOS X の Yosemite (10.10) で Sites ディレクトリを使って localhost をアカウント別に利用する方法](http://qiita.com/tsumekoara/items/3ab4c2d863a55ca72d35)

ついでに、
[MacOS X の Mavericks (10.9) で Sites ディレクトリを使って localhost をアカウント別に利用する方法](http://qiita.com/tsumekoara/items/d4e25eedfc22900b5487)

# 目標

**/Users/USERNAME/Sites/public**
ここをドキュメントルートにする

# httpd.conf

以下二箇所を変更。

```rb
$ sudo vi /etc/apache2/httpd.conf
----
1.
#DocumentRoot "/Library/WebServer/Documents"
DocumentRoot "/Users/USERNAME/Sites/public"

2.
#<Directory "/Library/WebServer/Documents">
<Directory "/Users/USERNAME/Sites/public">
```

# USERNAME.conf

```rb
$ sudo vi /etc/apache2/users/USERNAME.conf
<Directory "/Users/USERNAME/Sites/public">
    AllowOverride All
    Options Indexes FollowSymLinks Multiviews
    Require all granted
</Directory>
```

# apachectl restart

```zsh
$ sudo apachectl restart
```

# テスト

該当のディレクトリになんか文字列を書いたindex.htmlでもおいて、http://localhost/index.htmlとか接続してみる。
index.htmlの内容が表示されたらOK
CSSアニメーションでゆらゆらさせる

## サンプル
http://codepen.io/skwbr/full/JdJWqV
（※横着してwebkitプレフィックスしかつけていないのでChromeからどうぞ...）

<iframe width="100%" height="300" src="http://jsfiddle.net/volkuwabara/jydv06no/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>

## 解説
フワフワというかゆらゆらというか宙に浮いているようなアニメーションをさせる場合。

```html
<ul>
<li><a href="#"><img src="hogera.png"></a></li>
<li><a href="#"><img src="hogera.png"></a></li>
<li><a href="#"><img src="hogera.png"></a></li>
</ul>
```
みたいな場合を考えるとき

```css
@keyframes horizontal {
    0% { transform:translateX( -3px); }
  100% { transform:translateX(  0px); }
}
@keyframes vertical {
    0% { transform:translateY(-10px); }
  100% { transform:translateY(  0px); }
}
```

みたいに左右に揺れるアニメーションと、上下に揺れるアニメーションを各々定義しておいて、例えば`li`には前者、その中の`a`には後者を当てるなどして、平面上を上下左右にゆらゆらしているように見せる。

```css
li {
  animation: horizontal 1s ease-in-out infinite alternate;
}

li a {
  animation: vertical 1s ease-in-out infinite alternate;
}
```

また複数のものがランダムにバラバラに動いているように見せたいときは、
単純にアニメーションの種類を増やしたり、

```css
li:nth-child(1) { animation-duration: 1.1s}
li:nth-child(2) { animation-duration: 1.3s}
li:nth-child(3) { animation-duration: 1.5s}
```
のように `animation-duration` (アニメーションにかける尺)をキリの悪いバラバラ指定にするとランダム感が増す。


（※ベンダープレフィックスは心のなかで補ってください）
外部SWFの一時停止/再開の時のサウンド


loadした外部SWFに対し、子孫MCを含めてピタッと一時停止したり再開させたいときは、

http://henachoco-as3.blogspot.jp/2012/04/movieclip.html

に書かれているような、再帰処理を書いて子孫MCが見つかるだけ辿っていって一個一個止める操作が必要（これがベスト案かは疑問？）
再開する場合は同じ容量で `play();`を していけばよい。

しかしこれだけだとSWF内部のタイムラインに埋め込まれた音が止まらない。

```as3

loader.unloadAndStop();
```

をすることで止まるが、再開するときに問題があった。
サウンドが再開されなかったり、次の一時停止でとまらなかったり。

## 解法

![sound.png](https://qiita-image-store.s3.amazonaws.com/0/48396/ef88950c-8ac9-ef55-3c18-71cf0e6665b2.png)


タイムラインにキーフレームを打ってサウンドを埋め込んでいる場合、
プロパティパネル > サウンドの「同期」オプションが`ストリーミング` になっているとうまい具合にサウンドも一時停止/再開される。

ただしこの選択にすると、ループするタイムラインの末尾でサウンドを再生開始させる場合、タイムラインが先頭に戻った時にサウンドが切れるようだ。
またパブリッシュ設定の ストリーミングサウンドの音質に注意。
とりあえずpackge.jsonがあってgruntを使っているであろうプロジェクトファイルを渡されてたときの対応、というかgruntを使った開発入門

フロントエンドというかデザイン的な部分の開発を担当したときのこと。
急にヘルプに入ったので右も左もよくわからなかったのですが、とりあえずgruntを使っているであろうプロジェクトファイルを渡されました。
packge.jsonを見つけて中を覗いてみると、gruntが要りますよ的な記述があったので、まぁgruntを入れるか〜とか思っていました。

# 内容

ドットインストールのまとめになります。
http://dotinstall.com/lessons/basic_grunt

# 環境

- Yosemite
- Homebrewは入ってる([homebrewについてはこちらが参考になるかもしれません](http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc))

# node.jsとnpmをインストール

```zsh
$ brew install node
```

これでとりあえず入りました。

```zsh
$ npm -v
2.1.10
$ node -v
v0.10.32
```

# gruntをインストール

package.jsonがもうあって、そこにgruntの記載もあるので、以下の様にしてgruntをインストールします。

```zsh
$ npm install
```

記載された内容の通りにインストールされるはずです。

# gruntの使い方

簡単なメモ程度になります。

Gruntfile.jsをいじります。

## 基本的な書式

```js
module.exports = function (grunt) {
  grunt.initConfig({
    task1: { // たいていプラグイン名と一緒
      options: { // このタスクの全ターゲット共通でオプションを設定する
      },
      target1: { // タスクをグループ化したもの
        options: { // target1に対してのオプション
        },
        設定
      },
      target2: {
        設定
      }
    },
    task2: {
      ・・・
    }
  });
  grunt.loadNpmTasks('PACKAGENAME'); //packageを読み込む
  grunt.loadNpmTasks('PACKAGENAME');

  grunt.registerTask('default', ['task1', 'task2']); //タスクを登録
};
```

## 基本的な例

```js
module.exports = function (grunt) {
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),

    sass: {                    // タスク名
      fugafuga: {              // ターゲット名
        options: {             // オプションを選びます
          style: 'compressed', // nested, compact, compressed, expanded
        },
        static_page: {
          'assets/css/fugafuga.css': 'scss/*.scss' // 'destination': 'source', sourceのファイル群をdestinationのファイルにマージする
        }
    },

    watch: { // いちいちgruntやgrunt tasknameとか打たなくても該当のファイルに変更が加わった場合に指定されたタスクを動かす設定
      fugafuga: {
        files: ['scss/*.scss'],
        tasks: ['sass'],
        options: {
          livereload: true // ファイルのが変更されたら、connectされたサーバーでも、変更を自動で反映させる設定
        }
      },
    },

    connect: { // サーバーに接続する
      fugafuga: {
        options: {
          hostname: 'xxx.xxx.xxx.xxx', //192.168.33.10とか
          port: xxxx // 8080とか
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-sass');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-connect');

  grunt.registerTask('default', ['sass', 'connect', 'watch']);　//connectを使う場合はwatchの前に登録しないとダメ。ずっとwatchが走ってconnectされないから。
```

## livereloadを使う場合

html側に設定が必要
以下を追記します。

portは35729と決まっている模様。

```html
<script src="http://IPADDRESS:35729/livereload.js"></script>
```

# References

- http://dotinstall.com/lessons/basic_grunt


# トラブル

## zsh: command not found: grunt

/usr/local/binにもgruntが作成されない。
コマンドラインからgruntを使うときには

```zsh
$ npm install -g grunt-cli
```
超絶簡単なLearning to Program Well

[超絶分かりやすいオブジェクト指向入門](http://qiita.com/nobkz/items/f61ab6f942b8f9b77396)に触発されて。

同じくBertrand Meyer先生による入門書
[Touch of Class](http://www.amazon.co.jp/Touch-Class-Learning-Program-Contracts/dp/3540921443/)
---

![TouchOfClass 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59918/248b9f53-a708-b913-4f67-28ab05a6218d.jpeg)
Google Play Services の SDK がようやく分割されるのでワクワクしますね

[元記事はこちら](http://android-developers.blogspot.jp/2014/11/google-play-services-65.html)

どうも、Android Advent Calendar に登録するのを忘れていて、折角の機会を棒に振った KeithYokoma で御座います。
元記事はもう先月の話ですのでご存じの方も多いかと思いますが、ついに、あの Google Play Services の SDK が分割されます。今まで、[Jake Wharton があまりのデカさに涙目になった](http://jakewharton.com/play-services-is-a-monolith/)り、これによって 64k のリミットに引っかかってビルドができなくなったり、これを回避するために[頑張って MultiDex に対応](http://qiita.com/KeithYokoma/items/385a94988beb2d7d8043) したりしてきたことと思いますが、もう悩むことはありません。

## Google Maps

API として、ナビゲーションの開始をサポートするものが増えるので、簡単にナビゲーション機能が実現できるようになります(もちろん、今までも Intent で頑張る方法があったりはしましたが…)。

また、ライトモードとして、地図の一枚絵を出す API が提供されます。場所とズーム率を指定することができます。

この他、マップの準備ができたことをコールバックしたり、Intent による各種マップ機能の呼び出し(ストリートビュー、ナビゲーション等)をサポートする API が増えています。

## Drive

Google ドライブ内のファイルのプロパティとして、公開とアプリケーション固有のカスタムな設定ができ、これによって効果的な検索クエリの発行ができます。また、他のアプリがファイルを編集してもその結果が保存されるようにすることができます。

他、ユーザやバッテリーにやさしい機能として、ネットワーク状態や充電状態に応じた自動同期と、ペンディング中のアップロードの中止などが提供されます。

## Google Wallet

"Buy with Google" ボタンで、Google Wallet を使った課金が実装できることに加え、"Donate with Google" ボタンが追加され、寄付に関連する実装も簡単になります。

## Google Fit

Google Fit SDK は最近リリースされましたが、今回のリリースでは、セッション開始時の Activity Segments の追加が簡単になり、ポーズや複数のワークアウトをサポートすることが簡単になります。

## Granular Dependency Management

Google Play Services の広範な機能へアクセスするための API を追加し続けてきたため、アプリをスリムに保てなくなってきました。特に、使わない API の SDK も保持しなければならないのは非常に不便でなりませんでした。そこで、6.5 のリリースでは、アプリが必要とする最小限の SDK のみを組み込むことができるようになります。

## SDK coming soon!

6.5 は数日以内にリリースされます。リリースしたらこのブログ記事でお知らせします！
(11/17 の記事ですがまだアップデートはありません…)
TeamGeak要約

 
##ミッションステートメント
 本書の目的はプログラマがソフトウェア開発を効果的かつ効率的にするために、他人の理解・コミュニケーション・コラボレーションの能力を向上させることである。
 
##Ideal Geek
###HRTの3原則（この本で最も重要）
>この３つを合わせて「HRT」(ハート)と呼びたい。苦痛の「hurt」ではなく心の「heart」である。この本の主張はこの三本柱で成り立っている。
>>#####　あらゆる人間関係の衝突は、謙虚・尊敬・信頼の欠如によるものだ

　1.謙虚(Humility)
>世界の中心は君ではない。君は全知全能ではないし、絶対に正しいわけでもない。常に自分を改善していこう。

　2.尊敬(Respect)　
>一緒に働く人のことを心から思いやろう。相手を１人の人間として扱い、その能力や功績を高く評価しよう。

　3.信頼(Trust)
>自分以外の人は有能であり、正しいことをすると信じよう。そうすれば、仕事を任せることができる。



###ソフトウェア開発はチームスポーツである
>秘密の発明をこっそり準備していたら、世界を変えることも出来ないし、数百万人のユーザーを喜ばせることもできない。誰かと一緒に仕事をしなければいけないんだ。

###１人でやっていると失敗のリスクが高くなる
>大きなソフトウェアを書く時に、数日〜数週間かけてコードを書いて、完璧にできたと思ってから、はじめて[コンパイル]ボタンを押すだろうか？5万行のコードを一気にコンパイルしたらどうなるか想像できるはずだ。プログラマには強いフィードバックループが必要だ。

>最初のビジョンを洞窟で完成させたとしても、すでに世界は変わっているし、プロダクトは不適切なものになっている。つまり、１人で仕事をする方がリスクが高いということだ。

###早い段階で失敗・学習・反復する

>過ちから学ぶのに必要なのは **文書化** だ。必要なのは不完全なソフトウェアを見せても構わないという謙虚と、ユーザーがその対応を称賛し、迅速な改善を望んでいるという信頼だ。

##CULTURE
>Under construction

##How to be a LEADER
>Under construction


##How to deal with noisy people
>Under construction


##Polics in the team
>Under construction


##Focus on Users
>Under construction
Yosemite10.10.2のbluetoothがおかしいっぽいときは

再起動ではなくシステム終了すると良いみたいです

- Instant HotspotがiPadとiPhoneの間では正常で、Yosemiteから見えない
- TokenLockも赤くなる（iPhoneが見えない）
- マウスは使えてる

OSXになってからシステムが安定しかかってくると壊したがるのはジョブズのDNA?
個人的に共感できます。

update2014/12/12 10.10.2（14C78c）

家から事務所に来てレジューム解除する時にInstant Hotspotされなくなるっぽい（事務所から家は問題無いことが多い）
→ Macbook電源落として再起動でInstant Hotspot復旧する
さくらの VPS に HiveMQ をインストールして MQTT の websocket  bridge を有効にする手順


#はじめに
自身の備忘録として掲題の件、ここに残させていただきます。どなたかのお役にたつことがあれば幸いです

※2015.12.29追記：今だと mosquitto1.4 を websocket有効でビルドするほうがいいのかもしれません、手順（というかshell）をコメントに書きました

#なぜ [HiveMQ](http://www.hivemq.com) なのか
MQTT の Websocket bridge が必要だったのですが、[mosquitto](http://mosquitto.org) では現行の 1.3 系にはそれがなく、開発系の 1.4 を自分でビルドするか mod_websocket を使うなどが必要になります。[Sango](https://sango.shiguredo.jp/#plan) も検討したのですが月間最大メッセージ数の制限が合わず、[CloudMQTT](http://www.cloudmqtt.com/docs.html)は Websocket がありませんでした。そこで HiveMQ を VPS にインストールして試してみました

#インストール
## 事前準備：port 1883 と 8000 の開放
HiveMQ は mqtt と websocket のポートにデフォルトでそれぞれ
1883 と 8000 を使いますので、事前に /etc/sysconfig/iptables に以下を追加して、iptables を restart しておきます

```bash:iptables
# for hiveMQ
-A SERVICES -p tcp --dport 1883 -j ACCEPT
-A SERVICES -p tcp --dport 8000 -j ACCEPT
```

```
sudo /etc/rc.d/init.d/iptables restart
```

## 事前準備：JRE のインストール
sudo yum install JRE がエラーになってしまうので、rpm をダウンロードしてきてインストールします。[こちら](http://java.com/ja/download/help/linux_x64rpm_install.xml)の手順を参考にさせていただきました.
1. rpm ファイルをダウンロード
2. インストール

```
rpm -ivh jre-7u7-linux-x64.rpm
```
## HiveMQ のダウンロード
### ダウンロードと動作確認
[こちら](http://www.hivemq.com/documentations/getting-started/)の手順を参考にさせていただきました。

1.download

```
	wget --content-disposition http://www.hivemq.com/downloads/releases/latest
```

2.解凍して動作確認

```
unzip hivemq-<ダウンロードしたバージョン>.zip
cd <hivemq をダウンロードしたディレクトリ>/bin
chmod 755 run.sh
./run.sh
```

mosquitto などで pub/sub できることを確認します
##Websocket を有効化
[こちら](http://stackoverflow.com/questions/26622922/websocket-connection-error-with-hivemq-2-1-0-eclipse-paho-javascript-mqttws31)の方と同じハマりかたをしてしまいました ^^;
自分がハマるようなネタは誰もが既にがハマっていて、誰かが stack overflow で既に聞いてくれていて、誰かが stack overflow で既に答えてくれている。有り難い世の中になったものです
デフォルトでは Websocket が無効になっているので
nano 等で conf/configurations.properties を開き、
websockets.enabled の設定を false から true に変更します

## サービスに設定
[こちら](http://www.hivemq.com/docs/hivemq/2.1.1/#starting-hivemq-chapter)を参考にしました

1. hivemq アカウントを作成し、ファイルの所有者の変更

```
useradd -d /opt/hivemq hivemq
chown -R hivemq:hivemq <hivemq をダウンロードしたディレクトリ>
```

2. 初期化スクリプトの /etc/init.d/ へのコピー

```
cp <hivemq をダウンロードしたディレクトリ>/bin/init-script/hivemq-debian /etc/init.d/hivemq
chmod +x /etc/init.d/hivemq
```

3.サービスの起動
sudo /etc/init.d/hivemq start

#参考文献
-[RPMを使用したLinux x64版Javaのインストール方法](http://java.com/ja/download/help/linux_x64rpm_install.xml)
-[HiveMQ: getting-started](http://www.hivemq.com/documentations/getting-started/)
-[HiveMQ User Guide: starting hivemq](http://www.hivemq.com/docs/hivemq/2.1.1/#starting-hivemq-chapter)
ListViewのクリックイベントがうまくいかない

ListViewにRatingBarを配置したときにはまったのでメモ。

リストの行ごとのレイアウトに、以下のように追加する。

```xml:row.xml
<LinearLayout
    android:descendantFocusability="blocksDescendants"
```

これで、RatingBarの方のイベントと、ListViewのonListItemClickイベントがどちらも取れるようになる。
【SwiftでCoreDataを使う】NSDataObjectSubclassを作っても、Entityが「Class not found」になるときの解決策


### エラー概要

SwiftでCoreDataにアクセスする処理を書いて実行すると、下記のようなエラーになった。
> CoreData: warning: Unable to load class named 'SampleEntity' for entity 'SampleEntity'.  Class not found, using default NSManagedObject instead.

![エクスプローラ](http://i.gyazo.com/00b4646743be6834f8fa77229ab29bf4.png)
SampleEntity.swiftファイルがプロジェクト上にあり、SampleEntityクラスも作成済みである。

### 解決策
http://stackoverflow.com/questions/25076276/unabled-to-find-specific-subclass-of-nsmanagedobject
質問サイトの中で下記ドキュメントが示されている。
https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WritingSwiftClassesWithObjective-CBehavior.html
ドキュメントで「Entity」でページ内検索すると、ヒットした箇所に、Xcode上でエンティティのClassについて、「Name:Person、Class: **MyCoreDataApp.**Person」に設定するという説明がある。
![](http://i.gyazo.com/36c2abe42662e809fe09bae7d4a4739c.png)



これを参考にして、自分のXcode上でやってみる。



![ad53c98a78af656ecbe19886b872884d.png](https://qiita-image-store.s3.amazonaws.com/0/28556/868d07c2-e93b-232f-153e-f91187801143.png "ad53c98a78af656ecbe19886b872884d.png")
(1)左ペインで「.xdatamodeld」ファイルを選択、(2)「ENTITIES」から該当のエンティティを選択、(3)右ペインで「Show model inspector」を選択、(4)「Entity」の「Class」名入力欄を表示させる。ここで
**「SampleEntity」→「CoreDataaSample.SampleEntity」**
に変更する。

修正後の動作状況
![](http://i.gyazo.com/42fe1d47c53f307c7e71a01d1df69fb2.gif)


### 前提条件
元々のプログラムは、下記のサイトを参考にさせて頂きました。
http://hidef.jp/post-652/
更に元々は、新プロジェクト作成のサンプル「Master-Detail Application」である。

これって「.xdatamodeld」ファイルもGUIで作成したし、NSDataObjectSubclassクラスも自動生成だ。Xcodeの自動生成時のバグじゃないの。

### ソース
アップしました。
https://github.com/hanoopy/CoreDataaSample
Provisioning ProfileをXcodeに手動インポートする方法


Xcode5あたりから、XcodeとiOS Provisioning Portalとの連携が行えるようになり、XcodeとProvisioning Portalの情報を同期させることができるようになりました。
ところがこれに合わせて、これまでOrganizerから行えていたProvisioning Profileのインポートが行えなくなりました。

アプリが自社開発などの場合は特に問題がないかと思いますが、受託開発の場合だとお客様からProvisioning Profileを頂戴してビルドするということがほとんどで、手動でのインポートができなると非常に困ります。

そんなわけで手動でインポートする方法がないか調べてみたところ、やはり方法ありました！！

###手順
1. Provisioning Profileを用意
2. Dock上にXcodeアイコンを表示
3. Provisioning Profileをドラッグして、DockにあるXcodeアイコン上でドロップする

これで無事Provisioning Profileのインポートが完了です。。
"Rubyistに贈るHaskell入門"がちょっと微妙だったので補足記事その1

ども@nobkzです、この記事
http://qiita.com/techno-tanoC/items/1549d0efc044faf16c36
がすごーく微妙だったので、個人的に追記していきたいと思います。

**注意:Rubyあんまり書いたことが無いのでお手やわらかに**
**ちょっと長くなりそうなので、回を分けます**

# 微妙だと思ったので追記したその1

## blockとProcオブジェクトについて

まずはですね、先の記事では、高階関数を、「ブロック渡しの関数」と「Procオブジェクトを返す関数」を作ってましたけど、それはそれで正しいのですが、もうすこし、ブロックとProcオブジェクト、Haskellのラムダ式に関して若干の記述の足りなさを感じていたため、追記します。


### blockはオブジェクトでは無いということ

まず、**blockはオブジェクトでは無いということです** 。これはどういうことかと言えば、もし、blockがオブジェクトであるならば、他のオブジェクトと同様に扱えるべきです。例えば、もしblockがオブジェクトであれば、代入ができるわけで、次の様な構文が可能であるべきです。

```rb
block = { puts "I am a block!"} # 不可
```

### Haskellの関数

Haskellは関数はファーストクラスであって、ふつうの値と同様に扱うことができます

```
let id = (\x -> x)
```

### blockをオブジェクト化 => Procオブジェクト

しかし、blockをオブジェクト化することは可能であり、それがProcオブジェクトであるわけです。Procオブジェクトは、blockを、変数のスコープやスタックフレームをオブジェクト化したものです。

```rb
proc_obj = Proc.new { puts "I am a Proc Object!" }

proc_obj.call #=> outputs : I am a Proc Object!
```

### Procオブジェクトにおける高階関数

なので、Procオブジェクトは、ふつうのオブジェクトとして使えるため、引数として使えます。

```rb
def call_only p
 p.call 
end

call_only(Proc.new { puts "I am a Proc Object!" })
```

もちろん、返り値としても使えます。

```rb
def return_proc
  Proc.new { puts "I have returned!" }
end 

return_proc().call
```

これにおいて、Procオブジェクトを用いて、Rubyは高階関数に相当する記述が可能であるわけです。つまり、**Rubyにおいて「関数を引数にする関数」というのは「Procオブジェクトを引数にしたメソッド」であり、「関数を戻り値にする関数」は「Procオブジェクトを返すメソッド」であるわけです** 。

### blockは、制限された「関数を渡す関数」

さて、Rubyにおいて、blockを渡すメソッドつまり、「block付きメソッド」というものがあります。先の記事においても紹介されていました。

先の記事では、高階関数における「関数を渡す関数」として、「block付きメソッド」を使ってました。それは、僕としても、間違ってはいないとは思います。

ちなみに、blockを引数にする関数はこうです。

```rb
def only_call_b &block
 block.call
end

# yieldを使ってこうも記述できる
def only_call_b
 yield
end

only_call_b { puts "I am a block" }
```

block付きメソッドというのは、

* blockは一つだけ
* blockは最後の引数

という制限があります。(だからyieldという記法も可能なわけですが)この点において、Haskellのラムダ式による高階関数としては、差異が見られます。どういうことかと言えば、**Haskellはこれと同様な制限が無い** ということです。

例えば、次のような関数を作ることが可能であるわけです。

```hs
Prelude> let sample x y cond = if cond then x . y else y . x
Prelude> sample (+1) (*2) True 1
3
Prelude> sample (+1) (*2) False 1
4
```

このようは関数をblock付きメソッドで作ることは不可です。

```rb
## 不可だが、強引に書いてみる
def sample(&x, &y, cond)
 if cond then ->(n){ x.call(y.call(n)) } else ->(n){ y.call(x.call(n)) } end
end
## 不可だが、強引に書くとしたらこう?
sample {|x| x + 1}, {|x| x * 2 }, true
```

さて、これを実装するには、「Procオブジェクトを渡すメソッド」として高階関数を作ってあげれば良いのです。

```rb
def sample(x, y, cond)
 if cond then ->(n){ x.call(y.call(n)) } else ->(n){ y.call(x.call(n)) } end
end

sample(->(n){ n + 1 }, ->(n){ n * 2 }, true).call(1)
sample(->(n){ n + 1 }, ->(n){ n * 2 }, false).call(1)
```

さて、まとめると、

* block付きメソッドは、**「関数を一つだけ引数にして、かつ、最後の引数とする関数」という高階関数に相当するものであろう**ということ
* もし、Haskellと同等の高階関数に相当するものは、**「Procオブジェクトを引数にしたメソッド」「Procオブジェクトを返り値にしたオブジェクト」**がRubyにおける高階関数であるということです。

### 更に追記:そもそも、なんでblock付きメソッドがあるのか?

まぁ、これは詳しいソースは分かりませんが、おそらく

* Procオブジェクトを生成するコストが高いこと
* より、構文っぽく見える

からかなぁと思ってます。なんとなく。
サクラのレンタルサーバーで共有SSLを使うとHTTPSを認識しない問題

サクラのレンタルサーバーで共有SSLを使ったら、PHPがhttpsと認識してくれなかった。本来なら、下記のコードで

```php
echo isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && $_SERVER['HTTPS']!== 'off';
```

判定できるのだけれど、HTTPSの項目が抜け落ちてしまう。

> 書いてみると、意外と判定は面倒なのですね。

### 原因はプロキシサーバー

サクラのホームページを見ると、[共有SSLを使うと、プロキシとして動作する](http://support.sakura.ad.jp/manual/rs/web/ssl_attention.html)と書いてある。これが原因とのこと。

ややこしいのだけれど、httpsで接続しても、直接phpを叩く場合は問題ない。

この症状がでるのは、.htaccessなどでmod_rewriteしたような場合のみ。らしい。（この辺、よくわかってない）。


### 対処方法

共有SSLプロキシを使った場合、サーバー変数に「HTTP_X_SAKURA_FORWARDED_FOR」という値が設定されるので、それを使ってゴニョゴニョする。

ということで、こちらの元ネタのブログをどうぞ。

[さくらレンタルサーバーの共有SSLを使う](http://wsf.mot.or.jp/yujakudo/website-admin/use-shared-ssl-of-sakura/)

[さくらサーバでＳＳＬ通信にリダイレクト](http://d.hatena.ne.jp/vivid_skid/20120321/1332317922)

### Laravel 4.2 での対処法

この問題が出たのは、Laravel 4.2で開発していたとき。
まずはSymfonyのRequestクラスにある[isSecureというメソッドでプロキシの設定](https://github.com/symfony/HttpFoundation/blob/master/Request.php#L1139)が出来ないか検討してみた。

が、httpsを含まないといけない、とか書いてあって無理そう。
面倒くさがり屋なので、早速諦めて別方法を模索。

こちらの「[Laravel で常に https でアクセスさせる](http://localdisk.hatenablog.com/entry/2013/12/17/Laravel_%E3%81%A7%E5%B8%B8%E3%81%AB_https_%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%95%E3%81%9B%E3%82%8B)」を参考にして、フィルターとして次を実装してみた。ファイルは「```app/filters.php```」。

```php
App::before(function($request)
{
    // サクラサーバーの共有SSL対策
    /** @var Request $request */
    if (App::environment('production')) {
        $request->server->set('HTTPS', 'on');
        \URL::forceSchema('https');
        if (!isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR'])) {
            return Redirect::secure($request->path());
        }
    }
});
```

「本番環境の場合、URLは全部httpsで始めること、そしてX_SAKUR…が未設定ならhttpsで再接続」ということですね。

【2015/01/23追加】

コードに```$request->server->set('HTTPS', 'on');```を追加しました。\$request側にもHTTPSの設定を行う必要がありました。具体的にはPaginationで、\$requestのURLGeneratorを直接使っていたので、両方に設定しないと問題が発生しました。


> お客さんと話をして、レンタルサーバーでのホスティングをやめる、というのが本来の解決法な気はします。
【iOSレビュー】特急審査という手段

iOS版のアプリが、11月21日にリジェクトされた。
すぐ直せるような内容だったのでその日のうちに出したのだが
今朝（12月2日8時）に確認すると、まだレビュー待ちの状態。

どうなっているのだ？？と思って師匠に相談してみると
「特急審査」というのがあるみたい、自分は使ったことがないけれどとのこと。
調べてみると
iPhoneアプリ開発備忘録　さんの
http://iphone-app-developer.seesaa.net/article/178317675.html
が見つかった。

英文で審査を急ぐ理由を書いて提出するようだ。
本当に急がなくてはならないときにだけ使うようにしたいが
このような方法があることも覚えていて損はないだろう。

ちなみにこのあとすぐレビューに入ったので、
私はこの機能を利用してはいない。
カスタムローディングを使ってアプリに個性を出す


## はじめに
2日目のエントリです。
今日は gif ライクなローディングアニメーションを作成する方法を紹介します。


## 素材を用意する
ローディングに使用する素材を用意します。今回は Androidify を使って、↓のようなものを用意してみました。
https://www.androidify.com/ja/#/

![droid.png](https://qiita-image-store.s3.amazonaws.com/0/39324/7c36201b-40df-874a-0893-b43ee928f220.png "droid.png")



## animation-list を用意する
用意した素材を表示する順序、表示間隔を指定します。

```xml:custom_progress.xml
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/droid_normal" android:duration="400" />
    <item android:drawable="@drawable/droid_lovely" android:duration="400" />
    <item android:drawable="@drawable/droid_sexy" android:duration="400" />
    <item android:drawable="@drawable/droid_hot" android:duration="400" />
</animation-list>
```

## アニメーションを開始する

作成した animation-list を、アニメーションを表示する View の background に指定します。

```xml:fragment_sample.xml
<View
   android:id="@+id/progress"
   android:layout_width="48dp"
   android:layout_height="48dp"
   android:background="@drawable/custom_progress" />
```

getBackground で取得した Drawable を AnimationDrawable にキャストし、start メソッドを読んであげれば終了です！

```java:SampleFragment.jva
View view = rootView.findViewById(R.id.progress);
AnimationDrawable anim = (AnimationDrawable) view.getBackground();
anim.start();
```

## カスタム View を作る

どうせなら毎度アニメーション用のコードを書かずに、こんな感じで使いたいですよね。

```xml:fragment_sample.xml
<com.example.myapp.CustomProgress
   android:layout_width="48dp"
   android:layout_height="48dp" /> 
```

というわけでカスタム View も作ってみます。

```java:CustomProgress.java
public class CustomProgress extends View {

    public CustomProgress(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        Drawable drawable = getResources().getDrawable(R.drawable.custom_progress);
        setBackground(drawable);
        AnimationDrawable anim = (AnimationDrawable) getBackground();
        anim.start();
        invalidate();
    }
}
```

## 完成
こんな感じに仕上がりました！

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/39324/e2f80d8e-aeba-2ee0-a08d-bf4d7a3c5f7c.gif "Untitled.gif")


## 参考
http://developer.android.com/guide/topics/resources/animation-resource.html
【Filemaker】テーマはいつでもカスタマイズできる

[前回](http://qiita.com/tyuma/items/f87d7e8dd6c2a31d9c82 "【FileMaker】テーマの共有")はテーマをカスタマイズして共有しようという趣旨でした。
しかし、大抵開発においてお客様の要望は最後まで変わるものです。
テーマを最初に決めておいてもいいのですが、決めたものは決めたものでそのままで納品するのはお客様の意図にそぐわないレイアウトになってしまっているかもしれませんね。

テーマはいつでも変えられます。

カスタマイズしたテーマも同様です。

追加してみましょう。

[前回](http://qiita.com/tyuma/items/f87d7e8dd6c2a31d9c82 "【FileMaker】テーマの共有")のカスタマイズテーマに、新たに「表示のみ」のスタイルを登録します。
![1202_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/14ac7075-3080-224f-cae2-23e93b21ea20.png)

テーマを更新したいファイルで、テーマのインポートを行います。
ちゃんとカスタマイズしたテーマのリストが同様にでてきます。
![1202_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/3de54fdc-bc81-a807-2adb-dfcc8f6ed656.png)

このとき、すでに同じ名前でテーマが入っている場合は、上書きするか、両方を生かすかということを聞いてきてくれます。
![1202_3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/d3bdff30-f488-28f0-04fb-9ac66ea206a5.png)

今回は[前回](http://qiita.com/tyuma/items/f87d7e8dd6c2a31d9c82 "【FileMaker】テーマの共有")のスタイルもすでに入っているので上書きを選択してインポートしてみます。
[前回](http://qiita.com/tyuma/items/f87d7e8dd6c2a31d9c82 "【FileMaker】テーマの共有")設定した項目のスタイルもきちんと入っています。
![1202_4.png](https://qiita-image-store.s3.amazonaws.com/0/60538/7a134de5-d6d0-8142-42e4-e76fa7f5fe15.png)

もちろん、今回設定した表示のみスタイルも入っています。
![1202_5.png](https://qiita-image-store.s3.amazonaws.com/0/60538/18c3c5ea-ac6a-9ad9-f049-dab3541d4da3.png)

こうしたことから、いくらFileMakerでは見栄え良くできるからと言って最初にデザインを決めてしまうのではなく、コロコロ変わる顧客要望に応えられるようにデザインについては最後まで当てない、もしくは開発をしつつテーマの更新をしてレイアウトを整えることが効率よく開発できることになるかと思います。

一度作成してしまってから「やっぱりこのテーマ使ってください」とか言われると、腹たちますよねぇ。

〆です。
![1202_6.png](https://qiita-image-store.s3.amazonaws.com/0/60538/4aa9cc9a-e078-6ea3-f449-28cfb910f4b9.png)
SquirrelのC++11バインディングを作った話

# Squirrel/squallとは

SquirrelのC++11バインディング「squall」を作ってみました。

Squirrelについてご存じない方のために説明しますと、概ね「luaの置き換えを狙った組み込み言語」です。文法は「クラスのあるJavascript」といった趣で、スクリプト側から見るとあまり癖がない印象ですが、コルーチンなどはあります。

現状luaの牙城を崩せてはいない感じなのでマイナー言語だと思ったのですが、市販ソフトも含めてそれなりに使われているようなので、マイナー言語Advent Calenderの去年の方針からすると当てはまらなかったかもしれません。本も出てますし。

とはいえ、C++11の機能を利用したバインダの実装が割とコンパクトに纏まった気がするので、今後似たような組み込みスクリプト言語が現れたら、そのC++11バインディングを作るのに多少参考にしてもらえるのではないか、ということでAdvent Calenderに登録させていただきました。

# Squirrelの組み込み

SquirrelをC（組み込む）側から見ると、だいたいluaと同じようなインターフェイスでスタックマシンをあれこれしてスクリプトを呼び出したり呼び出されたりするようになっています。ただこのスタックマシン操作がものすごくメンドクサくて、例えばSquirrel関数を呼び出すために引数を１個ずつプッシュするといったような操作を求められるので、適当なバインダーが必要になってきます。

SquirrelのC++バインディングは、わざわざ私が作らなくてもすでにいくつか存在するのですが、どれもC++03時代に作られていて、本来ナマの仮想マシンには存在しないはずの制限が加わっていたりするので、今回あえてC++11全開（当社比）で作りなおしてみました。既存のものと比較すると、グローバルな状態が存在しないクリーンな設計が特徴となっております。まだ実務で使ってみたことがないので、実用に耐えるかはわかりませんが……

レポジトリはこちらです。
https://github.com/jonigata/squall

# squallの雰囲気

例えば、C++側でラムダ式を作ってそれをSquirrelにグローバル関数として登録する場合、このような感じで記述できます。

```cpp
#include "squall/squall_vmstd.hpp"
#include <iostream>

int main() {
    squall::VMStd vm;

    vm.defun("bar", [](int x)->int {
            std::cout << "**** lambda: " << x << std::endl;
            return 7777;
        });

    return 0;
}
```

# 実装するかどうか迷ってる機能

~~Squirrelではクロージャを使えるので、その気になればstd::function <-> Squirrelクロージャの相互変換をサポートすることも可能なのですが、embedでクロージャの交換をしたがる人なんているのかなという疑問が晴れないので、今のところ実装する気がないです。めっちゃ使います！！！　という人がいたらやりますが、どっちかというとPullRequestがほしいです。~~ cocos2dに組み込んでたら自分が必要になったので対応しました。

コルーチン対応は実装しました。

# 実装で難しかったところ

※マイナー言語に関する話題はここで終わりです、ごめんなさい。これからはC++11に関する話です。といっても、これから組み込み言語を作ろうという方にはそれなりに参考にしてもらえる話ではないかと思います。

とにかく、関数登録するのに任意のCallableオブジェクトを渡すのが困難でした。

C++には、関数として呼び出せるものに「関数ポインタ」「std::function」「ラムダ」「operator()をオーバーロードしたオブジェクト」などがあるのですが、それらをすべて受け取れるようなtemplate関数をつくろうとする場合、こういうことができそうでできません。

```
struct Foo {
    void operator()(int) {}
};

template <class F>
void bar(F f) {
  std::function<型がわからない！> ff = f;
}

int main() {
    bar([](int)->void { });
    bar(Foo());
}
```

Callableのシグネチャを得る`function_traits<F>::signature`みたいなものが標準であるかな、と思っていたら、どうもない（らしい）のです。なんでないのかな～と思いつつ調べたりしながら作っていたところ、なんとなく理由がわかりました。

```
struct Foo {
    void operator()(int) {} 
    void operator()(float, bool) {} 
};

template <class F>
void bar(F f) {
    using sig = std::function_traits<F>::signature; // どっちのオーバーロード？
    std::function<sig> ff = f;
}


int main() {
    bar(Foo());
}
```

このように、関数風オブジェクト(C++用語ではなぜかファンクタといいます)のシグネチャは一意に決定できないからです。

まあ、そのうち、こういうときはvariadic templateみたいにpackするみたいな仕様が生まれてfunction_traitsが制定されたりするかもしれませんが、現状はオーバーロードはないものとして自作するしかないようです。

結果的には、このような形になりました。https://github.com/jonigata/squall/blob/master/squall/squall_make_function.hpp そんなにTMPに慣れているわけではないので、おかしいところがあったら教えていただけるとありがたいです。
[Swift]Spritekitでスクリーンショットを撮る

Xcode>File>Project>Gameで生成された、GameViewController.swiftの中でスクリーンショットを撮ろうとした。

#失敗したコード
調べてみると、以下の記事が出てきた。

[How to take Full screen Screenshot in swift?](http://stackoverflow.com/questions/25448879/how-to-take-full-screen-screenshot-in-swift)

```swift
UIGraphicsBeginImageContext(view.frame.size)
view.layer.renderInContext(UIGraphicsGetCurrentContext())
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
```
しかしこれを実行してもキャプチャは真っ白でうまく撮れていなかった。


#うまくいったコード
今度はこちらの記事を読んだ
[Screenshot in swift iOS?](http://stackoverflow.com/questions/25444609/screenshot-in-swift-ios?lq=1)

```swift
UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, 0);
self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let image:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
```
上のコードを実行するとうまくできた。


なぜかはわかりませんでした・・・。
baserJSの機能一覧

コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## 基本的な機能

baserJSは最近流行りのMV*系のフレームワークなどではなく、単純にDOM操作系のライブラリです。現在は [jQuery](http://jquery.com/)に依存しているので、jQueryプラグインといってもいいです。（今後のJSライブラリ界隈の状況や、ブラウザの実装状況が変わったら、jQueryから分離することもあるかもしれません。）

## 機能一覧

基本的にはjQueryのインスタンス(jQueryオブジェクト)から呼び出して実行します。

|メソッド名|機能|
|---|---|
bcYoutube|YouTubeを埋め込む
bcScrollTo|要素のある位置までスクロールアニメーションする
bcRadio|WAI-ARIAに対応した装飾可能な汎用要素でラップしたラジオボタンに変更する
bcCheckbox|WAI-ARIAに対応した装飾可能な汎用要素でラップしたチェックボックスに変更する
bcSelect|WAI-ARIAに対応した装飾可能な汎用要素でラップしたセレクトボックスに変更する
bcMaps|GoogleMapsを埋め込む
bcBoxAlignHeight|要素の高さを揃える
bcBoxLink|要素全体をリンク可能にする
bcExtendLink|リンク先の拡張子によってクラスやアイコン画像を付加する
bcRollover|マウスオーバー時に画像を変換する
bcShy|マウスオーバー時に要素を半透明にする
bcWink|マウスオーバー時に要素を一瞬透明にする
bcSplitList|リスト要素を指定の数で分割する
bcImageLoaded|要素内の画像の読み込みが完了したときに指定の関数を実行する
bcBackground|要素を背景化する（画像・ビデオ・iframe対応）
bcKeepAspectRatio|親要素の幅に合わせて、指定の縦横比を保ったまま高さを変更する

* * *

各の機能の詳細は順次解説します。
ワイルドカードで作ったmysqlユーザにパスなしでログインできてしまう

正確には、ログインしたように見えているだけだった。
以下に、その原因と解決方法を書く。

#環境
* Mysql　5.1
* localhostからmysql環境を利用


#現象
create user abc@"%" identified by 'abc'　abcというパスワードのabcユーザを作成するも
mysql -u abc -p　でabcを入力してもログインできない。
mysql -u abcではログインができる。
しかし、ログインしても権限がなく何もできないので
実際にはログインしたように見えるだけである。

DBを見てみるとabcというユーザは存在する

```sql
select user ,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| abc  | %         |
| root | 127.0.0.1 |
| root | ::1       |
|      | localhost |
| pma  | localhost |
| root | localhost |
+------+-----------+

#なぜログインできたように見えるのか
mysql -u abcでログインをして、
current_user()を見てみると下のように@localhost、つまり匿名ユーザでログインしている状態になっている

```sql
mysql -u abc
select current_user();
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| @localhost     |
+----------------+
1 row in set (0.00 sec)
```


これは下のuserが空白になっているところの
localhostに接続していることを意味している。

```sql
+------+-----------+
| user | host      |
+------+-----------+
| abc  | %         |
| root | 127.0.0.1 |
| root | ::1       |
|      | localhost |
| pma  | localhost |
| root | localhost |
+------+-----------+
```

このことから以下のことが考えられる。

* localhostの環境からつないだ場合は、hostがlocalhostのところだけ見に行く
* だからlocalhostの匿名ユーザで勝手に入った
* さらに、匿名ユーザで入ったことから、 %はlocalhostを含まない

今回引っかかったのは原因、以下の２つ

* ***ワイルドカード%がlocalhostを含むと勘違いしていること***
* ***匿名ユーザの存在に気が付かないこと***

#現象への対応
思いつく対応は２つ

1. %のホストに対して、localhostの環境から無理やりつなぐ

```sql
# mysql -u abc -h 192.168.1.22 -p
Enter password: ***

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| abc@%          |
+----------------+
1 row in set (0.00 sec)
```
上のように、abc@%でアクセスが確認できる


2. abc@localhostを作成する



#匿名ユーザは削除
また匿名ユーザは必要ないと思われるので削除

```sql
DELETE FROM mysql.user WHERE User = ”;

--結果反映
FLUSH PRIVILEGES;
```
Atom Shellでスターターキットが用意された

# はじめに

https://github.com/atom/atom-shell-starter

```
git clone https://github.com/atom/atom-shell-starter
```

# jsonを編集れば好きな名前をつけられる

package.jsonを編集すれば好きな名前を指定できる

# 困ったこと

script/buildしても、アプリがどこに出来たのか分からない！

script/runで実行は可能なので、動かすだけなら出来るんだが。。

## 答え

TMPDIR配下に、アプリ名-buildって名前で作られる

script/runの中身を見て分かった。

OSによってはTEMP

# 気になって眠れないこと

Windowsだとネイティブモジュールを使うケースで対応ができてるのか？

## 対応するISSUEが未解決なんだが

[Renaming atom.exe breaks native modules #713](https://github.com/atom/atom-shell/issues/713#issuecomment-61294721)

このスターターキットのコミッターの方が何か回答しているから
もしかしたら対応出来てるのかもだが、Windowsで試すの億劫で
自分で確認してない。。

# 関連記事

- [俺がAtom Shellを注目している理由: misc](http://kjunichi.cocolog-nifty.com/misc/2014/12/atom-shell-3312.html)