OmniAICreator/Qiita-1.07M huggingface dataset:
Google Places API で使用できるプレイスタイプの日本語的意味

Google Places APIのプレイスタイプ（typesプロパティ）の値がすべて英語な上にめちゃめちゃ多いので、日本語で一覧的に見たい。と思ったのでまとめ。

単語の意味にピンと来なかった施設に関しては実際にプロットして確認しました。
単語の意味と実際の施設の種類が異なるにも関わらずその分類に含まれているパターンなど、分類の定義があいまいなプロパティもあるので注意。

|typesプロパティ名|日本語訳|
|---|---|
|accounting|会計事務所|
|airport|空港|
|amusement_park|遊園地|
|aquarium|水族館|
|art_gallery|美術館|
|atm|ATM|
|bakery|パン屋|
|bank|銀行|
|bar|バー|
|beauty_salon|美容室|
|bicycle_store|自転車屋|
|book_store|書店|
|bowling_alley|ボウリング場|
|bus_station|バス停|
|cafe|カフェ|
|campground|キャンプ場|
|car_dealer|自動車ディーラー|
|car_rental|レンタカー屋|
|car_repair|自動車修理, 板金屋|
|car_wash|洗車|
|casino|カジノ|
|cemetery|墓地|
|church|教会|
|city_hall|市役所|
|clothing_store|洋服店|
|convenience_store|コンビニ|
|courthouse|裁判所|
|dentist|歯科|
|department_store|デパート|
|doctor|医者|
|electrician|電気事業者|
|electronics_store|電器屋|
|embassy|大使館|
|establishment|飲食店や医療機関などがまとめて出てくる。詳細不明|
|finance|財務機関|
|fire_station|消防署|
|florist|花屋|
|food|飲食店|
|funeral_home|斎場|
|furniture_store|家具屋|
|gas_station|ガソリンスタンド|
|general_contractor|ゼネコン|
|grocery_or_supermarket|日用品店, スーパーマーケット|
|gym|スポーツジム|
|hair_care|床屋|
|hardware_store|工具店, ホームセンター|
|health|主に医療機関|
|hindu_temple|ヒンドゥー寺院|
|home_goods_store|ホームセンター|
|hospital|医療機関 ※町の小さなクリニックなども出てくる|
|insurance_agency|保険代理店|
|jewelry_store|宝石店|
|laundry|クリーニング店, コインランドリー|
|lawyer|法律事務所|
|library|図書館|
|liquor_store|酒店|
|local_government_office|地方公共団体|
|locksmith|鍵屋|
|lodging|宿泊施設|
|meal_delivery|飲食店（出前形式）|
|meal_takeaway|飲食店（テイクアウト形式）|
|mosque|モスク|
|movie_rental|ビデオレンタル屋|
|movie_theater|映画館|
|moving_company|運送屋, 引越し屋|
|museum|博物館, ミュージアム|
|night_club|ナイトクラブ|
|painter|塗装屋|
|park|公園|
|parking|駐車場|
|pet_store|ペット屋|
|pharmacy|薬局|
|physiotherapist|療法士|
|place_of_worship|神社、寺|
|plumber|配管工, 水道業者|
|police|警察署, 交番|
|post_office|郵便局|
|real_estate_agency|不動産業者|
|restaurant|レストラン|
|roofing_contractor|屋根屋？日本に施設該当ほぼナシ|
|rv_park|RVパーク、日本にほぼなし|
|school|学校, 塾, 習い事系まるごと含まれる|
|shoe_store|靴屋|
|shopping_mall|ショッピングモール, 複合商業施設|
|spa|温泉, 銭湯|
|stadium|スタジアム|
|storage|倉庫|
|store|店。かなり全般的だが抜け漏れありまくりで需要ナシ|
|subway_station|鉄道駅（地下鉄駅のみ）|
|synagogue|シナゴーグ。ユダヤ教の会堂らしい|
|taxi_stand|タクシー乗り場|
|train_station|鉄道駅。ただし出ない駅多い|
|travel_agency|旅行代理店|
|university|大学|
|veterinary_care|動物病院|
|zoo|動物園|

間違いあると思います。あれば教えてくださいー。
CakePHP2でShift_JISのビューファイルをUTF-8で出力する

システム全体はUTF-8なんだけど、どうしても一部のビューファイルをShift_JISにしなければならない場合、afterFilter()で変換すればUTF-8で出力できます。

```php:app/Controller/HogeController.php
class HogeController extends AppController {

    // sjisのビューファイルをutf8に変換して出力するかどうか
    private $__sjis2utf8 = false;

    public function afterFilter() {
        parent::afterFilter();
        // sjisをutf8に変換
        if ($this->__sjis2utf8) {
            $body = mb_convert_encoding($this->response->body(), 'UTF-8', 'SJIS-win');
            // メタタグも変換(状況に応じて)
            $body = str_replace('<meta http-equiv=Content-Type content="text/html; charset=shift_jis">', '<meta http-equiv=Content-Type content="text/html; charset=UTF-8">', $body);
            $this->response->body($body);
        }
    }

    // ビューファイルがsjisなアクション
    public function fuga() {
        .
        .
        .
        $this->__sjis2utf8 = true;
    }
}
```

layoutとかもUTF-8のものと共用する場合は、違う方法を考えないといけないかも。
EclipseでStruts2環境構築



**Eclipse Neonダウンロード**
eclipse installerでEclipse IDE for Java Developersをインストール

---

**以下のプラグインを入れる**

Spring
	*Spring IDE*

WTP
*Eclipse Web Developer*
*Eclipse JST Server Adapters*
*Eclipse Java EE Developer Tools*
 >_m2e-wtp- Maven Integration for WTPも追加する_

Struts2
*strutsClipse*
>_StrutsClipse Tilesも追加する_

---

**Mavenを入れてソースを取得**

*Maven入れ方*

```text
以下のサイトからBinary zip archiveをダウンロード
https://maven.apache.org/download.cgi

解凍して、任意のディレクトリに置く

解凍したディレクトリのbinフォルダにパスを通す
Maven入れるの終わり。
```

*Mavenを使ってソース取得*

```shell-session

mvn archetype:generate -DarchetypeCatalog=http://struts.apache.org/
```

以下のように聞かれるので6を入力してエンターを押す

```shell-session
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 6
```

グループIDを聞かれるのでルートパッケージ名をいれる

```shell-session
Define value for property 'groupId':: jp.xxx.test
```

アーティファクトIDを聞かれるのでプロジェクト名を入れる

```shell-session
Define value for property 'artifactId': :TestProject
```

バージョンを聞かれるので、何も入れずにエンター

```shell-session
Define value for property 'version':  1.0-SNAPSHOT: :
```

パッケージ名を聞かれるので、そのままエンター

```shell-session
Define value for property 'package':  jp.xxx.test: :
```

Yか？と聞かれるのでそのままエンター

```shell-session
 Y: :
 ```

---

**pom.xmlを編集**

```xml:pom.xml
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.7</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2.1-b05</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>
```

---

**EclipseからimportでMavenプロジェクトを開く**

プロジェクトエクスプローラを右クリック
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/135925/823aa874-9d53-51d1-e516-290c32f41f91.png)

Existing Maven Projectを選択し、pom.xmlを選択して取り込む
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/135925/5f2dc1b0-d9bf-6aa5-1108-33873769051e.png)


---

**struts.xmlを編集**

```xml:struts.xml
        <action name="helloWorld" class="helloWorldAction">
            <result name="input">/WEB-INF/jsp/index.jsp</result>
            <result>/WEB-INF/jsp/helloWorld.jsp</result>
        </action>
```

を以下のように編集する。

```xml:struts.xml
        <action name="helloWorld" class="jp.xxx.test.HelloWorldAction">
            <result name="input">/WEB-INF/jsp/index.jsp</result>
            <result>/WEB-INF/jsp/helloWorld.jsp</result>
        </action>
```

---

**サーバーの設定**

ViewのServerを開く
右クリックで「Add and Remove」をクリック
今回のプロジェクトをAddする
右クリックでスタートする

---

**以下のURLを開く**
http://localhost:8080/struts2-archetype-starter/
Raspberry Piで使っていたUSBメモリがwrite-protectedに

# Raspberry Piで使っていたUSBメモリがwrite-protectedに

## ある日

```
sudo mount /dev/sda1 /mnt/USBMem/
```
が

```
mount: /dev/sda1 is write-protected, mounting read-only
```
になってしまった

これはUSBメモリが逝ってしまったか？
USBメモリは代替品を用意するとしても、なんとか中身を少しでも取り出したい

## とりあえずfsckしてみた

```
sudo fsck -y /dev/sda1
```
に

```
fsck from util-linux 2.25.2
e2fsck 1.42.12 (29-Aug-2014)
fsck.ext4: Read-only file system while trying to open /dev/sda1
Disk write-protected; use the -n option to do a read-only
check of the device.
```
と連れない返事

## write-protectedならReadOnlyでいいんじゃ

