OmniAICreator/Qiita-1.07M huggingface dataset:
DockerコンテナをECRで管理する方法

# はじめに

ECRとは、Amazon EC2 Container RegistryというAWSが管理するコンテナレジストリ。
同様のサービスでDocker Hubなどがある。

# 前提条件
* aws-cliの最新バージョンがインストールされていること。
* regionや認証情報が設定済みであること。

### aws-cliがインストールされていない場合
```bash
# インストール
$ sudo pip install awscli

# 最新化
$ sudo pip install awscli --upgrade --ignore-installed six
```

### 認証情報が未設定の場合
```bash
$ aws configure
```

# 手順
## ECRにリポジトリを作る
```bash
$ aws ecr create-repository --repository-name <コンテナ名>

{
    "repository": {
        "registryId": "XXXXXXXXXXXX", 
        "repositoryName": "<コンテナ名>", 
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/<コンテナ名>", 
        "repositoryUri": "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/<コンテナ名>"
    }
}
```
上記の「repositoryUri」の値をメモしておく。

## dockerイメージにタグをつける
```bash
$ docker tag <コンテナ名>:<タグ名> <上記でメモしたrepositoryUri>/<コンテナ名>:<タグ名>
```

## ECRにログインする
```bash
$ $(aws ecr get-login --no-include-email --region ap-northeast-1)
```

## ECRにプッシュする
```bash
$ docker push <上記でメモしたrepositoryUri>/<コンテナ名>:<タグ名>
```

