OmniAICreator/Qiita-1.07M huggingface dataset:
郵便番号から住所と緯度経度取得

## 郵便番号のフォーム

```sample.html
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script> 
<script src="https://maps.googleapis.com/maps/api/js?key={googleから取得したkey}"></script>
<script src="path/to/map.js"></script>
</head>
<body>
<label>郵便番号</label>
<input class="form-control" id="zip1" placeholder="000" name="zip1" type="text" value="">
<input class="form-control" id="zip2" placeholder="0000" name="zip2" type="text" value="">
</body>
```

## Javascript
```map.js
$(function(){
    $('#zip2').keyup(function() {

        if ($('#zip1').val().length != 3) {
            return false;
        }
        if ($('#zip2').val().length != 4) {
            return false;
        }

        var zip = $('#zip1').val() + $('#zip2').val();
        console.log(zip); // 1020071
        $.ajax({
          type : 'get',
          url : '//maps.googleapis.com/maps/api/geocode/json',
          crossDomain : true,
          dataType : 'json',
          data : {
            address : zip,
            language : 'ja',
            sensor : false
        },
        success : function(resp){
          if(resp.status == "OK"){
            var obj = resp.results[0].address_components;
            if (obj.length < 5) {
              return false;
            }
           
            var address = obj[3]['long_name'] + obj[2]['long_name'] + obj[1]['long_name'];
                  // console.log(address); // 東京都千代田区富士見
                  attrLatLngFromAddress(address);
            } else {
                  return false;
            }
          }
        });
    });

    function attrLatLngFromAddress(address){
        var geocoder = new google.maps.Geocoder();
        geocoder.geocode({'address': address}, function(results, status){
            if(status == google.maps.GeocoderStatus.OK) {
                var lat = results[0].geometry.location.lat();
                var lng = results[0].geometry.location.lng();
                // 小数点第六位以下を四捨五入した値を緯度経度にセット、小数点以下の値が第六位に満たない場合は0埋め
 
                console.log((Math.round(lat * 1000000) / 1000000).toFixed(6)); // 緯度
                console.log((Math.round(lng * 1000000) / 1000000).toFixed(6)); // 経度
            }
        });
    }
});
```
単にPCから指定した文字列を、USB接続したChibi:bitに表示する

PC内の情報を電光掲示板的に表示したい場合などに。

Chibi:Bit側プログラム

```javascript:
basic.forever(() => {
    basic.showString(serial.readLine())
})
basic.showString("WAKE UP")
```

PC側プログラム

```
$ ruby -e 'com1=open("/dev/ttyACM0", "r+");com1.write "HELLO WORLD\n";com1.close'
```

openするデバイス名は、以下の方法で特定する。

```
$ dmesg | grep cdc
[167938.528490] cdc_acm 3-3:1.1: ttyACM0: USB ACM device
```

もし、下記のように「Permission denied」になる場合は、chmodする。

```
-e:1:in `initialize': Permission denied - /dev/ttyACM0 (Errno::EACCES)
	from -e:1:in `open'
	from -e:1:in `<main>'
```

```
$ chmod a+rw /dev/ttyACM0
```

公式で紹介されているscreenを使った方法では、キャリッジリターンの処理が合わないのか、うまく表示されませんでした。
AWSでjupyter

## これなーに
GPUが無いローカル環境でディープラーニングをやろうとすると、遅くてストレスマッハ。
一方GPUを簡単に使えるAWSでやろうとすると、IDEの無い状態(vimやemacs)でコードを書かないといけなくて辛い。
なので、AWS上でjupyterを使って多少楽にかけるようにしてみる。

## jupyterのよさ
tabで補完できる。以上！
まぁseabornとかでグラフィカルに見えるとか、pandasで表がいい感じに見えるとかそういうのもある。他人に喋るとき楽。とか

## やってみる
```
# jupyterインストール
pip install jupyter

# jupyterの設定ファイル等の生成
jupyter notebook --generate-config
  # rootユーザーでやると、それやめたほうがいいよって出る。別にいいやって場合は--allow-rootを追加でつける。

# ローカルからの接続設定
vi ~/.jupyter/jupyter_notebook_config.py

# 以下を追加
c.NotebookApp.ip ='*' # 接続元のIP制御
c.NotebookApp.port = 8888 # 接続元のポート制御

jupyter notebook --allow-root
```

あとは、AWSのセキュリティグループで接続元のグローバルIPとポート：8888を許可してあげれば、OK。

これでjypyter上でcaffeやkerasなどなどを好きに使って、GPU有りな形でコーディングできる。
Visual Studio / WPF > Binding > RelativeSource PreviousData の実装例

```動作環境
Visual Studio 2017 Community (以下VS)
Windows 7 Pro (32bit)
```

RelativeSource  関連を学習中。

参考1: http://www.cnblogs.com/xieyong_198510/p/3437217.html
> 2.PreviousData 模式：

上記のコードはそのままでは実行に失敗した。
> 名前空間プレフィックス "Collection"が定義されていません。

上記のエラーに関しては詳細はスキップ。

以下をさらに参考にした。

参考2: https://stackoverflow.com/questions/1508035/how-to-populate-a-liststring-in-xaml
参考3: https://stackoverflow.com/questions/4739357/is-it-possible-to-make-an-liststring-a-static-resource-in-xaml

### code

以下を実装してみた。

```MainWindow.xaml
<Window x:Class="_170528_t1430_binding_previousData.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170528_t1430_binding_previousData"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <x:Array x:Key="listItems" Type="sys:String" 
            xmlns:sys="clr-namespace:System;assembly=mscorlib">
            <sys:String>One</sys:String>
            <sys:String>Two</sys:String>
            <sys:String>Three</sys:String>
        </x:Array>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{StaticResource ResourceKey=listItems}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding}"/>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource PreviousData}}" Margin="15 0 0 0"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>
```

<img width="393.75" alt="2017-05-28_15h29_46.png (15.0 kB)" src="https://img.esa.io/uploads/production/attachments/6206/2017/05/28/21741/ef27077d-b047-4421-8934-268047ab19a7.png">

どういう使い方をするかは今は知らなくて良いとしておく。

### エラー > 名前空間プレフィックス "Collection"が定義されていません。
(追記 2017/06/04)

> 名前空間プレフィックス "Collection"が定義されていません。

について、コードを見直すとリンク先では以下の行があった。

```
xmlns:collection="clr-namespace:System.Collections;assembly=mscorlib"
```

この定義がなかったためのエラーなのかもしれない。
MySQL TRUNCATEで数値の切り捨てる

# :raised_hand:1の位を切り捨てたい
```1234.56``` のような数値を```1230```に丸めたい！
ググってみると、TRUNCATE()という関数がありました。
しかし、TRUNCATEといえばTRUNCATE TABLE。（僕の中では）
全部消えるのでは？:thinking:
いや、全然そんなことなかったです。
[MySQLリファレンスはこちら](https://dev.mysql.com/doc/refman/5.6/ja/mathematical-functions.html#function_truncate)

# :writing_hand:書き方
## 小数点を切り捨て
第二引数に0を渡す。

```sql
SELECT TRUNCATE(123.45, 0) result;
```
| result |
|---|
| 123 |

## 小数点N桁以降を切り捨て
第二引数にNを渡す。

```sql
SELECT TRUNCATE(123.45, 1) result;
```
| result |
|---|
| 123.4 |

## 整数N桁以降を切り捨て
第二引数に-Nを渡す。

```sql
SELECT TRUNCATE(123.45, -1) result;
```
| result |
|---|
| 120 |

# :clap:まとめ

MySQLに精通している人の
「え？当たり前じゃん？」て顔が目に浮かびますね:sob:
「Ruby」ERBのコメント(<%#〜%>　と　<%=begin %>〜<%=end %>)の違い

<h2>分からなかったこと</h2>
Rubyの複数行コメントの、(<%#〜%>　と　<%=begin %>〜<%=end %>)の違いが分からんでござる!(PHP先輩に戻りたい)

どっちも複数行コメントできるやんけ

<h2>結果</h2>
確かめてみたけどどっちも複数コメントできてる

<h2>わかったこと</h2>

<%#〜%>の方は、<%〜%>の配下でしかコメントできないみたいなんだけど、
beginとendのやつは、<%〜%>や<%=〜%>などをまとめてコメントできるというメリットがあるみたい！！

<h2>感想</h2>
本見ながら勉強してたけど、僕は一体どこ見てんでぃ！(江戸っ子)
よ〜く見たらそういったこと書いてありました。

これに気づかなかった時は、beginとendのやつ使わなくてもええやん！って思ってたけどそれは大きな間違いなんですねぇ。。。
【GitHub】ブランチの名前変更方法 ブランチの削除方法

# ブランチを作成する際に打ち間違えてしまった...。
先日GitHub Desktopにてブランチ作成の際に名前を打ち間違えてしまいました。
下記のように「view-design **n**」として作ってしまいました。

<img width="593" alt="スクリーンショット 2017-05-28 14.55.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/233a3ba6-4f8a-8058-151c-5b811159329c.png">

本記事は下記についてのメモです。

- ブランチの名前変更方法
- ブランチの削除方法


# ブランチの名前変更方法
ブランチの名前変更は **`git branch -m 　旧名　新名`** で変更することができます。
今回のケースでは、下記のように入力します。

```
$ git branch -m view-designn view-design
```
## 変更されたか確認したい

本当に名前が変わったか確認したい場合は **`git branch`** でブランチ一覧を表示することができます。

```
$ git branch
* master
  view-design
