OmniAICreator/Qiita-1.07M huggingface dataset:
LaTeX：esvectパッケージによる矢線ベクトル表記

#esvectパッケージとは

矢線ベクトル表記(arrow notation)にしか使われない，ささやかだけれども嬉しいパッケージ。
Maintained by Eddie Saudrais.
CTAN: https://www.ctan.org/pkg/esvect ver.1.3 2013-11-09

#esvectパッケージのインストール

TeX Live には収録されているとのこと。
MiKTeX にも収録されているとのこと。

##自分でインストールする場合

1. esvect.ins と esvect.dtx をダウンロード。<br>入手先：https://www.ctan.org/tex-archive/macros/latex/contrib/esvect <br>あるいは [esvect.zip](http://mirrors.ctan.org/macros/latex/contrib/esvect.zip) をダウンロードして展開。
1. platex esvect.ins を実行。
1. 生成された esvect.sty と uesvect.fd を，たとえば $texmf/share/texmf-local/tex/latex/ に置く。
1. 生成された *.mf を，たとえば $texmf/share/texmf-local/fonts/source/public/esvect/ に置く。

#最低限必要なこと

```sample.tex
\documentclass{jsarticle}
\usepackage{esvect} % パッケージをインクルード
\begin{document}
% TeX/LaTeX のコマンド
$\vec{a}$\ $\vec{\mathrm{AB}}$\
$\overrightarrow{\mathrm{AB}$\quad
% esvect のコマンド
$\vv{a}$\ $\vv{\mathrm{AB}}$
\end{document}
```
![20171017esvect-1.png](https://qiita-image-store.s3.amazonaws.com/0/108155/c3f86797-49e7-e324-cf92-3c60fe89bed5.png)

#矢線の頭

導入時にオプションをつけて，矢線の頭の形を決める。
デフォルトは `d`。

|オプションつき|出力例|
|:-:|:-:|
|`\usepackage[a]{esvect}`|![head_a](https://qiita-image-store.s3.amazonaws.com/0/108155/46dea167-1a34-059e-d050-7a4f92335f92.png)|
|`\usepackage[b]{esvect}`|![head_b](https://qiita-image-store.s3.amazonaws.com/0/108155/74c8e572-b83b-b22c-718d-d2e15530644f.png)|
|`\usepackage[c]{esvect}`|![head_c](https://qiita-image-store.s3.amazonaws.com/0/108155/146d2ddd-6fa1-1603-4c7a-50dea9049062.png)|
|`\usepackage[d]{esvect}`<br>`\usepackage{esvect}`|![head_d](https://qiita-image-store.s3.amazonaws.com/0/108155/cd8773b4-086d-6691-a49c-165f2d98a51e.png)|
|`\usepackage[e]{esvect}`|![head_e](https://qiita-image-store.s3.amazonaws.com/0/108155/1990e687-50b8-83dd-8813-56f652940ef4.png)|
|`\usepackage[f]{esvect}`|![head_f](https://qiita-image-store.s3.amazonaws.com/0/108155/96c2d368-e12e-9f00-32de-ba67fea2c4ab.png)|
|`\usepackage[g]{esvect}`|![head_g](https://qiita-image-store.s3.amazonaws.com/0/108155/b151b8bf-f56e-6a8a-75da-6443af6ef9ca.png)|
|`\usepackage[h]{esvect}`|![head_h](https://qiita-image-store.s3.amazonaws.com/0/108155/9b3ee7d8-9341-bec3-3edf-ff4eceb27e90.png)|

##複数種を混在させるには

複数の種類の矢頭をひとつの文書に混在させるには？
そんなことが必要なのは，マニュアルを作るときくらいだろう。
だから，考えないことにしよう。
どうしてもやりたいときは，esvect.dtx をじかに読めばヒントが得られそう。

#下付き文字

コマンド `\vv*{本体}{添字}` が用意されている。

```sample.tex
\documentclass{jsarticle}
\usepackage{esvect}
\begin{document}
$\vv{a_x}$\quad $\vv{a}_x$\quad $\vv*{a}{x}$
\end{document}
```
![20171017esvect-1.png](https://qiita-image-store.s3.amazonaws.com/0/108155/67801689-c77f-03cc-184e-b81d055b1a9a.png)

#おまけ：この頁を作成中に生じた問題

standalone パッケージを利用してシンプルに出力例を作ろうとしたら…，

```sample.tex
\documentclass{standalone}
\usepackage{esvect}
\begin{document}
$\vv{a}$
\end{document}
```
![20171017esvect-1.png](https://qiita-image-store.s3.amazonaws.com/0/108155/8d84e8fe-6513-2809-3cc5-9aa2fc73cbfd.png)
矢印の上側が切れてしまった！

そこで，ダミーの柱を入れて全体が入るようにしました。

```sample.tex
\documentclass{standalone}
\usepackage{esvect}
\begin{document}
\ $\vv{a}$\ \rule[-.5ex]{0pt}{3ex}
\end{document}
```
![20171017esvect-1.png](https://qiita-image-store.s3.amazonaws.com/0/108155/45a7f40b-528a-3f0c-a8f2-bd267c09fc3c.png)


* * *
おしまい
bash > Brace Expansion > 複数の拡張子 > echo {X..Z}.{jpg,png,bin} | file.txtをfile.txt.bakにコピーするBrace Expansion 

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
SmartGit付属のMinGW32
grep (GNU grep) 2.24
head (GNU coreutils) 8.25
```

複数の拡張子のファイル名をBrace Expansionで取得する方法が気になった。

参考: https://unix.stackexchange.com/questions/196359/using-for-file-in-to-select-multiple-extension-names-then-get-the-basename-of
> asked Apr 15 '15 at 10:08
> The Wolf

以下で良さそう。

```bash
$ echo {X..Z}.{jpg,png,bin}
X.jpg X.png X.bin Y.jpg Y.png Y.bin Z.jpg Z.png Z.bin
```

### 余談

file.txtをfile.txt.bakにコピーするBrace Expansionが見つかったが、今のところ使う予定はない。

https://unix.stackexchange.com/questions/6035/when-do-you-use-brace-expansion

### 関連

[bash > Brace Expansionで日付のダミーファイルを作る | ファイル名失敗時: MinGW32でファイルを消す](https://qiita.com/7of9/items/078ff8702cbbb64e5d88)

### 関連

PowerShellのBrace Expansionの記事はこちら

- [PowerShellでブレース展開ができなかったのでググった](https://qiita.com/okumurakengo/items/f381d2385e5046a718c2) by @okumurakengo さん

情報感謝です
react-router v4で画面遷移時にトップから表示する方法

# react-router v4で画面遷移時にトップから表示する

react-router-scroll-memoryを使用します
https://www.npmjs.com/package/react-router-scroll-memory

```
$ npm install --save react-router-scroll-memory
```
ScrollMemoryをインポートして

```jsx
import ScrollMemory from 'react-router-scroll-memory';

```
BrowserRouterの後ろに<ScrollMemory />を加えれば完成です

```jsx
  <BrowserRouter>
    <div>
      <ScrollMemory />
      <App />
    </div>
  </BrowserRouter>
```

遷移時にTOPへ移らなかった方は試してみてはいかがでしょうか
react-router v4でしか動作しないとのことなのでお気をつけください
【メモ】サブクエリ、DB::rawを使って複数テーブルが絡むデータ取得(Laravel)

#開発中サービス
・アイドルファン同士をマッチングするサービス
・ユーザーが好きなアイドルを登録する
・登録されたアイドルが被っているユーザー同士をマッチングする

#テーブル
・users・・ユーザー情報を登録するテーブル
・idols・・ユーザーが登録した「好きなアイドル」
・recommends・・「好きなアイドル」が被っているユーザーの中で既にレコメンドされたユーザーのセット(user_id,friend_id)を登録

#コード
自分と好きなアイドルが被っているユーザーで、かつまだレコメンドされていない(recommendsテーブルに登録されていない)ユーザーのidを取得したい

```PHP
$friends = DB::select(DB::raw("select id from users where id = any(select user_id from idols where idol = any(select idol from idols where user_id = $user->id)) and id != $user->id and id not in (select friend_id from recommends where user_id = $user->id)"));
```

#MySQL
サブクエリの結果が１行でない場合、サブクエリをany()で囲うことで複数行に対応できる。
これをしないとエラーになる。
※上記の`$user->id`のところは１にしている。

```mysql
select id from users where id = any(select user_id from idols where idol = any(select idol from idols where user_id = 1)) and id != 1;
```
件数が多くなると遅くなりそうな予感がするので、
もう少しうまくやるやり方を調査中。


#Laravel
SQL文を直接使う場合は`DB::raw`を使うことでSQL文を生成出来る。
以下のようにすることで`$friends`に結果が格納される。
少なくとも結果が複数の場合は`stdClass`の配列が入りました。(結果が単数の場合は試してません)

```php
$friends = DB::select(DB::raw('select文'));
```

一つ一つの結果に処理をする場合は`foreach`で回したけど、
配列の一つ一つの要素が`stdClass`なので、
取得したカラムを指定して、`$friend->id`のように書かないと中の値を取り出せなかった。

```php
foreach ($friends as $friend) {
    $recommends = new Recommend();
    $recommends->friend_id = $friend->id;
    $user->recommends()->save($recommends);
}
```

なんで`stdClass`になるのかは調査中。

#参考
　https://dev.mysql.com/doc/refman/5.6/ja/subquery-errors.html
　https://qiita.com/10fuya/items/b8ac349ff81b4fa753a6
　https://qiita.com/zaburo/items/627a6b5df539ef6ac33c
配列・リスト・マップ

　Javaでリストを使わなければならなくなったため、データ構造の復習をする。参考サイトは以下の通り。
・[Javaを使うなら必ず覚えておきたいデータ構造 -配列・リスト・マップ](http://...)

#1. 配列
##1.1 配列の宣言
　配列は複数のデータをまとめて扱うためのデータ構造。配列を利用するためには、生成時に格納するデータ数を宣言する必要がある。後からサイズを変更することは不可能。

```java:
データの型[] 配列名 = new データの型[配列の長さ];    //配列の宣言
```

##1.2 配列にデータを格納
　配列にデータを格納する時は、配列名とindex番号を指定する必要がある。int型のnumbersにデータを格納してみる。

```java:
int[] numbers = new int[3];
numbers[0] = 5;
numbers[1] = 200;
numbers[2] = 320;
```

この書き方は面倒くさいので、省略することが可能である。

```java
int[] numbers = {5, 200, 320};
```

配列に値を代入しない場合は、自動的に値が代入される仕組みとなっている。(int型の場合、0が代入される)

##1.3 配列からデータを取得
　配列からデータを取得する時は、格納する時と同様に配列名とindex番号を用いて、取得する。

```java
for(int i = 0; i < numbers.length; i++){
  System.out.println(numbers[i]);
}
```

#2. リスト
　リストも配列と同様に、複数のデータを扱うためのデータ構造である。しかし、配列とは異なり、リストの長さを指定する必要がない。つまり、リストの長さは可変である。リストを扱う際には、ソースファイルの最初にpackageをimportする必要がある。

```java
import java.util.*;
```

##2.1 リストの宣言
　リストを宣言するには、格納するデータの型とリスト名を指定する。

```java
List<データの型> リスト名 = new ArrayList<データの型>();
```

##2.2 リストにデータを格納
　リストにデータを格納する時は、リストが持つaddメソッドを用いる。

```java
リスト名.add(データ);
```

##2.3 リストからデータを取得する
　リストからデータを取得するには、リストが持つgetメソッドにindex番号を指定して、取得する。

```java
リスト名.get(index番号);
```

##2.4 リストのデータを置き換え
　リストのデータを置き換えるためには、リストが持つsetメソッドに、index番号・追加するデータを指定する。

```java
リスト名.set(index番号, 追加するデータ);
```

##2.5 リストに対して、同じ処理を行う
　for文を用いて、リストに対して同じ処理を行う。リストが持つsizeメソッドを用いることで、リストの長さが分かる。

```java
for(int i = 0; i < リスト名.size(); i++){
  //処理内容
  .
  .
}
```

#3. マップ
　マップとは、keyに対応するvalueを格納するデータ構造である。マップへデータを格納する時に、keyへの関連付けを行う。マップからデータを取得する時には、関連付けられたkeyを使用する。リストと同様に、マップを用いる場合は、ソースファイルにpackageをimportする必要がある。

```java
import java.util.*;
```

##3.1 マップの宣言

```java
Map<keyのデータの型, valueのデータの型> マップ名 = 
                     new HashMap<keyのデータの型, valueのデータの型>();
```

##3.2 マップのデータを格納

```java:
マップ名.put(key, value);
```

##3.3 マップのデータを取得

```java:
マップ名.get(key);
```

##3.4 マップ中のデータに同じ処理をする
　拡張for文を用いて、マップ中のデータに同じ処理を行う。マップが持つkeySetメソッドによって、マップ中のkeyをすべて返す。

```java
for(keyのデータ型 key : マップ名.keySet() ) {
  データ型 data = マップ名.get(key);
  
  //処理
}
線形緩和問題とは

# 線形緩和問題とは

[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)における混合整数最適化問題の整数制約を取り除いてできる問題を(混合整数最適化問題の)線形緩和問題といい、線形最適化問題になります。

## そもそも緩和問題[^1]とは

[^1]: 定式化されたモノをモデルとよぶならば、緩和問題ではなく、緩和モデルとよびたいところです。

元の問題の制約条件の一部または全部を削除してできる新たな問題を、元の問題の緩和問題とよびます。

### 特徴

制約条件がなくなっているので、実行可能領域は広がります。従って、下記の特徴があります。

- 最大化問題の場合、緩和問題の最適解は元の問題の上界になります(最小化なら下界)。
- 緩和問題の最適解が元の問題で実行可能ならば、元の問題の最適解になります。
- 基本的に元の問題より解きやすくなります。

### 線形緩和とは

緩和の一種で、整数制約を削除することです。

### (参考までに)ラグランジュ緩和とは

- 元の非線形最適化問題の制約条件を削除して、制約条件を違反する量をペナルティとして目的関数に加えてできる新たな問題を、元の問題のラグランジュ緩和問題とよびます。
- 適切なペナルティの重み(ラグランジュ乗数)を決めてやると、ラグランジュ緩和問題の最適解は元の問題の最適解になります。
- ラグランジュ緩和問題は無制約になり、利用可能なアルゴリズムが増えて解きやすくなります。
- ただし、混合整数最適化問題のラグランジュ緩和問題を考えてもあまり意味はありませんので、ここでは紹介のみとします。

## なぜ緩和するのか

例えば線形緩和は、[分枝限定法](https://qiita.com/SaitoTsutomu/items/7d257a855433e6917faf)で利用されます。
他にも、近似解を得たり、感度分析したり、双対定理の証明などで使われます。
なお、曲線の関数を折れ線で表すのは、区分線形近似とよばれ、緩和ではありません。

## 例題(ナップサック問題)による確認

図示しやすいように3変数の以下の混合整数最適化問題[^2]であるナップサック問題を考えましょう。

[^2]: 紛れの少ないよび方では、ナップサック問題は整数最適化問題になります。ここでは、より汎用的な混合整数最適化問題について成立する説明なので、あえてこのようによんでいます。

### 混合整数最適化問題の定式化

最大化|$7x+8y+9z$
:--|:--
制約条件|$6x+7y+8z \le 14$
 |$x,y,z \in \\{0,1\\}$

### 混合整数最適化問題の解空間と最適解(赤い点)の図示

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/2472832c-d07a-7b0c-6392-4b4b30877624.png)

### 混合整数最適化問題のPythonによる求解

```py3:python
from pulp import *
m = LpProblem(sense=LpMaximize) # 数理モデル
x,y,z = [LpVariable(c,cat=LpBinary) for c in 'xyz'] # 変数
m += lpDot([7,8,9], [x,y,z]) # 目的関数
m += lpDot([6,7,8], [x,y,z]) <= 14 # 制約条件
m.solve() # 求解
print([value(v) for v in [x,y,z]]) # 出力
>>>
[1.0, 0.0, 1.0]
```

### 線形緩和問題の定式化

最大化|$7x+8y+9z$
:--|:--
制約条件|$6x+7y+8z \le 14$
 |$x,y,z \ge 0, ~~\le 1$

### 線形緩和問題の解空間と最適解(赤い点)の図示

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/f7a20960-b965-c7a4-51d6-aaae143011a0.png)

### 線形緩和問題のPythonによる求解

```py3:python
from pulp import *
m = LpProblem(sense=LpMaximize) # 数理モデル
x,y,z = [LpVariable(c,lowBound=0,upBound=1) for c in 'xyz'] # 変数
m += lpDot([7,8,9], [x,y,z]) # 目的関数
m += lpDot([6,7,8], [x,y,z]) <= 14 # 制約条件
m.solve() # 求解
print([value(v) for v in [x,y,z]]) # 出力
>>>
[1.0, 1.0, 0.125]
```

以上
Atomでペイン(ウィンドウ)の表示範囲を変更する

よくやらかして、毎回検索しても出てこなかったのでTipsとしてあげます。

## 何をやらかしたか
![スクリーンショット 2017-10-17 13.51.05.png](https://qiita-image-store.s3.amazonaws.com/0/145671/c8559c02-65f6-115a-5a78-399ab038b35b.png)

一番右の謎の黒い迫り来る空間。
文字表示を小さくしたり、大きくしたりするときに似たようなコマンドだったので、よくやらかしてました。

## 解決方法
| キーバインド　　　                  |  動作              |
|:----------------------------|:-------------------|
| command + alt + -           | ペインを狭める        |
| command + alt + shift + -   | ペインを広げる        |

これでいけますｂ
言語の括弧を数えてみた(フィボナッチ編)

「Lispは括弧が多くて...」という話をよく聞くので各言語の括弧を数えてみました。
ちなみLispに好きなので、括弧が多くて嫌だなーというイメージを払拭したいと考えています。

今回のフィボナッチ数列の実装は一番ノーマルだと思われる再帰の形で実装しています。
また、`fib(0) = 0, fib(1) = 1` の実装です

括弧の省略については判断が難しいのでコメントください。
言語のチョイスは私の好みです。追加してほしい言語があったらコメントお待ちしております。


### C
```c
int fib(int n) {
  if(n == 0 || n == 1) {
    return n;
  }
  return fib(n - 1) + fib(n - 2);
}
```
():4 + {}:2 = 6


### Go
```go
func fib(n int) int {
  if n == 0 || n == 1 {
    return n
  }
  return fib(n - 1) + fib(n - 2)
}
```
():3 + {}:2 = 5

### Java
```java
int fib(int n) {
    if(n == 0 || n == 1) {
      return n;
    }
    return fib(n - 1) + fib(n - 2);
  }
}
```
():4 + {}:2 = 6

### Ruby
```rb
def fib(n)
  return n if n == 0 or n == 1
  fib(n - 1) + fib(n - 2)
end
```
():3 + do..end:0.5 = 3.5

### Python
```py
def fib(n):
  if n == 0 or n == 1:
    return n
  return fib(n - 1) + fib(n - 2)
```
():3 = 3

### JavaScript
```js
function fib(n) {
  if(n == 0 || n == 1) {
    return n;
  }
  return fib(n - 1) + fib(n - 2);
}
```
():4 + {}:2 = 6

### Clojure
```clj
(defn fib [n]
  (if (or (= n 0) (= n 1))
      n
      (+ (fib (- n 1))
         (fib (- n 2)))))
```
():10 + []:1 = 11

### CommonLisp
```cl
(defun fib (n)
   (if (or (= n 0) (= n 1))
       n
       (+ (fib (- n 1))
          (fib (- n 2)))))
```
():11 = 11

## 結果
|lang|( 　 )|{ 　 }|[ 　 ]|do end|合計|
|:--|:--:|:--:|:--:|:--:|:--:|
|Python|3|-|-|-|3|
|Ruby|3|-|-|0.5|3.5|
|Go|3|2|-|-|5|
|C|4|2|-|-|6|
|Java|4|2|-|-|6|
|JavaScript|4|2|-|-|6|
|Clojure|10|-|1|-|11|
|CommonLisp|11|-|-|-|11|


結果Lisp系の括弧が11と一番多い結果となってしまいました。
Lispの括弧はそんな多くないんだよという例がないか探し中です。もっと複雑な処理にするとLispのコード量自体が減り括弧の量も減ると思われます。
というか、Lispだと同じことをやりたいときに簡単に処理が書ける分括弧が少なくなるのかもしれない。。


この実装が変とか、この例でやると良いのではと言うものがあったら教えてください。
Kerasのgraphvizモジュールで学習モデルを可視化

いろいろ参考にさせてもらったらなんかいろいろ古かったぽいのでメモ。

```brew install graphviz```
でインストール。

Python3を使ってる場合、pydot_ngをインストールしないとグラフが書けないらしいのでインストール。

```pip install pydot_ng```

で、プログラム内でKerasのGraphvizを使うためのモジュールを読み込む。グラフの構造を画像で保存したいなら以下。

```from keras.utils import plot_model```
JupyterNotebookで可視化したいなら以下。

```from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
```
で、学習モデルを構築後、学習前に
```plot_model(model, to_file='model.png')```
で出力。元気な学習モデルのグラフが産み落とされた。
sakura.ioのwebhookに付与されるSecretを検証する

## 追記
[2017.10.17 追記]
すぐにTwitterで補足いただきました。
https://twitter.com/chibiegg/status/920156559727923200

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79239/6fbc2040-1ce8-5627-2125-e4b6ce23256a.png)

すなわち

- incoming webhook（サーバ → sakura.io）の場合、JSONの生成は自由
- outgoing webhook（sakura.io → サーバ）の場合、受け取ったペイロード（JSON）をそのまま計算

すればよいとのこと。
（ご丁寧にありがとうございました :bow: ）

特にoutgoing webhookの場合、大抵はサーバ側の実装言語でデシリアライズされているかと思うので、
元々のペイロードを計算に使うよう気をつければ大丈夫そうです。

以降、outgoing webhookのSecret検証の際に注意する項目として残しておきます。

## 概要
[sakura.io](https://sakura.io/)の連携サービスである[Outgoing Webhook](https://sakura.io/docs/pages/platform-specification/data-integration/outgoing-webhook.html)および[Incoming Webhook](https://sakura.io/docs/pages/platform-specification/data-integration/incoming-webhook.html)には 
**Secret** を設定することができます。

Secretを用いてリクエストを検証するには、Secretと
リクエストボディから生成したハッシュ値を比較する必要がありますが、
[ドキュメント](https://sakura.io/docs/pages/manual/api.html#sakura-io-incoming-webhook)から読み取れなかった部分を今回検証したので、メモとして残しておきます。

## ハッシュ値の生成
以下、outgoing webhookを例に説明します。
（incoming webhookは未検証だが、おそらく同様の方法）

ドキュメントのサンプル実装より、ハッシュ値はHMACで生成されます。

- ハッシュ関数
    - SHA1
- 秘密鍵
    - webhookに設定したSecret
- メッセージ
    - リクエストボディ(JSON）

生成されたハッシュ値が `X-Sakura-Signature` ヘッダとしてリクエストに含まれます。
サーバ側でもハッシュ値の生成を行い、 `X-Sakura-Signature` と比較することでリクエストを検証します。

## メッセージ
ここで重要なのがメッセージ（以下、JSON）です。

- JSONの要素順
- minifyの有無

が異なると生成されるハッシュ値も異なるため、正常に検証することができません。

これらがドキュメントには記載がありませんので、実際にoutgoing webhookを送信して検証しました。

### 実際に送ってみる
適当なサーバ（今回はAWS EC2インスタンス）を立てて、ncでリクエストを受けてみました。

```shell-session
[ec2-user@ip-X-X-X-X ~]$ nc -l 8080
POST / HTTP/1.1
Host: Y.Y.Y.Y:8080
User-Agent: SAKURA-IoT-Webhook
Content-Length: 191
Content-Type: application/json
X-Sakura-Signature: 6f83b432c91b398de740b77dd6ee8fc8daeee088
Accept-Encoding: gzip

{"module":"xxxxxxxxxx","type":"channels","datetime":"2017-10-17T02:47:10.113999314Z","payload":{"channels":[{"channel":0,"type":"i","value":1,"datetime":"2017-10-17T02:47:10.114000551Z"}]}}
```

上記より、以下が判明しました。

- JSONの要素順（`channels` typeの場合）
    - module
    - type
    - datetime
    - payload
- minifyの有無
    - 有

これらを踏まえてドキュメントのサンプルコードを実行したところ、想定通りのハッシュ値を生成することができました。

```py3

#!/usr/bin/env python

import hmac
import hashlib
import requests
import json
secret = "Secret"
data = '{"module":"xxxxxxxxxx","type":"channels","datetime":"2017-10-17T02:47:10.113999314Z","payload":{"channels":[{"channel":0,"type":"i","value":1,"datetime":"2017-10-17T02:47:10.114000551Z"}]}}'

x_sakura_signature = hmac.new(secret.encode("utf-8"), data.encode("utf-8"), hashlib.sha1).hexdigest()
```

## まとめ
Secret検証時のメッセージ（JSON）は以下に気をつける。

- 要素順
- minify

---

余談ですが、ドキュメントのサンプルコードは

- サンプルのJSONがminifyされていない
- `json.dumps()` でシリアライズされる順序が不定

なので、これを元に検証しようとすると苦戦します。
Angular4とIE11で Error: Invalid argument.

エラーレポートをチェックしていたら、IE11でだけエラーが出てました。

<img width="287" alt="スクリーンショット 2017-10-17 13.59.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/9186/ca8181a7-4a17-9238-6c9a-4595baa4caed.png">

↑コレ。

なんぞ？と思ったら変なコードを書いてしまっていたのが原因でした。

```template.html
<p [innerHTML]="hoge">{{ hoge }}</p>
```

思わずなんでやねんと言ってしまった午後の昼下がり。
MySQLで禁止・NGワード検索

MySQLを使ってNGワードテーブルに登録されている単語で検索してみた。


##### **NGワードテーブル準備**
```sql
CREATE DATABASE `test` /*!40100 COLLATE 'utf8mb4_general_ci' */;
USE `test`;
CREATE TABLE `ng` ( `word` VARCHAR(50) NULL DEFAULT NULL ) COMMENT='NGワードテーブル' ENGINE=InnoDB;
INSERT INTO `ng` (`word`) VALUES ('ばか'),('あほ'),('どじ'),('まぬけ');
```

NGワードテーブル
---

| word | 
|:-----------------| 
| ばか | 
| あほ | 
| どじ | 
| まぬけ | 

##### **単語検索**
```sql
SELECT ng.word 
FROM (SELECT 'ばか' AS `value` ) target
INNER JOIN ng ON target.value REGEXP ng.word;
-- INNER JOIN ng ON target.value LIKE CONCAT('%', ng.word ,'%');
```

##### **カウント用**
```sql
SELECT COUNT(*) 
FROM (SELECT 'あほどじ' AS `value` ) target
INNER JOIN ng ON target.value REGEXP ng.word;
```

##### **検証用**
```sql
-- 取得件数の有無で判定
SELECT ng.word 
FROM (SELECT 'まぬけ' AS `value` ) target
INNER JOIN ng ON target.value REGEXP ng.word LIMIT 1

-- ngflagカラムの0,1で判定
SELECT COUNT(*) AS `ngflag` FROM 
(
    SELECT ng.word 
    FROM (SELECT 'ほげほげ' AS `value` ) target
    INNER JOIN ng ON target.value REGEXP ng.word LIMIT 1
) tmp;
```

##### **NGワード連結正規表現パターンマッチング編**
```sql
SELECT (SELECT ':targetValue' REGEXP (SELECT GROUP_CONCAT(word SEPARATOR '|') FROM ng)) AS `ngflag`;
```

##### **相関サブクエリ編**
```sql
SELECT COUNT(*) AS `ngflag`
FROM (SELECT ':targetValue' AS `value`) target
WHERE EXISTS (
    SELECT *
    FROM ng 
    WHERE target.value LIKE CONCAT ('%', ng.word, '%')
);
```


文献をざっと探したところなさそうだったので、できそうだなーと思いやってみたら動いたのでアップしました。
用途としてはユーザ名・記事のタイトル・本文とかをテーブルに格納する前にクエリ1回流せば検証できるので、サーバサイドのプログラムでゴリゴリ書くよりは楽かと思います。
ElasticBeanstalkでhttpからhttpsにリダイレクトする(force https)

# 結論

- 以下を.ebextensions/* に配置してeb deploy

```yaml:.ebextensions/initialize.config
files:
  #X-Forwarded-ProtoはELBから渡されるので、前段にELBがある場合のみ作用する
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
            RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
            </If>
```

# 説明

- /etc/httpd/conf.d/*.conf がapacheの追加設定として読み込まれます。
- X-Forwarded-ProtoはELBから渡されるので、単一インスタンスに設定しているときにはELBがないので作用しません。
WPA2 KRACKs（Key Reinstallation Attacks）対策検討メモ

自宅でKRACKsの対策・周知を行いたかったので、自分用のメモとして簡素にまとめました。

## 攻撃方法
1. WiFiの暗号化キーの乱数生成器(RNG)の脆弱性を突く
2. WPA2-TKIP(RC4)にダウングレード（キーの再インストール）
3. WPA2-TKIP(RC4)の脆弱なアルゴリズムからWiFiデータの解読をする
4. WPA-TKIP、WPA-AESであれば偽造パケットを注入される
5. AndroidやLinuxの場合は容易に通信の盗聴や操作ができる

## 攻撃されない条件
- 元々の通信がTLSやSSLで暗号化されている
- 物理的に攻撃者がWiFi端末の近くでデバイスを操作しないと、攻撃できない
- 現状ではインターネットを経由してリモートから攻撃できる脆弱性ではない

## 暫定対策
### ファイルサーバ
- 「SMB3.0」で必ず接続しクライアント側で暗号化を有効にする、1.0と2.0は無効化／停止にしたい。
- nasuneやルータ内蔵のファイルサーバ製品がSMB3.0以降に対応しているか？？

### ブラウジング（Web、Http等）
- プライベートな通信（個人情報、クレジットカード情報を伴う通信）は「HTTPS」「TLS」「SSL」等、暗号化通信を積極的に使う

## 暫定対策で救えないもの
### 接続先のSSL証明書に検証不備や、HSTS無効
- HSTS（HTTP Strict Transport Security）が無効だと、HTTPSに通信が限定されない可能性がある

### 脆弱性のあるVPNアプリを利用している
- OpenVPN系はログを残している可能性があるので、信用できないかもしれない
	- 自前VPNサーバが安心、ただし、定期的にパッチを当てる障害対応など保守運用が必要

### 各アプリケーションのネットワーク通信など
- プライベートな通信が「TLS」「SSL」で暗号化通信されてない場合に影響する
	- そもそも外部に漏れてはいけない通信は暗号化してると思いたいが、ローカルLAN内のみ通信を考慮しているアプリならありえる。

## 恒久対策
### Wifiクライアント／ルータのファームウェアアップデート
- 対象は我が家ではASUS／NECのWiFiルータ、Android、iOS、Windows、各ゲーム機（PS3、PS4、PSVita、VitaTV、PSP、DS、3DS、Switch等）、テレビ、AmazonTV、AppleTV、TinkerBoardなどと思われる
	- サポートが切れたAndroid端末（2年以上前に発売？）でWPA2に対応しているもののパッチ対応は絶望的と思われる

## 各社対応状況
- Microsoftは10/10リリースのWindowsアップデートで対策済み
- Googleは「今後数週間以内に」影響を受けるデバイスの修正を約束している
- AppleはBeta版で対応済みらしい
- Linuxは修正パッチが出回っているらしい
elementaryOS Freya或いはUbuntu 14.04LTSにjava9をインストールする方法

1. ppaを追加します。(割と有名なppaかとは思いますが、信用できない場合は違う方法を探ってください。)
`$ sudo add-apt-repository ppa:webupd8team/java`


2. updateします。
`$ sudo apt update`


3. java9がインストール可能かどうか見てみましょう。
`$ apt search java9`
![Screenshot from 2017-10-17 13:24:20.png](https://qiita-image-store.s3.amazonaws.com/0/9582/cbc2d667-f8ea-7cc4-ea5a-f99f7a66b7dc.png)
ちゃんと見つかりましたね。
oracle-java9-installerをインストールしましょう。


4. いざ、インストール！
`$ sudo apt install oracle-java9-installer`
![Screenshot from 2017-10-17 13:26:14.png](https://qiita-image-store.s3.amazonaws.com/0/9582/3512fff6-603b-0a7c-3b27-261c6b12acef.png)
気長に待ちましょう。
java8が入っている場合は、インストールの途中で削除してもいいか尋ねられます。

5. めでたしめでたし
![Screenshot from 2017-10-17 13:38:04.png](https://qiita-image-store.s3.amazonaws.com/0/9582/17bc42f0-dd88-cf2a-28de-e6d75d564e81.png)
新卒エンジニアがキャリアプランを考えてみた

新卒エンジニアのfumiです。

プログラミングの勉強は好きだけど、勉強することが多く、何から勉強していいか分からないという人も多いと思います。
1つの言語が流行ったと思ったら、また新しい言語が出てきて。。。
「時間全然足りねーよ！」というのが本音だと思います。


そして、同じようにキャリアプランを考えることも難しいと思っている人も多いはず。
でも、キャリアプランに関しては、大枠で考えるのはそんなに難しいことではないんです。
これから紹介するパターンしかないので、社会人経験の浅いエンジニアでも簡単にキャリアプランを考えることはできるんです！


そこで、この記事ではエンジニアのキャリアプラン3パターンについて紹介していきます！



#1つの技術を極める
自分の得意な技術や好きな技術を深めるパターンです。
このキャリアの特徴は、自分だけのオリジナルの強みができるということです。
例えば、
・「Rubyと言えば〇〇さん！」
・「セキュリティなら△△さんに聞けばいいでしょ！」
みたいに言われるようになったら強いのかと。

個人的には、このキャリアを目指すのはモチベーションが大事だと思っています。
1つの技術を極めようと思う人は、その分野に関する技術力に多少なりとも自信があるはずです。
しかし、自分より技術力ある人は必ずどこかにいるので、
そのような人を前にしてモチベーションを保つことができるのか、難しいかもしれません。


#フルスタックエンジニアになる
サービスを作るのに必要な技術を網羅的に学んで、
自分一人でどの分野の技術も触れるというのが、このキャリアの特徴です。

このキャリアのいいところは、自分一人でサービスを作れるところでしょう。
自分一人で作れるので、自分が企画したサービスを開発することができます。
事業企画・開発をやりたい人は、このキャリアを目指すのがベストだと思います。

逆に、中途半端に満遍なくスキルを身につけると、何ができるかわからない人になってしまう可能性大です。
仕事で使えるレベルまでスキルを上げておくのが、最低限必要ではないかと。

僕は、今のところこのキャリアを進もうかなと思っています。
1つのことを突き詰めるよりも、たくさんのことをある程度出来たほうが楽しいと思う性格なので。
でも、まだ確定ではないですね。
今後働いていく中で、全然変わる可能性はあります。


#マネジメント層に行く
何人も部下を持って、プロジェクトやプロダクトのマネジメントをするキャリアです。
プログラミングスキルだけでなく、マネジメントスキルやディレクター的な考え方を身につけられるのが、
このキャリアの特徴だと思います。

このキャリアに進むと、エンジニア以外の職種もできるようになると思います。
例えば、ディレクターやプロジェクトマネージャーなどです。
エンジニアスキルを基盤としつつ、他の職種にジョブチェンジしたいと思っている人はこのキャリアがいいかもしれませんね。

一方で、一般的にエンジニアは総合職に比べて対人関係能力が低いと思うので、
多くの人にとっては難しいキャリアかもしれません。
本当に人によるので、全然断言はできませんが。


#常にキャリアプランを見直す必要あり
キャリアプランの3パターンについて紹介しました。
仮説でいいので、今の自分はこのキャリアを歩みたいと決めるのがいいと思います。
いきあたりばったりで仕事をする人と、仮説のキャリアプランがある人では学習効率に差が出ますよね。

そして、半年に1回など定期的に自分のキャリアプランを見直していけば、
理想のキャリアプランが明確になるはずです。

この記事が新卒エンジニアの方たちの参考になると嬉しいです。
コメントもあると嬉しいな！！
Codeigniterでサブディレクトリに配置したコントローラを直下に置いたかのようにルーティングする

Codeigniterのコントローラはサブディレクトリを作ることで、対応するURLも階層が一つ下がります。
大規模なサイトを作成している場合、この機能を使って管理画面側はmanagementディレクトリに、表のサイト部分はcontrollersディレクトリ直下に、みたいなURLルーティングをしているケースも多いでしょう。

しかし、

+ 階層レベルが揃っていないと気持ち悪い
+ 直下に置いてあるコントローラの別バージョンをサブディレクトリに収めておき、場合によってはそちらを直下のコントローラとして振舞わせたい

なんて理由でサブディレクトリを`https://○○○.com/コントローラ名/メソッド名/パラメータ`といったURLでアクセスできるメインディレクトリにしたい場合があるかもしれません。

じゃあどうしましょ？

#コントローラごとにURIルーティングを設定するのは保守性がよろしくない

frontという名前のディレクトリがapplication/controllers下にあって、それをメインディレクトリとする場合を考えてみましょう。

[URI ルーティング &mdash; CodeIgniter 3.2.0-dev ドキュメント](http://codeigniter.jp/user_guide/3/general/routing.html#id1 "独自のルーティングルールを設定する")

この公式ドキュメントに記載されている方法を使えばワイルドカードおよび正規表現でURLの再マッピングが可能です。

ただ、この機能を使用してサブディレクトリにあるコントローラをマッピングするには、

```routes.php
//"controllers/front/"にHoge.php, Fuga.php, Piyo.phpというあるコントローラがあるとする
//これらを"controllers/"にあるかのようにマッピングする

$route['hoge(.*)'] = 'front/hoge$1';
$route['fuga(.*)'] = 'front/fuga$1';
$route['piyo(.*)'] = 'front/piyo$1';
```

のように、コントローラごとに規則を追加する必要があります。
後でコントローラの追加や削除があった場合にいちいち`routes.php`を編集するのは効率が悪いし、別の開発者が_「なんかよくわからんけど、frontディレクトリにぶち込んでおけばOKじゃないの??????」_となる可能性が高いでしょう。

この部分を自動化する必要がありそうです。
ここはPHPさんにひと肌脱いでもらいましょう。

#PHPにサブディレクトリ内を調べてもらい、動的にルーティング規則を作成
`routes.php`に以下を追記。

```routes.php
//controllers直下として振舞わせるサブディレクトリ名
$main_directory = 'front';

//サブディレクトリにある.php拡張子が付いたファイルを探してマッピング
$paths = scandir(APPPATH.'controllers/'.$main_directory);
foreach ($paths as $path)
{
  $info = pathinfo($path);
  if ($info['extension'] === 'php')
  {
    $name = lcfirst($info['filename']);
    $route[$name.'(.*)'] = $main_directory.'/'.$name.'$1';
  }
}
```

こうすれば指定したサブディレクトリに放り込んだphpファイルの名前が自動的にマッピングされ、いちいち`routes.php`を編集する必要がなくなります。あら楽ちん。
【SpringData Jpa の導入方法】


①pom.xmlにタグを追加する。

	<!-- SpringBootでDataJpaを使用できる様にする設定 -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>



②Entityクラスを作る。

[must]@Entityをつける.これによって、Entityクラスである事を示す
[must]@Tableをつける.nameはDBのテーブルの名前.
　　　 省略した場合は、クラス名を大文字にした名前のテーブルにMappingされる
[must]PRIMARY KEY の付いているカラムに@Idを付ける.@Idが無いと機能しない.
	  無い場合はDBにPRIMARY KEYを付けるか、
	  @GeneratedValue(strategy = GenerationType.IDENTITY) を付ける。これを付ければ、PRIMARY KEYを生成できる。
      DBが複合キーとなっている場合は、@javax.persistence.EmbeddedIdを使用する

[must]@Columnを付け、Mappingさせるカラム名を指定する.
　　　 省略した場合はプロパティ名を大文字にした名前のカラムへMappingされる.


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

//Entityクラス = DBのtable
@Entity
@Table(name = "player")
public class Player {


	@Id
	@Column(name = "id")
	private Integer id;
	@Column(name = "name")
	private String name;
	@Column(name = "nationality")
	private String nationality;

//以下Getter Setter



③リポジトリを作成する.
  いつものクラスでなく、インターフェースで作る.


[must]クラス名の後に、以下を追記する.
				
					⬇		︎
		extends JpaRepository<Player, Integer>



import org.springframework.data.jpa.repository.JpaRepository;
import jp.co.rakus.football.entity.Player;

//JpaRepositoryを継承する事で、fineOne、findAll、save、deleteの4メソッドが使用
//ジェネリックスはエンティティのクラス名と、主キーの型を指定する.
public interface PlayerRepository_DataJpa extends JpaRepository<Player, Integer> {

}



④準備できたので、後はサービスやコントローラーで使用する

@Service
@EnableTransactionManagement
public class PlayerService {

	@Autowired
	PlayerRepository_DataJpa playerRepository_DataJpa;
		
	public List<Player> findAll() {
		return playerRepository_DataJpa.findAll();
	}

	public void saveUserInfo(User user) {
		userRepositoryDataJpa.save(user);
	}

}
jQuery.each()とブレイクと返り値

jQueryを使いこなせるようになりたい途上。

連想配列ループ内で条件に合致したものを返り値として返そうとしたらハマったお話です。

### ダメな例

```js
function hogehoge(arr){
    $.each(arr, function(i, val){
        if (val.hoge1 == HOGE_HOGE) {
            return val.hoge2; //返したいつもり
        }
    });
}
```
`return`で返したつもりでしたが、これが呼び出し元で受け取ると`undefined`になっているという。

### 大丈夫な例

```js
function hogehoge(arr){
    var res = '';
    $.each(arr, function(i, val){
        if (val.hoge1 == HOGE_HOGE) {
            res = val.hoge2;
            return false; //ループブレイク
        }
    });
    return res; //返り値
}
```
`$.each()`内の`return`はループのブレイクなんですね。
この後、ループの外の処理が実行されるので、ダメな例では返り値未定義になっていたというわけでした。

他の言語の感覚のままではいけませんね。。。

### 参考
[JavaScript中級編 - return文の使い方](http://wp-p.info/tpl_rep.php?cat=js-intermediate&fl=r7)
[jQuery .each()のループはbreakじゃ抜けれない](https://qiita.com/ss_watanabe/items/65105641b5e0a4fe0544)
[JavaScript Array.forEachとjQuery.eachの違い](https://qiita.com/PianoScoreJP/items/07491c4c8a4714679f32)
[問題解決記録]bladeテンプレートと画面崩れ

##機能要件：


###画面遷移：
「いいね」ボタんを押すと、ボタン自体は「いいねを取り消す」になる。
逆に、「いいねを取り消す」ボタンを押すと、「いいね」ボタンになる。
###業務ロジックから分析すると：
ログイン中のユーザーがこの「いいね」ボタンを押した記録があれば、「いいねを取り消すボタン」が表示される。
逆に、ログイン中のユーザーがこの「いいね」ボタンを押した記録がなければ、「いいね」ボタンが表示される。


元のコードは以下です。

```php
<div>
@if($post->zan(\Illuminate\Support\Facades\Auth::id())->exists())
<a href="/posts/{{$post->id}}/unzan" type="button" class="btn btn-default btn-lg">いいねを取り消す</a>
 </div>
@else
<div>
<a href="/posts/{{$post->id}}/zan" type="button" class="btn btn-primary btn-lg">いいね</a>
</div>
@endif
```

問題：「いいね」のボタンが画面に表示されるとき、画面崩れが発生します。

解決経緯：テンプレートのcssに問題があるかと辿った結果、post全体を格納するdivブロックが変化したと判明、


「いいね」のボタンが画面に表示されると、実際のドキュメント構造は：

```html
<div>
  <div>
    <div></div>
</div>
```

以下のように、＠ifの一文をdivブロックの前に置くと解決できます。


```php
@if($post->zan(\Illuminate\Support\Facades\Auth::id())->exists())
<div>
<a href="/posts/{{$post->id}}/unzan" type="button" class="btn btn-default btn-lg">いいねを取り消す</a>
</div>
@else
<div>
<a href="/posts/{{$post->id}}/zan" type="button" class="btn btn-primary btn-lg">いいね</a>
</div>
@endif
```
VimでCoffeeScriptのコンパイル結果を確認する

備忘録です。
Vim上でCoffeeScriptで書かれたコードのコンパイル結果を手っ取り早く確認する方法

```Vim
:w !coffee -bcs
```

# 概要

## CoffeeScriptのコマンドを確認

CoffeeScriptのREPLをNode.jsでインストールする。

```Bash
$ npm -v
5.3.0

$ npm install -g coffeescript

$ coffee -v
CoffeeScript version 2.0.0
```

[Coffee コマンド - sappari wiki](http://memo.sappari.org/coffeescript/coffee-command)

> |オプション|説明|
|:---|:---|
|-c, --compile| .coffee を .js にコンパイル|
|-s, --stdio|標準入力からcoffeeスクリプトを読んで、標準出力にJavaScriptを渡す。| 
|-b, --bare|トップレベル関数safety wrapper無しでコンパイル。|

ざっと必要そうなものを取り出した。
結果は後述の実験を参照。

## Vimのファイル出力の仕様

`:help :w`

> `:[range]w[rite] [++opt] !{cmd}`

> Execute {cmd} with [range] lines as standard input
(note the space in front of the '!').  {cmd} is
executed like with ":!{cmd}", any '!' is replaced with
the previous command |:!|.

以下雑な意訳

Vimは`:w !{cmd}`と入力すると、
任意のコマンドの標準入力に現在開いているファイルの文字列を投げ込んで実行できる。

また、頭に`[range]`という文字列があることから、
ビジュアルモードで選択した状態で`:w !{cmd}`と入力すると、
選択状態を示す`:'<,'>w !{cmd}`に自動保管され、選択部分を標準入力に渡すことも可能。

# 実験

以下のコードで実験を行う。

```coffeescript
emit = (type, {msg}) ->
  unless type is "verbose" then return
  console.log "done"
  expect(msg).to.equal "not found ticket"
```

標準入力から実行したいので、まずは`-s`オプションのみをつけて実行。

```vim
:'<,'>w !coffee -s

```

何も表示されず……

他のコードで試したところ、`ReferenceError: hoge is not defined`等のエラーが表示された。
どうやら`-s`オプションのみ利用した場合はJavaScriptに変換後、評価を行っているようだ。

実行結果が見たいだけなら`-s`オプションのみで解決だが、
今回確認したいのはコンパイルされたJavaScriptなのでコンパイルを明示する`-c`オプションを併用して実験を継続。

```vim
:'<,'>w !coffee -sc
// Generated by CoffeeScript 2.0.0
(function() {
  var emit;

  emit = function(type, {msg}) {
    if (type !== "verbose") {
      return;
    }
    console.log("done");
    return expect(msg).to.equal("not found ticket");
  };

}).call(this);
```

見事コンパイルに成功し、JavaScriptのコードが表示された。
ただし、`(function() {}).call(this);`が足されて読みづらいので、もっと読みやすくしたい。
そこで、更に`-b`オプションを含めて実行する。

```vim
:'<,'>w !coffee -bcs
// Generated by CoffeeScript 2.0.0
var emit;

emit = function(type, {msg}) {
  if (type !== "verbose") {
    return;
  }
  console.log("done");
  return expect(msg).to.equal("not found ticket");
};
```

コードが簡素になり読みやすくなった。
従ってVimで一部の箇所のコンパイル結果を確認したい場合は、
ビジュアルモードで選択して`:w !coffee -bcs`とタイプすれば良い。
【JavaScript】フォーカスアウト時、指定時間経過時の入力項目チェックで処理の制限をしたい

### 【質問したいこと】
フォーカスが外れた際と指定時間経過した後に入力項目におけるチェック処理を実装しましたが、JavaScriptにexitなる関数、処理がないためどちらも呼ばれてしまいalertで表示しているエラーメッセージが2度表示されてしまう。

### 【実現したいこと】
alertで出すのは1度にしたい。
フォーカスが外れたときには毎回チェックを実施したい。
指定時間経過時にもチェックを行いたい。

###【実装した内容、考えていること】
```JavaScript:main.js
function isTimecheck() {
   setTimeout("onAutoSave()", 指定時間);
}

function onAutoSave() {
    var result = true;
    var a = 入力項目.value; //入力項目の入力値を取得する。
    var maxLen = 20; //最大文字数：例で20とする。
    if (a != '') {
        result = WordCountCheck(a, maxlen);
        if (result == false) {
            alert(エラーメッセージ);
            入力項目.focus(); //フォーカスを入力項目に戻す。
            return false;
        }
    }
}
window.onload = function(){
    isTimeCheck();
}
```
```JavaScript:check.js
function WordCountCheck(str, maxLength) {
    var i = 0; 
    var len = 0; //バイト数を格納する。
    str.value = rightTrim(str.value);//不要な右側スペースは削除する。
    var val = str.value;
    if(val !=""){
        for(; i<val.length; i++) {
            半角なら1バイトなので1をlenに加算。
            全角なら2バイトなので2をlenに加算。
        }
        if(maxLength < len){
            alert(エラーメッセージ);
            str.focus(); //フォーカスを入力項目に戻す。
            return false;
        }
    }
}
```
```html:Test.html
<TD>
    <textarea cols="" rows="" name="" style="" onBlur="WordCountCheck(this, 20);">入力項目</textarea>
</TD>
```

このHTML部分を

```html
<TD>
    <textarea cols="" rows="" name="" style="" onChange="WordCountCheck(this, 20);">入力項目</textarea>
</TD>
```
このようにした場合、onBlurのときと同じデータで試した際に1度のみポップアップが出ていたのですがこれだと値が変わってエラーメッセージが出た後に変更しないでフォーカスアウトした場合などにチェックできないので不満足になってしまいます。

また、チェック処理は別のjsファイルに記載しています。

対応として、以下は実現可能なのかということで今悩んでいます。
①チェックはonBlurのみとし、エラーがあった場合はonAutoSaveの最初で処理を抜けるようにする。
②指定時間経過時には、onBlurの処理が呼ばれないようにする。
③onBlurまたはonAutoSaveで先に呼ばれたほうでチェックエラーとなった場合、その時点で処理を抜ける(exitなる処理が実現できればこれは可能かと思うのですが･･･)

そもそも、この実装の場合onBlurとonAutoSaveは指定時間経過後にはどちらが先に実行されるのでしょうか？
### 【試してみたこと】

onBlur部分を以下のよう(見やすくするためJSに記載しています。)にしてみたところ、当然ロストフォーカス時にはチェックがかからず、指定時間経過時もチェックはかからない。onAutoSaveが先に呼ばれていたようなので、そこでチェックエラーとなった場合はonBlurの処理を行わないようにグローバル変数のcheckFlgをtrueにするようにしてみました。しかし、alertが2回出てしまいます。

```js
onBlur="isLostFocusCheck(this);"
```
```JavaScript
var checkFlg=false;
function isLostFocusCheck(str) {
    if(checkFlg==false) { //自動保存でチェックエラーとなっていた場合はcheckFlgがtrueとなっているためこのifはスルーされるはず。
        WordCountCheck(str, 20);
    }
}
```
Crontab で source ~/.bashrc や bash -l を使うと死を招く

大げさな表現を使いましたが、以下のように crontab で `bash -l` や `source ~/.bashrc` を使うのはアンチパターンだと思います。

```
# BAD
0 8 * * * /bin/bash -l -c 'my_daily_batch.sh'

# BAD
0 18 * * * source ~/.bashrc && 'my_evening_batch.sh'
```

# なぜ `~/.bashrc` を読み込みたいのか

周知の通り Cron はコマンドを `~/.bashrc` を読み込んでいない環境で実行するのですが、これは初心者泣かせでもあります：

> 「コマンドラインだと成功するのに、cronだとエラーになるんです！どうしたらいいですか！？」

そして、ググって最初に見つけるのが `source ~/.bashrc`や `bash -l` を使う方法です。まぁ、それでうまく動くかもしれません。当面の間は・・・。

# `~/.bashrc` を読み込むと何が困るのか

`~/.bashrc` に手を加える時の影響範囲が大きくなるからです。

ログイン時のシェルなどでも使うものなので「Ruby 2.4 を使うよう`$PATH`を変えよう」などと変更するのはよくあることです。

しかし、それが Cron のジョブを失敗させてしまうかもしれません。悪いことに、`~/.bashrc` を見ただけでは、それが crontab から読み込まれているのが分かりません。

# 代替案

cron 用に別の設定ファイルを用意しましょう。ジョブごとに別々に設定ファイルを作るとベター。

```
# GOOD
0 8 * * *  source ~/cronjobs/env/my_daily_batch.env.sh   && my_daily_batch.sh
0 18 * * * source ~/cronjobs/env/my_evening_batch.env.sh && my_evening_batch.sh
```

これで、`~/.bashrc` を気兼ねなく書き換えられるようになります。
CentOS 7でNTFSフォーマットのディスクをマウント

## CentOS 7でNTFSフォーマットのディスクをread-onlyでマウントする。
```lang:Bash
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 
$ sudo fdisk -l 2> /dev/null | grep sdc1
/dev/sdc1              63   976768127   488384032+   7  HPFS/NTFS/exFAT
$ sudo mount -t auto /dev/sdc1 /mnt/usb3
mount: unknown filesystem type 'ntfs'
$ sudo yum -y install ntfs-3g
$ sudo mount -r -t auto /dev/sdc1 /mnt/usb3
$ df -h
$ ls -l /mnt/usb3/
```
[javascript]image上にmouseoverで文字をかぶせる

# image上にmouseoverで文字をかぶせる

## 仕様

- imgタグのaltをimgタグにmouseoverしたとき表示する
- figure,figcaptionを利用
- 面倒がおおいのでjQueryを利用
- 画像サンプルはplacehold.jpを利用

## ソース

### HTML

```HTML:test_4.html
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript" src="test_4.js"></script>
<title>test_4:image上にmouseoverで文字をかぶせる</title>
</head>
<body>
<div class="myimage">
<img src="https://placehold.jp/ff0000/00ffff/150x150.png?text=1" class="alt_text" alt="あああ">
<img src="https://placehold.jp/00ff00/ff00ff/300x200.png?text=2" class="alt_text" alt="いいい">
<img src="https://placehold.jp/0000ff/ffff00/100x80.png?text=3" class="alt_text" alt="ううう">
</div>
</body>
</html>
```

### javascript

```javascript:test_4.js
$(function () {
  $('.myimage img').on({
    'mouseover':function () {
      var w=$(this).width();
      $(this).filter(function(){
        return $(this).closest('figure').length==0;
      }).wrap(
        $('<figure>').css({
          "display":"inline-block",
          "position":"relative",
          "margin":"0px"
        })
        );
      $(this).filter(function(){
        return $(this).next('figcaption').length==0;
      }).after(
        $('<figcaption>').css({
          "font-size":"0.7em",
          "position":"absolute",
          "bottom":"20px",
          "left":"0px",
          "color":"#ffffff",
          "background":"rgba(0,0,0,0.6)",
          "width":"100%",
          "max-width":w+"px",
          "padding":"1em 0px",
          "text-align":"center"
          }).text($(this).attr('alt'))
        );
    },
    'mouseout':function () {
      $(this).next('figcaption').remove();
      $(this).unwrap();
    },
  });
});
```
Ubuntu GNOME で環境構築

MacからLinuxに移行しました。
Macbook 12" 2016 -> Thinkpad T470S です。
メモリが8GBから24GBに増えてウハウハです。

WindowsとのデュアルブートでUbuntu GNOME 17.04を入れてます。
だいぶ落ち着いたので記憶が新しいうちにメモ。

## 移行内容


| カテゴリ | Macで使ってたやつ | Ubuntuで使ってるやつ | 感想 |
| ----- | ----- | ----- | ----- |
| IDE | Intellij Idea | Intellij Idea | 最高 |
| ターミナル | iTerm2 | Terminator | なんの違和感もない。完璧 |
| DBビューワ | Sequel | Intellij Idea の databaseツール | ちょっとTOO MUCH気味だけど補完が素晴らしい |
| テキストエディタ | SublimeText | Atom | 良くも悪くもない |
| ブラウザ | Chrome | Chrome | Chromeが普通につかえて幸せ |
| SFTP | Forklift | Dragon disk | 必要十分 |
| スクリーンショット | Monosnap | Shutter | Monosnapのほうが良いけどLinux無いんだよね |

## キーマップ

```~/.Xmodmap
keycode 108 = Home
keycode 105 = End
keycode 112 = Home
keycode 117 = End
keycode 107 = Super_L Sys_Req Super_L Sys_Req

pointer = 1 10 3 4 5 6 7 8 9 2
```

* 右側のAlt/CtrlはHome/Endにリマップ
* PageUp/PageDownはHome/Endにリマップ
* PrintScreenをWindowsキー（Super）にリマップ
* 中ボタンクリックを無効化（何かPasteモードを解除できなかったので）
* Tweak Tool経由での設定
    * WindowsキーはCtrlにリマップ
    * CapsLockはCtrlにリマップ


## Gnome Extension

* Alternatetab
* Mmod Panel
* Topicon Plus
C++ Builder > CSIDL_BITBUCKETでごみ箱のパスを取得できない (文字化け) | ごみ箱: special group of objects

```txt:動作環境
C++ Builder XE4
```

[CSIDL @ MSDN](https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb762494(v=vs.85).aspx)

```Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::B_checkRecycleBinClick(TObject *Sender)
{
	//LPTSTR getPath[255];
	wchar_t appdata[255];
	SHGetSpecialFolderPath(NULL, appdata, CSIDL_APPDATA, false);
	OutputDebugString(appdata);

	wchar_t recycle[255];
	SHGetSpecialFolderPath(NULL, recycle, CSIDL_BITBUCKET, false);
	OutputDebugString(recycle);
}
//---------------------------------------------------------------------------
```


```
デバッグ出力: C:\Users\XXX\AppData\Roaming プロセス Project1.exe (1852)
デバッグ出力: [化けた文字] プロセス Project1.exe (1852)
```

質問中: https://stackoverflow.com/questions/46781659/getting-recycle-bin-folder-with-csidl-bitbucket-resulting-in-garbled-strings

(追記 2017/10/18)
ゴミ箱のPItemIDListは取得できるが、実際のパスは取得できない、というようなコメントが付いた。自分が検索して読んだ情報でも似たような情報で、実際に試した結果もそのようであった。

### ごみ箱: special group of objects

http://computer-programming-forum.com/82-mfc/eb60eae5f2e5ac99.htm
の
Mark Henr #8/9
あたりを見ていると、ごみ箱は特殊なグループに属するようだ。
それを読むには色々しないといけないようだ。

### 固定文字列実装

```Unit3.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
	String recycleBin = L"C:\\$Recycle.Bin";

	ShellExecute(NULL, NULL, L"explorer.exe", recycleBin.c_str(), NULL, SW_SHOWNORMAL);
}
//--
```

上記の実装で以下の環境でゴミ箱が開いた。

- Windows 7 pro (32bit)
- Windows 8.1 pro (64bit)
- Windows 10 pro (64bit)

固定文字列だと将来のOSに対応できない可能性がある。
リザーブドインスタンスが購入できなかった時の話

# 概要
利用したことなかったけど、試しにリザーブドインスタンスを購入してみよう…！と、カートに入れて購入に進んだところ、以下のエラーメッセージが表示されました。

> エラー : Your current quota does not allow you to purchase the required number of reserved instances (Service: AmazonEC2; Status Code: 400; Error Code: ReservedInstancesLimitExceeded; Request ID: ***********)

![リザーブドインスタンスが購入できなかった時の画像.png](https://qiita-image-store.s3.amazonaws.com/0/128331/101537bb-6579-d568-552d-79db353b65fc.png)

# 結論だけ、書く。 

サポートの方から訊いたのですが、あまりAWSの利用実績がないアカウントだと、支払い方法が「 **前払いなし** (No Upfront)」の状態ではリザーブドインスタンスの購入が出来ないようになっているそうです。
支払い方法を「 **一部前払い** (Partial Upfront)」か「 **全額前払い** (All Upfront)」に変えた上で購入してね、とのことでした。

納得。
思い切って「 **全額前払い** 」でリザーブドインスタンス購入。チャリーン。

# 補足
なお、EC2 リザーブドインスタンス購入上限は、「アベイラビリティーゾーンごと、1 か月あたり 20 のリザーブドインスタンスと、20 のリージョンリザーブドインスタンス。」だそうで、ひと月の中でこの数を超えて購入したい場合は、サポートに購入上限の緩和リクエストが必要となります。

参考：[AWS サービス制限 - アマゾン ウェブ サービス](http://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_ec2)
見た目が似ているものの処理を共通化するときは気をつけましょうというお話


- どこで呼びたしたのか？を引数に渡すと大体カオスになるよ
- 見た目が一緒でも別物として処理する方がいいことがあるよ
というお話です

## 前提

自分がコードチェックしていて以下のような処理に何度か出くわした
下記のコードの特徴

- `Modal.show(self.class)` で共通的にモーダルを呼び出せる
- モーダルででてくる文言や、モーダルにあるボタンでおこなえることはそれぞれ違う

```
class A
  Modal.show(self.class)
end

class B
  Modal.show(self.class)
end

class Modal
  def self.show(caller)
    setTitle(caller)
    setYesAction(caller)
    # ...つづく
  end
  
  def setTitle(caller)
    if caller == "A"
      # A用のタイトルセット
    elsif c == "B"
       # B用のタイトルセット
    end
  end
  
  def setYesAction(caller)
    if caller == "A"
      # A用のyesActionSet
    elsif c == "B"
       # B用のyesActionSet
       
       BYesCallBack
    end
  end
  
  def BYesCallBack
    # Bだけに適用されるしょり
  end
end
```

## これってFacadeパターン？

上記コードは、なんとなくFacadeパターンっぽいが、Facadeは渡す値は複雑（いろんなタイプの物が入る）だが、やることが明確（返り値が同じ）なケースが適切

### 例1) 業務アプリなどで、一つの処理が複数の処理の連続になっているケース（本を借りる）

lendBook(book) としたら 本を借りる, 自分の履歴がつく、図書館の在庫がへるなどの一連の処理が行われるとか。
それが本の性質（貴重文庫なのか？とか）によって処理が減ったり増えたりするケースなど

### 例2）検索アプリで、パラメーター渡したら検索してくれる
search(params)ってやると、とりあえず検索してくれる。paramsの中身によってtag, categoryなどのid検索の場合もあるし、フリーテキストだと検索エンジンに飛ばされる。
けど、どんな処理をしてるかに関わらず返ってくるのはbook_idの配列

## イケてない理由
- どこで呼び出したのかを引数にすると、結局Aからよんだ場合何がでてくるのか？がすごくわかりにくい
- Interfaceを揃えて引数によって挙動を分けているが、返ってくるものの見た目は似ているが、結局ものは違うためその後の処理もそれぞれ違っていて、メリットを享受できてない

## じゃあどうすればいいのか？
`AModal`, `BModal` それぞれのクラスを作ればいいと思います
で、見た目を共通化させたいなら、webならcss&classを共通化すればいいし、iOS・Androidならカスタムビューをつくるなり、AlertViewなどを使えばよいのではないかと。
AlertViewを共通化しようとすると上記のようなコードが出来上がります。

## 最後に
賛否両論あるかと思いますが、自分はこう思うよということを書かせていただきました。
ご指摘いただければ幸いです。
Python スクリプトの親ディレクトリをパスに追加する

Python で「親ディレクトリは読み込めません」なんて怒られるときはたいていは import の仕方が間違っている場合なので、だいたいは以下のエントリを読み直すと解決する。

[importの躓きどころ - Qiita](https://qiita.com/ysk24ok/items/2711295d83218c699276)

しかしどうしても親ディレクトリにパスを通したいときがあって、そういうときのためのメモ。

``` python
import sys, os

pardir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(pardir)
```

ちなみに `sys.path.append(os.pardir)` という方法もあるが、 `os.pardir` は `".."` というただの文字列なので "スクリプトを実行したディレクトリの" 親ディレクトリを追加してしまう。

## [追記] PYTHONPATH を指定する方法
リポジトリのルートをパスに追加したいだけなら環境変数 `PYTHONPATH` を指定するだけでよかった。

https://docs.python.jp/3/using/cmdline.html#envvar-PYTHONPATH
docker-api gemで、`.NetworkSettings.Networks`が取れない問題

# [docker-api gem](https://github.com/swipely/docker-api)で、`.NetworkSettings.Networks`が取れない問題

## 概要
このissue見ていただけると大体解決: https://github.com/swipely/docker-api/issues/466

`docker inspect`コマンドでとれる情報がなぜかgemを使うと取得できない問題です。

## 解決方法

```ruby
::Docker::API_VERSION = '1.21'
```

をdockerのAPIを叩く前に置くだけです。

## 解説

原因は単純にgemで対象とするAPIバージョンが古いのが原因です。
わかりづらくしてた原因は、全コンテナの情報を取ると `.NetworkSettings.Networks` はとれてることですかね。

どうやら、docker APIの仕様かバグかで、新しいdocker engineを使うと`/v1.16/containers/json`でも、APIのバージョン的に存在しないはずの情報が返ってるみたいです。
コンテナ情報で `.NetworkSettings.Networks` が追加されたのが [*1.21*](https://docs.docker.com/engine/api/v1.21/) みたいなので、定数で指定されているバージョンを上書きします。

公式でドキュメントが提供されてるAPIが[1.18](https://docs.docker.com/engine/api/v1.18/)までなのでgemで使ってるAPIのバージョンが古すぎる気がします。
合意取ったりとかがめんどくさいので、プルリク投げたい方はどうぞ。

以下のコードで確認できるかと思います:
```bash
 ruby -rdocker -e "Docker::API_VERSION = '1.21'; p Docker::Container.get('${DOCKER_CONTAINER_ID}').info['NetworkSettings']['Networks']"
```
Elastic BeanStalkの環境別のタグ付を忘れたときにどうすんの？って話


1年ぐらい前からBeanStalk使ってます。
なんつうのか、この辺のAWSのマネージドサービスっていうの？ってほんとすごいですよね。
インフラエンジニアなんか必要なくなりますよね。
AWSの機能をガリガリ使って一昔前の3-tier systemなんて、ネットワークの知識もインフラ系のIeasの知識もなくアプリ屋さんがポチポチやってればいつでも復元できるシステム！が出来上がっちゃうんですもんね。
しかもはやりのECSつかったDockerコンテナの仕組みもつかって・・・
「あ〜〜Dockerとか最近ちゃってもう最近開発とか楽でさ〜〜、インフラ屋？いるの？仕事おせえよあいつら」とかほざけるわけです。

俺なんか無職まっしぐらです。

##Beanstalkってなんぞや？
さて、まぁ今更ですがBeanStalkってなんぞやって人に簡単に説明しておきますと、
要は初見殺しとも言えるAWSの「CloudFomartion」を”比較的”わかりやすいUIで設定できるというマネージメントシステムです。
基本はネットワーク層＋3tier＋インスタンススケーリング何かをある程度コントロールしてくれます
更にアプリケーションのデプロイはソースをまとめておくとECR上にコンテナイメージとして作成してくれたり、そこまで必要ない人でもPHP用のAMIを使ってちょっとPHPで動作させたいコンテンツを作ってデプロイしてみたいな事ができます。
この辺、コンソールでポチポチやってると、たしかに時間的にそれなりのリソースを取られますしで開発したアプリケーションのバージョン管理もソレナリにしてくれるので何度も言いますがとても便利なサービスだと思っています。

## BeanStalkのアレなところ
こんなに便利そうなBeanStalkなんですが、サーバサイド（アプリケーション開発者）にはなり針を振り気味なサービスなので、少しでも込み入ったことを始めるととたんに出来ないことが出てきます。
そこで、「.ebextentions」というファイルを作ってアプリ層のレポジトリに拡張設定をおいて設定を入れたりする訳です。
まぁ、デフォルトで設定されるCloudFormationの設定項目をアプリ層に置くようにするわけで、インフラ屋のいない会社なんかだと違和感ないというかとても理にかなっているようにみえるんですが、タスクをサーバサイド・インフラサイドと別けているチームなんかだと

__インフラ屋がアプリ屋に土下座をしてネットワーク設定なんかを開発アプリレポジトリに入れてもらう__

なんていう状態が発生してしまい、なんとなく自分の存在意義を感じられなくなってきたりもします。

そこで、インフラ屋さんは「EBとかつかってらんねぇよ、せめてCloudFormationでやろうぜ・・・（JSON書きたくないけど）」とか言い始めるわけです。

あ、個人的にはterraformに逃げましたｗ

## 本題の環境ごとのタグの調べ方について
なんか、閑話休題のボリュームがいつもまとまらず多めになってしまう訳ですが
本当に書きたかったEBで作った環境に対してのタグの後付とかに関してです。

EBで環境を作るとEBにおけるタグを設定しておけば、そのアプリケーションで起動したEC2インスタンスなどには一応Nameタグがついてくれてどの環境かわかりやすくなるのですが、SecurityGroup・ELB/ALBなどには最初にタグを付け忘れたりすると、どの環境で使っているSG・LBなのかを探すのが非常に困難になります。

具体的には例えばSecurityGroupなんかだと下記のようなタグが付くことになります
- awseb-a-3xxxxx2xxxx-stack-AWSEBSecurityGroup-HOGEFUGE1HOGE

まぁ訳わんないですよね。SGに関してはまだNameのタグを設定しておけば自分で任意に環境名をつけられますが
ELBとかだとName=「ユニークな文字列：DNS名」になっているのでAWSのコンソールやawscliコマンドの返り値だけでは一見どの環境用セット用の機材なのかが全くわからない状態になってしまっています。

また、タグ自体も起動段階で設定していないと、環境をすべてEB的に再構築しない限り（つまり環境内のすべてを捨ててもう一度構築し直す処理）を入れないと追加したNameタグなどは設定されない状況に陥ります。

これをあとでチクチクと手作業で入れることになるんですが、
- awseb-a-3xxxxx2xxxx-stack-AWSEBSecurityGroup-HOGEFUGE1HOGE

この文字列はEBの中身を見ているだけだと判別がつかない物なのです。
なぜか
**この文字列自体がCloudformationで作られている物だからですwww。**
なのでこのELBがどのEBアプリケーションで使われているのか？というのを調べるためには

* まず、上記の文字列のうち、「awseb-a-3xxxxx2xxxx-stack」までの部分を抜き出し
* CloudFormationのスタック一覧のFilterをその文字列に入れ
* 説明欄にちゃんと記載されている「AWS Elastic Beanstalk environment (Name: 'hogefuge-app')」を確認するという作業が必要になります。

まぁ調べる方法がある分マシですがね・・・この辺もうデフォルトでNameダグとしてすべての環境に入れてしまってもいいと思うんですけどね

以上、ちょっとしたボヤキでした。
ちなみに、サーバサイドの方の「構築の手間が楽になるからEB使うことを強く推したい」という要望であるプロジェクトでEB使いましたがもう本サービス運用では二度と使いたくありません・・・・
powershell備忘録

#個人用備忘録

#リモートサーバーでmsuファイルをインストール
invoke-commandとかps-remotingでサーバーにmsuをインストールしようとするとうまく行かなかったのでその対処法

普通ならば

```
wusa $X:\XXX\XXXXX.msu /quit
```

ですが、、、

```
wusa $X:\XXX\XXXXX.msu /extract:D:\XXXX
dism /online /add-package /PackagePath:D:\wfm51\XXXXXX.cab /Quiet
```

これでいけました

##Path型とString型を + でつなごうとすると出るエラー

```
 [System.Management.Automation.PathInfo] に 'op_Addition' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
発生場所 行:1 文字:1
```

とりあえずString型同士で結合することで回避


##ホスト名から連番部分を取り出す

クラウド上の仮想マシンを複数台立てた際に連番でサーバー名を命名しましたが、カスタムドメインをそれぞれに振ったときにも同じく連番を振っているのですが、サーバー内部で自分のカスタムドメインが必要なときに自分のサーバー名からカスタムドメイン名を取得する際に使用したスクリプト

```
#PC名取得
$MyHostName = [Net.Dns]::GetHostName()
#共通ホスト名部分だけを端折り数字だけを取り出す
$StringHostNumber = $MyHostName.Replace($HostNameChar, '') 
#Intに型変換して頭の00を取る※物によって頭の0の数違うので
$IntHostNumber = [int]$StringHostNumber
#最後に必要な桁数(001とか01とか)に置換する
```

## HashTableの使い方
これから使いそうなのでメモ

```
function Show-HasnTableValue
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [HashTable] $TableValue
    )
    
    foreach($KeyVal in $TableValue.Keys ) 
    {
        $outputVal = $KeyVal + ":" + $TableValue[$KeyVal]
        Write-Output $outputVal
    }
    
}

$sampleHashTable = @{
"a"="1";
"b"="2";
"c"="3";
}
Show-HasnTableValue -TableValue $sampleHashTable

```

##Azureサービスプリンシパルでの認証

```
    $clientId = "x-x-x-x-x"
    $clientSecret = "x="
    $tenantId = "x-x-x-x-x"

    $secpasswd = ConvertTo-SecureString $clientSecret -AsPlainText -Force
    $mycreds = New-Object System.Management.Automation.PSCredential ($clientId, $secpasswd)
    Login-AzureRmAccount -ServicePrincipal -Tenant $tenantId -Credential $mycreds
    Set-AzureRMContext -Subscription $SubscriptionName -Name $SubscriptionName -Force
    Select-AzureRmSubscription -Context (Get-AzureRmContext -Name $SubscriptionName) -Name $SubscriptionName -Force

```

##PSDSCの構築時にリモートホスト側で実行するスクリプト

```
Enable-PSRemoting -Force
Set-Item wsman:\localhost\Client\TrustedHosts -Value * -Force
Set-ExecutionPolicy RemoteSigned
```

##ストップウォッチ

``` 

$sw = New-Object System.Diagnostics.StopWatch
# Start Stopwatch
$sw.Start()
#DO SOMETHING
# Stop Stopwatch
$sw.Stop() 
#Show Result
Write-Output ("経過時間は{0}です。" -f $sw.Elapsed)
Write-Output ("経過時間は{0}日です" -f $sw.Elapsed.TotalDays)
Write-Output ("経過時間は{0}時間です" -f $sw.Elapsed.TotalHours)
Write-Output ("経過時間は{0}分です" -f $sw.Elapsed.TotalMinutes)
Write-Output ("経過時間は{0}秒です" -f $sw.Elapsed.TotalSeconds)
Write-Output ("経過時間は{0}ミリ秒です" -f $sw.Elapsed.TotalMilliseconds) 
#Reset Result
$sw.Reset()

```

##ループの抜け方
知らなかった。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/fb5b2dd7-a514-c792-662e-3bb8d39abe55.png)

参考リンク：
http://ufcpp.net/study/powershell/flow.html