OmniAICreator/Qiita-1.07M huggingface dataset:
iMessageの吹き出しみたいなグラデーション


![cssgradiendimes.png](https://qiita-image-store.s3.amazonaws.com/0/149688/bec20a59-e7df-22f7-2c74-f8ff9b22afe1.png)

iMessageみたいに、スクロールしても複数の要素で固定されたグラデーションの背景をつけるものです。
小一時間悩みましたが、ものすごく初歩的なことでした。

```
background-attachment:fixed;
```
を設定するだけです。
```background-position```で位置の調整をしています。

##コード
### SCSS
```
.stack {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  .comment {
    font-family: sans-serif;
    color: #fff;
    padding: 1em;
    margin: .5em 1em;
    text-align: right;
    background: linear-gradient(-180deg, #2EB5FE 0%, #157EFB 100%) fixed top right;
    border-radius: 13px;
  }
}

``` 

### HTML

```
<div class="stack">
  <div class="comment">・・・</div>
</div>
```

##サンプル
### JSFiddle
<a href="https://jsfiddle.net/kurogedelic/s6Lxg7eb/2/">iMessage like comment gradient</a>

<script async src="//jsfiddle.net/kurogedelic/s6Lxg7eb/2/embed/html,css,result/"></script>
Goでのアルゴリズムクイックリファレンス第2版(幅優先探索)

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。[アルゴリズムクイックリファレンス 第2版](https://www.amazon.co.jp/gp/product/4873117852/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117852&linkCode=as2&tag=amesho-22&linkId=b7688201ae37a6234596fa96dfd3ccdd)を読んで各種アルゴリズムをGoで実装して行きます。

前回: [Goでのアルゴリズムクイックリファレンス第2版(深さ優先探索)](http://qiita.com/amesho/items/42aa6b7f2afd293080a2)

今回は[幅優先探索](https://ja.wikipedia.org/wiki/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2)

> 幅優先探索（はばゆうせんたんさく、英: breadth first search）はグラフ理論(Graph theory)において木構造(tree structure)やグラフ(graph)の探索に用いられるアルゴリズム。アルゴリズムは根ノードで始まり隣接した全てのノードを探索する。それからこれらの最も近いノードのそれぞれに対して同様のことを繰り返して探索対象ノードをみつける。「横型探索」とも言われる。

https://play.golang.org/p/Vria057xMc

```go
package main

import (
	"container/list"
	"fmt"
)

type Graph struct {
	List []int
}

func BreadthFirstSearch(g *[]*Graph, n int, visited *[]int) {
	(*visited)[n] = 1

	q := list.New()
	q.PushBack(n)

	for {
		if q.Len() == 0 {
			break
		}
		n := q.Remove(q.Front())
		fmt.Printf("n:%d\n", n)
		fmt.Println(*visited)
		for _, v := range (*g)[n.(int)].List {
			if (*visited)[v] == 0 {
				(*visited)[v] = 1
				fmt.Printf("\tn:%d->%d\n", n, v)
				q.PushBack(v)
			}
		}
	}
}

func main() {
	g := make([]*Graph, 0)
	g = append(g, &Graph{[]int{5, 6}}) // 0
	g = append(g, &Graph{[]int{3, 4}}) // 1
	g = append(g, &Graph{[]int{1}})    // 2
	g = append(g, &Graph{[]int{4}})    // 3
	g = append(g, &Graph{[]int{3}})    // 4
	g = append(g, &Graph{[]int{0}})    // 5
	g = append(g, &Graph{[]int{7}})    // 6
	g = append(g, &Graph{[]int{2}})    // 7

	visited := make([]int, len(g))
	BreadthFirstSearch(&g, 0, &visited)
}
```


次回はダイクストラ法です。
[checkio] Common Words

忙しくて放置気味だったけど、久しぶりに。
お題は引数として渡された２つの文字列から、両方に登場している単語をアルファベット順に直して返すというもの。

例)
"one, two, three", "two, four, three"
  => "three, two"

1０分やと最初は思ったけど、なんやかんやのつまづきがあって、90分くらいかかった。悲しい

###自分の回答
```js
function commonWords(first, second) {
    
    //variables
    let answer = [];
    let answer2 = '';
    let s1 = first.split(",");
    let s2 = second.split(",");
    
    for (let i of s1) {
        for (let j of s2) {
            if (i === j) {
                answer.push(i);
            }
        }
    }
    answer.sort(function(a,b) {
        if( a < b ) return -1;
        if( a > b ) return 1;
        return 0;
    });
    answer2 = answer.join(',');
    console.log(answer2);
    return answer2;
}
```
無念である。なんなのだこれはどうすればいいのだ！
後々調べてわかったのは、sortは比較関数を渡さなかったら、辞書順にソートするデフォルトが備わってたらしい。

###すごいかいとう

```js
function commonWords(first, second) {
    return first.split(",").filter(x => second.split(",").includes(x)).sort().join(",");
}
```
そう、書きたかったのはこういうやつ・・・美しい。
なるほど、やってる処理はほぼ一緒だけど、filterのcallbackがミソぽい。

###学び
*sort(compareFunction)*

- 引数に比較関数を渡して並べ替えの処理内容を指定することができるが、指定しなければ数字は昇順、文字列は辞書順に並べ替えてくれる。

*join(attr)*

- 配列の要素をattrで区切った文字列に連結する。省略すれば、カンマで区切る。

*includes(attr[, fromIndex])*

- 配列に引数の要素が含まれているかを調べて真偽を返す。fromIndexで検索を開始する位置を指定できて、マイナスを渡せば最後からの検索になる。配列だけでなく、文字列のような要素に対しても使える。

```js
let i = "one";
i.includes('one');     //true

let i = "onetwothree";
i.includes('one');     //true
```

###反省
チェインの処理を今度書いてみる。
Node-REDでA3RT APIを使うときのハマりどころ

## A3RT
A3RTとはリクルートが提供している機械学習やディープラーニングを用いたソリューションAPI群です。
ちなみに「アート」と発音します。APIを叩くだけで分析などをしてくれるのですが、Node-REDからこのAPIを呼び出すときにハマったところがあったのでメモ
[https://a3rt.recruit-tech.co.jp](https://a3rt.recruit-tech.co.jp)

## ハマりどころ
通常のNode-REDでAPIを叩くようにすると
```
apikey is null
```
が返される！

## 解決法
![Node-RED : jp-node-red.japaneast.cloudapp.azure.com 2017-08-02 12-39-24.png](https://qiita-image-store.s3.amazonaws.com/0/149212/8c7f8ffe-76e1-19ab-f47c-2dee502225bb.png)
msg.headers の "Content-Type"を"application/x-www-form-urlencoded"に指定しましょう。

フロー全景はこんな感じ
![Node-RED : jp-node-red.japaneast.cloudapp.azure.com 2017-08-02 12-41-00.png](https://qiita-image-store.s3.amazonaws.com/0/149212/a04111d7-8fa7-e530-66a2-3726fd2f5646.png)


##　コード
以下はTalk APIを呼び出しています。

```
[{"id":"21ed046f.72f514","type":"inject","z":"69f4e0e9.4561e","name":"処理実行","topic":"","payload":"{}","payloadType":"json","repeat":"","crontab":"","once":false,"x":65,"y":20,"wires":[["6b32188c.f4e86"]]},{"id":"3339c4a1.9774c4","type":"http request","z":"69f4e0e9.4561e","name":"POST","method":"POST","ret":"txt","url":"https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk","tls":"","x":259,"y":145,"wires":[["3edabb6c.c78544"]]},{"id":"25d460be.2f7e7","type":"debug","z":"69f4e0e9.4561e","name":"結果表示","active":true,"console":"false","complete":"payload.results[0].reply","x":485,"y":256,"wires":[]},{"id":"3edabb6c.c78544","type":"json","z":"69f4e0e9.4561e","name":"","pretty":false,"x":358.5,"y":195,"wires":[["25d460be.2f7e7"]]},{"id":"6b32188c.f4e86","type":"function","z":"69f4e0e9.4561e","name":"リクエスト作成","func":"msg.payload = {\"apikey\":\"yourapikey\",\"query\":\"こんにちは\"};\nmsg.headers = {\"Content-Type\":\"application/x-www-form-urlencoded\"};\n\nreturn msg;","outputs":1,"noerr":0,"x":141,"y":81,"wires":[["3339c4a1.9774c4"]]}]
```
GNU make Makefileのデバッグ方法



# `$(warning ...)`で変数の値を表示する

Makefileのどこかに

```Makefile
$(warning MAKE = $(MAKE))
$(warning CC = $(CC))
$(warning CFLAGS = $(CFLAGS))
```

と書いておいて`make`を実行すると

```
Makefile:58: MAKE = /Applications/Xcode.app/Contents/Developer/usr/bin/make
Makefile:59: CC = gcc
Makefile:60: CFLAGS = -W -Wall -Wno-unused-parameter -pedantic -g -O0 -DDEBUG -I.
```

のように変数の値が表示される。


# どのターゲットがなぜコンパイルされたのかを調べる

```Makefile
OLD_SHELL := $(SHELL)
SHELL = $(warning [Making: $@]   [Dependencies: $^]   [Changed: $?])$(OLD_SHELL)
```

と書いておくて`make`を実行すると以下のように表示される。

```
Makefile:39: [Making: a.out]   [Dependencies: hage.o hoge.o]   [Changed: hage.o]
```

ここには次の情報が含まれている：

- Makefileの39行目のルールによりコンパイルを実行します（…のはずだが実際はルールは38行目に書かれている。1行ずれている？）
- a.outを作成します
- a.outはhage.o、hoge.oに依存します
- 依存ファイルのうち、hage.oが変更されています

実際に実行すると同じ行が2回以上表示されることがあるが、これはターゲットを作成するためのコマンドが2行以上に渡っているためと思われる（Makefileでは別の行に書いたコマンドは別のシェルにより実行されるので）。


# 参考

[Debugging Makefiles](http://www.neacsu.net/books/ddj/articles/DDJ/2007/0703/070201jg01/070201jg01.html)　本記事の元ネタ
[remake](http://bashdb.sourceforge.net/remake/) GNU makeにパッチをあて、デバッグに役立つ情報を出すようにしたものらしい。それに留まらず高機能なmakeデバッガになっているとか。
Centos6.6 通过freetds pdo_dblib使用php-5.6.17连接sqlserver



## 问题

 使用pdo_odbc连接sqlserver发现对中文支持，不是太好。尤其是SQL server默认的字符集是GBK。
 为了解决插入中文乱码，读取也会乱码的问题，变更连接方式。
 
## 测试是用freetds pdo_dblib组合
* freetds已经包含在epel里，所以只要有epel的repo即可通过yum来安装。安装前提是，要首先安装了unixODBC包。

```
yum install freetds freetds-devel -y
```
* 对pho_dblib编译

编译过程中，可能会出现找不到 __/usr/lib/libsydbd.so|a__ 的提示。

其实so已经有了，不过已经不在/usr/lib里，而是安装到了/usr/lib64里边。所以可以做一个软链解决。


```
 sudo ln -s /usr/lib64/libsybdb.so /usr/lib/libsybdb.so
```



进入源码包目录的ext中，到pdo_dblib目录

```
cd php-5.6.17/ext/pdo_dblib/
/usr/local/bin/phpize
./configure --with-pdo-dblib=/usr --with-php-config=/usr/local/bin/php-config
make
sudo make install
```
编译完成后，就会在扩展目录生成文件 __pdo_dblib.so__

*让php增加扩展

```
vim php.ini

##add pdo_dblib.so
extension="pdo_dblib.so"

```

## php代码样例

```php
<?php
  try {
    $hostname = "testserver.sqlserver.com";
    $port = 1433;
    $dbname = "dbname";
    $username = "user";
    $pw = "pwd";
    $dbh = new PDO ("dblib:host=$hostname:$port;charset=UTF-8;dbname=$dbname","$username","$pw");

  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
  $stmt = $dbh->prepare("select name from master..sysdatabases where name = db_name()");
  $stmt->execute();
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
  unset($dbh); unset($stmt);
?>

````
api.aiのwebhookで音声データを返す

# 概要
* api.aiでは単なるテキストだけではなく、Custom Payloadとして音声データや動画、ファイルなどのリッチメッセージを返すことができます。
 * 参考）[Rich Messages](https://api.ai/docs/rich-messages)
 * 全てのintegrationが対応しているわけではないっぽい
* facebookメッセンジャーでのwebhook時にどういったレスポンスを返せばいいかの備忘録です。

# 実装
* というほどのものではないですが、例えば音声データを返したいというときは以下のようなjsonを返す実装をしていきます。

```json:fulfillment
"fulfillment": {
      "messages": [
        {
          "payload": {
            "facebook": {
              "attachment": {
                "payload": {
                  "url": "https://hogehoge/audio/description.mp3"
                },
                "type": "audio"
              }
            }
          },
          "type": 4
        }
      ]
    }
```

* Controllerです。何やらFulfillmetをそのまま返すとExceptionが発生してしまうので文字列で返してます。

```java:MainController.java
@Controller
public class MainController {
	
	private final MainService mainService;
	
	public MainController(MainService mainService) {
		this.mainService = mainService;
	}
	
	@ResponseBody
	@PostMapping(value="/webhook")
	public String webhook(HttpServletRequest request) {
		return mainService.createFulfillmentJson();
	}
}
```

* json作ります。
* リッチメッセージに合わせて、`ResponseMessage`を継承した`ResponseSpeech`、`ResponseImage`、`ResponsePayload`などがそれぞれ用意されています。

```java:MainService.java
@Slf4j
@Service
public class MainService {
	private final Gson gson = GsonFactory.getDefaultFactory().getGson();
	
	public String createFulfillmentJson() {
		JsonObject urlJson = new JsonObject();
		urlJson.addProperty("url", "https://hogehoge/audio/description.mp3");
		
		JsonObject payloadJson = new JsonObject();
		payloadJson.add("payload", urlJson);
		payloadJson.addProperty("type", "audio");
		
		JsonObject attachmentJson = new JsonObject();
		attachmentJson.add("attachment", payloadJson);
		
		JsonObject facebookJson   = new JsonObject();
		facebookJson.add("facebook", attachmentJson);
		
		ResponsePayload responsePayload = new ResponsePayload();
		responsePayload.setPayload(facebookJson);
		
		List<ResponseMessage> messages = Collections.singletonList(responsePayload);

		Fulfillment fulfillment = new Fulfillment();
		fulfillment.setMessages(messages);

		return gson.toJson(fulfillment);
	}
}
```
*　こんな感じで音声データが返されます。
![fb-mess.png](https://qiita-image-store.s3.amazonaws.com/0/135808/62e895f1-6800-558b-0411-2aca989c02fa.png)

# 参考
* いいサンプルがなかったのでSDKのテストコードを参考にしました。   
[FulfillmentTest.java](https://github.com/api-ai/apiai-java-client/blob/master/libai/src/test/java/ai/api/model/FulfillmentTest.java)
* facebook側のAPIリファレンス   
[送信APIリファレンス](https://developers.facebook.com/docs/messenger-platform/send-api-reference/contenttypes)
XAML上で自身のクラス名を取得するMarkupExtension

#概要
XAMLだけで自身のクラス名を取得するMarkupExtensionの説明です。
例えばMainWindow.xaml内であれば"MainWindow"という文字列を自動で取得できます。
コード(C#)で書くなら、`this.GetType().Name`ですが、XAMLだけでやる方法が簡単には分からなかったので紹介します。

#使用方法
WindowのTitleと内部のTextBlockに後述するMarkupExtensionを指定します。

```xml:MainWindow.xaml
<Window
    x:Class="WpfApp3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApp3"
    Width="300" Height="100"
    Title="{local:RootName}" >
    <TextBlock Text="{local:RootName}"/>
</Window>
```

#結果
直接文字列で指定していなくても、"MainWindow"と表示されます。
![スクリーンショット 2017-08-02 12.14.52.png](https://qiita-image-store.s3.amazonaws.com/0/120077/6e230f63-f78e-db83-9f23-b0ca3c57f97c.png)

#MarkupExtension実装

```csharp:RootNameExtension.cs
[MarkupExtensionReturnType(typeof(string))]
public class RootNameExtension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var provideValueTarget = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
        var rootObj = provideValueTarget?.RootObject;
        return rootObj?.GetType().Name;
    }
}
```

#注意点
デザイナ時には反映されません。
これは実行時とデザイン時ではserviceProviderが異なるからです。

![スクリーンショット 2017-08-02 12.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/120077/13ee5875-ce8a-83d9-98c2-817ab87bac9d.png)

#環境
VisualStudio2017
.NET Framework 4.6
C#6
Dockerを使った開発環境を快適にしてみた - ファイルやディレクトリの同期

# はじめに

- ローカル上でファイル操作やソースコードの修正をした際に、Dockerで構築したサーバへ同期を行いたい場合に使います。
- Dockerには共有フォルダのマウントがありますが、Dockerサーバ上でパーミッションを変更できない制限があるので、rsyncコマンドを利用して同期をかけるようにしました。
- 前提として、公開鍵認証でのSSH接続が行えるものとします。
- あくまで、開発環境で利用していただくことを推奨します。本番環境などで実行すると予期せぬ動作になる可能性があります。
- なんかDocker関係なく、rsyncコマンドの説明みたいになってしまった。。。
- Webサーバの場合でしたら、[この辺](http://qiita.com/neriai/items/91420c49051c938b1cea)参考にしていただければと思います。

# ファイルやディレクトリの同期

## コマンド

```
/usr/bin/rsync --copy-links -avuz --delete -e "ssh -p ${PORT}" ${SHARED_DIRECTORY} ${USER}@${DOMAIN}:${DEPLOY_DIRECTORY}
```

## 入力項目

### ${PORT}

SSHのポート番号をしています。

### ${USER}

SSHのユーザ名をしています。

### ${DOMAIN}

Dockerで構築したサーバの接続先IP or ドメイン名を指定します。

### ${SHARED_DIRECTORY}

ローカル環境の共有元ディレクトリパスを指定します。
ディレクトリ配下のファイルをすべて指定したい場合は、そのディレクトリ名を含めたパスを指定します。

### ${DEPLOY_DIRECTORY}

Dockerで構築したサーバの共有先ディレクトリパスを指定します。
ディレクトリ配下のファイルをすべて指定したい場合は、そのディレクトリ名を含めないパスを指定します。

## コマンドオプション

### --copy-links

シンボリックリンクをコピーします。

### -a

コピー元のディレクトリを再帰的にオーナー・グループ・パーミッション・タイムスタンプをそのままコピーします。

### -v

コピーしているファイル名やバイト数などの情報を表示します。

### -u

コピー元とコピー先を比較し、追加・更新されたファイル・ディレクトリのみをコピーします。

### -z

通信を圧縮します。

### -n

--dry-runオプションです。実行テストを行う際に用います。

### --delete

コピー元で削除されたファイルをコピー先でも削除します。

### -e

SSH接続でリモートサーバにデータをコピーする場合に使用します。
MeCabユーザ辞書作成時の陥りがち？なミス（エラー: cannot find LEFT-ID）

# ミスの内容

MeCabのユーザ辞書を作成する方法は、いろいろなページで紹介されていますが、例えば以下のようなエントリを追加しようとします。

```test.csv

1号館,-1,-1,1,名詞,固有名詞,*,*,*,*,1号館,イチゴウカン,イチゴーカン,(テストユーザ辞書)

```

この`test.csv`をもとに`mecab-dict-index`でdicファイルを生成しようとすると、システム辞書がIPA品詞体系であれば、以下のようなエラーが返されます。

```

reading ./test.csv ... context_id.cpp(96) [it != left_.end()] cannot find LEFT-ID  for 名詞,固有名詞,*,*,*,*,*

```

いったいどこが間違っているんだ！とずっと思っていましたが、エントリを以下のように修正することで治りました。

```test.csv

1号館,-1,-1,1,名詞,固有名詞,一般,*,*,*,1号館,イチゴウカン,イチゴーカン,(テストユーザ辞書)

```

`固有名詞`の右側の`*`を`一般`に変更しています。

# 結論

MeCabユーザ辞書を追加するときは、システム辞書の品詞体系に沿って、品詞を指定しないといけません。今回の例の場合、「1号館」という固有名詞を追加したいと思って、品詞を`名詞,固有名詞,*,*`と指定していましたが、IPA品詞体系の場合、固有名詞はさらに「一般」「人名」「組織」「地域」と別れているため、それに沿って、`名詞,固有名詞,一般,*`などのように指定しなければなりません。

# 関連ページ

* [形態素解析ツールの品詞体系 ChaSen品詞体系(IPA品詞体系)](http://www.unixuser.org/~euske/doc/postag/#chasen) - IPA品詞体系の分類表が載っています
Laravelで実行されたSQLを確認する

メモ

```
$ php artisan --version

Laravel Framework 5.4.23
```

```
.
.
.

use DB;

.
.
.

// 確認したいSQLの前にこれを仕込んで
DB::enableQueryLog();

// 確認したいSQL
$articles = Article::all();

// dumpする
dd(DB::getQueryLog());

.
.
.

```

=====>

```
array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `articles`"
    "bindings" => []
    "time" => 15.62
  ]
]
```
[備忘録]Cmderの設定

# Cmderについて
多機能なコンソールエミュレータ。
Windows備え付けの cmd.exe からの乗り換えとして採用。
最低限のmini版と、Gitコマンド含んだfull版の２つがあるが、せっかくだし理論でfull版を入れた。
**http://cmder.net/**

Windows版しかないが、Mac備え付けの Terminal は初期状態でもそこそこ使える子なので、
もし不足分があれば別途導入を考える方針で。
※iTermとか入れてみようかな。。


# 初期設定
## 日本語のフォント幅
デフォルトでは日本語のフォント幅が原因でズレて表示されてしまう。
```Settings``` -> ```Main```  -> ```[Main consle font]``` -> ```Monospace``` のチェックを外す。

## コマンド履歴の文字ズレ
初期状態のプロンプト(コマンド待機状態を表す記号)は**ラムダ(λ)**になっているが
どうやらこいつが悪さをしているようなので、別の文字に変更する。

Cmderのインストールフォルダ内 ```\vendor\clink.lua``` をお気に入りのエディタで開いて
43行目/46行目の**【 λ 】**を**【 $ 】**などに変更する。

参考：https://i-py.com/2017/cmder-lambda-update/
Git for Windows インストール&設定

# 概要
[Git for Windows](https://git-scm.com/download/win)をインストールし，初期設定を行う．

# Git for Windowsのインストール
1. [Git for Windows](https://git-scm.com/download/win)から自分の環境にあったSetupファイルをダウンロードする．
2. Setupファイルを実行する．
3. ライセンスを確認する．
4. インストール先を確認する(特別な理由がなければ標準のままで)，
5. Select Componentsの画面で，インストールするコンポーネントを選択する．
    - Desktopのアイコンを作るかはお好みで．
    - Windows Explorer integration (右クリックメニューでGitが開けるようになる)
    - Git LFS
    - Associate ...
    - **Use a TrueType font in all console windowsのチェックは外しておくのが良さそう**
6. スタートメニューを作るか設定する．
7. Adjusting your PAHT environmentの画面で，自分の環境にあったものを選択する．
    - WindowsのコマンドプロンプトからGitを使わない場合は，Use Git Bash onlyでいいはず．
8. Use OpenSSLを選択する．
9. 改行コードを設定する．
    - Checkout Windows-style, commit Unix-style line endingsでは，ファイルを作成するときはCRLF(Windows標準)で作成し，コミット時にはLF(Unix標準)でコミットする．
    - Checkout as-is, commit as-isでは，改行コードの変換を一切行わない．(CRLFのファイルをLinux, macOSで開くと事故るかも...?)
10. コンソールを設定(標準はMinTTY, Windowsのコンソールが気に入っているのであればWindows console)
11. file system cachingとGit Credential Managerを有効にする．
12. インストールを実行する．

# 初期設定
ユーザー環境変数`HOME`を[設定する](http://www.k-cube.co.jp/wakaba/server/environ.html)(既存の環境変数を消さないように注意)．
Windowsのユーザーフォルダ(標準は`C:\Users\username\`)に設定しておくのが便利だと思う．

次に，Git Bashを起動してユーザー名などを設定する．

```bash:Bash
# GitHubのユーザー名&メールアドレス or 他人から見て自己が区別できるユーザー名&メールアドレス
$ git config --global user.name "TaroYamada"
$ git config --global user.email "taro.yamada@email.com"
```

Git Bashを再起動して，`pwd`でカレントディレクトリが`HOME`と一致していることを確認する．

```bash:Bash
$ pwd
/c/Users/username/
```

`git config -l`でユーザー名&メールアドレスが設定されていることを確認する

```bash:Bash
$ git config -l
user.name=TaroYamada
user.email=taro.yamada@email.com
```

これでGit Bashが使えるようになった．
(SSH鍵の設定が必要な場合は別途行う)

# SourceTreeを使いたいときは?
- インストール時にGitの種類を選ぶ画面が出てきた場合，Git for WindowsをインストールしていなければEmbeddedにしておけばOK．
- SourceTreeでもユーザー名&メールアドレスの設定を適切にしておこう．

(使っていないのであまりわからない)
Yiiでアプリケーション内で使う定数を設定する

/application_root/config/params.php

```php
<?php
return [
    'adminEmail' => 'admin@example.com',
    'hoge' => 'hoge'
];
```
取り出す時はaction内で

```php
Yii::$app->params['hoge'];
```

みたいにして取り出す。

一応main.phpに以下の記述が必要
（composerからインストールした場合は設定済みになっているかと思います）

config/main.php

```
$params = array_merge(
    require(__DIR__ . '/params.php')
);
```
[Java]年月日から曜日を算出(Calendarクラスは使わない)

###はじめに
先日、古本屋で見つけた「暗算の達人」という本を読んでいます。
そこに、**年月日から曜日を算出する方法**が乗っていたので、自分の誕生日を使って試してみたら、見事に一致。

**数学たのしー！**

で、

プログラムに落とし込んでみた。
普段Calendarクラスとか使ってやってるから、自分で曜日算出するとか新鮮。

**プログラミングたのしー！**

###処理

```java
package math;

import java.util.HashMap;
import java.util.Map;

/**
 * 年月日から曜日の算出
 * - 1900年代と2000年代は計算できる
 * - 閏年は考慮してない
 */
public class CalcDayOfWeek {

	/** 月に対する符号(key:月/val:符号) */
	private static final Map<Integer, Integer> SIGN_OF_MONTH = new HashMap<>();
	static {
		SIGN_OF_MONTH.put( 1, 6);
		SIGN_OF_MONTH.put( 2, 2);
		SIGN_OF_MONTH.put( 3, 2);
		SIGN_OF_MONTH.put( 4, 5);
		SIGN_OF_MONTH.put( 5, 0);
		SIGN_OF_MONTH.put( 6, 3);
		SIGN_OF_MONTH.put( 7, 5);
		SIGN_OF_MONTH.put( 8, 1);
		SIGN_OF_MONTH.put( 9, 4);
		SIGN_OF_MONTH.put(10, 6);
		SIGN_OF_MONTH.put(11, 2);
		SIGN_OF_MONTH.put(12, 4);
	}

	/** 曜日に対する符号(key:符号/val:算出結果) */
	private static final Map<Integer, String> SIGN_OF_WEEK  = new HashMap<>();
	static {
		SIGN_OF_WEEK.put(1, "Mon.");
		SIGN_OF_WEEK.put(2, "Tue.");
		SIGN_OF_WEEK.put(3, "Wed.");
		SIGN_OF_WEEK.put(4, "Thu.");
		SIGN_OF_WEEK.put(5, "Fri.");
		SIGN_OF_WEEK.put(6, "Sat.");
		SIGN_OF_WEEK.put(0, "Sun.");
	}

	/** 年(先頭2桁)に対する比重 */
	private static final Map<Integer, Integer> WEIGHT_OF_YEAR = new HashMap<>();
	static {
		WEIGHT_OF_YEAR.put(19, 1);
		WEIGHT_OF_YEAR.put(20, 0);
	}

	/**
	 * メイン({@link #calcDayOfWeek}を呼び出すだけ)
	 * @param args
	 */
	public static void main(String[] args) {
		calcDayOfWeek("1993/09/17"); // とりあえず、僕の誕生日
		calcDayOfWeek("2017/09/17"); // 今年の誕生日

		calcDayOfWeek("2001/09/11"); // アメリカ同時多発テロ
		calcDayOfWeek("2011/03/11"); // 東日本大震災
		calcDayOfWeek("1989/11/09"); // ベルリンの壁崩壊
	}

	/**
	 * 曜日算出
	 * - 年：下2桁を25%した値と、下2桁を足す。(但し、何年代かにより比重を加算する)
	 * - 月：月に対する符号のマッピングから取得
	 * - 日：そのまま使用
	 * @param yyyyMMdd
	 */
	public static void calcDayOfWeek(String yyyyMMdd) {
		if (yyyyMMdd == null)
			return;
		yyyyMMdd = yyyyMMdd.replaceAll("-", "").replaceAll("/", "").replaceAll(" ", "");
		if (!checkFormat(yyyyMMdd))
			return;

		int yy     = Integer.parseInt(yyyyMMdd.substring(2, 4));
		int mm     = Integer.parseInt(yyyyMMdd.substring(4, 6));
		int dd     = Integer.parseInt(yyyyMMdd.substring(6, 8));
		int weight = WEIGHT_OF_YEAR.get(Integer.parseInt(yyyyMMdd.substring(0, 2)));

		int signOfYear  = (yy / 4) + yy + weight;
		int signOfMonth = SIGN_OF_MONTH.get(mm); 
		int signOfDay   = dd;

		System.out.println(String.format("%s is %s",yyyyMMdd, SIGN_OF_WEEK.get((signOfYear + signOfMonth + signOfDay) % 7)));
	}

	private static boolean checkFormat(String yyyyMMdd) {
		try {
			Integer.parseInt(yyyyMMdd);
			return yyyyMMdd.length() == 8;
		} catch (NumberFormatException e) {
			return false;
		}
	}
}
```

###出力結果
とりあえず自分の誕生日と、世界的なニュースあたりを...

```
19930917 is Fri.
20170917 is Sun.
20010911 is Tue.
20110311 is Fri.
19891109 is Thu.
```

###感想
・計算自体は面倒臭くないけど、月に対する符号のマッピング(SIGN_OF_MONTH)を覚えるのがしんどい
・閏年を考慮するともうちょっと処理が複雑になるけど、そこまで大した事なさそう(※調べ次第、更新するかも)
・1800年代とか2100年代とかは、知らん(※調べ次第、更新するかも)

頭の中で計算できるようになると、合コンとかで使えてモテそうですね。(適当)
Rails API で Vue の HTML5 History モードを動かす

Rails で Vue の HTML5 History モードを動かす際の備忘録。
ちなみに Angular の HTML5 モードも同様に使えるはず。

## HTML5 History モードとは

Vue (vue-router) のルーティング設定には[HTML5 History モード](https://router.vuejs.org/ja/essentials/history-mode.html)というものがあります。
詳しくは上記ページに任せるとして、要するに SPA で自然な URL でルーティングができるようになる機能です。

例えば `http://oursite.com/user/id` のような URL になります。

## Rails の public ディレクトリに SPA を配置する場合の問題点

フロントエンドに Vue を、バックエンドに Rails5 の API を利用した環境を構築する場合、
通常は Web サーバと App サーバにそれぞれを分けてデプロイし、Web サーバの設定で history モードに対応させることが多いかと思います。

ただ、手軽にデプロイするなら Rails の public ディレクトリにビルドした Vue アプリケーションを置いてしまうのもアリです。

この場合リクエストは Rails が受けることになりますが
そのままでは `http://oursite.com/user/id` という URL にアクセスしても
No route matches [GET] "/user/id" エラーになってしまいます。

調べた範囲では Rails だけで `/user/id` へのアクセスをうまく `public/index.html` に流すことはできなさそうでした。

## [rack-rewrite](https://github.com/jtrupiano/rack-rewrite) の導入

いろいろ試してみた結果、[rack-rewrite](https://github.com/jtrupiano/rack-rewrite) を利用する方法に落ち着きました。
名前のとおり URL の rewrite を行う Rack ミドルウェアです。

以下のようなファイルを作成します。

```config/initializers/rewrite.rb
Rails.application.config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do
  # 正規表現は環境にあわせて修正
  send_file %r{\A/user(/\w+)?\z}, 'public/index.html'
end
```

※ `send_file` の第二引数は URL ではなく送信するファイルのパス

これにより `http://oursite.com/user` や `http://oursite.com/user/id` といったアクセスは `public/index.html` で処理するようになり、HTML5 History モードでのルーティングが実現できます。
Visual Studio Codeで設定ファイル・キーバインディング・拡張機能を共有する

VS Code 1.44.0のインサイダーで、公式のSeeings Sync機能がリリースされます。
Microsoftアカウントで同期する形のようなので、この記事の対応は不要になります。

https://code.visualstudio.com/updates/v1_43#_settings-sync

---

長年使っていたVimからVisual Studio Codeに乗り換えました。
拡張機能も入れるの簡単ですし、そもそも最初の設定だけでそれなりに使えていいエディタだと思っています。
自分はデスクトップ・ラップトップを持ち替えて使うことが多く、個別にセットアップしていたら色々と差分が出てきてしまったので設定ファイルの共有方法を考えていました。

Vim, Emacsを使っている人ならdotfilesリポジトリを使って管理しているような雰囲気を感じますが、Visual Studioでは基本GUIで設定を行えてしまいます。
開発環境のポータビリティを考えてシェルの設定と含めてVSCodeの設定を含んだdotfilesをGithubで管理したいというモチベーションで考えています。

## 設定ファイルの共有
VSCodeの設定ファイルはmacOSだと `~/Library/Application\ Support/Code/User/` 以下の`settings.json`, `keybindings.json`に保存されています。

単純に共有したいディレクトリ上とシンボリックリンクを貼れば問題ないと思います。
以下はmacOSでの実行例です。

```bash:macOSでの実行例
# = 現在の設定があるPCでの操作
# 共有用フォルダ(今回の例では~/dotfiles/vscode)に今の設定ファイルを置く

mkdir -p ~/dotfiles/ ~/dotfiles/vscode
cd ~/Library/Application\ Support/Code/User/
mv ./settings.json ~/dotfiles/vscode/settings.json
mv ./keybindings.json ~/dotfiles/vscode/keybindings.json
ln -s ~/dotfiles/vscode/settings.json ./settings.json
ln -s ~/dotfiles/vscode/keybindings.json ./keybindings.json

# = 新しいPCでの操作
# 共有用フォルダにあるファイルからシンボリックリンクを貼る

cd ~/Library/Application\ Support/Code/User/
rm settings.json
ln -s ~/dotfiles/vscode/settings.json ./settings.json
rm keybindings.json
ln -s ~/dotfiles/vscode/keybindings.json ./keybindings.json
```

自分はdotfilesをGithubで管理する前提で~/dotfilesディレクトリを使っていますが、Dropbox上で同期する方法も考えられます。

Windowsだと`ln`ではなくて`mklink`でシンボリックリンクを作れるらしいですが、動作確認する環境がないので今回は対象外。

## 拡張機能の共有
拡張機能はファイルで管理しているわけではありません。（そういう認識でいます）
Command Lineツールで拡張機能一覧をの取得や新規拡張機能のインストールが出来るのでCommand Lineツールを利用して共有していきます。

### (mac OSのみ必要) Command Lineツールをインストールする
WindowsとLinuxでは `code` コマンドがインストール時に使えるようになっていますが、mac OSでは自分でインストールする必要があります。

macだとCommand Palatte(Shift + Command + P) を開き`Shell Command`と検索して `Shell Command: Install 'code' command in PATH command.` を選択します。

これでTerminal上でcodeコマンドが利用可能になります。

参考
https://code.visualstudio.com/docs/setup/mac

### 拡張機能一覧を出力する

設定ファイルには拡張機能の情報はないので、このままではプラグインの共有が出来ません。
code-cliを使えばインストール中のプラグインを出力出来たり、特定の拡張機能をインストールすることが出来ます。

`code --list-extensions` で以下の様な出力が得られるので `code --list-extensions > extensions` で拡張機能リストのファイルを作ります。

```text:出力例
HookyQR.beautify
PeterJausovec.vscode-docker
vscodevim.vim
...
```

### 拡張機能のインストールをする
1行ずつ見ていってインストールしていけばいいので以下の様なシェルスクリプトを実行すれば一覧を元に復元出来ます。
これで拡張機能の共有が可能になります。

```bash:install_extensions.sh
#!/bin/sh

cat ./extensions | while read line
do
  code --install-extension $line
done
```

先程保存した`extensions`ファイルがあるディレクトリで`sh install_extensions.sh`を入力するといい感じにインストールしてくます。

<img width="602" alt="スクリーンショット 2017-08-02 4.07.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/24124/f2ca3215-7839-d6ba-2f69-0d234074a9fe.png">


## もっといい方法知りたい
拡張機能の復元方法が強引な感じがしますが、しょうがないかなという印象です。
そのうち本体に管理機能ができそうな気がするので今はこの方法でごまかしていきたいと思います。

開発環境のポータビリティを上げて**旅しながら仕事**みたいなことしてみたいですね

自分のdotfiles
https://github.com/mottox2/dotfiles/tree/master/vscode
実装の手順 > 機能の削除 (拡張機能追加を見据えて)

```txt:動作環境
C++ Builder XE4
```

### 背景

機能XX1を拡張して機能XX2を作ることになったとする。
実際には機能XX1の拡張では対応しきれず、新機能を追加するような状況だとする。

以下の作業が必要となる。

1. 機能XX1の削除
2. 機能XX2の追加

## 機能XX1の削除

どのように削除するか。

### 削除手順 > 成功編

1. 関連する関数、変数、配列などの洗い出し (プロファイリング?)
2. Gitで削除作業としてのfeatureブランチを切る (`feature/170801/removeXXX`)
3. 項目（関数、変数、配列）の削除順番の検討
    - 作業が小さくまとまりやすいものを優先する
4. 一つの項目を削除ごとにgit commit
5. 4の作業を繰り返す
6. 全項目の削除後にbranchをmasterへマージ
    7. no fast-forwardマージにしておくことで将来的にブランチ名と関連コミットが参照しやすくなる

こうすることで、機能XX2追加時に機能XX1の機能をGitログで確認もできる。

また、手順1にてプロファイリングしておくことで、機能XX2追加設計時の参考にもなる。

### 削除手順 > 失敗編

1. 削除対象の主となるフォームコンポーネントを削除する
    2. IDEのエラーを誘発するという目的
2. IDEのエラーを対応する
3. 2の手順をエラーがなくなるまで繰り返す

機能を削除はできるが、関連機能の構造の情報が実装者に残らない。
(詳細設計資料の最新版がきちんと管理できていれば不要ではある）

また、関数の削除時に詳細を把握しておかないと、削除漏れが発生する可能性がある。

### その他 > 「削除しないでなんとか拡張しようぜ！」編

機能XX1から強引に機能XX2にする方法。

glueコードでなんとか実装できるかもしれない。

数年後にそのプロジェクトの保守・機能変更時に「この分かりにくい構造はなんだ！(過去の自分への失望)」となる可能性が考えられる。

技術的負債が増加する方法であり、お薦めできない。
機械学習の論文を読んでみたいけど難しそう、という時に見るサイト

機械学習の基礎はそれなりに習得し、次のステップとして論文を読んでみたい、実装にチャレンジしてみたい、という方も多いのではないかと思います。

ただ、機械学習の論文といってもどこから読んでいいのか、興味がある論文を見つけるにしても英語のAbstractを眺めて行くのはちょっとつらい・・・という方のために、ポータルサイトを作りました。

[arXivTimes Indicator](http://arxivtimes.herokuapp.com/)

![arxivtimes_top.png](https://qiita-image-store.s3.amazonaws.com/0/25990/412a03e9-5865-bdc0-3f53-a475700e933e.png)

以前、機械学習に関わる論文の要約を共有する[GitHubリポジトリ](https://github.com/arXivTimes/arXivTimes)と[Bot](https://medium.com/@arxivtimes)を作成したのですが、そこでの投稿内容をまとめて見ることができます。

ジャンル別に参照可能な他、

![select_genre.png](https://qiita-image-store.s3.amazonaws.com/0/25990/6259db99-a0a9-4a2b-4ce6-93761183dbe2.png)

Pocketをお使いであればPocketへの登録も可能です。

![pocket.png](https://qiita-image-store.s3.amazonaws.com/0/25990/74c0c72c-ab83-79bc-fabc-9a9efe6b37d2.png)

arXivTimesは、機械学習の研究動向に関する集合知を形成することを目的としています(日本語で参照可能な)。
そのため、今回のポータルの作成を機により多くの投稿をしてもらい、また要約の質を高めて行くためにどうしたらいいかあれこれ検討をしました。その工夫についてもご紹介します。

## 投稿を募るために

[arXivTimesのGitHubリポジトリ](https://github.com/arXivTimes/arXivTimes)に一件でも要約を投稿していただくと、本ポータルサイトから個人ページの参照が可能になります。

![individual_page.png](https://qiita-image-store.s3.amazonaws.com/0/25990/2d559f8b-c7a5-e32c-6715-22cf9e61cd41.png)

こちらの個人ページでは、これまでの投稿数と総計スコア(スコアについては後述します)が参照できます。左の円グラフでは投稿している論文の分野別の割合が参照でき、どんな分野にその人が関心を持っているのか、精通しているのかがわかります。右のグラフは月別の投稿件数を示しており、横線で引かれている「200/year line」を毎月超えると年間200本読んだことになります。論文読みの進捗管理などにお使いいただければと思います。

ちなみに、まだ投稿していないと以下のような感じになります。個人ページの獲得を目指し、まずは一件投稿していただければ！と思います。

![not_post_yet.png](https://qiita-image-store.s3.amazonaws.com/0/25990/283c4fdf-ac49-bfed-8466-c149434516c7.png)

投稿はヘッダーのボタンから可能です。

![post_article.png](https://qiita-image-store.s3.amazonaws.com/0/25990/c58d5cf9-a2a6-8bdd-6ace-57b966724c7f.png)

GitHubのIssueとしてまとめを共有しているため、Issueを投稿する形でまとめを投稿します。Issue Templateがあるため、それに添いまとめを書いていきます(フォーマットは[こちら](http://lafrenze.hatenablog.com/entry/2015/08/04/120205)をベースに簡易版にしています)。ただ、最低限「一言で言うと」「論文リンク」「著者/所属機関」があればかまいません。

## 投稿の質を高めて行くために

とはいえ、投稿の正確性というのも担保したいと考えています。そのため、良い要約になっているかどうかを評価したい・・・のですが、内容の正確性やわかりやすさを評価することはとても難しいです(テキスト量があまり多くないので、[以前の手法](http://qiita.com/icoxfog417/items/64ed466afee6682936c3)をそのまま使うことは困難でした)。

そのため、現在は機械的にとれる人の評価、具体的には**投稿のツイートにつけられたいいね＋2 *リツイート数を点数として算出した偏差値**を表示しています。リツイートを2倍にしているのは、人に広めても問題ない内容と判断されたことをより重視しようという意図です(2倍という値は適当ですが・・・)。こちらが"score"として表示されている値になります。

![score.png](https://qiita-image-store.s3.amazonaws.com/0/25990/76dcf262-61ea-a80e-616e-e0e430a53a70.png)

投稿のかなり目立つ位置に表示していますが、これは内容の正確性を期していきたいというスタンスの現れです。ちなみに私の投稿は結構多いですが、ご覧の通り良くないスコアのものもあります。投稿する際には誤りがないよう気を使っていますが、それでも間違いが出てしまうことは往々にしてあると思います。

現在投稿されたIssueにはコメントがほとんどついていませんが、投稿に対する指摘、また内容についてのディスカッションなどが行われるようになれば要約の評価につなげることができます。そのため、ぜひ**投稿についてのコメントなどを積極的に頂ければと思います**。

## Welcome Contribution

今回作成したポータルサイト、arXivTimes IndicatorはGitHub上でソースコードを公開しています。

[arXivTimesIndicator](https://github.com/chakki-works/arXivTimesIndicator)

(Starをいただければ励みになりますm(_ _)m)

ぜひご要望などあればIssueにてご連絡いただければと思います。もちろん修正のPull Requestも歓迎しております。
まだ対応はしていませんが、研究室や会社などで同じように読んだ論文を管理したいという場合、arXivTimesのGitHubリポジトリをforkして頂き、中身のurlを書き換えれば独自のポータルサイトとして運営できると思います(scoreの算出部分がちと問題ですが)。

機械学習において、「チュートリアルのその次」のステップを踏み出す一助になればと思います。また、既に次のステップに踏み出されている方はご投稿お待ちしております！
[Bitbucket] 2017年7月に追加された新機能(ざっくり紹介)

# Bitbucketに4つの新機能が追加された

詳しくは以下参照（英語）

https://goo.gl/syybaj

## マージされたプルリクエストを巻き戻せるようになった（Revert）

間違った場合や、
後から誤りに気づいた場合、
Bitbucket上からマージをなかったことにできる

今までみたいにコマンドでやらなくてもようなる

https://goo.gl/CrfVTD

## アドオンがコミット操作できるAPIの追加？

アドオン開発者向けっぽい？

https://goo.gl/hX43jg

## コード検索結果でシンタックスハイライトされるようになった

コード検索結果がシンタックスハイライトされるようになった
見やすくなった

## Pipelinesで依存するものをキャッシュできるようになった

Pipelinesは起動に時間がかかる
PHPの場合だと「composer」とか
その処理をキャッシュしてくれる
カスタムキャッシュも可能とか

https://goo.gl/ToZGpP
Ruby の &. と #try の違い

[ブログ記事](http://secret-garden.hatenablog.com/entry/2016/09/02/000000)からの転載です。

Ruby 2.3 で Safe Navigation Operator(`&.`)という新しい演算子が追加されました。
これは `obj&.to_i` という風にメソッド呼び出しのように使い、__レシーバが `nil` の場合に__ `nil` を返します。

```ruby
10&.to_s  # => "10"
nil&.to_s # nil
```

このように `nil` チェックすることなく安全にメソッドを呼び出すことが出来ます。

## `#try`

Rails の ActiveSupport にも `#try` という似たようなメソッドが定義されています。
これは__レシーバがメソッドが呼びだせる場合にそのメソッドを呼び出す__というような処理になります。
また、レシーバが `nil` の場合は必ず `nil` を返します。

```ruby
10.try(:to_s)   # => "10"
nil.try(:to_s)  # => nil
```

## `&.` と `#try` の違い

両方とも『レシーバが `nil` ではない場合にメソッドを呼び出す』という目的なんですが、具体的な挙動は少し違っています。
`&.`が『__nil__でない場合にメソッドを呼び出す』のに対して、`#try` は『メソッドを呼び出すことができるときにメソッドを呼び出す』というような挙動になります。
どういうことかというと

```ruby
# 10 には #hoge メソッドは定義されていない（呼び出せない）ので nil を返す
10.try(:hoge)   # => nil

# レシーバは nil ではないので #hoge メソッドを呼びだそうとするが
# #hoge メソッドは定義されてないのでエラー
10&.hoge # => Error: undefined method `hoge' for 10:Fixnum (NoMethodError)
```

というような挙動になります。  
これは `#try` が `respond_to?` を使用して『メソッドを呼びだせるかどうか』をチェックしているためです。  
このような違いがあるため `&.` を `#try` の代替として使用する場合は注意して使用する必要があります。


## 共通の挙動

`#try` も `&.` もレシーバが `nil` の場合は `nil` しか返しません。

```ruby
nil&.nil?      # => nil
nil.try(:nil?) # => nil
```
Google Play Musicの非公式APIをたたいて音楽を流す

#概要
[Python初心者がGoogle Play Musicの非公式APIをたたいて音楽を流す](http://qiita.com/johejo/items/e7507cebf402e287a08d)
という投稿の続き（みたいなもの）

#前回の内容に加えてやりたかったこと
・勝手にじゃんじゃん音楽を流せるようにしたい→ステーションの利用
・次の曲が勝手に流れるようにする

#ステーションについて
・gmusicapiのMobileclientのget_all_stationsっていうAPIでステーションを取得できる
・とりあえず取得したステーションを一覧で表示
・一覧から流したいステーションを選択
・音楽を流す

#次の曲への移動について
・再生コマンド入力を時間制限付きにする。ビルトインのinputのラッパーとしてwait_inputを作成
・曲の情報からの曲の長さを取得して入力時間の制限とする
・タイムアウトした場合はループをbreakさせて次の曲へ

```Python
def wait_input(ms):
    import signal

    def timeout():
        raise RuntimeError("end")

    signal.signal(signal.SIGALRM, timeout)
    signal.alarm(ms // 1000)

    try:
        key = input('>>')
    except:
        key = 'n'
    finally:
        signal.alarm(0)

    return key
```

参考にしたもの 
[Simple key input with time out on python. タイムアウト付きキー入力。](https://gist.github.com/alfredplpl/ef9fb85e07e5dcb7363d)

#問題点
・pauseしたときに時間制限のタイマーを止められないので、実装の方法を変えた方がいいかもしれない

#ソースコード
https://github.com/johejo/gpm2/blob/master/station_player.py
Javascriptがうまく動かない際の非エンジニアの備忘録


##自己紹介
こんにちは。普段は通販のカートASPサービスのカスタマーサポートに従事している新卒2年目の若造です。

SEではないんですが、サーバーサイド側ではなく、フロント部分（html,css,javascript等）の問い合わせに関しては、けっこう答えたりしています。

google先生との壁打ちをして、お客さんに答えてみたいなの繰り返しですが。そんなことを1年もやって、新卒2年目に突入すると、フロント部分に関しては、大体どんなところでエラーが起きているのか、ある程度予想がついてくるというか、google　chromeの検証を見て、google先生に質問する精度が上がってきたというか。

そんなわけでやっとフロント部分でどんなエラーが起きているかあたりをつけるのが、少しずつうまくなってきたわけなので、いつも参考にしている記事を備忘録がてら、非エンジニアだけどIT関係に携わる方々の手助けとなるようにまとめてみようと思います。

##javascriptがうまく動かない
今回は、javascriptがうまく動かない際の備忘録です。
そもそもjavascriptとはなんなのかというとですね、よくポップアップで「本当にこれで確定していいですか？？？？」と出てきたり、ブログとかサイトを運営している方はわかるかと思いますが、A8やバリューコマース等のアフィリエイト広告のタグで使われていたりするやつです。

なんなのかというといろいろ便利なやつです。（全然答えになっていないけど、用途でいうとたくさんありすぎて説明できない・・・）

あと、javaとjavascriptは違います。これもあるある質問ですが、「インドとインドネシアってどう違いますか？？？」という質問と似ています。何が言いたいかと言うと、全く違うプログラミング言語です。全く関係のない、似た名前のプログラミング言語です。以下のページにめちゃくちゃわかりやすく書かれているので、ぜひ、ご覧ください。（決して馬鹿にはしていません。僕は大学生時代、ずっとこの違いがわからなかったのと、クッキーが甘いサクサクしたやつだと思っていて、散々エンジニアの人からいじられていました。）
https://eng-entrance.com/java-javascript

さて、javascriptがうまく動かない場合、どういった場合が考えられるかというと、以下の２つが大きくは考えられるかと思うので、自分の設置したいjavascriptが動いていない場合は以下の２つの原因を考えてみてください。

###①javascriptの構文エラー
javascriptのheadで読み込むタグとbodyで読み込むタグの順番が間違っていて、
読み込まれないことがあります。

内容としては、javascript本体が読み込まれていない状態でjavascript本体で定義している関数を呼び出しているため、javascriptの読み込み順を変える必要があります。

これどういうことかというと、ページを作っているhtmlというのが`<head>`と`<body>`という構成でできているんですが（人間と同じですね。）、人間と同じように脳で指示して体を動かしているわけです。つまり、指を動かしてとか、腰を動かしてとかそういう動かす部位の指定をまずしているわけです。

そのあと、`<body>`で指を曲げるのか、指で押すのか、腰をくねらせるのか、腰を横に動かすのか（なんかたとえがエロくなってしまう・・・）どういう動きなのかを指示するわけです。

ところが、これが逆転してしまうと、どこの部位を曲げたり、くねらせたりしたらいいかわからないわけです。どこの部位を動かせというのが決まってないわけですからね。

それがjavascriptのheadで読み込むタグとbodyで読み込むタグの順番が間違っているということです。これ意外とあります。


②jqueryとprototype.jsの競合
これもあるあるですね。書きたいんですが、もう会社の朝礼が始まってしまうので、あとで追記します笑
以下のページはめちゃくちゃ参考になります。
http://yatta47.hateblo.jp/entry/2015/01/22/233047
Linuxコマンドで天気予報を取得&表示するワンライン(on Mac)

Linuxコマンドで天気予報を取得&表示するワンライン(on Mac)
MacのターミナルでYahoo!天気予報を取得、データを整形して表示するまでを行います。
Linuxコマンドで実現するので、Macじゃない人でもコマンドが使えたら真似できます。

## はじめに ##
Macの人なら問題なく動作するはずです。Linux系なら問題ないです。
zsh on Macでしか動作チェックしてませんが、他の環境でもちょっと文字がずれるとか改行コードが違うくらいだと思うので、適宜調節してください。
GitHubで公開しているので、こちらからどうぞ。
https://github.com/arabian9ts/weather
zshrcなどに書いておけば、ログインしたタイミングで天気予報を確認できます╭( ・ㅂ・)و ̑̑ ｸﾞｯ !

## プレビュー ##
<img width="836" alt="preview.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/d870372d-c7c5-b1ec-cd24-9923deda58d5.png">
完成図はこんな感じになります。

## コード ##
ワンラインなのでコードというのは仰々しいですが、、、

`curl -s https://weather.yahoo.co.jp/weather/jp/40/8210/40133/8100001.html  | tr '\n' ' ' | sed -e 's/<[^>]*>//g' | grep -oE ' - [0-9].*明日' | tr ' ' '\n' | grep -v '^$' | head -47 | tr '\n' '\t' | awk '{sub("時刻", "\n時刻        ");sub("天気", "\n天気      ");sub("気温（℃）", "\n気温（℃）");sub("湿度（％）", "\n湿度（％）");sub("降水量（mm/h）", "\n降水量（mm/h）");print}'
`

## 解説 ##
パイプで区切ってあるコマンド単位で順に解説を書きます。

1. curlでYahoo!天気予報のhtmlファイルの情報を取得
2. htmlタグ消去のために改行コードを空文字に置換(`>`が行頭にくる可能性を潰す)
3. `<`ではじまり`>`で終わる箇所をすべて消去(タグ消去)
4. ` - *月**日`というヘッドラインから`明日の天気`までの情報を切り出す
5. 空文字を改行コードに戻す
6. 空行を削除
7. 必要な行までを抽出
8. 以降データ整形

## 正規表現について ##

+ `grep -v ^$`の`^`は次に来る文字が行頭にあるという意味(`$`は行末) -> 空行
+ `[^>]`は`[]`で囲まれたグループを含まないという意味(行頭ではないから使い分け注意)
【社内勉強会】JUnitの紹介(2017/08/02) ～作成中～

--------------------
# 1. ソフトウェアテストについて


--------------------
## ソフトウェア開発におけるテストの定義


* ある条件下
    - 使用するデータ
    - 動作環境
    - 事前の操作手順
* ソフトウェアの振る舞いを記録できる
    - データやデータベースの状態
    - 画面表示(人が確認するだけでOKな場合もあり)
* 期待される結果との検証
    


--------------------
## ソフトウェアテストの目的

* 品質保証（メイン）
* 仕様が不足なく実装されていること
* 設計が妥当であることを検証



--------------------
## 用語の確認

* テストケース
* テストスイート


--------------------
# 2. ユニットテストについて



--------------------
## ユニットテストのパターン

[xUnit Test Pattern]参照

--------------------
## ユニットテストを行う目的

* プログラマにとって重要なスキル
* クラスやメソッドがプログラマの期待した振る舞いであることを検証


### ユニットテストで確認しないこと（機能テストや受け入れテスト）
* クラスやメソッドの相互作用
* ソフトウェアの機能の確認
* 品質の保証


P2参照
P31参照




--------------------
## ユニットテストを書きやすい部分

--------------------
## テストコードをテスト仕様書にする


--------------------
# 付録



--------------------
## ユニットテストの定義は企業文化によって変わる

P3参照

--------------------
## 製造業と建築業とソフトウェア開発

P25参照


--------------------
## 「動作するコードはけっして触ってはいけない？」

--------------------
## Java以外でのユニットテストフレームワーク

* JavaScript
* C#
* C++

<span style="color:red">test</span>
XRDP を ubuntu17.04に aptで インストールして使う gnome版


ubuntu 16.10 から xrdp が apt で 0.9系が 入るようになった。
なので vmに xrdp をいれて リモートデスクトップ接続するのが 簡単になってうれしい。

sudo apt install ubuntu-gnome-desktop xrdp
sudo vi /etc/xrdp/startwm.sh

最後の 2行を コメントアウトして gnome-session を 最後に書く

sudo systemctl enable xrdp
sudo systemctl start xrdp

これで いけそう。
いまから 試す。
xrdp に ログインできたけど gnomeが 起動しないようです。

んー だめ。 記事が おおい mate に 切換えです。

もういっかい OSインストールから やり直して
sudo apt install ubuntu-mate-desktop xrdp
echo mate-session >~/.xsession
reboot して つないだら mate の画面が 出てきた。

コンソールの GUI ログインは じゃまなので 
systemctl disable lightdm.service
で 停止した。

gnomeで うごかすのは またやってみるよ。
/etc/X11/Xwrapper.config の内容を
allowed_users = anybody
に 修正する と gnome でも うまくいきました。

カラーマネージデバイスが どーのこうの といわれたので 
"Authentication is required to create a color managed device" で 検索した。

File /etc/polkit-1/localauthority/50-local.d/allow-colord.pkla  


```
[Allow colord for all users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile 
ResultAny=yes
ResualtInactive=auth_admin
ResultActive=yes
```

GNOME問題は この２つかな。
べつの手段も みつけたけど どっちが いいのかな。

http://www.mikitechnica.com/8-xrdp-centos72.html

```
# echo "X-GNOME-Autostart-enabled=false" >> /etc/xdg/autostart/gnome-software-service.desktop
# echo "X-GNOME-Autostart-enabled=false" >> /etc/xdg/autostart/gnome-settings-daemon.desktop
```


日本語入力については 他の記事参照してください。（あとで書きます）

参考： https://weblab360.com/User:xltran/App/xRDP/Installation/CentOS
参考：http://c-nergy.be/blog/?p=10165
SwiftのSetとは？（Collection Typeを知る）

## Collection TypeとしてのSet

＊注意：コードも内容も大部分公式サイトからの翻訳です。自分用まとめとして残しました。

Collection Typeが値を保存するためのデータブロックで、あらかじめプログラム（この場合swift）で用意されたデータタイプです。
**Array**, **set**, **dictionary**の３つがswfitにおけるCollectionTypeです。

![CollectionTypes_intro_2x.png](https://qiita-image-store.s3.amazonaws.com/0/158705/fd974fb3-078c-3559-2f4d-87f7c1ff0b9f.png)
*公式サイトの図

## Setの特徴
- ユニークなデータを保持する。
- 単一なデータタイプが好ましい
- 順番は関係なし

ユニークなデータしか保存されないので、**同じデータを追加してしまった場合は無視されます**。順番は関係ないので、保存した順も、昇降順関係なく、プリントされます。

```set.swift
var myset:Set = ["Mike","Mike","Cathy","Malcom"]
print(myset) // ["Malcom", "Cathy", "Mike"]　Mikeが一つない！
```



Setにデータを入れる場合、Data Typeはハッシュ化可能(**Hashable**)でなければいけない。
**Hashable**なデータタイプ = **比較可能（Equatable）**なデータタイプのことを言います。

### Hashable data type例
String, Int, Bool, Double, Float, Character等
### Hashableではないdata type例
Class, Dictionary, Set, Array等

```non-hashable.swift
class MyClass{ var num:Int = 0 }
var myClass1 = MyClass()
var myClass2 = MyClass()
var mySet2:Set = [myClass1, myClass2]　//エラー！！
```
＊non-hashableクラスを保存しようとしたのでエラーが出ます。

### Setに複数のデータタイプは保存できるの？
できないこともないですが、面倒なので素直にArrayを使いましょう。

```AnyType.swift
//Setの場合
var mySet2:Set<AnyHashable> = ["Mike",5,"Cathy","Malcom", 7]
print(mySet2)//[AnyHashable(5), AnyHashable("Malcom"), AnyHashable(7), AnyHashable("Cathy"), AnyHashable("Mike")]


//Arrayとの比較
var myArray:[Any] = ["my","mum", 1, 5]
print(myArray) //["my", "mum", 1, 5]
```
AnyHashableにキャストして見ましたが、やっぱり面倒。

## Setへの保存＋取得＆基本的なメソッド

Arrayのメソッドと同じ部分も多いです。

```setFunctions.swift
var mySet:Set = [3,5,7,8,9,19]

print(mySet.count) //6
print(mySet.isEmpty) //false

mySet.insert(20)
print(mySet) //[19, 20, 9, 5, 7, 3, 8]

mySet.remove(5)
print(mySet) //[19, 20, 9, 7, 3, 8]

print(mySet.contains(100)) //false

var sortedSet = mySet.sorted()
print(sortedSet)//[3, 7, 8, 9, 19, 20]
```
最後のメソッドを載せたように、変数を作ればソートもできます。

## Set Operations

Setではセット同士を比較して、データを抜く取得などできる便利メソッドがあるのです！aとbがセットだとして、以下のように合わせることができます。

![set2.png](https://qiita-image-store.s3.amazonaws.com/0/158705/6feba2b4-d3c1-b3f3-708e-21703d30e55b.png)

*公式サイトより

```
let oddDigits: Set = [1, 2, 5, 6, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]      

print(oddDigits.union(evenDigits).sorted())
//[0, 1, 2, 4, 5, 6, 8, 9]

print(oddDigits.intersection(evenDigits).sorted())
// [2, 6]
        
        print(oddDigits.subtracting(singleDigitPrimeNumbers).sorted())
// [1, 6, 9]
        
      print(oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted())
// [1, 3, 6, 7, 9]
```

データがユニークだった場合これ使えるので最高ですね。


## Set Membership & Equality
簡単に言ってしまえば、Set同士の中身を比較してBoolを返すメソッドです。

```
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
        
print(houseAnimals.isSubset(of: farmAnimals))
// true
print(farmAnimals.isSuperset(of: houseAnimals))
// true
print(farmAnimals.isDisjoint(with: cityAnimals))
// true

```


### 参考文献

 - [公式サイトから訳しています](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html)
 - [Use Your Loaf参考](https://useyourloaf.com/blog/swift-hashable/)
Windows PowerShellでPCをシャットダウンしたイベントログを表示

WindowsPCでシャットダウンした時のイベントログを見たかったのでPowerShellで挑戦した時のメモ。

```
Get-Eventlog system -After 2016/4/1 -befor 2016/4/27 |Where-Object {$_.eventid -eq 13}
```

「-After」と「-Befor」で検索期間を設定できる。
｛$_.eventid -eq 13｝でイベントログのidを指定。
Numpy > Fancy Indexing | Advanced Indexing > 応用インデキシング | ファンシーインデックス参照

@ 科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化 by 中久喜 健司さん
( 対象環境: Python 3.5以降 )

Numpyのindexingの種類として[Fancy Indexing (Advanced Indexing)](https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)が紹介されている。

その日本語訳として「応用インデキシング」という用語を本の中で使っているが、[google検索](https://www.google.co.jp/search?q=%22%E5%BF%9C%E7%94%A8%E3%82%A4%E3%83%B3%E3%83%87%E3%82%AD%E3%82%B7%E3%83%B3%E3%82%B0%22+%E3%83%91%E3%82%A4%E3%82%BD%E3%83%B3&oq=%22%E5%BF%9C%E7%94%A8%E3%82%A4%E3%83%B3%E3%83%87%E3%82%AD%E3%82%B7%E3%83%B3%E3%82%B0%22%E3%80%80%E3%83%91%E3%82%A4%E3%82%BD%E3%83%B3&aqs=chrome..69i57.4519j0j4&sourceid=chrome&ie=UTF-8)では4件しか出てこない。一般的な用語ではないような感じがする。


他の用語例としては以下がある。

「ファンシーインデックス参照」
https://hydrocul.github.io/wiki/numpy/ndarray-ref-fancy.html
[google検索](https://www.google.co.jp/search?q=%22%E3%83%95%E3%82%A1%E3%83%B3%E3%82%B7%E3%83%BC%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E5%8F%82%E7%85%A7%22&oq=%22%E3%83%95%E3%82%A1%E3%83%B3%E3%82%B7%E3%83%BC%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E5%8F%82%E7%85%A7%22&aqs=chrome..69i57j0.767j0j7&sourceid=chrome&ie=UTF-8)では89件見つかる。


こういう訳語は誰がどう決めて使っているのか不明だ。

多くの人に参照される資料に使われ始めて、それが一般化していればいいが。
あるいは、公式の日本語資料があり、その中できちんと訳語管理がされているのでもいいと思われる。


訳語が複数あると、その情報を探そうとする時に検索漏れが発生する。
他の例として、namespaceを[「名前空間」で検索した](https://www.google.co.jp/search?q=%22%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93%22+python&oq=%22%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93%22+python&gs_l=psy-ab.3..0j0i8i7i30k1j0i8i30k1l6.875.2609.0.2961.11.11.0.0.0.0.89.907.11.11.0....0...1.1j4.64.psy-ab..0.3.255...0i7i30k1j0i4i37i32k1.xtuvU_RnxHw)人には[「名称空間」と記載された情報](https://www.google.co.jp/search?q=%22%E5%90%8D%E7%A7%B0%E7%A9%BA%E9%96%93%22+python&oq=%22%E5%90%8D%E7%A7%B0%E7%A9%BA%E9%96%93%22+python&gs_l=psy-ab.3...5425.6726.0.6947.7.7.0.0.0.0.109.560.6j1.7.0....0...1.1.64.psy-ab..0.0.0.YwTzDr6ZbEM)は見えない。
Visual Studio Code 自分用設定メモ

# 概要
Visual Studio Codeをインストールしたら行う設定。

# 環境
- Version: 1.14.2

# ダウンロード＆インストール
[Visual Studio Code - Visual Studio](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)からインストーラーをダウンロードしてインストールします。

# 設定
ファイル → 基本設定 → 設定
下記の設定を行っています。

```json:settings.json
{
    // ProjectManagerで別プロジェクトに切り替えたときに新規ウィンドウでひらくかどうか　
    "projectManager.openInNewWindow": false,
    // ProjectManagerで無視するファイル
    "projectManager.vscode.ignoredFolders": [
        "node_modules",
        ".bundle",
        "out",
        "typings",
        "test"
    ],
    //シンタックスハイライトの判定を追加
    "files.associations": 
    {
        "*.txt": "markdown",
        "*.json.txt": "json"
    },
    // ファイルブラウザから除外するフォルダ/ファイル
    "files.exclude": 
    {
        "**/.git": true,
        "**/.DS_Store": true,
        "**/.bundle": true
    },
    // 検索からのみ除外するフォルダ/ファイル
    "search.exclude": 
    {
        "**/.git": true,
        "**/.DS_Store": true,
        "**/node_modules": true,
        "**/.bundle": true
    },
    // 空白文字列の表示
    "editor.renderWhitespace": true,
    // ウィンドウサイズで折り返し
    "editor.wordWrap": true,
    // インデントガイドを表示
    "editor.renderIndentGuides": true,
    // タイトルにルート相対パスを表示
    "window.title": "${dirty}${activeEditorMedium}${separator}${rootName}${separator}${appName}"
}
```

# 拡張機能
[encdetect jp](https://marketplace.visualstudio.com/items?itemName=inoueben.encdetectjp)
日本語の文字コードを自動判定して警告を出してくれるものです。
会社で未だにsjisで保存し続ける人がいてよく文字化けするので。。

[REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client)
REST API の呼び出しができます。

[Path Intellisense](https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense)
ファイルやディレクトリのパス入力の補完を行ってくれます。
[歴史]javascriptのイディオムにいらいらしそうなときに読むもの

#javascriptのイディオムの歴史
javascriptは生い立ちや立ち位置により少し変わったイディオムを持つ。
jsのイディオムを今の形にした二つの背景がある。

##ある一つの背景「転送量の問題」

javascriptでは、転送量を減らすことを目的としたコードの記述量を減らすためのイディオムが発達した。
簡潔な記述と書くと聞こえはいいが、トリッキーとも言えるイディオムもある。

##また、ある一つの背景「普及の歴史」

普通のプログラミング言語は広く普及する前に少数の先端的な開発者が使う時期がある。その時期にイディオムの核ができる。
しかし、javascriptの場合は、普及初期に飛びついたのがhtmlなどを書くwebデザイナなどが中心だった。また他言語をメインに使う開発者が片手間の言語として使った。
そのため、核となるイディオムがないまま、他の言語の模倣イディオムが広まった。
これが原因で、
javaのように書くjavascriptや
phpのように書くjavascriptなどがある。
近年はjavascriptらしく書くイディオムも広まりつつある。

#参考はパーフェクトjavascriptのp38

javascriptの生い立ち、歴史のある一端を知り、
僕はこれからも彼に不満を抱き続けるかもしれないという、
不安を抱きつつも、
なぜか愛おしくなった話でした:hugging_face:
通勤時間を給与に換算するrubyプログラム

#Qiitaとrubyと通勤時間給与換算初心者です!!
エクセルでやれる計算っていうか、エクセルに向いた計算です...
ruby使うまでもないが、後々rubyで書くことになるので書いた

どの駅に住むのがいちばん経済的かっていうプログラム作る為のパーツ作るために書いた。[chintai.netで家賃相場を調べるrubyプログラム](http://qiita.com/taroyanaka/items/a80eb58bf0c85d483d62)と組み合わせて色々やっていきたい

給与が高い、もしくは、職場近辺の家賃が安い、のであれば職場の最寄りと同じ徒歩圏内に住むのが経済的っていう結果になりそう

変数は短縮せずに書いたほうが分かりやすかった気がする...
各自結果が気になったひとは変数をいじってやってみてほしい。通勤時間は悪


```ruby:moving_time.rb
#moving_time.rb
bonus = 800000 #ボーナス(税引き後ボーナス1年分のトータル)
c_i_m_b = bonus / 12 #ひと月換算のボーナス convert into month
p_i = 200000 #手取り給与 personal income
o_m_w_h = 160 #一か月の労働時間 One month's working hours

p_h = (p_i+c_i_m_b) / o_m_w_h #時給 per_hour
puts "あなたの時給は#{p_h}円です"


w_d = 245 / 12 #出勤日数(365日から年間休日120日を引き一か月辺りに換算) working days
puts "あなたの一か月辺りの出勤日数は#{w_d}日です"

m_m = 60 #通勤の"片道"の移動分数 moving minutes
m_m_e = 0 #月間移動費用 monthly moving expenses

m_h = m_m / 60#.to_f #移動時数 moving_hours
m_m_e = m_h * p_h * 2 * w_d #給与換算(移動時間×時給換算×往復×出勤日数)
puts "月間の移動にかかっている費用は#{m_m_e}円分です"

puts "年間の移動にかかっている費用は#{m_m_e*12}円です"

puts "年間の移動にかかっている時間を労働時間とすると#{m_h*2*w_d*12}時間分です"
```