OmniAICreator/Qiita-1.07M huggingface dataset:
setup.pyに書くClassifiersを簡単に生成できるツールを作った

# 概要

Python製のライブラリやツールをPYPIにアップロードしたりするのに、`setup.py`を作りますが、その中に書く**Classifiers**は[サイト](https://pypi.org/pypi?%3Aaction=list_classifiers)から一行ずつコピー＆ペーストしなければならず、とても面倒です。

なので、インタラクティブにClassifiersを選択・検索しながら簡単に生成できるコマンドラインツールを作りました。

## [alice1017/pypicf](https://github.com/alice1017/pypicf)

[![asciicast](https://asciinema.org/a/176872.png)](https://asciinema.org/a/176872)

### インストール

```
$ pip install pypicf
```

### 使い方

```
$ pypicf
```

これで起動

注意：pypicfはPython2.7で実装されていますのでPytho3では動きません。プルリク待ってます

### 選択

pypicfは表示された選択肢を選択することによって、生成すべきClassifierを決定します。
上下の矢印キーでスクロールして、エンターキーでClassifierを決定。

```
[?] What your product Development Status? ('↑', '↓':Select):
> Development Status :: 1 - Planning
  Development Status :: 2 - Pre-Alpha
  Development Status :: 3 - Alpha
  Development Status :: 4 - Beta
  Development Status :: 5 - Production/Stable
  Development Status :: 6 - Mature
  Development Status :: 7 - Inactive
```

### チェックボックス

特定のClassifierは複数選択できるものがるので、pypicfはチェックボックスをサポートしてます。

```
[?] What the Programming Language you implemented?: python
[?] Please check the following checkbox ('↑', '↓':Select, '→','←':Choose):
   X Programming Language :: Python
   o Programming Language :: Python :: 2
 > X Programming Language :: Python :: 2.3
   o Programming Language :: Python :: 2.4
   o Programming Language :: Python :: 2.5
   o Programming Language :: Python :: 2.6
   o Programming Language :: Python :: 2.7
   o Programming Language :: Python :: 2 :: Only
```

上下の矢印キーでスクロールして、左右の矢印キーでチェックボックスをチェックします。

言葉で説明すると難しいので上記のデモを見てもらった方がわかりやすいかと思います。

### 生成

一通りClassifierを選択したら、以下のように生成されるので、コピーしてsetup.pyにペーストして下さい。

```
classifiers=[
    "Development Status :: 4 - Beta",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python",
    "Programming Language :: Python :: 2.7",
    "Programming Language :: Python :: 2 :: Only",
    "Topic :: Utilities",
]
```
Nuxt で作ってるブログを netlify に移行してみた

成果物: https://macoshita.me

最近、 [nuxt](https://nuxtjs.org/) のみで 1 からブログを作っている。
今までは手元でビルドして GitHub Pages に [push-dir](https://www.npmjs.com/package/push-dir) でデプロイしていた。
しかし、手元ビルドがダルくなってきたのと、ちょっとした修正・追記は GitHub 上で直接 markdown いじりたいため CD を検討。
最初はベタに Circle CI とか考えたが、聞けば [Netlify](https://www.netlify.com/) は無料で独自ドメインに対応して CD もできるということで、これでええやん感がハンパなかったので移行してみた。

## プロジェクト概要

https://github.com/macoshita/macoshita.me

npm run generate を叩くと dist ディレクトリに静的ファイルが出力される。
dist をまるごとどこかに上げればただの nginx とかでも動く構成。

## Netlify 管理画面での操作

- 上記リポジトリを選ぶ
- ビルドコマンドと出力ディレクトリを入力
    - netlify.toml で指定してる場合は不要
- カスタムドメイン設定
    - ドメイン購入
    - netlify DNS の設定をポチポチ進めると 4 つの Nameservers ホスト名が作られるので、ドメインレジストラで設定
    - 自分は Amazon Route 53 で買ったので Route 53 マネコンの Registered domains > (買ったドメイン) の Name servers の設定を書き換え
- HTTPS 設定
    - Verify DNS configuration 押すだけで Let's Encrypt の設定をしてくれる
        - が、上記の DNS 設定してから 1 時間ほどまたされるのでここで作業中断
    - 上記がうまくいったら Force HTTPS の設定を有効化

以上。
やろうと思えばスマホだけでできるくらい楽 :thumbsup: 

## 結果

デプロイが自動化されて当初の目的が達成できた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17722/d41d376f-85bd-a8c0-6f20-55e7f299762e.png)

スコア的には GitHub Pages の時と変わらず。 CSS をほとんど書いてないから当然っちゃ当然。

## おまけ: Netlify のキャッシュ設定

https://www.netlify.com/blog/2017/02/23/better-living-through-caching/

上記に細かく書いてあるけど `max-age=0, must-revalidate, public` となっている。
must-revalidate は、キャッシュの有効期限が切れてたら必ずサーバに問合せて変更が無いか確認しろ、変更が無ければキャッシュを使って良いという directive 。
Netlify は自動で ETag を付けてくれて、さらに max-age=0 だから、
ざっくりいうと「常にサーバに問合せて更新がない限りはキャッシュを使え」という設定。

上のブログには「常に問合せて重くないの？」に対する答えも書いてあって、
「俺らの CDN が爆速で変化なしって返すし http/2 でリクエストも並列になるから一瞬だよ」
とのこと。

とはいえ Cache Busting 用にハッシュ付いた JS, CSS はもったいなくないかと思って Cache-Controll いじってみたけど、 https://macoshita.me については service worker でキャッシュしてくれるからほとんど意味なかった :joy:

[この記事の英訳](https://macoshita.me/blog/2018-04-18-move-netlify/)
sympyで「フィボナッチ数(Fibonacci number)」の一般項を出力してみた

(参考)
階差方程式の求解＜Python3モジュールブック

http://www.k-techlabo.org/www_python/python_modules.pdf#page=72

公式

~~http://docs.sympy.org/latest/_modules/sympy/functions/combinatorial/numbers.html#fibonacci~~

https://en.wikipedia.org/wiki/Fibonacci_number

Pythonからはじめる数学入門＞フィボナッチ数列と黄金比の関係＞
fibonacci_goldenration.py

https://github.com/doingmathwithpython/code/blob/master/chapter2/solutions/fibonacci_goldenratio.py

```python
from sympy import *
f = simplify('f(n)')
s = simplify('f(n+2)-f(n+1)-f(n)')
ini = simplify('{f(0):0,f(1):1}')
print(rsolve(s,f,ini))
#sqrt(5)*(1/2 + sqrt(5)/2)**n/5 - sqrt(5)*(-sqrt(5)/2 + 1/2)**n/5
```
# wolframalphaで
参考
Fibonacci?Wolfram Language Documentation

http://reference.wolfram.com/language/ref/Fibonacci.html

http://www.wolframalpha.com/input/?i=RSolve%5B%7Ba%5Bn%2B2%5D+%3D%3D+a%5Bn%5D%2Ba%5Bn%2B1%5D,+a%5B0%5D+%3D%3D+0,a%5B1%5D+%3D%3D+1%7D,+a%5Bn%5D,+n%5D

Input interpretation:
solve a(n + 2) = a(n) + a(n + 1)
a(0) = 0
a(1) = 1 for a(n)
Result:
a(n) = F_n
何か違います。


(2018-11-26)-----------------------------
# sympyの一般項で、初期値を出力してみた。
参考

https://qiita.com/tibigame/items/84bfd46df494e05c711e#フィボナッチ数

```FullScript.py
from sympy import *
var('n')
f = simplify('f(n)')
s = simplify('f(n+2)-f(n+1)-f(n)')
ini = simplify('{f(0):0,f(1):1}')
g=rsolve(s,f,ini)
print(float(g.subs(n,0)))
print(float(g.subs(n,1)))
#------------------------------------
f = simplify('f(n)')
s = simplify('f(n+2)-f(n+1)-f(n)')
ini = simplify('{f(1):0,f(2):1}')
g=rsolve(s,f,ini)
print(float(g.subs(n,1)))
print(float(g.subs(n,2)))
# 0.0
# 1.0
# 5.909106315382871e-126
# 1.0
```
初めてのJavaScript その１

##JavaScriptとは何か
- ブラウザで実行できるスクリプト言語（コンパイルが不要、正確にはブラウザがコンパイルしながら実行してくれる）
- 動きのあるWebサイトを構築できる（一時的にFlashが流行りましたが、今はJavaScriptの天下な気がします）
- よく言われてるけど、Javaとは別物です
- 静的なwebページに動きをつけるので、HTMlについて知っておかないといけない

##準備
テキストエディタ（メモ帳などなんでもＯＫ　※Atomが高機能でおすすめ、しかしPCのスペックが低いと重いです）
で静的コンテンツを用意する。

```index.html
<!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>タイトル</title>
    </head>
    <body></body>
</html>
```

##とりあえず書いてみる
```index.html
<!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>タイトル</title>
    </head>
    <body>
            <script src="script.js"></script>
            <script>
            /*
            この記号の中にコメントが書けます。
 　　　　　　JavaScriptのソースは<script>の中で書けます。または、外部のjsファイルに書いて、htmlから呼び出すことも可能です。
            */
            // 一行の場合のコメントはこのように書けます。

            // 変数に関して、変数はデータを入れる箱というイメージです。
            var aisatu = "こんにちは"; // varでaisatuという名前の変数を制限して、文字列を変数に代入
      
            </script>
    </body>
</html>
```

### 変数の種類
- 文字列 例："こんにちは"
- 数値   例: 123
- 真偽値 例：true または false
- オブジェクト: データのまとまり、例えばuserというオブジェクトがあるとして、userの中にnameやageがあるイメージ
- 配列　例：['リンゴ', 'バナナ', 'イチゴ']
- undefined 定義されていない
- null 何もない

### 数値の演算
```html:index.html
    <script>
        var x;
        x = 1 + 2;   // xが3になる
        x = 2 - 1; // xが1になる
        x = 10 * 2; // xは20となる
        x = 10 / 2; // xは5となる
        x = 10 % 3; // 余りが1となる
        x++; // xが7となる
        x--; // xが6となる
    </script>
```

### 文字の連結と特文字
`\n` 改行
`\t` タブ
`s = "hello " + "world";` helloworld　となる

### 条件分岐
```html:index.html
    <script>
        var score = 50;
        if (score > 60) {
            // スコアが60より大きい時の処理
        } else if (score > 40) {
            // スコアが40より大きい時の処理
        } else {
            // スコアが40以下の時の処理
        }
    </script>
```

### 比較演算子
`> `  a > b // aがbより大きい
`<`   a < b // aがbより小さい
`>=`  a >= b // aがb以上
`<=`  a <= b // aがb以下
`==`  a == b // aがbと等しい
`!=`  a != b // aがbと等しくない

### 論理演算子
`&&` a && b // aかつb
`||` a || b // aまたはb
`!`  !true //  falseである


**一旦ここまで、続きは次回で！！**
Java8 Stream.mapでindexをつける（タプル版）

# 前置き
i02302さんの[Java8以降のStream.mapでindexをつける](https://qiita.com/i02302/items/4e4cc1ec68c3a91253bb)でStreamの各要素にindexを付加する方法が書かれていました。

最初に見たときはindexのカウンターに配列を使っていて、並列Streamも考慮してAtomicIntegerにした方がいいんじゃないかな…と思っていましたが、さっき見たらそう変わっていました(笑)

あとは、intのindex部分がBiFuntionを使うとIntegerになってしまうので、関数型インターフェースも独自に用意した方がよいのではないかと思います。

```java
public interface BiIntFunction<T, R> {
	public R apply(T t, int n);
}

public class WithIndex {
	public static <T, R> Function<T, R> apply(int start, BiIntFunction<T, R> function) {
		AtomicInteger counter = new AtomicInteger(start);
		return object -> function.apply(object, counter.getAndAdd(1));
	}
}
```
```java
stream.map(WithIndex.apply(1, (obj, i) -> obj + i))
```

# タプルを用意する方法
Scalaの[zipWithIndex](http://www.ne.jp/asahi/hishidama/home/tech/scala/collection/method.html#zipWithIndex)だと要素とインデックスのペア（タプル）を返すので、それと同様にする方法もあると思います。

```java
public class ObjectIndexPair<T> {
	private final T object;
	private final int index;

	private ObjectIndexPair(T object, int index) {
		this.object = object;
		this.index = index;
	}

	public T getObject() {
		return object;
	}

	public int getIndex() {
		return index;
	}

	public static <T> Function<T, ObjectIndexPair<T>> start(int start) {
		AtomicInteger counter = new AtomicInteger(start);
		return object -> new ObjectIndexPair<>(object, counter.getAndAdd(1));
	}
}
```
```java
stream.map(ObjectIndexPair.start(1)).map(pair -> pair.getObject() + pair.getIndex())
```
【Windows】【新人向け】業務で実際によく使うショートカットキー

##**対象**
これから本格的にパソコンを触っていく予定の新社会人や、
他の人は色んなショートカット使ってるけど自分は自信がない、、なんて人へ向けています。

##**目的**
きっと新社会人の方々は先輩から「効率が上がるからショートカットキー覚えておいた方がいいよ」なんて言われる事が多いと思います。
今のうちに頑張って覚えると、今後触れたことのないツール等を使うときに。新しいことを覚える習慣がつくので初めのうちに覚える方が良いという思いで投稿しました。

###**前提**
ショートカットキー一覧を乗せたページは情報が多すぎて全部覚えるのが難しいと思います。
なので実際に業務で使うショートカットキーを纏めました。個人的な偏りも多大にあると思いますがお了承ください。
Ctrl + Cなどは記載していません。またOSによって動作が異なる場合があります。

###アプリ起動、操作

|操作|ショートカットキー|補足|
|:-----------------:|:-----------:|:-----------:|
|アプリ切替|Alt + Tab|起動中のウィンドウを切替|
|タスクバーアプリ起動 |Win + 数字キー|タスクバーにある数字キーで指定した位置のアプリが起動する|
|ウィンドウを閉じる|Alt + F4||
|エクスプローラーを開く|Win + E||
|ファイル名変更|F2|エクスプローラーで選択ファイルの名前変更|
|タスクマネージャー起動|Ctrl + Shift + Esc||
|スクリーンショット|Print Screen|アクティブ画面のみはAlt + Print Screen|

###画面操作

| 操作     | ショートカットキー |補足         |
|:-----------------:|:-----------:|:-----------:|
|画面最大化|Win + ↑キー|最小化中は元のサイズに戻る|
|画面最小化|Win + ↓キー|最大化中は元のサイズに戻る|
|画面左半分にフィット|Win + ←キー|2つの画面を並べるのに便利|
|画面右半分にフィット|Win + →キー|同上|
|全ての画面を最小化|Win + D|もう一度押すと元に戻る|
|ウィンドウを移動|Alt + Shift → M|マウスで触れない場所にウィンドウが出てしまった時などに使えます。|

###文字入力中のショートカット

| 操作| ショートカット |
|:------------:|:---:|
|全角ひらがなに変換|F6|
|全角カタカナに変換|F7|
|半角英字に変換|F10|


###ファイル名を指定して実行(Win + Rで起動する)
ショートカットキーではありませんがWin+Rのファイル名指定で実行できるアプリです。

| 入力文字        | 起動アプリ |
|:------------:|:-----------:|
|cmd|コマンドプロンプト|
|mspaint|ペイント|
|calc|電卓|
|excel|エクセル|
|word|ワード|
|powerpnt|パワーポイント|


##**さいごに**
私は未経験の新卒でエンジニアになったので、最初はわからないだらけでした。
知らないことを覚える時間は必要なので、せめてPC操作くらいは他の人よりも効率よくしようと思い、何度もこの操作するな～って感じたものはすぐに短縮できないか調べていました。
そのころの私と同じ様な人にこの記事が少しでも力になれば嬉しいです。
bashで空ファイルを生成

これまで空ファイル生成に利用していたコマンドが実は思っていた挙動をしなかったことに気付いたので、その衝動でメモ。

## 空ファイルを生成する方法色々
せっかくなので調査したところ、下記のどれを使っても空ファイルは生成できることがわかった。

```bash
$ touch empty1.out
$ echo -n > empty2.out
$ > empty3.out
$ cat /dev/null > empty4.out
$ cp /dev/null empty5.out
$ :> empty6.out
```
といっても、3個目はプロンプトみたいでわかりづらいし、4,5個目は`/dev/null`を書くのが面倒だから
使うとしたら1,2個目かなぁといった感じ。
(追記4/22) コメントで6番目を教えてもらいました。これを使うのも良さそう。

## `touch`は空ファイル生成コマンドではない
`touch`はファイルが存在しないときに叩けば空ファイルになるけれど、既に存在するときには中身を空にしてくれない。
ここのところを常に空にしてくれると思っていた。この記事を書くきっかけコマンド。
下記に検証結果を残す。byte数を見ると`touch`のみ空になっていないことがわかる。

```bash
$ # byte数の確認
$ ls -l
-rw-r--r--  1 jundoll  staff  0  4 14 00:12 empty1.out
-rw-r--r--  1 jundoll  staff  0  4 14 00:12 empty2.out
-rw-r--r--  1 jundoll  staff  0  4 14 00:12 empty3.out
-rw-r--r--  1 jundoll  staff  0  4 14 00:12 empty4.out
-rw-r--r--  1 jundoll  staff  0  4 14 00:12 empty5.out
-rw-r--r--  1 jundoll  staff  0  4 22 17:02 empty6.out
$ 
$ # 各ファイルにファイル名を追記
$ for file in empty?.out; do 
$   echo $file >> $file
$ done
$ 
$ # 上記の生成コマンドを再実行
$ touch empty1.out
$ echo -n > empty2.out
$ > empty3.out
$ cat /dev/null > empty4.out
$ cp /dev/null empty5.out
$ :> empty6.out
$ 
$ # byte数の確認
$ ls -l empty?.out
-rw-r--r--  1 jundoll  staff  11  4 14 00:14 empty1.out
-rw-r--r--  1 jundoll  staff   0  4 14 00:14 empty2.out
-rw-r--r--  1 jundoll  staff   0  4 14 00:14 empty3.out
-rw-r--r--  1 jundoll  staff   0  4 14 00:14 empty4.out
-rw-r--r--  1 jundoll  staff   0  4 14 00:14 empty5.out
-rw-r--r--  1 jundoll  staff   0  4 22 17:03 empty6.out
$ rm -f empty?.out
```

## `echo > filename`もダメ
これも割と使ってたけれど、`-n`を入れないと改行が1つ含まれた1byteのファイルが生成される。
細かいこと気にしないよって場合だったらこれでもOK。

```bash
$ echo > gomi.out
$ ls -l gomi.out
-rw-r--r--  1 jundoll  staff  1  4 14 00:20 gomi.out
```

## (追記4/22) 明示的に上書きを記述したい場合は「`|`」(pipe)を使う
こちらもコメントで教えていただきました。
`set -C`でシェルのオプションを変更した場合には、リダイレクトによる上書きが禁止される。
その場合には、「`>|`」でリダイレクトすることで明示的な上書きにできる。

```bash
$ set -C
$ 
$ # set -C 直後
$ echo -n > gome.out
-bash: gomi.out: cannot overwrite existing file
$ 
$ # |(pipe)を使う
$ echo -n >| gome.out
$ ls -l gomi.out
-rw-r--r--  1 jundoll  staff  1  4 22 17:06 gomi.out
```

オプションを変更されていることを想定するならば、「`>|`」を使った方が良さそう。

## まとめ
次で使い分けられる。

1．新規作成時のみ有効な、空ファイル作成方法

```bash
$ touch filename
```

2．上書き時にも有効な、空ファイル作成方法

```bash
$ echo -n >| filename
$ # or
$ :>| filename
```

（`:>|`まで来ると違う言語みたい...。`J`...。）
Qiitaのマークダウンで @（アットマーク）リンクの無効化に苦戦

前のエントリで@マークのついた半角英字を書いてたらプレビューでリンクに自動変換されたのでどうにか無効化できないかといろいろ試した。

1. （そのまま）

> @xsgk 

**結果**
@xsgk

</br>
2. @ の前にバックスラッシュ

> \@xsgk

**結果**
\@xsgk

</br>
3. @ の後ろにバックスラッシュ
> @\xsgk

**結果**
@\xsgk

</br>
4. エスケープ文字の利用
> \&#64;xsgk

**結果**
&#64;xsgk

</br>
5. \<span>\</span>タグで囲む
> \<span>@xsgk\</span>

**結果**
<span>@xsgk</span>

</br>
6. \<span>\</span>タグで@だけ囲む
> \<span>@\</span>xsgk

**結果**
<span>@</span>xsgk

</br>
\<span>タグで@を囲む方法でしかまともに無効化できてない。

「 [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d) 」の[コメント欄](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#comment-f4821362936c563584fb)でこんなやりとりを見つけた。エントリにコメント埋め込みできないのでスクショで。

![comments_on_disabling_atmark.png](https://qiita-image-store.s3.amazonaws.com/0/251261/26f84f19-54bb-190f-e078-b3a40da15ff0.png)

2年前に話題が上がりつつもまだ特に状況変わってないと理解。どうしようもなく困るわけではないけどたまに地味には困る程度なのでまあいいか。





#参考
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[URL を自動リンクさせない](https://qiita.com/k_ui/items/f3d093d7116a310900db)
[よく使う特殊文字　一覧](https://qiita.com/masatokato0128/items/b07e02013aed143aa45a)
[]()
2018年4月頃に行うVagrant/VirtualBoxでCentOS7の仮想環境作成

# はじめに
## 前提
- Windows 7
- PowerShell 5.1
- SSH接続するときに公開鍵認証方式だからそこらへんの知識とか
    - おすすめはWinSCP

# まずダウンロード
VirtualBox
<http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html>

Vagrant
<https://www.vagrantup.com/downloads.html>

そして再起動。


# れっつ仮想環境
1. 仮想環境用のフォルダを作る。
1. コマンドプロンプト立ち上げる。
    1. スタートメニューから`コマンド`って打てば出てくる。
1. `cd`コマンドを利用してさっき作ったフォルダの中に移動。
1. 仮想環境を作るまほう！

```:コマンドプロプト>
vagrant init centos/7
vagrant up
```

らくちん。

# 仮想環境にSSH接続
いまどきは公開鍵認証だから、鍵を使うよ。
鍵の場所はここ。
`[仮想環境用フォルダ]\.vagrant\machines\default\virtualbox\private_key`

# 普通に仮想環境に入る
VirtualBoxを開けば何かが動いてると思うけど、
それがたった今作った仮想環境。
VirtualBoxから入ろう。

# おまけ

## PowerShellのアップグレード方法
<https://docs.microsoft.com/ja-jp/powershell/scripting/setup/installing-windows-powershell>

確認はスタートメニューとかからPowerShellを起動して以下を入力。

```powershell:powershell>
$PSVersionTable
```

## CentOS以外とか入れたい
Vagrantの公式ページで探す。
<https://app.vagrantup.com/boxes/search>
Slackのサイドバーテーマを設定する方法

既出かもしれませんが、メモとして投稿してみます。

こちらに公開されているテーマがあります。
http://slackthemes.net/#/

## 設定方法
以下の方法があります。（もっとあるかも？）

* アプリの設定から変える
* 自分のスペースで管理する

おすすめは後者で、自分のスペースにカラーコードを貼っておくと便利です。

### アプリの設定を変える場合
1. サイドバーのワークスペース名をクリック
2. Preferencesをクリック
3. ページが切り替わったら、左メニューのSidebarをクリック
4. ページが切り替わったら、Themeのセクションから変更します
5. 表示されているテーマを選ぶか、テキストボックスにカラーコードを入力

### 自分のスペースで管理する場合
1. サイドバーのDirect Messagesの自分のID名をクリック
2. 自分のスペースに切り替わったら、メッセージ欄にカラーコードを入力

![スクリーンショット 2018-04-18 22.12.30.png](https://qiita-image-store.s3.amazonaws.com/0/33779/3a801912-d0ad-c4fa-f918-f986da45661e.png "スクリーンショット 2018-04-18 22.12.30.png")

メッセージを送信すると、スクリーンショットのようになります。
Switch sidebar themeのボタンをクリックすると、テーマが切り替わります。

以上になります。

## まとめ
気分転換になって良さそうです👍
プログラミングをよく知らない初心者がMultiDatesPikerを導入してみた


#MultiDatesPikerとは？
jQuery UIのカレンダー(DatePiker)を拡張し、複数の日付を選択できたり、範囲の指定ができたりと、multiと名前に付いている通り『複数』に重点を置いたプラグインの一つです。

#使い方
ほぼ公式(？)でわかるとは思いますが、説明していきます。（今回は拡張という事なので以前にdatepickerを使用しているという前提で話を進めていきます）
http://dubrox.github.io/Multiple-Dates-Picker-for-jQuery-UI/

1. 必要なファイルを設置
置き場所は特に厳格には決まっていないですが、既にあるプロジェクトに合わせるのが良いと思います。プロジェクトのどこかのjsディレクトリとかに
jquery-ui.js
jquery.datetimepicker.js
などが置いてあると思うので同じところにjquery-ui.multidatespicker.jsファイルを設置します。
自分はこの一つのファイルだけ設置でいけました。

2. 埋め込み
プロジェクトのHTMLを表示する部分に埋め込む必要があります。

例）年間のカレンダーを表示
HTML

```HTML:test.html
<div id="mdp-demo"></div>
```

js

```JavaScript:test.js

 	$(function() {
 		var today = new Date();
 		var y = today.getFullYear();
 		$('#calendar').multiDatesPicker({
 			numberOfMonths: [4,3],
 			defaultDate: '1/1/'+y
 		});
 	});

```

公式のものをそのまま使ったら動かなかったので少し加えました(コピペすみません)
これだけで動きます。

あとは

```js
 		$('#calendar').multiDatesPicker({
 			numberOfMonths: [4,3],
 			defaultDate: '1/1/'+y
 		});
```

ここの部分にオプションを追加していけば自分好みのカスタマイズが可能となります。
一例を紹介します。

#その他オプション
デフォルトの日付を""で囲まれた日付で設定します。(y-m-d形式で1995年3月13日を指定)

```js
dateFormat: "y-m-d",
defaultDate:"95-3-13"
```

当月の指定日を選択済みの状態にしておきます。(14日と19日)

```js
addDates: [date.setDate(14), date.setDate(19)]
```

選択不可の日付を設定します。(1日と3日)

```js
addDisabledDates: [date.setDate(1), date.setDate(3)]
```

カレンダー自体を無効にします

```js
disabled: true
```

altFieldを使用します。選択した日付をテキストボックスへ表示させます


```js
altField: '#altField'
```

```HTML
<input type="text" id="altField">
```

選択可能な数を指定します。

```js
maxPicks: 2
```

指定した日数以降の日付を選択不可にします。(選択した日付の後ろ7日以外は選択できなくなります)

```js
pickableRange: 7
```

指定した範囲を選択済にさせます。
0,5は当日から5日後を表します。-1を設定すると前日となります。

```js
mode: 'daysRange',
autoselectRange: [0,5]
```

選択できる最小日、最大日を指定します
0は当日、30は30日後を表します。

```js
minDate: 0, 
maxDate: 30
```

1年間のカレンダーを表示するものもあります。こちらも同様にデフォルト日の指定や選択可能日を指定することもできますし、3ヶ月×4列のような表示の仕方も可能です
その場合はこのようにオプションに追加します。


```js
numberOfMonths: [3,4]
```

#まとめ
今回はMultiDatesPickerを簡単に説明させていただきました。使い方も非常に簡単なので、ぜひ使ってみてください。特にDatePickerやTimePickerを使ったことがある人は使い方も似ているかと思いますのですぐに使えると思います。
今回、jsに初めて触れたので(ほんとちょっとだけですが)まだまだ勉強不足ですがこれからできる事を増やしていきたいと思います。
ubuntuでvimのインストールができなかった

#ubuntuでvimのインストールができないときの対処法
コンソールから下記のコマンドでvimをインストールしようとした。

```
$ sudo apt-get install vim
```

しかし何故かインストールできない。
リソースがなんとかかんとか・・・・・・

```bash:ログ
/var/lib/apt/lists/lock が取得できませんでした
/var/lib/dpkg/lock が取得できませんでした
```

ググってみるとlockというディレクトリを消すと良いと書いてあったので早速削除。

```
$ sudo rm /var/lib/apt/lists/lock
$ sudo rm /var/lib/dpkg/lock
```

その後もう一度vimのインストールを試みたのだが
このような恐ろしいメッセージが出てしまった。

```bash:ログ
dpkg: 復旧不可能な致命的なエラーです。中止します:
```

仕方ないのでさらにググっていると `/var/lib/dpkg/updates` 直下のファイルを削除するといけるという記事を見つけたので削除してみた。

その後

```
$ sudo dpkg --configure -a
$ sudo apt-get install vim
```

でいけた！！
portainerであれこれ試した話

dockerのGUI使ってみたい、という事でportainerとrancherを試してみた。

この2つを試した理由はdockerイメージが提供されててコンテナ立ち上げればすぐ使えそうだったから。
rancherは機能的にはリッチな感じだけど、関連コンテナがボコボコ10個くらい立ち上がってきたので見送り。ポート周りの設定もなぜかうまくできなかった。(いつかもう一度試す)
agentコンテナが全然立ち上がらなくてあれこれ試行錯誤したのだけれどそれはまた今度。

で、portainer。
portainerの良いところはコンテナ1個で、細かい設定なしですぐ使い始められるとこ。素敵。
で、そんなportainerをもう少し使いこなしたくていじくりまわしたのでその結果を書く。
細かい理屈は置いといて~~(置きっぱなし)~~、できたこととそのやり方をメモ。
適宜追加していく予定。(追加するとは言っていない)

# 環境
環境は`ubuntu16.04`
dockerのバージョンは`17.12.0-ce`
portainerは多分`1.16.5`　多分。

# portainerにホストを追加する
portainerで複数のホストを管理する、要はEndpointの追加のやり方。
サーバAでportainerのコンテナを起動して、管理対象にサーバBを追加するようなとき。
作業は基本的にrootで実施。

1. dockerデーモンの起動オプションを追加する 
    リモートホスト(サーバBの方)のdockerデーモンに、tcpソケットを有効にするオプションを追加すればいい。らしい。
    daemon.jsonを書き換える方法は上手く出来なかった。起動時の設定とconflictしてるとか何とか。
    最終的には `/lib/systemd/system/docker.service` を書き換えることで対応。

    ここ↓を

    ```
    ExecStart=/usr/bin/dockerd -H fd://
    ExecReload=/bin/kill -s HUP $MAINPID
    ```  

    こう↓した 
    1行目の空白は既存設定の上書きに必要っぽい。書かなかったら失敗したので注意。

    ```
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
    ExecReload=/bin/kill -s HUP $MAINPID
    ```  
      
1. dockerデーモンを再起動する
    デーモンを止めてー、 `systemctl stop docker`
    設定を読み直してー、 `systemctl daemon-reload`
    デーモンを上げ直す。 `systemctl start docker`

    起動後のプロセスをpsコマンドとかで確認して設定の通りになっていればOK。

    ```
    $ ps -ef | grep dockerd
    root      1677     1  0 15:04 ?        00:00:20 /usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
    ```  

1. portainerにEndpointを追加する
    あとはportainerのGUIでEndpoint画面を選択して追加するだけ。
    このときEndpoint URLは `サーバBのIPアドレス:2375` で設定する。
    ホストの切り替えは画面左部ペインの ACTIVE ENDPOINT から。


# 蛇足
これで複数のホストが1画面で管理できるぞやったー。
と思ったけど、ホストが少ない(2つとか)とメリットをあまり感じない。
それぞれにportainer入れても良いような気すらしてくる…

まぁ、こっちの方がちゃんと使いこなしてる感あるし、良いことにする。

セキュリティ面に配慮してきっちりやるのであれば http://docs.docker.jp/engine/security/https.html にあるように、鍵ファイル作ってポートも`2376`でtls使う方が良いと思う。
けれども、今回はお試しなのでとりあえずこれで。

# 追記
daemon.jsonへのオプション追加がうまくいかなかった件。
どうも起動時の-Hオプションを削除したうえでdaemon.jsonを書き換えればよかったらしい(あやふや)

この辺りが多分答え。
https://github.com/docker/for-linux/issues/76
https://docs.docker.com/config/daemon/#troubleshoot-conflicts-between-the-daemonjson-and-startup-scripts
Go言語でCtrl+Cなどのシグナルを検知する

プロセス実行中に Ctrl+C だのを叩いた（シグナルを送った）とき、その通知をプログラム内で受け取る。シグナルハンドリング。
##基本

```signal.go
package main

import (
	"os"
	"os/signal"
)

func main() {

	// シグナル用のチャネル定義
	quit := make(chan os.Signal)

	// 受け取るシグナルを設定
	signal.Notify(quit, os.Interrupt)

	<-quit	// ここでシグナルを受け取るまで以降の処理はされない
	
	// シグナルを受け取った後にしたい処理を書く

}
```

ここで設定した"os.Interrupt"は、Ctrl+C で中断されるときに送られるシグナル(SIGINT)のこと。割り込みを意味するシグナル。

※osパッケージで定義されてるこれ→　Interrupt Signal = syscall.SIGINT

[その他のシグナルを設定したい場合、こちらの一覧から探してみてください](http://golang.jp/pkg/syscall)


###複数のシグナルを受け取りたいとき
上記コードの signal.Notify() の引数をいじるだけ。

```
	// 受け取るシグナルを設定(検知したいシグナルを引数にどんどん入れていく)
	signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT)
```
※ この例の場合、"syscall" の import も忘れずに。


##何か処理しながらシグナルを待つ
・メイン処理実行
・…してる間もシグナル待機
・シグナルを検知したらサブ処理を実行
↓↓


```signal_2.go
package main

import (
	"os"
	"os/signal"
	"fmt"
	"time"
)

func main() {

	// シグナル待機中にやりたい処理 ※goroutine(並行処理)で書く
	/////////////////////////////////////
	go func() {
		for {
			time.Sleep(2 * time.Second)
			fmt.Println("処理中...")
		}
	}()
	/////////////////////////////////////


	// シグナル用のチャネル定義
	quit := make(chan os.Signal)

	// 受け取るシグナルを設定
	signal.Notify(quit, os.Interrupt)

	<-quit // ここでシグナルを受け取るまで以降の処理はされない

	// シグナルを受け取った後にしたい処理を書く
	fmt.Println("シグナル受信")
}
```
Flutterでメーラーを起動する方法


[url_launcher](https://github.com/flutter/plugins/tree/master/packages/url_launcher)というプラグインを使えば、ブラウザの起動、メーラーの起動、電話の発信、SMSの送信が可能です。

# 依存関係を解決
```pubspec.yaml
  # 追記
  url_launcher: 3.0.0
```

# 実装方法
url_launcherはURI形式の文字列で何をするかを指定します。
今回はメーラーを起動したかったので、次のようなコードを書くことでメーラーを起動しました。

```dart
    String url = "mailto:hoge@example.com?subject=hoge&body=fuga";
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
```

# 日本語を使う
標準の`Uri`クラスにURLエンコードする関数があるので、それを使用してこんな感じに書けます。

```dart
    String hoge = Uri.encodeComponent("ほげほげ");
    String mailUrl = "mailto:hoge@example.com?subject=News&body=$hoge";
```
関数内でreturnを省略することで発生しうる未定義バグ

タイトルの通りです。私が見たやつ共有させてください。
因みにreturn文がないコードってこんな感じの奴です。
<img width="302" alt="スクリーンショット 2018-04-17 23.49.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/35276/6de87ecf-d78c-0d82-2409-ca52c9f8e969.png">
15
この15ってなんですかねって話です。

# returnを省略してもコンパイル可能だけど未定義のケース
返り値がvoidの場合はreturn文は省略できますが、int型の場合はどうでしょうか。
下記のreturn文を省略した２つの関数を含むコードはclang7.0.0とgcc8.0.1ではコンパイル可能です。
gccも7.2.0以下では-Wallオプションを付けなければWarningすら出ません。

```cpp

#include <cstdio>

int f() {/*returnがない！*/}

int main()
{
    printf("%d", f());
    //main()はなくても大丈夫
}

```

`f()`と`main()`は共に返り値が`int`型ですが、`return`が省略されています。
c++ではmain関数に限り、そのmain関数の戻り値の型が `int` であれば return 0; があったと見なされるため特に問題ありません。
しかし`f()`についてはコンパイル可能&関数呼び出し可能ですが、その**返り値については未定義**となっております。

このような関数は**返り値を利用しない限りは正しく動作する**というのも厄介なのですが、それ以上に厄介な特性を持っています。

# return文を省略された関数の返り値はeaxレジスタの値
例えば上記の`f()`の返り値を返すコードWandboxさんで実行すると下記のような結果になります。
[Wandbox-実行結果](https://wandbox.org/permlink/NaFK8lIVxPm4WpDw)
<img width="214" alt="スクリーンショット 2018-04-17 23.24.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/35276/6f3e926f-d415-18b3-72c3-cc754b0f60b0.png">

実は、この419632とは恐らく**eaxレジスタに格納されている値**です。
未初期化の場合もあれば何かしらの値がセットされている場合もあります。
x86アーキテクチャにおいては、関数の返り値は慣例的にeaxレジスタでやり取りされています。
そしてclangやgccにおいては、**呼び出し側はeaxの値がいつセットされたものかに関わらずeaxレジスタの値を返り値として受け取ります。**
これが非常に厄介。

つまり最初のコードの内部では下記のような操作が行われているのです。

1. f()が呼ばれる
2. g()が呼ばれる
3. g()の内部でeaxレジスタに15をセット。(returnの処理)
4. g()終了
5. f()終了 (returnの省略)
6. eaxのレジスタをf()の返り値として受け取る　←本当はg()の返り値！！

```cpp

#include <cstdio>
int g() {return 15; //eaxに15をmov}
int f() {
g();//　g()の値を返り値としてeaxにmov
//特に後に何も処理がないのでeaxに返り値が残り続ける。
}
int main(){printf("%d", f());}// f()の内部で呼ばれたg()の返り値がeaxに残り続けておりそれを返り値と勘違いして受け取る。

```

しかし`f()`のこの動作は未定義です。
試しにWandboxでclang7.0.0でコンパイルすると実行時エラーで死にます。
つまり、関数の返り値を返そうと思ったけどreturn文を書き忘れたコードを書いた場合、**ある環境andコンパイラによっては一見正しく動作をするが、別の環境orコンパイラでは実行時エラーor未定義の値が返される**ということです。
辛い。
しかもgcc7.2.0ではデフォルトではWarningにならないためデバッグも辛い。。。

## 安心してください

+ ClangではWarningになります。
+ -WallをつければWarningになります。
+ gccも8以上ではデフォルトでWarningになります。

-Wallつけよう

## なぜこのようなコードが許されるのか

一つの可能性というか、return文を省略できる妥当性としては、**returnが省略されている箇所が、プログラマのみが知っている事前知識によって、絶対に通らないルートとなっている可能性をコンパイラが排除しきれないからです。**

例えば下記のようなコードが考えられます。

```cpp

int f1() {
  if(check()) return 0;
  Fatal(); //内部でexit()が呼ばれる
  
  //絶対にここから下は通らない！
  ...
}

int f2() {
switch (num) {
	case 0:
		return 0;
	case 1:
		return 1;
	}
   // numは何らかの制約で上記条件以外の値にならないため、絶対にここは通らない！！
}

```

このような絶対に通らない領域にreturnを必ず書くべきかと言われると、そうではないという人が存在することも一定の理解を示せます。
ですが[**絶対に起きないと思っているルートこそ通りがち**](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%83%95%E3%82%A3%E3%83%BC%E3%81%AE%E6%B3%95%E5%89%87)という話もあります。
私としては必ずreturnを書きつつ、そのルートを通ってしまった事が分かるような処理を用意したほうがよいのかなぁと思います。
というかそもそも上みたいなreturnの書き方しない方が良いです。
てかWarning出るし。

こういうreturnを通らないルートがある可能性がある場合はコンパイルエラーにしてほしいのですが、C++は後方互換を大事にするのでなかなか難しいようです。（とはいえgccがデフォルトでWarning出すのが8.0.1というのは遅すぎのような）

## Qiitaはポエムを書く場所です。

何かこのreturnの省略について、明確な仕様が言及されているのをご存知の方がいたら教えて頂きたいです。
言語処理系を作った事がある人は分かると思いますが、仕様や構文解析の緩さにより思わぬコードが正しく動いてしまうこともあります。(そこが面白いところでもあったり怖いところでもあったり。)
c++のテンプレートも現在のTMPのよおうな使われ方は想定していなかった用法だったらしいです。
私個人としてはこのreturn文の省略もそんな過程で生まれたのかなと思ったり思わなかったり。
chromeでselenium動かしてみた！

今回はちょいと思考を変えて新たなWebUIの自動テストツールseleniumを紹介したいと思います。
といっても自分自身使ったことがないため、探りながら紹介していきます！
僕はPythonでクローリング・スクレイピングしたいなぁと考えていたときに見つけたツールなのでテストの自動化！って使い方は紹介できませんが
おそらく使い方は一緒だと思うのでさっそく行きましょう！

##Seleniumとは
Webブラウザのテストを自動化するためのツールです！
ちょっと前まではFireFoxでブラウザでの作業を録画？してそれをコード(Python,Java)に落として～ってやるのが簡単なやり方と聞いたことがあります。

しかし！FireFoxでSeleniumIDEの配信は終了しているとのこと、、

##chromeで似たようなものを見つけた
ズバリ↓
https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd

ポチポチ押して拡張機能をGetします。
左上に[Se]ってボタンが追加されるのでさっそくクリック！

するとこんな画面が出ます
![n1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246478/4302ffc6-72fa-fac9-d5d9-0cd5fd7e5a2c.png)


##さっそく動かしてみた
まずは録画したい対象のURLをぺたっと貼ります
※今回はローカルにいるJenkinsおじさんが対象です

続けて、右側にある赤丸をぽちり
すると録画開始されるので実際にWebUI側で作業します
①Jenkinsのプロジェクトを選択
②手動で実行をクリック

作業後に赤丸を再度ぽちりとすることで録画完了！
![n2.PNG](https://qiita-image-store.s3.amazonaws.com/0/246478/74d60479-c4ec-78f1-618b-d84c4d0b96a9.png)

▷ボタンをクリックすることで先程録画した作業を実行！
これで何万回やっても同じ作業が可能です！
![n3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246478/42c307a8-4d47-5b21-8e4e-2a6152b29f44.png)
↑あれれ、logで失敗してますね。これはおそらくページが推移するまえに次の作業を実施しようとして失敗してしまったのかと思います

なので時計マークタブを引っぱってSlowの方に持ってきますと
![n4.PNG](https://qiita-image-store.s3.amazonaws.com/0/246478/0e7de0f9-db59-c7d0-cc4f-c9773d26061c.png)
うまくいきました。

##まとめ
なんとか動かすことができました！
PythonやJavaのコードに変換してダウンロードしたりはまだできないんですが、今後できるようになるかも！とかどっかのサイトで見かけました。
そうなるとPythonでスクレイピングやクローリングするときに使えるかなぁとか考えつつ今回の投稿を終わりたいと思います。
自動車(HS87)の貿易統計

# とりあえずの公開です。
税関別の貿易統計のデータを1988-2017分まとめてみました。
HSコードをつけていますが、上２桁８７以外は、メンテナンスしていません。
sqlite3 形式のデータです。

[custom_87　約300メガ](https://toukeibiz-my.sharepoint.com/:u:/g/personal/tadashi_toukei_biz/ER2bJ7YiNjVOpYLfzGq_PXwB7HVehAy2P1rEUEyRg6Xgrg?e=1CPMH2)

### テーブル一覧
|テーブル名||
|---|---|
|hs2_name|HS上2桁|
|hs4_name|HS上4桁（メンテ中）|
|hs6_name|HS上６桁|
|hs9_name|HS上９桁|
|custom_name|税関コード|
|country_name|国コード|
|custom_1988_2017_87|1988〜2017の　HS87のデータ|
|custom_2018_87|1,2月のデータ|

### 1500cc-3000cc の年別輸出　リーマンショックからは回復しています。

![2018_04_17.png](https://qiita-image-store.s3.amazonaws.com/0/48387/609d7c2c-7f11-ece6-4154-411584eb777a.png)


jupyter をとりあえずはっておきます。

```python
#!/usr/bin/env python
# -*- encoding:utf-8 -*-
import sys,os,re,json,inspect,requests,platform
import datetime
from datetime import datetime as dt

import pandas as pd
import numpy as np

import filecmp

import matplotlib
import matplotlib.pyplot as plt
plt.style.use('ggplot') 

%matplotlib inline

from IPython.display import display, HTML
# http://www.customs.go.jp/toukei/info/tsdl_e.htm

import sqlite3
import pandas.io.sql as psql
show_tables = "select tbl_name from sqlite_master where type = 'table'"
# desc 相当　"PRAGMA table_info([テーブル名])"
desc = "PRAGMA table_info([{table}])"
#sqls =  json.loads(open('json/hs_sql.json').read())
#json.dump(sqls,open('json/hs_sql.json','w'),ensure_ascii=False, indent=4, sort_keys=True)

db = 'custom_87.db'
conn = sqlite3.connect(db)


sql="""
select Year,sum(Value) as Value
from {table} 
where exp_imp={exp_imp} and
Country = {Country} and
hs6='{hs6}' 
group by Year
order by Year
"""

 
# 0 	304 	アメリカ合衆国 	2682862498
# 1 	601 	オーストラリア 	421229475
# 2 	213 	ドイツ 	385297518
# 3 	105 	中華人民共和国 	343141706
# 4 	302 	カナダ 	256708223

table='custom_1988_2017_87'
exp_imp=1
Country =  304
hs6 = "870323"
df = pd.read_sql(sql.format(table=table,Country=Country,
                            exp_imp=exp_imp,hs6=hs6),conn)
df.index = df['Year']
df.plot(y=['Value'])
```

**アメリカ**![usa.png](https://qiita-image-store.s3.amazonaws.com/0/48387/4c6136ac-55ce-8b77-8a3c-817c502a93f8.png)

**オーストラリア**![2018.png](https://qiita-image-store.s3.amazonaws.com/0/48387/2f560e8b-9fa6-5b8f-01bf-af6041d8e9a3.png)

**ドイツ**![2018_04_17_1.png](https://qiita-image-store.s3.amazonaws.com/0/48387/c59295b6-b68f-8d22-0286-1d2ae14227e3.png)

**中国**![2018_04_17_2.png](https://qiita-image-store.s3.amazonaws.com/0/48387/805693a5-62da-1c7a-e220-807fe275b6af.png)

**カナダ**![canada.png](https://qiita-image-store.s3.amazonaws.com/0/48387/28df08d7-37f2-6e07-2a1b-0a2284d0b843.png)
Twitterの名前に絵文字を自動設定してみる

Twitterの名前に絵文字（スマイリー）を付けて、その時の気分や時間帯によって手動で変更していました。なんとなく。

![img.png](https://qiita-image-store.s3.amazonaws.com/0/223036/6a8788ea-38f1-05ac-4d9e-2b77e996c4df.png)

先日、Qiitaに投稿されていた以下の記事を見て、自動化すると面白そうだなと思い、試してみました。

[Twitterの名前を5分毎に東京の天気☼☂☃と連動させるサーバレスプログラムを書いたら色々知らないことが出てきた話](https://qiita.com/issei_y/items/ab641746be2704db98be)

##TwitterOAuth
PHPで、TwitterOAuthを使ってみました。久しぶりに使いましたが、新しくなっていたんですね。ファイル構造や書き方も変わっているようです。
ダウンロードやTwitter APIの使い方は以下の記事が参考になります。

[【PHP】新TwitterOAuthでログイン機能を実装する](https://qiita.com/sofpyon/items/982fe3a9ccebd8702867)

##OAuthに接続
```php
// OAuth用ライブラリ twitteroauth
require_once 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

// アプリ登録した際に発行された値
$consumer_key        = 'XXXXXXXXXXXXXXXXXXXXX';
$consumer_secret     = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$access_token        = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$access_token_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

// オブジェクト生成
$connection = new TwitterOAuth (
	$consumer_key,
	$consumer_secret,
	$access_token,
	$access_token_secret
);
```
##スマイリーの設定
```php
// 時間帯 絵文字（スマイリー）設定
date_default_timezone_set('Asia/Tokyo');
$timezone = date('H');
if ($timezone < 6) {
	$smily = "😴";
} else if ($timezone >= 6 && $timezone < 9) {
	$smily = "😀";
} else if ($timezone >= 9 && $timezone < 12) {
	$smily = "😄";
} else if ($timezone >= 12 && $timezone < 17) {
	$smily = "🤔";
} else if ($timezone >= 17 && $timezone < 21) {
	$smily = "😷";
} else {
	$smily = "😪";
}
```
このあたりは好みですね。もうちょっと細かく分けてバリエーション増やしても面白そう。

date_default_timezone_setでタイムゾーンを設定しておかないと、-9時間になる場合があります。不要な場合は省略可。

##ユーザー情報変更
```php
// ユーザー情報変更
$profile_request = $connection->post("account/update_profile", ["name" => "ユーザー名".$smily]);
```

あとは2時間毎にクーロンを設定したりすれば自動化の完成です。

トリガーを変えるといろいろ応用できるので、例えばSlackのステータスと連動させたり、難易度はめっちゃ高そうですがツイートする度に感情分析して内容と合った絵文字にしたりできると面白そうです！
【tutorial】AWS EC2にPHP, Apache, Laravel, MySQLをインストール→ログインページを表示

2018/04/18に実施。

１．PHP, Apache, Laravelをインストール。
https://qiita.com/d778980/items/78b467af625b405e7f50

２．MySQLをインストール。

```
sudo rpm -Uhv http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
sudo yum -y install mysql-community-server
```

３．MySQLを起動。

```
sudo service mysqld start
```

４．MySQLに接続。エラーが発生。

```
mysql -u root
```

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/913cde03-9c5b-975e-965d-c5952312894d.jpeg)

５．MySQLを停止。オプション付きで起動。

```
sudo service mysqld stop
sudo mysqld_safe --skip-grant-tables & sudo service mysqld start
```

６．MySQLに接続。権限を初期化。

```
mysql -u root
use mysql;
truncate table user;
flush privileges;
grant all privileges on *.* to root@localhost identified by 'パスワード' with grant option;
flush privileges;
```

７．database, user を作成。

```
create database homestead;
create user homestead@localhost identified by 'secret';
grant all on homestead.* to homestead@localhost;
exit;
```

８．プロジェクトに移動してログイン機能を作成。エラーが発生。

```
cd /var/www/laravel/sample/
sudo chmod -R 777 /var/www/laravel/sample
php artisan make:auth
php artisan migrate
```

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/6a7cce83-1b7f-5bad-7236-041ee6c25d53.jpeg)

９．php-pdo, php-mysqlをインストール。

```
sudo yum -y install --disablerepo=* --enablerepo=remi,remi-php70 php-pdo
sudo yum -y install --disablerepo=* --enablerepo=remi,remi-php70 php-mysql
```

１０．「８．」をリトライ。成功。
php artisan migrate

１１．/etc/httpd/conf/httpd.confを編集して.htaccessを有効化。

```
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
↓↓
<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>
```

１２．ブラウザでログインページを表示。
http://(パブリックDNS)/login
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/02c26a14-6386-7ceb-5708-027d2f852da9.jpeg)

終わり。
Vue.jsをほんの少し触ってみた

# Vue.jsを触る

Vue.jsが最近アツいみたいなので、今のうちに触っておこうと思います。
導入から特徴など、自分が30分程度（短い）触った間に書いたメモ書きを晒します。

ちなみに読み方は「ヴュージェイエス」です。下唇を上手く使って発言しましょう。

## そもそもVue.jsってなに？？
ざっくりというとJavaScriptのフレームワーク。
同じ立ち位置のものは、Angular JSとか、React とかがある。

## 入門 - Hello World を出してみる
公式サイトのはじめるで紹介されていChris Fritz氏の[Vue 2.0 Hello World](https://jsfiddle.net/chrisvfritz/50wL7mdz/ "Vue 2.0 Hello World - JSFiddle")を参考に、まずはプログラム入門でお馴染みのHello Worldをだしてみる。

HTML

```HTML
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <p>{{ message }}</p>
</div>
```

JS

```JS
new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue.js!'
  }
})
```

ぱっと見た感じ、HTML側のIDをVue側で指定して、```data```の```message```がHTML側の```{{ message }}```に対応しているのがわかる。PHPのSmartyみたいなテンプレートエンジン的な動きをするっぽい・・・？
と思っていたら、公式ページにこんな内容が・・・

> 一見するとただテンプレートを描画しているように見えますが、Vue.js は内部で多くの作業を行っています。データと DOM は関連付けられ、そして全てがリアクティブになっています。

かなり噛み砕いて言うと、```el: '#app'```と指定したDOM要素をVueの制御配下とし、データはリアルタイムですぐに反映する用になっています！…といったところでしょうか？？

このままだとただのテンプレートエンジンになってしまうので、次はもう少し有意義な使い方をします。

## v- を使ってみよう

### 属性をバインドするv-bind

まずは以下のソースを見てみる。

HTML

```HTML
<script src="https://unpkg.com/vue"></script>

<div id="app-2">
  <span v-bind:title="message">
    マウスをホバーしてね！！
  </span>
</div>
```

JS

```JS
var app2 = new Vue({
  el: '#app-2',
  data: {
    message: 'あなたがこのページを読み込んだ時間は ' + new Date().toLocaleString()
  }
})
```

HTMLの```v-bind:title```という部分で、```span```要素の```title```属性を、Vueの```message```プロパティで更新する。というソースになります。

### 条件分岐もさわってみる

```HTML
<div id="app-3">
  <span v-if="seen">Now you see me</span>
</div>
```

```JS
var app3 = new Vue({
  el: '#app-3',
  data: {
    seen: true
  }
})
```

```v-if``` は、対象のプロパティの真偽に応じて、その要素の表示有無を切り替えます。
上記のコードで```seen:false```とするか、コンソールから```app3.seen = false```と入力すると、この要素が消えます。

ここで、本家いわく、
> この例は、テキストをデータに束縛できるだけではなく、 DOM の構造にデータを束縛できることを示しています。

こういう強気な文章かっこいいですね。


## コンポーネントという考え方
上記では簡単にVue.jsの超超入門をしました。でも本当の特徴はここからです。
Vue.jsはコンポーネントというHTMLタグのようなものを作成することができ、一度定義することで、再帰的にコンポーネントを利用することが出来るようになります。

例として

```JS
// todo-item と呼ばれる新しいコンポーネントを定義
Vue.component('todo-item', {
  template: '<li>This is a todo</li>'
})
```

このように記述すると、HTMLで

```HTML
<ol>
  <todo-item></todo-item>
</ol>
```

と書くだけで、```todo-item```に定義されている内容が```li```タグで生成されます。
これだけでなんだかとてもワクワクしてきますね！！


## 少しだけ触ってみて
JSのフレームワークはあまり使ったことがなく、基本的にjQueryで実装を行っていた僕ですが、Vue.jsを使うと、描画部分の実装にあまり気を使わなくて良くなるため、よりロジカル的な部分に集中できるのかなと思いました。

ユーザ操作や、APIとの通信などで画面側の表示がどんどん変わっていったりするWebアプリに向いていたりするのでしょうか・・・？

言えることは触っていて楽しいということです。
今までの実装では、ロジックの部分、描画の部分と対極の２面を考える必要があったので、実装してプロパティを更新するだけで描画側に反映されていくのがとても楽しいです。
どんどん勉強したくなるJSフレームワークです。

少しでも多くの人がVue.jsに興味を持ってくれればいいなと思います。
またもう少し触ってわかってきたらもっと深い記事を作ろうと思います。

私の[ブログ](https://spadeloves.cf/blog/wp_spadeloves/ "忘れっぽいログ")もよろしく(^o^)

## 参考にさせていただいたサイト
* [Vue.js](https://jp.vuejs.org/ "Vue.js")
* [Vue.jsから手軽に始めるJavaScriptフレームワーク - Qiita](https://qiita.com/icoxfog417/items/49f7301be502bc2ad897 "Vue.jsから手軽に始めるJavaScriptフレームワーク - Qiita")
* [Vue 2.0 Hello World - JSFiddle](https://jsfiddle.net/chrisvfritz/50wL7mdz/ "Vue 2.0 Hello World - JSFiddle")
WKWebView の POST の httpBody が nil になる



nil になるのは２つパターンがあります

# WKWebView の `load(_ request: URLRequest) `に POSTメソッドでhttpBodyを設定したURLRequestを渡しても、 httpBodyがnilとしてリクエストされてしまう

iOS10以下で発生しているバグです。
iOS11では解決しています。

iOS10以下でも場合によっては解決策がないこともないですが、アプリのデザインを見直して解決したほうが良いかと思われます。


# WKNavigationDelegate で `navigationAction.request` がPOSTメソッドのとき httpBody が nil になる

```swift
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
```

こちらは iOS11 でも引き続き nil になります。requestに介入できないようにあえてそうしているのかもしれません。
Check! Docker for Windows でTCP接続のバッファが足りないエラー (lacked sufficient buffer space or because a queue was full.) の対処

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに
=====
Docker for Windows で、ときどきこのエラーに遭遇します。Docker for Windows をリスタートすれば直るのですが、不便なので根本対処してみました。

```bash
Error response from daemon: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
```

エラー分析
====
本件は、Github の issue にも上がっていますね。

- [An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full · Issue #320 · docker/for-win · GitHub](https://github.com/docker/for-win/issues/320)

どうやら、このエラーのようです。

- [Windows Sockets Error Codes (Windows)](https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx)

|エラーコード|説明|
| --- | --- |
| `WSAENOBUFS` `10055` | **No buffer space available.** An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full. |


対処
====
対処としては、TCP 接続数の上限値を引き上げねばならないようです。レジストリ書換えは億劫ですがやってしまいましょう。

なお、レジストリ書換えに失敗すると危険、ということは昔から変わらないようですので、ご自身の判断でご対応ください。

- [When you try to connect from TCP ports greater than 5000 you receive the error 'WSAENOBUFS (10055)'](https://support.microsoft.com/ja-jp/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-t)

手順
----
1. Windows メニューを開いて、入力欄に `regedit` と入力し、レジストリエディタを開きます。
1. レジストリエディタの、上部のパス入力欄に、`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters` を入力して開きます。
1. 「Edit」>「New」>「DWORD (32-bit) Value」をクリック（下図参考）して、名前に `MaxUserPort` と入力します。
1. `MaxUserPort` をダブルクリックし、「Base」を `Decimal`に変更し、「Value data」に 設定する値を入力し、「OK」をクリックします。（下図参考）
    - 規定値は `5000` 、上限は `65534` （10進数）です。
1. レジストリエディタを閉じ、マシンを再起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/9f52858e-3f14-53c1-8be5-f92f99275b36.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/757b2ed5-58c9-27b1-aeea-08dcf6c28628.png)


いかがですか！ちゃんと起動しましたか！（ドキドキ

私の環境では無事にうごきました～('ω')/

Epilogue - おわりに
====

しばらくこのエラーを放っていたんですが、ちょっと都合が悪くなったので重い腰を上げて対応しました。これでさらなる快適コンテナライフを楽しめるはず！
CodeIgniterのURLからindex.phpを削除するための.htaccess（XSERVERの場合）



```
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# ↓公式サイト推奨の場合
# RewriteRule ^(.*)$ index.php/$1 [L]
# ↓XSERVERの場合
RewriteRule ^(.*)$ /index.php?/$1 [L]
```
「モンティ・ホール問題」をシミュレートする

「[rubyでモンティホール問題に挑戦](https://qiita.com/Kashiwara/items/9e539ccac54462f46a5b)」の記事を見て、自分なりにやってみたくなりました。ここでは Go でやってみます。

#「モンティ・ホール問題」とは
三つの扉があり、その向こうのひとつにだけ当たりがあります。
　
挑戦者はまず三つの扉の中からひとつを選びます。
司会者（モンティ・ホール）は当たりの扉を知っています。そして二つあるハズレの扉のひとつ（挑戦者が選択していないそれ）を開けます。
挑戦者はそこで前に選んだ扉をもういちどそのまま選択してもよいし、二つの扉の別の方を選択してもよい。
　
さて、挑戦者はここで扉をもうひとつのそれに替えた方がよいのか、そのままにした方がよいのか、それともいずれでも当たる確率は一緒なのか。
どうなのでしょうか？

###実際のところは？
先に答えを言っておくと、これは**「扉を替えた方」が当たる確率は高くなる**のです。扉を替えない場合、当たる確率は 1/3 で、扉を替えると 2/3 になります[^1]。

不思議ですか？　ただ扉を開けただけなのに？

[^1]: まちがえやすいのは、扉を替えると当たる確率が 1/2 となる、というものです。正しくは 2/3 なのです。[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C)によれば、これはアメリカで実際に大論争になったそうです。


#シミュレートしてみる
コードはこんな具合になりました。

```go:monty_hall_problem.go
package main
import "fmt"
import "math/rand"
import "time"

const n = 1000000

//一回の試行
func trial(is_reselection bool) (result bool) {
    doors := [3]bool{true, false, false}
    select_of_challenger := rand.Intn(3)
    
    if is_reselection {
        remained_doors := doors[0:2]
        reselect_of_challenger := 0
        if select_of_challenger == 0 { reselect_of_challenger = 1 }
        result = remained_doors[reselect_of_challenger]
    } else {
        result = doors[select_of_challenger]
    }
    return
}

//n回試行して確率の計算
func calc(is_reselection bool) float32 {
    co := 0
    for i := 0; i < n; i++ {
        if trial(is_reselection) { co++ }
    }
    return float32(co) / float32(n)
}

func main() {
    rand.Seed(time.Now().UnixNano())
    
    //扉を替えない場合
    fmt.Println(calc(false))    //=>0.333683
    //扉を替える場合
    fmt.Println(calc(true))     //=>0.666448
}
```

確かにそうなります。

説明が必要でしょう。まず、扉 0, 1, 2 があって、当たりは必ず扉 0 にあるとします。挑戦者は何も知らないので、この仮定で問題ありません。これが`doors := [3]bool{true, false, false}`で表されます。
挑戦者が最初にどれを選んでも、モンティがひとつ開けて（それは挑戦者の選んだ扉ではなく、また当たりでもありません）残った扉は「当たり、ハズレ」の二つになります。とにかくモンティは、ハズレの扉を開けるしかないのですから。それが`remained_doors := doors[0:2]`の表わすところです。

あとはさほど問題はないと思います。

なお、これのRuby版が[ここ](http://obelisk.hatenablog.com/entry/2018/04/18/201202)にあります。

###追記
何だか不思議ですね。最初はおもいっ切りまちがえていました[^2]。

[^2]: 2/3 というのが納得できない人へ。上のコードで`reselect_of_challenger`の値が **0** になるのは`select_of_challenger`の値が 1 と 2 の場合であることに注意するとよいかも知れません。対して`reselect_of_challenger`の値が **1** になるのは`select_of_challenger`の値が 0 の場合だけです。
Gitあれこれ ~其の弐~

#git pull
`git pull` は、ローカルリポジトリとリモートリポジトリの関係性だけを見ると `git push` の逆ですが、実際は`git fetch`と`git merge`を行っています。
`git fetch`とは、リモートリポジトリの最新状態をローカルに反映させるコマンドです。
ただ実際に更新されているのは`master`ブランチではなく`origin/master`なので
以下のコマンドで`master`に`origin/master`をマージする必要があります。
`$ git fetch`
`$ git checkout master`
`$ git merge origin/master`
これでリモートリポジトリの最新状態がローカルに反映されます。
ここまでの流れを一つのコマンドで行うのが`git pull`です。

#git stash
`git stash`まだコミットしていない変更点を一時的に隠すことができるコマンドです。
取り出しも自由にできるので、急な作業依頼が来てブランチを変えて別の作業をしないといけない時などに使えるらしいです（まだあまり使っていないです）。
ちなみにstashは隠す、（こっそり）しまうという意味だそうです。
使い方は、まだ`git add`していない（変更点のある）ファイルがある状態で
`$ git stash save`
です(saveは省略可能)。このコマンドの後に
`$ git status`
コマンドを実行すると変更点のあったファイルがなくなっています。一時的に隠した変更の一覧は
`$ git stash list`
で確認できます。

```
stash@{0}: WIP on feature/step_7: c6c01bb commit_message_2
stash@{1}: WIP on feature/step_4: f401254 commit_message_1
```

隠した変更の一覧はこんな感じになっています。構成は下記の通りです。

```
stash_umber: WIP on branch_name: hash commit_message
```

コマンドは以下の通りです。

隠した変更内容の一覧を確認する場合。
=> `$ git stash list -p`

より詳しい変更を確認する場合。
=> `$ git stash show stash_number`

隠していた変更を元に戻す場合。変更を元に戻してもスタッシュ自体は消えません。
=> `git stash apply stash_number`

保存していた該当するスタッシュを消去する場合。
=> `$ git stash drop stash_number`

隠していた変更を元に戻して、該当するスタッシュを削除する場合。要は`apply`と`drop`を一気に行うということですが、慎重な人は使わないほうがいいかもです。
=> `$ git stash pop stash_number`

#git rebase
`git rebase` はブランチの変更点を別のブランチに統合する方法の一つです。
二つのブランチの終点を統合するマージとは違い、
一方のブランチの終点を、もう一方のブランチの始点に統合します。

```
A__B__C_____________F__ (master)
         \
          \
           \__D__E_____ (branch_1)
```
上記の場合、以下のコマンドで `branch_1` を `master` にマージすると、
`$ git checkout master` 
`$ git merge branch_1`

```
A__B__C_____________F_________ (master) 
         \               /
          \             /
           \__D__E_____/
```
このようになります。
一方で以下のコマンドで、 `branch_1` を `master` にリベースすると、
`$ git checkout branch_1`
`$ git rebase master`

```
A__B__C__F________________ (master)
         　　\
          　　\
           　　\__d__e_____ (branch_1)
```
このようになります。（枝分かれしているので解りづらいですが、コミット中心の視点で見ると二つのブランチの変更は統合されました。）まだあまり利用していないが、単純に変更を統合したい時よりもコミットやブランチを綺麗にしたい時に有効なのかな、という印象です。ただし`rebase`をすると統合したブランチの過去のコミットは書き換わって新しいコミットインスタンスが生成されてしまいます。なので`git rebase`後にローカルリポジトリをリモートリポジトリへ`git push`する場合は`-f`オプションが必要になります。


`git`はほぼ初心者なので誤りなどあれば指摘していただけるとありがたいです。
よろしくお願い致します。
スライドにソースコードを貼る 2018 Spring

## ref

[svg に吐くパターン](https://qiita.com/izumin5210/items/ecea019c20091b2c0c3a)（illustrator に貼る場合など，リッチテキストが利用できない場面）

## Keynote にソースコードを貼る
vscode を例に説明するが，atom や IntelliJ 系の IDE でも同じようなことができるはず．

### コードを書く

[![https://gyazo.com/f61eb4c6a8719e303467ba630e4cd318](https://i.gyazo.com/f61eb4c6a8719e303467ba630e4cd318.png)](https://gyazo.com/f61eb4c6a8719e303467ba630e4cd318)

### Copy With Syntax Highlighting

[![https://gyazo.com/62960b65b662f816c8601cd220f68508](https://i.gyazo.com/62960b65b662f816c8601cd220f68508.png)](https://gyazo.com/62960b65b662f816c8601cd220f68508)

### Keynote に貼る

[![https://gyazo.com/165c3bad75edb6adbcf5c90c44a17df6](https://i.gyazo.com/165c3bad75edb6adbcf5c90c44a17df6.png)](https://gyazo.com/165c3bad75edb6adbcf5c90c44a17df6)

### 文字サイズを変える

[![https://gyazo.com/258e3e7e6746fbc6fba05be3e5ff6e84](https://i.gyazo.com/258e3e7e6746fbc6fba05be3e5ff6e84.png)](https://gyazo.com/258e3e7e6746fbc6fba05be3e5ff6e84)

### デザインを調整する

- 背景色を変える
- 太めのボーダをつける
    - コードブロックのパディング表現
    - ボーダ色は背景色と同じにしておく
- 行間を調整する
    - 1.2 or 1.5
    - コードの量とかに合わせてかえる
- ドロップシャドウをつける
    - スライド背景色が黒以外のときに有効

[![https://gyazo.com/027d6e182235996da5293490a48f9fb7](https://i.gyazo.com/027d6e182235996da5293490a48f9fb7.gif)](https://gyazo.com/027d6e182235996da5293490a48f9fb7)


### かんせい
#### 例①
- 黒背景だったのでドロップシャドウは消した
- 「コード多いやろ？」のアピールであり，読ませるコードではなかったので文字サイズは小さめ

<img alt="gocon2018spring.013.png" src="https://qiita-image-store.s3.amazonaws.com/0/14845/1dc72216-c3a0-5581-5be6-09c14f6d54c0.png" width=70% >
[grapi: Bulding JSON API server with grpc-gateway for microservices // Speaker Deck](https://speakerdeck.com/izumin5210/grapi-bulding-json-api-server-with-grpc-gateway-for-microservices)
PostgreSQLのExtension付きのDBをbackup→restoreするときに気を付けること

## 経緯
別サーバからdumpして持ってきたDB（Extension付き）をリストアしたら、Extensionが使えなくなり、試行錯誤していたところ、後輩に教えてもらった内容を自分用にメモで残します。

## 環境
以下のような環境で作ったDBを別サーバへ復元ようとしました。

- ユーザはpostgresじゃないユーザを作成して利用。一応、パスワード付き（例：hoge_user/hoge_pass）
- スキーマも別途作成（例：hoge_schema）
- Extensionも利用している。（例：postgis）

## バックアップ手順
本題じゃないので簡単に。

```bash
$ pg_dump hoge_db -U postgres > hoge_dump.sql
```

## リストア前の手順
復元するDBを作成する際の手順に「alter database DB名 owner to ユーザ名」が抜けていて、復元後、```\dx```でExtensionが見えるも、動作せずに、無駄な時間を使ってしまっていました。

```bash
$ psql -U postgres
```
```bash
postgres=# create role hoge_user with login password 'hoge_pass';
postgres=# create database hoge_db;
postgres=# alter database hoge_db owner to hoge_user;
postgres=# \c hoge_db;
hoge_db=# create schema hoge_schema;
hoge_db=# drop schema public; // ここは必要に応じて
hoge_db=# alter schema hoge_schema owner to hoge_user;
hoge_db=# create extension postgis schema hoge_schema;
hoge_db=# alter user hoge_user set search_path to hoge_schema; // ここも必要に応じて
````

## リストアする
以下の手順でいつも通りリストアします。

```bash
$ psql -f hoge_dump.sql -d hoge_db -U hoge_user
```

## 最後に
「alter database」を忘れて午後丸々ハマっていました。
優秀な後輩に感謝を。
[超初心者向け] Rails5でアプリ開発後、Bootstrap4で効率よくデザインする方法

# はじめに
ここではRailsアプリを作成後に、デザインで壁に当たらないでいいようにするため、Bootstrap4を活用した、効率のいいデザイン方法について研究していきたいと思います。Railsアプリ作成後、デザインを高速化し、さっさとモックを作るためのページです。
共有しながら一緒に学んでいけたらと思いますので、アドバイス等いただければ嬉しいです。

# 設定環境
- OS
    - Mac OS X
        - 10.12.6
- Software
    - PostgreSQL
        - 10.1
    - Ruby
        - 2.5.0
    - Rails
        - 5.1.5

## Railsアプリのデザインを始めるにあたって
Railsアプリをデザインする上では、Bootstrapだけの知識ではなく、Railsアプリ向けのデザイン要素も出てくるので、Railsでのデザイン機能の使い方について考えていきましょう。

# **Bootstrapとは?** #

Bootstrapについてはこちらにまとめてあります。
https://qiita.com/mxsha/items/085d46f4da73f91322ed

# **Railsアプリ向けのデザイン要素とは?** #

Railsアプリをデザインする上でBootstrapなどを活用できる部分と、画像表示方法などRailsアプリで押さえておくべきポイントがいくつかあるので紹介します。

# **画像表示** #
これにはだいぶはまってしまいました。
通常のHTML,CSS等の静的なサイトだと画像表示方法はimageタグですが、
Railsのimageタグは別になっているようです。
<%= image_tag '画像ファイル名' %>で画像を表示
このような形ですね。詳細は以下になります。
https://qiita.com/sanstktkrsyhsk/items/8e8159f5c029a8e01333


**背景画像について**
背景画像について困っていた点はある一定の枠の中（例えば<div></div>の中）に、背景画像を入れてトップページを作る部分だったのですが、BootstrapにはJambotronという要素を加えることで、トップページのメインイメージ部分を作ることが可能でした。

このリンクが参考になります。
https://tonari-it.com/bootstrap-jumbotron/

ただRailsアプリ上だと以下のようなRailsでの画像表示としてのコードとの融合が必要になります。
主には従来だと(images/bg.png)のようなパスが入っているのですが、
Railsでの画像表示だと<%= asset_path 'bg.png' %>のようなパスにしないと画像が表示されません。

```js:
    <style type="text/css">
    .jumbotron { 
      background:url(<%= asset_path 'bg.png' %>) center no-repeat; 
      background-size: cover;
    }
    </style>
```

# **その他** #
**Rails特有のコード**
現在研究中です。


参考？



# **参考** #
[<%= image_tag '画像ファイル名' %>で画像を表示]
(https://qiita.com/sanstktkrsyhsk/items/8e8159f5c029a8e01333)
WSHでChakraを使う。(Windows10限定)

これ設定しとけば```cscript /E:Chakra```という指定でEDGEのChakraが使える。


```chakra.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Chakra]
@="Chakra Language"

[HKEY_CLASSES_ROOT\Chakra\CLSID]
@="{1b7cd997-e5ff-4932-a7a6-2a9e636da385}"

[HKEY_CLASSES_ROOT\JScript\OLEScript]jscriptvav
```