OmniAICreator/Qiita-1.07M huggingface dataset:
Splunk公式ドキュメントに記載されているSplunkインスタンスの呼び方について

# はじめに
Splunkは、複数のSplunkインスタンスを組み合わせて分散構成やクラスター構成を組むことができます。

基本的にはSplunk単独で組むことができますが、その際、同じSplunk製品(Splunk EnterpriseまたはUniversal Forwarder)を使っていても、構成上で各Splunkインスタンスが果たす役割によって呼び方が変わったりします。Splunk公式ドキュメントに記載されているSplunkインスタンスの呼び方について調査しました。

※筆者が独自調査した結果となり、Splunk社公式の見解は異なる可能性もありますので予めご了承ください。

## 標準の呼称

| 名称 | 略称 | 概要 | 備考 |
|:------: |:---------: |:--| :-- |
| All-In-One | AIO | 1台で後述するIndexerとSearchheadの役割を果たすインスタンス。小規模な構成や初期構成時に採用されることが殆ど。 ||
| Indexer | IDX | Forwarderなどで取り込んだデータをIndexに保存するインスタンス。 ||
| Searchhead | SH | ユーザーからのサーチをIndexerに問い合わせ、その結果を表示するインスタンス。 | | 
| DeploymentServer | DS | 設定の一元管理を行う役割を担うインスタンス。DSの管理下になるSplunkインスタンスのことをDeploymentClientと呼ぶこともある。 | ※1 |
| ClusterMaster | CM | インデクサークラスタリング構成において、IndexerおよびIndexの管理を行うインスタンス。地味に重要。 | | 
| LicenseMaster | LM | ライセンスの一元管理を行う役割を担うインスタンス。LMの管理下になったSplunkインスタンスのことをLicenseSlaveと呼ぶ。これも地味に重要。| |
| Deployer | DP |サーチヘッドクラスタリング構成において、各メンバー(後述)に設定を配布する役割を持つインスタンス。名前がDSと似ているが目的や役割は全く違うので注意。 | |
| UniversalForwarder | UF | データの取り込みと他Splunkインスタンスへのデータ転送に役割を特化したインスタンス。Splunk Enterpriseとは別のインストーラを使う。 | ※2 |
| HeavyForwarder | HF | データの取り込み時にデータの修正や、データ内容に応じて転送先を制御したい場合などに採用されるインスタンス。 | | 
| Monitoring Console | MC | Splunkインスタンスの稼働状況を監視するインスタンス。監視するためには監視対象インスタンス側にも設定が必要になる。 |※3 |
| Intermediary Forwarder | IF | 中継Forwarder(他のForwarderから送られたデータを別のSplunkインスタンス(インデクサー、あるいは別のフォワーダー)に転送する役割を持つフォワーダー。役割を担うのはUFでもHF(Splunk Enterprise)でもよい。 |  |

※1 Splunk社の資料によっては、Forwarder Management(フォワーダー管理)と同義としているようです。
※2 Splunkはデータ取り込み方法として、TCP/UDPを使った取り込みやWMIを使った取り込みをサポートしていますが、2019年10月時点、UFを使って取り込むことを推奨しているようです。
※3 Splunk webで言語を日本語にしている場合、"モニター"コンソールと表示されます。

## 分散構成/クラスター構成を組んだ時に使われる名称

- Search Peer
SearchHeadからサーチされるIndexを持つIndexerのことを指す。（紛らわしいですがIndexerとIndexは別物です）

- Member
サーチヘッドクラスタリング構成(SHC)における各サーチヘッド。

- Captain
サーチヘッドクラスタリング構成(SHC)において、スケジュールサーチをどのメンバーに実施してもらうかと、あるメンバーが持っているローカル設定を他のメンバーに複製することを管理する役割をもつサーチヘッド。キャプテンはSHCのメンバーのどれか1台がなり、Splunkデフォルトでは動的にキャプテンが決定される。

## 参考文献
https://wiki.splunk.com/Community:HowIndexingWorks
https://www.splunk.com/pdfs/technical-briefs/splunk-validated-architectures.pdf
Wordでトリミングをショートカットキーに登録する方法 | 新人SEの備忘録

SEの仕事にドキュメント作成は必須みたいです。
種類も設計書やサーバー構成図など、たくさんあります。

そのなかでも作業手順書は画面のキャプチャ画像を大量に載せるため、画像のトリミング処理がかなりの回数必要になります。
Officeソフト（私の会社ではWordを使用）の仕様ではトリミングのショートカットキーは存在せず、かなり手間です。
具体的には画面上のリボンを切り替えとトリミングコマンドを選択で、2クリック必要になります。

そこでトリミングをショートカットキーに登録する方法を調べたので、備忘録として記録します。

1.オプションを開く。
[ファイル] → [オプション]

2.リボンのユーザー設定をクリック。
![スクリーンショット (78).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519134/1c614604-de62-3594-b433-f0433a86db11.png)

3.ユーザー設定をクリック。
![スクリーンショット (79).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519134/d0fc4356-c02a-150f-11c7-4b1aa3dd24d8.png)

4.すべてのコマンドをクリック。
![スクリーンショット (80).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519134/d9050532-a4c7-6aa1-bc25-bdf2b1ed3042.png)

5.DrawToggleCropModeをクリック。
トリミングのコマンドです。
![スクリーンショット (81).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519134/52d2c81f-5979-e29d-861f-235c1cdbd566.png)

6.割り当てるキーを入力し、割り当てをクリック。
割り当てるキーは[ctrlキー] + [任意のキー1個 または 複数個]
![スクリーンショット (82).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519134/95f3c8d3-7e23-f8be-a515-e2bf78967456.png)



参考
ショートカット キーをカスタマイズする | Microsoft
https://support.office.com/ja-jp/article/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-%E3%82%AD%E3%83%BC%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B-9a92343e-a781-4d5a-92f1-0f32e3ba5b4d

Wordの「コマンドマクロ」一覧 | 谷本玲大
http://tanimoto.to/comp/WordCommandMacrosList.html
viがなくてもあわてない

Docker便利ですよね。いざコンテナで作業しようとしたとき、

```bash
$ vi
bash: vi: command not found
```

あっ vi がない！ってなりませんか？

そんなときどうしましょう。インストールする？とんでもない！
そんなあなたは今すぐ隣のvimmerと距離を置きましょう。

~~正解はemacsを使~~

テキストファイルのちょっとした編集を行うテクニックです。

## echoとリダイレクト

標準出力を```>```でファイルに上書き、```>>```でファイルに追記します。

```bash
$ echo "文字列" > file.txt
$ echo "最終行に追記" >> file.txt
```
## cat

catに標準入力```-```を渡すと複数行を書き込み。```Ctl+C```で抜けます。

```bash
$ cat - > file.txt
a
b
c
^C
```

## sed

sedは置換コマンドのイメージが強いですが、いろいろできます。そしてviはなくてもsedはたいていあります。

### 表示

```bash
$ sed -n '3p' file.txt # 3行目だけ表示
```

### 削除

```bash
$ sed -i -e '3d' file.txt # 3行目を削除
```

### 挿入

```bash
$ sed -i -e '3i hoge' file.txt # 3行目に挿入
```

### 置換

```bash
$ sed -i -e 's/hoge/fuga/g' file.txt # すべてのhogeをfugaに置換
$ sed -i -e '3 s/hoge/fuga/g' file.txt # 3行目だけ置換
```
Dockerのホスト側でデータベース復元

##環境
Docker

##準備
直接パスワード入れるのはアレなので、
設定ファイル作っておく。

また、docker-compose.ymlでボリュームとか設定する。
このデータ共有されてるホスト側のパスを後ほど指定する。

## シェル

```shell:doHukugen.sh
docker exec -i {コンテナID} mysql --defaults-file=db.conf {データベース名} < ../migration/datastore/{ダンプファイル名}.dump


```

##オプションについて
オプションについては下記に詳しく書いてある。
https://hodalog.com/how-to-resolve-the-error-that-the-input-device-is-not-a-tty/

dockerコマンドの-tオプションは「TTYを割り当ててくれる」オプション。
このオプションを外すことでcronジョブが正常に実行できるようになります。
なので、tをつけると、TTYがないみたいなエラーが出るからつけない。

ついでに-iは「標準入力を開き続ける」オプションで、これもCLIでコンテナを操作するために必要なオプション。
これはもちろん必要なので今回はこのオプションだけ。

## 結果
このシェルスクリプトを実行してみると、指定したダンプファイルの状態にデータが戻った
MediaLive で 4K/UHD ライブストリーミング

ようやっと新しいホイールが届いたので早く付けたくてウズウズしている streampack 木村です。

４Kライブをお手軽にやろうとすると、今まで実質 Wowza くらいしか選択肢がなかったのですが、MediaLive も 4K/UHD 配信に対応したので、以前試した下記の記事の Wowza を MediaLive + MediaPackage に変えて実験してみます。


【前回記事】[ffmpeg でファイルから4K HEVC疑似ライブストリーミング](https://qiita.com/tomopyonsama/items/d231f2f241ed25a68bb5)

# 構成

Encoder (ffmpeg on EC2) -> RTP -> MediaLive -> MediaPackage -> Player

なんで MediaPackage を使うかというと、以前の案件で Wowza から 4K DASH を出していたから、今回も DASH ろうという魂胆です。

# 設定



## MediaLive

### Input

前回は ffmpeg から UDP MPEG-TS で投げてましたが、MediaLive では受けれないので、 `RTP_PUSH` で取ることにします。

<img width="1055" alt="スクリーンショット 2019-10-21 13.58.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/49fdad91-8fd9-0737-52fe-b08b61515781.png">

### Channel

`Output groups` を `MediaPackage` に。
DASH 要らんわって方は S3 でも MediaStore でも良いでしょう。

3840x2180 UHD H.265 30fps で出力します。
ビットレートは10Mbps

<img width="1272" alt="スクリーンショット 2019-10-21 14.00.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/3b77bf28-7b56-f0e8-d479-c2c6e4465a54.png">

## MediaPackage

### Endpoints

DASH とついでに CMAF も両方作ってみる

<img width="1020" alt="スクリーンショット 2019-10-21 14.00.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/4b7b54e4-8552-708e-2841-292cfa518456.png">

## Encoder

Encoder は前回と同じく ffmpeg
今回は RTP で投げるので下記コマンドで。
ぐるぐる回すファイルの作成方法は[前回記事](https://qiita.com/tomopyonsama/items/d231f2f241ed25a68bb5#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E6%BA%96%E5%82%99)で。

```
$ ffmpeg -re -stream_loop -1 -i hevcuhd.mp4 -c copy -map 0 -f rtp_mpegts -fec prompeg=l=5:d=20 rtp://xxx.xxx.xxx.xxx:5000
```

# 視聴

Mac で確認してみます。
左が Safari （CMAF）、右が VLC (MPEG-DASH) です。
<img width="640" alt="スクリーンショット 2019-10-21 12.54.053のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/484a92ca-d2dd-8a97-0ef4-7a3ce51bf8ab.png">

4K ディスプレイでフルスクリーンにしてもキレイですよ！

<img width="960" alt="スクリーンショット 2019-10-21 12.17.57（3）.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/48d608ad-1e34-e283-e4c6-09cb40e9dbdc.png">
シェルで変数とその内容を全部出力する方法

デバッグ時、エラー出力時に便利です。

引数なしのsetコマンドで全て出力されます。
`set`

Bashの場合は以下です。
`(set -o posix; set)`
POSIXと異なり、setだけだと変数に加え関数まで出力されてしまいます。
そこでPOSIXモードで出力すれば変数だけになる仕組みです。
Dockerのホスト側でmysqlのバックアップを取るsh

##環境
Docker

##準備
直接パスワード入れるのはアレなので、
設定ファイル作っておく。

また、docker-compose.ymlでボリュームとか設定する。
マウントしたホスト側のパスを後ほど指定する。

## シェル

```shell:doBacKUp.sh
docker exec {コンテナID} mysqldump --defaults-file=db.conf
{データベース名} --replace --add-drop-table > 
../migration/datastore/back19_10_18.dump

```

## 結果
このシェルスクリプトを実行してみると、先程指定したディレクトリとファイル名で生成された。
CVE-2019-14287　Sudo バージョンアップ

対応しなくてもよくね？って記事ばかりで、具体的に対応している記事なかったので備忘録

#Replace Code
```shell
# CentOS7
$ sudo rpm -ivh --replacefiles ftp://ftp.sudo.ws/pub/sudo/packages/RHEL/7/sudo-1.8.28-2.el7.x86_64.rpm
```

# Check Version
```shell
$ sudo sudo -V
Sudo バージョン 1.8.28p1
#以下略
```

参考サイト
>sudo コマンドの脆弱性 (CVE-2019-14287) について
>https://www.jpcert.or.jp/newsflash/2019101601.html

>Potential bypass of Runas user restrictions
>https://www.sudo.ws/alerts/minus_1_uid.html

>Download Sudo Binary packages
>https://www.sudo.ws/download.html#binary

>Linux技術トレーニング　基本管理コース I
>2-7. エラー時の例外処理
>https://users.miraclelinux.com/technet/document/linux/training/1_2_2.html
iOS 13以上でサイレントプッシュのdidReceiveRemoteNotificationが呼ばれない問題

# didReceiveRemoteNotificationメソッドがiOS 13以上で呼ばれない理由

特定の手続きをしないと、iOS 13以上でサイレントプッシュを使っている時に`AppDelegate`の`didReceiveRemoteNotification`が呼ばれないことがわかりました。

```Swift:AppDelegate.swift
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("PUSH arrived.")
    completionHandler(.noData)
}
```

サーバー側でヘッダーに`apns-push-type: background`を付けるか、もしくは以下のようにペイロードJSONの`aps`部分に空の`alert`を付けると、無事呼ばれるようになりました。

```JSON:body.json
{
    "aps": {
        "alert": {},
        "content-available": 1
    }
}
```

WWDC2019で発表された正式な方法らしい前者が理想ですが、もしサーバーがカスタムヘッダーをサポートしていない場合は後者のほうが簡単です。

## 注意点
ヘッダーに`apns-push-type: alert`を明示的につけていると、ペイロードJSONの内容に関わらずサイレントプッシュとみなされなくなり、`didReceiveRemoteNotification`が呼ばれないらしいので、気をつけましょう。

# 参考文献
* [iOS 13 beta 7 Silent Push Bug |Apple Developer Forums](https://forums.developer.apple.com/thread/121568)
* [iOS 13 and Xcode 11 Changes That Affect Push Notifications](https://onesignal.com/blog/ios-13-introduces-4-breaking-changes-to-notifications/)
  * APNS Priority must be set to 5 for background notifications
CircleCIでGAE/Go 1.12 へデプロイする

## やりたいこと
- GitHubにPushしたタイミングでGAEにデプロイする
- CircleCIを使って実現する

## circleci/gcp-cli @1.8.2 を使ってGAEへデプロイする
- [Orbクイックスタートガイド](https://circleci.com/orbs/registry/orb/circleci/gcp-cli)の通りやる

## CircleCI側の設定
- BUILD SETTINGS >> Environment Variables に環境変数を設定する必要がある

  - GOOGLE_PROJECT_ID
  - GOOGLE_COMPUTE_ZONE 
  - GCLOUD_SERVICE_KEY

- ServiceKeyはJsonをそのままValueにコピーする

```json
{
"type": "service_account",
"project_id": "[PROJECT-ID]",
"private_key_id": "[KEY-ID]",
"private_key": "-----BEGIN PRIVATE KEY-----\n[PRIVATE-KEY]\n-----END PRIVATE KEY-----\n",
"client_email": "[SERVICE-ACCOUNT-EMAIL]",
"client_id": "[CLIENT-ID]",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[SERVICE-ACCOUNT-EMAIL]"
}
```

## config.yaml

```yaml:config.yaml
version: 2.1
orbs:
  gcp-cli: circleci/gcp-cli@1.8.2

jobs:
  test:
    working_directory: ~/workspace
    docker:
      - image: circleci/golang:1.12
        environment:
          GO111MODULE: "on"

    steps:
      - checkout
      - run: go test -v ./...
      - persist_to_workspace:
          root: .
          paths:
            - .

  build:
    working_directory: ~/workspace
    docker:
      - image: circleci/golang:1.12

    steps:
      - attach_workspace:
          at: .
      - restore_cache:
          name: Restore go modules cache
          keys:
            - v1-dependencies-{{ checksum "go.mod" }}
      - run: go build ./api/main.go
      - save_cache:
          name: Save go modules cache
          key: v1-dependencies-{{ checksum "go.mod" }}
          paths:
            - /go/pkg/mod/cache
      - persist_to_workspace:
          root: .
          paths:
            - .

  deploy-develop:
    working_directory: ~/workspace
    docker:
      - image: google/cloud-sdk:latest

    steps:
      - attach_workspace:
          at: .
      - gcp-cli/initialize
      - run:
          name: Deploy to Google App Engine
          command: |
            gcloud --quiet app deploy ./api/app-develop.yaml --project=$GOOGLE_PROJECT_ID --version=$CIRCLE_BRANCH
workflows:
  version: 2
  build:
    jobs:
      - test
      - build:
          requires:
            - test
      - deploy-develop:
          requires:
            - build
```

## GitHub
- [今回のコード](https://github.com/DotaKobayashi/go-api-gae)
Splunk AppとAdd Onの違いについて

# はじめに
  SplunkのAppとAdd-on(Technology Add-on as "TA")の違いについて説明します。※筆者が独自調査した結果となり、Splunk社公式の見解は異なる可能性もありますので予めご了承ください。

# Splunk AppとAdd-Onとは

  Splunkに機能を拡張することができるコンポーネントのことをAppまたはAdd-onと呼びます。※1
  AppまたはAdd-onのフォルダ構成ルール(名称,階層,ファイル名)は厳密に決まっていますが、ルールの違いはありません。

  また、呼び名を変えるための明確な基準はSplunk社としては設けておらず、※2
  "何の"機能を追加するためのコンポーネントかによって、呼び名を変えているようです。
  ただし、AppとAdd-onに明確な基準は設けてないものの、AppとAdd-onで追加できる機能に以下の傾向があるようです。

- App
主にダッシュボードやレポート、ワークフローに関する機能を追加する。
  例: Splunk App for AWS,Lookup File Editor,Machine Learning Tool Kit(MLKT)

- Add-on
主にデータの取り込み設定(ソースタイプ定義,フィールド定義,標準的なデータの取り込みパスなど)
  例: Add-on for Amazon Web Services,Cisco Networks Add-on for Splunk Enterprise

## App/Add-onのサポートについて
  Splunk社の公式App/Addon配布サイトである"Splunkbase"は、App/Addonのダウンロードができるほかに、それらのサポートがどうなっているかを確認することができます。
  
  2019/10現在、3種類のサポートがあります。
  
1. Splunk Supported
    Splunk社が公式にサポートしているApp/Add-On。Splunk社とサポート契約を結んでいる場合、
    Splunk社にこのApp/Add-Onに関するサポートケースを投げることができます。
  
2. Developer Supported
    Splunk社以外のApp/Add-on開発提供パートナーがサポートを公表しているApp/Add-on。
    開発元パートナーにサポートを投げることができるようです。
  
3. Not Supported(≒Community Support)
    サポート外。コミュニティサポートと称される場合もあるようです。
    このApp/Add-Onに関して調査することになった場合は、
    自己責任でSplunk社公式コミュニティサイトで聞いてみる必要があります。

## App/Add-onの中身に関する基準について
   App/Add-onは自ら作成することができます。
   作成するApp/Add-Onについて、フォルダ構成/フォルダ名/ファイル名に厳密な基準が設けられており、基準に一致しない場合、適切にSplunkに機能が追加されない可能性があります。基準についてはSplunk社が公開しています。

   基準例:.confファイルがdefaultまたはlocalディレクトリにあること。

※1.アドオンはドキュメントによって"Add-On"と表記されていたり"Add On"と表記されていたり、
  はたまた"add-on"だったり表記ゆれがあるので微妙に注意が必要です。

※2.公式doc:There are no definitive criteria that universally distinguish an app from an add-on.

## 参考文献
- AppとAdd-onについて
https://www.splunk.com/ja_jp/products/apps-and-add-ons.html

- サポートについて
https://docs.splunk.com/Documentation/Splunkbase/splunkbase/Splunkbase/Appsupporttypes

- Splunk社公式App/Add-on配布サイト
https://splunkbase.splunk.com/

- App/Add-onの基準
https://dev.splunk.com/enterprise/docs/releaseapps/appinspect/appinspectreferencetopics/splunkappinspectcheck/

- 開発したApp/Add-onをSplunkbaseにリリースする前の承認基準
https://docs.splunk.com/Documentation/Splunkbase/splunkbase/Splunkbase/Approvalcriteria
Webクローリング / Webスクレイピング が無料、GUIでできる ( Power BI Desktop )

Power BI Desktop の Webスクレイピング技術がかなり向上している。無料、GUIノンコーディングで違和感なくWebサイトの内容をデータ化（しかもデータ変換まで）できるようになってきた。Power BIの場合、複数ページにまたがる抽出は Power Query で連続実行させる方法が良さそうだが、ページ数が少なければGUIの積み重ねで対応できることもある。
**単にURLを指定するだけでデータ化してくれる** ので、~~ITエンジニアの仕事削減、工数削減に寄与できる。😂~~
今回やってみたのはいくつかのECサイトだが、Amazonなんかは問題なくできた（流石にMicrosoftは主要なECサイトは機能のベンチマークしているだろう）。Yahoo地震速報のデータでやってみた結果がこちら（数値は数値型として自動認識までしてくれている）：
![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/2ed9d876-3c61-ad83-99e8-28979c0f91b4.png)
![Unknown-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/930d5ba8-ba82-e08c-0384-d6015926473d.png)
![Unknown-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/d8627948-4c12-3490-1a77-e3900d34e953.png)
![Unknown-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/eecb76b6-399e-76a0-75c9-04e66f62d0a6.png)
Titan セキュリティ キーが届いたので、2段階認証を設定してみた

# はじめに
Google の Titan セキュリティ キーが届いたので、Googleアカウントに2段階認証を設定してみました。
Titatn セキュリティ キーには複数種類がありますが、現時点（2019/10/24）で日本で購入できるのは「Titan セキュリティ キー バンドル」のみとなっております。
https://support.google.com/store/answer/2462844?hl=ja

あと勘違いしていたのですが、Titan セキュリティ キー（Bluetooth）を用いて**PCで**2段階認証を行う場合は、USB経由しかできないそうです。
Bluetooth経由で2段階認証できるのは、Android デバイス・iPhone・iPadのみでした。。。
https://support.google.com/titansecuritykey/answer/9115487?hl=ja

# セキュリティキーの登録手順
## 1. セキュリティキーの登録画面を開く
以下のURLを開き、セキュリティキーを利用したいアカウントを選択します。
https://myaccount.google.com/signinoptions/two-step-verification?flow=sk&opendialog=addsk

## 2. セキュリティキーの登録
セキュリティキーを登録するために、画面右下の「次へ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/6bb3794f-2386-2402-b3d4-866b41ee27d7.png)

## 3. セキュリティキーの接続
以下の画面が表示されたらPCにセキュリティキーを接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/2f4249a3-c861-c036-47c0-06d6ed801b5b.png)

## 4. セキュリティキーのボタンを押す
セキュリティキーについているボタンを押します。
USBタイプの場合は金色の丸い部分を押します。

## 5. ブラウザからセキュリティキーの情報を読み取れるようにする
以下の画面が表示されたら「許可」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/75e766f7-ea65-ec78-aa9a-dc20995dd4c1.png)

## 6. セキュリティキー名の入力
以下の画面が表示されたらセキュリティキー名を入力して「完了」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/8d2f02c7-655e-aec8-8d2d-868427eb51c5.png)



# 参考サイト
2 段階認証プロセスにセキュリティ キーを使用する
https://support.google.com/accounts/answer/6103523?hl=ja
bash > fileIO > 並列化 > ls + awk > 入力ファイルをINTVLとINDX指定で分割する > bashスクリプト v0.3

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
```

## 状況

- bashスクリプト(ImageMagickのconvertコマンドを実行する)を並列化したい
- 自作のlsで並列化用のファイルリスト分割をする


## v0.1, v0.2

- [bash > fileIO > 並列化 > ls + awk > 入力ファイルをINTVLとINDX指定で分割する > コマンド | bashスクリプト v0.1, v0.2 | brace expansionによる失敗](https://qiita.com/7of9/items/0e03dfba17ce77bc9f6d)

## v0.3

v0.2の場合、DIR/PREFIX*のようなアスタリスクで終わる場合には対応していたが、DIR/*.psのように後ろに文字指定したい場合には使用できなかった。

今回はBrace Expansionの結果を配慮して対応することにした。

- 1つ目と2つ目の引数は分割の指定用
    - 1つ目: インターバル
    - 2つ目: 開始インデックス
- 3つ目以降にファイルリストがある (Brace Expansionの結果)

### code

```bash:my_ls_skipped_191024_exec
#!/usr/bin/env bash

function myls_skipped()
{
	INTVL=$1 && INDX=$2 && echo $* | awk '{$1="";$2="";print}' | \
	xargs --max-args=1 | awk '(NR % '$INTVL' == '$INDX'){print $1}'
}

if [ $# -lt 3 ];then
    echo "[cmd] [interval] [start] [list of files]"
    echo "e.g."
    echo "[cmd] 4 1 *.ps"
    exit
fi

for elem in $(myls_skipped $*);
do
	echo $elem
done
```

実行分が長くなったので行連結とした。

- [2015-03-20 行連結 > C, C++ / bash / Fortran(固定形式) / Fortran(自由形式) > 行末コメントを"能"という文字で終わった時に失敗する | ハマり文字: 表、予、能、申、...](https://qiita.com/7of9/items/021bb0fa9443c2efc44b)

### 実行例

```shell 
$ bash my_ls_skipped_191024_exec 3 0 DATA/*.ps                               
DATA/tmp3.ps
$ bash my_ls_skipped_191024_exec 3 1 DATA/*.ps                               
DATA/tmp1.ps
DATA/tmp4.ps
$ bash my_ls_skipped_191024_exec 3 2 DATA/*.ps                               
DATA/tmp2.ps
DATA/tmp5.ps
```
Cloud Runでのカスタムドメインの設定方法(お名前.com) 

Cloud Runのカスタムドメインの設定の公式リファレンスだけでは、具体的なお名前.comとの連携方法がわからなかったため、その時の手順をまとめたものです。懸念していた既存のサブドメインの設定ルールやメールアドレスへの影響ですが、最終的にUIの指示に従えば特に問題なく完了できました。

今回はドメインに「site.lnkusu.work」をCloud Runの「st-my-site」に紐付ける形でまとめています。

## 事前準備

### お名前.comでの事前準備
お名前で紐付けたい何らかのドメイン(lnkusu.work)を取得済


### Cloud Run側の事前準備
カスタムドメインをCloud Runに紐づけるためには、先にCloud Runにアプリケーションを先に展開しておく必要があります。以下のような形で先にCloud Runにアプリケーションを展開しておいてください。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35291/1d2f20dc-acda-6d06-b454-91dd1fe82b89.png)

## 作業開始

### マッピングの追加(所有者の確認)

1. Cloud Runのトップページより、「カスタムドメインを管理」を選択
2. ヘッダーより「マッピングを追加」を選択

するとモーダルでマッピング選択画面が表示されます

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35291/cd45537b-9a85-8cd2-76d0-081f741daa16.png)

必要事項を入力します。

3. マッピングするサービスを選択 => 今回は 「st-my-site」
4. 確認済ドメインを選択し「Verify a new domain ...」 を選択
5. 検証するベースドメインに「lnkusu.work」を登録

必要情報の入力後画面

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35291/4628fafe-6209-b3b6-aedd-67129da2c00c.png)


6. ウェブマスターセントラルで確認を選択

ドメイン検証の確認するためのお名前.comの設定方法を確認するために、ウェブマスターセントラルに進む

### ウェブマスターセントラルでのお名前.comでドメイン所有者の確認

### ウェブマスターセントラル画面
1. ドメインプロバイダに「Onamae.com」を選択

### お名前.comの管理画面

2. お名前.comにログイン
3. すでに取得済みのlnkusu.workを選択
4. TXTに「google-site-verification=xxxxxxxxxxxxxx」を設定
5. 設定を完了させる

ウェブマスターセントラル側の画面スクショ

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35291/346e703b-da5d-9256-f4c2-0afa0be0ba29.png)

Google側で発行されたTXTの値をお名前側で設定が完了すると、最大1時間ほどで、Google側が所有者認定します。
所有者確認の確認方法は、ウェブマスターセントラル画面から「確認」を押したページ先で確認することが可能です。
所有者確認が完了したら、マッピング画面に戻り「my-site.lnkusu.work」の紐付けを行います。


### マッピングを追加画面(サブドメインの紐付け)

1. サブドメインを指定の入力欄に「my-site」と入力し「続行」を選択

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35291/08a0eb77-f5fa-d7b3-d3ef-76aa282d86e3.png)



2. お名前.com側で設定を行うDNSの設定項目が出力される

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35291/8fa5cfad-c90c-344c-0b2b-ce43fb89a58a.png)

3. お名前にログインする
4. マッピング画面で出力されたCNAMEの情報をお名前側の管理画面で設定する
5. 設定を完了させる
6. DNSの浸透をまつ(最大1時間ぐらい)


> ドメインが紐づくと、自動でSSLの証明書を発行してくれます。

site.lnkusuin.workにアクセスし、表示されていることを確認。

これで紐付けが完了しました。
ファイル名の最初の6文字だけ保持してrenameする


bmpファイルの最初の6文字を残す処理．

- forでファイル名のループ
 - for; do; doneでくくる（基本）
- `$i`がファイル名
- `${i:0:6}`で`$i`の0から6文字目を表す
 - 拡張子が固定だから`.bmp`を足す


```bash:
for i in *.bmp ; do mv $i ${i:0:6}.bmp ; done
```
NameValueCollerction からクエリストリング文字列を生成する

#クエリストリングとは
URL の後ろによくあるやつ
http://xxxxxxx.xx.jp?var1=val1&var2=val2
↑
? から後ろのやつ

#C#でどうやってつくるの？
System.Collections.Specialized.NameValueCollection を使って作れるよ！

#やってみた（ダメパターン）

```Sample.cs
var col = new System.Collections.Specialized.NameValueCollection();
col.Add("var1", "val1");
col.Add("var2", "val2");
Console.WriteLine(col.ToString());
```

よし、できたぞ！

・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136398/d4e12237-23f3-2cc5-471a-30781845f289.png)

あれ？？

#やってみた（成功パターン）
どうやら System.Web.HttpUtility.ParseQueryString メソッドで返却される NameValueCollection を使わないとうまくいかないらしい。
おそらく、返却される NameValueCollection は純粋な NameValueCollection ではないため（だと思う）。

```Sample.cs
string queryString = "";
var col = System.Web.HttpUtility.ParseQueryString(queryString);
col.Add("var1", "val1");
col.Add("var2", "val2");
Console.WriteLine(col.ToString());
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136398/db90adc5-3b9b-5e6f-670e-58a0699e8753.png)

OK！

#まとめ
気をつけようね。
JavaScript初歩知識2

# JavaScriptを書く
```js
    //main.js
    <script src="js/main.js"></script>
        window.onload=function(){
            //</html>までが終わった段階で自動的に動く
        }
        function fc(){
            //イベントが起きた時に動作する
            //<body>〜</body>の中
            <input type="button" onClick="fc()" />
        }
```
# DOMツリー
## DOMツリーって？
### DOM（Document Object Model）

- HTMLドキュメントの構造を記述するもので、これを使ってブラウザとのやり取りを行い、表示をコントロールする。

#### DOMのgetメソッド

```js
tx=document.body.from.input.value;
```
- DOMの一群には「getメソッド」が用意されており、これによりHTML要素を素早く指定することができる。(よく使われる一例。)
- ただし、idなので一つ一つ指定しなければならない。
## idを使った時

```js
tx=document.getElementById("tx1");
```
## classを使った時
```js
        <form〜>
            <input type="text" id="tx1" class="c1" />
            <input type="text" id="tx2" class="c1" />
    </body>
</html>
```
### classを使った場合は一気に取得できる。(c1を指定)

```js
tx=document.getElementsByClassName("c1");
                        tx[0]→id="tx1"
                        tx[1]→id="tx2"
```
## inputを指定

```js
tx=document.getElementsByTagName("input");
```
## これらを使ってgetmethod
```js
<input type="text" id="tx1" class="c1" name="c1" />
<input type="text" id="tx2" class="c1" name="c1" />
```

```js
tx=document.getElementsByName("c1");
```
___
### ツリー状に展開
- ドット(.)で繋ぐことで使用できる。(inputを入れなくて良い)

```
input   type
        value
        id
        name
        size
        style //<input type="text" style="height:15px;" />

```
- textboxをターゲットとする時,プログラムが動くとボタンになる。

```js
(ex)
document.getElementById("tx1").type="button";

                    .id="tx3";
                    .size="50";
                    .style.スタイルシートのプロパティを書く=値+"単位";
```
- ボタンを押すとtextboxの左余白が150pxになる

```js
document.getElementById("tx1").style.left="150px";
```
- ボタンを押すと文字色が緑になる

```js
document.getElementById("tx1").style.color="green";
```
- background-imageのような時マイナスと認識されないために

```js
document.getElementById("tx1").style.backgroundImage="images/p1.png";
```
【開発日記】薬価検索アプリno.3 〜設計・画面の設計〜

##出来上がりのサイト
薬価検索アプリmedipraはこちらです
→　[見に行ってみる](https://www.medipra.net)

前回の内容はこちら。
[【開発日記】薬価検索アプリno.2 〜設計・機能の洗い出し〜](https://qiita.com/pharma_tech3/items/ad8a92949f37b1e2fc6b)

開発背景などはこちら
[【開発日記】薬価検索アプリno.1 〜開発概要→企画〜](https://qiita.com/pharma_tech3/items/51c9a670c605098bc3bf)


##現在の進捗状況
1.必要な機能の洗い出し
2.必要な画面設計　⬅︎今ココ
3.データベース設計
4.Railsでアプリケーションの雛形作成
5.大きな機能から順に実装
6.テストコードを書いて動作を担保する
7.リファクタリングして整理する
8.デプロイ



#画面設計
今日は画面設計をしてみます。
開発するアプリケーションで必要な画面の設計をします。画面がどれだけ必要か、どのような画面にするかをこの段階で決めます。
一応、元ネタというか、参照サイトはこちらです
[薬価サーチ](https://yakka-search.com/)

大体は同じように実装してみようかと思います。

##ワイヤーフレーム
今回のアプリは画面設計から自分なので、せっかくなのでワイヤーフレームなるものもやってみようかと思います。

ワイヤーフレームを作る際に使えるツールはこちらによくまとまっていますのでどうぞ
[Webディレクターにオススメしたい！さくさくワイヤーフレームが作れちゃう便利ツールまとめ](https://ferret-plus.com/4155)

今回は、prottというサービスを使ってみます。
30日間は無料です。

#とりあえず作ってみました。
こういうの、考え始めると難しいですね。。。
まずはこの程度はMVPとして作りたい、という目標の意味も込めて。
[![Image from Gyazo](https://i.gyazo.com/8515c39885ddb9e82fb800243e40569f.png)](https://gyazo.com/8515c39885ddb9e82fb800243e40569f)

この辺は少しずつ改善していきます。


#prott
無料期間は30日間しかないですが、使い方は本当に簡単で楽なので、本格的にワイヤーフレームを作る必要が出てきたらぜひ使いたいです。

左サイドにはフォームボタンや、パンくず、ページネーションなんかもすでに用意してあって、そのままドラッグすればOK。
Webに合わせたものや、iOSに合わせたものも色々用意してあるので、なんとなく並べるだけでも十分それっぽくなる勢い。
[![Image from Gyazo](https://i.gyazo.com/a402b489c45ad670ad03e8c4f2fcfcfb.gif)](https://gyazo.com/a402b489c45ad670ad03e8c4f2fcfcfb)

画面右にはプロパティが表示され、文字の大きさ、背景色の変更などが行えます。
[![Image from Gyazo](https://i.gyazo.com/65b617775d7d11fb2b8741cf63bdd75c.gif)](https://gyazo.com/65b617775d7d11fb2b8741cf63bdd75c)



#まとめ・所感
こういうデザインとかって、サイトの目的や、誰が使うか、何を伝えたいのかなどがはっきりしていないと全く決まらない。
今の開発では既存サイトの改善版を作ろうとしているだけなので、自分で欲しいイメージがある程度はあるけど、全くのゼロからサイトを作ろうとしたら、本当に大変な仕事だと実感。
デザイナーさんありがとうございます。（一緒に働いたことないけど）


最後までおつきあいいただきありがとうございました。

次回、[]()に続きます。
デジタル(digital) って結局何？と聞かれて答えるのに困った件

#デジタルとはなんぞや？
とある企業のとある人からデジタルって結局何？あなたにとってのデジタルは？と聞かれて困った。Qiitaのタグでもデジタルマーケティング、デジタルトランスフォーメーション、デジタルコンテンツとかデジタルと名のつく用語やサービスが飛び交っており、結局デジタルの定義って何だ？と聞かれて即答できなかった。言葉が氾濫しているが故、整理できておらず周りの人に結局のところデジタルって何？って聞いて即答できない人が多いはずだ。私が最初答えていたのはデータとかシステム処理とかそんな回答だった。
その後、いろいろ考えてみたが私なりの結論としては「アナログではない」商品やサービスが無難な回答になることがわかった。
考えてみれば定義からして当たり前のことなのかもしれない。アナログではないという話でいけば例えばペーパーレスなんかもデジタルの事例だしアナログなマーケティングではないマーケティングがデジタルともつながる。アナログな作業方法やアナログな媒体でないものをデジタルとすればスコープはかなり広いことにも気が付く。だからデジタルという言葉がいろんなところに使われ何が何だかわからなくなっていた。Qiitaのタグにデジタルコンピューティングというものがあるが、アナログなコンピューティングなんてあるのか？誰か違いわかりますか？。。。
seabornで画像を保存する

# バージョン

seaborn: 0.9.0

# seabornで画像を保存する

seabornで画像を保存したい場合

```py
line_plot = sns.lineplot()
figure = line_plot.get_figure()
figure.savefig(save_path)
```

のように、プロットオブジェクトから図オブジェクトを取り出し、そしてそれを保存すると良いです。
【Ruby】attrメソッドとその仲間たち

attrメソッド

```
attr(name, writable = false)
```

第一引数nameにはインスタンス変数名
第二引数をtrueにすると書き込みも可能なメソッドを定義できる。

```使い方例.rb
class Book
 attr :title

 def initialize(title)
  @title = title
 end
end

book = Book.new("たのしいRuby")
puts book.title
=>"たのしいRuby"

この時点で以下を入れても書き込めないのでエラーとなる
book.title = "経営学入門"

```

```書き込みを定義した例.rb
class Book
 attr :title,true  #writable=falseのところをtrueにした！

 def initialize(title)
  @title = title
 end
end

book = Book.new("たのしいRuby")
puts book.title
=>"たのしいRuby"

#書き込み可能にしたので以下は問題なく動く
book.title = "経営学入門"
puts book.title
=>"経営学入門"

```

じゃぁ複数のインスタンス変数を読み書き可能にするには？？

```
attr :title, :price, true
```

とすれば可能か？
答えはどうやらNoである。

attr_accessorを使う

```使い方例.rb
class Book
  attr_accessor :title, :price
  
  def initialize(title, price)
    @title = title; @price = price
  end
end
 
book = Book.new("たのしいRuby", 2310)
puts book.title
  =>"たのしいRuby"
book.price = 2000 #priceの書き換え
puts book.price
 => 2000  #2310が2000に書き換えられた！

```


ついでに
attr_readerはインスタンス変数の読み出し専用
attr_writerはインスタンス変数の書き込み専用をそれぞれ定義します。
reason-react-nativeメモ

## [reason-react-native] とは

[reason-react-native]はその名の通り、[reason]を使って[react-native]のアプリを作成するためのBindingです。

## なぜreasonを使うのか？

reasonを利用することによって、以下のメリットを得ることができます。

- **型安全性**
- Ocamlを使うよりも慣れたSyntaxで書ける
- bundle サイズが小さい

## getting started

`react-native-cli` と reason-react-native の community が用意した templateを使ってプロジェクトを作成します。

```
npx react-native init MyApp --template reason-react-native-template
```

[reason-react-native]: https://reasonml-community.github.io/reason-react-native/
[reason]:https://reasonml.github.io/
[react-native]:http://facebook.github.io/react-native/
gensimのpoincare回すときの注意点（随時追加）

1. 学習データは2つのアイテムのタプル
例：AとBというアイテムがあったとき，
train_date = [(A, B)]

2. model.saveしたときに，指定したファイルとhoge.model.kv.syn0.npyが出力されるが，このよくわからんファイルは指定したファイルと一緒において置かないとPoincareModel.loadできない

3. gensimの各モデルのtrain時の引数には**workers**という使用するスレッドの数を指定する物がある．が，poincareにおいてはマルチスレッドでの学習が未実装であるため，数値を変えても意味がない

4．train時のbatchsizeがdefaultでは10のため，大きいデータだとちゃんと指定したほうがいい

思いついたら随時更新します．
MacからWindowsへのリモートデスクトップでJISキーボードを認識させる


最近業務でMacbook Proをメインで使い始めたのですが、デスクトップのWindows機も保持しており、Macからのリモートデスクトップで使用する構想でした。
しかし、いざリモートデスクトップ接続してみるとキーボードがUS配列として認識されてしまいました。(MacはJIS配列)

調べてみると昔からある現象のようで、Qiitaでもいくつかの記事がヒットします。

- [Mac からのRDP 接続で日本語キーボードを設定する](https://qiita.com/hidecha/items/33624f6ae57d41f3cd86)
- [Microsoft Remote DesktopでJISキーボードを有効にする方法](https://qiita.com/RYO-4947123/items/da880e53b2e8a493803a)

上記で紹介されているレジストリ変更や、クライアントの変更などの対処方法を実施してみたのですが、改善されず :cry: 

さらに調べていくと公式で説明があったので、共有します。

# 環境

今回の環境は以下の通りです。

- macOS Mojave 10.14.6
- Windows 10 Pro 1903 (OS ビルド 18362.418)
- Microsoft Remote Desktop 10.3.3(1667)

# 公式の回答

以下、 [Windows 10 RS4 へのリモート デスクトップ接続時に、UWP アプリへの入力時のみキーボード配列が異なる事象について](https://blogs.technet.microsoft.com/askcorejp/2018/06/08/rs4-rdp-keyboardlayout/) からの引用です。[^1]

[^1]: 記事内では`September 20, 2018—KB4458469 (OS Build 17134.319)`にて修正されたとのことですが、1903でも再現しました。

## 原因

コンソール接続の場合は、以下のレジストリにあるキーボードレイアウト`kbd106.dll`が利用されます。

```
パス: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters
名前: LayerDriver JPN
```

しかしながら、リモートデスクトップ接続の場合は、以下のレジストリにあるキーボードレイアウト`KBDJPN.DLL`が利用されてしまい、`kbd106.dll`とは異なるキーボード配列となります。(`KBDJPN.DLL`は現状英字配列を元としたレイアウトとなっています。)

```
パス: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411
名前: Layout File
```

## 回避策

先述の通り、本事象の原因は、`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411`から`KBDJPN.DLL`が読み込まれることが原因でございます。
そのため、このレジストリで指定されているキーボードレイアウトを別の値`kbd106.dll`に変更することで、事象を回避することができます。
なお、このレジストリを用いて本来の`KBDJPN.DLL`を利用している環境にも影響がありますので、ご注意ください。

1. リモート デスクトップ接続先コンピューター (Windows 10 RS4) に管理者権限のあるユーザーでログオンします。
2. Win + R キーを押し、[ファイル名を指定して実行] にて、`regedit`と入力し、[OK] をクリックします。
3. [レジストリ エディター] にて、以下のパスを展開します。
    `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411`
4. 上記パス内にある`Layout File`の値を`KBDJPN.DLL`から`kbd106.dll`に変更します。
5. OS を再起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97227/3f857b33-d515-ffe9-0e08-1a1ff4d66697.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97227/b5093aaa-d2aa-6e04-aa1d-0a1a721dde03.png)
XMLデータを連想配列に変換する手順

WordListの中にあるFuriganaデータを1つの変数に格納するため、Yahooのかな文字変換APIを利用する際に、返却されたデータがXMLだったので扱いやすいように連想配列にした。


https://developer.yahoo.co.jp/webapi/jlp/jim/v1/conversion.html

今回はGuzzleを使った。

1. APIからデータを取得
2. simplexml_load_stringでXMLデータをオブジェクトに変換
2. json_encodeを使ってオブジェクトからJSONに変換
3. json_decodeに第2引数にtrueを指定する事で連想配列に変換

```xml.php
//APIからデータを取得
$xml = $httpClient->get(self::API_BASE_URL, [
                    'query' => $query
                ])
                ->getBody()
                ->getContents();                

// XMLデータをオブジェクトに変換
$object = simplexml_load_string($xml);

//オブジェクトをJSONに変換してから、連想配列に変換
$array = json_decode(json_encode($obj), true);

```
#Ruby の begin end while で 変数代入なしでループ処理する ( 後方 while )

# 例

- a に 10が代入されるまでランダムな値を代入し続ける例。
- 何回も処理を繰り返して a == 10 になったタイミングでループを抜ける。
- while は必ず1回は実行されて a 変数が定義される。コード的には後方にあるけど最初に評価される。後方 if とかと同じノリかな。
- begin rescue での例外キャッチの処理とは全く関係ない。たぶん。キーワードは似ているけれど。

```rb
i = 0

begin
  a = rand(99)
  i += 1
end while a != 10

a # 10
i # => 156
```

# どういうこと？

- これとだいたい同じ。

```rb
a = nil

while a != 10
  a = rand(99)
end

p a #10
```


# whileだけじゃ無理なの？

- a を定義していないと未定義エラーが起こる。
- 最初に a  = nil とか定義しておくのと同じ。

```rb
while a != 10
  a = rand(99)
end

# NameError: undefined local variable or method `a' for main:Object
```

# while とは違い、必ず一回は実行されるっぽい

```rb
begin
  puts :a
end while false

# a
```

# begin rescue end とは違うの？

例外をキャッチしたいわけではないらしい。そもそも rescue って書いてないし。

```
begin
  raise
end while true

# RuntimeError:
```


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【働き方改革】Microsoft Bookings で面談日時調整画面を作ってみた フリーランスや転職のスケジュール管理 (O365の予定表空き時間共有したい人必見)

Microsoft Bookings に関する日本語の資料をまだほとんど見かけない。お店の予約ツールを考えてしまうと多数ありこのツールのメリットはなさそうだが、すでにO365で管理している企業のスタッフまたは個人のスケジュールと自動連動させる目的ではこちらのツールが非常に良さそう。セルフサービス型予約システムで対外的にやり取りするに意外に便利だったので活用事例を共有します。私自身自らのスケジュールをO365で管理しており、O365 Business Premium を契約しています。Outlookの予定表でスケジュール管理しています。このBookingsですが、お店の予約システムを考えるとGUIの表現や情報が不十分でうーんと悩んでしまいますが、便利に利用が想定できる活用例として
（１）個人がお客様や企業に対してスケジュールを公開して予約を入れてもらいたいパターン
（２）企業が企業に対してまたは個人に対して予約を入れてもらいたいパターン
が考えられ、O365上の自分の/企業の空きスケジュールに自動反映できれば大変スケジュール管理が楽になります。典型的な応用パターンとして面談日時調整があります。
#面談日時調整
転職やフリーランス業務の面接日程調整で面倒なのは候補日時を事前に複数確保し相手方に伝え、相手方の返答を待つまで候補日時で良いのかどうかもわからず別の日時の提案があれば事前確保していた時間が無駄になることもありますし、これらの一連の登録、取り消しに労力がかかることが１番の問題です。移動時間や準備時間を考慮しなければならず、予約がないからと言って連続した打ち合わせを入れることが現実的でないこともあります。このような点を自動考慮しリアルタイムに近い形でOutlookの予定表の空き時間に相手方に確認し欲を言えば予約までしてもらえてOutlookに自動反映されれば自ら面談日時調整に手足を動かす必要がなくなります。

Microsoft Bookingsでできたこと：
（１）Outlook予定表の空き時間を示し対外的な人が（ユーザー認証をあえてさせることなく、またはMicrosoft認証をさせることもできる）スケジュールを登録、変更できOutlook予定表に自動連動させる（若干のタイムラグがありますがほぼリアルタイム）。
（２）登録できるタイムスロットは事前に定義しておき、価格も提示できる（ただし決済機能はないし・・・使う人いるの？）。例えば１時間面談、１.５時間面談、２時間面談を０円で３つ作成しておき、対外的な人はこれらを選択してOutlookの予定表に登録や変更ができる。前後に必要となるバッファー時間は種類（Bookingsではサービスという名前）毎に変えられる。
（３）対外的な人には対応可能時間の候補のみ表示するので、それ以外の情報がどうなっているかは見えない（Outlook予定表を直接公開しているわけではない）。
（４）何日先まで予約可能か決めることができる（例えば常に1月先まで）。

転職を考えるとした場合（私が今考えているとは限りませんよ😁）、平日の例えば朝か夕方以降のプライベートな時間のみ対応可能時間にしておくか日中も連続して可能時間にはしておくが仕事などの予約で時間帯を自ら押さえれば自動でその時間帯は予約できなくなるので便利。いくつか候補日時を提示しお互いダメというやり取りではなく、親切に一つは提示するがそれ以外であれば公開している空き時間を確認して頂けないかと言ったやり取りも可能（というか私がしていたりします😁）。
予約をした人にOutlookの会議通知を自動送信できるのですが、
うざいと思われるのは嫌なので、私は送信はしないようにしています。😁
電話で日時即決ならともかくメールの送受信でエージェントを介して面談日時調整。。。って本当に今までしんどかった。
　
#実際の画面例：
![Bookings画面の例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/70f06b19-b04f-8f24-d5b5-5aef1d0175ff.png)
![Bookingsサービス例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/bc8100b6-70c8-f871-f721-21102864716b.png)
【備忘録】64Bit環境において32Bitで提供されているCOMライブラリ（ScriptControlなど）を実行する方法

## はじめに
スクリプトをWindows環境で実行するときにエラーになって実行できなかった。32Bitで提供されているCOMライブラリを64Bit版で実行していたのが原因。その解消方法の一つとして以下のコマンドで解消できたので備忘録としてそれを記します。

## 実行コマンド

`C:\windows\SysWOW64\CScript.exe 実行したいファイル`

## なぜエラーになる？
これは64Bit環境にいて実行したときに、そのスクリプト内で32Bitでしか提供されていないCOMライブラリを使っていた。（自分の場合は `ScriptControl` ）

## SysWOW64とは
32Bit版のdllが格納されている。フォルダ名がややこしい。
Windows on Win64の略だとか。。
GCP アップデート (10/18-10/24 2019)

### Composer: [Oct 18, 2019](https://cloud.google.com/composer/docs/release-notes#October_18_2019)
- 新しいバージョンが出たよ。(composer-1.7.9-airflow-1.9.0, composer-1.7.9-airflow-1.10.1, and composer-1.7.9-airflow-1.10.2)
  - デフォルトはcomposer-1.7.9-airflow-1.9.0に。
  - Bucket Policy Only、作成時のゾーン選択、Private IPあたりで改善/バグフィックス。

### GKE: [Oct 18, 2019](https://cloud.google.com/kubernetes-engine/docs/release-notes#october_18_2019)
- バージョンアップデートのお知らせ。
  - 1.12.xは1.13.7-gke.24にアップグレードされるよ。
  - 1.14.6-gke.0以下は1.14.6-gke.1にアップグレードされるよ。

### Istio: [Oct 22, 2019 ?](https://cloud.google.com/istio/docs/istio-on-gke/release-notes#istio_127-gke0)
- Istio 1.2.7へアップデート。
  - 内容は主にDoSされる[CVE-2019-15526](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15226)とその他バグフィックス。

### Compute: [Oct 21, 2019](https://cloud.google.com/compute/docs/release-notes#october212019)
- インスタンスごとのPDに対する書き込みスループット向上。
  - zonalとregionalでスループット異なる。(regionalだとPDもSSDも書き込み性能は一緒。)
  - zonal PD: 76-240MB/s, regional PD: 38-200MB/s, zonal SSD: 76-400MB/s, regional SSD: 38-200MB/s。

### Compute: [Oct 22, 2019](https://cloud.google.com/compute/docs/release-notes#october222019)
- インスタンスに最大257TB PDをアタッチする機能がGAになったよ。
- SSDに100K read IOPS発行できるようになったよ。

### BigTable: [Oct 14, 2019 日付不正？](https://cloud.google.com/bigtable/docs/release-notes#October_14_2019)
- Admin Activityの監査ログがGAになったよ。

### BigQuery: [Oct 23, 2019](https://cloud.google.com/bigquery/docs/release-notes#October_23_2019)
- APIの名前がbigquery-json.googleapis.comからbigquery.googleapis.comになるよ。
  - 現状API利用している場合はすでに切替可能で、2019 11月-12月に切り替わる予定。
  - というかなんで-jsonついてたのかよくわからん。。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
R エラーノート

Rのプログラムを実行しようとして起きたエラーをここに記します。
## 1. rJava packgeが読み込めない
### エラーメッセージ
```r
> library(rJava)
Error: package or namespace load failed for ‘rJava’:
 .onLoad failed in loadNamespace() for 'rJava', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so':
  dlopen(/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: @rpath/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so
  Reason: image not found
```
### 解決法
このエラーはjavaのアップデートをした後にRとjavaの設定が噛み合わないために起こるエラーのようです。
以下のコマンドを実行することで再設定を行います。

```shell
sudo R CMD javareconf
```
#### 参考リンク
https://github.com/rstudio/rstudio/issues/2254
# 2.detachが動かない
```r
detach("name")
```
上のようなコードを実行しようとした結果、下のようなエラーが起きて止まることがあります。
### エラーメッセージ
```r
Error in detach("name") : invalid name argument
```
### 解決法
このエラーは複数のバージョンのpackageが一度にロードされたときに起こるエラーのようです。
`deatch`の代わりに以下の関数を設定、実行することで対処します。

```r
detach_package <- function(pkg, character.only = FALSE)
{
  if(!character.only)
  {
    pkg <- deparse(substitute(pkg))
  }
  search_item <- paste("package", pkg, sep = ":")
  while(search_item %in% search())
  {
    detach(search_item, unload = TRUE, character.only = TRUE)
  }
}
# 使い方1
detach_package(vegan)
# 使い方2
detach_package("vegan", TRUE)
```
#### 参考リンク
https://stackoverflow.com/questions/6979917/how-to-unload-a-package-without-restarting-r

# 3.packageがインストールできない
R 3.5.0未満のRでかかれたコードにある `biocLite.R`によるpackageインストールはR 3.5.0以降で実行すると失敗する。

```r
source("https://bioconductor.org/biocLite.R")
biocLite("gpls")
```
### 解決法
R 3.5.0以降に対応したコードに変更することで対応します。

```r
install.packages("BiocManager", repos = "http://cran.mirror.garr.it/mirrors/CRAN/")
BiocManager::install("gpls")
```
#### 参考リンク
https://bioconductor.org/install/
https://qiita.com/manabuishiirb/items/88fb9d5207e6802da4b7
iPad上のSafariでアップルペンシルの座標検知精度が低い問題

これはWebブラウザ上で動くお絵かきソフトの作成過程でぶつかった問題です。
回避策が無いかと試行錯誤を繰り返して頭がこんがらがってきたので、整理と共有の為に書きました。
私はブラウザアプリ開発についてはど素人なので、根本的な勘違いをしているかもしれません。
識者の方がいましたらご指摘お願いします。

# 一般的なペンタブレットの座標精度
デジタルお絵描きには欠かせない、ペンタブレットや液晶タブレットというものがあります。
タブレットの座標検知はとても精密で、一般的には画面上の1ピクセルの10分の1以下という細かい精度で座標を知ることができます。
コンピュータで絵を描く上では、この座標精度がとても重要です。

# アップルペンシルの座標精度
ネイティブアプリに関しては、高精度な座標検知APIがあるようです。
https://qiita.com/usagimaru/items/69b3acfa251f7d191334

# Safari上でのアップルペンシルの座標精度
ここが本題。
少なくとも標準的なWebサイトの作り方では、アップルペンシルの座標精度が十分には発揮されませんでした。
画面解像度が1536x2048pixelのiPadで試したところ、座標精度は768x1024程度のようです。

Webブラウザ上でのアップルペンシルの座標検知精度は、CSSピクセル単位に丸められているのではないかというのが私の推測です。
(2019/10/24: iPadOS 13.1.3で実験しました)

# 精度低下を回避するために試みた事

### Viewportの設定を書き換える
`<meta name="viewport" content="width=device-width, initial-scale=0.5">`
htmlに上記の設定を書いてみると、画面の物理ピクセル単位の座標検知が行えるようになりました。
しかしこれだと全ての画面上の表示要素が2分の1サイズになってしまいます。
スライダー等コントロール要素を含めて元の大きさで表示するために、
.style.transform = 'scale(2,2)';
このような記述を追加し、2倍に拡大することで対処しました。
(拡大することで、UIの表示は荒くなってしまいます)

### Appleさんお願いです！Webブラウザ上でも小細工いらずで高精度な座標検知ができるようにしてください！

# 実験中のブラウザお絵描きアプリのURL
https://minordaimyo.net/8bitpaintweb/
表面的なComposerの依存について

## 目次
 - composerとは？
 - 依存について
 - install・updateについて

## composerとは？
PHPのパッケージ管理システムである

**できること**

- gitやsvn上のPHPライブラリ(パッケージ)を依存として定義＆管理（インストールやバージョン確認）
- クラス・インターフェイスの自動ロード(オートローディング)

今回メインで説明するのは上の方。

## 依存について

composer使う理由として、パッケージの依存管理が容易になるというのはかなりあると思うのですが、別にcomposer使わなくてもパッケージ依存管理はできるわけで、、、
使用しない場合と使用する場合でどれだけ違うかというと以下。

### composerを使用しない場合とする場合
**使用しない場合**
composerを使用しない場合、必要なパッケージ（PHPライブラリ）をインストールするために、各パッケージが管理されているリポジトリ(gitやsvn)にアクセスし、zipファイル等をローカルにダウンロードし、それらをローカルで展開し、vender/以下に配置する。
仮に、パッケージが他のパッケージに依存している場合、依存しているパッケージに対しても上と同じことを行う。

**使用する場合**
composerを使用する場合、必要なパッケージ（PHPライブラリ）をインストールするために、composer.jsonに文法通り（[公式](https://getcomposer.org/doc/04-schema.md)や[日本語記事](https://qiita.com/suke/items/770bccf8a43f9247daf5)を参考）の書き方でパッケージ名とバージョンを記載するだけで、上記で行ったことを全てcomposer側がよしなにやってくれる。
仮に、パッケージが他のパッケージに依存していた場合でも、composerが自動で依存解決を行い、自動で必要なパッケージを取得し＆vernder/以下に配置してくれる。

**まとめ**
上で見ても分かるように、composerなしでパッケージをインストールしたり、依存解決を行うのは、莫大な時間がかかり、普段の業務レベルで言うと、ほぼ不可能に近いので、基本的にパッケージ管理を行う際は、composerを使うことになる。
では、実際にcomposerを使ってパッケージを管理するためにはどうすればいいのか？？
ここで登場するのがinstall・updateコマンド。

## install・updateについて

- installは、パッケージを取得する。
- updateは、パッケージのバージョン更新する。

簡単に言えばこんな感じ。
さすがに簡単に言い過ぎたので、ちょっとだけ踏み込んでみると、、、

### install
まず、composer.lockの存在チェックを行う。

**存在する場合**
composer.lockに記載されている、全パッケージを指定通りのバージョンで取得する。

**存在しない場合**
composer.jsonの「require」に記載されているバージョンのパッケージと依存している（そのパッケージが動くために必要な）パッケージが[Packagist](https://packagist.org)というcomposerで取得できるパッケージを管理している中央リポジトリに存在するか見に行き、存在すれば取得、存在しなければcomposer.jsonの「repositories」に登録されているリポジトリを見に行き、取得する。
パッケージ取得後、composer.lockを作成し、取得したパッケージと依存パッケージのバージョン情報を記載して保存する。

### update
composer.jsonの「require」に記載のパッケージをPackagist若しくはcomposer.jsonの「repositories」記載のリポジトリに見に行き、最新のバージョンが存在すれば、そのパッケージと依存パッケージを最新のバージョンに更新する。
取得パッケージのバージョンに変更があった場合、変更に合わせてcomposer.lock記載のパッケージのバージョンも変更される。
Smart keyboardで変換がローマ字になる

最近iPad ProとKeyboard Folioを買って調子良く使ってたら、なぜか変換の第一候補にローマ字が出る事象に遭遇。

![59FE4A09-8CB8-4E78-9338-D0E3DF741F04.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341017/60434ce6-cdf2-9c2a-091b-f9109d774882.jpeg)

答え：左下の「CapsLock」キーを押せ

以上。

最初はこの挙動がデフォルトなのかと思いなんとかスペースキー連打で対応していたものの、やはり使いづらくて「あのApple様がこんな仕様にするわけ…」と思い、あれこれキーを押してたら発覚。

MacだったらCapsLockが有効の時ってLEDでわかったけど、
Smart Keyboardって有効か否かの判別がハード上ではわからないから
プチハマりしたので記事に起こしておきます。
GoでMap(map[string]interface{})を結合する

Goで`map[string]interface{}`を結合したいとき、 `mergo` ライブラリを使うとシンプルに結合できる。


https://github.com/imdario/mergo


# map[string]interface{} を使う場合
```
m1 := map[string]interface{}{
    "a": 0,
    "b": 1,
}
m2 := map[string]interface{}{
    "a": 2,
    "c": 3,
}
mergo.Merge(&m1, m2)
```
```
// Will print
//map[string]interface {}{"a": 0, "b": 1, "c": 3}
```

`mergo.Merge`の他に、 `mergo.MergeWithOverwrite` などもあるが略。


# struct を使う場合
デフォルトの方法

```
type Foo struct {
	A string
	B int64
}

func main() {
	src := Foo{
		A: "one",
		B: 2,
	}
	dest := Foo{
		A: "two",
	}
	mergo.Merge(&dest, src)
```
```
// Will print
Foo{
  A: "two",
  B: 2,
}
```
Hello Qiita

プログラミングの勉強を始めて２ヶ月となります。
勉強を始めた頃から、Qiitaの記事に上げたりアウトプットはしたいなと思ってました。
しかし自分の中で、ネットに記事を上げるということが、どうもハードルが高いです。
そこで、まずはプログラミングを始めるときに良く使う、「Hello World」と同じように
 「Hello　Qiita」として、Qiitaの始め方について調べながら書いてみようと思います。

## このページを見て、出来るようになること
- Qiitaの記事を投稿できる。



## このページの目次
1. Qiitaのアカウント登録　（既に済んでいる方は飛ばして構いません）
    - 登録方法の選択
    - 興味のある分野のタグのフォロー
    - メールアドレス認証


2. 記事の投稿
    - タイトルの記入
    - タグ付け
    - 本文
        - マークダウン記法
        - 画像投稿方法（Gyazo)



### Qiitaのアカウント登録
もう登録が済んでいる方は、記事の投稿方法に読み飛ばしてもらって構いません

[Qiitaのユーザ登録画面](https://qiita.com/signup?redirect_to=%2F)でユーザ登録をしましょう

上記リンクに飛ぶと下記のような画面が表示されます。
Github・Twitter・Google・メールアドレスのいずれかで登録できるようです。
私はGithubで登録しました。



[![Image from Gyazo](https://i.gyazo.com/d53c8d3a41997b35baa269a3e234ecdf.png)](https://gyazo.com/d53c8d3a41997b35baa269a3e234ecdf)

興味のある分野のタグをフォローしましょう。と出てきました。
これはお好みのものをフォローしましょう。もちろん後で変更もできるので、一旦は適当でもいいと思います。

[![Image from Gyazo](https://i.gyazo.com/195a51a09d0783a5533964d784c49355.png)](https://gyazo.com/195a51a09d0783a5533964d784c49355)



投稿をしようとすると、メールアドレス認証をしましょうと出てきます。
ここの画像を撮るのを忘れてしまいました。。。
そして一回したら表示されなくなった。。当たり前ですね。申し訳ございません。
「メールアドレス認証はこちら」というのを押したら、登録のメールアドレスに認証メールが届くので、認証しましょう。

これで、登録が完了しました。
Twitterアカウントの紐付けや、他の詳細プロフィールも登録できますが、ここでは説明は省きます。



### 記事の投稿

Qiitaのアカウントを登録すると、ページ右上に　「投稿する」ボタンが出てくるようになります。

[![Image from Gyazo](https://i.gyazo.com/bd290f2254d7540c9eb97dabd41520c4.jpg)](https://gyazo.com/bd290f2254d7540c9eb97dabd41520c4)


投稿するボタンを押すと下記のような画面が出ます。
画面では既に記入してしまっていますが、「Hello Qiita」の部分が、記事のタイトル
その下の`HelloWorld HelloQiita Qiitaの始め方 output 投稿方法` が、記事に関連するタグです。

[![Image from Gyazo](https://i.gyazo.com/424ec96da765f02785479a57bebd5cd6.png)](https://gyazo.com/424ec96da765f02785479a57bebd5cd6)



#### マークダウン記法
多分、この言葉が苦手な人がいると思います。ちゃんと＃入れてるのに文字が大きくならない！とか
少なくとも俺は苦手です。
思うように反映されない！と思ったらまずは前後に変なスペースがないかを確認しましょう。
Qiitaでは丁寧に、しかもコピペできるように用意してくれてます。色々試してみましょう。

[![Image from Gyazo](https://i.gyazo.com/95153df1f33d219aef8de9c3148c9974.png)](https://gyazo.com/95153df1f33d219aef8de9c3148c9974)

#### Gyazoでの画像投稿
この記事で使っている画像は全部[Gyazo](https://gyazo.com/download)で登録しています。
上記リンクでダウンロードをしましょう。[Gyazoの基本的な使い方](https://support.gyazo.com/hc/ja/sections/201503373-%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9)

マークダウン記法で載せたい場合は画像を撮った後に出てくるページで、シェア→Markdownのリンクをコピー→出てくるURLをそのままコピペで貼り付け　で出来ます。
[![Image from Gyazo](https://i.gyazo.com/b84b21e599c1c7596f48f7bdc84040af.jpg)](https://gyazo.com/b84b21e599c1c7596f48f7bdc84040af)

#### 最後に

少しでもQiitaの記事が書ける人が増えることを願って、この記事のマークダウン記法を外した状態の文章を置こうと思いましたが。<div>をつけたら改行も外されて逆に読みにくくなったのでやめておきます。今後何かいい方法があれば見つかったら貼ってみようと思います。なるべくシンプルというか、適当にしてるので、これを見たらいくらかハードルは下がると思います。

見つけました。投稿の一番上の・・・で、「Markdownで本文をみる」というので見れるんですね。今後は他の人の投稿を見ながら、マークダウン記法の勉強もしてみようと思います。
[![Image from Gyazo](https://i.gyazo.com/7965367d03b0d77b6221461ecda873cd.jpg)](https://gyazo.com/7965367d03b0d77b6221461ecda873cd)
統計検定1級合格を目指して

# はじめに
東京大学3年の学生です。授業で統計をちょこちょこやってきたのですが、この際本格的に勉強したくなり統計検定に申し込むことにしました。本番の11/24までちょうど１ヶ月となったタイミングでの投稿です。自分の記録用。
Ruby 入門＃３（配列）

Rubyの勉強アウトプット
今回は、配列について記載します。

##定義
配列名 = [要素,要素,…] と定義します。
要素番号は0から始まります。
要素を取得、変更したい場合は配列名[要素番号]と指定します。

```
names = ["田中","加藤","佐藤"]
puts names[1] # => 加藤
names[1] = "宮城"
puts names[1] # => 宮城
```

##追加
push、<<を使い、末尾に追加

```
names = ["田中","加藤","佐藤"]

names.push("太田")
puts names[3] # => 太田

names << "大谷"
puts names[4] # => 大谷

```

##削除
削除するメソッドは複数ありますが、今回は
「delete」、「delete_at」メソッドを紹介します。

**delete**
引数に削除する要素を指定して削除します。

```
numbers = [1,2,3,1,4]
numbers.delete(1)
p numbers # => 2,3,4
```

**delete_at**
引数に削除する要素番号を指定して削除します。

```
numbers = [1,2,3,1,4]
numbers.delete_at(1)
p numbers # => 1, 3, 1, 4
```

##配列メソッド
配列のメソッドから、
「each」、「length」、「empty」メソッドを紹介します。

**each**
配列の要素をブロックパラメーターに順番に入れ、参照することができます。

```
配列名.each do |ブロックパラメーター|
end
```
と記述します。

```
names = ["佐藤", "太田", "中田"]
names.each do |name|
  print name + ","
end
# => 佐藤,太田,中田,
```

**length**
配列の要素数を調べることができます。

```
names = ["佐藤", "太田", "中田"]
puts names.length # => 3
```

**empty**
配列が空かどうかを調べる

```
names = ["佐藤", "太田", "中田"]
puts names.empty? # => false

fruit = []
puts fruit.empty? # => true
```