OmniAICreator/Qiita-1.07M huggingface dataset:
Upverterで設計したガーバーデータを面付けする方法

#はじめに
- 普段、回路／基板設計ツールとして、[Upverter](https://upverter.com/)を使っています。
- PCにインストールする必要がない、WindowsでもMacでも関係なくブラウザさえあればよい、といった利点がありますが、PCBの面つけ機能がありません。
    - 他にも足りない機能があるかもしれませんが、当方が直面した課題はコレでした。
- そこで、Upverterで出力したガーバーデータをベースに、他ツールを使って面付けしてみました。
    - こちらの記事（[gerbvで面付け](https://bluefish.orz.hm/sdoc/fusionpcb.html#gerbv%E3%81%A7%E9%9D%A2%E4%BB%98%E3%81%91)）を参考にさせて頂きました。
 
---
#用意するもの
- [gerbv](https://sourceforge.net/projects/gerbv/)
- 作業用PC
    - 本記事は、Windowsマシンを使用しています。

---
#面付け手順
1. Upverterから、ガーバーデータ（Gerber Format (RS-274X extended)）とドリルデータ（NC Drill (Excellon)）をダウンロード。
    - この段階のガーバーデータには、面付けしたい回路（１つ分）が載っている状態。
    - 面付け後の全体サイズだけは、ここで決めておく。（下記画像の濃い水色の四角）
    - 本記事では、42回路分（横方向に7、縦方向に6）の面付けを行う想定。
        - １つ分のサイズは、12.7mm×15.24mm。
        - 全体の基板サイズは、94.90mm×96.44mm。
            - カッターの刃厚を1mmとして、12.7×7+1×6＝94.90、15.24×6+1×5＝96.44。
![LPC81Xto810R2_Upverter-1024x809.png](https://qiita-image-store.s3.amazonaws.com/0/166435/bff6669f-c500-2140-8147-c6fc741cc6f0.png)

2. zip圧縮されているので、それぞれ解凍。
    - ガーバーデータ
![LPC81Xto810R2_Upverter_gerber.png](https://qiita-image-store.s3.amazonaws.com/0/166435/0f228191-e709-17aa-1d3e-5563f8279aad.png)
    - ドリルデータ
![LPC81Xto810R2_Upverter_drill.png](https://qiita-image-store.s3.amazonaws.com/0/166435/b6fd95fa-28c5-a7c0-9a91-87853acbb7af.png)

3. FusionPCB発注用にファイルを再構成。
    - 各ファイルのボディ部分（拡張子を除いた部分）は、基板名（LPC81Xto810R2）として統一しておく。
    - ガーバーデータから７種（gbl,gbo,gbs,gtl,gto,gts,gko）を拡張子そのまま、ドリルデータは拡張子をtxtに変更する。
![LPC81Xto810R2_Fusion_gerber.png](https://qiita-image-store.s3.amazonaws.com/0/166435/e501034f-c392-87ea-5dea-5ff2d99a54fc.png)

4. gerbvを使って、各ファイル（外形ファイルのgkoを除く）を面付け＆更新。
    1. File - Open Layerで、ファイル読み込み。
    2. Edit Layerで、1基板分ずらす。（横方向には13.7mmずつ、縦方向には16.24mmずつ）
    3. 上記の2手順を面付け分繰り返す。
        - 下図の例では、42回繰り返すのは面倒なので、7回繰り返したものを一時保存して、それを6回繰り返しています。
    ![gerbv.gif](https://qiita-image-store.s3.amazonaws.com/0/166435/1e7741eb-9510-d527-cc43-365ce4aa819f.gif)
    4. File - Export - RS-274X Merge(Gerber)で、面付け後のガーバーデータを出力。
        - ドリルデータ（拡張子txt）は、File - Export - Excellon Drill Merge。
        - くれぐれも、「RS-274X(Gerber)」や「Excellon Drill」と間違えないように。↑でやった作業がすべて無駄になります。

---
# 完成状態
- 面付け後の各層を合わせると、このような形になります。
![gerbv32.PNG](https://qiita-image-store.s3.amazonaws.com/0/166435/6a316b10-e317-51a2-cf5f-a3836d61f7f8.png)


---
#おわりに
- 参考記事を書いた方も述べておられますが、かなり面倒ですね。
- 実行環境を選ばずに回路／基板設計ができるのはいいんですが…（[KiCad](http://opencadken.com/kicad)あたりに乗り換えようかと思っている今日この頃）
VMware でUbuntuつくった備忘録

## Ubuntuの再設定

先日（2018/4/27）　UbuntuのLTSとして、18.04がリリースされたという情報を受けて私はあることを思い出した。
「そういや仮想環境でUbuntu16の環境つくったな」と。

で、久しぶりに起動してみると当然どういう設定で環境をつくったのか記憶無いし、更新もめっちゃたまってそう…
なので使っていないものは断捨離の精神で環境を破棄し、新たに設定。

ホストOS：Windows8.1
ツール：VMware
OS：Ubuntu16 (64bit)

参考記事
https://freepc.jp/post-22553
↑を横目にまあ画面に出てくる項目を素直に埋めていけば勝手にできあがる。便利。

## 初期設定
私がやったのはこれだけ。こだわる人からするとなんじゃこりゃくらいなことしか変えてない。（だってサンドボックス的なおもちゃみたいなもんだし）
とりあえずこれだけやっておけば後はなんとかなるはず。

1.ミラーサーバの変更
システム設定-ソフトウエアとアップデート　から適切なミラーサーバを検索して変更しておく。

2.システムの更新

```shell
$ sudo apt-get update
$ sudo apt-get update
```

念のため最新かどうか確認

```shell
$ do-release-upgrade -c
```

※最新版でない場合

```shell
$ sudo do-release-upgrade
```

3.フォルダのリネーム
日本語で環境設定することによる弊害。

```shell
$ LANG=C xdg-user-dirs-gtk-update
```

※実行後、再起動

4.ファイアウォールの有効化
こったものを使わなければ「gufw」でソフトを検索してインストールする。
とりあえず既定値で有効化。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130149/bffa2d35-cd33-2561-fee5-8017a9935e54.png)


5.強制終了の有効化

```shell
$ sudo dpkg-recomfigure keyboard-configuration
```

6.時刻の修正

7.VMWare-toolsのインストール（画像の解像度調整など）


## 簡易なPython開発環境
使用するエディタはVisual Studio Codeにしてみた。

Visual Studio Codeをインストール後、拡張機能として「Python」をインストール。
しかし何かエラーが発生する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130149/c1ab6ef0-5c8c-8445-d959-e27aafe2d991.png)

どうやらLinterがインストールされていない模様。Linterはあると便利なのでぜひ入れておきたい。

```shell
$ sudo apt install python-pip
```

ひょっとしたら2系かもしれないのでこれも実行。

```shell
$ sudo apt-get install python3-pip
```

インストールできたかどうか確認。

```shell
$ pip -V
```

```shell
$ pip3 -V
```

pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5) みたいな結果が帰ってくればインストール完了。

あとはLintへのパスを通す。
主に使いたいのは3系なのでVisual Studio Code 上で、Ctrl + Shift + P押下>「select interpreter」と入力して検索して探す。

ここらへんのエラー対応はhttp://www.atmarkit.co.jp/ait/articles/1711/24/news034.html　
を参照した。

これで文法エラーがあれば保存時に文法検証してくれる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130149/d79b5cdd-311e-25c5-3bc7-e0a95a8e4f69.png)

num++みたいなインクリメントは使えないんだ…知らなかった。

Pythonのあたりは蛇足。これでいつでも仮想環境をスクラップ＆ビルドできる。
Swiftで負の数に対する%演算が正にならない件

配列の要素に循環的にアクセスしようとして%演算子でハマった点について書き残します。

## %演算が負になる例

Swiftでは%演算の結果が必ずしも正になるとは限りません。負の数に対して%演算すると負の数になります。

```swift
5 % 3 == 2 //true
-4 % 3 == 2 //false
-4 % 3 == -1 // true
```

この結果、例えば次のようなコードはエラーになります。

```swift
let array = [1, 2, 3]
array[-1 % array.count] // Fatal error: Index out of range
```


## %演算の結果は剰余ではない

[The Swift Programming Language (Swift 4.1): Basic Operators](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html)に記述があり、`remainder`演算であって`modulo`演算でない旨がNoteとして明記されています。

> The remainder operator (%) is also known as a modulo operator in other languages. However, its behavior in Swift for negative numbers means that, strictly speaking, it’s a remainder rather than a modulo operation.

## 解決策

%演算を用いて`modulo`演算の結果は次のように得られます。

```swift
((-4 % 3) + 3) % 3 == 2 // true
```

独自演算子を定義する場合、例えば次のように剰余を得る演算子 `%%` を定義できます。

```swift
infix operator %%
func %%(lhs: Int, rhs: Int) -> Int{
    return ((lhs % rhs) + rhs) % rhs
}

(-4 %% 3) == 2 // true
```

## Reference

* [The Swift Programming Language (Swift 4.1): Basic Operators](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html)
* [詳解Swift改訂版(07)〜演算子 | Second Flush](http://secondflush2.blog.fc2.com/blog-entry-1151.html)
* [Swift3 負の数の剰余演算で負の数が返ってくるのは仕様 - ikap](http://ikapblg.blog.fc2.com/blog-entry-103.html)
awslogsでログをCloudWatchに連携する方法


awscliやlambdaなど、いろいろなところからCloudWatchに連携できますが、Amazon Linuxにたまったログをそのまま連携したい時もあります。
そんなときはawslogsが利用できるようです。

>logのputだけじゃなくgetもできるようです。

## 準備

### EC2へのIAMロールの関連付け

ログを出力するサーバにCloudWatchにログが出力可能なロールを紐付けておきます。
とりあえずCloudWatchFullAccessを紐付けました。

>いつの頃からか、後からでも紐付けできるようになりました。
>awslogsはEC2以外だと利用できないのですかね。。。できたら便利なのですが。


### awslogsのインストール

```bash
sudo yum install awslogs
```

### リージョンの設定 /etc/awslogs/awscli.conf

```diff:awscli.conf
[plugins]
cwlogs = cwlogs
[default]
-region = us-east-1
+region = ap-northeast-1
```

### 出力ログの設定 /etc/awslogs/awslogs.conf

デフォルトで[/var/log/messages]が追加されています。削除してもそのままでもいいかと思いますが、とりあえず、以下を追加します。
自分用のカスタムログです。ファイル名とかそういうのはお好みで。

datetime_formatを指定することで、ログの時間とCloudWatch上の表示を一致させてくれます（過去も含む）。
指定しなかったり、ミスマッチだったりすると、過去ログの時間は、取込時になるようです（当然ですがログ内のTimestampは書き換わりません）。

```bash:awslogs.conf

[/var/log/mysystem.log]
#[2018-05-12 18:25:15.982] 流し込みたいログのTimestamp
datetime_format = %Y-%m-%d %H:%M:%S.%f
file = /var/log/mysystem.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/mysystem.log

```

## 利用

### awslogsのstart

serviceコマンドで制御できるようです。

```bash
sudo service awslogs start
```


### awslogsの永続化

chkconfigで永続化します。

```bash
sudo chkconfig awslogs on
```

## ログの確認

うまくいっているとCloudWatchのログに出力されています（割愛）。
いや。ほんとに便利。

## 参考

以下のサイトが大変参考になりました。ありがとうございます。

* http://beyondjapan.com/blog/2016/07/amazon-cloudwatch-logs
Laravel5.6のメンテナンスモードについて（許可IPを指定方法など）

# 前置き
Laravelに標準でついてるメンテナンスモードですが、許可IPを指定できることを今日知りました。ホワイトリストを指定したりするために、自作 or 改修の必要があると思っていたので、目から鱗です。
どうもLaravel5.6になって実装されたものらしく、5.5では使えません。

以下の内容は公式ドキュメントにも記載されています。
https://laravel.com/docs/5.6/configuration#maintenance-mode

一方、5.5のドキュメントを見ると許可IPの指定については書いてありませんでした。
メッセージとRetry-Afterの指定は5.5でもできるみたい。
https://laravel.com/docs/5.5/configuration#maintenance-mode

# 使い方

## 通常

```
php artisan down
```

## 許可IP指定オプションを指定する場合

### IP1つの場合

``` 
php artisan down --allow=192.168.0.0/16
```
### IP2つの場合

``` 
php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16
```


## 表示に使えるメッセージを指定する場合
```
php artisan down --message="テストだよ!"
```
※ これはデフォルトでは表示されないみたいです。表示に使えるしログの出力なんかにも使えるよ的なものみたい。

## HTTPヘッダーのRetry-Afterを設定
```
php artisan down --retry=60
```

# 仕組み

` php artisan down` を実行すると` storage/framework/down `というファイルができます。
このファイルを以下のミドルウェアでチェックしてます。

``` 
Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode 
```

で、この ` storage/framework/down `というファイルを開いてみると以下のようなjsonになってます。

```json

{
    "time": 1526117372,
    "message": "\u30c6\u30b9\u30c8\u4e2d\u3060\u3088!",
    "retry": 60,
    "allowed": [
        "111.111.11.1",
        "192.168.10.1"
    ]
}
```

CheckForMaintenanceModeクラスの中でdownファイルの中に記述されるjsonを参照しています。
CheckForMaintenanceModeクラスの方を抜粋しておきます。
（存在確認のほうは` Illuminate\Foundation\Application `クラスのisDownForMaintenanceメソッドでやってます。こちらは普通にfile_exists関数を使って判定してるだけなので割愛します。）

```php

public function handle($request, Closure $next)
{
    if ($this->app->isDownForMaintenance()) {
        $data = json_decode(file_get_contents($this->app->storagePath().'/framework/down'), true);

        if (isset($data['allowed']) && IpUtils::checkIp($request->ip(), (array) $data['allowed'])) {
            return $next($request);
        }

        throw new MaintenanceModeException($data['time'], $data['retry'], $data['message']);
    }
}
```

ちなみにCheckForMaintenanceModeミドルウェアの登録は`app/Http/Kernel.php`に記述されてます。

# 結び
ホワイトリストの機構を自作しちゃったよぉ＞＜
作り終わってからこのオプションに気が付いたよぉ＞＜
LaTeXから作るPDFファイルの数式部分からソースをコピーできるようにする

# LaTeXから作るPDFファイルの数式部分からソースをコピーできるようにする

やりたいこと：

* LaTeXから作るPDFファイルの数式部分をなぞってコピー
* テキストエディタにペーストしたら，数式部分のLaTeXソースが得られる
ようにしたい．

## 必要なもの
* LaTeX一式（今回私が試した環境はTeXLive2017同梱のlualatex）
* PDFのビューワ（Adobe Acrobat Reader DC）
* テキストエディタ（メモ帳，なんでもよい）

## 準備

ちょっとググると，TeX Stackexchangeに[Making equations copyable in pdf](https://tex.stackexchange.com/questions/119713/making-equations-copyable-in-pdf)という記事を見つけた．ほぼこれに従う．accsupp.styを使うが，lualatexと組み合わせて使うには，TeXLive2017に納められているものは古いようだ．CTANの [accsupp – Better accessibility support for PDF files](https://ctan.org/pkg/accsupp) からversion 2018/01/30 v0.5のdtxファイルをダウンロードし，texでコンパイルして，styファイルを生成する．

[先ほどの記事の解答の一つ](https://tex.stackexchange.com/a/119718)の2番目のマクロをいただいてくる．

## 結論

次のようなTeX文書で試してみる．lualatexで処理してPDFを生成する．

```latex
\documentclass[a4j,11pt]{ltjsarticle} %use lualatex.
\usepackage{luatexja}
\usepackage[yu-win10,no-math]{luatexja-preset}
\fontencoding{T1}
\usepackage[luatex,pdfencoding=auto]{hyperref}
\usepackage{accsupp}

% Taken from 
% https://tex.stackexchange.com/questions/119713/making-equations-copyable-in-pdf/119718#119718
\makeatletter
\newcommand*{\copyable}{%
  \begingroup
  \@sanitize
  \catcode`\%=14 % allow % as comment char, also needed for \%
  \@copyable
}
\newcommand*{\@copyable}[1]{%
  \endgroup
  \BeginAccSupp{%
    ActualText=\detokenize{#1},%
    method=pdfstringdef,
  }%
  \scantokens{#1}%
  \EndAccSupp{}%
}
\makeatother

\begin{document}
Copyable math formulas:
\[
  \copyable{\zeta(s) = \sum_{n=1}^\infty\frac{1}{n^s} = \prod_{p}\left(1-p^{-s}\right)^{-1},\quad \Re{s}>1.}
\]
\end{document}
```

結果は添付の図のようになる．![スクリーンショット 2018-05-12 18.36.00.png](https://qiita-image-store.s3.amazonaws.com/0/211066/737ac6dd-0af0-e098-a617-eacb521b4591.png)

### 未解決な点

* Adobe Acrobat Reader DCだと，マウスで選択する範囲が適切に表示されない（図の，薄青になっている箇所が，本来は数式部分全体になるべきである）．
* ペーストして得られるLaTeX数式の部分から '_' （下付を示すアンダースコア）が欠落している．

2番目の点は，'\detokenize' が返す文字コードが適切でないためだと思うが，解決できていない（そのためにLaTeXのソースでも'\fontenc{T1}'としているのだが）．識者のご教示を待ちたい．

## 追記
### repltext.sty でも同じことができる

[CTANにあるrepltext](https://ctan.org/pkg/repltext)を使っても同様のことができる．ただし，lualatexと一緒に使うには，pdftexのprimitiveでluatexにないものを補う[pdftexcmds](https://ctan.org/pkg/pdftexcmds)も必要である．どちらもTeXLive2017には納められている．

```latex
\documentclass[a4j,11pt]{ltjsarticle} %use lualatex.
\usepackage{luatexja}
\usepackage{amsmath}
\usepackage[yu-win10,no-math]{luatexja-preset}
\fontencoding{T1}
\usepackage[luatex,pdfencoding=auto]{hyperref}
\usepackage{pdftexcmds}
\usepackage{repltext}
\makeatletter
\newcommand{\pdfescapestring}[1]{\pdf@escapestring{#1}}
\makeatother


\begin{document}
Copyable math formulas (using repltext.sty):
\begin{align*}
  \repltext{\zeta(s) &= \sum_{n=1}^\infty\frac{1}{n^s} = \prod_{p}\left(1-p^{-s}\right)^{-1},\;&\Re{s}>1,\\}{\prevrepl}
  \repltext{L(s, \chi) &= \sum_{n=1}^\infty\frac{\chi(n)}{n^s} = \prod_{p}\left(1-\chi(p)p^{-s}\right)^{-1},\; &\Re{s}>1.}{\prevrepl}  
\end{align*}

\end{document}
```

処理結果は下図のようになる．テキストエディタにペーストすると，やはり下付のunderscoreが反映されない他，余分な空白もできてしまうのが気になるところである．

![スクリーンショット 2018-05-13 17.56.17.png](https://qiita-image-store.s3.amazonaws.com/0/211066/af09a7a3-fb2f-792b-e6d8-1f2ed03878f1.png)
asciify-image を CLI として使う場合、height 指定ができない (version 0.1.2 で修正済み)

(2018/05/13 追記)
version 0.1.2 で、高さ指定のオプションは、`-t` に[修正された](https://github.com/ajay-gandhi/asciify-image/commit/aa4ccd1e79b53b3362bd069635f0694584b6f830)。

----
つい先ほど、画像をテキスト化してくれる node.js ライブラリの [`asciify-image`](https://github.com/ajay-gandhi/asciify-image) を知り、遊んでみた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今更ながら、asciify-image 知って、遊んでる。 <a href="https://t.co/w4sLV70NIP">pic.twitter.com/w4sLV70NIP</a></p>&mdash; ほりひろ (@hori__hiro) <a href="https://twitter.com/hori__hiro/status/995173984936247296?ref_src=twsrc%5Etfw">2018年5月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



いろいろオプションを変えて遊んでいたが、高さ指定の `--height` オプションが効かない。

```sh
$ asciify image.jpg --height 200

  Usage: asciify [options] [path]

  Options:

    -c, --color      true for color, false for B/W
    -r, --c-ratio    character width-height ratio
    -f, --fit        resize rule: box, height, width, original, none
    -h, --height     height to resize to
    -w, --width      width to resize to

  See the readme for detailed options and defaults

  Example:

    $ asciify lolwut.png -c false
```

どうやら `--height` オプションが、`-h` と解釈され、`--help` 扱いになり、`--height` の使い方を案内してくれる事態に。
`--ratio` と `--width` で頑張るしかないか。
1D3 = 1000?

## はじまり
ある日友人から「VBAで1D3が1000で評価されるんだけど」というチャットが来た。1E3ならわかるけど1D3……? HAHAHAそんな馬鹿なと思いやってみると、

```vb:イミディエイトウィンドウから
print(1E3)
 1000 
print(1D3)
 1000 
```

マジやん……。

## 調べた
### ほかの文字
1A3から1Z3までの26種の組み合わせを調べてみる。

```vb
Sub test()
    Dim c As String
    For i = 0 To 25
        c = Chr(i + 65)
        s = "1" + c + "3"
        If IsNumeric(s) Then
            Debug.Print (s + ": Number")
        Else
            Debug.Print (s + ": String")
        End If
    Next i
End Sub
```

```
1A3: String
1B3: String
1C3: String
1D3: Number
1E3: Number
1F3: String
1G3: String
1H3: String
1I3: String
1J3: String
1K3: String
1L3: String
1M3: String
1N3: String
1O3: String
1P3: String
1Q3: String
1R3: String
1S3: String
1T3: String
1U3: String
1V3: String
1W3: String
1X3: String
1Y3: String
1Z3: String
```

どうもDとEは特別な働きをしているようである。しかしEは指数表記としては有名だけど、Dとはなんぞや？

### ネットの海から拾った情報たち
調べてみると次の質問サイトに手掛かりがあった。

[IsNumeric関数に関連して。](http://www.gizcollabo.jp/vbtomo/log/archive/choshoqa_10830_0.html)

> BASICでは、倍精度実数の指数表現にはD 単精度実数の指数表現にはE が使われていましたが、
Visual Basicでは、共に倍精度浮動小数点型実数値として処理されます。

なるほどなー。昔のBASICの名残なのか。
そう思ったら次のサイトにはどうも違うことが書いてあった。

[VBA, как проще всего определить, число или текст? - Планета Excel](https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=39952)

ロシア語のサイトだけど、翻訳しつつ読むとどうもFortranの名残らしい……。

どっちだ⁉

## さらに昔へ
BASICと検索したらVBのことしか出てこないこの世の中で、素のBASICについて検索するのは骨が折れるが、96年発行の冊子がヒットした。

[文系学生のためのBASIC](https://www.amazon.co.jp/dp/4501524405)

ここの95ページに

>倍精度型実数では、指数部の前にDをつけて次のように表示します．

とある。掲示板に書かれていたのは正しいみたい。

次にFortranで探してみると、次のサイトに記述があった。

[Fortran入門](http://www.nag-j.co.jp/fortran/FI_4.html#Literals)

>倍精度を表す場合には "e" の部分を "d" とします。 

ということでBASICにもFortranにも同様の機能があることがわかった。どちらに影響を受けたのかはともかく(おそらくFortran→BASIC→VBA?)、昔はこうやって単精度と倍精度を区別していたんだなあ、という思わぬ歴史のお勉強になったのでした。
SharePoint のページ上で Skype for Business のプレゼンス情報を表示する方法

#2018年5月26日時点、プレゼンス表示できません・・・
この記事を書いた5月12日時点では、ここで紹介しているコードでプレゼンスが表示されていたのに、今は表示されないです・・・
そもそも、SharePoint Online標準の登録者や更新者のところもプレゼンスが働いてないですね。
何か仕様変更があったのかな？

ということで、この記事は今時点では役に立ちませんので、ご注意ください。


#今となっては当たり前のプレゼンス表示

例えば座席表とか連絡先一覧とかを SharePoint でカスタムで作ろうとなった場合、Skype for Business のプレゼンス情報が出るとかっこいい！
というか、出ないとなんで出ないの！？って言われるくらい当たり前なプレゼンス情報。

どうやったら簡単に SharePoint のページ上に Skype for Business のプレゼンスを出せるのか調べてみました。
#サンプルコード
SharePoint がやっていることを真似するのが一番簡単なので、ブラウザの開発者ツールでソースをのぞいて真似してみたら・・・
あら簡単！　これなら SharePoint 上の色々なところに組み込めちゃいますよ。


```HTML:presence.htm
<span class='ms-imnSpan'>
 <a class='ms-imnlink ms-spimn-presenceLink' href='#' onclick='IMNImageOnClick(event);return false;'>
  <span class='ms-spimn-presenceWrapper ms-imnImg ms-spimn-imgSize-10x10'>
   <img name='imnmark' title='' class='ms-spimn-img ms-spimn-presence-online-10x10x32' id='imn_xxx,type=smtp' alt='presence' src='/_layouts/15/images/spimn.png' sip='aaa@bbb.com' showofflinepawn='1'>
  </span>
 </a>
</span>
<span>及川 紘旭</span></br>
 ```

上記の HTML コードをプレゼンスを表示させたいところに書いてください。
そして、４行目の img タグのid 属性の xxx の部分に任意の一意の値を、sip 属性にプレゼンスを表示したいユーザーの sip id (メールアドレスと同じ値)を入れてください。
そして、最後の span タグにはプレゼンスを表示しているユーザーの名前を入れておきましょう。
これだけで、sip に指定したユーザーのプレゼンスを表示できます。

SharePoint のページ上でとりあえず動きを見てみたいということであれば、
1. 上記のプレゼンス表示の HTML コードを適当なテキストファイルとして保存する。
2. ファイルをドキュメントライブラリにアップロードする。
3. ページにコンテンツエディタ Web パーツを貼り付け、２のファイルのURLを[コンテンツへのリンク]に指定する。
とすることで、簡単に確認できますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/76139/26139d4e-4da8-8e54-2382-1f9d9808887e.png)

ただし、この手法は冒頭でも書いた通り、SharePoint のページ上でしか動作しませんのでご注意ください。
Raspberry pi + irMagicianを使った赤外線リモコン操作

# 目的
部屋のシーリングライトとエアコンのリモコンを頻繁に見失うのでスマホやGoogle homeから制御できるようにしたい

# irMagician
大宮技研 合同会社が作成した赤外線リモコンのコードを保存、出力できるキット
http://www.omiya-giken.com
Serial通信でIRセンサー制御PICと通信を行う。

# システム構成
RaspberryPi -(serial via usb)- irMagician
この構成により、Raspberry Piを中継としたリモコンシステムを構築する

# システム制御
## irMagician仕様
大宮技研のサンプルコードで必要なコードを抜粋する
http://www.omiya-giken.com/?page_id=1231
pythonコード
## 赤外線リモコンをキャプチャー 
  
```
serial.write("c/n") # capture要求 一定時間赤外線を受けなかったらタイムアウト
print(serial.read(3)) # captureに成功したら読み取ったデータ数を１０進数で返す
```  
## キャプチャーしたリモコンを読み出す
先の読み取ったデータ長はi,1で読み出すことが可能。
このデータがPICのメモリ(1bank 64byte)に格納されている



```
irData = []
serial.write("n,1/n")
len_str = serial.read(3)
len = int(len_str, 10)
for i in range(len):
    bank = i / 64
    pos = i % 64
    if (pos == 0):
        serial.write("b,{0}\n".format(bank))
    serial.write("d,{0}\n".format(pos))
    x_str = seria.read(3) 
    data = int(x_str, 16)
    irData.append(data) 
```

## 読み取ったデータを再生（赤外線送信）する

```
len = len(irData)
for i in range(len):
    bank = i / 64
    pos = i % 64
    if (pos == 0):
    	serial.write("b,{0}\n".format(bank)) 
    serial.write("w,{0},{1}\n".format(pos, irData[i]))
serial.write("p/n")
```

これで赤外線リモコンを読み込みから再生までできるようになった。
リモコンデータの読み出し先をファイルにして複数ファイルを交互に入れ替えを行うようにすれば多数のリモコンを一つのRaspberry PiとirMagicianの組み合わせで運用することが可能になる
jQuery.animate() の transform 対応版を簡単に作る

概要
=====

[jQuery.animate()](http://api.jquery.com/animate/) は大変便利ですが、
回転させるために `{ transform: 'rotate(360deg)' }`
とか渡しても `transform` に未対応であるため動きません。
そこで、`tranform` にも対応可能な `animate2()` をパパっと作ってしまいます。


まずは関数作成
================

```js
$.fn.animate2 = function (properties, duration, ease) {
    ease = ease || 'ease';
    var $this = this;
    var cssOrig = { transition: $this.css('transition') };
    return $this.queue(next => {
        properties['transition'] = 'all ' + duration + 'ms ' + ease;
        $this.css(properties);
        setTimeout(function () {
            $this.css(cssOrig);
            next();
        }, duration);
    });
};
```

これだけ。これで jQuery の関数を増やせます。
最低限の実装になってるので必要に応じて、拡張してください。


使い方
=======

```js
$('.something')
    .css({ top: 0 })
    .animate2({ top: '100px' }, 200) //下に移動
    .animate2({ transform: 'rotate(360deg)' }, 200) //１回転
;
```

これだけ。`animate()` の代わりに `animate2()` を使えばOKです。


説明
=======

jQuery の `animate()` の代わりに `transition` を使っています。

`transition` を使うことでアニメーションがスムーズになりうるという良い副作用もあります。
（transition はブラウザに動きを前もって伝えることができ、多くのブラウザで描画の際、GPU で最適化する仕様になっている。）
numpy復習ドリルその1

定期的に復習する用に作成。

# アレイ(ndarray)の作成
1. 1,2,3,4,5,6を要素に持つ1行のアレイを作成せよ
1. [1,2],[3,4],[5,6]を要素に持つ3行2列のアレイを作成せよ
1. 上で作成した3行2列のアレイの行列サイズを表示せよ
1. アレイの次元数のみ表示せよ
1. アレイの型を表示せよ
1. 全データが0である3行3列のアレイを作成せよ
1. 上で作成した全て0のアレイと同じ形（行列）で、全て1のアレイを作成せよ
1. さらに同じ形で空のアレイを作成せよ
1. N=4の単位行列となるアレイを作成せよ
1. 0,1,2,...10の連続したアレイを作成せよ
1. 2,4,6,8,...100というような数列となるアレイを作成せよ
1. 32bit整数型のアレイを作成せよ
1. 倍精度浮動小数点型のアレイを作成せよ
1. その他、numpyで扱えるデータ型は？
1. 32bit整数型で作成したアレイを、倍精度浮動小数点型へキャストせよ
1. ['1.2', '-2.4']という文字列リストからアレイを作成し、全体を単精度浮動小数点型へキャストせよ

# スライシング
1. 1,2,3,4,5,6を要素に持つ1行のアレイを作成せよ
1. 作成したアレイの4番目の要素を取り出せ
1. スライシングを用いて4〜5番目の要素を取り出せ
1. スライシングを用いて4〜5番目の要素を、100に書き換えよ
1. numpyのスライシングについて、pythonのlistとの違いは何か？

# 多次元アレイのインデックス参照
1. [1,2],[3,4],[5,6]を要素に持つ3行2列のアレイを作成せよ
1. インデックス[2][1]の要素(6)を取得する方法を2種類記述せよ
1. [2]の行（[5,6]）を抜き出せ
1. [2]の行を全て100に書き換えよ
1. スライシングを用いて[0]と[1]の行を抜き出せ
1. スライシングを用いて[1]の列を抜き出せ

# ブールインデックス
1. 1,2,3,4,5,6を要素に持つ1行のアレイを作成せよ
1. ブールインデックスのリストを用いて、[0,2,4]のみ取り出せ
1. 「奇数ならば」という条件でブールインデックスのリストを作成し、奇数列を取り出せ
1. 「奇数でないならば」という条件でブールインデックスのリストを作成し、偶数列を取り出せ
1. 奇数列を0に置換せよ

# ファンシーインデックス
1. 下を実行せよ
  * np.arange(20).reshape(5,4)
1. ファンシーインデックスを用いて行[0,3,4]を取り出せ
1. ファンシーインデックス[0,3,4],[1,2,3]を与えるとどのような結果となるか？
Nuxt.jsとFirebaseによるSPA × SSR × PWAでnode_modulesパッケージを追加する際の注意点

## はじめに
この記事は最近話題になってたNuxt.jsとFirebaseで`SPA × SSR × PWA`を実装するという以下の記事を元に進めています

[Nuxt.jsとFirebaseでSPA×SSR×PWA×サーバーレスを実現する](https://inside.dmm.com/entry/2018/04/10/nuxt-firebase)

記事の通りに実装し、`SPA × SSR × PWA`をhello worldすることはできたのですが、その後Firebaseで認証やらを実装しようとしたときに恥ずかしながらハマってしまった点を書きます

## 行おうとしてたこと
- FirebaseのGoogle認証を実装する

## ハマったこと
Google認証自体は以下のコードみたいに書けば非常に簡単に実装できます FirebaseのAuthすごい

詳しくは[公式ドキュメント](https://firebase.google.com/docs/auth/web/google-signin?hl=ja)呼んでください


```js

import firebase from 'firebase'
const config = {
  apiKey: "<API_KEY>",
  authDomain: "<PROJECT_ID>.firebaseapp.com",
  databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
  storageBucket: "<BUCKET>.appspot.com",
  messagingSenderId: "<SENDER_ID>",
}
firebase.initializeApp(config)

const provider = new firebase.auth.GoogleAuthProvider()
firebase.auth().signInWithRedirect(provider) // サインインする 実際はvuexのaction等で利用
```

しかし！Firebase上にデプロイしてみると500errorが。。。

```
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
```

## 原因
原因は`/src`のpakcage.jsonにのみ`firebase`パッケージを追加しており、`/functions`には追加していなかったことでした。

つまりこんな感じにする必要があります

```src/package.json
{
  ...
  "dependencies": {
    "ajv": "^6.0.0",
    "babel-plugin-module-resolver": "^2.7.1",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-stage-0": "^6.24.1",
    "firebase": "^5.0.1", // firebase追加
    "nuxt": "1.0.0-rc11",
    "vue": "2.4.4",
    "vuex": "^3.0.1",
  },
  ...
}

```

```functions/package.json
{
  ...
  "dependencies": {
    "ajv": "^6.0.0",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-stage-0": "^6.24.1",
    "babel-runtime": "^6.23.0",
    "clone": "^2.1.1",
    "debug": "^3.1.0",
    "es6-promise": "^4.1.1",
    "express": "^4.15.4",
    "firebase": "^5.0.1", // こっちにもfirebase追加！
    "firebase-admin": "5.10.0",
    "firebase-functions": "0.8.2",
    "lodash": "^4.17.5",
    "nuxt": "1.0.0-rc11",
    "vue": "2.4.4",
    "vue-meta": "^1.4.4",
    "vue-router": "^3.0.1",
    "vuex": "^3.0.1",
  },
  ...
}

```


今回のような場合ではパッケージを追加する際は、`/src`のpackage.jsonに追加するだけでなく、`/functions`のpackage.jsonにも追加する必要があります。
これは`/functions`のコードがFirebaseのCloud Functions上のサーバーで実行され、最終的にSSRを行うのはFunctionsであるからです。


## 終わりに
ちゃんと元記事を読まなかったために`/funtcions`の役割、つまりFirebaseのCloud functions上で動作するものということを理解せずに使用していたのが根本的な問題でした
はじめにとにかくコピーなりなんなりして動くものを作るのも大切ですが、その後ハマった部分を原因調査するために、改めてきちんとした構造理解をするというステップが学習の上で最も大切な気がしました。

きちんとドキュメント読み直します
マネージャーとしてのミーティング（High OutputManagement引用）

### はじめに　（High Output Management とは）
元インテルのCEOのアンディ・S・グローブ氏が、
経営者や起業家、マネージャー向けに実践的なアドバイスをまとめられた経営書。
著名な起業家や経営者の多くによって賞賛されている。
これまでマネジメントについて学んだ中で、最初に取った一冊「High Output Management（ハイアウトプットマネジメント）」から得るものはとても多かったので、
そこで学んだことのメモを、ファイリングして行きたい。
　
　
# マネージャーにとってのミーティング
ピーター・ドラッカー氏は、マネージャーが25％の時間をミーティングに使っていると、
それは組織不全の兆候だと言っている。
が、一方で、マネージャーの仕事の大部分は、
情報やノウハウの提供、意思決定やその支援であり、いずれもミーティングを通じて遂行されるものであるため、
ミテーィングはマネージャーの仕事そのもの、とも言える。
ミーティングの存在の当否を議論するのではなく、その時間を能率よく使うことに神経を使うべき。
ミーティングには、「プロセス中心のミーティング」と「ミッション中心（使命中心）のミーティング」の2種類がある。
　
## プロセス中心のミーティング
知識の共有化と、情報交換が行われる定期的なミーティング。
代表的なものに、1on1、と、スタッフミーティングというものがある。

### 1on1（ワンオンワン）
マネージャーと部下間のミーティングで、仕事上の関係を維持する重要な方法。
マネージャーから部下へは、スキルやノウハウを伝え、物事のアプローチ方法を提案できる。
部下は、自分が何をやっているか、何に関心があり心配しているかの情報をマネージャーに詳しく伝える場。
開催頻度は部下のタスク習熟度による。部下のタスク習熟度が上がるにつれて、密着した監督のあり方から、
緩やかな監督のあり方へと変化する。
例えば、習熟度が低く経験の少ない部下には週1回。ベテランであれば2、3週に1回とか。

1on1で何を話し合うべきか。
部下が使用しているインディケーター、例えば、受注率や生産量、プロジェクトの状態などを話し合うのも良いが、
重点は、トラブルの存在を知らせてくれるインディケーターに置くべきである。
特に、潜在的な問題については極めて重要で、問題が明白でなくても何かが異常と言った直感にしかすぎない場合でも、
部下としては上司にそのことを率直に告げなければならない。
それが組織のブラックボックスを覗き込むきっかけになるからである。
上司は、部下に何が起こっているのか、困っているのか、を表立って説明するのを助けてやればよくて、
それを知り、コーチングする。
1on1が発揮するテコ作用は大きく、1時間の1on1で、半月や1ヶ月単位での部下の仕事の質を上げる可能性がある。

　
### スタッフミーティング
マネージャーと部下全員が参加する部内会議であり、同僚間での接触や交流が行われる機会となる。
マネージャーは、その場でよく起こる意見交換や対立から物事を知る良い機会ともなる。
スタッフミーティングでは、
出席者3人以上に関係する事柄ならなんでもよく、ミーティングの中で2人だけに影響する問題に限られてきた場合、
その話をやめさせて、他の大勢のスタッフに関係するものに切り替えさせ、
一方で、その2人には後で話し合いを続けるように促す必要がある。
上司は、リーダーや観察者、進行係、質問者、意思決定者の全ての役割を果たすが、
講師役だけは不要である。
それをすると、自由討議を妨げ、ミーティングの基本目的を危うくしてしまうので、注意が必要。
もっとも重要なのは、ミーティングのコントローラであって、
討議を軌道に乗せ、部下を問題の研究と対応への矢面に立たせることである。
　
## 使命中心のミーティング
特定の成果を上げるために、一定の意思決定に到達するようにと企画されるミーティング。
司会者が鍵で、ミーティングの目標（何をする必要があるのか、そういう意思決定をしなければならないのか）をはっきりと理解していなければならない。

臨時の突発的な使命中心ミーティングは招集しないことに越したことはない。
万事がスムーズであれば、定期のプロセス中心ミーティングで全て面倒を見られるはずではあるが、
現実的には全体の20％程度は、使命中心ミーティングを開催せざるを得ない。
　
# 私が学んだこと
1回の1on1でその後の半月や1ヶ月の仕事の質を上下させる可能性があるため、
部下との会話力や、質問力を磨く必要があり、
その中で部下が困っていることを知ることで、しっかりコーチングする能力が求められる。
postgres.appを利用してRailsの開発環境からPostgreSQLを使ってみる

#はじめに
オリジナルアプリ開発を始めるにあたり、SQLiteでなく開発からPostgreSQLを使用してみようと思い作業を始めてみたのですが、思いの外わからないことだらけで色々調べたり試行錯誤をしたので、やったことをこちらでまとめてみました。

##開発環境
macOS High Sierra 10.13.4
Ruby 2.5.0
Ruby on Rails 5.2.0

##postgres.app
PostgreSQLを使うにはローカルにPostgreSQLが使える環境がないとダメだということがわかりました。
調べたところ、postgres.appはインストールして起動するだけで簡単にPostgreSQLが使えるということで導入してみました。

###ダウンロードとインストール
下記からpostgre.appをDLして、アプリケーションフォルダに移動します。
http://postgresapp.com/

###起動してコマンドラインツールを使用できる様にする

postgre.appを起動して右の方にある`initialize`のボタンを押すと使えるようになります。
そのあとターミナルで下記を実行。
実行するとPostgres.appで提供されているコマンドラインツールを使用できるようになります。

```
$ sudo mkdir -p /etc/paths.d &&
echo /Applications/Postgres.app/Contents/Versions/latest/bin | sudo tee /etc/paths.d/postgresapp
```

途中パスワードを求められたら入力します。

###pgのインストール

Rubyで使うには下記を実行しろと書いてあったので、実行して`gem pg`をインストールします。

```
$ sudo ARCHFLAGS="-arch x86_64" gem install pg
```

##Railsで新しいアプリを作成する

データベースにPostgreSQLを指定して新しくアプリを作成します。

```
$ rails new [YOUR_APP_NAME] -d postgresql
```
`config / database.yml`を下記の通り変更します。

```config/database.yml
development:
    adapter: postgresql
    database: [YOUR_DATABASE_NAME] #下記で新しく作成するDBの名前を入力、もしくは既存のDBを指定
    host: localhost
```

##PostgreSQLに新しいDatabaseを作成

今回はアプリ用に新しいデータベースを作成することにしました。
ターミナルからPostgreSQLに接続します。

新しくユーザーを作った方がいいかどうかがわからなかったのですが、調べたらあとで所有者の変更ができそうなので今回はpostgresで作成しました。

```
$ psql -U postgres

postgres=# create database [YOUR_DATABASE_NAME];
CREATE DATABASE
```
`CREATE DATABASE`と表示され、postgres.appに戻って見るとデータベースが作られています。
次回からはpostgres.appでDBをダブルクリックすると接続できます。

##サーバーを立ち上げてみる

```
$ rails s
```
サーバーを立ち上げてアクセスしたら、無事Railsの画面が表示されました。

##おまけ
無事Railsの画面が表示されたものの、このまま進めるのも不安だったためscaffoldでサンプルアプリを作成してDBに登録てみました。

<img width="946" alt="users_–_sample_–_sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/242529/4061668b-bab6-58ca-6086-028d17f4f789.png">


確認したところちゃんと反映されていたので、本当にこれで終わりとします。

ちなみに上記画像はPostgreSQLのGUIツール[Postico](https://eggerapps.at/postico/)です。
なんとなくこちらも入れてみましたが中身がサクッと見れて良いかも…と思ってます。

##まとめ

- RailsやRubyと同じようにデータベースもローカルに環境構築が必要
- 今回はアプリで代用したがHomebrew経由でDLしてインストールするやり方もある
- もう少しPostgreSQLについても学ぶ必要がある

ローカルの開発環境について知らないことが多すぎて調べるのに1日がかりと、膨大な時間がかかってしまいました…。
なんとか動くところまで持ってこれましたが、もう少し色々な仕組みを理解する必要があるなと感じました。

おかしなところなどございましたらご指摘頂けますと幸いです。

---

参考：
[起動するだけで使えるPostgres.appでのDB作成](https://qiita.com/Tomcruiseikemen/items/b832f2d26c00b77fa00f)
[Ruby on Railsの開発環境でPostgreSQLを利用する](https://qiita.com/taKassi/items/8e43171aeda300b67213)
ピアノを弾きこなすように仕事を進められる便利ツール集（随時更新）

必要ではないけど、あると仕事がスマートに進むツール集。
後輩エンジニアを持つ年齢になってきたので、
リンク1つでシェアできる記事をつくりました。
ピアノを弾くように、スムーズにPCを操作したい。

#対象者
・PC作業の高速化に情熱がある人
・ツールのことをあまり知らない新人エンジニア
#1.everything
https://forest.watch.impress.co.jp/library/software/everything/
高速ファイル検索ツール。
Windows最速です。
Macで言うところのAlfread。

自分は「Alt+Q」で立ち上がるようにホットキー設定しています。
実行回数で昇順ソートすると、よく使うファイルが上に来て便利です。

検索ウィンドウから、
「ファイルをコピー/切り取り」
「ドラッグ&ドロップ」
もできます。
これが非常に便利です。

**everythingの機能**
>![everything_awesome.gif](https://qiita-image-store.s3.amazonaws.com/0/228301/74869745-869b-73a1-e2f8-afb6dd6d25a0.gif)
>・ファイルを名前で検索できる
>・そのままドラッグ&ドロップやファイルのコピーもできる
>・拡張子指定もできる




#2.f.lux
https://justgetflux.com/
疲労軽減ツールです。
モニタのブルーライトをカットしてくれます。

「高速化じゃない」という声がありそうですが、
私は高速化ツールだと考えています。

良いコードを書くためには、
高い集中力を保つ必要があります。
疲れたままコーディングすると、バグを仕込みます。
結果、大幅な時間のロスになるのです。
疲労対策は侮れません。

ブルーライトは目を疲れさせ、集中力を落とします。
絶対にカットすべきです。

#3.XMind
https://jp.xmind.net/download/
思考を加速させるツール。
マインドマップで情報を分解し、階層的に整理します。

「わかんないな…」

と手が止まっているとき、
大きすぎる問題を扱っている場合が多いです。

問題を分解してシンプルにしていくと、
思考が進み始めます。
#4.Phraseexpress
https://www.phraseexpress.com/
文字入力支援ツールです。
クリップボードを100件以上記憶して、検索もできます。

変数名やコマンドをコピーするとき、非常に便利です。
自分は「,,」でクリップボード履歴が起動するように設定しています。

**Phraseexpressの機能①クリップボード拡張**
>![phraseexpress awsome.gif](https://qiita-image-store.s3.amazonaws.com/0/228301/afcfbda3-1078-3b28-1dfa-f13ae860cd31.gif)
・履歴を1件ずつさかのぼれる
・履歴を検索できる

Phraseexpressには、他にも様々な機能があります。
たとえば、定型文登録機能もあります。
これを利用すると、下のように穴埋め形式で文章を書いたりできます。

**Phraseexpressの機能②定型文登録**
>![phraseexpress awsome 2.gif](https://qiita-image-store.s3.amazonaws.com/0/228301/66527ba7-2c5d-9600-4133-4dd56a21eaed.gif)
>・定型文を穴埋め形式で入力できる
>・定型文の自動入力が終わった後の、カーソルの位置を指定できる

この機能は、プログラミングでも大活躍します。
実はこのツールだけで何件でも記事が書けるほど多機能です。
また別の機会に書きます。


#5.ScreenPresso
https://www.screenpresso.com/ja/
多機能キャプチャツール。
「赤枠で囲む」「吹き出しを出す」「番号を振る」
など、よく使う機能が揃っています。

最新のキャプチャ100件以上を自動で保存しておけます。
既定値を超えたら古い順で削除してくれます。

#6.ScreenToGif
GIF画像を作成できるツール。
この記事で使っているGIF画像も、これで作っています。

GIF画像は最速で手順を伝えられます。
まさに「百聞は一見に如かず」です。
情報を速く、正確に伝えるスキルは仕事を加速させます。

詳しくはこちらの記事で書いたので、
よければご覧ください。
>手順をシェアするとき、「gif画像+文字」でやるととても楽だった
>https://qiita.com/konkipiano/items/6c01fe1664b61cdb90af

#7.SnapTimer
https://dan.hersam.com/software/snaptimer/index.html
軽量なタイマーです。
作業時間を計測することは高速化の基本です。

「15分でこれをやる！」

というように、時間枠を設定すると集中しやすいです。

また、時間設定は
「ギリギリ達成できるかも」
くらいにすると良いです。

余裕を持って設定すると、
「ちょっと罫線をキレイにしちゃお」
などムダな作業を始めてしまうことがあるためです。

詳しくは「パーキンソンの法則」を参照ください。
>パーキンソンの法則
>https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%BD%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87


#おわりに
くり返す作業を高速化するメリットは、
かけ算で表れます。

1回あたり**5秒**速くなるだけでも、
その作業を1日100回繰り返すなら1日**約8分**の短縮です。

それが1年だと、**丸2日分**の節約になります。

そういうノウハウを15個知っていると、
1年で**1ヶ月分**も時間が増えます。

キャリア人生の早いうちに作業を高速化しておくと、
人生の時間を大幅に増やせると考えています。

自分はエンジニアとしても、ピアノ弾きとしても、成長を続けたいです。
そのため、これからも作業の高速化に手を抜けません。

「もっと能力を高めたい」
「自分の時間を取りたい」

そういうことに情熱がある人は、
ぜひ作業の高速化にフォーカスしてみましょう。

（ここで挙げているもの以外にも、
便利なものがあったらぜひ教えて頂きたいです！！）

おわり
機械学習プロジェクトの進め方：『Machine Learning Yearning』19章（スタンフォード大学Andrew Ng教授）

現在、AIや機械学習界隈で最も有名なスタンフォード大学のAndrew Ng教授が、「Machine Learning Yearning」というオンライン書籍を執筆中です。2018年4月に、そのドラフト版（1-22章）がオンラインで公開中です。この投稿では、いち早く翻訳を進めています。

http://www.mlyearning.org/
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/188414/741778bb-9523-9feb-736b-6bd5aedc42e6.png)

この本は、機械学習プロジェクトの構築方法を提供します。また、機械学習アルゴリズムを教えるのではなく、機械学習アルゴリズムが機能する方法に焦点を当てています。

本投稿は、**17-18章**の翻訳になります。少しづつ翻訳していきます。※翻訳違っていたらご指摘ください。
本書籍は、とても読みやすく、かつ各章短めに記載されています。

##### **1～5章の翻訳**
[【Draft版公開】Machine Learning Yearning 1～5章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/2096b8806a20c8ca52be)

##### **6章の翻訳**
[【Draft版公開】Machine Learning Yearning 6章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/8ddf5f01a33bb049a907)

##### **7-8章の翻訳**
[【Draft版公開】Machine Learning Yearning 7～8章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/94a73dcba8bdde25e48b)

##### **9-10章の翻訳**
[【Draft版公開】Machine Learning Yearning 9～10章 by stanford大学Andrew Ng教授](https://qiita.com/Ishio/items/f074a6609ae034762150)

##### **11-12章の翻訳**
[【Draft版公開】Machine Learning Yearning 11～12章 by stanford大学Andrew Ng教授]
(https://qiita.com/Ishio/items/35c756e073a1f2f1d244)

##### **13-14章の翻訳**
[機械学習プロジェクトの進め方：『Machine Learning Yearning』13-14章（スタンフォード大学Andrew Ng教授）](https://qiita.com/Ishio/items/fae27dfe943195836932)

##### **15-16章の翻訳**
[機械学習プロジェクトの進め方：『Machine Learning Yearning』15-16章（スタンフォード大学Andrew Ng教授）](https://qiita.com/Ishio/items/443939dffd99cea51592)

##### **17-18章の翻訳**
[機械学習プロジェクトの進め方：『Machine Learning Yearning』17-18章（スタンフォード大学Andrew Ng教授）](https://qiita.com/Ishio/items/917b484c821b438682c7)

## **19. Takeaways: Basic error analysis（要点：基本的なエラー分析の考え方）**
* 新しいプロジェクトを開始したら、特にあなたが専門ではない領域にいる場合には、最も有望な方向性を推測してプロジェクトを正確に動かすことは難しいです。
* そこで、完璧なシステムのデザイン・構築から始めるのはやめましょう。代わりに、ベーシカルなシステムを迅速に構築し訓練しましょう。できれば数日以内に。次にエラー分析を利用して、最も有望な方向性（アイデア）を特定し、反復的にあなたのアルゴリズムを改善していきます。
* アルゴリズムが誤分類した100件未満の開発セットのサンプルを人手で検査し、主要なエラーカテゴリを数えることによって、エラー分析を実行してください。この情報を利用して、どのタイプのエラーを修正するか、優先順位付けを行います。
* 開発セットを「目玉の親父開発セット※」と「ブラックボックス開発セット」の2つサブセットに分けることを検討してください。もし、「目玉の親父開発セット」のパフォーマンスが、「ブラックボックス開発セット」よりもとても優れている場合、前者のサブセットに対してオーバーフィットしているので、さらにデータが必要になることを検討してください。
  - 目玉の親父開発セット：手動で検査する用　※目玉の親父<- 意訳です。
  - ブラックボックス開発セット：手動で検査しない用
* 「目玉の親父開発セット」は、アルゴリズムの誤分類を検査するに十分大きいサイズにするべきです。「ブラックボックス開発セット」は多くのアプリケーションにとって、1,000～10,000サンプルあれば十分です。
* あなたの開発セットが上記のようにサブセットに分割するに十分なサイズではない場合には、人手でのエラー分析・モデル選択・ハイパーパラメーターの調整のために「目玉の親父開発セット」だけを使います。
log4jsでログのTimestampにTが入るのを直す


## 課題

特に意識してなかったのですが、下記のように書いて、ログを出力すると、

```js:index.js
const log4js = require('log4js');
const logger = log4js.getLogger();

logger.level = "debug";
logger.debug("hoge");

```

日付と時間の間にTが入っています。まあ、大した問題ではないのですが、ログの加工をするときに邪魔なので消したい。

```bash
[2018-05-12T17:24:17.873] [DEBUG] default - hoge
```

これは標準で、ISO8601が適用されているから・・・だそうです。


## 直す方法

log4js.configure()にてフォーマットを設定してやる必要があるようです。

```js:index.js
const log4js = require('log4js');
const logger = log4js.getLogger();

//指定
log4js.configure({
    appenders: {
        out: {
            type: 'stdout', //コンソールに出力
            layout: {
                type: 'pattern',
                pattern: '%[[%d{yyyy-MM-dd hh:mm:ss.SSS}] [%p] %c -%] %m',
            }
        }
    },
    categories: {
        default: {
            appenders: ['out'],
            level: 'debug'
        }
    }
});

logger.level = "debug";
logger.debug("hoge");

```

そうするとTが消えました。

```bash
[2018-05-12 17:30:19.122] [DEBUG] default - hoge
```

### fileに出力する時

ファイルに出力するときは、カラーブロック設定 %[  %]に意味がないので（たぶん）消します。

```js
"pattern": "[%d{yyyy-MM-dd hh:mm:ss.SSS}] [%p] %c %m"
```

### 参考

パターン含めたlog4jsの利用方法は[ここ](https://garafu.blogspot.jp/2016/07/how-to-use-log4js-on-nodejs-express.html)が非常に参考になります。
【言語学習メモ】FizzBuzz

#JavaScript

```javascript:fizzbuzz.js
const seq = 100
let result = []

for ( var i = 0; i <= seq; i ++ ) {
    if ( i == 0 ) {
        out = i.toString()
    } else if ( i % 3 == 0 & i % 5 == 0 ) {
        out = 'FizzBuzz'
    } else if ( i % 3 == 0 ) {
        out = 'Fizz'
    } else if ( i % 5 == 0 ) {
        out = 'Buzz'
    } else {
        out = i + ''
    }
    // 配列に要素を追加
    result[i] = out
}
// 結果を表示
console.log(result)
```
#Swift

```swift:fizzbuzz.swift
let seq: Int = 100
var result: [String] = []
var out: String

for i in 0 ... seq {
    if i == 0 {
        out = String(i)
    } else if i % 3 == 0 && i % 5 == 0 {
        out = "FizzBuzz"
    } else if i % 3 == 0 {
        out = "Fizz"
    } else if i % 5 == 0 {
        out = "Buzz"
    } else {
        out = String(i)
    }
    
    result.append(out)
}

print(result)
```

#Python

```python:fizzbuzz.py
seq = 100
result = []

for i in range(seq):
    if i == 0:
        out = str(i)
    elif i % 3 == 0 and i % 5 == 0:
        out = 'FizzBuzz'
    elif i % 3 == 0:
        out = 'Fizz'
    elif i % 5 == 0:
        out = 'Buzz'
    else:
        out = str(i)

    result.append(out)


print(result)
```
オフラインリアルタイムどう書く過去問(第26回)

問題はこちら->http://nabetani.sakura.ne.jp/hena/ord26tribo/
以前に解いていた問題です。
上からX段目までの三角形の数がXの二乗ですので、計算で解きました。
n個めの三角形の位置を求めるのに、計算しやすいようにn-1の平方根を求め、後で補正しました。
（補正しなくても偶奇が変わるだけですが）
初期の各色の数は三角形の数と同じで、三角形の辺の重なる部分（右隣、下）の色を2ずつ減らしていきます。

```Prolog
pos(N,[X,Y]):-X0 is floor(sqrt(N-97)),Y is N-96-X0*X0,X is X0+1. %uekara X, hidarikara Y banme

del([],G,R,B,G,R,B).
del([[X,Y]|T],G,R,B,GR,RR,BR):-1 =:= Y mod 2,!,                     %yokoni kisuu banme,
       Y1 is Y+1,(member([X,Y1],T)->R1 is R-2;R1=R),                %migidonari ni sankaku
       X1 is X+1,(member([X1,Y1],T)->B1 is B - 2;B1=B),             %sita ni sankaku
       del(T,G,R1,B1,GR,RR,BR).
del([[X,Y]|T],G,R,B,GR,RR,BR):-                                      %yoko ni guusuu banme
       Y1 is Y+1,(member([X,Y1],T)->G1 is G-2;G1=G),                 % mgidonari ni sankaku
       del(T,G1,R,B,GR,RR,BR).

start:-str(S),split_string(S,"\s,\n","\s",L),pre(L),!.
        
pre([]):-!.
pre([_,B,C,D,E|T]):-
       string_codes(B,L),maplist(pos,L,R),length(R,N),
       del(R,N,N,N,GR,RR,BR),maplist(number_chars,RE,[C,D,E]), %kaku iro nokazu = sankakukeino kazu
       (RE==[RR,GR,BR]->Str=" pass";Str=" fail"),write(Str),write(" "),writeln([RR,GR,BR]),pre(T).
        
str("0       bdelmnouy       5,7,9
1       a       1,1,1
2       q       1,1,1
3       t       1,1,1
4       i       1,1,1
5       fg      2,0,2
6       gh      0,2,2
7       gm      2,2,0
8       fgh     1,1,3
9       fghm    2,2,2
10      fhm     3,3,3
11      bdfhjprx        8,8,0
12      abcdfghm        4,4,0
13      jklmqrst        0,4,4
14      klmntuvw        4,0,4
15      abcdefghijklmnopqrstuvwxy       5,5,5
16      abcdefghijklmnoqrtvwxy  6,8,4
17      abdefhijklnoprstvwxy    10,8,4
18      acegikmoqsuwy   13,13,5
19      bdfhjlnprtvxy   13,11,1
20      abdegijlnpqsuwy         15,15,15
21      aefghiqrstuvwxy         3,3,15
22      cfhkmoqrstuvwxy         7,7,15
23      cfhkmortvx      10,10,10
24      no      0,2,2
25      pwy     3,3,3
26      iqwy    4,4,4
27      lopuv   3,3,5
28      abdjtw  6,6,6
29      fgpstux         5,3,5
30      dijlnotv        6,8,2
31      bdefkmpwx       5,9,3
32      bfghjlmuwx      4,8,6
33      befghlopqrw     5,7,9
34      bfgjklmnqsux    8,6,8
35      fijklnpqstvwy   9,9,9
36      abcdfgilmnrsuv  8,6,6
37      abcdegijklnpruw         11,11,9
38      efgijkmnopqrtvwx        6,8,4
39      abcdefghilopqrtwy       9,9,7
40      abfghklmopqrsuvwxy      8,6,12
41      abcdeghklmoprstuwxy     9,7,7
42      abcdehijklmnopqrtwxy    8,8,6
43      acdefghimnopqrstuvwxy   7,3,9
44      abcfghijklmnopqrtuvwxy  6,6,6
45      abcdefghijklmnoqrstuwxy         5,7,7
46      abcdeghijklmnopqrstuvwxy        6,6,6").
```
UICollectionViewCellを継承して実装した時の罠

contentViewを使わないとダメらしい。

```
class MyCollectionViewCell: UICollectionViewCell {
    let image = UIImageView()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        picture.frame = contentView.frame
        self.contentView.addSubview(picture)
    }
```

ダメな例だと同じセルが沢山出たり、背景色だけで何も出なかったりして悲惨なことになります。
非常に分かりにくくてはまったorz

ストーリーボード経由でやってる人にはあんまし縁のない話かとは思います。

これはダメな例

```
class MyCollectionViewCell: UICollectionViewCell {
    let image = UIImageView()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        picture.frame = frame
        self.addSubview(picture)
    }
```
TexLiveのインストールエラー(Windows 10)

済みません、ただのメモ書きです。
Windows 10へTexLiveをインストールした時のエラー「error; for better info, unpack」

以下で解決

install-tl-windows.exeを管理者権限で実行して「Unpack only」を選択
Destination Folderで「C:\temp\texive」※どこでも大丈夫かも。。

cmdを管理者権限で実行し、install-tl-windows.batを実行
※管理者権限が必要かどうか確認していません。
※「install-tl-windows.bat」と「install-tl-advanced.bat」の違いは知りません。
Google Code Jam 2018 Qualification Round - Saving The Universe Again

# 復習 & Haskellの学習

頭の体操を兼ねて、Haskellでの解法を考えてみています。

が、あまりHaskellならではの実装をできていない気もします…

# テンプレート

## parse :: [String] -> [Data d]
入力行をStringの配列で受け取って、問題データの配列を出力する
Stringの配列から必要な分だけ使って問題データに変換し、あとは末尾再帰

## solve :: Data d -> String
問題データを受け取って、解答の文字列を出力する

# 方針

一番後ろの'CS'をひっくり返すのが、1手で最大のダメージを減らす方法
ダメージ以下になるまで繰り返し（再帰）して回数を調べる
ひっくり返せなくなったらIMPOSSIBLE

# 実装

```gcj.hs
import Control.Monad

parse :: [String] -> [(Int, String, Int)]
parse (x:xs) = ((\(n:ls:_) -> (read n, ls, 0)) $ words x) : parse xs

cost = foldl fn (0,1,-1,-1,0)
        where fn (d,c, lcs, lc, n) t
                | t == 'C' = (d, c*2, lcs, n, n+1)
                | t == 'S' = (d+c ,c, lc, lc, n+1)

solve :: (Int, String, Int) -> String
solve (n, ls, hk) =
    case cost ls of
        (d,_,_  ,_,_) | d <= n  -> show hk
        (_,_,lcs,_,_) | lcs < 0 -> "IMPOSSIBLE"
        (_,_,lcs,_,_)           -> solve (n, take lcs ls ++ "SC" ++ drop (lcs+2) ls, hk+1)

main = do
    n  <- readLn
    xs <- getContents
    forM_ (zip [1..n] $ parse $ lines xs) $ \(i,d) ->
        putStrLn $ "Case #" ++ show i ++ ": " ++ solve d
```

## parse
この問題では1 Case = 1行なので、(x:xs)でパターンマッチして変換するだけ

## cost
タプルの構造は、(合計ダメージ, 攻撃チャージ, 最後に'CS'が出てきたIndex, 最後の'C'のIndex, 現在のIndex)
3番目の項目は、ダメージを減らす一手を行う場所を求めるためのもの
後ろ2つは3番目の項目を決めるためのもの

## solve
'CS'が見つからなくなるか、合計ダメージが指定以下になるまでダメージを減らす手を繰り返す
'CS'をひっくり返すので、その前後を取ってきて'SC'を挟めば良い

# おまけ
mainは固定なのでpointfreeにしてみるのも面白いのですが、
まったく読めなくなりますね…

```pointfreemain.hs
main = (getContents >>=).(mapM_ printCase .).(. (parse.lines)).zip.enumFromTo 1 =<< readLn
    where printCase (i,d) = putStrLn $ "Case #" ++ show i ++ ": " ++ solve d
```

# 再帰 -> unfoldr に置き換え版

ダメージ量を減らしながら文字列を変化させていって変化させられなくなったら生成を止める -> これってunfoldrを適用できね？、ということでやってみた

ついでにfoldlをfoldl'に変更

```gcj.hs
import Control.Monad
import Data.List

parse :: [String] -> [(Int, String)]
parse (x:xs) = ((\(n:ls:_) -> (read n, ls)) $ words x) : parse xs

cost :: String -> (Int, Maybe String)
cost str =
    case foldl' fn (0,1,-1,-1,0) str of
        (d,_,lcs,_,_) | lcs < 0 -> (d, Nothing)
        (d,_,lcs,_,_)           -> (d, Just $ take lcs str ++ "SC" ++ drop (lcs+2) str)
        where fn (d,c, lcs, lc, n) t
                | t == 'C' = (d, c*2, lcs, n, n+1)
                | t == 'S' = (d+c ,c, lc, lc, n+1)

solve :: (Int, String) -> String
solve (n, ls) =
    case findIndex (<= n) $ unfoldr (cost <$>) Just ls of
        (Just i) -> show i
        Nothing  -> "IMPOSSIBLE"

main = do
    n <- readLn
    xs <- getContents
    forM_ (zip [1..n] $ parse $ lines xs) $ \(i,d) ->
        putStrLn $ "Case #" ++ show i ++ ": " ++ solve d
```

## costがMaybe(a, b)を返さず、(cost <$>)をunfoldrに与えている理由

unfold :: (b -> Maybe (a, b)) -> b -> [a]

a <- ダメージの計算結果
b <- 一番後ろの'CS'をひっくり返した文字列, もうひっくり返せないならNothing

b -> Maybe (a, b)について f Nothing -> Nothing
-> これってMaybeの定義そのものじゃね？
Windows10 で、Dockerで環境作る際の　ESETのファイアーウォール設定

#概要
Docker で　Ruby On Rails の環境を作ろとして、
ESETのファイアーウォールの設定にはじかれたので、
ESETの設定方法をメモします。

#設定方法
@tomoki さんがコメント欄に書いてくれた通り、以下のサイトを見て設定するとすぐ終わる。
[https://stackoverflow.com/questions/42203488/settings-to-windows-firewall-to-allow-docker-for-windows-to-share-drive/42955491#42955491](https://stackoverflow.com/questions/42203488/settings-to-windows-firewall-to-allow-docker-for-windows-to-share-drive/42955491#42955491)

#経緯
Dockerで、「docker-compose up」ってやったら、「/app/Gemfile not found」って、エラーが出た。
<img width="674" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/256696/8ed198e7-58c8-0425-2c97-14911f8c1720.png">

色々調べてみると、なんだか　Docker　の　Shared Drives　が、ファイアウォールの影響で、機能していないようだった。

Firewall detected
A firewall is blocking file Sharing between Windows and the containers. See documentation for more info.
<img width="629" alt="無題3.png" src="https://qiita-image-store.s3.amazonaws.com/0/256696/2f306c22-65d7-4d84-718c-b13e0121c24c.png">

私のファイアウォールは、ESET（セキュリティソフト）が行っていて、
そいつに、除外設定みたいなのをしないといけないようだった。

#以下、でもできますが、上のサイトの方法が一番簡単です。

#設定内容
設定については、以下のサイトを参考にした。
https://blog.olandese.nl/2017/05/03/solve-docker-for-windows-error-a-firewall-is-blocking-file-sharing-between-windows-and-the-containers/

私の場合は、
「セキュリティが強化されたWindows Deffender ファイアーウォール」-「受信規則」の
「DockerSmbMount」を、ESETにも適用することで解決した。
※Windowsファイアウォールについては、Dockerをインストールした際？に設定ができてた。
<img width="768" alt="無題4.png" src="https://qiita-image-store.s3.amazonaws.com/0/256696/5c929f55-984e-b832-215c-3c64a37b911d.png">
<img width="657" alt="無題5.png" src="https://qiita-image-store.s3.amazonaws.com/0/256696/21fa5a91-4857-f7d9-afe1-cc1052d6ba03.png">

##ESETの設定
「設定」-「ネットワーク保護」-「パーソナルファイアウォール」-「設定」-「ルール（詳細タブ）」で設定する。
設定は、以下の画像の通りで、Windows側にできてた「DockerSmbMount」の設定をコピーしたら行けた。
<img width="1218" alt="無題6.png" src="https://qiita-image-store.s3.amazonaws.com/0/256696/66363b6e-d128-2d29-c2ac-38c0007e7f59.png">

#まとめ
ただ、簡単に環境を作りだけなのに、意味わからんエラーで、めちゃ時間とられました。。。
Preziで好きな日本語フォントを使う

Preziすごいとのことなので試してみました。

##新時代のプレゼンアプリ[__Prezi__](https://prezi.com/ja/)
PowerPointを煽っています。
![スクリーンショット 2018-05-12 15.29.53.png](https://qiita-image-store.s3.amazonaws.com/0/222267/ba163de8-c995-c180-debc-5423f2b6de6f.png)

## 何がすごいのか
以下の4枚のスライドがあります。
![スクリーンショット 2018-05-12 15.36.52.png](https://qiita-image-store.s3.amazonaws.com/0/222267/c9aa132d-c1cf-5567-1734-616fa4aaf2e2.png)

![スクリーンショット 2018-05-12 15.37.21.png](https://qiita-image-store.s3.amazonaws.com/0/222267/f500048a-c820-5281-b73f-366b4fbbe2e2.png)

![スクリーンショット 2018-05-12 15.37.27.png](https://qiita-image-store.s3.amazonaws.com/0/222267/cc5e8035-6d4b-63d0-688f-835ad72202f5.png)

![スクリーンショット 2018-05-12 15.37.37.png](https://qiita-image-store.s3.amazonaws.com/0/222267/fbf00d84-37f4-0d7a-30c8-b678ea54eb4d.png)

このように動きます。
![prezi_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/222267/384be9ac-55f0-8865-2e6d-d20d60a7117a.gif)

初めて見た時には驚きました。
スタイリッシュな感じがしますよね。

## 基本的な考え方
Preziではオブジェクトを1枚の大きな紙にぺたぺたと貼っていき、
①どの場所を
②どの順で
③どんな視覚効果で
画面に表示するかを設定します。
※上記のgifでも一瞬全体が映りますが全てのスライドが見えるかと思います。

スライド全体像
![スクリーンショット 2018-05-12 16.49.17.png](https://qiita-image-store.s3.amazonaws.com/0/222267/6c94d672-6ba4-8c3b-65c4-e78ede13d71a.png)

## 弱点
__使用できる日本語フォントが少ない。（実質使えない）__

XANO明朝フォントのみが選択できるのですが・・・
![スクリーンショット 2018-05-12 15.55.11.png](https://qiita-image-store.s3.amazonaws.com/0/222267/cc71ba62-3bbf-c6e2-20d9-3aee9a63e504.png)

このように非常に個性的なフォントです。
![スクリーンショット 2018-05-12 16.00.40.png](https://qiita-image-store.s3.amazonaws.com/0/222267/49e8a3d7-74ac-12a7-69fa-f973356b787b.png)

## 日本語フォント問題解決策
そこで解決策を調査した結果、ベストプラクティスは見つかりませんでした。
だから私は自分で考えました。

__keynoteを使用する__
①以下のようにいつも通りスライドを作る。
![スクリーンショット 2018-05-12 16.09.08.png](https://qiita-image-store.s3.amazonaws.com/0/222267/1990b429-de0f-b1f5-16db-aec7cf53deee.png)
②KeynoteからPreziにドラッグ&ドロップ
![prezi_demo_02.gif](https://qiita-image-store.s3.amazonaws.com/0/222267/a111cf6c-9905-cfb0-11eb-0f51de71d706.gif)

結局以前のアプリ使うのかよと思うかもしれませんが、スライドをよりかっこよくするための動作環境だと思えばいいのではないかと思います。

## 感想
他のアプリを使わないといけないのは難点ですが、作っていて楽しいですよ。
「スライドに過度なエフェクトを付与するな」という時代は終わったのかもしれません。
Vapor 3.0 でワーキングディレクトリのファイルにアクセスする

Vapor 3.0 でワーキングディレクトリのファイルにアクセスしたい場合は `DirectoryConfig` struct を利用する。

例えば、`Public/sources` に markdown のファイルを格納しておき、プログラム中からそのファイルを利用したい場合を考える。

```
...
├── Public
│   └── sources
│       ├── foo.md
│       └── bar.md
...
```

`DirectoryConfig` は vapor/core で定義されている struct であり、実装は[ここ (2018/05/12 現在)](https://github.com/vapor/core/blob/a909eccc41941faac6fb9e511cdb9a5cb30a05de/Sources/Core/DirectoryConfig.swift)。

これを見るとわかるように、`detect` という静的関数を利用してオブジェクトを生成し、そのときにプロジェクトのルートディレクトリがデフォルトのパスとして `workdir` プロパティに設定される。

したがって、上記の `Public/sources/` にあるファイルにアクセスしたい場合は以下のようにする。

```swift
let directoryConfig = DirectoryConfig.detect()
let sourceDir = URL(fileURLWithPath: "\(DirectoryConfig.detect().workDir)Public/sources")

let fm = FileManager()

guard let files = try? fm.contentsOfDirectory(at: sourceDir, includingPropertiesForKeys: nil) else {
    throw Abort(.internalServerError) // エラー
}

// ファイルに対する処理…
```

ちなみに、`Public/` のファイルをサーブするために利用する `FileMiddleware` も内部的には `DirectoryConfig` 利用しているようだった。
Universal Links の画面左上の遷移元アプリ名がずれる

ディープリンクの仕組みとして iOS9 で導入された Universal Links ですが、
アプリ遷移時に、画面左上のボタンからアプリの遷移元に戻れるようになっています。

これ↓

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49010/5c9a6b95-981d-cb53-0ce0-ed492d10ebb4.png)

この文字の表示位置がずれていた

こんなんOSのバグか何かじゃない？　と思っていたのですが違くて、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49010/bbe9f4da-c9cf-7515-aa67-9c0782af1b22.png)

Targets の Display Name に改行が入ってました

Hoge
Fuga

みたいな　ここ改行入るのかよ

いつ混入したんだ… ホーム画面には1行目しか表示されないので見過ごされてました

2行目を取り除いて解決

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49010/ac8a1793-13c5-4cd1-b8eb-34123688cffd.png)

こんなこと滅多に無いと思いますが、同様の症状で適当にググってこの記事にたどり着く方がいたら幸い