OmniAICreator/Qiita-1.07M huggingface dataset:
Linux memo


# diagnosis
## smtp-auth
```python
from smtplib import SMTP
smtp = SMTP('smtp.ecample.com')
smtp.login('<user>','<pass>')

(235, b'2.7.0 Authentication successful')
```

# user/group

## menber add to group
`usermod -aG [GROUPS] [USER]`

# filesystem

## Extend xfs file system
Install tools

`yum install xfsprogs`

> Then use the following command, substituting the mount point of the file system (XFS file systems must be mounted to resize them):

`xfs_growfs -d /mnt/xvdf`

# cron / anacron

## anacron
`/etc/anacrontab`

anacron ctrl `/etc/cron.(dayly|weekly|monthly)`

`/etc/cron.hourly` is kicked by cron.

`/etc/cron.d/0houry` -> `/etc/cron.houry`.

`cron.houry` = `01 * * * * root run-parts /etc/cron.hourly`

# ssh
## Port forwarding
To [server]'s 80
`ssh -L 9001:localhost:80 [server]`

To other server's 80.
`ssh -L 9001:[other-server]:80 [server]`

## Reverse port forwarding
`ssh -R 8000:localhost:8000 [server]`
[server] listen 8000 and forward local-pc's 8000.
This command [server] listen localhost:8000 only. If you want to listen 0.0.0.0[server], edit 'sshd_conf' and reboot sshd daemon.
http://superuser.com/questions/588591/how-to-make-ssh-tunnel-open-to-public

```/etc/ssh/sshd_config
GatewayPorts yes
```

and connect with `-g` option.

`ssh -g -R 8000:[other-server]:8000 [server]`

# apply sysctl.d
for amzn-linux

```bash:
. /etc/init.d/functions
apply_sysctl
```

# delete file start with '-'
use `--` option.

```bash:
touch -- -hoge
cp -- -hoge hoge
rm -- -hoge
```
Perlのボイラープレート

あまりperlを書かない自分のための備忘録

```boiler.pl
#!/usr/bin/perl

use strict;
use Sys::Hostname;

my %time;
my %hostname;

&getTime(\%time);
&getHostname(\%hostname);

sub getTime (\%) {
  my $time = shift;
  my ($sec, $min, $hour, $day, $month, $year, $mday) = (localtime(time))[0,1,2,3,4,5,6];
  $$time{'year'}  = $year + 1900;
  $$time{'month'} = sprintf("%02d",$month + 1);
  $$time{'day'}   = sprintf("%02d",$day);
  $$time{'hour'}  = sprintf("%02d",$hour);
  $$time{'min'}   = sprintf("%02d",$min);
  $$time{'sec'}   = sprintf("%02d",$sec);
}

sub getHostname (\%) {
  my $hostname = $_[0];
  $$hostname{'fqdn'}  = hostname();
  $$hostname{'short'} = (split(/\./,$hostname{'fqdn'}))[0];
}

```
phpで省略可能(Optional)な引数を実現したい

オプショナルの引数やりたいなー、って思って調べたら、出来そうでしたので、備忘録として、記述しておきます。

# 引数を省略したい。

例として、リストを出すような場合を想定します。

条件を付けた時だけ、その条件を元にデータを絞り込んで、条件が無かったら全件出したい、などですね。

そんな時の実装として、以下のような関数を作ったとします。

```php:条件付き絞込例
<?php
function getCustomer($name)
{
  if (name == null) {
    $sql = "SELECT * FROM customer";
    $data = /* ~ データ抽出処理 ~ */
  } else {
    $sql = "SELECT * FROM customer WHERE NAME = :name";
    $params = array(
      'name'=>$name,
    );
    $data = /* ~ データ抽出処理 ~ */
  }

  return $data ;
}

// 絞り込みたい場合
// 顧客名が hoge の人だけが抽出
echo getCustomer('hoge');

// 絞り込みたくない場合
// 全ての顧客が抽出
echo getCustomer(null);
?>
```

でも、絞り込みたくない箇所で毎回、`getCustomer(null)`なんて書くのはだるいですよね。

そんな時には、このように実装します。

```php:条件付き絞込例_改善
<?php
function getCustomer($name = null)
{
  if (name == null) {
    $sql = "SELECT * FROM customer";
    $data = /* ~ データ抽出処理 ~ */
  } else {
    $sql = "SELECT * FROM customer WHERE NAME = :name";
    $params = array(
      'name'=>$name,
    );
    $data = /* ~ データ抽出処理 ~ */
  }

  return $data ;
}

// 絞り込みたい場合
// 顧客名が hoge の人だけが抽出
echo getCustomer('hoge');

// 絞り込みたくない場合
// 全ての顧客が抽出
echo getCustomer();
?>
```

**`function getCustomer($name = null)`** の部分に注目してください。

いわゆる引数にデフォルト値を設定しておく、という手法で、`$name = null` と設定しておくことで、`getCustomer();` と `getCustomer(null);` の呼び出しは全く同じ結果となります。
webstorm, intelliJのTerminalの日本語が切れるバグが治っている



最近webstorm 12 EAPを使っていて、なんか使いやすいなって感じていた。

なぜだろう？って思っていたら
「日本語が切れるバグが治っている」

ってことだった。

これは良い。


intellij IDEA 16 EAPも同様。


## webstorm 12 EAP

