OmniAICreator/Qiita-1.07M huggingface dataset:
UITableViewCellのstyle:value2の列幅を変更する方法

# はじめに

**UITableViewCell**の**style**に**value2**を指定すると、1行のセルの左側に**textLabel**(右寄せ)、右側に**detailTextLabel**(左寄せ)が配置され、この2つの列幅は自動調整されるらしいが、明らかに**textLabel**の列幅の方が狭い。
作成中のアプリで**textLabel**の文字が小さくなってしまう/文字が途中で切れるため、**textLabel**の列幅を少し広くしたいと色々調べた結果、**UITableViewCell**の**layoutSubviews**メソッドで変更できることが分かった。
備忘録として以下に概要をまとめる。

環境は以下の通り

- Xcode ： 10.1
- Swift ： 4.2.1
- iOS ： 11.1
- Simulator ： iPhone 8 - 12.1


# UITableViewCell.CellStyle.value2

**UITableViewCell**の**style**に**value2**を指定すると、次のスクショのように、(左側の青字)**textLabel**と(右側の黒字)**detailTextLabel**が配置される。Appleの公式資料による説明は[**こちら**](https://developer.apple.com/documentation/uikit/uitableviewcell/cellstyle/value2)。
（下のスクショでは、**textLabel**と**detailTextLabel**の文字サイズを、どちらもシステムフォントの16ポイントに設定している）

![スクリーンショット1](https://qiita-image-store.s3.amazonaws.com/0/283293/7676cbdf-881d-9d40-fd24-05d3a6dd0c66.png)


# 列幅の変更方法

上の例では、左側の**textLabel**の列幅を広くする必要性を感じないが、列幅を変更する場合は、**UITableViewCell**の**layoutSubviews()**を**override**して変更する。

```swift:textLabelの幅を40pixel広くする例
class UITableViewCellEx: UITableViewCell {
    override func layoutSubviews() {
        super.layoutSubviews()
    
        let plusWidth: CGFloat = 40.0
        
        let textLabelFrame = self.textLabel!.frame
        let textLabelWidth = textLabelFrame.size.width + plusWidth
        let textLabelSize = CGSize(width: textLabelWidth, height: textLabelFrame.size.height)
        self.textLabel!.frame = CGRect(origin: textLabelFrame.origin, size: textLabelSize)

        let detailTextLabelFrame = self.detailTextLabel!.frame
        let detailTextLabelX = detailTextLabelFrame.origin.x + plusWidth
        let detailTextLabelWidth = self.frame.size.width - detailTextLabelX
        let detailTextLabelOrigin = CGPoint(x: detailTextLabelX, y: detailTextLabelFrame.origin.y)
        let detailTextLabelSize = CGSize(width: detailTextLabelWidth, height: detailTextLabelFrame.size.height)
        self.detailTextLabel!.frame = CGRect(origin: detailTextLabelOrigin, size: detailTextLabelSize)
    }
}
```

上のコードのように、**textLabel**の**width**に**40**を加えた分、**detailTextLabel**の開始位置**x**にも**40**を加えて左にずらしている。また**detailTextLabel**の**width**から**40**を引く必要があるが、この**width**は実際にセットした文字列の表示長となっているため、**cell**自身の**width**から開始位置の**x**を引くことで、残り幅の全部としている。もしセルの右側にアクセサリを配置している場合は、その幅を考慮する必要がある。

結果、下のスクショのように全体が右に(40pixel)ずれたのが分かる。

![スクリーンショット2](https://qiita-image-store.s3.amazonaws.com/0/283293/6f73b10d-29ee-dea6-bc8e-45e090ab4a5e.png)


**NSSting.size(withAttributes:)**メソッドを使えば、もっときめ細かいサイズ調整ができると思われる。

##### 以上
can't find gem bundler (>= 0.a) with executable bundle 対応

##環境

```console
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
$ which bundler
/Users/sshuuu/.rbenv/shims/bundler
```

##試み
既存のRailsプロジェクトをcloneしてきて、
`bundle install --path vendor/bundle` をしたい。

##発生した問題

```console
$ bundle install --path vendor/bundle

Traceback (most recent call last):
	2: from /Users/sshuuu/.rbenv/versions/2.5.1/bin/bundle:23:in `<main>'
	1: from /Users/sshuuu/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/Users/sshuuu/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```

bundlerも`ruby 2.5.1` の環境でインストールされており、問題なさそうだがエラーが発生する。

##原因
Gemfile.lockに記載されている`BUNDLE_WITH(1.16.1)`のバージョンがインストールされているbundlerのバージョン(2.0.1)と異なっていることが原因だった。

##解決策
`ruby 2.5.1`環境の下、

```console
$ gem install bundler -v 1.16.1
$ gem uninstall bundler -v 2.0.1
```
ブラウザで何分後に通知するサイトを作ったときに使ったライブラリや環境

たまにブラウザで何分後に通知してほしいなとか思ってたのですが、見つからなかったので作りました。
(~~よく探してないので普通にありそう~~)
URLは以下です。
https://browser-alert.netlify.com/

この記事では使ったライブラリや環境の紹介です。

## 本番環境
**Netlify**
https://www.netlify.com/
静的サイトをめちゃめちゃ簡単にデプロイできます。
GitHubとの連携やデプロイ時にビルドする設定などができます。
簡単な個人サイトレベルなら無料で使えるのがスゴイ
サイトのURLも好きな文字列に変えることが可能です。やり方は以下に載せてあります。
https://malicia.hatenablog.com/entry/2018/12/19/010626

## 開発環境
**docker & docker-compose**
使ってみたかったdocker
nodeとnginxを組み合わせて使えばwebpack-dev-serverを使わずにローカルサーバー立てながら開発できるという楽さ。

## フロントエンド
**webpack & babel**
babelでes6のjavascriptを古代のブラウザ用に翻訳し、webpackでファイルを1つにまとめるという現代フロントエンドの必須技術です。
htmlとfaviconもwebpackで一緒にまとめたいときなどは以下を参考にしてください。
https://malicia.hatenablog.com/entry/2018/12/23/004206

**bulma**
https://bulma.io/
最近よく聞くcssフレームワークです。
bootstrapなどと比較してcssファイル1つのみで全て完結する簡素さが売りです。
webpackと併用する場合は以下を参考にしてください。
https://malicia.hatenablog.com/entry/2018/11/27/224554

**IndexedDB**
今回は静的サイトだったので、ブラウザ側にアラートの時間などのデータを残す必要がありました。
Cookieやlocalstorageを使う場合が多いと思いますが、通常のRDBと同じ様な使い方ができるというIndexedDBを使ってみました。

## 総括
Netlifyはスゴイ
業務中よく使うGitコマンド

# 1. git branch
- 今どこのブランチにいるのか確かめる時に使う

# 2. git checkout ブランチ名
- ブランチを切り替える時に使う

# 3. git checkout master && git pull origin master && git checkout -b 新規ブランチ名
- ソースコードが最新の状態で、新規ブランチを作成したいときに使う
- 長いのでエイリアスを作成している

```terminal:~/.gitconfig
[alias]
	mkb = !git co master && git pull origin master && git co -b 
```

例）　以下で最新のソースコードから新規ブランチを生やすことができるので楽

```
$ git mkb new_branch
```

# 4. git add ファイル名
- 変更のあるファイルをインデックス（git管理下）に全て追加
- ほとんどオプションは`-A`しか使わない
    - `-A`はAllという意味

# 5. git commit -m 'コミットメッセージ'
- `git add`でインデックスに追加したファイルの変更を確定させる
- オプションで`-m`を使用すれば複数のコミットメッセージを追加できる

例）

```
$ git commit -m '案件名' -m 'やったこと'
```

# 6. git push origin リモートブランチ
- コミットしたファイルをリモートリポジトリの対象ブランチにmergeする

# 7. git fetch
- リモートリポジトリに存在するブランチをローカルリポジトリに`fetch`（日本語で「取ってくる」という意味）する
- 仕事仲間が開発したソースコードを自分のローカルで確認したいときに使う

# 8. git pull origin リモートブランチ
- リモートリポジトリのブランチを、ローカルに`fetch`して`merge`する
- 要はローカルのブランチをリモートブランチの状態にする時に使う
- 基本的にorigin/masterブランチにしか使用しない

# 9. git rebase ブランチ名
- 対象ブランチの上に、現在いるブランチのコミットを追加する
- ほとんど`git rebase master`しか使わない
    - ローカルのmasterブランチは最新の状態になっている前提

# 10. git rebase -i HEAD~n
- コミットをまとめたい時に使う
- `n`は、`git log`にてまとめたいコミットの個数を数えて代入

# 11. git cherry-pick コミット番号
- 他ブランチのコミットを今いるブランチに追加する
- がっつり開発したのに全然違うブランチで作業していたことに気づいてヒヤヒヤした時に使う

# 12. git status
- ワーキング・ツリーの状態を確認する
- どのファイルを変更してたのかを確認する時に使用する
- 今いるブランチも確認できるが、見にくいし確認のタイミングも同時である必要が個人的にないので、今いるブランチ確認は`git branch`でやっている

# 13. git log
- ブランチのコミット履歴を閲覧できる
- `cherry-pick`する時にコミット番号を確認するために使用している

# 14. git blame ファイル名
- ファイルの行単位でコミット内容を確認できる
- 犯人探しの時に使う
- 今はVScodeのプラグインでhoverしたら「コミッター＋コミットメッセージ＋コミット日時」を表示してくれるので、コマンドとして叩くことはない

# まとめ
新年になったので、業務中によく使用しているgitコマンドを出してみました。
`git reset`は初心者の時はよく使っていましたが、ある程度慣れてきたら出会わなくなった。
認識が間違っている or これ使わないの？的なものがあったら是非コメントにてお願いいたします。
Swift .isEmptyを使うと・・・。

インターンで教えて頂いたこと。
確かに.isEmptyを使った方がぱっと見わかりやすいし、見やすい。
わざわざ「空でない時」と否定を最初に持ってくるよりも「空の時」という風に肯定を最初に持ってくる方法が思いつかず、このようにしたのですが、その方法を教えてもらった時、うわー「.isEmpty」があったー！ってなりました。悔しい。

自分が書いたコード

```swift
if a != "" && b != "" && c != "" {
    "\(a),\(b),\(c)"
} else {
  return ""
}
```

下のほうがわかりやすい

```swift
if a.isEmpty && b.isEmpty && c.isEmpty {
    return ""
}
return "\(a),\(b),\(c)"
```

インターン先で「リーダルコード ~より良いコードを書くためのシンプルで実践的なテクニック~」という本を貸していただきました。数ページでもう面白い。
頑張っていきます!!!でもとりあえず期末テストの勉強!!!
javascriptライブラリをWebJarsで公開する

## WebJarsとは

javascript、css等のクライアントサイドのライブラリ、フレームワークをjar形式でMaven, Gradle等のツールで管理できるようにした仕組み。

使い方は以下が詳しいです。

[WebJars 使い方メモ](https://qiita.com/opengl-8080/items/c8c5f787613c230a9827)

## WebJarsでjavascriptライブラリを公開する

個人、もしくは所属組織でjavascriptライブラリを開発・公開している場合、より多くの人に利用してもらうためにWebJarsでライブラリを公開したいと考える場合もあると思います。その為の手順を以下に記載します。

参考サイトに記載の内容を日本語訳しました。一部抜粋しています。

1. webjars.org WebサイトにWebJarを掲載するには、新しいWebJar用のMavenビルドを含むGitHubリポジトリを作成します。
2. 次に、GitHubで新しいWebJarに関するIssueをオープンし、作成したGitHubリポジトリを指定します。
3. 作成したGitHubリポジトリは、webjarsのリポジトリでforkされ、テストされた後にMaven Centralにリリースされます。

以下のURLでいくつか現在進行中のIssueがあるので、それを見て依頼すればよいと思います。

https://github.com/webjars/webjars/issues

## 参考サイト

- [WebJars -Contributing](https://www.webjars.org/contributing)
どこまでショボいアプリがAppleの審査に通るのか試してみた

## 背景

2018年末、出張帰りの飛行機で急に思いつく。

「そうだ、二つ名を表示するアプリって楽しくないかな？」

「でも、機能が少ないアプリはApple審査通らないしな・・・」

「まあ試してみよう」

# 作ってみた

という事で、Xamarinでサクッと実装。

「AAAなBBB」と言った感じの二つ名を出すために、AAA用のリストとBBB用のリストを作って、

ランダムで表示するようにする。文字列は思いつく限りで書き出す。

・・・よし、組み合わせで2500通り以上にはなったので、まあいいかな。

<img width="240" alt="IMG_0607.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/201603/e7068df4-6649-70d5-754d-68e1f9e83c89.png">

うん、シンプル好きな自分にとっては、まあ良い気がする。

メインの機能実装よりも、SNS系の連携調べて実装したり、Firebase(Analytics, Admob)周りが初挑戦で時間がかかった。

Admob入れたのは、よくゲームとかにある全面広告をやってみたかったので。

＃やった結果、友人に不評だったので見せ方を修正する予定・・・

# 審査出してみる

アイコンは知り合いにお願いして１日で作ってもらい、アプリの説明も適当に書く。

審査待ってる間に、アプリ説明用の[４コマ漫画](http://megyo.jp/software/chu2name/index.html)も書いてみてアプリから遷移できるようにしておく。

さて結果は・・・

### Reject！

![IMG_0579.jpg](https://qiita-image-store.s3.amazonaws.com/0/201603/dad4b622-8f9f-b30f-b035-7e5455ee46fb.jpeg)

意訳すると「明確な指標はないけど、こんな機能少なすぎるアプリはAppleは許しません」という感じ。

ムムム・・・どうするか。

# 作ってみた２

じゃあ必殺技も表示してみよう。そして履歴も表示できるようにしてみる。

作りは二つ名と同じ感じ。必殺技はちょっと無理のある仕上がり・・・？

<img width="240" alt="IMG_0630.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/201603/9ef43e88-53a8-29d8-5f58-940b637e470a.png">
<img width="240" alt="IMG_0631.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/201603/7d042074-1228-731d-6306-08537d53a5ae.png">

ここで気づく。

このアプリは「二つ名メーカー」という名前で作っていた・・・が、もはや二つ名メーカーではなくなってしまった。

どうしよう・・・もうなんでもいいから厨二病っぽくしよう。

Google翻訳で入力、「永遠の輝き」　→　「Eternal Glow」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201603/4fe38f28-dee9-e02c-cb70-d122e677b571.png)

よし、採用。アプリ名は「Eternal Glow」に変更。

Appleのアプリ説明も適当に修正して再度申請。

<img width="320" src="https://qiita-image-store.s3.amazonaws.com/0/201603/b1239543-b5db-7e0d-4b11-cfbf2338074c.png">

ヤベェ、イカした説明文できたわ。


# 審査出してみる２

### 通った！

自分でもびっくり。

# 結論

以下のアプリはNG

・二つ名をランダムで1個表示する

以下のアプリはOK

・二つ名か必殺技をランダムで1個表示する
・表示した履歴が見れる（選択も出来る）

リリースしたアプリは以下。
４回実行すると広告出るので嫌な人は、３回実行した後にアプリ終了してください。

iOS版：https://itunes.apple.com/jp/app/eternal-glow/id1448009669?l=ja&ls=1&mt=8
Android版：https://play.google.com/store/apps/details?id=jp.megyo.chu2name&hl=ja

# おまけ

何も考えずに作りだしたので、Xamarinのプロジェクト名を日本語にしちゃいました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201603/c0aa5118-d64b-3ae3-b7b0-a88a1d414987.png)

しかも、プロジェクト名は「二つ名」じゃなくて「通り名」・・・

このままでiOSのアプリを発行すると、「通り名メーカー.ipa」というファイルになるのですが、これをApplication Loaderでアップしようとするとエラーになりました。
ipaのファイル名だけ英数字に変えれば通りました。

# 追記 2019.01.07

調子に乗って「ラッキーカラー」「ラッキースポット」もランダムで表示できるようにしました
Android版はリリース済み、iOS版は審査中です
もうこれでショボくないアプリですね

<img src="https://qiita-image-store.s3.amazonaws.com/0/201603/0a21fb07-d429-6a2c-fa5d-e44855a969b4.png" width="240">
<img src="https://qiita-image-store.s3.amazonaws.com/0/201603/473bcac5-7863-1965-63eb-23dae0b6823d.png" width="240">

# 追記 2019.01.11

もう少しだけ続編です
[続：どこまでショボいアプリがAppleの審査に通るのか試してみた](https://qiita.com/megumu-u/items/29c28ed9b2b3830769f7)

# 追記 2019.04.15

物語は終局へ・・・
[終：どこまでショボいアプリがAppleの審査に通るのか試してみた](https://qiita.com/megumu-u/items/576e0967bc357314df1b)
Microsoft Flow の式の記述で「式が無効です。」と出る場合

Microsoft Flowで式を作成・編集する際に更新ボタンを押すと「式が無効です。」とダイアログが出て更新ができない場合があります。
![スクリーンショット 2019-01-05 22.08.39.jpg](https://qiita-image-store.s3.amazonaws.com/0/258416/164e5a5d-ce9f-8bd5-ba19-5d31b8b18d0a.jpeg)
上記の場合は、式中で文字列を囲むクォートにダブルクォート(")を使っているため、式の更新ができなくなっています。

```
エラーとなる例
replace(triggerBody()['date'],"-","")
```

シングルクォート(')を使いましょう。

```
正しい例
replace(triggerBody()['date'],'-','')
```
django.db.utils.OperationalError: no such table: blog_postでつまる

django，herokuで，デプロイする際，
以下のエラー
django.db.utils.OperationalError: no such table: blog_post

#解消法

```:.gitignore
myvenv
__pycache__
staticfiles
local_settings.py
db.sqlite3
*.py[co]
```

を



```:.gitignore
myvenv
__pycache__
staticfiles
local_settings.py
*.py[co]
```

に変更した結果，解決．

#他に試したこと

```
heroku run python manage.py makemigrations
heroku run python manage.py migrate
heroku run python manage.py createsuperuser
```


heroku run python manage.py createsuperuserあたりで，heroku上のデータベースにテーブルが存在していないことに気づく．
すると，　.gitignore内，　db.sqlite3が記述されていました．．．

他のサイトでも，　.gitignoreを疑うべきとのコメントも見かけました．
（https://stackoverflow.com/questions/3631556/django-no-such-table-django-session/3631620）
もしかしたら，.gitignoreを見直してみると糸口が見つかるかもしれないです！
ElixirからFirestoreに接続するのに失敗した話

## まず結論から
ElixirからFirestoreに簡単に繋ぐ事の出来るライブラリは2019年1月現在存在していません。
Firestoreへの接続はGoogleが公式にサポートしている言語を使用する方が良さそうです。

* Go言語
* Java（JVM言語も「一応」可能）
* PHP
* Ruby
* Python
* Node.js
* C#

など

## 接続を試してみて

REST APIに関してはライブラリが存在していますが、存在しているだけで特にサポートなどはなく、readmeにもリファレンスにも特に使用方法などの記載はありません。そのため、GCPのAPIに関してある程度知識がなければ接続は困難です。
gRPC APIに関しては公式には存在しておらず、詳細な接続方法のリファレンスなども存在していないので、1から接続出来るところまでもっていくのがまず厳しいですし、接続時のエラーに関してもほぼコード（404か503）のみしか戻ってこないため、接続のどこに問題があってエラーとなっているかを確認する事が出来ません。
よって、「資料が手元にないけどとりあえず繋いでみてエラーが出たらそれを元に考える」というようなスタイルでの開発は非常に困難であると結論づけざるをえません


## ElixirからGCPに接続するために使用出来るライブラリ

[Goth](https://hex.pm/packages/goth)
GCPのOAuth2トークンを取得するライブラリ。

[google_api_firestore](https://hex.pm/packages/google_api_firestore)
FirestoreのREST APIライブラリ。Google製。

[grpc](https://hex.pm/packages/grpc)
ElixirのgRPCライブラリ。接続部分の提供のみであり、.protoファイルからpb.exファイルを作成することは出来ない。（同作者の別ライブラリが存在する）→[protobuf](https://hex.pm/packages/protobuf)

[googleapis](https://github.com/googleapis/googleapis)
Googleが提供するAPI群の.protoファイル集

## Firestore APIの資料

[REST API](https://firebase.google.com/docs/firestore/use-rest-api?hl=ja)
[RPC API](https://firebase.google.com/docs/firestore/reference/rpc/?hl=ja)

## 今回得られた知見（小ネタ）
### gRPCの接続先をHTTPSにしたい場合

```elixir
GRPC.Credential.new(ssl: [cacertfile: "your/cert.file"])
GRPC.Stub.connect("firestore.googleapis.com:443", cred: cred)
```

接続時に上記のようにしてcertファイルを渡すことでHTTPS接続が可能になる

### 通信時にトークンなどのメタデータを渡したい場合

```elixir
{:ok, token} = Goth.Token.for_scope("https://www.googleapis.com/auth/datastore")
metadata = %{"Authorization" => "Bearer #{token.token}"}
Google.Firestore.V1beta1.Firestore.Stub.create_document(channel, rec, metadata: metadata)
```

のように、Stubのオプションとしてメタデータを渡す


余談： Googleさん、これどこかで目に入ったら詳細な資料もらえませんか……？
複数Railsアプリから単一PostgreSQLへアクセスする場合PreparedStatementに注意する

# 問題点

複数のRailsアプリケーションから単一DBにアクセスする場合、以下の動作を行います。

* ActiveRecordはデータベース接続ごとにPreparedStatementを作成します。
* PostgreSQLはPreparedStatementをセッション毎にメモリに保持します。

その為、アプリケーションサーバの台数が増えたり、アプリケーションからのセッション数を増やしたりすると、DBのメモリを大幅に使用してしまいます。

# 対策

* 保持するPreparedStatementの数を制限する。(デフォルトは1000件)

```yaml:database.yml
defaults: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  # キャッシュする上限を設定
  statement_limit: 100
```

* PreparedStatementの使用を無効にする。

```yaml:database.yml
defaults: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  # 無効にする場合
  prepared_statements: false
```

# 参考

## Rails Guide
https://railsguides.jp/configuring.html#postgresql%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B

## PreparedStatementとは？
一言で言うと、DBが持っているクエリキャッシュ機能です。
https://www.postgresql.jp/document/pg820doc/html/sql-prepare.html
Macのログインシェルをデフォルトのbashからzshに変更する方法

## お詫び

本エントリーのもともとのタイトルは
「Macのログインシェルを__最速で__デフォルトのbashからzshに変更する方法」でした。
コメントにて別で最速でログインシェルをzshに変える方法を教えていただきましたので、こちらのエントリーでは管理のしやすさとコマンド操作に慣れることを主眼としました。
失礼いたしましたm(_ _)m

## Xcodeのインストール（飛ばしてもOK）

ここはCUIベースでインストールする

```sh
xcodebuild -version # バージョンが表示されればインストール済みという意味
```

## Command Line Toolsのインストール

```sh
xcode-select --install # インストールする 
```

※Xcodeは数GBあり、PCのディスク容量やネットワーク負荷等でインストールしたくないという方は以下を参照してください。
> https://qiita.com/iwaseasahi/items/eb820762600c815ab100

## homebrewのインストール

[公式サイト](https://brew.sh/) に記載されている以下のコマンドを実行する

```bash
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## zshのインストール

```bash
brew info zsh # インストール済みのzshのバージョンを確認する
```

## パスを通す

`/private/etc/shells`（もしくは`/etc/shells`）に以下を追記する

```bash
/usr/local/bin/zsh
```

## bashからzshへの変更（切り替え）

```bash
chsh -s /usr/local/bin/zsh # /bin/zshはデフォルトでインストールされていたzshのパスだと思われる
```

## ターミナルを再起動

```
exec $SHELL -l
```

> https://qiita.com/yusabana/items/c4de582c6f85a42817d8

## おまけ

### プラグインマネージャを使う

zshのメリットを享受するためにプラグインを入れたい
その管理ツールとして`zplug`をインストールする

```zsh
brew install zplug
```


> https://qiita.com/b4b4r07/items/f37aadef0b3f740e8c14

### 補完機能を強化する

上記のプラグインに`zsh-completions`なるものがある
プラグインマネージャでなくても個別でインストールできる

> https://github.com/zsh-users/zsh-completions/tree/master/src

### ~/.zshrcのカスタマイズ

#### 今までのbashの設定ファイルを再利用する

```zsh
cat ~/.bash_profile >> ~/.zshrc
```
もしくは

```zsh
cat ~/.bashrc >> ~/.zshrc
```

> https://qiita.com/magicant/items/d3bb7ea1192e63fba850

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

### RubyMineでTerminalが立ち上がらなくなった

以下で対応した
Preference -> Tools -> Terminal -> Shell Path を `/usr/local/bin/zsh` に変更

> https://www.jetbrains.com/help/ruby/settings-tools-terminal.html

### chsh -s /usr/local/bin/zshでエラー

```bash
chsh: /usr/local/bin/zsh: non-standard shell
```

パスを通せばOK

## 備忘録

どうせすぐに使うからgitもいれた

> https://qiita.com/yrhorita/items/6b787a51f74d25fde56e
ゲーム開発日記（１）

#2018/1/5

 新年と言うこともあり、新しい挑戦としてゲームを作ることにした。
最終目標としては、以下のことをする


* ３Dのオープンワールドを作る
*  ゲームサーバーを作る

まあ、最終目標だからすぐにやろうとは思っていない。
そして、以下のようなルールを決めた。

### ゲーム作りのルール

1. 常に楽しむ
2. 辛いことはしない
3. がんばらない

ふざけたルールかもしれないが、続けるのにはこれが一番いいと思う。
では、今日のやったまとめに入ろう


##やったこと

* rubyのgemの開発環境を整えた
* 簡単なコマンドを作った

##気づいたこと

* いざ、情報を整理しながらやろうとすると結構大変。
* 環境作りには一日かかることがわかった。

##改善点

* 一日目だったので、とりあえずやってみた感じがあるから明日もこの調子でやってみる。
* rubyでやっているので、楽しくできるように心がける。

#今日の一言

　掃除で腕を痛めた。
CentOS : Perl + CGI で、MySQLアクセス拒否

# 再現
動作確認のPerl：
参考例：https://metacpan.org/pod/DBD::mysql

```
use DBI;
 
my $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
my $dbh = DBI->connect($dsn, $user, $password);
 
my $sth = $dbh->prepare(
    'SELECT id, first_name, last_name FROM authors WHERE last_name = ?')
    or die "prepare statement failed: $dbh->errstr()";
$sth->execute('Eggers') or die "execution failed: $dbh->errstr()";
print $sth->rows . " rows found.\n";
while (my $ref = $sth->fetchrow_hashref()) {
    print "Found a row: id = $ref->{'id'}, fn = $ref->{'first_name'}\n";
}
$sth->finish;
```

エラーMessage

```
install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 4) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
or perhaps the capitalisation of 'mysql' isn't right.
Available drivers: DBM, ExampleP, File, Gofer, Proxy, Sponge.
 at ./test_zzeng.pl line 8.
```

#対策

```
sudo yum install perl-DBD-mysql
```
pyenvでpython環境を作る

```
$ brew install pyenv
$ brew install pyenv-virtualenv 

# edit ~/.bash_profile

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

$ pyenv install 3.7.0
$ pyenv virtualenv 3.7.0 <name>

#　仮想環境一覧
$ pyenv versions

# デフォルト仮想環境の指定
$ pyenv global <name>

# 現在ディレクトリに適応する仮想環境の指定
$ pyenv local <name>

# 現在ディレクトリに適応する仮想環境の確認
$ pyenv version

```
AWS CLI環境設定

- AWS CLIのインストールする
    - https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html#awscli-install-osx-path

- configファイル

```
cat ~/.aws/config
[default]
region = ap-northeast-1
output = json

cat ~/.aws/credentials
[default]
aws_access_key_id = <aws_access_key_id>
aws_secret_access_key = <aws_secret_access_key>
```
ksnctf 13 Proverb 70pt

#問題

https://ksnctf.sweetduet.info/problem/13

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/59fd72d2-f8ec-066d-7fc0-036b9aa1c146.png)

#解いてみた

Tera Term使ってアクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/81c57ee1-d405-dbba-21a7-28ddc953e6f5.png)


flag.txt見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d2950db1-2bc6-aec8-4329-d7e565ab22af.png)

