OmniAICreator/Qiita-1.07M huggingface dataset:
ruby画像リサイズ

写真のサイズを調整したい相談が受けたので、rubyでどういう感じですれば良いのかを試してみました。

Rmagickを利用します。すごく楽です。
## Rmagickインストール
```
sudo gem install rmagick
```
#### Rmagickドキュメント
https://rmagick.github.io/

## コード
```resize.rb
# ライブラリを読み込み
require 'RMagick'

# フォルダー内jpgファイルのみ対象にする
files = Dir.glob('*.jpg')

# リサイズ
files.each do |fileName|
  # 画像取得
  img = Magick::ImageList.new(fileName)
  # 新しいサイズへ変更
  new_img = img.resize_to_fit(300, 300)
  # 新画像保存
  new_img.write('./resized/new_' + fileName)
end
```

フォルタ内のjpgファイルを一気にリサイズできました。
フロントエンドエンジニアの価値を高めるBaaS(vte.cx)

フロントエンドエンジニアの皆さん、こんにちは。

フロントエンドの開発って楽しいですよね？
サーバサイドの開発はできるならやりたくない。そう思いますよね？

今日は、そんな方にうってつけなBaaSを紹介したいと思います。

#フロントエンドエンジニアのためのBaaS、vte.cx

サーバの導入・設定、テーブルの設計、O/Rマッピング等の構築などなど、サーバサイドはとにかくやることがいっぱいで大変です。

このようなサーバサイドの作業を一切なくして、HTML、CSS、JavaScriptなどのフロントエンドコーディングだけでWebシステムを作れないものでしょうか?

そうすれば、フロントエンジニアだけでWeb開発できるようになり、開発者はUI/UXなどクリエイティビティな作業に集中できるようになります。

というわけで、私たちはサーバサイドのAPIもフロントエンジニアが自由に作れるようなBaaSをリリースしました。

