OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで、特定の列にTrue/Falseが入っている行のみを抽出

## 概要
Pythonで、特定の列にTrue/Falseが入っている行のみを抽出する方法です。

### 使用データイメージ
※以下このデータをdfとします

|id|age|gender|purchase|        
|:--|:--|:--|:--|
|1|23|0|True|
|2|50|0|False|
|3|34|1|False|
|4|36|1|True|
|5|29|0|True|

## Trueの行のみ抽出

#### スクリプト

```.py
df[df.purchase]
```

#### 完成イメージ
dfの、purchase列がTrueの行のみ抽出します。

|id|age|gender|purchase|        
|:--|:--|:--|:--|
|1|23|0|True|
|4|36|1|True|
|5|29|0|True|


## Falseの行のみ抽出

#### スクリプト

```.py
df[~df.purchase]
```

#### 完成イメージ
dfの、purchase列がFalseの行のみ抽出します。

|id|age|gender|purchase|        
|:--|:--|:--|:--|
|2|50|0|False|
|3|34|1|False|
AndroidアプリをGoogleplayに登録する際のキーストア作成

今回アプリを作る際に、依然作ったキーストアファイルを使おうと思いました、
でも、アプリの登録画面を読んでいたら、新規に作った方が良さそうだったので、久々に作りました、
タブレットPCで最初から作ればよかったのですが、画面が小さいので、MacBookAirで作りました。

今回参考にした記事は、こちらです。
https://qiita.com/nogson/items/abe1016f36c3b331db30

と
https://st40.xyz/one-run/article/95/

とても参考になった記事
Visual Studio Tools for Apache Cordova のアプリ署名
https://teratail.com/questions/30448



別のパソコンで作ったキーストアファイルを使う場合は、コピーしてフォルダの中に配置した後、プロパティを開いて確認した方がよいポイントがあります。
キャプチャを取り忘れてしまったのですが、プロパティを開くと、下の方にセキュリティの確認を求めるチェックボックスが出ています。
それにチェックを入れると、アクセスできるようになります。
Html にテキストファイルを取り込む

OBJECT を使って Html にテキストファイルを取り込む方法です。
Chrome と Firefox で確認しました。

## html ファイル

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>Object Test</title>
</head>
<body>
<OBJECT DATA="./aaa.txt"TYPE="text/plain" WIDTH="100%" HEIGHT="100%"></OBJECT>
<OBJECT DATA="./bbb.txt"TYPE="text/plain" WIDTH="100%" HEIGHT="100%"></OBJECT>
Apr/17/2018<p>
</body>
</html>
```

## 取り込むファイル

```text:aaa.txt
これは １つ目のファイルです。
今日は曇っています。
これはテストです。
```

```text:bbb.txt
これは２つ目のファイルです。
こんにちは
これはテストです。
```

## 実行結果
![object_apr17.png](https://qiita-image-store.s3.amazonaws.com/0/179446/dcc25295-aa1a-63b9-494a-cf7623187d1c.png)
Google Maps APIのDrawingManagerライブラリで、描画したpolygonの経緯度を取得する

### 記述内容

```javascript
const defaultCenter = {
  lat: xxxxx
  lng: xxxxx,
}
const map = new google.maps.Map(document.getElementById('map'), {
  center: new window.google.maps.LatLng(defaultCenter.lat, defaultCenter.lng),
  zoom: 13
});
const drawingManager = new google.maps.drawing.DrawingManager({
  ...
  polygonOptions: {
    ...
    draggable: true,
    editable: true,
  }
});
drawingManager.setMap(map);

google.maps.event.addListener(drawingManager, 'polygoncomplete', function(polygon) {
  let polygonPath = polygon.getPath()
  console.log('polygonPath')
  console.log(polygonPath)
  polygonPath.forEach((value, ii)  => {
    console.log(ii + '個目')
    console.log(polygonPath.getAt(ii)['lat']())
    console.log(polygonPath.getAt(ii)['lng']())
  });
});
```

### 参考

- [描画レイヤー（ライブラリ）  \|  Google Maps JavaScript API  \|  Google Developers](https://developers.google.com/maps/documentation/javascript/drawinglayer#drawing_events)
- [図形  \|  Google Maps JavaScript API  \|  Google Developers](https://developers.google.com/maps/documentation/javascript/shapes#polygon_inspect)
AzureのRM版仮想マシンにPowershell接続をする

#はじめに
Azureの仮想マシンにPowershellDSCを使用しています。
もともとはVnet、VMともにクラシック版を使用していました。
今回は新たにノードサーバー側のみリソースマネージャー版で再構築することになりました。
構築したのは

 - クラシック仮想ネットワークにDSCサーバーを配置（既存資産）
 - クラシック仮想ネットワークにピアリングしたリソースマネージャー仮想ネットワークを構築（新規）
 - リソースマネージャー仮想ネットワークにノードサーバーを配置（新規）

でした。

しかし、WINRMの接続がなかなかうまくいきませんでした。
結果的に使用するポートがクラシックのものと違っており、使用するポートをFW、NSGともに空けていなかったからでした。
次回のために、記録として残しておこうと思います。

#Azureクラシック仮想マシンにPowershell接続

クラシック版Azure仮想マシンでは作成すると最初から5986ポート（WINRM）がFWで許可されています。
またエンドポイントでも5986ポートは許可されています。
なので、仮想マシン作成後、下記コマンドを実行して完了です。

```

Enable-PSRemoting -Force
Set-Item wsman:\localhost\Client\TrustedHosts -Value * -Force
Set-ExecutionPolicy RemoteSigned

```

これでリモート接続が信頼されたので

```
$secPassword = ConvertTo-SecureString $Password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($UserName,$secPassword)
$cimSessionOption = New-PSSessionOption -UseSsl -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$cimSession = New-CimSession -SessionOption $cimSessionOption -ComputerName $ComputerName -Credential $credential
```

を実行すると接続できるはずです。


#Azureリソースマネージャー仮想マシンにPowershell接続

リソースマネージャー版では5986ポートではなく５９８５ポートがサーバーのFWで許可されています。
注意）私の環境ではVnetのピアリングをしているため、subnetが異なっているので別途5985ポートをFWで許可しています。
クラシックで言うエンドポイントであるNSGでは5985ポートは許可されていないので、5985ポートの許可を行ってください。
5985ポートを許可した後はクラシックとほぼ同じです。

まずはリモート接続の許可

```
Enable-PSRemoting -Force
Set-Item wsman:\localhost\Client\TrustedHosts -Value * -Force
Set-ExecutionPolicy RemoteSigned
```

そして、実際に接続してみます。

```
$secPassword = ConvertTo-SecureString $Password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($UserName,$secPassword)
$cimSession = New-CimSession -ComputerName $ComputerName -Credential $credential
```

これで接続ができると思います。
ここで注意なのですが、 ``` New-CimSession ``` でクラシックでは```UseSSL```を使用していましたが、ポートが変わるので```UseSSL```は使用しません。
さらにSession-optionも使用する必要がなくなりました。


#おわり

リソースマネージャー版では初期設定ではpingが許可されていなかったため、Vnetの接続をずっと疑っていたのですが、なんてことはないポートが違っただけというトラップにかなりハマってしまいました。みなさんも気をつけましょう！
【tutorial】既存プロジェクトをGit管理に追加(GitBash)

GitBash（Git For Windows）のインストールは↓の記事。
https://qiita.com/d778980/items/063e3d04fd6d2bf91abd

2018/04/17に実施。

１．デスクトップにプロジェクトを準備。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/6b52cc27-e8d2-a8d0-1a1a-cb326951a191.jpeg)

２．GitBashを起動。作成したプロジェクトに移動。

```
cd ~/Desktop/project
```

３．Gitプロジェクトの初期化。

```
git init
```

４．全ファイルをGit管理対象に追加。

```
git add .
```

５．コミット。

```
git commit -m 'create repository'
```
VisualstudioでCordovaの開発環境で、Androidのリリースビルドが出来ない

今回、作っているアプリが、ようやく完成しました。
リリースビルドをするために、キーストアのファイルを作り準備をしました。
でも、何故かネットで出てくる手順通りに行っても、リリースビルドが出来ないのです。
デバッグビルドは、出来ます。

色々とネット検索して、次の記事を見つけました。
https://code.i-harness.com/ja/q/1e97030

この記事の質問の回答にあるように、projectCordova .jsproj.userファイルにソースを追加すると良いとあったので、さっそく試しました。
最初は、コピペする場所が広く構文エラーになってしまいましたが、修正しました。
そして、無事に、リリースビルドできるようになりました。

今回修正したファイル内容は、こちらです。
projectCordova .jsproj.userのprojectCordovaは、プロジェクト名です。

```xml

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Android'">
    <DebuggerFlavor>AndroidEmulator</DebuggerFlavor>
    <AndroidEmulatorID>AndroidDevice;デバイス</AndroidEmulatorID>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Android'">
    <DebuggerFlavor>AndroidEmulator</DebuggerFlavor>
    <AndroidEmulatorID>AndroidDevice;デバイス</AndroidEmulatorID>
  </PropertyGroup>
</Project>

