OmniAICreator/Qiita-1.07M huggingface dataset:
C++ Builder 10.2 Tokyo > Indy > OpenSSL > Error: Could not load SSL library > libeay32.dllとssleay32.dllが関連

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2
   Indy v10.6.2.5366
```

[c++ builder XE4 > smtp.gmail.comでの送信](https://qiita.com/7of9/items/e818ad48aa4f6ee4f984)
を10.2 Tokyoで試そうとした。

- リンク先のコードを実装した
- フォームにTIdSMTPを追加

実行すると下記の`smtp->Connect()`でエラーが出る。

```cpp
	try {
		smtp->Connect();
	} catch (const Exception &e) {
		String msg = e.Message;
		int nop=1;
	}

```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6fde647d-d103-3f07-2cc8-a892c4e81588.png)


### 対処?

libeay32.dllとssleay32.dllが関連しそうだ。
`C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\subversion`に二つのdllがあることは確認している。

実行ファイルのフォルダに二つのdllを置くとメール送信処理は正常に処理された。

XE4の開発環境用OSでは実行ファイルのフォルダに二つのdllはなくてもメールを送信できる。
何か設定をしたのだろうか。

### 関連

- [Indy 10 - IdSMTP.Connect raising “Could not load SSL library.”](https://stackoverflow.com/questions/22050325/indy-10-idsmtp-connect-raising-could-not-load-ssl-library)
    - Indyバージョンが10.0.*と古いため、上記とは違う状況かもしれない
    
- [IndyでSSLするときのssleay32.dllとlibeay32.dll、最新のものが動くとは限らない](http://wandonoweb.com/indy%E3%81%A7ssl%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AEssleay32-dll%E3%81%A8libeay32-dll%E3%80%81%E6%9C%80%E6%96%B0%E3%81%AE%E3%82%82%E3%81%AE%E3%81%8C%E5%8B%95%E3%81%8F%E3%81%A8%E3%81%AF/)
    - 最新のバージョンのdllでは動かず、古いバージョンで動いたという情報

### XE4の状況

- [c++ builder / pop before smtp > SSL library not found > ssleay32.dll / libeay32.dll が必要](https://qiita.com/7of9/items/87e996dfa17c986b900a)

上記のリンクのようにXE4では下記のような状況だった。

- A. IDEインストールのOS: 正常動作
- B. それ以外のOS: SSLライブラリが見つからない

10.2 TokyoになってからAのケースでもSSLライブラリが見つからない、という仕様になったのだろう。
ブランチ戦略とは

##ブランチ戦略とは
「機能Aと機能Bの開発を同時に進めたいが、各々影響を与えあわない状況下で同時に開発を進めたい」といった場合に活躍する仕組み。
masterブランチという現実世界に対して，別のブランチという，複数のパラレルワールドを作るイメージ。
http://gihyo.jp/dev/serial/01/hackgirlsgit/0006
※SAPでいうところの開発機⇒検証機⇒本番機のランドスケープ定義と移送管理を複雑にしたイメージ。

##Git-flowのブランチ戦略とは
・developブランチ
開発を行うためのブランチ。開発者は、主にこのブランチ上で作業を行う。次に紹介するfeatureブランチなど、他のブランチで行った作業は、ここにマージされる
・featureブランチ
主要な機能を実装するためのブランチ。機能の実装やバグフィックスなど、タスクごとにfeatureブランチを作成し、作業を行う
・releaseブランチ
リリースの準備を行うためのブランチ。プロダクトをリリースする前に、このブランチを作成し、微調整を行う。releaseブランチを作成することで、リリース準備と次のバージョンに向けた開発のコードを分けることができる
・masterブランチ
リリースしたソースコードを管理するためのブランチ。リリース作業を行うと、releaseブランチはmasterブランチへマージされて、リリースタグが打たれる。開発者は、このブランチへのコミットは行わない
・hotfixブランチ
リリースされたソフトウェアに緊急の修正を行うためのブランチ。このブランチでの修正内容は、すぐにリリースされるので、hotfixブランチはリリースを管理するmasterブランチへマージされる

##運用イメージ
1,featureブランチで各機能の開発やバグフィックス
2,featureブランチで単体テスト
3,developブランチへマージして
4,ソフトウェアをリリースする段階でreleaseブランチを作成
5,細かいドキュメントの修正やバグフィックス
6,準備が終わってリリースする際には、リリースブランチをmasterブランチへマージし、リリースタグを打つ。
※ソフトウェアリリース後、緊急のバグへの対応は、ホットフィックスとしてリリース。
http://www.atmarkit.co.jp/ait/articles/1311/18/news017.html

##各社のブランチ戦略
・カウルのブランチ戦略
http://techblog.housmart.co.jp/2016/06/22/git-workflow/

・Gitのブランチ戦略
http://nnhrsk.hatenablog.com/entry/2017/02/19/210436

・SAPのブランチ戦略
SAPも短納期開発のためブランチ戦略のページを作成している
https://www.sap.com/japan/services/rapid-deployment/lending-sales-service-banking.html
Visual Studio 2017から MySQL へ接続

簡単ですが、いくつかやり方がありそうですので、一番簡単な方法を。
以下の公式サイトにある注意点を読みながら順番を考えてインストールする必要がありました。
https://dev.mysql.com/doc/visual-studio/en/visual-studio-install.html

# Prerequisites
以下が前提条件となります。順番にインストールします。NySQL for VSとConnectorはこの順番でないとなりません。
- Visual Studio 2017 : これは固定にします。以下2017対応バージョンのみ示します。
- MySQL for Visual Studio 1.2 or 2.0
- MySQL Connector/Net 6.8 以降

対応するVisual StudioやMySQLのバージョンとの関係は上記サイトにある以下の表にまとめられています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/578b8335-5d27-ec9a-2101-88e727a7e291.png)

# Visual Studio 2017
最新の環境を入れておきましょう。
プラグインは残念ながらVisual Studio側のExtensionsにはなっていないようで、「拡張機能と更新プログラム」ギャラリーからは取得できません。
既存のSQL Serverなどのサーバーエクスプローラに拡張される形で入ります。

# MySQL for Visual Studio

Visual Studio 上からMySQLへ接続するためのプラグインです。個別にインストールもできますが、以下のように、MySQLインストーラから選択可能になるので、これが楽です。
https://dev.mysql.com/downloads/installer/

インストーラ（プラグインだけなので、Webインストーラがよいかと）を起動すると以下のような画面になります。
これはすでにインストール済みのものなので、初めてのときはここは白紙です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/2d6534e3-1050-7c7a-285f-a64628b7f597.png)

「Add...」ボタンを押すとProductの選択画面になるので、「Applications」からMySQL for Visual Studioを選択しインストールです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/1ac6cc00-cee4-094b-4586-5bbb36ebe7ae.png)

なお、バージョンは最新のものしか選べないので、古いものを使いたい場合は個別のダウンロードになると思います。

# MySQL Connector/Net

.NET開発をするのでなくてもこれは入れないとだめなようです。ODBCの面倒な設定をしなくても直接つながりますので、便利ですね。
上記インストーラで同じようにインストールするだけです。「Connector」から選択可能です。

# 使う

サーバーエクスプローラからデータベースへの接続を行いましょう、例えば、以下のボタンなど。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/4a2ddff9-146d-abbe-9f9a-65792c8adba4.png)
初回はデータソース選択画面になります。デフォルトのSQL ServerやODBCに加えてMySQLへのConnectorが追加されているのがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/4f607fc9-d789-26e8-a2a5-8cc53afea98b.png)

接続はいたってシンプル。SQL Serverより簡単ですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/c875bf9c-0be3-d0e8-df77-0d11e769ae09.png)

あとは他のデータベース同様、データ／スキーマの取得やクエリー、デザインなどが可能になります。
Linuxカーネルモジュールのインストールに使うスクリプト

いつも必要になるたびに調べているので、ここに書いておく。

# Linuxカーネルのインストール

ARMの組み込みLinuxの場合、カーネルをビルドするとuImage, dtbファイル、カーネルモジュール群ができ上がる。uImageとdtbファイルはなんらかの方法でubootに送り込む。
カーネルモジュール群はルートファイルシステム上にインストールする。ここで「群」と書いた通り、カーネルモジュールのファイルは通常はたくさんある。しかも単にコピーするだけではなくて、依存関係などの情報を保持するファイルを生成する必要もある。

# カーネルモジュールのインストール

これを行うためには、環境変数 INSTALL_MOD_PATHに目的のルートファイルシステムのトップディレクトリをセットして make modules_install を実行すればよい。
しかし、これらのファイルを書き込むディレクトリは通常root権限が必要である。
そのため sudo をつけて実行することになるが、そうするとカーネルのmake に必要な ARCH や CROSS_COMPILE などの環境変数が引き継がれないためうまくいかない。

よって、ひとつのシェルスクリプトファイルに必要な環境変数を全部書いておいて、それを sudo で実行することにする。

```sh:mod_install.sh
#!/bin/sh -x
export PATH=/path/to/cross/compiler:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-linux-
export INSTALL_MOD_PATH=/path/to/rootfs/
make modules_install
```
それぞれの項目は必要に応じて変更してください。
このファイルをカーネルをビルドするディレクトリに置いておく。

#使い方

```
make -j8
make uImage
```
(これでビルド完了。uImage, dtbファイルは例えばtftp用ディレクトリにコピーする)

```
sudo ./mod_install.sh
```
で、カーネルインストールが完了する。
パスワード付きzipファイルの作成方法(Mac)

## 環境
- OS：macOS High Sierra 10.13.1

## パスワード付きzipファイルの作成

`zip -e` コマンドを使うと一発で作成できます。
フォルダでなくファイルを圧縮する場合、 `-r` オプションは不要です。

```bash
$ zip -er {作成先ファイルパス}.zip {作成元フォルダパス}
Enter password: {パスワードを入力する}
Verify password: {再度パスワードを入力する}
```

作成済みのzipファイルにパスワードを付けたい場合、 `zipcloak` コマンドを使います。

```bash
# zipファイルを作成する
$ zip -r {作成先ファイルパス}.zip {作成元フォルダパス}