# 参考サイト
* [（超メモ）Elastic Beanstalk で ECR の Docker イメージをデプロイするメモ](http://inokara.hateblo.jp/entry/2016/01/16/191633)
postgresql SQL構文抜粋(v10.4)

##目的
SQL言語とは何か、改めて理解を深めるために
[SQLの構文](https://www.postgresql.jp/document/10/html/sql-syntax.html)から自分が欲しいところだけ抜粋。

##SQL
・大文字小文字は気にしない（常に小文字で解釈）
・引用符(")を付ける事で大文字小文字を区別し、空白や&などを含むテーブルなどを作れる
・エスケープ文字はバックスラッシュ。UNESCAPEで変更可能。
・引用符付き文字列を使って、ユニコード文字を入れられる
※ただし、サーバーがUTF-8である事

```
U&"d!0061t!+000061" UESCAPE '!'
```

##定数
・文字列は単一引用符(')を使う
・シングルクォートを含みたい場合は2個並べる

```
'Dianne''s horse'
```

###$引用符
※postgreSQL独自の仕様※
・シングルクォートの代わりに、\$を使うとエスケープしなくてよくなる
・$function$～$function$のように囲うと、タグとして扱われる。
・タグの中では、さらに$で入れ子にできる。

```
$$Dianne's horse$$
$SomeTag$Dianne's horse$SomeTag$

$function$
BEGIN
    RETURN ($1 ~ $q$[\t\r\n\v\\]$q$);
END;
$function$
```

###ビット文字列定数
・B+引用符でビット文字列定数となる
・もしくはX+16進表現

```
B'1001'
X'1FF'
```


###数値定数

```
42
3.5
4.
.001
5e2
1.925e-3
```

###キャスト

```
CAST ( '100' AS int )
```

###演算子
+ - * / < > = ~ ! @ # % ^ & | ` ?

###特殊文字

![image.png](https://qiita-image-store.s3.amazonaws.com/0/270579/a20caf12-bcf5-111e-a13e-10d791b2bc24.png)

###コメント

```
-- コメント

/*コメント
* あ /*ネストコメント*/
*/
```
###演算子の優先順位
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270579/a6c8211a-c4c0-f235-1344-d89ac90ade89.png)

##評価式

###列の参照

```sql

SELECT mg.goods_id FROM m_goods AS mg;
```

###位置パラメータ

・プリペアドやパラメタ定義に使う。$1とか$2とか

```sql
CREATE FUNCTION dept(text) RETURNS dept
    AS $$ SELECT * FROM dept WHERE name = $1 $$
    LANGUAGE SQL;
```

###添字

・配列のインデックス

```sql
m_goods.sub_goods_ids[3]
m_goods.sub_goods_ids[2:5]
```

###フィールド選択
・selectの列指定とか

```sql

SELECT m_goods.* FROM m_goods;
```

###演算子呼び出し

```sql
-- 二項中置演算子
a > 0 AND b < 0

-- 単項前置演算子
!! 3

-- 単項後置演算子
5 !
```

###関数呼び出し

```sql

sqrt(2)
```

###集約式

・DISTINCT,FILTER,ALL,WITHIN GROUPなどなど
・集約式はSELECTの結果またはHAVING内でのみ記述可能
・WHERE句では使用不可。WHEREは集約処理の前に適用される処理だから
・集計関数は基本的に順序関係ないが、順序が関係するものもある

```sql

SELECT array_agg(a ORDER BY b DESC) FROM table;
```

・count(*)は入力行の合計数を求めるが、NULLを無視する。

※postgreSQL独自の仕様※
・DISTINCTとORDER BYを両方指定可能

・FILTERの例

```sql

SELECT
    count(*) AS unfiltered,
    count(*) FILTER (WHERE i < 5) AS filtered
FROM generate_series(1,10) AS s(i);
 unfiltered | filtered
------------+----------
         10 |        4
(1 row)
```

###ウィンドウ関数
・テーブルを区間ごとに集計する
※公式の説明だと理解できんかった…
[Let's postgress](https://lets.postgresql.jp/documents/technical/window_functions/1)

```sql
-- ウィンドウ関数
SELECT id, prev_id
  FROM (SELECT id,
               lag(id, 1, 0) OVER (ORDER BY id) AS prev_id
          FROM tbl) AS t

-- ウィンドウ関数使わないと、自己結合の激コスト
SELECT id FROM tbl WHERE NOT EXISTS
 (SELECT 1 FROM tbl AS tbl_prev WHERE tbl.id = tbl_prev.id + 1);
```
EC2のメモリ、ディスク状況をメトリクスで監視する方法

# はじめに
EC2インスタンスのメトリクス監視でメモリ、ディスクの使用状況が取得できないので、
ElasticBeanstalkのebextensionsファイルを利用し、メトリクスを監視できるようにする。

## .ebextensions 設定ファイル
 
アプリケーションのルートディレクトリの.ebextensionsフォルダに以下を記述したファイルを作成する。

```yaml:cloudwatch.config
packages:
  yum:
    perl-DateTime: []
    perl-Sys-Syslog: []
    perl-LWP-Protocol-https: []
    perl-Switch: []
    perl-URI: []
    perl-Bundle-LWP: []

sources: 
  /opt/cloudwatch: http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
  
container_commands:
  01-setupcron:
    command: |
      echo '*/5 * * * * root perl /opt/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl `{"Fn::GetOptionSetting" : { "OptionName" : "CloudWatchMetrics", "DefaultValue" : "--mem-util --disk-space-util --disk-path=/" }}` > /dev/null　 /etc/cron.d/cwpump
  02-changeperm:
    command: chmod 644 /etc/cron.d/cwpump
  03-changeperm:
    command: chmod u+x /opt/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl

option_settings:
  "aws:autoscaling:launchconfiguration" :
    IamInstanceProfile : "aws-elasticbeanstalk-ec2-role"
  "aws:elasticbeanstalk:customoption" :
    CloudWatchMetrics : "--mem-util --mem-used --mem-avail --disk-space-util --disk-space-used --disk-space-avail --disk-path=/ --auto-scaling"
```

## アクセス許可
IAMロール「aws-elasticbeanstalk-ec2-role」に以下のポリシーを追加する。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "cloudwatch:PutMetricData",
        "ec2:DescribeTags"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ]
}
```

# 参考サイト
* [例: カスタム Amazon CloudWatch メトリクスの使用](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-cw.html)
SWI-Prolog で JSON ファイルを作成する

```text:json_create.pl
/* ------------------------------------------------------------------- */
/*
	json_create.pl

						Oct/16/2018
*/
/* ------------------------------------------------------------------- */
:- use_module([ library(http/json) ]).
/* ------------------------------------------------------------------- */
data_out_proc(File_out,Dict) :-
	tell(File_out),
	json_write_dict(current_output, Dict),
	told.
/* ------------------------------------------------------------------- */
data_prepare_proc(Dict) :- Dict = _{
	t0921:_{name:"宇都宮", population : 15876, date_mod : '1942-5-16' },
    	t0922:_{name:"小山", population : 81274, date_mod : '1942-7-12' },
    	t0923:_{name:"佐野", population : 71652, date_mod : '1942-9-22' },
    	t0924:_{name:"足利", population : 41352, date_mod : '1942-4-25' },
    	t0925:_{name:"日光", population : 61932, date_mod : '1942-3-28' },
    	t0926:_{name:"下野", population : 91852, date_mod : '1942-1-7' },
    	t0927:_{name:"さくら", population : 21657, date_mod : '1942-2-19' },
    	t0928:_{name:"矢板", population : 51648, date_mod : '1942-5-30' },
    	t0929:_{name:"真岡", population : 18647, date_mod : '1942-6-3' },
    	t0930:_{name:"栃木", population : 96425, date_mod : '1942-7-11' },
    	t0931:_{name:"大田原", population : 32641, date_mod : '1942-8-18' },
    	t0932:_{name:"鹿沼", population : 61342, date_mod : '1942-9-30' },
    	t0933:_{name:"那須塩原", population : 68745, date_mod : '1942-10-20' },
    	t0934:_{name:"那須烏山", population : 61932, date_mod : '1942-12-8' }
	}.

/* ------------------------------------------------------------------- */
:- initialization main.

main(Argv) :-
	format('*** 開始 ***\n'),
	format('Argv: ~w\n', [Argv]),
	[File_out|_] = Argv,
	write(File_out),nl,

	data_prepare_proc(Dict),

	data_out_proc(File_out,Dict),

	format('*** 終了 ***\n'),
	halt.

/* ------------------------------------------------------------------- */
```

実行例

```text
$ swipl -f ./json_create.pl /var/tmp/json/cities.json
*** 開始 ***
Argv: [/var/tmp/json/cities.json]
/var/tmp/json/cities.json
*** 終了 ***
```

Read のサンプル
　[SWI-Prolog で JSON ファイルを読む](https://qiita.com/ekzemplaro/items/1ce9d4231b1acd28c449)
Update のサンプル
　[SWI-Prolog で JSON ファイルを更新](https://qiita.com/ekzemplaro/items/aead229f3b3c61a972d3)
Delete のサンプル
　[SWI-Prolog で JSON ファイルの要素を削除](https://qiita.com/ekzemplaro/items/4abeda27fb5b0385be82)
JAX-RSを使って動画ファイルをダウンロードする

動画のダウンロードで苦労したので実装メモを残しておきます。

基本的に動画ファイルはサイズが大きいため、ブラウザで再生するまでに時間がかかるので、
分割してダウンロードする方法で行いました。

```java:実装サンプル

@GET
@Path("video")
@Produces("video/mp4")
public Response getVideo(){

    InputStream is = new FileInputStream("ファイルパス");
    int bufferSize = 300 * 1024;

    // リクエストヘッダのRangeの内容を取得する。
    String range = this.request.getHeader("Range");

    // rangeの内容から bytes=100-200 => [0]=100,[1]=200
    String rangeValue[] = range.substring(range.indexOf("=") + 1).split("-");

    // ファイルサイズを取得
    int fileSize = is.available();

    // 開始サイズを取得
    int start = Integer.parseInt(rangeValue[0]);

    // 終了サイズを取得（）
    int end = rangeValue.length < 2 ? fileSize - 1 : Integer.parseInt(rangeValue[1]);

    // レスポンスのコンテンツサイズを取得
    int contentLength = end - start + 1;

    if (contentLength > bufferSize) {
        // コンテンツサイズがバッファサイズを超えた場合
        contentLength = bufferSize;
        end = contentLength + start - 1;
    }

    // InputStreamからbyte配列を取得
    byte[] buf = new byte[fileSize];
    while (is.read(buf) != -1) {
    }

    return Response.ok(new ByteArrayInputStream(buf, start, contentLength))
           .status(Response.Status.PARTIAL_CONTENT)
           .header("Content-Disposition", "inline")
           .header("Content-Range", MessageFormat.format("bytes {0}-{1}/{2}", String.valueOf(start),String.valueOf(end),String.valueOf(fileSize)))
           .header("Content-Length", contentLength)
           .build();
}

```

# 参考サイト
* [videoタグのはなし](http://engineer.crowdworks.jp/entry/2016/03/16/121353)
fullcalendarを使おう！

#fullcalendarとは
オープンソースのjavascriptライブラリ。
カレンダーのUIや実装を簡単にできる優れもの。

#導入方法~自分でダウンロードしたい場合~
https://fullcalendar.io/download
からダウンロード。

```html
<link rel='stylesheet' href='fullcalendar/fullcalendar.css' />
<script src='lib/jquery.min.js'></script>
<script src='lib/moment.min.js'></script>
<script src='fullcalendar/fullcalendar.js'></script>
```
というふうにソースで読み込む。<html>タグの中の"head"・"body"・"footer"タグのいずれかの中に組み込む形になるかと思います。

※moment.jsとjquery.jsも必要ですが上記でダウンロードした場合は入っています。

#導入方法~パッケージ管理ツール（Node.js)で入れたい場合~
```$ npm install fullcalendar ```
※入っていなければ```$ npm install jQuery ```

```js
import $ from 'jquery';
import 'fullcalendar';
```
というふうにソースで読み込むことで使うことができます。

#使い方
実際に使ってみましょう。

```js
<html>
<!--HTMLタグの中にこう↓↓書きます。ここのdiv要素にCalendarが書き込まれて表示されます -->
<div id="calendar"></div>
</html>
<script type="text/javascript">
<!--scriptタグの中にこう↓↓書きます。scriptタグの書き方はプロジェクト毎に変えてください-->
$(function() {
  // 初期処理
  $('#calendar').fullCalendar({
    // ここに各種オプションを書いていくと設定が適用されていく
  })
});
</script>
```
#日本語化
```html
<script src='fullcalendar/dist/locale/ja.js'></script>
```
を追加でheaderタグの中やfooterタグの中に書いて読み込みましょう。

#各種オプションの中に入れられるものの紹介

##header
カレンダー上部にコントロールなどを配置可能。

```js
header{
    left:"prev,today,next", //ヘッダー左側
    center: 'title', //ヘッダー中央
    right: 'month,agendaWeek,agendaDay,listYear' //ヘッダー右側
}
```

同様にfooterもある。

##events
ここに描画したいイベントをjson表記で渡すと描画することができる

```js
events{
 {title:"test1",start:"2018-10-31",end:"2018-11-01"},
 {title:"test2",start:"2018-08-31T08:30:00",end:"2018-09-01T00:01:00"}
}
```

##dayClick
日付をクリックした時にその日付の情報とjs情報、viewの情報を元にごにょごにょできる

```js
dayClick: function(date, jsEvent, view) {
    //クリックした日付が取れるよ
    alert('Clicked on: ' + date.format());
  }
```

##eventClick
イベントをクリックした時にそのイベント情報とjs情報、viewの情報を元にごにょごにょできる

```js
eventClick: function(item, jsEvent, view) {
    //クリックしたイベントのタイトルが取れるよ
    alert('Clicked on: ' + item.title);
  }
```

##eventDrop
イベントをドラッグアンドドロップした時に情報を元にごにょごにょできる

```js
eventDrop: function(item, delta,revertFunc,jsEvent,ui, view) {
    //ドロップした情報
    alert('Clicked on: ' + item.title);
    //ドロップしたことを元に戻したいとき
    revertFunc();
  }
```


##firstDay
週の初めの曜日番号を指定する

```js
firstDays:1
//これで月曜日から始まるカレンダーが表示される
```
##hiddenDays
隠したい曜日があれば曜日番号を指定する

```js
hiddenDays:[1,3,5]
//これで月水金曜日が表示されなくなる
```
#再描画をしたい時
再描画したい時はこの３行でカレンダーの再読み込みが可能。
関数化すると楽。

```js
        $('#calendar').fullCalendar( 'removeEvents' );
        $('#calendar').fullCalendar( 'addEventSource',"イベントのデータをここに入れる" );
        $('#calendar').fullCalendar( 'rerenderEvents' );
```

#まとめ
fullcalendarを使うとGoogle Calendarのようなカレンダーが簡単に実装することができます。
設定もかなり柔軟にできるのでいろいろ触ってみてください。
#参考
https://fullcalendar.io/docs#toc
Unity初心者から中級者になるために僕がやったこと

こんにちはこんにちは。
Unityエンジニアの山田です。
僕は[Okinawa.Unity](https://twitter.com/OkinawaUnity)というコミュニティで[Unity入学式](https://okinawa-unity.connpass.com/)をやったりしているのですが、自分がUnity初心者だった頃に中級者になるのを苦労したのを思い出したので、その経験を共有しようと思いました。

この記事では初心者と中級者として以下のような人を想定しています。
初心者：Unityを勉強し始めたばかり。技術書やWebのチュートリアルを見てUnity勉強中
中級者：自分ひとりである程度Unityアプリを作ることができる

僕がUnity初心者の頃に苦労したのは、技術書やWebのチュートリアルをひと通りやって、だいたいUnityの使い方が分かった後に、じゃあいざ自分ひとりでアプリを作ろうとすると、作り方が全くわからず途方に暮れてしまったことです。
今ではアプリを作る時に「こういう機能を実装したい」と思ったら、Unityでの実装方法を思いつくことができるのですが、当時はまだ知っている事が少なく、実装したい機能をどうやったら実装できるのかわかりませんでした。

そこで僕がやったのは

- いろいろな技術書やwebのチュートリアルをやる
- 技術書やチュートリアルで作ったアプリに機能を足したり画面を追加したりする

です。

## いろいろな技術書やwebのチュートリアルをやる
実装したい機能をどうやったら実装できるのかがわからないのは、単純にUnityの実装経験が少ないため引き出しが少ないのが原因です。
技術書によって説明している内容は異なるので、いろいろな技術書やチュートリアルをやることで、引き出しを増やすことができます。
具体的には、Unity技術書といっても説明している内容は、2Dか3Dかといった違いや、シューティングゲーム、アクションゲーム、ノベルゲームなどゲームの種類によって異なります。
僕は自分が買った本や会社にあった本を合わせて4冊か5冊くらいやりました。

## 技術書やチュートリアルで作ったアプリに機能を足したり画面を追加したりする
いきなりゼロからゲームを作り始めると、実装しないといけないことが多すぎてどれから手をつければいいかわからなくなります。
また知らないことも多いので調べないといけないことも多く、困ってしまいます。
技術書やチュートリアルで作ったアプリをベースにすると、実装するのは追加する部分だけだし、知らないことも少ないので実装を進めることができます。


また、当時は僕はやらなかったけど、今だったらこんなこともやるといいのではと思ったのは

- もくもく会に参加する
- twitterなどで進捗を公開する

です。

## もくもく会に参加する

もくもく会とは、「みんなで集まってもくもく作業する会」です。
誰かの発表を聞く勉強会とは違って、みんな自分の作業をしています。
参加者には上級者の人もいるので、初心者の人は困った時などに上級者に質問するのがいいと思います。

## twitterなどで進捗や疑問点を公開する

twitterなどで進捗や疑問点を公開すると誰かが答えてくれたり、反応があったりします。
また自分の作業記録としても使うことができて、1ヶ月前と比べてどのくらい変わっているかなどを感じることができます。
公開しないよりは公開するほうがより勉強のモチベーションを保つことができると思います。

以上です。
勉強を続けるのはなかなか大変ですが、いろいろな仕組みを使ってぜひ勉強を続けてもらえればと思います。
IoTやります！

# Arduino応用開発/学内セミナー
## 目的
+ 班編成になり、個々のグループでArduino及びRaspberry Piなどのマイコンをベースに１つの作品を作ること
+ センサーを組み込み、触ったり聴いたりして楽しめるもの
+ 予算は約1000円（マイコンは含まない）

## 作品のコンセプト
僕たちの班ではArduino単体から抜け出し、誰もが持っているスマートフォンと組み合わせて、実用的なものにしたいというコンセプトがありました。
「Arduinoは、持っていないけどスマホは誰もが持っている」
 スマホは、センサの種類も豊富であり高精度、限られた予算の中でスマホの機能でカバーできる。

### 立案
+ IoTを用いた家具との連携
+ 顔認証を使った、人の検知
+ SNSとArduinoを繋ぐ
+ スマホカメラを利用し、クライアント側に何か価値があるものに加工する
+ スマホを利用し、一定数需要のあるコンテンツ
+ 面白い、楽しめる要素があること！
+ 声によって曲を作成

## 作品の骨組みと内容

+ 話し合いの中で、ある程度骨組みが出来上がりました。それは、< スマホで撮影した写真をArduinoでアート加工を施しスマホに返す >システムです！インスタやツイッターなどで投稿する写真を、一味違う写真にすることで撮る楽しさが増えればという願いがあります！
+ アート加工には、複数の種類を設ける予定です。メインは、モザイク加工です。
+ Arduinoには、Wi-Fiモジュール（esp32）を設ける
+ Arduinoとスマホとの写真のやり取りは、現時点ではTwitterサービスに対応する予定(理由は、写真の劣化が少なく実用的)
+ Arduinoは、ツイッターで特定のワードを検索(ハッシュタグなど)やDM(ダイレクトメール)によって写真を取得
+ プログラムは、オープンソース化のものをベースに再編集

## 今の問題点
+ ツイッターからの写真の取り込みプログラムを作成可能か？
+ Arduinoにスマホの高画質写真を一時保存し、加工できるか？ストレージ問題について
+ 機種やカメラの違いによる、写真のサイズ(縦横比)に適応できるか？

## 参考文献
+ モザイク加工
<http://www.complexification.net/gallery/machines/boxFittingImg/index.php>
+ TwitterAPI 画像収集(注:ruby)
<https://qiita.com/Sa2Knight/items/06d76b56350593d04d36>
+ SDカードDIP化キット接続
<https://deviceplus.jp/hobby/entry021/>
+ Twitter API 画像取得 (注:Python)
<http://lily-nut.hatenablog.com/entry/2017/10/12/025149>
+ 画像取得 まとめ
<https://github.com/Code-Hex/twippai>
+ キーワードによる画像取得
<https://qiita.com/tadaken3/items/59617136ded926fbffcb>
+ Twitter APIコマンド
<https://syncer.jp/Web/API/Twitter/REST_API/GET/search/tweets/>
Reactでページ内リンクを実装する

Reactプロジェクトでページ内リンクを実装しようとした時の話。
先月いろんなモジュール試してみてもできなかったのにさっき調べたらサラッとできたからこの感動よ誰かに届け
##そもそもやりたいこと
- ページ内遷移（`<a href="#hoge"></a>`的な）
- スムーススクロール（リンク踏んだらその場所までアニメーションするやつ）
- 高さ指定（headerの高さ分だけ空けたい）

なんかスムーススクロールに関してはjQuery→jsの書き換えの時点でもつまづいた気がします。
jQueryって本当に便利マン

とりあえずページ内遷移ができていれば最悪OKで。

##とりあえずreact-router-domでやってみる
まぁ最初に思いつくのがこれですよね

```jsx
import { Link } from 'react-router-dom';

<Link to="#link1">リンク1へ移動</Link>

<div id="link1">リンク1</div>
```

どうやらこのLinkタグさん、ページ内リンクに対応していないらしいですね。
aタグって万能だったんだなぁ・・・

##モジュールを片っ端から調べてみる
本当に色々触ってみましたが有力そうなのをいくつか。
###react-router-hash-link
[【React Router】画面遷移時に#を用いて特定の要素に移動させる方法](https://qiita.com/gcyagyu/items/3fef2034edbc5834021d)
この方がわかりやすく紹介してくださっていたり、「react ページ内リンク」とかで調べると真っ先に出てくるやつです
https://github.com/rafrex/react-router-hash-link

```jsx:hoge.jsx
import {HashLink} from 'react-router-hash-link';

<HashLink smooth to="/hoge#link1">リンク1へ移動</HashLink>

<div id="link1">リンク1</div>
```
なんとsmoothと書くだけでいい感じにアニメーションまでしてくれるらしい。
最高やん！これに決めた！

と、思っていたのですがなぜかsmoothの指定をすると遷移先が微妙にずれる・・・
本当に色々やって見たのですがmarginやらpaddingやらを全部抜いたらうまくいったんですけど流石に現実的ではないですね。
上記で紹介した記事の方のように恐らく通常はうまくいくんだと思います。
是非お試しください。

###react-router-hashlink
めっちゃ紛らわしい
前述のモジュールとの名前の違いが「-」のみです。
気がつかずにそっちの実装方法で試してみちゃったりしました。
https://1000ch.net/posts/2017/react-router-hashlink.html

オプションなどはそちらで詳しくみていただくとして

```jsx:hoge.jsx
import { HashLink } from 'react-router-hashlink';

<HashLink to="/hoge#link1" behavior="smooth">リンク1へ移動</HashLink></li>

<div id="link1">リンク1</div>
```

こちらもスムーススクロールの指定が非常に簡単ですね。素敵。
しかしこちらも同じく高さがずれます。なんなんでしょう。

流石にこれはモジュールのせいではなくこっちの問題なんだろうと思いましたが、もうどこか悪いのかもさっぱりわからない。
完全に途方にくれてそっとプロジェクトの残タスクに放置して他のことを進めていました。
そしてふと思い出して他のモジュールを使ってみると・・・

###react-anchor-link-smooth-scroll
https://github.com/mauricevancooten/react-anchor-link-smooth-scroll
見つけてしまいました。

```jsx:hoge.jsx
import AnchorLink from 'react-anchor-link-smooth-scroll';

<AnchorLink href="#link1" offset="50">リンク1へ移動</AnchorLink>

<div id="link1">リンク1</div>
```
名前にsmooth-scrollと付いている通りデフォルトでスムーススクロールを行なってくれるみたいです。
しかも高さ指定も簡単。
ここの値をwindow幅に応じて変化するようにすればレスポンシブ対応も問題ないですね。

##結論
あくまで私の環境下では[react-anchor-link-smooth-scroll](https://github.com/mauricevancooten/react-anchor-link-smooth-scroll)だけが正常に動きましたが、
皆さんも色々試してみてどれが良いか模索してみてはどうでしょうか。

というか今回でとても痛感しているんですが、
素のjsやらjQueryやら今回のreactやら使う技術が少し変わるだけで実装方法が変わってしまってしんどいですね。
フロントエンドエンジニアとして働き始めて9ヶ月程度ですが、スライダーだけで３種類くらい探してる気がします。
数値積分

# 概要
- 与えられた関数$f(x)$を区間$[a,b]$で積分したい
- 区間$[a,b]$を$n$個の微小区間に分割して、各区間の面積を計算する


![qiita-integer-1.png](https://qiita-image-store.s3.amazonaws.com/0/299208/054a7770-bb53-283c-7097-e1cd2baf6661.png)

- 面積の計算法は、各手法によって異なる



# 代表的な解法
[台形則](https://qiita.com/omu58n/items/55699bd127ed74d6b73f)
[中点則](https://qiita.com/omu58n/items/7767898005c6d3e4ca88)
[シンプソン則](https://qiita.com/omu58n/items/4025ac6fafbe3d8c1a64)

- これらの解法は、[ニュートン・コーツの公式](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E3%83%BB%E3%82%B3%E3%83%BC%E3%83%84%E3%81%AE%E5%85%AC%E5%BC%8F)と総称されている
pythonのパッケージの依存関係をpydotを使って有向グラフ化

#前書き
以下の記事のコードをコピペして実行したら動かなかったので自分の環境用に修正したやつをメモ書き。

[pythonパッケージの依存関係をgraphvizで可視化](https://qiita.com/SaitoTsutomu/items/895dc98148942e740312)

#環境
- WSL
- python3.6

#ソースコード
```python
import pydot
from subprocess import run, PIPE

ss = run(['pipdeptree',"-freeze"], stdout=PIPE, stderr=PIPE,
         universal_newlines=True).stdout.rstrip().split("\n")
edges = []

for s in ss:
    c = s.count(" ")
    s = s[:s.index("=")].replace(" ","")
    d[c] = s
    if c != 0:
        edges.append((d[c-2],s))
        
g = pydot.graph_from_edges(edges,directed=True)
g.write_png("pipdeptree.png")
```

# できたもの
全部のパッケージでやると多すぎるのでpipdeptreeの出力の上から50個程度
![pipdeptree.png](https://qiita-image-store.s3.amazonaws.com/0/190128/b8edbf08-68e9-0edf-dc14-99559cda0ece.png)

終わり
Linuxに入っているコマンドをランダムに表示するshellを作った


```shell
#!/bin/sh

echo "Do you know how to use: '"$(compgen -c | gshuf -n 1)"'?"
read -p "Yes or No?(y/n)" -n 1 -r
echo 
if [[ $REPLY =~ [[Yy]$ ]]
then 
  echo "Cool! Post your knowledge to your blog or favorite site."
else 
  echo "OK, study it and then post about that."
fi
```

```terminal
$ ./command-questions.sh 
Do you know how to use: 'ldapsearch'?
Yes or No?(y/n)n
OK, study it and then post about that.

$ ./command-questions.sh 
Do you know how to use: 'sort'?
Yes or No?(y/n)y
Cool! Post your knowledge to your blog or favorite site.
```
AMPでインラインスタイル属性に対応していた

# AMPでインラインスタイル属性に対応していた
数ヶ月前からですが、
[Supported CSS](https://www.ampproject.org/docs/design/responsive/style_pages) 
で `Disallowed styles` から `inline style attributes` が取り除かれました

残念なことに日本語ドキュメントへは、まだ反映されておらず
[サポートされる CSS](https://www.ampproject.org/ja/docs/design/responsive/style_pages)
では確認することができません

インラインスタイル属性の対応に伴い、CSSサイズ制限の引き上げなども議論されているようです
https://github.com/ampproject/amphtml/issues/17269

# 注意点
- インラインスタイルなどCSSのサイズは合計で **50KB制限** にされている
- インラインスタイルであっても [Supported CSS](https://www.ampproject.org/docs/design/responsive/style_pages) に記載されている `Disallowed styles` は利用できない

#最後に
投稿するために調べていると、すでに解説したサイトを発見しました
より詳しい情報については、[こちら](https://firstlayout.net/amp-now-supports-style-attribute/)のサイトや[公式(English)](https://www.ampproject.org/)を確認してみてください

# 参考
https://firstlayout.net/amp-now-supports-style-attribute/
gifify.sh — ビデオファイルからGIFにコンバートする

仕事で「Assembla」と言ったサービスを使っています。AssemblaはGithubのようです。時々、分かりやすいのために、作ったチケットにスクリーンキャストを付いています。Assemblaはビデオプレーヤーがありませんから、スクリーンキャストを見えるにはダウンロードする必要があります。面倒ですから、このスクリプトを作りました。

# スクリプトです

```bash:gifify.sh
#!/usr/bin/env bash

TEMP_DIR=$(mktemp -d $TMPDIR/gifify.$RANDOM)

ffmpeg -i $1 -r 5 "$TEMP_DIR/frames-%03d.jpg"

FILENAME=$(basename $1)

convert -delay 20 -loop 0 $TEMP_DIR/frames-*.jpg "${FILENAME%%.*}.gif"

rm -rf $TEMP_DIR
```

それを使用するには、これらをインストールする必要があります：

- [ffmpeg][] - ビデオファイルが複数のイメージファイルに切るのために使用。
- [ImageMagick][] - 複数のイメージファイルが単一GIFに繋ぐのために使用。

#### ５行目を解体しましょう
`ffmpeg -i $1 -r 5 "$TEMP_DIR/frames-%03d.jpg"`

- `ffmpeg` - ffmpegを呼び出す。
- `-i $1` - 入力ファイル。
- `-r 5` - フレームレートが５に設定する。
- `"$TEMP_DIR/frames-%03d.jpg"` - 出力パス。

#### ９行目も解体しましょう
`convert -delay 20 -loop 0 $TEMP_DIR/frames-*.jpg "${FILENAME%%.*}.gif"`

- `convert` - ImageMagickのconvertを呼び出す。
- `-delay 20` - 次のイメージを見せるの前に遅れを付ける。
- `-loop 0` - 無限再生されるのに設定する。
- `$TEMP_DIR/frames-*.jpg` - 入力ファイル。
- `"${FILENAME%%.*}.gif"` - 出力ファイル。

> 私はffmpegとImageMagickの上級ユーザーではありませんから、基本的な設定だけを使いました。

# 使用方法

`./gifify.sh ./sample.mov`

それがsample.gifを出力します。

# デモ

[sample.mov][] - Quicktimeでこのスクリーンキャストを作りました。

このスクリプトの出力：
![sample.gif][]

今から、チケットにGIFを付いたら、みんなはスクリンキャスト（偽）を直ぐに見えます！

-----
[英語訳があります。][english-link]
> 私は日本語をまだ勉強していますから、間違ったことがあれば教えてください。🙏


[ffmpeg]: https://www.ffmpeg.org/
[ImageMagick]: https://www.imagemagick.org/
[sample.mov]: https://github.com/nasvillanueva/nasvillanueva.github.io/blob/develop/src/pages/gifify/sample.mov?raw=true
[sample.gif]: https://qiita-image-store.s3.amazonaws.com/0/293842/82586064-d2f1-ded6-8792-cf8db2c4ba30.gif
[english-link]: https://www.nasvillanueva.com/gifify
Nginx + unicorn + Rails本番環境構築メモ

##実行環境など
CentOS Linux release 7.5.1804 (Core) 
Rails 5.2.1
ruby 2.5.1p57

let's encrypt でssl証明書取得済み
ドメイン設定済み

##【CentOS 7】Nginx + Unicorn で Rails アプリケーションを本番環境で立ち上げる方法
基本的にはこの記事に書かれている方法にしたがって設定していけば正常に起動できた。
[【CentOS 7】Nginx + Unicorn で Rails アプリケーションを本番環境で立ち上げる方法](https://qiita.com/noraworld/items/c8acf4bb981c8d8535df)
####以下では、他に個人的に行った操作を記述する。

##unicornの起動でつまずく
`$ rake unicorn:start`このコマンドでは起動に失敗し、エラーメッセージにしたがって下記のコマンドを実行することで無事起動した。

```
$ bundle exec rake unicorn:start
```

##sslの設定
`/etc/nginx/conf.d/rails(default).conf`を下記のように編集することで取得したドメインを用いたssl通信にも成功した。

```/etc/nginx/conf.d/rails.conf
upstream unicorn {
    server  unix:{Railsアプリケーションのあるディレクトリ}/tmp/unicorn.sock;
}
server {
    listen       80;
    server_name {取得したドメイン名};
    return      301 https://$host$request_uri;
}

server {
    listen      443 ssl;
    server_name {取得したドメイン名};
    ssl_certificate /etc/letsencrypt/live/{取得したドメイン名}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{取得したドメイン名}/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    access_log  /var/log/nginx/ssl-access.log  main;
    error_log   /var/log/nginx/ssl-error.log;
    root {Railsアプリケーションのあるディレクトリ}/public;
    include /etc/nginx/mime.types;

    client_max_body_size 100m;
    error_page  404              /404.html;
    error_page  500 502 503 504  /500.html;
    try_files   $uri/index.html $uri @unicorn;
 
    location @unicorn {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn;
    }
}
```

##追記
###nginxの起動が行えない
この方法に従って本番環境構築を行ったところ、新たなエラーに遭遇したためその解決方法を追記。

```
$ systemctl start nginx
```
を実行すると、

```
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
```
とエラーが出てnginxの起動が行えない。

```
$ nginx -t
```
とすると

```
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
```
「「Permission denied」」

```
$ setenforce 0
```
のコマンドでSELinuxの動作モードをPermissiveに切り替えてあげてから

```
$ systemctl start nginx
```
実行で正常に起動。

##参考サイト
[【Ruby on Rails】Nginxとunicornを使ってHTTPS（SSL）対応する方法](https://dogmap.jp/2011/05/10/nginx-ssl/)
[トラブル対処の第一歩は「permissiveモード」](http://www.itmedia.co.jp/enterprise/articles/0704/02/news021_2.html)
FirstVRを使ったスワイプ認識

#FirstVRでのスワイプ認識
##スワイプ認識とは
FirstVRにおけるスワイプ認識とは手を上下左右どの方向に振ったかの認識で、腕をある方向にふることを合図として何かを行いたい場合に利用します。
画面を切り替えたりするのに使えそうですよね。

![img_5_m.jpeg](https://qiita-image-store.s3.amazonaws.com/0/253416/eaaf4f3a-cd1f-3aca-5049-df84a4ebe115.jpeg)

引用：マイノリティリポート(2002)

##STEP1 - SDKの準備
まずSDKをインストールします。
SDKは以下のリンクからダウンロードしてください
（開発者の登録を済ませていない方は事前にメールアドレスの登録が必要になるかもしれません。）

<img width="1440" alt="スクリーンショット 2018-10-16 18.38.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/253416/b1523d23-deca-d7f7-9206-c5c26d318c73.png">
https://dev.first-vr.com/downloads?locale=ja

そのあとにAssets/Sceneの中にあるOutputViewer.sceneを開いてください

<img width="1440" alt="スクリーンショット 2018-10-16 16.58.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/253416/2ce18ed3-7b0d-7c5d-696f-6e997bc45d1d.png">


##STEP2:サンプルスクリプトの作成とゲームオブジェクトの準備
上下左右どの方向にスワイプをしているかを識別したい場合はFVRゲームオブジェクトにアタッチされているFVRGestureManagerのインスタンスを使います。
具体的には、FVRGestureManagerインスタンス変数であるswipeU,swipeD,swipeL,swipeRのインスタンス変数であるtriggeredがtrueかfalseかで判定を行います。（インスタンス変数のインスタンス変数ってややこしいですねw）

以下はサンプルのスクリプトになります。
アタッチした後にUnityエディタからFVRGestureManagerにFVRゲームオブジェクトのFVRGestureManagerをアタッチしてください
<img width="1440" alt="スクリーンショット 2018-10-16 17.07.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/253416/e15b58f1-6b45-b6ea-5349-90e0ecddcf4d.png">

##注意##
あくまでもtriggerと書いてあるためスワイプを行った瞬間のみtrueになるので、その場合はflagを使って状態を保持してください。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FVRlib;
using UnityEngine.UI;

public class SwipeCheck : MonoBehaviour {

    public Text checkText;
    FVRGesture.Types swipe;
    public FVRGestureManager fvrGestureManager;
	

        //スワイプしているかどうかを検知する場合はUpdate関数など常に呼ばれる関数内でチェックします。
	void Update () {
        
　　　　　//Up,Down,Left,Rightをチェックする変数は1つの変数でチェックする訳ではないので以下のようにif文で書くようにします。
        if (fvrGestureManager.swipeU.triggered)
        {
            checkText.text = "UP!!!!";
        }
        else if (fvrGestureManager.swipeD.triggered)
        {
            checkText.text = "Down!!!!";
        }
        else if (fvrGestureManager.swipeL.triggered)
        {
            checkText.text = "Left!!!!";
        }else if(fvrGestureManager.swipeR.triggered){
            checkText.text = "Right!!!!";
        }
}
}
```

ちなみにFirstVRには開発者用のスラックがあるようなのでもしわからないことがあったらスラックに入って質問して見るのもいいかもしれません。
リンク：https://goo.gl/wpu63X
Ruby,PythonおすすめYouTubeちゃんねる

両方ともプログラマスター

プログマスター

Ruby
https://www.youtube.com/watch?v=PjyEuVMt-iQ&list=PLQc6nQThlccJof_Woo7kgGB2Wxjo9zxQV

Python
https://www.youtube.com/watch?v=TiBYXcRAL-Y&list=PLQc6nQThlccJyNHWjgD4gyd5DUz0Va6ga
Syncthingのクラウドノードを立てるにあたってAWSよりさくらのVPSのほうが良質だった

[Syncthing]はP2PでDropboxみたいなことができるGo製のオープンソースだ。使っている感じとして、Dropboxより低CPUリソースで、同期はDropboxより速い。

## Syncthingでクラウドノードを立てる理由

Syncthingのファイル同期はP2Pなのでサーバを立てるのは必須ではないが、同期をするにはネットワークに同期元と同期先のマシン2台以上が稼働している必要がある。例えば、職場のMacが電源OFFで自宅Macから同期できないといったことが起こる。そうならないよう、AWSなどにSyncthingのノードをひとつ立てておくと良い。

[Syncthing]: https://syncthing.net

## AWSは同期が遅かった

最初にAWSでEC2 microインスタンス+EFSの環境でSyncthingのノードを立てたが、耐えられないほど同期に時間がかかった。

次にEC2 microインスタンス+EBSの環境でやってみたところ、5〜6倍は同期が早くなった。それでも、僕の環境はファイル数が多い(数万ファイル)ため、実用に耐えられる感じではなかった。

microインスタンスではCPUリソース不足やEBS性能制限を感じたためt3.mediumにスケールアップしてみようと思ったが、コストを試算したら64GBのSSDストレージで月6,000円以上かかることがわかったため断念した。

## さくらのVPSは20倍くらい早かった

コスト的にVPSのほうが安いのではと考えてさくらのVPSのプライシングを調べてみたら、2GBで月1,706円だったので、そのプランを選択した。

さくらVPSは最初の2週間無償トライアルできる。ただしその間の通信速度は10Mbpsに制限される。それでもAWSで試した環境よりは20倍くらい早く、実用的なスピードが出ることがわかった。

AWSのリージョンは東京といいつつも東京都ないでない場合があるが、さくらのVPSの東京第2ゾーンは東京都北区にあるらしい。都内からの通信だとさくらのVPSのほうに軍配があがるかもしれない。
ちょっとかしこいtqdm①

続編→ https://qiita.com/namahoge/items/c390e79693605234212b

# tqdm
https://github.com/tqdm/tqdm
![tqdm.gif](https://qiita-image-store.s3.amazonaws.com/0/188173/3a3bc06f-5392-9676-a279-deb53baf57a1.gif)

ggってもシンプルな使い方しか出てこなかったので記事を書いてみました

## 普通のtqdm

```python
from tqdm import tqdm
import time

def func(c):
    # データの読み書きなど、何らかの処理を行う
    # 今回はとりあえず何もしない関数を用意した。
    pass

for char in tqdm(list("abcdefg")):
    func(char)
    time.sleep(0.01)
```

![Screenshot from 2019-01-04 16-47-41.png](https://qiita-image-store.s3.amazonaws.com/0/188173/f515331d-857d-c144-e53d-e868ff5d9a0e.png)

- 進捗バーがでてきただけでなんかすげえってなった思ひ出

## 事故ったtqdm

```python
from tqdm import tqdm
import time

def func(c):
    # とりあえず入力文字をそのまま返してみようと思った。
    return c

for char in tqdm(list("abcdefg")):
    print(func(char))
    time.sleep(0.01)
```

![Screenshot from 2019-01-04 16-50-31.png](https://qiita-image-store.s3.amazonaws.com/0/188173/a2640e1e-25c5-b6f8-fc0e-92d385e48cbc.png)

- あるある
- 変数とかも進捗バーに一緒に表示してくりーー（kerasみたいに）

## 理解したtqdm

```python
from tqdm import tqdm
import time

def func(c):
    # とりあえず入力文字をそのまま返してみようと思った。
    return c

with tqdm(list("abcdefg")) as pbar:
    for char in pbar:
        pbar.set_postfix(input=char, output=func(char))
        time.sleep(0.01)
```

![Screenshot from 2019-01-04 16-52-07.png](https://qiita-image-store.s3.amazonaws.com/0/188173/cd8cc251-0698-e360-7bb9-96e77ffd4bfd.png)

- そういうこと
- with文を使って、このループ内で使うtqdmを操作できるようにする的な

## 完全に理解したtqdm

```python
from tqdm import tqdm
import time
from collections import OrderedDict
from random import random

def func(c):
    # とりあえず入力文字をそのまま返してみようと思った。
    return c

with tqdm(list("abcdefg"), ncols=10) as pbar:
    for i, char in enumerate(pbar):
        pbar.set_postfix(OrderedDict(
            output=func(char), loss=random(), acc=random()))
        time.sleep(0.01)
```

![Screenshot from 2019-01-04 16-53-08.png](https://qiita-image-store.s3.amazonaws.com/0/188173/97bfbaa5-8732-61eb-0cb1-e50a2daad705.png)

- おーーkerasっぽくなった
- set_postfixに渡しているのは辞書なので、表示させる変数の順番が変わってほしくなかったらこうすると良さそう
    - （そのまま渡すと名前順的にaccが最初、stepが最後に来てしまう...）
- ついでに黒いバーも短くしてみた
- 完全に理解した（嘘ですもっといい書き方あったら教えて）

# 以上！！

こちらも興味あれば見てってください〜

- [DL on serverのDockerfile(個人的)決定版。CUDA+GUI転送+zsh+pyenv【随時更新?】](https://qiita.com/namahoge/items/cf39320e9acc5b96d1a6)
- [Pytorch+Tensorflowのちゃんぽんコードのすゝめ（tfdsでpytorchをブーストさせる話）](https://qiita.com/namahoge/items/71be06c8fe37e88909c9)
- [データがないのに学習可能？　最先端AI「メタ学習」がスゴい](https://xtrend.nikkei.com/atcl/contents/technology/00007/00017/)(日経クロストレンド)


（[twitter](https://twitter.com/StaPriEG2)もよろしく）


```math
\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

　　$\textsmall{い\ い\ ね\ ほ\ し\ い\ ！}$
Chef templateリソースでincompatible character encodings: ASCII-8BIT and UTF-8エラー

備忘

##環境
test-kitchen(vagrant + virtualbox + centos + chef-zero)環境

Chef Development Kit Version: 3.1.0
chef-client version: 14.2.0
kitchen version: 1.22.0
Vagrant 2.1.2
bento/centos-7 (virtualbox, 201808.24.0) : CentOS Linux release 7.5.1804 (Core) 



##事象
Chefのtemplateリソースを使用していた際にincompatible character encodings: ASCII-8BIT and UTF-8エラーとなった。
erbファイルが日本語を含み、かつ<%= %>内で日本語を返すとエラーとなることがある様子。
erbファイルやレシピのコード指定は効果が見られない。

#例
```ruby:recipes/default.rb
# encoding: UTF-8
node.default['foo'] = 'あいうえお'

template '/tmp/test.txt' do
  source 'test.txt.erb'
end
```

```erb:templates/test.txt.erb
<%# encoding: UTF-8 %>
テスト
<%= node['foo'] %>
```


```
...
         * template[/tmp/test.txt] action create
           
           ================================================================================
           Error executing action `create` on resource 'template[/tmp/test.txt]'
           ================================================================================
           
           Chef::Mixin::Template::TemplateError
           ------------------------------------
           incompatible character encodings: ASCII-8BIT and UTF-8
...
```
<%= node['foo'].encoding %>とするとUTF-8となるので、erb側がASCII-8BITなのか。
コード指定では対応できなかった。


##とりあえず回避
erbファイル本体から日本語を抜いた結果、<%= %>にて日本語を埋め込んでも正しく動作できているが。。


```erb:templates/test.txt.erb
<%# encoding: UTF-8 %>
<%= node['foo'] %>
```
```
         * template[/tmp/test.txt] action create
           - create new file /tmp/test.txt
           - update content in file /tmp/test.txt from none to 5cf25d
           --- /tmp/test.txt	2018-10-16 06:53:47.343099574 +0000
           +++ /tmp/.chef-test20181016-4788-y84050.txt	2018-10-16 06:53:47.343099574 +0000
           @@ -1 +1,2 @@
           +あいうえお
           - restore selinux security context
```
bedGraph wiggleファイルの特徴領域の抜粋

#bedGraph wiggleファイル
リファレンスゲノム上にマッピングされた塩基対単位のリードスコアデータ
fixedStepとかvariableStepとかいろいろあるみたいだけどここでは割愛。詳しくは[ここらへん](https://asia.ensembl.org/info/website/upload/wig.html)参照。
筆者はだいたい「.bigwig」から[bigWigToWig](https://www.encodeproject.org/software/bigwigtowig/)で染色体ごとに分けて使ってる。

```shell:devide_each_chr.sh
#ヒト染色体の場合
for i in `seq 22`
do
bigWigToWig -chrom=chr$i hoge.bigwig hoge_chr$i.wig
done
```
shell楽
それでwiggleファイルの中身がこれ

```hoge.wig
#bedGraph section chr1:0-840194
chr1	0	56898	0
chr1	56898	56998	1.02889
chr1	56998	91465	0
chr1	91465	91468	1.02889
chr1	91468	91469	2.05778
chr1	91469	91476	3.08639
chr1	91476	91487	4.11528
chr1	91487	91565	1.32123
chr1	91565	91568	0.9909
```
一行目でコメントアウトされてるのがデータの情報。
第1染色体の0塩基対目から840194塩基対目まで。
このコメントアウトが随所に見られるけど割と次のコメントアウトと前のコメントアウトで書かれてる範囲が繋がってたりする。IGVで見るためかも。
二行目から先は肝心のデータ部分

```
染色体	スタート位置	エンド位置	スコア
```
になってる。
スタート位置からエンド位置までスコアがずっと並んでるわけですね。

#何がしたいの
特定の閾値より高いor低いのが一定長以上続くような場所（特徴領域）を抜き出したい。
早い安いうまい古いで評判のPerlを使った。
抜き出した領域もbed形式風にまとめる。

```Perl:search_region_on_wig.pl
use Statistics::Lite qw(:all);

my ($INPUT ,$OUTPUT, $border_u,$border_t, $length_u, $length_t, ) = ("","",0,0,0,3000000000);

($INPUT ,$OUTPUT, $border_u,$border_t, $length_u, $length_t, ) = @ARGV;

open IN,"$INPUT"or die;
open OUT,"> $OUTPUT"or die;
my $start = -1;
my $end = -1;
my @score = ();
my $chr;
while(my $line = <IN>){
    chomp $line;
    
    if($line !~ /#/){
        my @data = split /\s/,$line;
        if(($border_u<=$data[3])&&($data[3]<=$border_t)){#ボーダー範囲内に入っている
            if($start==-1){#スタート位置を覚えていなければ現在位置の記憶と終わりの記憶
                $start = $data[1];
                $end = $data[2];
                $chr = $data[0];
                @score = ();
                push @score,$data[3]*($data[2]-$data[1]+1);
            }
            else{
                if($end >= $data[1]){#一つ前のデータの終わりから繋がっているか
                    $end = $data[2];
                    push @score,$data[3]*($data[2]-$data[1]+1);
                }
                else{
                    if(($length_t>=$end-$start)&&($end-$start>=$length_u)){
                        print OUT "$chr $start $end ",$end-$start," ",sum(@score)/($end-$start),"\n";
                    }
                    #現在位置と終わりの記憶を忘れる
                    $start = -1;
                    $end = -1;
                }
            }
        }
        else{
            if($start != -1){#スタート位置に記憶が残っていたら、前のデータとの繋がりが切れると書き出す
                if(($length_t>=$end-$start)&&($end-$start>=$length_u)){
                    print OUT "$chr $start $end ",$end-$start," ",sum(@score)/($end-$start),"\n";
                }
                $start = -1;
            }
        }
    }
}
close OUT;
close IN;
```

これで

```shell:pickup.sh

for i in `seq 22`
do
perl search_region_on_wig.pl hoge_chr$i.wig output.txt 0 1.5 100 150
done
```

とすれば全染色体で探索ができる。

#まとめ
リードスコアが低い領域あつめたーいというためだけに書いたけどここから特に可視化ができるわけではない
IGVにマーカー機能があれば少し役に立つかも。
【Julia】AtomのscriptでJuliaを実行


# はじめに
この度，めでたくJuliaという言語に出会いましてその魅力に惹かれてしまいました。とりあえず触って見ようと思ったのですが，個人的に対話モードやターミナル上での実行は好きじゃないので，愛用しているAtomのscriptで実行できるようにしました。

# 環境
PC : Mac (macOS 10.14)
Julia : 1.0.1

# 環境構築

## Juliaダウンロード
https://julialang.org/downloads/
ここから最新版のdmgファイルをダウンロード
ダウンロードしたファイルを開いて中にある Julia-1.0.app をアプリケーションフォルダに移動させます。

## パスを記述
~/.bash_profile にJuliaへのパスを記述しておきます。
不可視ファイルの表示切り替えは「command+shift+.(ドット)」でできます。

```~/.bash_profile
# Julia
export PATH="/Applications/Julia-1.0.app/Contents/Resources/julia/bin/:$PATH"
```

## Atom
- script
- language-julia

以上の２つをインストールしたら環境構築は完了です。

# テスト
適当なコードを実行してみましょう。
<img width="326" alt="スクリーンショット 2018-10-16 15.46.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/231104/8f21b988-7b99-0b54-1613-50ec050e3f9b.png">

script実行時に以下のようなメッセージが出た場合はパスを確認してAtomを再起動してみてください。
<img width="589" alt="スクリーンショット 2018-10-16 15.49.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/231104/cd0160f4-eb72-0278-54f5-1f9a01736683.png">



# 参考
https://julialang.org/
https://en.wikibooks.org/wiki/Introducing_Julia/Getting_started
fetch,async/awaitでAjax通信

## 前提

### fetch

[Fetch 概説 - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch)

XMLHttpRequestの代替。
PromiseベースのAjax仕様のAPI。

polyfillを忘れがちなので注意。
https://github.com/github/fetch


### async function

[async function - JavaScript | MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function)

関数定義の前に`async`をつけることで、その関数を`AsyncFunction`にする。
暗黙的にPromiseを返す関数。



### await

[await - JavaScript - MDN - Mozilla](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await)

`async function`の実行を一時停止し、関数のPromiseの結果を待つ。
`fetch`はPromiseを返すので相性が良い。


## サンプル

お天気のAPI（[OpenWeatherMap](https://openweathermap.org/)）を叩くサンプル。

まずは定数を準備。

```javascript
const API_KEY = '${API_KEY}';
const CITY = 'Tokyo';
const URL = `http://api.openweathermap.org/data/2.5/forecast?q=${CITY},jp&units=metric&APPID=${API_KEY}`;
```

fetchを使用したサンプル。

```javascript
fetch(URL)
    .then(res => {
        if(res.ok){
            return res.json();
        } else {
            throw new Error();
        }
    })
    .then(myJson => {
        console.log(JSON.stringify(myJson));
    })
    .catch(err => {
        console.log(err);
    })
```

fetch,async/awaitを使用したサンプル。

```javascript
async function getWeather() {
    const res = await fetch(URL);
    const data = await res.json();
    return data;
    // ↓無理やり一行で書くとこうなる
    // return await (await fetch(URL)).json();
}
getWeather()
    .then(data => {
        console.log(JSON.stringify(data));
    })
    .catch(err => {
        console.log(err);
    })
```
Screensを使ってMacのリモートデスクトップ環境を作る

Macを複数台持っていて、例えば自宅と外出先で別々のMacを使っていると、自宅で作ったファイルをうっかりクラウドに置き忘れるなどで外出先で困ったりすることがたまにある。

Apple公式のMac遠隔操作アプリ[‎Apple Remote Desktop](https://itunes.apple.com/jp/app/apple-remote-desktop/id409907375?mt=12)を使うと外出先でも自宅のMacを操作することができるが、このアプリは有償で¥9,800[^2018-10-16現在]と値が張る。

## Screens

同様なことができるアプリとして[‎Screens 4](https://itunes.apple.com/jp/app/screens-4/id1224268771?mt=12)があり、これは¥3,600[^2018-10-16現在]だ。Apple Remote Desktopより安価というだけでなく、Apple Remote DesktopはVPNを設定する手間があるが、Screensにはそれは不要なので導入もしやすい。あとScreensにはiOSアプリがある。

ScreensはUIもすっきりしていて良い:

![2018-10-16 15.40.48.gif](https://qiita-image-store.s3.amazonaws.com/0/889/6332b7d7-354c-6b09-06d4-868d761c8e4e.gif)


[^2018-10-16現在]: 2018-10-16現在のMac App Sotreの価格。

## Screensを使ったリモートデスクトップ環境の構築手順

### Screensをインストールする

Screensを手に入れる方法は3つある:

1. ‎[Mac App Sotre](https://itunes.apple.com/jp/app/screens-4/id1224268771?mt=12)から購入する
* [Screensの開発元](https://edovia.com/screens-mac/)から直接購入する (無償トライアルあり)
* [Setapp](https://go.setapp.com/invite/c079d6d8-8141-4af1-a0e9-01127e935342)からインストールする (僕はここから入れた)

### Screens IDの取得

[Screens Connect](https://screensconnect.com/en/)はScreens付属の無償サービスで、Screens IDを発行すると外出先など遠隔地からMacにログインできるようになる。このアカウントを取得しておく。

### Screens Connectのインストール

さらに、「Screens Connect」というアプリをログインしたいMacにインストールしておく。これをインストールした端末には外部からログインできるようになる。

インストール方法は2つあるので好みで:

1. [公式サイト](https://screensconnect.com/en/)からダウンロードする
* Homebrew Caskでインストールする: `brew cask install screens-connect`

### Screens Connectをユーザのログイン項目に追加する

再起動時にScreens Connectが起動するように「環境設定」→「ユーザとグループ」→「ログイン項目」にScreeens Connectを追加しておく。

<img width="668" alt="Users___Groups.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/71678728-a743-2dea-2178-b155b5f24fe6.png">


### 所感

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">今のところ、マシンスペックに余裕があるので操作感の遅延はあんまり気にならないけど、CPU性能に左右される感があるので、低スペックマシンだとちょっともっさりするかも。</p>&mdash; ❄️suin (@suin) <a href="https://twitter.com/suin/status/1052090808231317504?ref_src=twsrc%5Etfw">2018年10月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">他のリモートデスクトップアプリには、ショートカットキーが接続先のマシンに行かなくて操作が歯がゆかったりするけど、Screensはリモートにつないでいるのを忘れるくらい忠実にショートカットキーを送ってくれるのが良い点</p>&mdash; ❄️suin (@suin) <a href="https://twitter.com/suin/status/1052090345452752896?ref_src=twsrc%5Etfw">2018年10月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
[作成中]Python使い方メモ

Pythonでコードを書く際の注意点、気になった点を記載していきます。
また、Kaggleで学んだ書き方も備忘録として加えて行きます。

##変数のアンダーバーについて
Pythonの標準コーディングスタイルを定めるPEP 8にてガイドラインが説明されています。以下、日本語訳バージョンから部分引用します：
https://pep8-ja.readthedocs.io/ja/latest/#id24
###アンダーバー１つ
_single_leading_underscore: “内部でだけ使う” ことを示します。
たとえばfrom M import *は、アンダースコアで始まる名前のオブジェクトをインポートしません。
###アンダーバー２つ
\_\_double_leading_underscore: クラスの属性に名前を付けるときに、名前のマングリング機構を呼び出します (クラスFoobarの\_\_booという名前は_FooBar\_\_booになります。以下も参照してください)

\_\_double_leading_and_trailing_underscore\_\_: ユーザーが制御する名前空間に存在する "マジック"オブジェクト または "マジック"属性です。 たとえば \_\_init\_\_, \_\_import\_\_, \_\_file\_\_ が挙げられます。この手の名前を再発明するのはやめましょう。ドキュメントに書かれているものだけを使ってください。

##math関数
###平方根を求める
```python:Python3
>>>import math
>>>math.sqrt(7)
2.6457513110645907
```

##マルチコア並列処理
膨大なデータを分析する必要がある場合、処理を高速化をできる。

```python:Python
from multiprocessing import Pool
from multiprocessing import Process

def function(hoge):
    #やりたいこと
    return x

def multi(n):
    p = Pool(10) #最大プロセス数:10
    result = p.map(function, range(n))
    return result

def main():
    data = multi(20)
    for i in data:
        print i

main()

```

「0,1,2・・・19と値を変化させてfunctionを20回実行する」という処理です。
functionの返値はresultにリストで入っているので、受け取って標準出力しています。
DBライブラリ・システム


Goku
https://github.com/eolinker/GoKu-API-Gateway
golang API Gateway (753 stars)

Gohan
https://github.com/cloudwan/gohan
golang API Gateway (91 stars)

Vegeta
https://github.com/tsenart/vegeta
HTTP負荷ツール (9310 stars)

Bulma
https://github.com/jgthms/bulma
CSSフレームワーク (30.5k stars)

Piccolo
https://github.com/DiatomStudio/Piccolo
小型CNCボット (317 stars)

Kuririn, Trunks, Yamcha, ほか ...
特になし

---

DBとはデータベースではなくドラゴンボールのことです。
ブルマとベジータから着想して調べてみた。
初版2018.10.16
PostgreSQLのcli psqlからRedshiftで実行したSQLでエラーが発生したら終了させたい

## やりたいこと

Redshiftに蓄積しているデータを、日次処理で
[既存の行を置き換えてマージ操作を実現する](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/merge-replacing-existing-rows.html) にあるような方法で、更新していきます。

```sql:load_data.sql

-- 更新するデータを準備
create temp table stage (like target); 

insert into stage 
select * from source 
where source.filter = 'filter_expression'; 

-- 集計済みデータから更新されるレコードを削除
begin transaction;

delete from target 
using stage 
where target.primarykey = stage.primarykey; 

-- 更新したデータを投入
insert into target 
select * from stage;

-- ※deleteが成功してinsertが失敗した時にcommitされるのは困る
end transaction;
```

RedshiftにPostgreSQLの cli [psql](https://www.postgresql.jp/document/10/html/app-psql.html) で `-f` オプションや `\i`コマンドでスクリプトを実行した場合に、複数のSQL文があり途中で失敗した場合に止まることなく、最後のSQL文が実行されてしまいます。

トランザクションを開始後に任意のDMLが失敗した場合は、 `psql`を終了させ、`psql` が終了した時点で (コミットしていないので)トランザクションをロールバックさせたいです。

## TL;DR

```
$ psql --set ON_ERROR_STOP=on -h db_host -U db_user -d database_name -p 5439 -f path/to/scripts.sql
```

## ON_ERROR_STOP オプション

psqlの `ON_ERROR_STOP` オプションを利用して、DMLでエラーが発生した場合に処理を中断させます。

> デフォルトではエラーの後もコマンド処理は続行されます。 この変数がonに設定されていると、代わりに即座に停止します。 対話モードではpsqlはコマンドプロンプトに戻ります。 これ以外ではpsqlは終了し、エラーコード1を返す致命的エラー条件と区別できるように、エラーコード3を返します。 どちらの場合でも、現在実行中のスクリプト（トップレベルのスクリプト、もしあれば関連性を持つ他のスクリプトすべて）は即座に終了します。 トップレベルのコマンド文字列が複数のSQLコマンドを含む場合、その時点のコマンドで処理は終了します。


### スクリプトファイル内で指定する方法

例えば、スクリプトファイルの先頭に `\set` コマンドで指定します。

```sql: load_data.sql
\set ON_ERROR_STOP

-- 更新するデータを準備
create temp table stage (like target); 

〜 以下同じ 〜
```

例えば、`target` テーブルに `insert into`で追加するSQL文で `staging`テーブルを `no_found_table` と誤った場合は下の様になります。

```
=> \i load_data.sql
CREATE TABLE
INSERT 0 2525484
BEGIN
DELETE 2525484
psql: load_data.sql:16: ERROR:  relation "no_found_table" does not exist
=>
```

`DELETE` したレコード数の次はSQL文のエラーで止まっています。

### psqlコマンドの引数に指定する方法

引数 `--set` で指定します。

```bash
$ psql --set ON_ERROR_STOP=on -h db_host -U db_user -d database_name -p 5439 
```

前述の [スクリプトファイル内で指定する方法](スクリプトファイル内で指定する方法) と同じ実行結果になります。

### ON_ERROR_STOP で失敗したことを検知したい。

対話モードでなければ、psqlの戻り値が `3` に設定されます。 `-f`オプションでスクリプトフィアルを指定するか、 標準入力から渡します。

```bash
$ cat load_data.sql | psql -h db_host -U db_user -d database_name -p 5439
CREATE TABLE
INSERT 0 2525484
BEGIN
DELETE 2525484
psql: load_data.sql:16: ERROR:  relation "no_found_table" does not exist
$ echo $?
```

`ON_ERROR_STOP`は下のいずれかの方法で指定します。

- スクリプトファイル内に `\set ON_ERROR_STOP` を記載する
- psqlに `-set ON_ERROR_STOP=on`オプションを指定する

psql終了後に `echo $?` を実行すると、戻り値が3であることを確認できます。
 
`BEGIN`で開始したトランザクションは、スクリプトがエラーになった時点でpsqlが終了し、その契機でロールバックが自動的に行われます。その結果 DELETEしたレコードがロールバックされてています。
オブジェクト指向の私見(暫定)

#概要
オブジェクト指向について私なりの考えを自分用にメモ書きしたものからですが、公開しておこうと思います。
何かの参考程度になれば。

#まとめ
- オブジェクト指向は、
オブジェクト指向プログラミング(Object Oriented Programming: OOP)の事。
プログラムを手順から「もの」に置き換えるイメージ。
プログラムを作る過程で、同じ処理を記述するのを回避する時に役立つ。

ざっくりと私見をまとめておきます。
あくまでも私個人の理解で書きますのであしからず。

#オブジェクト指向とは
まず、**オブジェクト指向に明確な説明はできない。**
本やネットの意見だって千差万別で、読めば読むほど理解できなくなる。
~~迷宮入り確定で眠くなる。~~
なので、**「オブジェクト指向」**という言葉があるな、程度の認識で最初はいいと思う。
実際の知識や概念の理解は経験してからでないとわからないのではないかと。
しかし、現場に出る時にそれではマズイという心配事がある人はクラス、インスタンス、メソッド等の用語だけは覚えるように心がければいい。

#どのような利点があるか
オブジェクト指向で必ず言われているのが、

1. チーム開発に向いている
2. 同じような処理を作りやすい
3. 作業効率を上げる

この３点ではないだろうか。

何故このような事が言えるのかは詳しく解説していかないとならないのですが、大まかに説明すると、**オブジェクト(つまり、「もの」)**と呼ばれるデータと処理の塊を、必要とするプログラムに読み込む事で、全体の処理を行う。
これがオブジェクト指向の根幹にあります。

- 例えば、オブジェクト内部の処理を行う過程で修正が発生した場合、オブジェクトの存在しているプログラムを修正するだけでよく、チームによる多人数開発でも、「この部分を修正しておいて」で済むのです。
- また、すでに存在するオブジェクトを複製して、手直しをすることで、同じような処理をいくつでも作る事ができる訳です。

以上が、オブジェクト指向のさわりになります。
オブジェクト、オブジェクトと書いてますが、正確にはオブジェクトという単語は考え方の説明に使うだけで、実際はクラスやメソッドやインスタンス**(これがオブジェクトの事です)**とかいろいろ用語もありますが、時間があれば書いていこうと思います。
Nuxt.jsでWeb Workerを使う

# やりたいこと
* Nuxt.jsなプロジェクトでWeb Workerを使いたい
* webpackのHMRに対応する

# Web Workerとは
[Web Workers API \- Web API インターフェイス \| MDN](https://developer.mozilla.org/ja/docs/Web/API/Web_Workers_API)

# Nuxt.jsでWeb Workerを使う
## nuxt.config.js
[worker-loader](https://github.com/webpack-contrib/worker-loader)を使います。

```js:nuxt.config.js
module.exports = {
  build: {
    extend: ({ module, output }) => {
      // rulesの先頭に追加
      module.rules.unshift({
        test: /\.worker\.js$/,
        loader: 'worker-loader'
      })

      // HMR時にWebWorkerでwindow is not definedになる問題対策
      output.globalObject = 'this'
    }
  }
}
```

worker-loaderの設定を`Array.push()`で`module.rules`の最後に追加すると、うまく動きませんでした。なので`Array.unshift()`で配列の先頭に追加しました。
vue-loaderとかbabel-loaderが先に処理してしまうからでしょうか。

また、webpackのHMRが有効になっていると(Nuxtではデフォルトで有効ですが)、Web Workerをimportした時に`window is not defined`と怒られます。webpackの`output.globalObject`を`this`に設定すると解決できます。
参考：[Webpack 4\.0\.1 \| WebWorker \`window is not defined\` · Issue \#6642 · webpack/webpack](https://github.com/webpack/webpack/issues/6642)

## assets/scripts/hoge.worker.js
動作確認として、受け取ったメッセージをコンソールに表示するだけのWorkerを作ります。

```js:hoge.worker.js
self.addEventListener('message', (message) => {
  console.log(message.data)
})
```

## components/Hoge.vue
```vue:Hoge.vue
<template>
  <h1>Hoge Component</h1>
</template>

<script>
import Worker from '~/assets/scripts/hoge.worker'

export default {
  mounted() {
    const worker = new Worker()
    worker.postMessage('hello worker')
  }
}
</script>
```

## pages/index.vue
サーバーサイドでは`window`オブジェクトがないので、Web Workerは使えません。
※[webworker-threads](https://github.com/audreyt/node-webworker-threads)とかいうのがあるらしいですが、未検証

なので、Web Workerを呼び出すコンポーネント自体を`no-ssr`コンポーネントでラップします。するとSSR時にはコンポーネントが呼び出されなくなるので、`window`がない！とか`Worker`がない！とか言われなくなります。

```vue:index.vue
<template>
  <no-ssr>
    <hoge-component />
  </no-ssr>
</template>

<script>
import HogeComponent from '~/components/Hoge.vue'

export default {
  components: {
    HogeComponent
  }
}
</script>
```

## yarn dev
`$ yarn dev`してブラウザで[localhost:3000](http://localhost:3000)にアクセスして、コンソールを見ると「hello worker」と表示されていると思います。


# 以上
無事にNuxt.jsでもマルチスレッドで処理できるようになりました。めでたい。