さすがに無理です。
ほかのファイルを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ccb13c57-446b-e4e4-670b-01fd3739b93f.png)

前の問題と一緒です。

```
インターネットに接続してホームディレクトリを作成することは許可されていません。
一時ディレクトリが必要な場合は、/ tmpを使用してください。
時々この機械はリセットされます。
```

とのこと。
もう一つのテキストも見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f3c452d5-341e-83f1-d68d-246994fc268a.png)

なんでしょう。
Google翻訳に入れてみましたが、よくわかりませんでした。
Google検索してみたら、[TIGER & BUNNY](https://ja.wikipedia.org/wiki/TIGER_%26_BUNNY)っていうアニメのタイトルでしょうか。
あってそうですけど、何を意味しているのか分かりません。

実行ファイルを実行してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c916ee0d-518d-8a97-bd01-d7a4fa2e9fdb.png)

proverb.txtに書かれている内容がランダムで出てきてる感じでしょうか。
つまり、flag.txtをどうにかしてファイル名をproverb.txtに変えてproverbを実行したらflagが表示されるということでしょうか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ed28a275-0c02-f571-9001-2ceaeeee543c.png)

とりあえずどっちもmoveできそうにありません。
Readmeに書いてあった/tmpならできるかも？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2fcf3e37-4e0d-2cd0-a73e-f90e4b8bd0ad.png)

