OmniAICreator/Qiita-1.07M huggingface dataset:
ionic2-calendarのデフォルトテンプレート

#ionic2-calendarのテンプレートをカスタマイズ

**自分の記録用として**

ionicのカレンダー系ライブラリで（恐らく）一番有名であろう[ionic2-calendar](https://www.npmjs.com/package/ionic2-calendar)

ionic2って書いてあるけど、それ以外のバージョンでも使えます（2019年9月の時点でionic4もサポートされてる）

そのライブラリーのテンプレートカスタマイズのヒントとして使えるであろう、デフォルトの状態のコードがこれ


```html:home.page.html

 <ng-template #monthviewDefaultEventDetailTemplate let-showEventDetail="showEventDetail" let-selectedDate="selectedDate" let-noEventsLabel="noEventsLabel">
            <ion-list class="event-detail-container" has-bouncing="false" *ngIf="showEventDetail" overflow-scroll="false">
                <ion-item *ngFor="let event of selectedDate?.events" (click)="eventSelected(event)">
                        <span *ngIf="!event.allDay" class="monthview-eventdetail-timecolumn">{{event.startTime|date: 'HH:mm'}}
                            -
                            {{event.endTime|date: 'HH:mm'}}
                        </span>
                    <span *ngIf="event.allDay" class="monthview-eventdetail-timecolumn">{{allDayLabel}}</span>
                    <span class="event-detail">  |  {{event.title}}</span>
                </ion-item>
                <ion-item *ngIf="selectedDate?.events.length==0">
                    <div class="no-events-label">{{noEventsLabel}}</div>
                </ion-item>
            </ion-list>
        </ng-template>
```

これがデフォルトのコード。

よってカレンダーを配置してるページのhtmlに

```html:home.page.html

<calendar [eventSource]="eventSource"
      [calendarMode]="calendar.mode"
      [currentDate]="calendar.currentDate"
      (onCurrentDateChanged)="onCurrentDateChanged($event)"
      (onEventSelected)="onEventSelected(dayEvent)"
      (onTitleChanged)="onViewTitleChanged($event)"
      (onTimeSelected)="onTimeSelected($event)"
      [locale]="calendar.locale"


      [monthviewEventDetailTemplate]="template"

      >
  </calendar>

<!--[monthviewEventDetailTemplate]="template"を追加 -->


<ng-template
 #template 
 let-showEventDetail="showEventDetail"
 let-selectedDate="selectedDate"
 let-noEventsLabel="noEventsLabel"
>
   <ion-list class="event-detail-container" has-bouncing="false" *ngIf="showEventDetail" overflow-scroll="false">
    <!-- もしイベントがある日なら -->
      <ion-item *ngFor="let event of selectedDate?.events" (click)="eventSelected(event)">
      <!-- もしイベントがallDay = falseなら -->
          <span *ngIf="!event.allDay" class="monthview-eventdetail-timecolumn">
               {{event.startTime|date: 'HH:mm'}}
                -
               {{event.endTime|date: 'HH:mm'}}
           </span>
      <!-- もしイベントがallDay = trueなら -->
          <span *ngIf="event.allDay" class="monthview-eventdetail-timecolumn">{{allDayLabel}}</span>
          <span class="event-detail">  |  {{event.title}}</span>
                </ion-item>
    <!-- もしイベントが無い日なら -->
       <ion-item *ngIf="selectedDate?.events.length==0">
          <div class="no-events-label">
              {{noEventsLabel}}
              </div>
             </ion-item>
           </ion-list>
        </ng-template>
```

あとはこのng-templateの中をカスタマイズすればOK!!



---
参考: https://github.com/twinssbc/Ionic2-Calendar/issues/386
初心者が初めてrailsアプリをherokuにデプロイしてつまずいた所

#環境
Rails 5.2.3
Ruby 2.4.1
#つまずいた所
##背景画像が表示されない
`url`を`image-url`に変えたら反映されました。

```
 background-image:image-url('main.jpg');
```
## assetが更新されない
　herokuは自動でprecompileしてくれるので、`bundle exec rake assets:precompile RAILS_ENV=production`をする必要はありません。反対に一度このコマンドを実行すると、毎回行う必要があります。その際は作成された`public/assets`を削除してしまいましょう。

##データベースが存在しない
当たり前ですが、本番環境用のdatabaseは違うので、migarationファイルを実行する必要があります。

~~~
$ git push heroku
$ heroku run rails db:migrate
$ heroku run rails db:seed (初期データある場合）
~~~
本番環境ではsqliteは使えない事も注意です！！

##コードの変更が反映されない
単純にコミットできていなだけでした。。。
みなさんもこういう初歩的なミスに気をつけてください。

以上です。とりあえずなんとかデプロイできてよかった...
Markdownのリストで段組みを揃えて改行する方法


Markdownのリストで段組みを揃えて改行する方法が分かったので共有します。

- どういうことかというと<br>
こんな感じに
  - 段組みを揃えて  
改行できるよ

[自分のブログ](https://www.suzu6.net/posts/194-markdown-list/)にも書いていますが、広く共有したいと思いこちらにも書かせて頂きます。

## 環境

確認できた対応している環境は以下の通り

- Github
- Qiita
- Visual Studio Code の [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)のプレビュー
- npm の [markdown-it](https://github.com/markdown-it/markdown-it)

恐らく他のMarkdown対応のエディタやサービスも書けると思います。

## 書き方

リストの行末に改行タグをつけて、次の行は素のテキストを書けばよいです。
改行タグは半角スペース二つ`  `か、HTMLの改行タグの`<br>`です。

例（半角スペースはわかりづらいため`<br>`で書きます）

```md
- リンゴ<br>
Apple
- オレンジ<br>
Orange
- イチゴ<br>
Strawberry
```

- リンゴ<br>
Apple
- オレンジ<br>
Orange
- イチゴ<br>
Strawberry


なぜこれで改行できるかと言うと、HTMLを見ると分かりやすいです。

```html
<ul>
  <li>リンゴ<br>Apple</li>
  <li>オレンジ<br>Orange</li>
  <li>イチゴ<br>Strawberry</li>
</ul>
```

上のように`<li></li>`タグの中で改行コードがつくため、行頭を揃えて段組みできるようになります。

## その他にも使える

### 番号付きリスト

```md
> 1. 第一条<br>
> ロボットは人間に危害を加えてはならない。また、その危険を看過することによって、人間に危害を及ぼしてはならない。  
> 2. 第二条<br>
> ロボットは人間にあたえられた命令に服従しなければならない。ただし、あたえられた命令が、第一条に反する場合は、この限りでない。  
> 3. 第三条<br>
> ロボットは、前掲第一条および第二条に反するおそれのないかぎり、自己をまもらなければならない。  
> 
> — 2058年の「ロボット工学ハンドブック」第56版、『われはロボット』より
```

> 1. 第一条<br>
> ロボットは人間に危害を加えてはならない。また、その危険を看過することによって、人間に危害を及ぼしてはならない。  
> 2. 第二条<br>
> ロボットは人間にあたえられた命令に服従しなければならない。ただし、あたえられた命令が、第一条に反する場合は、この限りでない。  
> 3. 第三条<br>
> ロボットは、前掲第一条および第二条に反するおそれのないかぎり、自己をまもらなければならない。  
> 
> — 2058年の「ロボット工学ハンドブック」第56版、『われはロボット』より

※ `>`は引用

### 表組み

```md
| 言語   | フレームワーク                |
|--------|-------------------------------|
| Python | Flask<br>Django<br>pyramid    |
| PHP    | Laravel<br>CakePHP<br>Symfony |
| Java   | Struts<br>Spring              |
```


| 言語   | フレームワーク                |
|--------|-------------------------------|
| Python | Flask<br>Django<br>pyramid    |
| PHP    | Laravel<br>CakePHP<br>Symfony |
| Java   | Struts<br>Spring              |

Qiitaだと`<tbody>`に`vertical-align:middle`が付いているため、縦方向は中央になるようです。

## 終わりに

手順書で補足を付ける時や、Excelの表をそっくり表現するときに使えるのではないでしょうか。
AI学習の備忘録 ＃１

本日よりAI学習の内容を書いていこうと思う。

自己紹介として私の経歴を。

バイオ系専門学校を卒業後、化学系の実験エンジニアとして会社を数社経験し、
現在は技術者派遣の会社で実験エンジニアとして、ポリオレフィン(https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%82%AA%E3%83%AC%E3%83%95%E3%82%A3%E3%83%B3)
の重合触媒の研究開発を行う業務に従事している。

ITに関連した業務は一切の未経験。プログラミングスキルもなし。

ざっとこんな感じです。

AIに興味を持った理由

最近、化学業界の研究開発分野でAIを使った材料評価シミュレーションを行うマテリアルズ・インフォマティクスが注目を浴びており、以前の客先でもAI専門の部署があるなど身近に感じることがあったから。

また、派遣元の会社はIT系のエンジニアを多く抱えている会社ということもあり、AI、データサイエンティストの育成にも力を入れているため。（研修などあるらしいがまだ参加していない）

あとは、単純に仕事として人材不足なため高い給料を稼げそうだからという理由もある。

そのような理由でAI学習をしようと思った。


学習の状況

１．python
Udemyの酒井 潤さんの講義を見ながら学習。（動画のボリューム半端ない）
書籍「独学プログラマー」を読みながら学習

２．機械学習
オライリージャパン社　書籍「pythonではじめる機械学習」
（会社で購入してもらい次の客先が決まるまでの間、会社のPCでgoogle colaboを使い、学習。残念ながら転勤に伴い返却。）
教師あり学習：線形回帰、k最近傍法、ridge, lasso, 決定木などを学習

coursera
Andrew教授による機械学習の講義
week 2まで　（一部のテストをまだクリアできていない）
コスト関数、最急降下法、最急降下のためのFeature scaling, Mean normalizationなど

３．Deep learning
オライリージャパン社「ゼロから作るディープラーニング」
（機械学習と同じで会社に返却）
パーセプトロン、NN、NNで使われる関数について、手書き文字認識などを学習

今のところはこんな感じです。またこれと平行して英語学習も進めています。(現在TOEIC600)

学習環境
windows10 64bit (desk top)
windows7  64bit (notebook)

pycharm
google colaboratory
(jupyterはデスクトップPCでは起動できず)

目標
1.python
Udemy動画での学習完了させる。
「独学プログラマー」読了する。

2.機械学習
Courceraの講義を学習完了させる。

加えて、サイバーブレイン株式会社代表の谷さんのQiitaの記事(https://qiita.com/tani_AI_Academy/items/625915dc034a6993d521)
に乗っている書籍を購入し、さらに学習を進めたい。
まずは「pythonではじめる機械学習」、「ゼロから作るDeep Learning」は再度入手する。

今回はこんなところで。Courcera　Andrew教授のFeature Scailingの講義を受講しながら・・・
Nextcloud 17 ベータ4 がリリースされました

Nextcloud の次期メジャーバージョンである Nextcloud 17 の実装機能が凍結され、ベータ版がリリースされておりますが、4つ目のベータ版である **Nextcloud 17 Beta4** がリリースされました。

※ダウンロードはここから: [Nextcloud 17 beta 4](https://download.nextcloud.com/server/prereleases/nextcloud-17.0.0beta4.zip)

今後はバグ修正や洗練を重ねて、予定では、2019年9月26日に正式リリース予定となっております。

### Nextcloud 17 今後のリリーススケジュール

* Beta 1: 2019-08-15
* Beta 2: 2019-08-22
* Beta 3: 2019-08-29
* Beta 4: 2019-09-05　**← NOW !!**
* RC 1: 2019-09-12
* RC 2: 2019-09-19
* Release: 2019-09-26

Nextcloud 社では、自動テストや動作確認のためのスモークテストは行っているものの、無数の使い方をテストすることを置き換えることはできないとして、引き続きテストの支援を求めています。バグ修正はもちろん、小さな UI 改善、細かい修正などのため多くのみなさまのテスト支援を求めています。

早速ダウンロードしてインストールしてみました。Beta 3 から目立った変化はありませんでしたが、前回ベータ版で確認された新規ユーザーが追加できない不具合は解消されたようです。
またアプリについては、グループフォルダ、外部ストレージ連携、ファイルアクセスコントロール、カレンダーなどよく利用されると思われる公式アプリは対応が追い付いてきました。これからも少しずつアプリ対応するものが増えてくると思われます。

次回リリースはリリース候補版 (RC) の予定です。

★参考： [Nextcloud 17 ベータ1 がリリースされました](https://qiita.com/S_Katz/items/b9cf53efc0df27f0b21d)

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**
VScode/PlantUMLでER図を書く

VSCodeをインストールしていない人はこちら
https://code.visualstudio.com/

javaをインストールしていない人はこちら
https://www.java.com/ja/

## macにgraphvizをインストールする

```
$ brew install graphviz
```
※インストールに失敗した場合
`brew doctor`を打つと、解決方法を教えてくれる。

## PlantUML のインストールする
1.Visual Studio Code を起動する
2.下記のアイコンをクリックし、PlantUMLを検索しインストールする
<img width="298" alt="スクリーンショット 2019-08-29 9.59.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/00ae9e2a-d771-3b89-a6a1-2801c5e204a0.png">


## 動作確認
拡張子 .pu で新規ファイルを作成する

```html:test.pu
@startuml 

package "testアプリ" {
    entity "ユーザー" {
      + userID [PK]
      ==
      email
      password
      name
    }
}

@enduml
```
"Alt + D"でプレビューを表示する
<img width="163" alt="スクリーンショット 2019-09-10 10.37.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/2d28fdea-58ae-99d0-9133-7af12e7a6a7f.png">
このように表示されます(^ ^)


#### ※PlantUMLの基本的な書き方
こちらを参考にしました
https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48
MongoDB Shard keyってなに？

Azure案件に絶賛ぶっこまれ中です。
CosmosDBとかIoTHubとか知らない単語と日々格闘中です。
そんな中でCosmosDBを使用してMongoDBを使うことになったのでメモ

下記のURLがめちゃくちゃわかりやすいかと。
https://www.slideshare.net/doryokujin/mongo-sharding

MongoDBを作る時に必須な
Shard Key そもそもなんなの？
・Collection内のkeyの一つから決定
・Shard KeyによってデータがどのChunk(連続した範囲のデータ集合)に属するか決まる
・Shardが偏るのはよくない。
・Shard keyは変更できない！やり直す場合はCollrctionを作りなおす。

なるほど。
よくわからん。
Shard Key の変更が出来ないので、最初にきちんと考えないといけないみたいですね。

じゃあ、良いShard Key とは？？
良い例、悪い例は↑のURLにわかりやすく記載がありますが
ざっくりと。

悪いやつ
・「大陸名」など最大がきまっているのも、オートインクリメント的にひたすら増えていくもの、ハッシュなどのランダムなもの

良いやつ
・日付＋ユーザーID(検索によく使われるkey)
一定期間がわかり、ほぼ均等にわけてくれるための模様 


と、ほんとにメモなので、私もわかってない感満載ですｗ
これから実際に設計して実装して失敗してFBしていきます。
めんどくさい業務を自動化したGAS

###意外と全く同じことをやりたい人がいるんじゃないだろうか？
って思って書いてます。
コピペで使うといいと思うよ。

###めんどくさい業務の内容
テンプレートで用意しているシートを別のスプレットシートにコピーをする作業があった。
問題はスプレットシートが20枚あり、これが週に1回のペースでやってくるので非常にストレスである。
（1コピー1分だとして20分間も超単純作業を週1ペースでやるのが苦痛。）

###成果物（サンプル）

```javascript

function sub(){
//スプレットシートのID
  var ids = [
    "id_1",
    "id_2"
  ]
  ids.forEach(function(id){
    copy_nisshi(id);
  });
}

function copy_nisshi(id) {  
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = source.getSheets()[0];
  var destination = SpreadsheetApp.openById(id);
  var copy_sheet = sheet.copyTo(destination);
  
  var ss_name = make_ss_name();
  copy_sheet.setName(ss_name);
  
  SpreadsheetApp.setActiveSpreadsheet(destination);
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var objSheet = objSpreadsheet.getSheetByName(ss_name);
  SpreadsheetApp.setActiveSheet(objSheet);
    
  SpreadsheetApp.getActiveSpreadsheet().moveActiveSheet(1);
}

function make_ss_name(){
  //1909/09-09/13
  var today = new Date();
  var lastDay = new Date();
  lastDay.setDate(lastDay.getDate() + 4);
  return (
    ('00' + today.getFullYear()).slice(-2)
      + ('00' + (today.getMonth() + 1)).slice(-2)
      + "/"
      + ('00' + today.getDate()).slice(-2)
      + "-"
      + ('00' + (lastDay.getMonth() + 1)).slice(-2)
      + "/"
      + ('00' + lastDay.getDate()).slice(-2)
  );
}
```

上記を週1でクローンで動かせばOK
###改善すべき点
・make_ss_nameは1度だけ実行し、生成した値をcopy_nisshiに渡すようにしたほうが効率が良い。
・その他いろいろ。

###どんな動作をするか。
１．現在アクティブなスプレットシートの左端にあるシートをコピーし、idのスプレットシートにコピーします。
２．シートの名前を変更します。
３．コピー先のスプレットシートをアクティブにします。
４．コピーしたシートを左端に持っていきます。
５．１に戻ります。（idsに入っている分だけ繰り返します。）

###疑問点
シート移動ってアクティブシート切り替えないと出来ないんだろうか？

###終わりに
まぁ、ただ便利に使おうってだけのコードなので改善することは無さそうです。
世にいるめんどくさいだけの仕事をしている人の手助けになればなぁとか思いました。
終わり。
Xcode更新とライブラリ更新を一緒に行う手順

# 背景

Xcodeが更新に伴い、使用しているライブラリのバージョを更新する必要がある場合があり、その手順について紹介します。

# 前提

ライブラリの管理に `Carthage` と `CocoaPods` を使用しています。

# 手順
- 新しいバージョンのXcodeをダウンロード
    - https://developer.apple.com/download/more/ からダウンロード可能
        - ただしURLの変更が度々行われるため注意
- ダウンロードしたXcodeを別の名前を付けてApplicationsフォルダに移動
- `xcode-select`で対象のXcodeのパスを設定
- Carthageを最新に更新
- Cartfileのバージョン指定を変更する必要がないか確認
- `carthage update` を実行
- Podfileのバージョン指定を更新する必要がないか確認する
- `pod update` を実行する
- Xcodeを起動し、必要な箇所を修正

# 参考記事

- [Xcodeの複数バージョンを共存 - Qiita](https://qiita.com/k_kuni/items/522719637f2c3f7c2b67)
【Prosessing】03.5. もっと細かいif文のこと【★✩✩✩✩】

#if文の書き方の説明

if文の書き方は、まずifと書き、次に「( 条件 )」を書き、次に「{」と書き、命令を書いて、「}」でif文終了、の順番で書きます。「{ }」の間にはいくつ命令を書いても大丈夫です。

また、条件も一つのif文の中に複数書く事も可能です。例えば、変数itouとsaharaを作ったとして「itouが50以上 かつ saharaが100以下の時」などの条件を作りたい場合は、if((itou>=50) && (sahara<=100)){  }
のように書きます。
他にも、「itouが100以上 または saharaが0以下の時」という条件を作りたい場合は、if((itou>=100) || (sahara<=0)){  }
のように書きます。


```java:fukube.pde
int itou;
int sahara;
void setup(){
  size(1000,500);
  itou=  ;//好きな数字
  sahara=  ;//好きな数字
}
void draw(){
  if((itou>=50) && (sahara<=100)){
    rect(0,0,500,250);
  }
  if((itou>=100) || (sahara<=0)){
    rect(500,0,500,250);
  }
}
```


#if文の中にif文を書く時の注意

if文の中にif文を書く事が多くありますが、「}」の書く場所を間違えて思ったような動きにならない場合がよくあります。
ここからは著者がif文を書くときに間違えないように、書く方法を紹介します。※テクニックの一つなので、こういう風に書く方法もある程度に読んでください。

```java:fukube.pde
  if(){}
```

↑まずif文に必要な数のカッコを用意します。

```java:fukube.pde
  if(){
  
  }
```

↑次に「}」を改行していく

```java:fukube.pde
  if(条件){
    命令;
    命令;
  }
```

↑条件や命令を書く

```java:fukube.pde
  if(条件){
    命令;
    命令;
    if(){}
  }
```

↑またif文に必要なカッコを書く

```java:fukube.pde
  if(条件){
    命令;
    命令;
    if(条件){
      命令;
    }
  }
```

↑改行し、条件と命令を書く

このようにif文を書くと「{  }」の数を間違える心配もありませんし、エラーも少なくなります。ぜひ参考にしてみてください。

#これをやってメンターに見せてみよう！

##ミッション
「&&」や「||」を使ったif文を作り、メンターに「どんな条件の時になんの命令が動くようになる」かを説明してみよう。
※ヒント
複雑すぎるプログラムを書くと自分もメンターもわけがわからなくなるから、程々に条件を作りましょう。
教育版EV3 C言語プログラミング環境を整える

#環境 その１(成功)
- OS: Microsoft Windows 10 64bit
 - [Cygwin](https://www.cygwin.com/): gcc-core, make, diffutils, perl
 - [GCC ARM](https://launchpad.net/gcc-arm-embedded/+download):  gcc-arm-none-eabi-5_4-2016q3-20160926-win32.zip
 - [U-Boot mkimage](http://www.trimslice.com/download/tools/Mkimage.tar.gz)
 - [EV3用開発プラットフォーム（EV3RT）](http://dev.toppers.jp/trac_user/ev3pf/wiki/Download): ev3rt-beta7-2-release.zip
- CPU: Intel(R) Core(TM) i7-7700 CPU @ 3.60 GHz
- 教育版レゴ マインドストームEV3
- microSDHC 東芝EXCERIA M302 32GB
- Bluetooth(R) USBマイクロアダプター BUFFALO BSBT4D200
- [TeraTerm](https://ttssh2.osdn.jp/)

##注意点
Bluetooth接続時のデバイス名「Mindstorms EV3」やペアリングコード「0000」は、microSDHCカードの ev3rt\etc\rc.conf.iniを書き換えることで変更できる。

#環境 その2 (成功)
- OS: macOS Mojave 10.12.6
- [gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2](https://launchpad.net/gcc-arm-embedded/+download)
- Bluetooth PAN

#参考にしたページ
- [TOPPERS:開発環境構築のマニュアル](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnv#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB)
- [TOPPERS:サンプルアプリケーションのビルドと実行](https://dev.toppers.jp/trac_user/ev3pf/wiki/SampleProgram)
- [アフレル:教育版 C言語プログラミングガイド《改訂版》ダウンロードコンテンツ](http://afrel.co.jp/lead_dl/ev3rt_dl/) 要パスワード
Squidを用いたホワイトリスト方式のURLフィルタリング

# はじめに
入社1年目の新人エンジニアです。
ホワイトリスト方式のURLフィルタリングを実現するためにSquidを用いました。
その作業内容の備忘録です。
# 環境
CentOS 7.6.1810
Squid 3.5.20
# 設定ファイルの作成内容
Squidの設定ファイルを記載します。
プロキシ情報の秘匿は[診断くん](http://taruo.net/e/ "診断くん")を用いて確認しました。
　　※結果：「疑惑～20%：proxyの可能性もわずかにあります。」

```:/etc/squid/squid.conf
# IPv4優先
dns_v4_first on

# IPアドレス定義
acl localnet src 192.168.0.0/16

# 接続先ポートの拒否
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 443         # https
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

# アクセス制限(「allow localnet」だとフィルタリングが効かない)
acl whitelist dstdomain "/etc/squid/whitelist"
acl whitelist_regex url_regex "/etc/squid/whitelist_regex"

http_access deny !localnet
http_access allow whitelist
http_access allow whitelist_regex
http_access deny all

# デフォルトのSquid使用ポート
http_port 3128

# キャッシュを用いない
no_cache deny all

# コアファイルの格納する場所
coredump_dir /var/spool/squid

# ホスト名の秘匿
visible_hostname unknown

# プロキシ情報の秘匿
forwarded_for off
request_header_access User-Agent deny all
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
```

# ホワイトリストの内容
## ホワイトリスト(ドメインで許可)
Qiitaを閲覧するために必要だったものを記載しました。
.(ドット)から始まるものはサブドメインも含めます。

```:/etc/squid/whitelist
.qiita.com
.google.com
.gstatic.com
.amazonaws.com
.qiitausercontent.com
qiita-user-profile-images.imgix.net
```
## ホワイトリスト(正規表現)
正規表現のURL単位で許可ができます。

```:/etc/squid/whitelist_regex
^http://taruo.net/e/
```
正規表現による許可はHTTPSには利用できませんでした。

# おわりに
SSL_Bumpを用いてaccess.logでHTTPSの復号化が確認できましたが、正規表現でのURL許可はできませんでした。
理解が足りず妥協した点があったため、再度調査を行いたいです。

# 参考サイト
- [Squidでホワイトリストプロキシを作成する](https://qiita.com/tosier/items/30297afb6ffbd4567eb5 "Squidでホワイトリストプロキシを作成する")
- [10.アクセスコントロール | 炉ばた](https://www.robata.org/docs/squid/faq_10.html "10.アクセスコントロール")
- [squidで特定のサイトのみアクセスを許可する | futuremix](https://futuremix.org/2005/07/squid-access-allow "squidで特定のサイトのみアクセスを許可する")
- [第30章 Squidプロキシサーバ | SUSE](https://www.suse.com/ja-jp/documentation/sles11/singlehtml/book_sle_admin/cha.squid.html#sec.squid.configfile "第30章 Squidプロキシサーバ")
Shopifyでストアをオープンするときに注意しないとアクセスできなくなる問題

顧客向けにShopifyストアを作成するとき、パートナーアカウントでテストストアを作成→ユーザー（顧客）に所有権を譲渡という流れになりますが、知らずにハマったので共有します。

## 所有権を譲渡したストアは譲渡された側のユーザーが譲渡を受け入れ（課金設定）をするまで、ストアにアクセスができなくなる

パートナーアカウントでストアをオープンすると、課金なしで開発が可能ですが、実際に販売する前に所有権を譲渡してストアを課金状態にしないといけません。
パートナーが顧客に所有権を譲渡した瞬間からユーザーが支払いを許可するまでサイトはサスペンド状態になります。
譲渡のキャンセルは不可能なので、タイミングを気をつけましょう
https://help.shopify.com/en/partners/dashboard/hand-off-development-stores#activate-a-paused-store



## 有料アプリ、テーマも課金状態にしないと機能を利用できない
パートナーがストアからインストールしたテーマ、アプリは所有権を移行しただけでは課金状態になりません。
ストアがパートナーが設定した状態まで利用できるようにするにはテーマ、アプリも同様に課金状態にする必要があります。
ストアの所有権を移行しただけで安心せずに、インストール済みのテーマ、アプリの管理画面に行き課金状態にするまでサポートしましょう。
https://help.shopify.com/en/partners/dashboard/hand-off-development-stores#transfer-a-third-party-theme



### おしまい
ちゃんとドキュメント読めという話ではありますが、↑の旨を伝えるダイアログは出ませんでした。
オープン初日権限移行していきなり障害とならないように気をつけましょう。
root (cern) のヒストグラムの色

   

rootのヒストグラムの色の引数の数字なんてわかんねえ！！てなことで
----------
```cpp
h1->SetLineColor(2);

  黒(1)、赤(2)、黄緑(3)、青(4)、黄(5)、桃(6)、水色(7)、緑(8)、群青(9)、
    透明(10)、アイボリー(11)、灰色(12)、その後だんだん薄く 

```
配色のセンスが悪いと罵倒の嵐である、おそろし


----------

```cpp:動くわけではないrootプログラム

TCanvas *c1;

void halo
{
   TH1F *h1 = new TH1F("h1", ";ADC count;count", nbin, 0, 256);
 
      h1->Fill(xx, yy);
   c1 = new TCanvas("c1", "c1", 1200, 800);

   
   h1->Draw("hist");
   h1->SetXTitle("ADC ");
   h1->SetYTitle("Counts ");
   h1->SetTitle("AAA ");
   h1->SetLineWidth(2);
//色シリーズ
   h1->SetLineColor(2);
   h1->SetMarkerColor(2);
   h1->SetMarkerStyle(22);


黒(1)、赤(2)、黄緑(3)、青(4)、黄(5)、桃(6)、水色(7)、緑(8)、群青(9)、
    透明(10)、アイボリー(11)、灰色(12)、その後だんだん薄く 

}   
```
canvaが有料になった？と思ったら勘違いだった

以前こちらでアイキャッチを簡単に作れる方法をご紹介しましたが、
一部有料の画像が存在したため補足記事です。
https://qiita.com/a-nishimura/items/2174e7168687de811c6c

## canva
使用しているツールはこちら
https://www.canva.com

基本は無料で使えます。
ところがある日急に

<img width="319" alt="スクリーンショット 2019-09-09 14.29.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/0a5a03bc-35d9-b952-596f-bb8d8533841d.png">

と表示されました。

え？有料になった？？

と思いましたが、結果気のせいでした。

背景や素材など無料で使えるものも多いのですが、
その中の一部に有料の素材があります。
有料の素材を使用するにはライセンス購入する必要があるみたいです。

<img width="422" alt="スクリーンショット 2019-09-09 14.29.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/88ba5ea7-bd97-7d40-1323-f80347b50251.png">

カーソルを合わせて「無料」と出るものは無料で使えます。「US$」などと表示されるものは有料です。
購入しない場合は透かしが入った状態の画像になります。
<img width="687" alt="スクリーンショット 2019-09-09 14.29.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/96e69416-f888-b6df-e6af-93bc868550bb.png">

## ライセンスの種別
* ワンタイムユース：１点のデザインについて、透かしを削除できます。
* マルチユース：チームでの利用や複数のデザインでの使用のために、透かしなしでダウンロードできます
* 拡張ライセンス：マルチユース、印刷部数の拡張、再販の権限があります。

普段は基本的に著作権フリー画像とテキストくらいしか使っていないので気づきませんでした。
有料画像を使用する場合は注意ですね。

ちなみに普段のDL画面はこちら
<img width="318" alt="スクリーンショット 2019-09-09 14.29.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/64602186-e729-bbe9-a469-e7c44cca52a1.png">
Windows環境のIonic ローカル開発でSSLの利用

# Windows環境のIonicでSSL環境の構築
下記の環境で開発

```
Ionicバージョン関係

package.json
"@ionic-native/core": "^5.0.0",
"@ionic-native/splash-screen": "^5.0.0",
"@ionic-native/status-bar": "^5.0.0",
"@ionic/angular": "^4.7.1",

ionic -v
5.2.5
```

## 手順

1. PCにopenSSLデータ設置
2. PCの環境変数を設定
3. npmでモジュールを追加してSSL生成
4. package.jsonでSSLを有効化


### 1.PCにopenSSLデータ設置

下記GoogleCodeからダウンロードし「**C:/OpenSSL-Win32/**」に設置
任意のディレクトリでもよいかも
https://code.google.com/archive/p/openssl-for-windows/downloads
![NoName_2019-9-9_14-17-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/8ab5b2fa-f801-a379-b19f-77846a8018a4.png)



### 2. PCの環境変数を設定

#### 環境変数のパネルを開く
設定や「Windowsキー+Pause|Break」など**コントロール パネル\システムとセキュリティ\システム**を開き、左カラムの上から４つめ**システム詳細設定**を開く

![NoName_2019-9-9_14-26-55_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/8e71849d-e3a0-c20d-010a-b5b44ce3a2c7.png)

#### システム環境変数(s)へ新しい変数を追加
```
変数
OPENSSL_CONF
値
c:\OpenSSL-Win32\openssl.cnf
```

#### システム環境変数(s)のpathに新しい値を追加
```
変数
Path
値の最後に追加
C:\OpenSSL-Win32\bin
```

#### 動作チェック
```
実行コマンド
openssl version
実行後
OpenSSL 0.9.8k 25 Mar 2009
```


### 3. npmでモジュールを追加してSSL生成

#### Commandでグローバルにモジュール追加
```
実行コマンド
npm install -g openssl
実行後
+ openssl@1.1.0
added 6 packages from 14 contributors in 1.33s
```

#### SSL生成

```
実行コマンド
ionic ssl generate
実行後
Created .\.ionic\ssl directory for you.
> openssl.exe req -x509 -newkey rsa:2048 -nodes -subj /C=US/ST=Wisconsin/L=Madison/O=Ionic/CN=localhost -reqexts SAN -extensions SAN -config C:\Users\takumi\AppData\Local\Temp\ionic-ssl-8b38e0 -days 365 -keyout I:\myApp\.ionic\ssl\key.pem -out I:\myApp\.ionic\ssl\cert.pem
Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
......................................+++
.+++
writing new private key to 'I:\myApp\.ionic\ssl\key.pem'
-----

Key:  .\.ionic\ssl\key.pem
Cert: .\.ionic\ssl\cert.pem

[OK] Generated key & certificate!
```

### 4. package.jsonでSSLを有効化

#### ssl有効化とkeyなどのパス指定

```
package.json
ionic serve --ssl --key-path=./.ionic/ssl/key.pem --cert-path=./.ionic/ssl/cert.pem

```

IonicSSL設定
https://ionicframework.com/docs/cli/commands/ssl-generate#option-key-path

### 参考サイト
https://stackoverflow.com/questions/42918916/npm-install-openssl-failed-on-windows-10
C++でテキストファイル操作だ

テキストファイルを読み込むのはこいつらを使うぞ

```cpp
#include <fstream>
using namespace std;

ifstream finL("Loutput190831.dat"); //入力
ofstream foutt("testout.dat"); 　　　//出力
```
実際使おう
------------

```cpp

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <fstream>
#include <iostream>

using namespace std;


int main()
{

   string str1, str2, str3, str4, str5;
   std::string data;
   int nbin = 256;

   ifstream finL("Loutput.dat");
   ofstream foutt("testout.dat");
   //////
   //Loutput は 01 0000 0001 0002 0003 0004 0005 0006 0007 
   //////
   string buf;
   while (!finL.eof())　//ファイルを最後まで読む
   {
      string uni, bin0, bin1, bin2, bin3, bin4, bin5, bin6, bin7;
  
      //cout << buf[1] << endl; buf[1] は 1
      finL >> uni >> bin0 >> bin1 >> bin2 >> bin3 >> bin4 >> bin5 >> bin6 >> bin7;
      //       01    0000    0001    0002    0003    0004    0005    0006    0007 
      foutt << bin2 <<bin5
      //       0002   0005   testout.datのなかみ

    finL.close
   }

```
小話
---------
eofはファイルの一番最後に存在する見えない文字
eofを読んだ時点でfinL.eof()はtrueを返す
なので最後まで読んで欲しい時は

```cpp
while (!eof.finL){}
```
となる。

他にも入出力ストリームはstringstreamなどがある。
Resemble.jsをとにかく使う

とにかくResemble.jsを使ってみたかったので、最短で動かす方法を調べました。

# 比較する画像
a.jpg
<img width="205" alt="a.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98758/ee6f859f-0993-6748-c83a-267f2a046e0f.jpeg">
b.jpg
<img width="205" alt="b.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98758/888b4f77-c4db-e737-5263-b4a34f28c527.jpeg">

名称未設定のフォルダの有無です。

------

# 環境設定

```
$ node -v
v8.11.3
$ npm -v
6.4.1
$ npm i resemblejs
$ npm i fs
```

nodeとnpmが入っている環境に、resemblejsとfsをinstallする。




---

# 実行ソース

[【Ionic + Electron】Resemble.jsを使って画像比較を行うデスクトップアプリを作成](https://qiita.com/yosshitaku067/items/ce62a81de16a9d8e2354)
を参考に、以下のソースで実行

```JavaScript
const fs = require('fs');
const resemble = require('resemblejs');

// 比較したい画像のパスを指定
const image1 = fs.readFileSync("a.jpg");
const image2 = fs.readFileSync("b.jpg");

resemble(image1).compareTo(image2).onComplete(data => {
  if (data.misMatchPercentage >= 0.01) {
    console.log('差分を検知しました。');
    fs.writeFileSync("./diff_image.jpg", data.getBuffer());
  }else{
    console.log("差分なし");
  }
});
```

----

# 出力結果


結果、以下の画像が作成された。
diff_image.jpg
![diff_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98758/80662d61-a95b-edfc-4c57-9c91ac3906b2.jpeg)


これで動作確認完了!
Laravel6.0 PHPStormのPHPUnitテスト実効でbootstrap/cacheにライト権限を付けろエラーが出る

## PHPStormでUnitテストを実効する。
<img width="600" alt="スクリーンショット 2019-09-09 14.05.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/d37b8ab0-18b9-c77a-6d9f-e109121fcf5c.png">
<img width="975" alt="スクリーンショット 2019-09-09 14.08.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/b2a53ed2-a6b9-0b42-7d19-0e81901041cd.png">
すると   The bootstrap/cache directory must be present and writable.  エラーになってしまう。
実行権限あるけどエラーになってしまう。
chmod 0777 -R  ./bootstrap/cache
を実効するがエラーは直らない。

ググってこのページを見つけた。
https://github.com/laravel/framework/issues/29862


<img width="971" alt="スクリーンショット 2019-09-09 14.12.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/1b3ae428-8022-c612-0704-0c39ed1fc018.png">
Custom working directory を プロジェクトルートに設定する。
<img width="900" alt="スクリーンショット 2019-09-09 14.11.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/8d146294-6fb7-1d68-0458-bd7c5df2568e.png">


<img width="642" alt="スクリーンショット 2019-09-09 14.14.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/3ee97c27-4260-a344-9289-f561919698e7.png">
テストが動くようになった。
GitHubでチーム開発を行うためのgit clone ~ git pushまでの流れ

#git clone ~ git pushまでの流れについて
##前提
・githubの登録済み
・ターミナルにgithubの設定を反映させてる(user.name,user.email)
・公開鍵の作成済み



##git clone

**git clone**したいgithubのリポジトリを開く。
そして右上の緑のボタンからURLをコピーする。
<img width="1048" alt="スクリーンショット 2019-09-08 22.46.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429158/245c3804-88f7-0f3a-2bf8-e67e3b3deb4a.png">

ターミナルので**git clone**する

```
git clone [URL]

Cloning into 'リポジトリ名'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
Checking connectivity... done.
```

成功すると上記のような表示になる。
成功したかどうかは、ターミナルでそのままlsコマンドでcloneしたかったファイルがあるか確認可能。

```
$ ls
```

##git add . & git commit -m hogehogeで変更を加える

(例)README.mdファイルの場合
1.ファイル内の変更をする。

``` ruby:README.md
接続テストです。
```
このように変更を加えたとする。

2.README.mdファイルをaddする

```
git add -A
```

3.README.mdファイルをコミットする

```
git commit -m "接続テスト"
```

4.adminユーザーの方でチーム開発メンバーの招待をする
このまま**git push**してもエラーがでるのでリポジトリを作成したユーザーの方から、チームメンバーの登録行う
![スクリーンショット 2019-09-09 14.03.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429158/dd65d6d4-463b-4796-a5bb-868f3f73fd34.png)
Serach by usernameの所に参加するメンバーのusernameを検索すると招待メール送れるので、そこで承認をしてもらう。

##README.mdファイルをプッシュする
メンバーの承認も終わったら最後pushして完了

```
git push 

Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 327 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [URL]
   c836616..0731f24  master -> master
```
Visual Studio Code で Salesforce の開発環境構築

**随時更新**
---
- [Visual Studio CodeでSalesforceの開発環境を構築する](https://qiita.com/shunkosa/items/e6248520bff90f397158)
- [Visual Studio CodeでSalesforceのApexテストを実行・デバッグする](https://qiita.com/shunkosa/items/98f107dd532166e8d4a6)
KUSANAGI サーバー(マルチドメイン)でメール送信のspfをPASSにする

KUSANAGI サーバーを Conoha VPS(マルチドメイン対応)で動かしている場合です。

mb_send_mail でメール送信してみたところ、spfがPASSではなくNEUTRALになっていたので、PASSにするようにPHPプログラムを編集しました。

[自動計算](https://calculator.jp/)のページに設置したメールフォームです。(※calculator.jpのDNSのspfレコードは設定済みの想定です。)

## spfがNEUTRALになったコード

```PHP
// $to_mail, $subject, $message, $from の設定は省略
mb_send_mail($to_mail, $subject, $message, $from);
```

というコードです。送信したところ以下のようなメッセージになりました。

![spf neutral](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31643/f1b74f2c-823f-1e0c-e6df-236a3bd56ddc.png)


## spfがPASSになったコード

```PHP
// $to_mail, $subject, $message, $from の設定は省略
$admin_mail   = 'info@calculator.jp';
$envelope = "-f" . $admin_mail;
mb_send_mail($to_mail, $subject, $message, $from, $envelope);
```

というコードです。

![spf pass](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31643/ee81ab42-45ca-9d4b-0927-6adbd0e6fe92.png)

## spfがPASSにならなかった原因
おそらくですが、サーバー自体がマルチドメイン対応のため、PHPプログラム上で明示的にエンベロープを指定しないと、特定のドメイン(この場合はcalculator.jp)のメール送信とは判定されなったようです。
そのためcalculator.jpのspfレコードを設定してもPASSにならなかったようです。
Robot Framework 使ってみる③

#リモートホストでコマンド実行してみる(2回目)
[Robot Framework 使ってみる①](https://qiita.com/navasato/items/862b7715595319a63239 "Robot Framework 使ってみる①")
やってみたいことの2番目：vyos内のファイルを取得する　に挑戦する。

http://robotframework.org/SSHLibrary/SSHLibrary.html
get file : 絶対これだと思う！

とりあえず手動。

```text
# scp vyos@172.17.0.2:/var/log/messages ./
Welcome to VyOS
vyos@172.17.0.2's password:
messages 100% 228KB 58.7MB/s 00:00
# ls -l
total 728
~snip~
-rw-r----- 1 root root 233350 Sep 9 02:46 messages
~snip~
#
```

####Get file

```text:test04
# cat test04.robot
*** Settings ***
Library SSHLibrary

*** Variables ***
${user} vyos
${password} vyos
${ip1} 172.17.0.2
${ip2} 172.17.0.3

*** Test Cases ***
ssh test of vyos
    vyosに接続
    vyosにログイン
    ${output} = Execute Command echo SSH to vyos is OK!
    Log To Console ${\n}${output}
    Should Be Equal ${output} SSH to vyos is OK!

get messages
    Get File /var/log/messages

*** Keywords ***
vyosに接続
    Open Connection ${ip1}
vyosにログイン
    Login ${user} ${password}
#
```

で、実行。

```result
# robot test04.robot
==============================================================================
Test04
==============================================================================
ssh test of vyos ...
SSH to vyos is OK!
ssh test of vyos | PASS |
------------------------------------------------------------------------------
get messages | PASS |
------------------------------------------------------------------------------
Test04 | PASS |
2 critical tests, 2 passed, 0 failed
2 tests total, 2 passed, 0 failed
==============================================================================
Output: /root/output.xml
Log: /root/log.html
Report: /root/report.html
#
```

一撃でPASS

```text
# ls -l messages
~snip~
-rw-r--r-- 1 root root 233575 Sep 9 02:54 messages
~snip~
#
```

catなどでもきちんとファイル開けました。あ、もちろん手動でscp実行した時のファイルは消してrobot実行してますよ。

####いくつか試し
#####宛先指定

```text
get messages
    Get File  /var/log/messages  /tmp/tmp/
```

destinationの指定もOK。

#####ファイル名の変更も可能

```text
get messages
    Get File  /var/log/messages  /tmp/tmp/vyos_messages
```

今回は割とスムーズにできた。
C++で正規表現が使いたい

最初に
-------
pythonでは正規表現re.subなんかを使うと簡単にテキストの中身が変えられちゃう！！　　

#[regex](https://cpprefjp.github.io/reference/regex/basic_regex.html)
元も子もないがこっちを読んだ方が良い
[標準C++ライブラリwikipedia](https://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96C%2B%2B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)
#C++でしたい

```cpp
      // ","　の置換 
      string str5 = "0000,0001,0002";     // 置き換えたい文字列
      string okikawaru = ",";      // 文字列
      string okikaeru = " "; // 置換文字列
      if (!okikawaru.empty())
      {
         string::size_type post = 0;
         while ((post = str5.find(okikawaru, post)) != string::npos)
         {
            str5.replace(post, okikawaru.length(), ikikaeru);
            post += ikikaeru.length();
         }
      }
```

結果 

```cpp

0000 0001 0002
```
となる
【Processing】03.if文 ~もし、こうなった時は、○○してくれ~【★✩✩✩✩】

#if文 ~条件文~

「〇〇と△△を買いにおつかい行ってきて。もし、お釣りが余った時は、好きなお菓子を買ってくれ。」つまり、if文とはこういうことです。
〇〇と△△を買いに行くことは絶対やることですが、お釣りが余った時はお菓子を買ってから家に変える、お釣りが余らなかったらそのまま家に変えるという二つの分岐が発生しました。
プログラミング的に例を出すと、「もし、マウスをクリックした時は、図形を出してくれ。」などで使われます。これは、何もしないで何も起きない、マウスをクリックすると図形が出る、の二つの分岐を発生させています。
02で学んだ図形の出し方を思い出して実際にやってみましょう。


```java:fukube.pde
void setup(){
  size(1000,500);
}
void draw(){
  if(mousePressed){//もし、マウスをクリックした時
    ellipse(500,250,300,300);
  }
}
```


#複数の分岐
「〇〇と△△を買いにおつかい行ってきて。もし、■■が200円より安かった時は、■■も買ってきて、もしそれでも、お釣りが余った時は、好きなお菓子を買ってくれ。」
こういう場合もありますね。今回は条件が二つに増えました、■■が200円より安かった時はそれを買う、200円より高かった時はそれは買わない、その後余ったお金でお菓子を買う、余らなかったら買わない。という4パターンの分岐ができましたね。
プログラムではこういう分岐をたくさん作ります。
今回の例は、01で学んだことを思い出してやってみましょう。

```java:fukube.pde
int saitou;
void setup(){
  size(1000,500);
  saitou=0;
}
 void draw(){
  if(mousePressed){
    saitou=saitou+1;//ここの意味がわからなかったら01をもう一度読もう。
    if(saitou==10){//if文の「=」は二つ必要だよ！よくやるミス
      ellipse(500,250,200,200);
    }
  }
}
```
どうなったかメンターに説明してみましょう。

# 「〇==x」、「〇>x」、「〇<x」、「〇>=x」、「〇<=x」、「〇!=x」

実は条件は「○○だった時」以外にもあります。 

- 数値が一致したら
    - 「==」と書きます。今回はsaitouが10だったらで使っています。
- 数値より上の時
    - 「>」と書きます。saitouが10より上になった時は、〇〇するとかに使います。
- 数値未満の時
    - 「<」と書きます。以上の逆です。
- 数値以上の時
    - 「>=」と書きます。saitouが10以上になった時は、〇〇するとかに使います。
- 数値未満の時
    - 「<=」と書きます。以上の逆です。

#これをやってメンターに見せてみよう！

##ミッション

変数gotouとkatouを作って、gotouが100以上になったらkatouが1ずつ増えるようにし、katouが60以上になったら何かしらの図形が出るようにプログラムしてみよう。

※ヒント
01,02を見ながらやってみよう
構造体ってなんだよ

#構造体ってなんであるの？
##配列の役割とは？
**配列**は**一つの型**の複数の変数を管理することができる。
つまり、**同じ型**である必要がある！

##構造体は配列の上位互換
**構造体**は**複数の型**の複数の変数を管理することができる。
つまり、**制限**がない！
###ただのメンバ変数を関する構造体

```c++

#include <bits/stdc++.h>
using namespace std;

struct stu{//stu型に統一する stuは構造体名
    string name;
    int id,age;
    string e_mail;
    double GPA;
}S;//Sにメンバ変数を入れる Sは構造体変数名 

int main(){
    cin >> S.name >> S.id >> S.age >> S.e_mail >> S.GPA;
    }
}
```
###配列化したメンバ変数を管理した構造体

```c++

#include <bits/stdc++.h>
using namespace std;

struct stu{//stu型に統一する stuは構造体名
    string name;
    int id,age;
    string e_mail;
    double GPA;
}S[100];//S配列にメンバ変数を入れる Sは構造体変数名 

int main(){
    for (int i=0; i<3; i++){
        cin >> S[i].name >> S[i].id >> S[i].age >> S[i].e_mail >> S[i].GPA;
    }
}
```
###配列化したメンバ変数＆関数を用いた構造体
```c++
#include <bits/stdc++.h>
using namespace std;

struct stu{//stu型に統一する stuは構造体名
    string name;
    int id,age;
    string e_mail;
    double GPA;
}S[100];//S配列にメンバ変数を入れる Sは構造体変数名 

void printStudent(stu A){
    cout << A.id << " " << A.GPA << endl;
}

int main(){
    int n;cin >> n;
    for (int i=0; i<n; i++){
        cin >> S[i].name >> S[i].id >> S[i].age >> S[i].e_mail >> S[i].GPA;
    }
    
    for (int i=0; i<n; i++) printStudent(S[i]);
}
```
メンバ変数にアクセスするには、**構造体変数名.メンバ変数**という書き方でアクセスできる！

#構造体とクラスの違いは？
**class** はデフォルトのアクセシビリティが **private** 
**struct** はデフォルトのアクセシビリティが **public** 
https://qiita.com/pink_bangbi/items/e25302df7f4ba7fa0db4

#まとめ
2つ覚えるの無理だから**構造体**だけ覚えるわ
Uncaught TypeError: OO.filter is not a function  


```
var apiYokoName = apiMetaYokoList[0].CLASS.filter(function(item, index){
 if (item['@code'] == valueData[key]['@time']){
   return true;
 }
});
//TypeError: apiMetaYokoList[0].CLASS.filter is not a function  
```

修正

```
var apiYokoName = [apiMetaYokoList[0].CLASS].filter(function(item, index){
 if (item['@code'] == valueData[key]['@time']){
   return true;
 }
});
```
filterは配列のメソッドなのにCLASSというオブジェクトで使おうとしたからエラーが出た。
grepの検索から特定のファイルやディレクトリを除外する

##はじめに
grepを使って検索をかけるときにlogファイルなど膨大に検索にかかってしまうことがあったのでディレクトリやファイルだけ除外できないかと調べました。
##実行
オプションにありました。

・ファイルを除外するとき

```
grep -rn "検索したいテキスト" --exclude 除外したいファイル
```

・ディレクトリを除外するとき

```
grep -rn "検索したいテキスト" --exclude-dir 除外したいディレクトリ
```
ktlint-gradleの導入と使用について

ktlint-gradleを使用してコードフォーマットするようにしたときの備忘録

## ktlint-gradleのインストール
```gradle
plugins {
  id "org.jlleitschuh.gradle.ktlint" version "<current_version>"
}
```
## フォーマット
```
$ gradle ktlintFormat
```

## チェック
```
$ gradle ktlintCheck
```

## precommit hookの追加
なんかktlintからインストールしてるのとか見かけたけど、今はktlint-gradle自体が提供するようになっているようです。
### フォーマット　
```
$ gradle addKtlintFormatGitPreCommitHook
```

### チェック
```
$ gradle addKtlintCheckGitPreCommitHook
```



## 参考
[ktlint-gradle](https://github.com/JLLeitschuh/ktlint-gradle)
MacOS のdate コマンドで任意の日数分表示する

MacはBSD Unixベースみたいで，GUN Linux とはdate コマンドのオプションが違う．
主に[linuxのシェルスクリプトで日付でループする](https://qiita.com/hawaku/items/2f0a8454bbead2f070d2) のスクリプトを参考にしている．
以下で任意の日付を出力する．

```bash
STARTDATE="2019/09/10"
ENDDATE="2019/09/23"

CURRENTDATE=$STARTDATE

while [ 1 ] ; 
do
	echo $CURRENTDATE

	if [ $CURRENTDATE = $ENDDATE ] ; then
		break
	fi

	CURRENTDATE=`date -v+1d -j -f "%Y/%m/%d" $CURRENTDATE "+%Y/%m/%d"`
	
done
```
```
2019/09/10
2019/09/11
2019/09/12
2019/09/13
2019/09/14
2019/09/15
2019/09/16
2019/09/17
2019/09/18
2019/09/19
2019/09/20
2019/09/21
2019/09/22
2019/09/23
```

# 参考記事
[linuxのシェルスクリプトで日付でループする](https://qiita.com/hawaku/items/2f0a8454bbead2f070d2)

[Macでdateコマンドが違う件について](https://tatsuno-system.co.jp/2016/06/27/mac%E3%81%A7date%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E9%81%95%E3%81%86%E4%BB%B6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)

[Mac の bash で date を使って先月の今日の日付を取ろうとしたらハマった](http://weble.org/2010/09/21/mac-bash-date)

[Macのdateコマンドで前日の日付を取得する](https://qiita.com/___uhu/items/3c2312359da542cda163)

[dateコマンドで日付計算（加算／減算）をしたい](https://macprimary.white-doll.net/?p=224)
【MySQL】NULL安全等価演算子でNULLを含めた一致を取る

`MySQL`の`where`では検索対象が`null`の場合無視されてしまうため、以下のようなクエリでは、「DBに入っている`fuga_value`の値が`null`かつ`:param`への入力が`null`」という場合の取得ができません。

```sql
select * from hoge where fuga_value = :param;
```

# 対処法
NULL安全等価演算子を使って以下のように書けます。

```sql
select * from hoge where param <=> :param;
```

# 参考
[MySQL :: MySQL 5\.6 リファレンスマニュアル :: 12\.3\.2 比較関数と演算子](https://dev.mysql.com/doc/refman/5.6/ja/comparison-operators.html)
Rails6 のちょい足しな新機能を試す77（update_all 編）

# はじめに

Rails 6 に追加された新機能を試す第77段。 今回は、 `update_all` 編です。
Rails 6 では、 `update_all` が楽観的ロックを配慮するようになりました。

Ruby 2.6.3, Rails 6.0.0, Rails 5.2.3 で確認しました。

```shell
$ rails --version
Rails 6.0.0
```

# プロジェクトを作る

```shell
$ bin/rails new rails_sandbox
$ cd rails_sandbox
```

今回は、わざと StaleObjectError が発生するような更新処理のメソッドを作って確認します。

# User モデルを作る

属性として、 name と age を持つ User モデルを作ります。
楽観的ロックの機能を使うため、 lock_version も追加します。

```shell
$ bin/rails g model User name age:integer lock_version:integer
```

# seed データを作成

seed データを作成します。

```ruby:db/seeds.rb
User.create!(
  [
    { name: 'Taro', age: 10 },
    { name: 'Jiro', age: 10 },
    { name: 'Hanako', age: 10 }
  ]
)
```

# User モデルを修正する

Taro のレコードを検索します。
Taro と Hanako の age を `update_all` を使って 11 に更新します。
そのあと、StaleObjectError を発生させるために、検索したTaro の age だけ12 に更新します。

```ruby:app/models/user.rb
class User < ApplicationRecord
  def self.update_age
    taro = User.find_by(name: 'Taro')
    where(name: %w[Taro Hanako]).update_all(age: 11)
    taro.age = 12
    taro.save! # => StaleObjectError
  end
end
```

# seed データの投入

DB マイグレーションを実行しデータを登録します。

```shell
bin/rails db:create db:migrate db:seed
```

# Rails Runner で確認する

Rails Runner で `User.update_age` を実行するとStaleObjectError が発生します。

```shell
$ bin/rails runner 'User.update_age'
...
27: from /app/models/user.rb:6:in `update_age'
...
/usr/local/bundle/gems/activerecord-6.0.0/lib/active_record/locking/optimistic.rb:95:in `_update_row': Attempted to update a stale object: User. (ActiveRecord::StaleObjectError)`
```

# Rails Console で確認する

`rails console` で各レコードを確認すると、 Taro と Hanako の age が 11 に lock_version が 1 になっていることがわかります。 ( `update_all` は実行されているが、 `save!` メソッドは実行されていない )

```irb
irb(main):001:0> User.all.map{|u| [u.name, u.age, u.lock_version]}
  User Load (0.5ms)  SELECT "users".* FROM "users"
=> [["Jiro", 10, 0], ["Taro", 11, 1], ["Hanako", 11, 1]]
```

# Rails 5 では

Rails 5.2.3 では、エラーは発生せず、最後まで実行されます。
Rails Console で確認すると、Hanako の lock_version は 0 のままで、 Taro の lock_version は、 1 になっています。
`update_all` で更新したときは、lock_version は変わらず、 `save!` メソッドで更新したときに lock_version が更新されるためです。

```irb
irb(main):001:0> User.all.map{|u| [u.name, u.age, u.lock_version]}
  User Load (0.4ms)  SELECT "users".* FROM "users"
=> [["Jiro", 10, 0], ["Hanako", 11, 0], ["Taro", 12, 1]]
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try077_update_all


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Ensure `update_all` series cares about optimistic locking](https://github.com/rails/rails/pull/35352)
Go/Go以外リポジトリをまとめてghq/pecoで使う

## はじめに

Goは慣例として `~/go/src` 配下にリポジトリをCloneします。
Go以外については、ghqを使っていれば、デフォルトで`~/.ghq`となります。

この記事は上記のように２つ以上のディレクトリをghq rootとして使いたい場合の設定メモです。
（ツール説明などは、参考記事参照してもらえれば ^^;）

## 参考記事

ghq/peco/hub紹介や、Go/Go以外を管理する場合の考察などは、下記がとても参考になります。

[ghq, peco, hubで快適Gitライフを手に入れよう！](https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2)
[ghqを用いたgo言語のリポジトリ管理方法について考える](https://qiita.com/chez-shanpu/items/02c8babc3b94d82d4f61)

## 自分が行った設定のメモ

#### Go/Go以外リポジトリルート追加
```terminal
git config --global --add ghq.root ~/go/src
git config --global --add ghq.root ~/.ghq
```

#### エイリアス追加

```terminal:~/.aliases
alias g='REPO=$(ghq list | sort -u | peco);for GHQ_ROOT in $(ghq root -all);do [ -d $GHQ_ROOT/$REPO ] && cd $GHQ_ROOT/$REPO;done'
alias gh='hub browse $(ghq list | grep github.com | peco | cut -d "/" -f 2,3)'
```
※.bash_profile等で`source ~/.aliases`が実行されるように設定してください

#### 使い方

- `g`コマンド
    - 実行するとリポジトリ一覧が表示され、選択したリポジトリに移動します
- `gh`コマンド
    - 実行するとgithubリポジトリ一覧が表示され、選択したリポジトリURLをブラウザで開きます。

#### Go以外のリポジトリClone

```
ghq get <repository URL>
```

#### GoリポジトリClone

```
go get <repository URL>
```
【2019年９月版】台風も直撃して通勤もままならないので BASIC でプログラマの本能を呼び起そうか

# Docker で N88-BASICを動かしてみたい！

いや、流石に N88-BASICそのものは動かないよね・・・と言うことで何か近い環境があるのかないのか調べてみました。

そして以下のサイトを発見しまして〜

- [Linux上のBASICインタプリタ: https://dabiyone.com/misc/mia001.html](https://dabiyone.com/misc/mia001.html)

"Bywater BASIC" というのが N88BASICに近いみたい？！
以下の記事も発見。bwbasic、生きてるみたいです！
- [Qitta:bwBASICでBASIC言語に再会してみよう](https://qiita.com/ryecroft21/items/69a7e1a43babba0ed395)

というわけで・・・apt install してみますか。docker で。

早速、[Docker Play Ground](https://labs.play-with-docker.com) サイトでインスタンス作成し、`docker run -it ubuntu bash` からの `apt update && apt upgrade` して〜の(というかこの辺りお決まりコースなのでなんとか省力化できないかな・・・)、`apt install bwbasic`してみます！

```
root@d889abd9355f:/# apt install bwbasic
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  bwbasic
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 83.6 kB of archives.
After this operation, 288 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic/universe amd64 bwbasic amd64 2.20pl2-11build1 [83.6 kB]
Fetched 83.6 kB in 0s (227 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package bwbasic.
(Reading database ... 4040 files and directories currently installed.)
Preparing to unpack .../bwbasic_2.20pl2-11build1_amd64.deb ...
Unpacking bwbasic (2.20pl2-11build1) ...
Setting up bwbasic (2.20pl2-11build1) ...
root@d889abd9355f:/# bwbasic
Bywater BASIC Interpreter/Shell, version 2.20 patch level 2
Copyright (c) 1993, Ted A. Campbell
Copyright (c) 1995-1997, Jon B. Volkoff
 
bwBASIC: 
bwBASIC: 
bwBASIC: print "aaa"
aaa
bwBASIC: quit

root@d889abd9355f:/# 
```

**`print`文が動くっ！動くぞコイツっ！！**

と言うわけで、dockerfile 仕立てておきました。はい。

- https://cloud.docker.com/u/dcyossyjp/repository/docker/dcyossyjp/bwbasic

ついでにDockerfileはこんな感じです。

```dockerfile
FROM ubuntu

RUN apt update && \
    apt -y upgrade && \
    apt -y install bwbasic lhasa

ARG program_dir=/root/program

VOLUME $program_dir

WORKDIR $program_dir
```
・・・適当ですいません。

docker の使える環境で

```
$ docker run -it dcyossyjp/bwbasic bash
```

としていただければ`bwbasic`と lzhの解凍ができる**`lha`コマンド**が使える環境に入れます。

lha コマンドは以下の記事が参考になるでしょうか。

- [Qiita: 【メモ】Linux圧縮/解凍コマンド](https://qiita.com/t-kubo0325/items/158e02aa6b8e62b76242)



それでは以下のサイトのプログラム動かしてみよかな〜

~~http://www5f.biglobe.ne.jp/~apaslothy/prog80/basicmagazine/index.html~~

そのほか、"マイコンBASICマガジン"、"ベーマガ 掲載プログラム" などで検索するとお宝が発掘できるかもしれません？！(雑誌に掲載されたプログラムは再配布とか色々アレなのでQiitaでは掲載を自粛致しますw 各自、個人の趣味の範囲でお楽しみください。。。)
plunkerでvue その8

#概要

plunkerでvueやってみた。
json読み込んで見た。

#成果物

d3.json

http://embed.plnkr.co/LJpcW1F5mBCkji8xDVMe/

xhr

http://embed.plnkr.co/dw5N7Tf4KTwpkoCK7ngN/

axios

http://embed.plnkr.co/IH7fOVa3ppmIocXZqA77/

以上。
[iOS] UIWebViewがいよいよヤバいらしい（"ITMS-90809: Deprecated API Usage"メールが届いた件）

2019年9月初めぐらいから、TestFlightにビルドをアップロードした後、以下の自動メールを受信しました。

>Dear Developer,
>
>We identified one or more issues with a recent delivery for your app, "XXXXX" X.X.X (XXXX). Your delivery was successful, but you may wish to correct the following issues in your next delivery:
>
>ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs . See https://developer.apple.com/documentation/uikit/uiwebview for more information.
>
>After you've corrected the issues, you can use Xcode or Application Loader to upload a new binary to App Store Connect.
>
>Best regards,
>
>The App Store Team

**Apple will stop accepting submissions of apps that use UIWebView APIs .**
**「AppleはUIWebView APIを使用するアプリの提出を受け付けなくなります。」**

いよいよ、UIWebViewを使っているとリジェクトされる日は間近なようです。

**2019/9/9 追記：**

「デッドラインがハッキリしない」というやりとり
https://forums.developer.apple.com/thread/122114

「現時点での早急な対応は不要」とのご見解
https://qiita.com/YutoMizutani/items/2b5185c84c31edfdc2d4

**2019/9/10 追記：**

Ionicチームのブログ
https://ionicframework.com/blog/understanding-itms-90809-uiwebview-api-deprecation/

以下、上記のブログより抜粋しGoogle翻訳したもの

- （iOSアプリをリリースできなくなりますか？）現在は、いいえ。これは単なる警告であり、エラーではないためです。警告によってApp Storeが拒否されることはありません。
- Appleに、UIWebView APIを含むアプリの提出の受け付けを停止する正式な日付をAppleに求めましたが、まだ返事はありません。 詳細がわかり次第、このブログを更新します。

**2019/12/24 追記：**

**続報を書きました。**
[[速報] [iOS] UIWebViewが使えなくなる最終期限が告知されました](https://qiita.com/y-some/items/060492caa8a74db8107a)
laradockでphpMyAdminへログインする時に手間取ったのでメモ

苦戦したのでメモ。

laradockでlaravelの開発環境を構築してた中で、Mysql、phpMyAdminを使おうと思ったのですが、phpMyAdminにログインできず。

環境変数も同じにしたし、Mysqlのバージョンも5.5でインストールしていて、事前につまずく箇所は潰していたのに、それでもログインできず途方にくれていました。

<h2>結論</h2>
自分のPCの、`~/.laradock/data/mysql`下のファイルを削除して、改めて`docker-compose up -d nginx mysql`をしたらログインできました。

どうやら、`~/.laradock/data/mysql`のファイルが壊れていた模様。

参考になったのはこの記事。

[LaradockでMySQLがどうしても立ち上がらない人あつまれー！](https://qiita.com/lara_bell/items/d4bd1340a5cc7dfcfcb4)


<h2>解決までの流れ</h2>

改めてMysqlを入れ直したり、`.env`の環境変数が同じになってるか何度も確認したり、それでもダメでひたすらググる。

それでふと、`docker-compose ps`をやって起動しているコンテナ一覧を確認した時に、「あれ？Mysql起動してなくね？」って事に気付く。

それまで、「laradock phpMyadmin」とかのワードでググっててたんですが、mysqlの方に問題あるんじゃね？って調べた結果、上記記事にたどり着く。

<h2>まとめ</h2>
いやー苦戦しました。多分一日半ぐらい。
冷静に一つ一つ確認してやっていけばすぐにわかったなー、と。

プログラミング歴２ヶ月ぐらいなんですが、また一つ勉強になりました。
Raspberry Pi 3B+でAndroidOSを起動させる時の注意点

#Raspberry Pi 3B+でAndroidOSを起動させる時の注意点
ラズパイでAndroidOSを起動する記事や情報が多く流れています。
どの記事を読んでも公開されているOSイメージをコピーして起動するだけというものでした。
そしてすんなりと起動できています。

これは私もRaspberry Pi 3B+を購入したのでAndroidOSが動作するか確認していた時のお話です。

#USBブートの罠
「Raspberry Pi 3B+はUSBブートが標準で対応」というメリットが今回非常に足をひっぱりました。
最初に購入したラズパイが3B+なので、OSの起動はUSBスロットからという固定観念をもっていました。

これが迷宮への誘いでした。。。

#試したAndroidOSの数々
・LineageOS
・emteria.OS
・Android Things
・その他野良のようなOS
これらのOSイメージをSDに焼いて、毎回USBブートしていましたが、、、
・そもそも画面に何も映らない
・レインボー画面から遷移しない
・何かしらファイルを探しているプロンプトだけが出る
という状況でした。

#困った時は
こんな状況でほぼ諦めかけていましたが、他の人に状況だけ雑談しているときにあるページを見つけました。
そこには、「オペレーティングシステムの読み込みおよびデータ保存用のMicro SDポート」なるものが3B+にあるとのこと。
声に出して誰かに伝えると自分で突然解決法が見つかる法則が発動しました。

#そもそも
Raspberry Pi 3B以前から利用している方からすれば当たり前のポートかもしれません。
私の運が悪かったのは「Raspberry Pi 3B+はUSBブートが標準で対応」＝USBブートのみ　という概念を持ってしまったからです。

#ということで、、、
Micro SDポートに素直にカードを挿して、LineageOSは無事に動作しました。あといくつかの野良OSも起動しました。
（Android Thingsはまだ未対応のようです）

#やりたい事
AndroidOSが無事に稼働したので、agora.io SDKを利用した映像配信システムを構築しようと検討中です。


[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=e16191c78eae7a2d7f8f)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=e16191c78eae7a2d7f8f)
SDKMANを使ったKotlinの開発環境の構築

Kotlinで開発する必要がでたので備忘録としてまとめました。

SDKMAN, Kotlin, Gradleのインストール等について記載してます。

## SDKMANとは
JVM系のrbenvみたいなものです。

rbenvのようなenv系と同様のメリット(複数バージョンのインストール、切り替え)を享受できます。

UNIX系のみで使えるようです。

## SDKMANのインストール
bashの部分はお使いのシェルに変更してください。

```
$ curl -s https://get.sdkman.io | bash
```

```
$ exec $SHELL -l
```

## Kotlinのインストール
```
$ sdk install kotlin
```

## 動作確認

ファイルを準備

```hello.kt
fun main(args: Array<String>) {
    println("Hello, World!")
}
```

コンパイル

```
$ kotlinc hello.kt -include-runtime -d hello.jar
```

実行

```
$ java -jar hello.jar
```

## Gradleのインストール
```
$ sdk install gradle
```

## Gradleを使ってプロジェクト作成
```
$ gradle init
```
色々聞かれるのでお好みで適宜選択。

## おまけ(自分がよく使いそうなコマンド)
### バージョン指定インストール
```
$ sdk install kotlin 1.2.71
```

### バージョン指定アンインストール
```
$ sdk uninstall kotlin 1.2.71
```

### 切り替え
```
$ sdk default kotlin 1.2.71
```

### 一覧表示
```
$ sdk list kotlin
```

## 参考
* [Kotlin tutorial](https://kotlinlang.org/docs/tutorials/command-line.html)
* [sdkman usage](https://sdkman.io/usage)