OmniAICreator/Qiita-1.07M huggingface dataset:
VisualStudioCodeのデバッグでどうしてもブレークで止まらない場合 (PHP Xdebug)

<font color=red>【追記】2018/04/12(木)</font>
`1.22.1` のバージョンアップでふと確認した所、 `stopOnEntry` を指定しなくてもちゃんと止まるようになっていました。
この記事を書いた際のバージョンが `1.20.1` で、こちらでも再度試したらちゃんとブレークポイントを設定した所で止まりましたので、何か他に原因があったのかもしれません。

#結論
`"stopOnEntry": true`を加えたら止まるようになりました。

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "stopOnEntry": true,
            "log": true,
            "pathMappings": {
                "/var/www/html": "${workspaceRoot}"
            }
        }
    ]
}
```

#原因
よくわかりません。
これまで、`Visual Studio Code`でデバッグしたことは無く、設定なども見よう見まねでやっていたのですが、どうしてもうまく行かず、[PHP Debug - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug#overview)の`Supported launch.json settings:`を見ていたところ、`stopOnEntry`の記述があり、試したら先頭で止まるようになりました。
先頭で止まったら、その後はブレークポイントでも止まるようになりました。
`NetBeans`ではすんなりデバッグできましたので、後一歩何かが足りないのだろうという状況でした。

#Xdebugでうまく行かないと言う時に確認する所
`PHP`はずっと昔にちょっと使った程度で、ほとんど知識がありません。
とりあえず自宅環境で`Vagrant`で適当に環境構築を進めましたが、色々と知らなすぎて、どこが悪いかも最初は把握するのに苦労しました。

今回の環境は`Windows 7`、`Vagrant`で`centos/7`のboxを使用。
記事を参考にまずは`PHP`のインストールと`Xdebug`をインストール。
その後、、、

**1. ともかく、`<?php phpinfo(); ?>`を実行させて結果を見る**
サーバー側で `php -i`の結果を`grep`などで確認してもよいかもしれませんが、ブラウザで見れた方が勝手が良いかと思いますので、ここでアドレスやらポートやらの確認を。
そして、Xdebugが有効になっているか確認を。
次の表示での`with Xdebug`の部分が出ていればXdebugは読込まれています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/a5c79733-c828-048c-2dd4-7558016d98e0.png)
（※最初`zend_extension=xdebug.so`の指定が間違えているのではと悩みました）

**2. そもそも設定はどこにあるのか**
何かしらの記事を参考にしていると環境によってパスが異なるので、自分の環境のどこにファイルがあるのかわからない場合もあるかと思います。
`phpinfo()`の結果かもしくは`php -i`の結果で、`Loaded Configuration File`の部分がそもそもの`php.ini`のありか。
他、`Additional .ini files parsed`に`xdebug.ini`があるかと思いますので、ブラウザでとにかく`xdebug`で検索してみるか、`php -i | grep xdebug.ini`などで確認するとわかるんじゃないかなと思います。

**3. xdebug.remote_port は 9000で**
これはちょっと恥ずかしい話ですが、現状`9000`以外の設定で行なうとうまくいっていません。`NetBeans`の方でもです。
なので、特別な事情でもなければ、ともかくデフォルトの`9000`で行った方が無難そうです。

**4. xdebug.remote_host もいっその事設定しない**
`xdebug.remote_host`はxdebugを送信側として、受信側のアドレスとなるようなので、デバッグを行なうクライアント側のアドレスを入力すればよく、`phpinfo();`での`$_SERVER['REMOTE_ADDR']`の値を設定すればよいのだと思いますが、よくわからなければ、`xdebug`の設定を`xdebug.remote_connect_back = 1`とすれば、何とかなるかと思います。
逆に、`xdebug.remote_connect_back = 1`でダメな場合もあるようなので注意。

**5. Apacheの再起動を忘れずに**
`sudo systemctl restart httpd`など、`Apache`の再起動を忘れずに。
設定変更してこれを忘れて、うまく行かずに、別の設定を試すと言う事をしてしまうと迷宮まっしぐらです。

**6. 結局行き着いた設定**
最終的に、自分の環境では次のように設定しています。

```ini:/etc/php.d/15-xdebug.ini
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
```

これで、`NetBeans`も`Visual Studio Code`でもデバッグできるようになりました。
`"stopOnEntry": true`で止まるようになるまでが長い道のりでした。

以上

#参考にした記事など
- [CentOS6／CentOS7にPHP5.6／PHP7をyumでインストール - Qiita](https://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e)
- [VisualStudioCode + Vagrant + XdebugでPHPをリモートデバッグ - Qiita](https://qiita.com/ushi_d/items/f4b5af012725728842d7)
- [Vagrant上のPHPを Xdebug + NetBeans（おまけでVisual Studio Codeでも）でリモートデバッグする - YoshinoriN's Memento](https://yoshinorin.net/2016/09/14/vagrant-php-xdebug/)
Javaで【ゼロから作るDeep Learning】1.とりあえず、微分と偏微分

##はじめに
「ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装」という書籍がある。2回読んだが、まあ、分かったようなぁ～、分からないようなぁ～
そもそもPythonで実装しているため、Java開発者としては、なんか誤魔化されているような気がする。動的型付けのため、呼び出す側が何を渡すかで、同じメソッドの引数が、時に数字であり、時に配列であり、、、トリッキーすぎる、、
~~素直にDeeplearning4jの学習すればよいものを、~~「そうだ、Javaで実装してみよう」と相成りました。実装するだけのため、解説は書籍をご参照下さい。

##とりあえず、微分
そもそもJavaで微分や勾配が実装できるのか(P97 4.3 数値微分/P03 4.4 勾配)。できなければ、どうにもなりそうにないので、とりあえず実験してみた(Java8以降)。

```java:ArrayUtil.java
private static double h = 1e-4; // 非常に小さい数
public double numericalDiff(DoubleUnaryOperator func, double x){
	return (func.applyAsDouble(x + h) - func.applyAsDouble(x-h))/ (2*h);
}
```

テストの内容は、P103。書籍通りのため、いけてる、と見なす。

```java:ArrayUtilTest.java
@Test
public void numericalDiff1(){
	assertThat(target.numericalDiff(p-> p*p+4*4, 3.0), is(6.00000000000378));
	assertThat(target.numericalDiff(p-> 3*3+p*p, 4.0), is(7.999999999999119));
}
```
##つづいて偏微分
書籍のP104を実装。~~書籍(Python)の実装では、元の値をtmp_val に代入して、計算後、元の値に戻している。しかしそれをJavaでやると、参照先が同じため、結局元データが変更される。そのため、深いコピーを使用して、元データを保持している。~~ → 代入直後に計算すれば、問題ないとコメントをいただきました。ごもっともです。

```java:ArrayUtil.java
private static double h = 1e-4; // 非常に小さい数
public double[][] numericalGradient(ToDoubleFunction<double[][]> func, double[][] x){

	int cntRow = x.length;
	int cntCol = x[0].length;

	double[][] result = new double[cntRow][cntCol];
	for (int i=0; i < cntRow; i++){
		for (int j=0; j < cntCol; j++){

			double[][] xPlus = deepCopy(x);
			xPlus[i][j] = xPlus[i][j] + h;

			double[][] xMinus = deepCopy(x);
			xMinus[i][j] = xMinus[i][j] - h;

			result[i][j] = (func.applyAsDouble(xPlus) - func.applyAsDouble(xMinus))/ (2*h);
		}
	}

	return result;
}

public double[][] deepCopy(double[][] x){
	double[][] copy = new double[x.length][];
	for (int i = 0; i < copy.length; i++){
		copy[i] = new double[x[i].length];
		System.arraycopy(x[i], 0, copy[i], 0, x[i].length);
	}
	return copy;
}
```

テストの内容は、P104。同じく、書籍通りのため、いけてる、と見なす。

```java:ArrayUtilTest.java
@Test
public void numericalGradient(){

	ToDoubleFunction<double[][]> function = p-> p[0][0] * p[0][0] + p[0][1]*p[0][1];
	double[][] x = {{3,4}};
	double[][] result = target.numericalGradient(function, x);

	assertThat(result[0][0], is(6.00000000000378));
	assertThat(result[0][1], is(7.999999999999119));

	result = target.numericalGradient(function, new double[][]{{0,2}});

	assertThat(result[0][0], is(closeTo(0.0, 0.000001)));
	assertThat(result[0][1], is(closeTo(4.0, 0.000001)));
}
```

## おわりに
微分、偏微分は大丈夫そうである。
ちなみに、一応全部?実装しました。問題はPCが遅くて、最終的にちゃんとした結果を出力しているのか、検証できないorz
< Ctrl-h > delete カスタム (jupyter-vim-binding)

Jupyter上でVim操作を扱えるプラグインである <a href="https://github.com/lambdalisue/jupyter-vim-binding">jupyter-vim-binding</a>。使われている方も多いと思われます。
しかし、普段VimでInsertモードの状態で一つ前の文字を消したい(Backspace)ときに標準ではJupyter上で機能しません。
(※現在は納入モード中に入力した文字なら\<Ctrl-h\>で削除できますが、一度挿入モードを抜けるとそれまでに入力していた文字は\<Ctrl-h\>で消せなくなっています。)
自分はブラウザの機能が動作します。（履歴の表示など）

この症状を解決するためにキーのカスタムをしましたので以下に載せて置きます。

# 準備
なお、`~/.jupyter/custom/`のディレクトリが存在しない方は新たに作成してください。

```
$ mkdir -p ~/.jupyter/custom
```

# コード
そして、`~/.jupyter/custom/custom.js`に新たに以下のコードを書きます。

```
// ~/.jupyter/custom/custom.js

