OmniAICreator/Qiita-1.07M huggingface dataset:
MacでRe:VIEW文書にブロック図を埋め込む(blockdiag)


Re:Viewは文書中に各種外部ツールを使ってグラフを埋め込む事ができますが、その一つとしてblockdiagをサポートしています。

![スクリーンショット 2016-03-03 14.58.02.png](https://qiita-image-store.s3.amazonaws.com/0/31824/39a43a67-e8ec-0f06-87e9-2dabf542240f.png "スクリーンショット 2016-03-03 14.58.02.png")

埋め込み画像を事前に生成し、リンクを埋め込む方法でも良いですが、文書作成時に埋め込む方が何かと便利なため以下Re:View文書に組み込むための覚書です。

## 参考サイト

[ブロック図生成ツール blockdiag — blockdiag 1.0 ドキュメント](http://blockdiag.com/ja/index.html)


[ブロック図生成ツール blockdiagを導入してみました - Qiita](http://qiita.com/mitzi2funk/items/0a9e84ee1cf4b241524b)

## 必須パッケージ

Re:Viewでblockdiag画像を生成するには、事前にblockdiag自体をインストールしておく必要があります(内部でblockdiagを直接コマンドで読んで画像（orPDF)を生成し、それを組み込むような動作をしています）。

blockdiagはpythonの`pip`もしくは`easy_install`を使ってすぐにインストールします。

```
pip install blockdiag
# blockdiagでpdfを出力するために必要
```

※ WindowsやLinux等の導入手順は、公式を参照して下さい

[blockdiag の概要 — blockdiag 1.0 ドキュメント](http://blockdiag.com/ja/blockdiag/introduction.html)

### ERROR: unknown format: PDF

Re:Viewの出力フォーマットがPDFの場合、このままではエラーメッセージが出力されます。PDF出力をする場合はreportlabも合わせてインストールする必要があります。

```
pip install reportlab
```

## Re:View文書の書き方

文書中にgraphブロック形式で以下のように記述するだけです。

```
//graph[graph_name][blockdiag]{
  diagram {
    blockdiag {
      A -> B -> C -> D;
      A -> E -> F -> G;
    }
  }
}
```

後は`review_pdfmaker`などで文書を生成すると、該当箇所に以下のようなブロック図が追加されているはずです。

![スクリーンショット 2016-03-03 15.03.42.png](https://qiita-image-store.s3.amazonaws.com/0/31824/1c166202-08af-7fa3-c063-7ed42d811355.png "スクリーンショット 2016-03-03 15.03.42.png")


### 日本語フォントの埋め込み

日本語はデフォルトのままだと文字化けします。
blockdiagは任意のフォントを埋め込む機能を持っているため、`$HOME/.blockdiagrc` を以下を参考に作成して下さい。

```
# フォントの場所は任意です
$ cat $HOME/.blockdiagrc
[blockdiag]
fontpath = /Users/user/Library/fonts/Ricty-Regular.ttf
```

そして日本語を記述したブロック図を文書に記述して生成してみます

```diag
//graph[graph_name][blockdiag]{
  diagram {
     // Set M17N text using label property.
     A [label = "起"];
     B [label = "承"];
     C [label = "転"];
     D [label = "結"];

     A -> B -> C -> D;

     // Use M17N text directly (need to quote).
     春 -> 夏 -> 秋 -> 冬;

     // Use M17N text including symbol characters (need to quote).
     "春は 曙" -> "夏 = 夜" -> "秋.夕暮れ" -> "冬 & つとめて";
  }
}

```

## 完成

![スクリーンショット 2016-03-03 14.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/31824/0ec5451e-1256-f1a5-9c4b-e770dda64f54.png "スクリーンショット 2016-03-03 14.44.16.png")

## 感想

Re:Viewはこれ以外にも、「graphviz」「gnuplot」「aafigure」をサポートしています。

https://github.com/kmuto/review/blob/master/doc/format.ja.md#グラフ表現ツールを使った図

同様にblockdiagになっているところを書き換えるだけで、簡単にグラフ図を文書に埋め込みできるので非常に便利です。

UMLを埋め込みたいのでPlantUMLを使って…と思ってreviewのbuilder.rbを弄ってましたので、余裕ができたらぷるり送ってみよう…
静的コンテンツだけで国際化したい

某CMSパッケージは [Content-Negotiation](https://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html) に対応していなくて、単なる変数置き換えくらいしかできないテンプレートエンジンしか持っていないっぽい。
だけどユーザさんが「英語ユーザには英語で、日本語ユーザには日本語で表示したい」と要望していて、
……「しかたないから英語/日本語併記にするかー」とかいう、ちょーやばいソリューションが採用されそうなので、
ちょっとだけ考えてみた。


q とかはまだ対応してない。
ja-JP とかはまだ対応してない。

テストするには http://qiita.com/zerobase/items/88f741141249bc020a9b が便利

## ソース
```html
<html lang="en">
<head>
<style>
.ja:lang(ja) { display: inherit;}
.en:lang(ja) {display: none;}
.ja {display: none;}
.en {display: inherit;}
</style>
<script>
!function(n) {
 window.document.getElementsByTagName("html")[0].lang = 
  (n && (n.languages || [n.language || n.userLanguage]) || ["en" /* sentinel */])[0].substr(0,2)
}(window.navigator);
// 参考: https://github.com/leighmcculloch/acceptedlanguages.js/blob/master/src/acceptedlanguages-user.js
</script>
</head>
<body>
<h1><span class="en">English</span><span class="ja">日本語</span></h1>
</body>
</html>
```

## 実行結果

Webブラウザの言語設定に

* 最初に「日本語」が設定されている場合は ```日本語``` と
* それ以外が設定されている場合は ```English``` と

表示される。はず。
Angular2 リクエスト/ページ遷移時の Loading実装

Angular2を利用した開発を始め早３ヶ月。

速度感もそれなりで別に致命的な欠陥も特に見当たらずに来たのだけど、ルーティングをクライアントに任せる挙動に関して首を傾げることも多かった

例えば
画面遷移時に少なからず、
 - 必要なCSS, JSの読み込み
 - 画面描写処理
等がコンマ数秒のうちに行われるわけであるが、この間に何も描写されない時間が発生する。

しかもこのとき、ブラウザがデータをロードする必要が無いため全体的に完全に停止した様な状態になってしまう。

コンマ数秒なら良しとして、クライアント端末がヘビーな状態になっていた場合が問題である。

普通のWEBのサイトの場合クライアントが重かろうとテキストくらいは表示されるだろう
アニメーションを多用していようとアニメーションが止まる程度で済むだろう

Angularの場合「何も見えない」
loading中なのかすら判定できない

この仕組み自体はしかたがないので、せめてloading中にloading iconを表示させてやろうと言うのが今回の趣旨である。


このとき、
1. 同ページ内で DerectiveのLoading
2. 画面遷移によるComponentのLoading
どっちをくるくる回すかで処理をかえる必要がある（っぽい）

#1. 同ページ内で DerectiveのLoading

こっちならDerectiveに関数を渡してやって　EventEmitterで拾って、Oinitとか、AtferViewInitとか、APIリクエストのCompletionコールバックとか、適当なところで親にloading開始と完了を伝えてやる。


```ts:my_component.ts
export class MyComponent {
  private  _derectiveLoading = false;
  startLoadingNewDerective() {
    this._derectiveLoading = true;
    // 子ディレクティブの追加とか
    // directiveの初期化が発生する処理
    // this.mydirective = new Obj();

  }

  derectiveStartLoading() {
    this._derectiveLoading = true;
  }

  derectiveEndLoading() {
    this._derectiveLoading = false;
  }
}
```


```ts:my_component.html
<my_derective
  (startLoading)="derectiveStartLoading()"
  (endLoading)="derectiveEndLoading()"
></my_derective>
```

```ts:my_derective.ts
export class MyDerective OnInit, AfterViewInit {
  public courses: Course[] = []
  @Output() startLoading = new EventEmitter();
  @Output() endLoading = new EventEmitter();

ngAfterViewInit(){
  // this.startLoading.emit('event');
  this.endLoading.emit('event');
}
```


※componentの初期化前に親Componentで ```loading=true``` にしてやることも重要
Oninit ~ AfterViewInitまで処理してからloadingの書き換えが行われるので仕方ない。
ちなみに OninitとAtferViewInitの途中でloadingの値を変えると怒られる。描写に必要な変数がちょろちょろかわてると困るんだろう。


#2. 画面遷移によるComponentのLoading

こっちが問題。面倒だった。
画面遷移の場合、RouterOutlet というやつを使って依存関係が整理されている。

router-outlet タグを書いておくと urlの値から設定されたComponentをもってきてselector をrouter-outletの真下に置く

ぱっとみは router-outlet = 万能Selectorみたいな感じだけどそうじゃない

例えば下記のようなことはできない

```ts
<router-outlet
  (startLoading)="derectiveStartLoading()"
  (endLoading)="derectiveEndLoading()"
></router-outlet>
```


遷移後のComponentで変数を拾えない。ではどうやって変数を共有すればよいのか。


...ベストプラクティスとか見つからねぇｗ
そんなわけで安直に Service を使おう！

``` ts:loading.service.ts
import {Injectable} from 'angular2/core';

@Injectable()
export class LoadingService {

  constructor() { }

  startLoading(){
    setTimeout(()=>this.updateStatus(true), 0);
  }

  endLoading(){
    setTimeout(()=>this.updateStatus(false), 0);
  }

  updateStatus(status){
    if(loadingStatus !== status){
      loadingStatus = status
    }
  }

  isLoading(): boolean {
    return loadingStatus;
  }

}

var loadingStatus: boolean;
```

グローバル変数を操作することで、サービス呼び出し側で共通の変数を操作できる

また、見た目scopeがないのでグローバル変数と呼んでみたが、ファイルごとか何かでscopeがかかってるようにも見える。
 # TODO:真偽調査

スコープがかかってないようだったらシングルトンっぽく実装してもいいかも


そのうち元気が出たら動くサンプルコードを挙げてみたい
Webページのリダイレクト設定

よく忘れるので備忘録として。
（内容はあくまで主観的なものです）

# Apacheのconfファイルを使用する場合
用途：サーバー丸ごと移転など、根本からリダイレクトさせたい場合などに使用することが多い。

/etc/httpd/conf.d/ 配下にファイルを置く。
ファイル名はドメイン名にするケースが多い。

```lang:hogehoge.com.conf
<VirtualHost *:80>
    ServerAdmin system@hogehoge.com
    ServerName hogehoge.com
    ServerAlias www.hogehoge.com
    DocumentRoot /var/www/html/

    // これ↓
    RedirectMatch 301 .* http://www.hogehoge.jp/
</VirtualHost>
```

# .htaccessを使用する場合
用途：同サーバー内に複数サービスがあって一部だけ移転するなど、割りと細かくリダイレクト設定したい場合に使用する。

DocumentRoot(例:/var/www/html/)など設定したいディレクトリ配下に配置。

## ディレクトリ配下を全部転送
```lang:.htaccess
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)$ http://www.hogehoge.jp/ [R=301,L]

# RewriteRule ^(.*)$ http://転送先URL [R=301,L]
# 最終行の改行は忘れちゃダメ

```

## ディレクトリ配下を一部を除き転送(管理画面だけ有効とか)
```lang:.htaccess
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/admin/)
RewriteRule ^(.*)$ http://www.hogehoge.jp/ [R=301,L]

# RewriteCond %{REQUEST_URI} !(^/除外ディレクトリ名/)
# RewriteRule ^(.*)$ 転送先URL [R=301,L]
# 上記は「admin」フォルダ以外をhttp://www.hogehoge.jp/へ転送する設定
# 最終行の改行は忘れちゃダメ

```
ESP-WROOM-02 Arduino互換ボードのGPIOはこうやって使う

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

※欲しくなるポイントをこちらの記事「[ついにESP-WROOM-02のArduino互換ボードが発売！ 欲しくなるポイントまとめ](http://qiita.com/umi_kappa/items/8b7fe76812c197fd2ac6)」にてまとめました。ほしい！ :metal: 

# Arduino互換ボードのGPIOの配置図
Arduino IDEでスケッチを書いてる際に、`pinMode()`でピンのモードを指定したり`digitalRead()`で入力値を読み取ったりします。そのときの**ピン番号はESP-WROOM-02側のGPIOの番号を使います。**互換ボードの外側にある`D0`のArduino表記では動きません。`IO0`であれば`pinMode(0, OUTPUT)`になります。

## ESP-WROOM-02のピン対応図
以下の対応図は記事「[ESP-WROOM-02を使ってみる](http://eleclog.quitsq.com/2015/08/esp-wroom-02.html)」からいただきました。ありがとうございます :clap: 
![ESP-WROOM-02のピン対応表](https://qiita-image-store.s3.amazonaws.com/0/55103/56eec04e-f231-8f4f-d792-840d36d791d7.png)

## 互換ボード上のピン配置図
[Arduino Uno](https://www.arduino.cc/en/Main/ArduinoBoardUno)とは配置が異なるため、IO14などのように重複しているピンもあります。ボードに搭載されているLEDはデジタル14番ピンに割り当てられています。

![互換ボード上のピン配置図](https://qiita-image-store.s3.amazonaws.com/0/55103/95ccae6b-1f99-1cce-728e-c25352a0910a.jpeg)


# GPIO早見表
各ピンで使える値の早見表です。IO1は`pinMode()`で入出力の設定をしようとするとスケッチがクラッシュしました。IO0,2,15は起動時やプログラミング時に使用しているらしく、必要に迫られないのであれば使用しないほうがいいでしょう :pear:
(動作は確認できたので表に加えています。)

| GPIO | Digital Input | Digital Output | Analog Input | Analog Output(PWM) |
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| IO0 | × | ◯ | × | ◯ |
| IO1 | × | × | × | × |
| IO2 | × | ◯ | × | ◯ |
| IO4 | × | ◯ | × | ◯ |
| IO5 | × | ◯ | × | ◯ |
| IO12 | ◯ | ◯ | × | ◯ |
| IO13 | ◯ | ◯ | × | ◯ |
| IO14 | ◯ | ◯ | × | ◯ |
| IO15 | ◯ ※1 | ◯ | × | ◯ |
| IO16 | ◯ ※2 | ◯ | × | ◯ |
| A0 | × | × | ◯ | × |

※1：スケッチを書き込むときに配線していると書き込めませんでした。一度線を抜いてスケッチを書き込み後に再び挿すと動作しました。
※2：用途によってはうまく読み取ってくれないようです(温湿度センサー：DHT11は動作せず)。

# Digital Input
デジタル値の入力に使えるピンです。ボタンのON/OFFなどを取得したいときなどに使います。
**IO12,13,14,15,16で使えます。**
(IO0,2,4,5では使えませんでしたなぜでしょう、、)

# Digital Output
デジタル値の出力に使えるピンです。Lチカさせたりするときに使います。
**IO0,2,4,5,12,13,14,15,16で使えます。**

# Analog Input
アナログ値の入力に使えるピンです。センサーの値を取得したいときなどに使います。
**少ないですが、A0のみで使えます。**

# Analog Output(PWM)
アナログ値の出力に使えるピンです。モーターのスピードやLEDの明るさなどを調整したい時などに使います。
**デジタル出力と同じく、IO0,2,4,5,12,13,14,15,16で使えます。**

# 正確な情報求む！
完全に電子回路を理解できていないため、この記事の情報の精度に少々不安があります。**もし不正確な情報がありましたら、コメント等で指摘していただけると嬉しいです** :bow: 

# 参考リンク
- [ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
- [Reference : ESP8266 Arduino Core](http://esp8266.github.io/Arduino/versions/2.0.0/doc/reference.html)
- [ESP-WROOM-02を使ってみる](http://eleclog.quitsq.com/2015/08/esp-wroom-02.html)

# ESP-WROOM-02 Arduino互換ボード記事一覧
- [ついにESP-WROOM-02のArduino互換ボードが発売！ 欲しくなるポイントまとめ](http://qiita.com/umi_kappa/items/8b7fe76812c197fd2ac6)
- GPIOはこうやって使う
- [サクッとHTTP通信できたよ](http://qiita.com/umi_kappa/items/c3c929c6f42c5bdf3143)
シーンのアセットバンドルをロード（ライトあり）


# ■ライトを作る

　・Unityエディタ起動状態

　Window⇒Lighting⇒Sceneタブ
　⇒Skyboxに自分たちのSkyboxをセット⇒Buildをクリック
　⇒**現在開いているシーンファイルと同じ階層**にシーン名のフォルダができる
　⇒フォルダ内に**LightingData**と**reflectionProbe-0**が作られる。

# ■アセットバンドルを作る

　・シーンファイルにアセットバンドル名を付ける。
　　**注意点：シーンファイルの親フォルダにはアセットバンドル名をつけることはできない。**

　・**LightingData**と**reflectionProbe-0**が入っているフォルダか
　　**reflectionProbe-0ファイル**にアセットバンドル名をつける。

　・アセットバンドル出力

```
    BuildPipeline.BuildAssetBundles(出力パス, 出力オプション, プラットフォーム);
```



# ■アセットバンドルをロード
　・動作確認のため別プロジェクトを作る
　・別プロジェクトにStreamingAssetsフォルダを作る（ロード用パス）
　・シーンのアセットバンドルロード用スクリプトを作成



```
   // ボタンクリック時に呼ばれるイベント
    public void OnClickAssetBundleLoad()
    {
        StartCoroutine(LoadAssetBundle());
    }

    private Object[] publicObjects;
    IEnumerator LoadAssetBundle()
    {

        Debug.Log(Application.streamingAssetsPath + フォルダパス + ライトデータのフォルダのアセットバンドル名);

        WWW lightwww = new WWW(Application.streamingAssetsPath + フォルダパス + ライトデータのフォルダのアセットバンドル名);

        yield return lightwww;

        AssetBundle bundle = lightwww.assetBundle;

        Object[] objects = bundle.LoadAllAssets();

        foreach (Object obj in objects)
        {
            Debug.Log("obj=" + obj.name);
            Debug.Log("objtype=" + obj.GetType().ToString());
        }

        publicObjects = objects;
        Debug.Log("Light");



        Debug.Log(Application.streamingAssetsPath + フォルダパス + シーンのアセットバンドル名);

        WWW scenewww = new WWW(Application.streamingAssetsPath +  フォルダパス + シーンのアセットバンドル名);

        yield return scenewww;

        AssetBundle scenebundle = scenewww.assetBundle;

#elif UNITY_ANDROID
        Debug.Log("Android");
        SceneManager.LoadSceneAsync(シーン名（大文字小文字の区別あり）);
#endif

    }
```
getResponseCode(), getResponseContentsAsString(conn) が UI スレッドで実行できない

すごく今さらな感じがするけど、ひっかかったのでメモ。

# 現象
AsyncTask の onPostExecute() に getResponseCode() を書いたら exception をはいて落ち、
getResponseContentsAsString(conn) を書いたら何も取得してくれなかった。

通信してないからいいじゃんと思うんだけど、裏で何をやっているのだろう・・・。

# 対策
doInBackground() で取得して onPostExecute() で使えるようにし、レスポンスコードで処理を切り分けた。

# 原因とか
原因はまたあとで調べて追記したいのですが、とりあえずメモを残します。
Visual Studio 2015逆引きメモ


必要に迫られたVisual Studio 2015の逆引きメモです。

# ソース管理をSVNからGitに変更する方法

 Visual Studio 2015のソース管理でプラグインの選択でエラーが発生して変更出来ない問題。

 Visual Studio 2015の[ツール]→[オプション]→[ソース管理]→[プラグインの選択]でSVNからGitへ変更すると下記のメッセージが出て変更出来ない。

>ソース管理プラグイン
>アクティブなソリューションまたはプロジェクトは、ユーザーが選択したプラグインとは異なるソース管理プラグインによって管理されています。ソース管理プラグインを変更すると、アクティブなソリューションまたはプロジェクトは終了します。
>続行しますか?

## 対応方法

1. 変更したいソリューションファイルをテキストエディタで開いて下記の部分を削除。
2. Visual Studioからソリューションファイルを開く。

```
GlobalSection(SubversionScc) = preSolution
    Svn-Managed = True
    Manager = AnkhSVN - Subversion Support for Visual Studio
EndGlobalSection
```
Git | 僕が使っている .gitconfig の エイリアスを公開

# コンセプト

キータイプを短くしよう！
もっと開発を楽しくしよう！

# 内容

```bash:~/.gitconfig
[alias]
  branch-root = merge-base master HEAD

  ck = checkout
  st = status -s

  back = reset HEAD^
 
  cm = commit
  cma = commit --amend
  amend = commit --amend

  create = !git add . && git commit
  cr = !git create

  final = !git add . && git commit --amend
  fn = !git final
  forget = !git final
  fg = !git final
  cmaf = !git final

  l  = !git log --oneline --date=short --format=\"%C(yellow)%h%C(reset) %C(magenta)[%ad]%C(reset) %s %C(cyan)@%an%C(reset)\" $(git branch-root)..HEAD
  ll = log --oneline --name-status master..

  br = branch

  df = diff
  ds = diff --staged

  remember = !git diff $(git branch-root)
  rr = !git remember

  names = diff --name-only HEAD^
  history = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short

  rb = rebase
  rba = rebase --abort

  rbc = rebase --continue
  change-the-world = !git add . && git commit --amend && git rebase --continue
  ctw = !git change-the-world
  in-about-thirty-years = !git change-the-world

  back-to-the-future = !git rebase -i $(git merge-base master HEAD)
  bf = !git back-to-the-future
  rbi = !git back-to-the-future

  rebase-to = rebase

  one = log --oneline

  refresh = !git checkout master && git pull origin master && git checkout - && git rebase master
  new-world = !git refresh
  nw = !git refresh

  erase = clean -fd
  er = clean -fd
  vanish = !git reset . && git checkout . && git clean -fd  

  stash = stash -u -k

  strike = push -f

  happy = blame

  wip = commit --allow-empty
```

# 解説

## commit-force ( cmf )

すべて `add .` して、そのままコミット。

## commit-ammend-force ( cmaf )

すべて `add .` して、そのまま `commit --amend`。

## refresh

master を最新の状態にして。さらに現在のブランチを master に追随 ( rebase ) させる。

## names

ひとつ前のコミットから、変更され変更されたファイルの一覧を表示する。

## erase

作業ディレクトリで、git 管理されていないファイルを全削除する。

## remember

[現在のブランチルートからの差分を表示する。](http://qiita.com/Yinaura/items/cc10fbc83b4d6bb1ef0c)

## vanish

現在の作業状態を、全部消す。
( reset => checkout => clean )

## rebase 関係

- rbi : 現在のブランチルートからインタラクティブモードで rebase を開始する。
- rbc : rebase を進める。
- rba : rebase を抜ける。
- rebase-to : git rebase のただのエイリアス。このコマンドは rebase from なのか rebase to なのか、直感的に分かりにくいので、明示できるようにした。

## refresh

 [作業ブランチを「最新のマスター」にリベースする。](http://qiita.com/Yinaura/items/562b09ec4c7ad93ed2ab) 

## back

現在の HEAD を「解体」してひとつ前に戻ります。

```
back = reset HEAD^
```

## いつものやつ

お馴染みのコマンド共のエイリアス。

- co = checkout ( co って書くと「カミングアウト」っぽい )
- ck = checkout ( 「カミングアウト」っぽくない こちらを使っている )
- br = branch ( 改行っぽい )
- cm = commit ( コマーシャルっぽいけど問題ない )
- cma = commit --amend ( 熊っぽい。よく使う )
- df = diff 

# 環境

- git version 2.3.8 (Apple Git-58)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
naming > RecodeMilliSecond(now, 0); > やっていることがわからない関数例


```
now = RecodeMilliSecond(now, 0);
```

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.DateUtils.RecodeMilliSecond


RecodeMilliSecond()でその数値を変更する、とソースリーディングできる人が全体の何%いるのだろうか?

久しぶりにコードを見て「なんだこれ？」となったが、これがbuiltinのAPIだ。

別の候補としては以下のような関数が望ましい

`now = ReplaceMilliSecond(now, 0);`

ラッパー関数を作る方がいいのか、よけいなことなのか、将来このコードに戻ってきた時にどう思うか。。。
IPC::ShareLite のドキュメント翻訳 (DESCRIPTIONのみ)

http://search.cpan.org/~andya/IPC-ShareLite-0.17/lib/IPC/ShareLite.pm の翻訳 (DESCRIPTIONのみ)。

## new($key, $create, $destroy, $exclusive, $mode, $flags, $size)

IPC::ShareLite のコンストラクタは、位置パラメタスタイルと名前付きパラメタスタイルの両方の引数を受けつける。

`$key`は整数値で、プロセス間の連携に使われる。すべてのプロセスが同じ`$key`を使用することでプロセス間通信を実現する。また、`$key`には4文字のストリングも使用できるが、それは自動的に整数に変換される。`$key`が`undef` の場合、その共有メモリは他のプロセスからアクセスできない。

`$create`は共有メモリセグメントがなけれを作成するかどうかを指定する。`1`, `'yes'`, `0` または `'no'` を受け入れる。
 
`$destroy` は、オブジェクトが破棄されたときに共有メモリセグメントとセマフォも削除するかどうかを指定する。`1`, `'yes'`, `0` または `'no'` を受け入れる。

> 訳注: 子プロセスの終了による不意のスコープアウトに注意
 
`$exclusive` が `true` ならば、共有メモリセグメントがすでに存在するときインスタンス化に失敗する。`1`, `'yes'`, `0` または `'no'` を受け入れる。
 
`$mode`は共有メモリとセマフォへのアクセス権を指定する。その規定値は`0666`である。
 
`$flags`は共有メモリとセマフォのフラグを指定する。定数 `IPC_CREAT`, `IPC_EXCL` と `IPC_PRIVATE` をインポートできる。
 
$size は 共有メモリのセグメントサイズをバイトで指定する。規定値は 65,536 バイトで、これはかなり可搬性がある。たとえばLinuxは4メガバイトセグメントをサポートする。
 
このコンストラクタはエラー発生時にcroakする。

## store($scalar)
 
このメソッドは任意の長さの`$scalar`を共有メモリにストアする。データ長が変化できるよう、共有メモリセグメントは自動的に獲得・開放される。データ量の制限は、カーネルコンパイル時の最大共有メモリページ(SHMALL)とセグメント最大数(SHMMNI)による。
 
このメソッドはエラー発生時に例外を送出する。

## fetch
 
このメソッドは前もって共有メモリにストアされたデータを返す。データがストアされていなかったときには空文字列を返却する。
 
このメソッドはエラー発生に例外を送出する。
 
## lock($type)

複数のプロセスは任意の時間に共有ロックを保持することができる。一つ以上のプロセスが共有ロックを保持しているときに排他ロック獲得しようとすると、それら(共有ロック)すべてが終了するまで(排他ロックが)ブロックされる。
 
いずれのロックも、ノンブロッキングを指定することができる。

```pl
$share->lock(LOCK_EX | LOCK_NB);
$share->lock(LOCK_SH | LOCK_NB);
```

もしロック獲得のために待機しなければならないとき、ノンブロッキングロック要求は`0`を返す。

> ノート: これらのロックは flock のようなアドバイザリロックであり、すべての協働プロセスが共有メモリへのアクセスを調整しなければならないことに注意する。詳細については、flock() を参照すること。
 
ロックは fork で継承される。つまりこれは、2つのプロセスが同時に排他ロックを保有できてしまうことを意味する。やるなよ絶対にやるなよ。

定数 `LOCK_EX`, `LOCK_SH`, `LOCK_NB` と `LOCK_UN` をインポートできる:

```pl
use IPC::ShareLite qw( :lock );
```

あるいはFcntlモジュールの定数も使用可能である。
 
## unlock()

`lock(LOCK_UN)` と同じ。
 
## verison

各共有は、書き込み毎に増加するバージョン番号を持っている。共有が作成されると、バージョン番号は1となる。

## key

共有キーを取得する
 
## exclusive

exclusiveフラグを取得する
 
## flags

フラグを取得する

## mode

modeを取得する

## size

セグメントサイズを取得する

## num_segments

共有のセグメント数を取得する。共有のメモリ使用量は、おおよそ次のようになる。

```pl
my $usage = $share->size * $share->num_segments;
```

メモリ使用量 `$usage`はセグメント境界で切り上げられる。

## destroy

destroyフラグを取得する
ckanでlessを実行したらCommand failed: NameError

ckan2.5でlessを実行したら下記のエラーが。

```
Command failed: NameError: #grid > .core > .span is undefined in 
/usr/lib/ckan/default/src/ckan/ckan/public/base/vendor/bootstrap/less/navbar.less on line 199, column 3:
```
え～、と思ったられbootstrap側で起きてるのね。Ckan側の問題では無いっす。

navbar.lessの199行目を

``  #grid > .core > .span(@gridColumns);
``
下に書き換えてあげましょう。

```
#grid {    
    .core  {
        .span(@gridColumns) {
            width: (@gridColumnWidth * @gridColumns) + (@gridGutterWidth * (@gridColumns - 1));
        }
    }
};
```
参考は[こちら](http://stackoverflow.com/questions/26628309/less-v2-does-not-compile-twitters-bootstrap-2-x)。
Apache "SSL Version" をNSSからOpenSSLへ変更した事例

Webサーバで参照している "SSL Version" を変えたい。
ちなみに、インストールされているNSSのバージョンは 3.19 で最新の状態。
しかし確認してみると、バージョンが古いまま、という事例。

OSバージョン
> cat /proc/version
Linux version 2.6.32-358.6.1.el6.x86_64
> cat /etc/redhat-release
CentOS release 6.4 (Final)

SSLバージョン
> php -i | grep "SSL Version" 
SSL Version => NSS/3.14.0.0

SSL VersionそもそもNSSが古いのもよくないが、NSSに向いていること自体まずそう。
ただ、下記のように、PHPの再コンパイルとか深いところをいじりたくない…
http://blog.wnotes.net/blog/article/php_curl_error

Googleで彷徨っていると、見当たったのはGHOST脆弱性問題対策
http://d.hatena.ne.jp/ts_asano/20150128/1422430262

NSS（Network Security Services）の更新が必要とのこと。
いざ更新。

> yum install --disablerepo=epel nss
3.19.1-2.el6_7 で最新の状態ですとのこと。

glibcが古いのかと確認。たしかに古い。
<pre>
[root@stage-receipt-web-php56-04 ~]# yum list glibc
読み込んだプラグイン:fastestmirror, presto
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * remi-safe: remi.kazukioishi.net
 * rpmforge: ftp.riken.jp
 * updates: ftp.iij.ad.jp
インストール済みパッケージ
glibc.x86_64　2.12-1.107.el6		@base
利用可能なパッケージ
glibc.i686	2.12-1.166.el6_7.7	updates
glibc.x86_64	2.12-1.166	el6_7.7	updates
</pre>

おもむろにglibcをUpdate
> yum update glibc

確認すると、向き先がOpenSSLに変わりました。
> php -i | grep "SSL Version"
SSL Version => OpenSSL/1.0.1e
ngx_mrubyをnginx-buildのビルドに組み込む


[nginx-build](https://github.com/cubicdaiya/nginx-build)っちゅう、nginxのビルドをラップしてくれるツールがあります。
広めの想定範囲内で柔軟に対応できて、環境依存度が比較的高めのライブラリを自動で取ってくるなど、ノウハウが詰まっててよいものです。

で、導入に少しコツがいる、[ngx_mruby](https://github.com/matsumoto-r/ngx_mruby)を組み込む場合について書いておきます。

これを書いた時点の各々のバージョンはこちら。

- nginx-build: v0.7.1
- ngx_mruby: v1.17.0

本記事の内容は、このリポジトリで使ってます。 https://github.com/giraffi/docker-nginx-mruby-base


> 余談。`ngx_mruby x nginx-build`はわりと背徳の香りがする組み合わせです。理解できる方はほんの一部でしょうが。。。

## nginx-buildの3rdパーティーモジュール定義

nginx-buildはiniファイルに3rdパーティモジュールを定義します。
ngx_mrubyはこんな感じに、shprov指定による前処理がほぼ必須です。


```modules3rd.ini
[ngx_mruby]
form=git
url=https://github.com/matsumoto-r/ngx_mruby.git
rev=v1.17.0
shprov=/config/mruby/wrap_build.sh
```

ここのformがどうやらformatのことで、fromと誤認してたまにハマる。


## ngx_mrubyの(フックされる)前処理

前処理の内訳例です。nginxをビルドする前にこれらが終わっていないといけません。

- mgemの塩梅を調節
- mrubyをビルドする

ざっくりshellにして、shprov指定の内容がこちら。元の`build.sh`を参考にしています。

```wrap_build.sh
#!/bin/sh

set -xe

## 自前のbuild_config.rbに差し替えたい時
/bin/cp -f /config/mruby/build_config.rb ./
./configure --with-ngx-src-root=../nginx-$NGINX_VER

make build_mruby -j 2
make generate_gems_config -j 2 # これがほんとに必要かはちゃんと調べてない。
```

## nginx-buildが使うconfigureへの仕込み

さて、`ngx_mruby`では指定バージョンの`ngx_devel_kit`も`--add-module`する必要がある(っぽい)。
これをiniで賄うのは面倒なので、configureのオプションに加えておきます。幸いパスは固定です。

```configure.sh
./configure --with-debug \
 --prefix=/usr/local/nginx \
 --with-pcre-jit \

... (中略)

 --add-module=../ngx_mruby/dependence/ngx_devel_kit
```

`ngx_mruby`本体の`add-module`は`nginx-build`が自動でつけてくれます。


## nginx-build!

準備ができたら、ビルドします。

```
$ export NGINX_VER=1.9.12
$ ./nginx-build -verbose -v $NGINX_VER -d work -pcre -zlib -m modules3rd.ini -c configure.sh --clear
```

> (nginx-build 0.7.2以前) しばらく眺めていればおわります。今のところshprov(provideShell)はexitが0以外でも容赦なく進んでいくようなので、`-verbose`をつけて経過を眺めておくのが無難でした。

v0.7.3以降のnginx-buildを使えば、shprovのexit_statusが0出ない場合Failするので安心です。(コメント参照)

あとは`make install`するなりなんなりと。
HTMLとCSSのみで作れるボタン集 (only CSS. No javascript! No images!)

# with only CSS. No javascript! No images!
ということで
CSSのみで作成できるインタラクティブなボタンデザインをまとめたサイトを作成しました。

[HTMLとCSSのみで作れるボタン集 | cssButtons](http://www.sottar.net/cssButtons/)
[source(github)](https://github.com/sottar/cssButtons)

個人的に使いやすいと思ったものや面白いものをまとめてます。
デザインやアニメーションは全てCSSのみで実装しているものです。

IEの古いバージョンにはほとんど対応していないです。。。

## 使い方

ボタンをクリックするとそのボタンのHTMLとCSSが表示されます

コードをコピペするだけで使えるようになってます。

CSSは以下の様なスタイルをベースとして設定してあります。ボタンのサイズや色の有無などは各自で変更をお願いします。

```css
.button {
	display: block;
	width: 200px;
	height: 40px;
	text-align: center;
	text-decoration: none;
	line-height: 40px;
}
.button::before,
.button::after {
	position: absolute;
	z-index: -1;
	display: block;
	content: '';
}
.button,
.button::before,
.button::after {
	-webkit-transition: all 0.3s;
	transition: all 0.3s;
}
```

## その他
今後もボタンを追加していく予定です。
表示崩れ等のバグがあった場合は連絡いただければ対応します。

一人だと追加していくのに限界があるのでコミッター大募集です。
よろしくお願いします。
[github](https://github.com/sottar/cssButtons)


## 追記
2016-03-17　CSSのコードをコピーできるボタンを実装。
ddを使って並列コピー

Amazon EC2でスナップショットから作成したばかりのEBSは読み書きが遅いので、ddを使って並列コピーするコマンドを作成してみた。

[winebarrel/ddcp: Parallel file copy command using dd.](https://github.com/winebarrel/ddcp)

# 検証

* スナップショットから作成したばかりのEBSからエフェメラルディスクにファイルをコピー
    * ファイルは25GBのidbファイル
    * ファイルシステムはext4
* インスタンスは[i2.xlarge](https://aws.amazon.com/jp/ec2/instance-types/)
* EBSはgp2 1000GB（3000IOPS）

## ddcp

```
ubuntu@ip-10-0-158-54:~$ time ddcp -s /mnt/vol2/mysql/wikimedia/page_view_statistics.ibd -d /mnt/vol/tmp/page_view_statistics.ibd

real	20m57.639s
user	0m0.360s
sys	0m48.133s
```

ハッシュは一致。

```
ubuntu@ip-10-0-158-54:~$ shasum /mnt/vol2/mysql/wikimedia/page_view_statistics.ibd /mnt/vol/tmp/page_view_statistics.ibd
08743bb15c2a92b153ae574d7ce16a6331bd0767  /mnt/vol2/mysql/wikimedia/page_view_statistics.ibd
08743bb15c2a92b153ae574d7ce16a6331bd0767  /mnt/vol/tmp/page_view_statistics.ibd
```

## 通常のコピー

cpを使うと時間がかかるのでpvを使って進捗を見る。

```
ubuntu@ip-10-0-158-54:~$ time pv /mnt/vol2/mysql/wikimedia/page_view_statistics.ibd > /mnt/vol/tmp/page_view_statistics.ibd
3.19GB 0:14:11 [4.36MB/s] [======>                                                          ] 12% ETA 1:36:05
```

1:47ぐらいかかる。
emacsのCUAモードで、矩形選択エリア内の文字を置換する

# 参考

[Search and replace inside a rectangle in emacs](http://stackoverflow.com/questions/11130546/search-and-replace-inside-a-rectangle-in-emacs)

# Solution

- `C-RET` to mark a corner.
- Move point to opposite corner.
- `M-r` to do a regexp replace within the marked rectangle.
- `C-RET` to unmark/exit rectangle editing.

# 例: 矩形エリアの空白を削除する場合

- 矩形選択した後、`M-r`
- Replace regexcp: ' +'を入力してエンター
- New text: 何も入力せずエンター
iOSのGoogle Analyticsでアプリのキャンペーン計測ができないと思ったら、WEBでは無理だった。

![image](https://qiita-image-store.s3.amazonaws.com/0/24308/4eb582bb-7c4f-401d-ec14-c24c472f5787.png)

ネットワークは使わないからカスタムだな。


![image](https://qiita-image-store.s3.amazonaws.com/0/24308/37944181-ba8b-b0a6-4c83-2b7bd35715d5.png)

これはよくわからないけど必須だから例と一緒にすればいいんだろうな。


そうして出来上がった、キャンペーンURLがこんな感じで、
`https://click.google-analytics.com/redirect?tid=UA-1234567-8&url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fapp%2Fmy-app%2Fid123456789&aid=com.company.app&idfa=%{idfa}&cs=newsletter4`

アプリがリリースされたぞ！WEBに導線張って・・・・
・・・計測されない！！！


なぜ？！

すいませんでした、ちゃんと書いてありました。
[キャンペーンの測定 - iOS SDK](https://developers.google.com/analytics/devguides/collection/ios/v3/campaigns?hl=ja)

>注: iOS インストール トラッキングは、アプリ内広告を配信する AdMob などのモバイル広告ネットワークで配信された広告でのみ動作します。


このidfa=%{idfa}っていうのが間違ってて、idfaにアクセスできるのはiOSアプリの中だけです。なので、iOS SDKなどのiOSアプリ内の広告でのみ使えるということでした。

なのでWEBやソーシャルキャンペーンの場合、appleが提供しているApp Analyticsのキャンペーン機能をつかいましょう。

```
itunes Connect > App Analytics > ソース > トップキャンペーン > キャンペーンリンクを作成
```

からURLを生成できます。


参考：[iTunes ConnectのApp Analyticsを使ってみた](http://qiita.com/koogawa/items/0a681469899bafb40f3e)
CakePHP2のモック利用事例


モックを作ってからはPHPUnitままなので、CakePHP2だけでなくPHPUnitでも同じ事できます

## 呼ばれる回数


```php
$mock->expects($this->never()) //1度も呼ばれない
	->method('_getSiteTimezone')
	->will($this->returnValue('Asia/Tokyo'));



```php
$mock->expects($this->once()) //1回だけ呼ばれる
	->method('_getSiteTimezone')
	->will($this->returnValue('Asia/Tokyo'));
```


```php
$mock->expects($this->exactly(2)) //2回呼ばれる
	->method('_getSiteTimezone')
	->will($this->returnValue('Asia/Tokyo'));
```

```php
$mock->expects($this->any()) // 何回か呼ばれる
	->method('_getSiteTimezone')
	->will($this->returnValue('Asia/Tokyo'));
```

## methodの戻り値指定

```php
$mock->expects($this->once())
	->method('_getSiteTimezone') // メソッド名
	->will($this->returnValue('Asia/Tokyo'));　// 戻り値指定
```

```php
$map = array(
	['public_type', true],
	['publish_start', true],
	['publish_end', false]
);
$mock->method('hasField'')
	->will($this->returnValueMap($map));
```

## 特定の引数で呼ばれたか
```php
$mock->expects($this->once()) // 1回だけ
	->method('get') // メソッド名
	->with($this->equalTo('指定引数'));

```

## ビヘイビアをモックに差し替える

```php
		// まず取り除く
		$this->UploadFile->Behaviors->unload('Upload');

		// モック生成
		$uploadBehaviorMock = $this->getMock('UploadBehavior', ['uploadSettings']);
		$uploadBehaviorMock->expects($this->once()) //1回だけ呼ばれる
			->method('uploadSettings')
			->with(
				$this->isInstanceOf('Model'),
				$this->equalTo('real_file_name'),
				$this->equalTo($options));

		// ClassRegistoryを使ってモックを登録。
		// まずremoveObjectしないとaddObjectできないのでremoveObjectする	
		ClassRegistry::removeObject('UploadBehavior');
		// addObjectでUploadBehaviorでMockが使われる	
		ClassRegistry::addObject('UploadBehavior', $uploadBehaviorMock);

		// このloadではモックがロードされる
		$this->UploadFile->Behaviors->load('Upload');

```

testに下記突っ込んでもいいかも

```
	protected function _behaviorMock($model, $mockBehaviorName, $mockMethod) {
		// まず取り除く
		$model->Behaviors->unload($mockBehaviorName);

		// モック生成
		$mockBehavior = $this->getMock($mockBehaviorName . 'Behavior', [$mockMethod]);

		// ClassRegistoryを使ってモックを登録。
		// まずremoveObjectしないとaddObjectできないのでremoveObjectする
		ClassRegistry::removeObject($mockBehaviorName . 'Behavior');
		// addObjectでUploadBehaviorでMockが使われる
		ClassRegistry::addObject($mockBehaviorName . 'Behavior', $mockBehavior);

		// このloadではモックがロードされる
		$model->Behaviors->load($mockBehaviorName);
		return $mockBehavior;
	}
```
筋トレ大好きな文系女学生のJava入門〜配列〜

#はじめに
おととい、自重筋トレをしたら、下腹が筋肉痛になりました :kissing_closed_eyes: :heart: :heart: 
今回は、配列についてです。
独学でやってるので、「これはJavaやっていくにあたって役に立つ知識だぞ！！」というのがあれば、コメントして頂けるととても嬉しいです :notes: :notes: 



##配列

配列とは・・・同じ種類の複数あるデータを並び順でしまうこと。


しまってあるデータの１つ１つを、要素という。


配列にしまってある要素は、０から始まる。
《例》
要素が３つあったら
０・１・２


配列に含まれる要素の型は、変数の型と同じにしなければならない。
《例》
「要素の０番には数字、要素の１番には文字列」などといった、異なるデータ型はしまうことができない！


要素についている番号（例えば要素の１番）は、添え字と呼ぶ。


配列の初期化とは・・・
作った（宣言した）配列を使う前に、領域の確保（データを入れる場所）・値の代入まで最初に行っておくこと。



配列とfor文


for(int i = 0; i < 配列変数名.length; i++){....}




```java
1 public class MuscleWorld{
2  public static void main(String[] args){
3    int[] number = {10,20,30,40,50};
4    for(int i = 0; i < number.length; i++){
5    System.out.println(number[i]);
6    }
7  }
8}
```


拡張for文
配列の要素を１つずつ取り出すループを簡単に書くためにつくられた新しいfor文 :tada: 
コードにループ変数や添え字を使う機会がなくなるので、見やすくなる！！


for(要素の型　自分が決めた変数名:配列変数名){.....}

```java
1 public class MuscleWorld{
2  public static void main(String[] args){
3    int[] number = {10,20,30,40,50};
4    for(int muscle : number){
5      System.out.println(muscle);
6   }
7  }
8}
```
Directory APIでAppsグループの移行に挑戦する

# 概要
今回、AドメインからBドメインへの完璧なグループの移行を目指す。
Admin SDKに付随するDirectory APIを使用する。
言語はJavaで記述し、Google APIs Client Librariesを用いる。

# 目標
- グループの外枠の移行
- グループのエイリアスの移行
- グループのメンバーの移行
- グループのアクセス権限の移行

# Appsの設定
まずはじめに、Appsの管理者権限アカウントで管理コンソールにアクセスする。
今回はDomain-Wide Delegationでアクセスするため、[セキュリティ]-[もっと見る]-[詳細設定]より[APIクライアントアクセスを管理する]を選択し、スコープ範囲に次の値を設定する。
```https://www.googleapis.com/auth/admin.directory.group```
```https://www.googleapis.com/auth/admin.directory.group.readonly```
以上をAとB両方のドメインで設定しておく。

# グループの外枠の移行
まず、Aドメインのグループ一覧を取得する。

```java:Group.java
Groups result = this.directory.groups().list().setMaxResults(50).setDomain(domain).setPageToken(token).execute();
```

グループ数が多いと1回のリクエストで全て取ってこれないので、発行されたnextPageTokenを次のリクエストに設定し、ループしてグループを取得する必要がある。
グループ名、グループアドレス、グループの説明が取得できるので、グループアドレスのドメインをAからBに置換して、グループを作成してあげれば良い。

```java:Group.java
this.directory.groups().insert(group);
```

まとめて作成できないので、1つずつ作成していく必要がある。
これでBドメインの外枠の作成ができる。ここで注意しておきたいのが、管理コンソール上から確認できる[タイプ]の存在である。通常、管理コンソールからグループを作成するとき[アクセスレベル]を指定して作成するが、API経由ではそれができない。[公開][チーム][通知のみ][制限付き]から選べるのだが、API経由で作成してしまうとアクセス権限が自動的に設定されてしまい、タイプは[カスタム]でしか作成できない。つまり、Aドメインのグループ権限が初期値のままで、詳細にアクセス設定を行っていない場合は、グループの外枠は手動で作成しなければ完全な移行とは言えない。（アクセス権限を同じように設定してもタイプは[カスタム]のままである。)

# グループのエイリアスの移行
グループ一覧の取得とは別に、グループエイリアス一覧を取得するためのAPIが別で用意されているので、グループの取得と同じように使う。

```java:GroupAlias.java
List<Alias> aliases = this.directory.groups().aliases().list(email).execute().getAliases();
```

グループIDまたはグループアドレスを指定して、そのグループのエイリアス一覧を取得することができる。今回はグループアドレスを指定している。エイリアスが設定されていないグループもあると思うので、nullチェックだけ気をつけてあげれば良い。
あとは、エイリアスのドメインもAからBに置換して、置換後のグループアドレス（移行先であるBドメインのアドレス）を指定して、エイリアスを作成してあげれば良い。

```java:GroupAlias.java
this.directory.groups().aliases().insert(email, alias);
```

エイリアスもまとめて作成できないので、1つずつ作成していく必要がある。

# グループのメンバーの移行
グループ一覧の取得とは別に、グループメンバー一覧を取得するためのAPIが別で用意されているので、グループの取得と同じように使う。

```java:GroupMember.java
Members result = this.directory.members().list(email).setMaxResults(50).setPageToken(token).execute();
```

メンバーもグループと同じように１回のリクエストで全てのメンバーを取ってこれない場合があるので、nextPageTokenを設定してループして取得する必要がある。メンバーが存在しないグループもあるため、nullチェックに気をつける。
メンバーの場合もう一つ注意が必要で、「このドメインの全てのユーザー」という設定がある。
「このドメイン全てのユーザー」はメンバーの1人として扱われ、あたかも「このドメイン全てのユーザー」というメンバーが所属するかのような扱いになっている。見分け方は単純で、タイプが[CUSTOMER]に設定されているメンバーは「このドメイン全てのユーザー」である。通常のメンバーであれば[User]、グループアドレスであれば[Group]といったタイプが設定されている。
役割も[OWNER][MANAGER][MEMBER]が取得できるので、あとはBドメインのグループアドレスを指定して、メンバーを作成してあげれば良い。

```java:GroupMember.java
this.directory.members().insert(email, member).execute();
```

「このドメイン全てのユーザー」の場合だけ、アドレスは取得できないので、予めBドメインで「このドメイン全てのユーザー」が所属するグループを作成しておき、idを取得しておく必要がある。そのidを元にmemberオブジェクトを作成し、メンバーの作成を行う必要がある。

# グループのアクセス権限の移行
ここまでで、グループの外枠、エイリアス、メンバーと順調に移行してきたが、アクセス権限の移行で躓くことになる。アクセス設定はDirectory APIに属していなく、別枠でGroupssettings APIなるものが用意されている。中身を見てみると、管理コンソールから設定できる項目の半分もなく、全く使い物にならないことがわかる。一部だけAPIで設定し、あとは手動で移行になる。

# まとめ
グループの移行は、外枠、エイリアス、メンバーはちゃんとしたAPIが用意されているので、コードで移行することができる。ただし、グループの[タイプ]も移行したい場合は外枠は手動で作成することになる。アクセス設定は、APIこそ用意されているものの、設定できる項目が少ないのでほとんどを手動で移行することになる。

# 参考
https://support.google.com/a/answer/6261922?hl=ja&ref_topic=1685690
https://support.google.com/a/answer/6261704?hl=ja&ref_topic=1685690
EclipseのパーサーがGMockのMatcher/MatcherInterfaceに関してエラーを履くとき

Eclispeが
```
Invalid arguments '
Candidates are:
testing::Matcher<#0> MakeMatcher(const testing::MatcherInterface<#0> *)
'	/test/gmock-1.7.0/include/gmock	gmock-matchers.h	行 1351	Semantic Error
```
というようなSemantics Errorを履くときは
ヘッダの宣言を以下に変更すれば良い。

```cpp:previous
inline Matcher<const hoge&> hogeEq(hoge expected)
```
```cpp:changed
inline ::testing::Matcher<const hoge&> hogeEq(hoge expected)
```

ヘッダではusingキーワードを理解しないらしい。う～んバッドノウハウ。
RxSwiftのDisposeBagとWeakの関係について

## はじめに
以下のコードを見たときに違和感を覚えたので、検証した結果を書きます。
違和感を覚えたのは以下のコードです。

```swift
class UserViewController: UIViewController {
    let disposeBag = DisposeBag()

    private func loadUser(user:User){ 
        API.User.Get(user.id).subscribeNext { user in
            self.userNameLabel.text = user.name
        }.addDisposableTo(disposeBag)
    }
}
```

## 何が起こるのか？
`DisposeBag`は`Observable`を自動的に解放するための便利な機能です。
[はじめてのRxSwiftのメモ](http://qiita.com/syou007/items/41ff1469ee7a92e7ec57)に書いてますので、見てください。

「この`DisposeBag`によって`self`が解放されるはず。」

という意図で書かれたコードだと思いますが、実際は意図とは違う潜在バグを引き起こすコードでした。
このコードは正常に動きますが、`deinit`が呼ばれません。
すなわち、`UserViewController`が解放されません。

そのうちメモリリークが発生しますが、開発環境では気づきにくいでしょう。

## 何が起こっているのか？
問題は以下のコードにあります。

```swift
API.User.Get(user.id).subscribeNext { user in
    self.userNameLabel.text = user.name
}.addDisposableTo(disposeBag)
```

このコードの中で`self`を参照しているため、`self`が解放されません。
`self`が解放されないと`disposeBag`も解放されないため、結果的に相互参照が発生してしまいます。

## 解決策
解決策は簡単で以下のように`self`を弱参照すれば良いだけです。

```swift
class UserViewController: UIViewController {
    let disposeBag = DisposeBag()

    private func loadUser(user:User){ 
        API.User.Get(user.id).subscribeNext { [weak self] user in
            self?.userNameLabel.text = user.name
        }.addDisposableTo(disposeBag)
    }
}
```

このようにする事で`self`が解放されるため`disposeBag`も同時に解放され`Observable`も解放されます。
（`API.User.Get`の中で`onCompleted`などが呼び出されていれば、`addDisposableTo(disposeBag)`は不要です。）

## 最後に
基本的な事ですが、新しい概念（ここで言うと`DisposeBag`）が入ると混乱して基本的な事が抜けてしまう事があります。
僕もコードを見たときに感じたのは違和感だけで、確証は得られなかったので検証は大切だと思いました。

## 未検証のもの
上記のコードは以下のように書いても解放されると思います。

```swift
class UserViewController: UIViewController {
    let disposeBag = DisposeBag()

    private func loadUser(user:User){ 
        _ = API.User.Get(user.id).subscribeNext { [weak self] user in
            self?.userNameLabel.text = user.name
        }
    }
}
```

上記のコードは`Alamofire`を`RxSwift`を使用しています。
`Manager.sharedInstance#rx_request`を使ってます。
多分`Manager.sharedInstance`が`Observable`を保持して、リクエストが終わった時点で`onCompleted`などが呼ばれていると思うのでその時点で解放されるかと思います。
踏み台経由のrsync, 帯域制限付き

```
rsync --bwlimit=1024 -av -e 'ssh 踏み台のipaddress ssh' $cur/all_logs destinationのipaddress:/home/data/

```

- 1024KBで帯域制限
- 踏み台経由でrsyncする。踏み台にはデータは残らない
Qiita > コメントに直接飛ぶ > 吹き出しをクリックする

Qiitaのフィードで気になるコメント。

コメントをすぐに見たいときのクリックは下の画像の右側にある「吹き出しからその右側の数字まで」をクリックしたらよいようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a731a20b-4493-f0e7-57c1-3a1b8761dc58.png)

記事に飛んでから、マウスホイールでスクロールする時間(5秒）が不要にな
る。
[5秒] x [気になるコメント数]の時間を削除可能。

---
吹き出しの左側にあるフォルダアイコン(数字5の左側)の方はリンクなし。
(追記: 代わりに、クリックすると「ストック」になるようだ)

ちょっとUI的にアンバランスに感じたが大きな問題ではない。
KDE環境でmysql-community-serverがインストールできない？

mysql-community-serverをアップグレードするときに、

```
Preparing to unpack .../mysql-community-server_5.6.29-1debian8_amd64.deb ...
................
dpkg: error processing archive /home/yi01/Downloads/mysql-community-server_5.6.29-1debian8_amd64.deb (--install):
 subprocess new pre-installation script returned error exit status 1
Errors were encountered while processing:
```

みたいなエラーでコケた。

mysql-community-serverのdebファイルをバラして

```
sudo dpkg-deb -x ~/Downloads/mysql-community-server_5.6.29-1debian8_amd64.deb ~/Downloads/hoge
sudo dpkg-deb -e ~/Downloads/mysql-community-server_5.6.29-1debian8_amd64.deb ~/Downloads/hoge/DEBIAN
```

改造して

```bash:~/Downloads/hoge/DEBIAN/preinst
#!/bin/bash -x

```

再度固めて

```
sudo dpkg-deb -b ~/Downloads/hoge ~/Downloads/mysql-oreore-server.deb
```

ってやって、mysql-oreore-serverインストールを試みると、

```
+ echo upgrade
+ case "$1" in
+ set -e
+ server_stop
++ get_pcount
+++ ps -ef
+++ grep /usr/sbin/mysqld
+++ wc -l
++ PSCOUNT=2
++ echo 2
+ PSCOUNT=2
+ COUNT=0
+ :
+ COUNT=1
+ echo -n .
.+ '[' 2 -eq 1 ']'
+ '[' 1 -gt 15 ']'
++ get_pcount
+++ ps -ef
+++ grep /usr/sbin/mysqld
+++ wc -l
++ PSCOUNT=2
++ echo 2
+ PSCOUNT=2
+ sleep 1
+ :
+ COUNT=2
+ echo -n .
.+ '[' 2 -eq 1 ']'
+ '[' 2 -gt 15 ']'
++ get_pcount
+++ ps -ef
+++ wc -l
+++ grep /usr/sbin/mysqld
++ PSCOUNT=2
++ echo 2
+ PSCOUNT=2
+ sleep 1
+ :
+ COUNT=3
+ echo -n .
.+ '[' 2 -eq 1 ']'
+ '[' 3 -gt 15 ']'
++ get_pcount
+++ ps -ef
 :
 :
 :

```

ってかんじで、15までカウントアップされて死んでます。

mysqldの数を数えて1だったらOKっぽいのですが、2なのがそもそもまずいみたい。

```

yi01     26505  0.0  0.7 2347772 119700 ?      Sl   Mar02   0:38 /usr/sbin/mysqld --defaults-file=/home/yi01/.local/share/akonadi/mysql.conf --datadir=/home/yi01/.local/share/akonadi/db_data/ --socket=/tmp/akonadi-yi01.fUJrZG/mysql.socket
yi01     27063  0.0  0.0  12732  2172 pts/6    S+   11:02   0:00 grep mysqld

```

akonadi？みたいなやつが勝手にMySQLサーバを動かしてて、そいつがカウントされてるのが mysql-community-serverてきには予想外なんだろうな、と。


たぶんKDMを切って、まっくろ画面でログインして `sudo apt-get install mysql-community-server` したら解決するんだろうなぁと思いつつ、DEBパッケージをバラして組み立てるまでやっちゃったし、

```bash:~/Downloads/hoge/DEBIAN/preinst
server_stop () {
    PSCOUNT=$(get_pcount)
    COUNT=0
    while :; do
        COUNT=$(( COUNT+1 ))
        echo -n .
        if [ "${PSCOUNT}" -eq 2 ]; #★１を２に書き換えた★
        then
            
```

で再度mysql-oreore-serverパッケージを作ってインストールしたら解決。


とはいえ毎度こんなことはやってられないので

**MySQLをインストール/アップグレードするときにはKDMをオフってコンソールログインからやろう！**

ということで。
開発環境で複数クラスタのElasticsearch を立ち上げる

# 課題

+ 我々は貧乏である
+ 一人ひとりに開発サーバをあげれないし、Macでなんて開発なんて出来ない
+ 開発サーバは一台しかない
+ DBの状況が各メンバー毎に違っている
    + なぜかDBは各個人毎にある
+ DBの更新をElasticsearch に送っているのでよく不整合が起きてる

# やりたいこと

+ DBと同じようにElasticsearch も個人毎に分け与えたい

# やったこと

```zsh
$ elasticsearch --cluster.name={custom_cluster_name} --http.port=#{custom_port}
```

# 解説

+ クラスタ名とポートを分ければ解決する
+ help を見ると以下のようになっていたので、`--prop=val` の所をごにょごにょすれば基本的になんでも出来そう

```zsh
$ elasticsearch -h
Usage: /usr/local/bin/elasticsearch [-vdh] [-p pidfile] [-D prop] [-X prop]
Start elasticsearch.
    -d            daemonize (run in background)
    -p pidfile    write PID to <pidfile>
    -h
    --help        print command line options
    -v            print elasticsearch version, then exit
    -D prop       set JAVA system property
    -X prop       set non-standard JAVA system property
   --prop=val
   --prop val     set elasticsearch property (i.e. -Des.<prop>=<val>)
```
+ 今回は、クラスタ名とポートだけだったのでそれ以外はelaticsearch.yml を読み込んでいる（はず）

# 確認

+ index 一覧で別物かどうかをチェックした
    + ```curl http://localhost:9200/_aliases?pretty=1```
    + ```curl http://localhost:9210/_aliases?pretty=1```
Array::reduceRightで直列の非同期処理を簡潔に書く

[react-routerの人がgithub上で以下のようなコードを公開されていた](https://github.com/mjackson/npm-http-server/blob/c934a35f6793aa7748d7aff51d4520c6656d38c8/modules/index.js#L80-L94)のですが、内容を理解するのに時間が掛かったので解説します。

```js
[1,2,3,4,5].reduceRight((next,arg)=>{
  return ()=>{
    console.log(arg)
    next()
  }
},()=>{
  console.log('all done')
})()

// 1
// 2
// 3
// 4
// 5
// all done
```

`reduceRight`は配列の値を、`reduceRight`のコールバック関数内で右から順番に処理します。

> [Array.prototype.reduceRight() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight)

最後の行で`})()`としているように、`reduceRight`の戻り値を、関数として実行しています。

実行したのは、`reduceRight`で最後に返した`arg=1`を持つクロージャ関数です。
このクロージャ関数の`next`は、`reduceRight`から渡された`arg=2`を持つクロージャ関数です。
つまり、`next`を実行すると、`reduceRight`に`return`した関数を、直列に左から実行します。

`arg=5`のクロージャ関数には、本来`next`は未定義ですが、これは`reduceRight`の第二引数`initialValue`から渡すことが出来ます。
その結果、コンソール上には`"5"`のあとに`"all done"`が表示されています。

閑話休題
---
冒頭に取り上げた実コードは以下の様なものでした。

```js:npm-http-server/modules/index.js#L73-L94
const ResolveExtensions = [ '', '.js', '.json' ]

/**
 * Resolves a path like "lib/index" into "lib/index.js" or
 * "lib/index.json" depending on which one is available, similar
 * to how require('lib/index') does.
 */
function resolveFile(file, callback) {
  ResolveExtensions.reduceRight(function (next, ext) {
    return function () {
      statFile(file + ext, function (error, stat) {
        if (stat && stat.isFile()) {
          callback(null, file + ext)
        } else if (error && error.code !== 'ENOENT') {
          callback(error)
        } else {
          next()
        }
      })
    }
  }, callback)()
}
```

これを以下のようなtree上で実行すると、結果は以下のようになります

```bash
tree .
# .
# ├── bar.js
# ├── baz.json
# └── foo
```

```js
resolveFile('foo',(error,found)=>{
  console.log(error,found) // null 'foo'
})
resolveFile('bar',(error,found)=>{
  console.log(error,found) // null 'bar.js'
})
resolveFile('baz',(error,found)=>{
  console.log(error,found) // null 'baz.json'
})
resolveFile('beep',(error,found)=>{
  console.log(error,found) // undefined undefined
})
```

おわりに
---
直列の非同期処理を簡潔に書く方法として、`reduceRight`を利用してみるのは如何でしょうか。
自分も、非同期でフォルダを上に登りながらファイルを検索したい時に、参考になりました。

> [climb-lookup-v1.0.0 - lookup the file while climbing to recursively. like a require().](https://github.com/59naga/climb-lookup/blob/50a1398904c0502a3e7ef512b37df1b7ef2cb8f2/src/index.js#L31-L66)
Rails + Reactjsの記事のリンク

- [Railsで構築しているWebサービスをjQueryベースからReactに移行する時の知見](http://blog.spacemarket.com/code/migration-to-react/)

- [react + rails 構成パターンまとめ。](http://qiita.com/takayukishmz@github/items/d0e86184fc35ab1a825c)
cakephp3 のエラー対処（トラブルシューティング）※随時更新予定

### cakephp3を下記環境で構築した際のトラブルシューティングメモ

- CentOS7: CentOS Linux release 7.1.1503 (Core)
- php7: PHP 7.0.3 (cli) (built: Feb 3 2016 10:42:03) ( NTS )
- php-fpm: PHP 7.0.3 (fpm-fcgi) (built: Feb 3 2016 10:43:12)
- nginx: nginx version: nginx/1.6.3 ★古い
- MySQL: Server version: 5.6.29 MySQL Community Server (GPL)
- Cakephp3.2


### *case1* phpのセッションファイルのパーミッションがおかしい
Warning (2): session_start(): open(/var/opt/remi/php70/lib/php/session/sess_72ktdepo5s76k8qmgjsengld40, O_RDWR) failed: Permission denied (13) [CORE/src/Network/Session.php, line 324]

対処...

```
$ chown -R root:nginx /var/opt/remi/php70/lib/php/session
```
※適宜環境によってパーミッション合わせる。
Ｃプリプロセッサのマクロを含んだデバイスツリーをコンパイルする



Xilinx社の Zynq や Altera社の Cyclene V SoC などの ARM プロセッサをターゲットにした Linux カーネルをブートする時、Device Tree Blob(DTB)が必要になります。

通常は Linux カーネルをビルドする際に自動的に DTB も生成されるのですが、なんらかの事情で自力でコンパイルする必要が生じることもあります。

その際、たまに Device Tree Source(DTS)にCプリプロセッサのマクロ(#include や #define)を使っているものがあります。例えば、Altera社の Cyclone V SoC を使った DE0-Nano-SoC 用の Device Tree Source(socfpga_cyclone5_sockit.dts)など。

このような Device Tree Source(DTS) を Device Tree Compiler(dtc) を使ってコンパイルする時は次のようにします。

````shell
gcc -E -P -nostdinc -undef -x assembler-with-cpp -I $(LINUX_KERNEL_SRC)/arch/arm/boot/dts -I $(LINUX_KERNEL_SRC)/include $(DTS_SRC_FILE) | dtc -I dts -O dtb -i $(LINUX_KERNEL_SRC)/arch/arm/boot/dts -o $(DTB_OUT_FILE)
`````

 - $(LINUX_KERNEL_SRC) には Linux カーネルのソースコードのディレクトリを指定します。
 - gcc の -E オプションで C Preprocessor のみを使うことを指定します。
 - gcc の -P オプションで #line 指示子を生成しないよう指示します。そうしないと後段の dtc でエラーになります。
 - gcc の -nostdinc オプションで標準インクルードディレクトリを無効化します。
 - gcc の -undef オプションで組み込みマクロを無効化します。例えば 'linux' という単語が定数に置換されるのを防ぎます。
 - gcc の -x assembler-with-cpp で、Device Tree Source(DTS)に含まれる #から始まる文(#address-cellsや#size-cells)をエラーにしないようにします。これをつけないと元々あった#から始まる文が削除されてしまいます。
 - gcc の -I オプションで **gccが** インクルードするパスを指定します。ここでは Linux カーネルのソースコードに含まれる Device Tree Source のパスと、Linux カーネルのインクルードパスを指定しています。
 - dtc の -I オプションで入力フォーマットを指定します。ここでは Device Tree Source(dts)を指定しています。
 - dtc の -O オプションで出力フォーマットを指定します。ここでは Device Tree Blob(dtb)を指定しています。
 - dtc の -i オプションで **dtcが** インクルードするパスを指定します。ここでは Linux カーネルのソースコードに含まれる Device Tree Source のパスを指定しています。
 - dtc の -o オプションで出力するファイル名を指定します。
knockout.js よく使うbindingのパターン

この記事では<b>knockout.js</b>でよく使うbindingのパターンを列挙しました。knockout.jsの使い方にある程度理解のある方が、久しぶりに使うときに思い出すための備忘録として活用いただければ幸いです。また<b>jQuery文法の利用を前提</b>としています。

#基本
```html
<div id="container"></div>
<script>
var vm = {};
vm.name = ko.observable("abcde");
vm.email = ko.computed(function(){
  return vm.name() + "@gmail.com";
});
vm.isProgrammer = ko.observable(true);
vm.job = ko.observable("job");
vm.languages = ko.observableArray([
  {value:"jp", label:"Japanese"},
  {value:"en", label:"English"}
]);
vm.language = ko.observable("jp");
ko.applyBindings(vm, $("#container")[0]);

</script>
```
#text, html
```html
<div data-bind="text:email"></div>
<div data-bind="html:name"></div>
```

#value
```html
<input type="text" data-bind="value:name" />
<textarea data-bind="value:name" />
```
#checked
```html
<input type="checkbox" data-bind="checked:isProgrammer" />

<input type="radio" name="job" value="programmer" data-bind="checked:job"/>
<input type="radio" name="job" value="tester" data-bind="checked:job"/>
```
#options, optionsText, optionsValue
```html
<select data-bind="value:language, options:languages, 
 optionsValue:'value', optionsText:'label' />
```
#attr
```html
<a data-bind="attr:{href:'www.google.com'}}></a>
```

#jqueryui
```html
<button type="button" data-bind="jqueryui:{widget:'button', 
 options:{disabled:!dirty()}}, click:save">保存する</div>
```
別途、jquery-ui(jqueryのui部品), knockout-jquery-ui-widget.js(knockoutjs拡張)が必要です。
https://jqueryui.com/
https://gist.github.com/medmunds/889400
[CentOS 7] 既存LVMスワップパーティションを使用できるようにする

# この文書には何が書いてあるの？

CentOS 7にハードディスクを増設しました。
このハードディスクは新品ではなく、他のCentOSで使用していました。
LVMパーティションが切られていて、スワップ領域もあります。
このスワップ領域を使用できるようにしました。

同じ作業をするようなひとはほとんどいないと思われますが、メモ代わりに。

# 作業手順

## (ステップ1) LVMのLogical Volumeを調べる

`lvscan`コマンドです。

```
# lvscan
  ACTIVE            '/dev/centos/swap' [3.88 GiB] inherit
  ACTIVE            '/dev/centos/home' [94.62 GiB] inherit
```

swap領域の名前は/dev/centos/swapでした。

## (ステップ2) mkswapする

```
# mkswap /dev/centos/swap
```

## (ステップ2) swaponする

```
# swapon /dev/centos/swap
```

できたかどうか見てみます。

```
# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-0                               partition       4063228 0       -1
# free
              total        used        free      shared  buff/cache   available
Mem:        4047000       99084     3809952        8648      137964     3778040
Swap:       4063228           0     4063228
```

## (ステップ4) /etc/fstabに追記する

再起動しても使用できるように `/etc/fstab` ファイルへ追記します。

まずUUIDを調べます。`lsblk`か`blkid`コマンドで調べられます。

```
# blkid /dev/centos/swap
/dev/centos/swap: UUID="84638646-2b7d-4022-b1e1-bc03426279f7" TYPE="swap"
```

調べたUUIDを `/etc/fstab` ファイルに追記します。

```text:/etc/fstab
UUID=84638646-2b7d-4022-b1e1-bc03426279f7 swap                    swap    defaults        0 0
```

## (ステップ5) リブート

うまくできたかどうか、試しにリブートしてみます。

リブート後 `free` や `swapon` コマンドで見てみて、ちゃんとスワップ領域があればOKです。

お疲れ様でした。
arduinoでレブカウンター

#概要
arduino nanoでレブカウンターやってみた。
#写真
![MVC-020S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/e9ce1637-d0ce-0950-ee31-bcabe3666584.jpeg)

#回路図
![count0.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/77049aed-0be2-7922-f2dc-51f7cf619955.jpeg)

#サンプルコード
```
#include <Ts206.h>

Ts206 lcd(10, 9, 7);
volatile uint16_t rpm = 0;
volatile unsigned long previous = 0;
volatile uint8_t pstate = 0;
ISR(PCINT0_vect)
{
	uint8_t state = (PINB >> PINB0) & 0x01;
	if (state != pstate)
	{
		if (state != 0)
		{
			unsigned long current = micros();
			unsigned long elapsed = current - previous;
			previous = current;
			rpm = (uint16_t) (60 * 1000000UL / elapsed);
		}
		pstate = state;
	}
}
void setup()
{
	Serial.begin(115200);
	int i;
	lcd.begin();
	lcd.disp(1, ' ');
	lcd.disp(2, ' ');
	lcd.disp(3, ' ');
	lcd.disp(4, ' ');
	lcd.disp(5, 'H');
	lcd.disp(6, 'E');
	lcd.disp(7, 'L');
	lcd.disp(8, 'L');
	lcd.disp(9, 'O');
	pinMode(8, INPUT);
	PCMSK0 = (1 << PINB0);
	PCICR = (1 << PCIE0);
}
void loop()
{
	byte a;
	Serial.print(rpm);
	Serial.println("");
	if (rpm > 100)
	{
		a = rpm / 10000;
		a += 48;
		lcd.disp(5, a);
		rpm %= 10000;
		a = rpm / 1000;
		a += 48;
		lcd.disp(6, a);
		rpm %= 1000;
		a = rpm / 100;
		a += 48;
		lcd.disp(7, a);
		rpm %= 100;
		a = rpm / 10;
		a += 48;
		lcd.disp(8, a);
		rpm %= 10;
		a = rpm;
		a += 48;
		lcd.disp(9, a);
	}
	delay(500);
}
```