OmniAICreator/Qiita-1.07M huggingface dataset:
RailsでEmacsのxmp(rcodetools/xmpfilter)を使う方法

一度 [xmpfilter](https://github.com/rcodetools/rcodetools) に慣れてしまうともう後戻りはできない。そんな極一部の xmpfilter 中毒者が戸惑わないように Rails でも xmpfilter を使う方法を共有しときます。

shebang を `#!rails runner` にするだけだったり、require のところでよかれと思って require_relative を使ったりするとうまくいきません。

次のように **require で config/environment.rb を読み込み** さえすれば、あとは小さなスクリプトのように扱えます。

```rb:RAILS_ROOT/bin/foo.rb
require File.expand_path('../../config/environment', __FILE__)
Article.count       # => 10
```

SQLを確認したいときは次のようにログ出力を標準出力に向けて、色付けを無効にしておくとよいです。

```rb:RAILS_ROOT/bin/foo.rb
require File.expand_path('../../config/environment', __FILE__)
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
ActiveSupport::LogSubscriber.colorize_logging = false

Article.count       # => 10
# >>    (0.3ms)  SELECT COUNT(*) FROM `articles`
```

また有用な機能に発展して外部コマンドとしても利用したくなったら shebang に `#!/usr/bin/env ruby` を追加します。

カレントディレクトリが Rails.root 直下じゃないと都合が悪いってときは require のあとで `Dir.chdir Rails.root` とします。
Androidアプリでpressを実装

結構、誰も書いてない感じの大事な事を書いてます。


# 背景の色を変更
drawableに

```xml:qiita.xml
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <color android:color="#330000" />
    </item>
    <item android:state_pressed="false">
        <color android:color="#ff0000" />
    </item>
</selector>
```

で背景にこれを指定。

すると押してる間背景の色が変わる。

次に

# 対象の透過度を変更する。

```java:qiita.java
VIEW.setOnTouchListener(new View.OnTouchListener() {
    private Rect rect;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            v.setAlpha(0.6f);
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
        }else if(event.getAction() == MotionEvent.ACTION_UP){
            v.setAlpha(1.0f);
        }else if(event.getAction() == MotionEvent.ACTION_MOVE){
            if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
                v.setAlpha(1.0f);
            }
        }
        return false;
    }
});
```

これで押してる間は色が薄くなってくれる。

# 対象の画像に色を載せる

```java:qiita.java
VIEW.setOnTouchListener(new View.OnTouchListener() {
    private Rect rect;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            ((ImageView) v).setColorFilter(Color.argb(10, 0, 0, 0));
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
        }else if(event.getAction() == MotionEvent.ACTION_UP){
            ((ImageView)v).setColorFilter(Color.argb(0, 0, 0, 0));
        }else if(event.getAction() == MotionEvent.ACTION_MOVE){
            if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
                ((ImageView) v).setColorFilter(Color.argb(0, 0, 0, 0));
            }
        }
        return false;
    }
});
```
これはちょっと黒くするサンプル

# 対象を小さくする

```java:qiita.java
VIEW.setOnTouchListener(new View.OnTouchListener() {
    private Rect rect;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            v.setScaleX(0.9f);
            v.setScaleY(0.9f);
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
        }
        if(event.getAction() == MotionEvent.ACTION_UP){
            v.setScaleX(1.0f);
            v.setScaleY(1.0f);
        }
        if(event.getAction() == MotionEvent.ACTION_MOVE){
            if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
                v.setScaleX(1.0f);
                v.setScaleY(1.0f);
            }
        }
        return false;
    }
});
```

これでほとんどの場合OK

問題はGridViewとかListViewの要素に対してtouchListenerが干渉してうまくいかない。
touchlistenrでreturn trueとかにしてクリックとかの制御も合わせてタッチ内で行うか、無難にdrawbleで背景の色を変えるくらいに収めた方がよさげ
Laravel使うならrouteには名前をつけたほうが良い

Laravelにはルートに名前をつける機能があります。

```php:routes/web.php
Route::get('users/{id}/profile', function () {
    //
})->name('user.profile');
```

この時、view側で

```php:views/index.blade.php
{{ route('user.profile', ['id' => 1]) }}
```

このようにするとroute名に従って`user/1/profile`のようなurlが生成されます。

# 利点

名前を付けなくても、当然アクセスすることはできますが、以下の3つの利点があるので名前をつける運用をしていった方が良いかなと思います。

- URLを一括で変更することが出来る
- 存在しないurlの時にエラーになる
- (PHPStormを使っている場合)補完される

## URLを一括で変更することが出来る
view側で

```php
{{ url('/users/1/profile') }}
```

のように書いてしまうと、URLを変更することになった場合、viewの中から同じ箇所を探さないといけませんが、

```php
{{ route('user.profile', ['id' => 1]) }}
```
としていれば`routes/web.php`だけ変更すれば良いです。

## 存在しないurlの時にエラーになる
```php
url('/users/1/profile')
```

の場合、そのURLが存在する保証はありませんが、

```php
route('user.profile', ['id' => 1])
```

の場合そのルートが存在しなければエラーになります。

## (PHPStormを使っている場合)補完される
PHPStormを使っていてLaravelプラグインを使っていると、route関数を使おうとすると補完されます。

<img width="557" alt="スクリーンショット_2019-05-16_14_59_03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47882/3b8e2d33-8cc3-b348-dcfe-99f064324219.jpeg">
Ruby｜配列をどう変換するか

retryableというgemがあります。
キーワード引数`matching`を使って捕捉する例外を指定することができます。

```ruby
def retryable(tries:, matching: StandardError)
  begin
    # なんらかのテクニックが必要
  rescue *matching => e # このままでは動かない
    puts e.message
  end
end
```

ここで話題にしたいのは`matching`には例外クラスを配列で指定するか、
例外クラスを1つだけのどちらでも使えるようにするテクニックです。

`rescue`で例外を捕捉する必要がありますので1次元配列（入れ子でない）にする必要があります。
私がおもいついたのは3つです。`retryable`では`flatten`を利用しているようです。

https://github.com/nfedyashev/retryable/blob/master/lib/retryable.rb#L63

```ruby
matching = matching.is_a?(Array) ? matching : [matching]
```

```ruby
matching = [matching].flatten
```

```ruby
matching = Array[*matching]
```

これらのベンチマークを取ってみました。

```ruby
require 'benchmark_driver'

Benchmark.driver do |x|
  x.prelude %{ array = [*1..5000] }
  x.report "flatten", %{ [array].flatten }
  x.report "using Array.[]", %{ Array[*array] }
  x.report "Object#is_a?", %{ array.is_a?(Array) ? array : [array] }
  x.compare!
end
```

なんと結果は`flatten`が一番遅いことがわかりました:sweat_smile:

```
Warming up --------------------------------------
             flatten     1.869k i/s
      using Array.[]    56.587k i/s
        Object#is_a?    16.534M i/s
Calculating -------------------------------------
             flatten     2.029k i/s -      5.607k times in 2.763675s (492.90μs/i)
      using Array.[]    54.798k i/s -    169.760k times in 3.097910s (18.25μs/i)
        Object#is_a?    30.039M i/s -     49.602M times in 1.651260s (33.29ns/i)

Comparison:
        Object#is_a?:  30038651.1 i/s 
      using Array.[]:     54798.2 i/s - 548.17x  slower
             flatten:      2028.8 i/s - 14805.97x  slower
```

ということでPRを本家に出しました:tada:
マージされるといいなぁ:smile:

https://github.com/nfedyashev/retryable/pull/22
WordPress　プラグイン（simple map）使用　Googleマップを表示させる方法

simple-mapの使い方ーWordPressプラグイン【初心者向け】
https://techacademy.jp/magazine/4444

Simple Map（Googleマップ埋め込みプラグイン）
https://wp-exp.com/blog/simple-map/

上記内容はすべて解決済みですが、マップが表示の部分と非表示の部分の現象があります。

WordPress内のプラグイン編集のphpの表示回数の言語（プログラム）で改善できないでしょうか？
分かる方いらっしゃいましたら、ご教授お願いします。
【iOS】AVPlayerのdurationをDBに保存

# 問題
リアルタイムでビデオのDurationを取得し、表示できますが、
ビデオのサイズが大きければ大きほど、レスポンスが悪くなってきます。

#克服
事前に、ビデオのDurationを取得し、DBに保存したら、レスポンスが改善できると思います。

#DBの構成
```sql:insert.sql
  `total_time` biting(20) NOT NULL,
  `total_time_scale` biting(20) NOT NULL,
```
#取得

```swift:get.swif
   var filename = "abc.mov"
   var type = "MOV"
   guard let urlpath  = Bundle.main.path(forResource: filename, ofType: type) else{
       return
   }
        
   let url = NSURL.fileURL(withPath: urlpath)
   let player = AVPlayer(url: url as URL)
   let currentPlayerItem = player.currentItem
   let duration:CMTime = currentPlayerItem?.asset.duration
   
   let total_time = duration.value
   let total_time_scale = duration.timescale
　　...
   //DBを登録するロジック
```
#表示
```swift:display.swif
   //DBから取得するロジック
   //lessonsはDBから返す配列
   let totalTime = Int64(lessons["total_time"]!)!
   let totalTimeScale = Int32(lessons["total_time_scale"]!)!
   let dbTime:CMTime = CMTimeMake(totalTime, totalTimeScale)
```
HPC and Deep Learning on Azure

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「HPCだけじゃないDeep Learningでも使える ハイパフォーマンスAzureインフラ 」で使われた資料のご案内です。</p>

- <strong>HPC and Deep Learning on Azure</strong>
https://www.slideshare.net/ShuichiGojuki/hpc-on-azure21

- <strong>Azureハイパフォーマンスインフラ構築入門</strong>
https://www.slideshare.net/ShuichiGojuki/hpc-on-azure22


<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Java8, 9, 10 のサポート期間ついて

* Java 10 Release !!
https://developer.oracle.com/java/java10

* Java8 はLTS(Long Term Support) モデルのため、サポートが長い。

以下 http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html より
![java8910.jpg](https://qiita-image-store.s3.amazonaws.com/0/153684/ea5270c6-070f-66bf-637b-ca804c4a3137.jpeg)

関連記事
[2018年にJavaを利用している人は全員理解すべきことを説明してみる（追記あり）](http://www.orangeitems.com/entry/2018/02/08/152022)
dockerコンテナ一個一個のリソースを確認する

Dockerのコンテナ内部のリソース状況を一個一個みるのは結構面倒なのでその対処。

# install方法
``` command
wget https://github.com/bcicen/ctop/releases/download/v0.7.1/ctop-0.7.1-linux-amd64 -O /usr/local/bin/ctop
chmod +x /usr/local/bin/ctop
```

# 起動
``` command
ctop
```

# 画面
稼働しているコンテナのサマリー表示される
![image-20180322014156917.png](https://qiita-image-store.s3.amazonaws.com/0/75761/39f463ba-6777-7281-396f-b7d4267765d6.png)


# 詳細
コンテナ内部のリソース状況をホスト側から確認できる
![スクリーンショット 2018-03-22 10.41.31.png](https://qiita-image-store.s3.amazonaws.com/0/75761/745d92df-cb53-58a2-98fd-43011d4b7a20.png)


docker logも確認可能
![スクリーンショット 2018-03-22 10.42.28.png](https://qiita-image-store.s3.amazonaws.com/0/75761/a5e6a02e-bbcc-ae26-f488-84bf7492eb91.png)


コンテナの起動停止も可能
![スクリーンショット 2018-03-22 10.46.57.png](https://qiita-image-store.s3.amazonaws.com/0/75761/bd2c02bd-eff7-1a5c-28db-a0a10db418b2.png)
CakePHP3のComponentでloadModelする

# ComponentでloadModelが使いたい
Controllerではいつも意識せず`$this->loadModel('modelName')`を使っていたんですが、
Componentだとそれができず、仕方なく`$this->modelName = new TableRegistry::get('modelName')`と書いていました。

```HogeComponent.php
<?php
namespace App\Controller\Component;

use Cake\Controller\Component;

class HogeComponent extends Component
{
    public function init()
    {
        $this->modelName = new TableRegistry::get('modelName'); // OK
        $this->loadModel('modelName'); // エラー
    }
}
```

でも`loadModel`使いたいなーと思ったので、ちょっと調べたメモを投稿しておきます。

## loadModelの実装
そもそも`loadModel`って誰が実装しているメソッドなの？と言うところから調べてみたのですが、どうやらController.phpがuseしている`ModelAwareTrait`が持っている様子。
Controller.phpはAppControllerの親なので、AppControllerを継承していれば、各Controllerで`$this->loadModel('modelName')`が呼べる、と言うことでした。

なので、Componentでも`ModelAwareTrait`をuseすれば使えるはず。

## 実際に書いてみた

```HogeComponent.php
<?php
namespace App\Controller\Component;

use Cake\Controller\Component;
use Cake\Datasource\ModelAwareTrait;

class HogeComponent extends Component
{
    // loadModel()を使うために読み込む
    use ModelAwareTrait;

    public function init()
    {
        $this->modelName = new TableRegistry::get('modelName'); // OK
        $this->loadModel('modelName'); //OK
    }
}
```

と言うことで、`ModelAwareTrait`を読み込むだけでOKでした。
Ubuntu PPAのSDAPSパッケージでレポートの標準偏差がおかしくなる問題への対応

# 背景

UbuntuではSDAPSを使うためのパッケージを作者が提供しています。
残念ながら、[2017年末にみつかったレポートでの標準偏差が異常値となるバグ](https://github.com/sdaps/sdaps/issues/111)の問題があり、レポートの標準偏差が明かにおかしくなります。

# 解決策

上記リンクの最後に作者のパッチが添付されています。手で修正したdiffは以下のようになりました。

```diff:.../sdaps/calculate.py
--- /usr/lib/python2.7/dist-packages/sdaps/calculate.py.20180320        2017-07-17 06:16:41.000000000 +0900
+++ /usr/lib/python2.7/dist-packages/sdaps/calculate.py 2018-03-20 22:56:20.107821458 +0900
@@ -183,14 +183,15 @@
 
             if self.range_count > 0:
                 for key in self.range_values:
-                    self.standard_deviation += self.range_values[key] * pow(key - self.mean, 2)
                     self.mean += key * self.range_values[key]
+                self.mean = self.mean / float(self.range_count)
 
-                    # Also devide by count
-                    self.range_values[key] = self.range_values[key] / float(self.count)
-
+                for key in self.range_values:
+                    self.standard_deviation += self.range_values[key] * pow(key - self.mean, 2)
                 self.standard_deviation = math.sqrt(self.standard_deviation / float(self.range_count))
-                self.mean = self.mean / float(self.range_count)
+
+                for key in self.range_values:
+                    self.range_values[key] = self.range_values[key] / float(self.count)
 
                 if hasattr(self, 'ref_count'):
                     self.significant = abs(self.mean - self.ref_mean) > 0.1

```

# レポートの再生成

reportのみを再度行なうことで、平均や標準偏差が出力されるようになります。念のため*csv export*で出力した結果から再計算してみたところ、約160名分の手持ちのデータについて、無回答の項目を除いた値は同じ平均・標準偏差になるところまでは確認しています。
7botの調査

# 7botとは

https://www.kickstarter.com/projects/1128055363/7bot-a-powerful-desktop-robot-arm-for-future-inven?lang=ja

- Kickstarter発の6軸ロボットアーム。
- 2015年ごろのプロジェクト
- 早期割引で297ドル〜
- 手先にグリッパーまたはバキュームピッカーをつけることができる
- グリッパーをつけた時は7軸ロボットアームになる
- オープンソースハードウェア
- 制御にはArduino Dueを使っている
- 出荷遅延とかいろいろ問題が起こりまくったらしい

# 最近の動向

- 公式サイト http://www.7bot.cc/
- Webサイトは消滅
- オープンソースということだったが資料は不足気味
- 有志がサルベージした資料
- https://github.com/rmcolbert/7bot-Archive

# 入手するには？

- 7botチームは行方不明？
- K-powerが代わりに一般販売していたようだ
- K-powerは7botに使用していたサーボのメーカー
- 現在はアレンジしたバージョンがラインナップに挙げられている
- 1000ドル前後の値段
- 株式会社MTMシステムズのnanaboが互換品として供給されていた。
- nanaboは現在は入手不可


# Arduinoのライブラリ
- 7botライブラリ
- LGPL
- https://github.com/7Bot/7Bot-Arduino-lib

# サンプルプログラム
calibration
modeCtrl
motionCtrl
softwareSystem
IK3motionCtrl.ino

## calibration
初期動作をした後forcelessモードになる。ここでキャリブレーション？

## modeCtrl
forcelessModeのデモ

## motionCtrl

##softwareSystem

これを使うと 7Bot Communication Instructionの通りの操作ができるようになる

##IK3motionCtrl.ino
GitLabでWindowsサーバをジョブ実行環境として使用する

# はじめに

GitLabのジョブ実行環境はGitLab Runnerを使用して構築します。
Linux環境やDockerを使用した記事は多いのですが、Windows環境にGitLab Runnerをインストールして、Windows環境でジョブを実行する記事があまりなかったので共有します。

# 作成する環境

今回はC#アプリケーションをビルドする環境を例として、Windowsのジョブ実行環境を構築します。

## 概要説明

![gaiyo.png](https://qiita-image-store.s3.amazonaws.com/0/117949/9230e551-a68d-950d-c484-ab5e3a83be05.png)

### 1.ジョブをポーリング

Windows用のGItLab Runnerである gitlab-ci-multi-runner-windows を使用して、GitLabのジョブをポーリングします。

### 2.スクリプト実行

ポーリングの結果、実行可能なジョブが見つかった場合、ジョブの内容（.gitlab-ci.ymlに書かれたジョブ定義）に従ってスクリプトを実行します。

### 3.ビルド実行

MSBuild でソリューション（.sln）のビルドを実行します。

# 環境構築

## インストール資産のダウンロード

下記ツールをWindowsサーバへダウンロードします。

|ツール|ファイル名|ダウンロードURL|
|:---|:---|:---|
|Microsoft Build Tools 2015|BuildTools_Full.exe|https://www.microsoft.com/ja-JP/download/details.aspx?id=48159|
|Git|Git-2.14.2-64-bit.exe|https://git-scm.com/download/win
|gitlab-ci-multi-runner-windows|gitlab-ci-multi-runner-windows-amd64.exe|https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-windows-amd64.exe|

## Microsoft Build Tools 2015のインストール

1.BuildTools_Full.exeを実行し、インストールをクリックします。

2.セットアップが完了したことを確認して閉じるをクリックします。

## Gitのインストール

1.Git-2.14.2-64-bit.exeを実行し、画面の内容にしたがってインストールを行います。全てデフォルトのままでも特に問題ありません。

## gitlab-ci-multi-runner-windowsのインストール

1.gitlab-ci-multi-runner-windows-amd64.exeを任意の場所に配置します。
　例： `C:/gitlab-runner/gitlab-ci-multi-runner-windows-amd64.exe`

## GitLab RunnerをGitLabに登録

1.下記のコマンドを実行し、GitLab Runnerの登録を実行します。

```
C:/gitlab-runner/gitlab-ci-multi-runner-windows-amd64.exe register
```

2.登録時に必要な情報を対話形式で入力します。

|質問内容|説明|入力例
|:---|:---|:---|
|Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):|GitLab Runnerを登録するGitLabのURL|http://gitlab.sample.test.local|
|Please enter the gitlab-ci token for this runner:|GitLab CI Runnerのトークン|01234567890123456789|
|Please enter the gitlab-ci description for this runner:|GitLab Runnerの説明|C# Build Server|
|Please enter the gitlab-ci tags for this runner (comma separated):|GitLab Runnerが実行できるジョブのタグ|C#|
|Whether to run untagged builds [true/false]:|タグがつけられていないジョブを実行するかどうか|false|
|Whether to lock Runner to current project [true/false]:|GitLab Runnerを現在GitLabにあるプロジェクトのみで使用するかどうか|false|
|Please enter the executor: parallels, shell, ssh, ...(略)|GitLab Runnerのタイプ|shell|

3.下記コマンドを実行し、GitLab Runnerのユーザ登録を行います。

```
C:/gitlab-runner/gitlab-ci-multi-runner-windows-amd64.exe install --password [ログイン中のWindowsユーザのパスワード]
```

4.下記コマンドを実行し、GitLab Runnerを開始します。

```
C:/gitlab-runner/gitlab-runner/gitlab-ci-multi-runner-windows-amd64.exe start`
```

5.GitLabにRunnerが登録され、ポーリングができていることを確認します。

# プロジェクトの作成と資産の登録

1.GitLabで新しいプロジェクトを作成します。

2.作成したプロジェクトをクローンしてソリューションを追加します。今回はVisual Studioで作成できるConsoleApplicationのソリューションを例として追加します。

3.`.gitlab-ci.yml` を下記の内容で追加します。

```yaml
variables:
  MSBuildEXE: "C:/Program Files (x86)/MSBuild/14.0/Bin/MSBuild.exe"

stages:
  - build
  
msbuild:
  stage: build
  tags:
    - C#
  script:
    - chcp 65001
    - '"%MSBuildEXE%" ConsoleApplication.sln'
  artifacts:
    paths:
      - ConsoleApplication/bin/
```

4.変更をコミットし、GitLabにプッシュを行います。

5.プッシュをトリガーにCIのパイプラインが走り出し、ビルドが自動で実施されます。

#
zenbotを試してみた

ビットコイン自動取引ソフトのzenbotを使ってみた。

Javascriptで書かれており、開発が活発なビットコイン自動取引ソフトの[zenbot](https://github.com/DeviaVir/zenbot)を使ってみました。

# zenbotのインストール
環境は,（Vagrant上の）Ubuntu 16.04をつい買いました。
readme.mdに書かれた手順通りで動きました。　ちょっと間違えるとnodeのモジュール依存関係が異常になるので注意です。

```
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install build-essential mongodb -y

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

git clone https://github.com/deviavir/zenbot.git
cd zenbot
npm install

cp conf-sample.js  sample.js
```

# paper trade
ペーパートレードとは、実際には売買しませんが、売買シグナルを使ってリアルタイムで取引内容を記録していくことです。

```
./zenbot.sh trade --paper
```

実行すると、はじめに1日分の約定データを取得します。(数分かかります。)
その後、デフォルトのストラテジーであるtrend_emaで取引を行います。

# simulation
simulation は過去の取引データで、売買シグナルを使って取引内容を記録していくことです。
結果をチャートを含んだHTMLに出力することができます。backfillで過去データをデータベースに保存します。


```
./zenbot.sh backfill --days 7
./zenbot.sh sim
```
simulationsフォルダにHTMLが出力されます。

# 注意
* 開発が活発なので、不安定だったり、動かなくなっている機能があります。
* デフォルトの設定だとメモリを大量に使います。
WSLでwxPythonを使う

wxPythonを利用しているプログラムをWSL(Windows Subsystem for Linux)上のUbuntuで実行したくて試行錯誤したメモ。

Ubuntu側でpythonプログラム実行してWindows側のXServerで表示します。

# 前提条件
以下が導入済み
Windows Sybsystem for Linux（Ubuntu、Bash）
python3
pip3

#X環境を整える

この項は参考文献をなぞっています。
参考文献はRuby用なので不要な部分についてはカットしています。

## X Serverのインストール(Windows側）
VcXsrvを利用しましたが、好きなもので構いません。
https://sourceforge.net/projects/vcxsrv/files/vcxsrv/

## X11のインストール(Ubuntu側）
```
sudo apt update
sudo apt install x11-apps x11-utils x11-xserver-utils
```

## DISPLAY設定

```
echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
source ~/.bashrc
```

## 動作確認

Windows側でX Serverを起動した状態でUbuntu側で以下のコマンドを実行

```
xeyes &
```


# wxPythonのインストール
```
pip3 install --upgrade pip
pip3 install -U -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-16.04 wxPython
```
`pip3 install wxPython`では依存の解決が面倒だったが公式の記述通りに行うことでスムーズにインストールできた

## 動作確認
Windows側でX Serverを起動した状態でhelloworldを実行

```python:hello.py
import wx; a=wx.App(); wx.Frame(None, title="Hello World").Show(); a.MainLoop()
```
```
python3 hello.py
```

空のwindowが表示されればインストール完了


参考文献
https://qiita.com/fukuramikake/items/283b817c16725af79a28
https://kokufu.blogspot.jp/2018/03/linux-wxpython.html
https://www.wxpython.org/pages/downloads/
https://www.wxpython.org/pages/overview/#hello-world
Link > Alternate access to NCEP data products through NCEP Data Portals | FNLファイルに対応するGDASデータ

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS、およびWRFの後続処理のF***T関連。

関連: [WRF > NCAR's Research Data Archive Blog > システム障害などの経緯の紹介 | Outage | 経過 2018/03/19](https://qiita.com/7of9/items/baf03fd1592dfd71775f)

システムトラブルの復旧予定の目途がたたず、WRFの前処理WPS用のNCEPデータを要望している人のコメントがついている。
それに対して中の人からコメントが付いていて、データ取得の別の方法が紹介されている。
http://ncarrda.blogspot.jp/2018/03/3202018-rda-data-access-services.html
からのリンク
http://ncarrda.blogspot.jp/2018/03/ncep-data-portals.html

上記のサーバー類はミラーサーバーのようなものだろうか?

コメントを参考に`NCEP. FNL=GDAS`のファイルを見ているが、WPS用のデータ(`fnl_20180121_18_00.grib2`など)があるようには見えない。

### FNLファイルとの対応

https://ncarrda.blogspot.jp/2018/03/3202018-rda-data-access-services.html
のGrace Pengからのコメントにて、FNLファイルとの対応について記載されている。

`fnl_20180121_18_00.grib2`
に対応するGDASファイルは
`gdas.t18z.pgrb2.1p00.f000`

ファイル名の説明としては以下に記載されている。
http://www.nco.ncep.noaa.gov/pmb/products/gfs/

FNLファイルとGDASファイルを比較してみた。

```bash
$ ls -l fnl_20180126_00_00.grib2 
-rw-r--r-- 1 wrf wrf 17944440 Mar 19 18:16 fnl_20180126_00_00.grib2
$ ls -l ~/Downloads/gdas.t00z.pgrb2.1p00.f000 
-rw-rw-r-- 1 wrf wrf 17944440 Mar 22 15:57 /home/wrf/Downloads/gdas.t00z.pgrb2.1p00.f000
$ md5sum fnl_20180126_00_00.grib2 
24da70bfc0f18a9d03e4dd158f94890d  fnl_20180126_00_00.grib2
$ md5sum ~/Downloads/gdas.t00z.pgrb2.1p00.f000 
24da70bfc0f18a9d03e4dd158f94890d  /home/wrf/Downloads/gdas.t00z.pgrb2.1p00.f000
```

ファイルサイズもmd5値も同じなので、同じファイルなのだろう。
【高速構築】GitHubで新規レポジトリ作成からRailsプロジェクトのサービスを起動する（mysql編）

※ruby, git, bundle, mysql などはあらかじめインストールされている前提で進めます。

```bash:環境情報
$ rails -v
Rails 5.1.5
$ ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-linux]
$ bundle -v
Bundler version 1.13.7
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.34, for Linux (x86_64) using  EditLine wrapper
```

## Railsプロジェクト新規設定
- [GitHub](https://github.com/)ページ上で新しいレポジトリを作成する

- 作成されたレポジトリのURLをコピーしてクローンする

```bash
$ git clone https://github.com/hoge_project
```

- Gemfileの作成  

```bash
$ cd hoge_project
$ bundle init
Writing new Gemfile to /home/hoge_project/Gemfile
```
- Gemfileを編集

```ruby:Gemfile
# gem "rails"　<- コメント外す
```

- bundle install

```bash
$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
```
vendor/bundle以下にgemが格納されるようにする。
```--path vendor/bundle```を入れないとシステム側のgemに格納されるためクリーンな状態にならない。

- Railsプロジェクト作成

```bash
$ bundle exec rails new . -B -d mysql --skip-test
create  README.md
create  Rakefile
create  config.ru
create  .gitignore
conflict  Gemfile
Overwrite /home/hoge_project/Gemfile? (enter "h" for help) [Ynaqdh] y #上書き許可
```
デフォルト指定のDBがPostgreSQLになっているので、プロジェクト作成時にDBをMysqlに変更し、かつtestフォルダを作らないようにする。(テストコードはrspecで書くことが多いのであらかじめ作らないほうがいいかも)
上記コマンドを実行した際、Gemfileを上書きしていいかと聞かれるので```y```と答えておきましょう。
(Gemfileを開くとRailsで必要なgemが一通り記載されている)

- 再度bundle install

```bash
$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
```

## Mysql接続設定
mysqlはrootユーザで接続しちゃっていいよってなら、この設定部分は飛ばしちゃってRailsサービス起動して終了。高速で構築したいけど、rootユーザは避けたい場合の設定です。

- rootでログイン

```bash
$ mysql -u root -p
```

- ユーザ作成&権限追加

```bash
mysql> create user 'tarou'@'localhost' identified by 'hogehoge';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on hoge_project_development.* to tarou@localhost identified by 'hogehoge';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on hoge_project_test.* to tarou@localhost identified by 'hogehoge';
Query OK, 0 rows affected (0.00 sec)
```

- config/database.ymlの設定変更

```ruby:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  username: tarou # 変更 
  password: hogehoge # 変更
  socket: /var/lib/mysql/mysql.sock
```

- DB作成

```bash
$ bundle exec rake db:create
Created database 'hoge_project_development'
Created database 'hoge_project_test'
```

## サービス起動
```bash
$ bundle exec rails s -b 0.0.0.0
```
bash:  複数ファイル内の特定文字を一気にreplace


ファイル上書きしますよ。

```ruby
find . -type f -exec sed -i 's/foo/bar/g' {} +
```

上書きしたくないファイルがあったら、叩いた後に `git checkout --` するほうが早そう


> https://unix.stackexchange.com/questions/112023/how-can-i-replace-a-string-in-a-files

自分が +1 したら 777 になったよ！
Stripeで定期支払いを実装してみる - PHP

[これでできた](https://off.tokyo/blog/%e5%ae%9a%e6%9c%9f%e6%94%af%e6%89%95%e3%81%84%e3%82%92%e5%ae%9f%e8%a3%85-stripe%e3%81%a8php/)
awk or grep > 13文字目が0となる行を取得する(2010年代向け) > awk '($1 ~ /201.....,...0,/)' infile.csv

```txt:動作環境
Ubuntu 16.04.3 LTS desktop amd64
tmux 2.1-3build1
Python 2.7.12
Python 3.5.2
awk v1.2
```

### 仕様

以下のファイルがあるとする。

```txt:infile
20160801,0040,A
20160801,0045,0040,
20160801,0050,C
20160801,0055,D
20160801,0000,E
20160801,0006,D
```

- 2010年代のデータ
- 13文字目が0となるデータを取得したい
    - 3行目を例にとると、`0050`の最後の`0`
- カンマは残す

どうするか?

### 参考

https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-word-partly-matches

http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_5.html

情報感謝です。

### awk版

```
$ awk '($1 ~ /,...0,/)' infile.csv 
20160801,0040,A
20160801,0045,0040,
20160801,0050,C
20160801,0000,E
```

余分な行も表示された。

以下の場合、2010年代のデータに限っては抽出できそう。
(** 2020年代のデータ抽出には対応しない**)

```
awk '($1 ~ /^201.....,...0,/)' infile.csv 
20160801,0040,A
20160801,0050,C
20160801,0000,E
```

### grep版

```bash
$ cat infile.csv | grep '^201.....,...0,'
20160801,0040,A
20160801,0050,C
20160801,0000,E
```

参考: [grepでこういう時はどうする?](https://qiita.com/hirohiro77/items/771ffb64dddceabf69a3) 

情報感謝です。
python pillowで画像のトリミング自動化

# TL;DR

画像から右端の凡例をそぎ落とす

# できあがりサイズ調査

この辺が要らないからここまで削りたい、を今回はPhotoshopのカーソル位置表示で座標確認した。

https://www.ipentec.com/document/photoshop-show-cursor-pixel-position-on-image

# 必要ライブラリ

pillow

※Anacondaに入っている

# 実装

```python:crop.py
import glob
from PIL import Image, ImageFilter

# 対象フォルダ配下の、対象拡張子ファイル一覧のリストを返す
def ls_suffix(search_dir, suffix):
  file_name_list = glob.glob(search_dir + "*." + suffix)
  return file_name_list

# 幅をafter_widthに変更して上書き保存。高さそのまま。
# 基準点を左上原点にしているため、右端を削ぐ
def crop_right(picture_path, after_width):
  im = Image.open(picture_path)
  before_width,before_height = im.size
  
  im = im.crop((0,0,after_width,before_height))
  im.save(picture_path, quality=95)


if __name__ == "__main__":
  file_name_list = ls_suffix("./", "png")
  
  for file_path in file_name_list:
    crop_right(file_path, 600)
```

# Before, After
※Webページだと適宜拡大されたりしてて、印象ちょっと違うかもですが、今回削ったのは凡例だけ。

## before
![doshamesh_201803220810.png](https://qiita-image-store.s3.amazonaws.com/0/31245/54da78af-ed94-435c-724f-0cc36409e531.png)

## after
![doshamesh_201803220810.png](https://qiita-image-store.s3.amazonaws.com/0/31245/154e4c9e-117a-9676-859d-9a6ef550ad22.png)

# 参考文献
http://www.yukun.info/blog/2008/08/python-directory-listdir-glob.html
https://note.nkmk.me/python-pillow-image-crop-trimming/
slack-inviter-apiをAWS上に導入する

## 目的
https://github.com/knjcode/slack-inviter-api
↑を動作させたい
（WARNING: ruby-2.2.2 is nearing its end of life.　が出るのが気になりますが。。）


## rbenv環境構築
[どのユーザーでも、rbenv を利用できるようにする](http://d.hatena.ne.jp/komiyak/20150603/1433364444)

上記でrubyをインストールしたあと、bundle installコマンドを実行すると下記エラーが出た
`ruby_dep-1.5.0 requires ruby version >= 2.2.5, which is incompatible with the current version, ruby 2.2.2p95`

ので、2.2.5にバージョンアップ。すると今度は
`The 'bundle' command exists in these Ruby versions:`
というエラーが。。

そこで下記を試した。（ユーザはec2-user）
[rbenv環境をつくったけどgem installがうまくいかない場合の対処法](http://ztbuz.hateblo.jp/entry/2013/12/15/032616)
Node.jsでファイルを一行ずつ読み込んで、加工して書き出すスクリプト書いた

カンマ区切りのデータを、ちょろっと修正したい。そんなスクリプト。

割と使うので備忘録的に置いておきます。

```js
const fs = require('fs');
const readline = require('readline');

const reader = readline.createInterface({ input: fs.createReadStream('./aaa.txt', 'utf8') });
const writer = fs.createWriteStream('./out.csv');

function aaa(line) {
  const arr = line.split(',');
  console.log(arr[0], arr[1], arr[2]);
  writer.write(`${arr[0]},${arr[1]},${arr[2]}\r\n`);
}

reader.on('line', aaa);
```
【OpenStack】awkを駆使してリソースのUUIDだけを取得するメモ

# はじめに
OpenStackコマンドで複数のリソースのUUIDのみを抽出する方法をメモしておく。
OpenStackのバージョンが変わると使えなくなるかもしれません。このやり方はNewtonバージョンでは有効でした。

# やり方
仮想インスタンスのUUIDを取得したい場合

```
openstack server list | awk -F " " '$2 !="" && $2 != "|" && $2 !~ /^ID/{print $2}'
```
俺言語 その23

#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。
メロディを奏でる、前編。

#環境
avr studio 4
attiny85 1mhz
tera term
usb-serial

#調査1

ピアノの鍵盤の音階と周波数

http://jsdo.it/ohisama1/2Y73

#調査2

MMLを読んでみた。

https://qiita.com/ohisama@github/items/c24e3e0dc2e1e790b3a4

#プロトタイピング

簡易MMLを実装してみた。

http://jsdo.it/ohisama1/0zaq

#アセンブラ実装の方法検討

40usのデレィで255に収まる。

| 記号     |   周波数     |  1波     |分解　|
|:--------|-------------:|----------:|:----------|
|a        |   440.000    |  2273us   | 40us * 57 |
|b        |   493.883    |  2025us   | 40us * 51 |
|c        |   523.251    |  1911us   | 40us * 48 |
|d        |   587.330    |  1703us   | 40us * 43 |
|e        |   659.255    |  1517us   | 40us * 38  |
|f        |   698.456    |  1432us   | 40us * 36  |
|g        |   783.991    |  1276us   | 40us * 32  |
|A        |   880.000    |  1137us   | 40us * 28  |

「PINBに1書き込むと、出力が反転する」を利用する。

#俺言語での実装。

変数ｓを導入する。

```
s="ccggAAggffeeddccggffeeddggffeeddccggAAggffeeddcc"
```

以上。
＜linux コマンド4.ユーザシステム＞

〇ユーザ情報の表示
$ id
$ id ユーザ名

〇ログインユーザの表示
$ w


〇ディスク容量
$ df
$ df -H 表示内容に単位を付けて表示する

〇使用容量表示（キロバイト単位）

　合計サイズだけを表示
$ du -s
　使用量を大きい順に並べ替えを行う
$ du | sort -nr  

〇システム情報表示

　すべての情報の表示
$ uname -a
＜linux コマンド3.プログラム管理＞

プログラム中断
ctrl＋Z
プログラムの強制終了
ctrl＋C

ジョブの表示
$jobs

プロセスIDも表示する
$jobs -l

プロセスの状態を表示
（a:すべてのユーザ、u:ユーザ名、x:デーモンなども表示、w:１プロセスの表示行数を増やす）
$ps auxw


プロセスID　XXXXを終了させる。
$kill XXXX
応答しないプロセスを終了させる。
$kill -KILL XXXX

カレントjobを終了させる。
$kill %%


クーロンの表示
$crontab -l
クーロンの登録
$crontab ~/.crontab

クーロンファイル形式
分　時間　日　月　曜日　コマンド
Overcommit+Pronto+個別チェッカーで変なRubyコード（変更分＋新規分）をコミットさせない

# ローカルでもCI環境に合わせてProntoを使いたい

CircleCIでProntoを使ってGitHub上のPRのRubyコードを[自動コードレビュー](https://qiita.com/vochicong/items/2008bfe045c216c0ad3a)しています。
ローカルではGuardで常時 RSpec, Rubocop を走らせていますが、それでもコミットする前には最終的なコードチェックを自動的にしたい要望が数人からありました。CircleCIではProntoを使っているので、ローカル開発環境でもその動きに合わせようと思いました。

# 新ファイルがあるとProntoがクラッシュ

Prontoの基本的な使い方は、コミット・プッシュされたフィーチャーブランチと統合先ブランチを
比較して、コメントをすることです。
ローカルで、今までコミットされていない新しいRubyファイルを`git add`した状態で
`pronto run --staged`を走らせると[クラッシュ](https://github.com/prontolabs/pronto/issues/240)してしまいます。

# 新ファイルを一時退避してProntoを実行

ならば、変更のあるファイルだけProntoを実行すれば良いでしょう。
新規ファイルは、即ちそのまま差分なので、この後全量をチェックします。

```bash:precommit-part1.sh
#!/usr/bin/env bash
set -x

# Pronto crashes on checking files not yet committed,
# therefore we reset them once and re-add later
newrubies=$(git diff --name-only --diff-filter=A HEAD |\
            grep -e '\.\(rb\|rake\)$' | tr '\n' ' ')
[ -z "${newrubies// }" ] && exit

git reset $newrubies
status=0
bin/pronto run --staged || let ++status
git add $newrubies
```

# 新ファイルは個別にチェック

Prontoでも実行しているチェックを新ファイルに対して個別に実行します。

```bash:precommit-part2.sh
# Check those new files that not checked by Pronto
bin/flay `echo $newrubies`
bin/flog `echo $newrubies`
bin/reek -s `echo $newrubies` --failure-exit-code 0
bin/rubocop `echo $newrubies` || let ++status

exit $status
```

# Overcommitで自動実行

前記の`precommit-part1.sh`と`precommit-part2.sh`を
合わせた`bin/precommit.sh`を[Overcommit](https://github.com/brigade/overcommit)のCustomScriptとして実行します。

```yaml:.overcommit.yml
PreCommit:
  CustomScript:
    enabled: true
    command: ['bin/precommit.sh']
```

各開発者の環境で Overcommit のGitフックをインストールしてもらいましょう。

```sh
overcommit --install
```

# まとめ

これで、Pronto, Reek, Rubocopに引っかかるコードの差分があるとローカルでコミットできなくなります。チェックの内容はCircleCIでコミット済みのもの対する行うものと実質同じはずです。

# 参考

- [CircleCIでProntoを使ってGitHub上のPRを自動コードレビュー（master, develop以外任意の統合先ブランチにも対応）](https://qiita.com/vochicong/items/2008bfe045c216c0ad3a)
- ["pronto run" doesn't to do anything, --staged crashes #240]
(https://github.com/prontolabs/pronto/issues/240)
- [Overcommit, a fully configurable and extendable Git hook manager](https://github.com/brigade/overcommit)
- [RuboCopは自動修正のみ使うと捗る](https://qiita.com/fujimura/items/b67c720046c88b29125c)
- [Gitフックを使っておかしいRubyコードをコミットできないようにする](https://qiita.com/yuku_t/items/ad072418290a2b01a35a)
github で複数アカウントを切り替えるために複数の ssh key を扱う

例えば、普段使いのgithub ssh keyがあり、一方で会社用のgithubを分けたい。sshとかだとどのキーを使うか指定できるが、gitだとそんなオプションなくてめんどい感じ。
この gist https://gist.github.com/jexchan/2351996 を参考にしようとしたが、実際もっと手順減らせたので記録。

普段使いの ~/.ssh/id_rsa と特別な ~/.ssh/id_rsa_special があると想定。

切り替え

```bash
$ ssh-add -d ~/.ssh/id_rsa
$ ssh-add ~/.ssh/id_rsa_special
```

戻す

```bash
$ ssh-add -d ~/.ssh/id_rsa_special
$ ssh-add ~/.ssh/id_rsa
```

以上っす。
ABC029D 「1」

#問題概要
- $1$以上$N$以下の数字に登場する$1$の総数を求めよ $（1\leq N<10^9）$[(リンク)](https://beta.atcoder.jp/contests/abc029/tasks/abc029_d)
- ex) $N=12$なら$1,10,11,12$に$1$はそれぞれ$1,1,2,1$回出てくる（その他の数は$0$回）ので合計$5$個


#最初に考えたこと
- 桁dpっぽい
- `dp[未満flag][桁数]　:= 登場した1の個数`みたいな感じ？

#考察
- 結論からいうと上記の方法ではダメ
- 保持している状態の表現が弱い(漸化式に落とし込めなかった)
- `dp[未満][桁][出現する1の個数] := 左記の条件を満たす数字の個数`として条件を一つ増やし、後で足す
- $dp[i][j][k]$の足しこむ先を考える
- 未満flagが立っている時$(i == 1)$
    - この場合$j+1$桁目には好きな数字を選べる
    - $j+1$桁目に$1$を選んだ時 => $dp[1][j+1][k+1]$
    - $j+1$桁目に$1$以外$(0,2\sim9)$を選んだ時 => $dp[1][j+1][k]$
- 未満flagが立っていない時$(i == 0)$
    - 今回は$N$との大小関係を気にしないといけないので少々厄介
    - $N$の上から$j+1$桁目が$0$の時 => $dp[0][j+1][k]$
        - $j+1$桁目は$0$で確定
    - $N$の上から$j+1$桁目が$1$の時 => 
        - $j+1$桁目に$1$を選ぶと$dp[0][j+1][k+1]$(未満flagは立たない)
        - $j+1$桁目に$0$を選ぶと$dp[1][j+1][k]$(未満flagが立つ)
    - $N$の上から$j+1$桁目が$d(2\leq d \leq 9)$の時 => 
        - $j+1$桁目に$1$を選ぶと$dp[1][j+1][k+1]$(未満flagは立つ)
        - $j+1$桁目に$d$を選ぶと$dp[0][j+1][k]$(未満flagは立たない)
        - $j+1$桁目に$1,d$以外を選ぶと$dp[1][j+1][k]$(未満flagは立つ)


#解答
- 以上の考察をもとに実装すると以下のようになります
- 紛らわしいのですが、文字列は0-indexedでdp配列の2項目は1-indexedです
(つまり$j+1$桁目$(dp[i][j+1][k])$に足しこむときは文字列の$j$番目を見ています)
- 個人的なトラップとしては、毎回文字定数の`'1'`とすべきところを整数の`1`としてしまう点

```cpp:answer.cpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

#define Rep(b, e, i) for(int i = b; i <= e; i++)
#define rep(n, i) Rep(0, n-1, i)

const int MAX = 16;

//dp[未満][桁][出現する1の個数] := 左記の条件を満たす数字の個数
int dp[2][MAX][MAX*2];

void solve(void){
    string S;
    cin >> S;
    int D = S.length();
    dp[0][0][0] = 1;
    //dp[i][j][k]の寄与に注目
    rep(2, i) {
        Rep(0, D, j) {
            rep(MAX, k) {
                //未満flagが立っている
                if (i == 1) {
                    //1
                    dp[1][j+1][k+1] += dp[i][j][k];
                    //0,2~9
                    dp[1][j+1][k]   += dp[i][j][k]*9;
                }
                //未満flagが立っていない
                else {
                    if (S[j] == '1') {
                        //1
                        dp[0][j+1][k+1] += dp[i][j][k];
                        //0
                        dp[1][j+1][k] += dp[i][j][k];
                    }
                    else {
                        //S[j]を選んだ場合
                        dp[0][j+1][k] += dp[i][j][k];
                        if (S[j] != '0') {
                            //1
                            dp[1][j+1][k+1] += dp[i][j][k];
                            //0,2~(S[j]-1)
                            dp[1][j+1][k] += dp[i][j][k]*(S[j]-'1');
                        }
                    }
                }
            }
        }
    }
    //制約からしてintで十分
    int ans = 0;
    rep(MAX, j) ans += (dp[0][D][j] + dp[1][D][j])*j;
    cout << ans << endl;
}

int main(void){
  solve();
  return 0;
}

```

[(リンク)](https://beta.atcoder.jp/contests/abc029/submissions/2241867)

#最後に
今回が初投稿なので、色々拙い部分も目立ちますが、どうかご容赦ください
ミスなどあれば気軽に指摘してもらえると助かります
今後も印象に残った問題などをこんな風に記事にすることがあるかもしれません
Nuxt.js + TypeScript + Sass + ESLint 事始め

# Nuxt.js + TypeScript

`vue-cli` で Nuxt.js + TypeScript の雛形がインストールできる。

```bash
vue init nuxt-community/typescript-template my-project
```

肝心のNuxt.js含めパッケージのバージョンが最新でないものが含まれるので適宜バージョンを上げる。
基本はその時のlatestを選べばいいが、Nuxt.jsがまだWebpack4に対応していない[^1]ため、`ts-loader` は3.xである必要がある。

[^1]: 2018.03.22時点。Webpack4対応はdevブランチにはマージ済みでリリース待ち状態。

中身を見てみると

```js:nuxt.cinfig.js
// 略
modules: ['~/modules/typescript'],
```

```js:modules/typescript.js
module.exports = function () {
  // Add .ts extension for store, middleware and more
  this.nuxt.options.extensions.push('ts');
  // Extend build
  this.extendBuild((config) => {
    const tsLoader = {
      loader: 'ts-loader',
      options: {
        appendTsSuffixTo: [/\.vue$/],
      },
    };
    // Add TypeScript loader
    config.module.rules.push(Object.assign(
      {
        test: /((client|server)\.js)|(\.tsx?)$/,
      },
      tsLoader,
    ));
    // Add TypeScript loader for vue files
    for (const rule of config.module.rules) {
      if (rule.loader === 'vue-loader') {
        rule.options.loaders.ts = tsLoader;
      }
    }
    // Add .ts extension in webpack resolve
    if (config.resolve.extensions.indexOf('.ts') === -1) {
      config.resolve.extensions.push('.ts');
    }
  });
};
```

[モジュール](https://ja.nuxtjs.org/guide/modules/)を利用してTypeScriptに対応していることが分かる。

# ESLint

Nuxt.jsのアプリケーションが無事立ち上がったらESLintを導入。

```
babel-eslint
eslint
eslint-config-prettier
eslint-plugin-react
eslint-config-airbnb-base
eslint-config-typescript
eslint-import-resolver-alias
eslint-plugin-import
eslint-plugin-prettier
eslint-plugin-typescript
eslint-plugin-vue
typescript-eslint-parser
vue-eslint-parser
```

この辺を `devDependencies` に追加。

`.eslintrc.js` はこんな感じになった。

```js:.eslintrc.js
module.exports = {
  root: true,
  parserOptions: {
    parser: 'babel-eslint',
    ecmaVersion: 2017,
    sourceType: 'module',
  },
  env: {
    browser: true,
    node: true
  },
  extends: [
    'airbnb-base',
    'typescript',
    'plugin:vue/recommended',
  ],
  plugins: [
    'vue',
  ],
  settings: {
    'import/resolver': {
      'alias': [
        ['~', __dirname], // ルートディレクトリのエイリアス
      ],
    },
    'import/core-modules': [
      'vue', // vueはnuxtが抱えているため明記する必要がある
    ],
  },
  globals: {},
  rules: {},
}
```

CLIからESLintだけ走らせたいならこう。

```json:package.json
"scripts": {
  "lint": "eslint --fix --ext .js,.vue --ignore-path .gitignore ."
}
```

VSCodeならESLintプラグインを入れて以下のように設定しておくと良い。

```json
"eslint.autoFixOnSave": true,
"eslint.validate": [
    "javascript",
    {
        "language": "vue",
        "autoFix": true
    }
],
```

# Sass

CSSを生で書きたくないのでSassに対応する。

```bash
npm install --save-dev node-sass sass-loader
```

これだけで

```vuejs
<style lang="scss" scoped>
// you can use scss syntax here.
</style>
```

また、雛形でassetsに入ってた `main.css` もscssに変える。

```nuxt.config.js
// 略
css: [
  '~/assets/css/main.scss',
],
```


## StyleLint

こちらに書きました。
[Nuxt.js で .vue ファイルの SCSS に Lint を適当する](https://qiita.com/ryota-yamamoto/items/a1b009c1cd40ca557e99)
eager loadingする時に参照先のテーブルが持ってる外部テーブルまで参照する

# 環境
ruby 2.4.2
rails 5.1.4

# やりたいこと
eager loadingする際に、参照先テーブルが持ってる外部テーブルまでloadingしたい。
ということがあったので、備忘録も兼ねて紹介したと思います。

```
# => : 参照先とする
A => B
B => C
```

となっていた時に、AがBを通してCまでloadingするということです。

例えば下記のような3つのmodelがあり、Prefectureテーブル(A)からCountryテーブル(B)を通して、Continent(C)テーブルをloadingします。

```ruby
class Prefecture < ApplicationRecord
  belongs_to :country
end

class Country < ApplicationRecord
  belongs_to :continent
end

class Continent < ApplicationRecord
  has_many :countries
end
```

#やりかた
このように、includeするcounrty(B)のシンボルに、continent(C)をネストする形で渡してあげると良いです。

```ruby:Prefectures_controller.tb
class PrefecturesController < ApplicationController
  @prefectures = Prefecture.all.includes(country: :continent)
end
```

ちなみにもし、counrty(B)がcontinentの他に、prefecture以外にLeaguesという外部テーブルとも関連付けが合って、それも参照がしたい場合、このようにしてあげる。

```ruby
class Country < ApplicationRecord
  belongs_to :continent
  belongs_to :league
end

class PrefecturesController < ApplicationController
  @prefectures = Prefecture.all.includes(country: [:continent, :league])
end
```

#おまけ
デメテルの法則では、「オブジェクトAは別のオブジェクトBのサービスを要求してもよい（メソッドを呼び出してもよい）が、オブジェクトAがオブジェクトBを「経由して」さらに別のオブジェクトCのサービスを要求してはならない。」ということが言われており、今回のケースに当てはまってしまっています。

しかし個人的には、今回のケースのオブジェクトA(Prefecture)が要求したオブジェクトC(Continent)のサービスは、オブジェクトCの値だったので、そんなに問題ないかなという認識です。

もしこれが、continent_modelに定義したメソッドの呼び出しなどになるとデメテルの法則で言われているように、保守が辛くなってしまうので気をつけたいですね。

デメテルの法則に関してはこちらの記事がわかりやすいです。
http://ruby-rails.hatenadiary.com/entry/20150922/1442923521
Kotlinからコンパイルした.classファイルを逆アセンブル・逆コンパイル



このKotlinのコードにjavap(逆アセンブラ)、jad(逆コンパイラ)を使ってみる実験です。


```kotlin:hello.kt
fun main(args: Array<String>) {
    println("Hello, World!")
}
```

コードの出典
https://kotlinlang.org/docs/tutorials/command-line.html

Kotlinは他のJVM言語と同じく、Javaとして実行可能なクラスファイルにコンパイルされます。
そちらをjavapでJVMのニーモニックを表示したりjadでjavaのソースコードとして逆コンパイルすることができるので検証してみました。



```:コンパイル
kotlinc hello.kt -include-runtime -d hello.jar
```

jarを展開してhello.classに対してjavap,jadを使います

```
jar xf hello.jar
```




# 環境
macOS High Sierra 10

# javap(逆アセンブラ)
## 用意
JDKに最初から入っているので不要

## 実行
```:コマンド
javap -c HelloKt.class
```

```:結果
Compiled from "hello.kt"
public final class HelloKt {
  public static final void main(java.lang.String[]);
    Code:
       0: aload_0
       1: ldc           #9                  // String args
       3: invokestatic  #15                 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
       6: ldc           #17                 // String Hello, World!
       8: astore_1
       9: getstatic     #23                 // Field java/lang/System.out:Ljava/io/PrintStream;
      12: aload_1
      13: invokevirtual #29                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      16: return
}

```

# jad(逆コンパイラ)
## 用意
jadの導入方法

```
brew tap caskroom/cask
brew install caskroom/cask/jad
```

参考にしたサイトhttp://inarizuuuushi.hatenablog.com/entry/2017/05/09/231600



## 実行
 -aオプションでニーモニックをコメントとして表示できます。


```:コマンド
$ jad  -a HelloKt.class 
$ cat HelloKt.jad 
```

```java:
import java.io.PrintStream;
import kotlin.jvm.internal.Intrinsics;

public final class HelloKt
{

    public static final void main(String args[])
    {
        Intrinsics.checkParameterIsNotNull(args, "args");
    //    0    0:aload_0         
    //    1    1:ldc1            #9   <String "args">
    //    2    3:invokestatic    #15  <Method void Intrinsics.checkParameterIsNotNull(Object, String)>
        String s = "Hello, World!";
    //    3    6:ldc1            #17  <String "Hello, World!">
    //    4    8:astore_1        
        System.out.println(s);
    //    5    9:getstatic       #23  <Field PrintStream System.out>
    //    6   12:aload_1         
    //    7   13:invokevirtual   #29  <Method void PrintStream.println(Object)>
    //    8   16:return          
    }
}
```

結構簡単に導入・解析することができました。
今後Kotlin特有の機能がどのようにJavaとして表現・変換されているのか手元で検証しようと思います。
VCCW にインストールされている PHP のバージョンを変更する

VCCWには、PHP7.0 がプリインストールされていますが、古いバージョンの PHP も利用できるようにしてほしいとのリクエストもちらほら見聞きしますので、VCCW の PHP のバージョンを切り替えるためのシェルスクリプトを作りました。

https://github.com/vccw-team/change-php-version

## 使い方

### 直接コマンドを実行する

最も簡単な方法は、以下のコマンドをゲストマシン内で実行することです。

```
$ curl https://raw.githubusercontent.com/vccw-team/change-php-version/master/run.sh | bash -s -- <php-version>
```

`<php-version>`のところには、`5.6` とか `7.2` とかのバージョン番号を入力してください。

以下の例は、PHP 5.6 をインストールしています。

```
$ curl https://raw.githubusercontent.com/vccw-team/change-php-version/master/run.sh | bash -s -- 5.6
```

### 起動時に自動実行する

VCCW は、`Vagrantfile` と同じディレクトリ内に `provision-post.sh` というファイルがあると、プロビジョニングの最後に自動的に実行します。

この場合、`provision-post.sh` に以下のように記述してください。

```
#! /usr/bin/env bash

set -ex

curl https://raw.githubusercontent.com/vccw-team/change-php-version/master/run.sh | bash -s -- 7.2
```

ファイルの設置が完了したら `vagrant up` か `vagrant provision` を実行してください。

ちなみにこのファイルを `~/.vccw` というディレクトリに設置すると、すべてのマシンのプロビジョニング時に毎回実行されるようになります。

## サポートしている PHP のバージョン

現時点では PHP 5.6 以降です。

PHP のインストールには、`ppa:ondrej/php` を使用しており、これはセキュリティサポートが提供されているバージョンのみをサポートしていきますよとのことなので、古いバージョンを使っている場合はさっさと新しいバージョンにしましょう。

* https://launchpad.net/%7Eondrej/+archive/ubuntu/php/+index?batch=75&memo=75&start=75
* http://php.net/supported-versions.php

## 注意

### 複数バージョンの PHP のインストールについて

複数のバージョンの PHP を入れて何度か切り替えているとセグメンテーションフォールトが出たりしました。

たとえば全部のバージョンの PHP をインストールして、頻繁に切り替えるみたいなユースケースは想定しておりません。

### PHP の mcrypt モジュールについて

PHP の mcrypt モジュールは、10年以上メンテナンスされていないということで、PHP 7.2 から非推奨となりました。

このスクリプトでは、PHP7.2 以外のバージョンでもインストールしておりませんので、必要な場合は各自インストールする必要があります。

（上述の `provision-post.sh` を使用すれば簡単ですよね。）

### VCCW にプリインストールされる PHP のバージョンについて

WordPress 本体が、公式に推奨する PHP のバージョンは、まもなくリリースされる WordPress 4.9.5 から PHP7.2 となります。（動作保証環境は引き続き PHP5.2 以上）

VCCW にプリインストールする PHP のバージョンも、近い内にアップグレードすると思います。
コードを一切書かずにワンパンマン漫画更新を受け取れる仕組み作った

# 前略:green_book:
ワンパンマン、面白いですよね。私は漫画買いつつもWebで最新も追いかけています。
でも……Webの更新、隔週って言ってたのに割と不定期ですよね。。。
急かしたりはするつもりないですけど、更新確認するの面倒くさい。。。

じゃあ、自動通知してもらうか！
ゲームやりつつ通知してくれると嬉しいからDiscordのbotに教えてもらお！

# 仕組み:tools:
タグ見てわかる人はわかると思いますが、IFTTTでRSSの更新拾ってきて、DiscordのWebhookにひっかけただけです。
大層な仕組みを使ったりはしてません。

# やったこと:muscle:
箇条書きでバラして下記にまとめます。
よしなにプログラムなりシステム置き換えるなりで好きにしてください。

- [となりのヤンジャン](https://tonarinoyj.jp/)からワンパンマンのRSSのURLを奪取
- [Discord](https://discordapp.com/)からWebhookのURLを取得
- [IFTTT](https://ifttt.com/discover)のユーザーを登録
- [IFTTT](https://ifttt.com/my_applets)で新しいAppletを追加

# 詳細な解説:writing_hand:

## となりのヤンジャン編
これはぶっちゃけ楽勝です。
ブラウザでワンパンマン見るかと思いますが、ページの情報からフィード引っ張って来るだけ。
となりのヤンジャンの仕様が変わった時がこのシステムが破綻する時ですな。。。

## Discord編
これもわりかし簡単です。

- Discordの各TextChannelsの設定（歯車のボタン）を押す
- Webhooksの項目があるので、その項目を開いて「Webhookを作成」を押す
- Bot名、通知チャンネル、Iconを設定したらWebhookのURLをコピーする
- 保存を押す

※後でWebhookのURLをIFTTTで使うので、ちゃんと保存しておくこと

## IFTTT編
これがいっちゃんめんどい。それでもさほど難しいことではないと思います。
IFTTTのユーザー登録はここでは解説しないから、わからなかったらggってくださいな。
IFTTTのサービスから登録手順まで親切に解説しているサイトは結構あります。
ざっくりいうと、独立している各システムの橋渡しをしてくれる便利なサービスです。

で、Applet作成どうするかという話をしますね。
`this` の設定はRSS Feedを選択して、 `New feed item` を選んでください。
そうすると一箇所入力項目が出てくるので、ここにRSSのURLを突っ込めばOKです。
で、 `that` の方はWebhooksを選択してください。
URLの設定はDiscordで設定で取得したWebhookのURLです。
Methodは `POST` でOK。
Content Typeは `application/json` です。
Bodyはjson形式で、以下のような感じで。

```json

{
   "content":"ワンパンマンの更新がありましたよ！ {{EntryTitle}} {{EntryUrl}}"
}

```

# 独白:grinning:
元々は定時実行をするPythonでシステム構築をするつもりでした。
ですが、discordのbotでループさせつつAPI実行するやり方が~~よくわからなかった~~賢くないと思い、作成中の調査段階で取得していたRSS FeedがあるならソイツからWebhookで渡してやりゃええやんかぁ、と思った次第です。
仕様変更に強く、柔軟な呟きをするためにはコード化は必要なので、気が向いたら発展編として続きをやるかもしれません。
el-select:選択されていない時のスクロールポジションを指定する


年の選択支がおおいので、もっとも選択されやすいと思われる年の位置にスクロールさせる

`ref=yearSelect` で指定した `el-select`

~~~html
<el-select ref="yearSelect" v-model="selectedYear" @change="on_year">
  <el-option v-for="year in years" :label="year_label(year)" :key="year" :value="year"></option>
</select>
~~~

`mounted` で 1990 のあたり(1990が底)にスクロールさせるように設定

~~~js
mounted(){

  this.setScrollPosition(this.$refs.yearSelect, 1990);
  ...
}
~~~

実際の設定:

- `el-select` の `handleMenuEnter` をオーバーライドする
- `scrollToOption` に対して選択されていたらその `el-option` を渡す(デフォルトの処理)
- 選択がない場合、 `getOption(val)` で見つけた `el-option` を渡す

~~~js
methods: {
    setScrollPosition(selector, val){
      selector.handleMenuEnter = function(){
          const opt = selector.selected.value == null ? selector.getOption(val) :selector.selected;
          selector.$nextTick(() => selector.scrollToOption(opt));
      };
    },
    ...
~~~
php の slim framework を docker ですぐ使う

# tl;dr

```
docker pull composer
composer create-project slim/slim-skeleton sample
cd sample
vi docker-compose.yml
docker-compose up
```

# メモ

* composer が既にインストールされてる環境なら docker pull composer は不要
* https://hub.docker.com/_/composer/ にあるとおり、.bashrc に function を書くと便利
* create-project で生成される docker-compose.yml の`command: php -S 0.0.0.0:8080 -t public index.php` だと動かないので、 `command: php -S 0.0.0.0:8080 -t public public/index.php` に直す。これは[本家のトップページ](https://www.slimframework.com/)に書いてあるのと同じ（なぜ生成されたdocker-compose.ymlが間違っているんだ。。。？）
* docker-compose up したら動き出す