OmniAICreator/Qiita-1.07M huggingface dataset:
MacにFuelPHPの開発環境を整える

# MacでFuelPHPの開発環境を整える

## 0.環境
諸事情によりVirtualboxとvagrantが使えない環境であったため、Mac上にFuelPHPの開発環境を構築する。
Mampでやってしまうと思ったけど、今回はMacでデフォルトで入っているらしいapacheを使って構築。
※MacのapacheとCentOS等に入れるapacheと設定の仕方が異なるため注意。

MacOSX: 10.11.4
PHP:

```
$ php -v
PHP 5.5.31
```
apache: 

```
$ httpd -v
Server version: Apache/2.4.18 (Unix)
```
## 1.Apacheの設定
###1-1 apache起動
```sudo apachctl start```
###1-2 apache起動の確認
http://localhost
にアクセスしてIt works!と表示されることを確認

###1-3 apacheの設定ファイルの修正
Macのapache設定ファイルはCentOS等に入れるapacheと設定ファイルの場所が違う。

####1-3-1 httpd.confの修正

```
$ sudo vim /etc/apache2/httpd.conf
```
・下記コメントを削除（#を削除)

```
#LoadModule php5_module libexec/apache2/libphp5.so
#LoadModule userdir_module libexec/apache2/mod_userdir.so
#Include /private/etc/apache2/extra/httpd-userdir.conf
```
　※libphp5.soはPHPの設定
　※mod_userdir.soとhttpd-userdir.confはuserディレクトリを使えるようにするための設定

・DocumentRootを以下の通り修正
 /Library/WebServer/Documentsだと何かと不便であるため、/Users/[username]/Sitesを見に行くように修正
＜修正前＞

```
DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">
```
＜修正後＞

```
DocumentRoot "/Users/[username]/Sites"
<Directory "/Users/[username]/Sites">
```



####1-3-2 httpd-userdir.confの修正
```
$ sudo vim /etc/apache2/extra/httpd-userdir.conf
```
下記コメントを削除（#を削除)

```
#Include /private/etc/apache2/users/*.conf
```

####1-3-3 [username].confの修正
```
$ sudo vim /etc/apache2/users/[username].conf
```

以下の通り修正

```
<Directory "/Users/[username]/Sites/">
        AllowOverride All
        Options Indexes MultiViews FollowSymLinks Multiviews
        Require all granted
</Directory>
```

###1-4 apache再起動
confファイルを修正したら再起動しないと設定が反映されない。

```
sudo apachctl restart
```

これでapacheのルートディレクトリが/Library/WebServer/Documentsから/Users/[username]/Sitesに変更される。

###1-5 ルートディレクトリが変更されていることの確認
/Users/[username]/Sites以下にindex.htmlを作成する
```
<html>hello world</html>
```
http://localhost
にアクセスしてhello worldが表示されていることを確認

## 2.Fuelの設定
###2-1 Fuelのインストーラーをインストール
```
curl get.fuelphp.com/oil | sh
```
###2-2 Fuelプロジェクトの作成
```
oil create hello
```

###2-3 バージョンを確認
```
php oil -v
```

以下のようなエラーが。

```
Error - date_default_timezone_get(): .......
```
Fuelのfuel/app/config/config.phpを以下の通り修正

```
'default_timezone'   => 'Asia/Tokyo',
```

もう一度バージョンを確認

```
php oil -v
```
以下の通り表示されればOK

```
Fuel: 1.X.X running in “development” mode
```

###2-5 ブラウザから表示の確認
http://localhost/hello/public
にアクセスして以下の通り表示されればOK。
<img width="1414" alt="スクリーンショット 2016-07-07 18.57.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/132840/78fdb228-0238-acc7-f79e-1ade22e5907c.png">
Objective-CとSwiftの書き方違い

# はじめに
既存のObjective-cのコードをSwiftに置き換える際に迷ったのでまとめておきます。

# 変数・定数

## Objective-C
```objc
// 変数
NSInteger i = 0;

// 定数
const NSInteger n = 0;
```

## Swift
- 変数はvar, 定数はletで定義。
- 型推論してくれるので型は省略可能。

```swift
// 変数
var i :Int = 0

// 定数
let i :Int = 0
```

# 文字列

## Objective-C

```objc
NSString *hello      = @"Hello";
NSString *world      = @"World";
NSString *helloWorld = [NSString stringWithFormat:@"%@, %@!", hello, world];
```

## Swift

```swift
let hello      = "Hello"
let world      = "World"
let helloWorld = "\(hello), \(world)!"  // Hello, World!
```

# 配列

## Objective-C

```objc
NSArray        *array        = @[@"abc", @"123"];
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"xyz", @"789", nil];
[mutableArray addObjectsFromArray:array];  // [@"xyz", @"789", @"abc", @"123"]
```

## Swift

```swift
let array        = ["abc", "123"]
var mutableArray = ["xyz", "789"]
mutableArray += array    // ["xyz", "789", "abc", "123"]
```




# クラス定義

## Objective-C
以下のようにヘッダーファイル（.h）と実装ファイル（.m）に分かれて2つのファイルで1セットになる。

```objc:Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
```

```objc:Person.m
#import "Person.h"
@implementation Person
  hogehoge;
@end
```
## Swift

```swift:Person.swift
class Person {
  hogehoge
}
```

# メソッド定義

## 引数1つの場合
### Objective-C
```objc
- (void)setName:(NSString *)name
{
    hogehoge;
}
```

### Swift
```swift
func setName(name: String) -> Void {
    hogehoge
}
```

## 引数が複数ある場合

### Objective-C
- `- (戻り値の型)メソッド名:(引数の型)引数1　ラベル:(引数の型)引数2 ラベル:(引数の型)引数3`のように書く。
    - ラベルは省略可。

```objc
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile 
  encoding:(NSStringEncoding)enc 
{
  hogehoge;
}
```

### Swift

```swift
func writeToFile(path: String, useAuxiliaryFile: Bool, enc: String) -> Bool{
  hogehoge;
}
```

# インスタンス生成、メソッド呼び出し

## Objective-C
```objc
// Personクラスのインスタンスを生成する
Person *yuki = [[Person alloc] init];

// 名前を設定する
[yuki setName:@"hogehoge"];
```

## Swift
```swift
// Personクラスのインスタンスを生成する
let yuki = Person()

// 名前を設定する
yuki.setName = "hogehoge"
```
homebrewで入れたmysql, LauchAgentsで管理してたけど止めたいとき

```zsh
>>> mysql.server stop                                                
Shutting down MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/hoge.pid).
```

pidファイル updateできないのでエラーになったので

```zsh
>>> open ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
```

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.mysql</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/mysql/bin/mysqld_safe</string>
    <string>--bind-address=127.0.0.1</string>
    <string>--datadir=/usr/local/var/mysql</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/usr/local/var/mysql</string>
    <key>UserName</key>
    <string>koichi.yanagimoto</string>
</dict>
</plist>
```
が出てくるので、

```xml
<key>KeepAlive</key>
  <false/>
```
にします。

```zsh
>>> launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

