OmniAICreator/Qiita-1.07M huggingface dataset:
ScriptLabの私的メモ

まだ書きかけだけど、晒します。

前記事に、[Officeアドインの開発を試してみる方法](https://qiita.com/y__na_ka_ya_ma/items/f8cd0b81987f7321a30f)があります。

# ScriptLabとは

OfficeでJavaScript API を使えるようにする Add-In です。
ScriptLabは、Excel、Word、PowerPoint（Office 2013以降、Office Online、Office for Mac）で動作します。
ソースコードはの[コミュニティ](https://aka.ms/scriptlab)に公開されています。
ScriptLabを使うと以下のことが出来るようになります。


- JavaScript、HTML、CSS、およびウェブ上のライブラリやデータへの参照を含むことができるコードスニペットの作成編集。
- スニペットを実行し、タスクペインとOfficeで即座に結果をに確認できます。
- サンプルを選択するだけで、簡単にお試しができます。
- GitHubGist を使ってスニペットを保存し共有することが出来ます。要GitHubアカウント
- IntelliSenseの助けを借りてJavaScript APIを学習できます。
- TypeScript2.0以上の機能が利用できます。例えば、ラムダ関数、テンプレート文字列、async / await
- Office Add-Inのプロトタイプ開発が手軽にできます。
- ~~ベータ版にすると、ユーザ定義関数を作成して使用できます。~~ 
- 最新のProduction Version1.1.0(2018-06-01)ではユーザ定義関数が有効になりました。


# インストール
他のソフトウェアをインストールしたり、環境を設定する必要はありません。
Officeを利用している限り、数秒で起動できます。
ExcelにScriptLabの導入は、挿入タブからストアをクリックしOfficeアドイン検索のScriptで見つかるので、追加します。
すると、リボンタブにScript Labのタグが表れます。
Script Groupに、Code,Run,Functionsがリボンとして表示されます。


# Code
Script GroupのCodeをクリックするとExcelの右側に、Code窓が開きます。
最初はSamplesが窓中に表示されると思います。
一番左隅の三本線をクリックすると、黒い画面と三本線の隣に人型のアイコンが表示されるので、
それをクリックして、GITHUB にログインします。
一度ログインすると、次回から自動的にGITHUBに接続してくれます。（解除する方法はないのかな？）
＋New snippetを押すと、Code/Scriptに以下のコードが表示されます。

```javascript
$("#run").click(() => tryCatch(run));

async function run() {
    await Excel.run(async (context) => {

        OfficeHelpers.UI.notify("Your code goes here");

        await context.sync();
    });
}

/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
    try {
        await callback();
    }
    catch (error) {
        OfficeHelpers.UI.notify(error);
        OfficeHelpers.Utilities.log(error);
    }
}
```


# Run
リボンRunを押すと、Code/HTML の内容が表示されます。

```html
<button id="run" class="ms-Button">
    <span class="ms-Button-label">Run</span>
</button>

```



# Functions

```javascript
/** @CustomFunction */
function add10(x: number): number {
 return x + 10;
}
```
をコード（スニペット名：Add10）に貼り付けて、functionsをリフレッシュすると使用出来るようになります。
=ScriptLab.Add10.add10(…)で呼び出せます。この場合、非同期なので、動作が少し遅いので、
[ここ](https://docs.microsoft.com/en-us/office/dev/add-ins/excel/custom-functions-overview)を見て同期にすると返しが早くなります。


# ScriptLabを使用しない場合

1. 適当なディレクトリ（例えばC:Manufest）を作成します。
2. 作成したディレクトリを右クリックで、アクセスを許可し、共有領域とします。
3. [サンプル](https://github.com/OfficeDev/Excel-Custom-Functions)のxmlファイルを共有にしたディレクトリにコピーします。
4. nginxを立ち上げ、WEBアクセス出来るように、サンプルをコピーします。（ポート番号は同じにする）
5. Excelのファイル/オプションでセキュリティセンターを開き、セキュリティセンターの設定を開きます。
6. セキュリティセンターの設定から、信頼できるアドイン　カタログを開きます。
7. 信頼できるカタログのアドレスに、共有領域のフルパスを入力しカタログを追加します。
8. その際に、メニューに表示するのチェックを忘れずに。
9. 挿入タブから個人用アドインをクリックするとOffce アドインが表示されます。
10. 共有ホルダーが登録することにより表示されるので、クリックすると追加したxmlの内容が表示されています。
11. サンプルを選んで、追加ボタンを押すとアドインが追加されます。
二分探索について

# 二分探索とは
二分探索(binary search)とは、探索アルゴリズムのひとつ。
ある値が配列(リスト)にあるかを確認する場合、中央の値と比べてその値の大小を判断して、検索したい値が中央より右側にあるのか、左側にあるのかを判断して検索を進めるアルゴリズム。

# 単純探索とは
単純にヒットするまで、要素を順番に探索するアルゴリズム。

# 例
下記のようなソート済み配列があり、検索したい値が`5`の場合
>[1, 2, 3, 4, 5];
>searchedValue = 5;

単純に前方(1)から検索して探索を行うと、五回目でヒットするため計算量は`5`になる。このようなアルゴリズムを**単純探索**という。
もし検索したい値が`1`なら一回目でヒットする。
しかしアルゴリズムのパフォーマンスは**最も計算量が多い場合（つまり最悪の場合）**が計算量となるので、計算量は`1`ではなく`5`となる。
つまり検索したい値が何であろうが、単純探索を行う場合の計算量は***O(N)***となる。（Nは要素の数）
そのため単純探索は検索する配列の要素数が増える程、計算量も増加していく。

**二分探索**で探索を行う場合、まず中央値である`3`と検索したい値`5`を比べる。
`5`は`3`以上のため、この場合は`3`よりも右側に存在することが分かる。
次に`4`と検索したい値の`5`を比較してまだ`5`の方が大きいため再度比較処理を行う。
最後に`5`と検索した値の`5`を比較して、同値なのでヒットで修了。
ここまでの手順で計算量は'3'となり、二分探索を行う場合の計算量は***O(log2N)***となる。

# 計算量
上記を踏まえてそれぞれの計算量を比較すると下記になる。Nは要素数
> 単純探索 = O(N)
> 二分探索 = O(log2N)

単純探索は**要素数と同じ数**が計算量となる。

二分探索は**要素以上になるまで、2を二乗した値**が計算量になる。
例えば要素が10なら
> 10 <= 2*4 

となるので計算量は`4`となる。

# まとめ
ソートされている配列の場合、単純探索よりも二分探索の方がパフォーマンスがいい。
EditTextにフォーカスをあてたときにだけ表示するようにするTips

#概要

EditTextにフォーカスをあてたときに独自のkeypadを表示するようなときに使えそうなTips
- 画面表示時にはkeypadを表示しない
- EditTextをタップしたときに表示する
- ホームキータスクキーを押したあとにアプリに戻ってきたときに表示しない

# 詳細

## 画面表示時にはkeypadを表示しない
setFoucusableにfalseを指定

## EditTextをタップしたときに表示する
setFoucusListnuerとsetOnClickListnerに表示する処理を追加
setFoucusListnuerにも処理を追加しないと何故か１回目にEditTextをたっぷしたときに表示されない
表示する処理を追加するときに
setFoucusable true
setFoucusableTouchMode true
を追加してあげる

## ホームキータスクキーを押したあとにアプリに戻ってきたときに表示しない
よくある間違い
フォーカスが当たらなければいいから他のViewにrequest forcusする

多分大丈夫
onPauseでsetFoucusableにfalseを指定
※違うとかもっといい方法があるとかあれば教えてください
スキルアップ目的：「遠心力」

https://keisan.casio.jp/exec/system/1245903825
https://jsfiddle.net/ghost7492/rnadk633/

ただ単に遠心力の勉強になった。
角速度って名前がかっこいい。

物理系は、単位の変換が多いので、それらを最初に関数定義すると、
後がスムーズかなと印象。

最初に実行される処理の関数名はstartにしようかな。
CentOS 7 で ssh-copy-id ができなかったときの対処法

#概要
Vagrant などで CentOS 7 マシンを建てたあと、
ssh-copy-id コマンドで公開鍵を送り込もうとした際に、

```
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

のエラーが出た場合の対処法。

#原因
centOS 6 までとは違い、CentOS 7 からはパスワード認証がデフォルトで無効になっているようです。

ssh-copy-id は接続先マシンのパスワードを要求するため、パスワード認証ができないと問答無用でエラーになってしまいます。

#対処
ホストOSから鍵を送る対象のマシンにSSHでログインし、
/etc/ssh/sshd_config の PasswordAuthentication の項目を一旦 yes に変更します。

```/etc/ssh/sshd_config
PasswordAuthentication yes
```

変更を反映させるために

```
$ systemctl restart sshd
```

で sshd を再起動すれば、上述のエラーは出なくなると思います。

※セキュリティの観点から、鍵を送った後は PasswordAuthentication を no に戻したほうがいいと思います。
欠損行にスペースが含まれる場合のクリーニング方法。pandas データフレーム。

投稿順番が前後するが（投稿済みの記事が編集できない）、
もし欠損行にスペース（空白ではなく、スペース）が含まれる場合は、以下の流れでクリーニングをする。

１、スペースを削除
　df[columnname].str.strip()
２、空白文字列　""　をnp.nanを置き換える。
３、欠損数をカウントする。
Geditで設定が変更できなくなった時の対処法

下記のエラーでハマった時

    dconf-WARNING **: failed to commit changes to dconf: Could not connect: Connection refused

### 原因

最初に Root 権限で Gedit を使っちゃったから （sudo gedit）

### 対策

下記実行で正しい状態になります。以降はGeditを普通につかえるはず

    sudo -i
    gedit &


この場合 .config/dconf を消したりしても治らないようです。

## 参考


- dconf-WARNING **: failed to commit changes to dconf: The connection is closed
    - https://unix.stackexchange.com/questions/182925/dconf-warning-failed-to-commit-changes-to-dconf-the-connection-is-closed/417422
スキルアップ目的：「等速度運動（往復の平均速度）」

https://jsfiddle.net/ghost7492/da7at687/

そもそも、公式を関数化すれば楽なことに気がついた。

これぐらい、シンプルな方が、作っていて楽しい。
画面サイズ変更により、見た目がグロくなるのは、追々、修正できるようになろう。
NewRelic University workshopに行ってきました

2018/5/28(月)に東京で行われたNew Relic University workshopのレポートです。

# 事前知識
興味はあって、調査目的で触ったことあり。
・php版をローカル開発環境windows+vagrant(centos)に導入
　さっくり動いたので、APMとBrowserをポチポチ触る。
　気に入ったので現場でプレゼンし、いくらか肯定的な反応を得るものの主にコスト面で導入見送り。

・nodejs版をローカル開発環境windows+vagrant(centos)に導入
　create-react-appで作ったプロジェクトにAPM入れたときはnative-metrics関連でドハマリして中断。
　結局browserのみ触り中。
　reactとか無しのシンプルなhello worldなら構成ならAPMも動いた。

# 事前にいいなと思ってたところ
・(APM)Transactionsで遅い箇所の特定が容易で超便利
　普段は閾値超えた場合のアラートしかみてなかったりする。
・(browser)javascriptのエラーログ収集が自動でできる（有料版限定）
　普段はwindow.onerrorや通信エラー処理にそれぞれ個別で仕込んでいる。
　

# 事前に困っていたところ
・値段が結構するので、気軽に導入するにはちょっと辛い
・設計上必要とはいえ、SQLのクエリなどの情報を社外サーバに出すことに拒否感を感じる人もいる
・日本語情報が少し少なめ、古いのも結構ある
・UIが英語（分かりやすいので個人的には気にならない）
・トライアル中に有料の機能と無料の機能が分かりづらい（例えばjavascriptのエラーログは有料版のみ）

# 当日の発表メモ
・APM
　メイン機能。
　Appdex Score: ユーザの満足度の指標。
　クラス名、メソッド名指定での確認。
　エラーのグルーピングができる。（ホスト別とかエラーコード別とか）
　デプロイ毎のパフォーマンスがみえる。
　key transaction: 重要なものに絞り込んでdumpとれる。
  

・Browser
　ブラウザ監視。
　アクセスしてきたブラウザとか国とか見える。
　session tracesでイベントログも見えるのでユーザの操作もある程度追える。
　どの要素をfocusしてclickして、それぞれ何msかかったとか。
　Chrome開発ツールのperformanceタブみたいに画面キャプチャが見えたりはしない。
　デモではhtmlタグのclassが明確で便利そうだったが、material-ui使ってるとこんな形になってしまうのが残念。
![newrelic_browser.png](https://qiita-image-store.s3.amazonaws.com/0/244191/68c15317-dabc-4b40-74c3-3cba44ce97e7.png)

・Synthetics
　外形監視。
　pingとかselenium的なのでスクリプト書いてレスポンス見たりキャプチャ取ったり。
　海外のいろんな拠点から行える。
　
・Infrastructure
　インフラ監視。
　CPUとかメモリとかスループットとか。
　ログインなどのイベントや、パッケージの情報なども管理できるのは他ではあまりなさそう。

・Mobile
　ネイティブアプリのみ。
　どの画面が何回呼ばれたりとか、そのパフォーマンスをみたりする。
　バージョンごとのパフォーマンス比較もできる。
  crash analytics: クラッシュ時のスタックトレースとかみえる
  crash trail: クラッシュ前のイベントが追える？
　handled exception: ハンドルした例外も見える。
　handled exceptionやcrash trailは他ではあまりなさそう。

・Insight
　独自のクエリ言語で検索できる（NRQL）
　他の標準グラフは１分間の平均だが、これなら個別のデータも追える。
　カスタムダッシュボードでアカウント毎に知りたい情報だけ表示とかできる。
　あったら便利ではあると思うけど、今までの現場の感じだと使う人は限られてそうなので活用しきれるかは怪しい。

・Alert
　他機能と連携して、閾値超えてインシデントになったときと、解消したときに通知（メールとかslackとか）
　インシデント発生中ずっと送り続けたりはしない（insightで擬似的にそれをすることはできるらしい）
　他の機能との連携はあるにせよ、既に行っているものだったのであまり惹かれず。

・今後の追加機能
　体力切れと駆け足だったのであまり覚えてませんm(_ _)m

トラブルで時間が押してたので質疑応答などは無し。

# 感想
代休余ってたのと、無料だったので参加しましたが面白かったです。
ランチにお土産のTシャツやステッカーなども充実してました。

発表内容はNewRelicの網羅的な機能説明という点ではわかりやすかったですが、
個人的にはもうちょっと独自性とか、競合と比較した場合の強みなどが見たかったです。

ハンズオンの内容は既に触ってる人には簡単だったかも。
逆に言えば全く触ったことのない人でも大丈夫そうでした。

もっと流行ってどこでも使えるようになりますように。
python データフレームで欠損値の扱いが不便。Not欠損値行のカウント方法

連続３つの投稿をした。あとでまとめる。
とりあえず、混乱の原因になったことを以下にメモ。

A 欠損値ではない行のカウント方法
df[columna_name].notnull().sum()

B python データフレームのややこしい（めんどくさい点）は、
１、もし手持ちのデータセットの空白が欠損の場合にはnp.nanで埋めなければならないこと。
２、欠損値を含めたサマライズをする方法がないこと。例えば、Series.describe()では欠損値はカウントされない。また全体の行数も表示されない。そのため、欠損行の数を見るためにはわざわざ以下を書かなければならない。
df[columna_name].isnull().sum()
Pandas python データフレームのある列（シリーズ）のスペースをNull値にする方法。

データフレームのある列（シリーズ）のスペースをNull値にする方法。
df[colname_main].replace(" ", np.nan)

参考リンク
上記のやり方が記載されいるサイトhttp://nekoyukimmm.hatenablog.com/entry/2015/10/02/113324

pythonとRの欠損と空白の扱いの違いについての参考サイト
https://qiita.com/TomokIshii/items/c7c704f22edfebf7f133
自分が使っているCLion (IntelliJ IDE) のPlugins


CLionに関する記事が少ないのでちょっとしたことでも役にたてばということで自分が使っているpluginを書いていきます

# おすすめplugin

## Markdown support

markdown形式のファイルを書いたり読んだりできるもの。markdown形式を編集しようとしたらポップアップでインストールを勧めてくるので知っている人が多いと思う.

## [Key Promoter X](https://github.com/halirutan/IntelliJ-Key-Promoter-X)

CLion上でなにかしようとしたとき(Preferencesを開くときとか）にもし対応するショートカットがあった場合ポップアップでショートカットキーを教えてくれる.一回表示したものは表示しないようになっているが表示したものの履歴を消したらもう一回出してくれる。

## [Copy/Paste Stack](https://github.com/kstenschke/copypastestack-plugin)

テキストをコピーした履歴を残してくれる。これによって複数のテキストを予めコピーしておいて貼り付けることができる.

## [CamelCase](https://plugins.jetbrains.com/plugin/7160-camelcase)

選択した部分をキャメルケースやスネークケース、パスカルケースに簡単に変換してくれるplugin. Alt + shift + U　で順番に変換してくれる

## [Makefile support](https://plugins.jetbrains.com/plugin/9333-makefile-support)

makefileのテキストハイライトを行ってくれるplugin.cmakeの使い方を知ってから使わなくなった

## [Rainbow](https://github.com/zjhmale/intellij-rainbow)

テキストハイライトに関するpluginで対応するカッコを同じ色にしてくれる.
変数も虹色にハイライトしてくれる用になった.
<img width="810" alt="dark.png" src="https://qiita-image-store.s3.amazonaws.com/0/141779/85d432ec-bb82-fe55-4e2c-cc634c6bcd65.png">

## [Nyan Progress Bar](https://plugins.jetbrains.com/plugin/8575-nyan-progress-bar)
プログレスバーの見た目を可愛くしてくれる.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141779/ecea5dbf-d533-99ab-a017-438f2e908506.png)


## その他

### [CLion Plugins](https://plugins.jetbrains.com/clion)
プラグインを探す場合はJetBrainsのサイトから検索することができます。お気に入りのプラグインを探しましょう


# まとめ

JetBrains製品のプラグインは複数のエディタに対応しているのでClion以外のエディタのpluginを探してみるといいものがあるかも
またプラグインが増えたら追記していきます
Pandasデータフレームの名義変数で構成される列の内容を知る（表現）する方法。

名義変数のPandasデータフレームの列の内容を知る（表現）する方法。
こちらも意外とすぐ検索で見つからないためメモ。
(3、４を7/4/2018に追記）

１、df[something].describe()
データの数、ユニークバリューの数等はわかる。
名義変数の種類や頻度はわからない。
欠損数もわからない。

2、df[something].value_counts()
私が知りたい、使いたいのはどちらかというとこちら。

３、上記の２でうまくいっていると思っていたことが、うまくいっていなかった。
ある列が名義変数（２値変数,例えば0or1）で示されている場合、以下で把握することができると思っていたが、それをfor文で回すと、値として格納されている、0or1がどちらにくるのか予想できないことが判明。
df[something].value_counts()[0]
df[something].value_counts()[１]

よって、以下のように値を指定して、要素数をカウントをすることとした。
df[something][df[something] == 0].count()
df[something][df[something] == 1].count()

４、おまけ。そうかCount()使えば一貫したコードになると考え、Null値も同様の方法でカウントしようとしたが、要素として格納されているNan値はCount()することができない。実行すると0が帰ってきてしまう。よって、Nanのカウントは以下のように記載した。ややこしい。
df[something].isnull().sum()

参考サイト
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html
https://note.nkmk.me/python-pandas-count-condition/
Refileでフォームを使わずにファイルを保存する

Seedデータなど入れる際にpublicフォルダなどにサンプル画像を用意して、そこからからデータを引っ張ってきたい場合はよくあると思います。


こんな感じでシンプルに書くことができました。

```rb
post = Post.new
image = "ファイルの絶対パス"
post.image = File.open(image)
post.save
```


もしファイルが別のモデルに保存されてる場合は

```rb
original_image = Image.find(1)
image = original_image.image.current_path
```
こんな感じ
Bootstrapを使ったCSSの見た目微修正チートシート

## Bootstrapでできること

サクッとサイトを作りたいときは、下記のような理由からBootstrapを使うと便利です。
1. Layout: レスポンシブサイトを実現するためのGridシステムが用意されている。
2. Content / Component: ボタンやリストやテーブル、カードといったコンポーネントが用意されている。
3. Utility: 幅や線のありなし等細かい見た目を調整するためのユーティリティが用意されている。

と、CSS・jsに関する様々な要素がパーツ化されており、それらを組み合わせるだけでデザインが苦手な人であっても普通のUI、使い勝手が良いUXを簡単に実現できます。
使い方としては、`1.Layout`は基本的にGridシステムやレスポンシブ対応に関する理解をすればよく、`2.Content/Component`は該当するコンポーネントを使いたい度に[本家のサイトのDocumentation](https://getbootstrap.com/docs/4.0/getting-started/introduction/)を見てHTMLをコピペすれば事足ります。
しかし`3.Utility`に関しては微調整できる対象が多岐にわたるため、Bootstrapでできるのかそれとも自分でCSSを書かないといけないのかわからなくなることがちょこちょこあります。その度に
毎回調べるでも良いんですが、なかなか手間なので個人的によく使う、よく調べるもの一覧をチートシートにしました。大事だと考える順で並べています。

## よく使うUtility一覧｜微調整チートシート

|効果|Classの書き方|
|---|---|
|Paddingの全体もしくは一部の幅を5段階で規定する|`p-0`,`pt-1`,`pr-2`,`pb-3`,`pl-4`,`p-5`など、Top,Right,Bottom,Leftと5段階の幅の組み合わせ|
|Marginの全体もしくは一部の幅を5段階で規定する|`m-0`,`mt-1`,`mr-2`,`mb-3`,`ml-4`,`m-5`など、Top,Right,Bottom,Leftと5段階の幅の組み合わせ|
|PaddingとMarginのレスポンシブ対応|`m-sm-0`,`pl-xl-4`など上記の中間にデバイスの数値を挿入するとそのデバイスでのみスタイルが適応される|
|文字の大きさ1|`h1`~`h6`をタグとは別に独立したClassとして利用できる|
|文字の大きさ2|`h1`よりも大きな文字は`display-1`~`display-4`で指定できる|
|文字を小さく(80%に)する|`small`|
|文章(Inline要素)の左・中央・右寄せ|`text-left`,`text-center`,`text-right`|
|文字の太さを変える|`font-weight-bold`,`font-weight-normal`,`font-weight-light`|
|改行があっても文字間の間隔を均等にする|`text-justify`|
|文字の色を変える|`text-primary`など`text-`につなげて色を指定する。`text-muted`は文字色を薄くできる|
|背景の色を変える|`bg-primary`など`bg-`につなげて色を指定する|
|全体もしくは一部を枠線で囲む|`border`,`border-top`,`border-right`,`border-bottom`,`border-left`|
|全体もしくは一部の枠線をなくす|`border-0`,`border-top-0`,`border-right-0`,`border-bottom-0`,`border-left-0`|
|適用されている枠線の色を変える|`border-primary`など`border-`につなげて色を指定する|
|全ての角を丸める|`rounded`|
|すべての角を直角にする|`rounded-0`|
|角を完全に丸めて円にする|`rounded-circle`|
|影の幅を4段階で規定する|`shadow-none`(影なし),`shadow-sm`,`shadow`,`shadow-lg`|
|横幅の広さを4段階で規定する。25%から100%まで|`w-25`,`w-50`,`w-75`,`w-100`,`w-auto`|
|Widthより長い文章でも改行しない|`text-nowrap`|
|Widthより長い文章(Block要素)を切り落として『...』|`text-truncate`|
|要素の上・中央・下揃え(Inline要素)|`align-top`,`align-middle`,`align-bottom`|
Go 言語で Google Cloud Storage の既存のバケットにオブジェクトを保存する

### まえがき
[ドキュメント](https://cloud.google.com/storage/docs/reference/libraries#client-libraries-install-go)を見れば、簡単に書けるかと思います。

ただ、新規バケットではなく、既存バケットにオブジェクトを保存する方法が記載されていないように見えたので、サンプルコードを残します。

### 前準備
ライブラリや、認証については[ドキュメント](https://cloud.google.com/storage/docs/reference/libraries#client-libraries-install-go)をご確認ください。

### サンプルコード

```go
package main

import (
    "fmt"
    "log"

    "cloud.google.com/go/storage"
    "golang.org/x/net/context"
)

func main() {
    ctx := context.Background()

    client, err := storage.NewClient(ctx)
    if err != nil {
        log.Fatalf("クライアント作成失敗: %v", err)
    }

    bkt := client.Bucket("保存対象のバスケット名")

    obj := bkt.Object("オブジェクト名")
    w := obj.NewWriter(ctx)
    // オブジェクトにデータを書き込む。すでにオブジェクトが存在する場合は上書きする。
    if _, err := fmt.Fprintf(w, "Hello World!"); err != nil {
        log.Fatalf("書き込み失敗: %v", err)
    }
    if err := w.Close(); err != nil {
        log.Fatalf("Writer を閉じるのに失敗: %v", err)
    }
}
```
AWS Lambda関数の「Configuration is ambiguously defined」エラーへの対応

S3の更新をトリガーにして実行されるLambda関数の設定更新でハマったので後世のためにその対処方法を記しておきます。なお、2018年5月31日時点での情報になります。

## エラー概要
S3の変更をトリガーにしたLambda関数の新規作成または更新で発生します。
Lambda関数が作成、または更新できなくなります。

### エラー画面
![AWS-Lmbda-error2.png](https://qiita-image-store.s3.amazonaws.com/0/106217/c27afcee-a940-68be-12f5-e9266337276f.png)

###  エラーログ
```
Configuration is ambiguously defined.
Cannot have overlapping suffixes in two rules if the prefixes are overlapping for the same event type.
(Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; Request ID: XXX; S3 Extended Request ID: ZZZ)
```

発生原因は2つありますが私は `2` のケースに引っ掛かりました。
Lambda関数の設定更新とS3のバケットにトリガーイベントを設定するのはアトミックな処理になっていないようです。

1. 他のLambda関数がトリガーにしているS3のバケットを指定している
  - 仕様なのでどうにもならない
2. Lambda関数の更新に失敗して関数自体のS3のトリガー設定は消えたが、S3のバケットのトリガー設定は残っている

### 2のケースの対処方法
該当のS3のバケットの `プロパティ > Events` を開き、設定されているイベントを全て削除すればLambda関数が更新できるようになります。
以下のキャプチャはバケットにLambda関数のトリガーイベントが設定されている状態のものです。

![S3-config.png](https://qiita-image-store.s3.amazonaws.com/0/106217/0303c3e8-8368-1137-3919-797337d22763.png)


## 参考資料
以下のサイトを読んでS3のイベント設定の存在に気付きました。感謝。

[【AWS】Lambdaのトリガー設定時にS3のバケットを追加するとエラーになる時がある](http://blog.tgr.wtf/%E3%80%90aws%E3%80%91lambda%E3%81%AE%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E8%A8%AD%E5%AE%9A%E6%99%82%E3%81%ABs3%E3%81%AE%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B-433.html)
railsのcallbackに引数を入れる (after_create, before_create, before_build...など)

# 背景
callbackに引数を入れたい


知らないときは、Methodをわざわざ呼んでいた

```rb:app/models/user.rb
class User < ApplicationRecord
  after_create :send_notification

  def send_notification
    send_notification_with_args(%i[name account])
  end
end
```

#解決策

```rb:app/models/user.rb
class User < ApplicationRecord
  after_create -> { send_notification_with_args(%i[name account]) }
end
```

一行ですんだ。
VBAでバイナリファイルを読み込む方法　VBAで簡易バイナリビューア

VBAでのテキストファイル入出力の方法はよく知られていますが、バイナリファイルの扱い方はあまり知られていません。
自分が初学者の頃、よくわからなかったので、ここに記したいと思います。
For Binary　という宣言と  Get 命令を使う部分がポイントです。

例として、バイナリエディタを作れるとよいのですが、サンプルとしては、それは冗長になるので、バイナリビューアを作ってみたいと思います。

Excel上で動作します。

以下のソースとなります。

```VB:ソース
Sub Main()
    
    'ファイル選択ダイアログでファイルを指定
    Dim vFilePath As Variant
    vFilePath = Application.GetOpenFilename
    
    'キャンセルボタンを押されたら、処理終了
    If vFilePath = False Then
        End
    End If
    
    'ファイルサイズが０バイトの場合も処理終了
    Dim nFileLen As Long
    nFileLen = FileLen(vFilePath)
    If nFileLen = 0 Then
        End
    End If
    
    '空いているファイル番号を取得
    Dim iFile As Integer
    iFile = FreeFile
    
    '指定されたファイルを取得したファイル番号としてバイナリモードで開く
    Open vFilePath For Binary As #iFile
    
    'ファイルサイズ分のバイト配列を用意
    Dim bData() As Byte
    ReDim bData(0 To nFileLen - 1)
    
    'バイト配列に指定ファイルを展開
    Get #iFile, , bData
    Close #iFile
    
    Dim i As Long
    'ScreenUpdatingやらCalculationなどの高速化設定は割愛
    'バイナリデータをダンプ表示します。
    For i = 0 To nFileLen - 1
        y = i \ 16 + 1
        x = i Mod 16 + 1
        Cells(y, x) = "'" & Right("0" & Hex(bData(i)), 2)
    Next
    
End Sub

```

これが古くからのVBAでのやり方です。（ただし、弱点があり、ファイルパスに中国語文字などのUnicode文字が入ると、エラーとなります。）
輪読のススメ

みなさん、読書は好きですか？
私の家には読み終わっていない技術書がタワーのようにそびえ立っております。

そんな積読民におすすめしたいのが「輪読」です。

皆さんは「輪読」という言葉をご存知でしょうか？

```
【輪読】

数人が一つの本を順番に読んで解釈をし、問題点について論じ合ったりすること。「徒然草を輪読する」「輪読会」
```
簡単に説明すると、皆で同じ本を読んで「あーだこーだ」ディスカッションする事を言います。

今回は読書の秋にちなんで以前輪読を実際にやってみて、分かった事や感想などをまとめたいと思います。

## 実際にやってみた時のデータ
・人数：10人くらい
・使用した書籍：リーダブルコード（PDF版を購入）
・時間：毎週30分（読書時間20分、ディスカッション10分）
・一度に読める量、1、2章分
・一冊にかかった期間：3ヶ月
・議事録をつけ出た意見を毎回まとめる


## 準備したこと
■題材となる書籍の選定
■場所の確保
■時間の確保
■進め方の方針を決める

などを行いました。
書籍を選定する際はメンバーにアンケートを行い、
読みたい書籍を募集し、その中から候補をあげ、
投票を行って票数の多いものに決定しました。

輪読の方法ですが、いくつか方法があり、

**・事前の準備はせずに全員その場で時間を決めて書籍を読み、
感じた事、疑問に思ったことなどをディスカッションする**

```
◇メリット：読んだ後すぐにディスカッションするので、ライブ感、感想や疑問点にフレッシュさがある
◇メリット：その場で強制的に読む時間が与えられるので、全員が必ず読む
◇デメリット：集まった時間を各々の読書時間に当てるため、ディスカッションの時間は短めになる
```

**・読み進める範囲を決めて、各自読み進めておき、当日ディスカッション等をする**


```
◇メリット：集まった時間全部をディスカッションに使用する事ができ、深い所まで意見交換ができる
◇デメリット：宿題制にしてしまうと何人かは読んでこない人が出てしまう
```

**・当番制にし、当番の人は自分の担当箇所を読み込んで、資料を作成し、他のメンバーにアウトプットする**

```
◇メリット：アウトプットするために、真剣に読み込むため、インプットの質が上がる
◇デメリット：担当者の事前の準備が負担になってしまう
```

等があります。
それぞれにメリットデメリットがあるので、一緒に輪読をするメンバーと話し合って方針を決める必要があると思います。


## やってみた感想
**■ちりつもパワー**
週一回30分だけでしたが、毎週しっかり続ければ1冊の本が読め、
一人では挫折しそうな文字が多い技術書とかも輪読で読めば怖くない！と感じました。
また、読んだ後にディスカッションなどをするので、記憶が残りやすく、疑問もその場で相談したり議題に出して話し合う事ができました。
本を一冊複数人で読み通す事で、新しい発見とか、自分とは違う感想が生まれるので、一人で読むより世界が広がります。

**■課題はやっぱり出てくる**
発言する人と、しない人が固定されてしまうので、疑問や議題が出なくても感想を述べるようにしたり、
何かしらアウトプットを全員が出来るようにすると、程よい緊張感が生まれて良いかなと思いました。

**■書籍選定が楽しい**
よくあるエンジニアならこれ読んどけ系な鉄板な本、意外と読んでる人が少なかったりするので、時代に左右されずに何年も人気な本はみんな心のどこかで「読まないとなー」と思ってたりするので、輪読に丁度良かったりします。
また、書籍選定で読みたい本をアンケートで募集した時に色んな本が出てきて、どんな本が人気なのか？、どんな本にみんなが興味を持っているのか？がわかり、面白いです。



**■輪読ランチ会とか**
書籍購入とか、場所や時間の確保とかクリアしなくてはいけないハードルもありますが、実際にやってみて良い方法だと感じたので、また機会があればどこかでやってみたいです。


## 関連リンク
[■ LIG 読書の効果を楽しく高めるのにおすすめしたい「輪読」という方法](https://liginc.co.jp/life/useful-info/143226)
[■ ５つのステップでチームワーク向上！今話題の輪読会！](https://geechs-magazine.com/tag/lifehack/20160509)
zsh+Preztoのテーマ等をいじった話

#理由
zshのテーマをpureにして使用してた。
terminal上ではプロファイルをicebergにしてるから問題ないが
Atomのplatformio-ide-terminal上だととても見えにくかった
<img width="691" alt="スクリーンショット 2018-05-31 23.46.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/261299/ed5d7c29-cbff-e78f-b903-d969b5dcc951.png">


解決策1:ターミナルの見た目inverseにする
Atomの色を黒くしてるのでなし
解決策2:ターミナルのstyleをいじる
Atomのスタイルシートに書き込むことで自由に変えれるらしい。
灰色にしたがやはり色が合わなくてダメ
解決策3:preztoの方のテーマをいじる
これしかない

#実行
##テーマをいじる
[Customizing Your Prezto Prompt](http://mikebuss.com/2014/04/07/customizing-prezto/)
これによると
`~/.zprezto/modules/prompt/functions/`
にテーマがあるらしい
pureのファイルprompt_pure_setupがあったので
とりあえず本物はコピーして一旦退避

```
$ cp prompt_pure_setup prompt_pure_setup.org
```

110行目あたりに**#Set the path**とコメントされてるところがあるのでここらへんを変更

```zsh:prompt_pure_setup
# Set the path
preprompt_parts += ('%F{blue}%~%f')
```

blueのところを好きな色に変更
今回はcyanを選択
文字で指定できる色はred, blue, cyan, magenta 等
色は他のテーマのファイルを覗いたりすれば書いてあったりするので各自で探してください。

結果
<img width="682" alt="スクリーンショット 2018-06-01 0.11.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/261299/01b535ac-973d-2e91-46ce-1e074505705d.png">

カレントディレクトリはとても見やすくなったがlsコマンドでの
見やすさは変わらず。

##lsコマンドの色を変える
他のテーマとかも調べてたらどうやらテーマは関係なく、lsコマンドの方の問題そうなので
lsコマンドで表示される色を変えることに

(参考)[lsコマンドでの色を変える](https://qiita.com/cider-sk/items/9c6aaa66db80586399d8)

とりあえずこっちもcyanに変更

```zsh:~/.zshrc
#lsコマンドの色を変更
export LSCOLORS=gxfxcxdxbxegedabagacad
```

結果
<img width="681" alt="スクリーンショット 2018-06-01 0.19.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/261299/6001d695-5e57-5e6d-431b-080f6668f566.png">

とても見やすくなった

##ついでに
gitブランチの色も暗くて見づらいので変える
パスの色を変えた時と同様にprompt_pure_setupの方をいじる
**#Set the path**の少し上にgitの設定があるのでそこを変更する

```zsh:prompt_pure_setup
# Set color for git branch/dirty status ....
# been delayed
local git_color=242
```

242の所を変更すれば色が変わる模様
今回はyellowにしてみた

結果
<img width="687" alt="スクリーンショット 2018-06-01 0.29.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/261299/88f8bfc8-9775-04d1-4f2c-575badfd1fcd.png">
見やすくなった

##最後に
いじったpureの設定ファイルをmypureに名前を変えておく
また、元のpureの設定ファイルも元に戻しておく

```
$ mv prompt_pure_setup prompt_mypure_setup
$ mv prompt_pure_setup.org prompt_pure_setup
```

あとは`~/.zpreztorc`で作ったテーマを指定してあげる

```zsh:~/.zpreztorc
# Set the prompt theme to load.
# Setting it to 'random' loads a random theme.
# Auto set to 'off' on dumb terminals.
zstyle ':prezto:module:prompt' theme 'mypure'
```

#あとがき
初めての記事。
oh-my-zshでテーマを変えたサイト等は見つかったのだがPreztoの方はあまり見つからなかったのでとりあえず手探りでやったことをまとめてみた。
C/C++で日本語を扱いたい

# はじめに

C/C++では、日本語を扱うのが厄介な問題となる。

```cpp:bad_example1.c
#include <stdio.h>
#include <string.h>

int main() {
  char str[] = "日本語サンプル";
  int length = strlen(str);

  printf("1文字目: %c\n", str[0]);
  printf("長さ: %d\n", length);

  return 0;
}
```

```console
$ gcc -o bad_example1 bad_example1.c
$ ./bad_example1
1文字目: �
長さ: 21
```

このように、単なるchar型として扱うと日本語を上手く処理できない。まあ、日本語が2バイト以上で表現されているので当たり前といえば当たり前なんだけど。

そこで、C/C++で上手に日本語を処理するための方法を2通り紹介したい。

## ワイド文字を使う

ワイド文字は、16ビット固定長で表現される多言語文字体型のことである。

C言語では、wchar_t型を用いてワイド文字を扱うことができる。

しかし、ワイド文字を扱うには、ロケールの設定が必要である。日本語だけ扱い場合はja_JP.UTF-8にセットする。

:warning: localeの動作は処理系依存らしいので、下記のコードはWindowsやMacでは正常に動作しない可能性があります。

```c:example1.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>

int main() {
  setlocale(LC_CTYPE, "ja_JP.UTF-8");

  char str1[] = "(ﾟ∀ﾟ)( ﾟ∀)超( ﾟ)絶( )大(ﾟ )興(∀ﾟ )奮(ﾟ∀ﾟ)━ｷﾀｰ!!!!";

  // 十分なメモリ領域を確保
  size_t capacity = strlen(str1) + 1;
  wchar_t *str2 = (wchar_t *)malloc(sizeof(wchar_t) * capacity);

  // char -> wchar_tの変換
  int result = mbstowcs(str2, str1, capacity);

  if (result <= 0) {
    fprintf(stderr, "マルチバイト文字列の変換に失敗\n");
    return EXIT_FAILURE;
  }

  printf("バイト長: %lu\n", capacity - 1);
  printf("長さ: %d\n", result);

  // 十分なメモリ領域を確保
  capacity = wcslen(str2) * 6 + 1;
  char* str3 = (char *)malloc(sizeof(char) * capacity);

  // wchar_t -> charの変換
  result = wcstombs(str3, str2, capacity);

  if (result <= 0) {
    fprintf(stderr, "ワイド文字列の変換に失敗");
    return EXIT_FAILURE;
  }

  printf("文字列: %s\n", str3);
  printf("1文字目: %lc\n", str2[0]);
}
```

```console
$ gcc -o example1 example1.c
$ ./example5
バイト長: 86
長さ: 44
文字列: (ﾟ∀ﾟ)( ﾟ∀)超( ﾟ)絶( )大(ﾟ )興(∀ﾟ )奮(ﾟ∀ﾟ)━ｷﾀｰ!!!!
1文字目: (
```

いろいろと調べたが、UTF-8の場合は最大で1文字6バイトを使って表されるので、char型に変換する際は6倍のメモリを確保しておけば問題ない。

wchar_t型の変数を出力する場合、文字の場合の書式文字列は%lc、文字列の場合は%lsとすればよい。

あと、wprintfやwcoutは、printfやcoutと併用すると挙動がおかしくなることがあるため、なるべく使わないほうが無難である。

一度char型に変換してから出力するのが最も安全だろう。

## utfcppを利用する

こちらはC++限定だが、wchar_t型に変換せずにマルチバイト文字列を扱うことができるので便利。

utfcpp: [https://github.com/nemtrif/utfcpp](https://github.com/nemtrif/utfcpp)

これを使うと、文字列の長さや文字位置のイテレータなどが簡単に構成できる。

```cpp:example2.cpp
#include <iostream>
#include <cstring>
#include <cstdint>
#include <utf8.h>

int main() {
  const char* str1 = u8"明日天気にな〜れ";

  const char* it = str1;
  const char* end = str1 + strlen(str1);

  // 文字列の長さを取得
  int length = utf8::distance(it, end);
  std::cout << "長さ: " << length << std::endl;

  std::cout << std::hex;

  while (it < end) {
    // イテレータを1文字分すすめる
    std::uint32_t code = utf8::next(it, end);

    // 該当位置の文字コードを出力
    std::cout << code << std::endl;
  }

  return 0;
}
```

```console
$ g++ example2.cpp -o example4
$ ./example2
長さ: 8
660e
65e5
5929
6c17
306b
306a
301c
308c
```

他にも便利な関数がたくさんあるので、Githubのほうを参照してほしい。

# まとめ

C/C++でも日本語扱えるぞ！
PHPでズンドコ節をする₍₍(ง˘ω˘)ว⁾⁾

# やること
 - 「**ズン**」「**ドコ**」をひとつずつ出力
 - 「**ズンズンズンズンドコ**」が出力されたタイミングで「**キヨシ₍₍(ง˘ω˘)ว⁾⁾**」
 - 「キヨシ₍₍(ง˘ω˘)ว⁾⁾」コールができなかったら「**ズンドコできませんでした...**」と出力

# やったこと
下記コードのとおりですが、一応..。

 - 「ズン」「ドコ」をそれぞれ扱うために配列にイン
 - 「ズン」「ドコ」の文字列を格納するための変数を初期化
 - ループ準備
 - 配列から「ズン」「ドコ」をランダムで出力するために、配列用の添字を`random_int()`で出力
 - 文字格納用の変数に「ズン」「ドコ」を連結格納
 - 「ズン」「ドコ」を出力
 - 条件分岐 - 連結格納された変数内に「ズンズンズンズンドコ」があれば「キヨシ₍₍(ง˘ω˘)ว⁾⁾」コールの後、ループから抜ける
 - ループ終了 - ズンドコできませんでした...。



## 書いたコード
```php
<?php

$arrs = ['ズン', 'ドコ'];

$zundoko_arrs = null;
for($j=0; $j<=20; $j++) { // ズンドコチャンスは4回
    $random = random_int(0, count($arrs)-1);
    $random_zundoko = $arrs[$random];
    
    $zundoko_arrs .= $random_zundoko;
    echo $random_zundoko . "\n";
   
    // ここからズンドコ
    if(strpos($zundoko_arrs, 'ズンズンズンズンドコ') !== false) {
        echo 'キヨシ！₍₍(ง˘ω˘)ว⁾⁾';
        break;
    }
}

// ループがまわり終わったのにズンドコが発動できなかった
if(strpos($zundoko_arrs, 'ズンズンズンズンドコ') === false) {
    echo 'ズンドコできませんでした...';
}
```

※コードと実行結果はこっちでも見れます。(paiza.ioのページが開きます)
https://paiza.io/projects/aW6NgnfrYCfFYdJwBL4wMQ

## コード中で強引さを感じるところ
条件分岐中、`strpos()`で「ズンズンズンズンドコ」を直に指定している部分です。。
これが、『**「ズン」が4回 + 「ドコ」が1回**』並んだら、みたいな条件分岐の書き方じゃないと良くないだろうな...(なんでかは言葉にできないんですが、、)と思っています。


# 参考
▼[rubyでユニバーサルズンドコキヨシ](https://qiita.com/akoakoya/items/14ecb95bd939f137fe36)
▼[array_randやshuffleの乱択精度を改善しよう](https://qiita.com/mpyw/items/c644dab7d067626fc629)
▼[PHP: random_int - Manual ](http://php.net/manual/ja/function.random-int.php)

# ₍₍(ง˘ω˘)ว⁾⁾
環境 - PHP7を使用
git diffで追加されたファイルのリストを一覧する方法

本稿では、`git diff`コマンドを用い、あるコミットとあるコミットの間で追加(Added)されたファイルの一覧を表示する方法を紹介する。

```bash
git diff $FROM $TO --name-only --diff-filter=A
```

### 例: コミットID `cd216c3dc`から`HEAD`までに追加されたファイル一覧を表示する

```bash
git diff cd216c3dc HEAD --name-only --diff-filter=A
```

### 例: `release/1.0.0`から`master`までに追加されたファイル一覧を表示する

```bash
git diff release/1.0.0 master --name-only --diff-filter=A
```

### 参考文献

* [Git - git-diff Documentation](https://git-scm.com/docs/git-diff#git-diff---diff-filterACDMRTUXB82308203)
Git:過去のコミットをコミットメッセージなどから特定する

本稿では、`git`コマンドで過去のコミットをコミットメッセージなどから特定する方法を解説する。

# コミットメッセージで探す

grep検索ができる。

```
git log --grep 'No.1108 '
```

# 著者名で探す

```
git log --author suin
```

# コミットメッセージと著者名を組み合わせて探す

```
git log --grep 'No.1108 ' --author suin
```

# 探したコミットのコミットIDだけほしい場合

```
git rev-list -1 --grep 'No.1108 ' --author suin HEAD
```
gitlabのMergeRequestにつけたコメントを取得する方法

# 実行した際の条件
- gitlabのバージョンは8.13.1
- MergeRequestのコメント記載時にレビューは#RV、レビューに対するコメントには#REをつける前提
- 結果の加工は気合

## gitlabのPostgresに接続
```
gitlab-psql -d gitlabhq_production
```

テーブルを眺めまわして最終的にこんな感じのSQLを実行

```sql
with comment as (
select
        projects.id,
        line_code,
        note,
        users.name,
        notes.created_at,
        notes.noteable_id,
        notes.discussion_id
from notes, users, projects
where author_id=users.id
        and ( noteable_type='Commit' or noteable_type='MergeRequest' )
        and projects.id=notes.project_id
        and projects.name='<プロジェクト名>'
order by notes.created_at
)
select
        '"' || review.line_code || '"',
        '"' || review.created_at || '"',
        '"' || review.name || '"',
        '"' || replace(review.note,'"','""') || '"',
        '"' || recomment.created_at || '"',
        '"' || recomment.name || '"',
        '"' || replace(recomment.note,'"','""') || '"'
from
(select * from comment where note like '%#RV%') as review
left join (select * from comment where note like '%#RE%') as recomment
on (review.discussion_id = recomment.discussion_id);

```

## 最終的にはこんな感じで標準出力

```comment.bash
#!/bin/sh
gitlab-psql -d gitlabhq_production -c " \
with comment as ( \
select  \
        projects.id, \
        line_code, \
        note, \
        users.name, \
        notes.created_at,  \
        notes.noteable_id,  \
        notes.discussion_id \
from notes, users, projects  \
where author_id=users.id  \
        and ( noteable_type='Commit' or noteable_type='MergeRequest' )  \
        and projects.id=notes.project_id  \
        and projects.name='<プロジェクト名>' \
order by notes.created_at \
) \
select \
        '\"' || review.line_code || '\"', \
        '\"' || review.created_at || '\"', \
        '\"' || review.name || '\"', \
        '\"' || replace(review.note,'\"','\"\"') || '\"', \
        '\"' || recomment.created_at || '\"', \
        '\"' || recomment.name || '\"', \
        '\"' || replace(recomment.note,'\"','\"\"') || '\"' \
from \
(select * from comment where note like '%#RV%') as review \
left join (select * from comment where note like '%#RE%') as recomment \
on (review.discussion_id = recomment.discussion_id) " -A -F,
```
Unity 2017.X + Android で異常にファイルロードが遅い場合の解決法

## Androidでモデルロードが異常に遅いのはなぜだぜ
Unity2017.4.3でAndroidビルドしたらResources.Loadが異常に重い。確かに50MBとか大きいファイルではあるけども、１つのファイルロードに14秒とかいくらなんでも酷すぎる。ましてやGalaxy S9 という最新機種でだ。さらにiOSでは1秒ぐらいで済むのにだ。

というわけで調べてみた

## Unity 2017 の新ビルドオプション「Compression Method」

どうやら2017からビルドオプションに「Compression Method」というのが増えて、デフォルトで「Default」というのになっている。これがロードの遅さの原因のようだ。


これを「LZ4」にすると超速になる。iOSと同様、1秒ぐらいのロードに短縮された。

<img width="649" alt="スクリーンショット_2018-05-31_23_38_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/72960/9a644139-16e2-6419-d679-cd93d8ff82a7.png">

わかってしまえばどうということないのだが、なぜデフォルトでLZ4オプションではないのかは不明だ。

## 「Compression Method」とは

[該当のスクリプトリファレンスによると](https://docs.unity3d.com/ScriptReference/BuildOptions.CompressWithLz4.html)、このオプションで圧縮されるデータというのは以下のものを指す。

1. Player settings
1. シーンファイルや.assetファイル
1. Resourcesの中身のファイル
1. GIデータ
1. ビルトイン済みのリソースファイル

ってこれ、AssetBundle以外の全てって言っていいんじゃないだろうか？

さらにドキュメントでは

> Enabling CompressWithLz4 in Android might be a significant performance boost when loading data as LZ4 decompression is faster than the default Zip decompression.

とあり、意訳すると

> 特にAndroidでのCompressWithLz4は超絶ブーストがかかるぜ。デフォルトのZipよりも断然早いぜ

とのこと。（そこまでいうならなぜデフォルトをLZ4にしないw）

ということで、Androidでロードが遅い問題にぶつかったら真っ先にチェックしてみよう。
【自己ノート】Python

#Note
### `__name__`

"__name__"はPythonの特別な変数です。 ソースファイルがメインプログラムとして実行された場合、インタプリタは__name__変数に値 "__main__"を設定します。 このファイルが別のモジュールからインポートされている場合、__name__はモジュールの名前に設定されます。
参考になったコードを貼り付けるだけ【PHP】

## array_map
https://github.com/Crinsane/LaravelShoppingcart/blob/master/src/Cart.php

引数のidが配列だった場合は、array_mapのコールバックでadd()を行う。

```php
Cart::add('293ad', 'Product 1', 1, 9.99);
Cart::add([
  ['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 10.00],
  ['id' => '4832k', 'name' => 'Product 2', 'qty' => 1, 'price' => 10.00, 'options' => ['size' => 'large']]
]);

public function add($id, $name = null, $qty = null, $price = null, array \$options = [])
{
    if ($this->isMulti($id)) {
        return array_map(function ($item) {
            return $this->add($item);
        }, $id);
    }
    ...
}
```

## filter_input

1〜5の整数値でバリデーションを行う。デフォルトで3を設定。

```php
$options = array(
	'options' => array(
		'default'   => 3,
		'min_range' => 1,
		'max_range' => 5,
	),
);
$rating  = filter_input( INPUT_POST, 'score', FILTER_VALIDATE_INT, $options );
```
bey


> Simple immutable state for React using Immer

https://github.com/jamiebuilds/bey

immerを使ったReactコンポーネント。
サンプルと見ると、`update`でミュータブルな操作をしているが、実際はimmerによってイミュータブルに変更されている。

あとは、普通にrender propで変更があれば新しくstateが流れる。
`bey`の実装自体もすぐに読めるが、`this.setState({})`でライフサイクルを回してる部分は面白い。

以下、サンプル

```jsx
import React from 'react'
import { render } from 'react-dom'
import { state, update, Subscribe } from 'bey'

const counter = state({ count: 0 })

function increment() {
  update(counter, state => {
    state.count++
  })
}

function decrement() {
  update(counter, state => {
    state.count--
  })
}

function Counter() {
  return (
    <Subscribe to={counter} on={state => state.count}>
      {count => (
        <div>
          <button onClick={decrement}>-</button>
          <span>{count}</span>
          <button onClick={increment}>+</button>
        </div>
      )}
    </Subscribe>
  )
}

render(<Counter />, document.querySelector('#app'))
```

雑に試すのに`parcel`がオススメなので絶対使った方がいいです。

```html
<div id="app"></div>
<script src="./src/index.js"></script>
```

```
$ parcel index.html
```


## 気持ち
ミュータブルに書くとイミュータブルになるは、書く量が減って大変よろしいのであるが、パッと見たときにイミュータブルのシンタックスをしてないので心理的な抵抗がある。
慣れの問題かもしれないが、個人的には普通に`{...}`で新しいオブジェクトを返していくのが性にあってそう。
windows環境にpython2.7をインストールした場合の注意どころ

# python導入後に困った事やその解決法の一覧を随時更新

## beautifulsoup4をインストールしたけど呼び出せない
windowsのpythonインストーラー(msi)を使った場合、pipも入るので

> pip install beautifulsoup4

を実行してインストールする所までは出来ますが、実際にコードで
>from bs4 import BeautifulSoup

と記述した場合、悪名高い**ImportError: No module named bs4**が実行時に発生してしまいます……それは下記のように

>C:\Python27

までのパスは自動的に通るが

>C:\Python27\Lib\site-packages

へのパスは通らない為、呼び出しに失敗します。
この場合、windowsの環境変数にsite-packagesへのパスを追加すれば解決します。

# 以下、随時追記……
GitHubのPRに関する情報を雑に集計してみた

# 目的
スクラムで開発をやっています。
チームの前回スプリントレトロスペクティブで以下の二つのアクションをすることに決めました。

* PRはできるだけ細かく作成する
* PRが修正とかで長期化したらペアプロする

決めたら、振り返らないといけません。
ということで、集計しました。

# 確認方法
それぞれこう考えてみました。

* PRはできるだけ細かく作成する → 各PRの変更ファイル数、行数の傾向
* PRが長期化したらペアプロ → PRクローズまでの時間

[GitStats](http://gitstats.sourceforge.net/) というツールもありましたが、今回求めている情報は取得できませんでした。

仕方がないので、以下の手順を取りました。

1. DBに欲しい情報を格納するスキーマを設定
2. スクリプトでAPIを叩いて、必要な情報を取得し、DBに格納
3. DBからSQLで欲しい情報を取得

そのために実際に作ったスクリプトは以下です。
* スキーマ情報は[これ](https://gist.github.com/funa1g/e6b1e78525d3eaca2214a85932028f1a)
* 取得スクリプトは[これ](https://gist.github.com/funa1g/9b49be622a81b02ec4603887f534159f)

ひとまず必要なPRの作成日時、マージ日時、変更ファイル数を保存するようにしました。
時間がなかったので、結構雑です。
今後も使う場合は、ちょっと改善が必要です。

# 結果
前回スプリントと今回スプリントで以下のような結果になりました。

| 測定項目 | 前回 | 今回 |
| ----- | ---- | ---- |
| 変更ファイル数の平均 | 6.1 | 6.1 |
| PR数 | 16 | 38 |
| クローズまでの平均時間 | 5日と14時間 | 2日と18時間 |

変更ファイル数は変わっていませんでしたが(変わらないのもなんかすごいですが)、PR数が前回の倍以上になっていました。
多少なりともPRを複数に分けて作成することが意識できた結果と言えるかもしれません。

クローズまでの平均時間は、大きく短くなりました。ただし、前回スプリントはゴールデンウィークが含まれているため、そのまま受け取っていいか微妙なところです。

結果だけから見ると、よくなったと言えなくもないが、断言はできないといったところですね。
さらに手間をかければ、より詳細に分析できますが、今回はここまででタイムアップでした。
今後、改善がないようであれば、今回のスクリプトを元に、もっとちゃんと書き直してみたいところです。

# 最後に
この手のツールって需要ありそうな気がするんですが、`GitStats`以外に見つけられなかったのが意外でした。
他にご存知の方は教えてほしいです。見逃してるだけかも、という気がするので。
Android Studio 3.1 ではddmsやmonitorではなくDevice File Explorerを使おう

# 最初に結論から
タイトルの通りですが、Android Studio 3.1のエミュレータに画像ファイルなどを送るときは、ddmsとかmonitorを起動する必要はありません。
Android Studio 3.1にDevice File Explorerというものがあり、そこで直接ファイルをアップロードすることができます。
※3.1以前にDevice File Explorerがあるのかは確認してないです

参考：[How to open Android Device Monitor in latest Android Studio 3.1](https://stackoverflow.com/questions/49574127/how-to-open-android-device-monitor-in-latest-android-studio-3-1?noredirect=1&lq=1)

# 使い方
- Android Studio 3.1で、あらかじめエミュレータを起動しておきます。（開いておかないと、後で「Device File Explorerはエミュレータを起動するか実機をつないでないと使えないよ」と言われます）
- "ctrl + shift + A"のショートカットで検索窓を開き、そこに"Device File Explorer"と打ち込めば候補に挙がってくるはずなので、それをクリック。
- Device File Explorerが右から出てきます。
- あとはアップロードしたいディレクトリで右クリック → Upload を押下すれば、ローカルPCのExplorerが開かれるので、そこから目的のファイルを選んでアップロードします。

# 実際にやった
以下のスクリーンショットは`media/0/Pictures`ディレクトリに`neko1.jpg`をアップロードした時のものです。
エミュレータ上に`Photos`というアプリ(?)があるので、そこで写真がアップロードされていることを確認しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/145181/cc931b2e-db3a-d081-bdbc-f4d57c35dc5f.png" width=80%>


# 環境情報など
Windows 10
Android Studio 3.1
Emulator Pixel_2_API_26
PipenvでGitHubリポジトリをインストールする

## やりたいこと

GitHub上にあるPythonのライブラリをPipenvで使いたいときのやり方です。

## やり方

以下のようにやったらうまく、`Pipfile.lock`の内容もロックされました。

```bash
pipenv install git+https://github.com/<ユーザー名>/<リポジトリ名>.git@<リビジョン>#egg=<パッケージ名>
```

`@<リビジョン>`はなくても、うまくできましたが、固定されたほうが再現性が高くていいと思うので指定しました。

## 具体例

以下は具体例です。[nwtgck/map-classifier-python](https://github.com/nwtgck/map-classifier-python)をPipenvでインストールするときの具体例です。

```bash
pipenv install git+https://github.com/nwtgck/map-classifier-python.git@v0.4.1#egg=map-classifier
```
Jenkinsのworkspace以下のディレクトリがランダムに削除されることがあった


数ヶ月前に自分も経験した不具合の原因が修正されたという話です。

# 不具合の内容
Jenkinsのmaster/slave機能を使っていると、slaveのworkspace/以下でランダムにディレクトリが消される

突然ビルドが通らなくなって焦ります（焦りました）。

# 最新版で修正されたようです
![スクリーンショット 2018-05-31 23.23.48.png](https://qiita-image-store.s3.amazonaws.com/0/66517/d18cad9d-d3fb-ba95-5815-43022b3c9166.png)
変更2個目、進行中のビルドのworkspaceを削除しない、とあります。
次にissue 27329を見てみます。

# 報告
"WorkspaceCleanupThread may delete workspaces of running jobs"
https://issues.jenkins-ci.org/browse/JENKINS-27329
つくられたのはなんと2015年3月のissueです。

同内容で
"workspace being deleted mid-build on slave"
https://issues.jenkins-ci.org/browse/JENKINS-30916 とか、

おそらく同じ原因だろうと思われる、
"Workspace directory randomly deleted"
https://issues.jenkins-ci.org/browse/JENKINS-19686 とか、昔からいくつか報告は上がっていた不具合でした。

# github pull request
githubのprはこれです、若干9行の変更のみ！

"JENKINS-27329 Less aggressive WorkspaceCleanupThread"
https://github.com/jenkinsci/jenkins/pull/3444
アップデート内容のお知らせよりはいくらか控えめな表現ですね(アグレッシブなスレッドとは...)
筆者もだいぶましになるが完璧な対策ではないと言っています。
## 変更内容
Javaは文法くらいしかわかりませんが軽く読んでみます。
https://github.com/reinholdfuereder/jenkins/blob/670c473573f71acf04a9794547c1c386d81f8291/core/src/main/java/hudson/model/WorkspaceCleanupThread.java#L142-L150

WorkspaceCleanupThread.java内のshouldBeDeleted()に判定を追加しているんですね。
実行中のJobがあればfalseを返して消す必要はないとしているようです。

なるほどなるほど

# 感想
自分が使っているOSSの変更を丁寧に追ってみるのって楽しいですね！
FAT12,FAT16の構造(予約領域編)

## はじめに

ファイルシステムについて学び始めたばかりなので最近見かけない学びやすそうなFAT16
について勉強していったので自分用のメモとしてまとめました。

## FATファイルシステムについて

FATファイルシステムは最初にMS-DOSでサポートされていたファイルシステムで様々なリムーバブルディスクで使用されているファイルシステムです。
FATというのはFile Allocation Tableの略称でディスク内でのファイルの位置、データの割り当てられた領域を管理するシステムのことを言います。
FAT12、FAT16、FAT32の数字はFAT領域で扱うデータ長のことです。
FATファイルシステムは情報が格納されている場所をセクタ番号で表します。

## 領域について

FATファイルシステムには基本的に下記のような3~4個の領域があります。

* 予約領域　←今回はこの領域についての話です！
* FAT領域
* ルートディレクトリ領域(FAT32ではこの領域はありません)
* データ領域

※FATファイルシステムのデータ構造は全てリトルエンディアンです。

## 予約領域

最初のセクタに格納されているのは予約領域です。
予約領域にはBPB(BIOS Parameter Block)やブートストラップコード等が書かれています。
BPBにはセクタ長や1クラスタのセクタ数、各領域の開始位置などの値が格納されていて、各領域のサイズが計算できるようになっています。
この領域を見るときに注意することは、ブートシグネチャは予約領域の最後の2バイトが0xAA55なのではなく、オフセット0x01FEは0x55、0x01FFが0xAAと決まっていることです。
資料によっては、予約領域の最後の2バイトにブートシグネチャが格納されていると書かれていることがありますが、間違いなので注意してください。
1セクタに格納されるバイト数は互換性のために512バイトが推奨されていますが、ハードウェアによって、バイト数が512より大きい場合は1024、2048、4096のどれかになります。もし512バイトよりも、1セクタのバイト数が大きかったとしても、ブートシグネチャのオフセットは変わりません。
ですが、シグネチャが正しく設定されている場合には、終わり2バイトが0xAA55でも問題ありません。

フィールド名の先頭にBSが書かれているのはブートセクタ内のフィールド、BPBが表記されているものはBPB内のフィールドです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/223320/3318fa98-c025-7093-1431-1661fe95bc8a.png" width="800">

FAT12/16とFAT32ではここから内容が変わっていきます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/223320/dfed26d9-b439-4b00-f364-6c4fcaec6578.png" width="800">

## 参考資料

http://elm-chan.org/docs/fat.html
http://free.pjc.co.jp/fat/mem/fatm161.html
Bootstrapのカスタマイズとラッパー｜ぽくない見た目を作る

フロント開発時によくお世話になるBootstrap。CSSやjsの要素がパーツ化されているのでしっかりしたUI/UXを爆速で作ることができます。
ただ、用意されているコンテンツやコンポーネントをそのまま利用するとどうしてもBootstrapぽさ、Bootstrap臭みたいなものが残ってしまい、あまりオリジナリティのある見た目のサイトにはなりません。

これを解消するために私がよくやっている方法を紹介します。

## 基本的な方針
しっかりとBootstrapに則って（Bootstrapで規定されているclassを利用して）HTMLを組んでいれば、そのサイトの見た目は読み込んでいる`bootstrap.min.css`に完全に切り出されているはずです。
この状況であれば、この`bootstrap.min.css`ファイルをBootstrapを基にカスタマイズされたCSSファイルに置き換えることでHTML構造に影響を与えることなく見た目を切り替えることができます。
この置き換えるためのCSSファイルを取得したり作ったりできるサイトがあるので、いくつか紹介します。

## 予めカスタマイズされたCSSファイルを利用する
これは予めBootstrapを基に見た目がカスタマイズされたCSSファイルを取ってくるやり方です。下記2つのサイトがおすすめです。

### [hackerthemes](https://hackerthemes.com/)
- 無料版でもCSSファイルのダウンロードにはFacebookかtwitterでの拡散が必要です。
- 有料版もありますが無料版のものだけでもけっこう使えます。

### [bootswatch](https://bootswatch.com/)
- 無料版は制限なくダウンロードできます。
- CDN版も提供されているので、自らファイルを保持する必要もありません。  
 [https://cdnjs.com/libraries/bootswatch](https://cdnjs.com/libraries/bootswatch)

## Bootstrapベースで自分でカスタマイズする
これはBootstrapベースで色やサイズなどを自分好みに変更し、出来上がったCSSをCSSファイルとしてダウンロードして利用するという方法です。
リアルタイムで見た目を確認しながら作業を進められるので、どんなデザインにしたいかイメージがある程度固まっている場合におすすめです。

### [bootstrap.build](https://bootstrap.build/app/v4.1.1/)
- 作成途中のCSSデザインが実際にどのようにサイトの見た目として反映されるのかを、Previewから様々なHTMLのパターンから選択して確認することができます。
- コンテンツやコンポーネントのHTMLも確認できます。

### [pikock.github.io](https://pikock.github.io/bootstrap-magic/app/index.html#!/editor)
- 上記のサイトよりもシンプルな機能で、同様にCSSファイルをエクスポート可能です。

### [bootstrap-live-customizer](https://www.bootstrap-live-customizer.com/)
- Bootstrap4未対応なのであまりおすすめできませんが、一応載せておきます。
Laravelで投稿された{{}}をエスケープする

#Laravelで投稿された{{}}をエスケープする方法

Laravelのbladeファイルで{{}}を表示(エスケープ)させた際のメモ。

##はじめに
Laravelで掲示板やSNSを作成する際に、ユーザーが投稿した文字列を出力したい場合があると思います。
この場合、入力された文字列に対してhtmlタグを特殊文字にエスケープすることで、HTML上で発火しないようにすることはよく行われていると思います。

しかし、Laravelのbladeファイル内では{{}}を利用することでphpの変数の値を表示することができます。```例: {{$hoge}}```

これにより、投稿文字列に{{hoge}}と入力し出力しようとした場合に、bladeファイル内で実行されアプリケーションが正しく実行されなくなる(崩壊する)ことがあります（実際今回なってしまいました）。

なので、```{```,```}```をエスケープしたいのですが、この二つには特殊文字がないためエスケープすることができません。

しかし、入力された内容を変更して表示はしたくない…。

そんな時に私が行なったことを紹介します。


##やったこと

###ゼロ幅空白を使う
こちらの記事([2. スペースは" "だけじゃない的な話](http://anti.rosx.net/etc/memo/002_space.html))で紹介されていますが、スペースにはたくさんの種類が存在しています。
その中には、幅をもたず見た目上は何も文字列がないように見える空白があるのです。それをゼロ幅空白というのですが、今回はこれを特殊文字として挿入することで```{```と```}```をエスケープしたいと思いました。

よって今回は以下のように処理を書くことで、エスケープを行ないました。

```php
<?php
$msg = "{{hoge}}";

$pattern = '/{/';
  $msg = preg_replace_callback(
            $pattern,
            function($matches){
              return '{&#8203;';
            },
            $msg
          );

$pattern = '/}/';
  $msg = preg_replace_callback(
            $pattern,
            function($matches){
              return '&#8203;}';
            },
            $msg
          );

echo $msg;     // {&#8203;{&#8203;hoge&#8203;}&#8203;}

// html上では{{hoge}}と表示される

?>
```
入力文字の```"{{hoge}}"```をphpの組み込み関数である```preg_replace_callback```で文字列置換します。
今回の場合は、正規表現```/{/```,```/}/```のどちらかに該当した場合にそれぞれ```{&#8203;```,```&#8203;}```に文字列置換を行い、置換された文字列を$msgに格納しています。


今回はこの方法でうまくエスケープすることができました。


ただ、これが最善だとは思っていないのでいい方法があったらぜひ教えてください。

調べてもこのエスケープに関する記事が見つからなかったので、同じ悩みを抱えている人は参考にしていただけると嬉しいです。
.tmux.conf

ほぼiTerm2と同じようなコマンドでペイン分割などができる

```.tmux.conf
##
# set は set-option のエイリアス
# setw は set-window-option のエイリアス

set -g prefix C-q

unbind C-b

set -sg escape-time 0

set -g base-index 1

setw -g pane-base-index 1

bind -n C-d split-window -h -c "#{pane_current_path}"

bind -n C-f split-window -v -c "#{pane_current_path}"

bind -n C-o select-pane -t :.+

bind -n C-w kill-pane

set -g default-terminal screen-256color

set -g pane-active-border-fg black
set -g pane-active-border-bg cyan

set -g mouse on

bind -n C-t new-window

set -g status-position top
```

コピペがShiftを押しながらになるので、やりずらい
なので、iTerm2の方で選択したらクリップボードに取り込まれるようにする
scpコマンド チートシート

## ローカルからリモートにコピー
`a.txt`をローカルからリモートの`/remote/directory`にコピーする場合

```sh
$ scp a.txt username@remote.example.com:/remote/directory
```

## リモートからローカルにコピー
リモートの`/remote/directory/a.txt`をローカルの`/local/directory`にコピーする場合

```sh
$ scp username@remote.example.com:/remote/directory/a.txt /local/directory
```

## ローカルのディレクトリごとリモートにコピー
オプション`-r`を使う。

```sh
$ scp -r local_dir username@remote.example.com:/remote/directory
```

## 鍵認証を使ってリモートにコピー
オプション`-i`で鍵のパスを指定する

```sh
$ scp -i ~/.ssh/id_rsa a.txt username@remote.example.com:/remote/directory
```

## ポート番号を指定してリモートにコピー
オプション`-P`でポートを指定する

```sh
$ scp -P 2222 a.txt username@remote.example.com:/remote/directory
```

## 複数ファイルをリモートにコピー
ローカルの`a.txt`と`b.jpg`をリモートにコピーする場合

```sh
$ scp a.txt b.jpg username@remote.example.com:/remote/directory
```

ローカルの`a.txt`、`b.txt`、`c.txt`をリモートにコピーする場合

```sh
$ scp {a,b,c}.txt username@remote.example.com:/remote/directory
```

ローカルの現在のディレクトリにあるすべての`.txt`ファイルをリモートにコピーする場合

```sh
$ scp *.txt username@remote.example.com:/remote/directory
```

## 複数ファイルをローカルにコピー
リモートの`a.txt`と`b.jpg`をローカルにコピーする場合

```sh
$ scp username@remote.example.com:/remote/directory/\{a.txt,b.jpg\} .
```

リモートの`a.txt`、`b.txt`、`c.txt`をローカルにコピーする場合

```sh
$ scp username@remote.example.com:/remote/directory/\{a,b,c\}.txt .
```

リモートのディレクトリにあるすべての`.txt`ファイルをローカルにコピーする場合

```sh
$ scp username@remote.example.com:/remote/directory/*.txt .
```
AWS EC2に作業用ユーザを追加

## やりたいこと

AWSのEC2インスタンスを作るとデフォルトでec2-userのみが作られるが、
複数人で同じpem使い回すのも嫌なんで各々に作業用ユーザを作りたい。

`$ sudo`の際いちいちパスワード入力しないようにしたい。

この記事では例としてhogeユーザを追加し、hoge.pemを使ってssh接続できるようにします


## ec2に接続

既に、ec2にssh接続した状態として、ユーザ追加やらいろいろやるためrootに切り替えておきます

```
[ec2-user@xx.xxx.xxx.xxx ~]$ # ec2-userで接続した状態
[ec2-user@xx.xxx.xxx.xxx ~]$ sudo su # root ユーザに切り替え
[root@xx.xxx.xxx.xxx ec2-user]$
```

## ユーザを追加

```
[root@xx.xxx.xxx.xxx ec2-user]$ useradd hoge # ユーザ追加
[root@xx.xxx.xxx.xxx ec2-user]$ usermod -G wheel hoge # sudoを使えるグループに所属させる
```

## visudoを編集

wheelグループのユーザがsudoコマンドを入力する際のパスワード入力を省略します

`visudo`と入力すると編集モードが起動します

```
[root@xx.xxx.xxx.xxx ec2-user]$ visudo

## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.

~~~ 省略 ~~~
```

`/`で検索モードにし、`wheel`を探します

```
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL

## Same thing without a password
# %wheel  ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

/wheel
```

`# %wheel  ALL=(ALL)       NOPASSWD: ALL`のコメントアウトを外し、escからの`wq!`で上書き保存します

```
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL

## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL

:wq!
```

## 追加ユーザ用キーペアを作成

hogeユーザに切り替えてssh-keygenでキーペアを作ります

```
[root@xx.xxx.xxx.xxx ec2-user]$ su - hoge
[hoge@xx.xxx.xxx.xxx ~]$ ssh-keygen -t rsa
```

キーペア作成時パスフレーズの入力を求められますが何も入力せずエンターを押します

### 確認

うまく鍵ファイルができてるか見てみます
pubついてるのが公開鍵、ついてないのが秘密鍵です

```
[hoge@xx.xxx.xxx.xxx ~]$ cd ~/.ssh
[hoge@xx.xxx.xxx.xxx .ssh]$ ls
id_rsa  id_rsa.pub
```

## 公開鍵の設定

作成した公開鍵を`authorized_keys`に設定し、秘密鍵で認証できるようにします

```
[hoge@xx.xxx.xxx.xxx .ssh]$ cat id_rsa.pub >> authorized_keys
[hoge@xx.xxx.xxx.xxx .ssh]$ chmod 600 authorized_keys
```

## 秘密鍵をローカルにダウンロード

`id_rsa`ファイルを`hoge.pem`としてローカルに落とします
ファイル名を`hoge.pem`に変えてダウンロードでもダウンロードしてから`hoge.pem`に変えるでもOK
SFTPとかでec2-userで落とそうとするとパーミッションで怒られるのでec2-userのホームに移動するなりしてからダウンロードしてください

## ローカルにダウンロードした秘密鍵を使ってSSH接続

以下ローカルからの操作

```
$ chmod 400 {ダウンロードした秘密鍵のディレクトリ}/hoge.pem # パーミッションの設定
$ ssh -i {hoge.pemのパス} hoge@xx.xxx.xxx.xxx
```

うまく行ってればこれでhogeユーザとしてSSH接続できるはず
ローカルのSwagger定義ファイル(YAML/JSON)をSwagger UIで確認する

Swagger定義ファイルがあるディレクトリで以下を実行し、

```sh
$ docker run -p 80:8080 -e SWAGGER_JSON=/tmp/[定義ファイル名] -v `pwd`:/tmp swaggerapi/swagger-ui
```
http://localhost を開く。