OmniAICreator/Qiita-1.07M huggingface dataset:
PetaLinux / MicroZed > U. MTD(Memory Technology Device)の中身

```txt:動作環境
PetaLinux 2014.4
MicroZed
```

2014年のメモより。

MTD (Memory Technology Device) – QSPI Flashなどのこと

cat /proc/mtdでubootなどのサイズやmtdxへの割当てを知ることができる
MicroZedのQSPIで起動した時の cat /proc/mtdの結果は

```bash
dev:    size   erasesize  name
mtd0: 00100000 00010000 "qspi-fsbl-uboot"
mtd1: 00500000 00010000 "qspi-linux"
mtd2: 00020000 00010000 "qspi-device-tree"
mtd3: 005e0000 00010000 "qspi-rootfs"
mtd4: 00400000 00010000 "qspi-bitstream"
```

MicroZedをmicroSD(XSDK作成したboot.binとpetalinux-buildで作成したimage.ub使用)で起動した時の  cat /proc/mtdの結果

```bash
dev:    size   erasesize  name
mtd0: 00500000 00010000 "boot"
mtd1: 00020000 00010000 "bootenv"
mtd2: 00a80000 00010000 "kernel"
mtd3: 00060000 00010000 "spare"
```

system.dtsなどdevice tree blobで定義しているものが反映されると思われる。
 
ramdisk起動での動作にするためにはこの部分が理解が必要と思われる。
PetaLinux / MicroZed > T. POSIXスレッド > 設定などの情報

```txt:動作環境
PetaLinux 2014.4
MicroZed
```

2014年のメモより。

### T-1. 標準スタックサイズ on MicroZed

[ここ](http://codezine.jp/article/detail/1970?p=2)にあるプログラムにてPOSIXスレッドの標準スタックサイズを計測できる
MicroZed上でPetaLinuxを起動して実行してみたのが以下。

```bash
root@zynq-microzed-z7010:~# /bin/myapp
Default stack size 8388608[8M]; guard size 4096 minimum is 16384[16K]
set stack size  is 1023410176 [976M] pthread_create error. [11][Resource temporarily unavailable]
memory allocate is 1023410176 [976M] malloc error. [12][Cannot allocate memory]
inner thread : [0xb6bfee54]
inner thread : [0xb63fde54]
```

デフォルトでは8MBとのこと。
上記、pthread_createとmallocにてエラーがでている。

### T-2. POSIX スレッドのimplementationの確認

```bash
$ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.12
```

NPTL : Native POSIX Thread Library

### T-3. command > 設定可能な優先度の範囲表示

util-linuxパッケージに含まれる chrt コマンドを使う

```bash
$ chrt -m
SCHED_OTHER min/max priority    : 0/0
SCHED_FIFO min/max priority     : 1/99
SCHED_RR min/max priority       : 1/99
SCHED_BATCH min/max priority    : 0/0
SCHED_IDLE min/max priority     : 0/0
```

優先度を設定する場合、 SCHED_FIFO を使うことになる。 上記にて 1 から 99 の範囲で設定できることが分かる。
優先度は、**数値が大きい方が優先度が高い**。
様々な言語における並行、並列処理(Java編)

前回と同じことをJavaでしてみよう。

```java:long.java

public class Main {

    private static final int REPEAT = 500000000;

    private static long a = 0;

    public static void main(String[] args) throws InterruptedException{

        Thread th1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <REPEAT; i++){
                    a = 1;
                    check();
                }
            }
        });

        Thread th2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <REPEAT; i++){
                    a = -1;
                    check();
                }
            }
        });

        th1.start();
        th2.start();

        th1.join();
        th2.join();

        System.out.println("FINISHED!");
    }

    private static void check(){
        if(a != 1 && a != -1){
            System.out.println("LONG VALUE HAS BROKEN!");
        }
    }
}
```

排他制御ではないが、Javaで同様の問題を解決するにはvolatile修飾子がある
`private volatile static long a = 0;`
とすれば問題がなくなる。

volatileには「値の参照の際に、常に最新の値を見に行く」という性質があり、
ざっくり言えば、volatileの代入や参照はロックされているような振る舞いをする。

でもこれでは安全と言えないので、AtomicLongを使う。
アトミック: 不可分操作。ある操作を行なうときに他者がその操作に割り込めないことを指す。
`private static AtomicLong a = new AtomicLong(0)`

>引用: http://d.hatena.ne.jp/cero-t/20120830/1346267076

Javaでの排他制御には、synchronizedブロックが使える。

```java:synchronized
public class Main {

    private static final int REPEAT = 500000000;

    private static Long a = new Long(0);

    public static void main(String[] args) throws InterruptedException{

        Thread th1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <REPEAT; i++){
                    synchronized (a){
                        a = new Long(1);
                        check();
                    }
                }
            }
        });

        Thread th2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i <REPEAT; i++){
                    synchronized (a) {
                        a = new Long(-1);
                        check();
                    }
                }
            }
        });

        th1.start();
        th2.start();

        th1.join();
        th2.join();

        System.out.println("FINISHED!");
    }

    private static void check(){
        if(a != 1 && a != -1){
            System.out.println("LONG VALUE HAS BROKEN!");
        }
    }
}
```
Javaで並列処理を行うには、Stream#parallelが使える。

```java:parallel
public class Main {

    public static void main(String[] args) {
	// write your code here
        IntStream.range(1,10).parallel().forEach(System.out::println);
    }
}
```
PetaLinux / MicroZed > S. uweb (httpdサーバ)の起動解除

```txt:動作環境
PetaLinux 2014.4
MicroZed
```

2014年のメモより。

PetaLinuxデフォルトで起動するhttpdサーバ(uweb)は以下の手順で起動解除できる

1. rootfsの設定変更を行うconfigコマンドを実行
   - ```$ petalinux-config -c rootfs```
2. Appsを選択してEnterを押す
3. uWebを選択してSpaceを押して選択を解除
4. Saveを選択してEnterを押す
5. カーネルの再ビルドをする
   - ```$ petalinux-build```

以降の作業は「[C. アプリケーションプログラムの作成](http://qiita.com/7of9/items/025446735fec16f6a56a
)」に基づく
MACアドレスの設定

PCIのEthernetカードはMACアドレスがEEPROMに焼かれていますが、SOCでのEthernetサポートはMACアドレスはflashに保存されていてOSブート時にflashから読み出して設定するようになっています。

FreeBSDでのMACアドレスの設定は以下のような方法があります。

* hintsにMACアドレスを直接書く
* hintsにMACアドレスのFlashのアドレスを書く
* dtsにMACアドレスを直接書く
* dtsにMACアドレスのFlashのアドレスを書く
* ブートローダーから渡された値を使用
* rcでflashを読んでifconfig etherで設定
* ドライバが乱数で生成

これらはEthernetドライバが対応している事が条件になります。大抵のドライバは設定が無い場合はデフォルトのMACアドレスがハードコードされています。

AtherosのSOCのInterfaceのargeはflashから読み込みコードが実装されています。これはcfiなflashな場合について、flashの指定アドレスから読み込みます。指定は以下のようにhintsでおこないます。

```
hint.arge.0.eeprommac=0xbfff120c
```

設定はcfiの中の相対アドレスではなく物理アドレスになります。この設定のターゲットは

```
cfi0 at mem 0xbe000000-0xbfffffff on nexus0
```

となっていて、flashの相対アドレスの0x1ff120cから読み出している事になります。

~~SPIなflashを使ったターゲットではこの仕組みは機能しません。~~と思ったのですが、SPIなflashでも中身がメモリにマップされて読めるSOCであればcfiと同じようにアクセスできるような気がします。

FON2201ではFlashの最後の64KにAtherosが規定したデータがありこの中にMACアドレスがあります。この構造はsys/dev/ath/ath_hal/ah_soc.hに定義があります。以下のようにこれを読んでrcで設定することができます。

```
        # Import MAC addresses with known names
        MAGIC=`dd if=/dev/flash/spi0 bs=0x10000 skip=0x7f count=1 2>/dev/null | 
od -tx4 -N 4 | awk '/0000000/{print $2}'`
        if [ ${MAGIC} = "35333131" ]; then
                kenv WIFI_MAC_ADDR=`dd if=/dev/flash/spi0 bs=0x10000 skip=0x7f c
ount=1 2>/dev/null | od -t x1 | awk '/^0000140/{print $2":"$3":"$4":"$5":"$6":"$
7}'`
                kenv LAN_MAC_ADDR=`dd if=/dev/flash/spi0 bs=0x10000 skip=0x7f co
unt=1 2>/dev/null | od -t x1 | awk '/^0000140/{print $8":"$9":"$10":"$11":"$12":
"$13}'`

                ifconfig are0 ether `kenv LAN_MAC_ADDR`
        fi