require(
  [
    'nbextensions/vim_binding/vim_binding',
  ],
  function() {
    /***** start *****/
    // 挿入モードで<Ctrl-h>でBackspaceを実行
    CodeMirror.Vim.defineAction('[i]<C-h>', function(cm) {
      // カーソルの位置を{行, 文字数}で返す
      var head = cm.getCursor();
      CodeMirror.Vim.handleKey(cm, '<Esc>');      // Inesrt Modeから出る

      // 現在のカーソルがある行の文字数
      var last = cm.getLine(head.line).length;

      CodeMirror.Vim.handleKey(cm, 'x');          // 最後の行を削除する
      if (head.ch === last){                  // カーソルが最後の文字か
        CodeMirror.Vim.handleKey(cm, 'a');        // 後ろに挿入
      } else {
        CodeMirror.Vim.handleKey(cm, 'i');        // 前に挿入
      }
    });
    CodeMirror.Vim.mapCommand("<C-h>", "action", "[i]<C-h>", {}, { "context": "insert" });
    // ref
    //   https://github.com/lambdalisue/jupyter-vim-binding/wiki/Customization
    /***** end *****/
  }
);

```

ただ、上のコードでは\<Ctrl-h\>を実行するたびに一度Escによって挿入モードから出ているので、もし\<Ctrl-h\>で連続して消してUndo("u")する場合は一文字ずつもどされる。

※ Backspaceのキーマップを見つけられなかったので知っている方は教えてください。おねがいします。
Atom w/ Nuclideで.gitignore対象のファイルをツリーに表示する

# はじめに
Atomのファイルツリーに、.gitignoreの管理化に入れたファイルを表示したい。
ググったところ `tree-view` packageの設定を変える方法がヒットしましたが、Nuclideを入れた環境ではtree-viewはIncompatible Packageとして扱われてそもそもenableにできず。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17330/c33ba544-dd0d-6197-bed8-4ec8e38f228e.png)

Core Settingの方で設定が出来たので、メモ。


# 環境
- ATOM: 1.24.0 x64
- Nuclide: 0.283.0

# 設定方法
Settings -> Core -> Exclude VCS Ignored Paths でチェックを外します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17330/59e276f8-8d2c-ba04-51ba-852f68b1748f.png)

# 参考
- [.gitignore files being hidden and no way to allow in file tree · Issue #917 · atom/tree-view](https://github.com/atom/tree-view/issues/917)
関係修飾子(solidity)


##可視性修飾子
いつどこで関数を呼び出すかをコントロールするもの

- private:コントラクト内の別の関数からのみ呼び出される
- internal:private修飾子に似ているがそのコントラクトを継承したコントラクトからも呼び出す事ができる。
- external:修飾詞はコントラクト外からだけ呼び出す事ができる
- public:コントラクト内部・外部どちらからでも呼び出せる

##状態修飾子
関数がブロックチェーンとどのように作用し合うのか示してくれるものもある。

- view:関数が動作しても、なんのデータも保存または変更されない
- pure:関数がブロックチェーンにデータを保存しないだけでなく、ブロックチェーンからデータを読み込むこともないと表している

どちらもコントラクト外部から呼び出された場合はガスは必要ない。（But:コントラクト内にある別の関数から呼び出されるとガスが必要となる。）

- modifier:カスタム

修飾詞の関数への影響の仕方を決定するための、カスタムした理論を定義できる。

- payable修飾詞:Etherを受け取ることができる特別なタイプの関数

イーサリアムでは、お金(Ether)もデータ(トランザクションの内容)も、コントラクト・コード自体も全てイーサリアム上にあるから、ファンクション・コール及びお金の支払いが同時に可能。
ElasticBeanstalk の .ebextensions 上で、rootユーザで環境変数を使う方法

# 方法

以下のコマンドを実行するシェルの先頭で実行する

```.sh
. /opt/elasticbeanstalk/support/envvars
```

`/opt/elasticbeanstalk/support/envvars` には、ElasticBeanstalk で設定した環境変数をexportするコマンドが書かれている


# 参考

[View Environment Properties For an Elastic Beanstalk Instance](https://aws.amazon.com/jp/premiumsupport/knowledge-center/view-environment-properties-elastic-beanstalk/)
マインクラフトでプログラミングやってみました(Microsoft MakeCode for Minecraft)

# 前提
マインクラフトで遊んだことがあってワールドぐらいは作れる人を対象としています。
マインクラフト内でプログラミングをはじめるためのCode Connectionの利用開始に関する内容です。

# MakeCode for Minecraftとは

micro:bitやScratchなど教育向けにプログラミング開発するための環境です。
Microsoftから提供されています。

Minecraftは有料ですが、この環境に必要なCodeConnectionは無料で利用可能です。
また Minecraft: Education Edition を使うことで教育者が安価で利用可能で教育対象者に無料配布することもできます。

Minecraft: Education Editionを購入するにはいろいろ条件が必要なようなので興味がある人は別途探してみてください。

# セットアップ手順

Microsoftの公式手順
~~https://minecraft.makecode.com/setup~~
https://minecraft.makecode.com/setup/minecraft-windows10

## 手順

### Step 1: Install Minecraft
マインクラフトをインストールします。公式手順には買いましょうと書いてますね。

### Step 2: Install Code Connection
Code Connection をダウンロード
~~https://education.minecraft.net/get-started/download/~~ (download先が見当たらなくなった)
https://aka.ms/meeccwin10

### Step 3: Create a Minecraft world
  1. Start
  1. Create a world
  1. Turn on cheats
  1. The world begins

マインクラフトを起動してワールドを作りましょう。
基本的には「クリエイティブ」モードにすると楽だと思います。

ワールドをつくるとき、「チートの実行」をONにしてください。
![codeconnect_cheaton.png](https://qiita-image-store.s3.amazonaws.com/0/224453/de048865-2329-87de-b3b8-9e8c0a7c97d7.png)

### Step 4: Start Code Connection

インストールしたCode Connectionを起動すると以下の画面が出ます。
クリップボードへのコピーボタンがあるので押しましょう。
![codeconnect.png](https://qiita-image-store.s3.amazonaws.com/0/224453/7a80aba4-4741-ccfd-b7b8-56ca9fd5a13b.png)

マインクラフト内で「T」キーでチャットモードにしてコピーしたコマンドを貼り付けて発言ボタンもしくはEnterキーを押しましょう。
![codeconnect_command.png](https://qiita-image-store.s3.amazonaws.com/0/224453/e42d50aa-46d2-a772-9e96-540bc34ae773.png)

成功すればこのようなAgentが現れます。
![codeconnect_agent.png](https://qiita-image-store.s3.amazonaws.com/0/224453/429dc9a7-7c1b-d79e-d687-6930c90ebf6f.png)

### Step 5: Gameplay with your code
Code Connection側はメニューに切り替わります。「MakeCode」選択します。
他のエディターも試してみたい。
![codeconnect_menu.png](https://qiita-image-store.s3.amazonaws.com/0/224453/5ea7b291-b03a-a749-89b8-bd990f2cf306.png)

コーディングするための画面のホームです。
![codeconnect_makecodetop.png](https://qiita-image-store.s3.amazonaws.com/0/224453/5db0611f-9fb7-29d5-254f-68609ccc3fd2.png)

好きなチュートリアルを選びましょう。ここではニワトリ雨を選択しました。
![codeconnect_tu.png](https://qiita-image-store.s3.amazonaws.com/0/224453/a156b348-2d47-92b3-ef19-4fc3cdceb485.png)

コーディングのイメージ(あらかじめ組み立てられている状態でした)が表示されている状態にする
![codeconnect_chicken.png](https://qiita-image-store.s3.amazonaws.com/0/224453/2452c409-89a9-cdd2-3565-3dfdead1a2b0.png)

マインクラフトに戻ってチャットに「chicken」と入力して発言ボタンもしくはEnterキーを押しましょう。
![codeconnect_chickencommand.png](https://qiita-image-store.s3.amazonaws.com/0/224453/4b672b54-2355-f409-f3d5-262c81be2557.png)

実行結果!!!
![codeconnect_run.png](https://qiita-image-store.s3.amazonaws.com/0/224453/52098991-c42b-2aea-0c5c-ee7b5a2560dd.png)
TouchDesigner 複数ビルドを共存させる+α

Experimental Build 2018.20100 がリリースされ、Hokuyo CHOP試そうよなんて友人と言ってまして、ところで前に自分でもやってた異なるバージョンのビルドの共存ってどうやってたんだっけと思い出せず[フォーラムで教えてもらいました](https://touchdesigner.slack.com/archives/C087UCZ39/p1519436768000106)のでメモです。

## 手順（StableバージョンとExperimentalバージョンの例）

* Stableバージョンをインストールする。
* `C:\Program Files\Derivative\TouchDesigner099_STABLE`というディレクトリを作って、インストールした`C:\Program Files\Derivative\TouchDesigner099`をディレクトリごとコピーする。
* Experimentalバージョンをインストールする（この時点でTouchDesigner099ディレクトリにはExperimentalバージョンが入っている）。
* `C:\Program Files\Derivative\TouchDesigner099_EXPERIMENTAL`というディレクトリを作って、インストールした`C:\Program Files\Derivative\TouchDesigner099`をディレクトリごとコピーする。
* デスクトップにそれぞれのショートカットを作成する。

以下はフォーラムでお返事をくれたIdzard KwadijkさんがVincent Houzさんに教わったというナイスな小技。

* Explorerで`C:\Users\YOURUSERNAME\AppData\Roaming\Microsoft\Windows\SendTo`を開き、さきほどデスクトップに作った2つのショートカットをその中にコピーする。
* これで .toeファイルの上で右クリックすると`Send to`のところに`TD Experimental`と`TD STABLE`が表示されるようになりどちらでファイルを開くか選べる。
* 名前に`_`をつけておくと、右クリック→`Send to`の頭に表示されるのでなお便利。

俺の場合は以下のようになりました。ビルドのバージョンを細かくつけたりしてもいいかもしれません。
![capture](https://qiita-image-store.s3.amazonaws.com/0/58558/09c69bff-a188-4224-6ae8-32dabc1dec1b.gif)
Wine Emulator の内部構造(ソースを読む) : Inside Wine

2018/02/24, 記述開始.

## 目次

001. [はじめに] (https://qiita.com/Yutaka_Aoki/items/aa25413efa70d451cf7b) ; 2018/03/03, 更新
002. [WINE バイナリのフォルダ構成] (https://qiita.com/Yutaka_Aoki/items/29abe2876cd53924e197)
003. [WINE ソースのダウンロード] (https://qiita.com/Yutaka_Aoki/items/88995d477285e8252570)
004. [WINE ソースのフォルダ構成(未記述)] (xxx)
010. [ビルド] (https://qiita.com/Yutaka_Aoki/items/fcf3b315ae4af37d2cce)
020. [WINEDLLPATH の不具合] (https://qiita.com/Yutaka_Aoki/items/3b61104197b22e3ccd1a) ; 2018/ 03/01, 16:40 更新
030. [未整理、色々(**必読**)] (https://qiita.com/Yutaka_Aoki/items/bdc2ec3f09f7131329e2)
040. [DLL と共有ライブラリの関係] (https://qiita.com/Yutaka_Aoki/items/f4bf53d9ead644bc8ff9)
050. [関数名など] (https://qiita.com/Yutaka_Aoki/items/6d7a738f75f07de426fb)
060. [HWNDと関連データ] (https://qiita.com/Yutaka_Aoki/items/383fb24142b35cfefd48)
065. [Window の生成] (https://qiita.com/Yutaka_Aoki/items/f92e1abc4b3ea4de1e43)
070. [WM_MOUSEMOVE メッセージの生成] (https://qiita.com/Yutaka_Aoki/items/9f9715d8926aff89572e)
080. [MDI Child Window のタイトルバーのドラッグ] (https://qiita.com/Yutaka_Aoki/items/7f58ce27465013017511)
090. [PHYSDEV] (https://qiita.com/Yutaka_Aoki/items/7394d11a5eb7d39b5bed)
100. [surface] (https://qiita.com/Yutaka_Aoki/items/928faa1a5e7f0bcf2be7)
110. [HDC, DC, DCE, HWND の関係] (https://qiita.com/Yutaka_Aoki/items/49a0ea7fea48ab6fbbaf) ; 2018/03/09, 更新
120. [透明色] (https://qiita.com/Yutaka_Aoki/items/5b107b197476c5e06693)
300. [本物の regedit を使う] (https://qiita.com/Yutaka_Aoki/items/7070cdcc5b9393389470)
305. [本物の regsvr32 を使う] (https://qiita.com/Yutaka_Aoki/items/9655d714519797967c2e)
310. [VS付属の windiff を使う] (https://qiita.com/Yutaka_Aoki/items/a5d598195df04e00eacf)
400. [MSDN Library(CD-ROM) のインストール法] (https://qiita.com/Yutaka_Aoki/items/a83371ebf5c1e967a6f6) ; 2018/03/04, 21:40, 更新（「戻る」ボタン以外は、ほぼ完全に動作できるようになった）
401. [How to install MSDN Library(CD-ROM)] (https://qiita.com/Yutaka_Aoki/items/a145f5499f5d1894b8c4) ; 2018/03/03, updated.
500. [system32の元に戻し方] (https://qiita.com/Yutaka_Aoki/items/f0202d3d08da862c4e78)
600. [独自修正Wineの配布] (https://qiita.com/Yutaka_Aoki/items/68ac7716a36a0543f578)



## 関連リンク

[実験に基づくgitのローカル開発:WINE Emulatorを例に] (https://qiita.com/Yutaka_Aoki/items/f4efe8a176be579028b3)
ruby にとても長い式を食べさせると死ぬ

[整数を419378回インクリメントするとMacのg++が死ぬ](https://qiita.com/kaityo256/items/6b5715b213e955d44f55)
や
[C++でアスタリスクをつけすぎると端末が落ちる](https://qiita.com/kaityo256/items/d54439246edc1cc58121)
にインスパイアされて。

ruby で

`(((((1)))))`
`[[[[[1]]]]].flatten[0]`
`1+1-1+1-1+1-1+1-1+1-1`
`1.to_s.to_s.to_s.to_s.to_s`
`p(aaaaaaaaaaaaaaaaaa=1)`
`!!!!!!!!!1`
のような式を食べさせて、どれぐらいで死ぬのか調べてみた。

環境は macOS High Sierra。メモリ 16GB。
ruby は ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]。

# `(((((1)))))`

```ruby:ruby2.5
a = [*1..20000]
p(a.bsearch do  |n|
  s="p"+"("*n+"1"+")"*n
  puts "#{n}"
  "1" != %x( ruby -e "#{s}" ).strip
end)
#=>9995
```

死ぬときは `memory exhausted` で死ぬ。
何かが一万ピッタリになって死んでいるのかもしれないと思わせる感じだけど、どうなんだろう。

# `[[[[[1]]]]].flatten[0]`

```ruby:ruby2.5
a = [*1..20000]
p(a.bsearch do  |n|
  s="p "+"["*n+"1"+"]"*n + ".flatten[0]"
  puts "#{n}"
  "1" != %x( ruby -e "#{s}" ).strip
end)
#=>9994
```

死ぬときは `memory exhausted` で死ぬ。

`(((((1)))))` よりひとつ少ないのは、余計な `.flatten[0]` がついているからかな。

`[]` の方が重そうな感じがしたけど、`()` と同じだったということだと思う。

# `1+1-1+1-1+1-1+1-1+1-1`

```ruby:ruby2.5
a = [*1..20000]
p(a.bsearch do  |n|
  s="p( 1" + "+1-1"*n + ")"
  puts "#{n}"
  "1" != %x( ruby -e "#{s}" ).strip
end)
#=>10027
```
一万を僅かに超えてきた。というか、"1" や 演算子の数で言うと二万ちょっと。
死んだ理由は `stack level too deep (SystemStackError)` なので、設定を変えるともっと行けるんだと思う。

# `1.to_s.to_s.to_s.to_s.to_s`

```ruby:ruby2.5
a = [*1..20000]
p(a.bsearch do  |n|
  s="puts(1"+".to_s"*n+")"
  puts "#{n}"
  "1" != %x( ruby -e "#{s}" ).strip
end)
#=> 19911
```

こちらも死んだ理由は `stack level too deep (SystemStackError)` 。
`+1` などがメソッド呼び出しであることを思うと `.to_s` の数は 10027×2 ぐらいになるかと思ったんだけど、そうでもない。オーダーとしてはその程度だけど、誤差が大きい気がする。
謎。

# 長い変数名

```ruby:ruby2.5
a = [*1..100000000]
p(a.bsearch do  |n|
  File.open( "hoge.rb", "w" ){ |f| f.puts( "p("+"a"*n+"=1)" ) }
  puts "#{n}"
  begin
    "1" != %x( ruby hoge.rb ).strip
  rescue
    true
  end
end)
#=> nil
```

変数名の長さ一億文字でも大丈夫だった。
それ以上は試していない。

# `!!!!!1`

```ruby:ruby2.5
a = [*1..1000_0000]
p(a.bsearch do  |n|
  s="p "+"!"*n+"1"
  puts "#{n}"
  begin
    File.open( "hoge.rb", "w" ){ |f| f.puts(s) }
    !(/true|false/=== %x( ruby hoge.rb ).strip)
  rescue
    true
  end
end)
#=>9995
```

`(((((1)))))` と同じ個数になった。
そういうものか。

出るエラーも「`memory exhausted`」で同じ。面白い。


# 当初は

```ruby:ruby2.5
a = [*1..20000]
p(a.bsearch do  |n|
  s="("*n+"1"+")"*n
  puts "#{n}"
  begin
    eval( "#{s}" )
    false
  rescue
    true
  end
end)
```

というコードを書いたんだけど、 `eval` で ` memory exhausted (SyntaxError)` になると、`rescue` できずに死んでしまって測れなかった。

# いずれにせよ

いずれにせよ、現実的なソースコードでは死なないので心配ない。

それと。
端末は死なない。 ruby が死ぬだけ。

それとはあまり関係なく。
ruby 25周年おめでとうございます。
今までありがとうございます。
これからもよろしくお願いします。
【TermUX】AndroidでLinuxのソフトウェアやプログラムを使う

時はInternet of Things時代!
とはいえども､スマホは便利ですがスクリプトを書いておいて､
残りはボタンぽちっと押して終わりというプログラムの良さには敵いません｡

いかに身近な端末でプログラムを動かすかについて調べているのですが､
root取得不要かつAndroid5.0以上なら格安スマホでも使えるTermUXというAndroidアプリが面白いと思っているので環境構築の手順をメモしつつ紹介します｡

# 環境構築

## 端末のストレージ設定
```
# 端末のストレージにシンボリックリンクを作成
# 内部ストレージやsdカードの利用はここで作ったシンボリックリンクから行う
# 実パスからでは書き込み時などは権限不足となってしまう模様
termux-setup-storage
# 詳しくは公式サイト
# 「Termux-setup-storage - Termux Wiki」
# https://wiki.termux.com/wiki/Termux-setup-storage
```
## Git
```
apt install git
```

## Vim
```
apt install vim
# 設定
set fileencodings=utf-8,sjis
set fileencodings=utf-8
set encoding=utf-8
# 参考
https://sites.google.com/site/fudist/Home/qfixhowm/other-service/howm-android\#TOC-Termux
# ソフトウェアキーボード利用時でもHacker's Keyboardを使えばEscキーが使えるのでなんとかなります
# 日本語使えないですが..
```

## MySQLのインストール
当初はMySQL Client Toolのみインストールしたかったのですが､
うまくいかずmariadbのインストールを経由して対応しました

```
# インストール
pkg install mariadb
# MySQLサーバーにログイン
mysql -h {hostname} -u username -p
```

下記のサイトが参考になると思います。
「1.Install Mariadb command line client on Termux – HackerMind007」
https://hackermindsite.wordpress.com/2017/09/26/first-blog-post/
参考サイトの通りにローカルにMySQLサーバーを構築した後、
サービスを停止するときは下記のコマンドで停止できます。

```
mysqladmin -u root shutdown
```

## Python(Python3)
```
#内部的にはCythonをインストールしている模様
apt install python