```
上記の場合、「master」と「view-design」という２つのブランチが確認できるので、ちゃんと名前が変更できたようです。

# ブランチの削除方法
上記の名前変更で「名前付けを打ち間違えてしまった」という問題は解決できていますが、「名前変更」という手段で解決する他に、「ブランチを削除して新しく作り直す」という方法もあると思うのでブランチの削除方法についても記載しておきます。

ブランチの削除は **`git branch --delete 　削除したいブランチ名`** で削除することができます。
今回のケースでは、下記のように入力します。

```
$ git branch --delete view_designn
```

同様に **`git branch`** で確認してみると「view_designn」が消えているので、削除できているようです。

```
$ git branch
* master
```
ServiceNow タイムゾーンを日本時間に変更する

[前回](http://qiita.com/Kisaragi13/items/e24ad986cf59da4a10b8)、レコードを登録したが登録日時がずれていた。これはタイムゾーンを設定していなかったことによる問題なので、次はタイムゾーンを変更する。
インスタンスのビルドタイプはIstanbul。

次の記事を参考にさせて頂きました（と言うより丸コピです）。

>『SNOW freaks - 日本タイムゾーンの設定方法』
http://snowfreaks.blog.jp/archives/2929199.html

# タイムゾーンを変更する
インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

アプリケーションナビゲータの中から、システムプロパティ → 基本構成 UI16を選択（<font color="red">赤枠</font>）。
（フィルタナビゲータ（<font color="blue">青枠</font>）に「**基本構成**」と入力すると簡単です）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/4ce91b1f-89ca-b7ff-e13c-0195d019e1f8.png)

「**カレンダーやユーザのデフォルトとして使用されるシステムタイムゾーン**」セクションの「**利用可能なタイムゾーンの構成**」リンクをクリック
<img width="60%" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/175688/e7943b48-7806-0bd9-29ff-626e26bf8da4.png">

選択済みのタイムゾーン一覧に「**日本**（*アジア/東京* でも可）」を追加して「**保存**」ボタンをクリック。
<img width="60%" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/175688/85f83e8b-6f11-bcc7-80e5-d69ee09f43a8.png">

設定メニューを開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/e69ba07a-f078-69ea-d1ab-d4fd8532ba8b.png)

タイムゾーンを「**日本**」に設定する。
<img width="80%" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/175688/5f5d179b-6b99-7439-f145-d8d8ec980bef.png">

以上でタイムゾーンの設定変更作業は終了です。

# 参考サイト
>『SNOW freaks - 日本タイムゾーンの設定方法』
http://snowfreaks.blog.jp/archives/2929199.html

# 関連記事
> - [ServiceNow初期設定 インスタンスを日本語化する](http://qiita.com/Kisaragi13/items/abbc205134d1696ff644)
> - [ServiceNow インシデントを登録してみる](http://qiita.com/Kisaragi13/items/e24ad986cf59da4a10b8)
SpringBoot フロントエンド開発


SpringBootで快適にフロントエンド開発を進めるための環境を作っていきたいと思います。

# frontend-maven-plugin の導入
pom.xmlに以下を記述

```xml
<plugins>
    <plugin>
        <groupId>com.github.eirslett</groupId>
        <artifactId>frontend-maven-plugin</artifactId>
        <version>LATEST_VERSION</version>
    </plugin>
</plugins>
```

* [frontend-maven-plugin](https://github.com/eirslett/frontend-maven-plugin "frontend-maven-plugin")

まだ記述途中です…
近々更新します…
Javascriptでボタンを押したら少しずつスクロールさせる

# お手本

イメージとしてはポカリスエットのサイトに置かれているこういうの

<img width="1013" alt="スクリーンショット 2017-05-28 14.55.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/00784eaf-e0a8-685e-632e-9cf6d647a1d1.png">

# サンプル

サンプルとしてはこういうものを用意

<img width="964" alt="スクリーンショット 2017-05-28 14.56.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/2c9d6c96-3263-7688-962e-d9a3a87a4bdd.png">

# 実装

Javascriptの`.animate() `関数を使う
### html
```
<div id="test">
    <img src="images/mic.jpg" alt="代替テキスト" width="300" height="150"  id="one">
    <img src="images/mic.jpg" alt="代替テキスト" width="300" height="150" id="tow">
    <img src="images/mic.jpg" alt="代替テキスト" width="300" height="150" id="three">
    <img src="images/mic.jpg" alt="代替テキスト" width="300" height="150" id="four">
  </div>
```

### javascript
```js
//カウンタの初期値を設定
var countUpValue = 0;

function OnButtonClickRight() {
countUpValue = countUpValue + 50 ;
$("#test").animate({marginLeft: countUpValue});
}

function OnButtonClickLeft() {
countUpValue = countUpValue - 50 ;
$("#test").animate({marginLeft: countUpValue});
}
```

# 悩みどころ

でも、これだと、要素が端っこまで来た時に、画面の外側に消えていってしまう。ループされるにはどうすればいか... わかるからアドバイスください

<img width="982" alt="スクリーンショット 2017-05-28 15.01.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/f6bf516a-461e-5bd8-77d2-f85cd64cd72e.png">

# 参考

[ポカリ](http://pocarisweat.jp/)
[jsfiddle](http://jsfiddle.net/Starx/jUsAL/)
[animate offset().left](https://stackoverflow.com/questions/10325321/animate-offset-left)
[Javascriptでclick(タップ)するたびにカウントアップとカウントダウン](http://qiita.com/Ryosuke-Hujisawa/items/af6c39dbc2f60022f3f3)
[Javascriptでボタンを押したら少しずつスクロールさせる](http://off.tokyo/blog/2017/05/28/javascript%E3%81%A7%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%97%E3%81%9F%E3%82%89%E5%B0%91%E3%81%97%E3%81%9A%E3%81%A4%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%95%E3%81%9B%E3%82%8B/)
UnityとGithubを利用した、コマンドラインからGit バージョン管理を行う方法

Unity Collaborateもそろそろベータを終わりそうですが、やはりGitHubでコードをバックアップしたい、他の人にシェアしたいという状況はまだあると思われます。

## やることの目次
0. Unityプロジェクトの設定を行う
1. GitHubの登録
2. 自分のローカルプロジェクトを初期化からコミットまで行う
3. リモートレポジトリの設定
4. リモートレポジトリへプッシュ

## 1. Unityプロジェクトの設定

Gitで管理しやすくするため、Unityプロジェクトの設定を行う。

1. [Edit] -> [Project Settings] -> [Editor]を選択
2. Inspectorビューを開く
3. [Version Control] のModeを [Visible Meta Files] に変更
4. [Asset Serialization] のModeを [Force Text] に変更

<img src="https://qiita-image-store.s3.amazonaws.com/0/33026/fe95e4b1-9488-524e-3c33-8d187a42e923.png" width=500 >


<img src="https://qiita-image-store.s3.amazonaws.com/0/33026/2d09561e-f229-1b5a-6d3a-818ad12b4f3e.jpeg" width=500 >

## 2. GitHubへの登録

[https://github.com/](https://github.com/)より

1. ユーザー登録
2. リモートレポジトリの作成

までを行う。
リモートレポジトリを作成したら、以下のページの情報を利用するためそのままにしておく。
![リモートレポジトリ作成後の](https://qiita-image-store.s3.amazonaws.com/0/33026/0232b761-ed3b-b86a-dbcd-be6cd5899a1c.png "スクリーンショット 2017-05-28 12.35.48.png")


## 3. ローカルプロジェクトの初期化とコミット

以下、Macはターミナル、Windowsは Git for Windowsでインストールされる Git Bashを利用することを想定。

### 自分のプロジェクトへ移動
`cd ~/path/your/repository`

cd（チェンジディレクトリ）を利用して移動するか、Macの場合はターミナルに移動したいフォルダをドラッグアンドドロップすれば移動することが可能。

### Gitの初期処理
`git init`でローカルレポジトリを作成する

### add（保存するデータの選択）
今回は変更があるものを全選択をするために `-A`オプションを利用する
`git add -A`

#### Windowsの場合に文字コードに注意

[この記事](http://qiita.com/yokoh9/items/1ec8099696ade0c1f36e)などを参考に。
ターミナルで行う場合は以下のコマンド
`git config --global core.autoCRLF false`


### Commit（変更の記録）
`git commit -m "First Commit"`

""の中のメッセージはそのコミットでの変更点を一言で表している。

### .gitignoreの登録
#### .gitignoreファイルの作成
1. メモ帳などで新しいファイルを新規作成
2. [gitignore.io](https://www.gitignore.io/)にアクセス
3. unityとWindows or macOS と入れてCreateを押す。
4. 作成されたデータを新規作成したコピー&ペースト
5. 名前を `.gitignore`にして保存
（.から始まるファイルは通常エクスプローラやFinderからは見えなるので、保存を行うと表示として消えることがあります。）


<img src="https://qiita-image-store.s3.amazonaws.com/0/33026/47b7949a-fb55-95ef-7c04-013dec50449c.png" width=500 >

もし、Windowsで`.gitginore`の名前で保存できない場合は[こちらの記事](http://qiita.com/dachis/items/06952f10a7adfeba7fa4)などを参考にする。

#### .gitignoreをaddとCommit
`git add .gitignore`
`git commit -m "Add .gitignore" `

.gitignoreのみをコミットする

## 4.リモートレポジトリの設定
### リモートレポジトリの設定
ローカルプロジェクトに対して、どのリモートレポジトリを利用するのか設定を行う

利用するコマンドは、`git remote add <name> <url>`。
実際に利用する時は`git remote add origin http://YourURL`などと利用する