```

geom_redbootはこの領域をパティションにしないので、flash全体から読み出しています。ddを使っているのはodでスキップすると遅いからです。

以前はodのjオプションを使っていましたが、512単位以外のjオプションの指定ができなくなったので、使わないようにしました。

誤って一バイト目の上位ビットが立ったMACアドレスを設定してしまうと、パケットがブロードキャストとして扱われ通信できなくなるので注意が必要です。

RT1310のターゲットのBuffalo WZR2-G300NのFlashをダンプしてMACアドレスを探してみたのですが見つかりません。どうもこの機種はWIFIチップにEEPROMが付いていて、そこにMACアドレスが入っていて、それをEthernetでも使い回しているのではないかと考えられます。

RT1310のインターフェースのfvはdtsで設定できるようにしてあるので、この機能で設定してください。

```
&enet0 {
        local-mac-address = [ 00 1a f1 01 1f 23 ];
};
```

RalinkのインターフェースのrtではカーネルオプションのUSE_GENERATED_MAC_ADDRESSで乱数でMACアドレスを生成する機能があります。

dev/usb/net/if_muge.cにも乱数でMACアドレスを生成する機能があるようです。

EtherチップのMACアドレスの設定方法は2種類あって、レジスタに放り込む方法とsetupframeというパケットに含めて送信する方法です。これはチップによって違ってて、areはレジスタに設定していてfvはsetupframeを使っています。

以下はu-bootの環境変数から拾い出すスクリプトです。

```
ENVPAT="/dev/flash/spi0s.u-boot-env"

        kenvmac=`kenv -q LAN_MAC_ADDR`
        if [ -z "$kenvmac" ]; then

                ETHADDR=`strings ${ENVPAT} | grep "^ethaddr="`
                if [ -n "$ETHADDR" ]; then
                        kenv LAN_MAC_ADDR=`echo ${ETHADDR} | awk -F"=" '{gsub("\"","",$2);print $2}'`

                        ifconfig rt0 ether `kenv LAN_MAC_ADDR`
                fi

        fi

```
Confluence > ページの削除 > 権限設定が必要

```txt:動作環境
Atlassian Confluence
```

Confluenceの使用を停止することになったため、ナレッジベースの情報を移行・整理していく。

移行済みのナレッジベースのページ削除をしようとしたが、その機能が見つからない。

https://confluence.atlassian.com/conf54/confluence-user-s-guide/organising-content/working-with-pages/deleting-a-page#DeletingaPage-Deletingallversionsofapage

> To do that, you need the 'Delete Pages' permission. See Space permissions. 

権限設定が必要のようだ。
JIRAで特定の課題のサブタスクを検索する

複数のサブタスクに一括で変更を加えたいことがたまにあると思いますが、通常の課題と違ってスクラムボードでは複数選択できません。

そこで、課題検索で対象のサブタスクをリストアップし、一括変更を行います。
その際、特定の課題のサブタスクであることがほとんどであると思います。

特定の課題のサブタスクを検索するJQLはこのようになります。

```
parent = HOGE-555
```

知っていればめちゃくちゃ簡単ですが、意外とわからなかったりしますね。
クラウド上の LB + SSL アクセラレーター + unicorn + Rails で HTTPS オンリーなアプリケーションを提供するための設定

下記のシンプルな構成を実現したかった。

* クラウド上の LB はグローバル IP を持ち HTTPS:443 のみ LISTEN
* LB の SSL アクセラレーターで SSL リクエストをターミネート
* バックエンドの unicorn + rails アプリには平文のリクエストがプロキシされる

んだけど、検索すると nginx で `HTTP_X_FORWARDED_PROTO=https` を設定しろ、という情報ばかりでハマりまくってしまった。
いろいろ調べまくったせいでどこのサイトで見つけた記述か失念しまったけど、最終的には `unicorn.conf.rb` に下記を記述するとよいことが分かった。

```
# for serving https only application
HttpRequest::DEFAULTS["rack.url_scheme"] = "https"
HttpRequest::DEFAULTS["HTTPS"] = "on"
HttpRequest::DEFAULTS["HTTP_X_FORWARDED_PROTO"] = "https"
```

## 参考資料

* [Why am I getting infinite redirect loop with force\_ssl in my Rails app? \- Stack Overflow](http://stackoverflow.com/questions/9448168/why-am-i-getting-infinite-redirect-loop-with-force-ssl-in-my-rails-app)
ショートカットを活用しよう - 20 - (Excel) Alt + Shift + →

# Excel での <kbd><kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>→</kbd></kbd>の効果
行または列のグループ化を行います。
行または列を選択してショートカット操作を行うと次のダイアログが表示されます。
![Excel05.png](https://qiita-image-store.s3.amazonaws.com/0/156225/fada8218-915b-1bbf-992d-340c457b21af.png)
※行または列を全体を選択している場合は、自動的に判断されます

例えば次のような状態のとき。
![Excel07.png](https://qiita-image-store.s3.amazonaws.com/0/156225/8966fedf-df8f-d408-d1c4-05d9be709afb.png)

次のように選択してグループ化します。
![Excel08.png](https://qiita-image-store.s3.amazonaws.com/0/156225/8e429bb6-1f59-b6d1-268b-7a4bd72a99cc.png)

デフォルトだと集計用として折りたたみ用のボタンは選択した範囲の下になりますので、これを上にしたい場合アウトラインの設定を行います。
リボンからだと、[データ]タブの[アウトライン]グループのグループ枠の右側のボタンを押すことで表示されます。
![Excel09.png](https://qiita-image-store.s3.amazonaws.com/0/156225/50b4ead2-381d-2584-b45a-4080020b886c.png)
![Excel10.png](https://qiita-image-store.s3.amazonaws.com/0/156225/cb471e7a-8074-fdd0-c711-3afbafbee795.png)

ショートカットについては、このダイアログを直接呼出すショートカットはなさそうなので、次のOffice 2003のメニューキーシーケンスで呼びます。
<kbd><kbd>Alt</kbd>, <kbd>D</kbd>, <kbd>G</kbd>, <kbd>E</kbd></kbd>：アウトラインの設定ダイアログの表示

なお、グループ化を解除する場合は次のショートカットです。
<kbd><kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>←</kbd></kbd>：選択範囲のグループ化の解除（グループの解除ダイアログの表示）


以上

|前回|方針|次回|
|:--|:--:|--:|
|[(Excel) <kbd>Space</kbd>の各種効果](http://qiita.com/rrryutaro/items/4b7a01e03cfa594ba615)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|(まだ)|
Concrete CMS を AWS ELB 等、ロードバランサー配下で使う方法


Concrete CMS v5.7 以降

Concrete CMS ログイン直後に直ぐにログアウトされてしまう現象が起こる場合があります。

Load Balancer (AWS ELB 等), Cloudflare などのサービスを利用していると起こる現象です。

その場合は、下記のコードを、/application/config/concrete.php にアップロードしてください。

```
<?php
/**
 * Always trust incoming request.
 * 
 * For more detail, see: http://symfony.com/doc/current/cookbook/request/load_balancer_reverse_proxy.html
 */
