OmniAICreator/Qiita-1.07M huggingface dataset:
RedmineのView Customize pluginでチケットの履歴をフィルタ

Redmineでチケットを課題管理に使っていたところ、コメント代わりに追加されていく注記が目立たず、見落としかねないので、「View Customize plugin」を使って注記だけ表示するフィルタ機能を作成してみました。

履歴の上部にリンクが表示され、クリックで全表示、注記のみ表示を切り替えます。


Redmine 3.1.1
redmine-view-customize 1.1.2
https://github.com/onozaty/redmine-view-customize


Path pattern: /issues/[0-9]+ 
Type: JavaScript 
Code: 

```js
$(function() { 
    var $history = $("#history"); 
    var func = function() { 
        var mode = $(this).attr("data-mode"); 
        if (mode == "showAll") {
            $history.find("div.journal").show(); 
            $history.find("div.journal.has-notes").find("ul.details").show(); 
        } else if (mode == "commentOnly") { 
            // 注記を持たない履歴を非表示
            $history.find("div.journal").not(".has-notes").hide();
            // 注記を持つ履歴の注記以外の内容を非表示 
            $history.find("div.journal.has-notes").find("ul.details").hide(); 
        } 
        $("#history").find("span.history_fillter_links a:hidden").show(); 
        $(this).hide(); 
        return false; 
    } 
    var $links = $("<span class='history_fillter_links'></span>").prependTo($history); 
    $("<a data-mode='showAll' href='#' >show All</a>") 
    .appendTo($links).click(func); 
    $("<a data-mode='commentOnly' href='#' >comment Only</a>") 
    .appendTo($links).click(func).click(); // 初期表示時フィルタを有効化
}); 
```

注記が目立つようにStyleSheetも追加

Path pattern: /issues/[0-9]+ 
Type: StyleSheet 
Code: 

```css
#history > div.has-notes div.wiki { 
        margin-left:22px; 
        padding:3px; 
        background-color:#ffffdd; 
        border: 1px solid #d7d7d7; 
}
```
mac osxターミナルが使えなくなって環境設定ファイルと格闘したのでまとめておく

ターミナルが使えなくなりました。
起動すると何やら長文が表示され、その後lsコマンドもcdコマンドも受け付けなくなります。無論プログラミング言語も動きません。

この症状の原因は".bash_profile"ファイルが破損していたことでした。Atomで開いたら文字化けしていました。なんとか復旧しようと試みましたが結局、ファイルそのものを削除することに。
".bash_profile"ファイルは、bashの設定ファイルです。bashとはターミナルを動かしているソフトウェアのようです。bashの環境設定がうまくいかないため、ターミナルが動かなかったようです。ちなみに".bash_profile"は隠しファイルです。

ターミナルがコマンドを受け付けなくなったら、環境設定ファイルが壊れていないか見てみてはいかがでしょうか。
LinuxからSQL Serverを見に行く

せっかくUbuntu 16.04 LTSを導入したので、
FreeTDS関連を新たに試してみる。

## 環境

クライアント

- Ubuntu 16.04 LTS
- 64bitマシン

```:接続イメージ
php7.0-sybase <-> FreeTDS <-> SQL Server

```

## 設定

```bash:Apache_MySQL_PHPをまとめてインストール
$ sudo tasksel install lamp-server
```

なんとPHP 7.0がインストールされます。
Ubuntu、結構攻めてますね。

```bash:php7.0-sybaseを探す
$ apt search php7.0-sybase
```

```bash:php7.0-sybaseをインストール
$ sudo apt install php7.0-sybase
```

```bash:freetdsを探す
$ apt search freetds
```

```bash:freetds関係をインストール
$ sudo apt install freetds-common freetds-bin
```

今回は意図的にcharset=CP932を抜いている。
SQL Server2000以降のcharsetはUCS2固定なので不要とのこと。
[Localization - FreeTDS Users Guide](http://www.freetds.org/userguide/localization.htm)

```conf:freetds.conf
[RDBSERVER]                # hostname になる
   host = 192.168.0.3      # 接続するDBのIPアドレスを入れる
   port = 1433             # SQL Server2000以降、標準のportは1433
   tds version  =  7.3     # SQL Server2005は7.2  2008は7.3 2012は7.4
   client charset = UTF-8  # Client(Linux)側の文字コードセット
```

## tsql実験

### SQL Server 2008R2

- Windows Server 2008
- 日本語データベース名のデータベース
- 接続は可能
- データを呼び出すことができない。

```tsql:データベース接続の様子
1> use 日本語システム
2> go
Msg 911 (severity 16, state 1) from DBSERVER Line 1:
     "Database '日本語シスチE▒▒' does not exist. Make sure that the name is entered correctly."
```
テという文字に問題があるのかもしれない。
文字化けして相手に伝わるので接続ができない。


### SQL Server 2000

- Windows 2000 Server
- DB名はalpabet
- テーブル名やカラム名は日本語
- 繋がりました。
- 3万件以上のデータ表示の問題なし
- 60万件以上のデータはないので試せず。

以前3万件でSegment faultを起こしていたので、freetds.confの
charset=CP932を抜くことで日本語をまともに扱う効果があるのかもしれない。
UIに破線のBorderを追加するExtension

破線のBorderを追加するExtensionです。

```UIView+drawDashedLine.swift

import UIKit

enum DashedLineType {
    case All,Top,Down,Right,Left
}

extension UIView {

    func drawDashedLine(color: UIColor, lineWidth: CGFloat, lineSize: NSNumber, spaceSize: NSNumber, type: DashedLineType) -> UIView {
        let dashedLineLayer: CAShapeLayer = CAShapeLayer()
        dashedLineLayer.frame = self.bounds
        dashedLineLayer.strokeColor = color.CGColor
        dashedLineLayer.lineWidth = lineWidth
        dashedLineLayer.lineDashPattern = [lineSize, spaceSize]
        let path: CGMutablePath = CGPathCreateMutable()

        switch type {

        case .All:
            dashedLineLayer.fillColor = nil
            dashedLineLayer.path = UIBezierPath(rect: dashedLineLayer.frame).CGPath
        case .Top:
            CGPathMoveToPoint(path, nil, 0.0, 0.0)
            CGPathAddLineToPoint(path, nil, self.frame.size.width, 0.0)
            dashedLineLayer.path = path
        case .Down:
            CGPathMoveToPoint(path, nil, 0.0, self.frame.size.height)
            CGPathAddLineToPoint(path, nil, self.frame.size.width, self.frame.size.height)
            dashedLineLayer.path = path
        case .Right:
            CGPathMoveToPoint(path, nil, self.frame.size.width, 0.0)
            CGPathAddLineToPoint(path, nil, self.frame.size.width, self.frame.size.height)
            dashedLineLayer.path = path
        case .Left:
            CGPathMoveToPoint(path, nil, 0.0, 0.0)
            CGPathAddLineToPoint(path, nil, 0.0, self.frame.size.height)
            dashedLineLayer.path = path

        }
        self.layer.addSublayer(dashedLineLayer)
        return self
    }
}

```

こんな感じで使ってください。

```
hogeLabel.drawDashedLine(UIColor.blueColor(), lineWidth: 2, lineSize: 3, spaceSize: 3, type: .All)
```
Sublime Text 3をWindows7にインストールする手順

# やりたいこと

* Sublime Text 3 を Windows7 にインストールする。

# 前提環境

* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64

# インストールするソフトウェア

* Sublime Text 3 x64 beta Build 3114

# 手順

## インストーラをダウンロード

[Sublime Text 3 Download](https://www.sublimetext.com/3) で **Windows 64 bit** を選択し、インストーラをダウンロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/c6033af5-5641-2666-62f0-79590c293bb1.png)

ダウンロードされたインストーラ **Sublime Text Build 3114 x64 Setup.exe** を実行します。

## インストーラを実行

**Next** を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/462f7ec5-9490-48b3-ae4a-a32c26042bf1.png)

**Next** を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/9d4ea1be-7c0e-affa-554c-df72111c58c7.png)

**Next** を選択。
※既にフォルダが存在する場合は、そのフォルダを使用していいか聞かれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/a3ae82b6-813c-824f-0010-1b7cc3b40ee3.png)

**Next** を選択。

