OmniAICreator/Qiita-1.07M huggingface dataset:
php 特定ディレクトリ内のファイル名一覧を取得

#php 特定ディレクトリ内のファイル名一覧を取得

指定ディレクトリからファイル名一覧を抜き出します。

下記イテレーターを使用してディレクトリ配下のファイル名を取得していきます。
http://php.net/manual/ja/class.recursivedirectoryiterator.php （RecursiveDirectoryIterator クラス）
http://php.net/manual/ja/class.recursiveiteratoriterator.php （RecursiveIteratorIterator クラス）


```php:getFileList
public function getFileList($dir) {
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    $list = [];
    foreach ($iterator as $fileinfo) {
        if ($fileinfo->isFile()) 
            $list[] = $fileinfo->getPathname();
    return $list;
}
```

処理内の[$fileinfo]はSplFiIeInfoオブジェクトとなります。
isFile()にてファイル確認をしています。
http://php.net/manual/ja/class.splfileinfo.php （SplFileInfo クラス）


#php 特定ディレクトリ内のファイル名一覧を取得（正規表現）

下記は正規表現でのパターン条件を追加したversion。

```php:getFileListRegex
public function getFileListRegex($dir, $regex) {
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    $iterator = new RegexIterator($iterator, $regex, RecursiveRegexIterator::MATCH);
    $list = [];
    foreach ($iterator as $fileinfo) {
        if ($fileinfo->isFile()) 
            $list[] = $fileinfo->getPathname();
    return $list;
}
```
```php:getFileListRegex(数字4桁のディレクトリから始まるディレクトリを検索使用例)
$dir = dirname(__FILE__);
$regex = sprintf('/^%s[0-9]{4}\/.*$/', preg_quote($dir, '/'));
$files = $file->getFileListRegex($dir, $regex);
```
RegexIteratorの操作モード(第三引数)は下記
http://php.net/manual/ja/class.regexiterator.php （RegexIterator クラス）
>RegexIterator::ALL_MATCHES
>現在のエントリにマッチするものをすべて返します (preg_match_all() を参照ください)。
>
>RegexIterator::GET_MATCH
>現在のエントリに最初にマッチしたものを返します (preg_match() を参照ください)。
>
>RegexIterator::MATCH
>現在のエントリに対するマッチ (フィルタ) のみを行います (preg_match() を参照ください)。
>
>RegexIterator::REPLACE
>現在のエントリを置換します (preg_replace() を参照ください。まだ完全には実装されていません)。
>
>RegexIterator::SPLIT
>現在のエントリで分割した値を返します (preg_split() を参照ください)。
DockerでUbuntu + CUDA環境作ろうとして keyboard-configuration に邪魔されたとき

事情により表題のような環境を作りたくなったのだが、
普通にやると `keyboard-configuration` の設定画面でとまってしまって
地味にハマったのでメモ。

結論としては `ARG DEBIAN_FRONTEND=noninteractive` 指定しておけばよさげ。

```dockerfile:example
FROM ubuntu:16.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y wget

RUN wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
RUN dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
RUN apt-get update
RUN apt-get install -y cuda
```

