OmniAICreator/Qiita-1.07M huggingface dataset:
[javascript] Javascriptでカレーを作る



**カレーを食べたくて**入ってきた方々には申し訳ありませんが、:bow: :bow: :bow:  
残念ながら、ここで言うカレーは **インド料理のカレーではない** です。
たまたま **カレーの英単語と同じスペル(Curry)**になっているだけです。 :bow: :bow: :bow:  

# カレー（Curry） とは

ラムダ式を使って **複数引数を持つ関数** を **単一引数の関数に変換**(Recuce)する手法です。
名前は、Haskell B. Curry.　という方の名字（ **Curry** ）を取ったものです。

手法なので、**Curry**　が動詞化され、正確には **Currying** と呼びます。

式で表すと、

```
f(n, m) --> f'(n)(m)
```

になります。


# 実例

* f(n, m)

```js
multiply = (n, m) => (n * m)
multiply(3, 4) === 12 // true
```

* f'(n)(m)

```js
curryedMultiply = (n) => ( (m) => multiply(n, m) )
triple = curryedMultiply(3)
triple(4) === 12 // true
```

# どこで使われているの？

例をあげてみましょう :expressionless:   

## JavaScript Bind

`Function.prototype.bind()` 実は currying　で実現されています。

```js
increment = add.bind(undefined, 1)
increment(4) === 5
```

## React and Redux

react-redux の `connect()` 関数が一番 **カレー的** かもしれないですね。

```js
export default connect(mapStateToProps)(TodoApp)
```

## Event Handling

```js
const handleChange = (fieldName) => (event) => {
  saveField(fieldName, event.target.value)
}
<input type="text" onChange={handleChange('email')} ... />
```

## Rendering HTML

```js
enderHtmlTag = tagName => content => `<${tagName}>${content}</${tagName}>`

renderDiv = renderHtmlTag('div')
renderH1 = renderHtmlTag('h1')
```

# Curryingの逆

当然、Curryingの逆となっている **Uncurrying**　というのがあります。

式と実例も Currying のと逆ですが、

##  式

```
f(n)(m) --> f'(n, m)
```

## 実例

```js
curryedMultiply = (n) => (m) => n * m
curryedMultiply(3)(4) === 12 // true

multiply = (n, m) => curryedMultiply(n)(m)
multiply(3, 4) === 12 // true
```


