OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 シングルモード xfs_repair


#### カーネル選択メニューで 'e' を押します。
  `CentOS Linux (3.10.0-862.3.2.el7.x86_64) 7 (Core)`
#### linux16 の行を編集
console, crashkernel があると起動できない場合があるので、必要なもの以外消します。
必要な記述は
1. 起動するカーネル  /vmlinuz-3.10.0-862.3.2.el7.x86_64
2. マウントする root ポイント root=/dev/mapper/VolGroup00-LogVol00 ro 
3. lvm の場合は、ルートパーティションの論理ボリュームをアクティベート rd.lvm.lv=VolGroup00/LogVol00 (rd.lvm.lv=ボリュームグループ/論理ボリューム)
4. init 上書き。/sbin/init の代わりに /sysroot にマウントした /bin/sh　を実行します。 init=/sysroot/bin/sh

* 変更前
```
linux16 /vmlinuz-3.10.0-862.3.2.el7.x86_64 root=/dev/mapper/VolGroup00-LogVol00 ro crashkernel=auto rd.lvm.lv=VolGroup00/LogVol00 rd.lvm.lv=VolGroup00/LogVol01 biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8 LANG=en_US.UTF-8
```

* 変更後
```
linux16 /vmlinuz-3.10.0-862.3.2.el7.x86_64 root=/dev/mapper/VolGroup00-LogVol00 ro rd.lvm.lv=VolGroup00/LogVol00 init=/sysroot/bin/sh
``` 

#### Ctrl-x で起動

#### mount で /sysroot がマウントされていることを確認し、umount する
```
# mount
/dev/mapper/VolGroup00-LogVol00 on /sysroot type xfs (ro,relatime,attr2,inode64,noquota)
# umount /sysroot

```

lvm のアクティブ化に失敗してマウントで出来ていない場合は、
手動で有効にします。

```
# lvm lvscan
  inactive            '/dev/VolGroup00/LogVol00' [23.50 GiB] inherit
  inactive            '/dev/VolGroup00/LogVol01' [4.00 GiB] inherit
# lvm lvchange -ay /dev/VolGroup00/LogVol00
# lvm lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [23.50 GiB] inherit
```


#### xfs_repair 実行

```
# xfs_repair /dev/VolGroup00/LogVol00
Phase 1 - find and verify superblock...
Phase 2 - using internal log
Phase 3 - for each AG...
Phase 4 - check for duplicate blocks...
Phase 5 - rebuild AG headers and trees...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
fixing type mismatch (1/2) in directory/child inode 51382004/50331932 entry "2030232432./log" in dir 51382004 points to an already connected directory inode 50331932
bad hash table for directory inode 51382004 (no leaf entry): rebuilding
rebuilding directory inode 51382004
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 

再度実行して修復済みであることを確認
# xfs_repair /dev/VolGroup00/LogVol00
...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
...
```

#### reboot を実行して完了
【React Native】アプリ開発を楽にする、ボイラープレート作ってみた

# 背景