※確認するためのコマンドは　`git remote -v`。remote登録しているURLを確認できる

### push（ローカルの変更をリモートに反映させる）

利用するコマンドは`git push -u リモートレポジトリの名前 ブランチ(デフォルトはmaster)`。
ブランチは通常、デフォルトではmasterとなるので、ここでもmasterとして登録する。
上でoriginという名前でリモートレポジトリを登録したので、
`git push -u origin master`

というコマンドを実行。


<img src="https://qiita-image-store.s3.amazonaws.com/0/33026/657422f2-9d36-88f2-ba53-6b04eb57c007.png" width=500 >


## 最初のコミット後に、GitHubのデータを更新をする方法
1. プロジェクトで変更した内容を保存
2. `git add -A`で変更内容を全てステージングに登録
3. `git commit -m "Your Original Message"`でローカルレポジトリにコミット
4. `git push origin master`でリモートレポジトリにプッシュ
Sinatra + Sequel + RSpec + DatabaseCleanerでテスト自動化の環境を構築する上でハマったメモ

database_cleanerがactive_record以外にもいろんなO/Rマッパーに対応してくれていて、かつどのO/Rマッパーを使っているのかを自動で判定してくれていたので使ってみた。
手順を進めていく上で所々つまづいたので、その時の対応方法をメモ。

```
# spec/spec_helper.rb

(省略)
require 'sequel' # database_cleanerがsequelを判定するために記述
require 'database_cleaner'
(省略)
RSpec.configure do |config|
  (省略)
  config.before(:suite) do
    # 開始前にDBを初期化する
    option = configure_of_db_connection # DB接続のコネクション情報
    # TRUNCATEするのに外部キーが邪魔なので一時的に外部キーチェックをOFFにする
    connection = Sequel.connect(option)
    connection.execute('SET FOREIGN_KEY_CHECKS = 0;')
    DatabaseCleaner[:sequel, { connection: connection }] # これをやっておかないとdatabase_cleanerがDB接続できない
    DatabaseCleaner.clean_with(:truncation)
    connection.execute('SET FOREIGN_KEY_CHECKS = 1;')
    # 各テストはtruncateで対応
    DatabaseCleaner.strategy = :truncation
  end
  (省略)
  # 各テストケースごとにトランザクション開始
  config.before(:each) do
    DatabaseCleaner.start
  end
  config.after(:each) do
    DatabaseCleaner.clean
  end
end
```

ハマったポイントと対応内容は下記。

* オートローダー等を使用していなかったので`DatabaseCleaner`が`Sequel`を探せなくてDB接続ができなかったので、requireでsequelを呼び出す処理を追記。
* 当たり前だけども`DatabaseCleaner`がDBに接続できないと初期化等が出来ないので`Sequel`でのDB接続設定を渡してあげる。