>>> launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
```

して、

```zsh
>>> mysql.server stop
```
で

```zsh
Shutting down MySQL
.. SUCCESS!
```

SUCCESS!
tsung-recorderでhttpsアクセスする方法

tsung-recorderを普通にstartしてから色々ハマったのでメモします。

ブラウザにプロキシ設定して、早速httpsのサイトにアクセスすると、普通にブラウザに怒られます。
プロキシがSSLは解決してくれないっぽい。インストールにミスったのかなー、なにか証明書付きのオプション付きでmakeしたりしなきゃダメなのかなーと試行錯誤していたところ、ちゃんと書いてました。

http://tsung.erlang-projects.org/user_manual-current.html#htoc25
> For HTTPS recording, use http://- instead of https:// in your browser.

おおっ！マジか！
で、https:// とするところを http:// としてテストしたいサイトを入力するとちゃんとブラウザに表示されました。httpsにリダイレクトされると、URLのホスト名の先頭に - が付加されます。https://-xxxxx のように。

なるほどー。

しかし、OAuthを使ってたりするWebアプリケーションを開発してたりする場合では、認証後のリダイレクト先URLに、ハイフン付きのURLを追加しておかないとダメということになりますが、「そんなURLは無効」と怒られて設定できないという...困りました。
条件反射でwgetしてしまうと危ないかもしれない話

条件反射的にwgetしてしまうと危ないかもしれないというお話。
ネット上からファイルを落としたいとき、つい条件反射的にwgetしてしまう自分のような人種の方へ。
# ついつい気軽に使ってしまうwget
「じゃあ、○○からファイルをDLして展開しておいてね。」
と指示された時、とりあえずそのファイルをwgetするというのは自分だけではないはず。
しかしそのwget、残念なことに脆弱性（CVE-2016-4971）が見つかったとの事。
[JVNDB-2016-003391 GNU Wget における任意のファイルに書き込まれる脆弱性](http://jvndb.jvn.jp/ja/contents/2016/JVNDB-2016-003391.html)

## なにがどうなるのか
今回の脆弱性で指摘されているのは、wgetを使用してファイルをダウンロードしようとした際、
攻撃者のサーバが、あらかじめFTPサーバ上に配置された悪意あるファイルに対するHTTP 302リダイレクトを返す事によって利用者の端末に任意のファイルを配置されてしまうという現象です。
とりあえず、実際に試してみました。
### 期待する結果
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/4170bf0a-2e54-9f1b-5bdd-abb8525ae41a.jpeg)

### よろしくない結果（FTPサーバ上のリソースへリダイレクトした場合）
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/559217d4-9e95-fd59-bb38-bbcd791bf3c2.jpeg)

リクエストはどちらもサーバ上のsample.txtを取得しているのですが、
今回はサーバからのレスポンスを改ざんし、それぞれHTTPとFTPでwrong.txtを取得するようリダイレクトさせています。

ftpサーバ上のファイルへリダイレクトした場合、ファイル名が維持されず、wrong.txtとして保存されてしまっていますね。

## じゃあ、どうするか
1. **修正を適用する**
幸いなことに、既に修正が公開されています。
うっかりやらかしてしまう前に、適用しておきましょう。

2. **とりあえずオプションを付けてリダイレクトを回避する**
実行時に
`$ wget --max-redirect=0 <取得対象>`
とすれば、ひとまずリダイレクトされてしまう事は防げますね。

3. **wgetコマンドを使わない**
別のコマンドを使用して問題を回避するのも良いですね。
特に、curlコマンドは連番保存とか素敵なオプションが揃ってますし。
【Swift】範囲を指定した乱数を作る。

# 範囲指定の乱数

kからn-1の乱数を取得したかったのですが、
arc4random-uniformでは0...n-1の乱数しか取得できないので、
[Swiftで1000から9999の間で乱数を生成したい](https://teratail.com/questions/16489)を参考に、
作ってみました。

```swift
func arc4random(lower: UInt32, upper: UInt32) -> UInt32 {
    guard upper >= lower else {
        return 0
    }
    
    return arc4random_uniform(upper - lower) + lower
}
```

**呼び出し**

```swift
for _ in 0 ... 20 {
    print(arc4random(lower: 10, upper: 15))
}
```

**結果**

```swift
11
13
14
14
14
12
14
11
12
10
11
11
14
10
11
11
12
11
14
11
13
```

# Knuthのアルゴリズム

この乱数を使って、Knuthのシャッフルアルゴリズムを実装してみました。
参考：https://ja.wikipedia.org/wiki/フィッシャー_-_イェーツのシャッフル

```swift
extension Array {
    
    func shuffled() -> [Element] {
        var result = self
        result.shuffle()
        
        return result
    }
    
    // selfをシャッフルする
    mutating func shuffle() {
        
        // iを0からcount-2まで増加させながら、以下を実行する
        for i in 0 ..< (count - 1) {
            
            // jにi以上count未満のランダムな整数を代入する
            let j = Int(arc4random(lower: UInt32(i), upper: UInt32(count)))
            if i != j {
                // self[i]とself[j]を交換する
                swap(&self[i], &self[j])
            }
        }
    }
}
```

**実行**

```swift
let shuffled = [0, 1, 2, 3, 4, 5].shuffled()
```

**結果**

```swift
[3, 0, 5, 2, 4, 1]
```

# 参考

https://teratail.com/questions/16489
https://ja.wikipedia.org/wiki/フィッシャー_-_イェーツのシャッフル
https://www.rosettacode.org/wiki/Knuth_shuffle#Swift
【イベントレポート】DevRel Meetup in Tokyo #10で感じた事

[DevRel Meetup in Tokyo #10(2016/07/06開催)](http://devrel.connpass.com/event/33944/)に参加してきました。

今回は「SIerの中でのDevRelとは？」や「突然エバンジェリストとしての業務をする事になった時どうする？」などの最近特に興味のあるテーマ。

SIerはよく日本独特の業態だという話があります。ん？そうなの？という方は[このあたりの記事](http://paiza.hatenablog.com/entry/2014/04/02/「日本も米国もSIerは同じ」は本当か？日米SIerの構造)が参考になります。

米国の場合は、雇用流動性に裏付けられる形で人が媒体になり、ユーザー企業で培われるシステムインテグレーションのノウハウが市場で循環していきます。その循環するサイクルにおいては、プロプライエタリなスキルは雇用流動性の活性化にはネガティブに働くため（他社で使えないノウハウ習得には意欲的ではない）、汎用性、言わば市場にあるプロダクトやサービスを活用するという意向が発生します。

日本の場合はまだまだ雇用流動性が低いため、ノウハウの循環にはそれ専業の企業体が必要になり、ユーザー系SIerはまさにその典型モデルだと考えられ、SIer終焉の時代などというメディアも最近よく目に止まると思いますが、個人的にはこの雇用流動性が活性化しない限り、多少なりともSIerモデルは必要と考えています。

一方、DevlRelの必要性に代表されるように、サービス開発サイクルが変化している（迅速な開発、迅速な試行錯誤、迅速な撤退など）事にSIerは対応していかないければならないのも事実です。例えば米国ユーザー企業内部にはgoogle担当、salesforce担当などインテグレーション力を自ら磨くエンジニアがいます。また、新規事業開発、オープンイノベーションに携わる各種アクセラレーター企業の人たちが口を揃えていうのが「結局は人と人。誰がやるか、で成功するかが決まる」と。DevRelも同様で会社ではなく、その人自身にいかに興味を持って貰うか。ここが労働集約的なSIerのビジネスモデルからするとアレルギー反応が出やすいです。

今回のイベントでも指摘があったように、SIerはそもそもベンダーニュートラルで縛られないのがウリ。会社全体の価値を個人が訴求する事が求められる時代。SIerのエンジニアはより横に繋がりハブになる力が求められているのかもしれません。

※　因みにSIerというのは和製英語で海外で使っても通じません。System IntegratorとかSystem Integration Companyと言いましょう。ただ逆に言えば和製英語が出来るという事は確固たる領域が確立しているとも言えます。
pipコマンドが壊れた件


# 経緯
jupyterでclingが使えると聞いてインストールしていたら、pipコマンドを使うと、

```
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 7, in <module>
    from pip import main
ImportError: No module named pip
```

というエラーが出て、pipがpipを知らんって言い出した。

よし、pipを更新だ！`pip install -U pip`！・・・ってまあ、pip使えないから無理じゃん。詰んだ。

# 解決
[pipの公式ドキュメント](https://pip.pypa.io/en/stable/installing/)に、このスクリプトを実行しろって書いてあって、それでどうにかなったっぽい。(なんか警告文があるけど、動かないとそもそもダメだから、スルーしまーす)

適当にじゃまにならないディレクトリで、

```
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py
```

という感じで実行して、無事、動くようになりました。pip3については、python3で実行したらOK。めでたしめでたし。
【論文シリーズ】深層学習を化学に応用する

## 原文
[ケモインフォマティクスにおける深層学習: 薬品分子の水溶性の予測 (Deep architectures and deep learning in chemoinformatics: the prediction of aqueous solubility for drug-like molecules)](http://goo.gl/u9RJex)
Alessandro Lusci, Gianluca Pollastri, and Pierre Baldi (2013)




## 1. 要約／背景
* **DAG(有向非循環グラフ)-RNN**を用いて、水の溶解度を予測した。
* 過去にも、浅層NNやSVMを使った予測アルゴリズムは考案されていた。利用データの量と質が広がるにつれて、それを深層学習器に落とし込んだ点が進歩である。
* そもそも論として、分子構造がNNやボルツマンマシンのそれと親和的であり、モデル適用のインスピレーションは高い。

## 2. 骨子の理論
### (1)データの準備
　入力データであるが、分子構造をUG(Undirected Graph, 無向グラフ)に落とし込んだものが使われている。(従来の方法では、融点、水ーオクタノール分配係数、原子価といった尤もらしいデータが入力データの特徴量として使われていた)
　有機化学の見地では、「原子軌道法」という分子構造の記述に対応している。電子雲などの電子軌道の表現ができないため、実際の分子構造の再現性はやや劣る。とはいえ、非専門家にも理解しやすく、再現性も一定の水準で担保されるので、モデル起用の点では適している。ちなみに、分子薬学には構造活性相関という概念がある。本稿のモデル化に対するモチベーションも、分子構造と溶解度の間に相関性があるという考えがあってのことである。

$$\mbox{Acticity} = F(\mbox{structure}) = M(E(\mbox{structure}))$$


### (2)分子モデリング
　原子一つを一つのノードと見て、UGを描く。**環構造（芳香環など）は、1つの環を1つのノードを見る。**下記は、酢酸のUGである。

![151207223354_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/ef575f9c-9f47-f7a1-a9d2-94579f8ecf66.jpeg)


### (3)DAG-RNN
　構造の特徴学習からはじめるが、それはRNNを使う。DAGは入力値の特徴を見つけ出すための事前学習に使用する概念である。


![151207223354_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/00be1106-f027-a610-2887-07b301b34e98.jpeg)


　ご存知の方もいると思うが、UGモデルは計算コストがべらぼうに高い。例えば、UGモデルの代表例であるボルツマンマシンでは、モデルのスケールに対して指数関数的にコストが増加する。したがって、計算コストの観点から、**入力構造をUGからDAGに落としこむ**必要がある。この時使う手法が、**アンサンブル学習**である。$N$個のノードに対して、各ノードが事後変数になるDAGを(すなわち、$N$種類のDAG)を用意し、全てのDAGをアンサンブル学習にかけるのである。
抽出した特徴$D$は、出力関数にかけられ、アウトプットとして、水の溶解度が計算される。

![151207223354_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/99c3debe-6a24-47c3-ea95-3a0c22144240.jpeg)



## 3. モデル適用例
　一例として、Huuskonenのデータセットによるテストを挙げる。
　DB上の1026種類の分子について、学習した。データは、10グループに分割して、交差確認法にかけている。出力値と教師データとの正答率は、相関係数で表現している。(もちろん、R2=1に近づくほど、正答率が高い)

![151207223354_5.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/d6c94638-887d-7b44-3fc4-8ea9884bdaf6.jpeg)


最もパフォーマンスのよかったケースは、RNNに分配係数のデータを付加したパターンだった。
七夕なのでシェルスクリプトで短冊に願いごと書いた

ふと今日七夕だなって思い立ったので
多分誰かしら毎年書いてると思う

```wish.sh
#!/bin/bash