```

またキーストアファイルを作ったパソコンとは別のパソコンでアプリを登録する際に、キーストアのファイルをコピーすると思います。
キーストアファイルをMacからWindowsのパソコンにコピーしたあと、プロパティで確認したら、セキュリティのチェックを入れるように表示が出ていました。

もし、キーストアファイルにアクセスできないときは、試してみてください。
Go言語で 8 queens 問題を解く

Goで「[8 queens 問題](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%A4%E3%83%88%E3%83%BB%E3%82%AF%E3%82%A4%E3%83%BC%E3%83%B3)」を解いてみました。実際は n queens が解けます。

#出力
すべての解を出力します。`num = 8`の場合、解は92個あります。こんな感じです。

```
------------------
n = 1
@.......
....@...
.......@
.....@..
..@.....
......@.
.@......
...@....
------------------
n = 2
@.......
.....@..
.......@
..@.....
......@.
...@....
.@......
....@...
------------------
（以下略）
```

#コード

```go:eight_queen.go
package main
import "fmt"
import "strings"

const num = 8
var count = 0

//出力
func putout(field []int) {
    count++
    fmt.Println("------------------")
    fmt.Printf("n = %d\n", count)
    st := strings.Repeat(".", num - 1)
    for _, queen := range field {
        fmt.Println(st[0: queen] + "@" + st[0: num - queen - 1])
    }
}

//ここまでの field で女王の置けるマス（空白）を探す（1なら置けない）
func get_space(field []int) [num]int {
    result := [num]int{}
    l := len(field)
    for i, queen := range field {
        result[queen] = 1
        dst := l - i
        if a := queen - dst; a >= 0  {result[a] = 1}
        if a := queen + dst; a < num {result[a] = 1}
    }
    return result
}

//メインの深さ優先探索
func solve(field []int) {
    if len(field) == num {
        putout(field)
    } else {
        for i, space := range get_space(field) {
            if space == 0 { solve(append(field, i)) }
        }
    }
}

func main () {
    solve([]int{})
}
```

実質的に`solve()`と`get_space()`の 2つのメソッドだけでシンプルに書けました。`putout()`は出力用です。再帰的に深さ優先探索で解いています。

実行時間は `num = 8`の場合ほぼ一瞬（0.01秒くらい）です。`num = 15`の場合、最終的な解の個数だけ出力するように改変して（[コード](https://gist.github.com/obelisk68/5c392b0b99dbbe3b667d493b8765f926)）実行すると

```
$ time ./eight_queen
2279184

real	0m17.135s
user	0m17.332s
sys     0m0.040s
```

という感じです。

Go で書くのは好きですね。コードの見た目がいいです。

なお、以上は[ブログ記事](http://obelisk.hatenablog.com/entry/2018/03/28/002312)が元になっています。
JUnit 5 ユーザガイド 第1章 概要

# はじめに
株式会社Udzukiの@tsukakeiです。
東京大学大学院でソフトウェアテストの研究を行なっていました。

~~JUnit 5の[ユーザガイド](https://junit.org/junit5/docs/current/user-guide/)を邦訳していきたいと思います。~~


~~[JUnit 5 ユーザガイド 第1章 概要](https://qiita.com/tsukakei/items/65cee9e542d1e7effc95)~~
~~[JUnit 5 ユーザガイド 第2章 インストール](https://qiita.com/tsukakei/items/1b3c2b0a3455edaee251)~~
~~[JUnit 5 ユーザガイド 第3章 テストを書く](https://qiita.com/tsukakei/items/7e48c84b96e3ebf34498)~~
~~JUnit 5 ユーザガイド 第4章 テストを実行する~~
~~JUnit 5 ユーザガイド 第5章 モデルの拡張~~
~~JUnit 5 ユーザガイド 第6章 JUnit4との違い~~
~~JUnit 5 ユーザガイド 第7章 先進的な話題~~
~~JUnit 5 ユーザガイド 第8章 APIの進化~~

全ての章を翻訳し、[こちら](https://udzuki.jp/public/junit5-user-guide-ja/)にアップロードしました。

# 概要
本文書の目的は、テストを書くプログラマや、拡張機能の開発者、ビルドツールやIDEベンダといった駆動部分の開発者に包括的なレファレンス文書を提供することです。

このドキュメントは[PDF](https://junit.org/junit5/docs/current/user-guide/index.pdf)でも利用可能です。
（訳者注：リンク切れ？）

## JUnit 5とは？
これまでのバージョンのJUnitとは異なり、JUnit 5は3つのサブプロジェクトの様々なモジュールから構成されています。

***JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage***

**JUnit Platform**は、JVM上でテスティングフレームワークを起動させるための基礎として作動します。また、プラットフォーム上で走るテスティングフレームワークを開発するための `TestEngine` APIを定義しています。さらに、プラットフォーム上でどのような`TestEngine`でも実行するために、JUnit4ベースのRuunnerと同様に、コマンドラインからプラットフォームを立ち上たり、GradleやMavenのためのプラグインを構築するための`Console Launher`を提供します。

**JUnit Jupiter**は、JUnit 5でテストを書いたり拡張するためのプログラミングモデルと拡張モデルの組み合わせです。Jupiterは、プラットフォーム上でJupiterベースのテストを実行するための`TestEngine`を提供します。

**JUnit Vintage**は、プラットフォーム上でJUnit3とJUnit4ベースのテストを実行するための`TestEngine`を提供します。

## サポートしているJavaのバージョン
JUnit 5は実行時にJava 8(またはそれ以上)を必要とします。しかしながら、テストコードのコンパイルはそれよりも前のバージョンのJDKでも可能です。

## ヘルプ
JUnit 5に関連した質問は[Stack Overflow](https://stackoverflow.com/questions/tagged/junit5) でするか、[Gitter](https://gitter.im/junit-team/junit5)で会話してください。
イマドキ(2018)のWindows版のRubyでrequire 'tk'してエラーにならないようにするには

# 背景

大昔の黒歴史時代のページがジオシティーズに2018年現在もさらされてて、
Tcl&Tkで書かれたコードを見つけてしまったり、
Raspberry piでGUIをつかうアプリを書くにはちょっとElectronだと
重かったり、Tkがマイブーム

Pythonのtkinterを触ったので、mrubyでmrbgemも作ってるくらい
rubyにお世話になっているので、rubyでもTkを触ろうとした


# イマドキのWindows版のRuby

ちょっとまえにMsysベースのRubyに公式が変わった。
すぐググるとActiveStateのTcl&Tkを入れてのインストールの方法が
出てくるが、多分これだと駄目な予感。

Msys版のtcl&tkを入れて頑張ってみるかと思いきや、
Cmder環境でcmd.exeを動かしているからなのか？とくに
Msysのコンソールすら立ち上げずとも

```shell-session
gem install tk
```

であっさり入った！

# 関連記事

- [陰関数の仮想3D空間へのプロットあるいは、ラズパイ版マインクラフト(mcpi)にたけのこの里を出す](https://abrakatabura.hatenablog.com/entry/2018/04/21/080947)
ConstraintLayoutをネストすると激重になる

ConstraintLayoutを使うとやたら重くなったので調査した。
多重のViewGroup内に10セル程度のListViewを配置した画面が、完全に表示されるまでの時間を計測。

## こんな感じ

```xml
<ConstraintLayout>
  <ConstraintLayout>
    <ConstraintLayout>
      <ConstraintLayout>
        <ConstraintLayout>
          <!-- 長いので以下省略 -->
          <ListView />
        </ConstraintLayout>
      </ConstraintLayout>
    </ConstraintLayout>
  </ConstraintLayout>
</ConstraintLayout>

