OmniAICreator/Qiita-1.07M huggingface dataset:
vagrant up した時に共有フォルダのマウントでエラーが出る問題



## 問題

大分前から `vagrant up` した時に共有フォルダのマウントに時間がかかり下記のエラーが出ていた。

```
$ vagrant up
(中略)
==> web: Mounting shared folders...
    web: /vagrant => /Users/hoge/path/to/dir/project
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

エラーメッセージを雑に読むと、ゲストとホストで共有フォルダのマウントが上手くいってないようだ。

しかし、その後に普通に `vagrant ssh`したら接続はできるのでずっと放置していた。
が、ようやく色々と調べて解決した。


## 自分の環境

* MacOS X 10.10.5 Yosemite
* VirtualBox 5.0.2
* Vagrant 1.7.4
* Vagrant Box chef/centos-6.6


## 解決方法

まずはvagrantに接続しvboxのリビルドを試す。
以下はvagrant内でのコマンド操作。

```
$ sudo /etc/init.d/vboxadd setup
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-504.el6.x86_64

Building the main Guest Additions module                   [失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]
```

**Guest Additions** の構築に失敗する。
メッセージ通り、  **kernel-devel-2.6.32-504.el6.x86_64** を `yum install` してみる。

```
$ sudo yum install kernel-devel-2.6.32-504.el6.x86_64
読み込んだプラグイン:fastestmirror
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.kddilabs.jp
 * extras: www.ftp.ne.jp
 * remi-safe: remi.kazukioishi.net
 * updates: www.ftp.ne.jp
パッケージ kernel-devel.2.6 は利用できません。
エラー: 何もしません
```

そんなものは存在しない！
仕方がないので、 **kernel-devel-2.6.32-504.el6.x86_64** をキーワードにググり、web上のrpmパッケージを拾ってきてインストールする。

ググったら、ヒットした [RPM Scientific Linux 6 kernel-devel 2.6.32 x86_64 rpm](http://rpm.pbone.net/index.php3/stat/4/idpl/27633570/dir/scientific_linux_6/com/kernel-devel-2.6.32-504.el6.x86_64.rpm.html) の中から適当なリンクのrpmパッケージをインストールする。

```
$ sudo yum install ftp://mirror.switch.ch/pool/4/mirror/scientificlinux/6.6/x86_64/os/Packages/kernel-devel-2.6.32-504.el6.x86_64.rpm
```

インストール後にもう一度vboxのリビルドを行う。

```
$ sudo /etc/init.d/vboxadd setup
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]
```

今度は成功した。
その後、ホストに戻り、`vagrant halt` & `vagrant up` してもエラーが出ずにすぐに環境構築できるようになって解決した。
GAS（GoogleAppsScript）で使った機能について簡単に説明

GASはGoogleChromeの拡張機能のGoogle Spreadsheet内のツール→スクリプトエディタで編集することができます。
下記では自分が実際に利用したGASの機能について簡単に説明しています。
自分と同じGASが初見の方の一助となれば幸いです。

###GASの使い方
####1.スクリプトエディタの開き方
>・スプレッドシートを作成し、ツールからスクリプトエディタを選択
>・ファイル→新規作成→スクリプトファイルを選択することで新規ファイルを作成可能

####2.1スクリプトの実行方法（即時実行）
>1.虫のマークの横にある関数を実行したいものに合わせて▶を押す。
>2.実行の文字を選択し、実行したい関数名を選択。

####2.2スクリプトの実行方法(特殊な方法)
>・リソース→現状のプロジェクトのトリガーを選択
>・関数名を選択
>・「時間主導型」,「スプレッドシートから」のどちらかを選択
>#####1.時間主導型
>>・タイマーから特定の日時,時間,分,日,週,月のいずれかを選択
>>・期間を設定

>#####2.スプレッドシートから
>>・起動時,編集時,値の変更,フォーム送信時のいずれかから選択

####3.表示
>・表示→ログ表示,実行トランスクリプトのいずれかを選択
>#####ログ表示
>>・Logger.log(表示したい値を入れる)をスクリプト内に記述するとログ表示をした際にLogger.log()の値が表示される。
>>例）

>>```lang:スクリプト.gs
>>function aaaa(){
>>  Logger.log("abc");//変数等でも可
>>}
>>```
>>↓実行
>>
>>```lang:ログ表示
>>ログ
>>
>>[15-10-29 16:09:05:650 JST] abc
>>```


>#####実行トランスクリプト
>>・ログは最終的なテキストの出力結果のみですが、実行トランスクリプトは、スクリプト実行時の各メソッドの 実現の様子を記録したものになります。
>>例）
>>↓上記のスクリプト.gs実行
>>
>>```lang:実行トランスクリプト表示
>>実行トランスクリプト
>>[15-10-29 16:11:05:663 JST] 実行を開始しています
>>[15-10-29 16:11:05:734 JST] Logger.log([abc, []]) [0 秒]
>>[15-10-29 16:11:05:737 JST] 実行が無事終了しました（合計ランタイム 0.003 秒）




以上です。
Rails 4 で生成したimageが表示されません。

Rails4 と　graphviz でグラフを作成して表示するプログラムを作っています。
ProductionモードでもDevelopmentモードでもgraphvizで生成した画像を表示することができません。

http://www.rubylife.jp/rails/template/index11.html
を参考にして、graphvizで生成したimageを app/assets/images において、viewでimage_tagからその画像を呼び出しても表示されません。

原因と確認事項についてご示唆をお待ちしています。
Yahoo!ショッピングWeb APIの注文検索APIで401 Authorization Required

Yahoo!ショッピングWeb APIの注文検索APIへリクエストを行ったところ、
「401 Authorization Required」
が返ってきます。
なぜでしょうか？
アクセスキーはImplicitフローにて取得しております。
アプリケーションIDは「Yahoo!ショッピング ストア運営をサポートするAPIの利用」から取得しております。


ヘッダーにはAuthorizationエンドポイントから取得したアクセスキーを指定しております。

リクエスト：

POST /ShoppingWebService/V1/orderList HTTP/1.1
Host: circus.shopping.yahooapis.jp
Content-Encoding: UTF-8
Content-Type: application/xml
Content-Length: 505
Authorization: Bearer <アクセスキー>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: identity
User-Agent: Yahoo AppID: <アプリケーションID>

レスポンス：

HTTP/1.1 401 Authorization Required
Date: Mon, 02 Nov 2015 00:43:01 GMT
Content-Type: application/xml
Age: 30
Transfer-Encoding: chunked
Connection: keep-alive

200
<?xml version="1.0" encoding="utf-8" ?>
<Error>
<Message>
Service Requires Authentication
</Message>
</Error>
Crystalプログラミングメモ


私がCrystalではまったことをメモしていきます。

## nilチェック

偽のチェックは`if x.is_a?(Nil)`。`!x`や`x==nil`だと(後ろでの)型アサーションが外れない。
ただし真のチェックは`if x`で良い。

`unless x`が正解だそうです。コメント感謝。

## Hash#inject

`Hash#inject(start){|s,k,v|}`。`|s,e|`でもなければ`|s,(k,v)|`でもない。

## Number

Int or Float。RubyだとNumeric。CrystalだとNumber。
Rlogin：良い感じにワード選択する方法

**Rloginでマウスの左ダブルクリックした場合に選択されるワードを良い感じに変更する**
※良い感じ = Tera Term や Putty と同じワード選択にする

**[設定方法]**
オプション設定　＞　クリップボード　＞　ワード選択文字
「 \/._ 」(default)　⇒　「 \/._- 」(ハイフンを追加する)