```
sudo mount -r /dev/sda1 /mnt/USBMem/
```
には

```
mount: wrong fs type, bad option, bad superblock on /dev/sda1,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

```
との返し

## ディスクイメージを吸い出してマウントしてみたらどうだろう？

```
sudo dd if=/dev/sda1 bs=64k of=./sda1.img
sudo mount -o loop ./sda1.img /mnt/img
```

ををっ うまくいった
Retrolambdaでlambda式を使用した場合にLintでjava.lang.UnsupportedOperationExceptionが発生する場合の対処方法


# 概要

Retrolambdaをプロジェクトに導入してlambda式を使用した場合、Android Lintで以下のようなExceptionが発生しました。

```bash
Failed converting ECJ parse tree to Lombok for file /path/to/lambda式使用したファイル
java.lang.UnsupportedOperationException: Unknown ASTNode child: LambdaExpression
```

ビルド自体は通るのですが、Lintの実行時間にも影響ができるので解決策を調べてみました。

# 解決方法

解決方法としては、[https://github.com/evant/android-retrolambda-lombok](https://github.com/evant/android-retrolambda-lombok)を利用します。具体的にはbuild.gradleを以下のように変更します。

```gradle
buildscript {
    repositories {
        jcenter()
        ...
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:<version>'
        classpath "me.tatarka:gradle-retrolambda:<version>"
        classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
    }

    // Exclude the version that the android plugin depends on.
    configurations.classpath.exclude group: 'com.android.tools.external.lombok'
}
```

gradle-retrolambdaのissues[#96](https://github.com/evant/gradle-retrolambda/issues/96)を読んでみたのですが、Android Lintが依存している[lombok.ast](https://mvnrepository.com/artifact/com.android.tools.external.lombok/lombok-ast/0.2.3)がJava8の構文に対応していないのが原因のようです(JackをEnableにしても同じ問題が起きる？)。[https://github.com/evant/android-retrolambda-lombok](https://github.com/evant/android-retrolambda-lombok)はlombok-astをforkしてJava8の構文を追加したもので、それをLintが依存しているものと置き換えています。

# 参考
- http://stackoverflow.com/questions/29316332/retrolambda-lint-crashes-when-using-lambda-expressions-with-retrolambda
- https://github.com/evant/android-retrolambda-lombok
Amazon S3バケットへのファイルアップ

#S3バケットへのファイルアップ(CLI編）

今回はシステムの連携などでコマンドでAmazon S3にファイルを転送する必要がある時に役に立つ情報共有です。

***

##設置

```lang:
以下の順番で設置してください。
$ wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

※aws設定
$ aws configure
上記のコマンドを実行すると以下の入力が必要です。
AWS Access Key ID [None]: xxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxx
Default region name [None]: 入力せずにEnterキー
Default output format [None]: 入力せずにEnterキークリック

```

  
##aws s3コマンドの実行方法
```lang:
test.txtファイルをaws s3のbucketに転送
$ aws s3 cp /tmp/foo/test.txt s3://bucket/ 

```


これで簡単にAmazon S3バケットへファイル転送ができます。
次回は転送以外のコマンドについて掲載しますので。お楽しみに。。。。

[詳しい情報はこちらを参考してください](https://aws.amazon.com/jp/cli/)
ゆっくりとデータサイエンティスト回りの概念/手法を整理してみようと思う part0

どうも。Yuuseiと申します。
家の近所でアナリストとしてB2B周りの分析をしてるんですが、

本格的にデータサイエンティストと名乗るために自分の中で整理をつけようと思い、
重い腰を上げた次第です。

割と似たような記事は不定期にいろんな人が書いているようなので、
【そろそろデータサイエンティストの定義とスキルセットについて本気で考えてみる】
http://qiita.com/hik0107/items/f9bf14a7575d5c885a16

まぁ、その中のイチ意見とでも思いながら読んでいただければな、と。
方向性ですが、

【一般社団法人データサイエンティスト協会】
http://www.datascientist.or.jp/index.html

の2014年発表

【スキルセット・定義】
http://www.datascientist.or.jp/news/2014/pdf/1210.pdf

をベースとして、最近読んでる本や記事もベースに、
そろそろ自分の中で今後来るであろう流れに備える意味を含めて、
再定義しときたいなと思って書いてます。

2012年あたり(もうちょっと前？)から第三次機械学習ブーム、
特に機械学習周りでDeep Learningがアツくなっていることもあり、
「機械学習エンジニア」と言うものが求人市場に出てきてます。

【機械学習を身につけたITエンジニアは強い！（上）：今すぐにでも学ぶべき二つの理由】
http://itpro.nikkeibp.co.jp/atcl/column/14/090100053

なので、この「機械学習エンジニア」や「予測作成アナリスト」の様な、
わりとデータサイエンティストと被っている領域について、
データサイエンティストの棲み分けだという考え方で進めていき、
どこに違いがあるかと言う事を整理したいなと思います。

このTJOさんのブログ(愛読してます)がベースとなると思いますが、
【データサイエンティスト（本物）は決して幻の職業などではない 】(六本木で働くデータサイエンティスト)
http://tjo.hatenablog.com/entry/2016/09/21/190000

TJOさんが分析・基盤技術必須と書いてあり、
海の向こうのトレンドに対してもコメントしているのに対し、

それは大前提として、ビジネスサイド視点での意見を追加していく事になると思います。

割と最初に挙げたURLと似通った形になるんじゃないかと思いますが、
気になった方はたまに見に来てもらえると新しい発見があると思います。

ちなみに、上記　hik0107　さんの下記記事は、
参考書リストとしてわかりやすいので、そのまま引用しちゃいます(ごめんなさい)

【データサイエンティストに興味があるならまずこの辺りを見ておきな、って文献・動画のまとめ（随時追加）】
http://qiita.com/hik0107/items/ef5e044d2f47940ba712

そんなわけで、そろそろ時間が危なくなってきたので、
出社準備始めます。
多分 part1 は年内に出る感じです。
VisualStudioのデバッグ中の小技　～ソースを弄らず変数をログ確認～

かなり便利な機能ですが周りに使っている人をあまり見かけない小技です。

利用シーンとしては
・デバッグ中にさっと変数の中身をみたい。（但し処理を中断はしたくない)
・ソースは修正したくないが簡単にログを埋め込みたい。
・対象メソッドが実行された回数や簡易フローを知りたい
など。

# 手順
※VisualStudio2015の画面になります。

①通常のデバッグと同様に確認したい箇所にブレークポイントを指定します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/48623/132d4ac5-dc53-f2ce-2ca6-0986307298bc.png)


②ブレークポイントに対して右クリックで操作(A)を選択
![2.png](https://qiita-image-store.s3.amazonaws.com/0/48623/ff87bf6c-360b-3d98-61a3-646c230dcb59.png)


③操作を選択すると下記がポップアップされるので
![3.png](https://qiita-image-store.s3.amazonaws.com/0/48623/57a7f855-3f8d-69cb-f31b-2ec39bc8fee5.png)

④"出力ウィンドウにメッセージを記録する"に表示したい内容を記載します。
　変数の内容を表示したい場合{}で囲むことで表示できます。画像ではsenderを指定
![4.png](https://qiita-image-store.s3.amazonaws.com/0/48623/8d92c1ac-8f13-0bd6-5c0d-104c2cc610a7.png)


⑤あとは画面で動作するだけ。ブレークポイントを通るたびに出力ウィンドウに④での指定した内容が表示されます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/48623/1273e8cf-e8b1-036c-d46c-3c4fb86137c3.png)

## VisualStudio2015以前で手順が少し異なる。
この機能はVisualStudio2010から搭載されてますが、
VisualStudio2015以前でブレークポイントを右クリックした際の表示名が異なります。
機能としては同じですので是非ご利用ください。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/48623/86ab5e7b-1427-38b2-446b-66192a0ee8b8.png)


![7.png](https://qiita-image-store.s3.amazonaws.com/0/48623/414bd3cc-3dbb-f312-ff9e-193b9d406ac2.png)
ソフトウェアのシステム・デザイン

# 「デザイン」とは？

システムをデザインしましょうという話しの前に、まず「デザイン」の本質を知ることが必要ですね。

デザインとは、見た目の形や色のことではありません。

グット・デザイン賞のサイトに、良い記事があります。
https://www.jidp.or.jp/ja/about/whatsdesign

![Design](https://www.jidp.or.jp/media/2283d4a7-fd77-4dbe-8a66-2a7d04311a59)

良いデザインとは、そのモノによって産業や生活文化が向上していることが評価対象となります。
コトを成す手段（形、色、技術、機能）が評価されるのではなく、実現した「コト」が評価されるわけです。

# システムをデザインするということ

ソフトウェアシステムはステークホルダーに提供する価値です。
価値を実現するためにはデザインが必要です。これがシステム・デザインです。

* ユーザードメイン（特定領域）を素早く実現するための仕組み　＝　デザイン
* 高品質、短納期、低コストで提供できる仕組み　＝　デザイン
* 正常系は当たりまえ、異常時を素早く復旧できる仕組み　＝　デザイン

仕組みを作りこんでいく行為が「デザイン」です。

ステークホルダーが望む「コト」を理解し、それを実現するシステムをデザインするのが我々の使命でしょう。
技術英語 > Defetcs tend to occur [in groups],

@ Code Complete (No. 17850 / 36077)

> Defetcs tend to occur **<font color=red>in groups</font>**,

codeを修正する時に以下を進める理由が上記。

> Look for similar defetcs.

ある間違いをした時には、同じ間違いを他の場所でもしていることがある。それを面倒くさがって修正しておかないと、後になってから似たようなバグで苦労する。

<hr>
groupで思い出したのがgroup theory(群論)。
https://en.wikipedia.org/wiki/Group_theory

Évariste Galoisが決闘で死ぬ前に書いた論文が祖となるとか漫画で読んだことがある。

group theoryを使って数値計算を改良するという論文を読んだことがあるが、自分にはさっぱりだった。
https://www.osapublishing.org/oe/abstract.cfm?uri=oe-19-12-11138
Slackチャンネルの投稿を全消ししたい

諸事情でSlackチャンネルの投稿を全消ししたい
ただしチャンネルを消したい訳ではない

0. https://[Team].slack.com/archives
にアクセス

0. 「ACTIONS」の「Delete messages...」をクリック
![ACTIONS→Delete messages.png](https://qiita-image-store.s3.amazonaws.com/0/89027/192b0e8b-812a-c7c0-855a-4ce7a4c5f4bf.png)

0. Select:の「All」で100メッセージは選択できる
![Select→All01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/b5e103b9-c505-2f92-ee64-a14a70e89670.png)
　　　　　↓
![Select→All02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/0aa0a9fd-2cfa-ee3a-f206-c826696a4506.png)

0. 「Delete」をクリック

0. 「Yes, delete these messages」をクリック
![Delete Messages.png](https://qiita-image-store.s3.amazonaws.com/0/89027/c949910f-6b52-9e43-c88e-00ffc97e7c2c.png)


あとはひたすら「刺し身タンポポ仕事(or2」を繰り返す

賢い人ならもっとスマートな方法もあるんでしょうが、15,000件程だったので諦めてシコシコやりました
ubuntu16.04でpython3環境構築

自分のubuntu16.04のpython環境構築うろ覚え．
特に新しいコト無いです．

# pyenv virtualenvの導入
[参考：Ubuntuにpythonと機械学習のライブラリをセットアップ](http://qiita.com/tsubu-mustard/items/fd5984e49d1ff449eec4)
[参考：PyenvによるPython3.x環境構築(CentOS, Ubuntu)](http://qiita.com/akito1986/items/be5dcd1a502aaf22010b)

```
sudo apt-get install gcc g++ make git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
```

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc 
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

source ~/.bashrc
```

# python3環境構築

```
pyenv install 3.5.1
pyenv rehash
pyenv global 3.5.1
mkdir ~/workPython3

~/workPython3$ pyenv virtualenv 3.5.1 3.5.1_work
~/workPython3$ pyenv local 3.5.1_work
```

```
(3.5.1_work) foo@Ubuntu16.04:~/workPython3$ pip install numpy
```
問題無し．

```
(3.5.1_work) foo@Ubuntu16.04:~/workPython3$ pip install scipy
```

ここ(scipyのインストール)でBLASパッケージを何も入れておらずエラー．
どのBLASパッケージが良いのかよくわからないけど，とりあえずopenblasを入れる．

[参考：ubuntu 14.04でBLASを使う](http://verifiedby.me/adiary/058)

```
~$ sudo apt-get install libopenblas-dev
```

もう一回．

```
(3.5.1_work) foo@Ubuntu16.04:~/workPython3$ pip install scipy
```

今度は問題無し．
エビングハウス錯視

```r
library(grid)
library(jpeg)

r1 = readJPEG("20161201_face.jpg")
r2 = readJPEG("20161202_face.jpg")

png("sakuad2016120101.png", 800, 400)

pushViewport(viewport(0.25, 0.5, 0.5, 1, xscale = c(-1, 1), yscale = c(-1, 1)))
grid.raster(r1, 0, 0, 0.3, 0.3, default.units = "native")
for (th in seq(0, 2*pi, length.out = 6+1)[-1]) {
  grid.raster(r2, cos(th)*0.3, sin(th)*0.3, 0.1, 0.1, default.units = "native")
}
popViewport()

pushViewport(viewport(0.75, 0.5, 0.5, 1, xscale = c(-1, 1), yscale = c(-1, 1)))
grid.raster(r1, 0, 0, 0.3, 0.3, default.units = "native")
for (th in seq(0, 2*pi, length.out = 6+1)[-1]) {
  grid.raster(r2, cos(th)*0.7, sin(th)*0.7, 0.5, 0.5, default.units = "native")
}
popViewport()

dev.off()
```

![sakuad2016120101.png](https://qiita-image-store.s3.amazonaws.com/0/4390/5487f0c6-3eac-eba2-cd40-e625765b414e.png)


株式会社ホクソエム代表取締役が株式会社ホクソエム取締役に囲まれてますが、真ん中の株式会社ホクソエム代表取締役の大きさは左の株式会社ホクソエム代表取締役も右の株式会社ホクソエム代表取締役も同じです。
大きい株式会社ホクソエム取締役に囲まれると真ん中の株式会社ホクソエム代表取締役が小さく見えて、小さい株式会社ホクソエム取締役に囲まれると真ん中の株式会社ホクソエム代表取締役が大きく見えます。

真理ですね。

株式会社ホクソエムのホームページです。 http://hoxo-m.com/

エビングハウス錯視は株式会社ホクソエムとは一切関係ありませんが、ドイツの心理学者エビングハウスが発見した（とされる）錯視です。
でも、実際のところ、ケプラーあたりは気づいてたんじゃないかと思います。
というか、古代ギリシャで絶対気づいてた人いたと思います。

エビングハウスといえば、エビングハウスの忘却曲線
https://ja.wikipedia.org/wiki/%E5%BF%98%E5%8D%B4%E6%9B%B2%E7%B7%9A
が有名かもしれません。
「人は忘れる」ということを示した曲線です。
無意味つづりの記憶課題とか、本当に辛いです。

↓のガーディアンの記事は面白いですね。

https://www.theguardian.com/science/head-quarters/2016/aug/22/the-ebbinghaus-illusion-small-far-away-circles-father-ted

確かに、2D網膜像から3D世界を復元する過程で、見かけの大きさと距離が相関するので、そこで色々錯視が生じます。個人的には、色成分が関係ない錯視の大半が2Dから3D復元に起因するんじゃないかと思ってます。

これから25日まで完走できる気は全くしませんが、頑張って生きます。
Laravel5　トラブったときに参考にしたサイト

データベースを触る必要性が出てきたのでLaravel5の勉強中。
勉強中に参考にしたページをメモっていく。
順次更新予定。

# [Composer](https://getcomposer.org/download/)
Composerをダウンロードするのに参考にした。

# [Hello Laravel 5! しようとしたら一瞬つまづいた時の対応 - Qiita](http://qiita.com/YU81/items/d1b2100aae53d2088a2c)
Webサーバを立ち上げたときに```Whoops, looks like something went wrong.```と表示されてうまくいかなかったときに参考になった。
```composer install```は最初は```Could not find composer.json```などと言われて実行できないことがあったが、何回かやってみるとできたので原因は分からない。何もしていないのに```composer install```を何回か実行しただけでできた。

# データベースにアクセスできない
```Access denied for user 'homestead'@'localhost' (using password YES)```
と表示されてデータベースにアクセスできなかったとき（migrateができなかった）、```.env```ファイルの中の

```
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```
を

```
DB_DATABASE=[laravelでアクセスするデータベースの名前]
DB_USERNAME=[上記データベースにアクセスできるユーザの名前]
DB_PASSWORD=[上記ユーザのパスワード]
```
とする。
# が、それでもできない！

```
Access denied for user 'dbuser'@'localhost' (using password YES)
```
と表示され、ユーザネームがちゃんとdbuser（僕の環境ではこういう名前にしてただけです）になっているのにdenyされる。
・・・パスワードが間違っていただけだった。
.envのDB_PASSWORDに記したパスワードとMySQLでdbuserにrootから設定したパスワードが違っていた。
しょうもないミスだったが、一回こういうミスをすると一生同じミスをしない（もしくは一瞬でトラブルシュートできる）ので良しとする（こういうところにメモっとくとなおさら）。

# Migrationファイルでテーブルのカラムの属性を変更する
[Laravel 5.3 データベース：マイグレーション](https://readouble.com/laravel/5.3/ja/migrations.html)を参考にusersテーブルのpasswordカラムのデータ型をvarchar(20)からvarchar(100)に変更した。
作成したMigrationファイルのup()とdown()を以下のように記述し、Migrationファイルを適用した。
down()に何を書くのが正解が分からず、とりあえず単純に作業を巻き戻す処理を記述した。

```
public function up()
{
  Schema::table('users', function($table) {
    $table->string('password', 100)->change();
  });
}
public function down()
{
  Schema::table('users', function($table) {
    $table->string('password', 20)->change();
  });
}
```
【pom+5行で解決】Selenium WebDriverでブラウザを問わずページ全体のスクリーンショットを撮影する

# Google Chromeでページ全体のスクリーンショットを撮影できない
Selenium WebDriverではスクリーンショットを撮影する際、ブラウザによって挙動が異なります。
具体的に、Firefoxではページ全体が撮影される一方で、Google Chromeではウィンドウ内の視認できる範囲のみ撮影されます。
このことは[公式ドキュメント](https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/TakesScreenshot.html)にも記述されており、ブラウザの仕様に引っ張られている様子。

上記の問題を解決するのがJava製Selenium WebDriverスクリーンショットユーティリティ「[aShot](https://github.com/yandex-qatools/ashot)」です。
この記事では「aShot」の使い方を簡単に紹介します。

# WebDriverスクリーンショットユーティリティ「aShot」
> WebDriver Screenshot utility. Take screenshots, crop, prettify, compare
> https://github.com/yandex-qatools/ashot

機能は以下の通りです。

1. **ページ全体のスクリーンショットを撮影する**
2. 特定の要素のスクリーンショットを撮影する
3. 特定の要素をハイライトしたスクリーンショットを撮影する
4. ページ全体のスクリーンショットを比較する
5. 特定の要素のスクリーンショットを比較する

この内、１の「**ページ全体のスクリーンショットを撮影する**」に絞って使い方を紹介します。

# 使い方
- pom.xmlに依存関係を記述する。

```xml
<!-- https://mvnrepository.com/artifact/ru.yandex.qatools.ashot/ashot -->
<dependency>
    <groupId>ru.yandex.qatools.ashot</groupId>
    <artifactId>ashot</artifactId>
    <version>1.5.2</version>
</dependency>
```

- Seleniumのコードに「3行 + 空行 + 1行 (計5行)」書き加える

```java
@Test
public void aShot() throws IOException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.manage().window().maximize();

    // 余談 : JavaユーザーにオススメのJava製Selenium WebDriverラッパーライブラリ「Selenide」
    webDriver.get("http://selenide.org/");

    // ページ全体を撮影。画像イメージはru.yandex.qatools.ashot.Screenshot型として保管される(3行)
    Screenshot screenshot = new AShot()
    .shootingStrategy(ShootingStrategies.viewportPasting(100))
    .takeScreenshot(webDriver);

    // 保管したイメージを任意の場所に書き出す(1行)
    ImageIO.write(screenshot.getImage(), "PNG", new File("C:/path/to/your.png"));

    webDriver.close();
}
```

# Appendix : スクリーンショット撮影の挙動
上記のコードを実行すると、以下のスクリーンショットを得られます。
このスクリーンショットを参考に挙動を把握します。

<img width="300px" alt="http://selenide.org/" src="https://qiita-image-store.s3.amazonaws.com/0/133509/9d51aec4-b4e7-9386-39bf-0d999f734d69.png">

- スクリーンショットの撮影方法
画像右には「複数のスクロールバー」が写っています。
これは**ウィンドウをスクロールさせながら複数のスクリーンショットを撮影し結合している**ためです。
そのため、画面内で固定位置のナビゲーションや広告が存在すると以下のようになります。
<br /><img width="300px" alt="http://selenide.org/" src="https://qiita-image-store.s3.amazonaws.com/0/133509/00d761ae-0a2f-fe78-8ff5-44f74433a8d0.png"><br />
画面上部の黄色いバーが重複して撮影されています。

- スクロールおよびスクリーンショット撮影の間隔
ShootingStrategies.viewportPasting(int ms)で指定します。
短すぎると要素の読み込みを待たずにスクリーンショットを撮影してスクロールするため、結合結果が適切になりません。
MarkdownをHTML上に表示するにはどうしたらいいか

# やりたいこと

PHPでMarkdownの文書をきれいなHTMLで表示させたかったので、自分なりにしっくりくるパターンを探してみた。
最終的にはBootstrapを使っているHTMLに組み込むので、多少の影響も受けると思いますが、ひとまず備忘録的に残しておきます。

- [Sample](http://tom-gs.com/demo/test/markdown/parsedown/)

# 使うもの

## パーサ
何種類か試した結果Parsedownが一番しっくり来る感じ。

- [Parsedown](http://parsedown.org/)

## CSS

- https://github.com/mixu/markdown-styles

基本的には以下の2つをピックアップして使用します。

- https://raw.githubusercontent.com/mixu/markdown-styles/master/layouts/github/assets/css/github-markdown.css
- https://raw.githubusercontent.com/mixu/markdown-styles/master/layouts/github/assets/css/hljs-github.min.css

これに加えてhighlight.jsのCSSを使います。

## Syntax Highlight

ダウンロードしたパッケージ含まれる`highlight.pack.js`と`styles/default.css`を使います。

## 最終的なフォーマット

上記をダウンロードするなどして最終的にまとめた感じが以下になります。

```php:index.php
<?php
require_once(__DIR__ . '/parsedown/Parsedown.php');

$parser = new Parsedown();
$content = $parser->text(file_get_contents(__DIR__ . '/README.md'));
?>
<html lang="ja-jp">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="generator" content="Joomla! - Open Source Content Management" />
    <title>tom-gs.com - HOME</title>
    <link href="assets/css/github-markdown.css" rel="stylesheet" />
    <link href="assets/css/hljs-github.min.css" rel="stylesheet" />

    <link href="assets/scripts/highlight.js/styles/default.css" rel="stylesheet" />
    <script src="assets/scripts/highlight.js/highlight.pack.js"></script>
    <script>hljs.initHighlightingOnLoad();</script>

  </head>
  <body>
    <div class="markdown-body markdown"><?php echo $content; ?></div>
  </body>
</html>
```

# 2016.12.02追記

見出しのアンカーリンクが作られていないので、作ってみました。
CSS自体は対応しているので、あとはPHPとスタイルをちょっと調整するだけ。

- [Sample](http://tom-gs.com/demo/test/markdown/parsedown2/)

## Parsedownを書き換える

と言っても継承して、見出しを作っているメソッドをオーバーライドするだけです。
[ParsedownExtra](https://github.com/erusev/parsedown/pull/285/commits/2e6da53a7cf0d40bbae373f100a40508760d254b)でも実装されていないみたいなので、独自でやっちゃいました。

```php:MyParsedown.php
<?php
class MyParsedown extends Parsedown
{
    protected function createAnchorFragment($str)
    {
        $signs = array(
            '.', ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '%', '#', '\\', '\'',
            '|', '`', '^', '"', '<', '>', ')', '(', '}', '{', ']', '[',
        );
        $str = str_replace(' ', '-', $str);
        $str = str_replace($signs, '', $str);
        return $str;
    }

    protected function blockHeader($Line)
    {
        $Block = parent::blockHeader($Line);
        $text = $Block['element']['text'];

        // Github
        $html = '<a id="%s" class="anchor" href="#%s" aria-hidden="true">';
        $html .= '<span class="octicon octicon-link"></span></a>%s';

        $fragment = 'user-content-' . $this->createAnchorFragment($text);

        $Block['element']['text'] = sprintf($html, $fragment, $fragment, $text);

        return $Block;
    }
}
```

あとはサンプルコードで`new Parsedown()`となっているところを`new MyParsedown()`に変えればOK。

## スタイルの調整

アンカーリンクのアイコンが見事に消えているので以下のCSSを追加して見える化。

```css
.markdown-body {
  padding-left: 30px;
  padding-right: 30px;
}
```
AWS re:Invent 2016に参加してみた 1日目

何日続けられるか。
今回初参加ということで、経験したことを記していこうと思います。見つけられなかったのでTiwtterは「#jaws #reInvent」で勝手につぶやいていました。正しいハッシュタグを知っている人がいたら、教えて！
＃前日色々と前乗り組でラスベガスを旅行したのですが、今回はそちらは載せません。

# Register
何はなくともRegisterです。一番大きなベネチアンで実施しましたが、11/28（月）の午前だったらそこまで混んではいませんでした。どうやら午後にくる日本からのツアー組のRegister時には混んでいたようで。

![DSC02702.JPG](https://qiita-image-store.s3.amazonaws.com/0/102769/3d3ed98b-4e98-3249-8c74-ce134ec325ef.jpeg)


参加特典はパーカーとAmazon Echo Dotでした。何かを匂わせる展開。

初日にいくつかセッションを見はしたのですが、詳しい説明などは、後からスライドと動画が公開されるでしょうから、ざっくりとした所感だけ。

# MAE301 - Accelerating the Transition to Broadcast and OTT Infrastructure in the Cloud: Spotlight on Building Media Services on AWS and Elemental
動画配信会社「Cinepolis」のAWSユースケースの紹介。超大量のデータストレージと、ユーザがアクセスした際のDownStream、Transcoding等色々とある課題をAWS使って解消しています、という紹介。適用規模が大きいだけに、実際に適用した話が聞けただけでも面白かった。あとこの発表者の英語は自分には難しかった。。。

# FIN302 - Disaster Recovery and Business Continuity for Systemically Important Financial Institutions
DR対策をAWSを用いて実施した、という内容。デモ見せるまでは面白かったけど、途中からCloudFormationの中身の説明とか、コードの説明になり始めたので、技術的にその辺明るい人にはだんだんと面白くなくなったかも。
デモ自体は、フリマみたいなWebサービスを、西海岸と東海岸でそれぞれストレージ、Webサーバを分けて運用していた際に、東海岸のWebサーバがダウンした時を想定。西海岸側にCloudFormationを使って即座に復旧する、というものでした。

RPOは0に、RTOは7分未満というデモでしたが、CloudFormationを適用する部分がマニュアルだったため、自動化すればRTOは限りなく0に近づくとかなんとか。自動化するためにはCodePipelineを使うといいよ、と最後説明していましたが、個人的にはそちらの方をメインで見たかったかな。

ちなみに今回の例ではセッションの保持は特に気にしていなかった様子。セッション保持したかったらどうするのか聞いて見ましたが、よくあるセッション保持系の回答が返って来ました。

# DCS203 - Building and Growing a Successful AWS User Group
とりあえず吉田さんかっこよかった。AWSユーザグループの運用を成功させている各地域のユーザグループ代表者のパネルディスカッション。

日本ではAWSのユーザグループをCLI支部とかIoT支部、初心者支部みたいに分けていましたが、その辺って世界的には珍しかったんですね。意外でした。

# FIN304 - Grid Computing for Risk Management on AWS
Financial Serviceでのリスク管理（計算とか）をAWS上で実現したユースケースのお話。正直スケールが大きくて面白いは面白かったですが、発表者（２人）の英語が早い or 独特の発音であんまり聞き取れなかった感が強いです。これは後で動画＆スライドを見たいと思いました。

＃ どこまで続けられるか
なるべく次の日にはUpできるように頑張ろう。。
Swift3 AVCapturePhotoOutputについて

Swift初心者です。
初投稿ですので、上手い投稿方法が解らないですがよろしくお願いします！

問題点は、写真を撮るためのfuncを作成しているのですが、Swift3での記述の仕方がわかりません。。。

// AVCaptureStillImageOutput! → AVCapturePhotoOutput!にSwift3で変更
var stillImageOutput: AVCapturePhotoOutput!


func didTakePhoto() {
    
        if let videoConnection = stillImageOutput.connection(withMediaType: AVMediaTypeVideo) {
            videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait
            stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { (buffer, error) in
                if error == nil && buffer != nil {
                    let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer)
                    let image = UIImage(data: imageData)
                    
                    self.imageView.image = image
                    self.isShowingPhoto = true
                    self.captureSession.stopRunning()
                }
            })

        }
    }
ここのcaptureStillImageAsynchronouslyFromConnectionが
/*
『Value of type 'AVCapturePhotoOutput' has no member'captureStillImageAsynchronouslyFromConnection'』
*/
とエラーになりまして、調べているとSwift3ではAVCapturePhotoOutputのメソッドにはないと言うことが理解できました。
改変の記述方法はどのようにすれば良いでしょうか？？
複数のバージョンのAnsibleを同居させる

# 背景
既存のコードは2.0で書いててバージョンを上げて動かなくなるのは困るのでそのまま使いたいでも、新しく書くコードは新しいオプションを使いたいので2.2を使いたい

# TL;DR
pipでansibleを入れてvirtualenvで切り替えればOK

# 具体的な例
pythonはxbuildかなにかで`/usr/local/python-X.X.X`にインストールしているものとする

### ansible 2.0 のインストール
```bash
$ virtualenv -p /usr/local/python-2.7.11/bin/python ansible-2.0
$ source ansible-2.0/bin/activate
(ansible-2.0) $ pip install 'ansible==2.0.0'
```

### ansible 2.2 のインストール
```bash
$ virtualenv -p /usr/local/python-2.7.11/bin/python ansible-2.2
$ source ansible-2.2/bin/activate
(ansible-2.2) $ pip install ansible
```

### ansible 2.0 を使うとき
```bash
$ source ansible-2.0/bin/activate
(ansible-2.0) $ ansible-playbook -i hosts site.yml
```

### ansible 2.2 を使うとき
```bash
$ source ansible-2.2/bin/activate
(ansible-2.2) $ ansible-playbook -i hosts site.yml
```
Herokuで1分に1回PHPを実行する

お疲れ様です。
GMOリサーチの石黒です。

先日の記事（[CakePHP3縛りのハッカソンで新着ツイート通知バッチ作ってみた](http://qiita.com/ishizuki/items/2a58c60fd17d043704b9)）
にて、Herokuで1分に1回PHPを実行して、新着ツイートの監視をしてみました。
その詳細な方法について、ご紹介します。

#0. ご注意
Herokuの無料枠には実行時間の制限があり、全アプリで1,000時間/月と決まっています。
そのため、できるだけ実行時間を節約したいというところから、シェルスクリプトをcronで実行してみてはどうかと考えました
が、
実際にはシェルスクリプトの実行時間もそこに含まれますので、
**これを実践すると一つのアプリが24時間稼動しっぱなしの状態になるようです**ので
お気をつけください。
結局、24時間稼働して良いなら、デーモンにしてしまった方が良いと思いましたが、コケた時の対応などのノウハウが無いため、短い間隔でのcron実行が手軽で保守性があるかなと思います。

#1. Heroku Schedulerで10分に1回シェルスクリプトを実行する

Heroku上ではcronを動かすことができません。
その代わりにHeroku Schedulerを使うのですが、
これには設定が10分、1時間、1日の3段階しかありません。
そのため、とりあえず一番間隔の短い10分で実行してもらうことにします。

設定画面はこんな感じ
![image](https://qiita-image-store.s3.amazonaws.com/0/103853/efa45118-e0cf-087e-2c27-acac5e8953ef.png)

これで、10分に1回は実行してもらうことができました。
（ただし、ベストエフォートのため、実行されない時があると、どこかに書いてあった覚えがあります）

#2. シェルスクリプトから1分に1回PHPを実行する

さて、10分に1回シェルスクリプトが実行できるようになったので、
あとはそのシェルスクリプトから1分に1回、計10回PHPを実行するようにすれば、
目的が達成できます。

ソースはこんな感じで書きました。

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

if [ $# -lt 2 ]; then
    echo "usage: tweets_notifier_resident.sh LOOP_COUNT SLEEP_SECONDS [SHELL_OPTION]"
    exit 1
fi

LOOP=$1 # 実行回数
SLEEP=$2 # sleep秒数
shift 2 # 残りの引数を渡すため、引数をシフト

for i in `seq 1 1 $LOOP`
do
  bin/cake tweets_notifier $*

  if [ $i -lt $LOOP ]; then
      sleep $SLEEP
  fi
done
```

第一引数が実行回数、第二引数がsleep秒数です。

つまり、1分に1回、計10回実行するには、

```bash
/bin/bash sh/tweets_notifier_resident.sh 10 60
```

とします！
Instabugをベータ版アプリに組み込むとすごく便利

## やったこと

①app.gradleにゴニョゴニョかいた（アプリをMulti-Dex対応しないといけなくてちょっとだけハマった）

②Applicationクラスにちょっと追記した

```
    new Instabug.Builder(this, getString(R.string.instabug_api_key))
        .setInvocationEvent(InstabugInvocationEvent.FLOATING_BUTTON)
        .build();
```

③ベースのActivityにちょっと追記した

```
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    InstabugTrackingDelegate.notifyActivityGotTouchEvent(ev, this);
    return super.dispatchTouchEvent(ev);
  }
```

というだけ。

## Instabugすごい！

### 恐ろしくリッチなバグ報告画面

たった３ステップで、アプリの画面に吹き出しボタンが出るようになって、

![Bitmap.png](https://crowdworks.qiita.com/files/84cbd653-ab78-f3b4-c624-b603cb3c5ca4.png)

おそろしいくらいにリッチなバグ報告機能がつく！

![image](https://crowdworks.qiita.com/files/22169e12-7df1-8de6-3096-2974820ac870.png)

報告されたバグや要望は、リアルタイムにWebのコンソールに上がってきて、かなり事細かに情報が見れる。

まだ試してないけど、SlackとかGitHub issueとかにも連携できるのかな？そこは今後試してみる。

### なんとチャット機能までついている

![image](https://qiita-image-store.s3.amazonaws.com/0/74571/dceb4cd2-279a-ae99-73dc-80612e4d3350.png)

こんな感じで、バグ報告をしてくれたユーザにチャットでコミュニケーションをとることができる！

![Bitmap.png](https://qiita-image-store.s3.amazonaws.com/0/74571/26fdbb4e-8a2b-8bff-7c3e-ea63aa148ec5.png)

ぶっちゃけ、[今作ってるアプリ](https://github.com/RocketChat/Rocket.Chat.Android)のチャット機能よりもリッチじゃねーか！！ｗｗｗ


## まとめ

**感動した！**

ベータ版なアプリ作ってる人は、Multi-Dexの犠牲を払ってでも、ぜひ使うといいと思った。


　
　
## 追伸

2週間のおためし期間が過ぎると、そこそこな課金（$149/月）をしないと、バグレポート機能以外は利用できないらしい。

チャットとかは、ユーザからは話しかけることができるのに管理画面では見れない状態になるので、フリープランに移行したあとは

```
    new Instabug.Builder(this, getString(R.string.instabug_api_key))
        .setInvocationEvent(InstabugInvocationEvent.FLOATING_BUTTON)
        .setInAppMessagingState(Feature.State.DISABLED) //★
        .build();
```

のようにしておくのがよさげ。
libGDXの基礎１９ CIMを使ってテクスチャロードを高速化する

今までは画像はpng等を利用していましたが、今回はCIMを使ってテクスチャのロード時間を短縮します。

#CIMとは

CIMとはいわばPixmapをシリアライズしたフォーマットです。PixmapはTextureへ転送するフォーマットそのもののため、変換が入るPNGやJPEGと比べて高速にロード可能です。

ヘッダは12バイト。幅と高さとピクセルフォーマットが4バイトずつというシンプルなものです。ピクセルデータはそのままのべたフォーマットです。スマホでよく使うRGBA4444フォーマットなどは特に顕著で、PNGを利用するよりもロード時間が大幅に早く、具体的に半分近くになります。スペックの低いマシンではファイル数が大きいとかなりの差になります。

ただし、べただとファイルサイズが大きくなりすぎるのでzlib圧縮されています。

#CIMのつくり方

シンプルなので自分で作ってもよいですが、ここは用意されたクラスを使いましょう。

```java
PixmapIO.writeCIM(FileHandle file, Pixmap pixmap)
```

という手軽につかえるstaticメソッドが用意されています。

#CIMを使う

使い方は今までと変わりません。今までテクスチャのpngやjpegをロードしていた画像名にcimのファイルをロードするだけです。

```java
Texture tex = new Texture("hoge.cim");
```

ロード部分のlibGDXのソースは以下のようになっています。

```java
public static TextureData loadFromFile (FileHandle file, Format format, boolean useMipMaps) {
	if (file == null) return null;
	if (file.name().endsWith(".cim")) return new FileTextureData(file, PixmapIO.readCIM(file), format, useMipMaps);
	if (file.name().endsWith(".etc1")) return new ETC1TextureData(file, useMipMaps);
	if (file.name().endsWith(".ktx") || file.name().endsWith(".zktx")) return new KTXTextureData(file, useMipMaps);
	return new FileTextureData(file, new Pixmap(file), format, useMipMaps);
}
```

はい、cimならそのまま使えますね。ktxやetc1も使えるのがわかります。拡張子で判別しているのでそこだけ気を付けてください。

zktxはgzip圧縮したktxです。ktxを使う場合はこちらを使うのが良いでしょう。etc2は再圧縮でそれなりにサイズが縮むことも多いです。
迷走中のToDoのエンジン

1.Chatwork 更新、削除のAPIは存在しない。
2.Evernote C#用のサンプルが古くて動作しない。
3.trac 自前でサーバーを用意する必要がある。
4.GoogleカレンダーのToDo そもそもソートできない…。GmailのToDoリストは非常にシンプルで、Outlookで個別のタスクに設定できる「優先度」のような項目はない。タスクを選択した状態で[Ctrl]+[↑][↓]キーを押せば、優先度の高いものから順に並べ替えることは可能。[Tab]キーを押すとタスクをインデント(字下げ)でき、サブタスク風に表示できる。[Shift]+[Tab]キーを押すとメインタスクに戻せる。
5.Todoist 有料版は階層化可能。有料版は優先度設定可能。有料版は日付設定可能。ということは無料版ではほとんどなにもできない。APIもない。それはないわ。いやあるにはある。https://todoist.com/API/v7/sync

Slack
Todo.ly APIあり。レスポンスはxml, json。get, create, update, deleteあり。日本語も使えるっぽい。UWPアプリはなし。
Wunderlist WindowsPhone用アプリあり。日本語可能。APIはある。create update, delete, get。日本語も使える。開発のサポートはすべて英語。C#のコードはなし。OAuth。
https://developer.wunderlist.com/documentation/endpoints/task
https://github.com/wunderlist/api

Trello Windows8用はある。GUI操作なのでめんどうそう。デザインを好きになれない。日本語対応。APIあり。そうか、board-card-checklistと階層があり、理解しにくい。これはないな。
Toodledo サブタスクは有料。英語のみ。APIあり。get, create, update, deleteあり。http://api.toodledo.com/3/tasks/index.php#retrieving
Any.do	英語。API不明。
Remember The Milk うし…。APIあり。
Nozbe
Clear
Producteev
TickTick
ToDous
javaでアルゴリズム

Javaを利用したソートアルゴリズムについて今回は書いてみます。

備忘録として残す程度にします。

まず、バブルソート。

一般的に使われる頻度が高そうなアルゴリズム。大小を比較して順番を入れ替えていくものです。

```java:bubble_Sort
	static void bubble_Sort(int []data)
	{
		for(int s = data.length - 1; s > 0; --s)
		{
			for(int t = 0; t < s; ++t)
			{
				if(data[t] > data[t + 1])
				{
					int temp = data[t];
					data[t] = data[t + 1];
					data[t + 1] = temp;
				}
			}
		}
	}
```


次にクイックソート。
データの集合を基準値より大きいものと小さいものに振り分け、また振り分けたグループから新しい基準値を利用して同様の事を再帰的に繰り返すアルゴリズムです。

並び替えのアルゴリズムではもっとも早く終わります。

```java:quick_Sort
    static void quick_Sort(int []data, int left, int right){

        if (left >= right) {
            return;
        }

        int p = data[(left + right)/2];
        int l = left;
        int r = right;
        int temp;

        while(l <= r) {

            while(data[l] < p) { ++l; }
            while(data[r] > p) { --r; }

            if (l <= r) {
                temp = data[l];
                data[l] = data[r];
                data[r] = temp;
                ++l;
                --r;
            }
        }

        quick_Sort(data, left, r);  // ピボットより左側をクイックソート
        quick_Sort(data, l, right); // ピボットより右側をクイックソート

	}

```

ちなみにバブルソートが~~15秒弱~~でクイックソートが0.2秒とかそこら辺でした。




クイックソート早い・・・。

[追記]
コメントでご指摘をいただき、修正しました。

修正後確認したらバブルソートは40秒でした。

これでバブルソートクイックソート共に正常に動きます。

ご迷惑をお掛けしました
PHPでエラー表示

PHPを書いていると「なぜか画面に表示されない問題」が良くあると思います！！

```:php
<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
```

これを記述するだけでエラー画面が表示されるようになります！！

便利ですね！！
IntelliJ,RubyMine + VagrantでRailsのコード補完・メソッドジャンプを使う方法


IntelliJとRubyMineでRailsの開発をしているとRailsや使っているgemの実装を確認したくなります。どんな引数でどんな挙動するの？と。というか確認しながらじゃないと詰まることが多いので確認したいです。ただ、Vagrant環境で開発をしているとそのままではコード補完もメソッドジャンプもできません。

というわけで、肝心のgemソースがVagrantの仮想環境内にある場合にどうやったらできるのかを備忘録として残しておきます。

## Step1 リモートデプロイ先の登録

IntelliJの環境設定（`Cmd + ,`）から `Deployment` メニューを開きます。＋ボタンを押してリモートサーバを追加します。SFTPで追加してあげます。VagrantであればSFTPのID/PWは `vagrant` だと思います。

![step1.png](https://qiita-image-store.s3.amazonaws.com/0/2152/5c287a31-eff4-dd33-c57f-e0e816001a37.png "step1.png")

## Step2 RubySDKの追加

プロジェクトの環境設定（`Cmd + ;`）から `Project` メニューを開きます。Newボタンを押下してRubySDKを選択、New remoteを選択します。

![step2-1.png](https://qiita-image-store.s3.amazonaws.com/0/2152/6de4a78a-5966-8bcd-1efa-765bdfeaf8d1.png "step2-1.png")

![step2-2.png](https://qiita-image-store.s3.amazonaws.com/0/2152/b5f6fd7a-2b0d-0143-ac7e-df37705c5b69.png "step2-2.png")

ここがポイントです。Deployment Configurationは先程登録したリモートサーバを選択します。Ruby interpreter pathはVagrant内のRubyバイナリパスです。画像の例だとrbenvでユーザディレクトリにインストールした2.1.2を指定しています。

- `/home/vagrant/.rbenv/versions/2.1.2/bin/ruby`

これは人によって違うので適宜変更をしてください。

![step2-3.png](https://qiita-image-store.s3.amazonaws.com/0/2152/6afeabf0-f22b-ed86-e340-6eb7c584d02c.png "step2-3.png")

また環境によっては `Create` か `Move` どちらか選べと迫られますが、ここは冷静に `Move` を選びましょう。これで、Vagrant内にあるgemたちのソースがホスト側（Mac）にコピーされ、IntelliJから直接参照することができるようになりました。簡単ですね😆
Payaraで開発中にアプリを再デプロイしたときにセッションを維持させる

たぶん GlassFish も同じ。

普通に再デプロイしたらセッションは破棄されるので、 `@SessionScoped` なインスタンスも破棄される。
開発中は頻繁に再デプロイするので、毎回破棄されると色々面倒。

Eclispe や NetBeans のプラグイン経由でデプロイしている場合は、この辺は勝手にやってくれてるっぽい。

## Payara
4.1.1.163

## コマンドラインで再デプロイ
```
> asadmin redeploy --name <アプリ名> --keepstate=true <デプロイするwarのパス>
```

`--keepstate` オプションに `true` を指定する

ヘルプ（`asadmin redeploy --help`）によると、利用できる条件がいくつかあるっぽい。

> This option is supported only on the default server instance, named server. It is not supported and ignored for any other target.
> 
> （訳）
> このオプションは、デフォルトの `server` と名付けられたサーバーインスタンスでのみサポートされます。他のターゲットでは、無視されサポートされません

あくまで開発時用の便利機能的な感じか。

## 管理コンソールから再デプロイ
- メニューの [Applications] を選択
- 再デプロイしたいアプリの [Action] -> [Redeploy] を選択（一番右の方）
- [Keep State] のチェックを ON にして再デプロイする

![payara.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/9d3fd88b-0278-8b15-298a-944e28f86b64.jpeg)

## Gradle から再デプロイ
自分は次のようなタスクを定義して、 Gradle 経由で再デプロイしてる。

```groovy:build.gradle
task deploy(type: Exec, dependsOn: war) {
    def payaraHome = System.env.PAYARA_HOME
    def asadmin = /$payaraHome\bin\asadmin.bat/

    commandLine('cmd', '/C', asadmin, 'redeploy', '--name', war.baseName, '--keepstate=true', war.archivePath)
}
```

※環境変数 `PAYARA_HOME` に開発中の Payara のインストールディレクトリを設定している。
※Windows の場合です

## 参考
- [Adding Some Agility to Java EE Application Deployment with GlassFish](http://www.oracle.com/technetwork/articles/java/pongegf-1517943.html)
Swiftでplistへアクセスする便利クラスを作った。

ジェネリクスが便利だなーと思ってplistへアクセスするクラスを作った。

```swift
class Plist {
    
    private var plist:NSMutableDictionary
    
    init(name:String) {
        let filePath = Bundle.main.path(forResource: name, ofType: nil)!
        let plist = NSMutableDictionary(contentsOfFile: filePath)!
        self.plist = plist
    }
    
    // データを取得します。
    func get<T>(_ key:String) -> T {
        return processing(self.plist.value(forKeyPath: key)) as! T
    }
    
    // get?としたかった。
    func want<T>(_ key:String) -> T? {
        return processing(self.plist.value(forKeyPath: key)) as? T
    }
    
    // 共通加工処理
    private func processing<T>(_ value:T?) -> T? {
        // 例) 改行コードが入っている場合は改行する。
        if let str = value as? String {
            return str.replacingOccurrences(of: "¥n", with: "\n") as? T
        }
        return value
    }
}
```

使い方。

```hoge.plist
Root
  Foo:String = "Test"
```

```swift
let plist = Plist(name: "hoge.plst")
let str:String = plist.get("Foo") # 左辺でStringを期待して待つ。
# str = "Test"
```

複雑なのも取得可能

```hoge.plist
Root
  Foo:Dictionary
    List:Array
      item0:String = "Test1"
      item1:String = "Test2"
      item2:String = "Test3"
```

```swift
let plist = Plist(name: "hoge.plst")
let list:[String] = plist.get("Foo.List")
for str in list {
    print("str")
}
```

## 最後に
`Swift`には`Yaml`が無くて不便だなーと思って`Plist`を敬遠してたんだけど、使ってみると結構便利だった。
ただ、改行コードを入れるためには小細工（コピペや直編集）をしないと使えないところは少し微妙。

こういう型が分からない時のジェネリクスは便利だな。
`alamofire`でHTTPリクエストしている時にも思ったけれど。
Swift API Design Guidelines を適用したときの定数の定義

GitHubに置いている[MTCCore](https://github.com/akirark/MTCCore "MTCCore")のSwift 3対応を行い、更にSwift API Design Guidelinesを適用したコードに書き換え作業中に、定数の定義について迷ったことです。

## 元のコード

元のコードは次のような形で定数を定義しています。

```swift
public enum LineBreakType {
    case Unknown
    case LF
    case CR
    case CRLF
    case LS
}

let kLineBreakCharacterCR: Character = "\r"
let kLineBreakCharacterLF: Character = "\n"
let kLineBreakCharacterCRLF: Character = "\r\n"
let kLineBreakCharacterLS: Character = "\u{2028}"
```

## Swift API Design Guidelinesの定数の命名について

Swift API Design Guidelinesで該当する部分は次の記述かなと思います。

> The names of other types, properties, variables, and constants should read as nouns.

> Follow case conventions. Names of types and protocols are UpperCamelCase. Everything else is lowerCamelCase.

これに従うと、定数は名詞を使うことと小文字で始めれば良いということですね。

## NG案

こんな感じにしてみました。

```swift
public enum LineBreakType {
    case unknown
    case lf
    case cr
    case crlf
    case ls
}

fileprivate struct LineBreakCharacter {
    static let cr = Character("\r")
    static let lf = Character("\n")
    static let crlf = Character("\r\n")
    static let ls = Character("\u{2028}")
}
```

何となく、Swiftらしくない感じがします。

## 改善案

上記の2つの定数は、LineBreakというクラスのメソッドが使用します。また、LineBreakTypeが名前空間のトップにいる必要も無いことに気が付きました。また、LineBreakCharacterはプライベートな定数をまとめているだけなので、適切では無い感じがします。LineBreakからしか使われないので、LineBreak内のプライベート定数にする方が適切です。これを踏まえて、次のように変更しました。

```swift
public final class LineBreak {

    /// Line break types
    public enum BreakType {
        case unknown
        case lf
        case cr
        case crlf
        case ls
    }

    private static let characterCR = Character("\r")
    private static let characterLF = Character("\n")
    private static let characterCRLF = Character("\r\n")
    private static let characterLS = Character("\u{2028}")
    
    public init() {
        
    }
}
```

本当は、BreakTypeではなく、シンプルにTypeにしたかったのですが、Typeは定義済みで使用できなかったので、BreakTypeにしました。

何となく、Swiftらしい定義になったような気がします。もっと相応しい記述方法に出会うまでは、これで行こうと思います。
ソフトウェアの不具合修正の手順

原因が分からない不具合の修正手順です。
基本的な事しか書いてません。
僕は基本的なことだと思っていたのですが、意外と手順が守られていない場合があるので記しておこうと思います。
（CI環境があるとか、テストコード資産があってデグレ確認が簡単に出来る場合は少し違うかもしれません）


# 1.不具合を再現させる

まず、不具合を再現させることが出来る環境を構築するのが最優先です。
インシデントレポートや伝聞はあまり信じないで、不具合が再現出来る環境を構築して、自分の目で不具合を確認しましょう。
最初に、不具合の場所の特定や検討をすることは検討違いなことをしていて時間を無駄にすることが多いと思います。
そもそも不具合が再現しないということもありますし、不具合の再現環境を構築しないで不具合の修正内容を検討しても、修正内容が正しいのかの検討が出来ないです。

# 2.不具合の再現性の向上施策を検討する

次にやることは不具合の再現性を高めることです。
１００％不具合が発生出来るようになっていることがベストですが、１００％とは行かなくてもどうしたら発生確率を高く出来るかを考えます。
また、再現させるまでの手順を短くして簡単に不具合が出せるようにするとか、影響してる要因を一つずつ取り除いていくなどの作業もあります。
不具合を発生させることが出来る最低限のソースコードや、環境を見つけられればベストです。

# 3.不具合の対策の検討

ここで初めて対策方法の検討に入ります。
2を終えている段階で大体の修正方針は見えているかもしれません。
何処を修正すれば不具合が修正出来るのかを検討するのはもちろんですが、その修正の影響範囲を調査して、不具合修正時に何をテストする必要があるのかを検討することも含まれます。
また、不具合の情報を出力する機能を実装することも有効です。これで不具合が出ている間は不具合であるという状態が明確になり、不具合を修正した後では不具合が修正されたことが明確になります。こうすることで、不具合が再度発生した場合は、そのルートで不具合になっていることを明確にすることが出来ます。（7of9さん指摘）

# 4.不具合対策の確認

3で作り込んだプログラムの動作を確認して修正されていることを確認します。
確認作業は、単体テスト、結合テスト、システムテスト等のテストレベル別に確認作業が行えるとベストです。

# (5.リファクタリング)

不具合の対策後は、ツギハギのようなプログラムになっていることがあります。
そのため、不具合の対策後にリファクタリングを行い、ソースコードをクリーンな状態に保つことは大切です。
なお、リファクタリングを行った後は、デグレードが発生していないことの確認テストは再度行う必要があります。

不具合が発生したソースコードの元の状態がひどすぎる場合は、3の前にソースコード理解も含めてリファクタリングを行うのも良いかもしれません。ただ、その時はリファクタリングを行い、デグレードが発生していないことを確認してから3の不具合対策の検討に入ります。
確認作業を2回することになりますが、リファクタリングと、不具合対策の修正は分けて作業を行う必要があります。一度にテストすると、テストがNGだった場合に、何が原因でテストがNGになったのかが分かりにくくなる場合があります。




# 最後に

ただ、1の不具合を再現させることが最優先だよってことが言いたかっただけです。
ただ殴り書きしただけなので、意見、反論あったらコメントください。
マウスのポインタの移動速度を向上させる方法

## 目的
マウス操作が遅いとイライラする
→　マウスポインタの速度を上げたい

## 実行したこと
- マウスのプロパティを操作する
- マウスのレジストリ値を操作する

## 1. マウスのプロパティを操作する

| OS              | 表示順序 |
|:--              |:-------------------------------------------------------------------------------|
|Windows XP       | スタートボタン _ コントロールパネル _ プリンタとその他のハードウェア _ マウス  |
| Windoww 7       | スタートボタン _ コントロールパネル _  ハードウェアとサウンド _ マウス  |
| Windows 8 / 8.1 | スタートボタン(右クリック) _ コントロールパネル _ ハードウェアとサウンド_ デバイスとプリンタ[マウス] |
|Windows 10       |スタートボタン _ 設定 _ デバイス _ 左メニュー[マウスとタッチパッド] _ その他[マウスオプション]|


こんな感じの画面になるかと思います。
![マウスプロパティ1.png](https://qiita-image-store.s3.amazonaws.com/0/127045/d0f9770f-c670-0bef-6e79-717d5e371154.png)

![マウスプロパティ1.png](https://qiita-image-store.s3.amazonaws.com/0/127045/33095d4c-3ef0-f8a8-b4f1-019912b39be9.png)

![マウスプロパティ1.png](https://qiita-image-store.s3.amazonaws.com/0/127045/d8bde88b-ea02-8679-a306-450f41f3a365.png)

![マウスプロパティ1.png](https://qiita-image-store.s3.amazonaws.com/0/127045/a56b5818-6495-a7fd-cdc6-3ac59935181f.png)

この[ポインタの速度を選択する]で最高速にすると、ちょっと気持ちマウスの動きが速くなったかのように感じますね。

ですがこれでもやや物足りない、という人もおられるかもしれません。そういう人のためにもう少し踏み込んだ話を説明いたしましょう。

## 2. マウスのレジストリ値を操作する
####**※※注意※※**
**！レジストリの操作は絶対に復元データを取ってから実行してください！**
**（復元を取らなかった場合の事故については、責任は取りかねます）**

![image](https://qiita-image-store.s3.amazonaws.com/0/127045/6daa5f23-d975-a7aa-5cf1-5e7f6af53318.png)
ここにregeditと打ち込んでください。regedit.exeを開くとレジストリエディタに移ります。

![マウスプロパティ1.png](https://qiita-image-store.s3.amazonaws.com/0/127045/683fbab3-44f0-c9cf-8948-551fcb7af8f2.png)

このレジストリエディタのMouseのところに、

- MouseSpeed (0から2まで)
- MouseThreshold1 (0から6ピクセルまで)
- MouseThreshold2 (0から10ピクセルまで)

というのがあります。このMouseSpeedの値を2にしてみたら、何となく速くなった気分になります。
この値を好きなように弄ってみてください。
一応意味は以下のようになります。

- MouseSpeed (0:等倍速、1:2倍速、2:4倍速)
- MouseThreshold1 (この閾値を超える移動を検出したとき、2倍速でポインタが動く)
- MouseThreshold2 (この閾値を超える移動を検出したとき、4倍速でポインタが動く)

## まとめ
- マウスの速度が遅い
- マウスのプロパティを操作した
- マウスのレジストリ値を操作した
初心者のEJDBメモ①：概要編

# 概要
初心者がEJDBを簡単にまとめます。
概要の理解を最優先とするため、厳密な表記は省きます。

# EJDBとは
* 軽量なNoSQLデータベースエンジン
* jsonドキュメントを扱うスキーマレスなDB
* DBのプロセスは持たずにライブラリ経由でローカルファイルを操作
* いわばsqlite的なmongodb

# 対応言語
nodejsの他、C/C++/Java/.Net/python等、多くの言語に対応。

# 使い方
nodejsでのサンプル。
一般的な環境設定は済んでいる想定。

* EJDBパッケージのインストール

```
% npm install --save ejdb
```

* アプリケーションの実装

```
// ライブラリの導入
var EJDB = require("ejdb");

// DBファイルのopen
var jb = EJDB.open("データベース名");

// DBからの検索
jb.find("コレクション名", {"検索項目","検索条件値"});
```
プログラミングにおけるアキュムレータとは何か？

[プログラミングElixir](http://shop.ohmsha.co.jp/shopdetail/000000004675/)を読んでいて、問題中に「アキュムレータ」という単語が出てきて意味がわからなかったので調べました。

## その問題

以下がその問題です。

> 先ほど定義した`sum`関数では、その時々の合計を第二引数として引き回すようにした。これで、値を作るために、どのようにアキュムレータを使うか、分かりやすく見せることができた。ちなみに、`sum`関数は、アキュームレータを使わずに書くこともできる。できるかな?やってみよう。


先ほど定義した`sum`関数というのは、以下の関数です。

```elixir:MyList.exs
defmodule MyList do
  def sum([], total), do: total
  def sum([ head | tail ], total), do: sum(tail, head+total)
end
```

## アキュムレータとは何か？

アキュムレータは「状態を保持するために追加された引数」のことを言うそうです。今回は`total`に値を入れています。

```elixir
1..10 |> Enum.to_list |> MyList.sum(0) # 55
```

`total`の値は0から始まって、順番に1、2、3...を足していっています。何をやっているかは分かるのですが、なんとなく`total`はいらないような気がします。

### アキュムレータを使わないで実装する

実際、`sum`関数はアキュムレータなしで実装できます。

```elixir:MyList.exs
defmodule MyList do
  def sum([]), do: 0
  def sum([ head | tail ]), do: head + sum(tail)
end
```

```elixir
1..10 |> Enum.to_list |> MyList.sum # 55
```

すっきりしましたね！アキュムレータは便利そうですが、実装時には本当にいるかどうかよく考える必要がありそうです。
カラーコードから色を生成するExtension (RGB & HEX)

I'm sure that a lot of people already noted about this topic, but just let me note in Qiita lol

#Purpose
Personal Note

#Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 3.0

#Source Code
```swift:UIColor+Extension.swift
import UIKit

extension UIColor{
    /* HEX */
    func hex ( value : String, alpha : CGFloat) -> UIColor {
        var value = value
        let alpha = alpha
        var color: UInt32 = 0
        value = (value.replacingOccurrences(of: "#", with: ""))
        let scanner = Scanner(string: value)
        if scanner.scanHexInt32(&color) {
            let r = CGFloat((color & 0xFF0000) >> 16) / 255.0
            let g = CGFloat((color & 0x00FF00) >> 8) / 255.0
            let b = CGFloat(color & 0x0000FF) / 255.0
            return UIColor(red: r, green: g, blue: b, alpha: alpha)
        } else {
            print("Error. Not Found Colour.")
            return UIColor.black
        }
    }
    func yourFavoriteColorFromHex() -> UIColor{
        return self.hex(value: "1e90ff", alpha: 1.0)
    }
    
    /* RGB */
    func getColorFromRGB(value: UInt, alpha: CGFloat) -> UIColor {
        return UIColor(
            red: CGFloat((value & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((value & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(value & 0x0000FF) / 255.0,
            alpha: CGFloat(alpha)
        )
    }
    
    func yourFavoriteColorFromRGB() -> UIColor{
        return self.getColorFromRGB(value: 0x9900FF, alpha: 1.0)
    }
}
```

#How to use
```swift
label.textColor = UIColor().yourFavoriteColorFromHex()
label.backgroundColor = UIColor().yourFavoriteColorFromRGB()
```


#Resource
RGB Color Code: http://www.nthelp.com/colorcodes.htm
Hex Color Code: http://www.color-hex.com/