新しくアプリを作るとき毎度セットアップ (ライブラリの導入、ファイル階層を構成、開発環境設定 etc..) に時間がかかります。汎用性が高く、使い勝手のよいボイラープレートを作成し、セットアップにかかる時間を大幅に削ることが目的。
今回のボイラープレートは、[expo](https://expo.io/) を使用します。

# ボイラープレートとは

新しくReactNativeでアプリを作り始める時の、お決まりの構成。テンプレート的なものになります。今回はどのアプリでも使える、一般的なライブラリのみを使用しています。

# デフォルトで入れたライブラリ一覧

- expo
- react-navigation
- react-redux
- redux
- redux-logger
- redux-promise-middleware
- redux-thunk

# デモ

![demo3.gif](https://qiita-image-store.s3.amazonaws.com/0/102821/83af81d4-c9bc-baae-5b7f-13b8184888f5.gif)

面倒な、Stacknavigation, TabNavigation, Drawer、Redux, 開発環境(ESLint)のセットアップが完了しています。ここからアプリ毎のUI、機能を実装していきます。

# 使い方

セットアップは10分で完了します。

1. [こちらのリンク](https://github.com/WataruMaeda/react-native-boilerplate)より、*zip* をダウンロードしてください。

2. `update app.json`の name と slug 名を変更します
 *"name": "your-app-name",*
 *"slug": "your-app-name",*

3. `yarn install` もしくは `npm install` でプロジェクトをビルド
4. expoからプロジェクトを選択し、シミュレーターを立ち上げる。

# おすすめエディタ

- [VSCode](https://code.visualstudio.com/)

* エクステンションより、`eslint`を導入してください。
バグを見つけたり、括弧やスペースの使い方などのスタイルを統一したりするのに役立ちます。

* iOS開発からRect Native始めた方は、`Mark Jump` をインストールするといいかもしれません。*MARK:* 、*TODO:* が一覧で見れて、関数ジャンプもできるので、開発が非常に捗ります。


# 公開リンク

expoで公開しています。
https://expo.io/@wataru/react-native-boilerplate

プロジェクトはこちらにあります。(Github)
https://github.com/WataruMaeda/react-native-boilerplate

***Happy Coding!***
PHP クラスプロパティの削除

#早速答え
unset($class->{"プロパティ名"});

どうしてこんな処理が必要になったのか

#データベースにクラス情報を保存していた
良い設計とはとても言えないのでこの記事書くの恥ずかしい

#クラス変更によりプロパティーが減った
データベースに保存していなければ特に問題なかった

#unset($class->プロパティ名)
では中身はからになるがプロパティ名が保存されたままになる

そのため今回のような処理を施し、データベースをアップデートすることで解決と相成りました。


#ずいぶん投稿なかったね
開発以外のことにかなり時間を取られていたり、開発では特に調べ物なく進められていたのです。
決してサボっていたわけではない（ハズ）
JavaScriptの関数についてメモ

#関数を定義する方法
##1. function命令を使う
```js:sum.js
function sum(a, b){
  return a + b;
}
console.log('2 + 3 = ' + sum(2, 3));
```
この方法で定義した関数は呼び出しより後に、位置することが許される

```js:sum.js
console.log('2 + 3 = ' + sum(2, 3));
function sum(a, b){
  return a + b;
}
```

##2. 無名関数を使う
```js:sum.js
var sum = function(a, b){
  return a + b;
}
console.log('2 + 3 = ' + sum(2, 3));
```
##3. 組み込みオブジェクトFunctionをインスタンス化する
```js:sum.js
var sum = new Function('a', 'b', 'return a + b;');
console.log('2 + 3 = ' + sum(2, 3));

```
##4. アロー関数を使う
```js:sum.js
let sum = (a, b) => a + b;
console.log('2 + 3 = ' + sum(2, 3));
```

#可変長引数の関数を定義する方法
仮引数の前に...をつけると、その仮引数は配列として動作する。

```js:sum.js
sum = function(...numsArray){
  let result = 0;
  for (let elm of numsArray){
    result += elm;
  }
  return result;
}
console.log('sum(1, 2, 3) :' + sum(1, 2, 3));
```

#参照渡しと値渡し
JavaScriptにおける関数は実引数として基本型を与えると値渡しで動作して、参照型を与えると参照渡しで動作する。

#引数の数をチェックする方法
###　argumentsオブジェクトを使う
```js:sum.js
sum = function(a, b){
  if(arguments.length != 2)
    return 'err';
  return a + b;
}
console.log('sum(1, 2, 3) :' + sum(1, 2, 3));
```
#引数のデフォルト値を設定する方法
###　1.undefinedかどうか自分でチェックする
```js:arg_default.js
getPayment = function(price, o_tax){
  if(o_tax == undefined)
    o_tax = 1.08;
  return price * o_tax;
}
console.log('getPayment(500) :' + getPayment(500));
console.log('getPayment(500, 1.1) :' + getPayment(500, 1.1));
```

###　2.仮引数に＝をつける
```js:arg_default.js
getPayment = function(price, o_tax = 1.08){
  return price * o_tax;
}
console.log('getPayment(500) :' + getPayment(500));
console.log('getPayment(500, 1.1) :' + getPayment(500, 1.1));
```
#一部のプロパティだけ利用する関数
仮引数には使用したいプロパティだけを指定する。

```js:func_test.js
getId = function({id}){
  return id;
}
person_A = {
  id   : 1,
  name : 'Jim'
}
console.log('id : ' + getId(person_A));
```
Bash on Ubuntu on Windows に外部からSSHで接続する


# Windows側の設定

Bash on Ubuntu on Windows を[こちら](https://qiita.com/UNILORN/items/e729bce47c83e0336757)で使用可能な状態にしておく。

## 手順

1. Windowsファイアウォール詳細設定画面を開く
2. 受信の規則をクリック
3. 右側に[新しい規則...]があるので、クリック
4. 任意のTCPポートで22番を開放する
5. 送信の規則でも同じことを行う
6. bashを起動
7. コマンドを実行

```bash
$ cd ~
$ mkdir .ssh
$ cd .ssh
$ touch authorized_keys
$ vim authorized_keys

# ここで接続する側のRSA公開鍵を入力

$ vim /etc/ssh/sshd_config

# AuthorizedKeysFile %h/.ssh/authorized_keys のコメントアウトを解除する

$ sudo service ssh start
```

以上

あとは、いつもどおりSSH接続をすればOK

`ssh [ユーザ名]@[ホスト名].local`
YouTube Analytics and Reporting APIs v2でrowsがempty

[ここ](https://developers.google.com/youtube/analytics/migration)と[ここ](https://developers.google.com/youtube/reporting/v1/code_samples/python)を参考にv2のAPI request送っているのにrowsが常にemptyになって6時間ぐらい悩んだのでQiitaにメモ残します．答えは簡単で，documentが間違ってます．
[Help Forum](https://productforums.google.com/forum/#!topic/youtube/e08jHBGtA_w;context-place=topicsearchin/youtube/category$3Ahomepage-channels-subscriptions-and-social-features%7Csort:relevance%7Cspell:false)にたどり着いてすぐに解決しました．

documentにかかれてるscopeは
`https://www.googleapis.com/auth/yt-analytics.readonly `
ですが，実際は
`https://www.googleapis.com/auth/youtube.readonly`
です．scopeを更新するため再度appを承認する必要があります．
バリデーションについて

<h2 id="Webエンジニアを目指し基礎を学んでいる:relaxed:">Rubyの開発者を目指し基礎を学んでいる:relaxed:初心者の私が知識をまとめてみました。</h2>

<p><strong>目的:</strong></p>
<ul>
<li>自己理解</li>
<li>情報共有:sweat:</li>
<li>情報整理</li>
</ul>

<h3><strong>トピックス：</strong></h3>
<h3>
:point_right: バリデーションとは？
</h3>

<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="http://railsdoc.com/references/validates"><i class="fa fa-link">:point_right: オブジェクトが DBに保存される前に検証する方法</i></a>
</h2>
<p><strong>今</strong>回はバリデーションについてまとめてみます。(正直難しい)今回は新たな試みとして、リファレンスのリンクを:v:いれておきました。
</p>
<p>

<ul>

<li>不正なデータがDBに保存されないようにDBをチェックする</li>
<li>不正なデータはDBに保存されない</li>

<p>
概要としてはこういったところでしょうか。書き方は、
</p>


</p>

```bash:post.rb

Class Post < ApplicationRecord
  validates : content, {presence: true}
end

####################################
#content, >> カラム名がcontentか判定する。
#presence: true >> 空の投稿も防ぐ
####################################

```

<p>
ポイントとしては...
</p>

<ul>
<li>検証したいカラム（フィールド）は決まっているか</li>
<li>検証パターンは何にするか（文字の長さ？値の有無？etc...）</li>
</ul>
<p>この二点を抑えることが重要なようですね:frowning2:</p>


<p>
<h2>
<span id="code---コードの挿入" class="fragment"></span><i class="fa fa-link"></i>
to be continued...
</h2>
</a></h2>
<li id="fn2">
</a>徐々にRailsをまとめていきたい:smirk:。短く、30分くらいでまとめられれば良いのですがなんだかんだで1h~2hかかってしまう。Qiitaのタグ、楽に書けませんかね。エディタとかあればいいのですが。(atomでデバイス入れ？ればいいのか。？:thinking:)</p>
</li>
Unity+Riderのすすめ ～Context ActionでSerializeFieldを爆速で！～

Riderの[Context Action](https://www.jetbrains.com/help/rider/Coding_Assistance__Context_Actions.html)を使えば、SerializeFieldを爆速で書くことができます。

Context Actionは、

Mac : ⌥ + Enter　
Win : Alt+Enter

で実行できます。


まずは、フィールドにSerializeField属性を付ける例。

![serialized.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/e0fff422-3164-c7bc-2376-c5915866a63e.gif)

次は自動実装プロパティを、SerializeField属性つきのバッキングフィールドに変換する例。

![property.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/e334fc4b-1101-09d0-c64b-541e1f04985f.gif)

最後にNonSerialize属性をつける例。

![nonserialized.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/1f0584ea-b5ac-2500-5a12-bd216bf5b75e.gif)

MonoBehaviourやScriptableObjectのサブクラスでないとできませんが、便利！
リーンキャンバスをマークダウンで書く

# 背景
個人的にもリーンキャンバスを作る機会が多くなったので忘れないようにメモ。
HTMLも使っちゃっているので…ご了承ください

# 結論
ところどころ改行入ってしまっているけどこんな感じ

<img width="924" alt="スクリーンショット 2018-06-13 1.14.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/89227/62314cb1-dad1-c5f3-b518-a5028b78ec5f.png">


## コード

``` Markdown:LeanCanvas.md
<table  border="1">
<tr><td rowspan="2">

## PROBLEM
## 課題
・ここに文字列

## 既存の代替品
・ここに文字列

</td><td>

# SOLUTION
## 何を提供するか？
・ここに文字列

</td><td rowspan="2" colspan="2">

# UNIQUE VALUE PROPOSITION
## 独自の価値提案
・ここに文字列

# HIGH-LEVEL CONCEPT
## ハイレベルコンセプト
・ここに文字列


</td><td>

# UNFAIR ADVANTAGE
## 圧倒的な優位性
・ここに文字列


</td><td rowspan="2">

# CUSTOMER SEGMENTS
## 顧客セグメント
・ここに文字列

## アーリーアダプター
・ここに文字列

</td></tr>
<tr><td>

# KEY METRICS
## 評価基準
・ここに文字列


</td><td>

# CHANNELS
## チャンネル
・ここに文字列

</td></tr>

<tr><td colspan="3">

# COST STRUCTURE
## コスト構造
・ここに文字列


</td><td colspan="3">

# REVENUE STREAMS
## 収益構造
・ここに文字列

</td></tr>
</table>
```



## 注意
* 方言によっては```##```とかが聞かないので別のに置き換えてください。

## コメント
あぁ、テキストで管理出来るって素敵…


# 追記
`qiita`さんの方でも上手く動かないようなので`#`をなくしたものも追記させていただきます。

``` Markdown:LeanCanvas.md
<table  border="1">
<tr><td rowspan="2">
<b>PROBLEM</b> <br>
<b>課題</b> <br>
・ここに文字列 <br><br><br>
 
<b>既存の代替品</b> <br>
・ここに文字列 <br><br><br>

</td><td>
<b>SOLUTION</b> <br>
<b>何を提供するか？</b> <br>
・ここに文字列 <br><br><br>

</td><td rowspan="2" colspan="2">
<b>UNIQUE VALUE PROPOSITION</b><br>
<b>独自の価値提案</b> <br>
・ここに文字列 <br><br><br>

<b>HIGH-LEVEL CONCEPT</b> <br>
<b>ハイレベルコンセプト</b> <br>
・ここに文字列 <br><br><br>

</td><td>
<b>UNFAIR ADVANTAGE</b> <br>
<b>圧倒的な優位性</b> <br>
・ここに文字列 <br>
<br><br>
</td><td rowspan="2">
<b>CUSTOMER SEGMENTS</b><br>
<b>顧客セグメント</b> <br>
・ここに文字列 <br>
 <br><br>
<b>アーリーアダプター</b> <br>
・ここに文字列 <br><br><br>

</td></tr>
<tr><td><br>
<b>KEY METRICS</b> 
<b>評価基準</b> <br>
・ここに文字列 <br><br><br>

</td><td>
<b>CHANNELS</b> <br>
<b>チャンネル</b> <br>
・ここに文字列 <br><br><br>

</td></tr>
<tr><td colspan="3">
<b>COST STRUCTURE</b> <br>
<b>コスト構造</b> <br>
・ここに文字列 <br><br><br>

</td><td colspan="3">
<b>REVENUE STREAMS</b> <br>
<b>収益構造</b> <br>
・ここに文字列 <br><br><br>

</td></tr>
</table>
```

## 表示

<table  border="1">
<tr><td rowspan="2">
<b>PROBLEM</b> <br>
<b>課題</b> <br>
・ここに文字列 <br><br><br>
 
<b>既存の代替品</b> <br>
・ここに文字列 <br><br><br>

</td><td>
<b>SOLUTION</b> <br>
<b>何を提供するか？</b> <br>
・ここに文字列 <br><br><br>

</td><td rowspan="2" colspan="2">
<b>UNIQUE VALUE PROPOSITION</b><br>
<b>独自の価値提案</b> <br>
・ここに文字列 <br><br><br>

<b>HIGH-LEVEL CONCEPT</b> <br>
<b>ハイレベルコンセプト</b> <br>
・ここに文字列 <br><br><br>

</td><td>
<b>UNFAIR ADVANTAGE</b> <br>
<b>圧倒的な優位性</b> <br>
・ここに文字列 <br>
<br><br>
</td><td rowspan="2">
<b>CUSTOMER SEGMENTS</b><br>
<b>顧客セグメント</b> <br>
・ここに文字列 <br>
 <br><br>
<b>アーリーアダプター</b> <br>
・ここに文字列 <br><br><br>

</td></tr>
<tr><td><br>
<b>KEY METRICS</b> 
<b>評価基準</b> <br>
・ここに文字列 <br><br><br>

</td><td>
<b>CHANNELS</b> <br>
<b>チャンネル</b> <br>
・ここに文字列 <br><br><br>

</td></tr>
<tr><td colspan="3">
<b>COST STRUCTURE</b> <br>
<b>コスト構造</b> <br>
・ここに文字列 <br><br><br>

</td><td colspan="3">
<b>REVENUE STREAMS</b> <br>
<b>収益構造</b> <br>
・ここに文字列 <br><br><br>

</td></tr>
</table>
MacOS 10.13 でデバイストークンを取得する

# 概要

[Amazon SNS で Mac OS X アプリに Push 通知が送信できるようになりました！](https://dev.classmethod.jp/cloud/aws/sns-publish-to-os-x/) を試していましたが、デバイストークンの取得が Objective-C だったのと、Swift でデバイストークンを取得する方法が中々見つからなかったのでこの記事にメモしておこうと思います。

# 環境

MacBook Pro (Retina, 13-inch, Early 2015)
macOS High Sierra 10.13.1 
Xcode Version 9.2
Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2).

# デバイストークンの取得

[Apple公式](https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html#//apple_ref/doc/uid/TP40008194-CH6-SW6) では下記のように書いてありますが、このままではコンパイルが通りません。

```swift
func applicationDidFinishLaunching(_ aNotification: Notification) {
 // ユーザーとのやり取りを最初に設定。
 self.configureUserInteractions()
    
 NSApplication.shared().registerForRemoteNotifications(matching: [.alert, .sound])
}
 
// リモート通知の登録処理。
func application(_ application: NSApplication,
 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
 // カスタムメソッドを使って、トークンをプロバイダに転送。
 self.forwardTokenToServer(token: deviceToken)
}
 
func application(_ application: NSApplication,
 didFailToRegisterForRemoteNotificationsWithError error: Error) {
 // トークンは現時点で取得不能。
 print("Remote notification support is unavailable due to error: \(error.localizedDescription)")
}
```

理由は単純で、 `configureUserInteractions()` と `forwardTokenToServer()` は自分で実装する前提のコードだからでした。(そもそもこのコードはデバイストークン取得用では無い？)

下記のように書き換えることで、ログ情報にデバイストークンが出力されるようになります。

```swift
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        NSApplication.shared.registerForRemoteNotifications(matching: [.alert, .sound])
    }
    
    // リモート通知の登録処理。
    func application(_ application: NSApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print(deviceToken.reduce("", {$0 + String(format: "%02X", $1)}))
    }
    
    func application(_ application: NSApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        // トークンは現時点で取得不能。
        print("Remote notification support is unavailable due to error: \(error.localizedDescription)")
    }
}
```

参考URL: https://www.queryoverflow.gdn/query/swift-obtaining-a-device-token-in-ios-27_50011909.html

# まとめ

雑な記事で申し訳ありませんが、誰かの助けになればと思います。
また、p12ファイルの生成等の手順は[この記事](https://qiita.com/natsumo/items/d5cc1d0be427ca3af1cb)が参考になるので良いと思います。
RとSublimeTextの連携

# RとSublimeText

(2018/6/12)
Rは通常のプログラムとは違い、豊富な関数と、扱いやすいベクトル型やデータフレームなどにより、その都度データを加工・処理する対話型の使い方に向いている。

既にR GUIやRStudioのような優れた環境が存在するが、R GUIはエディタがシンプルすぎて機能性にかけ、RStudioはまだまだ安定性にかけるところがある。そこで、豊富な機能と拡張性をもったエディタであるSublimeText上でRのコードを記述し、そのコードをR GUIのコンソールに送るという環境が現状良いように思う。

Windowsでこの環境の構築手順について書いていく。試したOS等は以下のようになっている。

```
(2018/06/12)
Windows10
R version 3.5.0
Sublime Text versoin 3.1.1
```

## RとSublimeText3のインストール

まずRとSublimeText3（以下Sublime）を普通にインストールする。

## Sublimeにパッケージコントロールを導入

次にSublimeのパッケージを入れたり設定を変える。Rの方は特に設定することはない。

Sublimeのパッケージをインストールしたり、管理するためのツールとして**パッケージコントロール**がある。Rと連携するためのパッケージをインストールしたいので、以下のサイトに従って導入する。

https://packagecontrol.io/installation#st3

簡単に書くと、 ``ctrl + ` `` キー（もしくはメニューの `View` > `Show Console`）でコンソールを表示し、サイトに書かれているコードをそこにコピペしてEnter押せばOK。

インストールできたら `ctrl + shift + p` でSublimeの**コマンドパレット**を表示する。ここに文字を入力することで、パッケージコントロールの操作やSublimeの機能を操作することができ、大変便利である。

例えば、" `set r` "というふうに入力すれば、シンタックスハイライトをRモードにする機能が候補として表示され、Enterを押せば実際にRモードに変わってくれる。

パッケージコントロールを用いてパッケージをインストールするには、コマンドパレットに" `install` "と入力すると表示される、 `Package Control: Install Package` を選択する。そうするとインストールできるパッケージ一覧が表示され、検索もできる。

## おすすめのパッケージ

少し脇道にそれるが、WindowsでSublimeを使うなら必須と言ってもいいパッケージを紹介する。

### ConvertToUTF8

文字コードがShift_JISなどのファイルを開くと文字化けしてしまうが、このパッケージを入れておけば自動で判別してUTF8に変換してくれる。

### IMESupport

日本語入力をサポートする。無いとかなり使いづらい。

## Rのためのパッケージをインストール

本題に戻り、Rにコードを送信するために**R-box**パッケージを導入する。

`ctrl + shift + p` からコマンドパレットを呼び出し、 `Install packages` を選択、検索欄に `r-box` と入力してEnterを押す。

導入されたら、コマンドパレットで `List Packages` を選択し、R-boxが入っていることを確認する。同時に**SendCode**というパッケージも入っているはずなのでそれも確認する。（ない場合は導入する）

## パッケージの説明

### R-box

RをSublimeで使うのに便利なツールが一度に導入できる。デフォルトのものより優秀なシンタックスハイライト、関数などの候補表示、外部へのコードの送信（SendCodeパッケージを利用）などである。

### SendCode

外部のターミナルアプリなどにSublimeで書いたコードを送るためのパッケージ。R-boxはこれを利用してR GUIやRStudioにコードを送る。

## パッケージの設定

### R-boxの設定

R GUIがあるフォルダを指定する必要がある。コマンドパレットで `Preferences: R-box Settings` （もしくはメニューの `Preferences` > `Package Settings` > `R-box` > `Settings` ）を選び、以下のように記述する。

```
{
    "rscript_binary": "C:\\Program Files\\R\\R-3.5.0\\bin\\x64"
}	
```

`C:\\Program Files\\R\\R-3.5.0\\bin\\x64` と書かれているところを自分の環境のパスに置き換え、保存して閉じる。

今後**Rのバージョンをアップデートしたときなどはここを書き換える**。また、うまく動かない場合はだいたいここが原因なのでいろいろ変えてみる。

### SendCodeの設定

Rモードのときに、自動的にR GUIにコードを送るように設定する。R-boxと同様にSendCodeの設定ファイルを開き、以下のように記述する。

```
{
    "prog": "r",
    "r": {
	    "prog": "r"
    }
}
```

以上で設定は終了。

## 使ってみる

ではちゃんと設定されているか試してみる。

1. 念の為Sublimeを一旦終了し、R GUIとSublimeを起動する
2. SublimeのモードをRにする（コマンドパレットから `Set Syntax: R` ）
3. 適当なRのコードを入力して `ctrl + enter`

これでRの方にコードが送られていれば成功！送りたい行にカーソルがある状態で `ctrl + enter` を押すとその行が、送りたい部分を選択して押すと選択した領域全体が送られる。

もしうまくいかない場合は、コマンドパレットから `SendCode: Choose Program` を選択し、 `R GUI` にしてみてうまくいくか試してほしい。それでもだめなら設定を見直してみる。（特にR GUIのパスのところ）
入れ子になった配下のコントロールをすべて列挙する

久しぶりに仕事でWindows.Formsのフォーム内すべてのコントロールをまとめて設定する操作が必要になって、再帰処理を自分で考えるのが面倒なので検索したら[えらく古いコード](http://www.atmarkit.co.jp/fdotnet/dotnettips/224controls/controls.html)が。

#ArrayList版(from @&#xFFF0;IT)

```csharp
public Control[] GetAllControls(Control top)
{
  ArrayList buf = new ArrayList();
  foreach (Control c in top.Controls)
  {
    buf.Add(c);
    buf.AddRange(GetAllControls(c));
  }
  return (Control[])buf.ToArray(typeof(Control));
}
```

このままでも使えるんだけど、今さらArrayListなんか使いたくないってことでジェネリックコレクションを使うように変更。
Add()をなくしてすべてAddRange()で追加してるので若干高速化してると思う。

#ジェネリック版

```csharp
List<Control> GetAllControls_Generic(Control ctrl)
{
  var list = new List<Control>(ctrl.Controls.Cast<Control>());
  foreach(Control child in ctrl.Controls.Cast<Control>())
  {
    list.AddRange(GetAllControls_Generic(child));
  }
  return list;
}
```

ここまで書いてるうちに「foreachの中がシンプルになったからLinqにできるのでは？」と思いついてさらにコンパクトに。

#Linq版

```csharp
IEnumerable<Control> GetAllControls_Linq(Control ctrl)
{
  IEnumerable<Control> list = ctrl.Controls.Cast<Control>();
  return list.Concat(list.SelectMany(child => GetAllControls_Linq(child)));
}
```

Linq版はワーク配列を作らずシーケンスの連結だけになったのでかなり効率的になりました。(たぶん)
mysqldumpでDBのデータを取得し、そのファイルを実行するまで

#やりたいこと/背景
PRDのデータを、STGに反映させたい。

#解決策
```ruby:terminal
#欲しいデータがあるDB（今回はPRD）にssh接続
$ ssh PRD_IP_address

#dumpファイルを取得（ファイル名は、dump時の日付で、home/に作成）
$ mysqldump -u {usr_name} -p{password} --single-transaction --default-character-set=utf8 --routines DB_name > ./`date +%Y%m%d_%H%M`- dump.sql

#dumpファイルを、scpでデータを挿入したいDB（今回はSTG）のhome/にコピーして送信
#idを求められる場合、以下のようにiオプションを使用して、秘密鍵を指定してあげます
$ scp -i ~/.ssh/id_rsa.pub user@PRD_IP:~/20180613_0101-dump.sql user@STG_IP:~/

#ここで一旦exitしてPRDから出ます
$ exit

#dumpデータを流し込みたいDB（今回はSTG）に移動
$ ssh STG_IP

#STGにて、データの反映実行
$ mysql -u{user_name} -p{password} DB_name < ./20180613_0101-dump.sql

```

#最後に
dumpファイル生成時には、1レコードずつ取得し、取得するタイミングでDBにきたリクエストなどを遮断するらしい。DBがアクティブ状態の時にユーザーに迷惑をかける場合があるので、注意をした方がいいです。
WorkMailのメールをiPhoneで送受信する方法の備忘録

#はじめに
WorkMailを使うことになったのですが、
AWSは24時間？くらいで強制的にログアウトさせられちゃうので
毎回毎回メールボックスを見るためにログインするのが面倒！

と言うわけでiPhoneにデフォルトで入ってる
メールでWorkMailのメールが見れるようになれば便利だなと思って設定しました。

#環境
iOS:11.2.6
ハード:iPhone7
キャリア：KDDI

#設定方法
スクショとかあればわかりやすいと思うのですが、
面倒くさいので割愛

今度余裕合ったら足しときます。

##設定画面までの行き方
まず、
設定 ＞ アカウントとパスワード ＞ アカウントを追加
を選択


そしたらiCloudとかExchangeとか
メールソフトを選ぶ画面が出てくると思うので
「その他」を選択


そのあと、
メールアカウントを追加を選択


##新規アカウント登録
新規アカウント登録画面に映ると思うので
そしたら下記のように記入

名前：任意で名前を記入（なんでもいい）
メール：WorkMailで登録したメールアドレス
パスワード：WorkMailで設定したパスワード
説明：任意で説明を記入（なんでもいい）

記入したら右上の「次へ」がアクティブになるので
次へを押す

画面が変わって
IMAPかPOPを画面上で選べるようになってるので
IMAPを選択した状態でそれ以下の情報を記入していく
（おそらく何もしなくてもデフォルトでIMAPになってるはず）


名前・メール・説明は前画面で入力されたものが引き継がれていると思うので
それ以下を入力していく

###受信メールサーバ（必須）
※ホスト名：imap.mail.us-east-1.awsapps.com
ユーザ名：WorkMailで登録したメールアドレス
パスワード：WorkMailで登録したパスワード

色々ググったけどうまく登録出来なかった原因は
ユーザ名の所にWorkMailで設定したユーザ名を入れてたから。

いや、ユーザ名って書いてるんやから
ユーザ名やと思うやろw



ここはユーザ名と書いてますが「メールアドレス」を記入しないとうまく設定出来ません。

###送信メールサーバ（試してないけど多分任意）
※ホスト名：smtp.mail.us-east-1.awsapps.com
ユーザ名：WorkMailで登録したメールアドレス
パスワード：WorkMailで登録したパスワード

受信メールサーバと同様


※imap.mail.us-east-1.awsapps.comとかに書いてるリージョン名は
WorkMailを登録したリージョン名を記入してください。
上記は登録リージョンがバージニアの場合の設定です。

登録リージョンとか、やり方とかは
ここを主に参考にしました。
[[新機能]Amazon WorkMailがSMTPプロトコルをサポート](https://dev.classmethod.jp/cloud/aws/amazon-workmail-smtp-support/)


上記を記入し終わったら
また右上の「次へ」がアクティブになってると思うので
それをクリックすればしばらく通信中になって、
登録ができるようになると思います！

その読み込みが終わったあと
メールとメモ帳が選べるみたいなんですけど
よくわかってないんで
いつもとりあえずメールだけ選択してます。


##終わり
設定出来たでしょうか？
思い出しで書いてるので手順とか足りてないとこあったらすいません。

使ってみて思うのは
メールきても自分で受信ボックスに行って更新しないとメールが表示されないことが多いので
まあまあ面倒です。

でも、やっぱりスマホでWorkMailを送受信できるのは気軽でいいです！
皆さんもぜひお試しあれ！

また、何かあれば追記します〜！
RaspbeeryPIをホスト名で接続する


# 方法

sshで接続する（直接操作する場合は省く）

**Raspbian**
`ssh pi@raspberrypi.local`

**Ubuntu Mate** ※SSHでの接続には初期設定が必要です
`ssh ubuntu@[任意のIPアドレス]`

```bash
$ sudo apt install avahi-daemon
$ sudo vim /etc/hostname

## 任意のホスト名に変更

$ sudo vim /etc/hosts

## 127.0.1.1       [任意のホスト名]

$ sudo hostname [任意のホスト名]
$ sudo service avahi-daemon restart
$ exit
```

変更後は以下のコマンドで接続可能

```bash
$ ssh ユーザ名@任意のホスト名.local
```


以上
MySQLに接続しようとMy SQL Command Line Clientでパスワードを入力すると閉じてしまう


My SQLを使用しようとして、
My SQL Command Line Client (MySQLのコマンドラインツール)で接続しようとパスワードを入力するも、
パスワード入力⇒Enter
の後にウインドウが閉じてしまって接続できない。

原因
ググってみると何件かQ&Aヒットしましたが、
中にはインストールした方が良いと回答をもらってるケースも。

私の今回の場合は、
『パスワード間違い』
でした。

どうやって気づいたかというと、
GUIツールのMySQL Workbenchで接続しようとしてみると
↓
Databaseタブから、Connect to database、

Password項目のStore in Vault...を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210223/48730f5d-144d-22f2-897e-8a4036b003e9.png)
↓
パスワードを入力、『OK』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210223/beb23576-4e36-071e-d159-28b141dede98.png)
↓
パスワード入力ウィザードが閉じられるので、『OK』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210223/e1051bd5-e794-1769-2d70-75fcd3bd5c3f.png)
↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210223/13fbdb82-f386-58ec-1afa-0e4cf66959c2.png)

何も言わずもう一度パスワード入力画面をポップアップしてくれます(パスワード間違い)。

もう一度コマンドラインで正しいパスワードで接続しなおしてみると、無事接続できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210223/c0666fbc-67bd-9133-886e-7c602f48216b.png)


前にも同じことが起きてググったのでこれ以上繰り返さないよう記しました。
他の原因でウインドウが閉じてしまうケースもあるようなので、その際は要調査ですね。

END
ファイルを読み込む時に複数ある区切り文字を統一してから読み込む

ファイルを開くときに区切りたい文字が複数ある時の対処法を考えました。
複数をの区切り文字があるとnumpy.loadtxtで読み込めなかったので、ちゃんと読み込めるようにすることが今回の目的です。

ただ、全然スマートではないです・・・

```python
#ファイルの中身
#sample.txt
1,2,3,11 22 33 44,55 66 77,4
1,2,3,11 22 33 44,55 66 77,4
1,2,3,11 22 33 44,55 66 77,4
1,2,3,11 22 33 44,55 66 77,4
```

例えば、こんなデータがある時にカンマと空白の２つで区切ってデータを読み込みたい時があるとします。

そんなときは・・・

```python
#まず、ファイル全体を文字列として読み込む
file = open(path+"sample.txt","r")
string = file.read()
file.close()

#カンマを空白に置換して、区切り文字を空白に統一する
string = string.replace(","," ")

#再度テキストに書き出す
file = open(path+"sample.txt","w")
file.write(string)
file.close()
```

こんな方法で区切り文字を統一しました。
これで、numpyなどでデータを読み込めるようになりました。

```python
np.loadtxt(path+"sample.txt",delimiter=" ")

#array([[ 1.,  2.,  3., 11., 22., 33., 44., 55., 66., 77.,  4.],
#       [ 1.,  2.,  3., 11., 22., 33., 44., 55., 66., 77.,  4.],
#       [ 1.,  2.,  3., 11., 22., 33., 44., 55., 66., 77.,  4.],
#       [ 1.,  2.,  3., 11., 22., 33., 44., 55., 66., 77.,  4.]])
```

まだ、駆け出しでファイルの読み書きでも躓くので、記録させていただきました。


追記
一度ファイルに書き出さずに文字列をそのままファイルとして扱う方法を教えていただいたので追記します。

```python
import numpy as np
from io import StringIO

#ファイルを文字列として読み込む
file = open(path+"sample.txt","r")
string = file.read()
file.close()
#カンマを空白に置換
string = string.replace(","," ")
#文字列をファイルに変換
string = StringIO(string)
#numpyで読み込む
np.loadtxt(string)

#array([[ 1.,  2.,  3., 11., 22., 33., 44., 55., 66., 77.,  4.],
#       [ 1.,  2.,  3., 11., 22., 33., 44., 55., 66., 77.,  4.],
#       [ 1.,  2.,  3., 11., 22., 33., 44., 55., 66., 77.,  4.],
#       [ 1.,  2.,  3., 11., 22., 33., 44., 55., 66., 77.,  4.]])
```

文字列をファイルとして扱う方がスマートですね。
コメントありがとうございます。
実行中プロセスの所属グループ(Linux)

#はじめに
Linuxプロセスの権限エラーで、実行中プロセスの所属グループを確認する方法を調べました。

#id コマンドと /proc
shell上ではidコマンドで所属グループが表示されます。それ以外の場合は、/proc/\<PID\>/statusを確認して所属しているグループがわかります。グループに権限を与えたはずなのに、思ったように動作してくれない（ファイルが作れないなど）場合には見てみるといいです。

```shell-session:id
#現在の状況を確認
$ id
uid=1000(keniooi) gid=1000(keniooi) groups=1000(keniooi),10(wheel) 
$ ps
  PID TTY          TIME CMD
 3232 pts/0    00:00:00 bash
 4309 pts/0    00:00:00 ps


#グループを作成しメンバーに追加
$ su -
# echo group1:x:1001:keniooi >> /etc/group
# exit

#追加した前から起動中のプロセスでは変化なし
$ id
uid=1000(keniooi) gid=1000(keniooi) groups=1000(keniooi),10(wheel) 

#su - keniooiでログイン
$ su - keniooi
Password: 
$ id
uid=1000(keniooi) gid=1000(keniooi) groups=1000(keniooi),10(wheel),1001(group1) 
```

PID 3232 の状況を確認します。idコマンドの使えないプロセスでもこの方法なら大丈夫です。

```shell-session:/proc
[keniooi@keniooi ~]$ cd /proc/3232/
[keniooi@keniooi 3232]$ cat status | grep Group
Groups:	10 1000 
[keniooi@keniooi 3232]$ id
uid=1000(keniooi) gid=1000(keniooi) groups=1000(keniooi),10(wheel) 
```

#psコマンドでの補助グループ情報
コメント欄で教えていただいたので本文にも更新させていただきます。普段 ps -ef , ps aux だけなので思いつきませんでした。-o オプションで supgid を表示させられます。

```shell-session:ps
$ ps
  PID TTY          TIME CMD
18982 pts/0    00:00:00 bash
19069 pts/0    00:00:00 ps
$ ps -o uid,gid,supgid,pid,args -p 18982
  UID   GID SUPGID                 PID COMMAND
 1000  1000 10,1000              18982 bash
$ id
uid=1000(keniooi) gid=1000(keniooi) groups=1000(keniooi),10(wheel)
```

#環境
$ cat /etc/system-release
CentOS Linux release 7.5.1804 (Core) 

#参考
[Man page of PROC](https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html)
[ps(1)](http://man7.org/linux/man-pages/man1/ps.1.html)
[How to get the supplementary groups IDs of a process?](https://unix.stackexchange.com/questions/409843/how-to-get-the-supplementary-groups-ids-of-a-process/409888)
LIFF について

# はじめに
これは LIFF を使用して、個人的に気になった点を検証し、まとめているものです。
一部に間違いなどがある可能性がありますので、何かありましたら細かい事でも指摘していただけると助かります。

# 検証項目と結果

## URLスキームを踏むだけで送信されてしまうものは可能か？
→可能

```javascript:サンプル
liff.init(data => {
    liff.sendMessages([
        {
            type:'text',
            text:'Test'
        }
    ]);
    liff.closeWindow();
});
```
（LIFF-APPが登録されているチャネルを友達に追加していない場合には初回利用には認証が必要だが、)実際にこのコードで URL スキームを踏むだけで送信され、自動的に閉じられてしまった。ただ、実際に送信されるためには**トークルーム上で** URL スキームを踏む必要があり、スパム的な利用は不可能と思われる。幼稚なイタズラ等に利用されない事を願う。

## GETパラメータは利用可能か？
→可能
URLスキームに付ける事で送信できる。
 （例: `line://app/*************?test=hello`）

```javascript:メッセージオブジェクト
{
    type: 'text',
    text:location.search.substring(1)
}
```

メッセージオブジェクトをこれにすることで、`test=hello` が実際に送信された。

## その他の目的に利用可能か？
~~→△
メッセージや画像等の送信以外の目的には向かないと思われる。
というのも、何かデータを他のサーバに送信する際、個人を識別できるのは userId のみとなってしまい、場合によってはなりすましが可能になってしまう。（もちろんこれは LIFF ではなく、他の問題だが）。
よって、あくまでそのページ内で完結するものにする必要がある。
もちろんアイデアによっては画期的なものができる可能性は大いにある。~~
→○
浅はかだった。先程自分でパラメータを渡せることを検証していたのに……。
予めトークンや別に発行したユーザーID等をパラメータに付加しておけば、データを他のサーバに送信する事は可能。

## 同じurlを異なるviewで登録して、それぞれをLIFFアプリ内から起動可能か？
→△
まずこのタイトルで伝わっているのかわからないので、やろうとしたことを簡単に。
まず **view を tall で登録**したLIFFアプリを開いて、中にあらかじめ張っておいた **同じLIFFアプリだけど view が full** のリンクをクリック。

希望した挙動→(再読み込みを挟んで)そのままウィンドウのサイズだけが変わる

実際の挙動 → ただ新しくLIFFアプリが上にかぶせて表示された

よくよく考えたら当たり前の事だった（のかもしれない）。
要望したらそのうち Window のサイズを変更する機能を付けてくれるかもしれない。

## いくつまで同時にLIFFアプリを起動できるか？
LIFFアプリの中に URL スキームのリンクを設置し、多重起動を検証した。
途中で色々と恐ろしくなってやめたが、少なくとも20個はどんどん積み重ねられた。ので、恐らくその手の心配は不要。

## その他
この先、確認できた事があれば随時追加したいと思う。
[GDPR] 海外サイトによくあるCookieの同意文を表示させるJavaScript

# きっかけ

最近、GDPR（EU一般データ保護規則）と騒がれ日本語のサイトでも見かけるクッキーの同意文。

https://japan.cnet.com/article/35119829/

わざわざそのためにレイアウト作るのが面倒な方に、テンプレート埋めればCookieの同意文が書けるJavaScript。

#  完成形

<p data-height="265" data-theme-id="0" data-slug-hash="KemQjR" data-default-tab="html,result" data-user="haikyoiko" data-embed-version="2" data-pen-title="CookieContept" class="codepen">See the Pen <a href="https://codepen.io/haikyoiko/pen/KemQjR/">CookieContept</a> by haikyoiko (<a href="https://codepen.io/haikyoiko">@haikyoiko</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


上記を完成させるのは、スリーステップで必要な記述が完成。

# ステップ１：以下のURLを開く

https://cookieconsent.insites.com/download/

![Coockie.png](https://qiita-image-store.s3.amazonaws.com/0/230829/358f0d55-b9a6-7a40-2f73-01ec1c9d44ef.png)

# ステップ２：Configureで必要な設定を埋める

以下の画面よりボタンの配置、レイアウト、配色、LearnMoreの遷移先などを設定

# ステップ３：CopyCodeを選択

# ラスト：自身のサイトに埋め込めば完成！（ </head>の前に置く）

※　他にも以下にいろいろ[サンプル](https://cookieconsent.insites.com/demos/)がある

## 注意

上記の対応はただのCookieの同意文のみを表示させている。
本格的にCookie管理するなら[CookieBot](https://www.gdpr.ga/cookiebot)や[OneTrust](https://onetrust.com/)といったサービスがある。
Git Submodules でサブモジュール内のリポジトリをリモートの master の最新版に追従する

# サブモジュールが更新されない
Git Submodules を使うと他のリポジトリのコードを取り込むことができます。

```bash
$ git submodule add <リポジトリのURL>
```

しかし、上記のようにサブモジュールを追加すると、サブモジュール側が更新されても新しい更新に追従することができません。`git submodule update` を実行してもリモートの最新の状態に追従することができません。

Git Submodules は、通常はブランチではなく特定のコミット単位で関連付けを行うため、上記のコマンドを実行すると、その時点での最新のコミットのコミット ID で関連付けを行います。つまり、その後、サブモジュール側が更新されても、コミット ID は変更されないため、`git submodule update` しても更新されないのです。

# ブランチ名を指定
ブランチ名を追加することでそのブランチの最新版に追従することができます。

```bash
$ git submodule add -b <ブランチ名> <リポジトリのURL>
```

つまり、リモートリポジトリの master に追従したい場合は `<ブランチ名>` に `master` を指定すれば OK です。

```bash
$ git submodule add -b master <リポジトリのURL>
```

# リモートリポジトリの master に追従
追従する際には `--remote` オプションをつけることで、リモートリポジトリの master に追従することができます。

```bash
$ git submodule update --remote
```

また、サブモジュール内のコードを直接変更してコミットした場合は、`git submodule update` を実行しなくても勝手に追従してくれます。

`git submodule update` を実行するとサブモジュールの変更が入るので、`git add` して `git commit` すればサブモジュールの更新の追従を反映させることができます。

# サブモジュールの運用方法
本記事で紹介したように、ブランチを指定する方法もありますが、基本的にはサブモジュールは特定のコミット単位で指定するものです。そのような仕様になっていることからも、頻繁に更新されるプロジェクトをサブモジュールで管理して、頻繁にサブモジュール側の最新に追従するという運用はあまり好ましくありません。

サブモジュールを最新に追従するたびにコミットが発生しますし、常に最新を追従していると、サブモジュール側のバグを取り込んでしまう可能性も高くなります。

サブモジュールの運用としては、サブモジュール側のプロジェクトのメジャーアップデートが行われたタイミングなど、更新を頻繁に行う必要がない程度に管理すると良いでしょう。

# 参考サイト
* [git submodule tracking latest](https://stackoverflow.com/questions/9189575/git-submodule-tracking-latest)
[swift]ネストしたDictionaryの取得

初歩的だが備忘録てきにメモ

```
dictionary: {
    email = "aaa@a.a";
    "first_name" = hoge;
    id = xxxxxxxxxxxxxxxxxx;
    "last_name" = hoge;
    name = "hoge hoge";
    picture =     {
        data =         {
            height = 200;
            "is_silhouette" = 0;
            url = "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            width = 200;
        };
    };
}
```

こんなDictionaryがあってpicture>data>urlが欲しかったら

```swift
let url = dictionary.value(forKeyPath: "picture.data.url")
```

で取得
mix.exsのapplicationsとextra_applicationsは何が違うのか

Elixirを勉強し始めて間もない頃に混乱したのが、`mix.exs`に定義する `applications` と `extra_application` の違いでした。そこでこの記事では、どちらを使用すればいいのかという点を簡単にまとめてみます。

# `applications`が無い？

Elixirのチュートリアルやサンプルコードなどを確認していると、しばしば以下のようなコードを目にします。

```elixir:mix.exs
def application do
  [applications: [:logger, :plug, :postgrex]]
end

def deps do
  [{:plug, "~> 1.2"},
   {:postgrex, "~> 1.0"}]
end
```

上記コードでは、依存するライブラリを`deps`関数と`applications`に定義しています。ところが自分が編集している`mix.exs`には、`extra_applications`はあるものの`applications`は無い。これはどうしたものか…

# `applications`は不要

実は上記のコードは、Elixir1.4よりも前のバージョンの記法になります。Elixir 1.4からは、`deps`関数に依存を定義するだけでランタイムに必要なapplicationを推論してくれるようになり、`applications`の明示的な指定は不要となりました。そのため、依存ライブラリを追加する必要がある場合でも、Elixir1.4以降を使用している場合は`deps`のみ編集すれば良いです。

つまり、Elixir 1.4以降の`mix.exs`は次のようになります。

```elixir
def application do
  [extra_applications: [:logger]]
end

def deps do
  [{:plug, "~> 1.2"},
   {:postgrex, "~> 1.0"}]
end
```

# `extra_applications`はどう使う？

`extra_applications`には、ErlangやElixirのランタイムで必要となるライブラリを指定します。これは`:logger`や`:crypto`などがそれに当たります。Mixは、`extra_applications`に定義されたライブラリがアプリケーションよりも前に開始されることを保証します。

# 参考
[elixir/CHANGELOG.md at v1.4](https://github.com/elixir-lang/elixir/blob/v1.4/CHANGELOG.md)
[Elixir :applications vs :extra_applications](https://www.amberbit.com/blog/2017/9/22/elixir-applications-vs-extra_applications-guide/)
[Application inference in Elixir 1.4](https://sergiotapia.me/application-inference-in-elixir-1-4-ae9e43e90301)
AtCoder Beginner Contest 099 解説備忘録

#前書き
AtCoder Beginner Contest 099 を解いてみた．解けなかった問題の備忘録．

#C問題
[[問題はこちら]](https://abc099.contest.atcoder.jp/tasks/abc099_c)

・Nのうち，いくらかが$6^p$($p$：非負整数)の和で表され，残りが$9^p$($p$：非負整数)の和で表される．
>(例) N=127場合，
>例えば，いくらか $i=80$ は $6^2 \times 2 + 6^1 \times 1 +6^0 \times 2$で表される．これは $6^p$ を $2+1+2=5$回使っている．
>一方，残りの $m=N-i=47$ は $9^1 \times 5 + 9^0 \times 2 $で表される．これは $9^p$ を $5+2=7$回使っている．
> よって，127は，80と47に分けた場合，$5+7=12$回で表される．
>**このiについて，全探索すれば良い．**

以下ACのコード：

```main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <sstream>
#include <bitset>
#include <stack>
#include <cstdlib>

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

typedef long long ll;

using namespace std;

int main() {
    
    int n;
    cin >> n;
    
    int ans=n;
    
    for(int i=0;i<=n;i++){
        int m=n-i;
        
        int a=m;
        int p=0;
        while(a>0){
            p += a%6;
            a = a/6;
        }
        
        int b=i;
        int q=0;
        while(b>0){
            q += b%9;
            b = b/9;
        }
        
        if(p+q < ans){
            ans =p+q;
        }
    }
    
    cout << ans << endl;
    
    return 0;
}

```

#D問題
[[問題はこちら]](https://abc099.contest.atcoder.jp/tasks/abc099_d)

・N×Nのマスを3色に色分けする．塗り替える時のコストが最小になるようにする．

・$1 \leq C \leq 30$ なので，Cに関するfor文は4回程度なら回せる．

```main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <sstream>
#include <bitset>
#include <stack>
#include <cstdlib>

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

typedef long long ll;

using namespace std;

int main() {
    
    int n,c;
    cin >> n >> c;
    
    vector<vector<int>> d(c, vector<int>(c));
    
    FOR(i, 0, c){
        FOR(j, 0, c){
            cin >> d[i][j]; //色をiからjに変えるコスト
        }
    }
    
    vector<vector<int>> x(n, vector<int>(n)); // x：c
    vector<vector<int>> t(3, vector<int>(30,0)); // t[(i+j)%3][a]： あまりが(i+j)%3のときの色aの個数
    
    FOR(i, 0, n){
        FOR(j, 0, n){
            cin >> x[i][j];
            t[(i+j)%3][x[i][j]-1]++;
        }
    }
    
    int ans=1<<30; //int型でとりあえず大きい数字
    
    FOR(i, 0, c){
        FOR(j, 0, c){
            FOR(k, 0, c){
                if((i!=j)&&(j!=k)&&(k!=i)){
                    int tmp=0;
                    FOR(l, 0, c){
                        tmp += d[l][i]*t[0][l]; //あまり0のマス全ての色をlからiに変えたときのコスト
                    }
                    FOR(l, 0, c){
                        tmp += d[l][j]*t[1][l]; //あまり1のマス全ての色をlからjに変えたときのコスト
                    }
                    FOR(l, 0, c){
                        tmp += d[l][k]*t[2][l]; //あまり2のマス全ての色をlからkに変えたときのコスト
                    }
                        
                    if(tmp<ans){
                        ans=tmp;
                    }
                }
            }
        }
    }
    
    cout << ans << endl;
    
    return 0;
}


```


#あとがき
精進します．
【10分】Node.js + ExpressでHello World for Windows


Node.js + ExpressでHello World的なのを試してみます。

# 環境
* Node.js（v8.10.0）
* Express（v4.16.0）

# Node.jsのインストール
下記公式サイトからインストーラをダウンロードし、インストールします。
（インストーラは特別難しいことないので、割愛します。）
https://nodejs.org/en/


下記コマンドでバージョンが表示されればOKです。

```DOS
$ node -v
```

npmも一緒にダウンロードされるはずです。
下記コマンドで確認します。

```DOS
$ npm -v
```
![node-v.png](https://qiita-image-store.s3.amazonaws.com/0/147118/363e5c4b-1542-865f-d322-9f9c644e9ab5.png)

# Expressのインストール

```DOS
$ npm init
$ npm install express --save
```

# アプリケーション作成
なんと初期設定はこれだけで、アプリを開発する環境が整います。
では、早速Expressでアプリを作成していきます。

```DOS
$ express nodewebapp
```

自動的にExpressアプリが作成されます。

次に、作成したアプリのフォルダ直下に入り、必要なライブラリ等をインストールします。

```DOS
$ cd nodewebapp
$ npm install
```

ここまででサンプルページが開けるはず！なので、一度起動してみます。

```DOS
$ npm start
```

ブラウザで http://localhost:3000/ にアクセスし動作を確認します。

![expresshelloworld.png](https://qiita-image-store.s3.amazonaws.com/0/147118/02ff0dd5-acc5-d18c-c511-202276c55aa9.png)

# 参考情報
* express - npm
https://www.npmjs.com/package/express
* install | npm Documentation
https://docs.npmjs.com/cli/install
onionドメインのサーバを建ててみた

# はじめに
ダークウェブについて調査することになったのですが，まずはTorサービスやオニオンルーティングについての理解を深めようということで，取り敢えずonionドメインのWebサーバを実際に建ててみました。
今回は検証用ということで，Webサーバ本体は python http server を利用します。

# 環境
```shell:OS
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.4 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
```
```shell:Python
Python 3.6.5
/home/USERNAME/.pyenv/shims/python
```

# Torのインストール
基本的には[Tor公式の導入手引き(Ubuntu)](https://www.torproject.org/docs/debian.html.en#ubuntu)通りですが，自分用メモ的にも必要なコマンドと注意点だけ抜き出します。

1.リポジトリにtorprojectを追加

```shell:/etc/apt/sources.list
deb https://deb.torproject.org/torproject.org xenial main
deb-src https://deb.torproject.org/torproject.org xenial main
```
2.gpg key による署名

```
$ gpg --keyserver keys.gnupg.net --recv A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89
$ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
$ apt update
```

3.torインストール

```
$ apt install tor
```

# Torの設定
こちらも基本的には[Tor公式の設定手引き](https://www.torproject.org/docs/tor-onion-service)通りです。

1.hidden service のディレクトリパスと使用ポートの設定
  - /etc/tor/torrc の72,73行目のコメントアウトを外します。
  - ここで指定するディレクトリは任意です。(ただし指定するディレクトリのパーミッションは`$sudo chmod 700 XXX/`とすること)
  - ここで使用するポート(今回は適当に8080)を任意に割り当てられます。

~~~shell:/etc/tor/torrc
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:8080
~~~

2.torのインストール時にdebian-torというユーザが新規に追加されていますが，探しても初期パスワードが見当たらなかったので，`adduser`で tor 用の新しいユーザ(hoge)を作成し，フォルダの所有者とグループをいじります。

```
$ adduser hoge
$ sudo chown -R hoge:hoge /etc/tor/
$ sudo chown -R hoge:hoge /var/lib/tor/
```

3.先程作成したユーザ(hoge)に切り替えてtorを起動します。

```
$ su - hoge
$ tor
$ cat /var/lib/tor/hidden_service/hostname
XXXXXXXXXXX.onion
```

上手く行っていれば/var/lib/tor/hidden_service/hostname内にハッシュによってランダムに生成されたonionドメインが表示されます。

# PythonによるWebサーバの立ち上げ
検証用の簡単なWebページをPythonのhttpserverで立ち上げます。
(PythonによるWebサーバについて詳しく知りたい方は[こちら](https://qiita.com/bgg0u/items/4d3c74563154f191ba16)を参照。)
1. 他者に公開しても良いディレクトリに移動します。
2. 移動先のパーミッションを`$sudo chmod 700 ./`等，適宜設定します。
3. 8080番ポートで python http server を立ち上げます。

```
$ python -m http.server 8080
```

Webサーバが起動したら，先程生成したonionドメインにTorBrowser等でアクセスしてみて下さい。ページ表示されれば成功です。
~~(軽く検証した感じだと，今回のように特に設定をいじっていないデフォルト状態ではTorBrowserでのみ閲覧可能で，Torプロキシを挿した他の通信は拒否されるぽい(？)です。)~~

# 最後に
今回はQiitaへの初投稿ということで，取り敢えず直近でやってみた内容をまとめてみることにしました。
ダークウェブ上でのWebサイト公開というのは思ったよりもずっとお手軽に出来てしまうものなのですね。
debian-torユーザ周りを自己流で適当に解決してしまっているので，セキュリティ的に大丈夫なのかが少々心配です。もし何かアドバイス等在りましたら，ごりごりツッコンでいただけると幸いです。

# 参考
[Configuring Onion Services for Tor](https://www.torproject.org/docs/tor-onion-service)
[Tor on Ubuntu or Debian](https://www.torproject.org/docs/debian.html.en#ubuntu)
[Tor hidden services for beginners on MacOSX](http://lpw.io/tor-hidden-services-for-beginners.html)
[ダークウェブにハニーポット](https://qiita.com/oraizonja/items/7acc3bea8fef57fac2cc )
[Tor Hidden Service でウェブサイトを公開してみる](https://hackmd.io/s/HyxJs1A9W#)
[pythonでwebサーバを立ち上げる](https://qiita.com/bgg0u/items/4d3c74563154f191ba16)
【仮想環境】vagrantの使い方〜初心者の書いた備忘録〜

#はじめに
最近、業務でvagrantを触る機会があり、
なんとなく調べて、とりあえず手順をメモしてコマンドを叩いていましたが、
(さすがに```vagrant up```で起動？するのかなくらいはわかります)
せめて何が起きてるのかくらいは知らないとまずそうだなと思い、せっかくなので色々調べてみました。

**注意：現時点では、あくまでも情報の整理が目的です。ご了承ください。**

![Vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/186535/a37d9e99-d174-7aaf-db66-9d0355aedf87.png)


#参考
以下の記事がわかりやすかったので、これらを元に作成しています。(｀・ω・´)
> - [Vagrant入門から実践まで](https://qiita.com/daichi87gi/items/d5da33c76295ee32a735)
- https://thinkit.co.jp/story/2015/03/19/5740 
- [VagrantコマンドとVagrantfileの設定メモ](https://qiita.com/pugiemonn/items/bcd95a35c3ec7624cd61)
- [Vagrant入門。簡単にローカル環境に仮想マシン(VM)を作る](http://ruby-rails.hatenadiary.com/entry/20150719/1437249020#vagrant-ssh)



#vagrantのできること

- 仮想環境（開発環境)をファイルとして配布、共有できる。
- 機能拡張や、仮想環境のコマンド操作が可能。

#vagrantを使ってみる
##ダウンロード
下記のサイトから、VagrantとVirtualBoxを簡単にダウンロードできます。
https://www.vagrantup.com/downloads.html
https://www.virtualbox.org/
※VitualBoxは仮想マシンを管理できるソフトのこと

##vagrant init 〜作業用ディレクトリでVagrantfileを作成〜
**```vagrant init```**によって、ディレクトリに**Vagrantfile**という設定ファイルが作成されます。

## Vagrantfileってなに？
- VMを立ち上げる際のconfigやprovisionを記述するファイルのこと。
- Vagrantfileはデフォルトで多くの設定がコメントアウトされている。
- Vagrantfileは、ひとつのプロジェクトに最低ひとつ必要。
- Rubyで書かれている。



※ちなみに**VM**とは、**Virtual Machine(仮想機械)**の略。

## Vagrantfileの設定
〜超基本的な設定〜

```
# Vagrantfile
Vagrant.configure("2") do |config|
  # ボックス名を設定。設定したボックスのOSがインストールされる
  config.vm.box = "chef/centos-6.6"

  # ホスト(PC)からVMにアクセスできるプライベートIPを設定
  # VM上でアプリを作ったときに、PCのブラウザからこのIPアドレス(192.168.33.10)を使ってアクセスできる
  config.vm.network "private_network", ip: "192.168.33.10"

  # 共有フォルダの設定（PCとVMでファイルを共有できる)
  # ホストのsync_folderとVMの/home/vagrant/sync_folderをNFSで共有する
  config.vm.synced_folder "./sync_folder", "/home/vagrant/sync_folder", type: "nfs"
end
```
引用：http://ruby-rails.hatenadiary.com/entry/20150719/1437249020#vagrant-setting

## Vagrantfileを設定(編集)すればできること
>VMを立ち上げる際のboxの指定
IP、ポートの設定
VM立ち上げ時に、自分で書いたシェルスクリプトを走らせる
VM立ち上げ時に、Chef-Soloを実行し開発環境を整える
複数のVMを立ち上げられるようにする
etc...
引用：[Vagrantの重要ファイル「Vagrantfile」の読み込みとその周りの挙動をちょっと細かく追ってみた](http://at-grandpa.hatenablog.jp/entry/2013/10/01/015501)

とりあえずいろいろできる！(｀・ω・´)

##VM・イメージ(box)を指定
[【Vagrant】VirtualBoxにBoxファイルを追加する](http://kumamonmaster.hatenablog.com/entry/2016/09/26/184651)
ここがわかりやすいです。(｀・ω・´)

##vagrant up 〜VM(仮想マシン)を起動する〜
Vagrantfileの設定内容が読み込まれて、
VirtualBoxに仮想マシンが作成され、
その上にボックスのOS(例)CentOS 6.4)がインストールされます。

##vagrant status 〜VirtualBoxのVMの状態を確認〜
こんな感じで、VMの状態を確認できます。

```
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```

##vagrant ssh 〜仮想マシンにログイン〜
成功するとvagrantアカウントでログインした状態となります。
もしパスワードを聞かれる場合は、```vagrant```と入力します。



##vagrant halt 〜仮想マシンの停止〜
最後にVagrantのVMを使わないときはCPUやメモリの消費を抑えるために留めておくらしいです。



##vagrantの仮想環境でrootユーザーになるには
###(2018/06/26追記)

```
cd [vagrantのある場所。([]は不要)]
vagrant ssh
cd /vagrant/
su root
```


今後、Vagrantを触っていく機会も増えるかも？なので、
タイミングのいい時に追記していけたらと思います。(｀・ω・´)
ご指摘などありましたら、コメントくださると幸いです。
VSCodeでローカル変数に型を明示させる方法

関数のjsdocに引数の型情報を書いておくと、vscodeでは型に応じて補完してくれる。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/94929/997f7b98-e46f-82bf-a9c4-619fb95989a2.png)

ローカル変数でもこれを使いたいときは、以下のように宣言の前に`@type`を付ければ良いみたいです。

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/94929/bbb77abd-26a3-582f-925e-04665206c1f4.png)

もう最近は補完してくれないとコード書くのがつらい。
Expoでスタンドアロンビルドしたときにスプラッシュが裏で表示され続ける

## 症状
とあるアプリを作ってスタンドアロンビルドしてみましたが、スプラッシュが消えなくてハマりました。

![Screenshot_20180612-215309.png](https://qiita-image-store.s3.amazonaws.com/0/96621/78737925-9a05-a98d-f0ec-5ec643a12462.png)

こんな感じに...


## 解決

けっこう単純でした。
最下部の背景色を白にすることで解決できるようです。

`AppLoading`でもいけるっぽいですが、ロードする物とか無かったのでとりあえずこれです。

```js
import React, { Component } from 'react';
import { Text, View, StyleSheet } from 'react-native';
import { Constants } from 'expo';

export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>スプラッシュがのこらない</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: Constants.statusBarHeight,
    backgroundColor: 'white',
  },
});
```


https://github.com/expo/expo/issues/1494
https://docs.expo.io/versions/latest/guides/splash-screens
https://docs.expo.io/versions/latest/sdk/app-loading.html
[ESP32] Wemos LOLIN D32 101

#なんで？

Pilot_Projectで使ってみようかなと
思って買って使って見ようと思いました。

1. まず、値段が安いし、Wi-FiやBLE両方つかえる。
2. やすい
3. やすい
4. ただ。。
5. でも、安いのに32ビット
6. IoTで適当。


#Arduino IDE

https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md

git GUI でダウンロードできなかったです。

# 準備
- https://github.com/espressif/arduino-esp32で
Download ZIP して
C:\Users\[USER]\Documents\Arduino\hardware\espressif\esp32 の経路を作る。

- 後、UNZIPします。

- 経路
C:\Users\[USER]\Documents\Arduino\hardware\espressif\esp32\tools
のなかでget.exeをダブルクリック。

#Driver Install 

https://wiki.wemos.cc/products:d32:d32

#使って見よう。

ARDUINOと基本は似てます。

![20180612_224346.jpg](https://qiita-image-store.s3.amazonaws.com/0/137182/3c958614-bb62-2367-5d80-6cfcf293aef0.jpeg)
PhpStormのディレクトリ内検索で特定のディレクトリを除外する方法

あらかじめディレクトリをExcludedにMarkすれば上の階層を指定したディレクトリ検索から結果が除外されます。

プロジェクトエクスプローラの除外したいディレクトリを右クリック
->[Mark Directory As]
->[Excluded]

[Configuring Folders Within a Content Root](https://www.jetbrains.com/help/phpstorm/configuring-folders-within-a-content-root.html#mark)

除外したディレクトリでもそのディレクトリを指定した検索は可能です。かしこい。
他のJetBrains製IDEでも同じくできそうですが確認してないので以下略
Thread.sleep の Exception catch のカバレッジ対応

Thread.sleep している箇所で Exception catch のカバレッジが通っていない
どうにか通したいと思い試行錯誤
interrupt の前に sleep 入れたら sleep に入って、Exception 発生するようになった

```Java:Test
public class SleepActionTest() {
    @Test
    public void testSleep() throws Exception {
        Thread th = new Thread( ()-> {
            SleepAction.sleep(1000000000);
        });

        th.start();
        TimeUnit.MILLISECONDS.sleep(100);
        th.interrupt();
    }
}
```
```Java:SleepAction 
public class SleepAction {
    public static void sleep(int i) {
        try {
            TimeUnit.MILLISECONDS.sleep(i);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```
phina.js サウンドの音量を調節する

そういえば音量ってどう変えるんだろ…？！と悩んだので書きました。
ボリュームの値を徐々に変えてあげればBGMのフェードインとかも出来そうです。

SoundManagerクラスの`setVolumeMusic`か`setVolume`メソッドを使います。
Volumeの初期値はどちらも0.8です。

## BGMの場合
``` 
SoundManager.setVolumeMusic(0.5);
```
- `playMusic`メソッドで再生する音が対象

## 効果音の場合
```
SoundManager.setVolume(0.5);
```
- `play`メソッドで再生する音が対象


## 参考

- [[phina.js-Tips-36] 音を再生してみる](https://qiita.com/alkn203/items/4650ba72c6e24b9c0433) @alkn203 さん
- [[phina.js-Tips-37] 音の再生を停止してみる](https://qiita.com/alkn203/items/92d9c0ae53d792ad4f4d) @alkn203 さん

- [phina.asset.SoundManager - phina.jsの公式ドキュメント](http://phinajs.com/docs/#!/api/phina.asset.SoundManager)
SPAモードのNuxt.jsで、外部のAPIを呼び出す

## 前提

既存のGoogle App Engine Python + Angular 1.x + CoffeeScriptのサービスを、Google App Engine Python + Nuxt.jsに置き換えようとしています。

最終的には、Nuxt.jsでbuildした結果を、Google App Engineのstatic_filesとして配信する予定です。
SPAモードを利用し、SSRは利用しません。（GAEでNodeを動かすのが大変そうなので）

今回APIアクセスには、 `@nuxtjs/axios` を利用しようと思います。標準っぽかったので。

## 環境・やりたいこと

まず、ローカルで開発時は、本番稼働しているサーバに接続しようと思います。
（今後、ローカルでサーバを実行して、そちらに向けることも想定しています。）

また、GAEではデプロイごとに https://20180610t220204-dot-my-android-server.appspot.com/ といった形のバージョンごとのドメインが作成され、そこで動作確認などを行えます。
デプロイ後は、アクセスしたドメインそれぞれのAPIを利用しようと思います。

表にすると、こんな感じ。

|   |向き先|
|---|---|
|ローカル|https://my-android-server.appspot.com|
|デプロイ後|js配信と同一のドメイン<br>https://20180610t220204-dot-my-android-server.appspot.com など|

## 現状調査

`@nuxtjs/axios` では、 https://github.com/nuxt-community/axios-module/blob/master/lib/module.js#L19 などを見るとわかるように、どうにかしてドメインを考えているようでした。

そのまま動かすと、Nuxt自体を起動している `localhost:3000` を見に行ってしまいました。

## 解決策

[@nuxtjs/proxy](https://github.com/nuxt-community/proxy-module) を利用します。

まずは `npm install --save @nuxtjs/proxy` でインストール。

https://github.com/nuxt-community/proxy-module#setup を参考に、 `nuxt.config.js` の modules に追記。

```js
  modules: [
    '@nuxtjs/axios',
    '@nuxtjs/proxy'
  ],
```

今回、アクセスするAPIは `/api` 以下にあるので、そのアクセスを特定のドメインにproxyします。

```js
  proxy: {
    '/api': 'https://my-android-server.appspot.com'
  },
```

これにより、開発環境で `/api` 以下は本番のAPIにproxyするようになります。

次に、`nuxt build`を実行し、デプロイした際に相対パスで見に行くようにします。
これは、ビルド時の環境変数で与えれば良いらしいです。

そのために、 `package.json` のスクリプトを変更します。

```js
  "scripts": {
    "build": "API_URL=/ nuxt build",
  },
```

これにより、buildした際にはドメイン指定無しでアクセスできるようになりました。

今回の修正は https://github.com/noboru-i/kyouen-python/commit/55fc5c7062a4ea6d5ba68b51aec0a021dffd21d0 です。
メールフォームプロで自動返信メールが届かない場合

#原因
自動返信メールのメールアドレスのラベル名を変更したい場合、
例えば

```
[メールアドレス]sample@gmail.com
```
から

```
[メール]sample@gmail.com
```
などに変更する場合

input要素のname属性の値をemailからメールに変更すると自動返信メールが届かなくなる。

#対処方法
```
mailformproフォルダ→configsフォルダ→lang.ja.cgiファイル
```
の6行目付近の

```php
$lang{'email'} = 'メール';
```
に記載したい名称を記入する。
input要素のname属性の値はemailのままにしておく。