echo "┏┷┓"
for s in `echo $1 | grep -o '.'`; do
  echo "┃${s}┃"
done
echo "┗━┛"
```

テスト

```
% ./wish.sh 今日も一日がんばるぞい
┏┷┓
┃今┃
┃日┃
┃も┃
┃一┃
┃日┃
┃が┃
┃ん┃
┃ば┃
┃る┃
┃ぞ┃
┃い┃
┗━┛

```

願い

```
% ./wish.sh かえりたい
┏┷┓
┃か┃
┃え┃
┃り┃
┃た┃
┃い┃
┗━┛

```
Bashのプロンプトに色を付けよう、という話

# この記事は？
- SSHなどでサーバ間を移動していると、うっかり思っていたサーバと違う場所で作業してしまった、というようなことがあったりする。
- 本来、そのようなことはあってはいけない。個人環境ならテヘヘ、で済むものの、お仕事として考えればオペミスってやつだ。
- 少しでもそのようなことがなくなるように、プロンプトの色を変えることで多少は視覚的に変化を与え、人間が気付きを得られるようにしよう、という試みを行う。

# 前提条件
- SSHの方法だとか、ホスト名の命名ルールだとか、そういった箇所でも気付きを得られるべきなのですが、ここではbashプロンプトにのみ、限った話にしようと思います。
- bashrcに対する設定を行うので、お仕事上、なかなか設定を仕込みにくい現場もあるかもしれませんがそこはお察しください。

# 仕込みたいこと
下記の内容をbashに仕込もうと思います。
- SSHログインした先のサーバがどこなのか、色分けしてわかるようにする。
- 特権管理者(root)にsu した場合、rootであることをわかりやすくしたい。

# 実装
## 実装方法
bashでは環境変数：PS1にてプロンプトが定義されている。
ちなみにPS1は通常のプロンプトで、PS2はコマンド入力が完了していないときに表示される。PS3とPS4はプログラミングとデバッグ用。

```bash
[hiroki.lzh@StarPlatinum ~]$ echo $PS1
[\u@\h \W]\$
[hiroki.lzh@StarPlatinum ~]$ echo $PS2
>
[hiroki.lzh@StarPlatinum ~]$ echo $PS3

[hiroki.lzh@StarPlatinum ~]$ echo $PS4
+
```

このPS1に対し以下のような特殊文字などを使用できるので、これらを組み合わせてオリジナルプロンプトを作成する。

| 特殊文字 | 内容 |
|:--|:--|
|\d   |「曜日 月 日」の形式（例：Fri Jan 5）で日付を表示する   |
|\e   |ASCIIのエスケープ文字（033）を表示する   |
|\h   |ホスト名のうち最初の「.」までの部分を表示する   |
|\H   |ホスト名を表示する   |
|\n 	|改行する|
|\s 	|シェルの名前を表示する|
|\t 	|現在の時刻を24時間の「HH:MM:SS」形式で表示する|
|\T 	|現在の時刻を12時間の「HH:MM:SS」形式で表示する|
|\@ 	|現在の時刻を12時間の「am/pm」形式で表示する|
|\u 	|現在のユーザー名を表示する|
|\w 	|現在の作業ディレクトリを、ユーザーのホームディレクトリからの絶対パスで表示する|
|\W 	|現在の作業ディレクトリを表示する|
|\\! 	|このコマンドの履歴番号を表示する|
|\\# 	|このコマンドのコマンド番号（現在のシェルのセッション中に実行されたコマンドのシーケンスにおける位置）を表示する|
|\\$ 	|実効UIDが0の場合に#となり、それ以外の場合に$となる|
|\nnn 	|8進数nnnに対応する文字を表示する|
|\\[ 	|非表示文字のシーケンスを開始する。これを使って、プロンプト中に端末の制御シーケンスを埋め込むことができる|
|\\] 	|非表示文字のシーケンスを終了する|

## サーバ名を色分けする
一例として、私はこうした。

```bash
$ vi .bashrc
```

```追記例
PS1="[\u@\[\e[0;35m\]\h\[\e[0m\]]\\$ "
```

```bash
$ source ~/.bashrc
```

結果、こうなる。「0;35m」が「通常文字でピンク色」を指定している。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/129674/446ac655-f0c6-120f-e541-6d3c4cce7494.jpeg)

## rootになった場合にユーザ名を色分けする
一例として、私はこうした。

```bash
# vi .bashrc
```

```追記例
PS1="[\[\e[1;31m\\]\u\[\e[0m\]@\[\e[0;35m\]\h\[\e[0m\]]\\$ "
```

```bash
# source ~/.bashrc
```

結果、こうなる。「1;31m」が「太文字で赤色」を指定している。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/129674/8d12c321-8faa-ff2e-9f8b-08a190bc4d42.jpeg)

ちなみに、
「0;31m」が「太文字で赤色」
「1;31m」が「太文字で赤色」
「4;31m」が「下線つきの文字で赤色」
なのでお好みに合わせてどうぞ。

# おまけ
色がつくことによってログをcatしたりgrepしたりしたときに、「どこから実行したんだっけ？」とスクロールして戻るときにポイントを見つけやすくなった。少し得した気分である。

# 参考
[Bash カラープロンプト](https://wiki.archlinuxjp.org/index.php/Bash_%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88?rdfrom=https%3A%2F%2Fwiki.archlinux.org%2Findex.php%3Ftitle%3DColor_Bash_Prompt_%28%25E6%2597%25A5%25E6%259C%25AC%25E8%25AA%259E%29%26redirect%3Dno#.E3.83.AD.E3.82.B0.E3.82.A4.E3.83.B3.E6.99.82.E3.81.AB_Arch_.E3.81.AE.E6.9C.80.E6.96.B0.E3.83.8B.E3.83.A5.E3.83.BC.E3.82.B9.E3.82.92.E3.82.AB.E3.83.A9.E3.83.BC.E3.81.A7.E8.A1.A8.E7.A4.BA)


* * *
以上
ホームページに最近見たページを表示する JavaScript 

[最近見たページを表示するJavaScript (jQuery)](http://www.concrete5.org/marketplace/addons/recently-viewed-page) を concrete5 のアドオンとして公開しました。[計算フォーム](https://calculator.jp/)、[マイミツブログ](https://my-mitsu.com/blog)で利用しています。
使用している変数の一部に concrete5 特有のものがありますが、おおまかな処理は他のCMSでも使えます。


### 表示したページの情報を記録する

```
(1) /// License: MIT
$( document ).ready(function() {
    var recent_views_start = JSON.parse(localStorage.getItem('ounziw_recent_views'));
    var recent_views = [{
        url: CCM_CID,
        headertitle: document.title,
    }];
    if (recent_views_start) {
        for(i=0;i<10;i++) {
            if (recent_views_start[i] && recent_views[0].url !== recent_views_start[i].url) {
                recent_views.push(recent_views_start[i]);
            }
        }
    }
    localStorage.setItem('ounziw_recent_views',JSON.stringify(recent_views));
});
```

urlとページタイトルを取得して、順に保存していく、という方式です。
CCM_CIDは、concrete5が各ページに割り当てるIDです。他のCMSを使う場合や静的ページの場合は、document.URLに変更してもらえればと思います。
元の履歴に、同じページがあった場合に複数回表示する必要はないので、重複チェックを行っています。(元の履歴をいったんrecent_views_startに格納して、最新の履歴recent_views と比較)
取得する数は10個に決めうちにしてますが、この辺も適宜変更してもらえればと思います。

### ページ上に表示する
localStorageに保存されているものを表示するコードです。

```
(2) /// License: MIT
$( document ).ready(function() {
    var recent_views_list = JSON.parse(localStorage.getItem('ounziw_recent_views'));
    var listclass = $('.recent_views').data('listclass');
    var title = 'headertitle';
    
    if ($('.recent_views').data('num') >= 1) {
        var num_of_lists = $('.recent_views').data('num');
    } else {
        var num_of_lists = 5;
    }

    listdata = $("<ul></ul>",{
        class: listclass,
    });
    if (recent_views_list) {
        $('.recent_views').append(listdata);        
        for(i=0;i<num_of_lists;i++) {
            if (recent_views_list[i]) {
                textdata = $("<a></a>",{
                    href: CCM_APPLICATION_URL + '/index.php?cID=' + parseInt(recent_views_list[i]['url']),
                    text: recent_views_list[i][title]
                });
                textlist = $("<li></li>").html(textdata);
                $('.recent_views ul').append(textlist);
            }
        }
    }
});
```

localStorageの情報を表示していきます。jQueryでHTML部品を作って組み立てていきます。この辺はもっと上手く書けるかもしれないです。
CCM_APPLICATION_URL は concrete5 のインストールされている URL です。

表示する場所は、以下のようなHTMLで指定します。

```
<div class="recent_views" data-num="5" data-title="title" data-listclass="viewhistory"></div>
```


### 実践例

このアドオンは、concrete5でサイト運用するため、[レスキューワーク株式会社](https://rescuework.nagoya/)の業務として開発しました。concrete5 の公式サイトからダウンロードすることができます。

### PHPを使わない理由
PHPを使わないで、JavaScriptで記述しました。理由としては、

- 閲覧者が確認できれば良い情報である -> サーバー側で処理する必要が無い

です。なので、閲覧者のブラウザで処理するlocalStorage機能を選択しました。

- 閲覧履歴が他者に漏れにくい
- サーバー処理負荷を重くしない

といったメリットがあります。一方、デメリットとしては、

- 同じ閲覧者でも、端末やブラウザが異なると履歴が保存されない
- 履歴に基づいた提案はしにくい (「閲覧履歴を元におすすめページを出す」などは難しい)

があります。
Optional#orElseは値があるときでも評価される

## Optional#orElseは値があるときでも評価される

```java
    @Test
    public void temp() {
        Optional.of(this.getSomething()).orElse(this.getSomething());
    }

    public String getSomething() {
        System.out.println("call getSomething");
        return "something";
    }