![webstorm12.png](https://qiita-image-store.s3.amazonaws.com/0/41550/5b85b008-137d-8786-e573-b5d318b4ad29.png "webstorm12.png")

## webstorm 11

![webstorm11.png](https://qiita-image-store.s3.amazonaws.com/0/41550/e8c5caa9-96e9-a5d0-a466-d5e174806634.png "webstorm11.png")


## intellij 16 EAP

![intellij16.png](https://qiita-image-store.s3.amazonaws.com/0/41550/8cb00769-321d-563c-488c-cbf03187340c.png "intellij16.png")

## intellij 15

![intellij15.png](https://qiita-image-store.s3.amazonaws.com/0/41550/db25a2ca-78d5-e170-a6fa-c0e27341e990.png "intellij15.png")





## テストコード

![test.js.png](https://qiita-image-store.s3.amazonaws.com/0/41550/997dc730-f2e3-8c25-f75a-a55b933b7ee9.png "test.js.png")

## これか

![konohen.png](https://qiita-image-store.s3.amazonaws.com/0/41550/30269721-70b0-b8b5-4669-304ba2b3d901.png "konohen.png")
Slack | 「誰が入力中か」の表示をオフにする方法


# 注意

これは「あなたが、他メンバーの入力状態を見ない」ための設定だ。

「他のメンバーに、あなたの入力状態が見えなくなる」わけではないため注意。(そういう設定は 2016-02 現在、存在しないようだ )


## 1. Preference (設定) を開く

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/9416dde1-b168-fb3b-c241-5cd9b189b25b.png)

## 2. 「Message Theme」 のタブを選ぶ

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/8440e316-60cb-6599-4349-77662badd27a.png)

## 3. 

「Display information about who is currently typing in message 」をオフにする。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/3f9e6804-5555-72ca-a882-b509a4a4efcb.png)

## 効用

- 気が散らなくなる。
- 「お互いに入力状態」での間の読み合いがなくなる。
- そもそも「誰が入力中か」って重要じゃない気がする。
 
# 環境

- Slack 1.1.2
- Mac OXS



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
TrelloAPIを利用して、GoogleカレンダーにTrelloの特定リストを同期する。

# GoogleカレンダーにTrelloの特定のリストを同期したい。
私個人はTrello上にToday,Week,Monthといったリストを作ってタスクの管理を行っています。
しかし、チームではGoogleカレンダー上へ外出予定以外に社内作業のタスクなども登録しており、手動同期は手間がかかる上、登録していないとタスクの共有が行えない状況でした。

# Todayリストを常に本日の予定として登録する。
幸い、TrelloにはAPIが存在し、GoogleAppScript経由で比較的簡単に同期出来そうです。
APIの取得は http://qiita.com/AKB428/items/a4a9ff2893affb20f99c を参考に行いました。
GASを色々調べながらゴリゴリ書いてみました。

```js
// TrelloのAPIKey
var trelloKey = 'hogefugahogehogefugahoge';
// Trello連携用トークンID
var trelloToken = 'hogefugahoge';
// 取得対象のリストID
var trelloTodayList = 'hogefuga';
// Trelloユーザー名
var userName = 'hogehoge';
// 連携先GoogleカレンダーID
var gcalId = 'hoge@group.calendar.google.com';
// 連携時に削除キーにするDescription
var delDescription = 'Added by Trello'

function Trello2Gcal() {
  // 当日日付
  var d = new Date();
  d.setHours(23);
  d.setMinutes(59);
  d.setSeconds(0);
  // 前日日付
  var yd = new Date();
  yd.setDate(d.getDate() - 1);
  yd.setHours(0);
  yd.setMinutes(0);
  yd.setSeconds(0);
  // 本日＋前日のTrello予定を初期化
  deleteTrelloEvents(d);
  deleteTrelloEvents(yd);
  // Torelloから予定を取得
  var listurl = 'https://trello.com/1/lists/' + trelloTodayList + '/cards?key=' + trelloKey + '&token=' + trelloToken + '&fields=name';
  var todayTask = UrlFetchApp.fetch(listurl);
  var tasks = JSON.parse(todayTask.getContentText());
  for(var key in tasks){ 
    Logger.log(d + ":" + tasks[key].name + ":" + tasks[key].id ); 
    // Googleカレンダーへ投稿
    var gcal = CalendarApp.getCalendarById(gcalId);
    // Descriptionに削除用のキーを指定して登録
    gcal.createEvent(tasks[key].name + " From Trello", d, d,{description:delDescription})
  } 
  
}
// Trello登録されたイベントを削除する。
function deleteTrelloEvents(dt){
  Logger.log(dt);
  var gcal = CalendarApp.getCalendarById(gcalId);
  var events = gcal.getEventsForDay(dt);
  for(var i=0; i < events.length; i++){
    var dsc = events[i].getDescription();
    if(dsc==delDescription){
      events[i].deleteEvent()
    }
  }
}
```

あとはトリガーを15分～30分おきぐらいで走るようにしたらTrelloのリストが常に今日の予定として登録されるようになりました。

# 課題
* 日付、時刻指定がある場合にその指定通りに登録する。
    * 現状は他の共有カレンダーを邪魔しないように23:59固定なので。
* Trello上のコメント等をDescriptionにうまく共有する。
* 週の予定をさらにうまいこと登録したい。
iOS,Androidアプリの脆弱性診断にIBM Security AppScan Mobile Analyzerを使用してみた感想

WEBサイトだとおおよその攻撃手法、防御方法、また脆弱性診断のサービスも、イタチごっこではあるにせよ、だいたい出揃っている感があります。

ひるがえってアプリはどうか？
耐タンパー性を高めるくらいか？とか考えていました。

> 耐タンパー性とは
> http://e-words.jp/w/%E8%80%90%E3%82%BF%E3%83%B3%E3%83%91%E3%83%BC%E6%80%A7.html

でもやっぱり不安ですよね。
有償でアプリの脆弱性診断をやっている会社はたくさんありますが、それなりに良いお値段。

不安な時は長いものにまかれろということでIBMが提供しているSecurity AppScan Mobile Analyzer を試してみました。
30日間無料で使用できます。



## IBM Security AppScan Mobile Analyzer
http://www-03.ibm.com/software/products/ja/appscan-mobile-analyzer

これが診断結果
![Screen Shot 2016-02-17 at 11.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/74328/62737d12-b760-9251-5c33-9f2e5c5c2f67.png)
l

## 良い点

- お手軽である
  Androidはapkをアップロードするだけ。iPhoneは指定のツールでプロジェクトをビルドしたものをアップロードすれば、あとは全自動でスキャンしてくれます。

- 結果がわかりやすい
  脆弱性件数が High,Med,Low,Infoに分類されて数が表示されます。もう一目でヤバさがまるわかり。

- 診断レポートが豪華
  受託案件で納品物に使えるクオリティのPDFがもれなくついてきます。ハクがつくのは間違いありません。


## 悪い点

- スキャンに時間がかかる
  たいして大きいアプリでもないのに半日近い時間を要しました。納期に追われている時にはしんどいかも。

- 結果の信ぴょう性
  果たしてこの結果を信用していいのか？IBMのお墨付きだから正しいのか？情報の蓄積がほしいところです。



全体的にはカジュアルに使えて悪くは無い印象でした。
でももっと良いサービスがあればぜひコメント頂ければ、と。
Cybozu Desktop 2の仕様

#インストール時の注意点
・All Usersに対するインストールは不可。(2016/02/17-サイボウズ製品サポートへ確認)
・利用ユーザーのプロファイル単位でインストール作業が必要。
・インストールに際してインターネット接続が必須。
code first でカラムにユニーク制約をつける

対象のカラムにIndexアノテーションをつけて終了。

```csharp
/*
using System.ComponentModel.DataAnnotations.Schema;
*/
[Index(IsUnique = true)]
public string Email { get; set }
```

と思ったら、上記のようにstring型に対してUniqueを設定すると、Databaseマイグレーション時に以下のようなエラーが出る。

```bash
Column 'Email' in table 'dbo.Users' is of a type that is invalid for use as a key column in an index.
```

原因は、SQLServerの index key の最大長が900Byteだからとのこと。
ということで、カラムに最大長を設定してあげることで解決する。
最終的にはこちら。

```csharp
/*
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
*/
[Index(IsUnique = true)]
[StringLength(256)]
public string Email { get; set }
```

参考(というかそのまま)
http://stackoverflow.com/questions/10614575/entity-framework-code-first-unique-column
adb backupのオプションについて

adbのヘルプメッセージによると、adb backupコマンドにはいくつかオプションがある。説明文を日本語にしてみました。

```
adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]
                               - write an archive of the device's data to <file>.
                                 If no -f option is supplied then the data is written
                                 to "backup.ab" in the current directory.
                                 (-apk|-noapk enable/disable backup of the .apks themselves
                                    in the archive; the default is noapk.)
                                 (-obb|-noobb enable/disable backup of any installed apk expansion
                                    (aka .obb) files associated with each application; the default
                                    is noobb.)
                                 (-shared|-noshared enable/disable backup of the device's
                                    shared storage / SD card contents; the default is noshared.)
                                 (-all means to back up all installed applications)
                                 (-system|-nosystem toggles whether -all automatically includes
                                    system applications; the default is to include system apps)
                                 (<packages...> is the list of applications to be backed up.  If
                                    the -all or -shared flags are passed, then the package
                                    list is optional.  Applications explicitly given on the
                                    command line will be included even if -nosystem would
                                    ordinarily cause them to be omitted.)
```

もし`-f`オプションがなければ、カレントディレクトリの backup.ab ファイルに書き込まれる。
`-apk`,`-noapk`はAPKファイルの有無を指定する。デフォルトは`-noapk`(APKは含まない)。
`-obb`,`-noobb`はAPK拡張ファイルの有無を指定する。デフォルトは`-noobb`(拡張ファイルは含まない)。
`-shared`,`-noshared`は共有ストレージ(SDカード)コンテンツの有無を指定する。デフォルトは`-noshared`(共有ストレージのデータは含まない)。
`-all`はインストールされている全てのアプリケーションをバックアップ対象にする(これを指定しない場合は、バックアップ対象のパッケージを個別に指定する)。
`-system`,`-nosystem`は`-all`が自動的にシステムアプリケーションを含むかどうかを指定する。デフォルトは`-system`(システムアプリを含む)。
`<packages...>`はバックアップ対象のパッケージのリスト。`-all`か`-shared`フラグがある場合はこのパッケージリストは任意。ここで渡されたパッケージは`-nosystem`で除外されるパッケージだとしても含まれるようになる。

## コマンド例

### 全てのアプリをバックアップする。
APK自体、拡張ファイル、共有ストレージのデータは含まない。バックアップ先は ./backup.ab

```
adb backup -all
```

### 全てのアプリのAPKと共有ストレージのデータをバックアップする。
拡張ファイルは含まない。バックアップ先は C:\backup20111230.ab

```
adb backup -apk -shared -all -f C:\backup20111230.ab
```

### 特定のアプリのみバックアップする。
com.eje_c.henshincamera, com.eje_c.hirudoco の二つのアプリのみバックアップする。拡張ファイルや共有ストレージのデータは含まない。バックアップ先は ./backup.ab

```
adb backup -apk com.eje_c.henshincamera com.eje_c.hirudoco
```

## 復元方法

```
adb restore <ファイル名>
```

ファイル名には、バックアップ時に作成された backup.ab などのファイルを指定する。
rubyでslack apiを叩いてbotを動かす


今回はとりあえず、あまり時間をかけずにslackでbotを動かすことを目的としてるので、hubotとかrubotyとか使ってません。

## slackにbotユーザを作る
slackを開いて`Apps & Custom Integrations → Configure → Custom Integrations → Bots → Add Configuration`
と移動して、飼いたいbotを登録する。登録したらbotを操るためのTOKENを取得できるのでメモっておく。

## Gemを入れる
slack apiのRTM(Real Time Messaging)を楽に扱えるラッパー([aki017/slack-ruby-gem](https://github.com/aki017/slack-ruby-gem))を入れる。

```sh
$ gem install slack-api
```

## botに何か喋らせる
```ruby:slack.rb
require 'slack-ruby-client'

# 先ほど取得したTOKENをセット
TOKEN = 'xxxxxx'

Slack.configure do |conf|
  conf.token = TOKEN
end

# RTM Clientのインスタンス生成
client = Slack::RealTime::Client.new

# slackに接続できたときの処理
client.on :hello do
  puts 'connected!'
  client.message channel: 'your_channel_id', text: 'connected!'
end
```

```sh
$ ruby slack.rb
```

これだけ。すごい簡単。

## botと会話する
RTMではユーザからのメッセージを`message`イベントで検知できるので、botとインタラクティブに会話できる。

```ruby:slack.rb
require 'slack-ruby-client'

# 先ほど取得したTOKENをセット
TOKEN = 'xxxxxx'

Slack.configure do |conf|
  conf.token = TOKEN
end

# RTM Clientのインスタンス生成
client = Slack::RealTime::Client.new

# slackに接続できたときの処理
client.on :hello do
  puts 'connected!'
  client.message channel: 'your_channel_id', text: 'connected!'
end

# ユーザからのメッセージを検知したときの処理
client.on :message do |data|
  if data['text'].include?('こんにちは')
    client.message channel: data['channel'], text: "Hi!"
  end
  if data['text'].include?('かしこい') || data['text'].include?('えらい')
    client.message channel: data['channel'], text: "Thank you!"
  end
  if data['text'].include?('おやすみ')
    client.message channel: data['channel'], text: "Good night"
  end
end
```

```sh
$ ruby slack.rb
```

RTMでは他にも色々イベントを取れるようになってるので、他にも試したい人はここ https://api.slack.com/rtm を見ると幸せになれると思う。

## おしまい
今回はとりあえずbotを動かすことを目的とした記事なので、細かい説明とかかなり省いてます。はい。
詳しく知りたい方は公式ドキュメントとか他の方の記事が参考になると思います。

時間あったらherokuにのっけてbotを常駐させたい。
AWS Lambdaを使って、MySQLのコネクション数増大時にSlackにprocesslistを通知する


# やりたいこと

CloudWatch で MySQL の connection 数や CPU 使用率などを監視している状況で、警告が発生したときに即座に processlist を取得したい.

# やりかた

以下のような Lambda function を作成し、Event source として(RDS connection alertなどの通知先に設定した)適当な SNS Topic に対して subscribe しておけば良い.

```package.json
:
    "dependencies": {
    "mysql": "2.10.2",
    "slack-node": "0.1.7"
  },
:
```

```index.js
var Slack = require('slack-node');
var Mysql = require('mysql');

exports.handler = function(event, context) {
    var post = function(text, context){
        var slack = new Slack();
        slack.setWebhook("https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxx");
        slack.webhook({
            channel: "#healthcheck",
            username: "CloudWatch",
            text: text
        }, function(err, response){
            if (err) {
                console.error(err);
                console.log(response);
                context.fail('failure slack post');
            } else {
                context.succeed();
            }
        });
    };

    var connection = Mysql.createConnection({
        host     : 'xxxxxxxxx.xxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com',
        user     : 'xxxxxxxxx',
        password : 'xxxxxxxxx',
        database : 'xxxxxxxxx'
    });

    connection.connect();

    connection.query('show processlist;', function(err, rows, fields) {
        if (err) throw err;
        
        // ここで適当にフォーマットしてやるとみやすいかもしれない
        var text = JSON.stringify(rows);
        post(text, context);
    });

};

```

# 実行イメージ

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/1329/71ee4eca-8204-2a69-7dc5-504c1cb768be.png "Slack.png")

# 注意点

VPC 構成の DB に対してこれをやる場合は、Slack への外部アクセスをおこなうため、private subnet & NAT Gateway (もしくは NAT インスタンス) な環境で Lambda function を実行するよう設定してやる必要がある. public subnet & Internet Gateway 環境ではダメ.

# 参考

* [Amazon Web Services ブログ: [New] LambdaファンクションからのVPC内リソースへのアクセス](http://aws.typepad.com/aws_japan/2016/02/access-resources-in-a-vpc-from-your-lambda-functions.html)
* [CloudWatchのAlertをAWS Lambda経由でSlackに飛ばす - Qiita](http://qiita.com/tmtysk/items/7161b11e20ac5e2dfc01)
環境切り替え方法便覧

環境の切り替えを、各フレームワークでどうするかをまとめてみます。
http://12factor.net/ja/config をどう実現するか考えるため。

## Ruby on Rails

環境変数またはコマンドライン引数"RAILS_ENV"で指定する。

デフォルトで用意されている環境の種類は以下のとおり。

* development
* test
* production

デフォルトは`development`

## Sinatra

環境変数"RACK_ENV"で指定する。

デフォルトで用意されている環境の種類はRailsと同じ。デフォルトの環境がdevelopmentなのもRailsと同じ。

## express

環境変数"NODE_ENV"で指定する。

デフォルトで用意されている環境の種類はRailsと同じ。デフォルトの環境がdevelopmentなのもRailsと同じ。

## Spring Boot

下記どこかで指定した"SPRING_PROFILES_ACTIVE"が使われる。

1. Command line arguments.
1. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property)
1. JNDI attributes from java:comp/env.
1. Java System properties (System.getProperties()).
1. OS environment variables.
1. A RandomValuePropertySource that only has properties in random.*.
1. Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants)
1. Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants)
1. Application properties outside of your packaged jar (application.properties and YAML variants).
1. Application properties packaged inside your jar (application.properties and YAML variants).
1. @PropertySource annotations on your @Configuration classes.
1. Default properties (specified using SpringApplication.setDefaultProperties).

デフォルトのプロファイルは`default`。慣例としてプロファイルは、application.properties(またはYAML)でそれごとにファイルを作る。

## Seasar2

クラスパスに含まれる`/env.txt`で指定する。

デフォルトで用意されている環境の種類は以下のとおり。

* ut: 単体テスト環境
* ct: 結合テスト環境
* it: 統合テスト環境
* production: 本番環境

デフォルト(env.txtがない場合)の環境は、`production`である。


## Leiningen

leinコマンドの引数で使う(使わない)プロファイルを指定する。複数のプロファイルを重ね合わせることができる(Mavenからの思想継承)

```shell-session
lein with-profile 1.3 test :database
```

デフォルトでActiveになるプロファイルは以下のとおり。

* :base
* :system - providedスコープの依存ライブラリをクラスパスに含める
* :user - ユーザごとの設定
* :provided - providedスコープの依存ライブラリをクラスパスに含める
* :dev

## [environ](https://github.com/weavejester/environ) (clojure)

* 12 Factor Appにしたがうように、環境変数から値をとるためのライブラリ。
* Spring Bootと同じように、システムプロパティやファイルでも指定可能。
* 同作者のductフレームワークみると、結局設定のグルーピングはやっている。
[rpm][yum][apt][chocolatey]パッケージ管理システムでよく使うコマンドまとめ

複数のパッケージ管理システムを使っていると、こっちのシステムではどうやるんだっけ？
ということがよくあります。
そんなときに参照したい情報をまとめました。


| やりたいこと | yum/rpm | apt | chocolatey |
|:----------|:----|:----|:-----------|
| パッケージのインストール | `yum install ` *パッケージ名* | `apt-get install ` *パッケージ名* | `choco install ` *パッケージ名*
| パッケージのアンインストール | `yum remove ` *パッケージ名* | `apt-get remove ` *パッケージ名* | |
| 全パッケージの更新 | `yum update` | `apt-get upgrade` | `choco upgrade all` |
| インストール済みパッケージの一覧 | `yum list installed` または `rpm -qa` | `apt list --installed` | `choco list -l` |
| あるファイルが属するパッケージを調べる | `rpm -qf` *ファイル名* | `dpkg-query --search` *ファイル名* または `apt-file search` *ファイル名*  | |
| パッケージを探す | `yum search ` *キーワード* | `apt search ` *キーワード* | |
| パッケージの情報 | `yum info ` *パッケージ名* | `apt show ` *パッケージ名* | |
| パッケージに含まれるファイルの一覧 | `rpm -ql ` *パッケージ名* | `dpkg-query --listfiles` *パッケージ名* または `apt-file list ` *パッケージ名* | |


apt-fileコマンドは、apt-fileパッケージに入っています。
共有フォルダのマウントでmounting failedになる場合の対処法

VirtualBoxのバージョンとGuest additionsのバージョンが一致せず、共有フォルダのマウントに失敗する際の対処法。

## エラー内容

vagrant up すると以下のような共有フォルダのマウントに失敗したエラーメッセージが表示される。

```
GuestAdditions versions on your host (5.0.10) and guest (4.3.6) do not match.

    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

## 対処法

vagrant-vbguest の自動更新をOFFになるようVagrantfile内で設定する。


```lang:Vagrantfile
# 以下を追記。
config.vbguest.auto_update = false
```

（※vagrant up済みの場合は、vagrant destoryで破棄し、再upする必要があります。）
電子工作、ハードウェア初心者向け、とりあえず買っておくと便利なアイテム

Webエンジニアやアプリ開発者がハードウェアを学ぶのに役に立つアイテムを紹介します。

#ハンダコテ
ハンダコテを選ぶときは温度に注意しましょう。ダイヤルで温度が変更できるタイプがオススメです。

#こて台
ハンダこての電源を入れても、すぐに高温にはなりません。カップラーメン食べたい時の、湯沸かしポットと同じです。作業が長丁になる場合は、ハンダこてを置く台を用意しましょう。安いタイプは安定しないので火事の元になります。お金に余裕があれば、できるだけしっかりとしたコテ台を選びましょう。自分の場合はハッコー633を使ってます。

http://ec.hakko.com/goodsdetail.php?goodsid=026389

#はんだ吸取り線
間違ってハンダ付けしてしまった時にあると便利。一度ハンダ付けしたハンダを基板から取り除くのに使用します。除去したい場所に吸い取り線を置いて、上からハンダこてで熱を加える事で、ハンダを吸い取ってくれます。

#こて先クリーナー
ハンダ付けが上手い人は、小手先が常に綺麗です。ハンダこての先端の部分を清潔に保つことで、ハンダの塗がよくなります。コテ台に固定できるタイプもありますので、常に手元に用意しておき、綺麗に保ちましょう。

#フラックス
取り付け部分にフラックスという液体状の松脂？を塗るとハンダが綺麗に濡れます。

#グルーガン
100円ショップで売ってます。ハンダ付けして完成した試作品をカバンにぶち込んみ、移動中にハンダが取れて動かないことありますよね。完成品ば、グルーガンを使って半田の溶接部分を樹脂で固定しましょう。注意点として、一度グルーガンで固定してしまうと、リメイクできなくなります。

#テスタ
きちんと説明書通りに取り付けたけど動かない。テスタの通電チェックを使えば、電線の断線など、目では確認できない部分をテストすることができます。また電子部品は電圧や電流の制限があります。たとえば3.3Vで動作する電子部品に5Vの電圧をかけるとぶっ壊れてしまいますので、取り付ける前に電圧や電流を測定しましょう。

#オシロスコープ
テスターを使った電圧の測定は正確ではありません。測定した数値を平均して表示しているため、急激な電圧の変化を測定することは出来ません。オシロスコープを使えば、時間軸で電圧の変化を可視化することができます。動作が不安定だったり、ボタンを押した時にご動作が起こる時など、オシロスコープを使用して可視化してチェックすることで、原因を特定することが出来ます。

#Arduino
みんな持ってるArduino。脱初心者したいなら回路図や基板データの作成は必須です。そんな時に一番参考になるのがArduino。電子回路や電子基板のデータが公開されてますので、参考になるホームページが多数あります。

#CAD
Sparkfunやスイッチサイエンスでは電子工作の初心者が手軽に利用できるように基板に部品を取り付けた状態(シールド化)で購入することが出来ます。商品が届いたらブレッドボードに挿したり、Arduinoにつなげたり手軽に利用できるので便利ですよが、もし電子工作の初心者を抜け出したいのなら、自分でシールドを設計できるようになりましょう。世界には新しい電子部品が次々と登場してます。シールド化されていない部品もたくさんありますのでCADを使って基板を自作してみましょう。中でもEagleは商用利用でなければ、10cm✕10cm以内なら無償で使え、Macでも使えるので試してみてはいかがでしょうか？

#たのしい電子工作 Arduinoでガジェットを作ろう！
基板の作り方や回路図の見方などEagleを使った基板の作り方を解説した本です。全くの素人だった私は、この本を読んで基板が作れるようになりました。個人差はありますが、貴重な本です。

#ホットプレート
docker exec -it コンテナ名 bash をaliasに登録する

**~/docker-bash.sh** を作成して以下の内容で保存する。

```
#!/bin/bash
docker exec -it $1 bash
```

**.bashrc** に先ほど作成したファイルをaliasとして登録する。

```
alias docker-bash=". ~/docker-bash.sh"
```

bashに再接続すると以下のコマンドでコンテナのbashに入れる。

```
docker-bash コンテナ名
```
phina-starter - とりあえずイイ感じにゲームを作り始めたい人のためのボイラープレート

## TL; DR
- JS製国産ゲームライブラリ、[phina.js](http://phinajs.com)を使おうと思った
- イイ感じのボイラープレートがなかった
- [phina-starter](https://github.com/p1ch-jp/phina-starter)を作ってGitHubに上げた
- 良ければ使ってね

## phina.jsを使い始めた

どうも、カタチから入るマンことPちゃんです。
昨日から、以前より気になっていた、新進気鋭のJS製国産ゲームライブラリの[phina.js](http://phinajs.com)を使い始めました。

## 使ってみようとした
開発を始めようと思い、公式サイトを見たが`npm`の表記が一切ない。
CDNから読み込んで簡単に使い始められるよ！的なことが書いてあるが、ES6だなんだって言ってる時代にCDNから読み込んで使うのか、うーんとなる。

そう思ったぼくは、Twitterで「phina.js、npmで使えないのがなぁ...」(よく考えれば直接githubのリポジトリ指定して`npm install`しろみたいな話ではある)みたいなことを呟いたら、作者の人がリプくれて、リプを返したら、ものの数時間もしないうちにnpmに最新のphina.jsを登録してくださいました。ありがとうございました。

(こういうのが個人開発、国産ライブラリの良いところだと思う)

これで`$ npm i phina.js`で最新版のphina.jsがインストールできるようになりました。

## カタチから入るマン、ボイラープレートを作る
さてさて、ネットで軽くphina.jsについてググっても、だいたいのサンプルがCDNから読み込んで使っているわけですね。
簡単でとても良いと思うのですが、せっかくなのでもう少しイイ感じに開発を進められるようにしたいです。

そんなこんなで、phina-starterを作りました。

> **[p1ch-jp/phina-starter](https://github.com/p1ch-jp/phina-starter)**
> A starter kit for phina.js

watchifyを使った自動コンパイル、babelifyを使ったES6対応、budoを使ったローカルサーバー(ライブリロード対応)という感じにしました。

なんとなく気分でGruntやGulpなどのタスクランナーを使わず`npm scripts`だけで動く感じにしました。

## 使い方

使い方は以下

```
$ git clone git@github.com:p1ch-jp/phina-starter.git
$ cd phina-starter
$ npm install
$ npm start
```

`http://localhost:9966`にアクセスしてphina.jsのバージョンが出たら成功ですので、頑張ってゲーム作ってください。

`./build/bundle.js`が`No such directory or file`みたいなエラー吐いたら`mkdir build`でbuildディレクトリを作ってください。

基本的な構成としては、`./src/index.js`でガリガリ書くと、`./build/bundle.js`に吐き出されて、それを`index.html`から読み込み、RUN!!って感じです。

環境ができたところで、ちゃんとゲーム作ります。
UIセンスが壊滅的なエンジニアがそれっぽいwebアプリを作るために使った無料UIライブラリをまとめておく

仕事の傍ら、暇つぶしとかでwebアプリを構築したりするわけですが、どうにもUIセンスがなさすぎて、カッコイイサイトとかを参考に真似したりしても、なぜか自分でアレンジするととてつもなくダサくなる、ということを繰り返してきました。

で、もうこうなったら自分で考えずに、すべてライブラリに頼ろう！と思ってwebサイトを構築した時に使ったcssやjsのフレームワーク、ライブラリなんかを、簡単なコメント添えてまとめておこうと思います。

css自分で一切書かなくても、このぐらいのUIまではいけそうです。

![スクリーンショット 2016-02-17 10.16.06.png](https://qiita-image-store.s3.amazonaws.com/0/105934/6da290e0-0ed1-9e4b-e047-4ce4e7cb58a7.png)

![スクリーンショット 2016-02-17 10.16.50.png](https://qiita-image-store.s3.amazonaws.com/0/105934/5fdfda5b-35fc-a157-b350-c6622941aad8.png)


# フレームワーク

## Bootstrap

http://getbootstrap.com/

ベースはtwitter bootstrapの恩恵に授かります。
GoogleMaterialDesignLiteも見た目はかっこいいんですが、色々コンポーネントがたりなかったりして、結局いくらか自分でデザインしないとどうにもならなくなる印象です。

## jQuery

https://jquery.com/

今更書くまでもないですが、jQuery入ってないと動かないライブラリも結構あるので要りますね。

# UIKit

## Bootswatch

https://bootswatch.com/

bootstrapベースのUIキットとしては王道な感じですが、bootstrap感を消すのには最適です。
個人的に角丸なUIがう〜んという感じなので、yetiを使うと今っぽくて好きです。

http://bootswatch.com/yeti/

# ライブラリ

## viewerjs

https://github.com/fengyuanchen/viewerjs

画像投稿系のサイト作るにはもってこいです。
これひとつあればなんとなくそれっぽくなります。


## Bootcards

今流行りのカード型UIのBootstrap版。
FlatUIでyetiにしてると、Bootstrap感もなくていい感じ。

http://bootcards.org/


## Remodal

https://github.com/VodkaBears/Remodal

モーダル表示用のライブラリです。
UIが比較的かっこよくて、かつ、シンプルで扱いやすいので重宝します。

## Bootbox.js

http://bootboxjs.com/

アラートをかっこよく見せるためのライブラリ。
jsデフォのアラートとか興ざめなので大事です。

## Dropzone.js

http://www.dropzonejs.com/

"input type=file"をかっこよく、かつ、ドラッグ・ドロップで保存させられるライブラリ。
UIを自分で好きに変更できるのがいいですね（センスないんでそのまま使いますが）
デフォルトだと、プレビュー画像が勝手に切り取られて表示されてしまうのが難点。


## Chart.js

http://www.chartjs.org/docs/

グラフを書くのに使います。
サイトによってはまったく利用しない可能性ありますが、今回は使っていたので書いておきます。
グラフ書く系のライブラリの中では使いやすいかな〜と思ってます。

## infinite-scroll

https://github.com/infinite-scroll/infinite-scroll

無限スクロールさせるライブラリですね。
画像の一覧ページとかで結構重宝します。
至るところで使われてる感ありますが、大事なので追加！

---

という感じで、もっと他にもいいUIツールとかライブラリあったら教えてください！
Node.jsのAPIサーバーを起動してテストを実行するコマンドを作る お手製スクリプト編


# 短い結論

1. テスト単体とほとんど同じ表示が可能
2. 実現コマンドを特定するのが面倒

# 背景

APIサーバーの起動とテストの実行が別のコマンドだとテストの実行が面倒です。

## 例
例えば[syamo](https://github.com/luxiar/syamo)と言うアプリケーションは、次のコマンドでサーバーを起動します。

```
npm start
```

別のターミナルでテストを実行します。

```
npm test
```

1コマンドにして、1ターミナルで実行したい思いがあります。

# 作戦
[child_process.spawn](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options)を使う作戦です。
child_process.spawnはは、子プロセスを起動できます。

# 実行

## 準備
### スクリプト
スクリプトを用意します。

```js:test.js
const child_process = require('child_process'),
  server = child_process.spawn('node', ['node_modules/babel/lib/_babel-node', 'app.js']),
  test = child_process.exec('npm test', () => {
    server.kill()
    process.exit()
  })

test.stdout.pipe(process.stdout)
```

server.killは、起動した子プロセスは殺せます。しかし、孫プロセスが残ります。サーバーの起動コマンドとを直接指定する必要があります。
syamoはbabel-node（5.8.35）で起動しています。起動の仕方がちょっと変わっています。

### 起動コマンド

`npm start`後に`ps -ef`をすると、次のプロセスがわかります。

```
501  4408  4405   0  9:54AM ttys000    0:00.09 node /Users/shigerunakajima/syamo/node_modules/.bin/babel-node app.js
  501  4409  4408   0  9:54AM ttys000    0:00.98 /usr/local/bin/node /Users/shigerunakajima/syamo/node_modules/babel/lib/_babel-node app.js
```

```
/usr/local/bin/node /Users/shigerunakajima/syamo/node_modules/babel/lib/_babel-node app.js
```
のパスを修正して
`node node_modules/babel/lib/_babel-node app.js`という起動コマンドがわかります。





### 実行
syamoは必要な環境変数が多いです。
node-foremanを使って、環境変数をファイルから読み込んでスクリプトを起動します。

```
node_modules/.bin/nf run node test.js
```

参考：[node-foremanで環境変数をファイルから読み込んでコマンド実行](http://qiita.com/ledsun/items/454bedb30574a3f72686)

### 結果
サーバーのログとテスト結果が混ざって残念な感じです。

```
[OKAY] Loaded ENV .env File as KEY=VALUE Format

> syamo@0.0.2 test /Users/shigerunakajima/syamo
> mocha --require espower-babel/guess -c



  An authentication
    ✓ is errer by chatroom. (603ms)

  Issue
    ✓ is ok. (822ms)
    ✓ is ignored by duplicate.
    ✓ is not ignored that is sent to other chatroom. (692ms)
    ✓ is ignored by update action.
    ✓ is ignored by close action.

  MR
    ✓ is ok. (1341ms)
    ✓ is through that is unchecked. (780ms)
    ✓ is ignored thats status is merged.
    ✓ is error unless any information from Gitlab API. (293ms)

  Push
    ✓ is ok. (485ms)
    ✓ is ignored by total_commits_count 0

  A template
    ✓ is used for the chatroom. (413ms)


  13 passing (5s)
```

良い感じです。
mochaを単体で実行した場合と、ほぼ同じ出力が得られます。

# 補足
テストコードの出力に色をつけるには、mochaに[-cオプション](https://mochajs.org/#usage)をつけます。

# 関連
[Node.jsのAPIサーバーを起動してテストを実行するコマンドを作る node-foreman編](http://qiita.com/ledsun/items/cfa0001a6cff72be7a01)
Sublime Text > Word WrapのON/OFF > Alt, v, w, [Enter]

```txt:動作確認
Sublime Text2 on Windows 7 pro 32bit
```

Sublime Text2でよく使うWord WrapのON/OFFのショートカット。

http://qiita.com/7of9/items/5c653914b325e394d3c3
と同じ要領で以下でできるようだ。

1. Alt
2. v
3. w
4. Enter
oF0.9.0でofxTrueTypeFontUCが"freetype2/freetype/freetype.h not found"になるエラー

#freetype2/freetype/freetype.h not found
0.8.4と0.9.0でfreetypeディレクトリ内の構造が違うので、
ofxTrueTypeFontUC.cppの13行目あたりに書いてある

```c++:ofxTrueTypeFontUC.cpp
#include "freetype2/freetype/freetype.h"
#include "freetype2/freetype/ftglyph.h"
#include "freetype2/freetype/ftoutln.h"
#include "freetype2/freetype/fttrigon.h"
```

を

```c++:ofxTrueTypeFontUC.cpp
#include "freetype.h"
#include "ftglyph.h"
#include "ftoutln.h"
#include "fttrigon.h"
```

に書き換えると通ります。

##参考
[Missing OF lib include files](https://forum.openframeworks.cc/t/missing-of-lib-include-files/14326)
c++ builder > タブを閉じる > Alt, f, c

http://qiita.com/7of9/items/a77ba2751538314598b4
をきっかけとして、今まで時間がかかっている作業を短縮できるめどがついた。

http://qiita.com/7of9/items/82309b359464294809ea
で行う「タブを閉じる」は以下の手順でいい

1. Alt
2. f
3. c
Mac OS X El CapitanにrbenvでRuby 1.8.7をインストールする

## 背景

さくらのレンタルサーバーで動くRubyスクリプトをサクッと作りたくて（別のバージョンのRubyをインストールすることもできそうだけど、そこまですることもないような規模なので）、さくらのレンタルサーバーで `ruby --version` したら `ruby 1.8.7 (2012-10-12 patchlevel 371) [amd64-freebsd9]` と言われてしまったので開発環境のMacにも同じバージョンのRubyをインストールすることに。すんなりは行かなかったのでメモ。

## 前提

- Homebrew導入済み
- rbenv導入済み

## インストール

いつものように下記実行するがエラー。

```
$ rbenv install 1.8.7-p371

ERROR: This package must be compiled with GCC, but ruby-build couldn't
find a suitable `gcc` executable on your system. Please install GCC
and try again.

DETAILS: Apple no longer includes the official GCC compiler with Xcode
as of version 4.2. Instead, the `gcc` executable is a symlink to
`llvm-gcc`, a modified version of GCC which outputs LLVM bytecode.

For most programs the `llvm-gcc` compiler works fine. However,
versions of Ruby older than 1.9.3-p125 are incompatible with
`llvm-gcc`. To build older versions of Ruby you must have the official
GCC compiler installed on your system.

TO FIX THE PROBLEM: Install Homebrew's apple-gcc42 package with this
command: brew tap homebrew/dupes ; brew install apple-gcc42

You will need to install the official GCC compiler to build older
versions of Ruby even if you have installed Apple's Command Line Tools
for Xcode package. The Command Line Tools for Xcode package only
includes `llvm-gcc`.

BUILD FAILED (OS X 10.11.3 using ruby-build 20160130-6-g9e57fb0)
```

`brew tap homebrew/dupes ; brew install apple-gcc42` やれって書いてあるけどそれやっても同じで悩んでいましたが、環境変数 `CC` で指定したコンパイラを使ってビルドさせることができるようです。私の環境ではapple-gcc42は `/usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2` にインストールされていたので、下記のようにしてやります。

```
$ CC=/usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2 rbenv install 1.8.7-p371
Downloading ruby-1.8.7-p371.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p371.tar.bz2
Installing ruby-1.8.7-p371...
Installed ruby-1.8.7-p371 to /Users/youcune/.anyenv/envs/rbenv/versions/1.8.7-p371

Downloading rubygems-1.6.2.tgz...
-> https://dqw8nmjcqpjn7.cloudfront.net/cb5261818b931b5ea2cb54bc1d583c47823543fcf9682f0d6298849091c1cea7
Installing rubygems-1.6.2...
Installed rubygems-1.6.2 to /Users/youcune/.anyenv/envs/rbenv/versions/1.8.7-p371
```

インストールされていることを確認。

```
$ rbenv versions
  system
  1.8.7-p371
* 2.3.0 (set by /Users/youcune/.anyenv/envs/rbenv/version)
```

## 参考文献

- [Mac(Mavericks)にRuby1.8.7を入れようとしたら大変だった話 - Qiita](http://qiita.com/takc923/items/412d7d6b7ea045d66a3f)
【PhpStorm】DeploymentのSFTP設定時、PuTTYのppkファイル読み込みエラーになる場合の対処方法

タイトルの件でちょっとハマったので対処方法を共有します。

こちらを参考にしました。
http://stackoverflow.com/questions/26136976/phpstorm-ssh-wont-bring-me-the-next-button


# **環境**
Windows 7 64bit
PhpStorm 10 (Windows版)
PuTTY 0.60


# **現象**

## 発生画面

以下のどちらかのデプロイ先リモートホストを追加する画面

・メニューバーから：
　Tools -> Deployment -> Configuration...

・プロジェクト新規作成時：
　Create New Project from Existing Files -> 
   「Web server is on remote host, files are accessible via FTP/SFTP/FTPS.」

## **条件**

リモートホスト追加画面で対象ホストなど必要な項目に入力し

「Type」→「SFTP」を選択
「Auth type」→「Key pair (OpenSSH or PuTTY)」を選択
「Private key file」→PuTTYのppkファイルを選択すると、画面下部にエラーメッセージが表示される。


## **エラーメッセージ**

Keypair 'XXX' is corrupt or has unknown format.
Only SSH2 keys in OpenSSH format (DSA, RSA or ECDSA) or PuTTY Private Key *.ppk keys are supported.
Error message: The cipher 'aes256-cbc' is required, but it is not available.

[キャプチャ]
![phpstorm.png](https://qiita-image-store.s3.amazonaws.com/0/60118/e8e16f41-09f2-1557-2a3d-b2fd1c7a5f81.png)


# **原因**

エラーメッセージでググッてみたところ、256bitの鍵を扱うためには別途ポリシーファイルが必要らしい。


# **対処方法**

まずjavaのバージョンを確認します。
(PhpStormは独自にJREのコピーを持っているので、こちらのバージョンを確認する)

コマンドプロンプトに以下を入力します。
(※インストールパスやバージョン部分は適宜置き換えて下さい)

`"C:\Program Files (x86)\JetBrains\PhpStorm 10.0.3\jre\jre\bin\java.exe" -version`

→ java version "1.8.0_51"

1.8 = JDK/JRE 8なので以下からポリシーファイルをダウンロードします。
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

こちらでも同様です。
http://www.oracle.com/technetwork/java/javase/downloads/index.html の
「Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8」

ダウンロードしたzipを解答すると2つのjarファイルがあるので、PhpStormの以下のディレクトリのファイルと置き換えます。(適宜バックアップして下さい)

C:\Program Files (x86)\JetBrains\PhpStorm 10.0.3\jre\jre\lib\security

このあとPhpStormを再起動すると、ppkファイルを読み込めるようになるはずです。
c++ builder > 外部エディタでコード編集時の編集合戦の回避策

```txt:動作確認
C++ Builder XE4
```

Sublime Textなどの外部エディタによる編集をしている中で、C++ Builder(以下IDEとする)との兼ね合いで変更が消える場合がある。

### 再現方法

だいたいの再現方法

1. IDEにおいてソースをタブで開いておく
  - AlertParser.cpp
2. Sublime Textにおいてソースを変更して保存する
  - AlertParser.cpp
3. Sublime Textにおいてヘッダを変更して保存する
  - AlertParser.h
4. IDEに戻ると`モジュール AlertParser.cppのタイムスタンプが変更されました。読みなおしますか?` と表示される
5. はい(Y)を選択する
  - AlertParser.cpp は変更される
  
<font color=red>上記で AlertParser.h が変更されない場合がある。</font>

そして、元の AlertParser.h の状態をIDEが復元したりして、Sublime Textで編集した情報が消える場合がある。

### 対策

外部エディタで編集する場合は以下のようにする

1. IDEにおいて編集する cpp ファイルのタブを閉じておく
2. Sublime Textで .cpp を編集
3. Sublime Textで .h を編集
4. IDEにおいて、プロジェクトマネージャ内のファイル構造において編集したファイル(AlertParser.cpp)上で右クリックして「ビルド」を実行してエラーがないか確認

これだと編集合戦にならない。

この使い方を始めて数時間、Sublime Text側のBookmarkが消える（ファイルの終端に行ってしまう）症状がなくなった気がする。

### 備考

標準のエディタを変更するという方法もあるかもしれないが、IDEの設定はできるだけデフォルトで使いたい理由がある.
c++ builder > TODOリスト表示 > Alt, v, l

```txt:動作確認
C++ Builder XE4
```

TODOリストの表示のショートカットはないものと思っていた。

以下でできた。

1. Alt
2. v
3. l


マウスでの選択時には上記の情報が一切表示されないので、今まで知らずにいた。ヘルプのどこかに書いていたかもしれないが、何度も読んでいる中でそれに気づかずにいた。

altを何気なく押して、ショートカットに気づいた。
LaravelでSocialiteでソーシャルログイン


##環境

利用するツールのバージョンなど。

* Laravel5.2
* Socialite

実装するソーシャル

* Facebook（とりあえず。随時追加予定）

ログインボタンは必要に応じて[ここ](https://lipis.github.io/bootstrap-social/)を利用すると便利。

##準備

基本適には、[本家](https://github.com/laravel/socialite)の解説通りにやればいい。めんどいのはどちらかというと各ソーシャルサービスのAPIの仕様の方。

###インストール

composer.jsonいじって、updateでもいいけど、本家の通り、

```bash
composer require laravel/socialite
```

###config/app.phpの編集

config/app.phpに下記の記述を追加。

####provider

```php
Laravel\Socialite\SocialiteServiceProvider::class,
```

####aliase

```php
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
```

###config/services.phpの編集

config/services.phpに下記を追記します。値は、静的に書いてもいいですが、.envに書きましょう。

```php
'facebook' => [
    'client_id'     => env('FACEBOOK_ID'),
    'client_secret' => env('FACEBOOK_SECRET'),
    'redirect'      => env('FACEBOOK_CALLBACKURL'),
],
```

.envの例

```php
#FACEBOOK
FACEBOOK_ID=1234567890
FACEBOOK_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
FACEBOOK_CALLBACKURL=http://localhost:8000/facebook/callback
```

####注意１）

Facebookの開発者ページにてApp IDとApp Secretを調べ、client_id。client_secretとして記述します。

####注意２）

なお、ネットのサンプルでredirect先URLをurl()ヘルパー関数で取得している例がありましたが、私の環境ではエラーとなったので、.envにてURLはフルパスで記述しました。

####注意３）

コールバックURLにlocalhostを指定しているとFacebookでの認証時にエラーになります。これを避けるためには、facebookの開発者ページにて、

[Settings]（左メニュー） -> [Advanced]（上のタブ） -> [Valid OAuth redirect URIs](中ほどのClient OAuth Settings)に必要なURLを記述します（ここではhttp://localhost:8000/）。


##実装

###Route

```php
Route::group(['middleware' => 'web'], function () {

    //FBログイン（ボタンのリンク先）
    Route::get('facebook','FacebookController@facebookLogin');
    //認証後の戻りURL
    Route::get('facebook/callback','FacebookController@facebookCallback');

});
```

###Controller

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

//追加
use Laravel\Socialite\Contracts\Factory as Socialite;

class FacebookController extends Controller
{
    //
    protected $socialite;
	
	//コンストラクタ
    public function __construct(Socialite $socialite)
    {
    	$this->socialite = $socialite;
    }
	
	//ログイン
    public function facebookLogin()
    {
    	//facebookへリダイレクト
    	return $this->socialite->driver('facebook')->redirect();
    }
	
	//コールバック
    public function facebookCallback()
    {
    	//ユーザー情報を取得
    	$fuser = $this->socialite->driver('facebook')->user();

    	//各情報の取得
    	$fuser->getId();
    	$fuser->getName();
    	$fuser->getEmail();

    	//とりあえず表示
    	return $fuser->getEmail();
    }
}
```

###その他

独自ドライバの実装については[こちら](http://qiita.com/zaburo/items/25ebbb3d1b580a0df9f3)をご覧ください。
LastPass の添付ファイルのしくみと取得方法 (たいへん)

LastPass は、パスワードを保存・共有サービス。

デリケートな情報を扱うために、その機能は逸脱です。

SSH 鍵の共有を行うために LastPass を使おうとしてハマったので、メモします。

## LastPass の添付ファイル

LastPass にはファイルを添付する機能があります。

それをダウンロードすると

`~/Library/Containers/com.lastpass.LastPass/Data/Library/Application\ Support/LastPass/tmp` フォルダにダウンロードされ、そのファイルに関連付けられたアプリケーションを「開き」ます。

ただ、フォルダは保護されているため、ファインダーからは**直接アクセスできません！**

「開く」という動作をするので、関連するアプリとそのファイルが互換性がなければエラーが発生します。（例: 秘密鍵 PEM だとかだと、Keychain アプリが開きますが、エラーになって進めません。）

1分ぐらい経つと、そのフォルダから添付ファイルが自動的に削除されます。

なので、LastPass で共有するときも、ZIP ファイルで圧縮して送ってもらうようにしましょう。

添付ファイルをダウンロードした時、ZIPファイルが解凍され、そのフォルダが開きます。

ファイルが消えるまでの一瞬の時間で、ファイルを取得してください。

大変だけど、だからこそ、セキュアなやり取りができますよ！

Good Luck
気軽にコードレビューするならGitHubではなくRefactor.ioでも良いと思った

[2016年に流行りそうだけどまだ殆ど知られていないエンジニア向けサービス10選](http://blog-ja.sideci.com/entry/2016/01/13/110000)を見ていたら、Refactor.ioというサービスがあって気になったので軽く使ってみた。
https://www.refactor.io/

# Refactor.ioとは

コードレビューやリファクタリングを気軽に依頼できるサービス。依頼したいコードを投稿するとレビュー用のページが作成され、そのページのURLを依頼者に共有、もしくはそのページを訪れた人にコードレビューやリファクタリングをしてもらう事ができる。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/23101/6bf9c61e-1888-101a-769b-43d6162894ce.png)
何ともシンプルなUI。画面右上に「GitHub Login」というリンクがある通り、GitHubとも連携出来る。連携の設定をしておくことで依頼したコードにコメントが入るとその旨をメールで受け取ることが出来る。対応言語は以下の通り。
・JavaScript
・JSX
・CoffeeScript
・LiveScript
・java
・C
・C++
・C#
・Objective-C
・Python
・PHP
・CSS
・SASS
・LESS
・HTML
・Handlebars
・Perl
・Erlang
・Ruby
・Swift
・Scala
・Go
・Haskell
・VBScript
・R
・Shell
・SQL

## コードレビューを依頼する

https://www.refactor.io/
にアクセスしてさっそく試してみる。
初期表示では言語はJavaScriptが選択されていて、サンプルコードも記載されている。
コードレビューを依頼する時は、自分の依頼したいコードの言語を選択してソースを張り付けて、SUBMITボタンをポチるだけ、カンタン！今回は初期表示状態のままコードレビューの依頼を出してみる。なので、そのままSUBMITボタンをポチる。すると以下のようにレビュー用のページとページのURLが作成される。あとは必要に応じてこのURLを依頼者に共有するだけ。ちなみに「make this private」というチェックボックスをONにしておくとその投稿は非公開になるらしい。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/23101/796aed5c-cb14-887a-630b-67bc3cb68fed.png)

# コードレビューをする

レビューページの下部にレビュー依頼されたコードがあるので、コードに直接コメントを入力して(斬新)SUBMITボタンをポチる。もちろんレビューだけでなくリファクタリングしちゃってもOK。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/23101/61f55cb2-1f73-924b-4bf7-b4beaaefc1e8.png)
すると、こんな感じでコメントが残る。なんとなくGitHubのGistっぽい。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/23101/1ac13cca-bef0-542d-7d86-d741e6fae100.png)



# 使いどころ

今やGitHubのプルリクベースでのコードレビューがほとんどだと思うが、以下のケースなんかでは気軽に使えるんじゃないのかなと思う。

1. プルリクを出すまでもない軽微なコード
2. 気軽な感じで見てもらいたい
3. GitHubを導入していない
4. コードレビューの文化が根付いていないのでフィジビリみたいな感じでコードレビューの文化を体感してもらいたい
5. 趣味でやってるので気軽に有識者に見てもらい

# 微妙だったところ

画面右上に「Explore」というリンクがあって、これをポチるとRefactor.ioに投稿されたコードの一覧が表示されるらしいが、何故か自分が投稿したコードが出てこない。というか常に同じコードしか出てこない。フィードバック募集中らしいので恐らく細かい所は少しずつ整っていくっぽい。
Arduino IDE > 別のタブで実装した関数はincludeしなくても参照できるようだ

AQM0802用のライブラリを実装中。

１つのタブ(inoファイル)で実装をすると今後流用しにくいためソース分割をしている。

Arduino IDEにおいてウィンドウ右上の虫眼鏡の下の「下矢印」を押して表示される「新規タブ」。これを選択してファイルをAQM0802lib.inoなどにすると、その名前のタブが追加される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f818221a-5417-85a5-11a2-ca999793a570.png)

新規タブ内の実装を以下とする。

```AQM0802lib.ino
void AQM0802_clear()
{
   // clear operation
}
```

上記関数は 別inoファイル (esp8266_160217_AQM0802.inoなど)において AQM0802lib.ino をinclude宣言せずに使える。

```esp8266_160217_AQM0802.ino

void setup()
{
    // some setup other than AQM0802

    AQM0802_clear();
}
```

プロジェクトに組み込まれたタブ(inoファイル)を全部使えるのがいいのか悪いのかはよく分からない。
技術英語 > perform a reset / Do it. / achieve peak performance > accomplish / achieve

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]

No. 412/2129

> Insert the programmed microSD card into the MicroZed board, make sure the mode pins have been set to configure from the microSD card using the appropriate jumpers, and <font color=red>perform a reset</font>.

<hr>
関連して思い出したのがVoyagerにてJanewayが「それをやって」という時に使われる英語

> Do it.

<hr>
関連してpeak performaceというのを思い出した。
検索して以下を見つけた。

http://eow.alc.co.jp/search?q=peak+performance
> achieve peak performance
> 最高の成績［業績・パフォーマンス］を達成する

achieve と accomplish は関谷えり子さんのビジネス英語で使い分けがあった。以下、2年前の自分メモより。

> achieve はゴールや目標 / accomplish は task や mission などに使われる
...
> accomplish は努力を重ねて仕事を成し遂げることを表し、achieve より堅い語. perform は業務・約束などをちゃんと果たし、完全に仕上げることをいう
NameError: uninitialized constant Mysql2::Client::SECURE_CONNECTIONが出た時の対処

# 環境
OS: Mac OS X Yosemite
Ruby: ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin14.0]
Mysql: Ver 14.14 Distrib 5.7.11, for osx10.10 (x86_64)

# ここら辺参考に
https://github.com/brianmario/mysql2/issues/603
https://github.com/brianmario/mysql2/issues/711
http://qiita.com/miyukiw/items/a0e00028ec5ac5c6beb0

# 私の環境で解決した事例
上記リンクでmysql2のバージョンを0.3.17へしろと書いてあるけど、
``gem install mysql2 -v 0.3.17``
ではダメで
`Gemfile
gem 'mysql2', '~> 0.3.17'
`
って書いてbundle installでGemfile.lockに適用させなくてはならない

# おわりに
蓋を開けてみれば当たり前の話だが、普段から触ってないとふとした時の対処に時間が掛かってしまう。３時間近くグダグダ彷徨ってた。
【グラボ】グラボの型番とおおよそのメモ

# はじめに
PCパーツをあまり知らない私が、詳しい友人から聞いた型番とおおよそのスペックメモ。
[AVAというオンラインゲーム](http://ava.pmang.jp/)で例えます。

# 性能の表
| シリーズ名 |     型番     | おおよその性能 | 
|:----------|:------------|:------------|
|GTX        |TaitanX      |やばい|
|GTX        |980ti        |めっちゃすごい|
|GTX        |980          |すごい（AVAを録画しながら護衛をすると、まれにFPSが200から下がる）|
|GTX        |970          |AVAで最高画質で配信をしながらだとFPS200でない事が多い|
|GTX        |960          |AVAをグラフィック最高で不満なくプレイできるくらい|
|GTX        |950          |AVAをやっててイラッとする|
|GTX        |750          |950よりもAVAでイラッとする|


# 性能のワンポイント
| シリーズ名 |     型番     | おおよその性能 | 
|:----------|:------------|:------------|
|GTX        |TaitanX      |ハイエンドモデル|
|GTX        |80ti系       |ハイエンドモデル|
|GTX        |80系         |ハイモデル|
|GTX        |70系         |ミドルモデル（☆財布が許すならオススメ☆）|
|GTX        |60系         |エントリーモデル（☆オススメ☆）|
|GTX        |50ti系       |廉価版|
|GTX        |50系         |廉価版|


# 表の見方
一部例外（※）を除き、百の位が1減り、十の位が1上がったものが、前の世代とだいたい同じ
例：GTX 680 = GTX 770

※一部例外：GTX800版台は除く（魔のグラボ。成長しなかったらしい。Windows8を思い出せ！）
MuninでTomcatのモニタリング

## はじめに
MuninでTomcatをモニタリングします。
MuninやTomcatはすでにインストールされている前提で、
Tomcat側の受け入れ設定とMunin側の監視設定をします。

Tomcat本体の設定は、[過去の記事](http://qiita.com/tool-taro/items/1dccbcf8c1921cf4ba45)の通りで、
Muninはポート8080を経由してTomcat側のデータを取得します。

## 環境
- CentOS Linux release 7.2
- JDK 1.8.0_112
- Tomcat 8.5.9
- munin-node 2.0.25

## 手順
### Tomcat側にユーザ・ユーザ権限の追加
```
$ vi $TOMCAT_HOME/conf/tomcat-users.xml
```

```xml:$TOMCAT_HOME/conf/tomcat-users.xml
<tomcat-users...>
  (省略)
  # 追記
  <role rolename="manager-status"/>
  <user username="munin" password="munin" roles="manager-status"/>
</tomcat-users>
```
Tomcatを再起動し、監視用のI/Fにアクセスできるか確認します。

```
$ curl --user munin:munin http://localhost:8080/manager/status?XML=true
<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/manager/xform.xsl" ?>
<status><jvm><memory free='112838232' total='261750784' max='261750784'/>(省略)</status>
```
### Muninの監視用プラグイン等のインストール・配置
```
$ yum install munin-java-plugins
$ ln -s /usr/share/munin/plugins/tomcat_access /etc/munin/plugins/
$ ln -s /usr/share/munin/plugins/tomcat_jvm /etc/munin/plugins/
$ ln -s /usr/share/munin/plugins/tomcat_threads /etc/munin/plugins/
$ ln -s /usr/share/munin/plugins/tomcat_volume /etc/munin/plugins/
$ yum install perl-XML-Simple
```
### MuninのTomcat監視設定
```
$ vi /etc/munin/plugin-conf.d/munin-node
```

```conf:/etc/munin/plugin-conf.d/munin-node
# 設定ファイル追記
[tomcat*]
env.host      localhost
env.port      8080
env.request   /manager/status?XML=true
env.user      munin
env.password  munin
env.timeout   30
env.connector "http-nio-8080"
```
### Muninの設定反映・再起動(必要に応じて)
```
$ munin-node-configure --shell | sh -x
$ systemctl restart munin-node
```
## 動作確認
次回以降のグラフ生成のタイミングでTomcatのグラフが生成されていることを確認します。
![1455647583283.jpg](https://qiita-image-store.s3.amazonaws.com/0/111947/0ca00c8d-7add-d513-e321-0d375aecdb17.jpeg)

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Java8 の Stream で ltsv パース 


業務で ltsvっぽい形式の文字列のパースを行うことがあり、Java の Stream を利用して書いてみた時のメモ

```java
package ltsv;

import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static Map<String, String> parse(String ltsv) {
        return Stream.of(ltsv.split("\t"))
                     .filter(s -> s.contains(":"))
                     .map(s -> s.split(":"))
                     .collect(Collectors.toMap(p -> p[0], p -> p[1]));
    }

    public static void main(String[] args) {
        String ltsvsample = "host: 127.0.0.1\tuser: m3y\tprotocol: HTTP/1.1";
        Main.parse(ltsvsample).forEach((k, v) -> {
            System.out.println(k + ":" + v);
        });
    }
}

//protocol: HTTP/1.1
//host: 127.0.0.1
//user: m3y
```

toMap で 0 と 1 指定するところもっとうまく書けないかな。。

※ 上記は業務で利用しているコードではありません^^;
cocos2d-x 3.10 「=」演算子でSprite等の代入を行うと画面遷移時にエラーが出る

# 概要

タイトルの通りですが、自分自身とってもハマったのでメモ書きとして残しておきます。

# 問題
Sprite等のRefクラスを継承するつクラスを=演算子で値の代入を行った結果、その変数をメンバにもつSceneを遷移させた時エラーが出てしまう。というもの

エラーの内容はこちら

```
Assert failed: reference count should be greater than 0
Assertion failed: (_referenceCount > 0), function release, file
/Users/UserName/Documents/CocosProjects/Project/cocos2d/cocos/base/CCRef.cpp, line 111.

```

エラー箇所

```cpp:CCRef.cpp
//~略~
void Ref::release()
{
    CCASSERT(_referenceCount > 0, "reference count should be greater than 0");
    --_referenceCount;

#if CC_ENABLE_SCRIPT_BINDING && CC_ENABLE_GC_FOR_NATIVE_OBJECTS

//~略~
```


# 直し方

なお、_title はCC_SYNTHESIZE_RETAINのプロパティマクロによって宣言されています
こうしてたのを

```
auto title = Sprite::create();
_title = title; 
this->addChild(_title);
```

こうする。


```
auto title = Sprite::create();
this->setTitle(title); //変更箇所
this->addChild(_title);
```

# まとめ
セッターを使おうっていう記事でした。