OmniAICreator/Qiita-1.07M huggingface dataset:
PHPで times というヘルパー関数を作ったら意外と便利だった

# 概要

- Ruby でいう `5.times { puts 'Hello' }`
- JS の `lodash` でいう `_.times(5, () => console.log('Hello'))`

がPHPでもやりたい。が、普通にやろうとすると

```php
foreach (range(1, 5) as $i) {
    echo "Hello\n";
}
```

となるが、単純に繰り返したい場合は `$i` が不要なのに、変数として付けないといけない。名前空間を汚染されて困る。
また未使用の変数としてLinterに怒られるのもつらい。

# そこで

定義した。

```php
function times($times, \Closure $callback)
{
    $range = range(1, $times);
    foreach ($range as $i) {
        $callback($i);
    }
    unset($i);
}
```

使い方は

```php
times(5, function () { 
    echo 'Hello'."\n"; 
});
```


現在の繰り返し回数を知りたい場合は

```php
times(5, function ($i) { 
    echo 'Hello, '.$i."\n"; 
});
```

[追記]

@unulk さんにコメントでご指摘頂いた通り、Laravelにあった。5.4から使えるようです。

https://github.com/laravel/framework/blob/5.4/src/Illuminate/Support/Collection.php#L67

ただしこれは `Collection` オブジェクトを新しく生成するので、ただ単に繰り返すだけであれば高コストか。

また、 @jkr_2255 さんにご指摘頂いた通り、引数のタイプヒントは、 `callable` の方が良さそう。
上述のLaravelのコードでもそうなっている。

```php
function times($times, callable $callback)
```

これなら、関数の名前だけ渡すとかできるので。

# 所感

Laravelにありそうで無いヘルパー関数な気がする。
Solidityで引数に指定するindexedとは何か

Solidityで以下のようなコードを読んで`indexed`って何？となったのでメモ

```
event Transfer(address indexed from, address indexed to, uint256 value);
```
## indexedの役割
上のコードの場合`indexed`で指定した引数をもとに`event`を絞りこめるようになる。
要するに以下のコードの`{_from: "0xd43070..."}`のようにして、ブロックチェーンから特定の`event`だけを取得出来るようになる。

```
var daoBlock = 2254451;
transferEvent = dao.Transfer(
  {_from: "0xd430709a70da06c5c25157a97dba3c3e664590af"},
  {fromBlock: daoBlock, toBlock: daoBlock + 2000}
);
```

上のコードは[参考元](https://ethereum.stackexchange.com/questions/8658/what-does-the-indexed-keyword-do)のコードを簡略化したものなので、詳しく見たい方は[参考元](https://ethereum.stackexchange.com/questions/8658/what-does-the-indexed-keyword-do)をどうぞ！

## 参考
https://ethereum.stackexchange.com/questions/8658/what-does-the-indexed-keyword-do
Xcode10.2 で XVimを使う方法

# 2019/03/30 ご注意
- macOS Mojave 10.14.4, Xcode 10.2の作業内容 
- macOS Mojave で `update_xcode_plugins`を使うやり方だとシミュレータ内のアプリが起動しない
- [公式](https://github.com/XVimProject/XVim2/blob/master/SIGNING_Xcode.md)のやり方で自作証明書でSigningする必要あります

# 作業手順
## 1-1. 古いXVim, XVim2があるなら消す
```sh
cd ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/
ls
rm -rf XVim.xcplugin
rm -rf XVim2.xcplugin
```

## 1-2. 過去にupdate_xcode_plugins使っていたなら戻す
```sh
update_xcode_plugins --restore
```


## 2. XcodeをSigning
- [公式](https://github.com/XVimProject/XVim2/blob/master/SIGNING_Xcode.md)のやり方を参考に行う
    - `codesign ` **実行完了までに10分前後**かかるので、気長に待ちましょう。途中でパスワード求められます。

## 3. XVim2 を pull & make インストール

```sh
# 開発用のフォルダなどにcloneする
cd path/to/dev

# 既にclone済みであれば git checkout master
git clone git@github.com:XVimProject/XVim2.git XVim2
cd XVim2

make
```

## 4. Xcode起動する
- 起動済みであれば、完全終了(キーボードショートカット command+q)してから起動
    - パスワードを求められる
- いつもの「Load bundle」か「Skip bundle」を聞かれるので、Load bundleを選択
- Xcode menu > Edit > XVim があれば loadできてる
Javascript Promiseの使用

# promise
## promiseとは
- ES6から導入された非同期処理を統一的に扱う方法を定義したオブジェクト。
- Promiseを使えばネストが深いコールバック嵐から解放される。

## superagentを使用したpromise使用例

 ```js
import request from 'superagent';

const ApiUrl = "http://localhost/";

function testApi(apiName) {
    return new Promise() {
        (resolve, reject) => {
        request.get(ApiUrl + apiName)
            .end(
                (err, res) => {
                    if (err) {
                        reject(err);
                    } else {
                        resolve(JSON.parse(res.text);
                    }
                }
            );
        }
    };
}

testApi("api1")
  .then(
    (obj) {
      return testApi("api2");
    }
  ).then(
    (obj) {
      return testApi("api3");
    }
  ).then(
    (obj) {
      return testApi("api4");
    }
  ).catch(
    (err) => { console.log("error"); }
  );

 ```

promiseを使わないと

```js
import request from 'superagent';

const ApiUrl = "http://example";

function testApi(apiName) {
    request.get(ApiUrl + apiName)
        .end(
            (err, res) => {
                if (err) {
                    return err;
                } else {
                    return res.body;
                }
            }
        );
}

testApi("api1",
    (obj) => {
        testApi("api2",
            (obj) => {
                testApi("api3",
                    (obj) => {
                        testApi("api4",
                            (obj) => {
                                ...
                            },
                            (err) => {
                                console.error(err);
                            }
                        );
                    },
                    (err) => {
                        console.error(err);
                    }
                );
            },
            (err) => {
                console.error(err);
            }
        );
    },
    (err) => {
        console.error(err);
    }
);

 ```
の様になり可読性も悪い


## Promiseの使い方
- resolve()を呼ぶと、「処理が成功した状態 (fullfilled)」になる
    - 引数に値を受け取れ、thenのコールバックに渡せる
- reject()を呼ぶと、「処理が失敗した状態 (rejected)」になる
    - resolveと同様に引数に値を渡せる
    - Errorオブジェクトを渡すのが通例
- Promiseオブジェクトはthen()メソッドを持ち、処理が成功 or 失敗した際の処理をコールバックとして渡せる
    - 処理が成功だと第1引数の関数を実行
    - 失敗だと第2引数の関数を実行 ※省略可
- then()が返すのもPromise


##参考ページ

- [html5experts](https://html5experts.jp/takazudo/17107/)
Rails development環境の時のみ、クラス探索に失敗してNameErrorが出るケース

## 要約
Railsのdevelopment環境では、クラスロードで読み込めない事象が発生する場合がある。
回避方法は3つ。

## 起こったこと
1. `Hoge::Fuga::TestsController` というコントローラーを作成
2. 1のコントローラー内で `Fuga::Test` モデルを呼んだら、`development`環境の時だけ `NameError` が出る。
3. エラー画面には `uninitialized constant Hoge::Fuga::TestsController::Fuga` が出る。

## 原因
- クラス探索に失敗してるっぽい。
  - `Hoge::Fuga::TestsController::Fuga` 内で `Fuga::Test` を探している。

## 対処法
1. `Hoge::Fuga::TestsController` に `require_dependency('app/models/fuga/test')` を書く
このコントローラーだけリクエストのたびにクラス定義が再ロードされるからパフォーマンスに影響が出る。

2. 名前空間に同じ単語が来ないように調整する
本来的には同じ単語が来る設計にしない方がいいんだろうけど、フレームワークが設計の自由度下げてどうするんだとは思う。（でもRailsだしな...）

3.  `::Fuga::Test` と書く
スコープ演算子 `::` を先頭に書くと、クラス階層のトップレベルという意味になる

## 感想
Rails書き始めて20日くらいなんだけど、これは常識なんだろうか？

## 参考
- https://railsguides.jp/autoloading_and_reloading_constants.html
- https://qiita.com/jnchito/items/79aaca1c51a0ca20ba6e
- https://qiita.com/blueplanet/items/522cc8364f6cf189ecad
在一連串 startActivity 之後，回到第一個 Activity

像是這樣子一連串開啟 activities 之後

```
A → B → C → D
```

目前想要達成的是要從 D 直接跳出、回到原本的 A activity

```
A → B → C → D → A
```

## 解法

這時候只要這樣寫就好：

```kotlin:DActivity.kt
// 觸發回到 AActivity 的地方
val intent = Intent(this, AActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(intent)
```

### 官方文件

#### FLAG_ACTIVITY_CLEAR_TOP

> If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent.

如果加了這個標籤的 Intent 沒有加入 `FLAG_ACTIVITY_SINGLE_TOP` 的話，似乎會讓指定的目標 Activity 建立一個新的 instance 出來，而不是用到 stack 裡面被存放的那一個

#### FLAG_ACTIVITY_SINGLE_TOP

> If set, the activity will not be launched if it is already running at the top of the history stack.



## 參考資料

- [最初のActivityに戻る](https://qiita.com/naoty_k/items/f733ff8a69a141331bba)
- [Tasks and Back Stack](https://developer.android.com/guide/components/tasks-and-back-stack.html) (官方)
- [FLAG_ACTIVITY_CLEAR_TOP](https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP) (官方)
- [FLAG_ACTIVITY_SINGLE_TOP](https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_SINGLE_TOP) (官方)
elyzer -> NameError: name 'unicode' is not defined

# Update
* 修正していただきました！ 困っていたらアップデートしましょう。 https://github.com/o19s/elyzer/issues/15

----

[Elyzer](https://github.com/o19s/elyzer
): Elasticsearch の検索 Issue で役に立つツール。

アナライザの各フィルターがどう動いてるか解るやつ

ただ、[python のバージョン Issue?](https://stackoverflow.com/questions/19877306/nameerror-global-name-unicode-is-not-defined-in-python-3) っぽい何かでしっかり動かなかった。。。



```
$ pip show elyzer
Name: elyzer
Version: 1.1.0
Summary: Step-by-Step Debug Elasticsearch Analyzers
Home-page: https://github.com/o19s/elyzer
Author: Doug Turnbull
Author-email: dturnbull@o19s.com
License: Apache
Location: /usr/lib/python3.4/site-packages
$ elyzer --es http://host:9200 --index esindex --analyzer my_analyzer 'スモモ'
Requires: elasticsearch
Traceback (most recent call last):
  File "/usr/bin/elyzer", line 9, in <module>
    load_entry_point('elyzer==1.1.0', 'console_scripts', 'elyzer')()
  File "/usr/lib/python3.4/site-packages/elyzer/__main__.py", line 42, in main
    es=es))
  File "/usr/lib/python3.4/site-packages/elyzer/elyzer.py", line 36, in getAnalyzer
    normalizeAnalyzer(analyzer)
  File "/usr/lib/python3.4/site-packages/elyzer/elyzer.py", line 19, in normalizeAnalyzer
    if (isinstance(analyzer['char_filter'], str) or isinstance(analyzer['char_filter'], unicode)):
NameError: name 'unicode' is not defined
```

とりあえず、以下の Patch でうごくっぽいけど、ダメかも。。

```diff:/usr/lib/python3.4/site-packages/elyzer/elyzer.py
def normalizeAnalyzer(analyzer):
    try:
-        if (isinstance(analyzer['char_filter'], str) or isinstance(analyzer['char_filter'], unicode)):
+        if (isinstance(analyzer['char_filter'], str)):
            analyzer['char_filter'] = [analyzer['char_filter']]
    except KeyError:
        analyzer['char_filter'] = []
```

# 動いた例
```
$ elyzer --es http://host:9200 --index esindex --analyzer my_analyzer 'すもももももももものうち'
CHAR_FILTER: kuromoji_iteration_mark
{0:す} {1:も} {2:も} {3:も} {4:も} {5:も} {6:も} {7:も} {8:も} {9:の} {10:う}        {11:ち}
TOKENIZER: kuromoji_user_dict
{0:すもも}   {1:も} {2:もも}      {3:も} {4:もも}      {5:の} {6:うち}
TOKEN_FILTER: kuromoji_baseform
{0:すもも}   {1:も} {2:もも}      {3:も} {4:もも}      {5:の} {6:うち}
TOKEN_FILTER: kuromoji_part_of_speech
{0:すもも}   {1:も} {2:もも}      {3:も} {4:もも}      {5:の} {6:うち}
```
全部のファイルを結合するrubyプログラム

#rubyサンプルプログラム採集家です

[rubyとruby on rails書籍のサンプルプログラム配布サイトの一覧](https://qiita.com/taroyanaka/items/e88338045c7af1193a49)

[python書籍のサンプルプログラム配布サイトの一覧](https://qiita.com/taroyanaka/items/4b4c16f89b51d828e753)

こういうのでサンプルプログラムがディレクトリまたいでるのファイルを結合するプログラムです
拡張子も選択できます
手元もruby1.8だと文字化けするけどほかの環境は試してないです

```ruby:all.rb
# coding: utf-8

def glob_by_extension(extension)
	Dir.glob("**/*."+extension)
end

def txtadd(file)
	File.read(file)
end

def makealltxt(files)
	@alltxt = ""
	files.each do |file|
		@alltxt << txtadd(file)
	end
	return @alltxt
end

def filewrite(name, txt)
    File.write name, txt
end

def file_write_detail(name, txt)
  file = File.open(name,"w")
  file.puts txt
  file.close
end

def deletemyself(files, selffilename=__FILE__)
	files.delete(selffilename)
	return files
end

files = glob_by_extension("rb")
txt = ""
txt = makealltxt(deletemyself(files))
#txt.encode#("UTF-8", "Shift_JIS")
p filewrite("combining.rb", txt)
```
iTunesでiOSアプリが買えなくなったらブラウザが起動ループし始めた

# はじめに

Appleが対処してくれればいいだけなんですが、ちょっと微妙なことになっていました。

```
https://itunes.apple.com/app/id[アプリのID]
```
この形式をリンクを踏むとSafariがループしつづけるアプリがあります。

<img width="788" alt="スクリーンショット 2017-09-21 7.20.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/e9869d7f-0d39-35a6-2553-1214405541eb.png">

# ループしそうなURLの条件
- 公開するStoreにアメリカ（US）を含まずURLに国コードがない
- URLに`ls=1`を含む

# 環境はMac
私の表示環境です。これ以外の環境も同様のことが発生している可能性はあります。
<img width="291" alt="スクリーンショット 2017-09-21 7.40.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/ec97ecf0-85c2-77cf-9afa-5a16aebd739c.png">

# ループするパターン

## 公開するStoreにアメリカ（US）を含まずURLに国コードがない
メインで見てるのがChromeで、ダイアログにしたがってiTunes.appを開いたら

- Safariを起動する
- iTunesアプリを開こうとする
- Safariを起動

とループするようになりました。

# URLに`ls=1`を含む
## iTunesConnectで提示されてるURLはあやしい

アメリカ：USのStoreに公開されているアプリのURLもiTunes Connectのままだと
ループします。
<img width="408" alt="スクリーンショット 2017-09-21 8.22.29のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/25eb5532-b43a-9529-62ad-508e9a8acbf7.png">

ここのURLもループする。

# iTunesでのiOSアプリのダウンロード

できなくなってませんか？
<img width="286" alt="スクリーンショット 2017-09-21 7.34.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/207e26c5-c25e-b576-b3f3-f6f7108b1925.png">

## 参考の記事
http://www.itmedia.co.jp/news/articles/1709/13/news092.html
より
>米Appleは9月12日（現地時間）、Macの「iTunes」アプリをバージョン12.7にアップデートした。iOSアプリのApp Storeがなくなり、iPhoneやiPadのアプリを購入・ダウンロードする方法は、本体で直接行うものだけになった。

https://support.apple.com/ja-jp/HT208075
の内容はネガティブな書き方を忌避しすぎて具体的にどうなる、ということがわかりにくい。

# 多分こうなってる

## 公開するStoreにアメリカ（US）を含まずURLに国コードがない
- ブラウザで`https://itunes.apple.com/app/id`で始まるURLを開こうとする
- `アメリカ(US)のStoreに公開されていない`
- ブラウザでiTunesにリダイレクトしようとする
- iTunesではアプリの詳細ページはない
- ブラウザで元のURLを開くようリダイレクト

## ls=1のパラメータをつけたURL
iTunesアプリを開く動線があり、上記のようなリダイレクトに入ります。

# 対処は？
Appleがなんとかしてくれるに違いない！とお祈りでいい人は放置でもいいんですが
積極的に対処されたい方、USで公開されていないiOSアプリは、次の形式にするとなおります。

>https://itunes.apple.com/[国コード]/app/id[アプリのID]

`ls=1`パラメータは外してサイトに掲示している場合は更新しよう。

# 開発者ページからは破綻していない

開発者ページはiTunesで表示されるみたいです。

iTunesプレビューの`この開発者による他のAppを見る`リンクからつながります。
<img width="657" alt="スクリーンショット 2017-09-21 8.11.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/7fbea347-2aca-ffa0-8003-82ea1cc2fbc3.png">

↓

<img width="677" alt="スクリーンショット 2017-09-21 8.15.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/df8e4c13-baa2-5d1e-3392-2627bd491095.png">

↓
iTunesで開いて、アプリを選択するとSafariでiTunesプレビューへ

ここも後日直るかもですね・・・。

# AppStoreが使えるiTunesの配布

Volume Purchase Program（VPP）からの購入者をサポートするために若干前のバージョンをインストールできるようAppleが考慮したようです。
https://support.apple.com/en-gb/HT208079

# さいごに
iTunesへリンクする動線は外す方向で世の中は進んでいるようです。

報告してくれるユーザは、優しく、Appleにつたえられるようにしてくれると対処が早いかもしれません。
（レビュアのきつい言い方に疲れてる制作者の声）

機能がなくなるなどのアナウンスはされずにひっそりと行われていますし、主要国であるUSに公開されていないアプリの場合は対処がもれてしまうことがありますので、優しく対処していきたいです。
Firebase tips(Google Auth:javascript)

# FIREBASE TIPS

## 1. Popup google Auth Window

```html:popup
<script src="https://www.gstatic.com/firebasejs/4.1.1/firebase.js"></script>
<script>
    var config = {
        apiKey: 'XXXXXXXXX',
        authDomain: 'XXXXXXX.firebaseapp.com',
        databaseURL: 'https://XXXXXXXX.firebaseio.com/',
        storageBucket: 'XXXXXX.appspot.com',
        messagingSenderId: 'XXXXXXXX',
    };
    firebase.initializeApp(config);
    var provider = new firebase.auth.GoogleAuthProvider();

    firebase.auth().signInWithPopup(provider).then((result) => {
        var token = result.credential.accessToken;
        var user = result.user;
        console.log('token:' + token + ',user' + user);
    }).catch((error) => {
        console.log('code:' + error.code + 'message' + error.message);
    });

</script>

```
`result:popup`
![googlepopup.png](https://qiita-image-store.s3.amazonaws.com/0/199460/977743ad-72fe-20b0-044b-f582ed5113db.png)

`result:after login`
![googlepopup_console.png](https://qiita-image-store.s3.amazonaws.com/0/199460/731b94ed-dee1-9f83-cc20-a98c36c95c25.png)
dockerコンテナの標準出力をfluentdに送信

`--log-driver=fluentd` をつければ完了。
別のホストのfluentdに送信するには以下も付ける
`--log-opt=fluentd-address=アドレス:24224`

## fluentdを起動

```sh:fluentd.sh
docker run \
 --rm \
 -p 24224:24224 \
 -p 24224:24224/udp \
 -v $(pwd)/data:/fluentd/log \
 fluent/fluentd
```

## fluentdに標準出力を送信

```sh:ubuntu.sh
docker run \
 --rm \
 --log-driver=fluentd \
 ubuntu echo "Hello Fluentd!"
```

## 確認

```sh:
tail data/data.日付.b559a6ebd2fabbcb0.log
```

出力例

> 20170920T225859+0000	ac19805115e8	{"container_name":"/goofy_agnesi","source":"stdout","log":"Hello Fluentd!","container_id":"ac19805115e8f12988292816f65d0a6f32568a5726b8343d41311bcd3c7f5914"}
Babel Pluginを作成するときに有効な情報まとめ

まずは、thejameskyle先生のBabel Handbookに目を通すのがよいと思います。
日本語訳は途中まで書かれているのがあります。
https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/plugin-handbook.md

ASTの確認はastexplorerを使うと非常に直感的に理解ができてよいです。
https://astexplorer.net/

Babel Pluginのテストは、babel-plugin-testerを使うとよいです。
snapshotテストで簡単にテストできます。
https://github.com/babel-utils/babel-plugin-tester

また、consoleでASTを確認するのにbabel-logを使うと便利です。
https://github.com/babel-utils/babel-log

他の知見としては、BabelのレポジトリからFlowtypeの型定義ファイルを持ってくると開発がスムーズです。
https://github.com/babel/babel/blob/7.0/lib/types.js

babel公式のAPIについてのドキュメントも必須です。
こちらをにらめっこしながら書くことになると思います。
しかし、コメントまわりなどの処理を書こうとするとここに載っていないAPIを使うことになり、Babelのコードの読みに行く必要があります。
https://babeljs.io/docs/core-packages/babel-types/

## Tips
Pluginを書いていてよくわからないエラーに遭遇した際、デバッガで追っても全然追えないことがあります。
そのような場合は基本的にNodeとPathを取り違えているので、確認するとよいです。
RailsでBootstrapのアイコンが表示されない時の解決法

#実行環境
Rails 4.2.6
Bootstrap 3.3.7

#Gem
```Gemfile
gem 'pry-rails'
gem 'devise'
gem 'paperclip'
gem 'kaminari'
gem 'therubyracer'
gem 'twitter-bootstrap-rails'
gem 'bootstrap-material-design'
gem 'bootstrap-sass'
```
ちなみにgemはこんな感じです。

#エラー内容
アイコンが表示されず、四角にバツがついたマークが出る。

#原因
アイコンはfontsフォルダから読み込まれるが、これが何らかの原因で読み込まれていない。

#解決法
そもそもfontsフォルダがないので、Bootstrapの公式サイトからダウンロードして来たfontsフォルダを`app/assets/`の下に置く。
その後、`app/assets/stylesheets/application.scss`内に以下を追記する。

```scss:application.scss
@font-face {
  font-family: ‘Glyphicons Halflings’;
  src: url(‘/assets/glyphicons-halflings-regular.eot’);
  src: url(‘/asstes/glyphicons-halflings-regular.eot?#iefix’) format(‘embedded-opentype’),
  url(‘/assets/glyphicons-halflings-regular.woff’) format(‘woff’),
  url(‘/assets/glyphicons-halflings-regular.ttf’) format(‘truetype’),
  url(‘/assets/glyphicons-halflings-regular.svg#glyphicons-halflingsregular’) format(‘svg’);
}
```
typeperf.exe を使って CPU使用率をcsvで保存

`typeperf.exe`はxp以降標準で含まれている。

## 参考

* [TechNet Typeperf](https://technet.microsoft.com/en-us/library/cc753182(v=ws.11).aspx)
* [Tech TIPS：Windowsのtypeperfコマンドでシステムのパフォーマンスカウンタのデータを収集する - ＠IT](http://www.atmarkit.co.jp/ait/articles/0911/13/news105.html)

## 取得できる値一覧

```
typeperf -q
もしくは
typeperf -qx
```

## 1秒ごとに10回取得の例

```rb:標準出力
typeperf -sc 10 -si 1 "\processor(_Total)\% Processor Time"
```

![perf.png](https://qiita-image-store.s3.amazonaws.com/0/25728/df4f672d-ec8b-ffa2-deb3-582e5f7328b1.png)


```rb:ログ出力(上書きしか選べないのと、不要なメッセージも含まれる)
typeperf -sc 10 -si 1 -o log.csv -y "\processor(_Total)\% Processor Time"
```

```rb:ログ出力（追記）
typeperf -sc 10 -si 1 "\processor(_Total)\% Processor Time" | find ":" >> log.csv
```
[MIT] Swiftでスライドメニューライブラリつくったよ

初投稿になります。よろしくお願いします。

Snapchatみたいな上下左右から出てくるスライドメニューライブラリつくりました。

# **[Multi Slide Menu](https://github.com/WataruMaeda/multiSlideMenu)**
![example1.gif](https://qiita-image-store.s3.amazonaws.com/0/102821/2a4a81a3-5854-be75-7f91-30f33a1fe79f.gif)

ライブラリは[こちら](https://github.com/WataruMaeda/multiSlideMenu)にあります

# 特徴
・上下左右の4箇所にスライドメニューを設置できる
・ドラッグしている間の座標がとれる
・メニューが出た、隠れたのタイミングがとれる
・ボタンアクションからスライドメニューをトグルできる
・UIのカスタマイズが簡単

# インストール
Xcodeに手動でドロップします。[こちら](https://github.com/WataruMaeda/multiSlideMenu/blob/master/multiSlideMenu/MultiSlideMenuViewController.swift)のソースをとりこんでください。


#サンプル
1. `MultiSlideMenuViewController` を継承したクラスを作成します。

```Swift
class ViewController: MultiSlideMenuViewController {
```

2. SlideMenuView を初期化して、ポジション、サイズを指定します。

```Swift
let sideMenu = SlideMenuView(position: .Left, bounds: view.frame)
sideMenu.backgroundColor = .yellow
super.setupSlideMenus(views: [sideMenu])
```

こちらの例では、ポジションは `Left`、 スライドメニューのサイズは `view.frame`、背景色は`黄色`になります。

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/102821/de4b681c-aab1-87c6-fcf9-85323db20001.gif)

#カスタマイズしたい
スライドメニューのカスタマイズも簡単です。
SlideMenuView を継承したビューを作り、`override func draw(_ rect: CGRect)`内でカスタムUIを実現できます。

```Swift
import UIKit

class CustomSlideMenu: SlideMenuView {
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        // your code here for the custom UI...
    }
}
```
#トグルさせたい

SlideMenuView クラス の `show()`, `hide()`をコールすることで可能です。

[サンプルコード](https://github.com/WataruMaeda/multiSlideMenu/blob/master/demos/demo2/demo2/CustomSlideMenu.swift#L71)はこちらにあります

#座標をとりたい
SlideMenuView クラス に 座標を感知する関数を用意しています。

・`willShow(point: CGPoint)`
・`didShow(point: CGPoint)`
・`willDisappear(point: CGPoint)`
・`didDisappear(point: CGPoint)`
・`startDragging(point: CGPoint)`
・`continueDragging(point: CGPoint)`
・`endDragging(point: CGPoint)`

[サンプルコード](https://github.com/WataruMaeda/multiSlideMenu/blob/master/demos/demo2/demo2/CustomSlideMenu.swift#L76#L119)はこちらから

# 開発環境

iOS 8+
Swift 3.0+
Xcode 8.0+
WindowsでiTunesによるiPhone/iPad等のバックアップ先を一発で変更する方法

## バックアップ先変更方法
何も考えずに、以下のバッチを管理者として実行したコマンドプロンプトで実行してください。

例として、バックアップ先を<font color="Red">D:\iPhone\Backup</font>に変更しています。
このパスはご自分の環境に書き換えてご利用ください。

```change_apple_backup_dir.bat
@echo off
cd /d %~dp0
setlocal


@REM *************** Change here ***************

set APPLE_NEW_BKDIR=D:\iPhone\Backup

@REM *******************************************


@REM *******************************************
@REM ************ Define variables *************
@REM *******************************************

set APPLE_ORG_BKDIR=C:\Users\%USERNAME%\AppData\Roaming\Apple Computer\MobileSync\Backup
set TMP_DATE=%DATE%
set TMP_TIME=%TIME: =0%
set TMP_BKNAME=Backup_%TMP_DATE:~-10,4%%TMP_DATE:~-5,2%%TMP_DATE:~-2,2%%TMP_TIME:~0,2%%TMP_TIME:~3,2%%TMP_TIME:~6,2%


@REM *******************************************
@REM ****** Rename original backup folder ******
@REM *******************************************

IF NOT EXIST "%APPLE_ORG_BKDIR%" GOTO :SKIP_RENAME

rename "%APPLE_ORG_BKDIR%" "%TMP_BKNAME%"
echo %APPLE_ORG_BKDIR% を %TMP_BKNAME% にリネームしてバックアップしました。

:SKIP_RENAME


@REM *******************************************
@REM ******** Create new backup folder *********
@REM *******************************************

IF EXIST "%APPLE_NEW_BKDIR%" GOTO :SKIP_MKDIR

mkdir "%APPLE_NEW_BKDIR%"
echo %APPLE_NEW_BKDIR% フォルダを作成しました。

:SKIP_MKDIR


@REM *******************************************
@REM ********** Create symbolic link ***********
@REM *******************************************

echo mklink /J "%APPLE_ORG_BKDIR%" "%APPLE_NEW_BKDIR%"
mklink /J "%APPLE_ORG_BKDIR%" "%APPLE_NEW_BKDIR%"


endlocal
```

ネットで軽く検索したところ手動操作が多くイヤだったのでバッチ化してみました。
現在のバックアップ先を知りたい場合はC:\Users\%USERNAME%\AppData\Roaming\Apple Computer\MobileSync配下のBackupのリンク先を確認してください。

すでにバックアップフォルダがあったらバックアップ＆新しいバックアップ先がなければmkdirしてます。
エラー処理は行ってないのでエラーになったら適当に対処してください。

## 変更した設定を元に戻す方法
C:\Users\%USERNAME%\AppData\Roaming\Apple Computer\MobileSyncに移動して、
シンボリックリンクBackupを削除した後、Backupフォルダを新規に作ったり、
本バッチでバックアップしたBackup日付時刻フォルダをリネームしたりして元に戻します。
Ubuntu 16.04 へ Oracle 11g Express Edition を入れてみた

## Oracle XE をダウンロードしてくる
Oracleのダウンロードサイト[ここ](http://www.oracle.com/technetwork/jp/database/database-technologies/express-edition/downloads/index.html)から
Oracle-XE-11.2.0のLinux x64版 をダウンロードする

## 必要なパッケージをインストール

```
sudo aptitude install alien libaio1 unixodbc unzip
```

## Oracl XEをunzip

```
unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
```

## rpm から deb へ変換

```
cd Disk1/
sudo alien --to-deb --scripts oracle-xe-11.2.0-1.0.x86_64.rpm
```

## deb ファイルの中身を編集

```
mkdir ./tmp_deb # 作業用ディレクトリ
cp ./oracle-xe_11.2.0-1.0.x86_64.deb
cd ./tmp_deb
ar x ./oracle-xe_11.2.0-1.0.x86_64.deb
```

３つのファイルができます

```
ls ./
control.tar.gz  data.tar.xz  debian-binary
```

## data.tar.xz 内のファイルを編集

```
mkdir ./tmp_data
cd ./tmp_data
tar axvf ../data.tar.xz ./
vim ./etc/init.d/oracle-xe
```

シェバンの下に下記を挿入

```
### BEGIN INIT INFO
# Provides:             OracleXE
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Oracle 11g Express Edition
### END INIT INFO
```

53行目 awk のパスを変更

```
if [ -z "$AWK" ]; then AWK=/usr/bin/awk; fi
```

/var/lock/subsys/ を /var/lock/へ書き換え

```
:%s/subsys\///gc
```

## control.tar.gz 内のファイルを編集
```
cd ../
mkdir ./tmp_control
cd ./tmp_control
tar axvf ../control.tar.gz ./
vim ./postinst
```

114行目を update-rc.d へ書き換え

```
update-rc.d oracle-xe defaults 80 01
```

## deb ファイルにまとめてインストール
```
rm ../data.tar.xz ../control.tar.gz
tar acvf ../control.tar.gz ./
cd ../tmp_data
tar acvf ../data.tar.gz ./ #xz 形式ではインストールの途中で止まった
cd ./
ar d ./oracle-xe_11.2.0-1.0.x86_64.deb data.tar.xz # 一旦消して
ar r ./oracle-xe_11.2.0-1.0.x86_64.deb data.tar.gz control.tar.gz # 追加
mv ./oracle-xe_11.2.0-1.0.x86_64.deb ./oracle-xe_11.2.0-1.0.x86_64_custom.deb
```

```
sudo dpkg -i ./oracle-xe_11.2.0-1.0.x86_64_custom.deb
sudo /etc/init.d/oracle-xe configure
```

.profileを編集して、oracleの環境変数が設定されるようにする。

```
vim ~/.profile
```

```
source /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
```

編集した.profileの内容を反映する。

```
source ~/.profile
```

oracleに接続できるか確認する。

```
sqlplus system@XE
```
Kerasで学習したモデルをAndroidで動かしてみた

# はじめに
Kerasで学習したモデルをAndroidで動かすにあたり、意外とネット上に参考記事がなかったのでメモ。

今回はTensorFlowのAndroidカメラデモアプリをベースに、Kerasで学習したモデルをAndroid上で動かせるようにしました。

# 1. Kerasの学習モデルを作る
モデルを用意するにあたり、人工知能に関する断創録さんの「[VGG16のFine-tuningによる17種類の花の分類](http://aidiary.hatenablog.com/entry/20170131/1485864665)」を非常に参考にさせていただきました。機械学習系ではいつもお世話になっています。感謝。

今回はより使いやすようにように、記事先で使われているプログラムを改良。
以下のような機能を追加。

- 識別クラスやサンプル数などの各種パラメータを学習データのディレクトリ構造から取得
- 識別クラスを記述したラベルファイルを出力
- 各種パラメータはオプションやコマンドライン引数で指定
- 重みだけでなくモデル構造も含めて出力する
- etc...

使い方はリンク先参照。
https://github.com/icchi-h/fine-tuning-keras


# 2. 学習モデルをTensorFlowの形式に変換
AndroidのTensorFlowデモアプリで利用されている学習モデルはProtocol Buffers(.pb)形式であるため、Kerasの学習モデルをそのまま利用することはできません。

そこで、amir-abdiさんが[公開されているコード](https://github.com/amir-abdi/keras_to_tensorflow)をベースにモデルの変換プログラムを用意。

使い方はリンク先参照。
https://github.com/icchi-h/keras_to_tensorflow

# 3. Androidアプリの準備
今回はGoogleがTensorFlowリポジトリ内で公開している[Android Camera Demo](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android)の中のTF Classifyを利用します。
Googleの推奨するようにBazelでビルドしてもいいですし、私はBazelを使わずAndroid Studioで開発したかったので、プロジェクトに少し手を加えました。

以下の記事でAndroid Studioでアプリをビルドするまでの手順をまとめています。
https://qiita.com/icchi_h/items/a1df9f27569714edfc5e

# 4. アプリの学習モデル・ラベルファイルを変更
アプリのデフォルトの学習モデル・ラベルファイルと手順1で用意したものに変更します。といっても用意したモデル・ラベルファイルを特定ディレクトリにコピーして、コード上でファイル名を定義している部分を変更するだけ。

## モデル・ラベルファイルの設置
手順3でAndroid Studioを使った場合では、Project内に`assets`ディレクトリが表示されているはず。そこに自分のモデル・ラベルファイルをドラッグ&ドロップまたは、`assets`を右クリック→Reveal in FinderでFinderを使ってファイルをコピー。

<img height="400px" src="https://qiita-image-store.s3.amazonaws.com/0/135313/21a4d617-3750-f2bf-5b37-739d959ee00a.jpeg">

## モデル・ラベルファイル名の定義を変更
`/src/org/tensorflow/demo/ClassifierActivity.java`の61行目から各種パラメータが定義されているので、それを用意した学習モデルに合わせ変更。手順1で紹介したコードをそのまま利用している場合は以下のように変更。

```java
INPUT_SIZE = 150;
IMAGE_MEAN = 0;
IMAGE_STD = 255;
INPUT_NAME = "input_1";
OUTPUT_NAME = "sequential_1/dense_2/Softmax";
MODEL_FILE = "file:///android_asset/<your model file>.pb";
LABEL_FILE = "file:///android_asset/<your label file>.txt";
```
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第四章 ドメインを隔離する2

# レイヤ化アーキテクチャ

前回：[ドメインを隔離する1](https://qiita.com/YasuhiroKimesawa/items/e6ea3b0538808050fa20)

![レイヤアーキテクチャ.png](https://qiita-image-store.s3.amazonaws.com/0/150455/2e72b425-dbea-6788-c8d4-c08a428ef4c6.png)

> 本質的な原則は、レイヤ内のどの要素も、同じレイヤの他の要素か、その「下にある」レイヤの要素にしか依存しない(第二部 第四章より)

それぞれ各層が、特定の側面を専門的に扱うことにより、凝集度が高まり、解釈がしやすくなる。しかも、各レイヤは別々の速度で進化するため、分離することで保守にかかるコストが下がります。

各レイヤの要素はそれぞれ以下の責務をもったものになります。

### ユーザーインターフェイス(プレゼンテーション)
- ユーザーに情報を表示・ユーザーのコマンドを解釈
- 別のコンピュータへ情報を提示・別のコンピュータからのコマンドを解釈
- MVCアーキテクチャでいえばC

### アプリケーション 
- やるべき作業を調整 ○○して、△△して、xxする。実際の処理はドメイン層が行う
- 薄く保つ（メソッドは数行で済ませる)
- 状態はもたない
- ユーザーやプログラムが行う作業の進捗を反映する状態は持てる

書籍の銀行口座振り替えの例で言えば、
1. トランザクション開始して(実際の処理はインフラストラクチャが行う beginTransaction())
2. 口座振替を行う(実際の処理は口座モデルが行う transfer())
3. 確認(実際の処理は口座モデルが行う confirm())
4. 登録(実際の処理はインフラストラクチャが行う commit())

4行のメソッドになる

### ドメイン(モデル)
- ビジネスの概念、情報、ビジネスルール
- ビジネスソフトウェアの核心

### インフラストラクチャ
- 一般的な技術的機能
- メッセージ送信
- 永続化
- ウィジェット描画

特にモデルを分離することが大事なのは[前回](https://qiita.com/YasuhiroKimesawa/items/e6ea3b0538808050fa20)読んだ通りです。

## 意外と難しい
凝集度の高い側面を隔離するレイヤを選び出すことは
> 経験と慣習による何らかの収束が見られる。(第二部 第四章より)

自分もそうだったのですが、最初は特に、アプリケーション層にモデルに書くべきビジネスルールを書いてしまうことが多いです。
これは経験と慣れが必要ですね。

アプリケーション層を書くときにifやforを書いたときにちょっと立ち止まって、「これはモデルに書くべきか」と考える癖をつけるといいかもしれません。

# ちょっと待った
モデルを隔離するということを何度も主張しているのですが、最初の図を見ていただくとわかると思います。実はモデルがインフラストラクチャ層の要素を持ってしまっています。完全に分離されていませんね。

モデルを完全に隔離することが大事なのですが、その工夫についてはまた後日。。。
Reactの公式チュートリアルをざっくりと理解する

React最近勉強し始めました。
ひとまずチュートリアルを写経しつつざっくりこんな感じかと。

チュートリアル
https://facebook.github.io/react/tutorial/tutorial.html

基本はこんなんで

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/125423/8a18a30c-2a6a-5140-4705-d92ef18bd5f8.png)


Gameコンポーネントは最初こんな感じで

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/125423/dcae660e-87e7-3841-078d-199db13c46ec.png)


進めていくとこんな感じで

![図3.png](https://qiita-image-store.s3.amazonaws.com/0/125423/deb11112-a88e-54b0-b82f-a0d757864250.png)


マス目クリックするとこんな感じで

![図4.png](https://qiita-image-store.s3.amazonaws.com/0/125423/5673b1e5-2908-c669-7f98-092491b551d6.png)


履歴クリックするとこんな感じで

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/125423/c747a234-9586-e65d-e479-3b5f3dcd3e39.png)


Boardコンポーネントはこんな感じで

![図6.png](https://qiita-image-store.s3.amazonaws.com/0/125423/54006235-e7a8-3bca-5ddb-bd172de40237.png)


Squareコンポーネントはこんな感じですかね

![図7.png](https://qiita-image-store.s3.amazonaws.com/0/125423/b2ff6714-06c9-98c3-d3bf-f83ce9b97fce.png)


こんな感じの理解で良いんですかね。
今後も勉強続けていきます。
トランプゲーム（未完）

#能書き
トランプ大統領の国連演説が良かったので、トランプゲームを作ろうと思いました。

しかし、眠いので途中まで。

##実行結果　ポーカーゲーム
手札交換無し、判定は目視で。
本当はアメリカン・ページワンを作りたかったので、またそのうち。

````
  heart    4    club     Q
  club     5    heart    5
  club     6    club     4
  diamond  3    spade    J
  club     7    spade    6
 続行するには何かキーを押してください . . .
````

##ソースプログラム
半分に割って、交互に並べるきり方の、逆過程をやったのですが、

````fortran
        deck = [deck(::2), deck(2::2)]  
````
全くきれずに団子になるので、任意の場所で割って乗せるきり方を加えました。

````fortran
    module m_cards
      implicit none
      character(len = *), parameter :: mark(*) = ['club', 'diamond', 'heart', 'spade']
      character(len = 2), parameter :: num (*) = [' A', ' 2', ' 3', ' 4', ' 5', ' 6', ' 7', ' 8' ,' 9', '10', ' J', ' Q', ' K']
      enum, bind(c) 
        enumerator :: club, diamond, heart, spade
        enumerator :: ace,  jack = 11, queen, king
      end enum
      
      integer, parameter :: noc = 52, ns = 4, nc = noc / ns      
      type :: t_card
        character(len = len(mark(1))) :: mark 
        character(len = 2) :: num
      end type    
    contains
      type(t_card) function to_card(i) 
        integer, intent(in) :: i
        to_card = t_card( mark((i - 1) / nc + 1), num(nc + modulo(i, -nc)) )
      end function to_card
    end module m_cards
    
    program Console2
      use m_cards
      implicit none
      type (t_card) :: hands(5, 2)
      integer :: i, j, k, n, deck(52)
      real :: r
      forall (i = 1:noc) deck(i) = i   ! [1:noc]
      call random_seed()
      call random_number(r)
      n = 10 + int(200 * r)
      ! shuffle
      do i = 1, n
        deck = [deck(2::2), deck(::2)]    
        call random_number(r)
        n = int(noc * r) + 1
        deck = [deck(n:), deck(:n - 1)]
      end do
      ! deal
      k = 0 
      do i = 1, size(hands, 1)
        do j = 1, size(hands, 2)
          k = k + 1 
          hands(i, j) = to_card(deck(k))  
        end do    
      end do
      ! print 
      do i = 1, 5
        print "(2(a8, ' ', a, '   '))", hands(i, :)
      end do 
    end program Console2
````
iOS11でWebRTCを利用したWebサービスを1時間で作った話


## すべての始まり

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">スマホの方がキーボードより入力しやすいからスマホでPCにテキスト打ち込めるツールがほしいというリプを、おそらく学生のフォロワーさんからいただき、朝から戦慄してる</p>&mdash; SHARP シャープ株式会社 (@SHARP_JP) <a href="https://twitter.com/SHARP_JP/status/910316428342943744">September 20, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
この問題は、学生である私が対応しなければならないと思い、１時間で作ることにしました。


## フリック入力くん

<a href="http://axis06.main.jp/key/">![ogp.png](https://qiita-image-store.s3.amazonaws.com/0/69141/e37ad85a-5972-caa2-30a1-25dc01f3cfbc.png)</a>
http://axis06.main.jp/key/

スマホからパソコンへフリック入力でレポートがかけるサービスを作りました。今回はこれを作成しました。

## iOS11からSafariにて公式にWebRTCが対応なる。

![abc.png](https://qiita-image-store.s3.amazonaws.com/0/69141/143add0a-81ce-9e93-aee6-529c35362964.png)

IE以外の対応は終わっていきましたね。WebRTCの時代は始まりそうです。


## WebRTCとは

WebRTCはWeb上でも端末同士でのP2Pを行うことができるAPIの定義です。
音声、映像、テキストデータなど中央管理サーバーを建てなくても個人同士でやり取りができます。


## websocketとの違い

今までのWebSocket通信は中央管理サーバーを用意し、ユーザー間で同じデータを取り持つよう常時起動している必要があり、多くの接続に対するコストも比例して増大していました。

しかし、WebRTCに関しては最初にIPのデータを送り合うシグナリングサーバーさえあればユーザー間のデータ送信は無限に行って大丈夫です。サーバーレスのため負荷によるレスポンスの遅れもありません。


## SkyWay

https://webrtc.ecl.ntt.com/

NTTコミュニケーションズが密かに開発している、WebRTCに必要なサーバを構築・運用することなく、手軽にビデオ・音声通話、データ通信を利用できるサービス。今回はこれを利用しました。

##本サービスの使い方
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="und" dir="ltr"><a href="https://t.co/QnsHraK2Y9">https://t.co/QnsHraK2Y9</a> <a href="https://t.co/yUGzNN0bmh">pic.twitter.com/yUGzNN0bmh</a></p>&mdash; 古田克海 (@axis06) <a href="https://twitter.com/axis06/status/910522666863312896">September 20, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
PySide(PyQt)で.uiから作られたwidgetにeventを追加する

## はじめに
タイトル通り、PySideで.uiから作ったQLineEditにイベントを仕込みたかったのですが、classに依存した書き方が多かったのでwidgetに直接追加する方法がないか探してみました。

## 方法
eventFilter関数を実装したクラスをウィジェットのinstallEventFilterに引数として渡すことでイベントを監視してくれるようになります。

```python:python
import os
import sys

from PySide import QtCore, QtGui
from PySide.QtUiTools import QUiLoader
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin

CURRENT_PATH = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop"


class GUI(MayaQWidgetBaseMixin, QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(GUI, self).__init__(parent)
        loader = QUiLoader()
        uiFilePath = os.path.join(CURRENT_PATH, 'main.ui')
        self.UI = loader.load(uiFilePath)
        self.setCentralWidget(self.UI)
        
        self._filter = Filter()

        # eventFilterをwidgetに突っ込む
        self.UI.line.installEventFilter(self._filter)


class Filter(QtCore.QObject):
    def eventFilter(self, widget, event):
        if event.type() == QtCore.QEvent.FocusOut:
            print 'focus out'
        
        return False


def main():
    app = QtGui.QApplication.instance()
    ui = GUI()
    ui.show()

if __name__ == '__main__':
    main()
```

## 動作確認
フォーカスを移すことでイベントが無事取得できました。
![eventfilter.gif](https://qiita-image-store.s3.amazonaws.com/0/137381/25b39a22-29ee-a7b9-5c9d-0fa0cbf860a9.gif)

## 参考元
python - How to connect QLineEdit focusOutEvent - Stack Overflow
https://stackoverflow.com/questions/15066913/how-to-connect-qlineedit-focusoutevent
Windows PowerShell およびコマンドプロンプトのショートカット

今作業してるフォルダからWindows PowerShellやコマンドプロンプトを開きたいってときのショートカット。
Windows10で確認。

#任意のディレクトリで開始
エクスプローラで目的のフォルダを開き Alt+d
Windows PowerShellなら```powershell```
コマンドプロンプトなら```cmd```

#ホームディレクトリで開始
Windowsキー+R
Windows PowerShellなら```powershell```
コマンドプロンプトなら```cmd```
ツリーの中の数


やるだけですね.とりあえずn<=10\*\*15まで耐えられるっぽいです.

```rb:tyama_f06.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/ordf06numit/
#https://qiita.com/Nabetani/items/deda571c9451bd7d3175
STDOUT.sync=true

def dfs(n,t)
	return 1 if n==t
	return 0 if n<t
	$memo[n]||=[n/2-10,n*2/3].map{|e|
		e>0 ? dfs(e,t) : 0
	}.reduce(:+)
end
	
while gets
	$memo={}
	n,t=$_.split(',').map(&:to_i)
	p dfs(n,t)
end
```
glibc更新時のカスタムロケールについて

脆弱性が見つかったなどglibcを更新する機会があり、カスタムロケールが元に戻ってしまったためメモしておきます。

似たような事象情報
https://access.redhat.com/ja/node/1335543

glibcはご存知の通りlinux系OSの根幹をなすプログラム群で、さまざまなパッケージに対して被依存関係があります。予想外の場所も影響がありました。。
## 内容
ロケールに文字コード（sjisなど）を追加して運用しているシステムにおいて、glibcを更新した場合、ロケール情報が追加前（デフォルト）に戻った

**glibcの依存関係**
以下のようにglibcを更新する場合、common/devel/headersも更新となります。

```bash
Dependencies Resolved
Updating:
 glib
Updating for dependencies:
 glibc-common
 glibc-devel
 glibc-headers
```

**更新前と後のロケール情報比較**
ロケールにsjisを追加していた場合

```shell-session
$ localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
$ locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.sjis　<＝＝入ってる
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

$ sudo yum update glibc
(1/4): glibc-2.17-196.el7.x86_64.rpm
(2/4): glibc-common-2.17-196.el7.x86_64.rpm
(3/4): glibc-devel-2.17-196.el7.x86_64.rpm
(4/4): glibc-headers-2.17-196.el7.x86_64.rpm
・・・中略・・・
Complete!

$ locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

```

更新後、追加済みのsjisが消えました。これはロケール情報の実体である「/usr/lib/locale/locale-archive」がglibc-commonに含まれていて、rpmの更新時に現行OSのファイルを上書きしたためと思われます。
（ロケール追加時に利用したlocaledefコマンドによってlocale-archiveが作り直されたことも合わせて確認しました）


**参考）glibc-commonに含まれているファイル**

```
$ rpm -ql glibc-common | grep locale-archive
/usr/lib/locale/locale-archive
```

**glibc-common更新時にロケール情報戻りを許容するのか**
sjisの定義をlocale-archiveではなく外に出力した場合glibc-commonを更新した場合であっても追加したロケール情報は保持されたままでした。きちんと検証できていませんが、追加時には以下のようにしておくのがより良いのかもしれません。後日glibcの更新ポリシーや、ドキュメントをもう少し確認してみようと思います。

**localedefコマンドの引数と結果**

```shell-session
$ date
2017年 9月 21日 木曜日 00:00:55 JST
$ localedef -f SHIFT_JIS -i ja_JP /usr/lib/locale/ja_JP.SJIS
$ ls -lh /usr/lib/locale/locale-archive
-rw-r--r-- 1 root root 102M  9月 20 23:55 /usr/lib/locale/locale-archive
$ ls -lh /usr/lib/locale/ja_JP.SJIS
-rw-r--r-- 1 root root  107  9月 21 00:01 LC_ADDRESS
-rw-r--r-- 1 root root 294K  9月 21 00:01 LC_COLLATE
-rw-r--r-- 1 root root 511K  9月 21 00:01 LC_CTYPE
-rw-r--r-- 1 root root  345  9月 21 00:01 LC_IDENTIFICATION
-rw-r--r-- 1 root root   27  9月 21 00:01 LC_MEASUREMENT
drwxr-xr-x 2 root root 4.0K  9月 21 00:01 LC_MESSAGES
-rw-r--r-- 1 root root  294  9月 21 00:01 LC_MONETARY
-rw-r--r-- 1 root root   79  9月 21 00:01 LC_NAME
-rw-r--r-- 1 root root   58  9月 21 00:01 LC_NUMERIC
-rw-r--r-- 1 root root   38  9月 21 00:01 LC_PAPER
-rw-r--r-- 1 root root   55  9月 21 00:01 LC_TELEPHONE
-rw-r--r-- 1 root root 4.9K  9月 21 00:01 LC_TIME
```
Amazon Linuxへの接続時のメッセージを非表示にしよう

最近プロジェクトでAmazon Linuxを使っているのですが、
yum updateをしろというメッセージがssh接続時に表示されるので、
メッセージが表示される原因と対策をまとめます。

## /etc/motd
Linuxにssh接続時にヘッダーに出力される内容は/etc/motdという設定ファイルで設定します。
motdとはlinuxのログイン時に表示されるメッセージのことです。

##motdの仕組み

/etc/motdはシンボリックリンクで以下のようになっています。

```
# ls -la /etc/motd
lrwxrwxrwx 1 root root 25  5月 10 05:02 2013 /etc/motd -> /var/lib/update-motd/motd
```

なので、実態は「/var/lib/update-motd/」配下にあることになります。
どんな設定ファイルがあるかというと。

```
# ls -la /etc/update-motd.d
合計 20
drwxr-xr-x  2 root root 4096  9月  9 10:45 2013 .
drwxr-xr-x 72 root root 4096  9月  9 11:48 2013 ..
-rwxr-xr-x  1 root root  334  9月  9 10:45 2013 30-banner
-rwxr-xr-x  1 root root  134  1月 23 08:47 2013 70-available-updates
-rwxr-xr-x  1 root root 2103  1月 23 08:47 2013 75-system-update
```
こんだけファイルがありました。

/var/lib/update-motd/motdはcron.dailyでupdate-motdというプログラムが実行されて、
日次で内容を書き換えます。

そのため、常時パッケージが新しくないと新しくしなさいとメッセージを出力します。

## 「Run "sudo yum update" to apply all updates.」メッセージの非表示・表示
yum updateを定期的に掛けない環境だとこのメッセージは大変鬱陶しいと思いますので、
今回は日次で実行されるupdate-motdを無効化・有効化させるコマンドでメッセージの非表示・表示をさせます。


```:表示
$ sudo update-motd --enable
```

```:非表示
$ sudo update-motd --disable
```

これで鬱陶しいメッセージはヘッダーに出力されてないので、
yum updateを実行した環境で是非試してみてください。
[memo] Ubuntu 16.04 に gdb 8.0.1 をインストール 

Ubuntu 16.04 に gdb 8.0.1 を入れた際の忘備録です。
参考になれば幸いです。

### 標準インストールの gdb (7.11) のアンインストール
共存できるかもしれませんが、ややこしくなりそうなので一旦削除。

```
$> sudo apt remove gdb
```

###Download
[GDB: The GNU Project Debugger](https://www.gnu.org/software/gdb/) の [ダウンロードページ](http://ftp.gnu.org/gnu/gdb/) から 最新版(2017/9/21 日現在 8.0.1) をダウンロード。
ここでは gdb-8.0.1.tar.gz　をダウンロードしたとして下記します。

###gdb-8.0.1.tar.gz の 展開
```
$> tar -xvzf gdb-8.0.1.tar.gz
```

###texinfoのインストール
```
sudo apt-get install texinfo
```
手元の環境では、 makeinfo (texinfo内に存在)が足りなくて、gdbのビルドに一度失敗しました。入れておきましょう。

###Build
展開先の configure が存在するディレクトリに移動し、下記のコマンドを実行します。

```
$> ./configure
$> make -j4
$> sudo make install
```
手元の環境では、make -j4 の 4並列ビルドで 5～10 分位 かかりました。


###gdb バージョン確認

```
$> gdb -v
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".

```
インストールできました。

以上です。
「オフラインリアルタイムどう書くF06の問題」の解答

「オフラインリアルタイムどう書くF06の問題 - ツリーの中の数」の解答
http://nabetani.sakura.ne.jp/hena/ordf06numit/

会場では残り20分ぐらいのときに出来上がりましたが、
「メモ化」というテクニックを知らず非常に効率の悪いもので、実行終了まで十数分要するものでした。

以下は、会場で得た新しいスキル「メモ化」を適用後のコード。
一瞬で終わるようになりました。

その他に以下を実施しています。

- 再帰処理の見直し
- グローバル変数廃止
- '/'を'//'に置き換え



```python:main.py

def right_func(input_num):
    return input_num // 2 - 10

def left_func(input_num):
    return input_num * 2 // 3

def calc(memo, input_num, target):
    if input_num in memo:
        return memo[input_num]

    if input_num < target:
        return 0

    if input_num == target:
        return 1

    ans = calc(memo, right_func(input_num), target) + calc(memo, left_func(input_num), target)
    memo[input_num] = ans
    return ans

def resolve(data):
    memo = {}
    split = data.split(",")

    input_num = int(split[0])
    target = int(split[1])

    return str(calc(memo, input_num, target))


## test logic
class Result:
    def __init__(self):
        self.success = 0
        self.fail = 0

RESULT = Result()
RESULT.success = RESULT.fail = 0

def test(data, expect):
    print("actual:" + resolve(data) + " expected:" + expect)
    if resolve(data) == expect:
        RESULT.success += 1
    else:
        RESULT.fail += 1


test( "123,4", "5" )
test( "1,1", "1" )
test( "2,1", "1" )
test( "3,3", "1" )
test( "19,5", "1" )
test( "69,5", "3" )
test( "88,9", "2" )
test( "1,100", "0" )
test( "100,4", "4" )
test( "101,9", "0" )
test( "456,7", "7" )
test( "567,8", "12" )
test( "756,10", "10" )
test( "789,10", "12" )
test( "896,29", "2" )
test( "7764,6", "664" )
test( "1234,56", "3" )
test( "8563,29", "35" )    
test( "12345,67", "10" )    
test( "72927,51", "263" )    
test( "71441,145", "22" )    
test( "123456,78", "397" )    
test( "123456,789", "1" )    
test( "592741,216", "55" )    
test( "913826,584", "81" )    
test( "1234567,89", "2293" )    
test( "10000000,1", "19383507" )    
test( "12345678,9", "3567354" )    
test( "6215879,358", "2907" )    
test( "12345678,90", "79419" )    
test( "5745432,1032", "1287" )

print("Success: {0.success}, Fail: {0.fail}".format(RESULT))
```
[VBScript] ドロップされたExcelファイルのシート名を全て取得してファイルに出力

2017年にもなってVBScriptもどうなんだとは思いますが、こういうExcelのちょっとした操作にはPythonとかよりもジッサイ便利なので・・・。

# 使い方

適当な場所に `GetExcelSheetNames.vbs` のようなファイルを作成して、そのファイルに対して対象のエクセルファイル(複数同時可)をドロップすれば良いです。"hoge.xlsx" とかなら "hoge_sheets.txt" のような名前でスクリプトと同じディレクトリに出力されます。

だいぶレガシーなコードですが Windows10 + Excel2016 でも問題なく動くかと思います。

# 実装

```vbnet:GetExcelSheetNames.vbs
Set book = CreateObject("Excel.Application")
book.Visible = False

Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

Dim WshShell
Set WshShell = CreateObject("WScript.Shell")

Dim currentDir
currentDir = fso.getParentFolderName(WScript.ScriptFullName)

For Each strFname In WScript.Arguments
	Set objDoc = book.Workbooks.Open(strFname)

    Dim fileBaseName, outputFilePath
    fileBaseName = fso.GetBaseName(strFname)
    outputFilePath = currentDir & "\" & fileBaseName & "_sheetlist.txt"

    Dim outputFile
    Set outputFile = fso.OpenTextFile(outputFilePath, 2, True)

    For Each sheet In objDoc.Sheets
        outputFile.WriteLine sheet.Name
    Next

	objDoc.Close
	Set objDoc = Nothing
Next

book.Quit
Set book = Nothing

outputFile.Close
Set outputFile = Nothing

Set WshShell = Nothing
Set fso = Nothing
Set book = Nothing
```

# 参考
[WSHでスクリプトファイル自身が存在するフォルダパスを取得する - Qiita](https://qiita.com/asterisk9101/items/54cdcedb9ef60ea0bb21)
Angular Materialでtiqavクライアントを作った

Angular Materialの使ったことのないコンポーネントで遊ぶために、作ってみました。
tiqav(煽り画像検索サイト？)のフロントエンドです。
大変ありがたいことに、tiqavでは各種APIが公開されているので、そちらを使わせてもらいました。
TwitterやInstagramを使ってみることも考えたのですが、面倒な認証を必要としないことやAPIの仕様がシンプルなこともあり今回はtiqavのAPIを使いました。

## Demo

https://daikiojm.github.io/tiqav-angular-frontend/

![](https://media.giphy.com/media/3ov9k7s4SorpBJr8Ag/giphy.gif)

注意: 使用するブラウザによっては混在コンテンツの警告が表示されます。
※ Google Chromeの場合はアドレスバーに表示される盾マークから混在コンテンツの許可を行うことで閲覧可能です。

## 概要

本家のtiqavにある、ランダム表示と検索の他、APIが用意されていた新着投稿(newest)画面も作りました。
画面一覧です。

* Search(検索結果の表示)
* Newest(新着投稿の表示)
* Random(ランダムに取得した投稿の表示)

上記3つはサムネイル一覧を表示する画面になっていて、画像の詳細や関連画像を表示するDialogはすべての画面で共通のコンポーネントとして実装しています。

## 使った(Angular Materialの)コンポーネント・ライブラリ

今回始めて使ったAngular Materialのコンポーネントや導入したライブラリなどを実装した箇所と合わせて幾つか紹介したいと思います。

### Autocomplete (AngularMaterialのコンポーネント)

navbarにある検索フォームのサジェスト機能にはこのコンポーネントを使いました。 
tiqavにはフリーワードでタグ一覧を検索するAPIが用意されているので、これを検索ワードのサジェストに流用しています。
また、Autocompleteコンポーネントとは直接関係ありませんが、rxjsの`debounceTime`というoperatorがサジェスト機能を実装する際にかなり便利でした。

### Dialog (AngularMaterialのコンポーネント)

画像一覧画面から画像を選択した際に開くDialogはこのコンポーネントを使用しました。

### Tabs (AngularMaterialのコンポーネント)

タブの内容にと対応するURLの同期方法に関しては、別途ブログに記事を書きました。
http://daikiojm.hatenablog.com/entry/2017/09/10/192714

### ng-lazyload-image　(Angularのライブラリ)

Lazy image loader for Angular ≥ v2 
https://github.com/tjoskar/ng-lazyload-image

画像のLazyloadeライブラリです。
今回使用したtiqavのAPIでは、一回に取得する画像の枚数が30枚に制限されているため、スクロール操作に関しては考慮しませんでしたが、
画像の読み込み中に、順にパラパラと表示されて画面がちらつくのを防ぐのには便利でした。

### ngx-clipboard

A wrapper directive for clipboard.js
https://github.com/maxisam/ngx-clipboard

[clipboard.js](https://github.com/zenorocha/clipboard.js/) のAngular wrapperライブラリです。
画像詳細モーダルから、画像の埋め込みリンクなどをコピーさせる際に使用しました。


## 所感

angular-cli + TypeScriptでのフロントエンド開発、結構楽しいです。
数か月前までWebフロントエンド界隈のことはあまり知らず、闇が深い印象を抱いていましたが、angular-cliが面倒なことをまとめてやってくれていることもあり今のところAngular自体につらみを感じることはほぼありません。
Angular Materialはまだ使えるコンポーネントが限られていることもあり、Bootstrapなどに慣れている身からすると物足りなさがある印象でした。angularjs 1.x系のAngular Materialでは使えるコンポーネントやAPIの数がもうちょっと多いようなので、今後に期待です。


## ソース

https://github.com/daikiojm/tiqav-angular-frontend
10分でRailsブログを作成

10分でブログを作る、以下の記事を最新のRails環境で再現しました。
http://dqn.sakusakutto.jp/2012/03/rails32blog.html

```
$ rails new blog
$ cd blog
$ subl GemFile
```
書き加えるGemは以下。

```
gem 'execjs'
gem 'therubyracer'
```
ローカルサーバを立ち上げる。

```
$ bundle install
$ rails s
```

http://localhost:3000/ にアクセス、動作確認をする。

```
$ rails g controller home index
```


config/routes.rb に追記。

```routes.rb
root :to => 'home#index'
```

http://localhost:3000/ にアクセスし、以下の表示を確認。

```
Home#index
Find me in app/views/home/index.html.erb
```

scaffoldでCRUDを作成。

```
$ rails generate scaffold Post name:string title:string content:text
$ rake db:migrate
```

indexにて、以下を追記、postsへのリンクを貼る。

```index.html.erb
<%= link_to "My Blog", posts_path %>
```

入力内容があるかどうかバリデーションするために、app/models/post.rb に以下を追記する。

```post.rb
  validates :name,  :presence => true
  validates :title, :presence => true, :length => { :minimum => 5 }
```

コメント機能を実装するために、モデルとコントローラーを作る。
まず、モデルの作成。

```
$ rails generate model Comment commenter:string body:text post:references
$ rake db:migrate
```

先ほど編集したapp/models/post.rb に以下を追記。

```post.rb
  has_many :comments
```

config/routes.rb に追記。

```routes.rb
resources :posts do
  resources :comments
end
```

次にコントローラーの作成。

```
$ rails generate controller Comments
```

app/views/posts/show.html.erb に以下を追記。

```show.html.erb
<h2>コメント</h2>
<% @post.comments.each do |comment| %>
  <p>
    <%= comment.commenter %>: <%= comment.body %>
    <%= link_to '削除', [comment.post, comment],
               :confirm => 'よろしいですか？',
               :method => :delete %>

  </p>
<% end %>

<h2>コメントを書く</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
```

app/controllers/comments_controller.rb に以下を追記。

```comments_controller.rb
  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])
    redirect_to post_path(@post)
  end

  def destroy
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:id])
    @comment.destroy
    redirect_to post_path(@post)
  end
```