どっちもコピーできませんでしたが、エラーの文言が違うことに気づく。
proverb.txtはすでにコピー先にあるよというエラーっぽい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ae5d11c6-a680-99fe-8f43-aa41e16ad0d8.png)

ファイルの一覧は表示できないものの、proverb.txtの中身は見れました。
Please make your own subdirectory.（サブディレクトリを作ってください）とのこと。
いわれた通りサブディレクトリを作ってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/06c2e898-c9f1-0db4-9cf2-33deafd1b8fe.png)

作りました。
それで何をやればいいんでしょう。

いろいろやってみたところ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6bc41201-8392-fabf-23f3-df41c687c18a.png)

proverbを実行したところエラーになりました。
proverbと同じディレクトリに置かれているproverb.txtの中身を表示するのではなくユーザがいるディレクトリに置かれているproverb.txtを見ているようです。
だとすると/tmpに移動してproverbを実行すると「Please make your own subdirectory.」が表示されるのでしょうか。やってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/656439a8-2d28-6d1d-8a51-a18348957a0b.png)

出ました。
flag.txtを/tmp/ctfman/にコピーして自分もそこに移動してproverbを実行すればよさそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/84b1d6b5-0c7b-ef29-c210-4373f748a4b8.png)

とはいってもコピーできないんですよね。
シンボリックリンクできますかね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ea252af8-887c-4243-e1ae-ceb91a375f54.png)

