OmniAICreator/Qiita-1.07M huggingface dataset:
Rust, nomの使い方

# Rust, nomの使い方
検索して出てきたやつが古くて動かなかったのでメモ。
tag!は最初に指定した文字列(ここでは"Hello,")が先頭にあったとき、残りの文字列と分けて返す。

```rust
#[macro_use]
extern crate nom;

use nom::{IResult, space, alpha};

named!(parens, delimited!(char!('('), is_not!(")"), char!(')')));

named!(test1(&[u8]) -> &[u8], tag!("Hello,"));
named!(test2<&[u8], &[u8]>, tag!("Hello,"));
named!(test3, tag!("Hello,"));

fn test4(input: &[u8]) -> IResult<&[u8], &[u8]> {
    tag!(input, "Hello,")
}

// test1~4 are the same functionally

fn main() {
    let sample = "Hello, world!";

    let tes: &[u8] = &[0; 4];

    match test4(sample.as_bytes()) {
        IResult::Done(i, o) => {
            println!(
                "{}, {}",
                String::from_utf8(i.to_vec()).unwrap(), // world!
                String::from_utf8(o.to_vec()).unwrap(), // Hello, 
            )
        }
        _ => println!("Other!\n"),
    };
}

```
コルーチンのサンプル集


https://docs.unity3d.com/jp/540/Manual/Coroutines.html


__非同期処理__
__関数を任意のタイミングで中断・再開できる機能__

## xxx秒後にUpdate関数を実行する

```c
private IEnumerator Start () {
	// enabled = true にして初めてUpdate()関数が走る
	enabled = false;
	yield return new WaitForSeconds(5);
	enabled = true;
}

void Update () {
	Debug.Log("Update");
}
```

## for文の内部をxxx秒ごとに実行する

```c
void Start () {
	StartCoroutine("Sample", 60);
}

IEnumerator Sample(int len) {
	// for文の内部を0.1秒ごとに実行する
	for (int i = 0; i < len; i++){
		yield return new WaitForSeconds(0.1f);
		Debug.Log("i: " + i);
	}
}
```

## 1フレームごとに実行する

```c
void Start () {
	StartCoroutine("Sample", 60);
}

IEnumerator Sample(int len) {
	// 1フレームごとに実行する
	for (int i = 0; i < len; i++) {
		yield return null;
		Debug.Log("i: " + i);
	}
}
```


## コルーチン内で別のコルーチンを実行

番号は、Logの出力される順番

```c
void Start () {
	StartCoroutine("Sample1");
}

IEnumerator Sample1() {
	Debug.Log("Sample1 start"); // ①
	yield return StartCoroutine("Sample2");
	Debug.Log("Sample1 end");   // ④
}
IEnumerator Sample2() {
	Debug.Log("Sample2 start"); // ②
	yield return new WaitForSeconds(1f);
	Debug.Log("Sample2 end");   // ③
}
```


## コルーチンを止める

3秒以内にスペースボタンを押せば、コルーチンの処理が止まる。

```c
void Update () {
	if(Input.GetKeyDown(KeyCode.Space)){
		StopCoroutine("StartTimer");
	}
}

IEnumerator StartTimer() {
	yield return new WaitForSeconds(3f);
	Explode();
}
void Explode() {
	Debug.Log("どっかーん");
}
```


## 一時停止・再開

__メソッドのIEnumeratorを事前に取得しておくと、一時停止・再開できる。__

MouseDownしたら1フレームごとにカウントしていく
MouseUpしたら一時停止
再度MouseDownしたら、MouseUpした地点から再開

```c
IEnumerator coroutineMethod;

void Start () {
	coroutineMethod = Sample(1000);
}

void OnMouseDown() {
	StartCoroutine(coroutineMethod);
}
void OnMouseUp() {
	StopCoroutine(coroutineMethod);
}

IEnumerator Sample(int len) {
	for (int i = 0; i < len; i++) {
		yield return null;
		Debug.Log("i: " + i);
	}
}
```


## ゲーム終了時

コルーチンを全て止める

```c
StopAllCoroutines();
```