# zipファイルにパスワードを付ける
$ zipcloak {zipファイルパス}
Enter password: {パスワードを入力する}
Verify password: {再度パスワードを入力する}
```

## 注意

「右クリック>“{ファイル名}”を圧縮」からzipファイルを作成すると、 `zipcloak` コマンドで `zipcloak warning: Local Entry CRC does not match CD: {ファイル名}` の警告が発生します。
 `zip` コマンドで圧縮した場合は発生しません。

## 参考リンク
- [macOSでパスワード付きzipを作成する - YAMAGUCHI::weblog](http://ymotongpoo.hatenablog.com/entry/2017/04/24/151211)
- [Mac（OS X）でパスワード付きZIPファイルを作成する：Tech TIPS - ＠IT](http://www.atmarkit.co.jp/ait/articles/1511/20/news027.html)
- [Mac OS Xでパスワード付きZIPファイルをつくる - domeiの日記](http://d.hatena.ne.jp/domei/20101119/1290173441)
【Laravel】カラム値の一部を切り出してソートをかける方法

# 値の一部分だけをソートしたい

ある項目の一部分だけソートをかけたい場合は以下のように
**ある項目の値をsubstrで切り出し、切り出した値を新しくselect項目に追加し、order by句でその項目をソートする**
という方法を使う（んだと思ってます）

例）
**あるテーブルのチームID（形式：[所属番号1桁]-[連番3桁]）の所属番号部分は昇順、連番部分は降順という並びでチームIDを取得したい。**
（チームID例：1-050）

```php
// mysqlの場合substring　引数は次の通り→substring(value, start, length)
$query->selectRaw('*, SUBSTRING(team_id, 1, 1) AS affiliation_of_team_id ,SUBSTRING(team_id, 3, 3) AS sequence_of_team_id')
      ->orderBy('affiliation_of_team_id')
      ->orderBy('sequence_of_team_id','DESC'));
```

この場合、以下のような並びでチームIDを取得できる

```
1-050
1-049
2-020
2-019 
3-044 
…
9-099
```

# 参考リンク
   - [php - How to use substr() inside an orderBy function in Laravel - Stack Overflow](https://stackoverflow.com/questions/27868991/how-to-use-substr-inside-an-orderby-function-in-laravel)
minerd改善ポイント（メモ）

#mining thread

実際のハッシュ計算処理のAVX2化とかは別の人がやっているので、処理の流れを見ながら気づいた点とかのメモ

１．while(1)ループ内にif文が多い。それも起動時にフラグが確定するようなので
最近のCPUの分岐予測は賢くなっているし、コンパイラも賢くなっているので、どれだけ効果があるか分からないが、
ループ中の条件分岐は少なければ少ない方が条件分岐予測を間違って投機実行している分が無駄になるということが減る。
条件分岐ではなく、数値演算で同じ値を導くようにする。

２．内部で変わらない数値計算はループの外に出す。
ループの外で計算して変数に入れておく。

３．time(NULL)とか時間取得関数とか
システムコールなので遅い。使う頻度を減らすとか。

全体的な感想としては、とても素直にロジックを組んであって読みやすい。
一方で高速化という点は考慮されていないように見える。

実行ログを見ていると、while(1)ループは１秒に１回くらいしかループしていないようなので、やらなくていいんじゃないかな感ある。


#yescrypt_bitzeny()
スレッドごとに初期化する処理がここに入っているが、無駄なのでループの外に出すべき。
あと、エラーがあったときも戻り値使用してないけど再初期化とかいらないのかしら？

#pretest()
宣言にinline追加

#yescrypt_hash()
宣言にinline追加

#yescrypt_kdf()
乗算・除算をシフト演算に置き換える（コンパイラーがやる気がする）
同じ演算内容を変数に格納して使う。

#smix(),smix1(),smix2()
yescriptに限定すれば処理の簡略化ができる。
それにしても条件分岐が多い。確かにGPU向きじゃない。Radeon(OpenCL)なら対応できるかもしれないけどGeForce(CUDA)では無理か向かない。
→乗算除算をシフト演算に、剰余算をビット演算に、乗算を加算に置き換えることで0.1kh/s（0.7%）改善


#work.data
data[0]:job.version
data[1-8]:job.prevhash
data[9-16]:merkle_root
data[17]:job.ntime
data[18]:job.nbits
data[19]：現在計算した最大Nonce
https://bitflyer.jp/ja/glossary/Nonce
ハッシュレートの計算に使われる。
data[20]:0x80000000
data[31]:0x00000280

#miner_thread()のバグ？
uint32_t end_nonce = 0xffffffffU / opt_n_threads * (thr_id + 1) - 0x20;
スレッド毎に使用するNonceの範囲を均等に割り当てているようだが、0x20の意味は？
開始Nonceは下記の式で決まっているので、
work.data[19] = 0xffffffffU / opt_n_threads * thr_id;
計算されないNonceが約0x20 * スレッド数になるのでバグ（本来見つかるべきBlockを見落とす可能性がある）なのでは？
例えば１６スレッドの場合に１６番目（thr_id=15)のend_nonceは
0xffffffff:0xffffffffU
0x0fffffff:0xffffffffU / opt_n_threads
0xfffffff0:0xffffffffU / opt_n_threads * (thr_id + 1)
0xffffffd0:0xffffffffU / opt_n_threads * (thr_id + 1) - 0x20
となる。
「- 0x20」を削る必要と、
if(opt_n_threads == (thr_id + 1)){
  end_nonce = 0xffffffffU;
}
が必要だろう。
ハッシュの計算を0x20Nonce単位で行っている可能性もあるが、その場合スレッド間で計算領域が重複している。
＊Nonceの進捗が++nでループしていたからそれも無いと思う。

フォーラムで報告中

Nonceの割当をスレッドに対して均等に行っているとすると、計算スレッド数はコア数か論理CPU数（-通信とかOS用）がボトルネックが無くなって良いことになる。
下手にスレッド数を増やすと、遅いスレッドの計算完了待ち時間が発生していて表示上現れないハッシュレートの低下が起きている？
Instagramの画像を簡単に保存する方法　VBscriptでInstagramのWEBスクレイピングした話

インスタグラムの仕様変更で非ログインでは取得できなくなりました(20201201)

# VBscriptでInstagramのWEBスクレイピングした話
Instagramの画像を簡単に保存する方法
## 目的
Instagramの画像を扱いやすい形式にしてlocalhostで参照する

## 経緯
Instagramの画像を保存したい
↓
Instagramの画像はdivタグでマスクされていて右クリックで簡単に保存したりできないようになっている
↓
画像を保存したければF12キーを押して開発者ツールを立ち上げるか外部サービスにURLを貼り付けるのが主流
↓
これは面倒くさい

WEBで公開されているものだしウェブスクレイピング（Web scraping）します

## 環境
言語：VBScript
サーバー：Windows IIS ASP

## ソース
全体はgithub参照くださいhttps://github.com/wagase/VBscraping/tree/master/Instagram
個別解説
### WEBサイトへアクセス

	Private Function getXMLHTTP(byval url)

		Dim xmlhttp,resText
		Set xmlhttp = Server.Createobject("MSXML2.ServerXMLHTTP")
		xmlhttp.Open "GET",url, False
		xmlhttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
		xmlhttp.Send ""
		resText = xmlhttp.responseText
		Set xmlhttp = Nothing

		getXMLHTTP = resText
	End Function`
VBSでWEBサイトへアクセスするには
Server.Createobject("MSXML2.ServerXMLHTTP")
を使います
xmlhttp.responseTextで結果が（この場合HTMLが）返ってくるのでそれを解析します

### HTMLの解析
実際にだれかのInstagramにアクセスしてソースをみるとscriptタグでjavascriptの記述があることがわかります。これをテキスト形式で取得することになるので正規表現で解析します。
こんな感じで
`"https://scontent-nrt1-1\.cdninstagram\.com.*?\.jpg"`
取得したものをHTMLで<img src=～～と書き直してやれば画像を取るだけなら終了です