できた！
そしてproverbを実行。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b37d96e2-cc77-e9df-639e-b67bbfb0c08c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ce20e0d3-06a3-20c8-d392-fa405ce4c2fd.png)
SSHでGithub Enterpriseに接続する

```
ssh-keygen -f ~/.ssh/<keyname>
# <keyname>.pubの中身をGithub（or repository）に登録する

# configファイル
echo '
Host <host name>
    User git
    Port 22
    HostName github.com
    IdentityFile ~/.ssh/<keyname>
    TCPKeepAlive yes
    IdentitiesOnly yes
    ' >> ~/.ssh/config

#　ログインなしでcloneする
git clone git@<host name>:<repository owner>/<repository name>.git
```
Laravel 5.7 で php artisan cache:clear を叩くと Failed to clear cache. Make sure you have the appropriate permissions. になる。。

# 解決策はこれ！

```
$ mkdir -p storage/framework/cache/data
```

# 参考
[https://github.com/laravel/framework/issues/25451](https://github.com/laravel/framework/issues/25451)
括弧閉じ閉じ

(このスクリプトに関する新しい記事があります https://qiita.com/astrorobot110/items/4ea8b865ca68f55ec25c)

[正月に勢いだけで作ったscript](https://qiita.com/astrorobot110/items/50eb2b8666bdf706789a)のエントリを勢いで投稿してるんだけど、実はその他に年末にも作ってたのがあって、結構いい感じだったんでなんとなく投げておきます。歳の話はするな。

## ソース

(2019/1/11 修正)

``` vimscript:closer.vim
function! closer#main() abort
	let pos = getcurpos()
	let bracketList = split(&matchpairs, '[:,]')
	let bracket = ''
	while search('['.escape(join(bracketList,''), '\.*^$]~/').']','bW')
		let bracketIdx = match(bracketList, matchstr(getline('.'), '.', col('.')-1))
		if bracketIdx % 2 == 1
			norm %
		else
			let bracket = bracketList[bracketIdx+1]
			unlet bracketIdx
			break
		endif
	endwhile
	call setpos('.', pos)
	return bracket
endfunction

command! Closer echo closer#main()
```

## 何これ

バッファ内を遡りながら`matchpairs`に登録してあるもので、直近のまだ閉じてない（と思われる）括弧を見つけて閉じます。

## 括弧閉じるのにバッファ検索するスクリプト奴ー

僕のvimの使い方の問題なんですが、基本的にスクリプトキディの域を出ないのでむしろmarkdown筆頭に文章打ちとして使うことのほうが多いんです…で、全角括弧を閉じるのって必ず変換が伴うめんどくさい手順なので出来るだけラク出来ないものか、ということです。幸い`matchpairs`はマルチバイトの文字も問題なく食べてくれるので思想信条が許す限り[^1]は突っ込んでおきました。

[^1]: とりあえずsjisのマルチバイトの括弧だけあれば…

丁度インサートモード中の`<C-b>`は空いているのでここが適役だと思うんですけどね。
Railsの一連の流れをMVC,ルーティングの観点からまとめてみた

#はじめに
簡単に説明すると、自分が指定したページ（URL）はブラウザに表示されるまでに、**ルーティング→コントローラー（C）→モデル（M）→ビュー（V）**という順で処理が行われている。モデルは必要な時にだけ処理がされるため、必要でない時はとばす。※MVCは上記の頭文字


##MVC（Model・View・Controller）とルーティング
Ruby on RailsはMVCアーキテクチャ※に基づいて3つの部分で構成されている。
※アーキテクチャ＝基本設計や設計思想

###M：Model
**データベースを操作する仕組み**
Controllerからデータの追加や変更・削除の指示を受け実行する。
データベースのテーブルごとにModelが用意されている。
データベースのテーブルはモデルクラスとモデルクラスから生成されたインスタンスによって作られている。

###V：View
**ユーザ-に見せるインターフェイスのデザイン（ページの見た目）**
app/views （アプリケーションのメインフォルダのビューフォルダに置かれる）
Viewは通常複数用意されていて、それぞれHTMLのような形になっている。そこにはRubyのコードが埋め込んであり、要求されたアクションに応じて該当のHTMLにControllerがModelから受け取ったデータを反映し、HTMLを生成する。

###C：Controller
**ユーザーリクエストをModelやViewと連携させる仕組み**
app/controllers （アプリケーションのメインフォルダのコントローラフォルダに置かれる）
ユーザーからのリクエストを受けModelから必要な情報を受け取り、Viewによって生成されたHTMLを画面に反映させる。
ModelとViewに指示を出す司令塔のような役割。
Viewと同じく複数用意されていて、さらに1つのControllerの中に複数のアクションが用意されている。

コントローラーの中のメソッドを「アクション」と呼ぶ。
ユーザーからのリクエストに対して具体的な処理を実行するためのメソッド。

###ルーティング
**URLとアプリケーションを結びつける仕組み**
config/routes.rb （コンフィグフォルダのルーツファイルに置かれる）
ユーザーがブラウザを経由してアクセスしたURLとコントローラーのアクションを結びつける（＝処理を割り振っている）役割。

```ruby:【例】routes.rb
get "home/top" => "home#top"
    #"URL" => "コントローラー#アクション"
```


###MVCとルーティングの関係を図にしたもの

これまでの情報をまとめた図

<img width="512" alt="20171002113638.png" src="https://qiita-image-store.s3.amazonaws.com/0/285114/e2d5b514-4147-b5b5-4285-65584605f693.png">


##まとめ
初めてRailsを触った時、ファイルを管理する数が多く頭が混乱してしまいました。今後の勉強では上記のMVCとルーティングを意識して書いていくことで、理解を深めていきます。
Vim on Fish on WSL: 矢印キー有効化

 WSL上でFishを使ったときにvim上で矢印キーが効かなくなったので、解決した際のメモ

## WSL上でFishを使うための設定

[こちらの記事](https://qiita.com/ysks/items/6c9d751d9a3b3b1b8020)を参照のこと。

## Vimで矢印キーを使えるようにする

上記の記事に従って、Fish用のCmderタスクを登録する際に

```
%windir%¥system32¥bash.exe ~ -new_console:t:"Fish" -cur_console:p -c fish
```

の代わりに

```
%windir%¥system32¥bash.exe ~ -new_console:t:"Fish" -cur_console:p5 -c fish
```

とする。

---
参考：
https://github.com/cmderdev/cmder/issues/1832
MacでPHPの環境パスを通すのにハマった話

最近Macデビューをして、いろいろ開発環境を構築していたのですが、外部からインストールしたPHPの環境パスがどうしても通らなくてハマったので、その時の備忘録
## PHPの環境パスを.bash_profileに設定
調べながら見様見真似でやってみる

ターミナルで、

```sh
$ vi ~/.bash_profile
```
を実行して、

```sh:bash_profile
export PATH=$PATH:/usr/local/opt/php@7.2/bin
```
のように記載し、

```sh
$ source ~/.bash_profile
```
で設定を再読み込み

## 設定の確認
```sh
$ which php
```
でPHPの環境パスが反映されているか確認

```sh
/usr/bin/php # 出力結果
```
反映されていない...

## 原因
ここで大分ハマりましたが、どうやら設定した環境パスよりも先に
`/usr/bin`のパスが読み込まれている模様

```sh
$ echo $PATH
# 出力結果
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:
/usr/local/opt/php@7.2/bin
```

## 解決策
```sh:bash_profile
export PATH=$PATH:/usr/local/opt/php@7.2/bin
```
のように$PATHの後に追加したいパスを記述するのではなく、

```sh:.bash_profile
export PATH=/usr/local/opt/php@7.2/bin:$PATH
```
のように$PATHの前に追加したいパスを記述することで、
`/usr/bin`よりも先に読み込まれる。

## 結果
```sh
$ which php
```
でPHPの環境パスが反映されているか再確認

```sh
/usr/local/opt/php@7.2/bin/php # 出力結果
```

これで解決しました。
Ubuntu 16.04（WSL環境）にsqlite3.26をソースコードからインストールする手順

#はじめに
SQLite3最新版をUbuntu 16.04にインストールする方法です。UbuntuはWindwos Subsystem for Linux環境です。最近サポートされたウィンドウ関数を試すには、色々パッケージを探してくるよりも、ソースコードからインストールしたほうが早そう。

#インストール手順
## Step 1. SQLite公式ウェブサイトからソースコードを入手する。
以下のURLでダウンロードページに行けます。
https://www.sqlite.org/download.html
ここから、sqlite-autoconfの最新版をダウンロードします。ダウンロード先（ローカルPCのディレクトリ）はどこでも良いです。執筆時は、3.26.0が最新であり、例えばホームディレクトリにて、以下のコマンでダウンロードします。続いて、解凍します。

```shell-session:
~$ wget https://www.sqlite.org/2018/sqlite-autoconf-3260000.tar.gz
~$ tar xvzf sqlite-autoconf-3260000.tar.gz
```

## Step 2. 足りないライブラリをインストールする。
開発環境が入っていなければ、以下のコマンドでインストールします[^1]。それなりに時間がかかります。

```shell-session
~$ sudo apt-get install build-essential
```

コンパイルに必要なライブラリをインストールします。私の環境で不足していたのは以下の3種類でした。
1. zlib
2. edit
対応するパッケージをインストールする。

```shell-session
~$ sudo apt-get install zlib1g-dev libedit-dev
```

## Step 3. configureでMakefileを作成する。
インストール先は、/opt/sqlite/sqlite3.26.0/としました。すでに、標準パッケーとじとしてsqlite3がインストールされており、これを壊さないためです。以下のコマンドでMakefileを作成します。なお、環境ローカルのソフトウェアをインストールする先としては、/opt以下にするのが現在のお作法のようです[^2]。

```shell-session
~$ cd sqlite-autoconf-3260000
~/sqlite-autoconf-3260000$ ./configure --prefix=/opt/sqlite/sqlite3.26.0/
```

また、configureの実行結果を見ると、足りないライブラリが分かります。例えば、私の環境では当初、以下のようなメッセージが出ていました。そのため、Step 2にさかのぼって、ライブラリをインストールしました。Step 2とStep 3を繰り返して納得のいくMakefile（configure結果）にします。

```shell-session
checking editline/readline.h usability... no
checking zlib.h usability... no
```

## Step 4. Make & Make install
ここまでくれば、あとは実行ファイルを作って、インストールするだけです。なお、Makeの引数に```-j```をつければ、並列にコンパイラが走ります。

```shell-session
~/sqlite-autoconf-3260000$ make -j
~/sqlite-autoconf-3260000$ sudo make install
```

なお、インストール先は、Step 2で指定したとおり、/opt以下となります。インストール時に、pathがどうとか色々メッセージが出ますが、あまり有益な情報はなかったです。

このままではsqlite3にパスが通っていないので、実行時にはフルパスで指定する必要があります。ローカル環境かつ管理者権限もあるため、/usr/local/binにシンボリックリンクを張ってしまいました。わざわざ/opt以下にした意味があるのか、一貫性がないような気もしますが。

```shell-session
~$ cd /usr/local/bin
/usr/local/bin$ sudo ln -s /opt/sqlite/sqlite3.26.0/bin/sqlite3 sqlite3.26
```

## Step 5. 確認
念の為、インストールしたものが動いているのか確認します。うまく実行できていれば、以下のようにダウンロードしたバージョンが表示されるはずです。

```shell-session
$ sqlite3.26 --verion
3.26.0 2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9
```

# おわりに
Qiitaに投稿してみましたが、振り返ると特筆すべきところはなかったです。個人的に、/opt以下の扱いを知れたのが良かったぐらいでしょうか。

これでようやく、本来の目的だったウィンドウ関数が試せる[^3]。

[^1]: sqliteの最新版を試そうなんてユーザーは開発環境なんて入っていて当たり前という気もしますが。
[^2]: 以前は/usr/localだったのですが、個別パッケージ名でディレクトリを切ってはいけないようです。そのため、/optを活用するのだとか。 http://hateda.hatenadiary.jp/entry/2014/02/02/191807
[^3]: apt-getでインストールできるかなと考えていたところ、そもそもサポートが最近だったらしく、全くお呼びではなかった。3.26.0に対応したUbuntuパッケージもあるようですが、disco向け（Ubuntu 19.04向け）であり、かえって依存関係を破壊しそうなため、そっと検索結果を閉じました。
ksnctf 12 Hypertext Preprocessor 70pt

# 問題

https://ksnctf.sweetduet.info/problem/12

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6089605e-60a2-fba7-bb5c-ac67288ed3b0.png)

# 解いてみた

リンクをクリックしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/32437fb2-10a8-7768-36b3-83090cb83dfa.png)


時間かと思いましたが、桁数がかなり多い。
特に数字が更新されることもないです。
F5押してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d5ba3ade-8325-563d-313c-47f19f1bf2fd.png)

数字が少し更新されました。
08が23に変わったところが秒っぽいと推測すると以下になります。

| 値 | 予想 |
|:-----------------|------------------:|
| 2012:1823 | ？ |
| 20 | 年の上2桁 |
| 19 | 年の下2桁 |
| 01 | 月 |
| 05 | 日 |
| 05 | 時 |
| 47 | 分 |
| 23 | 秒 |
| 14:32:32:52| ミリ秒 |

この予想があってると仮定すると時間は-9時間なのでUTCということになります。
だとするとなんなんでしょう？？？
先頭のよくわからない「2012:1823」を検索してみます。

徳丸浩さんのブログがヒットしました。さすが徳丸さん！
[CGI版PHPにリモートからスクリプト実行を許す脆弱性(CVE-2012-1823) ](https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.html)

なんで？と思ったらCVE番号と一致してる！

これを読みますと「CGI版のPHPにコマンドライン引数としてPHPのオプションを指定できます。」とのこと。
「-s」でソースを表示できるらしいので試しにやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/140ec286-7de9-a6aa-a706-8a5a1a2ac9ae.png)