> 参考
[UnityのCoroutine（コルーチン）でできる事のメモ](http://tsubakit1.hateblo.jp/entry/2015/04/06/060608)
[Unityのコルーチン機能を使う](https://cfm-art.sakura.ne.jp/sys/archives/419)
[Unityのコルーチンの使い方をまとめてみた](http://developer.wonderpla.net/entry/blog/engineer/Unity_Co-routine/)
Rustでバイト列から文字列へ

# Rustでバイト列から文字列へ
自分用にメモ。
文字列からu8スライス、u8スライスから文字列への変換。

```rust
fn main() {
	let test: &str = "Test";
	let bytes: &[u8] = test.as_bytes();
// convert bytes => str
    let res = bytes.iter().map(|&s| s as char).collect::<String>();
	let converted: String = String::from_utf8(bytes.to_vec()).unwrap();
	
	println!("{}", test);
	println!("{}", converted);
}
```

# 追記
コメントにて指摘されたことを追記。

~~Vecに変換するとVecを生成してしまい若干非効率になる。イテレータを取得しmapすることでそれを避けられる。~~
ただしくはUTF-8の文字列としてバリデーションをするのと、一文字として変換するのとの差になっているそうです。
ただし、Rustでは文字はUTF-8として変換されるため、マルチバイト文字であった場合元の文字列とは異なってしまう。

`String::from_utf8`はきちんとUTF-8のバイト列として解釈して変換してくれるので、マルチバイト文字でも正しく変換できる。
@blackenedgoldさんが検証して下さった結果によると、たしかに最適化無しの状態では2倍の差が出ていることが確認できる。
最適化した場合での差はそれほど大きくないので`String::from_utf8`を使う方が良さそう。
HerokuのログをSplunkに食わせてみる

# はじめに
Herokuの[Log Drains](https://devcenter.heroku.com/articles/log-drains)を使ってSplunkにログ取り込んでみた

# 設定してみる
ということで、早速設定してみた

## Splunkでログ受け取りの準備

### インデックス作成（≒ Herokuのログを保存するディレクトリ）
Splunk GUIから`heroku`インデックスを作成
※ GUIのスクリーンキャプチャは省略、代わりにGUI経由で作成される設定ファイル(*.conf)貼っときますね

```properties:indexes.conf
[heroku]
coldPath = $SPLUNK_DB/heroku/colddb
enableDataIntegrityControl = 0
enableTsidxReduction = 0
homePath = $SPLUNK_DB/heroku/db
maxTotalDataSizeMB = 512000
thawedPath = $SPLUNK_DB/heroku/thaweddb
```

### ソースタイプ作成
既定のソースタイプ `syslog` からクローンして `heroku:syslog` を作成
これもGUIから作成

```properties:props.conf
[heroku:syslog]
DATETIME_CONFIG = 
MAX_TIMESTAMP_LOOKAHEAD = 42
NO_BINARY_CHECK = true
REPORT-syslog = syslog-extractions
SHOULD_LINEMERGE = false
TIME_FORMAT = %Y-%m-%dT%H:%M:%S.%6N
TRANSFORMS = syslog-host
TZ = UTC
category = Application
description = Syslog Drain by Heroku
disabled = false
maxDist = 3
pulldown_type = 1
```

更新した箇所は `MAX_TIMESTAMP_LOOKAHEAD` `TIME_FORMAT` くらいかな
`description` とか `category` は適当でおk

### データインプット作成
TCP 10514ポートでデータを受け取る
これもGUIからs (ry

```properties:inputs.conf
[tcp://10514]
connection_host = dns
index = heroku
source = myherokuapp
sourcetype = heroku:syslog
```

`index` と `sourcetype` に先ほど設定したものを指定するのを忘れずに

## HerokuでLog Drains設定
その前に...

### Heroku CLIインストール
まだ[Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)入ってなかったので、Macにインストール

```bash
$ brew install heroku/brew/heroku
==> Tapping heroku/brew
Cloning into '/usr/local/Homebrew/Library/Taps/heroku/homebrew-brew'...
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 9 (delta 0), reused 7 (delta 0), pack-reused 0
Unpacking objects: 100% (9/9), done.
Tapped 2 formulae (36 files, 23.6KB)
==> Installing heroku from heroku/brew
==> Installing dependencies for heroku/brew/heroku: heroku/brew/heroku-node
==> Installing heroku/brew/heroku dependency: heroku/brew/heroku-node
==> Downloading https://cli-assets.heroku.com/homebrew/node-8.7.0.tar.xz
######################################################################## 100.0%
🍺  /usr/local/Cellar/heroku-node/8.7.0: 3 files, 34MB, built in 6 seconds
==> Installing heroku/brew/heroku
==> Downloading https://cli-assets.heroku.com/homebrew/heroku-6.14.36.tar.xz
######################################################################## 100.0%
🍺  /usr/local/Cellar/heroku/6.14.36: 8,177 files, 43.5MB, built in 8 seconds
```

### Log Drains設定
Splunkで作成したデータインプット（TCP 10514ポート）に投げるようにCLIで設定

```bash
$ heroku drains:add syslog://<splunk_ip>:10514 --app myherokuapp
```

以上！！

# Splunkで検索してみる

![Screen Shot 2017-10-23 3.44.52 PM_mosaic.png](https://qiita-image-store.s3.amazonaws.com/0/174837/a5da5b94-eb22-dec8-999a-b7645a6ca6fa.png)

Herokuのログがインデックスされてる
若干文字コードが合ってないのかな...？ ここは要対応かも

とはいえ、ログはSplunkに貯めることができるので、これでアプリケーションの稼働状況とかHeroku利用状況を監視できそう

# （おまけ）フィールド抽出
こんなフィールド抽出してみた

```
([^\s]+\s){3}(?P<token>[^\s]+)\s(?P<category>[^\s]+)\s(?<dyno>[^\s]+)\s([^\s]+\s){2}(?P<message>[\s\S]+$)
```

ログ行の先頭からスペース区切り4つ目が`token`、5つ目が`category`、6つ目が`dyno`、9つ目が`message`という感じ
環境構築メモ

Webブラウザを自動で操作するプログラムを書くための前準備として、環境構築を行う。

今回導入する環境は以下の通り。
・エディタ
[Visual Studio Code](https://code.visualstudio.com/download)
・言語
[Python](https://www.python.org/downloads/)
・ツール
[chromedriver.exe](https://sites.google.com/a/chromium.org/chromedriver/downloads)
[Microsoft WebDriver](https://www.microsoft.com/en-us/download/details.aspx?id=49962)
### 手順
1. DL
上記リンクから全てをダウンロードする。

2. VS Codeのインストール
標準設定のまま、追加タスクの選択でチェックボックスがあるが、基本全選択でおｋ

3. Pythonのインストール
インストーラーを起動したら「Add to PATH」にチェックを入れてインストール

4. VS Codeの設定
    1. Add-onでPythonの拡張機能をインストールする。
        1. CTRL+P　から「ext install Python」と入力
        2. 一番インストールされている「Python」をインストール
    2. pylintのインストール。
        1. Ctrl+Shift+Cでコンソールを開く
        2. 「pip install pylint」と入力
        3. エンターでインストール実行
    3. seleniumのインストール。
        1. Ctrl+Shift+Cでコンソールを開く
        2. 「pip install selenium」と入力
        3. エンターでインストール
    4. 実行のコマンド化
        1. CTRL+P から「>tasks configure」と入力
        2. タスクの構成 > Others　の順にクリック
        3. 出来上がった.vscodeファイルを以下に書き換える

```json:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "python",
    "isShellCommand":true,
    "args": ["${file}"],
    "showOutput": "always"
}
```

最後に、ChromeDriver.exeをPythonのインストールフォルダに置いて完了
(デフォルトはこの位置　AppData\Local\Programs\Python\Python36-32)
スワイプ角算出手順の備忘録

# 概要
uGUIオブジェクトごとの、スワイプ角算出手順の備忘録。

# スワイプイベントを拾う
以下にまとめました。
https://qiita.com/ganessa/items/71cc0293d09ebd3ea980

# 角度算出
閾値チェックにはmagnitudeではなく、sqrMagnitudeを使用。
Mathf.Atan2(y, x)を使うと、象限ごとに分けなくて済みそう。

```c#:SwipeHandler.cs
using UnityEngine;
using UnityEngine.EventSystems;

public class SwipeHandler : MonoBehaviour, IDragHandler, IEndDragHandler {
    public float threshold = 100.0f;

    public void OnDrag(PointerEventData eventData)
    {
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        // eventData.delta の値が期待と異なったので算出
        Vector2 delta = eventData.position - eventData.pressPosition;

        // 閾値チェック(magnitudeは重いのでsqrMagnitudeを使う)
        // if (delta.magnitude < threshold) {
        if (delta.sqrMagnitude < threshold * threshold) {
            return;
        }

        // スワイプ角度算出
        //        90
        //        ↑
        // ±180 ← x → 0
        //        ↓
        //       -90
        float deg = Mathf.Atan2(delta.y, delta.x) * 180 / Mathf.PI;
    }
}
```

# uGUIにアタッチ
あとはこのクラスをInspector上でアタッチするだけでOK
CircleCI 2.0でMySQLのイメージを使うならば、CircleCIが配布しているイメージを使わないと損

# はじめに

2017/09/15 に DMM さんで [CircleCI Meetup Tokyo #3](https://connpass.com/event/64629/) というイベントが行われ、そこで CircleCI の中の人である [Kim, Hirokuni](@kimhirokuni) さんからお話された内容なんだが、あんまり拡散されてない気がしたので、記事を書いてみた

# CircleCI 2.0 で MySQL を使う場合の設定

CircleCI 2.0 は 1.0 までのように VM ベースの環境(machine executor)も使うことができるが、基本的には Docker ベースの環境(docker executor)が推奨されている。

例えば、PHPのテストをする場合は以下のように書いているのではないだろうか？

```
version: 2

jobs:
  build:
    docker:
      - image: php:7.1-apache
      - image: mysql:5.7
    steps:
      - checkout
      - ...
```

上記のように、MySQLのimageをDocker Hubで配布されているオフィシャルイメージを使っていて、1.0 から 2.0 に移行したのに思ったほどは早くなってないという方はいないだろうか？

CircleCI Meetup Tokyo で話していただいた内容によると、CircleCI 1.0で提供されているMySQL環境は CircleCI 側でいろいろチューニングされていてそれで速度アップしていたが、CircleCI 2.0を開発した当初はそのチューニングをしていなくて、思ったように速度がでてなくて、後から1.0同等のチューニングしたimageをつくったとのこと。

なので、上記の設定は以下のように置き換えることができる。

```
version: 2

jobs:
  build:
    docker:
      - image: php:7.1-apache
      - image: circleci/mysql:5.7
    steps:
      - checkout
      - ...
```

見ていただくとわかるが、「circleci/」を頭につけるだけ。実際、オフィシャルのMySQLイメージを使うのに比べると、CircleCIが配布しているMySQLイメージを使うと、かなりの実行時間の短縮ができたので、まだ使ってない人はすぐに切り替えたほうがいいと思う。

このimageだが、以下のページに書かれているようにデフォルトで「circle_test」というテスト用のdatabaseが準備されているのは1.0と同じだが、接続ユーザは1.0の頃は「ubuntu」だったのが「root」になってるので、1.0から移行する場合は注意が必要となる。

- https://hub.docker.com/r/circleci/mysql/

# まとめ

以下のページを診てもらうとわかるが、CirclCI 自身が結構オフィシャルのイメージを配布しているので、それを活用するとCIの時間がさらに短縮されるかもしれないので試してみるのがいいと思う。

- https://hub.docker.com/u/circleci/

# おまけ

今まで気がついてなかったが、「circleci/mysql:xxx-ram」というタグがあるけど、これ使うとさらに早くなるのかなぁ。ためしてみないといかん・・・

- https://hub.docker.com/r/circleci/mysql/tags/
C++ Builder XE4, 10.2 Tokyo > TForm > BorderStyle > bsSingle (biMinimize と biMaximize) | bsDialog 

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

現在取組んでいる３つのソフトにおいて、一つだけメイン画面の表示が異なっていた。
BorderIconsとBorderStyleの設定違いに起因していたようだ。


### case 1-a > bsSingle (biMinimize = true, biMaximize = true)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/95e6d04d-cbf3-44b4-5bd5-2a1c6d3307df.png)

### case 1-b > bsSingle (biMinimize = false, biMaximize = false)

- biMinimize = false
- biMaximize = false

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6a9e5129-b092-2687-ce07-99c72568e70a.png)

左上のメニューは残した状態 (biSystemMenu = true)。これをfalseにすると、左上のメニューが消えると同時に、右上のxボタンも消える。

### case 2 > bsDialog

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5716c3e5-bbf8-e576-4a6c-b0dcffb92cec.png)

case 1-bとの違いは左上のメニュー。

## UI

システムメニューとしての左上アイコンは、「それをクリックできる」という見せ方なのかもしれない (これまで意識してきたことはなかった)。
WordpressでのMIMEタイプの追加

# MIMEタイプを追加したいとき

普通にPHPをいじってもいいが、プラグインがあったのでそれを使用する。

## PJW Mime Configのインストール、設定

PJW Mime ConfigをWordpressのプラグインのところで検索しインストール
有効化します。

![スクリーンショット 2017-10-23 15.09.18.png](https://qiita-image-store.s3.amazonaws.com/0/52386/c9b44ce5-6782-cf58-0612-bf64c334d0b7.png)

設定に、Mime typesが増えます。

![スクリーンショット 2017-10-23 15.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/52386/2ff4bfea-4d4d-1028-edc3-1c72b257a706.png)

↑のような感じで、設定します。

![スクリーンショット 2017-10-23 15.12.46.png](https://qiita-image-store.s3.amazonaws.com/0/52386/f1fc4191-d3bd-e701-30f0-de68fd0f18c9.png)

無事に設定できました:blush:
fx-cljをインポートしようとしたらしょうもないところで詰まった笑い話

# 起こった問題
fx-clj(https://clojars.org/fx-clj) を:dependenciesに突っ込んで lein depsをして、replに(:require [fx-clj.core :as fx])をすると **クラスパスがねえよ** と怒られた。

# 原因
そもそもjavafxが入ってない(つまり、fx-cljがないわけではない)

# 解決方法
使っている環境に合わせて

```shell
sudo yaourt -S jre8-openjdk
sudo pacman -S jdk8-openjdk
sudo pacman -S java-openjfx
```

して必要なパッケージをインストールしてください

# 教訓
ClojureはJavaの上に乗っかているイメージなのでJava環境についての注意を忘れてはならない。
あと、パッケージがインストールされているかを確認するにはターミナルで```lein deps :tree```をするか、replで```(all-ns)```をすると簡単に確認ができる
文字化けしない tree コマンド を Git for Windows で使いたい

Windows はコマンドプロンプト上では tree コマンドがありますが、Git Bash 上では tree がありません。
準備する手順です。

## treeコマンドのセットアップ
[tree for Windows](http://gnuwin32.sourceforge.net/packages/tree.htm) からアーカイブをダウンロードしてください。

![2017-10-23_15h02_41.png](https://qiita-image-store.s3.amazonaws.com/0/1982/1ca24e39-2449-09ec-3913-0d87a6640983.png)

zipファイルを解凍し、`tree.exe` を `C:\Program Files\Git\cmd\` にコピーします。


## alias を設定する
Git Bash を起動します。

日本語ファイル名、フォルダ名を文字化けしないように alias を設定しておきます。

```bash
alias tree='tree -N'
```
.bashrc に書いておくのが良いでしょう。

## 参考
* https://superuser.com/questions/531592/how-do-i-add-the-tree-command-to-git-bash-on-windows
Wordpress+Nginx アップロード上限を超えています。

# アップロード上限を超えています。

このエラーは、PHPの設定とNginxの設定で引っかかっています。

## PHP.iniを設定する

```/etc/php.ini
アップロード可能サイズ
upload_max_filesize = 10M

POST可能サイズ
post_max_size = 10M

PHPのメモリサイズ
memory_limit = 128M
```

## Nginxを設定する

```/etc/nginx/nginx.conf
http {
    # 略
    client_max_body_size 10M;
    # 略
}

```
「JDK9は出たけど、私の保守対象アプリはJDK6だ」というあなたへ

# 新しいことだけやっては暮らしていけない
JDK9とJavaEE8が先日発表されました。長い間、リリースされなかったので待ちに待ったという人も多いと思います。しかし、その一方そんなモジュール化とかStreamとか以前に、ダイヤモンド演算子(JDK7)も聞いたことがないという人も事実としています。

そもそも、JDKとJavaEEの違いがついていないという人もいるでしょう。そして、そういう方々の多くは、新規開発として、血気盛んなエンジニアが当時最新の技術を用いて開発したJavaアプリケーションを運用・保守しているのではないでしょうか？

# 歴史から何かを学ぶ
私も2005年ごろからJavaでのWeb開発を担当してきましたが、新技術を採用するときはやはりそれなりの理由があります。最近保守についた方だとそういったことを知らないケースが多いと思うので簡単にまとめておきます。
新規開発ばかりが仕事ではありません。既存システムの保守や機能追加の案件も多いと思います。その際に歴史や特徴を知っておくことはとても大事なことだと思います。

私も古い歴史の復習と新しい技術の両方を学んで、新しいアプリケーションのリプレース時に備えて力をつけておきたいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161223/fde9e0f7-6dee-3dea-1212-568a698c1bda.png)


#引用元
[JDK5,6,7,8の公式アップデート終了日引用元](https://blogs.oracle.com/otnjp/java-7java-6)
[JDK8,9の公式アップデート終了日引用元](http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html)
Pythonをシェルで実行する時の基本

※CGアーティストによるPythonのメモ。こちらの記事は主に**python3**および**Windows**です。
間違いあれば教えてください。

# Pythonのバージョンについて

Pythonにはバージョン2系と3系があり、3Dツールは2系が多い様子。
2系と3系の違いは、ネットに参考記事が多いので割愛。

Maya2015は2.7。
調べる場合は、MayaのスクリプトエディタをPythonで開いて下記を実行。

```
import sys
print(sys.version)
```

すると

```
2.7.11
```
などと教えてくれる。

# Windows PowerShell を使う場合

```
>python
```

と打つと、pythonが起動し、対話型でプログラムを実行できる。

```
>python
Python 2.7.12 (略)
>>>
```

ただし、Pythonのバージョン2系と3系の両方がインストールされている場合、メインで入っている方が起動する。
これを、別のバージョンで起動したい場合は、3つの方法がある。

##### **py.exe を使って起動する**

Python3.3から導入されたランチャー。
オプションで2系か3系かを選べる。
下記のようにすると、3系のPythonが起動する。

```
>py -3
```

##### **環境変数を追加する**

`>python` で起動した時のデフォルトのバージョンを変更したい時は、
`PY_PYTHON`という環境変数を任意のバージョンで追加する。

##### **ファイル側でバージョンを指定する**

.pyファイルの冒頭に下記のように記述することで、実行するpythonのバージョンを強制できる。

```
#!/usr/bin/python3 -V
```

# Windows PowerShell で Python を終了する

```
>>>exit()
```

今実行されているのがpythonか否かは、`>>>`か`>`かで判断。（>>>はpython中）

# python IDLE を使う

**IDLE** は、pythonをインストールすると自動でついてくる開発環境。

##### **ディレクトリを移動する**
```
>>>import os
>>>os.getcwd() #現在のディレクトリ表示
>>>os.chdir(r'C:￥Users￥***￥Desktop￥folder') #ディレクトリを移動
```

- `#コメント`はコメントです。
- URL内の`￥`が、pythonのエスケープシーケンス（オプション指定文字）なので、そのままでは特殊記号だと認識されてエラーになります。
- **文字列「''」の前にrをつける**ことで、URL文字列内の`￥`をエスケープシーケンスと認識しないようにさせます。
- ただしURL末尾の`\`は外します。

その他のコマンドはリファレンスへ

# パッケージをインストールする

このあたりが、どうもwindowsでpythonを扱う際の鬼門なのでしょうか。
詳しいことは分かりません…。

2系と3系を併用しているケースで、2系がメインのパスになっていて、3系にインストールしたい場合。

```
py -3 -m pip install パッケージ名
```

「タイムアウト」と言われてインストールが終わらない場合は、
会社からアクセスしているなどでファイヤーウォールが阻んでいる可能性がありそう。
rails email暗号化

Deviseを用いたユーザー認証を実装すると
pasword はハッシュ（不可逆暗号化）されるが
emailは不可逆暗号化はされないので、独自で実装してみた。

```ruby

class User < ApplicationRecord
  devise :database_authenticatable,
         :registerable,
         :recoverable,
         :validatable,
         :omniauthable,
         :confirmable

  before_save :encrypt_email #1

  def email #3
    if id.present?
      decrypt(self[:email])
    else
      self[:email]
    end
  end

  private

  def encrypt_email  #1
    self.email = encrypt(email)
  end

  def encrypt(value_to_crypt) #2
    crypt = ActiveSupport::MessageEncryptor.new(ENV["ENCRIPT_KEY"])
    crypt.encrypt_and_sign(value_to_crypt)
  end

  def decrypt(value_to_decrypt)
    crypt = ActiveSupport::MessageEncryptor.new(ENV["ENCRIPT_KEY"])
    crypt.decrypt_and_verify(value_to_decrypt)
  end
end
```


### #1
before_saveで
データを保存する前に
emailを暗号化して保存する

### #2

`encrypt`は

ruby は2.4.1で

```ruby
ActiveSupport::MessageEncryptor.new
```

を使ったので、

下記のエラーがよくでますが、
```
key must be 32 bits
```

上のコードの `ENV["ENCRIPT_KEY"]`
をぴったり32bitの文字列を適当に入れればよい

ENV["ENCRIPT_KEY"]を変えると当たり前ですが
暗号化される文字列、復号される文字列も変わります。

### #3

emailを復号メソッドにしてしまうと
採番される前のARのmodelオブジェクトだと
emailが暗号されていないので、
復号前の文字列を復号してしまい
エラーが起きてしまうので

採番される前は復号せずにそのままのデータを
返すようにする。
HHKBでVirtualBox上のUbuntuを叩いているとCapsLockやShiftLockがかかる

##問題
 HHKBでVirtualBox上のUbuntuを叩いているとCapsLockやShiftLockがかかる
###環境
 VirtualBox上のUbuntu

 Host OS: Windows 7 Professional SP1
 Guest OS: Ubuntu 16.04 LTS
 VirtualBox: ver. 5.1.30
 キーボード: HHKB Professional 2 US配列 (PD-KB400B)


##原因判別と解消策
 テキストを入力してみる。
 "npm -v"

1. CapsLock
1.1. 入力内容に対する表示
 "NPM -V"
1.2. 解消するには
 Fn + Tab

2. ShiftLock
2.1. 入力内容に対する表示
 "NPM _V"
2.2. 解消するには
 右Shift + 左Shift
 …のはずだが、実際にはHostに制御を一旦戻すことでShiftLock解除。

3. CapsLock + ShiftLock
3.1. 入力内容に対する表示
 "npm _v"
3.2. 解消するには
 上記２つの組み合わせ
ROLI BLOCKSプログラミング はじめの一歩

# ROLI BLOCKSプログラミング はじめの一歩
2017年10月6日〜7日に開催された[『TOKYO BLOCKS HACKATHON』](http://blockshackathon.peatix.com/)に参加して、はじめて、[『ROLI Lightpad Block』](https://www.mi7.co.jp/products/roli/blocks/)に触れました。
このデバイスをLittleFoot言語を使って端末内のプログラムを作ろうとしてかなり困ったので（ハッカソンでは、特に説明が無かった）、ノウハウを共有したいと思います。

ハッカソンでは思う物が作れず、デバイスを2個購入して、リベンジしようとしています。

その時のプレゼン資料
https://www.slideshare.net/secret/9ObiunqqkDBt0U

## 環境(2017/10/23現在）
MacBook 12(2017)
MacOS 10.13
ROLI Lightpad Block Firmware 0.4

## セットアップ方法
1.LightPadをMacに接続する
USBケーブルを使った接続とBluetooth MIDI経由で接続する方法がありますが、ここでは、Bluetooth MIDI経由で接続する方法を説明します。

1-1.アプリ一覧から『その他』を開く、『Audio MIDI』を開きます。
![171023-0018.png](https://qiita-image-store.s3.amazonaws.com/0/33220/e66befc7-aa81-55e3-47fb-58363c6aa418.png)

1-2. Bluetoothのマークがあるので、これを開きます。
![171023-0019.png](https://qiita-image-store.s3.amazonaws.com/0/33220/d09bcde5-4f06-bd6d-d9e2-c8c6ec3810ce.png)

1-3. Lightpadの電源を投入すると、デバイスが検出されますので、接続ボタンを押します。
![171023-0020.png](https://qiita-image-store.s3.amazonaws.com/0/33220/c8b1ef06-716f-474b-0448-1140c471b1f9.png)

1-4. 接続解除ボタンに変われば、MacBookとLightPadが接続できました。
![171023-0021.png](https://qiita-image-store.s3.amazonaws.com/0/33220/33a6d8f2-ef5a-f04e-90f6-f9703b075a4e.png)

2.Blocks Dashboardをインストール（省略）後、アプリを開きます。
![171023-0023.png](https://qiita-image-store.s3.amazonaws.com/0/33220/b097712f-2b86-b4f9-5a67-e6b05186a5d4.png)

2−1．事前に接続されていない場合は、下記の画面のようにデバイスを接続するように促されます。デバイス繋がないとコーディングもできません。
![171023-0010.png](https://qiita-image-store.s3.amazonaws.com/0/33220/9510b64e-21d2-e3d4-b017-617468ac817e.png)

3．はじめてのプログラムを作成してみる。Locationsの一覧から、Userを選択します。そして、『Create new Program』を選択します。
![171023-0024.png](https://qiita-image-store.s3.amazonaws.com/0/33220/cdd02e0a-e1a6-b154-9497-8606b9adbc81.png)

4.コードが記述できる状態になりました。
![171023-0011.png](https://qiita-image-store.s3.amazonaws.com/0/33220/2e0fee33-2b37-7db6-6f7d-926b8724fa26.png)
リアルタイムに動きますので、コードを記述中でも動作が変わります。

5.デバッグログの画面の開き方
下の方に、Show Logがあるので、クリックすると、ログを表示する画面が出てきます。
![171023-0014.png](https://qiita-image-store.s3.amazonaws.com/0/33220/fbd80c48-3e32-366b-2f75-615968384439.png)

5.1 ログの出力方法
画面のように、log(数字);って書くと、ログで、数字がだらだら流れます。
ログ画面上には、数字しか出すことしかできません。
これをうまく使いこなして、デバックしてください。
ずっとログが出てしまうのは、void repaint()関数が定期的に呼ばれているからです。

![171023-0015.png](https://qiita-image-store.s3.amazonaws.com/0/33220/e4104cbb-e505-cc9c-f6f8-d28d7a97a13c.png)

5.2 デバイスに何か出したい
デバイスは真っ暗のままなので、ここでは、バッテリーの残量を表示してみましょう。
![171023-0022.png](https://qiita-image-store.s3.amazonaws.com/0/33220/bf545b4b-a138-8a4d-bed0-7ca9760a762a.png)

ログ上でも84って数字出ていますが、デバイスにも84って数字が出ています。

![IMG_6722.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/333ea125-91d3-faa1-d8dd-19db7d57e961.jpeg)

6.LittleFoot言語の仕様は？
言語仕様は、
http://developer.roli.com/documentation/group__LittleFootFunctions.html
に書いてあります。

とりあえず、最初の一歩を書いてみました。
ラムダ式/LINQ


## ラムダ式

`using System;`が必要

```c:戻り値あり
Func<int, int> mul = x => x * x;
Debug.Log("[Func] mul: " + mul(5));
```

```c:戻り値なし
Action<int, int> sum = (x, y) => {
    int t = x + y;
    Debug.Log("[Action] sum: " + t);
};
sum(2, 3);
```

```c:デリゲート
void Start() {
	Action<int, int> delegateSum = Sum;
	delegateSum(2,3);
}
void Sum(int x, int y) {
	int t = x + y;
	Debug.Log("[Delegate] sum: " + t);
}
```

> 参考
[【Unity】ラムダ式を実装する](http://albatrus.com/main/unity/7354)
[C#でデリゲートとラムダ式を使ってみる](https://gametukurikata.com/csharp/delegateramda)


## LINQ拡張メソッド

[[C#] これだけ押さえておけば大丈夫！？LINQ拡張メソッドまとめ](https://dev.classmethod.jp/etc/c-sharp-linq-extension-methods-review/)
基本的にはこちらを見ればよい

以下、使用例。

`using System.Linq;`が必要

```c:準備
IEnumerable<int> scores = Enumerable.Range(1, 10);
```

```c:上位3つの奇数
var oddNums = scores
    .Where(score => score % 2 != 0)
    .OrderByDescending(score => score)
    .Take(3);

oddNums.ToList().ForEach(num => Debug.Log("上位3つの奇数 => " + num));
```

```c:最小の奇数
var minOddNum = scores
	.OrderBy(score => score)
	.First(score => score % 2 != 0);

Debug.Log("最小の奇数 => " + minOddNum);
```

```c:[pattern1]最大の奇数
var maxOddNum1 = scores
	.OrderBy(score => score)
    .Last(score => score % 2 != 0);

Debug.Log("[pattern1]最大の奇数 => " + maxOddNum1);
```

```c:[pattern2]最大の奇数
var maxOddNum2 = scores
    .Where(score => score % 2 != 0)
    .Max();

Debug.Log("[pattern2]最大の奇数 => " + maxOddNum2);
```

```c:[pattern1]最初と最後を除く数を10で割る
var filteredNums1 = scores
    .Where((score, index) => index != 0 && index != scores.Count() - 1)
    .Select(score => (float)score / 10);

filteredNums1.ToList().ForEach(num => Debug.Log("[pattern1]最初と最後を除く数を10で割る => " + num));
```

```c:[pattern2]最初と最後を除く数を10で割る
var filteredNums2 = scores
    .Skip(1)
    .Reverse()
    .Skip(1)
    .Reverse()
    .Select(score => (float)score / 10);

filteredNums2.ToList().ForEach(num => Debug.Log("[pattern2]最初と最後を除く数を10で割る => " + num));
```
uGUIオブジェクトごとにスワイプチェック

# 概要
uGUIオブジェクトごとに、スワイプイベントを拾う手順の備忘録。

# IEndDragHandlerを実装
IEndDragHandler実装クラスをuGUIにアタッチすると、
対象のuGUIのみイベントを拾えるみたい。

IDragHandlerも実装しないと呼ばれない気がしたので、
こちらも実装する。

```c#:SwipeHandler.cs
using System;
using UnityEngine;
using UnityEngine.EventSystems;

public class SwipeHandler : MonoBehaviour, IDragHandler, IEndDragHandler {
    public float threshold = 100.0f;

    public void OnDrag(PointerEventData eventData)
    {
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        // eventData.delta の値が期待と異なったので算出
        Vector2 delta = eventData.position - eventData.pressPosition;

        // 閾値チェック
        if (Mathf.Max(Mathf.Abs(delta.x), Mathf.Abs(delta.y)) < threshold) {
            return;
        }

        // 縦横チェック
        if (Mathf.Abs(delta.x) > Mathf.Abs(delta.y)) {
            // 横方向
            if (delta.x > 0) {
                // 左から右
            } else {
                // 右から左
            }
        } else {
            // 縦方向
            if (delta.y > 0) {
                // 下から上
            } else {
                // 上から下
            }
        }
    }
}
```

# uGUIにアタッチ
あとはこのクラスをInspector上でアタッチするだけでOK
kotlinでSpark Frameworkを使ってみた

#kotlinでSpark Frameworkを使って簡単な実装をしてみた

##Spark Frameworkについて
Spark FrameworkとはJavaで実装された軽量フレームワークことです。
Spark FrameworkではWebフレームワークやREST APIを作ることができます。
また標準でJava8のLambdaに対応しています。

##実行環境
IntelliJ IDEA Version: 2017.2.5
Windows 10 Home

##実装手順
1.IntelliJ IDEAでGradle projectを作成

2.できたbuild.gradleに次の一文を追記する

```
compile 'com.sparkjava:spark-core:2.6.0'
```

3.kotlinのprojectがない場合は作成する

####コード

```kotlin:Hello.kt 
import spark.Spark.*

object HelloWorld {
    @JvmStatic
    fun main(args: Array<String>)  {
        staticFileLocation("D:/kotlin/sample/src/main/kotlin")
        setPort(1111)

        get("/hello") { request, response ->
            "<h1>Hello Spark!!</h1>+<h2>test</h2>"
        }
        get("/db") { req, res ->
            val name = contro().get(0)
            """
            <h1>$name</h1>
            """
        }

    }

}
```

```kotlin:Controler.kt
class contro() : UserDao() {
    fun get(i : Int): User? {
        val id: Int = i
        return findById(id)
    }
}

```

```kotlin:User.kt
import java.util.concurrent.atomic.AtomicInteger

open class UserDao {
    val users = hashMapOf(
            0 to User(name = "Alice", email = "alice@alice.kt", id = 0),
            1 to User(name = "Bob", email = "bob@bob.kt", id = 1),
            2 to User(name = "Carol", email = "carol@carol.kt", id = 2),
            3 to User(name = "Dave", email = "dave@dave.kt", id = 3)
    )
    var lastId: AtomicInteger = AtomicInteger(users.size - 1)

    fun save(name: String, email: String) {
        val id = lastId.incrementAndGet()
        users.put(id, User(name = name, email = email, id = id))
    }
    fun findById(id: Int): User? {
        return users[id]
    }
    fun findByEmail(email: String): User? {
        return users.values.find { it.email == email }
    }
    fun update(id: Int, name: String, email: String) {
        users.put(id, User(name = name, email = email, id = id))
    }
    fun delete(id: Int) {
        users.remove(id)
    }
}
data class User(val name: String, val email: String, val id: Int)
```

###実行結果
http://localhost:1111/hello
![スクリーンショット (183).png](https://qiita-image-store.s3.amazonaws.com/0/187924/4928fe1a-364e-94a2-d5ea-63b16e5e8366.png)


http://localhost:1111/db
![スクリーンショット (182).png](https://qiita-image-store.s3.amazonaws.com/0/187924/570d8b66-afbf-9d72-6a34-4473dd3f9329.png)


動的にもできるしSQL2oを使うことでSQLもつかえるらしい
Mac キーボードショットカット一覧

## はじめに
Macのソフトウェアのメニューで「⇧⌘N」というショートカットキーを見た時に「⌘」はキーボードにアイコンが分かるが、「⇧」ってなんだっけ？と分からない時が多々ある。どうもこの記号は覚えづらいので、以下にまとめておく。

## 修飾キー一覧

記号|キー|
---|---
⌘|command
⌥|option
⇪|caps lock
⇧|shift
⌃|control

## 参考
* [Mac のキーボードショートカット](https://support.apple.com/ja-jp/HT201236)
続・属人化を避ける

このQiitaは、マサカリや編集リクエスト歓迎です。まだドラフトチックなので、不適切な表現などあるかもしれませんが、よろしくお願いします。

前回書いた[Qiita: 属人化を避ける](https://qiita.com/4kizuki/items/9eddae1205dc00e9dccc)の反響が大きかったので、各種コメントへの返信を兼ねて、いろいろ書きます

# だいじなこと
## 「アイデアを出すこと」と「コードを書くこと」は別
コードを書く際は、必ず属人化を避けるべきです。一方で、アイデアを出す際は、これは属人化というより個人の才能に依ります。いわゆる、スティーブジョブズのようなカリスマは、この「アイデアを出すこと」に特化した人物です

この、「アイデアを出すこと」が脱属人化によって取り締まられてしまうのだけは絶対に避ける必要があります

## アイデアマンとコーダーの分離
一般に、アイデアに優れたメンバーがいた場合(Aさんとします)、Aさんはコーディングよりアイデアを出すことに集中すべきです。このとき、Aさんの仕事は利用例や仕様書の概要を組み立てることです。一方、この利用例や仕様書の概要をもとにプログラムを作成する際、Aさんはアイデアを出すことに集中しているので、主にほかの人が担当することになります。このとき、**コードを書く人が**先の属人化を避けるためのプロセスを実行するべきといえるでしょう

もちろん、Aさんはアイデアだけ、BさんはAさんのアイデアを実現するだけ、という風に完全に分離しろというわけではありませんが…

## アイデアを出すことは属人化していいの？
**はい、構いません**

アイデア生成プロセスはむしろ個人のスキルなので、このプロセスを脱属人化させてはいけません。その代わり、アイデアから生まれた製品は脱属人化を図ってください。ただし、チームとしてアイデアを出すことが仕事の場合（例えばコンサルティングファームに所属している場合など）はこの限りではありません

# では、どのようにプロジェクトを回すのか
ここからは、理想論がある程度混ざってきますので、皆さんの環境に応じて適宜読み替えてください

## 1. アイデアを持ち寄る方法を設ける
良い考えは共有されるべきです。とりあえず批判を抜きにして、個人個人が「こうするべき」と思ったことを持ち寄ります。会議を開いたり、もしくは、githubなどの`Project`機能を用いて共有します。このとき、細かい仕様書は確定させず、どのような使い方ができれば便利かを重視してください

## 2. 利用例が定まってから、仕様書を固める
カリスマ的アイデアにせよ、普遍的アイデアにせよ、利用例(入力と出力の概要)をさらに精錬し、仕様書(契約プログラミングにおける、前提、不変、事後条件を定義)とします。この段階は、メンテナンス性を高め、属人化を弾くことを意識します

(2017/12/15 編集リクエスト適用 不変を普遍と書く恥ずかしいミスをしてました)

さらに、テスト駆動開発を採用している場合は、この段階でテストコードを書きます。テストコードは「利用例」をもとに、予測される動作を網羅的に記述します

## 3. 仕様書が固まったら、それに従うようにコードを書く
仕様書外の動作や、契約が満たされないことは言語道断ですが、そもそも仕様書通りに動かすことが難しかったりする場合は1か2に戻ります。**決して、仕様書通りに動かせないからといって自分で仕様を変更してはいけません**

コードは疎結合性を守り、必ずテストを実行してください。テストが用意されていない場合は、ここでテストを書きます

## 4. コードが完成したら複数の他人にコードレビューをしてもらう
このプロセスによって**属人化を完全に排除**します。レビュワーはコーディング規約はもちろん、疎結合性および仕様書との適合性について検証をする必要があります

もちろん、完成前にレビューをしてもらっても構いません
Android 上でのボタン連打禁止 (Delphi)

アプリでボタンの連打を禁止する方法として、ぱっと考え付くのが Button を一定時間 Disable にする、たとえば

```delphi
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Enabled := False;
  Sleep(1000);
  Button1.Enabled := True;
end;
```
こんな処理です。が、この場合連打したキーはプールされていて実行されてしまうのです。
うーん簡単な方法で、できないかなー...
OnClick イベント自体を破棄するような方法でないと...
で、考えてみた...HitTest プロパティが使えるのではないかと...
そして Sleepではなく Timer を使うと良いのではないかと...

##その結果
TTimer の Interval プロパティに連打を受け付けない時間をセットして、Enabled を False にする
Timer の OnTimer で

```delphi
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // 復活の呪文
  Button1.Enabled := True;
  Button1.HitTest := True;
  Timer1.Enabled := False;  // Timer停止
end;
```

Button の OnClick 側は

```delphi
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.HitTest := False;
  Button1.Enabled := False;
  Timer1.Enabled := True; // Timer始動
end;
```

としてみたところ、一応希望していた感じにはなりました。
無名メソッドとか使うとよさげな気もするのですが、OnClick の中で待ちに入ると連打分がプールされる気がする
他にあればおせーて (^^;;;
tmuxの基本的な使い方

## tmuxとは
[tmux](https://github.com/tmux/tmux) とはターミナルマルチプレクサと呼ばれる仮想端末マネージャーです。画面を分割したり、複数画面を開いたり、ターミナル操作の効率性があたります。本記事は自分用のメモとしてまとめます。

## 基本
* 設定ファイルは `~/.tmux.conf`
    * 新規セッション時に読み込まれる
* プロセス構成
    * tmux にはサーバーとクライアントがある
    * サーバー
        * tmux セッションを管理しているプロセス
    * クライアント
        * tmux セッションに接続しているプロセス
* 画面要素
    * セッション(Session)
    * ウィンドウ(Window)
    * ペイン(Pane)
* 基本操作
    * `prefix + ?` 

## 基本操作

### 起動

```
$ tmux
```

### セッションの確認

```shell-session
$ tmux ls
```

### セッションのデタッチ
tmux が抜ける時に使う

```shell-session
$ prefix + d
```

### セッションのアタッチ

```shell-session
# 直近のセッションにアタッチされる
$ tmux attach
or
# attachの省略形
$ tmux a
or
# tmux lsで表示されたセッション番号を指定する
$ tmux attach -t 0
````

### セッションの削除

```shell-session
$ tmux kill-session
or
# 全てを削除するなら
$ tmux kill-server
```

### ウィンドウ操作

新規ウィンドウ作成

```shell-session
$ prefix + c
```

次のウィンドウに移動

```shell-session
$ prefix + n
```

前のウィンドウに移動

```shell-session
$ prefix + p
```

ウィンドウ一覧を表示、選択後ウィンドウの移動

```shell-session
$ prefix + w
```

ウィンドウの削除

```shell-session
$ prefix + &
```

### ペイン操作

水平分割

```shell-session
$ prefix + "
```

垂直分割

```shell-session
$ prefix + %
```

ペインの移動

```shell-session
$ prefix + o
```

ペインの削除

```shell-session
$ prefix + x
```
angular-seedにおける開発環境/本番環境での値の使い分けについて

## Development環境やProduction環境で、使用する値を使い分けたい

Development環境で使用する値を設定したい場合は、`tools/env/dev.ts`を使用。Production環境の場合は、`tools/env/prod.td`を使用（厳密に言うと、ファイル名は何でも良い）。

ファイルを開き以下のように記述。以下は`dev.ts`の場合。

```ts
import { EnvConfig } from './env-config.interface';
 
const DevConfig: EnvConfig = {
  ENV: 'DEV',
  API: 'example.com/api',
  VERSION: 'v1',
};
 
export = DevConfig;
```
## 実際の使用方法

値を使い分けたいファイルを開き、`src/client/app/shared/config/env.config.ts`を読み込む。これでOK。

```ts
import { Config } from '../config/env.config';

private api: string = Config.API; // => Dev環境だと'example.com/api'が代入される
private version: string = Config.VERSION; // => Dev環境だと'v1'が代入される
```

仕組みとしては、`dev.ts`や`prod.ts`がこのファイルに読み込まれて、共通した記述でDev環境/Prod環境での値の使い分けができるようになっている。

`env.config.ts`の中身は以下のような感じになっている。

```ts
import { EnvConfig } from '../../../../../tools/env/env-config.interface';

export const Config: EnvConfig = JSON.parse('<%= ENV_CONFIG %>');
```

## Dev環境として実行

Dev環境として実行するときは、以下のオプションを指定してコマンドを実行。オプションの引数としてファイル名を指定して実行することで、そのファイル名に設定した値が使われるようになる。

```
npm start -- --env-config dev
```

## 参考

- https://github.com/mgechev/angular-seed/wiki/Configuration-(environment)
Emacs で複数ファイルの置換

[Emacsで拡張を使わず複数ファイルの複数行に渡る置換を行う](https://qiita.com/takc923/items/1d65622ed82697d00f6a)

これがすごく便利。Java の package の書き換えとかで救われた。。。
しょっちゅう忘れるので、コマンドだけ

```
M-x find-dired
Run find in directory: /path/to/dir/
Run find (with args): -type f

ファイル選択(*s で全選択)

Q
置換前の文字
置換後の文字
```
ハイパーコンバージドについて

最近、インフラの多様化に伴いハイパーコンバージドという新しい製品ができたので、自分用にメモを残す。

# 1.ハイパーコンバージド[^1]ってなんだ？
富士通さんの製品説明が理解しやすいので、それを元にする。

> 一般的なx86サーバにコンピューティング機能とストレージ機能を統合し、シンプルな構成を実現した仮想化基盤のこと
> http://www.fujitsu.com/jp/products/computing/virtual/tech/term/hci/index.html

## コンピューティング機能とストレージ機能の統合のメリット
コンピューティング機能とストレージ機能が1つのハードウェアに統合されることによってどんなメリットが生まれるか？

+ コンピューティング機能とストレージ機能を提供するハードウェアベンダーが統合されることによってシステムの管理を行うソフトウェアが統合される(Software Defined Storageの適用)。
+ ハードウェアベンダーソフトウェアによる管理が一本化されることによって自動運用化(オーケストレーション)ツールによる運用を導入しやすくなる。
+ 機能増設は(基本的に)スケールアウトのみ。拡張できる機能が単純だから計画も立てやすい[^2]。
+ スケールアウトするときはHCIが参加するネットワークに接続できるGbEケーブルを付け足すだけ[^3]。

### Software Defined Storageって？
Software Defined Storageについて"ピンとくる回答"をしてくれるものがなかったので概念をざっくりまとめているmynaviさんから紹介。

> ITインフラ全体をソフトウエアで制御できる仕組みを提供することで、ネットワークやストレージ専任の技術者ではないアプリケーション開発者やIT利用者が、必要な時に簡単にかつ迅速にITインフラリソース(CPU,ネットワーク,ストレージ)を手に入れる世界を実現する。「Software Defined xxx」はこれをゴールとする。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/184939/5aa9fb39-51ad-fbf9-d39a-801625775aab.png)
>
> 簡略化すると「ストレージ全体をソフトウェアで制御できる仕組みを提供し、専任者でなくても必要なストレージ領域を手に入れるシステムを提供すること」と言い換えられるかも...。
> 出典元:http://news.mynavi.jp/series/emcsds/001/

近年の「仮想化」に変わる新しいマーケット流行語として「software Defined xxx」を広めたいのかなーと邪推してたりする。

## HCIのメリットを生かすには？
1.機器間の調整事項をなるべく行わせないため、"タイトすぎない構成にする"こと
2.自動化ツールで運用できる体制をつくること
3.外部機能と連携させる際はやり方に注意[^4]
4.devopsではないが、インフラを各部門がIT管理部門に申請するだけで用意される仕組みとある程度の増強を見込んだ予算割が必要。

# 注釈
[^1]: ハイパーコンバージドインフラ(HCI)ともいう。
[^2]: 必要なサイズのHCIを提供する製品を購入し、追加していくだけなので拡張しやすい。もし注意するとすればファームウェアの更新をなるべく実施しやすい構成にすること。
[^3]: もちろん、事前のネットワークセグメンテーションは正しく行われている前提である。
[^4]: 極端な意見かもしれないが「外部機能連携するとHCIのメリットは失われる」ので、「できること≠機能特性を生かすこと」になることを注意して。詳細な機能連携をさせる場合、HCIが最適解になるとは限らない。どう使いたいか、何をさせたいかを明確に。
PHPフレームワーク Laravel その1

#php Laravel
PHP歴は長いものの、オレオレ手法ばかりでしたが
（MVC&オブジェクト指向をゴリゴリ書く）
訳があってフレームワークを勉強中
※環境構築やlaravel環境構築は先駆者様達を参考に

#環境
windwos vagrant centos6.9 apache php7 mysql5.6.37
###centos
```ruby:command
$ more /etc/redhat-release
CentOS release 6.9 (Final)
```
###apache
```ruby:command
$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Aug 15 2017 19:44:58
```
###php
```ruby:command
$ php -v
PHP 7.1.8 (cli) (built: Aug  2 2017 14:25:25) ( NTS )
Copyright (c) 1997-2017 The PHP Group
```
###mysql
```ruby:command
$ mysql -v
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.37 MySQL Community Server (GPL)
```
#project 作成(webapp000とす
```ruby:command
$ ./composer.phar create-project laravel/laravel /var/www/html/webapp000
```

##確認
```ruby:command
$ cd /var/www/html/webapp000/
$ ll
total 204
drwxrwxr-x  6 vagrant vagrant   4096 Aug 30 18:55 app
-rwxr-xr-x  1 vagrant vagrant   1686 Aug 30 18:55 artisan
drwxrwxr-x  3 vagrant vagrant   4096 Aug 30 18:55 bootstrap
-rw-rw-r--  1 vagrant vagrant   1380 Aug 30 18:55 composer.json
-rw-rw-r--  1 vagrant vagrant 138828 Oct 22 16:43 composer.lock
drwxrwxr-x  2 vagrant vagrant   4096 Aug 30 18:55 config
drwxrwxr-x  5 vagrant vagrant   4096 Aug 30 18:55 database
-rw-rw-r--  1 vagrant vagrant   1129 Aug 30 18:55 package.json
-rw-rw-r--  1 vagrant vagrant   1040 Aug 30 18:55 phpunit.xml
drwxrwxr-x  4 vagrant vagrant   4096 Aug 30 18:55 public
-rw-rw-r--  1 vagrant vagrant   3491 Aug 30 18:55 readme.md
drwxrwxr-x  5 vagrant vagrant   4096 Aug 30 18:55 resources
drwxrwxr-x  2 vagrant vagrant   4096 Aug 30 18:55 routes
-rw-rw-r--  1 vagrant vagrant    563 Aug 30 18:55 server.php
drwxrwxr-x  5 vagrant vagrant   4096 Aug 30 18:55 storage
drwxrwxr-x  4 vagrant vagrant   4096 Aug 30 18:55 tests
drwxrwxr-x 36 vagrant vagrant   4096 Oct 22 16:43 vendor
-rw-rw-r--  1 vagrant vagrant    549 Aug 30 18:55 webpack.mix.js
```
なんかワサワサできてる

> ブラウザで http://{vagrantSV IP}/webapp000/public/ にアクセス
>>"The stream or file "/var/www/html/webapp000/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied"
>>>vagrantでproject作成したのでオーナーがvagrant
apacheは…
apache    1680  0.0  0.6 334188 13856 ?        S    16:28   0:00 /usr/sbin/httpd
apacheで動かしてるので

##書き込み権限
```ruby:command
$ cd storage/
$ ll
total 12
drwxrwxr-x 3 vagrant vagrant 4096 Aug 30 18:55 app
drwxrwxr-x 6 vagrant vagrant 4096 Aug 30 18:55 framework
drwxrwxr-x 2 vagrant vagrant 4096 Aug 30 18:55 logs
$ chmod -R 777 logs/
```

> 再度ブラウザで http://{vagrantSV IP}/webapp000/public/ にアクセス
>> file_put_contents(/var/www/html/webapp000/storage/framework/sessions/odS4tBslQQJXMKkSW9FknIbdUg9zNVVtnRk0HbDe): failed to open stream: Permission denied"
>>> ふーん、、、、

##こっちも
```ruby:command
$ chmod -R 777 /framework/
```

http://{vagrantSV IP}/webapp000/public/

これでlaravelのwelcome(sample)画面が表示されるはずです

とりあえずここまで。:frowning2:
API Connectの開発者ポータル(Drupal)をカスタマイズしてみよう！パート２

　前回はポータルのデザイン（テーマ）の変更をご紹介させていただきました。
https://qiita.com/osonoi/items/7b7bb77e491a23faf1f6

　さて今回は昨日追加、DrupalではModule、モジュールを追加することで簡単に機能アップすることができます。例えばこんなモジュールが公開されています。
 　Views とてもポピュラーなモジュールです。一覧ページ、一覧ブロックなどを作れます。
 　Panels 画像や動画、コンテンツなどを自由自在に配置できます。
 　Backup and Migrate  バックアップや環境移行のツールです。
 　Rules  自動化処理を設定できます。
 　Webform オンラインフォームを作成するツールです。アンケートも簡単に取れます。
 　Google Analytics  Google Analyticsのコードを全ページに入れてくれるモジュールです。
 　Share this  ソーシャルメディアとの連携、コンテンツを簡単にシェアできます。
 　Mautic  マーケティングオートメーションツールのMauticとの連携ができます。

 さて今回は試しにGoogle Analyticsのモジュールを入れて見ます。
ちなみにGoogle Analyticsを使えばウェブサイトのアクセス状況を調べることができます。API ConnectにもAPIのアクセス状況は見ることができるかとは思いますがページ全体にどれぐらいの人が見に来ているのかどんな地域から、どんなデバイスでどんな時間帯に来ているのかといったことは見えないかと思います。Google Analyticsを使えばそれらも簡単に見ることができます。（無料で）以下がその画面です。
![スクリーンショット 2017-10-23 12.23.40.png](https://qiita-image-store.s3.amazonaws.com/0/59741/ff80a7f6-8d7e-d4c7-b243-bb5db62c8aec.png)

手順は以下のようになります。
1. Google AnalyticsのTracking IDを取得
2. Google Analytics moduleのURLを取得
3. ポータル画面に設定（Moduleを追加Tracking IDを設定）

さて先ずはGoogle Analytics側の設定です。
https://www.google.com/intl/ja_jp/analytics/
新しいウェブサイトの解析をするためにアカウントを作成、Tracking IDを取得してください。
トラッキングIDはUA-*******とUA-の後に数字とアルファベットが入るような文字列です。

次にModuleの準備です。こちらのページにModuleの詳細があります。
https://www.drupal.org/project/google_analytics
API ConnectのDrupalはバージョン7なので７用のリンク先をコピーします（後ほど使います）
![スクリーンショット 2017-10-23 12.36.31.png](https://qiita-image-store.s3.amazonaws.com/0/59741/90cda8e2-5760-7a19-483d-a05cefcf76d7.png)

次にポータル側の準備です。ポータルから”モジュール”--> ”新しいモジュールをインストール”を選んでください。
![スクリーンショット 2017-10-23 12.40.20.png](https://qiita-image-store.s3.amazonaws.com/0/59741/63ad25d9-27eb-9938-4fc7-2cb4da28044f.png)

次のURLからインストールするのところに先ほどコピーしたURLを貼り付けてください。
![スクリーンショット 2017-10-23 12.41.52.png](https://qiita-image-store.s3.amazonaws.com/0/59741/e093e1bf-1c50-127b-7d59-70a647f8c4eb.png)
インストールをクリックすればインストールが始まります。
終了したら先ほどのTracking IDを設定してください。
メニューから”モジュール”をクリックしてください。
![スクリーンショット 2017-10-23 12.43.53.png](https://qiita-image-store.s3.amazonaws.com/0/59741/26d0ba5b-bfe0-2768-2158-ffa4211e6cea.png)

左側のメニューから”統計”を選んでください。
![スクリーンショット 2017-10-23 12.49.02.png](https://qiita-image-store.s3.amazonaws.com/0/59741/ce75635b-78be-a24d-381d-991319171260.png)

右側にGoogle Analyticsが出て来て有効になっているのを確認したら右のメニューから設定をクリックしてください。
![スクリーンショット 2017-10-23 12.50.00.png](https://qiita-image-store.s3.amazonaws.com/0/59741/b913b48b-83ae-6ae1-c807-561ca164487a.png)
一番最初のステップで取得したTracking IDを入力してください。
![スクリーンショット 2017-10-23 12.51.55.png](https://qiita-image-store.s3.amazonaws.com/0/59741/7c026270-9016-c3bb-3388-1a2a6d48b530.png)

以上です。Google Analyticsではリアルタイムでアクセス状況も観れるのでそれで本当に設置がうまくいっているか確認してください。
![スクリーンショット 2017-10-23 12.54.05.png](https://qiita-image-store.s3.amazonaws.com/0/59741/b3f4d974-1b50-d8b9-72f9-e86bab21f6f8.png)
キーボードが効きにくい問題解明

先日、Macキーボードのあるキー「G」が効きにくなりまして、強く押さないと、入力できませんでした。

結局、修理になりました。

修理のきかっけで代わりに別のMacを使うことになりました。

ある日、また突然キー「B」が同じ現象が生じました。
突然、自分が悪いではないかと感じました。
Osのアップデートをいつも無視してたのが原因ではないかと思いまして、OSアップデートを行いました。

更新後のOSバージョン：macOS Sierra v10.12.6。

更新したら、何とかキーボード問題がなくなりました。

ハードの問題だと思ったが、結局ソフトウエアの絡みですね。不思議ですね。
Unityでシングルトン


## シングルトンとは?

__そのクラスのインスタンスが必ず1つであることを保証するデザインパターン__

"○○○Manager"などのクラスを作成し、データの保存・管理に利用されることが多い

- 呼び出しが楽
- メンテナンスが楽


## 実例

Unityチュートリアルの[サバイバルシューター](https://unity3d.com/jp/learn/tutorials/projects/survival-shooter-tutorial)のスコアをシングルトンで管理する。

シングルトンクラスの作成

```c:EventManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EventManager : MonoBehaviour {

    private static EventManager mInstance;
    private int num = 0;

    public static EventManager Instance {
        get {
            if( mInstance == null ) {
                GameObject obj = new GameObject("EventManager");
                mInstance = obj.AddComponent<EventManager>();
            }
            return mInstance;
        }
        set {

        }
    }

    public void setScore( int n ) {
        this.num = n;
    }
    public int getScore() {
        return this.num;
    }

}
```

使ってみる

スコアが更新されたら新しいスコアをsetする

```c:EnemyHealth.cs
EventManager eventManager;

void Awake ()
{
    eventManager = EventManager.Instance;
}

public void StartSinking ()
{
    var currentScore = eventManager.getScore();
    currentScore += scoreValue;
    eventManager.setScore(currentScore);
}
```

ScoreManagerの中でスコアをgetする

```c:ScoreManager.cs
EventManager eventManager;

void Awake ()
{
    eventManager = EventManager.Instance;
}

void Update()
{
    score = eventManager.getScore();
}
```


> 参考
[Unityでよく使うデザインパターン](http://techblog.kayac.com/unity_advent_calendar_2016_9)
GitHub Pages にホスティングしたTypeDocが404になる

GitHub Pagesは、 `_`で始まるファイルが表示されない。これはGitHubの仕様である模様。

TypoeDocは `module` ディレクトリ以下に `_` で挟まれたHTMLファイルを生成する。そのまま、GitHub Pagesにホスティングしてしまうと404になってしまう。
これらのファイルを表示するためには、ドキュメントのルートに（ `docs` 下をGitHubPagesで公開していたら `docs` ディレクトリ直下）`.nojekyll` ファイルを設置すればよい。

```bash
touch .nojekyll
```

## References
- [Files that start with an underscore are missing](https://help.github.com/articles/files-that-start-with-an-underscore-are-missing/)
- [All documentation has &quot;_&quot; as a prefix: This prevents typedocs from being served in gh-pages. · Issue #149 · TypeStrong/typedoc · GitHub](https://github.com/TypeStrong/typedoc/issues/149)
rubyでfizzbuzz問題



rubyの勉強のために。
一応3と5以外も指定できるようにメソッドで。
ツッコミどころありましたらお願いします。

```ruby
def fizz_buzz(inp, fi=3, bu=5)
  fizz = (inp % fi).zero?
  buzz = (inp % bu).zero?
  if fizz && buzz
    'FizzBuzz'
  elsif fizz
    'Fizz'
  elsif buzz
    'Buzz'
  else
    inp
  end
end

max_num = 30

(1..max_num).each do |num|
  puts fizz_buzz(num)
end

# 1
# 2
# Fizz
# 4
# Buzz
# Fizz
# 7
# 8
# Fizz
# Buzz
# 11
# Fizz
# 13
# 14
# FizzBuzz
# 16
# 17
# Fizz
# 19
# Buzz
# Fizz
# 22
# 23
# Fizz
# Buzz
# 26
# Fizz
# 28
# 29
# FizzBuzz


```

一応テストも。

```ruby
require 'minitest/autorun'

class TestFizzBuzz < Minitest::Test
  def test_fizz_buzz
    assert_equal '1', fizz_buzz(1)
    assert_equal '2', fizz_buzz(2)
    assert_equal 'Fizz', fizz_buzz(3)
    assert_equal '4', fizz_buzz(4)
    assert_equal 'Buzz', fizz_buzz(5)
    assert_equal 'FizzBuzz', fizz_buzz(15)
  end
end
```
typedocで 「no such file or directory, stat」 というエラーが出る

`typedoc` でドキュメントを生成しようとすると以下のようなエラーが出るようになってしまった。

```
❯ yarn docs
yarn docs v0.27.5
$ typedoc --theme default --out docs src

Using TypeScript 2.4.1 from /Users/yoshiki_aoki/work/src/.../node_modules/typescript/libfs.js:954
  binding.stat(pathModule._makeLong(path));
          ^
Error: ENOENT: no such file or directory, stat '/Users/yoshiki_aoki/work/src/.../node_modules/typedoc-default-themes/bin/default/assets'
```

試しに全部`node_module`消してキャッシュもクリーンしてインストールし直してみた。

```bash
yarn cache clean
yarn
```

`yarn`でインストールし直してもダメ。lsで該当ファイルを確認してもない。。。
ふと、`npm`を使ってインストールしてみた。 **`npm install` したら治った。** 🤔

## .yarnclean が原因

色々と調べてみるとどうやら、`yarn clean` を実行して作成された`.yarnclean`が原因っぽいということがわかった。
確かに中を覗いてみると、`assets`という項目がある。これによって、`node_modules`内の`assets`が削除されている模様。

>node_modules ディレクトリからもはや要らないファイルを消し、 .yarnclean というファイル（要バージョンコントロール）を吐き出すようです。
><cite>http://qiita.com/knjname/items/0cc813622e0121c05723#clean</cite>

そして、最新バージョン（1.0.0以降）では`yarn clean` から`yarn autoclean`になっている。

- [rename clean to autoclean, add tests by rally25rs · Pull Request #4252 · yarnpkg/yarn · GitHub](https://github.com/yarnpkg/yarn/pull/4252)

ローカルで使っていたバージョンが `v0.27.5` なのでアップグレードした。
Skype for Linuxをパッケージマネージャから入れる

Linux版Skypeの[公式ダウンロードサイト](https://www.skype.com/ja/download-skype/skype-for-linux/)には、DEBとRPMのファイルがそのまま置かれているだけでした。
これだとSynaptic等のパッケージマネージャで自動更新できないと思われるので、ソースリストに追加して云々の手順を調べました。

手元の環境はLinux Mint 18.2ですが、Ubuntuでも同じ手順で使えるはずです。

## 手順

### 1. Skypeのリポジトリから公開鍵を入手し、APTに取り込ませる。

```
$ curl https://repo.skype.com/data/SKYPE-GPG-KEY | sudo apt-key add -
```

### 2. Skypeのリポジトリをソースリストに追加する

```
$ sudo vim /etc/apt/sources.list.d/skype-stable.list
```

以下、ファイルの中身。

``` skype-stable.list
deb [arch=amd64] https://repo.skype.com/deb stable main
```

### 3. パッケージリストを更新

```
$ sudo apt-get update
```

これで``apt``やSynapticでSkypeがインストールできるはず。


## 疑問点

何度かこんな手順で公式リポジトリ外のソフトを入れてるけど、標準化されたやり方があったりするのかな？
特に公開鍵やリポジトリのURLが分からないとどうしようもないので、都度調べることになって面倒くさい。
[Drupal7]コンテンツページにタクソノミー関連コンテンツを表示する

#コンテンツページに関連記事を表示する覚書
ページのサイドに関連記事を表示する。Views,Blockモジュールを使用。

##Views
1) + Add new view
2) View name [Related Contents] -> Create a page : off / Create a block : on -> Continue & edit
3) Block Settings
Display name [Related Contents Block]
PAGER Use pager : Display all items | All items

4) Advanced/CONTEXTUAL FILTERS Add -> コンテンツ: Has taxonomy term ID
WHEN THE FILTER VALUE IS NOT AVAILABLE
・Provide default value:type / Taxonomy term ID from URL
以下画像参照
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135373/5a5ec535-e1c7-6fbe-641f-223a2c2f41cf.png)

※複数のタクソノミーを選択する場合、[Reduce duplicates]と[Allow multiple values]オプションをチェック

4) Current（表示中のページ）をリストから除外する
Advanced/CONTEXTUAL FILTERS Add -> コンテンツ: Nid
WHEN THE FILTER VALUE IS NOT AVAILABLE
・Provide default value:type / Content ID from URL
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135373/8392c41f-bc5d-3454-4069-3ea39119d0dd.png)
一番下の「続き」の中にある[Exclude]オプションをチェック

##Block
1) 関連コンテンツを表示したいブロックに [View: Related contents: Related Contents Block]を選択
C++ Builder XE4, 10.2 Tokyo > StrToIntDef > try, catchは不要?

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

StrToIntDef()をtry, catchするかどうか。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int val;

	try {
		val = StrToInt(L"");
	} catch (Exception &exc) {
		String msg = L"Line24: " + exc.Message;
		OutputDebugString(msg.c_str());
	}

	try {
		val = StrToIntDef(L"", -1);
	} catch (Exception &exc) {
		String msg = L"Line31: " + exc.Message;
		OutputDebugString(msg.c_str());
	}
}
//---------------------------------------------------------------------------
```

```txt:run
デバッグ出力: Line24: '' は整数ではありません プロセス Project1.exe (3984)
```

http://docwiki.embarcadero.com/Libraries/XE4/ja/System.SysUtils.StrToInt
> StrToInt 関数は，10 進または 16 進表記の整数型の数値を表す文字列 S を数値に変換します。S が有効な数値を表していない場合，**StrToInt は EConvertError 例外を生成します**。

http://docwiki.embarcadero.com/Libraries/XE4/ja/System.SysUtils.StrToIntDef
> StrToIntDef 関数は，10 進または 16 進表記の整数型の数値を表す文字列 S を数値に変換します。S が有効な数値を表していない場合，**StrToIntDef は Default を返します**。

StrToIntDef()に関しては、try, catchをする意味はない、という認識を持った。
railsのlink_toが作動しない時の対処法

link_toでmethodを指定してもうまく作動してくれない。
# 原因
参考にしたもの↓
https://qiita.com/y-temp4/items/2d50feb3ff0d65acdf67
曰くjQueryを読み込む順番がおかしいみたい。

# 解決策
下の順番の通り記述してあげるだけ

//= require jquery
//= require jquery_ujs