OmniAICreator/Qiita-1.07M huggingface dataset:
google検索が精度が「悪く」なっている事に関する考察

google検索様には日ごろより大変お世話になっております。m(_ _)m

あるユーザーがふっと思った些細なグチなので、
軽く聞き流してください。


#私が欲しい情報が出てこない

ここ１，２年からの話である。
google検索をしてみても、
私の欲しい情報がなかなか出てこなくなった。
・・・気がする。

##昔は、ホールインワンが多かった。

私の場合、
言語やロボット関係の仕様や使用例など技術情報を探す事が多く。
旧来のロボット検索時代からのクセで
単語をいくつもつなげて検索するパターンが多い。
**４ワードくらいは連ねて検索する**

ロボット検索時代だと、
この方法はかなりマッチしていて、
ホールインワンの検索結果も多かった。
代わりに（なのか？）
完全なＯＢな結果も出る事も多く、
検索をやり直すことは良くあることだった。

###ホールインワンかＯＢという時代だった。
（完全一致があるわけでもないので、ベタピンかＯＢ、といったほうがいいか）

##書き間違い訂正機能は便利だった。

ロボット検索時代で、
完全なＯＢやミスショット（結果０件）を出す理由の多くは
**綴り間違い**である。
綴りの記憶違いは良くあるし
打ち間違いもある。
google検索の「こちらではないですか？」は
なかなか気の利いたサービスだったと思う。

###Googlgeなかなかやるじゃん


##「書き間違いだと思うのでコッチで検索しました」だって？

・・・・まあ、良しとしよう。
こちらとしては手間が一つ減るわけだし。
書き間違えてなければ、そちらも選べるから
でも、
私の意思を無視してきてるんじゃないかな。。。

###便利だけど、私の意志がないがしろにされてる？


##いや、コッチってやったのに、結果が変わらん、だって

うん、**無視されてる**
私の「探したい」という意思よりも
「検索の世界」で優位なもの出そうとしている。
という感じ、

##言葉を増やせば、精度が下がる

うーん、正確ではない表現だ。
ＯＢではない。検索したいものに合ってはいる。
でも、**「ちょっとだけ合っている」**という感じ

それも、
検索ワードを増やせば増やすほど、
「合っている」部分が減っているような感じ。。。
技術情報とかを探す私にとっては、とてもむずかゆい

###すごく使いにくい。。


##増やした言葉を勝手に外す

ここ最近特に増えた（目に付く？）のは
**「キーワードを一つ外して検索しました、これはどうですか？」**
ってのを結果一覧に挟んでくる
いやいや、**必要だから入れているんだ**
しかも、外すワードは決まって**重要ワード**だったりする
そのワードの情報が多分少ないのだろう。
**だからつけているのだが**

##「完全一致」オプション、動いてるの？

最近はこのオプションを使うことが多くなった。
それでも、**「ワードを外して」**いる結果が出てくる
(そういう気がする。未検証）

#ここからが、考察です。

私が考える
**Google検索の精度が悪くなった理由**
になります。

#0.8×0.8×0.8×0.8=0.4096

####今のgoogle検索の流れは

１．あるワードを普通に検索（ロボット検索）するパターンを精度＝**「1.0」**と表現します。
２．AI検索はあるワードに対して類語や同意語をあわせている（と思われる）ので精度が下がって＊**「0.9」**
　（別の意味が含まれてしまうから）
３．さらに、「ＡＩ分析から（ごにょごにょ）」で類語領域が増え、さらに精度が下がり**「0.8」**
　（さらに別の意味や反対語も含まれてくる？？）
４．複数のワードをつけて検索すると、それぞれに１～３がかかってくる。
５．検索結果は１～４の結果に**「検索の世界の優先度」**で表示順を作る
　　（元ワードのマッチング度は無視されてる？）

と思っています。
「４ワードで検索した**検索精度は0.4096**」
という結果に！

つまり**半分も合っていない検索結果**が出ている
のではないでしょうか？
検索結果が間違ってはいない、間違ってはいないけど


###半端なグリーンオンより、「ベタピンかＯＢ」がいい

人それぞれなんでしょうが
今の、
**精度低くても検索結果が出る**のもいいのでしょうか

私と同じように思う
**中途半端に合った検索結果**は使い勝手が悪い
いっそのこと
**ベタピンかＯＢか、な検索結果**を提供いただけたら・・・
（ＯＢなら即座に検索をやり直せる）
そんな検索手段がないものか・・・




**ただのグチです。**
ここまでお付き合いいただいた方、ありがとうございました。
Splunk Add-on for Amazon Web Servicesを用いたS3からのデータ取得について

## 1. 目的

Splunk Add-on for Amazon Web Servicesは、Splunk社が作成した公式のAWSアドオンツールで、以下の操作を実行することができます。AWS上の操作ログを取得することが主なユースケースですが、S3上のデータをインプットすることもできます。

* Configuration snapshots, configuration changes, and historical configuration data from the AWS Config service.
* Metadata for your AWS EC2 instances, reserved instances, and EBS snapshots.
* Compliance details, compliance summary, and evaluation status of your AWS Config Rules.
* Assessment Runs and Findings data from the Amazon Inspector service.
* Management and change events from the AWS CloudTrail service.
* VPC flow logs and other logs from the CloudWatch Logs service.
* Performance and billing metrics from the AWS CloudWatch service.
* Billing reports that you have configured in AWS.
* S3, CloudFront, and ELB access logs.
* Generic data from your S3 buckets.
* Generic data from your Kinesis streams.
* Generic data from SQS.


## 2. 初期設定

Splunk管理画面で「他のAppをサーチ」を押下して、Splunk Add-on for Amazon Web Servicesを選択してインストールします（以下はインストール済の画面となります）。

<img width="1671" alt="スクリーンショット 2020-03-08 12.48.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/107404b4-d96f-fedc-2e36-118d983f0a12.png">

Splunk Add-on for Amazon Web Servicesを起動して、「Configuration」のタブへ移動し、「追加」を押下します。


<img width="1675" alt="スクリーンショット 2020-03-08 12.51.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/cd48c113-7223-9a2b-2d65-49febfadc5f4.png">

S3操作用のIAMユーザーの情報を入力し初期設定が完了です。

<img width="798" alt="スクリーンショット 2020-03-08 12.52.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/c3a18ab2-212a-e6ea-7be4-708b015b2d9b.png">


## 3. S3からのデータ取得方法

「Input」のタブへ移動し、「Create New Input」を押下し、プルダウン一覧から「Generic Data Type -> Generic S3」を押下します。

<img width="1671" alt="スクリーンショット 2020-03-08 12.56.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/ec026272-bef6-1ade-0692-61a341ab9657.png">

初期設定時に登録したAWSアカウントと対象のS3バケット、データ取得に関わる情報を入力したら設定が完了です。
この画面で設定した要領でS3からのデータをSPlunkのIndexerに取り込みます。

<img width="893" alt="スクリーンショット 2020-03-08 12.58.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/8d2d0509-57f4-48a1-57c5-1c2dc37a0085.png">

以上
MAMPでApacheサーバが起動しない時

### 何故か今まで普通に起動していたmampでApacheサーバーだけ起動しなくなった

<img width="531" alt="スクリーンショット 2020-03-07 19.13.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572340/b0f6e366-04ce-a290-31ca-2a6932bd9e14.png">

Start Serversのボタンを押すとMySQL Serverは起動するがApache　Serverだけ起動しなくなってしまった。

<img width="414" alt="スクリーンショット 2020-03-08 12.55.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572340/ee3ac45a-24ab-71a7-6cdd-b4c92ccad3fb.png">

アプリケーションフォルダーのMAMPを確認してみると、htdocsのフォルダーだけ何故か別の場所に移動していました。

そのhtdocsのフォルダーをMANPフォルダーに戻したら正常に起動するようになりました。
AWSで秘密鍵を変更した場合のターミナル「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」への対処法


AWSのEC2サーバに、SSHでログインする際、キーペア(秘密鍵)を変更していると、以下のようなエラーが発生します。

```terminal
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
(以下略)
```

#原因
SSHがもつセキュリティ機能として、前回保存しておいた秘密鍵と異なる秘密鍵でログインしようとすると上記のような確認メッセージを出すようになっています。
意図的に変更したのであれば秘密鍵が変わっていることは全く問題ないので、以下の対処をしてログインします。

#対処1
/.ssh/known_hosts
に記載されている内容を、エディタ上で削除する。

※　known_hosts：前回保存した秘密鍵の情報

#対処2

(対処１が面倒な方)
以下コマンドから前回の秘密鍵情報を削除する。

```
ssh-keygen -R example.com
```

#結果

再度ログインすると、いつものコレが表示されるはずです。

```
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|
```


以上です。最後まで読んでいただきありがとうございました！
【学习笔记】AWS（EDX）

# EDX AWS Developer: Building on AWS
## 课程链接
https://courses.edx.org/courses/course-v1:AWS+OTP-AWSD1+2T2019/course/#block-v1:AWS+OTP-AWSD1+2T2019+type@chapter+block@963403ee969147e08a223b4eab82d531

## 快乐使用EDX的Player
[script](https://greasyfork.org/en/scripts/396560-edx-shortcuts-and-extra-speeds) + [TamperMonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo/related)

## Week 1
### Getting Started on AWS 
学习资料的Python的link已经不能使用，直接改成Hello， World

```
#!/bin/bash -ex
sudo yum update -y
sudo pip install flask
sudo pip install requests
mkdir PythonWebApp
cd PythonWebApp
sudo cat >> flaskApp.py << EOF
from flask import Flask
import requests
app = Flask(__name__)
@app.route("/")
def main():
  text = "Hello World" 
  return text


if __name__ == "__main__":
  app.run(host='0.0.0.0', port=80)
EOF
sudo python flaskApp.py
```

### Cloud Infrastructure and Responsibility 

一些缩略语
- VPC: Visual Private Cloud
- AZ: Availability Zone

理清楚Region和AZ的关系和scope

<img width="1536" alt="スクリーンショット 2020-03-08 午後0.38.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260826/0ac30b44-0fca-262b-dc36-691f9124f1fc.png">
<img width="1535" alt="スクリーンショット 2020-03-08 午後0.38.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260826/92b3f3e2-164e-5f01-4622-0d055e203c33.png">


## Week 2
关于这次上传图片APP的架构
其中，Rekognition是亚马逊提供的一个图像识别工具
![Arch+Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260826/ceef1af1-0328-9a90-0986-65f99fea518d.jpeg)

## Week 3
和材料有点不同，现在AWS已经把RDS的SecurityGroup整合了，
这里直接新建了一个给RDS,inbound允许tcp的3306

python运行时候还需要在环境变量里面设置s3,flask(handson没说)

```
In the Name column, type PHOTOS_BUCKET
In the Value column, type the name of the Amazon S3 bucket you created earlier.
Note: Make sure to delete any white space that was inserted while copy/pasting.
In the Name column, type FLASK_SECRET
The Flask app uses a secret value to encrypt session variables.
In the Value column, type random characters and numbers.
```

## Week 3~6
没遇上什么太大的问题，基本上照着做就行了（也从侧面反映出底层逻辑已经多年不改了）

# AWS Developer: Deploying on AWS
## Week 2
CodeBuild的部分有很多不一样的地方，最主要的是
- 需要增加AmazonElasticFileSystem的权限，嫌麻烦直接FullAccess
- Docker Image太老了，用了aws/codebuild/standard:3.0，然后改了[这里](https://courses.edx.org/courses/course-v1:AWS+OTP-AWSD2+2T2019/courseware/50a332b16d2f4d2c96d0bd7da5c7a74a/2b85aae6f8b3429bb40177b7d63ebd70/?activate_block_id=block-v1%3AAWS%2BOTP-AWSD2%2B2T2019%2Btype%40sequential%2Bblock%402b85aae6f8b3429bb40177b7d63ebd70)
Django  TemplateDoesNotExist at /が出た！（単純なのに半日ハマった！）


#　■環境

　windows10
　Pycharm　Community　2019.3
　Python3.7
　Django　3.03

#■前提条件
　Djangoプロジェクト、アプリケーション作成していることを前提。以下参照
　ターミナルでDjangoアプリケーション作成まで


#■事象

index.htmlを読みに行ったら、「TemplateDoesNotExist at /」が
出て、index.htmlが出てこない！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547159/a316b06f-a0c6-5fcf-864f-a3f2853f38b1.png)


#■試したけど、駄目だったこと

いろいろ調べて、以下やってみたけど、変わらず・・

① setting.py　の　TEMPLATES =　内を以下のように修正

　'DIRS': [],
　　↓
　'DIRS': [BASE_DIR, "templates"],


② setting.py　の　TEMPLATES =　内を以下のように修正

　'DIRS': [],
　　↓
  'DIRS': [os.path.join('app_private_diary','templates')],


#■原因

そもそも、このエラー、ファイルが存在しないか？ファイルが読み込めないエラー。

さっきのエラーを見てみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547159/33edb908-6f39-d22b-5e0d-c2d4bff4871b.png)


index.html　を読みたいのに、index\html　と表示されていることがわかる。

view.pyを見ると、index\html　になっていることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547159/03101b25-f3e1-3f19-6f38-54753312ff4b.png)


