OmniAICreator/Qiita-1.07M huggingface dataset:
RxJSで実装するムーディー・ブルース

## ムーディー・ブルース とは

[ムーディー・ブルース](https://dic.pixiv.net/a/%E3%83%A0%E3%83%BC%E3%83%87%E3%82%A3%E3%83%BC%E3%83%BB%E3%83%96%E3%83%AB%E3%83%BC%E3%82%B9) についてピクシブ百科事典には

> 護衛チームの一員であるレオーネ・アバッキオのスタンド能力。 
> 過去の出来事を再生（リプレイ）する能力を持つ。 

このように書いてあります。

この **過去の出来事を再生（リプレイ）する** というのがRxJSにぴったりなテーマである & 現在 [ジョジョ第5部のアニメ](http://jojo-animation.com/) が放送中なのでこれを書きました。

## RxJS とは

知らない方のために誇張した表現で説明すると、Rxとは時空を操る概念です。RxJSはRxのJavaScript実装となります。

https://github.com/ReactiveX/rxjs

## 過去のイベントデータがあるとする

キーボード入力のイベントデータを持っているとします。

```js
const events = [
  { ts: 100000, value: 'a' },
  { ts: 100100, value: 'b' },
  { ts: 101100, value: 'c' },
  { ts: 101120, value: 'd' },
  { ts: 101150, value: 'e' },
  { ts: 101250, value: 'f' },
  { ts: 101300, value: 'g' },
  { ts: 102000, value: 'h' },
  { ts: 102010, value: 'i' },
  { ts: 103010, value: 'j' }
];
```

このような感じです。`ts`はtimestampです。

timestampを`100000`と書いていますが、イメージとしては`Date.now()`で得られる`1540643168056`のような値が本来なら入ると思ってください。

## RxJSを使う

### Node.js

```
npm install rxjs
```

```js
const { of, from, timer } = require('rxjs');
const { scan, concatMap, delay, mapTo } = require('rxjs/operators');
```

### Web

```
<script src="https://unpkg.com/rxjs@6.3.3/bundles/rxjs.umd.min.js"></script>
```

```js
const { of, from, timer } = rxjs;
const { scan, concatMap, delay, mapTo } = rxjs.operators;
```

このように必要なものだけをデストラクチャリングで取り出すのが作法です。

## リプレイする！

```js
const head = (events.length > 0 && events[0]) || {};

from(events)
  .pipe(
    scan((p, event) => ({ ...event, diff: event.ts - p.ts }), head),
    concatMap(event => of(event).pipe(delay(event.diff)))
  )
  .subscribe({
    next: event => console.log(event),
    complete: () => console.log('complete')
  });
```

- `from` ... `events`配列をストリームに変換する。
- `scan` ... eventオブジェクトに`diff`プロパティを追加している。前回の実行結果が`p`に入る。
- `concatMap` ... Observableから新しいObservableを作る。`flatMap`に近いが、非同期処理の完了を待つという特性がある。
- `of` ... 値をObservableに変換する。
- `delay` ... 一定時間待ってからストリームを次に流す。
- `subscribe` ... `next`ではストリームを流れてきた値を使って何かする。`complete`はストリームが完了したときに呼ばれる。

ちなみに`concatMap`の行は下記のように書いても同じように動きます。

```js
concatMap(event => timer(event.diff).pipe(mapTo(event)))
```

- `timer` ... 一定時間待ってからストリームを次に流すObservableを作る。
- `mapTo` ... 次に流す値を指定したもの差し替える。

## 実行結果

ただの配列だった`events`がRxJSを使うと時間の流れを持ったストリームとなり、コード上でも上から下に流れるように表現されます。

<a href="https://gyazo.com/620134e8375b1ed0952330f2484e6297"><img src="https://i.gyazo.com/620134e8375b1ed0952330f2484e6297.gif" alt="Image from Gyazo" width="816"/></a>

以上、『RxJSで実装するムーディー・ブルース』でした。

(JSBinにサンプルコードを書きました => https://jsbin.com/wilakaj/5/edit?html,js,console )
macOS 10.14 + phpenv + php-build で configure: error: Please reinstall libedit - I cannot find readline.h

macOS 10.14 + phpenv (v0.9.0-rc.1) + php-build (v0.11.0dev) で PHP 7.2.11 をインストールしようとしたら、下記のエラーが出た。

```
configure: error: Please reinstall libedit - I cannot find readline.h
```
brew で libedit をインストールしてもエラーは変わらず、 php-build の default_configure_options に `--with-libedit` や `--without-libedit` や `--with-readline` や `--without-readline` や、それぞれに brew でインストールしたパスを設定したりしてみても状況は変わらず、いろいろ調べている過程で php-build のソースを確認したら、 macOS の場合、 default_configure_options の設定を消したり追加したり上書きしたりしていた。

https://github.com/php-build/php-build/blob/master/bin/php-build#L616

```
# Mac OSX stores some libraries (for example `libpng`)
# in `/usr/X11/lib` instead of `/usr/lib`.
#
# This currently builds PHP without the `gettext` and `readline`
# extensions, as I've currently not got them to work on my machine.
if is_osx; then |
    configure_option -D "--with-gettext"
    configure_option -D "--with-readline"
    configure_option "--with-libedit"

    configure_option -R "--with-png-dir" "/usr/X11"
fi
```

default_configure_options で設定しても上記が優先されていて、 `--without-libedit --with-libedit` といった状態になっていた（ /var/tmp/php-build/source/7.2.11/config.log で確認）。

さらにいろいろ調べたところ、インストール時に `PHP_BUILD_CONFIGURE_OPTS` で設定を追加できるらしく（ `PHP_BUILD_CONFIGURE_OPTS` の存在はどこで知ったかは失念）、 `PHP_BUILD_CONFIGURE_OPTS` に brew でインストールした libedit のパスを設定したら、無事、 PHP 7.2.11 をインストールすることができた。

```
$ PHP_BUILD_CONFIGURE_OPTS="--with-libedit=$(brew --prefix libedit)" phpenv install 7.2.11
```

# 参考

- http://php.net/manual/ja/readline.installation.php
expressとReactでSSRする際に、DOCTYPEを記述する方法

ReactでSSRする際に、DOCTYPEを書く方法がわからず、しばらくハマりました。
解決方法が見つかったので、備忘録的に記しておきます。

```Html.tsx
import * as React from 'react'
import App from '../containers/App'

interface Props {}
const Html: React.SFC<Props> = (props: Props) => {
  return (
    <html>
      <head>
        <title>App</title>
      </head>
      <body>
        <div id="app">
          <App /> 
        </div>
        <script src="/client.bundle.js" />
      </body>
    </html>
  )
}

export default Html

```

このようにHtmlコンポーネントを書いている場合、

```serverRoutes.tsx
import * as path from 'path'
import * as express from 'express'
import { Request, Response } from 'express';
import * as React from 'react'
import * as ReactDOMServer from 'react-dom/server'
import { Provider } from 'react-redux'
import { StaticRouter } from 'react-router-dom'
import configureStore from '../store/configureStore'
import Html from '../components/Html'

const store = configureStore()
const router: express.Router = express.Router()

router.get('/client.bundle.js*', (req: Request, res: Response): void => {
  res.sendFile(path.resolve(`./dist${req.url}`))
})

router.get('*', (req: Request, res: Response): void => {
  res.write('<!DOCTYPE html>') // ← これを書く!!
  const context: { url?: string } = {}
  ReactDOMServer.renderToNodeStream(
    <Provider store={store}>
      <StaticRouter location={req.url} context={context} >
        <Html />
      </StaticRouter>
    </Provider>
  ).pipe(res)
})

export default router
```

`res.write('<!DOCTYPE html>')`これを書くだけでした。
これだけで結構時間が潰れた。。。
[Laravel5]  スマートに開発用パッケージをprovider登録する方法

Laravelでのサービス開発を容易にするために多くのパッケージをインストールします。
パッケージ管理には開発時のみ使用したいパッケージと常に使用したいパッケージがあります。
Laravelでパッケージの管理をするには、composer.jsonで`require`と`require-dev`を使用します。
`require-dev`は本番環境でインストールされて欲しくないパッケージ群を登録します。

# 問題
パッケージをインストールし`provider`として登録したいが、Laravelではproviderの登録は開発用、本番用で分割されていません。
そのため開発用パッケージを`provider`として登録すると、本番環境ではインストールされていないパッケージが使われるので`class not found`が発生します。

# 解決策
解決策としては開発時のみ読み込む、`dev-provider`のようなものがあればスマートに解決できそうです。
**Laravel Dev Booter**はこれを解決してくれます。

```bash
$ composer require percymamedy/laravel-dev-booter
```

# 解説

#### インストールと追加
`config/app.php`のサービスプロバイダー配列に以下を追加しましょう。

```php
'providers' => [ 
     ... 
     PercyMamedy\LaravelDevBooter\ServiceProvider::class、
]、
```

#### DevBooterのコンフィグが見たい場合
以下のコマンドを実行し`PercyMamedy\LaravelDevBooter\ServiceProvider`の項目を選択しましょう。
隠れていた`config/dev-booter.php`が見える場所に生成され、編集できます。
必要なくなれば削除しても良いです。

```php
$ php artisan vendor：publish
```

`config/dev-booter.php`の中には以下の3つのキーが存在します。

1. dev_environments（開発環境を指定することができます）
2. dev_providers_config_key（設定ファイルのどこに開発用プロバイダ配列があるかを指定できます）
3. dev_aliases_config_key（設定ファイルのどこに開発用エイリアス配列があるかを指定することができます）


#### 使用法
登録の仕方は通常のプロバイダーと同じように開発用サービスプロバイダーを設定することだけです。
これを除いて、2種類のサービスプロバイダを完全に分離し、不要なサービスプロバイダを本番環境にロードしたり登録したりすることはありません。
同じく開発環境でのみ使用できるクラスエイリアスを設定することもできます。

```php
'dev_providers' => [
    Barryvdh\Debugbar\ServiceProvider::class,
],

'dev-aliases' => [
    'Debugbar' => Barryvdh\Debugbar\Facades::class,
]
```

# まとめ
これらはもう少し簡易的でも良い場合、簡単にコードとして自作することもできます。
ですがそれには作成、管理コストが発生するため、多くも場合はパッケージを頼ることも重要です。
Laravel公式として対応してくれるのが一番良いのですがね。
Rubyでクラスの継承チェーンをのぞいて見る


Rubyで普段から使ってるStringクラスとか、どういったクラスを継承しているのか気になったため、調べたことをまとめておきます。

継承チェーンとは？
Rubyのクラスのスーパークラスを見る、そのスーパークラスのスーパークラスを見る、をBasicObjectが見つかるまで続ける。
このクラスの道筋が継承チェーンとなります。
Stringクラスの場合だと以下のようになります。
irbで確認してみましょう

```
# Stringのスーパークラスを確認
irb(main):001:0> String.superclass
=> Object

#　StringのスーパークラスであるObjectのスーパークラスを確認
irb(main):002:0> Object.superclass
=> BasicObject
```
StringクラスのスーパークラスがObjectクラス、ObjectクラスのスーパークラスがBasicObjectクラスとなっています。
ちなみにBasicObjectクラスを見ると

```
irb(main):003:0> BasicObject.superclass
=> nil
```
となっているので、BasicObjectクラスが終点であることがわかります。

継承チェーンのモジュールについて
しかしここでクラスの親クラスを返すancestorsメソッドを使用して見ると

```
irb(main):004:0> String.ancestors
=> [String, Comparable, Object, Kernel, BasicObject]
```
先ほどスーパークラスで辿った時に出てこなかった「Comparable」と「Kernel」が出てきましたね。
これらは、クラスではなくモジュールとなります。
モジュールはクラスにインクルードされることで、クラスの継承チェーンに挿入されます。
KernelはObjectクラスにインクルードされています。
https://docs.ruby-lang.org/ja/latest/class/Kernel.html

ComparableはStringにインクルードされています。
https://docs.ruby-lang.org/ja/latest/class/String.html

このようにString一つとっても複数のクラスとモジュールが継承されていることがわかります。

次にインクルードをする場合、継承チェーンのどこに挿入されるのでしょうか？
またインクルードする順番は関係するのでしょうか？
試してみましょう。
以下のコードを動かしてみます。

```
module A
end

module B
end

class C
  include A
  include B
end

p C.ancestors
```

実行結果は

```
[C, B, A, Object, Kernel, BasicObject]
```
まず自作クラスのスーパークラスはデフォルトでObjectクラスになるのですが、
インクルードされたModuleがスーパークラスの前に差し込まれています。
またBの方がAより先に来ています、
つまりインクルードすると、
・自分のクラスの後に差し込まれる
・複数インクルードすると後に指定した方が継承チェーンでは先に来る
となります。

ちなみに

```
module A
end

module B
end

class C
  prepend A       #includeをprependに変更
  include B
end

p C.ancestors
```
とincludeをprependに変更すると、自分のクラスの後ではなく先に挿入されます。
以下実行結果です

```
[A, C, B, Object, Kernel, BasicObject]
```
Cより先にAが来ていますね。

このように継承チェーンのどこに差し込むかは、includeを使うかprependを使うか、
includeの場合は、上に書くか下に書くかで変わって来ます。

参考文献
[メタプログラミングRuby 第2版](https://www.oreilly.co.jp/books/9784873117430/)
四捨五入をしてみた・xcodeで実機テストができないよ...（キーチェーンやら証明書やらの問題）

# 四捨五入
`.round`を使うとできるぽいですね．引数がない場合は四捨五入ですが，`.up`や`.down`を引数にすると以下のような結果になります．:thinking:

```test.swift
var num = 12.012
num.round(.up)     // 13.0

var num = 12.012
num.round(.down)     // 12.0

```

# 実機テストする際のエラー
どうも今までできていた実機テストができなくなっていたので，その時のエラー表記等を以下に記載します．

 - codesignは、キーチェーンに含まれる…
![スクリーンショット 2018-11-09 22.06.49.png](https://qiita-image-store.s3.amazonaws.com/0/241421/174b5b00-c498-4cdc-2ade-4f96a92b2290.png)

 - xcode内ではfailedなんちゃらって書かれてたかな（すいません，記事書く前に寝ちゃったんです．）

原因としてはどうやら，Xcodeを10.0にアプデした際に，Xcodeのビルドシステムが一新されたことが理由っぽい．そのせいでキーチェーンや証明書の参照がバグってるみたい．（）

```解決策
1. XcodeのPreferenceを選択して設定画面を出し、
   Accounts画面に登録されているApple IDを「-」で削除する．
2. XcodeのQuitのメニューを選択してXcodeを終了する．
3. キーチェーンアクセスを起動して画面左の選択で
   キーチェーン欄を「ログイン」，分類欄を「自分の証明書」とする．
   証明書一覧の中に「iPhone Developer: (自分のアカウント名)」
   という名前の証明書があるはずなのでそれを削除．
　　もしかしたら，証明書の中身のキーチェーンを削除しないと証明書は消えないかも．
4. Macを再起動．
5. Xcodeを起動し，再度アカウントを登録する．
6. Xcodeのプロジェクトを開いて、実機実行ボタンを押す．
   確認画面が出てきたら，Macにログインする際のパスワードを入れて「常に許可」
   を選択する．

ちなみに，ビルドシステムを昔のタイプに変更したかったら
Xcodeの画面最上部のコントローラでFile>Project Settingsに行けば変更できるよ．
```
JSのスプレッド演算子

#JSのスプレッド演算子について
今回はJavaScriptのスプレッド演算子についてご紹介させていただきます。
##スプレッド演算子ってなに？
まずは以下のコードを見てください。

```javascript
const foo = [1, 2];
const bar = [...foo]; 
```

```...foo``` ??
スプレッド演算子とは、```...```を用いた値の展開を行うオペレーターです。

上記のコードの場合```bar```の値はどうなっているかというと、fooが展開された値が入っていることになります。

```javascript

bar = [...foo]; // => [1, 2]
```
これは二つの配列をマージする時にも使えます。

```javascript
foo = [1, 2];
bar = [3, 4];
poe = [...foo, ...bar]; // => [1, 2, 3, 4]
```

###オブジェクトにも使えるの？
上記の例は配列によるものでしたが、オブジェクトにも使えます。
オブジェクトの場合には以下のようになります。

```javascript
let foo = {a:1,b:2};
let poe = {c:3,d:4};
baz = {...foo,...poe}; // { a: 1, b: 2, c: 3, d: 4 }
```
つまり、配列でもオブジェクトでもどちらでも値を展開するのに利用することができます。
配列の場合には```for(... of ...)```と似た様な挙動になり、
オブジェクトの場合には```for(... in ...)```と似た挙動になります。

###他にはどんなことができる？
####コピー
配列の複製を簡単にすることができます。

```javascript
const foo = [1, 2];
const bar = [...foo]; //[1, 2]
```
####マージ
二つ以上の配列のマージができます。
arrayで言う所のconcat(),objectで言う所のassign()みたいなことですね。

```javascript:配列の挙動の確認
foo = [1,2];
poe = [3,4];

//concat
console.log(foo.concat(poe)); //[ 1, 2, 3, 4 ]
//スプレッド演算子
console.log([...foo,...poe]); //[ 1, 2, 3, 4 ]
```

```javascript:オブジェクトの挙動の確認
foo = {a:1,b:2};
poe = {c:3,d:4};

//assign
console.log(Object.assign({},foo,poe)); //{ a: 1, b: 2, c: 3, d: 4 }
//スプレッド演算子
console.log({...foo,...poe}); //{ a: 1, b: 2, c: 3, d: 4 }
```

####"String".split("")
厳密には"それっぽい"ことができます。
やってみましょう。

```javascript
console.log("Hello".split("")); //[ 'H', 'e', 'l', 'l', 'o']
console.log([..."Hello"]); //[ 'H', 'e', 'l', 'l', 'o']
```

####分割代入で余った引数を...hogeで受け取る
以下のように受け取ることができます。

```javascript
let [huga, poe, ...hoge] = [1, 2, 3, 4, 5];
console.log(hoge); // => [ 3, 4, 5 ]
```

####配列から重複を取り除く
```javascript
const data = ['a', 'b', 'c', 'a', 'b', 'd'];
const dist = [...(new Set(data))];
console.log(dist) //['a', 'b', 'c', 'd']
```
Set オブジェクトは重複しない値の集合を管理するためのオブジェクトです。
重複する値が追加された場合には、それを無視します。


##さいごに
スプレッド演算子の一例についてご紹介させていただきました。
かなり使えるなと思ったので、ぜひ今後活用してみてほしいです。
kotlinでcsvファイル→insert文のプログラムを作った

今回なぜkotlinでcsvからinsert文のプログラムを作ったかというと、先日上司に「このエクセルファイルをデータベースに入れるためのinsert文作っといて」と言われて非常に困った記憶があったので作ってみようと思いました。


まぁ業務ではjavaしか使わないのですがkotlinの勉強の意味で作りました。


事前準備はcsvファイルがほしいので以下のファイルを実行
動作環境STS(eclipse) java8 kotlin1.2
csvは1行目にカラム名、2行目以下に値を入れることとします。

```junbi.kt
import java.util.*
import java.io.*

fun main(arg:Array<String>){
	
	var file5 = File("test7.csv").absoluteFile
	var text="id,name,company,segment,zipcode,prefexture\r\n"
	var text2 = "1,taro,success,hr,1234567,tokyo\r\n"
	var text3 ="2,ziro,success,hr,1234567,saitama\r\n"
	var text4 = "3,saburo,solutions,network,1234567,kanagawa\r\n"
	file5.writeText(text+text2+text3+text4)
	println("ファイル出力完了")
}
```
ここでのFileクラスはパスを指定するためのもので絶対パスでの指定となります。
STSの環境下ではプロジェクト直下にファイルの作成または書き込みがなされます。
\r\nは改行で環境によっては違うかもしれません。
FileクラスのwriteTextメソッドはファイルに書き込みを行います。
このクラスを実行し以下のcsvファイルが出来ました。

```test7.csv
id,name,company,segment,zipcode,prefexture
1,taro,success,hr,1234567,tokyo
2,ziro,success,hr,1234567,saitama
3,saburo,solutions,network,1234567,kanagawa
```

では次にこのcsvファイルを読み込んでSQL文を作ってみましょう。

```FileSample.kt
import java.util.*
import java.io.*

fun main(arg:Array<String>){
	val file =File("test7.csv").absoluteFile
	var reader = file.readText()
	
	var list=reader.split(Regex("\\r\\n"))
	var columnList = list.get(0).split(Regex(","))
	var tableName="sample"
	var stringFlg=listOf(1,1,1,1,1)
	
	for(index in list.indices){
		if(index==0 || list.size-1==index){
			continue
		}
		print("insert into $tableName(")
		print(columnList.get(0))
		var valueList=list.get(index).split(Regex(","))
		for(item in columnList.drop(1)){
			print(",$item")
		}
		print(")values(")
		print(valueList.get(0))
		valueList=valueList.drop(1)
		for((flgindex,value) in valueList.withIndex()){
			if(stringFlg[flgindex]==1){
				print(",'$value'")
			}else{
				print(",$value")
			}
		}
		println(")")
	}
}
```

readerText()メソッドはファイルを読み込んで文字列で返してくれます。
次のところでは取ってきた文字列のsplitメソッドを使って行単位で文字列を分解しています。
Regexは正規表現を表すオブジェクトです。
columnListはカラムを取ってきてsplitで分割してlistにしています。
stringFlgは文字列を入れるかどうかを判別するために作りました。ここは少し下手すぎたかもしれません。
list.indicesはインデックスのみを取ってきてくれるものです。ここらへんももっと上手いやり方があるかな、と感じました。
print("文字列 $変数名 文字列")はkotlinでおなじみの文字列と変数を組み合わせてくれるものでjavaのSystem.out.println("文字列"+変数名+"文字列")と同じ働きをしてくれます。
valueList.drop(数字)は数字の分だけ前のものをなくします。直接消してくれるわけではないので再代入が必要です。
(flgIndex,value) in valueList.withIndex()はflgIndexにインデックスを渡し、valueに値を渡します。

実行結果は下記のようになります

```
insert into sample(id,name,company,segment,zipcode,prefexture)values(1,'taro','success','hr','1234567','tokyo')
insert into sample(id,name,company,segment,zipcode,prefexture)values(2,'ziro','success','hr','1234567','saitama')
insert into sample(id,name,company,segment,zipcode,prefexture)values(3,'saburo','solutions','network','1234567','kanagawa')
```

####印象
文字列の中に変数入れられるのは便利
for文がいっぱいあるのできちんと勉強しないと使いこなせなさそう
コレクションのStreamとかを使えばもう少し綺麗に書けるのか


####次回目標
このプログラムの改善
CSV→JSONの変換のプログラム
大量のランダムデータを出した上でCSVやJSONに変換するプログラム
AzureAppService にnode.jsアプリをデプロイすると500 error 

# AzureAppService にnode.jsのアプリをデプロイすると500 error でページが表示されない

*結論から言うと、web.configというファイルがないからです。*



たとえば、以下のようなnode.jsのアプリを、ローカルで`node app.js`と叩いて、http://localhost:5000 でちゃんと動く以下のような簡単なnode.jsアプリがあるとします。

![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/307441/cb223be4-0604-e8a5-f11f-e0db14425e9d.jpeg)

![HelloWorld.jpg](https://qiita-image-store.s3.amazonaws.com/0/307441/461cbfa3-0726-d3a5-f596-c5ee437d0d45.jpeg)





これを、AzureAppServiceにGithubから同期するなりZIP化してアップロードするなりしてみるとあらら～・・・



### HTTP 500 ERROR



Azure AppはIISで動いているのでweb.configファイルが必要のようです。





## web.configファイルはどこにあるの？:disappointed_relieved:





以下のやり方でとってきます（自己流）





1. 公式マニュアルの、cloudシェル上でコマンドで作成していくやり方ではなく、Azureの画面で「Node JS Empty Web App」から作成します。
   ![無題2.jpg](https://qiita-image-store.s3.amazonaws.com/0/307441/67c8ce12-d2a2-6b97-a81e-110277244ea9.jpeg)
2. 作成できたら、App Serivice Editorを開きます。
   ![無題3.jpg](https://qiita-image-store.s3.amazonaws.com/0/307441/ae5ebef4-cf1a-5f46-f6a6-fa7dd5ae0188.jpeg)
3. デプロイされたコードの中に、web.configがあります。その中身をそのままコピーして、自分のプロジェクトフォルダ内にweb.configファイルを新規作成し、ペーストします。
   ![無題4.jpg](https://qiita-image-store.s3.amazonaws.com/0/307441/be0ad73d-5422-21f3-3143-d65b856b7f27.jpeg)
4. web.configファイルのコード内には`server.js`と記入してある箇所がいくつかあります。あなたがapp.jsをmainファイルにしているなら、`server.js`をすべて`main.js`に置換しなければなりません。
5. その他のAzureがデプロイしたファイル、iisnode.yml azuredeploy.json, HTMLPage.html等々は必要ないです。





半年前はこんなことする必要なかったんですけどね。何が起きたのマイクロソフトさん？





以上の情報は以下の電子ブックの一部から引用しました。

> ### [Node.jsとMicrosoft Azure App ServiceでTwitterボット作成vol2 Kindle版](https://www.amazon.co.jp/Node-js%E3%81%A8Microsoft-Azure-App-Service%E3%81%A7Twitter%E3%83%9C%E3%83%83%E3%83%88%E4%BD%9C%E6%88%90vol2-Atom-ebook/dp/B07CXV6N8S/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1540638436&sr=1-2&keywords=Atom+Yah)
Dockerを使ってDLNAサーバを構築してみた

# 今回やること
Dockerのコンテナを用いてminiDLNAによるDLNAサーバを構築し、PS3から動画を見れるようにします。
ファイルサーバと併用すると非常に便利です。
ファイルサーバの構築は以下にて解説しています。
[SIer営業1年目がDockerを使ってファイルサーバを構築してみた](https://qiita.com/tororu/items/5166378dfb6ae64102ee)

# 背景
以前はmediatombを使っていましたが、現在開発されていない（？）とのことで、miniDLNAを選択しました。

# 事前準備：ポート開放
PS3からDLNAサーバを見つけるために、ポート開放をしていきます。
CentOS7からはサービス単位でポート開放することが推奨されているので、以下のxmlファイルを作成します。

```/usr/lib/firewalld/services/minidlna.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>minidlna</short>
  <description></description>
  <port protocol="udp" port="1900"/>
  <port protocol="tcp" port="5000"/>
  <port protocol="tcp" port="8200"/>
</service>
```

上記の設定を反映するために以下のコマンドを入力。

```
# firewall-cmd --add-service=minidlna --permanent
# firewall-cmd --reload
```

これで準備ができました。

# Dockerコンテナの起動
Dockerのコンテナを作成していきます。
今回もセキュリティ無視で有志の方が作ってくれたものを使っていきます。
https://hub.docker.com/r/vladgh/minidlna/

```
$ docker run -d --restart=always \
               --net=host \
               --name dlna \
               -p 8200:8200 \
               -v /mnt/main/movie:/media \
               -e MINIDLNA_MEDIA_DIR=/media \
               -e MINIDLNA_FRIENDLY_NAME=MyDLNA \
               vladgh/minidlna
```

## 起動確認
ブラウザからhttp://<サーバのアドレス>:8200にアクセスし、MiniDLNAのステータスが表示されていることを確認。
表示されていた場合、PS3等からも確認。
atcoder ABC104 D問題

#atcoder ABC104 D問題
動的計画法を使う問題で、初見で解けず長時間かかった問題。
dpを学ぶ良い問題だったので、解法をメモ程度にまとめた。
https://beta.atcoder.jp/contests/abc104/tasks/abc104_d

解法
普通に'?'を全部'A','B','C'に置き換えて、その都度ABCの数を数えるのはとても間に合わないので、動的計画法を使う。この問題に対するABCの数え方は、与えられた文字列に対し、i番目までの文字についての状態を4種類考える。この4種類は、以下の通り
0, (何もカウントしていない)
1,A(Aを一個だけカウントしている)
2,A B(A,Bをこの順で一個ずつカウントしいる)
3,A B C(A,B,Cをこの順で一個ずつカウントしている)

よってdpの定義は次のようになる。
dp[i][j]:i番目までの文字の中で、状態j(先ほどの4種類)である状態数

例として、"A??B"のサンプルを考える。
まず、dp[0][0]は0番目(サンプルでいうA)までで、状態0になればいい。Aは'?'のように3種類に変化しないので

```java

dp[0][0] = 1;
```
また、同様にdp[0][1]は0番目(サンプルでいうA)までで、状態1になればいい。今ちょうど0番目の文字が'A'なので状態1になることができる。よって、

```java

dp[0][1] = 1
```
ついで、dp[0][2]、dp[0][3]については、まだ1文字目までしか見れていないのに、状態2、状態3にできるわけないので、

```java

dp[0][2] = dp[0][3] = 0
```

次にdp[1][0]について考える。ここでは、1番目の文字が'?'なので、3種類に変化できることを考えると、状態数は、dp[0][0]の3倍になるので

```java

dp[1][0] = dp[0][0]*3
```

になる。dp[1][1]は、1番目までで、状態1(A,Bをカウントしている状態)になる状態数である。1番目の文字で、状態2になるには2通りの方法がある。
(1)0番目までの文字で、'A'を一個カウントしていて、1番目の文字はなんでも良いという状態
(2)0番目までに文字を入れず、1番目の文字で'A'を一個カウントする状態
dp[1][1]はこの2つの和になる。
(1)について詳しく考えると、0番目までの文字で、'A'を一個カウントする場合、1番目の文字はなんでも良い。もし1番目の文字が'?'なら状態数はdp[0][1]の3倍になり、もし1番目の文字が'?'でないなら状態数は1倍である。
(2)について詳しく考えると、1番目の文字で'A'を一個カウントする場合、1番目の文字が'?'か'A'でなければならない。
よって、今1番目の文字は'?'なので

```java

dp[1][1] = dp[0][1]*3+dp[0][0]*1
```
となる。

以上より簡単にまとめると

```java
if(j == 0){
	if(S.charAt(i) == 'A' ||S.charAt(i) == 'B'||S.charAt(i) == 'C'){
			dp[i][0] = dp[i-1][0];
	}else{
			dp[i][0] = dp[i-1][0]*3L;
	}
 
}else{				
    long x = (S.charAt(i) == '?' ? 3L : 1L);				//?だったら3倍、他は1倍   	 
    long y =( (S.charAt(i) == ABC.charAt(j-1)|| S.charAt(i) == '?') ? 1L :0L);
					dp[i][j] = (dp[i-1][j] * x) + (dp[i-1][j-1]*y); 
}
```

となり、境界やmodで割ることを忘れなければACとなる。
Arduino互換機（ESP8266/ESP32）で google-home-notifier のしゃべりが遅いので替えてみた


HOYA提供のVoideTextが無料ではなくなりました。以下は備忘で残しておきますがもう使用できません。2025/04/04

# はじめに
GoogleHomeに google-home-notifier を使ってしゃべらせる方法は、広く使われるようになりました。ESP8266/ESP32用に@horihiroさんが「[ESP8266 から Google Home に喋らせるライブラリ](https://qiita.com/horihiro/items/4ab0edf415916a2cd542)」を公開して下さっています。ところが、google-ttsエンジンのspeedパラメータが上手く働いてくれないようで、ちょっと遅いしゃべりになってしまいます。これは前から不満が上がっているようで、TTSエンジンを別の HOYA提供のVoideTextに替えている方が多くいらっしゃいます。またVoiceTextは話者を色々選べるので面白そうです。@horihiroさんのライブラリを使って、TTSエンジンの部分だけ VoideText に替えてみました。

# ハード
* ESP32(ESP-WROOM-32) 開発ボード。
今回も秋月電子の[AE-ESP-WROOM02-DEV](http://akizukidenshi.com/catalog/g/gK-12236/)


# ソフト
* ArduinoIDE1.8.7
* ESP32拡張モジュール(1.0.0)
* esp8266-google-home-notifier(1.0.6)
* esp8266-google-tts
* 母艦(Windows10)

# esp8266-google-home-notifier
Arduino(ESP8266/ESP32)で [GoogleHome を喋らせるライブラリ](https://github.com/horihiro/esp8266-google-home-notifier)を @horihiroさんが公開されています。ありがとうございます。
詳細は[こちら](https://qiita.com/horihiro/items/4ab0edf415916a2cd542)。
（今回使用しませんが esp8266-google-tts が無いとコンパイルが通らないと思います）

# VoiceText
HOYA株式会社提供の無料で使用できるAPIを公開して下さっています。メール登録でAPIをキーを取得して使用します。

[VoiceText Web API](https://cloud.voicetext.jp/webapi/docs/api)

話者は、以下のような者が使えるようです。今回は 「hikari」を使ってみました。(※上記、ドキュメントより引用)
><img src="https://qiita-image-store.s3.amazonaws.com/0/203949/a3f9aeda-1f92-746b-9bbf-bb812f9f667d.png" width=80%>

下記ソース上では以下で変えられます。

```cpp:
String tts_parms = "&speaker=hikari&volume=200&speed=120&format=mp3";
```

# 実装
特に難しいことはなく、esp8266-google-home-notifier の device()/notify() メソッドを呼ばずに、boolean play(const char *mp3Url) を使います。

面倒なのは、「VoiceText Web API」はPOST要求のみなので、play() に 「VoiceText Web API」の URLを直接渡すことができません。なので、「VoiceText Web API」のPOST要求応答を 一旦 SPIFFS に保存して、ESP32にWebServerを立てて、

```CPP:
play("http://ESP32アドレス/test.mp3")
```
のように渡しました。ちょーめんどい。SPIFFS に入れずにメモリ上でも良かったんですが。

下記ソースをコンパイル＆アップし接続に成功すると、「♪ディロン♪開始します♪」。
以下のようなパラメータで好きな言葉を話してくれます。

```URL:
http://ESP32アドレス/voice?text=始めましてこんばんみ
```

もっとちゃんとパラメータ設定できるよにすれば良かったんですがサンプルなのでヤメました。(話者とか)


# ソース
こちらにソースを置いておきます。
https://github.com/nori-dev-akg/esp32-google-home-notifier-voicetext
ESP8266でも動くと思います。ヘッダファイルを変更してください。


# SpecialThanks!!
[ESP8266 から Google Home に喋らせるライブラリ](https://qiita.com/horihiro/items/4ab0edf415916a2cd542)
[VoiceText Web API](https://cloud.voicetext.jp/webapi/docs/api)
sklearn.svm.SVCのpredict_probaって

# はじめに
　SVMで二クラス(0/1)の分類器を学習して、各データのクラス1への所属確率を出したい用ができたので [sklearn.svm.SVC](http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html) を見ていたら、[predict_proba](http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC.predict_proba)とかいうまさになやつを見つけたので、使って見たら ん?ってなった話。


# ん?ってなったこと
　[predict(X)](http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC.predict)で予測した結果と**predict_proba**で算出した確率の整合が取れてない（時がたまにあった）のです。

# 準備
いったんpredictとpredict_probaの仕様を確認。

## predict(X)
　[データ数]行 × [次元数]列の特徴量行列 *X* を引数にして、データ数分の予測ラベルを返すそうです。読む必要なかった。
![predict.png](https://qiita-image-store.s3.amazonaws.com/0/253933/cefa30fb-15d9-1703-7fdb-f23de54a18e0.png)

## predict_proba(X)
　　[データ数]行 × [次元数]列の特徴量行列 *X* を引数にして、各データがそれぞれのクラスに所属する確率を返す、って書いてあります。で、最後に「列はクラス名でソートされていて、そのクラス名は **classes_**で見れますよ」とも書いてあります。

![predict_proba.png](https://qiita-image-store.s3.amazonaws.com/0/253933/d8831021-53e7-1a02-fb01-858adbd42d83.png)

　上記をふまえると、例えば、```X = [[-1 -1 0][-1- -2 -1][2 5 1]]```, ```y = ['0' '0' '1']```みたいなデータの場合、predict(X)は（全部正解なら）```['0' '0' '1'] ```, predict_proba(X)は```[[0.9 0.1][0.88 0.12][0.01,0.99]]```みたいになるってことですよね。


# 本題
　なのに、predict(X)

```
['1' '1' '0' '1' '0' '0' 　・・・
```
で、predict_proba(X)が

```
[[0.60069337 0.39930663]
 [0.60064285 0.39935715]
 [0.18527877 0.81472123]
 [0.60069337 0.39930663]
 [0.18525054 0.81474946]
 [0.18532548 0.81467452]
・・・
```
のように逆になっているときが、数回に一回あったのです。念のため **.classes_**でクラスの順番を確認しましたが、こちらは何回実行しても

```
['0' '1']
```
のように常にクラス名順でした。predict_proba(X)だけがたまに逆になるのです。

# いろいろ調べたら
　このことについて質問したり説明してる人がいました。

 - https://stackoverflow.com/questions/17017882/scikit-learn-predict-proba-gives-wrong-answers
 -  https://leck-tech.com/machine-learning/svm#Classification

　端的に言うとpredictとpredict_probaは矛盾することがあるから[decision_function(X)](http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC.decision_function)使った方がいいよ、的なことが書いてありました。

＊なんで矛盾するのとかそういう細かい話は面倒なので書きません。知りたければ *"Platt Scaling"* でググるか、[元論](http://www.cs.colorado.edu/~mozer/Teaching/syllabi/6622/papers/Platt1999.pdf)を読んだりしてください。

# じゃあどうしたらいいんだろ
　いろいろ考えても正解は出なかったのですが、候補だけ挙げさせていただきます。

## 1. decision_function(X)を確率っぽい値に変換する
　decision_function(X)を使うと、上の例だと

```
[ 1.00020435  0.99997659 -1.0001893   1.00020435 -1.0003867  -0.99986263
```
のような値がでます。（意味は省きますが）この値が正だとクラス1、負だとクラス０に分類されるので、この値をシグモイド関数に代入すれば確率っぽいものは出せますね。ただ、シグモイド関数の係数をどう設定すればいいんだっていう話と、その係数を最適化するのがPlatt Scalingみたいなのでもうあれです。


## 2. predict_probaが逆になっても大丈夫なようにコードを書く
「predict(X)でクラス1と予測されたデータのpredict_probaが大きい方の列がクラス1の列だよ」っていうのを学習時に記憶させておくとか。ただ、それが理論的にしていいことなのかわかりません。

## 3. SVMをあきらめる
あきらめることも大事。

# おわりに
　predict_probaはRandomForestとか他の手法にもあるので、そっちも同じ感じだと困るなーと。これはSVMだけの事象だよとかこうするほうがいいと思うよとかそういう意見を頂けたらとっても嬉しいです。

<br>
<br>
GoogleDriveで今開いているファイルのパスを知る方法

# ドキュメントのパスを知りたい
GoogleDriveで検索してファイルを開いたはいいものの、**「このドキュメントはそもそもどこに置かれているのか？」**となることがよくある。

# 方法

<img width="862" alt="操作.png" src="https://qiita-image-store.s3.amazonaws.com/0/142791/cc397dc5-ab5e-a7de-ba93-2c5f1d138e24.png">

# 結果

<img width="990" alt="パス把握.png" src="https://qiita-image-store.s3.amazonaws.com/0/142791/81e749bc-a15a-017b-e9af-744a24c5fe99.png">
Asterisk のインストール

やってみたのでメモ。

# 手順
1. SELinux を無効化する

    ```
    # vi /etc/selinux/config
    ```

    ```sh:/etc/selinux/config
    SELINUX=disabled
    ```

2. 依存パッケージをインストール

    ```
    # yum install -y epel-release dmidecode gcc-c++ ncurses-devel libxml2-devel make wget openssl-devel newt-devel kernel-devel sqlite-devel libuuid-devel gtk2-devel jansson-devel binutils-devel patch
    ```

3. Asterisk 実行用ユーザを作成して切り替わる

    ```
    # useradd asterisk && su asterisk
    ```

4. 作業用のディレクトリを作成する

    ```
    $ mkdir ~/build && cd ~/build
    ```

5. PJSIPパッケージをダウンロードする

    ```
    $ curl -LkvOf https://www.pjsip.org/release/2.8/pjproject-2.8.tar.bz2
    ```

6. ダウンロードしたPJSIPパッケージを展開する

    ```
    $ tar xvjf pjproject-2.8.tar.bz2 && cd pjproject-2.8
    ```
7. configureメソッドを実行する

    ```
    $ ./configure CFLAGS="-DNDEBUG -DPJ_HAS_IPV6=1" --prefix=/usr --libdir=/usr/lib64 --enable-shared --disable-video --disable-sound --disable-opencore-amr
    ```

8. make depを実行する

    ```
    $ make dep
    ```

9. makeコマンドなどを実行する

    ```
    $ make && sudo make install && sudo ldconfig
    ```

10. ldconfigコマンドを実行する

    ```
    $ ldconfig -p | grep pj
    ```

11. buildディレクトリ直下に戻る

    ```
    $ cd ~/build
    ```

12. Asterisk のパッケージをダウンロードする

    ```
    $ curl -LkvOf https://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-16.0.0.tar.gz
    ```

13. ダウンロードしたパッケージを展開する

    ```
    $ tar -zxvf asterisk-16.0.0.tar.gz && cd asterisk-16.0.0
    ```

14. svn をインストールする

    ```
    $ sudo yum -y install svn
    ```

15. スクリプトを実行する

    ```
    $ sudo ./contrib/scripts/get_mp3_source.sh
    $ sudo contrib/scripts/install_prereq install
    ```

17. configureコマンドを実行する

    ```
    $ ./configure --libdir=/usr/lib64 --with-jansson-bundled
    ```

18. make コマンドを実行して必要なものを有効化する

    ```
    $ make menuselect
    ```

19. インストールする

    ```
    $ make && sudo make install && sudo make samples && sudo make config
    ```

20. Asteriskを起動する

    ```
    $ sudo service asterisk start
    $ sudo asterisk -rvv
    ```

# 参考
- [Installing Asterisk From Source](https://wiki.asterisk.org/wiki/display/AST/Installing+Asterisk+From+Source)
- [How to Install Asterisk on CentOS 7](https://www.tecmint.com/install-asterisk-on-centos-7/)
abc 094

C
l が奇数のとき，l 個の数 a1,a2,…,al の中央値とは，a1,a2,…,al の中で 
l+1
2
番目に大きい値のことを言います．
N 個の数 X1,X2,…,XN が与えられます．ここで，N は偶数です． i=1,2,…,N に対して，X1,X2,…,XN から Xi のみを除いたもの，すなわち X1,X2,…,Xi−1,Xi+1,…,XN の中央値を Bi とします．
i=1,2,…,N に対して，Bi を求めてください．
制約
2≤N≤200000
N は偶数
1≤Xi≤109
入力はすべて整数

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
int main() {
	int N;
	cin >> N;
	vector<int>V(N);
	for (int i = 0; i < N; ++i) {
		cin >> V[i];
	}
	for (int i = 0; i < N; ++i) {
		vector<int>v = V;
		v.erase(v.begin() + i);
		sort(v.begin(), v.end());
		cout << v[(N - 2) / 2] << endl;
	}
	return 0;
}
```
tle

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
int main() {
	int N;
	cin >> N;
	vector<int>V(N);
	vector<int>Y(N);
	for (int i = 0; i < N; ++i) {
		cin >> V[i];
		Y[i] = V[i];
	}
	sort(V.begin(), V.end());
	for (int i = 0; i < N; ++i) {
		if (Y[i] < V[N / 2 - 1])
			cout << V[N / 2] << endl;
		else if (Y[i] > V[N / 2])
			cout << V[N / 2 - 1] << endl;
		else if (Y[i] == V[N / 2 - 1])
			cout << V[N / 2] << endl;
		else if (Y[i] == V[N / 2])
			cout << V[N / 2 - 1] << endl;
	}
	return 0;
}
```
ちょっとだけ早く
Node-REDからTwilio経由で電話をかける

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

ハッカソンでよく使われるNode-RED。
Twilio経由で電話をかけたいというリクエストが結構あるので、その方法を記事にしておきます。
Twilio側は、Studioを使うので、基本的にコードを書く必要はありません。

## 準備

- Twilioアカウント（トライアルでも可能ですが、発信先は認証済み番号に限られます）。
- Node-RED環境（IBMクラウド、もしくはローカルインストールのどちらでも可能です）。

## Twilio Studioで電話をかけるフローを作成する

![Node-RED_TwilioStudio (1).png](https://qiita-image-store.s3.amazonaws.com/0/86046/b306d540-f387-3363-8145-2e86628950c0.png)


上記のように、**REST API**トリガーを起点に、**Make outgoing call**ウィジェットと、**Say/Play**ウィジェットを組み合わせて、架電して応答メッセージを流すフローを作成します。
**Make outgoing call**ウィジェットのパラメータは変更する必要はありません。
**Say/Play**ウィジェットの**TEXT TO SAY**フィールドには、{{flow.data.message}}と入れておきます。こうすることで、Node-RED側で指定したメッセージを発話させることができます。

作成したフローの**Trigger**ウィジェットに書かれている**REST API URL**をコピーして、メモ帳にコピーしておきます。

## Twilioの認証情報をコピーする

Twilioコンソールのダッシュボードを開き、Account SIDとAuthTokenをメモ帳にコピーしておきます。

![Node-RED_Twilio_SID.png](https://qiita-image-store.s3.amazonaws.com/0/86046/33563f60-0eda-420b-96e0-9d4fabad0bc3.png)

## Node-REDで、ノードを組み立てる

たとえば、以下のようなフローを作成します。

<img width="821" alt="スクリーンショット 2018-10-27 18.48.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/c3a151cb-40ea-e397-2a22-095b15d7a73c.png">

### functionノードのパラメータ（上記では *param*ノード）

```javascript
msg.payload = {'From': '+8150XXXXXXXX', 'To': '+8190XXXXXXXX', 'Parameters': JSON.stringify({'message': 'ここに流したいメッセージを記入'})};
msg.headers = {'content-type':'application/x-www-form-urlencoded'};
return msg;
```

Fromパラメータには、Twilioで購入した050番号を記載します。
Toパラメータには、発信先の電話番号を記載します。
messageパラメータには、相手が応答した際に流すメッセージを指定します。

### http requestパラメータ

![Node-RED_http_request.png](https://qiita-image-store.s3.amazonaws.com/0/86046/942c585b-a180-7dfa-d5eb-078d4e358cc9.png)

- メソッドを「POST」に変更します。
- **URL**には、先程メモ帳に控えておいたStudioフローのREST API URLを指定します。
- ベーシック認証のチェックを入れます。
- **ユーザ名**には、TwilioのAccount SIDを入れます。
- **パスワード**には、Account SIDに対応したAuthTokenを入力します。

## テスト

Node-REDをデプロイして、timestampノードの左側をクリックしてフローを実行します。
しばらくすると電話がかかって、指定したメッセージが再生されます。
abc093

B
以下を満たす整数をすべて昇順に出力してください。
A 以上 B 以下の整数の中で、小さい方から K 番目以内であるか、大きい方から K 番目以内である
制約
1≤A≤B≤109
1≤K≤100
入力はすべて整数である

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int A, B, K;
	cin >> A >> B >> K;
	if (B - A +1<= 2 * K) {
		for (int i = A; i <= B; ++i) {
			cout << i << endl;
		}
	}
	else {
		for (int i = A; i < A + K; ++i) {
			cout << i << endl;
		}
		for (int i = B - K + 1; i <= B; ++i) {
			cout << i << endl;
		}
	}
	return 0;
}
```

C
3 つの整数 A,B,C が与えられます。以下の 2 種類の操作を好きな順で繰り返して A,B,C をすべて等しくするために必要な操作の最小回数を求めてください。
A,B,C のうち 2 つを選んで、その両方を 1 増やす
A,B,C のうち 1 つを選んで、その整数を 2 増やす
なお、これらの操作を繰り返して A,B,C をすべて等しくできることは証明できます。
制約
0≤A,B,C≤50
入力はすべて整数である

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
int main() {
	int A, B, C;
	cin >> A >> B >> C;
	vector<int>V;
	V.push_back(A);
	V.push_back(B);
	V.push_back(C);
	sort(V.begin(), V.end());
	int a;
	a= V[2] - V[0];
	int b;
	b= V[2] - V[1];
	if (a % 2 == b % 2)
		cout << (a + b) / 2 << endl;
	else
		cout << (a + b + 1) / 2 + 1 << endl;
	return 0;
}
```
答えは合う

3 つの整数の和の偶奇は操作によって不変です。また、整数を減少させることはできないので、3 つの整数 が等しくなったならば、その時の値は 3 つの整数の最大値 (以下これを M とする) 以上です。よって、もし 3M と最初の 3 つの整数の和の偶奇が等しいなら、3 つの整数が等しくなった時の値は M 以上、そうでなけ れば M + 1 以上です。 逆に、この下限が達成できることは簡単にわかるので、この問題を解くことができました。

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
int main() {
	int A, B, C;
	cin >> A >> B >> C;
	int m = 0;
	m = max(m, A);
	m = max(m, B);
	m = max(m, C);
	if (3 * m % 2 == (A + B + C) % 2)
		cout << (3 * m - A - B - C) / 2 << endl;
	else
		cout << (3 * m - A - B - C + 1) / 2 + 1 << endl;
	return 0;
}
```
貪欲に合わせていく。
「+2の操作」では操作後の偶奇が一致する。
そのため、まずは全ての数の偶奇を合わせる必要がある。
これは「+1の操作」を多くても1回行うだけで良い。
最初にこの調整を行う。
あとは、最大の数に合わせるように+2をしていくと答え。

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int v[3];
int main() {
	for (int i = 0; i < 3; ++i) {
		cin >> v[i];
	}
	int odd = 0, even = 0;
	for (int i = 0; i < 3; ++i) {
		if (v[i] % 2 == 0)even++;
		else odd++;
	}
	int ans = 0;
	if (odd == 2) {
		ans++;
		for (int i = 0; i < 3; ++i) {
			if (v[i] % 2 == 1) {
				v[i]++;
			}
		}
	}
	else if (even == 2) {
		ans++;
		for (int i = 0; i < 3; ++i) {
			if (v[i] % 2 == 0) {
				v[i]++;
			}
		}
	}
	int ma = max(v[0], max(v[1], v[2]));
	for (int i = 0; i < 3; ++i) {
		ans += (ma - v[i]) / 2;
	}
	cout << ans << endl;
	return 0;
}
```
これがいちばんしっくりくるな。偶奇に着目はホントに大切や
Djangnoのモデルに対してgetしてなければ新規作成する方法

## やりたいこと

以下の様な検索してないなら新規作成するコードをスマートに書きたい

```py
class Hoge(View):
   def get(self, request, postId):
        hoge = Hoge.objects.get(user=self.request.user, Fuga=postId)
        if not hoge is None:
            hoge = Hoge(user=self.request.user, Fuga=postId)
            hoge.save()
```

## 解決策
django公式のクエリメゾットに`get_or_create()`メゾットがあるのでそれを使うとスマートに書ける。

https://docs.djangoproject.com/ja/2.1/ref/models/querysets/#get-or-create

```py
class Hoge(View):
   def get():
        hoge = Hoge.objects.get_or_create(user=self.request.user, Fuga=postId) 
```
Scikit-learnの回帰/分類/クラスタ/次元圧縮を考えてみる

#1.書こうと思た動機
機械学習の勉強のため、Scikit-learnを実行してみました。
でも回帰と分類、よくわからず行っていました。
よってSVMで株価の推定を行おうというアホなことをやっていました。
~~勉強不足は棚に上げて~~ でもよくよく見るとどの参考書等でもいきなりやりたいことが〇〇だからSVM使おうぜみたいな記載、またはもっと概念的な記載が多いかと思います。
そこで具体例を含めた記載にチャレンジしたいと思います。

##1.1お断り
全４つを纏めたうえで書くのではなく進捗具合に合わせて途中の状態であってもアップしていきます。
その後、勉強していく中で自分の中で整理がついたら順次更新いたします。

#2.機械学習のアルゴリズム
本家の説明文書は以下の通り。
http://scikit-learn.org/stable/tutorial/machine_learning_map/
![ml_map.png](https://qiita-image-store.s3.amazonaws.com/0/248083/21370cdf-979d-8fd5-1711-7cc2e52e502f.png)

##2.1分類（classification）
上記の図の左上に当たります。
start => データ50個以上ok => カテゴリ分けをしたいyes => ラベル付データを保持しているかyes
でたどり着きます。
この「ラベル付きデータ」は「想定結果」と思えばいいかと思います。
実例で考えた方が分かりやすいと思います。
####2.1.1 分類を使うケース
何かを振り分けるという判定に使用します。

- 種類を判定
- 文字の画像を認識して文字に起こす
- 迷惑メールの振り分け
- 株価が上がるか下がるかを判定

など。分類編ではちょっと応用して変動の範囲を判定しました。

###2.1.2 （例）猫とライオンを振り分ける

####＜訓練データ＞
以下の訓練データで機械学習します。答えは1:猫　か2:ライオン　です。

| 体長(cm)  |高さ(cm)  |体重kg  |鳴き声  |答え（ラベル）    |コメント（データのイメージ、学習には使いません。）|
|:----------|:----|:-----|:------:|:--------------:|:------:|
| 60      |50 |5.0 |ニャー  |1:猫             |普通の猫|
| 150     |100 |130  |ガオー  |2:ライオン       |普通のライオン|
| 70      |30 |4.0 |ミャャー  |1:猫             |マンチカン？|
| 80      |50 |10 |ニャャャー  |1:猫           |デブ猫？|
| 80     |60 |5.0 |ゴォォォー  |2:ライオン     |子ライオン？|

####＜テストデータ＞
以下表の動物が猫かライオンか判別します。

| 体長(cm)  |高さ(cm)  |体重kg  |鳴き声  |
|:----------|:----|:-----|:------:|
| 65      |55 |3.5 |ニャァァャー  |

####結果
この機械計算により1:猫　または 2:ライオン　が判定されます（多分1:猫　になりそうですが）
なおこの際に訓練データに含まれない結果（例えば3:チーター）といった結果が出てくることはありません。
仮に以下のような犬っぽいデータでテストしても結果は1:猫　または　2:ライオン　です。訓練データにない以上4:犬という答えはありません。


| 体長(cm)  |高さ(cm)  |体重kg  |鳴き声  |
|:----------|:----|:-----|:------:|
| 65      |55 |3.5 |ワン！  |

####注意
ただし、このラベルでは大小で意味を持ってしまうこともあるようです。
（参考文献）[Python機械学習プログラミング 達人データサイエンティストによる理論と実践](https://book.impress.co.jp/books/1115101122)　インプレス刊の４章を参照ください。
なお、今回の株価の問題では前日との差額/100ですので結果的に大小を持ってもOKだったようです。


##2.2回帰（regression）
上記の図の左上に当たります。
start => データ50個以上ok => カテゴリ分けをしたいno => 量を推定したいyes
でたどり着きます。
最後の選択肢の通り、量の推定になります。

###2.2.1 回帰を使うケース
選択肢にもあった通り「量」を想定する場合に使います。

- 株価を想定する
- 売り上げを想定する。

など。

###2.2.2 （例）猫の体重を想定する。
####＜訓練データ＞
以下の訓練データで機械学習します。

| 体長(cm)  |高さ(cm)  |性別|答え（体重kg）    |
|:----------|:--------|:---|:----------------|
| 60      |50 |オス|5.0 |
| 80      |60 |オス|6.5 |
| 55      |45 |メス|3.5 |
| 60      |45 |メス|3.7 |

####＜テストデータ＞
以下表の猫の体重を算出します。

| 体長(cm)  |高さ(cm)  |性別|
|:----------|:--------|:---|
| 75      |53 |オス|

####結果
この機械計算によりxx(kg)が返ってきます。
この場合の値は訓練データの答えの選択肢だけではありません。
5.5kgといった訓練データに存在しない値も計算される可能性があります。
これがアルゴリズム表内にある選択肢「カテゴリ分けをしたい」がyesの先にある「分類」とnoの先にある「回帰」の大きな違いになります。


（以降、その他の実施状況により更新していきます。）
Project Euler 問題1 「3と5の倍数」

## 問題 
1000未満の3と5の倍数の和を求めよ。

>If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
 Find the sum of all the multiples of 3 or 5 below 1000.

## コード (Python)

```python

#1000未満の3と5の倍数の合計を求める

def getMultiples(number, max):
  i = 1
  multiples = set()
  while(i * number <= max):
    multiples.add(i * number)
    i += 1
  return multiples

def main():
  multiples=set()
  multiplesOf3 = getMultiples(3, 999)
  multiplesOf5 = getMultiples(5, 999)
  multiples = multiplesOf3 | multiplesOf5 #3の倍数と5の倍数の和集合
  sumOfMultiples = sum(multiples)
  return(sumOfMultiples)

main()
```

久しぶりにオイラーさんと遊ぼうと思ったらログインできず、アカウント作り直して一からやり直すことにしました
仕事ではPHPを使ってるので「;」が付いてないとそわそわする・・・w
iterm2での作業効率をあげるショートカット

## ショートカット
覚えて使いこなすと格段に作業時間が短縮できるなぁと思いつつ使いこなせていなかったので，自分用にメモ．
追加していきたい．

## カーソル移動
### カーソルを先頭に移動
```
Ctrl + a
```

### カーソルを文末に移動
```
Ctrl + e
```

## 文字削除
### カーソル前の1文字を削除
```
Ctrl + h
```

### カーソル位置の1文字を削除
```
Ctrl + d
```

### 単語の削除
```
Ctrl + w
```

### カーソル位置以降の文字を削除
```
Ctrl + k

// 切り取ったものを貼り付け
Ctrl + y
```

### カーソル位置より前の文字を削除
```
Ctrl + u
```

## 画面表示
### 透明度の切り替え
```
cmd + u
```

### 横分割
```
cmd + d
```

### 縦分割
```
cmd + shif + d  
```

### 画面間移動
```
cmd + option + →
cmd + option + ←
cmd + option + ↑
cmd + option + ↓
```

### 分割画面を閉じる
```
cmd + w
```

## その他
### 補完
```
cmd + ;
```

### クリップボード機能
```
cmd + shift + h
```

### プレイバック
```
//ターミナルでの操作内容の再確認
cmd + alt + b
```
「VSCodeで開く」をコンテキストメニューに追加する。 

#最初に
コンテキストメニューとは、WindowsやMac OS上でマウスを右クリックしたときに出てくるメニューのことです。
ここでは、Windowsのコンテキストメニューに「VSCode」で開くを追加する方法を解説します。
~~※レジストリをいじるので自己責任でお願いします。~~
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154984/1302d4b2-b209-568b-81d0-55bed5397674.png)

#2020/06/11追記
https://qiita.com/kaityo256/items/7fefd1d1463184ae1420
の記事で紹介されているとおり、「VSCode」で開くを追加したいだけならレジストリをいじる必要はありませんでした。

以下の内容は他の用途でコンテキストメニューをいじるときに参考になるかもしれないので一応残しておきます。

#手順
1. レジストリエディタをひらく
2. コンピューター\HKEY_CLASSES_ROOT\Folder\shell配下にVScodeを追加する
3. VSCode配下にcommandを追加する

## レジストリエディタをひらく
Window + r　のショートカットで下イメージが表示されますので、そのまま「OK」を押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154984/f615c084-f21f-0236-6100-c6eac07f5b46.png)


## コンピューター\HKEY_CLASSES_ROOT\Folder\shell配下にVScodeを追加する

レジストリエディタが開いたら、コンピューター\HKEY_CLASSES_ROOT\Folder\shell配下にVSCodeを追加してください。
shellを右クリックで開くコンテキストから「新規」→「キー」で追加できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154984/73cf4cd3-85cc-ef79-e703-3d039d3100f7.png)

「VSCode」を追加したら(規定)部分を右クリックしてください。「修正」というメニューがありますので、そこで「VSCodeで開く」を設定してくさい。するとデータ部分に値がはいります。この部分がコンテキストメニューに表示されるメニューの文言になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154984/ceed7014-da4a-37fa-529b-d70fff386298.png)

## VSCode配下にcommandを追加する
「VSCode」を追加したときと同様にコンピューター\HKEY_CLASSES_ROOT\Folder\shell\VSCode配下にcommandを追加してください。

そしてデータに「"C:\Program Files\Microsoft VS Code\Code.exe" "%1"」を設定してください。
これがコンテキストで「VSCodeで開く」を押したときに実行されるコマンドになります。%1の部分にはフォルダのパスが入ります。
※VSCodeのインストール先が異なる場合は環境に合わせて変更しください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154984/6641e8d8-31f3-4371-edc8-bc2869d5e616.png)

以上で終了です。

# 試してみる
フォルダを指定して右クリックでコンテキストメニューに「VSCodeで開く」が表示されていれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154984/1302d4b2-b209-568b-81d0-55bed5397674.png)

クリックしてもVSCodeが実行されない場合は、コマンドが間違っている可能性が高いです。コマンドプロンプトから実行できるか確認してみましょう。
GASでスプレッドシートが既存ファイルでなければ新規作成する

ファイル名だけで検索かけて、一致しなければ新規作成したかった。

```
function CreateSS() {
  var fileName = "新規ファイル";
  // ファイルの存在チェック
  var search = DriveApp.searchFiles('title = "' + fileName + '"');
  if (!search.hasNext()) {
    // ファイルがなければ作成
    SpreadsheetApp.create(fileName);
  }
}
```
LINE Messaging API を Google Apps Script で利用するためのライブラリ作りました

[LINE 謹製 Node.js 用 SDK](https://github.com/line/line-bot-sdk-nodejs) と基本同一のインターフェイスをもつ LINE Messaging API を Google Apps Script で利用するためのライブラリ作りました。

## 依存ライブラリの設定

1. GAS のエディタ画面の [ライブラリ] の [+] をクリックしてダイアログを開きます。
2. [スクリプト ID] という入力欄に `1EvYoqrPLkKgsV8FDgSjnHjW1jLp3asOSfDGEtLFO86pPSIm9PbuCQU7b` という値を入力し、 [検索] ボタンをクリックします。
3. [追加] ボタンを押します。

## 呼び出し方

```js
function doPost(e) {
  const event = JSON.parse(e.postData.contents).events[0];
  const replyToken = event.replyToken;
  const lc = new LineBotSDK.Client({ channelAccessToken: 'アクセストークン' });
  lc.replyMessage(replyToken, [{ type: 'text', text: 'こんにちは' }]);
}
```

その他のメソッドの使い方は公式と同じインターフェイスにしてある(Node と GAS での若干クラスの差異がある部分(Readable -> Blob)を除く)ので [Messaging APIリファレンス](https://developers.line.me/ja/reference/messaging-api/) をご参照ください。

リッチメニューの画像を取得する `getRichMenuImage` の戻り値について、 `GoogleAppsScript.Base.Blob` 型で戻していますが、 LINE の API が `Content-Type` を `application/json` で返してきているため、 GAS 上では json として認識されてしまいます。戻り値に対して `getAs('image/jpeg')` とかやってもエラーになってしまうのでご注意ください。

また、使い勝手をよくするメソッドを若干追加しています。そちらについては [README](https://github.com/kobanyan/line-bot-sdk-gas#%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89) をご参照ください。

## その他

[TypeScript の定義ファイル](https://github.com/kobanyan/line-bot-sdk-gas/blob/master/Client.d.ts)を用意してあります。 line-bot-sdk-nodejs と同一のインターフェイスにしてあるので、 以下のようなパッケージをインストールすることでローカルでの開発がしやすくなるかと思います。
(逆に同じインターフェイスにするためにクラスを使った結果、 GAS のエディタでは補完が効かなくなっています…)

- typescript
- @line/bot-sdk
- @types/google-apps-script

## ソースコード

ソースコードは以下においてあります。

https://github.com/kobanyan/line-bot-sdk-gas

実際にデプロイされているコードは[こちら](https://script.google.com/d/1EvYoqrPLkKgsV8FDgSjnHjW1jLp3asOSfDGEtLFO86pPSIm9PbuCQU7b/edit?usp=sharing)から参照可能です。
iOS向けのスライドショーUIライブラリを作った

↓こういうやつ

![slideviewer.gif](https://qiita-image-store.s3.amazonaws.com/0/7694/19313436-d9b9-33eb-5993-bc8d6afd2b26.gif)

https://github.com/abeyuya/SlideViewer

## 使い方

### 画像URLの配列の場合

```swift
let v = SlideViewerController.setup(
    mainImageURLs: [
        URL(string: "https://example.com/path/to/slide/1.png")!,
        URL(string: "https://example.com/path/to/slide/2.png")!,
        ...
    ],
    thumbImageURLs: [
        URL(string: "https://example.com/path/to/slide/thumb/1.png")!,
        URL(string: "https://example.com/path/to/slide/thumb/2.png")!,
        ...
    ]
)
present(v, animated: true)
```

## PDFファイルのURLの場合

```swift
let pdfURL = "https://speakerd.s3.amazonaws.com/presentations/50021f75cf1db900020005e7/speakerdeck.pdf"
let v = SlideViewerController.setup(pdfFileURL: URL(string: pdfURL)!)
present(v, animated: true, completion: nil)
```

## バンドルされたPDFファイルの場合

```swift
let path = Bundle.main.path(forResource: "speakerdeck", ofType: "pdf")
let url = URL(fileURLWithPath: path!)
let doc = PDFDocument(url: url)
let v = SlideViewerController.setup(pdfDocument: doc!)
present(v, animated: true)
```


## ここがイケてる :smile: 

- SlideShareアプリのUI・挙動をほぼ完コピした
  - ビューアーとして本家並には使いやすいと思う
- 複数のインプット形式に対応している
  - 画像URLの配列, PDFファイルのURL, ローカルのPDFファイル
  - スライドショー的な用途もあるし、単にPDFビューアーとしても使える
- 縦・横どちらにも対応している

## ここがイケてない :cry: 

- 画像のダウンロード順の賢い制御はしてない
  - キューに全画像のダウンロードタスクをいれて、裏でダウンロードしておくとよりUX良さそうだけどやっていない
- たまに画像サイズの調整がバグる
- carthage対応まだしてない

## 実装時の工夫ポイント

- 画像のリサイズなどの[重い処理かつバックグラウンドスレッドで実行できる処理]はできるだけそちらでやるようにした
  - UIがカクつかずスムーズ
- ReSwiftを使っており、ステートの管理がシンプルにできている
  - 素朴に実装していたらもうちょっと複雑なコードになってしまった気がする


## おまけ

このライブラリは、実は下記の記事で作りかけで放置していたもの
https://qiita.com/abeyuya/items/6587a8f3990606f40429

社内でiOSエンジニアで集まって勉強会的なことやろう、ということになり、その発表でこのライブラリについて話すことになった
実装はほぼ完了していたし、せっかくなのでライブラリとしてリリースできる状態に最低限は整備した
せっかくなのでqiitaでも記事にしようと思った
Rubyのand,&&とor,||の違いと注意点

#Rubyのand,&&とor,||の違いと注意点
同じだと思っていると微妙な違いによって
意外なところで落とし穴に陥る危険があります('-')


###実は優先度が違う
以下のリファレンスマニュアルを見ると以下の様に記載されています
[演算子式](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#and)
>左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には 右辺を評価しその結果を返します。 and は同じ働きをする優先順位の低い演算子です

定義は && も and も「左辺を評価し、真である場合右辺も評価する」というものです。
しかし、記載の通りandは優先順位が低い演算子です。

###優先順位が低いって何？
論より証拠で以下に例を示します。

```ruby
a = true && false
p a #false

b = true and false
p b #true

c = (true and false)
p c #false
```
上の実行結果をコメントに記載しましたが、全然挙動が違いますね。
これが優先順位の差です。
優先順位とは演算子の優先順位のことを指します。
この場合、&&は=よりも優先度が高いが、andは=よりも優先度が低いからこそこういう事象がおきてしまうのです。
つまり、
```a = true && false```の場合は、まず```true && false```が評価され、その結果がaに代入されます。
```b = true and false```の場合は、```b = true```が評価され、その後```and false```が実行されるのです。

### 演算子の優先度
じゃあどの演算子がどの演算子より優先度が高いかというと以下の様に順位づけされています。

```
(優先順位:高)
  !  ~
  **
  *  /  %
  +  -
  <<  >>
  &
  |  ^
  >  >=  <  <=
  ==  !=
  &&
  ||
  ..  ...
  ?:
  =
  not
  and  or
(優先順位:低)
```

andとorを&&,||の様に使用してしまっていると優先度の違いからこちらの意図しない結果になってしまうことがあるかもしれません。
優先度を意識して実装するようにしていきましょう。

### true and return
なので、以下の様な左辺を満たす時はreturnするみたいな時には特に注意が必要で、
```a.empty? and return "poe"```
と記載することになり、以下の様に&&と記載し直すとうまくいきません。
```a.empty? && return "poe"```
ただ、
```a.empty? && (return "poe")```とすることでうまくいくようです。


私は、
```true and return``` の様な処理を行う時だけはandを利用して、それ以外では&&を使う様にしています。
Google Cloud Storageにコンテナの中からアクセスしようとしてハマった話

# なにがしたかった？
軽量なコンテナイメージである`alpine`コンテナ内の`Goアプリケーション`から，`Google Cloud Storage(以下GCS)`にアクセスしたかった．

# なにが起きたか
ローカルでGoアプリケーションを実行した場合はGCSにファイルを作成できた．しかし，ビルドしたGoアプリケーションを`alpine:3.8`イメージの中で実行した際，GCS上にファイルが作成されなかった．

# 原因
alpineのイメージには，`ca-certificatesパッケージ`がインストールされていないため，SSL接続ができなかった．

# 解決策
Dockerfileに以下の変更を加えた．

```
FROM alpine:latest
RUN apk add --no-cache --update ca-certificates # この行を追加
~~実行ファイルのコピーや，環境変数の設定など~~
```

# 感想
Goアプリケーションは特にエラーを吐き出さなかったので，原因を突き止めるのに時間がかかってしまいました．alpineをベースイメージとして利用する場合は気をつけようと思いました．
WSLにUbuntuデスクトップをインストール

Ubuntuのインストール
https://www.microsoft.com/ja-jp/p/ubuntu-1804-lts/9n9tngvndl3q?activetab=pivot:overviewtab

Windows→アプリ→Ubuntuで起動
GUIのインストール

````
sudo apt update;
sudo apt upgrade;
sudo apt install xfce4 xfce4-terminal;
````

X(GUI)のインストール
https://www.microsoft.com/ja-jp/p/x410/9nlp712zmn9q?activetab=pivot:overviewtab

Windowsでの起動ファイルの作成

````start_ubuntu_gui.bat
start /B x410.exe /desktop
ubuntu1804.exe run "if [ -z \"$(pidof xfce4-session)\" ]; then export DISPLAY=127.0.0.1:0.0; xfce4-session; pkill '(gpg|ssh)-agent'; fi;"
````

gnome な ubuntu-desktop はサポートされてないみたい。素直に xfce4 を使いましょう