```

## 調査結果

|レイアウト  |時間(秒)  |
|------------------|---|
|何もなし            |0.7  |
|FrameLayout 15個  |1.0  |
|LinearLayout 15個  |1.5  |
|RelativeLayout 15個  |12  |
|ConstraintLayout 15個  |動作不能（60秒以上）  |
|ConstraintLayout 12個  |動作不能（60秒以上）  |
|ConstraintLayout 10個  |23  |
|ConstraintLayout 8個  |4  |


※ Huawei p10 Lite(Android7 2017/06発売)にて確認

## まとめ

ViewGroupをネストすると重くなるとよく言われるが、レイアウトクラスによって重さはかなり違うもよう。
FrameLayoutはたいしたことないが、RelativeLayoutのネストはかなり重く、ConstraintLayoutはさらに重い。

ConstraintLayoutはフラットなView階層を実現できるのでパフォーマンス向上を見込めると公式に説明があるが、フラットにしないと使い物にならないかもしれない。

LinearLayout は上の条件では軽かったが、layout_weightを使うと重くなるとの情報がある。
使うattributeやViewの構成など諸々の条件によっても重さは変わってくるものと思われる。
kintoneプラグイン『機能拡張スタンダード All-In』　ルックアップ連携アプリのレコード登録機能

kintoneプラグイン[『機能拡張スタンダード All-In』](https://spica.tokyo/bluelaunch)の<strong>レコード一覧管理 - キーワード検索</strong>を使用します。

![ss_plugin_config4.png](https://qiita-image-store.s3.amazonaws.com/0/67365/dc521464-c44a-3729-7e26-8ae26cdbaed0.png)

#概要

レコード編集画面、ルックアップフィールドの隣に、ルックアップ連携アプリへのレコード登録を行うボタンを設置します。
直接レコードの登録を連携アプリを開くことなく行えます。

#プラグイン設定

kintoneアプリストアにある「顧客リスト」「案件管理」のアプリを使って、この機能を使用して、サンプルを作成してみます。

「案件管理アプリ」にルックアップフィールドを追加して、「顧客リストアプリ」と連携させます。

・案件管理アプリにルックアップフィールドを設置
![bl_lkupfn_02b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/e90acea9-9c5d-2c42-6f16-d488b399a464.png)

・顧客リストアプリと連携したルックアップフィールドとします
![bl_lkupfn_03b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/cac0ed85-d1c3-ba93-19c8-1f461be077e8.png)

案件管理アプリでプラグインを利用します。
設定を開き、レコード詳細管理のタブに<storong>ルックアップ拡張</storong>という設定項目があり、アプリが持つルックアップフィールドが全て列挙されています。
ボタンを設置したいルックアップフィールドにチェックをつけます。

![bl_lkupfn_01.png](https://qiita-image-store.s3.amazonaws.com/0/67365/a4c111a2-e652-8dc6-6b1f-bf98f8368eb3.png)

設定は以上です。

#ルックアップ連携アプリにレコードを登録してみる

案件管理アプリで新規作成、またはレコードの編集を行う際に、ルックアップフィールドの下部にボタンが表示されます。

![bl_lkupfn_04.png](https://qiita-image-store.s3.amazonaws.com/0/67365/98a4bb21-788c-0755-d308-565f7ef8d41f.png)

「レコード登録」ボタンを押すと連携アプリへのレコード登録用のダイアログが開きます。
![bl_lkupfn_05b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/4a4b8e51-512a-1624-2410-7b32ae266b41.png)

登録内容を入力したら登録実行ボタンを押下。
![bl_lkupfn_06b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/4b9c61c7-7e81-0672-8fc0-833277123973.png)

連携アプリにレコードが登録されます。
![bl_lkupfn_08.png](https://qiita-image-store.s3.amazonaws.com/0/67365/abe63d9c-72ec-dc3a-106d-d8628cb5809a.png)

レコードが作成できなかった場合はエラーの内容が表示されます。
![bl_lkupfn_09.png](https://qiita-image-store.s3.amazonaws.com/0/67365/1aa532ac-e005-32b6-2776-c895d8df4b23.png)

#レコード登録ダイアログでできること

kintoneで編集を行う際と同様のインターフェイスでフィールドの入力を行うことができます。

サブテーブルの行追加／削除にも対応。
ユーザー選択、組織選択、グループ選択についても入力値の候補一覧から選択して入力する形式です。候補の絞り込みにも対応しています。
![bl_lkupfn_07b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/da59213c-9813-bbec-7efa-43c3f404e866.png)

#レコード登録ダイアログでできないこと

「カテゴリー」「添付ファイル」「ルックアップ」を入力することはできません。

---

連携アプリ側（サンプルでは「顧客リストアプリ」）に、このプラグインを利用した設定を行っていても、レコードの登録内容には反映されません。

・自動計算
・キーワード検索（拡張検索）の検索用データ
・フィールド属性を利用した条件別の編集不可属性や入力制限
・選択数制御

など、プラグインの機能を利用したレコード登録を行いたい場合は、連携アプリを開いてレコード登録を行ってください。
「アプリを開く」ボタンを押すと、ルックアップフィールドが連携しているアプリを開くことができます。

---

#このプラグインについて
・[キーワード検索](https://qiita.com/spica/items/9fd2131252702f263e12)
・[自動計算・自動採番](http://qiita.com/spica/items/803af7cd540ae0b8f718)
・[条件書式](http://qiita.com/spica/items/24027003e9dfb9363819)
・[フィールド属性](http://qiita.com/spica/items/73107bda2cff4a94cf41)
・[選択数制御](http://qiita.com/spica/items/1c3ba3927b844b6bb72b)
・[レコード一括更新](http://qiita.com/spica/items/f0e84a1cf430670c4292)
・[自動計算によるレコード一括更新](kintoneプラグイン『機能拡張スタンダード All-In』を使って自動計算でのレコード一括更新を行う)
win-sshfsしたファイルをEmacsで編集するといちいち「really edit the buffer?」と聞かれるので自動で返信させる


[win-sshfs](https://github.com/Foreveryone-cz/win-sshfs)でsshfsしたときタイムスタンプがずれてるのか，保存の度に上書きしていいか聞かれてしまいます．
global-auto-revert-modeなども意味を成しませんでした．
これをelispで黙らせました．

```:エラーメッセージ例
hoge.txt has changed since visited or saved.  Save anyway? (y or n) y
hoge.txt changed on disk; really edit the buffer? (y, n, r or C-h) y
```

## できること
Windowsでもリモートのファイルを手元のEmacsで操作できる

# 結論

```elisp:init.el(一部)

