OmniAICreator/Qiita-1.07M huggingface dataset:
datetime_selectでdefaultの値を特定の時間に設定する

#やりたいこと
申込みフォームのを開いたときdatetime_selectのデフォルトの値をその日の17時に設定したい。


#解決方法
普通にdatetime_selectを使った場合は

```_form.html.haml
  .form-group
    = f.label :date, class: "col-sm-3 control-label"
    = f.datetime_select :date, {}, class: 'form-control form-control-inline'
```

下のように今の時間が表示される
<img width="373" alt="スクリーンショット 2018-10-10 10.04.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/281558/fc4e3d1e-e52c-88c3-c7dc-fcc3554dce24.png">

デフォルトでの時間を設定したい場合は、、、

```_form.html.haml
  .form-group
    = f.label :date, class: "col-sm-3 control-label"
    = f.datetime_select :date, {default: Date.today + 19.hour}, class: 'form-control form-control-inline'
```
とすることで設定できる
<img width="356" alt="スクリーンショット 2018-10-10 10.07.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/281558/5b20048c-deea-573f-47ab-e924acc302f5.png">


##より細かく指定したい場合は
年・・・" + hoge.year"
月・・・" + hoge.month"
日・・・" + hoge.day"
時間・・・" + hoge.hour"
分・・・" + hoge.minute"

のように書けば細かく指定できる

###例えば、、、
{default: Date.today + 17.hours + 30.minutes}みたいなふうに指定してあげれば
<img width="380" alt="スクリーンショット 2018-10-10 10.17.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/281558/fdaee761-5473-14fe-f9c8-19e4f2e5565f.png">


というふうになる




#参考文献
http://railsdoc.com/references/Date
http://railsdoc.com/references/datetime_select
Swift4.0→4.2でEnumEnumerableが不要になった

iOS12.0 対応で Xcode 10 にして Swift 4.2 対応した。
基本的にAll Fix Issuesでポチポチやれば良いが、
Enumのcountが取れずテーブルビューが表示されなくなった。
これまではEnumを自前で実装する必要があったので、
EnumEnumerableを使っていたが、Swift4.2の新機能CaseIterableでいけることに気付いた。

#使ってたやつ
**EnumEnumerable**

```swift:EnumEnumerable.swift
protocol EnumEnumerable {
    associatedtype Case = Self
}

extension EnumEnumerable where Case: Hashable {
    private static var iterator: AnyIterator<Case> {
        var n = 0
        return AnyIterator {
            defer { n += 1 }
            
            let next = withUnsafePointer(to: &n) {
                UnsafeRawPointer($0).assumingMemoryBound(to: Case.self).pointee
            }
            return next.hashValue == n ? next : nil
        }
    }
    
    static func enumerate() -> EnumeratedSequence<AnySequence<Case>> {
        return AnySequence(self.iterator).enumerated()
    }
    
    static var cases: [Case] {
        return Array(self.iterator)
    }
    
    static var count: Int {
        return self.cases.count
    }
}

```

#CaseIterable

リファレンス: https://developer.apple.com/documentation/swift/caseiterable

Swift 4.2 では enum の件数が自前で実装しなくてもとれるようになった。

```swift

enum Element: CaseIterable { case hoge, piyo, fuga, hogehoge }

Element.allCases         // returns some Collection whose Iterator.Element is Element
Element.allCases.count   // returns 4
Array(Element.allCases)  // returns [hoge, piyo, fuga, hogehoge]
```

#結論
- EnumEnumerable削除
- "EnumEnumerable" → "CaseIterable"にReplace
- 一度ビルドしてエラーの箇所を.count→.allCases.countに修正

.countをReplaceで一気にやれればいいけど、Enum以外も引っかかってしまうのでそこはちょっと面倒でした。
システム工学演習　１０月１０日　２１藤村

メカトロニクス　第２週　演習　５H（21）氏名　　　藤村　京　　　　　
１）	第１週資料中にあるヘロンの扉の動作原理を説明せよ。
燭台に火を灯すと、地下のタンク内の空気が暖められ膨張し、タンク内の水がパイプを通って水受け容器に移動する。その容器が水の重みで移動することにより扉と繋がっている柱が回転し、扉が開く。

２）	自分自身が考えていたメカトロニクスについて，以下の頃考えていたイメージについて述べよ。
(ア)	高専入学前
機械分野と電子分野が融合して昇華した新しい分野
(イ)	コース配属が決まる前
同上
(ウ)	この授業を受ける前
機械と電子それぞれの重要な知識が得られる分野

３）	アクチュエータは一般に３種類に分類される。その３種類を示し，簡単に説明せよ。
(ア)	１つ目：電気
安定した動作が実現できる
大出力の制御に向かない
(イ)	２つ目：空気圧
クリーンで即応性のある制御が実現できる
構成が複雑
(ウ)	３つ目：油圧
大出力の制御に向いている
油漏れの危険がある

４）	３）以外のアクチュエータとして，ニューアクチュエータといわれる新しい原理に基づくアクチュエータがいくつかある。ニューアクチュエータをひとつ調べ，紹介せよ。
人工筋肉：効率の良い装置の開発に役立つと考えられるほか、装置の小型化にも役立つことが期待されている。
５）	人間のセンサ部，アクチュエータ部，コンピュータ部，メカニズム部に相当する部位を述べよ。
(ア)	センサ部
目、鼻、耳、舌、皮膚
(イ)	アクチュエータ部
筋肉
(ウ)	コンピュータ部
脳
(エ)	メカニズム部
骨格

６）	人間のセンサ部に相当するセンサ素子を３種類調べ，述べよ。
(ア)	１つ目：目
超音波センサ
(イ)	２つ目：耳
音センサ
(ウ)	３つ目：皮膚
感圧センサ

７）	最近，これはすごいと思った機械・電機・電気電子・情報技術の名称を示し，その内容を説明せよ。
AIoT：人工知能とIoTを融合させた技術。IoT製品に人工知能を搭載することで、製品の性能が使用ごとに向上するようになる。
Nuxt.js 2でYoutubeプレイヤー埋め込み


調べると

* https://github.com/anteriovieira/vue-youtube
* https://github.com/kaorun343/vue-youtube-embed

## kaorun343/vue-youtube-embedがNuxt2のuniversalモードで動かなかった

の二つが出てきました。 `kaorun343/vue-youtube-embed`の方がよく使われてそうなのですが、Nuxt.jsの`spaモード`だと動作して`universalモード`だとエラーが発生して動かなかったです。

* `Unexpected token export`
* `render function or template not defined in component: anonymous`

などのエラーです。

