OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Railsことはじめ

> この記事は2017年10月に残したメモをベースにしています。自分用として

# Ruby on Railsことはじめ

仕事でRuby on Railsを扱うことになったので、環境をセットアップしました。<br>
会社のネットワークはProxyの内側にあるので、ちょっとしたつまづきがあったのでメモ。

## やったこと

* Windows 10での環境構築（Proxy環境下）

1. Rubyを入れる
1. Railsをセットアップする
1. Railsアプリ（社内ソース）を起動する

### Rubyを入れる

* まだソースが2.4系 [リンク](https://rubyinstaller.org/)
* MSYS2を入れるとき、pacmanてやつがproxyのせいでfailする
* [参考リンク](https://qiita.com/KTakata/items/1f30b8571764f7801708)

### Railsをセットアップする

* ソースコードをGit Cloneして起動

```bash
git clone {git-repo-url}
bundle install
bundle exec rake db:migrate
```

* 起動する前に、まず上記を実行することを学んだ

### RailsのサーバをLocalで起動する

```bash
rails s -p 3000
```

* 僕の環境では以下のエラーが出た

```bash
ExecJS::ProgramError TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。
```

* node.jsを入れると治るので実施

##### エディタ

* [Visual Studio Code](https://code.visualstudio.com/)を趣味で導入してみました
3 つ以上のテーブルの結合についてのメモ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/89ed6c5c-898f-5ded-6fc4-26bae1c00de4.png)

#こんなSQLテーマ
みなさん、こんなSQLの仕様書が来た時にどういうSQL組んでますか？
別に上から目線なわけじゃなくて僕が普段デザイナ使ってばっかりだったので手打ち環境(Oracle）になって
よくわかんなくなってたって言うだけの話
（Yahoo知恵袋に書けよって言われるような気もしてくるけどあくまで自分が疑問に思ったことを展開しておけばひょっとするとほかの人の役にも立つかもしれないねという意味でのメモ）←言い訳めいている

#最初はこう書いた

```sql:SQLメモ
SELECT A.HINBAN FROM ZAIKO AS A
    INNER JOIN HINBAN AS HIN ON A.HINBAN = HIN.HINBAN
    INNER JOIN HINBANLOC AS HINLOC ON A.HINBAN = HINLOC.HINBAN
    INNER JOIN M_LOCATION AS LOC ON HINLOC.LOC_CD = LOC.LOC_CD
```

#気になるところはここ
在庫テーブルとロケーションマスタに対する JOIN なのに、ON のところで品番ロケテーブルとロケーションマスタの、イコール条件を書いてしまっている。ちぐはぐだよね。

```sql:SQLメモ
SELECT A.HINBAN FROM ZAIKO AS A
    INNER JOIN M_LOCATION AS LOC ON HINLOC.LOC_CD = LOC.LOC_CD
```

#最終的には
こう書いたんだけど、まだ業務データが読めてないのもあって試行錯誤してた。
あってる、、、よね？(笑)
検索しても意外に出てこないのよね～こういうの
タイトル名は僕が検索したキーワードで書いた

```sql:SQLメモ
SELECT A.HINBAN, LOC.LOC_CD FROM ZAIKO AS A
    INNER JOIN HINBAN AS HIN ON A.HINBAN = HIN.HINBAN
    INNER JOIN (
        SELECT HINLOC.HINBAN FROM HINBANLOC AS HINLOC 
        INNER JOIN M_LOCATION AS LOC ON HINLOC.LOC_CD = LOC.LOC_CD
    ) AS LOC
```
XCode から gitHub のリポジトリを作成する


入門書を見ながら Swift アプリを作成している。せっかくなので gitHub にアップしようとしたら、やり方がわからず、試行錯誤した。

# 概要

1. アプリを作成（git 管理対象外）
2. git (ローカルリポジトリ）の管理対象にする
3. gitignore を作成する
4. gitHub リポジトリを作成し、push する

# 手順

## 1. アプリを作成

helloSwift という名前のアプリ。詳細は略。

![Kobito.767kq2.png](https://qiita-image-store.s3.amazonaws.com/0/27486/e4119b75-27a3-56e4-8a38-fd60c1fe279b.png "Kobito.767kq2.png")

リポジトリ管理対象外であります。
![Kobito.kDYn0q.png](https://qiita-image-store.s3.amazonaws.com/0/27486/ddc2d537-5166-4bae-6364-6b26e5df3b84.png "Kobito.kDYn0q.png")

フォルダも見ておく

```
$ ls -la
total 0
drwxr-xr-x@ 4 hoge  staff  128  3 28 21:05 .
drwxr-xr-x@ 7 hoge  staff  224  3 28 21:05 ..
drwxr-xr-x@ 7 hoge  staff  224  3 28 21:05 helloSwift
drwxr-xr-x@ 5 hoge  staff  160  3 28 21:05 helloSwift.xcodeproj
```


## 2. git (ローカルリポジトリ）の管理対象にする

「Source Control」-「Create Git Repositories...」
![Kobito.XmW6Fn.png](https://qiita-image-store.s3.amazonaws.com/0/27486/ebdcaeb4-4ca3-dd7c-f7ab-0e140242b0f8.png "Kobito.XmW6Fn.png")


git リポジトリを create する
![Kobito.N9RmcE.png](https://qiita-image-store.s3.amazonaws.com/0/27486/5d2463cf-98bd-3258-9faa-6c9683e145ac.png "Kobito.N9RmcE.png")

ローカルリポジトリに master ブランチが作成されている
![Kobito.cRe6Tj.png](https://qiita-image-store.s3.amazonaws.com/0/27486/6e31e5f0-7c3f-8d1e-e211-563213b5dc92.png "Kobito.cRe6Tj.png")

.git フォルダができている

```
$ ls -la
total 0
drwxr-xr-x@  5 hoge  staff  160  3 28 21:12 .
drwxr-xr-x@  7 hoge  staff  224  3 28 21:05 ..
drwxr-xr-x@ 12 hoge  staff  384  3 28 21:12 .git
drwxr-xr-x@  7 hoge  staff  224  3 28 21:05 helloSwift
drwxr-xr-x@  5 hoge  staff  160  3 28 21:05 helloSwift.xcodeproj
```

## 3. gitignore を作成する

プロジェクト直下に .gitignore を作成する

```
$ vi .gitignore
```

内容は[github/gitignore](https://github.com/github/gitignore/blob/master/Swift.gitignore)のを利用した。



## 4. gitHub リポジトリを作成して push する

### gitHub のアカウントを登録する。
メモしなかったけど、[こんな感じ](https://blog.kuromusubi.com/develop/environment/xcode/20171111-github)で登録できるっぽい。

### gitHub のリポジトリを作成する
XCode の SourceCodeNavigator より、gitHub のリポジトリを作成する

![Kobito.Qhot3m.png](https://qiita-image-store.s3.amazonaws.com/0/27486/ff3c0f91-8c46-efec-ecb8-b02088651a26.png "Kobito.Qhot3m.png")

リポジトリ名とか指定する
![Kobito.u9aSqw.png](https://qiita-image-store.s3.amazonaws.com/0/27486/2b087b4e-18d8-24b3-1964-e3ce6ce9a61d.png "Kobito.u9aSqw.png")

gitHub で確認！
![Kobito.ZXUMOt.png](https://qiita-image-store.s3.amazonaws.com/0/27486/c3443810-3a75-6322-1c24-218838d2c504.png "Kobito.ZXUMOt.png")
【メモメモ】z-indexを1202以上にするとChrome拡張のGoogle翻訳が見えなくなる

![Screenshot from 2018-03-28 21-21-32.png](https://qiita-image-store.s3.amazonaws.com/0/208363/c59ed9ed-b77a-2f5c-84be-72f5d47ece17.png)

![Screenshot from 2018-03-28 21-21-45.png](https://qiita-image-store.s3.amazonaws.com/0/208363/31c93519-2292-dd85-42b5-ddf2442841b0.png)
dockerをupdateしたらdocker-composeでコンテナが起動できなくなった。

## 普段使っているdockerを何気なくupdateしたら動かなくなった。

### 環境
- Windows 10 Pro
- Docker-CE Version 18.03.0-ce-win59 (16762)

### エラー

```powershell
> docker-compose.exe start
Traceback (most recent call last):
  File "docker-compose", line 6, in <module>
  File "compose\cli\main.py", line 71, in main
  File "compose\cli\main.py", line 124, in perform_command
  File "compose\cli\command.py", line 41, in project_from_options
  File "compose\cli\command.py", line 109, in get_project
  File "compose\config\config.py", line 283, in find
  File "compose\config\config.py", line 283, in <listcomp>
  File "compose\config\config.py", line 183, in from_filename
  File "compose\config\config.py", line 1434, in load_yaml
  File "site-packages\yaml\__init__.py", line 94, in safe_load
  File "site-packages\yaml\__init__.py", line 70, in load
  File "site-packages\yaml\loader.py", line 24, in __init__
  File "site-packages\yaml\reader.py", line 85, in __init__
  File "site-packages\yaml\reader.py", line 124, in determine_encoding
  File "site-packages\yaml\reader.py", line 178, in update_raw
UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 18: illegal multibyte sequence
[13176] Failed to execute script docker-compose
```


### やったこと

- 「Setting」→「Shared Drives」→Cドライブのチェックを外す→「Apply」
- 「Setting」→「Shared Drives」→Cドライブのチェックを入れる→「Apply」
- PC再起動
- Docker起動
- Docker Restart

・・・状況変わらず。

違う環境でdocker-compose.exe startしてみると

```powershell
UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 11: illegal multibyte sequence
[7880] Failed to execute script docker-compose
```

あれ？positionが違う！

UnicodeDecodeError？ cp932？ docker-compose？


### 対処

docker-compose.ymlの文字コードをutf-8からsjisに変更

コメントとか日本語で書いているとなるようです。(多分)


```yaml
# local環境
version: '2'
services:
  mysql:
・
・
・
```


※きちんと検証してはいません！
bootstrapのテンプレートをerb内にそのまま取り込む

bootstrapのテンプレートのフォルダの中身は
・css
・fonts
・img
・js
・index.html
のようになっていることが多い。index.htmlをそのままapplicatin.html.erbにそのまま取り込むと

```ruby:qiita.rb
<!DOCTYPE html>
<!--[if lt IE 7]>      <html lang="en" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html lang="en" class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html lang="en" class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en" class="no-js"> <!--<![endif]-->
    <head>
    	<!-- meta charec set -->
        <meta charset="utf-8">
		<!-- Always force latest IE rendering engine or request Chrome Frame -->
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<!-- Page Title -->
        <title>Themefisher.Free Bootstrap3 based HTML5 Templates</title>
		<!-- Meta Description -->
        <meta name="description" content="Blue One Page Creative HTML5 Template">
        <meta name="keywords" content="one page, single page, onepage, responsive, parallax, creative, business, html5, css3, css3 animation">
        <meta name="author" content="Muhammad Morshed">
		<!-- Mobile Specific Meta -->
        <meta name="viewport" content="width=device-width, initial-scale=1">

		<!-- Google Font -->

		<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700,800' rel='stylesheet' type='text/css'>

		<!-- CSS
		================================================== -->
		<!-- Fontawesome Icon font -->
        <link rel="stylesheet" href="css/font-awesome.min.css">
		<!-- Twitter Bootstrap css -->
        <link rel="stylesheet" href="css/bootstrap.min.css">
		<!-- jquery.fancybox  -->
        <link rel="stylesheet" href="css/jquery.fancybox.css">
		<!-- animate -->
        <link rel="stylesheet" href="css/animate.css">
		<!-- Main Stylesheet -->
        <link rel="stylesheet" href="css/main.css">
		<!-- media-queries -->
        <link rel="stylesheet" href="css/media-queries.css">

		<!-- Modernizer Script for old Browsers -->
        <script src="js/modernizr-2.6.2.min.js"></script>
```

こんな感じになっているが、このままでは読み込まれない。
（*どれが読み込まれていないの確認するには、該当ページより、「検証⇨network」より、404エラーが出ていないかを確認する）

まず、bootstrapのテンプレートのフォルダにあるcss,fontsはstylsheets以下に移動（app/assets/stylsheets/css）
jsはjavascripts以下に移動。（app/assets/javascripts/css）

そしてhead内の参照を以下のように変更。

詳しく[ここ](http://railsdoc.com/asset_pipeline)

例えば、

```ruby:qiita.rb
<link rel="stylesheet" href="css/media-queries.css">ではなく、
<link rel="stylesheet" href="/assets/css/media-queries.css">へ。


```

```ruby:qiita.rb

<script src="js/jquery-1.11.1.min.js"></script>ではなく、
<script src="/assets/js/jquery-1.11.1.min.js"></script>へ
```
Kotlin UDP ソケット通信

# はじめに
DatagramSocketを利用した、UDPの送受信プログラムを書いてみた。

## 送信

```kotlin:実装
fun send(host: String, port: Int, data: ByteArray, senderPort: Int = 0): Boolean {
    var ret = false
    var socket: DatagramSocket? = null
    try {
        socket = DatagramSocket(senderPort)
        val address = InetAddress.getByName(host)
        val packet = DatagramPacket(data, data.size, address, port)
        socket.send(packet)
        ret = true
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        socket?.close()
    }
    return ret
}
```

```kotlin:呼び出し元
val host = "localhost"
val port = 12345
val sendData = "hoge".toByteArray()

send(host, port, sendData)
```

## 受信

```kotlin:実装
fun receive(port: Int, size: Int): ByteArray {
    val ret = ByteArray(size)
    var socket: DatagramSocket? = null
    try {
        socket = DatagramSocket(port)
        val packet = DatagramPacket(ret, ret.size)
        socket.receive(packet)
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        socket?.close()
    }
    return ret
}
```

```kotlin:呼び出し元
val port = 54321
val bufferSize = 256

val receiveData = receive(port, bufferSize)
```
Swiftのクロージャによるジェネリック特殊化方法

# Array#mapの定義

```swift
public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
```

# 上記の`T`を特殊化させるクロージャ生成方法数パターン
ジェネリック関数を特殊化する方法は

* 引数からの型推論による特殊化
* 戻り値からの型推論による特殊化

参考：Swift実践入門

とあるが、ここでは

* クロージャによる戻り値からの型推論による特殊化
* クロージャによる戻り値からの明示的特殊化

を記載してみる。

```swift
let a = [1, 2]

// 受け取る値に名前を付ける方法
let b = a.map { hoge in
    hoge * 2 // 型推論でIntとわかる
}

// 受け取る値に名前を付けて、返り値の型も書く方法（ここまで書くのは冗長な場面が多いはず）
let c = a.map { hoge -> Int in // 明示的にIntとわかる
    hoge * 2
}

// 受け取る値に名前を付けない方法
let d = a.map { $0 * 2 }  // 型推論でIntとわかる

// 好ましいかどうかは別として、こういうこともできる... 
let e = a.map { hoge -> Void in }     //=> [(), ()]     明示的にVoidとわかる
let f = a.map { hoge -> Double in 1 } //=> [1.0, 1.0]   明示的にDoubleとわかる
```
pythonでクリップボードの監視をしてチェックをする

windowsである一覧の一部の項目が指定のリストに一致するか確認する作業があり作りました。
そもそも全て自動化すれば良いとは思いますが、微妙な作業量だったのでクリップボードの確認を行い指定の項目をコピーした時にチェックするスクリプトで済ませました。

下記のような指定のリストを作ります。

```txt:memo
aaa
bbb
ccc
...
```

メインスクリプトです。実行中は上記の「memo」にない項目が「memo2」というファイルにに追加されます。
スクリプトではwinsoundで音も鳴るようにしています。

```py3:clip.py
#! /usr/bin/env python
# coding=utf-8

import time
import pyperclip
import winsound

# 登録済みワードの一覧ファイル
list_file = 'memo'
# 未登録ワードの登録用ファイル
output_file = 'memo2'

def check_text(tmp_string,text_list):
    check_flg = False
    for i in text_list:
        if tmp_string == i:
            check_flg = True
    if check_flg:
        print(u"登録済み")
    else:
        print(u'未登録')
        winsound.PlaySound("SystemAsterisk", winsound.SND_ALIAS)
        f = open(output_file,'a')
        f.write(tmp_string.encode('utf-8'))
        f.write('\n')
        f.close()

if __name__ == '__main__':
    clip_tmp = pyperclip.paste()
    f = open(list_file,'r')
    text_list = []
    for i in f:
        text_list.append(i.strip())
    f.close()
    print(u'準備完了')
    while True:
        if clip_tmp == pyperclip.paste():
            pass
        else:
            clip_tmp = pyperclip.paste()
            check_text(clip_tmp, text_list)
        time.sleep(0.3)
```

上記のスクリプトでは重複チェックをしてなかったので「memo2」が出来たら
下記のチェックスクリプトで重複を削除したmemo3というリストを作ります。

```py:unique.py
#! /usr/bin/env python
# coding=utf-8

input_file = "memo2"
output_file = "memo3"

if __name__ == '__main__':
    input_f = open(input_file,"r")
    tmp_list = []
    for  i in input_f:
        flg = False
        for j in tmp_list:
            if j ==  i:
                flg = True
        if flg:
            pass
        else:
            tmp_list.append(i)
            out_f = open(output_file, 'a')
            out_f.write(i)
            out_f.close()

    input_f.close()
```

他に良い方法があった気がしてあとになって調べたのですが`sorted(set(list), key=list.index)`を採用した方が良かったですね、、、

```py:unique.py
#! /usr/bin/env python
# coding=utf-8

input_file = "memo2"
output_file = "memo3"

if __name__ == '__main__':
    input_f = open(input_file,"r")
    input_list = []

    for i in input_f:
        input_list.append(i)

    unique_list = sorted(set(input_list), key=input_list.index)
    out_f = open(output_file, 'a')

    for i in unique_list:
        out_f.write(i)

    out_f.close()
```


ホントはpyperclipとかwinsoundってそんなに使う機会無さそうだから使ってみたかっただけだったり
EC2インスタンスのディスクを拡張する

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/storage_expand_partition.html

ボリュームをデタッチしてスナップショットを作成。

スナップショットからサイズを拡張したボリュームを作成。

他のインスタンスに作成したボリュームをアタッチ。

ボリュームのパーティションの終了位置を変更。

```
$ lsblk
$ sudo parted /dev/xvdf
(parted) unit s
(parted) print
(parted) rm 1
(parted) mkpart
パーティションの種類?  primary/プライマリ/extended/拡張? primary
ファイルシステムの種類?  [ext2]? ext3
開始? 16065s
終了? 100%
警告: The resulting partition is not properly aligned for best performance.
無視(I)/Ignore/取消(C)/Cancel? I
(parted) set 1 boot on
(parted) print
(parted) quit
$ lsblk
```

ボリュームをデタッチして元のインスタンスのルートデバイス(/dev/sda1など)にアタッチしてファイルシステムのサイズを変更

```
$ sudo resize2fs /dev/xvda1
```
pythonのクラス変数に外部関数を使うとTypeError:(省略) but 1 was givenになる問題を考える

# 変更前タイトル：pythonのクラス変数に外部関数を使うときにTypeError: [function name]() takes 0 positional arguments but 1 was givenとエラーになってしまう問題を考える
タイトルが長いですが、言いたい事はそのままです。

## 問題

``` question.py
def outer():
    return 'outer'

class inner():
    function = outer
    def call_outer_function(self):
        print(self.function())

inner().function()
```

これを実施すると、タイトルの通りエラーになります。

## 解決

``` answer.py
def outer():
    return 'outer'

class inner():
    function = lambda self:outer()
    def call_outer_function(self):
        print(self.function())

inner().function()
```

クラス内でメソッドを使う場合、暗示的にselfが渡されます。
selfを捨てることで解決させようという発想です。

### 展開
lambda式で書いているので分かりにくいんですが、要するにこういう事をやってます。


``` answer.py
def outer():
    return 'outer'

class inner():
    def function(self):
        outer()

    def call_outer_function(self):
        print(self.function())

inner().function()
```

こちらはよく見る形だと思います。

## 実例
`def outer(input)`
を作っていて、クラス内から呼び出した時に`if isinstance(input,
 '期待するobject')`をやらなかったせいで、この関数ではエラーにならず通ってしまい、別の場所で問題になった時に追いかけるのにやたらと時間が掛かりました。
可能であれば引数をバリデーションする癖をつけておきましょう。
たったこれだけの事なんですが、えらい目に遭いました。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
[Docker]不要なimage,containerを一斉削除する

Dockerでいろいろ検証しているうちに、いつのまにかimageやcontainerが大変なことになっているときがよくある。

僕がよくやらかすのは、名前をつけずにbuildしたり、エラーやそのほかの理由で停止したcontainerをそのままにしていると、どんどん増加していく。
`<none>`と付くimageだけを消したいが、消すためには該当のimageが使われているcontainerも消す必要があるので、それらをまとめて消すためのTips.

追記 
[`docker system prune`](https://docs.docker.com/engine/reference/commandline/system_prune/)コマンドで、使用されていないcontainer, network, image, volumeなどを削除することができるようです。便利！
volumeの削除は17.06.1から追加されており、`--volumes`を付けない限りvolumeが削除されることはないようです。

### 1．【確認用】ステータスがExitedのcontainer IDを全て出力する
`# docker ps -q --filter status=exited`

別解 同じ結果だけどawkコマンドでごり押し
`# docker ps -a | grep Exited | awk '{print $1}'`

ここに表示されるIDを持つcontainerを今からすべて削除する。


### 2. Exitedのcontainer をすべて終了
`# docker rm $(docker ps -q --filter status=exited)`

### 3. image名noneのimageをすべて削除
`# docker rmi $(docker images | grep none | awk '{print $3}')`

これでさっぱりする。
まだDockerは勉強中なので、もっといい方法があるのかもしれない。
vimでNginx設定ファイルのシンタックスハイライト


- https://github.com/chr4/nginx.vim というのがあったので、それが使えました。自分の場合は `NeoBundle` を使っているので、`.vimrc`に書いてインストール。

```
NeoBundle 'chr4/nginx.vim'
```

nginxの設定ファイルは `hogehoge.conf`だったりしてnginx特有の拡張子ではないので、nginxの設定ファイルを編集する場合は毎回vimで以下を叩いています。

```
:set syntax=nginx
```
正規表現を使って連続して出てくる部分文字列をひとつにする

ある連続して出てくる部分文字列をひとつにしたい
例えば、以下のような文字列があったとき。
「お願いがあるんだけど……友人代表のスピーチ、やってくれないかな？」\<EOS>\<EOS>
これを:point_down_tone1::point_down_tone1::point_down_tone1:にしたい
「お願いがあるんだけど……友人代表のスピーチ、やってくれないかな？」\<EOS>
繰り返しでてくる\<EOS>をひとつにするには
`re.sub("(?<=部分文字列)部分文字列", "", 文字列)`

```python:
import re

sample = "「お願いがあるんだけど……友人代表のスピーチ、やってくれないかな？」<EOS><EOS>"
result = re.sub("(?<=<EOS>)<EOS>", "", sample)
print(result)
# 結果
#「お願いがあるんだけど……友人代表のスピーチ、やってくれないかな？」<EOS>
```

他の例

```python:
sample = "「お願いがあるんだけど……友人代表のスピーチ、やってくれないかな？」<EOS><EOS><EOS>"
result = re.sub("(?<=<EOS>)<EOS>", "", sample)
print(result)
# 結果
#「お願いがあるんだけど……友人代表のスピーチ、やってくれないかな？」<EOS>

sample = "「お願いがあるんだけど……友人代表のスピーチ、<EOS><EOS>やってくれないかな？」<EOS><EOS><EOS>"
result = re.sub("(?<=<EOS>)<EOS>", "", sample)
print(result)
# 結果
#「お願いがあるんだけど……友人代表のスピーチ、<EOS>やってくれないかな？」<EOS>
```

# コメントより
```python:
sample = "「お願いがあるんだけど……友人代表のスピーチ<EOS><EOS>、やってくれないかな？」<EOS><EOS>"
result = re.sub("(<EOS>)+", "<EOS>", sample)
print(result)
# 結果
#「お願いがあるんだけど……友人代表のスピーチ<EOS>、やってくれないかな？」<EOS>
```
droneの導入にハマった

# droneとは
有象無象のCIツールのひとつです。

他ツール（CircleCI/Wercker）との違いはオンプレミスでも使えるOSS版が公開されているところです。

Dockerを使ったCIサーバ「Drone」レビュー
https://knowledge.sakura.ad.jp/2729/

k8sとのCI連携では選択肢の一つかと思い導入しようとしてみましたが、些細なところで躓いたので備忘録として。

# ハマり１．sqliteデータが作られない
公式のdocker-composeをそのまま使うと、以下のエラーとなりました。
http://readme.drone.io/admin/installation-guide/

```
drone-server_1  | time="2017-11-07T13:14:22Z" level=error msg="unable to open database file"
drone-server_1  | time="2017-11-07T13:14:22Z" level=fatal msg="database ping attempts failed"
```

droneは/var/lib/drone配下にdrone.sqliteを作るようですが、権限の問題か作れませんでした。
Jenkinsでも似たような問題がありますが、ホストボリュームではなく、dockerボリュームにすると上手くいきます。

# ハマり２．GitHubからのwebhookが来ない

これはdroneというよりもAWSの問題で、GitHubからのwebhookはセキュリティグループを解放してあげる必要があります。
オンプレミスでdroneを利用するときには、自前のGitHub EnterpriseやGitLabがあると思うので、レアケースかと。

GitHubのHookのIPアドレスは以下のhookより。

GitHubの外向けIPアドレス
https://qiita.com/hoyo/items/5950d5f70ba52335dcd2

# ハマり３．docker-agentがpermmision denyになる

webhookが通じるようになりましたが、次は以下のエラー。

```
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/volumes/create: dial unix /var/run/docker.sock: connect: permission denied
```

agentにdocker.sockを動かす権限がないため、permission denyになってしまいました。
rootユーザの権限を与えるか、dockerグループに入れたユーザで起動する必要があります。

今回は取り急ぎ特権ユーザを付与しました。

# 結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/237745/edb72026-6d7c-bac6-a0f3-4a59a394a5e5.png)

できました。
Jenkinsよりもdockerを利用したビルドの初動が早いですね。

今回利用したdocker-compose

```docker-compose.yaml
version: '2'

services:
  drone-server:
    image: drone/drone:0.8

    ports:
      - 80:8000
      - 9000
    restart: always
    volumes:
      - /var/lib/drone
    environment:
      - DEBUG=true
      - DRONE_OPEN=true
      - DRONE_HOST=http://XXX.XXX.XXX.XXX
      - DRONE_GITHUB=true
      - DRONE_GITHUB_CLIENT=XXXX # GitHubのOAuth Appsの設定より
      - DRONE_GITHUB_SECRET=XXXX # GitHubのOAuth Appsの設定より
      - DRONE_SECRET=XXXXX # 任意のパスワード
  drone-agent:
    image: drone/agent:0.8
    command: agent
    restart: always
    privileged: true
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=drone-server:9000
      - DRONE_SECRET=XXXXX # 任意のパスワード
```

# おわりに
devopsではCI/CD、運用の自動化、セキュリティは必須だと改めて感じる今日この頃です。
datetimeで計算したときの値の取り出し方

# datetime.now()を使用したときに秒の値だけを取り出す方法

```python

from datetime import datetime
n = datetime.now() # datetime.datetime(2018, 3, 28, 18, 2, 31, 658000)
print n.second # 31
```

# 時間差を計算したいとき
```python
from datetime import datetime

n = datetime.now() # datetime.datetime(2018, 3, 28, 18, 29, 19, 71000)
p = datetime.strptime('2018-03-28 18:30:05', '%Y-%m-%d %H:%M:%S')
t = p - n 
print t # datetime.timedelta(0, 45, 929000)

```

計算した時間から秒の値だけを取り出したいときには

```python

print t.second
```

するとこのようなエラーが…

```
AttributeError: 'datetime.timedelta' object has no attribute 'second
```
あるぇー

# 計算した場合はこうやって取り出すのだそう

```python

print t.seconds # 45
```

# 参考

[datetime型で日時の引き算](https://python.dogrow.net/blog46/)
SwiftのGraphQLClient Apolloを使う

めっちゃメモ感あってすみません。

# apolloを入れる
Carthageでいれる。Apollo.frameworkができるので、Projectに取り込む。

```bash
echo github \"apollostack/apollo-ios\" > Cartfile
carthage update --platform iOS
```

# apollo-codegenでSwiftコードを生成する
後々説明するが、自分でapollo-codegenコマンドを叩きたい。
ここで注意したいのが、Apolloは`Apollo.framework`と`apollo-codegen`のバージョンの一致性が非常に重要らしく、組み合わせが悪いと生成されたSwiftコードのビルドが全然通らない（実際通らなかった）。
2018/03/28現在だと、普通に`carthage update`や`npm install`をすると、Apollo.frameworkはv0.8.0、apollo-codegenはv0.19.0が入る。
ただ、Apollo.frameworkにあったapollo-codegenのバージョンはv0.18系みたいで、動かなくて苦しんだ。

では、最適なバージョンはどこで知るんだという話だが、ざっと見た感じ公式サイトには書いてなかった。
あさってみたところ、[BuildPhasesに設定する話](https://www.apollographql.com/docs/ios/installation.html#adding-build-step)が公式サイトには載ってて、
ここではshellでバージョンチェックをしているらしい。このshellは`Apollo.framework/check-and-run-apollo-codegen.sh`にあって、この中を読んでみると、1行目にこんなことが書いてあった。見つけた。

```bash
REQUIRED_APOLLO_CODEGEN_VERSION=0.18
```

このバージョンが必要らしい。ということで下記コマンドでapollo-codegenをインストール。

[https://github.com/apollographql/apollo-codegen](https://github.com/apollographql/apollo-codegen)

```bash
$ npm info apollo-codegen # 0.18系で一番新しいバージョンを探す
$ npm i -g apollo-codegen@0.18.8
```

なんかいい感じにバージョン管理できるようにしたほうがいいな。apollo-codegenはglobalに入れるんじゃなくてちゃんとprojectのなかでpackage.jsonつかって管理しつつ、.framework内のバージョンと合わせる。最後が厄介だがとりあえず手運用でいっか。

## schema.jsonの生成
叩きたいGraphQL APIからSchemaファイルを取得する。下記コマンドを叩く。

```bash
$ apollo-codegen introspect-schema [HOST]/graphql --output schema.json
```

ただ、HOSTがhttpsでオレオレ証明書を使っている場合（開発環境とか）は`error: Error while fetching introspection query result: request to https://oreore.com/graphql failed, reason: unable to verify the first certificate`と怒られる。なので、--insecureオプションをつける。

```bash
$ apollo-codegen introspect-schema https://oreore.com/graphql --output schema.json --insecure
```

## Swiftコードの生成
`.graphql`ファイルを作る。拡張子はなんでも良さそう。これには`query`や`mutation`を書く。Xcodeのプロジェクト内においちゃったほうがまとめて管理できてよさそうなので、一旦`./GraphQL/`に置くことにする。

書いた`.graphql`ファイルをもとに、swiftコードをgenerateする。公式サイトにはBuildPhasesに書くように指定されているが、人によって利用しているTerminalの環境が違いすぎるので自分でコマンドを叩く。公式には下記が書いてあるが、これは適用範囲が広すぎてよろしくない。

```bash
$ apollo-codegen generate **/*.graphql --schema schema.json --output API.swift
```

こんな感じで範囲を絞るといい感じかもしれない。

```bash
$ apollo-codegen generate GraphQL/*.graphql --schema schema.json --output API.swift
```

# 実際に叩く
```swift
let url = URL(string: "YOUR URL")!
let client = ApolloClient(url: url)

client.perform(mutation: [上で作ったClass]) { result, error in
    // result.data.[上で作ったclass名のキャメルケース？]
}
```

# 参考
- [SwiftでGraphQL入門 & Apolloを試す](https://qiita.com/shingt/items/ed65c654eb5532eeeda8#graphql%E3%82%92%E5%AE%9F%E9%9A%9B%E3%81%AB%E8%A9%A6%E3%81%99)
- [公式のInstallation](https://www.apollographql.com/docs/ios/installation.html)
とにかくすぐにHaskellを動かしたい人のためのHaskellインストール方法

前々から気になっていた関数型言語だが、[なぜHaskellを学ぶと良いか](https://qiita.com/arowM/items/0305d4f439752f285438)に触発されて、ついさっき[すごいH本](https://www.amazon.co.jp/すごいHaskellたのしく学ぼう！-ＭｉｒａｎＬｉｐｏｖａｃａ-ebook/dp/B009RO80XY)を買ってしまった人です。

とりあえずMacにHaskellインストールしようとググってみたら、GHCやらstackやら色々出てきたのですが、とりあえず以下のコマンド実行しとけば本の最初の例を実行することはできました。

```
$ brew cask install haskell-platform
```

本の最初の例。

```
$ ghci
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Prelude> 2 + 15
17
Prelude> 49 * 100
4900
Prelude> 1892 - 1472
420
Prelude> 5 / 2
2.5
```

これからHaskell勉強していきます！
Vimをアップデートしたらdenite.nvimが動かなくなった

#環境

Custom Version 8.0.1420 (KaoriYa 20171221)

#現象
Custom Version 8.0.1633 (KaoriYa 20180324)
にアップデートしたらpython3が無いよーって言われます。

#解決方法

homebrewでpython3を入れ直したら直りました。

homebrewでpython3をインストールした時の置き場所が変わったようです。
https://brew.sh/2018/01/19/homebrew-1.5.0/

旧
```/usr/local/Cellar/python3```

新
```/usr/local/Cellar/python```

ちょっとわかりませんが、今回のアップデートはこれに対応したのかな？
C#でエクセルにオートフィルターを設定しようとするとエラーになる

## 課題
エクセルの列数が変動するため、C# + VSTO で動的にオートフィルターの適用範囲を変更しようとしてはまりました。

```c#
Excel.Range A1 = Cells[1, 1];
if (AutoFilterMode)
    A1.AutoFilter();

A1.AutoFilter();
```
というコードを実行すると、

```
RangeクラスのAutoFilterメソッドが失敗しました。
```

という例外が発生します。

### 環境
|アセンブリ| Version|
|----|----|
| C# | 4.0.0.0 |
| Microsoft.Office.Tools | 10.0.0.0 |

## 解決
型を **Excel.Range** ではなく **dynamic** でとるとうまくいきました。 

```c#
dynamic A1 = Cells[1, 1];
if (AutoFilterMode)
    A1.AutoFilter();

A1.AutoFilter();
```

## 参考
[C# と VB.NET の質問掲示板](http://bbs.wankuma.com/) / [Excelにフィルターを設定する方法](http://bbs.wankuma.com/index.cgi?mode=al2&namber=74310&KLOG=125)

## 余談
解決はしましたが、原因というか、なぜこれでうまくいくのかの理屈がわからない。
[MSDN](https://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.range.autofilter.aspx)みる限り、Rangeのメソッドだと思うんですが…？
data.frameの高速演算には列ごとならlapply、行ごとならReduceを使おう

Rに少し慣れると、計算速度を早くしたいと感じるのはよくあることです。
Rを使っていてよく扱うのは行列状のデータです(matrixやdata.frame)

#matrixの場合

よく言われるのは
行列用の関数 $\geq$ apply $\geq$ for
です([参考](http://www.anlyznews.com/2012/02/r_11.html))。

##matrixを列ごとに演算

```
library(microbenchmark) # ベンチマークようのパッケージ
set.seed(123) # 乱数を固定
x <- matrix(runif(10000), 100, 100) # テストデータの生成
plot(microbenchmark( #ベンチマークとその結果のプロット
  colSums = colSums(x),
  apply = apply(x, 2, sum),
  "for" = {
      y <- numeric(nrow(x))
      for(i in 1:ncol(x)) y <- y + x[, i]
      y
  }
), xlab = '', ylab = 'nano sec', log = 'y') #y軸は対数に
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/df45cd20-445b-8aea-118a-15a4d337fddc.png)

ケタで違いますね。

#data.frameの場合

##data.frameを列ごとに演算

基本的に傾向は同じです。

```{r}
x2 <- as.data.frame(x) #先のテストデータをdata.frameに変換
plot(microbenchmark( #先のコードのxをx2に書き換えただけ
  colSums = colSums(x2),
  apply = apply(x2, 2, sum),
  "for" = {
      y <- numeric(nrow(x2))
      for(i in 1:ncol(x)) y <- y + x2[, i]
      y
  }
), xlab = '', ylab = 'nano sec', log = 'y')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/9a7b2e9a-db5b-7473-3674-89569638d8bf.png)

しかし、forを用いた場合を除きケタで遅くなっているのが気になります。
これはcolSumsやapplyがmatrix(厳密にはapplyはarray)に特化しているため、内部でdata.frameを一度matrixに変換しており、変換に時間がかかっているようです。
では変換を介さない、計算を行えば速くなるのではないでしょうか。

data.frameの実態はリストです。
リストに使うapply族と言えば、lapplyです。

```{r}
x2 <- as.data.frame(x) #先のテストデータをdata.frameに変換
plot(microbenchmark( # lapplyを追加
  lapply = unlist(lapply(x2, sum)), #unlistにより他と結果を揃える
  colSums = colSums(x2),
  apply = apply(x2, 2, sum),
  "for" = {
      y <- numeric(nrow(x2))
      for(i in 1:ncol(x2)) y <- y + x2[, i]
      y
  }
), xlab = '', ylab = 'nano sec', log = 'y')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/e6422ee8-eeb4-f9da-3b3e-2bf6d889e049.png)


lapplyが群を抜いて速い！！

## data.frameを行ごとに計算

行ごとに計算する場合はどうしたらいいでしょうか？
applyの場合は第二引数で、行方向の演算か列方向の演算か指定できますが、lapplyではそうは行きません。
代わってReduceを用います。

```r
plot(microbenchmark(
  Reduce = Reduce(`+`, x2),
  rowSums = rowSums(x2),
  apply = apply(x2, 1, sum),
  "for" = {
      y <- numeric(ncol(x2))
      for(i in 1:nrow(x2)) y <- y + x2[, i]
      y
  }
), xlab = '', ylab = 'nano sec', log = 'y')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149890/08a286d0-9b90-992e-ff15-f40a904cabfb.png)

# まとめ

演算には扱っているデータごとに最適な形があることを意識して、
data.frameの高速演算には列ごとならlapply、行ごとならReduceを使いましょう。

# sessionInfo(一部)

R version 3.4.4 (2018-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint 18.3

Matrix products: default
BLAS: /usr/lib/openblas-base/libblas.so.3
LAPACK: /usr/lib/libopenblasp-r0.2.18.so
EC2でNATインスタンスを作成する

NAT GatewayよりNATインスタンスの方が安いのでステージング環境ではこちらを使います。

1. amzn-ami-vpc-natでAMIを検索
2. 最新のAMIからNATインスタンスをpublic subnetに作成
3. NATインスタンスにElastic IPを設定
4. NATインスタンスの送信元/送信先の変更チェックを無効化
5. NATインスタンスのセキュリティグループを設定
6. private subnetのrouting tableの0.0.0.0/0にNATインスタンスを設定
javaFXのCanvasで破線を引く時の注意点

#破線の引き方
javaFXの[Canvas](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/canvas/Canvas.html)上で破線を引きたいときは、Canvasから取ってきた[GraphicsContext](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/canvas/GraphicsContext.html)クラスの[setLineDashes](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#setLineDashes-double...-)メソッドで
破線の線を引く部分と引かない部分の長さを交互に与えればいい。
例えば1,3,2,1と設定した場合
（ーが引かれている場所、␣が引かれてない場所）
ー␣␣␣ーー␣ー␣␣␣ーー␣......
となる。
奇数を設定した場合その数列同士を2こつなぎ合わせたものを設定した扱いになる。
1,3,2と設定した場合
ー␣␣␣ーー␣ーーー␣␣ー␣␣␣ーー␣ーーー␣␣......
となる。

[setLineDashOffset](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#setLineDashOffset-double-)を設定すると線の開始地点がその分だけずれる。
たとえば破線を4,2と設定した状態通常は
ーーーー␣␣ーーーー␣␣......
だが、オフセットを2にすると
ーー␣␣ーーーー␣␣ーーーー␣␣......
となる。
マイナスにすると逆側にずれる。
#注意点
ここからが注意点だが、線の太さ([LineWidh](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#setLineWidth-double-))より小さい破線の空白部分は潰れて消えてしまう。
なぜかというと、線を描画するときに[デフォルト](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/shape/StrokeLineCap.html#SQUARE)では
(■が太さ1で描かれた線、ロが太さ5で描かれた線)

ロロロロロロロロロロ
ロロロロロロロロロロ
ロロ■■■■■■■ロロ
ロロロロロロロロロロ
ロロロロロロロロロロ

のように太さの半分だけ線が延長される。これが破線の端でも起こるので、太さ5だと長さ5以下の空白部分は線に潰されて消えてしまう。

これを解決するには、[setLineCap](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#setLineCap-javafx.scene.shape.StrokeLineCap-)で[BUTT](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/shape/StrokeLineCap.html#BUTT)を指定すればいい。
これを設定すると線を描画するときに
ロロロロロロ
ロロロロロロ
■■■■■■■
ロロロロロロ
ロロロロロロ
のように延長されずに描画されるので空白が潰されなくなる。
setLineCapで指定できる属性とその内容は[StrokeLineCapのjavadoc](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/shape/StrokeLineCap.html)の図がとてもわかりやすい。

以上。
分報をSlackにCLIで投稿する時に半角スペースを含めて投稿するには？


[分報をSlackにCLIで投稿する
](https://qiita.com/artifactsauce/items/cf149915f6fdacc5e893)

こちらの記事を参考にすると、なんとslackの固定のチャンネルにターミナルから簡単に投稿できるようになります。とても便利ですね！

`slack 投稿テストだよー。` とターミナルに入力すると、 
slack には `投稿テストだよー。` と投稿されます。

ただし、以下の様に半角スペースが入ると、半角以降の文字が処理されず投稿されません。
`slack 投稿テストだよー。 これは投稿されるかな？`
slack には `投稿テストだよー。` とだけ投稿されちゃいます。

というわけでスクリプトを以下のようにちょっと直して、半角スペースを入れてもそのまま投稿できるようにしました。


```bash
#!/usr/bin/env bash

set -eu

: ${POST_CHANNEL:="channnel_you_want_to_post"}

if [[ $# -eq 0 ]]; then
    echo "[ERROR] Nothing has been entered." >&2
    exit 1
fi

echo -e $@ | slackcat --channel $POST_CHANNEL --stream

```
RxJavaでNoSuchElementExceptionに苦しめられた話

FlowableやMaybeからSingleにつなぐ時にflatMapSingle()を使っていると、NoSuchElementExceptionが発生する事がある。

Completeが流れる可能性のあるストリームにSingleをつなぐとき、実際にCompleteが流れてしまうとSingleで処理できずに例外が飛び、そのままアプリがお亡くなりになる。
普通にFlowableにSingleにつなぐぶんにはRxJavaがよしなにやってくれたりするのだけど。
そもそもCompletableにはSingleつなげなかったりするしね。
でも、flatMapSingle()はお構いなしにつないでしまうので、代わりにflatMapSingleElement()を使う必要がある。
コンパイルエラーもエラーログもIDEの警告もなんも出ないけど、おかしなことをやっていることを我々は自覚できないといけない。


## 余談

非同期処理をflatMapでつないでつないでつないで行く処理を書いていると、Rxが非同期処理のモナドだなあと感じられて関数型完全に理解した気になれるメリットがあるよね
逆にflatMapとかandThenとかを使っていくことで、そっちを手がかりにモナドを理解できるようになったりしないかな…したらいいな…
EmacsからFinderを開く方法

Emacsを使っていると，編集しているfileのdirectoryをFinder上に表示したいときがあります．
そんな時用のTipsです．

# shell-commandを使おう
Emacsには`shell-command`という便利な関数があります．
これは引数に文字列を取り，shell上で実行してくれる関数です．

```
M-x shell-command RET "open ."
```
これでshell上で`open .`と入力した時と同じ結果が得られます．

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/1b290944-c442-bb9c-25d1-b5a818d795d0.gif)

# 自分で関数を定義しよう
いちいち`M-x shell-command`などするのは面倒ですので，これを1つのユーザ定義関数にしましょう．

```elisp
;; current directory open
(defun finder-current-dir-open()
  (interactive)
  (shell-command "open ."))

;; directory open
(defun finder-open(dirname)
  (interactive "DDirectoryName:")
  (shell-command (concat "open " dirname)))

;; set the keybind
(global-set-key (kbd "M-f") 'finder-current-dir-open)
```

これで`M-f`と入力するだけで，現在のdirectoryがFinderで開けます．

# 補足1 : `interactive`とは？
```elisp
(defun finder-current-dir-open()
  (interactive) <---- これ！！
  (shell-command "open ."))
```
ここに書いてある`interactive`の意味についてちょっとだけ補足します．

定義した関数の中（今回だったら`finder-current-dir-open`）に`interactive`と記述することによって，`M-x`でその関数を呼び出すことができます．
（なので，もし上記の関数に`interactive`が記述されていないと，`M-x`しても関数を呼べません）

# 補足2 : `interactive "D"`とは？
```elisp
(defun finder-open(dirname)
  (interactive "DDirectoryName:") <---- これ！
  (shell-command (concat "open " dirname)))
```

ここでは`interactive "D"`ではなく`DDirectoryName:`となっていますが，最初の文字"D"以降はMinibufferに表示される文字なので無視して問題ないです．

<img width="379" alt="Screen Shot 2018-03-28 at 17.35.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/73b438bb-5e2f-ff2f-fb9d-97ec16400cb2.png">

さて，ここで言う"D"とは，DirectoryのDですね．
そして"D"が記述されることで，EmacsはdirectoryのリストをMinibufferに表示してくれます．
その後，開きたいdirectoryを入力することで，Finder上でopenできます．

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/6b27d2f3-624b-246e-4eef-133c49b92afb.gif)

---

その他にも`interactive "P"`とか`interactive "n"`とかあります．
詳しくは[こちら](https://www.gnu.org/software/emacs/manual/html_node/elisp/Interactive-Codes.html)を参考ください！

# 参考
[Emacsでマイナーモードを定義してみたり、 M-x で動くインタラクティブ関数を定義してみたりする](http://yoshiki-utakata.hatenablog.com/entry/2017/12/18/100000)
[Emacs Interactive Codes](https://www.gnu.org/software/emacs/manual/html_node/elisp/Interactive-Codes.html)
2点を交わる直線2組が交わる交点

$(x_1,y_1)$と$(x_2,y_2)$、$(x_3,y_3)$と$(x_4,y_4)$それぞれを通る直線を求め、それら2つの直線が交わる交点を求める。

点と直線の公式によると、$(x_1,y_1)$と$(x_2,y_2)$を通る直線は


```math
\begin{eqnarray}
y-y_{1}&=&\frac{y_{2}-y_{1}}{x_{2}-x_{1}}\left(x-x_{1}\right)\\
y & =&\frac{y_{2}-y_{1}}{x_{2}-x_{1}}\left(x-x_{1}\right)+y_{1}\\
  &=&\frac{y_{2}-y_{1}}{x_{2}-x_{1}}x+\left(y_{1}-\frac{y_{2}-y_{1}}{x_{2}-x_{1}}x_{1}\right)
\end{eqnarray}
```

同様に、$(x_3,y_3)$と$(x_4,y_4)$を通る直線は

```math
\begin{eqnarray}
y=\frac{y_{4}-y_{3}}{x_{4}-x_{3}}x+\left(y_{3}-\frac{y_{4}-y_{3}}{x_{4}-x_{3}}x_{3}\right)
\end{eqnarray}
```

同様に2本の直線$y=ax+b$と$y=cx+d$は$a\neq c$のとき交点を一つ持つ。その座標は、連立方程式を求めると、
$x$に関しては

```math
\begin{eqnarray}
ax+b&=&cx+d\\
\left(a-c\right)x&=&d-b\\
x&=&\frac{d-b}{a-c}
\end{eqnarray}
```

$y$に関しては

```math
\begin{eqnarray}
y	&=&	a\frac{d-b}{a-c}+b\\
	&=&	\frac{a\left(d-b\right)+b\left(a-c\right)}{a-c}\\
	&=&	\frac{ad-ab+ab-bc}{a-c}\\
	&=&	\frac{ad-bc}{a-c}\\
 
\end{eqnarray}
```

従って、

```math
\left(\frac{d-b}{a-c},\frac{ad-bc}{a-c}\right)
```
である。

例として、

```math
\begin{eqnarray}
(x_1,y_1)&=&(4,11),\\
(x_2,y_2)&=&(2,7),\\
(x_3,y_3)&=&(3,11),\\
(x_4,y_4)&=&(1,1).
\end{eqnarray}
```
とし、以下のスクリプトにより交点を求める。

```python
from numpy import *
p1 = array([4, 11])
p2 = array([2, 7])

p3 = array([3, 11])
p4 = array([1, 1])

def getIntersection(p1, p2, p3, p4):
    a = (p2[1] - p1[1]) / (p2[0] - p1[0])
    b = p1[1] - a * p1[0] 
    
    c = (p4[1] - p3[1]) / (p4[0] - p3[0])
    d = p3[1] - c * p3[0] 
    
    print("a={:.2f}, b={:.2f}, c={:.2f}, d={:.2f}".format(a, b, c, d))

    return (d-b)/(a-c), (a*d-b*c)/(a-c)

print("intersec. point is ({:.4f},{:.4f})".format(*getIntersection(p1,p2,p3,p4)))
```

結果:

```
a=2.00, b=3.00, c=5.00, d=-4.00
intersec. point is (2.3333,7.6667)
```

となり、$y=2x+3$と$y=5x-4$の交点は$(2.3333,7.6667)$であることが分かる。
RubyとJavaScriptの書き方を比較する

元々JavaScriptプログラマーだったのですが、今年からRubyでプログラミングすることになりました。凡そ２ヶ月経ってましたので、Rubyの書き方はJavaScript(ES6以降）とよく似てるところや微妙な違いがあるところなどを纏めようかなと思います。

## 変数

```ruby:ruby
color = "red"
```

```javascript:javascript
let color = "red"
```

## 定数
rubyは定数を示す予約語すら不要ですので、アルファベット大文字 ([A-Z]) で始まる識別子は定数と認識します。

```ruby:ruby
FOO = 'FOO'
```

```javascript:javascript
const FOO = 'FOO'
```

## 文字列の式展開

```ruby:ruby
foo = "abc"
p "hello, #{foo}" #=> "hello, abc"
```

```javascript:javascript
foo = "abc"
console.log(`hello, ${foo}`); // hello, abc
```

## メソッド
rubyがOOPなのでメソッドと言いますが、JavaScriptで関数(function)と呼ばれます。

```ruby:ruby
def say(sentence)
  puts sentence
end
```

```javascript:javascript
function say(sentence) {
  console.log(sentence);
}

const say2 = (sentence) => {
  console.log(sentence)
}
```

## 分割代入
rubyが変数の分割代入できますが、Hashや配列ができません。

```ruby:ruby
a, b = 1, 2
# a:1
# b:2

a, b, *c = 1, 2, 3, 4, 5
# a:1
# b:2
# c:[3, 4, 5]
```

```javascript:javascript
[a, b] = [1, 2]
// a:1
// b:2

[a, b, ...c] = [1, 2, 3, 4, 5]
// a:1
// b:2
// c:[3, 4, 5]

{c, d} = {c:3, d:4}
// c:3
// d:4

{a, b, ...c} = {a:1, b:2, c:3, d:4, e:5]
// a:1
// b:2
// c:{c:3, d:4, e:5}
```

## 参考記事
- [Ruby 2.5.0 リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/doc/index.html)
- [Rubyの概念でecmascript6の新機能をまとめる](https://qiita.com/fukumone/items/d7db3bff061959431d0c)
- [Ruby vs JS vs ES6](https://gist.github.com/foxycoder/11b8c79e57c5f01c71eb042edc06705a)
- [javascript-vs-ruby/](http://blog.flatironschool.com/javascript-vs-ruby/)
- [Rubyの多重代入あれこれまとめ](https://qiita.com/yancya/items/c557864f307d429bbde4)
XREA シェルスクリプトでメールが送れないので、Cakephpで添付ファイル付けて送ってみた。

前回書いたシェルスクリプトでバックアップでメールを送りたかったので、cakephp側からシェルスクリプトを起動させてメールで送ってやった。
添付にはMysqlのバックアップのみ送り、サイトのソースは重いのでダウンロード形式にした。

０．cakephp側にフォルダを作る
webroot以下に「downloads」フォルダをつくる。

１．シェルスクリプトを書き換え
１部分だけ変更、cakephp側にコピーを置くようにした。

```backup.sh
#ソース保存 *public_html以下の特定フォルダだけの場合は後ろのパスを変える。
tar cvfz $TARFILE2 $PROGRAM --exclude downloads
#downloadsというフォルダを除外。cakephpにコピーした時に増えるので。

# ファイルのコピー
cp $TARFILE $PROGRAM/app/webroot/downloads/$PREFIX.tar.gz
cp $TARFILE2 $PROGRAM/app/webroot/downloads/$XREAUSERNAME.tar.gz
chmod 777 $PROGRAM/app/webroot/downloads/$PREFIX.tar.gz
chmod 777 $PROGRAM/app/webroot/downloads/$XREAUSERNAME.tar.gz
```
ファイル名には複数押した時でも上書きされるように日付は入れない。
html側で日付を入れてあげる。

２．cakephpのコントローラーにcakemailを
cakemailを使えるようにしてあげる。
んで、大事なコマンドはこれ

```Controller/UsersController.php
// シェルスクリプト起動
shell_exec("sh ~/backup-mysql/backup.sh");

if(preg_match('/backup/', $_GET['mode'])){

    // シェルスクリプト起動
    shell_exec("sh ~/backup-mysql/backup.sh");

    $email = new CakeEmail('default');
    $email->from('example@example.xrea.com');
    $email->to('example@gmail.com');
    $email->subject(date('Ymd').'_example_データバックアップ');
    $body = '日次：'.date('Ymd').' / exampleサーバー（XREA）/ データバックアップが成功しました。';
    $body_error = '日次：'.date('Ymd').' / exampleサーバー（XREA）/ データバックアップが失敗しています。';

    //ファイルの添付
    $route = '/virtual/example/backup-mysql/';
    $route2 = $_SERVER['CONTEXT_DOCUMENT_ROOT'].'/example/app/webroot/downloads/';
    $sqlfilename = 'mysql.'.date("Ymd").'.tar.gz';
    $datafilename = 'source.'.date("Ymd").'.tar.gz';
    if(file_exists($route.$sqlfilename) && file_exists($route.$datafilename)){

      $email->attachments($route2.'mysql.tar.gz');

      //メール送信する
       $email->send($body);
       $download = array(['mysql.tar.gz', $sqlfilename, 'Mysqlバックアップ'], ['source.tar.gz', $datafilename, 'ソースバックアップ']);
      $this->set('success', $download);
    }else{
      $email->send($body_error);
      $this->Flash->error(__('ファイルエラーです。失敗しました。'));
    }

}
```


これでシェルが走る。
添付のやり方は前回ので。

３．後はViewを弄るだけ

```View/Users/index.ctp
<div>
  <p class="btn"><a href="/example/users?mode=backup" onclick="return confirm('データをバックアップしてメールします。');"><button type="button" class="btn btn-outline-primary">全>データをバックアップする<i class="far fa-envelope"></i></button></a></p>

  <?php if(!empty($success)): ?>
    <?php foreach($success as $value): ?>
    <p class="btn"><a href="/example/downloads/<?php echo $value[0]; ?>" download="<?php echo $value[1]; ?>"><button type="button" class="btn btn-outline-primary"><?php echo $value[2]; ?><i class="far fa-arrow-alt-circle-down"></i></button></a></p>
    <?php endforeach; ?>
  <?php endif; ?>
</div>
```
Eloquentを単体で導入している時にDBファサードを使用する方法

## 概要
FacadeはLaravelなら初期状態でも使用できるが、Eloquentをスタンドアロンパッケージとして導入している場合はひと手間必要。

## そのままFacadeを使おうとすると
`RuntimeException: A facade root has not been set. `
が発生してしまう。

## 接続設定
Eloquentを導入している次点で接続設定は行っているはずだが念の為。
リクエスト～ルーティングの間等に接続設定を記述しておく。

```php:接続設定
$db = new \Illuminate\Database\Capsule\Manager;
$db->addConnection([
    // setting
]);
$db->setAsGlobal();
$db->bootEloquent();
```

## 使用方法
DBファサードを使用したいクラスで以下のように記述する。

```php:TestController,php
use \Illuminate\Database\Capsule\Manager as DB;

// 省略

try {
    $con = DB::connection();
    $con->beginTransaction();

    // transaction処理

    $con->commit();

} catch (\Exception $e) {
    $con->rollBack();
    echo $e->getMessage();
}

```

## 参考
https://stackoverflow.com/questions/35418810/eloquent-error-a-facade-root-has-not-been-set
Unityで動画素材を表示する方法

# 動画を表示する

今回はUnityで動画を表示する方法を見ていきます。
　

まず動画を用意する。　

※　ａｖｉやｗｍｖではなく　ｍｐ４形式の動画にしましょう。



<br><br>



**ステップ１**

　

動画をUnityのprojectに　ドラッグして入れる。　


そして　hierarchyから　VideoPlayerを開きます。

![bandicam 2018-03-28 16-21-32-628.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/2909c794-2d4c-d832-a746-d329fa77488e.jpeg)








そして　inspevterの　Videoclipに　　先ほど入れた動画をドラッグします。



![bandicam 2018-03-28 16-23-32-231.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/b258d8eb-da4c-63f6-4c21-d7cd7ea1f3d8.jpeg)






<br><br><br>

**ステップ２**

次に　Ａｄｄ　compornrtから　AudioSourceを追加します。


そして　AudioSourceに　hierarchyにある　VideoPlayerをドラッグして追加します。

![bandicam 2018-03-28 16-29-11-601.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/a0f21326-5c46-b770-3a6d-b031885fb921.jpeg)


　<br><br><br>

**ステップ３**
RendarModeを　camera　for　planeに　変更して　

hierarchyにある、MainCameraを　Cameraにドラッグして追加します。



![bandicam 2018-03-28 16-32-40-106.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/8e4f0982-35ef-95de-3c56-2171e910faca.jpeg)


<br><br><br>
これで再生ボタンを押してみると、　動画がきちんと表示されます。　


![bandicam 2018-03-28 16-35-35-766.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/33e46240-d2b7-ec3d-f69e-580e6afd0992.jpeg)




<br><br><br>


ＰＳ

ＵＤＥＭＹで　unity＆blender講座なども出しています。
phpのclass名は case insensitive という話

人のソースを追っていてどうしても宣言が見つからなくて、、、

知らなかった・・・

```php
<?php

class myvar
{
    public static $foo = 1;
}

echo MYVAR::$foo;     // 1
```

大文字小文字違うclassがあることは知ってたけど、まさか同じとは思わずハマってしまった



> [**Capital letters in class name PHP - Stack Overflow**](https://stackoverflow.com/questions/5260168/capital-letters-in-class-name-php)  
>> Classnames in PHP are not case sensitive (that doesn't depend on the operating system)

Linuxでcase insensitiveなら、もう何のOSでも case insensitiveなんじゃなかろうか。


## `instanceof ` で調べてわかった

これをやってわかりました

```php
<?php

class myvar
{
    public static $foo = 1;
}

$ins = new myvar();

print_r($ins instanceof myvar); // 1
print_r($ins instanceof MYVAR); // 1
```

# ちなみに

`class_alias()` っていう落とし穴もあるよ！！
JavaScript:配列をzipWith/zipする関数

そういえばなかったなと思い、自分でも必要になったので作ってみました。

+ 2引数関数fと配列xsとysを引数に
+ 要素数の少ない方に合わせて
+ xs,ysの要素にfを適用して配列にする


```Javascript:
const zipWith = f => xs => ys => 
  (xs.length < ys.length)? xs.map( (e, i) => f( e, ys[i] ) ) 
  : ys.map( (e, i) => f( xs[i], e) )
```
zipは配列xs、ysの同インデックスの要素からなる配列の配列を返します。


```Javascript:
const zip = zipWith( (x, y) => [x, y] )
//あるいは
const zip = xs => ys => 
  (xs.length < ys.length) ? xs.map( (e, i) =>[e,  ys[i]] ) 
  : ys.map((e, i) => [xs[i], e] );
Laravelにおけるdistinctありのページネーションでの総件数の求め方

Laravelのページネーションで`distinct`を使うと総ヒット件数が正しく計算されない。
自分はLaravel 5.2で経験したが、最新のバージョンだと修正されているかもしれない(が調べたところ5.4ではおかしいらしい)(いや、修正されたのか？？)。

https://stackoverflow.com/questions/41283083/distinct-with-pagination-in-laravel-5-2-not-working
https://github.com/laravel/framework/issues/21242

`distinct`を使わなければいいのだが、そうはいかない場合もある。
そこで対応したのが以下の方法(5.2を想定)。
例だと`distinct`を使う意味がないと思うがそこは複雑なSQLを脳内補完してほしい。

```php
DB::enableQueryLog();

$page    = 2;
$limit   = 20;
$builder = User::select('id', 'name')->distinct()->orderBy('id', 'desc');
$users   = $builder->skip(($page - 1) * $limit)->take($limit)->get();

// totalの計算
$queries     = DB::getQueryLog();
$last_query  = end($queries);
$total_query = preg_replace('/\sorder\sby.+?$/', '', $last_query['query']);
$total       = DB::select(DB::raw('select count(*) as total from (' . $total_query . ') tmp_users'), $last_query['bindings']);

DB::disableQueryLog();
```

クエリーログを有効化して、最後に実行したSQLを取得する。
`$last_query['query']`にそのSQLが格納されているのだが、そこには

```php
select distinct `id`, `name` from `users` order by `id` desc limit 20 offset 20
```

が入っていて、これだと総件数は求められない。
そこで正規表現で`order by`以下を削除する。

```php
select distinct `id`, `name` from `users`
```

これを`select count(*)`することでdistinctでも正しい総件数が得られるようになる。
以上:pray_tone2:
mechanizeを使ったrubyスクレイピングの基本

mechanizeを使ったスクレイピングの基本をまとめていきます。
自分のメモ用ですので、足りないところ間違っているところがあれば、指摘ください！

#準備

```gemfile.
source 'https://rubygems.org'
gem 'mechanize'
```

```scrape.rb
require 'mechanize'

agent = Mechanize.new
base_url = 'https://aaaaaaaaaa.com'
page = agent.get(base_url)
```
ここまではテンプレートだと思います。

#そのページの情報を取得する

##情報が一つと決まっている場合
```
title = page.at('h1')
```
##複数ある場合
```
url = page.search('a')
```

##html丸ごとなら
```
title.inner_html
```
##テキストだけなら
```
title.inner_text
```
##pathを取得するなら(srcも同様)
```
url.get_attribute('href')
```
System.TypeLoadExceptionってエラーで実行できない！なぜ！

タイトルの通り。昨日までは普通に動いていたはずなのに、画面を表示しようとしてエラーはいたわ:weary:ってことがあったのでまとめます。

##そもそも何が起きたか
PageとかのコンストラクタでInitializeComponent ~~またお前か~~よんでるところありますよね。
```private void InitializeComponent() {
                    global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(TopPage));
                }```
このLoadFromXamlってところでSystem.TypeLoadExceptionが発生。。以下詳細
>$exception	{"Could not load type 'Xamarin.Forms.Xaml.XamlFilePathAttribute' from assembly 'Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null'.":"Xamarin.Forms.Xaml.XamlFilePathAttribute"}	System.TypeLoadException

##解決策
まぁひたすらクリーンしたりしたのですが、改善されず。
答えはNugetのバージョンにあった。

参考：[The type or namespace name XamlFilePathAttribute does not exist in the namespace Xamarin.Forms.Xaml](https://forums.xamarin.com/discussion/89180/the-type-or-namespace-name-xamlfilepathattributedoes-not-exist-in-the-namespace-xamarin-forms-xaml)

iOSとAndroidはXamarin.Formsのバージョンをあげていたのですが（実装の都合上）、
UWPはあげていなかった。。ただそれだけのこと。

あげたら無事動くようになりました。感謝。
ニューラルネットで解像度に依存しない画像表現(MNIST編)

## はじめに
ニューラルネットで画像を出力する際、通常は解像度ごとに専用のモデルを用意して学習を行うことになります。
今回は解像度に依存しない形で、画像上の任意の点からサンプリングを行うモデルについて考えてみます。
画像上の点$ (u, v) $の値を$ P_{u, v} $とすると、
$$ P_{u, v} = f(u, v, z_1, ..., z_n) $$
となる関数$ f $をニューラルネットで表現したいわけです。ここで、$ \lbrace z_1, ..., z_n \rbrace $は画像を表す潜在表現です。
今回はこの潜在表現をVAEのエンコーダ部を用いて得ることにして、デコーダ部となる関数$ f $を4層の全結合ニューラルネットで表現してみました。

[Chainerによる実装(github)](https://github.com/tmagara/sampling-autoencoder)

## 実装
全体の構成は通常のVAEと同じです。
違いはデコーダ部で、こうなっています。

```python:model.py
class SamplingDecoder(chainer.Chain):
    def __init__(self, input_size):
        super().__init__()
        units = [2 + input_size, 256, 256, 256, 1]
        initializer = chainer.initializers.HeNormal()
        with self.init_scope():
            self.linear1 = chainer.links.Linear(units[0], units[1], initialW=initializer)
            self.linear2 = chainer.links.Linear(units[1], units[2], initialW=initializer)
            self.linear3 = chainer.links.Linear(units[2], units[3], initialW=initializer)
            self.linear4 = chainer.links.Linear(units[3], units[4], initialW=initializer)

    def decode(self, z):
        h = z
        h = self.linear1(h)
        h = chainer.functions.relu(h)
        h = self.linear2(h)
        h = chainer.functions.relu(h)
        h = self.linear3(h)
        h = chainer.functions.relu(h)
        h = self.linear4(h)
        return h

    def __call__(self, z, x0_shape):
        xp = self.xp

        # Generate (u, v) coordinates for every samples.
        u = xp.linspace(-1.0, 1.0, x0_shape[2], dtype=xp.float32)
        v = xp.linspace(-1.0, 1.0, x0_shape[3], dtype=xp.float32)
        uv = xp.broadcast_arrays(u[None, None, :, None], v[None, None, None, :])
        uv = xp.concatenate(uv, 1)
        uv = xp.broadcast_to(uv, (z.shape[0], uv.shape[1], uv.shape[2], uv.shape[3]))

        z = z[:, :, None, None]
        z = chainer.functions.broadcast_to(z, (z.shape[0], z.shape[1], uv.shape[2], uv.shape[3]))

        # Combine them.
        uvz = chainer.functions.concat((uv, z))
        uvz = chainer.functions.transpose(uvz, (0, 2, 3, 1))
        uvz = chainer.functions.reshape(uvz, (-1, uvz.shape[3]))

        y = self.decode(uvz)

        y = chainer.functions.reshape(y, (x0_shape[0], x0_shape[2], x0_shape[3], x0_shape[1]))
        y = chainer.functions.transpose(y, (0, 3, 1, 2))
        return y
```
まず、画像上で出力値を得たい全ての点について座標値(u, v)を生成しています。これを潜在表現$ \lbrace z_1, ..., z_n \rbrace $とあわせてdecode()に与えるわけです。
出力に対する損失関数としては、ベルヌーイ分布の負の対数尤度を用います。

## 出力
潜在表現を8次元とした学習結果です。
### 1エポック目
![epoch_1_original.png](https://qiita-image-store.s3.amazonaws.com/0/152511/a9ef0922-5029-1142-a3d7-0988c8bf396c.png)
![epoch_1.png](https://qiita-image-store.s3.amazonaws.com/0/152511/54a1dec9-92ee-d923-f50e-41de7a7ea1e4.png)
(上:元データ、下:学習後のモデルによる168x168でのレンダリング結果)
### 50エポック目
![epoch_50_original.png](https://qiita-image-store.s3.amazonaws.com/0/152511/0e95073b-9aa5-e7c4-2d5e-fdf8dd4a5985.png)
![epoch_50.png](https://qiita-image-store.s3.amazonaws.com/0/152511/02bd9f53-1670-01f8-6775-835bde97bcd3.png)
(上:元データ、下:学習後のモデルによる168x168でのレンダリング結果)

うまくデータを再現できているようです。
ただし、通常の画像補間アルゴリズムによる結果と大して変わらないような気もします。