OmniAICreator/Qiita-1.07M huggingface dataset:
Tips : [R][bash] Rコンソール上で配列をシェルに渡して結果を記録する


　配列の操作を行っていると、Rやpython、シェルとなかなか面倒な時があります。
　Rでは```system（command）```を使うとシェルを動かすことができます。
　効率的に仕事する上では便利なのでおすすめです。

　今回は```system（command）```を使ってベクターに格納した塩基配列リストをbashに渡してシェルの上の処理結果をデータフレーム内に記録する方法を紹介します。

（計算に使うoligotmの入手は「補足：oligotmの入手」を参照してください。）

一種類の配列を処理する
---

　まず計算はbash上で次のようにできます。

```bash
./oligotm AATTGGCGT
```

　出力

```
22.860107
```

　簡単ですね。
　R上でも```system("")```をつけるだけで同様の処理が可能です。
　作業ディレクトリを移動しておいて次のコマンドを入力します。

```r
>system("./oligotm AATTGGCGT")
22.860107
```

　できましたね。
　さらに、出力された値を変数に格納する場合は```intern=TRUE```とします。

```r
>value=system("./oligotm AATTGGCGT", intern = TRUE)
>value
[1] "22.860107"
```

複数の配列を処理する
---

　それではここまでの内容を踏まえて、複数の配列を処理できる関数を導入します。
　まず以下の関数を読み込んでください。

```r
#配列をシェルに渡して結果を記録する
#@param {vector} seqlist : 配列のリスト
#@return {dataframe} table : 配列と解析結果の一覧
retriveShellout=function(seqlist){
  #引数チェック
  if(!is.vector(seqlist)){
    warning("argument ‘seqlist’ is wrong type.")
    return()
  }
  for(seqIndex in 1:length(seqlist)){
    input=seqlist[seqIndex]
    #シェルコマンドと配列を文字列として結合　※この部分は各自変更
    output=system(paste("./oligotm", input, sep = ' '), intern = TRUE)
    if(seqIndex == 1){
      table=DataFrame(sequence=input, value=output)
    }else{
      table=merge(table, DataFrame(sequence=input, value=output), by=c("sequence", "value"), all = TRUE)
    }
  }
  return(table)
}
```


　実行例
---
　入力

```r
>retriveShellout(c("AATTGGCGT","CCTCGACATG"))
```
　出力

```r
DataFrame with 2 rows and 2 columns
     sequence       value
  <character> <character>
1   AATTGGCGT   22.860107
2  CCTCGACATG   22.612608
```

　できました。

　```output=system(paste(...), intern = TRUE)```周辺を改変すれば色々な処理をすることができると思います。
　よろしければご利用ください。

補足：oligotmの入手
---
　以下のページからprimer3のソースコードを入手します。

https://sourceforge.net/projects/primer3/

　解凍したら、bash上でカレントディレクトリを変更

```cd [...]/Downloads/primer3-2.3.7/src```

　コンパイルを行います。事前にgccコンパイラが使える環境にしておいてください。
　環境が整っていれば以下のコマンドをbashで叩けばでコンパイルできます。
```make all```

　もしかしたら

```clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]```

とでることがあるかもしれませんが無視して問題ないと考えます。

　コンパイルが無事完了すれば、カレントディレクトリ上にoligotmという名前のバイナリファイルができているはずです。
　そのファイルを作業ディレクトリにコピーしておいてください。
　oligotmは単体で動作するので他のファイルは必要ありません。

　以上

参考
---

http://qiita.com/suimye/items/123f722e263d63862ee8

コードの利用について
---
　ご自由にお使いください。
[備忘録]vagrantでOracleインストール&SQL Developerで接続する

#【概要】
vagrant+virtualboxで仮想環境を作成し、それにOracleをインストールしてゲストマシンからSQL Developerで接続する。

#【環境】
・ゲスト環境
　windows8.1
　Vagrant 1.9.1
　VirtualBox 5.1.22 r115126
　SQL Developer 4.1.5.21
　ホスト環境接続用 → Putty

・ホスト環境
　CentOS6.5

#【Oracleインストール方法】
(0)vagrantとvirtualboxをインストール。
(1)vagrantでホスト環境を作成する。
　(超簡単に説明すると、ネットからCentOSのboxダウンロードして、vagrantにaddしてupする)
　(VagrantfileのIPアドレス`config.vm.network "private_network", ip: "192.168.33.10"`)
(2)Puttyでホスト環境に接続する。