**イメージ**
![ワード選択文字](https://qiita-image-store.s3.amazonaws.com/0/53164/386aaac4-dddc-4829-e166-cb50f3c442c9.png)

これでブランチ名やパスを含めたファイル名などを左ダブルクリックで選択＆コピーできます
iOSアプリでGoogleMap + 何かしらの機能を作りたいから一覧

##MapViewサンプル一覧
http://matome.naver.jp/odai/2140905505786691301
##Google Maps SDK for iOS
https://developers.google.com/maps/documentation/ios-sdk/code-samples
##Google Map SDK for iOS Getting started
https://developers.google.com/maps/documentation/ios-sdk/start
##Google Maps SDK for iOS を使ってみる – 2014
http://dev.classmethod.jp/smartphone/iphone/ios-map-programming-series-1/

##やりたいこと
GoogleMapを使ってiOSアプリの学習をしたい。(上記の情報でどうにかなりそう)
##疑問
どんな機能を足せばよいのか、ないし、もう少しわかりやすいまとめが無いのかな^^
CakePHP3にPHPUnitをインストールする

#CakePHP3にPHPUnitをインストールする
##前提条件
- CakePHP3インストール済み/動作確認済み

##PHPUnitをインストール
- Rootディレクトリに移動
- composer.jsonがあるのを確認
- `$ composer update`　これでインストールされる
- `$ vendor/bin/phpunit`でインストールされたか確認

##テストケースを作成
- bakeが便利
- `$ php  bin/cake.php  bake  all  User`
- Model Controller View TestCase Fixtureが作成される

##個別にテストを実行
- `$ vendor/bin/phpunit tests/TestCase/Model/Table/UsersTableTest`
- `$ vendor/bin/phpunit tests/TestCase/Controller/UsersControllerTest`
DockerのJavaバージョンをupdate含めて固定したいとき

## はじめに
巷ではDocker流行ってますね。
自分はあまり触ることがないのですがたまたまある対応で触る必要があって、その時にJavaのバージョンによる問題のようだったのでバージョンを指定する方法を探してましたがあんまりWeb上見ても情報が見つからなかったので忘備録を兼ねて書いておきます。

## Dockerfile
javaを使うときはそのimageをもってくるわけですが最新版を使いたい時は単純にバージョンだけ書いておけばOKでした。

**java8 の最新版を使いたいとき**

```
FROM java:8
...
以下略
```

ただ、javaは update XX といった感じでバージョンが同じでもどんどんアップデートされていくのでその単位で指定して入れたいときは下記のように書けばupdateを含めたバージョン固定ができます。

**java8-update40 を使いたいとき**

```
FROM java:8u40
...
以下略
```

もっと前のバージョンとかも使いたいときの書き方についてはこちらを参考にしてみるとよいと思います。
`8u66-jre` のようにJREだけを入れる書き方とか色々指定ができます。

https://github.com/docker-library/docs/tree/master/java

## おわりに
Docker はまだそんなに触れてないのですが、このイメージをどっかから持ってきてVM作ってその上での下準備をファイルに書いて使いはじめる感じは面白そうですね。
いずれもう少しちゃんと勉強して触っていきたいです。
ターミナルやAlfred、Dockからインターネット共有のオンオフを切り替える

仕事の都合でMacのインターネット共有のオンオフを割りと頻繁に切り替えている
今までは「システム環境設定」の「共有」の「インターネット共有」のチェックボックスを押して切り替えていたのだがいかんせんめんどくさい
ターミナルとかAlfredからぽんと１発で切り替えたい！！

### どーせコマンドかなんかあってちょちょいのちょいでしょ！！
・・・

ググってもでてこねぇ・・・！！
コマンドワンパンじゃねぇのか・・・

と諦めかけていた矢先、やはり先人は偉大であるのであった
[Start/Stop Internet Sharing via Terminal in Yosemite without AppleScript](http://apple.stackexchange.com/questions/175626/start-stop-internet-sharing-via-terminal-in-yosemite-without-applescript)

恐ろしい発想の転換だ
インターネット共有は常にONにしておいて経路に用いるネットワーク設定のほうを切り替えるとは・・・

### 下準備
#### インターネット共有に使うための経路を用意する
システム環境設定のネットワークを開く
使いたい経路を選んで歯車ボタンから「サービスを複製...」を選ぶ
とりあえずこの例では「Thunderbolt Ethernet」を元に「Sharing」という名前で保存
優先度は一番下にしておく
<img width="710" alt="スクリーンショット 2015-11-02 20.09.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/d9361ad2-2615-4e5f-01d4-1df06ffdea9f.png">

#### 共有設定をする
システム環境設定の共有を開く
「共有する接続経路」に先ほど作成した「Sharing」を設定、Wi-Fiを使用することにして、「入」に！
<img width="738" alt="スクリーンショット 2015-11-02 20.51.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/16dce301-d8f9-2230-c7b0-87a7736982f0.png">


以上で事前準備は終了

### ターミナルから切り替える
以下のコマンドをターミナルから叩く

```bash:インターネット共有をONにする
$ sudo networksetup -setnetworkserviceenabled "Thunderbolt Ethernet" off
```

```bash:インターネット共有をOFFにする
$ sudo networksetup -setnetworkserviceenabled "Thunderbolt Ethernet" on
```

ね？簡単でしょ？
普段インターネット接続に使っている「Thunderbolt Ethernet」がoffになると待機していた「Sharing」が使われ、共有の経路が出来上がるという仕組み
逆にonになると、優先度の低い「Sharing」は使われなくなるので共有も止まる

on,offの記述が「やりたいこと」と「パッと見の見た目」とで逆だし絶対忘れるので叩くと切り替えてくれるの書いた
共有してるかどうかはWi-Fiのアイコンとかみればわかるしね

```bash:インターネット共有のON/OFFを切り替える
service="Thunderbolt Ethernet"
status=`networksetup -getnetworkserviceenabled "$service"`
if [ $status = 'Disabled' ]; then
    sudo networksetup -setnetworkserviceenabled "$service" on
else
    sudo networksetup -setnetworkserviceenabled "$service" off
fi
```

パスワード入力がめんどくさいから``/etc/sudoers``で``networksetup``を許可した、なんかザルな気もする

```bash
$ sudo visudo

# 下記をどっかに追加（%userは自分のユーザ名に置き換える）
%user ALL=(root) NOPASSWD: /usr/sbin/networksetup
```

### Alfredから切り替える
ターミナルからはいいけどAlfredからでも切り替えられるようにしたい・・・どうしよう
そうだ、Automatorだ！

というわけでAutomatorでアプリ化した、もはやDockからでも切り替えられる

Automatorを起動して、アプリケーションを選択
シェルスクリプトの実行を選んできてコードをぽい！
Automatorのシェルスクリプト実行だと``sudo``つけてるとパスワードの入力で止まっちゃうので外す
``sudo``がついてないといつものシステムダイアログでパスワードを聞いてくる
（``/etc/sudoers``で``networksetup``を許可していれば止まらないので``sudo``つけてても良い）
<img width="739" alt="スクリーンショット 2015-11-02 20.31.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/99278b3c-90da-c194-7dcd-60bf497a2737.png">

出来上がった
<img width="609" alt="スクリーンショット 2015-11-02 20.33.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/90613/13a3f4e5-d657-df51-2511-f0cc1e8cbac4.png">
アプリケーションなのでAlfredにかぎらずSpotlightからでもDockからでもFinderからでも``open /Applications/InternetSharing.app``からでも何でも起動できるぜ！！！

ああ〜超快適になった！
python + faker ある地点から半径100mの点をランダムに生成する


計算はこちらのサイトを参考にさせて頂きました。
http://mononofu.hatenablog.com/entry/20090324/1237894846

python の [faker](https://github.com/joke2k/faker) を使います.

[fakerには日本ロケール](http://fake-factory.readthedocs.org/en/master/locales/ja_JP.html)があるので、それを利用。

例えば、東京駅を中心に半径100mの円の中に点を10個生成

```python
#!/usr/bin/env python

from faker import Factory
fake = Factory.create('ja_JP')

import math
import csv

##
# 
samples       = 10
limit_samples = 10000
csvfile       = "data.csv"

# Tokyo Station(35.681382, 139.766084)
centerlat  = 35.681382
centerlong = 139.766084
radius_m   = 100

#########
earthradius = 6378137
lat1radm   = ((2*math.pi*earthradius)/360)
latradius  = radius_m/lat1radm
long1radm  = ((earthradius*math.cos(centerlat/180*math.pi)*2*math.pi)/360)
longradius = radius_m/long1radm

with open(csvfile, "w+") as f:
    csv_writer = csv.writer(f)
    
    counter = 0
    for _ in range(0,limit_samples):
        geolat  = fake.geo_coordinate(center=centerlat , radius=latradius)
        geolong = fake.geo_coordinate(center=centerlong, radius=longradius)
        
        r = math.sqrt(math.pow((float(geolat)-centerlat)*lat1radm,2)+math.pow((float(geolong)-centerlong)*long1radm,2))
        if r < radius_m:       
            d = [geolat, geolong]
            #print d
            csv_writer.writerow(d)
            counter = counter + 1
        
        if counter >= samples:
            break
```


このままだと使いづらいので、引数で指定できるように対応させる。

```python
## args
import argparse
parser = argparse.ArgumentParser(description='Generater of coordinate points.')
parser.add_argument('--samples', type=int, nargs='?', default=10, help='number of points')
parser.add_argument('--csv', type=str, nargs='?', default="dummydata.csv", help='csv file name')
parser.add_argument('--radius', type=int, nargs='?', default=100, help='radius(m)')
# Tokyo Station(35.681382, 139.766084)
parser.add_argument('--latitude', type=float, nargs='?', default=35.681382, help='center latitude of the circle')
parser.add_argument('--longitude', type=float, nargs='?', default=139.766084, help='center longitude of the circle')
args = parser.parse_args()
   
##
# 
samples       = args.samples
limit_samples = samples * samples
csvfile       = args.csv
centerlat     = args.latitude
centerlong    = args.longitude
radius_m      = args.radius
```

```bash
$ python genpointsbygeo.py -h
usage: genpointsbygeo.py [-h] [--samples SAMPLES] [--csv CSV]
                         [--radius RADIUS] [--latitude LATITUDE]
                         [--longitude LONGITUDE]

Generater of coordinate points.

optional arguments:
  -h, --help            show this help message and exit
  --samples SAMPLES     number of points
  --csv CSV             csv file name
  --radius RADIUS       radius(m)
  --latitude LATITUDE   center latitude of the circle
  --longitude LONGITUDE
                        center longitude of the circle

$ python genpointsbygeo.py --samples 100 --csv data1.csv --radius 1000
$ wc -l data1.csv 
     100 data1.csv
```



複数の点をプロットして確認できるため非常に便利です！
ありがとうございます！
http://www.tree-maps.com/prot/
モバイルアプリをWindowsでプレイ－「Nox App Player」

![１.png](https://qiita-image-store.s3.amazonaws.com/0/98372/32880407-d501-9c41-5b94-285b48acf858.png)

PCでモバイルアプリが使える新しいAndroidエミュレータ「Nox App Player」が公開された。カスタム仮想マシン上に構築され、4.4.2カーネル技術とX86/AMD互換性突破で、Win XP SP3/Vista/Win 7/Win 8/Win 8.1/ Windows 10に動く高い互換性のエミュレータになった。Google Playのプリロードにより、直接PCで軽くモバイルアプリがダウンロードできる。
「Nox App Player」は英語、日本語、韓国語、中国語が支持できる。
フルスクリーン表示はもちろんの事、画面をドラッグしてある程度自由に画面サイズを変更出来る。他にも、Multi-Window、Multi-touch、ユニックの四方向重力感応、データバックアップと復元、PCとのファイル共有などの機能が特徴になる。直接の日本語入力も可能になった。
Androidのスタジオに接続され、完全な機能を備えたAndroid環境の上、Root化できるので、Android開発者の為の優れた開発ツールにもなる。
「Nox App Player」は完全に無料で、ゲーマー、Android開発者、皆にとって素晴らしいAndroidエミュレータになれる。

公式サイト：http://jp.bignox.com

![Multiply Instance.jpg](https://qiita-image-store.s3.amazonaws.com/0/98372/7cbf9fc6-9b42-8454-2334-ceb8132cf3e5.jpeg)

![Nox App Player.png](https://qiita-image-store.s3.amazonaws.com/0/98372/371dad46-0e98-aa44-03ce-600ddc837ebd.png)
Postfixでヘッダを追加/削除する

# 背景

メールサーバ側で特定のヘッダをメールに追加/削除したい場合がある。
Xヘッダをつけて他のサーバで特殊な処理を依頼する場合など。

検索するとheader_checksが出てくる。
header_checksで大抵の要望を実現できるが、実現出来ないこともある。
また、条件によってはheader_checksではなく、smtpd_data_restrictionsを利用する場合がある。
この記事ではその辺りの話を自分の理解した限りの内容でまとめる。

# 設定例

5つの例を元にPostfixにおけるヘッダの追加方法と、できないことを説明する。

##  X-HOGEHOGEヘッダを追加し、その値をFromヘッダと同じにする。

挿入したいヘッダの値を他のヘッダから持ってくる場合は以下のようにすれば良い。

* /etc/postfix/main.cf
```
header_checks = pcre:/etc/postfix/header_checks
```

* /etc/postfix/header_checks 
```
/^FROM:\s*(\S+)/       RREPEND X-HOGEHOGE: ${1}
```

## 必ずX-HOGEHOGEヘッダを追加して固定の値を入れる。

配送されてきたメールに対して、かならずヘッダを追加する場合は以下のようにすれば良い。

* /etc/postfix/main.cf
```
smtpd_data_restrictions = check_client_access cidr:/etc/postfix/add_user_header
```

* /etc/postfix/add_user_header
```
0.0.0.0/0       PREPEND X-HOGEHOGE: kotei
```
見ればわかると思うが、特定のIPから配送されてきたメールにだけ、何かを追加したい場合も上記で実現できる。

## Aヘッダがない場合に、Bヘッダを付与する。

「ヘッダがない」という判定がheader_checksではできない。
ヘッダが正規表現に一致するか、否かでしか条件分岐できないため。

## Aヘッダがある、かつBヘッダもある場合にCヘッダを付与する。

ヘッダは一行ずつ処理される。
そして処理結果を結果を保存することができないので、複数のヘッダを条件にしたヘッダ付与はできない。

# 結論

単純なヘッダ付与は設定ファイルだけで実現できるが、
自由に何かやりたければMilterを実装するのが手っ取り早いと思われる。

# 参照
* header_checks
http://www.postfix-jp.info/trans-2.2/jhtml/header_checks.5.html
* smtpd_data_restrictions
http://www.postfix-jp.info/trans-2.2/jhtml/postconf.5.html#smtpd_data_restrictions
* milter
http://www.postfix-jp.info/trans-2.3/jhtml/MILTER_README.html
PythonでTraceを計算してみる

やりたいこと：線型代数のTraceの命題を確かめてみること

```math
{\rm Tr}(PAP^{-1})={\rm Tr}(A)
```


## Traceって？(一応、復習)
$n$次正方行列$A=(a_{ij})$に対して、対角成分の和を加えたもの：

```math
{\rm Tr}(A):=\sum_{i=1}^na_{ii} 
```



## (サンプル)行列の定義
```math
A=\left(
\begin{matrix}
1 & 2 \\
3 & 4 
\end{matrix}
\right),
P=\left(
\begin{matrix}
2 & 3 \\
4 & 5 
\end{matrix}
\right)
```
とします。実装ではこんな感じ：

```py
> import numpy as np
> A = np.array([[1,2],[3,4]])
> P = np.array([[2,3],[4,5]])
```

### 一応、中身のck
```py
> A 
array([[1, 2],
       [3, 4]])
> P
array([[2, 3],
       [4, 5]])
```

### Pの行列式をck
行列式が0だと逆行列が存在しないですからね。

```py
> np.linalg.det(P)
-2.0
```

→大丈夫そうですね！

## Traceの計算

```py
> np.trace(np.dot(np.dot(P,A),inv_P))
5.0
> np.trace(A)
5
```

まぁ、そらそうだろ、という結果ですがw

勿論、これでは数学的な証明にはなり得ませんが、Pythonの練習材料として、てことで。
UINavigationBarの色がbarTintColorに設定した色よりも薄く表示されてしまう問題

## Storyboardで編集する場合

<img width="340" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/8093/6de71a89-7762-4110-359e-d9499ea694f3.png">
デフォルトではチェック入ってた。

## コードでUIAppearanceで編集する場合

```
[UINavigationBar appearance].translucent = false;
```
Marshmallow端末で、Permission利用確認をする。

# 前置き

Android 6.0になって、一部条件でRuntime時にPermissionの許可をユーザに行うことが必要になった。
具体的には下記を満たす場合には、Runtime時にPermissionの許可をユーザに行わないと対象機能の利用時にSecurityExceptionを起こしてしまう。

- compileSdkVersion 23 でビルド
- Android 6.0以上の端末でプレイ
- protectionLevelがdangerous以上のPermissionを必要とするアプリ

Protection Levelがdangerousかどうかは、下記サイトから一覧で確認できる。

- [Manifest.permission](https://developer.android.com/intl/ja/reference/android/Manifest.permission.html)

# 確認方法

位置情報はdangerousに該当するPermissionであるので一例としてあげた。

- https://developer.android.com/intl/ja/reference/android/Manifest.permission.html#ACCESS_FINE_LOCATION
- https://developer.android.com/intl/ja/reference/android/Manifest.permission.html#ACCESS_COARSE_LOCATION

## Code

```java
public class MainActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
    final int REQUEST_PERMISSION_CODE = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // ...

        String[] permissions = new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION };

        if (!this.isPermissionGranted(permissions)) {
            // まだ権限がないので権限をユーザに権限を求める
            ActivityCompat.requestPermissions(this, permissions, REQUEST_PERMISSION_CODE);
        } else {
            // すでに権限があるのでOK (Android 6.0未満 or すでに持っている)
        }
    }

    /**
     * Permissionの利用同意結果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode != REQUEST_PERMISSION_CODE) {
            return;
        }

        if (this.isPermissionGranted(permissions)) {
            // パーミッション取得に同意した
        } else {
            // パーミッション取得に同意しなかった
        }
    }

    private boolean isPermissionGranted(String[] permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
}
```

こんなかんじの雰囲気で確認できる.
Xcode6.2でAppStoreにUploadできなかった話

# ある日突然、Uploadに失敗するようになった

すでに公開しているアプリをアップデートしたくて、
いつものようにアーカイブを作成し、サブミットボタンを押したら、以下のエラーが出るようになってしまいました。

![スクリーンショット 2015-10-30 18.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/98954/13ce9f3d-36d7-2d5f-e283-10db8e88da34.png)

あちこち調べましたが、StackOverFlowでも解決策を見出した人はおらず。
「Apple、早く対応してくれ！」という悲痛な叫びしかありません。

神様仏様Apple様。この世界で生きる我々は、Apple様のご意向に従うより生きる道はありません。


# バージョンが古いんじゃないの？

そういえば、Xcodeのバージョンが古い。
私が使っているXcodeは6.2。現在の最新は7.1。
メジャーバージョンが追いついていない。そりゃあApple様もお怒りになる。古いバージョンを使っている子供達に無言の制裁を加えてるんじゃなかろうか。

というわけで、最新の7.2Betaをダウンロード＆インストール。
どうせなら、一番新しいバージョンまで行っちゃえ。
念のため、6.2のバージョンを残したままにしておきたいという思いもあります。
（正式版7.1だと、6.2からのアップデートになってしまうため）


## bitcodeの対応

Xcode7になると、Bitcodeをデフォルトで使用する設定になっているので、エラーになる場合はオフにしておきます。
プロジェクトのTARGET→Build Settings→BuildOptions→EnableBitcode をNoに変更


## デバイスの選択

ビルド対象として、接続中の実機、各種シミュレータの他に、「Generic iOS Device」というのが追加されています。
アーカイブを作成する場合は、これを選択していないといけないようです。


## ベータ版じゃあ…

以上の対応をし、意気揚々とアーカイブを作成しました。

その結果がこれ。

![スクリーンショット 2015-11-02 18.55.23.png](https://qiita-image-store.s3.amazonaws.com/0/98954/7c7e4971-da2e-fc39-2f35-1d7d50cc7624.png)

そうか。<b>ベータ版だとUploadできない</b>んだ。

まあ、そりゃそうだ。がっかり。

2つ目のエラーはググっても情報が出てきませんでしたが、きっとそれは正式版7.1にすれば一緒に解決するでしょう（経験による勘）

というわけで、結局 Mac App Storeに行って、Xcodeを7.1にアップデート。


これにて、<b>無事成功しました！</b>



# まとめ

Xcode6以前でiTunesにUploadできなくなったら、Xcodeを7以降にアップデートしよう。


# 教訓

理由もなくエラーが出たり、ググっても誰も解決策を見つけてない時は、日頃の自分がAppple神の声に逆らっていないか自省してみる。

（訳：途方にくれそうな不具合ほど、解決策は案外簡単なものだ）
Ubuntuのイメージをインストールして基本の操作を行う

いよいよDocker本家のサンプルと違うことをしてみます。
UbuntuのOSをインストールしてきて、基本の中の基本である操作をしてみます。

## Ubuntuのイメージをインストールしてみる
* インストール
<pre>
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
c63fb41c2213: Pull complete 
99fcaefe76ef: Pull complete 
5a4526e952f0: Pull complete 
1d073211c498: Pull complete 
Digest: sha256:8b1bffa54d8a58395bae61ec32f1a70fc82a939e4a7179e6227eb79e4c3c56f6
Status: Downloaded newer image for ubuntu:latest
</pre>

* イメージがインストールされたか確認
<pre>
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              1d073211c498        10 days ago         187.9 MB
</pre>

## コンテナを作成する
<pre>
$ docker run -it ubuntu
root@407455f7e527:/# 
</pre>

## コマンドを打ってみる
<pre>
root@407455f7e527:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
</pre>

## コンテナから一時的に出る

* デタッチ(detach)と言われるもの。
Ctrl+p  -> Ctrl+q  を続けて押す
なお、exit をするとコンテナは停止される

* コンテナが稼働中であることを確認
<pre>
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
407455f7e527        ubuntu              "/bin/bash"         2 minutes ago       Up 2 minutes                            sick_darwin
</pre>

## コンテナに再接続する

* アタッチ(attach)と言われるもの
<pre>
$ docker attach 407455f7e527
root@407455f7e527:/# 
</pre>

## コンテナを停止

* exitでコンテナを停止
<pre>
root@407455f7e527:/# exit
exit
</pre>
* 稼働中のコンテナがないことを確認
<pre>
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
</pre>

## detachしようとしたのに、うっかりexitしてしまった場合
稼働中のコンテナがいなくなってしまった場合は、停止されたコンテナから復活させることが可能
dockerから完全にコンテナを削除`ps rm [コンテナID]`をするまではいつでも復活可能

* 停止中のコンテナを確認
<pre>
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
407455f7e527        ubuntu              "/bin/bash"         20 minutes ago      Exited (0) 2 minutes ago                           sick_darwin
</pre>
* コンテナを再起動と確認
<pre>
$ docker start 407455f7e527
407455f7e527
　
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
407455f7e527        ubuntu              "/bin/bash"         21 minutes ago      Up 10 seconds                           sick_darwin
</pre>
* 再びattachで接続
<pre>
$ docker attach 407455f7e527
root@407455f7e527:/#  
</pre>
UbuntuにSpreeをさくっとインストールしたい男たち

### Railsプロジェクト作成
```
$ cd ~
$ mkdir spree
$ cd spree
$ bundle init
$ vi Gemfile

$ bundle install --path vendor/bundle
$ rails new . -T -d mysql --skip-bundle  
$ vi Gemfile
```
### gem追加
```
gem 'spree', github: 'spree/spree'
```
```
$ bundle install
$ bundle exec rails g spree:install --migrate=false --sample=false --seed=false
```
```
bundle exec rake railties:install:migrations
bundle exec rake db:migrate
bundle exec rake db:seed
bundle exec rake spree_sample:load
```
pm2とcapistranoで、pm2 reload でファイルの変更が読み込まれないときの解決方法

pm2でプロセス管理をすると、ダウンタイムゼロのリロードができたり、ログ管理、クラスタモードなど便利。

pm2にもデプロイ機能ついているが、デプロイはcapistranoが、カジュアルにロールバックできたり、ちょっとしたプロビジョニングもできるので便利。（てか全部capでやっている）

capistranoは、symlinkのリンク先を切り替えながら常に最新を保つが、symlinkがpm2のファイルハンドリングで問題になって、pm2のリロードしてもファイルの変更が読み込まれないくてハマった。

https://github.com/Unitech/PM2/issues/1340

↑ここに解決方法が書いてある
書き方


# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6

- リスト1
    - ネスト リスト1_1
        - ネスト リスト1_1_1
        - ネスト リスト1_1_2
    - ネスト リスト1_2
- リスト2
- リスト3

1. 番号付きリスト1
    1. 番号付きリスト1_1
    1. 番号付きリスト1_2
1. 番号付きリスト2
1. 番号付きリスト3

> 引用テキスト1
> 引用テキスト2
> > 引用の引用テキスト1
> > 引用の引用テキスト2
> 引用テキスト3

*Itralic*
_Itralic_
**Strong**
__Strong__
___Strong Width Itralic___
***
---
***
[URL][google]
Node.jsでdiff/patch


## はじめに

Atomのパネル間のdiffを取るパッケージである[split-diff](https://atom.io/packages/split-diff)にパッチ機能（vimでいう`diffget`、`diffput`的なもの）が欲しいと思い、内部で利用している[jsdiff](https://github.com/kpdecker/jsdiff)を調べていたら思いのほか高機能だったのでメモを行う。

## 文字列のdiffを取る

まずは普通に文字列同士を比較してみる。

```coffeescript
jsdiff = require "diff"

orig = """
aaa
bbb
ccc
"""

modified = """
aaa
bbb
ddd
"""

diff = jsdiff.diffChars orig, modified
console.log diff
```

### 実行結果

```coffeescript
[ { count: 8, value: 'aaa\nbbb\n' },
  { count: 3, added: undefined, removed: true, value: 'ccc' },
  { count: 3, added: true, removed: undefined, value: 'ddd' } ]
```

## Unified形式のpatchを作る

jsdiffは単純に比較するだけでなく、Unified形式のpatchを出力できる。

```coffeescript
jsdiff = require "diff"

orig = """
aaa
bbb
ccc
"""

modified = """
aaa
bbb
ddd
"""

patch = jsdiff.createPatch "test", orig, modified, "original text", "modified text"
console.log patch
```

### 実行結果

```diff
Index: test
===================================================================
--- test	original text
+++ test	modified text
@@ -1,3 +1,3 @@
 aaa
 bbb
-ccc
\ No newline at end of file
+ddd
```

## patchを当てる

なんと、Unified形式のpatchを出力するだけでなく、patchを当てることもできた。

```coffeescript
jsdiff = require "diff"

orig = """
aaa
bbb
ccc
"""

modified = """
aaa
bbb
ddd
"""

patch = jsdiff.createPatch "test", orig, modified, "original text", "modified text"
patched = jsdiff.applyPatch orig, patch
console.log patched
```

### 結果

```
aaa
bbb
ddd
```

## Unified形式のパッチをパースする

patchを当てられるのだからある種当然ではあるが、Unified形式のpatchをパースして内容をObjectとして返す機能もある。

```coffeescript
jsdiff = require "diff"

patch = """
Index: test
===================================================================
--- test	original text
+++ test	modified text
@@ -1,3 +1,3 @@
 aaa
 bbb
-ccc
\ No newline at end of file
+ddd
"""

content = jsdiff.parsePatch patch

console.log content
console.log content[0].hunks
```

### 実行結果

```coffeescript
[ { index: 'test',
    oldFileName: 'test',
    oldHeader: 'original text',
    newFileName: 'test',
    newHeader: 'modified text',
    hunks: [ [Object] ] } ]
[ { oldStart: 1,
    oldLines: 3,
    newStart: 1,
    newLines: 3,
    lines: [ ' aaa', ' bbb', '-ccc', ' No newline at end of file', '+ddd' ] } ]
```
性能改善の取り組み

前回は、自分が所属しているチームで行っているテストについて書きました。
今回は自分が実装する際に気をつけている点と、性能改善で利用している New Relic と locustについて書きたいと思います。

# 実装で気をつけていること
一番気をつけていることは「ループの中でselectやcreateしているならループの外に出す」です。
select in で取ってくる、 bulk createする、これだけで結構レスポンスは改善されます。
アルゴリズムがどうとかそういうのはこれを取り除いてからしてます。

# ツールの登場
どんだけ気をつけていても人間です。ついそのままにしているケースがあります。
New Relicで処理にかかっている時間を確認すると、同じselect文を何回も発行している状況を見ることができます。
それが見つかったならば1度で済むようにできないか検討・修正します。

## New Relic ##
### 遅い処理は無いかな〜
![スクリーンショット 2015-11-02 14.34.57.png](https://qiita-image-store.s3.amazonaws.com/0/98381/afbdb3fb-0caf-217b-98ac-ddb7086827e0.png)
*このAPIの実行時間が約600msもかかっている!!*

### なんでだろ〜？
![スクリーンショット 2015-11-02 14.54.57.png](https://qiita-image-store.s3.amazonaws.com/0/98381/60b8e6d6-6409-c4f9-2431-5a7f509c911a.png)
*selectを71回も実行している!!*

まずこんな感じで修正できそうなところを探して改善を試みます。

## Locust ##
http://locust.io
Locustは負荷試験のツールです。New Relicで改善を行ったらlocustを使って負荷をかけ、APIのレスポンスを確認します。
そうするとロックの解放待ちでレスポンスが遅かったり、そもそも「*デッドロック発生！*」という結果が出て来るので、「じゃぁロックをかける範囲を狭くしよう」とか「ロックかける順番間違えてました！」なんてことが発覚し、更なる改善の手助けになりました。
それでも遅い、ということはあまりありませんでしたが、その場合はロジックを見直した方が良いということですね。

### Why Locust? ###
**わかりません！**
自分、担当じゃなかったので！
この項目を書いている時はなんか駆け足でこの項目を通り過ぎようとしている感じです。

ただ、以前負荷試験をやることになりそうだったときにいじったJMeterと比較すると分かりやすかったです。
なぜかというと、pythonのコードで負荷試験が書かれてるから。
なんか自分でも書けそうだな、と思いました。
負荷試験のコードは実装経験がないので、後ほど勉強して投稿しますが、ヘビーユーザやライトユーザ用にアクセス人数を設定して、APIを叩く比率を設定して負荷をかけてる、ってことは分かりました（まぁJMeterもそういうことできると思いますが）。

ということで、次回のネタはLocustについて、にしたいと思います。
SDKMANを使ってgrailsをインストール

grailsをやってみたくなったのでSDKMANを使ってインストールするために色々やったこと
(MacOS 10.9.5)

## SDKMANとは
http://sdkman.io/
jvmで動く系モジュール(gradleとかgroovyとか)の管理ツール(元gvm)
The Software Development Kit Manager の略
gemとかpipとかの仲間です。もしかしたらjvm系だけじゃないかも。

## インストール
※公式からの抜粋です
内部でcurlを使っているようなのでターミナルで
```$ curl -s http://get.sdkman.io | bash```
(curlのインストールは割愛)
SDKMANのでっかいAAが出てダウンロード&インストールが完了します。

その後ターミナルの別窓を開いて
```$ source "$HOME/.sdkman/bin/sdkman-init.sh"```
作業スペースの作成と初期化ですかね？

ここまで終わったら
```$ sdk version```
と打てば
```sdkman 3.2.4```
(2015/11/2現在)
とバージョン表示&コマンドパスが通っていることを確認してインストール完了です。
sdkとか結構汎用的な単語占拠してますがいいんですかね(^^;)

## 使い方
```$ sdk list```
で利用可能なモジュール一覧が表示されます。
あまり数は多くないですが、モジュールの軽い紹介も表示されるのでなかなかよさ気。
Scala, Gradle, Spring, Mavenとよく名前を見るのが揃ってますね。
今回はgrailsを構築したいのでまずは
```$ sdk install groovy```
でgroovyを取得。

追記: GrailsにはGroovyが組み込まれてるらしいのでGrailsをやりたいだけなら別途Groovyのインストールは不要らしいです。

## grailsインストール
次は本命のgrailsを
```$ sdk install grails```
で取得しようとしたら…
```curl: (60) SSL certificate problem: unable to get local issuer certificate```
エラーですね。ルート証明書関連のようです。
ちなみにこれはcurlのエラーなのでエラーメッセージの下に続く、
-kとか、--insecureオプション使えばいいよ。というアドバイスはcurl用です。
```sdk install grails -k```
とかやっても、「そんなオプションは知らん!」と言われます。
…ひどいな！

ググった結果、こちらの記事で、
https://github.com/sdkman/sdkman-cli/issues/327
curlを最新版にすればいいとありましたが、私の環境ではダメでしたね。
さらに読み進めるとconfigの設定を変えればいいよとのことなので、
インストールの際に作成した
```$ HOME/.sdkman```
を掘っていくと設定ファイルがありました。
```$ HOME/.sdkman/etc/config```
その中の、
```sdkman_insecure_ssl=false```
のパラメータをtrueにして再度インストールを試みると…
```Installing: grails 3.0.9
Done installing!```
OKですね！
HTML：OGPまわり メタ設定


# Facebook
```html
<meta property="og:title" content="タイトル">
<meta property="og:site_name" content="サイト名">
<meta property="og:url" content="サイトURL">
<meta property="og:description" content="説明がここに入ります。説明がここに入ります。">
<meta property="fb:app_id" content="[FB_APP_ID]">
<meta property="og:type" content="website">
<meta property="og:image" content="OGP画像パス">
```

参考
https://developers.facebook.com/docs/sharing/best-practices#tags
- 画像サイズは 1200 x 630px（600x315pxより小さい場合は、大きな画像で表示されない）
- 最小サイズは200x200px（それより小さいとエラー）

デバッガー - 開発者向けFacebook
https://developers.facebook.com/tools/debug/


# Twitter Cards
## Summary with Large Imageカード
```html
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@username">
<meta name="twitter:title" content="タイトル">
<meta name="twitter:description" content="説明がここに入ります。説明がここに入ります。">
<meta name="twitter:image:src" content="OGP画像パス">
```
https://dev.twitter.com/ja/cards/types/summary-large-image

検証ツール
https://cards-dev.twitter.com/validator


# Google+
```html
<!-- 次のように html タグを更新して、itemscope 属性と itemtype 属性を含めてください。 -->
<html itemscope itemtype="http://schema.org/Product">

<!-- head 内に次の 3 つのタグを追加してください。 -->
<meta itemprop="name" content="タイトル">
<meta itemprop="description" content="ここに説明が入ります。ここに説明が入ります。">
<meta itemprop="image" content="画像パス">
```
https://developers.google.com/+/web/snippet/?hl=ja


# まとめ
```html
<!DOCTYPE html>
<html lang="ja" itemscope itemtype="http://schema.org/Product">
<head>
<meta charset="UTF-8">

<title>タイトル</title>
<meta name="description" content="説明がここに入ります。説明がここに入ります。">
<meta name="Keywords" content="キーワード">

<meta property="og:title" content="タイトル">
<meta property="og:site_name" content="サイト名">
<meta property="og:url" content="サイトURL">
<meta property="og:description" content="説明がここに入ります。説明がここに入ります。">
<meta property="fb:app_id" content="[FB_APP_ID]">
<meta property="og:type" content="website">
<meta property="og:image" content="OGP画像パス">

<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@username">
<meta name="twitter:title" content="タイトル">
<meta name="twitter:description" content="説明がここに入ります。説明がここに入ります。">
<meta name="twitter:image:src" content="OGP画像パス">

<meta itemprop="name" content="タイトル">
<meta itemprop="description" content="説明がここに入ります。説明がここに入ります。">
<meta itemprop="image" content="OGP画像パス">

</head>
<body>

コンテンツ

</body>
</html>
```
ipython notebook on chromebook

ちょっと長めの動機
---
ipython notebook でopencvを使って画像解析したい
観測で得られた各種センサーデータをDBに登録しているルーチンワーク中で
センサーの精度によるエラーやドリフトが起きているバッドデータは弾く必要があるのだが
機械学習的にフィルターで弾けなかったデータは人間が目視確認しているため。

グラフ画像で滑らかな曲線ではなく、エッジの立っているグラフはバッドデータとして弾く必要があるがグラフ画像の画像解析で処理出来ないかな？という思いからスタート。

openCVは以前大学院の研究ネタとしてWindowsで試してみたがまずインストールが大変面倒で死ぬ。
C++かJavaで書く必要があってこれも死ぬ（ここ１０年位LL系で仕事しているので書けないことはないけど面倒くさい）

ipython notebook + opencvなら試行錯誤が楽そうだなと思い、アウトレットで買ってからUbuntuを入れてちょっと遊んだだけで死蔵しているChromebookで開発環境作れないかな？と思った。フロントカメラも付いているしいろいろ使えたら面白そうじゃない？？？

最終目標はChromebook上でipython notebook + opencv が動く開発環境の構築、カメラも使えたら更に良いという感じ

今のところはipython が動いたところまでです。opencv なぜかimportされない・・・

手順
---
0.使用機材：Asus Chromebook C300MA（英語キーボード派）
1.リカバリ状態からスタート
2.デベロッパーモードで起動（esc + reload(F3) + Power)
3.[chromebrew インストール](http://qiita.com/yasuki/items/9d7f7eb3f38aa51701d3)
4.いろいろなツールを入れるのに書き込み権限がないと怒られるので[/usr/local/homeへシンボリックリンクを貼る](http://qiita.com/yasuki/items/fa14c258df0d088c6b98)
5.pipのインストール
`wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py -O ~/Download/get-pip.py`
`sudo python get-pip.py`
6.pipでipythonをインストール、4の方法でsudoしなくても良いはずだがうまく行かなかったのでsudoでやった
`sudo pip install ipython`
7.起動　`ipython notebook`
8.ブラウザの新しいタブを開いてlocalhost:8888にアクセス
9.jupyterが動いているので普通に使えそう・・

今後の予定
---
anacondaをインストールしてopencvをインストールしたもののipython上でimport cv2とするとmodule not foundと言われるので、エラーを解消したい。
-


目立たないけど便利でニクい奴。ハイフン。

## Bash

`cd`コマンドで指定すると、今のディレクトリに`cd`する前にいたディレクトリに移動できます。

```bash
[host@user ~]         $ cd ~/path/to/somewhere
[host@user somewhere] $ cd /etc/init.d
[host@user init.d]    $ cd -
[host@user somewhere] $ # ← さっきいたディレクトリに戻った!
```

## Git

`checkout`コマンドで指定すると、今のブランチをチェックアウトする前にいたブランチに移動できます。

```bash
[host@user repo] (release-1.2.0) $ git checkout add_xxx
[host@user repo] (add_xxx)       $ git checkout -
[host@user repo] (release-1.2.0) $ # ← さっきいたrelease-1.2.0ブランチに戻った!!
```

`merge`コマンドでも、一つ前にチェックアウトしていたブランチを今のブランチにマージすることができます。
機能改修ブランチで作業していた内容をリリースブランチにマージするときなど、ブランチを行き来してマージするときに便利!

```bash
[host@user repo] (add_xxx)       $ git checkout release-1.2.0
[host@user repo] (release-1.2.0) $ git merge -
Merge made by the 'recursive' strategy. # ← さっきいたadd_xxxがマージされる
```
Pythonで逆行列を求める＆検算

やりたいこと：逆行列を求める方法をPythonで実装

行列のサイズが大きくなると処理の最適化とかとかを考えないといけないですが、
この記事では"逆行列を求めるっていう概念的な部分"とPythonでの実装が結びつくことを目指します。
(`Numpy`を使います)

## (サンプル)行列の定義

```math
A=\left(
\begin{matrix}
1 & 2 \\
3 & 4 
\end{matrix}
\right)
```
とします。実装ではこんな感じ：

```py
> import numpy as np
> A = np.array([[1,2],[3,4]])
```

### 一応、中身のck
```py
> A 
array([[1, 2],
       [3, 4]])
```

## 行列式を計算しよう
行列式=0になってしまったら、逆行列もヘッタクレもないのでチェック：

```math
{\rm det}(A)={\rm det}\left(
\begin{matrix}
1 & 2 \\
3 & 4 
\end{matrix}
\right)
=1\times 4-2\times3=-2
```

実装的には

```py
> np.linalg.det(A)
-2.0000000000000004
```

### 逆行列を求めてみよう

数学的には、

```math
A = \left(
\begin{matrix}
a & b \\
c & d
\end{matrix}\right)
```

に対して

```math
A^{-1} = \frac{1}{{\rm det}A}\left(
\begin{matrix}
d & -b \\
-c & a
\end{matrix}\right)
```

はわかっているものとして代入。

```math
A^{-1} = \frac{1}{-2}\left(
\begin{matrix}
4 & -2 \\
-3 & 1
\end{matrix}\right)
=\left(
\begin{matrix}
-2 & 1 \\
1.5 & -0.5
\end{matrix}
\right)
```

実装的には

```py
> inv_A = np.linalg.inv(A)
> inv_A
array([[-2. ,  1. ],
       [ 1.5, -0.5]])
```

ここで`linalg`は、`numpy`のモジュール。より詳しくは
`http://docs.scipy.org/doc/numpy/reference/routines.linalg.html`
を参照

## 最後に検算

逆行列と元の行列を掛け算すると単位行列になるよね、って話の確認、つまり：

```math
AA^{-1}=A^{-1}A=
\left(
\begin{matrix}
1 & 0 \\
0 & 1
\end{matrix}
\right)
```


```py
> np.dot(A,inv_A)
array([[  1.00000000e+00,   1.11022302e-16],
       [  0.00000000e+00,   1.00000000e+00]])
> np.dot(inv_A,A)
array([[  1.00000000e+00,   4.44089210e-16],
       [  0.00000000e+00,   1.00000000e+00]])
```
キレイに単位行列にならないのは、数値的なアレなんですかね、よく分からないんですが、、、

いろいろ試してみたい場合は、行列$A$をいろいろ変化させて実験してみて下さい。
Elmの無名関数は"\..."と書かずに"λ..."でもOK

## unicodeのλで無名関数をかける

Elmの無名関数はカッコ`(..)`で括ってても必ずバックスラッシュ`\...`で始めないといけません
これは時間空くと忘れそうだなと思ってました

実はバックスラッシュを使わず、ラムダ`λ..`(unicodeの）を使ってもOK

- documentには書いてません
- さらに、右方向のアロー演算子`->`も`→`とUnicodeつかえるらしい

ってことで、次のように書いても問題なく動く

```elm
import Html exposing (..)
main =
  List.map (λn → n^2) [1..10]
    |> List.foldr (+) 0
    |> toString
    |> text
```
- [Try Elm](http://elm-lang.org/try)にこのコードコピペして確認できる
- https://github.com/elm-lang/elm-compiler/blob/master/src/Parse/Expression.hs#L230

とはいえ、実際には自分が使うエディタの入力では入力大変なので使わないだろうけど

## ここで紹介されてた

- [uncommon Elm syntax - Google グループ](https://groups.google.com/forum/#!topic/elm-dev/rLY6bsfQoCc)
【AWS】 EC2インスタンスをJenkinsで自動起動＆停止

AWSでコストダウンするために、Jenkinsのジョブで自動停止と起動ができるようにしました。

# 事前準備
EC2の設定で以下のタグを追加

- Stop
- Start

# 起動

以下コマンドを朝の8時に起動するように設定します。

```start-instances.sh
aws ec2 start-instances --region=ap-northeast-1 --instance-ids `aws ec2 describe-tags --region ap-northeast-1 --filters Name=resource-type,Values=instance Name=key,Values=Start Name=value,Values=true --query 'Tags[*].ResourceId' --output text`
```

※尚、PublicインスタンスでRoute53又はELBを利用している場合はインタンス起動後に以下の処理が必要です。

- Route53：レコードへのPublicIP再設定
- ELB：ELB再設定

過去記事を参考に設定して下さい。

>参考：http://qiita.com/3utama/items/5a0211e6bad7380b8a27

# 停止

以下のコマンドを19時に起動するように設定します。

```stop-instanecs.sh
aws ec2 stop-instances --region=ap-northeast-1 --instance-ids `aws ec2 describe-tags --region ap-northeast-1 --filters Name=resource-type,Values=instance Name=key,Values=Stop Name=value,Values=true --query 'Tags[*].ResourceId' --output text`
```

スポットインスタンスの場合は停止が出来ないので、terminateします。

```terminate-instance.sh
aws ec2 terminate-instances --region=ap-northeast-1 --instance-ids `aws ec2 describe-tags --region ap-northeast-1 --filters Name=resource-type,Values=instance Name=key,Values=Stop Name=value,Values=terminate --query 'Tags[*].ResourceId' --output text`
```

# 問題
Route53へのAPIコールは通常5call/秒が上限に設定されているため、Publicインスタンスの数が５を超える場合、以下のエラーメッセージが返却されて接続できなくなります。

>The request was rejected because Route 53 was still processing a prior request.

そのため、起動時はInstanceIdを取得後、１つずつ実行するように修正しました。

```start-instances.sh
for instanceid in $( aws ec2 describe-tags --region ap-northeast-1 --filters Name=resource-type,Values=instance Name=key,Values=Start Name=value,Values=true --query 'Tags[*].ResourceId' --output text ); do   
    aws ec2 start-instances --region=ap-northeast-1 --instance-ids ${instanceid}
    sleep 5s
done
```

無事解決しました！

# おまけ
AWS Cli でフィルターかけるときに、ResouceTypeなどのキャメルケースの場合はresource-typeの用にスネークタイプに置き換える必要があります。
ただしStartのような単語で頭文字のみ大文字の場合はそのまま！なんでや！
VyOSにAWSCLIをインストールする

#VyOSにAWS CLIをインストールする

VyOSは以下を使用：
VyOS (HVM) 1.0.5-760e742d-5ec6-4d7b-b15c-2df9e3f3a450-ami-9ea315f6.2 (ami-67351f66)

#AWS CLIをインストール

```bash:pipをインストール
wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo easy_install pip
pip --version
```

```bash:awscliをインストール
sudo pip install awscli
sudo pip install --upgrade awscli
complete -C aws_completer aws
aws --version
```

以上です
島根県CMS michekerの設定

# 島根県CMS michekerの設定

参考
http://blog.scimpr.com/2014/03/16/jruby-on-rails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92war%E5%8C%96%E3%81%97%E3%81%A6tomcat7%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%9Cwarbler/

### 島根県CMSのインストール
環境設定：http://qiita.com/yoshiokaCB/items/29f04afd2f945fb1f035
デプロイ：http://qiita.com/yoshiokaCB/items/864bb10f9558e3308c63

## 環境準備
```bash
apt-get install tomcat7
cd app-root
bundle install
```

## 動作を確認
localhost:8080でアクセスしてみる。

```bash
bundle exec rails s -e production -p 8080
```

## javaにコンパイル
```bash
warble
```

## tomcatのルートディレクトリにファイルを設置
```bash
cp pref-shimane-checker.war /var/lib/tomcat7/webapps/
/etc/init.d/tomcat7 restart
```

## logの場所
```bash
/var/log/tomcat7/
```
Drupal をVagrantで動かしてみる。

最近人気になってきたDrupalがどんなものか使ってみたくて、仮想環境に設定をしてみる。

## 環境
OS : Mac OS X
VirtualBox + Vagrant

## 設定

以下のサイトからvagrantのファイルを一式ダウンロードする。
https://www.drupal.org/project/vdd

ダウンロードしたzipファイルを展開し、展開したファイルの中へ移動する。

```bash
cd droup_dir
```

何も考えずに以下のコマンドを打つ

```bash
vagrant up
```

### hostsの編集

```bash
sudo vi /etc/hosts
# 下記を追加
192.168.44.44 drupal8.dev
192.168.44.44 www.drupal8.dev
192.168.44.44 drupal7.dev
192.168.44.44 www.drupal7.dev
```
全て終了したら192.168.44.44　にアクセスしてアパッチの画面が表示されることを確認。

### 仮想サーバにアクセス

```
vagrant ssh
```

### 最新のファイルを取得

```bash
cd sites/drupal8/
git clone --branch 8.0.x git://git.drupal.org/project/drupal.git .
# httpではなくgitを使っていることに注意
```

### mysql の設定

```bash
mysql -u root

> create database drupal_db;
> grant all privileges on drupal_db.* to 'drupal'@'localhost' identified by '1234';
```

以上、作業が終わったら、ブラウザで「www.drupal8.dev」にアクセスする。
あとは、インストールガイドにそってインストール作業を行う。
El CapitanからのSMB接続で、濁点・半濁点のあるフォルダが開けない

社内に共有サーバ（Linux）があり、SMBを使用してWin/Macでファイル共有を行っているのですが、
新しく購入したEl CapitanのPCで接続出来ないフォルダが有りました。
なんとか接続・閲覧が出来るようになったので、備忘録も兼ねて初めての記事を書いてみようと思います。


※2016/12/12更新
Sierraの実機で確認出来るタイミングがありましたので、確認しましたが、Sierraでは解消されています。
（ただし、SierraではPPTP方式でのVPNが出来ないので、アップデートされる際はご注意ください。）


#症状
サーバへ接続→「smb://サーバIP」で接続→ユーザ名・パスワードを入力→フォルダを選択
で接続を試みる
→エラーメッセージは出ないものの、デスクトップに接続中のサーバとして表示されず、Finderのウィンドウも開かれない現象が発生
↓
Finderから接続中のサーバを選択し、先程接続したフォルダをダブルクリック
→「オリジナルの項目が見つからないため操作を完了できません」と言われ、フォルダが開けない
↓
他のフォルダも試してみる
→開けるフォルダもある
↓
上記の方法で接続したサーバは/Volumes以下にマウントされるので、Finderで/Volumesを見てみる
→開けるフォルダはいるけど、開けないフォルダはいない
↓
mountコマンドでマウントされているか確認してみる
→開けないフォルダもマウントされている
↓
ターミナルで「ls /Volumes」して確認
→開けないフォルダも存在し、内部の確認も可能

#原因
いろいろなフォルダを確認してみた結果、確認した限りでは
濁点・半濁点の付いているフォルダのみ開けない事がわかった。
　　例：
　　「総務」→開ける
　　「総務フォルダ」→開けない

この事から、この問題は「UTF-8(NFC)」と「UTF-8-MAC(NFD)」の濁点・半濁点が含まれる文字の変換差異により発生していると考えられる。
※参考
[Mac OS X の NFD 問題での対策諸々](http://qiita.com/knaka/items/48e1799b56d520af6a09)

おそらく、「サーバへ接続」から接続した際、ローカル上に作成されるマウント先のパスが
共有サーバ側の文字コード（UTF-8）で作成されていて、Finderから認識できないのだと考えられる。

#解決方法
ターミナルからmount_smbfsコマンドを用い、
マウント先を文字コードで指定して接続すれば、正常に接続・閲覧が可能。

/Volumes以下にマウント先を手動で作成することは出来ないので、
「/Users/【ユーザ名】」以下にmountフォルダを作成し、その下にマウント先のフォルダを作成することで対応することにした。

ということで、Automaterでシェルスクリプトを書いて、すべてのフォルダ分用意した。
実際に作成したシェルスクリプトは以下の通り。
（せっかくなので、キーチェーンからのユーザ名・パスワードの取得もやってみた。）

```
USERNAME=`security find-internet-password -gs 【キーチェーン名】 2>/dev/null |grep "acct"|sed -e 's/"acct"<blob>="//' -e's/"//' -e's/^ *//g'
PASSWORD=`security find-internet-password -gs 【キーチェーン名】 -w`
mkdir -p ~/mount/【フォルダ名】
mount_smbfs //${USERNAME}:${PASSWORD}@【接続先サーバIP】/【NFCで文字コード変換したサーバ上のフォルダ名】 ~/mount/【フォルダ名】

#「サーバに接続」と同様に、接続時にFinderを起動したいなら、最後に以下の1文を追加
open ~/mount/【フォルダ名】
```

例として、192.168.0.1にある「総務フォルダ」をマウントする場合、mount_smbfsの部分は以下のようになる。

```
mount_smbfs //${USERNAME}:${PASSWORD}@192.168.0.1/%E7%B7%8F%E5%8B%99%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80 ~/mount/総務フォルダ
```

日本語のフォルダ名の文字コードへの置換については
http://www.benricho.org/moji_conv/16-URLencode_UTF-8.html
辺りを使うと良いかと。

この問題、サーバ側の設定が悪い可能性もありますが、検索かけても全然事例が出てこず、苦労しました。
Yosemiteまでは普通に接続できたので、El Capitan側の問題だと思うんですが。
これでひとまず安心です。
ちなみに、上記の方法で接続さえできれば、下層にある濁点・半濁点のあるフォルダは開けます。

なお、確認した限りでは、AFPなら問題なく接続できるようです。
（BuffaloのTeraStationで確認）
LinuxにAFPデーモンを入れての確認までは出来ていないですが、参考まで。


※追記
サーバのOSは「CentOS release 6.3 (Final)」
Linuxのバージョンは「2.6.32-279.22.1.el6.x86_64」
SMBのバージョンは「3.6.23-14.el6_6」
です。

※追記2（2015/12/14）
OS X 10.11.2が出ましたが、まだ修正されていないようです。

※追記3（2015/12/22）
AFPでは問題なさそうである旨追記
文字コード変換についての参考URL追加
シェルスクリプト部分をそのまま使えるよう、説明の箇所をコメントアウト形式に変更

※追記4（2016/6/14）
OS X 10.11.5でも修正されていないことを確認しました。
日本語の曜日名を表示するTwig拡張フィルタを作りました

date関数では日本語曜日名がとれません
なんかコントローラ側で曜日一覧配列を生成してテンプレートにアサインするというダサいことをやっていたので、何とかしようと思います

Symfony2でTwigの拡張フィルタを作る方法
http://docs.symfony.gr.jp/symfony2/cookbook/templating/twig_extension.html

とりあえずみようみまねで作った

```php
<?php

namespace AppBundle\Twig;
use Symfony\Component\Validator\Constraints\Date;

class WeekdayNameExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('weekday_name', array($this, 'weekdayNameFilter')),
        );
    }

    public function weekdayNameFilter ($datetime)
    {
        $weekdayNames = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
        $timestamp = strtotime($datetime);
        $weekday = date('w', $timestamp);
        return $weekdayNames[$language][$weekday];
    }

    public function getName()
    {
        return 'weekday_name_extension';
    }
}
```

テンプレート拡張というのは柔軟性が大事なので、もうちょっと親切にしたり異常系を意識したりコメント書いたりしてリッチにします

```php
<?php

namespace AppBundle\Twig;
use Symfony\Component\Validator\Constraints\Date;

/***
 * 日付っぽいデータを渡すと曜日名を返します
 *
 * Class WeekdayNameExtension
 * @package AppBundle\Twig
 */
class WeekdayNameExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('weekday_name', array($this, 'weekdayNameFilter')),
        );
    }

    /***
     * 日付っぽいデータを渡すと曜日名を返します
     *
     * @param mixed $datetime
     * @param string $language
     * @return string
     */
    public function weekdayNameFilter ($datetime, $language = 'ja')
    {
        $weekdayNames = array(
            'en' => array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'),
            'ja' => array('日', '月', '火', '水', '木', '金', '土')
        );

        if ($datetime instanceof \DateTime) {

            // DateTime型の場合

            $weekday = $datetime->format("w");
            return $weekdayNames[$language][$weekday];

        } elseif (is_numeric($datetime)) {

            // 数字が渡された場合はunixtimeと解釈する

            $timestamp = $datetime;
            $weekday = date('w', $timestamp);
            return $weekdayNames[$language][$weekday];

        } elseif (is_string($datetime) && $timestamp = strtotime($datetime)) {

            // 文字列の場合

            $weekday = date('w', $timestamp);
            return $weekdayNames[$language][$weekday];
        }

        // 変なデータがきた場合、そのまま差し戻すとstringにキャストできなくてエラーになったりするので、何も返さない
        return "";
    }

    public function getName()
    {
        return 'weekday_name_extension';
    }
}
```

かんたんです

バグ魔なのでなんか間違ってたらおしえてください

ほんとはdateを拡張するのがベストなんですがフィルタ名とか曜日フォーマット名とかどうすんねんっていうのがあるのでそっちは熟考したい
Dockerfileのプロキシ定義

まだまだDocker本家のサンプルを動かしています。
現在はここ：　http://docs.docker.com/linux/step_four/

Dockerfileを作ってビルドをするところです。
なにやらまたproxyにハマりました。

## Dockerfileの作成

<pre>
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
</pre>

## イメージのビルドをすると、ログらしきログが出ることもなく止まる…。
<pre>
$ docker build -t docker-whale .
Sending build context to Docker daemon 2.048 kB
Step 0 : FROM docker/whalesay:latest
 ---> ded5e192a685
Step 1 : RUN apt-get -y update && apt-get install -y fortunes
 ---> Running in 8141845dddea
</pre>

## proxy設定がないことに気づく！
下記のようにプロキシの設定を追加してあげたら無事成功！
<pre>
FROM docker/whalesay:latest

ENV https_proxy "http://~~~~~"
ENV http_proxy "http://~~~~~"

RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
</pre>
Cocos2d-x〜インストールまでの手引き Mac編〜

#Cocos2d-x インストール編
##参考にしたURL
cocos2d-xを準備しよう！
http://libro.tuyano.com/index3?id=6456003

##主に上記でつまづいた点
###1. setup.pyによるpython設定ファイル実行ができない
`-bash: setup.py: command not found`
**→ 環境変数設定が必要！！！**
1.python設定をいじるためのHomebrewをインストールする
`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
2.export PATHでPythonのPATHを通す
`export PATH=/usr/local/bin:$PATHln -s /usr/local/share/python/easy_install /Users/ユーザー名/Desktop/cocos2d-x-3.8.1`

僕の場合これでいけました。ちなみにpythonのバージョンはPython 2.7.10の32bit版。
  調べたところPython 2系の32bitの方が失敗が少ないみたいです。
  おそらくPythonを扱ったことがないエンジニア（もしくは一般の方）がインストールのときに引っかかるのは、ここが一番かと思われます。

###2. setup.py完了後のproject directoryにてcocosコマンドが実行できない
  `cocos new MyCocosApp -l cpp`
  しても反映されないどころかlsコマンドすら効かなくなっている件についてです。
  **→これは簡単に解決！！ターミナルを再起動してください！**
  どうやら環境変数設定をした後は再起動しなければcocosコマンドは効かず更には通常時支えているlsコマンドすらも効かなくなるみたいです。（なぜかcdは使えた）

  なにはともあれ無事にこれで開発キットを生成することができました！！あとはAndroid/iOSプロジェクトにC++をひたすらに書いていくだけですね！(^^)/


![スクリーンショット 2015-11-02 14.06.32.png](https://qiita-image-store.s3.amazonaws.com/0/95487/cfcd67f9-e071-ebd2-49a8-afaf03108c59.png)
xcconfigでビルド設定を外部ファイル化する

# debug用とrelease用のxcconfigを作る

- 新規ファイル作成 > iOS > Other > Configuration Setting File 
- 「Config.debug.xcconfig」と「Config.release.xcconfig」を作成する
- 各xcconfigファイルにビルド設定を記述する

Config.debug.xcconfig

```bash
OTHER_SWIFT_FLAGS = $(inherited) "-D" "DEBUG"
```

Config.release.xcconfig

```bash
OTHER_SWIFT_FLAGS = $(inherited)
```

# ProjectのConfigurationsの設定で、xcconfigを使うように設定する

- Project > Info > Configurations
- 以下のように設定する

![Artboard 1.png](https://qiita-image-store.s3.amazonaws.com/0/9875/83aee91f-91dc-6c90-23a0-3b29449d82b9.png)

# 使い方

API.swiftなどを作って、DEBUGが定義されているかどうかで、URL定数の値を変化させます。

```swift
# API.swift

class API : NSObject {
  #if DEBUG
  static let URL = "http://debug.hoge.com/api"
  #else
  static let URL = "http://production.hoge.com/api"
  #endif
}
```