OmniAICreator/Qiita-1.07M huggingface dataset:
DockerのCPUsサイズを変更する

# 想定環境

- macOS High Sierra `10.13.5`
- Docker `18.03.1`
- Virtual Box `5.2.12`


# docker run の --cpus オプションは VM の CPU 以上は指定できない


Preferences > Advanced の設定では， `CPUs: 4` になっていたとしても `docker run --cpus 2` と指定して動かせるわけではない．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/7c918b0b-9dbc-80a0-d9c3-b4af84f66326.png)


docker run すると `docker: Error response from daemon: Range of CPUs is from 0.01 to 1.00, as there are only 1 CPUs available.` というエラーが出る場合は，VM側で許可されている CPUs が `1` になっているため．


![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/b2721c6c-f6e6-87be-99e1-5932f6efe74d.png)


# 一度 docker container を停止し，Processors > CPUs 割り当てを増やす

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/4a03aec7-eec9-db28-26cd-1f2ca0eb5786.png)


# docker container 作成時に指定するパターン

`--virtualbox-cpu-count` オプションで VM の CPUs 割り当てを指定．

```bash
docker-machine create -d virtualbox --virtualbox-cpu-count 2 dev
```
兼テスト投稿

とりあえずテスト的に何か投稿してみる。

汎用機のCOBOL85の時代から始まったエンジニア稼業、
エンジニアとしての旬はとっくに過ぎ、
オブジェクト指向はさっぱりである。

今はマネージが主体で実装する機会はかなり少ないが、
手が足りないときに足を引っ張らない程度に作ることもある。

EclipseやVisualStudioといった統合ツールに苦戦しながらも、
日頃対人圧力で心折れることも多い中、
実際に作っているときはそれなりに愉しんでいるように思う。

プログラミング技術に限らず、
気付いたことや気になったことをメモしていこうと思う。
LumenとLaravelの違いメモ

# はじめに

Lumenを使っていて出会ったあれ?と思ったことをメモ。