// Get remote address
$remoteIp = $_SERVER['REMOTE_ADDR'];
return array(
    'security' => array(
        'trusted_proxies' => array(
            'ips' => array($remoteIp),
        ),
    ),
);
```

これでログアウトしなくなります。
デバッグについての個人的まとめ

#この記事を書いた理由#
プログラムをデバッグするうえでの考え方や思い当たる原因を書いていきます。
考えの基となる材料や基本が無いと、何も思いつかないし、考えられません。

#基本となる考え方

###<font color="MediumBlue">全体の流れ</color>###
問題(現象)発生→事実を集める(観察 or 分析)→仮説を立てる(推論)→調査→原因特定→対策

問題発生→仮説を立てる(推論・直感)→事実を集める(調査 or 観察 or 分析)→対策提案


###<font color="MediumBlue">問題の切り分け</color>###
問題発生→遡ってプログラムを調べる→箇所の特定(処理過程のどこで問題が起こったか)→仮説を立てる・事実を集める→原因の特定

プログラムが上から下と処理されていく過程で、どこで問題が起こったのかを特定することが最優先です。
闇雲に調査をしても時間が経つばかりなので、段階的に原因と思われる箇所を排除していきます。そのため、調査箇所でここで問題は起こっていないということを調べていき、原因を徐々に絞っていきます。起点はlogで、遡っていく形を取ります。
例
データ→プログラム1→プログラム1を呼び出すプログラム2

###<font color="MediumBlue">考える順序</color>###

[問題解決についての個人的まとめ](http://qiita.com/Amebayashi/items/316b7e1a8bf4902f584a)

###<font color="MediumBlue">ウェブアプリケーションの流れ</color>###

どこで問題が起きたのかを意識して調査しましょう。

![WEBAPPの流れ.PNG](https://qiita-image-store.s3.amazonaws.com/0/124488/1353affb-f560-9f9a-c8a7-4b299c092ce2.png)

###<font color="MediumBlue">バッチの流れ</color>###

どこで問題が起きたのかを意識して調査しましょう。

![バッチの流れ.PNG](https://qiita-image-store.s3.amazonaws.com/0/124488/66079a00-ced7-e229-0a16-d240b61b86fa.png)


###<font color="MediumBlue">ログの追い方</color>###
バッチアプリケーションだったら・・・、というかまずはログを見ます。

まずはlogを追う。
↓
logにエラーメッセージが出ている
↓
エラーメッセージでgrepし、発生ソースを特定
↓
ソースの前後で怪しいところがないかを1行ずつ確認
↓
落ちているところ/怪しいところを確認
↓
落ちているところを手動で実行してみる。
↓
結果を考察する

###<font color="MediumBlue">SQLの検証の仕方</color>###
コードに埋め込まれたSQLが怪しいな、と思ったら以下のような検証をしてみましょう。

コードに書かれているSQLを整形し、実際に流れるかを試す
↓
JOIN部分を1つずつ消し、どこのテーブルのデータが無いかを調べる


###<font color="MediumBlue">WebアプリケーションのCRUDのたどり方</color>###
Webアプリケーションの内部ではCRUD操作が行われていることがありますがその部分で目的のデータが
取れない場合についてのたどり方です。

DAOコードに埋め込んだSQLを流して、取れるか調べる
↓
取れなければ、DAOコードの返り値を見る
↓
他にも関連するプログラムが呼ばれているかをさかのぼって、探す


#調査観点一覧#

フローチャートのように調査順序を記載してないので、追記していく予定です

###<font color="MediumBlue">データ</color>###

| 観点       |
|:-----------------|
|対象のデータは正しいか|
|別のデータではどうか|
|実行スキーマは正しいか|
|参照先テーブルは正しいか(DAO・シノニム)|
|DAOの条件は正しいか|
|登録先・削除・更新先のテーブルは正しいか|
|レコードをいじったらどうなるか(削除フラグなど)|
|PL/SQLの引数の数、引数の値は正しいか|
|GUIソフトでPL/SQLを実行出来るか|
|SQLPLUSでPL/SQLを実行出来るか|
|SQLの実行結果は正しいか|
|実行権限、select,insertなど権限は正しく設定されているか|
|Insert、Update先のカラムはnot nullか|

###<font color="MediumBlue">ソース</color>###

| 観点       |
|:-----------------|
|処理ごとにデバッグ文を記載してみて、どこで落ちるか|
|怪しいとこをコメントアウトしたら処理が通るか|
|資材は更新されているか(eclipse)|
|ビルド・コンパイルされているか|
|デプロイされているか|
|SVNは最新か|
|クラスファイルの生成日時は最新か|
|手動実行できるか|
|スケジューラーソフトから起動できるか|
|APサーバーのログに手がかりがないか|
|その他のログに手がかりがないか|
|古いソースを使っていないか|
|処理に沿って動いているか(ソースを追う)|
|Eclipseで1行ずつデバッグ|
|他のソースで置き換えて実行できるか(定数とか)|
|他のソースと比べてみてどうか|
|実装漏れは無いか(反映されてない画面項目の変数がもれなく処理に追加されているかなど)|
|処理順序を変更すると変わるか|
技術英語 > Through the years I['ve morphed] so many times / survival of the fittest

@ http://thecodist.com/article/yes_i_still_want_to_be_doing_this_at_56

> Through the years I'**ve morphed** so many times I may as well be in a Wolfman movie (which was my nickname in high school).

意訳「何年もの間、私は多くの変化をとげてきた。まるで狼男の映画に出てくるように (それは私の高校時代のニックネームだった)」

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

> survival of the fittest

適者生存。
https://ja.wikipedia.org/wiki/%E9%81%A9%E8%80%85%E7%94%9F%E5%AD%98

周囲の変化が生じ続ける中では、変化に対応し続けることが生き残りの条件。

<hr>
関連して思いだした文章 (ソースを忘れた)
> In an age of decreasing job security, we need to develop vocational skills.

意訳「職業の確保が難しくなっていく時勢においては、我々は職業的な能力を開発しなければならない。」

skillsだったかa skillだったかまでは覚えていない。
zsh+tmux環境でtmuxにSIGWINCHが飛ばない

先日，Mac Miniを購入したのですが，
普段，私がubuntuで使用しているzshの設定をmacOS Sierraに移植する際に色々問題がありました．
その調査と結果について書きます．

## Mac Miniが届く
御存知の通り，iOS端末の開発をする場合，OSの選択肢は一つしかありません．
今までMacを所持していなかったのですが，iOSアプリ開発をする機会が増えそうなこと，また個人的にも興味があったことから，一番安くできるMac Miniを購入しました．

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Thunderbolt2 VGA変換アダプタが届いた！！ <a href="https://t.co/e0jqDqHXGt">pic.twitter.com/e0jqDqHXGt</a></p>&mdash; いちご無双 (@musou1500) <a href="https://twitter.com/musou1500/status/832889358591995904">2017年2月18日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

この時点は今まで通りzsh+tmuxでの開発環境を整えるつもりでいました．

## zsh+tmuxの設定を始めるが．．．
ubuntuでは，tmuxを自動で起動するスクリプトをzplugで読み込ませて使っていました．

こちらの記事を参考に設定したもので，今までなんの問題もなく動いていたのですが．．．．
[[tmux] 端末起動時に自動で新規セッションを作成 or 既存セッションにアタッチ](http://qiita.com/ssh0/items/a9956a74bff8254a606a)

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">ガバガバすぎ <a href="https://t.co/r97op8Lfr9">pic.twitter.com/r97op8Lfr9</a></p>&mdash; いちご無双 (@musou1500) <a href="https://twitter.com/musou1500/status/832998232099680257">2017年2月18日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ターミナルエミュレータ(iTerm2)のウィンドウサイズを変更した際にtmuxのステータスラインのサイズが変更されていません．
プロンプトに文字を打ち込んでみると，プロンプトのサイズも変更されていないようです．
Mac標準のterminal.appでもこの問題は再現しました．

原因の調査中，以下のようなバグレポートを発見し，iTerm2のmasterをビルドしてみたりしますが，解決には至りませんでした．
https://gitlab.com/gnachman/iterm2/issues/3706
http://www.zsh.org/mla/workers/2015/msg00853.html


原因を調査する段階でも

* tmuxのunixドメインソケットが勝手に消される(http://ja.stackoverflow.com/questions/21222/tmux%E3%81%AEunix%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E3%82%92%E6%B6%88%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E7%8A%AF%E4%BA%BA%E3%82%92%E7%89%B9%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84)
* neovimを起動するとなぜかpecoが表示される
* pecoがなぜかcpu120%食ってる

等の問題点が多発．精神的にかなりやられた状態でした．マジ虚無虚無プリン．

なお，「neovimを起動するとなぜかpecoが表示される」については，Ctrl+lで正常な画面に戻ることから，pecoが起動していたのではなく，なぜか正常でない位置に端末の画面が移動していたことが後で判明．

## 原因調査の結果
なぜかtmuxに`SIGWINCH`が飛んでいないことまではわかりました．
実際に手動で`killall -SIGWINCH`してみるとtmuxのウィンドウがリサイズされることが確認できました．
色々バグレポートを漁ったのですが，わかったのはここまでです．

さらに，なぜかBash+tmuxだと問題が起こらないことが判明し，Bashに移行するに至りました．
試行錯誤の結果，メインのシェルとして快適に使える程度には設定できたので，それについてはまた別の記事で書きます．

同じ問題に遭遇し，解決された方，または解決には至らなかったものの調査過程で何かを得られた，という方がいらっしゃいましたらコメント欄にてご教授いただければ幸いです．
ルートディレクトリにroot権限を与える

　＃ルートディレクトリとは
ルートディレクトリとはディレクトリにおいて一番上のところのこと。
例えばその直下にindex.phpをおけばlocalhostを起動すると自動でそれが呼ばれる。

#すること
つまりlocalhostを呼んだ時に一番初めのディレクトリとなるのがルートディレクトリ。
その権限はデフォではrootだがchownというコマンドを使うと切り替えられる。
sudo chown username /Library/WebServer/Documents
usernameのところには自分のユーザネームを入れてください。

#注意点
Libraryはルート直下の方です。
homeディレクトリ直下のlibraryでないので注意してください。
usernameとルートの間にスペース空いてることに注意してください。
apache系のコマンドではsudoがよく必要になります。
MySQLクエリメモ

    CREATE DATABASE fullstack CHARACTER SET utf8;

●コンテンツ管理テーブル

    CREATE TABLE dtb_contents(
     content_id int NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,content_title TEXT
    ,content_subtitle TEXT
    ,content_body LONGTEXT
    ,create_date DATETIME
    ,update_date DATETIME
    ,delete_flag TINYINT default 0
    );

●プロフィール管理テーブル

    create table dtb_profile
    (
     profile_id int NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,profile_name varchar(256)
    ,profile_body text
    ,profile_image_file_name varchar(256)
    ,create_date datetime DEFAULT NULL
    ,update_date datetime DEFAULT NULL
    ,delete_flag tinyint(4) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

●画像ファイル管理テーブル

	CREATE TABLE dtb_images(
	 image_id int NOT NULL AUTO_INCREMENT PRIMARY KEY
	,image_file_name TEXT
	,image_alt TEXT
	,create_date DATETIME
	,update_date DATETIME
	,delete_flag TINYINT default 0
	);
HTMLを直でいじってた人がHugoを使ってみた感想

## 書いてる人の属性
* 趣味でいくつかHPを作って運営している
* 同人音楽サークルのHPとか
* ブログとか頻繁に更新する要素はあまりない  
→ あってもリリース情報とかライブ情報くらい
* とはいえ、似たような記述を何度も書くのは疲れる
* コンソールとかコマンドプロンプトに苦手意識はないタイプ

## もっと更新が楽にならないか？？
オーソドックスにWorpressとかでも良いんだけど、アクセス数も少ないし、CMSの管理もちょっと面倒。

## 静的サイトジェネレーター
そんな感じでちょっと調べたら「静的サイトジェネレーター」っていうものが大分便利そうだった。
Hugo以外だとMiddlemanとかJekyllが有名みたい？

だいぶアバウトな理解だけど、パーツごとに分けたHTMLやMarkdownをビルド（Hugoの場合「hugo」コマンド）することで、本番用のサイトができあがるって感じ。

## Hugoを選んだ理由
正直直感・・・なんだけど、調べた感じ一番シンプルそうだった。
「HTML直より楽したい」っていう割と不純な動機だったので、利用するのに学習コストかかりすぎるのは嫌だった。
Hugoは公式ドキュメントもしっかりしてるから安心。
https://gohugo.io/

## 何が良いの？
* 公開ファイルはしょせんただの静的なHTMLなのでアクセスが早い。裏でPHPとかのプログラムが動いてない。
* ブログをMarkdownで書ける
* 開発時のローカルサーバーがファイルの更新を検知してくれて便利

``` bat:hoge.bat
hugo server -w
```
ルートフォルダで上のコードを実行するとローカルサーバー(localhost:1313)が立ち上がる。
-w がファイル更新検知オプション。

* HTMLの構造を把握するのが楽  

``` html:index.html
<!DOCTYPE html>
<html lang="ja">

  {{ partial "head.html" . }}

  <body>

    <div id="all">

        <header>

          {{ partial "nav.html" . }}

        </header>

        {{ partial "contents1.html" . }}

        {{ partial "contents2.html" . }}

        {{ partial "footer.html" . }}

    </div>
    <!-- /#all -->

    {{ partial "scripts.html" . }}

  </body>
