OmniAICreator/Qiita-1.07M huggingface dataset:
Grove - High Precision RTC




![Kobito.BBVQeb.png](https://qiita-image-store.s3.amazonaws.com/0/49910/b3fd0ac8-a279-fa8c-ec40-08b1e31dc75b.png "Kobito.BBVQeb.png")



[GROVE \- 高精度RTC \- スイッチサイエンス](https://www.switch-science.com/catalog/3134/)


[Grove \- High Precision RTC \- Seeed Wiki](http://wiki.seeed.cc/Grove_High_Precision_RTC/)


[Grove \- High Precision RTC \- Arduino \- Seeed Studio](https://www.seeedstudio.com/Grove-High-Precision-RTC-p-2741.html)
Grove > 温度・湿度センサー



![Kobito.YZu3cV.png](https://qiita-image-store.s3.amazonaws.com/0/49910/730a8438-4fcd-1cc0-6275-b3f997168357.png "Kobito.YZu3cV.png")


[Grove \- Temperature&Humidity Sensor \- Seeed Wiki](http://wiki.seeed.cc/Grove-TemperatureAndHumidity_Sensor/)






```

#define DHT11_PIN 0      // ADC0

byte read_dht11_dat()
{
    byte i = 0;
    byte result=0;
    for(i=0; i< 8; i++){

        while(!(PINC & _BV(DHT11_PIN)));  // wait for 50us
        delayMicroseconds(30);

        if(PINC & _BV(DHT11_PIN))
        result |=(1<<(7-i));
        while((PINC & _BV(DHT11_PIN)));  // wait '1' finish
    }
    return result;
}

void setup()
{
    DDRC |= _BV(DHT11_PIN);
    PORTC |= _BV(DHT11_PIN);

    Serial.begin(115200);
    Serial.println("Ready");
}

void loop()
{
    byte dht11_dat[5];
    byte dht11_in;
    byte i;
    // start condition
    // 1. pull-down i/o pin from 18ms
    PORTC &= ~_BV(DHT11_PIN);
    delay(18);
    PORTC |= _BV(DHT11_PIN);
    delayMicroseconds(40);

    DDRC &= ~_BV(DHT11_PIN);
    delayMicroseconds(40);

    dht11_in = PINC & _BV(DHT11_PIN);

    if(dht11_in){
        Serial.println("dht11 start condition 1 not met");
        return;
    }
    delayMicroseconds(80);

    dht11_in = PINC & _BV(DHT11_PIN);

    if(!dht11_in){
        Serial.println("dht11 start condition 2 not met");
        return;
    }
    delayMicroseconds(80);
    // now ready for data reception
    for (i=0; i<5; i++)
    dht11_dat[i] = read_dht11_dat();

    DDRC |= _BV(DHT11_PIN);
    PORTC |= _BV(DHT11_PIN);

    byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
    // check check_sum
    if(dht11_dat[4]!= dht11_check_sum)
    {
        Serial.println("DHT11 checksum error");
    }

    Serial.print("Current humdity = ");
    Serial.print(dht11_dat[0], DEC);
    Serial.print(".");
    Serial.print(dht11_dat[1], DEC);
    Serial.print("%  ");
    Serial.print("temperature = ");
    Serial.print(dht11_dat[2], DEC);
    Serial.print(".");
    Serial.print(dht11_dat[3], DEC);
    Serial.println("C  ");

    delay(2000);
}
```
HSPで『かえるのがっしょう』の輪唱

```text:
A『かえるのうたが』
A『きこえてくるよ』B『かえるのうたが』
A『クワ　クワ　クワ　クワ』B『きこえてくるよ』C『かえるのうたが』
A『ケケケケケケケケ』B『クワ　クワ　クワ　クワ』C『きこえてくるよ』
A『クワクワクワ』B『ケケケケケケケケ』C『クワ　クワ　クワ　クワ』
A『』B『クワクワクワ』C『ケケケケケケケケ』
B『』C『クワクワクワ』
C『』
```

せっかくHSPでコルーチンが使えるのでいいネタはないかなぁと思いついた題材。
なんともくだらないけど、コルーチンオブジェクトを複数独立させてそれっぽいプログラムができた。
HSPなら音源付きでも同じようなことできるかも。
コルーチンとかイテレータ的な性質をフルに生かせている気がして大変満足。

```cpp:
#runtime "hsp3cl"
#cmpopt varinit 1

#module __Caelin co,value,user
	#define yieId(%1="") value=%1: newlab co,1: return
	#modcfunc ceNextValue
		gosub co: return value
	#define global Caelin(%1,%2) dimtype %1,5 :newmod %1,__Caelin,%2

	#modinit str _user
		user=_user
		newlab co,1: return
		yieId user+"『かえるのうたが』"
		yieId user+"『きこえてくるよ』"
		yieId user+"『クワ　クワ　クワ　クワ』"
		yieId user+"『ケケケケケケケケ』"
		yieId user+"『クワクワクワ』"
		yieId user+"『』"
		value=""
	return
#global

#module Program
	#deffunc main
		Caelin usrA,"A"
		Caelin usrB,"B"
		Caelin usrC,"C"

		repeat 10
			lin=ceNextValue(usrA)
			if 1<=cnt: lin+=ceNextValue(usrB)
			if 2<=cnt: lin+=ceNextValue(usrC)
			mes lin
		loop
	return
#global
main
```
イテレータならforeach文で回したいなぁとも思うのでマクロでそれっぽいループ文を実装した。

```cpp:
#runtime "hsp3cl"
#cmpopt varinit 1

#module __Caelin co,value,user
	#define yieId(%1="") value=%1: newlab co,1: return
	#define endCo value=ceNull:return
	#modcfunc ceNextValue
		gosub co: return value
	#define global Caelin(%1,%2) dimtype %1,5 :newmod %1,__Caelin,%2

	#define global ceNull "__ceNull__"
	#define global ceForCaelin(%1,%2) %tceForeach Caelin %i,%2: ceForeach %1,%o
	#define global ceForeach(%1,%2) %tceForeach *%i: %1=ceNextValue(%2): if ceNull=%1:goto*%i
	#define global ceBreak %tceForeach goto*%p0
	#define global ceContinue %tceForeach goto*%p1
	#define global ceLoop %tceForeach goto*%p1: *%o%o0

	#modinit str _user
		user=_user
		newlab co,1: return
		yieId user+"『かえるのうたが』"
		yieId user+"『きこえてくるよ』"
		yieId user+"『クワ　クワ　クワ　クワ』"
		yieId user+"『ケケケケケケケケ』"
		yieId user+"『クワクワクワ』"
		yieId user+"『』"
	endCo
#global

#module Program
	#deffunc main
		Caelin usrA,"A"
		ceForeach v,usrA
			mes v
		ceLoop
		mes
		ceForCaelin v,"B"
			mes v
		ceLoop
	return
#global
main
```
RNNで文字のソートをする

# seq2seq sort

## 並び順がなくなった文字列から、文字のもとの文字列を復元

- seq2seqのタスクの一つであるソートを自然言語に拡張します

- キャラクタレベル（文字粒度）で順序情報を失ったベクトル情報に対してベクトルを入力として、元の文章を構築しようと試みます

　もともとの想定していたユースケースとしては、アイディアを出し合うようなブレインストーミングなどで、よく付箋などを使ってキーワードをポスイットなどで張って、それから最終的に言いたいことを構築するようなことを、よくやるのですが、そういったキーワード群を投入することで、自然に導きたい情報を帰結させることもできるなとか思いました。
 
 単語でやろうとすると入力次元が高次元になりすぎて、ネットワークサイズの限界にぶつかり、文字の並び替えのタスクを今回は与えてみます  

## 先行研究
- [ORDER MATTERS: SEQUENCE TO SEQUENCE FOR SETS](https://arxiv.org/pdf/1511.06391.pdf)

## 文字列を破壊してキャラクタ粒度のベクトル列から元の文字列の並びを復元する
- 東洋経済さんのオンラインコンテンツの記事タイトルを利用
- キャラクタ粒度で分解してBag of Wordsのようなベクトル表現に変換
- Encoderの入力を行いキャラクタをベクトル化して、Decoderで元の文字列の並びを予想

## ネットワーク
なんどか試してうまくいったモデルを使用したいと思います  

```python
enc = input_tensor
enc = Flatten()(enc)
enc = RepeatVector(30)(enc)
enc = GRU(256, dropout=0.15, recurrent_dropout=0.1, return_sequences=True)(enc)
enc = TimeDistribute(Dense(3000, activation='relu'))(enc)
enc = Dropout(0.25)(enc)

dec = Bidirect(GRU(512, dropout=0.30, recurrent_dropout=0.25, return_sequences=True))(enc)
dec = TimeDistribute(Dense(3000, activation='relu'))(dec)
dec = Dropout(0.5)(dec)
dec = TimeDistribute(Dense(3000, activation='relu'))(dec)
dec = Dropout(0.1)(dec)
decode  = TimeDistribute(Dense(3135, activation='softmax'))(dec)
```
<p align="center">
  <img width="550px" src="https://user-images.githubusercontent.com/4949982/35622900-dc2ad6ba-06cc-11e8-97a6-fad565818fc9.png">
</p>
<div align="center"> 図1. 作成したEncoder-Decoderのソートタスク </div>

## 前処理
**東洋経済さんのコンテンツをスクレイピング**  

```console
$ python3 12-scan.py
```

**スクレイピングしたhtml情報を解析してテキスト情報を取り出す**  

```console
$ python3 16-parse-html.py
```

**テキスト情報とベクトル情報のペアを作成**  

```console
$ python3 19-make_title_boc_pair.py 
```

**機械学習できる数字のベクトル情報に変換**  

```console
$ python3 23-make_vector.py 
```

## 学習
**学習を行う**  

（データサイズが巨大なので、128GByte程度のメインメモリが必要になります）  

```console
$ python3 24-train.py --train
...
```

categorical_crossentropyの損失が0.3程度に下がると、ある程度の予想が可能にまります  
GTX1060で三日程度必要でした  

## 評価

入力に用いた順番が崩された情報と、それらを入力に、並び替えてそれらしい文字のペアはこのようになります  

```console
入力 ['､', 'が', 'ル', 'ダ', '子', 'を', '日', '銀', '本', '団', '上', 'メ', '男', '定', '体', '以', '確', '球', '卓']
出力 卓球男子団体､日本が銀メダ以以上を確定<EOS>

入力 ['は', 'い', 'リ', 'た', 'ャ', 'ル', '界', 'し', 'に', 'て', '戦', '由', '表', 'シ', '挑', '自', '限', '現']
出力 シャルリは表現の自由の限界に挑戦していた<EOS>

入力 ['｢', 'は', '｣', 'た', '国', 'と', 'に', 'る', '消', 'え', '攻', '米', '北', '朝', '鮮', '先', 'よ', '撃', '制', '藻', '屑']
出力 米国による｢北朝鮮先制攻撃｣は藻屑と消えた<EOS>

入力 ['､', 'が', '国', '世', '界', '子', '主', '沸', '騰', 'す', '部', 'る', 'マ', 'ス', '業', '中', '品', '電', '救', 'ホ']
出力 中国スマホが救世主､沸騰する電子部品業界<EOS>
```

## コード
[GitHubにございます](https://github.com/GINK03/keras-seq2seq-sort)ので、確認してください

## 終わりに

最初、単語粒度のベクトルを入力に文字列の復元をやっていたんですが、入力があまりにも高次元になってしまったこと、コンピュータリソース的に学習が難しいという背景がございました  

そのため、何度か手法を整理したのですが、キャラクタ粒度は学習が簡単な反面、あまり面白くないです  

RNNで最大の課題だなと感じるのが、オンメモリで入力用の密行列を保持するのが難しいことです。メモリの量が有限なので、なんらかの方法で安定化させる方法が求めらていますが、なんかうまい方法ないでしょうかね。
`vagrant up` しても "呼び出し先 RC:  E_FAIL (0x80004005)" でマシンの起動ができない時の、原因と対処法

## 環境

* Oracle VirtualBox 5.2.6 r120293
* Vagrant 2.0.1

## `vagrant up` すると、 "Code E_FAIL (0x80004005)" ってなる

```cmd
C:\Users\ndxbn\vagrantfile>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'laravel/homestead' is up to date...
==> default: A newer version of the box 'laravel/homestead' is available! You currently
==> default: have version '4.0.0'. The latest is version '5.0.1'. Run
==> default: `vagrant box update` to update.
==> default: Clearing any previously set forwarded ports...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["modifyvm", "732261da-6e5f-4d2c-b776-2d8853c51d78", "--natpf1", "delete", "ssh", "--natpf1", "delete", "tcp27017", "--natpf1", "delete", "tcp33060", "--natpf1", "delete", "tcp44300", "--natpf1", "delete", "tcp54320", "--natpf1", "delete", "tcp8000", "--natpf1", "delete", "tcp8025"]

Stderr: VBoxManage.exe: error: Code E_FAIL (0x80004005) - Unspecified error (extended info not available)
VBoxManage.exe: error: Context: "LockMachine(a->session, LockType_Write)" at line 523 of file VBoxManageModifyVM.cpp
```

`vagrant status` やっても、`default poweroff (virtualbox)` と言われるはず。

VirutalBox マネージャー でみても、「電源オフ」になってると思います。

## 原因と対処法

たぶん、**管理者権限で同じ名前のマシンが起動されている状態** だと思います。

`cmd.exe` を管理者として実行し、 `vagrant global-status` とかやると、同じ名前のやつが動いているのが見えると思います。
Windows10 Fall Creators Updateで起動時に勝手にブラウザが開く対策

Windows 10 Fall Creators Updateから、シャットダウン時に起動していたブラウザなどの一部のアプリケーションが、起動時に立ち上がるようになりました。

MSからすると便利になったでしょ？的な変更でしょうが、個人的には余計なことをしないでほしいです。（完全なシャットダウンは [Shift]キーを押しながらやってねとか言いますし。。。）

下記をバッチファイルに書いて、ダブルクリックするとウインドウが開いて、そちらからシャットダウンすると次回起動時に立ち上がりません。（本当は、レジストリいじるとか、設定で変えられるとかしてくれると嬉しいのですが。。）

```dosbatch:shutdown.bat
mshta.exe vbscript:close(CreateObject("Shell.Application").ShutdownWindows)
```

マウスでやる場合、スタートボタンからやるより、1手減るので割りとイイなぁと思ったりもします。あと、管理権限とかバッチファイルに付けなくても動くので、シャットダウンコマンドよりも良いかなぁと思います。
redashにprometheusのdatasourceを追加する

## 概要
デフォルトではredashにprometheusのデータソースが見つからなかったので追加しました。

### 環境情報
- Docker  17.05.0-ce
- docker-compose 1.18.0
- redash 4.0.0

### 設定
- docker-compose.ymlのenvironmentに以下を追加して起動するだけです。

```yaml
REDASH_ADDITIONAL_QUERY_RUNNERS: redash.query_runner.prometheus
```

- DockerFileの場合はENVに追加します

```dockerfile
ENV REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.prometheus
```

- 環境変数なので.envにexport書いてもOKだと思います
RoRでちょー速いJSONシリアライズ

以下はNetflixが公開した、[Fast JSON API serialization with Ruby on Rails](https://medium.com/netflix-techblog/fast-json-api-serialization-with-ruby-on-rails-7c06578ad17f)の日本語訳です。
私はRubyはRuby Associationシルバーを持ってる程度で、RoRはまともに使ったことがなくて知識皆無なので、誤りがある可能性が大です。


# Fast JSON API serialization with Ruby on Rails

著：[Shishir Kakaraddi](https://www.linkedin.com/in/shishirmk/)・[Srinivas Raghunathan](https://www.linkedin.com/in/srinivas-raghunathan-03a5b313a/)・[Adam Gross](https://www.linkedin.com/in/grossadamm/)・[Ryan Johnston](https://www.linkedin.com/in/ryan-johnston-89615826/)

RoRアプリケーション向けの、超絶速い[Fast JSON API](https://github.com/Netflix/fast_jsonapi)のgemを公開しました。

## Introduction

Fast JSON APIは、Active Model Serializer(AMS)が提供している主な機能を提供しつつ、パフォーマンスの改善を目的に開発されました。
このgemは、[パフォーマンステスト](https://github.com/Netflix/fast_jsonapi/blob/master/spec/lib/object_serializer_performance_spec.rb)のベンチマークにおいてAMSより25倍高速に動作しました。

AMSは偉大なgemであり、[Fast JSON API](https://github.com/Netflix/fast_jsonapi)も、その構文や機能はAMSに深い影響を受けています。
しかし、AMSはモデルにひとつ以上のリレーションがあると動作が遅くなってしまいます。
[Compound Documents](http://jsonapi.org/format/#document-compound-documents)が存在するとAMSはさらに遅く、目に見えるほどの影響が現れてきます。

## Why optimize serialization?

JSONのシリアライズは、しばしばRoRのAPIの実装の中で最も動作が遅いところのひとつです。
ならば、AMSが提供しているものと同等の機能を提供しつつ、速度を上げていかない理由はありません。

## Features

・Active Model Serializerに似た構文
・belongs_to、has_many、has_oneをサポート
・Compound Documentsをサポート
・Compound Documentsのシリアライズを最適化
・キャッシュ機能
・Skylightによるパフォーマンス測定(オプション)

## How do you write a serializer using Fast JSONAPI?

Fast JSONAPIはどうやって使えばいい？
みんなが使い慣れているであろうActive Model Serializersに近い使い方ができます。
fast_jsonapiの宣言はAMSに似ています。

```ruby
class MovieSerializer
  include FastJsonapi::ObjectSerializer
  attributes :name, :year
  has_many :actors
  belongs_to :owner, record_type: :user
  belongs_to :movie_type
end
```

## How fast is it compared to Active Model Serializers?

どれだけ速くなった？
パフォーマンステストではAMSより25から40倍以上高速に動作しました。
さらに、複雑なモデルにおいてもシリアライズにかかる時間は無視できる程度になりました。
シリアライズするレコードの数が増加すると、パフォーマンスはさらに向上します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/26088/351fd083-210e-1c96-e64b-89f4769693a0.png" width="60%">
<img src="https://qiita-image-store.s3.amazonaws.com/0/26088/63286fab-6b87-29e5-163a-4ce73b37769b.png" width="80%">

信じられませんか？
自分でベンチマークを実行することもできます。
[Readme](https://github.com/Netflix/fast_jsonapi/blob/master/README.md)を参照してください。

## Dependency

JSON APIは[anti-bikeshedding](http://bikeshed.org/)なツールです。

## Future Work

今後は、さらに多くの機能を追加する予定です。
提案、改善、修正、追加テストを歓迎します。


# 感想

[json_encode](http://php.net/manual/ja/function.json-encode.php)最高。

anti-bikesheddingの意味がよくわからなかった。
依存なんてどうでもいいことを気にするんな、とかそういうこと？
RedmineのWiki記法をマークダウン記法に変換するツール

## 概要

RedmineのWikiを他のマークダウン記法のサイトに移行しようとしたところ、適当なサービスがなかったので、自分で作ってみました。

## サービスURL

https://yukifujisawa.github.io/redmine-docbase-convertor/

## GitHub

以下、GitHubにソースは公開しているので、機能不足があればプルリクだしていただけれると助かります。

https://github.com/YukiFujisawa/redmine-docbase-convertor
新米エンジニアが、実装時にエラーが出たり、実装通りに動かないなと思ったらやるべきこと

新卒として入社して10ヶ月ほどが経ちました。
日々業務で開発をしていく中で、つまずくことやわからないことも多々あります。

どうやってそれを乗り越えてきたか、色々な解決策が出てきたのでまとめてみました！

#エラーログを見る
画面やログにエラーが書かれているのなら、それを見るのが一番早い解決策だなと思います。
SQLエラーでそんなカラムないからデータが出せないよ〜とか、オブジェクトを配列として扱ってるよ〜とかフレームワークや言語が言ってくれたりします。

#ググる
エラーログに書かれていることがわからなければ、そのエラーをググります。Stack Overflowや個人ブログに解決方法を載せてくれている人がたくさんいます。

#リファレンスを読む
使っている言語やフレームワークに疑問を感じたり、仕様が曖昧な場合は、公式のリファレンスを読むのが一番正しいことを教えてくれます。筆者は個人ブログを参考にしたら、ライブラリのパラメータが古いバージョンのものだったなどありました。

#レスポンスがどのステータスで返ってきてるか見る
![スクリーンショット 2018-01-30 20.03.54.png](https://qiita-image-store.s3.amazonaws.com/0/97496/384cdce8-c475-92ae-fb1b-6b814e51f308.png)

Web開発の基本CRUDは、成功すればレスポンスを返してくれます。（200なら成功など）
そもそもその処理が成功しているか、成功していなければ通信の段階で何か不具合があるかどうかのいい目安になります。

#Chromeのコンソールログを見る
<img width="485" alt="スクリーンショット 2018-01-30 19.57.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/97496/60cfb019-1afb-87cc-3c14-401b5d023007.png">
実装にJavaScriptを使っていたりする場合は、JavaScriptにエラーがあれば、Consoleに書いてくれているので、エラー部分がわかりやすくなっています。

#デバッグ機能を使う
<img width="639" alt="スクリーンショット 2018-01-30 19.58.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/97496/f4d85119-0b0f-c88c-5e51-6b3bd41f37d4.png">
IDEを使っている場合などは簡単にデバッグツールが使えます。どの変数にどんな値が入っていたり、どこで処理が落ちているのかも一目瞭然です。

#タイポ（打ち間違い）がないか確認する
意外とおかしいなーって時によくあるのがタイポ。一番つらい。

#変数や配列の中身を出力する
変数に値が入っていなかった、配列の中身がおかしかったなど、ログやデバッグツールを使って出力すると初心者はわかりやすいと思います。

#段階に分けて考える
例えば、掲示板アプリを作っていて、何か投稿してフロントに表示される機能を作っているとしましょう。

もし最終的な動作である投稿したものが表示されないとなっても、それがどこでつまずいているのかわからなかったりします。
なので段階に分けて考えてみましょう。（本当は段階で作るべき）

1.入力（POST）
2.SQLでデータベースに登録
3.SQLでSELECTして
4.フロントに表示

例えば2で失敗して入れば、データベースに登録の段階で失敗していた（SQLが間違ってた）といった、間違っている箇所がわかりやすくなります。

#同じような処理が書いてあるところを確認する
あんまりやってほしくはないけれど、大規模なサービスになると、同じような処理をしているところが多数あったりします。そういうところを参考にするのもいいと思います。（理解してないのにコピーして貼り付けるのは避けたいところです。）

#先輩エンジニアに聞く
上記までやってもう無理だと思ったら先輩エンジニアに聞きます。
ロジックがわからない、どう処理を組み立てていいかわからないという場合は、
最初にアドバイスをもらった方が実装がスムーズにいくかもです。

#まとめ
新米エンジニアは色々駆使して頑張っていきたいところです！
日付処理 を行うときの注意事項

# 日付処理を行うときの注意事項

dateコマンドを例としています。言語によって動作が変わりますが、深く考えず組んでしまうとバグの要因になるので、日付周りはきちんとチェックしましょう という意味を込めて

## 「前月の月」を取得する時の罠

例えば「5月31日」に前月の月を取得すると「5月」となってしまう問題。

`$ date +%m -d "20180531 1 month ago"
05`

先に解決策を言ってしまうと、「当月01日」に日付を変換してから1ヶ月前を取得するとよい。

では、なぜこのようになってしまうのか
それは「1ヶ月前 は何日前か？」 を考えると分りやすい。

例えば..
3月1日の1ヶ月前は、2月1日。この場合は28日前(閏年なら29日)
5月1日の1ヶ月前は、4月1日。この場合は30日前

つまり、当日から前月の日数を引いた日が1ヶ月前となる。

では、最初の例で言うと

5月30日の1ヶ月前は、4月30日
5月31日の1ヶ月前は、5月01日

となる。

3月でいうと、
3月28日の１ヶ月前は、2月28日
3月29日の１ヶ月前は、3月01日
3月30日の１ヶ月前は、3月02日
3月31日の１ヶ月前は、3月03日
※閏年以外

##  先週の特定曜日を取得する時の罠

例えば「月曜日の00:00:00から日曜日の23:59:59までを週別データとする」という仕様が有った場合、基準日となる月曜日を 「date "last monday"」と安易に指定すると、当日が月曜日だった場合に、「date "last monday"」が示す月曜日が、当日ではなく先週の月曜日となってしまいバグとなる問題

解決作は、当週の曜日を取得し -7日する
`date -d "mon 7 days ago" +%Y%m%d`
Vivado HLSでの浮動小数点演算のシミュレーションやってみたらなんか変だった

#概要
Vivado HLSで浮動小数点演算回路を作りたくてシミュレーションをやってたんですが、
普通にシミュレーションすると上手く行かなかったんでそこんところ軽くメモ程度に
残しておきます。

似たようなところで躓いた人とか居るかもしれませんし…。

環境によっては動作するといったご報告いただいたので正常に動作しなかった手元の環境を以下に示しておきます。
Ryzen7 1700X　　　(Windows10 pro): Vivado HLS 2017.4
i7-4770S　　(Windows7 professional): Vivado HLS 2017.4 および 2016.4

もし他に正常に動作する環境があればご報告頂ければと思います。

#通常のCによるシミュレーションと実行コード
先に言っておくと普通にシミュレーションすると正常な結果が出ませんでした。
流れだけコードと一緒に書いておきます。

calcflp.c(単純なfloat型で計算をする関数を書いたもの)を用意
　　↓
calcflp_tb.c(テストベンチ)を用意
　　↓
コンパイルして動作確認
　　↓
＞失敗＜

```ruby:calcflp.c 
float calcflp(float a, float b)
{
	float c = a * b;

	return c;
}
```
```ruby:calcflp_tb.c 
#include <stdio.h>

int main()
{

	const float n = 30.0, p = 4.0;
	float a = 5.0;
	printf("default: %f \n", a);
	a = calcflp(n, p);
	printf("1 print: %f \n", a);

	a = calcflp(25.0, 3.0);
	printf("2 print: %f \n", a);
	return 0;
}
```

Run C Simulationの結果はこんな感じ

```
・
・
・
INFO: [APCC 202-1] APCC is done.
   Generating csim.exe
default: 5.000000 
1 print: 0.000000 
2 print: 0.000000 
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************
```
1 printと2 printで120.0と75.0が出ていなければいけないはずが、
2つとも0になっています。
#C/RTLでのシミュレーション
対してC/RTLシミュレーションだと上手く行きます。
コードは上のものをそのまま使います。

結果は以下の通り

```
INFO: [APCC 202-1] APCC is done.
   Generating cosim.tv.exe
INFO: [COSIM 212-302] Starting C TB testing ... 
default: 5.000000 
1 print: 120.000000 
2 print: 75.000000 
INFO: [COSIM 212-333] Generating C post check test bench ...
・
・
・
```
正常に125.0と75.0と出力されていますね。
#ざっくりまとめ
普通のCシミュレーションでは、正常な結果が得られませんでしたが
C/RTLシミュレーション試したら上手く数値が出ました。

なぜこのような仕様になっているのかわからないですが(バグなのかも？)
とりあえずこちらで暫くはどうにかシミュレーションできそうです。
ag-Grid：チェックした行にカラーをつける

[ag-Gridの公式サイト](https://www.ag-grid.com/javascript-grid-selection/)のサンプルで実装されています。

<img width="517" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/d707052e-ea71-7c7c-9a20-616e1570bbf3.png">


この色付けが無いと、次の処理する前に「本当に正しい行をチェックしたかな？」って確認したくなった時、該当行を探すのが面倒くさいかなあと思いました。

公式サイトのコードを読みましたがどのソースが該当するのか分からず、、、

```
import { Component, ViewChild } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import "ag-grid-enterprise";

@Component({
  selector: "my-app",
  template: `<ag-grid-angular
    #agGrid
    style="width: 100%; height: 100%;"
    id="myGrid"
    class="ag-theme-fresh"
    [columnDefs]="columnDefs"
    [rowSelection]="rowSelection"
    [groupSelectsChildren]="true"
    [suppressRowClickSelection]="true"
    [autoGroupColumnDef]="autoGroupColumnDef"
    (gridReady)="onGridReady($event)"
    ></ag-grid-angular>`
})
export class AppComponent {
  private gridApi;
  private gridColumnApi;

  private columnDefs;
  private rowSelection;
  private autoGroupColumnDef;

  constructor(private http: HttpClient) {
    this.columnDefs = [
      {
        headerName: "Gold",
        field: "gold",
        width: 100,
        aggFunc: "sum"
      },
      {
        headerName: "Silver",
        field: "silver",
        width: 100,
        aggFunc: "sum"
      },
     //カラムなので省略
    ];
    this.rowSelection = "multiple";
    this.autoGroupColumnDef = {
      headerName: "Athlete",
      field: "athlete",
      width: 200,
      cellRenderer: "agGroupCellRenderer",
      cellRendererParams: { checkbox: true }
    };
  }

  onGridReady(params) {
    this.gridApi = params.api;
    this.gridColumnApi = params.columnApi;

    this.http
      .get("https://raw.githubusercontent.com/ag-grid/ag-grid-docs/master/src/olympicWinnersSmall.json")
      .subscribe(data => {
        params.api.setRowData(data);
      });
  }
}
```

困った時のStockOverFlowです。
Reply見る限り、一行加えるだけ、とてもシンプル！

<img width="289" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/7968f155-8afe-72fa-c965-ee0de6954b0c.png">


CSSに追加するだけでした。

```
ag-row-selected{
 background: red;
 color: white;
}
```
先頭に` . `はいらないと思いますが、、、、` .ag-row-selected{ ` 
ばっちり実装出来ました。

<img width="735" alt="grid_Checkbox_coloring20180124.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/fcb66f27-2e8c-e811-17f5-df3cde05b29a.png">

シンプルですが使いやすくなりましたね！
困った時のStockOverFlowですね、、、、、
20180201勉強まとめ

・`WebDAV`
>Web-based Distributed Authoring and Versioning

>Webサーバ上のファイル管理を目的とした分散ファイルシステムを実現するプロトコル

>Webサーバに対して直接ファイルのコピーや削除を行ったり、ファイル所有者や更新日時などのファイル情報を取得・設定するといった機能を持つ分散ファイルシステムで、HTTP 1.1を拡張したプロトコルで実現される
参考URL：https://ja.wikipedia.org/wiki/WebDAV

・`FTP`
>FTPクライアントを用いてサーバーへ接続することで、ファイルのアップロード・ダウンロード、またファイルの削除やディレクトリ作成などの操作が行えます

>- FTPクライアント不要で直感的に管理できる

>FTPでファイルを送受信するには、FFFTP／FileZilla／WinSCPなどのFTPクライアント（FTPソフト）をまずパソコンにインストールしておかなければなりません。
>WebDAVでは、Windowsのエクスプローラー（MacであればFinder）でWebDAVのパスを入力すると、エクスプローラー内にサーバー上のファイルを表示させることができます。

>- FTPのポートが塞がれている環境でも使える
FTPではこれは20番と21番
WebDAVでの通信は、ftpではなくhttp/https（ポート番号は80番/443番）、つまり普段ウェブサイトを閲覧するのに使うのと同じ手段

>- サーバー上のファイルを直接編集できる
FTPの場合、サーバー上のファイルを編集したいと思ったら、まずいったんそのファイルをダウンロードする必要があります。その上で自分のパソコンでファイルの内容を修正して、あらためてアップロード、そして既存ファイルに上書きするという手順
WebDAVではサーバー上のファイルを直接編集できます。つまりファイルをダウンロード・アップロードという手間が必要ありません。ダブルクリックでファイルを開いて修正して上書き保存、で作業が完結

>- アクセス権限の設定がしにくい
各FTPアカウントごとにどのディレクトリまでならアクセスできるかを個別に指定できることも一般的

>- FTPと比べると不安定
WebDAVはFTPに比べると通信がやや不安定になることがある

参考URL：https://serverkurabe.com/about-webdav/
Aurora(MySQL互換)のrand()の性能を調べてみた

16万＋無視できる程度に少ない件数のテーブルから、以下のSQLで10回抽出してみます。

```sql
SELECT * FROM HOGE WHERE rand() < 0.0001
```

16を中心とする二項分布に近い分布になるはずですが、どうでしょうか？10回試してみます。

```py3
12,19,15,12,22,18,12,17,12,14
```
うーん、12が4回出てますね！
12以下が出る累積確率が、0.1931083159らしいので、12以下が4回以上出る確率は0.1090497706ぐらいみたいです。

もう1回やってみましょう。

```py3
12,14,17,23,20,9,12,11,18,19
```

すごいあたりを引いている！
…とも思えないですし、12がやたら多いですね。

もう十回ほど試してみたら、9の他、7とか10とかも出るので、ちょっとばらつきやすいような気がします…なんでだろう
もし詳しい方がいたら、教えてください！
次世代の3Dデータフォーマット決定版 glTF 2.0 の概要図を日本語訳してみた

# 概要

Khronos Group から提唱された、新しい3Dデータフォーマットである glTF™ (GL Transmission Format) は次世代の3Dデータフォーマットの決定版として期待されています。
詳しくは、以下のリポジトリでの説明を御覧ください。
https://github.com/KhronosGroup/glTF
上記リポジトリの Quick start 部に素敵な glTF2.0 概要図がありました。
本概要図を気に入ったため、概要図の日本語訳バージョンを作成しました。
翻訳にあたり、概要図の製作者 Marco Hutter 様と Khronos Group 様から直接許可をいただいています。
以下のリポジトリにて、png pdf svg バージョンを公開しています。
https://github.com/randall2835/gltfOverviewJapanese/releases/tag/v0.1

![alt](https://i.imgur.com/2chSlPB.jpg)

日本語でのフィードバックは本コメント欄もしくは、図中にある翻訳者のメールアドレスに送ってください。
よろしくお願いいたします。
pandasのDataFrameでargmaxの集計をしたい時

pandasのDataFrameを使って、argmaxを集計したいとき、どのようにすれば良いか。

これを1発でやる関数がpandasには備わっています。それは、idxmax関数です。

### 例
例えば、以下のようなデータで、各列について、最大値をとるindex番号が欲しいとする。

|   | 0  | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  | 9  |
|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
| 0  | 0.189460  | 0.086207  | 0.203066  | 0.208812  | 0.259933  | 0.185123  | 0.158537  | 0.200099  | 0.149425  | 0.138298  | 0.185732  | 0.203560  | 0.191906  | 0.199288  | 0.205338  | 0.203721  | 0.203377  | 0.158458  | 0.293388  | 0.244068 |
| 1  | 0.209651  | 0.256466  | 0.238045  | 0.132184  | 0.134794  | 0.230882  | 0.208426  | 0.211899  | 0.272578  | 0.328267  | 0.138991  | 0.171301  | 0.216710  | 0.192171  | 0.217290  | 0.176644  | 0.199074  | 0.235546  | 0.107438  | 0.144068 |
| 2  | 0.196588  | 0.153017  | 0.171099  | 0.270115  | 0.205347  | 0.157334  | 0.216741  | 0.185818  | 0.182266  | 0.177812  | 0.242312  | 0.299221  | 0.147520  | 0.277580  | 0.152408  | 0.216799  | 0.199033  | 0.244111  | 0.260331  | 0.223729 |
| 3  | 0.215362  | 0.321121  | 0.190227  | 0.195402  | 0.157817  | 0.177183  | 0.161308  | 0.219288  | 0.177340  | 0.200608  | 0.234932  | 0.157953  | 0.255875  | 0.256228  | 0.235622  | 0.185117  | 0.198436  | 0.231263  | 0.185950  | 0.210169 |
| 4  | 0.188939  | 0.183190  | 0.197563  | 0.193487  | 0.242109  | 0.249478  | 0.254989  | 0.182896  | 0.218391  | 0.155015  | 0.198032  | 0.167964  | 0.187990  | 0.074733  | 0.189342  | 0.217720  | 0.200080  | 0.130621  | 0.152893  | 0.177966 |

これは以下のようにすれば、一発！

```
>> df = pd.DataFrame('hogehoge')
>> df.idxmax()
```

すると、以下のような結果になります。

```
0     3
1     3
2     1
3     2
4     0
5     4
6     4
7     3
8     1
9     1
dtype: int64
```

ちなみに返り値のデータ型は、Seiresです。

```
>> type(df.idxmax())
<class 'pandas.core.series.Series'>
```

### 参考
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.idxmax.html
WP-Paginateのprev、nextのaタグ内にHTMLタグを挿入する

WordPressでページネーションを実装する際、概ねプラグインを使って実装しますね。

僕は[WP-Pagiante](http://wordpress.org/plugins/wp-paginate/)というものを常用しており、このプラグインは設定画面からPrevボタン、Nextボタンに任意のテキストを設定できます。
ただひとつ難点なのが、HTMLタグをそのテキストフィールドに設定することがプラグインの仕様上できないのです。セキュリティ面など考慮すると妥当な仕様だとも考えられますが、しかしこれでは不便です。

リッチなWebサイトのページネーションのprev、nextボタンにはsvgや画像が用いられていることが多いですが、それをこのプラグインは設定画面だけではこのimg、ｓｖgを使ったページネーションが実現出来ないのです。

## 解決策
これを解決するには独自のラッパー関数を用意します。
通常 `wp_paginate()`を単純に呼び出すと、ページネーションが表示されますが、同じような感覚で呼び出せるように、 `my_paginate` などの関数を用意しましょう。

その中で `wp_paginate`の実行結果をバッファリングし、任意のテキストとHTMLタグとをreplaceすることで、HTMLタグの挿入に成功しました。 

```php
/**
 * prev, nextをカスタマイズしたページネーションを出力する.
 */
function my_paginate() {
  if (function_exists('wp_paginate')) {
    ob_start();

    wp_paginate();

    $out = ob_get_clean();

    $out = str_replace('__prev__', '<img src="/assets/images/prev.png" alt="">', $out);
    $out = str_replace('__next__', '<img src="/assets/images/next.png" alt="">', $out);

    echo $out;
  }
}
```

この関数を作成した上で、 `WP-Paginate`の設定画面で、 `Previous Page`に `__prev__` 、 `Next Page` に `__next__` と入力すると、 `my_paginate` の実行時にreplaceの処理が行われます。


## 〆
プラグインの処理はechoで出力されるものが多く、実行結果を変数に代入してゴニョゴニョ、、、という事が出来ない事も多いですが、このようにPHPのバッファリングを使えばゴニョゴニョを実現できるようになります。
度の過ぎた魔改造は考えものですが、節度をもって使えばプラグインをより便利に扱えるようになるのではないでしょうか。
【MySQL】date型とtime型に分けられたカラムを結合する方法

【MySQL】date型とtime型に分けられたカラムを結合する方法

## 構文
```
DATE_ADD(date,INTERVAL expr unit)
```
## SQL文(サンプル)
```
SELECT 
date_add(CAST([TRANSACTIONDATE] AS DATETIME), INTERVAL [TRANSACTIONTIME] HOUR_SECOND)
FROM table;
```

## 手順(考え方)
1 date型で定義されたカラムをdatetime型に変換する (2018-01-11 -> 2018-01-11 00:00:00)
1 datetime型に変換したカラム値に、time型のカラムの値を加算する (date_add関数)

## unit 値ごとに要求される形式の expr 引数
※ `expr` = 文字列 `unit` = 式を解釈する際の単位を示すキーワード

|unit値             | 要求される expr 書式                        |
|:------------------|:------------------------------------------|
|MICROSECOND        | MICROSECONDS                              |
|SECOND             | SECONDS                                   |
|MINUTE             | MINUTES                                   |
|HOUR               | HOURS                                     |
|DAY                | DAYS                                      |
|WEEK               | WEEKS                                     |
|MONTH              | MONTHS                                    |
|QUARTER            | QUARTERS                                  |
|YEAR               | YEARS                                     |
|SECOND_MICROSECOND | 'SECONDS.MICROSECONDS'                    |
|MINUTE_MICROSECOND | 'MINUTES:SECONDS.MICROSECONDS'            |
|MINUTE_SECOND      | 'MINUTES:SECONDS'                         |
|HOUR_MICROSECOND   | 'HOURS:MINUTES:SECONDS.MICROSECONDS'      |
|HOUR_SECOND        | 'HOURS:MINUTES:SECONDS'                   |
|HOUR_MINUTE        | 'HOURS:MINUTES'                           |
|DAY_MICROSECOND    | 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS' |
|DAY_SECOND         | 'DAYS HOURS:MINUTES:SECONDS'              |
|DAY_MINUTE         | 'DAYS HOURS:MINUTES'                      |
|DAY_HOUR           | 'DAYS HOURS'                              |
|YEAR_MONTH         | 'YEARS-MONTHS'                            |
Amazon LinuxにDockerをインストールする方法

```
sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo usermod -a -G docker ec2-user
```

これだけ。簡単。

[AWS Documents - Docker の基本](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html)
Cの関数ポインタを取るところにC++のラムダ式を使いたい

## 概要
共有ライブラリやフレームワークなどの関数で、コールバック関数を引数に渡すものがあります。
呼ぶ場所によって処理を変えたい場合、コールバック関数を変えれば良いのですが、その個数が多いときはC++のラムダ式が使えれば便利です。
共通で使えるラムダ式を実行するだけのコールバック関数を用意すれば、ラムダ式で呼ぶところによって処理を変えられるようになります。

## コード例
```C++
#include <iostream>
#include <thread>
#include <chrono>
#include <functional>

// 直接ラムダ式を引数に取る関数
void doSomething(std::function<void(int error)> completion) {
    std::cout << "doSomething" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    completion(0);
}

// 関数ポインタを引数に取る関数
void doSomething2(void (*completion)(int error, void* userContext), void* userContext) {
    std::cout << "doSomething2" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    completion(0, userContext);
}

// ラムダ式を実行するためのコールバック関数
void callLambda(int error, void* userContext) {
    auto completion = static_cast<std::function<void(int)>*>(userContext);
    (*completion)(error);
    delete completion;
}

int main(int argc, const char * argv[]) {
    // 直接ラムダ式でコールバック処理を指定する
    doSomething([](int error) {
        std::cout << "Completed, errorCode=" << error << std::endl;
    });
    
    // コールバック関数で間接的にラムダ式を実行する
    doSomething2(callLambda, new std::function<void(int)>([](int error) {
        std::cout << "Completed, errorCode=" << error << std::endl;
    }));
    
    return 0;
}
```

## まとめ
面倒ですが、C++のメソッドを呼びたいときや、Objective-Cのメソッドを呼ぶときにも使えます。
同じプログラム内であれば、直接ラムダ式を引数に取った方が手軽ですね。

共有ライブラリのときも、直接引数にラムダ式を取ることも可能ですが、共有ライブラリとライブラリ利用側の開発環境のバージョンが異なっていると、安全ではなくなるので、関数ポインタを使った間接的な呼び出しにしておいた方が安全です。

`callLambda()`の中で関数オブジェクトを解放してしまうので、プログレス処理のコールバックのようなところでは、解放するタイミングと解放しないタイミングを伝える事が出来るようなコードにしておく必要があります。
1枚のjsを開発することになったのでメモ

## オーダー

* ある1つのページだけで動作するjsを実装して欲しい
    * (あるページはjspで作成している)
* IE11必須、Chrome最新版必須
* 仮実装がcallbackを多用しているので、Promise中心にして欲しい
* 今風にして欲しい
* 好き勝手作っていい

## 今までのjavascriptの知識

* jQueryでDOM操作マン

## 最終的に採用した技術

なるべく現時点で最新ぽい状況にしたかった。

* node.js, nvm, npm
* ES6
* babel(7)
* webpack
* polyfill( @babel/polyfill )

## ハマったところ

* babelとES6だけで行けると思ってたけど、ブラウザで動作させるための変換が必要だった。
    * → browserifyを利用した。
* babel7とbabelify/browserifyの組合せがうまくいかず
    * → webpackにした
    * この辺は、web上でいろんなバージョンのことを語っていたのでその組合せを雑に進めていったのがよくなかった。
* babel-cli, babelify, browserifyそれぞれの役割の把握がわかりにくかった。
    * → 把握を頑張った。

## 設定系

```package.json
{
  "scripts": {
    "build": "webpack --devtool=eval-source-map",
    "build-prd": "webpack"
  },
  "devDependencies": {
    "@babel/core": "^7.0.0-beta.39",
    "@babel/polyfill": "^7.0.0-beta.39",
    "@babel/preset-env": "^7.0.0-beta.39",
    "babel-loader": "^8.0.0-beta.0",
    "webpack": "^3.10.0",
    "whatwg-fetch": "^2.0.3"
  }
}
```

```webpack.config.js
const path = require('path');

module.exports = {
  entry: ['@babel/polyfill', './src/app.js'],
  output: {
    path: path.resolve(__dirname, 'public/js'),
    filename: 'bundle.js',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets:
            ["@babel/preset-env"]
        }
      }
    ]
  }
}
```
Capistrano のデプロイ先から Git リポジトリを復元する

## 状況

消失したリポジトリを復元し、新しいホスティング先へ git-push したい。

- Git リポジトリが消失し、ローカルにはソースファイルすらない
- 残っているファイルは Capistrano のデプロイ先にあるもののみ
-  本番環境の接続設定が ssh config の `Host my-app` で用意されている
- Capistrano を使って `my-app` の `/path/to/app` ディレクトリへデプロイされている

### 本番環境の様子

`my-app` の `/path/to/app` が Capistrano でデプロイする環境であることを確認する

```
[ec2-user@my-app ~]$ ls -l /path/to/app
total 24
lrwxrwxrwx 1 ec2-user ec2-user   50 Feb 1  2017 current -> /path/to/app/releases/20170201000000
drwxrwxr-x 5 ec2-user ec2-user 4096 Feb 1  2017 releases
drwxrwxr-x 7 ec2-user ec2-user 4096 Feb 1  2017 repo
-rw-rw-r-- 1 ec2-user ec2-user 8595 Feb 1  2017 revisions.log
drwxrwxr-x 6 ec2-user ec2-user 4096 Feb 1  2017 shared
```

## Git リポジトリを復元する

### 1. 本番環境の `/path/to/app/current` をローカルにコピーする

```console
$ scp -r my-app:/path/to/app/current my-app
```

### 2. 本番環境の bare repository をローカルにコピーする

1の段階では `.git` ディレクトリがないため、本番環境の `/path/to/app/repo` を `.git` としてダウンロードする。

```console
$ scp -r my-app:/path/to/app/repo my-app/.git
```

### 3. ローカルの bare repository を non bare repository に変更する

`my-app:/path/to/app/repo` は bare repository であるため、このままではコミットなどの破壊的操作をすることができない。non bare repository に変更することで git-commit や git-push を実行できるようになる。

```console
$ git config core.bare false
## git のステージをクリーンな状態にする
$ git reset HEAD
```

`.git/config` から `mirror = true` を削除する


```diff:.git/config
 [core]
     repositoryformatversion = 0 
     filemode = true
     bare = false
 [remote "origin"]
     fetch = +refs/*:refs/*
-    mirror = true
     url = git@github.com:taro-yamada/my-app.git
```

### 4. 新しいホスティング先を設定する

```console
$ git remote set-url origin git@github.com:taro-yamada/my-app.git
```
### 5. 新しいコミットが push できることを確認する

```console
$ git commit --allow-empty -m 'Done testing'
$ git push origin master:done-testing
```

本番環境から Git リポジトリを復元することができました。

### 5. 本番環境の `/path/to/app/repo/config` に新しいリポジトリを設定する

`cap deploy` を実行したときに新しいリポジトリが参照されるようにします。

```diff:/path/to/app/repo/config
 [core]                                                  
         repositoryformatversion = 0                     
         filemode = true                                 
         bare = true                                     
 [remote "origin"]                                       
         fetch = +refs/*:refs/*                          
         mirror = true
-        url = git@old-repository.example.com:taro-yamada/my-app.git
+        url = git@github.com:taro-yamada/my-app.git
```
->> rake db:migrate rake aborted! SyntaxError: : syntax error, unexpected '\n', expecting :: or '[' or '.'

# 表題のエラーが

```bash
rake db:migrate
```

で発生

これは下記で実行すると発生します。

```
rails g model study te:string, page:integer, title:string
```

カンマが紛れていますこれでファイルを作成すると下記のようになります。

```
class CreateStudies < ActiveRecord::Migration[5.0]
  def change
    create_table :studies do |t|
      t.string, :te
      t.integer, :page
      t.string :title

      t.timestamps
    end
  end
end

```

t.string, :te　<- 左記のようにカンマが紛れています。

これを修正します。

```
class CreateStudies < ActiveRecord::Migration[5.0]
  def change
    create_table :studies do |t|
      t.string :te
      t.integer :page
      t.string :title

      t.timestamps
    end
  end
end

```

このように修正すると成功します。

```
->> rake db:migrate
== 20180201081725 CreateStudies: migrating ====================================
-- create_table(:studies)
   -> 0.0204s
== 20180201081725 CreateStudies: migrated (0.0205s) ===========================


```
iOSでHTMLタグを使ったものを表示する方法

今回の仕様で管理画面から `<b>` タグつかって特定の文字列をboldにしたいという要望があったのでパースとかしないでそのままHTMLでうまく表示できないのかなと思って調べてみました。

単純にStringで渡ってきた `こんにちは、今日は<b>天気</b>がいい。` の天気をboldにしたい場合はSwift 4だと以下のようにすればいけます。

```String.swift
extension String {
    var htmlToAttributedString: NSAttributedString? {
        do {
            guard let data = data(using: String.Encoding.utf8) else {
                return nil
            }
            return try NSAttributedString(data: data,
                                          options: [.documentType: NSAttributedString.DocumentType.html,
                                                    .characterEncoding: String.Encoding.utf8.rawValue],
                                          documentAttributes: nil)
        } catch {
            print("error: ", error)
            return nil
        }
    }
}
```

でもこれだとUILabelで指定したfontは効かないんですよね。
なので以下のようにするとfont-sizeとfont-family指定できるようになります。

```String.swift
extension String {
    func htmlToAttributedString(family: String?, size: CGFloat) -> NSAttributedString? {
        do {
            let htmlCSSString = "<style>" +
                "html *" +
                "{" +
                "font-size: \(size)pt !important;" +
                "font-family: \(family ?? "Helvetica"), Helvetica !important;" +
            "}</style> \(self)"
            
            guard let data = htmlCSSString.data(using: String.Encoding.utf8) else {
                return nil
            }
            
            return try NSAttributedString(data: data,
                                          options: [.documentType: NSAttributedString.DocumentType.html,
                                                    .characterEncoding: String.Encoding.utf8.rawValue],
                                          documentAttributes: nil)
        } catch {
            print("error: ", error)
            return nil
        }
    }
}
```
attributedTextに↑の方法で変換したものをセットしてあげればHTMLタグを使った文章がそのまま表示できます。

```FooTableViewCell.swift
func bindViewModel(_ vm: ViewModel) {
    self.bar.attributedText = barText.htmlToAttributedString(family: "Helvetica", size: 10.0)
}
```
これでWebのようにiOSのアプリでも
`こんにちは、今日は<b>天気</b>がいい。`　という文字列が渡ってきたら
こんにちは、今日は<b>天気</b>がいい。
と表示されるようになります。

参考
[A Swift extension for String and HTML](https://medium.com/@valv0/a-swift-extension-for-string-and-html-8cfb7477a510)
AWS ARNまとめ

資格勉強向けにARNの構文をメモ
[Amazon ARN](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html)  

基本形式

```
arn:partition:service:region:account-id:resource
arn:partition:service:region:account-id:resourcetype/resource
arn:partition:service:region:account-id:resourcetype:resource
```

- パーティション: 基本的にAWS
- サービス: AWS製品名
- リージョン: リソースがあるリージョン。リージョン関係ないものは省かれている
- リソース,リソースタイプ: サービスによって異なる。スラッシュやコロンなどで書いてある

覚え方
アランとパーティでサービス受けたらリケジョにアカンと(リ)ソースかけられた。


EC2構文例 

```
arn:aws:ec2:region:account-id:instance/instance-id
arn:aws:ec2:region:account-id:volume/volume-id
```
例

```
arn:aws:ec2:us-east-1::image/ami-1a2b3c4d
アカウントが省略されて::となる。
arn:aws:ec2:us-east-1:123456789012:instance/*
```

S3構文例

```
arn:aws:s3:::bucket_name
arn:aws:s3:::bucket_name/key_name
s3はリージョン、アカウントは不要。故にバケット名が一意である必要があるのか
```

S3例

```
arn:aws:s3:::my_corporate_bucket/*
ポリシーのARNを指定する場合は、ワイルドカード「*」文字を使用できる。
```

RDS構文例

```
arn:aws:rds:region:account-id:db:db-instance-name
arn:aws:rds:region:account-id:cluster:db-cluster-name

AWSCLI,RDS APIを使用する時に使う。その際にはタグと共に使用する。
```

[AWS サービスの名前空間](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces)
AWSサービスの識別をNamespaceを使用して AWSのサービスを識別する。
IAMポリシーを作る時などにアクションとリソースを識別するときに使用する。


そういえば関係ないけどサービス名のプレフィックスでAmazonとAWSの違いは

- Amazon: 単体のサービスとして利用出来る。
- AWS: 他のAWSのサービスと組み合わせて利用する。

と,どこかで聞いた気がする。公式のどこかに書いてあったけな？
オフラインリアルタイムどう書く F09 の実装例

問題 : http://nabetani.sakura.ne.jp/hena/ordf09rotbox/
解答リンク集 : https://qiita.com/Nabetani/items/61e13fa5cf0abe5979be

平易な問題だったと思う。

まずは python の無様な実装

```python:python
def process( c, cmd ):
  if cmd=="a":    c[0], c[1], c[2] = c[1], c[2], c[0]
  if cmd=="b":    c[3], c[4], c[5] = c[4], c[5], c[3]
  if cmd=="c":    c[6], c[7], c[8] = c[7], c[8], c[6]
  if cmd=="d":    c[6], c[3], c[0] = c[3], c[0], c[6]
  if cmd=="e":    c[7], c[4], c[1] = c[4], c[1], c[7]
  if cmd=="f":    c[8], c[5], c[2] = c[5], c[2], c[8]
  if cmd=="g":    c[8], c[7], c[6] = c[7], c[6], c[8]
  if cmd=="h":    c[5], c[4], c[3] = c[4], c[3], c[5]
  if cmd=="i":    c[2], c[1], c[0] = c[1], c[0], c[2]
  if cmd=="j":    c[2], c[5], c[8] = c[5], c[8], c[2]
  if cmd=="k":    c[1], c[4], c[7] = c[4], c[7], c[1]
  if cmd=="l":    c[0], c[3], c[6] = c[3], c[6], c[0]

def solve( src ):
  cells=list(range(1,10))
  for cmd in src:
    process( cells, cmd )
  return "/".join(["".join([str(x) for x in cells[n*3:n*3+3]]) for n in range(0,3)])

def test( src, expected ):
  actual = solve( src )
  okay = actual==expected
  print( ("ok" if okay else "**NG**"), src, actual, expected )


test( "aegj", "286/435/971" )
test( "a", "231/456/789" )
```

無様だけど、これでも解けているので良いのである。
多重代入万歳。

switch〜case や case〜when に相当する文法がないために無様さが増している。

続いて、ruby で書いた短めの実装。

```ruby:ruby
def rotate(f,rot)
  rot.times.inject(f) do |acc,_|
    acc.reverse.transpose
  end
end

def process( f, cmd )
  rot, y = cmd.divmod(3)
  f = rotate(f,rot).dup
  f[y].rotate!(1)
  rotate(f,4-rot)
end

def solve( src )
  f=[*1..9].each_slice(3).to_a
  src.chars.each do |cmd|
    f=process(f,cmd.ord - ?a.ord)
  end
  f.map(&:join).join("/")
end

DATA.map{ |line|
  num, src, expected = line.split(/\s+/)
  actual = solve( src )
  okay = actual == expected
  puts( [(okay ? "ok" : "**NG**"), num, src, actual, expected ].join("  ") )
  okay
}.all?.tap{ |x| puts( x ? "ok" : "something wrong" ) }
__END__
0 aegj  286/435/971
1 a 231/456/789
```

当日の参加者のアイディアを実装した。

計算量という点では好ましくないが、ソースコードはきれいになる。

ruby は普通の配列を転置（transpose)出来るところが素晴らしい。
python で同じことをやろうとするなら numpy を使えば良い。
OpenSSLコマンドについて今一度確認

秘密鍵やCSRを作成できるOpenSSLですが、よくコマンドの意味も分からずコピペしがちなので、再度確認

##ダイジェストの作成
現在日付より、SHA256の文字列を生成する。ここで暗号化アルゴリズムを指定する必要性があるのかは不明

```linux-config
$ date | openssl dgst -sha256 > sample.dat
$ less random.dat
(stdin)= fcc7bad796f3b5aa20c3481fa2790669ceb9d3d8565091d1f39a50083123ab52
```

##秘密鍵の作成
3DES(トリプルDES)を利用して、ダイジェストから2048bitの秘密鍵を作成する。

```linux-config
$ openssl genrsa -rand sample.dat -des3 2048 > sample.key
$ less sample.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,CB8C441AE01D6315
yLk0ZJhLYkl8sWJC170WJ2CKIixBy6zlGCEwJCq13N39GUj4Tr20HqRzlbmtKQtv
lz93DjRSQ4uhA2EjwD7JTlHtsxEwhLYW1iKsodzBZ40e0on0sk6kK9i3/WUEHuLK
<<省略>>
-----END RSA PRIVATE KEY-----
```

3DESは下記の通り。つまり、3つの暗号鍵を用いて、1つの暗号鍵を作る。。。
>3DESとは、暗号方式のDES(Data Encryption Standard)の安全性を高めるために考案された処理方式の一つ。異なる2つまたは3つの暗号鍵を用いて、DESによる暗号化と復号の処理を3回繰り返すことにより解読されにくくしたもの。
>引用元：[3DES（トリプルDES）とは - IT用語辞典](http://e-words.jp/w/3DES.html)

##CSRの作成
秘密鍵よりCSRを作成する。このように、Base64でエンコードされたCSRを「PKCS#10」形式と呼ぶ。(RFC-2986 参照)

```linux-config
$ openssl req -new -sha256 -key sample.key -out sample.csr
$ less sample.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC0jCCAboCAQAwYzELMAkGA1UEBhMCYWExCzAJBgNVBAgMAmphMQswCQYDVQQH
DAJqYTELMAkGA1UECgwCamExDDAKBgNVBAsMA2FqYTEMMAoGA1UEAwwDYWphMREw
<<省略>>
-----END CERTIFICATE REQUEST-----

$ openssl req -in sample.csr -text
```
nginxのリダイレクトで正規表現を変数に使用する

# nginxのリダイレクトで正規表現を変数に使用する
タイトルの通りだがいつも忘れたり、過去のconfig見るのでここいらで備忘録をば。
Webサイトのリニューアルで301リダイレクトをかけるために、アプリにパスするためのlocation。

```bash:/etc/nginx/sites-available/default
server {
    listen 80;

    root /var/www/example/web; #Change to project location
    index index.php index.html index.htm;
    server_name example.com; #Change to project server_name

    ・・・

    location ~ ^/(cat1|cat2|cat3|cat4)/(dir1|dir2|dir3|dir4|dir5)/(.*)/(.*\.html) {
       # 正規表現が順にセットされる。(3つ目は使わない。)
　　　　　　　　　　　　　　set $category $1;
       set $directory $2;
       set $base_name $4;
       # /redirect をコントロラーが受け取り中で301リダイレクト
       rewrite ^(.*)$ /redirect?category=$category?directory=$directory?base_name=$base_name redirect;
    }
　　　　　　　　
　　　　　　　・・・
}
```

ディレクトリ構造が決まってないもの ex) /jp/dir1/cat1/tag1/example.htmlや/jp/dir1/cat1/example.html 
をどう綺麗に処理したらいいかは調査中。良い方法知ってる方いれば教えてください。
object-fitをCSSのみでIEにも対応してみる

便利過ぎてobject-fitナシではもう組めなくなってきた今日このごろ。
modernizrなどを使わなくてもCSSだけでIE10（IE9もいけるかも？）に対応する方法を知ったので書いておきます。
absoluteにしてtansformを使って画像の真ん中を合わせています。
（transformが使えないブラウザなんてもう知らない。）
あくまでレガシー対応で、完全対応ではないですが、デザインによってはこれで十分なケースがあると思うので。

## html
```html
<span class="media">
    <img src="image01.jpg" alt="" />
</span>
<span class="media">
    <img src="image02.jpg" alt="" />
</span>
```

## CSS
```CSS
.media {
    position: relative;
    width: 500px;
    height: 200px;
    display: inline-block;
    overflow: hidden;
}
.media img {
    position: absolute;
    width: auto;
    height: auto;
    top: 50%;
    left: 50%;
    min-height: 100%;
    min-width: 100%;
    -ms-transform: translateX(-50%) translateY(-50%);
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
@supports ( object-fit: cover ) {
    .media img {
        position: static;
        height: 100%;
        width: 100%;
        left: 0;
        -o-object-fit: cover;
        object-fit: cover;
        top: 0;
        -ms-transform: none;
        -moz-transform: none;
        -webkit-transform: none;
        transform: none;
    }
}
```

## デモ
https://miminari.github.io/demo/demo02.html

っていうことで、じゃあobject-fit使わなくても良いんじゃん？てなりそうだけれど、position弄っちゃってたりするので、あくまでも後方互換として使うのが吉かと。

※ 追記：横長のものに入れたり画像が固定サイズなら特に問題ないと思いますが、デモみてもらうと分かるように、縦横自在に操るにはmax-widthなどで都度調整しなくてはならないのでメンドイです。（横長の画像の縦をちょっと削りたい、ぐらいだったら大丈夫。）

・・・早くobject-fitのみで済ませられる日が来ないかなあ。

モダンブラウザとIE10では動作確認済みですが、何か間違えてたら教えてください。

## 参照

手前味噌のページで恐縮ですが、WordPressのテーマで使われてて気がついたのが最初でした。
WordPressのは画面全体を覆う場合なので、max-width: 1000%だったり、min-width:100vwとかが入っているのがミソ。

【Twenty Seventeenのちょこっと解説】ヘッダーイメージのCSSがアツイ【object-fit】 – Photosynthesic blog
http://blog.photosynthesic.jp/2017/01/【twenty-seventeenのちょこっと解説】ヘッダーイメージのcssが/

@supportについてはこちらとかを。

@supports - CSS | MDN
https://developer.mozilla.org/ja/docs/Web/CSS/@supports
WordPress プラグイン slack-contact-form-7 で入力内容まで Slack に送るプチハック

# Slack はなかなか便利
Slack を業務で使っている。U/Iは馴染めないけれど、カスタマイズ方法が提供されてて、ツールも豊富。
# サイトは WordPress を使っている
CMSなんで編集もしやすいしプラグインもテーマも揃っている。(バージョンアップが頻繁過ぎるのが玉に瑕だけど)
そうなると、問い合わせフォームはどうしても珠玉の名作 [Contact-form-7プラグイン](https://ja.wordpress.org/plugins/contact-form-7/) とかになる。
折角 Slack を使っているんだから問い合わせも通知させたいよね。
# 問い合わせ時に Slack に通知する
ということで
[Slackプラグイン](https://ja.wordpress.org/plugins/slack/) + Contact-form-7 + [Slack-contact-form-7プラグイン](https://wordpress.org/plugins/slack-contact-form-7/) を入れると問い合わせ時に Slack に通知はされる。
されるのだが・・・

**Someone just sent a message through ＊コンタクトフォーム 1＊ ＿Contact Form 7＿. Check your email!**
**送られてくるのなんかタイトルだけじゃん！？**

これでメールを見に行くのは２度手間なのでプチハックする。

注1：Slackプラグインの設定で ☑When someone sent message through Contact Form 7 にチェックすること。
注2：Webhook のURL は、右URLから取得可能： https://slack.com/services/new/incoming-webhook
# 通知だけじゃなく入力内容も送るプチハック
wp-content/plugins/slack-contact-form-7/slack-contact-form-7.php を以下の様に修正する。

```php
			if ( $sent ) {
+				$submission = WPCF7_Submission::get_instance();
+				$formdata = $submission->get_posted_data();
+				$contents = '';
+				foreach ($formdata as $key => $val) {
+					if (substr($key, 0, 1) != '_') {
+						if ( is_array($val) ) {
+							$contents .= $key . ':' . implode(',', $val) . "\n";
+						} else {
+							$contents .= $key . ':' . $val . "\n";
+						}
+					}
+				}

				return apply_filters( 'slack_wpcf7_submit_message',
-					sprintf(
-						__( 'Someone just sent a message through *%s* _Contact Form 7_. Check your email!', 'slack' ),
-						is_callable( array( 
-						$form, 'title' ) ) ? $form->title() : $form->title
-					),
+					$contents,
					$form,
					$result
				);
			}
```
contact-form-7 のインスタンスから内容を取得する。
キーが _wpcf7* みたいなのはコントロールっぽいので除外する。
後は、タイトルを送っているところを丸っと消して、結合した内容を送信すればOK。

これでメールを開く手間をかけずに #Slack だけで内容を確認できるようになりました。

一応、こんな感じで slack のチャンネルに送られる。

```sh:
your-name:a
your-email:b@c.com
your-subject:d
your-message:e
your-checkbox:a,b
your-radio:1
```
「ContextCompat.checkSelfPermission()が常にPERMISSION_DENIEDになってしまう」の記事が間違ってた話

もう削除したのですが、当初こんな記事を書いた。

---
#概要
Androidでパーミッションを取得する際は、`ContextCompat.checkSelfPermission()`を使って、すでにユーザーがそのパーミッションを許可しているかどうかを確認する必要があります。
許可非許可は、Android 6.0 (API Level 23)以上の端末のみで可能になっていて、それ以下の端末の場合は、「AndroidManifest.xmlに該当のパーミッションを`uses-permission`を使って記載をしているか」が許可非許可の代わりとなっています。

```xml:例
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
```

ただ、今回HTC J ISW13HTにてテストを行っていた所、READ_EXTERNAL_STORAGEに関して、AndroidManifest.xmlに記載があるのに、`checkSelfPermission`が常に非許可(PERMISSION_DENIED)になってしまっておりその解決方法を探りました。

#結論
**AndroidManifest.xml上でREAD_EXTERNAL_STORAGEをWRITE_EXTERNAL_STORAGEの前に書かないといけない**

---

#が、しかし・・・
その後、色々別の箇所を修正してやってみたところ、なんと同じ状態に・・・。戻して、上記の所を色々やってみた結果どうやら全く関係ないらしい。

ということで再度色々調べることにしました。

#結論2
**READ_EXTERNAL_STORAGEなんてなかった**

正しくはあるにはあるのですが、APIドキュメントを見ていて気づいた。
>Added in API Level 16
>https://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE

ISW13HTはAndroid 4.0.2。Android Studio上でもAPI Level 16以上だよ！と出ている箇所と出ていない箇所があり、完全に見落としていました。

ただ、なんか色々おかしく、デバッグモードでブレークポイントを置き、「Manifest.permission.READ_EXTERNAL_STORAGE」をVariablesのところで見てみると「No such static field: 'READ_EXTERNAL_STORAGE'」と出ているのですが、

```java
String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
```

として`permission`の値を見ると、`android.permission.READ_EXTERNAL_STORAGE`と値が入っている・・・。本来ならそのままExceptionなりで落ちてもいいものですが、そういうことではないらしい。

また、ちょっとどこのStackoverflowで見たのか定かじゃないのですが、
>`ContextCompat.checkSelfPermission()`は存在しないパーミッションは許可しない

という実装になっているそうです。まぁこれはそうでしょうね。

ということで、`android.permission.READ_EXTERNAL_STORAGE`はAndroid 4.0には存在しないので許可されないというのが真相のようです(今度こそ。たぶん)。

上記を踏まえ、最終的にはこんな感じに修正しました。

```java
String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
if (Build.VERSION.SDK_INT <= VERSION_CODES.JELLY_BEAN) {
  permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
}
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
}
```

削除する前の記事には書いたのですが、ドキュメントを見ると、READ_EXTERNAL_STORAGEはWRITE_EXTERNAL_STORAGEを書いていれば権限が渡されているのと同じ状態となるようです。

>Any app that declares the WRITE_EXTERNAL_STORAGE permission is implicitly granted this permission.
>https://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE

そのため、今回はWRITE_EXTERNAL_STORAGEの権限があればOKということにしました。実際には無い権限なので、16以下はそもそもパーミッションのチェックをしない方が正なのかもしれないです。