OmniAICreator/Qiita-1.07M huggingface dataset:
GoTTY 良さそう

GoTTY - Share your terminal as a web application
https://github.com/yudai/gotty

[Qiita でも既にいくつか紹介されています](http://qiita.com/search?q=gotty)が、
個人的に使用した感じをメモ代わりに残してみます。

ちなみに、[同じ名前で別のツール](https://github.com/gotty/gotty/)（こちらの方が名前的にそのままで Go による Terminal アプリ）もあるので、ご注意を。

さて、このツール、コマンドラインの入出力を WebSocket を使ってブラウザ上の入出力にマッピングして、簡単にサーバー上の端末画面をブラウザに表示してくれちゃいます。

### インストール
は簡単で、Go 製のワンバイナリになっているので、GitHub の Release ページから
https://github.com/yudai/gotty/releases/download/v0.0.12/gotty_linux_amd64.tar.gz
をダウンロードして解凍後、然るべき場所にコピーすればすぐに使えます。

```bash
$ wget -qO- https://github.com/yudai/gotty/releases/download/v0.0.12/gotty_linux_amd64.tar.gz | sudo tar zx -C /usr/local/bin/
$ gotty -v
gotty version 0.0.12
```

### 使い方

#### 一番シンプルなのが、

```bash
$ gotty bash
2016/02/16 04:48:46 Server is starting with command: bash
2016/02/16 04:48:46 URL: http://127.0.0.1:8080/
2016/02/16 04:48:46 URL: http://[::1]:8080/
2016/02/16 04:48:46 URL: http://192.168.64.2:8080/
2016/02/16 04:48:46 URL: http://[fe80::3070:cbff:fe56:cf32]:8080/
2016/02/16 04:48:46 URL: http://172.17.0.1:8080/
```

で、ブラウザから上記アドレスにアクセスすると、bash のコマンドプロンプトが表示されます。


![Screen Shot 2016-02-16 at 1.52.05 PM.png](https://qiita-image-store.s3.amazonaws.com/0/65768/46232595-e5e5-cdb0-a121-55d82cf7b254.png)


でも、デフォルトのモードでは入力を受け付けてくれません。

一度 `gotty` を終了させましょう。`Ctrl+C` を二回で終了出来ます。

#### 入力も可能にするには、

```bash
$ gotty -w bash
2016/02/16 04:58:37 Permitting clients to write input to the PTY.
2016/02/16 04:58:37 Server is starting with command: bash
2016/02/16 04:58:37 URL: http://127.0.0.1:8080/
2016/02/16 04:58:37 URL: http://[::1]:8080/
2016/02/16 04:58:37 URL: http://192.168.64.2:8080/
2016/02/16 04:58:37 URL: http://[fe80::3070:cbff:fe56:cf32]:8080/
2016/02/16 04:58:37 URL: http://172.17.0.1:8080/
```

で、これでブラウザがターミナルソフトに変身します。

![Screen Shot 2016-02-16 at 2.00.11 PM.png](https://qiita-image-store.s3.amazonaws.com/0/65768/cde53d05-ac1f-16fc-dc5e-6edd9cd5c2d7.png)

これで直接 SSH が通らないような場所からでもブラウザで簡単にアクセスすることが出来てしまいます。なんか、いろいろ使えそうな気がして来ました。
もちろんこれでは、セキュリティ的にまずいので、Basic認証をかけたり、ランダムなURLを発行したり、TLS を設定するオプションもそろっています。

### Docker のお供に

本家の GitHub の README でも紹介されていますが、

```bash
$ gotty -w docker run -it --rm busybox
```

で、busybox のコンテナのシェルにブラウザからアクセス出来るようになります。
いろいろネットワーク的に面倒なことを考えずにどんなコンテナにもアクセス出来ます。
こりゃ便利！

でも、実際にお試しした方はお気づきかも知れませんが、GoTTY は通常の Web サーバーと同様にブラウザからアクセスした時に `gotty` のコマンドラインで指定したプログラムを起動してコネクションを確立するため、ブラウザの画面を閉じたりリロードする度に、新規にプログラムが起動されるので、コンテナ（ブラウザ画面、セッション）はその場限りの環境ということになります。
これはこれで、コンテナとしては問題ないし、セキュリティ的にもありがたいのですが、
コンテナの Docker イメージの開発やデバッグ、共同作業するとなるとちょっと不便です。
そういうことをこれでやるか？って話もありますが。。。

#### そこで、ちょっと考えてみました。

```bash
$ docker run -d --name busybox busybox nc -p 8080 -l -l -e echo hello world!
0d634dce2946062533b4fe0915302274f82727d99ae5038f02ed98ee76a04d69
$ gotty -w docker exec -it busybox sh
```

ちょっと強引ですが、コンテナをデーモンモードで起動させておいてから、`docker exec` でアクセスするというもの。これなら、`docker exec` を複数回起動しても同一のコンテナのコンテキストにアクセスできるので、いつどこからアクセスしても前回の作業は残ったまま続けられます。
生の busybox だとあまり恩恵はありませんが、アプリケーション・コンテナだったら便利かも。

### という訳で

いろいろ工夫するとアイデア次第で活躍しそうな気がします。
ファイアーウォール越しのプレゼンでのデモとか。

### くれぐれも

公開範囲とかコンテナのオプションとか、セキュリティには十分注意してください。

それではまた。
AWS CLIを使ってRoute53に登録されている情報を調べる

Route53に登録されている情報を調べる
AWSCLI使っているけどjqの使い方がメインの話

# HostedZonesを調べる

```
aws route53 list-hosted-zones --profile PROFILENAME
```

json形式でRoute53へ登録されているHostedZones情報が見れる
jqコマンド等で適宜必要な情報を取得する

## HostedZoneIDを調べる

```
aws route53 list-hosted-zones --profile PROFILENAME | jq -c -r '.HostedZones[].Id'
```
/hostedzone/xxxxxxxxxxの形式で出力する。見づらい場合は `jq -c -r '.HostedZones[]|[.Name,.Id]'`なりで出力
このIDを利用して色々チェックする

# HostedZoneに設定されている一覧を見る

```
aws route53 list-resource-record-sets --hosted-zone-id /hostedzone/xxxxxxxx --profile PROFILE
```
json形式でHostedZoneに登録されている情報が見れる
先ほどと同じようにjqコマンド等で必要な情報を取得

## 特定のTypeのレコードを出力する
登録されているレコード一覧の作成

```
aws route53 list-resource-record-sets --hosted-zone-id /hostedzone/xxxxxxxx --profile PROFILENAME | jq -c -r '.ResourceRecordSets[].Name'
```

この状態だとAレコードだけでなくNSやTXT、SOA等も全て出力してしまう。
なので特定のレコードだけを出力する

```
aws route53 list-resource-record-sets --hosted-zone-id /hostedzone/xxxxxxxx --profile PROFILENAME | jq -c -r '.ResourceRecordSets[]| if .Type == "A" then .Name else empty end'
```

これでAレコードだけの出力が出来る。
複数のレコードを条件としたい場合は `elif` で繋いで出力する

```
aws route53 list-resource-record-sets --hosted-zone-id /hostedzone/xxxxxxxx --profile PROFILENAME | jq -c -r '.ResourceRecordSets[]| if .Type == "A" then [.Type,.Name] elif .Type == "CNAME" then [.Type,.Name] else empty end'
```

AWS CLIのCommandReferenceはこちら[route53](http://docs.aws.amazon.com/cli/latest/reference/route53/)
Daggerとproduct flavorを使って、RetrofitのCall.Factoryをビルドごとに切り替える

Retrofit 2.0-beta4を使用。


mainに定義

```java:AppComponent.java
@Singleton
@Component(modules = {
    AppModule.class,
    NetworkModule.class
})
public interface AppComponent {

}
```

```java:AppModule.java
@Module
public class AppModule {

    @Singleton
    @Provides
    public Retrofit.Builder provideRetrofitBuilder(Call.Factory callFactory, Converter.Factory converterFactory) {
        return new Retrofit.Builder()
                .baseUrl(context.getString(R.string.host))
                .callFactory(callFactory)
                .addConverterFactory(converterFactory)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create());
    }

    @Singleton
    @Provides
    public Converter.Factory provideConverterFactory() {
        return GsonConverterFactory.create();
    }
}
```

mock

```java:NetworkModule.java
@Module
public class NetworkModule {

    @Singleton
    @Provides
    public Call.Factory provideCallFactory(Context context) {
        return new MockCallFactory(context);
    }
}
```

※ MockCallFactoryはokhttp3.Call及びokhttp3.Call.Factoryを自前で実装。


staging

```java:NetworkModule.java
@Module
public class NetworkModule {

    @Singleton
    @Provides
    public Call.Factory provideCallFactory() {
        return new OkHttpClient.Builder()
                .addInterceptor(LoggingInterceptor.create())
                .build();
    }
}
```

production

```java:NetworkModule.java
@Module
public class NetworkModule {

    @Singleton
    @Provides
    public Call.Factory provideCallFactory() {
        return new OkHttpClient.Builder()
                .build();
    }
}
```


# 参考

[Leveraging product flavors in Android Studio for hermetic testing](http://android-developers.blogspot.jp/2015/12/leveraging-product-flavors-in-android.html)
[隔離された環境でテストを行うために Android Studio でプロダクト フレーバーを活用する](http://googledevjp.blogspot.jp/2016/01/android-studio.html)
UIWebviewでtextファイルを表示する方法




```objc:filename
    // ローカルのsample.txtファイルのパスを取得
    NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"txt"];
    NSData *data = [[NSFileManager defaultManager] contentsAtPath:filePath];

    // 文字コードがShift-JISの場合はtextEncodingNameに "shift-jis" を入れる
    [_webView loadData:data MIMEType:@"text/plain" textEncodingName:@"utf-8" baseURL:nil];

```
jQueryでチェックボックスのcheckedを調べる

#仕様
チェックボックスをチェックすると、内容送信ボタンがactiveになる

#HTML
データ属性でtriggerとtargetを指定する。

```html:HTML
<input id="check" type="checkbox" data-trigger-agreement="agreement">
<label for="check">規約に同意する</label>
<button type="submit" data-target-agreement="agreement" style="opacity:0.4;pointer-events:none;"></button>
```
#JS
```js:javascript
var submitCheck = function(){
  var $trigger = $('[data-trigger-agreement]');
  var $target  = $('[data-target-agreement]');
  $trigger.on('click',function(){
    if ($trigger.prop('checked')){
      $target.css("opacity","1").css("pointer-events","auto");
    } else {
      $target.css("opacity","0.4").css("pointer-events","none");
    }
  });
};

$(function(){
	submitCheck();
});
```
Sqaleにおける「静的コンテンツ」の考え方

#何の話？
>アプリケーションの CSS が表示されず、 404 not found となってしまいます
>Sqale では、静的コンテンツは以下のディレクトリを参照する設定となっております。
>/home/sqale/current/public
>CSS を上記の場所に配置し、ご利用のアプリケーションの CSS 参照パス等を修正してください。
>[Sqale FAQ: 技術的な仕様に関する質問](https://sqale.jp/support/manual/faq-technical#static-path)より

に書かれている静的コンテンツとは何なのか、について。

#どういうものが静的コンテンツにあたるのか
##画像ファイル
###railsのimage_tagで指定する画像ファイル
- railsで管理するので標準の通りに`app/assets/images`に置いておいて良いです。

###JavaScript等から指定する画像ファイル
- `public/images`へ配置する必要があります

※例えばJavaScriptを利用してcanvasに背景を貼り付ける場合などは、
`canvas.setBackgroundImage('画像ファイル.png', canvas.renderAll.bind(canvas),{パラメータ}`
みたいな書き方をするので、これの背景画像は静的ファイルとみなされるので`public/images`へ配置する必要があります。

##javascriptとcssファイル
###railsがファイル名を決めているもの
- 例えばjavascriptでuserモデルの`user.js`ファイルは`app/assets/javascripts`で良いです。
- 例えばCSSの`user.css`であれば`app/assets/stylesheets`で良いです。

###自分でファイル名を決めたもの
- 例えば自作の`popup.js`のようなファイルは`public/javascripts`に配置する必要があります。

#対策：js, cssからどのようにファイル指定をすれば良いのか
こちらによくまとまっています。
[Rails4ではbackground:url("assets/hoge.png")の書き方は動かない話](http://qiita.com/wadako111/items/03bc00d914e62243a511)

私は[解決法3](http://qiita.com/wadako111/items/03bc00d914e62243a511#2-5)で対策を行いました。

#感想
正直Sqaleの説明がわかりづらかった。。。
みなさんあの説明で理解できるのでしょうか。
フィボナッチ数列の計算の高速化(Python版)

[フィボナッチ数列の計算の高速化(Ruby版)](http://qiita.com/mathhun/items/4c117d33028a888f6fcf)をPythonでもやってみました。

定義は、一緒です。

```py3:python
# 通常版
def fib1(n):
    if n <= 1:
        return n
    n0, n1 = 0, 1
    for _ in range(n):
        n0, n1 = n1, n0+n1
    return n0

# 高速版
def fib2(n):
    if n <= 1:
        return n
    result = [1, 0, 0, 1]
    matrix = [1, 1, 1, 0]
    while n > 0:
        if n % 2:
            result = mul(matrix, result)
        matrix = mul(matrix, matrix)
        n //= 2
    return result[2]

def mul(a, b):
    return [a[0]*b[0] + a[1]*b[2],
            a[0]*b[1] + a[1]*b[3],
            a[2]*b[0] + a[3]*b[2],
            a[2]*b[1] + a[3]*b[3]]
```

ちゃんとできてます。

```py3:python
print([fib1(i) for i in range(11)])
print([fib2(i) for i in range(11)])
>>>
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
```

時間計測。

```py3:python
%timeit fib1(100000)
%timeit fib2(100000)
%timeit fib1(1000000)
%timeit fib2(1000000)
>>>
10 loops, best of 3: 75.7 ms per loop
100 loops, best of 3: 10.6 ms per loop
1 loops, best of 3: 6.9 s per loop
1 loops, best of 3: 374 ms per loop
```

Rubyより10倍以上、速い！

ちなみに、numpy使うと、1476項(≒1.3e309)までしか計算できませんでした。

以上
[iOS] Storyboardで角丸やボーダーを設定したい! そんなあなたに贈るUIView拡張ライブラリ「EXTView」

問題意識
---
単純なプロトタイプ作成まではStoryboardだけで済んだのに。。。アプリ開発が本格化してきてデザイナーさんから上がってきたデザイン案を元にViewの作り込みを始めると「う、ここでViewに角丸がいるのか。。」「おっと、このViewにはボーダー表示入れないと。。」という状況が増え、それまでStoryboardのみで調整してきたViewもソースコード上から見た目の修正を入れなければならないシーンが増えますよね。

角丸やボーダー程度のちょっとした見た目調整なら、できればStoryboard上で行いたい! そんな希望を叶えるのが今回紹介するUIView拡張ライブラリ「EXTView」です。


利用準備
---
「EXTView」のgithubのアドレスは以下です。

　　https://github.com/recruit-mtl/EXTView
　　(ぜひ★starで支援いただけると嬉しいです^^)

CocoaPodsに対応していますので、以下の設定をプロジェクトのPodfileに追加するだけで利用できるようになります。

```ruby
use_frameworks!

pod "EXTView"
```

pod tryにも対応しているので、もっと簡単に試したい場合は、コマンドラインから以下のコマンドを打って試してみましょう。

```bash
pod try EXTView
```

利用方法
---
EXTViewはUIView群を継承したクラスとして実装されています。具体的にはStoryboard上に配置したUIViewをカスタムクラス指定でEXTView系統に置き換えることで、角丸やボーダーが指定できるようになります。

1. まずはViewをStoryboard上に配置します。例ではUIButtonを配置しています。
![Added a UIButton](https://github.com/recruit-mtl/EXTView/raw/master/Images/README/added_buttton.png)

1. 次に「Identity Inspector」を開いて、カスタムクラスとして EXTView系統のクラス名を指定します。例ではUIButtonを配置しましたので、カスタムクラスとして 「EXTButton」を指定します。
![Set EXTView class name](https://github.com/recruit-mtl/EXTView/raw/master/Images/README/identity_inspector.png)

1. カスタムクラスをEXTView系統に指定した後に、「Attributes Inspector」を開くと、ボーダー、角丸、背景のグラデーションが追加で指定できるようになります。
![design EXTView's Attributes](https://github.com/recruit-mtl/EXTView/raw/master/Images/README/attributes_inspector2.png)<br/><br/>
![Rendered a EXTView in IB](https://github.com/recruit-mtl/EXTView/raw/master/Images/README/set_attributes_button.png)

拡張されたUIViewクラス一覧
---
EXTViewライブラリでは以下のUIViewクラスが拡張されています。

| 継承元クラス名 | 拡張クラス名 |
|---|---|
| UIView | EXTView |
| UILabel | EXTLabel |
| UIButton | EXTButton |
| UISegmentedControl | EXTSegmentedControl |
| UITextField | EXTTextField |
| UISlider | EXTSlider |
| UISwitch | EXTSwitch |
| UIActivityIndicatorView | EXTActivityIndicatorView |
| UIProgressView | EXTProgressView |
| UIPageControl | EXTPageControl |
| UIStepper | EXTStepper |
| UITableView | EXTTableView |
| UIImageView | EXTImageView |
| UICollectionView | EXTCollectionView |
| UICollectionViewCell | EXTCollectionViewCell |
| UICollectionReusableView | EXTCollectionReusableView |
| UITextView | EXTTextView |
| UIScrollView | EXTScrollView |
| UIPickerView | EXTPickerView |
| UINavigationBar | EXTNavigationBar |
| UIToolbar | EXTToolbar |
| UITabBar | EXTTabBar |
| UISearchBar | EXTSearchBar |

実装解説
---
今回のStoryboardの拡張はXcode 6から導入されたIB_DESIGNABLE / IBInspectableという機能を利用して実現されています。IB_DESIGNABLE / IBInspectableの機能を利用すると、今回のようにStoryboardの設定を拡張することができるため、見た目でデザインを管理・調整できる範囲が広がり、ソースコードで見た目調整するよりメンテナンシビリティ向上に貢献できる場合があります。ぜひ有用なシーンで活用してみてください。
[PHP]マルチバイト対応のwordwrapが無いから作った

`wordwrap`のマルチバイト対応のものを漁ってみましたが、smartyを入れないといけなかったり（面倒）、なんか不安。
要するに似た動きしてくれて、内部コードが保証されててメンテしやすければOK！

#これでどうだ！#
```php:mb_wordwrap
public function mb_wordwrap( $str, $width=35, $break=PHP_EOL )
{
    $c = mb_strlen($str);
    $arr = [];
    for ($i=0; $i<=$c; $i+=$width) {
        $arr[] = mb_substr($str, $i, $width);
    }
    return implode($break, $arr);
}
```
基本的に日本語横書き文書は３５文字で改行し、単語を途中で切るのも受け入れられているし（ただ、とんでもない意味の語彙に変化することがあるが…）これでよし。

ほら〜期待通り動く。ソースの見通しもいいね。
Cloud 9上で既存 MySQL with Rails 環境の設定

chromebookで開発を行っていますが、その際にクラウドのIDEを利用しています。
この類のサービスでは[Cloud 9](https://c9.io/)や[Nitrous](https://www.nitrous.io/
)が有名ですが、私はコストを掛けずに利用したいので試用期間のないCloud 9を利用しています。
データベースにMySQLを利用した既存のRailsアプリ環境の構築を行った際に少々手間取ったので、最終的に私が行ったことをメモしておきます。

## 手順
### MySQLをインストール
```sh:console
$ gem install mysql2
```

### database.ymlの設定
```yaml:config/database.yml
development:
  adapter: mysql2
  encoding: utf8
  database: c9
  username: <%=ENV['C9_USER']%>
  host: <%=ENV['IP']%>
```

### MySQLを起動

```sh:console
$ mysql-ctl start
=>Installing MySQL
=> * Stopping MySQL database server mysqld
=>   ...done.
=> * Starting MySQL database server mysqld
=>   ...done.
=> * Checking for tables which need an upgrade, are corrupt or were not closed cleanly.
=>
=>MySQL 5.5 database added.  Please make note of these credentials:
=>
=>       Root User: user_name
=>   Database Name: c9
=>
=> * Starting MySQL database server mysqld
=>   ...done.
```

### structure.sqlを読み込む
私が構築したアプリはsqlでスキーマ情報を管理していました。
そこで、```db/structure.sql```を読み込みます。

```sh:console
$ bundle exec rake db:structure:load
```


### データベースに既存のデータを取り込む
MySQLを起動した際に、c9というデータベースが追加されています。
このデータベースは空の状態ですから、既存のデータベースを取り込む必要があります。
元データはshared/database.sqlにあったので、以下のコマンドを実行します。

```sh:console
$ mysql -uroot -p c9 < shared/database.sql
```
 

### マイグレート
```sh:console
$ bundle exec rake db:migrate
```

以上になります。

## 参考リンク
* [Setting Up MySQL -Cloud 9](https://docs.c9.io/docs/setting-up-mysql)
* [Running a Rails App -Cloud 9 community](https://community.c9.io/t/running-a-rails-app/1615/1)
* [SQLファイルでRailsのスキーマ情報管理 -Hack Your Design!](http://blog.toshimaru.net/manage-schema-with-sql-in-rails/)
fluentd インストール

#メモ：fluentdでログ集約

※関連記事：
http://qiita.com/ohayougenki/items/4add0d5afdc91a3a441d

##環境

EC2（A)：CentOS 6.5　※こっちからログを送る
EC2（B)：CentOS 6.5　※こっちへログを集約する　

##前提

1)apacheがログ収集元サーバにインストールされていること
2)ruby 1.9.2以上
※Treasure Data(fluentdの開発元)がRHEL互換環境にfluentdをインストールできるシェルを用意してくれている。
詳しくは：http://docs.fluentd.org/articles/install-by-rpm

3)fluentdではTCP/UDPともに使用する(SGで許可)
※今回は24224のTCP/UDP
※TCPでファイルを送り、UDPで死活の確認

4)今回は検証だったので、iptablesは停止しています。

##インストール

EC2(A)(B)共に

```shell-session:install
#curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
#sudo /etc/init.d/td-agent start
#sudo /etc/init.d/td-agent status
```

基本的な要素は3つ
source,
match,
include

今回使うのは
sourceとmatchだけ。

##設定ファイル

まずは、送信元「EC2（A)」の設定を行う。
1)apacheログの操作権限付与
2)td-agent.confの設定

```
[root@FluentdAgent ~]# chmod o+x /var/log/httpd
[root@FluentdAgent ~]# vi /etc/td-agent/td-agent.conf
<source>
  type tail
  path /var/log/httpd/access_log
  tag apache.access
  pos_file /var/log/td-agent/access_log.pos
  format apache2
</source>

#<match apache.access>
#  type file
#  path /var/log/td-agent/httpd/access.log
#  time_slice_format %Y%m%d
#  time_slice_wait 10m
#  compress gzip
#</match>

<match apache.access>
  type forward
  <server>
    name サーバ名
    host XXX.XXX.XXX.XXX
    port 24224
  </server>
</match>
```

次に集約サーバ「EC2（B)」側の設定を行う
1)td-agent.confの設定

```
[root@fluentdManager httpd]# cat /etc/td-agent/td-agent.conf
<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>

<match apache.access>
  type file
  path /var/log/td-agent/collect/httpd/access.log
</match>
```

こんな感じでログ出力される。


```
[root@fluentdManager httpd]# pwd
/var/log/td-agent/collect/httpd
[root@fluentdManager httpd]# ls -la
total 12
drwxr-xr-x. 2 td-agent td-agent 4096 Feb 16 05:16 .
drwxr-xr-x. 3 td-agent td-agent 4096 Feb 16 04:39 ..
-rw-r--r--. 1 td-agent td-agent  858 Feb 16 05:16 access.log.20160216.b52bdc3bd93ae658d
```

以上メモでした。
CentOS7にtmux2.xを導入する。

# 概要
以前、[Linux(CentOS7)にtmuxを導入する。](http://qiita.com/sango/items/e264bc0e5cffc1388b43)という記事を書いたのですが、
これを見つけた後輩に「1.8って古くないですか？(ﾌﾟｽｰ)」って言われたので、2.xの入れ方を綴ります。 (^ω^#)

# 導入するもの
- wget
- gcc
- libevent-devel
- ncurses-devel
- tmux (2.x)


# 手順

## 0. 下準備

先ず、

- wget
- gcc
- libevent-devel
- ncurses-devel

を導入するよ。

※導入済みの場合は読み飛ばしてね！

### wgetを導入

wgetはWebから何かをダウンロードするときに使う便利なツールだよ。

```
# yum -y install wget
```

とっても簡単ね！

### gccを導入

ソースをコードをコンパイルするのに必要だよ！

```
# yum -y install gcc
```

### libevent-develを導入

```
# yum -y install libevent-devel
```

### ncurses-develを導入

```
# yum -y install ncurses-devel
```


## 1. tmuxのソースコードを取得

wgetコマンドでgithubからtmuxのソースコードをダウンロードするよ。
※[Releases](https://github.com/tmux/tmux/releases)から好きなバージョンを選んでね！

```
$ wget https://github.com/tmux/tmux/releases/download/2.9a/tmux-2.9a.tar.gz
```

## 2. 解凍

ダウンロードしたファイルを展開するよ。

```
$ tar xvf tmux-2.9a.tar.gz
```

## 3. コンパイル&インストール

解凍したフォルダに移動して、

```
$ cd tmux-2.9a
```

コンパイルして…

```
$ ./configure
$ make
```

インストール！

```
$ sudo make install
```


## 4. 起動！

```
$ tmux
```

起動できたかな？？

# 参考

- [tmux](https://github.com/tmux/tmux)
FormのinputをJSONに起こしてlocalStorageに保存する。

$(document).ready(function () {
  display_name();
  function save() {
    var first_name = document.getElementById('first_name').value;
    var last_name = document.getElementById('last_name').value;

    var namelist = {
      first_name: first_name,
      last_name: last_name
    };

    localStorage.setItem("setdata", JSON.stringify(namelist));
  }

  function display_name() {
    var data = JSON.parse(localStorage.getItem("setdata"));

    $('#first_name').val(data.first_name);
    $('#last_name').val(data.last_name);
  }

  $('#next').on('click', function () {
    save();
  });

});
EC-CUBE3のカスタマイズに必要なことのメモ


##参考になるスライド
開発者によるもので、貴重な情報

http://amidaike.hatenablog.com/entry/2015/09/27/160212



##デザインの編集
* 基本的には、HTMLではなく、デフォルトのTwigテンプレートを編集する。
* 本体のTwigテンプレートを直接編集すると害があるので、以下フォルダにコピーしたあと編集する。優先的に読み込まれます。

/app/template/default/Block

* CSS,JS,imgなどの場所は別にあるので注意

/html/template/default/


* 開発時は、/index_dev.phpにアクセスしながらやる
* 普段はキャッシュが生成されているので、毎回キャッシュ削除して更新しないといけない


##中身

Twigテンプレートに情報をはめ込んでレンダリング

* Twigの埋め込みで情報を取り出す

```app/template/Product/detail.twig
<p class="item_comment">
     {{ Product.description_detail|raw|nl2br }} 
</p>
```


## 商品詳細の場合   URL：　/product/detail

* ProductController.php(151行）

```
151行目

$Product = $app['eccube.repository.product']->get($id);

*******

216行目

return $app->render('Product/detail.twig', array(
            'title' => $this->title,
            'subtitle' => $Product->getName(),
            'form' => $form->createView(),
            'Product' => $Product,
            'is_favorite' => $is_favorite,
));
```     
$Productに商品データのオブジェクトを格納し、Twigテンプレートで使用可能にしている。

($Productの中身は？⇨データベースに登録した内容）
        
* Twigの埋め込みで情報を取り出す

```app/template/Product/detail.twig
<p class="item_comment">
     {{ Product.description_detail|raw|nl2br }} 
</p>
```

縦棒の意味は？

* フィルター

	Twigのフィルター一覧（http://twig.sensiolabs.org/doc/filters/raw.html）
	* raw:データベースのものをエスケープせず出力
	* nl2br:改行を自動的にする
sbt/activator のプロキシ設定(v0.13.9 / v1.3.7)

## 設定内容

java起動コマンドに、プロキシを指定する。環境によってはhttpsも入れないと動かない？（自分はその環境だった。）

```
-Dhttp.proxyHost=ホスト
-Dhttp.proxyPort=ポート
-Dhttp.proxyUser=ユーザ
-Dhttp.proxyPassword=パスワード
-Dhttp.nonProxyHosts="localhost|127.0.0.1"
-Dhttps.proxyHost=ホスト
-Dhttps.proxyPort=ポート
-Dhttps.proxyUser=ユーザ
-Dhttps.proxyPassword=パスワード
-Dhttps.nonProxyHosts="localhost|127.0.0.1"
```

## configファイル

執筆時点、Activator・sbt両者に、java起動の引数に組み込むコンフィグファイルがある。
（起動スクリプトに組み込み。jarから走るときはダメなので注意）

### sbt(v0.13.9時点)

Linux系
```
sbt/conf/sbtopts
```

Windows
```
sbt/conf/sbtconfig.txt
```

### Activator(v1.3.7時点)

Linux系
```
~/.activator/activatorconfig.txt
```

Windows系
```
%UserProfile%\.activator\activatorconfig.txt
```
リストタグで長さの違う要素を合わせる

##html
```qiita.html
<ul class="match">
    <li><a href="#">リスト1</a></li><!--
    --><li><a href="#">リスト2</a></li><!--
    --><li><a href="#">リスト3</a></li><!--
    --><li><a href="#">リスト4</a></li><!--
    --><li><a href="#">リスト5</a></li>
</ul>
```

##css
```qiita.css
body {
    text-size-adjust: 100%;
}

ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

ul.match li {
    display: inline-block;
    vertical-align: top;
    width: 50%;
    box-sizing: border-box;
    padding: 0 10px 10px 0;
}

ul.match li:nth-child(even) {
    padding-right: 0;
}

ul.match li:last-child {
    width: 100%;
    padding-right: 0;
}

ul.match li a {
    display: block;
    width: 100%;
    padding: 10px;
    color: #FFF;
    text-decoration: none;
    background: #3C7DD1;
    box-sizing: border-box;
}
```
[サンプル](http://www.pc-weblog.com/sample/list/match.html)
deis-builder.service が起動しないとき

[Deis](http://deis.io/) や [Deis Workflow](http://deis.com/) の運用中やアップグレード時に，ビルダが `activating/start-post` のままになることがあります。

いくつか可能性はあるかとは思いますが，忍耐強く待つことで復旧される可能性があります。

復旧されるケース
--------------

Postgres が起動していない場合は，時間はかかるものの，復旧する可能性が高いです。

なんで時間がかかるのか?
--------------------

現時点まで(v2.12.0)の Deis では、v1 系も v2 (Workflow と呼ばれる)も Postgres のクラスタリングをサポートしていません。しかし、Deis そのものはクラスタでの実行が前提で，どのノードでも Postgres を立ち上げられるようにしてあります。

Deis では，Postgres を実行しているノードが落ちてもデータが保全されるよう，Postgers コンテナには [WAL-E](https://github.com/wal-e/wal-e/)が含まれ，データベースのスナップショットを永続ストレージに保存できるようになっています[^storage]。
(WAL-E の具体的な動作は、[こちらが参考になります](http://qiita.com/awakia/items/0f36c051a1df8f0b6c6a)。)

運用時のリブートやアップグレードでデータベースを担っているノードが落ちた場合には、別のノードで同サービスが起動します。
その際に、WAL-E を使って永続ストレージにある WAL データデータベースを再構築します。

ネットワークを介しますし、スナップショットの各ファイルは LZO 圧縮されているので展開のコストもあります。
よって、それなりの時間がかかります。

[^storage]: S3, GCS, AzureBlob などのサポートがあります。
[Consolidated Billing] 一括請求をやっていて、子アカウントを一覧で取得したい（ついでにアカウント毎のコストも）[AWS]


AWS　Billingなお話です。
一括請求多すぎてそもそもなんのアカウントあるんよ？って時に。

###請求レポートをダウンロードする必要があります。

![Billing_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/e3d8d6b4-8240-2d92-01d1-159ef3883241.jpeg "Billing_Management_Console.jpg")

###csvのフィールドごとにほしい情報がまとまっているのであとは楽ちんです

```bash:ワンライナー
echo "ConsolidatedAccountName,currency,TotalCost" >> tmp.csv && cat -e <取得したCSVの絶対パス＞ | grep AccountTotal | cut -d, -f10,24,27 | sed -e 's/\"//g' >> tmp.csv
```

このシェルでコンソリアカウントごとの利用料金が出てきます。
コンソリアカウントのIDなんかも取得するフィールドを追加するだけで持ってこれました。

---

#参考（ってかまんま）
###[Detailed Billing ReportのCSVを使って利用料金をグループ集計する](http://dev.classmethod.jp/etc/detailed-billing-report-csv-compute/)

###神様、仏様、クラメソ様。ほしい情報はたいてい書いてある。感謝、感謝。
ポインタのポインタのポインタのポインタのポインタのポインタのポインタ型（7重ポインタ）

（ネタを除く）C言語ソースコードで見かけた、これまでで最もアスタリスク(`*`)の多い[^1]ポインタ型。

[^1]: オレオレ調査による。世の中にはもっと長いヤツがあるかも？無いに越したことはない。

[ITU T-Rec. H.264.2 Reference Software](https://www.itu.int/rec/T-REC-H.264.2/en)[^2] の動画エンコード処理より。動的メモリ確保した6次元配列をポインタ引数で返すため、構造体への7重ポインタ(`MotionVector *******`)型となっている。

[^2]: 動画像コーデックH.264/MPEG-4 AVCの研究開発フェーズで利用されてきた参照ソフトウェア。あくまでコーデック自体のアルゴリズム開発・評価が主目的のため、非常にナイーブな実装がなされることが多い。処理速度も超が付くほど遅いため、普通の利用者は [x264](http://www.videolan.org/developers/x264.html) などのソフトウェアを使うことになる。

```c:lcommon/src/memalloc.c
int get_mem6Dmv(MotionVector *******array6D, int dim0, int dim1, int dim2, int dim3, int dim4, int dim5)
```

```c:lencod/src/slice.c
static int get_mem_bipred_mv(Slice *currSlice, MotionVector ******* bipred_mv)
{
  get_mem6Dmv(bipred_mv, 2, 2, currSlice->max_num_references, 9, 4, 4);
  return 576 * currSlice->max_num_references * sizeof(MotionVector);
}
```

なお現バージョンでは利用されないが、もう1個`*`が多い7次元配列確保関数も残存している。

```c:lcommon/src/memalloc.c
int get_mem7Dmv(MotionVector ********array7D, int dim0, int dim1, int dim2, int dim3, int dim4, int dim5, int dim6)
```
【Unity】pngファイルを読み込み同サイズのTexture2Dを生成する

#はじめに
pngを読み込んで同サイズのTexture2Dを生成する方法を調べてみました.

# pngファイルからTexture2Dを作成
pngを動的に読み込む方法を調べていたところ、解説してくれているブログがありました.

 <a href ="http://macomu.sakura.ne.jp/blog/?p=55"> UnityでPNGファイルを動的に読み込む方法 </a> 

ここを見ると以下のようなソースコードが載っているはずです.

```***.cs
byte[] ReadPngFile(string path){
    FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
    BinaryReader bin = new BinaryReader(fileStream);
    byte[] values = bin.ReadBytes((int)bin.BaseStream.Length);
     
    bin.Close();
     
    return values;
}
 
Texture ReadTexture(string path, int width, int height){
    byte[] readBinary = ReadPngFile(path);
     
    Texture2D texture = new Texture2D(width, height);
    texture.LoadImage(readBinary);
     
    return texture;
}
```

ただし、このコードだけではTexture2Dを作成するときにwidthとheightの値が必要になります.
そこで、pngファイルから画像サイズを取得する方法を調べてみました

# バイナリから画像サイズを取得する
<a href = "http://homepage2.nifty.com/sophia0/png.html"> PNGについて </a> によれば
画像の幅は 16バイト～19バイト(長さ4バイト)
画像の高さは20バイト～23バイト(長さ4バイト)
に格納されているそうです.

これを参考に以下のようなコードを書いてみました.
```width```(画像の幅)と```height```(画像の高さ)を取得するコードです.

```***.cs
  int pos = 16; // 16バイトから開始

  int width = 0;
  for (int i = 0; i < 4; i++)
  {
    width = width * 256 + readBinary[pos++];
  }

  int height = 0;
  for (int i = 0; i < 4; i++)
  {
    height = height * 256 + readBinary[pos++];
  }
```

# pngファイルパスからTexture2Dを生成

以上を踏まえると pngファイルパスからpngファイルと同サイズのTexture2Dを生成するコードは以下のようになると思います.

``` ***.cs
public static Texture2D ReadPng(string path)
{
  byte[] readBinary = ReadPngFile(path);

  int pos = 16; // 16バイトから開始

  int width = 0;
  for (int i = 0; i < 4; i++)
  {
    width = width * 256 + readBinary[pos++];
  }

  int height = 0;
  for (int i = 0; i < 4; i++)
  {
    height = height * 256 + readBinary[pos++];
  }

  Texture2D texture = new Texture2D(width, height);
  texture.LoadImage(readBinary);

  return texture;
}
```

#参考
UnityでPNGファイルを動的に読み込む方法
http://macomu.sakura.ne.jp/blog/?p=55

PNGについて
http://homepage2.nifty.com/sophia0/png.html

PNG ファイルフォーマット
http://www.setsuki.com/hsp/ext/png.htm
Windows 7 > デバイスマネージャを開く > プログラムとファイルの検索 > dev + 下矢印3回 + Enter || [win]+[pause] > デバイスマネージャ

```txt:動作環境
Windows 7 pro 32bit
```

USB機器を接続したときなどにデバイスマネージャを開くことが多々ある。
最短での開き方はないものか。

以下をやっている

- スタートメニュー > プログラムとファイルの検索
- dev と入力
- リストから「デバイスマネージャ」を選択
  - 今の環境では4つめにでてくるので、下矢印3回 + Enter

4秒くらいかかる。

左手でdevと入力しながら右手で下矢印を入力すると多少速い。
DragonBoardにLinuxをインストールしてGPIOを動かすまで

# Linuxをインストール
サイトで配布されるディストリビューションは、UbuntuからDebianに変わったようです。

- DragonBoardのサイトで配布されているDebianインストールイメージをダウンロードする
   [DragonBoard™ 410c Downloads](http://www.96boards.org/products/ce/dragonboard410c/downloads/)

- micro SDカードに解凍したインストールイメージを書き込み(on Mac)
 MacにSDカードを挿して、アンマウント
 `sudo diskutil unmountDisk /dev/disk2`
 イメージをddコマンドで書き込み
 `sudo dd if=db410c_sd_install_debian.img of=/dev/disk2 bs=4m`

- micro SDをDragonBoardに挿す
- DragonBoardにキーボード/マウス/HDMIケーブルを挿す
- DragonBoard裏のDIPスイッチを0-1-0-0に変更する
- DragonBoardに電源を挿す
- 書き込みを待つ
- 書き込みが終わったらmicro SDを抜いて、DragonBoard裏のDIPスイッチを元に戻す(0-0-0-0)
- DragonBoard再起動

# Debian起動
起動してWifiを設定してみましたが、ぶちぶち切れて使い物になりませんでした。たまたま[USB有線LANアダプタ Logitec LAN-TXU2H3A](http://logitec.co.jp/products/lan/lantxu2h3a/index.php)があったので、これを挿して使います。これで安定してNetworkに接続できました。

# Debianパッケージを追加

- アップデート

```
sudo apt-get update
sudo apt-get upgrade
```

※updateのとき、Hash Sum mismatchと表示されてしまうことがあったので、[apt-get update 時にHash Sum mismatch エラーが出力される場合の対処](http://qiita.com/TsutomuNakamura/items/93e4a4ea0e587160fcaf)を参考にさせていただきました。

```
cd /var/lib/apt/
sudo mv lists lists.old
sudo apt-get clean
sudo apt-get autoclean
sudo apt-get update
```
- GPIOライブラリをコンパイルするためのtoolを追加

 `sudo apt-get install autoconf automake libtool`

# ライブラリのコンパイル
## libsoc

- [libsoc GitHubリポジトリ](https://github.com/jackmitch/libsoc)からクローンしてコンパイル

```
git clone https://github.com/jackmitch/libsoc.git
cd libsoc
./autogen.sh
./configure --enable-board="dragonboard410c"
make
sudo make install
```

## 96BoardsGPIO

- [96BoardsGPIO GitHubリポジトリ](https://github.com/96boards/96BoardsGPIO)からクローンしてコンパイル

```
git clone https://github.com/96boards/96BoardsGPIO.git
cd 96BoardsGPIO
./autogen.sh
./configure
make
sudo make install
sudo ldconfig
```

# LEDをつなぐ

DragonBoardのLow speed Expansion connectorにLEDと抵抗をつなぎます。
- PIN1がGND
- PIN23がGPIO-A

# 96BoardsGPIOのLチカサンプルを動かす
LEDが10回点滅します。

```
cd 96BoardsGPIO/examples
make
sudo ./blink
```
logstashでOracleのデータを取得する

#logstashでOracleのデータを取得する

logstash-input-jdbcのドキュメントには、MySQLの例でOracleの例がないので、その備忘録です。
大事な注意点を３つ書きます。

試した環境
 - logstash 2.2.1
 - Oracle12c
 - Windows7Pro　64bit
 - JDK8

#設定ファイル

完成品サンプル。

``` ruby
input {
  jdbc {
    jdbc_driver_library => "ojdbc7.jar"
    jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
    jdbc_connection_string => "jdbc:oracle:thin:@オラクルのホスト:1521/SID"
    jdbc_user => "接続ユーザ"
    jdbc_password => "パスワード"
    schedule => "*/15 * * * *"
    statement => "select * from hogehoge"
    last_run_metadata_path => "./barbar.dat"
    type => "piyopiyo"
  }
}
```

## 注意点１ JDBCドライバの配置場所

jdbc_driver_libraryとして、ojdbc7.jarと書いていますが、この場合は、**logstash/bin**　においてあることが前提です。

## 注意点２ JDBCドライバクラス名

JDBCドライバのクラス名として **oracle.jdbc.driver.OracleDriver**と書くとエラーになります。
Javaで慣れ親しんだ人ほど注意が必要。

こんなエラーに出くわします。

```
Error: oracle.jdbc.driver.OracleDriver not loaded. Are you sure you've included
the correct jdbc driver in :jdbc_driver_library?
```
![20160216.png](https://qiita-image-store.s3.amazonaws.com/0/111676/87e32b92-4a0b-3afe-7f22-a516464bba29.png)

configtestで確認しろよ、と出てきますが、configtestは何の問題もなく正常終了するので注意。

正しくは**Java::oracle.jdbc.driver.OracleDriver**と。
```
Java::oracle.jdbc.driver.OracleDriver
```

こう書くこと。　javaが小文字でもダメらしい。

参考）　[Logstash and Oracle – JDBC input settings] http://dbtricks.com/?p=308　


<引用>
Running the query with the ‘–configtest’ flag did not help much but eventually, it turned out to be a simple typo. The oracle driver was not loaded only because the call was
” java::oracle.jdbc.driver.OracleDriver ” instead of ” Java::oracle.jdbc.driver.OracleDriver “.
(this one was really annoying but I hope this will save you time I spent on it ).
</引用>

## 注意点３ statementはセミコロンなしで！

終端にセミコロンをつけると、エラーになるよ。**ORA-00933: SQLコマンドが正しく終了されていません。**

![20160216_1.png](https://qiita-image-store.s3.amazonaws.com/0/111676/7692c847-d755-57d8-2768-3a12605d77c5.png)

気をつけよう。
Vimで秀丸のように編集した行をマークする

![vim_quick.gif](https://qiita-image-store.s3.amazonaws.com/0/69305/4b66ed88-f88b-06f0-abcd-647d2a7de43d.gif)

Vimで秀丸の「編集した行の行番号」をマーク(強調表示)と同じことをしたいという、秀丸への未練が断ち切られない人()のニーズを満たすためのプラグインです。  
差分をdiffで検出するので、良くも悪くも内容の差のみを検出します。[^1]

## ■概要
*  [名無しのvim使い](http://nanasi.jp/)さんの [changed.vim : 最後に保存してから変更が加えられた行を表示する](http://nanasi.jp/articles/vim/changed_vim.html)で紹介されている[changed.vim](http://www.vim.org/scripts/script.php?script_id=2496)プラグインを使用します
* ちょこっとチューニングしています[^2]
* NeoBundleで導入します

## ■使用例
* 行修正したとき

	![vim_upd.gif](https://qiita-image-store.s3.amazonaws.com/0/69305/f37833b1-a326-101f-3b7c-3741ec81f8bb.gif)

* 行追加したとき

	![vim_add.gif](https://qiita-image-store.s3.amazonaws.com/0/69305/c67d26c4-ae60-9808-730c-a7670a781206.gif)


* 行削除したとき

	![vim_del.gif](https://qiita-image-store.s3.amazonaws.com/0/69305/2ffa7ad8-0340-32a3-b527-ec6a0957f396.gif)

## ■パフォーマンス
* p(ペースト)を連打しても。。。

	![vim_quick.gif](https://qiita-image-store.s3.amazonaws.com/0/69305/4b66ed88-f88b-06f0-abcd-647d2a7de43d.gif)


* 複数行をペーストしても。。。

	![vim_quick2.gif](https://qiita-image-store.s3.amazonaws.com/0/69305/b81a6614-7a10-d8bf-08bf-c1486bd9c903.gif)

そこそこに追従します。

## ■使い方

* .vimrcに一行追加します

```vim
NeoBundle 'leftouterjoin/changed'
```

---
[^1]: 例えば、:%s/abc/abc/gc で全置換するとバッファは'未保存'の状態になりますが、該当箇所はマークされないという意味です。
[^2]: リアルタイム性を求めて、autocmdでInsertLeave、TextChanged で処理しています。少し表示が重かったので描画処理を1から書き直しました。
Lubuntu上のEmacsでデフォルトブラウザをChromeに変更する

# 環境
- Lubuntu 14.04.3 LTS
- Emacs 24.5.1

# 設定
```sh:terminal
$ xdg-mime default google-chrome.desktop x-scheme-handler/http
$ xdg-mime default google-chrome.desktop x-scheme-handler/https
$ xdg-mime default google-chrome.desktop text/html
```

# 確認
```sh:terminal
$ xdg-mime query default x-scheme-handler/http
$ xdg-mime query default x-scheme-handler/https
$ xdg-mime query default text/html

$ xdg-open http://google.com
$ xdg-open https://google.com
$ xdg-open /tmp/test.html
```

```el:*scratch*
(browse-url-of-file "/tmp/index.html")
```
Live2D&GLSLで炎エフェクトを作った

GLSLシェーダーテクニック勉強会でLive2Dネタを喋ってきました。

　**[2/14 GPU の熱でチョコも溶けちゃう！？ GLSL シェーダテクニック勉強会](http://connpass.com/event/25758/)**

僕の発表内容はこちらです　→　[Live2D&GLSLエフェクト表現](http://slides.com/naotaro/live2d-glsl#/)
![006.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/114027a6-4ac2-cec4-4c32-968f7330d81f.gif)

登壇者の資料はこちらの[Togetterまとめ](http://togetter.com/li/938400)に上がっていますのでぜひ見てみて下さい。

個人的にはレイトレが凄く勉強になり、自分もやってみようと思いました。
僕が作ったものをgithubにアップしたので、参考にして頂けたらと思います。

[・Live2D＆炎エフェクトのソース](https://github.com/naotaro0123/Live2D-EyeFire)

[・Live2D＆ガウシアンブラーのソース](https://github.com/naotaro0123/Live2D-Blur0)

[・Live2D＆川瀬式ブラーのソース](https://github.com/naotaro0123/Live2D-Blur1)
PiZero > Communication protocol v0.12 > PiZero / ESP8266

This article is for my entry to Pi Zero contest 2016.
https://hackaday.io/project/9526-bring-your-own-pizero-byop


## format

- Terminating with `<LF>`
- 115200 8N1
  - 8 data bits
  - no parity
  - 1 stop bit

## user commands

- hello
  - command: `hello,[serial number],[name]<LF>`
  - return: `hello,[name]<LF>`
- check
  - command: `check<LF>`
  - return: `check,[number of messages]<LF>`
- get
  - command: `get<LF>`
  - return: `get,[SenderName],[1st message string],[isSecret(0|1)],[postDate]<LF>`
  - <font color=red>memo: `get command` takes 2000 msec wait to show the sender on 8x2 LCD before showing the message</font>
- post
  - command: `post,[receiver],[message],[isScret(0|1)],[postDate]<LF>`
  - return: `post,ok<LF>`
  - lcdmsg: `msg,posted`
- bye
  - command: `bye<LF>`
  - return: `bye,[name]<LF>`

For the public message(isSecret==false), the message length for the post is maximum 16 (= 8x2).
For the private message(isSecret==true), the message length can have any length, because the message will not be displayed on the 8x2 LCD, but will be sent through UART.

## administrator commands

- storage
  - command: `storage<LF>`
  - return: `storage,[current usage count]/[maximum storage],<LF>`
  - e.g. `storage,8/200`
CentOS 6.xでrbenvを設置する。


## 環境

vagrant上のCentOS 6.7

## 設置

### githubからチェックアウトする。

```sh
  git clone https://github.com/rbenv/rbenv.git ~/.rbenv
```

### 環境変数を追加する。

```sh
  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
```

### 初期化する。

```sh
  . ~/.bash_profile
  # rbenvコマンドを確認
  which rbenv
  # 初期化
  rbenv init
```

### アップグレード

* 最新バージョンの場合

```sh
  cd ~/.rbenv
  git pull
```

* 特定バージョンの場合

```sh
  cd ~/.rbenv
  git fetch
  git checkout v0.9.0
```

### ruby-buildをチェックアウトする。

* rubyを設置するために必要
* rbenvのpluginとstandaloneで設置できるが、rbenvのpluginとして設置することを推奨する。
* アップグレードするときはrbenvと同じく設置されたディレクトリへ移動してgit pullする。

```sh
  git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## 参考

* https://github.com/rbenv/rbenv#basic-github-checkout
* https://github.com/rbenv/ruby-build#readme
Homebrewでrbenvを設置する。


## 環境

Mac OS X El Capitan

## rbenvの設置情報を確認する。

* homebrewのいいところは設置情報がわかりやすいということだ。
* 依存性ライブラリとしてruby-buildを設置することを進めている。
* 設置オプションとして--without-ruby-buildが表示されているからデフォルトではrbenvを設置するだけで一緒に設置される。
* homebrewの直下で管理したい場合は、profileに「export RBENV_ROOT=/usr/local/var/rbenv」を追加する。
* rbenv initを実行する。これで終わり。

```sh
% brew info rbenv
rbenv: stable 1.0.0 (bottled), HEAD
Ruby version manager
https://github.com/rbenv/rbenv#readme
/usr/local/Cellar/rbenv/0.4.0 (31 files, 48.4K)
  Built from source
/usr/local/Cellar/rbenv/1.0.0 (35 files, 60K) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/rbenv.rb
==> Dependencies
Recommended: ruby-build ✔
==> Options
--without-ruby-build
  Build without ruby-build support
--HEAD
  Install HEAD version
==> Caveats
Rbenv stores data under ~/.rbenv by default. If you absolutely need to
store everything under Homebrew's prefix, include this in your profile:
  export RBENV_ROOT=/usr/local/var/rbenv

To enable shims and autocompletion, run this and follow the instructions:
  rbenv init
```

## 手順

### brewでrbenvを設置

```sh
% brew update
% brew install rbenv
```

### 環境変数

* zshを使っている場合~/.zprofileに書く。

```sh
export RBENV_ROOT=/usr/local/var/rbenv
eval "$(rbenv init - zsh)"
```

* .zshenvとかに書くとダメだった。rbenvで管理されるrubyではなくシステム側のrubyがずっと使われていた。
* そのときのPATHをみるとshimsディレクトリが除外されている。（原因はまだわからない。後で調べてみる。）
* /usr/binディレクトリよりshimsディレクトリが先に位置しなければならない。

```sh
# 正しい
echo $PATH
/usr/local/bin:/usr/local/var/rbenv/shims:/usr/bin: ... snip ...

# 正しくない
echo $PATH
/usr/local/bin:/usr/bin: ... snip ...
```

* bashを使っている場合は~/.bash_profileとかにshims pathを書けばいいだろう。
* rbenvコマンドが存在すればrbenv init -を実行しなさいという意味。

```sh
export RBENV_ROOT=/usr/local/var/rbenv
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```

### rbenv初期化

```sh
% . ~/.zprofile
# rbenvコマンドを確認
% which rbenv
# 初期化
% rbenv init
# 直下に関連ディレクトリやファイルが生成されていることを確認
% cd /usr/local/var/rbenv
```

### rubyを設置

* 設置されているrubyバージョンを確認する。

```sh
% rbenv versions
```

* rubyを設置する場合は先にrbenvから提供されるrubyバージョンを確認する。

```sh
% rbenv install -l
```

* ruby 2.3.0を設置する場合

```sh
% rbenv install 2.3.0
```

## 参考
* https://github.com/rbenv/rbenv#homebrew-on-mac-os-x
ajaxで取得したjsonをlodash製テンプレートに突っ込む

#仕様
jsonの情報をテンプレートに突っ込んで、回数分DOMを生成したい。

#HTML
データ属性を付けた\<div>内にloading.gifを入れておく。
入れとかなくても問題は無い。でもクルクルしてた方が格好いいと思う。

```html:htnl
<div data-target-list="list">
	<img src="img/loading.gif">
</div>
```
#JSON

```json:JSON
[
  {
    "title": "kuma",
    "url": "http://kuma.com",
    "img": "kuma.png",
  },
  {
    "title": "tama",
    "url": "http://tama.com",
    "img": "tama.png",
  },
  {
    "title": "kiso",
    "url": "http://kiso.com",
    "img": "kiso.png",
  },
]
```

#JS
1. ajaxでjsonを取得。
2. ajaxはdeferredオブジェクトを持っているので、宣言なしで.doneできる。
3. lodashの_.templateでテンプレートを変数に格納。
4. loading.gifを隠す。
5. forで回して、テンプレートにjsonの情報を突っ込みつつ、DOM描画。

という流れ。

```js:javascript
var list = function(){
	var $target = $('[data-target-list]');
	$.ajax({
		type: 'get',
		url: 'data/list.json',
		dataType: 'json'
	})
	.done(function(data){
		var temp = _.template(
			'<div class="primaryBox">' +
				'<a href="<%= url %>">' +
					'<%= title %>' +
				'</a>' +
				'<img src="<%= img %>">' +
			'</div>'
		);
		$('.loading').css('display','none');
		for (var i=0; i < data.length; i++){
			$target.append(temp(data[i]));
		}
	});
};
$(function(){
	list();
});
```
Excelで、行の高さを自動でいい感じにする

Excelの行高さの自動調整についてです。

Excelシートの一番左の行番号のところをダブルクリックすると
その行の高さを自動で調整してくれますが、

大体の場合「ギュッと縦に詰まりすぎ」になります。
見づらいです。

そこで、「自動調整＋余白の高さ」に自動調整するマクロを書きました。
ショートカットに登録すると快適です。

 
    Sub NiceRowheight()
    '余白設定
    Const buf = 10
    Application.ScreenUpdating = False
    'とりあえず選択範囲の行高さをAutoFitする
    Selection.Rows.AutoFit
    
    '選択範囲が広すぎる時のために、データ最終行を獲得しておく
    maxrow = Range("A1").SpecialCells(xlLastCell).Row
    
    'その後、微妙に行高さを広げる。（１列目のみ処理）
    For Each hoge In Selection.Columns(1).Cells
        hoge.RowHeight = hoge.RowHeight + buf
        
        '経過観察＆終了判定
        i = i + 1
        If i Mod 2000 = 0 Then
            '終了判定（データの最終行を越えてたら終了する。）
            If hoge.Row > maxrow Then Exit For
            Application.StatusBar = i
            DoEvents
        End If
    Next
    
    Application.StatusBar = False
    Application.ScreenUpdating = True
    End Sub
Michael Abrash Interview 12

http://qiita.com/7of9/items/06e8ad04ceb3f3db6e1f
の続き
Michael Abrash Interview:
https://www.youtube.com/watch?v=a7My8zbDNRI&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=2)

(5:26-)
And so, that experience being able to jump in <font color=red>XXX</font> play with other people and jump out the servers, just couldn't be existent. You have to <font color=blue>make the hardware exist</font>. They have certain things.

(5:36-)
The way, I work at Valve is, if you think something that is really valuable things to do, you should go and do it and see if other people do it with you. That's what I did in virtual reality.

(5:46-)
And it wasn't going, it was my previous job, wasn't convincing my manager up to <font color=red>chain (?)</font> that's something worth doing, wasn't having someone tell me what was worth doing was, <font color=red>me(?)</font> thinking about doing experiments. 

(5:59-)
Say, let's try this, <font color=blue>seeing other people thought make sense</font>, <font color=blue>having down there road</font>. So, it really is very organic process. We wish huge amount of individual responsibility.


赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

having down there road
の意味が気になる。


Michael Abrash Interviewのリスニングは以上で終わり。

所要時間は、12回 x 5分, give or take a few minutes だった。

Kaku michioの動画(42分)だと同じペースでだいたい100回。
https://www.youtube.com/watch?v=0NbBjNiw4tk
しかしこの動画は発音がよすぎるので、リスニングの訓練には不向きかもしれない。

やはり、5分くらいのものがいいようだ。
vpsにssh接続してansibleのpingを通すまで

VPSは[Conoha](https://www.conoha.jp/)を使いました。
サーバーOS [CentOS Linux release 7.2.1511 (Core)]
手元のPCはmacです。

macは`$`
サーバーは`#`
で表示わけしていきます。

## ssh鍵認証の設定
.sshディレクトリに移動して、
`$ cd ~/.ssh`
ssh鍵を生成。
`$ ssh-keygen -t rsa`

```text:
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):#名前を変えないならenter
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

[passphraseについて](http://freak-da.hatenablog.com/entry/20100901/p1)

これでid_rsaとid_rsa.pubが生成できました。
id_rsaをmacに登録して、id_rsa.pubをサーバーの方に登録します。
次にconfigファイルを編集。
`$ vi config`

```text:~/.ssh/config
host (サーバーのホスト名)
  HostName (サーバーのIPアドレス)
  User (ログインするユーザー名)
  IdentityFile (生成した秘密鍵のパス)　ここでは (~/.ssh/id_rsa)
```

続いて`/private/etc/hosts`も編集します。

`$ vi /private/etc/hosts`

```text:/private/etc/hosts
(サーバーのIPアドレス) (サーバーのホスト名) #これを追記する
```

でmac側の設定は大丈夫です。


次にサーバーの設定をしていきます。
最初はsshでユーザー名などを指定してサーバーに入ります。

```
$ ssh -l (ユーザー名) (サーバのIPアドレス)
(ユーザー名)@(サーバーのIPアドレス)'s password:
```

入ったら、公開鍵を登録します。

`# cd /root/.ssh`

に移動して、

`# vi authorized_keys`

authorized_keysを開いて,id_rsa.pubの中身をコピーします。

パーミッションの確認をします。
自分の環境では適切になっていました。

[SSH で Permission Denied となる傾向と対策](http://qiita.com/youcune/items/2f427979403771f2e03ahttp://qiita.com/youcune/items/2f427979403771f2e03a)

つぎは`/etc/ssh/sshd_config`の設定を変えます。

[/etc/ssh/sshd_configについて](http://easyramble.com/deny-root-login.html)

`# vi /etc/ssh/sshd_config`

で開いて、

```/etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
```

上記の3箇所のコメントアウトを解除すればよさそうです。
最後にsshサービスの再起動をすれば設定完了です。
`# service sshd restart`

以下のコマンドでサーバーに入れたら成功です。
`$ ssh (サーバーのホスト名)`

## ansibleのpingを通す

`$ brew install ansible`

でansibleをインストールします。

現在のカレントディレクトリをfooとします。
`$ pwd ~/foo`

ansibleのpingモジュールを使って疎通の確認をします。

```
$ ansible (サーバーのホスト名) -m ping
[WARNING]: provided hosts list is empty, only localhost is available
```

エラーで調べてみると[ansible-tutorial](http://yteraoka.github.io/ansible-tutorial/)を見つけました。ここを見ながらやるとよさそうです。

どうやらデフォルトの場所に(/etc/ansible/hosts)と(/etc/ansible/ansible.cfg)が無いようです。

カレントディレクトリでも良いそうなので作ります。

`$ touch hosts ansible.cfg`

でファイルを作って、`ansible.cfg`の方はgithubにあるものの内容をコピーします。
[ansible.cfg](https://github.com/ansible/ansible/blob/devel/examples/ansible.cfg)

`$ vi hosts`

```text:~/foo/hosts
(サーバーのホスト名) # これを追記
```

`$ vi ansible.cfg`

```text:~/foo/ansible.cfg
#inventory      = /etc/ansible/hosts
↓ #以下に書き換える
inventory = hosts
```

編集し終わったら、再度pingを試す。

```
 $ ansible (サーバーのホスト名) -m ping
(サーバーのホスト名) | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

上記のようになれば成功です。
Railsで同じパスでログイン状態に応じて別の画面を表示する賢い方法

ほとんどこの記事の要約です。

User-centric Routing in Rails 3 // Collective Idea | Crafting web and mobile software based in Holland, Michigan
http://collectiveidea.com/blog/archives/2011/05/31/user-centric-routing-in-rails-3/

例えばアプリケーションのルート(e.g. `http://example.com`) で、ログイン時はマイページ、非ログイン時はランディングページを表示したい。そういう時はどうすればいいでしょうか。

ビュー内で分岐、コントローラーでビューを出し分ける、同じパスで出すことを諦める、などの解決策がありますが、もうちょっと賢い方法がありました。

Railsでは、特定の条件を満たした時のみルーティングを行う、ということができます。`id`が期待される部分は数字のみ、というように正規表現を使ったりする場合がよくあるパターンだと思いますが、これ、実は`#matches?`というメソッドを実装したクラスを渡すことで制限をかけることもできます。この機能を使って、`/`にアクセスした時、`current_user`のセッションがある時は`MyPageController#index`、ない時は`LandingPageController#index`にルーティングする、ということが可能です。

渡されたクラスは[`request`](http://api.rubyonrails.org/classes/ActionDispatch/Request.html)オブジェクトと共にインスタンス化されるので、`matches?`メソッドの中で`session`を触ることもできます[^request]。

[^request]: `#session`メソッドは`Rack::Request`に実装されていて、`ActionDispatch::Request`は`Rack::Request`を継承している

実装例は下記の通りです。

config/routes.rb

```rb
Rails.application.routes.draw do
  # 前略
  
  # セッションがない時
  # Rails 4では`as` を使って別名を当てる必要があります。Rails 3では不要かも（試してません）
  root 'public#index', as: :public_root, constraints: LoggedInConstraint.new(false)
  # セッションがある時
  root 'home#index', constraints: LoggedInConstraint.new(true)
  
  # 後略
end
```

条件判定用のオブジェクトは何でもいいのですが、[Structのメンバー名を指定してサブクラスを作る機能](http://docs.ruby-lang.org/ja/2.3.0/method/Struct/s/=5b=5d.html)を使って実装されていました。これ便利。

app/constraints/logged_in_constraint.rb[^constraint]

[^constraint]: 場所は別に`/app/constraints`でなくても大丈夫です。

```rb
class LoggedInConstraint < Struct.new(:value)
  def matches?(request)
    request.session.key?('current_user_id') == value
  end
end
```

追記:
こっちのほうが簡単だった！
http://qiita.com/sue738/items/976c8abf4aa8e530899f

参考URL

- Rails Routing from the Outside In — Ruby on Rails Guides http://guides.rubyonrails.org/routing.html#advanced-constraints
- User-centric Routing in Rails 3 // Collective Idea | Crafting web and mobile software based in Holland, Michigan
http://collectiveidea.com/blog/archives/2011/05/31/user-centric-routing-in-rails-3/
Zabbix 項目数の多いグラフが表示されない場合

Zabbixのアドホックグラフ、またはカスタムグラフで項目数が非常に多いグラフが表示されない場合があります。（アイテムの収集間隔にも因りますが、デフォルトのままでは1グラフ内に25～30項目ぐらいが限界）

スイッチのポート別トラフィック量のアイテムを1グラフで表示したい時とか困るのですが、そのような場合は以下の変更を行うことで表示できるようになります。（リソース負荷が増えるので環境に合わせて調整が必要です）

# PHP
## PHPメモリ上限の変更

```/etc/httpd/conf.d/zabbix.conf
<Directory "/usr/share/zabbix">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all

    php_value max_execution_time 300
    php_value memory_limit 512M　←★（デフォルト：256M）
    php_value post_max_size 16M
    php_value upload_max_filesize 2M
    php_value max_input_time 300
    php_value date.timezone Asia/Tokyo
</Directory>
```
* ★の部分を変更したらApache再起動

**注意：/etc/php.ini よりも上記設定のほうが優先されます。**

## 設定値確認

下記ファイルを作って、ブラウザでアクセス

```/usr/share/zabbix/info.php 
<?php phpinfo(); ?>
```
* memory_limitのLocal Value欄を確認

# Apache

## URL長制限の変更
```/etc/httpd/conf/http.conf
最後の行に追記
LimitRequestLine 15000　（デフォルト：8190）
```
* 変更したらApache再起動


上記のように設定した場合、1グラフ内に100項目程度まで表示ができることを確認できました。
angular-fullstackのモーダルを使ってみる

最近AngularJSってのを勉強中。Yeomanってのでangular-fullstackをセットアップすると何やらベストプラクティスっぽい雛形ができて便利らしい。それのクライアントサイドのコンポーネントにモーダルダイアログのサンプルがあるけど使っていないっぽい。

モーダルのサンプルは何かのリソースを削除するときの確認ダイアログなので、ユーザー削除時に確認ダイアログを出してみよう。

# 準備
angular-fullstackをセットアップするところまでは、いろいろ他の人が書いているのでここでは書きません。例えば[ここ](http://blog.chat.ac/yeoman%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6meanmongodbexpressangularjsnode-js%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%82%88%E3%81%86/)とか。

選択した項目は次のとおりです。
> Babel, HTML, Less, uiRouter, Bootstrap Y, UI Bootstrap Y, Mongoose, authentication boilerplate Y, Google/Facebook/Twitter, socket.io N, Grunt, Jasmine

# 変更点
変更するファイルは `/client/app/admin/admin.controller.js` です。

変更前

```js:/client/app/admin/admin.controller.js
'use strict';

(function() {

class AdminController {
  constructor(User) {
    // Use the User $resource to fetch all users
    this.users = User.query();
  }

  delete(user) {
    user.$remove();
    this.users.splice(this.users.indexOf(user), 1);
  }
}

angular.module('sampleApp.admin')
  .controller('AdminController', AdminController);

})();
```

変更後

```js:/client/app/admin/admin.controller.js
'use strict';

(function() {

class AdminController {
  constructor(User, Modal) {
    // Use the User $resource to fetch all users
    this.users = User.query();
    this.modal = Modal;
  }

  delete(user) {
  	var deleteConfirmationModal = this.modal.confirm.delete((user) => {
	    user.$remove();
    	this.users.splice(this.users.indexOf(user), 1);
  	});

  	deleteConfirmationModal(user.name, user);
  }
}

angular.module('sampleApp.admin')
  .controller('AdminController', AdminController);

})();
```

よくわかんないけど、これでいいのかな？

# 結果
![スクリーンショット 2016-02-16 12.07.59.png](https://qiita-image-store.s3.amazonaws.com/0/61150/7e268d93-0348-f557-23f0-29e014eb8897.png)

できた :smiley:

ではまたね。