# 参考になったリンク
[[javascript] Javascriptでカレーを作る | AI Fan 愛飯](http://aifan.jp/javascript-javascript%E3%81%A7%E3%82%AB%E3%83%AC%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8B/) (音量注意)
[Currying in JavaScript ES6 – Bene Studio](https://blog.benestudio.co/currying-in-javascript-es6-540d2ad09400)
デバイスツリー研究会(第一回)

当方はメカ設計のエンジニアでサンデープログラマである
デバイスツリーの理解を深めるため一人で研究会を開くことにした
何故ならオライリーのdevice driverの書籍は古い内容のためDevicetreeについて知ることが出来ない

第一回目はRaspbianのデバイスツリーのソースコードが格納されていると噂されるフォルダの中を見てみることにする。当然筆者は趣味レベルのプログラマのため間違っていることを堂々と述べることもあると思う。その際はコメントで教えていただければ加筆、訂正をしていく所存である

それではフォルダの中を覗いてみる
フォルダのパスは/linux/arch/aem/boot/dtsである
![Screenshot from 2100-01-01 00-00-00.png](https://qiita-image-store.s3.amazonaws.com/0/190551/568189dd-5f9c-6771-dd1c-e4ab1144613e.png)
デバイスツリーのソースコードの拡張子名は.dts又は.dtsiなので噂通り確かに存在していることが分かった
ファイルの数は1480個あった。さらに下層のoverlaysフォルダの中にもdtsファイルがあった。overlaysとは何のことなのか分からない

次回はデバイスツリーソースファイルの中を見てみることにする
emacs 指定範囲をコメントアウト・コメントアウト解除


fortranで複数行にわたりコメントアウトしたい場合は、１行１行の先頭に`!`をつけていかなければならない。非常に面倒。
emacsで指定範囲を全てコメントアウトしてくれるコマンドがあったのでメモ。

コメントアウトしたい範囲を選択して`M-;`とするだけでOK！
コメントアウトを解除したい時も同様。

注）`M`は`Alt`を意味している。
ディレクトリ内の一部データを除きコピー


ディレクトリ dir1 を dir2 にコピー。
ただし、dir1 内にある data というファイルはコピーしたくないとき。

例１

```bash
$ rsync -a --exclude data dir1 dir2
```
これを実行すると、dir2というディレクトリの中にdir1というディレクトリをコピー。

例2

```bash
$ rsync -a --exclude data dir1/ dir2
```
これを実行すると、dir2というディレクトリの中にdir1のディレクトリの中身をコピー。
Numpy 配列の保存


時間のかかる解析をしてできた配列を保存して、また使いたいときのために。

```保存
import numpy as np

pi = np.pi
x = np.linspace(-pi,pi,128)
y = np.cos(x)

filename = 'test'
np.savez(filename,x=x,y=y)
```

カレントディレクトリに`test.npz`というファイル生成される。

```読み込み
import numpy as np

filename = 'test.npz'
data = np.load(filename)
x = data['x']
y = data['y']

import matplotlib.pyplot as plt

plt.plot(x,y)
plt.show()
```
![cos.png](https://qiita-image-store.s3.amazonaws.com/0/173931/5466a0a8-06d7-c834-9a62-5ca6a253f9a6.png "cos.png")
論文用の画像を作る

論文にはeps形式で画像を貼る必要があるが、2次元の絵をeps形式で作ると容量がかなり大きくなってしまう。いろいろ工夫が必要。

1. jpeg形式で絵を作る。（綺麗さは諦める）
2. jpegからepsに変換。

```bash
convert sample.jpeg sample.eps
```
このようにしてepsをつくると容量が20倍ほどになってしまう。
そこで、

```bash
convert sample.jpeg eps2:sample.eps
```
を実行すると、容量の肥大化を防げる。
同じことをjpegでなくpngでもやってみたがうまくいかなかった。
idlのsaveで作ったfileをpythonで読み込む


idlのsaveで変数や配列を保存した`test.sav`ファイルをpythonで読み込む。


```python
import scipy.io as sio
filename = 'test.sav'
df = sio.readsav(filename)
```

`data.keys()`と打つと下のようにキーの一覧が表示される。

```python
In [5]: df.keys()
Out[5]: dict_keys(['x', 'y'])
```
キーを指定すると、

```python
In [7]: df['x']
Out[7]: array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7., 8.,  9.], dtype=float32)
```
【Swift】初心者向けnilの扱い

## メソッドの引数がオプショナルの場合 
AとBを受けとりA+Bをして返すメソッドを考えます。

メソッドの定義自体はA?とB?となっており、`nil`が入って来る可能性があるので
どちらかの引数にnilが入ってきた場合はエラーとして呼び出し元に返してやる必要性がある。

ここでXcodeの補完機能に流れを任せビルドしてしまうと強制アンラップが発生してしまい
アプリが落ちてしまうことになる。

### 落ちてしまう例

```swift
func hoge(A: Int?, B: Int?) -> Int? {
    return A! + B!
}
```
上記の書き方だと`return A! + B!`で`nil`が入っていた場合に落ちてしまいます。

### 落ちない例
`nil`が入ってきた場合に`guard let`で早期にエラーとして`nil`を`return`します。
よくその変数を使うタイミングで`nil`チェックをしている人がいる。アホくさ。

```swift
func hoge(A: Int?, B: Int?) -> Int? {
    guard let _A = A else { return nil }
    guard let _B = B else { return nil }
    return _A + _B
}
```

### まとめ
 ***`nil`は早期にチェックするべき!!!***
TypeScript で複数のファイルに分割して npm ライブラリを作る

npm ライブラリ、小さいうちは 1 つのファイルでいいんだけど大きくなってくるとファイル分割しないといけなくなる。
ググってたら1つのファイルに concat しないといけないとか、AMD にしろとか出たりして頭抱えてたけど、難しいことはなく普通に簡単にやることができた。

結論から言うと index.ts で `export * from './xxx'` するだけです。

## ファイルを分割していってみよう

例えばこんな index.ts があったとします。これを分割していきます。

```ts
export const name = 'name'

export interface IHoge {
  hello(): void
}

export class Hoge implements IHoge {
  hello() {
    return 'Hello, ' + name
  }
}
```

### ihoge.ts

```ts
export interface IHoge {
  hello(): void
}
```

### hoge.ts

```ts
import { IHoge } from './ihoge'
import { name } from './index'

export class Hoge implements IHoge {
  hello() {
    return 'Hello, ' + name
  }
}
```

### index.ts

```ts
export const name = 'name'
export * from './hoge'
export * from './ihoge'
```

`export * from './xxx'` でそのまま export できる。  
部分的に export したければ `export { Hoge } from './hoge'` みたいにできそう。

## package.json

package.json とかは今までと変わらず main と types を定義しておけば良い。

```json
  "main": "out/index.js",
  "types": "out/index.d.ts",
```

## おわり

これでファイル分割してライブラリファイルを定義できた。  
雰囲気で TypeScript やっているので間違っていること・より良い方法があればぜひマサカリください :pray: :bow: :pray:
vimのmodelineオプションについて日本語で書いてみる

# 初めに

やっぱり公式の`:help modeline`が一番わかりやすいです。
が英語苦手な人のために日本語に翻訳されたのがあるのでリンク貼っときます・
http://vim-jp.org/vimdoc-ja/options.html#modeline


# 概要

**modeline**はvimで自動設定をするためのオプションの一つです。
同じように設定を自動化する機能に`autocommand`がありますが、`autocommand`が指定イベントが起きた時にコマンドを実行するのにし、**modeline**は**modelineの書かれたファイルが読み込まれた時にコマンドが実行されます**。
`autocommand`では全てのファイルに対して指定イベントが起きればコマンドが実行されるのに対し、**modeline**は**ファイル単位で実行するコマンドを定義できます。** ~~(二度いってる気がする~~
以下個人的な解釈です。実際とは異なる可能性があります（特に`autocommand`はよくわからない)

|  | メリット | デメリット |
|:-:|:-:|:-:|
| autocommand  | ファイルごとに設定しなくていい  | 他の人にファイルを渡した時に設定が反映されない |
|  modeline | ファイル単体でも大体コマンドを実行してくれる  | 共通してるものでも一個一個ファイルに書かなきゃいけない|


# modelineのデメリット -セキュリティ的なお話

一応、セキュリティの観点から、`set`以外のコマンドを指定することはできなくなっています。
又、`set`のオプションにしても、いくつかのものは`sandbox`が動いている時のみ利用可能となります。
しかし、それでもまだ注意が必要です。
例えば、`textwidth`を`5`などに設定されてしまうと、全ての行が変更される可能性があります。
なので、信頼していない文章を読む際には、`modeline`をoffにしておくことをお勧めします。(ってhelpに書いてあった)

もしも、`set`コマンド以外のことがしたければ、`autocommand`を使用するといいみたいです。


# 事前準備 -設定

**modeline**を使得るようにするには、いくつかオプションをセットする必要があります。
.vimrcに追加してください。(デフォルトでは以下の設定になっていると書かれていましたが、自分の環境だとそうはなっていなかったため、念のためというやつです。)

* `modeline`オプションをonに --> `:set modeline`
* `modelines`(sがついた複数形です)を0以外の整数に --> `:set modelines=5`など

`modeline`がoff、もしくは`modelines`が0になっているとmodeline機能を使えないので注意してください。

# `modeline`を記述する場所

ファイルの**先頭**、若しくは**末尾**です。
`modelines`で設定された行数分、先頭と末尾から探索されます。

# 書式

2通りの書き方があります。

* [text]{white}{vi:|vim:|ex:}[white]{options}
* [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]

後者はViに互換性があるようです。又、後者は`set`又は`se`がが必須です。

| | |
|:-:|:-:|
|[text] | 前に文字があっても大丈夫だよってことです。何もなくても勿論いいです。 |
|{White} | 一つ以上の`<space>`または`<tab>`| 
|{vi:&#124;vim:&#124;Vim:&#124;ex:} | 文字列。モードの指定、？~~`ex:`は`:example`の略な様で、その行は無視される様です。~~ [^1] |
|[white]| こちらのWhiteはオプションなのでなくても大丈夫 |
| {options} | `set`コマンドのオプションを書きます。上の方の書き方では区切り文字に`:`も使えますが、両方共通として`<space>`が使えます |

{options}内にて`:`を使いたい場合、`\`でエスケープすることができます。 => `\:`

# 例

```vim:modelineヘルプから引用
"一つ目の例
   vi:noai:sw=3 ts=6 ~
   vim: tw=77 ~
"二つ目の例
   /* vim: set ai tw=75: */ ~
   /* Vim: set ai tw=75: */ ~
```

まあこんな感じです、一応僕の使ってる例:
[Cj-bc/slackerの、docs/about_sourcefiles.txt](https://github.com/Cj-bc/slacker/blob/master/docs/about_sourcefiles.txt)
一行しかないのですが、

```vim:Cj-bc/slacker/docs/about_sourcefiles.txtの下の方
Vim: set filetype=help:
```
ファイルタイプを`help`に指定するmodelineを書いてあります。（これについて詳しくは -> [Vimで折角tagsファイルを作成したドキュメントに色をつけたい！](https://qiita.com/Cj-bc/items/d508109d47df5463a0a0))


# おまけ: Vimのバージョンを指定してmodelineを実行する

おまけというほどでもない様な気はします。普通にhelpに乗ってます。
ある特定のバージョンのVimの時だけ`modeline`を使うには、
先ほどの`Vim:` `vim:`の`:`の前にバージョンを記載します。
以下vim helpから拝借してきました。

```vim:
vim{vers}:      version {vers} or later
vim<{vers}:     version before {vers}
vim={vers}:     version {vers}
vim>{vers}:     version after {vers}
```

はい、まあ書いてある通りですね。一応日本語化してみると

```vim:
vim{vers}:      {vers} もしくはそれよりも新しいバージョン
vim<{vers}:     {vers} よりも古いバージョン
vim={vers}:     {vers} のバージョンのみ
vim>{vers}:     {vers} よりも新しいバージョン
```

特に難しいこともないですね。ただし、ここで気をつけるべきは`{vers}`の値です。
**`{vers}`は、メジャーバージョンを100倍しマイナーバージョンを足した数です。**
つまり、

```
version 7 -> 700
version  7.2 -> 702
```
となります。

[^1]: `ex:`が`example`として解釈されるのは、`ex:`が行頭にきた場合のみなようです。@tenmyoさんありがとうございました。
PIC で MIDI の送受信 - 1. MIDI 送受信の回路

PIC マイコンの EUSART モジュールを用いて、MIDI 信号を送受信してみます。

# MIDI のハードウェア規格

まずは MIDI (Musical Instrument Digital Interface) のハードウェア規格を簡単にまとめておきます。

- 転送速度 31.25 kbps (±1%) の非同期方式シリアル転送。
- データは、スタートビット、データビット（8 ビット）、ストップビットの計 10 ビットの単位で転送される。
- 5 mA のカレントループで、電流が流れている状態が "0" を、流れていない状態が "1" を表す。
- 受信回路ではフォトカプラを使用して送信回路と絶縁する。
- コネクタには 5 ピンの DIN を使用（各ピンのアサインは下表）。

| ピン | アサイン |
|:-:|:--|
| Pin 1 | 未使用 |
| Pin 2 | シールド・接地（送信側のみ） |
| Pin 3 | 未使用 |
| Pin 4 | 信号 |
| Pin 5 | 信号 |

# MIDI 送受信の回路

今回使用する回路です。
[MIDI の規格書](http://amei.or.jp/midistandardcommittee/MIDIspcj.html) にも、送受信の回路例が示されています。

回路図中の TX / RX はそれぞれ PIC の EUSART TX / RX ピンに接続します。

## 送信側
![MIDI_Output.png](https://qiita-image-store.s3.amazonaws.com/0/238996/d8faf458-66b9-3d6d-001f-fe22991f8cfb.png)

## 受信側
![MIDI_Input.png](https://qiita-image-store.s3.amazonaws.com/0/238996/12295e45-2711-7926-72a6-381ffb8db8ed.png)

- TLP2630 は、東芝のフォトカプラ TLP552 のデュアルチャネルタイプ（今回はその 1 チャネルのみを使用）。
- ダイオードはフォトカプラ保護用。
- 0.1 μF のコンデンサは TLP2630 のデータシートで指定されているバイパス用のもの。
- 1 kΩ の抵抗はプルアップ抵抗。



次回は、PIC から MIDI 信号を送信するプログラムについて書きたいと思います。
.bash_history


ホームディレクトリ下にある`.bash_history`ファイルには、bashのコマンド実行履歴が保存されている。`history`コマンドを使うと、このファイルに書かれている履歴を表示してくれる。

```bash
$ history
    .
    .
    .	# 省略
    .
    .
  505  cd
  506  ls
  507  pwd　　　# 最近使った５件
  508  pwd
  509  history
$ 
```
デフォルトでは最近1000件までらしい。
保存件数を増やすには、`.bash_rc`に例えば

```
HISTSIZE=2000
```
を追加すると、保存件数が2000件に変更される。
ユーザー登録機能つき投稿サイト④(paperclipで画像を追加する)

(image magickをインストールしていない場合はしておく。[cloud9にimage magickをインストール](http://yatta47.hateblo.jp/entry/2017/08/15/004650))

[ここ](https://github.com/thoughtbot/paperclip)を参照。
１、paperclipで画像を追加するには、以下を追加

```model/post.rb
 has_attached_file :image, styles: { medium: "700x500#", small: "350x250>" }
 validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
```
２、rails generate paperclip post imageでmigration作成。
（rails generate paperclip テーブル名　カラム名の順に。当然上の１もhas_attached_fileとvalidates_attachment_content_typeもこれに対応させる）

そのあとrails db:migrate.
*「Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:」が出たら「class AddAttachmentImageToPosts < ActiveRecord::Migration」のところを「ActiveRecord::Migration[5.0]」としてあげるといいらしい。[ここを参考](https://github.com/RolifyCommunity/rolify/issues/444)

3,posts/_form.html.erbに以下を追加し、imageを投稿できるようにする。また、postsコントローラー内のstrong parameterでimageを受け取ることも可能にする。

```ruby:qiita.rb
image:<%= f.file_field :image %>
```

```posts/controller.rb
def post_params
    params.require(:post).permit(:title,:link,:description,:image)　←image追加
end
```
4,view/postの中の画像を表示させていところに以下のいずれかを書く.
(:medium)や(:small)は１で指定した大きさになる。

```posts/show.html.erb
<%= image_tag @post.image.url %>
<%= image_tag @post.image.url(:medium) %>
<%= image_tag @post.image.url(:small) %>
```
以下のようにして、画像をクリックでshowページに飛ばすことも可能

```posts/index.html.erb
<% @posts.each do |post| %>
<%= link_to (image_tag post.image.url(:small)),post %>
<p><%= link_to post.title,post %></p>
<% end %>
```
[Ruby]Line Notifyを使ってLineグループにメッセージを送信するgemを作った

今更Line Notifyというサービスを知って、使ってみたのですが、何かと便利そうですね。
gemを探してみても、作っている人がいなかったので作ってみました。

https://rubygems.org/gems/line_notify

### Line Notifyとは？
Line NotifyというAPIで、簡単にLineグループにメッセージを送信したり、スタンプを送ったりすることができます。

APIの仕様上、スタンプを送るにはメッセージも一緒に送らなければならないという仕様ですが、それでも応用範囲は色々広いので使ってて楽しいです。

Line Notify APIを使用するにはアクセストークンを取得する必要があるので、まずアクセストークンを取得してみましょう。

### アクセストークンの取得

公式サイトへアクセス
https://notify-bot.line.me/ja/

会員登録 or ログインをした状態で、「マイページ」をクリック
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/3962/f29ab0a2-1e59-7c02-a1a6-41d4e2968eab.jpeg)

下へスクロールすると下記のような画面が現れます。
「トークンを発行する」をクリック
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/3962/abd794b1-540c-2a7a-d526-31521c89ba40.jpeg)

ここで通知するときの名前(今回は「test」と入力)と、通知先のグループを指定します。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/3962/04b6aed9-8e65-d923-a6ae-c64654badf20.jpeg)

するとアクセストークンが発行されるのでコピーしておいてください。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/3962/59571ccc-953b-4996-49e1-7668ff4df857.jpeg)

ちなみにグループへ送信するときは「LINE Notify」というユーザーを予めグループに追加しておいてください。追加しないとエラーでメッセージが送信できません。

### line_notify gemの使い方
#### インストール方法

bundlerを使用する場合はお使いのGemfileに下記を追加

```Gemfile
gem 'line_notify'
```

こちらを実行してください

```
bundle install
```

bundlerを使用しない場合はこちらを実行してください

```
gem install line_notify
```

#### 使い方
##### メッセージ & スタンプ送信

```ruby
require 'line_notify'

line_notify = LineNotify.new(YOUR_LINE_TOKEN)
options = {message: 'hoge', stickerPackageId: 1, stickerId: 113}
line_notify.ping(options)
```

![1](https://user-images.githubusercontent.com/1485195/36259741-8f132972-12a2-11e8-9469-b205310709b3.png)

さきほどトークン取得の際に入力した「test」がprefixとして付与され、メッセージとスタンプが送信されました。
stickerPackageId,stickerIdを消せば、メッセージのみ送信されます。
またスタンプのリストはこちらにあります。

https://devdocs.line.me/files/sticker_list.pdf

##### メッセージ & 画像送信

```ruby
require 'line_notify'

line_notify = LineNotify.new(YOUR_LINE_TOKEN)
options = {
  message: '可愛い画像',
  imageFullsize: "https://www.pakutaso.com/shared/img/thumb/SAYAPAKU5347_TP_V4.jpg",
  imageThumbnail: "https://www.pakutaso.com/shared/img/thumb/SAYAPAKU5347_TP_V.jpg"
}
line_notify.ping(options)
```

![2](https://user-images.githubusercontent.com/1485195/36266096-0ece0310-12b4-11e8-9b7e-67af11dadf9f.png)

- imageFullsizeとimageThumbnailは必須です。
- imageFullsize: 最大 1024×1024px / JPEG のみ許可されます
- imageThumbnail: 最大 240×240px / JPEG のみ許可されます

### まとめ
こんな感じで結構簡単にLineに通知することができます！
便利！と思った方がいたらスターいただけたら幸いです。

https://github.com/YuzuruS/line_notify
pix2pixの出現で「DLで大量データが必要」は伝説になった-１DataChallenge成功！

#pix2pixほんと凄いね
ということで、１データ／カテゴリでやってみた。
それが、成功！
方法的には、前の記事参照してください
[pix2pixでAKB総選挙ランキング上位者を線画画像から再現する](https://qiita.com/MuAuan/items/f55b0ebc1255b4ffe92e)

ただし、１データだけど８倍の水増しはしました。それ以外はそのまま。。。
早速見てください。
#結果
【epoch 0 Training】１データなので同じ絵がたくさん？？
![current_batch_training0.png](https://qiita-image-store.s3.amazonaws.com/0/233744/37b252b0-e3e1-6071-63af-2a1472e8adaa.png)
【epoch 10 Training】少し出遅れ感が。。。
![current_batch_training10.png](https://qiita-image-store.s3.amazonaws.com/0/233744/487aa1ea-4554-5233-e2cd-8f88fd8e17aa.png)
【epoch 20 Training】少し顔っぽくなったのが出てきた
![current_batch_training20.png](https://qiita-image-store.s3.amazonaws.com/0/233744/486037bc-688c-3e83-64e7-05b9d6dc94c8.png)
【epoch 30 Training】いきなり顔になった！
![current_batch_training30.png](https://qiita-image-store.s3.amazonaws.com/0/233744/dcdb86e1-2bb0-e743-6587-17d153193816.png)
【epoch 50 Training】あれれ。。。もうほぼ元画像
これ５ｓ／epoch位しかかからないので、１０epochでも１分で出てきます。
![current_batch_training50.png](https://qiita-image-store.s3.amazonaws.com/0/233744/b8c36c99-67b9-00f9-d0f4-b2c2b7279add.png)
【epoch 50 Validation】少しボケているけど、。。Testデータ！
![current_batch_validation50.png](https://qiita-image-store.s3.amazonaws.com/0/233744/23a94cdd-2b9b-65c3-e9e6-e6aa3c86947c.png)
【epoch 100 Validation】苦手はある。。。
![current_batch_validation100.png](https://qiita-image-store.s3.amazonaws.com/0/233744/68200b62-863e-8211-0b6f-17e210f53053.png)
【epoch 200 Validation】。。。
![current_batch_validation200.png](https://qiita-image-store.s3.amazonaws.com/0/233744/5c80e1dc-bdce-7a71-4ef2-637da040c3bc.png)
【epoch 390 Validation】苦手はあるけど、それなりに。。。
そして、４００回回したけど、３７分経過しただけ！
![current_batch_validation380.png](https://qiita-image-store.s3.amazonaws.com/0/233744/22c95c14-9dfe-d04e-be88-bfff2ada3cb7.png)

#まとめ
①pix2pixは各カテゴリ１データで収束する。
②時間的に100データ／カテゴリの結果とあまり変わらない時間でほぼ似たような精度が得られた
②実は、Fine-Tuningもやったが、以下のとおり０epochで収束していた。もちろん同じ顔使っているので当たり前だが、。。。
![current_batch_training0.png](https://qiita-image-store.s3.amazonaws.com/0/233744/61e70188-243c-2bc5-1cfe-4a8b8cca4b3c.png)
web3 で invalid solidity type!: tuple[]って出た。

Truffle で開発してて、```mapping(address => Struct[])```って感じの変数を取得しようとしたら出ました。

[こちら](https://github.com/ethereum/web3.js/issues/1241)に載ってたので、一応qiitaにも載せておきます。

solidity0.4.19でサポートされているtuppleという型をweb3がまだサポートできていないのが原因のようです。

[ethers.js](https://docs.ethers.io/ethers.js/html/index.html)というライブラリだと対応しているようです。いまいちどういうものかわかっていないので、色々調べたら書いて見ます。
アプリとデータに関するはなし

アプリとそこで利用するデータが別々になっていて、アプリは一つでデータを入れ替えるようなシステムがある。
データはユーザーに勝手に取り出されたくない。

という状態で、どういう設計をすればよいか？という話です。

なお、はじめに書いときますけど**だいぶあたまわるい文章です。**


## 方法1 データは暗号化して保存して、利用時に復号ファイルを作成する

アプリの開始時やファイル利用時等に一時的に復号ファイルを作成する。利用が終わったら削除する。

### メリット

* ファイルを利用する箇所のプログラムは復号ファイルを処理するため、暗号化対応をしなくて良い(暗号化に対応していないライブラリを利用できる)。
* 実装が簡単(=コストが安い)。

### デメリット

* 復号ファイルが完全な状態で存在する期間中に復号ファイルを奪われるリスクがある。アプリが強制終了した場合などは削除処理が意図したとおりに実行されない可能性があるし、どんなに復号ファイルの生存期間を短くしようとしても復号ファイルを利用している間に復号ファイルを奪われることに対処するのは難しい。
* 一時的に暗号化ファイルと復号ファイル二個が存在することになるので、容量の大きなファイルを扱う時はストレージの空き容量に注意が必要。
* 容量の大きなファイルを復号するのはそれなりに時間がかかる。


## 方法2 データは暗号化して保存して、復号しながら処理する

復号ファイルを作成せず、暗号化ファイルを直接読み取りながら処理をする方法。

### メリット

* 復号ファイルが作られないので、ユーザーが奪おうと思っても奪いづらい。
* 一時的に復号ファイルを作る分の余計なストレージ容量が必要ない。

### デメリット

* 復号処理をしながらデータを処理することになるので追加のCPU処理コストがかかる。
* 復号処理を挟めないと実装できない(URLを渡すだけであとはいい感じに処理してくれるようなライブラリの場合、ソースがいじれないと使えない)。


## 方法3 データはユーザーからアクセスできない場所に置く

ファイルの暗号化を行わず、ユーザーがアクセスできない場所にファイルを置いておく。

### メリット

* 復号処理について考えなくて良い。
* 実装が簡単。

### デメリット

* ユーザーがアクセスできない場所というのはすなわち自分もアクセスできない場所なので、そこにどうやってファイルを配置するか？(自分が容易にアクセスできる方法を用意してしまうと、そこが抜け穴になる可能性がある)。
* 万が一のためのことを考えて暗号化しておいた方がよいかもしれないが、そうすると今度はいつ復号する？ふりだしに戻る。


---

ちなみに今のところ何も考えずに「暗号化」と書いているけど、暗号化・復号化をするためには鍵が必要になる。その鍵をどうやってアプリ内で取得するか？というのもまた結構たいへんな問題です。

まず、鍵は暗号化することができません。なぜなら鍵を復号するためにまた別の鍵が必要になるからです。その鍵はどうやって保存する？無限ループ…


## 方法1 アプリ内に鍵を持つ

アプリの中にどうにかして鍵を入れます。

### メリット

* 実装が簡単(=コストが安い)。

### デメリット

* アプリを解析されると鍵がバレる可能性がある。パッと見わからないようにある程度難読化する手段はいろいろ考えられるが、攻撃者が本気で解析しようとしたときに鍵がバレない保証はない。DVDやブルーレイの暗号化もこれで破られました…

## 方法2 アプリ内に鍵は持たず、どうにかして取得する

鍵はアプリ内にいれず、必要なときにサーバーから取得するなどしてどうにか入手します。
もちろん、入手した鍵はユーザーがアクセスできないプライベートな場所に保存する必要があります。

### メリット

* アプリを解析されても鍵はバレない。

### デメリット

* サーバーが必要。
* サーバーへ鍵を取得しに行く部分がきちんと作られていないと、通信内容を傍受して鍵を取得したりできてしまう…
* 取得した鍵を保存するところでうっかりミスると鍵がバレてしまう。

## 方法3 鍵は毎回違うものを使う

アプリ内に固定の鍵を持たず、サーバーから取得する鍵も毎回違うものを使う。

### メリット

* あんしん！

### デメリット

* 鍵が変わるということは暗号化データも変わる。ということは鍵が新しくなるごとに暗号化データも入れ替えなければいけない。事前ダウンロード型のシステムとは相性が悪い。
* というわけでサーバー利用必須。
* サーバーでの処理負荷もそれなりに大きい（暗号化したりするし）ので、運用コスト結構かかる。

---

いやー、安全安心なシステムを作るのって大変ですね！！
[C]同じ実行ファイルをシンボリックリンク名で使い分けるサンプルコード

# サンプルコード

```main.c
#include <stdio.h>
#include <string.h>

struct command_list {
    char *command;
    int (*func)(int argc, char *argv[]);
};


static int test_a(int argc, char *argv[])
{
    printf("test_a: called\n");
    return (0);
}

static int test_b(int argc, char *argv[])
{
    printf("test_b: called\n");
    return (0);
}


static struct command_list list[] = {
    { .command = "test_a", .func = test_a },
    { .command = "test_b", .func = test_b },
    { .command = NULL,     .func = NULL   }
};


int main(int argc, char *argv[])
{
    int i;
    int ret = 0;

    for (i = 0; list[i].command != NULL; i++) {
        if (strstr(argv[0], list[i].command) != NULL) {
            ret = list[i].func(argc, argv);
        }
    }

    return (ret);
}
```

# 使い方

```sh
$ gcc main.c
$ ln -s a.out test_a
$ ln -s a.out test_b
$ ./test_a
test_a: called
$ ./test_b
test_b: called
```

# まとめ

`strcmp`を使っているコードを見かけたが、絶対パスで指定できないので`strstr`を使いましょう。
仮想量子コンピュータで1+1するよ

# はじめに

最近は量子コンピュータを気軽に使えるようになりました。[IBMは本物の量子コンピュータをクラウドで公開](https://qiita.com/testnin2/items/6dc777a2517d608b8d9f)してますし、[量子コンピュータ用のプログラミング言語](https://qiita.com/ayatokura/items/8010a0414dfc1fb90b30)なども出てきています。
今回はその中でも、PythonのライブラリであるpyQuilを使って遊んでみました。

## pyQuilについて
量子コンピュータを開発しているRigettiという会社のAPIにアクセスして、仮想量子コンピュータで計算することができます。[公式ドキュメント](http://pyquil.readthedocs.io/en/latest/)を参考にしてます。

## 環境

OS: macOs High Sierra
Python: Anaconda3-5.0.0

pyQuilのバージョンは1.7.0です

## インストール方法
@YuichiroMinatoさんの記事にまとめられているので、そちらを参考にしてください。
[量子ゲートモデルのSDK、Rigetti Forestを触ってみる](https://qiita.com/YuichiroMinato/items/9de89b4467e3341c9dbd)

pip一発で入るはずなのですが、私の環境だとなぜか失敗するのでソースからインストールしました。
どこか適当なディレクトリで

```bash
git clone git@github.com:rigetticomputing/pyquil.git
cd pyquil
pip insall -e .
```
を実行すると使えるようになります。

## 前提知識
今回は「そもそも量子コンピュータってなに？」とか「量子ゲートって？」みたいなところは触れません。
その辺から知りたい人向けに、IBMがいい感じの入門記事を公開してくれているので紹介しておきます。
[IBM Quantum Computing で計算してみよう](https://www.ibm.com/developerworks/jp/cloud/library/cl-quantum-computing/index.html)


# 1 + 1を計算する量子回路

量子回路図はこんな感じになりました。CNOTゲートとCCNOTゲートだけで構成されています。
今回はパワポで描いたのですが、量子回路を描画するのにもっと便利なツールを知ってる人はコメントください。

<img width="621" alt="スクリーンショット 2018-02-16 18.59.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/182999/0f8ef774-775c-beaf-ed08-5316e61b6012.png">

[0]と[1]のビットに足し合わせる数(0か1)で、[2]と[3]が計算結果です。よくある1ビット加算器を量子回路で置き換えただけですね。

[2]にやっている処理が古典的コンピュータでいうXOR、[3]のがAND演算にあたります。

# できたプログラム

こんなプログラムになりました。

```one_plus_one.py
from pyquil import api
from pyquil.quil import Program
from pyquil.gates import *

def add(num1, num2):
	# 量子ビットの初期化(無くてもいいのかも)
	calc = Program(I(0), I(1), I(2), I(3))
	# 1が入力されてたら反転させる
	if num1:
		calc.inst(X(0))
	if num2:
		calc.inst(X(1))
	# 残りの計算はどの場合も共通
	calc.inst(CNOT(0, 2), CNOT(1, 2), CCNOT(0, 1, 3))
	# 量子ビットの値を古典ビットに入れて観測する
	calc.measure(0,0).measure(1,1).measure(2,2).measure(3,3)

	return calc

# 初期状態の結果はビットの並びが逆順になっているから整形する
def formating_result(result):
	left_hand = str(result[0][0]), str(result[0][1])
	right_hand = str( int(str(result[0][3]) + str(result[0][2]), 2) )
	answer = left_hand[0] + ' + ' + left_hand[1] + ' = ' + right_hand

	return answer

def main():
	qvm = api.QVMConnection()

	calc = add(0, 0)

	result = qvm.run(calc, [0, 1, 2, 3])
	
	answer = formating_result(result)

	print(answer)

if __name__ == '__main__':
	main()
```
実際に量子ゲートの設定をしているのはadd()です。
もうちょっと頑張って拡張すれば、多ビット化できる気がする。

add()の引数に応じて計算してくれます。今のところ引数は0と1のみです。

# 計算結果

4パターンしかないので、テストも楽です。実行すると、下のような出力をします。

1 + 1:
```$ python one_plus_one.py
1 + 1 = 2```

1 + 0:
```$ python one_plus_one.py
1 + 0 = 1```

# 重ね合わせ
ちなみに、add()の中をちょっと書き換えて

```python
calc = Program(
         I(0), I(1), I(2), I(3),
         H(0), H(1),
         CNOT(0, 2), CNOT(1, 2),
         CCNOT(0, 1, 3)
)
```

のようにすると、0と1を重ね合わせて同時に入力できます。
この重ね合わせが量子コンピュータの最大の武器なのですが、今回はただ出力がランダムになるだけです。

もうちょっと複雑な量子アルゴリズムになると、重ね合わせをフル活用していくことになります。

# おわりに

今回はpyQuilを使ってみたい！という思いでやってみました。
とはいえ、足し算くらいだと量子コンピュータでやる意味は全く無いので、次はもうちょっと量子コンピュータらしいアルゴリズムに挑戦してみます。
プライベートネットでのmistとtruffleの連携

はまったので備忘録として。

#現象

gethでプライベートネットを起動していて、truffleでデプロイしたコントラクトをmistで確認しようとしたら、表示されるはずのコントラクトから読む・書くが表示されずに焦りました。コントラクトアドレスやJSONインターフェースは正しく、コントラクト一覧に表示はされているが詳細が確認できないという状況。

#解決
分かってみれば何のことはなく、ポートが違っただけでした。。。

truffleはデフォルトでは9545で接続に行くみたいですが、truffle.jsに以下のような書き込みとmigrate時コマンドのオプションでOKでした。

```truffle.js
module.exports = {
  networks: {
    dev: {
      host: "localhost",
      port: 8545,
      network_id: "15"
    },
  }
};
```
```
truffle migrate --network dev
```
devの所は一致していれば何でもOKです。ここに複数の接続先を書いておけばメインネットやテストネットへの接続も切り替えられます。
host, port, network_idはgethで起動する時のものと一致させます。

これで無事にmistからコントラクトの確認や起動ができました。
mistはGUIでコントラクトが確認できるし、truffleはライブラリの依存関係等をうまく処理してくれるしで便利なので早く使いこなせるようになりたいですね。


#参考

詳細はtruffle公式で。
http://truffleframework.com/docs/advanced/configuration

truffleやmistの基本については以下を参考にさせていただきました。
[Truffle で始める Ethereum 入門 - ERC20 トークンを作ってみよう](https://qiita.com/amachino/items/8cf609f6345959ffc450)
[【Ethereum】実務で使う開発環境](https://qiita.com/sot528/items/0decc6f3a6b328f135fb)
HP NotePC Function Key について

HP NotePC　の　Function Key　の設定方法を記載します

購入した状態のの設定は、キーボードに刻印されている操作が有効です。
例）ボリュームや画面の明るさの設定など。

私は、F7で全角カタカナにしたいのに、ボリュームを下げることになる。

これとっても不便。簡単に変えられるのかと思ったら、、、
BIOSの設定変更で対応できるみたい。

対応方法
BIOS に ［Action keys Mode］ をDisable(無効）にする

コンピューターの電源を投入し、すぐに < f10 > キー を何度か押下
BIOS画面へ移動
Main メニューから ［System Configuration］へ
［Action Keys Mode］で [Disabled] (無効) を選択
[Exit] → [Exit Saving Changes] 
で完了です
swift4でビットを0詰めして表示する

swiftでビットを出力するには、

```swift
var bit: Int8 = 0b00001100
print(String(bit, radix: 2))
```

みたいな感じで実装すると思いますが、上記のコードだと、

```
1100
```
と出力されます。フラグ管理をしていてログを表示する場合、

```
1100
100
100100
```
先頭の0は表示されないため、このように桁数がバラバラになって出力されることがあります。
これがちょっと嫌だったので、先頭を0詰めして表示するコードを作りました。

```swift
func toBinary(value: Int8) -> String {
    let str = String(value, radix: 2)
    let padd = String(repeating: Character("0"), count: (MemoryLayout.size(ofValue: value) * 8 - str.count))
    return padd + str
}
```

http://eienlearner.seesaa.net/article/435097717.html

このサイトのコードを参考にしました。そのままだと動かなかったので、改良しました。

これで、先頭が0詰めされたビットが出力されます。

```
00001100
00000100
00100100
```

16ビット、32ビット、64ビットで使いたい場合は、引数の型をそれぞれInt16、Int32、Int64に変えてください。
rubyとseleniumを使ってTOKIO HIT 100を確認

# はじめに

いつでもTOKIO HIT 100のチャートを簡単に素早く確認したいと思い作成しました

## 必要なものをインストール

```
gem install selenium-webdriver
brew install chromedriver
```

## 適当にファイル作成

```ruby:tokio_hit.rb
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome

driver.navigate.to 'http://www.j-wave.co.jp/original/tokiohot100/chart/main.htm'
sleep 60
```

consoleで以下実行

```shell:console
ruby tokio_hit.rb
```

これでいつでもささっとチャートを確認できます！

## ついでに

youtubeに行って1位から10位までの
曲をお試しで聞いてみる

```ruby:tokio_hit.rb
table = driver.find_elements(:tag_name, 'table')
chart = table[5].text.split(/\n/).map { |str| str.gsub(/[^[^0-9]\s]/, "") }

chart[0..9].each do |song|
  driver.navigate.to "https://www.youtube.com/results?search_query=#{song}"
  driver.find_element(:id, 'thumbnail').click
  sleep 30
end
```

検索して一番上の動画を再生しているのですが、
一番上が全然関係ない動画だった場合が辛いのと
広告が入る時があるのが難点です

## version

```
gem list | grep selenium-webdriver
selenium-webdriver (3.9.0, 3.4.3)

chromedriver -v
ChromeDriver 2.35.528157 (4429ca2590d6988c0745c24c8858745aaaec01ef)

ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
```
ユーザー登録機能つき投稿サイト⓷(ユーザー作成とポストのアソシエーション)

１、deviseを用いた新規ユーザー登録の際に、emailとpassword以外にも,userの名前を登録できるようにする。
つまり、userテーブルにnameカラムを追加し、nameも登録できるようにする。

```ruby:qiita.rb
rails g migration add_name_to_user name:string
rails db:migrate
```
2,deviseの指示である、rails g devise:viewsでuser登録に関するviewを生成。
devise/registrations/new.html.erbとedit.html.erbの中のform部分を以下に変更し、nameも登録できるようにする。

```new.html.erb(新規ユーザー登録)
<div class="field">
    <%= f.label :name %><br />　←これを追加
　　　　　　　　<%= f.text_field :name, autofocus: true, autocomplete: "name" %><br />←これを追加
    <%= f.label :email %><br /> 
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
```

```edit.html.erb(既存ユーザーの編集)
<div class="field">
    <%= f.label :name %><br />　←これを追加
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %><br />　←これを追加
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

```
3,nameを受け取るためには、「ストロングパラメーター」にnameも追加しなくてはならない。
/controllers/application_controller.rbに以下を追加。
permit(:sign_up, keys: [:許可したいカラム名])の形

```application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
```
4,これでuser.nameを保存できるようになった。posts/show.html.erbに以下を追加。
（postを投稿したuserのnameとidを参照する）

```ruby:qiita.rb

<h1>name of editer:<%= @post.user.name %></h1>
<h1>user_No.<%= @post.user.id %>
```
MetabaseをWindowsにインストールする

Metabaseって何？という向きには [OSSのデータ可視化ツール「Metabase」が超使いやすい](https://qiita.com/acro5piano/items/0920550d297651b04387) や [MetabaseがRedashの苦労を吹き飛ばすくらい熱い](https://qiita.com/NobiNobiKen/items/adc6b8248e1e54e5e1f4) を参照いただくとして。

公式サイトから[jarをダウンロード](https://www.metabase.com/start/jar.html)して``java -jar metabase.jar``すれば動きます。

以上！。。。というだけではあんまりなので以下もう少し詳しく説明します。

#普通に動かす

Java 8は既にインストール済みであるものとします。まだの人は[こちら](https://www.java.com/ja/download/manual.jsp)へどうぞ。

Metabaseの実行は複数の方法が用意されていますが、Windows上で動かすには``metabase.jar``を使う方法しかありませんので、[公式サイト](https://www.metabase.com/start/jar.html)からダウンロードします。これを例えば``C:\metabase``かどこかのフォルダに配置してダブルクリックします。または、コマンドプロンプトから``java -jar metabase.jar``を実行します。

これで初期化が始まりますので、しばらく待ってからブラウザで http://localhost:3000/ にアクセスすると、Metabaseにアクセスできます。

Metabaseを実行するカレントディレクトリ上に、``metabase.db.mv.db``と``metabase.db.trace.db``という二つのファイルが作られます。Metabase自身が使用する内部データは、ここに保存されます。

__Q. ``metabase.jar``はいわゆるFat Jarのようだが、これはライセンス的にアリなのか。__
さあ？

__Q. ポート番号はデフォルトの3000から変更できないのか。__
A. できます。
環境変数MB_JETTY_PORTを使うとできます。詳しくは[StartガイドのCustomizing the Metabase Jetty webserver](https://metabase.com/docs/latest/operations-guide/start.html#customizing-the-metabase-jetty-webserver) ([Google翻訳](https://translate.google.com/translate?hl=&sl=en&tl=ja&u=https%3A%2F%2Fmetabase.com%2Fdocs%2Flatest%2Foperations-guide%2Fstart.html&sandbox=1)) を参照して下さい。

__Q. H2かよ。__
A. 変えられます。
Metabase自身が使用する内部データの置き場所はデフォルトでH2 Databaseですが、設定でMySQLかPostgreSQLに変更できます。詳しくは[StartガイドのMigrating from using the H2 database to MySQL or Postgres](https://metabase.com/docs/latest/operations-guide/start.html#migrating-from-using-the-h2-database-to-mysql-or-postgres) ([Google翻訳](https://translate.google.com/translate?hl=&sl=en&tl=ja&u=https%3A%2F%2Fmetabase.com%2Fdocs%2Flatest%2Foperations-guide%2Fstart.html&sandbox=1)) を参照して下さい。

#サービスとして登録する

Cygwinのcygrunsrvを使うとMetabaseをサービス化できますので、それをやってみます。

まず、以下の内容で``C:\metabase\metabase.sh``を作成します。パスは適宜変更してください。

```shell
#!/bin/sh
/cygdrive/c/ProgramData/Oracle/Java/javapath/java.exe -jar metabase.jar
```

次にCygwinを「管理者として実行」し、以下のコマンドラインでサービス登録します。

```shell-session
$ cygrunsrv --install metabase --path /cygdrive/c/metabase/metabase.sh --chdir /cygdrive/c/metabase
```

サービスを起動します。

```shell-session
$ cygrunsrv --start metabase
```

以上！幸運を祈る。
Rubyでファイルの比較をする

## はじめに
エンジニア初心者なのでお手柔らかにお願いします。過激なレビューが来たら泣きます。
## やりたかったこと
S3の中にretina用の画像が全部あるかDBのimageと照合したかった。
## 実装
S3のデータは記事を参考に取得。（[S3内のファイルを簡単に検索する - Qiita](https://qiita.com/tomosooon/items/db441c285e193d497223)）
DBのimageデータとS3の該当する全てのデータをそれぞれテキストに貼り付ける。

```db.txt
aaa.jpg
bbb.jpg
ccc.jpg
foo.jpg
```

```s3.txt
retina_aaa.jpg
bbb.jpg
retina_ccc.jpg
```

```ruby:search.rb
begin
  db = File.read('db.txt')
  s3 = File.read('s3.txt')
  shortCount = 0
  isExist = false
  db.each_line do |db_line|
    unless s3.include?("retina_#{db_line.chomp}")
      p db_line
      shortCount += 1
    end
  end
  p shortCount
end
```
## 結果
S3でretinaではなくファイル名が違うものと個数を算出することができる。

```tex:ターミナル
$ ruby search.rb
"bbb.jpg\n"
"foo.jpg\n"
2
```
S3をgrepするにはAmazon Athenaを使えばいいのですが料金がかかるのでRubyでやりました。
中身を変更したら他の内容の算出ができると思います。
UbuntuにGeth(v1.8.0)をインストールして同期する

ここ数ヶ月、EthereumのクライアントはGethもParityも不安定で苦労している方も多かったかと思いますが、先程Geth v1.8.0がリリースされました。

- https://blog.ethereum.org/2018/02/14/geth-1-8-iceberg%C2%B9

[<img width="682" alt="スクリーンショット 2018-02-14 23.47.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/50056/49a7ed96-48bd-34ac-4e7a-ccc0265c6945.png">](https://twitter.com/peter_szilagyi/status/963080264481234946)

**「パワフルなクラウドマシンならFast syncが3時間未満で同期できるよ」**
とのこと。すでにunstableな時点で評価してみましたが、たしかに1日未満で同期が完了していたし途中で落ちることもありませんでした。
安定版リリースのタイミングで改めて評価し、その手順と所感をまとめます。


# 結論
以下の通り **総じて早くなり、安定した** ので **以前のように安心して使えるようになった** という印象。

- 3時間未満で同期できた
- 途中で落ちなかった
- 相変わらず微妙な挙動もある(だいぶ改善されている)

Gethユーザはすぐに更新するのが良さそうです。
試したGethのバージョン: [1.8.0-stable-5f540757](https://github.com/ethereum/go-ethereum/releases/tag/v1.8.0)。
手順は以下のとおり。

# EC2インスタンス作成
- AMI: `Canonical, Ubuntu, 16.04 LTS, amd64 xenial image build on 2017-11-21`
- ストレージ: `100GB`
- インスタンスタイプ: `m4.xlarge`

それなりのbeefy cloud machineなはずです。

# Gethをインストール
```bash
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install -y ethereum
```

バージョン確認。

```bash
$ geth version
Geth
Version: 1.8.0-stable
Git Commit: 5f54075760748ae7f249bf735565924ea885c477
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9.4
Operating System: linux
GOPATH=
GOROOT=/usr/lib/go-1.9
```


# supervisorでデーモン化しておく
途中で落ちても立ち上げ直すようにsupervisorを入れておきます。

ログ用ディレクトリとsupervisor用のgethの.confファイルも作成。

```bash
sudo apt-get install -y supervisor
sudo mkdir /var/log/supervisor/jobs
sudo vi /etc/supervisor/conf.d/geth.conf
```

内容は以下の通り。

```ini
[program:Geth]
command=/usr/bin/geth --fast --cache=2048
user=root
autorestart=true
stdout_logfile=/var/log/supervisor/jobs/geth.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=5
stdout_capture_maxbytes=1MB
redirect_stderr=true
```

supervisorのreload。

```bash
sudo supervisorctl reload
```

以下のコマンドでログが吐かれていればOK。

```bash
tail -f /var/log/supervisor/jobs/geth.log
```

で、しばらく放置。

# 結果
冒頭に記載したとおり、問題なく3時間未満(2時間56分程度)で同期は完了しました。
`geth attach` でconsoleから挙動確認しても問題なし。
途中で落ちたりもしていなかったようです。検証のためだけであればsupervisorも不要だったかもしれません。

しかし、Gethでよくある微妙な挙動はまだ見受けられます。

- 最後の数十ブロックの同期がなかなか終わらない場合がある
    - ここに数日かかるパターンもあり。放置していればそのうち同期完了する
- 同期が完了したはずなのに `eth.getBalance` で残高あるのに `0` が返る場合あり
    - これも放置していると直る印象

などなど。
そうは言ってもだいぶ安定しました。

ここ数ヶ月はメジャーなクライアントでなかなか同期が成功しない、という厳しい状況でしたので今回のリリースは非常にありがたいですね。

# ちなみにLight syncでは
<img width="1093" alt="スクリーンショット 2018-02-15 0.10.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/50056/85cee8c7-b9bd-9ad2-03c2-b72f87f4f177.png">
53秒で同期が完了。Cool! 

- :warning:  [Light client protocol](https://github.com/ethereum/wiki/wiki/Light-client-protocol)は絶賛開発中のため用途によっては運用にご注意。
Spreadsheetをパースしてjsonとしてダウンロードする

できるかぎりミニマムに。
Blob化してObjectURL化してanchorのdownload属性に設定することでダウンロードさせる。

# できるもの

<img width="335" alt="SS_ 2018-02-16 20.00.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/2648/ce8404cf-85f2-efb1-da52-ed8749eb2425.png">

# コード

```html:ExportDialog.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script type="text/javascript">
    window.onload = function () {
      var json = "<?= data.json ?>"
      var blob = new Blob([ json ], { "type" : "application/json" });
      document.getElementById("dl-link").href = window.URL.createObjectURL(blob);
      return true
    }
    </script>
    <style>
    .button {
      background-color: #009688;  
      border-radius: 5px;
      color: white;
      padding: .5em;
      text-decoration: none;
    }
    
    .button:focus,
    .button:hover {
      background-color: #00796B;
    }
    </style>
  </head>
  <body>
    <a id="dl-link" class="button" href="" download="<?= data.name ?>">
      Download <?= data.name ?>  
    </a>
  </body>
</html>
```

```js:lib.gs
function showExportJsonDialog(name, json) {
  data = {
    name: name,
    json: json
  }
  var html = HtmlService
               .createTemplateFromFile('ExportDialog')
               .evaluate()
               .setSandboxMode(HtmlService.SandboxMode.IFRAME)
               .setWidth(200)
               .setHeight(50);
  SpreadsheetApp.getUi().showModalDialog (html, 'Export');
}
```

```js:example.gs
function main() {
  var users = [
    {name: '太郎', age: 16},
    {name: '二郎', age: 12},
    {name: '三郎', age: 7}
  ];
  showExportJsonDialog('users.json', JSON.stringify(users, null, 2));
}
```
Laravel Auto Discovery を用いたパッケージ開発


モジュール側の composer.json に以下を追加することで auto discovery が働く。

````
"extra": {
	"laravel": {
		"providers": [
		    "ModuleServiceProvider"
		]
	}
}
````

auto discovery で検出されたファイルは `bootstrap/cache/packages.php` に記録される仕組み。

## サービスプロバイダであれこれする

ルートを生やす

````
public function boot()
{
    \Route::prefix("...")->group(function ($route) {
        $route->get(...)
    });
}
````

設定の追加

````
    public function register()
    {
        config()->set("mymodule.config", [
        ]);
    }
````

コンテナ操作

````
    public function register()
    {
        app()->singleton(....);
        app()->extends(....);
    }
````

コマンド登録

````
    public function register()
    {
        $this->commands([
        	....
        ]);
    }
````

基本的に Laravel の app フォルダは ExceptionHandler 以外触る必要はない
Jenkinsのバックアップを簡単にデイリーでとる ついでにバージョン管理する


# Jenkinsのバックアップを簡単にデイリーでとる 
いろんな人がこの問題への回答を出しているのですが、なんかいっぱいスクリプト書いてたりして細かい設定とか小回り効かせたいとか…わかるけど…**とってもめんどくさいと思いました！**

ので[thinBackup](https://wiki.jenkins.io/display/JENKINS/thinBackup)を使ってjenkinsの設定を最小限でやる方法を考えてみました。

# thin Backupの設定

thinBackupの設定はここにあります。jenkinsの設定画面からも行けます。
[JenkinsのURL]/thinBackup/backupsettings


で次の設定をします。

* Backup directory にバックアップディレクトリを設定する

次の二つにバックアップスケジュール設定
* Backup schedule for full backups
* Backup schedule for differential backups

後の設定はお好みで

できたら[JenkinsのURL]/thinBackupからBackup NowをおしてRestore画面から、正しくバックアップとれているかを確認。
(ドロップダウンに日付が出ていればOKです。)

ここまででローカルにバックアップが取れます。

#ジョブの設定(ついでにバージョン管理する)

ここまででバックアップは取れていますが、あとはバージョン管理に上げたい場合の説明
gitで説明しますが大体たぶん一緒です。

1.フリースタイルジョブ作ります。
2.カスタムワークスペースをThinBackupのバックアップディレクトリにします。
3.ジョブを動かしてワークスペースにバックアップファイルがあるか確認します。
4.ソースコード管理のところでgitリポジトリに設定します。
5.ジョブを動かすと、バックアップが一回消えます。(リポジトリをクローンしてくるため)
6.ThinBackupでバックアップを取ります。
7.次のようなコードを動かしてバックアップをgitにプッシュします


``` powershell:powershell

git add *
$date = Get-Date
git commit -m"backup update $date"
git push origin HEAD:master

```

ワークスペース全体addしてコミットしてプッシュできれば何でもいいですが大体こんな感じでバックアップとれます。
書くスクリプトは4行！
Slackでのチャンネル整理術 「ミュート+お気に入り」(注意力を大事にしよう)

チャットツールとの付き合い方は、現代の働き方においての重要なイシューである。

たとえばSlackでも、付き合い方を間違えると、必要な情報がキャッチできなかったり、逆に注意力を奪われて仕事にならなかったりする。
その状態に慣れすぎると、注意力が奪われていることにすら無自覚になってくる。

個人個人で、適切な対策が求められる。

# ミュートじゃ足りない

Slackの柔軟性は、僕が期待するよりも低い。

- チャンネルをミュートすると、まったく読まなくなってしまう。
- チャンネルをミュートしないと、膨大な情報量に飲まれてしまう。

これはもどかしい。
ちょうどこの中間ぐらいのチャンネル設定がほしいと思っていた。

# ミュート＋お気に入りで、時間を決めてチェックする


たとえば、1日1回だけチェックすれば良いチャンネルがある時。
新しいメッセージがあるたびに、チャンネル一覧が未読状態になってしまうのは、相当に注意力を奪う。通知などもっての外だ。

このように距離感を保ちたいチャンネルに対しては「ミュート＋お気に入り」をしてみるのはどうだろうか。

そして、1日の中で時間を決めて、そのチャンネルをチェックする時間を作れば良いのだ。
お昼休み前とか、定時の15分前とか、好きな時間を決めて。
(忘れないように、Slackのリマインダーでも仕込むのが良いかもしれない)

こうすれば、リアルタイムには注意力を奪われず、なおかつ、必要な情報を見逃すことはない。（ただし、習慣を守りさえすれば)


# チャンネルとの距離感

チャンネルとの距離感を調整しよう。

- 全ての通知を受け取る (特に重要なもの)
- 通知を受け取らない (リアルタイムで読む必要があるもの)
- ミュート+お気に入り (時間を決めて読めば良いもの)
- ミュート、もしくはチャンネルを使わない (不要なもの)

このざっくり4種類ぐらいの状態を使い分けて行きたい。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
interfaceでも変数・関数をprotectedな状態にしたい

#はじめに

protectedを利用したい場合には抽象クラスを使えば良いですが、すでに他のクラスを継承していて継承できないとか事情がある場合にはinterfaceでpublic/privateで定義をするしかありません。

でもinterfaceを実装したクラス以外から呼ばれたくない(呼ぶ必要がないから隠したい)ということも稀にあるかなと思います。

ひとまず、Kotlinのinterfaceというとだいたい下記のようになるかと思います。

```kotlin
interface SampleInterface {
    //サブクラス以外から見られたくない
    val sampleText: String
    
    //サブクラス以外から呼ばれてもOK
    fun callSampleMethod(){
        sampleMethod()
    }

    //privateなら指定できる
    private fun sampleMethod(){
        //何らかの処理
    }
}
```

Kotlinのinterfaceでは実装を持つことができるので抽象クラスとの違いがわかりにくくなった感があります。
ついでにprivateも従来のJavaのinterfaceクラスでは定義できませんでした。
Java8でできるようになったんだったか...

そしてinterfaceを実装したクラスというのが下記のコードです。

```kotlin
class Sample1(): SampleInterface {
    override val sampleText: String
        get() = "hoge"
}
```

ただし、これだと外部から参照できる必要のない`Sample1().sampleText`が参照できてしまいます。

# 委譲を利用したアダプターパターン(ラッパーパターン)を利用する

下記のSample2クラスはSampleInterfaceのinstanceを持つクラスです。

```kotlin
class Sample2() {
    private val sample = object: SampleInterface {
        override val sampleText: String
            get() = "huga"
    }

    fun callMethod() {
        sample.callSampleMethod()
    }
}
```

SampleInterfaceのinstanceをprivateに持つことでSampleInterfaceそのものを外部から参照出来なくし、擬似的にprotectedな状態を再現しています。
ちなみに`private val sample = Sample1()`でも良いですし、その方が良いパターンもあると思います。

ただ、SampleInterface内のpublicな変数・関数が全て擬似protectedになってしまうので意図に沿った実装になるか注意が必要です。

# まとめ

Sample1、Sample2それぞれの変数・関数の呼び出しは下記の通りです。

```kotlin
val sample1 = Sample1()
sample1.sampleText //見えちゃう
sample1.callSampleMethod()

val sample2 = Sample2()
sample2.sampleText //見えない
sample2.callMethod()//callSampleMethodを呼び出す関数
```

ちなみに、当然ですが委譲を利用したアダプターパターン(ラッパーパターン)なので抽象クラスでもオブジェクトでも同じように実装できます。

# 感想

委譲するか実装を持つようにするかは個人の好みでも良いのかもしれません。
IE11でIE10以前の開発者ツールを起動する

IE11から、開発者ツールは大幅な機能追加・変更がなされました。
全体的に使いやすくなったのですが、JS・CSSを無効化する機能や、イメージレポート等の機能は無くなってしまいました。
特にJSの方はホームページのちょっとした検証の際などに度々使っていたため、個人的にはショックでした。
わざわざインターネットオプションを開かなくてもキャッシュを消せるのは便利だったんですけどね。
# 回避方法
色々試してみたところ、showModalDialogメソッドで開いたモーダルウィンドウ上でF12を押すと、IE10以前の開発者ツールが起動できました。

![ie11.png](https://qiita-image-store.s3.amazonaws.com/0/238982/93475844-6872-2eda-220a-656de031289b.png)
IE11のモーダルウィンドウで開いた開発者ツール。何故かピン留めができない。

# showModalDialogメソッドとは？
モーダルウィンドウ又はモーダルダイアログと呼ばれる画面をブラウザの前面に表示します。
window.openメソッドと違い、表示中はモーダルウィンドウ以外のページが操作できません。
モーダルウィンドウ側でreturnValueプロパティに値をセットすると、親ウィンドウ側で受け取ることができるため、フォーム等でユーザーに必須の項目を入力させたい場合等に利用できます。

元々IE4で実装されたようですが、現在は非推奨となっており、正式にはサポートされていません。
ChromeやFirefoxも昔はサポートしていたようですが、現在もshowModalDialogメソッドが動作するのはおそらくIEのみだと思います。
また、モーダルウィンドウを開いている間はIEの動作が非常に不安定で、何もしなくてもしばらくすると動作を停止し、強制終了してしまいます。
停止するまでの間は、CSSの無効化やセッションCookieの削除など、一部の機能に限り使うことができます。

# showModalDialogメソッドの使い方
下記のような形式で記述をします。

`<a href="javascript:showModalDialog('https://qiita.com/','augments','dialogWidth:1400px;dialogHeight:800px;');">モーダルウィンドウを開く</a>`

詳細はこちらのページに詳しく載っていますので、こちらを参照してください。
http://alphasis.info/2013/06/javascript-windowobject-showmodaldialog-url-arguments/

# 結論
IE11でもIE10以前の開発者ツールを起動できるが、実用性には乏しい
傾いた戦車でターゲットを狙う

![スクリーンショット 2018-02-16 18.58.14.png](https://qiita-image-store.s3.amazonaws.com/0/59911/f25204ae-524f-17cd-141e-f114cf8a7a57.png)

砲台が左右回転、砲塔が上下回転しかできない戦車があるとします。
地面の起伏に沿って戦車が傾いた状態で目標を狙うためには、
目標の向きを戦車の座標系に変換てから計算すると便利です。

```
    // ターゲットを戦車座標系に
    Vector3 dir = targetTr.position - cannonTr.position;
    Quaternion invRot = Quaternion.Inverse(transform.rotation);
    Vector3 invDir = invRot * dir;
```

変換後の向きから、回転角・仰角をそれぞれ砲台・砲塔のローカル座標系に入れます

```TankCannonCtrl.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TankCannonCtrl : MonoBehaviour {
    [SerializeField] Transform targetTr; // 目標
    [SerializeField] Transform turretTr; // 砲台
    [SerializeField] Transform cannonTr; // 砲塔

	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
        // ターゲットを戦車座標系に
        Vector3 dir = targetTr.position - cannonTr.position;
        Quaternion invRot = Quaternion.Inverse(transform.rotation);
        Vector3 invDir = invRot * dir;
        float turretAng = getLongitudeRad(invDir) * Mathf.Rad2Deg; // ローカルでの方位角
        float cannonAng = getLatitudeRad(invDir) * Mathf.Rad2Deg; // ローカルでの仰角
        Quaternion turretRot = Quaternion.AngleAxis(turretAng, Vector3.up);
        Quaternion cannonRot = Quaternion.AngleAxis(cannonAng, -Vector3.right);
        turretTr.localRotation = turretRot; //Quaternion.Lerp(turretTr.localRotation, turretRot, 0.2f);
        cannonTr.localRotation = cannonRot; //Quaternion.Lerp(cannonTr.localRotation, cannonRot, 0.2f);
        Debug.DrawRay(cannonTr.position, cannonTr.forward * 100f);
	}

    private float getLongitudeRad(Vector3 _dir)
    {
        return Mathf.Atan2(_dir.x, _dir.z);
    }
    private float getLatitudeRad(Vector3 _dir)
    {
        float lxz = Mathf.Sqrt(_dir.x * _dir.x + _dir.z * _dir.z);
        return Mathf.Atan2(_dir.y, lxz);
    }
}
```

![tankRot_image-iloveimg-cropped.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/12b86cc3-68e3-0bef-cf9f-9327c61e0967.gif)

砲弾を斜方投射させたい場合は、[斜方投射](https://qiita.com/ELIXIR/items/59cbdc1fada8c85079e2)の式で得た角度をターゲットとして利用します。
paiza上で何回計算できるかの目安(C++)を計測してみた。

#競技プログラミング系は許容される実行時間と消費メモリ量が決まっている

paizaにかぎらずAtcoderとか競技プログラミング系はリソースに制約がかかっている場合があります。
問題に対する解法の計算量を先に計算しておかないと、実装してから制限時間内に終わりませんでしたでは悲しすぎます。
計算量を時間に換算すると[これ](https://www.slideshare.net/catupper/ss-26238956)によると、、$O(10^7)$から$O(10^8)$くらいで1秒になるらしいです。
・・・本当かなぁ。

##計測してみた。

ということで実際に計測してみました。

計測のプログラムは下にあります。
プログラムは、オーダー分だけ乱数を計算するだけです。
Nの大きさが$10$の乗数になるのでそのままオーダーの大きさになります。
countが計測回数です。
計測ページは、[paiza.io](https://paiza.io/ja/projects/new)を使いました。
※サーバーに負担がかかるのでむやみやたらにやらないほうが良いです。
計測の結果、$10^8$回で、大体$0.21$秒 かかっているため、$5 \times 10^8$くらいで1秒になります。
よって概ね正しいです。
実際に問題を解く場合、計算量がさらに少なくなり高速になる場合もありますが、メモリへのアクセスを伴うことがほとんどの場合で想定されます。
よって実際には更に時間がかかると思われます。
計算に使う変数がCPUのキャッシュに乗った場合、かかっても1桁から2桁増えるくらいになりそうなので、多くても$O(10^7)$くらいのオーダーだったら、paizaの問題は制限時間3秒(paiza.ioは2秒)のため通ることになります。
※コンパイルの最適化が行われないこと前提なプログラムです。最適化が行われる場合、ループ中のxorShift()の値が利用されていないため、ループが消える可能性もあります。。
よって目安は$O(10^7)$としてアルゴリズムを考えましょう。

```C++
#include <iostream>
#include <chrono>
#include <array>
#include <numeric>

#include <cinttypes>
#include <cstdlib>

using std::cin;
using std::cout;
using std::endl;
using std::cerr;

template<class T>
constexpr T spow(T base, T exp) noexcept {
	//static_assert(exp >= 0, "Exponent must not be negative");
	return exp <= 0 ? 1
		: exp == 1 ? base
		: base * spow(base, exp - 1);
}
uint32_t xorShift(void) {
	static uint32_t y = 2463534242;
	y = y ^ (y << 13); y = y ^ (y >> 17);
	return y = y ^ (y << 5);
}
int main(void)
{
	cin.tie(0);
	std::ios::sync_with_stdio(false);
	constexpr size_t N = 8;
	constexpr size_t orderSize = spow<size_t>(10, N);
	constexpr size_t count = 10;
	std::array<double, count> timeArray;
	cout << "O(10^" << N << ")" << endl;
	for (auto &&elem : timeArray)
	{
		auto startTime = std::chrono::high_resolution_clock::now();
		for (size_t i = 0; i < orderSize; i++)
		{
			xorShift();
		}
		auto endTime = std::chrono::high_resolution_clock::now();
		auto elapsed_time = std::chrono::duration_cast<std::chrono::microseconds>(endTime - startTime);
		double time = elapsed_time.count() / (spow<double>(10, 6));
		cout << time << "秒" << endl;
		elem = time;
	}
	double ave = std::accumulate(timeArray.begin(), timeArray.end(), 0.0f) / (double)timeArray.size();
	cout << "平均" << ave << "秒" << endl;

	return EXIT_SUCCESS;
}


```
Cloud Firestoreでクエリを使ってみたら便利だった話

Cloud Firestoreを最近がっつり使っていて
本当に素晴らしいサービスだと思います。(使っていくうちに辛いところも見えてきましたが、、、、)


その中でクエリが素晴らしかったので共有します。

## Realtime DatabaseのときのDB設計

`user` と `group` があって `user`がどのグループに所属しているかを保存する `users_group` があるとき
の図が下記のようになると思います。


<img width="290" alt="スクリーンショット 2018-02-16 18.01.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/431d522b-7303-a5d4-0541-4aaae1750a93.png">

実装した中に
「グループに所属するユーザー一覧を取得したい」という要件がでてきたら自分はこう作り変えます。

<img width="279" alt="スクリーンショット 2018-02-16 18.06.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/975f755c-b24b-51d8-52fc-59552fb27838.png">


この場合グループに所属するユーザー一覧を保存する `groups_user` を作成することになると思います。
これだとすごくめんどくさいですよね。

なんでかっていうと

例えばユーザーがグループを作成し、作成したユーザーがそのグループに入るとき、
`groups_user` と `users_group` 両方を一気に更新する必要があります。


## 解決

Cloud Firestoreのクエリを使えば解決できました！

データを下記のように追加します。

<img width="902" alt="スクリーンショット 2018-02-16 18.10.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/f87b7297-4ed6-042e-1e5f-6faa1c9c1e7a.png">


あとは、クエリを実行するば

### グループに所属するユーザー一覧する場合

```kotlin
val groupRef = db.collection("users_group")

groupRef.whereEqualTo("group_id", [検索したいgroup_id]).get()
     .addOnSuccessListener {

     val resultList = ArrayList<GroupEntity>()
     it.forEach {
         //ここで一覧を取得できる
     }

     renderGroupList(resultList)

<img width="290" alt="スクリーンショット 2018-02-16 18.01.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/d7ca5dcb-512c-22ca-ca7c-769136d1919a.png">
}
```


### ユーザーが所属しているグループ一覧一覧する場合

```kotlin
val groupRef = db.collection("users_group")

groupRef.whereEqualTo("uid", [検索したいuid]).get()
      .addOnSuccessListener {

      val resultList = ArrayList<GroupEntity>()
      it.forEach {
         //ここで一覧を取得できる
      }

      renderGroupList(resultList)

}
```

すばらしい。
これで無駄なテーブルにドキュメントにデータを保存する必要がなくなりました。
素晴らしい。


## P.S

FirebaseのTシャツください。

くれる人下記まで連絡ください。
https://twitter.com/yshogo87