index/html　→　index.html

に変更したら、エラー解消しました。

基本的なやつでした（泣）。


以上
Cypressでスマホモードでテストするには、config.jsonのuserAgentを変更する

# 環境

- macOS Mojave バージョン 10.14.6

# 前提条件

- Cypressは導入完了している

# 対象者

- CypressでPCではなく、スマホで検証したい
    - https://www.cypress.io/

# 手順

## UserAgentを設定する

<img width="1280" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588419/9103b3b9-1493-a803-df03-7fce3237184e.png">


- 1. `config.json` に以下のコードを追加する

```js
{
  "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1"
}

```

## 画面サイズをスマホにする

- 1. テストコードの前に、以下のコードを追加する

```js
cy.viewport("iphone-6")
```

### 例

```js
describe("view", () => {

  it("show ticket", () => {

    cy.viewport("iphone-6") // iphone6の大きさになる

    cy.visit("https://xxxx")
  })
```

### 参考

- https://docs.cypress.io/api/commands/viewport.html#Arguments


### Intent to Deprecate and Freeze: The User-Agent string

- Google Chrome 81（2020年3月中旬）：“navigator.userAgent”によるUA文字列の取得を非推奨とする
- Google Chrome 83（2020年6月初め）：UA文字列のうち、ブラウザーのバージョンを凍結し、OSのバージョンを統一する
- Google Chrome 85（2020年9月上旬）：UA文字列を統一
<img width="631" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588419/708e4318-595d-37ef-32f6-867c308ff002.png">

- https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/-2JIRNMWJ7s/yHe4tQNLCgAJ
DVWAでCSP-Bypass

## 前提
- kali linux環境がある
- DVWAのセットアップ済み（https://qiita.com/KPenguin/items/7e4f1c428c3dadf8591c ）

## 目標
- CSP設定のある状態でもXXSを可能にする

## 手順概要
- 挙動確認
- CSP回避

## 内容
### CSPとは
- Content-Security-Policyの略
- script-src,img,font等の参照可能ドメインを制限できる

### 前準備
- DVWAにログインする
    - 以下コードをkali上で実行しDVWAを立ち上げる。
    - http://localhost/DVWA-master/index.php
    - admin/passwordでログイン
- セキュリティレベルを下げる。
    - メニュー下にあるDVWA securityへアクセス
    - デフォルトがimpossibleなので、このままではハッキングできない。なのでlowに変更する

```shell:
# ファイルへのアクセス許可する
root@kali:~# service apache2 start
# DB_createできるようにする
root@kali:~# service mysql start 

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/bb95d520-1602-b7b8-afa3-85da3ffb651e.png)

- insecure CAPTCHAにアクセスする（左メニューにある）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/b970f28f-63f0-9b08-6dcb-bcbb800f5737.png)

### CSPを攻略する

- 挙動を確認する
    - 外部ソースのスクリプトを埋め込めるとのことなので、入れてみる。
        - 例："https://yubinbango.github.io/yubinbango/yubinbango.js"
    - consoleを見ると、CSPによって弾かれていることが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/48cb9b64-8f3b-9b47-1c24-4da490ff4d0e.png)

    - postの結果からCSPの設定をみると、script-srcが設定されていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/1f155289-988b-22c6-dbbb-582744f93657.png)

- 挙動からの考察
    - CSPによって、参照可能srcドメインが制限されている。
    - 許可されたドメインの中に「https://pastebin.com 」がなぜか入っている。これは、作成したhtmlを呼び出し先に埋め込むサイトであり、ここからscriptを差し込める余地がある。
    - DVWAで予め用意されているデータを拝借し実行する。「https://pastebin.com/raw/R570EE00 」
    - 以下画像のようにalert()が実行されたことが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/845c0265-473c-6ed3-8dde-6bda182f31c5.png)

- 最後に
    - XXS対策でCSPを設定していても、その設定が不適切だと、今回のように突破される。
 
おわり
PCとスマホで画像を切り替えて表示したい場合

PCとスマホで画像を切り替えて表示したい場合の処理について備忘のために記録。


```html:index.html　
<img class="pc" src="../img/hoge.png" alt="PC用の画像">
<img class="sp" src="../img/fuga.png" alt="スマホ用の画像">
```

```css:style.css

.pc { display: block !important; }
.sp { display: none !important; }