(すなおに https://hub.docker.com/r/nvidia/cuda/ とか使っとけばいいだけの話かもしれないが...）

#### 参考

- [CUDA 8.0 Downloads | NVIDIA Developer](https://developer.nvidia.com/cuda-downloads)
- [ENV DEBIAN_FRONTEND noninteractive · Issue #4032 · docker/docker](https://github.com/docker/docker/issues/4032#issuecomment-192327844)
- [DEBIAN_FRONTEND=noninteractive ってなんだ - Qiita](http://qiita.com/udzura/items/576c2c782adb241070bc)
Digdagで特定のバージョンをインストールする方法


# 概要
Ansibleなどの構成管理ツールを利用して、DigdagのProvisioningをする際にDigdagのバージョン固定をした状態で導入することで、冪等性が保証されるようにする
※ 公式ドキュメントには最新版前提で書かれているため

# 対象読者
何らかの理由で、特定バージョンのDigdagを利用したい方
👉　概要での説明でも出てきた通り、プロビジョニングした際にバージョン固定をしたいなど


# Digdag導入手順

## 1. 最新版を導入したい
まずは最新版の導入手順から、
[Getting Started](https://docs.digdag.io/getting_started.html#downloading-the-latest-version) の手順では、最新版のjarを導入する手順が紹介されています。

上記公式ドキュメントに記載されていますが、Digdag導入は以下のたった3ステップでできてしまいます。
あら簡単:flushed: 

```
$ curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest"
$ chmod +x ~/bin/digdag
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
```

上記で分かる通り、jarをダウンロードするURLとして、
https://dl.digdag.io/digdag-latest
で最新版をGETできることがわかります:+1: 

## 2. 特定バージョンを導入したい
次に、特定のバージョンを導入したい場合です。
ドキュメントには記載されていませんが、

https://dl.digdag.io/digdag-${TARGET_VERSION}

上記URLの **${TARGET_VERSION}** 部分を、[Release Notes](https://docs.digdag.io/releases.html) に載っている特定のバージョン番号で置き換えれば良いようです。

例えば以下のような感じで…

例1) 2017-01-10にリリースされた、0.9.2をダウンロードしたい
https://dl.digdag.io/digdag-0.9.2


例2) 2016-12-14にリリースされた、0.9.1をダウンロードしたい
https://dl.digdag.io/digdag-0.9.1

このようになります。  
ですので最終的には下記のようにして、特定のバージョンを導入できます。

```
$ export TARGET_VERSION=0.9.1
$ curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-${TARGET_VERSION}"
$ chmod +x ~/bin/digdag
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
```

Ansibleなどでプロビジョニングする際のバージョンを固定する時に役立ちそうですネ!!!:satisfied:


# 参考
- [Digdag 公式ドキュメント](https://docs.digdag.io/index.html)

# あとがき
ぜひDocumentからでも…Contributeしていきたいです（願望）
もしも何か不都合があれば、お知らせください:bow:
pandasを使いエクセルからデータフレームを作る

# こう書きます
import pandas as pd
excel = pd.ExcelFile('xxx.xlsx')
xxx_projects = excel.parse('プロジェクト',index_col="url")
df_xxx= pd.DataFrame(xxx_projects)

#補足
## 3行目について
プロジェクトって名前のシートから url ってカラムをインデックスにして内容を取り込んでる

index_col は別に必須でもないです。
ただ、指定することでインデックスとしての役割を持たせられる感じです。

つまり、url をインデックス行として指定しているという感じです。
もし指定がないと、行が 0 から始まります。
CakePHP3：メッセージを日本語化する

分かってしまえば至って簡単なのですが、ちょっとハマったので以下に記載します。

## 辞書ファイルの場所について
辞書ファイルの場所は自分で作ります。場所はapp/src/Locale/ja_JPです。パーミッションが正しいことを確認ください。apacheを使っているならば、apacheユーザがフォルダに入れること。

```
cd app/src/Locale
mkdir ja_JP
chmod （apacheユーザがアクセスできる権限）default.po
```

## 日本語を有効化する
### デフォルトを変更する場合
日本語対応する場合はapp.phpをいじります：

```app/config/app.php
 'App' => [
         'namespace' => 'App',
         'encoding' => env('APP_ENCODING', 'UTF-8'),
-        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
+        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'),
```

### デフォルトを維持し、コントローラ側で指定する場合

```app/src/Controller/AppController.php
+ use Cake\I18n\I18n

 public function initialize()
 {
+   I18n::locale('ja_JP');
    parent::initialize();
```

とします

## 辞書ファイルの生成

```
cd app/bin
./cake i18n

[E]xtract POT file from sources
[I]nitialize a language from POT file
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q)
> E

Current paths: None
What is the path you would like to extract?
[Q]uit [D]one
[/var/www/html/app/src/] > （改行）

Current paths: /var/www/html/app/src/
What is the path you would like to extract?
[Q]uit [D]one
[D] > D

Would you like to extract the messages from the CakePHP core? (y/n)
[n] > y

What is the path you would like to output?
[Q]uit
[/var/www/html/app/src/Locale] >（改行）

Would you like to merge all domain strings into the default.pot file? (y/n)
[n] > y

Extracting...
---------------------------------------------------------------
Paths:
   /var/www/html/app/src/
   /var/www/html/app/vendor/cakephp/cakephp/src/
Output Directory: /var/www/html/app/src/Locale/
---------------------------------------------------------------
==========================================================================> 100%
Done.
---------------------------------------------------------------
I18n Shell
---------------------------------------------------------------
[E]xtract POT file from sources
[I]nitialize a language from POT file
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q)
> Q
```

これで、default.potファイルがLocale配下に作成されるので、ja_JPディレクトリに移動＆default.poにリネームしてください。そして、default.poのパーミッションを必要に応じて修正します：

```
cd ja_JP
chmod （apacheユーザがアクセスできる権限）default.po
```

## poファイルを更新しても反映されない場合

``app/tmp/cache/persistent``ディレクトリの中に``_translations_``といった名前のファイルがあるので、削除してみてください
（初心者向け）OracleでNullがからむ時のまとめ

Where句や
Joinの接続条件などで、
Nullが入る可能性のあるカラムを扱うことがあります。

基本的なことだけど戸惑ってしまったので忘備録。


#Nullはヒットしないでほしい時。
通常コレ。普通にイコールで結びます。
Null≠Nullなので、Nullは無視される形で出力されます。

```
select *
from TBL
join TBL2
  on TBL1.Name = TBL2.Name
;
```

#片方がNullだけど出力してほしい時。
単にouter joinするだけです。

```
select *
from TBL
left outer join TBL2
  on TBL1.Name = TBL2.Name
;
```


#NullはNullと結合してほしい時
Null ≠ Null なのでNVLを使います。
ここではブランク' 'に置き換えてますが、
何か適切な初期値とかあればそれに置き換えて下さい。

```
--Oracle
select *
from TBL
join TBL2
  on NVL(TBL1.NAME,' ') = NVL(TBL2.NAME,' ')
;
```

MySQLだとifnull()が同じように使えるようです。

```
--MySQL
select *
from TBL
join TBL2
  on ifnull(TBL1.NAME,' ') = ifnull(TBL2.NAME,' ')
;
```

#Nullが入っている時は絞り込まないで出してほしいとき

検索フォームとかで「日付」を指定しなければ
すべての日付で検索してほしい、みたいな時ですね。

ORを使います。
NULLのときは無条件で出力、OR
NULLじゃなければ絞り込んで出力する、という意味です。

```
select *
from TBL
join TBL2
  on (TBL1.NAME IS NULL  OR  TBL1.NAME = TBL2.NAME)
;
```
※パフォーマンス的にいいのかわかりません。

とりあえず初心者向けで、パフォ度外視で
シンプルに書く方法のまとめでした。

詳しい方からのツッコミは大歓迎です。

くぎゅう10
bash コマンド置換

#bash コマンド置換

コマンド出力に置き換える方法。
削除用のシェルに7日前の日付情報を引数として渡す場合は以下になる。
※実行結果は両方とも同一

```sh:$(command)での置換
sh /xxx/delete.sh $(date --date "-7 days" +%Y%m%d)
```
```sh:`command`での置換
sh /xxx/delete.sh `date --date "-7 days" +%Y%m%d`
```


見易さ・ネストした際のエスケープを考えると、$()の方が良さそう。

```sh:$(command)での置換(ネストした場合)
echo $(echo "abcdefghijklmnopqrstuvwxyg" | cut -b $(echo "25"))
```
```sh:`command`での置換(ネストした場合)
echo `echo "abcdefghijklmnopqrstuvwxyg" | cut -b \`echo "25"\``
```

###man bash 引用

>コマンド置換 (command substitution) を用いると、 コマンド名をコマンドの出力で置き換えられます。 コマンド置換には以下の 2 つの形式があります:
>
>$(command)
>
>または
>`command`
>bash は command を実行し、 command の標準出力でコマンド置換の部分を置き換えます。 この際、末尾の改行文字は削除されます。 文字列の途中にある改行文字は削除されませんが、 単語分割の際に削除されることがあります。 コマンド置換 $(cat file) は、同じ意味を持ち、 しかも高速な $(< file) に置き換え可能です。
>
>バッククォートを使う古い形式の置換を用いたとき、 バックスラッシュは文字通りの意味を保ちますが、 $, `, \ の前にある場合は例外となります。 コマンド置換は、バックスラッシュが前置されていない バッククォートまでの部分です。 $(command) という形式を用いたときは、 括弧の間にある全ての文字がコマンドとなります。 特別扱いされる文字はありません。
>
>コマンド置換は入れ子にできます。 バッククォート形式のときに入れ子を行うには、 内側のバッククォートをバックスラッシュでエスケープします。
>
>置換がダブルクォート内部にある場合には、 置換の結果に対する単語分割とパス名展開は行われません。
>
Ruby on Rails ~herokuにRailsアプリをデプロイ(アップロード)する方法（コードメモ）

今回は、自作のRailsアプリをherokuにデプロイするまでの流れを紹介していきます。

【ポイント】
1.データベースはpostgresを指定する場合とMySQLを指定する2パターンを実装します。
2.deviseを導入している場合は、本番環境で使えるように設定しておきます。http://qiita.com/wtb114/items/176c19bd9caff0893d7c


#1.Herokuにアカウント登録
下記URLからアカウントを登録します。
https://signup.heroku.com/identity

登録後、クレジットカードの登録を済ませます。無料で使う場合も必要です。
https://signup.heroku.com/identity

また、herokuのToolbeltをインストールして、herokuコマンドをターミナル上で入力できるようにしておきます。
https://devcenter.heroku.com/articles/getting-started-with-ruby#set-up

#2.herokuにログイン
```
$ heroku login
#ユーザー名とパスワードを入力
```

#3.Gemfileに以下を記述(データベースの設定)
・postgresを指定する場合

```
Gemfile


　　　　・・・

  gem 'mysql2', '0.3.18', group: :development　#開発環境でMySQLを使用していた場合。

  ・・・

group :production do
  gem 'rails_12factor'
  gem 'pg'
end

```


・MySQLを指定する場合

```
Gemfile

　　　　・・・
　　　　gem 'mysql2', '0.3.18'
　　　　
　　　　・・・
　　　
group :production, :staging do
  gem 'rails_12factor'
end

```

Gemfile.lockを削除後
```
$ bundle install
```

4.作成したコードをバージョン管理システムに追加

```
$ git init
Reinitialized existing Git repository in /Users/ユーザー名/projects/アプリ名/.git/

$ rake assets:precompile

$ git add .

$ git commit -m "init commit"
```

#5.アプリをデプロイ

```
$ heroku create
Creating app... done, ⬢ アプリ名
https://アプリ名.herokuapp.com/ | https://git.heroku.com/アプリ名.git
```

#6.データベースを設定(MySQLを指定する場合のみ)
・postgresを指定する場合は必要ありません。

・MySQLを指定する場合

```
$ heroku addons:add cleardb
Creating cleardb on ⬢ アプリ名... free
Created cleardb-アプリ名 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation
```


```
$ heroku config | grep CLEARDB_DATABASE_URL
=> CLEARDB_DATABASE_URL: mysql://b1efe712be_______________________38710?reconnect=true 
#URL:後をコピーしておきます。
```

mysqlの部分をmysql2に変更

```
$ heroku config:set DATABASE_URL=mysql2://b1efe712be_______________________38710?reconnect=true　
#URL=後に先ほどコピーしたURLを貼り付け。「mysql」の箇所を「mysql2」に変更します。

```

#7.アプリをプッシュ
```
$ git push heroku master
```
※別のブランチで作業している場合は

```
$ git push heroku ブランチ名:master
```

最後に heroku run rake db:migrate

```
$ heroku run rake db:migrate

```
```
$ heroku open 
```
自分のアプリが表示されていれば無事アップロードが完了です。




【補足】

データベースの情報を確認する場合は下記コマンドを入力します。

※postgresの場合

```
$ heroku config | grep DATABASE_URL
```

返ってきた情報の、postgres://〜が自分のデータベース情報です。

PG Commanderに接続してください。

PG Commanderのインストール
https://eggerapps.at/pgcommander/


返ってきた情報の、postgres://〜の部分を末尾まで選択してコピー後、「New Favorite」をクリックしてください。すると自動的に値がセットされます。


※MySQLの場合

```
$ heroku config --app アプリケーション名
```

返ってきた情報の、mysql2://〜が自分のデータベース情報です。

mysql2://ユーザー名:パスワード@ホスト名/データベース?reconnect=true

となっているので、この情報をSequelProに入力して、Herokuアプリのデータベースに接続してください。
Magnific Popup で開いたmodalとのデータのやりとり

Magnific Popup というのがあって、

[Magnific Popup](http://dimsemenov.com/plugins/magnific-popup/)

ちょっとしたmodal処理用に結構使われてるみたいなんだけども、まあ、その使い方です。

まず、親になる画面の上のなにかをクリックするとモーダルが開けばいいので、

```html
<div id="myDiv"><a class="popup" href="modal.php">なにか</a></div>
```

に対して、

```js
$('.popup').magnificPopup({});
```

とする。実際には、

```js
    $('.popup').magnificPopup({
        type: 'iframe',
        disableOn: 200,
        mainClass: 'mfp-fade',
        removalDelay: 200,
        preloader: false,
        fixedContentPos: false,
        callbacks: {
            open: function(){
            },
            close: function(){
            }
        }
    });
```

こんな感じでオプションとコールバックを設定する。

で、上記のように、`type` を `iframe` にすると、

```html
<a class="popup" href="modal.php">
```

で指定したhrefのリンク先を、modalとしてiframeを生成したその中に表示するような仕組みになっているので、そのmodal（つまりiframeの中身）をjqueryで操作するには、例えば

```js
$('.mfp-iframe').contents().find(':hidden');
```

というようにやらないといけない。
ここで `mfp-iframe` というのは勝手に作られるiframeのクラス名だ。
なので callbacks のopenとかcloseの中で `$('.mfp-iframe').contents()` を使って、
modal上のformのvalueを取得して、
元々のウインドウのformのvalueにコピーするとか、あとはいろいろ、好きにやればいい。

ちなみに、modalの中に表示される画面、つまりmodal.phpだが、ここになんか動的に引数を渡したいってケースもあると思う。そういう時どうしたらいいのか？

callbacksの中に

```js
            elementParse: function(item) {
            },
```

というのを作る。こうするとこのitemの中に、開くmodalについての情報が入って、

```js
item.src
```

でこの呼び出されるmodal.phpのURLが格納されているのだ。
なのでこいつに引数をくっつけてやればいよい

```js
        callbacks: {
            elementParse: function(item) {
                item.src = item.src + '/val=123';
            }
        }
```

みたいに。
CentOS7にPostgreSQLを構築する方法


## インストール

### PostgreSQLサーバインストール

* インストール実行

	```bash:terminal
	yum -y install postgresql-server
	```
	
## 初期設定

### データベース初期化

* 初期化コマンドを実行。/var/lib/pgsql/dataに設定ファイルなどが配置される。

	```bash:terminal
	postgresql-setup initdb
	```
	
### postgresql.confの編集

* orgファイルバックアップ & 編集
	
	```bash:terminal
	cd /var/lib/pgsql/data
	cp postgresql.conf postgresql.conf.org
	echo "listen_addresses = '*'" >> /var/lib/pgsql/data/postgresql.conf
	```

* 差分確認
	
	```bash:terminal
	diff -u postgresql.conf.org postgresql.conf
	
	--- postgresql.conf.org	2017-01-16 16:57:24.904920137 +0900
	+++ postgresql.conf	2017-01-16 17:00:13.670101306 +0900
	@@ -575,3 +575,4 @@
	 #------------------------------------------------------------------------------
	
	 # Add settings for extensions here
	+listen_addresses = '*'
	```
		
### pg_hba.confの編集

* orgファイルバックアップ & 編集
	
	```bash:terminal
	cd /var/lib/pgsql/data
	cp pg_hba.conf pg_hba.conf.org
	
	echo "# PostgreSQL Client Authentication Configuration File" >  ./pg_hba.conf
	echo "# ===================================================" >> ./pg_hba.conf
	echo "local all all              trust"                      >> ./pg_hba.conf
	echo "host  all all 127.0.0.1/32 trust"                      >> ./pg_hba.conf
	echo "host  all all ::1/128      trust"                      >> ./pg_hba.conf
	```

* 確認 (orgはコメントだらけでdiff取ると長くなるので、変更後の内容のみ)
	
	```bash:terminal
	cat pg_hba.conf
	
	# PostgreSQL Client Authentication Configuration File
	# ===================================================
	local all all              trust
	host  all all 127.0.0.1/32 trust
	host  all all ::1/128      trust
	```
	
## 起動

### PostgreSQLを起動

* 起動コマンド実行

	```bash:terminal
	service postgresql restart
	```
	
## 接続確認

### PostgreSQLへ接続できることを確認する

* local接続の可否を確認	

	```bash:terminal
	psql -U postgres -h 127.0.0.1 -w
	
	psql (9.2.18)
	"help" でヘルプを表示します.
	
	postgres=#
	```
	
	
### postgresユーザーのパスワードを変更

* SQLを実行

	```bash:terminal
	psql -U postgres -c "ALTER ROLE postgres WITH PASSWORD 'your-secure-password'"
	
	ALTER ROLE
	```
	
### データベース作成

* SQLを実行	

	```bash:terminal
	psql -U postgres -W -c "CREATE DATABASE your_database_name";
	ユーザ postgres のパスワード:
	
	CREATE DATABASE
	```
AppSignalでElixirアプリの監視やパフォーマンス分析を行う


Elixirアプリのエラーとパフォーマンスの監視に[AppSignal](https://appsignal.com/)を試してみました。まだβ版とのことなので利用の際は注意がです。Elixirのアプリだけでなく、Rubyのアプリでも利用が可能です。

## どんなことができるの？

Web GUI上でElixirアプリのエラーとパフォーマンスの監視ができます。似たようなサービスでは[New Relic](https://newrelic.com/)とかが有名ですよね。ElixirではNew RelicよりApp Signalの方が導入が簡単そうだったのでこちらを試すことにしました。

AppSiganlでは、もう少し具体的には以下のようなことができます。

### エラー監視

* エラー一覧（Issue List）があり、１つ１つのIssueをOpenしたりCloseしたりできる。
  * githubと連携すると自動的にgithubの方にissueを投げてくれる。
* エラーは頻度の多い順に見ることができ、それぞれのエラーについてバックトレースやRequest Pathなど、解決のために必要な情報がしっかりと含まれている。

### パフォーマンス分析

* コントローラー(アクション)ごとに、どのぐらい実行に時間がかかっているか、何度呼び出されているかを一覧で見ることができ、どのアクションが最もパフォーマンスにインパクトを与えているかを確認できる。
* パフォーマンスの問題についてもエラー監視と同様にOpen / Closeが可能。
* DBのスロークエリ一覧と詳細の確認

そのほかにもカスタムメトリクスの作成、デプロイ履歴の確認、ホストごとの分析などの機能があります。

また、前述のgithubとの連携に加え、Slackなどの外部サービスとの連携は非常に便利ですね。AppSignalのWeb GUIはReactで書かれており動作が軽快なのも地味に良いです。

## 料金

Rubyで使う場合は30日超えると料金が発生するようですが、おそらくElixirの方は（β版のうちは）30日超えて使用しても無料です。

## インストール

では早速導入していきます。今回、試すにあたってPhoenixアプリを使っていますが、Phoenix以外の場合の導入方法についても触れていきます。[Getting Started](https://hexdocs.pm/appsignal/gettingstarted.html)に書いてある通り、以下のようにインストールできます。

mix.exsに依存を追加します。

```mix.exs
def application do
  [applications: [:appsignal]]
end

def deps do
  [{:appsignal, "~> 0.9"}]
end
```

Phoenixアプリの場合、``lib/my_app/endpoint.ex``に``Appsignal.Phoenix``モジュールを使うように以下のように追記します。

```lib/my_app/endpoint.ex
use Appsignal.Phoenix
```

また、``config/config.exs``に以下を追記します。

```config/config.exs
config :my_app, MyApp.Endpoint,
  instrumenters: [Appsignal.Phoenix.Instrumenter]
```

テンプレートの描画にどのぐらい時間がかかっているかを計測するためには、同様に次のconfigを追加します。

```config/config.exs
config :phoenix, :template_engines,
  eex: Appsignal.Phoenix.Template.EExEngine,
  exs: Appsignal.Phoenix.Template.ExsEngine
```

DBのクエリのログも同様にして、次のようにconfigを追加します。

```config/config.exs
config :my_app, MyApp.Repo,
  loggers: [Appsignal.Ecto]
```

## 設定

[AppSignalに登録](https://appsignal.com/users/sign_up)して、Add ApplicationからAPIキーを入手し``config.exs``に追記します。

```config/config.exs
config :appsignal, :config,
  name: :my_first_app,
  push_api_key: "your-hex-appsignal-key"
```

プロダクション環境では次のように設定します。

```config/prod.secret.exs
config :appsignal, :config,
  name: :my_first_app,
  push_api_key: "your-hex-appsignal-key",
  env: :prod,
  revision: Mix.Project.config[:version]
```

テスト環境では次のように無効にしておくと良いです。

```config/test.exs
config :appsignal, :config,
  active: false
```

ログに残してはいけない情報は、次のようにPhoenixの設定をします。デフォルトでは``["password"]``となっています。

```config/config.exs
config :phoenix, :filter_parameters, ["password", "secret"]
```

Phoenixを使っていない場合は、AppSignalの設定で同様のことができます。

```config/config.exs
config :appsignal, :filter_parameters, ["password", "secret"]
```

以上で導入は終わりです。

## おわり

あまり深堀りした内容ではないですが、一旦導入までで。また何かあれば追記します。
動画配信料金比較

自分用のメモ。

価格を公開しているところのみです。オーバーチャージは非公開なところが多いので、公開分のGB単価のみ気にしています。トラフィック制限のないサービスはベストエフォートで心配なので除外しています。


|サービス名|月額|ビットレート上限|ストレージ上限|配信時間上限|トラフィック上限|GB単価|備考|
|---|---|---|---|---|---|---|---|
|[J-Stream Equipmedia Startup](https://www.stream.co.jp/service/platform/equipmedia/)|50,000円|なし|500GB|なし|300GB|167円/GB|LIVE配信（同時接続50・同時開催1）、API（Readのみ）|
|[J-Stream Equipmedia Business](https://www.stream.co.jp/service/platform/equipmedia/)|100,000円|なし|2000GB|なし|1,000GB|100円/GB|LIVE配信（同時接続100・同時開催1）、API（Read/Write）、IP制限、ID/PW、ワンタイムURL|
|[J-Stream Equipmedia Expert](https://www.stream.co.jp/service/platform/equipmedia/)|160,000円|なし|3,000GB|なし|1,500GB|100円/GB|LIVE配信（同時接続2000・同時開催2）、API（Read/Write）、IP制限、ID/PW、ワンタイムURL|
|[Wowza Streaming Cloud Basic](https://www.wowza.com/pricing/streaming-cloud-plans)|99USD|なし|250GB|配信：月20時　視聴：のべ月1000時間|1000GB|0.09USD/GB|配信時間追加：9USD/hour|
|[Wowza Streaming Cloud Plus](https://www.wowza.com/pricing/streaming-cloud-plans)|499USD|なし|250GB|配信：月150時　視聴：のべ月7000時間|7000GB|0.07USD/GB|配信時間追加：5USD/hour|
|[よんでんメディアワークス Media-Gather データ転送量型プラン](https://www.media-gather.jp/service/index.html)|36,000円|なし|1GB|なし|100GB|360円/GB||
|[フォー・フュージョン メガ動画 ブロンズ](http://megadoga.jp/price/)|30,000円|なし|15GB|なし|1TB|30円/GB|トラフィック追加35円/GB<br>同接制限100本|
|[フォー・フュージョン メガ動画 シルバー](http://megadoga.jp/price/)|50,000円|なし|50GB|なし|1TB|49円/GB|トラフィック追加35円/GB<br>同接制限100本|
|[フォー・フュージョン メガ動画 ゴールド](http://megadoga.jp/price/)|100,000円|なし|100GB|なし|1TB|98円/GB|トラフィック追加35円/GB<br>同接制限100本|
tensorflow0.12でcifar10を動かす時のエラー

https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10
ここのcifar10のコード動かす時にtensorflow0.12ではエラーをはいたので対処した。

`TypeError: strided_slice() missing 1 required positional argument: 'strides'`
cifar10_input.pyのstrided_slice()の引数が足りないので付け足してあげる。

```cifar10_input.py
tf.strided_slice(record_bytes, [0], [label_bytes]), tf.int32)
```
を

```cifar10_input.py
tf.strided_slice(record_bytes, [0], [label_bytes], [1]), tf.int32)
```
に変更

```cifar10_input.py
tf.strided_slice(record_bytes, [label_bytes],
                       [label_bytes + image_bytes]),
                       [result.depth, result.height, result.width])
```

を

```cifar10_input.py
tf.strided_slice(record_bytes, [0], [label_bytes], [1]), tf.int32)
```

に変更

contrib.deprecatedなんとかが軒並みエラーを吐いているので
全てcontrib.deprecatedを消してあげる
例えば
tf.contrib.deprecated.histogram_summary~
を
tf.histogram_summaryなど
【無料で使える】Pythonを勉強できる学習サイト7つ

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【無料で使える】Pythonを勉強できる学習サイト7つ](http://programming-study.com/language/python-site/)

#【無料で使える】Pythonを勉強できる学習サイト7つ

Pythonは文法が平易で、読みやすいことから、[プログラミング初心者にも推奨される言語](http://programming-study.com/technology/python-recommend/)になっています。Pythonは特定の目的に特化して、人気が高い傾向があります。前述のように、数式処理などの分野では根強い人気があります。また、最近は大量のデータの中から知見を見いだすビッグデータ関連のプロジェクトが流行していますが、Rというデータ解析に特化したプログラミング言語と並んで、実行速度の速いPythonの人気が高まっているといわれています。特定の分野に興味があり、その専門家を目指すのであれば、Pythonを学ぶという選択がとても魅力的なものになるでしょう。


##ACT（アクト）

ACTはプログラミングをはじめとした学習コンテンツの提供メディアです。Pyhonのレッスンも複数あり、初心者向けにPythonの基礎構文に特化したものから、djangoとPythonを用いてランディングページを作成する実践に近いものまであります。デザイナー兼エンジニアの講師のレッスンなので、デザインも併せて学べる点が魅力です。

[ACT（アクト）の詳細を見る](http://programming-study.com/website/act/)


##ドットインストール

ドットインストールには大人気のPython講座があり、受講回数はなんと50万回超、現在受講している方も4000人以上います。Pyhonはシンプルで学習しやすいことから多くのプログラミング初心者に選ばれているようです。無料で学べる入門編の内容として、変数や数値、文字列、sortやjoinなどの命令、辞書、変数、オブジェクト、モジュールなどがあり、テーマごとに短い動画に分かれています。

[ドットインストールの詳細を見る](http://programming-study.com/website/dotinstall/)


##paiza（パイザ）


paizaでは5万人が受けたプログラミングのデータを元にカリキュラムが組まれています。環境構築もいらず、オンラインエディタですぐにPytohnの勉強を始めることができます。3分の動画を15本分見て「平成年度の計算」や「おみくじ」など、簡単なWebアプリケーションを作れるようになります。また、[コードガールこれくしょん](https://paiza.jp/cgc)を使えば、プログラミングの問題を解きながらゲーム感覚でPythonの勉強ができます。

[paiza（パイザ）の詳細を見る](http://programming-study.com/website/paiza-2/)


##Progra!（プログラ）


Progra!は一つ一つ課題を提出していくことでプログラミング能力を鍛えるサイトです。Pythonの重要項目55個だけ取り出した「これだけ！Pyhonコース」とより広い129項目をカバーしている「全部入りPythonコース」の2種類があります。「画面に文字を表示する」「変数を使う」「配列を使う」といったようにやることベースで一項目ずつ積み上げていく学習スタイルなので、プログラミングに苦手意識のある方でも挫折することなく続けられます。

[Progra!（プログラ）の詳細を見る](http://programming-study.com/website/progra/)

##Udacity（ユダシティー）

UdacityはGoogleなどからも協力を得ているアメリカのオンライン学習サイトです。基本的には英語のサービスですが、リクルートとも提携することによって一部日本語対応しています。Pythonの講座も日本語字幕付きであるので、英語が苦手な方でも学習できます。関数やクラスに関して学び、課題にチャレンジする2週間程度で修了可能な初心者向けのプログラムです。講師はスタンフォード大学の修士号取得、過去にGoogleで勤務という輝かしい経歴を持つエンジニアです。

[Udacity（ユダシティー）の詳細を見る](http://programming-study.com/website/udacity/)


##Python-izm（パイソンイズム）


Python-izmは、Pythonに特化した学習サイトです。Pythonがそもそもどんな言語か、どこからインストールするか、基本的な構文などを知れる入門編、if文、for文、print文などのメソッド、インポート、開発環境などを学べる基礎編、関数の取り扱い、パッケージ化、拡張子の取得などを学べる応用編があり、初心者から上級者まで幅広いプログラミング学習者に愛用されています。

[Python-izm（パイソンイズム）の詳細を見る](http://www.python-izm.com/)


##CheckiO

CheckiOは、ゲーム感覚でPythonを学べるWebサービスです。プログラミングの問題をクリアすることで、レベルを上げて次のステージに進めます。解いた問題については他のユーザーの別解が見れる上に、コメントやいいねをもらえたりとユーザー間の交流も盛んです。Pythonの基本を身につけて、さらにスキルアップしたい方にオススメです。
[CheckiOの詳細を見る](https://checkio.org/)


##Python（パイソン）の勉強を成功させるために

Pythonは初心者向けのプログラミング言語で、多くの人がプログラミング学習の入り口としています。以前は学習コンテンツは外国のものばかりだったため本で学ぶ人が多かったですが、最近では上記のように日本語のWebサービスやWebサイトが多く出てきて学びやすい環境が整ってきました。Pythonに興味が湧いた方は是非利用してみてください。
KickStarter iOSアプリのStoryboardのenumでの管理のしかたに感動した

## ふつうの

```swift
let storyboard = UIStoryboard(name: "HogeViewController", bundle: nil)
let viewController = storyboard.instantiateInitialViewController() as! HogeViewController
```

## KickStarter-iOSのやりかた

```swift
let viewController = Storyboard.Hoge.instantiate(HogeViewController.self)
```

* 見やすい
* 文字列で引っ張る必要がないからtypoしない（補完も出る、コンパイルエラーになる）

## 実装

[ios-oss/Storyboard.swift at master・kickstarter/ios-oss](https://github.com/kickstarter/ios-oss/blob/master/Kickstarter-iOS/Library/Storyboard.swift)

```swift
public enum Storyboard: String {
  case Hoge
  case Fuga
  case ...

  public func instantiate<VC: UIViewController>(_ viewController: VC.Type,
                          inBundle bundle: Bundle = .framework) -> VC {
    // インスタンス化したViewControllerを返してる。
  }
}
```

enumにメソッド追加できるの凄い・・・
cocos2d-jsでcustom eventを受ける方法

検索しても付属のサンプルを見てもなかなか見つからなかったのでメモ。


以下の例ではcocos2dx(c++)から描画直前に呼ばれるEVENT_AFTER_UPDATE(文字列”director_after_update”)というイベントを受けるとcocos2d-jsにてthis.fugafuga()を呼び出すプログラム。

```js:hoge.js
var listener = cc.EventListener.create({     	
    event: cc.EventListener.CUSTOM
   , eventName: cc.Director.EVENT_AFTER_UPDATE
   ,callback: this.fugafuga 	
}); 	
cc.eventManager.addListener(listener,this);
```

(環境はcocos2d-x ver 3.6上のcocos2djs)
fishでGit のマージ済みのブランチを一括削除する


Git でマージ済みのブランチを一括削除する
http://qiita.com/kyanny/items/10a57a4f1d2806e3a3b8

の呪文がfishだと上手く動かなかった。

`git branch --merged | grep -vE '^\*|master$|develop$' | xargs -I '{}' git branch -d '{}'`

で動いた。%じゃなくて"{}"を使わないとダメっぽい。
Vagrant上のCentOSのファイルをローカルのテキストエディタで編集する

Vagrant上のCentOSへは、デフォルトではvagrantユーザの秘密鍵をつかった認証でログインする。
自分はNotepad++を使ってリモートのファイル編集をしたかったのだが、vagrantユーザだと一部のファイルを編集できなかったので、rootでログインする方法から調べた。

# 環境
ホストマシン: Windows10
仮想化ソフト: Oracle VirtualBox 5.1.12
Vagrant: Vagrant1.9.1

CentOS box: https://atlas.hashicorp.com/centos6/
(vagrant box add centos/6でダウンロードしたもの,CentOS6.8でした)
テキストエディタ: Notepad++ 6.7.4

# CentOSでのルートログイン許可
ネットで調べると、以下をvagrantfileに記載すればよいとあったので実行。
  # For SSH login as root
  config.ssh.username = 'root'
  config.ssh.password = 'vagrant'
  config.ssh.insert_key = 'true'

これで起動すると、

```shell-session
2017/01/15 21:15:48|C:\Vagrant\CentOS6-1>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/6' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 5000 (guest) => 5000 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: root
    default: SSH auth method: password
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
```

となり、失敗し続ける。いろいろ調べた結果、box上で、/etc/ssh/sshd_configの以下を修正
PermitRootLogin yes
PasswordAuthentication yes

修正後、一応sshdを再起動
`service sshd restart`
これでrootで直接sshログイン可能になった。

# Notepad++の設定
Notepad++インストール時に、NppFTPプラグインを入れるかどうか聞かれるので、インストールしておく。
すると、メニューのプラグインから、NppFTP用のウィンドウを表示できるようになるので、そこから設定を行う。
![20170115_008.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/0520cdb9-5710-cd7c-da18-0a662a5c1ca6.jpeg)
![20170115_009.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/5c569a82-3653-1932-7fd8-b2ec8ac72b48.jpeg)
![20170115_010.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/a65dee53-bade-6181-82c5-3b302f88a7b3.jpeg)
![20170115_011.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/8476d195-c4d1-6a16-d73d-4df11e14199e.jpeg)
![20170115_012.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/74bceea7-e667-6e73-1eaa-78a9a4e032cd.jpeg)
![20170115_013.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/cfc6f1ea-d09e-0880-cec6-0d602eca0e6e.jpeg)

以上。これまではローカルで編集→Boxにコピーとしていたのでかなりラク。
本番環境にあるWordPressをローカル環境にコピーする

今回は本番環境にあるWordPressをローカル環境に移行（コピー）する方法を紹介します。
まず初めにやる手順として
*1.MySQLのエクスポートとインポート*
*2.wp-config.phpの設定*
*3.ドメイン名変更の3つです。*

##1.MySQLのエクスポートとインポート
こちらについては [MySQLデータのエクスポートとインポートについて](http://qiita.com/AlohaOkinawa/items/a1d222c39da3c245fb57)を参照してみてください。

##2.wp-config.phpの設定
まずは本番環境に上がっているWordPressのデータをコピーしてそのデータのwp-config.phpファイルをローカル環境に合わせて、編集して行きます。

```php:wp-config.php
define('DB_NAME', '○○○○');

/ MySQL データベースのユーザー名 /
define('DB_USER', '○○○○');

/ MySQL データベースのパスワード /
define('DB_PASSWORD', '○○○○');

/ MySQL のホスト名 /
define('DB_HOST', '○○○○');

/ データベースのテーブルを作成する際のデータベースの文字セット /
define('DB_CHARSET', 'utf8');

/ データベースの照合順序 (ほとんどの場合変更する必要はありません) /
define('DB_COLLATE', '');
```

##3.ドメイン名変更
[DATABASE SEARCH AND REPLACE SCRIPT IN PHP](http://interconnectit.com/products/search-and-replace-for-wordpress-databases/)をダウンロードします。(今回は2.1.0をダウンロードしてます。）
<img width="1255" alt="スクリーンショット 2017-01-16 14.03.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/9ecd74be-3eb4-31ac-b103-ba4dc8acec58.png">

ダウンロードしたらzipファイルを解凍してください。解凍したらファイルをwordpressディレクトリの直下に設置します。
設置したらlocalhost/○○○○/searchreplacedb2.phpにアクセスしてみてください。

<img width="807" alt="スクリーンショット 2017-01-16 14.18.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/c6b8f783-52b3-f9e2-9816-0bdae1e5b917.png">

アクセスするとこのようなページが表示されるので。Submitをクリックしてください。

<img width="798" alt="スクリーンショット 2017-01-16 14.20.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/a2b359b1-23d2-acf1-2686-878d34469d09.png">

wp-config.phpの情報が表示されているはずなので、確認してください。問題がなければSubmit DB detailsをクリックしてください。

<img width="801" alt="スクリーンショット 2017-01-16 14.21.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/15a7c3fb-7191-6bb7-174a-1a3a652b42dc.png">

上記のページに飛ぶと思いますのでContinueをクリックしてください。

<img width="797" alt="スクリーンショット 2017-01-16 14.28.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/bc2acee0-0dd4-98ac-0e9b-1b332172b9e2.png">


最後にドメイン名の書き換えをしていきます。Search forには変更前ドメインを
Replace withには変更後ドメインを記述します。
記述が終わったらSubmit Search stringをクリックしてください。
completeと出れば書き換え完了です。
ブラウザで、アクセスしてみて正常に表示されれば成功です。

以上簡単にまとめました。間違いなどあればご指摘宜しくお願い致します。
Excel VBA で SHA256

# Excel VBA で SHA256
エクセルのマクロでSHA256値を算出します
必要に迫られて検索したら、程よいものがありました
ホント、感謝です

参考サイト：  [ http://www.se-japan.com/memo/vbscript/](http://www.se-japan.com/memo/vbscript/)



```vb

Function SHA256(s As String) As String
    Dim objSHA256
    Dim objUTF8
    
    Dim bytes() As Byte
    Dim hash() As Byte
    
    Dim i
    Dim wk
    
    '// INIT
    Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    Set objUTF8 = CreateObject("System.Text.UTF8Encoding")
    
    '// 文字列を UTF8 にエンコードし、バイト配列に変換
    bytes = objUTF8.GetBytes_4(s)
    
    '// ハッシュ値を計算（バイナリ）
    hash = objSHA256.ComputeHash_2((bytes))
    
    '// バイナリを16進数文字列に変換
    For i = 1 To UBound(hash) + 1
        wk = wk & Right("0" & Hex(AscB(MidB(hash, i, 1))), 2)
    Next i
    
    '// 結果を返す
    SHA256 = LCase(wk)

End Function
```
「IP制限」について調査した。

- 元々IP制限をかけているサービスがあったとする。
- そのサービスに対する接続元IPが変わる場合に、新しいIPからアクセス出来るようにしなければならない。
- けど、どこでIP制限かけてるのか分からない...

って事で、IP制限をかけているであろう箇所を調査。
ちなみに環境はこんな感じ。

- CentOS release 6.7
- Apache/2.2.15

#調査内容
外側から順に調査していく。
FW → TCP Wrapper → Web Server → App Server

##1. FW
`iptables`などで、特定IPに対して制限(許可/拒否)をしていないか確認。

```sh
iptables -L
```

##2. TCP Wrapper
> [Wikipedia](https://ja.wikipedia.org/wiki/TCP_Wrapper)
> TCP Wrapper は、LinuxやBSD系の（Unix系）オペレーティングシステム上のTCP/IPサーバへのネットワークアクセスをフィルタリングするホストベースのACLシステムである。ホストまたはサブネットのIPアドレス、ホスト名、Identプロトコルのクエリ応答などをアクセス制御のためのフィルタのトークンとして使う。

> [Redhat - 公式](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-TCP_Wrappers_and_xinetd-TCP_Wrappers_Configuration_Files.html)
> クライアントがサービスへの接続を許可されるかを決定するために、TCP Wrapper は、一般的にホストアクセス (hosts access) ファイルと呼ばれる、以下の 2 つのファイルを参照します。

簡単に言えば、

- ホワイトリスト ( hosts.allow ) に引っかかれば許可
- ブラックリスト ( hosts.deny ) に引っかかれば拒否

という事で、以下の二つのファイルを確認。

```sh
cat /etc/hosts.allow
cat /etc/hosts.deny
```


##3. Web Server(Apache)
> [ApacheによるWebサーバ構築：IP認証によるアクセス制限のテクニック](http://www.atmarkit.co.jp/ait/articles/0109/29/news002_2.html)
> Apacheにおけるアクセス制限には、Apacheの設定ファイル（httpd.conf）を使う方法と、制限を設けたいディレクトリに「.htaccess」という名称のファイルを作成する方法の2種類がある。

- httpd.conf
    - Apacheの設定ファイル「httpd.conf」を使う方法
- .htaccess
    - 制限を設けたいディレクトリに「.htaccess」という名称のファイルを作成する方法

どちらも上記の**2.TCP Wrapper**と同じような感じ。(allow/denyで制限している)


##4. App Server
上記のどれにも引っかからない場合は、アプリ側で制限しているかも。
DBや設定ファイル、ソースコードを見て確認。
考えられるのは以下かなと。

- **DBに保持しているIPアドレス** を **接続元IP** と照会して、接続許可/接続拒否
- **設定ファイルに保持しているIPアドレス** を **接続元IP** と照会して、接続許可/接続拒否
- **ソースコードに直書きされているIPアドレス** を **接続元IP** と照会して、接続許可/接続拒否


以上。
Androidにmockitoをインストール

```xml:build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {
        applicationId "jp.co.test.myapplication"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    //3行追加
    androidTestCompile 'org.mockito:mockito-core:1.10.19'
    androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'

    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
}


```

<img width="455" alt="app_-_MyApplication_-____Desktop_MyApplication_.png" src="https://qiita-image-store.s3.amazonaws.com/0/99731/24a955f4-4da3-39bd-df7f-e0a160705c1f.png">


```java:ExampleInstrumentedTest.java

package jp.co.test.myapplication;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;

import java.util.ArrayList;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
  
    @Test
    public void testMockArray() throws Exception {
        ArrayList mockList = mock(ArrayList.class);
        // get(0)で神奈川県を返すようにモック化する
        when(mockList.get(0)).thenReturn("神奈川県");
        assertEquals("神奈川県", mockList.get(0));
    }

    @Test
    public void testPref() throws Exception {
        SharedPreferences sp = Mockito.mock(SharedPreferences.class);
        Mockito.doReturn("ポテト").when(sp).getString("food", "");
        assertEquals("ポテト", sp.getString("food", ""));
    }
}


```
CentOS6/7にPython3入れる

[こちらを参照（Python3をCentOS7にyumでインストール）](http://weblabo.oscasierra.net/python3-centos7-yum-install/)

#概要
スクリプトプログラムをPythonで書くつもり、標準でインストールされるPythonは2.6で古いので3.X系をyumインストールする。
メンテナンス性を考えると[POSIX原理主義](https://ja.wikipedia.org/wiki/POSIX%E4%B8%AD%E5%BF%83%E4%B8%BB%E7%BE%A9)が良いのだろうけど、スクリプトを書き上げるまでの時間を考えて日和る（どうせメンテナンスするのは自分ひとりだし、ドキュメントはしっかり残すこととする）

##環境
CentOS6.8 final

###手順
殆ど最上部のリンクの通り

IUS Community Project リポジトリ追加
`# yum install -y https://centos6.iuscommunity.org/ius-release.rpm`

Python3.x系のインストール
`# yum install -y python36*`
（これだとdebug-info等もインストールされてしまうので、上記リンクの様に必要なパッケージだけ選んでも良い）

python3とタイプして動かせるようにエイリアスを設定
(リンク先とは違い、/usr/bin/以下にインストールされてた）

```
# ln -s /usr/bin/python3.6 /usr/bin/python3
# ln -s /usr/bin/pip3.6 /usr/bin/pip3
```

##追記
CentOS６.x(7系も含む）ではパッケージ管理のYumコマンドがデフォルトインストールのPython2.xで動いているのでデフォルトインストールされているpythonのパスを変えてしまうようなエイリアス設定はしない方が良い

参考文献
https://qiita.com/yunano/items/eedd3da40d67394881a2

######雑記
日和るって若者言葉だったのか。まだまだ若いなおれ。
Windows10 累積アップデート KB3201845 不具合(その２) MySQL Connector net 破損

「[Windows10 累積アップデート KB3201845 不具合 インターネットに接続できない](http://qiita.com/Urushibara01/items/e705a05edadd390de40c)」に引き続き、不具合が発生していたため情報共有します。

#自動アップデートが MySQL Connector/Netのアセンブリを破損させる
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/7f4c8c21-a75b-029b-7109-f43c8dace7fc.png)

年末、同時にセットアップしたWindows10の3台中2台が同じ症状。原因不明のまま年を越し、やっと手元に送り返されてきた。

**[コントロールパネル]**->**[プログラムと機能]**からの修復は不能。
一旦アンインストール後、再インストールで修正完了。

#おしまい
大事な年末年始の業務がこの子達のせいで大変なことに・・・。
Microsoftさん、どうして年末にアップデートしちゃうの？ほんと勘弁してください
package.jsonでライセンスを2つ以上指定する方法

package.jsonでマルチライセンスを指定する方法のメモである。

## 2つ以上指定する方法

```package.json
{
  "name": "mit-and-cc-by",
  "version": "1.0.0",
  "license": "(MIT AND CC-BY-4.0)"
}
```

`()`で囲って、`LICENSE1 AND LICENSE2`みたいに指定する。
`AND`の他に`OR`も使うことができる。

参考: https://docs.npmjs.com/files/package.json#license

## ライセンスのフォーマット

ライセンスの表記方法は、[SPDX License List](https://spdx.org/licenses/) を参考にすると良い。
Piet::CarrierWaveExtensionによる画像最適化がSolarisで動かなかった件


Piet::CarrierWaveExtensionを使い、jpeg画像の最適化を試みた所、開発に使っていたMacbook proでは問題無かったのですが、
solarisでは最適化されない現象が発生していました。

原因を調べていた所、
https://github.com/albertbellonch/piet/blob/master/lib/piet.rb

piet.rbの25行目

```lib/piet.rb
    def mimetype(path)
      IO.popen(['file', '--brief', '--mime-type', path], in: :close, err: :close){|io| io.read.chomp.sub(/image\//, '')}
    end
```

こちらで、fileコマンドで識別している所が原因でした。
solarisのfileコマンドだと--briefも--mime-typeも存在しません。


その為、solarisでも使えるmimeの識別方が必要だったので、ちょうど該当プロジェクトではshared-mime-infoを使っていました。
ですので以下の様なモジュールを作り、Uploader側で、このmoduleをincludeする事で対応しました。

```piet_uploader.rb
require "shared-mime-info"
module PietUploader
  include Piet::CarrierWaveExtension
  def Piet.mimetype(path)
    MIME.check(path).sub_type
  end 
end
```
AndroidStudioでタブをスペースに変換せずに挿入する方法

#タブ入力の設定方法
AndroidStudio>Preferences>Editor>Code Style
からタブ入力を設定したいファイル形式を選択して
Use tab characterをチェック
<img width="1036" alt="スクリーンショット 2017-01-16 13.13.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/146385/cb93f1da-cd74-d557-c315-e63d19a668e7.png">
SVNでバージョン管理から外したいディレクトリがあった場合

#SVNでバージョン管理から外したいディレクトリがあった場合
logフォルダなど、フォルダ自体は作りたいが中身に関しては一切同期化したくない場合の方法を記載する。
また、全員に適用したい為、エクリプスなどの無視するリソースで無視する方法やignoreファイルを作成する方法ではなく、SVNのコマンドで管理する。

##手順
1.まずフォルダだけをエクリプスなどで作成しコミット
2.チェックアウト
同じプロジェクトでもいいがとりあえず私はSVNのサーバー機で作業した。

```lang:
svn co file:///var/opt/svn/repos/プロジェクト名 プロジェクト名 --no-auth-cache
```

3.無視したいフォルダに移る

```lang:
cd /無視したいフォルダ
```

4.ignore設定する

```lang:
svn propedit svn:ignore . --editor-cmd=vi
```

内容は全拒否の

```lang:
*
```
とする。

今どんな設定が入っているかはプロジェクトのトップで

```lang:
svn pg -R svn:ignore ./
```
と実行すると一覧で確認できる。

最後にコミットして完了。

```lang:
svn commit -m "svn ignore" --username ユーザ名 --password パスワード --no-auth-cache
```

以上。
map exercise (word count)

- go tour
- mapの使い方練習メモ

```go
package main

import (
	"golang.org/x/tour/wc"
	"strings"
)

func WordCount(s string) map[string]int {
    m := make(map[string]int)
    for _, word := range strings.Fields(s) {
	  m[word]++
	}
	return m
}

func main() {
	wc.Test(WordCount)
}
```
php ZIPファイル作成

#php ZIPファイル作成

zipファイルを指定ディレクトリに圧縮する。
（圧縮先に同名ファイルがある場合はunlinkをするがエラーは無視）
zipファイルのオープン・圧縮に失敗した場合は例外を投げる。
（error code は http://php.net/manual/ja/ziparchive.open.php の内容）

```php:
function zip($files, $zip_path, $mode = 0755) {
    if (file_exists($zip_path))
        @unlink($zip_path);
    
    $zip = new ZipArchive();
    if ($res = $zip->open($zip_path, ZipArchive::CREATE) !== true) 
        throw new Exception("Zip create error. ZipArchive error code : ".(string)$res);

    foreach ($files as $file) {
        if ($zip->addFile($file, basename($file)) == FALSE) {
            $zip->close();
            @unlink($zip_path);
            throw new Exception("Zip create error. ZipArchive error file : ".(string)$file);
        }
    }
    $zip->close();
    chmod($zip_path, $mode);
}
```


##備考
php7.0以降で書く場合は、引数・戻り値ともに型指定ができるので下記になる。


```php:
function zip(array $files, string $zip_path, int $mode = 0755) {}
```

**参考(ZipArchive クラス)**
http://php.net/manual/ja/class.ziparchive.php
さくらインターネットのレンタルサーバでSSL通信を使う

さくらインターネットのレンタルサーバで共有SSL（https）通信を使う方法メモ。

サーバコントロールパネルを開いて左のナビゲーションの「ドメイン設定」から
SSLを使用したいドメイン名の「変更」ボタン＞「共有SSLを利用する」にチェックを入れて「送信」

すべてのアクセスをSSL（https）通信にさせる。
テキストエディタで下記ファイルを作成し、トップディレクトリに配置。

```text:.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # http to https
    RewriteCond %{ENV:HTTPS} !^on$
    RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
    RewriteRule .* https://gunmetal.sakura.ne.jp%{REQUEST_URI} [R=301,L]
</IfModule>
```
Ruby + RESAS-API で観光資源の位置情報(緯度経度)を取得する

# RESAS-API とは

RESAS-API は RESAS のデータを取得できる WebAPI。
産業、観光、人口などの情報を、都道府県や市区町村などの地域単位で取得することができる。

<blockquote>
RESASとは？<br />
<br />
地域経済分析システム（以下、RESAS）は、地域に関する官民の様々なデータを搭載し、誰もが分かりやすいように「見える化」したシステムです。<br />
<br />
<cite><a href="https://opendata.resas-portal.go.jp/">RESAS-API - 地域経済分析システム（RESAS）のAPI提供情報</a></cite>
</blockquote>

# 準備

RESAS-API - 地域経済分析システム（RESAS）のAPI提供情報 https://opendata.resas-portal.go.jp/ にて、 API の利用登録をして、APIキー(リクエストヘッダーX-API-KEYにセットするキー)を取得する。

# 地域単位の観光資源情報を取得するサンプルコード(Ruby)

Ruby を使用して、 RESAS-API - 観光資源 https://opendata.resas-portal.go.jp/docs/api/v1/tourism/attractions.html の WebAPI をコールして観光資源のデータを取得する。

```ruby
require 'net/http'
require 'uri'
require 'json'

def get(url, params, headers)

  if params != nil && !params.empty?
    url += '?' + URI.encode_www_form(params)
  end

  uri = URI.parse(url)

  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true

  req = Net::HTTP::Get.new(uri.request_uri, headers)
  res = https.request(req)

  json = res.body
  return JSON.parse(json)

end

url = 'https://opendata.resas-portal.go.jp/api/v1/tourism/attractions'
params = {
  'prefCode' => '23',
  'cityCode' => '-',
}
headers = {
  'X-API-KEY' => '<YOUR RESAS API KEY>'
}
data = get(url, params, headers)
puts data
data['result']['data'].each do |v|
  puts "#{v['resourceName']}: #{v['lat']},#{v['lng']}"
end
```

# サンプルコードが出力する内容の一部

```
一宮コスプレパレード: 35.16802,136.880606
奥山田のしだれ桜: 35.170649,136.88648
秀吉清正記念館: 35.173799,136.853289
常泉寺: 35.174403,136.856094
大野城址（愛西市）: 35.166874,136.903691
興正寺五重塔: 35.139385,136.961104
熱田神宮信長塀: 35.125558,136.908963
ハワイアンフェスティバルｉｎ吉良: 35.1388,136.861318
観音寺（荒子）多宝塔: 35.140177,136.861479
シデコブシ: 35.0903,136.894774
笠寺観音（笠覆寺）: 35.099499,136.936709
富部神社本殿: 35.105232,136.931517
竜泉寺仁王門: 35.222878,136.985017
名古屋城: 35.081623,136.950338
有松地区の町並み: 35.065903,136.972129
日吉神社: 35.175948,137.009124
チェンソーアート競技大会: 34.763794,137.383795
```

# 参考資料

- RESAS-API - 地域経済分析システム（RESAS）のAPI提供情報 https://opendata.resas-portal.go.jp/
- RESAS-API - 観光資源 https://opendata.resas-portal.go.jp/docs/api/v1/tourism/attractions.html
Laravel5.3でLogファサードをフレームワークの外から使う方法

# ことの始まり
* 共通化したモジュールをフロント側でつかいたい。
* 単体テストでif(なんちゃら)とテストのときだけ条件分岐みたいなコードは書きたくない。

**Laravelの基本機能が単体でも動くようにしなければなりません！**

# 結論
* 弊社に業務委託で参加されているエンジニアの尽力により・・・

```php
use PHPUnit_Framework_TestCase;

use Illuminate\Config\Repository;
use Illuminate\Container\Container;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Facade;
use Illuminate\Log\Writer;

use Monolog\Logger;

class TestCase extends PHPUnit_Framework_TestCase
{
    public static function setUpBeforeClass()
    {
        $app = new Container();
        $config = new Repository([
            'app.log' => 'daily',
            'app.log_level' => 'debug',
        ]);

        $app->instance('config', $config);
        $app->alias(Dispatcher::class, 'events');

        $app->instance('log', $log = new Writer(new Logger('unittest'), $app['events']));
        Facade::setFacadeApplication($app);
    }
}
```
* あとはこのクラスを継承してテストコードを書いていただければ、テスト時にも\Log::debug('hoge'); みたいなコードも動きますのでフレームワークに実際に組み込んだときもそのまま動くというからくりです。
* これを応用すれば、全てのファサードを使えるようになるはずです。

# 余談
* monolog設定もmonologオブジェクトにsetすれば思いのまま使えます。
アコーディオン化メモ

# アコーディオン化

## ケース１：リストに無理やりボタンをつけて、アコーディオン化する

### HTML
~~~html
<dl class="list_detail">
  <dt>タイトル１</dt>
  <dd>説明１</dd>
  <dt>タイトル２</dt>
  <dd>説明２</dd>
</dl>
~~~

### javascript
~~~javascript
// アコーディオンの開閉ボタンを追加
$('.list_detail').before('<div class="btn_accordion btn_module deepBlueBtn">開く</div>');

// リストをアコーディオン化
$(function(){
  $("div.btn_accordion").on("click", function() {
    $('.list_detail').slideToggle(
      500,
      function(){
        // ボタンの文字を入れ替え
        var text = $('div.btn_accordion').text();
        if(text == '開く'){
          $('div.btn_accordion').text('閉じる');
        }else{
          $('div.btn_accordion').text('開く');
        }
      }
    );
  });
});
~~~

### CSS
~~~css
/* アコーディオンを閉じておく */
.list_detail {
  display:none;
}

/* ボタンにする */
.deepBlueBtn {
    font-size: 13px;
    color: #fff!important;
    background: rgb(102,141,185);
    background: -moz-linear-gradient(top, rgba(102,141,185,1) 0%, rgba(67,114,168,1) 100%);
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(102,141,185,1)), color-stop(100%,rgba(67,114,168,1)));
    background: -webkit-linear-gradient(top, rgba(102,141,185,1) 0%,rgba(67,114,168,1) 100%);
    background: -o-linear-gradient(top, rgba(102,141,185,1) 0%,rgba(67,114,168,1) 100%);
    background: -ms-linear-gradient(top, rgba(102,141,185,1) 0%,rgba(67,114,168,1) 100%);
    background: linear-gradient(to bottom, rgba(102,141,185,1) 0%,rgba(67,114,168,1) 100%);
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#668db9', endColorstr='#4372a8',GradientType=0 );
    border-radius: 5px;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
}

.btn_module {
    text-align: center;
    padding: 15px 5px;
    display: block;
}
~~~
React.createClassとReact.Componentの違い

Reactでコンポーネントを作る際に表題の2つの方法があるわけなのですが、学習を始めた段階で違いがわかっていなかったので整理。

# ES6を使うかどうか
一番の違いはここになります。

```
React.Component is the base class for React components when they are defined using ES6 classes.
//...
If you don't use ES6 yet, you may use the React.createClass() helper instead to create a component class.
```
https://facebook.github.io/react/docs/react-api.html#react.component


ReactやReactNativeのチュートリアルではES6の記法に沿っているので、 `React.Component` が使われています。また[基本的にはES6に移行する](https://facebook.github.io/react/blog/2015/03/10/react-v0.13.html)ため、`React.Component`を利用することが推奨されます。

# mixinsのサポート有無
`React.Component`ではmixinがサポートされていません。ES6自体でmixinがサポートされていないからです。ただし ES6 においてもmixinのユースケースは代替できるとのこと。


# Auto-bindingやgetInitializerなど一部メソッドの違い
`React.createClass`であった初期化メソッドの getInitializer は`React.Component`では constructor で初期化されます。またイベントハンドラーなどは`React.createClass`ではauto-bindingが適用されますが、`React.Component`では明示的に bindingしてあげる必要があります。

```
constructor() {
  super();
  this.state = {dispText: 'input'};
  this.handleInput = this.handleInput.bind(this);
}

handleInput(event) {
  console.log(this.state.dispText);
  this.setState({dispText: event.target.value});
}
```

#結論
基本的にはES6記法かどうかの違いで、`React.Component`で代替可能であり、またES6記法の方がフレキシブルにコンポーネントを書けるので、React.Componentを使うほうがよいようです。

http://stackoverflow.com/questions/30668464/react-component-vs-react-createclass
Go 1.8のMIPS32バイナリをルータ上で動かしてみた（失敗編）

Go 1.8で出力したMIPS32バイナリが手元のMIPS Linux環境で動かなかったという内容の記事でしたが、追試した結果を下記記事にまとめなおしました。

- [Go 1\.8のMIPS32バイナリをルータ上で動かしてみた（成功編） \- Qiita](http://qiita.com/hnw/items/8703a0e776f8b6a60b45)