OmniAICreator/Qiita-1.07M huggingface dataset:
Rustで詳細な型のわからないメモリ領域を操作する

# はじめに
よくC言語とかだとこういうのやると思います。

``` C
#include <stdio.h>
#include<stdlib.h>
typedef struct TypeStruct{
    int type;
}TypeStruct;

typedef struct TypeA{
    TypeStruct type;
    char name[100];
    int age;
}TypeA;

TypeStruct* createAbstruct(){
    TypeA* a = (TypeA*)malloc(sizeof(TypeA));
    TypeA initialize={{0},"Lisa",18};
    *a = initialize;
    return (TypeStruct*)a;
}

void abstructReader(TypeStruct* ts){
    // 本当はこの辺りに型判定が入る。
    TypeA* ta=(TypeA*)ts;
    printf("My name is %s. Age is %d years old",ta->name,ta->age);
}

int main(void){
    TypeStruct* st = createAbstruct();
    abstructReader(st);
}
```
みたいなやつです。

これを、Rustでやってみた。
<del>（某Ter○tailにやりかた質問しようとして質問を書いてたら自己解決したのでメモ。）</del>
↑解決したのはしたけど、Rust的に安全に書きましょう！というところから逸脱していた。
というわけで、@ubnt_intrepidさんがコメントくれたものが実際に動いた&安全なので推奨版をアップデートします。

助かりました、ありがとうございます！

## 推奨版（Trait objectを使う）

``` Rust
// foo.rs

pub trait Reader {
    fn read(&self) -> Result<(), Box<dyn std::error::Error>>;
}

pub fn create_abstract_reader() -> Box<dyn Reader> {
    struct PrivateReader {
        // type id は不要
        name: String,
        age: u32,
    }

    impl Reader for PrivateReader {
        fn read(&self) -> Result<(), Box<dyn std::error::Error>> {
            ...
        }
    }

    Box::new(PrivateReader { name: "Alice".into(), age: 42 })
}

// main.rs

fn main() {
    let reader = foo::create_abstract_reader();
    reader.read();
}
```


## 非推奨（Boxで生ポインタを使う）
``` Rust
// mainとは別のソースにある。
// もしかすると別モジュールかもしれない。
// 実装はモジュールが知っている。
// main関数は公開されたインタフェースのみ（PublicPointer・FooStructのみ）を
// 把握しているが、細かくカスタムされた内部実装は何も知らない。

// 公開インタフェース
#[repr(C)]
pub struct PublicPointer_impl{
    struct_type:u32
}
// 公開インタフェース
pub type PublicPointer=* const PublicPointer_impl;

// 公開インタフェース
pub trait RequireTrait{
    // 書き込み
    fn write(core:FooStruct)->Result<PublicPointer,Box<std::error::Error>>;
    // 読み込み
    fn read(st:PublicPointer)->Result<(),Box<std::error::Error>>;
}

// privateなデータ
#[derive(Debug,Clone)]
#[repr(C)]
pub struct Private{　// 呼び出しを簡単にするためpubにしてるが、本来はPrivateな構造体
    struct_type:u32, 
    foo:FooStruct,
    custom_data:u128
}

// 公開インタフェース
#[derive(Debug,Clone)]
pub struct FooStruct{
    pub test:String,
    pub test1:String,
 }

impl RequireTrait for Private{
    fn write(foo:FooStruct)->Result<PublicPointer,Box<std::error::Error>>{
        let p = Box::new(Private{foo:foo,struct_type:102,custom_data:200});
        // Privateな型のポインタを返す（struct_type=10の型）
        let p:*mut Private = Box::into_raw(p);
        let pp = p as PublicPointer;
        Ok(pp)
    }
    fn read(raw:PublicPointer)->Result<(),Box<std::error::Error>>{
        let st = raw as *mut Private;
        println!("private struct : {:?}",st);
        println!("st {}",unsafe{(*st).clone().foo.test});
        Ok(())
    }
}
```

``` Rust
// main.rs
mod testtrait;
use crate::testtrait::*;


fn main() {
    let foo = FooStruct{test:"test".to_string(),test1:"test1".to_string()};
    let private = Private::write(foo).unwrap();
    Private::read(private);
    
}
```

API設計をする時にこういう技は使いたくなる。

というわけで、こんな感じ。


Box化してBoxのポインタをそのまま返却する感じ。
Boxマジ便利。


Trait Objectマジ便利
indexによるDataFrame/Seriesのgrep

仕事中に、DataFrameのindexでgrepしたいことがありました。
列のgrepならすぐわかるのですが、indexの場合少し調べる必要があったので、忘備録として以下に記載しておきます。

## DataFrameのgrep
```python
import numpy as np
import pandas as pd

data = np.arange(30).reshape(6,5)
data = pd.DataFrame(data, index=[0,2,4,6,8,12], columns=["A", "B", "C", "D", "E"])
# 個人的にqueryが好きなのでqueryで..
data.query('index in [2,6,12]')
```

## Seriesのgrep
あまり頻度は高くないですが、Seriesでも同様に使いたいことがありました。
ただ、Seriesはそのままではqueryを呼べないので、あまり好きではないですが、以下の方法で呼び出します。

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

data = np.arange(30).reshape(6,5)
data = pd.DataFrame(data, index=[0,2,4,6,8,12], columns=["A", "B", "C", "D", "E"])
data_se = data["A"]
# queryのように直感でわかる方法を知りたいが..
data_se[data_se.index.isin([0, 6, 12])]
```

以上です。
git checkout - でブランチ間を行ったり来たりする

# git checkout -

`git checkout -` とすると一つ前に居たブランチ(もしくはリビジョン)をチェックアウトしてくれる。別のブランチをチェックアウトして作業した後に元のブランチに戻りたい場合などに使うと便利。

```shell-session
$ git rev-parse --abbrev-ref HEAD
master
$ git checkout maint
Switched to branch 'maint'
Your branch is up to date with 'origin/maint'.
$ git rev-parse --abbrev-ref HEAD
maint
$ git checkout -
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
```

さらに `git checkout -`するとブランチ間を行ったり来たりできる。

```shell-session
$ git checkout -
Switched to branch 'maint'
Your branch is up to date with 'origin/maint'.
$ git checkout -
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
```

# 仕組み

リポジトリのどこかに前に居たブランチの情報を持っているのかなと思って実装を確認した。
[builtin/checkout.c](https://github.com/git/git/blob/master/builtin/checkout.c) の `parse_branchname_arg()` を見ると

```c
	if (!strcmp(arg, "-"))
		arg = "@{-1}";
```

となっていて、これにより `-` は `@{-1}` に読み替えられている。`@` で始まる記法なので [reflog](https://git-scm.com/docs/git-reflog)を使って一つ前の状態を取得しているのかなと推測したが、reflogのドキュメントには関連する記述は見当たらなかった。`-` が導入されたコミット[^1]を見ると負の整数を指定する書き方は `-` が導入される以前からあったようなので、さらに実装を確認していくと [sha1-name.c](https://github.com/git/git/blob/master/sha1-name.c) の `interpret_nth_prior_checkout()` で reflog 中の "checkout: moving from " を見ていることがわかり[^2]、reflogを使ってるという推測が正しいと確認できた。

ドキュメントでの言及は reflog の方じゃなく [checkout](https://git-scm.com/docs/git-checkout) のマニュアルでは見つけることができた[^3]：

```
You can use the "@{-N}" syntax to refer to the N-th last branch/commit checked out
using "git checkout" operation. You may also specify - which is synonymous to "@{-1}.
```

[^1]: https://github.com/git/git/commit/696acf45f9638b014c7132508de26d1a571c8a33
[^2]: https://github.com/git/git/commit/ae5a6c3684c378bc32c1f6ecc0e6dc45300c14c1
[^3]: クォート閉じ忘れを見つけたのでパッチ送っておきました。

# 何で `-` なの？

同僚にこの機能を説明する時に `cd -` と同じだよと言ったところ、そもそもそちらを知らなくてピンときてなかった。割と知られていないことなのかもしれないが、 `cd -` とすると前居たディレクトリに移動できる：

```shell-session
$ cd /usr
$ pwd
/usr
$ cd /var
$ pwd
/var
$ cd -
/usr
$ pwd
/usr
$ cd -
/var
$ pwd
/var
$ 
```

別のディレクトリに移動して何かした後に、元のディレクトリに戻るときとか、間違って cd しちゃったときに元のディレクトリに戻るとかいうときに便利。`git checkout -` の `-` はこれを真似てるんじゃないかと勝手に思ってる。
Plone 5.2 on Python3.7 のインストール方法

# 概要


(2019年7月17日 Plone 5.2ソフトリリースに伴いタイトルから変更)
(旧タイトル Plone 5.2RC1 on Python3.7 のインストール方法)

(2019年3月14日 Plone 5.2RC1リリースに伴いタイトルから変更)
(旧旧タイトル Plone 5.2b1 on Python3.7 のインストール方法)


Ploneは、いままでPython2.7で動作をしていました。ご存じの方も多いと思いますがPython2は2020年1月で開発が終了されEOLとなります。

Ploneコミュニティでは数年の年月を使い、Python3で動作するように改修しています。この開発バージョンが5.2としてソフトリリース(公式なインストーラが準備されるまでのサイレントリリース)されました。

以下にインストール方法を記します。
 
# インストール方法

## Python仮想環境

Python3.7が導入済み(Ubuntuの場合は `python-venv` も導入済み)

インストール先のフォルダを作る (ここでは、 ~/plone52 とした)

```
$ mkdir ~/plone52
```


```
$ cd ~/plone52
$ python3.7 -m venv .
$ ./bin/pip install -r https://dist.plone.org/release/5.2-latest/requirements.txt
```

## buildout.cfg


~/plone52 直下に `buildout.cfg` を以下の内容で作る

```
[buildout]
parts = instance
extends = https://dist.plone.org/release/5.2-latest/versions.cfg