すごい。これであってることがわかりました。
が、ここにはflagは書かれてないです。
が、Flag is in this directory.（フラグはこのディレクトリにあります。）とのことです。

徳丸さんのブログをさらに読み進めると、OSコマンドもいけそうですのでlsやってみます。
と思ったらPOST通信にしないといけないらしい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2a2dc91b-c492-a789-dad8-401b50046a5e.png)

こんな感じか？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/791771b4-bb77-dbf1-d7a5-ab3e8827448e.png)

と思ったらダメでした。
URLエンコードで記号が変換されてしまっていることと最後に=がついていることが原因ですかね。
徳丸さんが言ってる通りBurpSuiteを使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b4856e3d-bfba-a277-af05-cd6110360f45.png)

こんな感じで編集して送信。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2b9ea29a-ea13-5a81-d546-b2813564d355.png)

ファイルの一覧が出ました。
flag_flag_flag.txtが答えっぽいので表示させます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e52a5908-7c26-8383-4fbd-982acea7af6a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/4a64cf5b-0042-9437-199c-19a61d6b909f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fd35378b-7def-ec19-6336-ad131b0eea94.png)
WINS構築&NetBIOS名前解決（未完成）

```
# yum -y install samba 
```

`/etc/samba/smb.conf.exampleを参考に`

