OmniAICreator/Qiita-1.07M huggingface dataset:
AE　GoldenRatioアニメーションプリセット作りましたが・・・

#黄金比率を表示させる
AEで昔から使っていたアニメーションプリセットがあるのですが、それはベースとなるサイズが％で表記されてたので、自分なりに作ってみましたが・・・。
ベースサイズを変えた時ポジションだけがうまくいかなかったのですが、とりあえず自分が使う分にはと思い、良きところで諦めました(笑)
とりあえず、記録としてアニメーションプリセットも載せておきます。
全てAE内のパスで作成しています。
ソースも多いしぐちゃぐちゃなので今回は割愛致します。
とりあえず最低限使えます。

https://goo.gl/wwpCRN

![bandicam 2018-06-08 19-01-25-749.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/fbd22a55-fec6-89a8-f358-f26e7c75f69b.jpeg)
【github API】プルリクとmasterとのコンフリクトを検知

github APIを使って個別のプルリクを取得すると、masterとコンフリクトしているかどうか
検知することができます。

まず個別のプルリクの情報をとってくる方法はこちら（アクセストークンを使う場合）

```bash
curl https://api.github.com/repos/組織名/リポジトリ名/pulls/プルリク番号?access_token=アクセストークン
```

レスポンスがjson型式で帰ってきますが、この中の'mergeable'という項目が
コンフリクトしているか否かを示しています
（mergeable = false ならコンフリクトしてる、trueなら大丈夫）


ところで上記のコマンドのURLにあるプルリク番号を省略すると全てのプルリクの情報をとってくることができるのですが、
残念ながら各プルリクのmergeableの項目がなくなってます…
というわけで、「openしてる全てのプルリクに対してコンフリクトしてないか調べたい！」という場合、

1. 全プルリクを取ってくる

```bash
curl https://api.github.com/repos/組織名/リポジトリ名/pulls?access_token=アクセストークン?state=open
```

2.各プルリクの番号を取得

3.各プルリクに対して、上記の個別情報を取ってくるコマンドを実行

という流れになります。
バニラjavascriptを書くのにざっと使ったもの

# バニラjavascriptを書くのにざっと使ったもの

## class名で要素を取得
document.getElementsByClassName('クラス名');
HTMLCollection 要素として返ってくるので配列として使えない。

## カスタムデータ
// class name の場合
document.querySelector(".className");
document.querySelectorAll(".className"); //複数の場合


## タグで取得
document.getElementsByTagName('タグ名');

## id名で要素を取得
document.getElementById("className");

## イベントリスナー
```javascript

document.addEventListener( 'DOMContentLoaded', function()
{
}, false );

openBtn.addEventListener('click', () => {
});

//複数の時、それぞれに指定
for (var i = 0; i < closeBtn.length; i++) {
  closeBtn[i].addEventListener('click', () => {
  })
}
//上記書き方変更
for(const value of closeBtn.entries()) {

}

//resize
window.addEventListener('resize', () => {
    this.checkDevice();
});
window.addEventListener('resize', this.checkDevice);

// 要素読み込み
document.addEventListener("DOMContentLoaded", function() {
});
document.addEventListener("DOMContentLoaded", this.setting);
```

## class remove add hasClass
```javascript
BODY.classList.remove(OPEN_CLASS);
BODY.classList.add(OPEN_CLASS);
BODY.classList.contains(OPEN_CLASS); // hasClass // true or false
```

## attr 系
```javascript
//set
var imgscr = elm.getAttribute("data-src");
elm.setAttribute("src", imgscr);

// get
elm.getAttribute('data')
or
elm.attributes['data'].value

```

## find系
普通にdocumentから始めず、制限したい要素から付ける

```javascript

getElementById('wrapper').querySelector(".pageImage")
```


## 特定の要素
### html
```javascript

document.documentElement;
document.body;
```

## offset
```javascript
var myTop = $("#main").offset().top
//書き換え JavaScript
var myMain = document.getElementById("main");
var rect = myMain.getBoundingClientRect();
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
var myTop = rect.top + scrollTop;

// matome
document.getElementById(value.getAttribute("href")).getBoundingClientRect().top + (window.pageYOffset || document.documentElement.scrollTop);
```

## wight
バニラってわけじゃないけど

```javascript
// window
var windowWidth = (window.innerWidth || document.documentElement.clientWidth || 0);
var windowHeight = (window.innerHeight || document.documentElement.clientHeight || 0);

// element
var elmHeight = element.clientHeight;
```

## next()

```javascript

const nextElem = (node, selector) => {
  if (selector && document.querySelector(selector) !== node.nextElementSibling) {
    return null;
  }
  return node.nextElementSibling;
};
nextElem(elem);
```



## scroll eventの計算のやつ

```javascript
let last_known_scroll_position = 0;
let ticking = false;

function doSomething(scroll_pos) {
  // Do something with the scroll position
   last_known_scroll_position = window.window.scrollY ? window.scrollY : window.pageYOffset;;
}

window.addEventListener('scroll', () => {
  

  if (!ticking) {
    window.requestAnimationFrame(function() {
      doSomething(last_known_scroll_position);
      ticking = false;
    });

    ticking = true;
  }
});
```
【Git初心者向け】作業ツリー、ステージ、HEADの関係図と操作一覧

※半分個人メモ用です！雑ですいません！

Gitについてよく分からないまま雰囲気でやっていたり、個人でとりあえず手を動かしながらサービスを作り始めたという人には、下記の本がオススメです！