![putty.png](https://qiita-image-store.s3.amazonaws.com/0/121997/b987e219-5b4e-f3ad-62ea-7a242779dcbc.png)

(3)下記サイトの通りにコマンド実行する。
　[Varagnt 環境の CentOS 6.6 に Oracle XE(11g Release 2) を導入してみる](http://qiita.com/murachi1208/items/36a226c40fdb8436ec7a)
　ただし、「Varagnt環境の設定」は無視。「ユーザーを作成、テーブルの作成」まで実施。
　`/etc/init.d/oracle-xe configure` でインストールエラーになったが、/etc/hostsファイルにホスト名を追記すれば成功した(127.0.0.1の行の最後にホスト名を追記)。

```text
[root@vagrant-centos65 vagrant]# hostname
vagrant-centos65.vagrantup.com
[root@vagrant-centos65 vagrant]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 vagrant-centos65.vagrantup.com
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@vagrant-centos65 vagrant]#
```
(4)oracleユーザでログインしたときに`sqlplus`コマンドが使えるようoracleユーザのホームディレクトリの.bash_profileに下記を書き込む。
　`. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh`
　ただし、ルートユーザからoracleユーザにログインするときは`su`コマンドにハイフンを付けて`su - oracle`でログインしないと、.bash_profileが読み込まれず`sqlplus`コマンドが使えない。

#【SQL Developerから接続方法】
(0)SQL Developerをインストール。
(1)左側にある接続ビューから「接続」→「接続の作成」を選択。
(2)下記画像を参考に接続設定をする。
　(usr01ユーザとsystemユーザで接続できるように2つ作成した)
![usr01.png](https://qiita-image-store.s3.amazonaws.com/0/121997/14bb5da4-dbf9-2eca-9049-480c39d8dcfc.png)
　　
![system.png](https://qiita-image-store.s3.amazonaws.com/0/121997/c4c9617b-1761-2817-40b3-837150960d66.png)
　　
(3)接続ボタンを押してSQLワークシートに適当なSQL書いて実行して結果が出ればOK!
　実行SQL例：`select sysdate from dual;`
　　
#【補足】
ターミナルからログインしてsqlplusコマンドを使用するときは下記のとおりに実行する。
`sqlplus usr01/usr01@xe`

sysユーザでログインするときは下記コマンドを使用する。
`sqlplus sys/[パスワード]@xe as sysdba`

sysユーザでsqldeveloperを使ってログインする時はロールを「SYSDBA」に変更してから接続する。
JavaScriptで一定時間ごとに実行する処理を短く書く

# コード
```js
(function loop() {
  // 処理を書く
  setTimeout(loop,1000);
})();
```
※loopはなんでもいい
## カウントする
```js
var i = 0;

(function loop() {
  i++;
  console.log(i);
  setTimeout(loop,1000);
})();
```

## 繰り返し回数を指定する
```js
var i = 0;
var time = 10;

(function loop() {
	i++;
	console.log(i);
	if (i<10) {setTimeout(loop,1000);}
})();
```
Swift3でUIViewをViewの中心に配置する方法

# 実装

```swift
class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        
        let TestView = UIView()
        TestView.frame = CGRect(x:50,y:50,width: 250,height:250)
        TestView.backgroundColor = UIColor.purple
        TestView.center = self.view.center
        self.view.addSubview(TestView)
        
    }
```

# 実行結果

<img width="280" alt="スクリーンショット 2017-05-27 18.11.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/05b91c69-d213-7670-a785-b012bb12ae53.png">

# 参考

[Swift3でUIViewをViewの中心に配置する方法](http://off.tokyo/blog/2017/05/27/swift3%E3%81%A7uiview%E3%82%92view%E3%81%AE%E4%B8%AD%E5%BF%83%E3%81%AB%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
Swift3でUILabelをViewの中心に配置する方法

# 説明

基本的に`title.center = self.view.center` でセンターに設定していますが`title.textAlignment = .center` が抜けると真ん中じゃ無くなるので注意です。

# 実装

```swift
import UIKit


class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        
        let title = UILabel()
        title.text = "真ん中だぜ"
        title.frame = CGRect(x:50,y:50,width: 250,height:250)
        title.textAlignment = .center


        title.center = self.view.center
        //title.center.x = self.view.center.x
        //title.center.y = self.view.center.y
        self.view.addSubview(title)
        
    }
```

# 実行結果


<img width="280" alt="スクリーンショット 2017-05-27 18.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/51ad76cc-73f6-d57c-bd0b-4094ee6917cd.png">

# 参考

[How to center UILabel in Swift?](https://stackoverflow.com/questions/34645943/how-to-center-uilabel-in-swift)

[Swift3でUILabelをViewの中心に配置する方法](http://off.tokyo/blog/2017/05/27/how-to-center-uilabel-in-swift/)
CentOS7でブラウザアクセスするまで

短い内容ですが、他の記事から引用できるよう別にしました。
Selinux無効化と80ポートを開ける方法の説明です。
httpdは既に入っているものとして進めます。

#Selinuxを無効化
getenforceでDisabledになっていなければ無効化されていません。
```# getenforce```

次にSELINUX=disabledに書き換えます。
※誤ってSELINUXTYPEを変えると起動しなくなります。
```# vi /etc/selinux/config```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/183427/b79d8ecb-764d-27d6-9021-195538bd7f50.png)

再起動してdisabledになっていれば成功！
```# reboot```

#port80を開ける
通常はブラウザからhttp://でアクセスすると80番ポートに行きます。
https://だと443番に行きます。

基本的にすべてのポートが閉じているので、ブラウザアクセスさせたい場合は、これらのポートを開ける必要があります。
```firewall-cmd --zone=public --add-port=80/tcp --permanent```
```firewall-cmd --zone=public --add-port=443/tcp --permanent```

開けたいポートの番号を指定すれば開きます。
例えばMySQLなら3306番を開ける必要があります。

開けたらリロードします。
```# firewall-cmd --reload```

以下で確認してポートが開いていれば成功です。
```# firewall-cmd --list-all```

以上です。
リモートブランチの git checkout を peco で簡単にする

Pull Request のレビュー時などリモートブランチを落としてくる際、毎回ブランチ名をコピペしてチェックアウトするのが地味に面倒なので peco でブランチを選択するだけでチェックアウトできるようにしました。

![git-checkout-by-peco.gif](https://qiita-image-store.s3.amazonaws.com/0/59802/2211c47f-687a-f01e-bc57-5881086724f1.gif)

## コマンド

```bash
git checkout $(git branch -a --sort=-authordate | cut -b 3- | grep -v -- "->" | peco | sed -e "s%remotes/origin/%%")
```

( 上の動画では [oh-my-zsh のコマンドエイリアス](http://jasonm23.github.io/oh-my-git-aliases.html) で git コマンドを短縮しています )

## 追記 (2019/01/16)

コマンドをちょっと改良しました。

```bash
git branch -a --sort=-authordate | grep -v -e '->' -e '*' | perl -pe 's/^\h+//g' | perl -pe 's#^remotes/origin/##' | perl -nle 'print if !$c{$_}++' | peco | xargs git checkout
```

変更点:

- リモートブランチとローカルブランチをまとめて表示するようにしました。
- peco を `CTRL-C` などで中断した場合、そこでコマンドを終了するようにしました。 (`git checkout` を走らせない)
- GNU / BSD 環境を気にせず使えるようにする為に Perl を使うように置き換えました。

エイリアスを設定したい場合は .bashrc や .zshrc などに以下の関数定義を追記すれば `gcop` でブランチを選択できるようになります。<font color="crimson">g</font>it <font color="crimson">c</font>heck<font color="crimson">o</font>ut <font color="crimson">p</font>eco の略ですがお好みで。

```bash
gcop() {
  git branch -a --sort=-authordate |
    grep -v -e '->' -e '*' |
    perl -pe 's/^\h+//g' |
    perl -pe 's#^remotes/origin/##' |
    perl -nle 'print if !$c{$_}++' |
    peco |
    xargs git checkout
}
```

## パイプ中の各コマンドの解説

### `git branch -a --sort=-authordate`

リモート追跡ブランチも含めたブランチ名の一覧を、ブランチの鮮度順に逆順ソートした状態で取得します。

### `grep -v -e '->' -e '*'`

以下の2パターンの行を取り除きます。

- origin/HEAD の向き先が含まれている行:
  - e.g. `origin/HEAD -> origin/master`
- カレントブランチの行:
  - e.g. `* develop`

### `perl -pe 's/^\h+//g'`

各行頭のスペースを削除します。

### `perl -pe 's#^remotes/origin/##'`

`#` はデリミタです。（スラッシュのエスケープ地獄を回避するためにスラッシュ以外をデリミタに使用。）

リモート追跡ブランチ名の先頭には `remotes/origin/` が付きますが、これを含めた状態でそのままチェックアウトすると、ローカルブランチが作成されず、いわゆる detached HEAD な状態になってしまい不便なので取り除きます。

### `perl -nle 'print if !$c{$_}++'`

ソートせずに重複行を取り除きます。

### `peco`

[ぺこ。](https://github.com/peco/peco)
デザインパターン学習メモ：「Observer」

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

> あるオブジェクトが状態を変えたときに、それに依存するすべてのオブジェクトに自動的にそのことが知らされ、また、それらが更新されるように、オブジェクト間に一対多の依存関係を定義する。

別名、Publish-Subscribeパターン。

使用例としては、GoF本の例を借りると、グラフィックユーザインタフェースツールキットが挙げられる。

あるデータが変更された時に、リアルタイムでバーチャートやスプレッドシートを表現するオブジェクトに通知を行い、表示を変更することができる。

通知する側を"Subject"、通知される側を"Observer"と呼び、SubjectにObserverを登録しておくと、Subjectに変更があったときに自動的に通知がされる。

Subjectは登録されているオブジェクトの詳細は把握せず（Observerインタフェースを持つことしか知らない）、SubjectとObserverは密に結合しない。


## 実装例

```java:Subject.java
public interface Subject {
	void attach(Observer observer);

	void detach(Observer observer);

	void notifyObservers(); // "notify"はObjectクラスで使用済みだった

	// observerへのnotify後、observerによって呼び出される
	// 戻り値の型は適切な型に変更する
	Object getState();
}
```

```java:SubjectImpl.java
public class SubjectImpl implements Subject {
	List<Observer> observers = new ArrayList<Observer>();

	@Override
	public void attach(Observer observer) {
		observers.add(observer);
	}

	@Override
	public void detach(Observer observer) {
		for (int i = 0; i < observers.size(); i++) {
			if (observers.get(i) == observer) {
				observers.remove(i);
			}
		}
	}

	@Override
	public void notifyObservers() {
		observers.forEach(observer -> observer.update(this));
	}
	
	@Override
	public Object getState() {
		// 適切な処理を実装する
		return null;
	}
}
```

```java:Observer.java
public interface Observer {
	void update(Subject subject);
}
```

```java:ObserverImpl.java
public class ObserverImpl implements Observer {

	@Override
	public void update(Subject subject) {
		Object object = subject.getState();
		// 適切な処理を実装する
	}
}
```

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
Rのデータフレームを交差検証用にK個に分割する - cvTools編

(1) cvTools パッケージの [cvFolds](https://www.rdocumentation.org/packages/cvTools/versions/0.3.2/topics/cvFolds) を使って `cvFolds` クラスのオブジェクトを作る：

```{r}
n <- dim(df)[1]  # 分割元のデータフレーム df の行数を n に代入

library(cvTools)
folds <- cvFolds(n, K = 5) # ランダム5分割の例
```

(2) 「どのfoldに属するかの integer vector」である `which` を使って、index管理用のデータフレームを作る：

```{r}
library(dplyr)
indices <- as.data.frame(list(fold = folds$which)) %>%
  mutate(idx = row_number())
```

(3) `indices` から所望のfoldでフィルタしたidxを使って df をフィルタする：

```{r}
df[(indices %>% filter(fold == 4))$idx,]  # 4番目のfoldを取り出す例
```
8. FUJITSU K5 PaaS GitHub Enterprise を使ってみる

このページは、
FUJITSU Cloud サービス K5 を使ってみる - Qiita
http://qiita.com/ynott/items/a256669c692625c5fd25
の「8. FUJITSU K5 PaaS GitHub Enterprise を使ってみる」のページです。

7 まででFUJITSU K5 PaaS GitHub Enterprise が利用できるように連絡がきていると思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/25eb4738-5688-450b-8881-5b2a9d127329.png)
※個別のIDとかは伏せ字にしてます。

# 1. ログイン画面 
アクセスすると、ログイン画面が出てきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/e39bde4c-15dd-cd86-2050-059d79b70377.png)

# 2. ログイン後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/a0a21bc9-89f3-3c68-094b-79b7a9719d17.png)

あまりにも普通なので取り立てて特筆することはありません。
特筆するべきことがなさすぎるので、GitHub Enterprise を利用する意味をちょっと考えてみました。

# 3. K5 PaaS GitHub Enterpriseを利用する意味

GitHubに慣れている人には、あまりにも普通すぎるこのサービスですが、
「GitHubの有料サービスを使えばいいんじゃないの？」
「GitHub Enterprise買えばいいじゃん」
という声も聞こえてきそうです。
確かにユーザー課金というところは違わないですし、それどころか基本料金も必要です。
価格的な優位性は見いだしづらいところです。

しかし、「ソースコードが保管されている場所は日本国内です」と言えた方が、中規模以上の会社では話が通りやすいのではないかと思います。
＃そんなんじゃ、AWS とかクラウドを使えないという話はあります...。

もう一つは、GitHub Enterpriseを自前で運用しなくていい便利さ、だと思います。
使ってみた感想は、「あまりにも普通」というものですが、その普通は
http://jp.fujitsu.com/solutions/cloud/k5/document/pdf/k5-github-function-overview.pdf
によると、「デフォルトで冗長構成」がとられる。バックアップもお任せできる。
ダウンロードトラフィックも追加料金無しの明瞭会計なので、課金におびえる必要もなし！(笑)
という便利なものです。

ついでに言うと、今後のバージョンアップとかも自動でやってもらえるようになっていれば、ホントにメンテナンスフリーで使える GitHub Enterprise が手に入るということになります(実際どうなるかは分からないですが)。アップデートの手間も馬鹿になりませんからね。

こういったことを考えると、
月額基本料金：5万円/月
ユーザー料金：3000円/アカウント・月
は、「インフラ込み」の「管理費込み」の値段と考えると、実はそう高くないのではないかと思います。
【ubuntu16.10】AndroidStudioインストール



##【参考URL】

- [公式 Android Studio のインストール](https://developer.android.com/studio/install.html)
- [Qiita Ubuntu にAndroid Studio をインストールする](http://qiita.com/TsutomuNakamura/items/ef4aeec32cdaaf9105cc)
基本的にこのQiitaの記事に沿ってインストールしました。


## 
Javaのインストール

### AndroidStudioの中にjreがバンドルされているようなので必要ないかもしれません
[apt-getを使ったjavaのインストール](http://www.linuxmania.jp/apt-install-java.html)
ここを参考に、
```
$java -version
$sudo apt-get install defalut-jre
$javac -version
$sudo apt-get install defalut-jdk
```
ここのapt-getでopenjdkをインストールしたようなので、AndroidStudioのインストールに移る


## zipファイルを公式からダウンロード
[Android Studio](https://developer.android.com/studio/index.html)

##unzipをする場所がわからない件
公式では(下記リンク)/user/localか/opt/とのこと
/opt/に解凍してみる
→しかし.Androidstudio2.3は/home/username/に保存されてしまう。
→SDKも/opt/内に置こうとしたところ権限がないためエラーになってしまう

## 結局、/home/username/Programfiles/を作りその中にzip解凍
AndroidSDKもProgramfiles内においてみた

解決できたわけではないので、
このまま動かして不具合があればリポートしようと思います。

### umakeについて

いくつかの記事を参考にやってみたが、インストールできなかったです。
原因がわからないですが、一応記載しておきます。
RailsでWeb Appを作ろう 01

# RailsでWeb Appを作ろう 01
## Install
OSXの環境であるので、RubyがSystem Nativeだと古いため　　
rbenvで必要なバージョンのrubyをインストールする。　　
インストールしたrubyにパスを通して、使用するRubyの対象をインストールしたRubyに変更する　　
gemをインストールして、Railsをgem installで入れる
## Railsでsampleサイトを作ってみる 途中で失敗
```
 rails new sample
 cd sample
 rails generate scafford
```
3行目でフリーズ。
どうも何回か試していてspringのgemが常駐しておりそれが邪魔しているよう
springをkillして、MVC一個ずつ作ることに方針変更    
## Railsでsampleサイトを作ってみる 成功
``` 
 ps aux | grep spring | grep -v grep
 kill process_id
 rails generate controller myapp index
 rails generate model myapps
 rake db:migrate RAILS_ENV=development
```  
これでテンプレのページができた！
## sampleサイトの動作確認

```
 rails s
```
で起動することを確認。任意のBrowserで`http://localhost:3000/myapp/index　`にアクセス

![スクリーンショット 2017-05-27 16.52.13.png](https://qiita-image-store.s3.amazonaws.com/0/181375/de6d6eae-8086-f551-8c4d-3953513647a5.png)

ここから画面を作っていきます。
---
参考ページ  
http://railsdoc.com/rails　　
http://qiita.com/yokozawa/items/7b92c260f8c3dfec8e28  http://qiita.com/AbeRyuki/items/b3b77a0b0270c0309360
http://www.rubylife.jp/rails/
Swift3でViewController（デバイス）のサイズを取得する方法



# 実装

```swift
let bounds = UIScreen.main.bounds
        let width = bounds.size.width
        let height = bounds.size.height
        
        print(width)
        print(height)
```

# 参考

[How to get device width and height?](https://stackoverflow.com/questions/24084941/how-to-get-device-width-and-height)

[Swift3でViewController（デバイス）のサイズを取得する方法](http://off.tokyo/blog/2017/05/27/swift3%E3%81%A7viewcontroller%EF%BC%88%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%EF%BC%89%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
Mac | ターミナル最後のコマンドをコピー&ペーストする


# エイリアス登録

```:~/.zshrc
setopt hist_no_store
alias last-command="history | tail -n 1 | awk '{ \$1=\"\"; print \$0 }' | sed 's/ //'"
alias pbcopy-last-command="last-command | pbcopy"
```

# 反映

```
source ~/.zshrc
```

# 実行

適当なテキストエディタとかにペースト。

```
＄ echo "a b c d"
$ pbcopy-last-command
```

# 検証

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8d8669a3-772e-3f92-e843-231363afdf9d.png)

# 環境

- Mac OSX 10.12.5



# リンク

- [Mac — pbcopy ( copy and paste ) your last command on terminal](https://medium.com/cyber-city-never-sleeps/mac-pbcopy-copy-and-paste-your-last-command-on-terminal-506bd68a731d)
- [zsh — echo last command – cyber-city-never-sleeps – Medium](https://medium.com/cyber-city-never-sleeps/zsh-echo-last-command-99ab7037b530)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
読みたいサイト/本メモ帳

# 概要


# 一覧
## プログラミング系
### Ruby
 * パーフェクトRuby
 * パーフェクトRubyOnRails
 * メタプログラミングRuby

### Python
 * [Automate the Boring Stuff with Python](https://automatetheboringstuff.com/)
    * [動物図鑑発売書店から6/3に発売されるらしい。](https://www.oreilly.co.jp/books/9784873117782/)
    * pythonを学ぶモチベがほぼ無い(その前に業務にひつよな言語を覚える必要はある)ので、そのうち
 * ゼロから始めるDeep Learning
    * DLは興味あるので、やりたい。
    * 途中まで読んでニューロンを理解して放置。
    * 特性関数は(-∞,∞)->(0,1)の写像で、特段連続だとか微分可能だとかは考えなくていいんだけど、ベストプラクティスが1/(1+exp(-x))だということを教えてもらった。
Swift3 - コードからUIViewを生成する

superViewのsubViewとしてコードからUIViewを生成します

# 実装

```swift
 let TestView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 250, height: 250))
        let bgColor = UIColor.blue
        TestView.backgroundColor = bgColor
        self.view.addSubview(TestView)
```

# 全ソース

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        let TestView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 250, height: 250))
        let bgColor = UIColor.blue
        TestView.backgroundColor = bgColor
        self.view.addSubview(TestView)

        
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```

# 参考

[Swift3 – コードからUIViewを生成する](http://off.tokyo/blog/2017/05/27/howcanidynamicallyincreasethenumberofuiviews/)
ヘロンの公式の導出

三角形の3辺の長さを$a,b,c$とするとき，三角形の面積$S$は次のようになります．

$$
S=\frac{1}{4}\sqrt{(a+b+c)(-a+b+c)(a-b+c)(a+b-c)}
$$

この公式をヘロンの公式といいます．

## ヘロンの公式の導出

$a$と$b$の間の角度を$\theta$とすると，余弦定理より$c^2=a^2+b^2-2ab\cos\theta$となります．面積$S$は$S=\frac{1}{2}ab\sin\theta$なので，$S^2$は次のように求まります．

```math
\begin{eqnarray}
S^2&=&\frac{1}{4}a^2b^2\left(1-\cos^2\theta\right)\\
&=&\frac{1}{4}a^2b^2\left(1-\left(\frac{a^2+b^2-c^2}{2ab}\right)^2\right) \\
&=&\frac{(2ab)^2-(a^2+b^2-c^2)^2}{16}\\
&=&\frac{(2ab+a^2+b^2-c^2)(2ab-a^2-b^2+c^2)}{16} \\
&=&\frac{1}{16}\left((a+b)^2-c^2\right)\left(c^2-(a-b)^2\right)　\\
&=&\frac{1}{16}(a+b+c)(a+b-c)(a-b+c)(-a+b+c)
\end{eqnarray}
```

上の変形で因数分解をする際には$X^2-Y^2=(X+Y)(X-Y)$という公式を用いました．

## sを使った表示

$s=\frac{1}{2}(a+b+c)$とおくとヘロンの公式は次のように表せます．

$$
S=\sqrt{s(s-a)(s-b)(s-c)}
$$

## 基本対称式を使った表示

$s_1=a+b+c$，$s_2=ab+bc+ca$，$s_3=abc$とおくと．ヘロンの公式は次のように表せます．

$$
S=\frac{1}{4}\sqrt{(-s_1^3+4s_2s_1-8s_3)s_1}
$$

この形を見ても，三角形の面積だとは，私には思えないです．

## 辺の長さの2乗を使った表示

$A=a^2$，$B=b^2$，$C=c^2$とおくと，ヘロンの公式は次のように表せます．

```math
\begin{eqnarray}
S&=&\frac{1}{4}\sqrt{2(AB+BC+CA)-(A^2+B^2+C^2)} \\
&=&\frac{1}{4}\sqrt{A(B+C-A)+B(C+A-B)+C(A+B-C)} \\
\end{eqnarray}
```

導出は，次のようにします．
ヘロンの公式の導出の途中にあった$S^2=\frac{(2ab)^2-(a^2+b^2-c^2)^2}{16}$から始めます．

```math
\begin{eqnarray}
16S^2&=&4AB-(A+B-C)^2 \\
&=&4AB-A^2-B^2-C^2-2AB+2AC+2BC \\
&=&-(A^2+B^2+C^2)+2(AB+BC+CA)
\end{eqnarray}
```

以上です．
一部のViewControllerだけに機能を追加するのにprotocol extensionが便利だった話


# 初めに
最初のリリースから数年程度が経過し細々とした機能追加を行っているようなプロジェクトで、

**全体で50個くらいあるViewControllerのうち3つにだけ全く同じ機能を追加したい。
ただし、その3つのViewControllerは別々のスーパークラスを継承している。**

という状況に陥った。
こんなときにSwiftのprotocol extensionがとても便利だった。

# 機能追加前の状態

こんな感じでViewControllerがたくさんあり、
このうち`ViewController2` と `ViewController4` だけに新たな機能を追加したい。
また、その追加する機能の中で`UIViewController`で定義されたpropertyやmethodにアクセスしたい。


```swift

import UIKit

class ViewController1: UIViewController {
}

class ViewController2: UIViewController {
}

class ViewController3: UIViewController {
}

class ViewController4: UIViewController {
}

class ViewController5: UIViewController {
}
```

# 考えたこと
今更共通のスーパークラスを作ってそれを継承させるなんてありえない。`is-a` 的な扱いをしたい部分でもないし。
`UIViewController` のextensionを作ってもいいのだが、そうすると関係ないViewControllerにまで不要な実装が混じってしまって気持ち悪い。
それ用のclassを作って処理を委譲するのもいいがもう少しスマートなやりかたはないものか。

# やったこと

まず、以下のように追加したい機能を持つprotocolを作成する。

```swift
protocol NewFeature {
    func newFunction()
    var isFantastic: Bool { get }
}
```

次に、このprotocolのデフォルト実装をもつextensionを作成する。
このとき、実装されるclassがUIViewControllerに限定されるようにする。

```swift
extension NewFeature where Self: UIViewController {
    func newFunction() {
        // UIViewControllerのpropertyやmethodが使える
        guard 0 < view.subviews.count else {
            print("Viewが空だ")
            return
        }
        
        if isFantastic {
            print("最高だ")
        } else {
            print("最高でない")
        }
    }
}
```

最後に、機能追加したいViewControllerだけこのprotocolを実装する。
ここでは`ViewController2` と `ViewController4` の2つ。

```swift
import UIKit

// newFunction の中で使っているpropertyの実装は各ViewControllerごとに独自で定義できる。

class ViewController1: UIViewController {
}

class ViewController2: UIViewController, NewFeature {
    var isFantastic: Bool {
        return parent != nil
    }
}

class ViewController3: UIViewController {
}

class ViewController4: UIViewController, NewFeature {
    var isFantastic: Bool {
        return childViewControllers.count == 0
    }
}

class ViewController5: UIViewController {
}
```

これで、必要なViewControllerだけが`newFunction` を見ることが出来る状態になった。
しかもextensionを使う場合と異なり、それぞれのViewControllerごとに振る舞いを変えたい部分だけデフォルト実装を持たせないようにすることで実装する側で柔軟に振る舞いを変えることが出来る。

# 終わりに
Swiftではこれが一番スマートなやり方な気がする。
もっと良さそうなやり方があったらご教示ください。
16進文字列をバイナリに変換

16進数文字列をバイナリにしてバイナリファイルに書き込む

**[方法１] to_bytes()を使う**
　エンディアンを変更したい場合があるため、
文字列 → int → bytes(binary)の順で行う。

```str_to_bin.py
moji = '01020304'
suuchi = int(moji,16)

bytes_big = suuchi.to_bytes(4, byteorder='big')
bytes_little = suuchi.to_bytes(4, byteorder='little')

print(bytes_big)
print(bytes_little)

wf = open('write_test.bin', 'wb')
wf.write(bytes_big)
wf.write(bytes_little)
```

**print結果**

```
16909060
b'\x01\x02\x03\x04'
b'\x04\x03\x02\x01'
```

**[方法2]**
　文字列 → int → bytes(binary)の順で行う。
　to_bytes()はpython3でしか使えないため、structを使う。

```str_to_bin_2.py
import struct

moji = '01020304'
suuchi = int(moji,16)

bytes_big =struct.pack(">L",suuchi)
bytes_little =struct.pack("<L",suuchi)
```

**[方法3]**
エンディアン変換しない場合は、以下で文字列→bytes(binary)に変換でもよい。

```str_to_bin_3.py
moji = '01020304'
moji_bin = binascii.unhexlify(moji)
```

以下参考リンク

[Pythonで16進数を扱う](http://kaworu.jpn.org/python/Python%E3%81%A716%E9%80%B2%E6%95%B0%E3%82%92%E6%89%B1%E3%81%86)
[Python | 2の補数 (signed) int ⇔ bytes ⇔ str (16進文字列)](http://pichaelle.hatenablog.jp/entry/2016/12/17/005949)
[Pythonで 数値 -> バイナリ -> 16進文字列 -> バイナリ -> 数値への変換。](https://gist.github.com/devlights/ff14ad78ec2a2ace8b13304976c5c355)

[7.1. struct — バイト列をパックされたバイナリデータとして解釈する]
(https://docs.python.jp/3/library/struct.html)
[19.8. binascii — バイナリデータと ASCII データとの間での変換](http://docs.python.jp/3/library/binascii.html)
7. FUJITSU K5 PaaS GitHub Enterprise を申し込む

このページは、
FUJITSU Cloud サービス K5 を使ってみる - Qiita
http://qiita.com/ynott/items/a256669c692625c5fd25
の「7. FUJITSU K5 PaaS GitHub Enterprise を申し込む」のページです。


「K5 を使ってみる」の元々の目的は、K5 の PaaS である GitHub Enterprise を使ってみたいと思ったからでした。

結論から言うと、何も問題はありませんでした。

# 1. GitHub Enterprise を申し込む

K5 Portal にログインします。その後、PaaSポータルを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/60d3c659-15c4-df17-3cc8-0f480a6dcafe.png)

こんな画面がでます。

次がちょっと分かりにくいのですが(私は迷いました)、「サービス」から「開発支援」を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/e1f8b36a-18f1-56a4-f6c6-c85ccbe7d850.png)

すると、おなじみのOctocatのアイコンがでてきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/e329d2b6-bc7e-9062-7d50-d764452c8a62.png)

このアイコンをクリックすると。。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/b6d463e0-8836-525a-5faf-f53b7f79e46b.png)

# 1-1. 利用申し込み
この画面がでてきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/2708ec2f-ed0e-4614-8728-419a2dcec404.png)

規約を見て「利用申し込み」するだけなのですが、
その前にサービスグループを作っておく必要がありました。
（上記サービスグループ、サブサービスグループの所です）

# 2. サービスグループの作成
このサービスグループとは、「4. K5 使うのに戸惑ったこと - Qiita」
http://qiita.com/ynott/items/5c9b9f5a31e2f28bdd41

で解説した右上の緑の部分のことです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/d593f58c-6b98-7542-ded2-2b023ced0876.png)

K5 には複数のPaaSサービスがあるので、それぞれのPaaSサービスを使える人を限定することができます。その特定のPaaSの利用者をまとめるためのグループが PaaSサービスグループです。

# 2-1. グループを作る
ログインアカウント名をクリックして、「サービスグループ情報一覧」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/8605838c-9e20-1d84-84c2-0fda3c6df1b9.png)

するといきなり次の画面がでてきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/c36a8dd5-102d-6dd6-0b76-c0849a24a095.png)

適当に「GitHub利用者グループ」とかつけておきましょう。サブサービスグループは必須項目です。グループAとかにしておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/c99e8bee-58b2-2acd-1c36-21b73b16cc78.png)

# 3. 再度利用申し込み
再度申し込みしてみると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/96ca2eaf-099e-24f7-8f47-925e3a90beda.png)
グループとサブグループが入ってますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/726ae346-e9fa-d432-1a9c-545320c57b3d.png)
規約を全てスクロールして、チェックの上「利用申し込み」を押しましょう！

申し込みがすんだら、K5 PaaS の中の小人さんが、せっせとセットアップしてくれます。

セットアップ終了の連絡があるまで待っていましょう。

# 4. 使ってみた感じ

GitHub を使っている人にとっては**全く**違和感がないことでしょう。
＃当然と言えば当然なのですが。。

つぎの「利用編」で、K5 PaaS GitHub Enterprise について書いてみたいと思います。
[8. FUJITSU K5 PaaS GitHub Enterprise を使ってみる](http://qiita.com/ynott/items/0391245e5444cd95cc9a)
Cloud9 で phpmyadmin を開こうとしたら Routing Error が出た時。

ちょっとだけ、ハマったので、メモ。

これは、

phpmyadmin-ctl install

がエラーで、こけているのも関わらず、アクセスしようとした時の起きます。

ポートが Rails のサーバと被っているのが原因のようなので、

Rails のサーバを止めて、再度、

phpmyadmin-ctl install

を実行し、正常に phpmyadmin が起動すれば、アクセスでいるようになります。
Laravel5.7: ページネーションの機能を追加する

下記のように、1ページに表示する投稿数を限定して、ページを切り替えるリンクを設置します。

![pagination.png](https://qiita-image-store.s3.amazonaws.com/0/27816/29c5f1de-3939-4be5-590a-ffec7b533920.png)


# 親記事
[Laravel 5.7で基本的なCRUDを作る - Qiita](http://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# indexアクションにページネーションを追加
:link: readouble.com: [ペジネーション](https://readouble.com/laravel/5.7/ja/pagination.html)

## コントローラ
各コントローラのindexアクションを下記のように修正します。
今回は1ページに5件表示するようにします。

```diff:app/Http/Controllers/UserController.php
    // ユーザー
    public function index()
    {
-       $users = User::all();
+       $users = User::paginate(5);
```

```diff:app/Http/Controllers/PostController.php
    // 投稿記事
    public function index()
    {
-       $posts = Post::latest()->get();
+       $posts = Post::latest()->paginate(5);
```

## ビュー
それぞれ、Bootstrapの`.container`の終了タグの直前にページリンクを設置します。

```php:resources/views/users/index.blade.php
    {{ $users->links() }}
</div><!-- .container の終了タグ -->
```

```php:resources/views/posts/index.blade.php
    {{ $posts->links() }}
</div><!-- .container の終了タグ -->
```

見た目を細かく変更したい場合は、公式解説でも勧めているとおり`vendor:publish`コマンドを使うのがいいと思います。
:link: readouble.com: [ペジネーションビューのカスタマイズ](https://readouble.com/laravel/5.7/ja/pagination.html#customizing-the-pagination-view)
アプリがクラッシュした時にlogcatが一瞬で消えてしまうときの対処法

# 環境
Android Studio 2.3 （で確認したというだけで、他でも同じかと思います）

# 現象
何らかの原因でアプリがクラッシュした時に、通常はクラッシュを引き起こした例外のスタックトレースが Android Monitor の logcat に表示されるため、より詳細な情報を得られたり例外を引き起こしたコードに直接ジャンプしたるすることができる。
しかし、稀にスタックトレースが logcat に表示された直後に logcat がリフレッシュされ、スタックトレースを確認できないことがある。

# 原因
これは、 Android Studio の logcat の filter の設定が `Show only selected application` になっているためである。
この設定は選択されているプロセスのログのみを表示するということを意味するため、アプリがクラッシュして別のプロセスに選択状態が移ると、クラッシュしたプロセスのログが表示されなくなってしまう。

# 対処法
filter の設定を一時的に `No Filter` にして全てのログを表示するか、 `Edit Filter Configuration` で自身のアプリのパッケージ名に一致するログのみを表示するフィルタを作成して使用するとよい。

![No Filter](https://qiita-image-store.s3.amazonaws.com/0/138290/73083f13-cf9b-d534-215f-a746b6fb6bea.png)

![Custom Filter Configuration](https://qiita-image-store.s3.amazonaws.com/0/138290/e9ffd94b-4d15-15c8-719a-43a97e66721b.png)


参照: https://stackoverflow.com/a/31040015
【Rails】.pluckと.joinでモデルの中身を一覧表示する

# 地味にうまくいかない一覧表示
チャットアプリの作成が一通り完成し、見た目を微修正している私です。
下図のようにチャットメンバーを一覧表示したかったのですが、地味になかなかうまく表示されなかったのでメモしておきます。

完成形
><img width="202" alt="スクリーンショット 2017-05-27 13.47.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/48a47686-df88-8a1a-6275-4cebfea184de.png">

# とりあえず@usersのみ置く

```edit.html.haml
      Members:
      = @users
```
こうなる。
><img width="522" alt="スクリーンショット 2017-05-27 13.48.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/200d8c51-2f2d-862f-9828-60b698386d3e.png">


# .pluckを使ってみた
.pluckを使うとモデルの中の指定したカラムを配列で取得することができる。
なんだかラクで良さそうだ。今回は名前を一覧表示させたいので下記のように使ってみる。

```edit.html.haml
      Members:
      = @users.pluck(:name)
```

><img width="251" alt="スクリーンショット 2017-05-27 13.55.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/bd0462f0-c967-fb3f-5a59-2d5f89fafc20.png">

なんとも、惜しい感じ。配列で取れるので、["",]がただただ邪魔だ。なんとかならないものか。

ちなみに、.pluckでは複数のカラムも配列で取れるので覚えておきたい。

```edit.html.haml
      Members:
      = @users.pluck(:id, :name)
```
><img width="318" alt="スクリーンショット 2017-05-27 14.06.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/f5ae126b-b85f-05b9-4f0a-3aab1074343b.png">

# .joinを使ってみた
良さそうなものをみつけた。joinメソッドだ。
これを合わせ技として用いれば、今夜はなんだかイケそうな気がする。

> joinメソッドは、配列の各要素を文字列に変換し、引数sepを区切り文字として結合した文字列を返します。

要するに、配列の中身が全てずらーっと並んで文字列に変換されるということだ。
間に「,」を挟むという指定で使ってみると。

```edit.html.haml
      Members:
      = @users.pluck(:name).join(",")
```
><img width="204" alt="スクリーンショット 2017-05-27 14.15.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/179510/4cc3cb16-fa62-b7a4-753c-22a13e7fa7e9.png">

完成。
VSCodeのステータスバーの色を変える（v1.12〜）

VSCodeは白黒基調で非常にスタイリッシュだけど、ステータスバーの色がとても明るいのが気になる。
![VSCodebar.png](https://qiita-image-store.s3.amazonaws.com/0/103086/6c54a05a-b167-d463-fe0f-01b80c9fa5bc.png)

この色を変える方法。

`settings.json`の設定に、以下を追加する。（色はお好みで）

```json
...
    "workbench.colorCustomizations": {
        "statusBar.background": "#111111", // 通常のステータスバー
        "statusBar.noFolderBackground": "#777777", // フォルダ（プロジェクト）を開いていない状態
        "statusBar.debuggingBackground": "#CA0012" // デバッグ時
    },
...
```

> この設定はv1.12以前はexperimentalだったので、以下のように設定していた。

> ```json
    "workbench.experimental.colorCustomizations": {
        "statusBarBackground": "#111111",
        "statusBarNoFolderBackground": "#777777",
        "statusBarDebuggingBackground": "#CA0012"
    },
```

ちなみにこの設定はSeti UIに合わせたもので、色はそれぞれこんな感じ。
![vscodecolormono.png](https://qiita-image-store.s3.amazonaws.com/0/103086/580a5899-82a2-5464-dbb3-2b1e139947cc.png)

`background`は背景色で、文字の色を変えたければ`foreground`をいじれば良い。


色関連は他にも色んな設定があって、全部[Microsoftのページ](https://code.visualstudio.com/docs/getstarted/theme-color-reference)に書いてある。
[C#][LINQ] nullを除外する

よく使うのに検索にはひっかからなかったので一応メモ

# 実装方法
`Where` で null じゃないものを抽出する

```csharp:リストからnullを除外する
this.HogeList
    .Where(x => x != null);
```

Null除外専用の構文がないのか探したけども見当たらなかった

# 使用例

Rxで実装する時に、Subscribe内でifで除外するよりは、Whereで除外したほうが良い気がする
(以下の例は[ReactiveProperty](https://github.com/runceel/ReactiveProperty)を使用したものです）

```csharp:Rxでの利用
this.FileList
    .Where(x => x != null)
    .Where(x => x.Count > 0)
    .Subscribe(x =>
    {
        this.SelectedItem.Value = x[0];
    });
```
bundle install の SSL 証明書エラー対応

## TL;DR

http://railsapps.github.io/openssl-certificate-verify-failed.html

## 証明書エラー

bundle install すると, 以下のエラーが出た.

```
$ bundle install
Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
Fetching source index from https://rubygems.org/
Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA 
```

OpenSSl が OSX の古い証明書を参照しているようだ.

```
ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
```

上のコマンドで証明書の場所を確認.
証明書をアップデートすることに.

## 対処方法その一: rvm の場合

rvm を使っている場合は以下で対処可能とのこと.

```
rvm osx-ssl-certs update all
```

OpenSSL Errors and Rails – Certificate Verify Failed · RailsApps
http://railsapps.github.io/openssl-certificate-verify-failed.html

## 対処方法その二: そのまま更新

残念ながら, rbenv を利用しているので, 参照している証明書を更新した.

```
sudo curl "https://curl.haxx.se/ca/cacert.pem" -o /usr/local/etc/openssl/cert.pem
```

## 対処方法その三: homebrew を使う

以下の方法でも対処可能

```
$ brew update
$ brew install openssl
$ brew link openssl --force
$ brew install curl-ca-bundle
```
i3 Window Managerによるデスクトップ環境構築

個人のメモレベルの内容なので，有用な情報は少ないと思います．

* インストール方法や基本操作については，Googleなどで検索すると見つかるページを見てください
* 設定ファイルの詳細については[ユーザーマニュアル](http://i3wm.org/docs/userguide.html)を見てください

便利な設定などありましたら，コメントしていただけるとありがたいです．

# GitHub

* https://github.com/masnagam/i3-config

# 基本方針

* 極力キーボードだけで操作できること
    * 現在はやっていませんが，`xdotool`で動かせるようなのでそのうち試してみたいと思っています

# キーバインディング

私は普段Emacsを使っているため，AltキーやWinキーはそれほど使いません（少し遠くて押しにくいですし．．）．可能な限りCtrlを使いたかったので少し特殊なキーバインディングになっています．

* "default"バインディングモードにはほとんどキーバインディングがありません
    * Ctrlを多用するので，他のアプリのキーバインディングとかぶってしまうことを避けるためです
* たまたまC-RETがEmacsで未割り当てになっていたので，これを使っています
    * WindowsやmacOSではランチャー起動に使っていました
* いちいち"default"バインディングモードに戻ると複数回操作するのが大変なので，極力バインディグモードを変えないようにしてあります
    * Rofiを起動したときなど，キー入力で意図しないウィンドウ操作が発生するのを避ける必要がある場合は，バインディングモードを"default"に戻します
* 基本的には，バインディングモードを変更するキーバインディングにはC-プレフィックス，それ以外はC-プレフィックスなしを割り当てています

C-プレフィックスを使っていますが，操作性はEmacsのdiredやviに近いと思います．

# 自動起動

[dex](https://github.com/jceb/dex)とi3 `exec`コマンドを併用しています．

Chromeも自動起動したかったのですが，i3 `exec`コマンドでは指定したワークスペース上で起動できないときがあるため，必要なときに手動起動するようにしました．

多分，マルチプロセスアーキテクチャーの関係で，ウィンドウが生成される前にi3 `exec`コマンドの実行が終了してしまうためだと推測しています．適当な値でsleepするだけでいいかもしれませんが，設定ファイルが特定の環境に依存するのは好ましくないため，そのような記述は避けています．
2つの動画を2画面で同時ループ再生するAppleScript

## TL;DR
画質の違いをチェックしたり、サイネージ的にループ再生したい場面にて。

```applescript
property _delaySecondsForLaunch : 10
property _leftMovieFilePath : "/Users/test/Downloads/bbb_sunflower_2160p_60fps_normal.mp4"
property _rightMovieFilePath : "/Users/test/Downloads/bbb_sunflower_1080p_60fps_normal.mp4"

set msg to "Launching Players ... "
display dialog msg giving up after _delaySecondsForLaunch

(* check screen size *)
tell application "Finder"
	set {x0, y0, screenWidth, screenHeight} to get bounds of window of desktop
end tell
-- display dialog "screen width: " & screenWidth & " / screen height: " & screenHeight with title "Screen Size"

(* open movies *)
tell application "QuickTime Player"
	activate
	
	open _leftMovieFilePath
	delay 1
	
	open _rightMovieFilePath
	delay 1
	tell every document
		set looping to true -- set loop
	end tell
end tell

(* Move right QuickTime Player to right display *)
tell application "System Events" to tell process "QuickTime Player"
	tell window 1
		set position to {screenWidth / 2, 0}
		delay 3
	end tell
end tell

(* play movies *)
tell application "QuickTime Player"
	present every document -- set fullscreen
	play every document -- play!
end tell
```

## Memo
テスト環境はQuickTime Player 10.4 on MacOS 10.12.5(Sierra)。
簡単にできると思ったら、どうやらMacOS 10.10(Mavericks)以降からQuikcTime APIの内部仕様が変わったらしく、 `set bounds` が効かなくてハマった。
同じ要領で3画面以上もできそうだけど同一ファイルでの再生に対応してないので、そのうち調べる。
Apkのアップロードで「署名がありません」

AndroidアプリをDeveloperConsoleでアップロードしようとしたら失敗した。
エラー内容は「署名がありません」

AndroidStudioで署名つきでリリースビルドをやりおなしてリトライするも
何度やってもAPKのアップロードに失敗。理由は同じく「署名がありません」

APKの署名を確認すると……
```
C:\Program Files\Java\jdk1.8.0_121\bin>keytool -list -printcert -jarfile app-release.apk
署名付きJARファイルではありません
```
確かに署名がないようだ。

いろいろ試行錯誤した結果

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/183689/4e32c806-9e87-b312-77e1-ac83721841f9.png)

V2（Full APK Signature)　を選択していたが
V1を選択したところ、上記の確認コマンドで署名が確認できた。
C#で簡易的にグラフの中身をスクロールさせる

#はじめに
例えばセンサーなどから、定期的に取得する情報をグラフに表示して、一定区間をスクロールさせて流すといったもので、簡易的なものがほしかたったので、こんな方法を取ったというものです。
色々ともっと良い方法があるかもしれませんが・・・

C#でWindowsフォームアプリケーション（.NET Framework）で作成します。

※最近記事を書いていなくて、ちょっとこんな感じのことをしたので何となく投稿したと言うのもあります

#内容
3つのデータがCSV形式で出力されるログファイルを監視し、グラフに出力する

#Chartの設定でやったこと
1. ツールボックスのデータから`Chart`をフォームにドロップ
2. 凡例が邪魔だったので、プロパティの`グラフ`-`Legends`-`(コレクション)`を開いて、メンバーを削除
3. 系列を増やして、グラフの種類などを変更するため、`グラフ`-`Series`-`(コレクション)`を開いて、メンバーを2つ追加
4. 各系列のプロパティについて、`(グラフ)`-`ChartType`より`Line`を選択（折れ線グラフとするため）、また`(外観)`-`BorderWidth`で線の太さを変更し、`Color`で色を変更

![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/024f7204-14b6-52c6-d3c3-f6cde281293f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/4fb914eb-1ea3-d5c0-ba58-8f9a4f41e4b8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/cd154369-365a-1b85-0c62-80826b195f02.png)

フォームはこんな感じで、左にグラフ、右に一応ログを表示
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/ed18b8e2-baea-ac06-c492-c962a3d09bf0.png)

#ソースコード
ログの読み込みは次の記事より
[C#で簡易ログビューワーの作成 - とりあえずこれでいいんじゃない？ - Qiita](http://qiita.com/rrryutaro/items/3a6b01f379aa5b3c696c)

```C#
int cnt = 0; //変数である必要は無い（Qiitaでのコメントを頂いた事で発覚）

private void FileReaded(object sender, ReadedEventArgs e)
{
    if (e.Text.Length == 0)
        return;

    //グラフ作成
    foreach (string s in e.Text.Split(new string[] { "\r\n" }, StringSplitOptions.None))
    {
        string[] data = s.Split(',');
        if (chart1.Series[0].Points.Count <= 100)
        {
            chart1.Series[0].Points.AddXY(cnt, double.Parse(data[0]));
            chart1.Series[1].Points.AddXY(cnt, double.Parse(data[1]));
            chart1.Series[2].Points.AddXY(cnt, double.Parse(data[2]));
        }
        else
        {
            for (int i = 1; i <= 100; i++)
            {
                chart1.Series[0].Points[i-1].YValues = chart1.Series[0].Points[i].YValues;
                chart1.Series[1].Points[i-1].YValues = chart1.Series[1].Points[i].YValues;
                chart1.Series[2].Points[i-1].YValues = chart1.Series[2].Points[i].YValues;
            }
            chart1.Series[0].Points.RemoveAt(100);
            chart1.Series[1].Points.RemoveAt(100);
            chart1.Series[2].Points.RemoveAt(100);
            chart1.Series[0].Points.AddXY(cnt, double.Parse(data[0]));
            chart1.Series[1].Points.AddXY(cnt, double.Parse(data[1]));
            chart1.Series[2].Points.AddXY(cnt, double.Parse(data[2]));
        }
    }

    textBox1.Text += e.Text;
    textBox1.SelectionStart = textBox1.Text.Length;
    textBox1.ScrollToCaret();
}
```

100件まではそのまま`Chart`に追加して、100件を超える場合、一つずつ左にずらし、100件目を削除して、追加するといった事をしています。

こんな感じになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/313fb23d-7ba8-e9d2-ab50-38d02bd95c72.png)

ログが更新されればスクロールされていきます。

以上
bundle installしたgemを通常のrubyコードでrequireする方法


## 確認環境

```
$ bundler -v
Bundler version 1.14.6
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
```

## 準備
```
$ bundle init
$ vi Gemfile

(使いたいgemを記述して保存)

$ bundle install --path vendor/bundle 
```
カレントパスの`vendor/bundle`以下にgemをinstallしています。

### Gemfile例

```rb:Gemfile
source "https://rubygems.org"

gem 'pry', '0.9.12.2'
```


## require
下記のような感じでrequireすると良い

```foo.rb
require "bundler/setup"
# 個別にrequire
require "pry"

...
```

```foo.rb
require "bundler/setup"
# 一括require
Bundler.require

...
```


### 参考
[Ruby書くならBundler使え](http://shokai.org/blog/archives/7262)
Git Bookのマイルストーン

部内のGit入門回向け
https://git-scm.com/book/ja/v2 に沿っている

# 1. 使い始める

* 分散バージョン管理システム

* ファイルの3状態
    * コミット済み: Committed in Gitリポジトリ: Git Repository
    * ステージ済み: Staged in ステージングエリア: Staging Area
    * 変更あり: Modified in 作業ディレクトリ: Working directory
* ファイルの変更→ステージ→コミット

* GitHub for Windowsをインストールする(Windows)
* Gitのインストール(Other)

* 名前とメールの設定
* 設定の保存場所を確認

* Gitのhelpの見方

# 2. Git の基本

* 新しいリポジトリの作り方
* 既存のリポジトリのクローン

* ファイルの状態の確認
* ステージング
* Gitで管理したくないファイルの設定

* ステージされた内容。ステージされていない内容の確認
* コミットメッセージをエディタで入力してコミット
* 最低限のVimの使い方
    * ノーマルモードとインサートモードがある
    * 起動直後はノーマルモード。`:wq`と打ちエンターで保存して終了
    * `i`を打つことでインサートモードになり, 自由に文字が打てる
    * エスケープキーでノーマルモードに戻る
* コマンドオプションからメッセージの設定
* すでにGit管理下のファイルを管理下から外す

* Gitのコミットログを見る
* マシマシAlias (`lg`に設定)
* `git config --global alias.lg = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(white)%s%C(reset) %C(ul white)%an%C(reset)%C(bold yellow)%d%C(reset) %C(bold green)(%ar)%C(reset)' --all"`

* 直前のコミットのやり直し
* 変更の取り消し

* リモートからコミットを得る。コミットを送信する

* タグ: コミットのエイリアス

# 3. Git のブランチ機能

* ブランチ: ブランチはコミットのエイリアス (タグとの違いは?)
    * 現在のブランチはコミットに追従する点
* ブランチのマージ: マージコミットが作られる
* コンフリクトの解決
    * `=======`とかをコミットに含めないように!

* ブランチの一覧の表示

* ワークフロー
    * master <- develop <- topic をGitフロー
    * master <- topic をGitHubフロー ということがある

* リモートブランチからローカルブランチをつくる

* ブランチのリベース: 新しい別のコミットが作られる
* リベースとマージの使い分け
    * コミットの歴史の形が異なる
    * リベースはコミットを変化させる

# 4. Gitサーバー

* GitHubを使うので省略
* 色々あるけどどれもリモートリポジトリ

# 5. Git での分散作業

* 実際のワークフローについて
* プロジェクトへの貢献の仕方
* 貢献の反映の仕方

# 6. GitHub

* GitHubアカウントを作ろう
* Fork
* PullRequest
* Issue

# 7. Git のさまざまなツール

* 便利コマンド `git add -p` `git add -i`
* 作業途中のディレクトリの退避
* `reset`と`checkout`の正しい挙動
* `submodule`

# 8. Git のカスタマイズ

* 様々なConfig

# 9. Gitとその他のシステムの連携

別のバージョン管理システムから/への移行

# 10. Gitの内側

発展内容
Waffleで始める、初めてのIoT＋初めてのAndroidアプリ（開封編）

[こちら](https://kibidango.com/463)のクラウドファンディングにて、Waffleの開発に協力させていただきました。
無事目標は達成し、先日『スターターキット』が届きましたので、早速IoTの世界に飛び込みたいと思います。

# Waffleとは
Waffleは、ArduinoベースのAndroidアプリエンジニア向けプロトタイピングボードです。
AndroidアプリからWaffleを経由してGroveセンサーの値を取ることができ、Android開発者は通常のアプリ開発のイメージでIoTの世界に入ることが出来ます。

．．．あれ？
私はAndroidアプリの開発をしたことがないぞ？？

まぁ、そのあたりも一緒にお勉強していくことにします。

# スターターキット
届いた荷物はこちらです。
![DSC_0001.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/e5097d01-f907-f957-4c82-56f0c15e35f5.jpeg)
早速開封してみます。
![DSC_0002.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/edcaae1f-70af-c51f-de5c-e4829fe4f38b.jpeg)

中には保証書等、Waffle本体、Groveセンサー（温湿度）、USB変換コネクタが入っています。

## 保証書等
![DSC_0003.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/7c2cb677-7f8b-69a2-4ccf-2495cb4a7a39.jpeg)
箱の再利用方法と保証書、および、ご挨拶の紙が入っています。
箱の再利用方法は開ける前に知りたかったような．．．（苦笑）
[こちら](https://dotstud.io/docs/waffle/)に書かれているドキュメントに沿って、お勉強していく予定です。
また[Facebookグループ](https://www.facebook.com/groups/waffleiot)に、しっかり参加しました！

## Waffle本体
![DSC_0006.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/f2eac44c-176c-0c8e-331e-9cde0e41f486.jpeg)![DSC_0005.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/8036961c-63d1-b794-d3ba-44254fa96a9e.jpeg)
Arduinoベースのプロトタイピングボードです。
スポンサー名がしっかり入っています（笑）
Groveのコネクタが4つ、USBのコネクタが1つついています。
LEDも付いている気配です。

## Groveセンサー
![DSC_0007.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/67ede2de-b77a-142f-6240-9f5481b47369.jpeg)
今回は温度と湿度が測れるセンサーです。
なおGroveセンサーとは、 コネクタを挿すだけで回路を作成できるようになる、非常にお手軽なシステムのセンサーになります。他にもアクチュエータなどがあります。
ハンダを持っていない私にとっては非常に嬉しいシステムです。
[こちら](https://www.switch-science.com/catalog/list/379/)から購入できますので、色々揃えていきたいと思っています。

## USB変換コネクタ
![DSC_0004.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/cc405767-13e1-4f75-92bf-1545484f1a8d.jpeg)
WaffleをPCに接続するための変換コネクタです。
Waffleにプログラムを流し込むときなどに使います。
また、Android無し（モバイルバッテリ直結とか）の場合にも使えそうです。

# 次回
dotstudio様の[Waffleドキュメント](https://dotstud.io/docs/waffle/)を参考に、デモアプリを動かしたり、開発環境を整備したりしてみます。

※開封したのは箱だけｗ
Ubuntu 17.04の起動が遅いときに試すこと



# 環境

以下で試しています。

- XPS15(9560)
- Ubuntu 17.04

# 現象

前回チョーシのいいことを書きました

> USBメモリからUbuntu 17.04をインストール時に "cdから追加パッケージをインストールするためのapt設定の試行に失敗しました" と出て終了する
http://qiita.com/furu8ma/items/79200c0530700645fab0

が、インストール時から完全快適な状態ではありませんでした。
Ubuntu on SSDになって超速に生まれ変わったはずなのに、なぜか起動が遅い。。
少なくとも１分くらいは待たされる感じです。
下手すると on HDDだった頃のUbuntuより遅い感じです。
ありえんだろ〜、というかこの遅さ、確実になにかのタイムアウトを待ってるよな...と直感し捜査開始。

``/var/log/syslog``から起動時のログを探ったところ


```sh:/var/log/syslog
May 26 21:43:12 XPS15 systemd[1]: Starting Stop ureadahead data collection...
May 26 21:43:12 XPS15 systemd[1]: Started Stop ureadahead data collection.
May 26 21:43:52 XPS15 systemd[1]: dev-disk-by\x2duuid-b778a358\x2d2ca2\x2d44db\x2db435\x2d8aedf35be8ff.device: Job dev-disk-by\x2duuid-b778a358\x2d2ca2\x2d44db\x2db435\x2d8aedf35be8ff.device/start timed out.
May 26 21:43:52 XPS15 systemd[1]: Timed out waiting for
 ```


やっぱりね！


# ソリューション
 
 
偉大な先人はいるもので、ggったらヒットしました。
 
>  [SOLVED] Job dev-disk-by\x2duuid.device/start timed out.]
https://bbs.archlinux.org/viewtopic.php?id=196083
 
archlinuxの記事ではありますが。
結論からいうと、``/etc/fstab``,``/etc/crypttab``からマウントしていない行をコメントアウトすればいいらしいです。
 
 
```sh:/etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/nvme0n1p8 during installation
UUID=xxxxxx-xxxx-xxx-xxxx-xxxxxxxx /               ext4    errors=remount-ro 0       1
/swapfile                                 none            swap    sw              0       0
/dev/mapper/cryptswap1 none swap sw 0 0
```
 
 
```sh:/etc/crypttab
cryptswap1 UUID=b778a358-2ca2-44db-b435-8aedf35be8ff /dev/urandom swap,offset=1024,cipher=aes-xts-plain64
```
 
あれ、インストール時にスワップはしない設定にしたはずなんだけどな..
実際dfしてもswapに関する設定はでない。
 
ということで / 以外の行をコメントアウト。
 
結果、Ubuntuを選択してからログイン画面表示まで10秒かからないくらいまで改善されました。
いいね！

![Screenshot from 2017-05-27 10-09-14.png](https://qiita-image-store.s3.amazonaws.com/0/74328/8d304cdd-7a16-c857-4dfc-5e5cd116e202.png)
ライブラリディレクトリをFinderに表示する

超小ネタですが、知らなくて少し時間を使ったのでメモ。

# 経緯
GUIでSDKのディレクトリを指定しなくてはいけないことがあったんですが、Finderに~/Libraryが表示されず指定できませんでした。pathを直接かければよかったんですが、設定画面が対応していませんでした。

<img width="600" alt="スクリーンショット_2017_05_27_午前10_00.png" src="https://qiita-image-store.s3.amazonaws.com/0/15267/f7a978ab-b6a6-31bf-3a05-63f10d8fb253.png">

# 対応
以下のコマンドを打つと表示されるようになります。

```
chflags nohidden ~/Library
```

以上。
ROSのORB_SLAM2を動かしてみた。

##目的
単眼カメラでも動く、Visual-SLAMのソフトウェア[ORB-SLAM2](https://github.com/raulmur/ORB_SLAM2) を動かしてみた。
ORB-SLAM2は、単眼カメラの他に、ステレオカメラ・RGB-Dカメラにも対応しているが、ここでは単眼カメラで動かしてみた。
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/73020/f7116bb6-20db-ec3e-4f09-dfe60095274f.png)


##環境
Ubuntu16.04 (x64)
ROS Kinetic

##ROSのインストール
ROSのKineticをインストールする。
http://wiki.ros.org/kinetic/Installation/Ubuntu

##必要なパッケールのインストール
予め必要なパッケージをapt-getでいれる。

```
$ sudo apt-get install python-rosinstall
$ sudo apt-get install libglew-dev
$ sudo apt-get install cmake
$ sudo apt-get install libpython2.7-dev
$ sudo apt-get install libjpeg-dev libpng12-dev libtiff5-dev libopenexr-dev
```

##作業フォルダの作成

```
$ mkdir ~/ros_dev
```

.bashrcにROSへのパスを追加

```
$ vi .bashrc
```

```
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/ros_dev/ORB_SLAM2/Examples/ROS
```

##Pangolinのインストール
描画ライブラリPangolinをいれる。

```
cd ~/ros_dev
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake ..
make -j
sudo make install
```

###ORB_SLAM2のインストール

gitからダウンロードする。

```
cd ~/ros_dev
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
```

ORB_SLAM2をコンパイルする

```
cd ORB_SLAM2
chmod +x build.sh
./build.sh
```

ORB_SLAM2のROSノードをコンパイルする

```
chmod +x build_ros.sh
./build_ros.sh
```

##テストデータで動作確認する。

LSD_SLAMのテストデータで動作確認する。
カメラの内部パラメータがあっていないので、あくまで動作確認。

```
cd ~/ros_dev
wget http://vmcremers8.informatik.tu-muenchen.de/lsd/LSD_room.bag.zip
unzip LSD_room.bag.zip 
```

LSD_SLAMのBAGデータを読みこませる

```
rosbag play LSD_room.bag /image_raw:=/camera/image_raw
```

```
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml 
```

##Web カメラで動かす

コンソールを3つ立ち上げ、以下の3つのコマンドを実行する。

```
roscore
```

```
rosrun usb_cam usb_cam_node /usb_cam/image_raw:=/camera/image_raw
```

```
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml 
```

カメラをゆっくり動かすと、青い矩形が追従して動くことが確認できる。
精度悪い場合は他のyamlを試すか、きちんとカメラをキャリブレーションしてyamlファイルを作成し、ORB_SLAM2の引数で与えれば精度改善する。



参考：
https://github.com/raulmur/ORB_SLAM2