[instance]
recipe = plone.recipe.zope2instance
wsgi = on
eggs =
  Plone
  Pillow

[instance:python2]
wsgi = off
```

## buildoutの実行

```
$ . bin/activate
(plone52) $ ./bin/buildout
```

途中で、ユーザ名などの入力を求められます。

```
Username: admin
Password: 
Verify password: 
```


# 起動

```
(plone52) $ ./bin/instance fg
```

http://localhost:8080
で閲覧できる
Python手遊び(Anaconda指定環境で実行するショートカット)

#この記事、何?
Pythonでスクリプト書いて、実行するときにいちいちConda環境を開いてやりたくない。
(JuptyerはGitで差分管理しづらいので使ってない)
で、エクスプローラとかでファイルを一覧で見ている状態から最小ステップで実行できないか考えてみた。
結果、SendoToにバッチファイルを置いてそこから直接Callできるようにできた。

#どういう人向け?
あたしと同じように、いちいちConda環境呼び出しがめんどいと思っている方向け。
あと、別件、Pythonスクリプトの所要時間計測したかったのでついでに開始・終了時刻を出せるようにした。

#出来上がり♪
いじったのは数行なのでいきなり完成で。

##■その１．activate.bat -> activateDirect.bat
まずは、環境切り替えのactivate.batをいじって、activateDirect.batを作成。
1行変更して、数行末尾に追加。


■Anaconda既定の環境切り替え
C:\Anaconda3\Scripts\activate.bat

■変更後の環境切り替え
C:\Anaconda3\Scripts\activateDirect.bat

・1行変更:conda.batに第1引数しか渡さない

```
<変更前>
@CALL "%~dp0..\Library\bin\conda.bat" activate %*
<変更後>
@CALL "%~dp0..\Library\bin\conda.bat" activate %1
```

・Python呼び出しを追加し、第2引数を呼び出し対象ファイルとして渡す
※ついでに最後に開始終了時刻を表示

```
@set started_at=%date% %time%

@python %2

@set finished_at=%date% %time%

@echo started_at=[%started_at%]
@echo finished_at=[%finished_at%]

pause

exit

```

##その２．既定で作られるショートカットのコマンドを流用したバッチを作成 (1行)

Anacondaをインストールした時にできたショートカットをプロパティーで開くとこれが書いてあった。


```
%windir%\System32\cmd.exe "/K" C:\Anaconda3\Scripts\activate.bat C:\Anaconda3
```

なので、こんなバッチを作った。

pythoncaller.bat

```
%windir%\System32\cmd.exe "/K" C:\Anaconda3\Scripts\activateDirect.bat C:\Anaconda3\envs\py36 %1
```

はい。で、これをOSのSendToにおく。


#感想
その先のconda.batを含めてバッチファイルが全部で3つ経由しているのでその気になればもっと改善できそう。
ただ、あたしの目的は達したのでここまででいいかな。

もっと突っ込んで作ってみようと思われた方・・・
というか、すでにここに上がってるよ、という情報があればコメントいただけると助かります。



#蛇足
ちなみに、少し前に投稿したこれ、呼び出してみたらこんなでした。

■Pytho手遊び(化合物のSDFをRDBへInsert)
https://qiita.com/siinai/items/1f5bef5e2247a8bb5ccd

started_at=[2019/02/23 15:22:27.18]
finished_at=[2019/02/23 15:27:08.65]

高速化したいね・・・あとで。。。
Slickでいつの間にかjava.time.*がサポートされてた話

# 私の3時間を返せ

いままでカラムに`java.time.LocalDate`とか割り当てる場合は暗黙の変換で以下のようにしていた・・・

```scala
implicit val localDateColumnType = MappedColumnType.base[java.time.LocalDate, java.sql.Date](
  t => java.sql.Date.valueOf(t),
  u => u.toLocalDate
)
```

たぶんバージョン3.3以降でこれを書いてるとコンパイルが通らない。

ついでに`mysql-connector-java`の6系もサポートした模様。

##【追記】
MySQLの`datetime`や`timestamp`が変換できないのでソース見てみたら

>/**
> * [[LocalDateTime]] will be persisted as a [[java.sql.Types.VARCHAR]] in order to
> * avoid losing precision, because MySQL stores [[java.sql.Types.TIMESTAMP]] with
> * second precision, while [[LocalDateTime]] stores it with a millisecond one.
> */

だってさ。
【確定申告】楽天クレジットの明細をpythonで加工

楽天クレジットの明細を各項目ごとに合算する

1. 楽天naviにログイン
2. 2018/2 ~ 2019/1の「明細コピー用」クリックしてローカルに保存
![スクリーンショット 2019-02-23 15.22.35.png](https://qiita-image-store.s3.amazonaws.com/0/340410/011635a8-6cf6-8020-aa38-c474f8414664.png)
3. 作業ディレクトリにcsvフォルダを作成
4. ダウンロードしたcsvを3のフォルダに格納
5. python main.pyを実行

```python:main.py
import glob
import pandas as pd

pd.options.display.max_rows = None

csv_list = glob.glob('csv/*')

list = []
for csv in csv_list:
    df = pd.read_csv(csv, encoding='cp932')
    list.append(df)

df = pd.concat(list, sort=True)

cols = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 28, 29, 30 ,31]
df.drop(df.columns[cols],axis=1,inplace=True)

df = df.rename(columns={ '利用日' :  'date', '利用店名・商品名': 'shop', '利用金額': 'cost' })

df['date'] = pd.to_datetime(df.date)
df = df.set_index('date')
df.sort_index(inplace=True)

df = df['2018-1-1':'2018-12-31']

df.to_csv('rakuten-navi.csv', encoding="cp932")

df = df.groupby('shop', as_index=False).sum()

df.to_csv('rakuten-navi_sum.csv', encoding="cp932")
```
rakuten-navi_sum.csvに項目ごとの合計金額が表示されます

![スクリーンショット 2019-02-23 15.32.50.png](https://qiita-image-store.s3.amazonaws.com/0/340410/be35e26e-3527-d72c-5846-377ffa88b2be.png)
一度の投稿で複数のモデルに保存する方法

## 今回やりたいこと
一度の投稿で複数のモデルにデータを保存したい！

## 背景
例えばツイッターなどで1つの投稿につき画像が複数保存される場合、image1、image2、image3・・・というカラムを作らなくてはいけなくなるため、投稿と紐ついたimageテーブルを作ることで解決しようとした。

##　実装方法
①tweetモデルとimageモデルを作る
②tweetモデルを親モデルとし、imageモデルと紐つける
③viewでfields_forを使ってform_forのなかで子モデルに対してもデータが保存できるようにする
④controllerで_attibutesをつかってitemのparamsの中で一括で受け取るように記述

### controller

```ruby:tweets_controller
class TweetsController < ApplicationController
  def new
    @tweet = Tweet.new
    @tweet.images.build
  end

  def create
    Tweet.create(tweet_params)
  end
  
  private

  def tweet_params
    params.require(:tweet).permit(
      :text,
      images_attributes: {image: []}
    )
  end
end
```

### model
親モデル

```ruby:tweet.rb
class Tweet < ApplicationRecord
  has_many :images, inverse_of: :tweet
  accepts_nested_attributes_for :images
end
```
子モデル

```ruby:image.rb
class Image < ApplicationRecord
  belongs_to :tweet, inverse_of: :images
  mount_uploaders :image, ImageUploader
end
```

### view
 
```haml:new.html.haml
.contents
  = form_for @tweet do |f|
    = f.label :text, "テキスト"
    = f.text_area :text, placeholder: "ここに文字を入力してね！"
    .file
    = f.fields_for :images do |c|
      = c.label :image
      = c.file_field :image, multiple: true
    .submit
      = f.submit "投稿", {class: "btn"}

```

### 詰まったところ
#### paramsは送られているのにimageに保存ができない！(rollbackやエラーはなし)
理由：controllerの_attributesの書き方がわるい

```
誤
params.require(:tweet).permit(
      :text,
      images_attributes: [:image]
    )

