OmniAICreator/Qiita-1.07M huggingface dataset:
極力yumでCentOS6でImageMagickの脆弱性対応

必要であればリポジトリ追加
`rpm -ivh epel-release-6-8.noarch.rpm
rpm -ivh remi-release-6.rpm`

まず削除する
`yum remove -y ImageMagick`
必要な物を入れる
`yum install -y http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm
yum install -y --enablerepo=epel yum install libwebp`
新しいImageMagickを入れる
`yum install -y --enablerepo=remi ImageMagick-last`
テストツールを入れる
`cd /usr/local/src/
git clone https://github.com/ImageTragick/PoCs.git
cd PoCs`
テストツール実行
`./test.sh`

UNSAFEが無ければOK。
UNSAFEあったら
`vi /etc/ImageMagick-last/ImageMagick-6/policy.xml`
下記を追加
`<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="URL" />
<policy domain="coder" rights="none" pattern="HTTPS" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="MSL" />
<policy domain="coder" rights="none" pattern="TEXT" />
<policy domain="coder" rights="none" pattern="SHOW" />
<policy domain="coder" rights="none" pattern="WIN" />
<policy domain="coder" rights="none" pattern="PLT" />`
Firebaseのpod 'Firebase'について

#pod 'Firebaseとpod 'Firebase/Core'は同じ？
pod 'Firebase'は↓
<img width="351" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/66763/0d24b57d-f514-6de1-f4d5-e48f362408d8.png">

pod 'Firebase/Core'と同じみたいですね↓
<img width="399" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/66763/8c5c6fd2-3a14-8869-6f26-72602dddca42.png">

どちらともFirebase Analyticsだけ使えるみたいです

pod 'Firebase/AdMob'
pod 'Firebase/Messaging'
pod 'Firebase/Database'
など使いたい機能をpodfileに書いてpod installしましょう


一覧
<img width="695" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/66763/3fc76a62-ebba-4ab8-cdd5-c7bacc3c094e.png">


１年位前にfirebaseを使った記事だとpod 'Firebase'で他のも入っている感じなので
注意が必要かもです
how does pry know where to look in to c code?

How does Pry know where to look in the C source? MRI maps Ruby method names to C function definitions, using rb_define_method. For instance, Class#new is bound to a C function named rb_class_new_instance, thanks to the instruction rb_define_method(rb_cClass, "new", rb_class_new_instance, -1). Calling #new in Ruby basically proxies to rb_class_new_instance in MRI.
SVGで描くピースマーク

svg入門でピースマーク書いてみた。