[Using vue-youtube-embed in Nuxt.js ](https://github.com/kaorun343/vue-youtube-embed/issues/44)にある方法や[render function or template not defined in component: anonymous](https://github.com/nuxt/nuxt.js/issues/1041)、[Import vue plugin correctly (unexpected token import) ](https://github.com/nuxt/nuxt.js/issues/1896)などをみつつ試したけどエラー回避できず

## nteriovieira/vue-youtubeで動作した

エラー調査が疲れたので別の方が作ってるこちらで試したらうまく動いたのでこちらを使っていきます。

readmeに書いてる内容でそのまま動作します。

> https://github.com/anteriovieira/vue-youtube

インストール

```
npm install vue-youtube
```

* pages/index.vueをまるっと

```index.vue
<template>
  <section class="container">
    <div>
      <h1 class="title">
        youtubeのテスト
      </h1>
      <youtube
        ref="youtube" 
        :video-id="videoId"
        :player-vars="{autoplay:1}"
        @playing="playing"
        @paused="paused"
        @ended="ended"
      />
    </div>
  </section>
</template>

<script>
import Vue from 'vue'
import VueYoutube from 'vue-youtube'
 
Vue.use(VueYoutube)

export default {
  components: { 
  },
   data () {
    return {
      videoId: 'oy-HyrxsPJE',
    }
  },
  
  methods: {
    playVideo() {
      this.player.playVideo()
    },
    //再生スタートした際に発火
    playing() {
      console.log('\o/ we are watching!!!')
    },
    //一時停止した際に発火
    paused() {
      console.log('paused')
    },
    //再生終了した際に発火
    ended() {
      console.log('ended')
    }
  }
}
</script>

<style>

.container {
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
}

.title {
  font-family: 'Quicksand', 'Source Sans Pro', -apple-system, BlinkMacSystemFont,
    'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  display: block;
  font-weight: 300;
  font-size: 100px;
  color: #35495e;
  letter-spacing: 1px;
}

.subtitle {
  font-weight: 300;
  font-size: 42px;
  color: #526488;
  word-spacing: 5px;
  padding-bottom: 15px;
}

.links {
  padding-top: 15px;
}
</style>
```

こんな感じで動きます 再生、一時停止、停止などのイベントも取れてやりたいことできたのでこっちが良さそう。

![](https://i.gyazo.com/cc373430ea67b770359667cede2a43d2.jpg)
Kotlinの簡単な基本構文

#はじめに
現場が代わりKotlinでAndroidのアプリケーションを書くことになった。
今までJavaで書くことが多かっったため
今後自分が書き方を忘れた時のメモとしてJava、Kotlinでの基本構文の書き方を残しておく


##前提
- paizaで動作確認
 - https://paiza.io/en
- Kotlinの場合末尾に`;`をつけなくてもいい

###出力
- Java

```
#Systemクラスからprintlnを呼び出す
System.out.println("出力");
```
- kotlin

```
#printlnを呼び出す
println("出力")
```
##コメントアウト
- Java、Kotlin

```
//1行のコメントアウト
/*
この中に入っているものはコメントアウトされる
*/
```
##型
|  | Java | Kotlin |
|:-:|:-:|:-:|
| Double  | 64ビット浮動小数点数(小文字で使用)  | 64ビット浮動小数点数  |
| Float | 32ビット浮動小数点数(小文字で使用)  | 32ビット浮動小数点数  |
| Long  | 64ビット符号付き整数(小文字で使用)  | 64ビット符号付き整数  |
| Int  | 32ビット符号付き整数(小文字で使用)  | 32ビット符号付き整数  |
| Short  | 16ビット符号付き整数(小文字で使用)  | 16ビット符号付き整数  |
| Byte  | 8ビット符号付き整数(小文字で使用)  | 8ビット符号付き整数  |
| Char  | １文字を表す文字型(小文字で使用)  | １文字を表す文字型  |
| Boolean  | 真偽値(小文字で使用)  | 真偽値  |
| String  | 文字列  | 文字列  |
##変数
- Java

```
String name = "ryo chiba"
```
- kotlin

```
var name:String = "ryo chiba"
```
##定数
- Java

```
// finalをつけることで定数になる(変更不可)
final String name = "ryo chiba"
name = "chiba ryo" //エラーになる
```
- kotlin

```
fun main(args: Array<String>) {
    // Your code here!
    Constants.name
    Constants.name = "chiba ryo" //エラー
}
// companion objectにconstをつけることで定数になる
class Constants {
  companion object {
    const val name = "ryo chiba"
  }
}
```

##配列
1,2,3のint型の値を入れる
- Java

```
#パターン１
int[] no = {1, 2, 3};

#パターン2
int foo[] = new int[3];
no[0] = 1;
no[1] = 2;
no[2] = 3;
```
- kotlin

```
#パターン1
val no: IntArray = intArrayOf(1, 2, 3)

#パターン2
val no: MutableList<Int> = mutableListOf()
no.add(1)
no.add(2)
no.add(3)
```

##if文
- Java

```
int no = 1;
if(no > 0){
  System.out.println("0以上");
} else {
  System.out.println("0以下");
}
```
- kotlin

```
var no:Int = 1
if(no > 0){
  println("0以上")
} else {
  println("0以下")
}

#式として扱う事もできる
var no:Int = 1
val anser = if (no > 0) { 
  "0以上"
} else { 
  "0以下" 
}
```

##Switch(when)
- Java

```
int no = 1;
switch (no){
  case 0:
    System.out.println("0です");    
    break;
  case 1:
    System.out.println("1です");
    break;
  default:
    System.out.println("0と1以外です");  
}
```
- kotlin

```
var no:Int = 1
when (no) {
  0 -> print("0です")
  1 -> print("1です")
  else -> print("0と1以外です")
}
```

## for
- Java

```
#for
for(int i=0; i<3; i++){
  System.out.println(i);
}

#配列でfor文
int[] no = {1, 2, 3};
for (int data: no){
  System.out.println(data);
}
```
- kotlin

```
#for
for (no in 1..3){
  println(no)
}

#配列でfor文
val no: IntArray = intArrayOf(1, 2, 3)
for (data in no) {
  print(data)
}
```

## while
- Java

```
int no=0;
while(no < 10) {
  no++;
  System.out.println(no);
}
```
- kotlin

```
var no:Int = 0
while (no < 10) {
  x++
  println(no)
}
```

#終わりに
今回は普段よく使いそうな構文のみをまとめてみたが、まだ利用できていない書き方や使い方が多々有るので
またKitlinを実際に利用してみてわかったことなどをまとめたいと思います。
また、Kotlinで書き方を忘れた人がこの記事をみて思い出してくれたりしてくれたらなと思います:blush:
Goolge Cloud API：PCの時刻がずれていると、503のエラーが発生する


# 環境
* Python 3.6
    * google-cloud-vision 0.34.0
* Windows10 

2018/10/10に実行

# 背景
Google Cloudクライアントライブラリを使って、Cloud Vision APIにアクセスしたいです。

以下のサイトに従って、次のサンプルコードを実行しました。
https://cloud.google.com/vision/docs/libraries#client-libraries-resources-python

```python
import io
import os

# Imports the Google Cloud client library
from google.cloud import vision
from google.cloud.vision import types

# Instantiates a client
client = vision.ImageAnnotatorClient()

# The name of the image file to annotate
file_name = os.path.join(
    os.path.dirname(__file__),
    'resources/wakeupcat.jpg')

# Loads the image into memory
with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

image = types.Image(content=content)

# Performs label detection on the image file
response = client.label_detection(image=image)
labels = response.label_annotations

print('Labels:')
for label in labels:
    print(label.description)
```    

# 問題

`response = client.label_detection(image=image)`の部分で、次のエラーが発生しました。

>
ServiceUnavailable: 503 Getting metadata from plugin failed with error: 
('invalid_grant: Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values and use a clock with skew to account for clock differences between systems.', )

JWTに関する用語が分からなかったので、調べました。

* JWT : JSON Web TOken
* iat：issued at. JWT を発行した時刻を示す
* exp：expiration time. JWT の有効期限を示す

https://openid-foundation-japan.github.io/draft-ietf-oauth-json-web-token-11.ja.html#expDef 引用

「clock with skew」の意味は分かりませんでした。

# 原因
PCの時刻が約12時間ずれていたことが原因でした。正しい時刻に設定し直したら、上記のコードは動きました。
PCの時刻がずれていたことは気づいていましたが、問題ないと思い放っていました。時刻は常に正しい状態にすべきですね。

# 参考サイト

https://qiita.com/chatrate/items/847bb5e06d80266b58f3

BigQueryなどでも同様のメッセージが出るので、どうやらGCP共通のエラーメッセージのようです。
初心者が統計学について学んだことをまとめていく①

# 初心者が統計学について学んだことをまとめていく①
今月から統計について学んでいます。
統計学について学んだことを徐々に記載していければと思います。

## 経緯
機械学習を本格的に勉強し、実務で使い始めて2か月が経ちました。
やっと自分が何を勉強しなければいけないのかが見えてきた頃です。
私の場合、機械学習に関する背景の知識が足りないがため、モヤモヤすることが多々起きています。
このモヤモヤを解消すべく、統計学の基礎を学び、そこからさらに必要な知識を身につけていきたいと思いました。

## 統計的手法の種類
- 記述統計学
- 統計的推測

今回は統計的推測に的を絞ってまとめていきます。

## 統計量
データの特徴を一つの数値にしたものです。

具体的に統計量は、下記のことをさしています。
- 平均値
- 分散
- 標準偏差


## 統計的推測
1. 母集団の中から分析に使用するものを選ぶ
2. 選んだものを分析
3. その母集団について推測を行う

要約すると、**部分から全体について**推測すること。
知りたいことは、**母集団について**である。

この母集団で重要な特性を持つのが、`母平均`と`母分散`です。
理由は、母集団が正規分布の場合、この2つの値で母集団の大きさを表すことができるためです。

でこの2つを知るために必要なものが、下記。

【部分】　　　【全体】　　　　
`標本平均`　→　`母平均`　
`標本分散`　→　`母分散`　

ちなみに標本が全体の中の一部分ということで理解しています。



### 標本の抽出種類

- 単純無作為抽出法(単純ランダムサンプリング)
母集団の各要素が、標本に含まれる確率を等しくする方法。

- 系統抽出法
母集団に通し番号をつけて、ランダムに一番目の標本を抽出する。
そこから等間隔で（抽出間隔ごとに）標本を抽出する方法。

- クラスター抽出法(集落抽出法)
母集団をいくつかのクラスター(グループ)に分け、グループの中からランダムに抽出する。
そしてグループに関することをすべて調査する方法。

上記の他にもいろいろな抽出方法がある。

- 層化抽出法
- 二段抽出法



## よく統計学で使用される記号
```
N　→　母集団の大きさ
σ　→　母分散　　　　
μ　→　母平均
```
サーバーレスな何かについて

初記事です。業務で教わったこととか書いていけたらと思います。

##きっかけ
今日業務でaaapiとかrest apiのお話をしてその際にサーバーレスについて先輩にざっくり教わった。
その際に少し説明が印象的だったのでメモ。

###サーバーレスとは
サーバーを意識しないようにした仕組みのこと。AWSとか
リソースを置いておくと「いい感じ」に処理をしてくれるらしい。
>[サーバーレスのメリット＆本質を、AWS Lambdaを使って理解しよう](https://employment.en-japan.com/engineerhub/entry/2018/07/03/110000)


###ラムダ
上述の「いい感じ」にやってくれるサーバーレスな関数群。
nodeとか実行に必要なリソースを配置するといい感じに(ry
>[AWS Lambda とは](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)

#まとめ
AWSで提供している仕組みにラムダがあって、それらはサーバーレスで動いているよ。

#感想
先輩の会話がラムダラムダでラムダ式か何かだと思ったけど、全然違ったんだなと。
自分でも弄ってもっとわかるようになれたらいいな。
通信速度(今昔物語)

# 我が家にネットワークが来て、早42年
　当時(1977年)は、スピード300bpsで端末は、**[ASR33](https://ja.wikipedia.org/wiki/ASR-33)**テレタイプ、コンピュータは、米国クリーブランドにあった**[Mark3](https://www.jstage.jst.go.jp/article/johokanri/20/5/20_363/_pdf)**を**[TSS](https://ja.wikipedia.org/wiki/%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B7%E3%82%A7%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)**で使用しました。言語は、Fortranで、電子メールのことをメッセージスイッチと言いました。このサービスは、広告会社の電通が運営していました。
その後、時代は、ミニコンピュータ・マイクロコンピュータと進化してきました。我が家にも**[ベッコアメ・インターネット](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%83%E3%82%B3%E3%82%A2%E3%83%A1%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88)(現在のGMO)**がやってきました。1990年代1200/2400/4800/9600bpsといつもモデムを買っていた思い出があります。電話回線も**[ISDN](https://ja.wikipedia.org/wiki/ISDN)**となりました。一気に通信速度も64kbpsとなりメールのやり取りには、十分な速度になりました。インターネットも同時に進化し、マルチメディア時代に突入しました。画像や音楽を通信できるようになりました。あっという間にADSLに突入し、1から6Mbps程度の通信ができるようになりました。
数年でひかりVDSLとなり、30Mbps程度の通信できるようになり、家から放送受信できるテレビがなくなりました。
![speed.PNG](https://qiita-image-store.s3.amazonaws.com/0/274715/045c7ba7-6699-1ded-5dd0-e16aac1c4fd2.png)
プログラム書きながらSkypeし、NBAの中継を4Kで4画面生中継観れるようになりりました。
日本のテレビは、保険会社のコマーシャルばっかりで健康に悪い。
機械学習でいわれる教師あり学習とは

# 教師あり学習

教師あり機械学習とはもっとも使われており、成功しているタイプの機械学習。

ある入力に対して特定の出力を予測したい場合に用いる。

## 目的：新しい見たことのないデータに対し正確な予測を行うこと

作成の手間はかかるが一度行えば可能な範囲が広がるということである。この予測が可能となることを汎化という。


教師あり機械学習は２つにわけられる。
クラス分類と回帰である。    

## １、クラス分類
クラス分類の目的：あらかじめ定められた選択肢の中からクラスラベルを予測すること

## ２、回帰
回帰の目的：連続値の予測

この二つの区別は、連続性の有無である。


## ー考え方における落とし穴ー
まずデータを眺め、ルールを見出す。

その情報量に対し過度に複雑なモデルを作ってしまう落とし穴を過剰適合と呼ぶ。

つまり新しいデータには汎化できない複雑なモデルということである。

逆もしかり、単純すぎるモデルを選択することを適合不足と呼び、正確な予測ができない。

この間のスイートスポット、ちょうど良い所を探すことが大切となる。


そのデータに対してどういったモデルが適しているのか考える必要がある。以降、８つの大まかなモデルの紹介に移る。


## １、最近傍法
小さいデータに適している方法。
理解しやすいが処理速度が遅く多数の特徴量を扱うことができないため、ほとんど使われていない。

### ー K-最近傍法ー
最も単純な学習アルコリズム。

予測には訓練データセットの中から予測したいデータポイントに一番近い点をみつける。
このデータポイントに対して１つではなく、K個選択しても良い。なのでK-最近傍法という。
その中で多数派のクラスを採用する。
K=1など少ない値で行うと複雑の高いモデルになり、最近傍点が多い場合複雑度が低くなる。





## ２、線形モデル
大きいデータセット、また高次元のデータに適する。
### ー線形モデルによる回帰ー

予測式：y:予測　　x：特徴量　　w,b:学習されたモデルのパラメータ

y＝Σw[i]x[i]＋b

式から読み取れるよう、直線で表される。その線を境界線とする。訓練データのポイント数より特徴量が多い場合、モデル化できる。

### ー線形モデルによるクラス分類ー
y＝Σw[i]x[i]＋b＞0

線形回帰とよく似ているが、0より大きいか否かでクラス分類される

## ３、ナイーブベイズ
線形モデルに似ている。しかしクラス分類にしか利用できない。クラスに対する統計値を個々の特徴量ごとにあつめて学習するので線形モデルよりも速く、大きいデータセット、また高次元のデータに適する。しかし精度は線形モデルより遅れることが多い。




## ４、決定木
Yes/Noで答えられる質問で構成された階層的な木構造を学習する。
幾度か分割をつづけてやり過ぎてしまうと、過剰適合になってしまうため注意。
その対応策としては事前枝刈り、事後枝刈りがある。
事前枝刈りは先に木の深さを制限かける方法などである。
事後枝刈りは構築後、情報の少ない部分を削除していく方法である。
非常に高速。データのスケールを考慮する必要がない。可視化可能。



## ５、ランダムフォレスト
決定木の欠点、過剰適合を防ぐ一つ。
過剰適合の木々を集めることで全体の平均をとれるのではという考えである。
単一の決定木よりも高速・頑健・強力。
高次元の疎なデータには適さない。

## ６、匂配ブースティング決定木
ランダムフォレストとはまた違った過剰適合を防ぐ手立て。
１つ前の決定木の誤りを次の決定木が修正していく。
そのためランダムフォレストより訓練には時間がかかるが、予測が速くメモリ使用量も小さい。
またよりパラメータに敏感。
広く用いられている。


## ７、サポートベクタマシン
同じような意味をもつ特徴量からなる中規模なデータセットに対して強力。データのスケール調整の必要がある。パラメータに敏感。


## ８、ニューラルネットワーク
最近「ディープラーニング」という名前で注目を集めている。
非常に複雑なモデルを構築できる。大きなデータセットに有効。データのスケール調整する必要がある。パタメータに敏感。大きなモデルは訓練に時間を要する。



実施するケースに見あったモデルの選択が大事、ということですね。


細かなところはまた後日、大枠を先にということで次回は教師なし学習です。

機械学習を行うにあたっての基本の開発環境構築はこちらで紹介しています。
【初心者向け】初めての機械学習入門（https://qiita.com/colako/items/859e6d045ae7832b8432）


### 参考文献
・Pythonではじめる機械学習ーscikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
（著者　Andreas C.Muller、Sarah Guido 発行所　株式会社オライリー・ジャパン）
・サポートベクタ―マシーン（support vector machine:SVM）の基礎（https://www.hellocybernetics.tech/entry/2016/08/08/061746 2018/10/09閲覧）
Laravelでカスタムバリデータを作ってみた

**※前提：ValidatorServiceProviderはArtisanコマンドから作成済みであること**

#今回の目的
**「AとBの値は同時には指定できない」というバリデーションをかけたい**
##カスタムバリデートの作成
と、言っても、Bの部分は複数指定できることを想定しています。
なので、引数次第では「AとBとCの値は同時に指定できない」です。

```ValidatorServiceProvider.php
// 使い方：exclude:hoge
Validator::extend('exclude', function ($attribute, $value, $parameters, $validator) {
    // リクエスト内容を取得
    $request = $validator->getData();
    // $parametersの中には「hoge」が配列形式で入っている
    foreach ($parameters as $key => $val) {
        // キーさえ存在を許したくないので、array_key_existsを使う
        if (array_key_exists($val, $request)) {
            return false;
        }
    }
    return true;
});
```
実際にValidatorとして使う場合

```Validata.php
public function getRules(): array
{
    return [
        'fuga' => ['exclude:hoge'],
        'hoge' => ['exclude:fuga']
    ];
}
```

Validatorの書き方がわからなくて何時間も悩んでしまい、仕舞には人に聞くというポンコツぶりを発揮した件でした。

##エラーメッセージもカスタマイズする
ちなみに、メッセージもカスタムしたいですよね。
理想はこちら

```
You can be specified only one of hoge or fuga.
```
これもValidatorServiceProviderに書けばできます。

```ValidatorServiceProvider.php
// $message＝'You can be specified only one of :attribute or :param.'
Validator::replacer('exclude', function ($message, $attribute, $rule, $parameters) {
    // $parametersは配列なので文字列に変換する
    return str_replace(':param', implode('or',$parameters), $message);
});
```

```Validata.php
public function getMessages(): array
{
    return [
        'exclude' => 'You can be specified only one of :attribute or :param.'
    ];
}
```

出力されたメッセージ
"You can be specified only one of hoge or fuga."

よし、できた。
php-master-changes 2018-10-09

今日はビルドツールの修正、opcache の微修正、ini 解析関数のバグ修正、php-7.3.0RC3 のタグ打ち、DateTime::createFromFormat() の 'v' 対応、xml_parse_into_struct() のバグ修正があった！

# 2018-10-09
## weltling: Add missing packaging entries
- https://github.com/php/php-src/commit/8a5ababea2b56746c496318216aefd1a9d1f0a98
- [昨日入れた C++ の規格指定マクロ](https://qiita.com/sj-i/items/796ae236c14217c29f7c#weltling-enforce-c11-in-extintl)でビルドツールへの組み込みが足りなかった部分を追加

## dstogov: During size calculation, pointer should be kept unchanged
- https://github.com/php/php-src/commit/ca7ccd01e44cb24638b396f9c79d463f57a0194f
- ext/opcache のキャッシュ保存時の必要メモリサイズ計算処理を修正
- クラスエントリのメソッド（関数エントリ）の zval を順繰りに引数へ渡してサイズ計算を行う、という処理の中
- すでに xlat_entry に保存されている op_array があれば、その古い方へ引数で渡された zval 内のポインタを差し替える処理があった
- 意図はよく分かってないけど、[処理自体は 4 年前からある奴](https://github.com/php/php-src/commit/8e3643a8fcf9f901d0990937fa332e22607ce0f1#diff-5f65684ab44e2bf79164ab4115b185e9R256)
- 動くけどやると遅いとかだろうか……？

## adoy: Fixed bug [#76965](https://bugs.php.net/bug.php?id=76965) INI_SCANNER_RAW doesn't strip trailing whitespace
- https://github.com/php/php-src/commit/f42d7bddc0479651ecf7f9cdf375bba74b609bea
- [7.1~]
- [parse_ini_string()](http://php.net/manual/ja/function.parse-ini-string.php) や [parse_ini_file()](http://php.net/manual/ja/function.parse-ini-file.php) で INI_SCANNER_RAW を使う際、ini の字句解析器で値の後に続く空白文字の解釈がおかしく、値の後に続く行コメントが出力に影響を与えていた問題の修正

## cmb69: [ci skip] Update NEWS wrt. php-7.3.0RC3 tagging
- https://github.com/php/php-src/commit/3d4167c3dedbe5bda6e9be4c856a309218cb81b4
- [7.3~]
- php-7.3.0RC3 のタグを打って NEWS を更新、開発対象バージョンを php-7.3.0RC4 へ

## derickr: Fixed bug [#75577](https://bugs.php.net/bug.php?id=75577): DateTime::createFromFormat does not accept 'v' format specifier, by updating timelib to 2018.01alpha2
- https://github.com/php/php-src/commit/43f7a5735cbc50c885f6563d63591a684528b4d0
- [7.3~]
- ext/date の [DateTime::createFromFormat()](http://php.net/manual/ja/datetime.createfromformat.php) で書式 'v' が使えなかった（そのため [RFC3339_EXTENDED](http://php.net/manual/en/class.datetimeinterface.php#datetime.constants.rfc3339_extended) も使えなかった）問題の修正
- 依存先の [timelib](https://github.com/derickr/timelib) へ[先に修正が入り](https://github.com/derickr/timelib/pull/29)、その修正が取り込まれたバージョンへ timelib 自体が更新された形

## derickr: Added test case for bug [#75577](https://bugs.php.net/bug.php?id=75577)
- https://github.com/php/php-src/commit/bb2eaa6d6112bfc4213b731543cc0a3165793e44
- [7.3~]
- ↑のテストケースを追加

## derickr: Fixed tests
- https://github.com/php/php-src/commit/1eac7c1ea3899dbb87a8c6795086a7ce6b3b39ac
- [7.3~]
- ↑のテストケースで期待する出力の箇所がおかしかったのを修正

## cmb69: [ci skip] Update NEWS
- https://github.com/php/php-src/commit/efb9ccc91bfe182c4e76a0badee9d5fcb11735d5
- [7.3~]
- ↑の NEWS への追加

## cmb69: Fix [#30875](https://bugs.php.net/bug.php?id=30875): xml_parse_into_struct() does not resolve entities
- https://github.com/php/php-src/commit/2845f859c19965691855c66bc18d94a4e06ff329
- [7.1~]
- ext/xml で、[xml_parse_into_struct()](http://php.net/manual/ja/function.xml-parse-into-struct.php) 使用時、要素の内容について内部 DTD で定義されたものが反映されない問題の修正
- expat の扱いが間違っていて PHP4 の頃から長らく動いてない機能だったもよう（実装は多分ずっとあったのかな……）
テストカバレッジをフローチャートで確認する（c2以外）

ホワイトボックステストにおけるカバレッジについていつも忘れてしまうのでメモ

ここでは代表的な以下の3つのものを取り上げます。

| カバレッジの種類 | 説明 | 
|:-----------|:------------|
| 命令網羅（statement coverage, C0） | コード内の命令文に対して少なくとも１回実行されるようにテストをする |
| 分岐網羅（branch coverage, line coverage, C1） | コード内の条件判定にの結果に対して、それぞれが少なくとも１回実行されるようにテストをする |
| 条件網羅（condition coverage, C2） | コード内の条件判定の個々の条件に対してそれぞれが少なくとも１回実行されるようにテストをする |

以下のコードを例にとって説明します。

```ruby
def hogehoge
  if 条件a1 do
    raise 例外
  end

  if 条件b1 || 条件b2 do
    命令文1
  else
    命令文2
  end

  if 条件c1 || 条件c2 do
    命令文3
  end
end
```
# 命令網羅（statement coverage, C0）
すべてのステートメント（命令文）を通る必要があるので以下のようになります。
赤丸の部分に着目して設計します。
![カバレッジ (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/156024/6316d013-3c6b-29fe-5390-153353c95369.jpeg)


# 分岐網羅（branch coverage, line coverage, C1）
すべての条件判定を通る必要があるので以下のようになります。
赤丸の部分に着目して設計します。
分岐網羅が100%であれば必然的に命令網羅も100%になります。
![カバレッジ (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/156024/b1a935c5-371e-0ca4-23e1-95f43d48f420.jpeg)

# 条件網羅（condition coverage, C2）
条件判定の個々の条件に着目して設計します。
図だとごちゃごちゃするので表にします。

| テストケース | a1 | b1 | b2 | c1 | c2 | 出力結果 |
|:-----------|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
|1|T|-|-|-|-|例外|
|2|F|T|F|T|F|命令文２、命令文３|
|3|F|F|T|F|T|命令文２、命令文３|
上記のテストケースでc2カバレッジは100%にはなりますが、命令文１が実行されていないことがわかります。
このようにc2では100%でもc1、c0では100%にならないこともあるので注意しましょう。

# まとめ
* c0は命令
* c1は条件判定
* c2は個々の条件
* c1が100%のときc0は100%
* c2が100%のときc0, c1は100%になるとは限らない

## 【補足】条件網羅のときに着目する箇所
赤丸のところです。
![カバレッジ (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/156024/ef2c469e-6759-3b07-534b-2789fa1f4f91.jpeg)

### 参考
http://gihyo.jp/dev/serial/01/tech_station/0003
フォルダ内の画像ファイルを名称順につなげてMP4ファイルを作成する

# はじめに

定点カメラを設置して一定間隔で写真を撮っており、これをつなげてを動画作りたいと思ったら、意外と簡単にできたのでまとめておきます。

# 画像ファイル準備

適当なフォルダに画像ファイルを保存。
ここでは、仮に「pics」とします。

# スクリプト作成

```python:make_mp4.py
#!/usr/bin/env python

import glob
import cv2

import numpy as np

files = glob.glob('./*.jpg')
files.sort()

FILE_NAME = "output.mp4"
FRAME_RATE = 15
FRAME_SIZE = (1280, 720)

rec = cv2.VideoWriter(FILE_NAME, cv2.VideoWriter_fourcc(*'XVID'), FRAME_RATE, FRAME_SIZE, True)

for file in files:
	print(file)
	
	img = cv2.imread(file)
	rec.write(img)
	
rec.release()
```

上記のスクリプトを画像と同じフォルダに保存。

# スクリプト実行

以下のとおりスクリプトを実行。

```sh
python make_mp4.py
```

できた！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">キャベツの成長記録（苗植えから一ヶ月間） <a href="https://t.co/Qzd5Ca3FBI">https://t.co/Qzd5Ca3FBI</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; Shinobu Kimura (@mix_dvd) <a href="https://twitter.com/mix_dvd/status/1049813479983435776?ref_src=twsrc%5Etfw">2018年10月10日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Google Colaboratory上でアニメの顔を検出してみた

##環境
Google Colaboratory
windows

##opencvとは？
OpenCV（正式名称： Open Source Computer Vision Library）は、オープンソースのコンピューター・ビジョン・ライブラリです。コンピューターで画像や動画を処理するのに必要な、さまざま機能が実装されており、BSDライセンスで配布されていることから学術用途だけでなく商用目的でも利用できます。加えて、マルチプラットフォーム対応されているため、幅広い場面で利用されていることが特徴です。
引用元:[OpenCVとは？](https://www.buildinsider.net/small/opencv/001)

##概要
・特徴ファイルのダウンロード
・顔を検出して四角で囲む

##特徴ファイルをダウンロード
githubから今回使う特徴ファイルをダウンロードします。
https://github.com/nagadomi/lbpcascade_animeface
clone or downloadをクリックすれば、ダウンロードできます。

##顔を検出して四角で囲む
特徴ファイルをダウンロードしたら今回使用する画像と特徴ファイルを
Google Colaboratoryにアップロードします。

```.py
import cv2
from matplotlib import pyplot as plt
%matplotlib inline
img=cv2.imread("./rezero.jpg")#画像の読み込み
image=cv2.imread("./rezero.jpg",0)
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#RGBに変換する
HAAR_FILE="lbpcascade_animeface.xml"#特徴の読み込み
cascade=cv2.CascadeClassifier(HAAR_FILE)
face=cascade.detectMultiScale(image)#顔検出
for x,y,w,h in face:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),3)#顔を四角で囲む
plt.grid(False)#デフォルトだとグリッドとxy軸ラベルが表示されるので非表示にする
plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
plt.imshow(img)
```
エラーがなければ以下のようになると思います。
![2018-10-10.png](https://qiita-image-store.s3.amazonaws.com/0/169545/33c1be61-5380-7312-507c-30772643eb9a.png)
Java AppletをIDE使わずにビルドしたい

授業でJavaAppletを作れとの課題を出されたのだが推奨がNetBeansで
使い慣れていないIDEは嫌だなぁと思っていた.
なのでVSCodeでJavaApplet作りたかったのでその時の知見をまとめます
Windows前提で書いてますのでLinuxについては知りません

~~というかJavaAppletもう非推奨だよね？？？？~~


## 1:コードを書く

- 必要なものをimportする

``` java
import java.applet.Applet;
import java.awt.*;
````

- いろいろかく

```java
public class CLASS_NAME extends Applet {

    public CLASS_NAME() {
    }

    public void paint(Graphics g) {
        //いろいろつくる
    }
}
```

**(ここは本題ではない)**

## 2:コンパイルする
コマンドライン立ち上げて

```cmd
cd ソースのjavaファイルのある場所
javac ソース.java
```

## 3:アプレットのベースのHTMLファイルを作る
```HTML
<html>
<head><title>Applet Test</title></head>
<body>

<applet code="CLASS_NAME.class" width="150" height="150">
</applet>

</body>
</html>
```
こっちのファイル名は問われないそうです
(私は面倒なのでapplet.htmlをクラス名だけ変えて使いまわしてる)


## ~~4:できた２ファイルを以下のように配置する~~

```
folder --- Applet.html
        |
        -- Classes(folder) --- CLASS_NAME.class
```
<font color="red">2018/11/30訂正:上述のhtml内で`codebase`が指定されているときはそのフォルダ内におかないとダメっぽいですが、codebaseを外せば作業フォルダそのまま叩けるっぽいです</font>


## 5:アプレットを実行する
 さっきのコマンドラインで
 
```cmd
 appletviewer Applet.html
 ```
 これでエラーが出なければ成功
 エラーが出たらフォルダ配置、クラス名、cdの場所を確認してください。
 
 お疲れさまでした。
 
 
 ~~２度目だけどJavaApplet今やってるのバカらしくない?????~~
jsdoでdeviceorientation その5

#概要

jsdoでdeviceorientationやってみた。
Lチカ作って見た。

#環境
nexus 7

#サンプルコード

```
var lastOrientation;
function onDeviceOrientationChange(event) {
    lastOrientation.gamma = event.gamma;
    lastOrientation.beta = event.beta;
}
function deviceOrientationTest(event) {
    window.removeEventListener('deviceorientation', deviceOrientationTest);
    if (event.beta != null && event.gamma != null) 
    {
        window.addEventListener('deviceorientation', onDeviceOrientationChange, false);
    }
}
lastOrientation = {}; 
window.addEventListener('deviceorientation', deviceOrientationTest, false);
function xhr(url) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.onload = function(e) {
        if (xhr.status != 200) 
	    { 
	        alert("ng");
        }
        else
	    {
            document.getElementById('helloWorld').innerHTML = xhr.responseText;
        }
    };
    xhr.onerror = function() {
        alert("err");
    }
    xhr.send(null);
}
setInterval(function() {
    var gamma = lastOrientation.gamma;
    if (gamma < -40)
    {
        xhr("/assets/2/k/H/B/2kHBg");
    }
    else
    {
        xhr("/assets/O/M/u/H/OMuHB");
    }
}, 500);

```

#成果物

http://jsdo.it/ohisama1/0QH5

以上。
kintone REST API 、cli-kintoneまたはkintone一覧画面のクエリについての考察

記事の途中ですが、なかなか進まないので公開しておきます。

[kintoneの公式リファレンス](https://developer.cybozu.io/hc/ja/articles/201941754#)の kintone REST APIの[クエリの条件指定](https://developer.cybozu.io/hc/ja/articles/202331474#step2) について、[コミュニティのQ&A](https://developer.cybozu.io/hc/ja/community/topics) に度々質問が寄せられて、自分でもモヤモヤしていたので調べたことを書き留めておきます。

#目的
- kintoneのカスタマイズの際に通常は kintone JavaScript API を通して利用する kintone REST API のクエリ指定とkintoneのコマンドラインツールのcli-kintoneのクエリ指定。また、[kintoneの一覧画面の設定](https://jp.cybozu.help/k/ja/user/app_settings/view/set_view.html#)について考えてみることで、クエリ指定の仕様を理解する。
- クエリ指定の仕様を理解することで、クエリ文字列の指定について理解する。

#クエリ指定とは何か
- 例えば、kintone REST API のレコード一覧取得(GET)の際のレコードの絞り込み条件に指定する文字列のこと。
- SQLライクに like演算子やor,and、関数が用意されています。また、オプションで order by等を設定出来ます。

#kintoneの一覧画面のクエリ指定
kintoneのアプリを作成する際に、もれなくついてくる一覧画面はおそらく REST API を裏で叩いています。（のはず）
その確認に一覧画面を表示した状態で、Chromeのデベロッパーツールを起動してコンソールにkintone JavaScript APIの[レコード一覧のクエリ文字列を取得する（order by, limit, offset付き）](https://developer.cybozu.io/hc/ja/articles/201942004#step2)のサンプルコードを貼り付けてEnterを押下します。

```javascript

var query = kintone.app.getQuery();
console.log(query);

// 取得した値の例
// 'record_id <= "5" and creator in ("Administrator") order by record_id desc limit 5 offset 10'
``` 
こんな感じで一覧画面で発行されているクエリを確認することが出来ます。

###kintone JavaScript API と kintone REST API について
混在しやすいですが、kintone JavaScript API はその名の通り、kintoneのJavaScript ライブラリという理解で良いかと思います。専用の関数をJavaScriptから直接利用できるようになっています。上記の `kintone.app.getQuery()` も専用の関数の１つです。
こちらから[kintone JavaScript API一覧](https://developer.cybozu.io/hc/ja/articles/360000361686)を見てもらうと出来ることが一覧で載っていますが、ざっくりと自分なりにイメージした分類を付け加えて見ました（プラグインを除く）。

1. イベント　・・・　JavaScriptの世界（app.record.index.showなど）
2. イベントハンドラーの登録・削除　・・・　JavaScriptの世界（kintone.events.on）
3. API実行　・・・　kintone JavaScriptの世界（kintone.api）
4. 情報の取得・設定　・・・　kintone JavaScriptの世界
5. フィールド表示・非表示　・・・　kintone JavaScriptの世界
6. 要素の取得　・・・　kintone JavaScriptの世界

###kintone JavaScriptの世界へようこそ！
上記の3.~6.までを**kintone JavaScriptの世界**と分類したのは、ログインユーザー情報とUIバージョンの取得以外は、kintone.app~から始まる関数になっているからです。
基本的にはブラウザ側に処理が移ってからのフロントエンド側の話しなので、一般的にはDOMをJavaScriptで操作することになるのですが、かなり複雑なDOMの構造になっているので、DOM操作を簡単にする為に専用の関数が用意されていると思われます。
1.と2.はセットで使います。イメージとしては、kintoneの世界よりも一般的なブラウザのイベント処理の世界という理解で良いかと思います。
ボタンをクリックした時のイベントと同じように、kintoneの専用イベントが用意してあって、専用のイベントハンドラー関数であらかじめ登録しておくことで、イベントが発生した際に処理が発火するようにします。

###kintone.apiとkintone REST APIの関係
3.のAPI実行にある、`kintone.api(pathOrUrl, method, params, opt_callback, opt_errback)`がkintone JavaScriptの世界からkintoneのREST APIを叩く（**kintone REST APIリクエストを送信する**）専用の関数になります。
この関数がkintone JavaScriptの世界とkintoneの世界（kintoneデータベース？）を橋渡しする役割をしています。

#kintone REST API
kintone REST APIについては下記のリンクを参照。
- https://developer.cybozu.io/hc/ja/articles/201941754#step1
- https://developer.cybozu.io/hc/ja/articles/203655530

#リンク
-  [cybozu developer network](https://developer.cybozu.io/hc/ja) 
-  [レコードの一括取得（クエリで条件を指定）](https://developer.cybozu.io/hc/ja/articles/202331474#step2)
fdclone を導入する

# fdclone を導入する

便利なファイラー
![fdclone_screen_sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/91280/bedf58b9-4c5d-39a8-c51e-b42f8762dffb.jpeg)
![fdclone_screen_sample2.png](https://qiita-image-store.s3.amazonaws.com/0/91280/caf32c70-e0c2-2a06-55e4-f47fa95e3cc2.png)
![fdclone_screen_sample3.png](https://qiita-image-store.s3.amazonaws.com/0/91280/715abeef-021d-08c4-28ed-f7dc7fb88aa2.png)


1.準備
2.ソースをダウンロードする
3.展開する
4.makeする
5.エラーが出た場合
6.設定ファイルを作る
7.その他

## 1.準備
```
$ su
# yum gcc ncurses-devel -y
```

## 2.ソースをダウンロードする
```
# wget ftp://ftp.unixusers.net/src/fdclone/old/FD-2.09i.tar.gz
```
※FreeBSDの場合はwgetコマンドの代わりにfetchコマンドで。

## 3.展開する
```
# tar xf FD-2.09i.tar.gz
```

## 4.makeする
```
# cd FD-2.09i
# make install
```

## 5.が出た場合
### term.c でエラーが出た場合
```
# vi term.c
52行目に次の行を追加。
typedef unsigned char u_char;
```
再度makeする。

### ディレクトリでエラーが出た場合
```
# mkdir -p /usr/local/man/en_US.UTF-8/man1
```
再度makeする。

## 6.設定ファイル作成
```
# vi /etc/fd2rc

SECOND=1
ANSICOLOR=1
DEFCOLUMNS=2
LANGUAGE=eng
SORTTYPE=1
```

## 7.その他
作業ディレクトリを掃除しておく。
[Java]HashCodeとequalsのオーバーライド


１、ObjectのHashCode()とequals()
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/d0274c3a-3332-3922-1eb2-230b776a1824.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/7c0e3a26-dc00-ba21-d36b-da26a1fca01e.png)
上記のように、
equals()はobjのアドレスを比較している。
hashCode()はnative側で計算している。つまりC/C++側で計算している。

そなると==の比較にするとfalseになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/18799397-4fc3-e644-8ffe-6620fea9e39a.png)

２、StringのHashCode()とequals()
Stringはobjectを継承している。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/1d8228d4-b0af-147f-bbd3-70b18c9ae66e.png)

StringはHashCode()とequals()をオーバーライドしている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/5a8d6059-9d06-7d77-ed6d-c02f9b5a8828.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/530be5d0-38d2-5f03-a98d-ff64aef84f19.png)
上記equals
１、同じアドレスのobjectなら、true
２、比較文字列のクラスはStringでないなら、false
３、比較文字列のクラスの長さは同じではないなら、false
４、ループで比較、間違いなら、false
５、ループ完了したら、true

３、自前でHashCode()とequals()

    private static class Person {
        int age;
        String name;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String toString() {
            return name + " - " +age;
        }

        /**
         * @desc
         */
        @Override
        public boolean equals(Object obj){
            if(obj == null){
                return false;
            }

            if(this == obj){
                return true;
            }

            if(this.getClass() != obj.getClass()){
                return false;
            }

            Person person = (Person)obj;
            return name.equals(person.name) && age==person.age;
        }

        @Override
        public int hashCode() {
        	return this.name.hashCode();
        }
    }



サンプルコード
https://github.com/YanHengGo/java/tree/master/04_hashcode
NiFiで、Apache Webサーバー アクセスログ取得

# ゴール
Apache Web server httpd accesslogをtailで取得し、指定のファイル(S3/Local/HDFS)に貯めておく

# DataFlow全体図

<img width="1006" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/db991645-55b9-ceb8-d3fc-33a3c62830f6.png">

# 手順
もしApache Webサーバーがなかったら、一つ[インストール](https://qiita.com/zz22394/items/a84414c873d9e339f158)

## TailFileで、指定ファイルもしくはフォルダを監視
<img width="986" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/fbb22bfa-9d13-4b29-7588-fe95dcd5f93b.png">

``File(s) to tail``にファイル名を指定：
``/var/log/httpd/access_log``

``base directory=/var/log/httpd``

## ある程度まとめる：MergeContent
## ファイルに保存
Dreamweaverのテンプレートで、相対パスを使ってルートフォルダへリンクする

全ページ、Dreamweaverのテンプレートを使うとして、

>
index.html
┣page01
┃　┗index.html
┣page02
┃　┗index.html
┗Templates
　　┗index.dwt

このようなサイト構成のときに
全ページからルートフォルダのindex.htmlへ「相対パスで」リンクしたい。
通常ならこう書くだろう。

```
<a href="../">トップページへ</a>
```

しかし、この記述だと
下層フォルダのページからは正常にリンクされるが、
ルートフォルダのindex.htmlは下記のようになる。

```
<a href="../">トップページへ</a>
```

なぜかこうなる。

# 解決策
テンプレートに下記のように記述する。

```
<a href="../index.html">トップページへ</a>
```
これなら問題なくリンクされる。

# でもindex.htmlとは書きたくない

index.htmlまで書くのはなんかかっこわるい。
そんなときは下記のように記述する。

```
<a href=".././/">トップページへ</a>
```

するとルートフォルダのindex.htmlではこのようになる。

```
<a href="./">トップページへ</a>
```

下層フォルダからもきちんとリンクされます。

それにしても最初の記述でなぜだめなのか。
Adobeのサポートに問い合わせても、わからない、現状解決策はないとの回答だった。
でも、偶然発見したのでメモ。
[Java]Hashmap,HashTableの違い

１、継承が違い
HashMap
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/858a69f8-fec3-83ba-a404-9408d3ac1a59.png)

HashTable

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/003377d7-eaaa-efdb-2157-ed9323733362.png)

HashTable extends Dictionary
ここにHashTableの親クラスdictionaryはもう使われていない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/921f49df-d185-3c09-908a-4432ec061ceb.png)

２、nullキーの違い
HashTableでは、nullのkeyとnullのvalueは使えない。

HashMapでは使える。

３、マルチスレッドのサポートの違い
HashTableのIFはすべてsynchronizedを追加されたため、そのままマルチスレッドの環境で動作できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/613c8e84-ce64-0130-c44d-9bba1ee927da.png)

HashMapはマルチスレッドで使うとdeadlockを発生する可能性がある。
※：それを回避するために、java1.5からConcurrentHashMapを追加された、マルチスレッド
環境では使える。

４、スピードの違い
HashMapは速い
HashTableは遅い

まとめ
一般的にHashMapを使うべき、ただマルチスレッドの場合はConcurrentHashMapを使う。

https://github.com/YanHengGo/java/tree/master/03_hashmap
RailsではじめてのRESTful API を作ってみた。

# 前提

##REST（REpresentational State Transfer）の設計原則:airplane:

・リソースは一意に特定できる
・状態を持たない
・URLはリソースの複数形で表す
・URLは動詞を含めず、HTTPメソッドで操作を指定

RESTに基づいてHTTPメソッドでリソースをCRUD操作できる設計をRESTful とか言ったりする。

RESTful API ！！
##今回のデータの形式はJSONにしてますが
ちょっと前はXMLが主流だったそうです。
[JSONってなにもの？](http://thinkit.co.jp/article/70/1)

##Rails5を使ってます。
Rails５でないと次に出てくるAPIモードを使えないので注意です。


# 作ってみよう

## 1. APIモードを使って新規作成

```
$ rails new driver_api --api
```
ディレクトリ移動します

```
$ cd driver_api
```

## 2. 運転手さんのModel、Controller作成

```
$ rails g scaffold drivers
```

「render json:」がたくさんあるdrivers_controller.rbができてます。

```ruby:controllers/drivers_controller.rb
class DriversController < ApplicationController
  before_action :set_driver, only: [:show, :update, :destroy]

  # GET /drivers
  def index
    @drivers = Driver.all

    render json: @drivers
  end

  # GET /drivers/1
  def show
    render json: @driver
  end

  # POST /drivers
  def create
    @driver = Driver.new(driver_params)

    if @driver.save
      render json: @driver, status: :created, location: @driver
    else
      render json: @driver.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /drivers/1
  def update
    if @driver.update(driver_params)
      render json: @driver
    else
      render json: @driver.errors, status: :unprocessable_entity
    end
  end

  # DELETE /drivers/1
  def destroy
    @driver.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_driver
      @driver = Driver.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def driver_params
      params.fetch(:driver, {})
    end
end
```



## 3. カラムを追加
↓こんな感じにしましょう。

| カラム       |       データ型 |        |
|:-----------------|:------------------|:------------------|
| driver_name             |              String |        運転手の名前        |
| tel          |            String |       電話番号       |
| car_number             |              String |        車両番号        |


```
$ rails g migration add_column_to_drivers
```

上記コマンドでmigrationファイルを作成し、下記add_columnのところを追記します。

```ruby:db/migrate/xxxxxxxxxx_add_column_to_drivers.rb
class AddColumnToDrivers < ActiveRecord::Migration[5.1]
  def change
    add_column :drivers, :name, :string
    add_column :drivers, :tel, :string
    add_column :drivers, :car_number, :string
  end
end
```

## 4. マイグレーションを実行
```
$ rails db:migrate
```

## 5. 運転手データ（driver.csv）を、dbディレクトリに格納
データは[こちら](http://github.com/akitokuraya/driver_api/blob/master/db/driver.csv)です。

## 6. db/seeds.rbを編集
```ruby:db/seeds.rb
require 'csv'

CSV.foreach('db/driver.csv') do |row|
    Driver.create(:name => row[0],:tel => row[1],:car_number => row[2])
end
```

## 7. マイグレーションを実行
```
$ rails db:seed
```
⬆️db:**seed** なの要注意ですね。

# 実行してみると
下記コマンドでサーバー起動を実行して、

```
$ rails s
```
http://localhost:3000/drivers にアクセス。

運転手データがJSONで返ってくることが確認できる。
<img width="589" alt="drivers_JSON.png" src="https://qiita-image-store.s3.amazonaws.com/0/117099/5a4715b2-2282-2c38-ec43-04eb50653a7c.png">


次回は外部からデータをPOSTしてみましょう。
[メモ]Macで開発中の爆速ターミナルalacrittyを使う

自分用の開発中の高速ターミナル導入メモ。
vimのjkキーによる移動などの操作が大幅改善できた。

# alacrittyとは
https://github.com/jwilm/alacritty
レンダリングにGPUを使用することで、高速化を図っている仕組みの様子。

# インストール手順  

**[2018-12-21 追記]
ビルドしなくてよくなりました。
[こちら](https://github.com/jwilm/alacritty#installation)を参照してください**

- **Rust compiler導入（既に入れているなら以下の不要）**  

```bash
curl https://sh.rustup.rs -sSf | sh
#↓bashrcに追記
export PATH=$PATH:$HOME/.cargo/bin
# 設定を反映
source ~/.bash_profile
```

- **本体導入**  

```bash
cd /tmp
git clone https://github.com/jwilm/alacritty.git
cd alacritty
make app
cp -r target/release/osx/Alacritty.app /Applications/
```

- **設定**  
Appを起動後、`~/.config/alacritty/alacritty.yml`ができるので、  
下記の部分を自分の環境に合わせて設定する。

```yaml
window:
  # Window dimensions (changes require restart)
  #
  # Specified in number of columns/lines, not pixels.
  # If both are `0`, this setting is ignored.
  dimensions:
    columns: 350
    lines: 150

（中略）

font:
  # Normal (roman) font face
  normal:
    family: Go Mono for Powerline
    # The `style` can be specified to pick a specific face.
    # style: Regular

  # Italic font face
  bold:
    family: Go Mono for Powerline
    # The `style` can be specified to pick a specific face.
    # style: Bold

  # Italic font face
  italic:
    family: Go Mono for Powerline
    # The `style` can be specified to pick a specific face.
    # style: Italic

  # Point size
  size: 13.0
```
【C#】ガベージコレクションについて調べたことまとめ

#概要

ガベージコレクション周りについて調べたことを忘備録としてまとめておきます。

#メモリ領域の種類

プログラム上でメモリを意識する際には、スタック領域とヒープ領域というメモリ領域が存在します。

スタック領域は予め用意されてあるメモリ領域に一時的に保存しておいて、その場ですぐに呼び出す時に使われます。
該当するのは値型と呼ばれるintやfloatなどがこれにあたります。

ヒープ領域はnewなどでインスタンスを生成したときに、新たにメモリ領域を確保して使います。
該当するのは参照型であるクラスや配列、デリゲートがこれに当たります。
また、クラスに入ってる値型もヒープ領域に入ります。

#ガベージコレクション
ヒープ領域に確保してあるメモリは確保した分開放しないとそのまま残り続けてどんどん使えるメモリがなくなっていきます。その際に使われなくなったインスタンスを自動でメモリを開放して使えるメモリを確保しようとしてくれるのがガベージコレクションになります。

ガベージコレクションは以下のことをやってくれます。
・使われてないインスタンスの開放

・コンパクション
予め確保したヒープ領域の中にある隙間のメモリ領域を詰めてくれる機能で、メモリの断片化の解決に繋がります。
例としてA,B,Cというメモリを開放した領域があります。新たにDというメモリ領域を確保しようとします。

![2018-10-10_01h21_39.png](https://qiita-image-store.s3.amazonaws.com/0/59907/7a3c0e17-d004-1f65-024b-9b08d78c278c.png)

Bの領域を開放した際にメモリの断片化が起き、Dのメモリ領域の確保はこのままだとできません。

![2018-10-10_01h36_57.png](https://qiita-image-store.s3.amazonaws.com/0/59907/eb5ac407-0596-0541-1602-7a7b0c7c6d49.png)

そこでコンパクションをすることによってメモリ領域を詰めることによって断片化が解決し、Dのメモリ領域を確保できるようになりました。

![2018-10-10_01h22_46.png](https://qiita-image-store.s3.amazonaws.com/0/59907/f72aadab-04c5-bdef-44bd-a7ecfd1f6ea2.png)

ただ、ガベージコレクションも処理にコストがかかるので、なるべく処理コストを減らすようにするのがベストです。

#String

stringは値型のような振る舞いをしていて値型と勘違いしそうですが、実際はクラスです。
=や+、+=は中身を変更しているのではなく実は実行するたびに新しいオブジェクトが生成していて、新しくヒープ領域を確保します。
for文などで何回も文字の連結をやっているとどんどんヒープ領域に溜まっていて、ガベージコレクションをする際に処理を呼び出す時間が増えていきます。
なので、StringBuilderを使って文字を連結するようにするのがベターだと思います。(ケースによってはString.Formatのほうが早いみたいです)


#Objectへのボックス化

Object型は何でも入れられる便利な反面、参照型なので扱いに気をつけないといけません。
例えば引数のObjectにintやfloatなど値型を渡すと、参照型であるObjectに変換されてしまいます。
これをボックス化といいます。
ボックス化は本来スタック領域に保存されるはずだったメモリがヒープ領域にメモリが確保されてしまいます。
なのでできるだけObject型を使わずに型が決まってるものは指定してあげるのがベストです。

#参考
>[ ++C++; // 未確認飛行 C  メモリ管理](https://ufcpp.net/study/computer/MemoryManagement.html)
Qiitaに記事を投稿できなかった話

#投稿できない

初めてQiitaで記事を書いて、さぁ投稿するぞとなったら、なぜか**投稿できない**。WEBページ右下の投稿するボタンを押した後、その後にポップアップで表示される「投稿する」ボタンを押しても**反応がない**。
色々調べたところ、Markdown記法に問題がある可能性があったので、見直してみても投稿できない。結局Qiitaの運営に問い合わせることとした。

#結果
夜にメールを送信し、次の日のお昼には返信が来ていた。迅速な対応に感謝です。
メール本文には「**スパム対策でかけているフィルターが誤って適用されてしまっていたため、投稿と更新ができない状態でした。**」とあった。合点承知の助。
その後改めて記事を書き編集を行ったところ、正常に終了することができた。

もしあなたも同じような状況に陥ったら、公式に素直にお願いすると素早く解決してくれるかもしれない(´ー｀)
google-api-client   Webブラウザをなしで認証

###rubyのサンプルが見つからなかったのでメモ
google api のサンプルがコンソールに表示されたurlからブラウザで認証キーを取得するという使い所のないものだったため、サーバサイドだけで完結できるものがないか調べて見た

[perform G Suite Domain-Wide Delegation of Authority](https://developers.google.com/admin-sdk/directory/v1/guides/delegation) を参考に
1. https://console.cloud.google.com API認証からサービス アカウントを作成、その際に認証用ファイルをダウンロード
2. https://admin.google.com の　https://admin.google.com/AdminHome?fral=1&chromeless=1#OGX:ManageOauthClients で１で作ったサービスアカウントIDとAPIスコープをカンマ区切りで承認を押下

google-api-clientもバージョンの違いで、ググっても混乱して大変だった

いくつかのサイトを参考にPKCS12ファイルでやって見たが

```
notFound: Domain not found. (Google::Apis::ClientError)
```
とエラーが出た

そこでサービス アカウントの認証ファイルをjson形式変更して下記のようにしてようやく動いた。管理権限のメールアドレスをauthorizationの際に指定する必要があるようだ

```ruby

require 'google/apis/admin_directory_v1'
require 'googleauth'
#*** LOCAL GEMS ***
#google-api-client (0.24.2)
#googleauth (0.6.6)

SCOPE = [Google::Apis::AdminDirectoryV1::AUTH_ADMIN_DIRECTORY_USER,Google::Apis::AdminDirectoryV1::AUTH_ADMIN_DIRECTORY_GROUP]
ENV['GOOGLE_APPLICATION_CREDENTIALS']  = "./xxxxx-11111111-9e7053d****.json"

service = Google::Apis::AdminDirectoryV1::DirectoryService.new
authorization = Google::Auth.get_application_default(SCOPE).dup
authorization.sub = 'test@sample.com'
service.authorization = authorization
response = service.list_users(domain: 'sample.com',customer: 'my_customer', max_results: 100, order_by: 'email')
puts response.to_json


```

参考
[Google Apps の Directory API にてWebブラウザを介さずに認証する
](http://www.techscore.com/blog/2015/12/12/google-apps-%E3%81%AE-directory-api-%E3%81%AB%E3%81%A6web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%82%92%E4%BB%8B%E3%81%95%E3%81%9A%E3%81%AB%E8%AA%8D%E8%A8%BC%E3%81%99%E3%82%8B/)
Cloud Functions のパフォーマンス（処理速度）をあげるには

# はじめに結論

Google Cloud Functions (Cloud Functions for Firebase) のパフォーマンス（処理速度）をあげる手っ取り早い方法の一つは、メモリの割り当て量を増やすことです。[公式ドキュメント](https://cloud.google.com/functions/pricing#compute_time) に記載されていますが、以下の通り、メモリの割り当て量を増やせば CPU の割り当て量も比例して増えるので、メモリが十分足りている場合でも、パフォーマンス（処理速度）を上げるために、メモリの割り当て量（CPU の割り当て量）を増やすのは有効な手段となります。なお、デフォルトでは、256 MB に設定されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/65831/0532f60d-f2a6-59d7-4dd9-dafb90cc7ecf.png)

# 実験

[この記事](https://qiita.com/OcoToOo/items/b52f473de563f1bbfd05)で作成した Cloud Functions で、メモリの割り当て量を変えて、実行時間を計測した結果が下記になります。メモリの割り当て量を、5分間のインターバルを設けながら、256 MB ⇒ 512 MB ⇒ 1,024 MB ⇒ 2,048 MB と変えて、10分間ずつシーケンシャルに Cloud Functions を実行しました。なお、実行環境は、ランタイムは Node.js 6、リージョンは us-central1 になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/65831/430ac874-3a1e-66cc-2b93-168b0f9e1e10.png)

## 計測結果
| メモリ 割り当て量 | CPU 割り当て量 | 実行時間 (50th パーセンタイル値) |
|---|---|---|---|
|256 MB|400 MHz|約 5,400 msec|
|512 MB|800 MHz|約 3,400 msec|
|1,024 MB|1.4 GHz|約 2,300 msec|
|2,048 MB|2.4 GHz|約 1,900 msec|

結果、メモリ割り当て量（CPU の割り当て量）を増やせば、実行時間も短くなっています。


なお、実際のメモリの使用量は、30 MB ～ 80 MB ぐらいです。メモリの割り当て量が 1,024 MB のときが少なくなっていて、2,048 MB のときが多くなっているのは、原因不明です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/65831/37ae2106-2776-ea7d-55ff-9b6204e1c43b.png)

# まとめ

繰り返しになりますが、Google Cloud Functions (Cloud Functions for Firebase) のパフォーマンス（処理速度）をあげる手っ取り早い方法の一つは、メモリの割り当て量を増やすことです。ただし、比例して料金も増加しますので、パフォーマンスとコストのバランスをとってメモリの割り当て量を設定することをお勧めします。
Pythonで競プロをやる時にそこそこ使う書き方（itertools編）

# 誰向け？
競プロをしていて組み合わせを全パターン列挙したいことはありませんか？
私はあります。

そんな時どうしますか？
for文使いますか？
ネストが深くなります。

そもそも書き方がわかりませんか？
確かに...ワカル...

そんな時にPython標準ライブラリのitertoolsが役に立ちます。
自分でも最近使ってみて便利だと思ったので記事にまとめることにしました。

AtCoder最近始めました。Pythonistaです。
みたいな人のお役に立てればなぁと思います。

# 何が出来るの
itertoolsを使えば順列、組み合わせ、重複順列、重複組合せのパターンを全列挙できます。

```Python
import itertools
```
## 順列
n個の要素からr個選んで一列に並べる時のパターン$nPr$の列挙
rを省略した場合は$nPn$となります。
iterableには配列以外に文字列とかも入れることが出来ます。

```Python:permutations.py
itertools.permutations(iterable, r)

list(itertools.permutations([1, 2, 3, 4], 2))
# -> [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), 
#     (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]

list(itertools.permutations([1, 2, 3]))
# -> [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

list(itertools.permutations(range(3), 2))
# -> [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
```
## 組み合わせ
n個の要素からr個選ぶ組み合わせ$nCr$の列挙
permutationsと違って第2引数が必須です。

```Python:combinations.py
itertools.combinations(iterable, r)

list(itertools.combinations([1, 2, 3, 4], 2))
# -> [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

list(itertools.combinations(range(3), 2))
# -> [(0, 1), (0, 2), (1, 2)]
```
## 重複順列
n個の要素から重複を許していち列にr個並べる時のパターン$n^r$の列挙
~~こちらも第2引数は必須かつrepeat=は省略できません。~~
→すいません...第2引数なし，repeat省略できる書き方ありました

```Python:product.py
itertools.product(iterable, repeat=1)

list(itertools.product(range(3), repeat=2))
# -> [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

list(itertools.product([-1, 1], repeat=3))
# -> [(-1, -1, -1), (-1, -1, 1), (-1, 1, -1), (-1, 1, 1), 
#     (1, -1, -1), (1, -1, 1), (1, 1, -1), (1, 1, 1)]
```
第2引数を必要としない書き方
ある2次元配列が与えられて，その各行から1つずつ要素を取りたい

```Python:product_2.py
T = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]

list(itertools.product(*T))
# -> [(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 6, 7), (1, 6, 8), 
# (1, 6, 9), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 6, 7), (2, 6, 8), 
# (2, 6, 9), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 6, 7), (3, 6, 8), (3, 6, 9)]



```

## 重複組合せ
n個の要素から重複を許してr個選ぶ組み合わせ$nHr$の列挙
正直使ったこと無いけど一応

```Python:combinations_with_replacement
list(itertools.combinations_with_replacement(range(3), 2))
# -> [(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]
```

それぞれ、返り値がイテレータになっているので上の例ではlist()をつけましたが、
for文内で使う時はlistはいりません。

```Python
for a, b, c in itertools.product([-1, 1], repeat=3):
```

# 最後に
実装が重い問題とかだと特に、こういったアルゴリズムの本質じゃない所の手間をなるべく減らしたくなりませんか？itertoolsのおかげでそこの所は大分改善されたかなぁと思います。他にもnumpyやcollections, mathとかをAtCoderでは使うので、機会があればまたまとめるかもしれません。最後に、実際に自分がitertoolsを使って解いた問題を置いておきます。

# 最近itertoolsを使った問題
[ABC028 C - 数を3つ選ぶマン]
(https://beta.atcoder.jp/contests/abc028/tasks/abc028_c)
[ABC029 C - Brute-force Attack]
(https://beta.atcoder.jp/contests/abc029/tasks/abc029_c)
[ABC073 D - joisino's travel](https://beta.atcoder.jp/contests/abc073/tasks/abc073_d)
[ABC100 D - Patisserie ABC](https://beta.atcoder.jp/contests/abc100/tasks/abc100_d)
[ABC114 C - 755](https://atcoder.jp/contests/abc114/tasks/abc114_c)
[ABC015 C - 高橋くんのバグ探し](https://atcoder.jp/contests/abc015/tasks/abc015_3)