```/etc/samba/smb.conf 
[global]
wins support = yes 
netbios name = wins

```

```
　[root@wins ~]# systemctl start nmb 
　[root@wins ~]# systemctl start smb 
```

##LinuxでWins名前解決
```/etc/nsswitch.conf
hosts: files dns wins 
```

##参照文献
 - [SambaによるWINS及びマスタブラウザ設定](https://ry.tl/smb.html)
Laravelで関連モデルへの保存

Cakephpからlaravel移行組です。
Cakephpではpost HasMany photoの関係で
記事投稿する際に画像テーブルにsaveallで一回で保存できました。


laravelではどうすればいいのかわからず調べていましたが2回保存する以下の方法に落ち着きました。
もっと良い方法があるのでしょうか？みなさんどうされてますか？


## 普通にフォーム部分
```php

<form method="POST" action="{{ url('/posts') }}" accept-charset="UTF-8" enctype="multipart/form-data">
<input type="text" name="name">
<textarea type="textarea" name="content"></textarea>
<input type="file" name="upfile">
<input type="submit" value="create">

```

## PostsController
```php

public function store(Request $request)
{

	$requestData = $request->all();

	$postSaveData['name'] = $requestData['name'];
	$postSaveData['content'] = $requestData['content'];
	$post = new Post;
	$post->fill($postSaveData);
	$post->save();

　　//画像ファイルを取得する処理、画像の保存処理は割愛
	$originalfileName = $requestData['upfile']->getClientOriginalName();
	$photoSaveData['filename'] = $originalfileName;

	$photo = new Photo;
	$photo->post()->associate($post);
	$photo->fill($photoSaveData);
	$photo->save();

	return redirect('posts')->with('flash_message', 'Post added!');
}

```



[参考URL](https://laravel.io/forum/03-05-2014-any-equivalent-to-cakephps-saveall)
Consumptionプランの Function App を Azure Resource Manager テンプレートから作成する

タイトルの通り、Consumptionプランの Function App を Azure Resource Manager テンプレートから作成する方法です。

1. [すべてのサービス] > [Marketplace] > [テンプレート]で検索 > [テンプレートのデプロイ] を選択して、[作成] ボタンを押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89309/1ac053b0-3201-b1e3-fd1c-d4af646068ca.png)

1. GitHub クイックスタート テンプレートを読み込むのプルダウンから [101-function-app-create-dynamic] を選択して、[テンプレートの選択] ボタンを押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89309/10ad337d-b8c0-9403-ab0d-8705b8d7e50b.png)

1. 必須項目を入力して、[購入] ボタンを押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89309/e2cd27b1-3a20-39c7-b4d8-a60349fc9891.png)

1. しばらくしてから [リソース グループ] を表示すると、新規作成したリソースグループに所定のリソースが作成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89309/7f2373ef-6dc3-c84c-c366-cfbcb9301383.png)

1. Function App の App Service プランが Consumption であることが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89309/e6334494-72e9-6b50-077d-ef858742ffec.png)
LINE の既読機能は実はコスト最小限のリアクション機能なのかもと思った UI UX

LINE の既読機能は実はコスト最小限のリアクション機能なのかもと思った UI UX

# ok とコメントを打つことさえ面倒になったユーザーのための既読機能

- 最近MacBookばかり触っているせいかiPhoneのすべてのコストが爆高に感じられて仕方がない
- Lineでokと二文字コメントを押すことさえわずらわしく感じられる
- 読んだら自動でokとか返してくれる機能とかないの？もっと究極を狙おうぜ？

# あれ、これって既読機能なんじゃない？

- 相手にほとんどなんのリアクションも届かないけれど、読んだというリアクションにはなる
- 時代の最先端を行っているんじゃないだろうか、今にして思う


# リアクションの種類

- コメント
- 絵文字リアクション、スタンプ
- いいね、ファボ
- 既読

この究極のコーヒーが薄まった最後の段階が既読機能かもね

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
lightsailでwebサーバを構築してから、取得した独自ドメインでそのサーバにアクセスできるようにするまでの流れ

①lightsailでwordpressのインスタンスを構築してwebサイトを公開する
②構築したインスタンスのグローバルIPアドレスを確認する
③独自ドメインを取得する（Route53など）
④独自ドメインを取得したサービスで、使用するDNSサーバ(ネームサーバ)を設定する
⑤DNSサーバでドメインとIPアドレスを紐づけるAレコードを設定をする
⑥設定が反映されるのを待つ
⑦できた！
Ansibleにlintを導入する

Ansibleにlintを検証したときの備忘録です。

# インストール

- `$ sudo pip install ansible-lint`

- ./ansible ディレクトリに lintのファイルを作成する
  - /home/ubuntu/yhidetoshi-infra/ansible

`cat .ansible-lint`

```
parseable: true
quiet: false
use_default_rules: true
skip_list:
  - ANSIBLE0010
  - ANSIBLE0012
  - ANSIBLE0016
verbosity: 1
```

→ `skip_list`に 対象外にするLintを定義する

- playbookを指定してlintチェックする
  - `$ ansible-lint {something-playbook.yml}`



```bastion.yml
- hosts: role_bastion
  user: ubuntu
  become_method: sudo
  gather_facts: yes

  roles:
    - ruby
    - bastion
    - ssm
    - nginx
    - codedeploy
#     - verifi
```

# lintを実行してみる

- `$ ansible-lint bastion.yml`
  - playbookで指定しているロールのtasksの記述が チェックされる

```
Examining bastion.yml of type playbook
Examining /home/ubuntu/yhidetoshi-infra/ansible/roles/ruby/tasks/main.yml of type tasks
Examining /home/ubuntu/yhidetoshi-infra/ansible/roles/bastion/tasks/main.yml of type tasks
Examining /home/ubuntu/yhidetoshi-infra/ansible/roles/ssm/tasks/main.yml of type tasks
Examining /home/ubuntu/yhidetoshi-infra/ansible/roles/nginx/tasks/main.yml of type tasks
Examining /home/ubuntu/yhidetoshi-infra/ansible/roles/nginx/handlers/main.yml of type handlers
Examining /home/ubuntu/yhidetoshi-infra/ansible/roles/codedeploy/tasks/main.yml of type tasks
Examining /home/ubuntu/yhidetoshi-infra/ansible/roles/codedeploy/handlers/main.yml of type handlers
/home/ubuntu/yhidetoshi-infra/ansible/roles/bastion/tasks/main.yml:21: [E201] Trailing whitespace
```

- lintのルールに違反しているものを修正する
  - `tasks/main.yml:21: [E201] Trailing whitespace`

- lintのルールは以下を参考にする
    - https://github.com/ansible/ansible-lint/blob/ce5b8a3f00cc76a62e34717f4dd31585b4e2734d/docs/docsite/rst/rules/default_rules.rst

# まとめ
- Ansibleにlintを導入した
- 実際にplaybookを指定して、lintを実行した
- 必要に応じて、除外するlintを指定する
【Rails】routes.rbでのasオプション

メモ用。

routes.rbファイルで`asオプション`をつけると、名前を指定することができる。


```config/routes.rb
 get 'exit', to: 'sessions#destroy', as: :logout 
```

名前付きヘルパーとして`logout_path`と`logout_url`が作成される。
logout_pathを呼び出すと/exitが返される。
Python3でSlackにPostする

SlackにPython3でMessageをPostするコードを書いたので備忘録です。
Slackにエラーログを送ったり、アラート通知などに活用する。

- 開発環境
    - Mac10.14.1
    - Python3.7.0
    - Slack: WebHookURLが必要
- SlackにPostするときにAPI仕様を確認する ( Attachment structure )
    - https://api.slack.com/docs/message-attachments