@media only screen and (max-width: 500px) {
.pc { display: none !important; }
.sp { display: block !important; }
}
```

HTMLにはPC用、スマホ用両方とも記載する。

CSSで調整を行う。

PCで見た際には、class名がpcのimgのみが表示され、
スマホで見た際には、、class名がspのimgのみが表示される

ようにすることで、切り替えて表示することができる。






参考:
[【レスポンシブ】PCとスマホで違う画像に切り替える方法！CSSだけで簡単画像切り替え！](https://fastcoding.jp/blog/all/frontend/responsive_img/)
vue-cli3 + TypeScript + Electronでアプリを開発する

# はじめに
Vue.jsとTypeScriptとElectronでデスクトップアプリケーションを開発するときに必要な手順を忘備録として書いていきます。

## vue-cli3のインストール
プロジェクトの作成前に、`@vue/cli`をグローバルインストールします。

```console
$ npm install -g @vue/cli
```

2.x系を使用している方はいったんアンインストールしてからインストールしてください。

```console
$ npm uninstall -g vue-cli
$ npm install -g @vue/cli
```

## vue createでアプリのひな型を作成
```console
$ vue create my-app
```

カレントディレクトリに`my-app`という名前のディレクトリが作成されます。
`my-app`の部分はお好きな名前に変更してください。
以降はここで作成したディレクトリの中で作業を行います。

上記のコマンドを実行すると、いくつか質問をされます。
今回はTypeScriptを利用したいので、`Manually select features`を選択し、下記のように設定しました。

```console
? Check the features needed for your project:
> Babel
> TypeScript
> Router
> Vuex
> CSS Pre-processors
> Linter / Formatter

? Use class-style component syntax?
> Yes

? Using Babel alongside Typescript?
> Yes

? Use history mode for router?
> No

? Pick a CSS pre-processor:
> Sass/SCSS (with node-sass)

? Pick a linter / formatter config:
> ESLint with error prevention only

? Pick additional lint features:
> Lint on save

? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.?
> In dedicated config files

? Save this as a preset for future projects?
> No
```

後のセクションElectronをインストールする際に利用する[Vue CLI Plugin Electron Builder](https://nklayman.github.io/vue-cli-plugin-electron-builder/)はVueRouterが`history`だとうまく動かないので、`hash`モードにしています。
`history`にしてしまったときは、`src/router.ts`を以下のように編集します。

```javascript
// src/router.ts
...
export default new Router({
-  mode: 'history',
+  mode: process.env.IS_ELECTRON ? 'hash' : 'history',
  ...
})
...
```

ブラウザで`http://localhost:8080/`にアクセスし、正常に起動しているか確認します。

![2020-03-07 22.37.25 localhost 8b6f50b5c00a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534443/73953a6a-a8f5-97f8-6c7f-ff7d2599cc94.png)

## Electronをインストールする
```console
$ vue add electron-builder
```
上記のコマンドを実行すると、Electron(と依存パッケージ)がインストールされ、一部ファイルが追加、更新されます。
重要なのは下記のファイルです。

### package.json

```javascript
...
"scripts": {
+   "electron:build": "vue-cli-service electron:build",
+   "electron:serve": "vue-cli-service electron:serve",
},
+  "main": "background.js",
...
```

`electron:build`と`electron:serve`というスクリプトが追加されています。
これにより開発サーバを起動したり、アプリケーションビルドができます。

#### 開発サーバの立ち上げ
```console
$ npm run electron:serve
```

### アプリケーションビルド
```console
$ npm run electron:build
```

<img width="912" alt="Screen Shot 2020-03-07 at 23.21.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534443/cb097d4f-91af-4639-b232-59bc9ea0e6e2.png">

# まとめ
今回はVue.js + TypeScript + Electronでアプリケーションを起動するところまでを説明しました。
次回からはTypeScriptでのVueコンポーネントの書き方やVueRouter、Vuex、axiosとの組み合わせ方などを紹介しようと思います。
IntelliJ IDEA の設定 

こんにちは。Mr_El_Capitanです。
今回初めて書くのでなかなか見やすくはできてないと思いますがよければ参考にしていってください。
私はいつもIntelliJ IDEAを使ってMinecraftのプラグインを作っています。
今回はそんな私が使っているIntelliJ IDEAについてとMinecraftプラグインでまず最初に作るべきものを紹介していきます。

##その１ IntelliJ IDEAのインストール
まず https://www.jetbrains.com/ja-jp/idea/download/#section=windows にアクセスして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/7ef4f712-49e9-2aed-5bec-7a99db65b161.png)
この画面に移ります。
**ここで注意！**
よくある人は左の水色のUltimateをインストールして「なんだこれお金がいるのかよ」って思われがちですが実は右のコミュニティが私も使っている無料版です。
それを押して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/537e39aa-f0f1-5466-12ed-fa8f2b07d23c.png)
まもなくダウンロードが始まります。
ダウンロードが終わればそれをデスクトップへ移動させておくといいでしょう。

##ダウンロードが終わるまでJavaのインストール
さて、なんといってもこれがなけりゃ始まらない！
それはJDKです。
JDKの入れ方は正直私も直感でやって何となくできた感じなのでとある方のサイトを引用してきたのでそちらのリンクを踏んでください。
https://qiita.com/shibafu/items/8762636f66d7fef49d59


##その２ InetlliJ IDEAの設定
さあ、本番はここからです！
まぁここからは簡単ではあるものの、間違えると環境を作り直しとなるので注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/aff5ecca-d688-c17f-372a-6b6e86813d27.png)
このようなアイコンがデスクトップにあるはずです。
ない方はインストールしたものをデスクトップに入れておくことを推奨します。
それをまず開いてください。
ここからは説明というより手順です。もれなくこの通りにやってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/9f5e9a4d-b72b-35c0-9170-6ddae0724ef2.png)
「はい」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/466431f8-e6df-f0da-3004-587e7159cc9f.png)
「Next」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/30edec9c-b83e-1e46-e718-a401b7c4162c.png)
同じような画面ではない方もいると思いますがここは全員何もせずに「Next」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/7efd6af0-1350-b4af-435f-3b913c3a6e04.png)
ここをいじるとまたややこしくなるかもしれません。
わかる方は構いませんがわからない方は何もせずに「Next」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/f9f1c424-c878-dcd3-a7bd-d56d98fec4bf.png)
自分と違うところをこの写真をもとに同じ設定にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/0a44df43-dd84-d131-0fbb-784275835a4e.png)
**ただし！64-bit launcherは自分のOSに合わせてください。** **32-bitの場合はチェックを外しましょう。**
設定が終わったら「Next」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/2b75db64-a936-3bb9-b22f-afd82742273e.png)
何もせずに「Install」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/37fc4ba8-60fb-26d5-a8fd-744f5ca2366b.png)
お？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/a01507cb-b894-e612-e5cd-b2e99ca03802.png)
ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!
はい。そしてここからまだつづくよ、、、
右下のConfigureを押してPlugins
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/fc2db8d1-192f-5c16-289e-4411bfe33784.png)
検索欄でMinecraftって調べて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545700/da47b98e-163f-1455-4d16-ea7469a364b4.png)
こいつをインストール。RestartIDEを押します。
はい。まずはこれで完成です。

##次回HelloWorld
ここからはプラグインだよ～
この記事を見てね
https://qiita.com/M-E-C/items/5e9f632e589c62dd6dec
selfjoin