# ライブラリのインポートはpipが使える
pip install xxx

# Python mysql-connectorのインポート
# 下記サイトと同じくpipでインストールできない..
https://qiita.com/a_t_a/items/680ed657c4dbeab40a28
# zipをブラウザでDLし、解凍してインストールすればOK
python setup.py install
# numpyやskipyはpipでインストールができないよう｡詳しくは下記のページ｡
#「Installing Scipy The Easy Way - Termux Wiki」
# https://wiki.termux.com/wiki/Installing_Scipy_The_Easy_Way
```

numpyのインストール方法は @kokorinosoba よりインストール方法を教えて頂きました｡
「AndroidでPythonの実行環境を整える - Qiita」
https://qiita.com/kokorinosoba/items/a700cc94f3c9ef19440f
感謝｡

# 使用例
## AndroidのWidgetを使う
「Termux:Widget - Google Play の Android アプリ」
https://play.google.com/store/apps/details?id=com.termux.widget&hl=ja
有料ですが、ウィジェットから呼び出せるのでとても便利です

## Taskerから呼び出す
「Termux:Task - Google Play の Android アプリ」
https://play.google.com/store/apps/details?id=com.termux.tasker&hl=ja
まだ未検証なのですがTaskerからも呼び出せるみたいです
Tasker経由からなら色々できそうで夢が広がりますね
SourceTreeでpushしようとしたらHttpRequestExceptionが出た

#HttpRequestExceptionが出た文脈
Windows10でSouceTree 2.4.8.0を使っています。
プライベートのプロジェクトでコミットして、Pushボタンを押したら"HttpRequestException"が出てきました。
もう一度Pushを押してみるとポップアップが開いてGitHubへログインを求められた。
ユーザ－ネームとパスワードを打ち込んでみるも結果は変わらず。
GitHubでログアウト → ログインしてみたのでパスワードは間違っていない。。。

###エラー内容
```
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags origin master:master
fatal: HttpRequestException encountered.
   An error occurred while sending the request.

remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/xxxx/yyyy.git/'

Pushing to https://github.com/xxxx/yyyy.git
Completed with errors, see above.
```

#どうやって解決したのか。
1. SouceTreeのメニューのAction → "Open in Terminal"
2. Git bashが開く
3. Git bashで"git push"
4. 再びGitHubへログインを求めるポップアップが出たのでログイン
5. Pushできた。
6. SouceTreeを開きなおして確認すると、Pushボタンから未プッシュを示すアイコンバッチが消えてる

~~すぐに解決したけど、なんだったのだろう？~~
(2018/02/25 追記：
再びPushしようとしたら同様のエラーが出ました。
根本的な解決にはなっていませんでした。
)

#解決法（2018/02/25 さらに追記)
[まったく同じ症状を解決された方がおりました。](http://funct.hatenablog.com/entry/2018/02/23/154553)
上記ブログの最後にある通り、Git Credential Managerの最新版（GCMW-1.14.0.exe）をインストールしたらSourceTreeでPushできるようになりました。
Laravelでgeometry型のカラムがあるテーブルのマイグレーションでエラーになったときの対処メモ

マイグレーション時にこんなエラーが出た。

```
Unknown database type geometry requested, Doctrine\DBAL\Platforms\MySQL57Platform may not support it.  
```

マイグレーション時に、Doctrineがgeometry型に対応していないらしく、テーブルをインポートしたときにエラーになる。

[laravel-mysql-spatial](https://github.com/grimzy/laravel-mysql-spatial)をReadmeのとおりにインストールしたら解決した。
micro:bitとProcessingでメディアアート入門

## はじめに

前回，micro:bitから値を送ってProcessingで可視化する[記事](https://qiita.com/kikpond15/items/e9256ead4779f365a1a3)をあげました．
今回はProcessingから送った値をmicro:bitで可視化するということをやります．

## オープンソースカンファレンス(OSC)
毎年[OSC](https://www.ospn.jp/osc2018-spring/)にブースを出していて，今回この記事の内容の物を展示させていただきました．
![IMG_0972.JPG](https://qiita-image-store.s3.amazonaws.com/0/191122/e11ede7f-0f06-6485-c278-e2174a94b2a0.jpeg)

## 内容
Processingのカメラで画面の赤い箇所をトラッキングして，micro:bitのLEDマトリックスでその位置を可視化します．
カメラの情報を収縮して最小限の情報をmicro:bitで表現します．

## Processing
検出する赤色のしきい値をGUIで設定出来るようにControlP5ライブラリをインポートします．
scale()で左右を反転させて鏡のようにします．
map()でxyの座標を5×5に変換してSerialでmicro:bitに送ります．
\nを入れないとmicro:bitの方で文字列として受け取ってくれないみたいです．

```java
import processing.serial.*;
import processing.video.*;
import controlP5.*;
Capture video;
ControlP5 cp5;
Serial microbit;

int red = color(255, 0, 0);
int green = color(0, 255, 0);
int blue = color(0, 0, 255);

int redVal = 200;
int greenVal = 100;
int blueVal = 100;
Slider abc;
int camW, camH;

int sendX = 0;
int sendY = 0;

void setup() {
  size(640, 580);
  camW = width;
  camH = height-100;
  video = new Capture(this, camW, camH);

  String portName = Serial.list()[1];
  println(portName);
  microbit = new Serial(this, portName, 115200);
  cp5 = new ControlP5(this);

  cp5.addSlider("redVal")//しきい値用GUIスライダー
    .setPosition(10, height-80)
    .setColorForeground(red)
    .setSize(200, 20)
    .setRange(0, 255)
    .setValue(redVal);

  cp5.addSlider("greenVal")
    .setPosition(10, height-40)
    .setColorForeground(green)
    .setSize(200, 20)
    .setRange(0, 255)
    .setValue(greenVal);

  cp5.addSlider("blueVal")
    .setPosition(260, height-80)
    .setColorForeground(blue)
    .setSize(200, 20)
    .setRange(0, 255)
    .setValue(blueVal);

  video.start();  
  noStroke();
  smooth();
}

void draw() {

  if (video.available()) {
    video.read();
    pushMatrix();
    scale(-1,1);//画像の反転
    image(video,-camW,0);
    popMatrix();
    
    int brightestX = 0;
    int brightestY = 0;

    video.loadPixels();
    int index = 0;
    for (int y = 0; y < video.height; y++) {
      for (int x = video.width; x > 0; x--) {//右端から読み込む
        color pixelC = video.pixels[index];

        if (red(pixelC) > redVal && green(pixelC) < greenVal && blue(pixelC) < blueVal) {
          brightestX = x;
          brightestY = y;
        }
        index++;
      }
    }
    fill(255, 204, 0, 128);
    ellipse(brightestX, brightestY, 200, 200);
    sendX = int(map(brightestX, 0, 640, 0, 5));
    sendY = int(map(brightestY, 0, 480, 0, 5));
    microbit.clear();
    microbit.write(sendX+","+sendY+"\n");//micro:bitにmapした座標を送る
  }
  fill(0);
  rect(0, 480, width, 100);
}

```

## micro:bit
”X,Y”の文字列で送られてくるので，「文字列の何番目の文字を整数に変換する」というようにブロックをくむ．

![スクリーンショット 2020-01-12 20.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/6d279624-2119-9c73-16be-15d75eb8511e.png)




## 実行結果
スライダーのしきい値をいじってやると安定してトラッキングできます．

![IMG_0975.JPG](https://qiita-image-store.s3.amazonaws.com/0/191122/d9553b39-17be-8d98-01d7-71f2942b5008.jpeg)

## 最後に
メディアアートと言っていいものなのか正直微妙だが，micro:bitのような教育系ボードを使った作品の取っ掛かりとなれば良いなと思います．
「いみゅーたぶるって何だ？」 - 不変であることを"保証"する意義

*現場で (Java の) String を書き換えざるを得なくなった日、表題のセリフを吐いた我が友人との会話をそれっぽく仕立てたもの。*

# 何語？ 意味は？
**英語で「不変である」。**形容詞。
そこらへんの辞書を引いても出てくるごく普通の単語[^1]そのままで、特別な意味に当てられてるわけではない。
スペルは immutable で、対義語は「変更可能」を意味するミュータブル mutable [^2] 。

# 不変って何が？ どういうこと？
目の前にダンボール箱があるとする。ガムテープでしっかりと組み立てられている。上面は開いた状態だ。
言うまでもないが、**これは簡単に運ぶことができる**。そうだろ？

さて、以下にちょっとしたプログラムを用意した。頭のなかで実行してみて欲しい。

1. 箱を開ける。
2. 箱にものを入れる。なんでもいい。
3. 箱を運ぶ。

実行した？ では質問だ。
**「もし運んでいる最中、その中に土嚢を突っ込まれても平気か？」**

# えぇ？ そんなんありかよ？ 普通ないだろ？
そう、さっきの例だと普通ありえないことに思える。**しかしプログラムではそういうふうにも書けてしまうんだ。**[^3]
そうするととてつもなく話がめんどくさくなる、ってのは想像付くだろ。
そしてプログラミングにおいて、**面倒くさいことは大抵バグの原因だ**。できるだけ減らさなければならない。

今回の箱の例で言えば、**運ぶ前に箱を閉じて、勝手にものが突っ込まれないようにすればいいわけだ。**

**中身がホイホイ変わるから、考えることが増えてめんどくさくなり、バグの元になる。**
**なら、変わらないようにすればいい**。
これが「不変」のミソなんだ。

# うーん……でも、できるのか？そんなこと。
**できる**。
極端な話、**「この名前の変数をいじってはならない」と決めて、それを完璧に守れるなら、それだけで不変は成立する。**
要するに「**こいつは変わらない**」ということを**みんながわかっていて、使う時に保証**されていればそれでいい。

ただ、現実的にはそうもいかない。大抵どこかの馬鹿が勝手に「書き換えちゃえばいいじゃん！」と馬鹿なことをやりだして崩壊してしまうし、そうでなくとも間違えて書き換える可能性がある。
だから、大抵は手段を講じて**不変性の保証**を試みる。
だいたいはどっちかだ。

1. 言語の機能を利用する。
2. 違反を見つけ出しやすい/違反すると面倒なコーディング規約を策定する。

例えば、こういうコードは 不変性を**保証**しているといえる。

```java:ex1.java
// Java でやる例。不変性を保証するための言語機能が (ややショボいが) 利用できる
// 使うときは final ImmutableExplain ie = new ImmutableExplain(1); とかやるとする
public class ImmutableExplain{
    public ImmutableExplain(Integer value){
        this.value = value;
    }
    public Integer getValue(){
        return this.value;
    }
    final private Integer value;
}
```

このクラスはコンストラクタで (=オブジェクトを作成する瞬間に) 必要な情報を受け取り、自らの中に埋め込み、そして **通常の手段では** 触れられないようにしている。おおよそ不変を保証するオブジェクトの典型例と言って差し支えないだろう。

# でもそれ、本当にどうしても "不変" じゃ困るってときがでてきたら、どうすんだ？
**それは設計がおかしい**。が、聞きたいのはそういうことじゃないんだろ。知ってる。
そういうとき、つまり本当の本当にどうしてもその "不変" を侵さなければどうしようもないときは、諦めて書き換えを行う。

できるのかって？ できるんだよ。
例えば、例に上げた Java にはリフレクションがある。これは絶対ではないが[^4]、finalフィールドだろうと書き換えることができる。

**ただし、それは明らかに通常の手段ではないとわかる方法で、非常手段を取らなければならなかった旨とその理由をコメントで書き残した上で、行われるべきだ**。
逆に言えば、**本当の本当に不変である、という保証を行うことは事実上不可能だし、必要じゃない**。
なぜなら必要なのは**普通に使う時、馬鹿により/ミスにより壊されないことを保証する**ことだからだ。**immutable は馬鹿の悪影響を減らし、ミスを減らすために存在する、最も有効な手法の一つなんだ。**

# プログラミング的な注釈
「箱」= 変数。オブジェクト (もっとも、オブジェクトとして考えるとこの「箱」はあまりいいオブジェクトではない) 。
「もの」= 変数に代入される情報。数値、文字列、その他あらゆるデータ。
「閉じた箱」= 中身を書き換えられないようにしたオブジェクト。setter を除去した JavaBean とか、Object.freeze で固めたオブジェクトとか。

[^1]: まあプログラミング界隈以外ではあんま聞かないが。
[^2]: リーガル legal と イリーガル illegal のように、頭にイが付いて否定になるタイプ。
[^3]: マジでやるやつがいるから勘弁して欲しい。
[^4]: インライン展開されてたら無理。アレ確か無理でもしれっと成功した風に動くんだよな……
cssだけで三角形を作る

# 概要
- 画像を使わずにCSSだけで、三角形の図形を作ってみる。

# 作り方
``` html:html
<div class="triangle"></div>
```
```css:css
/* 上向き矢印 */
.triangle {
  border-top : 50px solid #000000;
  border-right : 50px solid transparent;
  border-left :  50px solid transparent;
}

/* 右向き矢印 */
.triangle {
  border-right : 50px solid #000000;
  border-top : 50px solid transparent;
  border-bottom :  50px solid transparent;
}
```

# 仕組み
- ボーダーを縦と横に並べた時の、<font color="red">間にできる斜め線を利用</font>する。
- 成り立ち
    - 1. 幅50pxのボックスに、border-top, right, leftを指定する。
    - 2. 幅を0にすると、境界部分が斜めになり、三角が三つできる。
    - 3. 描きたい三角形以外を「transparent」にすると完成！

# メリット
- 画像指定に比べて、<font color="red">ページ容量が小さく</font>なり、読み込み速度が早くなる。


# 参考
- [CSSだけで三角形を作ろう！その1：borderプロパティの仕組みをマスター](https://www.granfairs.com/blog/staff/make-triangle-with-css)
- [【CSS】CSSのみで三角と矢印を作る方法](https://bagelee.com/design/css/css-triangle/)
- 使用例：[Yahoo!プレミアム](https://premium.yahoo.co.jp/campaign/travel/01/)
phpbbのデータを移行する

#はじめに
[phpbb](https://www.phpbb.com/) というフリーかつオープンソースのphp言語で作られたweb掲示板です。

元々フリーのwebサーバーで使っていたんですが、VPSで自前のwebサーバーが使えるようになったのでそちらに移行することにしましたが、調べてもそれらしいものが見つからなかったので、自分のやったことを書いてみました。

## 自分の環境
- VPS(ConoHa): Apache/2.4.6,PHP/5.6.32,MySQL/5.6.37
- フリーサーバー(Lv9無料ホスティング)

# それじゃ操作する
まずは新サーバーにphpbbをインストールします。
何も気にせずに入力したりポチポチしてればインストール完了です!
***※ここで旧サーバーでインストールした拡張機能とかテーマ(スタイル)とかをインストールしておくことをお勧めします。***

次に旧サーバー
管理者ページ>メンテナンス>バックアップ を開きます。
![png1](https://gyazo.yama2211.biz/images/gPkAfZ.png)
保管でなくダウンロードを選択します。
テーブルは全選択で送信をクリックします。

すると.sql.gzファイルがダウンロードされます。

これで旧サーバーで行う作業は終了です。

次に新サーバーの操作です。
ftpで先ほどダウンロードした .sql.gzファイル をインストールディレクトリ内にある ***store*** にぶち込みます。

ぶち込んだら 管理者ページ>メンテナンス>復元 を開きます。
ファイル選択で日付が最新のものを選択して下のデータベースの復元をクリックします。
![png1](https://gyazo.yama2211.biz/images/pdl4Xy.png)

これで移行が完了しました。
念のため問題がないかを確認しておきましょう。
特にリンクの設定とかメールの設定とか投稿されたトピック,ユーザー情報とか。

## 失敗した方法(実体験)
***この方法でも可能だと思いますが、ログインできない(旧サーバーに飛ばされた)とかありますのでお勧めしません。***

phpMyAdmin から該当のデータベースをすべてエクスポート(生成オプションをいじって)
phpbbをインストールした新サーバーのデータベースにインポート

設定でリンクとか全部変更しても、ログインからログインしようとすると旧サーバーに飛ばされます。
phpmyadminでデータベースの情報弄っても解決しませんでした。

# 終わりに
たぶんこれが一番手っ取り早いと思います。
【MySQL】時系列データの前後比較のクエリ

MySQLで為替や株価などの時系列データの比較を行うとき、サブクエリを作って無地やり解決したクエリ。
為替の値動きチェックのクエリ作成時に必要だったのでメモしておきます。
頻度高くても分1回程度のバッチ処理で走らせている処理なので、あまりパフォーマンスを考えていないので要注意です。

``` MySQL
SELECT a.TIME,a.HIGHPRICE, b.HIGHPRICE FROM {テーブル名} a
LEFT JOIN 
(SELECT TIME  + INTERVAL 1 MINUTE 'TIME' ,HIGHPRICE FROM {テーブル名}) as b
on a.TIME = b.TIME
order by a.TIME desc;
```
【チラ裏】メール受信起動からディレクトリが作れない【解決】

###チラ裏のメモ書き

```html:
2018/03/02：追記　<!-- 割と重要な X-SERVER の仕様 -->
X-SERVERでも出来た。

Cronの場合とメール転送からのパイプ処理の場合はカレントディレクトリが
ホームディレクトリになってしまうので以下のような絶対パスにするか

/home/ユーザーID/ドメイン名/public_html/path1/path2/

相対パスの場合は以下のようにするか

./ドメイン名/public_html/path1/path2/

というパス指定をしてやらないとフォルダが作れないらしい。

includeファイルについてもCronやパイプ処理の場合は同様に上記のように
絶対パスにするか相対パスにしないと読み込んでくれない。
X-SERVERにはscriptディレクトリがpublic_htmlディレクトリの上位にあるのだが一般的に言う
includeディレクトリに当たる。(別にincludeディレクトリ作ってもいい)

その場合のパスの通し方は以下のようになる。

絶対パス
/home/ユーザーID/ドメイン名/script/
/home/ユーザーID/ドメイン名/include/

相対パス
./ドメイン名/script/
./ドメイン名/include/

これは公式にX-SERVERの仕様であると回答があったのでX-SERVERで
メール転送パイプ処理やCronを設定していて動かねー！ってなった人は
参考にして欲しい。ここまで辿り着くのに数日かかった・・・。
```

**※なんか知らんがX-SERVERだと出来ない、kagoyaだと出来た。**
2018/02/27：追記
X-SERVERに問合せしたら実行ファイルのパーミッション0705にしてくれと回答が来たけど0705にしても0777にしても失敗する。他のディレクトリのパーミッションを0777にしても作れない。kagoyaだと実行ファイルのパーミッションが0604でも作れる。kagoyaでパーミッションをイジったりはしてないけど作れる。X-SERVERの何が悪いのか解らん。これはユーザー側の問題なのか、サーバー側の問題なのか、php.iniとかの問題なのか、切り分けが全くできない。ボスケテ


#ディレクトリが作成されない問題【解決】
1. XServerのメール振り分け機能で`hoge@foo.jp`宛のメール受信を転送して`post.php`を実行
2. `post.php`は実行されていてデータベースへ必要なデータは保存されている
3. `mkdir();`でディレクトリを作成しようとするがディレクトリの作成に失敗している
4. `post.php`と`img`ディレクトリは同階層にある

```php:
// メール受信時に標準入力でメールデータを取得
    $buf = file_get_contents("php://stdin");

// データベースにメールアドレスの登録があれば$dir_idにユーザーIDを格納
    $dir_id = 'ユーザーIDを取得して格納';

// 画像格納フォルダ作成
    $dir_date = date("YmdHis", strtotime($Date));
    $dir_Add = "./img/$dir_id/";
    $dir_path = $dir_Add.$dir_date;
    if(file_exists($dir_Add)){ // 既にIDでフォルダがある場合
        if(file_exists($dir_path)){
            mkdir($dir_path, 0777, true);
        }else{
            chmod($dir_Add, 0777);
            mkdir($dir_path, 0777, true);
        }
    }else{ // フォルダ新規作成
        if(mkdir($dir_Add, 0777)){
            chmod($dir_Add, 0777);
            mkdir($dir_path, 0777, true);
        }
    }
```

作成したいディレクトリ：`./img/ユーザーID/送信日時(YmdHis)/`

1. `.txt`ファイルを読み込ませると`.txt`ファイルの`Date:`フィールドにある日時ディレクトリがちゃんと作成される

```php:
// .txtファイルでメールデータを取得
    $buf = file_get_contents("original_msg.txt");
```

`$buf`を`.txt`で取得すると思った通りの結果が出てディレクトリが作成される。
`php://stdin`で取得するとフォルダが作成されない。


問題の切り分けが全く出来ない。何が悪いのかも皆目見当が付かない深い闇にいます。


#添付画像(attachment)のbase64共通開始が解らない問題【未解決】
特定のメーラー(iPhoneデコメーラー)であれば`filename="attachment00.jpg"\n`の次から添付画像のデータが始まるので特定出来るのだが他のメーラーは違うので添付画像のデータの始まりを特定出来ない問題。


こんなチラ裏な記事にアドバイス頂けたら非常に有難いです。
ラズパイでEnOceanの環境発電型ドア開閉センサー（STM250J）の情報をPythonで拾うまで。

#動機・目的
##目的
EnOceanの環境発電型ドア開閉センサー（STM250J）の情報をラズパイで拾う。

##動機
「環境発電」という単語を最近耳にすることが多くなってきたので、環境発電を利用して何かサービスめいたものが作成できないか検討する途中で、EnOceanの製品をご紹介いただいので実際に使ってみようと思い立った。
#環境
ラズパイ：Raspberry Pi 3 Model B
OS：Raspbian 9
電文受信：USB400J（USB受信ドングル）
センサー：STM250J（ドア開閉センサー）

ラズパイにUSB400Jを刺してセンサーの情報を拾います。Raspbianをインストールしネットワーク設定が完了した後、各パッケージのアップデート完了後から作業を開始しています。

物は[こちら](http://shop.ermine.co.jp/shopdetail/000000000046/)で購入させていただきました。

#実施内容
##Pythonで受信した情報を見る
ラズパイに入っているPythonのバージョンは2.7.13でした。

以下のソースでUSB400Jの受信している情報を確認します。

```USB400Jtest.py
import serial
import binascii
ser = serial.Serial('/dev/ttyUSB0',57600,timeout=1)
while True:
    denbun = ser.read()
    print (binascii.hexlify(denbun))
```

実行結果は以下の通りです。センサーとマグネットを近づけたり遠ざけたりすると表示されます。

```sh
55
00
07
02
0a
0a
21
04
00
e5
59
09
1d
01
46
c0
55
00
07
02
0a
0a
21
04
00
e5
59
08
1a
01
44
ce
```
ちょっと意味不明ですが、55が始まりで下の方がセンサーの値っぽいですね。

#今後
EnOceanのドキュメントを読んで情報を意味を理解できるようになりたいと思います。
センサーは部屋の中くらいの明るさであれば使えたので十分に発電できていそうです。
PugをMacのターミナルの操作でコンパイルするまで

# 概要

Macのターミナル上で`pug compile(?) index.pug`みたいなことがしたかっただけなのに、かなりつまづいたのでメモ

# インストールの準備

下記環境が必要

* Node.js
* npm

これみてインストールしてね:open_hands:
[Macにnodejsインストール(homebrewとnを使った)](https://qiita.com/ksyunnnn/items/a7f1ffdd545cefbbcbd3)

```
npm -v
```
これに反応があればOK

# Pugのインストール（全ての悪の根源）

[公式](https://pugjs.org/api/getting-started.html)には`npm install pug`のみで良さげに書いてるけども

```
npm install pug-cli -g
```
こいつも必要だった模様

```
pug --version
```

これに反応があればOK
Ankara prefabrik evler

İkon villa son zamanlarda en fazla tercih edilen Ankara prefabrik firmaları arasında yer almaktadır. Bunun nedeni olarak kaliteli malzemeler kullanması ve yaptıkları işlerinde müşteri memnuniyeti en üst seviyede olmaktadır.

Prefbrik ev bir bina tarafından geliştirilen gönüllü uluslararası bir yapı standardıdır. Standart olarak da anılacaktır ev standardı yeni bina inşaatı için birkaç katı performans gereksinimleri oluşur.  Mevcut binaların yenilenmesi için biraz daha <b><a href="http://www.ikonvilla.com">Ankara prefabrik ev</a></b> performans standardı eğer benzer geliştirdi.

Ancak eğer bina prefabrik ev metodolojisi ile tasarlanmış ve inşa edilmiş ise villa bileşenleri içerir ancak sadece son  test sonuçları gibi gerekli kriterleri kaçırdıysanız bina ev projesi veya daha genel olarak yüksek performanslı düşük enerjili bina olarak adlandırılabilir. Tüm bunların sonucu prefabrik villa gibi aşağıdaki niteliklere sahip bir ev yapısıdır.

<b><a href="http://www.ikonvilla.com">prefabrik villa Ankara</a></b> olarak yapımında çok enerji tasarruflu  iklim krizlerine orantısız bir cevap verme çabası içinde ortalama mevcut bina stokundan ısıtma ve soğutma talebinin varan enerji tasarrufu sağlamaktadır. Uygun fiyatla yüksek performans için ilave inşaat maliyetleri boyutlandırma Ankara ili merkezi ve ilçelerinde sistemlerinde önemli ölçüde azalma ile dengelenir.  Düşük enerji kullanımı düşük faturalara ve gelecekteki prefabrik evler enerji şoklarından korunmaya dönüştüğü için doluluk uygun fiyatlı.

Tahmin edilebilir prefabrik evler Ankara entegre bir metodoloji ve enerji modeli öngörülebilirlik sağlar. Sistem boyutlandırma ve maliyetinin edilmesi için temel bir unsurdur.
rbenvでrubyのバージョンを管理する

こんにちは
今日は、Macにデフォルトで入っているrubyのバージョンがちょっと古いので、
rbenvを使って最新バージョンで動くようにした話を書きます。

## 今回実行した環境
OSバージョン: iMac 10.13.3

## 手順
Homebrewは入っている前提で話を進めます。
まずは、Homebrewをアップデートします。

```sh
$ brew update
```
続いて、早速、rbenvをインストールです！！

```sh
$ brew install rbenv
```
インストールが完了したら、インストール出来ていることの確認もこめて、
バージョンを表示させてみましょう。
こんな感じで、バージョンが表示されていれば、インストールできています。

```sh
$ rbenv --version
rbenv 1.1.2
```

※ rbenvはインストールしてあるが、古くなっていそうな方へ（アップデート方法）

```sh
% rbenv --version
rbenv 1.1.2
% brew upgrade rbenv
(略)
% rbenv --version   
rbenv 1.2.0
```


続いて、rbenvでインストール可能なrubyのバージョンを確認します。
かなりたくさんあるので、ズラーッとバージョンが並んで表示されます。

```sh
$ rbenv install --list
Available versions:
  1.8.5-p52
  1.8.5-p113
・
・
・
  ree-1.8.7-2012.02
  topaz-dev
```
## 最新バージョンのrubyを入れてみよう！
今回は”2.5.0”（2018/02/24時点の安定版の最新）をインストールすることにしましたので、
以下のようなコマンドをたたきます。

```sh
$ rbenv install 2.5.0
```

インストールされたら、以下のコマンドでインストールされているrubyのバージョンを確認してみましょう。
”2.5.0”が追加されているはずです。

```sh
$ rbenv versions
* system (set by /Users/owner/.rbenv/version)
  2.5.0
```

上記のコマンドで、米印がついているのが、現在の環境で動いているrubyとなります。
以下のコマンドだと、現在の環境で動いているrubyのバージョンのみを表示してくれます。

```sh
$ rbenv version
system (set by /Users/owner/.rbenv/version)
```

今回は、新しくインストールした”2.5.0”に切り替えたいので、
以下のコマンドを実行します。
（globalと指定することで、コマンドを実行したディレクトリ以外にも指定したrubyのバージョンが適用されます）

```sh
$ rbenv global 2.5.0
$ rbenv version
2.5.0 (set by /Users/owner/.rbenv/version)
```

以上、rbenvのインストールとrubyのバージョン管理の方法でした。

### 追記：2019/03/20

最近、新しいPCでrbenvを入れていたところ、
`rbenv version`では、指定Versionが変化していても、
`ruby -v`をすると、Versionが変更されていないことがあることが分かりました。
ですので、その際の対処方法を記載します。

```sh
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```

`eval "$(rbenv init -)"`を`~/.bash_profile`の末尾に追加します。
追加したら、`~/.bash_profile`を読み込み直せば設定完了です！

```sh
$ source ~/.bash_profile
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin18]
```

### 追記：2023/03/10

ローカルのrubyバージョンを指定しても、切り替わらないことがありました。

```sh
% rbenv local 3.2.1  
% rbenv versions     
  system
* 3.1.2 (set by RBENV_VERSION environment variable)
  3.2.0
  3.2.1
```

その際は、 `rbenv shell --unset` コマンドを実行すると、
上記で指定したバージョンに切り替わります。


```sh
% rbenv shell --unset
% rbenv versions     
  system
  3.1.2
  3.2.0
* 3.2.1 (set by /Users/xxxx/.ruby-version)
```
Vimでカーソル下の不完全なファイルパスからファイルを開く(fzf)

## 不完全なファイルパスを素のVimで開くには
業務でPHPプロジェクトを触っているのですが、require_onceなどでimportされるファイルパスの一部に定数などが使われていて、文字列だけだと不完全な場合がよくあります。

```php5:定数を含むrequire_onceの例
require_once HOGEHOGE_PATH . "/path/to/file.php";
```

こういったパスって```gf```コマンドだけでは開けないので、開くなら

```vim:vimコマンドライン
:e **/path/to/file.php
```

と、ここまでコマンドラインモードで打ってtabでパスを展開させたり、別にパスを展開しなくてもEnterでこのまま実行させても最初にマッチするファイルを開いてくれたりします。

この時の**最短の手順**は、

+ ノーマルモードでファイルパスの上にカーソルを移動する
+ :でコマンドモードに入って 『e **/』と入力
+ Ctrl+r Ctrl+f でノーマルモードの時のカーソル下のファイルパスを入力

になるのかなと思います。
また、大きいプロジェクトだとvimが無数のファイルから検索する時間が発生してしまいます。

今時のIDEとかならもっとスマートに開けそうですし、これだと手数が多くて待ち時間が発生するのがちょっと嫌ですね。

# fzfを使ったファイルを開く方法
fzfの紹介は自分の他の記事でもしているのでここでは書きません。
→ [fzfを活用してTerminalの作業効率を高める](https://qiita.com/kmszk/items/aa9920f07487559c0c7e)

プラグインはインストールされている前提です。
https://github.com/junegunn/fzf.vim

```vimscript:.vimrc
" vim-plugを使っている場合
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
```

.vimrcに下記を記述します。
解説なども兼ねてコメント多めです。

```vimscript:.vimrc
" <leader> fで実行できるように定義
" 自分は<leader>はスペースをアサインしています↓
" let mapleader = "\<Space>"
nnoremap <leader>f :FZFOpenFile<CR>

" :FZFOpenFileでcall FZFOpenFileFunc()を実行します。
" <leader> fで直接call FZFOpenFileFunc()を実行できるようにしてもよいと思います
command! FZFOpenFile call FZFOpenFileFunc()

function! FZFOpenFileFunc()
    " カーソル下のファイルパスを取得
    let s:file_path = expand("<cfile>")

    " 空行などで実行されたりした場合の考慮
    if s:file_path == ''
        echo '[Error] <cfile> return empty string.'
        return 0
    endif

    " fzf実行
    " .DS_Store はmacの不要なファイル
    call fzf#run({
            \ 'source': 'find . -type d -name .git -prune -o ! -name .DS_Store',
            \ 'sink': 'e',
            \ 'options': '-x +s --query=' . shellescape(s:file_path),
            \ 'down':    '40%'})
endfunction
```
開きたいファイルパスにカーソルが乗っかっている状態で、&lt;leader&gt; f(→自分はSpace f)、または```:FZFOpenFile```で実行します。

これで実行時にfzfに予めファイルパスが入った状態で開くことができます。
fzfを利用することによって複数ファイルが引っかかった場合でも選択が容易です。

sourceをgit ls-files にしてもおもしろかったかもしれません。
個人的には困らないのと速度的に十分なのでfindを利用しています。
unityを録画

#概要
unity5.2で録画したかった。


#環境
unity 5.2.5f1

#写真

![20180224_185111.gif](https://qiita-image-store.s3.amazonaws.com/0/18104/14dbcb04-fb49-badd-4afb-702770bcb503.gif)

#手順

ダウンロード
https://github.com/f-space/FrameCapturerExtension
新規にプロジェクト作って、以下をAssetsにコピーする。
FrameCapturerExtension/FrameCapturerExtension/Assets/
エラーが出るので、コメントアウトする。
window/FrameCaptureを開く。
ゲームを実行して、recを押す。
stopして、saveする。

以上。
ElasticBeanstalk の EC2 内で、environment-name を取得する方法

# ElasticBeanstalk の EC2 内で、environment-name を取得するコマンド

```.sh
aws ec2 describe-instances \
   --region `curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//'` \
   --instance-id `/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id` \
   --query 'Reservations[0].Instances[0].Tags[?Key==`elasticbeanstalk:environment-name`].Value' \
| ruby -r json -e 'puts JSON.parse(STDIN.read)[0]' 
```


# 前提条件

ElasticBeanstalk が生成する EC2 の IAM role で、`ec2:DescribeInstances` の実行が許可されていること
具体的にはこんなポリシーを書けばOK

```.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        }
    ]
}
```

# コマンド解説

```
--region `curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//`'
```

- region で絞り込む option
- `curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//` で、自身の region を取得
   - [インスタンスのメタデータ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)の `placement/availability-zone` で `availability-zone` を取得
　　　　　　- `availability-zone` の末尾の英語を取れば、region が取れる


```
--instance-ids `/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`
```

- instance-id で絞り込む option
- [インスタンスのメタデータ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)の `placement/instance-id` で `instance-id` を取得


```
--query 'Reservations[0].Instances[0].Tags[?Key==`elasticbeanstalk:environment-name`].Value'
```

- `describe-instances` に渡す検索クエリ
- 今回必要なのは、Tagの `elasticbeanstalk:environment-name` の値だけなので、それだけ返すように絞り込んでいる

```
ruby -r json -e 'puts JSON.parse(STDIN.read)[0]' 
```

- クエリの戻り値が以下のような配列なので、バースして値だけ取得している

```.jsob
[
    "elasticbeanstalk:environment-name-value"
]
```


# 参考

- [describe-instances — AWS CLI 1.14.46 Command Reference](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/ec2/describe-instances.html)
- [【小ネタ】EC2のインスタンスメタデータからリージョンを取得する ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/ec2-retrieve-region-from-metadata/)
jQueryを使ってdataTables.jsを動かしてみる

# やりたいこと

jQueryで動的にテーブルを作り、自動で沢山テーブルが出来た状態で`dataTables.js`を作って`1~10`個目のデータまでを初期表示させて「次へ進む」ボタンを押してページ遷移しないで次の要素を表示させたいと思います。


# 実装

```

<html>
<head>
  <link rel="stylesheet" type="text/css" href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables.css">
</head>
<body>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

  <table id="here_table">
    <thead>
      <tr><th>Sites</th></tr>
    </thead>
  </table>

  <script type="text/javascript" charset="utf8" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js"></script>
  <script type="text/javascript" charset="utf8" src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
  <script>

  var table = $('<<tbody>></<tbody>>').addClass('foo');
  for(i=0; i<13; i++){
      var row = $('<tr></tr>');
      var td = $('<td></td>').addClass('bar').text('result ' + i);
      row.append(td);
      table.append(row);
  }

  $('#here_table').append(table);
  $(function(){
  $("#here_table").dataTable();
  })

  </script>
</body>
</html>

```

# 実行

<img width="553" alt="Screen Shot 2018-02-24 at 1.59.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/b4b1bdf2-a15c-6ce3-2b90-af84bd81d080.png">
Domo の アクセストークンを取得する (go)

こちらのプログラムを go で書きました。
[Python で Domo の アクセストークンを取得する](https://qiita.com/ekzemplaro/items/91ddb8a19f3ec861666f)

```go:main_get_token.go
// ----------------------------------------------------------------
/*
	main_get_token.go

					Feb/24/2018
*/
// ----------------------------------------------------------------
package main
import (
	"fmt"
	"os"
)

// ----------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")

	access_token := get_token_proc ()

	fmt.Fprintf(os.Stderr,"%s\n", access_token)

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ----------------------------------------------------------------
```

```go:get_token.go
// ----------------------------------------------------------------
/*
	get_token.go

					Feb/24/2018
*/
// ----------------------------------------------------------------
package main
import (
	"fmt"
	"os"
	"log"
	"io/ioutil"
	"net/http"
	"encoding/json"
)

// ----------------------------------------------------------------
func get_token_proc () string {

	access_token := ""

	user := "0ab7adx2-1ep8-11bb-a622-67g91f578e56"
	password := "cd295ed5dd11eb70914f8fx61523e8370b9e72d23c084a1209154ad6d203b3ba"

	url := "https://" + user + ":" + password + "@api.domo.com/oauth/token?grant_type=client_credentials&scope=data"

	resp, err := http.Get (url)

	if err != nil {
		log.Fatalln(err)
		fmt.Printf("%s", err)
		os.Exit(1) 
	} else {
		defer resp.Body.Close()
		contents, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			fmt.Printf("%s", err)
			os.Exit(1)
			}
		json_str := string(contents)
//		fmt.Printf("%s\n", json_str)
		var data map[string]interface{}
		if err := json.Unmarshal([]byte(json_str), &data); err != nil {
			panic(err)
			}

	access_token = data["access_token"].(string)
	}

	return access_token
}

// ----------------------------------------------------------------
```

```text:Makefile
main_get_token: main_get_token.go get_token.go
	go build main_get_token.go get_token.go
clean:
	rm -f main_get_token
```
Prefabrik ev Ankara

Bir prefabrik ev Ankara maliyeti benzer geleneksel inşa göre olabilir. Açıkçası maliyetleri ev ve konuma ev değişir. Araştırmaya göre prefabrik ev inşaatçılar ulusal birliği tarafından geçen yayınlanan bu büyüklükte bir inşaat maliyetidir. 

<b><a href="http://www.ankaraprefabrikev.com" rel="dofollow">prefabrik ev Ankara</a></b> yukarıdaki prim uygulayarak geleneksel eşdeğer üzerinden inşaat maliyeti artacaktır. Denetim verilerine gör benzer büyüklükte prefabrik evleri ortalama mevcut yıllık maliyeti değişmektedir. Buna karşılık bir eşdeğer burada inşa edilmiştir. Ankara ilindeki enerji eşdeğer sadece geleneksel inşa eve göre prefabrik ev için daha az olabilmektedir.

Tarihi yıllık yakıt fiyat başına önümüzdeki geleneksel <b><a href="http://www.ankaraprefabrikev.com" rel="dofollow">prefabrik villa Ankara</a></b> için aylık enerji faturasından ve benzeri mevcut yükselecek. Bu arada çelik blog üzerinden yapılan inşa maaliyeti ve fiyatı fatura sadece olacak artan karşılaştırmalı tasarruf sırasıyla olmaktadır. Bu yüzden kadar harcanması büyük tasarruf finansman ve terimi üzerinden prefabrik ev işletim geleneksel inşa ev için ödenecek ipotek ödemeleri artırmadan neden olur.


Gelişimi küresel bir işbirliği Ankara prefabrik ev kadar düşük enerji binalarının çalışma kökleriyle bilimsel araştırma tarafından formüle edilmiş ve tanımlanmıştır. Mühendisler ile prefabrik tasarımcılar ile inşaatçılar ve işgalciler tarafından deneyim prefabrik ev dünya çapında başarılı bir şekilde yapılmaktadır.
Traitの関数にクラス内のローカルな名前をつけて呼び出す

クラス側で使いたい関数名とトレイトの関数名が被っている場合に、トレイトの関数名にクラス内のローカルな名前をつける事により、トレイトの関数を上書きせずに、クラスからトレイトの関数を呼び出すことができます。

以下はLaravelでAuthenticatesUsersのlogin関数にtraitLoginという名前をつけてクラス側のlogin関数から呼び出す例です。

```php:LoginController.php
<?php

namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;

class LoginController extends Controller
{

    use AuthenticatesUsers {
        login as private traitLogin;
    }

    public function login(Request $request) {
        // 独自の処理
        return $this->traitLogin($request);
    }
```

Laravelの認証回りはトレイトで大体の実装が提供されていますが、一部いじりたかったのでこんな感じにしました。
メモ：macからラズパイに簡単にファイル転送する方法（scp）

#はじめに

macからraspberry piにsshでリモート接続して開発している時に、
macのファイル（例えばサンプルコード）をラズパイに転送する方法です。

#前提条件
インストールソフト：mac,ラズパイ共に不要

#手順
(例)
送信元：macのダウンロードフォルダ内の”exsample.py”
送信先：ラズパイの test/exsamplesフォルダ

１）macのターミナルを起動

２）送信したいファイルのフォルダに移動

```
cd ~/Downloads
```


```
scp exsample.py pi@raspberrypi.local:test/examples
```


３）パスワードを聞かれるので、ラズパイのパスワードを入力

```
pi@raspberrypi.local's password: 
```

#まとめ
FTPとかソフトを使わなくても、scpコマンドで転送で出来ます。
Ankara kanal açma

Kanal temizleme olarak kişilerin kanalların temizlenmesinde  <b><a href="http://www.ankarakanalacimi.com" rel="dofollow">Ankara kanal açma</a></b> olarak bir çok aşamada ekipmanlar ile olmaktadır. Vindajör olarak ise kanalın hızlı şekilde almasında Ankara vidanjör gibi büyük araçlar ile tıkanmış olan vidanjör içindeki sular çekilmiş olur.

Bu gibi işlemlerin olması Ankara kanal açma işlemi yapan araçlar ile daha iyi olmaktadır. Çünkü bu işlemlerde tıkanıklığın açılması için ekip konusunda uzman olması gerekmektedir.