ついでにハマった現象として、外部キーを指定している時にTRUNCATEしようとするとエラーが発生するので、
それを回避させるためにclean_withの前後で外部キーを無視する記述を追加した。
※意外と検索しても出てこなくて、外部キーを使っている人が少ないのかな？と思ったり
直接の解決ではなかったけども、
[Rspec with database_cleaner on Sequel causes foreign key truncation error](https://stackoverflow.com/questions/40782694/rspec-with-database-cleaner-on-sequel-causes-foreign-key-truncation-error)
が参考になった。

上記で解決できなかった問題として、

* DatabaseCleanerの各テストでのデータのものたせ方を`truncation`から`transaction`に変更したい

がある。
対応したかったんだけども、最初にconnectionを渡してしまっていたのと、実処理のところでsequelを変な呼び方していて、呼び出すたびにconnectionを生成しているっぽくてtransactionが効かなかったので断念。
Railsで作成したWebサービスに5分でコメント機能を導入する

コメント機能を実装するのは意外に大変です。
コメント機能と一言で言ってもコメントに対して返信できるようにするかといった仕様部分を決めたり、
返信がある場合はUIをどうするのかといったことも検討しないといけません。

そこでDISQUSというサービスを使って簡単にコメント機能を実装してみました。
[このブログ](http://tackeyy.com/)の各記事の一番最後にあるコメント機能がそれです。

[![https://gyazo.com/02fa6b831c7a814edb204a187001c021](https://i.gyazo.com/02fa6b831c7a814edb204a187001c021.png)](https://gyazo.com/02fa6b831c7a814edb204a187001c021)

上記のようなコメント欄がこのくらいのコードで実装できます。

https://github.com/tackeyy/blog/pull/8/files

# こんな人にオススメ

- Railsで作成したWebサービスにコメント機能をつけたい人

# DISQUS

ひとことで言うと「いい感じのコメント欄を提供してくれるサービス」です。
SNSのような仕組みもあるので気になる方はDISQUSのページを見てみてください。

https://disqus.com/
https://help.disqus.com/customer/en/portal/articles/466179-what-is-disqus-

# コメント欄を実装する

## アカウントを作成する

https://disqus.com/profile/signup/

## コメントを追加するサイトを登録する

ログイン後に以下の[管理画面](https://disqus.com/admin/)に入った後で New をクリックしてサイトを登録します。

[![https://gyazo.com/5dd971b738ff159ce873bdbebdd38a02](https://i.gyazo.com/5dd971b738ff159ce873bdbebdd38a02.png)](https://gyazo.com/5dd971b738ff159ce873bdbebdd38a02)

ここで必要事項を入力してください。

[![https://gyazo.com/edec66855093e4356227ad0c13b62dbf](https://i.gyazo.com/edec66855093e4356227ad0c13b62dbf.png)](https://gyazo.com/edec66855093e4356227ad0c13b62dbf)

I don't see my platform listed, install manually with をクリックして次へ。

[![https://gyazo.com/2d222943ef5388ee6d1bc58e4a716baf](https://i.gyazo.com/2d222943ef5388ee6d1bc58e4a716baf.png)](https://gyazo.com/2d222943ef5388ee6d1bc58e4a716baf)

右下にconfigure ボタンがあるのでクリック。
あとから 1. Place the following code where you'd like Disqus to load: のコードは使います。

[![https://gyazo.com/b7d69a39aa2c59475fe3a4c536c89803](https://i.gyazo.com/b7d69a39aa2c59475fe3a4c536c89803.png)](https://gyazo.com/b7d69a39aa2c59475fe3a4c536c89803)

## 実装

DISQUS用のパーシャルを作成してそれを呼び出しているだけです。
説明するよりもコードを見た方が早いと思うので以下のプルリクを参考にしてください。

https://github.com/tackeyy/blog/pull/8/files

このプルリクは以下の点が微妙です。

1. hamlを使用しているのにここだけerbを使っているところ
jsファイルを追加するのが面倒でerbにscriptタグを書いてしまいました。

2. disqusの設定をしていないところ
動作上は問題ないのですが、disqusにおすすめされている設定をしていません。

```
/**
*  RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
*  LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/
/*
var disqus_config = function () {
this.page.url = PAGE_URL;  // Replace PAGE_URL with your page's canonical URL variable
this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
};
*/
```

page.shortnameやpage.titleもあるようですが、調べてないので設定は省きました。

# 参考

DISQUSの説明だけでも理解できましたが、先にこの記事をみておけば良かったです。
http://blog.nrowegt.com/how-to-add-disqus-comments-to-a-rails-5-application/

DISQUSを簡単に導入するためのGemです。
https://github.com/sandric/disqus_rails

以下のような理由で今回は使いませんでした。
- Rails5に対応しているかわからない
- star数があまり多くなく、コミットなどを見てもアクティブじゃない
paizaの10万登録ありがとうスペシャルの始末記

# これはなにか

[paizaの10万登録ありがとうスペシャルWキャンペーン](https://paiza.jp/poh/hundred_thousand)というのがありました。
総括するのが流行っているみたいなので、俺も俺も。
ちなみに、おじさんはC言語のみです。

## アルゴリズム

- デカイ配列を用意しておく
- 読み込んだs_i*s_jにマークを付ける
- p_iから数えて、マークまで進んだ数を出力

## コード

書き散らかして、どれを提出したのかわからなくなったので（ぉ
多分これだと思うやつ。

```
i,j,S[1<<20],F[4096];
main(X)
{
    for(;~scanf("%d",F+i++);)
        for(j=*S=*F+2;j<i;S[X<S-F?X:0]=1)
            X=F[i-1]*F[j++];

    for(i=1;++i-*S;printf("%d\n",j-X))
        for(X=j=F[i];!S[j];++j);
}
```
[fuyutsubaki](http://qiita.com/Fuyutsubaki/items/8de584c0397856d3ffab)さんのと基本同じですな。

## 解説という名の蛇足

* 配列FにM, N, p\_m, s\_nを読み込む。
* M = F[0], N = F[1], p\_m = F[2 ..F[0]+2], s\_n = F[F[0]+2 .. F[1]+2]に入っていることになります。
(\*SにF[0]+2 == s_0の添字を入れてます) 
* 読み込んでいる最中に、X = s_i \* s_jを計算して、デカイ配列Sに入るようならS[X]を1にします。
 (入るかどうかチェックするのに、デカイ配列SのサイズをS-Fで計算していますが、逆(F-S)じゃないかと思われますが、手元のgccがそーいうコードを落とすのだから、しょうがない。)
* p_mに対して、デカイ配列S[p_m]から0以外が出るまでの数を数えて出力します。

## 自己批判

* 最初、コードサイズのことを、「実行ファイルのバイト数」だと思いこんで、printfをputcharに書き換えたりして、考えすぎた。
* 1000000にこだわりすぎた。
* qsort関数で副作用をうまく利用してやろうと考えて、考えすぎた。
* 配列をcharとして扱って、マークまでの数をstrlen関数で求めようなどとして、考えすぎた。
* s_iとs_jが素なら中国の剰余定理が使えるんじゃね？と思って、興味が横道にそれた。
* 基本ゴルファーでないのに、無理しすぎた。

現場からは以上です。
英単語になる（なりそうな）カラーコード（Hex値）

#英単語になる（なりそうな）~~webセーフカラー~~カラーコード（Hex値）

何となく思ったので書いてみる。

- <font color="#facade">facade</font>
 - [ファサード](https://translate.google.co.jp/?tab=wT#en/ja/facade)
- <font color="#decade">decade</font>
 - [10年](https://translate.google.co.jp/?tab=wT#en/ja/decade)
- <font color="#accede">accede</font>
 - [合意](https://translate.google.co.jp/?tab=wT#en/ja/accede)
- <font color="#badace">badace</font>
 - [悪いエース](https://translate.google.co.jp/?tab=wT#en/ja/bad%20ace)（ちょっと苦しい）

薄いなぁと思ったが、考えてみれば当たり前である。

##追記

数字をアルファベットに見立てれば、使える文字が増える！

- <font color="#0ff1ce">0ff1ce</font>（[コメントから](#comment-5e65fa60a0d75d07135f)）
 - [事務所](https://translate.google.co.jp/?tab=wT#en/ja/office)
- <font color="#c0ffee">c0ffee</font>（[コメントから](#comment-e24738df7dff2c308049)）
 - [コーヒー](https://translate.google.co.jp/?tab=wT#en/ja/coffee)（言葉の意味と色が全然違うのが面白い）

3文字でも書ける

- <font color="#ace">ace</font>（[コメントから](#comment-6321092b9050773e2c2e)）
 - [エース](https://translate.google.co.jp/?tab=wT#en/ja/ace)



##参考
- [Qiitaのマークダウンで色をつける方法[140色]](http://qiita.com/twipg/items/d8043cd4681a2780c160)
- [Hexspeak](https://ja.wikipedia.org/wiki/Hexspeak)
Azure WebApp on Linux に載せ替える流れ

ビルトインのイメージを使うという方法もありますが、独自の Docker イメージを作るほうがスムーズにインフラの移行ができると思います。

## はじめに注意点
ここで紹介している WebApp on Linux、および Azure Database for PostgreSQL(MySQL) は記事投稿時点(2017/05/28)ですべてプレビューです。
その動作を保証するものではありません。

## 設計
通常 Docker では1プロセス1コンテナにし、複数コンテナで1つのシステムを実現するのが[ベストプラクティス](http://docs.docker.jp/engine/articles/dockerfile_best-practice.html#id4)とされています。
しかし、現時点の WebApp on Linux では1サイト１コンテナとなっています。
このあたりを勘案して Docker イメージを作成する必要があります。

また、Database に関してはコンテナではなく、PaaS のデータベースを使うのが無難です。

- [SQL Database](https://azure.microsoft.com/ja-jp/services/sql-database/)
- [PostgreSQL](https://azure.microsoft.com/ja-jp/services/postgresql/)
- [MySQL](https://azure.microsoft.com/ja-jp/services/mysql/)

## Docker イメージの作成
ここが作業の8割です。
がんばりましょう。

- [参考:効率的に安全な Dockerfile を作るには](http://qiita.com/pottava/items/452bf80e334bc1fee69a)
- 参考:ビルトインのDockerイメージ([PHP](https://github.com/Azure-App-Service/php), [node](https://github.com/Azure-App-Service/node), [ruby](https://github.com/Azure-App-Service/ruby))

デプロイ後にデバッグが必要になるかもしれません。`ssh` できるようにしておくと便利です。

- [参考:カスタム Docker イメージでの SSH サポート](https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-linux-ssh-support)

## WebApp の作成
次に用意した Docker イメージを使って WebApp を作成します。
継続的なデプロイができるという観点から、Docker Hub を使うのがオススメです。

- [参考:Docker Hub からカスタム Docker イメージを使用する方法](https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-linux-using-custom-docker-image)
- [参考:Azure Web App on Linux での Docker Hub の継続的なデプロイ](https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-linux-ci-cd)

## 更新情報
- [Azure App Service on Linux Release Notes](https://github.com/Azure-App-Service/ReleaseNotes)
py.testでfixtureをparameterizeの引数にする

# はじめに

pytestのfixtureは同じ条件でテストを繰り返したいときに非常に便利なツールです。いろいろな条件に共通するテストを書くために、fixtureをテストのパラメータにしたいと考えた時に、意外と情報がネットにまとまっていなかったので、ここに記載します。

ちなみに、fixtureをテストのパラメータにする方法については、[公式ページ](https://docs.pytest.org/en/latest/proposals/parametrize_with_fixtures.html) や[GitHub](https://github.com/pytest-dev/pytest/issues/349) で議論されているので、近い将来にもう少し簡単な方法が提供される可能性はあります。


# やりたいこと

```python
import pytest

@pytest.fixture
def fixture_a():
    yield 1

@pytest.fixture
def fixture_b():
    yield 2

@pytest.fixture
def fixture_c():
    yield 3

@pytest.mark.parametrize("expected, generated", [
        (1, fixture_a),
        (2, fixture_b),
        (5, fixture_c),
])
def test_fail(expected, generated):
    assert expected == generated
```

ただし、これはうまくいかない。

# 代替策

デコレータ`pytest.fixture`を使うことで、fixtureをまとめる。

```python:test.py
# 他の関数のは上記と同じ

@pytest.fixture(params=['a', 'b', 'c'])
def context(request):
    if request.param == 'a':
        return (1, request.getfixturevalue('fixture_a'))
    elif request.param == 'b':
        return (2, request.getfixturevalue('fixture_b'))
    elif request.param == 'c':
        return (4, request.getfixturevalue('fixture_c'))

def test_fixture_parameterize(context):
    expected, generated = context
    assert expected == generated
```


```bash
$ pytest test.py
========================================= test session starts =========================================
platform linux2 -- Python 2.7.12, pytest-3.1.0, py-1.4.33, pluggy-0.4.0
rootdir: /home/koreyou/work/pytest_fixture_parameterize, inifile:
collected 3 items 

test.py ..F

============================================== FAILURES ===============================================
____________________________________ test_fixture_parameterize[c] _____________________________________

context = (4, 3)

    def test_fixture_parameterize(context):
        expected, generated = context
>       assert expected == generated
E       assert 4 == 3

test.py:31: AssertionError
================================= 1 failed, 2 passed in 0.02 seconds ==================================
```
期待どおり失敗する。
Docker + Goバイナリでstandard_init_linux.go:178: exec user process caused "no such file or directory"と出た時の対処

# あらまし

以下のような`Dockerfile`で作られたイメージを実行しようとしたところ、掲題のエラーが出る。
`hogebin`はGoでビルドされたバイナリ。

```:Dockerfile
FROM alpine:latest

MAINTAINER kato

WORKDIR /app

COPY hogebin /app

ENTRYPOINT ["/app/hogebin"]
```

`docker logs hogecontainer`
=> `standard_init_linux.go:178: exec user process caused "no such file or directory"`

# 原因

最近のGoのバイナリはDynamic linkを行うらしく、これはそのリンク対象が存在しないために発生しているらしい。
もしかしたらAlpineを使っているのが原因かもしれない。

# 対処

`hogebin`ビルド時に、`CGO_ENABLED=0`をつける。

```
CGO_ENABLED=0 go build
```

# その他

このエラーメッセージで検索すると、`ENTORYPOINT`に書かれたコマンドのスクリプトがCRLFが原因のケースが多く出てくるが、
今回はバイナリなので該当しない。

# 参考

* http://okzk.hatenablog.com/entry/2016/08/03/234738
if (n - 1 >= container.size())

表題は、私が最近見かけた、C++プログラマーならば見た瞬間に「まずいかも」と思うであろう式。
（※containerは実際には別の名前）

## 表題の式が問題になる例

```C++
#include <iostream>
#include <vector>

void compare(int n, const std::vector<int>& container)
{
   std::cout << n << " - 1";
   if (n - 1 >= container.size())
   {
       std::cout << " >= ";
   }
   else
   {
       std::cout << " < ";
   }
   std::cout << container.size() << std::endl;
}

int main()
{
   std::vector<int> v(2);
   compare(3, v);
   compare(2, v);
   compare(1, v);
   compare(0, v);
   return 0;
}
```

**結果**

```
3 - 1 >= 2
2 - 1 < 2
1 - 1 < 2
0 - 1 >= 2
```

## 表題の式を見た瞬間に「まずいかも」と思う理屈

1. containerはC++のコンテナではなかろうかと推論できる
2. C++のコンテナは要素数の表現にsize_t型を用いることが多い
3. size_t型は、最高級の整数変換順位を持っている符号なしの型（unsigned long）であることが多い
 * そのため、int型の値とsize_t型の値の比較は、int型の値をsize_t型に変換して（正数に丸めて）から行われる
 * たとえば (int)-1 < (size_t)2 は（32ビットの処理系では） (size_t)4294967295 < (size_t)2 となる

以上を踏まえ、そもそも

```C++
if (n > container.size())
```

で問題なさそうなところをわざわざこのように書かれる妥当な理由が思い付かないため、コード品質の面に不安を覚える。

## size_t型についての所感

C99ではsize_t型について“signed longより高い整数変換順位を持つべきではない。ただし、処理系がこのことを必要とするほど、大きなオブジェクトをサポートしている場合を除く”とされている。
もともとsize_t型は「sizeof演算子の結果を表現する型」であり、私自身は「sizeof演算子の結果として（ついでに言うとC++コンテナの要素数としても）signed longよりも大きな値が必要となるソフトウェア」に携わったことがないこともあり、多くの処理系のsize_tは元々の要件に対して安全性の低い選択肢が採られているように感じる。
rust で failed to run custom build command for `openssl-sys` が出るときにすること

Rustでいろんな環境で開発を行う際に、hyper などでは opensslにを使っているので、このエラーがよく出ます。そんなときの対処方法です。

## はじめに

https://github.com/sfackler/rust-openssl#manual-configuration
に書いている下記の方法を試します。

```
# On Ubuntu
sudo apt-get install libssl-dev

# On Arch Linux
sudo pacman -S openssl

# On Fedora
sudo dnf install openssl-devel

# On Amazon Linux
sudo yum install openssl-devel
```
Macの場合は

```
brew install openssl
```
これです。

## それでもダメなら

### Ubuntu
```
dpkg -L libssl-dev | grep lib
dpkg -L libssl-dev | grep include
```
で、それっぽいパスを探してきます。
そして下記の環境変数を bashrcや起動スクリプトなどにセットします。

```
export OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu/
export OPENSSL_INCLUDE_DIR=/usr/include/openssl/
```

## 更にそれでもダメなら

```
apt-get install pkg-config
```

Fedora系の場合は[こちら](https://qiita.com/hana_shin/items/e3ef3bbaf7d89849a9c5)が良さそうです。


pkg-configが必要です。

## その他の解決方法

* [Rustのhyperがopenssl絡みでコンパイル出来ないときの対処法 (Windows編) - Qiita](https://qiita.com/s-nlf-fh/items/790489b14acacd1b9b81 "Rustのhyperがopenssl絡みでコンパイル出来ないときの対処法 (Windows編) - Qiita")
* [hyperのコンパイルがopenssl絡みで失敗する場合の対処方法 - Qiita](https://qiita.com/hhatto/items/963e38e366f00af94531 "hyperのコンパイルがopenssl絡みで失敗する場合の対処方法 - Qiita")
* [UbuntuでRustのビルド時にerror: failed to run custom build command for `openssl-sys v0.9.40`とか言われる場合の対策 - Qiita](https://qiita.com/setouchi/items/8b21563c4c1edb2b279d#_reference-066b32267f208b1e9814)
brew upgrade で MariaDB 10.2 にしたら rails 起動できなくなった問題（解決）

# はじめに

開発環境の Macbook Pro で気軽に ```brew upgrade``` していたら、突然 ```bin/rake test``` が通らなくなり、当然 ```bin/rails s``` もエラーになった間抜けなエンジニアです orz。解決するまでにチョッと時間が掛かったので、後から来る人に屍を超えてもらおうと思います。

# 解決方法

https://www.bountysource.com/issues/45549898-installation-error-in-mariadb-10-2-6 で dguzek さんが手順を書いてくれています。この通りにやって、私の環境では動くようになりました。

```bash
brew unlink mariadb
brew install mariadb-connector-c
gem uninstall mysql2
gem install mysql2
```
# メモ

キチンと調べて無いのですが…

- [MDEV-9055](https://jira.mariadb.org/browse/MDEV-9055) でクライアントライブラリ(```libmysqlclient```)が削除されて ```mariadb-connector-c``` に置き換えられたため ```mariadb``` に加えて ```mariadb-connector-c``` をインストールする必要が生じた
- 使用していた ```mysql2 gem``` が参照していた ```libmysqlclient``` が削除されたため、```mysql2 gem``` の入れ直しが必要になった

ということみたいです。
IntelliJで型情報のツールチップを出すショートカットの設定(windows+日本語キーボードの人向け)


# 対象者読者
- Windows+日本語キーボード(※)+IntelliJで開発している人
- とくにScalaの開発をしている人向け
- それ以外でもintelliJの一機能(Type Info)の説明にもなっていると思うのでIntelliJを使用している場合は読んでもいいかもしれません

※「=」キーがあるキーボードを使用している人はこの対象外。たぶん。

# IntelliJのバージョン
今回この記事を書くにあたって使用したのは「IntelliJ IDEA 2017.1.3」です。
これ以前のバージョンについてもこの記事の内容は有益ではあると思いますが、将来的にはなんらかの改善が入り、この記事は役目を終えるかもしれません。

# 動機
Scalaで開発をしているとき関数の戻り値を受けつつ変数を宣言するとき、型の宣言は省略する場合がほとんどだと思います

```
val hoge = sumFunction(fuga)
```

このときふとhogeの型はなんなのか簡単に知りたいことってよくあります。
そして、できればキーボードショートカットで型情報を表示したい。

IntelliJには「Type Info」という機能が用意されていてhogeにカーソルを合わせて該当のキーボードショートカットを入力すれば型情報がツールチップで表示されます。
![type info preview.png](https://qiita-image-store.s3.amazonaws.com/0/91779/e088d828-7e1e-10d6-9579-4324e970778e.png)

こちらの機能になります。
[Working with Scala Show Type Info Action（IntellJの公式）](https://confluence.jetbrains.com/display/IntelliJIDEA/Working+with+Scala+Show+Type+Info+Action)


そしてそのキー割り当てが「Alt + =」となっています。
日本語キーボードだと「=」を入力するためにはShiftを一緒に押さなければならず、結果として別のショートカットキーとして解釈されているのか、そもそも「=」キーがないからなのか「 Alt + Shift + -」を押してもType Infoは機能しません。

そこでkeymapを変更することでこの問題に対応します

# やり方
まずはこちらを。最後でType Infoを使用しています。
![intelliJ type info setting.gif](https://qiita-image-store.s3.amazonaws.com/0/91779/bb7f4844-74b6-b737-9b63-eb77cde17753.gif)

* menu-File-Setting-KeymapでType Infoを探す
* キー割り当てが「Alt + 等号」になっている
* 新しいキー割り当てをする（私は「Alt + t」にしました）
* キー割り当てが「Alt + 等号」を削除する
    * Type Infoの設定が2つあるのを1つが有効になるようにしないとショートカットキーが効かなかったと思います
    * 古いキー割り当てを削除しないとショートカットキーが効かながったと思います
        * この辺の情報は後ほど精査できたらします
* 一見、型情報が不明な変数にカーソルをあて「Alt + t」でType Infoを使ってみる

# その他
* Type Infoは優秀で変数だけではなく部分的な式を選択状態にして機能させるとその式の評価後の型がわかります(上記のIntellJの公式ページを参照)。この記事のために調べる前は知らなかったので、それだけでも書いてよかったと思います
* menu-view-Type Infoをやっても機能しないのは変わらないようです。menuから使用するケースはまずないのでいいですけど。
* Type Infoのkeymapが2つあるのはなぜなんでしょうか
計算量オーダーについて


プログラムの計算量を表すO記法について、使用例を調査しました。

# 計算量（オーダー）とは？
あるアルゴリズムを使った演算の性能を表す指標。
計算量は大きく二つに分けられる。
 - 時間計算量（処理時間の計算量）
 - 空間計算量（メモリ使用量の計算量）

単に計算量（オーダー）と言った場合、時間計算量のことを指す。

# O記法（オーダー記法）
特定のアルゴリズムでの計算が、どれくらい掛かるかを表した記号。
処理対象のデータが非常に大きくなった時の処理時間を**大雑把に**評価する。
処理時間が短い順（性能が良い順）に代表的なオーダーをまとめる。

| O記法 | 概要 | 使用例 |
|:-----------:|:-----------|:-----------|
| O(1) | **<定数時間>** <br>処理時間がデータ量に依存しない。必ず一発で取得できる。 | 配列要素へのアクセス、ハッシュテーブルによるデータ検索、連結リストへの追加/削除 |
| O(logN) | **<対数時間>** <br>処理をひとつ行うたびに処理対象を何割か減らせるようなアルゴリズム。データ量が増えても計算時間がほとんど増えない。多くの場合、これ以上の改善はする必要はない。 | ソート済み配列の二分探索 |
| O(N) | **<線形時間>** <br>データ量の分だけ時間がかかる。forループ１回分。N回もしくはNに比例する回数以内のループで処理が終わる場合。 | 非ソート配列の探索 |
| O(NlogN) | **<準線形、線形対数時間>** <br>ちょっと重いO(N)程度。マージソートのように二分木でデータを分割し、かつそれらをリニアサーチするようなアルゴリズムの計算量。二分木のオーダー(logN)×リニアサーチのオーダー(N)をかけあわせてNlogNになる。 | クイックソート、マージソート、ヒープソート |
| O(N^2) | **<二乗時間>**  <br>要素からすべての組み合わせのペアについて調べるようなアルゴリズム。工夫しないソート処理など。二重のforループ。これ以上は処理が遅すぎて使いにくい。| 挿入ソート、バブルソート |
| O(N^3) | **<多項式時間>** <br>三重ループを伴う配列全体の走査。 | 行列計算 |
| O(k^N) | **<指数時間>** <br>要素を取り出すときのすべての組み合わせについて調べるようなアルゴリズム。N軒の家をどの順序で回ったら最短距離になるか。 | ルービックキューブの総当たりによる解法 |
| O(N!) | **<階乗時間>** <br>Nの階乗に比例した時間。 | 巡回セールスマン問題の総当たりによる解法 |

## 計算量のめやす
（多項式オーダーの世界）
O(1)，O(logn)，O(n)，O(nlogn)，O(n^2)，O(n^3)，O(n^100)
ーーー越えられない壁ーーー
O(2^n)，O(n!)

# 参考元
プログラムの計算量オーダーとは？英語で何という？
https://4engineer.net/cs/complexity/
一週間で身につくアルゴリズムとデータ構造|応用編第1日目：アルゴリズムと計算量
http://sevendays-study.com/algorithm/ex-day1.html
時間計算量とは - IT用語辞典
http://e-words.jp/w/%E6%99%82%E9%96%93%E8%A8%88%E7%AE%97%E9%87%8F.html
空間計算量とは - IT用語辞典
http://e-words.jp/w/%E7%A9%BA%E9%96%93%E8%A8%88%E7%AE%97%E9%87%8F.html
オーダー記法・その1：使用例からの導入 - あざらしとペンギンの問題
http://azapen6.hatenablog.com/entry/2013/02/04/214644
計算量を具体的に見てみる - きしだのはてな
http://d.hatena.ne.jp/nowokay/20090106
オーダー記法の定義と大雑把な意味 | 高校数学の美しい物語
http://mathtrain.jp/landausymbol
時間計算量 - cppreference.com
http://ja.cppreference.com/w/cpp/complexity
[初心者向け] プログラムの計算量を求める方法 - Qiita
http://qiita.com/cotrpepe/items/1f4c38cc9d3e3a5f5e9c
ランダウの記号 - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%82%A6%E3%81%AE%E8%A8%98%E5%8F%B7

## 参考書籍
ゲームプログラマになる前に覚えておきたい技術 (P.486)
https://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AB%E3%81%AA%E3%82%8B%E5%89%8D%E3%81%AB%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E6%8A%80%E8%A1%93-%E5%B9%B3%E5%B1%B1-%E5%B0%9A/dp/4798021180
デザインパターン学習メモ：「Strategy」

## 目的
GoF本より引用する。

> アルゴリズムの集合を定義し、各アルゴリズムをカプセル化して、それらを交換可能にする。Strategyパターンを利用することで、アルゴリズムを、それを利用するクライアントからは独立に変更することができるようになる。

Stateパターンとよく似ている。
http://qiita.com/mokrai/items/2caf83112c4b92d2ebe7

## 実装例
３つの数の足し算を行う。二つの計算アルゴリズムを用意する。一つは普通に掛け算する方法。もう一つは、足し算をループして非効率的に計算する方法。

```java:MultiplicationContext.java
// Context役
public class MultiplicationContext {
	private Multiplication strategy;

	public MultiplicationContext(Multiplication stratagy) {
		this.strategy = stratagy;
	}

	public int calculate(int l, int m, int n) {
		return strategy.calculate(l, m, n);
	}
}
```

```java:Multiplication.java
// Strategy役
// 掛け算をする
public interface Multiplication {
	int calculate(int l, int m, int n);
}
```

```java:NomalMultiplication.java
// ConcreteStrategy役
public class NomalMultiplication implements Multiplication {

	// ふつうに計算する
	@Override
	public int calculate(int l, int m, int n) {
		return l * m * n;
	}
}
```

```java:MultiplicationByAddition.java
//ConcreteStrategy役
public class MultiplicationByAddition implements Multiplication {

	// 足し算のループで非効率な計算
	@Override
	public int calculate(int l, int m, int n) {
		int sum = 0;
		for (int i = 0; i < n; i++) {
			int intermediateResult = 0;
			for (int j = 0; j < m; j++) {
				intermediateResult += l;
			}
			sum += intermediateResult;
		}
		return sum;
	}
}
```

### 実行例
```java:Main.java
public class Main {
	public static void main(String[] args) {
		MultiplicationContext contextA = new MultiplicationContext(new NomalMultiplication());
		int resultA = contextA.calculate(200,300,400);
		System.out.println(resultA);
		
		MultiplicationContext contextB = new MultiplicationContext(new MultiplicationByAddition());
		int resultB = contextB.calculate(200,300,400);
		System.out.println(resultB);
	}
}
```

```text:結果
24000000
24000000
```

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
macOS + Unity 5.6.1f1 + AndroidSDK tool 2.6.0 でAndroid向けビルドができなかった -Unable to list target platforms-


# 症状
Unityで作ったものをAndroidの実機で動作確認したいが、うまくいかなかった。
Android向けにビルドしようとすると「Unable to list target platforms」というエラーが発生して失敗してしまう。

# 環境
- macOS Sierra
- Unity 5.6.1f1
- AndroidSDK tool 26.0.2
- JDK 1.7

# 試した
こちらの記事などを拝見し、試しました。
http://scriptlife.hacca.jp/contents/programming/2017/03/04/post-2136/

> 5/17時点の最新である、Unity 5.6.1とSDK Tools 26.0.2でビルドしてみたところ、無事成功しました！

とありますが、自分の環境ではうまく行きませんでした。

# AndroidSDK Toolsをダウングレードする作戦
AndroidSDK Toolsをダウングレードする作戦でいきます。

https://developer.android.com/studio/index.html
先程の記事では、こちらのページの最下部「コマンドライン ツールのみ入手する」で、SDK Tools 25.2.5が手に入るという記述がありますが、 **現在（2017/05/28）ではそうではないようです。**

# AndroidSDK Tools 25.2.5を探そう
過去のバージョンのAndroidSDK Toolsは公式には配布していなさそう。
あまりいい方法とは思えませんが、「AndroidSDK Tools 25.2.5」でググって誰かが公開してくれるものを入手しました。

これを展開して、Android SDKのインストールされているディレクトリの「tools」ディレクトリと置き換えればAndroidSDK Toolsのダウングレード完了です。

## 直ると良いね
応急措置でしかないので、今後のアップデートで直ってほしいです。
[Rails]Action Mailerで送信するメールをプレビュー表示し、確認してから送信する方法


# はじめに

Action Mailerを使っている方は多々いると思いますが、
送信前にどのようなメールが送信されるか確認してメール送信したい時はありませんか？

例えば、Viewのフォームから入力された値をメール本文に入れてメールを送信するという場合、
送信者は合っているのか？本当にタイプミスは無いか？等です。

先日、上記機能を実装しようとしてググったらletter_openerでのプレビュー関連の情報しか出てこなくて、
「いやいや、productionでみたいんだよ！確認してから送信したいんだよ！」とイラッとしたので、
送信するメールの内容を確認してから送信する方法を簡単に記載します。


# 前提
Action Mailerを触ったことあることを前提として記載します。
ざっくりとした流れをメインにしますので細かいところは他で調べてください！

Rails 4.2.6
Ruby 2.3.1


# やりたいこと
１．Viewのフォームで入力された値を取得
２．Action Mailerに渡して、メール作成
３．プレビュー表示
４．メールを送信

# Let"s try!!

### １．Viewのフォームで入力された値をcontrollerで受け取り、Maileのインスタンスを生成
フォームのPOST先アクション

```ruby:customer_mail_controller.rb
def preview_information_mail
  subject = params[:subject]　#フォームで入力された値の取得　
  mail_to = params[:mail_to]　#フォームで入力された値の取得
  name = params[:name]
  message = params[:message]　#フォームで入力された値の取得
  @mail = UserMailer.information_mail(subject, mail_to, name, message)
end
```

Action Mailerのメール送信アクション

```ruby:user_mailer.rb
def information_mail(subject, mail_to, name, message)
  @name = name	
  @message = message
  mail to: mail_to, subject: subject
end
```

information_mailのメールテンプレート

```ruby:information_mail.text.erb

<%= @name %> 様

いつもお世話になっております。

Hogehogeです。

<%= @message %>

よろしくお願いします。
```


### ２．作成したメールインスタンスを使ってプレビュー画面を作成
作成したメールは、@mailインスタンスに入れました。
値は以下のように参照できますので、確認画面を好きなように編集してください。
（ちなみに私はJSで非同期でプレビューを表示するようにしました。）

```
@mail.subject　メールのサブジェクト
@mail.message.body.raw_source メールの本文
```

なお、そのまま表示すると、改行が反映されないと思います。
その場合は、```simple_format(@mail.message.body.raw_source)```のようにしてあげると、
見やすく表示されます。

上記の他にも、様々なメールの情報が参照可能です。
Action Mailerは内部で以下のmail gemを使っているらしいので、
もし、本文以外の他の情報を参照したい場合はgemの参照してください。
https://github.com/mikel/mail/tree/master/lib/mail


### ３．メールの送信
メール送信のアクションに対して、POSTしてメールを送信します。
以下のアクションは、previewの時と同じパラメーター名で値を(hidden等で)送った場合の例です。

previewとsendのアクションは共通しているところが多いので、
実装するときはほぼ共通化(DRYに)できます。

メール送信のPOST先アクション

```ruby:mail_send_controller.rb
def send_information_mail
  subject = params[:subject]　#フォームで入力された値の取得　
  mail_to = params[:mail_to]　#フォームで入力された値の取得
  name = params[:name]
  message = params[:message]　#フォームで入力された値の取得
  @mail = UserMailer.information_mail(subject, mail_to, name, message)
  @mail.deliver_now!
end
```


# 参考にしたサイト

Action Mailerのdelivery_methodに独自の配信方法を追加する
　http://qiita.com/sheepland/items/0bbf5c6f9fba08caf0a6
.NET CoreでMySQLにアクセスする（2017年5月編）


.NET Coreはいいと思うのだけれど、MySQLとかを利用できなければ結局Linux上とかでは使わないな・・・というのが正直なところでした（まあ、今となってはSQLServerもLinuxで動きますが）。

一方、[MySQL用のドORM?はサードパーティ系しかなく](http://qiita.com/zaburo/items/a167c9ad94fcea625c56)、「うーん」って感じでした。が、しばらく動向を追わないうちに、2017年3月にOracleからオフィシャルの[MySQL.Data.EntityFrameworkCore](https://www.nuget.org/packages/MySql.Data.EntityFrameworkCore/)というのが出たようなので試してみます。

この記事が最後の調査となればいいのですが。。。

>project.jsonが廃止され、.csprojファイルになったんですね。。。

## 環境

私はMac上で利用しています。.NET Coreのバージョン（これややこしいですが）はいわゆる1.0.4です。

## 準備とインストール

### DBの準備

とりあえず、ローカルのMySQLにmemberテーブルを作成し、id,name,emailを作りました。
適当にデータも追加しておきます。

```bash
create table member
(
	id int primary key auto_increment,
	name varchar(32),
	email varchar(32)
);
```

### 作業場の作成

今回はコンソールアプリとして実装してみます。

```bash
cd 
mkdir mysql
cd mysql
dotnet new console
```

### MySQL.Data.EntityFrameworkCoreのインストール

バージョンを指定しないと怒られました。
インストールすると依存関連ファイルも追加されます。

```bash
dotnet add package MySql.Data.EntityFrameworkCore -v 7.0.7-m61
```

インストールしたら、

```bash
dotnet restore
```

で関連ファイルをダウンロードします。

## 実装

いろいろな書き方ができますが、過去記事との互換性を重視して、シンプルに書きます。

### コード

```c#
using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using MySQL.Data.EntityFrameworkCore.Extensions;

namespace mysql
{
    //接続準備（まあ、普通は別のcsに書く）
    //モデル
    public class Member
    {
        public int id{get;set;}
        public string name{get;set;}
        public string email {get;set;}
    }

    //DbContext（DBとクラス情報をマップする）
    public class MyContext:DbContext
    {
        public DbSet<Member> Members{get;set;}

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            => optionsBuilder.UseMySQL(@"server=localhost;database=testdb;userid=root;password=root;sslmode=none;");
    }

    //メインのコード
    class Program
    {
        static void Main(string[] args)
        {
            using(var context = new MyContext())
            {
                var ret = context.Members.ToList();

                foreach(var x in ret)
                {
                    Console.WriteLine($"{x.id} {x.name}");
                }
            }
        }
    }
}
```

### 実行

```bash
dotnet run
```

とりあえず動きました。以上です。
IntelliJ IDEAで"Class JavaLaunchHelper is implemented in both"という警告がでるときの対処法

Javaプログラム実行時にタイトルのようなメッセージが出るときの対処法
Java SE 7では最新版を使えば大丈夫なようですが、OracleJDK Java 8の最新版である8u131(2017/5/28時点)では修正がまだ取り込まれていないようなので、とりあえずの対処法を書きます。

### 対処法の一覧(下記参考リンクより)
以下の四つの対処法が紹介されています。

1. Help -> Edit Custom Propertiesで`idea.no.launcher=true`を設定する。
   * カスタムプロパティを設定していない場合は設定ファイルを作るかどうか聞かれます。
2. JetBrainsがパッチを当てたJDKを使う
3. Java9またはJava 8u152のbetaを使う
4. コンソールの見た目の問題で動作自体には影響しないので無視する

1つ目の方法は警告の原因となっているlauncher自体を切ってしまい、graceful exitやスレッドダンプなどの機能もオフになってしまうそうです。

私の場合は、2つめの方法で改善しました。File -> Project Structure... 内のProject SDKsで[ここ](https://bintray.com/jetbrains/intellij-jdk/download_file?file_path=jbsdk8u112b801_osx_x64.tar.gz)からダウンロードできるJDKを指定してあげれば警告文は出ません。

3つ目にも書かれている通り、すでにこのバグの修正はJava 9または8u152に取り込まれており、リリースされればそちらを使えば根本的に解決する見通しです。


### 参考
[YouTrack objc: Class JavaLaunchHelper is implemented in both ..." warning in Run consoles](https://youtrack.jetbrains.com/issue/IDEA-170117
)
[stackoverflow objc[3648]: Class JavaLaunchHelper is implemented in both](https://stackoverflow.com/questions/43003012/objc3648-class-javalaunchhelper-is-implemented-in-both)
SQL Server LocalDBであれこれの備忘録

とりあえず、まだよくわからないが、備忘録。

## データベース作成方法

##### インスタンス名の列挙

```
C:\Users\kei>sqllocaldb info
MSSQLLocalDB
```

##### インスタンスのパイプ名取得

```
C:\Users\kei>sqllocaldb info MSSQLLocalDB
名前:               mssqllocaldb
バージョン:         13.0.1601.5
共有名:
所有者:             XXX-PC\kei
自動作成:        はい
状態:              実行中
前回の開始時刻:    2017/05/27 20:22:13
インスタンス パイプ名: np:\\.\pipe\XXXXXXXXXXXXX\tsql\query
```

##### インスタンスへ接続

```
C:\Users\kei>sqlcmd -S np:\\.\pipe\XXXXXXXXXXXXXX\tsql\query
1>
```

##### データベース一覧表示
`go`を付ける

```
select name from sys.databases;
go
```

##### データベースの作成

```
create database testdb
go
```

## データベースの保存場所
VisualStudioのサーバーエクスプローラーでデータベースに接続する際に、保存場所を特定する必要がある。
なぜか、保存場所はデータベース作成方法によりばらつきがあるみたい。

##### SSMS（SQL Server Management Studio）を使用してデータベース作った場合
`C:\Users\ユーザー名\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\インスタンス名`

##### sqlcmdを使用してデータベースを作った場合
`C:\Users\ユーザー名\`直下
TensorFlowでAM復調

#概要
TensorFlowで、AM復調やってみた。

#写真
上　元の波形
中　AM変調
下　復調した波形

![am5.png](https://qiita-image-store.s3.amazonaws.com/0/18104/b1bd89c3-c843-2103-953e-ec8163e5ee62.png)
[Node] [Javascript] yarnのアップデートコマンド yarn self-update でバージョンアップができない

環境: Mac OSX 10.11.6

```
$ yarn self-update
```
でyarn自信のバージョンアップができるそうだが、できなかった。
どうやらbrewでインストールしたものだとできないらしい。
（brewで入れていたのを忘れていた）

brewのものを使う場合は、

```
$ brew upgrade yarn
```

※ 今後も不都合でてきそうだったので、この機会にnpmの方に変更した

```
$ brew uninstall yarn
$ npm install -g yarn
```
遅延評価とは何か

# 前書き

<!-- この記事は何に付いて書かれたものかを記述する。 -->

Scalaの遅延評価はStreamで行うことができます。が、遅延評価ってそもそも何だっけ？ということで、遅延評価についてまとめてみました。

遅延評価？？となった時にリファレンスとして参考していただけると幸いです。この記事を書くために参考にした文献は記事の最後にまとめてあるので、そちらも参考にしてみてください。記事の中でおかしな点や疑問に感じた点があればコメントをお願いします。

# 遅延評価とは

遅延評価とは、言葉の通り評価を遅延して行うことを言います。もっとくだけた言い方をすると、値が必要になるまで、値の評価を後回しにするということです。

## 遅延評価をしないコード
以下のScalaのコードは **遅延評価ではない** コードの例です。

```scala:NotLaziness.scala

def sum(l: Int, r: Int): Int = l + r

```

この関数ではInt型の引数を二つ（lとr）を取り、二つを足し算した結果を返します。このどこが遅延評価ではないのでしょうか？このコードは、引数を受け取った段階で、引数の値が評価済みになります。つまり、値が必要となる演算（足し算）が行われる前に、lとrの値が決定済みになっているということです。よって、このコードは遅延評価をしていません。

## 遅延評価をするコード

遅延評価をするコードは、**値が必要になった段階で初めて値が決定する** コードです。先ほどの例を遅延評価を行うコードに書き換えてみましょう。

```scala:Laziness.scala
def sum(l: () => Int, r: () => Int): Int = l + r
```

先ほどの例とほとんど変わっていませんが、このコードは遅延評価をしています。つまり、演算（足し算）が行われる時に、lとrの値が初めて決定されるということです。どのようにしてこのコードは遅延評価を実現しているのでしょうか。それは各引数の前に( ) => をつけることで実現しています。この表記は見慣れないかもしれませんが、引数なしの関数を引数に取るということになります。つまり、このコードは**関数を引数に取り、演算が行われる時点で関数を実行して必要となる値を得る**ということをしています。

Scalaでは、引数がない関数の場合、括弧を省略できるので以下のように書くこともできます。以下のような書き方の方がスッキリしていて見やすいですね。

```sala:LazinessSimple.scala
def sum(l: => Inte, r: => Int): Int = l + r
```

# 遅延評価をすると何が嬉しいのか

ここまで遅延評価とは何か、どうやって遅延評価をするのか、ということについて見てきましたが遅延評価を行なって一体何が嬉しいのでしょうか。今まで見てきた例では遅延評価をしようが、しまいが何も嬉しいことはありませんでした。

ということで、評価を遅延することの有用性を例示したいと思います。以下は３つの引数を取り、一つ目の引数 t が true なら残りの二つの引数を足し算し結果を返す関数になります。この例は、評価を遅延することで余計な演算を行わないようにしています。

```scala:mayBeSum.scala
def mayBeSum(t: Boolean, n: => Int, m: => Int): Int =
  if(t) n + m else 0
```

この例の重要な点は引数の n と m を遅延評価することで、引数 t が false であった場合に n と m を評価しない点にあります。よって、n と m の値を得るためにコストがかかる場合でも必要とされなければ評価はされず、コストがかからなくて済みます。例えば、以下のような例です。

```scala:callMayBeSum.scala
// 指定したファイルのサイズを返す関数。ちょっと時間がかかる。
def readFileSize(path: String): Int = { .... }

// isOK が ture なら、appleList.xml と　orangeList.xml のファイルサイズの合計を返す。
// isOK が false なら、ファイルサイズの計算は行われず、０が返される。
mayBeSum(isOk, readFileSize("appleList.xml"), readFileSize("orangeList.xml"))

```

## lazyキーワードをつけて、評価の回数を１回にする

lazyキーワードを変数定義の前につけることで、値の評価を一回に限定できます。例えば、次のコードでは遅延評価を行うコードですが、値が必要となるタイミングが２回あるため２回評価されます。

```scala:NotLazyKeyWord.scala
def square(n: => Int): Int = n + n
```

値が複数回評価されることは、無駄なことをしているということです。なぜならば、何回評価を行なっても評価結果は同じだからです。（純粋関数ならば）上記の例では、nは足し算をする時に２回評価され値が決定しますが、一度評価を行い値を得れば再度評価して値を得る必要はないはずです。そこで登場するのがlazyキーワードになります。

早速、lazyキーワードを使って先ほどのコードの、引数の評価回数を一回にしてみましょう。

```scala:LazyKeyWord.scala
def square(n: => Int): Int = {
  lazy m = n
  m + m
}
```

上記のコードでは、nをlazyキーワードがついたmに入れています。その後、mを使用して演算を行なっています。

lazyキーワードをvalとともに記述すると、＝の右辺にある評価が最初に使用されるまで遅延されます。そして、一度評価が行われると結果をキャッシュするため、後で使用するときはキャッシュされた値を使用します。こうすることで、評価の回数を１回に限定できます。上記のコードではnの評価はm + mの左辺で初めて行われ、右辺ではキャッシュされた値を使用します。よって、nの評価は１回になります。

# 参考

[Scala Documentation - 具象不変コレクションクラス](http://docs.scala-lang.org/ja/overviews/collections/concrete-immutable-collection-classes)