OmniAICreator/Qiita-1.07M huggingface dataset:
Mac10.13.2 (HighSierra)にアップデートした後にSSHができなくなった時の対処法


# エラー
  
Macのアップデート後に、sshを使ってのリモート作業をした時に、以下のようなエラーがでた、、、

```
"Unable to negotiate with "xxx" port "xxx": no matching cipher found. Their offer: aes128-cbc, 3des-cbc, blowfish-cbc, cast128-cbc, arcfour, aes192-cbc, aes256-cbc, rijndael-cbc @ lysator.liu.se"
```

???
なんだこれ、
エラーを調べてみると

SSH クライアントがSSH サーバーによってサポートされない弱い暗号を使用することによって SSH 接続をセットアップしようとすると、SSH エラーが発生することがある。サポートされている暗号の名前を示すエラー・メッセージが SSH クライアントに表示される。

らしい、、、

*参照*:[SSH 接続エラーの解決](https://www.ibm.com/support/knowledgecenter/ja/STAV45/com.ibm.sonas.doc/sonas_ssh_con_err.html)

<br>

# 対処法

```
sudo vim /etc/ssh/ssh_config
```
で以下のようにコメンアウトをとる。

```
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
```


![ssh_config.png](https://qiita-image-store.s3.amazonaws.com/0/192279/e2817db3-6051-a566-2585-3711e8c7eb62.png)


エラー解消！！！！
ポアソン過程で得られた観測値の信頼区間を求めたい

[先日の投稿](https://qiita.com/Atsushi776/items/ce12840de6e37f7291f3)で紹介した、ポアソン過程の観測値がxの時の期待値λの分布が形状母数x+1, 尺度母数1のガンマ分布に従う性質の応用編。

計数データの誤差を推定するため、データがポアソン過程で得られていると仮定して、観測値の信頼区間を求めることにした。

Rの場合、簡易的にはpoisson.test()で求めることができるらしい([奥村先生のページ](https://oku.edu.mie-u.ac.jp/~okumura/stat/CI/))。
たとえば観測値が1の時の期待値の95%信頼区間は以下のようにして0.025 - 5.572とされる。

```r
> poisson.test(x = 1, conf.level = 0.95)
	Exact Poisson test

data:  1 time base: 1
number of events = 1, time base = 1, p-value = 1
alternative hypothesis: true event rate is not equal to 1
95 percent confidence interval:
 0.02531781 5.57164339
sample estimates:
event rate 
         1 
```

しかし、poisson.test()は複数の観測値に対して信頼区間を計算するようにできていない。
また、信頼区間以外にもいろいろ計算していて信頼区間だけを取り出す手間が必要になる。

そこで、ポアソン過程の観測値がxの時の期待値λの分布が形状母数x+1, 尺度母数1のガンマ分布に従うことを利用し、qgamma()を用いる。
qgamma()はガンマ分布の左側p%のquantileを求めてくれる関数。
poisson.test()内部でも用いられている。

```r
x <- 0:10 #観測値
x.L <- qgamma(0.025, x + 1) #95%信頼区間の下側
x.H <- qgamma(0.975, x + 1) #95%信頼区間の上側
knitr::kable(data.frame(x, x.L, x.H)) #表に出力
```

|  x|       x.L|       x.H|
|--:|---------:|---------:|
|  0| 0.0253178|  3.688880|
|  1| 0.2422093|  5.571643|
|  2| 0.6186721|  7.224688|
|  3| 1.0898654|  8.767273|
|  4| 1.6234864| 10.241589|
|  5| 2.2018943| 11.668332|
|  6| 2.8143631| 13.059474|
|  7| 3.4538322| 14.422675|
|  8| 4.1153731| 15.763189|
|  9| 4.7953887| 17.084803|
| 10| 5.4911604| 18.390356|

観測値が0 - 10の場合の95%信頼区間を推定できた!
と、思いきや、先のpoisson.test(1)の結果

|  x|       x.L|       x.H|
|--:|---------:|---------:|
|1|0.02531781|5.57164339|

と比較すると何かおかしい。
poisson.test()で推定されたx = 1の時のx.Lは、qgamma()で推定されたx = 0の時のx.Lと一致している。
x.Hは問題ない。

どなたか理由ご存知の方いらっしゃれば教えて下さい。
SublimeText3の設定周りでやったこと

1年前の覚書の転記。
また同じことで詰まらない為のメモ。

# Package Installが表示されないんだけど・・・

いつの間にか Preferences.sublime-settings User で無効化されていたからでした。
"ignored_packages":　から　"PackageInstall"　を削除で解決！
参考＞https://kimoba.com/kasegu/missing-package-control.html


# javascriptのエラーコードを吐き出させたい

node.js　をインストール
https://nodejs.org/ja/

コマンド プロンプト から jshint　をインストール
参考＞http://kawachodev.hatenablog.jp/entry/2013/07/19/230747

sublinmeLinter と sublimeLinter - jshint を
Install Packageからインストール

完成！


#表示はお好みで。私が変えたところ

１
SublimeLinter.sublime-settings User
"debug": true,　エラー理由を教えてくれるぜ！

２
マークスタイルの変更
SublimeLinter.sublime-settings User
"mark_style": "○○",
種類は下記
http://sublimelinter.readthedocs.io/en/latest/mark_styles.html

参考＞
http://qiita.com/Sugima/items/e3ad6c0405c3939dee3b
https://liginc.co.jp/web/js/73704
Vagrant - エラー別Tips

### 削除済の仮想マシンが`$ vagrant global-status`で表示されてしまう


#### 対応

- `--prune`オプションをつける

```bash
$ vagrant global-status --prune
```

ref: [vagrant global-status --pruneでゾンビ仮想マシンを削除する](http://dqn.sakusakutto.jp/2014/10/vagrant_global-status_--prune.html)

### `$ vagrant up`できない

#### エラー内容

「同じ名前の仮想マシンがすでに存在します」というエラーが出る。

```bash
The name of your virtual machine couldn't be set because VirtualBox
is reporting another VM with that name already exists. Most of the
time, this is because of an error with VirtualBox not cleaning up
properly. To fix this, verify that no VMs with that name do exist
(by opening the VirtualBox GUI). If they don't, then look at the
folder in the error message from VirtualBox below and remove it
if there isn't any information you need in there.

VirtualBox error:

VBoxManage: error: Could not rename the directory '/Users/ユーザー名/VirtualBox VMs/box名_1462242910494_8413' to '/Users/ユーザー名/VirtualBox VMs/box名 to save the settings file (VERR_ALREADY_EXISTS)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "SaveSettings()" at line 3016 of file VBoxManageModifyVM.cpp
```

#### 対応

1. マシン名を指定して`$ vagrant destroy`
2. `$ vagrant box remove`
3. Boxディレクトリの削除

ref: [vagrant upで A VirtualBox machine already exists.とでる解決方法](http://qiita.com/pugiemonn/items/92f234b7894bd4709f72)
numpy.linalg.det(and Cauchy matrix)

```python
A = ((1,2),(2,3))
print(np.linalg.det(A))
X = np.arange(8)
Y = X + 0.5
C = 1.0 / np.subtract.outer(X, Y)
print(X)
print(Y)
print("====C====")
print(C)
print(np.linalg.det(C))
```
```
-1.0
[0 1 2 3 4 5 6 7]
[ 0.5  1.5  2.5  3.5  4.5  5.5  6.5  7.5]
====C====
[[-2.         -0.66666667 -0.4        -0.28571429 -0.22222222 -0.18181818
  -0.15384615 -0.13333333]
 [ 2.         -2.         -0.66666667 -0.4        -0.28571429 -0.22222222
  -0.18181818 -0.15384615]
 [ 0.66666667  2.         -2.         -0.66666667 -0.4        -0.28571429
  -0.22222222 -0.18181818]
 [ 0.4         0.66666667  2.         -2.         -0.66666667 -0.4
  -0.28571429 -0.22222222]
 [ 0.28571429  0.4         0.66666667  2.         -2.         -0.66666667
  -0.4        -0.28571429]
 [ 0.22222222  0.28571429  0.4         0.66666667  2.         -2.
  -0.66666667 -0.4       ]
 [ 0.18181818  0.22222222  0.28571429  0.4         0.66666667  2.         -2.
  -0.66666667]
 [ 0.15384615  0.18181818  0.22222222  0.28571429  0.4         0.66666667
   2.         -2.        ]]
3638.16363712
```
* By the way, I can't understand the meaning of the determinant of Cauchy matrix, so please teach me about that.

# Refs.
* [行列式](https://oguemon.com/study/linear-algebra/det-what/)
* [行列式の意味](https://oshiete.goo.ne.jp/qa/5626598.html)
* [行列式の３つの定義と意味](https://mathtrain.jp/determinant)
* [置換、互換、奇置換、偶置換](https://mathtrain.jp/permutation)
* [行列式の意味と計算方法](http://schoolhmath3c.blogspot.jp/2012/02/blog-post_22.html)
* [Cauchy matrix](https://en.wikipedia.org/wiki/Cauchy_matrix)
* [美しき行列式たち 〜 第六回](http://itchyny.hatenablog.com/entry/20120420/1334920869)
* [ビネ・コーシーの定理とその証明](https://mathtrain.jp/binetcauchy)
Vagrant - コマンド

## よく使うコマンド一覧

```bash
# 作成＆起動
$ vagrant up

# provision
$ vagrant provision

# ssh接続
$ vagrant ssh

# 確認
$ vagrant status

# 確認（全ての仮想マシン）
$ vagrant global-status

# 確認（削除済の仮想マシンを除く）
$ vagrant global-status --prune

# 一時停止
$ vagrant suspend

# `suspend`から復帰
$ vagrant resume

# 停止
$ vagrant halt

# 更新（`vagrant halt`と`vagrant up`を実行）
$ vagrant reload

# 更新（provisionも実行）
$ vagrant reload --provision

# 削除（仮想環境を削除する）
# マシン名（or マシンID）をつけない場合はカレントディレクトリのマシンを削除
$ vagrant destroy マシン名（or マシンID）
```

ref: [Command-Line Interface - Vagrant by HashiCorp](https://www.vagrantup.com/docs/cli/)
HTTPレスポンスステータスコードを超ざっくりと覚える方法

職場の先輩が教えてくれたHTTPレスポンスステータスコードを超ざっくり覚える方法をメモ（バックエンド開発者目線）

`200`→成功
`400`→お前が悪い
`500`→俺が悪い

これなら覚えられる…
SQLiteの暗号化

SQLiteを利用するにあたって、最低限の暗号化くらいはかけておかないとくらいの気持ちで調べたときのまとめ

# 前提として
- sqlite3_keyを使いたい

DBを開いてパスフレーズを設定するだけで暗号化できるとのこと

```c
sqlite3_open( "test.db", &db );
sqlite3_key( "pass", ( int )strlen( "pass" ) );
```

なお、パスフレーズは64文字の16進数であると動作が速くなるとのこと
参考：[cocos2d-x ローカルデータの暗号化、SQLCipherを爆速化する方法](https://qiita.com/atr-toru/items/d98a434eecf9f58c443d)

- ios, android, windowsで動作する
- 無償

# 暗号化する方法について調べた
参考：[SQLite with encryption/password protection](https://stackoverflow.com/questions/5669905/sqlite-with-encryption-password-protection)
>
- SEE - The official implementation.
- wxSQLite - A wxWidgets style C++ wrapper that also implements SQLite's encryption.
- SQLCipher - Uses openSSL's libcrypto to implement.
- SQLiteCrypt - Custom implementation, modified API.
- botansqlite3 botansqlite3 is an encryption codec for SQLite3 that can use any algorithms in Botan for encryption.
- SQLiteCrypto - SQLiteCrypto is The Easier Way To Encrypt Sqlite Database By AES-256 and SHA-256

日本語ドキュメントの件数だとSQLCipher＞wxSQLite＞その他って感じ

## SQLCipher

- 無償で使うにはソースからビルドする必要がある
- iOSのドキュメントは結構豊富（参考：[【c++】SQLCipherを導入してみた](https://qiita.com/ashdik/items/a97ea55e7c36baa9391e)）
- 静的ライブラリのリビルド必要（BitCode対応してない！）
- AndroidとWindowsどうしよう（そもそもCで書かれたソースリンクするだけがいいんだが）

という感じで断念

## wxSQLite

Cのソースをリンクするだけでいけそう（いけた）
SQLCipherを導入しようとあれこれがんばっていた時間はなんだったんだ・・・というくらい素早くいけました
参考：[SQLite の暗号化](https://www.slideshare.net/syuhari/nifty-seminar)
URLのディレクトリ名を取得する書き方(年月日を取得)

URLで年月日のディレクトリから年と月と日を取得する書き方になります。
※月と日が0埋めの場合、1桁に変換する。

## 作業内容

- URLは「https\://hoge.com/fuga/2018-01-10/」
- ディレクトリ「2018-01-10」を取得
- 「2018、1、10」と年、月、日ごとに値を取得

## コード

Classで書きました。

``` javascript:Class/UrlGetDirectory.js
// https://hoge.com/fuga/2018-01-10/の場合

export default class UrlGetDirectory {
  constructor() {
    const urlGetDirectory = location.href.split('/'); // URLを取得
    this.urlGetDate = urlGetDirectory[4]; 　　　　　　　　　　　　　　　　　　　　　　　　// 「/」で分けた4つ目のディレクトリ名を取得
  }
  /**
   * URLディレクトリの年月日を取得
   * @return {object} 年、月、日の値
   */
  makeDate() {
    const urlGetYear = this.urlGetDate.substr(0, 4); // 日付の年数を取得
    let urlGetMonth = this.urlGetDate.substr(5, 2);
    urlGetMonth = this.isFrontZero(urlGetMonth); 　　　　　　　// 日付の月を取得して先頭が「0」だったら削除 例: 01 -> 1
    let urlGetDay = this.urlGetDate.substr(8, 2);
    urlGetDay = this.isFrontZero(urlGetDay); 　　　　　　　　　　　　　　// 日付の日を取得して先頭が「0」だったら削除 例: 01 -> 1
    return {
      year: urlGetYear,
      month: urlGetMonth,
      day: urlGetDay,
    }
  }
  /**
   * URLのディレクトリ名で取得した月と日の先頭に「0」が付いてる場合は削除
   * @param  {string}  num ディレクトリで取得した月と日
   * @return {string}  先頭に「0」がある場合は「0」を削除。「0」がない場合はそのまま変更せずに返す
   */
  isFrontZero(num) {
    const isFrontZero = num.substr(0, 1);
    if (isFrontZero === '0') {
      const frontZeroRemove = num.slice(1);
      return frontZeroRemove;
    }
    return num;
  }
}
```

``` javascript:entry.js
import UrlGetDirectory from './Class/UrlGetDirectory';
const urlGetDirectory = new UrlGetDirectory();
console.log(urlGetDirectory.makeDate().year);   // 2018
console.log(urlGetDirectory.makeDate().month);  // 1
console.log(urlGetDirectory.makeDate().day);    // 10
```
Keras+Tensorflow Trouble shooting Memo

##Tensorflow 使用 GPU 運算 安裝與設定
PC
CPU :i7 6700 3.4GHz
GPU：ASUS ROG Strix GeForce GTX 1080 11Gbps 
OS : Win 10

2017/12/3
使用Nvidia CUDA V8.0.61,cuDNN使用第6版，建議這個版本不要用太新，可避免一些不必要的問題。


##Keras+Tensorflow 記憶體自動增長設定
在訓練模型的時候，有時會遇到記憶不足導致發生錯誤，無法順利進行。可以透過以下方法讓限制記憶體的使用。

```py3:
import tensorflow as tf

# 設定自動增長 GPU 記憶體用量
gpu_options = tf.GPUOptions(allow_growth=True)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

# 設定 Keras 使用的 Session
tf.keras.backend.set_session(sess)
```


##參考資料:
[Windows10配置TensorFlow-GPU及Keras教程 - Chai_Zheng](http://blog.csdn.net/chai_zheng/article/details/78679881)
[G. T. Wang](https://blog.gtwang.org/programming/tensorflow-keras-specify-gpu-and-memory-tutorial/)
ブラウザからツイートをJsonで取得する

Twitterのタイムラインなどを開いて、以下のコードをConsoleから実行するとJsonで返るはず。
DOM構造が変わったら動かなくなる。
Chromeで確認したけど他のブラウザは不明。

```javascript
var result = [];
var tweets = document.getElementsByClassName('stream-item');
var i = 0;
for (t of tweets) {
    if (t.childElementCount > 0 &&
        t.children[0].childElementCount > 1 &&
        t.children[0].children[1].children[1].childElementCount > 0) {
            
        var d = new Object();
        var h = t.children[0].children[1].children[0];
        d.name = h.children[0].children[1].children[0].innerHTML;
        d.screenName = h.children[0].children[2].innerText;
        d.time = h.children[1].children[0].title;
        d.url = h.children[1].children[0].href;
        d.text = t.children[0].children[1].children[1].children[0].innerText.replace(/\r?\n/g, " ");
        result[i++] = d;
    }
}
JSON.stringify(result);
```
rubyで簡単discordbot

ストックじゃなくていいねください。


## discordのbotを作成
1. [ここ](https://discordapp.com/developers/applications/me)でNew Appをクリック
2. APP NAMEとAPP ICONを設定し、Create Appをクリック
3. Client Secret: click to reveal のclick to revealをクリックし、ここでClient IDとClient Secretを取得。(メモしておいてください。)
4. BotのCreate a Bot Userをクリック。BotのToken:click to revealのclick to revealをクリックし、Tokenを取得。(これもメモしておいてください。)
5. 最初はpublic botに設定しておいてください。
(botをサーバーに追加したあとに、Require OAuth2 Code Grantにチェックを入れて、public botのチェックを外してください。 )
6. discordapp.com/oauth2/authorize?client_id=ClientID&scope=bot&permissions=0
このurlのClientIDを先程取得したClientIDに変更してurl先で接続させたいサーバーを選択。
権限がないとサーバーに追加できないので、権限がない人は権限をもらってください。

ここまでで、とりあえずサーバーにbotを追加できました。

## サーバーにbotを起動
```ruby:ping.rb
require 'discordrb'
bot = Discordrb::Bot.new token: 'ここにトークン'##discordのbotトークン
puts "This bot's invite URL is #ここに招待URL."##discordの招待URL
puts 'Click on it to invite it to your server.'
bot.message(content: 'Ping!') do |event|
  event.respond 'Pong!'
end

bot.run
```

## gem 
```
$ gem install discordrb
```
### Bundlerでインストール

Gemfileを下記のようにgem "discordrb"を追記

```
source "https://rubygems.org"
# gem "rails"
gem "discordrb"
```
```
$ bundle install --path vendor/bundler
```
```
bundle exec ruby ping.rb
```

discordで Ping!とメッセージを送信すると、Pong!と出力されればbotとサーバーの接続は完了です。

# botプログラムソース
今回は[R6s](http://www.ubisoft.co.jp/r6s/)のキャラをランダムに出力させます。

```rb
require 'discordrb'
bot = Discordrb::Bot.new token: 'discordのトークンをここに'
puts "This bot's invite URL is #https://discord.gg/xxxxxx."#discordのurl
puts 'Click on it to invite it to your server.'

attackers = ['SLEDGE（スレッジ）',
'THATCHER（サッチャー）',
'ASH（アッシュ）',
'THERMITE（テルミット）',
'TWITCH（トゥイッチ）',
'MONTAGNE（モンターニュ）',
'GLAZ（グラズ）',
'FUZE（フューズ）',
'BLITZ（ブリッツ）',
'IQ（アイキュー）',
'BUCK（バック）',
'BLACKBEARD（ブラックビアード）',
'CAPITAO（キャピタオ）',
'HIBANA（火花）',
'JACKAL（ジャッカル）',
'YING（イン）',
'ZOFIA（ゾフィア）',
'DOKKAEBI（ドッカェビィ）'
]
defenders = ['SMOKE（スモーク）',
'MUTE（ミュート）',
'PULSE（パルス）',
'DOC（ドク）',
'ROOK（ルーク）',
'KAPKAN（カプカン）',
'TACHANKA（タチャンカ）',
'JAGER（イェーガー）',
'BANDIT（バンディット）',
'FROST（フロスト）',
'VALKYRIE（ヴァルキリー）',
'CAVEIRA（カヴェイラ）',
'ECHO（エコー）',
'MIRA（ミラ）',
'LESION（リージョン）',
'ELA（エラ）',
'VIGIL（ヴィジル）'
]
#シージのキャラ
operators = attackers + defenders


#"plz attack"とチャットに入力があった場合反応
bot.message(content: 'plz atk') do |event|
  event.respond "#{event.user.name}:#{attackers.sample}"
end

#"plz defense"とチャットに入力があった場合反応
bot.message(content: 'plz def') do |event|
  event.respond "#{event.user.name}:#{defenders.sample}"
end

#"plz character"とチャットに入力があった場合反応
bot.message(content: 'plz character') do |event|
  event.respond "#{event.user.name}:#{operators.sample}"
end


bot.run
```
[ここ](https://github.com/fishkiller252/SIEGE-discordbot)には
mapの見取り図を出力させたりできるようにしたものが置いてあります。

## 次はGooglespreadSheets
[次回](https://qiita.com/fishkiller/items/5e89bd04df81034a91ee)はGooglespreadSheetsの中身をdiscordにpostさせます。
Ethereumのスマートコントラクトで気をつけるセキュリティ的な面

#Ethereumのスマートコントラクトで気をつけるセキュリティ的な面

堅牢なスマートコントラクト開発のためのブロックチェーン技術入門という本を読んでの自分用のメモ

- 返金を受ける側でthrowがおこると、返金処理ができない ->返金する側の関数の処理がthrowとなる
- 状態確認　-> 返金　-> 状態変更　の順番で行うと、返金処理の部分で、この処理をループさせ、何回も返金を行ってしまう(the DAO)
- ブロックに取り込まれる順番は基本的にGas Priceの大きい順なので、実行される順番を意図的に変えることができる
- block.timestamp(now)は、トランザクションが取り込まれたブロックのタイムスタンプなので、マイナーによって意図的に操作が可能
- たとえプライベートな変数であっても、通信を見ればそこに収納された値を見ることができてしまう
- 意外とオーバーフローには気をつける
DESeq2を使った正規化

RのパッケージであるDESeq2の使い方を紹介したいと思います。


この項では[SRP052999](https://www.ncbi.nlm.nih.gov/Traces/study/?WebEnv=NCID_1_36761486_130.14.22.76_5555_1514266965_2617092658_0MetA0_S_HStore&query_key=1)のリードカウントデータを用いて説明していきます。
データの取得からマッピング・リードカウントの算出までの流れは
[pfastq-dump](https://qiita.com/vanillin99/items/18b6a07c5be2ead16f8e)
[STAR](https://qiita.com/vanillin99/items/6c4854a62e548ec8cf71)
で解説しています。

##DESeq2のインストール
[DESeq2](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)

```R:R
source("https://bioconductor.org/biocLite.R")
biocLite("DESeq2")
```

##サンプルシートの作成
サンプルの情報をタブ区切りのテキストにまとめておきます。



**sample_info.txt**

|SRR_id|GSM_id|sample_name|
|:-----------------|------------------:|:------------------:|
| SRR1781884| GSM1232104 |Adult_BM_HSC|
| SRR1781885| GSM1232105 |Adult_BM_HSC|
| SRR1781886| GSM1232106 |Adult_BM_LMPP|
| SRR1781887| GSM1232107 |Adult_BM_LMPP|
| SRR1781888| GSM1232108 |Adult_BM_CLP|
| SRR1781889| GSM1232109 |Adult_BM_CLP|
| SRR1781890| GSM1232110 |Adult_BM_proB|
| SRR1781891| GSM1232111 |Adult_BM_proB|




##実行

Rで以下のスクリプトを実行します。


```R:R
setwd("PATH-TO-COUNT_FILEs&sample_info.txt") #作業ディレクトリの変更

#作成したサンプルシートの読み取り
sample_db_name <- "sample_info.txt"
sample_db <- read.table(sample_db_name,sep="\t",header=T)
get_sampleInfo <- function( sampleID, sample_db ) {
  sub_ids <- which( sample_db$sample_id==sampleID )
  sample_info <- as.character( sample_db[sub_ids,]$title )
  return( sample_info )
}

#作成したサンプルシート上のサンプルIDから、
#カウントデータにアクセスして、データフレームにまとめる
loop=0
count_summary=NULL

for( sample_id in sample_db$SRR_id ) {
  if (loop==0) {    hoge=read.table(paste(sample_id,".ReadsPerGene.out.tab",sep=""),sep="\t",header=F,row.names=1,skip=4)
    count_summary=hoge[,1,drop=FALSE]
    loop=loop+1
  } else {
  hoge=read.table(paste(sample_id,".ReadsPerGene.out.tab",sep=""),sep="\t",header=F,row.names=1,skip=4)
  count_summary=cbind(count_summary,hoge[,1,drop=FALSE])
  }
}
colnames(count_summary)=sample_db$SRR_id
count_summary1 <- sapply(count_summary,as.integer)
rownames(count_summary1) <- rownames(count_summary)
sample_IDs <- colnames(count_summary1)
sample_info <- as.character(lapply(sample_IDs,get_sampleInfo,sample_db))
sample_type_list <- unique(sample_info)
group = as.factor(sample_db$sample_name)

#DESeq2の実行
library(DESeq2)
dds <- DESeqDataSetFromMatrix(countData = count_summary1,colData=sample_db,design= ~ sample_name)
dds <- DESeq(dds)
rld <- rlog(dds, blind=FALSE) #正規化後のNormalized countを取得 
mat <- assay(rld)
mat <- mat - rowMeans(mat) 
mat <- data.frame(GeneName=rownames(mat),mat)
write.table(mat,file="normalized_count.txt",sep="\t",quote=F,row.names = F)

```
【bootstrap3-wysihtml5】editorオブジェクトがundefinedエラーを返すときの解決法

###wysihtml5とは?
高速でかつ軽量なHTML5ベースのオープンソースWYSIWYGエディタです。

###特徴
**なんといってもHTML5のマークアップを生成してくれること！**
WYSIWYGエディタといえば、TinyMCEが有名ですが、
TinyMCEと比べてシンプルで扱いやすく導入も簡単です。

対応ブラウザも多く、Bootstrap用のプラグイン[bootstrap3-wysihtml5](http://schnawel007.github.io/bootstrap3-wysihtml5/)もあるので
フレームワークとしてBootstrapを使用している場合にはおすすめです。


###bootstrap3-wysihtml5のバグ
[AdminLTE](https://adminlte.io/themes/AdminLTE/index.html)を利用していたのですが、
そのAdminLTEに含まれるbootstrap3-wysihtml5プラグインにバグがありました。

wysihtml5を適用したエディタの内容を書き換えようとした際に以下のエラーが発生

```console:エラー内容
 Cannot read property 'setValue' of undefined
```

```javascript:ソース
// #textareaがwysihtml5エディタを適用した要素
$('#textarea').data('wysihtml5').editor.setValue('内容');
```

調べてみると、wysihtml5のeditorオブジェクトが```undefined```になっていました。


###解決方法

参照しているファイル（bootstrap3-wysihtml5.min.jsまたはbootstrap3-wysihtml5.all.min.js）の
```createEditor```メソッドを定義している箇所を確認

```javascript:bootstrap3-wysihtml5.min.jsまたはbootstrap3-wysihtml5.all.min.js
 createEditor: function(options) {
    options = options || {};

    // Add the toolbar to a clone of the options object so multiple instances
    // of the WYISYWG don't break because 'toolbar' is already defined
    options = $.extend(true, {}, options);
    options.toolbar = this.toolbar[0];
    
    this.initializeEditor(this.el[0], options);
 },
```


以下の記述を

```javascript:修正前
this.initializeEditor(this.el[0], options);
```

以下に変更

```javascript:修正後
return this.initializeEditor(this.el[0], options);
```

これでエディタの内容を書き換えることができました。


###原因

AdminLTEに入っているbootstrap3-wysihtml5プラグインのバージョンが古いことが原因でした。
なので、editorオブジェクトが```undefined```である場合は、
特定の[コミット](https://github.com/bootstrap-wysiwyg/bootstrap3-wysiwyg/commit/aee1fee7886b34d01e8f238d64d2e6fd9388608c)が含まれていることを確認してみてください。
上記のコミットはbootstrap3-wysihtml5.min.jsまたはbootstrap3-wysihtml5.all.min.jsにマージされていないのでダウンロードする際は注意が必要です。
よく使うgitコマンドとエイリアスの設定


```git 
プロジェクトをリモートリポジトリのブランチに上げる
$ git push

プロジェクトをリモートリポジトリのブランチから引っ張ってくる
$ git pull

プロジェクトをステージングエリアに上げる
$ git add *

プロジェクトをローカルリポジトリのブランチに上げる
$ git commit

変更とコミット
$ git commit -a

ブランチ切り替え
$ git checkout *

ブランチの一覧と現在のブランチ
$ git branch

2つのブランチを合致させる
$ git merge *

新たなブランチの作成
$ git branch *

ブランチの削除
$ git branch -d *

新たなブランチの作成＋ブランチを切り替え
$ git checkout -b *

変更の一時退避
$ git stash

一時退避した変更を反映
$ git stash pop

一時退避した変更の履歴
$ git stash list

```


```
基本的なコマンドを覚えたら
git checkout *
とか
git branch
とか
よく使うのに長ったらしいのでエイリアスを設定しておく
~/.gitconfig
に直接書くか
$ git config --global alias.c checkout
　リポジトリ単位で設定したいときは
$ git config --local alias.b branch

```
演算子オーバーロードを使って独自の計算とかする

```
1 + 1 = 2
```

↑と同じノリで

```kotlin
MyClass(1) + MyClass(2) = MyClass(3)
```

こういうことしたい。けど自分で作ったクラスだから計算できない。

どうするか。
## +演算子に独自の機能をつけておけば良い

## やりかた
operator 修飾子をつける

```kotlin
class MyClass(val value: Int){
    operator fun plus(that: MyClass): MyClass =
        MyClass(value + that.value)
}
```

これで

```kotlin
val a = MyClass(5) + MyClass(7)
println(a.value) // 12が出力
YellowfinのThirdPartyConnectorのサンプル・機能制限

<img width="1061" alt="YellowfinThirdPartyConnector.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/017b9b30-4895-5e6e-2041-9e230ca11617.jpeg">


#ThirdPartyConnectorってなんや・・

Yellowfin7.2以降、ThirdPartyConnectorをデータソースとし、レポート・ダッシュボードを合わせて用意されたContentsとして広く配布することが可能となりました。
これにより、APIを公開しているFacebook、Google Analyticsなどの情報を認証ウィザードを経るだけですぐに可視化することができるようになり、またそのConnector自体も自由に作成することができるようになりました。

現在使用できるコネクターのは今現在(2017/12/25)[全26種類](https://portal.yellowfinbi.com/YFWebsite-Marketplace-77991)のようです。
個人的にはtwitter、Instagram辺りが気になります。。

#いきなり機能の制約から
・コネクターのDataSourceでは複数のDataSetsからレポートを作成することができません。
・ドリルダウンは使用できません。
・グループ化は使用できません。
・Connector内部では複雑なフィルターは使用できません。Connector内部でのフィルターは全てAndで適用され、Orでフィルターすることはできません。

つまりあんまり難しいことはできないってことですね！

#開発要件について

・Javaのバージョン7以降
・Connectorに必要なライブラリはYellowfinに同梱されている、/appserver/webapps/ROOT/WEB-INF/lib/以下の、2つのjarファイルになります。これを参照することで、Connectorに必要なクラスを呼び出すことができます。
	・i4-core.jar	・i4-mi.jar 
・Eclipse Luna(4.4)以降(おそらくどのバージョンでも可能です)

#突然ですが、サンプル添付

https://github.com/celery1216/yellowfin_sample_connector

また、Eclipseで読み込む際には、libsフォルダの全てのjarファイルを参照し、Yellowfin本体に/appserver/webapps/ROOT/WEB-INF/lib/含まれている、下記2ファイルも参照してください。 
・i4-core.jar
・i4-mi.jar

#SampleConnector概要

SampleConnectorを展開すると、サンプルで作成したコネクターのプロジェクトファイル類と、完成したパッケージsampleconnector.yfpが同梱されています。
このコネクターはhttp://api.population.io/#!/population/retrievePopulationTableAllAges を参照するもので、yearとcountryを入力すると、その条件の人口を返してくれるAPIです。

#sampleconnector.yfpの使い方

<img width="431" alt="connect.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/9942d5c9-1e7d-9a04-c173-d290a46cdae3.jpeg">

接続情報を入力する
　・名前(コネクター名): SampleConnector
　・説明: 任意
　・年: 2017
　・国名: Japan

※この画面をSampleMetaData.javaで作成しています

<img width="471" alt="connect2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/564e4ce9-5648-fccf-9adc-5a1ef1823388.jpeg">

テーブルにpopulation_io(dataset)を選択し、ビュー名にjapanを入力する
最後にレポート作成をクリック

#レポート作成

グラフを作成し、公開して終了です。

<img width="729" alt="report.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/94bf4356-9cf1-a04e-c023-74f760aaa06b.jpeg">



<img width="783" alt="report2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/7e290d9d-172f-b813-adeb-70d72dc14e3e.jpeg">

完成！
add '@objc' to expose this instance method to Objective-C



#解決
(エラー文読むだけで分かりそうだけど)
`#selector`で呼び出す関数の頭に`@objc`をつけるだけ

詳しく書かれてる記事様
[http://galakutaapp.blogspot.jp/2017/09/swift-4.html](http://galakutaapp.blogspot.jp/2017/09/swift-4.html)
C++ Builder 10.2 Tokyo > IDE > オブジェクトインスペクタ > 検索できるようになっている | UI: 構造の記憶を強いるUIかどうか

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

### オブジェクトインスペクタでのキーワード検索

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2c2daad9-a0c9-4519-4b6d-8e5c4a60551f.png)

10.2 Tokyoではオブジェクトインスペクタでキーワード検索できるようになっている。
前方一致検索ではなく、部分一致検索であり、使いやすいように思う。

プロパティやイベントのリストから「探す」という行為が手早くなり、今後のデザイン時間の短縮に大きく貢献すると思われる。

### 構造の記憶を強いるUI

検索で見つかるUIはカテゴリやリストから探すUIよりも有用であると常々思う。カテゴリやリストから探す行為はユーザに「構造の記憶」を強いり、「そのソフトだけ」を使うユーザしか考慮されていないように思う。
現在のような様々なフレームワークが登場していく開発状況では、一つのIDEだけを使い続けるユーザだけでなく、複数のIDEを使うユーザも考慮されたUIは良いと思う。

関連

- [Visual Studio > IDE > ショートカットを忘れたときの確認手順 > Ctrl+Q とキーワード入力](https://qiita.com/7of9/items/7c1187981158f09b5dc4)
- [インタフェースの話](http://d.hatena.ne.jp/naoya/20060215/1140019065)
    - >id:koyachi さんが「習熟度でインタフェースをわけないということ」というタイトルでインタフェースの書籍から、まさにこの辺りの話を記述してくださってます
- [習熟度でインターフェースをわけないということ](http://d.hatena.ne.jp/koyachi/20060213/1139778481)
GCP上で複数ネットワークを利用する 

#目的
すでに社内ＬＡＮとかを構築してある環境だと、ネットワークアドレスは自分たちで決めたいと思います。GCPでそれをやった場合に少しはまったので、自分用の書置きです。

#手順
１．VPCネットワークを作成します。
　サブネット作成モードは「カスタム」のままで
　リージョンはasia-northeast1ですね、今日現在。
　ＩＰアドレス範囲に「自社で設計したサブネット」を登録します。
　ダイナミック ルーティング モードは変更しません。
![pcg-add-nw01.png](https://qiita-image-store.s3.amazonaws.com/0/220924/1e935adf-2644-2a6e-ceb9-4b4dc7358f74.png)


２．VPCネットワークと社内のネットワークを接続します。
　私はRTXを使ってVPNを作りましたが、皆さんの環境に合わせて接続してください。
　基本的なことですが、ルーティングやファイヤウォールの設定はお忘れなく。

３．ホストの作成
　ホストを作成する際にネットワークを追加します。その時に２で作成したネットワークを
　追加してください。ＩＰアドレスはエフェメラル（カスタム）にして、
　固定のＩＰを振っておきます。静的ＩＰを予約する必要は特にはないと思います。
　「ファイアウォール設定は複数のネットワーク インターフェースでは使用できません 」
　![pcg-add-nw02.png](https://qiita-image-store.s3.amazonaws.com/0/220924/47fe6aec-2734-3111-d356-a0ba1f5ac90e.png)
　という警告が画面上で出てきます。何のことかと思ったら、
　追加ネットワークのファイヤウォール設定をきちんとやれと、そういうことでした。
　![pcg-add-nw03.png](https://qiita-image-store.s3.amazonaws.com/0/220924/a9b28479-88d8-12bb-1b58-fc12bc730857.png)
　よく見るとhttp/httpsがグレーアウトしています。

４．ファイヤウォールの設定
　追加の２で作成したVPCに対してのファイヤウォールを設定します。
　ネットワークにVPCの名前を入れて、目的に沿った設定を入れます。
![pcg-add-nw04.png](https://qiita-image-store.s3.amazonaws.com/0/220924/70558240-bf00-8e6f-f196-9c8381604180.png)

#はまった点
３．の手順のエラーの意味が分からずにはまりましたが、
よく見るとhttpとhttpsが無効になっているのに気が付くべきでした。
Project Euler Q55 【Lychrel数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$47$とその反転を足し合わせると, $47 + 74 = 121$となり, 回文数になる.

全ての数が素早く回文数になるわけではない. $349$を考えよう,

1. $349 + 943 = 1292$
2. $1292 + 2921 = 4213$
3. $4213 + 3124 = 7337$

$349$は, $3$回の操作を経て回文数になる.

まだ証明はされていないが, $196$のようないくつかの数字は回文数にならないと考えられている. 反転したものを足すという操作を経ても回文数にならないものをLychrel数と呼ぶ. 先のような数の理論的な性質により, またこの問題の目的のために, Lychrel数で無いと証明されていない数はLychrel数だと仮定する.

更に, $10000$未満の数については，常に以下のどちらか一方が成り立つと仮定してよい.

1. $50$回未満の操作で回文数になる
2. まだ誰も回文数まで到達していない

実際, $10677$が$50$回以上の操作を必要とする最初の数である: $4668731596684224866951378664$ ($53$回の操作で$28$桁のこの回文数になる).

驚くべきことに, 回文数かつLychrel数であるものが存在する. 最初の数は$4994$である.

$10000$未満のLychrel数の個数を答えよ.

注: $2007/04/24$にLychrel数の理論的な性質を強調するために文面が修正された.

## 解答

```bash
time seq 9999 |
awk '{n[NR,0]=$1;printf $1" ";for(i=1;i<=49;i++){for(j=length(n[NR,i-1]);0<j;j--){t[NR,i]=(t[NR,i] substr(n[NR,i-1],j,1))};n[NR,i]=n[NR,i-1]+t[NR,i];printf n[NR,i]" "};print ""}' |
awk '{for(i=2;i<=NF;i++){for(j=length($i);0<j;j--){t[NR,i]=(t[NR,i] substr($i,j,1))};if($i==t[NR,i]){next}};print $1}' |
wc -l
249

real    0m7.781s
user    0m8.348s
sys     0m0.190s
```

他サイトを見る限り、「反転したものを加算する操作」を$0$回おこなったもの(つまり元の数字)が回文になっているものは回文とカウントしない様子。
よって$2$個目の`awk`のループでは$2$から始めた。

ところで`awk`でごりごりやるやり方は横に長くなるのであまり好きではないのですが、反転なので他のコマンドではやりにくいです。
`rev`は行全体を反転させるので、工夫が必要。
`perl`の`reverse`もやってみたのですが途中で桁が足りなくなるようでした($20$桁までの整数しか対応していないっぽい)。
何かモジュールを入れればできるのかもしれないですけど、よく分からなかったです。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/055.html
iOS10で<video>タグの動画が再生できない

# 公開直前のサイトで＜video＞タグで設置したmp4がiOS10で再生できない
### 前提
- DNS切り替え前、AWSでELB経由で接続（AWSのドメイン）
- IP接続制限/ベーシック認証などは解除済み
- SSL自己証明
- iOS11では再生できる

### 結論
**iOS10ではオレオレ証明だと動画が再生されない**
⇒SSL設定してhosts書き換えで確認予定
⇒iOSはDNSサーバーを立てて確認

無事解決。
ぶち当たってみなければ分からなかったシリーズ。
C++ Builder 10.2 Tokyo > StatusBar1.Panels[] > bdRightToLeft設定時の不具合 > フォーム右下の文字の一部が欠損する

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
RAD Studio 10.2 Tokyo Update 3
```

TStatusBarのTPanelに関してXE4では以下の不具合があった。
[c++ builder > IDE / bug > StatusBar1.Panels[] > bdRightToLeftがまともに機能しない > (ABCDEFGHI(AAA](https://qiita.com/7of9/items/08160906f9933013cc4e)

- BiDiMode: bdRightToLeft
- Text : ABCDEFGHI(AAA)

10.2 Tokyoではどうなったか。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5b085944-8d58-8396-1bf5-e7719acf6f7c.png)

1. XE4の不具合は10.2Tokyoでは解消されている
2. 別の不具合として、フォーム右下の文字の一部が欠損する

15.3 Patagonia(嘘です)あたりで解消するかな?
メタ文字が入るとチャットワークに送信できない

チャットワークにとあるアラートをcurlで送ろうとすると、文字が途中で切れてしまう現象に見舞われました。

```
# コマンド内容はこんな感じ
curl -X POST -H "X-ChatWorkToken:[token_id]" -d "body=サンプル&サンプル" "https://api.chatwork.com/v2/rooms/[roomid]/messages" > /dev/null 2>&1
```

文字が切れる原因はメタ文字でした。

という事で、bodyの内容をURLエンコードをしたら正常に送れるようになりました。
VBAで報告用にレイアウト調整

```:VBA報告用整理
Sub 全シート_報告用()
    Dim firstSheet As Worksheet
    Set firstSheet = ActiveSheet
    
    Dim s As Object
    For Each s In ActiveWorkbook.Sheets
        s.Activate
        
        'カーソルをA1セルへ
        ActiveSheet.Range("A1").Select

        'アクティブセルを画面の最上部に表示する
        With ActiveWindow
            .ScrollRow = ActiveCell.Row
            .ScrollColumn = ActiveCell.Column
        End With
        
        '倍率100%
        ActiveWindow.Zoom = 100
        
        '枠線なし
        ActiveWindow.DisplayGridlines = False
        
        'ページレイアウト標準
        ActiveWindow.View = xlNormalView
    Next s
    firstSheet.Activate
End Sub
```
Swiftのメモリ管理について調べてみた

Swiftのメモリ管理、循環参照、weakキーワードあたりについて
ざっくりとした知識しかなかったので改めて調べてみました。

## リファレンスカウンタについて

Swiftではクラスのインスタンスとクロージャが参照型のデータです。
参照型のインスタンスは、変数や定数に代入した際にはそのコピーが作成されるのではなく、
インスタンスを参照するための情報(ポインタ)が渡されます。

最初にインスタンスを生成した時点ではリファレンスカウンタは1であり、
別の変数(x)に作成したインスタンスを代入するとリファレンスカウンタは2になります。
また、xにnilを代入すると参照されなくなるため、リファレンスカウンタが1減ります。

```swift
class Member {
    let name: String
    init(name: String) {
        self.name = name
    }
}

var tanaka: Member? = Member(name: "Tanaka") // リファレンスカウンタは1
var x: Member? = tanaka // 2箇所から参照されているのでリファレンスカンタは2
x = nil // 参照されなくなるのでリファレンスカウンタは1
tanaka = nil // リファレンスカンタは0
```

リファレンスカウンタが0になり、どこからも参照されていない状態になると、
インスタンスに割り当てられていたメモリは開放されます。


## ARCによるメモリ管理

上の例のように、Swiftでは、インスタンスが参照されたり
されなくなったりしたタイミングでリファレンスカウンタの増減を行い、
メモリ管理をしています。

そしてリファレンスカウンタの増減をいつ行うのかについては、
コンパイル時に決定されています。
この仕組みをARC(Automatic Reference Counting)と呼びます。

ARCのおかげでメモリ管理についてあまり意識せずにコーディングできるんですね。
そういえば大昔にObjective-Cを初めて触ったときは自分でメモリ解放とか
やっていましたね。


## インスタンスが開放できないときとは？

Swiftではクラスのインスタンスはデフォルトで強参照です。
関連する複数のインスタンス同士が互いに強参照をしていると、
いつまでたっても参照カウンタが0にならず、メモリを開放できません。
これを循環参照といいます。

以下は循環参照の例です。
このコードでは、MemberクラスとTeamクラスが互いに強参照しているため、
双方のdeinitが呼ばれません。

```swift
class Member {
    let name: String
    var team: Team?
    
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("Member: \(self.name) - deinit")
    }
}

class Team {
    let name: String
    var members = [Member]()
    
    init(name: String) {
        self.name = name
    }
    
    func add(_ member: Member) {
        self.members.append(member)
        member.team = self
    }
    
    deinit {
        print("Team: \(self.name) - deinit")
    }
}

do {
    let t = Team(name: "Team-A")
    let m = Member(name: "Tanaka")
    t.add(m)
}
```

## 弱い参照

通常の変数や定数からクラスのインスタンスを参照するとリファレンスカウンタが
1増加しますが、変数に`weak`というキーワードを付けるとその変数は弱い参照となり、
リファレンスカウンタの値に影響を与えません。

weakキーワードを付けると、その変数が参照していたインスタンスが開放されたら
弱い参照の変数には自動的にnilが代入されます。
そういった理由から、weakキーワードを付ける変数はオプショナル型である必要が
あります。

```swift
weak var m: Member? = nil
do {
    let tanaka = Member(name: "Tanaka")
    m = tanaka
}
print(m) // => nil

```

先程のMember,Teamクラスの例では、Memberクラスを下記のように修正することで
deinitが適切に呼ばれるようになります。

```swift
class Member {
  let name: String
  weak var team: Team? // weakで修飾

  init(name: String) {
    self.name = name
  }

  deinit {
    print("Member: \(self.name)" - deinit)
  }
}
```


## 非所有参照

非所有参照は、弱い参照とは別の、循環参照を防ぐための仕組みです。
変数に`unowned`キーワードを付けることで非所有参照となり、
弱い参照と同様にリファレンスカウンタの値を増やしません。

弱い参照との違いは、常に何かのインスタンスを参照し続け、
nilを値とせず、参照先のインスタンスが開放されてもnilを代入しないところです。
なので、参照先のインスタンスが開放されても参照を持ち続けることがあり、
その状況で誤って参照先にアクセスするとエラーになります。

```swift
unowned var m: Member
do {
  let tanaka = Member(name: "Tanaka")
  m = tanaka
}
print(m) // => エラーが発生する
```

Appleのドキュメントではプログラムの実行中に変数の値がnilにならないことが明らかな場合、
弱い参照の代わりに非所有参照を使うことが推奨されているそうです。

弱い参照は、参照先のインスタンスが開放された場合に変数にnilを代入する処理が
オーバーヘッドになるため、非所有参照を使ったほうが処理を高速化できるとのことです。


## 最後に

unowned知らなかったので積極的に使っていきたいですね。


## 参考

・[詳解Swift 第3版](https://www.amazon.co.jp/dp/B06Y2G7C1G/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
SIerからWebに転職(転社)するためにやった事

# 概要
既にインターネット上のいろいろな所に同じような情報があるが、実際に自分がSIerからWeb企業に転職(転社)するためにやったことをまとめてみる。

# 簡単な職務履歴
28歳以前
ITとは関係のない全く別の仕事なので省略。
28~31歳
ITエンジニア(webアプリケーション開発者)に転職。最初は小規模SIerに入社。大手SIerの一次受け、二次受けが中心の企業。
31~35歳
インターネット業界に転職。Web広告配信・メディアなどを提供している会社に入社。職種はSIer時代と同じwebアプリケーション開発者。
35歳~38歳
データ分析(AI)企業に転職。自社製品(SaaS)の開発担当。職種は変わらずwebアプリケーション開発者。
38歳~
外資系IT企業に転職。職種はITコンサルタントに変更。

このエントリーは31歳の時にSIerからWebに転職(正確には転社)した時の記録である。

# 転職の動機
- 下請けで元請けの指示に唯々諾々と従って仕事をすることにやりがいを感じなかったため。
- 技術的なレベルアップがなかなかできておらず、危機感を強く感じていたため。

# 転職活動時期
2014年の5月スタートして8月に内定。活動期間は約４ヶ月。

# エントリ−
基本的には企業のHPから中途採用にエントリーする方法がメインだった。いくつかは転職サイトや転職エージェント専用のエントリーだったので、その場合は転職サイトと転職エージェントを介してエントリーした。
最終的に内定をもらったのはHPから直接エントリーした企業だった。

# 企業研究について
最初は数10人程度のベンチャー企業を目指していた。上場企業のように有価証券報告書がないので、HPや口コミサイトで情報を得た。
途中からは志望先を上場企業一本に絞った。口コミサイトは引き続き利用し、加えて有価証券報告書等やIR資料で財務指標を見るようにした。特に注目したのは社員一人当たりの営業利益率、利益剰余金、労働分配率などである。労働分配率は完璧には計算できないが、売り上げを分母に取って、有価証券報告書から読み取れる給与や福利厚生に当たるコストを分子にして計算した。加えて、役員報酬を入れた時の労働分配率と役員報酬を入れない時の労働分配率の２パターンを計算した。

# 提出した書類数と面接にたどり着いた回数
書類21社
面接7社

# 面接で聞かれた質問
## 技術的な質問以外の質問
転職の理由は何ですか。
自己紹介をして下さい。
5年後にどうなっていたいですか。
今のチームの中であなたが最も優れている能力は何ですか。
今までの仕事で一番大変だったことは何ですか。
仕事を進める上で大切にしている事は何ですか。
対人関係で苦労した事。
こんな会社は嫌だという会社はどのような会社ですか。
普段の趣味は何ですか。
仕事でhappyなこと。unhappyなこと。
弊社の志望理由を教えて下さい。
弊社に期待する事は何ですか。
入社したらどのような事をするのかイメージできていますか。
会社を選ぶ際に一番大切にしている事は何ですか。
(自分のキャリアについて)なぜそのような転職をされたのですか。
(少数の企業を志望している事について)なぜ少数がいいのですか。
卒論の内容について説明して下さい。
普段の情報収集について教えて下さい。

## 技術的な質問
今から渡す紙に書かれた問題をプログラミングで説いて下さい。言語は問いません。(いわゆるコーディングインタビュー)
- 回文数を少し変化させた問題
- フィボナッチ数列を少し変化させた問題
- fizzbuzz問題を少し変化させた問題
バックエンドで興味のある技術は何ですか。
JavaScriptの役割は何ですか。
Perlのメリットとデメリットを説明して下さい。
フレームワークを1から作る事のメリットとデメリットを説明して下さい。
プログラミングで大切にしている事は何ですか。
プログラミングをするとき、メモリ領域をどこまで意識していますか。
スピンロックとは何ですか。
最近印象に残った技術本は何ですか。

# 利用した転職サイト
- GREEN
- FindJob
- CareerTrek

# 利用した転職エージェント
- @Type
- ワークポート
- レバレジーズ

# 転職エージェントからのアドバイスとそれに対する自分の意見
- 30歳超えてるからweb企業に採用されるのは厳しい。

書類通過率が3割くらいであったことを考えると、それなりに当たっているとは思う。ただ自分の場合は年齢というよりは、エンジニアとしての経験値によるところが大きかったようにも思う。

- 事業会社はかなり忙しい。

これは会社による。全ての会社が多忙であるとは限らない。ワークライフバランスがしっかりしているところもあるし、そうでないところもある。


- 少しでも触った技術に関しては職務経歴書に書いた方がいい。

これは微妙なところで、深く理解していない技術を職務経歴書に書いておくと、面接で突っ込まれた時にうまく答えられない可能性がある。基本的にはある程度理解している技術についてのみ書くべきであると思う。

# 参考にしたサイト、本など
- [エンジニアtype](https://type.jp/et/feature/, "エンジニアtype") 
- [codeiq](https://codeiq.jp/)
- [転職会議](https://jobtalk.jp/)
- [Vokers](https://www.vorkers.com/)
- [Project Euler](https://projecteuler.net/)
Arduino Nanoでミニ電光掲示板(8×8マトリクスLED + MAX7219)を作る #2 電子パーツ購入編

[1 ソフトウェア インストール編](https://qiita.com/kan-no/items/34b4e54b58a7caae0441)
2 電子パーツ購入編
[3 (共通)準備編](https://qiita.com/kan-no/items/63450faddbec89e279a3)
[4 基本編](https://qiita.com/kan-no/items/14d02316267c99084e21)
[5 フルカラーLED編](https://qiita.com/kan-no/items/3e3434dc4b536b5b5c00)
[6 ミニ電光掲示板編(1)](https://qiita.com/kan-no/items/ca3879022235729771e6)
[7 ミニ電光掲示板編(2)](https://qiita.com/kan-no/items/93f2327cc5b865a2591d)

---
電子パーツ購入編です。
今回は、はんだ付けなどは行わず、ブレッドボードという板に電子パーツを差し込んで、おもちゃを組み立てる感覚で作ります。
多少知識がついてくると、秋葉原に行って色々見るのも楽しいですが、全部Amazonでも揃いますし、価格もさほど違いません。
価格の変動がありますが、おおむね1000円～2000円ぐらいで揃うと思います。

![nano.png](https://qiita-image-store.s3.amazonaws.com/0/198393/c5291578-83b8-3158-2082-2181c5dd183c.png)
まずは心臓部のマイコン、Arduino Nano。
「ピンヘッダ実装済み」でないものは要ハンダ付けなので、細かいはんだ付けが苦手な方は、「ピンヘッダ実装済み」と書かれた商品をお勧めします。

![usb.png](https://qiita-image-store.s3.amazonaws.com/0/198393/13c91a4f-3d57-dcfa-1113-458903c1046d.png)
Arduino Nano と PCを繋ぐUSBケーブル。コネクタのタイプは「A to miniB」です。
必ず「データ転送用」であることを確認します。「充電用」ではプログラムを書き込めません。
なお、Arduino Nano に、このUSBケーブルが同梱されているものもあります。
同梱されているケーブルは、コネクタのタイプやデータ転送用を間違えることは無いのでお勧めです。

![88led.png](https://qiita-image-store.s3.amazonaws.com/0/198393/a48e62f1-dbff-13a7-10e7-7ccf878884e9.png)
8×8マリスクスLED と、MAX7219が合体したもの(と、メス-メス ジャンパーワイヤー)。
こちらも、はんだ付けがされている商品とされていない商品があるので、特に理由が無ければ、はんだ付けされている方が簡単です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/a3372128-d4c0-25d2-f5c6-0e69a31d2687.png)
固いジャンパーワイヤー(短いもの)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/c4df0215-c4f7-bf5d-1c5f-74f497c58086.png)
柔らかいジャンパーワイヤー(長いもの) オス-オス

今回は、ジャンパーワイヤーに上記の2種類を使います。
使うのは少しですが、さほど高いものでもありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/1ca83926-9f96-0adf-4bf5-91ad0fc5cbb9.png)
こんな感じの固いジャンパーワイヤーのセットを買えば、短いものも長いものもあります。作るものによっては、こちらを購入しても良いと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/eeb5fe1f-d29e-7f01-fff2-55f49bc61829.png)
ブレッドボード。今回は30行の安いものを使いましたが、60行ぐらいのちょっと良いのを買った方が安心かもしれません。

---

ミニ電光掲示板を作るのには必要ありませんが、基本編で使うパーツです。
必要に応じて購入してみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/dd32e98e-2464-7bb4-c263-08ccbb60fcd7.png)
LEDです。色は任意。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/2db39dad-06e0-8643-057f-193dbc042ccd.png)
CDS(光センサー)です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/9668d5b6-ab6f-1cb2-7f0e-1c24019561cb.png)
1/4Wカーボン抵抗。だいたい100Ω程度。
今回は120Ωを使っています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/6d1c1a32-6274-ecff-f12f-1a7282e275ba.png)
1/4W金属皮膜抵抗。だいたい10kΩ程度。

カーボン抵抗は安価で、金属皮膜抵抗の方が正確だそうです。
(私のような素人の初歩的な工作では、あまり差は感じられません。値段もほんのちょっとの差。)
今回はLED用にカーボン抵抗、光センサーに金属皮膜抵抗を使っていますが、ぱっと見で区別をつけやすくするためで(ベージュか、水色か)、今回の装置では、だいたいの抵抗値さえ合っていれば、カーボン抵抗でも金属皮膜抵抗でも良さそうです。

このあたりのパーツ、特に抵抗は100個単位で売られていることが多いです。
今回必要なのは各1個ですが、100個セットでも各数百円ぐらいです。
(フルカラーLED編では、100Ω抵抗を3つ使います)

---
こちらも、ミニ電光掲示板を作るのには必要ありません。
フルカラーLED編で使うパーツです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/a7f0243d-4904-1c3a-e237-d6d26f121a6b.png)
フルカラーLED。この1つで何色でも出すことができます。
例えば、ウルトラマンのカラータイマーのように、最初は青く光って、後に赤で点滅するような場合に使えます。

---
[次へ](https://qiita.com/kan-no/items/63450faddbec89e279a3)
kerasの活性化関数

#概要
kerasの活性化関数をグラフにしてみた。


#写真
![acti4.png](https://qiita-image-store.s3.amazonaws.com/0/18104/cf98f8be-6b4e-797f-b17d-9d56f6cf3aef.png)


#サンプルコード

```
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.contrib.keras.python import keras
from tensorflow.contrib.keras.python.keras import backend as K

def tanh(x):
	a = np.asarray([x])
	a = K.variable(a)
	result = (K.get_value(K.tanh(a)))
	return result[0]
def relu(x):
	a = np.asarray([x])
	a = K.variable(a)
	result = (K.get_value(K.relu(a)))
	return result[0]
def sigmoid(x):
	a = np.asarray([x])
	a = K.variable(a)
	result = (K.get_value(K.sigmoid(a)))
	return result[0]
def linear(x):
	return keras.activations.linear(x)

x = np.linspace(-1.0, 1.0, 100)
plt.plot(x, tanh(x), label = "tanh")
plt.plot(x, relu(x), label = "relu")
plt.plot(x, sigmoid(x), label = "sigmoid")
plt.plot(x, linear(x), label = "linear")
plt.legend()
plt.savefig("acti4.png")
plt.show()

```

以上。
11月29日未明　火星15号

#概要
PyRockSimで、火星15号をシミュレートしてみた。
結果をcesiumで表示。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/0a65693e-6f8b-5ccf-a89c-068b6e34bd0a.png)

#成果物
http://jsdo.it/ohisama1/WaFv

以上。
２つの整数の最大公約数を求める

### 参考
kotlin スタートブック

----------------------------------------


再帰関数を使うとシンプルに書けるんだって。

```kotlin
tailreq fun gcd(a: Int, b: Int): Int =
    if (b == 0) a
    else gcd(b, a % b)
```

例えば、a = 50 , b = 35 だった場合

```kotlin
50 % 35 ... 15
35 % 15 ... 10
15 % 10 ... 5
10 % 5 ... 0 
```

となり、最大公約数は５となる。
Growi(旧Crowi-Plus)をアップデートする方法

基本的にマイナーレベルのアップデートでは特に問題は起きたことはないが、念のため作業前に[データのバックアップ](https://qiita.com/SkyLaptor/items/d02b702764428a08e3f5)やマシンのバックアップをとっておくこと。

## Growiのインストール
CentOS7向け手順: https://qiita.com/SkyLaptor/items/d963157b81a87f3b5726


## 指定バージョンにアップデート
```shell-session:
# systemctl stop growi
# cd {growiディレクトリ}
# git fetch --tags
# git tag
...
v3.0.7
v3.0.8
v3.0.9
# git stash
# git checkout v3.0.10
# yarn
# systemctl start growi
```


## Elasticsearchのインデックス再ビルド
Elasticsearchを導入している場合は、アップデート後に管理画面からインデックスを再構築しておくこと。


## プラグインのアップデート
以下のプラグインを入れていたが、アップデートしないと動作しなかった。
プラグインインストール手順は[こちら](https://qiita.com/SkyLaptor/items/c121a86318fdae1d64f4)を参照。

* lsx
* pukiwiki-like-linker

### lsx
```shell-session:
# systemctl stop growi
# cd {growiディレクトリ}
# yarn add growi-plugin-lsx
# systemctl start growi
```

### pukiwiki-like-linker
```shell-session:
# systemctl stop growi
# cd {growiディレクトリ}
# yarn add growi-plugin-pukiwiki-like-linker
# systemctl start growi
```
C++ Builder 10.2 Tokyo > IDE > UI > コントロールの追加 > よく使うコントロールがリスト表示されるほうがよい

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

10.2 Tokyoではデザインにおいて「コントロールの追加」という機能がある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f89c9f44-826e-9fa3-d550-3d8f1405d60f.png)

右クリックで選択して、上記の6つのコントロールを手早く追加できる。

この機能は便利ではあるが、上記の６つからしか選択できない。

IDE利用者の情報を蓄積して、よく使うコントロールから選択できるようになれば、UIとしてはさらに良くなるだろう。

また、「編集」という表記は「何だろう？」と思ったが、「TEdit」のことを「編集コントロール」として呼んでいるようだ。
http://docwiki.embarcadero.com/Libraries/Tokyo/ja/Vcl.StdCtrls.TEdit
> TEdit は、Windows の 1 行編集コントロールのラッパーです。

コーディングではTEditというキーワードを使うため、TLabel, TButton, TEdit,...という表記でいいように思う。
Arduino Nanoでミニ電光掲示板(8×8マトリクスLED + MAX7219)を作る #1 ソフトウェア インストール編

1 ソフトウェア インストール編
[2 電子パーツ購入編](https://qiita.com/kan-no/items/b39644aee91322203f3a)
[3 (共通)準備編](https://qiita.com/kan-no/items/63450faddbec89e279a3)
[4 基本編](https://qiita.com/kan-no/items/14d02316267c99084e21)
[5 フルカラーLED編](https://qiita.com/kan-no/items/3e3434dc4b536b5b5c00)
[6 ミニ電光掲示板編(1)](https://qiita.com/kan-no/items/ca3879022235729771e6)
[7 ミニ電光掲示板編(2)](https://qiita.com/kan-no/items/93f2327cc5b865a2591d)

---
電子工作初心者ですが試行錯誤して「ミニ電光掲示板」を作ってみたので、その工程を紹介します。

![fullcolorled.jpg](https://qiita-image-store.s3.amazonaws.com/0/198393/dc9b8cb5-d97c-e621-ec1d-9bce9772f908.jpeg)
フルカラーLED編で作るもの。 [動画はこちら](https://youtu.be/0RgY04YjW30)

![matrixled.jpg](https://qiita-image-store.s3.amazonaws.com/0/198393/5c764a9f-d14c-cbef-df29-d40a81e53dd4.jpeg)
ミニ電子掲示板編で作るもの。 [動画はこちら](https://youtu.be/c5deeWd33KE)

まず、ソフトウェア インストール編。
マイコンは Arduino Nano の互換機を使いました。値段が数百円ぐらいですごくお手軽です。
サイズ的にも、ラズパイ や Arduino Uno よりもずっと小さいので、使い勝手も良くお気に入りです。
私が Arduino Nano を知った頃は、まだラズパイzeroが出ていなかったのですが、今回作るものでしたら、Arduino Nano が価格的にもお手軽です。

ただ、安価な互換機を使う場合は、USBドライバーをインストールする必要があります。

＜Windows用＞
http://www.wch.cn/download/CH341SER_EXE.html
CH341SER.EXE

＜MAC用＞
http://www.wch.cn/download/CH341SER_MAC_ZIP.html
CH341SER_MAC.ZIP

ファイルをダウンロードしたら、インストールします。
画像はWindows版の例。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/afdf669d-f2c6-0d75-89c1-d1c8be6c8828.png)
[ INSTALL ]ボタンをクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/8bf88393-52d8-cd29-e751-56e7ad430282.png)
successfullyが出たらインストール成功。

続いて、Arduinoにプログラムを書き込むアプリをインストールします。

https://www.arduino.cc/en/Main/Software#
＜Windows用＞
arduino-1.8.5-windows.exe
＜MAC用＞
arduino-1.8.5-macosx.zip

「1.8.5」の部分はバージョンで、2017年12月末時点で、1.8.5 です。
私がダウンロードした時は 1.6.12 で、確か無料だったと記憶しているのですが、現在は有料のようです。
現在も古いバージョンがダウンロードできますが、こちらも有料のようです。

画像はWindows版の例。
![a1.png](https://qiita-image-store.s3.amazonaws.com/0/198393/7b776b74-9c96-67bd-ebbc-6b89cb4e11f6.png)
[ I Agree ] ボタンをクリック。

![a2.png](https://qiita-image-store.s3.amazonaws.com/0/198393/9567cf28-79d1-508e-c6bc-72c1d090f09c.png)
[ Next > ] ボタンをクリック。

![a3.png](https://qiita-image-store.s3.amazonaws.com/0/198393/d79fb0d9-9198-c872-3ab5-1f0a0b8b21a9.png)
[ Install ] ボタンをクリック。

![a4.png](https://qiita-image-store.s3.amazonaws.com/0/198393/d6a5d8dc-8508-1dd1-5ed3-58f9560cea8f.png)
しばらく待ちます。

![a5.png](https://qiita-image-store.s3.amazonaws.com/0/198393/ebcded77-f292-7a51-1247-530598fe5aed.png)
[ インストール(I) ] ボタンをクリック。

![a6.png](https://qiita-image-store.s3.amazonaws.com/0/198393/5404b106-b064-b3f8-6f01-cde930d82e7c.png)
[ インストール(I) ] ボタンをクリック。

![a7.png](https://qiita-image-store.s3.amazonaws.com/0/198393/f42099a6-f2d2-f666-cd31-1ef6618f3f10.png)
Completed が出れば、アプリのインストールが終了です。

![a8.png](https://qiita-image-store.s3.amazonaws.com/0/198393/04ce7a43-8e9e-96f0-37e0-e58e06abc041.png)
デスクトップにショートカットアイコンが追加されていると思います。

ソフトウエア準備編は、以上で終了です。

---
[次へ](https://qiita.com/kan-no/items/b39644aee91322203f3a)
Troopを使ってライブコーディングセッションをする！

#ライブコーディングでセッションをする
以前pythonとoscを使ってFoxDot上に建てたサーバーに文字列を送るという仕組みでライブコーディングのセッションをするという旨の記事を書きました。
その後もいろいろと探していたらyoutube上にこんな動画を見つけてしまいました。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/5rUnmdQp0kI/0.jpg)](http://www.youtube.com/watch?v=5rUnmdQp0kI)

うーん。ばっちりですね。
僕が最終的にやりたかったことがそのままできてます。最高です。
見てみるとFoxDotの開発者の方が作られているみたいです。そりゃ最高です。
というわけで使ってみます。

#Troopとは
ライブコーディングを複数人で同時に行うためのツールのようです。Google Docsのように使うことができます。
理論上はコマンドライン上で動く対話型インタプリタさえあればどんな言語でも使用可能だそうですが、この辺はよくわかりません。
デフォルトではFoxDot、TidalCycles、Supercolliderに対応しています。
素晴らしいですね。
Troop本体はpythonでの実装になりますので少なくともpythonはインストール済みである必要があるみたいです。

#仕組み
実際の命令の流れは以下のようになります。

Troopクライアント　→　Troopサーバー　→　SuperCollider

それぞれの矢印はOSC信号でやり取りされています。
実際に文字を打ち込む画面はTroopクライアントの画面ということになり、これが逐次同期されているという仕組みみたいです。

ちなみにですが各モードでの違いは文法と最終的にSuperColliderに送られるOSCの文字列の対応関係のようです。
UIや操作方法については特に変わりはないようです。

#インストール
Troopはpythonでの実装になりますのでosに合わせたpythonをインストールしておいてください。
また本記事ではSuperCollider、FoxDot、Tidal Cyclesのインストールについては割愛させていただきます。

githubからpythonのコードをクローンしてきます。これは使うパソコンすべてで行ってください。
https://github.com/Qirky/Troop

このTroopはFoxDotモードがデフォルトになっていますが、前述のようにほかにもTidalCyclesモードやSuperColliderモードでも使えます。
SuperColliderモードで使いたい方はサーバーパソコンでSuperColliderを立ち上げて

```git clone https://github.com/Qirky/Troop.git```

と打ち込んで実行しツールをダウンロード、インストールしておきましょう。
インストールが終わったらSuperColliderは再起動しておいてください。

#使い方
まず前提としてTroopではOSCが利用されているので使用するパソコンはすべて同じネットワークで接続してください。

サーバーとして使うパソコンでSuperColliderを立ち上げて、それぞれのモードに合わせたツールを実行します。
TidalCyclesの場合　→　```SuperDirt.start```
FoxDotの場合　→　```FoxDot.start```
Supercolliderの場合　→　```Troop.start```

次にサーバーパソコンでTroopサーバーを起動します。
コマンドプロンプトやターミナルでgithubからクローンしてきたフォルダに移動して

```python run-server.py```

と打ち込み実行します。
するとパスワードの入力を求められます。
これはクライアントとの合言葉のようなものですので好きな文字列で大丈夫です。

```Server running @ IPアドレス on port ポート番号```
と表示されれば成功です

さて、いよいよクライアント側です。
サーバーパソコン側でも操作をしたい場合は同じ工程を踏んでください。
先ほどと同じようにコマンドプロンプトやターミナルでgithubからクローンしてきたフォルダに移動して

```python run-client.py```

と打ち込み実行します。
この時デフォルトではFoxDotモードで起動しますが、
Tidal Cyclesモードで使いたい場合は

```python run-client.py --mode TidalCycles```

SuperColliderモードで使いたい場合は

```python run-client.py --mode SuperCollider```

と打ち込んでください。

するとまずサーバーのIPアドレスを聞かれますので、先ほどサーバー立ち上げ時に表示されたIPアドレスを打ち込みます。
次にポート番号を聞かれるので、これも同じように先ほど表示されたポート番号を入力します。
次にユーザー名を入力します。これは実際にコーディングする際カーソルの下に表示されるものになります。
最後に先ほどサーバー側で決めたパスワードを打ち込みます。
するとFoxDotによく似た画面が立ち上がるはずです。

#最後に
仕組みは難しくないのかもしれませんが、インストールにも起動にも何のストレスも感じない夢のような素晴らしいツールでした。
こういうツールをパパっと思いついた時に作れるようになりたいものです。
皆さんもぜひライブコーディングでのセッションを楽しんでください。
5. タブ区切りのファイルをtabulator で表示する

#目的のデータを探しやすくする
##headerFilter:を利用する
[4. タブ区切りのファイルをtabulator で表示する](https://qiita.com/percipere/items/83c1fbbff18281ca67e6)にフィルター機能を追加する

2万行を超える行数ともなればスクロールで必要なデータを探すのは大変なので、遺伝子シンボルで絞込できるように変更したい

"Symbol"のコラムの定義部分に headerFilter: true を指定することで、テーブルに表示するデータを絞込

```javascript
<script>
    $(document).ready(function () {
        // コラムの定義
        var gene_columns = [
            {title: "id", field: "id", visible: false},
            {title: "GeneID", field: "GeneID", visible: false},
            {title: "Symbol", field: "Symbol", formatter: ncbiLinkByGeneSymbolFormatter, headerFilter: true},
            {title: "RSG", field: "RSG"},
            {title: "LRG", field: "LRG"},
            {title: "RNA", field: "RNA"},
            {title: "t", field: "t", headerSort: false},
            {title: "Protein", field: "Protein"},
            {title: "p", field: "p", headerSort: false},
            {title: "Category", field: "Category"}
        ];
        //　tabulatorの設定
        $("#gene-table").tabulator({
            groupBy: "Symbol",
            height: "200px",
            columns: gene_columns
        });
        // ajaxでデータの読み込み
        $("#gene-table").tabulator("setData", "./output.json");
    });
</script>
```

"Symbol"のヘッダー部分に入力用のフィールドが表示される
![Screen Shot 2017-12-25 at 16.35.32.png](https://qiita-image-store.s3.amazonaws.com/0/213053/62320ee9-d4c2-f65d-1079-6d32cbf8d3f1.png)
STAT(signal transducer and activator of transcription protein family)のLRG_RefSeqGeneの遺伝子を表示するために、"Symbol"の"filter column..."と表示されているフィールドにSTATと入力
"Symbol"にSTATの文字列が含まれるデータのみ表示される
![Screen Shot 2017-12-25 at 16.39.17.png](https://qiita-image-store.s3.amazonaws.com/0/213053/6ae3d00b-efd8-c990-2718-aef6ee00e970.png)
(ヘッダーのフィールドの文字列が変更されてから0.3秒後にデータの絞込が開始される)



今回はここまで:smiley:
C++ Builder 10.2 Tokyo > エディタ > 補完機能 > 関数内のコンポーネント名は補完されない

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

```Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	bool res[5] = {0};

	CheckBox1->Checked = false; /*** 1 ***/

	res[0] = isTCheckBox(Panel1);
	res[1] = isTCheckBox(CheckBox1); /*** 2 ***/
}
//---------------------------------------------------------------------------
```

上記のようなコードを実装するとする。

1において「CheckB」からの補完でCheckBox1は候補にあがる。
2において関数の引数内で「CheckB」からの補完ではCheckBox1は候補にあがらない。

IDE提供のエディタを使う理由の一つとして、IDEが知っているコンポーネントや関数、定数の補完機能を使いたい。
上記のような状況では、外部エディタ(Sublime TextやVisual Studio Codeなど)を使うよりも利点があるだろうか。

関数の引数リストを表示する機能も内部エディタ使用のもう一つの理由ではある。