</html>

```
こんな感じで要素を意味ごとに分けて開発できるので、ごちゃごちゃになったHTMLに惑わされることが少ない。Server Side Includesでナビゲーションバーだけ別ファイルにしたりするのと似た感覚。
・・・偉そうに書いたけど、上の構造を一から全部作ったわけでなく、公式にかっこいいテーマが紹介されてるのでそれを使えば簡単。
[Hugo Themes Site](http://themes.gohugo.io/)

## HTML直書きとくらべてどこがいいの？
上記の繰り返しになっちゃうけど、HTML直書きだと規模が大きくなるにつれて構造を把握するのが難しくなったりする。
Hugoを使えばコンテンツごとにパーツをわけて記述できるので、「あれいまここなんなんだっけ」ということが少なくなる。
また、新規にページを足したいときも既存のHTML構造を気にする必要がない。
→そもそもブログ記事とかリリース情報の追加くらいだったらHTMLを足す必要すらない。

## どんな人におすすめ？
* HPが大きくなるに連れて構造が汚くなるのが嫌って人
* 「Wordpressおそすぎ・・・」って人
* 一人、もしくは少人数で運営している人  
→簡単とはいえ公開にビルドって手順を踏まなきゃいけないから、コマンド入力とか慣れてない人と一緒に使うのは大変。
様々なスキルレベルの人がいる場合は素直にCMSを使ったほうがハッピーそう


ということでHugoを使ってHPを作成したときに感じたことでした。
超便利なので、みんなもこの素晴らしさを体感して欲しい・・・
wandでpdfを画像形式に変換する

#環境
mac sierra
python2.7.12
Wand (0.4.4)
imagemagick 6.9.6-8

#読むのめんどくさい人用
古いimagemagickを入れて対応した
普通にbrewで入れるとimagemagick-7.0.4-10が入ったが仲が良くない。

##インストール

```
pip install Wand

#brewからimagemagickの古いコミットを探してinstall
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
git fetch --unshallow
brew log imagemagick --oneline | grep 6.9.6-8
#4214c58e6c imagemagick: update 6.9.6-8 bottle.
#ab83029a02 imagemagick 6.9.6-8
git checkout 4214c58e6c imagemagick.rb
brew install imagemagick
#Updating Homebrew...
#==> Downloading #https://homebrew.bintray.com/bottles/imagemagick-6.9.6-8.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring imagemagick-6.9.6-8.sierra.bottle.tar.gz
🍺  /usr/local/Cellar/imagemagick/6.9.6-8: 1,465 files, 22.2M
git reset HEAD
git checkout .
git fetch --depth=1
git gc
git prune
```

ソースはこれ

```
from wand.image import Image

# Converting first page into JPG
with Image(filename="1.pdf[0]") as img:
     img.save(filename="1.jpg")
```


<hr>
#出てたエラー

```
brew install imagemagick
pip install Wand
```


pdfから画像に変換したかったのでconvertコマンドを使用しようとしたが、
フォントがないエラーにやる気を削がれる。
http://qiita.com/polikeiji/items/cc0929bc0171b6348f33

wandを使えばいける的な感じの記事を見つける。

いけるのかと思いきやエラー


```
python pdf2png.py 
Traceback (most recent call last):
  File "pdf2png.py", line 9, in <module>
    from wand.image import Image
  File "/Users/miyamoto/.pyenv/versions/miniconda3-3.19.0/envs/py27/lib/python2.7/site-packages/wand/image.py", line 20, in <module>
    from .api import MagickPixelPacket, libc, libmagick, library
  File "/Users/miyamoto/.pyenv/versions/miniconda3-3.19.0/envs/py27/lib/python2.7/site-packages/wand/api.py", line 206, in <module>
    'Try to install:\n  ' + msg)
ImportError: MagickWand shared library not found.
You probably had not installed ImageMagick library.
Try to install:
  brew install freetype imagemagick