```

これの結果が

```
call getSomething
call getSomething
```

こうなる。
orElseGetの場合、値がない時だけそっちを使うので、固定値でない場合そちらを使いましょう。

## orElse無限ループ地獄

```java
    public Integer getSomeNum() {
        Optional<Integer> result = this.tryGettingSomeNum();

        // 無限ループ
        return result.orElse(this.getSomeNum());
    }
```

備えよう！！！
Hyper-V をオン/オフする方法

#### 2025/1/19 追記

VirtualBox や Docker Hyper-V に対応したため、問題は解決しています。  
ただ、記録として Hyper-V をオン/オフする方法は残しておきます。


#### 有効化の方法
以下のコマンドを実行し、

```shell-session
> bcdedit /set hypervisorlaunchtype auto
```

Windows を再起動するとよい。

#### 無効化の方法
以下のコマンドを実行し、

```shell-session
> bcdedit /set hypervisorlaunchtype off
```

Windows を再起動するとよい。

以下から修正して転載。

http://www.masoo.jp/blog/2016/07/07/hyperv.html
mongodbをGUIで。mongo-express

# 概要
Node.jsとmongoDBでアプリケーションを作っていた時、
mongoDBの中を確認するのにCUIで見ていたのだけれど、
mongo-expressというGUIがあり使えそうなので導入してみた

![image](https://qiita-image-store.s3.amazonaws.com/0/60056/668ba6ee-a39c-a49f-e14a-f569104b0597.png)


# 導入方法

## 事前準備
nodeが動く環境であること(win/macで確認した）

## インストール

```
npm install https://github.com/andzdroid/mongo-express/tarball/master
```

インストールするとnode_modulesフォルダができあがる。
mongo-expressの本体はnode_modules/mongo-express配下。

## 初期設定

configファイルをコピーして作成してやる必要がある

```
cd node_modules/mongo-express
cp config.default.js config.js
vi config.js
```

configファイルの20行目あたりの以下を以下のように編集

```
  mongo = {
    db:       'mongoDBのデータベース名',
    host:     'localhost',
    password: 'mongoDBのパスワード、指定してなければ空',
    port:     27017,
    ssl:      false,
    url:      'mongodb://localhost/mongoDBのデータベース名',
    username: 'mongoDBのユーザ名、指定してなれば空',
  };
```

## 起動そして使う

起動はnode_modules/mongo-express配下で

```
node app
```

デフォルト設定のままなら、http://localhost:8081でアクセスできる

Basic認証でID/PASSを聞かれるので
これもデフォルトならadmin/passで認証される

直感で操作できるのでデータ確認用途くらいなら十分
以下のような画面です

![image](https://qiita-image-store.s3.amazonaws.com/0/60056/668ba6ee-a39c-a49f-e14a-f569104b0597.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/60056/3f1c8fa7-4d78-5e17-974a-03c8f7cd5c4c.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/60056/08fbc143-7039-2dd7-3e34-dd0e71d9384d.png)
rex0220 レイティング表示プラグイン

# レイティング表示

kintone アプリで、レイティング表示を可能にするプラグインです。
評価ポイントなどを星の数で表現できますので、評価内容がわかりやすくなります。

- 数字項目を使用して、レイティング表示。
- 星の数（１～１０）、星半分の指定が可能。
- アプリ内に複数のレイティング表示可能。
- サブテーブル内にレイティング表示可能。
- 一覧画面にレイティング表示可能。


[kintone レイティング表示プラグイン](https://rex0220.stores.jp)

# 詳細画面

![rating01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d03913c5-da4c-b1ae-6565-b5da8029012e.png)

# 編集画面

編集画面で、星印をクリックして、変更します。
星の数が数値項目に設定されます。

![rating02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/20ee2fe5-5a34-748d-9aa7-e699743a7b54.png)

# 一覧画面

一覧画面にも、レイティング表示されます。

![rating03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/803d2716-b5d8-602e-0442-7167b6495dcb.png)

レイティング表示対象項目は、数値項目としてソート可能です。

![rating06.png](https://qiita-image-store.s3.amazonaws.com/0/100572/2e6da1d0-5479-e98c-031e-7885824e9c42.png)



# 一覧画面でのサブテーブル表示

サブテーブル内のレイティング表示は、出来ません。
サブテーブル内では、数値項目がそのまま表示されます。

![rating04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/180ba31f-b3aa-4f73-39d1-a0b8b5463984.png)

# 一覧編集画面

一覧画面でレイティング表示を変更できます。

![rating05.png](https://qiita-image-store.s3.amazonaws.com/0/100572/2002f8c7-3317-c270-ced7-3c8636c98741.png)

# 旧デザイン画面のレイティング表示

旧デザイン画面でも、レイティング表示が可能です。

![rating10.png](https://qiita-image-store.s3.amazonaws.com/0/100572/2c681da0-819f-3033-a5d3-29421dfd8a0f.png)


# レイティング表示・プラグインの追加

![rating21.png](https://qiita-image-store.s3.amazonaws.com/0/100572/022be65d-318b-69cb-8d12-2336ed44c5d9.png)

# レイティング表示・プラグインの設定

設定画面を開くと数字項目が表示されますので、レイティング表示対象にする項目をチェックし、
星数（１～１０）と星半分の指定可否を設定します。
設定後に、「保存する」ボタンをクリックします。

**※フォーム変更時は、フォーム変更を本番環境に反映後に、本プラグイン設定を行ってください。**
**※項目変更後、タブまたはエンターキーで入力が確定します。**

![rating22.png](https://qiita-image-store.s3.amazonaws.com/0/100572/59d078e2-4224-28c5-7ae7-4fb7039843ae.png)


# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- フォームを変更した場合は、プラグインを再設定してください。
サーバー作業用Linuxコマンド

#記事を書いた理由#
サーバに入って、確認を行う際にいちいちオプションを調べて作業をするのは面倒なので、備忘録として一覧を作成してみた。

他にも便利なコマンドがあれば、追記する予定。

#コマンド#

+ /(ルートディレクトリ)から特定ファイルの場所を検索

```
find / | grep my.cnf
```

+ 指定したコマンドがあるか探す。

```
which mysql
```

+ ログの中のExceptionという文字列を検索し、表示する

```
cat hoge.log | grep "Exception"
```

+ カレントディレクトリの中の全てのファイルを連結し、Exceptionという文字列を探す

```
cat *.* | grep "Exception"
```

+ 対象ファイルに対して、全てのユーザーにアクセス権を与える

```
chmod 777 hoge.log
```

+ 日付をそのままに対象ディレクトリへファイルをコピーする

```
cp -p コピー元パス/hoge.log コピー先パス/.
```

+ 新規でExceptionという文字列が書かれたファイルを作成する

```
echo "Exception" > /任意パス/hoge.txt
```

+ warningという文字列を含むファイルをカレントディレクトリ配下から再帰的に探す

```
find -name "*warning*" 
```

+ csvファイルの始めの一行を見る

```
head -1 hoge.csv
```

+ これまで発行したコマンドを確認する

```
history
```

+ 確認しながら、ディレクトリを削除する

```
rm -Ri ディレクトリ名
```

+ 確認しながら、ファイル名の前方がwarningであるものを削除する

```
rm -i warning*
```

+ ディレクトリをtar.gzで圧縮する

```
tar cvfz 作成するファイル名.tar.gz ディレクトリ名
```

+ 圧縮されたtarファイルの中身を確認する

```
tar ztf hoge.tar.gz
```

+ 圧縮されたtarファイルの中身の一部のみを展開し、取り出す

```
tar zxof hoge.tar.gz ディレクトリ名/hoge.log
```

+ csvファイルの終わりの一行を見る

```
tail -1 hoge.csv
```

+ ログファイルの追記をリアルタイムで見る

```
tail -f hoge.log
```

+ カレントディレクトリ内のファイルを権限、所有者、日時付きで一覧表示する

```
ll
```

+ 再帰的にフォルダを作成する

```
mkdir -p ディレクトリ名/ディレクトリ名
```
さくらのレンタルサーバー Laravel5 インストール

# Laravel5 インストール

## 対象
さくらのレンタルサーバー（スタンダード以上）

## 事前準備
コントロールパネルにて「PHPのバージョン選択」を「5.6」に変更
（インストール条件 PHP >= 5.5.9 のため)


## 手順目次
1. リモートログイン（ＳＳＨ）
2. Composerのインストール
3. Laravel5のインストール
4. 公開ページ等の修正

### 1. リモートログイン（ＳＳＨ）

さくらサーバーのマニュアル参照
https://help.sakura.ad.jp/app/answers/detail/a_id/2263


### 2. Composerのインストール
#### 1.binディレクトリの作成

`cd ~`
 `mkdir bin`

#### 2.環境変数PATHに**$HOME/bin**が含まれているか確認

`% cat .profile`
`PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$HOME/bin; export PATH`

※含まれていない場合追加

#### 3.Composerをbin配下にインストール

`cd ~`
`% curl -sS https://getcomposer.org/installer | php -- --install-dir=bin --filename=composer`
`% chmod 755 bin/composer`

