OmniAICreator/Qiita-1.07M huggingface dataset:
PandocでPDFファイルを作成

# 準備
[こっちの投稿の「準備」の項参照。](http://qiita.com/sukakako/private/a78478f94e934c47b993#%E6%BA%96%E5%82%99)
LuaLaTex のインストールまで行う。

# 記述

utf8で記述する。

```inputPDF.md
% タイトル
% 名前
% 日付

# 段落

あめんぼあかいなあいうえお  
隣の客はよく柿食う客だ  

### サブ1

- リスト
- リスト
- リスト

### サブ2

1. 番号付き項目
1. 番号付き項目
1. 番号付き項目

![キャプション](image.jpg)

```

改行は最後尾に半角スペースを2つでできる。
他は基本的な[マークダウン記法](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)で記述可能。

# 変換
日本語が含まれる場合、以下のどちらかの方法で変換する。

## -h を使う

```tex:h-luatexja.tex
\usepackage{luatexja}
\hypersetup{unicode=true}
```

``` pandoc inputPDF.md output.pdf -h h-luatexja.tex --latex-engine=lualatex ```

## -V mainfont を使う

``` pandoc inputPDF.mf output.pdf -V mainfont=meiryo --latex-engine=lualatex ```

# 実行
![pdf.png](https://qiita-image-store.s3.amazonaws.com/0/119600/8a4f585f-0278-ca09-ba72-2980bc17ce39.png)

# 参考
[markdownの原稿を、pandocを使って、Texのbeamerを利用して、プレゼンスライドPDFに変換](http://qiita.com/danpansa/items/7ea8db3942a7946dd56a)
[PandocでMarkdownからHTML・PDF・EPUBに変換する](http://daipresents.com/2013/pandoc-markdown-pdf/)
kintone 2016/08/14 kintone API更新情報メモ

#2016/08/14の定期メンテナンスでAPIの機能拡張
いくつか気になる機能拡張があるようなので、メモしておきます。

[2016/08/14 の定期メンテナンスにおけるkintone API、User API更新情報](https://cybozudev.zendesk.com/hc/ja/articles/208735536)

#レコード追加/編集画面の保存成功後イベント

これまで保存成功後に処理するのに苦労していたので、このイベントが追加されると処理が簡単になります。

保存実行前イベントで、他アプリの更新処理を組み込むと保存エラー時に不整合になってしまいます。
事前にエラーになりそうなチェックを行っても、リビジョンチェックエラーはあり得ます。
セッションストレージを使ってイベント間で情報を渡し、保存成功時に他アプリの更新を行うなどしていました。

保存成功後イベントだと、そのまま他アプリの更新処理を書けます。


#印刷画面の表示イベント

印刷画面で、CSS を使って書式設定が出来るとある程度使える帳票ができるかも。

#JavaScriptファイルの読み込みサイズの拡張

512KB以下から5MB以下に大幅に拡張されると、excel互換ライブラリなどの大きなサイズのものが使えますので使いやすくなります。
プラグインのJavaScriptファイルのサイズも拡張されるといいですが、プラグインの記述は無いですね。
ロジックが重めのIoT開発でShinyが無敵な理由

※2016-11-08修正 サンプルをよりそれっぽいスクリーンショットに差し替えました
※2017-02-22追記 事例ができたのでアドレス添付しました

世の中でIoTと呼ばれるものには様々なモノがありますが、今回は「ロジックが重め」のケースの開発パターンでの事例を紹介したいと思います。結論だけ知りたい方は**「Shinyだと爆速開発可能」**とだけご記憶ください。

##IoTの分類
ハードウェア・ネットワークが律速するものでロジックが軽い(例えば「温度センサーの値でエアコンに指示を送る」のように端末データを間欠的に送るだけの)場合はほぼ機器間を繋げるところに工数のほとんどを割くことになると思いますが、生体センサーのようにデータを切り出しただけではそれ自身意味が無いものをソリューションとして仕上げていくような「ロジックが重め」の開発では研究レベルからリリースに至るまでアルゴリズムを仕上げていく戦いを続けることになります。

##「ロジックが重め」の開発内容を可視化してみよう
こんな感じになります
<img width="799" alt="スクリーンショット 2016-07-13 09.08.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/103775/b6c17aa5-7569-2549-9c0e-9b930c116985.png">

意味付けを含むようなロジック部分が重い開発の場合、アルゴリズムのトライアンドエラー&チューニングの回数・密度が重要になります。
- Excelだとパラメターを振り始めた途端につらいので早めにデータ分析言語に移行したほうが良いです。
- データ分析言語に移行した後は「ほかの人に使ってもらう」という壁が現れます。全員同じ言語が使える場合はよいのですが、使えない場合はなんかしら簡単にデータを確認できるツールが必要です
- 次の壁は他の人に使ってもらおうとした時のアプリの移植です。データ分析言語でしっかりベクトル化して演算できている場合は逆に移植の時に手間取ります。一方で移植してしまうとフィールド実験で気づいたアルゴリズム変更を適用しようとしても、データ分析言語ほど簡単に計算式を変えられないため、開発サイクルが遅くなるという課題も発生します。

なので、できる限り後段のフェーズまでデータ分析言語で引っ張る、というのが完成度向上のために重要になります。これらを解決するにはデータの閲覧とチューニング作業自体をWeb化してしまうのが手っ取り早く、自分の関わっている開発ではShinyを全面で適用しています。Shinyは慣れると**ちゃんとした仕様書を書く時間のx1.1～x1.5倍ぐらいの時間でアプリの作成・デプロイまでできてしまう**ので圧倒的な開発の高速化が可能です。

##Shiny(shinydashboard)でどのフェーズまで使えるのか？
[Shiny](http://shiny.rstudio.com/)
[shinydashboard](https://rstudio.github.io/shinydashboard/)
ユーザー数が限定的な場合は、本番で使うという可能性もあると思います。下記にいくつかのshinydashboardを利用したサンプルアプリのスクリーンショットを貼り付けておきます。開発・分析段階で使っていたコードをそのまま使用できるので、言語の移植などの作業が不要で大幅な工数削減が実現できました。デフォルトでレスポンシブなHTMLが生成されますので、PCだけでなくスマホでもスムースにフィールド実験ができるようになります。Shinyは同時利用に弱いのでそこはある程度妥協とチューニングが必要なのですが、スピード優先の場合Shinyはおススメです！

####[JINS MEME RUNのトレーニングヒストリー](https://jinsmeme.shinyapps.io/training_console_sample)
これが一番凝っていると思います。
・shinydashboardを使用したUI
・Sidebarでの認証コントロール(httrでREST連携しています)
・Valuboxによるダッシュボード表示
・leafletによる地図インテグレーション
・データ読み込み中を示す進捗バー
・modalDialogを使用したエラー時のダイアログ表示
・reqによるエラーハンドリング
・フローティングのスライドバー
・shinyapps.ioの使用

PC画面
![スクリーンショット 2017-02-22 22.52.22.png](https://qiita-image-store.s3.amazonaws.com/0/103775/8fc074d4-ac33-3cf2-c5aa-6f4a91c155a8.png)

スマホ画面
<img width="414" alt="File_000.png" src="https://qiita-image-store.s3.amazonaws.com/0/103775/4b512a15-0b49-12f2-b24a-2c5a7ac9beb2.png">


####[JINS MEMEの分析支援サービス(次バージョン開発中)](https://jins-meme.com/ja/academic/service/)
・ファイルアップロード
・ファイルダウンロード
<img width="645" alt="1b49f2dd-052c-9228-5c2e-752186374d2a.png" src="https://qiita-image-store.s3.amazonaws.com/0/103775/14f8bbd8-3ccf-9f5a-df8a-36860b5ab664.png">
SymfonyでXMLHttpRequestなAPIをテストする方法


## はじめに
Symfony2でテストを書いたことを前提に話を進めます。

## XMLHttpRequestなリクエストって
ブラウザからAjaxで呼ばれるAPIを作ったときに、Controllerのテスト書くと思います。
その際、`$request->isXmlHttpRequest()`かどうかチェックしているとすると、テスト的にも、それを区別する必要があります。

XMLHttpRequestかどうかは、リクエストヘッダの`X-Requested-With`が`XMLHttpRequest`かどうかによって判断しているようです。


```Symfony/Component/HttpFoundation/Request.php
public function isXmlHttpRequest()
{
    return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
}
```

## request関数の引数に$headersが見当たらない？
下記のようなテストコードだったとして、`$client->request`でリクエストヘッダが指定できれば、解決しそうです。


```php
<?php
namespace App\Test\Controller;

use Symfony\Component\HttpKernel\Client;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
// Silexの場合は、use Silex\WebTestCase;

class ApiControllerTest extends WebTestCase
{
    /**
     * @test
     */
    public function apiAction()
    {
        $client = self::createClient();
        /** @var Client $client */
        
        $client->request('GET', '/path/to/api');

        $this->assertTrue($client->getResponse()->isOk());
        $this->assertJson($client->getResponse()->getContent());
    }

```

が、しかし、HTTPクライアントのrequest関数の引数に$headersが見当たらないのです。

```Symfony/Component/BrowserKit/Client.php
/**
 * Calls a URI.
 *
 * @param string $method        The request method
 * @param string $uri           The URI to fetch
 * @param array  $parameters    The Request parameters
 * @param array  $files         The files
 * @param array  $server        The server parameters (HTTP headers are referenced with a HTTP_ prefix as PHP does)
 * @param string $content       The raw body data
 * @param bool   $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload())
 *
 * @return Crawler
 *
 * @api
 */
public function request($method, $uri, array $parameters = array(), array $files = array(), array $server = array(), $content = null, $changeHistory = true)
```

ググると、下記のissueが見つかり、ますます不安になります。
[[BrowserKit]Cannot set Custom Header · Issue #5074 · symfony/symfony](https://github.com/symfony/symfony/issues/5074)


## 結論、サーバー変数'HTTP_X_REQUESTED_WITH'に'XMLHttpRequest'をセットする
ここで慌てずに、request関数のコメントをよく見ると、

```
@param array  $server        The server parameters (HTTP headers are referenced with a HTTP_ prefix as PHP does)
```
とありますので、試しにサーバー変数'HTTP_X_REQUESTED_WITH'に'XMLHttpRequest'を指定すると、期待どおり動作します。

```php
        $client->request('GET', $apiUrl, [], [],
            ['HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest']);

        $this->assertTrue($client->getResponse()->isOk());
        $this->assertJson($client->getResponse()->getContent());
    }
```

## おわりに
毎回、サーバー変数セットするのもあれなんで、Clientクラスを拡張して、ajaxRequest関数を作ってもいいかもしれません。
参考になりましたら、幸いです。
GCチェックのためのコマンド


# JavaアプリケーションのPIDを表示する。
 ```jps ```

# vmstatのような感じでJVMの状況を表示する。
```bash
jstat -gcutil（-h[ヘッダーを出力する行間隔]） [プロセス番号] [出力間隔（ミリ秒）]
```
(例)jstat -gcutil -h10 (jpsで調べたPID) 2000

| ヘッダ名 | 内容 |
|:---:|:---|
| S0   | Survivor領域0（From）の使用率（現在の容量に対するパーセンテージ）|
| S1   | Survivor領域1（To）の使用率（現在の容量に対するパーセンテージ）|
| E    | Eden領域の使用率（現在の容量に対するパーセンテージ）|
| O    | Old領域の使用率（現在の容量に対するパーセンテージ）|
| P    | Permanent領域の使用率（現在の容量に対するパーセンテージ）|
| YGC  | New領域のカベージ・コレクションの回数 |
| YGCT | New領域のガベージ・コレクション時間（ミリ秒）|
| FGC  | 完全カベージ・コレクションの回数|
| FGCT | 完全ガベージ・コレクション時間|
| GCT  | ガベージ・コレクション総時間（ミリ秒）|
VBAでCollectionとdictionaryを使う

#特徴
##Collection
・Collectionでは、さまざまな型のデータを一つのコレクションとしてまとめておくことができる。コレクションの中にコレクションを入れることもできる。これを用いれば、一つのデータ群を作りループ処理することができる。

##Dictionary
・Dictionaryでは、キーとデータを関連付けることにより、データにアクセスしやすくなり、また修正が簡単になる。(Collectionの方にもあるが、Dictionaryの方が便利な機能があるのと、処理速度がDictionaryの方が若干早いのでこちらを使う)

・また先ほど述べたとおり、Dictionaryにはキーの変更を行ったり、またキーが重複していないか確かめるメソッドがありチェックが簡単なのでよく使っているメソッドを以下にまとめておく。

| メソッド名        |         説明         |
|:----------------:|:------------------:|
| Add(key,item)    |未設定のキー(key)にデータ(item)を関連付ける|
| Exists(key)      |指定されたキー(key)が存在するかどうかで論理値を返す。|

|プロパティ名|説明|
|:----------------:|:--------------------:|
|Item(key)|キー(key)に関連付けられているデータを取り出す。|

これらを組み合わせることにより、ある一つのデータ群をCollectionで変数DATAでまとめ、これとあらかじめ決めておいたkeyを使うことによって、そのデータが重複していないかまとめることもでき、データの変更を行う際も、キーの変更を行うだけで済むので管理が楽になる！！！

サンプル

```vb

Dim Data As Collection
Set Data = New Collection
Dim k As Long
k = 0
Dim i As Long
For i = 0 To Cells(Rows.Count,1).End(xlUP).Row 
    Data.Add Cells(i,k).Value
Next i
Dim Param As String
Param = "hogehoge"

' CollectionをDictionaryでまとめる
Dim obj As Object
Set obj = CreateObject("scripting.dictionary")
obj.Add Param , Data 'これでParamをキーにしてDataを呼び出せるようになった。
```

あとはこれを複数回してParamを各データのキーに設定してその後

```vb

Dim dic As Object
Set dic = CreateObject("scripting.dictionary")
if dic.Exists(Param) = False then
End If

'データ群をセット
Dim val As String
For Each val In dic.Item(Param)' これでデータコレクションを取得した。
Next val
```

分かりずらい点は多々あると思いますが、ひとまず終了。
また修正加えると思います。
VagrantでCentOS6.7環境構築 (1)

#VagrantでCentOS6.7環境構築
はじめまして、まだまだ出だしの新人です。
あまり説明などがうまくないですけれどもよろしくお願いします。
今回は今後仕事などでも使うことがあるかもしれないので
投稿します！
皆さんもいつか使うかもしれないです。

##Vagrantでcentos環境構築していくのに必須なもの
Vagrant
Oracle VM VirtualBox
centOS(今回は6.7)
早速やっていきましょう

####使うもの
Windows   コマンドプロンプト
Mac 　　   terminal
エディタ   sublime text3  

##Oracle VM VirtualBoxをインストールしよう
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp
上記URLから自分のPCにあったのをダウンロードしてインストールしよう。

##Vagrantのインストールしよう
https://www.vagrantup.com/downloads.html
上記URLから自分のPCにあったのをダウンロードしてインストールしよう。

##フォルダを作成しよう
後に出てくるのですがホストOSとゲストOSでファイル共有するためのフォルダを作成しておきましょう
他にもいろいろあるとは思うのですが私からしたらこれだろとか思ってます。

今回作成する場所は(Windows)ドキュメント,(Mac)書類ですね。

手動で作してもOKです！
手動でも最終的にはコマンドを使うのでコマンドがおすすめです。
コマンドで作成する人は下記手順で作成

windowsの場合はコマンドプロンプト,Macの場合はterminalを起動しましょう

```ruby:コマンドプロンプトまたはterminal
#コマンドでドキュメントに移動
cd Documents
#フォルダ作成
mkdir centos67
#作成確認
dir
```

ここからは同じになります。

```ruby:コマンドプロンプトまたはterminal
#先ほど作成したフォルダに移動
cd centos67

#手動で作成した人は
cd Documents/centos67
#で移動
```

で初期設定は完了です。
ではインストールしていきましょう。

##VagrantでCentOSをインストールしていきましょう

下記コマンドが作成方法です。

```ruby:コマンドプロンプトまたはterminal
Vagrant box add NAME URL
```

今回私が作成するのはCentOS67なので


```ruby:コマンドプロンプトまたはterminal
vagrant box add centos67 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box

#作成されているか確認

vagrant box list

#作成ができていれば表示されます。
```

という感じになります。

centosでほかのバージョンがいいなんて人は下記URLから自分がやりたいバージョンのURLをコピーしましょう。
http://www.vagrantbox.es/
コピーができたらNAMEとURLも変えてあげましょう！

##vagrant 初期化(Vagrantfileの作成)をしよう

```ruby:コマンドプロンプトまたはterminal
vagrant init NAME

で作成できるので今回だと

vagrant init centos67
```

これで作成完了です！
念のために確認しましょう。

コマンドで編集するのもいいのですが、今回はSublime text3で編集していきます!!

初めにドキュメント内のcentos67のフォルダを開くとVagrantfileがあるのでそれをSublimeで開きます。

それでは編集していきます。

```ruby:Vagrantfile
20行目 #config.vm.box_check_update = false
29行目 #config.vm.network "private_network", ip: "192.168.33.10"
40行目 #config.vm.synced_folder "../data", "/vagrant_data"
46行目から
  # config.vm.provider "virtualbox" do |vb|
  #vb.memory = "1024"
  #end
```
上記に記載している場所の#をすべて消しましょう
40行目は少し編集します。

```
config.vm.synced_folder ".", "/var/www/html"
```
フォルダ共有する場所を指定してあげます。
初めのところは自分の場所、後半がcentosのディレクトリになります。
ここはcentosの作り方によって変更します。
今回はこのままでよろしいです。

Vagrantfileを保存してコマンドプロンプトに戻ります。

```ruby:コマンドプロンプトまたはterminal
vagrant up
```
で起動します。
ここでエラーが出なければOKです!

##vagrant コマンド一覧

| vagrantコマンド |                説明              |
|:--------------:|:------------:|
| vagrant init   | vagrant 初期化Vagrantfileの作成) |
| vagrant up     |           vagrant 起動           |
| vagrant ssh    |          vagrant ログイン        |
| vagrant halt   |           vagrant 終了           |
| vagrant reload |         vagrant リロード          |

以上でvagrantでcentos環境構築になります。
次回centosの環境を整えていきます。
環境構築第2回
[VagrantでCentOS6.7環境構築 (2)](http://qiita.com/NAZA/items/9fdc1774e4dda0acb617)
Pandocでreveal.jsを使ったスライドを作成

# 準備
## Pandoc
さまざまなマークアップ言語を別の形式に変換できるツール。

## Pandocのインストール
[公式サイト](http://pandoc.org/installing.html)からインストーラーをダウンロード。
Windowsの場合、先頭にリンクがある。
pdfの場合はこっちもダウンロードする、と書いてあるのはひとまずおいておく。

### LuaLaTex
PDFで出力したい場合必要になる。
Tex Live 2014/2015のisoを[このあたり](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%20Live)からダウンロードしてインストール。

## reveal.js
[github](https://github.com/hakimel/reveal.js/)から最新版をダウンロード。
pandocが 1.13.2 の場合は参照が失敗するので以下のように修正。

- reveal.js/js/**reveal.js** を **reveal.min.js** にリネーム。
- reveal.js/css/**reveal.css** を **reveal.min.css** にリネーム。

# 作成
## 環境
**Pandoc 1.13.2**
**reveal.js 3.0.0**

## 実装

utf8で記述する。

```input.md
% タイトル
% 名前
% 日付

# 大項目

----

### サブページ1

- リスト
- リスト
- リスト

----

### サブページ2

1. 番号付き項目
1. 番号付き項目
1. 番号付き項目

# ページ2

----

あめんぼあかいなあいうえお <br>
となりの客はよく柿食う客だ <br>
赤パジャマ黄パジャマ茶パジャマ <br>
あめんぼあかいなあいうえお <br>
となりの客はよく柿食う客だ <br>
赤パジャマ黄パジャマ茶パジャマ <br>
あめんぼあかいなあいうえお <br>
となりの客はよく柿食う客だ <br>
赤パジャマ黄パジャマ茶パジャマ <br>

----

![キャプション](img/image.jpg)

```

### スライド区切り
```input.md

# 大項目

----

```

**\-\-\-\-** でスライド区切り。
**\#** や **\#\#\#** でもスライドを区切れるが、明示的に\-\-\-\-で指定したほうが目的のレイアウトになりやすい。

### リスト

```input.md

- リスト
- リスト
- リスト

1. 番号付き項目
1. 番号付き項目
1. 番号付き項目

```

**\-**　でリスト、 **1.** で番号付きリスト。
全て 1. と記述しても、出力すると 1.2.3 のように表示される。

### ベタ書き

```input.md

----

あめんぼあかいなあいうえお <br>
となりの客はよく柿食う客だ <br>
赤パジャマ黄パジャマ茶パジャマ <br>
あめんぼあかいなあいうえお <br>
となりの客はよく柿食う客だ <br>
赤パジャマ黄パジャマ茶パジャマ <br>
あめんぼあかいなあいうえお <br>
となりの客はよく柿食う客だ <br>
赤パジャマ黄パジャマ茶パジャマ <br>

```

**\<br\>**を抜くと改行せずに文字が並ぶので明示的に改行を指定。
行末に半角スペースを2つ入れることでも改行できる。
\# や \#\#\# の段落指定がなくても \-\-\-\- でスライドを区切れば1スライドとして表示される。
\#\# ではなく \#\#\# としているのは文字の大きさの調整のため。

### 画像

```input.md

![キャプション](img/image.jpg)

```

画像の表示。相対パスで指定。

## 変換
```
pandoc -s -t revealjs -o slide.html input.md --slide-level=2
```

**-s**
スタンドアローンのオプション。
**-t**
変換対称。今回はプレゼンテーションにしたいので"revealjs"。
**-o**
出力。今回は slide.html。
**--slide-level=2** 
2次元のスライドの指定。

# 実行

## 配置

```
├─ input.md
├─ slide.html
│
├─img
│  └─ image.jpg
│
└─reveal.js
```

## slide.html
![slide.png](https://qiita-image-store.s3.amazonaws.com/0/119600/d421924a-7a99-550b-ffce-31f01f3079b5.png "スライド")

# 参考
[Pandocでreveal.jsを利用したプレゼンテーションスライドを作成する](http://safx-dev.blogspot.jp/2013/10/pandocrevealjs.html)
[markdownの原稿を、pandocを使って、Texのbeamerを利用して、プレゼンスライドPDFに変換](http://qiita.com/danpansa/items/7ea8db3942a7946dd56a)
bitbucketの新リポジトリにpushできない

bitbucketで新リモートリポジトリを作った時、ローカルにリポジトリがある場合は
git@bitbucket.org:~ をaddしてください見たいなのが表示されるが
その通りにやってもpushが全くいかない

しかし、https://[user]@bitbucket.org/[user]/[repo].git

のようにすれば上手くいく
ご参考まで
vim弄りたくなった


[大丈夫か？ってなるVimmerの行動](http://qiita.com/ka_/items/ba2a037ffeea9226fa1f)

この記事を見て「vimmerじゃないけどかっこよくvim使ってみたいですやん？」ってなった。

# vimrcを弄る

`~/.vimrc`こんなん。

```vim:.vimrc
"#### 表示設定 ####
set encoding=utf-8 "文字コード設定
set fileencodings=utf-8
set fileformats=unix,dos,mac
set number "行番号の表示
set title "編集中のファイル名を表示
set showmatch "カッコ入力時、対応するカッコを表示
syntax on "コードの色分け
set tabstop=2 "インデントをスペース2つ分に設定
set autoindent "オートインデント(改行時に前の行のインデントを継続する)
set smartindent "オートインデント(末尾に合わせて次の行のインデント増減する)
set expandtab "タブ入力を複数の空白入力に置き換え
```

vim上で設定を反映をするときは`:source ~/.vimrc`。

個人的には行番号の表示はなくてもいいような気がしなくもない。(必要なときだけ出すスタイルでもいいかなって)
あとは頑張ってビジュアルモードとかコマンドとか覚える…。

そういえば学生時代はemacsを6年ぐらい使っていたのに、社会人1～3年目でずーっとEclipse使ってたらemacsの使い方忘れたよね。
今じゃどうやって起動したのかすら覚えてないよ……。
なので、vimは忘れないようにちょいちょい使っていこう……。
Apacheから該当の日時のログだけサクッと抽出するコマンド

初心者向け。
例えば、2016年6月13日21時26分のログだけ出力

```
sudo cat /var/log/httpd/access_log | grep -E '13\/Jul\/2016:21:26' > /home/username/access_log_`hostname`
```

過去すぎる時間のログは多分ローテートされてファイル名変わってるので取れないかもしれません。
あと日付の書式を設定変更していたら、それに合わせないと抽出できませんね。
JavaでZIPファイルを扱う

JavaでZIPファイルを読み込む。サンプルではファイル名一覧とbyte[]でデータを読み込んだ上でサイズを表示している。

以前の方法はZipInputStreamを使う。

```java
public class ZipDemo {
    public static final String PATH = "/path/to/zipfile.zip";

    public static void main(final String[] args) throws IOException {
        final Path zipfile = Paths.get(PATH);
        try (ZipInputStream zis = new ZipInputStream(
                new ByteArrayInputStream(Files.readAllBytes(zipfile)));) {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                if (entry.isDirectory()) {
                    continue;
                }
                System.out.printf("%s - %d\n", entry.getName(),
                        IOUtils.toByteArray(zis).length);

            }
        }
    }
}
```

NIO2のFilesystemsを使うとコールバックを使ってわかりやすく書ける。

```java
public class ZipDemo {
    public static final String PATH = "/path/to/zipfile.zip";

    public static void main(final String[] args) throws IOException {
        final Path zipfile = Paths.get(PATH);

        try (FileSystem fs = FileSystems.newFileSystem(zipfile, null)) {
            final Path path = fs.getPath("/");
            Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(final Path file,
                                                 final BasicFileAttributes attrs) throws IOException {
                    System.out.printf("%s - %d\n", file,
                            Files.readAllBytes(file).length);
                    return FileVisitResult.CONTINUE;
                }
            });
        }
    }
}
```
Ruby | pry で gem を使う基本

# 欲しい gem をインストールする

```
gem install time_diff
```

# pry を立ち上げてgem を require する

```bash
$ pry
```

```rb
[1] pry(main)> require 'time_diff'
=> true
```

# 用法用量に応じて gem の効果を確かめる

```rb
[4] pry(main)> Time.diff(DateTime.now.next_day, DateTime.now)[:diff]
=> "1 day and 00:00:00"
```

この例の場合は、Ruby標準には無い `Time.diff` メソッドが使えるようになっていることが分かる。

# 環境

- ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
- pry (0.10.3)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
sqlalchemyを使ったDBのテーブル挿入処理

###ex1)複数レコードを任意のテーブルにInsert処理する（その１）

　最初の頃は不本意ながら、愚直？にmyobjectに各列の値をセットしてsession.add(myobject)する処理をforループで繰り返す方法でテーブルに１行ずつレコード挿入しておりましたorz

```py3:sql_insert_old.py

Base = sqlalchemy.ext.declarative.declarative_base()

class Hogega_tmp(Base):
    __tablename__ = 'hogega_tmps'
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    y = sqlalchemy.Column(sqlalchemy.String(10))
    m = sqlalchemy.Column(sqlalchemy.String(10))
    d = sqlalchemy.Column(sqlalchemy.String(10))
    dim4 = sqlalchemy.Column(sqlalchemy.String(100))
    pv = sqlalchemy.Column(sqlalchemy.String(50))
    rsf = sqlalchemy.Column(sqlalchemy.String(10))
    fld = sqlalchemy.Column(sqlalchemy.String(10))

def orm(data,fld):
    
    # SQLAlchemyの初期化
    CONNECT_INFO = 'mssql+pyodbc://hogehoge'
    engine = sqlalchemy.create_engine(CONNECT_INFO, encoding='utf-8')

    # セッション作成
    Session = sqlalchemy.orm.sessionmaker(bind=engine)
    session = Session()

    #無作為抽出機能有無
    if data["containsSampledData"]:
       rsf=1
    else:
       rsf=0
    cnt=data["totalResults"]
    print(ref)

    #ループ処理で1件ずつテーブルにレコード挿入
    if cnt!=0: 
       for i,n in enumerate(data["rows"]): 
           print(i)
           if fld.find("source")!= -1: 
               myobject = Hogega_tmp(y=n[0],m=n[1],d=n[2],dim4=n[3],pv=n[4]
                                     rsf=rsf,fld=fld)
       
           session.add(myobject) #行挿入
           if fld.find("source")!= -1 and i>=24: #挿入件数を限定
                  break
       session.commit() #コミット
    session.close() #セッション閉じる

```
注）上記では例えばGoogle AnalyticsのAPIを実行した結果を、SQL Serverに格納するシーンを想定

###ex2)複数レコードを任意のテーブルにInsert処理する（その２）

　1件ずつ行挿入を繰り返すのはやはりイケてないというか、SQLでも複数データを1回のInsert文でまとめて行挿入できるので、それがSqlalchemyで実現できないものか模索したのが以下のスクリプト。

```py3:sql_insert_new.py

def orm2(data,fld):
    
    # SQLAlchemyの初期化
    CONNECT_INFO = 'mssql+pyodbc://hogehoge'
    engine = sqlalchemy.create_engine(CONNECT_INFO, encoding='utf-8')

    # セッション作成
    Session = sqlalchemy.orm.sessionmaker(bind=engine)
    session = Session()

    #無作為抽出機能有無
    if data["containsSampledData"]:
       rsf=1
    else:
       rsf=0


    clm =["y","m","d","dim4","pv","rsf","fld"]
    ex=[rsf,fld]
    cnt=data["totalResults"]

    if cnt!=0: 
       rws = data["rows"]   
       if fld.find("source")!= -1: 
          rws = rws[:25] #挿入件数を限定

       #行挿入
       lst = [dict(zip(clm,r+ex)) for r in rws ] #value句生成
       ins_statement = Hogega_tmp.__table__.insert().values(lst)
       session.execute(ins_statement)   
       session.commit()
       session.close()

```

### 補足
　Insert文を引数（lst）の部分に、以下のような「複数の辞書を内包しているリスト」を記述すれば、forループで１件ずつ挿入処理を繰り返ししなくても、複数データを一括でテーブル行挿入ができる模様。（つまりSQLの「Insert Into ... Values ...」のValues句の部分に相当）

```py3:sql_insert_apdx1.py
[{y:2016,m:5,d:1,dim4:yahoo,pv:100},
 {y:2016,m:5,d:1,dim4:google,pv:200},
    ...
 {y:2016,m:5,d:1,dim4:smartnews,pv:300}]
```

　なお上記の`sql_insert_new.py`ではリスト内包表記のlstは、処理の意味をかみ砕くと以下のようなイメージになる。

```py3:sql_insert_apdx2.py
lst = list()
for r in rws:
    vle = r+ex
    y = dict(zip(clm,vle)
    lst.append(y)
```
（vleがテーブルに格納する値、clmがテーブル列名に相当し、それら２つのシーケンシャルをZIP()でリスト化して辞書型yにしたものを、リストlstに順次追記する処理をforループで繰り返す的な意味合い）
Pokemon Goのリリースに悶々とするのが嫌だからリリースを検知してツイートするスクリプトをつくった話

# 結果...
自分のスクリプトの通知が来る前にリリースをTwitterで検知してしまい、普通に手動でツイートするはめになりました。
僕の方法と、もうひとつhaminikuさんの方法の両方のスクリプトを動かしてみたのですが、どちらもリリースを検知するには至りませんでした。残念......

（なお完全に検知できないわけではなく、検索上位にあがってくるようになった現在ではしっかりGotchaしてくれます）

# きっかけ
Twitterで見ているとそろそろ日本でリリースなのかどうなのかみたいな感じで、いろんな情報が錯綜してその度AppStoreで検索して無くてみたいなことを延々と繰り返さなければならず、悶々としてしまうのでスクリプトで通知できないかと思ったのがキッカケです。

追記：
[こちらの記事](http://qiita.com/konojunya/items/59a68d35e44db8b87186#tweet%E3%81%99%E3%82%8B)を参考にリリースされたら僕のTwitterアカウント（@touyoubuntu）でリンクをつぶやくようにしています。ぜひ！（現在はpyenvの闇に飲まれています汗）→完成しました！

アプリケーションが有効になるまでしばらく時間がかかるためテストツイートを確認するのが大変でしたが、どうやら大丈夫なようです。具体的には以下のような関数を下のGotchaのところで呼び出しています。

```py:tweet.py
def tweet():
    twitter = OAuth1Session(CONSUMER_KEY, client_secret=CONSUMER_SECRET, resource_owner_key=ACCESS_TOKEN, resource_owner_secret=ACCESS_TOKEN_SECRET)
    params = {"status": "日本でついにPokemon Goがリリースされたっぽい! http://itunes.apple.com/jp/app/pokemon-go/id1094591345?mt=8"}
    req = twitter.post("https://api.twitter.com/1.1/statuses/update.json", params=params)
    print req.status_code
```

# 仕組み
基本的にiTunesSearchAPIを利用します。開発元はNiantic, Inc.とわかっているのでIngressのsellerNameをコピーして活用しました。

（よく規約を読んでいないのでビクビクしつつ）30秒に一回、pokemon goでサーチしその中にNiantic, Inc.の製品がないかを探しています。

```py:pokemon_go_alert.py
import urllib
import urllib2
import json
import time

url = 'https://itunes.apple.com/search?term=pokemon+go&country=jp&media=software&entity=software&lang=ja_jp'

def func():
    while True:
        try:
            r = urllib2.urlopen(url)
            root = json.loads(r.read())
            for data in root['results']:
                if u'Niantic, Inc.' in data[u'sellerName']:
                    print "Gotcha!"
                    tweet()
                    return
            print "has not been released yet in Japan"
        finally:
            r.close()
        time.sleep(30.0)

func()
```

`main`メソッドにしなかったのはノリです。こうすることによって30秒ごとにhas not been released yetかGotcha!を表示しあった場合はスクリプトを終了します。

このGotchaの部分をTwitterでつぶやくようになどと変えたりしてもうちょっと間隔短くすればPokemon Goリリース最速検知も夢ではないですね。

# まとめ
ひさしぶりにPythonを書いてみました。iTunesAPIで調べるとあるとされているsellerUrlがなかったのが精度を上げる点で惜しかったなと思います笑

なにか問題とかさらなる改善案があれば気軽にコメントください。

Pokemon Goまだかなぁ...

## 参考

- [iTunes APIの使い方まとめ](https://syncer.jp/itunes-api-matome)
- [pythonのurllib2でjsonを取得して解析する](http://www.bunkei-programmer.net/entry/2014/05/29/010707)
- [pythonでdelay的な待ち時間を作る](http://plaza.rakuten.co.jp/redbeeshrimp/diary/201112120000/)
- [Pythonの「文字列に○○が含まれているか」の判定について気になったこと](http://d.hatena.ne.jp/laco0416/20121022/1350907756)
- [Pokemon Go - Niantic](http://pokemongo.nianticlabs.com/ja/)

# 追記

電話をかけてくれる処理を埋め込んでおなじことをしている人がいました笑
[【スタダ】ポケモンGOがリリースされたら電話掛かってくるスクリプト](http://qiita.com/haminiku/items/991d4ac380ca3ef29dd1)

RubyでSlackに通知するようにした人
[Pokemon Go を iTunes で検索するのつらすぎるので crontab 仕込んだ](http://qiita.com/mojibakeo/items/1287998f510e7ef7104c)

みんな同じような時間に記事つくってるのめっちゃ面白いですね笑
ふと思い立って高校の時の研究のコードと論文をgithubにアップした

ボランティアコンピューティングというのをやってました。宇宙人探しのSETI@homeみたいなの。ま、それだけじゃないですが。
論文を読むと、当時からクラウド的なものや、ソフトウェアのサービス化を予見していて我ながらやるなとおもいました。

https://github.com/ryogrid/collatz-s-anti-example-home
ボタンをタップした時に○○する、を Java と Swift と Xamarin で比較する


たぶん一番書くやつを 

* Android-Java
* Android-Xamarin
* iOS-Swift
* iOS-Xamarin 

で比較。

----
## Android-Java

```java:MainActivity.java
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        label1.setText("pushed!!");        
    }
});
```
----
## Xamarin.Android(C#)

```csharp:MainActivity.cs
buttonOk.Click += (_, e)
    => label1.Text = "pushed!!";
```
----
## iOS-Swift

```swift:ViewController.swift
buttonOK.addTarget(self, action: 
    #selector(ViewController.onTouch(_:)), 
    forControlEvents: .TouchUpInside)
・・・
func onTouch(sender: AnyObject) {
    label1.text = "pushed!!"
}
```
----
## Xamarin.iOS(C#)

```csharp:ViewColtroller.cs
buttonOk.TouchUpInside += (_, e) 
    => label1.Text = "pushed!!";
```
----
## Xamarin はいいぞ！
Access VBA ヒント集

▼入力時にチェックする

```input_check.vba

Private Function fsInputCheck() As Boolean
  Dim wCtr     As String
  Dim wメモ    As String
  Dim wNo      As Integer
  Dim wMSG     As String
  
  fsInputCheck = False
  sIDCard = Nz(Me.IDコード.Value, 0)
  sメモ = Nz(Me.txtメモ.Value, "")
  sCHK(0) = Nz(Me.chk000.Value, 0)
  
  For wNo = 1 To 100
    wCtr = "ctrFL" & Format(wNo, "000")
    If Me.Controls(wCtr).Visible = True Then
      Select Case wNo
        'Case 15: sFLD(wNO) = Nz(Me.Controls(wCtr).Value, "0")
        Case Else: sFLD(wNo) = Nz(Me.Controls(wCtr).Value, "")
      End Select
    End If
  Next wNo
  
  '--- Check ---
  'If IsDate(s返送日) = False Then
  '  wMSG = wMSG & "返送日が不正です。" & vbCrLf
  'End If
  
  If wMSG <> "" Then
    MsgBox wMSG, vbOKOnly + vbExclamation, "確認"
    Exit Function
  End If
  
  '--- 新規 ---
  If gmEdit2 = 3 Then
    If fsCodeCheck(2) = False Then Exit Function
  End If
  
  fsInputCheck = True
End Function

```

▼終了時に他のフォームを閉じる

```Form_Unload.vba

Private Sub Form_Unload(Cancel As Integer)
  If gmEdit2 > 1 Then
    subMsg = MsgBox("編集中は、終了できません。強制終了しますか。", vbYesNo + vbCritical + vbDefaultButton2, "確認")
    If subMsg = vbYes Then
      gmEdit2 = 1
    Else
      Cancel = 1
      Exit Sub
    End If
  End If
  
  '一覧
  If SysCmd(acSysCmdGetObjectState, acForm, "F_BmCard02List") <> 0 And gWin = 0 Then
    gWin = 1
    If gFrmClose = 0 Then
      DoCmd.Close acForm, "F_BmCard02List"
    End If
  End If
End Sub

```

▼SQL データベース接続

```DAO_Connect.vba
Set Db = DBEngine.OpenDatabase("", False, False, "ODBC;Driver={SQL Server};" & _
　　　　　　　　　　　　　　　　　　　　　　　　 "Server=XXXX;" & _
　　　　　　　　　　　　　　　　　　　　　　　　 "Database=XXX;UID=XXX;PWD=XXX;")
```
https://selifelog.com/blog-entry-83.html

▼コンボボックスにリストの既定値をセットする。

```
=[コンボ1].[ItemData](0)
=[コンボ1].[ItemData]([コンボ1].[ListCount]-1)
```
【思考段階】ストップ高を予想して、一攫千金狙い作戦〜構想編〜 編集

# 背景

申し訳ないのですが、構想編なので、実装とかは今回のはありません。

ストップ高になる前の傾向を予想できたら、それに乗っかって、リスク少なくお金儲けができるんじゃないかなっていうので、作業進行中のやつ。ストップ安も同じロジックで発見できるはず

なんでストップ高になる株が予想できると思ったかと言うと、

- お金の誘惑に勝てない人間は一定数存在するハズ
- インサイダー的なフライングをする輩もいるハズ
- データ解析してフライングゲットを検知
- 未公開情報手に入れなくても、甘い蜜を吸える

形的には法律的にグレーなところに相乗りしてる形になるんだけど、僕は未公開情報手に入れてないから、大丈夫だと信じてやってみよう、笑

# 何をするのか

人工知能周りの内容をまとめているブログはこちら：[人工知能で努力1mm](http://www.doryoku-1mm.tech/)

いつも通りある銘柄のリターンインデックスを、日経平均のリターンインデックスで基準化して、その推移を見てあげる。でも、これ実はけっこうテクいことしなくちゃいけないかもしれなくて悩んでる。

[株主優待後の下落を狙う](リンクを挟むこと)の記事では、用意した関数が返す値が**過去の収益率の期待値と分散**だった。だから、一回分析しちゃえば、後はこっちで権利確定日の近くに、自分の納得できる銘柄を購入してあげればいいだけで。。

ただ今回のやつは、用意した関数が返す値が**次の日にストップ高になかどうか**。これは僕の知っている単純な統計とか機械学習じゃ対処できない話だったりする。（前に決定木で似たような分析した時は、精度があまりでなかった。）

つまり、**現状何をしたらいいのかわからない**が結論、笑　とりあえず知恵を絞った記録だけしておく。

# できそうなこと１：日経平均との乖離率を見る

日経平均との乖離率の周期を見る。僕の考えている理想に当てはまる銘柄であれば、日経平均との乖離率がじわじわと上昇して、ある一定水準（X日なのか、乖離率Y%以上なのか）を満たした場合に、次の日にストップ高になる確率が高い。とかならイメージとも合ってるし、いけそう。

移動平均との乖離率を、ストップ高（安）前で見てあげるのでもいい結果出るかな。

とりあえず、[【実装中】データを分析して、株主優待後の下落を狙って儲ける作戦〜構想編〜](http://www.doryoku-1mm.tech/entry/2016/07/12/173430)が終わったら、こっちから試そうかな。
【iOS】Carthageで導入したライブラリがPlaygroundでインポートできないときのメモ

[【iOS】Carthageで入れたframeworkをPlaygroundで使用する](http://qiita.com/ryokosuge/items/2551cd4faa9dca324342)
や
[Using Third Party Framework in Playground with Carthage](https://medium.com/@adinugroho/using-third-party-framework-in-playground-with-carthage-82ead87a5bd7#.29qcx63f8)
が
うまくいかなかったときのメモ。

## 環境
Xcode7.3

## 症状
.playgroundファイル

importできない...。

![スクリーンショット 2016-07-15 14.06.23.png](https://qiita-image-store.s3.amazonaws.com/0/84014/98cc19ba-e7fd-cd28-ceda-45bffb5b1d3d.png)

## 原因
あっ...。

![スクリーンショット 2016-07-15 14.15.24.png](https://qiita-image-store.s3.amazonaws.com/0/84014/674c1b30-5477-d28a-796a-be5b572ff2a3.png)

## 解決策

![スクリーンショット 2016-07-15 14.16.0.png](https://qiita-image-store.s3.amazonaws.com/0/84014/9612f6a6-6122-28c3-2bf0-04f8ec9df85e.png)

クリーン->ビルド

![スクリーンショット 2016-07-15 14.18.55.png](https://qiita-image-store.s3.amazonaws.com/0/84014/38884bfb-259e-dcb0-c6ce-3bf82a2859ca.png)

成功✌︎✌︎

## 終わりに
どんどん便利になっていくPlaygoundでがりがり開発しましょう✊
[Interactieve Playgrounds in Xcode 8](http://www.iosacademie.nl/blog/interactieve-playgrounds-xcode-8/)
Dir.glob や Dir[] よりも Pathname.glob を使うと便利

例えば `/var/foo`にあるファイル名一覧を取得する時に今までは

```.rb
Dir.glob('/var/foo/*').map{|f| File.basename(f)}
```

とやってたんですが、`Pathname.glob` を使うともっとすっきり書けることを知りました。便利！！

```.rb
Pathname.glob('/var/foo/*').map(&:basename)
```
WebStorage 入門

# WebStorage 入門

# 概要

Electronやハイブリットアプリ開発の際に、ローカルにデータを持たしたいと思い再入門しました。
ざっくりいうと、WebStorageとはブラウザにデータを保存しておく為の仕組みです。
Cookieよりも高機能です。(永続的なデータ保存・ストレージ容量が4MB)

# 注意点

ブラウザにより使えない場合がある。
最新のブラウザなら基本なんでも大丈夫です。
(IE8以上なら大丈夫。)

# ルール

同一オリジンでデータを保存します。

## オリジンとは

URLっぽいものの事。

http://(スキーム)localhost(ホスト):8000(ポート) = オリジン

**同じ端末(ブラウザ)で同じオリジンなら同じWebStorageが使える。**

# WebStorageの種類

## sessionStorage

タブが閉じられるまで有効。
タブが複数でも異なるStorageになる。

keyとvalueで保存される。

### メソッド

|Method|Description|
|------|-----------|
|sessionStorage.setItem(key, value)|sessionStorageにデータを保存する。|
|sessionStorage.getItem(key)|sessionStorageのデータを取得する。|
|sessionStorage.removeItem(key)|sessionStorageのデータを削除する。|
|sessionStorage.clear()|sessionStorageのデータを全件削除する。|
|sessionStorage.length|sessionStorageのkey数を返す。|


## localStorage

ブラウザ自体にずっと保存。
複数タブでも有効。
(基本localStorageを使うのがベターです。)

|Method|Description|
|------|-----------|
|localStorage.setItem(key, value)|localStorageにデータを保存する。|
|localStorage.getItem(key)|localStorageのデータを取得する。|
|localStorage.removeItem(key)|localStorageのデータを削除する。|
|localStorage.clear()|localStorageのデータを全件削除する。|
|localStorage.length|localStorageのkey数を返す。|

## オブジェクトを保存する

key, valueのvalueをオブジェクトにしたい事があるかと思います。
その際は、JSON.stringify(value)とJSON.parse(key)を使います。

### setItem時
JSON.stringify(value)

### getItem時
JSON.parse(key)

## イベント

複数タブなどを開いている場合に、データの整合性を取るイベントがあります。
storageに何らかの変更があったらイベントをキャッチします。

```js

  localStorage.setItem('name', 'jack');
  window.addEventListener('storage', (e) => {
    console.log(e.key); // key
    console.log(e.oldValue); //古い値
    console.log(e.newValue); //変更後の値
    console.log(e.storageArea); //変化があった時の、storageのデータ全体をオブジェクトで取得
    console.log(e.url); //オリジン
  });
```

# 終わり

WebStorageを使えば、簡単に端末(ブラウザ)毎にデータを残す事ができます。
てっとり早くデータを保存したい時や、ローカル端末にデータを残したい時などにはうってつけです。
セキュリティ的な観点では、もう少し調査が必要なので、次回はそちらの調査結果を書こうと思います。
GTX-1080でTensorFlow

GTX-1080を入手したものの、pip でインストールしたTensorFlowでは使えないとのこと
四苦八苦したのでメモ
Pythonの経験がまだ半年程度なのでインストール周りで無駄が多そう...

# 環境
Ubuntu 16.04
Python 3.5.2

Nvidiaのドライバが入ってないからかDVDブートだと画面が表示されなかったので、GTX-1080を取り外してインストール
Ubuntuのインストールが終わったらGTX-1080を取り付けて起動しSSHで接続した

# Nvidiaドライバーのインストール
[GTX-1080 など GeForce を Ubuntu 16.04 LTS で CUDA-8.0RC と共に使う](http://qiita.com/hidenorly/items/a3eb3a0375e6703d163b)
をがっつり参考にさせてもらってインストール
とりあえず、
*まずは Ubuntu 16.04LTS で nVIDIA GeForce を使う一般設定から*
だけを行った

これで、ようやくGTX-1080出力の画面が映るようになった

# CUDAのインストール
https://developer.nvidia.com/cuda-toolkit
このサイトの **CUDA Toolkit 8 RC Now Available**
をクリック

Linux -> x86_64 -> Ubuntu -> 16.04 -> deb(local)
を選んでダウンロード
表示されたコマンド通りに実行してインストール

# cuDNNのインストール
https://developer.nvidia.com/cudnn
ここのDownloadをクリック
**cuDNN Download Survey** はスルーしてページ下部の **Proceed To Downloads** をクリック
I Agree To.. にチェックして
**Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0** の中の
**cuDNN v5.1 Library for Linux** をクリックしてダウンロードする
TensorFlowのチュートリアルを参考にしつつ

```
$ tar xvzf cudnn-8.0-linux-x64-v5.0-ga.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h  /usr/local/cuda/lib64/libcudnn*
```

# CUDAのパス設定

```
$ echo 'export CUDA_ROOT=/usr/local/cuda' >> ~/.bash_profile
$ echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bash_profile
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/lib:$LD_LIBRARY_PATH' >> ~/.bash_profile
$ echo 'export CPATH=/usr/local/cuda/include:$CPATH' >> ~/.bash_profile
```

＊追記
akinorihommaさんにご指摘いただきました。
上記コードがecho ... > ... で上書きになってました。
修正依頼を反映しております。申し訳ございませんでした。

# Nvidiaドライバーの再インストール
CUDAをインストールしたらGUIでログインできなくなった(どうやらドライバのせいらしい)ので再インストールする

```
$ sudo apt-get install nvidia-367 --reinstall
$ sudo reboot
```

# Bazelのインストール
TensorFlowをビルドするためにBazelをインストールする
http://www.bazel.io/docs/install.html
このマニュアル通りに行う

# Pythonのインストール
Pythonはpyenvを使ってインストールした
pyenvでのインストールは文献がたくさんあるので省略

# TensorFlowのビルド
まずはリポジトリをクローンしてくる

```
$ git clone https://github.com/tensorflow/tensorflow ~/tensorflow
```

マニュアル通りに依存関係をインストール
pyenvの場合はどうなるのだろうと思いながら...

```
$ sudo apt-get install python3-numpy swig python3-dev python3-wheel
```

特に記述はなかったように思うけど、gccのバージョンが5.3以上だとビルドエラーを起こしたので4.9をインストールしておく

```
$ sudo apt-get install gcc-4.9
$ sudo apt-get install g++-4.9
$ sudo apt-get install libstdc++6-4.9-dbg
```

クローンしてきたディレクトリに移動

```
$ cd ~/tensorflow
```

pyenvのバージョン指定

```
$ pyenv local YOUR_VERSION
```

＊追記
YusukeSuzuki@githubさんのコメントより、pyenvの設定を行わないとビルド結果が正しくないようなので、
pyenvで用いるバージョンを設定してください。
ご指摘ありがとうございました。

ビルドの設定を行う

```
$ ./configure
```

`Google Cloud Platform support` と `GPU support` は `y` で
gccはさっきインストールした4.9を指定する`/usr/bin/gcc-4.9`
それ以外はEnter連打。

設定ができたらさっそくビルド

```
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
```

これで`/tmp/tensorflow_pkg`に`.whl`ファイルが生成されてた

ということでpip install

```
$ pip install /tmp/tensorflow_pkg/tensorflow-0.9.0-py3-none-any.whl
```

これでmnistのサンプルも実行できた
WRF > CentOS6.8でのセットアップ [失敗編]

<font color=red>以下の作業はnetcdfのインストールに失敗しています。~~WRFのインストールまで完遂せず他の方法を調査中です~~</font>

(追記 2016/11/04)
<font color=red>代わりに以下のリンク先の方法でセットアップしました。</font>
http://qiita.com/7of9/items/8ff328ed1c144d659335




```txt:動作環境
CentOS 6.8 (64bit) : インストールしたて
```

参考 http://forum.wrfforum.com/viewtopic.php?f=5&t=7093

## WRFのビルド

### EPELリポジトリ追加

http://qiita.com/7of9/items/fea70dfa8823c5f2f948
に記載のようにEPELリポジトリを追加する。

これをしないとnetcdfなどがyum installでインストールされない。

### 関連のものをyumインストール

```
$ su -
# yum install zlib hdf5 hdf5-devel netcdf netcdf-devel netcdf-static openmpi openmpi-devel jasper jasper-libs jasper-devel
```

### NCLインストール

http://forum.wrfforum.com/viewtopic.php?f=5&t=7093
> Note: The only thing that won't work from distro packages is ncl. The distro package version is 6.0.x but 6.1+ is required. So do not try yum install ncl ncl-common ncl-devel ncl-examples
I got ncl 6.3 for Centos 6.x from here https://www.earthsystemgrid.org/dataset/ncl.html instead.

NCLのインストールは以下記載の通りに実施した。
http://qiita.com/7of9/items/fe9fa72aafe43d77708c

### bashrc書替え

http://forum.wrfforum.com/viewtopic.php?f=5&t=7093
に.bash_profileの変更が記載されている。

こちらでは一般ユーザの.bashrcの変更とした。

### コンパイル

WRFV3.6.1.TAR.gz をWRFのサイトから取得し、一般ユーザの~/以下に解凍した。

http://forum.wrfforum.com/viewtopic.php?f=5&t=7093
に記載の通り以下を実行した。

```
$ cd WRF4
$ ./configure
メニューのうち34 (dmpar ... )を選択
netstingを1と選択
```

http://forum.wrfforum.com/viewtopic.php?f=5&t=7093
に記載の通りconfigure.wrfを変更。

```
$ ./compile em_real
```

以下のメッセージが出てビルドができたようだ。

```
build started:   Fri Jul 15 05:36:59 PDT 2016
build completed: Fri Jul 15 05:39:03 PDT 2016
```

## WPSのビルド

WPSV3.6.1.TAR.gzをWRFのサイトから取得し、一般ユーザの~/以下に解凍した。

http://forum.wrfforum.com/viewtopic.php?f=5&t=7093
に記載の通り以下を実行した。

```
$ ./configure
3(dmpar ...)を選択
```

http://forum.wrfforum.com/viewtopic.php?f=5&t=7093
に記載の通りconfigure.wpsを編集した。

```
$ ./compile
```

以下のエラーが出た。

```
int2nc.f90:10: Error: Can't open included file 'netcdf.inc'
```

netcdf.incが見つからないとのこと。
こちらの環境ではnetcdf.incは`/usr/include/netcdf-3/netcdf.inc`に見つかった。このためconfigure.wpsの

```
WRF_INCLUDE     =       -I$(WRF_DIR)/external/io_netcdf \
                        -I$(WRF_DIR)/external/io_grib_share \
                        -I$(WRF_DIR)/external/io_grib1 \
                        -I$(WRF_DIR)/external/io_int \
                        -I$(WRF_DIR)/inc \
                        -I$(NETCDF)/include
```

のNETCDF関連の行を以下のように変更した。

```
WRF_INCLUDE     =       -I$(WRF_DIR)/external/io_netcdf \
                        -I$(WRF_DIR)/external/io_grib_share \
                        -I$(WRF_DIR)/external/io_grib1 \
                        -I$(WRF_DIR)/external/io_int \
                        -I$(WRF_DIR)/inc \
                        -I$(NETCDF)/include/netcdf-3
```

```
$ ./compile
```
を再度実行するとint2nc.f90のコンパイルエラーは出なくなったが、まだ以下のエラーが出る。

```
/usr/bin/ld: cannot find -lwrfio_int
```

本来はWRFのビルド時にwrfio_intがビルドされるようだが、それが失敗しているようだ。
関数の引数の型を取得する方法

メタプログラミングをするときにたまに関数の引数の型がを知りたいときがあるのでメモ。
std::tupleとstd::tuple_elementを使って実装します。

```cpp

#include <type_traits>
#include <tuple>

template <std::size_t N, class...Args>
struct arg_type_impl
{
    using type = typename std::tuple_element<N, std::tuple<Args...>>::type;
};

// 可変個引数テンプレート
template <std::size_t N, class... Args>
struct arg_type
{
    using type = typename arg_type_impl<N, Args...>::type;
};

// 関数
template <std::size_t N, typename R, typename ... Args>
struct arg_type<N, R(*)(Args...)>
{
    using type = typename arg_type_impl<N, Args...>::type;
};

// メンバー関数
template <std::size_t N, typename C, typename R, typename ... Args>
struct arg_type<N, R(C::*)(Args...)>
{
    using type = typename arg_type_impl<N, Args...>::type;
};

// メンバー関数（const）
template <std::size_t N, typename C, typename R, typename ... Args>
struct arg_type<N, R(C::*)(Args...) const>
{
    using type = typename arg_type_impl<N, Args...>::type;
};


// == テスト用の関数定義 ==
// 関数
static void hoge(int,double,int*);
// メンバー関数
struct X {
  void hoge(int,double,int*);
  void hoge_const(int,double,int*) const;
};



// == Test ==
// 可変個引数テンプレート
static_assert(std::is_same<int,    arg_type<0, int,double,int*>::type>::value, "");
static_assert(std::is_same<double, arg_type<1, int,double,int*>::type>::value, "");
static_assert(std::is_same<int*,   arg_type<2, int,double,int*>::type>::value, "");
// 関数
static_assert(std::is_same<int,    arg_type<0, decltype(&hoge)>::type>::value, "");
static_assert(std::is_same<double, arg_type<1, decltype(&hoge)>::type>::value, "");
static_assert(std::is_same<int*,   arg_type<2, decltype(&hoge)>::type>::value, "");
// メンバー関数
static_assert(std::is_same<int,    arg_type<0, decltype(&X::hoge)>::type>::value, "");
static_assert(std::is_same<double, arg_type<1, decltype(&X::hoge)>::type>::value, "");
static_assert(std::is_same<int*,   arg_type<2, decltype(&X::hoge)>::type>::value, "");
// メンバー関数（const）
static_assert(std::is_same<int,    arg_type<0, decltype(&X::hoge_const)>::type>::value, "");
static_assert(std::is_same<double, arg_type<1, decltype(&X::hoge_const)>::type>::value, "");
static_assert(std::is_same<int*,   arg_type<2, decltype(&X::hoge_const)>::type>::value, "");



```

参考：[cppreference.com:tuple_element](http://en.cppreference.com/w/cpp/utility/tuple/tuple_element)
プロトコルを実装する時はextensionを使おう


##はじめに
ネットに公開されているSwiftの記事を見ていると、
（この人、Swiftの書き方あまり知らないのかな？）
と思うことがよくあります。
そこで、私が気になったSwiftの作法について取り上げて行きたいと思います。

まず、第一回は「プロトコルを実装する時はextensionを使おう」です。

##具体例

例えば、UITableViewDelegateプロトコルを実装する場合。

###よく見るパターン
```Swift
class NohirapViewController: UIViewController, UITableViewDelegate {

	func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
		// 何か処理をする
    }

}
```

###extensionでまとめる書き方
```Swift
class NohirapViewController: UIViewController {
}

//MARK:- UITableViewDelegate
extension NohirapViewController: UITableViewDelegate {
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
		// 何か処理をする
    }
    
}
```

##メリットデメリット

###メリット
・プロトコルのメソッドごとにグループ化できるので、可読性が上がる。

###デメリット
・コード量が若干増える。

##まとめ
・extensionはいいぞ！
PostgreSQLでRails serverが起動しないときのエラー解決法2

[Rails serverが起動しないときのエラー解決法](http://qiita.com/pakiran/items/53c42257ab3f95907ab8)

```
>rails s

...

could not connect to server: Connection refused (PG::ConnectionBad)
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
...
```

MacOSのアップデート後、`rails s`をしたら上記のエラーが出現
上記のリンク内を参考に`postmaster.pid`を探しに行くも、そんなものはないと言われる

```cl:コマンドライン
find /usr/local/var/postgres/postmaster.pid

No such file or directory
```

単にposgresが起動されていない場合があるので、ユーザー名を指定して起動

```cl:コマンドライン
sudo -u ユーザー名 postgres -D /usr/local/var/postgres
```

また、バックグラウンドで起動する場合

```zsh:~/.zshrc
export PGDATA=/usr/local/var/postgres
```


起動

```cl:コマンドライン
$ pg_ctl -l /usr/local/var/postgres/server.log start
```

終了

```cl:コマンドライン
$ pg_ctl stop
```

rails sを起動し、任意のページが表示されました。
Rails+Grapeでエラーハンドリング

# やりたいこと

- 普通にRails＋Grapeを使っていると、ハンドルされない例外が発生したときRailsのエラーページが返ってしまうが、独自のJSONを返すようにしたい。HTTPステータスは500（Internal Server Error）にしたい。
- Grapeのパラメータチェックにひっかかった場合はHTTPステータスは400（Bad Request）にしたい。

# 環境

- Rails 4.2.6
- Grape 0.16.2

# 手順

自分のAPIクラスに記述：

```
class MyAPI < Grape::API
  # rescue_fromは書いた順番にマッチングされる
  
  # Grapeの例外の場合は400を返す
  rescue_from Grape::Exceptions::Base do |e|
    error!(e.message, 400)
  end

  # それ以外は500
  rescue_from :all do |e|
    error!({error: e.message, backtrace: e.backtrace[0]}, 500)
  end
end
```

ぐぐると`error!`でなく`error_response`というメソッドを使っているページがあるが、`error_response`は非推奨らしい：

```grape-0.16.2/lib/grape/middleware/error.rb
      # TODO: This method is deprecated. Refactor out.
      def error_response(error = {})
```
CentOS 6.8 > yum install netcdf > Error: Nothing to doの対応 > EPELリポジトリ追加

```txt:動作環境
CentOS 6.8 (64bit)
```

yum install netcdfを実行した時に以下のようなエラーが出た。

```
# yum install netcdf
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
No package netcdf available.
Error: Nothing to do
```

EPELリポジトリを追加する。
(追記: 2016/07/18)
<font color=red>epelをCentOS version 5用で記載してしまっていたため以下のように訂正した</font>

```
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm  
# rpm -ivh epel-release-6-8.noarch.rpm  
```


これでyum list netcdfをすると以下のようにリストが出るようになった。

```
# yum list netcdf
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * epel: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
epel                                                     | 3.6 kB     00:00     
epel/primary_db                                          | 2.9 MB     00:07     
Available Packages
netcdf.i386                            3.6.3-1.el5                          epel
netcdf.x86_64                          3.6.3-1.el5                          epel
```

yum install netcdfでインストールできるようになった。
Rails + Grapeでリクエストログ（実行時間、パラメータ）を出力する

# やりたいこと

普通Railsではログに

```
I, [2016-07-15T10:03:39.554712 #7157]  INFO -- : Completed 200 OK in 18ms (Views: 6.1ms | ActiveRecord: 10.3ms)
```

のように実行時間が残るが、Grapeと組み合わせるとこれが出なくなってしまう。
これを出すようにしたい。ついでにGETやPOSTのパラメータも残したい。

本記事の手順でgrape_loggingを導入すると下記のようなログが出せるようになる。

```
[INFO] {:status=>201, :time=>{:total=>8.21, :db=>0.0, :view=>8.21}, :method=>"POST", :path=>"/api/moge", :params=>{"a"=>"123"}, :response=>["143"]}
```

ちなみに、Rails+Grapeでは普通に`logger.debug("hoge")`と書くと

```
undefined local variable or method `logger' 
```

とエラーになってしまうが、`Rails.logger.debug("hoge")`と書けばよい。

# 環境

- Rails 4.2.6
- Grape 0.16.2

# 手順

Gemfileに追記：

```
gem 'grape_logging'
```

config/initializers/instrumentation.rbを新規作成：

```config/initializers/instrumentation.rb
# Subscribe to grape request and log with Rails.logger
ActiveSupport::Notifications.subscribe('grape_key') do |name, starts, ends, notification_id, payload|
  Rails.logger.info payload
end
```

自分のAPIクラスに記述：

```
require 'grape_logging'

class MyAPI < Grape::API
  # https://github.com/aserafin/grape_logging#logging-via-rails-instrumentation
  use GrapeLogging::Middleware::RequestLogger,
      instrumentation_key: 'grape_key',
      include: [ GrapeLogging::Loggers::Response.new,
                GrapeLogging::Loggers::FilterParameters.new ]

  format :json
  content_type :json, "application/json; charset=utf-8"

  # テスト用API
  params do
    requires :a, type: Integer
  end
  post 'moge' do
    20 + params[:a]
  end
end
```

# 出力項目をカスタマイズする

レスポンスを全部ロギングするのはさすがに過剰なので出力しないようにしたい。そんな場合は自分のAPIクラスに書いた`include:`の部分から`GrapeLogging::Loggers::Response.new`を消せば良い。

他にも`ClientEnv`、`RequestHeaders`といった出力項目がある。

```
    include: [ GrapeLogging::Loggers::Response.new,
               GrapeLogging::Loggers::FilterParameters.new,
               GrapeLogging::Loggers::ClientEnv.new,
               GrapeLogging::Loggers::RequestHeaders.new ]
```

# 参考
https://github.com/aserafin/grape_logging#logging-via-rails-instrumentation
GitHubで受けたPull Requestを綺麗にマージする手順

GitHubでPull Requestを綺麗にマージする方法を知ったので試してみたときのメモ。

# 背景と問題意識
今まで「Merge pull request」ボタンを押してたけど、コミットログ上で「Merge pull request...」というコミットが入ってしまうのが気になっていた。
このやり方だと、それが起きないのでコミットログが綺麗になるし、送られたパッチをまとめたり修正を追加したりも自由にできるので、いいことづくし。

# PRのコミットをローカルに取り込む

GitHub上のPRのURLを調べて、末尾に`.patch`をつけたURLを使って以下のコマンドを実行する。

```
curl -L https://github.com/ossc-db/pg_rman/pull/31.patch | git am
```

これでマージ可能なPRなら、ローカルにパッチがcommitされた状態になる。


# ローカルでコミットを修正する。

修正を追加して`git rebase`や`git commit --amend`。

その際、コミットメッセージの最終行に

```
Closes #XXX
```

としてPRの番号を書いておくと、`git push`した際にGitHub側で自動でPRをcloseしてくれる。便利！


# 情報元

[GitHubでPull Requestを修正して取り込む](http://blog.a-way-out.net/blog/2015/03/28/github-pull-request-merge/)
[GitHubでの”Merge pull request”の弊害](http://postd.cc/merge-pull-request-considered-harmful/)
WordPress開発で使いたいデバッグ用プラグイン2選

## デバッグ用のプラグイン
見た目先行で上部のバーを非表示にしていましたが、開発中は表示しておくのが鉄則ヽ(･ω･)/
下で紹介するプラグインはいずれも管理メニューとして追加されるものなので、この機会に表示されるようにしましょう。

### [Query Monitor](https://ja.wordpress.org/plugins/query-monitor/)

さ、サイトが丸見えに!!
Worningがあれば、赤で教えてくれるし、ページで読み込まれているphpがどれなのかも一発でわかります。（これは特に開発はじめのときは役立ちますよね）

私は、パーマリンクの設定のときに詰まり、導入しましたが、早めに入れておけばよかったとちょっと公開しています。

他にもページ表示にかかる秒数やクエリの処理時間、Hookなどなど、見えないものは何もない！パフォチューし放題！var_dump()を毎回書く手間も省けますよ！！ ちなみに、結果はページの下部にまるっと表示されるので、少し重たくなります。

### [Debug Bar](https://ja.wordpress.org/plugins/debug-bar/) & [Debug Bar Extender](https://wordpress.org/plugins/debug-bar-extender/)

こちらもパーマリンクを設定するときにとても有効です。
request, query, 適用されたリライトルール、リライトクエリがサラリと見えます！
機能が絞られている分、サクリと動くしページの表示は変わらないので、こまめに結果を確認したいときはこれだけで良いと思います。

### 参考サイト

- [WordPressチューニング、その前に使うDebug Bar](http://knowledge.sakura.ad.jp/tech/283/)
- [WordPressのデバッグプラグイン「Query Monitor」をサイト制作・カスタマイズに役立てよう](http://liginc.co.jp/web/wp/plug-in/151347)
Ubuntu 16.04 LTSでgeditの組み込み端末の設定を変更する方法

geditの組み込み端末の設定は、基本的には端末の設定に依存しています。
そのため、端末のプロファイルの設定を変更することで、geditの組み込み端末の設定も変更するという方法をとります。

1. 端末を開きます。
2. [編集]-[プロファイルの設定]をクリック
3. 設定を行う

これでgeditを開くと、端末に対して行った設定が反映されていると思います。
Slack | チャンネル内のカレンダーで過去の日付に簡単に移動する

# 問題

過去のログを見るために、ひたすらマウスを上にスクロールしてませんか？ 僕はしてました。

# 解決

チャンネル内で、歯車アイコンの「Jump to date」を選ぶ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/d81e8fc4-b7f4-d690-0850-66c44c5999b7.png)

カレンダーが表示されるので、移動したい日付を選ぶ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/dc5c1d77-9cb4-471e-4a2b-d87891c7987d.png)

その日付にジャンプする！

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/c3018a66-67e0-f14e-8772-8235df23b84c.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->