※コンテキストメニューに「Sublime Text で開く」を追加したいなら、「Add to explorer context menu」のチェックをON。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/1ad9fe51-3040-92b3-f560-48271da02d8f.png)

**Install** を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/bdf350e9-0b5f-43f2-a128-ad8ea3df78c8.png)

**Finish** を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/38edbb50-f0d3-5230-208e-33d5ca3ec246.png)

# 完了
mp4に変換後の色落ちをffmpegにて軽減する方法

一度動画ファイルを `ffmpeg` にて連番書き出しし、再度 `ffmpeg` にて色空間を指定し再結合する。

```
$ ffmpeg -i input.mov -r 30 output_%5d.png
$ ffmpeg -r 30 -i output_%5d.png -x264opts colorprim=bt709:transfer=bt709:colormatrix=smpte170m output.mp4
```

参考: [ffmpeg - Color Correcting MP4/Webm videos - Stack Overflow](http://stackoverflow.com/questions/13145535/color-correcting-mp4-webm-videos)
conditional breakpoint でconsole.logデバッグをする


もともとXCodeでのtipsとして知ったもの。
conditionに `console.log()` を入れるとその行が実行された時にconsoleにログが出てきます。タイミングが重要なときとかに使えます。

![Screen Shot 2016-06-24 at 19.01.03.png](https://qiita-image-store.s3.amazonaws.com/0/26122/94ff1f6e-1c1b-ce11-88a2-28ec992973ca.png "Screen Shot 2016-06-24 at 19.01.03.png")

同様にトラブルシュートのためにデフォルトの設定を書き換えて実行してほしい時にも使えます。

![Screen Shot 2016-06-24 at 19.03.45.png](https://qiita-image-store.s3.amazonaws.com/0/26122/eb386f7c-1a6c-d334-6a8f-cf6e5f788a7c.png "Screen Shot 2016-06-24 at 19.03.45.png")
Grunt で簡易Webサーバ構築メモ

##概要
grunt を使って簡易的にWebサーバを構築するためのメモです。

##前提条件
・node.js インストール済
・npm インストール済
・grunt-ci インストール済

##手順
① プロジェクトフォルダを作成する。

```
c:\work>mkdir sample
c:\work>cd sample
c:\work\sample>
```
② package.json ファイルを作成する

```
c:\work\sample>npm init
```
※色々聞かれるが全てENTERで進む

③ 以下のプラグインをインストールする。

```
c:\work\sample>npm install --save-dev grunt
c:\work\sample>npm install --save-dev grunt-contrib-connect
c:\work\sample>npm install --save-dev grunt-contrib-watch
c:\work\sample>npm install --save-dev jit-grunt
```

④ gruntfile.js ファイルを作成する。

```js:gruntfile.js'
/*global module*/
module.exports = function (grunt) {

  // Automatically load required Grunt tasks
  require('jit-grunt')(grunt);

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch: {
    },
    // Webサーバ
    connect: {
      server: {
        options: {
          port: 8080,
          base: 'public'
        }
      }
    }
  });
  // タスク
  grunt.registerTask('default', ['connect', 'watch']);
};
```
※ c:\work\sample\ 配下に作成

⑤ 公開用フォルダ（public)を作成

```
c:\work\sample>mkdir public
```

⑥ public フォルダに index.html ファイルを作成する

```html:index.html
<html>
<body>
<h1>Hello Grunt Web Server !!</h1>
</body>
</html>
```
※ index.html は public フォルダに配置

⑦ 以下のコマンドを実行しサイトにアクセスする。

```
c:\work\sample>grunt
Running "connect:server" (connect) task
Started connect web server on http://localhost:8080

Running "watch" task
Waiting...
```

⑧ 以下の URL にアクセスする。

[http://localhost:8080/](http://localhost:8080/)

画面が表示されればOK！！

以上です。

###補足
通常プラグインを使う場合以下のような記述をする必要がある。

```
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-connect');
・・・
```

プラグインの数分読み込む処理を追加しなくてはならないが jit-grunt プラグイン
を使うと以下の行を追加するだけで省略することができる。

```
require('jit-grunt')(grunt);
```

更に起動時の読み込みの速度も速くなるらしい。
※起動時にしか関係ないのであまり関係ないかもしれない。

注意点は jit-grunt で自動的に読み込んでくれないプラグインもあるらしい。
その場合以下のように記述すればよいらしい。

```
require('jit-grunt')(grunt, {
    useminPrepare: 'grunt-usemin',
    ngtemplates: 'grunt-angular-templates',
    cdnify: 'grunt-google-cdn',
    replace: 'grunt-text-replace'
});
```

第二引数に静的に読込むプラグインの記述を追加すればよいらしいです。

補足以上です。
AWS Auto Scalingグループに対するELBのデタッチとアタッチ

1年くらい前の話ですが、AWSでAuto Scalingグループに対するELBのアタッチとデタッチをサポートしました。

https://aws.amazon.com/jp/about-aws/whats-new/2015/06/attach-or-detach-load-balancers-in-your-auto-scaling-group/?nc1=h_ls
http://docs.aws.amazon.com/ja_jp/autoscaling/latest/userguide/attach-load-balancer-asg.html

最近、業務で恩恵にあずかったのでやり方をメモしておきます。

以前までは、Auto Scalingグループに関連付けられているELBは変更することができず、Blue-Green Deploymentの切替を行おうと思ったときには、DNSベース（Route53）の切替しかできませんでした。
しかし、このアップデートELBの切り替えが可能になりました。


#図で解説
###①最初の状態(Blue-Green Deploy後)
![ELB_SWAP_Qiita用1.png](https://qiita-image-store.s3.amazonaws.com/0/53711/fbc8ed61-93b6-493b-6290-19c04d5aa2dc.png)


###②Green環境にELB-Aを接続
####CLI
```aws autoscaling attach-load-balancers --region us-west-2 --auto-scaling-group-name "Auto Scaling group-B" --load-balancer-names "ELB-A"```
![ELB_SWAP_Qiita用2.png](https://qiita-image-store.s3.amazonaws.com/0/53711/f49aa181-987c-e647-96b4-997b67eadec8.png)


###③Green環境に本番切り替え(ELB-AをBlue環境から切り離し、ELB-BをGreen環境から切り離し)
####CLI
ELB-AをBlue環境から切り離し
```aws autoscaling detach-load-balancers --auto-scaling-group-name "AutoScalingGroup-A" --load-balancer-names "ELB-A"```
ELB-BをGreen環境から切り離し
```aws autoscaling detach-load-balancers --auto-scaling-group-name 'AutoScalingGroup-B' --load-balancer-names 'ELB-B'```

![ELB_SWAP_Qiita用3.png](https://qiita-image-store.s3.amazonaws.com/0/53711/d109926a-4410-76d4-3172-e3b2e045116f.png)

#シェルで自動化
上記作業をデプロイ毎に実施しないといけない場合、自動化する必要があります。その際に気をつけることはELB-AがAuto Scaling group-Bに確実に接続されたかを確認後、Auto Scaling group-Aから切り離すことでダウンタイムが無いようにすることです。


#### 参考
http://dev.classmethod.jp/cloud/aws/bluegreen-devployment-by-elb/
phpunitとci-phpunit-testを使ってcodeigniter3をテストしてみた

codeigniter3でテストコードを書いてみました。

【前提】
composerインストール済み

## 1. PJ直下に移動
cd /path/to/codeigniter/

## 2. phpunit インストール
composer require phpunit/phpunit:5.4.6 --dev

## 3. ci-phpunit-test インストール
composer require kenjis/ci-phpunit-test:0.12.1 --dev
php vendor/kenjis/ci-phpunit-test/install.php

## 4. テストファイル作成
僕はひとつのクラスに対して一つのテストクラスを書くようにしました。

```php:application/tests/libraries/user_test.php
class User_test extends TestCase
{
	public function setUp()
	{
		$this->resetInstance();

		// load
		$this->CI->load->library("user");
	}

	/**
	 * user一覧取得
	 */
	public function test_get_users()
	{
		$user_list = $this->CI->user->get_users();

		// id存在チェック
		$this->assertTrue( (isset($user_list[0]) && isset($user_list[0]["id"])) );
	}
}
```

## 5. 実行ファイルを作成
```shell-session:application/tests/run.sh
PHPUNIT="../../vendor/bin/phpunit"
${PHPUNIT} libraries/user_test.php
```
コマンドはPJ直下に移動して実行しないとエラーが起こるっぽい

### エラーに対応
PHPUnit and no code coverage driver available と言われた場合
xdebug が無いのでインストールする。
yum install --enablerepo=remi --enablerepo=remi-php56 php-pecl-xdebug

以上、phpunitとci-phpunit-testを使ってcodeigniterをテストしてみたでしたー
IISにてWebアプリケーションが起動しない場合の対処

IISにAsp.Net MVCのプログラムを配置したのに動かない状況に陥ったときの対処を記録する。

---
<dl>
<dt>症状１）</dt>
<dd>IISをインストールし、Webサイトを追加した後、サイトにアクセスすると「ディレクトリは参照できない設定になっています。 参照可能にするには・・・して下さい。」とエラーが表示される。
</dd>
<dt>症状２）</dt>
<dd>
IISマネージャで .NETコンパイルをダブルクリックすると「folderlevelbuildprovidersが認識できません」とエラー表示される。
</dd>
</dl>
---
#### 推定原因
IISインストール前に.NetFramework4 か.NetFramework4.5をインストールしたためにIISのアプリケーションプールのv4.0.30319が正しく設定されていない状態となっている。
たぶん、IISインストールの前に、VisualStudioをインストールしたため。

---
解決方法
以下を実行する

* 32 bit OSの場合
 * C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis –i
* 64 bit OSの場合
 * C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis –i
S3 で大量のオブジェクトの一部をダウンロードする方法

AWS CLI で CloudFront のログをダウンロードしようとして困ったので。

 * aws s3 cp doesn't work with prefix · Issue #1454 · aws/aws-cli
   * https://github.com/aws/aws-cli/issues/1454

:point_up_2: 上の issue が解決したら、下は読む必要ないと思います。

----

AWS CLI の cp コマンドは include / exclude でオブジェクト名のパターンを指定できる。

```
aws s3 cp s3://foo/bar/ ./ --exclude "*" --include "XXX.2016-06-*" --recursive
```

これで絞り込んでダウンロードできるのだけど、全オブジェクトの一覧をダウンロードするので、遅すぎて使い物にならない。

一方、`ls` は `s3://` の URL にプレフィックスまで含めることができ、こちらは一瞬で取得できる。

```
aws s3 ls s3://foo/bar/XXX.2016-06-
````

`ls` はプレフィックスが使えるのに、`cp` だと使えない ([issue #1454](https://github.com/aws/aws-cli/issues/1454))。
仕方ないので自前でループする。

### CloudFront のログをダウンロードするサンプル

```bash
#! /bin/bash

export AWS_DEFAULT_PROFILE=xxx

BASEURL=s3://path/to/objects
FILTER=XXXXXXXXXXXXXX.2019-05-01

for F in $(aws s3 ls $BASEURL/$FILTER | awk '{print $4}'); do
  echo $F
  aws s3 cp $BASEURL/$F .
done
```

### S3 のログをダウンロードするサンプル

```bash
#! /bin/bash

export AWS_DEFAULT_PROFILE=xxxxx

BASEURL=s3://your-log-bucket-name/path
DOWNLOAD_PATH=./tmp/logs

# FILTER=2020-07-06-13
FILTER=$1

mkdir -p $DOWNLOAD_PATH/$FILTER

for F in $(aws s3 ls $BASEURL/$FILTER | awk '{print $4}'); do
  echo $F
  if [ ! -f $DOWNLOAD_PATH/$FILTER/$F ]; then
      aws s3 cp $BASEURL/$F $DOWNLOAD_PATH/$FILTER/
  fi
done
```
react-dispatcher-decorator で PubSub な Flux


react-dispatcher-decorator というのを作った

```
npm install react-dispatcher-decorator --save
```

## コンセプト

昔作ったArdaのPubSub部分をDecoratorで表現した。https://github.com/mizchi/arda

- [EventEmitterバケツリレースタイル/フレームワークなしで小さくFluxする - Qiita](http://qiita.com/mizchi/items/6a3500e598ec36746509 "EventEmitterバケツリレースタイル/フレームワークなしで小さくFluxする - Qiita")
- [React の Context を使って Flux を実装する - Qiita](http://qiita.com/mizchi/items/ef3fe8a82ce0fb49b52d "React の Context を使って Flux を実装する - Qiita")

この2つを使ってバケツリレーを隠蔽することで、デコレータでPub側とSub側を自然に繋げられるようにした。

[hokaccha/react-micro-container: Micro framework for React](https://github.com/hokaccha/react-micro-container "hokaccha/react-micro-container: Micro framework for React") も多少参考にした。

## Example

```js
import React from "react";
import {dispatcher, subscriber} from "react-dispatcher-decorator";

// This component subscribes events from child components by context
@subscriber((self, subscribe) => {
  subscribe('foo', (prop) => {
    console.log('foo received with', prop);
  });
})
class App extends React.Component {
  render() {
    return <Child/>
  }
}

// This component has this.context.dispatch and it will dispatch to parent subscriber
@dispatcher
class Child extends React.Component {
  render() {
    return <button onClick={() => this.context.dispatch('foo', 1)}>hello</button>
  }
}

import ReactDOM from "react-dom";
const el = document.querySelector(".main");
ReactDOM.render(<App/>, el);
```

Pub側で`@subscriber`デコレータを宣言しながらエミッターを初期化する。意図的に動的には生やしたりはできないようにしている。

`@dipatcher` が付与されたComponentの `this.context.dispatch` は自分の`@subscribe`デコレータを持つ親(何層上でもおｋ)の`subscribe`を発火させる。


## with PromisedReducer

これも自作のライブラリだけど、

https://github.com/mizchi/promised-reducer

を使うと、こんな感じになる。


```js
import React from "react";
import {dispatcher, subscriber} from "react-dispatcher-decorator";
import PromisedReducer from "promised-ruducer";

@subscriber((self, subscribe) => {
  const reducer = new PromisedReducer({count: 0});
  reducer.on(":update", state => self.setState(state)); 
  subscribe('increment', (prop) => {
    reducer.update(state => ({count: state.count + 1}));
  });
})
class App extends React.Component {
  render() {
    return <Child count={this.state.count}/>
  }
}

// This component has this.context.dispatch and it will dispatch to parent subscriber
@dispatcher
class Child extends React.Component {
  render() {
    return <button onClick={() => this.context.dispatch('increment')}> {this.props.count} </button>
  }
}

// 略
```

PromisedReducer はこれまた自分が作った https://github.com/mizchi/flumpt の非同期更新のバッチ処理を最適化する部分を抜き出したもので、要はこの例はFlumptを小さいパーツに分解してデコレータ構文に糖衣して再構築するとこうなる、というもの。

flumpt はSSR対応してなかったんだけど、仕組み上だるかったので、SSRしたいならこういうアプローチでいけるはず。
Progressive Web Apps


# Progressive Web Apps (aka. PWApps)

- モバイルWebアプリをメインターゲット
- ネイティブアプリに近いユーザー体験（オフライン動作や高速なレスポンス性）を
- 漸進的(Progressive)に提供していこうという考え方

https://html5experts.jp/komasshu/19704/

- ref. PRPL pattern: one design pattern to achieve PWApps concept.
 - Push
 - Render
 - Pre-cache
 - Lazy-load

---

# Service Worker

- Progressive?
- ex. Service Worker
 - オフラインWebを実現する最新Web標準技術の一つ
 - 柔軟なキャッシュ制御が可能→リソース（HTMLやJavascriptファイルなど）のロード時間短縮が可能
 - プッシュ通知

- SW is progressive
 - SWに対応していないブラウザ環境においては、従来通りのWebサイトとして提供される

- ref. http://www.html5rocks.com/en/tutorials/service-worker/introduction/

---

# Let's try the tutorial

- Push Notification on web browser (Chrome)
 - https://codelabs.developers.google.com/codelabs/push-notifications/index.html

- What you'll need
 - Chrome 42 or above
 - A basic understanding of git, and Chrome DevTools
 - Experience of Promises and Service Worker would also be useful, but is not crucial
 - The sample code
 - A text editor
 - A terminal window to run command line tools
 - Python or a local web server stack (see below)

- note
 - SW: only in https or localhost
javaの文字列比較

javaで普通に

```java
if(string==null){
}
```

でやったら比較されなかった（初心者）ので皆分かってると思いますけど一応解決策

```java
if(string.equals(null)){
}
```

で比較されるっぽいです

////////////////////追記////////////////////

String型がnullだと上手く比較されない時があったので、そういう時は

```java
if(string.length()==0){
}
```

で文字列その物の長さで比較すると上手くいきました。
String#splitを使うと$~、＄＆等が書き換えられる


String#splitの引数に正規表現を使うと、組み込み変数の

* \$~（最後に成功したマッチのMatchData）
* \$&（最後にマッチに成功した文字列全体）
* \$1、\$2、\$3...（最後に成功したマッチのn番目の括弧に対応する文字列）

等のデータがすべてnilになってしまいます。

```irb
irb(main):001:0> "abc" =~ /(ab)c/
=> 0
irb(main):002:0> [$~, $&, $1]
=> [#<MatchData "abc" 1:"ab">, "abc", "ab"]
irb(main):003:0> "123".split("2")
=> ["1", "3"]
irb(main):004:0> [$~, $&, $1]
=> [#<MatchData "abc" 1:"ab">, "abc", "ab"]
irb(main):005:0> "123".split(/2/)
=> ["1", "3"]
irb(main):006:0> [$~, $&, $1]
=> [nil, nil, nil]
```
文字列で分割する場合は基本的に大丈夫ですが、空文字列（1文字ごとに分割）だと正規表現の場合と同じになってしまいます。

```irb
irb(main):007:0> "abc" =~ /(ab)c/
=> 0
irb(main):008:0> [$~, $&, $1]
=> [#<MatchData "abc" 1:"ab">, "abc", "ab"]
irb(main):009:0> "123".split("")
=> ["1", "2", "3"]
irb(main):010:0> [$~, $&, $1]
=> [nil, nil, nil]
```
Cはよくわからないんですが、ソースをちらっと覗いた感じでは引数が`""`の場合のみ`//`に変換して処理しているっぽいです。

<strike>これってバグなんですかね？仕様？</strike>
いずれにしても、組み込み変数とかわかりにくいしMatchDataオブジェクトを使えってことですね！

<追記>
コメントで、「〈区切り〉を探すので，最後は必ず失敗する」のではないかと指摘をいただきました。
確かに正規表現マッチに失敗すればこれらの変数はnilになります。

ということはもしかして……と思って実験してみました

```irb
irb(main):007:0> "abc" =~ /(ab)c/
=> 0
irb(main):008:0> [$~, $&, $1]
=> [#<MatchData "abc" 1:"ab">, "abc", "ab"]
irb(main):009:0> "12345".split(/[24]/, 3)
=> ["1", "3", "5"]
irb(main):010:0> [$~, $&, $1]
=> [#<MatchData "4">, "4", nil]
```
`split`の第2引数には分割の最大個数を指定できます。
これを指定しなければ文字列の最後までマッチして失敗するが、整数nを指定すればn-1回目のマッチが成功すればそこで終了するのでマッチに失敗しない、という理解で良さそうです。
det( )は行列式の計算で本当に使える？

#det( )
今日まで、行列式の計算はdet()で使ってたが、本日に意外なことを発見した。原因はまだわからない。

|tの設定値|行列式計算1　det()|行列式計算2|
|--:|------------:|------------:|
|10|-0.0025|0|
|100|-8.5178|0|
|1000|1583.648|0|
|10000|6361243|0|

行列式計算1と行列式計算2の差は何なんだろう。
行列式の計算はdet()を使わないほうがよい。
しかし、性質で計算すれば、相当時間がかかる。他のコマンドはあるか知らない。


```r
n <- 3　　#　行列の列の数
t <- 10000　　#　行列の行の数
X <- matrix(0, t, n )
X[,2] <- rep(c(1,3,65,78,1,2,3,4,55), length = t)    # 数列1　値の設定は何でもよい
X[,3] <- rep(c(23,4,6,89,2), length = t)　  # 数列2
X[,1] <- 2 * X[,2] + 5 * X[,3]    # 数列1と数列2の一次結合
In <- t(X) %*% X    # 一次従属の性質で、t(X)%*%X の行列式は0である。
det(In)　　　　#　det()で行列式を計算する。
value <- In[1,1]*(-In[2,3]*In[3,2]+In[2,2]*In[3,3]) -
         In[1,2]*(-In[2,3]*In[3,1]+In[2,1]*In[3,3]) +
         In[1,3]*(-In[2,2]*In[3,1]+In[2,1]*In[3,2])
value　　#　行列式の性質で計算する。
```
複数のRDSから1台のMySQL on EC2にレプリケーションをする方法

自分的メモも兼ねて
# 構成
マイクロサービスの様な、複数のマスターRDSを持つ様な構成で分析用などにslaveを持ちたい場合に、それぞれのRDSについてリードレプリカを作成すると、マスターの個数分だけリードレプリカを作成する必要があり経済的な問題が生じる。
また、分析的な業務ではデータベースを跨いでJOINしたかったりするかもしれないため、一つのMySQLに複数のdatabaseのレプリケーションを受けたい。
# マルチソースレプリケーション
MySQL5.7から導入された、database毎にレプリケーションの設定が出来る機能。
https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html
# 作業
## Read Replicaを作成する
RDSには`FLUSH TABLES WITH READ LOCK`権限が無いため、マスターから以下のようなコマンドでdumpを取得する事が出来ない。
(--master-dataは、CHANGE MASTER分をdumpの最後に付けるオプションだが、これをする為にはFLUSH TABLEしてポジションを取得しないといけない。)

```
$ mysqldump -h example.ap-northeast-1.rds.amazonaws.com -u user -p --single-transaction --master-data --databases sample > sample.sql
Enter password: 
mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user 'user'@'%' (using password: YES) (1045)
```
このため、まずはRead Replicaを作成し、そこからデータをダンプした後、マスターに繫ぐという事をする。

## Read Replicaのレプリケーションを止めてポジションを記録する

Read Replicaが作成出来たら、以下のコマンドでレプリケーションを停止させる。これは、RDSでデフォルトで用意されているプロシージャ。

```
call mysql.rds_stop_replication;
```

レプリケーションが止まったら、`SHOW SLAVE STATUS`でいまのポジションを記録しておく。必要なのはこの二つ。マスターのどのbinlogを読んでいるか、そのbinlogのどこまで読んだか。

```
Master_Log_File: mysql-bin-changelog.090689
Read_Master_Log_Pos: 23395
```

## Read Replicaからdumpを取得し、MySQLに流し込む
レプリを止めたらその状態のデータをmysqldumpで取得して、今回新しくスレーブにしたいMySQLに流し込む。

dumpを取得し、

```
mysqldump -hexample-readreplica.ap-northeast-1.rds.amazonaws.com -u user -p --single-transaction --databases sample > sample.sql
```

流し込み。

```
cat sample.sql | mysql -uroot -p
```

## MySQL側でCHANGE MASTERし、レプリを開始する
流し込みが終わったら、対象のMySQLサーバーにログインしてCHANGE MASTERを打つ。このとき、先ほど記録していたbinlogの値を使用する。
今回はマルチソースでレプリケーションしたいので、FOR CHANNELで固有のチャンネル名を指定する。

```
mysql> CHANGE MASTER TO
  MASTER_HOST='xxx.xxx.xxx.xxx',
  MASTER_USER='repl',
  MASTER_PASSWORD='XXXXXXXXXXX',
  MASTER_LOG_FILE='mysql-bin-changelog.090689',
  MASTER_LOG_POS=23395 FOR CHANNEL 'sample';
```

エラーが出なければ、レプリを再開。この時にもCHANNEL指定。

```
mysql> START SLAVE FOR CHANNEL 'sample';
```

確認。

```
mysql> SHOW SLAVE STATUS FOR CHANNEL 'sample';
```

ここまで問題なければ一つのRDSに関しては終了。
引き続き他のRDSに関しても同じ作業を繰り返せばOK(ただし、CHANNEL名は全て固有の値にする事)。

## (補足) binlogの保持期間について

RDSのbinlogはデフォルトでは必要なくなったら消されてしまうため、ダンプやリストアしている間に消えてしまう事がある。
以下の様に保持期間を伸ばしておくと良い。ちなみに、これもRDSが用意しているプロシージャ。

```
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
```

現在の設定値の確認方法。

```
mysql> call mysql.rds_show_configuration;
```

# まとめ

マルチソースレプリケーションが便利すぎた。
さくらのVPS契約方法

さくらのVPS契約方法についてまとめました。

## はじめに

レンタルサーバーと違い、rootの権限が使え自分好みにカスタマイズした環境が構築できるということで、契約に至りました。
勉強がてら、"構築してはぶっ壊す"を繰り返して、知識を得られたらなと思います。(サーバーの仕組み、rootなどの権限、SSHの知識、コマンド etc...)

## さくらVPSとは?

さくらインターネット株式会社が提供するVPSのサービスです。
VPS(Virtual Private Server)
仮想専用サーバーのことを指します。
専用サーバー並の高機能を安価で利用できるサーバーになります。

## 契約の手順

さくらのVPS、公式サイトへアクセス。
[さくらのVPS](http://vps.sakura.ad.jp/)


![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/2236a3b4-b01c-1c17-ab5c-6d6cd4aa76d1.jpeg)

今回は2Gプラン契約するので「はじめてのVPSなら」欄の2Gの「2週間無料でお試し」のをクリック。


![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/fa9be9f7-c2f8-b27c-ec42-5a2efb1e98c4.jpeg)

今回は、初めてですので、「はじめての方」を選択します。
すでにIDをお持ちの方は「会員IDをお持ちの方はログイン」をクリック。


![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/b5a391b0-ac9c-5239-ed3b-a814c72b0285.jpeg)

プラン選択を選択し、サーバーのリージョン・ゾーンを選択します。
今回は、2Gのプランを選択し、リージョンを石狩にしました。
※プランは登録後変更できないそうで、サーバーを買う長したい場合は別途申し込みが必要になるとのことです。


![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/bfeaa501-d9f3-90c5-7fe0-24df71767f40.jpeg)

ストレージを選択します。
今回は、HDDの200GBを選択しました。


![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/93d62f70-e2a8-e1e2-eca4-bae8673de60c.jpeg)

サーバーの台数を選択し、「カートに入れる」をクリック。


![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/5edfb5d3-cff5-61a3-6513-c8fce8609246.jpeg)

申し込んだプランに間違いが無いか確認する。


![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/e4865e3e-106c-0210-df0b-3f5c0b8eb05f.jpeg)

次に支払い方法を「月額払い」か「年間一括払い」選択し、「お支払い情報の入力」をクリック。
※年払いの方が、1ヶ月分安いです!
今回は、政治的絡み(私的)で「月額払い」にしました。


![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/c21526ca-10c3-81de-9eee-93f2b2da2a9a.jpeg)

さくらインターネット登録をする。
メールフォームを入力し、会員登録を行う。


![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/7e0ac6a4-533f-3cbd-c50f-2f6b2591c7c3.jpeg)

支払い方法を選択する。
先ほどの、「月額払い」を選択し、支払い方法を「クレジットカード」、「銀行払い」、「請求払い」を選択。
今回は、「クレジットカード」の支払いを選択。(クレジットカード払いにすると、2週間無料。)


![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/fd80dc10-ca4e-7245-a3f4-2adbddda675b.jpeg)

使用するクレジットカードの情報を入力し、「お申し込み内容の確認」をクリック。


![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/fad4764d-1f2e-1a57-dbdc-4f4ec7f04a2b.jpeg)

入力確認画面にて入力した情報に間違いが無いか、確認する。


![13.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/6a2c8b80-305f-badf-5a2c-1c5e28f2f09f.jpeg)

最後に、「約款のご確認」に「同意する」にチェックを入れ、「この内容で申し込む」をクリック。


![14.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/878c91f0-945d-d81b-0025-7a544f6e094b.jpeg)

さくらのVPSの契約が完了。
登録情報が記載されているメールが届くので確認する。(10分〜15分?後に受信される。)


## コントロールパネルからログイン

![15.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/c6617315-6875-a89c-c78f-477b41839ac9.jpeg)
メールアドレスに記載されている、情報を入力し、ログインする。
[さくらのVPS - コントロールパネル](https://secure.sakura.ad.jp/vps/#/login)


![16.jpg](https://qiita-image-store.s3.amazonaws.com/0/55848/95fc656a-fdd4-7c13-0a33-f1e426efaa09.jpeg)

コントロールパネルにアクセルできるようになる。


誰でもここまではすんなり行くかと思います。
問題はここからです。。
勉強しながらではありますがサーバー構築をしていきたいと思います。
ビシッ!

## 参考サイト:
[さくらのVPS](http://vps.sakura.ad.jp/)
[さくらのVPSマニュアル](http://www.xn--vps-073b3a72a.com/)
RGテンプレートのtexではまること一覧[TexShopを使う場合]

# tex環境の構築
全て下の記事を参照。El CapitanでのTexShopの利用を想定。
[OS X El CapitanでTeX環境をゼロから構築する方法](http://qiita.com/hideaki_polisci/items/3afd204449c6cdd995c9)

# texのテンプレート
sfc-rgのgithubから拝借
[sfc-rg/resume_template](https://github.com/sfc-rg/resume_template)

# .styファイルを読み込めるようにする
だかしかし、これではコンパイルが通らない。俺はここで詰まった。
.styファイルが読み込まれない。(.styファイルはコマンドの定義が記述されている)
texshopが.styを読めるように適切な場所にファイルを置く必要がある。
```$ mkdir ~/Library/texmf/tex```
```$ mv resume.sty ~/Library/texmf/tex```

# 画像が読まれない
ようわからんがテンプレのままincludegraphicsしたらコンパイルされない。
テンプレにパッケージを足す必要がある。
```¥usepackage{graphicx,layout,url,resume}```
これだと下のエラーがでる。
```File `dvipdfm.def' not found.```
gaphiicxだと通らないので変える。
```\usepackage[dvipdfmx]{graphicx}```
スマホの画面をPCに表示する超カンタンな方法(iphoneをmacbookにQuicktimeplayerで写すよ)

## やりたいこと
スマホの画面をPCに表示させたい。
自分のiphoneの画面を多くの人に見せたい。

## 方法
1. USBでスマホをPCにつなぐ
2. QuickTimePlayerを起動
3. ファイル → 新規ムービー収録(自分の顔が写るはず)
4. 録画ボタンのすぐ横にある「下向き三角」のアイコンを選択
5. カメラの欄で「◯◯のiphone」を選択

## メリット
* 他のアプリが不要
* 無料
* お手軽
* 操作中の録画も可能(というかむしろこのためにあるんだけどね)

## 余談
Googleさんに「スマホ PCに表示」とかでぐぐっても、有料アプリばかり宣伝され、大したノウハウがない。
Yahoo知恵袋やOKWAVEなどでもアプリインストールしなっせと言われて面倒極まりない。

この方法であればQuickTimePlayerを使うだけだからインストールの手間はないし、何よりお金がかからないというのが良い。
Select2でいくつかのoption要素を選択状態にしておく方法

## Select2
Facebookライクなフォームを実現できるJSライブラリ。
検索もできて便利。
https://select2.github.io/

## 選択状態にする

割と簡単にできる

```js
var values = [
    option要素のvalue属性の値,
    option要素のvalue属性の値,
    option要素のvalue属性の値];

$("#select").val(values).trigger("change");
```
とすると、選ばれたoption要素が選択状態になる。
curlを使ってベーシック認証→ユーザーログイン→ファイルダウンロード

# 目的
あるURLからファイルをダウンロードする。
ただし、ベーシック認証とログイン処理が必要。
[※curl](https://ja.wikipedia.org/wiki/CURL)とはHTTPのGET/POSTやらをCUIで行うことができるコマンド(およびライブラリ)

# curlを使った色々
## ベーシック認証
ユーザー名：user
パスワード:password の場合

```
curl -u user:password http://example.com
```

## パラメータを含むGET
パラメータ1: param1
値1: 123
パラメータ2: param2
値2: 345

```
curl http://example.com/hogehoge.cgi -d param1=123 -d param2=345
```

URLに?param1=123とかつなげることも可能だが、
複数パラメータの場合は & をエスケープでフォローしないといけない。

## セッション保持

ログインするユーザー名：Abe
パスワード:ebA（ひどい）

```
curl -c cookie.txt http://example.com/login.cgi -d name=Abe password=ebA
```

## ファイルのダウンロード

```
curl -L http://example.com/file.cgi -d name=hoge.bin -o hoge.bin
```

# まとめ

**ベーシック認証→ユーザーログイン→ファイルダウンロード**
ユーザーログインのパラメータをPOSTした後、
cookieを保存しておいてからファイルをダウンロード。
成功すると、hoge.binのファイルが取得できる。

```
curl -c cookie.txt -u user:password http://example.com/login.cgi -d name=Abe password=ebA
curl -b cookie.txt -u user:password http://example.com/file.cgi -d name=hoge.bin -o hoge.bin
```
railsのviewで特殊文字を表示したい


railsのプロジェクトのviewで特殊文字をlink_toで使いたかったのですが、そのまま書いただけではエスケープされてしまってうまく表示できませんでした。


```slim:html.slim
= link_to 'ここに&nbsp;スペース', hoge_path
```

```lang:結果
ここに&nbsp;スペース
```

このように文字列で出力されてしまいました。
いろいろググッた結果解決策を発見。


```slim:html.slim
= link_to 'ここに&nbsp;スペース'.html_safe, hoge_path
```

```lang:結果
ここに スペース
```

文字列のあとに`.html_safe`を追加すると特殊文字も意図したように出力できるようです。
皆さんお試しあれ〜。
Swift のカスタムオブジェクトを print する時に key: value 形式で表示させる

Swift のカスタムオブジェクトを print すると、デフォルトだとクラス名が表示されるはず。

これを key: value のように求める形で表示させるには description プロパティをいじればいいのだが、全てのカスタムクラスに実装するのは大変なので、今回 NSOjbect を継承するクラスを作って、そのクラスを継承させることで解決するアプローチを取ってみた。

具体的には以下の様なコード。Mirror の children を map で回して key: value 形式の文字列を返して、できた配列を改行コード（\n）でつないだものを return している。

[tanabee/CustomObject.swift](https://gist.github.com/tanabee/3326172e7664bf01990a11190343c88a)

```
import UIKit

class CustomObject: NSObject {

    override var description: String {
        let mirror = Mirror(reflecting: self)
        return mirror.children.map { (element) -> String in
            let key = element.label ?? "Undefined"
            let value = element.value
            if value is CustomObject || value is NSArray {
                return "\(key): \(value.dynamicType)"
            } else {
                return "\(key): \(value)"
            }
        }.joinWithSeparator("\n")
    }

}
```

A というクラスを key: value で吐かせるためには以下のように設定すれば良い

```
class A: CustomObject {
// クラス実装
}
```

なにか他に良い実装方法知ってる方いたら教えて下さい〜。
フロントエンドエンジニアが暇なときにやると良いかもしれないこと

（ゆるいスキルアップ的な意味で）フロントエンドエンジニアが暇なときにやると良いかもしれないこと。

主観です。「これが良いよ！」というのがありましたら、ぜひ教えて下さい🙇

- [W3C](https://www.w3.org/)を読む
- [whatwg](https://whatwg.org/)を眺める。
    - [↑のissueを見る](https://github.com/whatwg/html/issues)
- [MDN](https://developer.mozilla.org/ja/)を読む
    - [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
    - [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS)
    - [Web API](https://developer.mozilla.org/en-US/docs/Web/Reference/API)
- [NodeのAPI](https://nodejs.org/api/)を読む
- [caniuse](http://caniuse.com/)を見る
- [npm](https://www.npmjs.com/)パッケージを眺める
    - [starが多い順 パッケージ一覧](https://www.npmjs.com/browse/star)
    - [↑で１位のexpressが使っているパッケージ](https://github.com/expressjs/express/blob/master/package.json)
- スライドを読む
    - [node学園](http://nodejs.connpass.com/presentation/)
    - [React.js Meetup](http://reactjs-meetup.connpass.com/presentation/)
- Mediumを読む
    - [JavaScriptタグの記事](https://medium.com/tag/javascript)
    - [FrontEndタグの記事](https://medium.com/tag/frontend)
- Twitterで著名人をフォローする
    - TBD
    - @addyosmani
    - @LeaVerou
    - @paul_irish
    - @BrendanEich
- Podcastを聞く
    - [Mozaic.fm](https://mozaic.fm/)
    - [Front-end Five](https://frontendfive.codeschool.com/)
    - [5minutes JavaScript](https://fivejs.codeschool.com/)
    - [JavaScript Jabber](https://devchat.tv/js-jabber)
- カンファレンスの動画を見る
    - [JSConf YouTube](https://www.youtube.com/user/jsconfeu)
- メルマガを読む
    - [HTML5 Weekly](http://html5weekly.com/)
    - [JavaScript Weekly](http://javascriptweekly.com/)
    - [Node Weekly](http://nodeweekly.com/)
    - [Mobile Web Weekly](http://mobilewebweekly.co/)
Ruby の case でワイルドカードのようなのが欲しい

Scalaなら  switch case で case("a", _)ってできるのだけど、
rubyだとできないので無理矢理やってみた。

~~~ruby
_ = Object.new
def _.==(obj)
  true
end


[ ["a", 1], ["a", 2], ["b", 1], ["b", 2], ["c",  1], ["c", 3] ].each do |v|
  pattern = case v
    when ["a", 1 ] then "a,1"
    when ["a", _ ] then "a,*"
    when [_  , 1 ] then "*.1"
    when ["c", 1 ] then "c.1"  # not match
    when [_  , _ ] then "*.*"
    else "Not reach becase of [Any, Any] match all"
  end
  puts "#{v} => #{pattern}"
end
~~~

実行結果

~~~
["a", 1] => a,1
["a", 2] => a,*
["b", 1] => *.1
["b", 2] => *.*
["c", 1] => *.1
["c", 3] => *.*
~~~

_ って変数名普通に使っていいのだろうか？
anyとかの別の変数にしてもいいけど。
【Linux】ファイルやディレクトリのアクセス権限（パーミッション）を再帰的に変更する

#【Linux】ファイルやディレクトリのアクセス権限（パーミッション）を再帰的に変更する
***メモ：所有者のみ書き込み可能にする***

・chmodコマンドを実行する
```chmod 変更したい権限 -R  ディレクトリorファイル
```
・コマンド例
```chmod 755 -R  /var/www/htdocs/test/
```
上記の例を実行すると、/var/www/htdocs/test/以下のファイル、ディレクトリが
その所有者は読み出せて、書き込めて、実行できる
そのグループは、読み出せて、実行できる
その他のユーザは、読み出せて、実行できる
となる。
Python ダイクストラ法 ( Dijkstra's algorithm ) で最短経路を求める

最短経路問題を[ダイクストラ法](https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%88%E3%83%A9%E6%B3%95)を用いて解きます。

```
(ダイクストラ法についてWikipediaより)
ダイクストラ法（だいくすとらほう、英: Dijkstra's algorithm）はグラフ理論における
辺の重みが非負数の場合の単一始点最短経路問題を解くための最良優先探索によるアルゴリズムである。
辺の重みに負数を含む場合はベルマン-フォード法などが使える。辺の重みが全て同一の非負数の場合は
幅優先探索が速く、線形時間で最短路を計算可能である。
また、無向グラフで辺の重みが正整数の場合は、Thorupのアルゴリズムによって
線形時間での計算が可能であるが、実用性はあまり高くない。
```

ダイクストラ法は「ノード1」からの距離が短い順に各ノードを探索していき、特定のノードの最短距離を探索します。
感覚的に、候補を絞るという点で[Python ナップザック問題を分枝限定法( branch and bound )で解く](http://qiita.com/shizuma/items/b0752fd4cd39583d7e54)で使った分枝限定法と似た感覚もありました。

コードに関して不備や改良案等があればご教示頂けますと幸いです。


# 問題

以下のような経路があります。ノードが1~5まで5点あり、経路上の数字は必要時間です。
「ノード1」から「ノード5」に到達するための最短経路を求めよ。

![dikstra.png](https://qiita-image-store.s3.amazonaws.com/0/40796/ec7845cc-e08c-e7c4-ff8a-6deb30b66728.png)

# 解答

```py3
import math

route_list = [[0, 50, 80, 0, 0], [0, 0, 20, 15, 0 ], [0, 0, 0, 10, 15], [0, 0, 0, 0, 30], [0, 0, 0, 0, 0]] # 初期のノード間の距離のリスト

node_num = len(route_list) #ノードの数

unsearched_nodes = list(range(node_num)) # 未探索ノード
distance = [math.inf] * node_num # ノードごとの距離のリスト
previous_nodes = [-1] * node_num # 最短経路でそのノードのひとつ前に到達するノードのリスト
distance[0] = 0 # 初期のノードの距離は0とする

# @GDaigo さんのコメントより関数の追加 2017/03/18
def get_target_min_index(min_index, distance, unsearched_nodes):
    start = 0
    while True:
        index = distance.index(min_index, start)
        found = index in unsearched_nodes
        if found:
            return index
        else:
            start = index + 1

while(len(unsearched_nodes) != 0): #未探索ノードがなくなるまで繰り返す
    # まず未探索ノードのうちdistanceが最小のものを選択する
    posible_min_distance = math.inf # 最小のdistanceを見つけるための一時的なdistance。初期値は inf に設定。
    for node_index in unsearched_nodes: # 未探索のノードのループ
        if posible_min_distance > distance[node_index]: 
            posible_min_distance = distance[node_index] # より小さい値が見つかれば更新
    target_min_index = get_target_min_index(posible_min_distance, distance, unsearched_nodes) # 未探索ノードのうちで最小のindex番号を取得
    unsearched_nodes.remove(target_min_index) # ここで探索するので未探索リストから除去

    target_edge = route_list[target_min_index] # ターゲットになるノードからのびるエッジのリスト
    for index, route_dis in enumerate(target_edge):
        if route_dis != 0:
            if distance[index] > (distance[ target_min_index] + route_dis):
                distance[index] = distance[ target_min_index] + route_dis # 過去に設定されたdistanceよりも小さい場合はdistanceを更新
                previous_nodes[index] =  target_min_index #　ひとつ前に到達するノードのリストも更新

# 以下で結果の表示

print("-----経路-----")
previous_node = node_num - 1
while previous_node != -1:
    if previous_node !=0:
        print(str(previous_node + 1) + " <- ", end='')
    else:
        print(str(previous_node + 1))
    previous_node = previous_nodes[previous_node]

print("-----距離-----")
print(distance[node_num - 1])
```

# 結果

```
-----経路-----
5 <- 3 <- 2 <- 1
-----距離-----
85
```
GPG key pairを作って公開鍵を表示する


# gnupg2を入れる
```
$ brew install gnupg2
```

# key pairを作る
```
$ pgp2 --gen-key
適当に質問に答える
```

# 公開鍵を表示する
```
$ gpg2 --armor --export <key作成時に入力したメールアドレス>
```

# 登録されているkeyをすべて表示する
```
$ gpg2 --list-keys 
```

# 参考
gpg2(1): OpenPGP encryption/signing tool - Linux man page
http://linux.die.net/man/1/gpg2

GnuPG2のインストールと各種コマンド – PC-UNIUX:Linux OSのインストール・サーバ構築入門
http://linux.tsutomuonoda.com/gnupg2-install-command/

Exporting your Public Key
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Step_by_Step_Guide/s1-gnupg-export.html
cfコマンドがRuby on Railsのディレクトリでエラーになる

Cloud9上からIBM BluemixにRuby on Railsのappをアップロードするために、cfコマンドをインストールしたが下記のエラーになって、コマンドが使えなかった。

```
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/specification.rb:2158:in `method_missing': undefined method `this' for #<Gem::Specification:0x60f89c cf-5.4.7> (NoMethodError)
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/specification.rb:1057:in `find_active_stub_by_path'
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:64:in `require'
        from /usr/local/rvm/gems/ruby-2.3.0/gems/cf-5.4.7/bin/cf:8:in `<top (required)>'
        from /usr/local/rvm/gems/ruby-2.3.0/bin/cf:23:in `load'
        from /usr/local/rvm/gems/ruby-2.3.0/bin/cf:23:in `<main>'
        from /usr/local/rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `eval'
        from /usr/local/rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `<main>'
```

色々やってみると、普通のディレクトリ上ではcfコマンドが動くのに、Gemfileがあるディレクトリでは動かないように見える。
調べてみるとrubygems自体のバグのようで、アップデートすると使えるとのこと。rubygemsのアップデート手順は以下。

* rubygemsのアップデートモジュールをインストール

```
> gem install rubygems-update
Fetching: rubygems-update-2.6.6.gem (100%)
Successfully installed rubygems-update-2.6.6
1 gem installed
```

* rubygemsのアップデート

```
> update_rubygems
RubyGems 2.6.6 installed
...
...
RubyGems installed the following executables:
/usr/local/rvm/rubies/ruby-2.3.0/bin/gem
```

この後、cfコマンドを実行すると上手く行きました。
.cf/config.json: permission deniedの場合の対応

bluemix を使うためにcf-cliをインストールした後、
コマンドラインで、bluemix api https://api.ng.bluemix.net
を実行した際に、以下のようなエラーが出た場合の対応です。


panic: Config error: open /Users/xxxxx/.cf/config.json: permission denied


> sudo chmod 777 .cf/config.json

参考）
http://stackoverflow.com/questions/35669001/getting-permission-denied-error-when-running-cf-command-on-mac-os-x
[VB.NET][Visual Studio 2015]asyncが付いている非同期メソッドをテストする

`async`が付いている非同期メソッドをテストする話です。

# 環境

- Visual Studio 2015 Community Update 2
- VB.NET

# 前提

例えば、こんな感じに定義された非同期メソッドがあったとします。

```vbnet:Foo.vb
Public Class Foo
    Public Async Shared Function BarAsync() As Task
      ' ...
    End Function
End Class
```

# 動かないテスト

そこでこのようなテストを書きました。

```vbnet:FooTest.vb
<TestClass()>
Public Class FooTest
    <TestMethod()>
    Public Sub TestBarAsync()
        Foo.BarAsync()
    End Sub
End Class
```

が、何が起こってもテストは成功したと報告してきます。
asyncのせいです。

# 実行されないテスト

そこで非同期メソッド呼び出し部分にAwaitを付けると、テストが実行されません。

```vbnet:FooTest.vb
<TestClass()>
Public Class FooTest
    <TestMethod()>
    Public Async Sub TestBarAsync()
        Await Foo.BarAsync()
    End Sub
End Class
```

よく見ると、こんなメッセージが出ています。


> Method TestBarAsync defined in class FooTest does not have correct signature. Test method marked with the [TestMethod] attribute must be non-static, public, return-type as void  and should not take any parameter. Example: public void Test.Class1.Test(). __Additionally, return-type must be Task if you are running async unit tests. Example: public async Task Test.Class1.Test2()__

テストメソッドをasyncにしたときは、Taskを返さないといけないです。

# Taskを返す

テストメソッドをSubからFunctionにして、戻り値をTaskにしたところ動きました。

```vbnet:FooTest.vb
<TestClass()>
Public Class FooTest
    <TestMethod()>
    Public Async Function TestBarAsync() As Task
        Await Foo.BarAsync()
    End Sub
End Class
```

# 参考リンク

- 非同期プログラミング 非同期コードの単体テスト 
https://msdn.microsoft.com/ja-jp/magazine/dn818493.aspx
- async awaitを使ったテストの単体テスト
http://blog.okazuki.jp/entry/20120910/AsyncAwait_UnitTest
rails migration

```rb
Loading development environment (Rails 3.1.1.rc1)
1.9.3-p551 :001 > require 'rails/generators/migration'
 => true 
1.9.3-p551 :002 > class A
1.9.3-p551 :003?>   include Rails::Generators::Migration
1.9.3-p551 :004?>   end
 => A 
1.9.3-p551 :005 > A.current_migration_number("./db/migrate")
 => 20160428053853 
```

https://github.com/rails/rails/blob/master/railties/lib/rails/generators/migration.rb#L22-L26

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L906-L912

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/railties/databases.rake#L57-L60

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L1121-L1135

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L1177-L1187

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L1204-L1219

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L1277-L1283

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L1285-L1287

```rb
ActiveRecord::Base.connection.supports_ddl_transactions?
ActiveRecord::Base.connection.supports_migrations?
```

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L360-L363
JenkinsのSlaveからのjnlp連携を非LB経由で行う

ロードバランサー(LB)の先にあるjenkinsサーバにjnlp接続しようとすると、LBでiptableなどでのポートフォワードが必要になる。
ローカルネットワークの場合、直接jenkinsサーバに接続した方が楽なのでjnplファイルにargumentを追加して直接アドレスを指定する方法

jenkinsの設定でも可能なのだけど、ここでは直接jnlpファイルを編集します。

jenkinsからダウンロードしたslave-agent.jnlpをテキストエディタで開き
application-descにargument　-tunnel　と　jenkinsサーバのIPアドレス:PORTを追加する。

※ちなみに、jnlpファイルは、1行でないと動かないので嵌らないように！

```slave-agent.jnlp
<jnlp spec="1.0+" codebase="https://myjenkins.com/computer/slave01/">
    <information>
        <title>
            Agent for slave01
        </title>
        <vendor>
            Jenkins project
        </vendor>
        <homepage href="https://jenkins-ci.org/">
        </homepage>
    </information>
    <security>
        <all-permissions>
        </all-permissions>
    </security>
    <resources>
        <j2se version="1.7+">
            <jar href="https://myjenkins.com/jnlpJars/remoting.jar">
                <property name="hudson.showWindowsServiceInstallLink" value="true">
                </property>
            </jar>
        </j2se>
    </resources>
    <application-desc main-class="hudson.remoting.jnlp.Main">
        <argument>
            23ebc8e1da6d111da63b3c9770cb1ea79136cf45e937fd9815c188cacbbfe9c4
        </argument>
        <argument>
            slave01
        </argument>
        <argument>
            -url
        </argument>
        <argument>
            https://myjenkins.com/
        </argument>
        <argument>
            -tunnel
        </argument>
        <argument>
            10.102.55.101:9000
        </argument>
    </application-desc>
</jnlp>
```
debian8にpuredata vanilla0.47をセットアップ

puredataでシリアル通信するためにcomportオブジェクト使おうと思って

puredata-extendedをインストールしようとして、http://puredata.info/docs/faq/debian
にあるようにやろうと思ったら、、jessieの表記が無い、、
ちょっと調べてみるとpuredata-extendedは下記の様な状態らしい、、

http://puredatajapan.info/?p=2062

なのでここにあるように、puredata-vanillaを入れてdekenでcomportを追加しようと
早速下記を実行

sudo apt-get install puredata

サイトにあるように、helpからfind-externalsから、、と思ったら無い、、
dekenがセットされているのはpuredata0.47かららしい。

debianとしては、0.47はtesting（試験版）らしいのでapt-getでは0.46がインストール
されてしまう。

いいのか悪いのかわからないけど/etc/apt/sources.listにtestingのリポジトリを追加
するために下記の一文を追加

deb http://ftp.jp.debian.org/debian testing main contrib non-free

追加後に下記のコマンド実施

sudo apt-get update
sudo apt-get install puredata/testing

なんか他のパッケージがモリモリ更新された。。（pythonも3.5になったよ、、）

puredataが入ったら、sources.listに付け加えた一文を削除しておきました

無事puredataにcomportが追加出来ました。gemも簡単に入るみたい


※なぜだか日本語入力のibus-mozcが消えていて日本語入力できなくなった。
sudo apt-get install ibus-mozcで入れて適当に設定してOK

★追加★
raspberry piでも、何もせずにapt-getでpuredata入れようとすると
0.46しか入りません
/etc/apt/sources.listに
deb http://mirrordirector.raspbian.org/raspbian testing main contrib non-free rpi　を加えると入れれます。
xUnitのIClassFixtureを使ってappsettings.json内の設定値を読み込む

# 概要

.NET Coreの開発で[xUnit](https://xunit.github.io/)を利用してユニットテストをしているとき、テストの中からappsettings.jsonや[UserSecrets](https://docs.asp.net/en/latest/security/app-secrets.html)の設定値を読み込みたい、というニーズがあると思います。

xUnitのテストケースクラスが`IClassFixture<TFixture>`を実装していると、xUnit runnerがテストの実行前に`TFixture`をインスタンス化してテストケースクラスのコンストラクタに渡してくれます[^1]（他のユニットテストフレームワークで言うところの`setup()`のようなものを想像してもらえれば）。
それを利用して、`TFixture`側でappsettings.jsonやUserSecretsを読み込み、テストケースに渡すような実装をしてみます。

# 実装例

## appsettings.jsonやUserSecretsを読み込むTFixtureのコード例

```csharp
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.PlatformAbstractions;

public class AppSettingsFixture : IDisposable
{
	public IConfigurationRoot Configuration { get; private set; }
	public AppSettingsFixture()
	{
	    var builder = new ConfigurationBuilder()
	            .SetBasePath(PlatformServices.Default.Application.ApplicationBasePath)
	            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
	            .AddEnvironmentVariables()
	            .AddUserSecrets()
	            ;

	    Configuration = builder.Build();
	}

	public void Dispose()
	{
	    Configuration = null;
	}
}
```


## appsettings.jsonとUserSecretsを利用するためにproject.jsonに変更を加える

[.NET Core RC2](https://dot.net/)のUserSecretsの実装では、UserSecretsを読み込むためにproject.json内の`userSecretsId`設定値が必要となっています[^2]。
そのため、project.jsonとappsettings.jsonの2つのファイルがビルドのOutputディレクトリにコピーされるように、project.jsonのbuildOptions:copyToOutput設定値を次のように変更します。

```json
{
  "buildOptions": {
    "copyToOutput": {
      "include": [ "appsettings.json", "project.json" ]
    }
}
```


## テストケース側でAppSettingsFixtureを受け取る

```csharp
public class SomeTest: IClassFixture<AppSettingsFixture>
{
	private readonly AppSettingsFixture _appsettingsFixture;

	public SomeTest(AppSettingsFixture _appsettings)
	{
	    _appsettingsFixture = _appsettings;
	}

	[Fact]
	public void ItShouldWork()
	{
	    // テストケース内で次のようにアクセス出来る。
	    // _appsettingsFixture.Configuration
	}
}
```


# 備考

[^1]: [Shared Context between Tests - Class Fixtures; when you want to create a single test context and share it among all the tests in the class, and have it cleaned up after all the tests in the class have finished.](https://xunit.github.io/docs/shared-context.html#class-fixture)
[^2]: [Using user secrets with dotnet cli requires publishing the project.json file](https://github.com/aspnet/UserSecrets/issues/62)
【PHP】よくあるエラーと対処法

少しづつまとめていく予定

PHP Fatal error:  Cannot redeclare


##Notice Error: Use of undefined constant XXXXX - assumed 'XXXXX'

定数がないというエラー。$忘れの場合多い。


参考
[[PHP]よくあるエラーメッセージの原因と対処法1](http://php-archive.net/php/error-message/)
[[PHP]よくあるエラーメッセージの原因と対処法 2](http://php-archive.net/php/error-message-2/)
aws-cliの結果をリダイレクト/パイプしようと思ったときに文字化けするときの対策

こんな感じで、aws cliからコマンドをうつと、こんな感じになります（コマンド、出力はダミーです）。

```shell-session
$ aws s3 ls --recursive bucket/photo/1/
2014-05-06 16:45:30      11979 photo/1/20140506164529_スクリーンショット 2014-01-28 15.27.48.png
```

ところが、これにたとえば以下のようなコマンドに変えると、とたんに面倒くさいことになります。

```shell-session
$ aws s3 ls --recursive bucket/photo/1/ | tee /dev/null
2014-05-06 16:45:30      11979 photo/1/20140506164529_????????? 2014-01-28 15.27.48.pn
```

化けた！

なお、リダイレクトでファイル出力したときにも同じ現象が発生します。

対策
-----

原因は`aws`コマンドを実装しているPython処理系にあります。Pythonは出力先に応じて文字コードを合わせてくれるのですが、リダイレクトやパイプの場合には、出力先の文字コードがわからないので、強制的にASCIIではき出してくれるのです！！！ <del>余計なまねを！！！</del>

対策としては、`PYTHONIOENCODING`という環境変数・シェル変数を定義しておけばいいです。

```shell-session
$ PYTHONIOENCODING=UTF-8 aws s3 ls --recursive bucket/photo/1/ | tee /dev/null
2014-05-06 16:45:30      11979 photo/1/20140506164529_スクリーンショット 2014-01-28 15.27.48.png
```