OmniAICreator/Qiita-1.07M huggingface dataset:
電子工作 > ICの廃版を確認 > MOUSERでLifecycleをチェックする | Mouser Search API

電子工作などで使用するICが近いうち(例:1年ほど)に廃版(or 廃番 or 廃板)になるかどうかをどのように知るのか。

[MOUSER](https://www.mouser.jp/)で扱っている製品の場合には「Lifecycle」の項目があり、参考になるかもしれない。

例として、以下の製品は近いうちに廃版になるようだ。
https://www.mouser.jp/ProductDetail/Panasonic/EVM-3YSX50B54?qs=sGAEpiMZZMtlubZbdhIBIJwbBS%2fHs7qd6l3SAsoyG1Q%3d

> End of Life: Scheduled for obsolescence and will be discontinued by the manufacturer.

OS環境によっては下記のような表記にもなる。

> 製造中止: メーカーにてモデル廃止予定のため、製造中止となります。

### 関連

- [電子工作 > 考察 > モジュールの廃盤について](https://qiita.com/7of9/items/4ed4a445a6a45173a883)

 
### Mouser Search API

APIを用いてMouserの検索をすることはできそうだ。

https://www.mouser.jp/apihome/

アイテムのリストに対してdiscontinued が記載されるかチェックするようなスクリプトを使えば、定期的な廃版確認はできるかもしれない。
Linuxコマンドで整数の計算を簡単に行う方法

Linuxのコマンドライン上で簡単な計算をしたいときってないですか？例えば「128＋64＋32」ってなんだっけなと。

```bash
# $((...))を使うことで整数の演算が行えます
$ echo $((1+2+3))
6

# 2の10乗
$ echo $((2**10))
1024
```

## 注意点
**`$((...))`はあくまで整数の計算しか行えないので、少数が絡む計算は苦手なようです。**少数の計算は`bc`コマンドを使いましょう。

```bash
$ echo $((10/3))
3

$ echo $((1.0*3))
-bash: 1.0*3: 構文エラー: 無効な計算演算子です (エラーのあるトークンは ".0*3")
```
Androidアプリケーション技術者認定試験ベーシックの試験範囲の知識をまとめた(13)

# テスト

## Androidテストフレームワーク

### テストフレームワークとは

プログラム単体のテストを単体テストといい。複数のプログラムを組み合わせるのを結合テストという。
JUnitが使える。

AndroidはJUnit3が持っているTestCaseクラスをAndroid用に拡張したandroid.textパッケージ群が用意されている。

#### テストクラス

- ActivityInstrumentationTestCase2クラス 画面操作のテスト
- ActivityUnitTestCaseクラス アクティビティ単体のテスト。ライフサイクルメソッドであるonResumeやonPauseを発行できる
- SingleLaunchActivityTestCaseクラス 複数のテストで一つのアクティビティを使いたい場合に使用する
- ServiceTestCaseクラス サービスの単体テストに使う
- ProviderTestCase2クラス コンテンツプロバイダの単体テストに使う

上記以外は以下を参照
http://developer.android.com/guide/topics/testing/index.html

#### Eclipseを利用した単体テスト

Eclipseを使うと効率的にテストを作成できる。

1. テストプロジェクトの作成を実施しテストプロジェクトを作成する。
1. マニフェストファイルを編集する(instrumentationタグのandroid:name属性にはandroid.test.InstrumentationTestRunnerを指定し、android:targetPackage属性には単体テストをするプロジェクトを指定する。applicationタグは以下のuses-libraryタグのandroid:name属性にはandroid.test.runnerを指定する)
1. テストクラスを作成する

#### 各メソッドと処理フロー

|メソッド名|役割|
|---|---|
|コンストラクタ|テストをするターゲットクラスなどを指定|
|setUp|テストを実行する間に呼び出されるため。テストの初期化処理を記述する。不要なら何も記述しない。|
|tearDown|テストが終了する前に呼び出されるため。テストの後処理を記述する。不要なら何も記述しない。|
|メソッド名がtestで始まるメソッド|実際のテスト内容を記述するメソッド|

#### キーイベントやボタンクリックをテストする

キーイベントやボタンクリックのようなUI操作をテストする場合、UIスレッドに処理を依頼する必要がある。
runOnUiThreadを使う。requestFocusメソッドで目的のオブジェクトにフォーカスを当てて、waitForIdleSyncメソッドでUIスレッドの処理を待ってから、sendKeysメソッドでキーイベントを指定する。
ボタンクリックの場合は、performClickメソッドを呼び出し、waitForIdleSyncメソッドでUIスレッドの処理を待つ。

##### 受験のポイント

AndroidのテストフレームワークはJUnit3がベースである。
google-paletteとchart.jsでかっこいいグラフを描く

# はじめに

chart.jsでレーダーチャートを描いていてデータセットが動的だった時に、いい感じの色を自動で生成する方法。

![canvas.png](https://qiita-image-store.s3.amazonaws.com/0/80816/88609e51-d234-96d9-cf7a-aa562d60b7c4.png)

# 使うパッケージ

- [chart.js](http://www.chartjs.org/)
- [google-palette(palette.js)](https://github.com/google/palette.js/tree/master)

# chart.js

シンプルなグラフを描いてくれるクールなライブラリ。

# google-palette

カラーパレットを自動で生成してくれるイカしたライブラリ。
[公式サンプル](http://google.github.io/palette.js/)
今回はレーダーチャートなのでmpn65が使いたい。
tolは動いたのにmpn65はすんなり動かなかった。

## 追記

現在(2018/11/30)確認したところ、
バージョン1.1.0ではmpn65が使えました！
なので以下のコマンドでインストールして問題ありません。

```bash
npm install google-palette
```

# 結論

mpn65はgithubからインストールしなきゃ動かない。
npmjsは古い。

```bash
yarn add chart.js https://github.com/google/palette.js.git
```

```javascript
import * as Chart from 'chart.js/dist/Chart';
import * as palette from 'google-palette';

// サンプルデータの準備
const sampleData = {
  labels: ['さんすう', 'こくご', 'しゃかい', 'たいいく', 'おんがく'],
  scores: [
    {
      name: 'たろう',
      points: [10, 40, 50, 90, 20]
    },
    {
      name: 'はなこ',
      points: [50, 80, 50, 40, 70]
    }
  ]
};
// 色を生成
const colors = palette('mpn65', sampleData.scores.length).map((hex) => {
  return '#' + hex;
});
// サンプルデータと生成した色からデータセットを準備
const datasets = sampleData.scores.map((score, i, a) => {
  return {
    label: score.name,
    data: score.points,
    backgroundColor: colors[i] + '11',  // 塗りは少し透明に
    borderColor: colors[i],
    pointRadius: 3,
    pointHitRadius: 6
  };
});
const type = 'radar';
const data = {
  labels: sampleData.labels,
  datasets: datasets
};
const options = {
  scale: {
    ticks: {
      stepSize: 10,
      beginAtZero: true
    }
  }
};

const ctx = document.getElementById('canvasId').getContext('2d');

const chart = new Chart(ctx, {
  type: type,
  data: data,
  options: options
});
```

# 参考

- https://stackoverflow.com/questions/39871319/automatic-colors-assignment-in-chart-js-2-x-doesnt-work-anymore-used-to-work-i
【Node.js】Nodebrewでnode.jsバージョンを切り替えできなかった時の備忘録

# 結論
1,2のどっちが影響したのか素人にはわからないのでご参考までに。

##1. usr/local/bin/nodeで発見し削除。 
```shell
$ which node
usr/local/bin/node
```

以下の方法で、Finderで表示させて直接ゴミ箱へ。
> [Macの隠しファイルや隠しフォルダを表示する裏技 / Inforati](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-hidden-file-or-folder-of-macos.html)

##2.「.bash_profile」にパスを追記。
エディタ(sublime text)で開いて直接パスを書き込んだ。

```shell:.bash_profile
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

　保存してターミナルで読み直す(?)ために以下を実行

```shell
$ source ~/.bash_profile
```

# 経緯&詳細
## Nodebrewとnodeのバージョン合わない
Nodebrewを導入していざバージョンを切り替えても、なぜか変更が反映されなかった。

```shell
$ nodebrew install-binary v6.9.1
$ nodebrew ls
v6.9.1

current: none
$ nodebrew use v6.9.1
use v6.9.1
```

とここまでは、順調にnodebrew導入ができていた。しかし、

```shell
node -v
v8.9.1
```

なぜかバージョンを確認すると合致せず。

##pkgのnodeのアンイストールもできず
元々公式サイトからpkgで導入していたことに思い当たる。nodeのアンイストールを試みる。
>[MacにpkgでインストールしたNode.jsをアンインストールする手順](https://qiita.com/yoshikoba/items/4906829faaaae8c73e56)

```shell
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.node.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

以上を実行しようとするも、doneをコピーした時点で

```shell
can't open /var/db/receipts/org.nodejs.pkg.bom: No such file or directory
```

と表示される。実際にそのディレクトリを開いてみるものの、確かにない。Homebrewで入れてないのも確認。

whichで場所を確認しようとするも、

```shell
which node
Users/[user-name]/.nodebrew/current/bin/node
```
とNodebrewで入れたものが反応しお手上げ状態。


## Nodebrew自体をアンイストールして発見

Nodebrewが邪魔をしてるかもと、Finder上でフォルダを消してアンイストール。
>[Nodebrew本体を削除する方法](https://qiita.com/tonkotsuboy_com/items/f5d17f0b9698554a7716)

ここでようやく発見。

```shell
$ which node
usr/local/bin/node
```

usrはユーザーではなくパソコン本体、Macintosh HDの直下のフォルダ。
Finder上で直接削除。

## パスが消えてた(?)ので書き足す
ここでNodebrewを再インストール。

バージョン確認しようとするとコマンドが見つからず、困惑。

```shell
$ nodebrew ls
nodebrew: command not found
```

ここでパスの存在を思い出し、.bash_profileを確認。以下を追記し保存、読み直す。

```shell:.bash_profile
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
```shell
$ source ~/.bash_profile
```


ここまでして無事一致！
PHPでPDFを扱う（マルチバイト対応）...の途中経過

#自己紹介とか愚痴とか
PDF使って帳票作成したいって思ったけど、どう調べてもうまくいく方法が見つからなかった...
というか、Framework使ってるの前提なの多すぎィ！ だったので、途中までだけどうまくいった方法をメモする
最初FPDFにJapanese.zipでやろうかとかMBPDFでやろうとか色々試したんだけどうまくいかなかった。
説明のサイトが説明になってないだろーみたいなやつ多くて使いづらい...（自分のはどうとか棚にあげてね）

#使用環境
##サーバ
・お名前.comのSD-11
・tcPDF

tcPDFでマルチバイトをそのまま対応させられたようなのでとりあえずこれで。

##クライアント
・MacBookPro macOS High Sierra 10.13.3
・Chrome　63.0.3239.132（Official Build） （64 ビット）

あんまり関係ない気もするけど

#導入
https://github.com/tecnickcom/tcpdf
ここからZIPでダウンロードして、中身をサーバにアップロード
tcpdfフォルダを作成して入れておいたのでごちゃごちゃしないはず...

#サンプルを動かす
https://tcpdf.org/examples/example_038/
ここのサンプルコードをコピペして、ファイルを作成しアップロードする。
ただし最初のrequireだけ修正

```
require_once('tcpdf_include.php');
```
↓

```
require_once('tcpdf/tcpdf.php');
```

##結果
<img width="808" alt="スクリーンショット 2018-02-10 3.40.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/93085/567511e6-0091-193d-fdd5-fb28ed386312.png">

#fontに関して
kozminproregular.phpだったかな？これも確か日本語フォント関係だったかと
setfont()の使いところさんで設定すれば使えるんじゃないかな

#今後のマイルストーン
・既存のファイルを呼び出す
・既存のファイルに書き込む
・名前をつけて保存できるようにする
・書き込む内容を選択できるページを作成する

誰かやり方を教えてください...

#cf,
[tcpdf](https://tcpdf.org/):https://tcpdf.org/
Terminator on Ubuntu16.04

# はじめに
iTermのような画面分割が可能なターミナルソフトを探していてTerminatorを使い始めました。
自分が使う範囲の知識をまとめます。

# よく使う操作
|操作|キー|
|-----------------|------------------|
|画面を縦に分割|ctrl + shift + e|
|画面を横に分割|ctrl + shift + o|
|分割を解除|ctrl + shift + d|
|分割した画面間を移動|alt + ↑↓←→|
|ターミナルを消去してリセット|ctrl + shift + g|
|新規ターミネーター|super + i|

# インストール

```
sudo apt-get install terminator
```

# お気に入りのレイアウトの保存、呼び出し

- Terminatorを開き、好みの画面サイズ、レイアウトにする
- 設定＞レイアウト　を開き、追加をクリック。任意の名前をつけ保存  
※この設定が完了した時点で下記コマンドを実行すると設定したレイアウトで表示されます。  

```
terminator -l 任意の名前
```
- レイアウト呼び出し用にエイリアスを登録

```~/.bashrc
alias 任意のエイリアス名='terminator -l 任意の名前&exit' #追記
```

```
source ~/.bashrc
```
ターミナルで任意のエイリアス名を実行すると、登録したレイアウトが呼び出される。

# 参考
[cryborgのRoboticsブログ](http://cryborg.hatenablog.com/entry/2016/09/03/164940)
PowerShellでWindows Subsystem for Linux(WSL)のコマンドのエイリアスっぽいものを作る

WSLではbash側のコマンドを`wsl.exe`の引数に渡すとそのまま実行してくれます。

この特性を使うとwslのgrepなどのエイリアスを定義できます。

ただし、PowerShellでは引数付きエイリアスは定義不能なので関数で代用します。

```powershell
function grep { $input | wsl grep --color=auto $args }
```

上記のgrep関数を`$PROFILE`に入れておくと普通にgrepするのと同じように使えます。
パイプで渡されたときは`$input`の中身に対してパイプで動作し、普通に呼ばれたら普通に呼びます。
`--color=auto`はなくてもいいですがあっても困らないのでつけておきました。


ただし、ファイルが対象だとバックスラッシュやルートパスの問題で上手く機能しませ。
頑張って変換書けば使えそうな気がしますが。

```powershell:こういうのはダメ
grep wa C:\Windows\system.ini
```
特定ホストに対してのみ踏み台を経由して Ansible を実行する

ネットワーク的に踏み台サーバーを経由しないと到達できないサーバーに Ansible を流す

* 公式ドキュメント: [How do I configure a jump host to access servers that I have no direct access to?](http://docs.ansible.com/ansible/latest/faq.html#how-do-i-configure-a-jump-host-to-access-servers-that-i-have-no-direct-access-to)

公式ドキュメントに書かれている方法はすべてのサーバーでの作業時に踏み台を踏むような形になるが、外から疎通できない一部のホストだけ踏み台を踏むようにしたい場合は、`host_vars` に対象ホスト名と同じ名前でファイルを作って、以下のように設定を入れればよい。

```
---

ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@host"'
```
【Unity】CanvasGroupを通じてUIの表示/非表示を切り替える

◆使い方
①CanvasGroupと一緒にアタッチ
②任意のタイミングでSetActive(),SetInactive()を呼ぶ

```c#:CanvasGroupCtr.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CanvasGroupCtr : MonoBehaviour
{
	private CanvasGroup thisCanvasGroup;

	private CanvasGroup canvasGroup {
		get {
			if (thisCanvasGroup == null) {
				thisCanvasGroup = GetComponent<CanvasGroup> ();
			}
			return thisCanvasGroup;
		}
	}

	//表示する
	public void ShowWithFade (bool isFade = true, float FadeSpeed = 5f)
	{
		//FadeInさせるかどうか
		if (isFade) {
			StartCoroutine (TimeForFadeIn (FadeSpeed));
		} else {
			canvasGroup.alpha = 1;
		}
		canvasGroup.interactable = true;
		canvasGroup.blocksRaycasts = true;
	}

	//非表示にする
	public void HideWithFade (bool isFade = true, float FadeSpeed = 5f)
	{
		//FadeOutさせるかどうか
		if (isFade) {
			StartCoroutine (TimeForFadeOut (FadeSpeed));
		} else {
			canvasGroup.alpha = 0;
		}
		canvasGroup.interactable = false;
		canvasGroup.blocksRaycasts = false;
	}

	//FadeIn用コルーチン
	IEnumerator TimeForFadeIn (float FadeSpeed)
	{
		while (canvasGroup.alpha < 1) {
			canvasGroup.alpha += Time.deltaTime * FadeSpeed;
			yield return null;
		}
		yield return null;
	}

	//FadeOut用コルーチン
	IEnumerator TimeForFadeOut (float FadeSpeed)
	{
		while (canvasGroup.alpha > 0) {
			canvasGroup.alpha -= Time.deltaTime * FadeSpeed;
			yield return null;
		}
		yield return null;
	}
}

```
CloudFront を利用し HTTP/HTTPS をサーバレスでリダイレクトする


## 何をしたいか

サイトを移転するときなど、既存の URL へのアクセスを新しい URL へリダイレクトしたいときがある。
S3 でのリダイレクトがお手軽だが、HTTPS のリダイレクトができないのが弱点である。
かといって、SSL 接続を終端させるためだけに ELB + EC2 の構成を用意するのも手間。

そこでこの、

* HTTP だけでなく、HTTPS でのリダイレクトも行いたい
* サーバレスで行いたい

という要求を満たすために、CloudFront + S3 の構成でリダイレクトを行う。

## 前提

* リダイレクト元に HTTP および HTTPS どちらのアクセスが来ても良いようにする
* **パスはカットしてリダイレクトしたい**

# 手順

## S3 バケットの作成、設定

### バケットの作成

リダイレクト設定を行うバケットを作成する。
直接表には出ないバケットであるため、名前は何でも良い。

### Static website hosting の設定

プロパティ => Static website hosting を開き、以下の設定をする。
ここで設定したリダイレクトのレスポンスが CloudFront を通じて返される。
今回は、www.google.com にリダイレクトしている。

* インデックスドキュメント
	* index.html
		* 指定がないとエラーになるため。ファイルは無くて良い
* エラードキュメント
	* （空白）
* リダイレクトルール
    * \<ReplaceKeyWith/\> によって、どのようなパスでもカットされてリダイレクトされる

   ```
<RoutingRules>
    <RoutingRule>
        <Redirect>
           <HostName>www.google.com</HostName>
           <ReplaceKeyWith/>
        </Redirect>
    </RoutingRule>
</RoutingRules> 
```

※ 「リクエストをリダイレクトする」を利用しても良いが、その場合はパスがカットされない

## ACM 証明書の発行

リダイレクト元の FQDN の SSL 証明書を発行する。
ドキュメント（[証明書のリクエスト](https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/gs-acm-request.html)）に沿って発行すれば問題ないが、リージョンは「**バージニア北部**」を選択して発行する。
（「東京」などで発行すると、CloudFront の証明書選択画面に出てこずにハマる）

## CloudFront の設定

CloudFront のディストリビューションを作成する。
ほぼほぼデフォルトで良いが、以下の設定は行う。

* Origin Domain Name
	* 上で作成した S3 のエンドポイント（http:// で始まるアドレス）を指定する（**プルダウンで出てくるバケット名ではない**）
		* CloudFront => S3 に http アクセスし、返ってきたリダイレクトレスポンスをクライアントに返すため
		* エンドポイントは Static website hosting の設定画面で確認できる
* Viewer Protocol Policy
	* Redirect HTTP to HTTPS
		* HTTP できたリクエストも、HTTPS に直した上でリダイレクトする
		* HTTP は HTTP のままリダイレクトしたい場合は、HTTP and HTTPS にする
* Alternate Domain Names(CNAMEs)
	* リダイレクト元のドメイン名を入れる
* SSL Certificate
	* Custom SSL Certificate
		* 「**バージニア北部**」で発行していない場合はプルダウンで選択できないので注意

Create Distribution を押したら、Deploy されるまで待つ。
Deploy されたら、DNS レコードを書き替える前に、"Domein Name" 欄にある CloudFront のエンドポイントを利用し、テストすると良い。

* 参考: リダイレクト元が example.com の場合

   ```
curl --head -v -H "Host: example.com" https://d2********.cloudfront.net
# 301 が返ってくれば OK
```

## DNS レコードの書換え

Route53 を利用している場合は、リダイレクト元のドメイン名の Alias レコードに、作成した CloudFront のディストリビューションを指定する。
それ以外の DNS サービスを利用している場合は、CNAME レコードに CloudFront ディストリビューションのエンドポイントを指定する。
node_modules以下のライブラリをAssetsで使う

`npm`で管理したくなって探してみたら出来たからメモ
もっといい方法がある気がするけど見つからなかった

- 元々、public以下になっているのをnode_modulesにする。

```build.sbt
lazy val root = (project in file(".")).enablePlugins(PlayScala)
    .settings(
        resourceDirectory in Assets := baseDirectory.value / "node_modules"
    )
```

- Play 2.6になってから以下の書き方が推奨されている

```application.conf
play.assets {
    path = "/public"
    urlPrefix = "/assets"
}
```

```routes
GET     /assets/*file               controllers.Assets.at(file)
```

```index.scala.html
<link rel="stylesheet" href="@routes.Assets.at("bulma/css/bulma.css")">
```
bashのプロンプトをはい,ご主人様?に変える 

~/.bashrc に以下を書く
古いのがある場合はコメントアウトしてください。すぐに元に戻せます。

``` sh
PS1="\[\e[36m\e \u@\h \W\[\e[0;32m\]$\[\e[m\]\nYes, Master? $ " 
```

``` 
source ~/.bashrc 
```

で更新
するとこうなります。

<img width="123" alt="Screen Shot 2018-02-10 at 0.34.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/212334/da8fecc3-34f1-77d1-eca4-03068b4d7cd1.png">

Yes, Master?のところを好きに変えられます。
閉じ引用符 " の前は空白にした方が見やすいです。

日本語もおっけー

```
PS1="\[\e[36m\e \u@\h \W\[\e[0;32m\]$\[\e[m\]\nご注文は? $ "
```

<img width="321" alt="Screen Shot 2018-02-10 at 0.59.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/212334/9adb1d1f-475f-d157-756a-fb981e43aefc.png">

はい,ご主人様?　にする

```
PS1="\u@\h \W はい,ご主人様? \$ " 
```

<img width="360" alt="Screen Shot 0030-03-02 at 17.06.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/212334/00ff7d15-c414-6148-0a9d-0b3e570e7b15.png">

色付きで二行

```
PS1="\[\e[36m\]\e \u@\h \W\[\e[31m\] \$\[\e[37m\]\nはい,ご主人様? \[\e[32m\]\$\[\e[m\] "
``` 

<img width="219" alt="Screen Shot 0030-03-02 at 17.00.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/212334/88745a61-3504-8945-a18d-fa40fdbdd076.png">

夢が広がりますね。
R unique()で重複のない値を取り出す

## unique()使い方

unique()にベクトルとかを入れると重複しない値を返してくれる
例: (RStudioで実行)

```R
> unique(iris$Species)
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica
> unique(iris['Species'])
       Species
1       setosa
51  versicolor
101  virginica
```

重複のない値の数を数えるときは

```R
> length(unique(iris$Species))
[1] 3
```

とする

```R
> length(unique(iris['Species']))
[1] 1
```

としてしまうと間違った値が出てしまうので注意。なぜかというとlength()はベクトルの長さを返す関数で、iris['Species']はlist型のため。

## 全ての列の重複しない値の個数を表示

```R
> lapply(iris, function(x) length(unique(x)))
$Sepal.Length
[1] 35

$Sepal.Width
[1] 23

$Petal.Length
[1] 43

$Petal.Width
[1] 22

$Species
[1] 3
```

もしくは

```R
> apply(iris, 2, function(x) length(unique(x)))
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
          35           23           43           22            3 
```
Rails + MongoidでAPI用にnewする

## 内容
今回は，RailsでMongoDBを使ってAPIサーバを作成することになったので，その手順を自分用にまとめます。いつもRailsの導入時にrbenvとかbundlerとかで迷うので今後迷わないように。。。

## まずはrubyのバージョン設定
今回はRubyのバージョンは2.4.2とします。プロジェクトのルートディレクトリに移動して，rbenvでローカルのRubyを変更。

```zsh
% rbenv install 2.4.2
% rbenv local 2.4.2
```

これで，

```zsh
% ruby -v
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-darwin17]
```

となったと思います。（ココまで来るのに`rbenv local x.x.x`が反映されない問題に苦しむ => [[1]](https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf)）

## bundlerのインストール
普通にgemで

```zsh
% gem install bundler
```

そして，Gemfileを作成

```zsh
% bundle init
```

## Railsのインストール 
Gemfileの編集。今回はrails 5.1.4を使用。

```diff
-  # gem "rails"
+  gem "rails", "5.1.4"
```

bundlerでインストール。初回なのでパス指定を忘れず。

```zsh
bundle install --path vendor/bundle
```

## Railsのプロジェクト作成
ついにココまで来ました。ここでしくじる訳にはいきません。注意点は，今回は普通に `rails new` してはいけないということ。なぜなら，今回はMongoDBを使って，かつAPI仕様にしないといけないからです。以下でnewします。

```zsh
% bundle exec rails new . --api --skip-active-record --skip-bundle
```

Gemfileにmongoidを追加。6.3.0が一応stableっぽいので6.3.0を入れます。

```diff
+ gem 'mongoid', '~> 6.3.0' 
```
これで晴れてRails + MongoidでAPI用にnewすることができました。
ついでに，configファイルも作ってしまうことにします。

```zsh
% bin/rails g mongoid:config
```

## まとめ
毎回，railsでプロジェクト作るときに彷徨うのでまとめました。今回でrbenvやbundler周りを理解できた気がする。（たぶんすぐ忘れる）
これを見て思い出そう。

## 参考
[[1] rbenvでバージョンがうまく切り替わらなかった時にやったこと](https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf)
[[2] RailsでActiveRecordの代わりにMongoidを使う](https://qiita.com/ryohashimoto/items/3f27821229b079a7a4f5)
Mac + nvimでnim環境構築

# 概要

* Mac OSX + neovimでnim環境構築
* nimのコンパイル環境インストールからneovimの設定、チュートリアルまでのメモ

# 環境

* Mac OSX Sierra
* neovim 0.2.2
* nim 0.17.2

# 関連

* 公式 doc https://nim-lang.org

# nim

* brewで入る

```zsh
% brew install nim
```

```zsh

% nim --version
Nim Compiler Version 0.17.2 (2017-09-08) [MacOSX: amd64]
Copyright (c) 2006-2017 by Andreas Rumpf

active boot switches: -d:release -d:useLinenoise
```

* 公式からダウンロードしたtarを解凍してtoolをインストール

```zsh
% tar zxvf nim-0.17.2.tar.xz
% cd nim-0.17.2
% ./build.sh
% bin/nim c koch
% ./koch tools
```

# nvim-nim

* deinでpluginを追加

```toml
[[plugins]]
repo = 'baabelfish/nvim-nim'
```

* https://github.com/baabelfish/nvim-nim
* READMEを見るとOSXは動作確認されてないとのこと(2018-02-10現在）
* 入れて見ると案の定highlightが効かないのでシンタックスファイルを自分で配置して見る

```zsh
% sudo cp ~/.config/nvim/dein/repos/github.com/baabelfish/nvim-nim/syntax/nim.vim /usr/local/Cellar/neovim/0.2.2/share/nvim/runtime/syntax/.
```

* 変数の定義がなくて怒られるのでinit.vimに定義を追加

```init.vim
let g:nvim_nim_highlighter_semantics=1
```

* ちょっとパワープレーっぽいけどこれでとりあえずhighlightが効いた

# チュートリアル

* Hello, worldっぽいやつ


```nim
# This is a comment
echo "What's your name? "
var name: string = readLine(stdin)
echo "Hi, ", name, "!"
```

```zsh
% nim compile main.nim
Hint: used config file '/usr/local/Cellar/nim/0.17.2/nim/config/nim.cfg' [Conf]
Hint: system [Processing]
Hint: main [Processing]
CC: main
Hint:  [Link]
Hint: operation successful (10987 lines compiled; 0.716 sec total; 17.938MiB peakmem; Debug Build) [SuccessX]
% ./main
What's your name?
test
Hi, test!
```

* コンパイルから実行まで
* 今度はもうちょい複雑なの書きつつ、実践ぽいことやってみる
PowerShellのヘルプ表示をlessにする

## PowerShellのhelp

PowerShellで`help ls`とか`man cd`とか打つとHelpが表示されます。
この表示には`more`コマンド(Windowsの場合は`C:\WINDOWS\system32\more.com`)が使われます。
しかし、`more`は戻ったりできないのでより高機能な`less`を使えるようにしたいと思います。

## helpの表示の仕方

`(Get-Command help).Definition`と打つことでhelpコマンドの定義が見られます。

```powershell:help(ver5.1)
PS C:\> (Get-Command help).Definition

<#
.FORWARDHELPTARGETNAME Get-Help
.FORWARDHELPCATEGORY Cmdlet
#>
[CmdletBinding(DefaultParameterSetName='AllUsersView', HelpUri='https://go.microsoft.com/fwlink/?LinkID=113316')]
param(
    [Parameter(Position=0, ValueFromPipelineByPropertyName=$true)]
    [string]
    ${Name},

    [string]
    ${Path},

    [ValidateSet('Alias','Cmdlet','Provider','General','FAQ','Glossary','HelpFile','ScriptCommand','Function','Filter','ExternalScript','All','DefaultHelp','Workflow','DscResource','Class','Configuration')]
    [string[]]
    ${Category},

    [string[]]
    ${Component},

    [string[]]
    ${Functionality},

    [string[]]
    ${Role},

    [Parameter(ParameterSetName='DetailedView', Mandatory=$true)]
    [switch]
    ${Detailed},

    [Parameter(ParameterSetName='AllUsersView')]
    [switch]
    ${Full},

    [Parameter(ParameterSetName='Examples', Mandatory=$true)]
    [switch]
    ${Examples},

    [Parameter(ParameterSetName='Parameters', Mandatory=$true)]
    [string]
    ${Parameter},

    [Parameter(ParameterSetName='Online', Mandatory=$true)]
    [switch]
    ${Online},

    [Parameter(ParameterSetName='ShowWindow', Mandatory=$true)]
    [switch]
    ${ShowWindow})

    #Set the outputencoding to Console::OutputEncoding. More.com doesn't work well with Unicode.
    $outputEncoding=[System.Console]::OutputEncoding

    Get-Help @PSBoundParameters | more
```

ずらっと出てますが、`Get-Help`コマンドの結果を`more`に渡していることがわかります。
moreの定義も見てみます。

```powershell:more(ver5.1)
PS C:\> (Get-Command more).Definition

param([string[]]$paths)
$OutputEncoding = [System.Console]::OutputEncoding
if($paths) {
    foreach ($file in $paths)
    {
        Get-Content $file | more.com
    }
} else { $input | more.com }
```

ifはパイプで渡されたか引数で渡されたかの違いなので実質はhelp関数内で直接`more.com`をパイプに渡してるのてと同等の記述です。

PowerShell Core 6.0以降ではマルチプラットフォーム対応でもう少し記述が多いですが、おおよそ同じかと思います。

## lessへの差し替え

とりあえず`more`コマンドを使うことはないと割り切ってmore関数を上書きしてしまうのが楽でしょう。
使う`less`はgit bashのMinGWでもwslのものでも大丈夫です。
下記はwslを使っていますが、MinGWの場合は`wsl less`の部分を`less.exe`のフルパスにしたら動くはずです。
`less`はUTF-8を受ける動作が規定なのでUTF-8で出力するようにします。

```powershell:less
function less { 
    param([string[]]$paths)
    $OutputEncoding = [System.Console]::OutputEncoding
    if ($paths) {
        foreach ($file in $paths) {
            Get-Content $file | & wsl less
        }
    }
    else { $input | & wsl less }
}
Set-Alias more less
[System.Console]::OutputEncoding = $OutputEncoding = [System.Text.UTF8Encoding]::new()
```

これを`$PROFILE`に追記します。

すると、`man ls`などでもlessが使えます。
他の箇所でもlessが使えるようになります。

```powershell
man ls
ls | less
less $PROFILE
```
pyenv でBUILD FAILED した時の対処法

#環境
Ubuntu 16.04
pyenv

#インストールしようとしたもの
anaconda3-5.0.1

#pyenvでpython環境をインストールしようとした
読んで字のごとくですね

``` command:
user@xxx:$ pyenv install anaconda3-5.0.1
```
これでインストール完了！と思いきや・・・

```command:
Downloading Anaconda3-5.0.1-Linux-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh
Installing Anaconda3-5.0.1-Linux-x86_64...

BUILD FAILED (Ubuntu 16.04 using python-build 1.2.1-17-g907a86b)

Inspect or clean up the working tree at /tmp/python-build.xxx.18059
Results logged to /tmp/python-build.xxx.18059.log

Last 10 log lines:
/tmp/python-build.xxx.18059 /tmp
/tmp/python-build.xxx.18059/Anaconda3-5.0.1-Linux-x86_64 /tmp/python-build.xxx.18059 /tmp
mkdir: ディレクトリ `/usr/local/pyenv/versions/anaconda3-5.0.1' を作成できません: 許可がありません
ERROR: Could not create directory: '/usr/local/pyenv/versions/anaconda3-5.0.1'
```
え、なにこれは・・・
読んで字のごとく許可がないとのこと

#解決策
僕の場合はrootアカウントに切り替えることで解決しました
許可がないなら許可を持っているアカウントでやれってことですね
このコマンドでrootに切り替えます

```command:
user@xxx:$ sudo su -
```
そうしたら

```command:
root@xxx:#
```
になると思うので

```command:
root@xxx:# pyenv install anaconda3-5.0.1
```
これで成功しました！
【Swift】切り抜かずにUIImageを回転させる

# やりたいこと

こういう`UIImage`から
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/11914/13611257-d60f-cda7-a50f-49ca787ee773.jpeg)

こういう`UIImage`に加工したい
![tmp2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/11914/c60e913b-0b57-2027-f588-3aa8ee2c3836.jpeg)



# UIImageを回転させる

まずは先人のお知恵を拝借しようとググってみると、だいたい下のようなコードが見つかりました。
（ググってすぐに出てくるのはありがたい！！）

```swift

extension UIImage {
    
    func rotatedBy(degree: CGFloat) -> UIImage {
        let radian = -degree * CGFloat.pi / 180
        UIGraphicsBeginImageContext(self.size)
        let context = UIGraphicsGetCurrentContext()!
        context.translateBy(x: self.size.width / 2, y: self.size.height / 2)
        context.scaleBy(x: 1.0, y: -1.0)
        
        context.rotate(by: radian)
        context.draw(self.cgImage!, in: CGRect(x: -(self.size.width / 2), y: -(self.size.height / 2), width: self.size.width, height: self.size.height))
        
        let rotatedImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return rotatedImage
    }
    
}

```

やってることは[こちらの記事](https://qiita.com/mugmug-dev/items/c29de8ae2b838a633512)の説明が図解付きでわかりやすかったです。

上記のコードを使って`UIImage`の回転をしてみた結果、、

このようになりました。
<img width="297" alt="スクリーンショット 2018-02-09 19.20.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/11914/bfec3670-69f3-9c61-489d-c52141407938.png">

回転後も`UIImage`のサイズは変わらないため、回転してはみ出した部分が切り取られてしまいますね。
今回は回転して切り取られないようにしたいので、もう一手間加えてみました。

# 完成コード

```swift

extension UIImage {
    
    func rotatedBy(degree: CGFloat, isCropped: Bool = true) -> UIImage {
        let radian = -degree * CGFloat.pi / 180
        var rotatedRect = CGRect(origin: .zero, size: self.size)
        if !isCropped {
            rotatedRect = rotatedRect.applying(CGAffineTransform(rotationAngle: radian))
        }
        UIGraphicsBeginImageContext(rotatedRect.size)
        let context = UIGraphicsGetCurrentContext()!
        context.translateBy(x: rotatedRect.size.width / 2, y: rotatedRect.size.height / 2)
        context.scaleBy(x: 1.0, y: -1.0)
        
        context.rotate(by: radian)
        context.draw(self.cgImage!, in: CGRect(x: -(self.size.width / 2), y: -(self.size.height / 2), width: self.size.width, height: self.size.height))
        
        let rotatedImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return rotatedImage
    }
    
}

```

こんな感じですね。
<img width="332" alt="スクリーンショット 2018-02-09 23.36.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/11914/cbfacf46-312b-6c28-6304-ff0c63994a11.png">

画像のサイズを指定する際に、

```swift
CGRect(origin: .zero, size: self.size).applying(CGAffineTransform(rotationAngle: radian))
```

というように回転のTransformを適応した後の`CGRect`を作成し、そのサイズで画像を作成するようにしています。

※Playground上での表示ではサイズが同じに見えますが、回転後の`UIImage`は元の画像の部分の大きさが同じサイズで、`UIImage`としてのサイズは大きくなっています。

# 余談

- `UIGraphicsBeginImageContext`は`UIGraphicsBeginImageContextWithOptions`をお使いください。
- 切り抜きって、「clip」でしょうか「crop」でしょうか、、？:thinking:

# 最後に

もっといい方法があればご教授ください。:bow_tone1:
cordova&VSCodeで環境を構築するまでの右往左往メモ。

# 使用するもの
* 当記事は下記の環境を準備する記事です。  
 1. cordova
 1. visualStudioCode
 1. androidのデバッグ環境
 

---

# 詰まったところや見るところなど
基本的に
[Visual Studio CodeとCordovaで作るハイブリッドアプリ開発環境](https://qiita.com/yama-take/items/8c6434efbcd4bece6310)
を参考に進めていく。
ただし、上記記事はiOSの記事なのでいろいろ差異がある。

androidでデバッグしようとした場合に引っかかったのは以下。

 * JDK1.8をインストールしてても、JDK1.8を要求される

[cordova-requirements-check-failed-for-jdk-1-8-or-greater](https://stackoverflow.com/questions/40628240/cordova-requirements-check-failed-for-jdk-1-8-or-greater)
→古いJDKをパスで指定しているため。環境変数の設定からJDKのパスを新しい(JDK1.8以上の)パスに変えると修正できる。

 * Gradleが見つからないのでインストールするか、AndroidStudioをインストールしろと言われる

[Could not find an installed version of Gradle either in Android Studio, or on your system to install the gradle wrapper. Please include gradle in your path, or install Android Studio](https://github.com/ionic-team/ionic/issues/13283)
→AndroidStudioをインストールしていても起き得る。Gradleを別途インストールしたほうが良い。インストールは下記記事をもとに実行。
[Windows10にGradleをインストール](https://qiita.com/quwahara/items/9c4e5fbda421cfcb09ad)


 * ADBが見つからないと言われる

[ADBコマンド導入の方法](https://qiita.com/hikaru__m/items/15baae425b6fad25da05)
→上記記事に従ってADBコマンドが使えるように設定が必要。


 * デバイスが見つからないと言われる

[ERROR: Failed to deploy to device, no devices found -cordova using visual studio
](https://stackoverflow.com/questions/35741242/error-failed-to-deploy-to-device-no-devices-found-cordova-using-visual-studio)
→USBで実機に繋いでUSBデバッグを有効にすることが必要。


---

# 参考URL

[Visual Studio CodeとCordovaで作るハイブリッドアプリ開発環境](https://qiita.com/yama-take/items/8c6434efbcd4bece6310)

[cordova-requirements-check-failed-for-jdk-1-8-or-greater](https://stackoverflow.com/questions/40628240/cordova-requirements-check-failed-for-jdk-1-8-or-greater)

[Could not find an installed version of Gradle either in Android Studio, or on your system to install the gradle wrapper. Please include gradle in your path, or install Android Studio](https://github.com/ionic-team/ionic/issues/13283)

[Windows10にGradleをインストール](https://qiita.com/quwahara/items/9c4e5fbda421cfcb09ad)

[ADBコマンド導入の方法](https://qiita.com/hikaru__m/items/15baae425b6fad25da05)

[ERROR: Failed to deploy to device, no devices found -cordova using visual studio
](https://stackoverflow.com/questions/35741242/error-failed-to-deploy-to-device-no-devices-found-cordova-using-visual-studio)
緑本メモ: MCMCサンプルをJAGSとRで実行 - ランダム効果複数版 (10.5節)

[緑本サイト](http://hosho.ees.hokudai.ac.jp/~kubo/ce/IwanamiBook.html) からデータ `d1.csv` と階層ベイズのモデル定義 `model.bug.txt` (10.5節のもの) をダウンロードする。[9章の例題をJAGSでやるメモ](http://d.hatena.ne.jp/dichika/20120522/1337681689)の記載の通り、モデル定義にはJAGSで使えるように文末にセミコロンを足しておく。

下のようにしてパラメータの推定・事後分布の可視化と、MCMC収束診断の指数の出力をそれぞれ行う。

## パラメータの推定と事後分布の可視化

下のRコードで、切片 $\beta_1$, 施肥処理の係数 $\beta_2$ , 個体差のばらつき $s$, 植木鉢効果のばらつき $s_p$ のパラメータ群をJAGSのMCMCによって推定する。


```r
d <- read.csv("d1.csv")
filename <- 'model.bug.txt'

N.sample = nrow(d)
N.pot = length(levels(d$pot))

list.data <- list(
  N.sample = N.sample,
  N.pot = N.pot,
  N.tau = 2,
  Y = d$y,
  F = as.numeric(d$f == "T"),
  Pot = as.numeric(d$pot)
)

inits <- list(
  beta1  = c(0),
  beta2  = c(0),
  s     = c(1, 1),
  r     = rnorm(N.sample, 0, 0.1),
  rp    = rnorm(N.pot, 0, 0.1)
)

m <- jags.model(
  file = filename,
  data = list.data,
  inits = list(inits, inits, inits),
  n.chain = 3
)

update(m, 1000)

post.list <- coda.samples(
  m,
  c("beta1", "beta2", "s"),
  thin = 50, n.iter = 51000
)
summary(post.list)

plot(post.list)
```

`summary(..)` で出力される各パラメータの推定値：

```
1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

         Mean     SD Naive SE Time-series SE
beta1  1.3693 0.5279 0.009544       0.009732
beta2 -0.8736 0.7395 0.013368       0.013533
s[1]   1.0194 0.1153 0.002085       0.002084
s[2]   1.0453 0.3805 0.006879       0.006888
```

`beta1`, `beta2` がそれぞれ $\beta_1$, $\beta_2$. `s[1]`, `s[2]` がそれぞれ $s$, $s_p$.

`plot(..)` で出力される、サンプリングのトレース（左）と周辺事後分布の近似（右）の図：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7006/121709b4-d8f3-e677-36b9-0e38a6a5a08f.png)

## MCMC収束診断

[ランダム効果1個版](https://qiita.com/ikuo/items/6314828c8fa2dec89b19)と同様に `R2jags` で収束診断用の指数 $\hat{R}$ を出力する：

```r
library('R2jags')
post.jags <- jags(
  data = list.data,
  inits = list(inits, inits, inits),
  parameters.to.save = c("beta1", "beta2", "s"),
  n.iter = 51000,
  model.file = filename,
  n.chains = 3,
  n.thin = 50,
  n.burnin = 1000)
print(post.jags)
```

出力結果（右から二番目の列に $\hat{R}$）：

```
Inference for Bugs model at "model.bug.txt", fit using jags,
 3 chains, each with 51000 iterations (first 1000 discarded), n.thin = 50
 n.sims = 3000 iterations saved
         mu.vect sd.vect    2.5%     25%     50%     75%   97.5%  Rhat n.eff
beta1      1.369   0.533   0.309   1.050   1.361   1.689   2.433 1.001  3000
beta2     -0.870   0.756  -2.375  -1.321  -0.855  -0.405   0.681 1.001  3000
s[1]       1.017   0.117   0.817   0.935   1.010   1.088   1.275 1.001  3000
s[2]       1.058   0.388   0.537   0.792   0.989   1.236   2.015 1.001  3000
deviance 367.798  13.090 344.504 358.482 366.919 376.521 394.577 1.001  3000
```

`Rhat` が1.0付近で1.1より小さければ収束していると判断。
ElixirでTwitterを検索する

 ElixierでTwitterを検索してみました。あまりにも簡単だったのでメモっておきます。extwitterというTwitter client libraryを使います。[extwitter公式サイト](https://github.com/parroty/extwitter)

　まずプロジェクトを作成します。

```sh
mix new twittertest
```

　次にapplication environmentを利用して初期設定を行います。すなわちmix newで作成されたconfig/config.exsファイルにTwitter APIのキーを設定します。以下の項目をファイルの末尾に追加します。

```elixir:config/config.exs
#
config :extwitter, :oauth, [
   consumer_key: "xxxxx",
   consumer_secret: "xxxxx",
   access_token: "xxxxx",
   access_token_secret: "xxxxx"
]
#
```

　次にmix.exsを編集して、必要なライブラリを設定します。


```elixir:mix.exs
#
defp deps do
  [
    {:oauther, "~> 1.1"},
    {:extwitter, "~> 0.8"}
  ]
end
#
```

　extwitterはTwitterの REST API.をcallする時の認証にoautherを利用しています。公式サイトでは以下のような修正も必要だとありますが、多分これはもう不要です。最近のelixirはdepsにあるアプリを自動的にスタートしてくれるみたいです。実際にこれ無しで動作しましたので。

```elixir:不要個所
def application do
  [applications: [:logger, :extwitter]]
end
```

　ライブラリをインストールして、シェルを立ち上げます。

```sh
mix deps.get
iex -S mix
```

　シェルが立ち上がったら、ExTwitter.search()で好きな単語で検索してみましょう。Elixirに関心あるあなたは数学者にも関心があるでしょう。以下のように検索してみます。

```
iex(1)> ExTwitter.search("望月新一")
[
  %ExTwitter.Model.Tweet{
    retweeted: false,
    quoted_status: nil,
      ...
    },

　　---

    text: "友達に教えてもらった、京大の望月新一氏（ABC予想を証明した数学のめっちゃすごい人）のブログを読んでる。\n読んでると脳みそ溶けそうになるくらいわけわからなくて面白いです。",
    scopes: nil,
    entities: %{hashtags: [], symbols: [], urls: [], user_mentions: []}
  },
  %ExTwitter.Model.Tweet{
```

　プログラムを書きませんでしたが、簡単にTwitterの検索を行えました。前に[「Meteor and Reactによるリアクティブシステム「ラーメン野郎を追いかけろ！ ＠ Twitter」を作ってみた - Qiita」](https://qiita.com/sand/items/02219ec5e42cc406ee5c)を書いたときにMeteor(node)でTwitterのStream APIを使いましたが、extwitterでも使えるようです。そのうち試してみたいと思います。
BitbucketのリポジトリをSourcetreeでクローンする

# 概要
Bitbucket上のリポジトリをクローンする手順の図解説明。それだけ。

# 環境
下記の環境を想定します。（他の環境でも当然できますが、図解で説明したいのであえて環境を限定しました。）
* [Sourcetree](https://ja.atlassian.com/software/sourcetree)がインストールされている
* [Bitbucket](https://bitbucket.org/)のアカウントを持っている
* [Bitbucket](https://bitbucket.org/)にリポジトリが作成されている
* [Chrome](https://www.google.co.jp/chrome/)を使っている
* [macOS](https://www.apple.com/jp/macos)を使っている

# 手順
* 注：下記を実行するとローカルＰＣのホームディレクトリに__リポジトリ名__のフォルダが作成されます。__リポジトリ名__のフォルダがあると問題が起きます。よって、クローンする前にホームフォルダの__リポジトリ名__のフォルダは違う場所へ移動させておいた方が無難です。


1. リポジトリのURL（ 例 https://bitbucket.org/xxxx/yyyy ）にアクセスする
2. クローンするためのボタンをクリックする 
  [![https://gyazo.com/a6f09f22186fcef1aa66fd72de7ac02f](https://i.gyazo.com/a6f09f22186fcef1aa66fd72de7ac02f.png)](https://gyazo.com/a6f09f22186fcef1aa66fd72de7ac02f)
  [![https://gyazo.com/3d6a1908821fde77665896c418dd72ac](https://i.gyazo.com/3d6a1908821fde77665896c418dd72ac.png)](https://gyazo.com/3d6a1908821fde77665896c418dd72ac)
3. SourceTreeで開く
  [![https://gyazo.com/084a739abf261465d33fa25f5a60557f](https://i.gyazo.com/084a739abf261465d33fa25f5a60557f.png)](https://gyazo.com/084a739abf261465d33fa25f5a60557f)
4. クローンを実行
  [![https://gyazo.com/175b06c39194d5993dedf5a29818bc3d](https://i.gyazo.com/175b06c39194d5993dedf5a29818bc3d.png)](https://gyazo.com/175b06c39194d5993dedf5a29818bc3d)
  * もし、ローカルＰＣのフォルダ名や保存場所を変更したい場合は__保存先のパス__を書き換えてください。

以上、
【Oracle】SELECT文の実行結果(NULL)とPL/SQLでの戻り値取得結果(NO_DATA_FOUNDエラー)が違っていた件

###【概要】
下記のようなデータを1件も取得しないNULL_TESTファンクションをSELECT文の実行結果とPL/SQLで実行した結果が予想と異なっていました。

・SELECT文で実行　　→　　NULLを取得する
・PL/SQLで実行　　　→　　NO_DATA_FOUNDエラーが発生する

11.2.0で検証しています。
なぜこのような結果になるのか謎。同じ結果になると思っていたが、Oracleの仕様なのかな・・・。

###【準備】
```sql
-- テスト用テーブル作成
CREATE TABLE NULL_TEST_TABLE (col1 VARCHAR(10));

-- テスト用テーブルにデータ挿入
INSERT INTO NULL_TEST_TABLE (col1) VALUES ('abc'); 

-- 1件もデータを取得しないテスト用ファンクション作成
CREATE OR REPLACE FUNCTION NULL_TEST
  RETURN VARCHAR2
IS
  func_res VARCHAR2(10);
BEGIN
  SELECT COL1 INTO func_res FROM NULL_TEST_TABLE WHERE COL1 = 'xyz';
  RETURN func_res;
END;
/
```

###【実行結果】
#####■NULLを取得するパターン

```sql
SELECT NULL_TEST() FROM DUAL;

/* 実行結果
null
*/
```

#####■NO_DATA_FOUNDエラーが生じるパターン その１

```sql
BEGIN
  DBMS_OUTPUT.PUT_LINE(NULL_TEST());
END;
/

/* 実行結果
エラー・レポート -
ORA-01403: データが見つかりません。
ORA-06512: "SYS.NULL_TEST", 行6
ORA-06512: 行2
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.
*/
```

#####■NO_DATA_FOUNDエラーが生じるパターン その２

```sql
DECLARE
  res VARCHAR2(10);
BEGIN
  res := NULL_TEST();
  DBMS_OUTPUT.PUT_LINE(res);
END;
/

/* 実行結果
エラー・レポート -
ORA-01403: データが見つかりません。
ORA-06512: "SYS.NULL_TEST", 行6
ORA-06512: 行4
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.
*/
```

###【例外処理を追加してエラーを回避】
#####■NO_DATA_FOUNDエラーが生じるパターン その１

```sql
SET SERVEROUTPUT ON
BEGIN
  DBMS_OUTPUT.PUT_LINE(NULL_TEST());
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('例外としてキャッチされました。');
END;
/

/* 実行結果
例外としてキャッチされました。
*/
```

#####■NO_DATA_FOUNDエラーが生じるパターン その２

```sql
SET SERVEROUTPUT ON
DECLARE
  res VARCHAR2(10);
BEGIN
  res := NULL_TEST();
  DBMS_OUTPUT.PUT_LINE(res);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('例外としてキャッチされました。');
END;
/

/* 実行結果
例外としてキャッチされました。
*/
```

###【おまけのコーナー】
OracleのDBは好き。他のDBはほとんど触ったことないが・・・。
邪道には先ず邪道を以て当り、正道を以て勝つべし

# ある問題
ここにWebアプリがあるとします。このWebアプリは古く、以前からリプレースが検討されていました。
ある時ついに上層部がリプレースを決断し、作り直すことになりました。

しかし、DBについては揉めました。
他部署が絡んでいたため、リプレースは出来てもデータ構造を変えたり、中身にパッチを当てたりすることができなかったのです。
結局、DBMSの更新にとどめてお茶を濁すことになってしまいました。

さて、元のWebアプリはかなり古いものです。
一貫して旧世代の文字コードで作成されていました。利用可能な文字集合は現代のUnicodeと比べ物にならない狭さです。
しかし当時、多数の記号を利用できるようにする必要がありました。
そこで取られた解決策、それは、「使えない文字はHTMLの数値文字参照で表す」ことでした。

ある日、作り直したWebアプリで「記号が化ける！」という報告が上がりました。
さて原因は？ 対処法は？

# 解決
まあ、おちついて考えてみましょう。
今回の問題はもうわかりやすく出てきています。数値文字参照です。
&で始まり;で終わるのがHTMLのエスケープですが、このうち、その中身が#dddd (dは数字、桁数は増減する) ものを数字文字参照といいます。

今回の問題、その根本的な原因は「記号を数値文字参照の形でDBへ持たせた」事、いわばHTMLのエスケープを「悪用」したことによるものです。
今Webアプリを作ろうとするならば、HTMLテンプレートエンジンは当然使用することでしょう。そうでなくても、XSSを阻止すべく、徹底的に無害化処置を行うはずです。

さて。
文字列をエスケープする、という処置において、「エスケープ文字」というものは不可欠です。
通常、使用頻度の低い記号がこれに充てられます。何故ならば、「エスケープ文字を通常の文字として使用する」のは、地味に面倒だからです。
例えばHTMLに「&」を記述するのであれば、「&amp;amp;」と記述しなければなりません。
……そう、今回の問題は、「エスケープ済の文字列」を、「エスケープ未了の文字列」を想定しているテンプレートエンジンへ流し込んだ結果、「エスケープ済の文字列」が再度エスケープされたことによるものです。

「手動で文字列をエスケープ/エスケープ解除する」ことは、邪道です。
忘れるし、間違えるからです。エスケープしたつもりで忘れていた、エスケープ解除したつもりで出来ていなかった、こういった例はあまり珍しくありません。自動化すべきです。

「DBへHTMLエスケープした文字列を格納する」これも邪道です。HTMLエスケープした文字列は、DBへ流し込むものではありません。
かつて古い文字コードしかなかったころなら、たしかにこの処置は画期的でした。しかし今はそうではないのです。記号が使いたいなら、素直にUTF-8で記号を吐き出せばそれで済む時代になりました。

困ったちゃんな邪道、「DBがHTMLエスケープ済の文字列を含む」ことを前提として、問題の箇所のDBから得られた文字列を一旦「手動でHTML *アン* エスケープする」ことにしたのです。
もっと真面目に修正するならば、DBをオブジェクトと見立て、得られる文字列全てにアンエスケープを掛ける、という手もあったでしょう。しかし、パフォーマンスの懸念もつきまとう上、単純に手間で、影響範囲も広すぎたのです。
**邪道に邪道を以て当たることは、無用な手間を防ぎます**。

そして、HTMLテンプレートエンジンへ、本来HTMLテンプレートエンジンが欲する「ナマの文字列」をそのまま渡しました。
それ以上のことは何もしていません。HTMLテンプレートエンジンがエスケープしてくれるので、それ以上のことは必要ないのです。必要ないように、わざわざアンエスケープするという方法を選んだのです。
**邪道に邪道を以て当たったときは、混乱を避けるため、そこから先は正道へ戻さなければなりません**。さもないと、全体が邪道送りです。

# つまり？
「ガッツリ直そうとして影響範囲広げるとろくなことにならんから、まずは workaround だろうとなんだろうと問題のところだけ直すことに集中しろ」
そういうことだそうでした。
【Chrome Developer Tools】実例で学ぶconsoleタブで出来ること～JavaScriptエラー確認編

JavaScriptを書いて、ブラウザで動かしてみて・・・。
あれ？動かない？？:scream: エラー出てるのかな？

・・・エラーの中身がわからない **orz**

そんな時は、ChromeのDeveloper Toolsを起動してみてください:smiley:

# この記事で学ぶこと
- JavaScriptで発生したのエラー・警告の確認方法
- エラー・警告が起きているJavaScriptの特定方法

# １．JavaScriptのエラー・警告の有無を確認する
まずはF12キーを押下して、ChromeのDeveloper Toolsを起動しましょう。
サンプルページとして、Qiitaのユーザー一覧ページ（未ログイン状態）を使いました。
この画像の中で、赤い矢印の先にあるアイコンを確認してください。
![001_065.png](https://qiita-image-store.s3.amazonaws.com/0/188980/ffe1a887-28ce-e5e6-9dfd-836e8431d6c6.png)
※プライバシー保護（？）のために、アイコンやユーザーIDは隠してあります。

拡大するとこんな :arrow_down:感じ。
![002_100.png](https://qiita-image-store.s3.amazonaws.com/0/188980/9d796421-770b-b8f9-19ff-75bc02ca9114.png)
赤い方がエラーで、黄色い方が警告です。
それぞれ右隣の数字が、エラー・警告の数を表しています。
ここに何も表示されていなければ、エラーも警告もありません。

# ２．どこでエラー・警告が起きているのか特定する
２つの方法で、確認することが出来ます。
どちらも全く同じ内容ですが、ページの見え方が違います。

## ２－１．consoleタブを開く
先日紹介した[【Chrome Developer Tools】実例で学ぶconsoleタブで出来ること～JavaScriptデバッグ編](https://qiita.com/mtanabe/items/49a116354c2ad9603942)
にあるとおりです。
consoleタブには、```console.log```の出力結果だけではなく、JavaScriptのエラーや警告も表示されるんです :star2:
エラーの出力状況のサンプルはこちら :arrow_down:
![003_080.png](https://qiita-image-store.s3.amazonaws.com/0/188980/ac76da21-a9b4-9f6c-90b4-bd1078fe6b18.png)

ちょっと見づらいですが、```url_name```という変数がnullなので読み取れないと言ってますね・・・。


## ２－２．エラーや警告のアイコンをクリックする
先ほど確認したこの:arrow_down:アイコン。
![002_100.png](https://qiita-image-store.s3.amazonaws.com/0/188980/9d796421-770b-b8f9-19ff-75bc02ca9114.png)
ここにマウスカーソルを当てると、クリックできます。
クリックしてみた結果がこちら :arrow_down:
![004_a_085.png](https://qiita-image-store.s3.amazonaws.com/0/188980/85ae3329-78a5-ab26-b97a-b2cac3144cde.png)

先ほどと見え方が変わってます。
consoleタブだけ独立して、もう１つ表示されました！
ただ、これ、 警告のマーク:warning:をクリックしても、警告には飛びません。
consoleの最終行が表示されるようになっています。
個人的には、小さくて見づらいので、２－１の方法を取ることが多いです。

# どんなときに使えばいいのか
JavaScriptが思うように動かないときに、エラー・警告のマークを探してみてください。
JavaScriptはコンパイル言語ではないので、事前に文法ミスなどが見つけにくいです。
なので、とりあえずF12を押してエラー・警告のマークがあるかどうかを見るだけで、ぐっと解決に近づきます。

# まとめ
JavaScriptが思ったように動いてないときはF12を押してエラー・警告アイコンの有無を確認する。

では、よいJavaScriptライフを:hand_splayed:
DroidKaigi 2018 ミニレポート[DAY 02]

# 白熱のDroid Kaigi ２日目

昨日に引き続き、新米Androidエンジニアの身分で、会社に時間と費用を頂戴し、[DroidKaigi 2018](https://droidkaigi.jp/2018/)に参加させてもらってきました。

本日も、復習兼ねて自分が受けた気になったセッションを3つほどピックアップして簡潔に振り返ろうかなと思います。

かいつまんで自分の所感でまとめているので、詳細気になる方は、登壇者の方々のリンクに飛んでください。

登壇された方のセッション資料は以下にリアルタイムでまとめられています。
[DroidKaigi2018の資料一覧(随時追加)](https://qiita.com/takattata/items/cc1ba64ef260e9e51274)

# [はじめてのKotlinハンズオン](https://docs.google.com/presentation/d/1CRaPCgUYzdtUecT-VduwZx0qjzSY7KzluYjxmZ3U0lg/edit#slide=id.g2ef698ca55_0_0)

@ngsw_taro さん

初めて[Kotlin](https://kotlinlang.org/)を触るという人を対象に、FizzBuzzや、少し進んで拡張関数などを課題形式で解きながら、背景などを踏まえて都度解説してもらいます。

正直、あと二時間ぐらいほしかったです。笑

それくらい有益でわかりやすく、短い時間でもKotlinの良さと性質について知ることができました。

- javaのライブラリを直接使うことができる
- Rubyのように軽快でスッキリしたコード
- 三項演算がない(必要がないから)
- 制御構文(if文とか)を式として扱える
- nullの代替値
etc...

など新しい発見が多く、これからKotlinに対する学習意欲がすごく高まりました。

文法は新鮮なものが多いですがとてもわかりやすいので、project eulerでもやってみると筋肉がつきそうなのでやってみようと思います。

この講演をはじめ、実際に書いてみた感じと、数あるセッションの半分くらいの例示ソースコードがKotlinで書かれていたことを鑑みると、まだまだJavaに追いついていない部分もあるそうですが、両方対応できるようにしておかないと置いていかれるな、と所感ですがそう思います。


# [アプリを成長させるためのログ取りとログ解析に必要なこと](https://www.slideshare.net/TakaoSumitomo/ss-87583483)

@cattaka さん

[Wantedly Visit](https://wantedly.zendesk.com/hc/ja/articles/204889935-Wantedly-Visit%E3%81%A8%E3%81%AF)のログ取りを実例に、[Firebase 向け Googleアナリティクス](https://firebase.google.com/docs/analytics/?hl=ja)や[Google BigQuery]
(https://cloud.google.com/bigquery/docs/?hl=ja)ツールを駆使したイベントの取り方、操作、滞在時間ログ取得ノウハウ、Excelや[GOOGLE DATA STUDIO](https://cloud.google.com/data-studio/?hl=ja)での可視化の方法についてわかりやすく解説してくれます。

***
ただいいものを作る、というだけでいいの？
何を持ってアプリがいいというのか
***

ログ取りによる、データ可視化分析の強力さをひしひしと感じました。

とにかくわかりやすくビジネスを説明できる上に説得力があり、エンジニアとしてライトな実装でもこの役割ができていたらハクがつくだろうな〜と思いながら聞いていました。

初学者には少しハイレベルな内容でしたが、背景にはユーザーを第一に考えた真摯な設計が見えて、時間をかけて成長させていくサービスを開発、所有また、マーケティングに携わっている人は必聴の講義だったと思います。

# [体育会系女エンジニアの孤独なアプリ開発教室](https://twitter.com/nagaoyuriko)

@nagaoyuriko さん

フリーランスエンジニアの方が、個人開発の流儀について語ってくれます。
会社に所属する方の講演が多い中、フリーランスで個人アプリを作っている方の講演は目新しく、人生を大幅に遠回りしてここにいる自分には共感せざるを得ない内容ばかりで大変面白かったです。笑
***
業務に携わるエンジニアはシェフであり、機材や調理器具に目が行きがち
***
本当にその通りで、ユーザーはJavaだろうがKotlinだろうがReact Nativeだろうがどうでもいいわけです。こだわりは大事ですが、手段を目的にして履き違えてはいけないなと思いました。

***
[Constraint Layout](https://dev.classmethod.jp/smartphone/android/new_constraint_ayout/)や[Material Design](https://material.io/guidelines/)に無理にこだわる必要はない
***
自分も[Relative Layout](https://developer.android.com/reference/android/widget/RelativeLayout.html)でとりあえず完成させるのが大好きなので、妙に納得しました。
モダンなのは[Constraint Layout](https://dev.classmethod.jp/smartphone/android/new_constraint_ayout/)ですが、そこにこだわって質や時間を無駄にするなら、RelativeやLinear、Gridが欠陥であるわけでは決してないので、慣れたレイアウトで構成するのが一番いいと思います。
一度、使ってから自分で目的に合わせてレイアウトを選択するのがいいのかなと思います。

***
[スクレイピング](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0)怒られ事情
***
スクレイピングで怒られることはないそうです。（ごく一部の一例を除いて）
自分もスクール時代ある課題でクローンサイトを作った時に、ソースから丸コピして改造しまくってスクレイピングもして、その会社の人に見せたことがありますが、怒られませんでした。( その会社の懐が深かっただけ説 )
WEBスクレイピングやクローリングサービスは多いですが、今後かなりグレーゾーンなのかもなと思ったりしました。

# まとめ
総じて、今年Android開発を始めたからこそ自分にとってはとても有意義で、いつか登壇できるくらいに頑張りたいなと、そう思わされる熱量の高い素敵なイベントでした。
また来年も参加できたらなと思います。
HHKBユーザーのためのVim日本語チートシート作った

[HHKB Pro2(US)](http://www.pfu.fujitsu.com/hhkeyboard/hhkbpro2/spec.html)を購入したので、HHKB用のvimの日本語チートシートを作成した。

JIS配列のキーボードを使っている方は、こちらを見てね!
[Vim日本語チートシート作った](https://qiita.com/zipper/items/8fbed306e203b17be0c3)

# テンプレート作成
やっぱり[この図](http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html)を元にして作成する
![vi-vim-cheat-sheet - コピー.gif](https://qiita-image-store.s3.amazonaws.com/0/131788/95aede7d-bbd4-3ba2-a448-04b44b6a5a2a.gif)

HHKB US配列ならこのままでいいじゃないか!って思ったけどよーく見ると
HHKBの配列とは違っている。

# HHKB配列に修正する
![unix.png](https://qiita-image-store.s3.amazonaws.com/0/131788/09433e0d-66e8-d5f4-335b-128e2e063c73.png)
こうして見るとHHKB(US)の配列ってすごく綺麗ですね。

# 英文字を取り除く
![no.png](https://qiita-image-store.s3.amazonaws.com/0/131788/0e112ab7-b5cd-eb12-4e40-f732ee6a8110.png)
雛形となるシートの作成。キーマッピングを独自に変えていて、vimデフォルトマッピングとは異なる方は、
こちらの雛形から自分専用のチートシートを作成してください。

# 日本語化
![sheet.png](https://qiita-image-store.s3.amazonaws.com/0/131788/43accb55-04aa-3ca9-d725-eefaeadcb745.png)
日本語化して完成です。HHKBでvimを利用している方は、是非使ってください。


# おまけ
海外のプログラマーの方は、キーキャップを変えてオシャレしている方が多いんですが、日本にはそんな文化があまり無いらしい。
更には、HHKBのキーキャップ(Topre)のおしゃれキー自体が世界的に見ても少ないらしい。
そんな中、数少ないTopreおしゃれキーキャップを販売している店を見つけたので、紹介します。
**[PFU](http://www.pfu.fujitsu.com/direct/hhkb/hhkb-option/)**
HHKBの販売元。
キーキャップ単体でも販売していて、[無刻印セット](http://www.pfu.fujitsu.com/direct/hhkb/hhkb-option/detail_keytop-3.html)、[刻印セット](http://www.pfu.fujitsu.com/direct/hhkb/hhkb-option/detail_keytop-projp.html)、[赤いコントロールキー](http://www.pfu.fujitsu.com/direct/hhkb/hhkb-option/detail_keytop-proc.html)などが売ってます。

**[KBDfans](https://kbdfans.myshopify.com/collections/electrostatic-capacitive-keycaps)**
[カラフルな色のキー](https://kbdfans.myshopify.com/collections/electrostatic-capacitive-keycaps/products/topre-pbt-6u-spacebar)とか[インベーダーっぽい刻印の入ったキー](https://kbdfans.myshopify.com/collections/electrostatic-capacitive-keycaps/products/prespace-invaders-dye-sub-electrostatic-capacitive-keycaps)を売ってる。
あと[Pro2をType-S化するためのリング](https://kbdfans.myshopify.com/collections/electrostatic-capacitive-keycaps/products/topre-keyboard-silence-x-120pcs)も売ってる。

**[k3kc](http://www.k3kc.com)**
Artisan keycapと呼ばれる、造形されたキーキャップを売ってる。
[1つ300ドルのキーキャップ](http://www.k3kc.com/shop/bermuda-topre-unique-keycap/)とかある。

**[MimicCables](https://www.mimic-cables.com/products/custom-usb-cable)**
キーキャップではないが、おしゃれなUSBケーブルを売っている。
色と長さと端子とカールコードにするかどうか等を決めてオーダーするらしい。
AK4495SEQフィルタ5種のインパルス応答

# 概要

AK4495SEQには5種類のディジタルフィルタが搭載されている。
44.1kHzでインパルス信号で入れた際の、インパルス応答を観測してみる。

- ショートディレイシャープロールオフ, GD=6.25/fs
- ショートディレイスローロールオフ, GD=5.3/fs
- シャープロールオフ
- スローロールオフ
- スーパースローロールオフ

![FilterResponse.jpg](https://qiita-image-store.s3.amazonaws.com/0/187531/51305035-3711-5e98-364e-f61fe6b30caa.jpeg)


## 測定環境

- HW: NanoPi-NEO Plus2
- OS: [Ubuntu MCLK出力改造版](https://qiita.com/blue-7/items/d643cc9e441ca594a01e)
- DAC: AK4495SEQ
- 構成：I2S接続

# 結果

オペアンプ通した出力段にて観測。

## ショートディレイシャープロールオフ, GD=6.25/fs

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/91d52274-8c48-ee24-4346-7fb4debc10ed.png)

## ショートディレイスローロールオフ, GD=5.3/fs

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/c7fd90e8-fd32-7b56-2c67-ffd8e7fc7110.png)

## シャープロールオフ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/81cd1069-b5f0-d9fc-7225-255875b901d7.png)

## スローロールオフ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/f4a4c8ee-6fb2-e7ed-a39d-a4c97013815e.png)

## スーパースローロールオフ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/ee7bd30d-fa01-25bc-043c-04e118070093.png)

あれ・・・？
この波形は、Non Over Sampling っぽい。
ということで、AK4495SEQの出力ピン(P側)をダイレクトに観測。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/9f2e044e-be99-fe9a-731c-71ee362a301a.png)

完全にNOSですね。