### 動画もほしい
動画をとるには工夫が必要でInstagramの記事固有ページに行く必要がありました

記事固有ページへは上記のjavascriptでcodeと書かれている１１桁の英数字の文字列を
`https://www.instagram.com/p/(１１桁の英数字)`
のようにすると行けるようです
したがってまずは個別ページのcodeを取得します
正規表現で
`"""code"":.*?"", ""date"""`
とかきMid関数で１０文字目から１１文字抜くと良さそうです

	Set regEx = CreateObject("VBScript.RegExp")
	regEx.Pattern = """code"":.*?"", ""date"""
	regEx.IgnoreCase = False ' 大文字と小文字を区別しない
	regEx.Global = True ' 文字列全体を検索

あとは
`Set matches = regEx.Execute()`
を使って順番に個別ページにアクセスを行いそれぞれ結果を取得して
画像なら
`<img src="(画像URL)">`
動画なら
`<video autoplay loop muted controls><source src="(動画URL)" type=""video/mp4"" /></video>`
と書いてresponse.Writeしてやるとマスクのかかっていない画像の一覧が取得できます
[WordPress] Breadcrumb Nav XTでパンくずナビゲーションをJSON-LDフォーマットにしたい

# JSON-LDフォーマットのパンくずナビゲーション
https://schema.org/BreadcrumbList

```
<script type="application/ld+json">
{
 "@context": "http://schema.org",
 "@type": "BreadcrumbList",
 "itemListElement":
 [
  {
   "@type": "ListItem",
   "position": 1,
   "item":
   {
    "@id": "https://example.com/dresses",
    "name": "Dresses"
    }
  },
  {
   "@type": "ListItem",
  "position": 2,
  "item":
   {
     "@id": "https://example.com/dresses/real",
     "name": "Real Dresses"
   }
  }
 ]
}
</script>
```

# Breadcrumb NavXT で対応

## プラグインと対応バージョン
https://ja.wordpress.org/plugins/breadcrumb-navxt/
パンくず系では定番。
デフォルトではRDFaフォーフォーマットで出力します。
JSON-LDフォーマットで出力する関数は `bcn_display_json_ld()` でプラグインのバージョン5.7.0以上で対応してます。

## 出力の仕方
プラグイン作者によるドキュメント
https://mtekk.us/archives/guides/fun-with-bcn_display_json_ld-the-basics/

`<head>` タグ内で出力する場合。

```php
<?php
add_action( 'wp_head', 'my_json_ld_breadcrumb_trail', 10 );
function my_json_ld_breadcrumb_trail() {
    if ( function_exists( 'bcn_display_json_ld' ) ) {
        printf( '<script type="application/ld+json">%s</script>', bcn_display_json_ld( true ) );
    }
}
?>
```

