OmniAICreator/Qiita-1.07M huggingface dataset:
Wake Up Spotipy !

# 背景
年始から[朝渋](http://asa-shibu.tokyo/)という渋谷の朝活コミュニティにJOINしました。
また気まぐれでApple MusicからSpotifyに移行してみました。
ところがここでiPhoneの目覚ましにアーティスト音源が使えなくなってしまったことに気づき、ひどく落胆しました。
本稿ではこの問題を解決するためのSpotify目覚まし時計を実装します。
スマホだとベッドから近くて止めてしまうので、机上に佇むiMacくんに吠えてもらいます。
# Spotipy
SpotipyはSpotify Web APIのための軽量のPythonライブラリです。 Spotipyを使用すると、Spotifyのプラットフォームによって提供される音楽データのすべてにアクセスすることができます。名前がややこしいですが語感が可愛いので許します。

使い方は非常に簡単です。同じく語感の可愛いpipちゃんでそのままインストールできます。

```
pip install spotipy
```

#Spotify側の作業

次にSpotify側からClient IDとClient Secretを持ってきます。
Spotify for Developpersの[DASHBOARD](https://developer.spotify.com/dashboard/applications)でCREATE A CLIENT IDします。
<img width="2039" alt="スクリーンショット 2019-02-01 0.30.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/351978/085b26be-e72c-3122-540e-008e9e18af42.png">
すると次のような画面が現れるので適当に入力します。
<img width="569" alt="スクリーンショット 2019-02-01 0.33.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/351978/708d5a49-1770-13e0-0c87-3a6335b3668c.png">
NEXT、SUBMITするとDASHBOARDにアプリケーションが追加されます。
<img width="2047" alt="スクリーンショット 2019-02-01 0.36.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/351978/941527d1-119f-8d90-b46a-a71f1de4b9da.png">
このアプリページを開くとClient IDとClient Secretがあるのでせっせと回収します。水色のところです。

次に同じくSpotify for Developpersの[CONSOLE](https://developer.spotify.com/console/)からPlayerのエンドポイント/v1/me/player/devicesを選択します。
<img width="2048" alt="スクリーンショット 2019-02-01 0.48.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/351978/aca42041-479e-3bf7-e75b-af01871d8e6a.png">
GET TOKENして
<img width="650" alt="スクリーンショット 2019-02-01 0.55.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/351978/5b1dbc61-6420-13a0-9f5b-3a06f5a0a43e.png">
REQUEST TOKEN、TRY ITすると右下にdevicesという辞書が表示されます。ここのidを引っこ抜いておきます。

最後に同じくSpotify for Developpersの[CONSOLE](https://developer.spotify.com/console/)からPlayerのエンドポイント/v1/me/player/playを選択します。ここでも同じようにトークンを発行してこれも引っこ抜きます。この時点で

+ Client ID
+ Client Secret
+ device id
+ token

の4つが手元にあるか確認してください。確認できたらSpotify側の作業は終了です。

# Python側の作業

作業と言っても数十行のプログラムを記述するだけです。
標準入力で起床時間を設定し、その時刻になったら指定したデバイスで、標準入力で指定した曲が再生されます。

```python:wakeup.py
from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
import time

print("明日は何時に起きますか？")
print("HOUR:")
HOUR = int(input())
print("MIN:")
MIN = int(input())

print("何の曲で起きますか？")
print("URI:")
SONG = str(input())

client_credentials_manager = SpotifyClientCredentials("Client ID", "Client Secret")
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
token = "token"
sp = spotipy.Spotify(auth = token)
while True:
    now = time.localtime()
    if now.tm_hour == HOUR and now.tm_min == MIN:
        sp.start_playback(device_id = "device id", context_uri = SONG)
        break
```

以上です。ターミナルから実行して起きたい時分を入力します。
Spotifyから鳴らしたいアルバムのURI(アートワークの横の...からシェア>Spotify URIをコピーで拾えます)を入力して完成です。
明日の朝は7時半にbohemianvoodooのAdria Blueで起床します！おやすみ！
Herokuで既存のアプリを公開する

## この記事の内容を一言で
**[myself-calculator](https://myself-calculator.herokuapp.com/)をHerokuに登録しインターネットに公開する**

## 問題
自分が作成したプログラムをインターネット上に公開して、誰からでも確認できるようにしたい。
GithubのIssue: [Upload Internet](https://github.com/kaibara/calculator/issues/8)

## 解決策
[Heroku](https://dashboard.heroku.com/)を利用する

## 必要な知識
Git

## 解決法
### Herokuの準備
[Heroku](https://dashboard.heroku.com/)へ行き、アカウントを作成する。
アカウントを作成できたら、`Create new app`を選択。
![Screenshot from 2019-02-01 00-05-06.png](https://qiita-image-store.s3.amazonaws.com/0/218398/60e5edd6-9b29-a6ad-9f7e-f61368821a1d.png)

`App name`にアプリの名前を登録する。
その名前でURLが生成される。
regionは変更しない。
![Screenshot from 2019-02-01 00-13-34.png](https://qiita-image-store.s3.amazonaws.com/0/218398/e4461f77-3e24-ec0d-ae5f-0d943e4f231f.png)

次に、ターミナルでherokuを操作できるように[Heroku toolbelt](https://toolbelt.heroku.com)をインストールする。
[Download and install](https://devcenter.heroku.com/articles/heroku-cli#download-and-install)から各OSに合わせた方法でPCに導入する。
インストールが完了したら、次のコマンドを打つ。

```install.sh
 $ heroku login
```

これでブラウザにHerokuのログイン管理画面が開かれる。

```login.sh
heroku: Press any key to open up the browser to login or q to exit: 
Logging in... done
Logged in as (Herokuに登録したメールアドレス)
```

ブラウザでログインが完了し、ターミナルで次の表示が出されたら完了。

### Heroku git
既にアプリを作成している場合、gitと連携をすることでインターネット上に公開できる。
そのためのコマンドが次。

```git.sh
 $ heroku git:remote -a 登録したアプリ名
```

上のコマンドを打ち、次の結果が返ってきたらOK。

```remote.sh
 set git remote heroku to https://git.heroku.com/(作成したアプリ名).git
```

### デプロイ(インターネット上に公開)
gitとの連携ができたら、今の内容をherokuのremote　repositoryにpushする。
そうすることで、自分のアプリがインターネット上に公開される。
pushのコマンドは次。

```push.sh
$ git push heroku master
```

コレが成功すれば、インターネット上に公開される。

### pushする際に起きた問題
自分がpushする際、以下の問題が発生し、それぞれ次のように対処した。
#### yarn.lock
<img src="https://qiita-image-store.s3.amazonaws.com/0/218398/d3c10073-470b-a580-db61-28f7ba598a6c.png">
やったことは上の画像にある通り次のコマンド。

```yarn.sh
 $ yarn install
 $ git add .
 $ git commit -m "feat:create yarn.lock"
 $ git push
```

これを打ったがまだ解決しなかった。
原因は、`master`ブランチに`yarn.lock`がなかったこと。
自分はブランチを切り替えて作業していたため、上の操作をしても`master`には`yarn.lock`がなかった。
Pull Requestを作成し、Mergeをして、masterブランチに移動し、git pullして、

```push.sh
 $ git push remote master
```

をすることで、無事にpushできた。

### 今後やるべきこと
今回はデプロイするまでの方法だけを述べた。
他の人の記事を見ると、Herokuを使った操作は他にもあるみたいなので、継続して勉強を行っていく。

## Github
Issue: [Upload Internet](https://github.com/kaibara/calculator/issues/8)
PR: [feat: create yarn.lock](https://github.com/kaibara/calculator/pull/11)

## 参考資料
[今からはじめるReact.js〜Herokuへのデプロイ〜](https://qiita.com/kuniken/items/70c2b5cd77d7c9301bcf)
PowerAppsで録音したファイルを取り込んでみる

# 前回の続きなんじゃ
前回の記事はこちらです！
[PowerAppsのマイクコントロールの録音データを保存する](https://qiita.com/rnakamuramartiny/items/f45f299b39196da238cb)

# 録音したら・・・
それまでよ！

じゃ意味ないっすよね(笑)
音楽アプリだったら
世界に一つだけの曲じゃなく
世界に**一瞬**だけの曲になっちゃいますしね orz

# じゃあ取り込んでみましょう
## 材料はこちら！
* ボタンコントロール
* オーディオコントロール

### ボタンコントロール
OnSelect プロパティに以下を入れましょう。

```php:OnSelect
UpdateContext(
	{LoadAudio:AzureBlobStorage.GetFileContentByPath(
			"audiocontoller/Audiodata.aac"  //録音したデータの格納場所
		)
	}
)
```

### オーディオコントロール
Media プロパティに以下を入れましょう

```php:Media
LoadAudio
```

はい、おしまい！
あとは、追加したボタンを押して、新しく作ったオーディオコントロールの再生ボタンを押したら
あら不思議！
さっき録音してBlobに保存したデータが聴けますよ！

# え？もう終わり？？
はい。

# もっとなんかないのかよ！さすがに今回の記事短すぎるだろ！！
ですよねぇー
あんまり短いもんだから、ボタンコントロールのソース
見づらいぐらい改行したぐらいですもんねぇー

そうっすよねー
もうちょっと実りがないと
「**いいね**」もらえないですもんねぇ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/37bd265a-af23-73a0-31df-d081e1240536.png)


# というわけで・・・応用編です。
ボイスレコーダーでも作りましょうかね。
特に解説は行いません。
何をやってるかは実際に作ってみながら理解しましょう！

# 作り方
## 材料
* メディアコントロール
* マイクコントロール
* ボタンコントロール ×3

## マイクコントロール

```php:DisplayMode
If(IsBlank(LoadAudio),DisplayMode.Edit,Disabled)
```

## メディアコントロール

```php:Media
If(IsBlank(Microphone1.Audio),LoadAudio,Microphone1.Audio)
```

```php:DisplayMode
If(IsBlank(LoadAudio),If(IsBlank(Microphone1),Disabled,Edit),Edit)
```

## ボタンコントロール
### セーブボタン

```php:OnSelect
AzureBlobStorage.CreateBlockBlob("voicerecorder","data1.aac",Microphone1)
```

### ロードボタン

```php:OnSelect
UpdateContext(
	{
		LoadAudio:AzureBlobStorage.GetFileContentByPath("voicerecorder/data1.aac")
	}
)
```

### リセットボタン

```php:OnSelect
UpdateContext({LoadAudio:Blank()});Reset(Microphone1)
```

完成動画はこちら！
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> でボイスレコーダーを作ったぞ！<br><br>I made voice recorder using powerapps!! <a href="https://t.co/vEJcZ5S0Xg">pic.twitter.com/vEJcZ5S0Xg</a></p>&mdash; りなたむ@steed400 (@R_t_A_n_M) <a href="https://twitter.com/R_t_A_n_M/status/1091001692152225794?ref_src=twsrc%5Etfw">2019年1月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
vim設定のまとめ #1

vim 歴は５年くらいになったので、備忘録的に一度書こうと思います。
色々な人の記事を参考にしながらカスタマイズしたため、元の記事を忘れてしまっています。。。
紹介できず大変申し訳ないですが、当時はとても助かりましたmm
また、今回Qiita初投稿なので、ご指摘あれば是非お願いします。

私の設定ファイルは [コチラ](https://github.com/nzw/dotfiles) です。
また使用しているプラグインの一覧は、[コチラ]
(https://github.com/nzw/dotfiles/blob/master/install_list.txt) です。
# 対象
- vim の基礎までを学びカスタマイズがまだの人
- vim を一度も使おうと検討したことがないエンジニア

# 個人的にベストな環境
- Mac ＋ USキーボード
- エディタは「[iTerm2](https://www.iterm2.com)」

# vim のメリット・デメリット
### メリット
1. ホームポジションをキープできるので、マウスやEnterボタンも不要
2. カーソル移動が簡単。矢印キーは不要
3. 文字の削除などが簡単。　deleteキーは不要
4. 自分仕様に設定や拡張できるのが楽しい
5. キーバインドの設定を他のエディタ（[Atom](https://atom.io/) や [VSCode](https://code.visualstudio.com)）に引き継げる
6. シェルや設定ファイルの勉強になる

など

### デメリット
1. キー操作を覚えるのが大変
2. カスタマイズが面倒
3. 古臭い

など


最初に覚える手間はとても大きいものの、一度覚えてしまうと色々なところで応用が効きます。
そのため、覚えるメリットは大きいと思います。
vim の基本操作がまだの人は、他の人の記事ですが参考にどうぞ。
- [よく使う Vim のコマンドまとめ](https://qiita.com/hide/items/5bfe5b322872c61a6896)
- [Vim幼稚園からVim小学校へ](https://qiita.com/hachi8833/items/7beeee825c11f7437f54)

# カスタマイズした vimの操作
## ファイルの展開
まず、vimエディタを起動。`vim ファイル名`でも起動します

```shell
> vim
```
起動後、ファイル一覧が表示されるように設定されています。
![スクリーンショット 2019-02-01 0.14.15.png](https://qiita-image-store.s3.amazonaws.com/0/11030/01b27c20-4d7c-f533-46ed-688e33b17f35.png)
カーソルを開きたいファイル名に合わせて、`o`ボタンで右側にファイルが表示されます。
![スクリーンショット 2019-02-01 0.17.37.png](https://qiita-image-store.s3.amazonaws.com/0/11030/230063ec-9785-240a-7dd5-f8f6cad5d22d.png)
ディレクトリの場合は、展開されます。閉じる場合も同じ。全部展開は、`O`(大文字のオー)
![スクリーンショット 2019-02-01 0.15.07.png](https://qiita-image-store.s3.amazonaws.com/0/11030/100be3c2-33d0-e817-832d-41822e7d183b.png)

|説明|コマンド|
|:---|:---|
|ファイルを開く、ディレクトリの開閉|`o`(小文字のオー) |
|ディレクトリを全部展開| `O`(大文字のオー)|

## ウィンドウの移動
ウインドウを移動したい場合、ctl +`w`と　下一覧のキーを押します。
例) 左のウインドウへ移動する場合は「ctl +`w`」「`h`」を順番に押します

|説明|コマンド|
|:---|:---|
|左|h|
|下|j|
|右|l　(小文字のエル)|
|上|h|
|垂直分割|v|
|水平分割|n|

ファイルの方向に垂直分割する場合は「ctl +`w`」からの「`v`」
水平分割する場合は「ctl +`w`」からの「`n`」
![スクリーンショット 2019-02-01 0.38.21.png](https://qiita-image-store.s3.amazonaws.com/0/11030/36ee9ca8-6269-17cd-d210-f58412141d97.png)

タブを展開したい場合、ファイル一覧のファイルかディレクトリにカーソルを合わせて、`t`を押す
![スクリーンショット 2019-02-01 0.40.56.png](https://qiita-image-store.s3.amazonaws.com/0/11030/6e315c3f-132d-cd58-7477-94a7f9c19f8c.png)
タブ間の移動

|説明|コマンド|
|:---|:---|
|前のタブ|sn|
|次のタブ|sp|


#### おまけ
入力文字の補完は、任意の文字を入力中に「ctl +`p`」で候補が出ます。
![スクリーンショット 2019-02-01 0.44.19.png](https://qiita-image-store.s3.amazonaws.com/0/11030/f8fbefde-af7e-d551-296e-8123b3183796.png)

今回はここまで。
MacでWindowsキーボード『Sculpt Ergonomic Desktop(L5V-00030)』を使う

プライベートではMac。
仕事ではWindows。
というスタイルでやってきていたのですが、晴れて会社がMac使用OKになったので早速Macを使っています。

基本的にはMacが好きなのですが、やはり一長一短でWindowsの方がここは良かったなという点もあります。
そのうちの一つにキーボードなどが豊富というのも一つの理由です。



<img width="966" alt="エルゴ.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/8342be3d-3df0-1cc1-4f8e-f62921b1c5db.png">

私の場合はタイトルのMicrosoftのL5V-00030が大好きです。





よく使いやすいのか聞かれるのですが、使いやすさではなく、使ってて楽しいという感じです。
車でいうならATとMTの違いのような感覚です。もちろん人間工学に基づいたデザインで身体への負担も少ないはずです。

当然Macに移ってもL5v-00030を使いたいので、
使い方を探したのでメモがわりに残しておきます。

# WindowsキーとMacキーの対比
Mac用Windows用と言っても、ほとんどのキーはそのまま使えます。
Windowsキーがいらなかったり、commandキーがなかったりというのが問題です。

具体的に私が変えたのは、以下のキーです。

| Windowsキー      |       Macキーに変更後 |
|:-----------------|------------------|
| 半角全角             |英数&かな|
| Windowsボタン           |command |    
| 無変換             |英数 |    
| 変換               | かな|    
| カタカナ             |かな|    
| アプリケーションキー(メニューキー)          |command| 

Altはoptionとしてそのまま使えます。Ctrlもcontrolとして使います。
半角全角はあまり使いませんが、Windowsと同様に切り替えて使える状態を保つと便利です。


# キーコードを調べる(Win)
<img width="56" alt="EventViewer.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/be7f0982-7877-e135-0e81-5e64bb95970b.png">キーコードはKarabiner-EventViewerを使います。

<img width="871" alt="main.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/b13402d3-ff6b-3a24-8ac6-a757a2bdd2b1.png">
このメインの画面でキーを押すとcodeとnameがわかります。もしL5V-00030以外のキーボードで同じことをしようとしている人は、人通り調べると無難です。
L5V-00030の人はキーは以下になります。

| KEY|code|name|
|:---|----|-----|
| 半角全角 |0x35|grave_accent_and_tilde|
| Windowsボタン|0xe3 |left_gui|    
| 無変換|0x8b |international5|    
| 変換|0x8a|international4|    
| カタカナ             |0x88|international2|    
| アプリケーションキー(メニューキー)|0x65|application| 

# キーコードを調べる(Mac)

次にMacのキーコードを調べておきましょう。
私が使っているMacBookPro(JIS)は以下です。
おそらく、Macbookは全て同じだと思います。

|Mac|code|name|
|:-----------------|-----|-----|
|command |0xe3|left_gui|     
|英数 |  0x91|lang2|   
|かな| 0x90|lang1|   


# キーコードを別のキーに割り当てる
キーボードのキーコードがわかれば、そのキーを別のキーに割り当てればおしまいです。
キーコードの割り当てを変えるには、
<img width="47" alt="key.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/81dfd252-41c6-ec58-e1ff-8b2372efa810.png">Karabiner-Elements Preferencesというアプリを使います。
<img width="1003" alt="Pref.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/8efd975e-0f16-3e15-c202-0d1b5d30a47c.png">

私はこのように割り当ててます。






# 半角/全角ボタンを生かす
半角/全角キーをf13に割り当ててますが、そのままでは機能しません。


<img width="665" alt="f13.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/11b9d7f2-3ab0-6080-30c9-db13dbcc7730.png">

[システム環境設定]の[キーボード][ショートカット][入力ソース]を選択し、
前の入力ソースを選択にチェックを入れてF13を割り当てます。

これで、Windowsと同じ動きをするようになります。

# マウスホイールの方向も変えよう
MacとWindowsではマウスホイールの方向が逆です。
L5V-00030には握りやすいマウスが付いてきます。
Macはトラックパットのジェスチャが優れているのでマウスはあまり使いませんが、
せっかくなので使えるようにします。


<img width="117" alt="rev.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/8a4c3ccb-2bcb-7aa9-0e38-ddfe537f15ef.png">Scroll Reverserを使います。

<img width="441" alt="スクロール変更.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/76d6a6ac-30dc-8fcb-1dd2-0a70b348b33d.png">
「マウスを逆にする」チェックをすればトラックパッドはそのままの使いごごちで使えます。



これで快適は、キーボード＆マウスライフを楽しむことができます。
【GAS】GAS・Googleカレンダーを使った超簡単な日報作成

#はじめに
Google Apps Scriptを使って簡単な日報を作りましょう。
その日のGoogleカレンダーの予定を自動で書き出してくれます。

若手メンバーが日報を書いて上司に提出することがあると思いますが、その日の予定をいちいち書いてるのが大変だろうなあと思って作ってみました。

※GASが何であるか、GASでのスクリプトの書き方等は一旦触れずに記載します（あしからず）

## やりかた

### 1.まずは下記スプレッドシートをコピーしましょう。
スプレッドシート
https://docs.google.com/spreadsheets/d/122nE7kgpgHXrA9UzArfcFa8781EDLaorCtw0p0hBi0k/edit#gid=0

### 2. 次にスプレッドシートのスクリプトエディタを開き、下記をコピペしてください。

```javascript:qiita.js
/* 指定のカレンダーの本日の予定をチャットワークに送る */
function getSchedule() {

  //スプレッドシート取得 
  var text   = SpreadsheetApp.getActiveSheet();
  var date = text.getRange(1,2).getValue();
  
  //カレンダー取得
  var myCals=CalendarApp.getDefaultCalendar(); //特定のIDのカレンダーを取得
  var myEvents=myCals.getEventsForDay(date);　//カレンダーの本日のイベントを取得

  // ヘッダー
  var strBody = "▼予定：" + Utilities.formatDate(date, 'JST', 'yyyy/MM/dd'+'\n')

  //　予定取得
  for(var i=0; i < myEvents.length; i++){
    var strTitle=myEvents[i].getTitle(); //イベントのタイトル
    var strStart=_HHmm(myEvents[i].getStartTime()); //イベントの開始時刻
    var strEnd=_HHmm(myEvents[i].getEndTime()); //イベントの終了時刻
    strBody = strBody + strStart + ' - ' + strEnd + ":" + strTitle + '\n'; //チャットワークに送る文字列にイベント内容を追加
  }
  text.getRange(2,2).setValue(strBody);  
}
 
  //現時刻
function _HHmm(str){
 
  return Utilities.formatDate(str, 'JST', 'HH:mm');
 
}
```

### 3. スプレッドシートのB1セルで取得したい予定の日付を選択し、関数「getSchedule」を実行


すると、、、

こんな感じでその日の予定が書き出されます!!

![image.png](https://qiita-image-store.s3.amazonaws.com/0/350535/ce826054-28c7-b6e9-cf7d-75cdb487749b.png)


なにかご不明点あればいつでもコメント下さい。
ローカルの画像ファイルを拡大する

```php
$path = 'images/thumbnails/84601548948163.png';
$file = File::get($path);
Image::make($file)->resize(300, 300)->save($path);
```

画像のアップロード方法の参考↓
https://www.kodementor.com/upload-multiple-images-in-laravel-5-7-tutorial/
Ubuntu で WI-U2-433DHP (USB Wi-Fi レシーバー) を使用する

## 検証環境

- Ubuntu 16.04
- バッファロー WI-U2-433DHP

これ以外でも Linux と USB 接続の Wi-Fi レシーバーであれば、この方法が使えるものはあると思います。

## 手順

1. USB 端子からレシーバーを外す
2. 端末 (Terminal) を起動する
3. DKMS パッケージをインストールする

```
$ sudo apt update
$ sudo apt install dkms
```

<br>4. 以下のコマンドを実行する

```
$ git clone https://github.com/zebulon2/rtl8812au.git
$ cd rtl8812au
$ sudo ./dkms-install.sh
```

<br>5. USB 端子にレシーバーを接続する

これで Wi-Fi が有効になるはずです。

## トラブルシューティング

以上の手順を行っても Wi-Fi が有効にならない場合、以下のコマンドを実行すると使えるようになるかもしれません。

```
$ sudo modprobe -a rtl8812au
```

<br>それでも駄目な場合はPCの再起動を試してみてください。

## 参考文献
1. [Arch Linux で BUFFALO「WI-U2-433DHP」を使う（2018/02/18 修正版） - とにかく書く](http://gaobin.hatenablog.com/entry/2018/02/18/144356)  
2. [かわうそまつり: BUFFALO「WI-U2-433DHP」をUbuntu14.04で使えるようにする！](http://kawauso-festival.blogspot.com/2017/01/buffalowi-u2-433dhpubuntu1404.html)
【Vue.js】スクロールでDOM操作する（消えるタイトル編）

スクロールをしたときに、DOM操作をしたいときのtipsです。

例えば、スクロールに応じて色を変えたり、高さを変えたり・・。
スクロールすると消えるタイトルを例にVue.jsでのDOM操作を理解します:hand_splayed:

## スクロールすると消えるタイトル

```index.vue
<template>
  <div class="sample">
    <!-- スクロールすると消えるタイトル -->
    <h2 :style="hiddenStyle" class="sample__title--hidden">タイトル</h2>
  </div>
</template>

```
テンプレートにはこんなかんじで `:style` を定義してます。
`hiddenStyle` は好きな変数を書いてあげればOK。

```index.vue
<script>
export default {
  data() {
    return {
      // タイトルの座標を保持
      targetRect: 0,
      hiddenStyle: {}
    };
  },
  mounted() {
    window.addEventListener('scroll', this.handleScroll);
  },
  destroyed() {
    window.removeEventListener('scroll', this.handleScroll);
  },
  methods: {
    handleScroll() {
      // タイトルを取得
      const title = document.querySelector(`.sample__title--hidden`);
      // タイトルの座標を取得
      const rect = title.getBoundingClientRect().top;

      // data()のtargetRectを更新
      this.targetRect = rect;
      // タイトルの座標がTOPから15px以上になったら隠す
      if (this.targetRect > 15) {
        this.$set(this.hiddenStyle, 'visibility', 'hidden');
      } else {
        this.$set(this.hiddenStyle, 'visibility', 'visible');
      }
    }
  }
};
</script>
```
コードには下記のことが書いてあります。

- dataにスクロールの座標を登録
- dataにhiddenStyleを定義
- mountedで、インスタンスがマウントされた後に実行する処理を書く
（スクロールされたときhandleScrollメソッドが呼ばれるイベント）
- destroyedで、インスタンスが破棄された後に実行する処理を書く
（イベントリスナを削除）
- methodsにスクロールされたときの処理を書く

ちなみに、`element.scrollTop` は相対座標、`element.getBoundingClientRect` は絶対座標を取得できます。

## 注意
今回のようにタイトルを消す際に `v-show` を使うことはできません。
なぜなら、 `v-show` は `display: none` だからです。

スクロールして条件がtrueになった場合、一度 `display: none` が適用されると、要素自体が消えて取得できなくなり、スクロールイベントが発火しません。

要素を消すのではなく、`visibility: hidden` で隠してください。
（わたしは最初v-showを使って困りました笑）

## 参考
[ライフサイクルのダイアグラム | Vue.js](https://jp.vuejs.org/v2/guide/instance.html#%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0)
[element.getBoundingClientRect | JavaScript](https://developer.mozilla.org/ja/docs/Web/API/Element/getBoundingClientRect)
リダイレクトによるページ遷移を追ってみる【初級編】

## はじめに
WEBアプリケーションの開発を行っていると、リダイレクトの挙動を追いたくなる場面がちょくちょくあります。リダイレクト動作自体の実装作業や、ページ遷移を伴う機能の開発(ログイン、ログアウトなんかもそうですね)をしていると作業中にリダイレクトの挙動を確認したくなったりもします。

今日は簡単な例を使ってリダイレクト時のページ遷移を追う基本的な流れを紹介してみたいとおもいます。

## 使用ブラウザ
- Google Chrome

## お題
Chrome のアドレスバーに `http://google.com` と入力してエンターキーを押してみましょう。

すると
![スクリーンショット 2019-01-31 14.56.17.png](https://qiita-image-store.s3.amazonaws.com/0/70638/f442da17-e0b1-42a4-a6ea-22561b442a1b.png)
おや？いつのまにか入力したURLとは違うページに移動していますね。

つまり `http://google.com` → `https://www.google.com` というリダイレクトが行われたことがわかります。この間、どのようなページ遷移が行われたのかを追いかけてみましょう。

**(世界の Google 先生を教材にしてしまった)**


## 手順
### 1. Chrome の新規タブを開き、F12キーで開発者ツールを起動したあと Network タブに切り替えておきます

**そもそもネットワークタブを使ったねぇよ(　ﾟдﾟ)** という方は下記のあたりをさらって見ておくといいと思います。(むしろこれだけで全て事足りるまである)

[Tools for Web Developers  |  Google Developers](https://developers.google.com/web/tools/chrome-devtools/network-performance/resource-loading?hl=ja#network)

### 2. `Preserve log` オプションにチェックを入れておきます

通常ではページ遷移するたびにログがリセットされてしまいます。しかし、`Preserve log` にチェックを入れておくと、ページ遷移後もログが引き続き残ります。ここではリセットしたくないのでチェックを入れておきましょう。

![2019-01-29_13h00_53.png](https://qiita-image-store.s3.amazonaws.com/0/70638/2b0974da-8dc7-708a-c672-6976e5f9dd4c.png)

### 3. 該当のページを開きます

お題と同じように `http://google.com` とアドレスバーに入力してください。

### 4. ログを確認します

![スクリーンショット_2019-01-31_15_07_54.png](https://qiita-image-store.s3.amazonaws.com/0/70638/cb5045ba-59e0-3ca3-7b84-11b8f666c38b.png)


ページ開いたらログがいっぱいでてきましたね。ここでは **Status の列が <font color="red">30x</font> になっている行に注目してください。**上から２行がそうですね。基本的に300番台のステータスコードはリダイレクトが行われたことを表しています。

まず1行目のリダイレクトの詳細をみてみます。

![スクリーンショット_2019-01-31_15_13_52.png](https://qiita-image-store.s3.amazonaws.com/0/70638/b0d13b8f-a87d-5860-9789-6d825c310daf.png)


Request URL はブラウザに自分で入力したものですね。そしてリダイレクト先については **Response Headers > Location** の値をみると確認できます。ここでは `http://www.google.com` へのリダイレクトが行われたことがわかります。www なしから www ありのドメインに変わってますね。

続いて2行目のリダイレクトの詳細をみてみます。

![スクリーンショット_2019-01-31_15_21_51.png](https://qiita-image-store.s3.amazonaws.com/0/70638/b0862bee-13a0-4876-a464-7e52ac41a351.png)

1行目のときと同じ要領で確認してみると、`https://www.google.com` へのリダイレクトが行われたことがわかります。http が https になってますね。

以上からページ遷移は実は以下のように2回行われていたということがはっきりします。

`http://google.com`
↓(301)
`http://www.google.com`
↓(307)
`https://www.google.com`

ログ機能を使わずにブラウザで目視しているだけではリダイレクトが1回行われたようにしか見えないので、こういう細かい動きがわかるのはログならではです。

## 参考
- [Tools for Web Developers  |  Google Developers](https://developers.google.com/web/tools/chrome-devtools/network-performance/resource-loading?hl=ja#network)
- [HTTP のリダイレクト | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Redirections)

30x系ステータスコードの詳細については2つめのリンクに説明があります。お堅いかんじですが使用例もあって意外にわかりやすいです。さらっと目だけでも通しておくといいとおもいます。(今日は各ステータスコードの詳細については省略します。)

## おわりに
今回は単純なサンプルですが、この基本を覚えておくと、今後リダイレクトループのようなトラブル調査にも役に立ちますので覚えておいて損はないとおもいます。上級編もそのうち執筆できるように **まず筆者がもっと勉強します。(すみません)**

ちなみに今回はそんなに変なことは書いていないはずですが何か気になる点等がありましたら遠慮なくコメントください。(もちろん単なる感想でも大歓迎です:relaxed:)

それでは。
atcoder ABC97

c問題、D問題共に自力で解けた。やはりサンプルからちゃんと思考して法則を見つける力と、問題文をしっかり読む力、データ構造などの知識の両方がないと300、400問題を完答するのは難しいと実感した。
https://atcoder.jp/contests/abc097/tasks
#C問題
#方針
まず浮かぶのが全探索だが、Nが5000まであるので明らかに計算量が5000!になってしまし間に合わない。ここで、K<=5に気づくと、全探索する際に、左端をl右端をrとすると、rは最高でもl+5であることがわかる。なぜならsubstringとは連続していなければならないので、lを固定している時、最高でもrはl+5だからである。よってlを固定してrを動かしながらsubstringをTreesetなどに入れていくと、k番目のsubtringが答えになる。

#D問題
#方針
swapについて考えると、p[i]のiとp[i]がswap可能であればカウントできる。swap可能かどうかは、p[i]とiが最終的に辺で繋がって入れば良い。つまり、unionfind木を作成し各x,yについて辺を繋いでいき、各p[i]について、iがp[i]と辺を通して繋がっているかをカウントしていく。
ffmpegでwaveファイルをmp3に変換する

[\[ffmpeg\] 音声形式の変換方法まとめ \- Qiita](https://qiita.com/suzutsuki0220/items/43c87488b4684d3d15f6)
[jrottenberg/ffmpeg \- Docker Hub](https://hub.docker.com/r/jrottenberg/ffmpeg)


```
$ docker run -v $PWD:/temp/ \
  jrottenberg/ffmpeg:latest -stats \
  -i /temp/input.wav \
  -vn -ac 2 -ar 44100 -ab 256k -acodec libmp3lame \
  -f mp3 /temp/output.mp3
```

なんか容量が大きくなったorz
pandoc使い方まとめ

# 概要
pandocの使い方をまとめる。

- website https://pandoc.org/
- source https://github.com/jgm/pandoc

# Install pandoc
## Ubuntu
ちょっと古いけど標準のapt-repositoryでインストール可能。

```shell
sudo apt install pandoc
```

## Windows
1. オフィシャルサイトからzipファイルをダウンロード
2. 環境変数のPATHにpandocディレクトリを追加

# Install LaTeX
pandocでpdf出力するにはLaTeXが必要だが、めんどすぎて諦めるべき。

# Usage
基本的にはコマンドラインベース。昨今流行りの`config.json`はないらしい。

## HTML
### Generate Template
以下のコマンドでHTML5のテンプレートを作成する。

```shell
pandoc -D html5 > html5_template.html
``` 
by https://qiita.com/TEVASAKI/items/c97815f5fb6542bbeb2c


## PDF
PDFはLaTeXがないと生成できない。しかも日本語だとLuaLaTeXとかいろんな縛りがある。残念！

## Word
wordは比較的簡単に作れるが

### Generate Template
以下のコマンドでWordのテンプレートを作成する。

```shell
pandoc --print-default-data-file reference.docx > reference.docx
```
by http://www.minimalab.com/blog/2016/08/16/convert-md-to-docx/

### Customize Template
Wordのテンプレートをカスタマイズする。公式サイトによると、

>
For best results, do not make changes to this file other than modifying the styles used by pandoc: [paragraph] Normal, Body Text, First Paragraph, Compact, Title, Subtitle, Author, Date, Abstract, Bibliography, Heading 1, Heading 2, Heading 3, Heading 4, Heading 5, Heading 6, Heading 7, Heading 8, Heading 9, Block Text, Footnote Text, Definition Term, Definition, Caption, Table Caption, Image Caption, Figure, Captioned Figure, TOC Heading; [character] Default Paragraph Font, Body Text Char, Verbatim Char, Footnote Reference, Hyperlink; [table] Table.

by https://pandoc.org/MANUAL.html

とのこと。いじり過ぎたらダメダメ。変えていいのは以下。

- [段落]
    - 標準
    - 本文
    - 最初の段落
    - コンパクト
    - タイトル、サブタイトル
    - 著者
    - 日付
    - アブストラクト
    - 参考文献
    - 見出し1、見出し2 、見出し3、見出し4、見出し5、見出し6、見出し7、見出し8、見出し9
    - ブロックテキスト
    - 脚注テキスト
    - 定義用語
    - 定義
    - キャプション、表キャプション、図表キャプション、図、キャプション図
    - 目次見出し
- [文字]
    - デフォルト段落フォント
    - 本文文字
    - 逐語文字
    - 脚注参照
    - ハイパーリンク
- [表]
    - 表

### Generate docx

```shell
pandoc new.md --reference-doc=reference.docx -s -o --toc --highlight-style=tango temp.docx
```
by http://www.minimalab.com/blog/2016/08/16/convert-md-to-docx/
野球ニュースのタイトルを取得してみる

明日2/1にプロ野球も開幕し、プロ野球ニュースも盛んになるので、ニュースのタイトルを取得する事を試みる。

## mac localにpipをインストール

まずは、ローカルMacに`pip`をインストール
https://pip.pypa.io/en/stable/installing/
cf. https://qiita.com/tom-u/items/134e2b8d4e11feea8e12

```
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
```


```
$ python get-pip.py --user
```

```
$ export PATH="$HOME/Library/Python/2.7/bin:$PATH"
```

update

```
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs pip install -U --user
```

## BeautifulSoup をインストールする

```
sudo pip install beautifulsoup4
```

```getBaseballNewsTitle.py
# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup

# スポナビURL
url = "https://sports.yahoo.co.jp/news/list?id=npb"

# URLにアクセスして html取得
html = urllib2.urlopen(url)

# htmlをBeautifulSoupで
soup = BeautifulSoup(html, "html.parser")

# p要素を取得
titles = soup.find_all("p",class_="articleTitle")

# 表示
for title in titles:
    print title.string
```

実行

```
$ python getBaseballNewsTitle.py
仮契約、博物館見学でも弟思い／巨人高橋こんな人
キャンプ初日が誕生日　巨人高橋が手紙で家族に感謝
新井兄弟がキャンプ前日に奇跡の遭遇　良太C「お兄ちゃんと、偶然空港で」
巨人・原監督　全体ミーティングで宣言「実力至上主義、勝利至上主義。目標は日本一」
つば九郎　昨年ヤクルトファンになったという女性タレントに「ばいめいこうい」
広島がジョンソンと早くも2020年の契約結ぶ　各球団発表、31日の契約まとめ
阪神矢野監督「切磋琢磨はいらん」バチバチ争い扇動
緒方監督「うちは早い」長野に早期実戦出場指令
オリックス新主将に２年目福田、異例スピード抜てき
【MLB】大谷翔平は外野手でも「毎年オールスターに出場できる」　同僚が改めて絶賛
広島小園ドキドキの宮崎入り「無駄にはできない」
護摩行の痕残る広島会沢Ｖ４へ気合「元気出して」
阪神・矢野監督　大腸がん手術終了の原口を「信じて待つ。メンタルの成長は半端ない」
阪神・平田二軍監督が若虎にゲキ「ジャニーズの嵐みたいな選手出てこい！」
オリックス・アルバース「健康第一」腰痛回復は順調
中日高橋が新キャプテンの自覚「明るく元気よく」
自由契約の成瀬がオリ入団テスト　準備してきたのでアピールしたい
オリックス合流の成瀬「最大見せる」５日入団テスト
日本ハム王柏融が貫録初フリー　１キロバットで快音
楽天平石監督「ポジション奪え」二塁浅村以外は競争
```

cf. https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406
EC2でネットワークアダプタを無効にしてしまい、RDP接続できなくなってしまった時の対処法

とあるプロジェクトでメンバーがやってしまい、支援を求められたので備忘録もかねて手順を整理しておきます。
大丈夫です。復旧できます。

# 復旧手順
* ENIを作成する
* 問題のインスタンスにENIをアタッチする
* アタッチしたENIのIPアドレスでリモートデスクトップ接続する
* 無効にしてしまったネットワークを有効化する
* 作成したENIを削除する

EC2作り直しなど一切ないので、完全に今までの状態に復旧できますのでご安心ください。
ちなみに、AMIを取って新規起動したら有効化されて起動してくるかなーとか考えましたが、ダメでした。


現場からは以上です
Laravelのselectで固定値を取得する。

# 今回のお題
UNION、UNION ALLをする際など、SQLで固定値を取得するシーンは間々あります。
それをLaravelのクエリビルダーを使って行う際に軽くハマったので備忘録として残しておきます。

## 実行したいSQL
SQLで例をあげてみました。

```sql:select.sql
SELECT 
  id,
  name,
  'hello!' as greet
FROM
  users;
```

usersテーブルの中に唐突として現れるhello!のご挨拶。。
我ながらセンスのなさを痛感しているのですが、これをLaravelで実装しましょう。

## クエリビルダーにて実現

```php:app/Models/User.php
return self::query()
  ->select( 
    id,
    name,
    DB::raw("'hello' as greet")
  );
```

これで取得することができました。
`use Illuminate\Support\Facades\DB;` を加えることをお忘れなく。

今回も小ネタでしたが、参考になる方が1人でもいれば幸いです。
CentOS 5 - Ruby-1.8.7 - ImageMagick6 のDockerImageを作ってDockerHubに登録した

# 環境
- Github
- Dockerhub

# DockerImageの要件
- CentOS 5
- Ruby 1.8.7
- ImageMagick 6.9.8
- MySQL 5.5.54

# 作業

## 1. Githubにレポジトリを作る
https://github.com/junqiq/docker-c5r187

### 1.1 README.mdをpush
### 1.2 Dockerfileをpush
CentOS5のベースイメージはこちらを利用させて貰いました
https://hub.docker.com/r/astj/centos5-vault/

## 2. DockerHubにアカウントを作る
https://hub.docker.com/u/junqiq

### 2.1 Githubアカウントと紐付ける
[Account Setting](https://cloud.docker.com/u/junqiq/settings) 
-> Linked Accounts
-> Github - Connect Provider

### 2.2 GithubRepositoryからRepositoryを作る
-> [Create Repository](https://cloud.docker.com/repository/create)
1. Name [c5r187]
2. ConnectedになっているGithubアイコンをクリックしてGithubのレポジトリ(docker-c5r187)を選択
<img width="654" alt="Docker_Hub.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/155950/287caabf-1857-5b7f-768a-d0d7653a43f7.jpeg">
3. Create & Buildボタンを押下
4. Buildが開始される
<img width="207" alt="Docker_Hub.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/155950/84494eeb-5683-3ce9-5a98-9f8a7c4f941f.jpeg">

### 2.3 レポジトリができる
https://cloud.docker.com/repository/registry-1.docker.io/junqiq/c5r187

pullしてみる
<script id="asciicast-AgFY10cDmVnx6PclldBkvBQ8s" src="https://asciinema.org/a/AgFY10cDmVnx6PclldBkvBQ8s.js" async></script>

## 3. メンテナンス
Githubのレポジトリのmasterを更新すればDockerHubが自動的にmasterのソースでBuildしなおしてくれる！
[Rust] ラズパイ2でベアメタルメモリアロケーション


# はじめに

[前回](https://qiita.com/maueki/items/93051908858bd4e1cf1f)少しだけ触れたメモリアロケーションについて。

Rustは1.28からGlobal Allocatorという仕組みが使えるようになったので紹介したい。

「ラズパイ2で〜」と銘打ってはいるが、前回とは異なりCPUに依存する部分はあまり無い(アドレス幅を32bit決め打ちにしたりはしている)。

# Global Allocatorとliballoc

https://doc.rust-lang.org/std/alloc/trait.GlobalAlloc.html

ここに書いてあるとおりなのだが`core::alloc::GlobalAlloc`トレイトを実装して(ここでは`mem::KernelAllocator`というstructを実装した)

```rust:main.rs
#[global_allocator]
static GLOBAL: mem::KernelAllocator = mem::KernelAllocator;
```

変数名に特に縛りはなく`#[global_allocator]`を指定してやることでGlobal Allocatorとして使用されるようになる。

あとは

```rust:main.rs
#[macro_use]
extern crate alloc;

use alloc::prelude::*;
```

このように宣言してやることでliballocが使用できる、つまりたったこれだけで**`#[no_std]`環境で`Box`や`Vec`や`format!`が使えるようになるのだ！**

「nightlyじゃなきゃベアメタル厳しいのどうなの？」と言われてしまうRustではあるが、liballocが手軽に使えるようになるGlobal Allocatorという仕組み一点だけとってもベアメタル環境でRustを選択するアドバンテージは計り知れないものがあると個人的には思っている。

ちなみにRust2018からは一般的に`extern crate`が不要になると理解されているが一部例外があり、上記`extern crate alloc;`はRust2018でも依然として必要となる。詳しくは以下参照。

https://rust-lang-nursery.github.io/edition-guide/rust-2018/module-system/path-clarity.html#an-exception

# 実装例

https://github.com/osdev-rs/minimal-kernel-rpi2/tree/qiita-mem

```:linker.ld
    .kernelheap : {
        __kernel_heap_start__ = .;
        . += 0x100000;
    }

    . = ALIGN(4096);
    __kernel_heap_end__ = .;
```

リンカースクリプト内で固定領域を指定して`__kernel_heap_start__`と`__kernel_heap_end__`を定義。

```rust:mem.rs
extern {
    static __kernel_heap_start__: u32;
    static __kernel_heap_end__: u32;
}

#[inline]
unsafe fn kernel_heap_start() -> u32 {
    &__kernel_heap_start__ as *const _ as u32
}

#[inline]
unsafe fn kernel_heap_end() -> u32 {
    &__kernel_heap_end__ as *const _ as u32
}
```

Rust内でリンカースクリプトで定義したシンボルのアドレスを使えるようにする。

```rust:mem.rs
#[derive(Clone,Copy)]
struct FreeInfo {
    addr: u32,
    size: usize
}

const MAX_FREES:usize = 4090;

static mut FREES: usize = 0;
static mut FREE: [FreeInfo; MAX_FREES] = [FreeInfo{addr:0,size:0}; MAX_FREES];

pub unsafe fn init() {
    FREES = 1;
    FREE[0] = FreeInfo{
        addr: kernel_heap_start() ,
        size: (kernel_heap_end() - kernel_heap_start()) as usize
    };
}
```

メモリ管理の方法は[『30日でできる！OS自作入門』](https://book.mynavi.jp/supportsite/detail/4839919844.html)にある空きメモリだけを管理するアルゴリズムを借用した。
最初は全メモリを持つ１つの`FreeInfo`だけがあり(`init()`参照)、そこから必要に応じてメモリを取り出していき、開放されたメモリは前後の領域とマージできない場合は`FREE[]`に追加されていく(`KernelAllocator::dealloc()`参照)。

```rust:mem.rs
unsafe impl GlobalAlloc for KernelAllocator {
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
        // ...
    }

    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
        // ...
    }
}

#[alloc_error_handler]
fn foo(_: Layout) -> ! {
    uart::write("alloc_error");
    loop {}
}
```

実装の詳細は省略。

あとは上で記載したように`KernelAllocator`のstaticインスタンスを生成し`#[global_allocator]`を指定すればliballocが使用可能となる。

# 今後の課題とか

UserモードでMMUを使用したときのメモリアロケーションをどのように実装するべきか見当がついていない。Global Allocator内でプロセッサモードを見てUserモードであればSVCを実行するような作りになるのだろうか。
【Rails】一括updateでコールバックを呼べるのか検証してみた

##はじめに
**複数のモデルを一括でupdate、かつ、コールバックを呼ぶ方法**がないのかなと思い、いろいろ探してみました。

で、結論から言うと、コールバックを走らせずに一括updateするのは無理っぽいです><

クラスメソッドとして使えるのは以下の二つですが、まず前提としてどれもコールバックが走りませんでした。
・`update_all`
・`update_columns`

参考:
https://qiita.com/tyamagu2/items/8abd93bb7ab0424cf084

##updateを使えばできる？
`update`を使えばいけるっぽいという情報を聞いたので実践してみました。
今回はidが1と2のユーザーの`age`を20に一括updateするのが目的。
これを`update_all`と同じ要領でできるかと思ったら？

```rb

@users.updaete([1,2], age: 20)
```

```
ArgumentError: When assigning attributes, you must pass a hash as an argument
```

え。。
どうやらもしidと属性の数が合わなかったらrollbackされるようです。

正しくはこうです

```rb

@users.update([1,2], [{ age: 20 }, { age: 20 }])
```

これは非常に面倒臭い。。
しかもidの数だけ属性を書かないといけません。
なぜこのような仕様にしたのでしょうか。。
参考: http://o.inchiki.jp/obbr/198

##ならばバルクアップデートはどうだろう
と思い、こんな感じに早速やってみた。

```ruby

users = []
@users.each do |user|
  user.age = 20
  users << user
end

User.import users, on_duplicate_key_update: [:age]
```

が、updateはされてもコールバックは呼ばれず。。


##結論
一個づつupdateしよう;;

```ruby

@users.each { |user| user.update(age: 20) }
```

はい、結局これに落ち着きました。。

もし他にやり方があるよ！っていう神様がいましたら教えていただけると飛んで喜びます(m_ _m)
未経験から転職して2か月のエンジニアがバッチ処理をシェルスクリプトで作って得た教訓

# はじめに
未経験からエンジニアに転職し、まだ2か月ほどしか経っていないですが
バッチ処理をシェルスクリプトで作ったので取り組む前の自分へ向けてのアドバイスのように教訓を記事に書きます。
少しでも初心者の方の役に立てばと思います。
# 初心者にありがちな過ちとそこから得た教訓
私が犯した初心者あるあるな過ちをあげていきます。
すべて教わったことですが、自分自身の反省の意味も込めて…
## ①コードを書く
### インデント
・ない時

```bash
for j in {0..9};
do
for i in ${dir_list[@]} do
sh process.sh ${i} ${j}
done
done
```
・ある時

```bash
for j in {0..9};
do
    for i in ${dir_list[@]}
    do
        sh process.sh ${i} ${j}
    done
done
```
forやwhileなどが複数重なってくるとややこしくなってきます。
コードを見る人のことを考えたら、インデントを入れて綺麗に書くにこしたことはないです。

### コメントアウト
以下のように、コードの中にコメントアウトを、#を使って何かの処理の度に入れていくと、
自分があとで見返すときも人に見てもらうときも、見やすくて便利&親切です。

```bash
#S3からオブジェクトダウンロード
#直前処理でエラー起きたら終了
S3OBJ=(S3内のオブジェクト)
LOCALDIR=(ローカルディレクトリ)
s3cmd --no-progress -f get ${S3OBJ} ${LOCALDIR}
if [ $? -ne 0 ]; then exit 1; fi
```
###rmコマンドは安易に使わない
大事なものを消してしまう可能性があるから。
特に引数やワイルドカードを伴ったものは注意。引数を読み込まずに*が残って…

```bash
rm *
```
自分が作ったものだけなら良いですが、人が作ったものがあるサーバーでは細心の注意を。
## ②コマンド実行する
### オプション -x
スクリプト実行時にオプション-xを使うと、スクリプト実行したときに途中どういう処理をしているかがわかります。

```bash:test.sh
#!/bin/bash

R_NUMBER=$(($RANDOM % 10))
mod=$((${R_NUMBER} % 2))

if [ ${mod} = 0 ]; then
  echo "偶数です"
else
  echo "奇数です"
fi
```

実行結果

```bash
sh -x test.sh
+ R_NUMBER=8
+ mod=0
+ '[' 0 = 0 ']'
+ echo 偶数です
偶数です
```
このように、シェルの中身の処理が具体的に示されるので
エラーが起きても、どこでエラーが起きたかが一目瞭然になります。
初心者にとってはありがたいオプションなので使っていきたいです。
###lessコマンドとviコマンド
シェルをviコマンドでテキスト編集する癖がついて、シェルの中身をみるときにviコマンドで見ていました。（lessコマンドを知らなかっただけですが）
既存の出来上がったシェルを参考にしたいと思ったときにviコマンド叩いて中身書き換えちゃった…
なんてことのないように、初心者はlessコマンドを覚えたいところです。

### Tabキーを押す
未だにこの癖が身についていないですが
コマンドを打つとき、ファイル・ディレクトリやパスを打っている途中でTabキーを押すとカレントディレクトリ内で一致するファイルやディレクトリが自然と入力されます。
複数一致するものがあるときはさらにTabキーを押すと、候補が出てきます。
コマンド打つときに便利なのでもっと多用したいです。
##③その他いろいろ
### シェルの名前どうしよう
そのシェルの役割を英語にして名づければいいわけですが、用語がわかっていないと意外と難しかったです。
（恥ずかしながら私はラッパーの意味を理解するのに結構時間がかかりました…）

### 計画してから書く
計画を意識して書けば、もっと効率的に書けると思いました。
シェルごとの役割・全体の流れを計画してから書く。
# おわりに
今回はBashを使いましたが、きっとどんな言語で何を書くにも共通して活かせる教訓もあるかと思いました。まだまだエンジニアとしては駆け出しですが、簡単な記事から投稿しつつ自分のインプットにつなげられればと思います。指摘する点ありましたら、コメントでお願いします。
Unity操作一覧

#Sceneビューの操作
##回転
ALT+ドラッグ
##拡大縮小
(Windows)ALT+右クリック+ドラッグ
(Mac)ALT+control+ドラッグ
##移動
(Windows)ALT+Ctrl+ドラッグ
(Mac)ALT+Command+ドラッグ
seaborn.lineplotで破線プロット

最近pythonで結果のプロットにはseabornを使ってます。
手軽にきれいなグラフを書けて重宝するのですが、pandasと密結合なので、seaborn wayに従わないと割と簡単なことができなかったりします。
ということで、サクッと破線プロットするのができなかったのでメモ。


# とりあえずこうすればいいというコード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28934/4bb7d4ba-4ff0-3c3e-59df-29fe764d3553.png)

```python
seaborn.lineplot(
    data=data, x="x", y="y",
    style="label",  # labelによってstyleを変えるよ、とする。これがないとdashesが効かない
    hue="label",  # labelによって色を変えるよ
    dashes=[(2, 2)] * len(data["label"].value_counts())  # labelの種類数分だけ破線スタイル(2,2)を用意
)
```
`[{x: 0, y:1, label: "cos"} ... {x: pi, y:-1, label: "cos"}]` みたいなデータを仮定してます。


実行コード全体は[gist](https://gist.github.com/Hi-king/52f210dc181b858eca984dadd2d97209)にうｐしました

# ポイント

### hueとstyleは両方設定してもいい

ちなみにdashesを設定しないでhueとstyleに両方labelを設定すると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28934/41094dd3-d9de-7e94-cf6a-3e7ddd7f9c91.png)

このように、色もスタイルも違う結果になります

### dashesを機能させるためにはstyleを設定しなければいけない

"label毎にstyleを変えるが、そのstyleは両方一緒だよ"ってコードにしなきゃいけないってことですね。面倒。dashes=(2,2)とかしたらすべての線を破線にしてくれればいいのに。

# 参考URL

* https://stackoverflow.com/questions/51963725/how-to-plot-a-dashed-line-on-seaborn-lineplot
    * ラベルのついてない単なる二次元データのときの解決例はこの回答のとおりだったのですが、今回はラベル付きのDataFrameでやりたかったので苦労した
Yetişkin Sohbet

![sohbet chat kurallar.png](https://qiita-image-store.s3.amazonaws.com/0/342381/4f4bdd44-000c-01c2-e44b-db0d94608da2.png)
 [Yetişkin sohbet odaları](http://www.sohbetodalari.chat), internet üzerinden ücretsiz ve üyelik gerektirmeyen, mobil cihazlarla uyumlu ve rahatça kullanılabilen menü ve uygulamaları ile sohbet etmenizi yeni kişilerle tanışmanızı ve eğlenceli zaman geçirmenizi sağlayan [yetişkin chat](http://sohbet.services) platformudur.
 
 Dünya ülkeleri ve Türkiye üzerinden kullanıcıların oluşturduğu topluluk, kategorilere ayrılan odalar içerisinde karşılıklı gruplar arasında veya bireysel iletişim seçenekleri ile seçtikleri kullanıcılar ile yazılı, sesli yada görsel iletişim uygulamalarını kullanarak tanışabilir, arkadaş bulabilir.
[FirstVR] oculus Goのもうひとつの入力デバイスとしてFirstVRを選択する

## 概要

前回の記事「[[FirstVR] oculus Goで、コントローラと組み合わせて遊んでみる](https://qiita.com/edo_m18/items/b362ca077340b2b1bb0c)」の、ある意味続編です。

内容としてはそれをベースに少し考察をする、という感じのものになります。

前回の記事を書いて、実際にoculus GoでFirstVRを使って遊んでみたのですが、まだまだ他に使いみちがありそうだなと感じたのでそれを書こうと思います。


## FirstVRをサポートデバイスとして利用する

もうひとつの入力デバイス（サポートデバイス）として利用するとはどういうことか。
前回の実装を行ってみて感じたのは、だいぶ思ったとおりに操作できるということ。
そして複数ジェスチャが登録できる点を踏まえて、例えばoculus Goのコントローラでは難しいUIの選択操作を、ジェスチャにまるっと委譲してしまうことで操作がシンプルになるのでは、ということです。

### 複数ジェスチャをショートカット的に使う

考えているものは、複数登録したジェスチャをショートカットとして利用する形です。
PCであれば⌘ + wとか、Ctrl + Cとか、色々なショートカットを利用して操作するのが普通だと思います。

ちょっと脱線しますが、自分は[AutoHotKey](https://www.autohotkey.com/)を愛用していて、開発でよく使うツール（Visual StudioとかUnityとか）をホットキー登録してショートカット一発で呼び出せるようにしています。

AutoHotKeyを使うとホットキーをプログラムできるため、自分が思った通りにショートカットを作成することができます。
つまり、既存のショートカットを覚えるのではなく、「自分はこれが手に馴染む」という理由でショートカットを登録することができるわけです。

なにが言いたいかというと、oculus Go含めVRというのは得てして「なにかを選択する」というのが思いの外、思い通りにならないものです。
そこでFirstVRの出番、というわけです。

カスタムジェスチャであれば、そもそも自分がこれでやる、とジェスチャを決めて登録し、それをショートカットとして使用することができます。

自分は普段ゲーム制作しているのでゲームをベースに考えますが、例えば、「力を溜める」という動作は自分は「グー」のイメージですが、もしかしたら「パー」のイメージがある人もいるかもしれません。
（実際、ドラゴンボールの悟空は手をパーにして気を溜めるしｗ）

つまり、開発者が決めた通りのものではなく、ユーザ自身が直感的、と思う方法で操作してもらうことができるわけです。

### 「直感的」を本当の意味で直感的にする

ゲームを作っていてとても感じるのが、「直感的」って「その人に取って直感的」という意味であって、全人類共通の言語ではない、ということです。
またその背景は、生きてきた環境に依存し、その状況で培われた（醸成された）感覚なわけです。
つまり「**偏見**」だと思うんです。

ただもちろん、PS4の世界で生きてきた人に取ってはその世界のルールに沿うことは直感的になるのはある程度共通になるかなとは思います。
でも、最近プレイした「レッドデッドリデンプション2」では、○ボタンがキャンセルでxボタンが決定というルールでした。
（外国ではそういうケース多いみたいですが）

これ、完全に直感に反してますよね。

そしてVRだとそれが顕著に起こる。
そりゃ主観視点でプレイするわけですから当然です。
そこで問題になるのがこの「直感的問題」。

開発者が「これが直感的だろう」と考えて実装したものは、万人に共通ではないわけです。
ならばいっそ、それを本人自身が「直感的だ」と思う方法に任せてしまう。
それを可能にしてくれるのが、この「ジェスチャ登録」だと思うわけです。

### 実際にデモを作ってみた


ということで、この考えをベースに作ってみたのが以下の動画。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">FirstVRのカスタムジェスチャを使って武器チェンジ <a href="https://twitter.com/hashtag/FirstVR?src=hash&amp;ref_src=twsrc%5Etfw">#FirstVR</a> <a href="https://t.co/aLMRSbH7GW">pic.twitter.com/aLMRSbH7GW</a></p>&mdash; edom18@VR (@edo_m18) <a href="https://twitter.com/edo_m18/status/1091022347409244160?ref_src=twsrc%5Etfw">January 31, 2019</a></blockquote>

これまた銃で撃つシューティングですが、動画を見てもらうと撃ち出す弾を、エネルギー弾 or ロケット弾と撃ち分けているのが分かるかと思います。
これもちょっと分かりづらいですが、カスタムジェスチャを利用して「グーの場合はエネルギー弾」「パーの場合はロケット弾」として設定しています。
（もちろん、グー・パーに限らず、FirstVRが許すジェスチャであれば自由に設定できます）

この動画では設定する部分が映っていませんが、若干左上に映っているUIを利用してグー・パーを登録したあとの動画になってます。

そしてこれを利用することで、あくまで最初に登録したジェスチャに則って、プレイヤーが「この弾を撃ちたい」と思ったらそのジェスチャをして銃を構えて撃つだけ。
なのでボタンはトリガーのみの操作になっています。

そして、エネルギー弾かロケット弾かを選択しているのはもう片方の手に取り付けられたFirstVRからの入力で行っています。
試していませんが、コントローラを持った方の手にFirstVRを取り付けて、さらにその手の握り方でカスタムジェスチャとして認識してくれるなら、さらに面白いUIが作れるかもしれませんね。

今回は2パターンだけでしたが、いくつか登録ができるので必要な数を割り当てるといいかもしれません。
（が、そこは人間の手の形の限界とFirstVRの認識できる範囲の限界があるのでなんでもかんでも、というわけには行きませんが、武器を2～3種類変更するくらいなら簡単です）

コントローラの操作って、ゲーマーでない限り実はそこまですぐに操作できるものではないと思うんですよね。
なので、こうした「ジェスチャ」というのは今後主流になっていくのかなーなんて感じています。

Hololensもジェスチャで操作しますし。

今年、2019年はAR元年（デバイス的な意味で）だと思っているので、このあたりは注目していきたいところですね。
Ubuntu18.04の起動時に"PCIE Bus error severity=Corrected type=physical layer"と表示されるときの対処法

Ubuntu18.04のソフトウェアアップデート後、画面が黒画面になり、
PCIE Bus error severity=Corrected type=physical layer
deviceほげほげ
reciverなんとか
みたいな内容がハンパなく出力されまくったときの対処法。

1. おとなしく電源OFF
2. 起動後にも出続ける場合は、UEFI画面で"E"キーを押す
3. linux ...と書いてある行の末尾に```pci=nomsi```を追記
4. Ctrl+Xで起動

これで起動しない場合は、```pci=noaer```とすればよい。

##参考
https://askubuntu.com/questions/771899/pcie-bus-error-severity-corrected
Visual Studio 2017でNpgSqlとEntityFrameworkを使ってみた

## インストール
NuGetを使って、npgsqlとEntityFramework6.Npgsqlをインストール
検索して、見つかったのを選んでインストールで問題なく完了

npgsql.orgのGetting Started(https://www.npgsql.org/doc/index.html)を見て、App.configに追記を行う。

## DBテーブルに対応するエンティティクラスを作成
DBテーブルの内容に対応したエンティティクラスを作成。
[Table("テーブル名")]、[Key]、[Column("フィールド名")]、[Required]等を使います。
Requiredが not null に対応。
https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/data-annotations
を参照。

## コンテキストクラスの作成
https://creatorhyp.com/tips/program/entity-framework-install/
を参考にしてContextクラスを作成。
System.Data.Entity の DbContextを用いて拡張。上の例と変えたのはContextクラスのコンストラクタの引数を(接続文字列, スキーマ文字列="public")として作成しました。

## 起こった問題
### スキーマ文字列
　上で、スキーマ文字列をpublicとしています。これは、pgAdminでCreate Table SQLを作ってみたところ　public.tableName となっていたことと、別の文字列(Schema)で動かしてみたところ、　Schema.tableName　がないというエラーが出たためにこうしています。

　検索用のSQLを作成する際にテーブル名が
　　 スキーマ文字列.[Table()]で指定したテーブル名　
　となるため、設定しています。DB側で別の名前が使われている場合あh調整が必要です。

### 接続できない？
　当初、EntityFrameworkではなく、お試しでODBC接続を用いたNpgsqlConnectionで開こうとしたところ、なぜか接続できない。
　調べてみたところ、
1. インストールしてあったpostgreSQLのODBCドライバーが64bit用
2. プログラムのビルド設定が　任意のCPU　だったものの「32bitを優先」にチェックが付いていた
　ビットのConflictが発生していると想定して任意のCPUをx64に切り替えたところ、問題なく接続できるようになりました。
サクラエディタの置換で文字列挿入できること知ったのでメモ

#サクラエディタの置換で文字列挿入できることを知ったのでメモ

例えば「AbcdeEfghi」という文字があるとして、「Abcde Efghi」みたいに
一文字挿入したい場合に、サクラエディタの置換で出来て嬉しかったのでメモ

---
↓青枠で囲った部分の選択始点(1)挿入、選択終点(2)追加を選んだら出来た
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/328430/9a973cff-544d-8c20-ba25-18732ddbc9a1.png)

以下は、サクラエディタ>ヘルプ>コマンド概要>「検索(S)」メニュー>置換 より引用
> 
　○選択始点挿入
  　 置換前の文字列の前に、置換後の文字列を挿入します。
　○選択終点追加
  　  置換前の文字列の後に、置換後の文字列を追加します。

**つまり、正規表現などで引っ掛けた部分の前後に置換後の文字を追加できる**
便利だと思う

#実際に使ってみた
以下はApacheのディレクティブ一覧の一部
> 
ExpiresActive
ExpiresByType
ExpiresDefault

キャメルケースをスペース区切りにするのに置換を使います
↓置換後(大文字の前にスペース入れて、先頭のスペース消しただけ)
Expires Active
Expires By Type
Expires Default

これで何が嬉しいのかっていうとグーグル翻訳にかけれること
英語できません。。。

**以上**
結局のところ、gtag / グローバルサイトタグとはなんなのか 　

# gtag, グローバルサイトタグってなんだ
Googleアナリティクス、Google広告の最新コードであるグローバルサイトタグ、gtag。
結局なんなんでしょうか。

##前提: Googleアナリティクス、Google広告どちらにも使える。

Googleアナリティクスのグローバルサイトタグ
 
```HTML
<html>
<!-- Global Site Tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXX-X"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-XXXXXXXX-X'); // ID
</script>
```

Google広告のグローバルサイトタグ

```HTML
<!-- Global site tag (gtag.js) - Google Ads -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-YYYYYYY"></script>

<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());

gtag('config', 'AW-YYYYYYY');
</script>
```

がっちゃんこ

```HTML
<!-- Global site tag (gtag.js) - Google Ads -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-YYYYYYY"></script>

<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());

gtag('config', 'UA-XXXXXXX-X'); // Googleアナリティクス
gtag('config', 'AW-YYYYYYY'); // Google広告
</script>
```

## 役割1. Google広告用にファーストパーティークッキーを作る
Safariブラウザ(ITP)でも、コンバージョンを計測するために全ページに必要。
(Google広告のコンバージョンを計測するためには、_gcl_aw, _gacというCookiesが生きていなければいけない。)

## 役割2. Google広告のリマーケティングタグでもある。
こういう古いリマーケティングタグでは、Safariでうまく動きません。

```HTML
<script type="text/javascript">
/* <![CDATA[ */
var google_conversion_id = 123456733;
var google_conversion_label = "vOzVCLSr3nUQmqytvgM";
var google_custom_params = window.google_tag_params;
var google_remarketing_only = true;
/* ]]> */
</script>
```
より詳しく:AdWords のコンバージョン トラッキングとリマーケティングのための gtag.js
https://developers.google.com/adwords-remarketing-tag/

## 役割?3. Googleアナリティクスとしては、旧バージョンのgaタグ(analytics.js)と機能に大差なし。
というか、なかで呼んでいるのはanalytics.jsのAPIです(多分)。
ということは、実質中身は一緒でしょうか。

しかし、クロスドメインの設定が共通して簡単にできるのは素敵です。
※ランディングページからコンバージョンページまでの導線で、ドメインが２つ以上にまたがる場合、以下の設定は必須です。

参考: ドメインをまたぐカスタマー ジャーニーを測定する
https://developers.google.com/gtagjs/devguide/linker

```HTML
<script>
// クロスドメインの設定 Cookiesをつなげるためにも必須。
// この1行でアナリティクス・広告、どちらもクロスドメインの設定OK
gtag('set', 'linker', {['domainA', 'domainB']}); 
gtag('js', new Date());

gtag('config', 'UA-XXXXXXX-X'); // Googleアナリティクス
gtag('config', 'AW-YYYYYYY'); // Google広告
</script>
```

#まとめ
gtagは、Google広告におけるリマーケティングタグです。
そして何より、SafariのITPに対応するため、ファーストパーティークッキーを作るという大役あり。

アナリティクスとしては特記する機能はないものの、クロスドメインの設定を一括でできる、コードがスッキリするという意味という意味では導入する価値あり。

さらに詳しく、という人は、デベロッパーガイドが役に立ちます
https://developers.google.com/gtagjs/
「認証と認可」について調べたので、違いをざっくり整理した

##背景
OAuth2.0について勉強している際に、認証と認可という概念があることを知りました。
未だに混同してしまうことがあるので、「認証と認可の違い」に重点を置いて整理してみました。

それぞれについて詳しい情報が知りたい方は [参考資料](https://qiita.com/kaysquare1231/items/c4e4736f2a924b03777b#%E5%8F%82%E8%80%83%E8%B3%87%E6%96%99) をご確認ください。
また、理解に誤りがあれば、訂正いただけると嬉しいです。

##言葉の定義

###認証
「誰であるか」を実証するための過程。
英語では、Authentication または AuthN と表記される模様。


認証には下記の3つの要素があるそうです。
今回の趣旨からは逸れるので、詳細の説明については割愛します。
>1. What you are (inherence factor)
>2. What you have (possession factor)
>3. What you know (knowledge factor)

###認可
「特定の権限を持つこと」を実証するための過程。
英語では Authorization または AuthZ と表記される模様。

##日常生活で例えてみると...
###認証
- 警察から職務質問された際に、身分証の提示を求められる

**※純粋に「誰であるか」を問われていることがポイント**

###認可
- レンタカーを借りる際に、免許証の提示を求められた
- 学生割引を受ける際に、学生証の提示を求められた
- 市役所で親の印鑑登録を行う際に、委任状の提示を求められた
- 銀行で「子供の銀行口座」を解約する際に、委任状の提示を求められた

**※「誰であるか」ではなく、「権限を持っているか」を問われていることがポイント**

##代表的な方法
###認証
・Basic認証(ID/Password)
・生体認証　　などなど

###認可
- OAuth2.0
- APIKey　　などなど



##(私見) なぜ認証と認可を混同しやすいのか
多くの場合は、認証されることで「権限を持っていること」についても実証することができます。
そのため、認証と認可を個別に考えた場合に混同しやすいのではないかと思います。


##参考資料
[Getting Started with OAuth2.0](http://shop.oreilly.com/product/0636920021810.do)
[よくわかる認証と認可](https://dev.classmethod.jp/security/authentication-and-authorization/)
[OAuth 2.0 + OpenID Connect のフルスクラッチ実装者が知見を語る - 認証と認可](https://qiita.com/TakahikoKawasaki/items/f2a0d25a4f05790b3baa#%E8%AA%8D%E8%A8%BC%E3%81%A8%E8%AA%8D%E5%8F%AF)
killコマンドが効かずサーバーが立ち上がらない時

こんにちは[@yukifreeworld12](https://twitter.com/yukifreeworld12)です。

##問題##
`rails s` サーバーを立てようとしても
`Usage:
  rails new APP_PATH [options]〜〜〜` と何行もある長い文章が表示されてサーバーが立ちあがらない。
killコマンドも効かず。


##解決策##
色々なコマンドでポートを調べてkillしても効果なく、一旦cdコマンドでディレクトリを変えて
再び元のディレクトリに戻ってサーバーを立ち上げたところ解決しました。
StanfordNLPを触ってみる

StanfordNLPが公開されました。形態素解析だけでなく、係り受け解析や照応解析までできるやつです。
なんと日本語モデルもあります。これはうれしいです。

> It contains packages for running our latest fully neural pipeline from the CoNLL 2018 Shared Task and for accessing the Java Stanford CoreNLP server
https://stanfordnlp.github.io/stanfordnlp/

というわけで早速触ってみます。

# インストール

PyTorchを入れます。
https://pytorch.org/get-started/locally/

stanfordnlpを入れます。

```
pip install stanfordnlp
```

初回は言語ごとのモデル(2GBくらいあります)をダウンロードすることが必要なので以下を実行しておきます。ダウンロードが終わるまで気長に待ちましょう。
言語はjaだけでも大丈夫のようです。

```
>>> import stanfordnlp
>>> stanfordnlp.download('ja')
>>> nlp = stanfordnlp.Pipeline(lang='ja')
>>> doc = nlp('望遠鏡で泳いでいる少女を見た')
>>> doc.sentences[0].print_dependencies()
```

# 使ってみる

一度モデルファイルをダウンロードしておけば、あとは以下を実行するだけでロードできるようです。
ロードには少し時間がかかります。

```
nlp = stanfordnlp.Pipeline(lang='ja')
```

有名なKNPの例文を実行してみます。

```
>>> doc = nlp('クロールで泳いでいる少女を見た')
>>> doc.sentences[0].print_dependencies()
('クロール', '3', 'obl')
('で', '1', 'case')
('泳い', '6', 'acl')
('で', '3', 'mark')
('いる', '3', 'aux')
('少女', '8', 'obj')
('を', '6', 'case')
('見', '0', 'root')
('た', '8', 'aux')
>>> doc = nlp('望遠鏡で泳いでいる少女を見た')
>>> doc.sentences[0].print_dependencies()
('望遠鏡', '3', 'obl')
('で', '1', 'case')
('泳い', '6', 'acl')
('で', '3', 'mark')
('いる', '3', 'aux')
('少女', '8', 'obj')
('を', '6', 'case')
('見', '0', 'root')
('た', '8', 'aux')
>>> doc = nlp('機内の楽しみって「おやつ」と「機内食」しかなく〜今まで満足したことなかったけど、フィリピンエアライン〜良 かったよ！')
>>> doc.sentences[0].print_dependencies()
('機内', '3', 'nmod')
('の', '1', 'case')
('楽しみ', '4', 'obl')
('っ', '15', 'advcl')
('て', '4', 'mark')
('「', '7', 'punct')
('おやつ', '12', 'nmod')
('」', '7', 'punct')
('と', '7', 'case')
('「', '12', 'punct')
('機内', '12', 'compound')
('食', '15', 'obl')
('」', '12', 'punct')
('しか', '12', 'case')
('なく', '23', 'advcl')
('〜', '17', 'compound')
('今', '19', 'obl')
('まで', '17', 'case')
('満足', '22', 'acl')
('し', '19', 'aux')
('た', '19', 'aux')
('こと', '23', 'obl')
('なかっ', '29', 'advcl')
('た', '23', 'aux')
('けど', '23', 'mark')
('、', '23', 'punct')
('フィリピンエアライン', '28', 'compound')
('〜', '29', 'obl')
('良かっ', '0', 'root')
('た', '29', 'aux')
('よ！', '29', 'punct')
>>>
```

StanfordNLPは、やっぱり望遠鏡問題を解決できていませんが、pip（と長いダウンロード時間）だけでセットアップできる手軽さはいいですね。
これで係り受け解析なども手軽に組み込めるようになりそうです。

ちなみに、以下はKNPの係り受け解析結果です。KNPもpipだけでセットアップできるようになるといいですね。
http://nlp.ist.i.kyoto-u.ac.jp/?KNP

```
% juman < test.txt | knp
クロールで──┐　　　　　　　　　
        泳いでいる──┐　　　　　
                    少女を──┐　
                              見た
EOS
      望遠──┐　　　　　
              鏡で──┐　
泳いでいる──┐　　　│　
            少女を──┤　
                      見た
EOS

         機内の──┐　　　　　　　　　　　　　
             楽しみって──┐　　　　　　　　　
  「おやつ」と<P>─┐　　　│　　　　　　　　　
「機内食」しか<P>─PARA──┤　　　　　　　　　
                         なく〜──┐　　　　　
                         今まで──┤　　　　　
             満足したことなかったけど、──┐　
                     フィリピン──┐　　　│　
                           エアライン〜──┤　
                                   良かったよ！
EOS
```

おしまい。