正
params.require(:tweet).permit(
      :text,
      images_attributes: {image: []} 
    )
```

これだと一枚の場合は保存できるが、複数枚送られたときに保存ができない。

#### 画像を保存しようとすると「no implicit conversion of nil into String」とエラーが出る。

[![Image from Gyazo](https://i.gyazo.com/3a623b3fca55f69e4935b6871c6d54a6.png)](https://gyazo.com/3a623b3fca55f69e4935b6871c6d54a6)

直訳するとnilはStringに変えれませんよ！と怒られている。
paramsにnilが入ってるのかなと思って何度もみてもnilは見つからなかった。
ググってるうちに以下の記事が救ってくれた。
 
・“no implicit conversion of nil into String” error for carrierwave multiple image upload
https://stackoverflow.com/questions/33401629/no-implicit-conversion-of-nil-into-string-error-for-carrierwave-multiple-image

**複数画像の時はmount_uploder"s"にしないといけなかったっぽい**

```ruby:image.rb
一枚→ mount_uploader :image, ImageUploader

複数→ mount_uploaders :image, ImageUploader
 ````


## まとめ
新しい機能を実装するときにはミニアプリを使って挙動確かめるのがおすすめ。
Go言語のクロスコンパイルを試してみる

クロスコンパイルが簡単と噂のgoさん。せっかくなので、クロスコンパイルをしてみようと思います。
ビルド CentOS7
実行  macOS High Sierra（10.13.6）

#CentOSでGoをビルドする
「ハローワールド」するだけのコードです。ファイル名はhello.goです。

```
package main

import "fmt"

func main() {
  fmt.Println("hello go world from centOS")
}

```
そのままビルド時に、Macを指定

```
$ GOOS=darwin GOARCH=amd64 go build hello.go 
```
対応表は、公式を御覧ください。https://golang.org/doc/install/source#environment


#Macで動くか確認

ダウンロードしたディレクトリに移動し

```
$ ./hello
```
実行結果

```
hello go world from centOS
```
動いた！
簡単だ！
vagrant box add が遅すぎて発狂した

#背景
laravelの勉強を始めようと思い、環境構築していく中で、`vagrant box add laravel/homestead`が面白いぐらい遅い。終わるまで２時間とか平気で表示される。
#解決策
`wget`を使う。
まずコマンドを使うために`homebrew`を使ってインストールする。

```terminal
brew install wget
```
`wget`はURLを指定してそのファイルをダウンロードすることができる。
`vagrant box add laravel/homestead`をした後にURlが表示されていると思うのでコピー。
実行する。

```terminal
wget https://vagrantcloud.com/laravel/boxes/homestead/versions/7.1.0/providers/virtualbox.box
```

これでも多少時間はかかるが、大分まし。

最後にvagrantにBoxを追加する。

```terminal
vagrant box add laravel/homestead [保存したパス] 
```

```terminal
==> box: Successfully added box 'laravel/homestead' (v0) for 'virtualbox'!
```

お見事！！！

#まとめ
`vagrant box add`で苦しんでいる人に届けば幸いです。
Ruby on Rails Tutorial で使用されていない技術

# View表示の高速化
##slim

### Gemfileへの記載追加

```Gemfile
gem 'slim-rails'
gem 'html2slim'
```

### 使用できる状態にする

```
$ bundle update
```
### 変換

```
$ bundle exec erb2slim app/view/<適応するディレクトリ> (--delete)
```

# Test用のライブラリ
## RSpec

###Gemfileに追加

```Gemfile
group :development, :test do
  (省略)
  # RSpec
  gem 'rspec-rails'
end

```

### bundleに適用

```
$ bundle update
```

### rspecのインストール&ディレクトリ作成

```
$ rails g rspec:install
```

## Capybara
### 準備
specに適用できるように準備する。
Headless Chromeを使用する。

```spec/spec_helper.rb
require 'capybara/rspec'

RSpec.configure do |config|
  config.before(:each, type: system) do
    driven_by :selenium_chrome_headless
  end

  (省略)
end
```

## Factory Bot
### インストール

```Gemfile
group :development, :test do
  (省略)
  # test fixture
  gem 'factory_bot_rails'
end
```


# modelファイルにschemaを書き出す

```Gemfile
gem 'annotate'
```

```
$ bundle exec annotate --exclude tests,fixtures,factories
```
上記でModelのみ対象となる。


# ログイン機能

## devise

注：最初に作成するべき。すでにUserモデルがあるとコンフリクトする。

公式Document:
https://github.com/plataformatec/devise/wiki


### 手順

Gemfileにかく。

```
# ユーザー登録
gem 'devise', '4.3.0'
```


アップデートする。

```
$ bundle update
```


インストールする

```
$ rails g devise:install
```

Userモデルに適応する。

```
$ rails g devise User
```

ファイルが色々できる。
migrationファイルもできているので、DBをアップデート。

```
$ rails db:migrate
```

##さらにカスタマイズ

### Viewをカスタマイズ

```
$ rails g devise:views users
```

https://qiita.com/akasakas/items/a06a0389d3c5da879ba7

### Controllerをカスタマイズ

```
$ rails g devise:controllers users
```

```
$ rails g devise:controllers users
```


# タグ機能

acts_as_taggable_on_engineを使用する。


# 検索
ransack
aws cli で突然の ImportError: cannot import name 'AliasedEventEmitter' エラー

# 見舞われたエラー

`aws configure` したら

```bash

> aws configure
Traceback (most recent call last):
 File "D:\hoge\Python\Python37\Scripts\aws.cmd", line 50, in <mod
ule>
   import awscli.clidriver
 File "D:\hoge\Python\Python37\lib\site-packages\awscli\clidriver
.py", line 19, in <module>
   from botocore.hooks import AliasedEventEmitter
ImportError: cannot import name 'AliasedEventEmitter'

```
なんてエラーに見舞われました。
つい最近使った環境だったのでビックリ。


# 対処方法
aws-cli内部で使っている botocore がインポートできていない模様。
本番環境でもなく、検証用途で利用している環境でしたので aws-cli をインストールしなおしました。

pipをアップグレード

```bash
> python -m pip install --upgrade pip
```
aws-cliをアンインストール

```bash
> pip uninstall awscli
```

aws-cliをインストール

```bash
> pip install awscli
```

ひとまずはこれで解決できました。
ベイズ推論の勉強用ノート（５）ー 予測分布の推定