[selfjoin@Splunk>docs](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Selfjoin)
#説明
指定した1つ以上のフィールドに基づいて、検索結果行を同じ結果セット内の他の検索結果行と結合します。
#記述方法
```perl:
selfjoin [<selfjoin-options>...] <field-list>
```
#引数
##\<field-list>
結合したいフィールド
#オプション引数
##overwrite=\<bool>とmax=\<int>
[join](https://qiita.com/toshikawa/items/5280e236a403fe116a61#overwrite)参照
##keepsingle=\<bool>
```perl:base.spl
| makeresults 
| eval _raw="id	name	owner_id
1	aka	1
2	ao	2
3	shiro	1
4	kuro	4" 
| multikv forceheader=1 
| table id name owner_id 
| append
    [|makeresults
    | eval _raw="id	name
1	ichiro
2	jiro
3	saburo" 
    | multikv forceheader=1 
    | table id name]
```

| id | name | owner_id |
|--:|:--|--:|
| 1 | aka | 1 |
| 2 | ao | 2 |
| 3 | shiro | 1 |
| 4 | kuro | 4 |
| 1 | ichiro |   |
| 2 | jiro |   |
| 3 | saburo |   |
####keepsingle=true
```peal:keepsingle_t.spl
....
| selfjoin keepsingle=t id
```
| id | name | owner_id |
|--:|:--|--:|
| 1 | aka | 1 |
| 2 | ao | 2 |
| 3 | shiro | 1 |
| 4 | kuro | 4 |
####keepsingle=false
```peal:keepsingle_f.spl
....
| selfjoin keepsingle=f id
```

| id | name | owner_id |
|--:|:--|--:|
| 1 | aka | 1 |
| 2 | ao | 2 |
| 3 | shiro | 1 |
デフォルトは_false_
##使用方法
１時間ごとの集計の間に各５分間の数値をあいだに入れた表。

```perl:selfjoin.spl
index=_internal sourcetype=splunkd
| bin span=10m _time
| eval timeA= _time
| bin span=1h _time
| eval timeB= _time
| multireport [ chart count as count5m by source timeA]
[ chart count as count1h by source timeB]
| foreach 15* [ eval time_<<FIELD>>=strftime("<<FIELD>>","%T")
| eval {time_<<FIELD>>} = '<<FIELD>>'
| fields - <<FIELD>> time_<<FIELD>>]
| selfjoin source
```
`append`とか`appedpipe`でつくった行をさっとくっつけるのに使用する`selfjoin`
２行しかくっつけられないのでそれだけ注意すると、こんなこともできます。
`multireport`はSplunk>docsに載っていないけど、動作としてはこんな感じで二つの集計を走らせることができます。
#まとめ
表を軽く、くっつけることができる`selfjoin`
`appendpipe`や`append`で２つの行をつくった時、くっつけるならこのコマンドを思い出してやってください。
Macに入れるものをコードで管理（HomeBrew）

## GitHub

[https://github.com/sunakan/sunady2020-homebrew-as-code](https://github.com/sunakan/sunady2020-homebrew-as-code)

## 以下をコードで管理したい

* HomeBrewで入れるパッケージ群
* Macに入れるGUIアプリ

## どんな時に使える？

* Macを買い替えた時
* Macをクリーンインストールした時
* MacのアプリをポチポチDLして入れたくない時

## フローチャート

![](https://raw.githubusercontent.com/sunakan/sunady2020-homebrew-as-code/master/docs/diagrams/flowchart.png)

## Brewfileにない、brewで管理しているパッケージを削除

```
# 確認するだけ
$ brew bundle cleanup
```

```
# 実行!!
$ brew bundle cleanup --force
```

## 参考

* [https://github.com/Homebrew/homebrew-bundle](https://github.com/Homebrew/homebrew-bundle)

* [【Macの環境構築】homebrewとBrewfileでアプリを一括インストールする](https://gurutaka-log.com/mac-environment-brewfile)

* [brew bundleでMacのアプリをまとめてインストール・管理](https://qiita.com/vochicong/items/f20afc89a6847cd58f0f)
bundle installの度に"BUNDLE_WITHOUT"が追加されて開発環境だけで使用したいgemがインストールできない

本番環境でのgemのインストールで少しハマったので備忘録として記録


これまでローカル環境でgemのインストールをする際に、`development`環境や`test`環境のgemのインストールがなぜかうまくいかないという問題が発生していました。
本番環境では開発環境で使用するrubocopなどのgemってそもそもインストールする必要がないよなと思い、ローカル環境から一度立ち戻って確認してみることに。

## ハマった点
#### 1. 下記のようにGemfile内に記載されているgroup `development`や`test`内のgemのインストールがうまくいかない。

```rb

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-byebug'
  gem 'pry-stack_explorer'
  gem 'pry-alias'
  gem 'rb-readline'
  # コーディング規約
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
end

group :test do
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  gem 'webdrivers'
end
```

#### 2. project内の`.bundle/config`内の下記記述が削除しても、`bundle install`の度に追加されてしまう。

```sh
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_WITHOUT: "development:test"
```

## 原因調査

`bundle config`を実行することで、bundleの設定を確認することができます。
bundlerでは一度実行したオプションは保存されて、2度目以降の実行では自動でオプションを付加した状態で実行されているようです。

```sh
mbp13:sample_app user$ bundle config
Settings are listed in order of priority. The top value will be used.
path
Set for your local app (/Users/user/development/ams_app/.bundle/config): "vendor/bundle"
Set for the current user (/Users/user/.bundle/config): "vendor/bundle"

without
Set for your local app (/Users/user/dev/sample_app/.bundle/config): [:development, :test]
Set for the current user (/Users/user/.bundle/config): [:development, :test]
```

どうやらアプリ固有のbundle設定でも、ユーザ単位のbundle設定でも`bundle install`実行時に`development`環境や`test`環境のどちらのgemもインストールしない設定となっているようですね。

## 解決方法
下記の2つのファイルから`BUNDLE_WITHOUT: "development:test"`の削除を行う。
`/Users/user/dev/sample_app/.bundle/config`
`/Users/user/.bundle/config`

※もちろん、PATHに含まれる`user`,`sample_app`で表される「ユーザ名」、「アプリ名」についてはそれぞれの環境のものであると思います。

削除が完了したら、再度`bundle config`コマンドを実行して先ほどのbundleオプションの記述が消えていることを確認してください。

```sh
mbp13:sample_app user$ bundle config
Settings are listed in order of priority. The top value will be used.
path
Set for your local app (/Users/user/dev/sample_app/.bundle/config): "vendor/bundle"
Set for the current user (/Users/user/.bundle/config): "vendor/bundle"
```

ここまできたらこれまで同様に`bundle install`をしていただければ開発環境で使用したいgemがインストールできるかと思います。
`bundle install`実行後もこれまでとは異なり、`BUNDLE_WITHOUT: "development:test"`がconfingファイルに追加されることはありません。(`bundle config`で確認できます。)
本来アプリ単位でgemの管理を行うための`bundler`ですが、より優先度の高いユーザの`bundle config`で常に`development`と`test`のgemはインストールしないという設定がされてしまっていたということですかね。

## 最後に
勉強し始めで色々なチュートリアルなどをする中で、コマンド実行してしまったんですかね。
初学者あるあるかと思いますが、コマンドを打つ前にコマンドの意味をちゃんと調べるのは大切ですね。最初に見つけたドキュメントに飛びついてとりあえずコマンドを打つのも後々苦しむことになったりすることもまた一つ勉強になりました。

本番環境ではBUNDLE_WITHOUTの設定を用いて、開発で使用していたgemをインストールしない設定にしておくのが本来の使い方何ですかね。

ご指摘などありましたらコメントよりよろしくお願いします。
E資格ざっくり受験体験記

#概要
JDLA Deep Learning for ENGINEER 2020 #1 を受け、無事合格し、E資格を取得したのでその受験にあたっての対策方法、感想をまとめました。これからE資格を受験する方、E資格がどのようなものか、ざっくり知りたい方向けです。

#自分のバックグラウンド
普段はWebアプリエンジニアでJavaで開発を行っています。Pythonについては実務経験はないがけどnumpyやmatplotlibなど基本的なライブラリはある程度使えるレベル。数学については、線形代数や微分の基礎は大学で勉強して、大体理解していました。

#主に使った教材
 ①zero to one (JDLA認定 プログラム)
 ②ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装
 ③ゼロから作るDeep Learning ② ―自然言語処理編
 ④Qiita の記事

基本的に①をしっかり抑えれば合格できると思います。②、③は理解を深めるため、よくわからない部分を調べるための補助教材として使いました。機械学習、ディープラーニングの理論についてわかりやすく解説したネットの記事は多くあるので随時調べて、隙間時間に曖昧な部分の理解を深めたりしました。

#対策期間
4ヶ月程度 (11月初旬~2月下旬)
・ただ本業が忙しく、週末の学習がメイン。

#試験問題について
　コードの穴埋めや学習アルゴリズムの数式など、幅広く出ます。認定プログラムで理論を一通り、学習していれば、ちゃんと問題文を読めば解ける問題が多いです。認定プログラムの模擬試験、資料をしっかり読み込んで、わからないところは随時本やネットで調べることで、十分合格点に達する実力を付けられると感じました。
　また、問題数が多いので、解くのに時間のかかるコードの穴埋めの問題は後回しにした方が無難かと思います。

#結果
合格。得点は以下のような感じでした。

|応用数学|機械学習|深層学習|
|---|---|---|
|約90%|約90%|約65%|

ディープラーニングは出題範囲も多く、やや難しかったです。受験者の合格率は60-70%程度と高めであることからも、認定プログラムを受講しきれば、合格の敷居はそこまで高くないはずです。

#まとめ
　試験に合格するだけなら、実装力はそこまでなくても正直いけるかなと思います。ただ、当然資格を取得することより、理論の理解、実装力を付けることを目指して、受験する方が多いと思います。そっちに焦点を当てて勉強した方が、有意義だと思います。

　自分自身資格を取得して、実装力についてはまだ「実務でモデルをスラスラ構築できます!」と言えるレベルではないと思っています。結局 Kaggle や仕事などで、実践的な経験を積むことが AI エンジニア、データサイエンティストになるには必要だと思います。ただ、機械学習、ディープラーニングの理論、実装方法を体系的に理解するには良かったです。
ArgumentParserで日付型（datetime）を受け取る【python】

# はじめに

pythonのオプション引数で、datetime.date型の値を受け取る方法の忘備録です。

## やりたいこと
- オプション引数で日付を表す文字列（例：`2020-01-01`）を受け取り、datetime.date型に変換する。
- 不正な形式の文字列が渡された場合に、オリジナルのエラーメッセージを出す。

# ArgumentParserでdatetimeの型指定をする

Argparseの基本的な使い方については [公式チュートリアル](https://docs.python.org/ja/3/howto/argparse.html) が参考になりました。
チュートリアルではint型の型指定をしていますが、今回指定したいのはdatetime.date型です。

日付を表す文字列（例：`2020-01-01`）をdateオブジェクトに変換する関数`date_type`を定義し、ArgumentParserのtypeに指定します。

```python:test.py
import argparse
import datetime

# str -> date 型変換関数
def date_type(date_str):
    return datetime.date.fromisoformat(date_str)

if __name__ == '__main__':
    # ArgumentParserの取得
    arg_parser = argparse.ArgumentParser()
    # 日付指定オプションの定義
    arg_parser.add_argument("-d", "--date",
                            help="Date must be in ISO format. For example: 2020-01-01.",
                            type=date_type)
    # オプション引数の取得
    args = arg_parser.parse_args()
    date = args.date

    print(date.year,date.month,date.day)
```

実行結果

```
>python test.py -d 2020-01-01
2020 1 1
```

## エラーメッセージをカスタムする

上記のコードでは、オプション引数がISOフォーマットの日付以外の形式だった場合、以下のエラーが出力されます。

```
>python test.py -d hoge
usage: mtg.py [-h] [-d DATE]
mtg.py: error: argument -d/--date: invalid date_type value: 'hoge'
```

定義した関数名 date_type がエラーメッセージに入ってしまうのが気にくわないので、エラー内容をカスタムします。

先ほどの型変換関数`date_type`を下記のように修正します。

```python
def date_type(date_str):
    try:
        return datetime.date.fromisoformat(date_str)
    except ValueError as e:
        raise argparse.ArgumentTypeError(str(e) + " Date must be in ISO format. ex. 2020-01-01")
```
try-except で新しい例外を発生させています。

<details><summary>処理する例外の型（ValueError）は実際に発生させて確認しました。</summary><div>

```python
>>> import datetime
>>> datetime.date.fromisoformat('hoge')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid isoformat string: 'hoge'
```

</div></details>

実行結果

```
>python test.py -d hoge
usage: test.py [-h] [-d DATE]
test.py: error: argument -d/--date: Invalid isoformat string: 'hoge' Date must be in ISO format. ex. 2020-01-01
```

# おわりに

最初に`python argparser datetime`でググりましたが、重箱の隅すぎるのか日本語文献が出てこなかったので、記事にしてみました。

## 参考文献

Argparserの公式チュートリアル：[Argparse チュートリアル — Python 3.8.2 ドキュメント](https://docs.python.org/ja/3/howto/argparse.html)

@kzkadc さんの記事も参考にさせていただきました :bow:
[ArgumentParserの使い方を簡単にまとめた - Qiita](https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0#%E5%9E%8B%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84)

公式ドキュメント
[argparse \-\-\- コマンドラインオプション、引数、サブコマンドのパーサー — Python 3\.8\.2 ドキュメント](https://docs.python.org/ja/3/library/argparse.html#type)
rails new時のMySQLのエラーについて

（2020/03/08 執筆中）

## きっかけ
`rails new --api -d mysql`実行時に以下のエラーが出たので、自分なりにまとめておきます。

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
MySQL server PID file could not be found!

## バージョン

```console
$ rails -v
Rails 6.0.2.1

$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) 

$ mysql -v
mysql  Ver 8.0.19 for osx10.14 on x86_64 (Homebrew)
```


## Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

これは、/tmp/mysql.sockがないというメッセージ。
いろいろ試してみてわかったのは、`MySQLが起動していないと/tmp/mysql.sockはつくられない`ということ。
なので、Mac立上げ時に自動起動を設定していない人には辛いエラーかもしれません。

```
# /tmp/フォルダ内部を確認
$ ll /tmp/
# mysql.sockがない
drwx------  3 user_name  wheel    96B  3  3 10:03 com.apple.launchd.xxxxxxx
drwx------  3 user_name  wheel    96B  3  3 10:03 com.apple.launchd.xxxxxxx
drwxr-xr-x@ 3 user_name  wheel    96B  3  8 08:43 com.google.Keystone

# MySQLが起動しているか確認
$ mysql.server status
 ERROR! MySQL is not running

# MySQLを起動
$ mysql.server start
Starting MySQL
. SUCCESS! 

# もう一度/tmp/フォルダ内部を確認
$ ll /tmp/
# mysql.sockが存在する
total 16
drwx------  3 user_name  wheel    96B  3  3 10:03 com.apple.launchd.xxxxxx
drwx------  3 user_name  wheel    96B  3  3 10:03 com.apple.launchd.xxxxxx
drwxr-xr-x@ 3 user_name  wheel    96B  3  8 08:43 com.google.Keystone
srwxrwxrwx  1 user_name  wheel     0B  3  8 12:03 mysql.sock
-rw-------  1 user_name  wheel     6B  3  8 12:03 mysql.sock.lock
srwxrwxrwx  1 user_name  wheel     0B  3  8 12:03 mysqlx.sock
-rw-------  1 user_name  wheel     7B  3  8 12:03 mysqlx.sock.lock
```

権限がどうこうという記事を見ますが、その前に、MySQLが起動しているかを確認しましょう。
Intel NUC (BOXNUC8I7BEH) の BIOS アップデート手順 (OS に依存しない方法)

# Intel NUC (BOXNUC8I7BEH) の BIOS アップデート手順 (OS に依存しない方法)

この手順は OS に依存しない方法です。Linux などインストーラ形式のアップデータを利用できない場合に使用します。
Windows で更新する場合は、インストーラ形式のアップデータを使うほうが簡単です。

## 注意

NUC の型番が違う場合はBIOSの取得URLは異なります。
事前に使用しているNUCの正確な型番を確認した上で正しいファイルをダウンロード、使用してください。

## 準備

1. https://downloadcenter.intel.com/ja/product/126140 にアクセスします。
2. 絞り込み条件で、`OS 非依存` を選びます。
3. [[BIOS アップデート 進む FL 357.86 A ]](https://downloadcenter.intel.com/ja/download/29282/BIOS-FL-357-86-A-?product=126140) から `BE0077.bio` をダウンロードする。(ファイル名は 2020/3/8 時点の情報です。BIOS が更新されたら変わるかもしれません。)
4. 32 GB 以下の USB メモリを FAT32 でフォーマットする
5. ダウンロードした `BE0077.bio` をUSB メモリにコピーする 

## 手順

1. USB メモリを Intel NUC に挿す
2. 電源ボタンを長押しする (3秒程度押し続けて離す)
3. Intel NUC のロゴが表示されたタイミングで F2 キーを押す
4. メニューから BIOS アップデートを選ぶか F7 キーを押す
5. USB メモリを選択して、BIOS ファイルを選ぶ
6. 待つ

## 注意

BIOS アップデート中に電源を切った場合、BIOS が壊れて起動しなくなることもあるので気を付けてください。

## 関連 リンク

* https://qiita.com/m-tmatma/items/b7fc996b6781d9126b3b#%E5%8F%82%E8%80%83%E6%83%85%E5%A0%B1
* https://downloadmirror.intel.com/29282/eng/NUC-BIOS-Update-Readme.pdf
* https://downloadcenter.intel.com/ja/download/29282/BIOS-FL-357-86-A-?product=126140
* https://downloadcenter.intel.com/ja/product/126140
* https://www.youtube.com/watch?v=LoZiYWTtqjg (BIOS メニューから更新したときの画面は異なるが参考になる)
UUID Version 6 を生成する

UUID は Version が 1 から 5 までしかないので、タイトルはエラーとなります。しかしながら、なぜ存在しないはずの Version 6 を語らないといけないか、と述べますと「ソートできるUUID」を人類は求めているからです。例えば Ulid などが議論に挙がるというのは、それを裏付けることでありましょう。この記事ではその「あったらいいな」というもの、つまりはソートできる UUID を作っていくことにします。

# サンプルコード
```ruby
UUID_V1 = `uuidgen -t`.chomp

def uuid_v1_to_v6 v1
  uh = v1.split(/-/).join
  tlo1 = uh[...5]
  tlo2 = uh[5...8]
  tmid = uh[8...12]
  thig = uh[13...16]
  rest = uh[16..]

  thig + tmid + tlo1 + '6' + tlo2 + rest
end

p uuid_v1_to_v6(UUID_V1)

require 'test/unit'
class TC_Foo < Test::Unit::TestCase
  def test_v1_to_v6
    assert_equal uuid_v1_to_v6('adb17428-60e4-11ea-bc55-0242ac130003'), '1ea60e4adb176428bc550242ac130003'
    assert_equal uuid_v1_to_v6('0966a06e-60df-11ea-b5d2-7be3aea104a2'), '1ea60df0966a606eb5d27be3aea104a2'
  end

  def test_sortable
    assert uuid_v1_to_v6(UUID_V1) < uuid_v1_to_v6(`uuidgen -t`.chomp)
  end
end
```
↑では仰々しく書いたけど、[UUID "Version 6" The version RFC 4122 forgot.](http://gh.peabody.io/uuidv6/) という記事にあったコードを Ruby で書き直しただけです。つまりは、ただのパクリです。m(_ _)m

# おわりに
正直に申せば、uuidgen というコマンドをうっているあたり「OSコマンドインジェクションとか考えてなさそう...」とか、「将来 Version 6 ができたた時にちゃんと動くのか？」という批判は甘んじます。まぁ「ソート可能な UUID みたいなもの」という条件はそろえているので、良しということにしといてください。
jqを利用してSpeedtestのjsonからdownloadとuploadだけを取得する方法

#jqコマンドは？
json形式のデータをパースしてくれるコマンドです。
インストールは、

```
brew install jq
```

でできます。
#利用するデータは？
今回は、speedtestの結果を以下のコマンドでjsonで出力して、それをパースしてダウンロードとアップロードだけを取得してみたいと思います。
まず、speedtestで出力結果をjson形式で書き出してresult.jsonに保存するために以下のコマンドを実施します。
なお、speedtestはOoklaの公式で提供されているものを用います。
それのインストール方法は、Ooklaの公式サイトで公開されています。

https://www.speedtest.net/ja/apps/cli

入力するコマンド

```
speedtest --format=json >> result.json  
```
ファイル名を指定して出力する方法もありそうですが、私の力では見つからなかったため、とりあえずリダイレクションで、terminalの出力結果をファイルに出力しましした。

さて、ここからが本題です。
まずは、出力されたresult.jsonの中身を見てみましょう。

```json
{"type":"result","timestamp":"2020-03-08T02:36:24Z","ping":{"jitter":3.3050000000000002,"latency":4.7750000000000004},"download":{"bandwidth":976859,"bytes":13739838,"elapsed":15015},"upload":{"bandwidth":903839,"bytes":4670503,"elapsed":5174},"packetLoss":0,"isp":"Asahi Net","interface":{"internalIp":"10.0.0.15","name":"en0","macAddr":"F8:FF:C2:69:EA:AA","isVpn":false,"externalIp":"14.3.19.11"},"server":{"id":14623,"name":"IPA CyberLab","location":"Bunkyo","country":"Japan","host":"speed.coe.ad.jp","port":8080,"ip":"103.95.184.74"},"result":{"id":"b3e495d4-30b6-4472-9fd2-69493a6c2b0f","url":"https://www.speedtest.net/result/c/b3e495d4-30b6-4472-9fd2-69493a6c2b0f"}}
```

このままだと、何が書いてあるのか理解するのが難しいです。

それでは、catコマンドとjqコマンドを利用して、jsonを見やすい形に整形して、見てみましょう。

```json
{
  "type": "result",
  "timestamp": "2020-03-08T02:36:24Z",
  "ping": {
    "jitter": 3.305,
    "latency": 4.775
  },
  "download": {
    "bandwidth": 976859,
    "bytes": 13739838,
    "elapsed": 15015
  },
  "upload": {
    "bandwidth": 903839,
    "bytes": 4670503,
    "elapsed": 5174
  },
  "packetLoss": 0,
  "isp": "Asahi Net",
  "interface": {
    "internalIp": "10.0.0.15",
    "name": "en0",
    "macAddr": "******",
    "isVpn": false,
    "externalIp": "14.3.19.11"
  },
  "server": {
    "id": 14623,
    "name": "IPA CyberLab",
    "location": "Bunkyo",
    "country": "Japan",
    "host": "speed.coe.ad.jp",
    "port": 8080,
    "ip": "103.95.184.74"
  },
  "result": {
    "id": "b3e495d4-30b6-4472-9fd2-69493a6c2b0f",
    "url": "https://www.speedtest.net/result/c/b3e495d4-30b6-4472-9fd2-69493a6c2b0f"
  }
}
```

非常に見やすくなりましたね。

#jqコマンドで特定要素を取り出す
それでは、次にjqコマンドを利用して特定の要素だけを取り出してみましょう。
まずは、ダウンロードの速度を取り出してみたいと思います。

```
cat result.json | jq ".download.bandwidth"
```

と入力すると、

```
976859
```
と表示されました。



アップロードの速度だけを取り出すには、以下のコマンドを実行します。

```
cat result.json | jq ".upload.bandwidth"
```

すると、

```
903839
```
と表示されました。

これはあくまでも、バイト数なので、これをよく利用する「Mbps」に変換するには、

```
976859*8/1024/1024
```
または、

```
976859*8/1000/1000
```

としてください。
2進数で考えるのか、10進数で考えるのか、規格が微妙に異なるようです。
正式な規格としては、10進数で考えるのが正しいので、1000で割るのが正しいです。
ただ、業界としてはデファクトスタンダードとして2進数で考えて1024で割るのも、間違ってはいないようです。

コメントしてくださった方、ありがとうございます。



以上、おわおわり。
【Kotlin】AnnotationTarget.PROPERTY_GETTERで付与したアノテーションはjavaGetterからも取り出せる

`Kotlin`では、以下のようにすることでプロパティのゲッターにアノテーションを付与できます。

```kotlin:アノテーション
@Target(AnnotationTarget.PROPERTY_GETTER)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
annotation class ForGetter
```

```kotlin:付与した様子
data class Sample(@get:ForGetter val property)
```

このアノテーションは、以下のように`javaGetter`からも取り出せます。

```kotlin:javaGetterから取得する様子
Sample::class.memberProperties.forEach { property ->[
    val forGetter: ForGetter = property.javaGetter!!.getAnnotation(ForGetter::class.java)!!
}
```

ただし、`KProperty`で使える`findAnnotation`関数は`javaGetter`に対して使えません。
これに関しては、例に出した通り、同等の処理として`getAnnotation`関数を使うことができます。
SQL 入門

## SQLとは？
<font color = "red">Structured Query Langage</font>の略称。
Controller　⇄　DB 間　バックグラウンドで実行されているプログラミング言語です。
Railsでは、ActiveRecordがSQLに翻訳・変換しています。


## 概要
本投稿は、リレーショナルデータベースの事を説明しているので、あしからず。
SQLは主にデータベースの作成・編集・削除を行っています。Railsのコマンドを打てば自動生成
される為、影の薄いSQLにスポットライトをあてたいと思います。

SQLは２つの機能を持っています。
　　　
　**DDL(Data Definition Langage)　‥　データベースを定義する機能**
　**DML(Data Manipulation Langage) ‥　データベースを操作する機能**

 上記の機能にできる役割がそれぞれ割り当てられています。

DDL
├ -　CREATE(DB・テーブルを作成する)
├ -　ALTER(DB・テーブルを更新する)
└ -　DROP(DB・テーブルを削除する)
DML                              　
├ -　INSERT(データを登録する)
├ -　UPDATE(データを更新する)
├ -　DLETLE(データを削除する)
└ -　SELECT(データを検索する)


テーブル・カラム・railsコマンドの早見表を作ってみました。

|機能 |テーブル |カラム・VALUE |Railsコマンド |migrationファイルの記述
|:-: |:-: |:-: |:-:|:-:
|作成する |CREATE |- |rails db:create |create_table
|登録する |- |INSERT |rails db:migrate |-
|更新する |ALTER |UPDATE |rails db:migrate |change_table(column) add_column
|削除する |DROP |DELETE |rails db:rollback |drop_table(column)
|検索する|- |SELECT |- |-

検索するメソッドを強いて上げるなら、show databases; か　findメソッド当たりでしょうか‥
次回の投稿で、詳しい使い方を投稿したいと思います。

参照先：[railsガイド](https://railsguides.jp/active_record_migrations.html)
30DAYSトライアル　DAY24ページ内リンクでクリックした要素に下線を引く

メニューの一つずつのクラスを変えてひとつずつコードを書くのは効率が悪いなあとおもっていたところクリックした要素だけを取得するというとても便利なものがあることが判明したので覚書としてまとめます

$("クリックする要素。ここではメニューのクラス名").click(
   function(){
    var target =$(event.target);
　　//event.target はイベント発生現である要素を取得できる(ここではクリックしたものを取得できる)
　　
//一度全てのクラスからすべての要素を外す　　　
    $("header a").removeClass("外したい要素");
//外してから先ほど取得したtargetにclassを付ける
    target.addClass("つけたい要素");
    
   }
   );

removeClassとaddClassを逆にすると何もつかなくなりますので必ずこの順番で。
[ASP.NET] MVC エリアを作る

クイックメモ、ASP.NET 3.X MVCでエリアを作るとき


# 新しいエリアを作る

プロジェクト配下のAreasフォルダーで右クリック、追加、エリアを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/ae1f0646-9bb9-1ddb-7469-f2042e63ef70.png)

エリアの名前を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/777943ae-ce61-b1ed-5e48-97dc18c4a624.png)


# `ScaffoldingReadMe.txt`を確認、でもその通りにしては動かない。

`ScaffoldingReadMe.txt`が生成されるので確認。

```
Scaffolding has generated all the files and added the required dependencies.

However, the Application's Startup code may require additional changes for things to work end to end.
Add the following code to the Configure method in your Application's Startup class if not already done:

app.UseMvc(routes =>
{
  routes.MapRoute(
    name : "areas",
    template : "{area:exists}/{controller=Home}/{action=Index}/{id?}"
  );
});
```

# `app.UserEndpoints`を更新

`Startup.cs`既存の`app.UserEndpoints`を確認

既存は下記

```
app.UseEndpoints(endpoints =>{
  endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
    endpoints.MapRazorPages();
});
```

ScaffoldingReadMe.txt通りにすると正しく動作しないので、下記のように書き直し。

```
app.UseEndpoints(endpoints =>
{
  endpoints.MapControllerRoute(
    name: "areaRoute",
    pattern: "{area:exists}/{controller}/{action}",
    defaults: new { action = "Index" });

  endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

  endpoints.MapRazorPages();
});
```
ROS kinetic上でRobosenseを動かす


##はじめに
とある方の好意よりVLP-16相当の中華LiDARのRobosense `RS-LiDAR-16`を借用することが出来た。
ROS Kinetic上にドライバをインストールするノウハウが散らかっているので、個人的メモとしてここに記す。

Ubuntu 16.04LTS が導入されていることを前提とする。
## ROS kinetic インストール

ROS kinetic を[本家](http://wiki.ros.org/ja/kinetic/Installation/Ubuntu)に従いインストール


catkin_wsが無いなら作成

```bash
mkdir ~/catkin_ws
mkdir ~/catkin_ws/src
```

## Robosense ドライバインストール

Robosenseのドライバを入手

```shell
cd ~/catkin_ws/src
git clone http://www.github.com/CPFL/robosense
mv -T robosense/  ros_rslidar/
```
~/catkin_ws以下にros_rslidarがある前提のようだ。

```bash
cd ~/catkin_ws/src/ros_rslidar/rslidar_drvier
chmod 777 cfg/*
cd ~/catkin_ws/src/ros_rslidar/rslidar_pointcloud
chmod 777 cfg/*
```

このままcatkin_mekeすると、gccでエラーが出るので、libcapを導入する。

```bash
sudo apt-get install libcap-dev
sudo apt-get install libpcap0.8
sudo apt-get install libpcap0.8-dev
```

マニュアルに従い、catkin_make

```bash
cd ~/catkin_ws
catkin_make
```
LANの設定。固定IPで`192.168.1.102` などに設定。

新しいターミナル上で、nodesetを動かす

```bash
cd ~/catkin_ws
source devel/setup.bash
roslaunch rslidar_pointcloud rs_lidar_16.launch
```
rvizが起動して点描が開始されたらOK。
RubyMine + Docker でデバッガーが使えなくなった時に行なったこと

# 状況

RubyMine + Docker でデバッグモードを起動しようとしたら
「Cannot start debugger. Gem 'ruby-ide-debug' isn't installed」と表示される。


# 環境

RubyMine 2019.3.3
Docker desktop 2.2.0.3
macOS Mojave 10.14.6

Ruby 2.6.3
Rails 5.2.3
bundler 2.0.1

ここではDocker環境やRubyMineのリモートデバッグの環境構築方法は述べない。
（リクエストがあれば書こうかな）


# 原因

RubyMineのどこかのバージョンから ruby-debug-ide のバージョン0.7.0以上でないと動作しなくなった模様。

Gemfileでruby-debug-ideのバージョンを指定しないと0.6.1がインストールされる。


# 簡易な対応

基本的にはruby-debug-ideのバージョン0.7.0以上にするだけで良いはず。

### Gemfile修正

```ruby:Gemfile
gem 'ruby-debug-ide', '~> 0.7.0'
gem 'debase', '~> 0.2.4'
```

### Docker上でbundle installを実行

それぞれのDocker環境に適した方法でbundle installを実行する。
私の環境ではdocker-compose実行時にbundle installが実行されるようになっている。


### RubyMine Preference > Language&Framework > Ruby SDK and Gems

Remote SDK の設定で ruby-debug-ide が 0.7.0 であることを確認する。
「↓」ボタンを押してGemfileをローカル環境にダウンロードする。
RubyMine内のIndex再作成が終わるまで待つ。


### デバッグモードでサーバーを起動する

<img width="353" alt="スクリーンショット 2020-03-08 10.36.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/6516dd32-31e1-b872-8ca0-6dc73d8cde9b.png">

これで起動すればラッキー。


# 面倒な対応

基本的にはruby-debug-ideのバージョン0.7.0以上にするだけで良いのだが、試行錯誤などによって環境がおかしくなってしまっていることがある。その場合諸々の環境をリセットする必要がある。


### Dockerイメージ全消し

イメージを消さなくても bundle install が動いてイメージが更新されれば問題ないのだが、キャッシュなどによってイメージが更新されないことがある。その場合はイメージを消す。


### RubyMineのアンインストール

Gemなどのキャッシュや設定が残るのでそれらもキレイに消去する。

Jetbrain社のアンインストール手順はこちら
https://pleiades.io/help/ruby/uninstall.html?section=macOS

~/Library/CachesとPreferencesにあるRubyMine2019.3を消す。

プロジェクトフォルダにある .idea フォルダを消す。隠しフォルダ。
（カスタマイズ設定が消えてしまうのは辛いが、リセットする場合は必要）


### vendorフォルダの下

もしプロジェクトフォルダの下のvendorフォルダ以下にbundleフォルダがあれば消す。

Dockerを使った開発環境では「bundle install」によってGemがインストールされるのはDockerコンテナーの中なのでプロジェクトフォルダのvendor/bundleフォルダにはGemはインストールされない。しかし、vendor/bundleフォルダにGemがあると何かの拍子にRubyMineがそこを参照することがあるので消しておく。


### bundlerのバージョン

Docker内のbundlerのバージョンを2.0.xにする。
bundlerのバージョンが2.1.xの場合、Remote SDKのGemファイル一覧が正しく表示されない。
もしかするとDocker内のbundlerのバージョンとローカルのbundlerのバージョンの差異によるものかもしれないが未確認。


### Mac再起動

RubyMineの再起動だけではうまく認識されないことがある。
作業中はマメにMacを再起動した方が良さそう。


### 簡易な対応

前述の簡易な対応を行う。


# P.S.

RubyMine + Docker のデバッグ環境についての情報が少なくて苦労したが、調べていく中でRubyMineの凄さを知れた。
Dockerコンテナ内のRailsサーバーをデバッグするには、通常であればデバッグ用のポートを開けてrails-debug-ideを起動するという記述をDockerFileにしておいて、さらにIDEからはそのポートに対してデバッガーをアタッチするようにしなければならない。
しかし、RubyMineは起動中のイメージを元にデバッグ用のポートを開けてrails-debug-ideを起動し、そのポートに対してデバッガーをアタッチするところまでやってくれる。RubyMineのtmpフォルダに自動生成されdocker-composeファイルを見ることができる。
Lhaplusの引数を利用して複数データをパスワード付き圧縮及び解凍する方法

# Lhaplusの引数を利用して複数データをパスワード付き圧縮及び解凍する方法
# 目次
[基本編](#基本編)

1. [引数一覧](#引数一覧)
1. [コマンドで実行する場合](#コマンドで実行する場合)

[実践編](#実践編)

1. [複数データをまとめてパスワード付き圧縮](#複数データをまとめてパスワード付き圧縮)
1. [複数データをまとめて解凍](#複数データをまとめて解凍)
1. [複数データをまとめてパスワード付き解凍](#パスワード付き圧縮ファイルを解凍する場合)

# 対象
- OS:windows7,8,8.1,10
- 圧縮解凍ソフトがLhaplus.exeしか使用できない現場向け
- ※インストール可能なら、[7-Zip](https://sevenzip.osdn.jp/)の利用がおすすめ。
- powershellのバージョンが5.0未満(`Windowsキー+R`⇒`powershell`⇒`Enter`⇒`Get-Host`で確認)
- 5.0以上であれば圧縮解凍コマンドがあります。※**パスワード操作は不可**です。
⇒[超簡単! Powershellでファイルの圧縮/解凍](https://qiita.com/n-nabe/items/4f5f6f5178205a2cbc50)

# 基本編
## 引数一覧

*※圧縮と解凍それぞれ使えるオプションが異なるので注意*

|引数|意味|圧縮/解凍|
|:--|:--|:--|
|/init|||
|/inst|シェル初期設定画面を表示する||
|/instsilent|||
|/c:|形式（拡張子）を指定|圧縮|
|/l:|対象一覧を記述したファイルを指定|圧縮/解凍|
|/d|||
|/oh|ここに解凍（アーカイブのあるフォルダに展開する|解凍|
|/od|デスクトップに解凍|解凍|
|/oc|出力先を指定して解凍|解凍|
|/o:|出力先フォルダを指定する。|圧縮/解凍|
|/t|テンポラリモード|解凍|
|/a|||
|/x|自己解凍形式|圧縮|
|/h|||
|/p|パスワードを入力するダイアログを表示|圧縮|
|/p:|パスワードを指定|圧縮|
|/n:|出力するファイル名を指定する|圧縮/解凍|
|/log:|指定のログファイルにログを出力する|圧縮/解凍|
|/a2a:|||
|/debug|||

## コマンドで実行する場合
### コマンドプロンプト
1. コマンドプロンプトを起動  
`Windows+R`⇒`cmd`入力⇒`Enter`

1. コマンド実行  

```
Lhaplus.exeフルパス オプション 圧縮/解凍するフォルダのフルパス
```
*注意*
以下のメッセージが出た場合は、`Lhaplus.exe`をフルパスが誤っている。
PC内でLhaplus.exeで検索し、正しいパスを指定する。

```
'Lhaplus.exe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

フルパスが`C:\Program Files (x86)\Lhaplus\Lhaplus.exe`であれば、

```
"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" オプション 圧縮/解凍するフォルダのフルパス
```
### Powershell
1. Powershellを起動  
`Windows+R`⇒`powershell`入力⇒`Enter`

1. コマンド実行  

```
Start-Process -FilePath 'C:\Program Files (x86)\Lhaplus\Lhaplus.exe' -ArgumentList 'オプション 圧縮/解凍するフォルダのフルパス'
```

# 実践編
## 複数データをまとめてパスワード付き圧縮
Desktopに`対象一覧.txt`を作成
(例)`C:\work`と`C:\tmp`を圧縮する場合

```対象一覧.txt
C:\work
C:\tmp
```

1. 以下のbatファイル(*文字コード:Shift-JIS*)をダブルクリックして実行  
パスワードを`password`にしてデスクトップに圧縮ファイルを出力する

### 一つの圧縮ファイルにする場合
```圧縮_sample.bat
@echo off
set Lhaplusフルパス="C:\Program Files (x86)\Lhaplus\Lhaplus.exe"
set 出力先=%USERPROFILE%\Desktop
set パスワード=password
set 拡張子=zip
set 対象一覧=%USERPROFILE%\Desktop\対象一覧.txt
set オプション=/o:%出力先% /c:%拡張子% /p:%パスワード% /l:%対象一覧%
%Lhaplusフルパス% %オプション%
```
### 圧縮ファイルを分ける場合
```圧縮_sample.bat
@echo off
set Lhaplusフルパス="C:\Program Files (x86)\Lhaplus\Lhaplus.exe"
set 出力先=%USERPROFILE%\Desktop
set パスワード=password
set 拡張子=zip
set 対象一覧=%USERPROFILE%\Desktop\対象一覧.txt
set オプション=/o:%出力先% /c:%拡張子% /p:%パスワード% 
for /f %%i in (%対象一覧%) do (
  %Lhaplusフルパス% %オプション% %%i
)
```

## 複数データをまとめて解凍
Desktopに`対象一覧.txt`を作成
(例)`C:\work`と`C:\tmp`を解凍する場合

```対象一覧.txt
C:\work
C:\tmp
```

1. 以下のbatファイルをダブルクリックして実行  
パスワードを`password`にしてデスクトップに解凍ファイルを出力する

```解凍_sample.bat
@echo off
set Lhaplusフルパス="C:\Program Files (x86)\Lhaplus\Lhaplus.exe"
set 対象一覧=%USERPROFILE%\Desktop\対象一覧.txt
set オプション=/od /l:%対象一覧%
%Lhaplusフルパス% %オプション%
```

## 補足
### logを出力する場合
`/log:`は対象が多いと、負荷がかかり実行速度に難有り。

### パスワード付き圧縮ファイルを解凍する場合
必ずパスワードを入力するダイアログが表示されます。これは**消せません**。
`/p:`が圧縮専用のオプションであり、解凍用のオプションが存在しないからです。
つまり、パスワード付き圧縮ファイルを解凍する場合は、完全自動化は**不可能**です。



おわり
[Python] Pythonでフォルダ内のファイルを取得

フォルダ内のXMLを取得してParseする必要が生じたので、ファイルパス取得を試みました。

#ライブラリ
globというライブラリをインポートします。
osはファイル名取得に必要なライブラリです。

```
import glob
import os
```

#フォルダ指定
*（アスタリスク）でフォルダ内の全てのファイルを指定します。

```
file = glob.glob("C:/Users/user/*")
```

今回はXMLを取得するのでこんな感じでファイルパスが取得できます。

```
print(file)
['C:/Users/user/AAAAAA.xml', 'C:/Users/user/BBBBBB.xml']
```
#ファイル名取得
csvに書き出しする際にユニークなファイル名を利用したいので、ついでにファイル名も取得しておきます。
ファイルパス一覧からまずAAAAAA.xmlを取得します。
その後ファイル名を取得するためにos.path.splitを使用しました。

```
file_A = file[0] //一番上のファイルパスを取得
filename = os.path.split(file_A)[1]
```
これでファイル名が取得できました。

```
print(filename)
AAAAAA.xml
```

フォルダには時間的にイレギュラーかつXMLファイル数も予測できないため、実際にはループ処理する必要があります。
ループに関しては次回投稿しようと思います。
[Chrome] jsonを見やすくjsで表示する拡張機能

# はじめに
apiのサンプルを見やすくしたかったので探しました。

https://chrome.google.com/webstore/detail/json-viewer-awesome/iemadiahhbebdklepanmkjenfdebfpfe/related

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/4bd2e39f-0c6e-52a3-9581-dfbd9c7e44c8.jpeg)
![unnamed (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/46ef7bf2-74f9-e37b-9207-7d0ddc3a0514.jpeg)
[Cocoa][Swift][Xcode]使うXcodeのバージョンを切り替える

<p>自社のアプリケーション開発では、常に最新のOSとXcodeを使用しているので考えることはなかったが、
大規模なプロジェクトに参画して仕事をする場合、複数のXcodeをインストールして、切り替えながら使わないといけないことがある。</p>

<p>そんな際に役立つのが、xcode-selectコマンドだ。</p>

<b>複数バージョンのXcodeをインストールする</b>
<p>多くの人に役立つよう、基本的なことから説明する。</p>

<p>常に最新バージョンのXcodeを望むなら、App Store経由でインストールする。</p>

<p>希望したバージョンのXcodeを望むなら、Developerサイト（https://developer.apple.com）の Account → Downloads → More の "More Downloads for Apple Developers" からインストールする。その場合、Xcode.app の名前を Xcode_11.3.1.app と変えて、/Applications に置くことをお勧めする。名前に space があると後で困ることになるので避けること。</p>

<b>Command Line Toolsをインストールする</b>
<p>Xcodeをインストールしたら、先ずは起動する。すると、Command Line Toolsのインストールが始まる。</p>

<p>以下のコマンドでもインストールを開始できる。</p>

<pre><code>xcode-select --install
</code></pre>

<p>著者は "More Downloads for Apple Developers" からも、Command Line Tools for Xcode をインストールしている。理由は、単体でインストールするとclangのModulesでなくなった、/usr/include にヘッダーファイルがインストールからだったが、現在ではインストールされなくなったようだ？</p>

<b>Xcodeのバージョンを切り替える</b>
<p>複数あるXcodeと関連するBSDツールを切り替えるのが xcode-select コマンドだ。</p>

<pre><code>xcode-select --switch  path/to/Xcode.app
</code></pre>

<p>ただし、実際にはスーパーユーザー特権で実行する必要があるので、以下のように実行する。</p>

<pre><code>$ sudo xcode-select --switch /Applications/Xcode.app
</code></pre>

<p>切り替えが上手くいったかは、以下のコマンドで確認できる。</p>

<pre><code>$ xcode-select --print-path
</code></pre>

<p>以下のコマンドでも確認できる。</p>

<pre><code>$ /usr/bin/xcrun --find xcodebuild
</code></pre>

<b>【関連情報】</b>
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />