OmniAICreator/Qiita-1.07M huggingface dataset:
QRコードメモ

# 参考
http://qiita.com/tool-taro/items/73d8e63b7a1ccc10ed3c

# ライブラリのダウンロードURL
https://mvnrepository.com/artifact/com.google.zxing/core/3.3.0
https://mvnrepository.com/artifact/com.google.zxing/javase/3.3.0

# 手順
1. core-3.3.0.jarとjavase-3.3.0.jarをWebContent/WEB-INF/libに置く
2. 以下のServletとJSPを作成(JSP側から実行)

```jsp:qrCode.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>QRコード表示</title>
</head>
<body>
<h1>QRコード表示</h1>
<%-- <img>タグのsrc属性にQRコード描画サーブレットを指定 --%>
<img style="width: 100px; height: 100px" src="QRcodeGenerator">
</body>
</html>
```

```java:QRcodeGenerator.java


import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.concurrent.ConcurrentHashMap;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * Servlet implementation class Qrcode
 */
@WebServlet("/QRcodeGenerator")
public class QRcodeGenerator extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //QRコード生成したい文字列の設定
        String source = "★★★";
        //QRコード生成時のエンコーディング
        String encoding = "UTF-8";
        //サイズ(ピクセル)
        int size = 100;

        //生成処理
        ConcurrentHashMap hints = new ConcurrentHashMap();
        //エラー訂正レベル指定
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        //エンコーディング指定
        hints.put(EncodeHintType.CHARACTER_SET, encoding);
        //マージン指定
        hints.put(EncodeHintType.MARGIN, 0);
        QRCodeWriter writer = new QRCodeWriter();
        BitMatrix bitMatrix;
		try {
			bitMatrix = writer.encode(source, BarcodeFormat.QR_CODE, size, size, hints);
	        BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
	    	// 画像をクライアントに返却する
			response.setContentType("image/png");
			OutputStream os = response.getOutputStream();
			ImageIO.write(image, "png", os);
			os.flush();
		} catch (WriterException e) {
			e.printStackTrace();
		}

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

```
Atomのファイルツリーがスクロール出来なかった際の対処方法

## 発生した問題
全く検討がつかないタイミングでファイルツリーがスクロール出来なくなった。
パッケージのコンフリクトなどが問題かもしれないが、調査してもそれらしき答えは得られなかったので、力技で解決することにした。

## やり方
原因となっている箇所を探るためにDeveloper toolで要素の検証をしてみる。
Developer toolsの表示方法はAtomのメニューより `view > Developer > Toggle Developer tools`で表示させることができる。

`.tool-panel`という名前のついた要素から`overflow: scroll;`が消えていることが問題のようなので、Atomのスタイルシートに直接書き込んで修正を加える。

スタイルシートに変更を加えるにはAtomメニューより`stylesheet...`という項目を選択。
そこに以下のスタイルを加える。

```
.tool-panel {
  overflow: scroll;
}
```

以上で解決出来る。

原因がわからないので、気持ち悪さが残るので何かわかるかたコメントをよろしくお願いします。
apex initでIAMを作る段階でError: creating role: NoCredentialProvidersが出る時の対処法

AWS lambdaのデプロイ自動化ツール[Apex](https://github.com/apex/apex)ですが、initの段階でちょっと躓きました。
apex initするとcredential関連でエラー。

```
$ apex init


             _    ____  _______  __
            / \  |  _ \| ____\ \/ /
           / _ \ | |_) |  _|  \  /
          / ___ \|  __/| |___ /  \
         /_/   \_\_|   |_____/_/\_\



  Enter the name of your project. It should be machine-friendly, as this
  is used to prefix your functions in Lambda.

    Project name: shirakia-test

  Enter an optional description of your project.

    Project description: 

  [+] creating IAM hoge_lambda_function role
   ⨯ Error: creating role: NoCredentialProviders: no valid providers in chain. Deprecated.
        For verbose messaging see aws.Config.CredentialsChainVerboseErrors
```

`.aws/config`に`aws_access_key_id`と`aws_secret_access_key`が書いてあっても読んでくれないようだった。
`aws_access_key_id`と`aws_secret_access_key`を`.aws/credentials`に移動したら解決。
`~/.aws/credentials`の中身は以下のような感じ```
[default]
aws_access_key_id = xxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

または、```
export AWS_SDK_LOAD_CONFIG=1
```
とすると.aws/configの中に書いたままでも読んでくれる。
Apexがaws-sdk-goに依存しており、そっち対応が必要だったという話。


# 参考
https://github.com/apex/apex/issues/426
https://github.com/aws/aws-sdk-go#aws-shared-config-file-awsconfig
Ruby on Railsのインストール方法 for Mac

※2017.06.11時点
# rbenvで最新のrubyバージョン2.4.1にする
ruby-buildを最新にする

    $ brew update
    $ brew upgrade rbenv ruby-build

インストール可能なリストを表示する

    $ rbenv install -l

新しいRubyバージョンのインストール

    $ rbenv install 2.4.1

インストール済みのrbenvを確認する

    $ rbenv versions

インストール済みのRubyのバージョンを更新する

    $ rbenv global 2.4.1

インストール済みのrubyのバージョン確認

    $ ruby -v

# Railsをインストールする
以下のコマンドを実行し、必要なパッケージをインストール

    $ sudo gem install rails -v 5.0.3

webアプリの構築

    $ rails _5.0.3_ new アプリ名

※Make sure that `gem install sqlite3 -v '1.3.13'` succeeds before bundling.と言われた場合は以下を実行

    $ sudo gem install sqlite3 -v '1.3.13'
    $ sudo gem install puma -v '3.9.1'
jsdoでconvnetjs その16

#概要
convnetjsの、凄いデモ、見つけたのでjsdoに移植した。

#凄いデモ
http://selfdrivingcars.mit.edu/deeptrafficjs/

#写真

![tr.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/3907c533-5cca-9276-90a8-3877400ff0ca.jpeg)

#成果物
http://jsdo.it/ohisama1/89ch
Qiitaの投稿で設定値の変更などの差分を分かりやすく書く方法

Markdownにあまり詳しくないのでメモ :writing_hand_tone2:

設定値の変更例を分かりやすくするときとかに使えそう。

```diff:差分を分かりやすくする例
- 変更前
+ 変更後
```

↑こんな感じで表示したかったら


```
```diff:差分を分かりやすくする例
　- 変更前
　+ 変更後
　```
```

↑こう書くみたい :wink:

[Qiitaでシンタックスハイライト可能な言語一覧](http://qiita.com/Qiita/items/e84f5aad7757afce82ba) に ”diff” ってありますね :thumbsup_tone2:


★追記
本来はunified形式のためのものなんですね。
（@tsuyoshi_choさん、ありがとうございます。）

```console
$ diff -u test_before.txt test_after.txt
```

```diff:unified形式の場合のシンタックスハイライトの例
--- test_before.txt     Sun Jun 11 14:52:53 2017
+++ test_after.txt      Sun Jun 11 14:53:13 2017
@@ -1,3 +1,2 @@
 test1
-test2
-
+test3
```
LoginHook, LogoutHookについてのメモ

忘れる事が多いので自分用 & コピペ用にメモ
#LoginHook
ログイン画面でパスワードを入力した直後のギアマークが回転している時に実行される。※1

設定されているスクリプトのPathを表示
``sudo defaults read com.apple.loginwindow LoginHook``

スクリプトを設定
``sudo defaults write com.apple.loginwindow LoginHook <スクリプトのPath>``

スクリプトの設定を解除
``sudo defaults delete com.apple.loginwindow LoginHook``

※1. ``sleep``を入れたスクリプトを入れた所いつもよりログインする時間が長くなった。
#LogoutHook
ログアウト時に実行される。(正確な実行タイミングは不明)
``LoginHook``を``LogoutHook``に変えるだけ。

設定されているスクリプトのPathを表示
``sudo defaults read com.apple.loginwindow LogoutHook``

スクリプトを設定
``sudo defaults write com.apple.loginwindow LogoutHook <スクリプトのPath>``

スクリプトの設定を解除
``sudo defaults delete com.apple.loginwindow LogoutHook``
#注意
スクリプトはroot権限で実行される。

-  ``sudo``は入れなくてもよい。
-  不要なコマンドが実行されないように注意。
-  ※追記 スクリプトへのPathは絶対パスで指定すること。

#参考
- [ログイン／ログアウト時に実行するスクリプトを設定する - Qiita](http://qiita.com/snaka/items/9b6007ce9c014c17e408)

#追記
うまく実行されないとログイン画面のギアマーク回転から進まなくなることがある。
そうなったらVerboseモードやらシングルユーザーモードやらでLoginHookの設定を解除する方法しか私は見つけていない。
C# で MSG コマンドを実行する

C# で MSG コマンドを実行するサンプルコードです。
数時間はまったのでメモっておきます。

ポイントは ProcessStartInfo.FileName に指定する値。

それから、MSGコマンドはエラーがあるとStandardErrorにエラーメッセージを出力するので、それをチェックするようにしています。

```C#
public void SendMessage(string account, string computer, string message)
{
    var startInfo = new ProcessStartInfo
    {
        FileName = @"C:\windows\sysnative\msg.exe",
        Arguments = string.Format("{0} /SERVER:{1} \"{2}\"", account, computer, message),
        RedirectStandardError = true,
        CreateNoWindow = true,
        UseShellExecute = false,
    };
    var p = Process.Start(startInfo);
    var errorMessage = p.StandardError.ReadToEnd();
    p.WaitForExit();
    p.Close();

    if (errorMessage.Length > 0)
    {
        // エラー発生時の処理
    }
}
```
nginxをLaravel用に設定する

#これまでのおさらい
1. vagrantでCentOS7.3の環境を作った:[参照](http://qiita.com/panappe/items/a876e06488fab4a9af8b)
2. CentOS7.3の環境にPHP7.1をインストールした:[参照](http://qiita.com/panappe/items/9963e18da8dd4d1bf994)
3. Laravel 5.4をインストールした:[参照](http://qiita.com/drafts/b5ce191b6156a0fa1ed5)
4. nginxのインストール：[参照](http://qiita.com/panappe/items/f7a9b3d906810406f543)
5. nginxでLaravel5.4を動かすぜー:metal_tone2:　←これから

#nginxをLaravel5.4用に設定する
##1.php-fpmのインストール

###1-1.インストールする
```console
$ sudo yum install --enablerepo=remi-php71 php-fpm
```

リポジトリが追加してなければ追加しておくこと
[参照](http://qiita.com/panappe/items/9963e18da8dd4d1bf994)

###1-2.設定ファイル変更

```console
$ sudo vi /etc/php-fpm.d/www.conf
```

```bash:/etc/php-fpm.d/www.conf
# 変更箇所のみ抜粋

user = nginx
group = nginx

listen = /var/run/php-fpm/php-fpm.sock

listen.owner = nginx
listen.group = nginx

```

###1-3.起動する。

```console
$ sudo service php-fpm start
```

起動時に/var/run/php-fpm/php-fpm.sockが作られるので権限設定しておく。

###1-4.php-fpm.sockの権限を変えておく。


```console
$ sudo chmod 755 -R /var/run/php-fpm/php-fpm.sock
```

###1-5.自動起動のおまじない :pray_tone2:

```console
$ sudo systemctl enable php-fpm.service

メモ: sudo chkconfig php-fpm onでもできるけど
　　　　　　　　　　　CentOS7では以下のようにするのが普通みたい
```


よし、php-fpmは終わり :thumbsup_tone2:

##2.nginxの設定
###2-1.アプリ用のconfファイルの設定

デフォルトの設定/etc/nginx/conf.d/default.confをリネームして使うことにする。

```console
$ cd /etc/nginx/conf.d
$ sudo mv default.conf laravel.conf
```

リネームしたlaravel.confの設定

```console
$ sudo vi laravel.conf
```

```bash:/etc/nginx/conf.d/laravel.conf
# /var/www/sample/がlaravelのプロジェクトのルートの場合
server{

   # fastcgi_paramの$document_rootが正しく設定されるようにここでrootの設定
   root   /var/www/sample/public;

   location / {     
        index  index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        # fastcgi_passは/etc/php-fpm.d/www.confのlistenで指定したパス
        # unix:を忘れない、権限がないと色々エラーが起きる
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

}
```

###2-2.起動

```console
$ sudo service nginx start
```

###2-3.こっちもおまじない :pray_tone2:

```console
$ sudo systemctl enable nginx.service
```

fastcgiの設定で実は色々はまったりしたけど何とかできた :muscle_tone2:

![welcome.png](https://qiita-image-store.s3.amazonaws.com/0/186397/f7441e4a-875f-7572-e4cd-69ea4ebb4b37.png)

動いたぜー、あざす :kiss_ww:
正規表現あれこれ（メモ）

# 正規表現について
※ 随時更新

## 基本構文
### 囲みに使う文字
```
/正規表現/
```
```
|正規表現|
```
```
|正規表現|
```
```
#正規表現#
```
```
%正規表現%
```

### 行の先頭
```
/^正規表現/
```

### 行の末尾
```
/正規表現$/
```
```
/正規表現\z/
```

## パターン
### /を正規表現でマッチさせたい
```
|正規表現\/|
```

### 半角英字
```
/^[a-zA-Z]+$/
```


### 半角英数字
```
/^[a-zA-Z0-9]+$/
```

### 年月フォーマット（yyyy/mm）にマッチさせたい
```
|^(\d{4})\/(\d{2}\z)|  
```
()：グループ化。()の中に記載された内容が1回以上繰り返しがある  
\d：半角数字の0~9  
{}：{}の前のものが4個続く

### その他
* preg_matchでマッチしない条件

```php
function notMatch(){
  if(!preg_match("/正規表現/")) {
    echo "マッチしない場合に処理される";
  } 
}
```
PythonでWindowsのスニッピングツールらしきものを実装してみた

# 概要
PythonでWindowsのスニッピングツールらしきもの（ドラッグ＆ドロップで選択した領域を画像として保存するプログラム）を実装してみました．やや強引な実装なのかもしれませんが，ご容赦下さい．

Youtubeにプログラムが動作しているところをUPしたので，是非一度ご覧下さい．
https://www.youtube.com/watch?v=e2zePSUGwaA

# 動機
前回投稿した「[Pythonでタイピングゲームをプレイしてみた](http://qiita.com/harupy/items/4b5c6ba5e73031f213b4)」のプログラムを作成した際，<font color="Red">スクリーン上でキャプチャしたい領域のピクセル座標を，直感的かつ動的に取得する方法</font>を模索していたところ，Windowsのスニッピングツールのような形式が最適だと思ったので，Pythonで実装してみようと思いました．

# 環境
OS : Windows10
Python Version : 3.5.3

# 使用した主なライブラリ
PyQt5, Pillow, OpenCV

# プログラムの動作

``` main.py
# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
import tkinter as tk
from PIL import ImageGrab, Image
import matplotlib.pyplot as plt
import numpy as np
import cv2

class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        root = tk.Tk()
        screen_width = root.winfo_screenwidth()
        screen_height = root.winfo_screenheight()
        self.setGeometry(0,0,screen_width, screen_height)
        self.setWindowTitle("")
        self.setWindowOpacity(0.3)
        QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor))
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.begin = QtCore.QPoint()
        self.end = QtCore.QPoint()

        print("Capture the screen...")
        self.show()

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.setPen(QtGui.QPen(QtGui.QColor("black"), 3))
        qp.setBrush(QtGui.QColor(128, 128, 255, 128))
        qp.drawRect(QtCore.QRect(self.begin, self.end))       
        
    def mousePressEvent(self, event):
        self.begin = event.pos()
        self.end = self.begin
        self.update()

    def mouseMoveEvent(self, event):
        self.end = event.pos()
        self.update()
    
    def mouseReleaseEvent(self, event):
        self.end = event.pos()
        self.close()
           
        x1 = min(self.begin.x(), self.end.x())
        y1 = min(self.begin.y(), self.end.y())
        x2 = max(self.begin.x(), self.end.x())
        y2 = max(self.begin.y(), self.end.y())
        
        img = ImageGrab.grab(bbox=(x1,y1,x2,y2))
        img.save("capture.png")
        img = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2RGB)

        cv2.imshow('Captured Image', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MyWidget()
    window.show()
    app.aboutToQuit.connect(app.deleteLater)
    sys.exit(app.exec_())

```
---
1. ```PyQt5```を使用して，背景を透過させたGUIをスクリーン全体を覆うように配置．
2. マウス関連のイベントリスナーを用いて，GUI上でのドラッグに合わせてピクセル座標を取得し，それをもとに長方形を描画．
3. ドロップ時，GUIを消去した後，```Pillow```の```ImageGrab```を用いて，選択した領域をキャプチャし画像として保存．
4. ```OpenCV```を用いて，取得した画像を表示．

# 応用
1. スクリーンキャプチャを起点とするプログラムと組み合わせる．
2. 取得した座標を用いて何かする．

# まとめ
PythonでWindowsのスニッピングツールらしきものを実装することができた．
SourceTreeでCreate Repositoryしようとすると、なぜか怒られる

### 解決法

プロジェクトのフォルダはあらかじめ作らない。これから作る架空のパスを入力する。

### 問題

<img width="339" alt="170611-SourceTree-ErrorMessage.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/12939/eed493b0-250b-4b77-a83e-b1bc29f814a9.png">

空のフォルダなんですけど…

仕方ないので手動で作成する。

<img width="906" alt="170611-SourceTree-ErrorMessage2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/12939/bfd6ed94-b1cc-859e-9b60-07cba2e801ec.png">

該当フォルダに移動して`git init`を実行。

<img width="455" alt="170611-SourceTree-ErrorMessage3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/12939/6fe5e739-c67f-ae40-c1e9-bc5f968810d8.png">

最後に「追加」

<img width="906" alt="170611-SourceTree-ErrorMessage4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/12939/7a29afa2-98fd-23bb-408a-5e53981e8a82.png">

いいんだろうか、こんな対処法で…

-----
ブログ書いてます：http://weed.nagoya
【iOS 11対応】知っておきたい位置情報周りの変更点

<i>※本記事は、[一般に公開されている情報](https://developer.apple.com/videos/play/wwdc2017/713/)を元に作成しています。記事中の画像はWWDCのスライドのものを引用しております</i>

位置情報を扱うiOSアプリを開発する際に必要となる <b>Core Location</b> ですが、iOS 11 でもいくつか変更点があるようです。気になったものを以下にまとめます。


## CLGeocoder improvements

GLGeocoder が Contacts framework をサポートしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/7926d209-5e8c-b944-dcba-e225c6b69502.png)

例えば GLPlacemark から CNPostalAddress を取得することも可能になりました。


## Authorization and usage reporting

権限周りも大きな変更がありました。位置情報を利用する際、今までは

* NSLocationWhenInUseUsageDescription（使用中のみ許可）
* NSLocationAlwaysUsageDescription（常に許可）

のどちらかをサポートすればよかったのですが、iOS 11 からは **NSLocationWhenInUseUsageDescription（使用中のみ許可） のサポートが必須**になりました。

つまりこれは、"常に位置情報の使用を許可しないといけないアプリ"が、今後なくなることを意味します。

また、この変更はすでに公開済みの古いアプリにも適用されます。

* [iOS 11では、UberやWazeのようなアプリに位置情報を常時収集させなくすることができる \| TechCrunch Japan](http://jp.techcrunch.com/2017/06/08/20170607ios-11-adds-while-using-the-app-for-all-apps-location/)

上記エントリのように、今まで「常に許可」しか選択できなかったアプリが、突然 iOS 11 から「使用中のみ許可」も選択できるようになるのはこのためです。

この変更に伴い、「常に許可」と「使用中のみ許可」を両方含んだ新しいプライバシー項目（NSLocationAlwaysAndWhenInUseUsageDescription）が追加になっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/a0dbd28f-85ad-450c-3ecf-9681eb311f7f.png)

初回起動時など、ユーザが何も許可していない状態で `requestAlwaysAuthorization ` を実行すると、この `NSLocationAlwaysAndWhenInUseUsageDescription` がダイアログに表示されます。ユーザは「常に許可」か「使用中のみ許可」を選択できます。

### Supporting Always Authorization

今後も「常に許可」をサポートしつつ、かつ古いiOSバージョンもサポートしたい場合は、すべてのプライバシー項目を設定し、ユーザにそれぞれの権限が選択可能である旨を説明するのがベストプラクティスのようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/b93b2456-568f-06db-2a66-fc9a77d3f8e9.png)

### Requesting Authorization 

「常に許可」はあくまで「使用中のみ許可」の追加要素であり、まずはユーザに「使用中のみ許可」を求め、その後必要になったときに「常に許可」へ遷移するフローをAppleは推奨しているようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/a52af567-dc05-90cc-e452-9221a22bf61e.png)

次の図では、ユーザーによる許可ステータスの遷移がわかりやすくまとまっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/93e3c9e1-afbf-a564-7d6f-5dcffeb2ccae.png)

今後もしかすると `NSLocationAlwaysUsageDescription` が無くなるかもしれませんね。

### Location Usage Indicators

iOS 10 までは「使用中のみ許可」したアプリが、バックグラウンド動作中に位置情報を使用した場合「○○が位置情報を利用中」という青いバーが表示されたと思います。（例：Google Maps アプリでナビモード実行中にホームボタンを押してバックグラウンド状態にした場合）

iOS 11　からは「常に許可」のアプリがバックグラウンド中に位置情報を使用した場合も **常にこの青いバーが表示** されるようになります。（iOS 11リリース直後はこの仕様を知らないユーザーさんが混乱しそうですね）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/373fd34b-d7e3-703c-98a5-e3adfba2fa75.png)

画面右上の矢印のポリシーにも変更があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/801ae3da-fd4b-b57d-96a7-0f9c603e38f5.png)

Hollow arrow： 位置情報要求中

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/dd9680e7-caa8-2cba-dbfc-f4ea02dc47e0.png)

Solid arrow: 位置情報受信中

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8292/5b5e4766-3c7d-e34b-d54d-7e43d8b1fb51.png)



## まとめ

「使用中のみ許可」しかサポートしていないアプリはあまり影響がなさそうですが、「常に許可」をサポートしている場合は、そのアプリが位置情報を常に使わなければならない理由を説明するなど、何かしらの対応が必要そうですね。
Webページをデスクトップアプリ化する方法



MacでWebページをデスクトップアプリにします。
そうすると、いちいちタブなどで移動していた手間が省けてとても有意義です。
操作はターミナルから行い、npmで提供されているNativefierを使います。
npmを使うにはNode.jsが必要です。

# 1. Node.jsのインストール

## 直接公式サイトからダウンロード、インストールする場合
https://nodejs.org/

## バージョン管理もしっかりやりたい場合
こちらはともにターミナルでの作業。
パスを通したりしないといけないので、少し専門的になります。
Nodeはバージョンの誤差とかあるので、プログラマーとかの人は、バージョン管理必須。
その場合は最初に「Homebrew」入れて、次に「Nodebrew」入れて、それからNodeのインストール。
Node.js入れたら、npmも入ります。

Homebrew
https://brew.sh/index_ja.html
Nodebrew

詳しくはこちら
http://qiita.com/nadonado/items/6b59dbcc1a883ae4dedd

## インストールの確認
インストールされたかどうかの確認はターミナルで下記のコマンドを入力。
バージョンが表示されれば問題ありません。

```
$ node -v
$ npm -v
```

# 2. nativefierのインストール

ここまでくればもう一息です。
narivefierは、npmで出ています。下記のコマンドでインストール。

```
$ npm install -g nativefier
```

# 3. アプリを作成する

制作環境ができたので、あとは簡単なコマンドを打てば完了。
きちんとアイコンも用意したい場合は、アイコン変換サイトで指定の形式のものを作りましょう。

## アイコンの作り方

アイコンはicnsというファイルが必要です。
jpgやpngファイルを下記サイトでicons形式に変換できます。

https://iconverticons.com/online/

## アプリの作り方

下記のようにターミナルで指定すると、Homeフォルダにアプリが生成されます。

Qiitaの場合

```
$ nativefier --name "Qiita" "http://qiita.com/" --badge --icon=qiita.icns
```
Mediumの場合

```
$ nativefier --name "Medium" "https://medium.com/" --badge --icon=medium.icns
```
name:アプリケーション名
badge:通知表示
icon:アイコンファイルを指定する

※適時パスは書き換えてください。
SourceTree 設定からSSH設定＆リポジトリをcloneするまでの流れ

##SourceTree 設定からSSH設定＆リポジトリをcloneするまでの流れ

今回はSourceTree 設定からSSH設定＆リポジトリをcloneするまでの流れを解説していきたいと思います。

### 必要なもの
- githubのアカウント→[こちらを参考にしてください](http://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)
- putty →こちらからインストールできます[PuTTY ごった煮版](http://yebisuya.dip.jp/Software/PuTTY/)
- [SourceTree](https://ja.atlassian.com/software/sourcetree) 


### sshキーの作成

SourceTreeを起動し、【ツール】→【sshキーの作成/インポート】を選択します。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/183354/bf33f2fd-2e97-9ed7-fcc2-857c47d75805.png)

【Generate】を選択

適当にマウスを動かしキーを作成します。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/183354/b960e567-45d7-5856-cb9d-62d3f58625f5.png)


【Save public ley】を選択し
id_rsa.pubと保存します。
保存場所や名前は自分がわかれば問題ありません

【Save private key】を選択し
id_rsa.ppkと保存します。
この時確認メッセージが出ますが、今回はパスフレーズは設定しないためそのまま【OK】を選択してください。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/183354/326bb206-f8de-45ef-8158-bc684149fda1.png)



次にPagentを起動します。
先ほど作成した「privateKey」を追加します。
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/183354/ded0272b-2f5d-f372-9dd1-276c9a321618.png)



###githubのSSHキーを設定

ログイン後【settings】→【SSH and GPG keys】を選択し、【New SSH key】を選択し、先ほどの「キー（publickey）」を追加します。

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/183354/a03658cd-aa03-90df-a8d7-e254f1f83b46.png)

Titleは任意で構いません。

これで完了です。

あとは、SourceTreeの【ファイル】→【新規/クローンを作成する】を選択し、
クローンしたいリポジトリの元パス/URLを入力し、クローンします。


###参考
- [GitHubアカウント作成とリポジトリの作成手順](http://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)
- [はじめてのSourceTree（使い方編）](http://qiita.com/naoki85/items/c7660d70347e9e70b201)
Visual Studio / WPF > IDE > public object Convert(object value, Type targetType, object parameter, CultureInfo culture)　を入力するのが面倒 > IDEを使う

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

IValueConverterの実装

```
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
```
とConvertBack()の実装が面倒。

IDEに任せることにした。

### 方法

```
    public class ValueToBrushConverter : IValueConverter
    {

    }
```
まで入力する。

IValueConverterに赤波線が付く。

赤波線にマウスカーソルを移動。
「考えられる修正内容を表示する」をクリック
「インターフェイスを実装します」をクリック。

以下となる。

```
    public class ValueToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
```

左人差し指の怪我治療にしばらくかかるので、ありがたい。
jQueryをF12開発者ツールで使えるようにするブックマークレット

#概要

```
javascript:(function(){var script=document.createElement("script");script.src="https://code.jquery.com/jquery-3.2.1.min.js";document.body.append(script);})();
```

ブックマーク追加して、URLの欄にコピペして、jQuery使いたいページでクリック。
F12開発者ツールで、 jQuery と入力してみる。


```:jQueryなし画面
Uncaught ReferenceError: jQuery is not defined
    at <anonymous>:1:1
```

↓


```:ブックマークレット発動後
function (a,b){return new r.fn.init(a,b)}
```
美しいクラス図の書き方


クラス図を描く上で重要なことは何だと思いますか？
私は、以下の３つを意識して描いています。

- 構成がシンプルで分かりやすいこと
- 読み手の視線の導線を意識すること
- システムの核となるものを表せていること

今回は私の経験を元に、美しいクラス図とは何なのかということをテーマに掘り下げます。

# 美しいクラス図とは

クラス図とは、システムの静的な構造図であると記載があります。（参考：[クラス図 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3)）
静的な構造を表した図ではあるのですが、**止まっているはずのクラス同士が関連を持つことであたかも動いているように見える**ことが美しいクラス図の条件だと思っています。
それには、視線を誘導するためのシンプルな構成と配置、線の結び方が重要になります。
読み手の視線を自然に誘導してあげることで、誰にでも理解がしやすいクラス図を作ることが出来ます。
細部まで実装と一致させる必要はないです。重要なのは、その図を見ることで大まかな構成が一見して分かるということです。
その上で、システムの核となるオブジェクト（ドメインオブジェクト）を上手く抽象化してあげていれば、変更に強い美しい構造を作ることが出来ます。

---

![自動車_クラス図.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/45e04171-88a0-d300-b760-ff4bc687da4b.jpeg)

以前の記事を題材にクラス図を作成してみました。
[オブジェクト指向のメリットを車に例えてみる - Qiita](http://qiita.com/asksaito/items/8a21e32e8eb818472deb)

運転手がカーナビ会社から自動車を手配して、自動車に目的地を渡してルートを受け取り、自動車を操作して目的地まで行く、というものを表しています。
実際のシステム開発では、この規模で収まるシステムはないかと思いますが、作成するに当たって色々と気付いた点があったので、テクニック集としてまとめます。

## テクニック集

- 線をなるべく交差させない
- 線のスタイルは直角線にする
- 処理が左上から右下に流れるようにクラスを配置する
- 基本クラスが上部、具象クラスが下部に来るように配置する
- 継承関係の線はクラスの上部から生やす
- 集約関係の線はクラスの右側から生やす
- 重要なメソッドのみ記述し、不要なメソッドは書かない。
- メソッドの定義順はなるべく処理順になるようにする
- 具象クラスには特徴的な差分だけを書くようにする
- ドメインオブジェクトを色分けする
- コンポジションはそれほど重要ではないので集約関係を重視する
- 最後に図の位置関係を調整し、バランスの取れた配置を心掛ける


# さいごに

ここまで読んでいただきありがとうございました。
正直この話を他の人にしたこともありませんし、一般論ではないので、正しいかどうか自信はありません。
しかし、私がクラス図を描いて上手くいった時に感じたことを書かせて頂きました。
皆さんはどういったところに気を付けて描いているのでしょうか？
正解はないと思いますが、色々な意見を聞いてみたいです。
Rasperry PiにJenkinsおじさんを派遣する

なにも考えずに`sudo apt-get install jenkins`しても、1.565.3とかいう化石が入ります。

# 手順

```shell-session
$ wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-get update
$ sudo apt-get install jenkins
```

これで動くかと思ったのですが、自分の環境だと、javaのバージョンが古く、動きませんでした。
java 1.7でも動かない場合があるようです。
なので、jdk-8をインストールしようと思ったのですが、すでに入っていて、バージョンをいい感じに指定してあげる必要がありました。
具体的には、update-alternativesを使います。

```shell-session
$ sudo apt-get install oracle-java8-jdk
oracle-java8-jdk はすでに最新版です。
$ java -version
java version "1.7.0_131"
OpenJDK Runtime Environment (IcedTea 2.6.9) (7u131-2.6.9-2~deb8u1+rpi1)
OpenJDK Zero VM (build 24.131-b00, interpreted mode)
$ sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 2 個の選択肢があります。

  選択肢    パス                                                 優先度  状態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-openjdk-armhf/jre/bin/java          1063      自動モード
  1            /usr/lib/jvm/java-7-openjdk-armhf/jre/bin/java          1063      手動モード
  2            /usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/bin/java   318       手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 2
```
kompose convert で生成されるファイルをひとつにまとめるシェルコマンド

```bash
$ envsubst < deployment-kompose.yml \
| kompose convert -f - 2>&1 \
| cut -d" " -f3 \
| sed 's/"//g' \
| xargs awk 'FNR==1{print "---"}1' > deployment.yml
```
MacにEthnaを入れる

追記(2017/06/11)：
この方法は非推奨とのことです。
PEARではなく、Composerを使用したインストール方法をお試しください。

----------

MacにEthnaを入れるには、あらかじめPEARコマンドを扱える環境にする必要がある。
しかし、El Capitan や Sierra では以下のようにアクセス権限がないためインストールができない。
[php - Installing pecl and pear on OS X 10.11 El Capitan or macOS 10.12 Sierra - Stack Overflow]
(https://stackoverflow.com/questions/32893056/installing-pecl-and-pear-on-os-x-10-11-el-capitan-or-macos-10-12-sierra)

なので、こちらで PEARをインストールしてしまう。
```sudo php /usr/lib/php/install-pear-nozlib.phar -d /usr/local/lib/php -b /usr/local/bin```

Ethnaにも、sudoコマンドを用いてインストールしていく。
```sudo pear channel-discover pear.ethna.jp
sudo pear install -a ethna/ethna```
Visual Studio / WPF > アプリケーションのフォルダを取得する > System.AppDomain.CurrentDomain.BaseDirectory

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

実行ファイル(.exe)のフォルダを取得したい。

https://stackoverflow.com/questions/938421/getting-the-applications-directory-from-a-wpf-application

```MainWindow.xaml.cs
        private void B_read_Click(object sender, RoutedEventArgs e)
        {
            string appPath = System.AppDomain.CurrentDomain.BaseDirectory;
            MessageBox.Show(appPath);
        }
```

![2017-06-11_10h38_43.png](https://qiita-image-store.s3.amazonaws.com/0/32870/645ddc09-85b8-d04b-5352-67c2c25f01bd.png)

関連情報 http://dobon.net/vb/dotnet/vb6/apppath.html
Docker for Windows の仮想ハードディスクは exFAT に置けない

## 環境

Windows 10 Pro
Docker Community Edition 17.03.1-ce-win12

## 現象

Docker 起動時に、以下のようなエラーが表示される。

> システムで D:/hoge/fuga/MobyLinuxVM.vhdx を作成できませんでした:

> The running command stopped because the preference variable "ErrorActionPreference" or common parameter is set to Stop:

## 対応

私の環境の D ドライブは exFAT でフォーマットされており、ログを見る限り
 MobyLinuxVM.vhdx がパーミッションの問題で作成できなかったようだ。

容量が空いている NTFS のドライブがあったので、Hyper-V マネージャの右側のペインから `Hyper-V の設定 > 仮想ハードディスク` で保存先を NTFS のドライブに変更して Docker を restart して解決。

Windows での exFAT のパーミッションについては調べてもよくわからなかった。誰か教えて欲しい。
draft-js で Flow を使う

## TL;DR
- `node_modules/draft-js/lib/Draft.js.flow` に `@flow` が無いことが原因
- `node_modules/draft-js/lib/Draft.js.flow` に `@flow` を追加すれば暫定的には解決する
- バグ報告済みなので本家が対応してくれることを祈る :pray: 

## バージョン
- draft-js 0.10.1
- flow 0.47.0

## 問題

draft-js のドキュメントに書かれているように

```js
import {EditorState} from 'draft-js';
```

とインポートしたとき、 `EditorState` が Flow で検査されない。

## 原因

Flow は 0.19.0 からあるファイルをインポートしたとき、同じ名前で `.flow` で終わるファイルが同じディレクトリにあった場合、そのファイルを見るようになっている。（詳しくは [Version 0.19.0](https://flow.org/blog/2015/12/01/Version-0.19.0/) のブログを参照）

また package.json を見れば分かるように、 draft-js の main ファイルは `lib/Draft.js` なので、 `import {EditorState} from 'draft-js'` は内部的に `lib/Draft.js` を見に行く。そして draft-js の npm package の中を見てみると `lib/Draft.js.flow` というファイルが存在している。

しかし、このファイルは `@flow` がついていないので、このファイルからインポートしたオブジェクトが全て any になってしまっている。

## 解決方法

暫定的な対処としては draft-js を使っているプロジェクトで `node_modules/draft-js/lib/Draft.js.flow` に `@flow` を追加すれば Flow を有効化することが可能。

他の方法としては、他の `.flow` ファイルにはだいたい `@flow` がついているので、 `'draft-js'` ではなく個別の定義ファイルからインポートする方法もある。例えば `EditorState` なら

```js
import EditorState from 'draft-js/lib/EditorState';
```

しかし、このインポートパスはドキュメント等で明示されていないので、将来的に変わる可能性があるのと、いちいち `lib/Draft.js` の中を読んで対応するファイルを発見しないといけないので面倒。（`EditorState` はたまたまオブジェクト名とファイル名が一致しているが、例えば `RichUtils` は `lib/RichTextEditorUtil.js` にある）

GitHub に [issue があり](https://github.com/facebook/draft-js/issues/982)、原因と解決策を報告したのでそのうち直ることを期待したい。
jsdoでconvnetjs その15

#概要
convnetjsの、凄いデモ、見つけたのでjsdoに移植した。

#凄いデモ
http://selfdrivingcars.mit.edu/deepteslajs/

#写真
![tes.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/996a2083-df60-5fc7-9442-298fa31e2710.jpeg)


#成果物
http://jsdo.it/ohisama1/iKFyV
Rider(EAP build 22)に"MsBuild process was lost"と怒られた時の解決方法

環境
Mac OS 10.11.6
Unity 5.4.5p1
Rider Early Access Program (Build: EAP build 22)

Riderから任意のUnityプロジェクトのソリューションファイルを開くとSolution ExplorerのAssembly-CSharpの隣に(load failed)の文字が。
エラー詳細を見ると"MsBuild process was lost"と表示されていたので調べてみると以下サポートにたどり着きました。
https://rider-support.jetbrains.com/hc/en-us/articles/208074835-Using-Project-Rider-on-Mac-prerequisites
> For regular .NET or Mono applications, install the latest stable Mono release from http://www.mono-project.com/download/

（中略）

> Avoid homebrew version, because it doesn't contain lib/mono/msbuild.

どうやらHomebrewからインストールするとmsbuildが入っていないようなので、Mono公式サイトからpkgをダウンロードしてインストールしてね、という事らしいです。

Mono公式サイト: http://www.mono-project.com/download/

調べる限り、以前のバージョンだとHomebrewでmonoをインストールしてRiderの環境設定でパスを通せば大丈夫だったようですが、少なくとも現行バージョン（EAP build 22）だとエラーになるようです。
自分はHomebrewでインストールしていたmonoをアンインストールしてからpkgでインストールし直すことで解決しました。
Visual Studio / WPF > Error: System.InvalidOperationException: 'バインドを、使用した後に変更することはできません。'

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

http://gushwell.ldblog.jp/archives/52334874.html
を元に学習中。

```csharp
        private void ChangeUpdateSourceTrigger(TextBox textBox, string name) {
            Binding binding = BindingOperations.GetBinding(textBox1, TextBox.TextProperty);
            BindingOperations.SetBinding(textBox, TextBox.TextProperty,
                new Binding(name) {
                    Mode = BindingMode.TwoWay,
                    UpdateSourceTrigger = _myObject.UpdateSourceTrigger
                });
        }
```

の部分においてGetBinding()したbindingを使っていない部分が気になった。

使うようにしてみた。

```csharp
        private void ChangeUpdateSourceTrigger(TextBox textBox, string name)
        {
            // 1. original
            //Binding binding = BindingOperations.GetBinding(textBox1, TextBox.TextProperty);
            //BindingOperations.SetBinding(textBox, TextBox.TextProperty,
            //    new Binding(name)
            //    {
            //        Mode = BindingMode.TwoWay,
            //        UpdateSourceTrigger = _myObject.UpdateSourceTrigger
            //    });

            // 2. 変更
            Binding bnd = BindingOperations.GetBinding(textBox, TextBox.TextProperty);
            bnd.UpdateSourceTrigger = _myObject.UpdateSourceTrigger;
            BindingOperations.SetBinding(textBox, TextBox.TextProperty, bnd);
        }
```

実行してComboBoxを変更すると以下のエラーが出る。

![2017-06-11_09h56_29.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c2468f1b-f014-9759-c0f5-3cc3025ee920.png)

GetBinding()した変数を用いてUpdateSourceTrigger を変更することはできないようだ。
そのためnew Binding()していると理解した。
Let's Encrypt 更新したよ


[Let's Encrypt ユーザーガイド](https://letsencrypt.jp/docs/using.html)

```
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto
```


Which names would you like to activate HTTPS for?
\-------------------------------------------------------------------------------
1: hoge.com
2: moge.com
3: piyo.com
\-------------------------------------------------------------------------------

Select the appropriate numbers separated by commas and/or spaces, or leave input

```
blank to select all options shown (Enter 'c' to cancel):3
```

Please choose whether HTTPS access is required or optional.
\-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
\-------------------------------------------------------------------------------

```
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
```


\-------------------------------------------------------------------------------
Your existing certificate has been successfully renewed, and the new certificate
has been installed.

The new certificate covers the following domains: https://piyo.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=piyo.com
\-------------------------------------------------------------------------------

Domain: hobby.yasuken1990の場合
>\-------------------------------------------------------------------------------
Your existing certificate has been successfully renewed, and the new certificate
has been installed.

>The new certificate covers the following domains: https://hobby.yasuken1990.com

>You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=hobby.yasuken1990.com
\-------------------------------------------------------------------------------
flutter projectでpub runコマンドが打てない時の対処法

flutterプロジェクトで `pub run` コマンドを打とうとした時、次のようなエラーが出ることがあります。

```shell
% pub run intl_translation:extract_to_arb --output-dir=lib lib/messages.dart
Flutter is not available. If this is a Flutter project, make sure to always run
pub through the "flutter" executable.
```

[dartのコード](https://github.com/dart-lang/pub/blob/2895b1d52c7893854a81ba5feda0ae612998e278/lib/src/flutter.dart#L31-L34)を見るとすぐにわかるのですが、 `FLUTTER_ROOT` の環境変数がないとエラーを吐くようになっているので設定しましょう。

以上。
IntelliJ IDEA の Community 版では NodeJS Plugin が入れられない

# 概要

IntelliJ IDEA の Community 版では NodeJS Plugin が入れられない。

# 経緯

プライベートな　MacBook Air で vim & Atom を利用して
Angular2 の開発していたのですが、マイメンターのリッチな開発環境を見て
予測変換なしに限界を感じ IntelliJ IDEA(COMMUNITY 2017.1)をインストールし
Angylar2 + TypeScript の環境構築を試みました。

# 挑戦

1. コミュニティー版のダウンロード
    * https://www.jetbrains.com/idea/download/#section=mac
2. インストール(ここまでは順調)
3. プラグインの追加
    * IntelliJ IDEA -> Preferences -> Plugins
![スクリーンショット 2017-06-11 8.54.11.png](https://qiita-image-store.s3.amazonaws.com/0/69845/04081faf-297a-325a-4384-28c5579f4219.png)

待てど暮らせど NodeJS のプラグインが出てきません。

# 結論

調べた結果、残念なことが分かりました。
JavaScript, TypeScript を利用するには有料の　Ultimate　版である必要があり
Community 版では利用できませんでした。

# 参考URL
* https://www.jetbrains.com/idea/features/
* https://stackoverflow.com/questions/13625565/nodejs-plugin-in-intellij-community-edition-does-not-work
* https://plugins.jetbrains.com/plugin/6098-nodejs#comment=22899
Android Architecture ComponentsのRoomをKotlinで使ったときのハマりポイント

Kotlinで[**Room**](https://developer.android.com/topic/libraries/architecture/room.html)を使おうとして個人的に盛大にハマった二つのポイントを紹介しようと思います。
同じようなエラーで苦しんでいる方の解決策になれば幸いです。

## 1.＠Entityでのハマり

### **Room cannot pick a constructor since multiple constructors are suitable. Try to annotate unwanted constructors with @Ignore.**
＠Entityクラスでコンストラクタが複数あると上記のエラーになります。
Kotlinでプライマリコンストラクタに**デフォルト値**を設定しているとコンストラクタが適宜自動で生成されるので、＠Entityを使うクラスでは注意です。

```kotlin
@Entity
class Sample(val id: Int = 0, val date: String = "")
               ⬇️

/*デコンパイル結果*/
public final class Sample {
   // 省略

   public Sample(int id, @NotNull String date) {
      Intrinsics.checkParameterIsNotNull(date, "date");
      super();
      this.id = id;
      this.date = date;
   }

   // $FF: synthetic method
   public Sample(int var1, String var2, int var3, DefaultConstructorMarker var4) {
      if((var3 & 1) != 0) {
         var1 = 0;
      }

      if((var3 & 2) != 0) {
         var2 = "";
      }

      this(var1, var2);
   }

   public Sample() {
      this(0, (String)null, 3, (DefaultConstructorMarker)null);
   }
}
```

[Parceler](https://github.com/johncarl81/parceler)の＠Parcelと併用するときはプライマリコンストラクタにデフォルト値をいれる以外の対策を施しましょう。

* [Kotlinでdata classにParcelerを使うときはParcelConstructorが便利](http://qiita.com/sugoi_wada/items/657b77db7d5fc050a10a)

## 2.＠Daoの＠Queryでのハマり
### **Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :______**
これが一番深いハマりでした。。
ググると[こちら](https://youtrack.jetbrains.com/issue/KT-17959)にいきつきました、どうやらabstract methodのパラメーターを保持できない問題のようです。

```kotlin
@Query("SELECT COUNT(*) FROM Article WHERE id = :id")
fun count(id: Int): Int
　　　　　　　　　　　　　　　　　　　　　　　⬇︎
/*tmp/kapt3/stubs/以下*/
@android.arch.persistence.room.Query(value = "SELECT COUNT(*) FROM Article WHERE article_id = :id")
public abstract int count(int p0); ←　p0?!
```

すぐに修正されそうな気配はしていますが、とりあえずは**p0**を使うと回避できます。。笑

```kotlin
@Query("SELECT COUNT(*) FROM Article WHERE id = :p0")
fun count(id: Int): Int
```

雑に以上です。
Lua版 ゼロから作るDeep Learning その４［ソフトマックス関数の実装］


過去記事
--
[Lua版 ゼロから作るDeep Learning その１[パーセプトロンの実装]](http://qiita.com/Kazuki-Nakamae/items/16c82b5ac8a85d4adee3)
[Lua版 ゼロから作るDeep Learning その２［活性化関数］](http://qiita.com/Kazuki-Nakamae/items/5199447a54642620139a)
[Lua版 ゼロから作るDeep Learning その３［３層ニューラルネットワークの実装］](http://qiita.com/Kazuki-Nakamae/items/57c2977d0a9a38bdf6b8)

ソフトマックス関数の実装
--
　今回はソフトマックス関数の実装です。

　スクリプトは以下の通りです。



```lua:softmax.lua
---ソフトマックス関数.
-- 入力値を確率に変換する
-- @param x 入力 (Type：torch.DoubleTensor)
-- @return 0-1 (Type：number)
function softmax(a)
    local c = torch.max(a)
    local exp_a = torch.exp(a - c)
    local sum_exp_a = torch.sum(exp_a)
    local y = exp_a / sum_exp_a

    return y
end

local a = torch.Tensor({0.3, 2.9, 4.0})
local y = softmax(a)
print(y)
print(torch.sum(y))
```

```bash:実行例
$ th softmax.lua
 0.0182
 0.2452
 0.7366
[torch.DoubleTensor of size 3]

1
```

　これはpython の場合とほとんど変わりません。

おわりに
--

　今回は以上です。

　次回はいよいよMNISTの手書き文字認識をします。
　
　ありがとうございました。
オススメのソフト一覧 (Ubuntu)

<開発>

Java : 

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

<ネットワーク共有>

LogMeIn Hamachi (Haguichi) : 

sudo add-apt-repository ppa:webupd8team/haguichi
sudo apt-get update
sudo apt-get install haguichi

"https://www.vpn.net/linux"からLogMeIn Hamachiをダウンロード。

sudo dpkg -i logmein-hamachi_2.1.0.174-1_i386.deb

<システム>

NVIDIA GeForce GTX1060 Graphic Driver : 

sudo apt-get install nvidia-367
sudo apt-get install mesa-common-dev
sudo apt-get install freeglut3-dev

sudo apt install linux-generic
sudo apt install nvidia-cuda-toolkit

ホームにある.bashrcのコードに、

export PATH=/usr/local/cuda-7.5/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda

を書き足す。

<画面録画>

vokoscreen : 

sudo apt-get install vokoscreen

<画面録画・ライブストリーミング>

OBS Studio : 

sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt-get update
sudo apt-get install obs

<音楽・動画再生>

VLC media player : 

sudo apt-get install vlc

<オフィス>

LibreOffice : 

※標準でインストール済み。

<画像編集>

GIMP : 

sudo apt-get install gimp

<動画編集>

OpenShot Video Editor : 

sudo add-apt-repository ppa:openshot.developers/ppa
sudo apt-get update
sudo apt-get install openshot-qt

Kdenlive : 

sudo add-apt-repository ppa:kdenlive/kdenlive-stable
sudo apt-get update
sudo apt-get install kdenlive

<音声編集>

Audacity : 

sudo apt-get install audacity lame

<CG・グラフィック>

Blender : 

sudo add-apt-repository ppa:thomas-schiex/blender
sudo apt-get update
sudo apt-get install blender

<.exeファイルサポート>

Wine : 

sudo add-apt-repository ppa:wine/wine-builds
sudo apt-get update
sudo apt-get install --install-recommends winehq-devel
macOSのメモをマルチプラットフォーム対応ノート「Simplenote」に移行する方法

macOSのメモをマルチプラットフォーム対応ノート「Simplenote」に移行する方法について書きました。

1 macOSのメモをマルチプラットフォームで使えるようSimplenoteに移行する方法
　1.1 macOSの「メモ」のデータを「Exporter」を使って書き出す
　1.2 「Simplenote」のアカウント作成
　1.3 「nvALT」（文章管理アプリ）をダウンロード
　1.4 「nvALT」に「Simplenote」のアカウントを設定
　1.5 書き出したメモデータを「naALT」に読み込む
2 「Simplenote」の真髄はマルチプラットフォーム対応

ちょっと手間ですが、macOSのメモをマルチプラットフォーム対応ノート「Simplenote」に移行する方法は現状では、これがベストかなと。
「Simplenote」であれば、iOS、Android、Windows、macOS、Linuxに対応しているので、複数の環境で利用するならとても便利。

[macOSのメモをマルチプラットフォームで使えるようSimplenoteに移行する方法を紹介するよ](https://www.karelie.net/migrate-macos-memo-to-simplenote/)
Ubuntuで2ちゃんねるブラウザ「JD」が完璧に動作するインストール方法

Ubuntuで2ちゃんねるブラウザ「JD」が完璧に動作するインストール方法について書きました。

1 2ちゃんねるブラウザ「JD」
2 HTTPプロキシ変換スクリプト「2chproxy.pl」
3 Ubuntuで2ちゃんねるブラウザ「JD」が完璧に動作するインストールする方法
　3.1 2ちゃんねるブラウザ「JD」をインストール
　3.2 2ちゃんねるブラウザ「JD」の板一覧設定
　3.3 HTTPプロキシ変換スクリプト「2chproxy.pl」をインストール
　3.4 jd.sh を編集
　3.5 アプリケーション設定を変更
　3.6 「JD」の設定を変更
　3.7 2chproxy.plのアップデート方法

[Ubuntuで2ちゃんねるブラウザ「JD」が完璧に動作するインストール方法を紹介するよ。](https://www.karelie.net/install-2ch-browser-jd-for-ubuntu/)
CentOS7系でnginxをインストール

yumでそのまま入れれるものは結構古そうなので、本家のドキュメントにしたがってインストールしておく。

#CentOS7系でnginxをインストール

リポジトリの設定

```console
$ sudo vi /etc/yum.repos.d/nginx.repo
```

```shell:/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```

インストール

```console
$ sudo yum install nginx
```

確認

```console
$ nginx -v
nginx version: nginx/1.12.0
```

ドキュメントのままでした :sunny:

参考：http://nginx.org/en/linux_packages.html
Goでのアルゴリズムクイックリファレンス第2版(二分探索)

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。[アルゴリズムクイックリファレンス 第2版](https://www.amazon.co.jp/gp/product/4873117852/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117852&linkCode=as2&tag=amesho-22&linkId=b7688201ae37a6234596fa96dfd3ccdd)を読んで各種アルゴリズムをGoで実装して行きます。

前回: [Goでのアルゴリズムクイックリファレンス第2版(マージソート)](http://qiita.com/amesho/items/7a057b2730b74a323166)

今回は[二分探索](https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2)

> ソート済みのリストや配列に入ったデータ（同一の値はないものとする）に対する検索を行うにあたって、 中央の値を見て、検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断して、片側には存在しないことを確かめながら検索していく

計算時間は`O(log2n)`となる


```go
package main

import (
	"fmt"
)

func search(a *[]int, t int) bool {
	low := 0
	high := len(*a) - 1
	for low <= high {
		mid := (low + high) / 2
		if t < (*a)[mid] {
			high = mid - 1
		} else if t > (*a)[mid] {
			low = mid + 1
		} else {
			return true
		}
	}
	return false
}

func main() {
	a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	fmt.Println(a)
	fmt.Printf("2:%t\n", search(&a, 2))
	fmt.Println(a)
	fmt.Printf("12:%t\n", search(&a, 12))
}
```

次回はハッシュに基づいた探索の予定です。
Ubuntuにibus-mozcをインストール（「片仮名→英語」変換対応、ついでにバグも修正）

Ubuntuにibus-mozcをインストールして日本語入力の環境も整備しました。

[まずはibus-mozcをインストールしてUbuntuの日本語入力の環境を整えよう](https://www.karelie.net/install-ibus-mozc/)

# あとで後悔するibus-mozcのインストール方法

```
sudo apt-get install ibus-mozc
sudo apt-get install ibus-gtk ibus-gtk3 ibus-qt4
```

# あとで幸せになれるibus-mozcのインストール方法
## Mozc UTをダウンロード

　[OSDNの作業部屋](https://ja.osdn.net/users/sicklylife/pf/mozc_ut_for_ubuntu/files/)

## Mozc UTのビルドとインストール

```
cd ~/Downloads

tar xavf mozc-*.tgz

cd mozc-*/

sed -i s/'const bool kActivatedOnLaunch = false;'/'const bool kActivatedOnLaunch = true;'/g mut/src/unix/ibus/property_handler.cc

sudo apt-get install -y clang libdbus-1-dev libglib2.0-dev libgtk2.0-dev subversion tegaki-zinnia-japanese debhelper libibus-1.0-dev build-essential libssl-dev libxcb-xfixes0-dev python-dev gyp protobuf-compiler libqt4-dev libuim-dev libzinnia-dev fcitx-libs-dev devscripts ninja-build

sudo ./build_mozc_plus_utdict

tail -n 5 /var/log/apt/history.log | grep Install: | sed -e s/"Install: "// | sed -e s/", automatic"//g | sed -e s/"), "/"\n"/g | sed -e s/" (.*$"/""/g | tr '\n' ' ' | xargs sudo apt-get remove -y

sudo apt install ./mozc-*.deb ./fcitx-mozc_*.deb ./ibus-mozc_*.deb

gsettings set org.gnome.settings-daemon.plugins.keyboard active true
```


## システムの言語設定

環境設定で、日本語の設定を行う


- 「片仮名→英語」変換に対応

- 再起動時に半角入力に戻るバグに対応

これらに対応したインストール方法について書いています。

[まずはibus-mozcをインストールしてUbuntuの日本語入力の環境を整えよう](https://www.karelie.net/install-ibus-mozc/)
DIとDIコンテナを3分で理解する

# 背景
DIとDIコンテナを調べてみるも、"どういうものか"や"メリット"がパット見よくわからなかった。
そこで、先輩に聞いたら解説がすごいシンプルで目から鱗だったので記載する。

# 本題の前に
DI(Dependency Injection)は「依存性注入」と直訳されるが、以下の英語版Wikipediaからの引用のように、**「オブジェクト注入」という解釈のほうがより理解しやすい**。
> A dependency is an object that can be used (a service).

参考：
[Dependency Injection - Wikipedia](https://en.wikipedia.org/wiki/Dependency_injection)

# DI（Dependency Injection） - オブジェクト注入
1) 以下のように、コンストラクタで他のオブジェクト(Sampleクラス)を参照するClazzクラスを考えるとする。

```php
class Clazz
{
    private $sample;

    public function __construct()
    {
        $this->sample = new Sample();
    }
}
```

2) しかし、上記の実装だとClazzクラスのテストを行うとき、**Sampleクラスの実装を待たないとテストが出来ない**。

3) そこで、以下のような形式にすることで、Sampleクラスの実装を待たなくても、SampleInterfaceをimplementsしたクラスをスタブとすることでテストが可能になる！

```php
class Clazz
{
    private $sample;

    public function __construct(SampleInterface $sample)
    {
        $this->sample = $sample;
    }
}
```

4) 上記のように、オブジェクト生成時に他のオブジェクトを注入している形式であることから、Depencency Injection(オブジェクト注入)と言われる。

# DIコンテナ

1) 例えば、上記DIにおいて3個以上の大量のオブジェクトを注入するようになることを考える。

```php
class Clazz
{
    private $sample1;
    private $sample2;
    private $sample3;

    public function __construct(Sample1Interface $sample1, Sample2Interface $sample2, Sample3Interface $sample3)
    {
        $this->sample1 = $sample1;
        $this->sample2 = $sample2;
        $this->sample3 = $sample3;
    }
}
```

2) 当然Clazzオブジェクトを呼び出す側も処理が多くなってしまう。

```php
$sample1 = new Sample1();
$sample2 = new Sample2();
$sample3 = new Sample3("test");

$clazz = new Clazz($sample1, $sample2, $sample3);
```

3) そこで、上記の一連の処理をコンテナの変数にまとめ、以下のようにシンプルに出来る。これがDIコンテナである。

```php
require_once __DIR__ . '/container.php';

$container['sample3'] = "test";
$clazz = $container['clazz'];
```

4) DIコンテナについてのパッケージとしては、Pimpleなどがある。
[Pimple - A simple PHP Dependency Injection Container](https://pimple.sensiolabs.org/)

※ DIコンテナについて、以下の記事も大変わかりやすかったです。
[DIとは？DIコンテナとは？試してみた(後編)[PHP][Pimple][DI]](http://shiro-goma.hatenablog.com/entry/2014/06/30/092136)


---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
yarn error Bad hash. Expected 

yarnが落ちるようになった。


```
yarn install v0.24.6
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
error Bad hash. Expected "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" but got "da39a3ee5e6b4b0d3255bfef95601890afd80709"
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```

`Bad hash.`でissueを探す。
https://github.com/yarnpkg/yarn/issues/3309

どうやらまだ解決されてないらしい。

根本的な解決は諦める。


とりあえず、キャッシュを削除

```
rm ~/npm-packages-offline-cache
```

```
yarn install v0.24.6
[1/4] 🔍  Resolving packages...
success Already up-to-date.
✨  Done in 0.56s.
```

解決。
関連付けが深いモデルをjoinで検索したいとき

以下のようなモデルの関連付けをしているとき、
指定の`Company`と紐づく`Download`を抽出したい時

※モデル関連（"1--<多"）
company --< solution --< documents --< downloads

```ruby
c = Compnay.first
Download.joins(document:{solution: :company})
        .where(companies:{id: c})
```
Vagrantのネットワークで躓いた

Vagrantのネットワークにハマった。

またまたVagrantでハマった。
yumを実行したら、ひたすらエラーが出た。。。

```
[root@localhost ~]# yum install dig
Geladene Plugins: fastestmirror
http://mirror.centos.org/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirror.centos.org; Unbekannter Fehler"
Anderer Spiegelserver wird versucht.
```

み、見つからないだと。。。
とりあえず、ネットワークの問題だと思った。
インターネットに出るわけだし、
名前解決はできてるのかな？
と思い試してみることに。

[root@localhost yum.repos.d]# ping www.yahoo.co.jp
ping: unknown host www.yahoo.co.jp

ああ、繋がらない。。
名前解決ができていない。


NATされているNICを調べるとこんな設定でした。

```:ifcfg-ethX
ifcfg-XXX
NAME="enpXXX"
DEVICE="enpXXX"
ONBOOT=yes
NETBOOT=yes
UUID="XXX"
IPV6INIT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
```

なるほど、
「ONBOOT=yes」がyesになっているので、
/etc/resolv.confを変更しても再起動させたら元に戻ってしまいます。

なので直接ifcfg-XXXにDNSサーバを書きます。

ここはGoogle先生のDNSサーバを書きます。

```:ifcfg-ethX
NAME="enpXXX"
DEVICE="enpXXX"
ONBOOT=yes
NETBOOT=yes
UUID="XXX"
IPV6INIT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
DNS1=8.8.8.8
DNS2=8.8.4.4
```

そんで「service network restart」を打てば完了。

```
[root@localhost ~]# service network restart
Restarting network (via systemctl):  [  OK  ]
[root@localhost ~]# 
```

名前解決できてるかな？

```
[root@localhost yum.repos.d]# ping www.yahoo.co.jp
PING edge.g.yimg.jp (182.22.24.252) 56(84) bytes of data.
64 bytes from 182.22.24.252: icmp_seq=1 ttl=51 time=116 ms
```

できました！
これでyumができます！
post通信のページで表示されるget通信のリンクで起きるエラー回避術

get通信のページを管理画面でpost通信でプレビューしたいときに
そのget通信のページにあるリンクなどでget通信してしまいエラーが起きました。
その対処法が以下。

リンクで遷移したくないとき、以下のようなのを書くが・・・

```
<a href=“#"LINK</a>
```

”#”ではpostのページだった場合、get通信にしてしまい、エラーになってしまう。
そのようなときは、これ。
これでリンクを無効化でき、そもそも通信が起きないようにできます。

```
<a href="javascript:void(0)"LINK</a>
```