OmniAICreator/Qiita-1.07M huggingface dataset:
まっさらの状態のwindowsでdockerを始める手順

Docker for Windows は Windows10 Pro でなければ使えません。
Windows8 はもちろん、Windows10 Home でも使用することはできません。
こうした場合、仮想マシンとして Linux を建てて、そこに Docker をインストールする必要があります。

以下、手順を説明します。

まずはもろもろをインストールします。
インストーラーを下記URLよりダウンロードしてインストールします。

■ Virtual Box（仮想化ソフト）
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

■ Vagrant（仮想化ソフト）
https://www.vagrantup.com/downloads.html

■ git（分散型バージョン管理システム）
https://git-scm.com/download/win

■ Visual Studio Code（テキストエディタ）
https://code.visualstudio.com/download



Visual Studio Codeの 設定をします。
デフォルトのターミナルを「コマンドプロンプト」から「git bash」に変更します。
[ファイル] > [基本設定] > [設定] > [ユーザー設定] に設定を追加します。

```json
{
    "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe"
}
```

Visual Studio Codeにターミナルを表示させます。
[表示] > [統合ターミナル] > [ターミナル] で表示させます。

ターミナルで作業をしていきます。

```bash
# 作業フォルダの作成
$ mkdir ~/Documents/DockerProject

# 作業フォルダに移動
$ cd ~/Documents/DockerProject

# アドオンのインストール
$ vagrant plugin install vagrant-vbguest

# Vagrantfileの作成
$ vagrant init ubuntu/xenial64
```

作成されたVagrantfileを編集します。
46行目あたりです。

```diff:Vagrantfile
- # config.vm.synced_folder "../data", "/vagrant_data"
+ config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
```

編集をしたらターミナルでの作業に戻ります。

```
# 仮想マシン起動（初回は時間が掛かります）
$ vagrant up

# 仮想マシンにログイン
$ vagrant ssh

# 仮想マシンにgitのインストール
$ sudo apt-get update
$ sudo apt-get install -y apt-file
$ sudo apt-file update
$ sudo apt-file search add-apt-repository
$ sudo apt-get install -y software-properties-common
$ sudo add-apt-repository -y ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y git

# 仮想マシンにdockerのインストール
$ sudo apt-get remove docker docker-engine http://docker.io 
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install -y docker-ce
$ sudo docker run hello-world
$ docker -v

# 仮想マシンにdocker-composeのインストール
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose -v
```

windowsでdockerが使えるようになりました。

参考
https://docs.docker.com/compose/install/
AWS初心者がAWS勉強会に参加してみた①

この前AWSって何？的な勉強会に参加したので、
その時に学んだことをアウトプットのために以下に記載しておきます。
全部書こうとすると結構量があるし、疲れるので何回かに分けて書く予定です。



#AWSって？
AWSとは、正式名称を「Amazon Web Services」と言って、
あの有名な「Amazon」が展開してるパブリッククラウドサービスの事です。

僕は「AWS＝IaaS」と思っていたんですが、「IaaS」のサービスだけではなく、
現在では、ミドルウェアやメールサービスなど「PaaS」や「SaaS」のサービスも提供しています。

で、一般的なクラウドサービスの特徴である、「オンプレミスと比較して低コスト」
「調達コストの低減」などに加えて以下のような特徴があります。

1. 一つのアカウントで世界中に存在しているAWSリソースを利用することが可能。
2. AWSインフラストラクチャーのスケールメリットを生かした早くて柔軟な拡張性、高い可用性や高い耐障害性。
4. AWSが提供する豊富なサービス

類似のサービスを展開する企業だとMicrosoftとかGoogleとか色々あると思いますが、
2018年の現時点でAWSは世界で約33%のトップシェアを保有しているようなのでダントツですね。

また、無料利用枠もあり、設定された枠内であれば費用は掛からないようです。
※無料利用枠の詳細な制限は「AWS 無料利用枠」とかで検索してみてください。


#AWSデータセンター
上の1.でも記載した早くて柔軟な拡張性、高い可用性や高い耐障害性をユーザに提供するために、
アマゾンは世界中にAWS専用のDC（データセンター）を保有しています。

また、ユーザのニーズが高まるにつれて、データセンターの新規開設にも積極的であり、
次々と新規のサーバを設置しているそうです。
因みに、物理サーバが故障しても、故障したサーバはそのまま廃棄しているらしく
かなり膨大な数になるかと思います。
※DC数や物理サーバ台数は公表されていないっぽいので詳しい方いたら教えて欲しいです。


#リージョン
AWSでは、AWSインフラストラクチャーを「リージョン、AZ（アベイラビリティ・ゾーン）、
エッジロケーション」
という3種類に分類しており、ユーザはこれらを利用して自社のインフラストラクチャーを構築します。

「リージョン」とは、世界中にあるDCを地域ごとに纏めた、DCの集合体の事で、
ユーザがAWSを利用する場合は、この「リージョン」を選択して、どの地域のリソースを利用するか選択します。

例をあげると、アジアには「東京リージョン」、「シンガポールリージョン」と「北京リージョン」などがあります。
もちろん、物理的にそれぞれの地域にAWSインフラストラクチャーが存在してて、
ネットワークを通じてサービスを利用するので、
日本で利用するのであれば、「東京リージョン」を利用するのが良いですね。

#AZ（アベイラビリティ・ゾーン）

「AZ（アベイラビリティ・ゾーン）」とは、DCそのものになります。
複数のAZの集合体を「リージョン」と呼び、「一つのリージョン」には複数のAZ（最小1最大6）があり、
複数のサーバを構築する場合は、それぞれ異なるAZを利用して可用性や信頼性を高める
「マルチAZ」の構成が推奨されています。
なお、個々のAZ間は専用線で相互に接続されており、且つAZ間は数十km以上離れているらしいので、
たとえ飛行機がAZに落ちてもAWSは問題ないらしいです。


#エッジロケーション
「エッジロケーション」は少し特殊で、リージョンやAZには、
ユーザがIaaS環境を使う場合に多く利用される仮想化されたサーバなどが格納されていますが、
AWSが提供するコンテンツ配信サービス（AmazonCloudFront）は、このエッジロケーションに格納されています。
例えば、特定のユーザへWebコンテンツやストリーミングを配信させるためのシステムを
Amazon CloudFrontから調達する場合、このサービスはエッジロケーションから提供されるようになっています。




②に続きます。
https://qiita.com/Hiyajo/items/4e23df02a164ab6f0366
@Transactionalでロールバックされてるかデバッグしたい

# jdbc

`org.springframework.jdbc.datasource.DataSourceTransactionManager`にコミット・ロールバックの入り口があるので、ここにブレークポイント貼っておけば、簡単なデバッグができます。

https://github.com/spring-projects/spring-framework/blob/master/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceTransactionManager.java

コミットは`doCommit`、ロールバックは`doRollback`です。

# 他

知りません！
Raspberry piでslackbotを動かす

# はじめに
久しぶりにラズパイでslackbotを動かしたくなったので、設定した内容まとめ。
過去に一度設定したけど、微塵も覚えてないので、まとめついでに一から設定します。
ついでに、前に設定してなかったip固定とかsystemctlに登録とかしときます。

# 前提
作業しているPC：Mac(Sierra 10.12.6)
ラズパイ：Raspberry Pi 3 Model B