# 目的
[ベイズ推論による機械学習入門](https://www.amazon.co.jp/dp/4061538322)の勉強用のノート。
式を後で参照するために残しておく。

# 関連
[ベイズ推論の勉強用ノート（１）ー 基本的な定義](https://qiita.com/tkosht/items/de4cb8876b4aedde5a6e)
[ベイズ推論の勉強用ノート（２）ー 離散確率分布](https://qiita.com/tkosht/items/a5aee011a35e53764cd1)
[ベイズ推論の勉強用ノート（３）ー 連続確率分布](https://qiita.com/tkosht/items/8213b228a980eeeed1b7)
[ベイズ推論の勉強用ノート（４）ー 事後分布の推定](https://qiita.com/tkosht/items/ddf06543fb28520fd36f)

# 予測分布
パラメータが学習されたあと、パラメータの分布を使って、
未観測データ$x_* $ の予測分布$p(x_*|D)$を推定する

```math
\begin{align}
p(x_*|D)
 &= \int p(x_*|\theta)p(\theta|D)d\theta \\
 &= \langle p(x_*|\theta) \rangle_{p(\theta|D)} \\
\end{align}
```

上記式は、確率分布 $p(x_*|\theta)$ の $p(\theta|D)$ による加重平均（期待値）を意味している。

このモデルの関係をグラフィカルモデルで表すと以下の図のようになる。

<div align="center">
<img width="200" alt="graphical-model.png" src="https://qiita-image-store.s3.amazonaws.com/0/226427/c4018a9e-c774-b818-1e68-ee524d0fbdc7.png">
</div>

このモデルでは、データ$D$、未知のデータ$x_*$ のいずれも、パラメータ（ベクトル）$\theta$ によって決定されることを表している。

特に、$D$、$x_*$ の間には、直接的な依存関係は仮定していない点にも留意する。つまり、パラメータが与えられたもとで、独立である。 (式で表すと以下の通り。)

```math
p(D, x_*|\theta) = p(D|\theta)p(x_*|\theta)
```

このグラフィカルモデルが表している同時分布は以下のようになる。

```math
\begin{align}
p(D, x_*, \theta) = p(D|\theta)p(x_*|\theta)p(\theta)
\end{align}
```

データ$D$が観測された後の、事後分布を計算すると以下のようになる。

```math
\begin{align}
p(x_*, \theta|D)
 &= \frac{p(D, x_*, \theta)}{p(D)} \\
 &= \frac{p(D|\theta)p(x_*|\theta)p(\theta)}{p(D)} \\
 &= \frac{p(x_*|\theta)p(D|\theta)p(\theta)}{p(D)} \\
 &= p(x_*|\theta)p(\theta|D) \\
\end{align}
```

ここで、この事後分布 $p(x_*, \theta|D)$ を、$\theta$ で周辺化した分布が、

予測分布$p(x_*|D)$になることに注意しておく。

つまり、

```math
\begin{align}
p(x_*|D)
 &= \int p(x_*, \theta|D)d\theta \\
 &= \int p(x_*|\theta)p(\theta|D)d\theta \\
\end{align}
```

である。

また、データ$D$が、まったく観測されていない場合は、以下のように予測することもできる。

```math
\begin{align}
p(x_*)
 &= \int p(x_*, \theta)d\theta \\
 &= \int p(x_*|\theta)p(\theta)d\theta \\
\end{align}
```
Swift MkMapViewで地図アプリ作成してみた（09）- ロングタップした位置と現在位置の距離を求める

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)


#ロングタップした位置と現在位置の距離を求める

1. 2点間の距離を求める関数を作成する

    CLLocationオブジェクトのdistance関数で2点間の距離(m)を算出できる。

    ```swift:ViewController.swift：2点間の距離を求める関数を作成する
    // 2点間の距離(m)を算出する
    func calcDistance(_ a: CLLocationCoordinate2D, _ b: CLLocationCoordinate2D) -> CLLocationDistance {
        // CLLocationオブジェクトを生成
        let aLoc: CLLocation = CLLocation(latitude: a.latitude, longitude: a.longitude)
        let bLoc: CLLocation = CLLocation(latitude: b.latitude, longitude: b.longitude)
        // CLLocationオブジェクトのdistanceで2点間の距離(m)を算出
        let dist = bLoc.distance(from: aLoc)
        return dist
    }
    ```

2. ロングタップを検出した時に(1.)で作成した関数をCallする

    [Swift MkMapViewで地図アプリ作成してみた（08）](https://qiita.com/rain_00_00_09/items/1be8bf72ecf0700ffdf5)で取得したロングタップした位置と、現在位置の2点間の距離(m)を算出する。

    |位置情報           |変数　|
    |:--               |:-- |
    |現在位置           | mapView.userLocation.coordinate |
    |ロングタップした位置      | center |
    
    ```swift:ViewController.swift：calcDistance関数をCallする
    // UILongPressGestureRecognizerのdelegate：ロングタップを検出する
    @IBAction func mapViewDidLongPress(_ sender: UILongPressGestureRecognizer) {
        // ロングタップ開始
        if sender.state == .began {
        }
        // ロングタップ終了（手を離した）
        else if sender.state == .ended {
            // タップした位置（CGPoint）を指定してMkMapView上の緯度経度を取得する
            let tapPoint = sender.location(in: view)
            let center = mapView.convert(tapPoint, toCoordinateFrom: mapView)
 
            let lonStr = center.longitude.description
            let latStr = center.latitude.description
            print("lon : " + lonStr)
            print("lat : " + latStr)
            
            // 現在位置とタッウプした位置の距離(m)を算出する
            let distance = calcDistance(mapView.userLocation.coordinate, center)
            print("distance : " + distance.description)
        }
    }
    ```
#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)
Overpass API を使って OpenStreetMap から牛丼店の情報を取得し、Google マイマップに表示する

この記事は、下記の記事に触発されて書きました

[uMapとOverpass API(overpass turbo)を使ってOpenStreetMatsuyaマップを作る](http://www.nofuture.tv/diary/20150623.html)

### Overpass API

OpenStreetMap の地理情報を取得するための API です。

[OSM の Overpass API の説明](https://wiki.openstreetmap.org/wiki/JA:Overpass_API)

取得した情報のライセンスはODbL です。
オープンソースライセンスと同様に、共有、創作、翻案が行えます。

参考 : [オープンデータのライセンスを考える(9)ODbLの概要](http://okfn.jp/2012/10/29/opendata_license09/)

牛丼店の地理情報を取得するクエリは下記のようになる

```
OSMサーバー?data=[out:json];node["amenity"="fast_food"]["cuisine"="beef_bowl"];out;
```
約600件 登録されている。
全国の牛丼店の店舗数は 4000 店らいしので、網羅率は!5%くらいです。
網羅率を上げるのは、皆さんの協力が必要です。
興味を持った人はこちらから。
[ポケモンGOマッパーのためのOSM入門](https://qiita.com/nyampire/items/716bd4bf66a092044c85)

取得範囲を指定していないので、台湾に２店ほどあるが、気にしないことに。

## Google マイマップ に表示する

Google マイマップ に表示するために　KML ファイルを用意します。

overpass turbo を使うと、KML ファイルが取得できる。
しかし、マーカーの情報が表形式になって見難い。
![osm_turbo_info.png](https://qiita-image-store.s3.amazonaws.com/0/64075/8b555e84-f0cd-bf0c-e46d-1bff6a3455f7.png)

uMap のような可読性のある表示になるようにします。
![osm_umap_info.png](https://qiita-image-store.s3.amazonaws.com/0/64075/272cdd0d-400b-8572-d18f-1ce3fca7d2bf.png)

今回は、Python を使ってみました。

### Json を解析する

python のjsonライブラリを使います。

[Python 標準ライブラリ json](https://docs.python.jp/3/library/json.html)


```
import json

f = open('sample.json', 'r')
json_dict = json.load(f)

elements = json_dict["elements"]
for element in elements:

    lon = element["lon"]
    lat = element["lat"]
    tags = element["tags"]

    if "name" in  tags:
        name = tags["name"].encode('utf-8')
```

###  マーカーの情報を作成する

OSMのタグは多いので、どこまで対応するか悩ましい。
下記を参考にする。

 [OpenStreetMatsuya](https://wiki.openstreetmap.org/wiki/User:Okano_t/OpenStreetMatsuya)


```
    if "branch" in  tags:
        branch = tags["branch"].encode('utf-8')
        info += branch + LF
    if "opening_hours" in  tags:
        opening_hours = tags["opening_hours"].encode('utf-8')
        info += "営業時間: ".encode('utf-8') + opening_hours + LF
```

###  KML ファイルを作成する

python の simplekml ライブラリを使います。

[simplekml : A Simple KML creator](https://pypi.org/project/simplekml/)


```
import simplekml

kml = simplekml.Kml()

kml.newpoint( name=name, description=info, coords=[( lon, lat )] )
```

ソースコードの全体は下記に。

https://github.com/ohwada/Android_Samples/blob/master/tools/python/parse_osm_json.py

###  Google マイマップを作成する

下記からログインする。

https://www.google.co.jp/intl/ja/maps/about/mymaps/

KML ファイルをアップロードする。

作成した Google マイマップ

https://drive.google.com/open?id=1umeMxBGkTJIoPH2tXc2rAgbSSDeHINlI&usp=sharing

###  スクリーンショット

![osm_mymap.png](https://qiita-image-store.s3.amazonaws.com/0/64075/13c7fcbe-4825-699d-2daa-89a28b0c519c.png)

![osm_mymap_info.png](https://qiita-image-store.s3.amazonaws.com/0/64075/d8f9351f-2e7d-0375-5773-c2e705a0983c.png)
【PyTorch入門】第2回 autograd:自動微分

# はじめに
[PyTorch入門第1回](https://qiita.com/manaco/items/6a9e5d10c88931d4720a)では，pytorchの基本操作を行いました．ここら辺は，numpyやmatlabを触ったことがあるので行列操作は問題ありませんでした．頑張るのはここからです．DeepLearning初心者にとっては厳しいですね…．

# autograd
PyTorchのニューラルネットワークは`autograd`パッケージが中心になっています．`autograd`は自動微分機能を提供します．つまり，このパッケージを使うと勝手に微分の計算を行ってくれると言うことです．
これはdefine-by-runフレームワークです．define-by-runについては[ここ](https://cpp-learning.com/chainer_define-by-run/#Define_and_Run_Define_by_Run)を参照（まとめると，順伝播のコードを書くだけで逆伝播が定義できると言うことらしいです）．

# 勾配の計算

`autograd`については言葉で説明するより，実際のコードを見た方が理解が早いと思うので，簡単な式の勾配を計算するコードを参考に説明します．

##コードの全体像


```python
import torch

# テンソルを作成
# requires_grad=Trueで自動微分対象を指定
x = torch.tensor(1.0, requires_grad=True)
w = torch.tensor(2.0, requires_grad=True)
b = torch.tensor(3.0, requires_grad=True)

# 計算グラフを構築
# y = 2 * x + 3
y = w * x + b

# 勾配を計算
y.backward()

# 勾配を表示
print(x.grad)  # dy/dx = w = 2
print(w.grad)  # dy/dw = x = 1
print(b.grad)  # dy/db = 1
```

```text:実行結果
tensor(2.)
tensor(1.)
tensor(1.)
```

##コードの詳細

##計算グラフの構築
計算グラフは，　`requires_grad=True`で微分対象に指定されたtensorと，`Function`パッケージの２つで構築されます．

```python
# テンソルを作成
# requires_grad=Trueで自動微分対象を指定
x = torch.tensor(1.0, requires_grad=True)
w = torch.tensor(2.0, requires_grad=True)
b = torch.tensor(3.0, requires_grad=True)

# 計算グラフを構築
# y = 2 * x + 3
y = w * x + b
```

###requires_grad
`requires_grad`では，`requires_grad=True`とすることで微分対象のtensorを指定します．デフォルトでは`requires_grad=False`となっており，このままだと微分の対象にはならず，勾配にはNoneが返ります．`requires_grad=False`はFine-tuningで層のパラメータを固定したいときに便利だそうです．
実際に，`requires_grad=True`と指定すると，以下のように表示されます．

```python
x = torch.tensor(1.0, requires_grad=True)
print(x)
```

```text:実行結果
tensor(1., requires_grad=True)
```

###grad_fn
`autograd`には`Function`と言うパッケージがあります．`requires_grad=True`で指定されたtensorと`Function`は内部で繋がっており，この２つで計算グラフが構築されています．この計算グラフに計算の記録が全て残ります．生成されたtensorのそれぞれに`.grad_fn`という属性があり，この属性によってどの`Function`によってtensorが生成されたのかを参照できます．ただし，ユーザによって作られたtensorの場合`grad_fn`はNoneとなります．

```python
a = torch.tensor(1.0, requires_grad=True)
print(a.grad_fn)

b = a+2 # bは足し算(add)によって形成
print(b.grad_fn)
```

```text:実行例
None
<AddBackward object at 0x7f740ffc0eb8>
```

##勾配の算出

```python
# 勾配を計算
y.backward()

# 勾配を表示
print(x.grad)  # dy/dx = w = 2
print(w.grad)  # dy/dw = x = 1
print(b.grad)  # dy/db = 1
```

`backward()`を実行すると，グラフを構築する勾配を計算し，各変数の`.grad`と言う属性にその勾配が入ります．
Ruby on Railsコマンド一覧

# Railsアプリケーションの作成
```terminal
$ rails new アプリケーション名
```

# データベースの作成
```terminal
$ rails db:create
```

# migrateステータスの確認
```terminal
$ rails db:migrate:status
```

# migrate
```terminal
$ rails db:migrate
```

# バージョンを指定してmigrate
```terminal
$ rails db:migrate:up VERSION=2022xxxxxxxxxx 
```

# バージョンを指定してロールバック
```terminal
$ rails db:migrate:down VERSION=2022xxxxxxxxxx 
```

# コンソールの起動
```terminal
$ rails c
```

# サーバーの起動
```terminal
$ rails sever
↓　短縮系
$ rails s
```

# モデルを作成する
```terminal
$ rails g model [モデル名][属性名：データ型 属性名：データ型 ...] [オプション名]
```

# コントローラーを作成する
```terminal
$ rails g controller コントローラー名 [アクション名 アクション名 ...] [オプション]
```
CodableでarrayにもdictionaryにもなるAPIに遭遇した時の対処法

この記事を投稿したものの、この記事が見る方がいないことを祈ります。
僕だってこんなAPIに遭遇したくなかったし、遭遇するつもりもありませんでした。

```swift:hoge.swift
struct HourTable: Decodable {
  let fuga: String
  let minuteTables: [MinuteTable]
  enum CodingKeys: String, CodingKey {
    case fuga = "Fuga"
    case minuteTable = "MinuteTable"
  }
  init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    fuga = try container.decode(String.self, forKey: .fuga)
    minuteTables = hoge(container: container)
  }
}

func hoge(container: KeyedDecodingContainer<HourTable.CodingKeys> ) -> [MinuteTable] {
  let minuteTables = try? container.decodeIfPresent([MinuteTable].self, forKey: HourTable.CodingKeys.minuteTable)
  let minuteTable = try? container.decodeIfPresent(MinuteTable.self, forKey: HourTable.CodingKeys.minuteTable)
  
  if let minuteTables = minuteTables {
    return minuteTables ?? []
  } else if let minuteTable = minuteTable, let response = minuteTable {
    return [response]
  } else {
    return []
  }
}

struct MinuteTable: Decodable {
  let minute: String
  private enum CodingKeys: String, CodingKey {
    case minute = "Minute"
  }
  init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    minute = try container.decode(String.self, forKey: .minute)
  }
}
```

この問題が発生した理由として時刻表のAPIを受け取る時に時刻の時間(hour)と分(minute)の部分が別のテーブルになっており、例えば１時間に一本しかない時間帯の時刻表はminuteTableが１つしかないのでdictionary型(jsonで{}で囲まれているもの)で返していて、１時間に何本もあるものは当たり前ですがarray型(jsonで[]で囲まれているもの)で返していました。そのため上のコードのような対処が必要でした。

わざわざfuncを利用し、関数にした後、initの中に代入しているのはthrowsを利用していることでletで定義したものすべてがちゃんとその数の分だけdocodeしているのを確認する必要があったからです。
【Scala】filterに渡す述語の合成

# Javaの場合
`Java`の`Stream API`の`filter`メソッドの引数は`java.util.funcition.Predicate`型で、これは関数型インタフェースなのでラムダ式を渡すことができます。

例えば、以下のメソッドがあったとして、

```java
ava
private static final List<String> fruits = Arrays.asList("Apple", "Banana", "Grape", "Orange", "Pineapple");
    
private static List<String> filterFruits(Predicate<String> p) {
  return fruits.stream().filter(p).collect(Collectors.toList());
}

private static void print(List<String> fruits) {
  System.out.println(String.join(", ", fruits));
}
```

呼び出し側は以下のように記述できます。

```java
List<String> fruits = filterFruits(f -> f.endsWith("e"));
print(fruits); //Apple, Grape, Orange, Pineapple
```

手元に2つの `Predicate` オブジェクトがあって、それを合成して使いたいという場合は、 `Predicate#and` によって以下のように新しい `Predicate` オブジェクトを手に入れることが可能です。

```java
Predicate<String> p1 = f -> f.endsWith("e");
Predicate<String> p2 = f -> f.length() == 5;
fruits = filterFruits(p1.and(p2));
print(fruits); //Apple, Grape
```

# Scalaの場合
同じことを `Scala` でやるにはどうすればいいんだっけ？という話です。

`Scala` の `List[A]` 型の `filter` メソッドのシグネチャーは以下となっています：

`def filter(p: (A) ⇒ Boolean): List[A]`

受け取るのは、 `A型の引数を一つ取り、Boolean型の値を返す関数` です。（実体は `scala.Function1`）
`Java` の `Predicate` のような専用型ではないので、 `and` にあたるメソッドは持っていません。（関数合成用の `andThen` や `compose` は定義されています）

というわけで、implicit classを使って、 `(String) => Boolean` 型に対して `&` メソッドを生やしてあげましょう。

```scala
val fruits = List("Apple", "Banana", "Grape", "Orange", "Pineapple")

def filter(p: String => Boolean) = fruits.filter(p).toList

def print(fruits: List[String]) = println(fruits mkString ", ")

implicit class predicate2And(p1: String => Boolean) {
  def &(p2: String => Boolean): String => Boolean = s => p1(s) && p2(s)
}

val p1: String => Boolean = f => f.endsWith("e")
val p2: String => Boolean = f => f.length == 5

print(filter (p1 & p2))
```

補足すると、

```scala
s => p1(s) && p2(s)
```

は

```sala
s => p1.apply(s) && p2.apply(s)
```

と等しく、先に `p1` の関数を呼び出した後、 `p2` の関数を呼び出します。（ `&&` は短絡評価なので `p1` の結果が `false` ならばその時点で `false` が評価結果となります。

ちなみにジェネリクスを用いて汎用性を持たせるならば、以下のコードとなります。

```scala
implicit class predicate2And[T](p1: T => Boolean) {
  def &(p2: T => Boolean): T => Boolean = t => p1(t) && p2(t)
}
```
nock 小ネタ

nock は Node.js HTTPサーバのモックを作るツール

## リクエストを console.log する

```javascript
let scope = nock(url)
  .post('/api/v1', expectBody)
  .reply(200)
```

とか書いているところを

```javascript
let scope = nock(url)
  .post('/api/v1')  // expectBody は取り除く
  .reply(function(url, reqBody) {
    console.log(`request: ${reqBody}`)
    return 200
  })
```

のように変更する。

正しいはずの expectBody がマッチせず、body を確認したいときに便利。


## リクエストを外に出さない

```javascript
nock.disableNetConnect();
```

テストコードの頭のあたりにこれを書いておく。

url を typo したりでフックに失敗すると、実際にリクエストが外に出ていく。
つまり本番環境の URL が書いてあったりすると、意図しないデータが登録されてしまうので、そういった事故を防ぐことができる。
PowerShell を管理者権限で起動する方法

こんにちは。
Windows PowerShell を管理者権限で起動するには、下記のような各種の方法があるようです。実際にどれが動くか確かめる必要があるようです。

1. Windows ボタン（タスクバーの左端）をマウスで右クリックし、起動用メニューから選択し起動します。
1. ショートカットもしくはタスクバーのアイテムを用意して PowerShell を起動できるようにしておき、それをマウスで右クリックして選択し起動します。
1. 検索欄に ```powershell``` と入力すると起動用メニューが現れるので、マウスで右クリックして選択し起動します。
1. Windows ボタン（もしくは Windows + R）から起動用メニュー表示させ、「ファイル名を指定して実行」の入力欄に ```powershell``` と入力し、「Ctrl」+「Shift」キーを押しながら「Enter」もしくは ```OK``` を選び起動します。
1. 他にも、「[WindowsのPowerShellを管理者権限で起動する方法](https://qiita.com/syui/items/7d42d7e691010ee212fb)」などの方法もあるようです。

PowerShell 起動を常に管理者権限で行わせるための設定方法は、マウスで右クリックで PowerShell のプロパティを開き、「管理者として実行」（詳細設定）を設定します。
OpenMTCのインストール

OpenMTC [^1] とはM2M(Machine to Machine)通信の国際標準であるOneM2Mのリファレンス実装の一つである．


OpenMTCはオープンソースソフトウェアであり，その実装はGitHubにて公開されている[^2]．

今回は，GitHubで公開されているリポジトリを利用してOpenMTC SDKのインストールを行う．

[^1]: https://www.openmtc.org/index.html
[^2]: https://github.com/OpenMTC/OpenMTC

## 検証環境
筆者は以下の環境で実行した．

- Ubuntu 16.04
- python2.7.13
- OpenMTC **v1.2.1**


## インストール

### GitHubからクローン

リポジトリをクローンする．

```terminal
$  git clone https://github.com/OpenMTC/OpenMTC OpenMTC
```

### SDKのインストール
まず，SDKインストールに必要なツールをインストールする．

```terminal
$  sudo apt install python-pip libev-dev python-dev gcc make automake
$  pip2 install --user --requirement OpenMTC/openmtc-gevent/dependencies.txt
```

次に，SDKのインストールを行う．

```terminal
$  cd OpenMTC
$  sudo python setup-sdk.py install
```

### インストールの確認
正しくインストールされたか確認するには以下のコマンドを実行する．

```terminal
$  python2 -c "import openmtc; import openmtc_app"
```

正しくインストール出来ていれば，何も出力されずに終了する．

## デモの起動
<font color="red">**2019/02/26：デモの実行方法を修正しました．**</font>

ローカルホスト上でOpenMTCを実行してみる．
ターミナルを**4つ**起動する必要がある．

### バックエンドの起動

```terminal:terminal01
./openmtc-gevent/run-backend
```

### ゲートウェイの起動

```terminal:terminal02
./openmtc-gevent/run-gateway
```

### デモの起動

#### 値の送信

```terminal:terminal03
./doc/training/start-app.sh
```

実行するappを聞かれるのでここでは **1** を入力する．

>
[1] onem2m-ipe-sensors-final.py
[2] onem2m-ipe-sensors-actuators-final.py
[3] onem2m-gui-sensors-final.py
[4] onem2m-gui-sensors-actuators-final.py
Choose the app to start:

#### 値の取得

```terminal:terminal04
./doc/training/start-app.sh
```

実行するappを聞かれるのでここでは **3** を入力する．

>
[1] onem2m-ipe-sensors-final.py
[2] onem2m-ipe-sensors-actuators-final.py
[3] onem2m-gui-sensors-final.py
[4] onem2m-gui-sensors-actuators-final.py
Choose the app to start:

成功するとlocalhost上で「センサ，ゲートウェイ，バックエンド」の通信が実行される．

## 注意

2019年2月15日現在，OpenMTCはv1.3.0がリリースされておりpython3系に対応している．変更点は https://github.com/OpenMTC/OpenMTC/releases に記載されている．

>
Main improvement:
・Ported OpenMTC to python3
・Switched to Debian Stretch for docker images
Also a lot of small improvements and fixes

このバージョンで以下の手順を実行すると，バックエンドとゲートウェイの起動時に以下のエラーが発生する．

```console:エラー文
Traceback (most recent call last):
  File "src/openmtc_gevent/backend_main.py", line 1, in <module>
    import openmtc_gevent.main
  File "/home/YOUR_USER/OpenMTC/openmtc-gevent/src/openmtc_gevent/main.py", line 6, in <module>
    import gevent.monkey
ImportError: No module named 'gevent'
```

これを防ぐためにはgithubからフォルダをcloneした後に，`git checkout`コマンドで過去のブランチに切り替えておく必要がある．

```terminal
$  git clone https://github.com/OpenMTC/OpenMTC OpenMTC
$  cd OpenMTC
$  git checkout 7781b15c4e0c78b95a5a8c31d859fd72066b4823
```

あとは，上記の通りにSDKのインストールを実行すればよい．
Rでポイントパターン分析-分析エリアのマスキング

前回記事（[Rでポイントパターン分析](https://qiita.com/ishiijunpei/items/4234d78eacf2e7e7b8ef)）ではspatstatパッケージを利用したポイントパターンのクラスタリング識別とマーク付き点過程を紹介しました。

結果として、擦文の遺跡は縄文の遺跡の近くに立地することが明らかになりました。
![](https://camo.qiitausercontent.com/300bdbb973dd10626ad24a604105c127439974d3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f36303433382f66323163306232632d623338322d343566642d313238312d6234326565326661386466332e706e67)

この結果にやや不満を感じるのは、遺跡立地そのものが地形的制約をうけるため、マクロな視点では遺跡の立地は集中してしまうと考えられることです。
分析の前提がおかしいということになります。

## 遺跡の存在するエリアで分析エリアをマスクする

そこで、遺跡が立地するエリアを抽出し、分析領域を限定することにします。次の手順で進めます。

1. 遺跡から半径1000mのバッファポリゴンを作成する
2. バッファポリゴンを結合する
3. バッファポリゴンの範囲内領域として分析を行う

## 半径1000mのバッファポリゴン

まずは前回分析したところまでデータ読み込みと処理を進めます。

```r
### パッケージの読み込み
library(tidyverse)
library(sf)
library(GISTools)
library(spatstat)
library(ggthemes)
library(maptools)
### データ読み込み
map<-st_read(dsn="data/",layer="kokudo_gyousei_utm54")
point<-st_read(dsn="data/",layer="site")
###擦文と縄文に分類した新たなフィルード(class)を追加
point<-point%>%
	mutate(class = case_when(
		grepl("擦文",period)	 == TRUE ~ "sat",
		grepl("縄文",period)   == TRUE ~ "jou"
		))%>%
	filter(class=="jou" | class=="sat")	%>%
	dplyr::select(class)
point_df<-point%>%as.data.frame()	#pointをデータフレームに変換
coord<-st_coordinates(point)%>%as.data.frame()	#pointオブジェクトからxy座標を取り出す
point_join<-bind_cols(point_df,coord)	#point_dfとcoordを結合
point_join2<-point_join%>%filter(!grepl("NaN",geometry))	#NaNを除去（なぜか2行あった）
```

バッファ円を作成します。
オブジェクト「point」はsfクラスです。少し長いですが、spatstatパッケージで分析領域を定義するowinという種類のオブジェクトに変換するまでの手順となります。

1. st_buffer(dist=中心点からの距離,endCapStyle=バッファの形状)関数で半径1000mのバッファ円作成
2. st_union()関数で全てのバッファ円を結合
3. as("Spatial")でspクラスへ変換（sfクラスのままだとspatstatパッケージで扱えない）
4. as("owin")でspatstatパッケージのowinオブジェクトに変換

```r
buf<-point%>%st_buffer(dist=1000,endCapStyle = "ROUND")%>%
	st_union()%>%as("Spatial")%>%as("owin")
```

st_buffer()で作成した半径1000mのバッファ円。スケールが小さすぎるのでドットにしか見えませんが。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/60438/08d0edec-8474-638d-14bc-91f185165844.png)

st_union()でバッファ円を結合。これをspオブジェクト形式を通じてowinオブジェクトに変換します。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/60438/b432bad1-06a3-379a-6f48-2aa2f2542266.png)

## pppオブジェクトを作成

ppp()関数の引数windowにowinオブジェクトに変換した結合バッファ円（buf）を指定します。
これで、bufを対象領域とするpppオブジェクトになります。

```r
point_p<-ppp(point_join2$X,point_join2$Y,
	window=buf,
	marks=factor(point_join2$class))
```

対象領域が設定されているので、密度図は対象領域のみ算出されます。

```r
point_p%>%density()%>%plot()
```
![03.png](https://qiita-image-store.s3.amazonaws.com/0/60438/b5aa3d64-65a5-c634-44d5-c0c8e6a3e4b4.png)

## エンベローププロットの出力

```r
### cross-L関数によるエンベローププロット
point_p%>%envelope(Lcross,nism=99)%>%plot()
```
矩形の対象領域を設定したときに比べて、処理時間が大幅に増加します。
3時間ほどかかりました。
![Lcross_envelope.png](https://qiita-image-store.s3.amazonaws.com/0/60438/31b08646-76ed-1fb8-5b24-97a991b792cb.png)


対象領域が狭いうちは縄文と擦文の遺跡分布は互いに無関係に分布するようですが、対象領域が25kmぐらいになると縄文から離れたところに擦文遺跡が分布する傾向があるようです。

縄文遺跡が密集するいわゆる下海岸（南茅部地区や恵山地区）に擦文遺跡がほとんど見つかっていないことなどが影響しているのかもしれません。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/60438/c9cc4f7e-a6f4-7ca9-a59c-6d77d7ea75e3.png)

![density.png](https://qiita-image-store.s3.amazonaws.com/0/60438/69d81a63-e17d-21e4-fbc0-51fcb2d1bc67.png)
Django REST frameworkのディレクトリ構造を考えてみる

# はじめに
Djangoを使ってなにか作ろうと思ったとき、どこにファイルを設置したらBESTなんだろうか。
どういったディレクトリ構造だったら製造者は迷わずに作業を行うことができるのだろうか。
そう考えることがありました。
なので、個人的に考えたものを記載してみたいと思います。
※すみません。誰かにレビューしてもらったものではないのでご注意ください。

（内容薄くてすみません　笑）

# 目次
1. デフォルトでのディレクトリ構成
2. 検討後のディレクトリ
3. 課題
4. 結論

# １．デフォルトでのディレクトリ構成
以下は、チュートリアルを実行した場合に作られるディレクトリ構成です。
今回は、ECパッケージを作ることを想定としてプロジェクト作成しました。
アプリケーションは、顧客です。

ここで、大切だと思われるのは、アプリケーションを機能単位できるということです。
この機能に対して、GET,POST,PUT,DELETEを行っていく形になるためですね。


```
$ django-admin startproject ec
$ cd ec
$ python manage.py startapp customer
```
上記実行後のディレクトリ構成
<img width="301" alt="skitch.png" src="https://qiita-image-store.s3.amazonaws.com/0/154145/fbec5f5a-d866-8912-ca59-2832b22f0225.png">


# ２．検討後のディレクトリ構成

【追加／変更点】

・設定ディレクトリの名前を変更
　settings.py、wsgi.pyなど入っているフォルダ名を「config」に変更

・models.pyをアプリケーション共通として使えるように配置
　customer内にmodels.pyが作成されていると思いますが、今後　商品表示、カート、受注などの機能が
　追加された場合を想定し、共通的な場所に配置（ecプロジェクト直下）

・utilsフォルダの追加
　customerフォルダ配下に、顧客系の共通で利用する処理などあればファイルを作成する

・message定義ファイルの作成
　customerフォルダに、メッセージ定義ファイルを作成する

・filter定義ファイルの作成
　customerフォルダに、顧客検索時の検索条件定義するfilterファイル
　（※django-filterライブラリのインストールが必要）

・serializerファイルの作成
　Django REST frameworkでビューとモデルの橋渡しを行う重要なファイル

<img width="283" alt="modify.png" src="https://qiita-image-store.s3.amazonaws.com/0/154145/71523bb7-d128-d3ea-6617-c242064a95bd.png">


# ３．課題

・機能をまたいでの、共通的な処理をどうすべきか
　現状機能単位で、messageなどの管理を行っているが、共通的なメッセージはどう管理するか

# ４．結論
　プロジェクトのディレクトリ構成は、プロジェクトの規模、内容、拡張性を
　どこまで考えるかなどによって変わってきます。
　これだ！という正解はないと思いますが、最善を尽くせるようにしていきたいですね。

※もし皆さんご見解などありましたら、コメントお願い致します。少しでもベスト・プラクティスに
　近づけていければと思います。
RxKotlinでFlowables.combineLatest(Iterable<Flowable<T>>)が見当たらない

RxKotlin 2.3.0です。

RxKotlin + ラムダで華麗にストリームを結合していたんですが、可変個のFlowableをcombineLatestしようとした際にFlowablesに定義されてないことに気づきました。

固定個だと9個までは用意してくれている

```kotlin:RxKotlin/src/main/kotlin/io/reactivex/rxkotlin/Flowables.kt
@CheckReturnValue
@BackpressureSupport(BackpressureKind.FULL)
@SchedulerSupport(SchedulerSupport.NONE)
inline fun <T1,T2,T3,T4,T5,T6,T7,T8,T9,R> combineLatest(source1: Flowable<T1>, source2: Flowable<T2>,
                                                        source3: Flowable<T3>, source4: Flowable<T4>,
                                                        source5: Flowable<T5>, source6: Flowable<T6>,
                                                        source7: Flowable<T7>, source8: Flowable<T8>,
                                                        source9: Flowable<T9>, crossinline combineFunction: (T1,T2, T3, T4, T5, T6, T7, T8, T9) -> R) = 
        Flowable.combineLatest(source1, source2,source3, source4, source5, source6, source7, source8, source9,
                Function9 { t1: T1, t2: T2, t3: T3, t4: T4, t5: T5, t6: T6, t7: T7, t8: T8, t9: T9 -> combineFunction(t1,t2, t3, t4, t5, t6, t7, t8, t9) })!!
```

んですが、10個以上や一覧取得で返ってきた可変個のIDで詳細APIを呼び出したいといった際に困ってしまいます。
# 結論
`Iterable<Flowable<T>>.combineLatest()`として存在しました。

```kotlin:RxKotlin/src/main/kotlin/io/reactivex/rxkotlin/flowable.kt
/**
 * Flowable.combineLatest(List<? extends Flowable<? extends T>> sources, FuncN<? extends R> combineFunction)
 */
@Suppress("UNCHECKED_CAST")
@SchedulerSupport(SchedulerSupport.NONE)
@CheckReturnValue
@BackpressureSupport(BackpressureKind.FULL)
inline fun <T : Any, R : Any> Iterable<Flowable<T>>.combineLatest(crossinline combineFunction: (args: List<T>) -> R): Flowable<R>
        = Flowable.combineLatest(this) { combineFunction(it.asList().map { it as T }) }
```
https://github.com/ReactiveX/RxKotlin/blob/2.3.0/src/main/kotlin/io/reactivex/rxkotlin/flowable.kt
# 探してます
同様に`Sigle.zip(Iterable<Single<T>>)`も見当たりません。

`Iterable<Flowable<T>>.zip()`はあるので、`toFlowable()`で変換してしまう。
もしくは、自分でExtension書くなりすればいい話ではあるんですが。。。
試験(test)についての立場の違い

スピード感重視なのでテストは書かない。テストはなぜ開発を遅くするか
https://qiita.com/aimof/items/d68bdb347283ee2dbccf

>この記事の対象は「テストを書く技術がなく、テストを書く気がない」組織に所属する人です。

に触発された記事です。

試験(test)について、プログラマに限定して、どれくらい立場の違いがあるかを記載します。

# 1. 装置運転(device driver)

どういう試験をしたら、IC, 装置(device)が機能したかを確かめる試験プログラムから書き始めることがあります。
監視(monitor)という機能の場合もあります。

類似の装置のプログラムを作ったことがある場合で、今回新たな想定していない機能はない場合には、すでに必要な試験の道具が揃っていて、試験プログラムを書く必要がないかもしれません。


# 2. OS, Kernel
POSIX Test Suiteのような仕様に対する試験があらかじめ用意されていて、それに通ればよい。
また、通らない項目は、顧客がOKすればよい。
すべてのOS, Kernelの機能が必要とは限らない。

試験をするのは、ほぼ自動でできる。

どの試験は、今回通らなくてもいいかどうかの判断が必要になることがある。
ここに判断するのが面倒だから、すべて通しておけという選択肢は好ましくない。

すべての機能を組み込むと、メモリの消費と時間の消費が増える可能性があり、
今回のシステムのメモリ消費と時間消費の目標値を達成しないかもしれない。

#3. Package Soft
出荷の判定は、出荷側が決めることができる。
実際には、市場調査し、どのような試験を実施したものが、
受けがいいか、出荷後の反応がいいかなどに基づいて試験する事項を決める。

細かい点は、アルファ出荷期間、ベータ出荷期間の間の利用者からの報告などに基づいて修正してもよい。

細かい試験は、利用者にお願いするものである。

利用OSの種類、対応版の数、対応言語の数が多いと、出荷側での試験は至難の技である。

同時に動いているソフトウェアによる挙動の違いなど出荷側よりも、実際に利用側で試験してもらった方が楽なこともある。

#4. 請負
請負仕事の場合に、顧客から受け入れ仕様が提示されていなかったり、顧客側が受け入れ試験をしない場合に、試験をせずに出荷する選択肢はありうる。

顧客側から受け入れ試験ソフトを渡され、請負側で試験をすることもある。
顧客側から受け入れ試験ソフトの開発を委託され、請負側で試験をすることもある。

試験をせずに出荷するのは、顧客側が受け入れ試験ソフトの開発を委託していないことが悪いのかもしれない。
JupyterからPostgresに接続する

# 環境
・Windows 10
・Anaconda　
・psycopg2 2.7
・Jupyter

# 前提
前提としてPostgresのインスト―ル、テーブル作成、データ投入は終わっているものとします。
また、AnacondaやJupyterのインストールも終わっているものとします。

# SQLをとにかく実行する
アプリケーション同様、Postgres関連のモジュールをインポートし、カーソルを用意して
SQLを実行するだけ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/329816/5647fc8a-5824-72b7-b11d-4ede93484bd6.png)

# SQLを実行してPandasのDataFrameに読み込む
pandasのread_sqlメソッドにsqlとconnectionを与えるだけ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/329816/b3cde986-d9e3-5f9e-5d5f-c070f624aea9.png)
【Ruby on Rails】Cloud9からUbuntuへ環境移行。git cloneし、localhostで接続するまで

プログラミングスクールではCloud9で開発を行っていましたが、最近はWSL(Ubuntu)で作業しています。
Cloud9で作業していたポートフォリオをUbuntuの方で修正を行いたかったため、環境を移行しました。

#予想される必要な作業
* Rubyのバージョンを合わせる。
* Cloud9ではmySQL,UbuntuではPostgreSQLを使用していたため、現在の環境にMySQLをインストールorプロジェクトのデータベースの設定をPostgreSQLに変更。

#git clone~gemのインストール
まずはgitclone後プロジェクトのディレクトリに移動し、対応するRubyのバージョンをインストール。

```bash
$ rbenv install 2.4.1
```

Rbenvで管理されているバージョンを確認すると正しくインストールされている。

```bash
~$ rbenv versions
  2.4.1
  2.4.2
* 2.5.1 (set by /home/tkr_ld/.rbenv/version)
```

ローカルのRubyのバージョンを設定。

```bash
$ rbenv local 2.4.1
```
確認。

```bash
$ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
```
次にMySQLをインストール。

```bash
sudo apt install mysql-server mysql-client
```
gemをインストール。

```bash
$ gem install bundler
```
```bash
$ bundle install
```

下記のエラーが。

```bash
An error occurred while installing mysql2 (0.4.10), and Bundler cannot continue.
```
エラー文を読むとlibmysqld-devのライブラリが必要なようだったのでインストール。

```bash
$ sudo apt-get install libmysqld-dev
```

再度bundle installすると成功。

```bash
Ruby Sass is deprecated and will be unmaintained as of 26 March 2019.

* If you use Sass as a command-line tool, we recommend using Dart Sass, the new
  primary implementation: https://sass-lang.com/install

* If you use Sass as a plug-in for a Ruby web framework, we recommend using the
  sassc gem: https://github.com/sass/sassc-ruby#readme

* For more details, please refer to the Sass blog:
  http://sass.logdown.com/posts/7081811
```

#MySQLの接続設定

データベースを作成してみる。

```bash
$ bin/rails db:create
```
```bash
#<Mysql2::Error: Access denied for user 'root'@'localhost'>
```
どうやらrootで接続できていないようです。調べてみるとMySQLではdatabase.ymlにデータベースの接続ユーザーを設定する必要があるとのこと。
そこでデータベースのユーザーを作成。

```bash
$ sudo mysql
```

```bash
mysql> CREATE USER 'railsuser'@'localhost' IDENTIFIED BY 'mypassword';
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'railsuser'@'localhost';
Query OK, 0 rows affected (0.00 sec)
```
database.ymlに設定。

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: railsuser #設定したユーザー
  password: mypassword #設定したパスワード
  host: localhost
```
データベースを作成。

```bash
$ bin/rails db:create
Created database 'tasklist_development'
Created database 'tasklist_test
```
データベースが作成されたことが確認できたので、マイグレーションを実行。

```
$ bin/rails db:migrate
```

サーバーを起動。

```
$ bin/rails s
```

#最後に
起動できました。もし捕捉や修正などありましたら、コメントを頂けると幸いです。

#参考にした記事

[RailsをMySQL対応した方法](https://qiita.com/gabacho/items/d5c8f0dcab3921878fa4)
[Railsアプリ開発に途中から参加する場合の環境設定](https://qiita.com/yh2020/items/efd888854acf89af5ca7)
gitのブランチ名をターミナルで表示できるようにする

以前、デザイナー向けターミナル色変更の記事を書いた。
[Macのターミナル（bash）を最低限色付けする](https://qiita.com/lemtosh469/items/81919186611ac68b11c8)

上記の記事に地味にいいねを付けていただけるので需要あるのかもと思い、
続きのgitのブランチ名表示の設定もできるようにしてみる。

なにも設定していなくても作業できてしまうけど、さすがにブランチ名くらいは出ていないと作業に支障出ることもあるのでは？
ということで今回も10分くらい（インストールとかに時間取られるのでもう少しかかるかも）でできるgitのブランチ表示のための設定をしていきます。

## 設定するとできるようになること

- ブランチ名の表示

| Before | <img src="https://qiita-image-store.s3.amazonaws.com/0/55003/d0ee9cd1-00e7-8a5a-0207-6ab3000f4b11.png" width=300> |
|--------|------|
| **After** | <img src="https://qiita-image-store.s3.amazonaws.com/0/55003/9c5daea1-1a9a-1a1c-9799-70a7797ca41c.png" width=300> |


## はじめに

[Macのターミナル（bash）を最低限色付けする](https://qiita.com/lemtosh469/items/81919186611ac68b11c8)
が完了している前提で進めます。

次にエンジニアでない人に限らず、使われていないターミナルはbrewが最新状態になっていないことが多いので、とりあえず下記コマンドでアップデートを済ませます。

```
$ brew update
```

※アップデート時にエラーが出るケースがある。（エンジニアに助けてもらおう！自分で解決しようとしてもなかなか大変なので。）
[MacOS High SierraでHomebrewの更新(`brew update`)ができない場合の対処](https://qiita.com/d_forest/items/43fbd0257dea712aa067)

## gitを設定していく

### gitのインストール

```

$ brew install git
```

### 下記のコマンドを打って、同じ結果が返ってくるか確認する
```
$ which git
/usr/local/bin/git
```

### ファイルの存在を確認する

```
$ ls /usr/local/etc/bash_completion.d/
brew            git-completion.bash git-prompt.sh
```
`git-completion.bash` と `git-prompt.sh` のファイルがあることを確認する。

### bashrcに記述を追記する
```
$ vi ~/.bashrc
```

`i` を押してから、gitの設定を追加する。

```~/.bashrc
# gitの設定（下記3行を.bashrcの一番上に追加する）
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
```

続いて、前回の記事で追加済みの下記の `PS1=` の行を修正する。後ろのほうに `$(__git_ps1)\[\033[00m\]` を追加するのですが、 `PS1=` の行をまるごと置き換えちゃうのがミスも起きなくてよいと思います。（表示のための数字指定も地味に変更しているので...）

```~/.bashrc

# 変更後

# default:cyan / root:red
if [ $UID -eq 0 ]; then
    PS1='\[\033[31m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\\$ '
else
    PS1='\[\033[36m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\\$ '
fi
```

（ 豆知識: `esc` を押してから、 任意の行で `dd` とキーボードを押すと行単位で一行まるごと消せます。）

キーボードの `esc` ボタンを押してから `:wq` と入力してファイルを閉じる．

## 設定を反映する

```
$ source ~/.bashrc
```

こんな感じで表示されるようになりました！！

<img src="https://qiita-image-store.s3.amazonaws.com/0/55003/9c5daea1-1a9a-1a1c-9799-70a7797ca41c.png" width=500>



## 適当なレポジトリをcloneしてきて動作確認する

```
$ mkdir dev
$ cd dev

$ git clone https://github.com/as/a.git
Cloning into 'a'...
remote: Enumerating objects: 22, done.
remote: Counting objects: 100% (22/22), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 1470 (delta 6), reused 18 (delta 5), pack-reused 1448
Receiving objects: 100% (1470/1470), 1.65 MiB | 222.00 KiB/s, done.
Resolving deltas: 100% (910/910), done.

$ cd a/

pc名@ユーザー名:~/dev/a (master)$ git checkout -b new-branch
Switched to a new branch 'new-branch'
pc名@ユーザー名:~/dev/a (new-branch)$ 
```

終わりです。bashでコマンドの履歴表示とかできるのかな？
もし気が向いたら書きます。

参考：
[Macのターミナル画面にブランチ名を表示させるようにする](https://bottoms-programming.com/archives/terminal-branch-name.html)