```slack_post.py
import urllib.request
import json

url = 'https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxx'

def post_slack(msg):
    set_fileds = [{
        "title": "TITLE",
        "value": msg,
        "short": False
    }]

    data = {
        'attachments':  [{
            #'color': '#FF0000',
            'color': 'danger',
            'fields': set_fileds
        }]
    }

    method = 'POST'
    request_headers = { 'Content-Type': 'application/json; charset=utf-8' }
    body = json.dumps(data).encode("utf-8")
    request = urllib.request.Request(
        url=url, 
        data=body, 
        method=method,
        headers=request_headers 
    )
    urllib.request.urlopen(request)

if __name__ == '__main__':
    msg = "My name is yhidetoshi"
    post_slack(msg)
```

# Slackへの通知結果

<img width="287" alt="python3_slack_post.png" src="https://qiita-image-store.s3.amazonaws.com/0/63395/12545e7a-08fa-2ea1-63e7-f5fc91509338.png">


# まとめ
Python3を使って、SlackにメッセージをPostしました。これをAWS Lambdaから様々なイベントやログ情報をSlackにPostするために活用していきたいと思います。
Wi-Fi＆BluetoothモジュールESP32とBLEタグで誰かの在宅状況を見守ってみる

*本記事は、[2018年5月に別の場所へ書いた記事](https://cyclic-lab.blogspot.com/2018/05/lanbluetoothesp-wroom-32ble.html)の転載です*

# 概要
子供のランドセルとかに付けた BLE (Bluetooth Low Energy)タグのIDをモニタリング、家から出発したり家に帰ってきたことを検知してLINEに通知してくれる見守りセンサを作ってみました。
![見守りセンサ](https://qiita-image-store.s3.amazonaws.com/0/336603/2074d483-6c25-5e6b-7495-c2a2a101c55e.jpeg)
見守りセンサの中身は、数百円で入手できてしまうWi-FiとBluetoothが一体になった小型モジュール [ESP32](https://ja.wikipedia.org/wiki/ESP32) ([ESP-WROOM-32](http://akizukidenshi.com/catalog/g/gM-11647/))です。[前回](https://qiita.com/nikotan/items/166d770a7982f232f290)のESP8266と同様、技適取得済みで安心、入手も容易です。
![BLEタグ](https://qiita-image-store.s3.amazonaws.com/0/336603/1e4a1c68-f814-c468-0b7c-85cf3d7f1f0e.jpeg)
BLEタグの方は、[mamorio](https://mamorio.jp) などの紛失防止タグをそのまま使います。要は、BLEのadvertisingパケットを出し続けてくれていればなんでもOKです。

# 実装
苦労したポイントだけをザックリまとめておくと、、、

- ESP32上でWi-FiとBluetoothを同時に使うときのメモリ不足<br>
---> Arduino IDEのビルドオプション変更で解決 (詳しくは「[参考](#参考)」を参照)
- ESP32上で無線LANとBluetoothを同時に使うときの電源容量不足<br>
---> 電源回路用のレギュレータを高性能なものにして解決 ([ADP3338](http://www.analog.com/jp/products/power-management/ldo-linear-regulators/positive-linear-regulators/adp3338.html))
- 1台のESP32だけでは、BLEタグを検知できる範囲が狭い<br>
---> 複数台の検知結果をクラウド側で統合して解決(※)

(※) 見守りセンサのESP32は、BLEタグをスキャンしたスキャン結果をAWS上のWEBサービス (AWS Lambda + DynamoDB + API Gateway) とHTTPSでやり取りし、見つけた/見失ったIDがあった場合にはIFTTT経由でLINE通知します。(詳しくは[コード](#回路図とコード)を参照)

# 回路図とコード
見守りセンサの回路図は以下。
フリスクケースに収まるよう部品点数はなるべく減らしたつもりです。
![見守りセンサの回路図](https://qiita-image-store.s3.amazonaws.com/0/336603/12e35588-ff0b-a420-ce86-0ff8f2f01b02.png)
見守りセンサで動くコード(ESP32向けのArduinoコード)と、クラウド側で動くコード(AWS Lambda上で動くPythonコード)を以下に置いておきます。
[nikotan/BLETagMonitor_esp32.ino - GitHubGist](https://gist.github.com/nikotan/5c52005722baab7c3d87402b5e906be8)
[nikotan/BLETagMonitor_lambda.py - GitHubGist](https://gist.github.com/nikotan/76554c39e3f50332a9efdcca371e31fa)

実際しばらく使ってみると、在宅状況を把握できるだけで得られる安心もあるということが分かりました。

# 参考
今回のハードとソフトを作るにあたっては、以下の記事などを参考にしました。

- [ESP-WROOM-32 ( ESP32 ) で Wi-Fi スマホ LED スイッチ作り | mgo-tec電子工作](https://www.mgo-tec.com/blog-entry-esp-wroom-32-esp32-wifi-smartphone-led-switch.html)
- [Aruduino IDEだとBLEとWi-Fiを同時に使うアプリを書くとメモリ不足でビルドできない - つれづれ日記](https://diary.sshida.com/20180503-3-Aruduino%20IDEだとBLEとWi-Fiを同時に使うア)
- [BLE + WiFi, WiFi gets disconnected · Issue #169 · nkolban/esp32-snippets - GitHub](https://github.com/nkolban/esp32-snippets/issues/169)
- [interactive-matter/aJson - GitHub](https://github.com/interactive-matter/aJson)
- [AWSのLambdaとDynamoDBとAPIGatewayの連携 - Qiita](https://qiita.com/tentatsu/items/c45bcc4062f1a6d4cf2a)
- [LambdaでDynamoDBのデータを操作する(Node&Python) - Qiita](https://qiita.com/is_ryo/items/74f3fc70b7602888a2ac)
- [[API Gateway] APIキーと使用量プランを使用してアクセス制限を掛ける ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/api-gateway-api-key-plan-access/)
- [HTTPS通信の疎通確認に覚えておきたい３つのコマンド - Qiita](https://qiita.com/greymd/items/68b0c40044a88171235a)
constと副作用とワイ

# 35歳無職ワイ
ワイ「今日はやることないから**JavaScript**のお勉強でもしよか」
ワイ「なんかしとらんと**酒飲んでまう**からな」

# ES2015のお勉強
ワイ「ほな新しめのJavaScriptである**ES2015**のお勉強でもしてみよか」
ワイ「**ES2015**、**入門**・・・検索、と」

ワイ「お、ワイの大好きな**人斬りエンジニア塾**はんのサイトが出てきたで」
ワイ「ほな読んでいこか」

ワイ「ほー、ES2015では**const**いうんを使って**定数**を宣言できるんか」

```javascript
const a = 3;
a = 4; // エラー！
```

ワイ「**const**で宣言した定数は、**再代入が出来ひん**ようになっとるから、」
ワイ「一度**数値**や**文字列**を代入したら**その後はずっと同じ値である**事が保証されてんねんな」

# 再代入できないと何が嬉しい？
ワイ「うーん、でも別にconstなんて無くてもプログラムなんて書けそうやけどなあ」
ワイ「むしろ再代入できるほうが便利やないか？」
ワイ「constは**どんな時に役立つ**んやろか・・・」
ワイ「値が変わらんことが保証されとると便利なとき・・・」
ワイ「どんな時や・・・」

# こんな時にconstは役に立つ
ワイ「せや」
ワイ「こんな時に役に立ちそうやな」

```javascript
const a = 3;

change_the_world();
reset_something();
destroy_all();

console.log(a); // 何が表示される？
```

ワイ「定数 **a** が宣言された後に色んな関数が実行されとるけど、**aの値が3やって事は保証されとる**から分かりやすいな」
ワイ「**3**に決まってんねんもん」

ワイ「これがもし**var**や**let**で宣言した変数やったら」

ワイ「change_the_worldっていう関数はなんや？」
ワイ「**aの値をなんか変えてるんちゃうか？**」
ワイ「reset_somethingって何？」
ワイ「なんか**aに影響あたえてるんちゃう？**」
ワイ「destroy_allって何？」
ワイ「明らかに**全てを破壊しそうやん**・・・」
ワイ「ていうか**さっきからどんな命名してんねん！！！**」


ワイ「って色々と心配になって**お酒を飲んでしまったり**」
ワイ「それぞれの関数の中を見に行ったりせなあかんけど」
ワイ「aに**再代入されない事が保証されてる**なら安心やもんな」
ワイ「それはconstで宣言するメリットかもな」
ワイ「なにかの関数の**副作用**で**知らん間にaの値が変わっとった！！！**いうことが無いからな」

ワイ「基本的になんでも**const**で宣言して、再代入が必要なやつだけ**let**にしといたら良さげやな」
ワイ「**var**は**let**の下位互換みたいなもんやから、もう要らんやろ」
ワイ「**var**はもう仕様から削除してほしいわ」

オカン「そらええな」
オカン「削除したら**お前が昨日まで書いとったコード動かへんくなるけどな！**」

ワイ「せ、せやな」

# しかし気になること
ワイ「でも、ワイみたいな**ザコーダー**やと、」
ワイ「constで宣言するのを忘れて、**クセでvarを使ってしまうかもしれん**から」
ワイ「**一抹の不安が残る**な・・・」

ワイ「あと」

```javascript
const arr = [3, 4, 5];
arr.push(6); // エラーにならない。
```

ワイ「こんな感じで」
ワイ「**const**で宣言してても**配列への要素追加とかは出来てまう**んやな・・・」
ワイ「ほな、なんかの処理の**副作用**で、」
ワイ「配列の中身が**知らん間に変わってまうかもしれん**な・・・」
ワイ「あと**オブジェクトのプロパティも変更できるねんな**」
ワイ「**再代入が出来ひん**だけであって、完全に**イミュータブル（不変）**な訳やないんやな」
ワイ「むぅ」
ワイ「その点も不安やな・・・」

ワイ「不安やから、**酒飲んどこ**・・・」

**〜飲酒、そして就寝へ〜**


# 翌朝
ワイ「今日はやる事ないから純粋関数型言語**Elm**のお勉強でもしよか」

ワイ「なになに」
ワイ「ふむふむ」
ワイ「え・・・」

ワイ「Elmでは**そもそも再代入する術がない**んか」

```elm
x = 3
```

ワイ「こう書くだけでもう**不変**やって。」
ワイ「もし再代入しようとしたら、」

Elmちゃん「**名前の衝突**です。」
Elmちゃん「**このファイルは複数の`x`宣言を持ちます。**」
Elmちゃん「**どのようにして欲しいのですか？**」
Elmちゃん「**それらの1つを改名しなさい！**」

ワイ「って**コンパイルエラー**起きんねんて。」
ワイ「**ドMのワイにはたまらんで**」
ワイ「もう**再代入**やなくて**名前の衝突**やねんな」
ワイ「**再代入いう概念がない**ねんな」

ワイ「ほな普通に書いとくだけで、」
ワイ「**なんかの処理の副作用**で**知らんうちに値を変えてもうとったわ！！！**」
ワイ「って事がないんやな」

ワイ「あと配列・・・やなくて**List**か」
ワイ「リストに要素を追加しようとしてもそれは**新しく別のリストが作られる感じになる**から」
ワイ「元のリストはちゃんと残っとるんやな」
ワイ「JSのconstみたいな心配も大丈夫、いうわけやな」

ワイ「ほかにも」
ワイ「**なんかをアレしたら、知らん間に他のなんかも変えてもうとった！！！**」
ワイ「みたいな**副作用**が極力発生せんように言語自体が作られてんねんなー」

ワイ「しかも最終的にはJSにコンパイルされるんやって」
ワイ「間違って副作用を起こす事が少ない**純粋関数型言語**でフロントエンド開発ができんねんなー」

# 15時になったのでお勉強終了
ワイ「昨日は、変数の値が変わってしまわへんか心配になってお酒を飲んでしもうたけど」
ワイ「今日はそんなことあらへん」
ワイ「今日は**祝杯や**」
ワイ「新しい言語との出会いにな」

オカン「**結局飲むんやないか**」

**〜おしまい〜**
WebdriverIOでクリックできない要素を強制的にクリックする

WebdriverIOの `click()` は、指定された要素に別の要素が重なってクリック出来ない場合、次のようなメッセージを出力してテストに失敗します。

```
Element is not clickable at point (x, x). Other element would receive the click: ..."
```

これは[公式ドキュメント](https://webdriver.io/docs/api/element/click.html)でも言及されており、回避方法が紹介されています。WebdriverIOの問題というより、Webdriverの仕様によるもののようです。

> To work around this, try to find the overlaying element and remove it via execute command so it doesn't interfere the click. You also can try to scroll to the element yourself using scroll with an offset appropriate for your scenario.

かぶさってる要素を `execute` で取り除くか、テストシナリオ内で明示的にスクロールして被らないようにしろ、ということですね。または、 `browser.waitUntil()` でかぶさってる要素が消えるのを待つ方法もあります。
スクロールやwaitで解決するならそれでよさそうですが、 `execute` で無理やり取り除くくらいなら、対象の要素のclickイベントを直接発火させてしまってもあんまり変わらないのでは……？

ということで、`browser.execute()` でやってみたのがこちらです。
やることは単純で、XPathで要素を取得し、clickイベントを発火するスクリプトをブラウザ上で実行するだけです。

```javascript
async function forceClick(locator) {

  const elements = await $(locator)
  const selector = elements.selector

  browser.execute(function (el) {
    (
      function(expression, parentElement) {
        var r = []
        var x = document.evaluate(expression, parentElement ||
                document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
        for (var i = 0, l = x.snapshotLength; i < l; i++) {
        r.push(x.snapshotItem(i))
        }
        return r
      } 
    )(el)[0].click()
  }, selector)
}

forceClick(locator)
```

こちらは完全に余談ですが、自分はCodeceptJSを使っているので、以下のようなカスタムヘルパを定義して使っています。

```js

class ForceClick extends Helper {

  async forceClick(locator) {
    const helper = this.helpers['WebDriver']
    const elements = await helper._locateClickable(locator)
    const selector = elements[0].selector

    helper.executeScript(function (el) {
      (
        function(expression, parentElement) {
          var r = []
          var x = document.evaluate(expression, parentElement || 
                  document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
          for (var i = 0, l = x.snapshotLength; i < l; i++) {
            r.push(x.snapshotItem(i))
          }
          return r
        } 
      )(el)[0].click()
    }, selector)
  }
}


module.exports = ForceClick;
```



## 参考
https://www.softel.co.jp/blogs/tech/archives/2067
[LaTeX] [Mojave] Mac で latexindent が上手く動作しないときの対処法

## はじめに
Mac (Mojave) 上の VSCode で LaTeX の環境を整えているとき，`Format Document` が上手く動作しなかったので原因を調べてみました．

以前に書いたこちらの記事にしたがってインストールした場合を前提としています．
[[Mojave] MacTex 2018 + VS Code で LaTeX の環境を構築する - Qiita](https://qiita.com/khys/items/c47d73af8993890cb9e5)

.tex ファイル上で右クリックすると `Format Document` を選択できるのですが，エラーになってしまいます．
![スクリーンショット 2019-01-05 18.43.54.png](https://qiita-image-store.s3.amazonaws.com/0/131552/5b2560fa-60ca-c363-7abe-6e5d4e553a44.png)


## ログ
VSCode 上でログ出力を見ると，perl のモジュールが足りないような記述がありました．
調べてみると，この自動インデント機能は `latexindent` が担っているらしく，`latexindent` は多くの perl モジュールに依存しているようです．
ログでも `Log::Log4perl` が足りないよ，と言っていますね．

```
[18:20:25] Formatting failed with exit code 2
[18:20:25] stderr: Can't locate Log/Log4perl.pm in @INC (you may need to install the Log::Log4perl module) (@INC contains: /usr/local/texlive/2018/texmf-dist/scripts/latexindent /usr/local/Cellar/perl/5.28.1/lib/perl5/site_perl/5.28.1/darwin-thread-multi-2level /usr/local/Cellar/perl/5.28.1/lib/perl5/site_perl/5.28.1 /usr/local/Cellar/perl/5.28.1/lib/perl5/5.28.1/darwin-thread-multi-2level /usr/local/Cellar/perl/5.28.1/lib/perl5/5.28.1 /usr/local/lib/perl5/site_perl/5.28.1/darwin-thread-multi-2level /usr/local/lib/perl5/site_perl/5.28.1) at /usr/local/texlive/2018/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm line 22.
```

`cpan` コマンドで該当するモジュールをインストールし `Format Document` を実行．
エラー内容が変わるたびに指定されたモジュールをインストールするというのを繰り返してみましたが，途中でコケてしまいました．
`File::HomeDir` が依存する `Mac::SystemDirectory` に問題があり，インストールが進みません．

別のプロジェクトではありますが，Mojave 固有の問題として issue が立っているようでした．
[Failed to install on OSX Mojave Mac::SystemDirectory is not installed. · Issue #39 · sqitchers/homebrew-sqitch](https://github.com/sqitchers/homebrew-sqitch/issues/39)

この issue によると brew で入れた perl であれば問題なくインストール可能ということでした．
試してみると案外簡単に解決できたので，次節で実際に入力したコマンドを載せておきます．


## コマンド
`cpan` より `cpanm` の方が便利そうだったので，ついでに入れておきました．
基本的な作業としては，`Format Document` を実行した際のエラーメッセージで怒られる度に，指定されたモジュールをインストールするだけです．
もちろん，わざわざ VSCode 上で試さなくてもコマンドラインでデバックできると思います．

```
$ brew install perl
$ brew install cpanm
$ cpanm Log::Log4perl Log::Dispatch::File YAML::Tiny File::HomeDir Unicode::GCString
```


## おわりに
実際に入力したコマンド自体は少ないですが，原因の調査に時間がかかりました．

普段はあまり perl を使うことがないので，モジュールについての認識が間違っているかもしれません．
何かあればコメントお願いします．


## 参考
- [[Mojave] MacTex 2018 + VS Code で LaTeX の環境を構築する - Qiita](https://qiita.com/khys/items/c47d73af8993890cb9e5)
- [Formatting failed error · Issue #376 · James-Yu/LaTeX-Workshop](https://github.com/James-Yu/LaTeX-Workshop/issues/376)
- [Failed to install on OSX Mojave Mac::SystemDirectory is not installed. · Issue #39 · sqitchers/homebrew-sqitch](https://github.com/sqitchers/homebrew-sqitch/issues/39)