OmniAICreator/Qiita-1.07M huggingface dataset:
簡単に goroutine の実行個数を制限する方法・改

元ネタは[mattnさんの記事](https://mattn.kaoriya.net/software/lang/go/20171221111857.htm)から。

> タイトルが goroutine の実行個数と言いながら goroutine 自体はいっぱい起動するのはこれ如何にという指摘を頂きましたが、ごもっともでタイトルバグですね。

追記にこう書かれているんですが、channel に詰めるタイミングを変えれば goroutine の数を制御できるのではないか？また sync.WaitGroup を使わなくても書けるのではないか？と考え、手を加えてみました。Go 言語は初心者ゆえ、間違いがありましたらご指摘いただけますと幸いです・・・！

```go
package main

import (
	"fmt"
	"time"
)

func doSomething(u string) {
	fmt.Println(u)
	time.Sleep(2 * time.Second)
}

func main() {
	urls := []string{
		"http://www.example.com",
		"http://www.example.net",
		"http://www.example.net/foo",
		"http://www.example.net/bar",
		"http://www.example.net/baz",
	}

	limit := make(chan struct{}, 3)

	for _, u := range urls {
		// limit が一杯だとここで処理がブロックされる
		limit <- struct{}{}

		go func() {
			doSomething(u)
			// 終わったら limit をひとつ空ける
			<-limit
		}()

		time.Sleep(200 * time.Millisecond)
	}

	// limit が埋まるまで ＝ 最後の goroutine が終わるまで待つ
	for i := 0; i < 3; i++ {
		limit <- struct{}{}
	}
}
```
Pythonで「カイ２乗分布の定理」を確かめてみる

カイ（χ）２乗分布に関して以下の定理が成り立ちます。



```math
\begin{align}
\\
&【定理】\\
\\
&分散\sigma^2の同じ正規分布に従うn個の確率変数X_1, X_2, ..., X_nを考える。\\
\\
&\bar{X} = \frac{X_1 + X_2 + ... + X_n}{n}\\
\\
&さらに以下の和を考えるとき、\\
\\
&\chi^2 = \Bigl( \frac{X_1-\bar{X}}{\sigma} \Bigr)^2 + \Bigl( \frac{X_2-\bar{X}}{\sigma}  \Bigr)^2 +...+ \Bigl( \frac{X_n-\bar{X}}{\sigma}  \Bigr)^2\\
\\
&この確率変数\chi^2は自由度n-1の \chi^2 分布に従う。\\
\\
&またs^2を不偏分散とした時、簡単な計算で以下の等式が成り立つことがわかります。\\
\\
&\chi^2 = \frac{n-1}{\sigma^2} s^2 \qquad (1)\\
&\qquad \qquad  \qquad \qquad  \qquad \qquad  \qquad \qquad \qquad  \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad  \qquad  \\
\end{align}
```



# 定理を確認する

N(0,2)の正規分布に対してサイズ10の標本を取り出し不偏分散を計算する。それから(1)のカイ2乗を計算し棒グラフを描く。これが自由度9(=10-1)のカイ2乗分布で近似されていることをみる。

以下の簡単なPythonのプログラムを実行します。


```
import numpy as np
import matplotlib.pyplot as plt
from decimal import Decimal

# 1000個の標本に対して(1)を計算し棒グラフを描く
e={}
for i in range(1000):
    n = 10
    h = 2
    # 平均=loc=0.0, 標準偏差=scale=2, 個数=size=10
    a=np.random.normal(loc=0.0,scale=2, size=10)
    # 不偏分散の計算
    b = np.var(a, ddof=1)
    # χ２乗の計算
    c = ( (n-1)/(h*h) ) * b
    d = np.around(c, decimals=0)
    if d in e:
        e[d]=e[d]+1
    else:
        e[d]=1
es = sorted(e.items(), key=lambda x:x[0])
xs=[x for (x,y) in  es]
ys=[y/1000 for (x,y) in  es]
plt.bar(xs, ys, 0.35, linewidth=0)

# カイ２乗分布をプロットする
from scipy.stats import chi2
X = np.arange(0,30,1)
Y = chi2.pdf(X, df=9)
plt.plot(X,Y,color='r')
```

出力されたグラフを見ると、確かにカイ2乗分布で近似されているのがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61915/1533283a-d439-aa0a-7f10-cb3498eac270.png)


今回は以上です。
【Rails   seedsでdocker起動時に初期データを登録する 。データの重複はfirst_or_createで防ぐ】

##はじめに
先日初めてseedsを使い初期データを登録しましたが、`docker-compose up`の度にデータが作成されてしまい、気づいたらデータ数がとんでもないことになっていました...。
解決できたのでメモしておきます。

##seedsに初期データを書く
今回は`name`,`age`,`hobby`のカラムを持つusersテーブルに3つ、初期データを登録していきます。

```db/seeds.rb
User.create!(
  [
    {
      name: 'Mary',
      age: 22,
      hobby: 'Cooking'
    },
    {
      name: 'Alice',
      age: 25,
      hobby: 'Basketball'
    },
    {
      name: 'John',
      age: 28,
      hobby: 'Soccer'
    }
  ]
)
```
これで`rake db:seed`を実行するとデータが作られます。

##Docker起動時にデータを作成する
`docker-compose up`で自動的にデータが作られるように、`docker-entrypoint.sh`に加筆しました。

```etc/docker/rails/docker-entrypoint.sh
set -eu

bundle exec rails db:create
bundle exec rails db:migrate
#以下を加筆
bundle exec rails db:seed
```

これで無事に初期データが作られました。

……しかし！
#####これではDockerを起動する度にデータが作られてしまうのです。

###重複を防ごうとやってみたこと
・idを振って`create`にしてみる
→id重複のエラー。
・idを振って、`create!`を`find_or_create_by`にしてみる

```db/seeds.rb
User.find_or_create_by(
  [
    {
      id: 1,
      name: 'Mary',
      age: 22,
      hobby: 'Cooking'
    },
    {
      id: 2,
      name: 'Alice',
      age: 25,
      hobby: 'Basketball'
    },
    {
      id: 3,
      name: 'John',
      age: 28,
      hobby: 'Soccer'
    }
  ]
)
```
これだと、`TypeError: no implicit conversion of Hash into String`エラーが出てしまいました。

##first_or_createで解決
色々調べながら、`first_or_create`を使ってみました。

```db/seeds.rb
User.first_or_create(
  [
    {
      id: 1,
      name: 'Mary',
      age: 22,
      hobby: 'Cooking'
    },
    {
      id: 2,
      name: 'Alice',
      age: 25,
      hobby: 'Basketball'
    },
    {
      id: 3,
      name: 'John',
      age: 28,
      hobby: 'Soccer'
    }
  ]
)
```
２回目以降dockerを立ち上げても、データが重複して作られることはありませんでした。id無しでも試してみましたが、データの重複が無いことを確認できました。
`first_or_create`は既に同じデータがある場合は作成せず、無ければ新たにデータを作ってくれる。`find_or_create_by`も同じようなメソッドな気がしていたのですが…

##まとめ
・docker起動時にseedsでデータを挿入するには`docker-entrypoint.sh`に加筆する。
・データの重複を防ぐには`first_or_create`を使う。

初心者ですので、間違っている点や他の方法等あればご指摘いただけますと幸いです。
HTML の テキスト に 影 を 設定する ～text-shadow～

# 目的
- HTMLファイルのテキストに影を設定する方法をまとめる。

# 押さえるポイント
- テキストを縁取るように影を設定するにはtext-shadowプロパティを使用する。
- box-shadowプロパティに水平方向への影の大きさ、垂直方向への影の大きさ、影の色を与える。
- 影の大きさはピクセル数かremまたはemで設定する
- 水平方向の影の大きさの設定をする際、正の値を設定すると右に、負の値を設定すると左に影を作ることができる。
- 垂直方向の影の大きさの設定をする際、正の値を設定すると下に、負の値を指定すると上に影を作ることができる。
- 影の色はカラーコードか色の名前で設定する。

# 書き方の例
- 下記にCSSファイルの内容を記載する。

``` css
ボックス要素の名前かクラス名 {
  text-shadow: 水平方向の影のピクセル数かremまたはem 垂直方向の影のピクセル数かremまたはem 影の色;
}
```

# より具体的な例
- h1要素の文字に水平方向2px、垂直方向に10pxの黒い影を設定する。
- HTMLファイルの内容を下記に記載する。

``` html
<h1>おはようございます。</h1>
```

- 下記にCSSファイルの内容を記載する。

``` css
h1 {
  box-shadow: 2px 10px black;
}
```
平方根

## 平方根、３乗根、累乗根の計算
n乗根は1/n乗する。

## 平方根

```python:python
>>> 10**(1/2)
3.1622776601683795
>>> 4**(1/2)
2.0
>>> 2**(1/2)
1.4142135623730951
```

