OmniAICreator/Qiita-1.07M huggingface dataset:
[Unity2D]長方形のTexture2Dのデータから中央部分を正方形に切り出したい

# 背景
例えば、1280 × 720 または 720 × 1280 のようなTexture2Dのデータから、720 × 720 で中央部分を切り出したい。

これを
![スクリーンショット 2015-09-10 20.50.59.png](https://qiita-image-store.s3.amazonaws.com/0/32950/4cdccf2e-d921-8679-dab3-18a2190fd422.png)

こんな風に
![スクリーンショット 2015-09-10 20.51.52.png](https://qiita-image-store.s3.amazonaws.com/0/32950/09be92be-9701-b92a-3064-4455097aaa82.png)
したい。

# 作戦
1. 縦と横の長さを比較
2. 長い方の余白値（左右 or 上下)を求める
3. その余白を半分にして(左右 or 上下)からTexture2DのGetPixelsを使って切り出す

# コード

```csharp:clipTexture2D_v2.cs

Texture2D getCenterClippedTexture(Texture2D texture)
{
    Color[] pixel;
    Texture2D clipTex;
    int textureWidth = texture.width;
    int textureHeight = texture.height;
    
    if (textureWidth == textureHeight)
        return texture;
    if (textureWidth > textureHeight) { // 横の方が長い
        int x = (textureWidth - textureHeight) / 2;
        // GetPixels (x, y, width, height) で切り出せる
        pixel = texture.GetPixels(x, 0, textureHeight, textureHeight);
        // 横幅，縦幅を指定してTexture2Dを生成
        clipTex = new Texture2D(textureHeight, textureHeight); 
    }
    else { // 縦の方が長い
        int y = (textureHeight - textureWidth) / 2;
        pixel = texture.GetPixels(0, y, textureWidth, textureWidth);
        clipTex = new Texture2D(textureWidth, textureWidth);
    }
    clipTex.SetPixels(pixel);
    clipTex.Apply();
    return clipTex;
}
```
#まとめ
UnityのTexture2Dでは [GetPixels](http://docs.unity3d.com/jp/current/ScriptReference/Texture2D.GetPixels.html)を用いてTexture2Dのデータを切り出すことができる。
切り出したTexture2Dのデータを[SetPixels](http://docs.unity3d.com/jp/current/ScriptReference/Texture2D.SetPixels.html)で新しく生成したTexture2Dに貼り付けて返す。

#参考文献
[Texture2DからSpriteを生成する - のしメモ -アプリ開発ブログ-](http://noshipu.hateblo.jp/entry/2014/10/22/015832)
html5Modeにおいて、通常のリンクとルーティングのリンクを混ぜこぜにして書く方法

# 前提

## やりたかったこと

こんなことがしたかったのです。

```html:
<a href="/myapp/entry">Go Entry!</a><!-- ← これはルーティングしたい -->
<a href="/about">About Us</a><!-- ←これは普通のリンクになって欲しい -->
```

[Go Entry!]をクリックしたときは、ルーティングに従って画面を描画し、[About US]をクリックしたときは、普通にページをロードして欲しかったのです。

しかしhtml5Modeを有効にしリンクを書き換えるようにしてしまうと、[About US]もルーティングしようとしてなんも動きません。 :fearful: 

## 環境

AngularJS 1.3です。


# 解決策 :smile: 

[stackoverflow](http://stackoverflow.com/questions/16837704/angularjs-normal-links-with-html5mode)にありました。

ところを、あえてまとめなおします。

## 方法1

通常リンクのaタグにtarget属性をつける。

```html:
<a href="/about" target="_self">About Us</a>
```

## 方法2

異なるドメインへのリンクなら書き換えられない。

（今回は使えないですね）

## 方法3

baseタグを入れて、そのbase内だけのリンクを書き換えさせるようにする。

```html:
<base href="/myapp/">
```

コレだ！
[Java][test] Java Webテストツール文法まとめ

# 概要

http://java-source.net/open-source/web-testing-tools で紹介されているテストツールを使用したテストの書き方をまとめてみました。

# HtmlUnit

順当な感じです。

```java:
@Test
public void homePage() throws Exception {
    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
    Assert.assertEquals("HtmlUnit - Welcome to HtmlUnit", page.getTitleText());

    final String pageAsXml = page.asXml();
    Assert.assertTrue(pageAsXml.contains("<body class=\"composite\">"));

    final String pageAsText = page.asText();
    Assert.assertTrue(pageAsText.contains("Support for the HTTP and HTTPS protocols"));

    webClient.closeAllWindows();
}
```

# MaxQ

プロキシ型なので割愛。

# jWebUnit

DSLっぽくていい感じ。

```java:
import org.junit.*;

import static net.sourceforge.jwebunit.junit.JWebUnit.*;

public class ExampleWebTestCase {

    @Before
    public void prepare() {
        setBaseUrl("http://localhost:8080/test");
    }

    @Test
    public void testLogin() {
        beginAt("/home");
        clickLink("login");
        assertTitleEquals("Login");
        setTextField("username", "test");
        setTextField("password", "test123");
        submit();
        assertTitleEquals("Welcome, test!");
    }
}
```

# HttpUnit

順当な感じ。

```java:
    WebConversation wc = new WebConversation();
    WebResponse   resp = wc.getResponse( "http://www.httpunit.org/doc/cookbook.html" ); // read this page
    WebLink       link = resp.getLinkWith( "response" );                                // find the link
    link.click();                                                                       // follow it
    WebResponse   jdoc = wc.getCurrentPage();                                           // retrieve the referenced page
```

# Canoo WebTest

XMLなんだ。。。ちょっとつらそう。

```xml:
<project default="test">
 <target name="test">

  <webtest 
       name="check that WebTest is Google's top 'WebTest' result">
    <invoke url="http://www.google.com/ncr" 
            description="Go to Google (in English)"/>
    <verifyTitle text="Google" />
    <setInputField name="q" value="WebTest" />
    <clickButton label="I'm Feeling Lucky" />
    <verifyTitle text="Canoo WebTest" />
  </webtest>

 </target>
</project>
```

# JMeter

負荷テストでした。

# LoadSim

負荷テストでした。

# Lakta

リンク切れ。

# StoryTestMQ

Seleniumを使用。

# Slimdog

リンク切れ。

# Imprimatur

リンク切れ。

# slim

リンク切れ。

# Selenium

```java:
WebDriver driver = new InternetExplorerDriver();
driver.get("http://www.google.com");
driver.findElement(By.name("q")).sendKeys("Selenium");
driver.
```

# Watij

よさげ。

```java:
WebSpec spec = new WebSpec().mozilla();
spec.open("http://www.google.com");
spec.find.input().with.name("q").set.value("Watij");
spec.find.input().with.type("button").with.value("Google Search").click();
//check results
spec.find.a().with.href("http://watij.com/").shouldExist();
```
mongoose Webサーバを使ってサクッとMovableTypeを動かす。Yosemiteで。

ちょろっとだけMovableTypeを動かしたかったのです。その記録です。



# 必要なもの

## Xcode

Xcodeがインストールされていなければ、AppStoreからXcodeをインストールしてください。

## Homebrew

MacOS X向けパッケージマネージャです。monngooseのインストールに使います。

インストールされていなければ、[HomebrewのWebサイト](http://brew.sh)に書かれているやり方に従ってインストールしてください。

ターミナルを起動して以下をコピペするだけです。

```sh:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## cpanminus

CPANモジュールのインストールに使います。

インストールされていなければ、[cpanminusのREADME](https://github.com/miyagawa/cpanminus)に書かれているやり方に従ってインストールしてください。

ターミナルを起動して以下をコピペするだけです。複数人で使っているMacなので、ホームディレクトリにインストールしました。

```sh:
curl -L https://cpanmin.us | perl - App::cpanminus
```

## MovableTypeのzipファイル

[MovableType](http://www.movabletype.jp/opensource/)からダウンロードしておきます。




# mongoose、MySQLをインストール

Homebrewを使用してインストールします。

```sh:
brew install mongoose
brew install mysql
```

# Perlモジュールをインストール

## local::libをインストール

Perl関係の環境変数を簡単に設定するためにlocal::libをインストールします。

```sh:
~/perl5/bin/cpanm --local-lib=~/perl5/ local::lib
```

## 環境変数を設定

インストールしたlocal::libを使用して環境変数を設定します。

```sh:
eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
```

## DBI、DBD::mysqlをインストール

cpanmを使ってインストールします。

```sh:
cpanm DBI
cpanm DBD::mysql
```

# MovableTypeを起動

## 設定

MovableTypeのZIPファイルを適当なディレクトリに展開します。

展開した中にある``mt-config.cgi.original``を``mt-config.cgi``という名前に変更して編集します。

## PERLLIB環境変数

mongooseがCGI環境に引き継いでくれる環境変数は限られていて``PERL5LIB``は引き継いでくれませんので、``PERLLIB``を設定します。

```sh:
export PERLLIB=$PERL5LIB:~/perl5/lib/perl5/
```


**（書きかけ。。。続きはまた？ :sweat: :sweat: :sweat: ）**
【Jersey MVC Templates】Viewableを返すリソースをテストする

# 概要

## Jersey MVCを知っている人向け

自前のTemplateProcessorを作って、テスト時はそいつから適当な出力をさせましょうというお話です。

## Jersey MVCを知らない人向け

Java EEでRESTを実現する仕様であるところのJAX-RSの実装のひとつに、Jerseyというものがあります。

Jerseyには独自の拡張としてJersey MVC Templatesというものがあり、これを使うとMustach/Freemaker/JSPなどをテンプレートとして使用して出力を加工することができます。

わりとよくある感じの手順でWebアプリを作れるわけです。

# ソース

Viewableを返すリソースクラスをテストするときは、このダミーのテンプレートプロセッサを使うようにApplicationクラスの中で指定してください。

## ダミーのテンプレートプロセッサ

```java:TestTemplateProcessor.java
@Provider
public class TestTemplateProcessor implements TemplateProcessor<String> {

    @Override
    public String resolve(String string, MediaType mt) {
        return string;
    }

    @Override
    public void writeTo(
            String t,
            Viewable vwbl,
            MediaType mt,
            MultivaluedMap<String, Object> mm,
            OutputStream out)
            throws IOException {

        final ObjectMapper objectMapper = new ObjectMapper();

        try (PrintStream ps = new PrintStream(out, true, "UTF-8")) {
            ps.print("path=");
            ps.print(t);
            ps.println();
            ps.print("model=");
            ps.print(vwbl.getModel().toString());
            ps.println();
            ps.print("refletion=");
            ps.println(ToStringBuilder.reflectionToString(vwbl.getModel()));
            ps.println();
            ps.print("json=");
            ps.println(objectMapper.writeValueAsString(vwbl.getModel()));
            ps.println();
        }
    }
}
```

## Applicationクラスの例

```java:MyTestApplication.java
@ApplicationPath("res")
public class MyTestApplication extends ResourceConfig {

    public MyTestApplication() {
        super(MyTestTarget.class,
                MvcFeature.class,
                TestTemplateProcessor.class
        );
    }
}
```
Unity > 5.2.0f3 on MacOS X > 不具合 / 新機能

```txt:動作確認
Unity 5.2.0f3 on MacOS X 10.8.5
```

ふと何気なくUnityをアップデートした。
もうもどれない。

http://ejje.weblio.jp/sentence/content/no+turning+back
> There's no turning back.
> もう戻れない。

英語の勉強終わり。

<hr>
### 不具合らしきもの

気づいた不具合は以下。

- UI > Panelを追加したのに、プロジェクトを開き直した時にPanelが見えない。消えた?
- スクリプトをダブルクリックしてMonoDevelop-Unityを開いた時、スクリプトが開かない
  - というよりも、MonoDevelop-Unityが２つ立ち上がっていた。1つは空。１つはスクリプトが表示されている。安心のバックアップ機能？
  - そして、Unityを再起動するとMonoDevelop-Unityは1つだけ開くようになるという親切仕様
- GameObjectに関連づけていたスクリプトの関連付けが消えている。
- Assetsにおいて1つのスクリプトを消すと、シーンファイルも見なくなる
  - 表示だけの問題だった
  - Assetsをクリックすると、消えたシーンファイルがまた見えるようになる
  - 5.1.3ではスクリプトを消してもシーンファイルの表示は消えない
- Unity起動後のNewとOpenの位置が5.1.3と左右反対になっている
  - 5.1.3から移行時に押し間違える


他の不具合が見つかったら追加するかもしれない。

<hr>
### 気づいた新機能らしきもの

おそらく前のバージョンにはなかったもの

- UI > Dropdown
- UI > ScrollView : 垂直/水平にスクロールバーがついている
- 2D Rect Mask


<hr>
とりあえず、以下を参考に古いバージョンと併用してみる。
http://egulog.hatenablog.jp/entry/2013/12/22/170155
[memo] machine ごとに設定を切り分けるための変数とか command とか

# hostname
```
$ hostname
```

# OS 名、 version

## CentOS
`/etc/redhat-release`

他の distribution については http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name

# user 名

`$USER`

# window system

emacs では `window-system` に値が入っている。
【PHP】CSVファイルの読み込み

CSVファイルの読み込み方法はいくつかあるが、PHP5.1以上を使っているならSplFileObject::READ_CSVの一択。fopen+fgetcsvよりスピードが早い。

※SplFileObject::fgetcsvは遅いので注意。

参考：[【PHP】その CSV 変換、本当に「fgetcsv」でいいの？](http://blog.fenrir-inc.com/jp/2014/07/php-csv.html)

#SplFileObject::READ_CSV

```text:csv
foo1,foo2,foo3
bar1,bar2,bar3
```

```php:php
$file = new SplFileObject($filepath); 
$file->setFlags(SplFileObject::READ_CSV); 
foreach ($file as $line) {
  //終端の空行を除く処理　空行の場合に取れる値は後述
  if(is_null($line[0]){
    $records[] = $line;
  }
} 

var_dump($records);
/*
Array
(
  [0]=>Array
    (
    [0]=>'foo1',
    [1]=>'foo2',
    [2]=>'foo3',
    )
  [1]=>Array
    (
    [0]=>'bar1',
    [1]=>'bar2',
    [2]=>'bar3',
    )
)
*/
```

###空行も読み込む件
読み込み結果を記載する。

* 改行のみの行

```
array(1) {
  [0] =>
  NULL
}
```

* 半角スペースのみの行

```
array(1) {
  [0] =>
  string(1) " "
}
```

#fopen+fgetcsv
一応こっちも載せておく。

```php
if (($fp = fopen($filepath, "r")) === false) {
    //エラー処理
}

// CSVの中身がダブルクオーテーションで囲われていない場合に一文字目が化けるのを回避

setlocale(LC_ALL, 'ja_JP');

$i=0;
while (($line = fgetcsv($fp)) !== FALSE) {
    mb_convert_variables('UTF-8', 'sjis-win', $line);
    if($i == 0){
        // タイトル行
        $header = $line;
        $i++;
        continue;
    }

    $data[] = $line;

    $i++;
}

fclose($fp);

```

参考：[PHP5.2でCSVファイル取り込み](http://qiita.com/naoqoo2/items/c480681fa5c267da326b#comment-b0413a8f717085905992)
【Linux】tar と gzip の違い 〜二つは全然違った〜

とても初歩的なことですが、 tar も gzip も同じくファイルを圧縮するコマンドだと思い、スルーしてなんとなく使っていました。
そこで、両者の違いを一度きちんと調べてみました。

## tar (Tape Archival and Retrieval format)

tar コマンドには**圧縮機能はありません**。
tar コマンドは、複数のフォルダ・ファイルを一つのファイルにまとめる**アーカイブ機能があります**。

> tarは，複数のファイルを1つのファイルにまとめて管理するための，書庫管理コマンドだ。複数のファイルを1つのファイルにまとめる書庫化や，その書庫の展開，既にある書庫へのファイルの追加や削除が行える。書庫化したファイルには一般に，「.tar」という拡張子を付ける。ただし，tarでは圧縮は行われない。

http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230896/


## gzip (GNU zip)

一方、 gzip コマンドでは、ファイルの**圧縮機能があります**が、
ファイルをまとめる**アーカイブ機能はありません**。

> Lempel-Ziv(LZ77)アルゴリズムを使用してファイルを圧縮する。通常，compressよりも圧縮率が高い。gzipで圧縮されたファイルは，拡張子に.gzが加わる。

http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230791/


## tar と gzip の違い まとめ

<dl>
<dt>tar</dt>
<dd>複数のファイルを一つにまとめる</dd>
<dt>gzip</dt>
<dd>ファイルサイズを圧縮する</dd>
</dl>

<table>

<thead>
<tr>
<td></td>
<td>アーカイブ</td>
<td>圧縮</td>
</tr>
</thead>

<tbody>
<tr>
<td>tar</td>
<td>○</td>
<td>×</td>
</tr>
<tr>
<td>gzip</td>
<td>×</td>
<td>○</td>
</tr>
</tbody>

</table>

よく見る「.tar.gz」という拡張子は、
tar でファイルをまとめて
gzip で圧縮
したものだったんですね。

こんなことも知らなかったなんてお恥ずかしい:sweat_smile:
(AppleからGoサインが出るまで)Xcode7 GM seedでApp Storeへアップロードしてはいけない

追記 (9/12 10:35)
Appleから「Submit Your Apps Today」のメールが届きました。
おそらく、今後はアップロード可能になったものと思います。
seedがどうとかは、関係ありませんでしたね。

追記（9/11 14:30）


## 但し書き

9/10 20:00ごろ時点での内容になります。
GMの役割的に、もしかしたら申請が通るようになっている可能性もあります。

とはいえ、iOS9で発生した不具合修正などで急いでいる場合にはXcode6で申請することをお勧めします。
下記のように、徒労に終わる可能性が高いので。
iOS9 SDKを利用した機能を使ってリリースしたい方は、こまめにチャレンジしてみるしかないですね…。

(追記 9/10 22:50)
とりあえずコメントにあった内容から、まだ「GM seed」だからではないか、という意見もありました。
seedが取れるようなら、改めてアップロードを試してみるといけるかもしれません。

## 内容
現在、かなり申請が混雑していて聞いた話では
アップロードから申請可能になるまでに２時間ほどかかるそうです。
実際、２時間弱かかりました。

さらに、そのアップロードしたファイルがXcode7GMでビルドされたものだと
最後の最後にエラーを食らってやり直しになります。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/corruptex">@corruptex</a> さっきは2時間位かかりましたよ</p>&mdash; Mitsuaki Ishimoto (@mitsuaki_i) <a href="https://twitter.com/mitsuaki_i/status/641932369780322304">2015, 9月 10</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/corruptex">@corruptex</a> あとGMでビルドしたバイナリがストアのvalidationにひっかかって審査に出せないようです</p>&mdash; Mitsuaki Ishimoto (@mitsuaki_i) <a href="https://twitter.com/mitsuaki_i/status/641933146125045760">2015, 9月 10</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/corruptex">@corruptex</a> 最後に「審査へ提出」のボタンを押すと悲劇が起こります。（参考）<a href="https://t.co/L6f6med7Jc">https://t.co/L6f6med7Jc</a></p>&mdash; Mitsuaki Ishimoto (@mitsuaki_i) <a href="https://twitter.com/mitsuaki_i/status/641934110827515905">2015, 9月 10</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

リンク先（https://t.co/L6f6med7Jc） にあるように、Xcode6 & iOS8 SDKでやり直せと言われるようですね。ご注意ください。
私もアップロードしていたものが処理が終了したので審査提出しようとしたところ、「審査に提出」ボタンを押した段階でこのようなエラーがでました。

![スクリーンショット 2015-09-10 20.png](https://qiita-image-store.s3.amazonaws.com/0/34166/101d6652-b33e-2cec-2417-f094be45609c.png)


旧Xcodeでアップロードし直したところ一瞬で通りました。
Xcode7GMで申請するのはやめましょう。
Boost.Pythonでモジュールをネストさせる

# やりたいこと
下に示すPythonのモジュール(正確にはパッケージかもしれない)と等価な構造のモジュールをBoost.Pythonで作ります。

```
mainmodule/
    ├ __init__.py
    ├ submodule1/
    │    ├ __init__.py
    │    └ hoge.py
    ├ submodule2/
    │    ├ __init__.py
    │    └ foo.py
        ：
        ：
```

インポートは

```py
import mainmodule
from mainmodule.submodule1 import hogehoge  # mainmodule/submodule1/hoge.pyにhogehogeが定義されている
from mainmodule import submodule2
```

という感じになります。

## この記事の対象者
この記事はBoost.Pythonのかなり込み入った使い方の説明です。
そのため、Boost.Pythonについて一度ぐらいは使ったことがある程度の人を対象としています。

Boost.Pythonを使ったことはないけれど興味があるという方は、こちら[letsboost::python - Kmonos.net](http://www.kmonos.net/alang/boost/classes/python.html)で予習をどうぞ。

## やりたいことの情報元
クラスをネストさせる方法はよく見つかるけど、モジュールのネストはなかなか見つからなかったので、メモ。
もとになったページ[Packages in Python extension modules](http://isolation-nation.blogspot.jp/2008/09/packages-in-python-extension-modules.html)

# やりかた
ソースコードを見てもらった方が早いと思うので、いきなりソースコードです。

一番外側のモジュールを宣言。

```cpp
BOOST_PYTHON_MODULE(mainmodule) {
    using namespace boost::python;

    object package = scope();
    package.attr("__path__") = "mainmodule";

    export_submodule1();
    export_submodule2();
        ：
}

```

サブモジュールを宣言する関数

```cpp
void export_submodule1() {
    using namespace boost::python;
    // from mainmodule.submodule1 import の形式で呼び出せるようにする
    object module(handle<>(bp::borrowed(PyImport_AddModule("mainmodule.submodule1"))));
    // from mainmodule import submodule1 を使えるようにする
    scope().attr("submodule1") = module;
    // スコープを設定
    scope scope1 = module;
    // いろいろと必要な関数、クラスを定義する
    def("hogehoge", &hogehoge);
        ：
}
```

## 使い方
通常のPythonのモジュールと同様に利用できるので、特に説明はありません。
インポートは冒頭で示した通りです。

# 参考
[Packages in Python extension modules](http://isolation-nation.blogspot.jp/2008/09/packages-in-python-extension-modules.html)
シンボリックリンク自体のファイルモードを変更する

忘備録
`-h` をつけるだけ

```bash
$ ls -n
total 8
lrwxr-xr-x  1 501  20  4 Sep 10 19:07 buzz -> fizz
-rw-r--r--  1 501  20  0 Sep 10 19:07 fizz

$ chmod 600 buzz
$ ls -n
total 8
lrwxr-xr-x  1 501  20  4 Sep 10 19:07 buzz -> fizz
-rw-------  1 501  20  0 Sep 10 19:07 fizz

$ chmod -h 600 buzz
$ ls -n
total 8
lrw-------  1 501  20  4 Sep 10 19:07 buzz -> fizz
-rw-------  1 501  20  0 Sep 10 19:07 fizz
```
EC2 S3 Apache IP制限


##目的
EC2, S3にIP制限をかけたい。


##構成
LB => EC2 => S3

##設定方法
###EC2 Server

```設定Path
[admin /etc/httpd/conf]$ vi /etc/httpd/conf/httpd.conf
```

```httpd.conf
<VirtualHost *:80>
  DocumentRoot "/var/www/html/********"
  Options FollowSymLinks
  ServerName ********
  RewriteEngine on
  <Directory "/var/www/html/********">
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    SetEnvIf X-Forwarded-For "***\.***\.***\.***" allow_ip
    SetEnvIf User-Agent "ELB-HealthChecker/1\.0" allow_ip
    Deny from all
    Allow from env=allow_ip
  </Directory>
・
・
・
```

・  Options FollowSymLinks : シンボリックリンク
・  AllowOverride None : 設定上書きを不許可
・  Order deny,allow : 全てのホストからのアクセスを許可する。
・  SetEnvIf X-Forwarded-For 許可IPアドレス
・  SetEnvIf User-Agent 許可エージェント
・  Deny from all :　全てのアクセスを拒否
・  Allow from env=allow_ip : 指定IPアドレスを許可

###S3 バケットポリシー

```
{
	"Version": "2012-10-17",
	"Id": "******任意*****",
	"Statement": [
		{
			"Sid": "******任意*****",
			"Effect": "Deny",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::*****FilePath******",
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": "0.0.0.0/0"
				},
				"NotIpAddress": {
					"aws:SourceIp": "*******許可IPアドレス******"
				}
			}
		}
	]
}

```

・Id： ポリシーのIDを指定。（任意の英数字を入力）APIユーザー内で重複不可。
・Statement：ポリシーの主要素。必須。下記の複数の要素を持つ。
・Sid : StatementID（任意の英数字を入力）APIユーザー内で重複不可。
・Action: 適用する作業内容を記述する。
・Effect: Allow … 指定した内容に対しアクセスを許可する。
 Deny … 指定した内容に対しアクセスを拒否する。
・Resource: arn:aws:s3:::<Policyの対象バケット名>/* を記述する。
・Condition: ポリシーの条件を指定します。
・IpAddress … 指定したIPアドレスがEffectの範囲対象となる。
・NotIpAddress … 指定したIPアドレスがEffectの範囲外となる。
・aws:SourceIp(IPアドレスの制御)
・aws:SecureTransport(SSL利用許可／拒否の制御値は“true”/“false”で指定)
・Principal：アドレスを許可するユーザーやアカウントを記述する。 
##結果
上記設定によって、IP制限をかけられる。
Go言語のpath/filepathパッケージのRel関数について

# path/filepathパッケージ
これはGoの標準ライブラリです。名前の通りファイルシステムの操作を行うための便利な関数がいくつか利用することができます。このエントリではRel()関数について記述します。

# filepath.Rel(basepath, targetpath)
この関数は `basepath` から `targetpath` までの相対パスを算出します。引数は `string` 型になります。基準となるパスを `basepath` として渡し、 `targetpath` にいわば求めたい行き先のパスを指定します。返り値は算出された `相対パス` と `エラー` の2つです。問題無く相対パスが算出されれば `エラー` は `nil` が返ります。

### 利用サンプルその１

```go:sample.go
package main

import (
  "path/filepath"
    "fmt"
    )

func main() {
    basepath := "/a"
      targetpath := "/a/b/c"

        fmt.Println( filepath.Rel(basepath, targetpath) )
}
```

出力結果は以下のようになります。

```zsh
$ go run sample.go
b/c <nil>
```

### 利用サンプルその２

```go:sample2.go
package main

import (
  "path/filepath"
    "fmt"
    )

func main() {
    basepath := "/a"
      targetpath := "/b/c"

        fmt.Println( filepath.Rel(basepath, targetpath) )
}
```

さて、ここで上記のようにしたらどうなるでしょう…。
結果は以下のようになりました。

```zsh
$ go run sample2.go
../b/c <nil>
```

そう！こうなるんですね。
ここで、頭の悪い私は出力結果`/b/c` となるのかなと思いました。なぜかというと、基準となるパスを `/a` と指定し、行き先を `/b/c` と指定しているので、 `/b/c` が基準となるパス `/a` に含まれていると勘違いしていたからです。しかし、指定しているパスは `/a/b/c` ではなく `/b/c` ですから、当然得られる結果は `../b/c` となるわけですね。

### 利用サンプルその３

```go:sample3.go
package main

import (
  "path/filepath"
    "fmt"
    )

func main() {
    basepath := "/a"
      targetpath := "./b/c"

        fmt.Println( filepath.Rel(basepath, targetpath) )
}
```

さて、これはどうなるでしょうか？

```zsh
$ go run sample3.go
 Rel: can't make b/c relative to /a
 ```

 エラーになりました。理由は、 `.` これですね。つまりカレントディレクトリを指定しているからなんです。今回の場合Go言語はカレントディレクトリを知りません。基準となるパス `/a` を自動的にカレントディレクトリとしてはみなしてくれないんですね。もちろんですが、ワーキングディレクトリともみなしてくれません。Go言語は行き先の行き方がわからんのでエラーとなるわけですね。

 ※ちなみにエラーだと、相対パスには空文字列が入るみたいですね。

 上記の問題は基準となるパスをカレントディレクトリからの相対パスにしてあげると解決します。

 ```go:sample4.go
 package main

 import (
   "path/filepath"
     "fmt"
     )

 func main() {
     basepath := "./a"
       targetpath := "./b/c"

         fmt.Println( filepath.Rel(basepath, targetpath) )
 }
 ```

 出力結果

 ```zsh
 $ go run sample4.go
 ../b/c <nil>
 ```

### 参考までに
今回紹介させていただいた `Rel` 関数を使って得られた出力結果の相対パスは、同じパッケージで含まれる `Join` 関数を使うと分かり易いかもしれません。

```go
filepath.Join(basepath, filepath(basepath, targetpath))
```

これから得られる結果は必ず `targetpath` と同じになります。

# 感想
Go言語の公式ドキュメントは英語なのです。他の言語もたいていそうです。エンジニアとして成長するためには、英語力は必須というわけですね。英語頑張らないといけないなと思わされました。

[The Go Programming Language](http://golang.org/pkg/path/filepath/#Rel)
Laravelで'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Maximum function nesting level of '100' reached, aborting!'


# 現象
Laravelで構築中に以下のようなメッセージが出た。

```
local.ERROR: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Maximum function nesting level of '100' reached, aborting!' in ~vendor/composer/ClassLoader.php:
```

# 原因
xdebugのxdebug.max_nesting_level = 100になっているため。

```
php -i 
~~
xdebug.max_nesting_level => 100 => 100
~~
```


# 対処法
## 1 Laravel DebugBarを使っている場合使用をやめる。
Laravel5の場合.envの

```
APP_DEBUG    = true
```

をfalseにすれば消えるため実行が可能になる・・・が、デバッグがしづらくなるのでなるべくならこの方法はとりたくない

## 2 xdebugの設定をする。
php.iniのxdebug.max_nesting_levelを引き上げる。

```
xdebug.max_nesting_level = 200
```

# 参考
https://laracasts.com/discuss/channels/general-discussion/xdebug-max-nesting-level-reached
https://teratail.com/questions/169
http://stackoverflow.com/questions/8656089/solution-for-fatal-error-maximum-function-nesting-level-of-100-reached-abor
Solrの設定ファイルをレプリケーションして、本番稼働中のリリース手順を簡単にする

本番稼働中のSolrのスキーマを変更する手順書を作りながら、「向き先変えたりとかいろいろ面倒だなぁ」ってグチったところ、「それ、レプリケーションできるみたいよ」という話を聞いたので試してみました。

# 構成
サーバ構成としてはだいたいこんな感じです。

```
[master]----[slave1] <---[AP1][AP2]
        +---[slave2] <---[AP3]
```
Solrは4.10.3でスレーブが2台。
APは3台あって、AP1とAP2がslave1を参照。AP3がslave2を参照している状態。
レプリケーションしてくれるならマスターのスキーマ変更して再起動して、スレーブ向いてるAPをマスターに向けてスレーブの設定変更して再起動して・・・という面倒な手順を踏まなくてよくなります。

# マスター側の設定
マスター側の設定は以下のようにしました。

```solrconfig.xml
<requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" >
  <lst name="master">
    <str name="replicateAfter">commit</str>
    <str name="replicateAfter">startup</str>
    <str name="replicateAfter">optimize</str>
    <str name="confFiles">schema.xml,data-config.xml</str>
  </lst>
</requestHandler>
```

これでSolr再起動。

# スレーブ側の設定
スレーブ側の設定は特にいじってません。

# レプリケーションされることを確認
マスター側のschema.xmlとdata-config.xmlにフィールドを追加して、Solr再起動。
そしてフルインポートをかけたところ無事にスレーブ側のschema.xmlとdata-config.xmlにも設定が反映され、インデックスも無事に作られました。

ああ、これで面倒な手順を踏むことなく設定が変えられる！！知ってよかった！！
RaspberryPiでWPA-PSKのWiFiに接続する方法

基本はlinuxだろう、
と思っていたがググってもこれだというのが出てこなかったのでメモ。
# 環境
- Raspberry Pi 2 Model B
- Raspbian 

# 事前準備
まずは、Raspberry Pi を有線でネットワークに接続できるようにしましょう。
Raspberry Pi を直接操作しながらだと、コピペができないので非常に不便です。
以下の作業は、有線で繋いでsshで接続してから行いましょう。

# 手順
## 1. パスフレーズの暗号化
以下のコマンドを実行します。
> wpa_passphrase 【SSID】

【SSID】は、接続したいWiFiのSSIDに置き換えてください。
実行すると、パスフレーズを聞かれるので入力してください。

実行した結果、
> network={
　　　ssid="【SSID】”
　　　#psk="【パスフレーズ】"
　　　psk=1234567890abcdefghijklmnopqrstuvwxyz
}

のような形で出力されます。（pskの値は仮です。）

## 2. wpa_supplicant.conf を編集します
上記の実行結果をコピペしますので、
事前にクリップボードにコピーしておきます。
> vi /etc/wpa_supplicant/wpa_supplicant.conf

ペーストして、
さらに以下のような形で追記を行います。
> ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
　　　ssid="【SSID】"
　　　psk=1234567890abcdefghijklmnopqrstuvwxyz
　　　key_mgmt=WPA-PSK
　　　proto=RSN
　　　pairwise=CCMP
　　　group=CCMP
　　　priority=2
　　　scan_ssid=1
}

scan_ssid は隠蔽されたアクセスポイントにつなぐ時にだけ追記すれば良いです。
それ以外の場合には必要ありません。

## 3. interfaces を編集します
> vi /etc/network/interfaces

以下のような形で追記・修正を行います
> auto lo

>iface lo inet loopback
iface eth0 inet dhcp

>auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

## 4. Raspberry Pi を再起動する
作業は終了です。
再起動したら自動的にWiFiに接続します。
> reboot
PlatformIO でライブラリを使う & 普通のライブラリを直接使う


Arduino/mbed 等を CUI から抽象化して操作できるツール、[PlatformIO](http://platformio.org/#!/) は大変便利です。

参考: [コマンドラインでArduino開発 : vim + platformio](http://qiita.com/caad1229/items/7b5fb47f034ae6e0baf2)

ライブラリのインストールには、

```bash
# 良い感じの Timer ライブラリ無いかな〜
$ platformio lib search Timer
Found 7 libraries:

[ ID  ] Name             Compatibility         "Authors": Description
----------------------------------------------------------------------------------------------------------------------------------------
[ 75  ] Timer            arduino, atmelavr     "Jack Christensen, Simon Monk, Damian Philipp": Timer Library
[ 138 ] FlexiTimer2      arduino, atmelavr, teensy "Wim Leers, Paul Stoffregen": Arduino library to use timer 2 with a configurable resolution. Based on MsTimer2 by Javier Valencia. Written for the project associated with the "Mobile & Pervasive Computing" course at Hasselt University in Belgium.
[ 442 ] DueTimer         arduino, atmelsam     "Ivan Seidel": Timer Library fully implemented for Arduino DUE
[ 131 ] TimerOne         arduino, atmelavr, teensy "Paul Stoffregen": Allow to use the built-in 16 bit Timer1
[ 132 ] TimerThree       arduino, atmelavr, teensy "Paul Stoffregen": Allow to use the built-in 16 bit Timer3
[ 137 ] MsTimer2         arduino, atmelavr, teensy "Javier Valencia, Paul Stoffregen": MsTimer2 is a small and very easy to use library to interface Timer2 with humans. It's called MsTimer2 because it "hardcodes" a resolution of 1 millisecond on timer2.
[ 419 ] SimpleTimer      arduino, atmelavr     "Jean-Francois Turcot": SimpleTimer Library for Arduino
```

```bash
$ platformio lib install 137
```

のように CUI から行うことができます(ライブラリ名で入れたいけど…)。また追加したいライブラリがあったら、library.json をつくって

```bash
$ platformio lib install https://raw.githubusercontent.com/hotchpotch/arduino_ST7032/library-json/library.json
```

とすることで、PlatformIO 側に申請が行って、申請が通り次第利用できるようになります。

しかし、俺はライブラリをすぐ使いたいんじゃ！！！という場合は、```~/.platformio/lib``` にライブラリを直接置けば利用できます。

```bash
cd ~/.platformio/lib
git clone https://github.com/tomozh/arduino_ST7032
```

簡単ですね！

Arduino の世界では、いちおうライブラリのエコシステムはあるのですが、CUI から使いやすい形にはなっていませんでした。PlatformIO がもっと流行って、開発がやりやすくなることを期待してます。

[こんな感じ](https://github.com/LowPowerLab/SPIFlash/pull/6) で PlatformIO の開発者たちがエコシステムを広げるため、地味に努力してるのも良いですね！
BigQuery の UDF を使ってアクセスログからブラウザシェア集計

BigQuery で UDF が使えるようになったので、UDF を使ってアクセスログのデータから簡単にブラウザのシェアを集計してみました。

BigQuery の UDF では、入力として一行のレコードを受け取り、それを変換して新しいレコード（複数行でもよいし0行でもよい）を出力する関数を定義します。今回は単純にユーザエージェントからブラウザ種別を取得したいだけなので、ユーザエージェントのみをカラムとして持つレコードを受け取って、ブラウザ種別のみをカラムとしてもつレコードを出力するようにします。

（前提として、アクセスログのテーブルの `ua` というカラムにユーザエージェント文字列が記録されているとします。）

```js:UDF
// UDF 本体
function browser(row, emit) {
  emit({browser: ua2browser(row.ua)});
}

// ユーザエージェンと文字列をブラウザ種別に変換するヘルパ関数
function ua2browser(ua) {
  var patterns = [
    [/Chrome/, "Chrome"],
    [/Firefox/, "Firefox"],
    [/Safari/, "Safari"],
    [/Trident.*rv:11\.0/, "IE11"],
    [/MSIE 10\.0/, "IE10"],
    [/MSIE 9\.0/, "IE9"],
    [/MSIE 8\.0/, "IE8"],
    [/MSIE 7\.0/, "IE7"],
    [/MSIE 6\.0/, "IE6"],
    [/MSIE/, "IE"]
  ];
  var n = patterns.length;
  if(ua) {
    for(var i=0; i<n; ++i) {
      if(ua.match(patterns[i][0])) return patterns[i][1];
    }
  }
  return "unknown";
}

// クエリから利用できるようにするために UDF を登録する
bigquery.defineFunction(
  'browser', // 関数名
  ['ua'], // 入力レコードのスキーマ（名前のみ）
  [{'name': 'browser', 'type': 'string'}], //出力レコードのスキーマ（名前と型）
  browser // UDF の function の参照
);
```

`browser()` が UDF の本体です。入力レコードを row として受け取り、出力レコードをオブジェクトとして emit の引数に渡します。

あと、ユーザエージェント文字列をブラウザ種別に変換するために `ua2browser()` というヘルパ関数を定義しています。ユーザエージェント文字列に対してこの正規表現にマッチしたらこのブラウザ種別を返すというようなマッピングを定義しています（ここではあくまで例示のために雑に定義していますので、あしからず）。

最後に、定義した UDF をクエリから使えるように `bigquery.defineFunction()` で登録します。引数として、以下のものを渡します。

* UDF の名前
* 入力レコードのスキーマ
* 出力レコードのスキーマ
* レコードを変換する function の参照

これでクエリからこの UDF が使えるようになります。

```sql:Query
SELECT
  browser, count(browser) count
FROM
  browser(SELECT ua FROM [apache.apache201508])
GROUP BY browser
ORDER BY count desc;
```

![result.png](https://qiita-image-store.s3.amazonaws.com/0/41566/7c2ccbfd-f010-540b-4da4-cfbf106da9bb.png)

できました！

##### 参考

* [BigQuery User-Defined Functions](https://cloud.google.com/bigquery/user-defined-functions)
Swift で UISearchBar のカーソルとキャンセルボタンの文字色を別の色にする


## カーソルが見えなくなる問題

UISearchBar の色を変更している時に詰まったのでメモ。

キャンセルボタンの文字色を白にしたいなと思って tintColor を whiteColor にしたら、

```
    var searchBar: UISearchBar!
    searchBar.tintColor = UIColor.whiteColor()
```


![search1.png](https://qiita-image-store.s3.amazonaws.com/0/27210/a4de8972-1e6e-ef12-f398-baeaa33bee4d.png "search1.png")

・・入力のカーソルがなくなった orz




カーソルも白になって背景と同化しただけなので正しくは見えなくなった、ですね。

## Subview の UITextFiled の tintColor を変更する

カーソルの色を変えるには、UISearchBar の UITextFiled の tintColor だけ変えてあげればよいです。
ただ Swift(iOS9) だと簡単なメソッド(appearanceWhenContainedInInstancesOfClasses)があるようですが、iOS8以前だと適したメソッドがないようです。

そこで Objective-C で代わりのメソッドを用意して Swift から呼び出すことにします。

```UIAppearance+Swift.h
#import <UIKit/UIKit.h>

@interface UIView (UIViewAppearance_Swift)

+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass;

@end

```

```UIAppearance+Swift.m
#import "UIAppearance+Swift.h"

@implementation UIView (UIViewAppearance_Swift)
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass {
    return [self appearanceWhenContainedIn:containerClass, nil];
}
@end
```

このメソッドを使って UITextFiled の tintColor を blueColor に指定してみました。

```
    var searchBar: UISearchBar!
    searchBar.tintColor = UIColor.whiteColor()
    UITextField.my_appearanceWhenContainedIn(UISearchBar.self).tintColor = UIColor.blueColor()

```

![search2.png](https://qiita-image-store.s3.amazonaws.com/0/27210/2d55f33b-717a-6812-87d5-4d378db412ea.png "search2.png")


無事別の色で表示できるようになりました。

参照元：
http://stackoverflow.com/questions/24136874/appearancewhencontainedin-in-swift
iOS9で日本語のLocalizable.stringが適用されない

iOS9で、`[NSLocale preferredLanguages]`から返却される日本語のコードが
「ja」から「ja-JP」や「ja-US」などのコードに変更されました。
それに付随して、どうやら Localizable.string で適用されるファイルにも変更があったようです。


## 状況
当初、以下のような構成で他言語対応を行っていました。ベース言語は英語です。
![スクリーンショット 2015-09-10 18.20.09.png](https://qiita-image-store.s3.amazonaws.com/0/34166/f632111a-d822-68f6-7bcb-a2dfe41f2827.png)

iOS8以前はこれでも正常に翻訳されていましたが、iOS9では
このJapaneseファイルを適用することができなくなってしまいました。


## 対策
Otherの中に「Japanese (Japan) (ja-JP)」の項目があるので、それを適用しましょう。
Japaneseファイルをベースにして作成すれば大丈夫です。

![スクリーンショット 2015-09-10 18.png](https://qiita-image-store.s3.amazonaws.com/0/34166/aaced5f2-fe82-be31-5ecf-44396a114e81.png)


## あとがき
ちゃんとbetaインストールして試しておけばよかった…。
ビルドの設定に応じてアプリのアイコンを変える


Debug, Releaseだけでなく、さらに細かく変えたいときのやり方。

# build configuration をつくる

PROJECT > Info > Configurations で新しいconfigurationをつくる。
ReleaseかDebugか近い方をベースにする。

**注意**
cocoapodsを使っている場合は、そのままだとモジュールをimportできなくなってしまう。configurationのファイル（Pods-hogefuga）を一旦Noneにして、`pod install`すること。そうすると勝手に設定してくれる。

# アイコンを追加
images.xcassets で新しいアイコンセットを追加

# AssetCatalogの設定を変更
TARGETS > Build Settings > Asset Catalog Compiler - Options で先ほど作ったbuild configuration の欄に、追加したアイコンの名前を指定。


以上。build configuration使うと、fastlaneとかでビルドするときもさくっと適用できて便利。
genmai + go-sql-proxy

genmai で go-sql-proxy つかってクエリーログだしてみた

```go
import (
	"database/sql"
	"database/sql/driver"
	"github.com/go-sql-driver/mysql"
	"github.com/golang/glog"
	"github.com/naoina/genmai"
	"github.com/shogo82148/go-sql-proxy"
)

func SetProxy(driverName string) {
	sql.Register(driverName, proxy.NewProxy(&mysql.MySQLDriver{}, &proxy.Hooks{
		Exec: func(_ interface{}, stmt *proxy.Stmt, args []driver.Value, result driver.Result) error {
			glog.Errorf("Exec: %s; args = %v\n", stmt.QueryString, args)
			return nil
		},
		Query: func(_ interface{}, stmt *proxy.Stmt, args []driver.Value, rows driver.Rows) error {
			glog.Errorf("Query: %s; args = %v\n", stmt.QueryString, args)
			return nil
		},
	}))
}

type TracedMySQLDialect struct {
	genmai.MySQLDialect
}

func (d *TracedMySQLDialect) Name() string {
	return "mysql-tracer"
}

func connectDB(dsn string, trace bool) *genmai.DB {
	var db *genmai.DB
	var dialect genmai.Dialect
	if trace {
		SetProxy("mysql-tracer")
		dialect = &TracedMySQLDialect{}
	} else {
		dialect = &genmai.MySQLDialect{}
	}
	db, err := genmai.New(dialect, dsn)
	if err != nil {
		glog.Fatal(err)
	}
	return db
}
```

✧＼\ g( 'ω' )o /／✧
浮動小数点型の数値はメモリ上でどのように格納されているのか

ニアです、こんにちはー！
今回は浮動小数点型の数値がメモリ上でどのように格納されているか、調べていきます。

#1. バイトオーダー（エンディアン）とは
その前に、バイトオーダーについて簡単に説明します。

バイトオーダーとは、2バイト以上の数値をメモリ上に格納する時の並び順です。例えば「0x01020304」という4バイトの数値がある時、メモリ上に「**0x01 0x02 0x03 0x04**」と上位バイトから順に格納する方式を**ビッグエンディアン**といい、「**0x04 0x03 0x02 0x01**」と下位バイトから順に格納する方式を**リトルエンディアン**といいます。

![bigE-int.png](https://qiita-image-store.s3.amazonaws.com/0/78881/b99696be-3495-82d3-cf8f-62d3932eff16.png)

![littleE-int.png](https://qiita-image-store.s3.amazonaws.com/0/78881/89710cbc-03c9-8d0e-e516-828ba81ff7f2.png)

C言語やC++では、**数値型**と**unsigned char型配列**（要素数は数値型のデータサイズ（バイト単位））で構成した共用体を使って、メモリ上での並び順を調べることができます。

以下はint型の数値からメモリ上での並び順を見るプログラムです。

```c:byte-order-int.c
#include <stdio.h>

int main( int argc, char* argv[] ) {

	union { int i; unsigned char b[4]; } ib;
	int i;
	ib.i = 0x01020304;
	printf( "元の値 : %08X\n", ib.i );
	printf( "メモリ上での並び順 : " );
	for( i = 0; i < 4; i++ ) {
		printf( "%02X%c", ib.b[i], i < 3 ? ' ' : '\n' );
	}
	
	return 0;
}
```

**◆ 実行結果**
※使用したコンピューターのCPUはIntel Core-i5 2520M（バイトオーダーはリトルエンディアン方式）です。
>元の値 : 01020304
メモリ上での並び順 : 04 03 02 01


#2. 浮動小数点型の値のメモリ上での並び
ここからが本題、浮動小数点型の値はメモリ上でどのように格納されているのか、float型を例に調べていきます。

**float型変数1つ**と**要素数が4個のunsigned char型配列**、**int型変数1つ**（内部表現の値を確認するため（→ [浮動小数点数の内部表現を取得してみよう](http://qiita.com/nia_tn1012/items/d26f0fc993895a09b30b)））で構成した共用体を使います。


```c:byte-order-float.c
#include <stdio.h>

int main( int argc, char* argv[] ) {

	union { float f; int i; unsigned char b[4]; } fb;
	int i;
	fb.f = 1.024f;
	printf( "元の値 : %f\n", fb.f );
	printf( "内部表現の値 : %08X\n", fb.i );
	printf( "メモリ上での並び順 : " );
	for( i = 0; i < 4; i++ ) {
		printf( "%02X%c", fb.b[i], i < 3 ? ' ' : '\n' );
	}
	
	return 0;
}
```

**◆ 実行結果**
※使用したコンピューターのCPUはIntel Core-i5 2520M（バイトオーダーはリトルエンディアン方式）です。
>元の値 : 1.024000
内部表現の値 : 3F83126F
メモリ上での並び順 : 6F 12 83 3F

実行結果を見ると、float型の数値はメモリ上で「**0x6F 0x12 0x83 0x3F**」と、内部表現の値「**0x3F83126F**」の下位バイトから順に並んでいることが分かります。

つまり、浮動小数点型の数値はその**内部表現の値をバイトオーダーに従って、メモリ上に格納**されます。

![bigE-float.png](https://qiita-image-store.s3.amazonaws.com/0/78881/a4c268be-5d5a-526c-b2b9-d09b3e12e5bb.png)

![littleE-float.png](https://qiita-image-store.s3.amazonaws.com/0/78881/bf7c8828-5d5e-4c14-87ce-10d765dfb989.png)

実数値をバイナリデータとして扱う時に、参考になれば幸いです。


それでは、See you next time!
ESP8266からOLYMPUS AIR A01をコントロールする

# 概要
オリンパスが2015年3月に発売したオープンプラットフォームカメラ[AIR A01](http://olympus-imaging.jp/product/opc/a01/)は、Wi-FiからコントールできるAPIを提供するカメラです。SDKはiOS用とAndroid用が提供されていますが、通信仕様書が公開されているため、他の環境からでもコントロールできます。

これは、小型かつ低価格でArduino IDEでも利用できるWi-FiモジュールESP8266からA01をコントロールするサンプルです。これだけであればインターバル撮影と同じですが、センサなどを入力として拡張することを想定しています。また、A01が備えている基本的な顔認識の機能との組み合わせも可能だと思います。そうすることで、特定の何かが起きた時に撮影するようなものをスマートフォンなしで実現できます。

# 実装
[オリンパス OPC Hack & Make Project](https://opc.olympus-imaging.com/)のウェブサイトで公開されている通信仕様書を参考にして実装したごく簡単なサンプルです。A01との通信はA01をサーバとしてHTTPで行います。

```cpp:settings.h
// 変更箇所がわかるように別ファイル（Arduino IDE上では別のタブ）に
// A01のキャップを外して確認できるSSIDとパスワードをここに記入
const char* ssid = "AIR-A01-BHD******";
const char* password = "********";
```

```cpp:Air.ino
#include <ESP8266WiFi.h>
#include "settings.h"

// A01のIPアドレス（固定）
IPAddress airIpAddress(192, 168, 0, 10);

void setup() {
  Serial.begin(115200);

  Serial.print("Connecting to ");
  Serial.println(ssid);

  // setting.hに記入したSSIDとパスワードでA01に接続
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("IP address: ");

  // 撮影モードへの切り替えをリクエスト
  if (sendRequest("/switch_cameramode.cgi?mode=rec&lvqty=0320x0240") == 200) {
    // 撮影モードへの切り替えに成功したらライブビューを開始
    // 実際にはライブビューは使用しないが、開始せずに撮影しようとするとエラーになるため
    Serial.println("Rec mode");
    sendRequest("/exec_takemisc.cgi?com=startliveview&port=5555");
  } else {
    Serial.println("Failed to switch to rec mode");
  }
}

void loop() {
  // 静止画撮影開始
  if (sendRequest("/exec_takemotion.cgi?com=newstarttake") == 200) {
    Serial.println("Started taking");

    // 撮影開始に成功したら静止画撮影停止
    sendRequest("/exec_takemotion.cgi?com=newstoptake");
    Serial.println("Stopped taking");
  } else {
    Serial.println("Failed to start taking");
  }

  delay(5000);
}

// HTTPでリクエストを送信して結果を返す
int sendRequest(String command) {
  int result = -1;

  Serial.println("Connecting to the AIR\n");

  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(airIpAddress, httpPort)) {
    Serial.println("Connection failed");
    return result;
  }

  Serial.print("Command: ");
  Serial.println(command);

  client.println(String("GET ") + command + " HTTP/1.1");
  client.println("Host:192.168.0.10");
  client.println("User-Agent:OlympusCameraKit");
  client.println();

  // 暫定的に一定時間待つようにしている
  // ここはタイムアウト付きで一定の返答があるまで待つように変更する予定
  delay(100);

  // クライアントにメッセージが届いていればそれを読み取って処理する
  while (client.available()) {
    String line = client.readStringUntil('\r');

    if (line.startsWith("HTTP/1.1")) {
      //           11111
      // 012345678901234
      // HTTP/1.1 200 OK
      result = line.substring(9, 12).toInt();
    }

    Serial.print(line);
  }
  Serial.println();

  if (client.connected()) {
    client.stop();
  }

  return result;
}
```

# 既知の問題
* 連続動作中にA01と通信ができなくなってしまうことがある（再現条件を調査中）

# 参照
* [オープンプラットフォームカメラ通信仕様書](https://opc.olympus-imaging.com/tools/sdk/communications/)
* [Arduino IDE for ESP8266](https://github.com/esp8266/Arduino)
WindowsにChocolateyでPython 3.4.3をinstallする

## 環境

|ツール|バージョン|
|:---:|:-------:|
|OS|Windows7|
|Python|3.4.3|

インストールにはChocolateyを使う。

## 手順
```bat
cinst python3 -y
```

2015/9/9時点ではpython 3.4.3が入った。

```bat
> python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
```

が、pipが使えない。
pathが通っていないようなので環境変数に
C:\tools\python3\Scriptsを追加

```bat
> pip --version
pip 6.0.8 from C:\tools\python3\lib\site-packages (python 3.4)
```
GAのイベント計測上限に注意

Googleアナリティクスはセッションあたり500ヒットの上限があるみたいです。
何も考えずに頻繁にイベント計測するとアナリティクス自体が全く計測されない事態に陥る危険性があるので注意。
いいね！ボタンみたいなボタンにイベントを仕込んであって、それを500回連打されたりとか。

でもこれって、悪意のあるユーザーがDoS攻撃みたいに

```js
var i;
for(i = 0; i < 500; i++) {
  ga('send', 'pageview');
}
```

のようなプログラムを実行するだけでGoogleアナリティクスをパンクさせられるということですよね。恐いですね。
（単に計測がされなくなるという非常に地味な攻撃ではありますが…。）

以下参考記事:

>
# あまり期待してはいけないところ
## ヒット上限がある
>
＞＞[Google アナリティクスのデータ収集上限 – Google アナリティクス Google Developers]()
>
上記リンクはアプリSDKのドキュメントですがウェブトラッキングでも同様です。PVを含め500ヒット（ヒットとは、Googleアナリティクスに対して何らかのデータ送信をすることを指します）と言いますと、問題無さそうに見えます。
>
いっぽうで、10秒おきにページ表示位置を把握して、スクロール量を測るなどといったイベント検知では、すぐに上限が来てしまうでしょう。
>
500を越えますと、ほんとうに計測されなくなります。超焦ります。その解除期間が明記されていないのですが、すぐには復活しませんでした。ですので、上限を超えることは絶対に避けるべきです。

出典: [イベントトラッキングの設定、ユニバーサル・タグマネージャ対応2015](http://www.kagua.biz/help/eventtracking2015.html)

>
# ユニバーサル アナリティクスを利用している場合
>
以下の制限事項は analytics.js、Android iOS SDK、Measurement Protocol に適用されます。
>
ユーザーあたり 1 日 20 万ヒット
セッションあたり 500 ヒット。ただし e コマース（アイテムとトランザクションのヒットタイプ）を除く
ヒット数がこのいずれかの上限を超えると、以降のヒットはそれぞれ該当の日付中、セッション中は処理されなくなります。これらの制限はプレミアムをご利用の場合も同じように適用されます。

出典: [Google アナリティクスのデータ収集上限  |  ユニバーサル アナリティクス ウェブ トラッキング（analytics.js）  |  Google Developers](https://developers.google.com/analytics/devguides/collection/analyticsjs/limits-quotas?hl=ja)
YeomanのGeneratorがうまく作動しない時の対処



久々にYeomanを使おうとしたらGeneratorがうまく作動しなかった。

gulp-webappを使おうとして

```
$ npm install --global generator-gulp-weabpp
$ yo gulp-webapp
```

と打ったところ下記のように出てしまい`gulp-webapp`がないと言われる。

```
You don't seem to have a generator with the name gulp-webapp installed.
You can see available generators with npm search yeoman-generator and then install them with npm install [name].
To see the 4 registered generators run yo with the `--help` option.
```

`You don't seem to have a generator with the name gulp-webapp installed.`を頼りにググったところ`yo doctor`を打つとよいよと出てきたので打ってみたところ下記のようなヒントをいただけて無事解決。

```
$ yo doctor
[Yeoman Doctor] Uh oh, I found potential errors on your machine
---------------

[Error] npm root value is not in your NODE_PATH
  [info]
    NODE_PATH = /Users/matayam/.nvm/v0.10.29/lib/node_modules
    npm root  = /usr/local/lib/node_modules

  [Fix] Append the npm root value to your NODE_PATH variable
    Add this line to your .bashrc
      export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules
    Or run this command
      echo "export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules" >> ~/.bashrc && source ~/.bashrc
```

nodeパスが上手く通ってなかっただけでした。

```
$ echo "export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules" >> ~/.bashrc && source ~/.bashrc
$ yo doctor
[Yeoman Doctor] Everything looks alright!
```
Xcode7GMでビルドすると「does not contain bitcode.」とか言われる

## 前書き

iOS9GMがリリースされたので動作確認をしてみたら不具合が見つかったので、
Xcode7をダウンロードしてきてデバッグ実行しようと思ったら以下のようなエラーが。

```
ld: '/Users/***/***/***/Fabric.framework/Fabric(FABObfuscator.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

これは、Fabricのライブラリファイル（Fabric.a）が Xcode7環境で
デフォルトでYESになっている、「ENABLE_BITCODE」のオプションに対応した形式でビルドされてないから、アップデートしてくれよってエラーですね。
`(※9/10 コメントでの指摘につき修正）`

bitcodeオプションについては、以下の記事で解説されています。
◆ LLVM bitcode基礎知識
http://qiita.com/gamako/items/f37dbb05de9d3832ce6b

## ENABLE_BITCODEをNOにする

「Build Settings」から「Enable Bitcode」の項目を検索し、NOにしましょう。
基本的にはこれでビルドが通るはずです。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/34166/b1f5e43e-d5bc-a37d-bc46-a8aa4fb39557.png)


## それでもエラーが出る場合

そういう場合は、仕方ないので古い環境でビルドしましょう。
**一度Xcode7+iOS9の環境を接続すれば、古い環境でもiOS9端末にインストールできるようになります。**

古い環境を残してXcode7GMをダウンロードしていれば問題ありませんが、
私のようにうっかり上書きしていた場合はAppStoreからもXcodeが落とせなくなります。
（6.4をダウンロードしても、インストール後に7.0環境で上書きされる）

仕方がないので、アプリケーションフォルダにあるGMのXcode(/Applications/Xcode.app)を適当な名前でリネームして、AppStoreから再度ダウンロードすることにしましょう。
例えばこんな感じ。

![スクリーンショット 2015-09-10 16.29.02.png](https://qiita-image-store.s3.amazonaws.com/0/34166/1437a5c8-7539-a7e0-b838-46c3c2641504.png)

Launchpadや、ショートカットバーのリンク先はリネームした方になってると思うので
アプリケーションフォルダから直接旧バージョンを起動しましょう。
これで、おそらくiOS9GM環境でのデバッグ実行ができると思います。
dirname $0 でスクリプト置いてあるディレクトリにならない

シェルスクリプトでどこからスクリプト叩いても同じ動作するように

```bash
cd `dirname $0`
```
をよく使うが、cd 実行後に相対パスで実行するとスクリプトの配置ディレクトリに移動してくれなくなる

```bash:smple.sh
#!/bin/bash

cd `dirname $0`
echo "`pwd` \n"

cd /usr/local
echo "`pwd` \n"

cd `dirname $0`
echo "`pwd` \n"
```

```:実行結果
[16:26:36 tmp]$ pwd
/tmp
[16:26:58 tmp]$ sh sample.sh 
/tmp 

/usr/local 

/usr/local 

[16:27:03 tmp]$ sh /tmp/sample.sh 
/tmp 

/usr/local 

/tmp 

[16:27:09 tmp]$
```



$0（コマンド）のdirnameなので当たり前といえば当たり前ですが、結構はまった
mkl numpyのインストール方法

Intel製の高性能行列ライブラリ、Math Kernel Library (mkl)がフリーで公開されるようになりました。これをnumpyから使えるようにする方法を解説します。対象はLinuxです（自分はUbuntu 14.04）。

# MKLのインストール

以下のサイトの、”click here now to register and download” をクリック。
https://software.intel.com/en-us/articles/free_mkl
名前、メールアドレス、会社名などを入力。レジストレーションのメールが来るので、そこをたどるとダウンロードできる。Mac版はない。およそ1GBある。インストール時に必要な、レジストレーションキーがあるのでメモっておく。
自分がダウンロードしたのは、``l_mkl_11.3.0.109.tgz``

ダウンロードしたファイルを展開。中に``install.sh``があるので実行。インストール先は、デフォルトでは ``/opt/intel`` 、途中でレジストレーションキーの入力を促されるので入力。（

対話形式を使わない場合は、解凍したディレクトリにある、`silent.cfg`ファイルの以下の部分を修正。

```
ACCEPT_EULA=accept
ACTIVATION_SERIAL_NUMBER=XXXX-XXXXXXXX
ACTIVATION_TYPE=serial_number
```

`install.sh -s silent.cfg`を実行すると、コマンドラインのみでインストールできる。


``/opt/intel/mkl/lib/intel64``に``LD_LIBRARY_PATH``を通しておく。

# numpyのインストール

numpyインストール時の設定は、``~/.numpy-site.cfg``を見に行く。このファイルのテンプレートは、ソースの中にある。
https://github.com/numpy/numpy/blob/master/site.cfg.example
ファイルを改変して、ホームディレクトリにおいておく。内容は、以下のようにしておく。

```
[mkl]
library_dirs = /opt/intel/mkl/lib/intel64/
include_dirs = /opt/intel/mkl/include
mkl_libs = mkl_rt
lapack_libs =
```

詳細は、下記サイトを参照。
https://software.intel.com/en-us/articles/numpyscipy-with-intel-mkl

この状態で、``pip install --no-binary :all: numpy``すると、勝手にmklを使ったnumpyがインストールされる。もともとnumpyが入っている場合は、一度アンインストールしておくこと。

# 動作確認

``numpy.show_config()`` を見ると、どの行列ライブラリを使っているか確認できる。Chainerをexampleなどを実行した感じだと、OpenBLASに比べて、1.5倍速程度で動いているようだ。

```
$ python
>>> import numpy
>>> numpy.show_config()
lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib/intel64/']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/opt/intel/mkl/include']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib/intel64/']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/opt/intel/mkl/include']
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib/intel64/']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/opt/intel/mkl/include']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib/intel64/']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/opt/intel/mkl/include']
mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/mkl/lib/intel64/']
    define_macros = [('SCIPY_MKL_H', None)]
    include_dirs = ['/opt/intel/mkl/include']
```
[Unity 5] uGUIのボタンを長押ししてプレイヤーを操作したい [C#]

ずっと導入したかった「uGUIのボタン長押し」の動作の方法が分かったからメモ。
「ボタンにOnclick()以外の動作をさせたい」という思考に至るまでが難しかった。

---

ボタン、いつもの「Button(Script)」→「OnClick()」とは別に、
「Event Trigger」を使うと、他にもいろいろな動作をきっかけにvoidを使わせることができる。


#Hierarghy
Canvasに「right」と「left」というButtonを作成。
スクリプトは「GameCenter」という空のオブジェクトに貼ってます。
![alt](http://neoaco.iceextra.org/otherpic/20150910/000.png)



#Event Triggerのつけ方
「Add Component」から「Event」→「Event Trigger」を選択

#Triggerの種類
画像見てください。
![alt](http://neoaco.iceextra.org/otherpic/20150910/002.png)
「PointerDown」と「PointerUp」はもう使ってるから灰色文字になってるけど、ちゃんと使えます。
つけたら、こんな感じになります（画像はすでにスクリプト設定済み）。
![alt](http://neoaco.iceextra.org/otherpic/20150910/001.png)



#スクリプトの中身
概要
1. ボタンの押すとboolをtrueにする
2. trueの間、毎フレームなにかしらの動作をさせる
3. ボタンを離すとboolがfalseになって動作が止まる
こんな感じ？

で、書いたコードがこちら。

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

public class right : MonoBehaviour {

	public GameObject player;
	bool now = false;

//2.の部分
	void Update(){
		if (now == true) {
			Vector3 Qpos = player.transform.localPosition;
			Qpos.x += (1.0f * Time.deltaTime);
			if(Qpos.x > 2.73f){Qpos.x = 2.73f;}
			player.transform.localPosition = Qpos;
		}
	}

//1.の部分
	public void OnRD(){
		now = true;
	}

//3.の部分
	public void OnRU(){
			now = false;
	}
```

１．に該当するのが void OnRD()。RightDownの略。
３．に該当するのが void OnRu()。RightUpの略。
ボタンでこのvoidを利用するには**必ず public**でなければなりませんよ（よく忘れて焦る）。


２．の部分。
私はボタンを長押ししている間にプレイヤーを左右に動かしたいので、
ベクターにlocalPositionを代入
↓
その中のxを計算させる（右端まで行ったら止まるように、右端の数値を入れる）
↓
localPositionに変更したベクターを代入
と書いてｽﾞｲｽﾞｲｯと右に動いてもらってます。

加算分にTime.deltaTimeを掛けることで、
フレームレートに左右されず一秒で1.0f動きます。
加減は適当に……。まだ遅い気がする。




#ボタンにセッティングする
これはOnClick()と一緒。

1. 右下の＋を押す
2. スクリプトを貼ったオブジェクトを選択
3. No Function→スクリプト（今回はright）→動かしたいVoid（OnRDとかOnRU）

こうすれば、ボタンをクリックしている間は右に動いて、離すと止まる。
設定が終わると上の方にある画像みたいになりますよ。


#ゲームビューで動かしてみる
うごいた。

---

ﾃﾞｷﾀﾖｰ!! (˘ω˘)
左向きは、左向き用に同じようにスクリプト書いて貼ってください。
AVAssetの任意の時間でトリムしてエクスポートする

AVAssetExportSessionでエクスポートすると思うのですが、その際にtimeRangeを指定することで任意の時間でトリムすることができます。

```swift
        let videoDuration = CMTimeGetSeconds(videoAsset.duration)
        let stopTime = CMTimeMakeWithSeconds(videoDuration-0.1, 10)
        let range = CMTimeRangeFromTimeToTime(kCMTimeZero, stopTime)
        assetExport.timeRange = range
```

例えばこれは動画の長さの後ろ0.1秒を含まないようにしています。

CMTimeMakeWithSecondsを使うことで実際の秒数を意識してトリムすることができます。CMTimeより直感的ですね