OmniAICreator/Qiita-1.07M huggingface dataset:
Python で Webスクレイピングして、結果をSlackする

# Python で Webスクレイピングして、結果をSlackする
with 初めてのPython。
プロパティcheck.ini から抽出した値とWebスクレイピングした値を
突合してSlackにメッセージ飛ばす。

## ソース

```python
# coding:utf-8

import json, os, requests
from bs4 import BeautifulSoup
import configparser

slack_token = '{SLACK_API_TOKENの値}'
#slack_token = os.getenv("SLACK_API_TOKEN")
#メンドいのでやらなかった

channelName = 'general'

def postSlackMsg( token, channelName, userName, msg ):
  # settings.
  URL='https://slack.com/api/chat.postMessage'

  # post
  post_json = {
    'token': token,
    'channel': channelName,
    'username': userName,
    'link_names': 1,
    'icon_emoji': ":robot:",
    'text': msg
  }
  requests.post( URL, data = post_json )

def post( url ):
  post_json = {  }
  response = requests.post( url, data = post_json )
  return json.dumps( response.text )

html = post( 'http://xxx.yyy.zzz.aaa/' )

soup = BeautifulSoup( html, "html.parser" )
tags = soup.findAll( '{スクレイピング条件}' )

# get properties.
config = configparser.ConfigParser()
config.read('check.ini')
dictMonitoring = dict( ( config.get( m, 'id' ), config.get( m, 'name' ) ) \
  for m in config.sections() )

reply = []
for tag in tags:
  if tag.string in dictMonitoring:
    # 条件に従って処理
    reply.append( tag.string + 'hoge' )

# post slack.
for msg in reply:
  postSlackMsg( slack_token, channelName, 'botName', msg )
```

## 読み込みプロパティファイル

```text:check.ini
[member1]
id = A001
name = xxxx

[member2]
id = A002
name = yyyy
```

## 総括・感想
やればできるなって感じ。
BeautifulSoup と configparser の優秀さに驚いた。
numpyとか、AIなどで研究職に好まれるのも分かる気がした。
インデント言語と心の中で名付けた。
CloudWatch Eventsルールはまれに複数回発火することがある

# はじめに
知ってる人には常識なのかもしれませんが、個人的にへぇボタン連発だったので、超小ネタですが恥を忍んで共有します。

# 経験した事象
CloudWatch Eventsでcron式を用いて定時にルールをトリガーするようにしていたら、ある日ターゲットがほぼ同時に2回実行された。