```

行けないじゃないか。。。
brew install freetype imagemagick
してもうまくいかぬ。


どうやらimagemagickとのバージョンが合わないのではないだろうか
http://stackoverflow.com/questions/25003117/python-doesnt-find-magickwand-libraries-despite-correct-location

ということで古いバージョンを入れたら動いた。

pypdf2とかいうのもあったのをうまくいった後に見つける。
一旦うまくいったのでいいや。
https://gist.github.com/jrsmith3/9947838

#参考
brewで過去バージョンをインストールする系
http://christina04.hatenablog.com/entry/2017/01/08/120459
Shadertoy はじめました week #2

![img.png](https://qiita-image-store.s3.amazonaws.com/0/2585/48f59e56-a756-d335-5b93-6f5b40b6e1a7.png)

https://www.shadertoy.com/view/MsXyz8

# Shadertoy works with WebGL 2.0!
2017/2/15 に [Shadertoy の v0.9 がリリースされ、WebGL2.0に対応しました](https://twitter.com/Shadertoy/status/832153738479439872)。もっとも、Fragment Shader で遊ぶ Shadertoy では、[Transform Feedback](http://qiita.com/notargs/items/be2fa153e62e3554a773) や[ジオメトリインスタンシング](http://qiita.com/emadurandal/items/1812198d562bd1216c70)は関係ありませんし、Multiple Render Targets や浮動小数点テクスチャにもまだ対応していませんので、恩恵は限定的です。ただ**配列のインデックスに変数が使えるようになった**のは地味にうれしいですね。
というか、いまのところ、過去の大量のWebGL1.0作品において不具合が発生している状況なので、これから徐々に改善していくものと思われます。とりあえず、webGL2.0への移行に伴い **texture2D と textureCube は使えなくなりました**ので、過去の作品をローカル保存している場合は、textureLodなどに書き換えておきましょう。

# Week #2
[Shadertoy はじめました](http://qiita.com/keim_at_si/items/bc8da5535e47b1ada905)から1週間、2つ目を作ってみたのですが、実は上述の WebGL2.0への移行に伴い **WebGL1.0 で動いていたものが WebGL2.0 でクラッシュする**という現象に見舞われてしまいました。
とりあえず[試行錯誤の末](https://twitter.com/mike_at_cg)、超軽量化でどうにか動かしてアップロードして、説明文で「WebGL2.0で動かねーよ」って愚痴を吐いていたら**inigo quilez 大先生から直コメントもらって解決しました！**　こういう感じに天井人からフランクにアドバイスもらえる Shadertoy のコミュニティ素敵（小並感）。ここら辺、~~今は亡き~~ [Wonderfl](http://wonderfl.net/user/keim_at_Si/codes) に似た雰囲気を感じます。

# Tips #2
2週目、といいつつ3週間経ってしまいましたが、２つ目の成果物です。
[Almost physically based glass](https://www.shadertoy.com/view/MsXyz8)
正直、このレベルのレンダリングをブラウザ上でリアルタイムに計算できる時代が来るとは、隔世の感を禁じ得ないです。
... Flash Stage3D も生き残っていれば、このレベルに到達していたのでしょうか。

さて、今回も様々な知見を得ることができました。[前のやつのTips](http://qiita.com/keim_at_si/items/bc8da5535e47b1ada905#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A1%E9%80%B1%E9%96%93)もまだ書けていませんが、旬な最新技術というわけでもないので、ゆっくり書いていけたらと思っています。
- 角丸め正12面体
- 屈折と物体内のSphere Tracing
- 透過光影という妥協点（コースティックできなかった）
- Real time で Multi-path ray tracing。
- 2パス焦点ボケ
- WebGL1.0 における texture のバグと、WebGL2.0 での対応方法（iq先生直伝！）
jQuery自分用メモ

jQuery関係でハマったことなどを、自分用のメモとして残しておきます。

# jQueryの`.each`ループから抜ける方法
`return false`でないと抜けられない。

http://chaika.hatenablog.com/entry/2015/04/02/131506


# 複数要素に対してのgetter

複数要素に対してgetterを実行すると、先頭の要素に対してgetterメソッドが実行されます。
しかし、`.text()`メソッドは例外です。

>マッチした各要素の子孫要素も対象として、連結した要素内のテキストを取得します。
>
http://js.studio-kingdom.com/jquery/manipulation/text

以下、サンプルコードです。

```html
<span>a</span><span>b</span><span>c</span><span>d</span>
```

```js
$("span").html(); // "a"が取得される
$("span").text(); //"abcd"が取得される（例外)
```

公式サイトには、以下のように書かれています。

>Setters affect all elements in a selection, whereas getters return the requested value only for the first element in the selection, with the exception of .text(), which retrieves the values of all the elements.

https://learn.jquery.com/using-jquery-core/working-with-selections/
GS1コードからJANコードに変換するツールを作った

#GS1コードが業界標準なのに発注ソフトがJANコードしか対応してない

メーカーもJANコードとか自社サイトに載せてない。
なのに発注するソフトにはJANコードを入力しないといけない。
つまり、GS1コードの事業者コードとアイテムコードから
JANコードのcheck digitを計算してJANコードにするという作業があって、
それがとても面倒だった。
(ネットで計算できるサイトはあるけど、VDIが導入されていてコピペできない）

#というわけで
ローカルで変換するためのプログラム
https://github.com/kokardy/jan-go
go buildできる環境とは限らないので、
64bit版だけbuildしてbinaryフォルダに入れてある。

標準入力で入力されたGS1コードを一行ずつ読んで、
JANコードにして標準出力する。
一応、GS1コードの読み込み段階でcheck digitを計算して読みミスがないようにしている。

###使い方その1
商品のバーコードをバーコードリーダーで読むと
JANコードにして返してくれる。

###使い方その2
GS1コードの一覧をファイルに書いて、
```
jan-go < gs1_list.txt > jan_list.txt
```
みたいに一気に変換もできる。

参考サイト:
http://www.dsri.jp/jan/check_digit.html
Static Inventory の内容を Dynamic Inventory に変換できた

# Static Inventory の内容を Dynamic Inventory に変換する必要あるの？
そもそもなんでこんなことをしようかと思ったかというと、
- サービスのリリース後に、ホスト(VM)がダウンしたりアップしたり、フェイルオーバーしてサーバと役割の対応が変化したのを検知してインベントリを書き換える手間をなくす。
- サービスリリース時のインベントリはそのまま残しておきたい
- サービスリリース後は静的インベントリを一回参照して、実際に稼働しているホスト情報で上書きして動的インベントリを生成できれば
  安心して ansible を動かすことができる環境が手に入る
- Inventory の内容を Dynamic Inventory に変換できれば、リリース前/後の区別がなくなって便利になる

# 実際に稼働しているホスト情報で上書きする
- ここは個人的のやり方だが、インベントリに書いたグループ/ホスト情報と Consul に登録しているサービス情報を同期させているため、
  静的インベントリからグループ名を取り出し、そのグループについて Consul にどのホストを使用しているかを問い合わせれば
　現在の稼働状況が取得できる。これを動的インベントリ形式で出力すればよい。

# 参考リファレンス
  [Developing Dynamic Inventory Sources](http://docs.ansible.com/ansible/dev_guide/developing_inventory.html)
  [Python API](http://docs.ansible.com/ansible/dev_guide/developing_api.html)
  インベントリを読み込むコードが書いてあったので参考になった

# 静的インベントリをロードするコード
    from ansible.parsing.dataloader import DataLoader
    from ansible.vars import VariableManager
    from ansible.inventory import Inventory

    def _load_ansible_staitc_inventory(filename):
        inventory = Inventory(
            loader = DataLoader(),
            variable_manager = VariableManager(),
            host_list = filename
        )
        return inventory
実はこんだけだった
これさえ解ればあとは、Dynamic Inventory 形式に整形して出力するだけ。(なので省略)

# で、Consul の情報で上書きした動的インベントリ生成するコードがこれ
  [python-ansible-dynamic-inventory](https://github.com/Yoshiyuki-Nakahara/python-ansible-dynamic-inventory)

興味ありましたら参考にしてみてください。
※バグ報告、プルリク大歓迎です。
Spark History Server by Docker

# やりたいこと
 - 開発環境を汚さずにSparkのHistoryサーバーを使いたい！
 - Docker使う場合、他のクラスターで実行した結果を、SparkのHistoryにお手軽に食わせられるようにしたい

# 課題
Dockerを使ってSparkを実行するためのDocker imageは多々あれども、Historyサーバーも含めて自動起動してくれるimageがない！(あっても見つからない)

# 解決方法
既存のDocker imageを構築するDockerfileをHistoryサーバーも起動するように変更する

## ベースとするDockerfile(ビルド対象ソース)
https://github.com/poad/docker-spark/releases/tag/1.6.2

### バージョン
構築するDocker imageの内容は以下の通り。
JavaとHadoopのバージョンは、今回はたまたまこれというだけで、おそらく、別のバージョンでも同じ変更でいけると思う（試してないけど）

| OS/ミドルウェア | バージョン    | 補足                                 |
|:-------------:|:-----------:|:-----------------------------------:|
| CentOS        | 6.5         | 7系だと色々と動かない                   |
| Java          | Oracle JDK7 | Java 8版のimageもあるが、まずはこれ     |
| Apache Hadoop | 2.7.2       |                                     |
| Apache Spark  | 1.6.2       | 2.0.2や2.1.0のimageもあるが、まずはこれ |

# 手順
1. `bootstrap.sh` の `$HADOOP_PREFIX/sbin/start-yarn.sh` の次の行に以下の1行を追加する。
> ```
> ${SPARK_HOME}/sbin/start-history-server.sh
> ```

2. `Dockerfile` に以下の2行を追加する
>```
> RUN mkdir /tmp/spark-events
> 
> EXPOSE 18080
> ```

3. docker runの際に `-p 18080:18080` と`-v /vagrant/logs/spark:/tmp/spark-events` (`/vagrant/logs/spark` は他のクラスターのHistoryを格納するホスト側のパス)の指定を追加する

## 結果

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

: ${HADOOP_PREFIX:=/usr/local/hadoop}

$HADOOP_PREFIX/etc/hadoop/hadoop-env.sh

rm /tmp/*.pid

# installing libraries if any - (resource urls added comma separated to the ACP system variable)
cd $HADOOP_PREFIX/share/hadoop/common ; for cp in ${ACP//,/ }; do  echo == $cp; curl -LO $cp ; done; cd -

# altering the core-site configuration
sed s/HOSTNAME/$HOSTNAME/ /usr/local/hadoop/etc/hadoop/core-site.xml.template > /usr/local/hadoop/etc/hadoop/core-site.xml

# setting spark defaults
echo spark.yarn.jar hdfs:///spark/spark-assembly-1.6.2-hadoop2.6.0.jar > $SPARK_HOME/conf/spark-defaults.conf
cp $SPARK_HOME/conf/metrics.properties.template $SPARK_HOME/conf/metrics.properties

if [ -z "${SPARK_HOME}" ]; then
  export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi

service sshd start
$HADOOP_PREFIX/sbin/start-dfs.sh
$HADOOP_PREFIX/sbin/start-yarn.sh
${SPARK_HOME}/sbin/start-history-server.sh

CMD=${1:-"exit 0"}
if [[ "$CMD" == "-d" ]];
then
	service sshd stop
	/usr/sbin/sshd -D -d
else
	/bin/bash -c "$*"
fi
```

```:Dockerfile
FROM poad/docker-spark:1.6.2

USER root

COPY bootstrap.sh /etc/bootstrap.sh
RUN chown root.root /etc/bootstrap.sh
RUN chmod 700 /etc/bootstrap.sh

RUN mkdir /tmp/spark-events

EXPOSE 18080

ENTRYPOINT ["/etc/bootstrap.sh"]

```

```:起動コマンド
 docker run -d -h sandbox -p 18080:18080 -p 50010:50010 -p 50020:50020 	-p 50070:50070 -p 50075:50075 -p 50090:50090 -p 8020:8020 -p 9000:9000 -p 19888:19888 -p 8030:8030 -p 8031:8031 -p 8032:8032 -p 8033:8033 -p 8040:8040 -p 8042:8042 -p 8088:8088 -p 49707:49707 -p 2122:2122 -v /vagrant/logs/spark:/tmp/spark-events --name spark poad/docker-spark:1.6.2-with-history-server -d
```