これとは別に見た目でもパンくずを出す場合は今までどり。
テーマのファイルを編集する必要があります。公式ディレクトリ掲載のテーマなら[子テーマ](https://wpdocs.osdn.jp/%E5%AD%90%E3%83%86%E3%83%BC%E3%83%9E)にしてから作業しましょう。

```php
<?php
if ( function_exists( 'bcn_display' ) ) {
    bcn_display();
}
```

現場からは以上です。
Drupal7 SMTP設定とHTMLメールの方法

# 設定内容
SMTPでメールアカウントを設定した上でHTMLメールの送信を行う。

SMTPの設定はSMTP Authentication Supportモジュールを用いる。
HTMLの設定はHTML Mailモジュールを用いる。

そのままモジュールを入れて設定しても片方の設定しか機能しないため、両方の設定を合わせて使えるように設定する。

# 必要なモジュール
- [SMTP Authentication Support](https://www.drupal.org/project/smtp)
- [HTML Mail](https://www.drupal.org/project/htmlmail)
- [Mail System](https://www.drupal.org/project/mailsystem)

# 設定方法
### SMTP Authentication Support
環境設定 > システム > SMTP Auth...(admin/config/system/smtp)でSMTPの設定をする。

Turn this module on or offをオンにする。
これはモジュールの設定を有効にするために必要。

SMTP serverにSMTPサーバーのアドレスを設定する。
メールアカウントのSMTPのサーバーは確認してください。

SMTPポートは25等メールアカウントの方で決められているものを設定する。
サブミッションポート等でポート番号が別途決められている可能性があるため、提供元から確認してください。
Gmailの場合は465

Use encrypted protocolはTLSかSSLを用いているかを設定する。
これもメールアカウントの設定に依存するため、そちらを確認してください。

Send test e-mail の E-mail address to send a test e-mail to にメールアドレスを登録すると、設定保存時にテストメールが送られます。
これでテストメールが無事届けば、設定は成功です。
上手く行かない場合は、メールの設定をよく確認してください。

触れていない部分については内容を理解した上でお好みで設定してください。

### HTML Mail
環境設定 > システム > HTML Mail(admin/config/system/htmlmail)で設定する。

Step1, Step2については必要なければそのままで大丈夫です。
Step3のPost-filteringはメールに使用するテキストフォーマットを指定します。

### Mail System
環境設定 > システム > Mail System(admin/config/system/mailsystem)で設定する。

New Classの
Class to use for the **format()** method で **HTMLMailSystem** を選択
Class to use for the **mail()** method で **SMTPMailSystem** を選択
一旦設定を保存してください。

HTMLMailSystem__SMTPMailSystem という新しいメール送信方法が追加されます。
これをSite-wide default MailSystemInterface classとHTML Mail module classに設定してください。
これでSMTPの設定でHTMLのメール送信ができるようになります。おめでとうございます。

要約するとメールフォーマットはHTML Mailの設定、メール送信はSMTP Mailの設定で行うクラスを作成する手法になります
Blogosメルマガが終了するので、Pythonでスクレイピングして過去記事を保存してみた

#Blogosメルマガが終了します

【重要】サービス終了に関するお知らせ
平素より、BLOGOSメルマガをご愛顧いただき、誠にありがとうございます。
2018年3月26日をもちまして「BLOGOSメルマガ」を終了させていただくこととなりました。


詳細につきましては、以下お知らせをご覧くださいますようお願い申し上げます。
BLOGOSメルマガ サービス終了のお知らせ
 http://magazine.livedoor.com/


#経緯
今まで購入したメルマガを保存しておきたい！

Blogosメルマガってweb上でのフォント・文字の大きさともにちょうどよい大きさで好きで、
なおかつ、定期購読していたものはちゃんと購入済みとして閲覧できるので好きでした。

まぐまぐ、note,ニコニコメルマガは購読をストップすると過去のコンテンツが一切見れません。noteで単品購入すると過去に購入したコンテンツとして見れます。（定期購読した場合は購読解除で購入済みは読めなくなります。）

だからBlogosメルマガはけっこう重宝していたので、終了するのがショックです！！


#はじめてのスクレイピング
大昔にRubyのスクレイピングの本を積読したものの、まったくスクレイピングしなかったのですが、今回は期限が迫っているのでモチベーションがちゃんとありました。
Pythonほぼほぼ初心者なので、汚いコードかと思いますが、ここにあるコードを改変すれば、
Blogosメルマガで購読したメルマガを保存できると思います。

#login

ここにユーザー名とパスワードを入れてください。
USER = ""
PASS = ""

```python3
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

# メールアドレスとパスワードの指定
USER = ""
PASS = ""

# セッションを開始
session = requests.session()

# ログイン
login_info = {
    "livedoor_id":USER,
    "password":PASS
}

url_login = "https://member.livedoor.com/login/?.next=http%3A%2F%2Fmagazine.livedoor.com%2Fmanage%2F&.sv=magazine"
res = session.post(url_login, data=login_info)
res.raise_for_status() # エラーならここで例外を発生させる

```

#ログイン後、特定の購読済みのメルマガがリストとして載っているページを探す。
変数resにログイン後のページのオブジェクトを入れています。
BeautifulSoupというParserを使って、aタグをすべて抽出しました。
配列で返ってきているので、僕の場合は６番目にありましたので6と指定しています、

```python3
#続き
# マイページのURLをピックアップする
soup = BeautifulSoup(res.text,"html.parser")
a = soup.find_all("a")
a = a[6]

if a is None:
    print("マイページが取得できませんでした")
    quit()

# 相対URLを絶対URLに変換
url_mypage = urljoin(url_login, a.attrs["href"])

```

#購入済みのメルマガ一覧画面からメルマガをダウンロードする
そのメルマガページ数を見ると８ページありましたので、８と指定しました。
 

```python3
#続き
#ページ数
pages = 8

for i in range(pages):
    res = session.get(f"{url_mypage}?p={i+1}")
    res.raise_for_status()
    soup2 = BeautifulSoup(res.text, "html.parser")
    d = soup2.find_all(class_ = "title")
    for i in range(len(d)-1):
        url = d[i+1].find("a").attrs["href"]
        res = session.get(url)
        res.raise_for_status()
        x = url.split('/')
        name = x[-1].split(".")[0]
        with open( f'{name}.html','w') as file:
            file.write(res.text)

print("done!")

```


これでダウンロードできたかと思います。
生のhtmlがダウンロードできただけですので、
開くとCSSが適用されていないので綺麗になっていませんが、
その辺もゴニョゴニョ綺麗にして頂ければと思います。
2018-01-10 C++ Builder | TeeChart > difference > XE4と10.2 Tokyo (2019-08-30更新)

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

XE4で動作検証済のTeeChartが関係する40近くのソースを10.2 Tokyoで動作確認した。
(TeeChartは別途購入済のもの[上記]を使用）。
10.2 Tokyoでの動作確認済についてはQiita記事タイトルに「10.2 Tokyo」の記載を追加している。

## XE4から10.2 Tokyo移行時の注意点・留意点

### Hover機能
Hover機能という用途不明な機能が追加され、標準でONになっている。

- [C++ Builder 10.2 Tokyo > TeeChart > UI > 目的の不明なBold表示 | (Hover)機能の無効化](https://qiita.com/7of9/items/d0801b603c6e70247317)
    - コードで無効にするのが良い
    - デザインで無効にすると移植時に認識漏れが発生する

### データポイントのマウスオーバー強調
(2019-08-30追加)

- [C++ Builder 10.2 Tokyo > TeeChart > データポイントのマウスオーバー強調表示機能の無効化](https://qiita.com/7of9/items/8f2a9c0fc516b2c62a1c)

### 範囲指定色の仕様変更

- [C++ Builder > TeeChart > Difference > XE4 | 10.2 Tokyo > 範囲指定のデフォルト色が異なる (XE4から10.2Tokyoへの移行)](https://qiita.com/7of9/items/16dcac00a549b0847e54)


### バグ > StatusBar1.Panels[] > bdRightToLeft設定時の不具合 > フォーム右下の文字の一部が欠損する

- [C++ Builder 10.2 Tokyo > StatusBar1.Panels[] > bdRightToLeft設定時の不具合 > フォーム右下の文字の一部が欠損する](https://qiita.com/7of9/items/99df5770db0bcf731779)

### その他

今後使っていくなかで、他の細かい変更点は見つかるかもしれない。
メモリリーク関連は詳細を見ていない。

### 他の不具合など
(2019-08-30追加)

以下に細かい差異(バグも含む）へのリンクを掲載している。

- [C++ Builder > difference > XE4と10.2 Tokyo Update 2 (2018-01-09新規, 2018-01-10更新)](https://qiita.com/7of9/items/9572a782fedc87e25ff3)
macのエクセルで作成したPDFをブラウザで開いた場合の表示タイトル変更

サイトにPDFをアップロードしてブラウザ上で開いた場合のタイトルが文字化けしている事象が発生。　　

エクセルを開いてcommand+pで印刷ダイアログを開き、左下のプルダウンで「pdfとして保存」を選択。　　
保存ダイアログの下の「タイトル」に入れた文字がブラウザで開いた場合のタイトルとなる。

<img width="817" alt="スクリーンショット_2018-01-10_10_44_20.png" src="https://qiita-image-store.s3.amazonaws.com/0/30951/d989f6f7-41c4-1a5e-3554-d29be3ae6b2e.png">


エクセルのバージョンは15.41。
<img width="369" alt="mac_excel_version.png" src="https://qiita-image-store.s3.amazonaws.com/0/30951/8f4d9294-8b70-0b4c-cad0-467e893e1df2.png">

参考：[PDFファイルをブラウザで開いた時の表示名や表示サイズを変更してみた！ – やってみたら、できた。](http://www.narugaro.com/day/pdf%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E9%96%8B%E3%81%84%E3%81%9F%E6%99%82%E3%81%AE%E8%A1%A8%E7%A4%BA%E5%90%8D%E3%82%84%E8%A1%A8%E7%A4%BA/)

参考リンク先はacrobatでやってるけど、エクセルでもできた。
C++ Builder > TeeChart > Difference > XE4 | 10.2 Tokyo > 範囲指定のデフォルト色が異なる (XE4から10.2Tokyoへの移行)


```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```


XE4
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d2367e0f-bdb9-356b-d771-c8f3e759db8e.png)

10.2 Tokyo
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d5b6da55-6131-0bd3-6d87-fcb040a0f1e7.png)

上記のように、範囲指定の色は下記のように仕様変更されている。

- XE4: 白色
- 10.2 Tokyo: 薄灰色

視認性は上がったが、デフォルト色を使用しているソフトにおいてはUIが変わってしまう。
Docker for Macのインストール

###:large_blue_circle: 公式からインストール
https://www.docker.com/docker-mac
OSX Yosemite 10.10.3以上である必要があります。
###:large_blue_circle: インストールができているか確認しましょう。

```
$ docker run hello-world
```

```
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

このメッセージが表示されればOKです。

###:large_blue_circle: ubuntuをxhyveで起動しましょう！

```
$ docker run -it ubuntu bash
```

```
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
50aff78429b1: Pull complete 
f6d82e297bce: Pull complete 
275abb2c8a6f: Pull complete 
9f15a39356d6: Pull complete 
fc0342a94c89: Pull complete 
Digest: sha256:ec0e4e8bf2c1178e025099eed57c566959bb408c6b478c284c1683bc4298b683
Status: Downloaded newer image for ubuntu:latest
root@cb4f20859b19:/#
```

無事ubuntuに入り、rootになってますね。起動も早いです。


Docker for Macではvurtualboxではなくxhyveを使うようです。
vurtualboxを使いたい場合はDocker for MacではなくDocker toolboxをインストールしましょう。
[Docker toolboxのインストール（公式）](https://docs.docker.com/toolbox/toolbox_install_mac/)
rbenvでrubyインストール in proxy環境

proxy環境だとruby-build内のcurlコマンドの引数のせいでうまくrbenvインストールできなかったのでメモ。
proxy環境でrbenvを使ったrubyインストール手順は以下のDockerfileを参照。今回は2.5.0を入れた。


```bash:
$ curl --help | grep -- ' -q'
 -q                 If used as the first parameter disables .curlrc
```

```:Dockerfile
FROM             centos:centos7.4.1708
MAINTAINER       TestUser
ENV              container docker
ENV              HTTP_PROXY=${HTTP_PROXY}
ENV              HTTPS_PROXY=${HTTPS_PROXY}
ENV              ruby_ver=2.5.0
ENV              my_ruby_dir=任意のディレクトリを指定
ENV              my_ruby_build_dir=${my_ruby_dir}/plugins/ruby-build
ENV              my_ruby_plug_dir=${my_ruby_dir}/plugins/rbenv-default-gems
ADD              yum.conf /etc/
ADD              .gitconfig /root/.gitconfig
# proxy設定が書かれたホストの.curlrcをコピーする。
# 書き方は、ぐぐったらすぐに出てくる。
ADD              .curlrc /root/.curlrc
ADD              wgetrc /etc/wgetrc
RUN              yum update -y && yum clean all
RUN              yum swap -y fakesystemd systemd && yum clean all
RUN              yum install -y httpd && yum clean all
RUN              yum install -y iproute
RUN              systemctl enable httpd
RUN              mkdir /root/fileserver_conf

RUN              yum -y install make tar git wget gcc-c++ openssl-devel \
                     readline-devel gdbm-devel libffi-devel zlib-devel \
                     curl-devel procps autoconf sudo bzip2 gcc
RUN              git clone https://github.com/rbenv/rbenv.git ${my_ruby_dir}
RUN              mkdir ${my_ruby_dir}/{shims,versions,plugins}
RUN              groupadd rbenv
RUN              chgrp -R rbenv ${my_ruby_dir}
RUN              chmod -R g+rwxXs ${my_ruby_dir}
RUN              git clone https://github.com/rbenv/ruby-build.git ${my_ruby_build_dir}
RUN              chgrp -R rbenv ${my_ruby_build_dir}
RUN              chmod -R g+rwxs ${my_ruby_build_dir}
RUN              ${my_ruby_build_dir}/install.sh
RUN              git clone https://github.com/rbenv/rbenv-default-gems.git ${my_ruby_plug_dir}
RUN              chgrp -R rbenv ${my_ruby_plug_dir}
RUN              chmod -R g+rwxs ${my_ruby_plug_dir}
RUN              echo "export RBENV_ROOT=\"${my_ruby_dir}\"" >> /etc/profile.d/rbenv.sh
RUN              echo "export PATH=\"${my_ruby_dir}/bin:$PATH\"" >> /etc/profile.d/rbenv.sh
RUN              echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
RUN              echo '%rbenv ALL=(ALL) ALL' >> /etc/sudoers
RUN              source /etc/profile.d/rbenv.sh
# curlの-q引数をsedで削除する。
RUN              sed -i".org" -e 's/curl -qsILf/curl -sILf/g' -e 's/curl -q -o/curl -o/g' ${my_ruby_build_dir}/bin/ruby-build
RUN              su -l root -c "${my_ruby_dir}/bin/rbenv install 2.5.0 -v"
RUN              su -l root -c "${my_ruby_dir}/bin/rbenv rehash"
RUN              su -l root -c "${my_ruby_dir}/bin/rbenv global 2.5.0"
#EXPOSE           80

```
Ruby：あるディレクトリ内にあるすべてのファイル名を別のファイル名に変更するプログラム

## 目的
あるディレクトリ内の画像ファイルの名前が日本語になっていたので、DB上対応するidに一気に変更したかった。
120個くらいしかなかったので気合でもできたが、プログラミングの学習のためにあえてRubyで実装。

## 環境
ruby 2.4.2

## 準備
現状のファイル名と変更後のファイル名が1on1で対応しているcsv（などの）ファイルを作成しておく（以下、便宜的に``namechange.csv``と命名。当csvファイルは、1列目に現状のファイル名、2列目に変更後のファイル名を記載。）。
なお画像は、 ./imagefolder という名前のフォルダにすべて入っているものとする。

## 実装内容
### ``namechange.csv``を配列化
```ruby:namechange.rb
table = CSV.read('namechange.csv')
```


### ディレクトリ内のファイル名を取得して配列に代入
```ruby:namechange.rb
filenames = []
dir = Dir.open("imagefolder")
 dir.each do  |file|
  filenames << file
 end

x = filenames.length
x = x-1 #ディレクトリ内には.DS_Storeが存在するため長さを調整
```

### tableの列を分解して代入
```ruby:namechange.rb
prename = Array.new(x)
postname = Array.new(x)

for num in 0..x-1
  prename[num] = table[num][0]
  postname[num] = table[num][1]
end
```

### tableの旧ファイルとディレクトリのファイル名を一致させて、ファイル名を書き換え
```ruby:namechange.rb
for m in 0 .. x
  y = prename.find_index(filenames[m])
    if y == nil then 
      else
        FileUtils.mv("./imagefolder/#{filenames[m]}","./imagefolder/#{postname[y]}")
      end
end

p "Finish!"
```
メールサーバがブラックリストに登録されたら。

2018.03.19 追記

一括でブラックリスト登録をチェックしてくれるサイトがあったので、そちらを追記します。

https://mxtoolbox.com/
<img width="479" alt="スクリーンショット 2018-03-19 13.14.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/57579/ab93c33d-ad10-44cb-2874-9ef01c5b8fb9.png">

Domain Nameの箇所にドメイン名を入力して、MX Lookupボタンをクリックすると
確認したいドメインのブラックリスト登録状況や、DKIM / SPF / DMARCなどの確認も一括してやってくれます。

お時間がない方はぜひこちらをご利用ください。

----

本来エラーアドレスに何度も、大量に送ったりしちゃいけないのですが、
メール配信する人に知識がいないとブラックリストに登録されることがあります。
仮にそうなった場合、私がよくやる対応をメモ。

ブラックリストに登録されているかどうかを確認
http://www.blacklistalert.org
こちらにアクセスし、メールサーバのIPを入力して確認。

例えばバラクーダのブラックリストに登録されちゃった場合
b.barracudacentral.org Listed! See why 
ということで、Listedのメッセージが表示されます。

クリックすると解除申請のためのサイトに移動できるので、移動します。
申請が受理されるまで最短で半日程度必要になります。

私がバラクーダにお願いするときは以下の文面を使っています。

--- 以下文面 ---
メールアドレスはブラックリスト対象になっているドメインの有効なアドレスで

Mail seems to become spam treatment.
Mail cannot be sent.
Please release it.

署名（きちんと連絡が取れる内容で、メールだけでなく、電話番号もつけるようにしています）
xxxxx co.,ltd.
Tel +81-xx-xxx-xxxxx
--- 以上文面 ---


教訓
1. 配信対象のメールアドレスはちゃんとメンテナンスしましょう。
2. 短時間に大量のメール配信はやめましょう
3. 大量のメールを送る場合はきちんと第三者の配信システムを使いましょう。

会社のドメインがブロックされてしまうと重要なメールが送れなくなるため、
自分以外の多くの人に迷惑がかかりますので。

それでもなんとかしないといけない時のために記憶の片隅に。
機械学習論文読みメモ_113


[Residual Attention Network for Image Classification](https://arxiv.org/abs/1704.06904)
画像分類のためのネットワーク構造として、
attention構造を持ったresidual networkを提案する。
この構造は、ネットワークが深くなるに連れ、attentionする場所が適応的に変化していく。
またattention構造内にsegmentationなどで良く使われる、低解像度化・抽象化するbottom-upと高解像度化・具体化するtop-down構造を使う事でattention maskを獲得するようにしている。

[CASENet: Deep Category-Aware Semantic Edge Detection](https://arxiv.org/abs/1705.09759), CVPR2017
画像認識の様々のタスクにおいて、境界検出は重要な役目を果たす。
従来の境界検出は、境界であるかどうかの二値予測であったが、
本論ではcategory aware、つまりその境界が属する潜在クラスも同時に判別する事を考える。
これは境界が複数のラベルに属する事が可能なため、multi class label問題として考えられる。
本論ではend to endなネットワークによりこのタスクを学習する。
提案ネットワークはresnet basedであり、top layerから得られた分類結果とbottom layerの特徴
を組み合わせた特徴表現を用いて最終的な結果を出す。

[Network Dissection: Quantifying Interpretability of Deep Visual Representations](https://arxiv.org/abs/1704.05796), CVPR2017
CNNの潜在表現の理解するためのフレームワークとしてNetwork Dissectionを提案する。
この手法は意味コンセプトと隠れユニットを対応させる事を可能にする。
そのユニットは対応する対象の範囲に対して関連付けられ、可視化する事が可能である。
また理解可能な表現は特徴空間の各軸上に沿って現れるため、回転によって理解可能な表現が軸上より失われる事がわかった。
また様々なネットワークにおいて得られる表現の違いについても比較した。
CentOSにTruffleとOpenZeppelinの環境構築

スマートコントラクトの環境構築は、だいたいUbuntuベースですが
CentOSで環境を構築する際のメモ
既にnodejsがインストールされている場合はアンインストールしておく。


#### 環境
CentOS release 6.9

### nodejs 9をインストール

```
curl --silent --location https://rpm.nodesource.com/setup_9.x | bash -
yum -u install nodejs
```

### Truffleをインストール

```
npm install -g truffle
mkdir test_truffle
cd test_truffle/
truffle init
```

### OpenZeppelinをインストール

```
npm init
npm install zeppelin-solidity
```

/node_modules/zeppelin-solidity/contracts ディレクトリが生成されていれば成功。
runnable.comに接続するとhttps://www.wowrack.com/1GB.fileに飛ばされる

```
wget http://code.runnable.com/                                                                                                 
--2018-01-10 10:11:34--  http://code.runnable.com/
Resolving code.runnable.com (code.runnable.com)... 104.27.177.64, 104.27.176.64, 2400:cb00:2048:1::681b:b140, ...
Connecting to code.runnable.com (code.runnable.com)|104.27.177.64|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.wowrack.com/1GB.file [following]
--2018-01-10 10:11:34--  https://www.wowrack.com/1GB.file
Resolving www.wowrack.com (www.wowrack.com)... 208.115.121.82
Connecting to www.wowrack.com (www.wowrack.com)|208.115.121.82|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1073741824 (1.0G) [text/plain]
Saving to: ‘index.html’
```

トップだけではなく、コードが書かれていそうなURLもダメ。

[プログラミングって一つの言語ができれば他のもできるとか言います... - Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13183606663)
の
h ttp://code.runnable.com/VWBvJvTF9EZ81rxo/yahoo_syouhinn_price_list_by_ruby
や、
[こわくないHaskell入門（初級） - Qiita](https://qiita.com/arowM/items/9ebfb7cafecd99290663#_reference-b73aa4c2b501cb5c0180)
の**Haskellで遊べる環境**
h ttp://runnable.com/VKgDYJy1EnlDfVOR/haskell-sample
で起きる。
ただし、
http://runnable.com/ 
はセーフ。
301リダイレクト先は、
[Wowrack - Network Tools](https://wowrack.com/network-tools)
を見るとダウンロードテスト用のアドレスのようだ。

うっかり踏むとブラウザが固まるので注意。…しようもないか。
検索してもそれらしい話が出ないので、こちらのネットワークが悪いのか？(一応WindowsとwgetしているLinuxは別なのでPC単体ではないと思う)
GIGGLEでゲノム区間を検索する


## 導入

Nature Methods に GIGGLE というツールの論文を見つけたので、記事を書きました。  
https://www.nature.com/articles/nmeth.4556 (Biorxivのpreprint http://www.biorxiv.org/content/early/2017/06/29/157735 )

GitHubページはこちら https://github.com/ryanlayer/giggle


## ゲノム区間とは

ゲノム区間 (Genome interval, Genomic interval)は、ゲノム上の特徴 (feature) やゲノムアノテーションの位置を記述する方法です。ゲノムは塩基配列ですが、各塩基に座標が定義されています。「どの染色体のどこからのどこの区間か」によって、転写因子結合部位、DNA変異の位置、遺伝子領域などを統一的に記述することができます。

![2018-01-10-giggle-1a91c.png](https://qiita-image-store.s3.amazonaws.com/0/18504/d0365d3f-2e6a-a1b4-5ca1-c7914b78070d.png)


## GIGGLEについて

GIGGLEはいわば「ゲノム上に定義された区間集合」の検索エンジンであり、ターゲットとなる区間集合のファイル（数千ファイル）に対してクエリの区間集合との重なりの有意性をランキングするものです。B+ tree をベースにしており、論文では、BEDToolsやTABIXといった既存手法よりも速いことが示されています。

GIGGLEを使うことで、例えば、手持ちのBEDファイルやVCFファイルがあるときに、ENCODE projectやRoadmap Epigenome project、FANTOM5といったコンソーシアムやChIP-Atlasのような二次データベースのデータセットとの重なりを一気に調べられます。また、UCSCが提供するような種々のゲノムアノテーションに対して重なりをみることもできます。

## ダウンロード・インストール

こちらからダウンロードできます。GitHubのページで丁寧に説明されています。  
https://github.com/ryanlayer/giggle


## 使い方

詳しくはGitHubのページ https://github.com/ryanlayer/giggle を参照してください。使用例の説明だけでなく、データセットの作り方も詳しかったです。

### インデックス構築

まずインデックスを構築します。入力とするターゲットのファイル（群）は、BEDまたはVCFを`bgzip`で圧縮したファイルです。ソートしておくと `-s` オプションでインデックス構築が（たぶん）早く終わります。

```
giggle, v0.6.3
usage:   giggle index -i <input files> -o <output dir> -f
         options:
             -s  Files are sorted
             -i  Files to index (e.g. data/*.gz) (BED, VCF, またはそれらのbgzipされたファイル)
             -o  Index output directory
             -f  For reindex if output directory exists
```

### 検索

構築したインデックスに対して検索をかけます。クエリの入力はゲノム区間のテキスト表記 (`-r`オプション) またはファイル (`-q`オプション)です。クエリのファイルはBEDまたはVCFを`bgzip`で圧縮したファイルです。

```
giggle, v0.6.3
usage:   giggle search -i <index directory> [options]
     options:
         -i giggle index directory
         -r <regions (CSV)>
         -q <query file> (BED, VCF, またはそれらのgzipされたファイル)
         -o give results per record in the query file (omits empty results)
         -c give counts by indexed file
         -s give significance by indexed file (requires query file)
         -v give full record results
         -f print results for files that match a pattern (regex CSV)
         -g genome size for significance testing (default 3095677412)
         -l list the files in the index  
```


以下のこともできます。

- デフォルトでは、インデックス構築に使ったファイルごとに重なった区間の数を出力する
- `-r` オプションで`[染色体名]:開始座標-終了座標`とテキスト形式でゲノム区間を指定できる
- `-f` オプションで検索対象のファイルを絞ることができる
- `-v` オプションで重なった区間のオリジナルのレコードを出力できる
- `-s` オプションでオッズ比、Fisher's exact testのp-value, オッズ比とp-valueを統合したスコアを出力できる
- `-v -o` でオリジナルのレコードをクエリのレコードごとに出力できる

逆に以下のことはできなそうです。

- 区間のstrandを考慮した検索



## APIなど
GitHubページでの説明をみると、ウェブサーバーとして提供することができる他、C、Python、GoのAPIも用意されてるようです。  
https://github.com/ryanlayer/giggle
リモートリポジトリに含めたくないコミット履歴をgit rebaseコマンドで無に帰す方法

# 概要

__こんな方向け__の記事です。

- ローカルでの動作確認時にコミットした情報の中に、__リモートリポジトリに含めたくない情報(AWSの認証情報__等)が含まれてしまったorz
- でも、他にも__大量の修正__をしているからなんとか__問題のコミット履歴だけ__抹消したい
- __git rebase__?使ってみようかな。。。(ﾋﾞｸﾋﾞｸｯ)

## 注意

この検証は__リモートにpushをする前__の悪あがきですので、__<font color="red">一度リモートにpushしてしまった場合は当てはまらない</font>__のでご注意ください。

(@Ress さん、ご指摘ありがとうございます！)

# 手順

## 前提

以下のような__コミット履歴__があるとします。

```shell:command
git log --oneline
624d078 鬼のようなリファクタリング #実装④ リファクタリング時にAWS認証キーは削除
59ef873 動作確認用のコミット #実装③ ここでAWS認証キーをコミットしてしまった！！
c0c2354 物凄い実装 #実装②
aebf9c8 凄まじい実装 #実装①
```

このまま、

```shell:command
git push origin issues/XXX
```

をしてしまうと、Github上で、

<img width="1018" alt="screencapture- 2018-01-10 0.05.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/19860577-4794-a248-8f48-8124fc86ec01.png">

__対象のコミット__を見てみると・・・

![screencapture--2018-01-10-0.07.07.png](https://qiita-image-store.s3.amazonaws.com/0/113654/401eed2f-ee5c-11fc-749b-1ef9c205addb.png)

__丸見え！！__

__パブリックリポジトリ__でこんなことをする人はいないと思いますが、__万が一__やってしまうと場合によっては__<font color="red">地獄</font>__をみることになってしまう可能性があります。。。

参考記事：
[初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。](https://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694)

なので、今回はここの部分を__リモートリポジトリに残らない__ように__git rebaseで歴史改ざん__してみましょう♪

### コミットログの確認

まずは__ローカルリポジトリ__のコミットログを確認します。

```shell:command
git log --oneline
624d078 鬼のようなリファクタリング #1 <- HEAD
59ef873 動作確認用のコミット #2
c0c2354 物凄い実装 #3
aebf9c8 凄まじい実装 #4
```

今回の事例だと、__#1__と__#2__をまとめて__#2の歴史を無くせば__よさそう。

```shell:command
git rebase -i HEAD~2 #ヘッドから2コミットをまとめる
```

そうすると__以下__のように

<img width="575" alt="screencapture- 2018-01-10 0.24.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/e6da3dca-a841-c05f-3bac-2f77b3e6351b.png">

エディターが起動するので、

```diff:差分
pick 59ef873 動作確認用のコミット
- pick 624d078 鬼のようなリファクタリング
+ squash 624d078 鬼のようなリファクタリング
```

のように修正してください。

再度コミットメッセージの入力が求められるので、お好きに変えてください(そのままでも良いです)。

__正常__にrebaseが終わったら再度`git log --oneline`をすると、

<img width="277" alt="screencapture- 2018-01-10 0.31.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/397241f6-c46f-abb1-e605-b34a3b0e86b0.png">

__歴 史 改 ざ ん 完 了 ☆__

これで再度プッシュすると、

<img width="1008" alt="screencapture- 2018-01-10 0.34.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/dc7ed17f-8052-ae3e-0a6c-f2dda9b3b8ba.png">

コミットログも消えています。

<img width="1002" alt="screencapture- 2018-01-10 0.34.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/292ca511-e346-01ba-3d8f-1481c6a36503.png">

ファイルとしても、__途中でコミットしてしまった認証情報が入っていませんね。__
これで__一安心__！！！

## 万が一リモートリポジトリにプッシュしてしまった場合

__<font color="red">直ちにブランチを削除しましょう！！！</font>__

<img width="999" alt="screencapture- 2018-01-10 0.14.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/113654/d171db97-b8ef-6c0f-f76d-e39c93cdb228.png">

ただし、冒頭でも話しましたが、__<font color="red">リモートにpushしてしまった時はブランチを消しても見られる恐れがある</font>__ので、なんにせよ__<font color="red">認証情報はgit管理化に入れない</font>__ように__日頃からセキュリティの懸念を意識しながら作業する__に越したことはありません。

(@Ress さん、ご指摘ありがとうございます！)

# 終わりに

一般的な業務システムは__プライベートリポジトリ__なり__GHE__なりを使っていると思うのでひとまずは大丈夫でしょうが、__個人開発__で__パブリックリポジトリ__を使っている方は__今一度気をつけましょう！！__
言語処理１００本ノック01

#はじめに
[言語処理100本ノック](https://qiita.com/aira002/items/1a1ad7efd451a72e28c2)
から始めた言語処理！　今日は２個目
前回、言語処理100本ノックの元サイト自体をリンクしておくのを忘れていたのでしておきます
http://www.cl.ecei.tohoku.ac.jp/nlp100/#data

#01.[パタトクカシーー]
[パタトクカシーー]という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ

```python3:01knock.py
st="パタトクカシー"

print(st[::2])
```
出力結果
```
パトカー
```

これは、01で学んだ内容なのでこれで終わります


##参考にしたサイト
https://qiita.com/segavvy/items/966c7b658ca740f6164b
Google Drive File Streamの自動起動をOFFにする

2017年9月にローンチされた、Google Drive File Stream。
とっても便利で重宝しているのですが、いかんせん通信料が多いので必要な時だけに使えるようにします。

システム環境設定 > 対象のユーザ > ログイン項目
<img width="780" alt="スクリーンショット 2018-01-10 9.26.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/125753/a8ed4afe-a282-9f31-308e-c6c3c75d2830.png">

元に戻す時は、「+」を押してアプリケーションを選択するだけです。
ワークフローエンジンdigdagで困ったこと

Tresure Data社のワークフローエンジンdigdagを使っていて困ったことがあったので、それのメモ

##現象
エラーとならずに1週間以上も処理が走り続けていた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/59ea4e15-c491-bf51-a4a8-6ef75e7e7300.png)

##No space left on device 
digdagのログを確認すると、「No space left on device」というメッセージが表示されていました。
こちらはデバイスの容量がないときに出るエラーとのことですが、今回はinodeが足りていないようでした。
incodeとはUNIX系OSで使用されるファイルシステムの名称で、ファイルの所有者やアクセス権、サイズ、作成日時、場所などを管理しているものでそれが足りていない。つまりファイル数が多すぎたようでした！

```
$ df -i
Filesystem            Inodes   IUsed   IUse% Mounted on
/dev/xda1            1048756 1048755   100% /
```

##原因
ファイルが多い原因を突き止めていたところdigdagのログファイルが溜まりに溜まっているということが原因のようでした。
ログはWebで以下のように確認することができますが、実ファイルは「~/log/digdag/yyyy-mm-dd/」以下に溜まり続けます。
スケジュールJOBで毎時間2つの処理が走っていてそれが4月から溜まりに溜まって1月に限界となったようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/19b8bea4-25ad-3f58-3c0f-b8af06327117.png)

##対策１：ログのアーカイブ
まずはログをアーカイブしました。月に1回ぐらいしていたら問題ないと思います。
注意点としてはログのアーカイブをするとWebでログが確認できなくなります。

##対策２：timeoutの設定
今回エラーに気付くのが遅れた原因として、エラーメールが飛んでいなかったためです。
エラーの際にメールが飛ぶ設定はしていたのですが、そもそもエラーとならずに走り続けていたのでメールが飛んでいませんでした。
そこでtimeoutの設定をします。60分以内に終わらなければ、エラーとし、+noticeの処理を実行後、_errorの処理を実行します。

```yaml:digdag
# 60分以内に終わらなければエラー
sla:
  duration: 00:60:00
  fail: true
  +notice:
    echo>: timeout err!!

_error:
  mail>: tmpl/error_timeout.txt
  subject>: timeout error!!
  to: [abcd@gmail.com]
```

##追記:timeoutの処理
実際に上記で試していたらslaでfail:trueとしても処理自体は止まらないみたいです。

```yaml:digdag
# 60分以内に終わらなければエラー
sla:
  duration: 00:60:00
  fail: true
  +notice:
    echo>: timeout err!!

+task:
  #処理の途中で60分を超えても
  #notice処理をしてから戻ってくる

_error:
  mail>: tmpl/error_timeout.txt
  subject>: timeout error!!
  to: [abcd@gmail.com]
```

そこで強制終了の処理を無理やり入れました。強制終了は

```bash
$ digdag kill <attempt-id>
```

で可能です。ただdigdagではsession-idは取得できるもののattempt-idは取得できません。(そもそもsessionは取れてattemptが取れないってどうなのと思いますが。。。)
そこでshで取得します。また強制終了をすると_errorの処理が走らないので、強制終了の前にメールを送信しておきます。

```yaml:digdag
# 60分以内に終わらなければエラー
sla:
  duration: 00:60:00
  fail: true
  +notice:
    +mail:
      mail>: 
        data: timeout error
      subject: ERROR!! timeout error (session:${session_id})
      to: [abcd@gmail.com]
    +kill_task:
      sh>: tasks/_kill_job.sh ${session_id}

    echo>: timeout err!!

+task:
  #省略
```

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

session_id=$1
get_attempts=`digdag attempts ${session_id}`

echo $get_attempts

is_attempt=0
is_id=0
for i in $get_attempts; do

  if [ $is_attempt -eq 1 ] && [ $is_id -eq 1 ]; then
  	attempt_id=$i

  	#複数回処理をしている場合が、あるので初期化しておく
  	is_attempt=0
  	is_id=0
  fi

  if [ $i = "attempt" ]; then
    is_attempt=1
  fi
  #attempt idと続く場合にフラグを立てる
  if [ $is_attempt -eq 1 ] && [ $i = "id:" ]; then
    is_id=1
  fi
done

echo $attempt_id

digdag kill $attempt_id
```

shellはほぼ初めて書いたので、お粗末ですが、ご了承ください。

##参考
[No space left on device とエラーが出るときの対処法](https://qiita.com/0x50/items/ecc6cfdbb8a3f0c0855f)
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word14803.html)
[digdagのsla/fail/error/waitについてのメモ](https://qiita.com/skryoooo/items/7dbde4468db52a01f7bb)
あなたがゲームプログラマなら心がけてほしいこと


ゲーム開発は、業務用のアプリ等を開発するのとは、ちょっと違います。

業務アプリは、ユーザーの生活の利便性を上げることが主な目的ですが、ゲームの目的は、ユーザーを楽しませる事です。

楽しんでもらえるコンテンツを作るために、どういった事に気をつけるべきなのでしょうか？　筆者の経験から、チームでゲーム開発をする際に気をつけたい事をまとめました。

※筆者はオンラインゲームの開発経験しかないので、コンシューマ系とは事情がことなるかも知れません。


### その１：渡された仕様書はふわっとしたガイドくらいに考える

仕様書はプランナーさんが作ってくれますが、人によってはびっくりするくらいいい加減です。いい加減な仕様書を見たとき、「こんな仕様じゃ（プログラムを）書けないよ！」と怒ったりしないようにしましょう。

いい加減な仕様書が来たら、プログラマーである自分が、自分で仕様を決められるチャンスです。プランナーの意図をうまく読み取りつつ、自分としてはどういう仕様が良いと思うのかを検討し、ユーザー視点から見ても、プランナー視点から見ても、プログラマ視点から見ても、わかりやすいエレガントなソフトウェア設計を考えましょう。

そして、仕様変更は必ず起こると思ってください。どういう変更がありそうか、プランナーと相談しながら、可能性を探り、柔軟に対応できる準備をしておく必要があります。

また、いい加減な仕様をそのまま鵜呑みにして、プログラム設計をすることは、とても危険です。

少し知識のあるプランナーなら、フローチャートを書く人もいます。でもそのフローチャートをそのままプログラムに落とし込むのは絶対にやめましょう。多くの場合、プランナーの書くフローチャートは、「こんな時はこう動いてほしい」ということを表現しているだけで、プログラムの処理を書いている訳ではありません。

そこに書かれてある事と、そこには書かれていないあらゆる例外的なケースが正しく動くことを実現するために、どのようなデータと処理フローが必要かは、自分で考える必要があります。

### その２：プランナーと上手にコミュニケーションする術を身につける

ある機能を実装するのに、いくつかの方法が考えられ、それぞれメリットデメリットがある、という状況が発生することがあります。
そういう時は、そのメリットデメリットをプランナーに伝え、どの方法を採用するか、判断してもらう必要がありますが、プログラムの具体的な中身の話をしても、プランナーにはわかりません。

よって、「この方法だと、今後こういう事には対応しやすいけど、こういうバグが発生しやすくなるかも」とか、「この方法だと、ごく少ない工数で実装できるけど、今後の仕様変更はしにくくなる」とか、そういった説明をしなければなりません。

なぜ？と聞かれたら、できるだけプログラム内部の話をせずに、うまく理由を説明する必要があります。（プランナーも素人ではないので、ある程度のコンピュータ用語は使って大丈夫です）

この連携がうまくいくかどうかは、自分のコミュニケーション能力にかかってきます。　コミュニケーション能力を磨くというのはなかなか難しいのですが、例えば周りの人でコミュニケーション上手な人がいたら、その人の振る舞いや、言葉の使い方を真似するのも、一つの手です。


### その３：試行錯誤をいかに早く回せるかが、ゲームのクオリティを決める

ゲームづくりは、陶芸家がなんども作品を作っては壊すのに似ています。
作ってみて、遊んでみて、「これじゃない！」と言って壊し、作り直し・・・を繰り返すなかで、良い作品が生まれます。

陶芸なら、作業は一人で完結しますが、チーム開発ではそうは行きません。プランナーが「作り直したい！」と思ったら、実際に作り直すのはプログラマーです。

ただ、プランナーはプログラムを書き換えることはできませんが、データを修正することはできます。ゲームの挙動を変えるのに、データの修正だけで終わるのであれば、プログラマーの手を煩わす事なく、プランナーの作業だけで完結します。

よって、プランナーが作業しやすいデータ設計をして、その編集ツールを用意することは、面倒に思うことも多いかもしれませんが、おろそかにしてはいけません。

プランナーの利便性を上げることは、試行錯誤のスピードを上げることになり、そのままゲームのクオリティに直結すると思いましょう。


### その４：自分の技術はまだまだだと思っておく

技術に関して自信過剰な人は、自分にしかわからないプログラムを書く傾向があります。チーム開発を行う場合、その人にしかわからないプログラムというのは、とても危険です。

本当に技術力の高いプログラマは、他の人にもわかりやすいプログラムを書きます。自分がいつまでもそのチームにいるという事はまずないし、もし自分がいない時に何か問題が起こった場合、他の人が調査しやすくするためです。

チーム全体の技術力をあげたいと思うなら、他の人の半歩先のプログラムを書いて、それを共有するようにしましょう。

また、常に技術力を向上させるためにも、「自分の技術力は高い」などと思っているのは良くありません。「まだまだ学べることがたくさんある」と思っている人の方が、成長するし、他の人にも好かれます。


### まとめ

以上、筆者が考える、ゲームプログラマーなら気をつけたい事を紹介させて頂きました。
ゲームプログラマーを目指す方、ゲームプログラマーとしてステップアップしたいという方の参考になれば幸いです。
2018-01-10 C++ Builder 10.2 Tokyo > TeeChart > UI > 目的の不明なBold表示 | (Hover)機能の無効化

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

FastLineでシリーズを追加。
下記の実装でButton1を押下した状態。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Chart1->View3D = false;
	//
	Chart1->Series[0]->XValues->DateTime = true;
	Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

	TDateTime dt;

	dt = Now();
	for (int idx=0; idx < 10; idx++) {
		Series1->AddXY(dt, 1+idx, "", clRed);
		dt = IncSecond(dt, 1);
	}
}
//---------------------------------------------------------------------------

```

マウスカーソルを軸の数値上に配置した時、その数値がBold表示される機能が追加されている (XE4ではなかった)。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d569b331-02c5-ccc4-871b-4eccbde64d5a.png)

また、凡例の数値に対しても赤色の強調表示がされるようになっている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/aed5edef-b81a-8faa-68a3-4d39aed9ed37.png)

### 備考

マウスカーソルを置いた時点で、強調表示をしなくてもどれを指し示ているのかは明白である。上記の機能の用途が不明である。

タッチパッド操作時にマウスカーソルが消えて、強調表示のみ残るというような使い方なのだろうか。

キャプチャ操作時の画像として特定の数値を強調表示する、という用途では使いそうだが、それは本当に必要なUIだろうか?


**用途の明確でないUIを追加すると、開発者およびユーザ双方にとって混乱を生じる。**

### 機能の無効化

デザインにおいて、.Chart > General > Hover > Visibleのチェックをはずすことで、この機能は無効化できた。

コードでは以下で無効化できる。

```.cpp
Chart1->Hover->Visible = false;
```

関連:[Generally disable the new "hover" effect of 2014.12](http://www.teechart.net/support/viewtopic.php?f=3&t=15216)
公開鍵認証を設定してsshで接続する

## 公開鍵認証を設定してsshで接続する
これまでCUIコマンドを使う機会がなく、今の現場でサーバをsshで触る機会が多くあり、個人で勉強したことをまとめています。Linux弱者向けです。
今回はサーバに公開鍵を設定してあげて、sshで認証します。またconfigファイルも設定して、ローカルから簡単に接続できるようにします。

### 1. 秘密鍵・公開鍵の設定
ローカルのPCで秘密鍵と公開鍵の作成を行います。
実行するコマンドは以下のコマンドになります。

``` console:秘密鍵・公開鍵設定
$ pwd
/Users/sample/.ssh #現在のディレクトリ

$ ssh-keygen -t rsa #公開鍵・秘密鍵作成
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/sample/.ssh/id_rsa):  sakura #ファイル名をデフォルト「id_rsa」から変更することができます。今回は「sakura」にしました。
Enter passphrase (empty for no passphrase):  #パスワード入力（表示されないけど大丈夫）
Enter same passphrase again: #確認用パスワード入力（表示されないけど大丈夫）
Your identification has been saved in sakura. #秘密鍵作成成功！
Your public key has been saved in sakura.pub. #公開鍵作成成功！

```

デフォルトの設定では、
・ 公開鍵: ~/.ssh/id_rsa.pub
・ 秘密鍵: ~/.ssh/id_rsa

今回はファイル名を設定したので
・ 公開鍵: ~/.ssh/sakura.pub
・ 秘密鍵: ~/.ssh/sakura
が作成されています。


```console:作成した鍵の確認
$ pwd
/Users/sample/.ssh

$ls
config		sakura
known_hosts	sakura.pub

```

ちゃんと作成されていることが確認できました。
Finderでも念のため確認...。

**Shift + Command + .（カンマ）**を押すと隠しフォルダが出てくるので、
/Users/sample/.sshを見てみます。でちゃん作成されています。

<img width="412" alt="スクリーンショット 2018-01-10 8.27.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/f949b75c-97cb-00f0-41de-b986e7bd9aa7.png">


### 2. 公開鍵登録
公開鍵をサーバに設置します。
ローカルから設置するサーバに公開鍵を転送します。
**User**の部分は任意で変更してください。

```console:公開鍵設置
$ scp ~/.ssh/sakura.pub User@User.sakura.ne.jp:/home/User/.ssh/authorized_keys
```
このコマンドでサーバ側に公開鍵が設置されます。

そのあとにサーバに一度sshで接続して以下のコマンドを打ちます。
権限を持たせるために必要みたいです。

```conole:権限の追加
% chmod 600 .ssh/authorized_keys
```

### 3.configファイルの設定
ローカルの/Users/sample/.sshにconfigファイルを設定してあげます。
これを設定することで簡単にsshで接続できるようになります。

``` txt:/Users/sample/.ssh/config

Host sakura
 User User名
 HostName User名.sakura.ne.jp
 Port 22
 IdentityFile ~/.ssh/sakura
 ServerAliveInterval 60

```

| キーワード       |       Right align |    
|:-----------------|:------------------|
| User             |             サーバのユーザ名 |
| HostName         |            ホスト名 | 
| Port             |              ポート |    
| IdentityFile     |                ログインするための秘密鍵のパス |      
| ServerAliveInterva   |       タイムアウトする秒数 | 

### 4. sshで接続
最後に認証ができているか確認を行います。

```console:接続
$ ssh sakura
Enter passphrase for key '/Users/sample/.ssh/sakura':  #パスワード入力
Last login: Wed Jan 10 07:52:52 2018 from 
FreeBSD 9.1-RELEASE-p24 (SAKURA17) #0: Thu Feb  5 10:03:29 JST 2015

Welcome to FreeBSD! #接続成功！

```

という感じで普段はGUIを使っているので、あまりコマンドでssh接続することがなかったので、試してみました。
 
参考にさせてもらいました。
ありがとうございました:bow_tone2:
・ [さくらのレンタルサーバーにSSHでログインする
](https://qiita.com/non0311/items/04222771ef9aa1970f7a)・ [.ssh/configファイルでSSH接続を管理する
](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)・[ssh公開鍵認証設定まとめ
](https://qiita.com/ir-yk/items/af8550fea92b5c5f7fca)
VisualStudioCode で Haskell のコードを実行するショートカットを設定する

前提として [Stack](https://docs.haskellstack.org/) (Haskellのビルドツール) で管理しているプロジェクトを対象としています。
筆者の環境はMacです。

# タスクを作成する

まずはプロジェクトを開き、コマンドパレットから`Tasks: Run Task`を実行。

<img width="759" alt="ScreenShot 2018-01-09 16.49.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/204132/9a2a513d-092c-cc70-7e86-aaf814e3d1db.png">

タスクがなければタスクを構成します。

<img width="744" alt="ScreenShot 2018-01-09 16.53.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/204132/4af79a07-3bea-48db-f9f5-fe00e8435b25.png">

tasks.json を生成します。

<img width="746" alt="ScreenShot 2018-01-09 16.54.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/204132/07bb5950-acf4-90af-5963-30fd169d4c30.png">

テンプレートは Others を選択。

<img width="753" alt="ScreenShot 2018-01-09 16.55.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/204132/f1b81209-51f3-d82a-2673-937f762d7857.png">

ここまでいくと、次のような`.vscode/tasks.json`が生成されます。

<img width="841" alt="ScreenShot 2018-01-09 17.03.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/204132/0ab6b775-82cc-e30c-d30b-ebb7c68c65fc.png">

tasks を次のように変更します。
`myapp`の部分は自分の環境に合わせてください。

```json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "run",
      "type": "shell",
      "command": "stack build && stack exec myapp"
    }
  ]
}
```

# ショートカットキーを登録する

次に、キーボードショートカットを設定します。
まず、設定ファイルを開きます。

<img width="631" alt="ScreenShot 2018-01-09 17.25.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/204132/232b9f7d-39c4-5f6a-047b-c77bf34f2fbc.png">

`keybindings.json`ファイルが開かれるので次のような設定を追加する。
`"key"`は好みのキーを設定します。

```json
    {
        "command": "workbench.action.tasks.runTask",
        "key": "meta+shift+r",
        "args": "run"
    }
```

設定は以上です。

# 確認してみる

コードを保存し、設定したショートカットキーを押して確認してみます。

<img width="690" alt="ScreenShot 2018-01-09 17.41.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/204132/fa7b1f24-0b9f-9775-8e7d-a358c18e57af.png">

以上です。
この方法ですとプロジェクトごとにタスクを設定する必要がありますが、 tasks.jsonをいじればHaskellやStackに限らず様々なタスクの実行に応用できるため、慣れておくと便利だと思います。

# 参考

https://vscode-doc-jp.github.io/docs/userguide/tasks.html