![スクリーンショット 2016-05-27 12.41.49.png](https://qiita-image-store.s3.amazonaws.com/0/76843/b87c964e-c10a-2606-e25e-e0fbff713374.png)


M
初期位置,位置のスキップ
L
直線を引く
H
水平線を引く
V
垂直線を引く

```html:hoge
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

<svg id="canvas" viewBox="0 0 200 200">
	<!-- 円 -->
    <circle cx="100" cy="100" r="80" stroke="yellow" stroke-width="3" fill="none"/>

	<!-- 垂直線 -->
    <path d="M 100 20 v 160" stroke="yellow" stroke-width="3"/>

    <!-- 斜め線-->
    <path d="M 100 100 L 38 150" stroke="yellow" stroke-width="3"/>
    <path d="M 100 100 L 162 150" stroke="yellow" stroke-width="3"/>
</svg> 

	<style type="text/css">
	#canvas{
		width: 500px;
		height: 500px;
	}
	</style>
</body>
</html>
```
VHDL > Link > DATA:= (others => '0') > すべてのビットに0を入れる

読んでいるVHDLの本で分からなかった文法。

以下で説明を見つけた。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1469101949

> DATAの幅に関わらずすべてのビットに０を入れるということです。
【覚書き】jQueryでアクセス元のデバイスをさくっと判定する

##コード

```jQuery:jQuery
$(function(){
        var windowNav = window.navigator;
        var thisUserAgent = windowNav.userAgent.toString();
        alert(thisUserAgent);
        var iPhoneDecision = thisUserAgent.indexOf("iPhone");
        var AndroidDecision = thisUserAgent.indexOf("Android");
        var WindowsDecision = thisUserAgent.indexOf("Windows");

        if(iPhoneDecision != -1){
            alert("あなたのデバイスはアイフォーンなんですね");
        }
        if(AndroidDecision != -1){
            alert("あなたのデバイスはAndroidなんですね");
        }
        if(WindowsDecision != -1){
            alert("あなたのデバイスはWindowsなんですね");
        }
});
```

##説明（覚書き）
**① Navigator オブジェクトを取得する**

```jQuery:jQuery
   var windowNav = window.navigator;
```

**② indexOf(文字列)で文字列を検索する**
string.indexOf(文字列)で、文字列が見つかれば文字列が見つかった位置(1以上の数値)を返し、
文字列が見つからなければ、-1という値を返す。
これを使って、文字列が存在しているかどうかを判定する。

```jQuery:jQuery
　　var iPhoneDecision = thisUserAgent.indexOf("iPhone");
  　if(iPhoneDecision != -1){
            alert("あなたのデバイスはアイフォーンなんですね");
    }
```
VHDL > constantで宣言したstd_logic_vectorのビットを順次取出す

## やろうとしていること

`constant I_DINI: std_logic_vector (7 downto 0) := "11001100";`
のように宣言しているI_DINIのビットをLSBから順次取出す。

I_CNTというカウンタをカウントアップして取り出す位置をずらしていく。


## code

http://www.edaplayground.com/x/4xtd

```design.vhd
library IEEE;
use IEEE.std_logic_1164.all;

entity CLOCK is
port ( CLK : in std_logic;
	   DAT : in std_logic; 
       Q : out std_logic);
end CLOCK;

architecture RTL of CLOCK is
begin
end;
```


```testbench.vhd
library IEEE;
use IEEE.std_logic_1164.all;

entity testbench is
end testbench;

architecture SIM of testbench is
    constant I_DINI: std_logic_vector (7 downto 0) := "11001100";
    signal I_CLK : std_logic := '1';
    signal I_DAT : std_logic := '0';
    signal I_Q : std_logic := '0';
    signal I_CNT : integer range 0 to 7 := 0;
component CLOCK
    port ( CLK: in std_logic;
	   DAT : in std_logic; 
       Q : out std_logic);
end component;

begin
    process begin
        I_CLK <= '1';
        wait for 10 ns;
        I_CLK <= '0';
        wait for 10 ns;
    end process;

	process (I_CLK)
    begin
		if (I_CLK'event and I_CLK = '1') then
          if (I_CNT /= 7) then
            I_CNT <= I_CNT + 1;
          end if;
        end if;
    end process;

    I_DAT <= I_DINI(I_CNT); -- input from constant
	I_Q <= I_DAT;
    
    process 
    begin
        wait for 160 ns;
                
        -- to end the testbench
        assert false
        report "end." severity FAILURE;
    end process;

    U1: CLOCK port map(CLK => I_CLK, DAT => I_DAT, Q => I_Q);
end SIM;
```

`I_DAT <= I_DINI(I_CNT); -- input from constant`
にてI_DATに取出している。

I_Q関連の処理はうまく動いていない。


今後、ズンドコするには前の値を保持しないといけない。
11110 -> キヨシ.
チャタリング対策のコードが参考になる。
use pry read mri c code

To quickly review a method's implementation, you may install the pry and pry-doc gems and use the "show-method" or "show-source" commands. The "show-doc" command is useful as well. To find your way in the Ruby's source code, The Ruby Cross Reference is pretty useful. MRI is hosted on GitHub as well.

```rb
vagrant@precise64:~/data$ pry
[1] pry(main)> show-method Module#include

From: eval.c (C Method):
Owner: Module
Visibility: private
Number of lines: 13

static VALUE
rb_mod_include(int argc, VALUE *argv, VALUE module)
{
    int i;

    for (i = 0; i < argc; i++)
	Check_Type(argv[i], T_MODULE);
    while (argc--) {
	rb_funcall(argv[argc], rb_intern("append_features"), 1, module);
	rb_funcall(argv[argc], rb_intern("included"), 1, module);
    }
    return module;
}
[2] pry(main)> show-method Module#included

From: object.c (C Method):
Owner: Module
Visibility: private
Number of lines: 5

static VALUE
rb_obj_dummy(void)
{
    return Qnil;
}
```
VHDL > デバッグ用文字列の出力 > variable lout : line; | write(lout, string'("testline")); | writeline(output, lout);

参考: VHDLによるFPGA設計 & デバッグ by 松村謙 & 坂巻 佳壽美

http://www.edaplayground.com/x/diW

## 内容
デバッグコンソールに任意の文字列を出力する

使うのは以下の２点。

- write()
- writeline()

上記を使うにはテストベンチでは以下が必要になるようだ。

```
use IEEE.std_logic_textio.all;
library STD;
use STD.textio.all;
```

## code

http://www.edaplayground.com/x/diW

```design.vhd
library IEEE;
use IEEE.std_logic_1164.all;

entity CLOCK is
port ( CLK: in std_logic;
       Q : out std_logic);
end CLOCK;

architecture RTL of CLOCK is
    signal FLIP : std_logic := '0';
begin
  Q <= FLIP;
  process(CLK)
  begin
    if (CLK'event and CLK = '1') then
      if (FLIP = '0') then
        FLIP <= '1';
   	  else
        FLIP <= '0';
      end if;
    end if;
  end process;
end;
```

```testbench.vhd
library IEEE;
use IEEE.std_logic_1164.all;
-- for write(), writeline()
use IEEE.std_logic_textio.all;
library STD;
use STD.textio.all;

entity testbench is
end testbench;

architecture SIM of testbench is
    signal I_CLK : std_logic := '1';
    signal I_Q : std_logic := '0';
component CLOCK
    port ( CLK: in std_logic;
       Q : out std_logic);
end component;

begin
	process begin
        I_CLK <= '1';
        wait for 10 ns;
        I_CLK <= '0';
        wait for 10 ns;
    end process;

    process 
		variable lout : line;
    begin
        wait for 100 ns;

		-- output to debug console
        write(lout, string'("testline"));
        writeline(output, lout);
        
        -- to end the testbench
        assert false
        report "end." severity FAILURE;
    end process;

    U1: CLOCK port map(CLK => I_CLK, Q => I_Q);
end SIM;
```

testlineという文字列を出力する。
line型のloutにwrite()で書き出してから、それをoutputにwriteline()で書く、という流れ。

## 結果

EDA Playgroundでは以下のような出力となった。
`# KERNEL:`の行が対応する出力。

```txt:
# KERNEL: testline
# EXECUTION:: FAILURE: end.
# EXECUTION:: Time: 100 ns,  Iteration: 0,  Instance: /testbench,  Process: line__27.
# KERNEL: Stopped at time 100 ns + 0.
exit
# VSIM: Simulation has finished.
```
VirtualBox環境でのUbuntuのHDD容量変更方法

## 概要
VirtualBox内のUbuntuで環境を整えているうちに、HDD容量が足りなくなって困った方が多いようなので、個人的に一番簡単な変更方法を共有します。
仮想環境が壊れても責任は負えませんので、くれぐれも**自己責任**でおねがいします。
不安であればクローンでも作っておいてください。

+ 環境
 + Windows 10
 + Oracle VM VirtualBox 5.0.20
 + Ununtu 16.04 LTS
 
+ 使用ツール
 + VirtualBoxManager
 + GParted

## 1 VirtualBox側の仮想HDDの容量を大きくする

### 1.1 仮想HDDパス確認
VirtualBoxを起動し、容量を変更したい仮想環境の設定を開きます。
[ストレージ]の[コントローラ:SATA]下にある[場所]がHDDのパスです。
![仮想HDDのパス.PNG](https://qiita-image-store.s3.amazonaws.com/0/127283/bb29e7c8-0285-cbd1-2970-31c24f3c54d1.png)
### 1.2 VirtualBoxのパス確認
VirtualBoxをインストールしたパスを確認します。
デフォルトでは`"C:\Program Files\Oracle\VirtualBox\"`となっています。

### 1.3 コマンドプロンプトからVirtualBoxManagerを起動
コマンドプロンプトで以下のように入力します。

```
"インストールの絶対パス\VBoxManage.exe" modifyhd 仮想HDDの絶対パス --resize 大きさ(MB単位)
```

大きさについてはMB単位で、1GB * 1024 = 1024MB となります。

```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd "C:\Users\katou-ryo\VirtualBox VMs\Ubuntu_test\Ubuntu_test.vdi" --resize  20480
```

この例のように入力した場合、Ubuntu_testのHDD容量が20GBに変更されます。
以上でとりあえず容量は変更できました。  しかし仮想環境内で新しい領域を使う設定が必要です。

## 2 UbuntuでHDDのパーティション操作

### 2.1 GPartedのインストールと起動
仮想OSを起動し、terminalで以下のコマンドを入力します。

```
sudo apt-get update
sudo apt-get install gparted
sudo gparted
```

GPartedがインストールされ、起動します。
### 2.2 パーティション操作
GPartedの画面を見ると、使われていない新しい領域ができているのが確認できると思います。
![GP1.PNG](https://qiita-image-store.s3.amazonaws.com/0/127283/c000902c-7ef2-7d8c-f55a-eb8ff1d1a67a.png)
ここでOSのあるディスク領域を広げるのですが、`/dev/sda2`の下にある`/dev/sda5`という領域が邪魔をして広げることが出来ません。
この領域はいったい何なのかというと、スワップ領域と呼ばれるものです。メモリの補助領域のようなもので、メモリのデータを一時的に保存しておく場所です。 
ですので、操作を間違えると最悪の場合**OSが起動しなくなります**。（私は試したことがないのでどうなるかは知りません。）

まず、`/dev/sda5/`を右クリックし、swapoffを選択します。もう一度右クリックし、Deleteします。

次に、`/deb/sda2`をHDDの一番後ろに移動させます。
`/deb/sda2`を右クリック、Resize/Moveを選択します。動かす前と同じ容量で、HDDの一番右に移します。

`/deb/sda2`直下のUnallocatedに右クリック→Newで新しい領域を作ります。
**ここが重要なのですが、今作った領域のフォーマットをlinux-swapと指定します。**
これを忘れるとスワップ領域が作られません。

![GP2.PNG](https://qiita-image-store.s3.amazonaws.com/0/127283/47e513ce-9969-3402-6ac0-ae61d8678bda.png)

最後に、OSの領域が広げられるようになっているはずなので、Resize/Moveで最大まで広げます。
以下が設定例です。

![GP3.PNG](https://qiita-image-store.s3.amazonaws.com/0/127283/66ee9d57-cd27-d017-58a1-9a8a092117c6.png)


すべて問題なければ、緑のチェックマークをクリックし、操作を確定をします。


![GP4.PNG](https://qiita-image-store.s3.amazonaws.com/0/127283/1e9f3a84-a10f-8645-c083-0e84e8a07a00.png)

`/deb/sda2`の直下に新しく作った領域の名前が`/dev/sda5`となっていれば完了です。
名前が違う場合、スワップ領域が作られていないため、フォーマットをし直してください。

以上です。お疲れ様でした。
【俺用】Gitの便利なコマンド集

**あくまで俺用なので、このコマンドを使用した際に起こる問題については一切責任を負えませんのです（・ω・）**

# gitの不要なbranchをまとめて削除
```
$ git branch --merged | grep -v '*' | xargs -I % git branch -d %
```
とりあえず、これをメモっておきたかっただけ...

そのうち増やしていきます。
Rails データベース カラム 制約　※自分用メモ

**RailsでデータベースのカラムにNot NULL などの制約を「後から」付ける**
モデルにバリデーションを付けたカラムは、データベースでもバリデーションを設定する。
でないと、サーバ負荷時やユーザの誤操作(ダブルクリックなど)などにより、不整合データが発生する懸念があるため。またデータベースで直接、値を変更もできてしまうと、それも不整合データが発生する原因になる。

**手順**
1. マイグレーションファイルを作成
モデルを作成する時に自動で作成されるものではなく、新しくマイグレーションスクリプトを作成するには次のように実行します。

rails generate migration クラス名
クラス名は任意ですが、通常は「行なう処理＋テーブル名」のようになります。
例)
rails g migration change_column_null_tasks

2.マイグレーションファイルを編集
class ChangeColumnNullTasks < ActiveRecord::Migration
def change
 change_column_null :tasks, :title, false
     change_column_null :tasks, :note, false
    change_column_null :tasks, :video, false
    change_column_null :tasks, :tag, false
    change_column_null :tasks, :project_id, false
    change_column_null :tasks, :slug, false
 end
end<br>
3. rake db:migrate、を実行する。

検索キーワード
「Rails データベース カラム 制約」
「マイグレーションファイルの作成」

**参考サイト「Rails データベース カラム 制約」**
Railsのmigrationの基本とレシピ集
http://ruby-rails.hatenadiary.com/entry/20140810/1407634200#migration-change-column-null

rails generate migrationコマンドまとめ
http://qiita.com/zaru/items/cde2c46b6126867a1a64

テラテイル
https://teratail.com/questions/17040

ActiveRecord4のバリデーションで複数カラムにユニーク制約を付ける方法
http://hivecolor.com/id/144

**参考サイト「マイグレーションファイルの作成」**
http://www.rubylife.jp/rails/model/index7.html

※マイグレーションファイルの削除のやり方もあり
http://www.rubylife.jp/rails/model/index7.html#section3
rails destroy migration クラス名
rake db:migrate
WebAPIの設計から実装まで〜設計編〜


WebAPIを設計から実装までした時に考えたことや書いたコードをまとめていく。

今回は設計思想について

実装編書きました→[WebAPIの設計から実装まで〜実装編〜
](http://qiita.com/takeokunnn/items/c119e576a6c04d37e098)

GitHubのレポジトリ→[chat_app](https://github.com/takeokunn/chat_app)

## そもそもWebAPIとは

WebAPIとは、

> 特定のURLに値とともにアクセスするとデータベースから必要なデータを取ってきてそれをクライアント（ユーザー側）にそのデータを送信する。

参考→[エンジニア視点から見るWebサービスの全体像](http://qiita.com/takeokunnn/items/9b0bcdde411b94775a5f)

## WebAPIのデータフロー

下図のように設計した

![スクリーンショット 2016-05-27 10.07.42.png](https://qiita-image-store.s3.amazonaws.com/0/125325/a7315b30-c84f-5676-f100-66e4d451661c.png)

1. `Client`→`Route`・・・`Client`から`API`に`Request`を送る
2. `Route`→`Controller`・・・`Route`で`URL`を解析して`Controller`に`Dispatch`する
3. `Controller`→`Service`・・・`Controller`でデータを整理して`Service`に投げる
4. `Service`→`DB`・・・`Service`は`Controller`から受け取ったデータを`DB`に格納する
5. `DB`→`Service`・・・`Service`は`DB`からの実行結果を受け取る
6. `Service`→`Controller`・・・`Controlller`は`DB`に保存できたかどうかの結果を`Service`から受け取る
7. `Controller`→`Client`・・・`Client`は`Controller`から`Request`に対しての`Response`を`json`形式で受け取る

### ControllerとDBの間にServiceを入れた理由

`MVCFramework`において、`Controller`の役割は非常に多く、すべての処理を`Controller`に書くと肥大化してしまう。そこで、`DB`へのアクセスを`Service`にまとめることで、処理をわかりやすく且つ再利用性を高めることができるようになる。

### Routeの公開は必要最低限にする

`Route`は`Client`から見ると`WebAPI`の玄関口であり、ここの間口を必要最低限にすることによりセキュリティ性を高めることができる。

### Controllerでは細かいところまでエラー処理をする

`Controller`は`Client`に`Response`を返す役割があるので、エラー処理を細やかにすることによって`Client`側の`Request`エラーをわかりやすくすることができる。

### ServiceにDBを操作する処理をすべて書く

`Service`にはDBを操作する処理をすべて書く。特定の`Service`を呼び出せるのは特定の`Controller`にすることにより、セキュリティ性を高めることができる。

## DB構築について

下図のように構築してみた。

![SNSApplicaitonModelStructure.png](https://qiita-image-store.s3.amazonaws.com/0/125325/7493c8d1-742a-e2ea-0b15-5e4928f1f77d.png)

### 気をつけた点

- データを`DB`から引っ張ってくるときになるべく別`table`と`join`しないようにした
- 正規化をして、DBの拡張性を高めた

### DBにおいて重要だと思ってること

DBから引っ張ってくるデータの量を最小化する努力をするべきだ。なぜなら`Client`に`Response`する際、データの総量が大きくなってしまうとどうしても通信量が増えてしまい、また`Client`側で`parse`するときに時間がかかってしまうからだ。

## WebAPIのエンドポイント

エンドポイントとは、

> WebAPIにおけるエンドポイントとは、APIにアクセスするためのURI

参考→[Web API: The Good Parts](https://www.oreilly.co.jp/books/9784873116860/)

美しく設計することによって、別の開発者でも楽にアクセスできるようになる。

### エンドポイントの実際の例
![スクリーンショット 2016-05-27 11.28.18.png](https://qiita-image-store.s3.amazonaws.com/0/125325/25d3944b-3ec2-c393-e948-bb4c1c123337.png)

細かいエンドポイントの設計の仕方はいずれ記事を書きます。

## UnitTest

`UnitTest`は文字通りテストコードでWebAPIにおいてはそれぞれのURLは正しく使えるかということを確認することができ非常に有益だと思う。また、機能拡張やソースコードのリファクタリングをしたときに正常に動くかどうかを自動でテストすることができる。また、エラー処理したコードが正常に動くかもテストできるので非常に便利だ。

また、きちんとテストコードを書くことによってドキュメント代わりにもなり、別の開発者からもわかりやすくなる。

参考までに実行したときのCUIを載せておく

![スクリーンショット 2016-05-27 11.43.39.png](https://qiita-image-store.s3.amazonaws.com/0/125325/13d89a43-d472-1eff-f052-45d53676cf32.png)

## 最後に

試行錯誤して学んだ知識なので間違いがあるかもしれないし、さらに良い設計方法もあるかもしれません。

コメントで批判していただけると嬉しいです。
sshを公開鍵で認証するためにやること

忘れてしまうので自分用のメモ

以下のコマンドを、クライアント側(sshの接続元)で実行します。

```
$ mkdir ~/.ssh && pushd ~/.ssh
$ ssh-keygen -t rsa
# パスフレーズ等必要なければ Enter 連打
$ ssh ユーザ名@IPアドレス "cat > ~/.ssh/authorized_keys; chmod 600 /root/.ssh/authorized_keys" < id_rsa.pub
# サーバ側に authorized_keys が存在する場合は「>」を「>>」にすること
```
GoogleSpreadsheetで正規表現を使い、任意の文字をハイライトする方法

#完成したもの

![スクリーンショット 2016-05-18 10.30.30.png](https://qiita-image-store.s3.amazonaws.com/0/54922/1e3e2b14-60f7-5898-58f8-f7873738b6d1.png)

#要件
- [x] ルールにマッチする文字をハイライトする
- [x] できれば正規表現使いたい
- [x] マッチルールはコード外でリスト化
- [ ] 文章内、一致箇所のみハイライト

一致箇所のみハイライトができなかったのでもし知っている方がいたら教えてください

#実装

## ルールにマッチする文字をハイライト

これについては、条件付き書式設定で行った。
一般的な演算子で条件が設定できる。（==,!=,<,> 等）
凝ったことをしたい場合カスタム数式を選ぶことができる



## できれば正規表現使いたい

```
REGEXMATCH(判定したい対象セル,正規表現)
```

この関数を使うことで、第二引数に与えた正規表現にマッチするかTRUE/FALSEで結果を得ることができる

## マッチルールはコード外でリスト化

前項のREGEXMATCHの第二引数に入れる文字を、複数セルから生成すればおk

```
"("&JOIN("|", FILTER($F$1:$F$10,LEN($F$1:$F$10)))&"
```

コードだとこう。

```
FILTER($F$1:$F$10,LEN($F$1:$F$10))
```

この部分で、空白ではないセルのみのリストを作成している。

それを

JOINで、"|"区切りで接続している

#完成したコード
```
REGEXMATCH(A1, "("&JOIN("|", FILTER($F$1:$F$10,LEN($F$1:$F$10)))&")")
```

組み合わせたこのコードを、カスタム条件分に設定すると
F1からF10の正規表現にマッチするA列のセルをハイライトすることができました！
EspressoでViewPager内の子Viewに対するテストをしたい


参考:[android - Testing ViewPager with Espresso. How perfom action to a button of an Item? - Stack Overflow](http://stackoverflow.com/questions/29836405/testing-viewpager-with-espresso-how-perfom-action-to-a-button-of-an-item#)

ベストアンサーの中に、最初のページ内の子Viewに対するMatcherが載っていますので、これに汎用性をもたせただけです。

```java
public class MatcherUtil {
    @NonNull
    public static Matcher<View> ViewPagerMatcher(final Matcher<View> parentMatcher, final int index) {
        return new TypeSafeMatcher<View>() {
            @Override
            protected boolean matchesSafely(View view) {
                if (!(view.getParent() instanceof ViewPager)) {
                    return parentMatcher.matches(view.getParent());
                }
                ViewPager pager = (ViewPager) view.getParent();
                return parentMatcher.matches(view.getParent()) && pager.getChildAt(index).equals(view);
            }

            @Override
            public void describeTo(Description description) {

            }
        };
    }
}
```

例：buttonというIDをもつViewがViewPager内1ページ目に存在するか

```java
onView(allOf(withId(R.id.button), isDescendantOfA(ViewPagerMatcher(withId(R.id.pager), 0)))).check(matches(notNullValue()));
```
com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536への対応

環境 AndroidStudio2.1

以下のエラーがでて、ビルドが通らない時に試した方法

```
com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
```

(1) jumbomode

```
android {
    dexOptions {
       jumboMode true
    }
}
```

私の環境では失敗

(2) MultidexApplication

https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html

私の環境では成功

(3) InstantRunの停止

Preferenceにて
Enable Instant Run to hot swap code/resource changes on deploy
のチェックを外す

私の環境では成功!?
ffmpegのオプション指定

ffmpegでコンパイルした際、どのようなオプションを利用してコンパイルしたか忘れてしまった！！

そんな時は、ソースを解凍したDirに移動して、次のファイルで分かります。

```
＜sample 1＞
# cat config.fate
config:x86:x86_64:generic:linux:gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4):--disable-yasm
```

```
＜sample 2＞
# cat config.fate
config:x86:x86_64:generic:linux:gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4):--prefix=/usr/local --enable-gpl --enable-version3 --enable-nonfree --enable-shared --enable-libfaac --enable-libx264 --extra-cflags=-fPIC --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
```
Unityのパネルやメニューがなくなった場合の対処方法。 Unityを初期状態に戻す方法.

以下のサイトを参考させてもらいました。

http://yaplog.jp/nekoashi_1/archive/178
http://cpplover.blogspot.jp/2014/07/ubuntu-1404unity.html

以下の手順で直りました。
1) Ctrl＋Alt＋F1キーでコンソール画面に切り替えられる
2) コンソール画面でログインする
　※インストール時に登録したログインIDとパスワード入力
3) 「DISPLAY=:0.0 gnome-terminal」と入力してEnter
4) Alt+F7を押して、デスクトップ画面に切り替えする
5) デスクトップ画面のターミナルにて、以下のコマンドを入力
gconftool-2 --recursive-unset /apps/compiz-1
gconftool-2 --recursive-unset /apps/compizconfig-1
rm ~/.compiz-1/session/*
rm ~/.config/compiz-1/compizconfig/config

※うちの場合、インストール直後だったので下の2行で削除しようとしているファイルは出来ておらず、ファイルがないといったエラーになった。

6) 再起動する(sudo shutdown -r now)
　※sudoではパスワードを聞かれるが、ここで必要なのはrootのパスワードではなくログインしているIDのパスワード。
　※下で入れるコマンドは、ここで一旦再起動してからでないと効かない。(実際続けてやってみたがダメだった)
7) 再起動後も背景しか出ていないので、再度上記の1)～4)までを実施してターミナルを起動する(たぶんtty1?上でそのままコマンド入力してもいいはず)
8) ターミナルで「dconf reset -f /org/compiz/」と入力しEnter
9) また再起動(sudo shutdown -r now)

上記で直らなかったら、以下続けてください。

10)$sudo restart lightdm
11)$sudo shutdown -r now
12)$sudo apt-get install unity-tweak-tool
13)$unity-tweak-tool --reset-unity
InteliJ vue for ideaのプラグインでエラーが出る場合

#1.JVMのバージョンを1.8にする
https://java.com/ja/download/

#2.利用するJVMのバージョンを指定する
##JVMのバージョンを1.8に縛る
/Applications/IntelliJ IDEA 15.app/Contents/info.plistの中身

```info.plist
<key>JVMVersion</key>
<string>1.8*</string>
```
に書き換えて、アプリ再起動
あるディレクトリにある画像すべての Exif Orientation情報を取得

EXIF Orientation 周りがあまりに気持ちが悪いので、大量にある画像の EXIF Orientation 情報をすべて洗いざらい調べてみることに。

## コード

Ruby で書いた。

```rb
Dir["somedir/*"].each do |path|
  file = File.basename(path)
  puts "#{file}: #{`identify -format "%[EXIF:Orientation]" #{path}`}"
end
```

実行には時間がかかるかもしれない。

## Orientationの定義

[ExifのOrientationを見て画像を回転させる](http://hackmylife.net/archives/7400448.html)
がわかりやすい。これを見れば十分だが、自分の言葉で少し書きなおしてみた。

|Orientation|本来あるべき形をどのように操作したか|
|-----------|---------------------------|
|1|そのまま|
|2|左右反転|
|3|180度回転|
|4|180度回転して左右反転(=上下反転)|
|5|時計回りに90度回転して左右反転|
|6|時計回りに90度回転|
|7|時計回りに270度回転して左右反転|
|8|時計回りに270度回転|

たぶん現実には、左右反転系はほとんど出てこないと思われる。よくあるのは、1,3,6,8あたりだろう。
overflow-y: scroll;　が効かないディスプレイがある。それはretinaディスプレイ。　


# overflow-y: scroll;が効かない・・・

ある日いつものように開発していると、「ここ、スクロールできないんだけど」という指摘を頂いた。
それはよくある「高さを固定して、はみ出したテキストはスクロールさせる」というもの。
`height`を指定した要素に`overflow-y: scroll;`を指定する、一般的な実装だと思います。

```sample.html
  <div class="textBlock">
    ここにテキストが入ります。
    <br />長いテキストが入るとスクロールバーが出てY方向にだけスクロールします。
    <br />短いテキストの場合はスクロールさせません。
  </div>
```
```before.css
  .textBlock{
    box-sizing: border-box;
    overflow-y: scroll;
    width: 300px;
    height: 100px;
    padding: 10px;
    border: 1px solid #aab4b9;
    background: #fafafa;
    font-size: 16px;
  }
```

上記のソースで私の環境では問題なくスクロールできました。
他の人にも見てもらったところ、どうやらスクロールできる人とできない人がいるようです。
スクロール**できない人のPCはMacBook Pro**。スクロール**できる人のPCはMacBook Air**。
さらにMacBook Proを使っている人に外部ディスプレイでスクロールを試してもらったところ、問題なくスクロールできたのです。

つまり、**Retinaディスプレイだけでスクロールできない**ということです。(※MacBook ProはRetinaディスプレイ。)

つまり、どういうことだってばよ・・・(´・ω・｀)


# 解決策

`overflow-y: scroll;`してるブロックに`transform: translateZ(0);` を指定したらRetinaディスプレイでも無事スクロールできるようになりました。

```after.css
  .textBlock{
    box-sizing: border-box;
    overflow-y: scroll;
    width: 300px;
    height: 100px;
    padding: 10px;
    border: 1px solid #aab4b9;
    background: #fafafa;
    font-size: 16px;
    transform: translateZ(0);    /* ← NEW! */
  }
```


# 結局何だったのか

結局何だったのか、実はわかっていません。
詳しい検証もしてなかったので、他のスタイルが悪さをしていた可能性も否めないのです・・・。
不思議なのは、ディスプレイを移動させると同じブラウザでもスクロールできるようになるということ。
もちろん再読み込みなどもしていません。
もし特定の人だけスクロールできないという状況に遭遇したら`transform: translateZ(0);`を試して見てください。
#myelixirstatusというハッシュタグの用途は？

Elixir関係のTwitterアカウントをフォローしていると、`#myelixirstatus`というハッシュタグが頻繁に登場します。

<img width="583" alt="スクリーンショット 2016-05-27 10.08.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/22932/21678013-e8df-29d1-1fc1-4f2bc299cbf3.png">


これ一体どういう時に使うんだろう？と以前から疑問に思っていたので調べてみたところ、下記のページに説明が記載されていました。

[Share your #myelixirstatus](http://www.meetup.com/ja-JP/Hamburg-BEAMers/events/219965875/?eventId=219965875)
[Definition of #myelixirstatus](https://tagdef.com/myelixirstatus)

> About one year ago @ElixirFountain announced the hashtag #myelixirstatus. Since then many developers used the tag to tell the world how they are using elixir.

> 1年ほど前、@ElixirFountainが#myelixirstatusハッシュタグをアナウンスしました。
> それ以来、たくさんの開発者が、自分たちがどのようにElixirを使っているのかを世界に伝えるためにこのハッシュタグを使用しています。

@ElixirFountainのオリジナルのツイートは下記になります。

<img width="628" alt="スクリーンショット 2016-05-27 10.15.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/22932/925d62f1-d067-f850-9742-5bff673498ad.png">

ということで、自分の現在のElixirの学習状況だったり、自分で開発しているElixirのプロジェクトだったり、パッケージだったり、そういうものを世界の皆さんにアナウンスしたい場合に(もちろん節度を持ちつつ)自由に使えるハッシュタグのようです(^_^)
ES5で書くAngular v2（６）「フォームバリデーション」

※現在この方法は推奨されません

今回はngFormを使ったフォームバリデーションをやってみます。

# 基本形

フォームにngControlディレクティブとngFormのテンプレート変数を追加します。
そして、テンプレート変数の.validの値をチェックすることでエラーの判定ができます。

```html:文字が未入力だと警告を出すサンプル
<form novalidate>
    <input type="text" ngControl="title" #title="ngForm" required>
    <div [hidden]="title.valid">内容を入力してください</div>
</form>
```
![GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/106886/6c2ba943-9b2b-6bc5-bbe6-412a6ceeff7b.gif)

`#title`の部分は、**テンプレート内でのみ有効な"title"という名前の変数** を定義しています。
`ngControl`に設定する名前はテンプレート変数と同じである必要はないようです。

# ダーティチェック

.dirtyや.pristineを使うとダーティチェックも可能です。

```html:文字を入力した後に全て削除すると警告を出すサンプル
<form novalidate>
    <input type="text" ngControl="title" #title="ngForm" required>
    <div [hidden]="title.valid || title.pristine">内容を入力してください</div>
</form>
```
![GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/106886/9856f253-06cf-a69d-e77c-b0ea4483c265.gif)

- .dirty <br> フォームの内容を変更したときtrue
- .pristine <br> フォームにまだ手を付けていない状態のときtrue


# フォーム全体のバリデーション

form要素にテンプレート変数を設定するとフォーム全体のエラーを検知することができます。

```html:二つのテキストボックスに文字を入力した場合のみボタンを表示するサンプル
<form #form="ngForm" novalidate>
    <input type="text" ngControl="title" #title="ngForm" required />
    <input type="text" ngControl="subtitle" #subtitle="ngForm" required />
    <button [hidden]="!form.valid">Add</button>
</form>
```
![GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/106886/f13fe2e6-36c3-0eb0-41f8-100d3dd257a4.gif)

# まとめ

ngFormを使ってフォームのバリデーションができるようになりました。

[前回](http://qiita.com/puku0x/items/120019ea3b9542e58fdc)のサンプルと組み合わせると「バリデーションエラーが出たらスタイルを変更する」ということもできそうです。

AngularJS(v1.x)系の書き方よりも独特なものになっていますが、テンプレート変数は便利なので早く使いこなせるようになりたいところです。
Alamofireのリクエストのログをcurl形式で出力する

# 実装方法

~~~hoge.swift
let manager = ApiManager.sharedInstance
let request = manager.request(method, urlString, headers: headers, parameters: parameters, encoding: .JSON)
#if DEBUG
NSLog("=======REQUEST======")
NSLog(request.debugDescription)
NSLog("======================")
#endif
~~~
Amazon API GatewayにバイナリデータがPOSTできない

結論
----

[2016/11/17 API GatewayでBinaryデータの送受信がサポート](https://aws.amazon.com/jp/about-aws/whats-new/2016/11/binary-data-now-supported-by-api-gateway)されましたので、このエントリーは無効となりました。よかったね！

~~Amazon API Gatewayは Content-Type: application/octet-stream なデータをPOSTで受信しても、無意味なデータができあがってしまいます
この件、ドキュメントには書いてないようです。。。~~


※gzipなデータを送りたければ [Content-Encoding: gzip ヘッダをつければ大丈夫](http://qiita.com/ma2shita/items/4e3c16617a6e17dda01e)です

概要
----

[Forumにも書かれている](https://forums.aws.amazon.com/thread.jspa?messageID=668306&#668306)とおり、Amazon API GatewayはPOSTされたpayloadに対してUTF-8変換を行うようです
この時non-ASCIIなbyteは 0xEF 0xBF 0xBD に変換されてしまうため、POST元のpayloadデータと一致しない、改変されたデータが作られることになります

そしてIntegrated Requestにおいては `$input.body` は、改変後データが格納されており、オリジナルを取得する方法が見つかりません

検証方法
--------

1. Amazon API Gatewayで受けたPOSTをS3(bucket: apigw-testing)に保存するようにセットアップ
2. 下記 target.json をそれぞれの形式で圧縮
3. curlを使って検証

#### Amazon API Gatewayのセットアップ ####

基本的には[チュートリアル](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html)に沿って作ります

下記はオリジナルです（設定方法は割愛で）

- `POST https://APIGATEWAY/STAGE/{type}` でS3に保存されるオブジェクト名をコントロールできるようにしています

あと、セットアップ中のテストでは[API GatewayのHTTP ProxyでTestでのみエラーが発生する](http://qiita.com/yoshidasts/items/669aa4375447bd2a2645)といった罠が現在あるようですので、バケットを作るリージョンはお気をつけて

検証
----

```
$ convert -size 1x1 xc:#990000 original.gif
$ curl -H "Content-Type: application/octet-stream" --data-binary @original.gif -X POST https://${APIGATEWAY}.execute-api.ap-northeast-1.amazonaws.com/prod/apigw.gif
$ aws s3api get-object --bucket apigw-testing --key apigw.gif apigw.gif
{
    "AcceptRanges": "bytes",
    "ContentType": "application/octet-stream",
    "LastModified": "Fri, 27 May 2016 00:53:14 GMT",
    "ContentLength": 53,
    "ETag": "\"7276f51bcbfb892c6ba28a54af1842fc\"",
    "Metadata": {}
}
```

確認

```console
$ wc -c original.gif apigw.gif
43 original.gif
53 apigw.gif
```

```
$ od -tx1z original.gif
0000000 47 49 46 38 39 61 01 00 01 00 f0 01 00 00 00 00  >GIF89a..........<
0000020 ff ff ff 21 f9 04 00 00 00 00 00 2c 00 00 00 00  >...!.......,....<
0000040 01 00 01 00 00 02 02 44 01 00 3b                 >.......D..;<
0000053
```

```
$ od -tx1z apigw.gif
0000000 47 49 46 38 39 61 01 00 01 00 ef bf bd 01 00 00  >GIF89a..........<
0000020 00 00 ef bf bd ef bf bd ef bf bd 21 ef bf bd 04  >...........!....<
0000040 00 00 00 00 00 2c 00 00 00 00 01 00 01 00 00 02  >.....,..........<
0000060 02 44 01 00 3b                                   >.D..;<
0000065
```

0xF0 や 0xFF が 0xEF 0xBF 0xBD に変換されている(そのためサイズも変更されてる)

どうしてもバイナリを送りたい
-----------------------

現時点では、直接Amazon API Gatewayでバイナリを取り扱うことはできませんでしたが、送信側でBase64 encodingができるなら、まだ道はあります

Integration Requestで `$util.base64Decode()` を使えば、受け取ったBase64edな文字列をdecodeしたあとのバイナリデータで後続のサービスに引き渡すことができます

[$util変数へのアクセス](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#util-template-reference)

あとがき
--------

ま、RESTな環境でnon-ASCIIなデータを送るってのもレアケースですよね
OpenWRTでC++11を使う

# はじめに

OpenWRT上でC++11を使って開発をするにはいろいろ設定する必要があったので、ここにメモとして残す。

想定しているバージョンはOpenWRT 15.05 Chaos Calmer。

# gccの更新

http://qiita.com/0x0c@github/items/acb85104c18c2b3e465b
ここを参考にgccのバージョンを上げる。

# 標準ライブラリの変更

OpenWRTでは標準で`uclibc`を使っている。
`uclibc`は2012年に更新が止まっており、C++11の仕様に追いつけていない模様。（というか、全部のヘッダが入っていないっぽくstd::functionとかnot foundする。）
なので`eglibc`に変更する。

`make menuconfig`した時の`make menuconfig --> Advanced configuration options (for developers) --> Toolchain Options --> C Library implementation`を変更する。

# 終わりに

これでC++11が自由に使えるようになっているはずである。

# おまけ

Chaos Calmer以前のOpenWRTでC++11を有効にするにも同様の手順を踏むことで可能になるはず。
実際にBBで行い、実行可能なバイナリが生成されたことを確認済み。
os バージョン 確認 linux　※自分用メモ

**検索キーワード**
os バージョン 確認
os バージョン 確認 linux

**参考サイト**
http://qiita.com/ritukiii/items/60a3ac4734fc52748cee
http://d.hatena.ne.jp/rx7/20081010/p2
http://uxmilk.jp/13610

**使用しているOSの確認**
・AWS(EC2)の場合？
[ec2-user@ip-172-31-30-10 programming_service]$ cat /etc/system-release　
Amazon Linux AMI release 2016.03

・カーネルを調べる
[ec2-user@ip-172-31-30-10 programming_service]$ cat /proc/version
Linux version 4.4.5-15.26.amzn1.x86_64 (mockbuild@gobi-build-60007) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Wed Mar 16 17:15:34 UTC 2016

※詳細は参考サイトを確認する
OpenWRT Chaos Calmerでgcc4.9を有効にする

# はじめに

OpenWRT Chaos Calmerは`toolchain/gcc/patches/`以下に`4.9-linaro`があり、gcc4.9が使える模様。

しかし、`make menuconfig --> Advanced configuration options (for developers) --> Toolchain Options`から設定できるGCC compiler Versionには4.8までしかない。

そんな場合、gcc4.9を有効にするには次の修正が必要になる。

# `toolchain/gcc`以下のファイルを修正する

`make menuconfig`の上記の箇所に新たに選択項目を追加するには次のファイルを修正する必要がある。

## `toolchain/gcc/Config.in`の修正

`toolchain/gcc/Config.in`を見る限り、他のバージョンのgccは`GCC_USE_VERSION_4_8_LINARO`と言った具合にconfigが記述されている。
同様にgcc4.9に対しても記述を行う。

```
config GCC_USE_VERSION_4_9_LINARO
	select GCC_VERSION_4_9_LINARO
	bool "gcc 4.9.x with Linaro enhancements"
```

## `toolchain/gcc/Config.version`の修正

`toolchain/gcc/Config.version`も同様に、

```
config GCC_VERSION_4_9_LINARO
	default y if (!TOOLCHAINOPTS && !TARGET_octeon)
	bool
```

また、

```
config GCC_VERSION
 	string
 	default "4.6.3"	    if GCC_VERSION_4_6_3
 	default "4.6-linaro"    if GCC_VERSION_4_6_LINARO
 	default "4.8-linaro"    if GCC_VERSION_4_8_LINARO
+	default "4.9-linaro"    if GCC_VERSION_4_9_LINARO
# ~~~省略~~~
```

最後に、`config GCC_VERSION_4_8`の項目と同様に

```
config GCC_VERSION_4_9
	bool
	default y	if GCC_VERSION_4_9_LINARO
```

を追記する。

## `toolchain/gcc/common.mk`の修正

`toolchain/gcc/common.mk`には実際にgccを取得する際に必要な情報を記述する。

`ifeq ($(CONFIG_GCC_VERSION),"4.6-linaro")`の箇所と同様に

```
    ifeq ($(CONFIG_GCC_VERSION),"4.9-linaro")
      PKG_REV:=4.9-2015.05
      PKG_VERSION:=4.9.3
      PKG_VERSION_MAJOR:=4.9
      PKG_MD5SUM:=7303374d7877e20aedc9e442cd1d0b2d
      PKG_COMP:=xz
    endif
```

また、`ifeq ($(PKG_VERSION),4.8.0)`の箇所と同様に

```
  ifeq ($(PKG_VERSION),4.9.3)
    PKG_MD5SUM:=819bfa9bd20138d3b8a48bef6d01e5df
  endif
```

そして`LINARO_RELEASE:=`となっている行を`LINARO_RELEASE:=15.05`にする。

なお、取得するファイルは`http://releases.linaro.org/15.05/components/toolchain/gcc-linaro/4.9/`の`gcc-linaro-4.9-2015.05.tar.xz`である。

上記より新しい時期にリリースされたものもあるが、そちらを使っても良いかもしれない。

# toolchainの更新

上記の変更を加えたら、`make menuconfig`でgccの設定箇所で4.9が選択できるようになっているはずである。
選択後、`make`し直すと使えるようになる。

# おまけ

今回の修正のpatchはこちらです。

https://gist.github.com/0x0c/45bb3a2fc802b4b6a8af9c5d188a7b46
Goを英語ビデオで学ぶサイトまとめ

## Basics
インストール方法から初歩的な説明。インド人訛り。
https://www.youtube.com/watch?v=8BTvpeplQPU&list=PLB-tlgQ97VrdH1qcBKTghZQ09Qy5P1g2K

DerekさんのYouTubeビデオ。１時間でうまくまとまっている。
https://www.youtube.com/watch?v=CF9S4QZuV30

GoのオフィシャルページにあるRuss Cox さんのイントロダクション
https://www.youtube.com/watch?v=ytEkHepK08c

Vincent BattsさんのYouTubeビデオ。中級レベル。
https://www.youtube.com/watch?v=cMYhGNofHA4


## おなじみRob Pikeさんのビデオ
Concurrency Is Not Parallelism (並行処理と並列処理の違いについて)
https://www.youtube.com/watch?v=cN_DpYBzKso

Go Concurrency Patterns (並行処理のデザパタ)
https://www.youtube.com/watch?v=f6kdp27TYZs

Go Proverbs (哲学的な話)
https://www.youtube.com/watch?v=PAAkCSZUG1c&index=30&list=PLuKvd2GQmvCATHrdPfWwESh6o8AI4GTpj

Simplicity is Complicated
https://www.youtube.com/watch?v=rFejpH_tAHM&index=27&list=PLuKvd2GQmvCATHrdPfWwESh6o8AI4GTpj

## その他
Google I/O 2013 - Advanced Go Concurrency Patterns
https://www.youtube.com/watch?v=QDDwwePbDtw

Go Conference in India (2016にインドで行われたカンファレンス)
https://www.youtube.com/watch?v=4Dr8FXs9aJM&list=PLuKvd2GQmvCATHrdPfWwESh6o8AI4GTpj

GopherCon 2015
https://www.youtube.com/watch?v=3EW1hZ8DVyw&list=PL2ntRZ1ySWBf-_z-gHCOR2N156Nw930Hm

GopherCon 2015 - Lightning Talk
https://www.youtube.com/watch?v=3Mvk3XkKiak&list=PL2ntRZ1ySWBeHqlHM8DmvS8axgbrpvF9b
permission deniedの解決法

# AndroidManifestにパーミッションを書いているのに”permission denied”がでる・・・
permission deniedで検索するとManifestに書けばいいと言われる。しかし、ちゃんと書いているんだよ！という人。
端末の設定から許可はしましたか？
Android6.0 Marshmallowからアプリの権限ごとに許可の可否を設定できるようになったそうです。そのためManifestに書いただけではダメで、Androidの設定から入り権限に許可をしなくてはいけません。（権限の許可を求めるポップアップを実装すればいいんですけどね！）

## 設定からアプリの権限を許可する方法
設定→アプリ→目的のアプリ→許可→許可する権限を有効化

![Screenshot_20160527-084013.png](https://qiita-image-store.s3.amazonaws.com/0/126861/a61cb916-d459-045e-8d5e-96bdd298eb34.png)
＜アプリ情報画面＞

![Screenshot_20160527-084035.png](https://qiita-image-store.s3.amazonaws.com/0/126861/26814a2c-5f8d-600e-c8cd-94f23df56684.png)
＜アプリの権限画面＞
ローカルコマンドのように動作するリモートコマンド

# はじめに
スタブ作成のために必要だったので、ローカルコマンドのように動作する、しかし、実際にはリモートでのコマンド結果を出力するコマンドが欲しくて作成しました。

# 環境
OSX El Capitan

# 使い方
ソースをlsをいうファイル名で保存。
chmod +x lsで実行権限を付与。
あとはlsするだけ。

# 実装

```
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import sys
import os
from subprocess import call

argvs = sys.argv

param_hostname = '1.2.3.4'
param_username = 'docker'
param_port = '60000'
param_command = os.path.basename(argvs[0])
param_command_param = ' '.join(argvs[1:])

cmd = '/usr/bin/ssh -l %s -p %s %s %s %s' % (
        param_username, str(param_port), param_hostname, param_command, param_command_param)

call( cmd.strip().split(' ') )
```

# 結果
butada-mac:remote_exec_like_a_local butada$ ./ls -l


# 参考
特になし
「Winフォームでメンテとテストを可能にする10の方法」の章題だけ訳した

[10 Ways to Create Maintainable and Testable Windows Forms Applications](http://markheath.net/post/maintainable-winforms)
の章題だけ訳してみました。章題だけでも役に立つんじゃないかなと思います。
というかWinFormsはここを守っていれば少なくともPDS(Presentation Domain Separate)は行えると思います。
なお、意訳かつ誤訳がある可能性があるので、ちゃんと把握したい方は原文を見に行ってください。

では、行きます。

1. UserControlでUIを分離しろ
2. コードビハインドにDomainを書くな。外に書け
3. インターフェースを使ってパッシブビューにしろ
4. ビューをコントロールするにはプレゼンターを使え
5. エラーレポート用のサービスを作れ
6. Commandパターンを使え
7. 依存関係管理にIoCコンテナ(DIコンテナ)を使え
8.  EventAggregatorパターンを使え
9.  AsyncとAwaitを使って非同期にしろ
10.  遅すぎるを放っておくな

気が向いたら中身も訳そうかなと思います。
iOS のアプリと Extension でコードを共有する

キーボードと本体アプリの間で Class などのコードを共有する方法
プロジェクトを選択して、 Build Phases から Compile Sources に共有したいソースコードを追加する。
![kobito.1464303765.635831.png](https://qiita-image-store.s3.amazonaws.com/0/10012/ea7f71e4-f4fc-f43a-16d8-17755877c560.png "kobito.1464303765.635831.png")
Elixir 1.3でAccessモジュールに入る関数

[ブログ](http://joe-noh.hatenablog.com/entry/2016/05/27/073032)から転載。

---

先ほどこんなTweetを見た。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Elixir v1.3 will have new accessors for nested data structures. Here is how to upcase all languages names in a map: <a href="https://t.co/FNTTqjpDeP">pic.twitter.com/FNTTqjpDeP</a></p>&mdash; Elixir Lang (@elixirlang) <a href="https://twitter.com/elixirlang/status/735942800039088129">2016年5月26日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

```elixir
%{languages: [%{name: "elixir", type: "functional"}, %{name: "c", type: "procedural"}]}
|> update_in([:languages, Access.all(), :name], &String.upcase/1)
```

こうすると、

```elixir
%{languages: [%{name: "ELIXIR", type: "functiocal"}, %{name: "C", type: "procedural"}]}
```

というmapが得られる。Tweetの例には`name: "john"`がいるけど紛らわしいので消した。

見慣れない`Access.all/0`が使われていて、`:languages`キーに対応するリストの全要素にアクセスしている。

今日の時点では他にも`Access.key/2`、`Access.key!/1`、`Access.elem/1`が追加されている。追加されたコミットは[464d3dd](https://github.com/elixir-lang/elixir/commit/464d3dd2637b70070e24f1e7d4757f72d0bba30e)で、[10689f4](https://github.com/elixir-lang/elixir/commit/10689f4e0105c64a047310a18866327d5a145f25)で`Access.field`が`Access.key`に変更されている模様。

`Access.key/2`は、これまで

```elixir
update_in(map, [:name], &String.upcase/1)
```

と書いていたものを

```elixir
update_in(map, [Access.key(:name, "john")], &String.upcase/1)
```

と書くことで、`map`に`:name`キーが無かった場合のデフォルト値を指定できる。

`Access.key!/1`は、キーが存在しないときに即座にraiseする。

```elixir
update_in(%{color: "red"}, [Access.key!(:name)], &String.upcase/1)
** (KeyError) key :name not found in: %{color: "red"}
```

`Access.elem/1`は、

```elixir
get_in({:ok, 3}, [Access.elem(1)])  #=> 3
```

のように、タプルにindexでアクセスできる。

## 感想

`get_in`、`update_in`は確かに便利なんだろうなと思っていたけれどイマイチ活用できた記憶がない。今回の変更でかなり柔軟になったので、活躍の場が増えるのでは。

例えば以下のデータがあったとする。

```elixir
users = %{users: [
  %User{name: "John", posts: [%Post{title: "foo", tags: ["elixir", "Ecto"]}]},
  %User{name: "Mary", posts: [%Post{title: "bar", tags: ["BEAM"]}, %Post{title: "baz"}]},
]}
```

タグは全て小文字にしておきたいな〜と思ったら次のようにすればOK。

```elixir
update_in(users, [:users, Access.all(), :posts, Access.all(), Access.key(:tags, []), Access.all], &String.downcase/1)
```

戻り値は

```elixir
%{users: [
  %User{name: "John", posts: [%Post{tags: ["elixir", "ecto"], title: "foo"}]},
  %User{name: "Mary", posts: [%Post{tags: ["beam"], title: "bar"}, %Post{tags: [], title: "baz"}]}
]}
```
Zybo > Chronicles blog 25 > 処理時間の表示 > XScuTimer_LoadTimer() / XScuTimer_GetCounterValue() / XScuTimer_Start() / XScuTimer_Stop()

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-Five-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/431248


`result = ((float)a*(i*i)) + ((float)b*(i)) + (float)c;`
という処理の時間計測をしている。

```
for(i=0.0; i<10.0; i = i +0.1 ){
     XScuTimer_LoadTimer(&Timer, TIMER_LOAD_VALUE);
     timer_start = XScuTimer_GetCounterValue(&Timer);
     XScuTimer_Start(&Timer);
     result = ((float)a*(i*i)) + ((float)b*(i)) + (float)c;
     XScuTimer_Stop(&Timer);
     timer_value = XScuTimer_GetCounterValue(&Timer);
     printf("%f,%f,%lu,%lu, \n\r",i,result,timer_start, timer_value);
}
```

結果の例

```
0.0000000,131.289993,4294967295,4294967209
0.1000000,131.466629,4294967295,4294967263
```

経過時間(msec)を自分で計算しないといけない。読みにくい。

1つめの時間測定は失敗しているっぽい。２つめ以降(blogに掲載)は似たような値になっている。

> With a 666MHz processor clock, this computation takes 76 nsec. 

上記の時間の単位はnsのようだ。
Zybo > Chronicles blog 25 > transfer function / millibars to altitudes in meters

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/The-Zynq-PS-PL-Part-Five-Adam-Taylor-s-MicroZed-Chronicles-Part/ba-p/431248


## transfer function

> Many times, data from these sensors require a <font color=red>transfer function</font> to convert the raw data value from the ADC into one that can be used in further processing. A good example of this is with the Zynq XADC which contains a number of functions / macros within XADCPS.h to convert the raw XADC values into voltage or temperature. 

ADCで取得したカウント値を実際の物理量（電圧、温度）に変換する関数を transfer function と呼んでいる。この用語が一般的かは不明。

transfer functionで思いつくのはむしろこちらの方だ。
https://en.wikipedia.org/wiki/Transfer_function

## to altitude in meters

> The transfer function below gives the altitude in meters for a pressure between 0 and 10 millibars:

```
-0.0088x2 + 1.7673x + 131.29
```

発注している気圧計からの高度計算に使えるだろうか（余談）。

[別の計算方法](http://keisan.casio.jp/has10/SpecExec.cgi?lang=&path=05000000.%95%A8%97%9D%8C%F6%8E%AE%8FW%2F02100100.%92n%8Aw%2F12000300.%8BC%88%B3%82%A9%82%E7%95W%8D%82%82%F0%8Cv%8EZ%2Fdefault.xml&tmppath=&rand=89050388716.8668&cp=#!)
vimで複数行のインデントを連続で行う

![anime_compress.gif](https://qiita-image-store.s3.amazonaws.com/0/33674/787d34dd-e522-5581-b141-f741dfa7b468.gif)


```bash
$ vim
<i>1111<ESC><y><y><p><p><k><k><shift+v><j><j><>><.>
```

- `shift+v`でビジュアルモードで複数行選択　←　複数行の
- `>`でインデントする　←　インデント
- `.`で直前の動作を繰り返す　←　連続で行う

# 参考

vimでの複数行インデント修正 - Qiita
http://qiita.com/yotasasaki/items/dde3ab7efa0185c70fb9

Vim初心者がVimを使って次のステップに行くのに役立つ10のこと - Qiita
http://qiita.com/ykyk1218/items/8f5471c5e90cc83fd407

vi・vim勉強中。 - vim 直前の動作を繰り返す
http://www.webhtm.net/vim/repetition.htm

Macでキャプチャして作ったGifアニメーションをQiita記事に貼り付ける方法 - Qiita
http://qiita.com/ryosukes/items/b5dd0fac1a059caffbf0

【レビュー】デスクトップを動画キャプチャーしてアニメーションGIFファイルにする「GifCam」 - 窓の杜
http://www.forest.impress.co.jp/docs/review/20131001_617499.html
写真の向きの補正(convert -auto-orient)

iPhone で写真を表示しようとすると写真の向きでいつも問題を起こす。その対策。

まず EXIF 情報を知るためにツールを導入。

## Exiftool

[インストール方法](http://xmodulo.com/view-or-edit-pdf-and-image-metadata-from-command-line-on-linux.html)

```
$ sudo apt-get install libimage-exiftool-perl
# または
$ sudo yum install perl-Image-ExifTool
```

### 使い方
```
$ exiftool apple.jpg
ExifTool Version Number         : 8.60
File Name                       : apple.jpg
Directory                       : .
File Size                       : 17 kB
File Modification Date/Time     : 2015:05:28 10:10:42+09:00
...
```

## 問題探究

いま、iPhone である写真が天地反転して表示されてこまっている。PC では問題ない。

その写真を Exiftool で調べると、

```
Orientation                     : Rotate 180
```

であった。怪しい。

そこで、ImagickMagick で

```
mogrify -auto-orient hoge.jpg
```

した（mogrify は convert と機能は同じだが、直接対象ファイルを書き換える）。

すると結果は、

```
Orientation                     : Horizontal (normal)
```

おお、変わった。今度はよさそう。

iPhone で見てみる。がーん、変化なし。というか、PCでさえも反転するはめに…。かえって事態が悪化した。

いろいろ調べたのだが、どうも写真によってうまく行くものと行かないものがあるらしい。うーん。なんだかな・・・。

【後日談】
…と絶望に満ちたところで、先日は筆を折った。その後、執拗に調べた結果、次のようなことがわかった。

問題を引き起こしていたのは「生の画像自体はまっすぐに正しく配置されているが、余分な EXIF 情報が付いているために、それを適用すると転倒して見える」ような画像があるためだった！！

おそらくこれはこういうことだと思われる。

1. iPhone 等で写真撮影する。生の画像は転置していて、補正すると、まっすぐになるように EXIF Orientation が設定される。
2. それを EXIF Orientation を認識しない画像操作ツールで見る。すると転倒しているので、生の画像自体を回転してまっすぐにする。だが、EXIF Orientation は変更されないままである。
3. 2. の写真を EXIF Orientation を認識する画像ビューアーでみると転倒して見えるようになる。

iPhone が典型だが、こういう EXIF Orientation を活用するタイプのカメラで撮影すると、生の画像そのものは転倒していることが多い。それでも、EXIF Orientation は正しく設定されているので、これを適用すれば正しく表示できるだろう。

問題は、おそらく、EXIF Orientation を認識しない画像加工ツールがあるらしいことだ。具体例は知らないのだが、それらの存在を仮定しないと腑に落ちない。いずれにしろ、何らかの理由によって、EXIF Orientation が正しく設定されていない画像が流通していて、それらが、iOS のブラウザで見たとき、問題を起こすのだ。

本当、EXIF Orientation は不幸の元でしかない気がする…。こんなの撤廃してしまおうよ。
技術英語 > the first of its kind / be unheard of 

@ LOE > May 16, 2003

http://loe.org/shows/shows.html?programID=03-P13-00020
> the first of its kind

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

be unheard of 

http://idioms.thefreedictionary.com/unheard+of

> Empowering the workers in Third World nations is practically unheard of these days, and we should certainly applaud the efforts of Maggie's, Inc.
HTMLで指定したdata属性をCSSから出力する

## HTML5のdata属性について

HTML5からタグに`data`属性を指定できるようになった。

```
<div class="hoge" data-hoge="ほげほげ">ディブの中身</div>
```

## CSSからdata属性の中身を出力する

これをCSS側から出力するテクニックがある。

```
.hoge:before {
  content: attr(data-hoge);
}
```

こんな感じ。

## デモ

<iframe height='290' scrolling='no' src='//codepen.io/p1ch_jp/embed/bebzwq/?height=290&theme-id=dark&default-tab=html,result&embed-version=2' frameborder='no' allowtransparency='true' allowfullscreen='true' style='width: 100%;'>See the Pen <a href='http://codepen.io/p1ch_jp/pen/bebzwq/'>bebzwq</a> by P-Chan (<a href='http://codepen.io/p1ch_jp'>@p1ch_jp</a>) on <a href='http://codepen.io'>CodePen</a>.
</iframe>

## まとめ

```
content: attr(data-xxx);
```

という記法を使うと、CSSからdata属性の内容を出力することができる。
Mongooseでvirtualが出力できないときの対処法

Mongooseには`virtual`という機能がある。

例えば、データベースにはfirstNameとlastNameという項目があるが、実際にfindするときはfullNameも吐き出して欲しいとする。

そんな時に、以下の様な感じでスキーマを定義したあとに`virtual`を使うとfirstNameとlastNameをくっつけたfullNameを吐き出したりすることができる。

これで実際にデータベース上ではfullNameを持たないけど、findしたときだけ仮想的にfullNameを生成して吐き出してくれる。

```javascript
schema.virtual('fullName').get(function() {
  return this.firstName + this.lastName;
});
```

はずなのだが、さっきやってみると吐き出されなくて焦った。
前まではこれでうまくいっていたのでかなり焦った。

## 解決方法

以下を記述したら、ちゃんと出力されるようになりました。

```javascript
schema.set("toJSON", { virtuals: true });
```
botoを使って、s3にファイルをアップロード・ダウンロードする。

#Version:
- Python 2.7.6
- boto 2.40.0

Pythonを使うときは、ぜひ、virtualenvを使ってみてください。libraryの管理が格段と楽になります。

#コード
```Python
from boto.s3.key import Key
from boto.s3.connection import S3Connection

#アクセスコード
AWS_SECRET_ACCESS_KEY = ''
AWS_ACCESS_KEY_ID = ''

bucket_name = ''
key_name = ''


conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
bucket = conn.create_bucket(bucket_name)

k = Key(bucket)

#Upload
#file_nameはアップロ-ドするディレクトリーにあるファイルの名前
k.key = key_name
k.set_contents_from_filename(file_name)


#Download
k.get_contents_to_filename(file_name)
```
Sequelize + bcrypt でパスワード認証を実装する

# [Sequelize](http://docs.sequelizejs.com/en/latest/)？
node.jsのためのORM。RubyのActiveRecordに相当するもの。
他にも[bookshelf](http://bookshelfjs.org/)などがある。

```bash
$ npm i sequelize --save
```

# bcrypt？
bcryptはBlowfishという暗号化アルゴリズムの実装。
ハッシュ化の必要性やSHAファミリなどのハッシュ化ではなぜ駄目なのかについてはこの辺を参照。

- https://yuskamiya.tumblr.com/post/100503173956/bcryptblowfish暗号について調べたので文書化してみました
- http://tech-blog.tsukaby.com/archives/704

node.jsのbcrypt実装はネイティブモジュールでコンパイラのバージョンが古いとビルドできないことがあるので注意。g++4.8以上ならビルドできることを確認している。clangでも7.0.0以降ならまず大丈夫。

```bash
$ npm i bcrypt --save
```

https://github.com/ncb000gt/node.bcrypt.js/

# モデル作成
まずモデルを作る。RailsのActiveRecordほど使いやすくはないが一応Sequelizeにもマイグレーションツールがある。

```bash
$ npm i sequelize-cli -D
```

Userモデルをサクッと作る。

```bash
$ ./node_modules/.bin/sequelize model:create \
--name User \
--attributes 'name:string, email:string, password_hash:string'
```

# パスワードのスキーマ
生成されたUserモデルで`password`の属性を追加する。
ここで`DataTypes.VIRTUAL`の`password`はcreateやupdateの際に値を引数に受け取るが、実際にデータベースには保存されない属性になる。
この後の実装で代わりにハッシュ化したものを`password_hash`に保存する。

```js
password_hash: {
  type: DataTypes.STRING,
},
password: {
  type: DataTypes.VIRTUAL,
  validate: {
    min: 8,
    max: 32,
  },
},
```

# パスワードのハッシュ化
`bcrypt.hash()`を使う。`bcrypt.hashSync()`は同期メソッドなので使わない。
createやupdateの前にフックする関数を作り、ここでバーチャル属性の`password`に入っている値をbcryptでハッシュ化して`password_hash`に突っ込む。

```js
var hashPasswordHook = function(user, options, callback) {

  bcrypt.hash(user.get('password'), 10, function(err, hash) {
    if (err) {
      return callback(err);
    }

    user.set('password_hash', hash);
    return callback(null, options);
  });

};
```

# パスワードの認証メソッド
`bcrypt.compare()`を使う。`bcrypt.compareSync()`は同期メソッドなので使わない。
`instanceMethods`に`authenticate`とか適当な名前で生やす。また、先ほどのハッシュ化関数をcreateとupdateの前に走らせるため、`hooks`に指定しておく。

```js
var User = sequelize.define('User',
{
  //attributes...
},
{
  hooks: {
    beforeCreate: hashPasswordHook,
    beforeUpdate: hashPasswordHook,
  },
  instanceMethods: {
    authenticate: function(password, callback) {
      bcrypt.compare(password, this.password_hash, function(err, isValid) {
        if (err) {
          return callback(err);
        } else {
          return callback(null, isValid);
        }
      });
    },
  },
})
```

# 認証の実装
expressの実装例。
express-formなどを使ってあらかじめ`req.params.email`の値にバリデーションをかけておく。

```js
auth: function(req, res) {
  User.findOne({ where: { email: req.params.email } }).then(function(user) {
    if (!user) {
      // response
      // 404 NOT FOUND
      // { user: null }
      res.status(404).json({ user });
    }

    user.authenticate(req.params.password, function(err, isValid) {
      if (err) {
        res.status(500).json({ err });
      }
      res.json({ user });
    });
  });
}
```