OmniAICreator/Qiita-1.07M huggingface dataset:
LollipopのWebViewでinput type fileで画像アップロード


Android5.0 から WebView で画像アップのやり方が変わっていた。

[stackoverflow](http://stackoverflow.com/questions/28315363/android-studio-how-to-upload-files-in-webview-lollipop-android-5-0)にあるように実装してみた。

WebChromeClient に Lollipop 用の画像のアルバム選択メソッドを追加する。
新しいAPIを使うので build.gradle の compileSdkVersion を 21 以上に上げる。


```
private final static int FILECHOOSER_RESULTCODE = 1;
private ValueCallback<Uri[]> uploadMessage;

@Override
protected void onCreate(Bundle savedInstanceState) {
....
   webView.setWebChromeClient(new WebChromeClient() {

		public boolean onShowFileChooser(WebView webView,
		                                 ValueCallback<Uri[]> filePathCallback,
                          WebChromeClient.FileChooserParams fileChooserParams)
        {

			if( uploadMessage != null) {
				uploadMessage.onReceiveValue(null);
				uploadMessage = null;
			}
			uploadMessage = filePathCallback;
			Intent intent = fileChooserParams.createIntent();
			try {
				WebActivity.this.startActivityForResult(intent,
				                                        FILECHOOSER_RESULTCODE);
			} catch (ActivityNotFoundException e) {
				uploadMessage = null;
				return false;
			}
			return true;
		}
   });

...
```

これでHTMLの input type file タグを突くとフォトアルバムが開いてくれる。
後は画像をチョイスした後タグのinputに入るように処理を書く。

```
	@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
		if( requestCode == FILECHOOSER_RESULTCODE ) {
			if( uploadMessage == null) {
				return;	
			}
			uploadMessage.onReceiveValue(
				WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
			uploadMessage = null;
		}
   }
```

これで Lollipop でもアルバムから画像アップロードが出来るようになった。
なんかわからんが、うまく出来てるな〜。

Android 4 の処理も onActivityResult に置く時は、このコードを
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP とかで切り替わるようにする。

== じゃないのは、使っている SDK が 22 なのに、Build.VERSION_CODES.LOLLIPOP が 21 だから。
う〜ん、将来に禍を残さないためにはどーしたもんだろか？
Mac(OSX 10.10)にQGISをインストールする

はじめに
================================
d3jsでtopoJSONをグリグリするために
シェープファイル(.shp)を利用したくなりました。

シェープファイルの中身確認するためにQGISをYosemiteにインストールしたのでメモ。

インストールする環境
================================

MacOS Version 10.10.4 Yosemite


参考ページ
================================
http://dataninja.jp/qgis-mac-install/

ありがたいことに、だいたいここに書いてある通りでいける。
が、一箇所だけ困ったのであった。


QGISについて
================================

シェープファイルとは
--------------------------------------------
QGISで閲覧する地理情報データについて少しだけ説明します。

シェープファイルというのは、おおまかに言うと

* ポリゴンと点のようなエリアや地点を表すベクター情報のファイル(.shp)
* 国名、県名、番号、あるいは、トイレ、井戸というような属性データ(.dbf)
* それらの対応関係を示すファイル(.shx)

のセットでできている地図データの形式です。多分。

http://www.pasco.co.jp/recommend/word/word028/
http://www.esrij.com/getting-started/learn-more/shapefile/


QGISとは
--------------------------------------------

![スクリーンショット 2015-08-11 13.46.30.png](https://qiita-image-store.s3.amazonaws.com/0/24210/55d9a034-7296-a4e5-59da-16ff7ed28d0a.png)

こんなかんじでシェープファイルの中身を見れます。
シェープファイルはベクター情報で、レイヤーみたいにいろいろ重ねて見れます。

このスクリーンショットで見えているデータは
最もお手軽にフリーのシェープファイルが入手できるで有名な[Natual Earth](http://www.naturalearthdata.com/)さんから
ダウンロードさせていただきました。

QGISのインストール
================================

インストールするもの
--------------------------------------------
1. GDAL Complete 1.11 framework package
2. Matplotlib Python module
3. QGIS本体

依存関係の問題でこの順番にインストールしないと怒られるので
順番にインストールします。

ダウンロードサイト
--------------------------------------------
Mac用のダウンロードサイトに飛ぶ。
http://www.kyngchaos.com/software/qgis

ひと通りここに全部おいてあります。

英語読めば全部わかるはずですが、私もついつい適当に流し読みにしてハマりました。

![スクリーンショット 2015-08-11 13.33.04.png](https://qiita-image-store.s3.amazonaws.com/0/24210/eaa44d4c-edc9-e86a-2eb7-be76d6750b74.png)


GDALのインストール
--------------------------------------------
上のスクリーンショットのGDALのところをクリックしたあと、
これを入れればOK。

```
DAL 1.11 Complete [39.3 MiB] 2015-5-18
```

dmgのダウンロードが完了したら、言われるがままにNumPyとGDALをインストールします。


ちなみにGDALはGeospatial Data Abstraction Libraryの略で
コマンドラインで地図データを変換したり色々できる便利ツールです。

今回は使いませんが、コマンドラインツールを利用する方は
.bash_profileに以下を追記してパスを通しておきましょう

```bash
export PATH=/Library/Frameworks/GDAL.framework/Programs:$PATH
```

Matplotlibのインストール
--------------------------------------------
OSXにはありがたいことにpython2.7が最初から入っていますが、
pythonのライブラリです。

ここではまった。


上のスクリーンショットのMatplotlibのリンクから飛ぶと
ずらっとpythonのライブラリがダウンロードできるページに飛ぶので、
「これ全部いれるんじゃないよな。。。」と面食らいましたが
下の一つだけでよいです。

![スクリーンショット 2015-08-11 13.39.38.png](https://qiita-image-store.s3.amazonaws.com/0/24210/21c72145-fd4c-3829-1877-15b51eedf2f0.png)

ダウンロードできたらこちらもdmgの言われるがままに進めましょう。


QGISのインストール
--------------------------------------------
最初のスクリーンショットの

```
Download:
QGIS 2.10.1-1 [177.2 MiB].
```

というところからdmgをダウンロードしてインストールします


おわり。

おわりに
================================
今回はOptionalのライブラリは入れませんでしたが、
今のところは元気に動いています


QGIS楽しい！
データ構造とアルゴリズム


# ざっくり言うと
プログラムを書く上でデータ構造の理解と、
それの扱い方（操作と走査の方法）を覚えることは
とても重要です。

## データ構造とは
大きく分けると、配列とハッシュの２つ
配列とハッシュには特性によっていくつかに分けられる。
Javaで言うと、配列、リスト、Mapにあたる。
Rubyでは配列とハッシュ。
PHPでは連想配列。
各言語により実装が異なる為、
それぞれ自分の扱う言語ではどのようなデータ構造があるかを理解する必要があります。

### Rubyの例
Array

```Ruby
# 定義
a = []

# 走査
a.each do |b|
  puts b
end

# 追加
a[0] = 'a'
a << = 'a'
```

Hash

```Ruby
# 定義
a = {}

# 走査
a.each do |key,value|
  puts value
end

# 追加
a[:key] = 'a'
```

### PHPの例
連想配列

```PHP
// 定義
$array = array();
$array = array(
	'key' => 'hoge'
);

// 追加
array_push($array, 'hoge');
$array['key'] = 'hoge';

// 走査
foreach(array as $key => $value) {
	var_dump($value);
}
```

## 扱い方はシンプル
シンプルに扱えるようにデータの格納も工夫が必要です。

極端な例


```Ruby
fruit = {
  :name => [
    'apple',
    'orange',
    'banana',
  ],
  :price => [
    100,
    200,
    300,
  ],
  :zaiko => [
    5,
    5,
    10,
  ]
}

fruit[:name].count.times do |i|
  p (fruit[:name][i] + 'の値段は' + fruit[:price][i].to_s +  ' 在庫は' + fruit[:zaiko][i].to_s)
end
```

```
"appleの値段は100 在庫は5"
"orangeの値段は200 在庫は5"
"bananaの値段は300 在庫は10"
```

微妙・・・。
以下の方がシンプル（個人的な感想です。）

```
fruit = [
  {
    :name => 'apple',
    :price => 100,
    :zaiko => 5,
  },
  {
    :name => 'orange',
    :price => 200,
    :zaiko => 5,
  },
  {
    :name => 'banana',
    :price => 300,
    :zaiko => 10,
  }, 
]

fruit.each do |f|
  p (f[:name] + 'の値段は' + f[:price].to_s + ' 在庫は' + f[:zaiko].to_s)
end
```

```
"appleの値段は100 在庫は5"
"orangeの値段は200 在庫は5"
"bananaの値段は300 在庫は10"
```

データの持ち方により、
ロジックが行うことが多くなる。
ロジックが多くなればコード量が増え、
バグが潜む可能性も上がり、
可読性は下がります。

## データ構造とアルゴリズムが重要な極端な例
[外部リンク(霧島)](https://paiza.jp/poh/kirishima)

上記問題はデータ数がべらぼうに多い為、
データの持ち方とアルゴリズムをしっかり考えないと
計算が終わるのを待てないプログラムになります。


実際プログラムを（仕事上）書く上で
上記の問題のように計算量が多いことはあまりないと思いますが、
プログラムの実行にかかる時間はチリツモの為、
データ量が少なくても普段からデータの持ち方とアルゴリズムを考えて
書くことは重要です。
日々データ量が増えるようなシステムであれば、
いつか寿命が来て、性能改善に追われることになるでしょう。

## データ構造、アルゴリズムの知識がない場合の弊害
また、これらデータの持ち方やアルゴリズムを即時に考えられない場合の弊害は以下が考えられます。

- 単純にコーディングが出来ない。
	- 書くのが遅い。その上、バグっている。
- 見積もりミス
	- 見積もり段階で脳内でどこまで落とし込めるかは見積もりの精度に関わってきます。（見積もりにはWebや業務知識も必要な為、これだけあればいいわけではありません。）
- 管理サイドからのサポート
	- 実際に自分で手を動かさない場合のサポートは脳内で設計ができていないと出来ません。
	- 手を動かして、一緒に考える。そんな時間はありません。

## 練習をしましょう。
データの設計、データ走査、アルゴリズムは反復練習だと思います。
[外部リンク（えん修羅）](https://paiza.jp/poh/enshura)
上記問題は、ジョジョにレベルが上がっていくため取り込みやすいかと思います。

競技プログラミング系の問題を解くのは非常にいい練習になると思います。
[外部リンク（paiza)](http://paiza.hatenablog.com/entry/2015/04/16/IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%83%AC%E3%83%99%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E3%81%AB%E6%9C%80%E9%81%A9%EF%BC%81%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9)

[外部リンク(霧島)](https://paiza.jp/poh/kirishima)
こちらの例は、以下のアルゴリズムで解く事ができます。
[外部リンク（ナップサック問題）](http://dai1741.github.io/maximum-algo-2012/docs/dynamic-programming/)
アルゴリズムがわかってもそれを自分の言語で実装ができなければ解けない為、
データ構造の操作のよい練習になるかと思います。

※ paizaと私は全くの無関係であることをここに記載しておきます。
Excel からコピーして Markdown でペースト


[table_print](https://rubygems.org/gems/table_print) gem 使ってスクリプト書く。

```bash
$ gem install table_print -v "~> 1.5.4"
```

```ruby
#!/usr/bin/env ruby
gem "table_print", "~> 1.5.4"
require "table_print"
require "csv"

table = CSV.new(
  $stdin.read,
  col_sep: "\t",
  row_sep: :auto,
  headers: :first_row
).map(&:to_hash)

tp.set :multibyte, true
tp table
```

`tsv2md` という名前でパスの通ったところへ保存し、実行権限つける。

Excel や Google Spreadsheet でコピーして下記を実行すると、Qiita などで使える Markdown Extra 記法でクリップボードにコピーされる。

```bash
$ pbpaste | tsv2md | pbcopy
```

ただし、コピーする表の 1 行目は列名にすること。
コマンドを使ってPDFからページごとに画像を出力する

今回はMac Yosemiteで実行。

`brew install gs imagemagick`

上記インストール後、該当のPDFのフォルダに移動し
`convert -density 600 -geometry 1000 a.pdf a.jpg`
PDFが複数ページの場合は勝手に連番が付きます。
ex) a-0.jpg,a-1.jpg,a-2.jpg

特定のPDFを出力したい場合は
`convert -density 600 -geometry 1000 a.pdf[1] a.jpg`

フォルダ内の全てのPDFをJPGにする
`find . -name "*.pdf" -type f | xargs -I {} convert -density 600 -geometry 1000 {} {}.jpg`
AWS EC2のインスタンスを間違って削除しないために

先日やらかしてしまったので、覚えで書いておきます。
ひょっとしたら他の方にとっては当たり前ってことかもですが・・・

#やらかした事
EC2のインスタンスを間違って削除してしまったのです。
と言っても、本番環境ではなく社内でのツールを導入しようとしてサーバー構築していたものなので
大事には至らず、もう一度構築して済んだのですが時間のロスになってしまいました。

もし本番の環境などだったら大変！

#なんで削除してしまったの？
もちろん原因は人為的ミスなのですが、以下のような感じです。

・社内用のツールとして色々なツール・設定を試しており
　一時的にインスタンスを複数個立ち上げて同時に検証していた
・色々検証した結果、ほぼ内容が固まり本番にしようと思って細かく設定していったサーバーが
　本命として1個に絞られた状態になった
・検証用に立ち上げていたインスタンスはもう必要なくなったので削除したが
　間違えて本命のサーバーを削除してしまった。


「名前はわかりやすいものをつけているので間違わない」
「削除するときにダイアログで確認されるので普通は間違わない」
と思っていたので、まさか間違えて消すなんて思っていなかったのですが削除してしまいました・・・
とってもショックでした・・・


#で、どうしたらいいのか？
探してみたら
インスタンスのアクションに「削除保護の変更」というものがありました。

![アクション.PNG](https://qiita-image-store.s3.amazonaws.com/0/84949/bb0ada70-4a35-e6ee-f190-a24dab8b59b6.png)
というのがあるので、これを選択して
![有効化.PNG](https://qiita-image-store.s3.amazonaws.com/0/84949/54316ed3-1f17-1832-e41b-71e90d291846.png)
削除保護を有効化します。

そうするとインスタンスの削除をしたときに(↓削除実行)
![Deleteメニュー.PNG](https://qiita-image-store.s3.amazonaws.com/0/84949/f9a9b8dc-bd5d-c971-7ac0-fb0811b33c54.png)

削除が出来なくなります(ボタンが押せない)
![インスタンス削除.PNG](https://qiita-image-store.s3.amazonaws.com/0/84949/5b0621c4-935b-a38c-31b0-b098037df11e.png)

↓こっちが削除保護をしていないとき(削除ボタンが押せる)
![削除default.PNG](https://qiita-image-store.s3.amazonaws.com/0/84949/aa33b118-4f62-6eef-85b3-2e291542c019.png)


#結論
ということで、早速私の使っているEC2インスタンスは、すべて削除保護を有効化しました。
これで間違って削除する心配で夜眠れなくなることは無くなりました！！！

今度からはEC2構築したら必ずこの削除保護の有効化をすることを手順にします。
Node.jsで作ったアプリを実行しっぱなしにする

http://qiita.com/Sasakky/items/fa6a85c8891cca1fb34a
http://qiita.com/n_morioka/items/837967c0e2711198bd74

基本的には、上記ページを見れば良いと思いますが、個人的な追補です(ただし私の情報は正しくない可能性があります…。すみません。)

# foreverをインストールする

と、いいらしい。面倒なので、グローバルにインストールしちゃう(本当はあまり良くないとは思う)。

```
npm install forever -g
```

# foreverを使ってみる

http://qiita.com/mude/items/7395e7a56119cf08f5d3 で作ったWebアプリケーションを実行しっぱなしにする。

```
> forever start ./bin/www
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: ./bin/www
```

動いているかチェック。

```
> forever list
info:    Forever processes running
data:        uid  command                            script                           forever pid  id logfile                             uptime
data:    [0] FSqn "C:\Program Files\nodejs\node.exe" C:\Users\mude\hoge\myapp2\bin\www 6152    5412    C:\Users\mude\.forever\FSqn.log 0:0:0:13.215
```

確かにリストされている。今回は、FSqn.logというファイルに、コンソール出力がロギングされている。

止めたい場合は、idを指定してstopさせる。

```
> forever stop 5412
info:    Forever stopped process:
    uid  command                            script                  forever pid  id logfile                             uptime
[0] FSqn "C:\Program Files\nodejs\node.exe" C:\Users\mude\hoge\myapp2\bin\www 6152    5412    C:\Users\mude\.forever\FSqn.log 0:0:3:3.986
```

プロセスが消えているかチェック。

```
> forever list
info:    No forever processes running
```

消えてますね。

# その他

foreverを実行したコマンドプロンプトを閉じても、foreverから起動されたプロセスは消えない。
DBが複数あるRailsアプリのschema:load

諸般の事情で、一つのRailsアプリから複数のDBを参照することは偶にあると思います。

この手の場合、イカのような `database.yml` を書くといいという情報はさくっと出てきますよね。

```
development_myapp:
  <<: *default
  database: main_db
development_subapp:
  <<: *default
  database: sub_db
```

ここで、sub_db に依存したtest,specを書こうと思うと `sub_db` のschema:loadが実行できなくてこまっちゃう。
手元だったら、sub_dbを手作業で入れるとか回避策はありますが、CIツールに回そうと思うと、自動化が必要になってきます。

と言うわけで適当にRailsのコードを追ってたら出来たので晒しておきます。

```lib/tasks/sub_db.rake
namespace :sub_db do
  namespace :schema do
    desc 'Load a sub_schema.rb file into the database'
    task :load do
      config = ActiveRecord::Base.configurations['test_subapp']

      fail 'database.yml内にtest_subの設定を追加してください。' if config.blank?
      
      ActiveRecord::Tasks::DatabaseTasks.load_schema_for(config, :ruby, "#{Rails.root}/db/sub_schema.rb")
    end
  end
end
```

### 参考

* [1] https://gist.github.com/wrtsprt/b9250cd0978a32a2c50e
* [2] https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/tasks/database_tasks.rb
Movable TypeのテンプレートをAtom等のテキストエディタで作成・編集する

# 概要
Movable Typeのテンプレートを管理画面に付いているエディタを使わずに、自分のパソコンにインストールしてあるAtom等のテキストエディタで作成・編集する

# 環境
Vagrantで作成した仮想マシンにMovable Typeをインストール済→[やり方](http://qiita.com/histori/items/34174e4ff17731980ee5)

# 手順
## html,css,jsのコードを一式用意する
Atom等のテキストエディタで予め作っておく

## Movable Type側で用意されたテーマを外す
1. ダッシュボート＞ウェブサイト＞デザイン＞テンプレートに移動
2. チェックボックスをオンにして削除ボタンをクリックする

## おまじないをかける
（何のための作業か、いまわからなくても後でわかるはず）
### 作業に必要なフォルダを作成する
自分のパソコンの「MT」フォルダ配下の「www」配下の「html」フォルダに「template_link」と言うフォルダを作成する→[「MT」フォルダとは](http://qiita.com/histori/items/34174e4ff17731980ee5)
### 予め用意していたhtml,css,jsのコードを「template_link」フォルダの中にコピーする
### 画像ファイルなどを「www」配下の「html」フォルダの中にコピーする

## テンプレートの作成手順
以下、index.htmlを例にした場合

ダッシュボート>ウェブサイト>デザイン>テンプレート
「インデックステンプレートの作成」をクリック

以下の内容を入力する

* テンプレート名：index.html
* 本文：空のまま
* 出力ファイル名：index.html
* テンプレートの種類：カスタムインデックステンプレート
* ファイルへのリンク：/var/www/html/mt-static/template_link/index.html
* 公開：スタティック（規定）

「保存」をクリックする
その他のファイルも同様の作業を繰り返す

## いったん出来栄えを確認する
1. 「サイトを再構築する」ボタンをクリックする
2. 自分のパソコン上の[仮想マシン](http://192.168.33.10/index.html)にアクセスする

## テンプレートにモジュールテンプレートを差し込む
（いわゆるコードのリファクタリング）

### テンプレートモジュール用のファイルを用意する
以下、_header.htmlを例にした場合

1. 自分のパソコンの「MT」フォルダ配下の「www」配下の「html」配下の「template_link」の中に「modure」フォルダを作成する
2. 「modure」フォルダの中に「_header.html」ファイル（先頭のアンダースコアは単なる目印です）を作成する
3. テキストエディタで「_header.html」ファイルを開いて、同じくテキストエディタで開いた「index.html」内の`<head>`から`</head>`に囲まれている部分をコピーして貼り付けて保存する
4. ダッシュボート＞ウェブサイト＞デザイン＞テンプレートに移動し、「テンプレートモジュールの作成」をクリック

以下を入力する

* テンプレート名：_header.html
* 本文：空のまま
* ファイルへのリンク：/var/www/html/mt-static/template_link/modure/_header.html

最後に、テキストエディタで開いた「index.html」内の`<head>`から`</head>`に囲まれている部分を以下のコードに置き換える
`<$mt:Include module="_header.html"$>`

以上が、テンプレートにテンプレートモジュールを差し込む流れ
その他のモジュール(_footer.html等)も必要に応じて同様の作業を繰り返す

## 出来栄えを確認する
1. 「サイトを再構築する」ボタンをクリックする
2. 自分のパソコン上の[仮想マシン](http://192.168.33.10/index.html)にアクセスする

# おまけ
* [作成したコンテンツのS3へのアップロード方法](http://qiita.com/histori/items/981268f475044cc42561)
pythonの天才機能であるsys.settraceって他の言語であるんですか

ありますか？
sys.settraceは、sys.settraceを呼び出した後、一行実行するたびに引き数の関数を実行する関数(だったはず)
特にjsであるのか気になっています。
また、jsでない場合、どのようにおなじような機能を実装するのがクールですか？
WIndows10から追加された仮想デスクトップを簡単に切り替えれるソフトを作ってみた

# Windows10から追加された仮想デスクトップを簡単に切り替えれるソフトを作ってみたので公開してみました

「コードが見たい!!」って方は
[GitHubにあります](https://github.com/come25136/Function-Key-Setting)

# お知らせ
### ※開発再開しました
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">【重大なお知らせ】(重大でもないかも)&#10;Function-Key-Setting略してFKSの開発を今日限りで終了します。&#10;※気が向いたら開発再開するかも。&#10;&#10;理由:時間的な問題とソースコード公開してるから自分で改良して使ってくれるだろうと思ったから。</p>&mdash; こめ (@come25136) <a href="https://twitter.com/come25136/status/652488139739525121">2015, 10月 9</a></blockquote>

# 使い方
~~[ここからダウンロード v1.0.0](https://github.com/come25136/Function-Key-Setting/releases/tag/v1.0.0)~~
~~[ここからダウンロード v2.0.0](https://github.com/come25136/Function-Key-Setting/releases/tag/v2.0.0)~~
[ここからダウンロード v2.0.1](https://github.com/come25136/Function-Key-Setting/releases/tag/v2.0.1)
起動させる
~~F9で左移動,F10で右移動です。~~
自分でキーを指定できるようになりました

***※証明書エラーが出るかもしれませんが許可してください。***

**終了方法**
タスクトレイのアイコンを右クリックすると
終了と書かれたコンテキストメニューが出てくるので
それをクリックすると終了します。
***

#### zipのハッシュ値
MD5: 836bd1ec3636339851ec9938f0319f21
SHA-1: 422c896ddfd47587bb809dccc4dfc819077ae433
SHA-256: 5e97f012d76d86e86e5a99b9ef3a33c8545f5060b6f680c8058fdf8380916590
~~もうしばらくお待ち下さい~~

**ソフト内でやっている事は**
~~F9,F10の~~キー検知
Ctrl+Windwosキー+左矢印キーまたは右矢印キーを押す

なので使い勝手は個人差があります。

***

youtubeに使い方動画載せてます(動画内で言っていることは↑と同じです)
※URLが間違っていたのを修正しました　↓クリックすると再生されます
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/oapu3BzFFeg/0.jpg)](https://youtu.be/oapu3BzFFeg)
Swiftでプライベートメソッド

Objective-Cではたまにお世話になっていた[プライベートメソッド](http://qiita.com/hongmhoon/items/6c60d8e165d4204f1a74)
Swiftでも使おうとしたら、そのままでは使えなかったので、Swiftでも呼ぶ方法を調べました

## 用意するもの

1. プライベートメソッド定義用headerファイル
2. Bridging-Headerファイル

要は、Objective-C側でカテゴリとして再定義し、それをSwift側へブリッジしてやります

## プライベートメソッド定義用headerファイル
ファイル名は何でもよいです
ここでは`PrivateMethods.h`とします

```objc:PrivateMethods.h
#import <UIKit/UIKit.h>

@interface NSObject ()

- (NSString *)_ivarDescription;
- (NSString *)_shortMethodDescription;
- (NSString *)_methodDescription;

@end

@interface UIView ()

- (NSString *)recursiveDescription;
- (NSString *)_autolayoutTrace;

@end

@interface UIViewController ()

- (NSString *)_printHierarchy;

@end
```

## Bridging-Headerファイル
ファイル名は適当だと動きません
Bridging-Headerについての細かいことは、他の記事を参照してください

```objc:${ProductModuleName}-Bridging-Header.h
#import "PrivateMethods.h"
```

## 使い方

```swift
println(self.view.recursiveDescription())
```

こんな感じでOKです

## 注意
あくまでプライベートメソッドなので、リリースビルド時には削除しておくようにしましょう
アプリの審査にそのまま出してしまうとrejectの原因になってしまいます
MIT License 利用時の著作権表示箇所

:warning:**この記事は最終更新日から1年以上が経過しています。**

2018年追記
誤解を招くほど不当に検索順位が上がっているようなので、追記します。
原文は**2015年08月11日に投稿しました。**この文章を追記するとともに新しい投稿に見えてしまうことにご注意ください。
また、当時の時代背景と関係なく、情報が正しいことを保証しません。
むしろ訂正コメントを目的として投稿しましたので、コメントを参考のうえこの記事を根拠にすることにはご注意ください。

筆者の当時の想定として、主にPHPなどを使用したサーバーサイド・スクリプトによるWebサービスなどを想定しています。
よって、コメントにあるようにバイナリ配布や不特定に再利用できる状況などを想定しての調査は行っていません。

***

**MIT License付きのコードを利用する場合、著作権の表示はソースコード内あるいは別ファイルとして内部に持っていれば良い**

つまりは、外部(社外、利用者など)に「このライブラリを使っていると」**公**表しなくてよい。
と現在は認識している。

***

MITの「著作権の表示」という制約が、いつもどこへ表示すればいいか混乱するので1行でメモ。
「ライセンスは含んでいるけど対外には見せなくて良い」と言ってくれるものが少ない(あるいは間違っているから少ない？)。
間違っていても指摘がくるでしょう。

*表示*という表現であるかぎり、大衆が容易に確認できるところに明記しなければならないといつも考えてしまうのだが、実際はソースコード内で良い。
オープンソースならばオープンだが(トートロ)、そうでない商用利用などならば、最悪開発者しか外部ライブラリを使っていることを把握するすべはない状態もありうる？

「全員に見える必要が無い表示」「利用者が見れない表示」にかなり違和感を覚えるが、なんとなく「公(おおやけ)」の字が入っていないからか、と考えている。
原文は**notice**のみで、weblioで公示、公表などを引くと、**official [a public]**あたりの有無が分けそうな印象。

とにかく、コメント・ファイルとしてのライセンスの保持のみ気をつければ、ライブラリ使用者が気にかけることは特に無いと考えている。

***

2018年追記
上記のように判断した材料を提示していなかったので、思い出しつつ挙げます。

# [MITライセンスってなに？どうやって使うの？商用でも無料で使えるの？ | WisdomMingle.com（ウィズダムミングル・ドットコム）](http://wisdommingle.com/mit-license/)


>このソフトウェアの著作権表示（「Copyright (c) 年 作者名」）と、このライセンスの全文（英語の文章）を、ソースコードのなかや、ソースコードに同梱したライセンス表示用の別ファイルなどに掲載してください。

,

>「著作権表示」と「ライセンスの全文」の掲載については、ソースコードのなかや、同梱の別ファイルなどに下記のような記述を掲載するだけでかまいません。

原文および原文の日本語訳でよく書かれている

>ソフトウェアのすべての複製または重要な部分に記載するものとします。

が適する範囲が私にとって明確ではなかったので、この**意訳**を根拠のひとつとしています。
Redmineのガントチャートの日付表示

Redmineのガントチャートに日付表示のプラグインを入れたときのメモ。

# 環境
- OS : CentOS 6.4
- Redmine : 2.6.0

# 変更前
ガントチャート表示したとき、日付が表示されず、1/1起点の何週目かという表示になっている。
分かりづらい。

![ガントチャートbefore.jpg](https://qiita-image-store.s3.amazonaws.com/0/6889/0febcefd-f881-12b5-bcf6-496076526ee3.jpeg)

(追記)
Redmine 3.2.0以降は、プラグインをインストールしなくても日付表示されるようになりました。
http://blog.redmine.jp/articles/3_2/gantt-day/

# プラグイン
以下のプラグインをインストール。
https://github.com/vividtone/redmine_gantt_with_date

README.rdocに
> Compatible
Only => 2.4.X

と書いてあるので、バージョン2.4以上のRedmineであれば問題なさそう。

# インストール方法
* プラグインのサイトで「Download ZIP」ボタンをクリックし、zipファイルをダウンロードする。
* ダウンロードしたzipファイルを、Redmineのプラグインディレクトリに展開。  
   自分の環境だと、/opt/redmine-2.6.0-1/apps/redmine/htdocs/pluginsになる。
* 展開したディレクトリ名をリネーム。  
  (zipから展開したディレクトリ名がプラグイン名と合わないので修正する)

```
# cd /opt/redmine-2.6.0-1/apps/redmine/htdocs/plugins
# mv redmine_gantt_with_date-master redmine_gantt_with_date
```

* 以下コマンドを実行。

```
# cd /opt/redmine-2.6.0-1/apps/redmine/htdocs
# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```

コマンド実行するディレクトリ間違うと、bundleコマンドを実行したときに

```
Could not locate Gemfile
```

というエラーが出るので注意。（このエラーにしばらくハマった）

* Redmine再起動。  


# 変更後

ガントチャートを開くと、日付が表示されるようになってる。
プラグインの設定とか、プロジェクトに適用するプラグインの選択は不要。

![ガントチャートafter.jpg](https://qiita-image-store.s3.amazonaws.com/0/6889/7be14d14-8b3d-6828-e6da-9e8a11840348.jpeg)


参考：
http://myumyu151.hatenablog.com/entry/2015/01/30/155133
Devise - EmailValidatorをカスタマイズする

#経緯
- Deviseで認証するアプリで、Userのemail検証をカスタマイズしたい。
- うまくいったのでメモ。

#やり方

##おまじないを一行加える。

```rb
class User < ActiveRecord::Base
  #...
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :omniauthable

  TEMP_EMAIL_PREFIX = 'change@me'
  TEMP_EMAIL_REGEX = /\Achange@me/

  # おまじない
  validates :email, :presence => true, :email => true

  #...
```

##EmailValidatorに自分で検証を書き加える。

```rb:/app/validators/email_validator.rb
require 'mail'
class EmailValidator < ActiveModel::EachValidator
  def validate_each(record,attribute,value)
    begin
      m = Mail::Address.new(value)
      # We must check that value contains a domain, the domain has at least
      # one '.' and that value is an email address
      r = m.domain!=nil && m.domain.match('\.') && m.address == value

      # Update 2015-Mar-24
      # the :tree method was private and is no longer available.
      # t = m.__send__(:tree)
      # We need to dig into treetop
      # A valid domain must have dot_atom_text elements size > 1
      # user@localhost is excluded
      # treetop must respond to domain
      # We exclude valid email values like <user@localhost.com>
      # Hence we use m.__send__(tree).domain
      # r &&= (t.domain.dot_atom_text.elements.size > 1)
    rescue Exception => e
      r = false
    end
    record.errors[attribute] << (options[:message] || "is invalid") unless r

    # Reject temporary email address
    record.errors[attribute] << 'must be given. Please give us a real one!!!' unless value !~ User::TEMP_EMAIL_REGEX
  end
end
```

#結果（イメージ）

自分で書いた検証項目を簡単に追加することができた。

![Screenshot 2015-08-10 22.30.27.png](https://qiita-image-store.s3.amazonaws.com/0/82804/604ad1a7-3ab0-6744-5f41-dc30937e1552.png)

#資料

- https://github.com/plataformatec/devise/wiki/How-to:-Use-a-custom-email-validator-with-Devise
- http://api.rubyonrails.org/classes/ActiveModel/Validator.html
個性的なArduinoシールド4選

Arduinoが流行った2009年ごろはシールドで手軽に機能追加できるというのが謳い文句だった気がするし、Maker Faireなんかでも独自シールドを作ってる人なんかを見かけた気がするが、最近はブームが過ぎた感もある。

時代に逆行して、未だにシールドLOVEなので、ちょっと紹介してみる。

# スペクトラムシールド

![](https://docid81hrs3j1.cloudfront.net/contents/large/13116-01.jpg)
https://www.switch-science.com/catalog/2244/

ステレオミニジャックから音を入力すると低音から高音まで７つの帯域の信号レベルを出力してくれるので、いわゆるスペアナが作れる

各帯域の信号が同時に出力されるのではなく、STROBEに信号を送るたびに帯域ごとの信号レベルが順番に得られるので、思ったほど応答性が高くないのが少し残念。

現在、これを使って光るだけでなく、動きも組み合わせたスペアナを作れないか企画中。

# パワードライバシールド

![](https://docid81hrs3j1.cloudfront.net/contents/large/701_1_4.jpg)
https://www.switch-science.com/catalog/701/

前回のソレノイドコンテストでギフト券をいただいたので、最もパワーがあるソレノイドを注文したところ、駆動できる電源が手元になく、試してみたのがこれ。手前の白いコネクタはPCなどで使われるATX電源を接続できる。

回路図はシンプルなので、MOSFETを入手して自作したほうがコスパがいいのだけど、大電流・大電圧なので万一、ミスすると大変というようなケースで重宝している。

# GROVE ベースシールド

![](https://docid81hrs3j1.cloudfront.net/contents/large/base_shield_V2.jpg)
https://www.switch-science.com/catalog/1293/

アルコールセンサを使いたく、GROVEのアルコールセンサだけを入手した際に、GROVEのコネクタが独自形状なのを知らなかったのと（見た目で2.54ピッチと勘違いしてた）、安定して動かなかったというのもあって（原因はアルコールセンサの電流消費が多くArduinoがリセットしてた）、純正環境で試さないとということでGROVEのベースシールドを買ったのだが、よくよく考えてみればベースシールドを買わなくても解決するような問題だったので、アルコールセンサの動作確認が終わってからは使ってなかったりする。

そういえばGROVEの火炎センサというのを買ったけど、まだ試してなかったっけ。

# A.P. Shield

![](https://docid81hrs3j1.cloudfront.net/contents/large/448_1.jpg)
https://www.switch-science.com/catalog/448/

KORESSプロジェクトさん（当時）による心拍センサを搭載したシールド。うちのプロジェクトでも心拍センサを使った展示などをしているが、心拍センサに興味を持つキッカケとなったのが、このシールドだと思う。

（参考）心拍と表情に反応するスマートイヤリングの裏側
https://sweetelectronics.wordpress.com/2015/08/06/pulse_and_smile/
Linuxのユーザーとかグループとかの確認コマンド


忘れがちなので。

### ユーザー一覧
```
$ cat /etc/passwd
# LDAPアカウントを含むユーザー一覧の場合、getentコマンドを利用
$ getent passwd
```

### グループ一覧

```
$ cat /etc/group
# 同じく
$ getent group
```

### ログインユーザー名とプロセス
```
$ w
 01:50:21 up  1:02,  1 user,  load average: 0.00, 0.01, 0.05
USER	TTY		FROM			LOGIN@	IDLE	JCPU	PCPU	WHAT
hoge	pts/0	xxxx.yyy.zzz	01:19	5.00s	0.01s	0.00s	-bash
```

### ログインユーザーの所属グループ
```
$ groups
wheel apache tomcat
```
mac os xでruggedのインストールに失敗する

# エラー

~~~
$ bunlde install
...
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

checking for gmake... no
checking for make... yes
checking for cmake... yes
checking for pkg-config... no
ERROR: pkg-config is required to build Rugged.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/xxxx/.rbenv/versions/2.1.1/bin/ruby
	--use-system-libraries

extconf failed, exit code 1
~~~

# 解決法

homebrewでpkg-configを再インストールしてから、bundle installを再実行したら解決した

~~~
$ brew reinstall pkg-config && brew unlink pkg-config && brew link pkg-config
$ bundle install
~~~
【MySQL】date型の文字列結合

date型のカラムをconcatを使って結合する場合、そのままだとうまくいかないので、char型にキャストしてから行う。


```sql:文字列結合する例
SELECT concat(cast(date_col as char),' 12:00:00') FROM foo;
//=>2015-05-31 12:00:00
```

そのまま、concatして失敗する例。

```sql:失敗例
SELECT concat(date_col,' 12:00:00') FROM foo;
//=>323031352d30352d33312031323a30303a3030
```

参考：[stackoverflowの記事](http://stackoverflow.com/questions/8255302/mysql-using-concat-with-date-columns)
boxファイルのダウンロードに失敗し、「HTTP server doesn't seem to support byte ranges.」が表示され、やってみたこと


`vagrant box add`する際に、インターネットからのダウンロードが途中で中断され…

```text
==> default: Box download is resuming from prior download progress
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

HTTP server doesn't seem to support byte ranges. Cannot resume.
```

というような表示になり、インストールできない状態に。
時間を空けて`vagrant box add`したり、boxファイルを追加せずに`vagrant up`したりしたが、特に結果は変わらず。

でも、調べたら有用そうな情報が。

[vagran up should not assume box URL supports resume | mitchellh / vagrant | GitHub](https://github.com/mitchellh/vagrant/issues/5237)

# 環境
OS: OSX Yosemite(10.10.4)
Vagrant 1.7.4

# 一時的なファイルを削除する

「この挙動は、一時的なフォルダが悪さをしているのでは？」と推測されたので、Vagrantのboxファイルなどが格納されるディレクトリからtmp的なディレクトリの中身を削除するのを試してみる。

ディレクトリの格納場所は`~/.vagrant.d/tmp`。

```
cd ~/.vagrant.d/tmp
ls
	boxd27c916164364b2346afad1b2db78b8047723be2
rm boxd27c916164364b2346afad1b2db78b8047723be2
```

削除したら、もう一度。

```
vagrant box add <name, url>
```

やってみたら、できた。

# 気がかりな点

>squiddle commented on 27 Feb
>
>especially since binstore.hashicorp.com (where the atlas boxes come from) is not supporting Range requests.

えっ？
AWS Device Farmのサポート端末一覧を取得

#はじめに

AWS クラウドで実際のスマートフォンやタブレットを使ったテストを実施しすることができる[Device Farm](https://aws.amazon.com/jp/device-farm/)。

CLIでリストがとれることを教えてもらったので備忘録がてら書いておきます。

#端末一覧の取得

```
aws devicefarm list-devices --region us-west-2
```
これだけです。こんな感じで一覧が取得できます。

```
{
    "devices": [
        {
            "formFactor": "PHONE",
            "name": "LG G2 (Sprint)",
            "resolution": {
                "width": 1080,
                "height": 1920
            },
            "image": "NA",
            "platform": "ANDROID",
            "heapSize": 0,
            "memory": 17179869184,
            "model": "G2",
            "os": "4.2.2",
            "cpu": {
                "frequency": "MHz",
                "architecture": "ARMv7",
                "clock": 2265.0
            },
            "arn": "arn:aws:devicefarm:us-west-2::device:A0E6E6E1059E45918208DF75B2B7EF6C",
            "manufacturer": "LG"
        },
        ....
   ]
}
```

#iOSだけ取得

platformというattributeでも取れるのですが、Appleでgrepしてみました。
(--filters オプションは使えないようでした)

```
$ aws devicefarm list-devices --region us-west-2 --query 'devices[].{manufacturer:manufacturer,model:model}' --output text | grep Apple | sort -u
Apple	iPad 1st Gen
Apple	iPad 2
Apple	iPad 3rd Gen
Apple	iPad 4th Gen
Apple	iPad Air
Apple	iPad Air 2
Apple	iPad Mini 1st Gen
Apple	iPad Mini 2
Apple	iPad Mini 3
Apple	iPhone 4S
Apple	iPhone 5
Apple	iPhone 5c
Apple	iPhone 5s
Apple	iPhone 6
Apple	iPhone 6 Plus
Apple	iPod Touch 5th Gen
```

だいたいサポートされていますね。

#Androidだけ取得

さっきの逆です

```
$ aws devicefarm list-devices --region us-west-2 --query 'devices[].{manufacturer:manufacturer,model:model}' --output text | grep -v Apple | sort -u
ASUS	Nexus 7 - 1st Gen
ASUS	Nexus 7 - 2nd Gen
Amazon	Kindle Fire HD 6
Amazon	Kindle Fire HD 7
Amazon	Kindle Fire HDX 7
HTC	One M7
HTC	One M8
HTC	One M9
LG	G Flex2
LG	G Pad 7.0
LG	G2
LG	G3
LG	G4
LG	Nexus 4
LG	Nexus 5
LG	Optimus Fuel
LG	Optimus G Pro
LG	Optimus L70
LG	Optimus L90
Motorola	DROID RAZR HD
Motorola	DROID RAZR M
Motorola	DROID Turbo
Motorola	DROID Ultra
Motorola	Moto E - 2nd Gen
Motorola	Moto G
Motorola	Moto G - 2nd Gen
Motorola	Moto X
Samsung	Galaxy Light
Samsung	Galaxy Note
Samsung	Galaxy Note 2
Samsung	Galaxy Note 3
Samsung	Galaxy Note 4
Samsung	Galaxy S3
Samsung	Galaxy S3 LTE
Samsung	Galaxy S3 Mini
Samsung	Galaxy S4
Samsung	Galaxy S4 Active
Samsung	Galaxy S4 mini
Samsung	Galaxy S5
Samsung	Galaxy S5 Active
Samsung	Galaxy S6
Samsung	Galaxy S6 Edge
Samsung	Galaxy Tab 2 10.1
Samsung	Galaxy Tab 2 7.0
Samsung	Galaxy Tab 3 7.0
Samsung	Galaxy Tab 4 10.1 Nook
Samsung	Galaxy Tab 4 7.0 Nook
Samsung	Nexus 10
Sony	Xperia Z2
Sony	Xperia Z3
Sony	Xperia Z3 Compact
```
シャープや富士通、中華Androidはないようですね。日本リージョンで公開されたら追加されるのでしょうか。期待しています。

#まとめ

機種一覧がAPIで取得できるということは、今後追加された場合も対応が簡単そうですね。
setRequestHeaderの挙動が変わったよ

# どこが変わった？

SDK 4.0.0までは`xhr.setRequestHeader("X-Pointless-Header", "1234");`を複数回実行してもリクエストヘッダは上書きされるだけでした。

```js
var xhr = Ti.Network.createHTTPClient();
xhr.open("GET", "http://www.example.com/somewhere/over/the/rainbow");
xhr.setRequestHeader("X-Pointless-Header", "1234");
xhr.setRequestHeader("X-Pointless-Header", "5678");
xhr.setRequestHeader("X-Pointless-Header", "abcd");
xhr.send();
```

実際にこんなコードを書いたら有罪間違いなしですが、とにかく今までは同じキーのリクエストヘッダを指定した場合、元の値は上書きされて、サーバ側に届くリクエストは`"HTTP_X_POINTRESS_HEADER"=>"abcd"`でした。

ところが、4.1.0以降は上書きではなく追記されるようになったので`"HTTP_X_POINTRESS_HEADER"=>"1234, 5678, abcd"`という値が届くことになります。

普通、ここにはREST APIとやりとりするための認証用キーが入ったりするので、うっかり別の値を追記してしまうと大変まずいことになります。

Android版だけのバグかと思ったらiOSでも同じ動きだったので、きっと仕様が変わったのでしょう。互換性のない変更は必ず目立つ場所に掲示してもらいたいものですが、きっとアルファ・ケンタウリあたりに50年前から貼り出されていた[^1]のでしょう。

[^1]: [銀河ヒッチハイク・ガイド](https://ja.wikipedia.org/wiki/%E9%8A%80%E6%B2%B3%E3%83%92%E3%83%83%E3%83%81%E3%83%8F%E3%82%A4%E3%82%AF%E3%83%BB%E3%82%AC%E3%82%A4%E3%83%89#.E5.9C.B0.E7.90.83.E6.BB.85.E4.BA.A1)
【デザインパターン】 Observerパターン


##概要
オブジェクトの状態を観察するパターン

以下の4種類のクラスからなる
1. Subjectクラス(2.を知っており、2.の追加や削除を行う)
2. Observerクラス(1.の変化が通知された時のための更新のインターフェースを定義)
3. ConcreteSubjectクラス(1.で定義したインタフェースを実装、状態が変わった時に4.に通知を送る)
4. ConcreteObserverクラス(2.で定義したインタフェースを実装)

##具体例と実装
各家庭のSOS通知システムにすると、

上記1~4はそれぞれ

1. 家庭クラス(Familyクラス、正常状態、緊急状態があり、どの通知センターに属すかを保持する)
2. SOS監視センタークラス(SosObserverクラス、各家庭の状態を監視する)
3. 山田さん一家クラス(YamadaFamilyクラス、家庭の状態に異常があった場合に、所属する監視センターに通知する)
4. 地方自治体監視クラス(LocalSosObserverクラス、家庭からの通知を受け取り、対応部隊を出動させる)

が対応する。
コードの詳細は以下

```rb:family.rb
class Family
  def initialize
    @observers = []
  end

  def register(observer)
    # 自身を監視センターに登録する
    @observers << observer
  end

  def unregister(observer)
    # 監視センターから自身を登録解除する
    @observers.delete(observer)
  end

  def notify(state)
    # 登録している通知センターに状態を通知する
    @observers.each do |observer|
      observer.update(state)
    end
  end
end
```

```rb:sos_observer.rb
class SosObserver
  def update(state)
  end
end
```

```rb:yamada_family.rb
class YamadaFamily < Family
end
```

```rb:local_sos_observer.rb
class LocalSosObserver
  def update(state)
    # stateに応じて、対応する部隊を出動させる
    ...
  end
end
```

```rb
yamada_family = YamadaFamily.new
yamada_family.register(LocalSosObserver.new)
yamada_family.notify('トイレが詰まった')
```

##メリット
* SubjectとObserverを独立に変更することが出来る

##まとめ
分散イベント処理システムの実装の際に便利なパターン
【デザイナーが喜ぶ】コンテンツが空のときのユーザビリティを向上させる【DZNEmptyDataSet】

# DZNEmptyDataSetが便利
https://github.com/dzenbot/DZNEmptyDataSet

DZNEmptyDataSetというライブラリが便利だった。これはtableView,collectionViewが空だったときに、画像や文字、ボタンを表示できるライブラリだ。これがあると、ユーザビリティが向上する気がする。なぜコンテンツが空なのか説明したり、「コンテンツは0件です」みたいな表示ができる。

使ったらデザイナーが喜びそうだ :bowtie: 

以下、主な使い方です。(install,Delegateの設定は省略)

# 画像を表示
```swift
func imageForEmptyDataSet(scrollView: UIScrollView!) -> UIImage! {
    return UIImage(named: "sample.png")
}
```

#画像の色を変更
```swift
func imageTintColorForEmptyDataSet(scrollView: UIScrollView!) -> UIColor! {
    return UIColor.grayColor()
}
```

#タイトルを表示
```swift
func titleForEmptyDataSet(scrollView: UIScrollView!) -> NSAttributedString! {
    let text = "コンテンツは0件です"
    let font = UIFont(name: "Sample Font Name", size: 30)!
    return NSAttributedString(string: text, attributes: [NSFontAttributeName: font])
}
```

#説明文を表示
```swift
func descriptionForEmptyDataSet(scrollView: UIScrollView!) -> NSAttributedString! {
    let text = "最大100件まで表示できます"
    let font = UIFont(name: "Sample Font Name", size: 14)!
    return NSAttributedString(string: text, attributes: [NSFontAttributeName: font])
}
```

#ボタンを表示
```swift
func buttonImageForEmptyDataSet(scrollView: UIScrollView!, forState state: UIControlState) -> UIImage! {
    return UIImage(named: "button.png")
}
```

#ボタンのアクション
```swift
func emptyDataSetDidTapButton(scrollView: UIScrollView!) {
    //buttonを押したときの処理
}
```

#参考
Xcode - NSAttributedStringでCSSの各プロパティの再現方法あれこれ - Qiita
http://qiita.com/inuscript/items/fdfa69515e74506134a3
boost > boost::any > 任意の型の値を格納できるクラステンプレート

引用: C++のためのAPIデザイン by マーティン・レディ
5.4 データ駆動型API

> boost::any
> 明示的にサポートした固定型の集合ではなく、任意の型の値を格納できるクラステンプレート。元の値を抽出する際、希望の型にキャストできる。このクラスに提供されているtype()メソッドによって、オブジェクトに格納された型を確認できる。しかし、キャスト演算子によってあらかじめサポートされている変換以外、異なる型間の変換は明示的にサポートされていない。

Unity(C#)にあるBoxingというものと同等なのだろうか?

<hr>
http://cpplover.blogspot.jp/2007/02/inside-boostany.html

上記ではboost.anyを自分で実装している。

<hr>
本の虫さんのコードを元に実行してみた。
http://ideone.com/c2kaeg
Qiitaに1000記事投稿記念

## 結果

* 自分の興味がある分野が少し見えてきた。
* 自分で仕事を見つけやすくなった。
* 一般的に、技術の数が多すぎることに気がついた。
    * どれを学ぶか、も少し考えるこの頃。
* ポートフォリオとしてQiitaアカウントを使えるようになった。
* 勉強会に積極的に参加するようになった。
* 都心以外は勉強会の数がすごく少ないため、Qiitaのようなオンラインで学習できる場は需要があると感じた。

[qrank](http://qrank.wbsrv.net/users/?orderby=items)さんの集計によると(2015-08-11現在)投稿数一位だそうです。
全記事が104,358件ということは内1%が自分の記事。

![bb.png](https://qiita-image-store.s3.amazonaws.com/0/25728/be6ab188-57d8-c063-b116-86533998e32a.png)


## 始まり

* 時間を持て余していた。
* これ前もググったよな・・・メモろう
* 投稿するのが怖かったが、いざ投稿してみたところ @asahina_dev さんからコメントもらえて嬉しかった。


## 毎日Qiitaを覗いているとよく目にとまる人が出てくる

  * よくコメントをいただける @ngyuki さん
  * 上手にまとめ記事を書かれる @syuiさん
  * インフラ系の巧みな記事を書かれる @kawazさん 、@fetaro さん
  * dockerの @yunanoさん、@spesnovaさん
  * 入門記事を丁寧に書かれる @kazukichiさん
  * この人にはかなわないな、、と思った @hnakamurさん
  * 丁寧に教えてくれる @takehironetさん
  * phpのことどんだけ詳しいんだという的確な指摘をする @mpywさん
  * RaspberryPiを扱う際に参考にさせていただきました。 @keyさん
  * シェルスクリプトやLodgeでお世話になりました、 @m-yamashita さん
  * 最近すごい数の記事を書かれている @7of9さん

他にも沢山の方々と交流をもってきました。
知り合いが増えると俄然やる気が出てくる。


## Qiitaミートアップに参加した

* スマホページの改善要望が実装されていて非常に見やすくなった。
    * お知らせ欄 がスクロールせずに見れるようになった件

## 最近思うこと

* 記事閲覧数は最初の数カ月かで見なくなった。
* Qiitaを毎日利用する人はごく一部
    * 昔投稿されてた人、最近見ない
    * もしくはQiita:Teamに移られたのかな。
* 力作の記事を書いてもストックされない。これがニーズを知るということか
* ストックされすぎると逆に怖い
* 単発の投稿数より、あとで自分が検索しやすいようにまとめを作るようになってきた。
    * もしくは過去記事の加筆

## これから

* 勉強会との付き合い方を、より実りのあるように変えていきたい。
    * メンターとの出会いを求める
    * LT発表する。何度かLTしたが、したほうが断然実りがある。
    * 自分でも、もくもく勉強会開こうかなぁ
        * [PGColony](https://pgcolony.com/)
技術英語 > [Make it look like] we're in serious trouble.

@ Star Trek Voyager > EX POST FACTO

敵の攻撃を受けている中チャコティがトレスにある回避行動をするよう指示し、トレスが部下に言った言葉

> Make it look like we're in serious trouble. (...のように見せかけて)

<hr>
https://github.com/williamboman/angular-input-hints

> Animates input placeholders to make it look like they are being typed in realtime.

<hr>
https://github.com/richorama/AzureStorageExtensions

> A .NET client to Table Storage to make it look like a graph database
nanoを少しだけ便利に使う

# nanoを少しだけ便利に使う
nanoはRaspbianに最初から入っているフルスクリーンエディタ  
viに身体が慣れるまでは...

## nanoの基本操作
閉じる：ctrl + x  
保存：ctrl + o  
ページ送り：ctrl + v  
ページ戻り：ctrl + y  
1行切り取り：ctrl + k  
切り取った行を貼り付け：ctrl + u  
検索：ctrl + w  
置換：ctrl + w -> ctrl + r  

## nanoの設定ファイル
設定ファイルを書いておくとnanoがパワーアップします

```lang:~/.nano  
set autoindent  
set backup  
set backupdir "/tmp"  
set smooth  
set softwrap
set suspend  
```

### 簡単な説明
set autoindent  
→改行したときにインデントする

set backup  
set backupdir "/tmp"  
→backupdirで指定されたパスにバックアップを保存する  
　バックアップされるファイル名は「オリジナルファイル名~」

set smooth  
→ページスクロールが行スクロールになります

set softwrap  
→1行におさまらない時に折り返して表示する

set suspend  
→ctrl + z でShellに戻ることができるようになります  
　戻るにはfgコマンドで

```lang:Example
Use "fg" to return to nano.

[1]+  Stopped                 nano operation.log
```

nano起動中にctrl + zを押すと上記のような表示がされShellに戻ることができる  
上記の例の場合編集中のnanoに戻るときは  
`fg 1`  
のようにすると作業中のnanoに戻ることができる  
job番号に+が付いているものには、`fg`だけで戻る事もできる  
fgの引数の1はjob番号で  
`[1]+  Stopped`  
の[]内の数値がそれにあたる  
job番号はjobsコマンドで確認できる
そろそろメールアドレスを正規表現だけでチェックするのは終わりにしませんか？


メールアドレス　＋　正規表現　となるとまあ、当事者でなくても二の足を踏んでしまいますが…

```php
<?php

function email_check($email)
{
	$pattern = '/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*@\[?([\d\w\.-]+)]?$/';
	return preg_match($pattern, $email, $matches) && checkdnsrr($matches[2], 'MX');
}
```

この程度で十分な気がするんですが、どうでしょうね…。
ドメインの存在チェックする方がよっぽど使えると思うのです。

[checkdnsrr](http://www.php.net/checkdnsrr)

同じページに checkdnsrr を利用した[メールアドレスのバリデーション例](http://jp2.php.net/manual/ja/function.checkdnsrr.php#48157)がありますね。[eregi](http://jp2.php.net/manual/ja/function.eregi.php) を利用しているのはいただけませんが…10年前の投稿なのでやむなし。

ちなみに、@より前の部分については、もっとこうした方がいいのではなどありましたら「優しく」ご指摘ください。

コメントより、

> MXレコードがなくても妥当なメールアドレスです。代わりにA (かAAAA) レコードを引きに行くので。

ご指摘を受けて。[@mpyw さんのコード](http://qiita.com/mpyw/items/346f1789ad0e1b969ebc#e%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)こちらは @[xxx.xxx.xxx.xxx] 形式のアドレスは弾きます。

```php
<?php

function email_check($email)
{
	$pattern = '/@([\w.-]++)\z/';
	return filter_var($email, FILTER_VALIDATE_EMAIL) &&
		preg_match($pattern, $email, $matches) &&
		(checkdnsrr($matches[1], 'MX') || checkdnsrr($matches[1], 'A') || checkdnsrr($matches[1], 'AAAA'));
}
```

もう一つの案、一応、@[xxx.xxx.xxx.xxx] 形式のアドレスを受け付けます。

```php
<?php

function email_check($email)
{
	$arr = explode("@", $email);
	$domain = str_replace(array('[', ']'), "", array_pop($arr));
	return filter_var($email, FILTER_VALIDATE_EMAIL) &&
		(checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A') || checkdnsrr($domain, 'AAAA'));
}
```

さらに…

@mpyw さんの記事
[PHPで各種バリデーション](http://qiita.com/mpyw/items/346f1789ad0e1b969ebc#e%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)

##後になって気付いた副産物##
この方法だと、送信前にチェックすることで、Return mail で送信不能になるメールアドレスをあらかじめ取り除くことが可能ですね。

メールの不達にはいろいろ理由はありますが、

* Host unknown (ホストが存在しません)
* User unknown (ユーザが存在しません)
* その他

少なくとも「ホストが存在しない」場合の送信を未然に対処できますね。
Windows 7 + Vagrant 1.4.2 でCentOS7のboxが起動できなかったので調べた


背景
-----
急にCentos7が使いたくなったのでWindows7環境に入れたまま埃を被っていたvagrantにcentos/7のboxを`vagrant up` してみたが、以下のようなエラーが出て起動できなかった。

```
Bringing machine 'test' up with 'virtualbox' provider...
==> test: Checking if box 'centos/7' is up to date...
"rsync" could not be found on your PATH. Make sure that rsync
is properly installed on your system and available on the PATH.
```

エラーメッセージ通りで、rsync入れれば良いのだけど、これ以上何か入れるのは面倒だったので、設定で回避できないかな、と模索することにした。

調査
-----
まずは`--debug`でデバッグログ出してどこでこけているか調べたが、スタックトレースはあんまり役に立たなかった。ただ`synced_folder`で起きているということはわかった。

Vagrantfileを調べるとコメントアウトされた設定があったので、デフォルトの設定が悪さしてるんじゃないか、と思った。
読み込むところは最初にやっているはずだし、デフォルトの設定があったとしても何らかのメソッドで共通でやっているだろうとか適当に思って、それらしいところがないか`synced_folder`でgrepしたらすぐ出てきた。

さっそくputsを書いて眺める。
printデバッグしか知らない


```ruby:vagrant-1.7.2\plugins\kernel_v2\config\vm.rb
      def synced_folder(hostpath, guestpath, options=nil)
 # --- 省略 ---
        puts "#{hostpath} : #{guestpath} => " << options[:disabled].to_s

        @__synced_folders[options[:guestpath]] = options
      end
```

するとこうなった。

```
. : /vagrant => false
. : /vagrant => false
. : /vagrant => false
. : /home/vagrant/sync => false
Bringing machine 'default' up with 'virtualbox' provider...
```

`/vagrant`は`hostpath`が`'.'`である定義がないとデフォルトで定義するらしい(?)から無視してもよさそう。
ドキュメント英語で読めない。


では`/home/vagrant/sync`はどこから来たんだろう？
vagrantのソースをgrepしても出ないし、自分のVagrantfileにもそんな定義はない。

答えはboxのVagrantfileにあった。

```text:../.vagrant.d/boxes/centos-VAGRANTSLASH-7/1505.01/virtualbox
Vagrant.configure("2") do |config|
  config.vm.base_mac = "525400730fb1"
  config.vm.synced_folder ".", "/home/vagrant/sync", type: "rsync"
end
```

vagrant upすると食わせるようになっているっぽい？

上記の`vm.rb`で`@__synced_folders[options[:guestpath]] = options` とやっているから、同じ`guestpath`の定義を持つ`synced_folder`をVagrantfileに書いてやれば上書きできるのでは？と思った。

とりあえず解決
---------

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.synced_folder ".", "/home/vagrant/sync", disabled: true
# 略
end
```

```
. : /home/vagrant/sync => true
. : /home/vagrant/sync => false
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' is up to date...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
.....
```

やったぜ。

`. : /vagrant => false`の表示が一切消えたけど、`hostpath`が`"."`な設定を書いたからそちらが優先されたんだろう。

でも、毎回boxの内容を見てこの行を書き足すとか考えると、馬鹿馬鹿しいので、やっぱりrsync入れたほうが良いですね・・・

Windowsしか使えない人には優しくない世界ですなぁ・・・明日からも頑張ろう。
基本をおさえる！Androidアプリで指定するバージョンについて(compileSdk,buildToolsVersion,....)

なんとなく動けばとりあえずOKみたいな感じでいつも何とかしてしまうことが多いです
ですが、基本的なことですし、ちゃんと理解したいです。
バージョンを上げてトラブルにあったときも、どこを見ればいいのかなどがわかりやすいはず！

間違っているところや補足などがあったらコメントお願いします。

ぱっと並べるだけでこれぐらいありますね

* モジュールのbuild.gradle(app/build.gradle)
  * compileSdkVersion 22
  * buildToolsVersion "19.1.0"
  * minSdkVersion 14
targetSdkVersion 22

* プロジェクトルートのbuild.gradle
  * classpath 'com.android.tools.build:gradle:1.3.0'

* gradle/wrapper/gradle-wrapper.propertiesのdistributionUrl
  * distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip


## compileSdkVersion 
`例:compileSdkVersion 22`
コンパイル時に使うAndroid SDKのバージョンです。実際に実装として使われるのは端末内にある実装です。
そのバージョンにないメソッドを使おうとするとビルドできなかったりします。
例えば
`compileSdkVersion 19`
にして、Lollipop(API Level 21)のメソッドを使おうとすると以下のようにエラーが出てビルドできません
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/4f18e924-3f65-9a78-fd8a-dc5eb160a6ae.png)


ちなみにcompileSdkVersionは、SDK ManagerでそのバージョンのSDK Platformがインストールされている必要があります
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/f390b64f-3506-0645-eb02-9733eef2868f.png)


## buildToolsVersion
`例:buildToolsVersion "19.1.0"`
aapt, dex, jarsignerなどのコンパイラのバージョンで、これが低いとmultidexなどの機能が利用できないなどがあるようです。(未検証)

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/7e4366b0-3220-4d4f-1635-7fb844aabbf0.png)


ここのバージョンと対応するようです

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/e9afc415-cc0e-38fd-5b23-d41b6cad56d4.png)

https://developer.android.com/tools/revisions/build-tools.html

## minSdkVersion
`例:minSdkVersion 14`
このアプリをインストールできる最低のAPIレベルを指定します。
ここで14を指定していた場合、APIレベル10のAndorid 2.3の端末の場合Google Playからアプリをインストールして起動する事はできません。

## maxSdkVersion
`例:maxSdkVersion 22`
minSdkの上限が決まっている版です。
端末にアプリがインストールしている状態で端末がOSアップデートすると自動でアンインストールされるみたいな話を聞きました(未検証)

## targetSdkVersion
`例:targetSdkVersion 22`
一番ちゃんと動く対象の端末を指定するようです。
以下の様な動きになるようです。(テーマにはandroid:Themeを指定)

| targetSdk < 端末のAPIレベル | targetSdk > 端末のAPIレベル |
|---+---|
| targetSdkVersionバージョンのテーマを使う | 端末のAPIレベルのテーマを使う |

またメニューキーが表示されたりなどします。
Androidの内部のコードでif文などで利用しているだけのようです。
詳細はこちらで、、
[targetSdkVersionでUIが切り替わる理由](http://qiita.com/takahirom/items/a11f9af02bdea6cee716)

targetSdkVersion 8に設定した4.4.4端末の動きです。古いUIになっていることがわかると思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/130a71d2-d580-fbf7-a5e6-caca05b8987b.png)

## Android Gradle Pluginのバージョン
例 /build.gradle

```groovy
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0-beta4'    
    }
```

/app/build.gradle 以下の記述で適用しています。

```groovy
apply plugin: 'com.android.application'
```

GradleというビルドシステムのAndroid用のプラグインとなっており、Gradleがこのプラグインを利用して、プラグインがbuildToolsやcompileSdkを利用してビルドを行うようになっているようです。
最近のバージョンだとDataBindingも含まれるようになったようです。
ProductFlavorsとかもこのプラグインの機能だと思います。

ここで指定するバージョンはここから選べるようです
https://jcenter.bintray.com/com/android/tools/build/gradle/

## Gradleのバージョン
Gradleというビルドシステムにもバージョンがありそのバージョンの指定となります。

例 gradle/wrapper/gradle-wrapper.propertiesのdistributionUrl

```ini
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
```




# 終わりに
まだまだわかっていないことやバージョンが多いので、随時調べ更新していきたいです。
詳しい方や詳しいページなどがありましたら教えくてください。
Express-Generatorで作ったひな形にソケット通信を載せてみる

# Socket.IOって何?

WebSocketが使えるようになれるかもしれない。すごい。

# 早速書いてみる

http://socket.io/docs/ にコード例はあるのだけど、そのままは使えない。Express-Generator(何も考えずにインストールした場合、インストールされるバージョンは4)を使ってひな形を作った場合は、http://socket.io/docs/#using-with-express-3/4 のコードを使えばいいのだけど、ちょっと工夫が必要。

## サーバ側

http://qiita.com/mude/items/7395e7a56119cf08f5d3 で、とりあえずひな形を作ったとして、プログラム本体は ./bin/www なので、こちらをちょこっと編集する。

とりあえず、./bin/www を開いてみると、上からこんなかんじになっている。

```js
/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('myapp2:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
```

これに対して、必要なコードを部分的に追加する。具体的には次のようにする。

```js

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * ADDED!! Require Socket.IO
 */
var io = require('socket.io')(server);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * ADDED!! Socket.IO Connection.
 */
io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});
```

## クライアント側

index.jadeを、こんなかんじに書いてみる。

```
extends layout

block content
  h1= title
  p Welcome to #{title}

  script(src='/socket.io/socket.io.js')
  script.
    var socket = io.connect('http://localhost:3000');
    socket.on('news',function(data){
      console.log(data);
      socket.emit('my other event',{my:'data'});
    });
```

ところで、socket.onは、ソケットを受け取ったときの関数で、'news'とか'my other event'は、メッセージを送るイベントの名前。

# 動かしてみる

Windowsの場合は、コマンドプロンプトで次のコマンドを実行する。

```
set DEBUG=myapp2 & npm start
```

で実行。ブラウザでlocalhost:3000にアクセスすると、SocketIOを使って通信する。

Chromeの場合、デベロッパーツールを開いて、コンソールを表示させると、

```
Object {hello: "world"}
```

と出力される。また、npmを実行したコンソール(Windowsの場合はコマンドプロンプト)では、

```
{ my: 'data' }
```

と表示される。ブラウザ側、つまりクライアント側にはサーバから{hello: "world"}が送られたことが分かるし、サーバにはクライアント側から{my:'data'}が送られたことが分かる。

# チャットアプリの可能性

socket.emitが、誰か一人に送る関数であり、また、socket.broadcast.emitは、自分以外の全員に送る関数である(ブロードキャスト)。

つまり、クライアントからサーバに対してemitして、サーバがそれをbroadcastすれば、チャットが実現できるということになる。
PythonのWebフレームワークDjangoを使ってみる(2) - setting.pyを見てみる


[前回](http://qiita.com/yoshikyoto/items/6feb70340941efeb3f29)の続きです。

# ディレクトリ構造

前回作ったプロジェクトを見てみると、ディレクトリ構造はこんな感じになっています。

* project
	* manage.py
	* project
		* \_\_init\_\_.py
		* settings.py
		* urls.py
		* wsgi.py


## とりあえず initial commit する

.gitignoreは以下のようにした

```
db.sqlite3
manage.py
*.pyc
```

initial commit する。

```shell
$ git status
.gitignore
project/

$ git add .

$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   .gitignore
	new file:   project/__init__.py
	new file:   project/settings.py
	new file:   project/urls.py
	new file:   project/wsgi.py
	
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	project/__init__.pyc
	project/settings.pyc
	project/urls.pyc
	project/wsgi.pyc

$ git commit -m "initial commit"
```

`__init__.py` とかどこまでcommitしていいか分かってないけど、とりあえず全部コミットした。適切じゃないと分かったら修正します。（正直settings.pycはコミットしちゃダメだったかも）

# setting.pyを見てみる

## データベースの設定

前回実行したコマンドは

```shell
$ python manage.py migrate
$ python manage.py runserver
```

でした。migrateのタイミングかrunseverのタイミングかで、各pyファイルに対してpycファイルができるようです。
さらに、migrate時に、sqliteファイルは作成されます。`setting.py` を見てみると、

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```

という箇所があり、このへんを元にデータベースのマイグレーションが行われるようです。
とりあえず今は飛ばします。

## タイムゾーンの設定

タイムゾーンの設定が、デフォルトでは

```python
LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'
```

となっているので以下のように変更しました。

```python
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'
```

この状態でrunserverして localhost:8000 を見てみると、「うまくいった！」と日本語のページに変わります。


## 管理ページ

サーバーを動かした状態で `localhost:8000/admin` にアクセスすると管理ページにアクセスできますが、今のところ特に使わないので、現時点では割愛します。