# 最後に
ちなみに、Historyサーバーの起動は少し時間がかかる(1分くらい？)ため、それまでは成功しているのかわからない状態が続きます
数秒待機させてからフェードアウト


```c:Fade.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Fade : MonoBehaviour
{
    public float alpha;
    public float speed = 0.005f;
    float red, green, blue;

    IEnumerator Start()
    {
        red = GetComponent<Image>().color.r;
        green = GetComponent<Image>().color.g;
        blue = GetComponent<Image>().color.b;
        enabled = false;
        yield return new WaitForSeconds(5);
        enabled = true;
    }

    void Update()
    {
        GetComponent<Image>().color = new Color(red, green, blue, alpha);
        alpha -= speed;
    }

}
```

> 参考
[Unity-フェードインとフェードアウト](http://qiita.com/fms_pilkul/items/eb9b4bbbb519772c3397)
[【Unity】Startのコルーチン完了後にUpdate処理を開始したい](http://tsubakit1.hateblo.jp/entry/2015/11/16/000000)
[短文ネタ]Dockerを動かせるユーザはホストのrootを奪える、という話

Arch LinuxのWikiに気になる記述が。
https://wiki.archlinuxjp.org/index.php/Docker
> 警告: ユーザーを 'docker' グループに追加することは root にするのと同義です。詳しくは [2] や [3] を参照。

ということで、調べてみた。
大体はここに載っているとおり。
https://www.andreas-jung.com/contents/on-docker-security-docker-group-considered-harmful

volume使うとなんでもありです。試しに、シェルから/rootにファイルを作ってみました。

```shell-session
[penguin@arch ~]$ docker run -it -v /:/mnt busybox sh
/ # chroot mnt && su -
[root@8128f6a7dad3 /]# cd
[root@8128f6a7dad3 ~]# echo you are hacked > /root/hello_docker
```
さてはて。ホストOSでは。

```shell-session
[penguin@arch ~]$ sudo cat /root/hello_docker
you are hacked
```

というわけなので、無闇矢鱈にユーザをdockerグループに加えないよう、注意しましょう。
App.configをビルドターゲットによって書き換える

# 概要
Web.configだとデフォルトで対応していますが、コンソールアプリの場合などは、.csprojectを書き換えたりしないといけません。

# ビルドターゲットに応じたファイルを作成する。

```xml:App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="setting1" value="settingvalue"/>
    <add key="setting2" value="settingvalue"/>
  </appSettings>
</configuration>
````


```xml:App.Debug.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" />
```

```xml:App.Release.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appSettings>
    <add key="setting1" value="settingvalue-release" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
  </appSettings>
</configuration>
```

# .csprojectファイルを編集する

```xml:project.csproject
  <ItemGroup>
    <None Include="App.config" />
    <None Include="App.Debug.config" />
    <None Include="App.Release.config" />
  </ItemGroup>
```

これを、下記の通り変更する。

```xml:project.csproject
  <ItemGroup>
    <Content Include="App.config" />
    <Content Include="App.Debug.config">
      <DependentUpon>App.config</DependentUpon>
      <SubType>Designer</SubType>
    </Content>
    <Content Include="App.Release.config">
      <DependentUpon>App.config</DependentUpon>
      <SubType>Designer</SubType>
    </Content>
  </ItemGroup>
```

```xml
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
```

の下に、下記を追加

```xml
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="exists('app.$(Configuration).config')">
  <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
  <ItemGroup>
    <AppConfigWithTargetPath Remove="app.config" />
    <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
      <TargetPath>$(TargetFileName).config</TargetPath>
    </AppConfigWithTargetPath>
  </ItemGroup>
</Target>
```
3分でわかるデザインパターン入門(GoF)

# はじめに
- [『PHPによるデザインパターン入門(秀和システム出版)』](https://www.amazon.co.jp/PHP%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E4%B8%8B%E5%B2%A1-%E7%A7%80%E5%B9%B8/dp/4798015164)という本の読書メモです。
- 本で紹介されているオブジェクト指向による設計(デザインパターン)の基本GoF全23パターンのまとめのまとめ。
- 具体的例が分かりやすく且つ実用的なので、読んだことないオブジェクト指向初心者は一度目を通すと良いかもです。

# GoF　全23パターン

ちなみにGoF(Gang of Four)とはこのデザインパターンを作成した4人組のこと。(花男のF4みたい...)
難易度と実用度は**独断**と**偏見**です。本には書かれていません。

難易度：
★　　　　理解しやすい
★★　　　少し複雑だけどちゃんと読めば理解できる
★★★　　ちゃんと読んだけどいまいち理解できなかった

実用度：
★　　　　使うのかなコレ
★★　　　知っておいたら役に立ちそう
★★★　　よく使っている・使えそう

### 1.Template Method
難易度:★
実用度:★★★
処理の一部をサブクラスで実装。よくある継承。

### 2.Singleton
難易度:★
実用度:★★
生成するオブジェクトの数を制限する。

### 3.Adapter
難易度:★
実用度:★★★
APIの異なるクラス同士をつなぎ合わせる。継承と移譲の2通りのやり方があるが、基本どちらもAdapterメソッド内でつなぎ合わせ先のメソッドを呼ぶ形になる。

### 4.Factory Method
難易度:★
実用度:★★★
クラスの処理(例:csv,xmlファイルを読み込む)とどのクラスを呼ぶか決める。流れは同じだけど、処理(例:それぞれのファイルの読み込み方)がものによって別のものに使える。

### 5.Facade
難易度:★
実用度:★★★
ファサード。仏語で窓口。クラス同士の複雑な関係を意識しなくていいように、窓口を一つ与える。

### 6.Iterator
難易度:★★★
実用度:★★
不規則な多次元配列でも、内部構造を意識せずにそれぞれの要素にアクセスできる。
phpならSPLの機能のIteratorインターフェース等を継承させる。

### 7.Abstract Factory
難易度:★★
実用度:★★★
例えば扱うデータがDBかMOCKか最初に宣言すれば、あとは芋づる式にそれぞれの処理のクラスが使われるようになる。

### 8.Bridge
難易度:★★
実用度:★★★
機能(例:ボタンを押す)と実装(例:押したらクイックソートされる)を分ける。
インターフェースが利用者に提供するAPIを定義することで機能と実装の橋渡しがされる。

### 9.Builder
難易度:★
実用度:★★★
異なる材料(例:読み込ませるファイル)だが同じ手順(open,read,close)でオブジェクトを生成させる。

### 10.Chain of Responsibility
難易度:★★
実用度:★★★
よくやるフォームのバリデーションみたいな。オブジェクト同士の結びつきを緩める。

### 11.Command
難易度:★★
実用度:★★
要求に対する受付と処理を切り離して実装できる。またクラスに実装したコマンド結果を保持させているので、UndoやRedoもできる。

### 12.Composite
難易度:★★
実用度:★★
木構造を表す。単一のオブジェクトとオブジェクトの集合体を混ぜてアクセス方法を同じに。(例:組織とそれに属する社員を表示させる。)

### 13.Decorator
難易度:★★
実用度:★
基本となるものに様々な機能を付け加えていく。追加する側のクラスが、される側のクラスのインスタンスを保持しているため、ユーザー側は追加機能が加えられていようがいなくまいが同一視して扱える。(例：入力した文字を加工し表示する)

### 14.Flyweight
難易度:★
実用度:★★★
一度インスタンス化したオブジェクトを、生成時に読み込んだ内容を保持させることでオブジェクトを使い回す。生成されるオブジェクトの時間やリソースが抑えられる。ただし、使い回して良いオブジェクトは環境によって変化しないものに限る。

### 15.Interpreter
難易度:★★
実用度:★
字句解析(文字列を意味ある字句に分解)と構文解析(分解した字句それぞれが文法に従っているかチェック)を行った構文木を処理するパターン。ミニ言語とか作れてしまう。

### 16.Mediator
難易度:★★★
実用度:★
オブジェクト同士の依存や関係を把握・仲介してくれるもの(例：ユーザーとチャットルームの管理)

### 17.Mement(Snapshot)
難易度:★★★
実用度:★
ある時点でのオブジェクトの中身を記憶し、あとで思い出せるようにする。

### 18.Observer
難易度:★★
実用度:★★
あるオブジェクトの状態が変化した時に、関係する他のすべてのオブジェクトに通知とそれに応じた処理を行わせる。

### 19.Prototype
難易度:★
実用度:★★
インスタンスをコピーして新しいインスタンスを生成する。深いコピーと浅いコピー(中身のオブジェクトも複製するか否か)がある。

### 20.Proxy
難易度:★★
実用度:★★
身代わりとなるオブジェクトを通じて、目的のオブジェクトにアクセスさせる。

### 21.State
難易度:★
実用度:★★
状態をクラスで表し、状態ごとに振る舞いを切り替えられるようにする。

### 22.Strategy
難易度:★★
実用度:★★
パターンごとの処理のクラスを用意。それにアクセスするための処理を書いたクラスを用意。

### 23.Visitor
難易度:★★★
実用度:★
データ構造とそれに対する処理(操作がデータ構造を渡り歩く)を別々にする。

# おわりに
思い出すきっかけになれば。
PyTorchリンク集

<img src='https://qiita-image-store.s3.amazonaws.com/0/35293/a8fc701e-724c-9b4e-6b05-4fd842d4af4e.png' width=600px/>

適宜更新PR歓迎

# 本家
- [pytorch.org](http://pytorch.org/)
- [github.com/pytorch/pytorch](https://github.com/pytorch/pytorch)
- [github.com/pytorch/tutorials](https://github.com/pytorch/tutorials)
  - 下記[チュートリアル系](http://qiita.com/sotetsuk/items/313d2e844959f28bc225#%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E7%B3%BB)で簡単にどんなものか書きました。
- [github.com/pytorch/examples](https://github.com/pytorch/examples)

# チュートリアル系

- [github.com/pytorch/tutorials](https://github.com/pytorch/tutorials)
  - [Deep Learning with PyTorch: A 60-minute Blitz](https://github.com/pytorch/tutorials/blob/master/Deep%20Learning%20with%20PyTorch.ipynb) Jupyterで基本的な仕組み・演算・NNの組み方を解説している。最初に読むべきチュートリアル。
  - [Creating extensions using numpy and scipy](https://github.com/pytorch/tutorials/blob/master/Creating%20extensions%20using%20numpy%20and%20scipy.ipynb) 自分で微分可能な関数を定義する拡張の仕方が簡単に説明してある。
- [jcjohnson/pytorch-examples](https://github.com/jcjohnson/pytorch-examples)
  - 簡単なNNを最初に純NumPyで実装してから、少しずつPyTorchの機能で書き換えていくことでPyTorchの機能と使い方を解説している。自分でNNモデルや微分可能な関数を定義する実用的なところも分かりやすい。本家のチュートリアルより分かりやすいかもしれない。必読に近いと思われる。
- [practical-pytorch/seq2seq-translation/seq2seq-translation.ipynb](https://github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb)
  - Seq2seqの実装を解説

# まとめ系
- [The Incredible PyTorch](https://github.com/ritchieng/the-incredible-pytorch)
  - Awesome-XXXXXXにインスパイアされてるらしい。

# 応用・実装
- [Generative Adversarial Networks (GANs) in 50 lines of code (PyTorch)](https://medium.com/@devnag/generative-adversarial-networks-gans-in-50-lines-of-code-pytorch-e81b79659e3f#.xn1j5xk6e)
  - GANを50行で書くという野心的な試み
- [PyTorchでA3C - rarilureloの日記](http://ralo23.hatenablog.com/entry/2017/02/02/193611)
- [github.com/ikostrikov/pytorch-a3c](https://github.com/ikostrikov/pytorch-a3c)
- [github.com/OpenNMT/OpenNMT-py](https://github.com/OpenNMT/OpenNMT-py)
  - OpenNMTのPyTorch版
- [github.com/MaximumEntropy/Seq2Seq-PyTorch](https://github.com/MaximumEntropy/Seq2Seq-PyTorch)
[メモ] TravisCIでnpm run buildしてからS3にデプロイしてCloudFrontで配信する


vue.jsで作成したちょっとしたものをS3+CloudFrontで公開したくて
色々調べたのでメモ。
ついでに前から気になってたTravisCIも使ってみた

# 手順メモ
## 1. travis cli のインストール

```
$ gem install travis
```

## 2. IAM でユーザーを作成する。

S3へのフルアクセスのポリシーをつける。

## 3. S3 でバケットを作成する。

- バケット名はウェブサイトホスティングで公開するときのFQDNにしておく
- `静的ウェブサイト > ウェブサイトホスティングを有効にする` にチェックをつける
    - `インデックスドキュメント` には index.html を指定 

![スクリーンショット 2017-02-20 23.38.08.png](https://qiita-image-store.s3.amazonaws.com/0/55219/0ab85b5b-63d2-cc1d-7c6e-ec55a4bd40b1.png)

end point が {{バケット名}}.s3.amazonaws.com になるはず

## 4. .travis.ymlの設定

- .travis.yml ファイルを以下のように作成する

```yaml:.travis.yml
language: node_js
node_js:
- "6"
before_deploy:
- npm run build
deploy:
  provider: s3
  bucket: {{bucket名}}
  region: ap-northeast-1
  endpoint: {{bucket名}}.s3-ap-northeast-1.amazonaws.com
  skip_cleanup: true
  local-dir: dist
  on:
    branch: master
```

デプロイ前に `npm run build` を実行するように指定
`npm install` , `npm test` はデフォルトで実行してくれた

- AWS S3へのアクセスキーとシークレットキーを追加する

```
$ travis --add deploy.access_key_id {{access_key_id}}
$ travis --add deploy.secret_access_key {{secret_access_key}}
```

.travis.ymlに以下のようにアクセスキーとシークレットキーが追加される

```yml
  access_key_id:
    secure: xxxxxxxxx
  secret_access_key:
    secure: xxxxxxxxx
```

※これを公開してしまっていいのか、よくわからなかった。


これで `git push origin master` すれば、S3の方にビルドしたファイルをアップロードしれくれる(はず)

## 5. CloudFront でDistributionの作成

- Origin Domain Name に 先程の S3 のエンドポイントを指定する (プルダウンで候補が表示される)
- `Restrict Bucket Access` の `Yes` にチェックをつける
- `Origin Access Identity` は `Create a New Identity` を指定する
- `Comment` は適当に指定
- `Grant Read Permissions on Bucket` に `Yes ~` を指定する(S3のアクセスポリシーを更新してくれる) 

![スクリーンショット 2017-02-20 23.45.47.png](https://qiita-image-store.s3.amazonaws.com/0/55219/e16621f4-4370-690b-63e7-c5527c5ac39d.png)

- `Alternate Domain Names(CNAMEs)` に公開する予定のFQDNを指定する
- `Default Root Object` に `index.html` を設定

ちょっと時間がかかるがdistributionが作成され、 
xxxxxx.cloudfront.net というドメインが作成される

## 6. Route 53 の設定

Route53 で　設定したいドメインのCNAMEレコードの値に xxxxxx.cloudfront.net を指定する

# 感想
S3での静的ホスティング, TravisCIでのデプロイが思ってたより簡単だった。
ただaccess_keyとsecret_keyは公開してもいいのかよくわかんなくてもやもやする。。。
github.com で調べたところ大体の人は環境変数から取得しているっぽかった
(ただ一部は公開していた)
[社内新人向け]Gitで絶対にオススメなプラグインや設定3つ

社内に新人が増えてきたので、[弊社](http://qiita.com/organizations/itpropartners)のWeb開発でのGitのゆるーい利用方針をまとめます。
な**シリーズ第二弾です**。

第一弾：　 [[社内新人向け]Gitで使ってほしくないコマンド](http://qiita.com/zaramme/items/029d0f9b099e5f929e87)

# 社内環境

- Web系開発がほぼ100％
- ブランチワークはGitflowをベースにしたプルリク駆動開発
- 少人数チームなので、エンジニアは全員LinuxのCUI操作をできて欲しい（vagrantや開発サーバ上の操作など）
  - GitのGUIクライアントは、SourceTreeとGithub公式を試しましたが、初学者が使うと却って危ない挙動をしてしまうケースがあったので、全員CUI操作をしてもらうことにしました
- CIツールはまだ導入できず。各サーバーへのデプロイなどもgitコマンドを手動操作してます。

こんな環境なので、みんなGitの操作にはわりかし詳しいです。逆に言えば、うちで開発実務をやっていれば、Git操作ならある程度どこでも通用するレベルになれるはずです！*(※個人の感想です)*

前置きはここまで。
今回は、Gitをより快適に使いこなすために、個人的にオススメのツールや設定を共有します。
あんまりたくさん紹介してもあれなので、 

- **筆者が日常的に使用しているツールの、**
- **その中でもさらによく使用するめっちゃ使える機能**

に絞っています。

# （1）[Tig](https://jonas.github.io/tig/)

言わずと知れた定番ツール。めっちゃ高機能ですが、
**「あれ、自分は今どこをどう編集しているんだっけ？」** っと思ったら迷わず`tig`を叩きます。

## 用途
- 現在のワークスペースのdiff(何をどう編集しているか)を細かく見たい時 (`tig` -> `s` でステータスビュー)
  - ステータスビューの利点として、「今コミットしようとしている差分(Changes to be committed)」だけでなく、「**コミット対象に含まれていない差分(Changes not staged for commit)**」も合わせて見られることです。これが観れることで、**「特定ファイルだけをコミットし忘れちゃった・・・」** 的な凡ミスがかなり減らせます。
- stashされた内容を見たい時(`tig`-> `y`) 

Mac環境であればHomebrewでサクッと入れてすぐ使えるようになるのも嬉しい。

参考記事: (http://qiita.com/suino/items/b0dae7e00bd7165f79ea)

# （2）[Git-Completion](https://github.com/git/git/blob/master/contrib/completion/git-completion.bash)
gitのタブ補完を有効にしてくれるツール。
コマンドの補完はもちろんですが、強力なのは**ブランチ名補完** と **add対象の絞り込み補完**です。
gitコマンドを打つ速度が30％くらい早くなります。

bashスクリプトなので、`source`コマンドや`.bashrc`に追記すればすぐ使えます。

## 用途
- ブランチ名を入力する時
  - bashの`cd`コマンドと同じように、tabで自動補完
  - tabを二連打すれば、候補が出てきます。ブランチ名がうろ覚えでも安心！
- `git add`する時
  - ファイル名がtabで自動補完されるのはbashと同じですが、**補完候補を実際に差分があるファイルに絞ってくれます。**
    - 例えば、 `src/`ディレクトリ以下で編集したファイルが `src/controller/UsersController.php`しかない場合、`src/`だけ入力してから**Tabを連打する**と、勝手に`src/controller/UsersController.php`まで自動的に補完されます。超便利。
    - 同様に、**TAB二連打** すると、差分があるファイル(ディレクトリ)だけが候補としてでます。これも便利。

参考記事： (http://mawatari.jp/archives/git-completion-bash)

# （3）`git push [現在のブランチ]`を `git cpush`に割り当て(alias設定)

まだちょっと趣が変わり、こちらは`~/.gitconfig`の`[alias]`ディレクティブで設定で使える機能です。
詳しいやり方は↓の記事へ。 
http://qiita.com/tkengo/items/5bae50fb7531d5a6bbcf
(この設定を記事にしてくれた@tkengo様に惜しみない賞賛を送りたいです！本当に助かっています :bow_tone1:）

筆者は「現在のブランチをpush」を`git cpush`(current-push)に割り当てています。

## 用途
- **pushする時は絶対に`git cpush`で！**
  - というのも、開発で`git push`するときの対象ブランチって、ほぼ100％カレントブランチなんですよね。その際に、毎回 `git push develop` とかならまだしも、 `git push hotfix/ITPRO-345_for_master`とか、対応するチケットごとに違うブランチ名を入力するのは完全に手間です。（しかも1文字でも間違えるとpushできないというイライラ仕様)
  - それがブランチ名を気にせず、常に `git cpush`のキータイプ9文字で済むのだから、ノーコストハイリターンです。

-----------------

以上、絶対に自信を持っておすすめできるgitのプラグイン＋設定でした。

**「いや、このプラグインも絶対MUSTでしょ！」** と思った方がいましたら、ぜひコメントいただけますと幸いです！
Xamarin.iOS で Google Maps SDK の地図のキャプチャを取る方法

## iOSネイティブの場合

iOS アプリ開発で Google Maps を使用するには、

* [Google Maps SDK for iOS  ｜  Google Developers](https://developers.google.com/maps/documentation/ios-sdk/?hl=ja)

を使用します。

で、アプリ内で表示している地図の画像をキャプチャするには、以下のようなコードを書くようです。

```objc
UIGraphicsBeginImageContext(mapView_.frame.size);
[mapView_.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenShotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
```

via [Google Maps IOS SDK 1.2 need snapshot of map view - Stack Overflow](http://stackoverflow.com/questions/16090637/google-maps-ios-sdk-1-2-need-snapshot-of-map-view)

さらに、Retinaディスプレイにも対応させたい場合、

* [CoreGraphicsでRetina対応した画像を生成する - Qiita](http://qiita.com/ponkichi4/items/6d43f1e8a2441bb75fe0)

で示されているように、``UIGraphicsBeginImageContextWithOptions(ICON_SIZE, NO, 0);`` とするようです。

## Xamarin.iOS の場合

以上のようなiOSネイティブの知識を踏まえて、これを Xamarin.iOS でやってみると、以下のようになります。

```csharp
UIGraphics.BeginImageContextWithOptions(mapView.Frame.Size, false, 0f);
NativeMap.Layer.RenderInContext(UIGraphics.GetCurrentContext());
UIImage snapshot = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
```

変数 ``snapshot`` がキャプチャされた画像(``UIImage``)です。

## Xamarin.iOS で UIImage を任意の画像形式の Stream に変換

この画像を PNG で保存したいと思います。

```csharp
Stream pngStream = snapshot.AsPNG().AsStream(); // .AsJPEG() もあるよ
```

これだけです、あまりに簡単すぎて笑ってしまいました。
あとは ``Stream`` をディスクなどに書き込むだけです。

こんな感じで、地図のスナップショットを撮ることができます（下が地図で上がスナップショット）。

![](http://blog.amay077.net/assets/images/posts/getting_snapshot_from_google_map_on_ios_sdk_01.png)

## おまけ: Google Maps Android API の場合

Android アプリで Google Maps を使ってスナップショットを撮るには、

* [GoogleMap.snapshot - Google APIs for Android  |  Google Developers](http://bit.ly/2kKe2F1)

を使います。コールバックで ``Bitmap`` が返ってくるので、こちらの方が簡単です。

両者を組み込んで Xamarin.Forms.GoogleMaps で [スナップショットが撮れる機能](https://github.com/amay077/Xamarin.Forms.GoogleMaps/issues/241) をそのうち追加します。
Pepperの機体ごとに固有な BODY IDを取得する

# 背景
Pepperを固有に判別したいなぁと思っていろいろググってたんだけどなかなかドンピシャな情報がなくてしばらく時間を使っちゃいました。
オチとしてはChoregrapheにそのためのBoxがあるんだけど、
https://community.ald.softbankrobotics.com/ja/forum/%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88id%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6-7220
とかでも質問されてて回答がついていなかったりなので、灯台下暗しなのかもしれないということでメモメモφ(..)

# みつけたところ
http://qiita.com/Suna/items/1403f53c71a01ac64793
で、バーチャルロボットなのか実機なのかの判定に使えるかも、ということで記載があってこのボックスに初めて気が付きました。感謝！！！！！

# Choregrapheで試す
…ということで試しました。

## このボックスを使います
![Kobito.5kDV3y.png](https://qiita-image-store.s3.amazonaws.com/0/35808/f7b8a8d9-6ba3-6ad4-9faa-3208b6e0a162.png "Kobito.5kDV3y.png")


## こんな感じに配置
![Kobito.PVWFBD.png](https://qiita-image-store.s3.amazonaws.com/0/35808/836dd464-48e3-fd3c-e186-6c96a63f166b.png "Kobito.PVWFBD.png")


## 実機
実機のIDはこれ。
![Kobito.tt5pKc.png](https://qiita-image-store.s3.amazonaws.com/0/35808/0fe9e88e-b649-9b13-faf0-0133da504f42.png "Kobito.tt5pKc.png")


で、Choregrapheのログビューアで見た結果がこちら。
![Kobito.5Sd391.png](https://qiita-image-store.s3.amazonaws.com/0/35808/559eac26-fe75-ddbe-dec3-8f93177c5101.png "Kobito.5Sd391.png")

なので、ロボットウェブページで言うところの「BodyId」が取得できるのですね。
Boxの名前が「Get Body ID」なんだから当然か。

## バーチャルロボット
Choregraphe のバーチャルロボットで実行した時のログビューアの出力がこちら。
![Kobito.dmQhzm.png](https://qiita-image-store.s3.amazonaws.com/0/35808/b211f413-3e7d-ae77-7cb1-8b419617dadf.png "Kobito.dmQhzm.png")

バーチャルロボットだと「NoBodyID」になるのですね。

# 結論
「Get Body ID」ボックスを使うことで

* バーチャルロボットか実機かの判定
* 実機の機体に固有な情報の取得

が出来ることがわかりました。めでたしめでたし。
【随時更新】MacOS Sierra 設定メモ

初期状態から変更した設定、インストールしたアプリなどをメモしておく。

##基本情報
- MacBook Pro (Retina, 15-inch, Mid 2015)

<img width="588" alt="スクリーンショット 2017-02-20 20.19.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/130542/ed453ff7-531d-c47e-cb63-7cde58018ff5.png">

##システム

- 隠しファイルを表示

##トラックパッド
- タップをクリックへ割り当て
- スクロールの方向をナチュラルに設定
- Finderの階層移動をジェスチャーで行うための変更点
 1. ページ間のスワイプを「2本指または3本指でスワイプ」に変更
 2. フルスクリーンアプリ間をスワイプを「4本指で左右にスワイプ」に変更  
 →これでFinderで３本指で階層遷移可。


##キーボード
- capsキーにcommand割り当て
 

##ホットキー
- 左下をスクリーンロックに設定

##アプリ
- FilleZillaインストール
- Google Chromeインストール
- Google辞書インストール
ubuntuでパッケージのローカルインストール

# debパッケージのローカルインストール
最近ubuntuを触り始めてパッケージをローカルインストールしようと思ったら
「そうだyumじゃないんだった！」と気づきました（遅い
よく見かけるrpmとdebですがubuntu標準のapt-getとかだとどうもインストール出来ないっぽい
(正確には出来るけどスマートじゃない・・・)

探してみたらgdebiという依存関係を解決してインストールしてくれる便利なヤツがいたのでインストール。

<pre>
$ apt-get install gdebi
$ gdebi elasticsearch-5.2.1.deb
</pre>

dpkgだと依存関係は考慮してくれないのでこちらのほうが良さげ。
便利だけどapt-getと分けないといけないのはちょっとめんどいかもしれない・・・