![image](https://qiita-image-store.s3.amazonaws.com/0/120613/800a3ba6-333e-389f-960b-4ad75ab45b93.png)

アップデートの確認

`% composer self-update`

.composerディレクトリが追加されていることも確認
![image](https://qiita-image-store.s3.amazonaws.com/0/120613/8f6e4bc0-d8c7-a3e5-8748-5ca56da3b8ac.png)

ここにインストーラーなどが保存される(.composer/vendor/bin)
※エラー等の発生した場合は別途エラー内容を確認

### 3. Laravel5のプロジェクトをインストール
#### 1.Laravel5インストーラーのインストール

`composer global require "laravel/installer"`

![image](https://qiita-image-store.s3.amazonaws.com/0/120613/f55eef28-8508-2a91-d395-fded3d864081.png)

#### 2.Laravel5のインストール先を作成

例 ホームディレクトリ配下 laravel_project内にプロジェクトを入れて管理する

`cd ~`
`mkdir laravel_project`
`/home/XXX/laravel_project/`

#### 3.Laravel5プロジェクトを作成
例　laravel_project配下に**blog**プロジェクトを作成
blog部分はプロジェクト名ごとに変更

`cd ~/laravel_project`
`~/.composer/vendor/bin/laravel new blog`
![image](https://qiita-image-store.s3.amazonaws.com/0/120613/ffde66cb-c48f-5a10-89ac-7a3248c7e3fb.png)
・・・
![image](https://qiita-image-store.s3.amazonaws.com/0/120613/702864e7-df7b-357c-92da-c0753938f4c2.png)

#### 4.アップデート
プロジェクト内に移動してアップデート実施
`cd ~/laravel_project/blog`
`composer update`

![image](https://qiita-image-store.s3.amazonaws.com/0/120613/c3a04a9d-77e6-c9a4-26f8-d2b653f2391c.png)

バージョン確認
`php artisan -V`
![image](https://qiita-image-store.s3.amazonaws.com/0/120613/188addf9-cf0f-9a47-e631-7d70db887472.png)


### 5. 修正変更

1. envの変更
2. publicディレクトリが公開ディレクトリになるので中身を公開先にコピー（home/XXX/www/公開ディレクトリ）
3. 公開ディレクトリの.htaccesの変更 ディレクトリで切る場合は.htaccessにRewriteBaseを追記/Options部分削除する
4. 公開ディレクトリのindex.phpの修正（require,$app部分をプロジェクト先に変更）

## 参照
以下のサイトを参照しました。
http://readouble.com/laravel/5/2/ja/installation.html
http://c-rtx.com/2015/09/22/laravel-on-sakura-rental-server/
SwiftでRealmを使う時のTips(2) 生成とオートインクリメント編

#目次

[SwiftでRealmを使う時のTips まえがき](http://qiita.com/nakau1/items/a591d9cc34e5b575ceb5)
[SwiftでRealmを使う時のTips(1) アクセサとエンティティ編](http://qiita.com/nakau1/items/21ed81e7f38c104f760e)
[SwiftでRealmを使う時のTips(2) 生成とオートインクリメント編](http://qiita.com/nakau1/items/0323807abed795a43393)
[SwiftでRealmを使う時のTips(3) NSPredicate編](http://qiita.com/nakau1/items/40865299dacc50d71604)

#似非オートインクリメント

`Realm` にはオートインクリメント機能みたいなものはありません
整数型のIDを主キーにしてオブジェクトを扱うと色々と便利なので
「似非オートインクリメント」を前回に作ったアクセサクラスに追加します

```swift
public extension NBRealmAccessor {
    
    /// オートインクリメントされたID値
    public var autoIncrementedID: Int64 {
        guard let max = self.realm.objects(Entity).sorted(NBRealmEntity.IDKey, ascending: false).first else {
            return 1
        }
        return max.id + 1
    }
}
```

「似非」と呼んでいるのは
正しくは今あるエンティティの中で最も大きいIDに1を足したものを返している・・・からです
厳密に言うとスキーマなどで管理されているオートインクリメントではありません

しかしアプリでデータベースを扱う上で、この方法で支障が出ることはなかなかないです
厳密さが必要な場合は、要件に応じてここを作り変えればいいわけです


この計算プロパティを使ってエンティティを作成するメソッドを追加しました

```swift
public extension NBRealmAccessor {
    
    public func create() -> Entity {
        let ret = Entity()
        ret.id = self.autoIncrementedID
        return ret
    }
}
```

これでアクセサからエンティティを生成するときは
このように書くことが出来るようになりました

```swift
// 型推論により　": UserEntity" は不要ですが、わかりやすいように書いています
let user: UserEntity = UserAccessor().create()
```

しかし、この方法は問題が発生しました
下記のような場合の時です

```swift
for i in 0..<100 {
    let user: UserEntity = UserAccessor().create()
}
```

`create()`内の `autoIncrementedID` プロパティが
毎回データベースを見に行ってIDの最大値を取得しに行くので
これがオーバヘッドを生み出しました

さらに、データベースに未だ保存していない状態で次の新しいエンティティを作ろうとすると
当たり前ですが、変数`user`の `id`は常に同じ値になります

なので、下記のように改修を行いました

```swift
public extension NBRealmAccessor {
    
    public func create(withID id: Int64? = nil) -> Entity {
        let ret = Entity()
        ret.id = id ?? self.autoIncrementedID
        return ret
    }
}
```

IDを指定することによって、データベースへのアクセスが走らないようにしました
ループ時は下記のように書くことでオーバヘッドは極端に減ります

```swift
let accessor = UserAccessor()
var id = accessor.autoIncrementedID

for i in 0..<100 {
    let user: UserEntity = accessor.create(withID: id)
    id += 1
}
```

オーバロードメソッドになったので
最初に書いた方法を崩すこともありませんね

```
let user: UserEntity = UserAccessor().create()
```
考察 > FormMainとFormSub間のメッセージ受け渡し > FormSubの再利用性

[検討中]

```txt:対象環境
C++ Builder XE4などフォームアプリケーション
```

## 前提

以下の2つのフォームがあるとする。

1. FormMain
2. FormSub

FormSubで行った処理をもとに、FormMainにメッセージを表示したい。

## 実装方法

2つの方法が考えられる。

### Case A: FormMainにAddMessage()を実装

FormSubからFormMain->AddMessage()をコールする。

- 利点: FormSubでメッセージ発生直後にFormMainに表示できる
- 欠点: FormSubに`#include "FormMain.h"`が入る
  - FormSubからのメッセージを別のフォーム(例: FormTest)に表示できない(再利用時の問題)

### Case B: FormSubにGetMessage()を実装

FormMainから定期的にFormSub->GetMessage()をコールする。
GetMessage()した文字列がLength > 0の時にメッセージを表示する。

- 利点: FormSubがFormMainに依存せず、他のフォームからも使える (再利用可能)
- 欠点: FormSubにてメッセージ発生直後にFormMainは更新されない。
  - FormMainのGetMessage()実行頻度に基づく (例: 1秒ごと、200msecごと、など)
- 欠点: FormSub側でメッセージをリスト保持する必要がある
  - メッセージ上書き防止のため
- FormMainからFormSubの既読メッセージの消去処理は要検討


### 感想

Case Aの実装をたくさんしてきたが、FormSub自体の再利用性を考えるとCase Bの方がいいのかもしれない。

上記のような問題はフォーム間だけでなく、アプリケーション間の通信にも関係しそうだ。

こういう設計の良い本はまだ見つかっていない。(または過去に読んだかもしれないが、頭に入っていない)。

## Presentation Domain Separation

@ozwkさんの[コメント](http://qiita.com/7of9/items/358a46b38ebf93c5101a#comment-503132209033d52edaac)で紹介いただいたPresentation Domain Separationを読み始めている。

以下のリンクが勉強になった。
http://memowomome.hatenablog.com/entry/2014/04/13/102736

MVVMを使う時にObserverパターンを使う場合や、メディエーターパターンを使う場合があるようだ。

### Observerパターン

Observerパターンは以下を見つけた。
https://sourcemaking.com/design_patterns/observer/cpp/3
[delphi実装](https://sourcemaking.com/design_patterns/observer/delphi)を理解して、C++ Builder向けに展開した方がいいのかもしれない。
Unityで3DObjectをぷるぷるにする方法


#はじめに
Unityでオブジェクトをぷるぷるにする方法を紹介します。

今回は以下のようにSphereとCubeを配置しました。
SphereにはRigidbodyが追加されており、Use Gravityがチェックされていて、再生を押した時にCubeの上に落下するようになっています。（分かりやすくするためSphereの色も変更しました）

<img width="563" alt="Screen Shot 2016-07-07 at 2.54.57 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/04c9ba8d-73aa-2276-1189-3f229c541b37.png">


#手順
 1. Sphereを選択し、Add ComponentからClothを検索する
 2. Skinned Mesh RendererのMeshを設定する
 3. ClothのStretching StiffnessとBending Stiffnessを変更する
 4. ClothのSphere Collidersの値を変更する

#1. Sphereを選択し、Add ComponentからClothを検索する

<img width="245" alt="Screen Shot 2016-07-07 at 3.09.26 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/6442c5ec-75a4-d09e-aa01-d1870f1179c2.png">

Clothのコンポーネントを追加すると、Clothと同時にSkinned Mesh Renderer も追加されます。
<img width="1265" alt="Screen Shot 2016-07-07 at 3.26.05 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/844f987c-89b7-60c2-96a9-36ae4e816e75.png">


ここからSphereをぷるぷるにするためにSkinned Mesh RendererとClothそれぞれの値を変更していきます。

#2. Skinned Mesh RendererのMeshを設定する

<img width="256" alt="Screen Shot 2016-07-07 at 3.22.12 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/b51d6dbd-71e2-77d8-ed64-d1c06d056be1.png">

クリックするとこのような画面になります。Sphereをクリックします。

<img width="1276" alt="Screen Shot 2016-07-07 at 3.29.53 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/9b004983-a579-d63c-c5c6-73563eb00573.png">


#3. ClothのStretching StiffnessとBending Stiffnessを変更する

Sphereのぷるぷる度を変更するところです。自由に変更してみてください。（今回私はどちらも0.95にしました）

(Bending Stiffness = 布の伸縮性, Stretching Stiffness = 布の曲げ剛性)

<img width="259" alt="Screen Shot 2016-07-07 at 3.39.38 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/12c9ebf7-c6a2-8f67-5e7a-e22741a5ce05.png">

#4. ClothのSphere Collidersの値を変更する

<img width="257" alt="Screen Shot 2016-07-07 at 3.44.22 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/4892e4ec-2ccb-2f70-8e31-6385c459627e.png">

今回1に変更しました

(Sphere Colliders = このClothインスタンスが衝突する ClothSphereColliderPairs の配列)

するとElement 0という項目が出てくると思います。
<img width="256" alt="Screen Shot 2016-07-07 at 3.50.14 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/60c8a294-00de-8f38-28e4-dac54c3aaef4.png">

その下のFirstを選択し、

<img width="1280" alt="Screen Shot 2016-07-07 at 3.51.53 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/2bddde41-702b-7608-2bc4-4d4dae4178ae.png">

Sphereを選択します。

これで完成です！！！再生してみましょう。

![ezgif.com-video-to-gif-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/132806/9df0877f-41a3-908a-d6b8-da5f637838c6.gif)



#おまけ

もっとSphereを跳ねさせたいときは、Project→Create→Physic Materialを追加し、Bouncinessを変更して、これをSphereにつけます。

<img width="511" alt="Screen Shot 2016-07-07 at 4.04.41 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/132806/78758c5a-d390-9c82-de4d-bd91150c03c4.png">


するとよりぷるぷる具合が分かりやすく見えるようになりましたね！


#最後に
これを応用すればスーパーボールやわらび餅など様々なアイテムが作れそうですね！
ぜひ、やってみてください。

#参考にしたwebサイト
http://docs.unity3d.com/ja/current/Manual/class-Cloth.html
http://ndabecha.blogspot.jp/2015/12/unitycloth_24.html
Bash on Ubuntu on Windows + XmingによるGUI

#概要
bash on ubuntu  on windowsにおいてmaptlotlibやpyqtなどを使用したいときにGUIが必要となる．
それをXmingを使用することにより解決する．
#手順
[このサイト](https://channel9.msdn.com/Blogs/WinCoder/XMING--Bash-on-Ubuntu-on-Windows--X11-Window-System-Running-from-Windows10-Subsystem-for-Linux)の動画をもとに進める
###エラーが出ることの確認
GUIがないことを確認するために以下のコマンドにてGUIアプリケーションをインストール

```
username@user: sudo apt-get install x11-apps
```
インストール終了後，以下のコマンドにてアプリを起動する

```
username@user: xeyes &
```
すると以下のようなエラーが出てくるはず

```
username@user: Error: Can't open display
```
ここまででエラーの確認はok


##Xmingの導入
[公式サイト](https://osdn.jp/projects/sfnet_xming/)より以下をダウンロードする．

- Xming-6-9-0-31-setup.exe
- Xming-fonts-7-5-0-93-setup.exe

ダウンロードしたファイルをインストールし，xmingを起動する．

##bashでの設定
右下のステータスバーのXmingにマウスをあてると

```
Xming server:0.0
```
のようになっているはず．
次に環境変数DISPLAYの設定を以下のコマンドにて行う．

```
username@user: export DISPLAY=localhost:0.0
```
localhost:XXXのXXXには先ほど確認したxming serverの値を入れる．（おそらく0.0のはず）
※.bashrcにexport文を書いておくと起動時に読み込んでくれるのでうれしい

##実際に試す
以下のコマンドでウィンドウが出てきたら完了

```
username@user: xeyes &
```
PHPでよく使うDocumentのリンク

#### PHP
https://secure.php.net/manual/ja/index.php

---

#### PHPUnit
https://phpunit.de/manual/current/ja/appendixes.assertions.html

---

#### Phalcon
https://api.phalconphp.com/
#### Symfony
http://api.symfony.com/3.0/index.html
#### CakePHP
http://cakephp.jp/pages/documentation
#### Laravel
https://laravel.com/api/5.2/
#### Concrete5
http://documentation.concrete5.org/api/
#### Composer
https://getcomposer.org/doc/
#### ZendFramework
https://framework.zend.com/docs/api/zf2

---

#### Vagrant
https://www.vagrantup.com/docs/
#### Docker
https://docs.docker.com/engine/reference/commandline/

---
#### Chef
https://supermarket.chef.io/cookbooks-directory
#### Itamae
https://github.com/itamae-kitchen/itamae

---

#### Swagger
http://swagger.io/specification/
#### MockBin
http://mockbin.org/

---

#### phpenv
https://github.com/phpenv/phpenv

---

### Locust
http://docs.locust.io/en/latest/

---
### Logstash
https://www.elastic.co/guide/en/logstash/current/index.html
svn creanupが作業コピーデータベースのロックで失敗する

##環境
Windows7 TortoiseSVN 1.9.4

##現象

クリーンアップが失敗するようになりました。
何度実行しても同じエラーでとまります。

```
Previous operation has not finished; run 'cleanup' if it was interrupted
```

チェックアウトしなおすと

```
エラー sqlite[S5]: database is locked
エラー Additional errors:
エラー sqlite[S5]: database is locked
他のプロセスが作業コピーデータベースをブロックしているか、使用しているファイルシステムがファイルのロックをサポートしてないかです。
もし作業コピーがネットワーク上のファイルシステムにあるのであれば、ファイルサーバーがファイルのロックをサポートしているかどうかを確認してください。
```

何度チェックアウトしても同じように失敗します。

##対処

作業コピーデータベースがロックが残ってしまうのが原因のようです。
ロックを外して対処します。

SVNのメタデータである.svn/wc.dbを直接編集します。
こちらはsqlite形式で書かれているので、sqliteを使用します。

1. sqlite3をダウンロードし、.svn/wc.dbの場所に移す。
2. コンソールを起動し、該当箇所に移動します。
3. sqlite3 wc.db .tablesを実行します。 WC_LOCK、WORK_QUEUEが表示されることを確認します。
4. sqlite3 wc.db --header "select * from WORK_QUEUE"
5. sqlite3 wc.db --header "select * from WC_LOCK"
6. 何かしらのデータが残ったままだった場合、テーブルごと消します。
7. sqlite3 wc.db "delete from WORK_QUEUE"
8. sqlite3 wc.db "delete from WC_LOCK"

再度クリーンアップを実行します。
ロックが外れたのでうまく行くはずです。


こちらを参考にしました。
[[Windows][Subversion]svn commitに失敗してcleanupもできない](http://d.hatena.ne.jp/const/20150628/p1)
[Working copy XXX locked and cleanup failed in SVN](http://stackoverflow.com/questions/127932/working-copy-xxx-locked-and-cleanup-failed-in-svn)
Lambda+RDSはアンチパターン

# 何が起きたのか
作成していたアプリではサーバレス構成にてLambdaからRDS(MySQL)を呼び出していました。
リクエストが増えるとRDSのコネクション数が増加して
すぐにDBコネクションエラーになってしまいました。

# 最大コネクションの上限値
結論から言うとLambdaとRDS(MySQL)は相性が良くないです。
理由はLambdaからRDSのDBコネクションを貼ると
リクエスト単位でコネクションを張ってしまうため
仕組み上、同時接続に耐えられません
（RDSのコネクション上限数が少ない）

![スクリーンショット 2016-07-04 14.10.47.png](https://qiita-image-store.s3.amazonaws.com/0/55077/8f096fc2-7c0f-c249-2d26-dd9fab19dd8b.png)

# さらにVPC設定すると・・・
セキュリティのため、RDSをLambdaからのみアクセスさせるためには
LambdaとRDSを両方とも
VPC領域に置く必要があるのですが、Lambdaの起動が遅くなる場合があります。
これは、一定時間Lambdaがコールしない場合にスリープ状態になり、
起動する際にENIを生成するのに時間がかかっているのが原因だと考えられます
（どちらかというとLambdaの問題ですが）

詳細は下記参考にしてください
[Lambda + API Gateway で処理の実行がむちゃくちゃ遅くなるケースを調べた](http://qiita.com/pm11op/items/eb148b23b062fe778bd1)

この現象の対策としてはLambdaをCloudWatchのイベントにて定期的にキックすることで回避することができます。

# 対策
結果論から言うとそもそもRDSだとスケールアップの費用対効果が薄いので
DynamoDBの構成にすべきでした。

| パフォーマンス比較  |接続数 | [月額料金(MySQL)](https://aws.amazon.com/jp/rds/pricing/) | メモリ  |
|---|---|---|---|
| t2.micro	  |  ４０コネクションが限界<br/>秒間平均0.666リクエストが上限 | $12.24| 1GB  |
|  t2.micro x 2 (read raplica) | マスター：４０コネクションが限界 <br/>秒間平均0.666リクエストが上限<br/>リードレプリカ：３０コネクションが限界<br/>秒間平均0.5リクエストが上限  |$24.48 |1GB x 2 |
|t2.small | ７０コネクションが限界<br/>秒間平均1.1666リクエストが上限 | $24.48 |  2GB |
| t2.medium  |  １５０コネクションが限界<br/>秒間平均1.1666リクエストが上限| $48.96  | 4GB  |

対策：
①RDSをスケーリング(費用かかる)
②RDSにかかる負荷を減らす

* タイムアウト設定を短くする、処理終了時にLambda側から接続をcloseする
* APIを１つにまとめてリクエスト（コネクション）を減らす（APIの改修、クライアントの改修が必要）
* リクエストをキャッシュする

③DynamoDB乗せ代え（テーブル構造含め、サーバ側の改修が必要、要件満たせるか検討が必要）

暫定対応は①、②ですが、恒久的には③でないと厳しいです。
ただし、DynamoDBはオートスケールはしてくれるもののテーブル構成が制限され、検索機能も貧弱なため専用の設計が必要です。
ボックスレイアウト向けシンプルHTMLジェネレーターJS

# 主旨
- JavaScriptで「シンプルなテキスト」から「ボックスレイアウト主体のHTML」を組み立てます。
- class指定のDIVタグだけ配置できれば十分！<br>
後でCSSやjQuery（appendやタグスワップなり）でゴニョゴニョするのが主眼の思想です。
- スクリプトの作りこみでちょっとしたカスタマイズができるようにしたい場合に便利です。

既にいろいろ乱立してそうですが…シンプルさが特徴です。（ゴルフを意識しているわけではないです）

# 使用方法
[本体](#本体)を設置し、関数の引数に以下のタグを表す文字をセットしてください。

- 「&lt;」「&gt;」で囲まれている文字　→ DIVタグの開始・終了を作成します。
- 「要素名」(っぽい文字）→ classにセットされます。（※アルファベット・数字・特定の記号（「-」「_」））

```js:基本例：実行JavaScript
ddom("<main<sub>>");
```

```html:結果：テキスト(HTML)
<div class="main"><div class="sub"></div></div>
```

（※注意 バリデーション一切無しです）

# 使用例

```js:実行JavaScript＋jQuery
$(ddom("<main<form<area1<text_name><text_code>><area2<btn inline>>>"));
```
```html:出力HTML
<div class="main">
  <div class="form">
    <div class="area1">
      <div class="text_name"></div>
      <div class="text_code"></div>
    </div>
    <div class="area2">
      <div class="btn inline"></div>
    </div>
  </div>
</div>
```

# 本体

```js:JavaScript
var ddom=function(val){return val.replace(/<([^<>]*)/g,'{div class="$1"}').replace(/>/g,'</div>').replace(/\{/g,'<').replace(/\}/g,'>')};
```
※「ddom」は必要に応じて名前やスコープを変えてください。
sudo経由でrbenvを実行した時、”コマンドが見つかリません”と出たら？

#解決方法
1.

```shell-session
$ sudo visudo
```
2.
修正前

```shell-session
Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"  
```
修正後

```shell-session
Defaults    secure_path = "/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/rbenv/bin:/usr/local/rbenv/shims"
```
のように変えてください。

#結果

```shell-session
yoon@v157-7-198-205:~$ sudo rbenv install 2.3.1
Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
Installing ruby-2.3.1...
Installed ruby-2.3.1 to /home/yoon/.rbenv/versions/2.3.1
```
お名前.com のDNSレコードをLinuxから自動更新する

#やりたいこと
『自宅サーバー+お名前メール』で運用するために、お名前.comのDNSサーバー(dns01.gmoserver.jpとかdns02.gmoserver.jp)のAレコードをLinuxサーバーから自動更新したい(cronで回したい)

##経緯
1. お名前.comでドメインを買う
2. 自宅サーバー+[myDNS](http://www.mydns.jp/)でWebサーバーを運用
3. 買ったドメインでのメールアドレスが欲しくなる
4. [お名前メール](http://www.onamae.com/service/mail/)契約
5. 『あれ？MyDNSだとお名前メール使えなくない？？』

メールサーバーは安定性が欲しいから自宅ではなく、外部サービスのものを利用したい(契約しちゃったから、お名前メールを使うようにしたい)

##問題点
お名前.comのDNSサーバーは複数あって、[SDサーバー](https://www.onamae.com/server/sd/)用のDNSサーバーはレコード更新用のソフトウェアやスクリプト等が存在しない(はず)。
(注: お名前メール単体での契約でもSDサーバー扱いになる。お名前.comのDNSサーバーについては[サポート](http://help.onamae.com/app/answers/detail/a_id/8075/~/%E3%80%90%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%80%91%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E3%83%8D%E3%83%BC%E3%83%A0%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%83%85%E5%A0%B1%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%A9%E3%82%93%E3%81%AA%E5%A0%B4%E5%90%88%EF%BC%9F)に説明が載っている)

レンタルサーバーの類を使わない場合のDNSサーバー(01.dnsv.jpとか)の場合は[Windows向けの更新ソフトがお名前.comからリリースされている](http://www.onamae.com/option/dnsrecord/)ので、それを使えばいいと思う。(UNIX/Linux向けがないのは不便だけれど)

##やったこと
SeleniumとPhantomJSを使って、自動更新のためのbotを用意した。
https://github.com/n-taka/onamaeDNS
便宜上ファイル名は*.pyにしているけれど、cronで回すなら拡張子を外す必要がある(はず)
ところどころエラー処理適当なのはこの際、放置。

###あとがき
お名前.com側に迷惑掛けるのも良くないので、もし使う人いたら、更新の頻度は常識的な頻度でお願いします。まぁ、『自宅サーバー+お名前メール』という需要がどのくらいあるかは微妙ですが…。
『botでの更新はやめてくれ！！』等ありましたら、お名前.com関係者の方からの連絡の場合のみ該当スクリプトの公開停止等対処を行います。
Design Language


*[ref](http://design.blackboard.com/the-new-school-language/interaction/)*

## Think in flows, rather than features.
When you create new products, or integrate new capabilities into existing products, think about how the user will encounter these features in a larger goal-directed flow. Sketch the steps in the flow, and consider if the user will understand how to move from step to step.

![http://design.blackboard.com/wp-content/uploads/2015/11/ThinkInFlows.gif](http://design.blackboard.com/wp-content/uploads/2015/11/ThinkInFlows.gif)
 

## Consider the system, rather than just the interface.
While interactions are displayed as user-interface controls, users experience each screen in the context of a larger system. That means that they may encounter a particular UI component in a number of places. Think about and design the control so it makes sense in a number of different contexts.


![http://design.blackboard.com/wp-content/uploads/2015/11/ThinkSystem.gif](http://design.blackboard.com/wp-content/uploads/2015/11/ThinkSystem.gif)

## Encourage exploration, and be forgiving.
Create a design that has multiple ways to solve a given problem, so users can explore the system without getting lost. It should be easy to get from one section to another, and if the user does make a wrong turn, they should easily be able to return to their task or intended path. Errors should be non-destructive whenever possible.


![http://design.blackboard.com/wp-content/uploads/2015/11/FreedomToExplore2.gif](http://design.blackboard.com/wp-content/uploads/2015/11/FreedomToExplore2.gif)

## Drive predictability by using components consistently.

Non-traditional UI components - the display of student profiles, grades, and so-on - should be treated in a consistent, controlled manner. When a user encounters one of these elements, they should recognize and easily predict what it’s for and how to use it based on previous experience.

![http://design.blackboard.com/wp-content/uploads/2015/11/ThinkSystem.gif](http://design.blackboard.com/wp-content/uploads/2015/11/ThinkSystem.gif)

## Always design cross-platform and cross-device.

Students and instructors move between phone, tablet, and web throughout their day, and they should be able to easily leverage prior knowledge on one platform in another. Design specifics change per platform to leverage the specific medium, but the interaction design language should be consistent.


![http://design.blackboard.com/wp-content/uploads/2015/11/CrossDevice.gif](http://design.blackboard.com/wp-content/uploads/2015/11/CrossDevice.gif)
IF関数を使わずに「あるセルの値がxだったらyを表示」

Excelで、「あるセルの値が○○だったら、隣接するセルに××を表示」ということをしたいケースは多いと思います。

#IF関数で
最初に思いつくであろう方法は、IF文を利用するものでしょう。

![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/131413/3e16874e-974b-895a-23d4-fcc6d3b516b8.png)

基準になる値が2択の場合は、IF関数を使うのが一番シンプルかと思います。
しかし、3つ以上の値に対応するためには、以下のようにIF関数をネストさせなければいけません。

```
 =IF(A1="赤","Red",IF(A1="黄","Yellow","Blue"))
```

3つ、4つくらいまでならまだいいですが、あまりスマートな方法ではなく、メンテナンスもしづらくなります。

#VLOOKUP関数で
基準になる値の種類が非常に多い場合は、別に表を作成して、VLOOKUP関数を使うのが無難ではないかと思います。

![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/131413/8d6aca3e-b5d2-af8c-74fe-f9050e3c7fe3.png)

特に問題はないのですが、別に表を作成しなければならない点はデメリットでしょうか。

3つ～5つくらいの分岐の場合、IF関数だと表記が煩雑、VLOOKUP関数を使うほど選択肢は多くはない、とどちらも中途半端な気がします。
ということで、第3の選択肢です。

#LOOKUP関数で
以下のようにLOOKUP関数を記述すると、シンプルに実現することができそうです。
![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/131413/82274b55-f93c-a719-d678-57adbf717f4f.png)

LOOKUP関数の第2引数、第3引数にはセル範囲を指定するのがよくある使い方の例ですが、{ } でくくった配列を指定することもできます。
注意する点としては、第2引数の配列は昇順で並べ替えておく必要があるという点でしょうか（[参照](https://support.microsoft.com/ja-jp/kb/181201)）。配列の要素が文字列の場合は気をつけなければいけませんね[^1]。

***

[^1]: 第2引数の配列の要素が文字列の場合、まれに想定した結果が返ってこないことがあるようなのですが、現在の僕には原因が分かりませんでした……。
Sublime Text3 lintエラーをリアルタイム表示してjavascriptの実装を少しだけ効率化

Node.jsの実装をしていて、一番最後にeslintを実行していたけど、毎度結果から該当ファイルを探す→行番号を探す→エラーを除去する、という流れが面倒くさかったのでSublime Text3のプラグインSublimeLinterを入れてみた。
これでコーディングしながらlintチェック出来るため多少効率アップ！

## eslintのインストール
以下はnpmを使ったサンプル

```
$ npm install -g eslint
$ eslint -v
v3.0.1
```

## SublimeLinterのインストール
* Package Control(Macの場合cmd + shift + p)からInstall Packageを選択。
* SublimeLinterと入力し、Enterを押してインストールする

## SublimeLinter-contrib-eslintのインストール
* 同様にInstall Packageで、SublimeLinter-contrib-eslintと入力し、Enterを押してインストールする

## 設定ファイルに設定を記載
* Preferences -> Package Settings -> SublimeLinter -> Settings Userを選択
* 下記のように記載する

Macの場合の例。ポイントは以下。
1. lintersのeslintの項目で、argsにeslintの定義ファイルを設定する
2. lintersのeslintの項目で、disableをfalseにする。これしないと動かなかった
3. lint_mode: backgroundによってライブチェックをする
4. pathsのosxにeslintまでのパスを記載。ここは使っているパッケージ管理ツールによって異なるため注意する

```json
{
  "user": {
    "debug": false,
    "delay": 0.25,
    "error_color": "D02000",
    "gutter_theme": "Packages/SublimeLinter/gutter-themes/Default/Default.gutter-theme",
    "gutter_theme_excludes": [],
    "lint_mode": "background",
    "linters": {
      "eslint": {
        "@disable": false,
        "args": [
          "--config",
          "/path/to/somewhere/.eslintrc.json"
        ],
        "excludes": []
      },
      "jshint": {
        "@disable": true,
        "args": [],
        "excludes": []
      }
    },
    "mark_style": "outline",
    "no_column_highlights_line": false,
    "passive_warnings": false,
    "paths": {
      "linux": [],
      "osx": [
        "~/.nodebrew/current/bin"
      ],
      "windows": []
    },
    "python_paths": {
      "linux": [],
      "osx": [],
      "windows": []
    },
    "rc_search_limit": 3,
    "shell_timeout": 10,
    "show_errors_on_save": false,
    "show_marks_in_minimap": true,
    "syntax_map": {
      "html (django)": "html",
      "html (rails)": "html",
      "html 5": "html",
      "php": "html",
      "python django": "python"
    },
    "warning_color": "DDB700",
    "wrap_find": true
  }
}
```

そして再起動する。

## 動作した例
こんな感じでWarning(黄色)とError(赤色)が出てくる。
![スクリーンショット 2016-07-07 14.52.48.png](https://qiita-image-store.s3.amazonaws.com/0/29379/58784b58-c1c2-5059-7900-dda9c8940701.png)

### なんのエラーかを確認する
出てきたエラーがなんのエラーかを確認するには、先ほどの設定ファイルの中の、

```
"debug": false
```
をtrueに変える。
すると、下のコンソールにエラーの行番号と理由が書かれる。

![スクリーンショット 2016-07-07 14.55.59.png](https://qiita-image-store.s3.amazonaws.com/0/29379/dc630a54-fca0-0df3-f2bf-011966f42006.png)

## アイコンを変える
http://www.sublimelinter.com/en/latest/gutter_themes.html
ここにあるように、gutter-themesというものを変更するとアイコンのカスタマイズが可能。

```
"gutter_theme": "Packages/SublimeLinter/gutter-themes/Blueberry/cross/Blueberry - cross.gutter-theme"
```
にした場合、こんな感じになる。

![スクリーンショット 2016-07-07 15.11.42.png](https://qiita-image-store.s3.amazonaws.com/0/29379/47f381cc-5180-c401-f920-b42651cc4c28.png)

## consoleにFailed to load plugin~~が出る場合
こんなエラーが出る場合がある。
スペルチェックの定義をしているが、pluginがないためにエラーとなる。

```
Error: Failed to load plugin spellcheck: Cannot find module 'eslint-plugin-spellcheck'
```

これは、eslintrc.jsonに定義しているけど、pluginのインストールがされていない場合に出る。
上記の場合、npmでグローバルにインストールする。

```
npm install -g eslint-plugin-spellcheck
```