大きな違いはララ帳の[LUMENとLARAVELの違い](https://laravel10.wordpress.com/2015/04/21/lumenとlaravelの違い/)などにまとまっていますが、細かなところでもちょこちょこ違うようです。

問題に出会ったら追記していきます。

# responseまわり

* `response`ヘルパーの中に`Laravel\Lumen\Http\ResponseFactory`クラスがハードコードされています。(LaravelのはDIコンテナで`Illuminate\Contracts\Routing\ResponseFactory`を解決するようになっています)
* `Response`ファサードがありません。
    * `Response`ファサードのクラス自体はあるのですが、`getFacadeAccessor()`が返す`ResponseFactoryContract`クラスがDIコンテナに登録されていないので使えません。
    * `Laravel\Lumen\Application`クラスが登録するファサードのaliasのリストにも含まれていないしマニュアルにも記述がないので存在しないことになっていると思われます

# routeまわり

* 名前をつけるのに`name()`メソッドが使えません。かわりに以下のように書きます。

```php
$router->get('profile', [
    'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
```

# envまわり

* 読み込む環境設定ファイルが`.env`固定になっていて、`--env`オプションや`APP_ENV`環境変数の値でsuffix違いのを読み込む機能がありません。(軽量化のため?)
    * phpunitのときはテスト用のDB接続を使いたいといったときに面倒なので、自分は`bootstrap/app.php`を書き換えました。

# testまわり

* Laravelでは5.5からtestsディレクトリが`Tests`というnamespace下に置かれたのですが、Lumenはnamespaceがないままです。
* `RefreshDatabase`トレイトがありません。
* `route()`ヘルパーが返す値がおかしいのでそのままでは使えません。
    * これについてはLaravel Newsに[Using Named Routes in a Lumen Test](https://laravel-news.com/using-named-routes-lumen-test)という記事があってどうすればいいかも書いてありますがやや面倒です。

# おわりに

LumenはLaravelと似たようなものかと思うと細かいところが違っているので、Laravelに慣れているとはまりがちな印象。
sql礼賛

dbiとsqlでmysqlをいじるなりmongoクエリを発行するなりするのが基本的にはベストプラクティスだと強く確信するのだけれど、そんな事を大きな声で言ったら、非国民扱いかオールドタイマーの戯言と言われそうで夏だというのに気持ちもふさぎ込んでしまいます。

つまりorm(orマッパー)はクソであるという仮設が覆せないにもかかわらず、ormを使わないと非国民扱いをされそうな脅迫的被害者妄想にとらわれてしまうのは、僕の考えすぎなのでしょうか。

https://www.kaitoy.xyz/2015/09/13/orm-is-offensive-anti-pattern/

どうしてsqlという抽象化がなされた言語の上にオレオレな'僕の考えた最強のDSL'をできの悪い分厚いコンドームみたいにかぶせたがるのか。

未だに理解できないでいる。
HTMLの文書構造についてこだわりたいっ

**文章構造にこだわってコーディングしよう**
と思ってはいるものの、今までなんとなくやってきたので反省点として振り返るためにも記事にまとめることにしました。
何かアドバイスがあればよろしくお願いします。

##HTMLの文書構造を意識する
HTML5のセクショニングだとか、いろいろ調べてると小難しいことばかりで理解が追い付かなかったので自己流で。

慣れていれば大丈夫なのでしょうけども、最初からCSSで見た目と同時に作成をするとデザインとごちゃごちゃになってしまいがちなので、私はまず以下の点を意識してHTMLを作成します。

* 文書（要素・段落）のアウトライン

Wordとかいうドキュメント作成を使った事がある方ならニュアンスが伝わると思いますが、まずは文字だけでバランスを見て整えていきます。

以下の要素があるとします。

###要素
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/269200/90a26895-287e-8ed7-fb3f-d834c7b27760.png)

まずは普通にやってみます。
はじめに大きく「グループ化」します（div class="hoge"でくくる）。
なんとなく情報を分けます。

```html
<div class="hoge">
	<h1>●●のお知らせ</h1>
	<p>毎日暑い日が続きますが、いかがお過ごしでしょうか。この度、暑気払いとして以下の日時でイベントを開催いたします。皆様ふるってご参加ください。<br>なお、飲食を伴うため、ペットの同伴はご遠慮ください。</p>
	<ul>
		<li>日時：12月12日　13時から</li>
		<li>場所：まるぺけ公園</li>
	</ul>
	<p><img src="../../sample.png" alt="" width="124" height="84" alt="去年のイベント風景"></p>
	<p>送信者：宇宙人</p>
</div>
```

さらに、それぞれの意味を考えてマークアップをしてみます。

* 見出しとなるものはどこか
* 重要なキーワードは何か。強調したい文章はあるか。
* 画像は意味のある画像か（背景にするかどうか）。
* imgの画像サイズ、altは必ず入れる。
    * ※画像サイズを指定しないとブラウザが判断にとまどい読み込みが遅れてしまう場合があるため、予め指定してあげます。
    * altも画像表示されない場合の代替になり、音声ブラウザでは読み上げられるらしいので意味のある画像であれば必ずいれます。

今回は、

1. 見出し：●●のお知らせ
2. キーワード：イベントを開催
3. 強調したい文章：なお、飲食を伴うため、ペットの同伴はご遠慮ください。
4. 画像は、去年のイベントの風景なのでimgとして使用。

という事にしました。

```html
<div class="hoge">
	<h1>●●のお知らせ</h1>
	<p>毎日暑い日が続きますが、いかがお過ごしでしょうか。</p>
	<p>この度、暑気払いとして以下の日時で<strong>イベントを開催</strong>いたします。<br>皆様ふるってご参加ください。</p>
	<p><em>なお、飲食を伴うため、ペットのご同伴はご遠慮ください。</em></p>
	<ul>
		<li>日時：12月12日　13時から</li>
		<li>場所：まるぺけ公園</li>
	</ul>
	<p><img src="../../sample.png" alt="" width="124" height="84"></p>
	<p><span>送信者：宇宙人</span></p>
</div>
```

素のHTMLだとこんな感じになります。
これだけでも一応、見た目で段落など分かれてて見やすいですね。

###素のHTML
![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/269200/8232a796-47bc-b0cc-6f1f-4b6069f4f607.png)


HTML情報の出し方ですが、私の場合、上から重要な情報を置いていきアウトラインも意識します。
このあたりはSEOに詳しい方に相談された方が良いと思いますが、個人的にはなるべく上から順番においていくようにしています。

```html
<div class="hoge">
	<h1>●●のお知らせ</h1>	
	<div class="group01">
		<p>毎日暑い日が続きますが、いかがお過ごしでしょうか。</p>
		<p>この度、暑気払いとして以下の日時で<strong>イベントを開催</strong>いたします。<br>皆様ふるってご参加ください。</p>
		<p><em>なお、飲食を伴うため、ペットの同伴はご遠慮ください。</em></p>
	</div>
	<div class="group02">
		<p><img src="../../sample.png" alt="" width="124" height="84"></p>
		<ul>
			<li>日時：12月12日　13時から</li>
			<li>場所：まるぺけ公園</li>
		</ul>
	</div>
	<p><span>送信者：宇宙人</span></p>
</div>
```

さらに本文と日程をグループ分けしました。
後はCSSで見た目を整えれば完成。

###完成イメージ
![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/269200/23611a92-f489-a6a7-b4b7-783df1d0241b.png) 


##強調タグについて

私は以下の3種類を強調目的で使い分けています。

* strong ・・・検索に強調したいワードとして使う
* em　・・・ユーザーに強調したい場合に使う
* b ・・・意味がなく単にデザイン的に太字にしたいもの。

##デザインについてちょっと余談

良いデザイン・良いコーディングはユーザーがパッと見て直感的に理解できるデザインだと思います。

例えば、

* hやstrongを使いたい場所が一目でわかるようにデザインされている
* 段落・カテゴリの分類が一目でわかり、ユーザーにとって構造が意識しやすいデザインになっている
* デザインに反復要素がある（法則性がある）

良いデザインだとマークアップが楽になり、コーディングもやりやすくなります。
デザイン、ワイヤーを作成する上でも文書構造を意識することは大切ですね。

自論ですが、正しい文書構造のHTMLはユーザーにより正しい情報を伝える事になり、よい結果に結びつくと思っています。
ユーザーに正しい情報を伝えるために「意味のある」コーディングを意識していきたいです。
スマホ版chromeでタップ位置がずれるバグ 


Chrome 66で一部のAndroid端末でタップ位置がずれる問題が発生したのでその調査記録です。
細かい発生条件とかを書いてあるサイトがなかったので調べてみました。

# 再現手順

```html

<!DOCTYPE html>
<meta name="viewport" content="width=360">
<div style="position:fixed;width:100px;height:100px;background-color:#000;top:0;left:0;"></div>
<div style="margin-top:500px;height:100px;background-color:#f00;" onclick="alert('1st button clicked');">1st button</div>
<div style="margin-bottom:500px;height: 100px;background-color:#0f0;" onclick="alert('2nd button clicked');">2nd button</div>
```

上記ページを画面幅が361px以上のデバイスで閲覧し、上にスクロールしていくと、上の黒い四角が上にスクロールしていくことがある。 [^1] この状態で二つ目のボタンをタップすると「1st button clicked」と表示される。
もともとの画面幅が361px以上でないデバイスでも、設定→ユーザー補助→表示サイズを小さくする、開発者オプション→最小幅を変更するなどの方法で画面幅を変えることで再現可能。


[^1]: なぜか再現しないこともある。拡大したり縮小したりすると再現しやすい？気がする。

# 原因

Chromeのバグ
https://bugs.chromium.org/p/chromium/issues/detail?id=839383
https://bugs.chromium.org/p/chromium/issues/detail?id=843498
<meta>タグでviewportのwidthを数値で指定しており、かつ指定したwidthが実際のデバイス幅より小さいときに起こる。
すでに修正済みのようなのでそのうち治るはず。

# 解決策

viewportのwidthを数値で指定せずdevice-widthにする。

```html
<meta name="viewport" content="width=device-width">
```

# 参考にしたリンク

https://teratail.com/questions/125197
http://3rdcom.tokyo/2018/05/27/%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A0%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%81%A8%E3%82%BF%E3%83%83%E3%83%97%E4%BD%8D%E7%BD%AE/
https://bugs.chromium.org/p/chromium/issues/detail?id=839383
https://bugs.chromium.org/p/chromium/issues/detail?id=843498
IPアドレスから国を取得する (Java)


■参照
http://cc.wariate.jp


```java

package hello.java.net;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressLookUpMain {

 // see http://cc.wariate.jp/
 static String baseHost = "cc.wariate.jp";

 static String[] locales = "JP,US,KR,CH,HK".split(",");

 public static String getCountry(String s) throws UnknownHostException {

 InetAddress inetAddr = InetAddress.getByName(s); // throws
 // UnknownHostException

 byte[] byteAddr = inetAddr.getAddress();

 StringBuffer sb = new StringBuffer();

 for (int i = (byteAddr.length - 1); i >= 0; i--) {
 int unsignedByte = byteAddr[i] < 0 ? byteAddr[i] + 256
 : byteAddr[i];
 sb.append(unsignedByte + ".");
 }

 for (int n = 0; n < locales.length; n++) {

 String country = locales[n];

 String lookupHost = sb.toString() + country.toLowerCase() + "."
 + baseHost;

 try {
 InetAddress.getByName(lookupHost);
 return (locales[n]);
 } catch (UnknownHostException e) {
 // e.printStackTrace();
 }

 }

 return null;
 }

 public static void main(String[] args) throws Exception {
 System.out.println(getCountry("www.yahoo.co.jp"));
 System.out.println(getCountry("www.ibm.com"));
 System.out.println(getCountry("daum.net"));
 System.out.println(getCountry("weibo.com"));
 System.out.println(getCountry("aho"));
 }
}

```

結果

```java
JP
US
KR
HK
Exception in thread "main" java.net.UnknownHostException: aho: aho
 at java.net.InetAddress.getAllByName0(InetAddress.java:1270)
 at java.net.InetAddress.getAllByName(InetAddress.java:1197)
 at java.net.InetAddress.getAllByName(InetAddress.java:1119)
 at java.net.InetAddress.getByName(InetAddress.java:1069)
 at hello.java.net.InetAddressLookUpMain.getLocale(InetAddressLookUpMain.java:14)
 at hello.java.net.InetAddressLookUpMain.main(InetAddressLookUpMain.java:55)

```
AndroidSDK 26.1.1 インストール for Mac

とりあえずAndroidSDK 26.1.1のインストールメモ。
すべてCLIだけ。Android Studioなし。


## ダウンロード

[本家のダウンロードページ](https://developer.android.com/studio/)下方にあるsdk-tools-darwin-*version*.zip のダウンロードリンクからダウンロードする。
展開するとtoolsというディレクトリができるので、適当なディレクトリに置いておく。
今回は適当に`/opt/android-sdk`にした。

```
$ unzip sdk-tools-darwin-4333796.zip
$ sudo mkdir /opt/android-sdk
$ sudo chown username:staff android-sdk
$ mv tools /opt/android-sdk
```

## パスを通す

`/opt/android-sdk/tools/bin`にパスを通す。
※　`android`コマンドがdeprecatedなので、`/opt/android-sdk/tools/`は不要。


`.bash_profile`でPATHに追加するだけ。

```
$ vi ~/.bash_profile
```


```bash
export ANDROID_SDK_ROOT=/opt/android-sdk
export PATH="$ANDROID_SDK_ROOT/tools/bin:$PATH"     
```

反映させる。

```bash
$ source ~/.bash_profile 
```

とりあえずsdkmanagerがつかえるようになる。

```bash
$ sdkmanager
Warning: File /Users/username/.android/repositories.cfg could not be loaded.
[=======================================] 100% Computing updates...   
```

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

sdkパッケージを管理するツール`sdkmanager`を使用

パッケージのリストは

```bash
$ sdkmanager --list
```

で確認する。とりあえず最低限必要な以下をインストール。

- platform-tools
- build-tools
- emulator
- HAXM

### ツールのインストール

```bash
$ sdkmanager "platform-tools" "build-tools;28.0.1" "emulator" "extras;intel;Hardware_Accelerated_Execution_Manager"
```

いろいろはいってる。

```bash
$ ls /opt/android-sdk/
build-tools		extras		emulator	licenses	platform-tools	platforms
tools
```

### システムイメージのインストール

```
$ sdkmanager "system-images;android-25;google_apis;x86"
```


## ADVの作成

エミュレータでデバッグするために、`avdmanager`を使用して、advを作成する。

`-n`でavdの名前、`-d`でデバイスの種類、`-k` で先程インストールしたシステムイメージを指定する。
デバイスの種類は `avdmanager list device`で確認できる。


```
$ avdmanager create avd -n "test_avd" -d "tv_1080p" -k "system-images;android-25;google_apis;x86
```
SAS Viyaによる機械学習の始め方（Python編）

SAS Viyaを使って機械学習を行う方法としてはStudioというWebアプリケーションで行う方法と、Python/Java/R/SASといった言語から操作する方法とがあります。

今回はPythonを使ったSAS Viyaのコントロール法についてまとめました。

## ライブラリの読み込み

まずSASライブラリを読み込みます。

```python
from swat import *
from pprint import pprint
```

## セッションを開始する

サーバに繋ぎます。

```python
cashost='localhost'
casport=5570
casauth='~/.authinfo'
sess = CAS(cashost, casport, authinfo=casauth, caslib="casuser")
```

## アクションセットを読み込む

処理によって異なるアクションセットを読み込みます。例えばテキストマイニングの場合はtextMiningを指定します。

```python
sess.loadactionset(actionset="textMining")
```

## データを読み込む

処理対象のデータを読み込みます。インポート先のテーブルも指定します。

```python
indata_dir = "/home/viyauser/casuser/data"
if not sess.table.tableExists(table="news").exists:
    sess.upload_file(indata_dir + "/news.sas7bdat", casout={"name":"news"})
```

## 分析を実行

テキストマイニングを実行します。

```python
sess.textMining.tmMine(
  documents={"name":"news"},
  stopList={"name":"engstop"},
  docId="key",
  text="text",
  reduce=2,
  entities="STD",
  k=10,
  norm="DOC",
  u={"name":"svdu", "replace":True},
  terms={"name":"terms", "replace":True},
  parent={"name":"parent", "replace":True},
  parseConfig={"name":"config", "replace":True},
  docPro={"name":"docpro", "replace":True},
  topics={"name":"topics", "replace":True}  
)
```

## 結果の表示

例えば良く出てくるトピックを抽出します。

```python
allRows=20000  # Assuming max rows in terms table is <= 20,000
terms_sorted=sess.CASTable("terms").fetch(to=allRows)['Fetch'].sort_values(by="_NumDocs_", ascending=False)

print("10 Topics found by PROC TEXTMINE".center(80, '-'))
pprint(sess.CASTable("topics").fetch(to=10))
```

以下がその結果です。

```
------------------------10 Topics found by PROC TEXTMINE------------------------
CASResults([('Fetch',
             Selected Rows from Table TOPICS

   _TopicId_                                           _Name_  _TermCutOff_
0        1.0  league, +defenseman, hockey, tampa, +draft pick         0.021
1        2.0            +keyboard, pc, +price, +mouse, +thumb         0.021
2        3.0             +flyer, amour, +goal, tommy, lindros         0.020
3        4.0              period, scorer g, scorer, power, pp         0.021
4        5.0     gif, +injury, +muscle, +keyboard, +condition         0.020
5        6.0    +tool, +break, +exercise, +type, +description         0.022
6        7.0                +cancer, +day, +bath, water, +eat         0.022
7        8.0                   +versus, tor, mon, van, series         0.023
8        9.0        business, political, college, +event, dr.         0.020
9       10.0        +system, sgi, virtual, graphics, +reality         0.024)])
```

## まとめ

Pythonで機械学習を分かりやすく書けるのがSAS Viyaの良いところです。他にもJava、R、SASにも対応していますので、好きな言語でぜひお試しください！

[SAS for Developers | SAS](https://developer.sas.com/home.html)
Ubuntuのアップデートをシェルスクリプトにしてみた

#きっかけ
毎回アプデのたびに
`sudo apt update`
`sudo apt upgrade`
するのがめんどくさくなったから作ってみました。
ついでに`sudo apt autoremove`してくれるといいなー的な
あとどのぐらい処理に時間かかったのかも気になるﾅｰ
#環境
- Ubuntu 18.04LTS (Bionic Beaver)
- GNU bash, バージョン 4.4.19(1)-release (x86_64-pc-linux-gnu)
- apt (1.6.3)

#コード
```bash:update.sh
#!/bin/bash
SECONDS=0
echo updateします...
sudo apt update
echo update完了...
echo upgradeします...
sudo apt upgrade
echo upgrade完了...
echo autoremoveします...
sudo apt -y autoremove
echo remove完了...
time=$SECONDS
echo $time"秒かかりました。"
echo 完了

```
#解説
```bash
SECOND=0

#いろんな処理

time=$SECONDS
echo $time
```
このように書くと処理にかかった時間を計れるらしい。
[bashのSECONDS変数で簡単に処理時間を測定する(Qiita)](https://qiita.com/mikeda/items/c6bb68dd1e4ba6434fb7)

自分はアプデ対象のものが何かを確認したかったので`sudo apt upgrade`には`-y`オプション(これつけるとyとかエンターするのが省ける)をつけていません。
それ以外は自動でやって欲しいので`-y`をつけました。
あと、単に自動で処理するのも味気ないのでなんかメッセージみたいなのつけてみました(笑)
俺だけの家計簿アプリ作成

## はじめに
大学に入学して、下宿を始めて金を管理するためにGoogle Playから家計簿アプリをインストール。
でも、大学生には、どのアプリも正直使いにくい。
色々な項目があってわかりづらいし、社会人みたいに決まった収入があるわけじゃないし。

そもそも、家計簿じゃなくて、数字の管理をしたいだけ。
現金、カード、銀行の三項目さえはできれば充分。
じゃあ、どうするか。

今までなかったもの、自分の欲しいものが作れる。

**それがプログラミングだ!!**

## 機能
草案だけど、次の写真みたいにする予定。

## 開発準備



- npm
最新の状態にしますよーするする

```
$ npm --version
$ npm install -g npm
$ npm rebuild
```

- Github
リモートのリポジトリと接続

```
$ mkdir calculator
$ cd calculator
作業用ブランチの作成

$ git init

$ git remote add git@github.com:kaibara/calculator.git
リモートリポジトリの反映

$ npm init
git remoteのあとに行うことで、package.jsonにリポジトリの情報が反映される

$ gcam "Create Package.json"
git add .& git commit -m "Create Package.json"の操作

$ git push --force --set-upstream origin master
リモートの状態をローカルに強制的に反映させる
```

React

## 発生した問題
 1. Githubのリモートリポジトリと接続できない!!

解決策:`git clone`時のURLをhttpsではなく、sshのURLにする。 　　

```
 $ https://github.com/kaibara/calculator.git(https)
 $ git@github.com:kaibara/calculator.git(ssh)
```
  
httpsはダウンロードするだけで開発する人向けじゃない。
sshは開発したい人向けの印象かも。
     
   

## 参考資料
Stylelint と Prettier が競合する

## 概要
表題のとおりです。
StylelintとPrettierを併用する設定にした際、
設定を間違えると、Stylelint が Prettierの書き換えた内容にOKを出さずに、
永遠にエラーが出続ける状態になるので注意が必要です。


## Stylelintの設定をPrettierに合わせる
たいていは、Stylelintの設定の`extends`には、
`stylelint-config-standard`や`stylelint-config-recommend`を指定するように解説されています。

しかしこれらの設定は、Prettierが行う自動形成にそぐわない形でルールが設定されているので、
Prettier用の`stylelint-config-prettier`を`extends`に設定する必要があります。

## 手順

### 1. `stylelint-config-prettier`をインストール
プロジェクトのルートディレクトリで、以下のコマンドを実行し`stylelint-config-prettier`をインストールします。

```shell
yarn add -D stylelint-config-prettier
```

### 2. Stylelintの設定ファイルを書き換えます。
設定ファイル `.stylelintrc` の `extends`の値を書き換えます。

```json
{
  "extends": "stylelint-config-prettier"
}
```

以上で、設定は完了です。

## 最後に
この点には本当にやられました。

何度、Stylelintのルールに沿うように修正しても、
Prettierが書き換えるので、エラーが永遠に出続けていました。

コミットにフックして、自動でLintがかかる設定にしていたので、
永遠にコミットができない状態でしたが、なんとか解決できてよかったです。

ご指摘がございましたら、ぜひともコメント・修正依頼を頂ければと思います。
ご質問には分かる範囲でお答えいたします。
Chart.js の凡例をカスタマイズする

Chart.js の凡例をカスタマイズする際には、options.legend の各プロパティを編集する。

まず表示・非表示の切り替えは display　プロパティを true/false に切り替えることで実装できる。
また凡例の表示位置は position プロパティに 'top', 'right', 'bottom', 'left' のいずれかの値をセットする。

もっと突っ込んだカスタマイズをする必要がある場合は labels.generatelabels にセットされる関数で処理を記述すればよい。この関数の引数に必要なデータが入っているので、これを利用するが、戻り値は指定された形式のオブジェクトの配列である必要がある。

通常凡例は指定した　label の文字列が順番に表示されるが、以下のコードは label とそれぞれ項目にセットしたデータを

```
項目 (データ)
```
の形で表示するためのものである。

必要なデータにアクセスするために labels.generatelabels() の引数に渡されてくるオブジェクトの　tooltip　プロパティを利用している。そもそもツールチップ表示に必要なデータが入っているが、この中にチャートで表示されているデータについてのかなりの情報が入っている。

[公式ドキュメントの凡例のページ](https://misc.0o0o.org/chartjs-doc-ja/configuration/legend.html)

```javascript

options: {
    legend: {
        display: true,
        position: 'right',
        labels: {
            generateLabels: function(data) {

                // 凡例の表示
                const chartData = data.tooltip._data;
                const chartDataset = chartData.datasets[0];
                const chartLabels = chartData.labels;

                const legendArray = [];

                for (let i = 0; i < chartLabels.length; i++) {
                    const eachLabel = chartLabels[i];
                    const eachData = chartDataset.data[i];
                    const backgroundColor = chartDataset.backgroundColor[i];

                    const eachLengend = {								                                                                                                                                                                            
                        // 表示されるラベル
                        text: `${eachLabel} ( ${eachData} )`,
                        // 凡例ボックスの塗りつぶしスタイル
                        fillStyle: backgroundColor,
                        //  trueの場合、この項目は非表示のデータセットを表します。ラベルは取り消し線を伴ってレンダリングされます
                        hidden: false,
                        // ボックス枠用。次をご覧ください。https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap
                        lineCap: "square",
                        // ボックス枠用。次をご覧ください。https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash
                        lineDash: [0],
                        // ボックス枠用。次をご覧ください。https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset
                        lineDashOffset: 0,
                        // ボックス枠用。次をご覧ください。https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin
                        lineJoin: "bevel",
                        // 枠線の幅
                        lineWidth: 1,
                        // 凡例ボックスのストロークスタイル
                        strokeStyle: "",
                        // 凡例ボックスのポイントスタイル（usePointStyleがtrueの場合にのみ使用されます）
                        pointStyle: ""
                    };

                    legendArray.push(eachLengend);

                } // end for

            return legendArray;
        }
    }
}
```

引数で渡されてくるデータの詳細なデータ構造について知りたければ上記コードでいうと

```javascript
data.tooltip._data;
```

の中身を詳しく調べてみればよい。

凡例オブジェクトのそれぞれのプロパティの詳細に関する説明はまた後ほど時間があるときに記述するつもり。（とりあえず公式ページのサンプルコードにあったコメントをそのまま貼り付けるにとどめておいた）。
Microsoft flow でワークフローつくるときはどの条件アクションがいいんだろうか考えてみた

# 今回の投稿背景
社内の承認処理について、今までSharePointのワークフローを使っていたけど
今回Microsoft Flowに焼き直しているときにふと・・・
「条件分岐って何使うのが一番いいんだろうか」
と思ったので、それぞれメリットデメリットをまとめてみました。

# ワークフロー例
4段の承認処理があり、それぞれ承認担当者が異なるワークフロー。
承認が終わらなかった場合は差し戻し状態となり
修正が終わったら再度1からフローが進行する。

# IF分岐のみで作ってみる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/db864fa2-f90e-7bad-d55a-fa54f17fd958.png)

## メリット
・フロー実行時に進行状況が見える

## デメリット
・段階が増えれば増えるほど、動的コンテンツの候補が増える
・作ってるときは死ぬほど作りにくい
・差し戻し時は一旦フローを終了して、別テーブルに退避して云々みたいなことをする必要がある
・アクションの名前が変えられなくなること多々あり
・リリース後の修正もやっぱり死ぬほどめんどくさい
・特に段階を頭や中盤に追加で入れてくれと言われたときはマジで死ぬ

## おすすめするフロー
承認段階の少なく、段階が増えそうにないフローだとこっちがいいかなと個人的には思う

# Do UntilやSwitchを組み合わせてみる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/0bbb6b73-19b0-dd5e-25e9-e8705ac58b8f.png)

## メリット
・動的コンテンツの数が条件より上のものしか出ないので、段階増やしても増えることがない
・結構作りやすい
・差し戻しも割と簡単
・段階を増やす場合もスイッチの条件を増やせばいいだけ

## デメリット
・フロー実行中の進行状態がわからない
　→Do Untilから下は実行中とだけ出て、どこの処理やってるのか見えない
・ステータス管理にちょっと工夫がいる
　→私はFlow制御専用の変数を作りました

## Microsoftへの要望
・すみません、アクションをコピーする方法作ってくれませんかね（＞＜）

## おすすめするフロー
段階が多く、今後拡張がありそうなフローはこっちのほうがいいと思われます。

# まとめ
作るフローによって、使用する条件も良し悪しがあると感じました。
まぁこれは、コーディングしてても変わらないですが・・・
いろいろ試して皆さんの最適解を見つけていくのが一番ですね＾＾
tomcatから脆弱性あるぜって言われた

yumでいれてたから直すの大変！


* 脆弱性通知

https://jvn.jp/vu/JVNVU90416738/


# tomcat ver 7.0.9.0

http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-7/v7.0.90/bin/apache-tomcat-7.0.90.zip


# yumでインストールしたtomcatを削除する
tomcatを停止する

```
sudo /etc/rc.d/init.d/tomcat7 stop
```

# tomcatの自動起動をoff
```
sudo chkconfig tomcat7 off
```

# インストールしたTomcatを確認
```
yum list installed | grep tomcat
```

# tomcatをアンインストール
```
sudo yum remove -y apache-tomcat-apis tomcat7 tomcat7-el-2.2-api tomcat7-jsp-2.2-api tomcat7-lib.noarch  tomcat7-servlet-3.0-api tomcat7-webapps
```

# Tomcatを最新にする

tomcatのダウンロードページ
https://tomcat.apache.org/download-70.cgi
バイナリディストリビューションのtarファイルをダウンロード


# work dirを掘る
```
mkdir work
```

# ダウンロードしたディストリビューションを展開
```    
unzip apache-tomcat-7.0.90.zip
```

# 解凍してできたディレクトリを移動
```
sudo mv apache-tomcat-7.0.90 /usr/local/tomcat7
```

# tomcatを起動
```
sudo /usr/local/tomcat7/bin/startup.sh
```



# 起動スクリプトに起動コマンドを記述しておくとよい
```
sudo vim /etc/rc.local
sudo /usr/local/tomcat7/bin/startup.sh
```

# nginxの向き先を変更
```
vi /etc/nginx/nginx.conf
#root /var/lib/tomcat7/webapps/;
root /usr/local/tomcat7/webapps/;
```

古いdirを消す

```
rm -rf /var/lib/tomcat7
rm -rf /var/log/tomcat7
```
MySQL8でのGeometry系関数

#結論

いきなり結論。
[ここに書いてる](https://dev.mysql.com/doc/refman/8.0/en/gis-format-conversion-functions.html)のですが、MySQL8では緯度、経度をGeometry型に変換するGeomFromTextや、Geometry型から緯度や経度を取得するXやYなどは接頭句ST_が必要になるようです。

|MySQL8以前|MySQL8|
|:-:|:-:|
|GeomFromText|ST_GeomFromText|
|X|ST_X|
|Y|ST_Y|

上記リンク先に他の関数の使用例もあるので、MySQL8でGeometry型を使用する際は熟読しましょう。（英文です）
SAS Viyaによる機械学習の始め方（R言語編）

SAS Viyaを使って機械学習を行う方法としてはStudioというWebアプリケーションで行う方法と、Python/Java/R/SASといった言語から操作する方法とがあります。

今回はR言語を使ったSAS Viyaのコントロール法についてまとめました。

## ライブラリの読み込み

まずSASライブラリを読み込みます。

```r
library('swat')
```

## セッションを開始する

サーバに繋ぎます。

```r
s <- CAS('localhost', port=5570, caslib="casuer")
```

## アクションセットを読み込む

処理によって異なるアクションセットを読み込みます。今回はデータを読み込むだけのtableを指定します。

```r
loadActionSet(s, 'table')
```

## データを読み込む

処理対象のデータを読み込みます。インポート先のテーブルも指定します。

```r
indata_dir <- "data"
indata <- "hmeq"
cas.table.loadTable(s,caslib="casuser", path=paste0(indata_dir,"/",indata,".sas7bdat"), casout=list(name=indata, replace=TRUE))
```

## テーブルの情報を表示

tableInfoでテーブルの概要情報が表示できます。

```r
cas.table.tableInfo(s, name='HMEQ')
```

| Name |Rows | Columns | Encoding | CreateTimeFormatted | ModTimeFormatted | JavaCharSet | CreateTime | ModTime | Global | Repeated | View | SourceName | SourceCaslib | Compressed | Creator | Modifier |
|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----
| HMEQ | 5960 | 13 | utf-8 | 23Jul2018:07:59:39 | 23Jul2018:07:59:39 | UTF8 | 1847951980 | 1847951980 | 0 | 0 | 0 | data/hmeq.sas7bdat | CASUSER(viyauser) | 0 | viyauser | | 

## テーブルのデータを表示

fetchでテーブルのデータを表示できます。toで表示する行数を指定します。

```r
cas.table.fetch(s, table="hmeq", to=5)
```

| _Index_ | BAD | LOAN | MORTDUE | VALUE | REASON | JOB | YOJ | DEROG | DELINQ | CLAGE | NINQ | CLNO | DEBTINC |
|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|
| 1 | 1 | 1100 | 25860 | 39025 | HomeImp | Other | 10.5 | 0 | 0 | 94.36667 | 1 | 9 | NaN |
| 2 | 1 | 1300 | 70053 | 68400 | HomeImp | Other | 7.0 | 0 | 2 | 121.83333 | 0 | 14 | NaN |
| 3 | 1 | 1500 | 13500 | 16700 | HomeImp | Other | 4.0 | 0 | 0 | 149.46667 | 1 | 10 | NaN |
| 4 | 1 | 1500 | NaN | NaN |  |  | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 5 | 0 | 1700 | 97800 | 112000 | HomeImp | Office | 3.0 | 0 | 0 | 93.33333 | 0 | 14 | NaN |

## まとめ

Rで機械学習を分かりやすく書けるのがSAS Viyaの良いところです。他にもJava、Python、SASにも対応していますので、好きな言語でぜひお試しください！

[SAS for Developers | SAS](https://developer.sas.com/home.html)
openvpnの運用でハマった

# openvpnの運用でハマった

## 今までの履歴

- 構築
  - [AWSにOpenVPNでVPNを構築してみた](https://qiita.com/saitoxu/items/b0a265edfb11ac381c89)

- v2.3からv2.4への更新
  - [openvpn v2.3からv2.4への更新](https://qiita.com/hiroyuki-nagata/items/cfd03cf60efd75737cda)


## ハマった内容

- 構成
  - もともとVPN接続をした後プライベートサブネットに接続させるような構成にしていた
  - [AWSのプライベートサブネットにOpenVPNでVPN接続](https://mashpote.net/2017/03/12/aws%E3%81%AE%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%81%ABopenvpn%E3%81%A7vpn%E6%8E%A5%E7%B6%9A/)

VPN接続したらプライベートアドレスのEC2やセキュリティグループで絞り込んだRDSに入れる仕組みなのだが、突然EC2とRDSにログインできなくなった。

### デバッグ

- クラスメソッドさんの記事を参考にVPNサーバ上でtcpdumpをとってみたが、通信できてないこと以外はわからず
  - [Amazon EC2とOpenVPNでサーバ-多拠点クライアント間通信をセキュアに行う](https://dev.classmethod.jp/cloud/aws/ec2-ssl-vpn-use-openvpn/)

VPN接続の通信はクライアントのポート番号で絞り込めるよ

```
$ sudo tcpdump src host x.x.x.x src port <ここは接続ごとに変わる>
```

### 復旧

なんと [AWSにOpenVPNでVPNを構築してみた](https://qiita.com/saitoxu/items/b0a265edfb11ac381c89) で設定したはずの `echo 1 > /proc/sys/net/ipv4/ip_forward` というスクリプトがコメントされてました（というより戻った？）。わかるか！こんなん

やっぱこういうことを防ぐためにLinux側でフォワーディング常時実行しといたほうがよさげか？

```
$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
```

Amazonさん、早くソフトウェアVPNサーバのマネージドサービス出して:innocent:
Nuxt.js & Express プロジェクト作成

# Nuxt.jsプロジェクトでRestAPIも実装する
## Nuxt.jsプロジェクト作成
ここではexpressをインストールしない
> \> npx create-nuxt-app nuxt-sample
>\> Generating Nuxt.js project in C:\nuxt-sample
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158724/1299d63c-0e4e-364e-507d-5628eb1d9e91.png)


##  Express　をプロジェクトへ追加
> npm install --save express
> npm install --save body-parser

nuxt.config.jsの変更

```
//add for API
const bodyParser = require('body-parser')

module.exports = {
  mode: 'universal',
  /**
  * add for API
  */
  serverMiddleware:[
  bodyParser.json(),
  '~/api'
  ],

```

## APIの作成
/api/index.js

```:node.js
const express = require("express");
const router = express.Router();

const app = express()
router.use((req, res, next) => {
  Object.setPrototypeOf(req, app.request)
  Object.setPrototypeOf(res, app.response)
  req.res = res
  res.req = req
  next()
})

router.get("/test/:id", (req, res) => {
   console.log("--test get");
   console.log("--id " ,req.params.id)
   res.status(200).json({message:`test_id = ${req.params.id}`});
});

module.exports = {
  path: '/api',
  handler: router
}

```
動作確認
> \>npm run dev
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158724/5f7d820d-08dc-218e-bdfd-9901b9ba0386.png)

## テスト・開発用Expressを用意する
/api/apptest.js
> \> npm install cors --save

```:node.js
const {path,handler} = require('./index')
const bodyParser = require("body-parser");
const express = require("express");
const cors = require("cors")
const app = express()

var corsOptions = {exposedHeaders: 'x-auth'}
app.use(cors(corsOptions));

app.use(bodyParser.json());
app.use(path,handler);
port="3000"
app.listen(port,()=>{
   console.log(`Started up apptest port:${port}`);
});
//for test {path,app}
module.exports = { path,app };

```



動作確認
>\> node api/apptest
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158724/f367c98f-0ad8-42e8-ad02-4519d9a61648.png)
WordPress:力技で404リダイレクトする方法

#WordPressにおける404ページ

404.phpを設置しておけば、
存在しないページにアクセスされたときに、
WP_Queryはis_404=trueとなり、404ページを返す。

だいたいそんな流れだったはず

#でも404ページにならない

##よくある解決法

.htaccessにエラー設定を記述
`ErrorDocument 404 /index.php?error=404`

##解決しない

/aaaaaaaaaaaaaaaaaaaaaa/とかテストでもそれはどうなのみたいなのでも404にならない
試しにget_header()の一番最初にvar_dump()してみた

結果

```php
["date_query"]=>
  bool(false)
  ["post_count"]=>
  int(1)
  ["current_post"]=>
  int(-1)
  ["in_the_loop"]=>
  bool(false)
（略）
  ["is_single"]=>
  bool(false)
  ["is_preview"]=>
  bool(false)
  ["is_page"]=>
  bool(true)
  ["is_archive"]=>
  bool(false)
（略）
  ["is_attachment"]=>
  bool(false)
  ["is_singular"]=>
  bool(true)
（略）
```

```php
["is_page"]=>
  bool(true)
  ["is_singular"]=>
  bool(true)
```

なんなん君ら

#htaccessでも効かない急いでる人向けの解決法

##概要

- 404にならないページのパーマリンク洗い出し
これしないと全ページ404という素敵なページが出来上がる

- template_redirect()アクションに$wp_queryの書き換えを追記
is_404のフラグを強制的に立てる
そして、それ以外のis_●●のフラグをすべて折る

##力技で解決した結果

例として、
front-page.php
news.php（archive.phpではなく別テンプレート作成）
single.php
のうちどれも通らないものは404としたい場合で
パーマリンク設定は"/?p=page_id"とする

```functions.php
// 404.phpが効かないのでリダイレクト措置
// テーマ内で固定ページや新規カスタム投稿を追加する場合はここに除外設定を追加
function redirect_404() {
    // archive.php
    if (is_page_template('news.php')) {
        if ($_SERVER['REQUEST_URI'] == '/news/' || '/news/?' . $_SERVER['QUERY_STRING'] == $_SERVER['REQUEST_URI']) {
            // Adsenseも404対象外とするため、あまり厳密すぎないように
            if (strpos($_SERVER['QUERY_STRING'], 'paged') === false || preg_match('/paged=[0-9]+/',$_SERVER['QUERY_STRING'])) {
                return;
            }
        }
    }
    if ('/news/?' . $_SERVER['QUERY_STRING'] == $_SERVER['REQUEST_URI']) {
        return;
    }
    global $wp_query;

    //is_404()が効かないので強制的にフラグを付加する
    $wp_query->is_404 = 1;
    //$wp_queryをdumpしてフラグがたっていたものはリセット
    $wp_query->is_singular = '';
    $wp_query->is_page = '';
    get_template_part('404');
    // exit()しないと余計なことするときある
    exit();
}
add_action('template_redirect', 'redirect_404');
```


#困ったときのtemplate_redirect

template_redirect使ってる時点で力技感出る
[Review] MATLAB ~Visualise Decision Surfaces for Different Classifiers~

## Foreword
This is the second volume in a series of the MATLAB learning.
So, if you miss the first one, please refer to here.
https://qiita.com/Rowing0914/items/a0e0e0d13faa337bb6dc

In this article, I will write about the way to visualise the decision boundary of the classifiers.
Even though we have learned many machine learning theories or techniques, actually the thing you are required to use for work is mostly the explanation of the model or the features used in your approach. So, let me shortly summarise it.

## Introduction
Each classification algorithm generates different decision rules. These rules can be visualised in the form of a decision surfaces. This example demonstrates visualising the decision surface for different classification algorithms.

## Load Data
Load the data to see how the sepal measurements differ between iris species. You can use the two columns containing sepal measurements.

```matlab
clear
load fisheriris
X = meas(:,1:2);
y = categorical(species);
labels = categories(y);

figure(1)
gscatter(X(:,1), X(:,2), species, 'rgb', 'osd');
xlabel('Sepal length');
ylabel('Sepal width');
``` 
<img width="528" alt="Screen Shot 2018-07-24 at 16.48.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/f78c7250-cd36-f4f4-c4be-93ab28c74326.png">

## Train Four Different Classifiers and Store the Models in a Cell Array

```matlab
clf{1} = ClassificationNaiveBayes.fit(X,y);
clf{2} = ClassificationDiscriminant.fit(X,y);
clf{3} = ClassificationTree.fit(X,y);
clf{4} = ClassificationKNN.fit(X,y);
classifier_name = {'Naive Bayes','Discriminant Analysis','Classification Tree','Nearest Neighbor'};
```

## Predict Species Using All Classifiers
meshgrid is used to create a grid of points spanning the entire space within some bounds of the actual data values. Each classifier is used to classify all the data in the mesh.

```matlab
[xx1, xx2] = meshgrid(4:.01:8,2:.01:4.5);
figure(2)
for ii = 1:numel(clf)
 ypred = predict(clf{ii}, [xx1(:) xx2(:)]);
 h(ii) = subplot(2,2,ii);
 gscatter(xx1(:), xx2(:), ypred, 'rgb');
 title(classifier_name{ii}, 'FontSize', 15);
legend off, axis tight
end
legend(h(1), labels,'Location', [.35,.01,.35,.05], 'Orientation','Horizontal')
```
<img width="492" alt="Screen Shot 2018-07-24 at 16.56.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/0f986dde-defc-6b1c-3136-aa8015829733.png">

Thank you.
rails-備忘録

# 環境構築
<b>・Gemのインストール</b>
bundle install
<b>・NODEパッケージのインストール</b>
npm install --no-bin-links　※Macでは--no-bin-linksオプションは不要
　package.jsonを読み込んでいる?
<b>・DBの作成</b>
bundle exec rake db:create
<b>・マイグレーションの実行</b>
bundle exec rake db:migrate
　db/migrateを読み込んでいる
<b>・Seederの実行</b>
bundle exec rake db:seed
　db/seedsを読み込んでいる
<b>・Assetのpreコンパイル</b>
bundle exec rake assets:precompile
　Assetの中身をコンパイルしている。Asset内を変更したらこれを実行

# まず最初にすること
<b>データベース作成</b>
1．テーブルの作成
　　rails g model テーブル名 カラム名:データ型

```
rails g model m_exclusion_domain enterprise_code:string exclusion_domain
```
Cassandraのgolangドライバ

# 対象読者

- ビッグデータを扱う人
- スケールするインフラを構築したいと思っている人

## Cassandraのgolangドライバ一覧

| ドライバ名 | star数 | 備考 |
|:----:|:----:|:----:|
| [cqlc](https://github.com/relops/cqlc) | 82 | ドキュメントが少し乏しい |
| [Gocassa](https://github.com/gocassa/gocassa) | 282 | `gocql`のラッパー、高機能版  |
| [gocql](https://github.com/gocql/gocql) | 1378 | もっとも一般的 |

## 結論

一般的に構築するならば`gocql`を使っておけば困らない。
私も機械学習サービスの運用で特に困っていることはありません。
aws-spring-cloud-awsでDefaultAWSCredentialsProviderChainがサポートされていた

spring-cloud-awsの2系でようやくaws-sdk-javaの`DefaultAWSCredentialsProviderChain`がサポートされた。

1.x系でのAWS LambdaやコンテナサービスのIAM Roleを利用した認証情報を取得する際のカスタマイズが不要になるのでご参考に。
(AWS Lambdaで起動に時間を要するSpring Frameworkは非推奨ではあるが)

# 方法

application.properties(yml)または起動オプションに`cloud.aws.credentials.useDefaultAwsCredentialsChain`を追加する。

```:application.properties
cloud.aws.credentials.useDefaultAwsCredentialsChain=true
```

任意項目なので設定しない場合はfalse(1.x系と同じ挙動)になる。

# ドキュメントやコード

* リファレンス
  * なぜか反映されていない。M4のものには記載されてる。

http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html
http://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.0.0.M4/single/spring-cloud-aws.html#_configuring_credentials

* 実装箇所

https://github.com/spring-cloud/spring-cloud-aws/blob/master/spring-cloud-aws-autoconfigure/src/main/java/org/springframework/cloud/aws/autoconfigure/context/ContextCredentialsAutoConfiguration.java#L49-L64

* 履歴

https://github.com/spring-cloud/spring-cloud-aws/commit/fa77450f4dc9e6fcadc194d0a0b5ea6e99c0da7c#diff-c35349fde52696a401f97ccdcb1109b6

# ついでに従来通りのIAM Userを利用する場合をメモっとく

* accessKeyとsecretKeyをapplication.propertiesなどで定義する場合

```
cloud.aws.credentials.accessKey=hoge_accessKey
cloud.aws.credentials.secretKey=hoge_secretKey
```

* aws-cliの~/.aws/credentialsを使用する場合
  * profileNameが[default]の場合は定義しなくてもよい

```
#cloud.aws.credentials.accessKey,secretKeyは消してOK
#cloud.aws.credentials.accessKey=
#cloud.aws.credentials.secretKey=
cloud.aws.credentials.profileName=hoge_profile
```

* aws-cliの~/.aws/credentialsのパスを独自に設定している場合
  * profileを利用すると複数のIAMユーザーの切り替えが柔軟なのでおすすめ

```
#cloud.aws.credentials.accessKey,secretKeyは消してOK
#cloud.aws.credentials.accessKey=
#cloud.aws.credentials.secretKey=
cloud.aws.credentials.profileName=hoge_profile
cloud.aws.credentials.profilePath=.aws/hoge_credentials
```
YouTubeで勉強会をお手軽ライブ配信する

先日開催された[Flutter Meetup Tokyo #3](https://flutter-jp.connpass.com/event/90790/)のライブ配信の手伝いをした際の手順の記録。

実際の配信動画は[こちら](https://www.youtube.com/watch?v=J91HejVVHvQ)

#YouTube クリエイターツール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188470/49bea6af-992f-f27b-d956-0b54419aff5b.png)

Google にログインした状態で https://youtube.com/live_dashboard にアクセスするとこのページが開きます。一度もアクセスしたことがない人はチャンネルの作成を求められるので作成します。

「始める」のボタンを押すとアカウント確認があるので済ませます。初回の手続きを済ませると下の画面になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188470/b9e27a89-5415-419d-fa50-31f7b5ffd673.png)

赤く囲んである部分の*ストリームキー*が後述する配信用のソフトウェアに必要なキーで、共有にある URL が実際に視聴可能となる、ライブ配信視聴者に公開する URL です。**初めて作ったアカウントの場合、ライブ配信が可能になるまで24時間かかります。**

YouTube側で必要なものはこれだけです。

#OBS Studio
今回は [OBS Studio](https://obsproject.com/ja) と云うフリーで配布されている配信ソフトウェアを利用しました。https://obsproject.com/ja/download からダウンロードします。

起動するとこんな感じの画面が開きます。すでにビデオカメラが接続してあればそこからの映像が表示されているはずです（古いビデオカメラだとTV以外への出力がサポートされていないことがあります）。ミキサーの音声が動いていない場合は「設定」の「音声」で正しいマイク音声デバイスを選択します。選択できるデバイスがない場合はビデオカメラの音声が利用できないので、別途マイクを用意します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188470/166979bc-602e-ff13-abbb-f78103384407.png)

「設定」を開いて、「配信」を選択します。サービスで「YouTube / YouTube Gaming」 を選択して、YouTube クリエイターツールにあったストリームキーを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188470/1483aace-45a9-ff9e-e4bf-75db0766d12d.png)

メイン画面に戻って「配信」を押すとライブ配信が開始されます。YouTube クリエイターツールのオフラインの部分が数秒後にオンラインに変わります。**配信テストも本番も同じ URL なので、配信テスト中は「プライバシー」が「公開」になっていないように注意します。**映像、音声の細かい調整は利用する機材によって違いがあるので、テスト配信を見ながら行ってください。

##終わりに
こんな感じで簡単にライブ配信を行うことができます。当日都合がつかなかったり、遠隔地のエンジニアにも喜ばれると思います。導入されてはいかがでしょうか。

今回使用した機材は小型の手持ちハンディカム (Canon iVIS HF R31)、三脚、集音は YAMAHA Web会議用マイクスピーカー PJP-20UR です。OBS Studio が認識するものであれば何でもよいはずです（ラップトップのカメラを登壇者に向けて配信ってことも可能です）。
HTML5で画面サイズごとに画像を差し替える必要がある場合の書き方

サイトを作っているときによく「この部分の画像、PC版とスマホ版で最適化したものに差し替えしたいんですよね」という要望をいただくことがあります

HTML5で追加された&lt;picture&gt;要素にはこんなときの解決方法があります
コード例のブレイクポイントは640pxと1024pxにしていますがここは要件に応じて適宜調整してください

[caniuse](https://caniuse.com/#feat=picture)

によれば、IE11以外はだいたい出回ってるブラウザではOKのようです

```html:picture-srcset.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>picture要素とsrcsetの例</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

<picture>
    <!-- sourceのmediaにメディアクエリを、srcsetに<img srcset>の記述も対応できるっぽい-->
    <source media="(max-width: 639px)" srcset="http://via.placeholder.com/640x640">
    <source media="(max-width: 1023px)" srcset="http://via.placeholder.com/1024x1024">
    <!-- fallback -->
    <img src="http://via.placeholder.com/1920x1920" alt="image">
</picture>

<!-- IEとかIEとかIEとかで動かないのでpolyfill-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/picturefill/3.0.3/picturefill.min.js"></script>
</body>
</html>
```
MatDatepicker で土日に色をつけるスタイル設定

```styles.css
/* Sunday */
mat-month-view tr td.mat-calendar-body-cell:first-child div {
  color: red;
}
/* Saturday */
/* 通常時 */
mat-month-view tr td.mat-calendar-body-cell:nth-child(7) div {
  color: blue;
}
/* 月表示が同じ行にあるとき */
mat-month-view tr td.mat-calendar-body-label ~ td:last-child div {
  color: blue;
}
```
jQuery.getJSON でファイルがない時の処理

jQuery.getJSON でファイルがないのを明示する方法です。
.fail がポイントです。

ファイルがあった場合
![success_jquery.png](https://qiita-image-store.s3.amazonaws.com/0/179446/ccc49d11-b8c8-2f5b-ae42-3aa13a9fdbdb.png)

ファイルがなかった場合
![fail_jquery.png](https://qiita-image-store.s3.amazonaws.com/0/179446/50f3a7cb-77a2-1525-8eb2-f87cf86e3765.png)

html ファイル

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<script src="/js/jquery-3.3.1.min.js"></script>
<script src="example_json.js"></script>
<title>example_json</title>
</head>
<body>
<h2>example_json</h2><p />
<div class="contents">contents</div>
<hr />
Jul/24/2018 AM 08:25<p />
</body>
</html>
```

```js:example_json.js
// -----------------------------------------------------------------------
//	example_json.js
//
//					Jul/24/2018
//
// -----------------------------------------------------------------------
jQuery (function ()
{
	jQuery("#outarea_aa").text ("*** example_json *** start ***")

	var data_text = ""

//	var file_in = "./tochigi.json"
	var file_in = "./cities.json"

	jQuery.getJSON (file_in,function (data_aa)
		{
		var str_out = ""
		str_out += "<table>"
		for (var key in data_aa)
			{
			str_out += "<tr>"
			str_out += "<td>" + data_aa[key].name + "</td>"
			str_out += "<td>" + data_aa[key].population + "</td>"
			str_out += "<td>" + data_aa[key].date_mod + "</td>"
			str_out += "</tr>"
			}
		str_out += "</table>"

		jQuery(".contents").html (str_out)
		})
		.fail(function(jqXHR, textStatus, errorThrown)
			{
			var str_out = "<h2>Not Exist</h2>"
			str_out += "<blockquote>"
				str_out += file_in + "<br />"
			str_out += "</blockquote>"
			jQuery(".contents").html(str_out)
			jQuery("#outarea_ee").text("textStatus = " + textStatus)
			})

	jQuery("#outarea_hh").text ("*** example_json *** end ***")
})

// -----------------------------------------------------------------------
```

サンプルのJSON ファイル

```json:cities.json
{
  "t0921": {
    "name": "宇都宮",
    "population": 68714,
    "date_mod": "1950-9-24"
  },
  "t0922": {
    "name": "小山",
    "population": 29157,
    "date_mod": "1950-3-15"
  },
  "t0923": {
    "name": "佐野",
    "population": 65741,
    "date_mod": "1950-10-7"
  },
  "t0924": {
    "name": "足利",
    "population": 38164,
    "date_mod": "1950-6-22"
  },
  "t0925": {
    "name": "日光",
    "population": 49675,
    "date_mod": "1950-8-28"
  },
  "t0926": {
    "name": "下野",
    "population": 65813,
    "date_mod": "1950-9-12"
  }
}
```
C++でMastodonへ呟いてみた

#はじめに

[mastodon-cpp](https://github.com/tastytea/mastodon-cpp)というC++からMastodon APIをよしなにしてくれるライブラリがあったので使ってみた。

その時のあれこれをまとめたもの

#使ったもの
- Google Computer Engine(Ubuntu 18.04LTS)
- [mastodon-cpp](https://github.com/tastytea/mastodon-cpp)

# mastodon-cpp のインストール
## curl/curlpp/jsoncpp のインストール

mastodon-cppではcurl/curlpp/jsoncppを使用しているので、それらをまずはインストール

```shell:
sudo apt install libcurl-dev libcurlpp-dev libjsoncpp-dev
```

# mastodon-cpp のインストール

まずはソースコードをclone

```shell:
git clone https://schlomp.space/tastytea/mastodon-cpp.git
```

ディレクトリを移動して、`build` ディレクトリを作成する。

```shell:
cd mastodon-cpp
mkdir build
```

`build` ディレクトリに移動し、mastodon-cppをインストール

```shell:
cmake ..
make
make install
```

これで mastodon-cpp が使用できるようになる

#実際のコード

mastodon-cppの[サンプルコード](https://github.com/tastytea/mastodon-cpp/blob/master/examples/example06_toot_delete-toot.cpp)を参考に以下のコードを書いてみた。

```cpp:toot.cpp
/*  This file is part of mastodon-cpp.
 *  Post a status, then delete it.
 */
#include <iostream>
#include <vector>
#include <string>
#include <cstdint>
#include <chrono>
#include <thread>
#ifdef MASTODON_CPP
    #include "mastodon-cpp.hpp"
#else
    #include <mastodon-cpp/mastodon-cpp.hpp>
#endif
using Mastodon::API;
int main(int argc, char *argv[])
{
    if (argc < 3)
    {
        std::cerr << "usage: " << argv[0] << " <instance> <access token>\n";
        return 1;
    }
    Mastodon::API masto(argv[1], argv[2]);
    masto.set_useragent("mastodon-cpp-example/1.3.3.7");
    std::string answer;
    std::uint16_t ret;
    std::string toot;
    std::string id;
    std::cout << "Toot: ";
    std::cin >> toot;
    API::parametermap parameters =
    {
        { "status", { toot } },
        { "visibility", { "unlisted" } }
    };
    ret = masto.post(API::v1::statuses, parameters, answer);
    return 0;
}
```
コンパイルした後は、TootしたいMastodonインスタンスからアクセストークンを取得してくる。

最後に、以下のように実行するだけ

```shell:
./a.out <MastodonインスタンスのURL> <アクセストークン>
```

#おわりに

C++からMastodonへTootできるようになったので、[cvui](https://github.com/Dovyski/cvui)とか使ってC++でMastodonクライアントとか作れそうかもね

#参考

[mastodon-cpp](https://github.com/tastytea/mastodon-cpp)
Macの古いマイク

PowerPCの初期の頃のMacに付属していたこんなマイク(Plain Talk:590-0670 日本製)があります。捨てるのもなんなので、再利用方法を考えてみます。

![写真（2018-07-24 15.37） #2.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/0dc547a7-52fd-8fcb-2086-b71ecbcedd26.jpeg)

このマイクはジャックが特殊で普通には使えません。仕方がないのでバラしてみました。下のシートの下にネジがあります。ネジを回したら、プラスチックが劣化していて、割れてしまいました。20年もするとそんなものかもしれません。

基板は黒い金属のシールドにおおわれていて、それを外すとこんなのが出てきます。

![写真（2018-07-24 13.23） #2.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/e5ed2633-7424-63cd-5ebd-ddee48dd4e2c.jpeg)

ROHMのオペアンプのBA10358は単電源のオペアンプでマイクの出力を増幅してくれるようです。おおよそのマイクからの流れはC3 -> Q1 -> D1 -> オペアンプ3pin -> オペアンプ1pin -> オペアンプ5pin -> オペアンプ7pin -> OUTのようです。[マルツさんの記事](https://www.marutsu.co.jp/contents/shop/marutsu/mame/202.html)に近い回路な気がします。


経年劣化するとすると電解コンデンサー(丸い部品)が考えられますが、あまり電気も流れないと思うので、大丈夫なものが多いのではないでしょうか。

![MacMic1.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/4ecad5ff-0854-44d5-3ee7-c7eb6414c8f3.jpeg)

WHTとGNDに電圧をかけると、BLKから出力が取れるようです。ジャックを取り替えて使うのが良いかもしれません。オリジナルの電圧はわからないのですが5Vで試してみたら、[猫のお留守番](http://hp.vector.co.jp/authors/VA009278/cat/)でちゃんと録音出来ました。

![PlainTalk.png](https://qiita-image-store.s3.amazonaws.com/0/104066/94422936-20ca-63cf-ffa9-59bdc95593ef.png)

[藪の雀](http://hp.vector.co.jp/authors/VA009278/sparrow/)で特性確認してみました。

440Hzのサイン波

![sin.png](https://qiita-image-store.s3.amazonaws.com/0/104066/f791cb41-d25b-69c8-019d-de260d8145e8.png)

TSP

![tsp.png](https://qiita-image-store.s3.amazonaws.com/0/104066/c1dbba99-cedc-947f-692e-f146f870dac5.png)

iPhone 3GのスピーカーのTSPなので、スピーカー側の特性も入ってしまってます。10Kくらいで落ち込んでいるのはローパースフィルターが入っているのかもしれません。

5Vで1.508mA流れていました。エネループ2本(2.4Vくらいだと思う)で試したらTSPがボロボロで、5Vくらいは必要なようです。BA10358の定格が3V以上なので当たり前だのクラッカーですが。

コネクタ替えてみました。本体のネジは割れて使えないので、鼻くそボンドで軽く接着してみました。

![写真（2018-08-10 8.52） #2.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/a83251b9-be1e-e556-43c7-5c0391280d36.jpeg)


これは上より古い時代のマイクでLCなどに付いていたものだったと思います。こちらも下部の黒いシートの下にネジがあります。

![写真（2018-07-24 13.16）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/e019b92c-f403-8d9c-facb-77cec64e1758.jpeg)

コンデンサーマイクがついてるだけなので、増幅回路をつけてあげないと普通には使えないと思います。マイクが付属になった初期の頃は98などもこのタイプだったようです。

![AppleMic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/82ec9ec5-c2b8-b1cb-e2e2-ed86ab7e2687.png)

PC付属のマイクは上記のプリアンプが内蔵のものや、アンプは無いが電源が必要な物、またコンデンサーマイク直結な物などがあるようなので、利用する場合は確認が必要です。

上のマイクは一番上のパターンでした。

![PCMic.png](https://qiita-image-store.s3.amazonaws.com/0/104066/8ea19548-7353-f57a-a0b9-72966d1c8749.png)

コンデンサーマイクの内部はこのようになってるそうです。

![ECM.png](https://qiita-image-store.s3.amazonaws.com/0/104066/09da6325-b101-0020-ea6e-7326654b1316.png)

実際のマイクではケースにつながっている方がマイナスとなるようです。このマイク場合は左がマイナスです。

![写真（2018-08-05 7.55）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/280308bb-4f26-d8b0-b449-b1a650f56963.jpeg)

コンデンサーマイク関係の情報は"WM-61A"で検索するといろいろ出てくるようです。
Python OpenpyxlでExcelファイルが壊れるのはオブジェクトが非表示で混入している

PythonでOpenpyxlでExcelファイルを読み書きする時、Excelファイルが壊れるときがあります。
原因は、オブジェクト（図形とか）が非表示で残っているからです。
ところが、やっかいなのはホーム-編集-検索と選択-オブジェクトの選択と表示(P)でも表示されないところです。そこで、VBAでVisible=False の Shapesをvisibleにして削除するようにします。

```vb:VisibleObject
Sub VisibleShapes()
    Dim spShape As Shape
    Dim spCnt As Long
    For Each spShape In ActiveSheet.Shapes
      If spShape.Visible = False Then
        spShape.Visible = True
        spCnt = spCnt + 1
      End If
    Next
      If spCnt <> 0 Then
        MsgBox spCnt & "個の名前定義が見つかりました。", vbInformation
      Else
        MsgBox "非表示の図形はありません。", vbExclamation
      End If
End Sub
```
VirtualBoxの仮想ストレージの拡張(Windows)

#経緯
もともと32GBでストレージを作成していたが、ちょっと大きいデータ群を処理しようと思ったら足りなくなったので。
たぶん今後も同じことがあるだろうから、自分向けの備忘録を兼ねて。

#環境
Oracle VM VirtualBox 5.2.14
ホストOS：Win8.1
ゲストOS：Win7
仮想ストレージの設定：可変サイズ、VDI
　設定＞ストレージ＞対象のストレージを確認し、パスを控えておく
![20180724-145753.png](https://qiita-image-store.s3.amazonaws.com/0/253367/d2ba050a-de1e-284e-b2d3-871ca6acc3a5.png)

#手順
##VDIファイルのリサイズ
VBoxManage.exeのパスを確認しておく
私の環境では以下にあった。インストールパスを既定値から変更していないので、基本的にはここにあると思う。
C:\Program Files\Oracle\VirtualBox\VBoxManage.exe

コマンドプロンプトを立ち上げて、以下のコマンドを実行
`<VBoxManage.exeのパス> modifyhd <VDIファイルのパス> --resize <拡張後のサイズ(MB)>`
64GBにしたかったので以下のように実行した
![20180724-145753.png](https://qiita-image-store.s3.amazonaws.com/0/253367/5e59c644-2f74-5d48-50cd-abe39c8d0e17.png)
※64GB = 64 * 1024 = 65536MB

##ゲストOS側でのパーティション変更
拡張した領域は未割り当てになっているので、ゲストOSを立ち上げて、パーティションを変更する必要がある
　スタートボタン＞コンピュータで右クリック＞管理で、コンピュータの管理を起動
　(もしくは、コントロール パネル＞システムとセキュリティ＞管理ツール)
　記憶域＞ディスクの管理から拡張したいドライブで右クリックし、「ボリュームの拡張」を選択
　未割り当て領域を選択しておしまい。
powershellでスクリーンセーバーの待ち時間を設定

#1.概要
powershellでスクリーンセーバーの待ち時間を自動設定するスクリプト。
自分用の覚え書きなので悪しからず。

#2.環境
・powershell : 5.1

#3.コード
```screen_set.ps1
Set-ItemProperty -Path 'HKCU:\Control Panel\Desktop' -Name "ScreenSaveTimeOut" -Value "540" #スクリーンセーバー起動までの待ち時間
Restart-Computer -Force #設定反映のため、強制再起動
```
Golang ファイル入出力メモ

偶にGolangを触るといつも忘れているので、一覧形式の備忘録

### ファイル読み込み
1. [ioutil.ReadAll](https://golang.org/pkg/io/ioutil/#ReadAll)
1. [ioutil.ReadFile](https://golang.org/pkg/io/ioutil/#ReadFile)
1. [bufio.Reader](https://golang.org/pkg/bufio/#Reader) - Read, ReadStringなどが使える
1. [os.File.Read](https://golang.org/pkg/os/#File.Read)

### ファイル書き込み
1. [io.Copy](https://golang.org/pkg/io/#Copy)
1. [ioutil.WriteFile](https://golang.org/pkg/io/ioutil/#WriteFile)
1. [bufio.Writer](https://golang.org/pkg/bufio/#Writer) - Write, WriteStringなどが使える
1. [os.File.Write](https://golang.org/pkg/os/#File.Write)

### ファイル作成・開く
- os.Open  
読み込み専用
- [os.OpenFile](https://golang.org/pkg/os/#OpenFile)  
os.O_RDONLY, os.O_WRONLY, os.O_RDWR, os.O_APPENDなどと、permissionを指定。書き込みで開いた場合、os.O_TRUNCを指定しないと、以前の内容をリフレッシュせずに上書きするので、書き込み内容が短い場合は以前の内容が残ってしまう。
- os.Create  
新しいファイルを作成