OmniAICreator/Qiita-1.07M huggingface dataset:
エラー: No devel block is defined for macvim (Mac)

## vimのインストール中にエラーが出た(Mac)
``` No devel block is defined for macvim ```

## 手順
```
$ brew update
$ brew install lua
$ brew install macvim --devel --with-lua
```
3つ目のとこでエラー

## 解決策
```
$ brew install vim --with-lua
```
devel不要で通りました。

解決。
Docker + Git SubModule でマルチプラットフォームな環境配布


# 開発環境を配布する際によくやる方法をメモがてら。（なんでこうなってるのかの説明をこれで理解してもらえたら的な。）

## やりたきこと

- 開発環境についてもGitで管理したい。
- ドキュメントもGitで管理したい。
- ソースのリポジトリにドキュメントや環境周りを持ちたくない。（リリース時に不必要。）
- ソース・ドキュメント・環境が連動した形で管理したい
- Mac・Win　プラットフォームを選ばずに簡単に環境を作れるようにしたい。

## 採用した方法
上記を実現させるために利用したのが「git Submodule」
親Projectを作り、各リポジトリを包括管理させることで主要コミットを連動して管理できるようにした。
また、環境に関してもDockerを利用することでローカル環境のMac・Windowsともに動かすことができ
サーバーでの結合環境までも同じ環境で確認が可能になる。

```
Project（親：リポジトリ）
	┣ ソース（子：サブモジュール）
	┣ ドキュメント（子：サブモジュール）
	┣ 環境（子：サブモジュール）
```

リリースや、デプロイの度に、親リポジトリ（Project）をCommit していく。
イメージ的には、バージョニングやGitのタグを追加するのと同じようにコミットしていく形になる。    

環境部分では、Docker + docker-compose を利用して、開発環境を作成した。
親Projectから各サブモジュールを配置していれば、Dockerでマウントするディレクトリ等は
Pathがずれたりすることもなく、docker-compose up -d , docker-compose start などのコマンド一つで
環境の構築・環境を起動することができる。

下記はdocker-compose.yml のイメージ
docker 単体でつかうよりもこちらを利用することで起動オプション、設定値など様々な値がファイルで管理できる。

```Project/環境/docker-compose.yml
services:

    db:
        image: mysql:5.6
        container_name: db
        hostname: db
        env_file: ./db/.env
        ports:
            - "3306:3306"
    web:
        build: ./web/
        container_name: web
        hostname: web
        volumes:
            - ../ソース:/mnt/contents/web/
        ports:
            - "80:80"
            - "443:443"
        links:
            - db

```

※ Mount するボリュームを相対パスで記述

```
        volumes:
            - ../ソース:/mnt/contents/web/
```


## メリデメ

- Git Submodule の理解・利用についての学習コストが発生する。(デメリット)
- 運用手順が　Git Submodule　の分だけ増えてしまう。(デメリット)
- 影響調査や障害の調査で、以前のバージョンの環境・ドキュメント・ソースが簡単にロールバックが可能(メリット)
- 各プロジェクト配下は、確実にメンバー同じ構成になっている(メリット)
- Dockerを利用することで構成管理的なものがGitで行える。(メリット)
- Docker-Compose を利用することで、細かいサーバー設定がGitで管理できる。(メリット)

## 今後の展開

- 本番環境もDockerによる運用を行い、Deployはコンテナのデプロイを行える環境構築をすすめる。
FranzにPluginsを導入してより便利に！github/bitbucket/trelloも使える

Slack・Chatworks・Twitterなど一元管理できるFranz。
Pluginを導入することで対応サービスが激増してさらに便利になります。

Airdroid/Evernote/aws/bitbucket/box/github/
googlecalendar/googlekeep/iCloud/instagram/
office365/trello/wunderlist
上記は対応するプラグインの一部です。

# TL;DR
Franzの導入・詳細は以前書いたこちらの記事をご覧下さい。
 [Slack・ChatWork・Messsngerほぼ何でも一元管理できる「Franz」が超便利！]