それが、[vte.cx](https://vte.cx/)です。

#vte.cxの特長

vte.cxは、これまでありがちな「バックエンドAPIを提供することだけに特化している」BaaSではなく、「バックエンドAPIもフロントエンドエンジニアが実装する」という新しい概念で設計されています。
つまり、「バックエンドAPIを提供する」ための基盤を提供するのがvte.cxの役目で、あるのはRESTの規約だけです。
BaaSが提供するWebAPIやクライアントライブラリに縛られない、極めて自由度が高いのがvte.cxの特長です。

また、独自のAPIやSDKライブラリを提供しないため、JavaScriptのエコシステム(npm等)と極めて親和性が高いものになっています。
vte.cxを使ってもロックインされることはないので、安心して使っていけます。

さらに、サーバサイドJavaScript機能によってビジネスロジックも実装できます。
サーバの導入・設定、テーブルの設計、O/Rマッピング等の構築は一切必要ありません。

vte.cxはパフォーマンスに優れ、実績も豊富です。

ぜひ、以下も合わせて読んでみてください。

[qiita advent calendar 2015](http://qiita.com/advent-calendar/2015/vtecx)
[qiita advent calendar 2016](http://qiita.com/advent-calendar/2016/vtecx)

それでは。
【初心者向け】SequelProからvagrant内にたてたMySQLに接続する

# はじめに
先日構築した環境のDBへSequelProで接続できるところまでやります

# 前提
[前回の投稿](http://qiita.com/fukumura/items/fc46ae2558544306b858)で構築した環境を使っています。

# SequelProとは
これ。https://sequelpro.com/

# さっそく
Vagrantのデフォルトだと、iptablesが有効になっているので接続できないです。  
iptablesの設定で3306を開けるか、トンネリングをしてDBにアクセスするかなどいろいろ方法はあると思いますが、今回はトンネリングで接続できるようにします。

設定は下記。接続したいユーザは適宜作成してください。

![スクリーンショット 2016-12-18 15.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/1153/2b975edf-18b5-ceca-659f-0b4910d04eb1.png)

設定が終わったら接続ボタン押下。で接続できました。

![スクリーンショット 2016-12-18 15.36.39.png](https://qiita-image-store.s3.amazonaws.com/0/1153/e5bbae8f-91c6-16e7-1c00-5e73b4b9ffb8.png)

お疲れ様でした。
GCC __attribute__((hot))

GCCはFunction Attributeとして `__attribute__((hot))` という属性を関数に付与することができます。

https://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/Function-Attributes.html から引用すると、

> hot
The hot attribute is used to inform the compiler that a function is a hot spot of the compiled program. The function is optimized more aggressively and on many target it is placed into special subsection of the text section so all hot functions appears close together improving locality.
When profile feedback is available, via -fprofile-use, hot functions are automatically detected and this attribute is ignored.
> The hot attribute is not implemented in GCC versions earlier than 4.3. 

この属性が付与された関数は積極的に最適化を行い多くの環境で特別なsubsectionに配置される、とあります。GCC 4.3から入ったようです。

これの何が嬉しいのかというと(上記説明にもありますが)、よく呼ばれる関数が一箇所に固まっているとCPUキャッシュのローカリティが高まり、L1/L2キャッシュのヒット率が向上することが期待できます。今年のLLVM Developer's MeetingでもCode Placementがパフォーマンスに与える影響についてIntelの人が話していました。(http://schd.ws/hosted_files/llvmdevelopersmeetingbay2016/d9/LLVM-Conference-US-2016-Code-Alignment.pdf)

special subsectionはどのようなものでしょう。LinuxのELFでは `.text.hot` というセクションに配置されるようです。確認してみましょう。

こういうプログラムを書きます。(特にhotが有用であるケースとかではないです、あくまで確認用なので。。)

```c
__attribute__((hot))
int foo()
{
  return 1;
}

int main(void)
{
  int a = foo();
}
```

special subsectionはLoaderが解釈するものではありませんから、バイナリ表現では確認できません。そのため出力されるアセンブリをみてみます。

```console
$ gcc -O3 -S hot.c
```

```gas
	.file	"hot.c"
	.section	.text.hot,"ax",@progbits
	.p2align 4,,15
	.globl	foo
	.type	foo, @function
foo:
.LFB0:
	.cfi_startproc
	movl	$1, %eax
	ret
	.cfi_endproc
.LFE0:
	.size	foo, .-foo
	.section	.text.startup,"ax",@progbits
	.p2align 4,,15
	.globl	main
	.type	main, @function
main:
.LFB1:
	.cfi_startproc
	xorl	%eax, %eax
	ret
	.cfi_endproc
.LFE1:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005"
	.section	.note.GNU-stack,"",@progbits
```

`.text.hot` というsectionが確認できました。
Unity5.5とVSCode連携

趣味でUnityで遊んでいるのですが、Visual Studio 2015が重くて小さなコードを作るだけだとイライラしてしまいます。
そこで最近サポートが充実してきて動作も軽いVisual Studio Codeに切り替えてみました。


# 設定およびインストールしたもの

![2016-12-18_14h53_37.png](https://qiita-image-store.s3.amazonaws.com/0/8995/4d7298e7-1264-9c28-22af-cfa00858436b.png)

1. メニューのEdit -> Preferences...からUnity Preferencesダイアログを開きます
1. External ToolsタブのExternal Script EditorのドロップダウンのBrowse...からVisual Studio Codeのパスを指定します
    * 初回はドロップダウンにVisual Studio Codeが無いのですが一度設定すると出てきます

※ Unity5.4以前なら[Unity Visual Studio Code Integration](https://github.com/dotBunny/VSCode/)をプロジェクトに追加しないとうまく連携できないのですが、Unity5.5から同等の機能があるため追加不要です。

## Visual Studio Codeの拡張

この辺りを入れておくと補完やデバッグできて便利です。

* [C#](https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp)
* [Debugger for Unity](marketplace.visualstudio.com/items?itemName=Unity.unity-debug)
* [Unity Snippets](https://marketplace.visualstudio.com/items?itemName=YclepticStudios.unity-snippets)
* [Classy Naming](marketplace.visualstudio.com/items?itemName=reflectiondm.ClassyNaming)

## settings.json

フォーマッタは好みが分かれるところですが、改行したときと保存したときに自動適用することができます。

```json:settings.json
{
    // 行単位(エンターを押したとき)にフォーマットします。
    "editor.formatOnType": true,

    // ファイルを保存するときにフォーマットします。
    "editor.formatOnSave": true
}
```

## それ以外

上記の拡張を入れるとVisual Studio CodeにGet Toolsボタンが表示されるので、そこから.NET Core Toolsをダウンロードしてインストールします。

* [.NET Core 1.0.1 tools Preview 2](https://www.microsoft.com/net/core#windowsvs2015)

以上でVisual Studio Codeでも便利な環境のできあがりです。

# 参考リンク

* [VS Codeを使ったUnity開発](http://qiita.com/53able@github/items/e7c6a5ea59106348df4e)
Solrで近接検索 (proximity search)

近接検索 (proximity search) とは，複数のキーワードからなるクエリで検索する際，ドキュメント中でキーワードがどれだけ近接して出現するかを考慮して検索する手法です．

Solrでは，以下の例のように，フレーズに出現間の距離の最大値を指定して検索することができます．
`text:"テスト クエリ"~10`（Lucene query の場合）
ここで最大値を slop，slop が指定されたフレーズを sloppy フレーズと呼びます．
この例では，テストの出現とクエリの出現の間に，無関係な出現が10個まであってもマッチします．（また，後述しますが，先にクエリが出現する場合，そこからテストの出現までの間に，無関係な出現が8個まであってもマッチします．）

この機能については，例えば[公式の Solr Relevancy FAQ に紹介されています](https://wiki.apache.org/solr/SolrRelevancyFAQ#How_can_I_search_for_one_term_near_another_term_.28say.2C_.22batman.22_and_.22movie.22.29)．
しかし，細かい挙動についてまとめたドキュメントがあまり見つからなかったので，挙動を調べてまとめてみました．Solr 6.3.0 を使用しています．

例のコレクションは以下の通りです．トークンがわかりやすいよう分かち書きしてあります．

```
body_txt_ja
テスト ドキュメント
テスト 用 ドキュメント
Alpha Beta Zeta Zeta Gamma
Alpha Zeta Beta Zeta Gamma
Alpha Zeta Zeta Beta Gamma
ドキュメント テスト
テスト 用 ダミー ドキュメント
ストップ ワード テスト
ストップ ワード の テスト
```


## 近接性がスコアに影響する

近接性は，マッチするか否かの判断だけでなく，スコアにも影響します．
近接して出現するドキュメントのほうが，離れて出現するドキュメントよりも高スコアになります．
具体的には，無関係な出現の数を距離とおくと，フレーズの出現は`1 /（距離 + 1）`回の出現として扱われるので，距離によってスコアに差が出ます．

`body_txt_ja:"テスト ドキュメント"~1`と BM25 スコアリング関数の例：

```json
  "response":{"numFound":2,"start":0,"maxScore":1.3883159,"docs":[
      {
        "body_txt_ja":"テスト ドキュメント",
        "score":1.3883159},
      {
        "body_txt_ja":"テスト 用 ドキュメント",
        "score":0.74605227}]
  }
```

前者の距離は0，後者は1です．

例のスコアリング関数は BM25 です．ドキュメント長による正規化やスコアの非線形な丸めがあるため，最終的なスコアは出現回数に比例はしません．
ちなみに，debugQuery にするとスコアリングの経過が詳しくわかります．


## 距離 = マッチの長さ - キーワード数

上述の距離ですが，`マッチした部分の長さ - その部分が含むキーワードの出現の数`と考えることができます．

ですので，二キーワード間の距離は両キーワードの出現間の無関係な出現の数となり，直感的です．

また，三キーワード間の距離は，第一キーワードと第二キーワード間の距離と，第二キーワードと第三キーワード間の距離の和です．


`body_txt_ja:"Alpha Beta Gamma"~2` の例：

```json
  "response":{"numFound":3,"start":0,"maxScore":1.1809129,"docs":[
      {
        "body_txt_ja":"Alpha Beta Zeta Zeta Gamma",
        "score":1.1809129},
      {
        "body_txt_ja":"Alpha Zeta Beta Zeta Gamma",
        "score":1.1809129},
      {
        "body_txt_ja":"Alpha Zeta Zeta Beta Gamma",
        "score":1.1809129}]
  }
```

この例では，いずれも距離2です．

## 語順の入れ替わりもマッチする

語順の入れ替わりは，前者の語から後者の語の直後の距離，あるいは後者の語から前者の語の直前の距離を考え，距離2とします．

`body_txt_ja:"テスト ドキュメント"~2`の例：

```json
  "response":{"numFound":4,"start":0,"maxScore":1.3883159,"docs":[
      {
        "body_txt_ja":"テスト ドキュメント",
        "score":1.3883159},
      {
        "body_txt_ja":"テスト 用 ドキュメント",
        "score":0.74605227},
      {
        "body_txt_ja":"ドキュメント テスト",
        "score":0.70354825},
      {
        "body_txt_ja":"テスト 用 ダミー ドキュメント",
        "score":0.54773456}]
  }
```

三番目のドキュメントがヒットしています．ちなみに，四番目のドキュメントよりも上位に来ているのは，ドキュメント長による正規化のためです．


## ストップワードも出現にカウントする

どちらかというとフレーズの性質かもしれませんが，ストップワードも出現にカウントします．

`body_txt_ja:"ストップ ワード テスト"~1` の例：

```json
  "response":{"numFound":2,"start":0,"maxScore":3.0475318,"docs":[
      {
        "body_txt_ja":"ストップ ワード テスト",
        "score":3.0475318},
      {
        "body_txt_ja":"ストップ ワード の テスト",
        "score":1.9441152}]
  }
```

前者の距離は0，後者は1です．
iPython notebookのセルを復活させる方法

# 問題

Pythonを扱うときはiPython notebookを使うことが多いです。

この前困ったことが起きました。スクリプトを書いたセルがキーボードの何かを間違って打ったようで消えてしまったのです。

原因は「x(小文字英字)」を押してしまったことでした。
iPython notebookには「Edit mode」(テキストボックスにフォーカスしている状態）と「Command mode」（テキストボックスにフォーカスしていない状態; Escを押すと、このモードになる)があるようで、「Command mode」のときのショートカットに「セルの削除」があったようです。それが「x」だったのです。

ショートカット一覧は以下のようにHelpから確認出来ます。

<img width="605" alt="スクリーンショット 2016-12-18 14.43.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/40796/fb2451b7-6a41-5a28-adbd-419bcabf7cfb.png">

以下が一覧です。

<img width="741" alt="スクリーンショット 2016-12-18 14.45.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/40796/5a0db61d-86a1-aea3-672e-00791b1c401a.png">

# 解決方法

解決方法は簡単です。ショートカットの中にある「Command mode」で「z」をするとセルの削除をもとに戻すことが出来ます！

これまでiPython notebookのショートカットは使ってなかったので使ってみたいと思います。もし、使わないにしても存在を知っておかないと思わぬ挙動が起きてしまうので注意が必要です。
ベトナム人エンジニアの業務知識

　[前回の記事](http://qiita.com/d-tamura/items/5fff8e0cbdcb429e2e36)では、わたしのこれまでのオフショア経験から、現地のエンジニアと円滑にコミュニケーションをおこなうために必要だと思われることをご紹介しました。
　そのうちのひとつ「対話力」の一例として、「相手の知識レベルに配慮する」といった趣旨のことを述べましたが、今回の記事では、やはりわたしの経験に基づいて、現地のエンジニアの業務知識について事例をご紹介したいと思います。

　現在、わたしがオフショア開発に関わっているプロジェクトは、企業の経理業務に関するものです。この開発には、当然ながら **仕訳** や **支払** といった会計に関する知識が必要となってきますが、これらについては、日本人のエンジニアでも誰もがもともと十分な業務知識を持っているわけではなく、簿記などの学習を通じて知識を高める必要がありますので、この点については日本でもベトナムでも極端な差はないものとします。（日商簿記のような学習のための制度が整っているかどうか、という大きな違いはありますが）
　一方で、経理業務には、たとえば交通費などの経費の精算やその支払方法（立替、仮払、法人カードなど）も関わってきますが、これらを理解するための前提知識については、日本人の一般的なエンジニアとベトナム人の一般的なエンジニアでは、明らかに差があると感じます。ここでは、「**日本人のエンジニアにとっては当然の知識であっても、ベトナム人のエンジニアにとってはそうではないもの**」の特に顕著な例を挙げていきます。

### 1. クレジットカード ###
　近年、クレジットカードの利用はベトナムでもかなり一般的になってきていますが、それでも、特にソフトウェア開発でコーディングやテストを担う若い世代のエンジニアの多くにとっては、まだほとんど馴染みのないものです。（一方で、スマホを利用したマイクロファイナンス系の決済サービスが若者を中心に普及しはじめているようです）
　彼らは、クレジットカードに馴染みがありませんので、イシュアー（カード発行者）、アクワイアラ、加盟店、カード名義人、決済口座の間にどのような関係があり、どのようなトランザクションが日々発生しているかについて、（日本の社会人であればこれまでの社会生活から自然と頭に入っているであろうレベルの）ざっくりとしたイメージも描けていないように見受けられます。
　特に、**「カードを持っている人がお店でカードを使うと、その売上データがカード会社に送られる」**という仕組みはクレジットカードの大前提であり、わたしも含めて日本人のエンジニアは「これくらいは当然の知識である」という前提で話を進めてしまいがちですが、ベトナム人にとっては全然当然ではない、という点に注意が必要だと思います。

### 2. 電車 ###
　ベトナムには日本や他の先進諸国のような鉄道網・地下鉄網はほとんど存在せず、市民の主な交通手段はバイク一択です。わたしがオフショア開発をおこなっている舞台のホーチミン市にも、現時点で地下鉄は完成しておらず（2018年に第１号が開業予定）、電車といえばハノイを目指して走る長距離路線（南北鉄道）の１路線しかありません。
　つまり、電車という存在は、ベトナム人が普段の生活で関わることのほとんどない「非日常」です。このため、たとえば**「社用で電車に乗って、立て替えた運賃を後で会社に精算してもらう」**という、日本の企業活動においてはごくごく当たり前の行為も、彼らにとってはまったく当たり前のことではなく、容易にイメージできるものではありません。
　もちろん、**路線図や経路の概念（＝複数の経路で運賃や所要時間が異なる）**、さらには**交通系ICカードの仕組み**は、やはり日本人であれば（日本以外の国の事例であっても日本の事例を重ね合わせれば）すでに一定の前提知識は得られていますが、電車という存在すら漠然としかイメージできていないベトナム人のエンジニアには、これらに対する最低限の理解が開発に必要となる場合、一から説明してあげる必要があるでしょう。

### 3. OEM ###
　上記の事例は、大まかにいえば「触れる機会がないから理解が乏しい」という類のものですが、それだけが業務知識の不足の理由でもないようです。
　わたしが、「触れる機会があろうとなかろうとある程度の知識はあるだろう」と誤解していたのは、OEMの概念でした。特にエンジニアとしてICT業界に関わっている以上、業務としてOEM案件に関わったことがある・ないに関わらず、**「OEMとは何か？」→「他社の製品の受託製造」**といった程度の知識はあるものと前提を置いてしまっていましたが、ベトナムでの実情は異なりました。
　ここからはわたしの推測とやや乱暴な一般化ですが、ベトナム人のエンジニアは、自身の専門である開発言語や関わる技術以外のこと、特に業界全体の動向や、経済情勢、ビジネスなど、「社会人の常識」とされるような分野の知識・情報の習得にあまり積極的でないように思えます。もちろん、「そういった知識・情報を得るための書籍や雑誌、ウェブサイトが自国語（ベトナム語）で十分に整備されていない」という外的な要因も影響しているように見受けられますが、しかし、仮にそれが事実だとしても、**ベトナム語で十分に整備されないのはそもそも需要がないから**、とも考えることができます。

### 4. Microsoft Office ###
　実は、今回のテーマに関して、最も顕著にわたしの実業務に影響があったのは、ベトナム人のエンジニアの多くが「Excelをろくに使えない」ことでした。VLOOKUP関数などは当然扱えないとして、**条件付き書式やウィンドウ枠の固定、さらにはシートの複製、複数オブジェクトの一括コピー**といったごく単純な操作さえも、ともに仕事を進める中で日本側から指導して覚えてもらう必要がありました。
　ベトナムでは、学生生活などでExcelを使用する機会があまりないそうです。経緯はともあれ、正しい操作方法を知らないで作業することは作業効率を低めますので、指示を出す日本側は、「具体的に指示しなくてもこのくらいのドキュメント編集はできる」という前提を安易に置かずに、場合によっては彼らがExcelを操作する様子を横から観察し、**「こういうことができる」「こうする方が効率が良い」**ということを指示してあげるべきだと思います。
　ちなみに、彼らの一部は「監視されるとやりにくい」などと反発してくるかもしれません。しかし、事前に十分な[コミュニケーション](http://qiita.com/d-tamura/items/5fff8e0cbdcb429e2e36)が取れていれば反感を軽減することは可能です。また、このような問題の改善に取り組む日本人エンジニアの側も、「君たちの作業効率が悪いから手間をかけて改善しているのに『監視するな』とは生意気な」などとさらに反感を抱かないように、心の準備をして気持ちを切り替えて望む必要があるでしょう。
ユニークな文字列検索 (SUS, MUSについて)

これは「[文字列アルゴリズム Advent Calendar 2016](http://qiita.com/advent-calendar/2016/str)」18日目の記事です。

# はじめに
この記事では文字列からSUS, MUSと呼ばれる特徴的な部分を見つけ出す研究について紹介します。

# Unique Substring
文字列にはDNA配列(A, T, G, C)や文章などがあります。それらの文字列にとって一度しか出現しない(ユニークな)部分文字列は、重要な意味を持つ可能性があります。例えば、DNA配列でユニークな配列は特徴のある遺伝情報を持つはずです。
ユニークな部分文字列を見つける事は、部分文字列が短いほど難しくなります。例えば"山田"がユニークな部分文字列であったとして、それに一文字追加した"山田優"は必ずユニークですが、一文字削った"山"はユニークでないことがあります。
> "山田優は山へ芝刈りに行く"

下記のような短くてユニークな部分文字列を見つけ出す研究が行われました。

# Minimal Unique Substring
文字列に対して、ユニークな部分文字列であり、一文字でも削るとユニークでなくなるものをMUSと定義します。
ユニークな部分文字列は必ずMUSを内包するので、ユニークな部分文字列の素と言えます。
長さ$n$の文字列の全てのMUSを$O(n)$時間で列挙できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/154864/b178c5d0-d044-b7ac-0f2e-bb4c361725b7.png)
上図の例では、文字列$T$のMUSを示しています。$T$[7..10]="baab"に注目すると、前一文字削った$T$[8..10]="aab"は$T$[1..3]に出現し、後一文字削った$T$[7..9]="baa"は$T$[11..13]に出現します。

Suffix TreeやLCP arrayを用いたアルゴリズムが知られています。

# Shortest Unique Substring
文字列と文字列上のある位置が与えられ、その位置を含むユニークな部分文字列をSUSと定義します。
長さ$n$の文字列に前処理を$O$($n$)時間ですることで、クエリ位置$p$の全てのSUSを$O(|SUS(p)|)$時間で列挙できます。($SUS(p)$は$p$に対するSUSの集合)
![image](https://qiita-image-store.s3.amazonaws.com/0/154864/acabc450-86b3-31a1-80b5-ac2f61e18cc1.png)

SUSを見つけることはRNAのプライマー設計に役立ちます。RNAはある特定のDNA配列に張り付き、その周辺を複製します。
http://www.mls.sci.hiroshima-u.ac.jp/smg/education/replication.html
連長圧縮(RLE)された文字列に対してSUSを探索する研究が知られています。

# おわりに
今回初めて記事の投稿してみました。
分かりやすいか、内容に不足がないか不安ですが、
少しでも文字列に興味を持っていただけたら幸いです。

# 参考文献
- Pei, J., Wu, W.C.H., Yeh, M.Y.: On shortest unique substring queries. In: Proc.
ICDE. pp. 937–948 (2013)
- Haubold, B., Pierstorﬀ, N., Wiehe, T.: Genome comparison without alignment
using shortest unique substrings. BMC Bioinformatics 6(123) (2005)
- Takuya Mieno, Shunsuke Inenaga, Hideo Bannai, Masayuki Takeda, Shortest Unique Substring Queries on Run-Length Encoded Strings, Proc. the 41st International Symposium on Mathematical Foundations of Computer Science (MFCS 2016)
- Atalay Mert Ileri1, M. Oguzhan Kulekci2, Bojian Xu, Shortest Unique Substring Query Revisited, 25th Annual Symposium (CPM 2014)
- Kazuya Tsuruta, Hideo Bannai, Shunsuke Inenaga, Masayuki Takeda, Shortest Unique Substrings Queries in Optimal Time, Proc. 40th International Conference on Current Trends in Theory and Practice of Computer Science (SOFSEM 2014), LNCS 8327, 503-513, 2014.01.
PlayFrameworkへContributionsしてみよう♪

#目的
実は簡単にOSSにContributionsできるんだよって事を書いてみました。

#先に結果から
playframeworkに対して、Contributionsしちゃいました♪
https://github.com/playframework/playframework/pull/6783

```
framework/src/play-server/src/main/scala/play/core/server/ProdServerStart.scala
-    if (!(httpPort orElse httpsPort).isDefined) throw ServerStartException("Must provide either an HTTP or HTTPS port")
+    if ((httpPort orElse httpsPort).isEmpty) throw ServerStartException("Must provide either an HTTP or HTTPS port")
framework/src/play-server/src/main/scala/play/core/server/ServerConfig.scala
-  if (!port.isDefined && !sslPort.isDefined) throw new IllegalArgumentException("Must provide either an HTTP port or an HTTPS port")
+  if (port.isEmpty && sslPort.isEmpty) throw new IllegalArgumentException("Must provide either an HTTP port or an HTTPS port")
```
!(isDefined)になっている所を、isEmptyに変えただけですww
コードの意味が分からなくても、等価である事だけ分かっていれば十分ですよね♪

#Contributionsチャンスの見つけ方
さて、ここからが本題です。
どうやってスマートに(簡略化)できる所や、バッドノウハウな書き方を見つけるかですよね？？
見つけてしまえば、後はプルリク送って完了です♪

##IntelliJに頼る
IntelliJのショートカットを覚えまくりましょう。
http://qiita.com/suisuina/items/2bedd2ac3fd16d820871
便利な機能が満載です！！！

バッドノウハウな書き方の場所を見つける方法ですが、
おかしな書き方がされているところでは、IntelliJ様が赤色で警告を示してくれます。
それを見つけたらチャンス！！！該当箇所で、「Alt + Enter」を押してみましょう。
警告・問題の解決策を表示してくれますので、それに従えば修正できちゃいます♪	

##静的チェックツールを使ってみよう
http://qiita.com/ocadaruma/items/28cbfa3fda3681bc2550
にあるような静的解析ツールを使用しますと、山のように警告が出てきます。
それらのうちで、自分が直せそうな警告を修正していきますと、コードへの理解も深まり、Contributionsチャンスも見つかり、いい勉強方法だと思っています。

##勉強会に参加したりして、情報収集を頑張る
初心者のうちは、ガンガン勉強会に参加して、ギークの方々に色々教えてもらいましょう！
質問の仕方は気をつけましょうね！！
http://qiita.com/seki_uk/items/4001423b3cd3db0dada7
実は私のContributionsも、勉強会で得た情報を~~パクって~~使用して、実行してみましたww

#まとめ
意外と簡単にContributionsチャンスを見つけられるんだよって事を記載させて頂きました。
他にもこんな方法でContributionsチャンスは見つけられるんだよって方法がありましたら、是非ご教示頂けますと、幸いでございます！！！
当方、scala歴３ヶ月の初心者なので、間違いありましたら、~~ガンガン鉞投げてください~~優しくご教示ください。
VBScriptにないLikeを作るVBLike

VBAでも使えます。
ワイルドカードも使えます

## 書式
vblike("検索したい文字列,"検索する文字")
でヒットすればtrue , しなければ　fales　が返ります
chr(13)とchr(10)は自信がありません

## 注意点
VBAとかにコピーすると右斜め下に行く斜線は円マークになります。

## カスタマイズ
自動的にエスケープする機能は状況によって書き換えが効きます
たとえば
http://www.excel.studio-kazu.jp/kw/20100316224856.html
このようなファイル名と拡張子が付く検索であれば
ピリオドの行（8行目）の’を外すと可能になります。
また正規表現用の[A-z]などをあらかじめ宣言しているので
必要に応じ & 結合で加えてカスタマイズしやすくしました。

## 気付いたこと
円マークのエスケープはやるなら冒頭でないといけません。そうしないと円が増えてしまうためです。
あと垂直タブって何だろう。これはエスケープしていません。

```vb:vblike.Vbs
Function VbLike(sTest, sPattern)
Dim objRE,sAdd1,sAdd_1,xAdd,UAdd,AAdd
Set objRE = CreateObject("VBScript.RegExp")
'escape character add
'spattern = Replace(sPattern, "\", "\\", 1, -1)
'spattern = Replace(sPattern, "*", "\*", 1, -1) 'wildcard escape
'spattern = Replace(sPattern, "?", "\?", 1, -1) 'wildcard escape
'sPattern = Replace(sPattern, ".", "\.", 1, -1) 'wildcard escape
spattern = Replace(spattern, "+", "\+", 1, -1)
spattern = Replace(spattern, "|", "\|", 1, -1)
spattern = Replace(spattern, ")", "\)", 1, -1)
spattern = Replace(spattern, "(", "\(", 1, -1)
spattern = Replace(spattern, "[", "\[", 1, -1)
spattern = Replace(spattern, "]", "\]", 1, -1)
spattern = Replace(spattern, Chr(13), "\r", 1, -1)
spattern = Replace(spattern, Chr(10), "\n", 1, -1)
spattern = Replace(spattern, vbTab, "\t", 1, -1)
spattern = Replace(spattern, " ", "\s", 1, -1)
spattern = Replace(spattern, "　", "\s", 1, -1)
'Add character
sAdd1="\w" '[a-zA-Z_0-9]
sAdd_1="\W" '[^a-zA-Z_0-9] 
xAdd = "\50" '( 50 is 8 digit ASCII
uAdd = "\u00A3" '( 00A3 is 16 digit UNICODE
AAdd="[A-z]"
objRE.Pattern = "^.*" & spattern & ".*$"
If objRE.test(sTest) = True Then
 VbLike = True
Else
 VbLike = False
End If
Set objRE = Nothing
End Function
```

# 参考文献
[VBScript（VBスクリプト）でLikeするには？](http://chaichan.lolipop.jp/vbtips/VBMemo2007010118.htm) [WebArchive](https://web.archive.org/web/20220307131700/http://chaichan.lolipop.jp/vbtips/VBMemo2007010118.htm)
[正規表現による Visual Basic Scripting Edition (VBScript) の機能強化 ](https://msdn.microsoft.com/ja-jp/library/ms974570.aspx) [Webarchive](https://web.archive.org/web/20090206102847/https://msdn.microsoft.com/ja-jp/library/ms974570.aspx)
Android Chrome beta (v.56) でdocumentに対するtouchイベントのpreventDefaultが効かない

##　注意

この記事はAndroid版Google Chrome beta（56.0.2924.23）を元に記述しています。
betaなので今後のChromeのアップデートで挙動が変わる可能性があります。

## 三行でおｋ

- パフォーマンスのため `window` とか `document` に対する `touchXXX` は、preventDefaultが無効になる
- `addEventListener` 時に明示的に `{passive: false}` を指定すればOK
- いも

## どういうわけか

```javascript

document.addEventListener('touchstart', function (e) {
  e.preventDefault();

  // 以下、楽しい処理
});

```

みたいなコードを書くと、画面をスクロールできないようになります。
ゲームなど、画面まるごと `<canvas>` みたいなときにはスクロールされても困るので、
こういうことをよくやったりしますね。[^1]

[^1]: Android Chromeの場合、上から下にスワイプするとリロードかかっちゃうのでゲームが死ぬ

が、 Android Chrome beta (56) で、思ったように動かなくなりました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Android Chrome beta（56）でスワイプ操作がブラウザに吸われて泣いてる。document に対する touchstart とかの preventDefault 効いてないんかな……なぞ <a href="https://t.co/nZhF4NXuZL">pic.twitter.com/nZhF4NXuZL</a></p>&mdash; Ruたん (@ru_shalm) <a href="https://twitter.com/ru_shalm/status/809827781416611840">2016年12月16日</a></blockquote>

Chrome(55)ではスワイプしても大丈夫だったものが、
Chrome beta(56)ではキャンセルされず、
ブラウザのリロードアクションが発火している様子です。
つらみ。

## 原因

コンソールに以下のようなwarningが表示されています。

> Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080

- [Chrome Platform Status: Treat Document Level Touch Event Listeners as Passive](https://www.chromestatus.com/features/5093566007214080)

## つまり、どゆこと？

- [Passive Event Listeners によるスクロールの改善 \| blog\.jxck\.io](https://blog.jxck.io/entries/2016-06-09/passive-event-listeners.html)

上のサイトに詳しく説明がされているのですが、
「`addEventListener` のコールバック内で
　`preventDefault` が呼ばれるか確認してからじゃないと、
　画面をスクロールしていいのかわからない！」 
というのがパフォーマンス上の問題になっており、
`preventDefault` を確認しない（＝ `preventDefault` が呼ばれないものとする）オプションが
`addEventListener` に追加されたそうです。

```javascript

// preventDefaultを呼ばないのでスクロールをキャンセルしないのだけど、
// 実際に処理を実行しないとそれがわからないため、スクロールが遅延する
document.addEventListener('touchstart', function (e) {
  同期的でめっちゃ重すぎる処理();
});

// 第三引数のオプションに passive: true を渡すと、
// 中に preventDefault が存在しない扱いになる（＝呼んでも意味ない）ので、
// 処理を実行せずにスクロールを開始できる
document.addEventListener('touchstart', function (e) {
  同期的でめっちゃ重すぎる処理();
}, { passive: true });
```

`passive` のデフォルト値は `false` なのですが、Google先生いわく
「そもそも root 要素みたいなもので preventDefault 使うこと普通ないよな？
　快適なインターネットのためにデフォルトで `passive` を `true` にするぞ！」
とのことらしいです。

確かにページをスクロールさせたくない、っていう需要は普通はない。
僕はゲームだからある……(◞‸◟)

## どうしたらいいのか

- まずホントに `document` などで `preventDefault` する必要があるか考える
    - スクロールが遅延するのは事実
- 必要なのであれば第三引数に `{passive: false}` を明示的に渡す

そもそも beta での挙動なので変わるかもですが、
対応が必要な方は頑張ってください。
C > 配列の先頭アドレスの取得 > &array[0] / &array

```txt:動作環境
C89の組込み環境
```

配列の先頭アドレスの取得は僕は`&array[0]`を使っている。
人のコードを読んでいた時に、`&array`としていたので、両者が同じか確認してみた。


http://ideone.com/1B2EKG

```c
#include <stdio.h>

int main(void) {
	int array[5] = { 3, 1, 4, 1, 5 };
	
	printf("%p\n", &array[0]);
	printf("%p\n", &array);
	
	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2168 signal:0
0xfff6e87c
0xfff6e87c
```

一応、両者ともに同じアドレスになっている。
Bokeh実行の前にサンプルデータのダウンロードを


jupyterでPythonのライブリBokehを遊び半分でいじっています。ドキュメントには数々のギャラリーが陳列されており、気に入った描画のコードを自分のjupyterにコピペして実行すると綺麗なグラフが生成されますが、中にはエラーが帰ってくるものもあります。先にサンプルデータをダウンロードしていないといけません。
http://bokeh.pydata.org/en/0.10.0/docs/installation.html

import bokeh.sampledata
bokeh.sampledata.download()

![Screen Shot 2016-12-18 at 13.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/148029/3a4a235d-56c9-e320-f1a5-d9ef76f1e338.png "Screen Shot 2016-12-18 at 13.44.11.png")

と実行してからサンプルコードを実行して見てください。
２重コロンの使い方

## ::(２重コロン）の使い方が、不明だったのでメモ


```ruby:Car.rb
class Car
  def  accele
    puts "アクセルを踏みました"
  end

  class SubCar
      def  accele
        puts "アクセルを踏んだよ"
      end
  end
end
```

```ruby:SubCar.rb
require "./Car"

class Turbo < Car
  def accele
    super
    puts "セカンダリータービンを回しました"
  end
end

class NonTurbo < Car::SubCar

end

kuruma = Turbo.new()
kuruma.accele
kuruma::accele

subkuruma = NonTurbo.new()
subkuruma.accele
```

実行結果
ruby SubCar.rb

```
> アクセルを踏みました
> セカンダリータービンを回しました
> アクセルを踏みました
> セカンダリータービンを回しました
> アクセルを踏んだよ
```
SendGridでSPFやDKIMを設定する

これは[SendGrid Advent Calendar 2016](http://qiita.com/advent-calendar/2016/sendgrid)の17日めの記事です。
空いていたのでピンチヒッターで埋めます。

メール送信前にやらなければならない設定の代表的なものであるSPF/DKIMについてSendGridではどう設定するかを取り上げたいと思います。

## SPF/DKIMって結局何？
それぞれの概要は以下のSendGrid公式ブログを読んでみてください。

- [SPFとは?](https://sendgrid.kke.co.jp/blog/?p=2149)
- [DKIMとは?](https://sendgrid.kke.co.jp/blog/?p=2044)

いずれも送信ドメイン認証という仕組みの代表的なものですが、簡単に言うと以下を保証するための仕組みであるといえます。

**SPF: 送信元のIPアドレスはそのドメインから送ることを許可されている**
**DKIM: 署名されたドメインから送られてきたこと、および配送の途中で改ざんされていないこと**

これらの２つを利用したDMARCという仕組みの導入も進んでいますが、その話を進めると長くなるので興味がある人は[この辺](https://sendgrid.kke.co.jp/blog/?p=1781)を。

## DNSの設定
SPF/DKIM共に送信元のDNSにTXTレコードを追加することで実現します。

#### SPF
以下のような形式で登録します。

```example.com. IN TXT "v=spf1 ip4:192.0.2.1 -all"```
	
こんな感じで、このドメインからはこのレコードに記載されているIPアドレスから送信しますよー。ということを送信元のドメインで宣言します。

ちなみにこのドメインというのは、**ヘッダFrom(受信者に見えるFromアドレス)ではなくて、エンベロープFrom(=Return-Path)のドメイン**のことを指します。一部ヘッダFromを検証に使うドメインもあるようですが、RFCで定義されているSPFのチェックはエンベロープFromに対して行うとなっています。
	
ちなみにSPFレコードといは言いますが、**実際にはTXTレコード**です。以前実際SPFレコードという種類があったのですが、RFC7208でSPFレコードは廃止され、TXTレコードのみを記述することが推奨されています。なので、「SPFレコード=SPFの認証のための情報を記載したTXTレコード」ということです。

#### DKIM
DKIMの場合は、

``` s._domainkey.example.com 300 IN TXT "k=rsa; t=s; p=asdcflakwecrawe(以下略)"```

このような形式のレコードを登録します。

<セレクタ>._domainkey.<ドメイン名>

という場所に、公開鍵を設置し、セレクタとドメイン名が分かる形で送信時にヘッダに電子署名を付与します。

では、これらをSendGridで設定するにはどうすればいいでしょうか。

## SendGridでのSPF/DKIM設定
設定するにはDomain Whitelabelという機能を使用します。Whitelabelというキーワードは普段あまり聞きなれないと思いますが、日本でよく聞くOEMに近いイメージだと考えてるとわかりやすいと思います。実体としてはSendGridだけど、表面上ユーザが保有するドメインから送られているように見せかける、ということです。

#### Domain Whitelabelで必要になるレコード
3つのCNAMEレコードを登録します。
![Whitelabel.png](https://qiita-image-store.s3.amazonaws.com/0/24785/f8878d61-476e-d2f3-516b-4124eb3d8059.png)

この３つを指定することでSPFもDKIMも指定したドメインで認証が通るようにSendGridが勝手に設定してくれます。

### よくある質問

##### サブドメインがなんで必要なんですか？

エンベロープFromをSUBDOMAIN.DOMAINにして送信するから必要です。こうすることで既存の送信環境と完全に独立したSendGrid送信用の環境を作ることができます。SPFレコード作成の際によく問題になるのが、既に登録されているIPアドレスやincludeが多すぎて、DNSルックアップの数が上限を超えてしまうことなんですが、それが発生しません。

##### SPFレコードないけど大丈夫ですか？
CNAMEで向けてある先にSendGridが自動的にSPFレコードを登録してくれるので問題ないです。実際にDATAで表示されているドメインのTXTレコードを引くとSPFの情報が取得できることがわかると思います。

##### DKIMレコードないけど大丈夫ですか？
同上

##### 設定しないとどうなるんですか？
Domain Whitelabelを設定しない場合、エンベロープFromはSendGridのドメインになり、DKIMもSendGridのドメインで署名されます。なので、設定しなくても、SPFもDKIMもpassすることにはなりますが、「sendgrid.me 経由」みたいな表示が受信者に見えてしまいます。

##### 複数ドメイン設定できますか？
はい。Domain Whitelabelは複数設定可能なので、例えばサービスごとに別のドメインを使用しているような場合も1アカウントで問題なく送信することができます。

## 参考
あとはこの辺にもっと詳しく書いてあるので、詳しく知りたい方はぜひご確認を

- [独自ドメインを利用する(SendGridチュートリアル)](https://sendgrid.kke.co.jp/docs/Tutorials/D_Improve_Deliverability/using_whitelabel.html)
- [独自ドメイン利用（Whitelabel）および設定時のDNSレコードについて、詳しく教えてください](https://support.sendgrid.kke.co.jp/hc/ja/articles/203703439)

**Happy Sending!!**
パーセプトロン

[「Deep Learning Javaプログラミング 深層学習の理論と実装」](http://book.impress.co.jp/books/1115101146
)を読み始めました。

最初からかなり内容が難しいので関連資料をまとめます。

# 偏微分・全微分

- [まんがでわかる偏微分と全微分](http://remedics.air-nifty.com/main/2016/04/post-1859.html)

# パーセプトロン

- [高卒でもわかる機械学習 (2) 単純パーセプトロン](http://hokuts.com/2015/11/25/ml2_perceptron/)
- [単純パーセプトロン基本のき](http://www.slideshare.net/takashijozaki1/simple-perceptron-by-tjo)
- [単純パーセプトロン](http://www.slideshare.net/T2C_/ss-42750097)
- [TokyoNLP#5 パーセプトロンで楽しい仲間がぽぽぽぽ～ん](http://www.slideshare.net/sleepy_yoshi/tokyonlp5)
- [タコス De 機械学習 ~パーセプトロンを実装してみよう~](http://www.slideshare.net/ssuser1adf7f/de-60161483)
PowerShell (with C#) でINIファイルの読み書き

- [INIファイル](https://ja.wikipedia.org/wiki/INI%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB) を PowerShell と C# を使って読み書きする。

```ini:settings.ini
[section1]
Key1=Value1
Key2=Value2
Key3=Value3
; ...
```

- - -

次の Win32API の力を借りる。

- [GetPrivateProfileString 関数](https://msdn.microsoft.com/library/cc429779.aspx)
- [WritePrivateProfileString 関数](https://msdn.microsoft.com/library/cc429952.aspx)

1. まず C# で上記の関数をラップする。
    - GetPrivateProfileString → ReadFromIniFile
    - WritePrivateProfileString → WriteToIniFile

    ```c#:IniFileManager.cs
    using System.Runtime.InteropServices;
    using System.Text;
    
    public class IniFileManager
    {
        [DllImport("KERNEL32.DLL")]
        private static extern uint GetPrivateProfileString(string lpAppName,
                                                           string lpKeyName,
                                                           string lpDefault,
                                                           StringBuilder lpReturnedString,
                                                           uint nSize,
                                                           string lpFileName);
    
        [DllImport("KERNEL32.DLL")]
        private static extern uint WritePrivateProfileString(string lpAppName,
                                                             string lpKeyName,
                                                             string lpString,
                                                             string lpFileName);
    
        public static string ReadFromIniFile(string iniFilePath, string appName, string key)
        {
            StringBuilder sb = new StringBuilder(1024);
    
            GetPrivateProfileString(appName, key, null, sb, (uint)sb.Capacity, iniFilePath);
    
            return sb.ToString();
        }
    
        public static void WriteToIniFile(string iniFilePath, string appName, string key, string value)
        {
            WritePrivateProfileString(appName, key, value, iniFilePath);
        }
    }
    ```

2. PowerShell からこれを使う。

    ```ps1
    Add-Type -Path IniFileManager.cs
    ```
    - INIファイル (settings.ini) に書き込む

        ```ps1
        [IniFileManager]::WriteToIniFile("C:\Path\to\settings.ini", "ThisApplication", "SomeKey", "SomeValue")
        ```

        ```ini:結果(settings.ini)
        [ThisApplication]
        SomeKey=SomeValue
        ```
    - INIファイルから読み込む

        ```ps1
        [IniFileManager]::ReadFromIniFile("C:\Path\to\settings.ini", "ThisApplication", "SomeKey")
        ```

        ```text:結果
        SomeValue
        ```

## 追記
単に読み込むだけなら、`ConvertFrom-StringData`を使ったほうがお手軽かもしれない。

```ps1
Get-Content settings.ini | where { $_ -match ".*=.*" } | ConvertFrom-StringData
```

```text:結果
Name                           Value
----                           -----
SomeKey                        SomeValue
```
serverlessでDynamoDBのテーブルも管理する

# はじめに
業務やプライベートで[serverless](https://serverless.com/)を使ってAPIを作ることが増えてきました。ただ、serverlessのデフォルトの機能では、API GatewayとLambdaしか簡単に管理することができません（※Resourceを使えばその他も管理できますが、それは結局CloudFormationを書いているのと変わらない）。

毎度毎度DynamoDBのコンソール画面でテーブルを作成するのがなかなかに面倒なので、Resourceの部分にCFを書いて、DynamoDBも管理できるようなテンプレートを作成しました。

# テンプレート
[serverless-with-dynamo-template](https://github.com/SeiyaMogami/serverless-with-dynamo-template)

もしよろしければ、適当に使ってください。プルリクも大歓迎です。

# 今後の課題
iamRoleStatementsを絞ったほうがよさそうです。作成したTableのみを触れるようにするほうがIAM Roleとしては正しい使い方かもしれません。そのうち用意します。
Swiftの静的コード解析ツールTailorの使い方

# 概要
この記事ではSwiftの静的コード解析を行えるTailorの使い方を紹介しています。
いわゆるチェックスタイルをしてくれるツールです。
実行環境がJavaのためMac/Linux/Windowsのクロスプラットフォームで使えるのが特徴です。

# 前準備
Tailorを使う場合、JDK8以上が必要になります。
Java7以前を使っている場合は新しいバージョンをインストールする必要があります。
http://www.oracle.com/technetwork/java/javase/downloads/index.html


# インストール
Tailorの特徴としてクロスプラットフォームに対応しています。
どのプラットフォームでもコマンド一発で入るようになっているみたいです。
https://github.com/sleekbyte/tailor#getting-started

MacでHomebrewを使っている場合は

```bash
$ brew install tailor
```

# 使い方
インストールが完了している場合は、tailorコマンドが使えるようになっているはずです。

## 基本
単一ファイルに実行する場合

```bash
tailor {対象のSwiftファイル}
```

ディレクトリ配下のすべてのファイルに実行する場合

```bash
tailor .
```

## 実行オプション
Tailorには実行時に使えるいくつかのオプションも用意されています。
よく使いそうなものを抜粋して紹介します。

#### --show-rules
適応できる静的コード解析のルールを表示します。

```
tailor --show-rules
```

#### -c {path/to/.tailor.yml}
Tailorでは実行時のルールやチェックツールをyaml形式で記述できます。
それをコマンドで指定するためのオプションになります。
以下のような記述でルールを指摘できます。

```yaml:.tailor.yml
include:                # チェック対象とするファイル/ディレクトリ
    - Source            # Source配下おすべてのファイルを対象とする
exclude:                # チェック対象から除外するファイル
    - '**Tests.swift'
    - Source/Pods       
except:                 # チェックから除外する項目
    - lower-camel-case     
    - trailing-whitespace  
```
※ eceptに記述できる条件と説明はさきほどのshow-rulesオプションで確認できます。

#### -f 
出力結果のフォーマットを指定できます。
jsonやhtmlなどが用意されています。

#### --xcode={path/to/project.xcodeproj}
XCodeのビルドスクリプトにTailorを追加します。

# さいごに
使い方もシンプルで簡単に導入できるツールでした。
クロスプラットフォームで実行できるため、CIツールとも相性が良さそうですね。

# 参考
- GitHub - sleekbyte/tailor
https://github.com/sleekbyte/tailor

- [Swift] TailorでSwiftのコードを静的解析！
http://dev.classmethod.jp/smartphone/swift-tailor/
deinに乗り換えよう（第三段階）

# 前提条件

- MacOS ElCapitan 10.11.6
- vim8.0
- homebrew

# 今回の作業

第二段階に続けてプラグインを入れていく作業


- syntastic
- tagbar
- vim-tags

# 手順

## syntastic
まずは構文チェックのsyntastic

```
call dein#add('scrooloose/syntastic')
```

を追加して、vimを開き直すと。
全部一度に書けばいいんですが・・・まぁあれだ。よく分からないエラーとか出たら原因がわかりやすいから１つずつ追加してるだけですw

## tagbar
次はctagsを入れないと多分意味がないtagbar
これを入れておくとvimがideっぽく使えます(雑な説明）

```
call dein#add('majutsushi/tagbar')
```

を追加して、vimを開き直す。

## szw/vim-tags
viをいちいち閉じなくてもtagsを作り変えられる便利もの

```
call dein#add('szw/vim-tags')
```

vimを開き直しておしまい。


これで各言語共通のプラグインはインストールした（はず）


ここまでの.vimrc

```
let s:dein_dir=expand('~/.vim/dein')
let s:dein_repo_dir=s:dein_dir . '/repos/github.com/Shougo/dein.vim'

if &compatible
  set nocompatible               " Be iMproved
endif

if !isdirectory(s:dein_repo_dir)
  execute '!git clone git@github.com:Shougo/dein.vim.git' s:dein_repo_dir
endif

" Required:
execute 'set runtimepath^=' . s:dein_repo_dir

" Required:
call dein#begin(s:dein_dir)

" Let dein manage dein
" Required:
call dein#add('Shougo/dein.vim')

" Add or remove your plugins here:
call dein#add('Shougo/neosnippet.vim')
call dein#add('Shougo/neosnippet-snippets')
call dein#add('Shougo/neocomplete.vim')
call dein#add('scrooloose/nerdtree')
call dein#add('scrooloose/syntastic')
call dein#add('majutsushi/tagbar')
call dein#add('szw/vim-tags')

" You can specify revision/branch/tag.
call dein#add('Shougo/vimshell', { 'rev': '3787e5' })

" Required:
call dein#end()

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif
```

次は、自分が書くまたは書く予定の言語で便利なプラグインを入れるのと、各プラグインの設定を。仕事柄扱う言語が多いのでプラグインを選ぶところから・・・という難題がありますが。
（ちゃっちゃとやらないと、設定だけで年越ししちゃうじゃないか・・・）
日〜土の入った配列を「○曜日はじまり」で並び替え

## やりたいこと

```js
const weekday = [
  '日',
  '月',
  '火',
  '水',
  '木',
  '金',
  '土'
];
```

こういう配列を、月曜始まりとか火曜始まりとかで並び替えたい

## 例

```js
const start = '土';

const result = [
  ...[...weekday].splice(weekday.indexOf(start)),
  ...[...weekday].splice(0, weekday.indexOf(start))
];

console.log(result)
//=> ["土", "日", "月", "火", "水", "木", "金"]
```

`splice`が破壊的なせいで、サクッと書けないが、spread and rest syntaxがあるので、少しは楽

## 識者乞 or ぼちぼち調べる

- 曜日とか、時（１〜24）、秒・分（1〜60）とかのような末尾までいったら先頭に戻るようなデータの構造を表現した名前
- こういうデータの順番を変える操作を表現した名前

## （追記）circular shift

ここでやりたかった操作はcircular shiftと呼ぶことがわかった

- [Circular shift - Wikipedia](https://en.wikipedia.org/wiki/Circular_shift)
- 言語やライブラリによっては、`rotate`関数として実装されてる、らしい

## （追記） rotate-array

[rotate-array](https://www.npmjs.com/package/rotate-array)

テストのあるnpm pkgあったので、いまはオレオレコード捨ててこれを使ってる
Atomで良く使うキーバインド

## 概要
Atom でキーバインドをすぐ忘れるのでメモする。

## インストールしているパッケージ

- linter：文法チェック
- linter-pep8：linterのpep8(Python)用プラグイン
- git-plus：バージョン管理
- script：Atom上でのスクリプト実行
- goto-definition：タグジャンプ


## 良く使うキーバインド一覧

### 表示関係

|コマンド| 動作|
|:-----:|:---------:|
|Ctrl Shift p | コマンドパレットを呼ぶ |
|Ctrl Tab | タブを移動する |
|Ctrl w | タブを閉じる |
|Ctrl k + カーソル | ペインを分割する|
|Ctrl k + Ctrl n| ペインを移動する|
|Ctrl k + Ctrl w| ペインを閉じる|
|Ctrl Alt [ | Classなどを折りたたむ |
|Ctrl Alt ] | Classなどを展開する |
|Ctrl Alt Shift [ | 全体を折りたたむ |
|Ctrl Alt Shift ] | 全体を展開する |

### 編集

|コマンド| 動作|
|:-----:|:---------:|
|Ctrl /| コメントアウト(トグル) |
|Ctrl ] | インデント |
|Ctrl [ | アウトデント |
|Ctrl Shift e| タグをハイライト表示 |
|Ctrl Shift l | 行を選択 |
|Ctrl Shift k | 行を削除 |

### Gitの実行
(git-plusパッケージのインストールが必要)

|コマンド| 動作|
|:-----:|:---------:|
|Ctrl Shift h| Git のコマンド一覧を表示する |
|Ctrl Shift a| カレントバッファを add する |
|Ctrl Shift x| commit する（※）|

※ コメントバッファを保存した時点でコミットされる


### スクリプトの実行
(Scriptパッケージと各種コンパイラのインストールが必要)

|コマンド| 動作|
|:-----:|:---------:|
|Ctrl Shift b| スクリプト実行 |

日本語が文字化けする。。。

### 定義元にジャンプ
(goto-definitionパッケージのインストールが必要)

|コマンド| 動作|
|:-----:|:---------:|
|Ctrl Alt Enter| ジャンプ |
「Arduinoが無線で接続できたらいいのに…」と思っている方へ

Arduinoは便利で、PCと接続すれば様々なセンサーから情報を取ってきたり、制御を行うことができます。

しかし、このつなぐ問部分がネックになり、実現しえないことがありました。
例えば、脈拍のビジュアライズ。脈拍センサーは数種類Arduinoにあるので、ほどほど接続してしまえば何とかなります。でも、対象者が動く場合、配線でつなぎ留めておくわけにはいきません。

無線で情報を送ってくれる「Arduinoっぽいもの」があれば…

そんなあなたにぜひ紹介したい！そんなボードががあるんです！

# ESP-WROOM-02開発ボード(ESPr Developer)
![ESP-WROOM-02開発ボード.PNG](https://qiita-image-store.s3.amazonaws.com/0/100231/a5a53d54-2ddd-c3b2-68db-d113e77799af.png)
出展：[スイッチサイエンス](https://www.switch-science.com/catalog/2652/)

お値段なんと2,580円！
お手頃！

さて、どのように無線で接続すかというと、こういう感じです。
![ESP-WROOM-02開発ボード2.PNG](https://qiita-image-store.s3.amazonaws.com/0/100231/c67719a9-a68d-2cfc-31ce-9833da0adb85.png)

SoftAPモードではESP-WROOM-02自体がアクセスポイントになります。
つまり、プログラムを書き込んだESP-WROOM-02をモバイルバッテリーに接続した瞬間、Wifiが飛びます。
PC側では、このアクセスポイントに接続するだけでOKです。

StationModeは、他のWifiを経由して接続します。こっちのほうがイメージしやすいですかね。


見てわかる通り、ジャンパワイヤーを差し込む穴があります。
このあたりもArudinoと同じなので、親しみやすいところです。

大きさはこちらの画像を見ていただければわかる通り、小さいです。
(重なっている白い箱のようなものは、センサー側の装置です。)
![14595586_1598741463763581_6273077075903958125_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/100231/37c5efa7-4c55-a93b-07e9-100c587859e4.jpeg)

モバイルバッテリーからの給電でも動きました。


# 実用例

モバイルバッテリーからの給電でESP-WROOM-02を駆動(アクセスポイントモード)。脈拍センサーからの情報をTOUTから読み込み、UDPで飛ばしています。
ビジュアライズはおなじみのvvvvです。

![test3.gif](https://qiita-image-store.s3.amazonaws.com/0/100231/87072a23-31c8-45ab-bee5-66d2f3d580a7.gif)

実装については、こちらの情報に沿って行いました。
[ESP8266を使ってArduinoからネットワーク接続してみる](http://4009.jp/post/2015-12-25-esp8266/)
[ESP8266にArduinoスケッチを書き込んでUDPデータ送受信](http://4009.jp/post/2016-04-25-esp-wroom-02/)
(筆者のイシイさんありがとうございます。)

アナログのセンサー値を、TOPUTピンから取ってくるにはややコツがあってこちらを参考にしました。http://qiita.com/azusa9/items/26e74e4e0d5773ce9c41

また、ファームウエア更新を手探りでやったのですが、メモリの番地指定とかあって、わけもわからずやったら起動すらしなくなって詰みかけました。そんなとき、こちらのサイトに救われましたので、もし同様のことで困ったら見てみるといいかもしれません。
http://nemuisan.blog.bai.ne.jp/?eid=215341

最終的に私が使ったコードはこちら。

```ruby:ESP
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
extern "C" {
#include "user_interface.h"
}
 
//Access Point Setting
const char *APSSID = "ESP_WROOM_02";
const char *APPASS = "hoge4009";
unsigned int localPort = 8888;
 
WiFiUDP UDP;
char packetBuffer[255];

static const char *udpReturnAddr = "192.168.4.2";
static const int udpReturnPort = 8889;
 
void setup() {
 
  Serial.begin(115200);
  Serial.println();
 
  WiFi.softAP(APSSID, APPASS);
 
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  UDP.begin(localPort);
 
}
 
void loop() {

  int packetSize = UDP.parsePacket();
 
 if (packetSize) {
 
    int len = UDP.read(packetBuffer, packetSize);
    //終端文字設定
    if (len > 0) packetBuffer[len] = '\0';



  uint ADC_Value = 0;
  ADC_Value = system_adc_read();
  Serial.println("=======ANALOG " + String(ADC_Value) + "ANALOG ");


String str = String(ADC_Value) ;
int a = str.length();
 char msg[a+1];
  str.toCharArray(msg, a+1);

 
    UDP.beginPacket(udpReturnAddr, udpReturnPort);
    UDP.write(msg,a+1);
    UDP.endPacket();  
    
} 
 
}
```
※記憶が正しければ、PC側からポート8888へUDPで「１」を飛ばしてあげる必要があります。
というのは、この処理を入れずに、電源入れたらすぐUDP走らせてねってやると、ボード自体がうまく動かないからです。

よきvvvvLifeを！
（備忘録）Macbookを初期化する前にやること。


初代Macbookを購入したのが7年前
2代目Macbookを購入したのが3年前

先月、初代Macbookは充電器が膨張して、トラックパッドが完全に使えなくなりました。

![IMG_3051.JPG](https://qiita-image-store.s3.amazonaws.com/0/153088/c7178a7b-6959-9aee-6184-2505a794613f.jpeg "IMG_3051.JPG")

そして2代目Macbookも、だんだんとスピードが重くなり、chromeはタブを10個くらいでも立ち上げるとそれだけで、すぐにフリーズしてしまうみたいな。

そんなこんなでMacbookを買い替えようかと思っていたのですが、最新のMacbookを購入するとトータル20万円近く。

これは高い、ということで初期化することにしました。
初代Macbookも初期化でだいぶ速度が改善された経験があったので、やってみることにしました。

ちなみに、結果的には、めちゃめちゃ速度が改善されたので、オススメです。
また、次回、初期化することがあるかもしれないので、備忘録として残しておきます。

いろいろ参考のサイトは確認したけど、結局、公式サイトの[「Mac を売却または譲渡する前に
」](https://support.apple.com/ja-jp/HT201065)通りにやればサクっとできます。


やること、これだけです。詳しくは公式サイトを参照してください。

1. バックアップの作成
2. iTunesからサインアウト
3. iCloudからサインアウト
4. iMessageからサインアウト
5. macOSを消去して再インストール

2~4のサインアウトが必須なのと、再インストールは合計3時間くらいかかったので余裕があるときにやるといいです。

とりあえず、結果、速度は本当に上がって、とても快適なので、年末の大掃除に是非。
正規表現で最後にmatchするものだけを置き換える

最後にmatchするものだけを置き換えたい場合です。

最後にmatchするものは解釈によって異なります。

```ruby
text = "むふふうふふふ"
```

こちらで「ふふ」を置き換えしたい場合、末尾の「ふふ」のmatchする部分を前方にするのか、最後尾にするのかで異なります。

パターンによって方法が異なるので、分けて説明します。


## 前方にmatchする方法

**reverseを用いる方法**

```ruby
text = "foobarbazfoobarbazfoobarbaz"
text.reverse.sub("foo".reverse, 'FOO'.reverse).reverse
=> "foobarbazfoobarbazFOObarbaz"
```

**否定先読みを用いる方法**

```ruby
text = "foobarbazfoobarbazfoobarbaz"
text.sub(/foo(?!.*foo)/m, 'Foo')
=> "foobarbazfoobarbazFOObarbaz"
```

## 最後尾にmatchする方法

**(.*)を用いる方法**

```ruby
text = "foobarbazfoobarbazfoobarbaz"
text.sub(/(.*)foo/m, '\1Foo')
=> "foobarbazfoobarbazFOObarbaz"
```

```ruby
text = "むふふうふふふ"
text.sub(/(.*)ふふ/m, '\1*')
=> "むふふうふ*"
```

結構マニアックな使い方だと思います。

他にやり方があれば、教えて下さい:bow:

kanpou_さん、scivolaさん、ありがとうございます！
PC作業時の姿勢について

# はじめに
皆さんどんな姿勢でPC作業していますか？
周りを見渡すと猫背になっていたり、椅子を低くしてまるでレーシングドライバーのようになっていたり…。
ストレートネックは肩コリの原因とか作業効率に影響があるとか言われていますし、これはあまり良くないのではないでしょうか？

# 理想
背筋を伸ばして作業するべきだと思います。
俯かず顔を上げた状態状態で、腕も自然な位置で作業したいですね。

# 原因
モニターの位置が低すぎるのです。
それに合わせて座ると姿勢が悪くなる。

# 解決案
まず姿勢良く座りましょう。
背筋を伸ばした状態で肘を曲げるだけで自然にキーボードが操作出来るように座る。
モニターに体を合わせるのではなく、体にモニターを合わせる。

## デスクトップPCの場合
1. モニターの高さを高くする  
モニターの高さが調節出来る場合は調節する。  
調節出来ない場合は下に台を置く。  
モニター台でも良いですし、コピー紙を積んでも良いと思います。

## ノートPCの場合
1. ノートPCの置き場所を高くする
ノートPC用の台もありますし、コピー紙を積んでも良いと思います。

2. キーボードを外付けする
PCの位置を高くすると今度は腕の位置が…という訳で、キーボードとマウスを外付けしちゃいましょう。

これでデスクトップPCもノートPCも同等で良い姿勢で操作が出来ると思います。
見た目さえ気にしなければ職場にあるもので結構解決出来ますし、試してみてはいかがでしょう？
rubyで簡易Singleton


みなさん、rubyでSingletonパターンを実装するときにはどうしていますか？
多くの人が標準ライブラリのsingletonパッケージにあるSingletonモジュールを使っていると思います。

```ruby
require 'singleton'

class MyClass
  include Singleton
  
  def initialize
    @instance_var = 'hoge'
  end
  
  def my_func
    return @instance_var
  end
end

puts MyClass.instance.my_func # => hoge
```

でも、いちいち`.instance`って書くのめんどくさいですよね。。。

なので、クラスオブジェクトをシングルトンクラスのオブジェクト代わりに使ってみました。

```ruby
module MyClass
  module_function
  
  @instance_var = 'hoge'
  
  def my_func
    return @instance_var
  end
end

puts MyClass.my_func # => hoge
```

インスタンス変数の代わりにクラスインスタンス変数を使っているのがポイントです。

Singletonモジュールを使う場合との比較を載せておきます。

|                        | Singletonモジュールをインクルード | クラスオブジェクトを利用                |
|------------------------|-----------------------------------|-----------------------------------------|
| シングルトンにする方法 | include Singleton                 | module_function                         |
| 初期化の方法           | initialize                        | クラス定義の中で行う                    |
| 初期化のタイミング     | 最初にinstanceを読んだ時          | クラスが書かれたファイルをrequireした時 |
| 状態の保持をする変数   | クラス変数                        | クラスインスタンス変数                  |
CPUがリトルエンディアンかビックエンディアンかを1行で判定する

# 判定方法

```c:C99
printf("You are %s\n", *(char *)&(short){1} ? "Little" : "Big");
```

```c:C89
short i = 1;
printf("You are %s\n", *(char *)&i ? "Little" : "Big");
```

<del>途中まで書きかけて放置してたけどもう投稿しちゃえ</del>
dialogReturnイベント時、updateでコンポーネントを指定しても更新されないので調べた

dialogframeworkで開いたダイアログから帰ってきた値で画面上の項目を更新したいので以下のように記述した。

```xml
<p:ajax event="dialogReturn" listener="#{hoge.fuga}" process="comp" update="comp" />
```

同画面に"comp"というidを持つコンポーネントが存在し、"hoge.fuga"というメソッドの中で"comp"の値を変更している。

が、この記述では値が更新されない。
原因は実行順で、
listener
processによるpost
update
の順番になる。
listenerで更新した値がprocessによって変更前の値で上書きされてしまうので変更されていないように見える。

hoge.fugaの中でcompの値を使いたい場合はダイアログを呼び出すボタンなどのprocessにcompを記述すればいい。

感覚としてはprocess、listener、updateの順番だと思うけど…
p:ajaxにprocessを記述できる意味もなくなってるし変な仕様。
Javaを利用したタイムゾーンの取り扱い

### 本題に生える前に
Javaでjava.util.Dateを利用してタイムゾーンを取り扱う際には日時がエポックタイムからの経過時刻（ミリ秒）でかつ、タイムゾーンがGMTで管理されていることは一般的かと思いますが、ここでは日時とタイムゾーンが何かの理由で別に保持されているような場合にを想定しています。
例えば、以下のような感じです

|項目|値|
|---|---|
|日時|2016-12-01 15:00:00|
|タイムゾーン|Australia/Sydney|

これをSystem.out.printlnなどで表示したときに以下のようにDate型の保持する値が、違和感を覚える場合です。言い換えると、本来は15:00はAustralia/Sydneyの時間であってほしいのになぜかローカルのタイムゾーンになってる。といった感じです。

>Thu Dec 01 15:00:00 JST 2016


>sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]

また、**ここで行われている変換を利用した場合、バグに直面しますので、反面教師的にこのロジックはたどり着かないようにしてください。**解決策が見つかりましたら改めて投稿します。シチュエーションの回避となった場合は定かではありません。

### 本題
とにかく、上記のような状態になった時にどうやって正しいデータとして保持しなおそうかという事を考えています。このようなシチュエーションを回避することが一番の解決策かもしれませんけど。

#### Java8 以前の場合

ちょっとトリッキーなコードです。文字列に変換するという苦肉の策ですね。

```Java:TimezoneConversion.java
    static Date convertWithBeforeJava7(Date dateTime, TimeZone timeZone) throws ParseException {
        String format = "yyyy/MM/dd HH:mm:ss.SSS";
        SimpleDateFormat local = new SimpleDateFormat(format);
        SimpleDateFormat convert = new SimpleDateFormat(format);
        convert.setTimeZone(timeZone);
        return convert.parse(local.format(dateTime));
    }
```

#### Java8

なれないですが、Java8のクラスでも試してみました。なんとなくスッキリしていますが、わざわざDate型に戻すのかという気分でもあります。


### テスト結果

テストは2種類やりました。入力は以下です。

#### 環境条件

|項目|値|
|---|---|
|ローカルタイムゾーン|Australia/Sydney|

#### 入力
|テスト番号|日時|タイムゾーン|
|---|---|---|
|1|2016-10-02 02:00|Australia/Sydney|
|2|2016-10-02 02:00|America/Montreal|


十分なテストではないので注意が必要ですが。以下のような結果になってます。

```
java.lang.AssertionError: It would be same date
Expected: is <Sun Oct 02 17:00:00 EST 2016>
     but: was <Sun Oct 02 18:00:00 EST 2016>

	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at org.junit.Assert.assertThat(Assert.java:956)
	at com.nekoscape.java.sample.TimezoneConversionTest.convertWithOtherTimezone_test_for_Java8Method(TimezoneConversionTest.java:76)
	（省略）

java.lang.AssertionError: It would be same date
Expected: is <Sun Oct 02 17:00:00 EST 2016>
     but: was <Sun Oct 02 18:00:00 EST 2016>

	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at org.junit.Assert.assertThat(Assert.java:956)
	at com.nekoscape.java.sample.TimezoneConversionTest.convertWithOtherTimezone_test_for_beforeJava7Method(TimezoneConversionTest.java:62)
	（省略）

Process finished with exit code -1

```

テストが2件失敗してます。どちらもローカルタイムゾーンではないAmerica/Montrealを指定した場合に発生しています。何が起きているのでしょうか？

結論から書きますと、現在のこのロジックではローカルのタイムゾーンがサマータイム(Daylight saving)になったときに問題が発生します。日時として指定した2016-10-02 02:00はAustralia/Sydneyのサマータイムの開始日時です。そのため、文字列からDate型として保持した時にはすでに2016-10-02 03:00という意味になります。
そのため、1時間の変換ミスが発生しています。

最初にも記載しましたが、バグです。解決できていません。
誤ってもコピーしないでください。試しに動かせるようにソースは以下に置きます。
ソースコード: [timezone-conversion](https://github.com/hiroyuki-kaneko/timezone-conversion)
【GAS】QUERY関数（1時限目）

　初めてQUERY関数を使う方向けの内容です。1時限目は範囲の選択がテーマです。

#説例
シート1をデータベースとし、シート2を抽出用シートとします。

![スクリーンショット 2016-12-18 10.22.39.png](https://qiita-image-store.s3.amazonaws.com/0/139134/fee80338-134a-26d0-5b93-5dfd35ef3a8b.png)

　まず、全件を抽出してみます。シート2へ移動し、A3に次の式を入れます。

```
=QUERY('シート1'!A2:E16)
```

すると下のように全件が出てきます。1行目を空けていますが、ここには抽出条件を入れる予定です。

![スクリーンショット 2016-12-18 10.34.58.png](https://qiita-image-store.s3.amazonaws.com/0/139134/756c3f96-18da-83b9-a7f8-7b261f570645.png)


　ただ、これだと範囲の指定がA2:E16となっていて、シート1の17行目以降にデータが追加された場合、その都度E16をE17と修正する必要があり、不便です。できれば自動的に取り込んでいきたいでしょう。

　そこで、データの追加を前提とする場合、終点のE16を単にEとします。

```
=QUERY('シート1'!A2:E)
```

　これにより、範囲の選択はA2からEの最終行（デフォルトは1000行）までとなり、データが追加されても自動的に範囲に取り込まれます。

　しかし、実はこの方法は無駄が多いのです。すなわち、この例でいうとA17からE1000までのデータは空っぽですが、この空っぽのデータまで引っ張ってこようとしてしまうのです。

　試してみると分かるのですが一瞬エラーが出たりして動作が微妙に重くなったのが分かると思います。さらに最終行が勝手に５００行追加されてしまっていることも合わせて確認してください。デフォルトは1000行ですが、500行増えてしまっていると思います（ちなみに海外では「500 rows issue」などと言われ、範囲の結合のときによく出てきます）。

![スクリーンショット 2016-12-18 10.41.38.png](https://qiita-image-store.s3.amazonaws.com/0/139134/2e33ba6d-49f8-0771-8046-e504f1f79f18.png)

　そこで、引っ張ってくるときに「空白は除く」という条件を付けてやるのがスマートです。すなわち、A列が空白ならば・・・とか、B列が空白ならば・・・といった条件を付けるわけですが、列の値が数値か文字列かで文法が変わってきます。

　A列のように数値の場合は

```
=QUERY('シート1'!A2:E,"where A is not null")
```

　B列のように文字列の場合は

```
=QUERY('シート1'!A2:E,"where B !=''")
```

　です。どちらでも結果は同じです。これにより、データが増えてもスムーズにその全件を抽出できるようになったと思います。

　ここから性別が男の場合を抽出してみたいと思いますが、続きは次回にしたいと思います。

　次回（マークダウンいまいち目立たないので直書きしときます）
　http://qiita.com/ShishidoToru/items/e89fecd16c3d4e080925#_reference-b970bc5056dc8185e8d2
まだ機械学習の論文を追うのに消耗してるの？それBotで解決したよ

まだ機械学習の論文を追うのに消耗してるの？
<br/>
はい、消耗しているんです(涙)
機械学習の分野って本当に進歩が早いですよね？
「最新の手法」が週間で変わるぐらいその変化は激しいものです。

そんな世界にキャッチアップしていくためには、一人の力だけでやっている場合ではない！ということで、私や私の先輩 [icoxfog417](http://qiita.com/icoxfog417) を含めて何人か共同で機械学習系論文の読み会を開催しています。

今回は、そこで読んだ論文の内容をつぶやいてくれる [Twitter Bot](https://twitter.com/arxivtimes) をつくってみました。**この Bot は読んだ論文についての一言まとめをつぶやいてくれます。**一言まとめにより論文の内容を日本語で素早く把握できるようになります。以下のような感じです。

<a href="https://twitter.com/arxivtimes"><img width="616" alt="スクリーンショット 2016-12-17 17.59.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/a8c638c8-16b0-ae92-3844-08ee92e24267.png"></a>


リサーチしている論文は、以下の GitHub リポジトリ( [arXivTimes](https://github.com/arXivTimes/arXivTimes) )で管理しています。こちらを更新するたびに Twitter でつぶやく仕組みになっています。ぜひこちらも **Watch & Star** をしていただけたらなと思います。参加も大歓迎です！
<a href="https://github.com/arXivTimes/arXivTimes"><img src="https://qiita-image-store.s3.amazonaws.com/0/77079/896f8e1c-d16b-63c1-c927-bd998e90ea88.png" width=300 /></a>
<br/>
この試みがいいなと思っていただけたら「いいね」していただけると励みになりますm(_ _)m