OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 18.04上のDockerでコンテナのベースサイズを自在に変える

# 関連記事
- [Docker on CentOS7で特定コンテナの容量制限を柔軟に行ってみた
](https://qiita.com/haniokasai/items/b736604a78506411d2fc)
- [CoreOSでdockerのbasesizeをかえる。](https://qiita.com/haniokasai/items/b34c0e1faaf8c4b5d2dd)
- [dockerでpquotaを有効にする](https://qiita.com/haniokasai/items/805328aec39137e671b3)
- [Dockerで特定のコンテナサイズを自由に拡張する設定する devicemapper編](https://qiita.com/haniokasai/items/2b7a1889e4930b7682c9)
#環境
Ubuntu Mate 18.04 on VBox on Windows 10
インストール時に

- /boot をext4でフォーマット
- / をxfsでフォーマット

#Docker info

```
# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.09.7
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
```
#無設定時
```
#  docker run --storage-opt size=5g -t -i ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
^[[2~latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest
docker: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option.
See 'docker run --help'.
```

#grubの編集
```
vi /etc/default/grub
```
GRUB_CMDLINE_LINUX に　"rootflags=uquota,pquota" を追加。

```
sudo grub-mkconfig -o /boot/grub/grub.cfg
```

```
docker run --storage-opt size=5g -t -i ubuntu /bin/bash
root@67f434ee5ab8:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         5.0G  8.0K  5.0G   1% /
tmpfs            64M     0   64M   0% /dev
tmpfs           2.8G     0  2.8G   0% /sys/fs/cgroup
/dev/sda5        55G  8.2G   47G  16% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           2.8G     0  2.8G   0% /proc/asound
tmpfs           2.8G     0  2.8G   0% /proc/acpi
tmpfs           2.8G     0  2.8G   0% /proc/scsi
tmpfs           2.8G     0  2.8G   0% /sys/firmware
root@67f434ee5ab8:/# 
```

サイズが変わった。
【Ubuntu 18.04 LTS】システムモニターの起動に失敗するときの対処法【/var/logのすすめ】

Ubuntuで「システムモニター」という標準のGUIアプリを立ち上げようとしたら，
起動に何度も失敗して，開けない状態になったので，がんばって修復してみる．

というわけで，早速ログを確認してみることに．

nautilius（ファイル）を開き，```Ctrl+L```でアドレスバーにフォーカスし，以下のパスを打つ．

```
/var/log
```


そうすると，以下のようなフォルダが開くのでその中から「syslog」というファイルを開く．

![Screenshot from 2019-07-01 22-21-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230846/5a3ae7d0-69b8-287c-ca56-dc9573025b7a.png)


下の方までスクロールして，頑張って探すと以下のようなログが見つかる．

```
Jul  1 22:01:49 username-Computername gnome-system-monitor_gnome-system-monitor.desktop[3179]: You need to connect this snap to the gnome platform snap.
Jul  1 22:01:49 username-Computername gnome-system-monitor_gnome-system-monitor.desktop[3179]: You can do this with those commands:
Jul  1 22:01:49 username-Computername gnome-system-monitor_gnome-system-monitor.desktop[3179]: snap install gnome-3-28-1804
Jul  1 22:01:49 username-Computername gnome-system-monitor_gnome-system-monitor.desktop[3179]: snap connect gnome-system-monitor:gnome-3-28-1804 gnome-3-28-1804
```

という訳で，上の指示通り，

```
snap install gnome-3-28-1804
snap connect gnome-system-monitor:gnome-3-28-1804 gnome-3-28-1804
```

その後，コンピューターを再起動したら直りました．

勿論，今回とは違う指示が出てることもあるので，<br>syslogにはしっかりと目を通しましょう．

しかし，いつどのタイミングでgnomeのパッケージが壊れたのだろうか…

ようは何が言いたいかというと，<br>Ubuntu関係で，何か困ったことがあったときに```/var/log```は便利なので覚えておくと良いかもってことです．
USB On-The-Goについて

USB On-The-Goについてのメモ

#USB On-The-Goとは
1つのUSB機器がHostとDevice両方の役割を果たすために作られたUSBの規格である。

#HNPとSRPについて
##Host Negotiation Protcol(HNP)
OTGデバイス同士の役割を交代するときに使用される。
最初のエニュメレーションの時にはホストは通常通りにデバイスをエニュメレーションする。
OTGとして認識する手順は以下。
この時、Aコネクタ及びミニAコネクタで接続されている機器が最初はホストとして認識され、その片割れがデバイスとして認識される。
1. ホストはエニュメレーションの時に、デバイスからのOTGディスクリプタからHNPをサポートしているかどうかを確認する。
2. デバイスがHNPをサポートしていれば、ホストはhnp_enableというリクエストコードを使ってSet_Featureリクエストを送る。
3. このリクエストを受け取れば、デバイスはバスがサスペンドしているときにホストとして機能できるようになる。

この後にデバイスがホストとして動作するには、以下の手順が必要。(元々ホストとして認識された機器を機器A、デバイスとして認識された機器を機器Bとする。)
1. 機器Aがバスをサスペンドさせる
2. Full Speedの場合、機器BがD+のプルアップをオフにして、バスの接続を解除。High Speedの場合は、機器Bが1-147msの間D+の抵抗をオンにしてから、抵抗をオフにする。そうするとバスがSE0ステートになる。
3. 機器AがSE0ステートを検知し、D+の抵抗をオンにすることで、デバイスとして接続しなおす。そうすると、バスがJステートになる。
4. 機器BがJステートを検出し、バスをリセット。
5. 機器Bが機器Aをエニュメレートして通信ができるようになる。

その後、機器Bがデバイスとして戻す場合は以下の手順
1. 機器Bはバスをサスペンドさせ、プルアップ抵抗をオンにする。
2. 機器Aはサスペンド状態を検出して、プルアップ抵抗をオフにする、またはセッション終了のため、Vbus電源を落とす。
3. ステップ1において、機器Bがプルアップ抵抗をオンにしなかった場合は、機器Bはこの段階でプルアップ抵抗をオンにして、ペリフェラルとして接続する。この時バスがJステートとなる。
4. Vbusがある場合、機器AはJステートを検出し、バスをリセットする
5. 機器Aは機器Bをエニュメレートし、通信ができるようになる

##Session Request Protcol(SRP)
ホストがSuspend状態になっているときに、セッションの再開を要求するための通信に使われる。
古いノーパにWindows98SEをインストールしたメモ

# 1.用意したハード
昔メインに使っていた、MSIのMS-1013WというノートPCのベアボーン。
ノートPCのベアボーンキットは、ポッと出てあっという間に消えてしまったような記憶。

CPUはAMDのTurion64 MT-40(2.2GHz)。
メモリはDDR400で2GB。
DVD-Multiドライブは、以前故障したので交換済み。
無線LANモジュールは、当時新しい無線規格に対応するために富士通のものに交換しました。
昔Ubuntuをインストールする際に、BuffaloのSSD(SHD-NH128PU2)に換装。
　→後にSSDが故障したので、アダプターを介してM2.SSDを搭載している。

こんな構成です。
CPUはノーマル状態だと完全に放熱が間に合わないので、キーボードを撤去してヒートパイプに追加のヒートシンクを貼り付けています。
![KIMG2569.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20524/144710a7-e24a-65ab-502d-c2418d822e3b.jpeg)
これでも、ベンチマークを回して放置すると放熱が間に合わずにハングアップしてしまう。
# 2.2GBのメモリを1GBにする
Windows98は、1GBを超えて実装していると認識せずエラーとなってしまうので、DIMMを1枚抜いておく。
※性能的には1GBで十分すぎるので、無理に2GBにする必要はないと思う。自己満足。

# 3.Windows98SEをインストール
普通にインストールする。
可能な限り最後までCDは入れておく。
プロダクトキーを紛失した場合の回避法もあるが、非公式なので割愛。

# 4.2GB認識できるようにする
### 1.「HimemX.exe」をググって入手
DOSプロンプトで以下の操作を行う。

>ren HimemX.exe himem.exe
copy himem.exe c:\windows\himem.exe

### 2.「XMSDSK.EXE」をググって入手
C:\XMSDSKに展開

### 3.「w98iopat.exe」をググって入手
Windows98SEを起動する。
DOS窓で、以下の操作を行う。
>c:\w98iopat.exe　※io.sysで1GB以上認識させるためのパッチ当て

syseditを起動し、以下のように変更を加える。
>config.sys
DEVICE=C:\WINDOWS\HIMEM.SYS /V
↓
DEVICE=C:\WINDOWS\HIMEM.EXE /MAX=2030592 /NUMHANDLES=64 /METHOD:FAST /VERBOSE
※/MAX=の数値は、2GBからビデオメモリに割り当てる64MBとDOS領域で使う1MBを引いた数値：2048MB(2GB)-65MB(64MB+1MB)×1024

更にsysedit
>Systen.ini
[vcache]
MaxFileCache=261120
MinFileCache=32768
ChunkSize=4096
NameCache=4096
DirectoryCache=96
[386Enh]
MaxPhysPage=40000　※Windowsに認識させるメモリの最大容量を指示(この場合1GB。計算方法は忘れた
PagingDrive=Z:　※仮想ディスクをRAMディスクのZドライブに強制割当

更に更にsysedit
>autoexec.bat
C:\DOS\XMSDSK.EXE 850000 Z: /t /y
※仮想ディスクを割り当てる。数値は適当なので、メモリに余りが出る。余っても用途がないので、少し気持ち悪いけれども無問題(笑)

# 5.メモリを2GBに戻して再起動
※以下の各ソフトは、それぞれググって入手する
・explz606.exeをインストール
・PN_3_0_5.EXEをインストールする
　→電源のプロパティで省電力の設定を全てOFFにする
・6-2_wme_dd_cp_30314.exe実行
・tv-capture-wdm-6-14-10-6240.exe実行
　→デバイスマネージャーでディスプレイアダプタのドライバを手動で選択「200 Series...」

・regeditで画面解像度を1280x800(MS-1013の最大解像度)に設定する
　1.「1280,768」を検索
　2.解像度の値がぶら下がっている箇所に「1280,800」を追加、値を編集して空欄で確定
　3.画面解像度を1280x800に設定する

・DirectX9cインストール
・realtek.zipを展開、setup.exeを実行してサウンドドライバインストール
・realtek8139.zipを展開、setupフォルダ内のsetup.exeを実行する
　→デバイスマネージャーで「？」になっているイーサネットコントローラのドライバを選択「realtek 8139...」2つ検出されているが片方のみ本物、2つともインストールした場合、片方を使用不可に設定する
・s270_cs_6.14.10.6512_xp32.zip内のVGA\SBDrv\SMBUS内のsetup.exeを実行
　→デバイスマネージャーで「？」になっているシステムバス(SMBus)のドライバを置き換える

ここまでの作業で、必要な機能は全て動作するようになる。
ただ、無線LANのドライバは見つけられなかった。

・IE60SP1JA_KAI.ZIPでIE6をインストールする
・Instmsia.exeでMSIをインストールする
・jw98seaup.exeでOSをアップグレード
　→Windows98を最終版にする。必要がなければインストールする必要はない。

他に、仮想CDのソフトにVirtualCloneDriveを入れたり。

# 6.終了
実際に使用すると、インターネットは接続できるが、ウィルス対策がザルな上にWindows98SE対応の満足なブラウザが存在しないので、実用性はかなり低い。
CPUやビデオ性能が、当時のWindows98SEの段階では想定していない勢いなので、古いゲームやアプリで遊ぶには最高。
当時の重量級アプリやゲームが、アホみたいにサクサク動作する。
USBメモリは、とりあえず手元にある8GBのものは問題なく使用できた。
使う予定がないモデムドライバは、あえてインストールしていない。
セーフモードを使用する際はメモリを1GBにして再起動しないと、OSが起動できない。
![36372413_972736512908500_5629547513292783616_o.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20524/5b7a9cfa-65f8-95cd-ff63-7826ba6736e4.jpeg)
linuxサーバーでsftpを使って任意のディレクトリだけのファイル転送をする

#はじめに
クライアントPCとかで、linuxサーバーにあるファイルをやり取りしたいとなった時、
だいたいの場合はターミナルソフト入れて、sshで繋いで、みたいな流れになると思うが、
もろもろの事情により、限定したディレクトリ以下のファイルだけしか見れないようにしたいとき、
SFTPが役に立つ

linuxサーバー側の設定としてはおおまかに、
SFTP接続用ユーザーを作成し、
編集可能なディレクトリを指定するというものだけ

一回やったら30分くらいでできるようになる

セキュリティを上げたい場合は接続用鍵を作成してもいいが、
なくてもSFTP接続はできる

枯れたレガシー技術だけど、
とっさの時に使えるため、
自分のメモ用に残す

#手順
##ユーザー・グループ作成
最初に接続用ユーザー作成

```
useradd SFTPuser
passwd SFTPuser
```

SFTP接続できるグループも作成する

```
groupadd sftp
usermod -G sftp SFTPuser
```

SFTPで繋げたいディレクトリを作成

```
mkdir /test

mkdir /test/hoge
```
##ssh接続設定

```
vi /etc/ssh/sshd_config

元々書かれている下記をコメントアウト
#Subsystem      sftp    /usr/libexec/openssh/sftp-server

以下を追記
Subsystem sftp internal-sftp
Match User SFTPuser
       	ChrootDirectory /test  #SFTPで繋げたいディレクトリを指定
       	ForceCommand internal-sftp
```

##接続用のカギを作成(この項目はセキュリティ要求レベルによってしなくてもOK)

```
su SFTPuser
ssh-keygen -t rsa
cp /home/SFTPuser/.ssh/id_rsa.pub /home/SFTPuser/.ssh/authorized_keys
```

作成した秘密鍵「id_rsa」はローカルに保存しておこう

##SFTP接続用ディレクトリの確認
以下の権限状態となっていることを確認
権限が異なるとSFTPで接続できないエラーとなる場合がある

```
ls -la /
drwxr-xr-x    4 root root  4096  6月  4 18:38 2019 test

ls -la /test/
drwxrwxrwx 4 SFTPuser SFTPuser  4096  6月  4 19:01 2019 hoge 
```

##sshdの適用

sshの設定が間違っていないかテスト

```
sshd –t
```

上記コマンドでエラーが出なければ再起動

```
service sshd restart
```

##接続確認
windowsクライアントの場合はWinscpなどで作成したユーザー、パスワード、鍵を使い、接続確認する
接続後に、/test以下のディレクトリのみが見えていれば完了

#まとめ
SFTPについてはググればいくらでも情報はあったが、
個人的にわかりやすいものがなかったため、
今回まとめてみた

こういった枯れた技術もまだまだ役に立つ場面が出てくるため、
使えて損はないと感じた
activerecordを使って簡単なコマンドラインアプリケーションを作ってみた

# 目的とやったこと
rubyとActiveRecordの勉強のために、簡単なコマンドラインベースの「todo管理アプリケーション」を作成した。

# 開発環境詳細
言語：ruby2.5.3
DB：sqlite3
なお、当然ながらDBアクセスにActiveRecordを利用している。

# 動作している様子
![todoapp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239124/4e391078-d744-c150-05a6-eaa0496ba0fd.gif)
※念のため言っておくと、Cドライブ直下で実行しているのは私のユーザ名を晒したくないからで、Qiita投稿のためだけにそうしています。

# 仕様概要
よくあるタスク管理アプリをコマンドラインで実現している。
CRUDを一通り実装しており、ユーザインタフェースはキーボード入力のみ。
DBはsqliteで実現しており、テーブルは一つだけ（tasksテーブル）。項目は以下の通り
　id・・・タスクを一位に定めるための整数値。自動採番かつuniqueである。
　name・・・タスクの名前
　content・・・タスクの詳細
　status・・・タスクの状態。アプリ的には未着手、着手中、完了の3つがあり、それぞれ整数値としている。
なお、updateについて、何も入力をしない場合は現状の項目のままである。（一応工夫しているアピール）

# ソースコード
相変わらずのクソコードではあるが以下を参照のこと
https://github.com/gitk47320/todoapp
コマンドラインベースとはいえMVCを意識しています。データ操作、ユーザインタフェースは分離している。特にControllerなんて完全にrails意識しているし。。。

# 今後やっていきたいこと
・バリデーションの実装
・タスクアラート機能（遅延気味のタスクをアラートするとか）
・全体的にリファクタリングしたい。view側の実装をmodel側にもう少し持っていけないかなーとは思っている。
Ubuntu 19.04で英語キーボードを使えるようにする方法

動作環境: Ubuntu 19.04
前提: mozc使用
~~※Ubuntu 18.04でも多分同じ。18.04でも同じように設定できた方はコメントで報告をいただけると嬉しいです。~~
追記: Ubuntu 18.04でも同様に設定できるようです。

# 設定手順
※()で日本語のUIを記載

## 1. スーパーキー(Windowsキー)を押して`setting`とタイプして、`Settings`(設定)を開く

![input_source_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/f9202fb3-dfee-0f20-86d6-9d1fabfd6df8.png)

## 2. `Region & Language`(地域と言語)の`Input Sources`(入力ソース)から`Japanese`をゴミ箱ボタンを押して削除

## 3 `+`ボタンを押すと、以下画面が出るので、`English (United States)`を選択

![input_source_setting_us.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/c5264797-119e-0f2f-c3f2-0d5c90db290e.png)
## 4 `English (US)`を選択して`Add`を押す

![input_source_setting_us2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/2ec992b9-fddc-4c78-5026-77e8d9ace438.png)

## 5. `Settings`(設定)を閉じて、設定完了

![input_source_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/16324d81-0a88-f3e9-8e77-5290f3a01663.png)

# 関連資料

[Ubuntu 16\.04で英語キーボードを使えるようにする方法 \- Qiita](https://qiita.com/SUZUKI_Masaya/items/2f2ef9fdb63fe017c6d2)
19.04でも↑の`sudo dpkg-reconfigure keyboard-configuration`コマンドでUSキーボードの設定ができたんですが、
再起動したり何かの拍子に設定がクリアされてしまっていました。
LaTeXの箇条書きのマークで仮の白いビュレットを使う．

# 環境
```
$ platex --version
e-pTeX 3.14159265-p3.8.1-180518-2.6 (utf8.sjis) (TeX Live 2018/W32TeX)
kpathsea version 6.3.0
ptexenc version 1.3.6
Copyright 2018 D.E. Knuth.
There is NO warranty.  Redistribution of this software is
covered by the terms of both the e-pTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the e-pTeX source.
Primary author of e-pTeX: Peter Breitenlohner.
```
# 方法
`◦`(白ビュレット)をLaTexの箇条書きで使用したところ，

```
! Package inputenc Error: Unicode character 竅・(U+386443)
(inputenc)                not set up for use with LaTeX.

See the inputenc package documentation for explanation.
Type  H <return>  for immediate help.
```
と言われたので

```
% 箇条書きがネストしたとき，白ビュレットを使う．
\renewcommand{\labelitemii}{$\circ$}
```
のように`$\circ$`で代用すると，ちょうど良くなる．
そのまま○(しろまる)を使うとデフォルトの黒ビュレットとサイズが違うので推奨しない．
″ｬ｣ﾚ文字に変換するライブラリをイ乍っτゐﾅﾆ

~~イ士亊㊥暇ﾅﾆ″っﾅﾆヵゝら~~ ″ｬ｣ﾚ文字変才奐ﾗｨ┐″ﾗ└|をイ乍っτ、 npm τ″公開ιτゐιﾅﾆ :sparkles: 

# イ乍っﾅﾆも＠

https://www.npmjs.com/package/galmoji

# イ吏ﾚヽ方

```javascript

const galmoji = require('galmoji')

galmoji('おじさんギャル文字ライブラリ作ったヨ💕(^з<)😍')
// ぉι″､ﾅω≠″ｬ｣ﾚ文字ﾗｨ┐″ﾗ└|イ乍っﾅﾆ∋💕(^з<)😍

```



ゐωﾅょもイ吏っτね！
select2でタグの文字列を取得する

### はじめに
select2でvalueではなく、text（タグの文字列）を取得する方法を調べたのでメモっておく

### 環境
- Windows10
- Edge
- select2 4.0.6-rc.1


### 方法
select2('data')でタグのオブジェクト配列が取得できるため、それに対し"text"属性を取得すればよい。
例えば0番目のタグの文字列は、以下で取得できる。


```javascript
$('.js-example-basic-multiple').select2('data')[0].text;
```

### 参考
How to get Selected Text from select2 when using <input>
https://stackoverflow.com/questions/19814601/how-to-get-selected-text-from-select2-when-using-input
[Oracle]バッチファイルでSQLファイルを連続実行する

WindowsでbatファイルからSQL*Plusを呼び出してSQLを連続実行するには、batファイルにsqlplusコマンドを列挙するだけです。ただし、実行する**SQLファイルの末尾に「exit」**がないと、sqlplusが終了せず、batファイルの次の処理が実行されません。

```bat:hoge.bat
sqlplus -s user/pass@db @hoge1.sql
sqlplus -s user/pass@db @hoge2.sql 

pause
```

```sqk:hoge1.sql
select SYSDATE from dual;
exit
```

```sql:hoge2.sql
select dbms_random.value(1,10) from dual;
exit
```


```hoge.batの実行結果
C:\test>sqlplus -s user/pass@db @hoge1.sql

SYSDATE
--------
19-07-01


C:\test>sqlplus -s NEWS/NEWS@ORCL @hoge2.sql

DBMS_RANDOM.VALUE(1,10)
-----------------------
             7.91097775


C:\test>pause
続行するには何かキーを押してください . . .
```

oracle 11g(11.2.0)で確認しました。
Leetcode #896: Monotonic Array

```swift
func isMonotonic(_ A: [Int]) -> Bool {
    var increasing: Bool? 
    for i in stride(from: 1, to: A.count, by: 1) {
        if A[i] > A[i-1] {
            if increasing == nil {
                increasing = true
            } else if increasing! == false {
                return false
            }
        } else if A[i] < A[i-1] {
            if increasing == nil {
                increasing = false
            } else if increasing! == true {
                return false
            }
        }
    }
    return true
}
```
Javaの配列におけるCloneメソッドとは[Clone method for Java arrays]を訳してみた。


Javaの配列における`clone()`についての分かりやすい説明を見つけたので訳してみました。

> [引用]stackoverflow 
[Clone method for Java arrays](https://stackoverflow.com/questions/14149733/clone-method-for-java-arrays)

---


cloneメソッドが配列に呼び出される時、同じ配列要素の新しいインスタンスを返却します。
例えば、次のコードでは`int[]a`と`int[]b`では違うインスタンスを生成します。

```java

    int[] a = {1,2,3};
    int[] b = a.clone();

    * 「a == b ?」 は、aとbが同じインスタンスか？という判定
    System.out.println(a == b ? "同じインスタンスです":"違うインスタンスです");
    //出力： 違うインスタンスです

```

2つは異なるインスタンスなので、int[]bに対する変更は、int[]aには影響しないということになります。

```java

    b[0] = 5;
    System.out.println(a[0]);
    System.out.println(b[0]);
    //出力　　: 1
    //       : 5

```

これがオブジェクトの配列操作となると少しややこしい話になります。(配列の場合)クローンメソッドにより新しい配列の参照先を返却します。これはコピー元の配列オブジェクトと同じ参照先になります。

例えば`Dogクラス`があったとします。

```java

    class Dog{

        private String name;

        public Dog(String name) {
            super();
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }
```

そして私は`Dogクラス`の配列を追加します。

```java

    Dog[] myDogs = new Dog[4];

    myDogs[0] = new Dog("Wolf");
    myDogs[1] = new Dog("Pepper");
    myDogs[2] = new Dog("Bullet");
    myDogs[3] = new Dog("Sadie");

```

そして`dog`をクローンすると・・・

```java
    Dog[] myDogsClone = myDogs.clone();
```

２つは同じ要素を参照します。

```java

    System.out.println(myDogs[0] == myDogsClone[0] ? "同じ":"違う");
    System.out.println(myDogs[1] == myDogsClone[1] ? "同じ":"違う");
    System.out.println(myDogs[2] == myDogsClone[2] ? "同じ":"違う");
    System.out.println(myDogs[3] == myDogsClone[3] ? "同じ":"違う");
    //出力：　同じ (4回)
```


これはどうゆうことかというと、２つは同じ参照先なのでクローンした配列に対して変更を加えた場合、その変更がもともとの配列にも反映されるということです。

```java
    // myDogsCloneに変更を加えると、myDogsの要素の値にも反映される。
    myDogsClone[0].setName("Ruff"); 
    System.out.println(myDogs[0].getName());
    //出力：　Ruff
```


しかし、配列に対して新しくインスタンスを作成するとその変更は元のインスタンスに影響しません。

```java
    myDogsClone[1] = new Dog("Spot");
    System.out.println(myDogsClone[1].getName());
    System.out.println(myDogs[1].getName());
    //出力：　Spot
    //      Pepper

```


とても勉強になりました！:relaxed:
UE４のエラー「LogCompile: Error: An explicit Category specifier is required for any property exposed to the editor or Blueprints in an Engine module.」の解決方法

#はじめに
現在作成しているゲームをスマホにデプロイしようとした時にでたエラーの対処方法についての日本語の記事が無かったので、備忘録も兼ねて記事を書いてみます。

#エラーの内容
`<ファイルパス>/<問題のあるヘッダー>.h (問題の行) LogCompile: Error: An explicit Category specifier is required for any property exposed to the editor or Blueprints in an Engine module.`
今回発生したエラーがこれです。簡単に言うと「ブループリントに公開する変数にはカテゴリが必要」とのこと。
また、アウトプットログにはなにやらファイルパスとエラーの行数が書いてありました。

#対処法
現在作成しているゲームの「PathFollow」というプラグインを使用していて発生したエラーを例に説明します。
エラーの内容からカテゴリの指定がされていないものがあると思い、指定されたファイルの指定された行を見てみると案の定CategoryがないUPROPERTYが...

「PathFollow」の場合のファイルパス
../Engine/UE4/Plugins/Marketplace/PathFollow/Source/PathFollow/Classes/PFSpeedCurve.h

```PFSpeedCurve.h
USTRUCT(BlueprintType)
struct PATHFOLLOW_API FPFSpeedCurve
{
	GENERATED_BODY()

	FPFSpeedCurve();

	static float GetSpeedAtDistance(const FInterpCurveFloat& Curve, float Distance);
	/*void Clear();
	void Dump();*/

	static TTuple<float, float> GetMinMaxSpeed(const FInterpCurveFloat& Curve);

	const FInterpCurveFloat& GetCurve() const { return _speedCurve; }
	FInterpCurveFloat& GetCurve() { return _speedCurve; }

	UPROPERTY(EditAnywhere) //-----カテゴリが指定されていない (63行目)
	FInterpCurveFloat _speedCurve;
};
```
問題のUPROPETYにカテゴリを指定してビルドします。

ここまでやった後に再度デプロイしたら正常にできました！
Raspberry Pi 4 届いた

# この記事について
ただの自慢ですｗ

# Raspberry Pi 4 Model B
イギリスに注文しておいたものが、今日届きました。到着まで1週間ちょっとかかりました。

## 外箱

外箱は普通。 
"4GB RAM" ときっちり印刷されています。各メモリ容量ごとの箱を作っているのでしょうか。無駄に金かけていますｗ
![2019-07-01 20.40.30-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169018/7bd5c6a0-913f-3f79-fa92-2a7ff5b206d9.jpeg)

##技適マークはありません（当然）

箱の裏側、ボード本体、説明書、いずれにも技適マークは付いていません。
![2019-07-01 20.42.23-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169018/976e59f4-42d2-2aec-4ef0-b82bb1375a47.jpeg)

そのため、電波を発する使い方をすると電波法違反になります。
...ということで、今回は電源は入れません（笑）

##説明書
説明書には、きちんと日本語の説明が書かれています。
フォントはともかく、「海外によくある怪しい日本語」ではなくまともな日本語で書かれています。
![2019-07-01 20.44.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169018/f7f3e182-c36e-feec-7927-ed67e80904bf.jpeg)

###説明書の気になるところ

説明書に、気になるポイントが1つ。
![2019-07-01 20.45.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169018/401dee68-7e1b-2838-64f7-f3340210468b.jpeg)

"8GB" の記載があります。
もしかしたら、将来的にメモリ増量モデルが出てくるのでしょうか？

# 最後に
この技適なしの Raspberry Pi 4 を「合法的に」使う方法はあるのだろうか。
電波暗室を使えば良いのでしょうが、そんな設備持ってないし...
## こんな技はアリか？
電波を出さなければ良いのだから...
技適付きの別のラズパイでOSを初期セットアップ。無線LANとBluetoothを無効にした上で、そのセットアップ済みのSDカードをラズパイ4に挿して起動する、
といった方法を使えば、理論上は行ける気がする。ただ、あくまで理論上であって本当に電波を発さないかはわからないので、いったん保留。

ということで、ラズパイ4は飾りとして放置しますｗ
[WinActor]ブラウザ操作 - 新しいタブの操作

v6から追加されたChrome自動操作記録を使ってもメニューやリンクをクリックして起動した「新しいタブ」で開かれたページの操作は記録できないので、ブラウザ操作の使い方を整理しておきます。

今日紹介するライブラリは、「ブラウザ関連」から、こちら
<img width="109" alt="browser_nodes.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360097/07fac70f-d60d-e11e-d98a-b5fe5093c4c4.png">

- ウィンドウハンドル取得
- 任意のウィンドウへ移動
- 次のウィンドウへ移動
- ウィンドウクローズ
- ブラウザクローズ

### １．まずはブラウザを起動。
何はともあれ、自動操作対象のブラウザはWinActorから起動してブラウザ変数を取得する必要があります。

自動操作でも記録できるし、普通にブラウザ起動から作ってもイイネ。

そこから、ページ表示でURL移動するところまでは困らずにできるハズ。

### ２．「新しいタブ」でリンク先が開くイベントが発生。
タブが変わっちゃうと操作記録が出来ないね。

ここからブラウザ関連ライブラリの使い方の分かりにくいとこ入っていくよ。

 

必要な機能を順番に見ていくよ。

### ３．「次のウィンドウへ移動」
ハイ、コレ罠ね。

次の**「ウィンドウ」**ってなってるけど、このライブラリを使うとブラウザ変数で参照されているページの右隣りのブラウザタブのWebページにブラウザ変数の制御参照が移るよ。

<img width="303" alt="tab_change.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360097/1fb8feed-e5e2-50f6-7982-6d2797bc7442.png">

**で、ここで気をつけなきゃいけないのは、参照がコロッと変わってしまうので移動先のページを閉じる操作をした時にブラウザ変数の参照が切れてしまうってこと。**

一応、**「異常時の移動先」**っていう設定で最初のタブに戻る方法も考えられるけど、今回は次の４．５．と組み合わせた方法を紹介するよ。

### ４．「ウィンドウハンドル取得」と「任意のウィンドウへ移動」

このノードを使うと、変数によくわかんない英数の羅列が手に入るんだけど、これはブラウザの**マイナンバー**みたいなもんだね。

**「ウィンドウハンドル取得」**で取得したハンドルを**「任意のウィンドウへ移動」**のハンドルに指定すれば、そのブラウザを制御できるようになるんだ。

でも、そもそも**「ウィンドウハンドル取得」**は、**すでに制御を持っているブラウザからしか取得できないんだ。**

言ってる意味わかるかな？　３と組み合わせて使う方法を最後に説明するよ。

### ５．「ウィンドウクローズ」と「ブラウザクローズ」
**「ウィンドウクローズ」**　⇒　制御対象のタブブラウザを閉じられるよ。

**「ブラウザクローズ」**　⇒　すべてのタブを閉じてブラウザを閉じられるよ。

新しいタブが生成されない制御だとあまり使い方に差はないかな。

### ６．つまり整理すると、こうやって使えってことかな。

<img width="114" alt="browser_control.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360097/3e088427-e8f6-951d-4ca0-68b438bfc256.png">

**「次のウィンドウへ移動」**の前に**「ウィンドウハンドル取得」**を行って、新しいタブの操作が終わったら**「任意のウィンドウへ移動」**で元のブラウザタブに戻って別の操作をする。

移動できるタブは**「次のウィンドウ」**になっちゃうから、都度、**「ウィンドウクローズ」**で操作が終わったタブは閉じておくと制御が楽そうですね。



### 最後に
いろいろな使い方、勉強中です。
普段は自分のブログに試したこと纏めてますが、今回の機能はあまり認知されていなかった様なのでQiitaにも掲載させて頂きました。

[WinActor記事まとめ](https://yizm.work/winactor_matome/)
DjangoでサクッとWebサイトを作る Part1

DjangoでサクッとWebページを作ってみました。
初心者向けに超基礎的な部分だけ解説します。

# セットアップ
既にご存知かと思いますが、DjangoはPythonで開発されています。したがってまずはPythonをインストールする必要があります。
本記事執筆辞典ではPythonは3.7がおすすめです。もしPython2.xがインストール済の場合はアップグレードしましょう。

インストールが正しく行われているか確認するには以下のコードを実行してみてください。

```bash
$ python3 --version
Python 3.6.1
```

# Djangoのインストール
`projects/requirements.txt` ファイル中に以下のテキストを追加します。

```bash
Django~=2.0.6
```
次に、以下のコードを実行してインストールします。

```bash
pip install -r requirements.txt
```

以下のようになりましたでしょうか。

```
(myvenv) ~$ pip install -r requirements.txt
Collecting Django~=2.0.6 (from -r requirements.txt (line 1))
  Downloading Django-2.0.6-py3-none-any.whl (7.1MB)
Installing collected packages: Django
Successfully installed Django-2.0.6
```
インストールはこれで完了です。
次回は具体的な開発の解説に入っていこうと思います。

最終的にはこんな感じになります
[LeadingTech](https://leading-tech.jp)

更新はゆっくりになりますが頑張りますので気長にお待ちください！
第１回目　『自分なりに、デザインについてまとめてみた。』

#なぜデザインに興味を持ったのか？
全てのきっかけは、アメリカのサンフランシスコに６０人程度で訪れた研修旅行。

その研修をアテンドしていたのが、**[btrax](https://btrax.com/jp/)**というサンフランシスコのデザイン会社であった。

そもそも、体育会系一本で育ってきた私には違う世界の文化であり
最初は興味も示さなかった、むしろ拒絶反応さえあったことを覚えている。


そんな私の気持ちを変えたのが、**UI/UX**というデザインの考え方。
*UI/UXは後述する。*

究極のめんどくさがりの僕にぴったりの概念、それが

**UI　ユーザーインターフェース**
**UX　ユーザーエクスペリエンス**



#デザインとはそもそも何か？
正直、僕も明確にわかっていません。

深すぎるし、答えがないんです。

ただ、世の中で勘違いされていることが多いのが**デザイン**と**アート**だと思ってます。

僕なりにこの２つを簡潔にまとめてみました。



####デザイン　情報整理
####アート   　　自己表現


#デザインの種類

WEBデザインのトレンドにだけ限定する。


##マテリアルデザイン
Googleが提唱したデザイン

マテリアルとは、直訳すると**「物質的な」「具体的な」**という意味である。

現実世界の物の動きや影、奥行きを表現することで思考することなく、感覚でわかるようなデザインを目指している。

ストレスフリーでサービスを使用できるようにするのが最大の目的。
Googleのどのサービスもが使いやすいのは、このマテリアルデザインが使用されているのに他ならない。

基本の考え方は、**「紙」**と**「インク」**

紙は切れる、重ねれば影ができる、
こういった自然の原則に則ったのがマテリアルデザインなのだ。

詳しいことは、[ガイドライン](https://material.io/design/)にGO!!!


#最後に

スーパーマリオのUXをご存知だろうか？

[スーパーマリオのステージ1-1から学べるUX](https://uxmilk.jp/35280)

この記事を読んで感動したので、最後にこれで一旦終わります。。。


##参考URL
https://uxmilk.jp/35280

https://channel.arousal-tech.com/google%E3%81%8C%E6%8F%90%E5%94%B1%E3%81%99%E3%82%8B%E3%80%8C%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%80%8D%E3%81%A3%E3%81%A6%E7%9F%A5%E3%81%A3%E3%81%A6/
お気に入りmacの無料ディスクトップアプリ



windowの上下左右移動
[Spectacle](https://www.spectacleapp.com/)

[LibreOffice \- オフィススイートのルネサンス](https://ja.libreoffice.org/)


mac版おにぎり(画像キャプチャ)
[Mapture \- MacOSX向けキャプチャユーティリティ](https://anatoo.jp/mapture/)

pixel定規
[Linear App](https://linear.theuxshop.com/)


cheetsheet
[CheatSheet \- Know your short cuts](https://www.cheatsheetapp.com/CheatSheet/)

クリップボードを出す
<a href="https://clipy.softonic.jp/mac">Clipy for Mac - ダウンロード</a>

CSV編集
<a href="https://www.macupdate.com/v1/app/mac/58055/table-tool">Table Tool : MacUpdate</a>
Leetcode #448: Find All Numbers Disappeared in an Array

```swift
func findDisappearedNumbers(_ nums: [Int]) -> [Int] {
    if nums.isEmpty {
        return []
    }
    var missingNumbers = [Int]()
    var set = Set<Int>()
    for num in nums {
        set.insert(num)
    }
    for i in stride(from: 1, through: nums.count, by: 1) {
        if !set.contains(i) {
            missingNumbers.append(i)
        }
    }
    return missingNumbers
}
```
お気に入りのchrome拡張機能一覧

大体強いです。


随時追加中。


# vim系
textareaがvimになる。感動的。
[wasavi \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/wasavi/dgogifpkoilgiofhhhodbodcfgomelhe)

ブラウジングがvimになる。すごいです。
[Vimium \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)
# デザイン系
任意のサイトにJavaScriptとCSSが設定できる
[User JavaScript and CSS - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/user-javascript-and-css/nbhcbdghjpllgmfilhnhkllmkecfmpld)

カラーピッカー出せる
[ColorPick Eyedropper - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/colorpick-eyedropper/ohcpnigalekghcmgcdcenkpelffpdolg)

# 作業ラクラク系
スクロール自動化
[uAutoPagerize - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/uautopagerize/kdplapeciagkkjoignnkfpbfkebcfbpb)

開いてるタブのURL全取得
[GetTabInfo - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/gettabinfo/iadhcoaabobddcebhmheikmbcjcigjhc)

windowsOSでマウスのホイールクリックすると出てくるやつ(mac用)
[AutoScroll - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/autoscroll/occjjkgifpmdgodlplnacmkejpdionan)

リンクをhtml形式など好きな形式で取得
[Create Link - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm)

選択範囲のリンクを一括で開く
[Linkclump \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/linkclump/lfpjkncokllnfokkgpkobnkbkmelfefj?hl=ja)

# 検索系
一年に以内に絞ってgoogle検索
[ato-ichinen - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/ato-ichinen/pojaolkbbklmcifckclknpolncdmbaph)

右クリックから画像検索
[Fast Image Research Firefox and Chrome Extension]("http://usacyborg.com/FastImageResearch/)

# 休息系
ポモロードタイマー
[Break Timer - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/break-
timer/hklkdbpicdmlpoiellngedpejjkmapei)

アドブロック
[Adblock Plus - free ad blocker - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/adblock-plus-free-ad-bloc/cfhdojbkjhnklbpkdaibdccddilifddb)

サイトのフレームワークなどを表示
[Wappalyzer - Identify technologies on websites]("https://www.wappalyzer.com/)

励ましてくれる
[Just Do It - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/just-do-it/pdnkdpkigplndkpnciommmacnplfjbal)

# 知識系
超高速の英語辞書
[Mouse Dictionary - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/mouse-dictionary/dnclbikcihnpjohihfcmmldgkjnebgnj)



# viewer系
ローカルのplantUMLが見れる
[PlantUML Viewer - Chrome ウェブストア]("https://chrome.google.com/webstore/detail/plantuml-viewer/legbfeljfbjgfifnkmpoajgpgejojooj)

ローカルのmarkdownが見れる
[Markdown Preview Plus \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/markdown-preview-plus/febilkbfcbhebfnokafefeacimjdckgl)
Leetcode #693: Binary Number with Alternating Bits

```swift
func hasAlternatingBits(_ n: Int) -> Bool {
    var n = n
    var last = n % 2
    n >>= 1
    while n > 0 {
        var current = n % 2
        if current == last {
            return false
        }
        last = current
        n >>= 1
    }
    return true
}
```
grpc の binary log

grpc-java でログ取るのにどういった項目やどういったフローで取ることになるんだろうなーと調べていたら、 `BinaryLog` というクラスがあって良さそうなのにググっても全く英語でも概要や使い方が殆ど出てこず、気になったので調べてみた。

* https://github.com/grpc/proposal/blob/master/A16-binary-logging.md

つまり、バイナリ形式でログを取り、RPC の再現や問題の発見のためのログということらしい。けれど、提案中の機能で、まだ本番で使えるようなものではない様子。

使い方はサーバや、channel に仕込めばいいだけ。

* https://grpc.github.io/grpc-java/javadoc/io/grpc/ServerBuilder.html#setBinaryLog-io.grpc.BinaryLog-
* https://github.com/grpc/grpc-java/blob/master/api/src/main/java/io/grpc/ManagedChannelBuilder.java#L490

このインスタンスは、 [BinaryLogs][] というヘルパークラスを使って作ることができる。ファイルの出力先やログのフィルタ設定などはここから実装をたどれば良い。

実装を見ると、ログに残す対象のサービス・メソッドやログに残す項目を設定できる環境変数の名前が、提案と実装で違っているので本当にまだ試験段階なんだと思う。

BinaryLogSink で、受け取ったログを出力する実装を書けるみたいだが、受け取るメッセージの型のが `MessageLite` で扱いづらい。Slf4j に json 化して出力とかできるかな？

JSON にするはこれ使う:

* https://github.com/protocolbuffers/protobuf/blob/master/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java

[BinaryLogs]: https://github.com/grpc/grpc-java/blob/master/services/src/main/java/io/grpc/services/BinaryLogs.java#L23
Azure WebApp とログ

# Azure WebApp とログ
ASP.NET Core のログを Azure WebApp に出力するメモ。

[ASP.NET Core の公式マニュアル](https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1#azure-app-service-provider)に手順が書かれているけど、思った通りに行かないので検証してみた。

## 検証
### 環境
* Azure WebApp (Windows)
* ASP.NET Core 2.1 の MVC アプリケーション
* デプロイは Azure WebApp の GitHub からのデプロイ


### 結果
ファイルシステムのアプリケーションログを有効にして、詳細レベルでログを出力するように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103982/a34e1bec-3640-9ecd-f395-2c8e2d22ec2e.png)

ウェブアプリをリロードしても、ログは出力されませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103982/c4612152-35a0-63e1-709e-78d1552fa46d.png)

公式マニュアル通り、`Microsoft.Extensions.Logging.AzureAppServices` パッケージを追加して、以下のコードを追加します。

```csharp
return WebHost.CreateDefaultBuilder(args)
    .ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
    .UseStartup<Startup>();
```

今度はリロードするとログが出力されるようになりました!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103982/d537020a-fb1f-19c8-57de-dba30af482ca.png)

公式マニュアル通りの結果になりました。


### 結果 (Linux)
実は私は Web App (Linux) を使ってたんですね。なかなか公式マニュアル通りにならない。試しに Web App (Windows) を使ったら公式マニュアル通りになりました。

どこが違うかというと... `logging.AddAzureWebAppDiagnostics()` を書かなくてもログが出力されるんですね。

Web App (Linux) は Docker スタックになってなくても Docker コンテナで動作しています。(確か) Web App (Linux) の App Service ログは Docker コンテナの STDOUT / STDERR が出力されるようになってるので追加のコードは不要なんですね。

* `Microsoft.Extensions.Logging.AzureAppServices` パッケージは不要
* Azure の設定でログレベルの変更をすることができない

ってことなんですね。

ログの設定画面も Web App (Windows) と違います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103982/b2055a8f-9b06-d438-c9fb-6f4b4446bea1.png)


## 結論
`logging.AddAzureWebAppDiagnostics()` は Web App (Linux) では意味はないけど、書いてて困ることはあまりないと思うのでとりあえず書いておきましょう。

なんだかんだ言って、Web App (Windows) のほうが使いやすいですね。
ハイパフォーマンスMySQLでインデックスについて勉強したことまとめ

## インデックスの種類
インデックスはサーバーレイヤではなくストレージエンジンレイヤで実装されているため、標準化されていない。
インデックスとは本の目次のようなもので、ストレージエンジンがデータを検索するときにデータ全体をスキャンする必要がなくなるので高速で検索することが可能になる。

## Bツリーインデックス

MySQLのストレージエンジンでで一般的に使用されているインデックス。
なんの断りもなしに「インデックス」と言われているときはBツリーインデックスを指していることが多い。

ここにわかりやすくまとまっている
[B-treeインデックス入門](https://qiita.com/kiyodori/items/f66a545a47dc59dd8839)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202653/98d82982-41ac-4a4a-68d5-2bab9eb66e6d.png)

> 5は4より大きいので、右側に進みます
5は6より小さいので、左側に進みます
5が見つかりました

引用：[B-treeインデックス入門](https://qiita.com/kiyodori/items/f66a545a47dc59dd8839)

検索の具体的な手順は[B-treeインデックス入門](https://qiita.com/kiyodori/items/f66a545a47dc59dd8839)で開設されている通りの手順。

ストレージエンジンがこのようなツリー構造をあらかじめ作っておき、上の手順を踏むことでデータの高速な検索が可能になっている。

ツリーのノードはソートされているので、高速化された検索と同じようなソートをすることができる。
例えば名前にインデックスがついていたら、名前の検索も高速だが、ソートも高速。

### Bツリーインデックスの制限

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202653/8a05fd6b-fce6-0a32-b0f0-beb1981bbcce.png)

引用: [B-Treeインデックスの話](https://qiita.com/suzukito/items/908a3523f4b90dd77c6a)

Bツリーインデックスで例えば上のような複合インデックスを貼った場合は、インデックスを貼る順序が大事になっている。
上の図では姓→名の順にインデックスが貼られているとする。

- 検索がインデックス付きの列の左から始まらないと意味がない。今回の場合は姓が最初のインデックスなので、姓で検索すると高速だが、名で検索しても高速ではない。同様に特定の文字で終わる姓の人の検索にも役たたない。
- インデックスで列をスキップすることはできない。つまり名がMakikoで特定の誕生日をもつ人物を検索することはできない。必ず一番最初に貼ったインデックスの値を指定しなくてはいけない。

## ハッシュインデックス

ハッシュインデックスはハッシュテーブルに基づくインデックス。インデックスのすべての列を使用する正確な検索にのみ役に立つ。
MySQLでこの仕組みをサポートするのはMemoryストレージエンジンだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202653/abd6a828-a784-f354-2cd1-604f8176f6a1.png)

こんなテーブルがあったとする。
架空のハッシュ関数f()があったとして

```
f('Arjen') = 2323
f('Baron') = 7437
f('Peter') = 8784
f('Vadim') = 2458
```

というハッシュが生成されるとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202653/2926ab23-3ddd-92bb-2eb1-b37a3415a56b.png)

このようにハッシュ値とポインタのテーブルを用意して、ここから検索することができる。
インデックス自体は短いハッシュ値を格納するだけなので、ハッシュインデックスは非常にコンパクト。
Docker-ComposeでDrupal８環境を構築する

## 初めに
 簡単にDrupalを試せる環境を構築しました。手順をメモしておきます。誰かに参考になれば幸いです。

## 環境情報
  今回はAWSのEC2に構築します。 
  Docker,Docker-Composeのバージョンは以下の通りです。

  ```
[ec2-user@ip-172-31-38-95 ~]$ uname -a
Linux ip-172-31-38-95.ap-northeast-1.compute.internal 4.14.114-105.126.amzn2.x86_64 #1 SMP Tue May 7 02:26:40 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[ec2-user@ip-172-31-38-95 ~]$ docker --version
Docker version 18.06.1-ce, build e68fc7a215d7133c34aa18e3b72b4a21fd0c6136
[ec2-user@ip-172-31-38-95 ~]$ docker-compose --version
docker-compose version 1.24.0, build 0aa59064
  ```

## Docker-compose起動
- Docker-composeファイルを作成します。  

```
cat |tee docker-compose.yaml <<EOF
version: '3.1'

services:

  drupal:
    image: drupal:8-apache
    ports:
      - 8080:80
    volumes:
      - /var/www/html/modules
      - /var/www/html/profiles
      - /var/www/html/themes
      - /var/www/html/sites
    restart: always

  postgres:
    image: postgres:10
    environment:
      POSTGRES_PASSWORD: example
    restart: always
EOF
```
- 下記内容のファイルが作成されることを確認します。

```docker-compose.yaml
version: '3.1'

services:

  drupal:
    image: drupal:8-apache
    ports:
      - 8080:80
    volumes:
      - /var/www/html/modules
      - /var/www/html/profiles
      - /var/www/html/themes
      - /var/www/html/sites
    restart: always

  postgres:
    image: postgres:10
    environment:
      POSTGRES_PASSWORD: example
    restart: always
```

- docker-composeを起動します。  
 
```
docker-compose up -d
```
下記内容が表示されたら、起動完了しました。  

```
Creating drupal_postgres_1 ... done
Creating drupal_drupal_1   ... done
```

## セキュリティグループ編集  
今回はAWS EC2に構築するため、外部から80ポートとの通信を許可する必要があります。
EC２にアタッチしたセキュリティグループのインバウンドルールを編集し、ポート範囲＝8080、ソース＝マイIPのルールを追加します。

## Drupalのインストール  
http://${host}:8080 をアクセスすると、インストールを開始します。
※${host}はdocker-composeを起動したマシンのIPもしくはホスト名です。　　

1. 「Choose Language」に「日本語」を選択し、「Save and continue」をクリックします。
<img width="667" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193995/a144cd65-d91f-0359-f67a-0840d45484f7.png">
2. 「インストールプロフィール」は「標準」のまま、「保存して次へ」をクリックします。
   <img width="673" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193995/d4abe1f1-5c55-8bfb-d97e-9598183e347c.png">

3. 「データベースの構成」に、「PostgreSQL」を選択し、「データベース名」、「ユーザー名」、「パスワード」に「postgres」、「postgres」、「example」を入力します。 
   「高度なオプション」を開き、「ホスト」に「postgres」を入力して「保存して次へ」をクリックします。
　　<img width="680" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193995/7cef3fc8-f573-5349-27d9-af947794e595.png">

4. 「サイトの環境設定」に必須項目を入力して、「デフォルトの国」、「デフォルトのタイムゾーン」に「日本」と「Tokyo」を入力し、「自動的にアップデートを確認」を外して「保存して次へ」をクリックします。
  <img width="684" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193995/6705277d-e038-9a48-0491-6b55dd465963.png">

5. 「おめでとうございます。Drupalのインストールが完了しました。」が表示されたら、インストール完了。
<img width="970" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193995/19d63da8-ce79-9ed5-551b-10a732b28a85.png">
IntelliJ IDEA Coroutineのデバッグを有効化

## デバッグを有効化する

Kotlin Coroutineを学習中でデバッグ機能を有効化したいが設定できない、
そんなときは次の手順で設定すると有効化できる。

1. 「IntteliJ IDEA」->「Run」->「Edit Configurations」を開く
2. 「VM options」に「-Dkotlinx.coroutines.debug」を入力し「OK」を押す


## 有効化してサンプルを実行してみる

それじゃ試しに設定した後に[Debugging coroutines and threads](https://kotlinlang.org/docs/reference/coroutines/coroutine-context-and-dispatchers.html#debugging-coroutines-and-threads)のサンプルを実行してみます。

```kotlin
import kotlinx.coroutines.*

fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")

fun main() = runBlocking<Unit>{
    val a = async {
        log("I'm computing a piece of the answer")
        6
    }

    val b = async {
        log("I'm computing another piece of the answer")
        7
    }

    log("The anwer is ${a.await() * b.await()}")
}
```

### デバッグを有効化した場合
有効化したときは@coroutine#2、@coroutine#3が表示されているのでしっかり有効化できています。

```terminal
[main @coroutine#2] I'm computing a piece of the answer
[main @coroutine#3] I'm computing another piece of the answer
[main @coroutine#1] The anwer is 42

Process finished with exit code 0
```

### デバッグを無効化した場合
無効化したときは@coroutine#2、@coroutine#3が表示されてませんね。

```terminal
[main] I'm computing a piece of the answer
[main] I'm computing another piece of the answer
[main] The anwer is 42

Process finished with exit code 0
```
atcoder 茶色レートを目指して 4話　ABC131とABC132に参戦

#はじめに
このサイトでは私が灰色レートからから茶色レートになるまでをまとめている。（お久しぶりです）
#活動報告
今回はABC131とABC132に参戦したので問題ごとに反省などを書いていきます。使用言語はC++です。
#ABC131 A問題
・問題:https://atcoder.jp/contests/abc131/tasks/abc131_a
・提出コード:https://atcoder.jp/contests/abc131/submissions/6058497
この問題は、4桁の数字列を位ごとに分けて比較したので、実装するにもデバックするにも時間がかかりました。（string型を使用すると位ごとに分けることなく比較ができます。）
実装例:https://atcoder.jp/contests/abc131/submissions/6206760
#ABC131 B問題
・問題:https://atcoder.jp/contests/abc131/tasks/abc131_b
・提出コード:https://atcoder.jp/contests/abc131/submissions/6062688
この問題はB問題特有のやることは簡単だけど問題文を理解するのがめんどいタイプの問題でした。なので実装の仕方がわからないという方はABCの解説を見ていただくとありがたいです。

#ABC132 A問題
・問題:https://atcoder.jp/contests/abc132/tasks/abc132_a
・提出コード:https://atcoder.jp/contests/abc132/submissions/6163287
この問題は上記にあるABC131のA問題の逆バージョンだったので、前回のABC131のA問題がわかれば解けると思います。
#ABC132 B問題
・問題:https://atcoder.jp/contests/abc132/tasks/abc132_b
・提出コード:https://atcoder.jp/contests/abc132/submissions/6166333
この問題は、制約を見ればわかる通り文章通りの実装をしてもTLEにはならないことがわかる。だから特に考えずに文章通りに実装すればできます。
#ABC132 C問題
・問題:https://atcoder.jp/contests/abc132/tasks/abc132_c
/
・提出コード:https://atcoder.jp/contests/abc132/submissions/6169180
この問題は、入力した値を配列に格納して昇順にソートします。そして制約から配列の要素数は偶数なので中央値を出すときに約真ん中となる２数が必要になります。急に話が進みますが、その２数の引き算の絶対値が答えになります。なぜかと言いますと２つに分割する際に両方の要素数が等しくなるのは、中央値のときである。しかし今回は偶数なので、中央にある２数を使って中央値を出す必要があるがこの２数の間で分ければ両方の要素数が等しくなります。よって２数の引き算の絶対値が答えになります。
#終わりに
今回は前回と前々回の２つのABCについて書いていきましたが、最近のABCは上の層の人も参加しているのでC問題まで解いてもスピード次第では灰色パフォになってしまうのは初心者には辛いところですが、茶色レート目指して頑張っていきたいです。
#反省
最近学校の課題やABCでレートが下がるなどで憂鬱になり投稿をめんどくさくなり今回のようなABC２回分を１回分にまとめるという見る側には苦行でしかない文になってしまいました。すいません。次回からはABCを貯めないようにします。
【Python】JR西日本の指定路線の1分以上遅延のある電車を調べる

JR西日本の指定路線で1分でも遅延している電車を調べてみる。

JSONのありかは「https://www.train-guide.westjr.co.jp/api/v3/」に
https://www.train-guide.westjr.co.jp/area_kinki.html
から各路線のファイル名+.jsonで
_st.jsonから駅の情報が取得できます。

神戸線の場合、

``` .py
import json
import urllib.request

try:
    url = 'https://www.train-guide.westjr.co.jp/api/v3/kobesanyo.json'
    url_st = url.replace('.json','_st.json')
    res = urllib.request.urlopen(url)
    res_st = urllib.request.urlopen(url_st)
    data = json.loads(res.read().decode('utf-8'))
    data_st = json.loads(res_st.read().decode('utf-8'))

    dictst = {}

    for station in data_st['stations']:
        dictst[station['info']['code']] = station['info']['name']

    for item in data['trains']:
        if item['delayMinutes'] > 0:
            stn = item['pos'].split('_')
            try:
                position = dictst[stn[0]] + '辺り'
            except KeyError:
                position = "どこかよくわかんない"
            print(item['displayType'], item['dest']['text'],'行き:',item['delayMinutes'],'分遅れ',position,'辺り')

except urllib.error.HTTPError as err:
    print('HTTPError: ', err)
except json.JSONDecodeError as err:
    print('JSONDecodeError: ', err)
```
出力結果

```
普通 高槻 行き: 2 分遅れ 尼崎辺り
普通 四条畷 行き: 2 分遅れ 神戸辺り
新快速 姫路 行き: 1 分遅れ 大久保辺り
普通 網干 行き: 6 分遅れ 大久保辺り
```

こんな感じです

後々したいこと
列車位置情報アプリが10分以上の遅れしか通知してくれないので、cronとかで定期的に実行とかでslackに送りつけるとかLINEで通知とかしたい
51歳からのプログラミング　備忘　Laravelとjqueryでリアルチャットモドキ

やっと、チャット擬きが作れたよ。

僕レベルじゃチャットも作れないのかと、何度も諦めそうになったけれど、楽しいから、もがてみた。子供のおもちゃのようなコードなんだろうけれど、何となく動いてくれたので、とりあえず。

（二重投稿防止とか、リロード関連の処理とか、そういうのはやってません。）

DB
--
テーブル：Chat

|カラム|内容|
|:---|:---|
|comment|投稿コメントを記録|
|created_at|フィールド作成日時を記録|

流れ？
--
１．サイトインの時に日時を取得
２．SSEで、１もしくは３　の日時以後のログを出力
３．ajaxで画面遷移せずにコメント登録して、ログを出力し、登録日時を取得

各日付は更新日時として$_SESSION['CURRENT']で管理


controller
--

```php:controller

//     サイトIN時に、日時をSESSIONに更新日時として記録
public function index(){
       session_start();
       $_SESSION['CURRENT'] = date('Y-m-d H:m:s');
       return view('index');
}

//     更新日時以降のコメントがあれば、クライアントに送信し
//     更新日時を最新のコメント日時に更新
public function sse(){
       session_start();
       $comment = Chat::all()->toArray();

       header('Content-Type:text/event-stream');
       foreach($comment as $value){
            if($value['created_at'] > $_SESSION['CURRENT'] ){
                      echo 'data:'.$value['comment'];
                      echo "\n\n";
                      flush();
            }
       }

       $current = Chat::orderBy('created_at','desc')->first()->toArray();
       if($current['created_at'] > $_SESSION['CURRENT']){
          $_SESSION['CURRENT'] = $current['created_at'];
       }
}


//     ajaxで送信されてきたコメントを登録し、更新日時を更新
public function ajax(Request $request){
       session_start();

       $comment['comment']  = $request->comment;
       if(isset($comment['comment'])){
                $chat = new Chat;
                $chat->fill($comment)->save();
       }

       $comment = Chat::orderBy('created_at','desc')->first()->toArray();
       $_SESSION['CURRENT'] = $comment['created_at'];
       return response($comment);
}
```



クライアント側
--
```html:index.blade.php

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<script>
  $(function(){
    var commentInp  = $('input[name="comment"]');

    //  sse
    var source = new EventSource('sse');
        source.onmessage  = function(chat){ 
                            $('div[name="comment"]').prepend('<p>'+chat.data);
                            }

    //  ajax
    $('form').submit(function(){
        comment = commentInp.val();
        $.ajax({
                  type   : 'post',
                  url    : 'ajax',
                  data   :{'comment':comment,_token:'{{csrf_token()}}'},
        }).then(
           function(chat){ $('div[name="comment"]').prepend('<p>'+chat['comment']);},
           function(){},
        );
        return false;
    });
  });
</script>

<form>
  <input type="text" name="comment"/>
  <button>send</button>
</form>

<div name="comment"></div>
```
今の僕には、このコードが限界。
websocketとか、プロトコルを操る人に羨望！
僕には無理かなー。

ITに関係ない一言
--
子供とね、試作チャットで遊んでたんだけど、リアルタイムに発言が反映されないので、使いづらいって言われたのです。３か月前のことなんだけれど。

んで、リアルタイムに発言を表示できるようにしようと試みたんだ。でも、こんな時間がかかるとはね、僕の脳は優秀ではないようですな。
【Watson Studioメモ】IBM idの登録がないユーザーがWatson Studioの招待を受けた場合の対応手順

# はじめに
別記事[【Watson Studioメモ】Watson Studioで追加ユーザーの招待をする](https://qiita.com/makaishi2/items/a02083782f8a985df24e)で招待を受けたユーザーがIBM idも未登録であった場合、**IBM id**と**Watson Studio**と二段階のアクティベーションが必要なため、対応手順がやや複雑になります。その場合の手順を以下で説明します。

# Step1 最初の招待メール
最初に下記のように「IBM Watson Studio」から招待メールが届きます。

![スクリーンショット 2019-07-01 19.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/edb9f00c-f625-da21-3d19-5ebbefa33ee2.png)

このメールを開くと次のような画面になるので、「Join」ボタンをクリックします。

![スクリーンショット 2019-07-01 19.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/75fb493b-f795-3717-9e96-d719cb3ad5e4.png)

# Step2 IBM idのアカウント登録
対象ユーザーがIBM idにも未登録に場合、下記のようにIBM id登録用の画面が表示されます。
必要事項をすべて記入して「作成」ボタンをクリックして下さい。

![スクリーンショット 2019-07-01 20.05.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/18c410d0-5454-0eb8-1015-fe21d02339eb.png)

下のようなロボット防止用の画面が表示されます。失敗してもリトライ可能ですので、慌てずに指示に従って下さい。

![スクリーンショット 2019-07-01 20.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/fc6105ca-0b76-8491-8f39-dcc7dec83014.png)

次の画面が出ればIBM idの登録は完了です。最後のステップとしてIBM idのアクティベーション作業があります。

![スクリーンショット 2019-07-01 20.06.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6556281d-5bb8-bffb-4ba7-b5eab3aae0c1.png)


# Step3 二度目の招待メール
IBM idのアクティベーションを行うため、下記のような二度目のメールが**IBM Cloud**から届きますので、このメールを開いて下さい。

![スクリーンショット 2019-07-01 20.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a023c677-62ad-de3b-2e0e-9f6674f70add.png)

下の画面になるので、**Confirm account**ボタンをクリックして下さい。

![スクリーンショット 2019-07-01 20.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/8b0bbe8c-a0df-3e1d-089d-75ae05894544.png)

次の画面がでてくれば設定完了です。**Get Started**のボタンをクリックすると、Watson Studioの初期画面が表示されるはずです。

![スクリーンショット 2019-07-01 19.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/19d4e2f8-428b-bfd4-400b-e4e2a4c4d793.png)
TECH ~Day8~

学習内容
・ビュー（view）、コントローラ（controller）、ルーティング（routing）
・mysql
・Gem
・rails console


・ビュー（view）、コントローラ（controller）、ルーティング（routing）
ビュー（view)
ページの「見た目」を作るためのHTMLファイル。
ブラウザとRailsのやり取りの中で、Railsからビュイーが返され、ページが表示される。
ビューの内容がブラウザに表示されるもの。

コントローラ（controller）
コントローラはルーティングからビューへと処理を受け渡す役割を持つ。
ページを表示するときにRailsの中ではコントローラを経由してビューをブラウザに返す。
コントローラ内のメソッドを「アクション」と呼ぶ。

（例）
　class ~~~~~~~
　　def top
　　end
　end
！def~endまでの形を「アクション」と呼ぶ。


・mysql
mysqlとはデータベースの一種である。


・Gem
Railsはgemと呼ばれる便利なrubyライブラリをインストールし、利用することで、より簡単にアプリケーション開発できるようになる。
全てをゼロから作るよりもgemのライブラリも利用することでより効率的に開発できる。
gemの追加方法
　gemfileを編集し、ターミナルでbundle installコマンドを実行する。


・rails console
これはrubyコードを手軽に実行できる環境である！！！
（タ）　$ rails console ←起動


学習八日目に入り、ついにrailsのカリキュラムに入りました。rubyの内容と似ているのかと思いきや、rubyのコードを書くまでの環境づくりや、rubyを混ぜ込んだrailsでの様々な書き方が新しく出てきたことによって、また色々な可能性が広がってきたように感じます。
ここからさらに学習し、様々なパターンの使い方を身に付けたいと思います。
iOS Simulatorでタッチポインターを表示させる

iOS Simulator（シミュレーター）でタッチポインターを表示させる方法を共有します。 [^1]

# 手順

## plistにエントリを追加
`defaults` コマンドでエントリを追加して、シングルタッチ表示を有効にします。

```
$ defaults write com.apple.iphonesimulator ShowSingleTouches 1
```

## Simulatorアプリを再起動

Simulatorアプリを再起動すると、タッチポインターが表示されるようになります。

以上

[^1]: Google検索結果にQiitaの記事『[iOS Simulatorでタッチポインタを出す方法](https://qiita.com/418status/items/d42c8abd6de07f91cb43)』を見つけたものの閲覧できない状態になっていたため投稿しました
Storybookで他のサーバにリクエストをプロキシ(Proxy)する方法


Storybook を用いたフロントエンドの開発で、
一部のリクエストのみ、別サーバーへプロキシする（リクエストを転送する）方法が少し変わっていたので、その備忘録です。


## WebpackDevServerの設定ではできない😨？


`WebpackDevServer`のプロキシは、 proxyパラメータを介して設定することができます。
APIクライアントを開発する場合にはとても便利な機能ですね😇

`/api`へのリクエストを他のサーバーへプロキシする設定は、以下の通り。


```javascript:webpack.config.js
  devServer: {
    proxy: {
      "^/api": {
        target: "https://api-endpoint.com",
        changeOrigin: true
      }
    },
```

しかし、プロキシを追加してみても、うまくいかない。。。😫😫😫

## middleware.js を追加して機能を拡張する！😇

Storybook には柔軟なミドルウェアの拡張機能があります。
 「Storybook の`config`フォルダに`middleware.js`を追加」することで、
ルーティングの過程に何らかの処理を差し込むことができます！


`WebpackDevServer`を直接使用せず、プロキシサーバーをカスタマイズするためには
以下のような`middleware.js`ファイルを置きます。

```javascript:middleware.js

const proxy = require("http-proxy-middleware");

module.exports = router =>
  router.use(
    "^/api",
    proxy({
      target: "https://api-endpoint.com",
      changeOrigin: true
    })
  );
```
※注意点、ターゲットURLに変更するには、`changeOrigin`オプションを明示的に`true`に設定する必要があるみたいです！


簡単にプロキシミドルウェアを設定できる
[http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware)パッケージを使っています✌️

```
$ yarn add -D http-proxy-middleware
```


## まとめ

Storybook にこんな便利なミドルウェアのカスタム設定があることを知ったと同時に、
Express で作られていることを今更ながら知りました😭
【AtomPub API】Livedoorブログの投稿記事を取得する

#はじめに
趣味でLivedoorブログをやっていて毎日投稿を心がけている。
しかしながら、なかなか毎日の投稿数が安定しない。
個人的には毎日の投稿数とかが可視化されているとモチベーションが上がるので、勉強も兼ねてやってみようと思う

プライベート端末で実装するため、あまり複雑なコーディングはしたくない。よって一番馴染みがあるNode.jsを使って簡単なスクリプトを組む。
やることは以下一点

- 記事作成日が昨日の日付のものを抽出する

※スプレッドシートへの書き込みはひとまず置いといて、Livedoorブログから投稿記事の取得を試みる
※APIの細かい使用は[公式](http://help.blogpark.jp/archives/52372407.html)を参照。

#使用モジュール
- wise
- request
- xml2json

# ソース

```livedoor.js
let wsse = require('wsse');
let request = require('request');
let parser = require('xml2json');

var token = new wsse.UsernameToken({ username: '【UID】', password: '【API_KEY】' });

// 記事を取得
var options = {
    url: 'https://livedoor.blogcms.jp/atompub/【ブログID】/article',
    method: 'GET',
    headers: {
      'Authorization': 'WSSE profile="UsernameToken"',
      'X-WSSE': token.getWSSEHeader({nonceBase64:true})
    }
  };

  // リクエスト実行
  request(options, function(error, response, body) {

    // XML形式で返ってくるのでJSONにパース
    var json = parser.toJson(body);
    let obj = JSON.parse(json);

    // 昨日の日付のエントリ
    let toDaysEntry = [];

    // from(昨日の日付の00:00:00)
    let from = new Date(new Date().setHours(0, 0, 0, 0));
    from.setDate(from.getDate() - 1);
    from.setHours(from.getHours() + 9); // +09:00

    // to(今日の日付の00:00:00)
    let to = new Date(new Date().setHours(0, 0, 0, 0));
    to.setHours(to.getHours() +9); // +09:00

    // エントリはfeed.entryに格納されている
    if(obj.feed && obj.feed.entry){

        for(let i = 0 ; i < obj.feed.entry.length; i++){
          // エントリ
          let e = obj.feed.entry[i];
          // 最終更新日をDate型に変換
          let eDate = new Date(e.updated);

          // 昨日の日付のエントリだけ抽出
          if(eDate > from && eDate < to){
            toDaysEntry.push(e);
          }
        }

        console.log(toDaysEntry.length);
      }
  });
```

# 感想
今回はおそらく一番オーソドックスな投稿記事の取得だけだったが、APIから投稿することも可能らしい。
なんにせよこれで件数は取得できたので、次回はスプレッドシートへの書き込みをやってみようと思う。