[わかる Git](https://www.amazon.co.jp/%E3%82%8F%E3%81%8B%E3%82%8B-Git-%E5%86%A8%E6%B0%B8%E5%92%8C%E4%BA%BA-ebook/dp/B00IAOPGDO)

下記の図は、この書籍に掲載されている、作業ツリーとステージとHEADの関係と操作一覧が図にされたものを抜粋したものです。
![スクリーンショット 2018-06-08 18.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/237015/571f73c8-ca06-bc8f-a5e9-f666f0ec658d.png)
Rubyで負の二項分布のヒストグラムを描く

科学計算用のRubyのプロジェクトである [Ruby Numo](https://github.com/ruby-numo) のツールを使って、負の二項分布のヒストグラムを描いてみました。
![fuga2.png](https://qiita-image-store.s3.amazonaws.com/0/144608/da91982f-06ff-fc6b-f992-6f958b386d2b.png)

## 準備
### Gnuplot と numo/gnuplot のインストール

```shell
sudo apt install gnuplot
gem install numo-gnuplot
```
### GSL と numo/gsl のインストール

GNU Scientific Library (GSL)をインストールします。2018年6月8日時点では ruby-numo は GSL バージョン 2.4 に対応していませんので、必要に応じて 2.3 をソースコードからインストールします。

GSL のインストール

```shell
cd gsl-2.3
./configure
make -j4
sudo checkinstall
# make DESTDIR=/path/you/want/to/install/ install
```

numo/gsl のインストール

```shell
git clone https://github.com/ruby-numo/numo-gsl
cd numo-gsl
rake build
gem install pkg/numo-gsl-0.1.2.gem # -- --with-gsl-lib=usr/local/lib
# gem install pkg/numo-gsl-0.1.2.gem -- --with-gsl-lib=/path/you/want/to/install/usr/local/lib
```

## ヒストグラムを描出する

```ruby
require 'numo/gsl'
require 'numo/gnuplot'

h = Numo::GSL::Histogram.new(20)
h.set_ranges_uniform(0,40)

g = Numo::GSL::Rng::Rand.new
a = g.negative_binomial(0.2, 3.5, 50000)

a.each do |x|
  h.increment x
end

freq = h.bin
center_of_range = h.range.to_a.each_cons(2).map{|a,b| (a+b)/2.0}

Numo.gnuplot do
  set title:"負の二項分布"
  set style:[:fill, :solid, {border:-1}]
  set xtics:["rotate by": -45]
  plot center_of_range, freq, u:"2:xtic(1)", w: :boxes, lc:{rgb:"orange"}, t:"p=0.2, n=3.5"
end

gets # 終了まち
```

結果
![fuga2.png](https://qiita-image-store.s3.amazonaws.com/0/144608/da91982f-06ff-fc6b-f992-6f958b386d2b.png)
Macでゲームパッドを動かす方法

### ■ Macでゲームパッドを動かす方法【使用ツール編】

- 環境
 - OS Mac OS High Sierra
 - [ゲームパッド 1000円程度の物](https://www.amazon.co.jp/iBUFFALO-USB%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%91%E3%83%83%E3%83%89-8%E3%83%9C%E3%82%BF%E3%83%B3-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%95%E3%82%A1%E3%83%9F%E3%82%B3%E3%83%B3%E9%A2%A8-BSGP815GY/dp/B06XWD8QQJ)
   
<img width="1045" alt="スクリーンショット 2018-06-08 18.15.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/f469a928-076e-6dcd-d5fc-d37964a78605.png">

- 使用ソフト
 - [USB Overdrive 3.3 is ready for High Sierra.](http://www.usboverdrive.com/USBOverdrive/News.html)
 - [過去バージョンはこちら](http://www.usboverdrive.com/USBOverdrive/Download.html)

----------
### ■ Macでゲームパッドを動かす方法【環境設定編】
1. USB Overdriveをインストールする
2. USB Overdriveのアイコンを選択（システム環境設定より）

<img width="666" alt="スクリーンショット 2018-06-08 18.26.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/3c6b1d79-5bd7-41b2-c012-3d016bb323c0.png">

3.無料版は10秒待たないと使えない仕様（気長に待とう。）10秒立ったら「Register Later」を押下
<img width="656" alt="スクリーンショット 2018-06-08 18.27.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/a9ff2e19-7bbe-21b3-0d1a-df4dcc5895ee.png">

4.Settingsタブ→New Duplicate Settings...を押下
<img width="653" alt="スクリーンショット 2018-06-08 18.30.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/0d072e60-701f-e18d-80d3-d9d065ea56fd.png">

5.このように設定しOKを押下
<img width="476" alt="スクリーンショット 2018-06-08 18.30.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/786374fc-8aca-7646-d10e-e53a571999a7.png">

6.ゲームパッドのボタンを認識してくれる画面。（今は何も書かれていないので適当なゲームパッドのボタンをおしてみよう）
<img width="664" alt="スクリーンショット 2018-06-08 18.33.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/9d1144d8-f5aa-4312-7268-e7889e046398.png">

7.すべてのボタンが認識するとこのような形になります。（十字キーがすこしわかりにくいので注意）
ゲームパッドのボタンを押下すると、青色になりリアクションを返してくれます。
<img width="665" alt="スクリーンショット 2018-06-08 18.34.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/336ff443-abfa-b80f-bfee-f70e06456027.png">

8.ゲームパッドのボタンに対してキーの割当てを行う。Keyboard key to pressのボックスをクリックし
Mac側のキーボードを押すとそのキーに紐付けられる。

<img width="663" alt="スクリーンショット 2018-06-08 18.35.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/a506f924-3879-2f23-b45f-579ea399801d.png">


これで設定完了！！素敵なゲームライフを！
PHPでXEMを送金してみる

PHPでNEMを取り扱う必要があったので、TestnetでXEMを送るところまで検証してみました。
※最近、NEM2(Catapult)の話ばかりしていましたが、今回の話は**現行NEM**の話です。

## ライブラリの導入

今回は、[nem-php](https://github.com/evias/nem-php)を使ってみました。
ライブラリはcomposerを使ってインストールしましたが、`kornrunner/keccak`の`dev-master`に依存しているらしく、requireに`evial/npm-php`だけ指定しただけではうまくインストールできないので、注意が必要です。
composer.jsonは以下のような感じになります。

```JSON
{
    "name": "daoka/nem-php-sample", // 任意の名前を設定
    "require": {
        "kornrunner/keccak": "dev-master",
        "evias/nem-php": "^0.2.11"
    },
    "autoload": {
        "psr-4": {
            "NemPhpSample\\": "src/" // 任意の名前に変えておく
        }
    }
}
```

## XEMを送金してみる

以下のソースコードを参照。

```php
<?php

require_once("vendor/autoload.php");

$nemAPI = new NEM\API();
$nemAPI->setOptions([
    "protocol" => "http",
    "use_ssl" => false,
    "host" => "192.3.61.243",
    "port" => 7890,
    "endpoint" => "/",
]);

$sdk = new NEM\SDK([], $nemAPI);

$privateKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$keypair = new NEM\Core\KeyPair($privateKey);

// 送信したいメッセージを指定
$message = new NEM\Models\Message();
$message->setPlain("hogehoge");

// TimeStampはUNIXタイムからnemesisタイムを引いた値にする
$timeStamp = time() - NEM\Models\TimeWindow::$nemesis;
// deadlineはtimeStampから24時間以内の時間を指定する
$deadline = $timeStamp + 24 * 60 * 60;

$txData = [
    "timeStamp" => $timeStamp,
    "deadline" => $deadline,
    // トランザクションのタイプを指定する
    "type" => NEM\Models\TransactionType::TRANSFER,
    "amount" => 1000000, // マイクロXEMで指定する
    "message" => $message,
    // 送信先アドレス
    "recipient" => "TXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    // メインネットなのか、テストネットなのか、モザイク添付ありなので変わる
    "version" => NEM\Models\Transaction::VERSION_1_TEST
];

// トランザクションのモデルを生成
$transferTx = NEM\Models\Transaction::create($txData);

$service = $sdk->transaction();

// 送信するアカウントの秘密鍵で署名して、ネットワークに流す。
$result = $service->announce($transferTx, $keypair);
var_dump($result);
```
ユニティちゃんのBlendShapeに母音(a,i,u,e,o)がない

#問題
ユニティちゃんを口パクさせて遊ぼうとアセットストアから["Unity-chan!" Model](https://www.assetstore.unity3d.com/jp/#!/content/18705)をインポートしたが、母音(a,i,u,e,o)に対応するBlendShapeがなかった。
####動作モデル
"Unity-chan!" Model - Version : 1.1 (2014.6.16)
Unitychan/Prefabs/unitychan.prefab

![noblend.png](https://qiita-image-store.s3.amazonaws.com/0/140271/857bfd7c-82c7-391c-e2ce-3ff750a8e208.png)


#解決
アセットストアからではなく、Unityの[公式](http://unity-chan.com/contents/guideline/)からダウンロードしてインポートする。こっちのモデルには母音(a,i,u,e,o)のBlendShapeが用意してある。

####動作モデル
ユニティちゃん 3Dモデルデータ-  Version：1.2.1(2017.02.15)
Unitychan/Prefabs/unitychan.prefab

![yesblend.png](https://qiita-image-store.s3.amazonaws.com/0/140271/a64700ef-56e9-171d-3e84-fb2be1c76405.png)

#補足
アセットストアのユニティちゃんはバージョンがかなり古いです。こちら[(ユニティちゃん-データ-ver-1-2公開！)](http://unity-chan.com/contents/staff-note/%E3%83%A6%E3%83%8B%E3%83%86%E3%82%A3%E3%81%A1%E3%82%83%E3%82%93-%E3%83%87%E3%83%BC%E3%82%BF-ver-1-2%E5%85%AC%E9%96%8B%EF%BC%81/)を見る限りユニティちゃんが母音のBlendShapeに対応したのはVer1.2からのようですね。アセットストアで配布されているのは、Ver1.1なので対応していません。公式のDLページの過去のリリースを見れば、各バージョンの変更点について述べられているのですが、BlendShapeについての言及がないので分かりにくくて厄介です。



![imageLicenseLogo.png](https://qiita-image-store.s3.amazonaws.com/0/140271/d8987727-53f0-271e-f15d-7e3261ffba9c.png)
この作品はユニティちゃんライセンス条項の元に提供されています
IntelliJ IDEAで選択範囲を拡大していくショートカット

# はじめに<a id="sec-1" name="sec-1"></a>

好きなemacsのパッケージの中で[expand-region](https://github.com/magnars/expand-region.el) ってパッケージがあるんですけど
IntelliJ IDEAでこのパッケージと同様に選択範囲をちょっとずつ拡大させたかったです。

# 設定<a id="sec-2" name="sec-2"></a>

`File -> Setting -> Keymap` から以下のコマンドにキーを割り当てる

-   Extend selection
    -  選択範囲の拡大
-   Shrink selection
    - 選択範囲の縮小

自分はそれぞれ `Ctrl+Alt+@` と `Ctrl+Shift+Alt+@` に割り当てました。

# おわりに

カーソルキーをバシバシ連打しなくてもコードブロックごとに選択できるようになって満足:relaxed:
パソコン固定　スマホクリップを探せ

#スマホクリップで最適ものとは
パソコンにカメラがついていないのでユーチューバー的な活動ができない。
そこでしょうがないので持っているスマホのカメラをつかってユーチューバーになることを考えました。

まずはスマホを高い位置に固定したいので、パソコンへくっつけられるようなそんなクリップがあるといいですよね

たとえばこんな感じのやつ![Screenshot_20180608-162826.jpg](https://qiita-image-store.s3.amazonaws.com/0/204488/c89ab339-c759-7f63-fca4-34390d946e57.jpeg)


だけどマレーシアには売っていなかったので、これを文房具屋さんでかいました。

![IMG_20180608_172333.jpg](https://qiita-image-store.s3.amazonaws.com/0/204488/df503378-d2c7-675f-612f-89f6ec124446.jpeg)
1リンギットくらいでやすかったですねー。

パソコンにつけるとこんなこんな感じになりました。
![P_20180608_214753_vHDR_Auto-01.jpeg](https://qiita-image-store.s3.amazonaws.com/0/204488/87535870-b9e2-7a1e-6118-4aa16a92540e.jpeg)
Djangoのreverseに引数を渡す

Python 3.5.2
Django 2.0

args

```python:
>>> reverse('app:foo', args=[pk])
/app/foo/4
>>>
```

kwargs

```python:
>>> reverse('app:foo', kwargs={'pk':pk})
/app/foo/4
>>>
```

どっちも同じurlが生成された。

https://docs.djangoproject.com/en/2.0/ref/urlresolvers/#reverse
ファイル読み込みのメソッドに、IOオブジェクトの代わりに文字列を渡した場合の挙動

例えば設定ファイルの読み込みなど、ファイルを読み込んでパースするメソッドを作ることがよくあると思います。

```rb
class Config
  def self.load(source)
    source.each do |line|
      parse(line)
    end
  end
end

Config.load(File.open("app.conf"))
```

Aさん「`Config`クラスを使う側がわざわざファイルをopenするのも面倒なので、ファイル名だけ渡せばいいようにしよう」
Bさん「えっ、パースされる文字列を引数として渡したいよ！」

```rb
# Aさん案
Config.load("app.conf")

# Bさん案
Config.load("VAR_A=1\nVAR_B=10\n")
```

悩ましいですねえ。
Ruby的にはどちらが多いんでしょうか？

というわけで、今回はRubyの標準添付ライブラリから、引数にIOと文字列を取るメソッドを調べ、文字列を渡した場合に

1. ファイルのパスとして解釈し、そのファイルを読み込む
1. その文字列自体をパースする

のどちらが多いのか調べてみました。

# CSVライブラリ
2.その文字列自体を処理する

`CSV.new`は最初の引数にIOまたはStringをとり、文字列を渡すとCSV文字列として扱われます。
ファイル名を渡したい場合は`CSV.open`や`CSV.table`を使います。

# JSONライブラリ
2.その文字列自体を処理する

`JSON.load`が取る引数は、Stringまたは`to_str`, `to_io`, `read`のいずれかのメソッドを持つオブジェクトです。
ファイル名からJSONを読み込むメソッドはないので、明示的にopenして渡さなければなりません。

# YAMLライブラリ
2.その文字列自体を処理する

`YAML.load`もStringまたはIOを引数に取り、StringはYAML文字列として解釈されます。
ファイル名から読み込むには、`YAML.load_file`があります。

# REXMLライブラリ
2.その文字列自体を処理する

rexmlには、XMLのパース方式によって`REXML::Document.new`、`REXML::Parser::PullParser.new`、`REXML::Parser::SAX2Parser.new`など様々ありますが、全て引数にはStringかIO（またはその互換オブジェクト）をとり、StringはXML文字列とみなされます。

# 結論
圧倒的に 2. その文字列自体を処理する ですね！
こちらのほうがよりRubyらしいと言えるでしょうか
railsでjqueryをリロードしないと起動しない

```html.erb
<head>
..
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
..
</head>
```
を

```html.erb
<head>
..
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'load' %>
..
</head>
```

にしました。



jquery.turbolinksを追加してもできなかったのですが、これでできました。
【Jupyter Notebook】Jupyter notebookの動作が重い

最近はPythonをJupyter Notebook で使う機会が多いのですが、環境を整備していくうちに
**「私のJupyter、遅すぎ...？」**状態になっていました。

最初は気のせいかとも思ったのですが、同様の症状がある人が他にもいたので、原因を調べてみました。

#具体的な症状
・セルを実行していくと、**だんだん実行に時間がかかる**ようになる
　⇒[＊]表示になってから実行開始までの謎のタイムラグ
・カーネルリスタートすると始めは快適だが、実行していくうち同様の症状が出てくる
・処理の重さは関係なさそう

#原因
日本語で調べてみるもなかなかヒットせず...英語のページをあさってみて、やっと見付けた！

どうやら既出の問題だったようです。
https://github.com/ipython-contrib/jupyter_contrib_nbextensions/issues/1275

JupyterNotebookまわりの環境を整える際、**nb_extensions**という拡張機能を入れていたのですが、その中の変数インスペクタ機能(**Variable Inspector**)が悪さをしていたよう。
Spyderぽく使えるし、めっちゃいいやん！と思っていた拡張機能、こいつが原因だったとは...

#対処法
対処法はかんたん！
nb_extensionsの変数インスペクタ機能(Variable Inspector)をOFFにしたら上述の症状が出なくなりました。

個人的にはすごく便利な機能だったので、使えなくなるのは中々に惜しいですが...仕方ないですかね...
SouceTreeでGitHubアカウントでのサインインができなくなった時の対処法

#現象
SourceTreeでCommitはできたが、Pushがいつまでたっても完了しない状態になった。

GitHubのアカウント認証に失敗しているようだったので、SourceTreeからリモートリポジトリをみてみたら、
GitHubへのサインインを要求されたので、メールアドレスとパスワードを入力したら以下のエラーが返された。

Could not authorize request with the available token. Please re-authenticate.

#解決法
①GitHubアカウントのPersonal Setting→ Applications　→ Authorized OAuth Appsを確認
　　　→SourceTreeForMac(Macの場合)があることを確認
②SourceTreeの設定アイコン→アカウント→GitHubアカウントの接続し直し。
　　　→エラーはでず、Sign　inできているように見えるが、Pushは失敗する。
③KeyChain AccessのGitHub Credentialsとgithub.com Access Key for [アカウント名]のパスワードを削除　→PC再起動　→SourceTreeでGitHubにサインインし直し。

③でやっと解決。

#原因
SourceTreeがGitHub Credentialsのパスワードのアクセス許可を求めるダイアログが複数生成、
一つ常に許可して、複数でてた他のダイアログが閉じるボタンがないため、拒否で閉じたのが原因だと考えられる。


##参考リンク
https://community.atlassian.com/t5/Sourcetree-questions/Getting-quot-Could-not-authorize-request-with-the-available/qaq-p/708633
https://community.atlassian.com/t5/Sourcetree-questions/Authentication-issue-accessing-GitHub-repos/qaq-p/397660
https://stackoverflow.com/questions/23039133/github-sourcetree-getting-unauthorized-error
Qiitaの投稿で@をエスケープする

#結論
`@&#xFFF0;foo` または `@&#65520;foo` と入力すればよい。 こうなる -> @&#xFFFc;foo
（2018年6月現在、`&#xFFF0`から`&#xFFFC`の間の文字コードだったらいけます。将来使えなくなる可能性があるので、その点だけご注意ください。）

#詳細
Qiitaで投稿を書いているとき、@の後ろに半角英字を続けると、 @foo のようにデコレートされてユーザーへのメンションになりますが、そうしたくないときもありますよね。しかし、@をエスケープしようとするとこうなります。

「バックスラッシュでエスケープされんじゃね？」\@foo -> 残念

「実体参照を使えばエスケープされるかも？」 &#64;foo -> 残念
(アットマークではなく `&#64;foo`と入力してます。) 

「じゃあ半角スペースを入れる」 @ foo -> ダサい

「じゃあバッククウォートで囲む」 `@foo`-> 強調したくないときもあるじゃないですか

じゃあどうするか？

「[特殊用途文字(Specials)](https://qiita.com/innossh/items/f719dc78816c2d5fbcfa)」（仮に「非文字コード」とこの記事の作者は呼んでいますが）が使えます。2018年6月現在、この記事で紹介されている`FFF0`以外にも、`FFF0`から`FFFC`までの文字コードは同様に利用できます。（将来的にこれらの文字コードに文字が割り当てられた場合、今回の用途には利用できなくなる可能性はあります。）

ただ、記事で紹介されているような形で**使うたびにコピーしなくてはならないのはつらい**。そこで、[実体参照](https://www.w3schools.com/charsets/ref_html_symbols.asp)を使おうということになります。[U+FFF0](https://www.compart.com/en/unicode/U+FFF0)について見てみると、実体参照としては`&#xFFF0;` か `&#65520;` を使えばいけそうだとわかります。こんな感じです。

@&#xFFF0;bar (<- `@&#xFFF0;bar`)
@&#65520;bar (<- `@&#65520;bar`)

わーい。

#参考
HTML Symbol Entities
https://www.w3schools.com/charsets/ref_html_symbols.asp
Markdownのtable記述でのエスケープ
https://qiita.com/takashisite/items/f3000d46d39a61930dc5
Specials (Unicode block)
https://en.wikipedia.org/wiki/Specials_(Unicode_block)
Twitterで@（アットマーク）をエスケープする方法
https://qiita.com/innossh/items/f719dc78816c2d5fbcfa
Undefined Character (U+FFF0)
https://www.compart.com/en/unicode/U+FFF0
ブロック（Unicode）https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF_(Unicode)
フォルダ内にある狙ったファイルをひたすら開きまくるマクロ

いつもは写真台帳しか作っていない私が、珍しくフォルダとを取り扱ったので備忘録としてメモしておきます。

とりあえずコードから・・・


```vb:エクセル開くよ

Sub フォルダ指定()
    Dim folder, filepath, path, エクセル名 As String
    Dim i As Integer
    Dim フォルダー(100) as Variant
    
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            path = .SelectedItems(1)
        End If
    End With
    If path = "" Then
        MsgBox ("キャンセルしました")
        End
    End If

    i = 0
    
    path = path & "\"
    folder = Dir(path, vbDirectory)
    Do While Len(folder) > 0
        If GetAttr(path & folder) And vbDirectory Then
            If folder <> "." And folder <> ".." Then
                フォルダー(i) = folder
                i = i + 1
            End If
        End If
    folder = Dir()
    Loop
    
    i = 0
    
    Do While フォルダー(i) <> ""
        エクセル名 = Dir(path & フォルダー(i) & "\" & "*" & "ここに検索したいエクセルの名前を指定する" & "*")
        filepath = path & フォルダー(i) & "\"　& エクセル名
        If エクセル名 <> "" Then
            Workbooks.Open Filename:=filepath
            "何か開いたエクセルで処理をしたければここに処理を記述する"
        End If
    i5 = i5 + 1
    Loop
End Sub
```

ざっと要点としては
1．application.filedialog(msofiledialogfolderpicker)にてフォルダを指定する。
2．dir関数で指定したフォルダの中にあるファイルorフォルダをすべてチェックしに行く
　　└dir関数でフォルダを指定すると一番最初に呼び出されるフォルダの名前がなぜか"."と".."と順に呼び出されるためif文で回避
　　　└ひたすらフォルダー（）という配列に呼び出した名前を格納する。
3．Do While の次の文のエクセル名=というところは　Dirのプロパティを見てもらった方が早いかも
　 とりあえずはまったのがDirを複数回するとフォルダがもどれねぇ！！！戻るすべは有るのだろうけどもChDirとかでごり押さなきゃだめかも？やり方を詳しく調べていないのであしからず・・・。
　 ここに検索したいエクセルの名前を指定するの前後に"*"がある理由としては拡張子がエクセル以外フォルダに絶対はいらない仕様で作っていたので必要に応じて変えてクレメンス。
　下手するとメモ帳とかの名前も引っ張ってきちゃうかも

相変わらずfor文が使えずDoLoopでゴリ押していますが恐らくFor分の方がすっきりしそう

以上はまった部分のメモと備忘録でした。

※色々とコードの中に表に出しちゃいけない部分があったため、一部Qiita上で書き直しているので変数の宣言とか間違ってたらごめんなさい！
Phalconのルーティングメモ

Phalconのルーティングを忘れないメモです。

* Phalcon3を前提。

# 基本

```php
$router->add('/', ['controller' => 'home', 'action' => 'index']); // HTTPメソッドならなんでも
$router->addGet('/', ['controller' => 'home', 'action' => 'index']); // GETだけ
$router->addPost('/', ['controller' => 'home', 'action' => 'index']); // Postだけ
$router->add('/', ['controller' => 'home', 'action' => 'index'])->via(['POST', 'PUT']); // 個別指定
```

#Short Syntax

```php
$router->add('/', ['controller' => 'home', 'action' => 'index']); // これを
$router->add('/', 'home::index'); // こう書くことが出来る
```

# 別名つける

```php
$router->add('/', 'home::index')->setName('home');

// $url->get(['for' => 'home']); // /
```

# パラメータ埋め込み

```php
$router->add('/users/{id}', 'user::show');
$router->add('/users/{id:[0-9]+}', 'user::show'); // 正規表現で制御

// 取得の際は
// $this->dispatcher->getParam('id');
// で取得
```

# converter

dispatcherにわたす前に変換してくれるやつ、この場合はidというパラメータをModelの取得結果を返すように変更してる

```php
$router->add('/products/{id}', 'products::show');

$router->convert('id', function($id) {
    return Product::findFirstById($id);
});
```

# ルーティングのグルーピング

```php
class BlogRoutes extends \Phalcon\Mvc\Router\Group
{
    public function initialize()
    {
        $this->setPaths(
            [
                'module'    => 'blog',
                'namespace' => 'Blog\Controllers',
            ]
        );

        // All the routes start with /blog
        $this->setPrefix('/blog');

        // Add a route to the group
        $this->add('/save','blog::save');
    }
}

$router->mount(new BlogRoutes()); // マウントしないと適用されないので注意
```

# 正直

PhalconのルーティングはLaravelに比べてあきらかにしょぼい。
Windows 10 レジストリの元号

#設定はどこにあるのか
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras`
ここにあります。

![レジストリ エディターの表示例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195741/3c738d72-301d-8e01-8a26-a0895ba35001.png)

.NET Framework 3.5 ではハードコードされた元号が使われていましたが、レジストリを参照するように統一されました。その他の対応も含め、詳しいことは以下の記事に書いてあります。
[新元号への対応について](https://www.microsoft.com/ja-jp/mscorp/newera/default.aspx)


#PowerShell で和暦を表示
```powershell
$culture = New-Object cultureinfo("ja-JP")
$culture.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar
$date = Get-Date
$date.ToString("ggyy年MM月dd日", $culture)
```
PowerShell で上記を実行すると `令和元年05月01日` のように表示されます。3行目では現在の日付を取得していますが、任意の日付を表示する場合は `$date = [datetime]"2019-05-01"` のように指定します。

#仮定義による表示の違い
<details><summary>過去の記事につき折りたたんでいます。</summary><div>

~~April 2018 Update で新しい元号が入る場所には仮の値が追加されました。
このため、レジストリを参照するコントロールや .NET Framework 4 以降などは影響を受けます。~~

更新プログラム [KB4458469](https://support.microsoft.com/ja-jp/help/4458469/windows-10-update-kb4458469) により仮定義が削除されました。引き続き検証が必要な場合は、手動でレジストリに仮の値を追加することができます。October 2018 Update も仮定義が含まれない状態で出荷されています。
[Windows 10 Version 1803 における新元号の仮定義の削除について](https://blogs.technet.microsoft.com/jperablog/2018/09/21/april2018update-placeholder-deletion/)

仮定義 `？？_？_??????_?` を追加して、どのように表示が変わるのかを比較してみました。
それぞれの環境で JapaneseCalendar クラスを使った同じプログラムを実行しています。

|仮定義なし||
|:-:|:-:|
|![仮定義なしで実行したときのコマンド プロンプトの表示例](https://qiita-image-store.s3.amazonaws.com/0/195741/c373bd5b-1771-4897-de23-b60f366baa3d.png)||
|**仮定義あり**<br>「元年」の更新プログラム適用前|**仮定義あり**<br>「元年」の更新プログラム適用後|
|![仮定義を追加して実行したときのコマンド プロンプトの表示例（「元年」の更新プログラム適用前）](https://qiita-image-store.s3.amazonaws.com/0/195741/e79bfeec-44e8-f79a-306e-ec3f17b46337.png)|![仮定義を追加して実行したときのコマンド プロンプトの表示例（「元年」の更新プログラム適用後）](https://qiita-image-store.s3.amazonaws.com/0/195741/ce6e54b2-bfa5-3497-005f-9034e86ba184.png)|

2019年5月1日以降の元号は「？？」に置き換わっています。

また、仮定義がある状態で特定の更新プログラムが適用されていれば「？？01年」の部分が「？？元年」と表示されるようになっています。以前のように「1年」と出力させることも可能です。設定方法はフレームワークによって異なりますので、以下の記事をご覧ください。
[Handling a new era in the Japanese calendar in .NET](https://blogs.msdn.microsoft.com/dotnet/2018/11/14/handling-a-new-era-in-the-japanese-calendar-in-net/)

使用したソースコードは以下のとおりです。

```csharp
using System;
using System.Globalization;

internal class Program
{
    private static void Main()
    {
        var culture = new CultureInfo("ja-JP")
        {
            DateTimeFormat = { Calendar = new JapaneseCalendar() }
        };

        var year = new DateTime(2015, 01, 01);
        var date = new DateTime(2019, 04, 26);
        for (var i = 0; i < 10; i++)
        {
            Console.Write(year.ToString("yyyy年") + "\t");
            Console.Write(year.ToString("ggyy年", culture) + "\t");
            Console.WriteLine(date.ToString("ggyy年MM月dd日", culture));
            year = year.AddYears(1);
            date = date.AddDays(1);
        }

        Console.WriteLine();
    }
}
```
</div></details>

#参考情報
2019 年 5 月の新元号への変更に関する更新 | Microsoft サポート
https://support.microsoft.com/ja-jp/help/4470918/updates-for-may-2019-japan-era-change

Japan New Era Name Support Blog | 日本マイクロソフトの新元号 (和暦) 対応に関するサポート情報のブログ
https://blogs.technet.microsoft.com/jperablog/
Djangoのテストのアサーションの使い方

Python 3.5.2
Django 2.0

# assertFormError(response, form, field, errors)

```python:
   def test_form_with_an_error(self):
        params = {'name': 'もろこし輪太郎'}
        response = self.client.post('url', params)
        self.assertFormError(response, 'form', None, 'なにがしかエラー')
```
fieldをNoneにするとnon_field_errorsがチェックされる。

# assertRedirects(response, expected_url, status_code=302, target_status_code=200)

```python:
    def test_successfully(self):
        params = {'name': 'もろこし 輪太郎'}
        response = self.client.post('url', params)
        self.assertRedirects(response, 'redirect_url')

```
Red Hat Subscription Management でシステムの登録、サブスクライブするまで

Red Hat のリポジトリを使用して yum を実行するためには以下の手順が必要。

# 1.subscription-manager を使用する場合の proxy の設定
```shell-session
(例)
$ subscription-manager config --server.proxy_hostname=proxy.example.com --server.proxy_port=8080
※/etc/rhsm/rhsm.conf に上記の設定が反映される
```
# 2.システム登録
```shell-session
$ subscription-manager register --username xxxxx --password xxxxx
```
# 3.割り当てるサブスクリプションの確認
```shell-session
$ subscription-manager list --available 
::
Pool ID:             xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx★次の「4.」で使用
::
```
# 4.サブスクライブ
```shell-session
$ subscription-manager attach --pool=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
# 5.割り当て済みのサブスクリプションの確認
```shell-session
$ subscription-manager list --consumed
```

# 備考
Virtual Datacenter というサブスクリプションを使う場合、以下の virt-who の設定も必要となる。

Red Hat Virtualization Agent (virt-who) Configuration Helper
https://access.redhat.com/ja/labsinfo/virtwhoconfig

RHEL サブスクリプション (2013 パッケージ) の使用: シナリオ 5 仮想データセンター
https://access.redhat.com/ja/articles/1435793

Virtual Datacenter というサブスクリプションは、hypervisor 上で動作している環境で使用するサブスクリプション。
virt-who を使用して、hypervisor も　Red Hat のポータルに登録することになる。

virt-who については以下の情報も参照。

virt-whoとは何か
https://www.slideshare.net/moriwaka/virtwho

Red Hat Virtualization Agent (virt-who) Configuration Helper
https://access.redhat.com/labs/virtwhoconfig/

参考：
* https://access.redhat.com/solutions/1522143
libcurlでメモリーリークの対応記録

# 概要

Zabbix Agentの外部スクリプトで外部ページの生存確認をシェル実行していて、メモリが徐々に消費していく現象の対応記録として残します
相変わらず先人たちの情報でなんとか問題解決ができたので、この場をお借りしてお礼を申し上げます！

なお、発生時のキャプチャを取得していなかったので、下記の画像の数値の整合性はありませんのでご了承くださいOrz
同様の対応をされる場合は赤枠の箇所を確認して頂ければ良いかと思います。

# 実装している外部スクリプト

ごく普通のshellスクリプトです

```shell

curl -LI -Ss -w '%{http_code}\n'  -H 'Cache-Control: no-store' -A 'XXX-HealthChecker' $URL -o /dev/null
```

# 環境

- Amazon Linux AMI release 2018.03
- Zabbix agent 3.4.6-1.el6
- libcurl 7.53.1-16.84.amzn1

# 問題確認の時系列

1．Zabbixのメモリ使用量がじわじわと増えていく･･･
![zabbix.png](https://qiita-image-store.s3.amazonaws.com/0/30522/6a006edd-f3fe-e4c1-2a4e-e98736f1b1a9.png)
2. topコマンドでリソース情報を表示
　実装しているjavaアプリは600Mぐらいですが、buffer/cacheが**約1.7GB**も消費されている
　![top.png](https://qiita-image-store.s3.amazonaws.com/0/30522/aa716096-d6aa-65d5-d3d0-9c9759926ac9.png)
3. vmstatコマンドで仮想メモリやディスクI/Oの統計情報を表示
　1秒ごとにメモリ情報を表示

   ```shell
   > vmstat 1
   ```
　cacheが徐々に増えていく・・・
![vmstat.png](https://qiita-image-store.s3.amazonaws.com/0/30522/f6e84e22-4653-5579-0d5f-9dba3e247110.png)
4. slabtopコマンドでslabキャッシュ情報を表示
　dentryでやたらメモリ消費されています（本来は1.7GBほど消費されています）
![slab.png](https://qiita-image-store.s3.amazonaws.com/0/30522/a9af783e-dccf-eb47-8c1e-06bcd185e3cf.png)

# 対応

1. cacheメモリの削除(管理者権限)
  **sync**コマンドでメモリのデータをファイルに出力してから、メモリの削除を実行！

    ```
    # 1･･･ページキャッシュのみ
    # 2･･･Slabキャッシュ
    # 3･･･ページキャッシュ＆Slabキャッシュ

    > sync && echo 2 > /proc/sys/vm/drop_caches
    ```
2. libcurlのキャッシュ利用設定
    curl実行時にキャッシュにひたすら溜め込むのではなく、キャッシュから使えよという設定をします
    とりあえず全ユーザに適用できるように以下の環境変数を設定します
 　　ユーザ別で指定する場合は、実行ユーザにこの環境変数を適用してください

    ```conf:/etc/environment
    NSS_SDB_USE_CACHE=yes
    ```
    ※libcurlやnss-xxxxのバージョンアップなどの対策もあるが、すでに最新のものを使用していたので環境変数で対応した

# 対応後のグラフ

上記の対応後は一定量で安定します
![zabbix2.png](https://qiita-image-store.s3.amazonaws.com/0/30522/80795e97-3b7a-852c-d406-3df41ca57181.png)

# だがしかし！

ファイルのコピー、作成などをした際にもSlabキャッシュが増えていきますが！
そもそもLinuxの仕組み上ファイルを常にキャッシュすることで処理速度を高めているので、Slabキャッシュで消費されていても必要に応じて解放してくれます。なので、上記のようなバグ以外の時は気にしなくてもいいかも

# 参考サイト

- http://s-tajima.hateblo.jp/entry/2015/02/20/233615
- https://qiita.com/digitalpeak/items/4b39fdcb8fae7d09f406
- http://dexlab.net/pukiwiki/index.php?Memo%2FLinux%2Fcurl
- [いまさら聞けないLinuxとメモリの基礎＆vmstatの詳しい使い方](https://qiita.com/kunihirotanaka/items/70d43d48757aea79de2d)
- http://enakai00.hatenablog.com/entry/20110906/1315315488
- https://chienomi.reasonset.net/archives/livewithlinux/732

## Slabメモリとは

- https://www.ibm.com/developerworks/jp/linux/library/l-linux-slab-allocator/index.html
CUDAを用いたDeepLearning開発環境構築

GPUを用いてDeepLearningをやるための環境構築の備忘録です。

# 用意するもの
- Visual Studio 2017
- Anaconda
- CUDA 9.2
- cuDNN
- PyCUDA

# Visual Studioのインストール
まずは[Visual Studio 2017](https://www.visualstudio.com/ja/downloads/?rr=https%3A%2F%2Fwww.microsoft.com%2Fja-jp%2Fdev%2Fdefault.aspx)をダウンロード・インストールする。
インストール時に気をつけるのは、**Windows 10 SDKのコンポーネントを忘れずインストール**すること（オレンジ枠で囲ったところ）。''C++によるデスクトップ開発'' の下にあります。
ワークロードは画像に写っている４つをインストールしました。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/230579/e67d6cb1-b683-ab02-4b14-5e58abedca86.png)

# Anacondaのインストール
Pythonと主要ライブラリがセットになっているPythonパッケージ。pythonのIDEである「Spyder」が含まれている。
python3.6かpython2.7を選べる、64bitか32bitも選べるので自分の環境に合わせてインストール。私は3.6の方にした。
[Anaconda](https://www.anaconda.com/download/)からダウンロード

# CUDAのインストール
CUDA（クーダ）とはCompute Unified Device Archtectureの略称で、NVIDIAのGPUコンピューティング向けの統合開発環境です。プログラム記述、コンパイラ、ライブラリ、デバッガなどから構成されている。
[CUDA](https://developer.nvidia.com/cuda-downloads)から自分のPC似合うものを選択し、「Base Installer」よりダウンロード
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/230579/5cf6444c-62c9-a7b4-91d2-33a1fecd7845.png)

# cuDNNのインストール
ディープラーニング用のCUDAライブラリ、処理にGPUを使えるようにする為のもの。
ダウンロードする前に会員登録する必要がある
cuDNN(https://developer.nvidia.com/cudnn) for CUDA 9.2をダウンロード
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/230579/70a0d91e-c8be-3eef-8a57-cffac83d2e06.png)

ダウンロードしたらzipを解凍し中身の "bin", "include", "lib" ファイルをコピーして
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2 配下に貼り付ける。

# PyCUDAのダウンロード
CUDAをpythonで使うためのもの
※色々なバージョンがあるので注意
私は''pycuda-2017.1.1+cuda9288-cp36-cp36m-win_amd64.whl''を使いました。
[PyCuda](http://www.lfd.uci.edu/~gohlke/pythonlibs/#pycuda)からダウンロード
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/230579/c6d94657-1d1e-cb51-4aa9-3184e0c97496.png)
ダウンロードしたファイルをユーザーフォルダ(C:\Users\ユーザー名)の下に持ってくる。

# Anaconda Promptを起動する
以下の順でpycudaとcupyとchainerをインストールする。
`pip install pycuda-2017.1.1+cuda9288-cp36-cp36m-win_amd64.whl`
`pip uninstall cupy`
`pip install --no-cache-dir -vvvv cupy`
`pip uninstall chainer`
`pip install --no-cache-dir -vvvv chainer`

# SpyderのIPythonコンソールを立ち上げる
以下の順でimportする。
`import chainer`
`import cupy`
`import cupy.cudnn`
importでエラーが起きなければライブラリは正常にインストールされている。
もしエラーが起きたら```chainer.print_runtime_info()```というコマンドでChainerやCupy, CUDA, cuDNNのバージョンを確認できる。
画像回転スクリプト & 並列処理

深層学習特に画像分類・物体検知タスクで精度を上げるために画像回転・左右反転を行って、教師画像を増やす、ということがよーく行われます。

ただ、それらのタスクって、意外に重たい処理だったりするので、
並列処理を実行することで、手軽に（＝大袈裟過ぎない範囲で）速く終わらせることを目的に書いたスクリプトです。

今回は、並行処理に`joblib`を利用。

## ライブラリ設定

```python
import cv2
from scipy import ndimage
import os
from joblib import Parallel, delayed
```

## もろもろ設定

とりあえず、デフォルトで、30度ずつ回転させる前提でのスクリプトです。
画像数の増減に関しては、適宜設定値を変えるなり、引数でそれらを与える感じに書き直すのもいいかも知れません。

```python
## 角度の定義
rIntr = 30
## 回転開始角度
rs = 30
##回転終了角度
re = 330

## input images
Image_DIR = '<Replace your path for input images>'
## output images
output_DIR = '<Replace your path for output images>'
```

## 関数

```python
def getFilesInDirectory(directory, postfix = ""):
    fileNames = [s for s in os.listdir(directory) if not os.path.isdir(os.path.join(directory, s))]
    if not postfix:
        return fileNames
    else:
        return [s for s in fileNames if s.lower().endswith(postfix)]

## mirror inversion
def generate_flip(I):
    fimg = I.copy()
    return cv2.flip(fimg ,0)   

## Generate(rotate) images & store for each image
def generate_rot(imgFilename, rs, re, rIntr, output_DIR, image_type):
    I = cv2.imread(imgFilename)
    ## mirror-inversion, if needed
    if image_type == 'Reverse':       
        I = generate_flip(I)
    for r in range(rs, re+1, rIntr):
        ## Rotation of each image
        Irot = ndimage.rotate(I, r, reshape=False)
        ## Store images
        FILENAME = imgFilename+'_'+str(image_type)+'_'+str(r)+'.jpg'
        print('Completed for '+str(FILENAME))
        cv2.imwrite(os.path.join(output_DIR,FILENAME), Irot)     
```

## 実行

```py
if __name__ == "__main__":
    ## Input imageのファイル名取得
    os.chdir(Image_DIR)
    imgFilenames = getFilesInDirectory(Image_DIR, ".jpg")

    ## Normal rotation
    Parallel(n_jobs=-1, verbose=3,
        backend="threading"
        )([delayed(generate_rot)(imgFilename=imgFilename, 
                                        rs=rs, 
                                        re=re, 
                                        rIntr=rIntr, 
                                        output_DIR=output_DIR, 
                                        image_type='Normal') 
                                        for imgFilename in imgFilenames])

    ## Reverse rotation
    Parallel(n_jobs=-1, verbose=3,
        backend="threading"    
        )([delayed(generate_rot)(imgFilename=imgFilename, 
                                        rs=rs, 
                                        re=re, 
                                        rIntr=rIntr, 
                                        output_DIR=output_DIR, 
                                        image_type='Reverse') 
                                        for imgFilename in imgFilenames])
```
MMDでUnityちゃんを着せ替え

 世界観にこったゲームを作っていると、度々この雰囲気じゃないんだよなぁと思うことありませんか？

 今回は、MMDを使ってUnityちゃんの服を着せ替える方法を習得していきます。自分の世界観にこだわってみましょう！！



#1. MMD4Mecanimをダウンロードする

 これはNora( @Stereoarts)さんが公開しているもので、MMDのアイテムをUnity上で動かすツールです。データはNoraさんのWebサイト、 Stereoarts Homepage(http://stereoarts.jp)からダウンロードしてください。

このホームページにある、チュートリアルがとてもわかりやすいです！

#2. MMD4Mecanimをインポートする
 データの中に、unityのアイコン
になっている、unitypackageでできたMMD4Mecanimをダブルクリック。インポートされます。

#3.モデルや衣装のダウンロード
　MMDに対応しているサイトがいくつかあるので、その中から欲しい衣装をダウンロードしましょう。

今回私が使ったサイトは「BowlRoll」というサイトで、Twitter、Github、Facebookのアカウントがあれば利用できます！

 <img width="694" alt="スクリーンショット 2018-06-08 15.44.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/251197/3c917477-1518-242b-801f-1e6ebbca526e.png">

#4. ダウンロードしたモデル、衣装をUnityにインポートする

　　早速、見つけた衣装をインポートしましょう。ダウンロードしたデータをプロジェクトビューにドラック&ドロップします。

インポート後、その衣装のインスペクタービューに下のような規約に同意する画面が出てきます。

<img width="316" alt="スクリーンショット 2018-06-08 15.54.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/251197/9c343684-b052-4099-c1ba-554ad8ec947e.png">


これに同意すし終わったら、完了です！
join hive table and phoenix table on Spark without hive-phoenix-handler


## load and register a phoenix table as tempolary table 
```
val df = spark.read.format("jdbc")
 .option("driver", "org.apache.phoenix.jdbc.PhoenixDriver")
 .option("url", "jdbc:[host]:2181")
 .option("dbtable", "[schema.table]")
 .load()
 
 df.createOrReplaceTempView("phoenix_tmp_table")
```
## join in spark.sql env.
```
select
 *
from 
(
select
 *
from phoenix_tmp_table
) t1
join
(
select
 *
from hive_table
) t2
on
 t1.key = t2.key
```

- do not need hive-phoenix handler
- timeout exception does not happened on my env. and situations.
【C#】でハングマンゲーム

```c#

/*
 *  C# でハングマンゲーム
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Hangman
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.文字を出力(ゲーム説明)
            Console.WriteLine("単語当てゲームです。ひらがなを一文字ずつ入力してください。");

            //2.文字列要素を格納する配列を宣言
            //例: string[] stringArray = new string[6];
            string[] listwords = new string[10];
            listwords[0] = "かぶしきがいしゃhogehoge";
            listwords[1] = "よどばしかめら";
            listwords[2] = "ちゃーはん";
            listwords[3] = "らーめん";
            listwords[4] = "やきにく";
            listwords[5] = "ちきんらいす";
            listwords[6] = "なっとう";
            listwords[7] = "えばらやきにくのたれ";
            listwords[8] = "すいか";
            listwords[9] = "たまねぎ";

            //3.乱数を獲得するテンプレ(以下2行)
            //インスタンスを生成
            Random randGen = new Random();
            // 0~9の乱数を獲得
            var idx = randGen.Next(0, 9);

            //4.listwords[]配列をランダムに取得-->mysteryWord変数に定義
            string mysteryWord = listwords[idx];

            // char -> 
            //mysteryWord.Length --> 問題の解答の文字数
            char[] guess = new char[mysteryWord.Length];
            Console.Write("推理を入力してみてね: ");
            //文字数ループする
            for (int p = 0; p < mysteryWord.Length; p++)
                //guessの文字数分、guess変数の中に？を格納
               guess[p] = '？';
            
            while (true)
            {
                // char --> 文字列
                // char.Parse --> 指定した文字列の値をそれを等価なUnicode文字に変換
                // Console.ReadLine() --> ユーザーの入力した値を読み込む
                char playerGuess = char.Parse(Console.ReadLine());
                //文字数分、ループする
                for (int j = 0; j < mysteryWord.Length; j++)
                {
                    //入力した文字と正解の文字が一致した場合、
                    if (playerGuess == mysteryWord[j])
                        //入力した文字をguess[文字数目]に代入
                        guess[j] = playerGuess;
                }
                //出力
                Console.WriteLine(guess);
            }
        }
    }
}

// c#のfor文やif文は1行のみの実行であれば{}はいらない？

```
【C#】で数当てゲームを作る

```c#

/*
 * C#で数あてゲーム
 */
using System;
using System.Collections.Generic;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            //randnoにNewnumメソッド
            int randno = Newnum(1, 101);
            //トライ回数初期値1設定
            int count = 1;
            while (true)
            {
                //1.文字列を出力(ゲーム説明)
                Console.Write("数あてゲームです。1から100の間で数字を予想し、入力してください。(0を押すと終了します):");
                //2.変数定義
                //入力する数字を読み込む
                //Convert.ToInt32(数値) --> 指定した数値の文字列形式を等価の32ビット符号付き整数に変換
                //Console.ReadLine() --> ユーザーの入力した値を読み込む
                int input = Convert.ToInt32(Console.ReadLine());
                //3.もし0が入力されたら
                if (input == 0)
                    //4. 0を返す(ゲーム終了する)
                   return;
                //4.それ以外なら
                //5.答えの数値が入力された数値より大きかった場合、
                else if (input < randno)
                {
                    Console.WriteLine("もっと大きな数字ですよ");
                    //「正解まで●●回でした」の回数を記憶
                    ++count;
                    //ループを継続
                    continue;
                }
                //6.答えの数値が入力された数値より小さかった場合、
                else if (input > randno)
                {
                    Console.WriteLine("もっと小さな数字ですよ");
                     ++count;
                    continue;
                }
                //それ以外の場合(入力された数字と一致した場合)
                else
                {
                    // {0} -> randnoを出力
                    Console.WriteLine("ドンピシャ！正解は{0}でした。", randno);
                    Console.WriteLine("正解まで、" + count + "回でした。");
                    break;
                }
            }
        }
    }
    //数字をランダムで引くメソッド
    // Newnumメソッドを定義(最小値,最大値)
    static int Newnum(int min, int max)
    {
        //数をランダムで引く関数を定義
        Random random = new Random();
        //random.Next -->
        //最小値〜最大値の間でランダムの数字を引くものを返す
        return random.Next(min, max);

        //乱数を生成するときのテンプレ
        //Random rnd = new Random();
        //int randomNumber = rnd.Next(100); 
    }
}
   
```
SDR dongle - Sigfox Network Emulator (SNE)の使い方

[Sigfox](https://www.sigfox.com)は、通信モジュールとデバイスのローカルテスト用にSDR dongle（旧名SNEK:Sigfox Netwrok Emulator Kit）をリリースしています。購入にあたっては、[DigiKey](https://www.digikey.com/product-detail/en/sigfox/SDR-USB100M/1895-1000-ND/7930762)をお奨めします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/8c98a30f-f08c-2bed-016b-1d0a359da901.png)
このSDR dongleを使用することにより、

- SNE: Sigfox通信確認（デバイス開発、サービス開発向け）
- RSA: 無線信号試験（[Sigfox Verified Certification (P1認証)](https://build.sigfox.com/steps/certification#sigfox-verified)対象製品向け）

が可能になります。
ここでは、Sigfox通信確認を行うためのSigfox Network Emulator (SNE)機能の使用方法を説明します。
この機能は、SDR dongleをPCに指し、専用ソフトを起動すれば、疑似的なSigfoxゲートウェイを構築することができます。

#SNEのインストール
SNEのインストールに当たっては、[こちら(sigfox support)](https://support.sigfox.com/products/#sdr)から、使用するOSにあったインストーラをダウンロードし、インストールしてください。

#SNEソフトウェアの使い方
SDR dongleをPC USBポートに接続し、Sigfox Network Emulatorを起動してください。
![sne.png](https://qiita-image-store.s3.amazonaws.com/0/172313/9139c733-200d-c930-7a34-4ac649c033ac.png)

##SNEの設定
###CONFIGURATION - RADIO
無線設定を行います。日本向けデバイスを使用する場合は、Radio Configurationとして**RC3**を選択すると上り下りの周波数及び上りビットレートが自動的に設定されます。
海外向けデバイスを使用する場合は、その他Radio Configurationを選んでください。Radio Configurationに関しては、[こちら](https://qiita.com/ghibi/items/ac9a1642b2feca8f9eb7)を参考にしてください。
![radio.png](https://qiita-image-store.s3.amazonaws.com/0/172313/c639f21d-0476-77fc-056b-92ab2b0ca864.png)

###CONFIGURATION - DEVICES
SNEと接続するデバイスを選択します。IdentifierにはデバイスIDを16進表記で入力してください。Nameはご自由に入力してください。
![devices.png](https://qiita-image-store.s3.amazonaws.com/0/172313/23c4b33b-be5a-96a6-5e53-09e4f82b1fa7.png)

###CONFIGURATION - CALLBACKS
SNEで受信したSigfoxメッセージを外部アプリケーションサーバーに転送する場合は、設定してください。（必須ではありません）
Callbackを使用される場合は、対象PCがインターネットに接続されている必要があります。また、設定方法はSigfoxクラウドと類似していますので、[こちら](https://qiita.com/ghibi/items/53259381a30363538a6d)を参考にしてください。
![Screenshot from 2018-06-08 14-49-46.png](https://qiita-image-store.s3.amazonaws.com/0/172313/b68246c6-4b4d-d113-1caf-ce3b32e93e52.png)

##デバイスのPrivate設定
SNEを使用する場合、デバイスから出力されるメッセージをは、パブリックなSigfoxゲートウェイに接続されないプライベートモードに設定しておく必要があります。
KCCSが評価用に提供するデバイス（Keyapp）の場合は、

```
AT$PID=1  <-Privateモード設定(Public:0)
AT&W      <-設定値保存
```
で変更可能です。この設定は、通信モジュールにより異なりますので、モジュールメーカーにお問い合わせください。

##Sigfox通信確認
デバイスのPrivateモード設定が完了すれば、AT$SFコマンドでメッセージ送信してください。
下図のようにMESSAGESタブで確認することができます。
![Screenshot from 2018-06-08 15-05-00.png](https://qiita-image-store.s3.amazonaws.com/0/172313/e9ff5527-cac2-6a87-bc2c-1e2ae53df83c.png)

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
Ansibleモジュール

# get_url
概要
HTTP、HTTPS、またはFTPからリモートサーバーにファイルをダウンロードします。リモートサーバーはリモートリソースに直接アクセスできる必要があります。
デフォルトでは、環境変数"<protocol> _proxy"がターゲットホストに設定されている場合、そのプロキシを介して要求が送信されます。この動作は、このタスクの変数を設定するか（環境の設定を参照）、またはuse_proxyオプションを使用してオーバーライドできます。
HTTPリダイレクトはHTTPからHTTPSにリダイレクトできるため、両方のプロトコルのプロキシ環境が正しいことを確認する必要があります。

ansible2.4から``--check``で実行すると、URLを検証するHEAD要求を行いますが、ファイル全体をダウンロードしたり、ハッシュに対して検証したりすることはありません。
Windowsターゲットの場合は、代わりにwin_get_urlモジュールを使用してください。

# uri
## 概要
HTTPおよびHTTPS Webサービスと相互作用し、ダイジェスト、基本およびWSSE HTTP認証メカニズムをサポートします。

## オプション
|パラメータ|必須か|デフォルト値|選択肢|コメント|
|---|---|---|---|---|
|HEADER_ |no|||"HEADER_"で始まるパラメーターは、要求をヘッダーとして送信したものです。たとえば、HEADER_Content-Type = ``application/json``というヘッダーは、``application/json``の値を持つリクエストとともにContent-Typeヘッダーを送信します。このオプションは2.1以降で廃止され、将来のリリースでは削除される可能性があります。代わりに``headers``を使用してください。|
|body|no|||Webサービスに対するhttpリクエスト/レスオンスの本体。 body_formatが 'json'に設定されている場合は、既にフォーマットされたJSON文字列を使用するか、データ構造体をJSONに変換します。|
|body_format(added in 2.0)|no|row|-row<br>-json|本文のシリアライズフォーマット。 jsonに設定されている場合は、必要に応じてbody引数をエンコードし、自動的にContent-Typeヘッダを設定します。 2.3以降では、headersオプションを使用してjsonに設定すると、 `Content-Type`ヘッダをオーバーライドすることができます。|
|creates|no|||そのファイル名が存在する場合このステップは実行されない|
|dest|no|||ファイルをダウンロードする場所のパス（必要な場合）. destがディレクトリの場合、リモートサーバー上のファイルの名前が使用されます。|
|follow_redirects|no|safe|- all<br>- safe<br>- none|URIモジュールがリダイレクトに従うかどうか。``all``はすべてのリダイレクトに従います。 ``safe``は "安全な"リダイレクトのみに従います。ここで、 "安全な"とは、クライアントがリダイレクト先のURIに対してGETまたはHEADを実行していることを意味します。``none``はリダイレクトに従いません。下位互換性のために``yes``と``no``の選択肢が使えることに注意してください。``yes``は``all``と等しく、``no``は``safe``と等価です。 ``yes``と``no``は廃止され、将来のバージョンのAnsibleでは削除されます。|
|force_basic_auth|no|no|- yes<br> -no|uriモジュールは、Webサービスが最初のリクエストにステータス401で応答した場合にのみ、認証情報を送信します。一部のBASIC認証サービスは401を正しく送信しないため、ログインに失敗します。このオプションは、最初の要求時に基本認証ヘッダーの送信を強制します。|
|headers(2.0より)|no|||リクエストにYAML連想配列の形式でカスタムHTTPヘッダーを追加します。 2.3の時点でContent-Typeを提供すると、body_formatのjsonを提供することによって生成されたヘッダーがオーバーライドされます。|
|method|no|GET|-GET<br>-POST<br>-PUT<br>-HEAD<br>-DELETE<br>-OPTIONS<br>-PATCH<br>-TRACE<br>-CONNECT<br>-REFRESH|リクエストまたはレスポンスのHTTPメソッド。大文字である必要がある|
|others|no|||fileモジュールによって許可される全引数もここで動作する|
|password|no|||Digest、Basic、またはWSSE認証に使用するモジュールのパスワード。|
|removes|no|GET||ファイル名が存在しない場合、このステップは実行されません。|
|return_content|no|no|-yes<br>-no|レスポンスのbodyを``content``キーの辞書として返すかどうか。Content-type が ``application/json``の場合、JSONデータが辞書結果のjsonというキーに追加的にロードされます。|
|status_code|no|200||リクエストの成功を示す有効な数値のHTTPステータスコード。コンマ区切りのステータスコードのリストでもOK|
|timeout|no|30||タイムアウトの秒数|
|url|yes|||(http or https):host.domein[:port]/ath 形式のHTTPまたはHTTPSのURL|
|user|no|||Digest、Basic、WSSE認証で使うユーザー名|
|validate_certs|no|yes|-yes<br>-no|noの場合、SSL証明書は検証されません。これは、自己署名証明書を使用して個人的に管理されているサイトでのみnoに設定する必要があります。 1.9.2より前は、デフォルトでnoに設定されていました。|
UnityCloudBuild上で無理やり圧縮オプションをLZ4に変更する事が出来るか！？

# ネタバレ
出来ない！！！Unityつらい！！！

# 試したこと
Unity 2017.X + Android で異常にファイルロードが遅い場合の解決法
https://qiita.com/warapuri/items/9b705f09627ea15b3b6b

にあるように、Unity2017.x系でAndroidビルドはLZ4圧縮してビルドしないとファイルロードがめちゃくちゃ重い場合があります。

しかし、このビルド時の圧縮オプションは2018年6月現在ではUnityEditor上からしか操作できないので、UnityCloudBuildを使っているとAndroid版だけファイルロードがめちゃくちゃ遅いapkになってしまいます。issueも上がっていますが、何とかしたいですね。
参考: https://forum.unity.com/threads/support-buildoptions-compresswithlz4.487368/


これはとても困るので、PreProccessBuild内でリフレクションを使って非公開APIを叩くことで実現します。こんな感じです。

```cs

public class Preprocess  : IPreprocessBuild {

	// ビルド前処理
	public void OnPreprocessBuild (UnityEditor.BuildTarget buildTarget, string path)
	{
		if (buildTarget == BuildTarget.Android)
		{
			Debug.Log("[PREPROCESS] find Android Build");
			Console.WriteLine("[PREPROCESS] find Android Build");
			//https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/BuildPlayerWindow.cs#L770
			MethodInfo setCompressionTypeMethodInfo =
				typeof(EditorUserBuildSettings).GetMethod("SetCompressionType",
					BindingFlags.NonPublic | BindingFlags.Static);

			try
			{
				/* Invokeで実行するとき、staticクラスだったら第一引数はnull
				* 第二引数は普通にpublicなenum でplatform
				* 第三引数が内部定義されたenumなので、該当のint数値を直接突っ込んでいます
				*/
                
				/* 第三引数はこんな感じで定義されています
				namespace UnityEditor
				{
				  internal enum Compression
				  {
				    None = 0,
				    Lz4 = 2,
				    Lz4HC = 3,
				  }
				}
				 */                
				var invoke = setCompressionTypeMethodInfo.Invoke(null, new object[] {BuildTargetGroup.Android, 2});
			}
			catch (Exception e)
			{
				Debug.Log(e);
				Console.WriteLine(e);
				throw;
			}

			MethodInfo getCompressionTypeMethodInfo =
				typeof(EditorUserBuildSettings).GetMethod("GetCompressionType",
					BindingFlags.NonPublic | BindingFlags.Static);


			var obj = getCompressionTypeMethodInfo.Invoke(null, new object[] {BuildTargetGroup.Android});
			Debug.Log("[REPROCESS] current compression type:" + obj);
			Console.WriteLine("[PREPROCESS] current compression type:" + obj);
		}
	}
	
	// 実行順
	public int callbackOrder { get { 	return 0; } }
}
```

これでUnityCloudBuildのログを見てみると無事Lz4形式になっていることが確認できます！！！勝った！！！！


と思ったら、このEditorUserBuildSettings.SetCompressionType()でセット出来る値は**ビルドが始まる前にUnityEditorが読み出しているので、ビルドプロセス前に変更しないとダメ**です。

**PreProcessBuildより前に読みだされています。**

# 追試方法
普通のPC上でUnityEditorのCompressionTypeをDefaultにセットしてから、このリフレクションを使った処理を呼ぶ→UnityEditor上の表示ではCompressionTypeがLZ4に**書き換わっています。**
しかし**ビルドしたapkは元の通りロードが遅いままです。**

# 結論
つ、つらい…
Firebase Authenticationでreauthするときの対処法

#背景
Firebaseのメールの再設定の機能とかパスワード再設定の機能を作っていたらreauthrizationのところでAuthCredentialの作り方が公式になくて困っていました。
しばらく予測でそれっぽいクラスとか関数を探して回っていたらあったので一安心。

#環境
Xcode: Version 9.4
Swift: Version 4系
Firebase Authentication: EmailとPasswordでやるやつです。

#対処法

```.swift
if let user = Auth.auth().currentUser {
    let email = user.email
    let password = **** //ここでパスワードを取得
    let credential = EmailAuthProvider.credential(withEmail: email!, password: "")
    user.reauthenticate(with: credential, completion: { (error) in
        if let error = error { //失敗
            self.showAlert(error.localizedDescription)
        } else {
            //success
        }
    })
}
```