OmniAICreator/Qiita-1.07M huggingface dataset:
PHPで文字列リテラルに式展開

Rubyでは文字列リテラルに任意の式を書いて展開できますが、PHPには単なる変数展開の機能しか存在しないので、同じことを実現するためには利用できないような気がしますが、別にそんなことはなかったぜ。

## Rubyでは

`#{}`で囲むことで**任意の式**[^1]が書けます。

```rb:Rubyの場合
hello = "hello"
world = "world"
puts "#{hello.capitalize}, #{world.upcase}!"
#=> "Hello, WORLD!"
```

## PHPでは

ふつうのPHPの(関数呼び出しを含まない)変数展開は、こうです。

```php
$hello = "hello";
$world = "world";

echo "{$hello}, {$world}!", PHP_EOL;
#=> "hello, world!"
```

PHPでは、以下のように変数埋め込みができます。

```php
echo "{$hello}, {$world}!", PHP_EOL;
#=> "hello, world!"
```

式展開を期待して以下のように書いても、何も起きません。

```php
echo "{ucfirst($hello)}, {mb_strtoupper($world)}!", PHP_EOL;
#=> {ucfirst(hello)}, {mb_strtoupper(world)}!
```

しかし、不思議なことに次のようにすれば式展開として動作します。

```php
$i = function ($v) { return $v; };
echo "{$i(ucfirst($hello))}, {$i(mb_strtoupper($world))}!", PHP_EOL;
#=> "Hello, WORLD!"
```