# 原因
[CloudWatch イベント のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/CWE_Troubleshooting.html#RuleTriggeredMoreThanOnce)

```
1 つのイベントに応じてルールが複数回トリガーされました。
CloudWatch イベントで、ルールのトリガーまたはターゲットへのイベントの提供で何が保証されますか。

まれに、単一のイベントまたはスケジュールされた期間に対して同じルールを複数回トリガーしたり、
特定のトリガーされたルールに対して同じターゲットを複数回起動したりする場合があります。
```

バッチリ書いてある。。。

# おわりに
知っていればなんてことはないのですが、知らなければそんなことは頭になく、単純に利用する分には再現性もないのでテストしていてもスルッと漏れていってしまうタイプの現象でした。
ドキュメントをちゃんと読む。基本的なことをしっかりやりましょう（お前が）。

反省はさておき、分散システムにおいて一貫性と、可用性とかスケーラビリティみたいなことは常にトレードオフであり、AWSはCloudWatch Eventsのようなサービスにおいてこういう仕様を選択したんだなあと興味深く査収した次第です。
クラウドネイティブなアプリケーションにおいてリトライの可能性や冪等性といったことは基本事項としておくことの重要性をあらためてかみしめながらこちらからは以上でございます。
ScriptTemplatesのファイル名について

# はじめに
仕事でよく使っているScriptTemplatesですが、CreateMenuに項目が増えてしまうことがとても気になっていました。
ある案件でScriptTemplatesの項目がひとつに纏まっており、個人的に良いなと思ったのでやり方をまとめてみたいと思います。

注意点：
テンプレートファイルの内容については触れません。
ファイル名のルールにのみ触れます。

# 使用したバージョン
Unity 2018.3.0f2

# 作り方
Assetsフォルダ以下にSctiptTemplatesフォルダを作成し、テンプレートを作成していきます。
今回はUnityの元々のScriptTemplatesをコピーし、ファイル名を変更して用意しました。
ファイル名のルールは、以下のようになっています。
`{priority}-{項目名}-{新規ファイル名.拡張子}.txt`

![script-templates-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/08d64730-a812-78b8-ebd5-e3a19f763a1b.jpeg)

ファイルを作成や追加をしたあとにUnityを再起動するとテンプレートが有効になります。

![script-templates-02.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/c4e6a1a3-e7bf-5c7e-f1b6-07d86a2c2a4d.jpeg)

今はまだファイルが少ないので問題ないですが、ファイルが多くなってくるとぱっと見てどの項目かわからなくなってしまうことがあります。
なので、項目をひとつに纏めてみたいと思います。
ファイル名のルールは、以下のようになっています。
`{priority}-{纏める項目名}__{項目名}-{新規ファイル名.拡張子}.txt`

![script-templates-03.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/3fad3220-54de-2d52-0611-49347ecd64ab.jpeg)

Unityを再起動してテンプレートを有効にすると`My Templates`という項目に纏められていることが確認できます。

![script-templates-04.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/6cf48e7a-8e25-6abb-62b8-1f5441a59796.jpeg)

必要があれば纏めた項目内でも一部を纏めることができます。
`{priority}-{纏める項目名1}__{纏める項目名2}__{項目名}-{新規ファイル名.拡張子}.txt`

![script-templates-05.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/e639f223-823d-cd6d-0b85-30c16314ccbe.jpeg)

# まとめ
- テンプレートはファイル名の`{priority}-`と`{項目名}`の間に`{纏める項目名}__`を入れると纏めることができる。
- `{纏める項目名}__`を複数個つけると階層構造のように纏めることもできる。

# 参考URL
[第15章 ScriptTemplates - エディター拡張入門](https://anchan828.github.io/editor-manual/web/scripttemplates.html)
Rstudio Cloudでtmapをインストールする

表題の件、できなくて困ってて放置していたのですが、twitterで@uriさんが解決案を提示してくれました。これでtmapがRstudio cloudで利用できます！(2018年12月の話です)

#通常の方法ではインストールできない
```r
install.packages("tmap",dep=T)
```
<img width="1264" alt="Screen Shot 2018-12-16 at 16.54.02.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/224794/42ff9167-4de9-d289-a6ad-e1d89b925e81.jpeg">

あれ、じゃあtmaptoolsやってみるか。

```r
install.packages("tmaptools",dep=T)
```

<img width="1260" alt="Screen Shot 2018-12-16 at 16.57.05.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/224794/7425787a-0202-2596-0f8b-7749b4b9e6b1.jpeg">

どうやらlwgeomがインストール失敗するようです。

#解決策

@uriさんに教えてもらったものです。
lwgeomの開発版であればインストールできます。

```r
install.packages("remotes")
remotes::install_github("r-spatial/lwgeom", ref = "1cd8e1b")
install.packages("tmap")
```

テスト。

```r
library(tmap)
data("World")

tm_shape(World) +
tm_polygons("HPI")
```

<img width="1253" alt="Screen Shot 2018-12-16 at 17.02.05.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/224794/5a56e995-b534-8234-9051-35eb948359b5.jpeg">

あらためてRおじさんのすごさを実感。@uriさんありがとうございます。


インストールにはかなり時間を要するのでご注意ください。
SmartGit v18.2.1 > Tools以下に"Open Git-Shell"などがなく`<No tool configured>'が表示される > 対処

```txt:動作環境
SmartGit v18.2.1
Windows 10 Pro (64bit) バージョン 1809 (October 2018 Update)
```

SmartGitでTools以下に"Open Git-Shell"などがなく`<No tool configured>`が表示される。

対処方法をサポートに聞いた。

### 対処方法

1. Edit > Preferencesを開く
2. Toolsにおいて`[Re-Add Defaults]`を押す
    - => Open Git-Shellを含めた定義(12個)が追加される
3. OKを押す

何故最初から見えていないのか不思議ではあるが、対処できた。
WatsonStudioで詰まった   Watson Studioで始める機械学習・深層学習ーーノンプログラミングでやさしく体験

## Watson Studioで始める機械学習・深層学習 で詰まったところ
下記書籍で勉強して詰まったこところを書いていく。なお、私が買ったのは第一版一刷の下記書籍である。

Watson Studioで始める機械学習・深層学習ーーノンプログラミングでやさしく体験
https://amzn.to/2QXSMiG

## 5.3.1 Neural Network Designer 初期画面表示 P167

 - 「プロジェクト画面から『Add to project』→『Modeler flow』を開く」    
「Modeler flow」の表記がない。「Modeler」は存在するので、とりあえずそれをクリックしたが、「Select flow type」「Neural Network Modeler」の表記が見当たらない。    
とりあえずプロジェクトをcreateしたものの、やはり上記表記が見当たらない。「パレット」が表示されるはずのようなのだが、たどり着けずに詰まった。    
→ **解決** 「Add project」と「Add to project」を間違えてた。正しく「Add to project」を選ぶことで解決。
LaraDockのLaravelでTelescopeを使う

LaraDockのlaravelでTelescopeを使うまでの手順。[公式サイト](https://laravel.com/docs/5.7/telescope)の手順そのままです。

## インストール

```
docker-compose exec workspace bash

composer require laravel/telescope --dev
```

開発環境でのみ使用するので `--dev` をつけておく。インストールが終了したら

```
php artisan telescope:install

php artisan migrate
```

どうやらデータベースを使うようだ。アップデートには下記のコマンドを使用するらしい。

```
php artisan telescope:publish
```

開発環境のみで使用するので、app.phpのサービスプロバイダの登録から `TelescopeServiceProvider` を削除しておきます。

```
// App\Providers\TelescopeServiceProvider::class,
```

`AppServiceProvider` に以下を追加する。公式に書いてあるそのまま。

```
use Laravel\Telescope\TelescopeServiceProvider;

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    if ($this->app->isLocal()) {
        $this->app->register(TelescopeServiceProvider::class);
    }
}
```

開発環境なのでデータが増えていっても特に必要ないけど、`telescope:prune` をスケジューリングしておくこともできる。

```
$schedule->command('telescope:prune')->daily();
```

デフォルトだと24時間で、時間指定もできるようだ。

```
$schedule->command('telescope:prune --hours=48')->daily();
```

## 設定

`config/telescope.php` に追加される。

```.env
TELESCOPE_DRIVER=database
TELESCOPE_ENABLED=true
TELESCOPE_CACHE_WATCHER=true
TELESCOPE_COMMAND_WATCHER=true
TELESCOPE_DUMP_WATCHER=true
TELESCOPE_EVENT_WATCHER=true
TELESCOPE_EXCEPTION_WATCHER=true
TELESCOPE_JOB_WATCHER=true
TELESCOPE_LOG_WATCHER=true
TELESCOPE_MAIL_WATCHER=true
TELESCOPE_MODEL_WATCHER=true
TELESCOPE_NOTIFICATION_WATCHER=true
TELESCOPE_QUERY_WATCHER=true
TELESCOPE_REDIS_WATCHER=true
TELESCOPE_REQUEST_WATCHER=true
TELESCOPE_RESPONSE_SIZE_LIMIT=64
TELESCOPE_GATE_WATCHER=true
TELESCOPE_SCHEDULE_WATCHER=true
```

必要ないものはfalseにしておけばいいと思う、設定の内容については公式に書いてるので省略。デフォルトでは全部`true`。

## ダッシュボード

- http://localhost/telescope

あとは上記にアクセスするだけ。ローカル以外でダッシュボードにアクセスさせるときには設定が必要なので、そのあたりは公式サイトを確認してください。

![スクリーンショット 2018-12-16 16.54.10.png](https://qiita-image-store.s3.amazonaws.com/0/17669/520af69c-ff4e-5000-7df5-17b69683757b.png)
「JavaScriptに人間は勝てない」というのを実感するツール

# はじめに

この記事は、[クソアプリ2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app2)の18日目の記事です。

※JavaScript版でも[同様の記事](https://qiita.com/ssaita/items/ad4d02968059080aaa6e)を書いたのですが、同一記事を複数のカレンダーに紐付けられないので、改めて投稿しています

# JavaScriptをディスってくるやつがいる

JavaScriptをディスってくる人間が自分の回りにはよくいます。

型がないだの、なんでも出来てしまうだの、シングルスレッドはどうなんだの・・・

じゃあ、聞くけども。**「お前はJavaScriptよりも早く計算ができるのか」**と
思うわけです（あからさまな論点のすり替え）

そんなクソな意見を一捻りするために、クソなアプリを作ってみることにしました。

# ということで作りました

名付けて、「Human vs JavaScript」というアプリです。

これはJavaScriptの計算の速さを身をもって体験ができるアプリです。
**アプリと言うかゲームです**

JavaScriptよりも早く、ターゲットに到達するのを競うものです。

**[プレイする](https://shinya.github.io/human-vs-javascript/)**

![hvsj.gif](https://qiita-image-store.s3.amazonaws.com/0/72413/7e95f7b6-4a18-e352-36f9-85d012da1bb8.gif)

**緑の円よりも早く、もう1つの円に到達してください**

# 最初は余裕

このゲームは、最初は本当に楽勝です。

**「おい、JavaScriptの野郎、あんなにノロマでいやがるぜ！」**

といわんばかりのクオリティーでノロノロと動いています。
最初は片手でフライパンを振りながらでも、余裕でプレイできるでしょう。

しかし・・・

後半になるにつれて、どんどんスピードが増してきます。

**「こいつ・・・なかなかやるじゃねーか！」**

と手に汗握るようになり、ついに特異点に到達してしまいます。

**「俺が・・・JavaScriptに・・・勝てない・・・だと・・・！？」**

そんな[セル完全体を目の前にしたベジータ](https://dic.pixiv.net/a/%E7%AC%91%E3%81%88%E3%82%88%E3%83%99%E3%82%B8%E3%83%BC%E3%82%BF)のような絶望が味わえます。

# 技術的な話

こちらの[記事](https://qiita.com/ssaita/items/ad4d02968059080aaa6e)をご覧ください


# プレイを繰り返すことで人間の無力さを知れる

このゲームを繰り返すと、スピードで人間がJavaScriptを凌駕するのは無理なんだな・・・という実感が持てます。

# 筆者のスコアの限界

<img width="526" alt="スクリーンショット 2018-12-16 20.05.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/72413/92f134d9-4485-7420-7a58-64d8a02ea554.png">

# ネタバレ

ネタバレしてしまうと、`setTimeout`の感覚がどんどん早くなっていっているだけです。

そうです、**「待ってもらっていただけ」**です。
JavaScriptは優しいやつだったんだな・・・


# おわりに

**みなさんのプレイしたスコアをぜひコメントで教えてください**

ソースコード - https://github.com/shinya/human-vs-javascript
よく使うエイリアス

※この記事はこちらのアドベントカレンダーに参加しています。
https://qiita.com/advent-calendar/2018/yumemi01_one-liner


というわけで、やっていきます。
ちなみにちゃんとbashを使い始めたのは大体3か月ぐらい前くらいです。それまでは完全なwindowsマンでしたので、低レベルな内容になるかと思いますがご容赦ください。

## Docker関連
僕は普段の業務で`docker-compose up`してから、`docker ps`してコンテナIDを調べてからコンテナに入るということをやっているので下記のaliasを張っています。

```bash
alias dcp='docker-compose' 
alias dop='docker ps'

 
function dce() {
  docker exec -it $1 bash 
}
```
毎回dockerのコンテナID入力するとか面倒じゃない？と思ったかたもいると思いますが、じつはコンテナIDって全部入力しなくてもいいんですよ。コンテナを識別できる文字数(2文字か3文字程度)が入力されていれば普通にログインできます。
下記が例。

```bash
$ docker-compose up
# コンテナが起動する

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e7ec42e8cef5        node_web          "node"                   13 seconds ago      Up 4 seconds        0.0.0.0:8080->3000/tcp   node
78303277dc02        mysql:5.7           "docker-entrypoint.s…"   16 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp   db

$ docker exec -it e7 bash
# これでコンテナにログインできる
```
  
なので、この例を最初に紹介したエイリアスを張った場合には、下記のようになります。

```bash
$ dcp up
$ dop
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e7ec42e8cef5        node_web          "node"                   13 seconds ago      Up 4 seconds        0.0.0.0:8080->3000/tcp   node
78303277dc02        mysql:5.7           "docker-entrypoint.s…"   16 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp   db
$ dce e7
```

コンテナを複数立ち上げて頻繁に入りなおす場合なんかはこうしておくと便利です。
あと、そもそもコンテナIDじゃなくてimageの名前で定義しておけばいいんじゃない？って人もいると思います。それでもいいと思います。
ただ、僕は**いまからどのコンテナに入るかを明確に意識するために**毎回IDを見てから入るようにしています。これは個人の感覚の問題なので好きなやりかたでok。

あと当たり前の話ではありますが、`$ docker exec -it $1 bash` というコマンドはbashがインストールされてるイメージじゃないと怒られます。alpineベースのコンテナだとデフォルトではbashが入っていないのでインストールさせるかコマンドの末尾を `bin/sh` もしくは `ash`に変更しましょう。


## git関連
```bash
alias glo='git log --oneline' 

alias gb='git branch' 
alias gba='git branch -a' 

function gcb() {
  git checkout -b $1 
}
```

gitは敢えてしぼっています。
pushやcommitもよく使いますが、aliasで短くした結果コマンド間違ったみたいなことになると嫌なので。。。

とりあえずこんなとこですかね。
来年はもうちょっとターミナルを活用していきたいなーと思っています。
皆様、良いお年を～

## 追記
```
tree='pwd;find . | sort | sed '\''1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/| /g'\'''
```
Mac初心者の僕が最初に覚えたこと

Windowsを１０年以上使ってきた僕がMacBookProを買って、最初に覚えたショートカットキー等をまとめました。当然ですが、ショートカットキーやジェスチャはシステム環境設定から自由に変更できます。

## 環境
機種ID：　MacBookPro14,1

## キーボード ショートカット
### テキスト入力
コピーなどのコマンドはそのままですね。
`fn`キーは`k`がカナだと覚えれば `j~;` が横並びに配置されているので覚えやすかったです。

|機能|Windows|Mac|
|---|---|---|
|カット|Ctrl + x|⌘ + x|
|コピー|Ctrl + c|⌘ + c|
|貼り付け|Ctrl + v|⌘ + v|
|Delete|Delete|fn + 🔙|
|ひらがな|F6|control + j|
|全角カタカナ|F7|control + k|
|半角英数|F10|control + ;|

WindowsではAtokを使っていましたが、Macの日本語入力はいちいち変換しなくても意図した日本語に変換してくれるのがとても良いです。

## トラックパッド ジェスチャ
ジェスチャの機能はまるで魔法を使っているかの様な操作感で癖になります。

|機能|操作|
|---|---|
|クリック|１本指でクリック|
|右クリック|２本指でクリック|
|スクロール|２本指で上下スライド|
|前後のページの移動|２本指で左右にスワイプ|
|画面の切り替え|３本指でスワイプ|
|Misson Controlの表示|３本指で上にスワイプ|

## .dmgファイルのインストール
- ファイルはFinderにあるサイドバーのダウンロードに格納されます
- .dmgファイルをダブルクリックし、手順に沿ってインストールする
- アプリケーションフォルダにドラッグ&ドロップする

## 参考文献
- [Mac で Multi-Touch ジェスチャを使う](https://support.apple.com/ja-jp/HT204895)
- [Macで半角・全角カタカナ・英数を切り替えるキーボードショートカット](https://gori.me/mac/mac-tips/32195)
CrystalとServer-Sent Eventsと末尾再帰

*この記事は Crystal Advent Calendar 2018 の17日目の記事です。*

この度、Crystalで[Server-Sent Events](https://www.w3.org/TR/2009/WD-eventsource-20090421/)を使うためのライブラリ sse.cr を書きました！

https://github.com/y2k2mt/sse.cr

標準ライブラリで提供されている[HTTP::WebSocket](https://crystal-lang.org/api/0.27.0/HTTP/WebSocket.html)と同じような使い方ができるようになっています。

このライブラリを書く際、サーバから延々とプッシュされてくるイベントを末尾再帰を使って処理するよう実装していたのですが、ある程度の回数を実行したところで:point_down:のようなエラーが...

```bash
Stack overflow (e.g., infinite or very deep recursion)
[0x102d15077] *CallStack::print_backtrace:URI +39
[0x102d15020] __crystal_sigfault_handler +96
[0x7fff7d40cb3d] _sigtramp +29
[0x102d15038] *run<URI>:Nil +8
[0x102d1503c] *run<URI>:Nil +12 (524147 times)
[0x102cf9f81] __crystal_main +4593
[0x102cfda2b] main +43
```

結局、末尾再帰を使って実装していた部分をループに書き換えたのですが、Crystalの[Issues](https://github.com/crystal-lang/crystal/issues/5143)を見るかぎり、末尾再帰の最適化はCrystalでは実装されてない(される予定もない)ようです。

意外でした。
Azure Linux 仮想マシンでgitlab環境を構築する

##はじめに
個人的に使用できるようなGit環境が欲しかったので、Azure の Linux仮想マシン（Ubuntu 18.04）にgitlab ceを構築してみました。

##事前準備
Azure Marketplace でCanonicalから公開されている Ubuntu Server 18.04 LTSイメージを使用して仮想マシンを作成 。ssh(port: 22)接続できる設定
gitlabは4GB以上のメモリを推奨しているので、適したサイズを利用する必要があります
![ubuntu1804.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/78a85172-6676-90b7-7701-38a82894157c.png)

##作業
1. Azure VMの設定
2. Ubutnu OSの設定

###Azure VMの設定
Azure VMの firewallポジションNSG(Network Security Group)を開放し、gitlabで設定するdns名を確認します。
作ったAzure Linux仮想マシンは、インターネット接続はssh(22ポート)しか開放されていないので、HTTP用に80と、HTTPS用に443を開放する。
Azureポータル(https://portal.azure.com) のネットワーク > 「受信ポート規則の追加」から、宛先ポート範囲 80, 443でTCPを許可する
![NSG.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/5d83e4da-c4e8-4429-247a-9cd703e5ef8e.png)

次にgitlabでサイトのurlに設定するために、パブリックIPアドレスのDNS名を確認あるいは設定する。ネットワーク > パブリックIPを選択し、構成のDNS名ラベル（オプション）を設定する。このDNS名（xxx.japaneast.cloudapp.azure.com）を使って、VMのパブリックIPアドレスにアクセスすることができるようになる。
![public.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/7c02fec0-66e1-00f6-b056-1a87a4a76ba1.png)

###Ubuntu OSの設定
基本的に https://about.gitlab.com/install/#ubuntu に従って作業していく。
まずは、パブリックIPでVMにssh接続し、Rootに変更

```sh
azureuser@ub18lts:~$ sudo su -
```


aptの最新化ととgitlabのdependencyのあるパッケージをインストール

```sh
apt-get update
apt-get install -y curl openssh-server ca-certificates
```

公式手順では、メール送信のためにpostfixをインストールしているが、azure仮想マシンはメールサーバとしての利用が非推奨なので使わないと思いskipしました。

apt line に GitLab CE を登録するためにスクリプトを実行します。

```sh
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
```

```sh
root@ub18lts:~# cat /etc/apt/sources.list.d/gitlab_gitlab-ce.list
# this file was generated by packages.gitlab.com for
# the repository at https://packages.gitlab.com/gitlab/gitlab-ce

deb https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ bionic main
deb-src https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ bionic main
```
gitlab-ceをインストールします。この時、EXTERNAL_URLにVMのパブリックIPアドレスのDNS名を登録します。

```sh
EXTERNAL_URL="http://xxx![gitlab.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/8e227e93-5b3c-d494-f310-9873c937c773.png)
.japaneast.cloudapp.azure.com" apt-get install gitlab-ce
```

設定を再構成して、起動します。

```sh
sudo gitlab-ctl reconfigure
```

ブラウザで、設定したEXTERNAL_URL（http://xxxx.japaneast.cloudapp.azure.com）にアクセスします。

最初に root ユーザーのパスワードを変更するように促さるので、New password と Confirm new password に新しいパスワードを入れて Change Your password ボタンをクリックしてください。次からrootとパスワードでログインできるようになります。

![gitlab.PNG](https://qiita-image-store.s3.amazonaws.com/0/192113/d94e1f88-5e84-849e-4fc5-3bddd950fa56.png)

##最後に
MSがgithub買収したのにAzureでgitlabもどうかと思いましたが何とか構築できました。
Docker Imageも公開されているのでそちらから作るというのもありかもと思いました。

##参考
1. [GitLab Installation](https://about.gitlab.com/install/)
2. [GitLab をインストールしよう! (omnibus package)](https://qiita.com/masakura/items/0a0f00dfdddc8ce27f29)
SeriesをDataframeに変換する際indexを列に追加する方法

こんなところでなぜかすごく時間かかってしまったのでメモ。

#reset_index()を使う
SeriesのデータをDataframeに変換する際、indexを列として扱いたい！
結果から言うとreset_index()を使うだけ。


```python:
#適当にSeriesデータを作成
name = ["Red","Blue", "Green", "Yellow","Pink"]
num = "Num"
test = pd.Series(np.arange(1,6), index=name, name=num)

print(test)
#実行結果==========
Red       1
Blue      2
Green     3
Yellow    4
Pink      5
Name: Num, dtype: int64
#==================

#次にDaraframeに変換すると、こんなかんじでindexはそのままindexとなる。
pd.DataFrame(test)
#実行結果==========
	Num
Red	1
Blue	2
Green	3
Yellow	4
Pink	5

#==================

#よってreset_index()を使うと、下記の通り、indexを列として使えるようになった。
pd.DataFrame(test).reset_index()

#実行結果==========
　　| index | Num |
| 0 | Red | 1 |
| 1 | Blue | 2 |
| 2 | Green | 3 |
| 3 | Yellow | 4 |
| 4 | Pink | 5 |
```

コードの実行結果をうまく表示するにはどうすればいいのか。。。
MaterialDesignの「Writing」日本語でまとめてみた

# はじめに
この記事は[ロボP Advent Calendar 2018](https://qiita.com/advent-calendar/2018/robop)の16日目の記事です．

# MaterialDesignって？
Googleが推奨してるデザインのガイドラインです。
なんだかんだで[公式サイト](https://material.io/)が一番分かりやすいです。
<img width="824" src="https://qiita-image-store.s3.amazonaws.com/0/126115/cdd8aa40-60dc-0238-76d8-fd02b381265b.png">

# Writing
「**書き方**」のデザインです。

色合いやアニメーションが滅茶苦茶かっこいいのにボタンのテキストに
`メッセージを送る時に押してください。`
とか書いてあったらガッカリしますよね。

MaterialDesignのかなり奥の方に書いてあったのですが、何気に大事で既存のプロダクトにも反映しやすい部分なのでまとめておきます。

>Text should be understandable by anyone, anywhere, regardless of their culture or language.
**テキストは言語や文化関係なく、誰が何処にいても理解できるようであるべきである。**

# 原則

>UI text can make interfaces more usable and build trust. Text should be clear, accurate, and concise.
**テキストはUIをより良くして、信頼を築ける。テキストは明確で正確、そして簡潔でなければならない。**

### 簡潔にする
必要な情報に焦点を絞って、簡単に分かりやすい文章にしようってことです。

```
//Bad
納豆を美味しく食べるために、まず棒状の箸でグルタミン酸が粘るまで素早く混ぜましょう。粘らないということは、まだ試行回数(もしくは速度)が足りていないということです。

//Good
納豆を食べるために粘り気が出るまで混ぜましょう
```

### 直接的な表現を使う
ユーザのために簡単で直接的な言い方にしてあげようってことです。

```
//Bad
納豆を混ぜる必要があります

//Good
納豆を混ぜる
```

### ユーザに対処する
日本語だと少し難しいのですが、要はUIが語りかけるユーザを統一させようってことです。

```
//Bad
「あなたの住所」を登録するために「私の現在位置」を使用する

//Good
「私の住所」を登録するために「私の現在位置」を使用する
```

### 必要な情報のみを伝える
ユーザが利用する上で知らなくていい情報は表示すべきでないってことです。

```
//Bad
納豆を発送しています。倉庫から出荷され、トラックが発進しました。AM10:00に発進したため、到着はAM11:00頃になります。

//Good
納豆を発送中です。到着はAM11:00頃になります。
```

### 誰でも理解できる共通語を使う
パッと見で分かるためには絶対数の多い共通語のほうがいいよねってことです。

```
//Bad
納豆がばいうまかあ(佐賀)

//Good
納豆おいしい
```

あと専門用語もあまり使わないほうがいいですよね。

```
//Bad
納豆のグルタミン酸を混ぜ合わせ、フラクタンが補助することで美味しくなります。

//Good
納豆を混ぜると美味しくなります。
```

### 現在の時間の状態で示す
将来や過去の時制で語られるとユーザが混乱してしまうから現在で表記しようってことです。

```
//Bad
納豆を混ぜました

//Good
混ぜられた納豆
```

### 数字を使う
`{一,二,三}`や`{one,two,three}`じゃなくて`{1,2,3}`の表記を使おうってことです。
なお複数使う場合は片方がテキスト扱いであればOKです。

```
//Bad
四つの納豆

//Good
４つの納豆

//OK
三秒間、4つの納豆を混ぜる
```

### 句読点を使わない
基本的に一行の文章の場合は`。`は無い方がいいってことです。
複数行の場合は必要ですが、そこまで長くなるなら他の原則に当てはまってるかチェックしたほうがいいかも・・・？

```
//Bad
納豆を混ぜましょう。

//Good
納豆を混ぜましょう
```

ついでに`:`はやめましょう。

```
//Bad
一緒に混ぜる:

//Good
一緒に混ぜる
```

# 構造
さらなる応用。進化系。第二形態。

### 目的から表記する
ユーザに動作を求める時はその目的から書こうってことです。

```
//Bad
箸をでかき混ぜて、納豆を美味しくしましょう

//Good
納豆を美味しくするために、箸でかき混ぜます
```

### 必要に応じて詳細を表記する
そのタイミングでユーザに必要な情報か考えましょうってことです。
ユーザが自発的に探して見つけることができる情報をわざわざ書く必要は無いですよね。

```
//Bad
納豆を食べますか？この納豆は高級な納豆で、粘り気が凄いです。

//Good
納豆を食べますか？
```

### 一貫した言葉を使う
場所によっていろんな言葉遣いだと、混乱しちゃうよねってことです。

```
//Other
〇〇の納豆を食べます
△△の納豆を食べます

//Bad
納豆を食べます

//Good
私の納豆を食べます
```

### 他のUI要素を表記しない
UIの情報をテキストで表記することは、そのUIは何処か破綻してるってことです。

```
//Bad
「納豆を食べる」ボタンを押してください

//Good
納豆を食べてください
```

# おわりに
この記事の内容は全てGoogleの[MaterialDesign-Writing](https://material.io/design/communication/writing.html#writing-for-components)にまとめられています。

これを書いてた自分が勉強になりました。
日本語難しい・・・
Time::Pieceを使って日付の計算をしようとしてハマった話をします

こんばんは、[Magnolia](https://twitter.com/magnolia_k_)です。

この記事は[Perl Advent Calendar 2018](https://qiita.com/advent-calendar/2018/perl)の16日目の記事です。昨日、15日目は(予定では…)[@karupanerura](https://qiita.com/karupanerura)さんの「ISUCON8予選問題においてPerl実装で25万点を突破する方法」でした。

さて、Qiitaに投稿するのがすっかりPerl Advent Calendarの時だけになった気がしますが…最近Perlを書く機会もすっかり無くなり、先日珍しく30分枠という長い枠で登壇しましたが、コード例はRubyで書いています。

[「設計Night2018 powered by Classi」で登壇してきました - Magnolia Tech](https://blog.magnolia.tech/entry/2018/11/11/095448)

しかし、実は最初Perlで書こうとしたのですが、ちょっと想定と違った結果になったので、結局Rubyで書き直しました、今日はその話をします。

## Time::Pieceモジュール

Perlの日付処理モジュールといえばコアモジュールに[Time::Piece](https://metacpan.org/pod/Time::Piece)が用意されています。少し古い話ですが、Perl 5.10からコアモジュール入りしていて、それ以前は日付関連のモジュールはかなり混沌としていたようです。その辺りの事情は以下の記事に詳しく書かれています。

[第15回　DateTime：APIの標準化をめざして：モダンPerlの世界へようこそ｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/modern-perl/0015)

### Time::Secondsモジュールによる日付の計算

[Time::Piece](https://metacpan.org/pod/Time::Piece)には、[Time::Seconds](https://metacpan.org/pod/Time::Seconds)というモジュールが同梱されていて、こちらを使うと日付の計算ができるようになります(1年後とか、1ヶ月後とか)。

```perl
use strict;
use warnings;

use Time::Piece;
use Time::Seconds;

my $t = Time::Piece->strptime('2018-01-01', '%Y-%m-%d');

my $t1 = $t + ONE_DAY;
my $t2 = $t + ONE_MONTH;
my $t3 = $t + ONE_YEAR;

print $t . "\n";
print $t1 . "\n";
print $t2 . "\n";
print $t3 . "\n";
```

これを実行すると…

```perl
$ perl time.pl 
Mon Jan  1 00:00:00 2018
Tue Jan  2 00:00:00 2018
Wed Jan 31 10:29:04 2018
Tue Jan  1 05:48:50 2019
```

**年で演算すると時刻も…進んでいる？？月は2月になってなくて一ヶ月進んでない？？**

まぁ、ドキュメントにはちゃんと書かれているんですけどね…

```
The methods make the assumption that there are 24 hours in a day, 7 days in a week, 365.24225 days in a year and 12 months in a year. (from The Calendar FAQ at http://www.tondering.dk/claus/calendar.html)
```

つまり、1年を365.24225日として計算しています…月あたりの日数は考慮していない(12等分しかしていない)ということなんですが…

4年経つと、うるう年が考慮されて丁度きれいになる…という訳だけど、ユースケース的に日付の計算をしているはずが、時刻が進むとか、月の日数に合わせた計算になっていないとか、全然直感的じゃないですよね…っていうか、普通にうるう年の日単位の計算をしてほしい…という訳で、日付の計算なのに、時刻が変わったり、月がきれいに揃わないというところにハマってしまった、という話でした。いや、ドキュメント読めばいいけど、でもユースケースと合わないと…思う。

ちなみに[RubyのDateモジュール](https://docs.ruby-lang.org/ja/latest/class/Date.html)は時刻を一緒に扱わないので、そのような心配は無いです。

でも、年齢の到達日を計算する時はそれでもハマります…その辺りは冒頭で紹介したスライドをぜひ読んでみてください。

その他のハマりどころとして、3年前の「はてなデベロッパーアドンベントカレンダー 2015」にもこんな記事が有ります。

[Perl の Time::Piece 利用上の注意点 - Hatena Developer Blog](http://developer.hatenastaff.com/entry/2015/12/02/050000)

というわけで、ちょっとしたTime::Pieceモジュールのちょっとしたハマりどころの紹介でした。

明日は、[Morichanさん](https://qiita.com/Morichan)による「Perlとクラス図の対応付け」という話です、お楽しみに！
【プログラミングいろは】5秒前、4、3…(繰り返し、ループ) 

[K3Tunnel](https://k3tunnel.com)を使ってプログラミングのいろはを書いています。

K3Tunnelのはじめかたはこちら⇒[【プログラミングいろは】はじめるのはカンタンです](https://qiita.com/drrn/items/96a86e8fa83dc48741cf)

今回は、似たようなことを繰り返すやり方です。

ロケットの発射だとか、年越しのときのカウントダウンって、１秒ずつ数字を数えます。
こんなやつをプログラミングしてみます。

# 繰り返し

同じことの繰り返しだとか、似たようなことを繰り返したいとき、イチイチやりたい回数分のブロックを並べなくてもすむやり方です。プログラミングでは｢繰り返し｣とか｢ループ｣といいます。

K3Tunnelの画面の左にある｢繰り返し文｣をタップすると、繰り返しのブロックが出てきます。
![Screenshot_20181216-152636.png](https://qiita-image-store.s3.amazonaws.com/0/297642/76fd7ff9-9420-1edd-bad5-4dfeb11068e6.png)


# 同じことの繰り返し

"こんにちは"を10個書いてみます。

単純に10個同じブロックを並べると出来ます。
![Screenshot_20181216-151745.png](https://qiita-image-store.s3.amazonaws.com/0/297642/b4b095d4-5a97-fe92-1ab7-c5c4dec6d259.png)
![Screenshot_20181216-151755.png](https://qiita-image-store.s3.amazonaws.com/0/297642/4f9ff289-f5c9-763c-95a2-1fae1d43d800.png)

イチイチ10個並べるのはメンドウなので、繰り返し文を使います。こう。
![Screenshot_20181216-134317.png](https://qiita-image-store.s3.amazonaws.com/0/297642/2c1d0192-2bc1-7720-70de-87de8ba1fe4c.png)

実行すると同じことが出来ます。
![Screenshot_20181216-134328.png](https://qiita-image-store.s3.amazonaws.com/0/297642/57e2248b-b831-dcb2-d231-6584ce72e557.png)

プログラムが短くなりました。便利。

# 似たようなことの繰り返し

5、4、3、2、1、0はどうやればいいでしょう？
数字を繰り返すんだけど、違う数字です。

｢１つずつ引くことを繰り返す｣と考えられると出来ます。
これ、数を数えながら繰り返すっていう基本パターン。

## 1から10まで数を数える

まず、1から10まで数えてみます。
変数を使って、こうやります。
変数iを1から１つずつ足して、計算結果の表に書くことを繰り返す。

違うブロックを使って3パターン作りました。

別の繰り返しのブロック3種類を使って、同じことをやってます。
![Screenshot_20181216-140506.png](https://qiita-image-store.s3.amazonaws.com/0/297642/beba4508-016e-aedd-a122-d6142b461949.png)
![Screenshot_20181216-140514.png](https://qiita-image-store.s3.amazonaws.com/0/297642/f23a07ba-c798-c7aa-ff01-5ff1af229592.png)

## カウントダウン

ではカウントダウン。
１つずつ引けば良いので…こう。
"0秒前"はおかしいかなと思って、0は別扱いしてみました。

![Screenshot_20181216-145341.png](https://qiita-image-store.s3.amazonaws.com/0/297642/88745e94-c34c-0262-e683-616e7aee7021.png)
![Screenshot_20181216-145354.png](https://qiita-image-store.s3.amazonaws.com/0/297642/d03ac25b-fd0e-819a-819d-349e6ad69d0e.png)

# 1から5までかけ算

かけ算も繰り返せます。
こんな感じ。
![Screenshot_20181216-142705.png](https://qiita-image-store.s3.amazonaws.com/0/297642/ff883aa0-2688-e6be-7476-e8e6c33ff21c.png)
![Screenshot_20181216-142715.png](https://qiita-image-store.s3.amazonaws.com/0/297642/e7de53d5-280c-9326-a65e-7bc31ca06247.png)

こんなふうに、かけ算をたくさん並べなくてもよくなります。
![Screenshot_20181208-133843.png](https://qiita-image-store.s3.amazonaws.com/0/297642/dc6fb0e3-0363-571e-b972-6ef9d338ea1f.png)
alexa-appを使ってalexaカスタムスキルを作る(補足)

# はじめに
alexa-appについての記事は[Express+alexa-appでlambdaを使わないでAlexa Skillを作るよ](https://qiita.com/hidesuke/items/3366c8c55665a79bfcaf)の方が詳しいので、触れられていないところを補足する形で書いてみようと思います。

# 環境
- NodeJS 10.7
- express 4.16.0
- alexa-app 4.2.3
- heroku

# インテントとは
インテントは会話の分類だと思ってください。
![インテントの構成例](https://qiita-image-store.s3.amazonaws.com/0/83405/17ced2e7-e449-3d63-a5a9-8c139a7f638e.jpeg)
例として、上のように

- 打率の```num```位を指定して読み上げる「average」
- 打率の成績を全部読み上げる「averageAll」
- 打点の成績を全部読み上げる「rbiAll」
- 防御率の成績を全部読み上げる「eraAll」

を用意します。
## alexa-appでの実装

```alexa.js
app.intent('average', { utterances: UTTERANCES.request.average }, averageResponse);
app.intent('averageAll', { utterances: UTTERANCES.request.average }, averageAllResponse);
app.intent('rbiAll', { utterances: UTTERANCES.request.average }, rbiAllResponse);
app.intent('eraAll', { utterances: UTTERANCES.request.average }, eraAllResponse);
```
app.intent()

- 第一引数:developerコンソールで定義したインテントを設定します。
- 第二引数:スキーマを定義するようです。(まだ調査が十分ではありません)
- 第三引数:実行する関数を指定します。

## インテントの設定例
「サンプル発話」で想定される呼びかけを設定します。
![設定例](https://qiita-image-store.s3.amazonaws.com/0/83405/8c371006-637d-a19c-7257-b4454af6b866.png)
例：ユーザが「(ウェイクワード),打率全部」と話しかけたら先程の```averageAllResponse```が実行されます。

## インテントで値を受け取る
### developerコンソールでの設定
打率の```num```位を指定して成績を読み上げる、という処理で
numという数値をユーザの会話から取得するのに***スロット***という設定が必要となります。
![値を受け取る](https://qiita-image-store.s3.amazonaws.com/0/83405/874ff9e2-bfb7-638f-0162-227ffd4f793f.png)
スロットタイプが「AMAZON.NUMBER」のnumというスロットを作ると、サンプル発話の中に```{num}```と記述できるようになります。
このように設定すると、ユーザが「打率の8位は？」と尋ねると、```average```インテントに該当する発話があったことと、***8***という数値をプログラムが取得できます。

### アプリケーション側の実装

***average***インテントの時に***averageResponse***が発火します。スロットの値は```req.slots[設定したキーの名前].value```で取得できます。```num```と定義しましたね。

```app.js
const averageResponse = (req, res) => {
  var num = req.slots['num'].value
  if(num <= 10){
    res.say(num+"位<break time='100ms'/>"+json['averageTop10'][num - 1]['name']+':'+json['averageTop10'][num - 1]['average']).shouldEndSession(false)
  }else{
    res.say("ごめんなさい。<break time='100ms'/>"+num+"は指定できません。<break time='100ms'/>10以下の順位を指定してください").shouldEndSession(false);
  }
}
```

# SSML
さて、```res.say()```の中で見慣れないHTMLタグのようなものが出てきました。これは[SSML](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html)という音声読み上げにアクセントをつける言語です。HTMLのようにタグで文字列を囲んだり、小休止したいところに<break/>タグを入れます。

# alexaカスタムスキル初心者がいくつかはまった点
## herokuにデプロイするとエラー 'missing certificate url'
[issue](https://github.com/alexa-js/alexa-app/issues/49)に上がっていました。

```app.js
var app = express();
//----
//この間でapp.use()などを使ってはいけない
//----
alexa.express({
  expressApp: app,
  endpoint: '/alexa',
  checkCert: true
});
```
alexa.express()にはexpressのインスタンスをそのまま渡さないといけないようです。

## 実機テストでスキルが出てこない
[開発したAlexa Skillが日本語版に出てこない場合](https://qiita.com/sparkgene/items/c15e81cd6a5a40f7189d)
[Alexa 開発者アカウントのハマりどころ](https://qiita.com/toshimin/items/3355a996008216dff741)

## テストコンソールで2桁の数値が取れない？
これは情報が出てこなかったのですが、アプリケーション側で10以下の数値は許容しているものの、テストコンソールを使うと10以上の数値を取得できないという問題がありました。
![](https://qiita-image-store.s3.amazonaws.com/0/83405/a15ee750-b305-0754-ab64-3d7d230f43a8.png)
JSON入力を見るとslots.num.valueというプロパティがないことがわかります。実機ではきちんと認識されました。
その日付を自動でcsvファイル名に含ませる＆utf-8とshift-jisのcsvをエンコードエラーを無視して作成（備忘録）

#その日の日付をファイル名に自動で含むようにしたい
個人的には、エクセルでもファイルを使うので、utf-8とshift-jisの両方のファイルを同時に作りたい。
また、jupyter上で動かしてるものを単にコピーしています。

```python
import datetime

#今日の日付を取り出し
now = datetime.datetime.today()
date = str(now.strftime("%y%m%d"))

#ファイルの内容を表す語句と、バージョンを指定
file_name = 'ファイル名' +'ver1.0'
utf_8_file_name = date + '_' + file_name + '.csv'
shift_jis_file_name = date + '_' + file_name + '_shift_jis.csv'
print(utf_8_file_name)
print(shift_jis_file_name)
```

#続いてファイルの保存
```python
import pandas as pd
import codecs

#データエクスポートの関数を定義
def df_to_csv(df):
    df.to_csv(utf_8_file_name, encoding='utf_8')
    with codecs.open(shift_jis_file_name, 'w', 'shift_jisx0213', 'ignore') as f:
        df.to_csv(f)

#関数を実行
df_to_csv('保存したいpandas df')

```

codesを使い、'ignore'を指定してあげることで、エンコーディングエラーを回避できる。
fabricにアプリ追加

# 概要
新規アプリを追加する際のフローを記載しておきます。
アプリ配信やcrash検知に使っているので、結構大事です。

## 手順
基本以下の手順に従います。
https://fabric.io/kits/ios/crashlytics/manual-install?step=0
＊予めfabricのデスクトップアプリをインストールしておいてください
https://www.fabric.io/downloads/apple

# 注意
すぐに追加されないことがあるのと、macのアプリが止まるっぽいが無視して、手順通りやってけばよい。
最後に
https://fabric.io/kits/ios/crashlytics/manual-install?step=3
のfind my appして、アプリがあるか確認してください。
すぐ見つからなくても数時間まつ。

それでも見つからなかったら、サポートにメールしたほうが良い。
Qiitaでいいね！した記事をSlackに垂れ流すツール作ったα版

この記事は [個人開発 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/private-development) の16日目です

# 作ったもの [unofficial-qiita-rss.tk](https://unofficial-qiita-rss.tk/) です

# なにができるの？

指定したqiitaユーザの最近いいね！した記事をRSS化します。
slackのfeedコマンドで読ませることで、自分や同僚がいいね！した記事をSlackに垂れ流すことができます。
大した機能ではありませんが、同僚がなんの技術に興味があるのか知ったり、自分の好きな技術をシェアすることができます。
また、RSSで提供することでSlack以外のチャットツール(chatworkを除く）でも活用できると思います。

# 何を使って作ったの？

- Goutte (HTMLのパース）
- Laravel (Framework, ORMしかつかってない)
- vestacp (サーバ管理ツール)
- cloudatcost (格安インフラ　)
- cloudflare (CDN)
- Atom (Editor)
- Transmit (SFTP)
- bulma css
- Mac mini
- deployer (deploy tool)

# 開発ペースについて

昨日は個人開発 #2 アドベントカレンダーを担当していたので
当日ぶっつけ本番で作成しました。
前日に構想まで行い、当日３時間ぐらいで作成しました。
１日で作れる規模感で便利そうなものということで今回作ったものが出来上がりました。
無理に新しい技術（知らない位技術）を使わずにいつものスキルセットで回すと爆速ですね！
Macのデフォルト電卓アプリでビットフラグを簡単に調べる

## はじめに
Macのデフォルト電卓アプリにはプログラマ向けの機能がついています。

プログラマ向け機能と言っても、電卓上で何かコードを書ける訳ではないですが、
ビット演算が出来たり、ビットフラグを使っている場合にどのビットフラグが立っているかを簡単に調べるのに役立つツールになる感じです。

これを使ったビットフラグの調べ方だけ簡単に紹介します。

##　プログラマ向け表示に切り替える
- まずはspotlightなど、何かしらの方法でアプリを開いて....
![スクリーンショット 2018-12-16 14.31.55.png](https://qiita-image-store.s3.amazonaws.com/0/144581/5c3e00cf-a438-80fa-01c8-d6a9ce7d70b9.png)

- 開いたら、「表示 > プログラマ」　を選択する。（これだけで切り替えは終わりです）
![スクリーンショット 2018-12-16 14.32.19.png](https://qiita-image-store.s3.amazonaws.com/0/144581/95e88414-5592-e7f1-0828-7281cf74e030.png)

- するとこんな感じの表示になります。（なんだかそれっぽいですよね）
![スクリーンショット 2018-12-16 14.32.37.png](https://qiita-image-store.s3.amazonaws.com/0/144581/c3b4ed3e-6b59-6aa3-c418-08b0a8a03a48.png)

- ここをポチポチで８進数,10進数,１６進数を切り替えられます
![スクリーンショット 2018-12-16 14.32.37 2.png](https://qiita-image-store.s3.amazonaws.com/0/144581/cef13ff9-2f2c-acad-4da0-c992d26c8c2d.png)

## フラグの調べ方
- 例えば、調べたい値が`1234`だとします。
- 10進数に切り替えて`1234`を入力すると、`0000 0100 1101 0010`と下に表示されているのがわかるかと思います。（これでもうわかりますよね）
![スクリーンショット 2018-12-16 14.39.40.png](https://qiita-image-store.s3.amazonaws.com/0/144581/187cb107-0345-b883-937f-8dacd3b66112.png)

- ちなみにビットをマウスオーバーして少し待つと何番目のビットかも表示してくれます
![scsho.png](https://qiita-image-store.s3.amazonaws.com/0/144581/919ac9b8-d95c-c339-8a55-abbcb556c788.png)



## おわりに
ANDとかOR、ビットシフトなどの演算機能もありますが、自分は正直この使い方しかしてないです。

...が、すぐにパパッと調べられて便利だなと思っています。
(自分用メモ) Mac tips

Macで調べて自身で試してみたものを書き下していく

1. Mac上で操作しているものを動画で撮る
    * [モチベーション] AquaSKKのおかしい挙動をgithubで報告するために, 現象を動画で撮ってgifにする
        * https://support.apple.com/ja-jp/guide/quicktime-player/qtp97b08e666/mac
    * Quicktime Playerは素敵. 撮影する範囲を指定することができ, また指定する時間でトリミングすることができる
    * [おまけ] GifにするのはGIF Brewery 3を使用した. (以前なぜか購入していたので)
        * [余談] ffmpegでも出来るらしい. ffmpeg素敵だ
https://qiita.com/wMETAw/items/fdb754022aec1da88e6e
Laravel5.7をGAEにデプロイ

## はじめに
Laravel5.7をGCPで使用する記事が少ない為、シリーズ化して書いていきます。

`Flexible Environment` とは別に`PHP7.2 runtime`が登場しました。
今回は`PHP7.2 runtime`の方をご紹介していきます。
Flexibleとは`app.yaml`の記述や挙動が変わっていくのでご注意です。

#### 参考記事
[公式 app.yaml Configuration File](https://cloud.google.com/appengine/docs/standard/php7/config/appref)
[公式 PHP7.2runtime News](https://cloud.google.com/blog/products/application-development/introducing-php-7-2-runtime-on-the-app-engine-standard-environment)

## 準備
### Laravelをインストールして確認
http://localhost:8000 で確認

```bash
$ php artisan serve
```
### gcloud CLIのインストール
以下の手順にてインストール
[Cloud SDK のインストール ](https://cloud.google.com/sdk/downloads?hl=JA)

### GAEデプロイ用のapp.yamlの作成

```app.yaml
 runtime: php72

 env_variables:
   APP_LOG: errorlog
   APP_KEY: YOUR_APP_KEY
   APP_STORAGE: /tmp
```

#### app.yamlでの注意
※ここでskip_filesの定義をする事もあるが、`.gcloudignore`に移行されたので注意

```app.yaml
skip_files:
    - .env
```

### APP_STORAGE関連の修正
GAEにて`/tmp`に書き込めるようにする為に以下２ファイルの修正・追加

`/config/view.php`の`Compiled View Path`を書き換え。

```/config/view.php
'compiled' => storage_path(),
```


```/bootstrap/app.php
$app->useStoragePath(env('APP_STORAGE', base_path() . '/storage'));
```

### APP_KEYの生成とapp.yamlに置き換え
```bash
$ sed -i '' "s#YOUR_APP_KEY#$(php artisan key:generate --show --no-ansi)#" app.yaml
```

### GAEにデプロイ
```bash
$ gcloud app deploy
```

### デプロイされている事を確認
次回はCloud SQL、GCS、GCE等について書いていきます。
![スクリーンショット 2018-12-16 15.57.19.png](https://qiita-image-store.s3.amazonaws.com/0/18721/2e04dd33-88f9-4859-a70c-c4587018822d.png)
[Vue.js] なぜpropsのdefault値にObjectやArrayを指定する際にfactory関数にする必要があるのか

あなたがこの記事を見ているということは、コンソールに以下のワーニングが出ていることでしょう。

## WARN

```console
[Vue warn]: Invalid default value for prop "XXX": Props with type Object/Array must use a factory function to return the default value.
```

このワーニングはVueコンポーネントの`props`に関するものです。

「propsのdefaultの値にObjectやArrayを使用したい場合、ファクトリー関数を指定しろ」

という内容のワーニングです。

## ワーニングを解消する

以下のようにコードを修正することでワーニングを解消できます。

### 修正前

```javascript
props: {
  obj: {
    type     : Object,
    require  : false,
    'default': { count: 0 } // Objectをそのまま指定している
  },
}
```

### 修正後

```javascript
props: {
  obj: {
    type     : Object,
    require  : false,
    'default': () => ({ count: 0 }) // Objectを生成する関数を指定する
  },
}
```

## なぜ関数を指定する必要があるのか

なぜ、ObjectやArrayをデフォルト値としたい場合、関数を指定する必要があるのでしょうか。

### ワーニングを無視すると何が起こるか

まず、ワーニングを無視した場合に何が起こるのか試してみます。

```vuejs:AppCounter.vue
<template>
  <div class="content">
    <span>{{ obj.count }}</span>
    <button @click="obj.count++;">+1</button>
  </div>
</template>

<script>
export default {
  props: {
    obj: {
      type: Object,
      require: false,
      'default': { count: 0 } // ワーニングを無視して、Objectをそのまま指定している
    }
  }
};
</script>
```

「+1」ボタンのクリックでカウンターをインクリメントする、Vueコンポーネントです。

```vuejs:App.vue
<template>
  <div id="app">
    <app-counter />
    <app-counter />
  </div>
</template>

<script>
import AppCounter from "./components/AppCounter";

export default {
  name: "App",
  components: {
    AppCounter
  }
};
</script>
```

そのカウンターを2つ配置して動かしてみると、以下のような結果になります。
![counter01.gif](https://qiita-image-store.s3.amazonaws.com/0/6158/eb5630db-fc9c-8fd7-975a-f977498676d5.gif)
どちらのボタンをクリックしても、2つのカウンターがインクリメントされています。

↓のリンクから実際に触っていただけます。
[![Edit Vue Template](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/lp603xn3r7)

### オブジェクトや配列は値がコピーされず、参照が共有される

propsのデフォルト値に指定したオブジェクトや配列は、値がコピーされることなく参照が共有されます。
そのため、複数のvueインスタンスが同一のObjectを参照し、同一のObjectに変更を加えてしまう状況が発生します。

2つのカウンターがどちらのボタンの操作でもインクリメントされるのは、このためです。

ワーニングを出すのではなく、フレームワーク側でObjectや配列を自動でディープコピーしてくれればいいのでは？と考えることもできるのですが、開発者側でファクトリー関数を指定できるようにすることで、ディープコピーにまつわるリスクを抑えつつ、実装の選択肢を広げ自由度を上げる目的があるようです。

## 参考
https://github.com/vuejs/vue/issues/1032
2年間運用した Rundeck のジョブが全コケした話

この記事は[エイチームブライズ/エイチームコネクト/エイチーム引越し侍 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/hikkoshi)　17日目の記事です。みんな業務外での技術チャレンジを記事にしているのが多いので、たまには実際に業務でハマった話を。

# 背景

2016年のQiitaアドベントカレンダーで [cron から Rundeck での運用へ移行する記事](https://qiita.com/hironey/items/dd7ab74d6c2551b5eb3d)を書いたように、引越し侍でのバッチ処理を Rundeck で管理するようになってからちょうど2年が経ちました。
そのちょうど2年経った頃に突然 Rundeck のジョブが全て実行に失敗するという事態に陥ったためその顛末を記録しておきます。
ちなみに、Rundeck のバージョンは 2.7.1 です。2年前に入れたまま…いつの間にか3系になってたんですね…

# 起きたこと
11月のある日曜日の夜、スマホの画面に Rundeck のジョブ実行が失敗した旨のChatwork通知が続々と届く…
（うちでは、Rundeckのジョブの実行が失敗した際に Webhook で AWS の API Gateway ＆ Lambda 経由で Chatwork に通知が行くようにしてあります）

なんだなんだと思って Rundeck のサーバにSSHでログインしてみると、何かをしようとすると /tmp にファイルが書けないというメッセージが出る。
/tmp にもディスクボリューム全体にも空き容量は十分にあるが…？？

一旦、OSを再起動してみる。
問題なく停止して、起動してくる。
再起動後は /tmp にファイルを書き込めるし、Rundeckのジョブも普通に動くようになった。。。
何があった？

# 原因
ふと思いついた。
inode かも。

```shell
 $ df -i
ファイルシス   Iノード   I使用  I残り I使用% マウント位置
devtmpfs        503510     435 503075     1% /dev
tmpfs           506232       1 506231     1% /dev/shm
/dev/xvda1     3276800 3244430  32370   100% /
```

やっぱり！ビンゴ。
上記は再起動後なので、その直前には残り inode はなくなっていたのだと思われます。
inode が枯渇したことでファイルが生成できなくなってジョブの実行が失敗していた模様。

でも、どこにそんな大量のファイルが…と思って調べてみると
`/var/lib/rundeck/logs/rundeck/<Project名>/job/<Job ID>/logs/` 以下に大量のログファイルが生成されていた。

ジョブが実行されるたびに上記ディレクトリに `<実行ID>.rdlog` と `<実行ID>.state.json` という 2つのファイルが生成されている。
現状うちの環境では、ジョブは 1日にざっと 3,000回以上実行されているようなので、毎日 6,000個程度のファイルが生成されて蓄積されていることになる。
上記の df の結果を見ると / の inode の最大数は 300万程度のようなので 500日でいっぱいになる計算。ジョブの定義数や実行回数は徐々に増えていったことを考えると、ちょうど2年程度でいっぱいになったのは辻褄が合う。

# 回避策
このログファイルは Rundeck の API 経由で消せるようだけど、ジョブの実行IDごとに一つ一つ消していくか、ジョブIDごとに全消ししかできないようなので、すんごく時間がかかるか、全部消えちゃって不便。

ログファイルをOSコマンドで直接削除して大丈夫かどうかは明確には分からなかったのですが、[このあたりの議論](https://github.com/rundeck/rundeck/issues/976)を読む限り、ワークアラウンドとしてはアリだと判断しました。
（3系だとログの有効期限＆自動削除機能は実装されてたりするのかな…）
実際にファイルを消してみても Rundeckの稼働には特段の影響は感じられませんでした。

で、以下のようなコマンドを実行する JOB を Rundeck に登録して日次で実行しています。
半年以上（185日）前のログファイルを消しています。

```shell
find /var/lib/rundeck/logs/rundeck/<Project名>/job/*/logs/ -type f -mtime +185 -exec rm {} +
```

これでひとまず inode が枯渇する心配はなくなりました。めでたしめでたし！

ただ、これで半年以上前の実行ログは見られなくなると思っていたら、なぜかファイルを削除しても管理画面からはまだ見ることができる…
ファイルの他にもDBに記録しているのでしょうか…なぜそんな二重化を…
ファイル消してもログが確認できるのであれば半年と言わずもっと短期間でファイルを消しても良さそう。
これについてはこれ以上深掘りしてないです。

# おまけ
登録 JOB 数が 100個を越え、毎日 3,000回以上 JOB が実行されるようになってくると、Rundeck の管理画面を開くのも非常に重い状態になっていました。
何らかのJOBが実行状態になるたびに（つまり数分ごとに） MySQL(RDS)側の CPU が 100％ になっていました。

Rundeckサーバを分割しないといけないかなあ、どっかでパフォーマンスチューニングできないかなあと思っていたところ、上記のログファイルでいろいろ調べている際に[ここの記事](http://ndx.hatenablog.jp/entry/2016/02/12/225753)を発見。
同じように INDEX を貼ってみたところ CPU使用率が劇的に下がり（下記グラフの 11/18 22時あたり）、

```sql
mysql> ALTER TABLE workflow_workflow_step ADD INDEX workflow_commands_id(workflow_commands_id);
```
![rundeck_rds_cpu](https://qiita-image-store.s3.amazonaws.com/0/81599/171b565f-dfce-6375-e588-97223c841e38.png "MySQLのCPU利用率")
管理画面もキビキビ動くようになりました。めでたしめでたし！

# お知らせ
エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひとも[エイチームグループ採用ページ](https://www.a-tm.co.jp/recruit/)（[Webエンジニア詳細ページ](https://www.a-tm.co.jp/recruit/requirements/career/lifestylesupport-webengineer/)）よりお問い合わせ下さい！

明日は、引越し侍のエンジニア @nao_70 の出番です。お楽しみに。
ハイブリッドクラウドについて思うところ

# はじめに
この記事は [リクルートライフスタイルアドベントカレンダー2018](http://qiita.com/advent-calendar/2018/recruitlifestyle) の17日目です。
ホットペッパービューティーでエンジニアをしています。shaseです。

現在開発中のプロジェクトが、大人の事情によりハイブリッドクラウド構成になっているので、開発をしている中で思ったことをつらつら書いてみたいと思います。（ネットワークエンジニア視点ではなく、開発者視点です。）

プロジェクトでの自分の役割はプロジェクトマネジメント業が主になってしまったので、今回使っているテクノロジの詳細は、誰かが会社のブログに書いてくれると信じて概ね端折ります。

今回はAWS前提の話になります。

# TL;DL
* 特別な事情がない限りハイブリッドクラウドはやめましょう。
* 専用線(DX)を使わないことも検討しましょう。
* 現在普及しているテクノロジを用いればそれなりにアジリティの高いオンプレミス（ただし運用コストは支払う必要がある）環境が用意できるはずです。オンプレミスに寄せるか、クラウドに寄せることができないか考えましょう。

# 構成概要

* 今回は、モノリシックなAPIのリプレイスプロジェクトです。ざっくり下記のようなものをつくっています。
* BackendAPIがオンプレミス側にあり、アグリゲーションするBFFがAWS側にあります。APIの通信はHTTPSです。（BFF/BackendはL7で連携しています。）
* AWS側の会社共通部分を管理するチーム、オンプレ側の共通部分を管理するチームが、自分たち開発チームとは別に存在しています。

![onpremiss-cloud.png](https://qiita-image-store.s3.amazonaws.com/0/147174/0e6fa14e-c09c-ff8a-32c7-70fdc9990721.png)

# ハイブリッドクラウドにするときのコツ

## 専用線(DX)は使わない、もしくは使ったとしてもアドレッシングやNATには注意

専用線を使わない構成をまず考えましょう。使う場合でも、仕組み上パフォーマンス的にLAN内と同じようなクオリティは期待できない（期待してはいけない）ので、ステートフルなプロトコル(JDBC等）を使う際は特に注意です。

また、専用線を使った場合、ネットワークがオンプレミス側に引きずられます。（IPアドレスの設計等）。クラウド側のメリットを殺す結果にしかならないので、可能であれば専用線を使わない構成を検討しましょう。

オンプレミス側のアドレスが潤沢な場合（あまり経験がないですが...）は、アドレッシングも容易ですが、そうでない場合はNATを使わざる得ないケースも多いかと思います。

仮にNATを使った場合でも、オンプレミス->クラウドの通信がなく、クラウド->オンプレミスだけの通信であれば、クラウドN対オンプレミス1のNATにし、クラウド側のIPアドレス体系の柔軟性を確保するようにしましょう。（オンプレミス->クラウド側の通信は非private通信を検討しましょう）。

今回のプロジェクトでは、当初ネットワークレイテンシを気にして、専用線(DX)を使う構成を準備していました。が、性能試験の結果、使わなくても今回のユースケースであれば問題のない範囲に落ち着きそうということで、使わない方向で最終調整しています。

## オンプレミス側/クラウド側で揃えられる部分を揃える

ただでさえ複雑な複雑になりがちなので、なるべく扱う人間のコンテキストスイッチを小さくする努力はしました。

* AWS側でAmazonLinuxを使い、オンプレ側でCentOSを使うように（近いディストリビューションを使う）。
* システムのモニタリングはAWS側/オンプレ側どちらもDatadogで統一。
* ログの取扱は、ホットペッパービューティーのログ集約している外部システムにオンプレミス/クラウド共に集約。
* 分散トレーシングはAWS X-Rayで統一。

などなど

# ハイブリッドクラウドのいいところ

## 部分的にでもクラウドの恩恵が受けることができる

部分的とはいえ、クラウドを使うことができるようになった恩恵はかなり大きいものでした。この1点をもって、部分的にでもプロジェクトでAWSを使ってよかったなと感じています。

* 開発チームが環境などを自由にすぐつくれる。
* CodeBuildなどの開発支援ツールがすぐつかえる。（開発環境コンテナをECRで管理できる等々）
* 全部オンプレミス側で用意するより圧倒的に下がるコスト。

などなど

# ハイブリッドクラウドのだめなところ

## リリース方式を統一するのが難しい

例えばCodeDeployにはオンプレミス版もあるので、CodeDeployでクラウド側/オンプレミス側のデプロイ方式を統一させることができるのでは、と事前に考えて検証してみたのですが、現実的にそれは難しいと考えました。

* CodeDeployのオンプレミス版ではIAMの管理が非常に煩雑になってしまう。
* リリース作業というのは、それに付随するオペレーション（ロードバランサー配下のものをinactiveにしたり等）が発生するが、それらすべてをCodeDeployのオンプレミス版でコントロールするのは非現実的だった。（AWS側はリソースのコントロールがすべてAPI化されているので大丈夫）。

クラウド側/オンプレミス側それぞれでリリース方式は考えたほうがいいと思います。

## 障害ポイントが増える

単純に障害ポイントが増えます。問題の切り分けも、オンプレミス側の知識とクラウド側の知識が要求されるので、難易度が上がります。

## オンプレミス側のスケーリングが難しい

今回の構成でいうと、Backendのスケーリングが難しいです（あたりまえ）。バックエンドのスケーリングが難しいということは、BFF側だけオートスケーリングするような構成にしてもしょうがないということです。クラウド側の恩恵は部分的なものにならざるを得ません。クラウド側だけ攻めた構成というのも難しいです。

# おわりに

ネガティブなことも書きましたが、アジリティの低いオンプレミスしか使えないような環境であれば、ハイブリッドクラウドも十分検討に値すると思います。

ただ、いろいろ注意するべき点は多いので、PoCなどを通して、落とし穴を回避するのは大事だと思いました。

それでは、めりーくりすます！
Unityを始めて一年経ったので、勉強内容をまとめてみた

# はじめに
はじめまして。私は情報系学科の大学生です。Unityは大学一年の冬から始め、プログラミング自体は大学一年に入ってから始めています。今回は、私が一年Unityを勉強して、どういう順番で勉強したのか, 何をしてきたのかを話します。
# 経歴
##### 0カ月目-1カ月目
>勉強内容
Unity超基礎、C#超基礎

まずUnity独特の操作方法を学びました。とにかく画面上の情報量が多いため、どの機能が何を意味しているのかを学びました。私はUnityの画面は英語で行なっていますが、日本語化もできるので、もし英語全く分からないという方は日本語化しても良いかと思います。（ただ、英語のほうが調べて出てくる情報量が圧倒的に多いため、英語をおススメします。）
並行してUnityのC#を勉強しました。当時はMonoDevelopで開発していました。学校の授業でProcessingという言語ライブラリを使用していており、個人的にはC#と書き方が似ていたので入りやすかったです。

使用した本、サイト：[見てわかる！Unity5 C# 超入門](https://www.amazon.co.jp/%E8%A6%8B%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8BUnity5-%E8%B6%85%E5%85%A5%E9%96%80-Game-Developer-Books/dp/4798044962)
***
#####2カ月目
>勉強内容
C#超基礎

前述の本を勉強し終わってからは、色々なサイトをめぐってC#の基礎を学びました。Unityの記事は調べると山ほどでてくるため、自分の興味のある分野を学ぶとよいと思います。Rigidbodyは早いうちに勉強しておくとよいと思います。私はこの時期から3Dモデリングも並行して勉強し始めました。

***
#####3カ月目-5カ月目
>勉強内容
C#基礎

日本ゲーム大賞に応募するための作品を作りました。一から作品を作ると、とにかく多くのことを学べました。ここではAnimator, ParticleSystemや、キャラの状態管理, シーン切り替えなどを学びました。また応募期間の締め切りがあることで、時間内に作品を作るということを学びました。

***
#####6カ月目-7カ月目
>勉強内容
Shader

何やら見栄えが綺麗になるシェーダーというものがあるらしいと知り勉強を始めました。シェーダーを書くHLSLは、C#とは全く構文が異なるため、理解に苦労しました。サンプルなどが動くと見ていて楽しいため、モチベーションは高く保てました。自分で望む挙動を一から書くといったことは難しいですが、ネットのコードを読んで中身の挙動を理解できるというところまで行けば良いと思います。このころからVisualStudioに移行しました。

使用した本、サイト：[7日でマスターするUnityシェーダー入門](http://nn-hokuson.hatenablog.com/entry/2018/02/15/140037)
[Unity のシェーダの基礎を勉強してみたのでやる気出してまとめてみた](http://tips.hecomi.com/entry/2014/03/16/233943)
[Unity 2018 Shaders and Effects Cookbook](https://www.amazon.co.jp/Unity-2018-Shaders-Effects-Cookbook/dp/1788396235)

***
#####8カ月目-9カ月目
この期間はあまりUnityを触っていませんでした。Unity2Dを少しだけやりましたが、基本的な使い方は3Dとほとんど変わらなかったです。

***
#####10カ月目
>勉強内容
C#基礎

Unity1週間ゲームジャムに参加しました。Unity1週間ゲームジャムとは、一日目に作成作品のお題が出され、1週間以内に作品を作成し投稿するというものです。この時に初めて共同作業を行い、仕様変更によってコードを書きなおすなどを経験しました。仕様変更に強いコードの書き方、他者のアイデアをどうコードに落とし込むかなどを学びました。

***
#####11カ月目
>勉強内容
C#

もっとコードを綺麗に読みやすく書くために、勉強しなおしました。Linq, デリゲート, ラムダ式記述, UniRxなどを学びました。まだまだ勉強したりないなと感じました。

使用した本、サイト：[【LINQの前に】ラムダ式？デリゲート？Func<T, TResult>？な人へのまとめ【知ってほしい】](https://qiita.com/RyotaMurohoshi/items/740151bd772889cf07de)
[UniRx入門シリーズ 目次](https://qiita.com/toRisouP/items/00b8a5bb8e7b68e0686c)

#まとめ
Unityは初心者の私でも5カ月ほどの勉強で一本ゲームが作れるくらい、理解しやすいソフトです。ネット上にも多くの人の記事やブログがあり、完全に詰まるということは少ないでしょう。みなさんもUnity 、はじめてみませんか？
Windowsのターミナル・ファイラー・エディタの連携

# 背景
開発をするときに必要な3種の神器(ターミナル・ファイラー・エディタ)についての考察はエンジニアなら誰でも行ったことがあると思う。
最近のエディタではそれだけでターミナルやファイラーの機能もあり、一つで完結するようになっているが、私はそうは思っていない。
ターミナルはターミナルに、ファイラーはファイラーに、エディタはエディタにそれぞれ特化した機能があり、一つにまとめてしまうとそれらが切り落とされることが多い。
そこでそれぞれに専用ソフトを使うのだが、それには各ソフトの連携が不可欠である。

# どのソフトを使うのか
ファイラー：エクスプローラ
エディタ：gVim
ターミナル：ConEmu & powershell

選定理由を書くと長くなるのでここでは考察しない

# どんな連携が必要か
1.ターミナルで開いているディレクトリをファイラーで開く
2.ターミナルで開いているディレクトリ内のファイルをエディタで開く
3.ファイラーで開いたフォルダをターミナルで開く(管理者権限でも開ける)
4.ファイラーで開いているフォルダ、もしくはその中のファイルをエディタで開く

上記4つの連携をスムーズにできることが開発をする上では必要条件となる

# ターミナルからの連携
ターミナルからの連携は難しくない。
ディレクトリをファイラーで開く場合は

```
ii .
```
ファイルをエディタで開く場合は

```
gvim [ファイル名]
```
これだけでOK。ただし、gvimにはPathを通す必要がある。
また、gvimを複数起動したくない場合は

```
gvim --remote [ファイル名]
```
とすれば、すでに開いているgVimで開いてくれる。
--remoteを毎回打つのがつらい人は$profileに

```powershell

function gvimr($arg){gvim --remote-silent $arg}
```
を追加すればgvimrコマンドで開くことができる。

# ファイラーからの連携
ファイラーからの連携は右クリックのコンテキストメニューを利用する。
コンテキストメニューはレジストリを追加することでカスタマイズできる。
※レジストリの変更は実行は自己責任でお願いします。

下記スクリプトをUTF8BOM付で保存し実行すればコンテキストメニューに追加される

```powershell

$vimpath = (get-command gvim).source
if($vimpath -eq $null){
  write-host "gvimにpathが通ってないよ?"
  return
}
$conemupath = (get-command conemu64).source
if($vimpath -eq $null){
  write-host "conemu64にpathが通ってないよ?"
  return
}

function SetRegistry($binpath,$regpath,$contextValue,$argString){
  $command = "`"" + $binpath + "`"" + $argString
  New-Item $regpath
  New-ItemProperty $regpath -name "(default)" -value $contextValue
  New-ItemProperty $regpath -name "Icon" -value $binpath
  $regpath = $regpath +"\command"
  New-Item $regpath
  New-ItemProperty $regpath -name "(default)" -value ("`"" + $binpath+ "`"" + $argString)
}

$binpath = $vimpath
$regpath = "Registry::HKEY_CLASSES_ROOT\Directory\Background\shell\gvim"
$contextValue = "gvimで開く"
$argString = " `"--remote-silent`" `"%v.`""
SetRegistry $binpath $regpath $contextValue $argString

$regpath = "Registry::HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\gvim"
$argString = " `"--remote-silent`" `"%v`""
SetRegistry $binpath $regpath $contextValue $argString

$binpath = $conemupath
$regpath = "Registry::HKEY_CLASSES_ROOT\Directory\Background\shell\ConEmu"
$contextValue = "ConEmuで開く"
$argString = " `"-single`" `"-dir`" `"%v.`""
SetRegistry $binpath $regpath $contextValue $argString

$regpath = "Registry::HKEY_CLASSES_ROOT\Directory\Background\shell\ConEmuRunas"
$contextValue = "管理者としてConEmuで開く"
$argString = " `"-cmd`" `"powershell.exe`" `"-noexit`" `"-command`" `"Set-Location`" `"-literalPath`" `"%v`" `"-new_console:a`""
SetRegistry $binpath $regpath $contextValue $argString
```
ファイルを右クリック→gvimで開く
フォルダ内の何もないところを右クリック→gvimで開く(gvim内でnetrwが開かれる)
フォルダ内の何もないところを右クリック→ConEmuを開く
フォルダ内の何もないところを右クリック→管理者としてConEmuを開く
上記4つが追加される。ただしgvim,ConEmuはPathを通す必要がある。

ちなみにレジストリを削除するときは下記スクリプトで行う

```powershell
remove-Item -Recurse "Registry::HKEY_CLASSES_ROOT\Directory\Background\shell\gvim"

remove-Item -Recurse "Registry::HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\gvim"

remove-Item -Recurse  "Registry::HKEY_CLASSES_ROOT\Directory\Background\shell\ConEmu"

remove-Item -Recurse "Registry::HKEY_CLASSES_ROOT\Directory\Background\shell\ConEmuRunas"

```
エンジニアからプロダクトマネージャーに職種変更した時に、読んでおきたい書籍5冊

# はじめに
　エンジニアから、IT特にサブスクリプション系のWebアプリケーションを担当するプロダクトマネージャーに職種が変わり、「何をするべきか？」と考える時に参考になる書籍を詳細します。

# 書籍紹介

-  [プロダクトマネジャーの教科書][1]
かなり幅広い業種のプロダクトマネジャーについて網羅的に記載されている。
[1]: https://www.amazon.co.jp/gp/product/4798111929

- [Inspired: 顧客の心を捉える製品の創り方][2]
IT系の製品開発マネジメントのバイブル
[2]: https://www.amazon.co.jp/gp/product/B00TCM8TB4

- [サブスクリプション――「顧客の成功」が収益を生む新時代のビジネスモデル][3]
サブスクリプションタイプのプロダクトマネジメント向け
[3]: https://www.amazon.co.jp/gp/product/4478105529

- [サブスクリプション・マーケティング――モノが売れない時代の顧客との関わり方][4]
少しマーケティングより
[4]: https://www.amazon.co.jp/gp/product/4862762557

- [カスタマーサクセス――サブスクリプション時代に求められる「顧客の成功」10の原則][5]
顧客の成功にフォーカス
[5]: https://www.amazon.co.jp/gp/product/4862762603

# おわりに
　書籍である程度基礎知識を知っておかないと何もできませんが、実務はまた別で、とにかくやってみるしかない、と覚悟を決める必要がありそうです。