;; y-or-n-pにy,yes-or-no-pにyes,read-char-choiceにyと答える関数（参考１からコピペ）
(defun auto-yes (old-fun &rest args)
    (cl-letf (((symbol-function 'y-or-n-p) (lambda (prompt) t))
              ((symbol-function 'yes-or-no-p) (lambda (prompt) t))
              ((symbol-function 'read-char-choice) (lambda (prompt chars) '(?y ?n ?r ?? ?\C-h) ?y)))
      (apply old-fun args)))

;; バッファを保存し，一文字書き込み，それを消す関数
;; （ファイルのタイムスタンプがバッファよりも未来になっているため書き込み時に本当に書き込むか聞かれる）
(defun hoge ()
    "Save the buffer even if it is not modified."
    (interactive)
    (save-buffer)
    (insert-char #x4220)
    (delete-backward-char 1))

;; hoge関数に自動yes機能を付与
(advice-add #'hoge :around #'auto-yes)

;; C-x C-sを上書き
(global-set-key (kbd "C-x C-s") 'hoge)

```

## マウントしたファイルかどうかで動作を変更
ただ，これだとマウントしていないファイルにもhoge関数を適用してしまいます．
そこでLドライブにマウントした場合にファイルパスがl:で始まることから，次のようにマウントしたファイルを編集しているときのみhoge関数を使用するようにしています．

```elisp:C-xC-sの上書き
(global-set-key (kbd "C-x C-s") 
  (lambda()
    (interactive)
    (if (string-match-p "^c:" (spacemacs/show-and-copy-buffer-filename))
         (save-buffer)
         (hoge))))
```


## 参考

①自動yes応答機能などコードの大部分はここからコピペしてきました
https://emacs.stackexchange.com/questions/14669/sort-of-autoreply-for-specific-messages-in-minibuffer

②同様のコード
https://stackoverflow.com/questions/6591043/how-to-answer-yes-or-no-automatically-in-emacs

③'file changed on disk' 発生時に内部で呼ばれている関数を見れました
https://stackoverflow.com/questions/2284703/emacs-how-to-disable-file-changed-on-disk-checking
PHPで「今日の日付や現在時刻」を使いたい

#本日の日付

```php
$today = date('Y-m-d');
echo $today;
```

#現在時刻

```php
$current_time = date('H:i:s');
echo $current_time;
```

沢山使うなら汎用性のあるファイルに書いて使いまわすべきですね。
UbuntuMATEをいろいろ設定④＜最終章＞〜データ解析用（R・RStudio）編〜

#1.はじめに
ひょんなことからデータサイエンティストへ弟子入りし、プログラミングの世界に導かれやってきました、都会で頑張る田舎者です。文系大学卒の元OLです。

Python、git、docker、Ubuntu、raspberry piなどなどを修行しております。

[超新人プログラマー（見習）がWindowsにUbuntuをインストール②〜シングルブート編〜](https://qiita.com/petadimensionlab/items/78b27ed5c97e93cc387d) より、生まれ変わった”Windowsの皮をかぶったUbuntuMATE”さんをデータ解析用に設定してこうと思います！
今回は師匠（データサイエンティスト）より命じられた、RとRstudioをインストールをして行きます！

→[超新人プログラマー（見習）がWindowsにUbuntuをインストール①〜インストールUSB作成編〜](https://qiita.com/petadimensionlab/items/3b4df62eed514e9e0b9f)
→[超新人プログラマー（見習）がWindowsにUbuntuをインストール②〜シングルブート編〜](https://qiita.com/petadimensionlab/items/78b27ed5c97e93cc387d)
→[UbuntuMATEをいろいろ設定①〜言語設定・Google Chrome・Slack編〜](https://qiita.com/petadimensionlab/items/2f62ae270be0443573a3)
→[UbuntuMATEをいろいろ設定②〜データ解析用（Anaconda）編〜](https://qiita.com/petadimensionlab/items/5d719d6010042c790925)
→[UbuntuMATEをいろいろ設定③〜データ解析用（Sublime Text・Texmaker）編〜](https://qiita.com/petadimensionlab/items/3f2d0ae99be28f2eafb6)

#2.R
Rをインストールしてみましょう！
※当方、Rをちゃんと勉強しておりません・・・（汗）ものすご〜く少しかじった程度です（汗）
###・Rとは
>R言語（あーるげんご）はオープンソース・フリーソフトウェアの統計解析向けのプログラミング言語及びその開発実行環境である。

参照：[Wiki](https://ja.wikipedia.org/wiki/R%E8%A8%80%E8%AA%9E)

下記コマンドを入力！！
とってもシンプル！！（師匠に言われた通りに入力しただけだったり）

```terminal:command
$ sudo apt-get update
$ sudo apt-get install r-base
```

下記コマンドを実行でOK！
または、「アプリケーション」→「グラフィックス」→「R」で起動！

```terminal:command
$ R
```


#3.RStudio
ついでにRStudioもインストールしましょう！

###・RStudioとは
>RStudio™ はRのための新しい統合開発環境(IDE)です。RStudioは，あなたがRを最大限利用する手助けとなるよう直感的なユーザインターフェイスと強力なコーディングツールを結合させたものです。

参照：[RStudioの紹介](http://memorandum2015.sakura.ne.jp/index_rstudio.html)

まずは、RStudioの[公式サイト](https://www.rstudio.com/products/rstudio/download/)へ行き、お好みのインストーラーファイルのダウンロードURLを確認する。
![rstudio１.png](https://qiita-image-store.s3.amazonaws.com/0/241094/aca42014-c78e-eb67-1f07-88e0f811903b.png)
「FREE」の「DOWNLOAD」をクリック。

![rstudio２.png](https://qiita-image-store.s3.amazonaws.com/0/241094/b1dda2e4-738e-fd8f-373c-05bc92978e5c.png)
私はUbuntu16の64Bit版をダウンロードします。
右クリックで「リンクのアドレスをコピー」しましょう。
では、これから下記の順にコマンドを入力していきます！

①debファイル　インストール用のパッケージをインストール。

```terminal:command
$ sudo apt-get install gdebi-core
````

②「wget」コマンドでURLのファイルをダウンロード。
※最新でかつ必要なダウンロードURLを入力。

```terminal:command
$ wget https://download1.rstudio.org/rstudio-xenial-1.1.442-amd64.deb
```

③ダウンロードしたファイルをインストールして完了。
※ダウンロードURLのhttps ://download1.rstudio.org/・・・以下ですね！

```terminal:command
$ sudo gdebi -n rstudio-xenial-1.1.442-amd64.deb
```

④下記コマンドを実行でOK！
または、「アプリケーション」→「プログラミング」→「Rstudio」で起動！

```terminal:command
$ rstudio
```
#3.参考URL
[Ubuntu 16.04 に R と Rstudio をインストール](http://st-hakky.hatenablog.com/entry/2017/10/04/164959)
→RStudioのインストール方法について参考にさせていただいたのですが、Rについても詳しく記載されていおります！

---
以上です！
これでUbuntuMATE〜初期設定からデータ解析設定〜が終了です！
ちょっとしたLinuxの勉強にもなりました。（コマンドの意味とか）
appiumでAndroidアプリ起動時に権限の承認を求めるアプリへの対応方法

自動承認でよければ
Capabilityに"autoGrantPermissions"を追加して型を"boolean"値を"true"似設定してセッションを開始する。
Capabilityの一覧はこっち
https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
GoogleBigQueryで日次、週次、月次の集計をする

#### 目的
 - GoogleBigQueryでDAU、WAU、MAUの集計をする。非エンジニア向けです。
 - 特に**WAU**がやっかいだったので自分用にもまとめておきます。
 - MySQLとの違いで型まわりでひっかかることが多かったです。StandardSQLです。

#### データソース 
daily_active_user

|login_date |user_id|
|:------------------:|:------------------:|
 2018-01-01 | 100 
 2018-01-02 | 100 
 2018-01-03 | 100 
 2018-01-04 | 100 
 2018-01-05 | 100 
 2018-01-06 | 100 
 2018-01-07 | 100 
 2018-01-08 | 100 
 2018-01-09 | 100 
 2018-01-10 | 100 
 2018-01-11 | 100
 2018-01-12 | 100 
 2018-01-13 | 100 
 2018-01-14 | 100 
 2018-01-14 | 200 

#### 期待する結果 
##### DAU
|date |dau|
|:------------------:|:------------------:|
 2018-01-01 | 1 
 2018-01-02 | 1 
 2018-01-03 | 1 
 2018-01-04 | 1 
 2018-01-05 | 1
 2018-01-06 | 1
 2018-01-07 | 1
 2018-01-08 | 1
 2018-01-09 | 1
 2018-01-10 | 1
 2018-01-11 | 1
 2018-01-12 | 1
 2018-01-13 | 1
 2018-01-14 | 2

##### WAU
|date |wau|
|:------------------:|:------------------:|
 2018-01-01 | 1 
 2018-01-08 | 2

##### MAU
|date |mau|
|:------------------:|:------------------:|
 2018-01-01 | 2

#### Query
##### DAU
```sql
SELECT
  login_date,
  COUNT(DISTINCT user_id) AS dau
FROM daily_active_user
GROUP BY 
	login_date
```

##### WAU
```sql
SELECT
  DATE_ADD(login_date, INTERVAL - EXTRACT(DAYOFWEEK FROM DATE_ADD(login_date, INTERVAL -1 day)) +1 day) AS w_week,
  COUNT(DISTINCT user_id) AS wau
FROM daily_active_user
GROUP BY 
	w_week
```
 - DAYOFWEEK、EXTRACTなどは公式リファレンスを読んで下さい
 - https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators?hl=ja


##### MAU
```sql
SELECT
  concat(substr(cast(login_date as string),1,7),"-01") as month
  COUNT(DISTINCT user_id) AS dau
FROM daily_active_user
GROUP BY 
	month
```


### その他
mysqlだとこんな感じ

```sql
SELECT DATE(login_date) - INTERVAL WEEKDAY(login_date) DAY - INTERVAL 1 DAY AS w_week,
       COUNT(distinct user_id) AS wau
FROM daily_active_user
GROUP BY wday
```
journey（日記アプリ）のデータをJavaで受け取って可視化してみた#001

# 概要
　主治医より生活記録（食った、寝た、活動した時間など）を付けることを勧められたため、幾つか見繕って始めてみた[Journeyという日記アプリ](https://play.google.com/store/apps/details?id=com.journey.app&start=90&hl=ja)だが、一か月ほど続けてみて肝心な機能が無いことに気が付いた。。。

　そうです(`・ω・´)

　サマリービューが無いのです(`・ω・´)

　と、いうことで休職期間中暇だったのと丁度オンタイムでデザインパターンの本で学習中だった事もあってJavaで書いてみることにしました(∩´∀｀)∩

 ※本稿はシリーズ物となります。今回は前提の話や紹介のみです。技術トピックはタグの通り、訳あってjFreeChartの実装は見送りとなりましたが、途中まで紹介します。

---

## Journeyの簡単な紹介
　無料版と有料版があります。私は有料版のプレミアム（600円買い切りだったかな？）を購入しました。

↓ジャーナルビュー（Journey画面）
![journalView.png](https://qiita-image-store.s3.amazonaws.com/0/136977/160e17f5-f777-8bfa-5034-687e0f91c89e.png)

↓カレンダービュー
![calendarView.png](https://qiita-image-store.s3.amazonaws.com/0/136977/e9ad4f41-7cc6-b525-7a8d-7621603895a1.png)

↓写真動画コレクション
![Screenshot_2018-04-17-10-45-01.png](https://qiita-image-store.s3.amazonaws.com/0/136977/48cf9cde-8f7b-6538-4efd-46b37bcbe5a0.png)

↓マップ（記録したGPS位置を保持）
![Screenshot_2018-04-17-10-45-19.png](https://qiita-image-store.s3.amazonaws.com/0/136977/ae24abba-b942-7fa7-eadc-692e6ce51004.png)

↓タグ付けによる抽出などが出来ます
![Screenshot_2018-04-17-10-45-30.png](https://qiita-image-store.s3.amazonaws.com/0/136977/53b32a5b-571d-f2e4-0e2b-5392c63b6873.png)

↓プレミアム版で出来ること
![Screenshot_2018-04-17-10-46-04.png](https://qiita-image-store.s3.amazonaws.com/0/136977/042444b4-39d3-b050-3f93-0f229f8e800e.png)

↓クラウド版で出来ること
![Screenshot_2018-04-17-10-46-10.png](https://qiita-image-store.s3.amazonaws.com/0/136977/13a27044-a3b0-3533-5463-08d8bfd33315.png)

↓設定画面１
![Screenshot_2018-04-17-10-46-31.png](https://qiita-image-store.s3.amazonaws.com/0/136977/e306f017-200e-26ee-508f-ba9175468d75.png)

↓設定画面２
![Screenshot_2018-04-17-10-46-36.png](https://qiita-image-store.s3.amazonaws.com/0/136977/1134d83f-c976-b6d8-7132-ad8ea027c25f.png)

↓設定画面３
![Screenshot_2018-04-17-10-46-42.png](https://qiita-image-store.s3.amazonaws.com/0/136977/0969cf3e-3f8e-f594-7757-f41e0ea225ac.png)

↓検索１
![searchView1.png](https://qiita-image-store.s3.amazonaws.com/0/136977/662dd14c-6eeb-89f4-a91c-f0c59a3dda95.png)

↓検索２
![searchView2.png](https://qiita-image-store.s3.amazonaws.com/0/136977/d02f892f-db56-f8e8-a754-89f8a6d5102e.png)

まだ１年弱のデータですが今のところサクサク快適に動きます。

---

## 課題
　紹介でご覧の通り、一覧として提示出来るビューがありません。パッと見て生活リズムが解消しているかどうかの判断が出来ないため、このデータを使いこなせていない（公式で機能実装して欲しいところ）

---

## 解決案
　以下の環境を有する事から図の様な構成を検討しました。
1. データを範囲指定してjsonでエクスポート出来ること
2. 既に購入してしまったこと…使わなければ勿体ない！
3. Javaとオブジェクト指向プログラミングの学習に丁度良い

　簡単にまとめると、エクスポートしたjsonを解析してデイリーのグラフを
作るということですね。UIをどうしようか検討したのですが、マルチデバイスで簡単に表示出来るブラウザを選択しました。ですので、HTMLとJavaScriptはメタプログラミング的に使用（Javaがソースコードを生成）することになります。ユーザーは、エクスポートとjsonファイルをプログラムに渡すことと、出力されたHTMLファイルを開くところは手作業を想定しています。

↓　アクティビティ図
![Activity of Journey Visualization.png](https://qiita-image-store.s3.amazonaws.com/0/136977/0324d59f-19b2-faf2-7869-1f397007e2c5.png)


↓プロトタイプ成果物（円グラフとして出力）
![journey-prototype-sample.png](https://qiita-image-store.s3.amazonaws.com/0/136977/91eb9956-4907-7232-f315-7e4bda29699c.png)

---

# 終わりに

と、いうことで納期や完成度を気にせずにゆっくりできます(∩´∀｀)∩
全て扱うと記事が長くなるのでポイント毎にまとめようかなあ。

次回はざっくりとしたクラス設計の話だと思います(`・ω・´)
【Javascript】要素のクリック位置を取得するクラス

#概要
この記事では、Javascriptを用いて、要素のクリック位置を取得するクラスを紹介しています。直交座標だけでなく極座標を用いたものもありますので、適宜ご利用ください。

#直交座標
```Point.js
class Point{
	constructor(x = 0, y = 0) {
		this.x, this.y; // public
		this.set(x, y);
	}
	
	set(x, y) {
		this._x = x;
		this._y = y;
	}

	on(event) {
		const rect = event.target.getBoundingClientRect();
		this.set(
			event.clientX - rect.left,
			event.clientY - rect.top
		);
	}
}
```

#極座標

```Angle.java
class Angle{
	constructor(degree = 0) {
		this._degree;
		this.degree = degree;
	}

	set radian(newValue) {
		this.degree = newValue * 180 / Math.PI;
	}

	get radian() {
		return this.degree * Math.PI / 180;
	}

	set degree(newValue) {
		let value = newValue;
		while(value < 0) value += 360;
		value %= 360;
		this._degree = value;
	}

	get degree() {
		return this._degree;
	}
}
```

```Point.java
class Point extends Angle {
	constructor(x = 0, y = 0) {
		super(0);
		this._r;
		this.set(x, y);
	}
	
	get x() {
		return Math.round(this.r * Math.cos(this.radian));
	}
	
	set x(newValue) {
		this.set(newValue, this.y);
	}
	
	get y() {
		return Math.round(this.r * Math.sin(this.radian));
	}
	
	set y(newValue) {
		this.set(this.x, newValue);
	}
	
	get r() {
		return this._r;
	}
	
	set r(newValue) {
		this._r = newValue;
	}
	
	set(x, y) {
		this.r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
		this.radian = Math.atan2(y, x);// arctan
	}

	on(event) {
		const rect = event.target.getBoundingClientRect();
		this.set(
			event.clientX - rect.left,
			event.clientY - rect.top
		);
	}
}
```

#おわりに
私の場合、極座標にも対応できるクラスを用いて、Canvas 要素のクリック位置を取得して、数値を導出したり色調を変更したりしています。
jsファイルにして使いまわすと便利です。

#参考資料
https://qiita.com/yukiB/items/31a9e9e600dfb1f34f76
https://qiita.com/yukiB/items/cc533fbbf3bb8372a924
C#からPowerShellコマンドの実行

Windowsサーバのパフォーマンスチェックアプリを作成する際に、PowerShellのGet-Processコマンドをダンプさせたかったので、
その調査内容のメモです。コンソールアプリケーションにコピペ->開始で動作します。コード詳細はコメントを参照願います。

```C#
using System.Diagnostics;
namespace ConsoleApp2
{
    class Program
    {
        // パワーシェルコマンド固定値定義
        const string ps_command = @"Get-Process | Get-Process | Sort-Object PM -Descending | Out-File -FilePath ";
        static void Main(string[] args)
        {
            // パワーシェルのGet-Processをダンプしたかったのでここで出力ファイル定義(可変)を実行させる。
            string option = ps_command + @"C:\temp\dump.txt";
            OpenWithArguments(option);  // メソッド呼び出し
        }
        //PowerShellの実行メソッド（引数:PowerShellコマンド)
        static void OpenWithArguments(string options)
        {
            Process cmd = new Process();
            cmd.StartInfo.FileName = "PowerShell.exe";
            //PowerShellのWindowを立ち上げずに実行。
            cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
            // 引数optionsをShellのコマンドとして渡す。
            cmd.StartInfo.Arguments = options;
            cmd.Start();
        }
    }
}
```
Intelligent KioskでAzure Cognitive Servicesのデモを触ってみる

MicroSoft Storeに[Intelligent Kiosk](https://www.microsoft.com/en-us/store/p/intelligent-kiosk/9nblggh5qd84?activetab=pivot%3aoverviewtab)なるソフトがあって、簡単にCognitive Servicesのデモができるらしい。
前はgithubからcloneしてビルドしないと使えなかったけど、よりお手軽にできるのでやってみる。

# やってみる

1. MicroSoft StoreからIntelligent Kioskを入手
2. 起動するとこんな画面が出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/231897/911a78cb-7a69-2dc8-23f6-8a8bbfcd3f9b.png)
3. 左上のメニューからSETTINGSページを開き、Face APIやComputer Vision APIといった各APIのKeyを登録する。APi Keyは予め、AzureのCognitice Servicesで該当のServiceを作成しておく必要がある。（今回はComputer Vision API Keyを入力します。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/231897/afe0c1fe-fa32-54b5-44d5-e5ad3965d716.png)
4. API Keyをセットできたら、左上メニューからDemosページを開き、今回はComputer Vision APIを利用するので、Vision API Explorerを選択します。（自転車のサムネのやつ）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/231897/70b21794-1719-44b7-b668-438587305858.png)
5. Vision APIを使うページになるので、右上の地球マークから適当に画像を拾ってきます。それで実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/231897/d8e7a5dc-e10c-d967-2fda-d9d6b93e0b8c.png)
6. すぐに画像解析結果が表示されます。写真上には、顔認識した範囲と性別、年齢、右側には、タグ（personである確率は100%とか）、説明（ベンチに座っている人である確率90%とか）、セレブリティ（著名人だったらその確率）、色、OCRが取れるみたいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/231897/b6a621f5-6c0a-03c4-b8cd-2f7a119cd73e.png)

というように、このDemosで選べるServiceについては簡単にお試しすることができそうです。
もう少し詳しく、どういう仕組みで動いてるのか、何がどう取得できるのか、は[公式ドキュメント](https://westus.dev.cognitive.microsoft.com/docs/services/56f91f2d778daf23d8ec6739/operations/56f91f2e778daf14a499e1fa)で調べる必要はありますが、こういうことができるという確認にはなりそうです。
【tutorial】Bitbucketのアカウントを作成

2018/4/17に実施。

１．Eメールを入力して「Continue」をクリック。
https://bitbucket.org/account/signup/
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/0927f339-358f-95a2-ad4a-d578caca1b37.jpeg)

２．登録したアドレスにメールが届いているので「Verify my email address」をクリック。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/5903ff6a-c237-b789-003b-327b731cdad1.jpeg)

３．ユーザー名を入力して「続行」をクリック。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/e5cbd4f4-e2c8-52c0-c1b9-2461f3c04653.jpeg)

終わり。
C#でドライブ毎のディスク容量と空き容量取得

Windowsサーバのパフォーマンスチェックアプリを作成する際に、HDD空き容量も取得する処理を実装するときに調べた自分メモです。
コンソールアプリケーションにコピペ->開始で動作します。コード詳細はコメントを参照願います。

```C#
using System;
using System.IO;
using System.Collections;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // トライブすべてを取得
            string[] drives = Directory.GetLogicalDrives();
            //　foreachで取得したドライブ配列にループ
            foreach (string s in drives)
            {
                Hashtable data = new Hashtable();
                DriveInfo drive = new DriveInfo(s);
                //ドライブの準備ができているか調べる
                if (drive.IsReady)
                {
                    //TotalSizeを取得して変換してHashに格納。
                    data.Add("TotalSize(" + s + "):", ToGigaByte(Convert.ToDouble(drive.TotalSize)));
                    //TotalFreeSpaceを取得して変換してHashに格納。
                    data.Add("TotalFree(" + s + "):", ToGigaByte(Convert.ToDouble(drive.TotalFreeSpace)));
                }
                foreach (DictionaryEntry h in data)
                {
                    Console.WriteLine(h.Key + " " + h.Value);
                }
            }
            Console.ReadLine();
        }
        // GB換算して戻すメソッド(見やすさ優先)
        static int ToGigaByte(Double calcTarget)
        {
            Double i = calcTarget / 1024; //Kbyte
            i /= 1024; //MB
            i /= 1024; //GB
            i = Math.Ceiling(i);
            return Convert.ToInt16(i);
        }
    }
}
```
[3分でわかる]GoogleOptimize導入〜ABテスト開始〜レポート確認までのフロー

WebサイトのABテストツールの一つである「Google Optimize(グーグルオプティマイズ)」の導入方法・使い方の流れについて解説します。

詳細については[こちらの記事(無料A/BテストツールGoogle Optimizeの利用・検証方法、実践事例)](https://tech.tabilabo.co.jp/353/)に詳しく載っています。
特に「導入方法、ターゲット設定方法、テストパターン作成方法、レポートの見方」などについて、細部まで盛り込んだ内容になっています。

それでは本題に入ります。
流れは大きく分けて3フェーズあります。

**~ 導入 ~**
*1. Google Optimizeアカウント登録
2. Google Analytics連携
3. WebサイトにJSスニペットを追加
4. ブラウザ(Chrome)にGoogle Optimize専用の拡張機能(アドオン)をインストール
  ⇨デザインを編集する際に必要です。*

**~ 使い方 ~**
*1. テスト作成
\_\_1-1. テスト作成(テスト名の入力..etc)
\_\_1-2. デモ画面で用いるURLを設定
2. 条件設定
\_\_2-1. 目標設定
\_\_2-2. ターゲット設定
3. テストパターン作成
\_\_3-1. テストパターンの作成(パターン名の入力..etc)
\_\_3-2. パターン毎にデザイン作成・適用(HTML, CSS, Javascript, Jquery)
4. プレビュー機能で各パターンのデザインを最終確認
5. テスト開始*

**~ レポートの見方 ~**
*1. GoogleAnalytisでのレポート確認
\_\_1-1. GoogleAnalyticsログイン
\_\_1-2. サイドメニュー(行動)>ウェブテストからレポート確認
2. GoogleOptimizeでのレポート確認
\_\_2-1. GoogleOptimizeログイン
\_\_2-2. テスト詳細画面からレポート確認*

- - -

いかがでしょうか。流れを把握できましたでしょうか？

Google Optimizeは無料で利用できるので、
真剣に検討されている方も、とりあえずちょっと触ってみたいという方も気軽にまずは利用してみるとよいかと思います。
無料なのに色々できすぎてびっくりするかと思います！

それでは、ご覧いただきありがとうございました！
riot.js classのon off

### vueのようにfalsyを判定しclassのon,offが出来る。
```js
class="{isRed:item,isGreen:!item}"
```
### ただ状態が多数あった場合には記述が複雑になるためclassList.addに頼ることになる。

### 全部
```html
<script src="//gnjo.github.io/riot.js"></script>
<t></t>

<style>
b{font-weight:normal;font-size:14px;width:14px;height:14px;
display:inline-block;line-height:1;
border:1px solid transparent;
}
.isRed{background-image:url('https://icongr.am/clarity/times.svg?size=14&color=ff0000')}
.isGreen{background-image:url('https://icongr.am/clarity/check.svg?size=14&color=aaaaaa')}
b:hover{border:1px solid;}
[box]{font-size:0} 
</style>
```
```js
riot.tag(
`t`,`<div box><b each="{item in items}" class="{isRed:item,isGreen:!item}"></b></div>`
,function(opts){
 this.items=opts;
});

let data=Array.from({length:300}).map(d=>Math.round(Math.random()));
riot.mount('t',data)
```
tensorflow.jsでsin　その２

#概要
tensorflow.jsでsin問題やってみた。
modelを使わないで、やってみた。


#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/3cbbd4af-0656-f2f3-9624-15213fba1ef4.png)


#サンプルコード

```
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function draw(data, n) {
	var hc = n * 100 + 100;
    ctx.strokeStyle = "#f00";
    ctx.lineWidth = 1;
	ctx.moveTo(0, hc);
    for (var i = 1; i < 20; i++) 
    {
        ctx.lineTo(i * 10, hc - data[i] * 30);
    }
	ctx.stroke();
}
tx = [];
ty = [];
for (var i = 0; i < 20; i++) 
{
    var x = i / 3.0;    
    var y = Math.sin(x);
    tx.push(x);
    ty.push(y);
}
draw(ty, 0);
const train_x = tf.tensor1d(tx);
const train_y = tf.tensor1d(ty);
const w = tf.variable(tf.randomNormal([20], 0, 1));
const b = tf.variable(tf.zeros([20]));
const optimizer = tf.train.sgd(0.1);
function loss(pred, ypred) {
  	const cost = pred.sub(ypred).square().mean();
  	return cost;
}
function func(x) {
  	return w.mul(x).add(b);
}
for (let i = 0; i < 200; i++) 
{
    optimizer.minimize(() => {
      	const loss_var = loss(func(train_x), train_y);
      	loss_var.print();
      	return loss_var;
    })
}
const preds = func(train_x).dataSync();
draw(preds, 1);



```

#成果物

http://jsdo.it/ohisama1/ygeE1

以上。
rails コマンド 覚書


# 基本のコマンド
プロジェクト作成

```r
$ rails new app_name
```

サーバー起動

```r
#　どちらでも使える
$ rails server
$ rails s
```

コントローラー・モデル作成

```r
#　どちらでも使える
$ rails generate controller controller_name action_name
$ rails g model model_name column_name:type
```

# rails console
モデル作成+保存 `new` + `save`

```ruby
> Post.create(title: "hoge", content: "hogehoge")
```


テーブル一覧確認
出典 https://qiita.com/littlekbt/items/4847a6b73050bfc4a46e

```ruby
> ActiveRecord::Base.connection.tables
```


レコードの有無確認
出典 http://o.inchiki.jp/obbr/146

```ruby
> Post.exists?
#ある
=> true
#ない
=> false
```


終了する

```ruby
#　どちらでも使える
> quit
> exit
```

# rails dbconsole

テーブル一覧確認

```ruby
sqlite> .table
users            posts
```

テーブルの中身確認

```ruby
sqlite> select * from <テーブル名>;
```


終了する

```ruby
#　どちらでも使える
sqlite> .quit
sqlite> .exit
```
AWSのアーキテクチャ図を描けるサービスいろいろ


弊サービスのアーキ図を描く必要があったのでいくつか調べてみました。
どのサービスも画像エクスポートは対応しています。
今回は見やすさと手軽さ的にCacooで描きました。

## サービス目次
 - Cacoo
 - Cloudcraft
 - Cloudcraft Live
 - Hava


## Cacoo
https://app.cacoo.com/
QiitaとかJAWS-UGとかでよく見る構成図が描けます。

![32e292d7-160c-7096-f0d7-c6a380060541.png](https://qiita-image-store.s3.amazonaws.com/0/79598/a6e094b5-3494-3f18-70ed-5fc8fcaa42df.png "32e292d7-160c-7096-f0d7-c6a380060541.png")



## Cloudcraft
https://cloudcraft.co/
AWSが公式リファレンスで使っているような構成図を描けるのが特徴です。
使い勝手はかなりよくてポチポチしてるだけで描けます。
あとインスタンスをクリックすると料金を表示してくれてすごい。

![d421af3c-239b-1586-b00b-d98f1c80ca0d.png](https://qiita-image-store.s3.amazonaws.com/0/79598/ad633ba9-5fed-e0dd-aec4-cbc1a56e63ea.png "d421af3c-239b-1586-b00b-d98f1c80ca0d.png")

設定手順は[こちら](http://dev.classmethod.jp/cloud/aws/cloudcraft-draw-diagrams/)から

## Cloudcraft Live

上記の Cloudcraft に追加された機能です。
実際にAWSから構成をインポートして自動生成してくれる(!)
AWS側でReadOnlyのIAMロールを作成してCloudcraftに渡して読み込ませるという流れのようです。
設定手順は[こちら](http://dev.classmethod.jp/cloud/cloudcraft-live/)から

## Hava
https://www.hava.io/

こちらもAWSからインポートして自動で生成してくれます。
流れもCloudcraft Liveと同様、ReadOnlyのIAMロールを読み込ませます。
CloudFormationテンプレートから作成することも可能。
2016年7月現在は以下のサービスにしか対応してない模様。

 - VPC(Subnet, Route Table, Security Group)
 - ELB
 - EC2
 - RDS
 - Elasticache
Macでネットワーク回線に帯域制限をかける方法

## 利用目的・背景
3G回線やネットが遅い時のWeb、スマホアプリの表示や動作を確認するときなどに。
ネットを探すと`ipfw`コマンドや`SpeedLimit`というアプリ等が情報として出ますが、
MacのYosemite以降ipfwコマンドがインストールされていなかったりして使えません。
そこで登場するのが Network Link Conditioner(Apple公式アプリ) です。

## インストール方法
1. Apple Developer Programにアクセス  
※Appleのディベロッパーアカウント(登録無料)が必要になります。
1. download > See more downloads > 左側の検索欄に[Hardware IO Tools] > dmgファイルをダウンロード  
こちらの[リンク](https://developer.apple.com/download/more/?name=Hardware%20IO%20Tools)からでもいけます。  
※いくつかバージョンが有りますが基本的に最新版で問題ないと思います。
1. dmgを開いた中にある[Network Link Conditioner.prefPane]を選択するとシステム環境設定に追加されます。

## 使い方
システム環境設定 > Network Link Conditionerで管理画面を起動します。<img width="780" alt="スクリーンショット 2016-08-22 10.48.33.png (198.3 kB)" src="https://img.esa.io/uploads/production/attachments/4357/2016/08/22/13897/260435ca-48de-4396-9565-b8e6f1c3598b.png">
ON/OFFのトグルを操作して動作を制御出来ます。
Profileで指定した設定に基づき帯域を制限します。
Profileの設定はManage Profilesから行います。
<img width="780" alt="スクリーンショット 2016-08-22 10.52.55.png (172.3 kB)" src="https://img.esa.io/uploads/production/attachments/4357/2016/08/22/13897/500a9c62-e2c3-4589-aaa7-c47e1f716771.png">

ONにすると実際に制限がかかります。
以下参考として通常時とProfile 3Gでの速度の計測結果を貼っておきます。

---

通常
<img width="416" alt="スクリーンショット 2016-08-22 10.39.27.png (66.9 kB)" src="https://img.esa.io/uploads/production/attachments/4357/2016/08/22/13897/ff9e890c-4319-4906-903c-75d918e68a32.png">

---

3G
<img width="415" alt="スクリーンショット 2016-08-22 10.55.53.png (67.9 kB)" src="https://img.esa.io/uploads/production/attachments/4357/2016/08/22/13897/af77ebf4-37ad-4f01-bbb7-2babbdb576f9.png">

`68.29Mbps`から`282.53Kbps`まで低速になりました！
スクラムのそれぞれの役割をを超絶簡単に記述

## スクラムのそれぞれの役割をを超簡単に記述

DEVは
1. 業界の分析を行う
2. どうやったらプロダクトがよくなるか考える
3. POを話して実際にどうやるか考える
4. 開発する、知識を蓄える
5. DEVとPOでレビューして、方針を相談する。
(1に戻る)

SMは
1. チームがより高い生産性になる様に考える
2. 1のできない要因を解決する

POは
1. プロダクトがよくなるように、DEVと相談し、決定する
2. 何から作るかDEVと相談し、決定する


## つまり
DEV. プロダクトの事を一番考える存在
SM.  DEVがやりやすい環境を一番考える存在
PO.  プロダクトが投資家の要望に応えれているか、方針が間違っていないかを一番考える存在



## 異論は是非コメントください！
c#の勉強

まずどのようなプログラミングがあるのか書店に行く。
そこでC言語を覚えれば大体のプログラミングの応用がつくことを知る。

本を見ながらやるのが向いてないので手を動かすpaizaというプログラミングを学べるサイトを知って無料で
１から勉強中です。

どれだけ手間をかけずにできるかショートカットを覚えていきたいです。
文末に飛びたい時にwindowsのショートカットキーEndのボタン以外でいい方法ないですか？


今はプログラミングでC#を覚えてBitcoin botを作成したいです。
pythonでもbot作ってる人多いですね。
AIとかディープラーニングと聞いて機械が学び成長するところが面白そうだなと感じます。


そしてbotを売り出したいです。
mql5 function not definedエラー

mql４からmql５へインジケータの移植を試みた際に、mql5のコンパイル時、下記のようなエラーが表示されました。
おそらくハンドルネームの定義についてのエラーだと思いますが対処方法が全く理解出来ません。
ご存知の方がいらっしゃいましたら、ご教授宜しくお願いします。

if(id == CHARTEVENT_OBJECT_CLICK)
{
   if(sparam == indiName + Pair1)
/* ChartChange(Pair1); */     (/* */の間がエラー行です。）

※エラー表示
’ChartChange’-function not defined

お願いします。
SimpleDateFormat("yyyyMMdd_HHmmss")で警告


## 警告が出た

下のコード書いてたら警告が出た。

```kotlin
val sf = SimpleDateFormat("yyyyMMdd_HHmmss")
```

## 解決

```kotlin
val sf = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.JAPANESE)
```

どうやら、どの国の時間を設定するかを指定したほうがいいみたい。
情報処理技術者試験やその他の資格のレビューその①

　ネット上では、宣伝の為か、実際と大きく間違った内容が流されています。
　特に、5ch(旧2ch)では、日商簿記2級や実用英検2級と基本情報が同等の難易度でそのくらいの価値しかないなど噂を粘着コピペ荒らしして世間的に広めている人が数人いるようです。
　結論から言わせてもらえば、日商簿記2級や実用英検2級と同じ資格手当しかもらえない企業には入社しないことをお勧めします。
　なぜならば、いわゆる文部科学省で後援している公的検定は簿記検定や英検に対応できる検定として、情報系にもJ検という由緒正しき検定資格があるからです。グレード的に同等の検定試験を意識的につくられている様です。ですから受験者のレベルも日商簿記や実用英検と大差ありません。にもかかわらずわざわざわざ情報処理技術者を引き合いに出す必要は無いでしょう。
　「グレード的に同等」とは何かと申しますと、仮に経理関係の専門学校生が、日商簿記3級を受験する頃、情報系の専門学校生なら旧情報処理活用能力検定3級(旧J検3級)あたりを受験する頃だということです。現行では情報活用試験2級のあたりとみてよいでしょう。
　日商簿記2級を受験する頃、旧J検2級か準2級のあたりを受験しているでしょう。
　このように情報系資格には簿記や英語と同じようなステップアップができるように、同じように文部科学省が検定試験を設定しているということです。そしてその存在を無視して情報処理技術者試験を評価することはあまりにも横暴です。

　私は高校時代からいわゆる資格マニアをやっていまして10年あまり様々な資格の勉強をしました。IT関連職に携わる方や、IT関連事業の人事の方は実際にはあまり資格の勉強をやっておられず、資格予備校や世論で流されるものをそのまま一時金や資格手当の評価として採用してしまうことが多いでしょう。しかし、残念ながらそれはやめておいた方がよいです。なぜならばネット上で流される噂や一部の企業が流す噂はたとえ資格予備校であったとしても、あてにしないことをお勧めします。というのも、大量に情報を流すことで世間的な評判を操作することを目的とした情報が多いからです。だから実際とは大きく異なるなんてことがよくあります。

　また個人のレビューだからあてにならないという人がいますが、
学校や利害関係となる組織の宣伝の方があてになると考えているならやはりそれは間違いです。
なぜならば、学校や企業は利害関係があるから宣伝やキャッチコピーを作成して鼠算式に広めるのであり、一部の私情(利害関係)によった噂は基本的には誇張が入っているからです。

　例えば、LECやTACなど経理関係の学校は主に、会計士をブランド化して簿記の講座を売っていて会計士や簿記の資格が世間で陳腐に扱われるのを嫌います。
　そこで、簿記の資格を少し良く評価し宣伝します。
　具体的には、簿記2級は宅建と同等、簿記1級はマンション管理士(以下略：マン管)と同等というような内容です。
　しかし残念ながら、宅建の難易度や価値は、簿記2級ではなく簿記1級の方が近いくらいです。
マン管の難易度はそれを数倍凌ぐ程度とみて間違いありません。税理士、会計士、FP1級、中小企業診断士(診断士)のあたりが近いでしょう。
　マンション管理士が、簿記1級や2級と同等なんて噂はこれっぽっちもあてにならないということです。
　では何を基準に「難易度は簿記1級を数倍凌ぐ程度」言えるのかと申しますと資格歴、職歴、学歴といった受験者の経歴面と、試験自体の合格率を基準にした場合です。
　もちろん、すべて事実の数値であり定量化された客観的なデータを対象にしてです。
　しかし、簿記を宣伝する企業はこれらの客観的な数値を示さずに〇〇と同等、〇〇より難しいと印象操作ばかりしています。つまりあまり経験を積んでいない生徒や学生の「感情」を誘導するために事実とは異なることを宣伝しているということです。人はこれを「洗脳」と呼びます。
　
　　マンション管理士の受験者層は、宅建か管理業務主任者(以下略：管業主)のいずれかを持っている人が80%以上に上ります。また、他の不動産系資格の保持者も多く、区分所有管理士、マンション維持修繕技術者、土地家屋調査士、建築物環境衛生管理技術者、建築設備士といったいずれかの合格者もおりかなり受験者の資格歴は高いです。
　マンション管理士の受験者の平均年齢は46歳。日商簿記1級の受験者は平均年齢26歳なので、20歳も上回ります。
　中小企業であれば、部長や課長と係員(班員)の差くらいあるかもしれません。
　また合格率だけ見ても、マンション管理士は受験者の合格率8%、志願者の合格率は4~5%で年1回実施しています。1年間に20人の応募者のうち1人しか合格しない極めて難しいというのが事実です。
　逆に日商簿記検定1級はというと、80%以上が日商簿記2級か全経簿記1級のいずれかの合格者で構成されていますが日商簿記3級や全経簿記2級しか取れていないという人も少数おります。全経簿記上級がとれているケースも少ないです。また会計士や税理士が受験するケースは極わずかで多くても2%未満と言われています。受験者の合格率は10%、志願者の合格率は7%で年2回実施しています。仮に100人の応募者がいた場合、単純計算で14人前後が合格する資格ということです。
　合格率と年間実施回数だけでも3倍はマンション管理士の方が受験の期間がかかりそうです。
また、実務経歴面では新人と管理職の差くらいあります。実務年数については仮に大学卒業後22歳から働き始めた場合、マンション管理士は24年、日商簿記1級は4年といったところでしょうか。6倍はマン管の方があろうかというところです。こうなってくると会計士(8年)や税理士(12年)ですら霞んで見えます。
　ちなみに、実質マンション管理士の下位試験扱いの管理業務主任者、区分所有管理士、マンション維持修繕技術者なども20代後半から40代前半くらいの人が受験者のボリュームゾーンで簿記1級の受験者を圧倒しているくらいです。

　ですから、いくら資格予備校がマンション管理士は簿記1級と同等とか、管理業務主任者が簿記2級と同等とかうたっても決して鵜呑みにすることはやめましょう。

　また、講義時間でその資格の難易度を判断するのもやめましょう。
その理由としては、儲かる資格の講義時間は沢山確保します。育成が簡単で合格がほぼ約束される資格だからこそ、沢山の講義時間を確保するということもあります。
　難関資格は受講者も少なくなり逆に資格予備校でも儲からないので、通信教材だけとか極力削減した講義時間だけで対策を行うケースが多いのです。
　仮に、ナガセという資格予備校では、日商簿記2級と管理業務主任者はおよそ200時間あまりの講義時間を取りますが、合格までの期間が同じというわけではなく、日商簿記の方が人気があり受講者が多く、学校側も元を取りやすいからというのが経営戦略上の狙いです。

　学校側も醜いアヒルの子は切り捨てたいという気持ちで、業務削減のために不動産系国家資格は受講させないで簿記講座の受講へと受験者を誘導したいのです。簿記の講座へと業務プロセスを一貫するために、結果的にさきにあげたとおり鼠算式に、不動産資格への悪口や過小評価が増え、簿記の贔屓が多くなるのです。また受験者が減少傾向にある昨今ではますますこの傾向が強くなっています。
　情報系資格についても不動産系資格と同じような経過をたどっています。
GCP TerraformからGCEインスタンスをGPUありで立ち上げる

検索しても、見つけにくかったのでメモ

tfファイルのに以下のように記述するとOKでした
今回は台湾リージョン[asia-east1]を選択
リージョンによりサポートされるtypeは異なるのかもしれません

下記schedulingも必須です、TERMINATEにしないとエラーが出ました
（ライブマイグレーションではないから？）

```
  guest_accelerator {
    type = "nvidia-tesla-k80"
    count = 1
  }
  scheduling {
    on_host_maintenance = "TERMINATE"
  }
```

### tfファイル全体例（インスタンスに関する部分のみ）

```
resource "google_compute_instance" "gpu11" {
  name         = "gpu11"
  machine_type = "n1-standard-4"
  # zone         = "asia-east1-a"
  zone         = "${var.region_zone}"
  tags         = ["testserver", "backend"]

  guest_accelerator {
    type = "nvidia-tesla-k80"
    count = 1
  }
  scheduling {
    on_host_maintenance = "TERMINATE"
  }

  boot_disk {
    initialize_params {
      size  = 500
      type = "pd-standard"
      image = "ubuntu-1604-lts"
    }
  }

  # proisionerを使っているので未使用
  #metadata_startup_script = "${file("shells/startup.sh")}"

  network_interface {
    network = "default"
    # address    = "192.168.10.2"
    # subnetwork = "${google_compute_subnetwork.subnet1.name}"
    access_config {
      # static external ip
      nat_ip   = "${google_compute_address.gpu11.address}"
    }
  }

  metadata {
    "block-project-ssh-keys" = "true"
    "sshKeys" = "${var.ssh_keys}"
  }
}
```

- gcpでのgpuドライバとツールのインストールについて

https://cloud.google.com/compute/docs/gpus/add-gpus?hl=ja#install-gpu-driver

- gpuの状態を表示してくれるコマンド

```
$ nvidia-smi
Tue Apr 17 01:04:02 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 00000000:00:04.0 Off |                    0 |
| N/A   29C    P8    29W / 149W |     16MiB / 11441MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1769      G   /usr/lib/xorg/Xorg                            15MiB |
+-----------------------------------------------------------------------------+
```

- topのように更新しながら表示するには

```
watch -n 0.5 nvidia-smi
```
docker-compose パス指定 メモ

いつも忘れてドキュメントを見直すのでメモ。

### docker-composeでDockerfileという名前以外をbuildする時

```bash
version: '3'
services:

  testfs:
    build:
      context: .
      dockerfile: "Dockerfile003" #Dockerfile003をbuild
  ...
```

### docker-compose.ymlという名前以外を実行する時

`--build`はupのときにbuildを実行する。

```bash
$ docker-compose -f docker-compose003.yml up -d --build
```
Ubuntuで chkconfig <service> on をやりたい場合

昨今のUbuntuはchkconfigが入っていない。
ので、

```bash
chkconfig <service> on
```

をやりたい場合は↓のように `update-rc.d` を使用する。

```bash
update-rc.d <service> defaults
```

# 環境
- `Ubuntu 16.04 LTS`
共有フォルダに Git 中央ベアリポジトリを置く

## ユースケース

Git を使ったチーム開発では P2P のソース共有ではなく、どこかに中央リポジトリを置いて運用していると思います。ネットで情報を探すと SSH サーバを立てて運用するサンプルがたくさん見つかります。git clone --bare --shared 云々です。

セキュリティ的にそれが理想ですし、さほど手間ではないというのも間違いない。

しかし環境的にそうしたことが許されなかったり、ごく小規模なチームでライトな運用をしたいという要件もあるでしょう。ファイルサーバ上の共有フォルダにベアリポジトリを置き、それを中央リポジトリと見立てて運用をしたい場合です。

この場合、git clone --bare --shared ... だと上手くいきません（でした）。以前調べた際にまとまった手順のサンプルを見かけなかったので上手くいった方法を記しておきます。

## 手順

手順の大枠を書くと、一旦共有フォルダに空のベアリポジトリを作成し、そこに向かって開発したソースを push します。

### 共有フォルダに移動する

```
cd //sharedComputer/sharedFolder/
```

### 空のベアリポジトリを作る

```
mkdir my_project.git
cd my_project.git
git init --bare --shared=true
touch git-daemon-export-ok
```

### ローカルに移動する

```
cd ~/path/to/local/git/workspace/my_project/
```

### リモートを設定する

```
git remote add origin //sharedComputer/sharedFolder/my_project.git
git push --set-upstream origin master
```

### 必要なブランチを push する

```
git push origin master
git push origin development
```
Django2 ログイン中のユーザ名を表示する

Djangoでwebアプリを開発するときに、ログインしているユーザー名を表示したい時があると思います。

今回は、そのログインユーザー名を表示するコードをご紹介します。

```任意のファイル.html
{% if user.is_authenticated %}
<p>{{ user.get_username }}でログイン中</p>
{% else %}
<p>ログインしていません</p>
{% endif %}
```

たったこれだけです。
これをHTMLファイルに追加してください。

簡単ですね。
Tornado で ブロッキング処理をノンブロッキング処理化する

# Overview

[Tornado](http://www.tornadoweb.org/en/stable/index.html)を使って
非同期処理を作るときには、対象のサービスを非同期化する必要がある。

その方法はいくつか方法があるが、最も最初に記載されているのが
**@tornado.gen.coroutine** を使う方法だ。

[これ](http://www.tornadoweb.org/en/stable/gen.html
)にを使うことで、重たい処理をしていても次の処理を受け付けられるようになるということだが
例として記載されている方法は、tornadoに組み込まれている非同期処理ライブラリを使っている。
従って、外部コマンドを呼び出すなど、完全独自でブロッキング処理が入っている場合はどうすれば良いのか良く分からない。

そのための解が分かったので記載する。

http://www.tornadoweb.org/en/stable/faq.html

具体的には3.を使うことになるが、丁寧にもloopを書いてしまっているので混乱しがちだった。
従って、単純にこうすれば良い、という例を書いておく。

## 単純な例

基本形は以下の通り。

```
import tornado.concorrent
import time

@gen.coroutine
def run(time):
    yield executor.submit(time.sleep, time)
    return 
```

time.sleep を呼び出す関数に置き換える。
つまりこういう感じ。

```
import tornado.concorrent
import time

def long_time_func(time)
    time.sleep(time) # 重たい処理
    result = time    # とりあえずreturn value を定義
    return result

@gen.coroutine
def run(time):
    yield executor.submit(long_time_func, time)
    return 
```

とまあ、こんな感じ。
後は、 yield で run()を呼び出してやれば良い。