`$i`は*identity function*、[恒等関数](https://ja.wikipedia.org/wiki/%E6%81%92%E7%AD%89%E5%86%99%E5%83%8F)(引数と同じものをそのまま返す函数)です。

あるいは、次のようにファイルを分けて書くこともできます。

```variable.php
namespace variable
{
    const embed = __NAMESPACE__ . '\embed';
    /**
     * @param  mixed $i
     * @return mixed
     */
    function embed($i) {
        return $i;
    }
}
```

```php
$_ = \variable\embed;
echo "{$_(ucfirst($hello))}, {$_(mb_strtoupper($world))}!", PHP_EOL;
```

こうすると、ちょっとおもしろ感が出てきますね。

## どうしてこんなことができるのか

実はこの種類の変数展開構文には、インスタンスのメソッド呼び出しやプロパティ、配列や文字列のデリファレンス、[可変関数](http://php.net/manual/ja/functions.variable-functions.php)、[可変クラス](http://php.net/manual/ja/language.namespaces.dynamic.php)を利用した静的メソッド・静的プロパティなど、`$`を使った式は**ほとんど[^2]書けます**。

```php
<?php

$d = '2112-09-03';
$DateTime = DateTime::class;
var_dump("ドラえもんが生まれたのは{$DateTime::createFromFormat('Y-m-d', $d)->format('Y年n月j日')}です");
#=> string(57) "ドラえもんが生まれたのは2112年9月3日です"
```

この仕様の詳細は@do-akiさんの[PHP 文字列リテラルにおける変数展開ノ全テ - do_akiの徒然想記](http://d.hatena.ne.jp/do_aki/20131218/1387335279)で網羅されてるのでお読みください。

可変関数やメソッド呼び出しが可能ってことは何ができるか？ そうです。引数にはあらゆるどんな式でも書けます。

```
echo "{$i((function($s){return $s;})("a"))}";
```

引数に式が書けるってことは[クロージャ](http://php.net/manual/ja/functions.anonymous.php)を悪用して式と文のロンダリングもできます。……つまり、文字列の変数展開の式では事実上**かなりいろんなこと**ができます。

## これは実用になるのか……？

一般的な方法ではないので、ふつうに`printf()`とか`sprintf()`とか使った方がいいんじゃないですかね…？

```php
$hello = "hello";
$world = "world";
printf('%1$s, %2$s!'.PHP_EOL, ucfirst($hello), mb_strtoupper($world));
```

## まとめ

今回紹介した文法は私が「Rubyの持つ108つのエディタ殺し文法」と呼ぶ式展開です。 ~~PHPでも同等のめんどくささがあることは既知だったのですが、~~ 今回紹介したテクニックを駆使してどこまで複雑な式を書いてエディタのシンタックスハイライト機能をぶっ壊せるかは読者への課題とします。

## 脚注

[^1]: 任意の式が書ける… つまり文字列リテラルの中に再帰的に
[^2]: なぜかクラス定数は呼び出せません
macのターミナルでSolidityをコンパイルできるようにした

スマートコントラクトの書籍に習って、Geth(go-ethereum)とEthereum公式ウォレット(Mist Wallet)で学習を進めていました。
ただ、Solidityというプログラムのコンパイルためだけにウォレットアプリを使うことがあったので、ターミナルでコンパイルできるようにしました。

```bash
$ brew update
$ brew upgrade
$ brew tap ethereum/ethereum
$ brew install solidity
$ brew linkapps solidity
```

実行方法です。

```bash
$ solc --bin --abi hogehoge.sol

======= hogehoge.sol:hogehoge =======
Binary:
606060405〜
Contract JSON ABI
[{"constant":〜
```

出力されたBINとABIをコピーして、Geth上で下記のように登録します。

```bash
> bin = "0x606060405〜"
> abi = [{"constant":〜
```
**※binは先頭に「0x」を付与する必要があります。**

最後にhogeという変数にコントラクトを定義します。

```bash
> hoge = eth.contract(abi).new({ from: eth.accounts[0], data: bin, gas: 1000000 })
```

あとはhoge変数でコントラクトを操作できます。
Ubuntu 16.04でAlphaZeroのアルゴリズムを使ったReversiを試してみる

Ubuntu 16.04でAlphaZeroのアルゴリズムを使ったリバーシを試してみたのですが、依存関係でハマったのでメモ代わりに残しておきます。
まずpyenv + Condaの環境はこちらを参考にしました。
pyenv + anaconda + python3: https://qiita.com/sk427/items/9f215931c8249ada75cd
#pyenv + Condaの設定

``` pyenv-conda.sh

# pyenvの導入
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

# Anacondaの導入
pyenv install -l | grep ana #最新のパッケージを検索
pyenv install anaconda3-5.0.1
pyenv rehash
pyenv global anaconda3-5.0.1
echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.0.1/bin/:$PATH"' >> ~/.bashrc
source ~/.bashrc
conda update conda
```

# Reversi-alpha-zeroのインストール

``` reversi-alpha-zero.sh

# 環境構築時wxPythonのビルドに必要な依存関係の解消
sudo apt-get install libgtk2.0-dev mesa-common-dev libglu1-mesa-dev python-gst0.10-dev libwebkit-dev
# Reversi-alpha-zeroの取得
git clone https://github.com/mokemokechicken/reversi-alpha-zero
# Conda仮想環境の構築
cd reversi-alpha-zero
cp requirements.txt conda-requirements.txt
conda env create -f environment.yml
source activate reversi-a0
# 追加の依存関係。pipで入れるよりもCondaのを使ったほうが楽に動かせる
conda install tensorflow-gpu==1.3 h5py
```

とりあえず、これで一通りの機能が使えるようになります。
もうひとつハマったのがGUIモードで動かす場合の共有ライブラリの読み込みに失敗する場合はLD_LIBRARY_PATHを指定しておく必要があるようです。（なぜpyenvで面倒みてくれないのか不思議）

# GUIモードでの実行

```play-gui.sh
LD_LIBRARY_PATH=~/.pyenv/versions/anaconda3-5.0.1/envs/reversi-a0/lib/python3.6/site-packages/wx python src/reversi_zero/run.py play_gui
```
EmacsでMarkdownの目次（アウトライン）をプレヴュー

<!---
EmacsでMarkdownの目次（アウトライン）をプレヴュー
--->

# 概要
EmacsでMarkdownを書いている時、アウトラインを確認したいときがあります。
なので、Emacs内で今書いているMarkdownの目次を別ウインドウで見れるようにしてみました。

# 準備
Markdownから目次を生成してくれるスクリプトの[gh-md-toc](https://github.com/ekalinin/github-markdown-toc)を使います。
依存するソフトはないのでPandocとか入れなくてもＯＫ！

``` console
git clone https://github.com/ekalinin/github-markdown-toc.git
chmod a+x gh-md-toc
```
もともとMarkdownに目次をinsertするためのソフトなので今回の目的には不要なリンク出力を削除します。

``` diff
- print sprintf("%*s", substr($0, length($0), 1)*3, " ") "* [" substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5)"](" gh_url substr($0, match($0, "href=\"[^\"]+?\" ")+6, RLENGTH-8) ")"}' | sed 'y/+/ /; s/%/\\x/g')"

+ print sprintf("%*s", substr($0, length($0), 1)*3, " ") "* [" substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5)"]" }' | sed 'y/+/ /; s/%/\\x/g')"
```
どこかパスの通ったところにおいて下さい。

# Emacsの設定

initファイルに以下を記載します。

``` emacs-lisp:markdown.el
(defun markdown-toc ()
 (interactive )
 (let ((fName (buffer-file-name)))
   (get-buffer-create "*markdown-toc*")
   (set-buffer "*markdown-toc*")
   (erase-buffer)
   (display-buffer (current-buffer))
   (call-process-shell-command (concat "PATH/gh-md-toc " ; <- パスを指定する
									fName) nil t)))
(define-key markdown-mode-map (kbd "\C-c\C-t") 'markdown-toc) ; Keyはお好みで。
```
Markdownを編集している時にC-cC-tで目次が表示されます。
![Screenshot from 2018-02-10 20-32-52.png](https://qiita-image-store.s3.amazonaws.com/0/17054/d64d25cc-156a-7719-3a58-0076de63e236.png)

# おまけ(pop-win.el)

目次は右側に出て欲しいので、[popwin.el](https://github.com/m2ym/popwin-el.git)を使って指定してます。

``` emacs-lisp
(require 'popwin)
(popwin-mode 1)
(push '("*markdown-toc*" :width 0.2 :position right)
		  popwin:special-display-config)
```
Bash on Ubuntu on Windowsに外部から接続がうまくいかなかった原因がわかったかも知れない

Bash on Ubuntu on Windowsを起動した端末からttyを使った話は多くある。
が、起動した端末にsshなりでつないで外から開発したいケースがある場合の記事がなかったので、みんなが当たり前に出来るから書いてないのか、需要がないのか分からないが見つからなかった。
そういうマニアックなユーザー向けに活用できれば幸いだ。

※仲間内に向けての備忘録なので説明がざっくりしてますが、適宜補足するかも
※ただし、SSHの立て方やポートフォワーディングについては省略する

# 結論
予想：Windows10 HomeがSSHに対応していないのでは？
→そんなことはないハズ
http://ascii.jp/elem/000/001/555/1555599/

Bash on Ubuntu on Windowsをインストールしてsshを立てたらUbuntuに向けてポートフォワーディングをしてあげると接続できる、はず。
設定の状況によっては何もやらなくてもWindowsでSSHを立てるだけで良いかもしれない。
当然、Ubuntu内でもSSHを立てておくこと。

それができれば、お好みのttyと端末を使って開発したい人は上記で対応できるはず。
手持ちのWindows10 Proでは出来たので、この辺に原因がありそうだ。

# 代替案
難しいことをしなくても、Windows10の端末からUbuntuには接続できるのだから、Windows10にリモート接続できればよい。
Windows間ならリモートデスクトップツールがあるし、そうでなければGoogle Remote Desktopなりを使えば良い。要はUbuntuを起動しているWindows10の端末に入れればよい。
そこからUbuntuにつなげれば解決できる。

（検証でき次第追記）
【しずおかアプリ部】活動ログ　第47回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)

##■公式サイト##
[http://monolizm.com/shizuoka-app](http://monolizm.com/shizuoka-app)
「Slack」も利用しています。 shizuapp で検索し、ご参加ください。

##◾️参加申し込み##
しずおかアプリ部への参加申し込みは[こちら](https://shizuoka-app.connpass.com/)から

##■タイトル##
第４７回


##■開催日##
２０１８年２月１０日（土）　１６：００～１８：００


##■参加者##
１８名


##■活動内容（概要）##
・保坂プレゼン「部員さんとの共創企画ゲームのご紹介」
・菅原プレゼン「Unity始めるよ　～よく人に質問されるTIPSと冬休みに勉強した技術紹介～」
・最近の話題の技術ニュース、告知
・雑談

２０１８年、最初の開催でした。
３ヶ月ぶりということもあり、過去最多の参加人数となりました。
ぎゅうぎゅうパンパンの中での勉強会となってしまい申し訳ありませんでした。
バレンタインデーに近いということもあり、女性部員の方が手作りクッキーを作ってきてくれました。
ありがとう！みんなで美味しくいただきました！
次回開催はホワイトデー過ぎですが、皆さん、わ・か・る・な。

![IMG_8796.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/7c1ee232-2d9b-2e4a-375a-f016c7d11fb1.jpeg)


##■活動内容（詳細）##

【実演・プレゼン】
**・保坂プレゼン「部員さんとの共創企画ゲームのご紹介」**
　　部員さんと共創でアプリの企画を考え中。
　　企画書もだいぶ進んで、内容、画面のイメージともだいぶ固まってきています。

　　また中学生の部員さんは、今年のUnityインターハイとU21プログラミングコンテストでの受賞を目指して、
　　ゲームの企画を考え始めました。
　<hr>


**・菅原プレゼン「Unity始めるよ　～よく人に質問されるTIPSと冬休みに勉強した技術紹介～」**

　よく質問されることとして、
　　・ポストプロセッシングスタックの使い方
　　・クリックした位置にUIを移動させたい
　　・FPS指定方法
　　・画面分割
　　・プレハブについて
　　を紹介＆体験を行いました。
　　ネスト化されたプレハブの場合、中のプレハブは大元の影響を受けなくなってしまう仕様になっているので注意が必要。

　後半は、今後制作予定のゲーム開発の研究に利用してるプロジェクトを紹介しました。
　スペックの低いスマホでも動くような工夫を散りばめています。
　１日の時間の移り変わりから、天気の表現、シェーダー、テクスチャ、雲の表現など。
　
![chichimo.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/4e85f52c-61cc-9c3e-9cc2-18afb0b0ed46.jpeg)

　 [資料](http://monolizm.com/sab/pdf/第47回_プレゼン資料(～よく人に質問されるTIPSと冬休みに勉強した技術紹介～).pdf)　[プロジェクト一式](http://monolizm.com/sab/src/ShizuokaAppliClub47.zip)

<hr>


**・最近の話題の技術ニュース、告知**
　いつものように、Slackに投稿された記事を取り上げていきつつ、
　部活が終了してからの放課後もたくさんの話題で盛り上がりました。
　Unityを使ってる方、VRをやっている方が身の周りに増えてきたなぁと感じます。

　部員さんが珍しい本を貸してくれました。
![IMG_8797.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/5c455576-56a8-00eb-c37c-2f5079659ad8.jpeg)
　「テレビゲーム　電子遊戯大全」
　かなり古い本ですが、本の構成も面白く、
　当時テレビゲームに関するあらゆる情報が載っています。
　30〜40代の人にはお酒が進む内容となっております。
Plotlyで折れ線グラフや複合グラフ

### Plotlyで折れ線グラフや複合グラフ
```
この記事では plotly 2.3.0を利用しています。
```
### はじめに
***

Plotlyは大変便利です。
実際に業務で利用する上で設定している項目などまとめてみました。ここでは折れ線や複合グラフ。
時系列のチャートを想定しています。なお、チャートは静止画です。

### 折れ線グラフ
***

```py

# coding:utf-8

import pandas as pd
import numpy as np

import plotly.plotly as py
import plotly.graph_objs as go
import datetime

import plotly.offline as offline
offline.init_notebook_mode()


# 日付の作成。100日

d1 = datetime.date(2017,1,1)

d1_list = []

for i in range(0,100): 
    
    temp = d1 + datetime.timedelta(i)
    
    d1_list.append(temp)

# データの作成
X = np.random.randint(0,50,100) 
Y = np.random.randint(0,100,100) 

trace0 = go.Scatter(x = d1_list, y = X, mode = 'lines', name = 'X')
trace1 = go.Scatter(x = d1_list, y = Y, mode = 'lines', name = 'Y')

# レイアウトの指定
layout = go.Layout(xaxis = dict(title = 'date', type='date', dtick = 'M1'),  # dtick: 'M1'で１ヶ月ごとにラベル表示 
              yaxis = dict(title = 'value'))

fig = dict(data = [trace0, trace1], layout = layout)

offline.iplot(fig)

```

![oresen_1.png](https://qiita-image-store.s3.amazonaws.com/0/50110/5aae7466-3f39-d8c4-57c7-51e076ce80aa.png)


### 2軸の複合グラフ（折れ線と棒グラフ）
***

```py

trace0 = go.Bar(x = d1_list, y = X, name = 'X',  yaxis='y1')
trace1 = go.Scatter(x = d1_list,  y = Y, mode = 'lines', name = 'Y', yaxis='y2')

# レイアウトの指定
layout = go.Layout(xaxis = dict(title = 'date', type='date', dtick = 'M1'),  # dtick: 1か月ごとは'M1' 
              yaxis = dict(title = 'value(x)', side = 'left', showgrid=False, # ２軸だと見誤る場合があるので目盛り線は表示させない(showgrid=False)
                           range = [0, max(X)]),                             # rangeで指定したほうがよい。ゼロが合わない場合などがある。
              yaxis2 = dict(title = 'value(y)', side = 'right', overlaying = 'y', range = [0, max(Y)], showgrid=False))


fig = dict(data = [trace0, trace1], layout = layout)
offline.iplot(fig)

```


![oresen_2.png](https://qiita-image-store.s3.amazonaws.com/0/50110/6d1253e6-8e94-b963-d87d-2259bba8239b.png)
[iOS] NSAttributedStringKeyを利用して取り消し線を引く

#概要
UITextLabel上に表示する文字列に、取り消し線（Strike through)を引きたい場合、下記のようにNSAttributedStringKeyを利用することで簡単に実装することができます。

```swift
let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: "Hello, World!!")
attributeString.addAttribute(NSAttributedStringKey.strikethroughStyle, value: 2, range: NSMakeRange(0, attributeString.length))

self.textLabel.attributedText = attributeString
```
cent7に設置したWordPressの更新が失敗したときの対処

cent7ににインストールしたwordpressが
管理画面から更新したら失敗したので対処した話。

失敗時は、以下のメッセージが表示された。

> いくつかのファイルをコピーできないため、最新版のインストールができません。これはたいていの場合、ファイルのパーミッションが適切でないことが原因です。: wp-admin/includes/update-core.php

-----

# 対処① パーミッションの変更

言われた通りにパーミッションの変更

```sh
chmod -R 707 wp-admin
```

→ **wordpressの更新をするが失敗、メッセージに変化なし**

# 対処② SELinuxの設定変更

```sh
# SELinuxの設定確認 (Enforcingと表示)
getenforce

# SELinuxの設定変更
setenforce 0

# SELinuxの設定確認 (Permissiveと表示)
getenforce
```

→ **wordpressの更新に成功**


再起動するたびにSELinuxの設定が戻ってしまうらしいので、設定ファイルを変更しました

```:/etc/selinux/config
SELINUX=Permissive
```

----

# 参考にさせて頂いたページ

- [SELinuxの無効化](https://qiita.com/hanaita0102/items/5d3675e4dc1530b255ba)
[Python] urllib2使用時のproxy設定

#概要
urllib2使用時のプロキシ設定方法の一例です。

##用例
```python
def setProxy():
    proxy = urllib2.ProxyHandler({'http': 'http://{PROXY_HOST}:{PORT}'})
    opener = urllib2.build_opener(proxy)
    urllib2.install_opener(opener)
```
Nimの標準出力に色を付ける


```nim
import terminal

var s:string = "Hello,World!"
setForegroundColor(stdout, fgRed)
echo s    # 文字色赤

setBackgroundColor(stdout, bgGreen)
echo s    # 背景色緑，文字色赤

resetAttributes(stdout)  # リセット
echo s    # デフォルト

# 1行のみなら
styledWriteLine(stdout, fgBlack, bgWhite, s, resetStyle) # 背景色白，文字色黒
# or
styledEcho(fgWhite, bgRed, s, resetStyle) # 背景色赤, 文字色白



# true colorをサポートしているターミナルなら
import colors

enableTrueColors()
setBackgroundColor(stdout, parseColor("#F0324A"))
echo s    # 微妙な色
```

プログラム終了時デフォルトに戻るように`system.addQuitProc(resetAttributes)`を使いましょう。

公式ドキュメント
https://nim-lang.org/docs/terminal.html
https://nim-lang.org/docs/colors.html より
[Python] urllib2.urlopenが遅い時の対処法

#概要
Pythonでurllib2.urlopenを使用する時にデータの取得に時間が掛かることがあり、その対処法として参考になるコードを見つけたので記載しておきます。

# 対処法
```python:
import socket

def getAddrInfoWrapper(host, port, family=0, socktype=0, proto=0, flags=0):
    return origGetAddrInfo(host, port, socket.AF_INET, socktype, proto, flags)

origGetAddrInfo = socket.getaddrinfo
socket.getaddrinfo = getAddrInfoWrapper
```

##参考
*Pythonでurlopenが遅い*
http://d.hatena.ne.jp/yuta1228/20110626/1309075278
JSP学習

2/10

■実施内容
・テキストの内容にしたがい、JSPファイルをEclipse上で作成して実行。

■結果
・htmlにjavaを埋め込んで、変数値を出力することは成功
・src>model>に作成したjavaファイルをjspにimportしたjspファイルを実行すると
　　クラス名 + cannot be resolved to a type
　になる。

■確認したこと
・Servletの時と同様、なにがしかのビルドパスの問題でimportしたいjavaファイルが読み込まれてないのではないかと思い、
　warファイルを作成して宛先へ飛ばしましたが、サーブレットはコンパイルされていますが、クラスファイルはclasses>modelの下に存在してませんでした。Employee.javaは作成したがデプロイの対象から外れてしまっているのかもしれません。
・JREインストール設定をJDKに変えたがうまくいかず
VDIのメリット・デメリット

#この記事の内容
VDIとはなんなのか、メリットデメリットについてメモ程度にまとめる。

##・そもそもVDIとは
Virtual Desktop Infrastructureの略
仮想デスクトップインフラを指す。

>VDIとは、企業などで、デスクトップ環境を仮想化してサーバ上に集約したもの。
利用者はクライアント機からネットワークを通じてサーバ上の仮想マシンに接続し、デスクトップ画面を呼び出して操作する。
http://e-words.jp/w/VDI.html


##・代表的なソフトウェア
　・VMware horizon(VMware社）
　・Citrix XenDesktop（Citrix社）
　・Microsoft VDI(Microsoft社）

##・特徴
①データが端末には残らない
マスターイメージを共有する「リンククローン」「PVS」という機能
複数の仮想デスクトップを用意すると、状況に応じてユーザごとに差分が発生する。
その差分だけをユーザごとにデータ保持をする
→ストレージの容量を削減し、コストメリットが得られる
②マルチデバイス対応
③どこからでも作業が可能

##・メリット
①端末にデータが残らないからセキュリティが高い
②いつでもどこからでも作業が可能
③管理の負荷が軽減される
④BCP対応

##・デメリット
①ネットワークに依存
ネットワークに障害が発生すると使えなくなる
②サポート業務の負荷
③データを保持しているサーバ等のセキュリティ担保が重要
④OSのライセンス費用が高くなる

##・個人的所感
実際に利用したときに処理が早く、利用しやすいと感じた。
ネットワークがないと利用できない、コストがかかる等デメリットがあるが、
セキュリティが高い為今後利用機会も増えるのではないか。

##・参考文献
[5分で絶対に分かるデスクトップ仮想化／VDI入門 (1/5)]
(http://www.atmarkit.co.jp/ait/articles/1408/19/news033.html)
rex0220 フォームレイアウトプラグイン

kintone 標準のフォーム設定画面で、単独の項目なら1個ずつドラッグして位置を変更できますが、テーブルはドラッグできません。
複数テーブルを配置後に縦位置を変えることができるプラグインです。
また行単位にまとめて項目を移動できますので、大幅にレイアウトを変更する場合に便利です。

<img width="757" alt="2018-02-10_19h28_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/814cb984-75b6-8b2e-3542-9153f520ce0f.png">

[rex0220 stores](https://rex0220.stores.jp/)で、販売中です。


# レイアウトの変更

行・グループ・テーブル単位に、行位置をドラッグして変更します。

<img width="741" alt="2018-02-10_17h39_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/54c8061a-97f0-f30a-ef0e-6fea7e1f8357.png">


# 変更手順

- kintone にフォームレイアウトプラグインを追加
- アプリにフォームレイアウトプラグインを追加
- フォームレイアウトプラグイン設定画面を開く
- 対象の行・グループ・テーブルをドラッグしてレイアウトを変更
- 「保存する」をクリック
- 確認ダイアログで、「OK」をクリック
- アプリの設定>「フォーム」タブで変更したレイアウトを確認
- 「アプリを更新」で本番環境に反映します。
 

## kintone にフォームレイアウトプラグインを追加

kintoneシステム管理>プラグイン　で、レイアウトプラグインファイルを読み込みます。

<img width="689" alt="2018-02-10_18h54_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/1c1e2e70-bfbd-364e-0644-49075fe484f5.png">


## アプリにフォームレイアウトプラグインを追加

アプリの設定>プラグイン　で、レイアウトプラグインを追加します。

<img width="687" alt="2018-02-10_18h50_38.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/4d385636-95fb-53f0-f585-cb4bd980cc53.png">


## フォームレイアウト変更

レイアウトプラグイン設定画面で、レイアウトを変更します。

![2018-02-10_19h21_12.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/bdf60370-fddd-089b-8cc2-33db59754281.gif)

## 変更したレイアウトを確認

アプリの設定>「フォーム」タブで変更したレイアウトを確認します。

<img width="757" alt="2018-02-10_19h28_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/814cb984-75b6-8b2e-3542-9153f520ce0f.png">



## 本番環境に反映

「アプリを更新」で本番環境に反映します。

<img width="1128" alt="2018-02-10_19h41_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/26ae8b9c-7b48-3608-38a9-3899dfac7674.png">



# 注意事項

レイアウトを変更後は、アプリからフォームレイアウトプラグインを削除して構いません。
EC2上にvirtualenvでPython3環境構築

EC2を立ち上げてPython3系のvirtualenv有効化までの手順をメモ。

正直クラウドや仮想化の時代に複数バージョンを同居させる意味はあまりないので、
python3系だけでいいなら[Python Japan](https://www.python.jp/install/centos/index.html)のやり方が楽でいいですね。

環境
AmazonLinux2 (インスタンス立ち上げ直後で実施)

## pyenvインストール
```
# 関連ライブラリをヤムる
sudo yum update -y
sudo yum -y install git readline-devel zlib-devel bzip2-devel sqlite-devel openssl-devel
sudo yum -y groupinstall "Development Tools"

# pyenvとvirtualenvを持ってくる
git clone https://github.com/yyuu/pyenv.git /home/ec2-user/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git /home/ec2-user/.pyenv/plugins/pyenv-virtualenv

# 環境変数にpyenvを追加(viで書いてもOK)
echo 'export PYENV_ROOT="/home/ec2-user/.pyenv"' >> /home/ec2-user/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> /home/ec2-user/.bash_profile
echo 'eval "$(pyenv virtualenv-init -)"' >> /home/ec2-user/.bash_profile
echo 'eval "$(pyenv init -)"' >> /home/ec2-user/.bash_profile

# bashリロード
source /home/ec2-user/.bash_profile
exec $SHELL -l
```

## Python3.6.4インストール
```
# インストールできるバージョンの確認
pyenv install -l | less

# 今回はこれを入れる
pyenv install 3.6.4

# virtualenv作成
pyenv virtualenv 3.6.4 v364

# virtualenvが作成されたことを確認
pyenv versions

### 各自、virtualenvを有効化したい場所に移動

# 有効化
pyenv local v364

# プロンプトがこんな感じになったら成功
# (v364) [ec2-user@pyv364]$
# この状態からpipなども使えるようになる
```

## その他メモ
ec2-user以外にもpyenvを使わせたい場合
インストール先を`/home/ec2-user/.pyenv`を`/usr/local/.pyenv`あたりに変更する。
環境変数の設定は`/home/ec2-user/.bash_profile`でなく`/etc/profile`にしておく。

cloneするときにディレクトリを`~/.pyenv`で指定したら、ホームディレクトリに`~`という変なディレクトリができていて若干ハマった。

最近だと`easy_install virtualenv`というコマンドで一発らしいがそれも試してみたいところ。


以上、お疲れ様でした。
jQuery.ajaxのテストはMockjax使えばなんとでもなる

サーバー側の開発遅れで、フロント側のAPI呼び出し部分がなかなか着手出来ないのが常態化・・・

なんて前にいた現場でもあったわけですが･･･


　**jQuery-Mockjax使えばいいんだよ！！**

ということを教わりました。

ajaxのクエリパラメータを指定しておけば、そのパラメータでRequestしたときに相手が居なくてもJSONの中身をシミュレートできるとのこと。


# jQuery-Mockjax 


[GitHub:jQuery Mockjax: Ajax request mocking](https://github.com/jakerella/jquery-mockjax)

プラグインはGithubで公開されてます。なんて便利な世の中･･･

jQueryのプラグインなのでもちjQuery必須。
jQuery依存のフレームワーク、Backbone.jsでも動くとのこと。試してないけど←

jQuery.ajaxつかわないでサラのJSでajax通信処理書いてたら使えない･･････出会ったこと無いけど、そうゆうところどのぐらいあるのだろう･･･



#コード書いてみる

```javascript:mockjaxTest.js
$.mockjax(
    {
        url: 'getParameterTest/reqParam=param111*',
            responseText: {
                jsonParam1: 'hoge hoge',
                jsonParam2: 'fuga fuga'
            }               
    }
);
```

とかこんな感じ。

getParameterTestというリクエストURLに、クエリパラメータreqParamがparam111でリクエストした、という場合。
リクエストパラメータはワイルドカードも使える。

これでこのリクエストの返却はhoge hoge、fuga fugaとなると。
個人サービスを作るときに便利なツール群

個人的に使い勝手が良いと思うものをピックアップ。

# ジェネレーター類

## ロゴ

### Squarespace

https://logo.squarespace.com/

めっちゃシンプル。作成したロゴに一意のURLが作成されるので、それを保存しておけば後日編集できるのもよい。

### DESIGNEVO

https://www.designevo.com/

多少凝ったロゴを作りたいときはこちら。複数シンボルを配置できる。
無料だと透過pngがダウンロードできないので注意。

### ブラウザ画像編集ソフト pixlr

https://pixlr.com/

上記のようなサービスで作ったロゴ画像をちょっとだけ編集したい際に使える。
例えば透過pngを透過じゃなくしたりとか。

## favicon

http://iconifier.net/

画像を一つアップロードしてボタンをクリックするだけで、favicon に加えて各種サイズの apple-touch-icon を生成してくれる。

## カラーパレット

https://www.materialpalette.com/

選択肢を絞ってくれているので、そこから選べばなんとなくいい感じのマテリアルデザインパレットができる。

## Google スプレッドシート × Google Apps Script

初期投入データを作ったりする手間がかなり省ける。

https://qiita.com/shinichinomura/items/380230cc495e5afcd183

# デザインサンプル

## 見出し

https://saruwakakun.com/html-css/reference/h-design

# コンバーター

## erb2slim

http://erb2slim.com/

# 各種マスタ

## 都道府県

https://docs.google.com/spreadsheets/d/1PocZXqTdPqYOC62_eTzgq2GMui6wk5CB1F7J6VcN4jQ/edit#gid=0
setTimeoutしようとしたらハマったのでメモ

# 書いてたもの

```javascript
var test= function () {
    console.log('test')
    setTimeout(this.test(), 1000)
  }
}
```

Javascript初心者がバレる！！！ごめんなさい！！！

# 解決方法

```javascript
var test= function () {
    console.log('test')
    setTimeout(this.test, 1000)
  }
}
```

はい、`()`を消すだけです。
`()`あったら即時関数として1回実行されてsetTimeoutされませんでした。

いい加減Javascriptの基盤的なこと勉強しないと行けないなと思いました。では。
MacのターミナルでSSH公開鍵を作成

#SSH公開鍵の作成

まず、Macのターミナルを起動します。

![Mac_ターミナル.png](https://qiita-image-store.s3.amazonaws.com/0/206277/06e9a691-a988-5ce9-34c2-4e352bd0dee0.png)

最初に鍵を作成するディレクトリまで移動しておきます。

`$ cd ~/.ssh`

だいたい、ここに作るのが一般的かなと思います。

次に、これから作成する鍵の保存先ディレクトリの中身を一応確認しておきます。
名前が被って上書きとかされたら嫌なので。

`$ ls -la`

私の場合、

- id_rsa
- known_hosts

の２ファイルが既に存在していました。
id_rsaはデフォルトの鍵名なので注意が必要です。

それでは、以下のコマンドを実行し、鍵を作成します。
コメントは自由に入力して下さい。

`$ ssh-keygen -t rsa -b 4096 -C "コメント"`

すると、鍵の保存場所と名前をパス形式で要求されます。
前述した通り、デフォルトの鍵名（id_rsa）だと不都合がある場合には、保存先と鍵名を指定して下さい。

`Enter file in which to save the key (/Users/hoge/.ssh/id_rsa): hoge_rsa`

鍵名だけ指定した場合、鍵はカレントディレクトリに作成されます。

鍵が作成されたか確認してみましょう。

`$ ls -la`

次のような２つのファイルが作成されていれば成功です。

- hoge_rsa
- hoge_rsa.pub

お疲れ様でした。
ラズパイにスモウルビー環境を構築する

ラズパイにスモウルビーを動作する環境を構築するまとめ。

ラズパイのことはこちら！
https://www.raspberrypi.org/

スモウルビーのことはこちら！
http://smalruby.jp/

#最初に！
最新のOS(stretch)では動作確認をしてません。というか、rbenvでrubyをビルドしてくじけました、、、
以下のURLから1つ前のOSのインストーラ(jessie)を取得してOS環境を準備してください。
https://downloads.raspberrypi.org/NOOBS/images/NOOBS-2017-07-05/

それと、Raspberry Piは2か3を使用してください。1ではくじけました。

#1.ラズパイを日本向けに設定してください。
すでに設定されている場合は、読み飛ばしてください。

```
sudo raspi-config
```
Localisation Optionsから、I1のChange Localeを選択します
ja_JP.UTF-8 UTF-8でスペースキーを押してマークを付けます
エンターキーを押します
ja_JP.UTF-8を選択します
エンターキーを押します

Localisation Optionsから、I2のChange Timezoneを選択します
Asiaでエンターキーを押します
さらにTokyoでエンターキーを押します

お使いのキーボードが、一般的なWindowsPC用のキーボードであれば、
Localisation Optionsから、I3のChange Keybord Layoutを選択します
Generic 105-key(Intl)PCでエンターキーを押します
Japanese - Japanese(OADG109A)でエンターキーを押します
defaultでエンターキーを押します
No compose Keyでエンターキーを押します
X serverの場所は、yesでもnoでも良いです

テンキーがない場合でも同じで大丈夫かと思います。ただし、英語キーボードや特殊なキーボードの場合は、この通りに設定すると、キーボードに刻印されている文字と入力される文字が異なりますので、キーボードの販売店様かメーカー様にお問い合わせいただき、どの設定が良いか、お聞きください。

#2.ラズパイをインターネットに接続できるように準備してください。

#3.ラズパイで、Terminal(ターミナル)画面を作成してください。

#4.OSに含まれるプログラム類を最新にしてください。

```
sudo apt-get update
sudo apt-get upgrade
```
なお、sudo apt-get dist-upgradeは不要です。

#5.お好みで日本語の入力を設定してください。
一般的にはanthyかmozcという日本語入力メソッドを利用されるようです。既に日本語入力メソッドを設定されている場合は、読み飛ばしてください。

```
sudo apt-get install fcitx-mozc   fonts-ipafont fonts-ipaexfont fonts-takao ttf-kochi-gothic ttf-kochi-mincho fonts-vlgothic fonts-ipafont xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
im-config -n fcitx
```

一度、再起動してください。

#6.Rubyを構築する環境(rbenv)を構築してください。
スモウルビーはRubyで動作します。

```
sudo apt-get install -y libsdl1.2-dev libsdl-image1.2-dev libsdl-mixer1.2-dev timidity libsdl-ttf2.0-dev libsdl-sge-dev fonts-horai-umefont fonts-ipafont libsqlite3-dev libssl-dev libreadline6-dev
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL -l
```

#7.スモウルビーを実行するための環境(ruby)を構築します。
ここは時間がかかります。

```
rbenv install 2.3.3
rbenv global 2.3.3
```

#8.スモウルビーをインストールします。
ここも時間がかかります。

```
gem install rake
gem install bundle
gem install -r smalruby-editor --no-ri --no-rdoc
```

#9.動かしてみよう！
以上の操作で最低限のインストールは完了です。ターミナル画面から、

```
smalruby-editor
```

と入力するとスモウルビーの画面が表示されます。
ログインするとログイン名のフォルダが/home/piの中に作成され、プログラムがそこに保存されます。ログインしない場合は、フォルダ/home/piの中にプログラムが保存されます。

以下、使いやすいように設定をおすすめします。

#A.デスクトップにショートカットを作成してください。
デスクトップにファイル名smalruby.desktopのテキストファイル(空のファイル)を作成して、マウスの右クリックでTextEditorを選択してください。内容は

```
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Icon=/home/pi/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/smalruby-editor-0.4.2/public/tiny.png
Exec=/home/pi/.rbenv/shims/smalruby-editor
Terminal=false
Name=スモウルビー
Comment=スモウルビー
Categories=Application;Education;Development;
MimeType=application/octet-stream
```
としてください。

#B.お好みで一度のクリックで動作するように設定してください。
一度のクリックで、動作するように設定される場合は、画面上部から、FileManagerを呼び出して、
edit(編集) -> Preferences(設定) -> ダイアログ画面上の Open files with single click(ファイルをシングルクリックで開くようにする)にチェックを付け、close(閉じる)ボタンをクリックしてください。
RubyMineでBitbucketを使う

RubymineはデフォルトではBitbucketに対応していません。Preference探してもGithubは出てくるけどBitbucketが無いことに気がついて悩む方もいるでしょう。
ですが、開発元のJetBrainではちゃんとプラグインを用意しているようです。
https://plugins.jetbrains.com/plugin/8015-bitbucket-linky
（ちなみにローカルに既にBitbucketのプロジェクトがCloneされている前提で話をしています。）
![スクリーンショット 2018-02-10 17.55.14.png](https://qiita-image-store.s3.amazonaws.com/0/1593/2f62c883-8f71-eac0-7d90-c934a6f143ee.png)
このページの下部にダウンロードリンクがあります。
![download.png](https://qiita-image-store.s3.amazonaws.com/0/1593/c9a05a3c-1584-aeae-ae33-60ed705e018d.png)
ローカルに落としたらRubymineを開いてpreferenceのpluginを開きます。
![preference.png](https://qiita-image-store.s3.amazonaws.com/0/1593/6cb255b8-6e03-60f2-df18-1a363f4f6e9e.png)
ここから先程DLしたプラグインを読ませてOK。その後Rubymineを再起動です。
preference確認すると自動的に設定を読み込んだことがわかります。
![linky.png](https://qiita-image-store.s3.amazonaws.com/0/1593/e5d4a59e-3771-e8d5-553f-5992fbbff4c0.png)
以下、プロジェクト一覧からファイルを右クリックすると関連メニューが出てくるので履歴の参照やcheckout, commitが出来ることがわかります。また、右下の場所に現在のブランチが表示されているのも確認できます。
![スクリーンショット 2018-02-10 17.46.19.png](https://qiita-image-store.s3.amazonaws.com/0/1593/9b6a29ae-d4ab-bc2d-8b1d-3cc0c81f12f7.png)
![スクリーンショット 2018-02-10 17.46.44.png](https://qiita-image-store.s3.amazonaws.com/0/1593/c0b9256a-f1bf-df82-d30f-2ca30a3b48c9.png)
![スクリーンショット 2018-02-10 17.54.19.png](https://qiita-image-store.s3.amazonaws.com/0/1593/7ebb9f4b-b17e-3fce-4076-6418cfe436ba.png)
以上です。
論文メモ: Squeeze-and-Excitation Networks

## SENetsとは
- 元の論文: [Squeeze-and-Excitation Networks, arXiv:1709.01507](https://arxiv.org/abs/1709.01507) [cs.CV]

“SENet"というネットワークがあるわけではなく、”SE”をResNetやInceptionと組み合わせて作り出せるネットワークの総称です。

既存のネットワーク、例えば[ResNet](https://qiita.com/ikeyasu/items/ea9ced2b8e0fcb3da2be)や[Inception](https://qiita.com/supersaiakujin/items/106a553ab720d04d6ea6)に適用して、より性能の高いモデルを実現します。

下記の説明が簡潔ですが、元の論文の説明を交えて解釈したほうが良かったので、この記事にまとめました。

- [Squeeze-and-Excitation Networks Setting a new state of the art on ImageNet, Towards Data Science](https://towardsdatascience.com/squeeze-and-excitation-networks-9ef5e71eacd7) 


### 更新 (2020.6.6)

数年たった投稿ですが、意外にご参考にしていただく方が多く、一言追記しておく必要があると思いました。

2020年の今となっては、Transformerの登場に見られるような、データ全体からの情報を使うという考え方、SENetsは画像のグローバルな情報を利用しているので有効だという見方が一般的になっています。

## 概要

通常CNNの畳み込み層では、入力チャンネルが畳み込まれたあと、全て均等にチャンネルに出力されます。
これに対してSENetsは**畳み込み層の各チャンネルを均等に出力せず、適応的に重みをかけること**がポイントです。
SE(”Squeeze-and-Excitation"ブロックの実装例を見てみましょう。

```Python
def se_block(in_block, ch, ratio=16):
    z = GlobalAveragePooling2D()(in_block) # 1
    x = Dense(ch//ratio, activation='relu')(z) # 2
    x = Dense(ch, activation='sigmoid')(x) # 3
    return multiply()([in_block, x]) # 4
```

1. [Global Average Pooling](https://qiita.com/mine820/items/1e49bca6d215ce88594a)で、チャンネルごとの代表値として画素値平均`z`を取る。(ぎゅっと_Squeeze_する部分)
2. `z`は、更に`ch//ratio`個に減らしてチャンネル間の非線形の関係を取る。わざとボトルネックを作って次元削減している。
3. 再び`ch`に次元を戻す。(チャンネル間の相関を強調する、と書いてあることに相当するのか)。
4. ここまで計算された値で各チャンネルを重み付ける。(2からここまでが_Excitation_)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99911/3cf614de-8e6a-65f6-4d23-b44289e71d0e.png)

<img src="https://qiita-image-store.s3.amazonaws.com/0/99911/98b4c20e-80ec-dead-3274-d5031bca20b3.png" width=40%> <img src="https://qiita-image-store.s3.amazonaws.com/0/99911/ecfd46ea-de9e-efc3-dd50-d1841669a022.png" width=40%>
図: SEブロック ([Squeeze-and-Excitation Networks, arXiv:1709.01507](https://arxiv.org/abs/1709.01507) [cs.CV] より)

## 利点
このSEブロックが、入力が条件付けるダイナミクスを本質的にもたらして特徴を識別する能力を高める、と論文で述べています。

補足(2020.6.6) 画像全体の情報を利用するTransformerのSelf-Attentionのような効果があるという見方が強くなっています。

またこのブロックを追加したとしても、計算量は1%以下しか増加せず、様々な既存モデルに適用できることが特徴ということです。例えばResNet-50に適用することで、ResNet-101相当の性能になり、ResNet-101に比べて半分の計算量になることが利点となります。
tarコマンドを使って引数で指定したディレクトリのjpgファイルのみアーカイブする！

jpgファイルやpngファイルやテキストファイルなど、
たくさんのファイルを1つのフォルダとしてまとめてある、

フォルダがあるとして
そのフォルダを見つけたら上司からある日突然、
「jpqファイルのみ1つにまとめといてくれる？」って

指示があったときに役に立つtarコマンドを使ったShellScriptです！:relaxed:

```bash:archiv.sh

#!/bin/bash

readonly SCRIPT_NAME=${0##*/}

archive()
{
  local path="$1"

  if [[ -z $path ]]; then
    printf '\e[31m%s\n\e[m' "${SCRIPT_NAME}: アーカイブしたいファイルがあるディレクトリまたはファイルを指定してください。" 1>&2
    return 1
  fi

  if [[ ! -d $path && ! -f $path ]]; then
    printf '\e[31m%s\n\e[m' "${SCRIPT_NAME}: '$path'は存在しません。" 1>&2
    return 2
  fi

  if [[ -d $path && $path != */ ]]; then
    path+=/
  fi

  # dir変数に正規表現でマッチングした値を代入する。
  # マッチングしなかった場合は現在のディレクトリのパスを代入する
  if [[ $path =~ ^(.*/) ]]; then
    dir=${BASH_REMATCH[1]}
  else
    dir=${PWD}
  fi

  # 相対パスで指定された場合、絶対パスに変換する。
  local basedir=$(cd -- "$dir" && pwd)

  # アーカイブするファイルがあるディレクトリに移動し
  # tarコマンドでjpgファイルをアーカイブする。
  cd -- "$basedir"
  if tar -cf "${basedir}"_jpg.tar -- *.jpg 2> /dev/null; then
    local tardir="${basedir}"_jpg.tar
    printf '\e[36m%s\n\e[m' "アーカイブに成功しました！
${tardir}の${tardir##*/}をご確認ください。"
  else
    printf '\e[31m%s\n\e[m' "JPGファイルが見つからず...アーカイブに失敗しました。"
    return 3
  fi
}

if [[ $# -le 0 ]]; then
  printf '\e[31m%s\n\e[m' "${SCRIPT_NAME}: アーカイブしたいファイルがあるディレクトリまたはファイルを指定してください。" 1>&2
  exit 1
fi

result=0
for i in "$@"
do
  archive "$i" || result=$?
done

exit "$result"

```

## 使い方
```
$ ./archiv.sh ディレクトリ or ファイル のパスを相対パス or 絶対パスで指定する
```
### うまくいった場合以下のように表示されます！（青文字で）
```
$ ./archiv.sh /Users/workspace/tmp
アーカイブに成功しました！
/Users/workspace/tmp_jpg.tarのtmp_jpg.tarをご確認ください。
```
コードは↓にアップしてますので、クローンして使ってみてください:ok_hand_tone3:
https://github.com/masanorifunaki/archive

## 参考
tarコマンドについて詳しくまとめました 【Linuxコマンド集】
https://eng-entrance.com/linux-command-tar
Azure FunctionsBotをデプロイ成功したのにボットが反応しない

最近気が付いたことをメモ。

#事象
Azure FunctionsBotをデプロイ完了後、すぐ使えるようになっているかと思いきや、ボットが反応してくれないことが多い。

- Test in Web Chatがクルクル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/ce8c20d9-ed29-ba42-f657-0d5f2120663d.png)
- Web Chatとつないでも反応しない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/34b2d56b-87a8-54e0-6ca5-8e67fc990855.png)
- BotFramework Emulatorでエラーが出る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/df07969c-8bba-7942-a5d0-dd126ac35d0b.png)


#ここをチェック
デプロイ直後はエンドポイントURLが完成してない気がする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/8d44fadc-689e-f040-bcd0-f39ca19f10f2.png)

本来ならこうなるはず。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/bbd6e72e-7a03-a53a-c72a-5a565fe29e6c.png)


どのくらいで使えるようになるかまちまちだけど…1時間待ってもダメな時には一晩寝かせて翌日見ると使えるようになってます。
原因違うよ～！とか他にも情報お持ちの方いらっしゃいましたら教えてください。
VSTSのbuildでnpm install commandで4048エラーが発生した(2018.02)

VSTSのビルドのVS2017ホスト環境でnpm installコマンドの実行時に4048 operation not permitted, scandirというエラーが出た。

https://github.com/npm/npm/issues/17671

エラーで検索したらnpmのissuesに上がってた。

とりあえずnpm　version 5.6.0 で解決しているらしい。

なのでnodeバージョンを最新にするために、npm installを行っているtaskの前にNode Tool Installer taskを入れて ^9.5をインストールするようにしたら解決した。
ビットコインエクスプローラー(5)

# ビットコインエクスプローラー(5)

## ビットコインの受信方法

ランダムシードから、秘密鍵を生成

```
bx seed | bx ec-new
```

```
[256 bit seed]
5a6f518e0d5207f350f132b2e0576b71f28344bc4a5993be

[private key]
526df739448b8f24f66bb2fe649afbc54384a43771281da1f0a89feb9cc49bff
```

ビットコインアドレスを秘密鍵から生成する。

```
bx ec-to-public 526df739448b8f24f66bb2fe649afbc54384a43771281da1f0a89feb9cc49bff | bx ec-to-address
```

```
1A2VwRyFSwZXZ3PwD9jBRdwDVpE69VrjB
```

0.001ビットコインのsatoshisで変換。

```
bx btc-to-satoshi 0.001
```

```
100000
```

0.001ビットコイン(100000satoshi)を上記のアドレスに送る

#### ビットコインの受信を確認する。(ここでは、上記のアドレスを使わない)

`14qBAFULFC5Gv7aiEoYrRmMaexioGW25PM`アドレスのバランスを見る。

```
bx fetch-balance 14qBAFULFC5Gv7aiEoYrRmMaexioGW25PM
```

```
{
    address 14qBAFULFC5Gv7aiEoYrRmMaexioGW25PM
    received 446460351
    spent 0
}
```

`balance.confirmed`は、トランザクションがコンファームされていないことを示す。

#### 受信履歴を見る

```
bx fetch-history 14qBAFULFC5Gv7aiEoYrRmMaexioGW25PM
```

```
transfers
{
    transfer
    {
        received
        {
            hash eaaf6c69b57cd7b0e8e59ba6005e4c9d38f58f7a71da6914e6a2f5c0cbb230d4
            height 508476
            index 1
        }
        value 446460351
    }
}
```

`transfers[0].received.hash`は、あなたのウォレットの表示するトランザクションIDと一致します。

`transfers[0].received.height`は、トランザクションがすくなくとも一つの根ファーメーションを持っていることを示します。

#### 受信のコンファメーションを定める。

ブロックチェーンの高さを見る。

```
bx fetch-height
```

```
508477
```

Using transfers[0].received.height, there are currently 326525 - 326392 = 133 confirmations for the transaction.

`transfers[0].received.height`を使って、現在
508477 - 508476 = 1 コンファメーションがあることがわかる。
Google Home活用のため使用したGoogle Apps Scriptまとめ

#はじめに
Google Homeを購入して、IFTTTからGoogle Apps Scriptを使用するようになりました。
１つ１つ調べながら作成してきたので、ここでよく使ったものをまとめておこうと思います。

#まとめ
##1. スプレッドシート関連
スプレッドシートに書込んだり、読み出したり、使い方はいろいろあります。
よく使ったものをまとめます。

###1. スプレッドシートの取得
スプレッドシートのオブジェクトを取得します。openByIdには、スプレッドシートのURL部分を指定することで、該当のスプレッドシートが取得できます。

```javascript
var spreadsheet = SpreadsheetApp.openById('スプレッドシートのID');
```


上記の「スプレッドシートのID」は、スプレッドシートをブラウザで開いたときのURLの以下「xxxxxxxxxxxxxxxxx」部分です。
https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxx/edit

###2. シートの取得
シートのオブジェクトを取得します。getSheetByNameには、シート名を指定します。
「spreadsheet」は、1で記載したスプレッドシートのオブジェクトです。

```javascript
var sheet = spreadsheet.getSheetByName('シート1');
```

###3. セル内の値の取得
セル内の値を取得します。どのセルを指定するかで方法がいくつかあります。

####アクティブセルの取得

```javascript
var data = sheet.getActiveCell().getValue()
```


####行、列を指定して取得

```javascript
var data = sheet.getRange(1,1).getValue();    // セルA1の取得
```

以下のようにまとめてデータを取得することで、都度getValueするよりも性能がいいようです。

```javascript
  // 2,2・・・B2のセルから
  // 高さ4セル分
  // 横幅3セル分をまとめて取得
  var value = SpreadsheetApp.getActiveSheet().getRange(2,2,4,3).getValues();
  for( i = 0; i < value.length; i ++ ){         // スプレッドシートを上から下に見ていくイメージ
    for( j = 0 ; j < value[i].length; j++ ) {   // スプレッドシートを左から右に見ていくイメージ
      Logger.log(value[i][j]);
    }
  }
```
  



####最終行の取得

```javascript
var posLastRow = sheet.getLastRow();     //最終行の取得
```



##2. 文字列の検索関連

###indexOf 文字列検索
指定した文字列が最初にみつかったインデックス。見つからない場合は「-1」
str ・・・・検索される対象文字列
target・・・検索文字列

```javascript
str.indexOf(target)
```


###substring 文字列の切出し
str ・・・・切出す元の対象文字列
startPos・・検索文字列(0から指定)

```javascript
str.substring(startPos)
```





##3. WEBアクセス関連
Google Apps ScriptでWEBアクセスもできます。WEBページの情報を取得する、WEB APIにアクセスする等に使用できます。


```javascript
var response = UrlFetchApp.fetch("https://www.google.co.jp/");    // WEBページへのアクセス
response.getResponseCode();    // HTTPステータスコードのチェック
response.getContentText();    // HTML形式の結果の取得
JSON.parse(response.getContentText());    // JSONデータのパース(オブジェクトの配列が返ってくる)

```

##4. メール関連
メールも簡単に送信できます。便利ですね。

```javascript
MailApp.sendEmail('xxxxxx@gmail.com', 'メール件名', 'メール本文');
```

##5. ログ出力関連
ログ出力です。スクリプトエディタ画面では、スクリプト実行後に「Ctrl+Enter」でログが表示されます。

```javascript
Logger.log("ログ出力内容");
```



また、よく使うものがあれば、追加していきます。
MySQLの接続元ホストをサブネットマスクで制限する方法

## はじめに
MySQLサーバーで以下の第４オクテットだけ違うサーバーからアクセスを許可するにはどうすればいいのか？

* 192.168.51.1
* 192.168.51.2
* 192.168.51.3

## 前提
* MySQL 5.7 を利用する

## 説明しないこと
* GRANTの文法

## 解決方法

GRANTのホスト値に以下を設定することで許可することができる。

ワイルドカード形式 `'198.51.100.%'`

または

サブネットマスク形式 `'198.51.100.0/255.255.255.0'`

の２通りが指定できる。GRANT文で記述すると以下となる。

`GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'192.51.100.0/255.255.255.0' IDENTIFIED BY 'password';`

### 注意点

ここでの注意点は以下のCIDR形式は対応していないので要注意。

CIDR形式 `'198.51.100.0/24'`

## おわりに
先日CIDR形式でGRANT文を実行してしまい、リモート先からMySQLサーバーに接続することができず、少しハマってしまった。同僚からの助けがあってどうにか解決できたが、次からはもうハマらないぞ!

## 参考
* [MySQL :: MySQL 5\.7 Reference Manual :: 13\.7\.1\.4 GRANT Syntax](https://dev.mysql.com/doc/refman/5.7/en/grant.html)
* [MySQL :: MySQL 5\.7 Reference Manual :: 6\.2\.4 Access Control, Stage 1: Connection Verification](https://dev.mysql.com/doc/refman/5.7/en/connection-access.html)
[Unity]failed to create temp/〜っていうエラーが出てプロジェクトが開けなくなった場合

<h1>色々調べたら</h1>
ググってみると、空容量とか権限に問題がないか、日本語が混じってるかどうかなどの原因が出てきたけど、私のプロジェクトファイルにはそれらには該当しなかった

<h1>解決方法</h1>
新しくフォルダを作って、開けなくなったプロジェクトのフォルダの中のファイル全部を新しいフォルダに移動する。
これで開けるようになりました。

他にも、開発中にUnityエディタをアップデートしてしまうと、実行ファイルが作成できなくなったりするので、その場合でも上記の方法で解決できます。
Plotlyでヒストグラム

### Plotlyでヒストグラム
```
この記事では plotly 2.3.0を利用しています。
```
### はじめに
***

Plotlyは大変便利です。
実際に業務で利用する上で設定している項目などまとめてみました。ここではヒストグラム。
（なお、ここのチャートは静止画です。）

(180314追記)
以下でデータフレームからおこなった例を示しています。
[Plotlyでヒストグラム その2](https://qiita.com/haru1977/items/5ea0f032e5a17b1a9be0)

### 度数分布
***
```py
# coding:utf-8

import pandas as pd
import numpy as np

import plotly.plotly as py
import plotly.graph_objs as go

import plotly.offline as offline
offline.init_notebook_mode()


# データの指定
X = np.random.randint(0,100,100) 

data = go.Histogram(x=X, 
                    xbins=dict(start=0, end=101, size=10)) # 区間の指定。sizeが区間幅


# レイアウトの指定
layout = go.Layout(
    xaxis = dict(title="value", dtick=10),     # dtick でラベルの表示間隔
    yaxis = dict(title="count"),
    bargap = 0.1) # 棒の間隔

fig = dict(data=[data], layout=layout)
offline.iplot(fig)

```
![test5.png](https://qiita-image-store.s3.amazonaws.com/0/50110/04ece9e0-5720-ef10-5d89-eb31df60304c.png)



### 確率分布
***
```py

#データの指定
X = np.random.randint(0,100,100)
data = go.Histogram(x=X, 
                    xbins=dict(start=0, end=101, size=10),
histnorm='probability') #histnorm='probability'で確率分布に

# レイアウトの指定
layout = go.Layout(
    xaxis = dict(title="value", dtick = 10),
    yaxis = dict(title="prob"),
    bargap=0.2) 

fig = dict(data=[data], layout=layout)
offline.iplot(fig)

```
![newplot.png](https://qiita-image-store.s3.amazonaws.com/0/50110/f2bb03cf-252c-5bdd-f7c0-a709c54189d8.png)


### 複数の項目のグラフ
***
```py

# データの指定
X = np.random.randint(0,100,100) 
Y = np.random.randint(0,100,100) 
Z = np.random.randint(0,100,100) 

trace0 = go.Histogram(x=X, xbins=dict(start=0, end=101, size=10), name = 'X')
trace1 = go.Histogram(x=Y, xbins=dict(start=0, end=101, size=10), name = 'Y')
trace2 = go.Histogram(x=Z, xbins=dict(start=0, end=101, size=10), name = 'Z')

# レイアウトの指定
layout = go.Layout(
    xaxis = dict(title="value", dtick = 10),
    yaxis = dict(title="count"),
    bargap = 0.2,
    bargroupgap = 0.1) 

fig = dict(data=[trace0, trace1, trace2], layout=layout)
offline.iplot(fig)

```
![newplot-2.png](https://qiita-image-store.s3.amazonaws.com/0/50110/64158093-4633-a2d9-5785-941f3b626a56.png)



### 積み上げグラフ
***
```py

# レイアウトの指定
layout = go.Layout(
    xaxis = dict(title="value", dtick = 10),
    yaxis = dict(title="count"),
    bargap = 0.2,
    bargroupgap = 0.1,  
    barmode = 'stack') # barmode = 'stack' で積み上げ

fig = dict(data=[trace0, trace1, trace2], layout=layout)
offline.iplot(fig)

```
![newplot-3.png](https://qiita-image-store.s3.amazonaws.com/0/50110/61e06eb2-6a0f-dc85-a15b-33cf39587dcd.png)
"Unity" Player TagをつけたgameObjectを特定のシーンに移動させるScript

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class スクリプト名 : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
	void OnCollisionEnter(Collision col){
		if (col.gameObject.CompareTag ("Player")) {
			SceneManager.LoadScene ("シーン名");
		}
	}
}
watchdogとDropboxでChainerの学習をどこでも監視

chaineruiとか便利なツールが充実してきたけど、もっと手軽に学習過程をDropboxから監視したかった（[ソースコード](https://github.com/ka10ryu1/Tools/blob/master/png_monitoring.py)）。

# 動作環境

- Ubuntu 16.04.3 LTS
- Python 3.5.2
- chainer 3.2
- watchdog 0.8.3

# コード

`watchdog`で`extensions.PlotReport()`等から出力されるPNGデータを監視して、任意のフォルダにコピーするだけ。

```python3:png_monitoring.py
import os
import time
import shutil
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer

class ChangeHandler(FileSystemEventHandler):

    def __init__(self, copy):
        self.copy = copy

    def on_modified(self, event):
        filepath1 = event.src_path
        filename1 = os.path.basename(filepath1)

        name, ext = os.path.splitext(filename1)
        if('png' in ext):
            time.sleep(1)
            filepath2 = os.path.join(self.copy, filename1)
            shutil.copy2(filepath1, filepath2)

def main(monitor, copy):
    while 1:
        event_handler = ChangeHandler(copy)
        observer = Observer()
        observer.schedule(event_handler, monitor, recursive=True)
        observer.start()
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            observer.stop()

        observer.join()
```

# 使い方

`trainer.run()`によってPNGファイルが保存されるフォルダと、それが更新されたときにコピーしたいフォルダを設定する。どちらのフォルダも事前に作成しておくこと。
以下の例ではPNGファイルは`result`フォルダ以下（サブフォルダでも追跡可能）に保存され、Dropboxに作成しておいた`tmp`フォルダにコピーする。

```console
$ ./Tools/png_monitoring.py ./result/ ~/Dropbox/tmp/
```

Dropboxが開ける環境であればどこでも進捗を確認できて便利。監視をやめるときは`Ctrl-c`を連打（もう少しスマートに終了したいが…）。
iPhoneの場合、以下のように学習が進捗すると更新が表示されるのでそれをタップすれば画面が最新に切り替わる。

<img width="320" alt="capture.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227399/8c4c9093-f05b-0ade-81b5-91603d31679c.jpeg">
【JavaScript】Array/Map/Setオブジェクトの簡単な使い方まとめ

# あれこれ
**Arrayオブジェクト**と**Mapオブジェクト**と**Setオブジェクト**の簡単な値の取り出し方とかのメモ

# Arrayオブジェクト

その名の通り配列

## コード

```js
/* Arrayオブジェクト */
let array = new Array(); // 場合によってはvarでいいかも

// [0 => 'AAA', 1=>'BBB', 2=>'CCC']
array = ['AAA', 'BBB', 'CCC'];

console.log(array[1]);
```

## 実行結果

```
BBB
```

# Mapオブジェクト
連想配列てきな使い方ができるみたい

## コード

```js
/* Mapオブジェクト */
let map = new Map();

// ['AAA' => 'あああ', 'BBB' => 'いいい', 'CCC' => 'ううう']
map.set('AAA', 'あああ');
map.set('BBB', 'いいい');
map.set('CCC', 'ううう');

// getメソッドを使ってkeyを指定
console.log(map.get('BBB'));
```

## 実行結果

```
いいい
```

# Setオブジェクト
キーで管理されないデータ（値）の集合（データのおもちゃ箱）

## コード

```js
/* Setオブジェクト */
let set = new Set();

set.add('AAA');
set.add('BBB');
set.add('CCC');

// 値に対してアクセスできない（有無のチェックはできる）
console.log(set.has('BBB'));

// 値を出力することもできる
for (let value of set.values()) {
    console.log(value);
}
```

## 実行結果

```1つ目のconsole.log
true
```

```2つ目のconsole.log
AAA
BBB
CCC
```

# おわり
- JavaScriptむずかしい
- Mapは連想配列って考え方でおおむねOKなんです？
- Setってどんな時使うんや
- Array/Map/Setオブジェクトのあれこれ教えてください

# 参考
- [改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで](http://amzn.asia/1oYdUI5)　参考本
- [letとvarの違い - Qiita](https://qiita.com/y-temp4/items/289686fbdde896d22b5e)
- [(初心者向け) JavaScript の連想配列 (Map) と集合 (Set) - Qiita](https://qiita.com/tadnakam/items/f634f1ef2a62526db27d)
Selectとforeachでインデックス付きのループを実現したい

配列やリストの列挙処理において、列挙される値だけではなく、同時にインデックス/添え字を利用したいということが多々あります。いいかえれば「インデックス付きのループを回したい」というとき、C言語スタイルのforループ(`for (int i = 0; i < len; i++)`)を避けて、これを実現する方法を考えてみます(´・ω・｀)

まずメソッドチェーンの一環としてwith index的なことをしたい場合、[`Select`のオーバライド](https://msdn.microsoft.com/ja-jp/library/bb534869(v=vs.110).aspx)を利用します。

```csharp
var alphabets = "ABC";
var formats = alphabets.Select((alphabet, index) => string.Format("{0} => {1}", index, alphabet)).ToList();
foreach(var format in formats)
{
    Console.WriteLine(format);
}

// 0 => A
// 1 => B
// 2 => C
```

ではメソッドチェーンではない場合、より具体的には`foreach`においてインデックス付きのループを回したい場合はどうすればよいでしょうか? まず思い浮かぶのは匿名型を利用する方法です。匿名型の精製コストが気になるのと、やや見た目がもっさり(?)しますが、大半のケースで問題を解決してくれそうです。

```csharp
var alphabets = "ABC";
foreach (var item in alphabets.Select((alphabet, index) => new { Value = alphabet, Index = index}))
{
    Console.WriteLine("{0} => {1}", item.Index, item.Value);
}
```

C#7以降は言語機能としてタプルによる多値がサポートされているので、これを利用することもできます。

```csharp
var alphabets = "ABC";
foreach (var (alphabet, index) in alphabets.Select((alphabet, index) => (alphabet, index)))
{
    Console.WriteLine("{0} => {1}", index, alphabet);
}
```

C#7以降で、かつ`System.ValueTuple`が導入されていることが前提にはなりますが、これが一番すっきりしていると個人的には感じます。たとえば以下のような拡張メソッドを定義しておくと、便利かもしれませんね(´・ω・｀)

```csharp
public static class IEnumerableExtension
{
    public static IEnumerable<(T, int)> WithIndex<T>(this IEnumerable<T> ts)
    {
        return ts.Select((t, i) => (t, i));
    }
    
    // 利用例
    public static void Main(string[] args)
    {
        var alphabets = "ABC";
        foreach (var (alphabet, index) in alphabets.WithIndex())
        {
            Console.WriteLine("{0} => {1}", index, alphabet);
        }
    }
}
```
ビットコインエクスプローラー(4)

# ビットコインエクスプローラー(4)

## ウォレットシードの覚え方

Create a new mnemonic from a temporary seed. Longer seeds produce longer mnemonics.

一時シードから、新しいムネモニックコードを生成します。
長いシードは、長いムネモニックを作成します。

```
bx seed -b 128 | bx mnemonic-new
```

```
idle hospital exact attend snack special crack afraid leisure pizza next solid
```

ムネモニックから、HDウォレットを作成する。(パスフレーズはオプション)

```
bx mnemonic-to-seed idle hospital exact attend snack special crack afraid leisure pizza next solid | bx hd-new
```

```
xprv9s21ZrQH143K4WAXqWRY1s2LeGPq9BBRmT8LWnYQNojNpRbEDnUPJqCzdqbFG5Tp4ca4AZqCqzmNNoDXcKEMpw9VyEnAWZhyRQQVhD5HTAd
```

パスフレーズを除いたムネモニックは、順番を含め秘密にしてください。
Windows 10 Home でエクスプローラーや右クリックの挙動が遅いときの解決方法

# エクスプローラーの挙動
## 原因
突然遅くなる原因はWindows Updateの可能性が大きい。
これはWindows UpdateがOSを更新してもハードのドライバを更新しないため、不整合が生じているからのようだ。

## 公式の言い訳
[[Windows 10] Windows Explorerの動作が遅い]()
>Windows 10 にされてからエクスプローラーの動作が遅く、ファイルの削除や移動がすぐに反映されないのですね。 

>まず何が要因でエクスプローラーの動作が遅くなっているのか切り分けていくといいと思います。

>よろしければ次の内容をお試しください。

>1. PC を必要最小限の構成で起動し、エクスプローラーの動作に変化があるか確認する
[こちらのページ] のスタートアップ設定の項目まで進み、セーフ モードを選んで起動し、エクスプローラーの動作が変化するか確認してください。
>(その状態で再起動すればセーフ モードではなく通常起動に戻れます)

>2. 常駐アプリケーションを停止し、エクスプローラーの動作を確認する
[こちらのページ] の手順でクリーン ブートを行って常駐アプリケーションを一時的に停止し、その状態でエクスプローラーの動作を確認してみてください。

>クリーン ブート時にエクスプローラーの動作が正常でしたら[こちらのページ] の操作で要因を絞り込める場合があります。
>※これらのリンク先のページは Windows 8.1 までの内容ですが、Windows 10 も操作はほぼ変わりません。あとで元の設定に戻してください
>3. 新規ユーザー アカウントを作成してエクスプローラーの動作を確認する

>いずれを行ってもエクスプローラーの動作が変わらない場合、新規ユーザーでの操作もお試しください。
>(ユーザー アカウントに問題が発生していないか切り分けのため)

>操作などで不明点がありましたら､それもお気軽に書き込んでくださいね。
>南谷一 – Microsoft Support

## フォルダの設定を全般にしてしまう
[Windows 10 フォルダの種類や列の表示を固定する](https://www.tipsfound.com/windows10/07008)
## 時間系の列を減らす
[Windowsエクスプローラーのファイル一覧表示が遅い時の対処 ](http://itpc.blog87.fc2.com/blog-entry-177.html)

## デバイスマネージャーからデバイスのドライバをアップデートする
###Windows UPDATEはデバイスのドライバーまでアップデートしていない
####Windowsのアップデートなのでよく考えるとOSのアップデートしかしていない
とも言い切れないけど、まあこのため、前のドライバと実は不整合になっている可能性が高い。
###そこでデバイスマネージャーからアップデートする
サウンド、ディスプレイ、タッチパッド、Wifiはアップデートした
###どうして治るの？
エクスプローラーでファイルを表示させるときにドライバを通過するときに問題がありそう。
WindowsUpdateでドライバと不整合を起こす例は最近こうした事例がある。
[納品書、請求書、チェーンストア統一伝票などが印刷出来ない件で振り回される](http://capacitor.blog.fc2.com/blog-category-9.html)

### 長所と短所
長所はエクスプローラーの改善とともに、デバイスから生じるエラーも軽減できること。短所は一つ一つドライバの更新をかけていくので時間がかかること。確実に早くなるとは言えないことである。

## [クイックアクセスとジャンプリストのキャッシュを削除](https://news.mynavi.jp/article/win10tips-197/)
この方法はクィックアクセスそのものを使用不可にするので副作用が大きいのでお勧めができない


# 右クリックの挙動
## 原因はコンテキストメニューの重いもの
###解決にはレジストリを編集する必要がある
[Windows 10 右クリックしたときコンテキストメニューの表示が遅い](https://blogs.osdn.jp/2016/03/30/igfxDTCM.html)
右クリックの改善は右クリックで表示されるコンテキストメニューに重いものがあるから。これを改善するにはレジストリを削る必要がある。だがどのメニューが遅いのかはわからない
###重いメニューを調べるにはCCleanerを使用する
[[Windows10] 右クリックメニューを開くのが急に遅くなった ](http://propg.ee-mall.info/it/windows10-%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E9%96%8B%E3%81%8F%E3%81%AE%E3%81%8C%E6%80%A5%E3%81%AB%E9%81%85%E3%81%8F%E3%81%AA%E3%81%A3/)
これによるとCCleanerで調べる必要があるとのこと
[CCleaner](https://www.ccleaner.com/ccleaner/builds)

###なぞのIntel
右クリックの重さにはすべてintelが絡んでいる。
Adobe Digital Editionsを強制的に認証解除

##状況
- Adobe Digital Editions（ADE）は、ヘルプ→認証解除 で認証解除できるが、できなくなっちゃうこともある。

##対応
- フォルダ `~/Library/Application Support/Adobe/Digital Editions` の名称を変える。
- これで認証が解除された状態になるので、ADE を起動して、改めて認証する。
- 動作に以上がないことが確かめられたら、名称を変えた古い `Digital Editions` を消去する。
[test016] 指定した区間の文字を変更

# 指定した区間の文字を変更

## 仕様
- 正規表現
- 「aaa」と「bbb」に挟まれた区間にある「C」を「Z」にする

## ソース

### javascript

```test016-1.js
var str="hogehogeaaaCkCogfkjhCgoCbbbfugafuga";
var str=str.replace(/^(.*?aaa)(.+)(bbb.*)$/,function(r0,r1,r2,r3){
  return r1+r2.replace(/C/g,"Z")+r3;
});
console.log(str);
```
```test016-2.js
var str="hogehogeaaaCkCogfkjhCgoCbbbfugafuga";
var str=str.replace(/^(.*?aaa)(.+)(bbb.*)$/,function(){
  var r=arguments;
  return r[1]+r[2].replace(/C/g,"Z")+r[3];
});
console.log(str);
```

## その他

### 元ネタ
- 教えてgoo [ある文字の間の文字を全て変換する正規表現を使ったリプレイス](https://oshiete.goo.ne.jp/qa/10278558.html)