(https://qiita.com/hmcGit/items/ea442beeb1b83b949dc1)

Pluginは以下からDLして、FranzのPluginフォルダに格納するだけです。
[https://github.com/meetfranz/plugins-legacy](https://github.com/meetfranz/plugins-legacy)

Airdroid/Evernote/aws/bitbucket/box/github/googlecalendar/googlekeep/iCloud/instagram/office365/trello/wunderlist
これらは対応するサービスの一部です。

私のFranz画面です。Slack×4、Chatwork、bitbucket、github、trello、Keep、Twitterとなっています。
![frantz.png](https://qiita-image-store.s3.amazonaws.com/0/69972/c9e928aa-2cff-d617-43bc-0a2e28ebf710.png)



# インストール方法
Franz4.0.4で動作確認をしています。

- Pluginをダウンロードする

[https://github.com/meetfranz/plugins-legacy](https://github.com/meetfranz/plugins-legacy)からダウンロードします

- FranzのPluginフォルダに格納する

設定→Open the Franz plugin directorで対象のフォルダが開くので、利用したいプラグインのフォルダを格納するだけです。
![frantz2.png](https://qiita-image-store.s3.amazonaws.com/0/69972/6efb07f2-6479-50e9-cb5e-ddd398215de4.png)


# 参考
2017/10/18現在、Franzのベータバージョン5が公開されました。
これによりFranz4のPluginはlegacy扱いになったようです。
また、Franz5ではrecipeという名前になるようです。
まだ対応しているサービスが少ないので対応するまでは様子見をしても良いかもしれません。

Franz
- [http://meetfranz.com/](http://meetfranz.com/)

Plugin
- [https://github.com/meetfranz/plugins-legacy](https://github.com/meetfranz/plugins-legacy)

Pluginはベータと記載されているので動作が安定しないこともありそうです。
'scipy' is not a package ― pyファイルの名前には気をつけようという話

「パッケージの名前でpyファイルを作ってはいけないよ」という話
とっても初歩的なことを久しぶりにやらかした。

```python
ModuleNotFoundError: No module named 'scipy.ndimage'; 'scipy' is not a package
```
久しぶりにscipyで遊ぼうと思ったら上記エラー。
はてと思いファイル名を見直したらscipy.pyでファイルを保存していた。

そう、パッケージの名前でpyファイルを作ってはいけません。

https://stackoverflow.com/questions/40469734/import-scipy-stats-error
laravel optimizeでsegmentation faultする

# 概要

- laravelアプリケーションのトップディレクトリでcomposer installをしたところ、signal 11が返ってきた。
- postUpdateコマンドの`php artisan optimize` でsegmentation faultしていた。

# 環境

- php5.6.30
- laravel5.3.30

# 解決

- `.env` がなかったことによるものだった
- APP_で始まる設定を `.env` に記載することで解決した。
【Swift】Swiftを使ってハノイの塔のプログラム作成してみた

最近、気温の差が大きく、着る服に悩んでいますTOSHです...

今回は、Swiftでハノイの塔のプログラムを描いてみようと思い、書いてみることにしました！
ハノイの塔のプログラムは、再帰の考えを用いたとてもシンプルなものなのですが、再帰を使っているぶん、コードを読んで、何が起こっているのかを理解するのは、意外と難しいです!!!

#ハノイの塔とは
・三本の杭と、任意の枚数の円盤位よって構成される。
・はじめ、円盤は、全て、左端に下から大きい順に並べられてある
・一回に一枚動かすことができ、左端から、別の食いへと動かすことができれば成功
・ただし、小さい円盤の上に、大きな円盤を置くことはできない
・2^n - 1の手順で動かすことができる

#ハノイの塔のプログラム

```Swift:ViewController.swift
class ViewController: UIViewController {
    var number: Int = 3
    var total: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        
        hanoi(num: number, from: "Left", dst: "Center", work: "Right")
        
        print("Total is \(total)!")
    }
    
    func hanoi(num:Int, from: String, dst: String, work: String){
        if num > 0{
//          この文を①とする
            hanoi(num: num - 1, from: from, dst: work, work: dst)
            printer(b: from, c: dst)
//　　　　　　　　　　　　　　　　　　　　この文を②とする
            hanoi(num: num - 1, from: work, dst: dst, work: from)
        }
        
    }
    
    func printer(b: String, c: String){
        total = total + 1
        print("\(total): 棒", b, "から棒", c,"へ移動")
        
    }
}
```

#実行結果
![スクリーンショット 2017-10-13 16.19.40.png](https://qiita-image-store.s3.amazonaws.com/0/180994/bdf73fb5-b42c-4236-bef2-e004c7dc7e91.png)

#解説
一言で言えば、再帰を使っているのは明白なのですが再帰を使うとなぜプログラムができるのかというのを苦労するのにとても苦労しました。
理解する上で、参考にしたサイトをここに載せておきます。 [here!](http://www13.plala.or.jp/kymats/study/C++/Hanoi/Hanoi.html)
円盤が三本の時について考えてみましょう。
まず、最初のこの状態から![1.png](https://qiita-image-store.s3.amazonaws.com/0/180994/62d1da40-2213-4a00-dfbe-eca3ec19f109.png)
この状態へ変化させるためには、
![５.png](https://qiita-image-store.s3.amazonaws.com/0/180994/d141978f-3a7b-767c-de1b-09896d508896.png)
必ずこの状態を経由しなければなりません。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/180994/60550573-1b80-586f-6db2-0b1f173f56f7.png)
そして、今Aにある一番大きな円盤がCに移動した時、一番大きな円盤を無視でき、残るはn-1枚(この場合は2枚)の円盤を一番大きな円盤が刺さっている（つまりC）へ動かせばいいと考えることができる。つまりこの時n枚の円盤の移動問題はn-1枚に変わったと考えることができる。これを繰り返していくことで、ハノイの塔は解くことができる。
うーん、ややこしい笑
うまく書けていない気がするので、もっと理解が深まったら随時更新していく予定です...



#サンプロプログラム
[Tower of Hanoi](https://github.com/tosh7/HanoiTower)
Cognos Analytics をWindowsサーバーに導入した際のウィルススキャンS/W設定

#概要
Cognos Analytics をWindowsサーバー上に実装する場合に、ウィルススキャンS/Wの対象とすべきファイル・フォルダに関する情報です。

Virus ScanのS/Wをただ入れるだけで、そのままでOKとしている環境は無いでしょうか。
Virus Scanの対象外にしなければいけないフォルダは、一番下のリンクにあるようにしっかりとガイドされていますので、ガイドに従って除外設定するようお願いします。

また、Cognos BIに関しては、以下の投稿をご参照下さい。
**Cognos BI をWindowsサーバーに導入した際のウィルススキャンS/W設定**
https://qiita.com/shinyama/items/28e428e833a9ea0eced8

#内容
Cognos Analyticsでのスキャン対象外の指定です。

**導入中**
Cognos Analyticsのインストール中は、スキャンは実行しないようにしてください。

**Configurationフォルダ**
\<c11_location>\configuration\
例 c:\Program Files\ibm\cognos\analytics\configuration\
以下の拡張子のファイルを除外して下さい:
\*.ini
\*.xml
\*.xsd
\*.xslt

**一時ファイル**
\<c11_location>\temp\
例 c:\Program Files\ibm\cognos\analytics\temp\
このフォルダに生成される uda* から始まる名称のファイルが除外対象となりますが、特定の拡張子ではないため、指定が難しい場合は、tempフォルダを丸ごと対象外としてください。

**bin及びbin64**
\<c11_location>\bin 及び \<c11_location>\bin64
例 c:\Program Files\ibm\cognos\analytics\bin 及び c:\Program Files\ibm\cognos\analytics\bin64
このフォルダ全体を除外対象として下さい。

**cgi-bin**
\<c11_location>/cgi-bin/
例 c:\Program Files\ibm\cognos\analytics\cgi-bin
以下のファイルを除外して下さい：
cognos.cgi
※Technoteには記載が無いですが、ISAPIでGWを構成している場合、cognosisapi.dllも除外対象となると思います。

**Transformerキューブ**
TransformerでPowerCubeを作成している場合、キューブも除外対象となります。
以下のファイルを除外して下さい：
\*.mdc

**Logファイル**
\<c11_location>\logs\
例 c:\Program Files\ibm\cognos\analytics\logs\
以下のファイルを除外して下さい：
\*.log
\*.xml
\*.lck
\*.pid
\*.service
cbs* (拡張子はありません)

**dataファイル**
\<c11_location>\data\
例 c:\Program Files\ibm\cognos\c11\data\
以下の拡張子のファイルを除外して下さい:
\*.rtm
\*.lck

#参考情報
**Which Cognos Analytics 11.x files need to be excluded from a virus scan?**
http://www-01.ibm.com/support/docview.wss?uid=swg22001916
PhantomJSを使ってみた

# PhantomJS
PhantomJSはヘッドレスなQtWebkitベースのブラウザのことらしい。
まぁ、画面のないブラウザみたいな。

#今回やったこと
- 環境はwindows
- CSVと画像ファイルを読み込んでHTML表示させたモノをスクリーンショットをとる

#流れ
以下、同じフォルダでのこと
- phantomjs.exeを格納
- batファイルを起動する（yamamow.bat）
- jsファイルが呼ばれる（yamamow.js）
- phpファイルが呼ばれる（yamamow.php）
- CSVファイルを読み込む（yamamow.csv）
- 画像ファイルを読み込む（yamamow_wedding.png）
- ブラウザで表示（見えない）
- スクリーンショットを取得（yamamow.png）

#まず、bat
```
phantomjs yamamow.js
```
# 続いて、jsの内容
以下は、yamamow.phpを読み込んで、サイズ、ズーム、画像を指定してみた。

```
var page = require('webpage').create();

// webページファイルを指定（以下はphpで）
page.open('yamamow.php', function(status) {

    console.log("Status: " + status);

    // 5000ミリ秒後にキャプチャ。
    setTimeout(function(){
        if(status === "success") {
            
            //　サイズ指定
            page.viewportSize = { width: 1920, height: 1080 }
            
            // ズームを指定
            page.zoomFactor = 2.0;
            
            // 画像を指定
            page.render('yamamow.png');

        }
        phantom.exit();
    }, 5000);
});
```
# 読み込む、CSVの中身
３列３行を用意してみた。

```
田中家、加藤家　ご結婚式,1F,結婚式会場
Gitシンポジウム,1F,大ホール
あじゃいる発表会,2F,鳳凰の間
```

# 呼ばれた、phpの内容
画像を背景右に、読み込んだCSVはdiv３つにそれぞれ設定してみた。

```
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   <meta http-equiv="content-style-type" content="text/css">
   <title>お試し</title>
   <style type="text/css">

      body
      {
　　　　background-image: url(./yamamow_wedding.png);
　　　　background-position: right center;
　　　　background-repeat: no-repeat;
　　　　background-color: skyblue;
　　　　background-size: contain;
      }

      *.floating1
      {
　　　　float: left;
　　　　height:150px;
　　　　width:300px;
　　　　background-color:royalblue;
　　　　vertical-align: middle;
　　　　border: solid 1px royalblue;
　　　　font-size: 1.5em;
       color: white;

　　　　display: -webkit-flex;
　　　　display: flex;
　　　　-webkit-align-items: center; 　　　/* 縦方向中央揃え（Safari用） */
　　　　align-items: center;　　　　　　　　/* 縦方向中央揃え */
　　　　-webkit-justify-content: center; 　/* 横方向中央揃え（Safari用） */
　　　　justify-content: center;　　　　　　/* 横方向中央揃え */
      }

      *.floating2
      {
　　　　float: left;
　　　　height:150px;
　　　　width:200px;
　　　　background-color:royalblue;
　　　　vertical-align: middle;
　　　　border: solid 1px royalblue;
       font-size: 1.5em;
       color: white;

　　　　display: -webkit-flex;
　　　　display: flex;
　　　　-webkit-align-items: center;　　　/* 縦方向中央揃え（Safari用） */
　　　　align-items: center;　　　　　　　/* 縦方向中央揃え */
　　　　-webkit-justify-content: center; /* 横方向中央揃え（Safari用） */
　　　　justify-content: center;　　　　　/* 横方向中央揃え */
      }

      *.clear
      {
　　　　clear: left;
　　　　width: 500px;
　　　　border: solid 1px skyblue;
      }
   </style>
</head>
<body>
<?php
$file = new SplFileObject("./yamamow.csv"); 
$file->setFlags(SplFileObject::READ_CSV); 
foreach ($file as $line) {
  if(!is_null($line[0])){
	echo '<div class="floating1"><p>',$line[0],'</p></div>';
	echo '<div class="floating2"><p>フロアー：',$line[1],'<br>';
	echo '会場：',$line[2],'</p></div>';
	echo '<div class="clear"></div>';
  }
} 
?>
</body>
</html>
```

#画像ファイル
試しながら適当にサイズで・・・。


#バッチ実行
DOS画面が表示され、「SUCCESS」が出ればOK

#結果
こんな感じ
![yamamow.png](https://qiita-image-store.s3.amazonaws.com/0/207568/7f43c481-5865-4c5a-3d66-e87237747730.png)
chart.js　棒グラフ　オプション色々

#chart.jsのオプションを色々使って棒グラフを描いてみる。

###サンプルコード
```html
<canvas id="canvas"></canvas>

    <script>
    var ctx = document.getElementById("canvas").getContext("2d");
    var myBar = new Chart(ctx, {
        type: 'bar',                           //◆棒グラフ
        data: {                                //◆データ
            labels: ['A','B','C','D','E'],     //ラベル名
            datasets: [{                       //データ設定
                data: [5,20,11,2,30],          //データ内容
                backgroundColor: ['#FF4444', '#4444FF', '#44BB44', '#FFFF44', '#FF44FF']   //背景色
            }]
        },
        options: {                             //◆オプション
            responsive: true,                  //グラフ自動設定
            legend: {                          //凡例設定
            	display: false                 //表示設定
           },
            title: {                           //タイトル設定
            	display: true,                 //表示設定
                fontSize: 18,                  //フォントサイズ
                text: 'タイトル'                //ラベル
            },
            scales: {                          //軸設定
            	yAxes: [{                      //y軸設定
                    display: true,             //表示設定
                    scaleLabel: {              //軸ラベル設定
                       display: true,          //表示設定
                       labelString: '縦軸ラベル',  //ラベル
                       fontSize: 18               //フォントサイズ
                    },
                    ticks: {                      //最大値最小値設定
                        min: 0,                   //最小値
                        max: 30,                  //最大値
                        fontSize: 18,             //フォントサイズ
                        stepSize: 5               //軸間隔
                    },
                }],
                xAxes: [{                         //x軸設定
                    display: true,                //表示設定
                    barPercentage: 0.4,           //棒グラフ幅
                    categoryPercentage: 0.4,      //棒グラフ幅
                    scaleLabel: {                 //軸ラベル設定
                       display: true,             //表示設定
                       labelString: '横軸ラベル',  //ラベル
                       fontSize: 18               //フォントサイズ
                    },
                    ticks: {
                        fontSize: 18             //フォントサイズ
                    },
                }],
            },
            layout: {                             //レイアウト
                padding: {                          //余白設定
                    left: 100,
                    right: 50,
                    top: 0,
                    bottom: 0
                }
            }
        }
    });
    </script>

```

###グラフ
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/153661/d21ebd66-e701-afa5-c9be-0a8820d677c7.png)
OCR ～tesseractを使ってみたよ～

#本テキストの意味
OCRライブラリのtesseractを使ってみたところ、思わぬエラーが発生した。
思わぬエラーすぎて対処法が思いつかないので、現実逃避もかねて本テキストを作成した。
#環境
visual studio 2017
visual basic
c#
#やってみたこと
NuGetでtesseract ver3.0.2をインストール。
Youtubeで簡単な[チュートリアル](https://www.youtube.com/watch?v=ZhUBqBGepAU)を見つけたのでその通りに入力して実行してみた。
#問題点
Debugビルドは動いた。
Releaceビルドするとエラーが発生した。
#エラーメッセージ
"\\network-drive\username\Visual Studio 2017\Projects\OcrTestCsharp1\packages\Tesseract.3.0.2.0\lib\net451\Tesseract.xml" を "bin\Release\Tesseract.xml" にコピーできませんでした。10 回の再試行回数を超えたため、失敗しました。
"\\network-drive\username\Visual Studio 2017\Projects\OcrTestCsharp1\packages\Tesseract.3.0.2.0\lib\net451\Tesseract.dll" を "bin\Release\Tesseract.dll" にコピーできませんでした。10 回の再試行回数を超えたため、失敗しました。
ファイル "\\network-drive\username\Visual Studio 2017\Projects\OcrTestCsharp1\packages\Tesseract.3.0.2.0\lib\net451\Tesseract.dll" を "bin\Release\Tesseract.dll" にコピーできません。パス 'bin\Release\Tesseract.dll' の一部が見つかりませんでした
ファイル "\\network-drive\username\Visual Studio 2017\Projects\OcrTestCsharp1\packages\Tesseract.3.0.2.0\lib\net451\Tesseract.xml" を "bin\Release\Tesseract.xml" にコピーできません。パス 'bin\Release\Tesseract.xml' の一部が見つかりませんでした。
#疑問点
エラーメッセージを見て「ネットワークドライブだとダメなのか？」と思ったけど、それならDebugビルドも失敗するはず。
♯追記 2017/10/20 解決策
web上に情報は無いかと探してみたけれど、見つからず。
仕方ないので別のプロジェクトで同じことをしてみたら問題解決しました。
なんだったんだろう、いったい・・・。
postgresqlのMulticolumn

# Multicolumn(複合インデックス)を作成した時のこと

## 環境
- Rails
- PostgreSQL

## 設定
migrationファイルに以下を記述
```
add_index :xxxxxxxxxxx_xxxxxxx, [:xxxxxxxx_id, :xxxxxxxxxx_id]
```
Railsでよくあるindexの追記設定です。

## 記述後のmigrate
```
bundle exec rake db:migrate:up VERSION=xxxxxxxxxxxxxxxxxxxxxxxxx
```

上記コマンドでrailsのmigrateを実行  
特にエラーも出力されず、無事にmigrationが完了

## indexが無事にできているか確認
```
SELECT tablename, indexname FROM pg_indexes;
```

```
select * from pg_indexes where indexname = 'インデックス名';
```

上記コマンドを実施しても追加したはずのindexが表示されず  

## 解決方法
PostgreSQlの識別子の長さは63バイトまでと判明  
実際に自動生成される文字数を数えて見るとオーバーしてました。  

[https://www.postgresql.jp/document/9.2/html/sql-syntax-lexical.html]

今回はたまたまテーブル名とカラム名が長くうまく生成されなかったみたいです。  
migrate実行時にエラー出すとかこけて欲しかった。  
オプションで**:name**を指定して63バイト以内に指定しましょう。  

```
add_index :xxxxxxxxxxx_xxxxxxx, [:xxxxxxxx_id, :xxxxxxxxxx_id], :name => 'original_name'

```
certutil コマンドで ISO ファイルのハッシュ値を確認

ある日のことです。
いつも使用していた、ハッシュ値を確認するためのツールが突然使えなくなりました。

原因は、セキュリティソフトの誤検知で dll ファイルが隔離されたため（ひどいよー T^T)

そんな時でも慌てない。
Windows には証明期間(CA)の構成/管理を行なうコマンド certutil がありまして、このコマンドでハッシュ値を確認できます。
 ~~なお、[Microsoft の日本語ページ](https://technet.microsoft.com/ja-jp/library/cc732443(v=ws.10).aspx)では、機械翻訳のため翻訳しなくてもいいオプションが翻訳されてしまっているので参照する際はご注意ください。~~
(2020年9月15日修正)Microsoftのページは[こちら](https://technet.microsoft.com/library/cc732443.aspx)に変わっていました。英語のみになってました..

たとえば、ハッシュ値 (MD5) を確認したい場合は、コマンドプロンプト(cmd.exe)を起動して
```
certutil -hashfile <.isoファイル名> MD5
```
と入力して実行します。しばらくするとハッシュ値が画面に表示されます。
![qiita100.png](https://qiita-image-store.s3.amazonaws.com/0/164551/1f6d67e1-a08d-e835-342e-9f73d221edfb.png)
【勉強会】「Rust入門者向けハンズオン vol.4」 に参加


# 概要

「Rust入門者向けハンズオン vol.4」 に参加したので自分の知見確認用

そもそもRustに興味を持ったきっかけは、rebuildで取り上げられていたこと周りからもいい言語という話しを聞いたので興味があったので。


* 参加したイベント 
  * [Rust入門者向けハンズオン](#4 https://rust.connpass.com/event/62801/?utm_campaign=event_reminder&utm_source=notifications&utm_medium=email&utm_content=title_link)
  * [イベント資料](https://github.com/chikoski/rust-exercises)



# ハンズオン内容

キュレーター: [@chikoski](https://twitter.com/chikoski)

赤いキツネのブラウザ会社から同業他社に転職された方


## Rustハンズオン概要説明
RustはFirfoxで開発していた。
メモリリークをなくしたかったらしい。

Rustは型が厳しい。とにかく苦しむ。
メモリ所有権からメモリ解放まで結構苦しむ。

前半はレクチャー
後半は黙々会(用事があって黙々会は参加できなかった)


## サンプルをみながらレクチャー
[サンプル](https://github.com/chikoski/rust-exercises)


サンプルをみながらレクチャー

### 以下話された内容をメモ(ハンズオンの内容の解説ではないです)
話している方 chikoskiさん(以下の主語は chikoskiさんです)


cargoはパッケージ管理システム
`cargo run`で実行される

mainから始まる c言語と同じ
変数宣言 letを使う
代入と束縛は違うらしい。

**同じ関数を二回呼ぶとエラーになる**
一度使うと消費されてもういなくなるらしい。

Rustの言語の思想として、コンパイル上でエラーを探してできる限り無くしたい。
rustの変数は書き換えることができない。
ヒューリスティックな部分を削るため。


mutの指定をしないと変更できない。
基本的にはイミュータブルなもの。

コンパイルエラーで出ているエラー番号の内容はコントリビュート募集中
アニメネタが多い
例: E0382

```
~/L/r/r/e/ownership ❯❯❯ cargo run
   Compiling ownership v0.1.0 (file:///Users/k-nakayama/Local/rust_hands_on_vol4/rust-exercises/exercises/ownership)
error[E0382]: use of moved value: `text`
```


束縛について
メモリ上の値を「変数=メモリ上の値を示すポインタ」が束縛する

最後に明示した値がresultになる
returnつけても良い。Rubyに似ている

printlnはマクロになっている。関数ではない。
rustでは!がつくものがマクロ。

わけがわからない場合はcloneしとけば解決する場合が多い。


＝=ここまでで１〜４のセッション内容＝=


rustを使用している会社一覧: https://www.rust-lang.org/en-US/friends.html
npmではCの部分をパフォーマンス考慮してRustに変更した。
websiteはiframeが100個ぐらいあるのでレンダリングが多い（ソーシャルなリンク部分）
Rustはミドルウェアとか下に焦点を当てている
全文検索な部分を知人などはRustで書いている
その知人はC++よりもRustの方がいいコードが書けるといっていた。


所有権
同じファイルの中で変数を受け渡したりもできない。


＝＝ここから5のセッション内容 ==

optionの型

RustのEnumはCのUnionみたいなもの。
someとnoneがある。
パターンマッチ
値がないときはnoneに入ってくる

エラーハンドリングは下記の内容が参考になる
https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/error-handling.html

下記の人が詳しく参考になる
https://qiita.com/tatsuya6502/items/cd41599291e2e5f38a4a


cargo rub -- [ファイル名]　
cat
match
? がつくとエラー時にアーリーリターンする。

コンビネーター: 
unwrap包まれている値を取り出す。
jsのpromiseに慣れている人はコンビネーター使うといいかも
C,javaぽいのはアーリーリターンかな？


基本は関数の考え方、入れたら返すというが基本
エラーは後回し

Moziraの時もライフタイムがさっぱりわからなかった。
原理は簡単だが細かく考えていくとわからない

ライフタイム
値の解放を勝手にやる。
GCはない。
値を使わなくなるかどうかはSCOPEでわかる。

変数が死ぬから束縛されている値も死ぬ
参照先がなくなっていることに気づいてコンパイルエラーが起きる


ライフタイムパラメーター
<>

何に依存しているかをライフタイムで表す
freeしていいのかわかる、メモリリーク防げる


return を書かない場合は
`hoge`
`hoge;` 

では返り値が違う
`hoge;`ではnullが帰る


コンパイラもrustなので読むといいかも
comitterのソースはやはり綺麗なので参考になる


＝=ここまでで7のセッション内容＝=



# 参加した感想

レクチャーだとわからないことが多かった。
(ハンズオンで使用された資料の内容で気になった点は別記事で書くかも。)
ただ、自分の場合はてスクリプト言語のみの経験しかないので脳の違う部分を使って面白かった。
今後も学習していこうと思う。
自動計算と条件書式を組み合わせてレコード番号が奇数の背景色を変更する（プラグイン『機能拡張スタンダード All-In』）

kintoneプラグイン[『機能拡張スタンダード All-In』](https://spica.tokyo/bluelaunch)の<strong>自動計算・条件書式</strong>を使用します。

![ss_plugin_config1.png](https://qiita-image-store.s3.amazonaws.com/0/67365/61bc0b1a-2812-ea3e-c2a8-ebe91bbab9c2.png)
![ss_plugin_config2.png](https://qiita-image-store.s3.amazonaws.com/0/67365/9cf84a6c-c20f-35bc-1b0f-d6872a44e461.png)

#概要

自動計算で、一時変数にレコード番号の2の剰余を代入します。
条件書式の一覧画面指定で、一時変数の値が1のレコードの背景を変更します。

#自動計算の設定
![ss_bl_setting_17101601.png](https://qiita-image-store.s3.amazonaws.com/0/67365/d9a2fc20-ae65-5b94-31b2-b50738efdcef.png)
代入先に 一時変数の#A を指定。
演算内容は
　１行目　演算項：<strong>レコード番号</strong>
　２行目　演算：<strong>剰余</strong>
　　　　　演算項：<strong>2（直接入力）</strong>

#条件書式の設定
![ss_bl_setting_17101602.png](https://qiita-image-store.s3.amazonaws.com/0/67365/6f9e796c-3829-000c-008c-7315895aa5ef.png)
対象フィールドセットで全てのフィールドを選択し、「レコード詳細」のトグルボタンをクリックしてオフにします。

条件判定にて、<strong>#A が 1 と等しい場合</strong> に指定。
<strong>「BG」</strong>でカラーを指定します。（※カラーピッカーで選択できます）

#結果の一覧画面
![ss_bl_setting_17101603.png](https://qiita-image-store.s3.amazonaws.com/0/67365/65e89e3c-a651-f4b7-d56c-5bb5bb793357.png)

#応用について
この設定内容のポイントは、<strong>自動計算の結果を条件判定に使う</strong>という点です。
自動計算の計算処理は条件判定よりも必ず先に処理されます。

これにより、複数のレコード入力値を条件とした判定を行うことができます。
・振込先銀行Aの支店1は文字色が青、振込先銀行Aの支店2は文字色が緑
・商品名Cの発注で納期が10日以内
といった判定を行うことができます。

また条件書式だけでなく、フィールドの非表示や編集可不可などフィールド属性にも、自動計算結果を条件判定を利用することができます。

---
#このプラグインの機能について
・[自動計算・自動採番](http://qiita.com/spica/items/803af7cd540ae0b8f718)
・[郵便番号住所検索](https://qiita.com/spica/items/451c6531be34ab2d89c2)
・[条件書式](http://qiita.com/spica/items/24027003e9dfb9363819)
・[フィールド属性](http://qiita.com/spica/items/73107bda2cff4a94cf41)
・[選択数制御](http://qiita.com/spica/items/1c3ba3927b844b6bb72b)
・[レコード一括更新](http://qiita.com/spica/items/f0e84a1cf430670c4292)
・[自動計算によるレコード一括更新](kintoneプラグイン『機能拡張スタンダード All-In』を使って自動計算でのレコード一括更新を行う)
ScalaからRedmineを操作する


## 概要

Redmine API
http://www.redmine.org/projects/redmine/wiki/Rest_api

ScalaからRedmineのAPIを使って、チケットを取得したり操作したりするための設定を行います。


## RedmineのAPIキーを取得

以下のページを参考に、RedmineのAPIキーを取得します。
http://redmine.jp/glossary/r/rest-api/


## Java向けのSDKを導入

APIを使うためのSDKが用意されているので、それを使用します。
http://www.redmine.org/projects/redmine/wiki/Rest_api#API-Usage-in-various-languagestools


以下のリンクで、最新のバージョンを調べてsbtファイルに追記します。
http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.taskadapter%22%20AND%20a%3A%22redmine-java-api%22

```scala:build.sbt
libraryDependencies += "com.taskadapter" % "redmine-java-api" % "3.0.1"
```


## サンプルコード

あとはSDKを使用してプログラムを書くのみです。
以下は、対象のプロジェクトのチケット一覧を取得するサンプルコードになっています。

```scala:Main.scala
import com.taskadapter.redmineapi.RedmineManagerFactory

import collection.JavaConversions._


object Redmine {
  def main(args: Array[String]): Unit = {
    // RedmineのURL
    val uri = "https://xxxxxxxxxxxxxxxxxxxxxxxxxx/"

    // APIキー
    val accessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    // プロジェクト名
    val project = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    val mgr = RedmineManagerFactory.createWithApiKey(uri, accessKey)
    val issues = mgr.getIssueManager().getIssues(project, null)
    for (issue <- issues) {
      println(issue.getSubject)
    }
  }
}
```


## ドキュメント

Redmine API
http://www.redmine.org/projects/redmine/wiki/Rest_api
C#でシンプルなStatePatternを組んだ

# StatePattern
デザインパターンの一角, StatePatternをC#で組んでみました.

Stateパターンを使えば, 呼び出し側のコードでif文/switch-case文を書かなくて良いというメリットがあります.
今回は, 汎用的に使えるState/Contextのクラスを作ってみます.

ソースは<a href="https://github.com/nossey/StatePattern">こちら</a>

## State

```csharp
public class State
{
    public StateContext Context
    {
        get;
        private set;
    }

    public delegate void stateEnterEvent();
    public stateEnterEvent OnEnter;

    public delegate void stateExitEvent();
    public stateEnterEvent OnExit;

    public State(StateContext context)
    {
        Context = context;
    }
}
```
ベースとなるステートクラスでは, 「自分のステートに遷移した時」と「自分のステートから出て行った時」のイベントを用意しています.

## Context
各Stateを管理して, Stateの遷移を管理・実行するクラスです.

```csharp
public class StateContext
{
    public List<State> StateList = new List<State>();
    public State CurrentState { get; private set; }

    // Allow transit to self state
    public bool SelfTransit = true;

    object Locker = new object();

    public void setCurrentState(State state)
    {
        if (state == null || !StateList.Contains(state))
            return;

        CurrentState = state;
    }

    public void addState(State state)
    {
        if (state == null || StateList.Contains(state))
            return;
        StateList.Add(state);
    }

    public void transitState(State targetState)
    {
        if (targetState == null || (StateList.Contains(targetState) && SelfTransit))
        {
            return;
        }

        lock (Locker)
        {
            CurrentState?.OnExit();
            CurrentState = targetState;
            CurrentState?.OnEnter();
        }
    }
}
```

状態の追加には「addState」, 遷移には「transitState」を呼び出せばOKです.

## 使い方
State/StateContextを継承した自作State/自作Contextを作り, AddStateを使ってStateを登録していきます.
遷移時のイベントは「onEnter」「onExit」に登録可能です.
詳しいコードは<a href="https://github.com/nossey/StatePattern">GitHub</a>に上げているので, そちらをご覧ください.

## 一つ一つのStateが大きな場合
↓のように, 具象クラスを別ファイルで実装してみると良いと思います.

```csharp:LargeState.cs
public class LargeState : State
{
    public LargetState(LargetContext context, LargeState next) : base(context)
    {
         ...          
    }   
}
```

## 有効利用できそうなケース
UnityでUI組むときとかに使えそうです.

UIの場合, ユーザからの入力情報は変わらないけど, 階層構造をもっていて画面遷移する事が多いです.
Stateに応じた入力処理・画面遷移を組めば, 呼び出し側のコード(ビヘイビア)は綺麗に保てそうです.


## StatePatternを使う上での注意点
**呼び出すメソッドが共通化できる時に使わないと, 却ってコードの煩雑化を招きます**

例えば, こんなケース.

```csharp
public class StateA : State
{
     public void myOwnMethodA();
}

public class StateB : State
{
     public void myOwnMethodB();
}

...

public class MyContext : Context
{
     public void onInput()
     {
        if (CurrentState.is(StateA))
        {
           (CurrentState as StateA).myOwnMethodA();
        }
        ...
     }
}
```


StateAとStateBの間で異なるインタフェース**しか**提供されないと, 結局Context側で無駄な条件分岐が発生します.


本来やりたかったのは「呼び出し側のコードがif文/switch-case文を使いたくない」という事なので, 本末転倒です.
「あ, このメソッドは共通化できるな」という見通しが立ってから使った方がよさそうです.

(...という認識であってるかなー? ご意見あれば, コメント欄に書き込んで下さると勉強になります)
python時間を指定せずに録音する

現在、PythonでGUIアプリを作成しているのですが、その中で「ボタンを押したら録音を開始し、もう一回ボタンを押したら録音を止める」というボイスレコーダーのような機能を実装したくて奮闘していたので今回はそのお話をしたいと思います。

#初めはPyaudioを使っていたが
初めはpyaudioで試していたのですが、あれはあらかじめ録音の時間を指定する必要があるため、冒頭の内容を実現するのは難しいです。

#G◯◯gle先生に聞いてみると
以下のソースコードを見つけました。（[参考](https://ja.stackoverflow.com/questions/31066/python%E3%81%A7%E3%83%9E%E3%82%A4%E3%82%AF%E3%81%AE%E9%9F%B3%E5%A3%B0%E3%82%92%E4%BB%BB%E6%84%8F%E3%81%AE%E6%99%82%E9%96%93%E9%8C%B2%E9%9F%B3%E3%81%97%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99)）

```python:

import subprocess
import wave

print("Start recording...")
p = subprocess.Popen(("rec", "-q", "out.wav"))

input("Enter to stop: ")
p.terminate()
try:
    p.wait(timeout=1)
except subprocess.TimeoutExpired:
    p.kill()

```

subprocessを使えば短く簡単にwavファイルを作成できました。これならpyaudioの時よりシンプルでguiアプリに組み込みやすそうです。
Karabiner-Elements がついにマウスにも対応してきました！

# Karabiner-Elements 11.1.8でついにマウス対応開始!
> Mouse button modifications has been added.

先日 [Karabiner-Elements が超絶怒濤に進化している。今も!](https://qiita.com/hanamiche/items/d6b9a7397a91caaa017d "Qiita") を書いたのですが、その時点ではマウスの対応はまだでした。
今回、Karabiner-Elements 11.1.8 (11.2.0 かも?)にてマウスのサポートが開始されました！

私は、logicoolのM705を使ってるので、マウスのボタンの切り替えができる「logicool control center」が有り特に困っていませんでしたが、ついにKarabiner-Elementsがマウスにも対応してきてくれました。
これで、例えばmacOSでMicrosoftの5ボタンマウスを使っても「マウスの戻るボタン」などが有効にできるので選択肢が広がりとてもうれしいです。

現状Macで5ボタンマウスを生かそうとするとmacOS用のドライバを作っているLogicoolかELECOMの2択みたいなので選択肢が広がってとてもハッピーになります:relaxed:
(有料のUSBドライバなどもありますが)

# やりたいこと
* ボタン4 → command + [ に割り当て、戻るボタンとする
* ボタン5 → command + ] に割り当て、進むボタンとする
* ボタン6 → control + ↑に割り当て、Mission Controlを起動する

#設定ファイル
~/.config/karabiner/assets/complex_modifications/ につくります。

```mouse.json
{
    "title": "Mouse Personal rules (@hanamiche).",
    "rules": [
        {
            "description": "Use mouse buttons 4, 5, and 6!!! (available since Karabiner-Elements 11.1.8)",
            "manipulators": [
                {
                    "description": "button4 → [ + command",
                    "from": {
                        "pointing_button": "button4"
                    },
                    "to": [
                        {
                            "key_code": "open_bracket",
                            "modifiers": [ 
                                "command" 
                            ]
                        }
                    ],
                    "type": "basic"
                },
                {
                    "description": "button5 → ] + command",
                    "from": {
                        "pointing_button": "button5"
                    },
                    "to": [
                        {
                            "key_code": "close_bracket",
                            "modifiers": [ 
                                "command" 
                            ]
                        }
                    ],
                    "type": "basic"
                },
                {
                    "description": "button6 → Mission Control",
                    "from": {
                    "pointing_button": "button6"
                    },
                    "to": [
                        {
                            "key_code": "up_arrow",
                            "modifiers": [ 
                                "control" 
                            ]
                        }
                    ],
                    "type": "basic"
                }
            ]
        }
    ]
}
```

button4, button5の to の key_codeを修正しました。 [^1]

[^1]: 私の環境では確かに"[" → close_bracket、 "]" → backslash なのですが・・・ (JISキーボードだから？？？ :frowning2:)


まだ、 Version 11.2.0 はbeta版ですが使ってみてはいかがでしょうか。
どんどん便利になっていくので本当に感謝しきれません:clap_tone1::clap_tone1::clap_tone1:

# 後日談

* gitHubにサンプル上げてみました。
 * [サンプルjson](https://github.com/tekezo/Karabiner-Elements/issues/261#issuecomment-337092435)

そしたら、[褒められました。](https://github.com/tekezo/Karabiner-Elements/issues/261#issuecomment-337174289)
こちらこそ本当にありがとう。とってもうれしいですよ:relaxed:
Scoop経由でNYAGOSをインストール

使ってみたかった。

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

関連記事:

 * [Scoopで作るLinux on Windows開発環境]
[Scoopで作るLinux on Windows開発環境]:https://qiita.com/dozo/items/a6f63aa1b03d1773b8ec

[scoop]:http://scoop.sh/
[Ninite]:https://ninite.com

----
------------------- ↓ 余談はここから ↓-------------------
scoopを使って開発環境を作るのは前回の記事で示した。
cmderをインストールしてタブ型のWindowsターミナルを手に入れた。
ただ、現状cmderは文字化け問題を抱えていて、
設定ファイルでないファイルを修正が必要。
アップデートのたびに発生するのはちょっと面倒。

なのでデフォルトコンソールをNYAOSに変えることにした。
（ver4.0以降はNYAGOSというらしい）

### NYAOS.ORG
Nihongo Yet Another {OS/2|OSes|Open|GOing} Shell's

```
NYAOS とは、Windows,OS/2等で稼働する、 UNIXライクな日本語拡張コマンドラインシェルです。
UNIX ライクな行編集・ヒストリ機能
オープンソースソフトウェア（1～3 はGNU General Public License、4==NYAGOS は BSD License)
内蔵カラー ls
エイリアス・関数
キー割当てのカスタマイズ
ファイル名補完
NYAOS 4.x = NYAGOS (Nihongo Yet Another GOing Shell)

nyagosico.png Go言語 + Lua言語を使って、スクラッチから開発し直したものです。 
Unicode に対応しており、現在のコードページ以外の文字も使用可能となりました。 https://github.com/zetamatta/nyagos/ にて公開中
```

また、例によってScoopのインストールから記述するが、
適当に読み飛ばしてほしい。

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----
------------------- ↓ 本題はここから ↓-------------------
###[scoop]インストール
####windows powershellを起動
スタートメニューの検索項目に`power`と打てばそれっぽいのが見つかるので、それを起動。
![windows_powershell01.PNG](https://qiita-image-store.s3.amazonaws.com/0/40697/3f4dcd8c-3e1c-dfc6-402c-e4cb1daff045.png)

####実行ポリシー変更
以下のコマンドを打つって実行ポリシーを変更する。
設問には何の疑問も持たずに`Y`と入力

```
PS> set-executionpolicy unrestricted -s cu

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
```

####インストール
以下のインストールコマンドを入力
```
PS> iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

####動作確認
```
PS> scoop search
'main' bucket:
    7zip (16.04)
    ack (2.18)
    acmesharp (0.8.1.0)
    adb (26.0.0)
    ag (2.1.0-1)
    allure (2.3.5)
・・・
```
この時点でpowershellはお役御免。

```
PS> exit
```
### NAYGOSのインストール
以下のscoop用jsonを使ってインストール
https://gist.github.com/dohzoh/75eab6bd7a46d3625ddcd332618e4518#file-nyagos-json

```shell-session
$ scoop install https://gist.githubusercontent.com/dohzoh/75eab6bd7a46d3625ddcd332618e4518/raw/b8e98b5f9e0c14317a9abbafe176081b0cf97438/nyagos.json
Installing 'nyagos' (4.2.2_1).
Loading nyagos-4.2.2_1-amd64.zip from cache
Checking hash of nyagos-4.2.2_1-amd64.zip... ok.
Extracting... done.
Linking ~\scoop\apps\nyagos\current => ~\scoop\apps\nyagos\4.2.2_1
Creating shim for 'nyagos'.
'nyagos' (4.2.2_1) was installed successfully!
```

### 起動

```
$ nyagos
```

----
------------------- ↓ 後書はここから ↓-------------------

好みの問題でもあるので、
特に推奨はしない。
Are you sure you want to continue connecting (yes/no)?　を黙らせるかた

ssh ログインする時によく出る`Are you sure you want to continue connecting (yes/no)?`はセキュリティーに関わるが、今はしばしば面倒と感ずる。どう消せば…

SSHコマンドに直接に`-o StrictHostKeyChecking=no`を入れて、これを回避できるという。

```bash
ssh -o StrictHostKeyChecking=no root@192.168.1.1
```

また、システムレベルには、`/etc/ssh/ssh_config`を編集し、`StrictHostKeyChecking`をデフォルトの`ask`から`no`に改定すれば、全滅は可能。

他には、`-vvv`などをｓｓｈコマンドに添付して見て、どこが問題があるが見つかる。
PCの高速化による作業の効率化＋α

社内でPCの高速化を行ったのでメモ。

# 高速化前
HDD
DeskStar HDS725050KLA360 SATA 500GB
メモリ
Hynix HMT351U6CFR8C-PB N0 AA DDR3 1600Mhz PC3-12800U 4G ×2

CrystalDiscMarkによる点数
   Sequential Read (Q= 32,T= 1) :   111.804 MB/s
  Sequential Write (Q= 32,T= 1) :   107.880 MB/s
  Random Read 4KiB (Q= 32,T= 1) :     1.218 MB/s [   297.4 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :     1.207 MB/s [   294.7 IOPS]
         Sequential Read (T= 1) :   112.623 MB/s
        Sequential Write (T= 1) :    69.834 MB/s
   Random Read 4KiB (Q= 1,T= 1) :     0.586 MB/s [   143.1 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     1.124 MB/s [   274.4 IOPS]


# 高速化後
SSD
[Samsung SSD 250GB 850 EVO ベーシックキット V-NAND搭載 2.5インチ 内蔵型 MZ-75E250B/IT](https://www.amazon.co.jp/Samsung-%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF%E3%82%AD%E3%83%83%E3%83%88-V-NAND%E6%90%AD%E8%BC%89-2-5%E3%82%A4%E3%83%B3%E3%83%81-MZ-75E250B/dp/B00QIH3RWW)
メモリ
[W4U2400PS-8G [DDR4 PC4-19200 8GB 2枚組]](http://kakaku.com/item/K0000899566/)

CrystalDiscMarkによる点数
   Sequential Read (Q= 32,T= 1) :   551.306 MB/s
  Sequential Write (Q= 32,T= 1) :   511.113 MB/s
  Random Read 4KiB (Q= 32,T= 1) :   280.557 MB/s [ 68495.4 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :   241.702 MB/s [ 59009.3 IOPS]
         Sequential Read (T= 1) :   499.961 MB/s
        Sequential Write (T= 1) :   494.998 MB/s
   Random Read 4KiB (Q= 1,T= 1) :    28.975 MB/s [  7074.0 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :    66.668 MB/s [ 16276.4 IOPS]


# 今回の作業内容
初期投資として
[SSD Wavlink USB C 3.1 to SATA Dual Bay External Hard Drive Docking Station for 2.5/3.5in SATA SSD HDD (SATA I/ II/ III)](https://www.amazon.com/Wavlink-External-Docking-Station-UASP-Black/dp/B019DNBU7G)
￥20,000
今回はこれを使ってHDDからSSDにすべて移行した。
回復ドライブを作ってUSBから起動して、、、といった面倒なことはせず
HDDとSSDを差し込んでボタンを押すだけで移行してくれる優れもの。
データを移行してPCを分解してメモリ挿してSSDに入れ替えて、でトータル1時間くらい。
上記の回復ドライブを作成して、のやり方だとドライブを作成してWindowsのセットアップをして、と面倒な手順がえらく時間がかかる。


# 元はとれるのか？
金額的には1台あたり￥30,000＋Docking Station分くらい。
弊社の1時間あたりのコストは5000円なので最低でも3時間の短縮が確実であれば元は取れたことになる。

出社して起動してから作業可能になるまでがおよそ10分。
高速化後はこれが1~2分になるので、毎朝8分の短縮が可能。
これだけで2カ月と1週間あれば元が取れてしまう。
さらに、重たいPCの天敵Adobe製品を複数開いてもフリーズせず、データが飛ぶ心配もない。
データが飛ぶリスクと待機時間を減らせることを考えれば￥30,000の投資はかなり安い。

# 総評
体感としてはExcelの起動がこれまでは緑のあれがずっとデスクトップにいて開いたと思ったらグレーの画面で操作できない状態になって、、、
といって状態だったが高速化後は一瞬緑のあれが見えたと思ったらすぐにシートが開く、というすばらしい速さ。
sakura.ioのシグネチャをGoで計算する

sakura.ioのシグネチャはハッシュ関数にSHA1を使用したHMACで計算する。Go言語では `crypto/hmac` , `crypto/sha1` を使用することで計算できる。


```go
import (
	"crypto/hmac"
	"crypto/sha1"
	"encoding/hex"
)

const secret string := "secret-string"

// sakura.ioのシグネチャを検証する
func calculateSignature(body []byte, signature string) bool {
	// SHA1でHMACを生成してシークレットキーを渡す
	h := hmac.New(sha1.New, []byte(secret))

	// リクエストボディのバイト列をインスタンスに書き込む
	h.Write(body)

	// `Sum()` でハッシュ値を計算する
	// シグネチャとハッシュ値が同じだったらtrueを返す
	return signature == hex.EncodeToString(h.Sum(nil))
}
```
Filemakerのポップオーバーボタンでマウスオーバー時にカーソルを手の形にする方法

ポップオーバーボタンは、「ボタン」と違ってマウスオーバーをしてもカーソルは手の形になりません。
ただ、一手間かかりますが、下記の方法によって実現することが可能です。
より使いやすいレイアウトにするためには必要だと思いますので、こだわる方はよろしければご参照くださいませ。


#環境
Filemaker pro 16

#方法
まず、ポップオーバーボタンを作成し、オブジェクト名をつけます。

次に、ボタンを作成し、ボタン設定→単一ステップで、
オブジェクトへ移動で先ほどつけたオブジェクト名を設定します。

「ボタン上でカーソルを手の形にする」にチェックします。

ポップオーバーボタンは、ボタンの背面に配置します。（下に隠す）

以上で完成です。


#まとめ
まとめというほど記事はありません。。。
このようにオブジェクトへ移動を使用すれば様々な動きを実現できます。
ぜひご活用ください。
[Unity] Shader Forgeで視差マッピングを実装する

#概要
UnityのShaderForgeを使用して視差マッピングを実装してみる。

#環境
Unity5.5.2p4
ShaderForge v1.36

#実装内容

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/9706532e-8a40-3df6-12a9-7591cdbff56c.png)

NormalMapを使用してシェーディングするとき

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/72beeace-0822-b498-6667-f02194076fe2.png)


#実行結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/8a012c3a-0eb8-9262-774c-87667ab4ba10.png)

手前はテクスチャをそのまま描画したとき。
真ん中はハイトマップから視差マッピングをしたとき。
奥は視差マッピングに簡易的なシェーディングを処理したとき。

#感想
計算結果は疑似的で計算量も少ないので
そのコストの割には得られる結果は大きいのかもしれない。
ただ、実際、驚きがあるのかといわれると？？？
Polymer 2.0 > IE11 > IE11でPolymer 2.0は動く

## 前段
以前、IE11でPolymer 2.0コンポーネントが動作するか検証して途中で挫折してましたが、
>IE11でPolymer 2.0は動かないのか
>https://qiita.com/sugasaki/items/447f487e07210c2cff03

ようやくやり方が分かりました。
という事で、以前のタイトルを打ち消す形で今回のタイトルにしてます。
内容はインストールガイドに書いてある事をさらっと試してみてIE11でも動きましたよ。
という簡単な事になってます。

## 結論
結論からすればIE11で問題なく動きます。
ただ私の使いたい用途とは合致していませんでした。
私は既存レガシーアプリにパーツとして組込みたかった。1系だとJSを２行くらい追加で使えたのですが、今回の2.0だと行数がかなりの数になって、私以外の開発者に受入れられそうにないです。

Polymer2.0を想定して作成したアプリなら便利そうなのですが・・・
とはいえまだ現在検証を進めています。（2017/10/26現在）


## Install 
以下のInstall Polymer 2.xガイドに書いてあるとおりに進めました。
https://www.polymer-project.org/2.0/start/install-2-0



## 環境準備
Windows環境、npm等はインストール済みを前提としています。

以下polymerコマンドで進めていくので、まずはpolymer-cliをインストールします。
グローバルにインストールしても良いと思いますので -g オプションを付けてます。
```
npm install -g polymer-cli
```


## アプリケーション作成

次にinitコマンドでPolymerアプリケーションの雛形を作ります。

```
polymer init
```
どのコンポーネントを作成するかを質問されるので、polymer-2-application.　を選びます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/3bbea15a-1905-563e-04df-882819b408ef.jpeg" width=400 />
**分かりにくいがキーボード上下キー(カーソル)で移動する。**


その後、アプリケーション名、エレメント名等が質問されるので回答して進みます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/89af6657-4818-9537-5d9a-ed538479b2bc.jpeg" width=400 />

カレントフォルダ配下にソース一式が作成される。
フォルダ構成は以下のような感じです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/813f46b7-e331-3d3b-8090-8d9a10441b7f.jpeg" width=400 />



## 動作確認

ひとまず動作を試してみます。serveコマンド+openオプションでブラウザが立上ります。
```
polymer serve --open
```

polymer serve はブラウザを判定して自動的にビルドが呼ばれるようです。
試しにIEとChromeとでアクセスするとそれぞれソースが変わってます。
ChromeでアクセスしたらES2015形式で、 IE11でアクセスしたらES5形式でブラウザへソースを送り出すようです。



## ビルド
https://www.polymer-project.org/2.0/toolbox/build-for-production

serveだけでは実際には使えないのでビルドします。
polymer buildコマンドでビルド開始。
IE11でもアクセス可能にする為にjs-compileオプションでビルドします。
```
polymer build --js-compile
```

ES2015でビルドしたければ以下
```
polymer build --preset preset-name
```


カレントフォルダ配下の/build/defaultにファイルが作成されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/2016f92c-3947-972a-652a-ba080e1f4f64.jpeg" />


ビルドしたファイルはIEでもChromeでも同じ動作になりました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/76574652-34a9-4905-bb6f-743aa553f02e.jpeg"  width="400" />

<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/548ed313-28cd-12db-0090-354769e9b51f.jpeg"  width="400" />

## ビルドの設定ファイル

polymer.json　に以下を追記する事で、build時に設定ファイルのとおりビルドするようになる。

```js
  ,
  "builds": [{
    "bundle": false,
    "js": {"compile": true, "minify": true},
    "css": {"minify": true},
    "html": {"minify": true}
  }]
```

事項はbuildコマンドのみでOK
```
polymer build
```

# ソース

ソースは以下に保存しました。
https://github.com/sugasaki/start-polymer2/tree/master/02-polymer-2-application
Delphi or C++Builder で Android 上にインストールされているアプリケーションの一覧を取得する

この記事は以前 EDN の [Delphi](http://edn.embarcadero.com/article/44698), [C++Builder](http://edn.embarcadero.com/article/44700) に投稿した記事のリライトです。

他のアプリと連携するようなアプリを作ろうとしたとき、実際にその端末に何のアプリがインストールされているかを調べなければ話が始まりません。
連携したいアプリがインストールされていないことも考えられますから。

Delphi や C++Builder から Android API の [PackageManager](https://developer.android.com/reference/android/content/pm/PackageManager.html) と [ApplicationInfo](https://developer.android.com/reference/android/content/pm/ApplicationInfo.html) を使うと、デバイスにインストールされているアプリケーションの情報を取得することができます。

##サンプルコード
フォーム上に TToolBar とその上に TButton を置き、残りの場所は TListBox を Align = Client で設置しています。
ボタンをクリックすると、取得したアプリ名を Listbox の Items として追加して表示します。
(10.2 Tokyo Release 1, Nexus 5, Android 5.1.1 で確認してます)

###Delphi
```delphi
procedure TForm1.Button1Click(Sender: TObject);
// usesに以下を追加します
// Androidapi.JNI.GraphicsContentViewText
// Androidapi.JNI.JavaTypes
// Androidapi.Helpers
// Androidapi.JNIBridge

var
  PM: JPackageManager;  // PackageManager
  PL: JLlist;           // 取得したパッケージ情報を格納するためのリスト
  AI: JApplicationInfo; // ApplicationInfo
  iter: JIterator;
  i: Integer;
begin
// PackageManagerを取得する
  PM := TAndroidHelper.Activity.getPackageManager;

// JListにパッケージ情報を格納する
  PL: PM.getInstalledApplications(TJContext.JavaClass.BIND_AUTO_CREATE); 
  iter := PL.Iterator;

// 初期化
  i := 0;
  ListBox1.Items.Clear;
 
  while iter.hasNext do begin
    // リストに格納されているパッケージ情報を１件取り出す
    AI := TJApplicationInfo.Wrap((PL.get(i) as ILocalObject).GetObjectID);

    // ListBoxの itemsに loadLabelで取得したアプリケーション名をセットする
    ListBox1.Items.Add(JStringtoString(AI.loadLabel(PM).toString));

    // 次の項目へ
    i := i+1;
    iter.next;
  end;
end;
```

###C++Builder
```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// include に以下を追加します
// Androidapi.JNI.GraphicsContentViewText.hpp
// Androidapi.JNI.JavaTypes.hpp
// Androidapi.Helpers.hpp
// Androidapi.JNIBridge.hpp

  _di_JPackageManager PM;  // PackageManager
  _di_JList PL;            // 取得したパッケージ情報を格納するためのリスト
  _di_JApplicationInfo AI; // ApplicationInfo
  _di_JIterator iter;

// PackageManagerを取得する
  PM = TAndroidHelper::Activity->getPackageManager();

// JListにパッケージ情報を格納する
  PL = PM->getInstalledApplications(TJContext::JavaClass->BIND_AUTO_CREATE);
  iter = PL->iterator();

// 初期化
  int i=0;
  ListBox1->Items->Clear();

  while (iter->hasNext()) {
    // リストに格納されているパッケージ情報を１件取り出す
    AI = TJApplicationInfo::Wrap(_di_ILocalObject(PL->get(i))->GetObjectID());

    // ListBoxの itemsに loadLabelで取得したアプリケーション名をセットする
    ListBox1->Items->Add(JStringToString(AI->loadLabel(PM)->toString()));

    //次の項目へ
    i++;
    iter->next();
  }
}
```
画像をリサイズできるCDNサービス一覧


投稿機能があるサービスなどで、ユーザがアップロードした画像を、S3やGoogle Cloud Storageに画像を保存する場合があると思いますが、オリジナル画像のまま保存すると大きいもので2MBくらいと、そのままクライアントに渡すには大きすぎて表示に時間がかかります。

その場合どうするかというとリサイズするわけですが、クライアントのほしい画像サイズは変わる場合が多いので、リアルタイムにサイズが変更された画像を返せると便利です。

今回は、画像をリサイズしてくれるCDNを紹介したいと思います。

imgixとImage Resizerはすぐ使えるのですが、AkamaiとFastlyはセールスに問い合わせて交渉してから使う形です。

# CDNで画像をリサイズ

## [imgix](https://imgix.com)

変更したい値をクエリストリングで指定します。

* [価格](https://www.imgix.com/pricing): 1000枚のマスター画像毎に`$3`と`1GB`のbandwidth毎で`$0.08`です。
* [機能](https://www.imgix.com/solutions)
    * [Resize & Crop](https://www.imgix.com/solutions/resizing-and-cropping): 画像のりサイズができたり、中心の位置を自由にかえてcropできます
    * [Compression & Performance](https://www.imgix.com/solutions/compression-and-performance): 画像のクオリティを変更することで、画像サイズを圧縮できたり、画像フォーマットの変更で圧縮できたりします
    * [Responsive Design](https://www.imgix.com/solutions/responsive-design)
    * [A CDN Designed for Image Delivery](https://www.imgix.com/solutions/cdn-delivery): 日本では東京と大阪にEdge Nodeがあります
    * [User-Generated Content](https://www.imgix.com/solutions/user-generated-content): 顔を認識して、その周りにpaddingを入れたり、円でマスクしたりできます。また、くらい写真を明るくしたり自動で調整できます
    * [Dynamic Text Compositing](https://www.imgix.com/solutions/dynamic-text-compositing): 画像にテキストを挿入できます
    * [Branding & Copyright](https://www.imgix.com/solutions/branding-and-copyright): コピーライト画像を挿入したりできます
    * [Image Enhancement](https://www.imgix.com/solutions/image-enhancement): 画像の色を調整できます
    * [Metadata Operations](https://www.imgix.com/solutions/metadata-operations)

## [Image Resizer](https://imageresizer.io/)

こちらもURLのクエリストリングにパラメを設定し、画像を変更できます。

* [価格](https://imageresizer.io/pricing): マスター画像数には関係ない形式です。
* [機能](https://imageresizer.io/demo): imgixよりは機能が少なめですが、基本的なResize, Crop, マスク, Blur, Grayscale, 画像フォーマット変更, 画像クオリティの変更(JPEGとWEBPのみ), 画像の向き変更, URLにSEOキーワードを入れるができるようです


## [Akamai Image Manager](https://www.akamai.com/jp/ja/products/web-performance/image-manager.jsp)

* 価格: セールスから問い合わせてから使用する感じでした。
* 機能: リサイズ、ダウンサイズ(クオリティの調整)、クロップ、画像フォーマット変換、バックグラウンド色変更、ウォーターマーク。ただ、クエリストリングではなくポリシーというのを設定して、それをクエリストリングで指定する形だったので柔軟性が低そう

## [Fastly Image Optimizer](https://www.fastly.com/io/)

* 価格: FastlyはWeb上ですぐログインして、使い始めることができません。
セールスに連絡しましたが、10億リクエスト/月から使用できると言われたのであまりスタートアップにはむいてなさそうです。
* 機能: Resize, Crop, 画像クオリティの変更, 画像フォーマットの変更, 画像の向き変更, 背景の色変更、などができるようです



# 参考までにAWSでやる方法
* [サーバーレスアーキテクチャで画像の動的リサイズをしたら優勝しました 【SpeeeKaigiレポート#1】](http://tech.speee.jp/entry/2016/07/29/112616) <= API Gateway + Lambda
* https://qiita.com/akitsukada/items/e6d8fe68c49973d1edf6
* http://oretachino.hatenablog.com/entry/2014/12/20/235441
* https://qiita.com/musclemikiya/items/2ceae01ff4e8d8054172 <= EC2 + S3 + SQS
Gitでコマンドラインからリモートブランチを削除する際のコロンの意味


この記事はほぼメモに近いので`いいね`などは要りません
もし知見になった場合は各リンク先に評価をして下さい

#リモートブランチの削除する際のコロンの意味
[今さら聞けないgit pushコマンド](http://shoma2da.hatenablog.com/entry/2014/03/08/234523)

#しかし今はgit push --deleteが存在する
上記のはてブコメント
[http://b.hatena.ne.jp/entry/185660046/comment/dekokun](http://b.hatena.ne.jp/entry/185660046/comment/dekokun)

[【Git】git push --delete origin {削除したいリモートブランチ名} →リモートブランチの削除](https://qiita.com/megu_ma/items/7533b4327dc110a9e2b8)
AWSのApacheログにCannot allocate memoryと出た時の対処

## はじめに

レンタルサーバーで運用していたサービス(Wordpress)をAWSに移行したら、管理画面の設定ページなどでHTTP 500エラーになることが度々あった。
以下のようにApacheのエラーログを見てみた

```
$ sudo less /etc/httpd/logs/error_log
```

すると`Cannot allocate memory`とか`PHP Fatal error:  Out of memory`とかのエラーが出ていて、メモリ不足だった。

## とりあえず解決方法

PHPのメモリ使用料を無制限にしたら直った。

```
// php.iniを編集
$ sudo vi /etc/php.ini
```

`memory.limit = 128M`ってなってるところを`memory.limit = -1`にしたら解決した。

テスト環境だったので、これでいいけど、本当はインスタンスのメモリを増強とかしないといけない気がする
vimで使用するコマンド

# 概要
私が実践で使うテクニック集。

# Vim


## コマンド

概要 | コマンド
---|---
ページリセット | `:%d`
ファイルの作成 | `:ene`
空白行の削除 | `:v/./d`
ペースト | `<s-ins>`
ファイルを閉じる | `:q!`
Cognos Analytics on Linux & AIX で監視すべきプロセス

#内容
Cognos Analytics で起動してくるプロセスと、その中で監視すべきプロセスを考えてみました。
Cognosとして正式なガイドがあるわけではないので、あくまで個人の検証・調査結果です。

**＜プロセス名＞**
①/opt/IBM/cognos/analytics/./bin64/./cogbootstrapservice (中略） runASDaemon <---- ②の親
②/opt/IBM/cognos/analytics/jre/bin/java (中略)　cognosserver <----- ③⑤⑥⑦の親
③/opt/IBM/cognos/analytics/bin64/cgsServer.sh     <-----④の親
④/opt/IBM/cognos/analytics/jre/bin/java (中略) CGSServer
⑤/opt/IBM/cognos/analytics/jre/bin/java　（中略） DQServer 
  ※CA11.0.7から/opt/IBM/cognos/analytics/jre/bin/java　（中略） dataset-service
⑥/opt/IBM/cognos/analytics/bin64/BIBusTKServerMain
⑦/opt/IBM/cognos/analytics/bin/BmtMDProviderMain
 
**＜役割＞**
①ディスパッチャ用のjavaを起動、監視するプロセス
②ディスパッチャ用のjavaプロセス
③グラフ描画用のjavaプロセス④を起動するためのスクリプト
④レポート実行時のグラフ描画用のjavaプロセス 
⑤レポート実行時のデータの抽出、計算、集計を行うための動的クエリー用のjavaプロセス 
⑥レポート実行時に、主にレポートフォーマットを形成するためのBIBusTKServerMainプロセス
⑦データソース接続の確認 などに使用するためのプロセス

**＜プロセス障害時の動作＞**
①がKILLされるとレポート実行などに支障はないが、子プロセスが停止したときの自動起動が不可になる。また、サーバー停止コマンドでの停止ができなくなる。
②がKILLされると数分後に自動的にCognosサーバーの起動処理に入る。起動処理には時間がかかる。
③がKILLされても自動起動されないが、レポート実行に支障なし。
④がKILLされると③共々消えるがレポートを実行すると②により③④とも起動される。
⑤がKILLされると数秒後②により自動起動される。
⑥がKILLされるとレポートを実行すると②により自動起動される。
⑦がKILLされるとメタデータ接続（データソース接続テスト、FM接続など）が行われると②により自動起動される。
 
**＜監視対象＞**
①についてはサーバー停止ができなくなるため監視が必要。
②については起動の数分間ユーザーが使用できない時間が生じエラーが戻ってしまうため監視が必要。
③は自動起動されないが、子プロセス（CGSServer）が起動していればレポート実行に支障ないため監視をする事は望ましいが必須ではない。
⑤については、②により自動起動されるが、何らかの理由で自動起動できない場合にレポート実行に支障が出るため監視する事が望ましい。
④,⑥～⑦については必要なタイミングで自動起動されるため監視不要。
 
この内容で不都合や認識違いあれば是非フィードバック下さい！
explicit_defaults_for_timestampの調査

## 概要
テーブル作ったらとあるWarningが出てきたので調査して対応を考える

## でてきたWarningについて
```
21104 22:29:57 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. 
Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
```

意味としては、「TIMESTAMP型に暗黙的なデフォルト値を使うのは非推奨です。MySQLサーバの設定にexplicit_defaults_for_timestampを加えてください」って感じ。
explicit_defaults_for_timestampっていうオプションは5.6.6から追加された。

## 暗黙的なデフォルト値ってなに
デフォルト値を指定しないでTIMESTAMP型のカラムを作ると、`NOT NULL`になりデフォルト値に`CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP`が入る仕様のことを指している。
この挙動は5.6.6から非推奨となり、起動時に上記のWarningが出るようになった。

## explicit_defaults_for_timestampオプションってなに
上記の暗黙的なデフォルト値の挙動に関する設定をするオプション。訳としては「TIMESTAMP型の明示的なデフォルト値」
OFFにすると従来通り、デフォルト値を指定しなかったときに暗黙的にデフォルト値が定義されるようになる。
ONにすると暗黙的なデフォルト値は設定されなくなる。明示的にNOT NULLと指定しないとNULLも許可される。

## 対応について
`explicit_defaults_for_timestamp`オプションをONにする。
デフォルト値指定しないつもりが実は勝手に指定されてて想定と挙動が違ったなんてことがあったら嫌なので。

## 参考
- [MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.11.1.3 MySQL 5.5 から 5.6 へのアップグレード](https://dev.mysql.com/doc/refman/5.6/ja/upgrading-from-previous-series.html)