## OS設定編(Macでの作業)
前回何設定したか覚えてないので、OS入れ直してついでにIPを固定しておく。
OSは[ここ](https://www.raspberrypi.org/downloads/)から好きなものをダウンロードする。
今回はRaspbianのwith Desktopの方を入れる。
※普通にライトで良かったなーと今更思った。

ダウンロードが終わったらSDカードをMacに挿してOSを入れる。
ここの処理を間違えると悲惨なことになるらしいので要注意。

``` bash
# コピー先を探す
$ diskutil list 

# 一旦外す
$ diskutil unmountDisk /dev/disk6(※今回はたまたまdisk6だった)

# コピーする
$ sudo dd bs=1m if=[入れたいOS] of=/dev/rdisk6
```

ラズパイを起動する前にSSHの設定をしておく。
予めsshファイルを作って置けば最初からSSHで繋がるようになっているらしい。
やっとかないとあとで設定が必要そう。

``` bash
# 中身はなくていいから作るだけ作っとく
$ touch /Volumes/boot/ssh
```

## ラズパイ設定編
ラズパイを起動し早速ターミナルでいろいろ設定。


### IP固定化
いちいち変わられても接続するのが面倒くさいので固定する。

``` bash
$ sudo vi /etc/dhcpcd.conf

# 以下内容を追記
interface wlan0
static ip_address=[設定したい固定IPアドレス]/24
static routers=[デフォルトゲートウェイのIPアドレス]
static domain_name_servers=[DNSサーバーのIPアドレス]

# [SSID]と[PASSPHRASE]は環境に合わせて変更
# /etc/wpa_supplicant/wpa_supplicant.confにパスワードが書かれるので、嫌なら消しとく
$ sudo sh -c 'wpa_passphrase [SSID] [PASSPHRASE] >> /etc/wpa_supplicant/wpa_supplicant.conf'

# 最後に再起動
$ reboot
```

これでipアドレスが固定されればOK。

### slackbotを入れて動かす
botはPythonで動かすことにする。
Slack側の設定は終わってる前提です。
ライブラリは`pip3 install slackbot`でインストールしておく。
※ついでにvimも入れとく人は`sudo apt-get install vim`も叩いとく。

準備が出来たらbotを作成する。
とりあえず最小構成で動くとこまで。
フォルダ構成、ソースは以下の通り。

``` bash
$ cd '任意のフォルダ'
# bot動かすファイル
$ touch run.py
# botの設定を書くファイル
$ touch slackbot_setting.py
# プラグインを入れとくフォルダ作成
$ mkdir plugins
# プラグインとして認識してもらうために、空ファイルでいいので作成
$ touch ./plugins/__init__.py
```

```python:run.py
# -*- coding: utf-8 -*-

from slackbot.bot import Bot


def main():
bot = Bot()
bot.run()


if __name__ == "__main__":
main()
```

```python:slackbot_setting.py
# -*- coding: utf-8 -*-

API_TOKEN = "slackで確認したTOKEN"

default_reply = "は？何言ってんの？"


PLUGINS = [
'plugins'
]
```

ファイルを用意したら、`python3 run.py`で起動。
話しかけて、返事してくれればOK。

### botをサービス化しとく
`python3 run.py &`とかで動かしておいても問題ないけど、一応ちゃんと設定しておく。
手順とファイルの内容は下記の通り。

``` bash
# unit定義ファイル作成
$ sudo vim /etc/systemd/system/runUbibot.service

# リストにいることを確認
$ sudo systemctl list-unit-files --type=service | grep runUbibot
# 自動起動設定しておく
$ sudo systemctl enable runUbibot.service
# 起動
$ sudo systemctl start runUbibot.service
```

``` bash:runUbibot.service
[Unit]
Description = 説明

[Service]
ExecStart = ~~/start.sh(絶対パスで)
# 再起動設定
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```

``` bash:start.sh
# このファイルに実行権限を与えとく`chmod 0777`とか
#!/bin/bash

# 直接これを指定する方法がわからなかったので、shell経由
python3 run.py
```

これで動いていればOK。

# おまけ
## ユーザの追加
``` sh
$ sudo /usr/sbin/useradd --groups sudo -m ユーザID
$ sudo passwd ユーザID
```

## passwordの変更
```sh
$ sudo passwd 変更したいユーザ
```

## ユーザの削除
```sh
$ userdel -r 消したいユーザ
```

# まとめ
これでいつ、ラズパイが消し飛んでも復活できるはず。
備忘録としてまとめておきます。
稼働済みdockerコンテナでcronを動かす

# はじめに
dockerでcronを動かしたい、と思って調べたらdockerfileでの実現方法ばかりがヒットした。
そうじゃないんだ…稼働済みのコンテナでcronを動かしたいんだ…
という事で、cronが入っていないコンテナ(稼働済み)でのcronの動かし方をメモ。

# 手順
手順は以下の通り。5ステップで行けるので意外と簡単。
1. パッケージリストの更新
2. cronのインストール
3. vimのインストール
4. cron設定の編集
5. cronプロセス(デーモン)のバックグラウンド起動

# 1.パッケージリストの更新
`apt-get update` を実行する。

# 2.cronのインストール
`apt-get install cron` を実行する。

# 3.vimのインストール
cron設定を編集するのに必要。インストール済みか他のエディタでいけるなら不要。
`apt-get install vim` を実行する。

# 4.cron設定の編集
`crontab -e` を実行する。
`分 時 日 月 曜日 コマンド` で設定する。
細かいcronの設定の仕方はググると出てくるので省略。

# 5.cronプロセス(デーモン)のバックグラウンド起動
設定しただけでは動かないので、cronのプロセスを起動する必要がある。
`/usr/sbin/cron -f &` で起動する。
cronのインストール場所が別ならばそこに合わせる。
最後の **&** がないとバックグラウンド起動できないので忘れないように。

# 最後に
これで稼働済みコンテナでcronを動かすことは出来る。
が、使っているteratermの画面がおかしくなる。
具体的にはteratermの画面下部9行くらいが使えなくなった。
なんでだ。

後で調べて解決出来たら追記する。
Sigfox Radio Configurationとデバイスクラス

[Sigfox](https://www.sigfox.com)のRadio Configurationとはなにでしょうか？
#Radio Configurationの定義
Sigfoxサービスは、グローバルにおいて862MHzから928MHzのISM及びSDRバンドで運用されています。
グルーバルでの無線運用は、物理的に3つのリージョンに分割されており、各区域においては、異なる技術基準（周波数、最大送信出力等）が適用されます。
Radio Configurationは、RCと略され、各技術基準にあわせてナンバーリングされています。日本国内では、[ARIB STD-108](https://www.arib.or.jp/kikaku/kikaku_tushin/desc/std-t108.html)及び電波法関連法令に準拠し、**RC3**として管理しています。
各リージョンにおけるRCは下表のとおりです。

| |RC1|RC2|RC3|RC4|RC5|RC6|RC7|
|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
|リージョン|欧州 |北中米/南米|日本|南米/APAC|韓国|インド|ロシア|
|Uplink(MHz)|868.130|902.200|923.200|920.800|923.300|865.200|868.800|
|Downlink(MHz)|869.525|905.200|922.200|922.300|922.300|866.300|869.100|
|EIRP(dBm)|16|24|16|24|14|16|16|
|その他|Duty1%|FH|LBT|FH|LBT|-|Duty1%|

##RC3について
RC3には、RC3aとRC3cの二つが存在します。
当初、日本国内でSigfoxが導入されたときは、ARIB STDや電波法関連法令上、Sigfoxの通信技術をフルに活用できる状態ではありませんでした。つまり、Sigfoxように狭帯域周波数の利用が難しい状態でした。
その後、情報通信審議会の[920MHz帯電子タグシステム等作業班](http://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/joho_tsusin/idou/02kiban14_04000504.html)で検討され、平成29年10月に総務省令の改正、その後ARIB STD-T108の改定となり、日本国内でも狭帯域周波数のフル活用ができるようになりました。
この前後でRC3の定義も変わっています。制度改正前がRC3a、改正後がRC3cという位置づけです。
RC3cでは、周波数ホッピング幅が広くなったため、端末同時接続数や受信感度が良くなっています。
RC3a,RC3cの仕様をご確認されたい方は、[こちら(Sigfox Build)](https://build.sigfox.com/sigfox-certification-tests/#sigfox-rf-and-protocol-rc3-documents)を見てください。

##デバイスクラス
Sigfoxデバイスは、その送信出力にあわせ、4種類のクラスにカテゴライズされます。このカテゴライズは、RC毎に定義が異なっています。日本国内向けのRC3は、下表の定義です。

|RC3a/3c|Class 0u|Class 1u|Class 2u|Class 3u|
|:-----:|:-----:|:-----:|:-----:|:-----:|
|EIRP|16dBm-12dBm|12dBm-7dBm|7dBm-2dBm|2dBm未満|
このデバイスクラスは、Sigfox Ready Certification (P2認証とも呼んでいます）プログラムにおいて認証機関で計測された結果に基づき設定されます。
Sigfox Ready Certificationに関しては、[こちら](https://build.sigfox.com/sigfox-ready-certification)に詳しく説明されています。
Firebase Crashlyticsを導入する

#セットアップ
##Firebaseプロジェクトの設定

-　新規プロジェウトを作成するか、既存プロジェクトが必要です。
-Crashlytics を有効にする: Firebase コンソールで [Clashlyticsを設定](https://console.firebase.google.com/project/_/crashlytics?authuser=2)をクリックします。

##Androidプロジェクトに Crashlytics SDK を追加する
FirebaseSDKはすでにインストール済みであることを前提に進めます。
###プロジェクトのbuild.gradleにSDKを追加
Crashlyticswを利用するには、google-services-plugin 3.1.2 以降が必要です。

```groovy
buildscript {
    ext.kotlin_version = '1.2.41'
    repositories {
        google()
        jcenter()
        // 追加
        maven {
            url 'https://maven.fabric.io/public'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // Add the Google Services plugin (check for v3.1.2 or higher).
        classpath 'com.google.gms:google-services:4.3.3'

        // Add the Fabric Crashlytics plugin.
        classpath 'io.fabric.tools:gradle:1.31.2'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        // 追加
        maven {
            url 'https://maven.google.com/'
        }
    }
}

```

###アプリのbuild.gradleにSDKを追加
```groovy

apply plugin: 'io.fabric'

dependencies {

    .......

    implementation('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
        transitive = true
    }
    implementation 'com.google.firebase:firebase-core:16.0.0'

}
```
これでセットアップは完了です。

##実装のテスト
意図的にクラッシュを発生させて実装状況をテストします。
ボタンクリックイベントなどで以下のコードを実行し、強制的にクラッシュを発生させます。

```kotlin
    Crashlytics.getInstance().crash();
```
クラッシュ発生後に再度アプリを起動し、Crashlyticsにクラッシュを送信させます。
この内容は5分ほどで反映されます。

###Crashlyticsのデバッグモードをオンにする
強制クラッシュが発生せず、Crashlyticsが動作しない場合、Crashlyticsのデバッグモードをオンにする必要があります。

Androidでデバッグモードをオンにするには、まず自動初期化機能をオフにする必要があります。
AndroidManifest.xmlに以下の記述を追加します。

```xml
<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false" />
```

次にデバッガをオンにして手動でCrashlyticsを初期化します。

```kotlin
    val fabric = Fabric.Builder(this)
            .kits(Crashlytics())
            .debuggable(true)           // Enables Crashlytics debugger
            .build()
    Fabric.with(fabric)
```

##参考
https://firebase.google.com/docs/crashlytics/get-started?hl=en&platform=android
日本語のドキュメントは古くて使えないので英語を参照した方が幸せになれますよ
playframeworkでのJsonRequestの色々

## PlayScalaでJsonRequestを受けた際の色々メモ

最終的には↓みたいにした。

``` sample1.scala
package com.example.common

import play.api.mvc._
import play.api.libs.json._
import scala.concurrent.Future

abstract class JsonValidatedController(cc: ControllerComponents) extends AbstractController(cc) {

  def async[A](request: Request[AnyContent])(async: A => Result)(implicit reads: Reads[A]) = {

    Future.successful {
      val json = request.body.asJson.map(_.validate(reads))
      json match {
        case Some(s: JsSuccess[A]) => async(s.get)
        case Some(e: JsError) => BadRequest(JsError.toJson(e))
        case None => UnsupportedMediaType
      }
    }
  }
}
```

### BodyParserにjsonを渡すパターン

``` sample2.scala
package com.example.common

import play.api.mvc._
import play.api.libs.json._
import scala.concurrent.Future

abstract class JsonValidatedController(cc: ControllerComponents) extends AbstractController(cc) {

  def async[A](request: Request[JsValue])(async: A => Result)(implicit reads: Reads[A]) = {

    Future.successful {
      val json = request.body.validate(reads).asEither
      json match {
        case Right(s) => async(s)
        case Left(e => BadRequest(JsError.toJson(e))
      }
    }
  }
}
```

呼び出し時に以下のようにする。

```
Action(parser.json) {
  ...
}
```

シンプルになるが、ContentTypeがJsonではない場合、デフォルトエラーページが返る。
→いついかなるときもJsonでレスポンス返したいのでボツ
CustomErrorHandlerを定義しても動かなかった。
→コンパイルDIしてるせいかも？

### parser.json[任意の型]のパターン

こうやってAction呼び出すと、ハナからRequest[任意の型]で受けれた。

```
Action(parser.json[任意の型]) {
  ...
}
```

上手くパースできない場合、勝手にデフォルトエラーページが返る。
→同じくいついかなるときもJsonでレスポンス返したいのでボツ

なぜこうしたか、後々忘れそうなのでメモ。
Docker for Macでコンテナからホストのサーバに接続する

## 概要

Dockerのコンテナの中からホスト(macOS)に接続したい場合、 `host.docker.internal` を使えばアクセスできます。

https://docs.docker.com/docker-for-mac/release-notes/#docker-community-edition-18030-ce-mac59-2018-03-26

> DNS name `host.docker.internal` should be used for host resolution from containers. Older aliases (still valid) are deprecated in favor of this one. (See https://tools.ietf.org/html/draft-west-let-localhost-be-localhost-06).

## 動作確認

```console
$ docker run -d -p 80:80 --name webserver nginx # nginxのサーバを立ち上げる
$ wget -O - http://localhost # localhostでつながる
$ docker run -it alpine sh # 適当なコンテナ立ち上げて中に入る
```

以下コンテナ内で実行

```console
# wget -O - http://localhost # localhostではつながらない
# wget -O - http://host.docker.internal # これでつながる
```
Ruby の特性を別言語話者（？）から見てみる

# どんな言語なの？
* 日本人が作った。おお、我らが Matz 、島根の誇りよ。いや生まれは鳥取らしいけど。
* Perl に似ている。
  * というか、「Perl のろくでもないところをなんとかしたのが Ruby」というような記述をどこかで見た。気がする。
* 「Matz が Python で満足してたら Ruby はない」と言われる。別に Matz が Python 嫌いということではない。満足してたらって書いてあるしね。
  * リスト内包だか高階関数群だかの記法が嫌らしい。というようなことをブログで見た。斜め読み。
     * 個人的な話だが全面的に同意する。リスト内包はややこしくなりがちだし、map(proc, items) より items#map(proc) のが直感的だよね。同じ不満を抱いて JavaScript へ逃げたんだよなあ。
* 初登場は95年、実は PHP と同い年である。意外にも古株。
  * 2004年の Rails 登場以降爆発的に普及した。
     * ……んじゃないかと思う。それまで名前も聞いたことがなかった。
     * それ以前でも国内では割と広まっていたらしい。
         * 最初期は newsgroup fj で発表されたものらしいので、単に観測範囲のジェネレーション・ギャップかもしれない。
 
# 文法系
* 行終端記号;、ブロック終端は end (始点は def やら if やらいろいろ - Ruby的に「ブロック」は別の意味を持つのでちょっとめんどくさいが、これは制御的な意味の方) 。
* コメントは Shell/Perl 型単行(つまり #) 。
* いろいろ省略できる。
  * 特にメソッド呼び出しの括弧を略せるのは混乱しがち。むしろ省略がデフォなレベルらしい。なにそれこわい。
  * 行終端だって省略できる。というか使ってるところを見ないもんだから終端記号なしなパターンだと思っていた。
* **インクリメント、デクリメントは存在しない**。
  * ほかはそこまで特殊というわけでもない。+= だってある。
* 頭文字が大文字な変数は定数扱い。
  * const なんてものはない。
  * というか、**変更しようとすると警告が出るだけの変数である**。警告してくれるだけありがたいといえばそう……なのか？
* do - while は~~ない。~~ あるにはあるが matz 直々に使うなとされている。それで reject されたなんて記事があったのか。
  * キーワード do は (lambda か何かのような) メソッドへコード片を渡す存在 "ブロック" のために存在する。
  * ~~なお do - while 同等の代替品は存在しない。~~if + break で書いて。
* 変数宣言はない。スクリプト言語はみんなこんなんだな。
* **全てはオブジェクトである**。OOP バンザイ。
* **全ての式と文は値でもある**。
  * if 文で値2種を選択的に代入したい！というとき、なんと**まるで if 文自体を代入するかのような記述ができる**。条件演算子だと辛い時にどうぞ。
* **Duck Typing 万歳、メッセージ指向万歳**。詳細は後述。

# オブジェクト / クラス
* **何でもかんでもだいたい可変**。**文字列ですら可変**。
  * クラスにメソッドを「後付け」することだって出来る。
     * 拡張メソッドどころではない。**ガチでメソッドが増えるし書き換えられる**。
     * というか**インスタンスにだって後付け出来る** (特異メソッド) 。JavaScript かな？
  * もちろん**組み込みクラスだって可変**。やっぱり JavaScript かな？
     * 流石に変更を禁ずる freeze というものが用意されている。
         * とはいえ、見苦しいし不便になるので乱用するとキレられる。そりゃそうだろうけど、Java でいう final みたいな感覚なんだろうか。
* **演算子の多くはメソッド呼び出しのシンタックスシュガーである**。かっこいい！！
  * つまり**演算子オーバーロードアリアリ**。やったぜ。
* クラス変数は @@ 、インスタンス変数は @ が頭につく。
  * なおグローバルは $ 。
  * ローカルはつけなくていい。
     * これに限らないが、「よく使うものは手軽に、使わずに済むならその方がいいものは面倒に」というのが一つの哲学のようだ。
* メソッド定義は def - end
  * **メソッド名に ! や ? を使える**。最後に付けて特性を示すのがお約束。
    * ! は (特に同名のものと比較して) 破壊的変更を伴うことを意味する。
    * ? は真偽値を返すものを意味する。Java でいう isXXX とか hasXXX とか。
    * 文法的な強制力はない。
    * そもそも**メソッド名に予約語を使うことさえ出来る**。予約語、予約語って何だ。
* **定義されていないメソッドを呼び出せる**。
  * 定義されていなかった場合、**「定義されていなかったときに呼ばれるメソッド」**が代わりに呼ばれる (method_missing) 。Duck Typing もここに極まれり。 
* null ではない、 nil だ！
* コンストラクタはクラス名ではない、initialize だ！
* 単一継承。ただし mix-in がある。
  * インスタンスメソッドを片っ端から "継承" 出来る。
  * しかも最終的に "継承リスト" という同一のものの上で管理される。

# ちょっと特殊な存在、シンボル
* :hoge みたいなやつ。
* 文字列と整数値の中間的存在。
  * 見た目は文字列、内部的には数値。
  * 見た目同じなら同一オブジェクトであることが保証されている。
    * この特性のおかげで比較やらなにやらが速くて高効率。オブジェクトその他の管理に使われる。
* あるオブジェクトにあるメソッドが存在するかチェックする respond_to? とかで使う。
  * 文字列も受け付けてくれるが、シンボルのが速いらしい。そりゃそうだ。

# やたら処理系が広範
* なんと**組込み用実装まで存在する**。
* 大本は Shell 用言語のつもりだったらしい。つまりもちろん **Perl のノリで使える**。
* でもやっぱり広まった最大の原因は Rails じゃなかろうか。アレはもう Rails っていうひとつの処理系だよね (強弁) 。
  * でも個人的には Rails は「無茶苦茶やりまくる」という意味でオススメしづらい……学習コスト高い上に追従コストが悲惨……
diffの便利な使い方


今回は2つのファイルで検証！

***aaa***
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254542/911d45d0-2c66-8228-d9c5-a9c072bd6fcf.png)

***bbb***
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254542/905c2074-a472-410a-469e-51f1a23b3d5f.png)


###-u###

```

$ `diff -u aaa bbb`
--- aaa	2018-05-31 20:33:58.375643964 +0900
+++ bbb	2018-05-31 20:34:51.719615526 +0900
@@ -1,5 +1,5 @@
 aaa
-bbb
+
 ccc
-ddd
 eee
+fff

```


###-c###

```
$ diff -c aaa bbb
*** aaa	Thu May 31 20:33:58 2018
--- bbb	Thu May 31 20:34:51 2018
***************
*** 1,5 ****
  aaa
! bbb
  ccc
- ddd
  eee
--- 1,5 ----
  aaa
!
  ccc
  eee
+ fff

```



個人的にはcオプション派:smile:
小ネタ　一発矢印の出し方

# キーボード全角で矢印を一発で出す方法
全角にして行ってください。

|コマンド|結果|
|:--:|:--:|
|Z + H| ← |
|Z + J| ↓ |
|Z + K| ↑ |
|Z + L| → |
Docker版PHP Code_SnifferをMacで「phpcs」コマンドとして実行する方法

Macにて、

```bash:/usr/local/bin/phpcs
#!/usr/bin/env bash
docker run --rm -it -v $PWD:/app phpqa/phpcs:3.2.3 "$@"
```

というファイルを作り、

```
chmod +x /usr/local/bin/phpcs
```

`/usr/local/bin`にパスが通っていれば`phpcs`と打つだけで、Dockerイメージ版のPHP Code_SnifferがMacでも実行できる。

## 関連記事

* [PhpStormにDocker版PHP CodeSnifferを組み込み、おかしなコードを自動検出する方法 - Qiita](https://qiita.com/suin/items/f8676733ebcf771a064b)
PhpStormにDocker版PHP CodeSnifferを組み込み、おかしなコードを自動検出する方法

本稿では、[PHP_CodeSniffer]の[Dockerイメージ]をPhpStormに統合して、`phpcs`の解析結果をPhpStorm上で確認できるようにする設定手順を解説する。Dockerイメージを使わない方法の解説は『[Mac版PhpStormにPHP CodeSnifferを統合する方法](https://qiita.com/suin/items/8f00ccd58f0464fb9791)』を参照。

_phpcsをPhpStormに統合したときに表示されるようになる忠告の例_

<img width="469" alt="php-playground____Dropbox_projects_php-playground__-_____messy_php__php-playground_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/9741710e-b0d0-586c-0e2a-5163bf5f5a5e.png">


## 設定手順

### phpcs用のリモートインタプリタを足す

インタプリタとはPHPの実行環境のこと。リモートインタプリタとは、PhpStormが動いているOS以外のPHP実行環境のこと。ここでは、Dockerコンテナ内の`php`コマンドのことを指す。`phpcs`はコンテナ内で起動させる必要があるため、インタプリタの設定をまず行う。

設定を開き、「Languages & Frameworks」→「PHP」で「CLI Interpreter」にDockerイメージを指定したいので「・・・」ボタンを押す:

<img width="1030" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/ca5004ae-23b9-da52-5390-4bb458a5b5c0.png">

「CLI Interpreters」ウィンドウで「+」を押して「Configure Remote Interpreters」の画面を出す。入力は以下図のとおり行う。「Image name」には`phpqa/phpcs:3.2.3`をコピペ。

<img width="824" alt="Configure_Remote_PHP_Interpreter_と_CLI_Interpreters_と_Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/9efa129f-e3cf-26c2-9d93-1f836c1c7b28.png">

「OK」を押すと、2,3秒して下記図のようにインタプリタが追加された画面が出る。「Visible only for this project」のチェックを外す。そして「OK」を押して閉じる。

<img width="824" alt="CLI_Interpreters.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7944f4e7-cba0-5c2a-d36d-e433257b52e8.png">

### phpcsの設定をする

「Code Sniffer」の設定画面で「･･･」ボタンを押す:

<img width="1030" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/fc95ce03-ccbf-ba0a-ad08-d1e61c47efbf.png">

先程追加したインタプリタを選ぶ:

<img width="820" alt="Code_Sniffer_By_Remote_Interpreter_と_Code_Sniffer.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/adfd2811-9326-5b0b-d891-257beca5f680.png">

「Validate」して問題なければ「OK」を押す:

<img width="824" alt="Code_Sniffer.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/a655083e-48e6-4967-392a-bae68a4debbf.png">

### Inspectionsの設定でPHP Code Snifferを有効化する

ここでは下記の2とおりの設定方法を紹介する。

1. PSR2のコーディング標準を使う場合
2. 独自のコーディング基準設定ファイル`phpcs.xml`を使う場合

必要に応じて設定方法を選択してほしい。

#### 1. PSR2のコーディング標準を使う場合

設定の検索窓で「Code Sniffer」を入れ、「Editor」→「Inspections」の「PHP Code Sniffer validation」を探し、それにチェックを入れる。「Severity」(警告度)は「Warning」に変える。「Coding Standard」は「PSR2」にする。

<img width="1030" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/9107f8fd-bc04-cff4-a351-38c083f456a0.png">

#### 2. 独自のコーディング基準設定ファイル`phpcs.xml`を使う場合

設定の検索窓で「Code Sniffer」を入れ、「Editor」→「Inspections」の「PHP Code Sniffer validation」を探し、それにチェックを入れる。「Severity」(警告度)は「Warning」に変える。

「Coding Standard」は「Custom」にし、「Custom Coding Standard」ウィンドウを開いたら、「Path to ruleset」にXMLのパスを指定する。ファイル名が`phpcs.xml`でプロジェクトルートに置いてある場合は、`/opt/project/phpcs.xml`を指定する。この`/opt/project/`はDockerコンテナ内でのパスだ。

<img width="1029" alt="Custom_Coding_Standard_と_Preferences_と_alis2___Volumes_casesensitive_alis2__-_____phpcs_xml__alis2_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/182bdb00-f677-5219-7ad2-7168a810d455.png">


[PHP_CodeSniffer]: https://github.com/squizlabs/PHP_CodeSniffer
[Dockerイメージ]: https://hub.docker.com/r/phpqa/phpcs/
Raspberry Pi 3でopenFrameworks 0.10.0を動かす

ラズパイでoFをうごかして最強になろう
oF0.10.0が出たので入れてみる

基本的には公式のガイド通りにすすめていきます
[raspberry pi | openFrameworks](https://openframeworks.cc/ja/setup/raspberrypi/raspberry-pi-getting-started/)

##環境
- Raspberry Pi 3
 - Raspbian v9.4
- openFrameworks
 - of_v0.10.0 linux armv6

##Raspberry Piの設定
先にいくつかラズパイ側での設定をする。

###メモリの設定
`$ sudo raspi-config`
8 Advanced Option > A3 Memory Split > 64 と入力したのちok

oFのコンパイルには192MBのRAMが必要なのでそれを確保する

###GUIを切る
GPUメモリを節約するため(やらなくても動きはするが、推奨)

`$ sudo raspi-config`
 3 Boot Options > B1 Desktop / CLI > B1 Console か、 B2 Console Auto Login を選択

次回起動時からCLIになる

###apt-getのアップデート
```
$ sudo apt-get clean
$ sudo apt-get update
$ sudo apt-get upgrade
```

##openFrameworksのダウンロード
linux armv6とlinux armv7がありますが、arm6で大丈夫でした
今回は最新の0.10.0をダウンロード

```
$ wget https://openframeworks.cc/versions/v0.10.0/of_v0.10.0_linuxarmv6l_release.tar.gz
$ mkdir openFrameworks
$ tar vxfz of_v0.10.0_linuxarmv6l_release.tar.gz -C openFrameworks --strip-components 1
```
信用がどうの〜と言われてダウンロードできない場合は`wget`のあとに` --no-check-certificate`をつける

##openFrameworksのインストール

```
$ cd /home/pi/openFrameworks/scripts/linux/debian
$ sudo ./install_dependencies.sh
$ make Release -C /home/pi/openFrameworks/libs/openFrameworksCompiled/project
```

けっこう時間がかかる

##Exampleを実行

```
cd /home/pi/openFrameworks/examples/graphics/polygonExample
make
make run
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ラズパイでoFv0.10.0動いた！ <a href="https://t.co/IHGLX6HYW6">pic.twitter.com/IHGLX6HYW6</a></p>&mdash; koma (@koma_JB62) <a href="https://twitter.com/koma_JB62/status/1001766166270951424?ref_src=twsrc%5Etfw">2018年5月30日</a></blockquote>

リリースのときはこっち？

```
$ make RunRelease
```


##projectGeneratorを使って新規プロジェクトを作成
→ [openFrameworks on Raspberry PiでprojectGeneratorを使用してプロジェクトを作成 \- Qiita](https://qiita.com/koma-koma/items/622d896c27c93278c290)
ViewModel を使用して Android アプリを雑に回転対応する

まじめに回転対応すると Activity が破棄されたときどうするのかとか考える必要があって面倒ですが、細かいことは置いといて雑に回転対応するのであれば [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel) を使用すると簡単にできます。

# どうやるの？

## 回転対応前
例えば以下のような形で回転するたびに Toast で何回目の回転か表示する Activity があったとします。

```java

public class MainActivity extends AppCompatActivity {

    // この値を回転しても保持したい
    int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        count++;
        Toast.makeText(this, String.valueOf(count) + "回目！！", Toast.LENGTH_SHORT).show();
    }
}

```

このコードを実行すると何度回転しても「１回目！！」と表示されます。回転されるたびに onCreate() からすべてやり直しになって、count が初期化されてしまうためです。

## 回転対応後
Google が提供している Architecture Compoennts というものを入れると簡単に回転対応ができます。

app/build.gradle を以下をします。

```groovy
dependencies {
    ...
    compile 'android.arch.lifecycle:extensions:1.1.1'
    ...
}

```

上のライブラリは google のリポジトリにしかないので以下ような感じでプロジェクトルートにある build.gradle にも変更を加える必要があります。

```groovy
allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}
```

これで Architecture Components が使えるようになった。あとは先ほどの Activity を以下のように変更するだけです。

```java

public class MainActivity extends AppCompatActivity {

    // 保持したい変数を ↓ の ViewModel に突っ込む！
    public static class MyModel extends ViewModel {
        int count = 0;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // ViewModelProviders から上で定義した Model を取り出す
        // ここで取り出した model には回転前の値がちゃんと保持されている
        MyModel model = ViewModelProviders.of(this).get(MyModel.class);
        model.count++;
        Toast.makeText(this, String.valueOf(model.count) + "回目！！", Toast.LENGTH_SHORT).show();
    }
}
```

回転後も保持したい変数を ViewModel というののメンバ変数にして、[ViewModelProvider](https://developer.android.com/reference/android/arch/lifecycle/ViewModelProvider) からそれを引っ張り出してくるだけで回転対応が完了。簡単！

もちろん Fragment でも同じような感じで対応できます。

ViewModel はちゃんとライフサイクルに応じて解放もしてくれるので、リークの心配も不要です。ただ、View や Context を ViewModel に入れるとリークするので注意が必要です。

注意すべき点として、アプリがバックグラウンドになって、ある程度放置されたときなどに Activity が破棄されることがありますが、そのときは count が初期値（このコードの場合だと 0 ）に戻ってしまいます。

ここもちゃんと対応したいのであれば、saveInstanceState, Room などを使用した回転対応が必要になります。

## 参考文献
* [View Model](https://developer.android.com/topic/libraries/architecture/viewmodel.html)
* [Parcelables and Bundles](https://developer.android.com/guide/components/activities/parcelables-and-bundles.html)
* [Handling Configuration Changes](https://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject)
Java 8 DateTime API をじわじわと使っていきたい（今更）

すごく今更だけど、しかしなんだかんだ敬遠されがちなので、使えるところから使っていきたい。というメモ。

# 時間単位
## これまで: リテラル or java.util.concurrent.TimeUnit
https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/TimeUnit.html
実は Java 5 からいた「時間単位」クラス。

```
// int sec = 60*3; // これが
long sec = TimeUnit.MINUTES.toSeconds(3); // こうなる
```

うわあ、この時点でなんかもう便利だ。
実はJava 5なんてもはや "昔" の時点で 60*3 とか 1*24*60*60 とかそんなことやる必要なかった！

## Java8: java.time.Duration
https://docs.oracle.com/javase/jp/8/docs/api/java/time/Duration.html

```
// int sec = 60*3; // これが
long sec = Duration.ofMinutes(3).getSeconds(); // こうなった
```

正直これはどちらを使ってもいいと思う (少なくとも 60*3 よりよっぽど良いのはどっちでも間違いない) 。
しかしこちらのほうが新しいし、何よりも 「時間単位、3分を、秒で」と読めるのでこっちのが好み。

# フォーマット / パース
## これまで: java.text.SimpleDateFormat
https://docs.oracle.com/javase/jp/8/docs/api/java/text/SimpleDateFormat.html

遅い！　スレッドセーフじゃない！　→　めんどくさい！

## java.time.format.DateTimeFormatter
https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/DateTimeFormatter.html

>このクラスは不変でスレッドセーフです。

http://www.ne.jp/asahi/hishidama/home/tech/java/DateTimeFormatter.html
>DateTimeFormatterはスレッドセーフなので、staticフィールドに定義しておいてマルチスレッドで使うことが出来る。
>ついでに、インスタンス生成もSimpleDateFormatより軽い。
>整形（format）に関してはSimpleDateFormatより速いような遅いような微妙な感じだが、
>解析（parse）もDateTimeFormatterの方が速い。

**俺たちはこれが欲しかったんだ！**
もう Apache commons に頼らなくてもいいんだ！

但し、

> しかしDateTimeFormatterの場合、対象文字列内の空白は、書式文字列内に空白が指定されている場合だけ受理される。

とか、

> 空白をオプション書式にすれば、空白が有っても無くても受理されるようになる。
が、複数の空白には対応できない。（オプションを複数指定できるが、任意の個数には対応しきれない）

とか、微妙な差があるので要注意。
（でもまあこのぐらいの差ならクレンジングすれば済むことだよね！）
pythonのpillowで描画領域にはまるようにフォントサイズを調整する

## pillowとは
画像処理ライブラリ、更新の停止したPILをforkして作成された。
https://pillow.readthedocs.io

## 目的
aws lambdaを使ってs3に置いた画像に文字を埋め込む処理を書いてみたので
※サンプルではaws関係なくpythonとpillowだけのコードになっています。

## 動作サンプル
笑という文字を100x100のサイズに入る文字サイズになるまで調整してから描画しています。

```python
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

def main():
    # test
    pillow_char_offset(0, 0, 100, 100, u"笑", 150, "C:\hogehoge\meiryob.ttc")

def pillow_char_offset(x_pos: int, y_pos: int, x_end_pos: int, y_end_pos: int, char: str, init_font_size: int, fontfile_name: str):
    '''
    :param x_pos 文字を描画したい場所の[X]軸始点
    :param y_pos 文字を描画したい場所の[Y]軸始点
    :param x_end_pos 文字を描画したい場所の[X]軸終点
    :param y_end_pos 文字を描画したい場所の[Y]軸終点
    :param char 描画したい文字
    :param init_font_size フォントの初期値(最大サイズ)
    :param fontfile_name フォントファイル(otfやttf)のパス
    '''
    # ベースとなる画像の下地を作成する。複製した画像などをベースにする場合は Image.open で開く
    img = Image.new('L', (x_end_pos, y_end_pos), 'white')
    draw = ImageDraw.Draw(img)

    length = x_end_pos - x_pos
    height = y_end_pos - y_pos
    out_text_size = (length + 1, height + 1)
    font_size_offset = 0
    font = None

    # フォントの描画サイズが描画領域のサイズを下回るまでwhile
    while length < out_text_size[0] or height < out_text_size[1]:
        font = ImageFont.truetype(fontfile_name, init_font_size - font_size_offset)
        # draw.textsizeで描画時のサイズを取得
        out_text_size = draw.textsize(char, font=font)
        font_size_offset += 1

    draw.text((x_pos, y_pos), char, fill='#000', font=font)

    img.save('hogehoge.jpg')

if __name__ == "__main__":
    main()
```

## 実行結果
![hogehoge.jpg](https://qiita-image-store.s3.amazonaws.com/0/118374/7fff38a3-660a-40c3-6085-9d8be04a4486.jpeg)
vimのウインドウ分割を一時的に最大化・元に戻す関数を書いた


vimのウインドウ分割は便利なんだけどコード書くときはウインドウを広く使いたい派なのでで1ウインドウ・1バッファで使ってるんですが、分割を元の状態の戻すのが面倒すぎる。
ウインドウ分割は使いつつコード書くときだけ一時的に最大化できないかなーと思って関数を書いてみました。

```vim:.vimrc
let g:toggle_window_size = 0
function! ToggleWindowSize()
  if g:toggle_window_size == 1
    exec "normal \<C-w>="
    let g:toggle_window_size = 0
  else
    :resize
    :vertical resize
    let g:toggle_window_size = 1
  endif
endfunction
nnoremap M :call ToggleWindowSize()<CR>
```

[.vimrc@Github](https://github.com/grohiro/dotfiles/blob/adba80a9f06e62da88e61f563f876a351e976f74/.vimrc#L158-L168)

`<C-m>` にマップしているので分割した状態で `Ctrl + m` を押すとこのようにウインドウサイズが最大化されたり元に戻ったりします。

![vim_toggle_window_size.gif](https://qiita-image-store.s3.amazonaws.com/0/126845/5e8c4d87-685b-beee-bfd7-bf75c087422d.gif "vim_toggle_window_size.gif")

## 追記
`<C-m>`にマップしたら`Enter`と競合したので`M`に変更しました。
Djangoでscpを使ってファイルを別のホストにコピーしたい

Python 3.5.2
Django 2.0
Apache 2.4
CentOS 7.2

以下のようなコードがあります。scpで別ホストにファイルをコビーするだけなんですが。これはmanage.py runserverでは動きます。

```python:
  result = subprocess.run(['/usr/bin/scp'] ['-i'] ['/path/to/key'] ['/path/to/file'] ['root@foo:/home/bar/'])
  logger.info(result)
```

ところがApache環境で動かすとエラーが発生します。

```bash:/var/log/httpd/error_log
CompletedProcess(args=['/usr/bin/scp', '-i', '/path/to/key', '/path/to/file', 'root@foo:/home/bar/'], returncode=1, stdout=b"Could not create directory '/usr/share/httpd/.ssh'.\\r\\nHost key verification failed.\\r\\nlost connection\\n"), referer: http://192.168.1.1/foobar/
```

**returncode=1**でエラーになってます。
どうやらknown_hostsファイルに公開鍵が登録されていないので

```bash:
# Are you sure you want to continue connecting (yes/no)? yes
```
が処理できなくてエラーになっている気がします。

しかしapacheアカウントはホームディレクトリがないので.ssh/known_hostsファイルが作成できません。
/usr/share/httpd/.sshに作ってもたぶん動くのでしょうがちょっとカッコ悪い。
妥協案でシステムのknown_hostに公開鍵を登録します。

```bash:
# cd /etc/ssh
# ssh-keyscan -H foo > ssh_known_hosts
```

sudoでapacheになってsshでホストに接続してみます。

```bash:
# sudo -u apache ssh -i /path/to/key root@foo
Could not create directory '/usr/share/httpd/.ssh'.
Failed to add the RSA host key for IP address '192.168.1.1' to the list of known hosts (/usr/share/httpd/.ssh/known_ho).
Last login: ... from 192.168.1.100

```

yes/noの入力なしで接続できました。
これならいける気がします。
Djangoから呼び出してみます。

```bash:/var/log/httpd/error_log
CompletedProcess(args=['/usr/bin/scp', '-i', '/path/to/key', '/path/to/file', 'root@foo:/home/bar/'], returncode=0, stdout=b"Could not create directory '/usr/share/httpd/.ssh'.\\r\\nFailed to add the RSA host key for IP address '211.9.38.123' to the list of known hosts (/usr/share/httpd/.ssh/known_ho).\\r\\n"), referer:  http://192.168.1.1/foobar/
```

相変わらず.sshが作成できないと文句は言いますが**returncode=0**でコマンドは正常終了しています。
ファイルもコピーされていました。

以上をまとめると

*Djangoでsshを使用して他のホストに接続するときは/etc/ssh_known_hostsに公開鍵を登録しろ*

でした。

# 補足
このページを参考にさせていただきました。
https://qiita.com/letsspeak/items/3bdb1af4fcee23cf73c4
Xcodeの補完時に出てくるEditor Placeholderを使う

補完した時に出てくる半透明のアレ
![コレ](https://qiita-image-store.s3.amazonaws.com/0/64665/0cb2e9aa-231a-51e0-8208-df065025eaf0.png)


```swift

// Xcodeが自動生成してくれるPlaceholder
<#T##hoge#>

// コレでも作れる
<#fuga#>
```

で作ることができる。tabでどんどん次のPlaceholderに移動できるので、例えば

```swift

titleLabel.reactive.text <~ viewModel.title
titleLabel.reactive.isHidden <~ viewModel.shouldHideTitleLabel

descriptionLabel.reactive.text <~ viewModel.description
descriptionLabel.reactive.isHidden <~ viewModel.shouldHideDescriptionLabel

imageView.reactive.image <~ viewModel.image
imageView.reactive.isHidden <~ viewModel.shouldHideImageView
```

のように代入する値だけが違うコードをたくさん書く時に使えるかも。穴埋め問題も作れそう。
(個人バックアップ用) Windows の環境情報を一発で保存するバッチファイル

Windows には色んなアプリをインストールしたり環境変数やらネットワーク設定やらを変えたりしますが、ちゃんとメモしておかないと新しい PC に移る時に困ります。

というわけで環境情報を一発で出力するバッチファイルを書いてみました。

# バッチファイルと使い方
バッチファイル本体:

```bat
@echo off
prompt $$ 
setlocal
@echo on

rem [ProgramFiles]
dir /w /b "c:\program files" > programfiles.txt
dir /w /b "c:\program files (x86)" > programfiles_x86.txt

rem [SystemConfig]
set > set.txt
ipconfig /all > ipconfig.txt
route print > route.txt

rem [Application]
python --version > python_version.txt
pip freeze > pip_freeze.txt
git --version > git_version.txt
call npm --version > npm_version.txt
call npm list -g > npm_list_global.txt

rem [Registry]
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" > reg_au.txt
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites" > reg_registry_editor_favorites.txt

pause
```

これを適当な名前( `XXXX.bat` )で適当なフォルダに保存した後、保存した bat ファイルをダブルクリック等で開きます。そうすると、そのフォルダ内に次々とテキストファイルが保存されますので、それらをバックアップします。

新しい PC でセットアップを行う際は、保存しておいたテキストファイルの中身を見てバージョンやら設定やらを確認しながら作業します。

# 保存するもの
- インストールしたアプリケーションの名前
- 環境変数
- IP, DNS 情報
- ルートテーブル
- アプリケーションのバージョン
- パッケージ管理ツールにてインストールしたパッケージ一覧
- 指定レジストリキー内にあるエントリとその値

他に保存したい情報がある場合、上記を参考にして追記していってください。

# 細かい解説
ProgramFiles については `tree "c:\program files"` を使えばサブフォルダも含めて出力できますが、実行時間とファイルサイズが桁違いに増えます……。

python は 2.x だと `python --version 2> python_version.txt` みたいに、標準エラー出力をリダイレクトしてやらないと保存できないかもしれません。

npm コマンドはラッパーバッチの関係で call コマンド経由で呼ばないと動作しません。

レジストリはもし普段からいじっている場合は併せてバックアップしておくといいでしょう（上記は Windows Update 設定とレジストリエディタのお気に入りデータです）。レジストリエディタの .reg エクスポートを使う手もありますが、GUI からポチポチやらないといけなくて面倒くさいです(その代わり .reg ファイルを実行するだけで適用できるので楽です)。

# おわりに
他にも「こんなやり方でこんな情報を保存しておくとオススメだよ！」的なのがありましたらぜひ教えてください :smile:
deviseのサインイン・サインアップで別のviewにとんでしまう

# ルーティングを記述する順番が大事


deviseを実装し問題なく動作することを確認。
その後、deviseにないUserのindexとshowアクションを追加して再度サインイン・サインアップしようとすると、何故かuserのshowページに飛んでしまう。

viewは触っていないし特にエラーは出ていないのでルーティングを見直したところ、userのルーティングをdeviseの下にもっていったらちゃんとしたページに飛ぶようになりました！

###### Before
```routes.rb
Rails.application.routes.draw do
  root to: "articles#index"
  resources :articles
  resources :users, only: [:index, :show]
  devise_for :users
end
```

###### After

```routes.rb
Rails.application.routes.draw do
  root to: "articles#index"
  devise_for :users
  resources :articles
  resources :users, only: [:index, :show]
end
```
Windows のスクリプト言語 AutoHotkey でどんなことができるのかを簡単に紹介する

[AutoHotkey](http://autohotkey.com/) を使うと Windows をグンと快適にすることができます。どんなことができるかを 4 例ほど、スクリプトとともに端的に紹介します。

# はじめに
AutoHotkey を知らない方向けに、簡単に動作イメージを書いておきます。

スクリプトを書いた ahk ファイルを AutoHotkey.exe に食わせると、書いた通りに動作します（常駐します）。AutoHotkey はスクリプト言語ですが、特にキーボード制御機能に長けており、キーのマッピング等は得意とするところです。

では例の紹介に移ります。

# (1) 押しづらいショートカットキーに押しやすいキーを割り当てる
タブを切り替えるショートカットキー として Ctrl + (Shift +) Tab がありますが、これは押しづらいです。以下は Alt + ←/→ でも切り替えられるようにする例です。

```ahk
!Left::Send {Ctrl down}{Shift down}{Tab}{Ctrl up}{Shift up}
!Right::Send {Ctrl down}{Tab}{Ctrl up}
```

## (応用) 特定のアプリケーション内でのみ有効にしたい場合
キー割り当ては指定アプリケーション内でのみ有効にすることもできます。

以下はコマンドプロンプトにおいてのみ Ctrl + V で貼り付けを行う例です。

```ahk
#IfWinActive ahk_class ConsoleWindowClass
^V::
  Send !{space}
  Send ep
  Return
#IfWinActive
```

デフォルトでは「Alt + Space、E、P」と押さないと貼り付けできないわけですが、上記により使い慣れた Ctrl + V が使えます。

# (2) 邪魔なキー(ScrollLockとか)をロックする
以下は ScrollLock キーと Insert キーを無効にする例です。

```ahk
ScrollLock::Return
Insert::Return
```

## (応用) 特定のアプリケーション内でのみ有効にしたい場合
以下は「デスクトップ」「Excel」「エクスプローラー」上でのみ F1 キーを無効にする例です。

```ahk
#If WinActive("ahk_class Progman") || WinActive("ahk_class XLMAIN") || WinActive("ahk_class CabinetWClass")
F1::Return
#If
```

# (3) 任意のキーにアプリケーション起動を割り当てる
よく使うアプリケーションはキー一発で起動させると便利です。

以下は Windows キー + Enter キーでメモ帳を起動する例です。メモを取りたい時にサクっと呼び出せます。

```ahk
#Enter::Run, c:\windows\notepad.exe
```

以下は ScrollLock キーで「Firefox で Google を開く」例です。ググりたい時にサクっと呼び出せます。

```ahk
ScrollLock::Run, "C:\Program Files\Mozilla Firefox\firefox.exe" "https://www.google.co.jp/"
```

# (4) 現在日時を一発で挿入する
以下は `d[[` と入力した途端に現在日付(例: `2018/05/31` )を、`t[[` と入力した途端に現在時刻(例: `09:46:12`) を挿入する例です。

```ahk
#Hotstring *

::d[[::
  FormatTime, now,, yyyy/MM/dd
  SendInput %now%
return

::t[[::
  FormatTime, now,, HH:mm:ss
  SendInput %now%
return
```

このような挿入方法を AutoHotkey では [ホットストリング](https://qiita.com/ysi/items/16436cd0cd90a138a36b) と呼びます。一般的には [Text Expansion](https://qiita.com/sta/items/11dd0dba4b85052b4405) と呼びます。

現在日付に限らず任意の文字列(たとえばよく使う構文やコマンド)を挿入できるので、極めると入力作業をめちゃくちゃ効率化できます。

## (応用) 入力モードに依存せず挿入したい場合
上記の例だと全角入力中に `２０１８・０５・３１` のようになってしまい、使い勝手が悪いです。以下はこれを防止する例です。

```
#Hotstring *

::d[[::
  FormatTime, now,, yyyy/MM/dd
  Clipboard = %now%
  Send,^v
return
```

ただし、この方法では挿入の度にクリップボードを上書きします。

# おわりに
以上、簡単ですが 4 例ほど紹介してみました。AutoHotkey は強力ですので、ご興味があればぜひ使ってみてください :smile:
GenymotionでGoolgeストアは使える

Genymotionで、Android７.0の仮想スマホにInstagramをインストールしようとしました。

久々にGenymotionを起動したら、画面の下にバージョンアップの告知があり、早速ダウンロードしてインストールしました。

こちらの記事を参考にしました。
https://ameblo.jp/yao312jp/entry-12299555979.html

![スクリーンショット 2018-05-30 19.20.59.png](https://qiita-image-store.s3.amazonaws.com/0/20977/a997623e-338d-a819-a0aa-bb5fcd4e736c.png)
この画像の右にあるGAPPSをクリックすると、ダイアログが表示されて
Googleをインストール出来ます。

![スクリーンショット 2018-05-30 19.26.40.png](https://qiita-image-store.s3.amazonaws.com/0/20977/7cdd9f88-7e83-37b1-798d-462a3fb348c1.png)

私は、Genymotionのバージョンを上げる前にGAPPSのインストールを試みましたが出来ませんでした。
バージョンを最新にすると良いかもしれません。

私は、FacebookログインでInstagramを使っていますので、Facebookのアプリもインストールしようとしました。
でも、Facebookは、日本語対応していないとエラーになったので、lightの方を使いました。
無事に認証できて、Instagramにもログインできました。
pandasで、行 or 列内に欠損値がある時に、無視して加算・無視せず加算する方法

データ分析で欠損(`NaN`)処理時に`0`で埋めたり、平均値で埋めたり、`drop`したり、前の値を引き継いだり、、というのはよくあります。
が、集計時に、欠損をそのまま欠損として渡す、というのが見当たらなかったのでメモ。

## 0. ライブラリインポート & サンプルデータ設定

```python
import pandas as pd
import numpy as np

df = pd.DataFrame({'C1': [1, np.nan, np.nan],
                   'C2': [2, 1, 3],
                   'C3': [np.nan, np.nan, 1]})
```

すると、こんな感じに：

```python
df
#    C1  C2   C3
#0  1.0   2  NaN
#1  NaN   1  NaN
#2  NaN   3  1.0
```

## 1. 課題設定
- `df`の`C1`列に対して`NaN`を無視して加算(=`NaN`をスキップして加算)
- `df`の`C1`列に対して`NaN`を無視せず加算(=`NaN`が1つでもあったら、`NaN`を返す)

## 2-1. `NaN`を無視して加算

```python
df[['C1']].sum(skipna=True)
#C1    1.0
#dtype: float64
```

となって、`NaN`でないところを取り出せています。念のため`NaN`が含まれない列の場合は

```python
df[['C2']].sum(skipna=True)
#C2    6
#dtype: int64
```

となって、`2+1+3=6`がきちんと計算されていますね。

## 2-2. `NaN`を無視せず加算

```python
df[['C1']].sum(skipna=False)
#C1   NaN
#dtype: float64
```

となって、`NaN`を直視し、`NaN`が返されます。例によって、全て数字が入っている列は、、

```python
df[['C2']].sum(skipna=False)
#C2    6
#dtype: int64
```

となって`2-2`と同じ結果が得られていますね。

## References
- [pandas.DataFrame.sum](https://pandas.pydata.org/pandas-docs/version/0.21/generated/pandas.DataFrame.sum.html)
- [Python pandas の算術演算 / 集約関数 / 統計関数まとめ](http://sinhrks.hatenablog.com/entry/2014/11/27/232150)
Cloud9でlocalhostを使用しない方法まとめ(随時更新)

# はじめに
Cloud9でデフォルト設定の`localhost`を使用するとアプリの動作確認が出来ません。[^1]

他にもデフォルト設定の`localhost`を使用する事で正常に起動しないものがあります。

それを解決する為の方法を記載します。

[^1]: `localhost`はログイン中のPCの事であって、Cloud9上のマシンの事では無い為

# npm run dev
各パターンごとに方法を記載。基本的には記載された内容を実施した後`npm run dev`を実行でOK。

##vue init webpack <ProjectName>でテンプレートを作った場合

`<ProjectName>/build/webpack.dev.conf.js`の一部分を下記の様に変更。

```diff
- const HOST = process.env.HOST
+ const HOST = '0.0.0.0'
```

<ProjectName>/build/webpack.dev.conf.jsに`disableHostCheck: true,`を追加。

```diff
const devWebpackConfig = merge(baseWebpackConfig, {
  .
  .
  .
  // these devServer options should be customized in /config/index.js
  devServer: {
+   disableHostCheck: true,
    clientLogLevel: 'warning',
    historyApiFallback: {
```

## vue init nuxt/starter でテンプレートを作った場合
`<ProjectName>/package.json`の一部分を下記の様に変更。

```diff
"scripts": {
-    "dev": "nuxt",
+    "dev": "HOST=0.0.0.0 nuxt",
```

## vue createでテンプレートを作った場合(Vue CLI 3)

プロジェクトのルートフォルダ直下に`vue.config.js`を作成して、下記内容を登録。

```
module.exports = {
  devServer: {
    host: '0.0.0.0',
    disableHostCheck: true
  }
}
```

## vue init pwa <ProjectName>でテンプレートを作った場合
localhostでアプリが正常に起動した為、設定変更は不要。理由を調査する予定は無し。

# Firebase
## firebase login

```
firebase login --no-localhost
```

## firebase serve
```
firebase serve -o $IP -p $PORT
```
pipenvでエラー"ValueError: unknown locale: UTF-8..."が出たときの対処法

## 対処したいエラー

Macで`pipenv`を使ってこんなエラーが出たときの対処法です。

```
$ pipenv shell
Traceback (most recent call last):
  File "/usr/local/bin/pipenv", line 11, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pipenv/cli.py", line 607, in shell
    three=three, python=python, fancy=fancy, shell_args=shell_args
  File "/usr/local/lib/python3.6/site-packages/pipenv/core.py", line 2148, in do_shell
    from .patched.pew import pew
  File "/usr/local/lib/python3.6/site-packages/pipenv/patched/pew/__init__.py", line 3, in <module>
    from . import pew
  File "/usr/local/lib/python3.6/site-packages/pipenv/patched/pew/pew.py", line 44, in <module>
    from pew._utils import (check_call, invoke, expandpath, own, env_bin_dir,
  File "/usr/local/lib/python3.6/site-packages/pipenv/patched/pew/__init__.py", line 3, in <module>
    from . import pew
  File "/usr/local/lib/python3.6/site-packages/pipenv/patched/pew/pew.py", line 44, in <module>
    from pew._utils import (check_call, invoke, expandpath, own, env_bin_dir,
  File "/usr/local/lib/python3.6/site-packages/pipenv/patched/pew/_utils.py", line 25, in <module>
    encoding = locale.getlocale()[1] or 'ascii'
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/locale.py", line 581, in getlocale
    return _parse_localename(localename)
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/locale.py", line 490, in _parse_localename
    raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: UTF-8
```

## 対処法

以下を`~/.bashrc`に書けば追記すれば、エラーは起きなくなりました。

```bash
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
```

(参考 https://github.com/pypa/pipenv/issues/187#issuecomment-375172264)
WindowsとPowershellとvimとdiffと私

個人的に~~もう前時代感あふれるcmd.exeなんて使いたくない~~Powershellが好きなのでvimでも`set shell=powershell`しているんですけど、どうしても一部機能でトラブルが起きがちで、今回はdiffがどうしても動かなかったのでなんとかした話です。

## 結果が見たいわ！その子のソースを見せてちょうだい！

```vim:vimrc
" diff関連
if has ('win32')
	set diffexpr=MyDiff()
endif

function! MyDiff()
	let opt = ""
	if &diffopt =~ "icase"
		let opt = opt . "-i "
	endif
	if &diffopt =~ "iwhite"
		let opt = opt . "-b "
	endif
	silent execute '!C:\path\to\diff.exe -a --binary ' . opt . v:fname_in . ' ' . v:fname_new . '" > "' . v:fname_out
endfunction
```

## どうしてこんなことになってしまったんだ…

問題はおそらく2つに絞られます。

- **Powershellがdiff=>Compare-Objectへのエイリアスを既に張っている**
- Vimで`set shell=Powershell`した際にリダイレクトとquoteの関係がおかしい

### 屋上に行こうぜ

まず前者に関しては、Powershellのエイリアスを消すとか、苦情のメールを入れるなどでも対応できるかと思われますが、「あるものはできるだけ残す」という個人的なポリシーと、結局vimrc書けば済むとわかったのでそちらで解決します。幸い、ヘルプにサンプル関数があるので[^1]、そのまま持ってきてそれから考えます。

```vim:MyDiff()
set diffexpr=MyDiff()
function MyDiff()
	let opt = ""
	if &diffopt =~ "icase"
		let opt = opt . "-i "
	endif
	if &diffopt =~ "iwhite"
		let opt = opt . "-b "
	endif
	silent execute "!diff -a --binary " . opt . v:fname_in . " " . v:fname_new .
	\  " > " . v:fname_out
endfunction
```

あとはこれの`!diff`の部分だけ使えるdiffのバイナリに変えれば解決するんですけど…

[^1]: `:h diff-diffexpr`を参照のこと

### どぼぢでごんなごどずるのぉぉぉ！？

VimでPowershellを使う場合、シェル周りの設定は大体こうなるのが普通なんだそうなのでそのままこれを使っています…

```vim:vimrc
if has('win32')
	set shell=powershell
	set shellcmdflag=-c
	set shellquote=\"
	set shellxquote=
endif
```

これでシェルを使ってリダイレクト結果を拾うコマンドでは`powershell -c "foo" > bar`となって、一時ファイルもしっかり拾えるように…少なくとも[qiitaCtlのとき](https://qiita.com/astrorobot110/items/01409ae43fb4eca109fa)は問題ないので、拾えるようになってるはずです。正直わからん。おしえてVimmer！

さておき、じゃあこのスクリプトでdiff.exeだけ書き換えてやってみると、うまくいかないんだなこれが。vimrunのウィンドウがある短い時間で見てみたんですけど…

```
Powershell -c "C:\path\to\diff.exe diff1.tmp diff2.tmp > out.tmp"
```

ファイル名はともかくだいたいこうなります…え、shellquoteは…？えぇー…

### わたしこれ嫌い！

冷静に考えたら関数内でリダイレクト処理書いちゃってるのでこうなるのが当然なんですよね…しょうがないので嫌いな類の解決方法で強引に乗り切ったのが[最初のソース](#結果が見たいわその子のソースを見せてちょうだい)になります。要はシェルに送る文字列の中で強引にquoteを切って解決しました。エレガントじゃないなぁ…

## おしえてVimmer!

実際コレどうなんです？なんかもっとエレガントな解決方法ある気がしてならないんですよ。某名無しさん曰く、[まだ危ないエイリアスがある](http://d.hatena.ne.jp/taku-o/20091114/1258229998)らしいので、シェル起動時に環境変数放り込んでPowershell側のprofileで予めエイリアス切る条件分岐を仕込むとか、そもそも`shellquote`の設定と`diffexpr`の設定で気がついてないところがあって、実は上手くやれば`diffexpr`だけでなんとかなるとか…正直Vimの設定群を追いかけきれてないのでこの方法に自信がないです。

## 編集中に気がついたvim操作関係のこと

- 毎度`<C-r>+`をして酷い目に遭うので`<C-g>u`する癖をちゃんとつけること。
bezier-easing



[gre/bezier-easing: cubic-bezier implementation for your JavaScript animation easings – MIT License](https://github.com/gre/bezier-easing)

[gre/bezier-easing-editor: Cubic Bezier Curve editor made with React & SVG](https://github.com/gre/bezier-easing-editor/)

[bezier-easing-editor example](http://greweb.me/bezier-easing-editor/example/)
Leaflet.PixiOverlay その３many-markers


その１：[Leaflet.PixiOverlay その１マーカーの表示 - Qiita](https://qiita.com/sugasaki/items/cc50fe09a98fcd219719#demo---draw-a-marker)
その２：[Leaflet.PixiOverlay その２many-markers - Qiita](https://qiita.com/sugasaki/items/9b6eb6ca70613b3d47e3)


# はじめに

書き中
FuelPHPのRESTコントローラー名をキャメルケースにしてしまいハマる

FuelPHPのローカル開発環境「xamppのcentOS + Netbeans」では下記

```php:contoroller/hogeData.php
class Controller_HogeData extends Controller_Rest
{
    public function get_initializeFuga()
    {
    }
}
```
のようにキャメルケースで命名していたREST処理用のコントローラー名、メソッド名でも動作していたのですが、同じようにOS等のバージョンを合わせたつもりの本番想定環境では404エラーが発生してしまいました。

結論としてファイル名が小文字のみではなかったのがまずかったようなのでキャメルケースの命名をやめて

```php:contoroller/hogedata.php
class Controller_Hogedata extends Controller_Rest
{
    public function get_initializefuga()
    {
}
}
```
のようにすると解決しました。

※公式日本語ドキュメントにもキャメルケースの命名は避けろとありますが、スネークケースにすると階層が分かれていると解釈するルールなのが面倒・・・
エラー対応：Profile doesn't include the beta-reports-active entitlement.

Xcode9.2においてアーカイブから.ipaファイルを出力する際に失敗した。

> エラー文：Profile doesn't include the beta-reports-active entitlement.

エラーの意味：
Xcode9になってからだろうか、機能追加されたらしい自動的に何かされてるとかで、詳細はいずれ、
beta-reports-active

対応方法：
特に Provisioning や証明書などを操作する必要はない。
（危うく作り直すとか無駄な事をしてしまうケースが出てくるだろう、つらみ）

まず、プロジェクト設定を開いてTARGETSを選択する。
「General」ー＞「signing（Debug）」&「signing（Release）」
この項目を一旦戻して（他のに切り替えるとか、未入力とか）そして再設定する。
アーカイブをやり直してから、エクスポートする。
以上で解決できた。
jupyter notebookのフォントをきれいにする

#参考文献
http://shu87.hateblo.jp/entry/2017/08/30/003224
#やり方
```
cd ~
mkdir .jupyter
mkdir .jupyter/custom
touch ~/.jupyter/custom/custom.css
vi ~/.jupyter/custom/custom.css
```

``` ~/.jupyter/custom/custom.css
.CodeMirror pre, .output pre { font-family: Monaco, monospace; }
```