#### Googleで計算
$\sqrt{6}$
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/9444b589-3f8d-fac1-7c1b-bca8b0449f05.png)
参考:[Writing Mathematic Fomulars in Markdown](https://csrgxtu.github.io/2015/03/20/Writing-Mathematic-Fomulars-in-Markdown/)

#### CASIOの高精度計算サイトで計算
$\sqrt{6}$
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/8b846ca6-3438-a770-adba-339cb87b63ae.png)
参考：[高精度計算サイト](https://keisan.casio.jp/exec/system/1260332465)

## ３乗根

```python:python
>>> 10**(1/3)
2.154434690031884
```

*以下サイトでは複素数の平方根を求める場合はcmath.sqrt()を使う方法が紹介されている。
[Python, complex型で複素数を扱う（絶対値、偏角、極座標変換など）](https://note.nkmk.me/python-complex/)
pandas データの確認あれこれ2

# 必要なデータを抽出
## 特定の列を３種類の異なる方法で抽出する。

```python
df.iloc[:,1] # カラムのindexで指定可能
df.sepal_width # カラム名でも指定が出来る
df.loc[:,"retu_mei"] # 行を指定した後じゃないと使えない
```

##50番目から99番目までのデータを抽出する
```python
df[50:100]
```

## petal_lengthの列の50番目から99番目までのデータを抽出する

```python
df.iloc[:,3][50:100]
```

## petal_widthの値が0.2のデータを抽出する
```python
df[df['petal_width'].isin([0.2])]
```

## .locや.ilocを使うことになります。この２つはどう違うのかについて説明しましょう！！
.loc：列名で指定可能で列のスライスが可能になる。
.iloc：列番号も指定する事が出来る。

#### めでたしめでたし。( ；∀；)
【Ruby】コーディングテストで使える？標準入力から値を受け取る方法


※ 筆者はRuby初心者です。動作確認をしてから投稿していますが、間違いがありましたらコメントや編集リクエストで教えてくださると幸いです。

# はじめに

Rubyでコーディングテストを受験する必要がでてきたのですが、筆者はRubyを書いたことがありません。

まず標準入力を受け取れなければ、コーディングテストなんてできません。
標準入力を取得する方法をまとめていきます。

# 動作環境

- ruby 2.3.7p456

自宅で眠っていたMac Book Airに標準インストールされていたものを使用します。

# 標準入力1

超基本として、標準入力として「こんにちは」という文字列を受け取るものとするサンプルです。

```ruby;input1.rb
p '文字を入力してください。'
input = gets 
p input
```

```p``` は、標準出力するという意味です。
```p``` の他に、```print``` や ```puts``` があるようです。
役割を簡潔にまとめると、

| メソッド | 使い分け |
| :--- | :--- |
| p | デバッグ用。文字列型の場合、ダブルクォーテーションで囲んで表示してくれる。数値はそのまま表示。 |
| print | オブジェクトを文字列として表示。 |
| puts | オブジェクトを文字列として表示。最後に改行コードつき。 |

ターミナルを起動して、作成したスクリプトを実行します。
「こんにちは」と入力してEnterを押下すると、下記のように表示されます。

```
$ ruby input1.rb 
"文字を入力してください。"
こんにちは
"こんにちは\n"
```

標準出力の最後に```\n```がついています。
```print``` を使えば、表示されなくなります。
```p```を使いながら、最後の```\n```を削除したい場合は、```chomp!```を使用すればよいとのこと。
[参考文献]((https://ref.xaio.jp/ruby/classes/string/chomp))をそのまま引用させていただくと、

> chomp!メソッドは、文字列の末尾の改行文字を取り除きます。レシーバ自身を変更するメソッドです。戻り値は、末尾に改行文字があったときはレシーバ自身、なかったときはnilです。

というわけで最後の```p``` に```chomp!```を付与して実行します。

```ruby;input1.rb
p '文字を入力してください。'
input = gets 
p input	chomp!
```

実行すると、

```
$ ruby input1.rb 
"文字を入力してください。"
こんにちは
"こんにちは"
```

最後の```\n```が削除されます。

# 標準入力2

次は、標準入力で「1,あいうえお,かきくけこ」で、「,」区切りで取得したい場合を想定します。

```ruby;input2.rb
p '文字を入力してください。'
input = gets.split(',')
p input
```

上記のように```split```を使用すると、簡単に「,」区切りで取得できました。

```
$ ruby input2.rb 
"文字を入力してください。"
1,あいうえお,かきくけこ
["1", "あいうえお", "かきくけこ\n"]
```

また最後に```\n```がついているので、前述した```chomp!``` を追加しました。
そうすると、下記のようなエラーになってしまいました。

```
input1.rb:3:in `<main>': undefined method `chomp!' for ["1", "あいうえお", "かきくけこ\n"]:Array (NoMethodError)
Did you mean?  compact!
```

配列に```chomp!``` は使用できないのだと推定。
というわけで、ループを回して1単語ごと出力して、そこで```chomp!``` してみる。

```ruby:input2.rb
p '文字を入力してください。'
lines = gets.split(',')
p lines
for line in lines do
  p line.chomp
end
```

for文の```do```は省略可能とのこと。
普通は省略するのか分かりませんが、```do```を書いたサンプルになります。
初心者の自分の体感では、doは書いておいて、ブロックを明確にしておいたほうがよいと思いました。
**（参考文献が見つからなかったので、あくまで初心者の感覚です。Rubyist的には違うかもしれません。）**

これを実行すると、下記のようになります。

```
$ ruby input2.rb 
"文字を入力してください。"
1,あいうえお,かきくけこ
["1", "あいうえお", "かきくけこ\n"]
"1"
"あいうえお"
"かきくけこ"
```

# 標準入力3

いままで使用していた```gets``` では、標準入力の1行分しか取得できません。
複数行取得するためには、```readline``` を使用する必要があります。

以下がサンプルです。
たぶんfor文でもよいのですが、勉強のためにwhile文にしています。

```ruby:input3.rb
p '文字を入力してください。'
line = readlines
len = line.length
i = 0
while i < len
    line[i] = line[i].chomp
    p line[i]
    i += 1
end
p line
```

これを実行して、「あ、Enter、い、Enter、う」と標準入力します。
次にcontrol + dを押します。（Macの場合）
そうすると、下記のように表示されます。

```
$ ruby input3.rb 
"文字を入力してください。"
あ
い
う
"あ"
"い"
"う"
["あ", "い", "う"]
```

# おわりに

これで標準入力には対応できるはず…
もし、コーディングテストの練習を進める中で、ミスなどに気がついたら適宜修正していきます。

# 参考文献

[基礎からわかる！Rubyで標準入力を扱う方法（複数行、配列）](https://www.sejuku.net/blog/14078)
[printとputsとpの違いとは (Ruby) - kakuyonの日記](https://kakuyon.hatenablog.com/entry/2018/07/10/223023)
[chomp, chomp! (String) - Rubyリファレンス](https://ref.xaio.jp/ruby/classes/string/chomp)
[split (String) - Rubyリファレンス](https://ref.xaio.jp/ruby/classes/string/split)
[for文 - 繰り返し - Ruby入門](https://www.javadrive.jp/ruby/for/index3.html)
AWS CLI の s3 cp コマンドのバージョン間の性能差 

# 概要

ちょっと前に、2019/06/24 に S3 署名バージョン２が廃止になるという話があり、某システムの要件として AWS CLI のバージョンを上げなくてはいけないという状態になっていました。
バージョンを上げること自体は簡単なことなのですが、、、、上げてみたらビックリ！！ **全然性能が出ません!！**
そこで、改めて簡単な性能検査を行なった結果が以降の話となります。

ちなみに、結局 S3 署名バージョン２廃止は土壇場になって AWS によって方針転換されたので、対応自体は不要となったのでした。。。

# 比較条件

今回比較を行なった条件は下記の通りです。

- AWS CLI は下記の２つのバージョンで比較
  - 1.7.34
  - 1.16.181
- --recursive 指定の有無で比較

下記は共通条件

- Python-2.7.10
- OS は Amazonlinux の同じバージョン

これらの条件下で、数KB程度の小さなファイルを 100 個程度 aws s3 cp コマンドにより、EC2 上から S3 上にコピーする時間を計測しました。
--recursive を指定する際には全ファイルを対象に一括コピー、指定しない際には単純に for 文で１ファイルずつコピーとしました。

# 検証結果

計測は time コマンドで実施。
数値は real を採用。
+r がついているものは --recursive オプション付きです。

|   |1.7.34|1.16.181|1.7.34 +r|1.16.181 +r|
|---|:------:|:---------------:|:---------------:|:---------------:|
|１回目|	0m42.984s|	1m22.460s|	0m1.304s|	0m1.924s|
|２回目|	0m42.746s|	1m21.148s|	0m1.262s|	0m1.726s|
|３回目|	0m41.831s|	1m21.188s|	0m1.312s|	0m1.707s|


# 考察

- 驚くべきことに、1.7.34 から 1.16.181 にバージョンアップした場合、**単発の cp の性能は約半分となる**
- 同じバージョンで --recursive の有無で比較した場合、--recursive を付けた方が **数１０倍程度のレベルで性能が高い。** コピーするファイル数をもっと増やせば、もっと倍率が増える可能性もあり
- --recursive 付きの場合も 1.7.34 の方が性能は高い

つまり、これはあくまでも推測レベルですが、実際のファイル転送が始まるまでの始動時の処理が 1.7.34 と比較すると 1.16.181 は２倍程度時間がかかるようになり、それがこのような結果として表れたのではないかと思われます。
あと、--recursive の効果は絶大ですね。
--recursive 指定により並列でファイル転送されるようになりますが、この並列処理が恐ろしく効果的です。
おそらく、max_concurrent_requests を調整すればさらに性能向上が見込めると思います。

# 結論

- AWS CLI の s3 cp コマンド（mv コマンドも同様）はバージョンにより２倍程度変わることがあるので、バージョンアップする場合には性能面では注意が必要。バージョンアップすることで性能が大幅に低下することがある
- --recursive による並列処理の効果は絶大なので、少しでも性能が気になるのであれば、なるべく --recursive 指定でまとめて cp するようにすることが効果的
SVGで円グラフを描く（更新中）

<p class="codepen" data-height="425" data-theme-id="dark" data-default-tab="js,result" data-user="dinhduythanh" data-slug-hash="mNMzxZ" style="height: 425px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Pie Chart">
  <span>See the Pen <a href="https://codepen.io/dinhduythanh/pen/mNMzxZ/">
  Pie Chart</a> by Đinh Duy Thanh (<a href="https://codepen.io/dinhduythanh">@dinhduythanh</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Milligramはタイポグラフィが綺麗なCSSフレームワーク

私自身がHTML&CSS&JSをゴリゴリ書きたい人間なのでいまいち必要性を感じないという面もあるのですが、CSSフレームワーク、個人的にはあまり好きではないです。

お手軽にいい感じの見た目を実現してくれるし、デザインを統一できるのでチームで開発する際の恩恵は間違いなくあるとは思います。
が、毎回DOMに大量のクラス名を付与する必要があったり、デザインのためにDOM構造を汚染してしまうのがなんか美しくないと感じます。スタイルとDOMが密結合になってしまうのもイマイチに感じるポイントです。

あと当然ですがフレームワークを使えばそれに準じたデザインになってしまうので、そういう面で何か「垢抜けなさ」を感じてしまい、かといってスタイルを上書きするのもしんどい。うーん。

そういうわけであまりCSSフレームワークには必要性を感じていなかったのですが、最近Milligramというやつを試しまして、これは割と気に入ったので紹介記事を書きます。
[Milligram公式はこちら](https://milligram.io/)

##Milligramの何が良いの？
###美しいタイポグラフィ
個人的に特に気に入っているのが[タイポグラフィ](https://milligram.io/#typography)です。
これひとつでドキュメントの構造を美しく視覚化してくれます。余白の取り方もいい感じです。
私は手軽に整ったタイポグラフィが欲しい時は、とりあえずMilligramを放り込んでおくくらいに気に入っています。

###美しいデザイン
CSSフレームワークを導入するとどうしてもデザインが垢抜けない感じになりがちですが、その点Milligramのデザインはシンプルでセンスが良いと感じます。

ぜひ公式の[Docs](https://milligram.io/#examples)を見て欲しいのですが、"A minimalist CSS framework"という謳い文句のとおり、ミニマルでさらっとしたデザインです。グレー基調の背景色と文字色も目に優しくて良い感じです。

###シンプルで必要最小限のスタイル
上にも書きましたが、CSSフレームワークって「これで十分」感のある垢抜けないデザインがあまり好きではないです。もちろん汎用的なツールなのでそれ単体では凝ったデザインが不可能なのは当然なのですが、じゃあ独自のカスタムが簡単かというとそうでもない。

CSSフレームワークのカスタマイズは、密結合になったDOM構造とスタイルや、容易に汚染が起きるCSSの特性が負の相乗効果を起こし大変しんどく、打ち消しに打ち消しを重ねたスタイルは思わぬところで副作用を産み、時にはクラス名のバッティングなんかも発生します。入り組んだソースコードはちょっとした修正のコストを増大させ、かといってフレームワークのスタイルを全て把握するにもそれなりの時間がかかり、それなら1から自前でスタイルを書いた方が早いのでは、という疑問が頭をよぎることしきり。

そこへ来てこのMilligram、本当に最小限のスタイルだけ実装してあるためカスタムが簡単です。
プロパティの数が少ないので全体像が容易に把握できるし、ソースコードのどこに何が書いてあるかも、どこをどう弄れば何がどう変わるかも、すべてが一目瞭然です。

もちろんシンプルな分自分で書かなきゃいけないスタイルも増えるわけですが、重量級のCSSフレームワークを後からカスタマイズするくらいなら1から自前でスタイル書いた方が良い、というのが私の考えなのでこれくらいでちょうど良いと感じます。

###軽量
ファイルサイズ2kbということで本当に軽いです。
ちょっと見た目を整えるためにUIkitやBootstrapのような全部入りのフレームワークを読み込むのは無駄な気がしますよね。そういう時Milligramはフィットするはずです。

##おわり
このMilligram、一応Gridレイアウトにも対応していますが、どちらかというとブログのような文章主体のシンプルなサイトに向いたCSSフレームワークであるように思います(複数カラムでがっつり組みたい時は自分でスタイル書くかUIkitとか使った方が良さげ)。

ともかく、シンプルなスタイルが欲しい時におすすめです。
ぜひお試しを。
【Pepper for Biz 3.0】お仕事かんたん生成3.0の便利な機能まとめ

##はじめに
こんにちは。エコー電子工業のPepper開発担当です。

Pepper for Biz のお仕事かんたん生成3.0について、知っておくとちょっと便利な情報をまとめました。

※2019/9/9現在の状況です。仕様変更があった場合はご了承ください。



##背景設定
お仕事全体の背景設定ができます。

基本設定のボタンを押すと

![基本設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/86d12c19-2a91-431f-bbe9-4172c4ac0fc0.png)

こんな画面になって、背景の画像や色が設定できます

![背景設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/ad418018-2790-4c6d-e311-c1384fe0ab39.png)

背景色は、画像の設定を解除(右上の×ボタン押下)すれば確認・設定ができます。

![背景色の確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/bdf7a9e8-d55f-6e5f-12df-46380274a203.png)

Pepperのロゴを会社ロゴにかえた画像を作成すれば、一気に自社のPepper感が出る気がしますよね～
　　![背景画像変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/003cca0a-08c0-dff8-7774-69dba3e68fdc.png)



##ボックスグループの利用
ボックスをまとめることで、お仕事間で共通で使えるボックスグループを登録することができます。

まず、「高度な操作」を押すと出てくるメニューの中から、「ボックスグループにまとめる」を押します。
![g1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/52553200-fac2-6d67-b485-8ca765124cdc.png)
※画像のお仕事は、「【エンタメ：7月】夢見る自由研究」というテンプレートです。
　テンプレートも定期的に増えているようなので、ぜひチェックしてみてください！
 
 
 
すると、下の画像のようにボックスにチェックボックスができ、選択できるようになります。

試しに、「質問７」というボックスにチェックを入れてみました。
そうすると、「質問７」以降のボックスが全てチェック状態になります。
このボックスグループに「質問７のグループ」という名前を付けて登録しました。
![g3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/9e8d0bad-2663-1850-59ec-14f6bf5939a1.png)

ボックスグループに登録すると、他のお仕事でも、
この「質問７のグループ」のボックスグループが使えるようになります！

他のお仕事を開き、ボックスを追加しようとすると、
「ボックスグループ」のところに「質問７のグループ」が入っていますね！
![g4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/bb8f3205-36ec-58d6-c599-ddfa75dc4a1f.png)


お仕事をまるっとコピーして、いらない部分を削るということもできますが、
Aお仕事のこの部分と、Bお仕事のこの部分を合体させたい！となったときには
このボックスグループをうまく活用してもらえればと思います！




##時間設定
お仕事かんたん生成3.0から、**時間設定**というボックスが追加されました！

いままでは、朝は「おはよう」昼は「こんにちは」と呼び込みをさせたいと思った時には
お仕事を２つ作ってスタッフさんに時間ごとに切り替えてもらう必要がありました…

しかし、この**時間設定ボックス**を利用することで、ひとつのお仕事で実現できます！

　![時間設定ボックス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/3d1cf73d-7122-2ffc-ebfe-0d35f53e86d0.png)

設定の方法はすごく簡単です！！
例として、呼び込みのセリフを時間帯で変更するお仕事を作ってみましょう。
　例）0:00～11:00まで「おはよう」
　　　11:00～18:00まで「こんにちは」
　　　18:00～0:00まで「こんばんは」

まず、時間設定ボックスは下記の通り設定します。
「こんにちは」の時間帯は設定していませんが、指定時間外というもともとの設定に遷移するので問題ありません。
　![時間設定ボックスの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/a89c9af9-d17f-9313-6b28-4bcdacac1a50.png)

時間設定ボックスを設定すると、こんな感じで、各時間帯のホームボックスが作成されます。
今回の設定の場合は、上から順に「こんにちは」「おはよう」「こんばんは」ということになります。
　　![時間設定_２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95883/d831e8c6-3725-7f85-8e47-f7da429f0aa3.png)

次に、それぞれのホームボックスで、時間のあいさつを含めた呼び込みを設定していきます。

呼び込みの内容のみ変更したい場合は、各ホームボックスの次のボックスにジャンプボックスを置いて、メニュー1にジャンプさせれば完成です！
メニューを表示させず呼び込みだけ実施したいときは、空欄のままでOKです！
と、このように、ホームボックスからの続きは自由に作成してください。

時間設定ボックスをうまく利用すれば、スタッフさんの手を煩わすことなく、時間によってPepperの対応を変えることが可能です！


##おわりに
Pepper for Bizリリースから3年がたち、お仕事かんたん生成もかなりバージョンアップしましたね！
私はまだ作成はしたことがないですが、制限最大まで500個のボックスをフルに組み合わせれば
ものすごいお仕事ができそうな気がします…！！

モーションや画像等も合わせて、お仕事を作りこめば作りこんだ分だけ
人を喜ばせる対応ができるようになりそうですね！

あなたの会社に、眠っているPepperはいませんか？
上記で紹介した機能を駆使して、ぜひPepperにお仕事をさせてあげてください！
【メモ】HTTPについて

## HTTPリクエスト
クライアント（Webブラウザ、chrome・firefox・safariなど）が情報を提供するサーバ（Webサーバ）に対して「ファイルを見せて」などのお願いすること。
GET,POST,PUT,DELETE,HEAD...etc

### POST と GET
HTTPリクエストメソッドの一種

|リクエストメソッド|付加する場所|性質|閲覧履歴|
|---|---|---|---|
|GET|URL|冪等かつ安全|残る|
|POST|Body|	冪等でも安全でもない|残らない|

GETはURLに残るので、パスワードなどの他人にみられて困るものには使わない
POSTは何かしらの入力した追加情報を一緒に送ることが多い。そのため「戻る」を使うと「変更した内容が保存されませんが〜」みたいなポップアップが現れる。

### 冪等（べきとう）とは
  なんどやっても結果が変わらないこと
  [Twitter](https://twitter.com/search?q=%E5%86%AA%E7%AD%89%E6%80%A7&src=typed_query&f=image)でわかりやすい図解があるので調べてみてください
  

## レスポンス
リクエストに対して返す返答。レスポンス。
404のエラーなどはレスポンスの一つである。
以下のサイトがすごいイメージしやすいのでおすすめです。
[先輩と覚える HTTP ステータスコード · GitHub](https://gist.github.com/rosylilly/3401612)

## 終わりに
知らずのうちに恩恵を受けているもの
調べてみると色々と情報量が多い

知らずに使える現代、テクノロジーに感謝
エアペアプロでTDDの修行をした話

# 対象とする人
* TDDの概要は知ってるけどやったことがないという方
* 一人でTDDにチャレンジするしかない方
* t_wadaさんを信奉しているけど普段から関わることができない方

# この資料でのゴール
* TDDってこういう感じなのね！という感覚を掴んで、一人でもTDDが練習できるようになること

# ことの始まり
そもそもエアペアプロに私が行き着いたきっかけはgolangで開発する案件に携わったことでした。
（どんな案件か、ということは本題には直接的に関係ないのと本記事の内容に影響がないのでここでは省略させていただきます）

ご存知の方も多いとは思いますが、golangでは言語自体でテストが手厚くsupportされており、また所感ですがエラー時の言語標準で出してくれる標準出力の内容もとてもわかり易いです。
https://golang.org/pkg/testing/

更に、様々なgolang製のOSSを見てもテストコードはどれも完備されており、参考となるテストコードに溢れています。
これはとどのつまり「golangで開発するならレガシー（テストのない）コードなんてナンセンスだよね？」というgolangからの暗黙的なあれなのでしょう。

TDDの知識はあれどやったことはない私ではありますが、折角の機会なのでこれを期にTDDで開発をしてみることにしました。

# TDDやったことない人が勢いで進めたら速攻で座礁した
「よし、やるぞ！」となった時、まずはどこから手をつけるでしょうか？
事前に要件や仕様が明確に文章化されているなどお膳立てされていればよいですが、多くの方は「どういうことができるものをつくりたいんだっけ？」とまずはゴールについて考えるかと思います。

当たり前ですがTDD云々の前に、何かを「作る/進める」時には
「できてほしいこと」がちゃんと定義されてることが大事ですよね。

もし「ゴールが決まってない」という方がいれば、最初に定義をしましょう。
ゴールを自分で決める権限がなくて決められない、という方は決める権限を持つ方に決めてもらうかゴールを作って提案して早々に決めましょう。

そして「ゴールがある」という状態になってから改めて、TDDの進め方を思い出してみます。

* Red （失敗させて）
* Green（成功するように直して）
* Refactoring（キレイにする）

この３ステップでしたね。
ゴールも決まってるし、進め方もシンプル。
何も問題なさそうに見えるし、では早速TDDの進め方でやってみよう！


...と言ったところで、みなさんはできましたか？
私はできませんでした。

具体的にどこからできなかったというと
「Redを発生させる前段階でどうすればいいか」
という段階で止まってしまいました。
TDDのサイクルが始まってすらいない序盤も序盤です。

「なんでそんなところで止まるの？」
「とりあえず失敗させればいいんでしょ？」
という方もいると思いますが、どうやその時の私には「具体的な分割イメージ」がついていなかったようです。
こちらについて少し掘り下げていきます。

# テストケースという最初の壁

なぜ「そもそもRedを発生させる前段階でどうすればいいか」で止まってしまったのでしょうか？
実際の思考順に沿ってまとめていきます。

TDDのサイクル通りに開発するに当たってまず用意しようとしたものは「テストコード」でした。
「テストコード」が用意できればあとは「Red →Green　→Refactoring」をいい感じにできるはずだと思ってそこから手を付けようとしてました。

が、そこで「テストコード」を作ろうした時に手が止ります。
それは何故かというと、開発ありきの単体テストに慣れてしまっていたためか、最初にテストケースを作るという重要な作業がすっかり頭の中から抜けてしまっていたためでした。
テストケースがなければ、テストコードが書けるはずもないですし、どんなことを達成させるためのテストコードなのかもわかりませんね。

そんな当たり前の事実を思い出し、いざ「テストケースを作ろう！」となった時にまたまた手が止まってしまいました。
それはテストコードで叶えるべき「テストケースの粒度」をどうすればいいのかわからなかったからでした。

これは不健康なテストをやっていたことへの気付きでもありました。
なぜならば、「ゴールを実現するための機能を実装しているという安心を得るために」テストをやっているのに、実装したものを主体としてテストを考えるとテストがそれを満たしているかどうかは作った実装に左右されてしまう状態になってしまっていたからです。

こんな状態ではTDDはできませんでした。

# そこで「エアペアプロ」ですよ
そんな私が出会ったのが有名なt_wadaさんのライブコーディングの動画でした。

（classmethodさんのブログの中にありました）
https://dev.classmethod.jp/study_meeting/read/what-tdd/

この動画を見ることで「なるほど、こんな感じに進めればいいんだ！」と感動しましたが、実際に一人で進めてみると意外と難しい...
そこで気づきました。

わい「せや、t_wadaさんの動画見ながらエアでペアプロをすればええんや！！」

t_wadaさんの動画を再生しながら、自分もコーディングをして対応していくという方法に打ってでました。
そうすると、今まで詰まっていた進め方や疑問点が嘘のようにスムーズに進めれるようになりました！

# エアペアプロのやりかた

* 自分の題材となる受入れ要件を準備
* t_wadaさんの動画を用意
* 再生します
* t_wadaさんの進行に合わせてTDDのサイクルを進めていきます

これだけでできます！

# いい点
• なんども何度も繰り返し見ながら進められます
• TODOを作る時、どんな項目を作ればいいか迷ったこともあったけどこれなら悩まみませｂ！
• 実際にTDDサイクル回していく時、大きなレベルで作ろうとしてしまったところも参考がいると軌道修正できます！

# まとめ
* エアペアプロは一人でもはじめられる
* t_wadaさんは神
【メモ】Webhookとは？


## Webhookとは？
何かしらの『きっかけ』から指定した『宛先（URL）』へデータを送ること。例えば、Chatworkで「メール送って」と完全一致のメッセージを送ると、Gmailにメールを送られる。この一連の流れの概念
参考：[Webhookって何？を子どもでもわかるように描いてみた \| kintone hive online](https://kintone-blog.cybozu.co.jp/developer/000283.html)


もし、誤りがあれば修正するのでどんどん指摘してください。
Python3でハフマン符号化

# ハフマン符号とは
>
1952年にデビッド・ハフマンによって開発された符号で、文字列をはじめとするデータの可逆圧縮などに使用される。
よく出現する文字には短いビット列を、あまり出現しない文字には長いビット列を割り当てることで、メッセージ全体の符号化に使われるデータ量を削減することを狙っている。
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%95%E3%83%9E%E3%83%B3%E7%AC%A6%E5%8F%B7)より

可変長符号の一つ。 -> [可変長符号とは](https://qiita.com/mk668a/items/cdafa38b6b9983845442)

## アルゴリズム
与えられた文字列に含まれている文字の集合をSとする。

1.
Sに含まれる各文字の頻度を数える。
Sを二分木の根の集合として考える。各木は1つのノードを持つ。

2.
最小の頻度の文字2つを見つけ、2つの根として新しいノードを生成する。
新しい根は、2つの子の出現頻度の合計の出現頻度を持つ。
Sから2つの文字を削除し、Sに新しい根を追加します。

3.
Sの長さが1になるまで、2の手順を繰り返す。

#### 擬似コード
```python

def HUFFMAN (S):
  # Input: S 属性freq（頻度）を持つn個の文字のセット。freqはQのための鍵になる。
  n = |S| # Sの長さ
  Q = MIN_PRIORITY_QUEUE(S)
  for i = 1 to n -1:
    allocate new node z
    z.left = x = EXTRACT_MIN(Q)
    z.right = y = EXTRACT_MIN(Q)
    z.freq = x.freq + y.freq
    INSERT(Q, z)
  return EXTRACT_MIN(Q)
```
 
## 実装
```python:huffman.py

from collections import Counter


def MIN_PRIORITY_QUEUE(S):
    return sorted(S.items(), key=lambda x: x[1], reverse=True)


def EXTRACT_MIN(Q):
    return Q.pop()


def INSERT(Q, z):
    return Q.append(z)


def HUFFMAN(S, a):
    n = len(S)
    Q = MIN_PRIORITY_QUEUE(S)
    for i in range(n - 1):
        left = EXTRACT_MIN(Q)
        right = EXTRACT_MIN(Q)
        freq = left[1] + right[1]
        z = (left[0] + right[0], freq)
        INSERT(Q, z)
        a.append([left, "0", left[0] + right[0]])
        a.append([right, "1", left[0] + right[0]])
        Q = dict(zip([i[0] for i in Q], [i[1] for i in Q]))
        Q = MIN_PRIORITY_QUEUE(Q)
    a.append([EXTRACT_MIN(Q), "", "top"])
    return a


def PrintReslut(b):
    for i in range(len(a)):
        now = a[i][0][0]
        num = a[i][1]
        j = 0
        while a[j][2] != 'top':
            if a[i][2] == a[j][0][0]:
                num = a[j][1] + num
                i = j
                flag = 0
                for k in range(len(a)):
                    if a[k][0][0] == 'top' or a[j][2] == a[k][0][0]:
                        flag = 1
                        break
            else:
                j += 1
        if now in s:
            b.append([now, num])
    return b


def DivideS(S):
    S = list(S)
    S = Counter(S)
    S = dict(S)
    return S


s = DivideS(input())
a = HUFFMAN(s, [])
for b in sorted(PrintReslut([])):
    print(b[0] + ": " + b[1])

```

#### 例
文字列: ABBCACCEACBCCFABCDAFEABFFADBBC
S = {"A": 7, "B": 7, "C": 8, "D": 2, "E": 2, "F": 4}
<img width="441" alt="スクリーンショット 2019-08-02 18.10.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267721/63ddd32d-e7f2-f914-1e51-b8b38580287c.png">
A: 01
B: 00
C: 11
D: 1001
E: 1000
F: 101


## デコード
文字列内の最初のビットから始めて、文字列からの連続するビットを使用して、デコードツリー内を左に移動するか右に移動するかを決定する。
ツリーのリーフ（文字）に到達したら、その文字を出力（デコード）用の文字列に追加する。
※ 圧縮ファイルにはコード表が含まれていなければならない。
秀丸エディタでファイル新規作成時のデフォルトの文字コードを変更する

秀丸エディタでファイルの新規作成をすると、
通常ならば文字エンコードはShift_JISが選択されるが、これをUTF-8になるように変更した。

Ver8.88

以下その手順のメモ。

１．メニューから「その他(O)」-「動作環境(E)」を選択。

２．「ファイル」項目を展開して「エンコード1」を選択。
※ 上級者向け設定(A)にチェックを入れないと展開できないので注意。

３．「新規作成やASCIIの時：」を「Unicode(UTF-8)」に変更。
　　ついでに「改行コード(R)」を「改行=LF」に変更。

文字エンコードの自動判定の部分も変える。

４．「ファイルの内容を解析してエンコードの種類を自動認識する(E)」
のチェックが付いていることを確認。
判定の並びを「上へ(P)」ボタンを使って以下のように変更する。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
・Unicode(UTF-8)
・日本語(Shift-JIS)
・日本語(EUC)
・日本語(JIS)
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
可変長符号とは

# 可変長符号

>情報源の記号に対して割り当てる符号を可変長とする符号
情報源が誤りなしで圧縮および解凍（可逆圧縮）され、依然として記号として読み取られることを可能にする
[Wikipedia](https://ja.wikipedia.org/wiki/%E5%8F%AF%E5%A4%89%E9%95%B7%E7%AC%A6%E5%8F%B7)より

可変長符号の一つであるハフマン符号について -> [Python3でハフマン符号化](https://qiita.com/mk668a/items/47f54c94ff284b3dc17b)

### 例1
アルファベット26文字（A、B、... Z）に、次のように5ビットのバイナリコードが割り当てられているとします。
1.A：00001
2.B：00010
3.C：00011
⋮
26.Z：11010

ABRACADABRAが与えられた場合、5ビットの2進表現を使用して、以下のようにエンコードされます。
ABRACADABRA:
00001 00010 10010 00001 00011 00001 00100 00001 00010 10010 00001

逆にこれをデコードするには、一度に5ビットを読み取り、上記の割り当てに従って変換します。
この例では、Dは1回出現し、Aは5回出現しますが、両方ともバイナリコードで5ビットが割り当てられています。
また、5・11 = 55ビット使用します。

### 例2
次に、以下のように2ビットのバイナリコードが割り当てられているとします。
A : 0
B : 1
R : 01
C : 10
D : 11

この時、ABRACADABRAは以下のようにエンコードされます。
0 1 01 0 10 0 11 0 1 01 0

これは例1の55ビットと比べると、15ビットしか使用していません。
しかし、このコードは文字を区切るための空白に依存します。 空白がなければ、010101001101010はRRRARBRRAなどのように様々なパターンでデコードされてしまいます。

##### では、区切り文字(空白など)を使わずに文字列をコンパクトにエンコードするにはどうしたらよいか？
ある文字のコードが他の文字のコードの接頭辞ではない場合は、区切り文字は不要です。
0、00、001、0011は00110の接頭辞です。
例2の場合
A : 0
B : 1
R : 01
C : 10
D : 11
AのコードはRの接頭辞、BのコードはCとDの接頭辞です。

##### そこで、他の文字コードの接頭辞にならないように文字コードを割り当てる方法を考えます。
ここでは、M個の葉を持つ[二分木](https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%9C%A8)を用いて考えます。
二分木は、M個の異なる文字を持つ任意のメッセージをエンコードするために使うことができます（一つの葉は一つの文字を保持します）。

左:0、右:1として各文字のコードは、ルート(root 「根」にあたるノード)からその文字を保持するリーフ(葉)までのパス(経路)によって決めます。

これを用いると、文字列ABRACADABRAは、それぞれ次のように文字コードが割り当てられます。
<img width="418" alt="スクリーンショット 2019-08-02 17.14.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267721/a7922755-14e9-c506-e5d7-f6bc7e7fc663.png">
A : 11
B : 00
C : 010
D : 10
R : 011
ABRACADABRAは以下のようにエンコードされます。
11 00 011 11 010 11 10 11 00 011 11

このように、二分木を用いると、文字コードが他の文字コードの接頭辞ではないことを保証するので、文字列は木から一意にデコード可能になります。
デコードの方法としては、ルートから始めて、メッセージのビットに従ってツリーの下に進み、リーフに遭遇するたびに、そのリーフに文字を出力し、再びルートから再開します。

可変長符号化の説明は以上になります。

##### 次に、与えられた文字列に対して最短の二分木を考える必要が出てきます。
ここで、D.ハフマンが考えた与えられた文字列に対して最小の長さのビット列を導く二分木を計算するための方法「ハフマン符号化」を用います。
[Python3でハフマン符号化](https://qiita.com/mk668a/items/47f54c94ff284b3dc17b)
C++ Builder 10.2 Tokyo + Windows 10 v1903 > Application Manifest > 管理者権限になれない.User Account Controlが表示される (August 2017以降のWindows Updateでできなくなった)

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3 
Windows 10 v1903 
```

### 調べていたこと

- Application Manifestを使った管理者権限昇格での実行

過去の情報を色々試して、全滅。
.exe実行時に「User Account Control」ダイアログが必ず表示されてしまう。

### 2017年8月以降の状況

https://stackoverflow.com/questions/923350/delphi-prompt-for-uac-elevation-when-needed/45751713#45751713

> Edit: Jan 2018: since writing this answer in August 2017, it seems a lot of Windows updates have come out, that now require the user to right-click and Run As Administrator on just about everything, even on installation exe's built with Wise. Even Outlook is no longer installing properly without running as administrator. There is no more automated elevation at all it seems.

Windows Update適用後に従来の方法がダメになったようだ。

自分が色々試した限りでは、そのような気がする。

### 過去の情報

過去の情報は、そのときのOSの状況では動いた。
それがOSの更新によって動かなくなる。


### 関連
(追記 2019-08-05)

- [Elevated privileges for Delphi applications.](https://chapmanworld.com/2015/06/08/elevated-privileges-for-delphi-applications/)

(おそらく)Windows 7時代の記事。

コメントしたところ、GUIDについてのコメントをいただいた。
このあたりは調べてみるか。
エンジニアになると思いきや仕様書ばかり書いていた新卒三年半が思うこと

# イントロ

この記事は「エンジニア」もしくは「技術職」にあたる部署に配属され、ガンガンコード書くのかな…
なんて思っていたら三年間ほぼ企画から受けた要件をまとめ続ける仕様書担当だった、メーカー内のPMでもSEでもない平社員が思ったことを殴り書きします。

・上からいろんな仕様変更が舞い降りてくるエンジニアさん
・エンジニアに手戻りをなくさせたいと思っているもののよくわからない企画担当さん
・作業担当者から仕様立案や指示役となりそうな方

いろんな本や知識の焼きまわしになるかもですが、私が立ち返りたくなった時のためが主なので、
上記の方に微々たる参考になれば、と思います。

※私自身エンジニアとしてもPM系としても経験は未熟ですが、せっかく書くなら偉そうに書こうと思います。

# ころころ仕様が変わる対策

仕様を考えてくれる営業や企画の人は、突然違うことを言い出すことがあります。
私も仕様を検討していると、前に話したけど、よく考えたら･･･と気づいてしまうことが多々あります。
そんなときに、「この仕様はなんでこうしたんだっけ」というのが分からないと、たぶんたいした理由じゃないから変えよう、みたいに変えてしまうことがあります。


##対策1：仕様が決まった理由を仕様書に書く

仕様が決定するには、なにかしら経緯があるものです。
そして、その経緯は大体忘れられ、後の仕様検討の際には思い出されません。

たとえば、

**「技術的に難度が高く、工数に収まらないという報告があった」ための妥協仕様**
後の会議で改めて理想に近づけた仕様は、結果的に納期を遅らせるか、中途半端な代替機能になってしまう。

**「このインジケータの点滅は、他の～～と言う機能と共通性を持たせるため」**
点滅速度を一部変え、あとから「共通になっていないじゃないか」ということになり手戻りが発生する。




全ての理由を書いてしまうと、議事録さながらの読みづらい仕様書になってしまいますが、表などを使って

|||
|:------|:--|
|要求仕様|ボタンを押下したら再起動を要求する|
|理由|再起動しないと設定が反映されないため、ユーザーが変えたつもりで気づかないことがありえる|

とか書いておくと、あとから仕様書を読む人も、「ああ、こういう経緯か」と分かります。

USDMというフレームワークが、私にはかなりしっくり着ており、それをアレンジして使っています。
http://swquality.jp/temp/nagasakiqdg15_usdm.pdf


仕様書を書く人が常に一人であれば、どこがどこに影響するかはなんとなくわかるものですが、
誰かに引き継いだり、担当の人がマルチプロジェクトだった場合、大抵の理由はすぐに忘却され、一番初めに決めたルールでさえ有耶無耶になってしまいます。


##対策2:デザインは早急に作り上げる

UI（さらにここではGUI画面）が伴う場合、何を差し置いても、ユーザー・営業・企画　の人がパッとみて指摘をくれるグラフィカルな資料を真っ先に作りましょう。

仕様が決まっていないのにGUIなど作れない･･･という場面も多々あるのですが、いっそ自分がデザイナーのつもりで、[Figma](https://qiita.com/mumumushi/items/651d6ff193b282c5fae7)とかでサクッと作って見せてあげると、速攻で「イメージとぜんぜん違う･･･！」というレスポンスが貰いやすいです。
（もちろん、ワイヤーでもぜんぜん良いですが、人は、遷移図を頭で考えるより、実際に触った方が気づきます。）

サーバー側をしっかり考えて、エンジニアサイドが納得のいく仕様でも、GUIの前では無力「ここにもう一個パラメータいるわ」と気づかれると
エンジニアサイドは最悪の場合構造体から設計しなおしです。

早めに、エンドユーザーに触れる部分を確定させましょう。

#P.S.
執筆をはじめ、2018/7/22の下書きが、2019/8/2まで放置されており （つまりいまは新卒4年半）、対策が5まであったのですが、見返すとなんかイマイチでした

でも一応世に出そうということで、今見ても、「まぁそうだな」と思えるところだけを残して、公開することにしました


この記事に触れる方がすごく多いとは思いませんが、また折を見て更新しようと思います。
もしもPythonで機械学習していて、行列のサイズ拡張につまづいたら

# この記事は

やぁ、また会ったね？

キミがこの記事に来るのは __12000回目__ だ。
キリ番ゲットおめでとう！！

コメント欄に書き込んでおいて欲しい。

# 行列のサイズ拡張

(2x3)の行列 を、
(1x2x3)の行列 へ拡張してみる。

```Python
import numpy as np

# 2x3の行列
a = np.ones( (2, 3) )
print('size of a: ' + str(a.shape))
#size of a: (2, 3)

# 1x2x3の行列へ変更する
a = a.reshape((1,) + a.shape)
print('size of a: ' + str(a.shape))
#size of a: (1, 2, 3)
```

# 注意
- 拡張後に行列の次元は増えていますが、要素数自体は変わっていません。
    - 拡張前: 2x3 = 6 、拡張後: 1x2x3 = 6
- 行列サイズはtupleで与えるので、tupleに要素を追加することで、拡張しています。
辞書アプリ

```ruby:dic.rb
dic = {apple: “りんご“, banana: “ばなな“, orange: “みかん“}

# 英和
def eiwa(dic)
 input = gets.chomp
 if dic[input.intern]
   puts dic[input.intern]
 else
   puts “登録されていません”
 end
end

# 和英
def waei(dic)
 input = gets.chomp
 if dic.key(input)
   puts dic.key(input)
 else
   puts “登録されていません”
 end
end

```
```ruby:dic2.rb
puts “どちらを使いますか”
puts “[0]:英和”
puts “[1]:和英”
input = gets.to_i

if input == 0
 eiwa(dic)
else
 waei(dic)
end
puts “どちらを使いますか？”
puts “0: 英和”
puts “1: 和英”
kind = gets.to_i

dict = {apple: “りんご“,orange: “オレンジ“,grape: “ぶどう“}
puts “何を検索しますか？”
input = gets.chomp

if kind==0
 if answer = dict[input.intern]
   puts answer
 else answer = dict[input.intern]
   puts “登録されていません”
 end
elsif kind==1
 if answer = dict.key(input)
   puts answer
 else answer = dict.key(input)
   puts “登録されていません”
 end
end
```
```ruby:dic3.rb

puts "どちらを使いますか？"
puts "0: 英和"
puts "1: 和英"
kind = gets.to_i

dict = {apple: "りんご",orange: "オレンジ",grape: "ぶどう"}
puts "何を検索しますか？"
input = gets.chomp

case kind
  when 0
    answer = dict[input.to_sym] ?  dict[input.to_sym] : "登録されていません"
    puts answer
  when 1
    answer = dict.key(input) ? dict.key(input) :  "登録されていません"
    puts answer
end
SikuliX 1.1.4 日本語PATH入りエクセルファイルをSikuliX関数で開きたいのに・・・

#前回のあらすじ
とりあえず諦めて動けばいいや精神を発動させた　⇒　[前回の日本語入りエクセルファイルを開く](https://qiita.com/yuucc/items/7c8b20a255766aa5e680)

この時は人生に疲れていたので当たり前のことが思い浮かばなかった。
そんな私にｾﾔﾅーが降臨した。
「ｴｽｹｰﾌﾟ ﾔﾃﾞー」

#エスケープ方法
[Appクラス詳細](https://sikulix-2014.readthedocs.io/en/latest/appclass.html?highlight=app)
公式サンプルだと以下
>myApp = App(r'"c:\folder with spaces\someApp.exe"')
>myApp = App('"c:\\folder with spaces\\someApp.exe"')
>myApp = App("\"c:\\folder with spaces\\someApp.exe\"")

#本来の目的
エクセルのpathと引数を渡す。
ただし、日本語ファイル名入りpath
でもその理想までは現状できていない。

##ファイルの関連付けなら何とか起動した
###ソースコード(あらかじめ　C:\集計\本日の集計.xlsx　に白紙でもいいのでファイル用意)
```python:エスケープしたらファイル関連付けなら何とか起動した
TARGET_XLS_PATH = r'"C:\集計\本日の集計.xlsx"'
file_path = unicode(TARGET_XLS_PATH, "utf-8")
proc = App(file_path)

proc.open()

uprint(proc.getName())
uprint(proc.getWindow())
print proc.isRunning(),proc.getPID(), proc.hasWindow()
```
uprintで出しているのは日本語入りなのでという理由

###結果
getName()の結果
本日の集計.xlsx

getWindow()の結果
本日の集計.xlsx - Excel

isRunning()の結果
True 

getPID()の結果
22232 

hasWindow()の結果
True

#なぜAppクラスにこだわるのか？
アプリをいろいろ切り替えて使えるから

##subprocessを使うと出来ないこと
プロセスはとりあえず立ち上げるけどウィンドウを切り替えたりが出来ない。
それだと複数のアプリケーションを使うことが難しくなってしまう。

一般的なPythonでウィンドウ操作するにはpywin32やらwin32guiがあれば出来るのですが、
SikuliXはJava上で動くJythonなのでpywin32は無いです。

その簡単にできないことがAppクラスは出来るようになっているので試行錯誤中です。
今のところ引数を与えてもエラーも出さず、sikuliX.jarをエクスプローラで開くだけになってしまっている。
setUsingを使っても変わらないので悩ましい。
VivadoSDK Linuxプロジェクトのインクルードパス


#環境
* ボード
    * Arty Z7(zynq評価ボード)
* ツール
    * Vivado2018.3(Windows10)
    * petalinux2018.3(Ubuntu 16.04)

#困りごと
なぜかVivadoでLinuxプロジェクトを作成すると、インクルードパスが通っていないのか不明なヘッダファイルと警告されます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354707/466dbdad-8a3d-8b30-c1fe-103739544ed0.png)

いろいろインストールされるので、どこにパスを通していいのかよくわかりません。

#ビルド情報を眺める
ビルドでエラーになっていないようなので、ビルド情報を眺めてヒントを得ます。デフォルトの設定だと詳細が出ないので下記のようにして詳細なビルド情報を表示します。
Vivado SDK プロジェクト Properties - C/C++ Build Settings - ARM v7 Linux gcc compiler - Miscellaneous にある「Verbose」にチェックを入れてビルドします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354707/3a3eb31b-e60e-8d6d-5e32-ca9a3d5d671d.png)

そうすると、モリモリっとビルド情報を吐き出すので、LIBRARY_PATHやCOMPILER_PATHの情報を頼りに使われているヘッダの格納先を探します。

私の場合、
「C:\Xilinx\SDK\2018.3\gnu\aarch32\nt\gcc-arm-linux-gnueabi\arm-linux-gnueabihf\libc\usr\include」
にパスを通せばOKでした。

#パスの設定
Vivado SDK プロジェクト Properties - C/C++ Build Settings - ARM v7 Linux gcc compiler - Directoriesに先ほどのパスを登録します。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354707/72f40188-7230-9030-e702-496680f77a33.png)

#解決
そうすると、？マークも消えて、補完入力も使えるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354707/71c773d1-3eed-8431-8a8d-ebd1a6b4827c.png)
Jetson Nanoで日本語音声認識をしてみた

## はじめに
音声認識OSSのJuliusをJetson Nano上で動かした時のメモです。分野に関して初心者ですので間違えている所がありましたらコメントいただけますと嬉しいです。

## 今回使用したマイク
・USBヘッドセット
ちょうど手元にあったこちらを使用しました。
エレコム ヘッドセット HS-NB05USV
https://www.amazon.co.jp/dp/B00M8VCL2Y

## Juliusのインストール
大きな流れはGithubのクイックラン通りです。
### モジュールのインストール
まず、Juliusのコンパイルに必要なものをインストールします。

```
$ sudo apt install　build-essential zlib1g-dev libsdl2-dev libasound2-dev git-lfs
```

`git-lfs`はJuliusのJapanese Dictation-kitのインストール時に必要です。ここで先にインストールしておきます。

### ソースコードのクローン

```
$ git clone https://github.com/julius-speech/julius.git
```

### config.guessとconfig.subの更新
このままコンパイルと行きたいですが、このままだと`make`でエラーが起きます。これは`config.guess`と`config.sub`のバージョンが古いため起きるようです。先に進む前に、各フォルダ内にある`config.guess`と`config.sub`を新しいものに置き換えます。フォルダは
・/home/julius/adintool
・/home/julius/jcontrol
・/home/julius/support
・/home/julius/msvc/Library_PortAudio/src
・/home/julius/msvc/Library_PortAudio/src/bindings/cpp/build/gnu
の５つです。この中の`config.guess`と`config.sub`を下のURLから持ってきたコードに上書き、もしくは置き換えをします。

`config.guess`
https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
`config.sub`
https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub

### インストールの続き
置き換えが終わったら続きをします。

```
$ cd julius
$ ./configure --enable-words-int
$ make -j4
```

少し時間がかかりますが、問題がなければJulius本体のインストールが完了します。次のコマンドで同じような出力が返ってくるか確認してください。

```
$ ls -l julius/julius 
-rwxr-xr-x 1 hoge hoge 746056 ８月 1 13:01 julius/julius
```

## Julius Japanese Dictation-kitのインストール
こちらのインストール後に日本語音声認識ができるようになります。
### git-lfsのインストールコマンドの実行
Githubからのクローン前に、一度juliusフォルダ内でこのコードを実行します。

```
$ git lfs install
```

### ソースコードのクローン
次にDictation kitのクローンを行います。Dictation-kitだけで2.2GBぐらいします。クローン後に確認してみてください。

```
$ git clone https://github.com/julius-speech/dictation-kit.git
```

これでインストール作業が終わりました。お疲れ様でした。

## 音声認識のテスト
### USBマイクの割り当て番号の確認
インストールが終わり、さっそくマイクに声を入力して出力結果を出してみたいと思います。まず、USBマイクのカードNo.とデバイスNo.を確認します。

```
$ arecord -l
```

こんな出力が出ると思います。

```出力結果
card 3: Device [USB PnP Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
```

上の場合、カードNo.は3、デバイスNo.は0になります。確認出来たら`.profile`に

```:.profile
export ALSADEV="plughw:3,0"
```

のように書き込みます。なお、このNo.はUSBの抜き差しなどで変わる場合がありますので、もしエラーが起きた時はもう一度確認しなおして`.profile`を書き直してください。

### 音声認識のテスト
`.profile`の書きこみが終わったら、一度読み直します。

```
$ source .profile
```

いよいよJuliusを動かしてみます。コマンドは次の通りです。

```
$ ~/julius/julius/julius -C ~/julius/dictation-kit/main.jconf -C ~/julius/dictation-kit/am-gmm.jconf -nostrip
```

起動が成功するとズラーっと出力が流れたあと、「please speak」と表示が出ますので、マイクに向けて何か話しかけてみてください。音声認識が成功すると、その話しかけた内容がターミナル上に表示されますので確認してください。

## おわりに
今回は色々と調べながらJuliusで音声認識テストしてみました。先人たちの知恵に本当に感謝しています。ありがとうございました。

## 参考記事
[Raspberry pi3B+でjuliusを動かせるようになるまでの覚書き(2019.3.10現在)][1]
[1]:https://qiita.com/todateman/items/9c0e291e7b378a3c559b
[Raspberry Pi＋Juliusで音声を認識する][2]
[2]:https://qiita.com/mininobu/items/f181b762955932cec6d6
Nuxt.js で window が使えない

Nuxt.js で window を使ったところ、エラーが出てしまいます。

```bash

ReferenceError
window is not defined
```

これはサーバーサイドのレンダリングが原因でした。
[公式サイト](https://ja.nuxtjs.org/faq/window-document-undefined/)に書いてあります。

`process.client` 変数を使用する必要があるということで、公式サイトの例を参考にして下記のように書いて解決しました。

```javascript
if (process.client) {
  // ここに window を使った処理を書く
}
```
Android App でInstallerを呼び出すときのメモ

久々にUpdateやInstallをするアプリを作成しようとしたところ、色々と権限周りで変わっていたので、そのメモ書き

#環境
`compileSdkVersion 29`
`minSdkVersion 24`
`targetSdkVersion 29`

#ソースコード
Intentでinstallerに飛ばしてあげる際のpermissionは下記を使う

``` xml:AndroidManifest.xml
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
```

DowloadしたapkをInstallするにはFileProvider経由でなくてはいけない
いろいろな記事ではまだSupportLibrary.v4を使っているものが多いが今回はandroidxを使用する

``` gradle:build.gradle
implementation 'androidx.core:core:{current version}'
```

FileProviderは下記の様に追加する

``` xml:AndroidManifest.xml
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true" >
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"/>
</provider>
```

あとは色々な記事でも書かれているように、AndroidVersionごとにあったIntentで飛ばしてあげるだけ

``` java:MainActivity.java
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Uri fileUri = FileProvider.getUriForFile(MainActivity.this,
                        MainActivity.this.getApplicationContext().getPackageName() + ".fileprovider",
                        file);
                Intent i = new Intent(Intent.ACTION_INSTALL_PACKAGE);
                i.setData(fileUri);
                i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                MainActivity.this.startActivity(i);
            } else {
                Uri fileUri = Uri.fromFile(file);
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setDataAndType(fileUri, APK_MIME_TYPE);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                MainActivity.this.startActivity(i);
            }
```

環境によって変わってくることはあると思うが、これでいける
以上
git branch情報がpowerlineで表示されない

# 課題
[powerline](https://github.com/powerline/powerline)導入時にbranch情報を表示する[git-prompt.sh](https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh)がうまく表示されなかった。
環境: Ubuntu 18.04.2 LTS (Bionic Beaver), bash 4.4.20

# 解決法
powerlineのrepoに解決方法があった。powerline config fileを書き換える。
[issue#186](https://github.com/powerline/powerline/issues/186)

```
mkdir -p ~/.config/powerline
cat <<-'EOF' > ~/.config/powerline/config.json
{
    "ext": {
        "shell": {
            "theme": "default_leftonly"
        }
    }
}
EOF
powerline-daemon --replace 
```
# 結果

![Screenshot_20190731_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91291/45e938a6-93c2-8f10-f9f5-19f75e472da2.png)

見た目がよくなればやる気も出るはず。
Vivado SDKでマップファイルを出力する

#環境
* ボード
    * Arty Z7(zynq評価ボード)
* ツール
    * Vivado2018.3(Windows10)

#やりたいこと
マップファイル（.map）を出力したい。

#方法
Vivado SDKのプロジェクトProperties - Settings - Tool Settings - ARM v7 gcc linker - Miscellaneousを選択します。
Linker Flagsに「-Wl,-Map -Wl,"XXX.map"」XXX:パス+ファイル名
を追記します。
※スペースの有無に注意してください。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354707/8f68410e-900b-7b72-2875-7c4bf9e3729c.png)

ビルド毎にマップファイルが出力されるようになります。
Singularity Image Format について

# 概要

Singularity3 で、

Singularity Image Format(SIF) 形式のファイルを作成すると、どのようになるかを調べた

[sylabs/sif: Singularity Image Format \(SIF\) reference implementation](https://github.com/sylabs/sif)

# 感想

おそらく、SIFファイルがあれば、今後のバージョンの singularity でも、実行がサポートされているということなのだと考えている

# 結論

2019-08-02 の時点では、

- SIFのファイル１つでは、実行はできない。別途 singularity が必要。

## 実際の作業

実行に使った singularity は、以下

```
$ singularity3 version
3.2.1
```

以下のコマンドで、SIF(Singularity Image Format)ファイルを作成した。

```
sudo singularity3 build lolcow.sif docker://godlovedc/lolcow
```

このファイルの１行目は、以下のようになっている

```console
$ head -n 1 lolcow.sif
#!/usr/bin/env run-singularity
```

`run-singularity` の中身の実際コマンドを実行する近辺は、いかのようになっている。

```
# Simple wrapper for 'singularity run'

exec /usr/bin/env singularity --quiet run "$@"

exit 255
```

なので、SIFを作っても、実行するシステム上には、singularityが必要で、SIFファイルだけ保存しておけばよいということではないということがわかった。（2019-08-02現在）

## 参考情報

[Singularity static binary · Issue \#745 · sylabs/singularity](https://github.com/sylabs/singularity/issues/745)
VScodeでマークダウンの結果を横に表示させる方法

`.md`ファイルでマークダウン形式の文章が記述できますが、Qiitaでの記事編集のように、横に結果を表示させたいという場合の対処法です。

# 環境
Mac
VScode

# VScodeの設定
`.md`ファイルを開いた後に、`command + k`を押してから`v`を入力
結果は下記の通り

![Screen Shot 2019-08-02 at 15.12.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/a05a86a9-3743-0f32-d497-c1378e41a486.png)

# 参考
[VS CodeでMarkdownをプレビューするには？](https://www.atmarkit.co.jp/ait/articles/1804/20/news030.html)
parcel-plugin-workbox-precacheを使ってみた

くぼひさです

**注意！**

現在、２０１９年８月５日時点に置いて、

service_worker.js:153 Uncaught TypeError: workbox.precacheAndRoute is not a function
　　　at Object.<anonymous> (service_worker.js:153)
　　　at newRequire (service_worker.js:79)
　　　at service_worker.js:113
　　　at service_worker.js:152
(anonymous) @ service_worker.js:153
newRequire @ service_worker.js:79
(anonymous) @ service_worker.js:113
(anonymous) @ service_worker.js:152

(index):1 Uncaught (in promise) TypeError: Failed to register a ServiceWorker: ServiceWorker script evaluation failed

とエラーが出ます。以上のエラーが出なくなるまで、parcel-plugin-workbox-precacheを使わない方が良いと思います

**以上、追記**

[parcel-plugin-workbox-precache](https://www.npmjs.com/package/parcel-plugin-workbox-precache)でHTML5のアプリをPWA化したのでメモを残しておきます

以前は、[parcel-plugin-sw-precache](https://www.npmjs.com/package/parcel-plugin-sw-precache)を使っていたのですが、古いライブラリなので現行のworkboxへ対応したく、調べたら、parcelでworkboxを使えるライブラリを見つけました

基本的にはマニュアル通りですが、workbox-buildを使っているので、

hoge> npm install workbox-build -D

でインストール。でないと、

Plugin parcel-plugin-workbox-precache failed to initialize: Error: Cannot find module 'workbox-build'

ってエラーが出ます

あとは、「service_worker.jsを置く所はindex.htmlと同じディレクトリ」って部分で。それらを守れば

hoge> npx parcel index.html

で、PWAが出来ます

とりあえずは、index.htmlのあるディレクトリのファイルのみでサブ・ディレクトリのファイルはキャッシュ出来ないけど、PWAにはなる状態ですね

（調べた所、index.htmlのあるディレクトリのファイルしかキャッシュ出来ない、簡易的なPWA生成ライブラリでした）

他にもnpmにはparcelとworkboxへ対応しているパッケージはあるけど、エラーが出るので、個人的には、それらを使える風になるか確かめながら、parcel-plugin-workbox-precacheを使う予定です

では、良いプログラムを
今更ながら。。。。

index.html
HTMLを記述するファイルです。
このファイルに書かれたものが実際にブラウザに表示されます。

style.css
style.cssは、htmlファイルでこのファイルを読み込むことでスタイルを適用させます。
style.cssファイルを直接編集するのではなく、sassコマンドを実行することでstyle.cssファイルを作成・更新します。
sassコマンドについては、課題を始める前に説明するので、ここでは気にせずに進みましょう。

stylesheetsフォルダ
stylesheetsフォルダは、すべてのscssファイルを管理するフォルダです。
scssファイルを追加する場合は、styelsheetsフォルダ内に作成しましょう。

style.scss
このファイルですべてのscssファイルを@importで読み込むことで、一つのsassファイルに統合します。

以下は@importを使用してscssファイルを読み込む例です。
ダウンロードしたプロジェクト内のstyle.scssに以下の記述を追加する必要はありません。

_reset.scss
ブラウザによって初めからcssがそれぞれのhtmlに設定されています。
そのCSSによって、意図しないデザインになってしまうことがあります。
そのようなことを防ぐために、初めにブラウザごとのCSSをすべてリセットします。
このようにブラウザごとのCSSを打ち消すCSSのことをリセットCSSといいます。

有名なリセットファイルは以下のようなものがあります。
- YUI 3
- Eric Meyer’s
- HTML5 Doctor
- normalize.css

configフォルダ
configフォルダは、プロジェクトの設定ファイルや、scssで使用する変数を定義するファイルなどを管理するフォルダです。

mixinフォルダ
mixinフォルダは、scss内で使用するmixinファイルを管理するフォルダです。

modulesフォルダ
modulesフォルダはモジュールを管理するためのフォルダです。
モジュールとは、いくつかの要素をまとめた部品の集合という意味です。
ヘッダー、フッターのような用途ごとに分けることができます。
モジュールを使うことでまとまったCSSを独立したものとして管理することができます。

vendorフォルダ
vendorフォルダは、ライブラリのファイルを管理するフォルダです。
cssにはライブラリと呼ばれるものがあります。
ライブラリとはあらかじめCSSが書かれたファイルです。
有名なCSSのライブラリでは、bootstrapがあげられます。
ライブラリを効率よく利用することで、コーディングのスピードが格段に上がります。

overrideフォルダ
overrideフォルダは、vendorフォルダに格納してある外部のライブラリを上書きするためのscssファイルを管理するフォルダです。
周回遅れで流行りのスターリンソートをJavaScriptで実装してみた

# スターリンソートとは

Qiitaで同様のタグを見てみるとよくわかると思います。
私の認識では
ソートされていないデータがあったらその要素を除去（粛清）することで、
要素をソート（できてなくない？！）するというものらしいです・・・。
これは本当にソートなのか？！（汗）

## 参考

実装の際にサンプルにしたのは、スターリンソートの提唱者？っぽい人のソースコードです。
[GitHub](https://github.com/gustavo-depaula/stalin-sort/blob/master/javascript/stalin-sort.js)に色々公開されていました。

```javascript
// 引用元 https://github.com/gustavo-depaula/stalin-sort/blob/master/javascript/stalin-sort.js
function stalinSort(array) {
//  if (!Array.isArray(array)) throw new TypeError('Argument must be an Array!');

  let [holder] = array;
  return array.filter((el, i) => {
    if (i === 0) return true;
    if(el >= holder) {
      holder = el;
      return true;
    }
    return false;
  });
}
```

ふむふむ・・・なるほど？~~わからん~~

## JavaScriptでワンライナー実装♪

```javascript
let myStalinSort = (arr) => ((arr, tmp = arr[0]) => { return arr.filter((v) => !(tmp > v) ? tmp = v : false)})(arr)
```

@htsign 様にご指摘いただいてtmpを宣言する場所を変更しました。。。。
ありがとうございます。

## 結果確認

確認用コードは以下の通り。（テストデータはQiitaにある色々な記事から参考にさせていただきました）

```javascript

const data = []
const pattern1 = [1, 2, 1, 1, 4, 3, 9]    // answer: [1 ,2 ,4 ,9]
const pattern2 = [1 ,3 ,4 ,2 ,3 ,7 ,3 ,9] // answer: [1 ,3 ,4 ,7 ,9]
const pattern3 = [6 ,2 ,5 ,7 ,3 ,8 ,8 ,4] // answer: [6 ,7 ,8 ,8]
data.push(pattern1)
data.push(pattern2)
data.push(pattern3)

// 引用元 https://github.com/gustavo-depaula/stalin-sort/blob/master/javascript/stalin-sort.js
function stalinSort(array) {
// 参考にのせたやつ・・・
}

let myStalinSort = (arr) => ((arr, tmp = arr[0]) => { return arr.filter((v) => !(tmp > v) ? tmp = v : false)})(arr)

data.map((arr) => {
  const purged = myStalinSort(arr)
  const answer = stalinSort(arr)
  console.log(purged, answer, `result: ${purged.toString() == answer.toString()}`)
})
```

### 結果

```bash
 $ node ./app.js 
[ 1, 2, 4, 9 ] [ 1, 2, 4, 9 ] 'result: true'
[ 1, 3, 4, 7, 9 ] [ 1, 3, 4, 7, 9 ] 'result: true'
[ 6, 7, 8, 8 ] [ 6, 7, 8, 8 ] 'result: true'
```

あっていそうですね！

## 解説

なんとかワンライナーにしたかったので、以下の工夫を入れています。

* 即時実行関数を生成し、`tmp`変数の初期化をその中で実施しています
* `!(tmp > v) ? tmp = v : false`
    * JavaScriptの特性を利用しています。。。
    * `tmp = v` はtrueが返ります。

```bash
node
> console.log(tmp = 100) // 100が返る？！
100
undefined
> console.log(!!(tmp = 100)) // 0やemptyではないのでtrue
true
undefined
```

## 最後に

他の言語でもやってみたいけど、JavaScriptがササっと書けるからついついJSでばっかり書いてしまう今日この頃・・・
コメントお待ちしております！
【Bash】複数ファイルの拡張子をglobパターンを使って一括置換する方法

あるディレクトリ配下の`.js` ファイルを一括で `.ts` に変更したかった。

# 方法
たとえばディレクトリ構成が以下のようになっていたとする

```
.
├── fuga
│   └── js
│       ├── 1.js
│       ├── 2.js
│       ├── 3.js
│       └── 4.js
└── hoge
    └── js
        ├── 1.js
        ├── 2.js
        ├── 3.js
        └── 4.js


```

下記のコマンドを入力する
`find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;`

特定のディレクトリを除外したい時は `! -path` でディレクトリをしていする。
`find . -name "*.js" ! -path "./node_modules/*" ! -path "./build/*"`

# 参考
- [How do I rename the extension for a bunch of files?](https://stackoverflow.com/questions/1224766/how-do-i-rename-the-extension-for-a-bunch-of-files)

検索キーワード: `bash rename multiple files extension`