OmniAICreator/Qiita-1.07M huggingface dataset:
Charles for MacでAPIから返ってくるレスポンスを書き換える方法

この記事は、[ZOZOテクノロジーズ アドベントカレンダー#4](https://qiita.com/advent-calendar/2019/zozo_tech4)の記事です。

昨日は [@takewell](https://qiita.com/takewell)さんの「[WASI (WebAssembly system interface) を Wasmtime と Node.js で試す](https://qiita.com/takewell/items/c99b44d912448e9170e6)」でした。
明日は [@koiwai2020](https://qiita.com/koiwai2020)さんの「[WEARに投稿したコーディネート画像に雪を降らせて映えを狙う](https://qiita.com/koiwai2020/items/2b48aea32e83d68466f5)」です。

## はじめに

先日、WEAR for iOSで使う新しいAPIクライアントを作ったのですが、その際に **Charles for Mac** がとても役に立ちました。

色々活躍してくれたのですが、特にシビれたのは **レスポンスを書き換え出来る機能** です。

エラーハンドリング実装の際には大活躍してくれたので、この先忘れないためにも自分用のメモとしてQiitaに残しておきたいと思います。

## 使用するCharlesのバージョン

- [Charles for Mac](https://www.charlesproxy.com/) v4.5.5

## 1. Breakpointを設定する

(1) Charlesを起動し、メニューバー内の [Proxy] > [BreakPoint Settings...] をクリックします。

<img width="661" alt="スクリーンショット_2019-12-16_15_06_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/db20e1d4-d584-66ed-0d83-a32f0e1392ca.png">

(2) [Enable Breakpoint] にチェックを入れて、[Add] ボタンをクリックします。

<img width="652" alt="スクリーンショット_2019-12-16_15_06_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/f5c9e316-6f89-5f76-8508-c4c0bdcf6780.png">

(3) レスポンスを変更したいAPIのURLの詳細を入力します。各項目の説明は以下の通り。

<img width="552" alt="スクリーンショット_2019-12-16_15_07_17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/7d2b076f-694b-7481-7c33-ce907c1abfdc.png">

- Scheme （GETやPOSTなどのHTTPリクエストMethod）
- Protocol （httpsもしくはhttp）
- Host （APIURLのドメイン）
- Path (エンドポイント)
- Query （パラメータ）

ちなみに今回はレスポンスの変更のみなので **[Response]にのみチェックを入れます。**
入力が終わったらOKボタンをクリックします。

## 2. Charlesでレスポンスを書き換える

では、設定が完了したので早速APIを叩いて見ましょう。

下の図のようにBreakpointsタブが出来て、先ほど設定したAPIURLの全ての通信がレスポンスを受け取る直前の状態でストップします。

[Edit Response]をクリックすれば、レスポンスヘッダーやJSON Textを書き換えることが出来ます。

<img width="1210" alt="スクリーンショット_2019-12-16_15_44_16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/b3186000-4a8a-4097-1e3e-de5913c03257.png">

[Headers]をクリックすれば、レスポンスヘッダーを書き換えることが出来ます。このようにステータスコードの書き換えもモチのロン。

<img width="1210" alt="スクリーンショット_2019-12-16_16_13_37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/28aa31c4-03f0-631f-855e-bf7c68cd89ae.png">

[JSON Text]をクリックすればJSONの中身も変更することが可能です。

書き換えが終わったら [Excute]ボタンをクリックします。
すると、先ほど変更したレスポンスを受け取るようになっているはずです。

<small>(注意: タイムアウト時間を短めにしている人は長めに設定しておきましょう。レスポンスの変更時間がタイムアウト時間を超えてしまうとエラーを受け取ってしまうので。)</small>

## Charles for Macめちゃ素敵

[設定すれば](https://qiita.com/ruwatana/items/93cafe2369faec4b2598)、SSLの通信であってもiPhoneシミュレータや実機のレスポンスも書き換えることが出来ます。

これを入れておけば間違いなく通信周りの開発のスピードは捗ると思ったので、自分用にも1つポチることにしました。

全てのMacに標準で入っててほしい。素敵。

明日は、[@koiwai2020](https://qiita.com/koiwai2020)さんの「[WEARに投稿したコーディネート画像に雪を降らせて映えを狙う](https://qiita.com/koiwai2020/items/2b48aea32e83d68466f5)」です。お楽しみに！
SageMaker Autopilotの使い方をkaggleのHouse Pricesで

Amazon SageMaker Autopilotは、表形式データセット用のAutoMLです。

公式
https://aws.amazon.com/jp/sagemaker/autopilot/

SageMaker Autopilotは様々な方法で使用できます。
自動、手動、プログラミングなしでSageMaker Studioを使う、またはAWS SDKの使用など。

この記事では、kaggleのHouse PricesでSageMaker Autopilotがどれくらいの精度が出せるのか検証してみます。

kaggle House Prices
https://www.kaggle.com/c/house-prices-advanced-regression-techniques

手順

データをダウンロードします。
https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data

S3のバケットにアップロードします。
https://aws.amazon.com/jp/s3/

SageMakerを開き、

https://aws.amazon.com/jp/sagemaker/

SageMaker Studioを開きます。

参考：
https://qiita.com/SatoshiGachiFujimoto/items/eecb66f5d57cb50324c7


SageMaker Studioを開いたら画面左のフラスコマークをクリックして、

![sagemaker_create_experiment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449916/28be5ae2-d76e-6b5b-017d-1031882e884b.png)


画面右の「Create Experiment」
をクリックします。

![LinearRegression.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449916/2e982d8b-e420-2fc9-5fdf-9865f2cf6aa1.png)


Target attribute nameに「SalePrice」、その他必要な情報を入力します。

今回のHouse Pricesは回帰問題なので
「Linear Regression」
を選択して、
右下の
「Create Experiment」
をクリック。

Objective metricは2019年12月17日現在、MSEしか選択できません。


学習が進むので、Trialsの中から、Objective(MSE)が最小のものを選択して、
エンドポイントを作成します。

エンドポイントを作成したら、SageMakerの「推論」から「バッチ変換」を選択し、
「バッチ変換ジョブの作成」をクリックします。

必要な情報を入力し、
コンテンツタイプ - オプションに
「text/csv」
と記入します。

後は「ジョブの作成」をクリックして待つだけです。

出力結果をkaggleにサブミットした結果は

0.13059で5740チーム中2155位でした。

![houseprice_leadbord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449916/a0128c63-b470-860c-52b1-72a5e5d91f9e.png)


こちらの方がGoogle AutoML Tablesで行った実験結果を上回っていました。

https://qiita.com/fufufukakaka/items/220113aec7e5a65e24eb

SageMaker Autopilotの今後が楽しみですね。
Dockerネットワーク

# Dockerネットワーク
Dockerには、DockerEngineを起動した時に作成されるネットワークがあります。
しかし、このネットワークは制限があったり、古い機能を提供していたりと不便な点が多いです。
上記の問題を解決するには、新しくネットワークを作成する方法があるのでそちらを紹介します。

# ネットワーク確認
`docker network ls`コマンドを実行すると、作成されたネットワーク一覧が見れます。
下の実行結果は、DockerEngineをインストールした時に作成されるネットワークです。

```
# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
fad5fce49196        bridge              bridge              local
d3cb99258187        host                host                local
a4377bf7ffba        none                null                local
```



# 問題点

ドッカーで新しくコンテナを立ち上げる(docker runなど)際にネットワーク指定を特にしなければ、デフォルトネットワークの`bridge`ネットワークに属します。

これによって下記のような問題が発生します。

- 同じネットワーク内にあるコンテナに接続するには`Link`オプションを使用しなければいけなく不便
- Linkオプションはレガシーな（古い）機能となっている

公式のドキュメントにはこう書かれています。
>デフォルトのネットワーク・ブリッジ上では、Docker は自動的なサービス・ディスカバリをサポートしていません。
このデフォルト・ブリッジ・ネットワーク上でコンテナ名を使って通信をしたい場合、コンテナ間の接続にはレガシー（訳者注：古い）の docker run --link オプションを使う必要があります。

**サービスディスカバリ** : Docker内部DNSサーバがネットワーク上の他コンテナに対する適切な名前解決をする機能



# ネットワーク作成
上記の問題点を解決するには、新しくネットワークを作る必要があります。

Dockerには2種類のネットワークが存在します。
`bridge`と`overlay`です。

※上記のbridgeと、docker起動時に存在するbridgeは異なります。

|種類|説明|
|:--|:--|
|bridge | Docker エンジンの実行ホスト環境上に存在<br>単一のホスト上でのネットワーク作成|
|overlay | 複数のホスト上で動くエンジンを横断<br>複数のホストを横断するネットワーク|

ここでは、`bridge`ネットワークの作成方法について見ていきます。

### bridgeネットワーク作成
bridgeを指定するには、`-d`オプションでbridgeを指定します。
-dを指定しないで作成しても、デフォルトでbridgeネットワークに属します。

```
$ docker network create -d bridge <任意のネットワーク名>
```



# bridgeネットワークについて
`bridge`を作成した場合。

>リンク機能はサポートされません。
ですが、このネットワーク上にあるコンテナのポートは公開可能です。
bridge ネットワークの一部を外のネットワークから使う時に便利でしょう。

訳) 外からアクセスしたい場合は、ポートを公開してね。


>ユーザが定義したネットワークでは、Docker 内部 DNS サーバがネットワーク上の他コンテナに対する適切な名前解決をします。 container1とcontainer２が同じネットワークに所属している場合、container1 の内部では、 container2 に対して名前で ping できるでしょう。

デフォルトの bridge ネットワーク（ドッカーを起動した時に自動的に作られるネットワーク）を使う場合は、この名前解決機能を利用できない事に注意。



# リンク機能

>Docker ネットワーク機能より以前は、Docker リンク機能を使いコンテナの相互発見や、特定のコンテナから別のコンテナに安全に情報を送信できました。
Docker ネットワークを導入したら、自動的にコンテナを名前で発見できます。
しかし、デフォルトの docker0 ブリッジ・ネットワークとユーザ定義ネットワークには違いがあるため、まだリンク機能を使うこともできます。
より詳しい情報については、 古いリンク機能 のデフォルト bridge ネットワークのリンク機能をご覧ください。
ユーザ定義ネットワークでリンク機能を使うには ユーザ定義ネットワークでコンテナをリンク をご覧ください。


# ネットワーク関連コマンド

|説明|コマンド|備考|
|:--|:--|:--|
|ネットワーク一覧|docker network ls||
|ネットワーク作成|docker network create -d bridge --subnet 172.25.0.0/16 <任意のネットワーク名>|
|立ち上げるコンテナにネットワークを指定する|docker run --net=<ネットワーク名>|
|ip固定バージョン|docker run --net=<ネットワーク名> --ip=172.25.3.3 -itd --name=container3 busybox|IPアドレスを指定することができる、これによりドッカーを再起動してもIPアドレスが固定される|
|ネットワークの設定情報表示|docker network inspect {ネットワーク名}|ネットワークにどのコンテナが属しているか一覧が表示|
|既に存在するコンテナを別のネットワークに所属させる|docker network connect <ネットワーク名> <コンテナ名>|この時コンテナは2つのネットワークに所属することに注意
|コンテナのIP確認|docker attach <コンテナ名>


# 関連リンク
[Docker ネットワーク機能の概要](http://docs.docker.jp/engine/userguide/networking/index.html)
[マルチホストでのDocker Container間通信 第1回: Dockerネットワークの基礎](https://tech.uzabase.com/entry/2017/08/07/172411)
AWS EC2でのEBSボリューム拡張 CentOS6.9(Ext4ファイルシステム)の場合

#はじめに
本記事は表題の内容について、まんまどストライクな手順をネット上で発見できなかった（探し方が悪いとも言う）こともあって投稿します。
技術トピック的には現時点では古い内容(環境)ですがご容赦ください。

なお、本内容は以下を参考にしております。
[ボリュームサイズ変更後の Linux ファイルシステムの拡張](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html)
#対象の環境について
AWSのEC2環境でOSはCentOS6.9です。
今回は20GBの領域(ファイルシステムはext4)で使用率が70%を超えている状況において、10GBの拡張を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/7684728d-f1b7-42bd-87b3-c639f651049f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/2e269be9-0b35-f4d3-8a6d-7be5f2142700.png)
#手順
以下実際の手順です。
##AWSコンソールでのEBSボリュームの変更
まずは、AWS管理コンソールにてEBSの管理画面に入り、対象のEC2にアタッチしているEBSボリュームを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/70768c8e-7962-fc00-0b6d-fb0346cb214d.png)
次に上部の「アクション」から**「ボリュームの変更」**を選択し、サイズを指定して変更を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/f4059f96-4be8-32c8-8c9b-3c713dbaad34.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/4c0c06ff-0d44-611f-d298-34c80d5af55b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/00b73d2b-c440-6067-f3d8-b9405498766c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/6567b48c-6697-3f70-85fc-42f35ecf6a5d.png)
表示されるサイズが拡張されて30GBになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/83bbebed-7dbe-3e93-3bb0-d315616d1840.png)
##パーテーションの拡張
この時点で、EBSボリュームは拡張されてCentOS上でのルートボリュームも30GBになりましたが、対象のパーテーションは20GBのままになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/1ebfccab-aad1-552a-fc65-7b58682d97ea.png)
ですので、**growpart コマンド**でパーテーションを拡張します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/260e1865-0dcc-d8d9-7bee-8f483f24e837.png)
しかし、まだパーテーションは上記のとおり20GBになっています。
拡張を反映するためにはここで一回再起動が必要となりました。
**reboot**を実行します。
するとパーテーションが拡張されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/c6c286a0-de34-d6a5-4d86-7acd8fdefee7.png)
##ファイルシステムの拡張
しかし、いまだマウントしているファイルシステムとしては20GBになっていますので、
次に**resize2fs**コマンドでファイルシステムを拡張します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405875/cad01fe8-fd04-d9a0-1ede-447b887b48e5.png)
これで拡張が完了しました。
使用率も50%台に下がりました。
#最後に
少々旧聞に属する内容ですが、参考にしたガイドでも再起動が必要になる事などは記載がありませんでしたので、直近で実施した記録を情報として保管する意味も含めて記事にしました。(ひょっとしたら同環境で再起動不要の方法が存在するかも）
Googleスプレッドシートの縦横変換をSQLでおこなう

この記事は[ZOZOテクノロジーズ #1 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech) 18日目の記事になります。

また、今年は全部で5つのAdvent Calendarが公開されています。

[ZOZOテクノロジーズ #2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech2)
[ZOZOテクノロジーズ #3 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech3)
[ZOZOテクノロジーズ #4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech4)
[ZOZOテクノロジーズ #5 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech5)

# 概要
皆さんはGoogleスプレッドシート上でSQLを使ってテーブル(表)から別のテーブルを生成できることはご存知でしょうか。
本記事では、Googleスプレッドシート上でのSQLの使い方をご紹介します。
また実際にSQLを使って役に立ったテーブルの縦横変換についてご紹介します。

# QUERY関数
QUERY Functionを利用することでGoogleスプレッドシートでSQLを利用することができます。
例えば以下のような「商品」シートのテーブルから、12月以降に発売された商品を価格順に並び替えたテーブルを作成してみます。

<img width="480" alt="shohin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/55ba1f71-f023-0b76-e823-362d439a0fd1.png">


## クエリ
別のシートで以下のようにQUERY Functionの中にSQLを書いてやることで、SQLの結果のテーブルが生成されます。

```
=Query('商品'!A:C,"select A, B, C where C >= date '2019-12-01'")
```

## 結果
クエリの結果以下のような表が生成されました。期待通りの結果になっていますね。

<img width="513" alt="sorted_shohin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/79bfd90f-858d-bde9-54cf-b0b2cb568983.png">


# 縦横変換
続いて以下のような家事管理テーブルから、誰がどのくらいどの家事をやっているかといった積み上げグラフを作りたいというケースについて考えます。
積み上げグラフを作るにはタスクの種類と時間で縦横変換をしてやる必要があります。

<img width="502" alt="kaji.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/b9c2bb74-f14e-7dfb-85c5-3495d001c6d5.png">


## クエリ
以下のように`group by`の中で`pivot`を利用することで、縦横変換ができます。

```
=Query('家事'!A:C,"select A,sum(C) group by A pivot B")
```

## 結果
以下のように種類・時間についての縦横が変換された表が生成されました。

<img width="762" alt="pivoted_kaji.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/eeb5c403-c850-d8ca-fb8f-cca3ca990044.png">


## グラフの生成
以上の表から実際にグラフを生成したものが以下になります。
このグラフから、お父さんが全然家事をやっていないことがわかります。
この結果を利用すれば家族会議でお母さんがやっている家事をお父さんにやってもらうということが約束できそうですね。

<img width="603" alt="kaji_graph.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74514/e2563415-c515-9bea-692e-895e56c4e3c9.png">


# まとめ
以上のようにQUERY関数を利用することでGoogleスプレッドシートでSQLを利用できるということを紹介しました。
また`gropup by`のなかで`pivot`を利用することで簡単に縦横変換ができることを紹介しました。


明日は@pkinoさんです。
プログラマー 365日日記

# エンジニアを初めて日記
ｴﾝﾀｰ！ ﾄﾞｺﾀﾞｰ！ ﾊﾛｰ Qiita！
今日は新卒未経験エンジニアがどのようにエンジニアとしてやってきたのかの、振り返り・反省をします。

つらつら書きますのでよろしくお願いいたします。
あっ、良かったチャンネ（省略）

## ①【そもそものそも】プログラミングを始めた理由

ITの可能性を感じ、手に職をつけたい！というインスピレーションを受けたからです。

でも、正直プログラミングは苦手でした。
数学科出身なので大学の授業とかで触れましたが全然書けませんでした。
隣の席の友人に頭を下げて教えてもらってました。

意味が分からず出席だけして、単位を獲得しました。

## ②【大暴露】初めて最初の1ヶ月

とにかく基礎を勉強して、あとはアウトプット！
日中は自社サービスを既存のソースコードを見よう見まねで書いて、意味はググって開発しました。
夜は市販の参考書やウェブサイトの動画で勉強して基礎を作る時間に充ててました。

正直ここが一番しんどいです！全然できないから！

## ③【衝撃の発見】気づいたこと

ソースコードは言語です！つまりアウトプットすることが大切です！
書いて書いて書いてを繰り返すのが身につく近道です。

ひたすら英語でネイティブの人と話しまくっていきます。言葉わかんないけど話す。
でもソースコードは自分では動かないので、自分のペースでかけます。
あと待ったをかけて、ググって答えを探すこともできます。

考える→ググる→書く→考える→・・・を繰り返しましょう！
C > 3.141592を「+0.3141592E+001」という形式でprintfする | Link: How to get the sign, mantissa and exponent of a floating point number

```txt:動作環境
gcc 8.3
実際の対象は C89の組込み環境
```

### 概要

- C89用の実装
- 3.141592を「+0.3141592E+001」という形式でprintfする
    - 仮数部: 0 < X <= 1.0
- C++11のfrexp, frexpf, frexplなどは使えない

### 実装 v0.1

https://ideone.com/m94cRb

```c
#include <stdio.h>
#include <stdbool.h>
#include <math.h>

int calcShift(float inpval, bool upward)
{
    // upward: upward or downward search
    
	int res = 0;

	while(1) {
		if (inpval > 0.1 && inpval <= 1.0) {
			break;
		}
		if (upward) {
			inpval *= 10.0;
			res++;
		} else {
			inpval /= 10.0;
			res--;
		}
	}
	return res;
}

void printInExponent(float inpval)
{
	int expnt; // exponent to normalize (1.0)
	float mnts; // mantissa (0 < X <= 1.0)
	char sign;

	float absval = fabs(inpval);
	if (absval < 1.0) {
		expnt = calcShift(absval, /*upward=*/true);
	} else {
		expnt = calcShift(absval, /*upward=*/false);
	}
	mnts = inpval * pow(10.0, expnt);
	if (expnt >= 0) {
		sign = '-';
	} else {
		sign = '+';
		expnt = -expnt; // to make absolute 
	}
	printf(" %+9.7fE%c%03d\n", mnts, sign, expnt);
}

int main(void) {
	printInExponent(3.141592);
	printInExponent(-0.027182);
	printInExponent(60.22);
	printInExponent(-1023.0);
}
```


### 結果

```txt
 +0.3141592E+001
 -0.2718200E-001
 +0.6022000E+002
 -0.1023000E+004
```

### 関連して見つけた情報

今回の実装で使わなかったが、関連して見つけた情報

- [How to get the sign, mantissa and exponent of a floating point number](https://stackoverflow.com/questions/15685181/how-to-get-the-sign-mantissa-and-exponent-of-a-floating-point-number)

符号、仮数部、指数部を取得できる。今回の実装においては、取得した仮数部を(0, 1]で規格化することになり、この実装は有効ではなかった。

### 実装 v0.2

- 0.0に対する処理追加
- E-000をE+000表記に変更

https://ideone.com/YpbJfm

```c
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#include <float.h>

int calcShift(float inpval, bool upward)
{
    // upward: upward or downward search
    
	int res = 0;
	
	if (fabs(inpval) < FLT_EPSILON) {
		return res;
	}

	while(1) {
		if (inpval > 0.1 && inpval <= 1.0) {
			break;
		}
		if (upward) {
			inpval *= 10.0;
			res++;
		} else {
			inpval /= 10.0;
			res--;
		}
	}
	return res;
}

void printInExponent(float inpval)
{
	int expnt; // exponent to normalize (1.0)
	float mnts; // mantissa (0 < X <= 1.0)
	char sign;

	float absval = fabs(inpval);
	if (absval < 1.0) {
		expnt = calcShift(absval, /*upward=*/true);
	} else {
		expnt = calcShift(absval, /*upward=*/false);
	}
	mnts = inpval * pow(10.0, expnt);
	if (expnt > 0) {
		sign = '-';
	} else {
		sign = '+';
		expnt = -expnt; // to make absolute 
	}
	printf(" %+9.7fE%c%03d\n", mnts, sign, expnt);
}

int main(void) {
	printInExponent(3.141592);
	printInExponent(0.0);
	printInExponent(-0.027182);
	printInExponent(60.22);
	printInExponent(-1023.0);
}
```

```txt:結果
 +0.3141592E+001
 +0.0000000E+000
 -0.2718200E-001
 +0.6022000E+002
 -0.1023000E+004
```

### 補足 > 四捨五入

`printInExponent(3.1415926);`とした時`+0.3141593E+001`となる。
表示桁の下位にて四捨五入される。
Firebaseを使ってみたので、所感を語ってみる

#目的
Firebaseって何？
使ってみたいけどどんなものなの？って人向け

#ざっくりFirebaseってどんなものなのか？
ざっくり説明します。
Googleが提供するBaasの一種。
Node.jsを利用したWebアプリケーションのバックエンドサービスです。
と言っても何を言っているのかわからないと思います。

Firebaseの基本的な構想としては（と言うよりもBaasの構想かな？）バックエンドの開発が必要ないサービスです。
例えば、ログイン機能。
Authenticationの機能がFirebase側で用意されていますので、フロントでFirebaseのAuthenticationを記述します。
そうするとあら簡単、ログイン機能完成です。

こう言ったバックエンドサービスを提供しているのがFirebaseなんですよ。って理解で良いと思います。

#Node.jsとは？
Node.jsとは、javascriptで開発可能な、サーバーサイド向けのプラットフォームのことです。
プラットフォームである。と言うことが重要です。フレームワークではありません。
簡単に言うと、Javascriptのコードを解釈して、バックエンドで動作させることができるのがNode.jsです。
実行する機能を持っているので、フレームワークとは明確に異なります。（単純なAPIの集合体ではないってことです。）

#Node.jsの利点
##フロントもバックエンドも同じ言語で記述できる。
Javascriptをかけるエンジニアだけ集めればいいじゃん！
　→ 人員を集めるハードルが下がる。
　　→ そして地球は平和になる。

##シングルスレッドで、かつ非同期で動作するJavascriptをサーバー側でも動作させることができる。
多くの端末からアクセスされるシステムに強い！（C10K問題の解消）
　→ スマホアプリなんかの開発が楽になる！
　　→ そして地球は平和になる。

#ここがすごいよFirebase
##バックエンドの処理がいらない！
上の説明と重複しますが、以下のようなシステムの場合を考えてみましょう。
「ログイン」
「会員登録」
「商品登録」（写真アップロード）
・
・
etc

こんなシステムの場合、バックエンドの処理が一切必要ありません。

ログイン・・・Firebaseが用意している関数を利用すれば即実装可能。
DBへの登録・・・フロント側からDBの保存処理用の関数を呼べば登録可能。
写真のアップロード・・・Storage（AWSでいうとS3みたいな機能）への保存処理をフロントから呼ぶ
・
・
・
みたいな感じですので、フロント側の処理でほとんどの処理が実装可能です。

##ミドルウェアが一切必要ない！
これすごいんすよ。
一番感動したのが、ローカル環境でコマンドラインから

```
firebase serve
```

って打つと、ローカルからFirebaseのDBを勝手に参照してくれるんです。
各自で環境を用意する必要が一切ない。

Node.js入れて、firebaseCli入れて、firebase loginして実行すればどこでも誰でも環境完成です。
configで参照先編集して、とかvagrantの環境を自分用に編集してとか、ファイアーウォールの設定してとか諸々の準備が必要ありません。

##運用費やっす！
小規模のスマホアプリやWebアプリなら断然安いです。
企業様向けのシステムでも小規模システムなら運用費数百円〜千円前後で済むこともあります。

大規模になると、多分高くなります。（従量課金なので）
見積もったことないのでわからないんですが、大規模な開発はそもそもBaasの基本設計思考から外れるんじゃないのかな？と個人的には思っています。

#ここが困るよFirebase
##RDBMSとは違う！どっちかっていうとKVSに近いDB！
つまりこういうことです。

・条件文に否定が使えない。
・条件文にorが存在しない。（最新のアップデートで使えるようになったんでしたっけ？）
・Group Byが使えない
　etc

RDBMSに慣れていると、すっごく不便に感じます。

解消方法としては、Algoriaってツールが代表的ですね。
Algoriaに関しては・・・ざっくり言うと、全文検索を実現してくれるツールです。
使用感としては、AWSのElasticsearchと似た感じなのかなぁ。
※Algoriaの導入にはお金がかかります。

##Functionsで拾えないエラーがある。
Functionsっていうバックエンドで動かしたい場合に利用する機能があります。（例えばバッチ処理とか、他システムからのAPI通信とか）
ここでエラーログが出力されなくて困りました。

今回本問題にぶつかったのは、恐らくメモリが足りなくて怒られているんじゃないか？という予想をしたエラー。
本当の原因はまだ分かっていないんですが、何故か処理が途中で止まる。エラーログも吐き出されない。
本当に困りました。メモリを上げて実行してみたら正常に動作しましたので、一応解決という方針にしましたが。。。

#Firebaseの導入すべきプロジェクト
##独断と偏見による　導入するならこんなプロジェクトじゃない？
・リアルタイムで通信が必要なシステム
・接続クライアントが多いシステム
・小規模なプロジェクト

##独断と偏見による　導入すべきではないプロジェクト
・大規模なプロジェクト
・複雑なデータ管理が必要なプロジェクト

#まとめ
私が感じた個人的なFirebaseの強みは、バックエンドの処理が必要ないこと。
逆にいうと、必要機能はFirebaseが用意してくれているので、Firebaseを超えた機能を使いたい場合、または、既存機能を使わず、カスタマイズして利用したい。などは非常に大変だと思います。

つまりカスタマイズ性が低い。
その点で言うと、AWSはカスタマイズ性が高いです。できないことがほぼ無い。ミドルウェアだって用意し放題だし。

しかしながら、小規模開発、またはリアルタイム通信を沢山行いたい。と言う案件であれば、機能、料金的にみても、Firebaseがオススメです。
（と言うかC10K問題にぶつかるんならNode.js利用が良いのですが。）

因みに、私が個人的にアプリ開発をするとなれば、Firebaseを使います。
圧倒的な運用費の安さが魅力です。
企業様からの案件だったら、案件内容にもよりますが、要望に答えやすいように、AWSをオススメしちゃうかなー。
まぁでも、提案内容にもよりますが、機能的な制限はAWSよりはありますが、Firebaseを選ぶ企業様も多いんじゃないかなー。だって安いし。

ってのが個人的な所感です。
ELBはPublic Subnetにおくことを意識する

## 今度はどうしたのか

*当たり前のことを書くので、*
*AWS中級者以上の方々にはつまらない記事になることをご了承ください。*


先日、今までなんとなくしか意識していなかったのか
構築中に「あれ？なんで？ん？」
という **うっかりミス** がありました。

ちょっとその事象を記録します。



## やろうとしてたこと

ELB(L7)をフロントに置いて、ECSへのアクセスを考えていた。

ECSの設定等は今回考慮せず、シンプルに全体的にこんな感じの想定です。 **本来は。**

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/6aa566be-a429-ecbe-304a-20814de9e064.png)





もはや省略しますが、VPCやサブネット、SG作成をして
ALB作成して、ACMで証明書発行。関連付けて、OK！

じゃ、繋いでみるかー！
テストでnginx置いてみよ。

・・・



## 起きたこと

ブラウザ画面
<img width="649" alt="スクリーンショット 2019-12-16 15.57.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/36374502-7381-b410-92a2-9d203c6807b0.png">

....... :bulb: 

あーわかった、LBのSecurityGroupミスったのかな？
　→HTTPS(443)空いてないとか、絞ってる指定IPが違うとか！！(あるいは自分のIPが違う)

![pict1_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/26535270-5094-d8d0-014f-948f6b18f29a.png)

**あってた**

........... :bulb: 

PublicSubnetなのにInternetGateway当ててなかったり…

![pict2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/faf9b4aa-781a-0a71-042c-7aae08734667.png)


**しなかった**

...................... :bulb: 

ルートテーブル、違うものあててる？

と、こんな感じで30分以上トラブルシューティングしてました。

・そもそもACMアタッチできてないのでは？？

・え、LBの種類あってる？L7？

・VPC全部同じ？笑

・じゃあ…あ！逆に受ける側のECSサービスのSecurityGroupがあってないのか？

見たけど、全く問題なし。

 :cry: 
 
## 問題だったのは？

本当に気づかなかった。
 
 実は今回、NATゲートウェイを挟んでいますが
 彼らのためにProtected Subnetを用意しています。

 LBのターゲットは、Protected Subnet上に設置しているECSだったな。
とELBの画面から確認。


![pict3_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/cce8a5fa-1694-f78b-636a-0cb15f4b3f4e.png)

 
 ん・・・？
 
**いや、ここはターゲットじゃなくてロードバランサー自体の場所...**

つまり、ここはターゲットのサブネットではなく、ELBを配置するPublic Subnetがないといけな(

![pict4_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/97c321e5-2def-80a4-87f0-b97a5b413671.png)

**こ　れ　か**

そう、これはつまり、LBがPublicではなくProtectedにしまわれています。
しまっちゃうおじさんが原因です。外に出てません。

つまりこういう事**(酷い)**

![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/3be97149-5975-6185-d6d9-210e7abde890.png)

フロントにいるはずのELB、そこじゃ見られるわけがないですね。

正しく修正します。
せっかくなのでELBの作成画面。サブネットを指定する場所です。

![pict5_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/d1192871-20a8-6921-0b2b-097e2fff0eac.png)


これで外に出ました。

<img width="604" alt="スクリーンショット 2019-12-16 15.49.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/9195cfe2-31b0-d06b-1b66-f9a0d758924d.png">


疎通テストOK！他は全然問題なかった。
凡ミスすぎて泣ける。


## まとめ

構成図が頭に入っていても、ネットワーキングは構築時に小さなミスを起こしがちです。
だから、その辺りも含めて**自分で把握しきったテンプレート**を使った方が無難かもしれません。

AWSの学習をして資格取ったりもしていますが、構築をしていて気付く事は
**やってみないとわからない**事が多いということです。


他に今回得られた経験としては、特に構築時点では、自分で決めたName Tagに騙されるなということです。
IGWが通ってない状態ならただのPrivate Subnetだし、
NAT Gatewayへのルートを通していなければ、まだProtected Subnetではありません。

まだまだ精進します。 :fire: 


## おまけ


アーキテクチャ図は draw.io で作成しました。
**無料**です。最近のアーキテクチャ図も対応しています。(AWS公式)
[New 2018 AWS icons – draw.io](https://about.draw.io/new-aws-icons-2018/)

draw.ioの良いところは、pngファイルとして保存しただけでも、次の編集時に**pngファイルを開くだけで通常の編集ができる**という点です。専用の形式があるわけではないので、保存が楽。
Rails 多次元配列とかを出力したい

PHPだったら `var_dump` や `var_export` などで配列やobjectの内容を出力してくれるが、Railsだとちょっとわかりにくかったのでメモ。

```ruby
data = [
  {'id' => 1, 'name' => 'tom'},
  {'id' => 2, 'name' => 'ken'},
  {'id' => 3, 'name' => 'guhi'}
]

data2 = [[
  {'id' => 1, 'name' => 'tom'},
  {'id' => 2, 'name' => 'ken'},
  {'id' => 3, 'name' => 'guhi'}
]]

# putsするとdataもdata2も同じ出力結果になる。ループするときに困った。
puts data
puts data2

# 解決策 to_sをつけてputs
puts data.to_s
puts data2.to_s
```

これで期待した通り、多次元になっている様子を見れた。
`to_s` は配列でもハッシュでも数字でもなんでも文字列化するよっていうこと。

追記

### 解決策2 （@eRy-sk さんありがとうございます！）
Kernel#pメソッドを使用。

```ruby
p data
# [{"id"=>1, "name"=>"tom"}, {"id"=>2, "name"=>"ken"}, {"id"=>3, "name"=>"guhi"}]

p data2
# [[{"id"=>1, "name"=>"tom"}, {"id"=>2, "name"=>"ken"}, {"id"=>3, "name"=>"guhi"}]]
```
コンテナ開発ってやつがわかってきた！

# Dockerコンテナたち、upせよ!

* Django-appコンテナ
* MySQLコンテナ
* Cassandraコンテナ

ローカルのDjango frameworkのプロジェクトディレクトリはDjango-appコンテナにマウントされている。この結果、開発中にローカルでなしたコードの変更はすぐにDjango-appコンテナ内で走るwebappに反映される。結構賢くて感動してしまった。(要確認)

# コンテナの中からssh接続でgit clone

コンテナ内部にssh接続のための秘密鍵が必要になる。参考ページが完璧すぎるのでそちらを参照あれ。

参考: [Dockerでgithubのプライベートリポジトリをsshでcloneする](https://www.jonki.net/entry/2018/03/24/054407)
Akashic Engine で3D

Akashic Advent Calendar 2019 十八日目の記事です。

Akashic Engine は2D専用ゲームエンジンです。コンソール機で言えばスーパーファミコンやメガドライブの世代とも言えますが、そんな時代にも本物の3Dのゲームがありました。この記事では ソフトウェア3Dレンダラー [amber](https://github.com/blackspotbear/amber) を使った Akashic Engine での3Dゲーム開発を検討します。

## amber とは

amber はソフトウェアによる3Dレンダラーです。ハードウェアの機能やWebGLのようなAPIを利用しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540569/235d54cd-bbb5-8172-5bb9-277ea76307af.png)

_画像は README から転載。_

次の機能が用意されています。

- テクスチャマッピング
- フラットシェーダ
- シーングラフ
- カリング(AABB)
- OBJファイルの読み込み
- プログラマブルシェーダ
    - TS/JS で記述。

一方、半透明やアニメーションはサポートされていません。

## amber の導入

amber は npmjs に publish されていません。GitHubからインストールします

```sh
npm install blackspotbear/amber
```

## Akashic Engine からの利用

amber 付属のサンプルは Akashic Engine への組み込み例となっています。 3Dモデルの描画方法の説明はサンプルに譲り、ここでは amber の組み込み手順のみ取り上げます。

amber を組み込む際は amber とゲームエンジンをつなぎ合わせる２つの機能を実装する必要があります。

### ObjResource

amber が[objファイル](https://ja.wikipedia.org/wiki/Wavefront_.obj%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)をパースする時、マテリアルやテクスチャといった関連ファイルを読み込む機能を提供します。ファイル読み込みの方法はゲームエンジンごとに異なるので、ユーザがこのインターフェースを実装することになります。

```typescript
interface ObjResource {
	getTextureData(name: string): { width: number; height: number; rgba: Uint8ClampedArray};
	getMaterialText(name: string): string;
}
```

サンプルコードの [main.ts#L31-L47](https://github.com/blackspotbear/amber/blob/08fc6765548d89563970584e3eed9fc75574d67e/demo/src/main.ts#L31-L47) が実装例です。

### FrameBuffer

amber はレンダリング結果を `FrameBuffer` に書き込みます。 `FrameBuffer` の内容を実際に画面上に表示することはユーザの責務になります。

```typescript
interface FrameBuffer {
    resolution: {
        width: number;
        height: number;
    };
    colorBuffer: number[];
    zBuffer: number[];
}
```

サンプルコードの [FrameBuffer.ts#L20-L62](https://github.com/blackspotbear/amber/blob/534685686f9be0e6e5ea246e14fd99ea165c7761/demo/src/a3d/FrameBuffer.ts#L20-L62) が実装例です。

amber と ゲームエンジンを結びつける実装は以上となります。

# どんなゲームが作れるのか？

amber は描画の全てをJSエンジン上で実行します。そのためポリゴン数の大きなモデルの描画には時間がかかります。また `FrameBuffer` を大きくすることも負荷につながります（デモは低解像度でレンダリングしたものを拡大して表示している）。ゲームでの利用を考えるとフレームレートが安定するように気をつける必要があります。どのくらいの頂点数まで利用できそうか調べてみます（解像度はデモと同じとする）。

デモに付属するモデルのうち、[ロケット](https://poly.google.com/view/42PQqEaxb-P)の頂点数は 646 でした。 akashic-sandbox のプロファイラでCPU利用時間を調べてみます。筆者の MacBook Pro (1.4 GHz Intel Core i5) での結果です。

![profile-rocket.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540569/c7ec8e09-c299-da81-9b0e-33ebf95f6f99.gif)

１フレームあたり 9[ms] 程度かかっているようです。 30[FPS] のゲームでは１フレームあたり 33.3[ms] で処理を終える必要があります。描画に使える時間を 15[ms] とすると 646 x 15 / 9 = 1076 で 1000 頂点が目安になりそうです。単純に 3 で割れば 333 ポリゴンです。

[スーファミ版スターフォックス](https://en.wikipedia.org/wiki/Star_Fox_(1993_video_game)) や メガドライブ版バーチャレーシング くらいが限界でしょうか。

# 最後に

ソフトウェア3Dレンダラー amber を利用することで Akashic Engine で 3D ゲームを開発することを検討しました。かなり厳しい制約があることがわかりました。損得や合理性より大切なものがある人が人生を楽しむのに適当なアプローチかと思います。
Go2 contracts proposalが大幅更新された (12/15)

いわゆるGo2 proposalsのひとつ、contractsが以下で提案されています。
https://go-review.googlesource.com/c/go/+/187317

さる12月15日、このproposalに大きな変更が加わったのでこれをまとめてみました。自分用に翻訳したものなので、おぼつかないところはご容赦ください。

## READMEの翻訳
### ステータス

このCLが最後に更新されてから、大きな進展がありました。
いくつかの例外(下記参照)を除き、contractsの提案のほとんどの側面は、少なくともいくつかのテスト(但し、バグはあるだろう)で実装されています。それぞれのファイルに記載されている少数の既知の問題を除き、go/typesはtestdataとexamplesディレクトリにあるすべての*.go2テストファイルをタイプチェックできるようになりました。

### 代替表記
contractsに対する代替表記を試すために、この実装ではコントラクトの代わりに(パラメータ化される可能性がある)インタフェースを使用できます。具体的には、次の表記が許可され、同等です:

```go
contract C(P1, P2) {
        P1 m1(x P1)
        P2 m2(x P1) P2
        P2 int, float64
}

// used in a generic function

func f (type P1, P2 C) (x P1, y P2) P2

// それぞれの型パラメータP1とP2の範囲（制約）を
// 記述する一対のパラメータ化された、同等のインターフェース
// I1とI2を使うことができます:

type I1(type P1) interface {
        m1(x P1)
}

type I2(type P1, P2) interface {
        m2(x P1) P2
        type int, float64
}
```

上記の関数fは、次のように記述できます:

```go
func f(type P1 I1(P1), P2 I2(P1, P2)) (x P1, y P2) P2
```

明らかに、インターフェース表記は一般的に長くなりますが、根本的な新しいメカニズムを必要としません(型リストを列挙する能力を別にすれば)。多くの場合(ほとんど?)、インターフェースをパラメータ化する必要はまったくありません。その場合、タイピングのオーバーヘッドはそれほど大きくありません。インタフェースを制約として使用することで、同時に既存のインタフェース(例: io.Reader)を直接使用できるようになります。

内部的には、型チェッカーは「コンポーネントインタフェース」にコントラクトを「分解」します。各型パラメータはコントラクトの各型パラメータでパラメータ化されることがあります。コントラクトの代わりにインタフェースを直接使用できるようにすると、実装が簡単になります。言い換えると、コントラクト表記は、インターフェースとして表現される型パラメーター範囲に対する糖衣構文と見なすことができます。

### 既知の問題
* gofmtがパラメータ化されたコードでは部分的にしか動作しない。
* ジェネリックを実装しエクスポートしたパッケージのインポートは実装されていない。（このプロトタイプには実装されないだろう）
* 実際の実装では、はるかに優れたエラーメッセージが実装されていることだろう。
* コントラクトの埋め込みはまだ実装されていない。
* インターフェースの埋め込みはインターフェースの型リストを無視する。
* ジェネリクスの式に対するさまざまな型固有の操作がまだ機能しない（比較的簡単に実装できる）。

## 例など

今回追加された examples/testdata の中からいくつか興味深いものをご紹介します。

### インターフェースを用いたNode/Edgeの例

```go
// Same Graph using interface bounds instead of a contract.

type AltGraph (type Node NodeFace(Edge), Edge EdgeFace(Node)) struct { }

func AltNew (type Node NodeFace(Edge), Edge EdgeFace(Node)) (nodes []Node) *AltGraph(Node, Edge)

func (g *AltGraph(N, E)) ShortestPath(from, to N) []E

type NodeFace(type Edge) interface {
	Edges() []Edge
}

type EdgeFace(type Node) interface {
	Nodes() (from, to Node)
}
```

### メソッドに自身の型を受け取る Adder interface

```go
type Adder(type T) interface {
        Add(T) T
}

func adderSum(type T Adder(T))(data []T) T {
        var s T
        for _, x := range data {
                s = s.Add(x)
        }
        return s
}
```

_以下、面白そうなものがあれば追記します。_

## 感想
これまでの変更より曖昧さが排除されて、より具体的なイメージがつくようになりました。依然複雑なところは複雑にはなるので賛否両論ありそうですが、contractsの枠に縛られずinterfaceの拡張という方向に落とし込んだのは流石だなと感じました。個人的にはとても楽しみです。

これからより一層議論を重ねて仕様も熟成されてくると思うので、引き続きチェックしていきたいと思います！
Androidスマホの音声をパソコンにミラーリングする方法

#Androidスマホの音声をパソコンにミラーリングする
Androidスマホの音声をパソコンで流したい人もますます増えているようですね。
スマホの画面をパソコンに出力するガイドはたくさんありますが、
**スマホの音声をパソコンにミラーリングする方法**は多くではありません。
では、この記事はAndroidスマホの音声をパソコンにミラーリングする方法について、ご紹介します。

1.スマホとパソコンを同じWi-Fiネットワークに接続しておきます。
2.パソコンに[LetsView](https://letsview.com/jp/) をダウンロードして、起動します。
[LetsViewダウンロード](https://download.aoscdn.com/down.php?softid=letsview) 
3.スマホの**ワイヤレス投影機能**を利用します。(スマホ機種によってその機能の名前も違いますので、気をつけてください。)
4.スマホで「設定」＞「その他の接続」を選択します。
![android-1217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/644c018d-82cc-3b8a-ec03-c123479f82b6.png)
5.「PC モード」＞「ワイヤレス投影」をタップして、お使いのデバイスを検索します。
![wireless-link-1022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/7c65a77d-0cd6-ea18-d99c-a43bc4704c0b.jpeg)
6.完了したら、Android スマホの音声をパソコンに出力できます。
MATLAB でデータ解析！と、その前に。

# はじめに
データ解析に役立つ MATLAB ですが、ここではまずデータにアクセスするための下準備について見ていきましょう。**例えば、複数人で同じ PC の MATLAB を使う場合、前の人が使った環境が残ってるとやっかいですよね？自分には関係ないフォルダにアクセスしちゃう、同じ名前の知らない関数呼ばれちゃう、なんてことありますよね。**そこで、使う人ごとに環境を用意してしまおう、というのがメインです。

# バージョン
MATLAB (R2019b) のみ！
# 結論から
- 必要なフォルダに前もってパスを通し、終了時にキレイさっぱりが理想！
- パス関連のコマンドについて、使い方を覚えておくと便利！
- **addpath** で通したパスは、MATLAB セッションが切れると削除される！

# 想定している環境
フォルダ構成はこんな感じです。**F1** ～ **F3** が自由にアクセスしたいフォルダです。**F3** にはサブフォルダ **F3_sub** があります。また、**.m** の関数はパスを設定するプログラムになります。
![2019-12-17_9-20-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482843/73ef4923-3d64-d9ef-6af5-5b68b84aba20.jpeg)

#フォルダが既知で、数が少ない場合
今回みたいに、フォルダが事前に分かっていて、数が少ない場合はこんな感じ。

```MATLAB:addTESTpath.m
function addTESTpath
% addTESTpath.m が置かれているフォルダ
rootDir = fileparts(mfilename('fullpath'));

% パスに追加するフォルダのリスト
path_temp = {};
path_temp{end+1} = rootDir;
path_temp{end+1} = fullfile(rootDir,'F1');
path_temp{end+1} = fullfile(rootDir,'F2');
path_temp{end+1} = fullfile(rootDir,'F3');
path_temp{end+1} = fullfile(rootDir,'F3', 'F3_sub');

% パスへ追加
addpath(path_temp{:},'-end');
```

1行目は、addTESTpath.m が置かれているフォルダのパスが出てきます。

```
rootDir = fileparts(mfilename('fullpath')); 
```

そこがルートフォルダになるので、その下にあるフォルダを追加していくイメージです。最後に addpath を使用して終わり。パスの優先順位を下げたい場合に、**-end** オプションを使用します。

```
addpath(path_temp{:},'-end');
```

ポイントは、この addpath で通したパス。**今のセッションだけ有効です。** MATLABを再起動すれば、この情報は消えています。つまり、**次使う人にとって余分な情報は残りません！**
#フォルダが未知、もしくは既知でも数が多い場合
上記みたいに、１つずつ指定するのは...サブフォルダまで知らないし...と感じたら自動化してみましょう。

```MATLAB:addTESTpath_autoh.m
function addTESTpath_auto
% addTESTpath_auto.m が置かれているフォルダ
rootDir = fileparts(mfilename('fullpath'));

% パスに追加するフォルダのリスト（フォルダだけ抽出）
flist = dir(rootDir);
flist = flist(~ismember({flist.name}, { '..'}));
flist = flist([flist.isdir]);

% パスに追加するフォルダのリスト
flist_full = arrayfun(@(x) genpath(x.name),flist,'UniformOutput',false);

% パスへ追加
addpath(flist_full{:},'-end');
```
フォルダ情報や構成は、**dir** や **genpath** を組み合わせてみました。

# 結果
こんな感じになりました :grin:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482843/7c1d0180-12fc-726d-91a6-2a29ab09cad1.png)

# 参考情報
> - [サブフォルダ名の取得​時に.や..を除く方​法について教えてくだ​さい]
(https://jp.mathworks.com/matlabcentral/answers/382376-)
- [【MATLAB】パス設定に関する"基礎"知識]
(https://qiita.com/eigs/items/96697bd372cd45508ff1)
- [dirでファイルだけ取り出したい！]
(https://qiita.com/ginger893/items/0e2cd95cca71e8f5a7f4)
HTMLでピアノを作ろうや

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の17日目の記事です。
# はじめに
HTMLとJavaScriptを書いてサクッとピアノを実装したってだけのお話。

# デモサイト
[ピアノ デモサイト](https://tomowarkar.github.io/blog_content/piano/index.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235435/5f98ece3-2b73-3302-2fb7-06c23d931780.png)
# コード
```
piano/
├── index.html
├── script.js
├── sounds
│   ├── do.mp3
│   ├── fa.mp3
│   ├── mi.mp3
│   ├── ra.mp3
│   ├── re.mp3
│   ├── si.mp3
│   └── so.mp3
└── style.css
```

```index.html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="initial-scale=1.0" />
  <title></title>
  <link rel="stylesheet" href="style.css" type="text/css">
  <script defer src="script.js"></script>
</head>

<body>
  <div class="piano">
    <div data-sound="do" class="key white"></div>
    <div class="black"></div>
    <div data-sound="re" class="key white"></div>
    <div class="black"></div>
    <div data-sound="mi" class="key white"></div>
    <div data-sound="fa" class="key white"></div>
    <div class="black"></div>
    <div data-sound="so" class="key white"></div>
    <div class="black"></div>
    <div data-sound="ra" class="key white"></div>
    <div class="black"></div>
    <div data-sound="si" class="key white"></div>
  </div>
  <audio id="do" src="sounds/do.mp3"></audio>
  <audio id="re" src="sounds/re.mp3"></audio>
  <audio id="mi" src="sounds/mi.mp3"></audio>
  <audio id="fa" src="sounds/fa.mp3"></audio>
  <audio id="so" src="sounds/so.mp3"></audio>
  <audio id="ra" src="sounds/ra.mp3"></audio>
  <audio id="si" src="sounds/si.mp3"></audio>
</body>

</html>
```

```style.css
*{
  box-sizing: border-box;
}

body{
  background-color: green;
  margin: 0;
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}

.piano{
  display: flex;
}

.white{
  width:80px;
  height: 320px;
  background-color: white;
  border: 1px solid gray;
}

.black{
  width:48px;
  height: 192px;
  background-color: black;
  margin-left: -24px;
  margin-right: -24px;
  z-index: 2;
}
```

```script.js
const keys = document.querySelectorAll('.key')

keys.forEach(key=>{
  key.addEventListener('click', ()=>playPiano(key))
})

function playPiano(key) {
  const audio = document.getElementById(key.dataset.sound)
  audio.currentTime = 0
  audio.play()
}
```
# おわりに
案外簡単に実装できますねー

以上明日も頑張ります！！
[tomowarkar ひとりAdvent Calendar Advent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)
プロジェクト作成後のレイアウト変更[AndroidStudio]

実習形式の授業を受ける中でAndroidStudioを使用していますが、main.xmlが仕様なのかプロジェクトを作成するとConstraintLayoutで作成されます。
使用する教材の関係上、結構な頻度でLinearLayoutでプログラムを作成することが多いです、毎回中身書き換えたりする手間を減らしたいなーと少ない変更手順を模索。
自分が手探りで考えた中でレイアウト変更最速かな、という手順をメモ代わりにここに書きます。
まずmainのxmlをDesignモードに切り替えて、ComponentTreeのレイアウトを右クリックしConvert view...を選択。
![WS000019.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552427/8d118b9f-5321-28ea-71bd-b08e1d079cb8.jpeg)
一覧からLinearLayoutを選択し変更(Horizontal)。
![WS000016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552427/6f0c3b7e-95c7-16a1-766e-fbd7b0d27d49.jpeg)
授業でverticalを利用することが多いのでここで変更。
![WS000018.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552427/a545c55e-167e-61a2-a356-5caed0fe6ef9.jpeg)
最短目指してこうなりましたが、もうちょっとスマートに出来たらなーと思ったりもします。
プロジェクト作成時にデフォルトで使うレイアウト指定できればいいんですけどね。
RE:Zoomdataを使ってみよう！（その４）

##さて、その前に・・・
MemSQLを使ってみようシリーズですが、今回からはいよいよ実践編に入ろうと思います・・・・が、その前に前回まで3回に渡って情報のアップデートを行ってきた、可視化環境としてのZoomdata4.9LTSとの連携設定を行いたいと思います。データの羅列を見て頂いても良いのですが、せっかく可視化環境がありますので高性能がどう活用出来るかも含めて、具体的なヒントになるような感じで解説をしていきたいと思います。

####Zoomdataのコネクタについて
![Screenshot from 2019-12-13 15-19-23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/989ef0e6-1221-15f9-783b-dd14a4e2d82b.jpeg)
以前のバージョンでは、非常に多種多様なコネクタを標準装備・・・（この辺は、業界的な流れでもあったので、致し方無し的な状況だったのですが、最近は敢えて良く使われるコネクタに絞ったり、第3者の権利関係をクリアしてから使えるようにする傾向が大きくなってきました。（Zoomdataもその扱い方が徹底されてきており、標準装備、導入作業が必用、別途OPで発注と区分が分かれてきたようです）

###MemSQLコネクタの導入
基本的にはZoomdataの公式ホームページの手順に従って作業を行えば、スムーズ且つ問題無く追加出来ますので、慌てないでじっくりと作業を進めてください。（如何に要点のみを紹介しておきます）
####(1)コネクタに必要なドライバの入手
JDBCのドライバをMySQLの公式サイトより入手します。
[**ダウンロードURLはこちら・・**](https://dev.mysql.com/downloads/connector/j/)

![Screenshot from 2019-12-13 15-07-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/f9e5dc23-5610-cf8b-1348-9c12a7b6bdc0.jpeg)
今回は、CentOS7にZoomdataを試用導入していますので、TARフォーマット版をダウンロードしてきます。
####(2)ドライバの展開と設置
ダウンロードしてきたファイルを適宜展開します。
![Screenshot from 2019-12-13 15-08-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/6d3ac6a0-ab96-f1cb-ab1f-1454918f33d9.jpeg)
![Screenshot from 2019-12-13 15-08-57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/c6aa5068-9123-543f-fdb1-8d7e2423f66f.jpeg)
jarファイルを以下の場所に設置します。

```shell
    /usr/local/share/java/zoomdata
```

この時に、上記のディレクトリが存在しない場合は作成してから設置してください。Zoomdataのコネクタ追加では、このディレクトリに必要なコネクタ環境を構築していくイメージになります。
####(3)設定ファイルの作成
次に、コネクタが読みに来るプロパティファイルを作成します。
作成する場所は

```shell
    /etc/zoomdata
```
ディレクトリになります。また、ここはZoomdataの動作に関する重要な設定ファイルが有りますので、くれぐれも他のファイルに粗相をしないようにお願い致します。

パーミッションが無い場合は必殺のsudoで以下の通りファイルを作成します。

```shell
sudo vi /etc/zoomdata/edc-memsql.properties
```

エディターが開いたら以下の行を入力します。

```shell
datasource.driver-config.jar-path=/usr/local/share/java/zoomdata
datasource.driver-config.class-name=com.mysql.cj.jdbc.Driver
```

正常に書き込まれたら、今回はCentSO7ですので（他の場合はその方式でお願い致します）

```shell
sudo systemctl restart zoomdata-edc-memsql
```

コネクタが再起動されてくると、
![Screenshot from 2019-12-13 15-26-50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/0b073178-84bd-8a5b-25d9-303fed1bff30.jpeg)
という形でMemSQLのコネクタが表示されてくると思います。

参考URL
https://documentation.logianalytics.com/zoomdataltsactive/topics/connectors/memsql/connecting-to-memsql.html
https://documentation.logianalytics.com/zoomdataltsactive/topics/installation/jdbc-driver-add.html

##次回は・・
次回は、いよいよMemSQL上にCSVファイルを使ったデーブルを作成し、今回作成したZoomdataのコネクタ経由の可視化を行ってみます。

[**MemSQLを使ってみようVol.5 : 番外編**](https://qiita.com/wadaken1961/items/c522ba39c1e1c51c2219)に続く
rspec 基本まとめ　let など （基本+α編）伊藤さんの記事より抜粋

## 出てくるメソッド

- let
- subject

## 関連

`shared_examples`などはまたの機会に。期待する評価の値が細かく変化するときに使うみたい。

`include_context `は`centext`を再利用できるらしい
https://qiita.com/jnchito/items/42193d066bd61c740612#example-%E3%81%AE%E5%86%8D%E5%88%A9%E7%94%A8-shared_examples-%E3%81%A8-it_behaves_like

### let 

- letメリット
  - インスタンス変数を置き換えられる
  - 遅延評価

```ruby
#let使わない
before do
 @params = {name:"太郎"}
end

#let

let(:params){{name:"太郎"}}

##こんな使い方も
 let(:user) { User.new(params) }
    let(:params) { { name: 'たろう' } }
```

### 処理の順番

```ruby
RSpec.describe User do
  describe '#greet' do
    let(:user) { User.new(params) }
    let(:params) { { name: 'たろう', age: age } }
    context '12歳以下の場合' do
      let(:age) { 12 }
      it 'ひらがなで答えること' do
        expect(user.greet).to eq 'ぼくはたろうだよ。'
      end
    end
    context '13歳以上の場合' do
      let(:age) { 13 }
      it '漢字で答えること' do
        expect(user.greet).to eq '僕はたろうです。'
      end
    end
  end
end

```

- 処理の順番はこれらしい。ふむふむ

1.expect(user.greet).to が呼ばれる => user って何だ？
2.let(:user) { User.new(params) } が呼ばれる => params って何だ？
3.let(:params) { { name: 'たろう', age: age } } が呼ばれる => age って何だ？
4.let(:age) { 12 } （または13） が呼ばれる

結果として expect(User.new(name: 'たろう', age: 12).greet).to を呼んだことになる


### subject

上記のspecを見ると`user.greet`が重複している。かきの表現が同じみたい

`subject { user.greet }` == `is_expected`

it do; end をまとめた下記の書き方はよく見かける

`is_expected` → `it { is_expected.to eq '' }`

- こうなるみたい

```ruby
RSpec.describe User do
  describe '#greet' do
    let(:user) { User.new(params) }
    let(:params) { { name: 'たろう', age: age } }
    subject { user.greet }
    context '12歳以下の場合' do
      let(:age) { 12 }
      it { is_expected.to eq 'ぼくはたろうだよ。' }
    end
    context '13歳以上の場合' do
      let(:age) { 13 }
      it { is_expected.to eq '僕はたろうです。' }
    end
  end
end
```

- letの名前などリファクタリングされて完成

```ruby
RSpec.describe User do
  describe '#greet' do
    let(:user) { User.new(name: 'たろう', age: age) }
    subject { user.greet }
    context '12歳以下の場合' do
      let(:age) { 12 }
      it { is_expected.to eq 'ぼくはたろうだよ。' }
    end
    context '13歳以上の場合' do
      let(:age) { 13 }
      it { is_expected.to eq '僕はたろうです。' }
    end
  end
end
```

## letの注意点 let!

- 遅延評価があだになるらしい。

letは遅延評価の為に下記の場合評価のタイミングで読んでも遅いらしい。

```ruby:失敗例
RSpec.describe Blog do
  let(:blog) { Blog.create(title: 'RSpec必勝法', content: 'あとで書く') }
  it 'ブログの取得ができること' do
    expect(Blog.first).to eq blog
  end
end
```

- 対策



```ruby:対策１beforeで明示的に呼ぶ
RSpec.describe Blog do
  let(:blog) { Blog.create(title: 'RSpec必勝法', content: 'あとで書く') }
  before do
    blog # ここでデータベースにレコードを保存する
  end
  it 'ブログの取得ができること' do
    expect(Blog.first).to eq blog
  end
end
```

```ruby:対策2let!で遅延評価しない
RSpec.describe Blog do
  let!(:blog) { Blog.create(title: 'RSpec必勝法', content: 'あとで書く') }
  it 'ブログの取得ができること' do
    expect(Blog.first).to eq blog
  end
end
```

## まとめ

伊藤淳一さんの記事は最高だ
Everyday Rails-RSpecも良い


## 参考記事


伊藤淳一さんの記事

https://qiita.com/jnchito/items/42193d066bd61c740612#%E5%BF%9C%E7%94%A8%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E9%AB%98%E5%BA%A6%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF
ShiftJIS死すべし

<h1>結論</h1>
shift_jis使うなMS932使え

<h2>いきさつ</h2>
csvUploadの処理を作っていて"～"が?に化けた
OracleはJA16SJISTILDEだから～使えるはず

と思って調べたらjsp側の文字コードが悪かった

<%@ page contentType="text/html;charset=Shift_JIS"%>
↓
<%@ page contentType="text/html; charset=MS932" %>
に変更したら解決した
[Docker]bundler: failed to load command: rails (/usr/local/bundle/bin/rails) とBundler::GemNotFoundの対処について


Dockerでrailsのアプリケーションを作っている際に出会ったエラーで、
いろんなことを試してもなかなか解決できなかったのでメモです。

## 出会ったエラー

```
bundler: failed to load command: rails (/usr/local/bundle/bin/rails) 
Bundler::GemNotFound
```
今までは普通に起動できていたのですが、railsアプリ内にdbのvolumeフォルダが間違えてできてしまっていたため、削除した際に起きたエラーです。


## 試したこと
- 前のコミットに戻る
- PC再起動
- コンテナ全て削除
- イメージ削除
- volume削除
- webコンテナ内で、
`bundle install`
`gem install bundler`などなど…

いろいろと試しましたが、エラーが消えず悩みました。

## 解決した方法

Dockerfileの一番上に書いてある

```
FROM ruby:2.4.1
```
を、

```
FROM ruby:2.6
```

に変更するとうまくいきました。

bundle installなどを繰り返しているうちに　pathがおかしくなってしまったのかもしれません。

何かの参考になれば幸いです。
railsのActiveRecordで最新のレコード１件取得する

#はじめに
Ruby on Rails 2 Advent Calendar 2019の17日目の記事になります！
railsで最新レコード１件を取得する方法についての紹介です。（小ネタです。）

##最新のレコード１件取得する
ユーザーテーブルで直近で更新されたレコード１件を取得したい・・・
そんな場合は以下のコードになります。

```
#モデル名はUser
@user = User.order(updated_at: :desc).limit(1)

#例えば最新登録ユーザーを5名取得したいなどの場合は以下でデータを取得できます。
@user = User.order(created_at: :desc).limit(5)
```
 
#まとめ
この記事で誤っている箇所や追記したほうが良い点がありましたらコメント欄などでご指摘いただけますとありがたいです！
普段はSQLを使っているのでActiveRecordになれたいところです。
SSL証明書の署名アルゴリズムを調べる

日本政府が、2019年度末で使用停止としているSHA-1署名のSSL証明書。

自分が使っている証明書が、SHA-2(sha256)となっているか確認するコマンドを調べた。

```bash:bash
$ openssl s_client -connect domain.com:443 -showcerts < /dev/null | openssl x509 -text -in /dev/stdin    
```

このコマンドで得た出力の中に、以下の記述があればSHA-2であると考えていい。

```text:output
...
Certificate:
  Data:
    ...
  Signature Algorithm: sha256WithRSAEncryption
    ...
...
```

ブラウザ上で調べる方法もありますが、黒い画面に向かう人間からすると、コマンドのほうが安心感がある。
v-onでクリックイベント作ったる！ ❏Vue.js❏

`v-on:イベント="処理"`でいける
`@イベント="処理"`と省略可

<br>
今回はボタンをクリックした分、numberを増やします。

[![Screenshot from Gyazo](https://gyazo.com/0a1801eb887ebf65b878d6f412810508/raw)](https://gyazo.com/0a1801eb887ebf65b878d6f412810508)

実際にやってみよう！

開発環境はJSFiddle
https://qiita.com/ITmanbow/items/9ae48d37aa5b847f1b3b

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p>{{ number }}回クリック</p>
  <button @click="countUp">+1</button>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
  	number: 0
  },
  methods: {
  	countUp() {
    	this.number += 1
    }
  }
})
```

<br>
いろんなイベント駆使してアプリケーション作れたら楽しいだろうなぁ。。

<br>
ではまた！
「git stash save "コメント"」のコメントを後から変えたい

```git
git stash save "コメント"
```
としたときの「コメント」を後から変えたい時。
該当のstashを一度popして、再度stash…とするのが面倒な時は

```sh
.git/refs/stash
```

を開いて変更したいコメントを直接編集。
**自己責任でお願いします**
Angularのプロジェクトをとりあえず動かすためのFirebase連携

# TL;DR
キャッシュ関連でハマるのは時間がもったいないという話

# Firebaseを使ってみる
・herokuと似た感じで使える(NoSQL/SNS認証はFirebase、cron周りはherokuが優秀っぽい)
・とりあえずデプロイして自宅外でもイメージ確認できるように走らせてみたかった
・できればCIと繋ぎたいので、先に環境のイメージをしておきたかった
・PaaS、SaaS、IaaSの体感比較をとりためているのでその一環(ずっと記事が完成しない…)


# やったこと
1.　Firebaseのアカウント登録→FirebaseCLIのインストール
2.　``$ firebase login``でfirebaseへログインする
3.　``$ firebase init``をAngularディレクトリのルートパスで実行。
 　　　(Angularはほぼほぼ最小構成の作成済みディレクトリを使用)
3.　Firebaseの利用について聞かれるのでHostingを選択、publicをルートにするか聞かれるが
　　デフォルトでいいのでそのままエンター、SPAか聞かれるので"y"入力しエンター
4.　``$ ng build --prod`` でビルドしてdistフォルダと下位ディレクトリ作成
5.　firebase.jsonの"public"の設定をdist以下のパスで指定(ドメイン以下ディレクトリは指定可)
6.　``$ firebase deploy``でデプロイ実行、``$ firebase open``でデプロイ先ページを表示

# つまった箇所
・デプロイしてもfirebaseの作成ページから変更されない
　→firebase.jsonで初期表示時のフォルダパスを設定していることがわかったのでdist内にアクセスするよう変更

```firebase.json
"hosting": {
  "public": "dist",  // dist以下にフォルダが作成されている場合はそのフォルダ名を指定する
  "ignore": [
    "firebase.json",
    "**/.*",
    "**/node_modules/**"
  ]
}
```

・firebase.jsonのデプロイ先設定を変更してもデフォルトページが表示された
　→Chrome側でキャッシュが残ってたらしく、スーパーリロードで解決した

# まとめ
・デフォルトの設定を的にAngular側できちんと設定していればキャッシュクリアだけで対応できたので、
　忘れがちになるキャッシュクリア周りはこれからもちゃんと実施したい。

・「command + shift + r」でのスーパーリロードを忘れないように使っていきたい。

・次回はAngular + CircleCI + Firebaseの自動デプロイを試す予定。
#Stripe の定期支払いを作成した時に起こるイベント 

# 定期支払いを作成する

支払い方法が登録された顧客と、商品を紐付けて、定期支払いを作成する

![image](https://user-images.githubusercontent.com/13635059/70872096-c834d200-1fe8-11ea-989e-7b1d1745c650.png)

# 定期支払いに発生したイベントの一覧を見る

ログはこの順番で並んでいるけれど、たまたまイベント発生秒が同じだけで、本当にこの並びなのだろうか？とは思ったが、ちゃんと順番通りである気はしている。

![image](https://user-images.githubusercontent.com/13635059/70872117-0d590400-1fe9-11ea-8406-b7113a6091d1.png)

# invoice.created = 請求書下書きの作成

![image](https://user-images.githubusercontent.com/13635059/70872125-219d0100-1fe9-11ea-81f2-473ae323d39f.png)


# invoice.finalized = 請求書下書きの確定

![image](https://user-images.githubusercontent.com/13635059/70872147-472a0a80-1fe9-11ea-9c25-b95fcafa19b3.png)

# invoice.payment_succeded = 請求書(請求)に対しての支払いの成功

![image](https://user-images.githubusercontent.com/13635059/70872163-5d37cb00-1fe9-11ea-809c-ce9bfd426bb0.png)

# customer.subscription.created = 顧客の定期支払いの申し込み

支払いが成功してから定期支払いが作成されている。それはそうか。

「申し込み」という表現は引っかかるけれども、翻訳の問題だろうか。

![image](https://user-images.githubusercontent.com/13635059/70872176-73458b80-1fe9-11ea-91bc-ca83bad78291.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2852








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Javascriptで半角カナチェックの正規表現

# 概要
Javascriptで半角カタカナ以外の入力を禁止したときにチェックで使った正規表現のメモ。

# 詳細
半角カタカナのみを入力可能にする場合の正規表現チェック

```js
// 半角カナ以外を空文字に変換
convertHalfPhonetic(val) {
  return val ? val.replace(/[^ｦ-ﾟ ]*/g, "") : undefined;
}
```

半角カタカナ、半角英数字のみを入力可能にする場合の正規表現チェック

```js
// 半角カナ・英数字以外を空文字に変換
convertHalfPhonetic(val) {
  return val ? val.replace(/[^ｦ-ﾟ A-Za-z0-9]*/g, "") : undefined;
}
```

# まとめ
何かと使いどころがあるものなので、メモとして残しておきたい。
実際に使ったときは、入力項目の```blur```イベントで起動させて使った。
virtualboxにおけるRHELのNATネットワーク、ホストオンリーアダプターの設定

# virtualboxにおけるRHELのNATネットワーク、ホストオンリーアダプターの設定
- 備忘録兼Markdown記法の練習として記録を作成

## 環境
virtualbox 5.1.22
RHEL 7.6

## 手順

### RHELをインストール
1. virtualboxの新規から仮想マシンを作成
1. ストレージにRHEL7.6を設定して起動
1. 目的に沿った環境をインストールする

### NATネットワークの追加
1. virtualboxマネージャのメニューから[ファイル]→[環境設定]を選択
1. 環境設定ダイアログの「ネットワーク」からNATネットワークを追加  
(ホストオンリーアダプターが存在しない場合はここでホストオンリーアダプターも追加)

### ネットワーク設定
1. インストールして再起動した後、仮想マシンを落とす
1. 対象の仮想マシンを選択して設定を開く
1. ネットワークを選択し、アダプター1にNATネットワークを設定
1. アダプター2はホストオンリーアダプターを設定

### RHELのネットワーク設定
1. 対象の仮想マシンを立ち上げる
1. ログインしたら`ip a`で接続先が2つあることを確認  
(enp0s3(NATネットワーク)とenp0s8(ホストオンリーアダプター)があるはず)  
(GUIの場合はもう一つ存在する)
1. `nmtui`コマンドでネットワーク設定を行う
1. GUI画面が起動したら、**接続の編集(Edit a connection)**を選択
1. ホストオンリーアダプターの設定が存在しないので追加(Add)を選択
1. プロファイル名、デバイス名を**enp0s8**に設定
1. IPV4をmanualに変更し、IPアドレスを入力(ホストオンリーアダプターの範囲内で)
1. OKを選択したら一番初めの画面に戻り、**接続をアクティベートする(Active a connection)**を選択
1. *がついてない接続を選択し、アクティベートする
1. 本設定を終了し、コマンドラインに戻ったら、`ip a`でそれぞれIPが振られていることを確認
1. 同ネットワークの別ホストからping等で通信ができることを確認 


## 参照
[【VirtualBox】NATネットワークでゲストPC同士を通信させる](http://atomiyama.com/linux/page/natnetwork-01/)
[VirtualBoxのネットワーク設定　NATとNATネットワーク設定について](https://qiita.com/nyamada43/items/6a43f04102b991a4e4db)
[virtualboxでホストオンリーアダプターを利用して、SSH接続を行う｜Windows10](https://qiita.com/koki276/items/28a87eb06abb4d8b5e13)
情シスのGoogleフォーム活用

[サムザップ #2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sumzap2) の12/17の記事です。

株式会社サムザップのいわゆる情シス担当者です。
私自身は生粋のエンジニアというわけではないので
箸休め程度に見ていただければ幸いです。

#はじめに
情シスの日々の業務として半分以上が社員からの問い合わせ対応です。
入退社やPC障害、物品購入依頼など、多い月だと50件以上対応することもあります。
口頭で依頼を直接受けたりSlackから直接受けたりと、問い合わせ窓口が煩雑化してしまいがちです。

#問い合わせフォームを活用
対応漏れや属人化を極力減らすため、窓口としてGoogleフォームを採用しました。
GoogleフォームはGAS(GoogleAppsScript)で通知をSlackやChatworkに飛ばしたり、
工数管理ツールに飛ばして集計出来たりするので特にオススメです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371723/9af8d09e-15b5-efac-6642-ca9b98b6235c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371723/e677ddc4-b6ac-e31f-5e3c-95b53b780176.png)こんな感じで通知されます。

GASスクリプトなどは[こちら](https://github.com/furukaw/google-form-to-slack)を参考にカスタマイズして使用しています。

#まとめ
回答をスプレッドシートに出力すれば問い合わせ内容の集計や傾向を分析することもできます。
Gsuite契約されている会社さんは積極的にGoogleサービスを活用しましょう！


明日は@ninomiya_shotaさんの記事です。