OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで言語処理100本ノック2015 問題01

Pythonは簡潔で直感的に書けて非常に気持ちよくコーディングができてます。
早速実装を見ていきましょう。

#実装
>01.問題：「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．

文字列から取得する位置が1,3,5,7と奇数だったので
以下を試して見ました。

```:Python3
s = 'パタトクカシーー'
print(s[::2])
```

```:実行結果
パトカー
```
問題なさそう。一つ飛ばしで文字列取得するプログラムがめちゃ短くできました。
物足りない人は別の実装パターンを下記に記載しましたのでどうぞ。

#別パターン

規則性がない場合も考えて以下のように実装しました。

```:python3
s = 'パタトクカシーー'
match_list = [1,3,5,7]

answer = ""
i = 1

for chara in s:
    if i in match_list:
        answer += chara
    i += 1

print(answer)
```
```:結果
パトカー
```

これはさらに以下のようにjoin()を使うと
データ出力フォーマットも広く対応できます。
　join()を使った場合だと、以下のようなリスト内包表記が読みやすいと感じてます。
あと、文字列シーケンスをループするときにenumerate()だとインデックスも取得できて楽ですね。


```:python3
s = 'パタトクカシーー'
match_list = [1,3,5,7]

answer = "".join([chara for i, chara in enumerate(s) if i+1 in match_list])

print(answer)
```
```:結果
パトカー
```

##NGシーン

```:python3
s = 'パタトクカシーー'
match_list = [1,3,5,7]

answer = []
i = 1

for chara in s:
    if i in match_list:
        answer.append(chara)
    i += 1

print(answer)
```
```:結果
['パ', 'ト', 'カ', 'ー']
```
愛くるしい凡ミスですが、僕はやりがちです。

以上です！

#参照URL
問題文は：http://www.cl.ecei.tohoku.ac.jp/nlp100/
strオブジェクトに関して:https://docs.python.jp/3/library/stdtypes.html#str
【ActiveRecord】非RailsのActiveRecordでMigrationする

非RailsでActiveRecordを使ってMigrationするためのメモ。

# Migrationファイルの作成

任意のディレクトリ下（`db/migrate`など）にMigrationファイルを作成していきます。

- ファイル名とクラス名を揃える
- バージョン管理用のprefixをつける
- バージョンによって[Migration Versioning](http://chulip.org/entry/2017/05/19/161338)の指定を行う
に注意してファイルを追加する。

```db/migrate/001_create_projects.rb
class CreateProjects < ActiveRecord::Migration[5.1]
    def self.up
      create_table :projects do |t|
        t.string :name
      end
    end

    def self.down
      drop_table :projects
    end
end
```

# Migrationを実行する

Rakefileなりから以下を呼び出す。 
`migrate`メソッドの引数に　Migrationファイルが格納されたディレクトリのパスを渡す。

```rb
require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter: "postgresql",
  host:     "localhost",
  username: "XXXXX",
  password: "YYYYY",
  database: "my_db",
)

ActiveRecord::Migrator.migrate('./db/migrate')
```

# 参考

[非Rails AppでActiveRecord::Migrationを使う + Rakeでバージョン管理する - Qiita](https://qiita.com/foloinfo/items/6ecfe3c5fd1b56f1dceb)
[ActiveRecordのMigrationを単体で使う - 黒縁眼鏡は海を飛ぶ](http://blog.ryoana.com/entry/2016/05/31/233751)
[Rails Migration versioningと5.1での変更点 - chulip.org](http://chulip.org/entry/2017/05/19/161338)
[rails じゃなくても ActiveRecord を使う - momota.txt](https://momota.github.io/blog/2014/05/10/activerecord/)
ルーティングの役割と機能

ルーティングについての理解がまだ浅く、どのような記述をしたらどのように動くのか？というのがいまいちわからなかったのでまとめてみました。

# 環境
- IDE：Cloud9
- Ruby：ruby 2.0.0p648
- Rails：Rails 4.0.5

# Railsのルーティング
> Railsのルーターは受け取ったURLを認識し、適切なコントローラ内アクションに割り当てます。ルーターは、ビューでこれらのパスやURLを直接ハードコードすることを避けるためにパスやURLを生成することもできます。
RailsGuides：https://railsguides.jp/routing.html

ユーザーがwebページへのアクセスを要求するというのは、サーバーへリクエストを送るということです。その送られてきたリクエストに対して、ルーティングで適切なコントローラーへ割り当てていくというのが、ルーティングの機能になります。

# 記述方法
## rootを指定
```:routes.rb
root "static_pages/home"
```
rootメソッドを使用することによって、ルート'/'が指定できます。というのも、URLがhttp://localhost:3000であった場合、そこにアクセスしてもページは表示されません。しかし、rootでコントローラーとアクションを指定することによって、その指定されたページを表示できるようになります。

## getで指定
```:routes.rb
get "static_pages/home"
```
上記で指定した場合、このコードは**/static_pages/homeへのアクセスは、StaticPagesコントローラーのhomeアクションを処理する。**という意味になります。ルーティングでは_(アンダーバー)が入っているにも関わらず、コントローラーの名前にはないのはなぜか？という疑問を持たれた方はこちらのページを参照ください。　[参考：コントローラの作成と命名規則(命名規約)](https://www.rubylife.jp/rails/controller/index1.html#section2)
コードを文字で示すなら、`get コントローラー名/アクション名`ということになります。ちなみに、StaticPagesコントローラーの中身は以下のようになります。

```:StaticPagesController
class StaticPagesController < ApplicationController
  def home
  end
end
```

## matchで指定
```:routes.rb
match '/about',  to: 'static_pages#about',  via: 'get'
```
このコードは、**aboutというパスが指定された場合は、StaticPagesコントローラのaboutアクションを処理する。ただし、getの場合のみ。**という意味になります。
パスというのはURLのhttp://localhost:3000/パスの部分です。URL+static_pages/aboutと記述していたのが、URL+/aboutで済むようになります。
getというのは、HTTPメソッドのことです。HTTPメソッドは以下の記事を参考にしてください。
[HTTPメソッド(CRUD)についてまとめた](https://qiita.com/Ryutaro/items/a9e8d18467fe3e04068e)
また、matchを使用すると名前付きルートも自動で生成されるので、viewでの使い勝手がよくなります。
コードを文字で示すと、`match 'パス', to: 'コントローラー名#アクション名', via:'HTTPメソッド'`となり、名前付きルートの`パス_path`が自動的に使用できるようになります。

## resourcesで指定
```:routes.rb
resources :photos
```

このコードだけで以下の7つのルーティングが作成されます。

|HTTP動詞|パス|コントローラ#アクション|目的|
|:-:|:-:|:-:|:-:|
|GET|/photos|photos#index|すべての写真の一覧を表示|
|GET|/photos/new|photos#new|写真を1つ作成するためのHTMLフォームを返す|
|POST|/photos|photos#create|写真を1つ作成する|
|GET|/photos/:id|photos#show|特定の写真を表示する|
|GET|/photos/:id/edit|photos#edit|写真編集用のHTMLフォームを1つ返す|
|PATCH/PUT|/photos/:id|photos#update|特定の写真を更新する|
|DELETE|/photos/:id|photos#destroy|特定の写真を削除する|

>Railsガイドより引用

resourcesという一文のみで7つのルーティングが使用できるようになるわけですが、7つすべての機能はいらない場合があります。その場合は、以下のように記述することによって機能を制限することができます。

```:routes.rb
resources :photos,      only: [:new, :create, :index]
```

## ネスト(入れ子)して指定
先ほどのphotosにコメントを入れる場合、写真に対してコメントが紐づきます。つまり、写真1枚に対するすべてのコメントのURLは`/photos/写真のid/comment`のようになると予想されます。このように、お互いが紐づけされるような場合は`do`を使用してあげます。

```:routes.rb
resources :photos do
  resources :comment
end
```

このようにすることで、photosに関連付けされたcommentを指定できるようになります。

# まとめ
- rootで最初のページを指定できる。
- `get コントローラー名/アクション名`で指定できる。
- `match 'パス', to: 'コントローラー名#アクション名', via:'HTTPメソッド'`だとHTTPメソッドの指定ができ、自動的に名前付きルートが使用できる。
- resourcesで指定するとindex,new,create,show,edit,update,destroyがアクションが使用できるようになる。
- resourcesにonlyを指定すると、指定したアクションのみに制限することができる。
- do～endを使用するとURLを入れ子にした形にすることができる。

#　参考
RailsGuides：https://railsguides.jp/routing.html
RubyLife：https://www.rubylife.jp/
https://qiita.com/Ryutaro/items/a9e8d18467fe3e04068e
SinatraとDockerで作るジャッジサーバーAPI

AtcoderのようなオンラインジャッジサーバーAPIをSinatraとDockerで作ったのでメモ。

```rb
require 'sinatra'
require 'docker'

post '/exec' do
  body = JSON.parse(request.body.read)
  if body["lang"] == nil || body["code"] == nil  || body["input"] == nil || body["ans"] == nil
    status 400
  else
    return {result: judge(body["lang"], body["code"], body["input"], body["ans"])}.to_json
  end
end

def judge lang, code, input, ans
  case lang
  when 'c'
    file_name = "main.c"
    container = create_container('gcc:latest', file_name, code, input)
    ce = container.exec(["timeout", "10", "bash", "-c", "gcc #{file_name}"]).last != 0
    exec_cmd = './a.out'
  when 'cpp'
    file_name = "main.cpp"
    container = create_container('gcc:latest', file_name, code, input)
    ce = container.exec(["timeout", "10", "bash", "-c", "g++ #{file_name}"]).last != 0
    exec_cmd = './a.out'
  when 'py'
    file_name = "main.py"
    container = create_container('python:latest', file_name, code, input)
    exec_cmd = "python #{file_name}"
  when 'rb'
    file_name = "main.rb"
    container = create_container('ruby:latest', file_name, code, input)
    exec_cmd = "ruby #{file_name}"
  end

  return 'CE' if ce
  sleep(0.005)
  result = container.exec(["timeout", "30", "bash", "-c", "time #{exec_cmd} < input.txt"])
  container.delete(force: true)

  case result.last
  when 0
    time = result[1][0].split[3].split("m")[1].to_f
    case
    when (result[0][0] == ans && time <= 2.0) then return 'AC'
    when (result[0][0] == ans && time >  2.0) then return 'TLE'
    when (result[0][0] != ans)                then return 'WA'
    end
  else
    return 'RE'
  end
end

def create_container image_name, file_name, code, input
  memory = 500 * 1024 * 1024
  options = {
    'Image' => image_name,
    'Tty' => true,
    'HostConfig' => {
      'Memory' => memory,
      'PidsLimit' => 10
    },
    'WorkingDir' => '/tmp'
  }
  container = Docker::Container.create(options)
  container.start
  container.store_file("/tmp/#{file_name}", code)
  container.store_file("/tmp/input.txt", input)
  return container
end
```

基本的な流れとしては
1. POSTリクエストで言語の種類、コード、入力、答えを受け取る
2. 言語によってDocker imageからDocker containerを作成する
3. コードとファイルをcontainerに流し込む
4. プログラムの実行
5. 実行結果と答えの比較
6. 判定結果をjsonで返す

create_containerメソッド内でメモリサイズの指定などを行なっている。
実行時には30秒で打ち切るように設定

課題としては、言語が少ないことと、多分攻撃された時の対策ができてない。
詳しくはhttps://github.com/getty104/judge_api

* 11月14日追記ーコンパイルに時間制限を追加
* 11月14日追記ーバグ修正、TLEを追加
golangのちょっとしたTips

## はじめに
- いろいろと気づいたことを順不同で雑多にまとめます。

## 概要
- `time.Unix` は `nanosec` だけ渡せばよい
- yaml と json のkey名指定を同じタグで指定する
- `for range` で取り出した要素を変更する
- 意外と初期化しなくても使えるものたち

## 内容
### `time.Unix` は `nanosec` だけ渡せばよい
- `sec` と `nsec` にわざわざ分割して渡してもいいが

```go:冗長
now := time.Now()
unix := now.UnixNano()

sec := unix/1e9
nsec := (nsec - sec*1e9)

time.Unix(sec, nsec)
```

- `sec=0` にして `nsec` だけ渡せばOK

```go:ok
now := time.Now()
nano := now.UnixNano()
time.Unix(0, nano)
```


### yaml と json のkey名指定を同じタグで指定する
yaml を Unmarshal するときは [go-yaml/yaml](https://github.com/go-yaml/yaml) を使うことが多いと思いますが、この場合、jsonはjson, yamlはyamlでタグをそれぞれ書く必要があります。

```go:gopkg.in/yaml.v2
type Person struct {
	FirstName string `json:"first_name" yaml:"first_name`
	LastName  string `json:"last_name" yaml:"last_name"`
}
```

代わりに [ghodss/yaml](https://github.com/ghodss/yaml) を使うと、jsonタグで共通化できる

```go:github.com/ghodss/yaml
type Person struct {
	FirstName string `json:"first_name"`
	LastName  string `json:"last_name"`
}

func main() {
	p := Person{
		FirstName: "Tarou",
		LastName: "Yamada",
	}
	
	bs, err := yaml.Unmarshal(&p)
	if err != nil {
		log.Panicf("error: %#v", err)
	}
	
	log.Printf("%s", bs)
	// first_name: Tarou
	// last_name: Yamada
}
```

### `for range` で取り出した要素を変更する
- 当たり前っちゃ当たり前ですが、取り出した要素をそのまま更新しても変わりません


```go
type Person struct {
	FirstName string
	LastName  string
}

persons := []Person{
	{FirstName: "Taro", LastName: "Yamada"},
	{FirstName: "Hanako", LastName: "Tanaka"},
	{FirstName: "Ichiro", LastName: "Suzuki"},
}

for _, p := range persons {
	p.LastName = "Takahashi"
}
fmt.Println(persons)
// [{Taro Yamada} {Hanako Tanaka} {Ichiro Suzuki}]
```

- 変更したければ、 `persons[i]` を更新する

```go
persons = persons0
for i := range persons {
	persons[i].LastName = "Takahashi"
}
fmt.Println(persons)
// [{Taro Takahashi} {Hanako Takahashi} {Ichiro Takahashi}]
```

- pointer配列の場合はそのまま変更ができる

```go
ppersons := []*Person{
	{FirstName: "Taro", LastName: "Yamada"},
	{FirstName: "Hanako", LastName: "Tanaka"},
	{FirstName: "Ichiro", LastName: "Suzuki"},
}

for _, p := range ppersons {
	p.LastName = "Takahashi"
}
for _, p := range ppersons {
	fmt.Println(*p)
}
// {Taro Takahashi}
// {Hanako Takahashi}
// {Ichiro Takahashi}
```

### 意外と初期化しなくても使えるものたち
- sync.Mutex
- sync.WaitGroup
- errgroup.Group
- スライス

※ nilのmapは追加するとpanicするが、nilのスライスはappend可能

```go
var slice0 []int
fmt.Printf("%#v\n", slice0) // []int(nil)
slice0 = append(slice0, 0)
fmt.Printf("%#v\n", slice0) // []int{0}

slice1 := []int{}
fmt.Printf("%#v\n", slice1) // []int{}
slice1 = append(slice1, 0)
fmt.Printf("%#v\n", slice1) // []int{0}
```
モダンな開発環境をすこしずつ作ってみたい。（Neovim）

webエンジニアになって間もない。以前は物理的なインフラをいじったり、デスクトップアプリを作っていた。それぞれいろんな文化があると思うが、webエンジニアのいう「モダンな環境」を僕もつくりたい。
謎の勢力の「え、できるwebエンジニアはみんなこうだけど」という圧力に押されて、そしてなにより、そんな自分の手に馴染んたツールを使いこなしているエンジニアがかっこいいと思ったから、そんな環境を少しずつつくっていきます。
とりあえず以下の環境を整えたいんだけど、今日はNeovim
 - Neovim
 - fishシェル
 - iTermの設定
 - tmux

## neovimのインストール
かんたん。macOSのコンソールで、以下のコマンド実行し完了。
`#　brew install neovim`

これでとりあえずNeovim自体は使えるようになるので、以下のような感じでファイルが開けることを確認してみる。
`# nvim test.rb`

## ちょっとした設定
 - ターミナル上でTrueColor（24bitカラー）が使えるようにしておきましょう。

早速`nvim ~/.config/nvim/init.vim`で設定ファイルを開いていただき・・・

```~/.config/nvim/init.vim
set termguicolors
```

 - ターミナル上に行数が表示されるようにしておきましょう。
 
```~/.config/nvim/init.vim
set number
```

## 操作の練習
ほとんどvimと同じだろうと思っている。
私も駆け出しvimmmerなので、基本的な操作しかできない。けど慣れると楽しい。
とりあえず以下のことはやってみた。
 - コンソールから`vimtutor`実行して練習する。
 - ドットインストールの「vim入門」を受けてみる。https://dotinstall.com/　
 

##　その他
web開発なら最低限これは必要だろ・・・というプラグインなどありましたらご教示ください。><
Oracle Linux7.4 + Oracle 12.2 EE Non-pdbをvirtualboxに速攻作成

Oracle Linux7.4 + Oracle 12.2 EE Non-pdbがvirtualboxに簡単に作成できます。
楽すぎて感動したのでシェア。
shakiyam, TakashiOshikawa
ありがとう!!

#1.Vagrantインストール
https://qiita.com/TakashiOshikawa/items/d2fb48d59e9e316af9a2

#2.vagrant-oracle12.2 setup
vagrant-oracle12201_database.zipをdownload
https://github.com/shakiyam/vagrant-oracle12.2
適当な場所に解凍

#3.Oracle12.2 EE installerを配置
linuxx64_12201_database.zipを解凍
解凍するとdatabaseディレクトリができる
さっきの適当な場所と同じディレクトリに配置

#4.Non-pdbにレスポンスファイル編集
dbca.rsp編集
createAsContainerDatabase=false
numberOfPDBs=0
pdbName=

#5.Setup
DOSコマンドで任意の場所に移動
vagrant up

#6.sshで接続
しばらくするとOracle Linux7.4 + Oracle 12.2 EE Non-pdbがvirtualboxにできあがる
DOSプロンプトが戻ってきたらDOSからssh接続できる
vagrant ssh

#7.タイムゾーン変更
sudo timedatectl set-timezone Asia/Tokyo
rspecでDeviseのログイン機能を使用する方法

# 概要
Webサービスのログイン処理にDevise使用しています。その際、ログイン後の処理をrspecでテストするためにどうすればよいか分からなかったため、調査した結果を記載します。

# 手順
[参考にしたサイト](https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara)

① 事前準備をする。

```ruby:spec/rails_helper.rb
・・・
include Warden::Test::Helpers
・・・
Rspec.configure do |config|
　 ・・・
　　config.include Warden::Test::Helpers
　　・・・
end
```

② FactoryGirlでテスト用のモデルを作成する。

```ruby:spec/factories/user.rb
FactoryGirl.define do
  factory :user do
    email "admin@gmail.com"
    password "1234567"
  end
end
```

③ *login_as*を使用して、テストを行う。

```ruby:spec/requests/management_spec.rb
require 'rails_helper'

describe "management" do
  let(:user){ create(:user) }
  context "Get admin_path" do
    it "Response is 200." do
      # ログインする。
      login_as(user)

      get admin_path
      expect(response).to have_http_status(200) 
    end
  end
end

```
UnsafeMutableRawPointerの中身が解放されない。。。


# Swiftバージョン

```terminal.txt
$ swift --version
Apple Swift version 4.0.2 (swiftlang-900.0.69.2 clang-900.0.38)
Target: x86_64-apple-macosx10.9
```

# 結論

UnsafeMutableRawPointerの *deallocate(bytes:, alignedTo:)* メソッドを呼んでも
*initializeMemory(as\:, to\:)* メソッドでバインドしたインスタンスは解放されない。

回避策として、一旦 *UnsafeMutablePointer\<T\>* に変換してから、こちらのメソッドを通して解放する

解放されないコード

```解放されないコード.swift
voidPointer.deallocate(bytes: MemoryLayout<Foo>.stride, alignedTo: MemoryLayout<Foo>.alignment)
```


解放されるコード

```解放されるコード.swift
// UnsafeMutabeRawPointerをUnsafeMutablePointerに変換しています
let opaque = OpaquePointer(self.voidPointer)
let fooPointer = UnsafeMutablePointer<Foo>(opaque)

// UnsafeMutablePointerを通して解放すると問題なく解放される
fooPointer.deinitialize(count: 1) //ただしこれがないとだめ
fooPointer.deallocate(capacity: MemoryLayout<Foo>.size)

```


# 詳細

## 解放されないコード.swift

[[gist] 開放されないコード](https://gist.github.com/ysn551/76096a9be589d20034e78893bcb47669#file-not_releasing_memory-swift)


```解放されないコード.swift
class Foo {
    // 呼ばれない
    deinit {
        print(type(of: self), #function)
    }
}

class Main {
    var voidPointer: UnsafeMutableRawPointer
    init(voidPointer: UnsafeMutableRawPointer) {
        self.voidPointer = voidPointer
    }

    deinit {
        print(type(of: self), #function)

        // ここでFooインスタンスを解放しているが、解放されない
        voidPointer.deallocate(bytes: MemoryLayout<Foo>.stride, alignedTo: MemoryLayout<Foo>.alignment)
    }
}

do {
    let f = Foo()
    let fp = UnsafeMutableRawPointer.allocate(bytes: MemoryLayout<Foo>.size, alignedTo: 1)
    fp.initializeMemory(as: Foo.self, to: f)
    let _ = Main(voidPointer: fp)
}
```

## 解放されるコード

[[gist] 解放されるコード](https://gist.github.com/ysn551/76096a9be589d20034e78893bcb47669#file-workaround_program-swift)

```解放されるコード.swift
class Foo {
    // 呼ばれる
    deinit {
        print(type(of: self), #function)
    }
}

class Main {
    var voidPointer: UnsafeMutableRawPointer
    init(voidPointer: UnsafeMutableRawPointer) {
        self.voidPointer = voidPointer
    }

    deinit {
        print(type(of: self), #function)

        // UnsafeMutablePointerへ一旦変換してから解放する
        let opaque = OpaquePointer(self.voidPointer)
        let fooPointer = UnsafeMutablePointer<Foo>(opaque)
        fooPointer.deinitialize(count: 1) 
        fooPointer.deallocate(capacity: MemoryLayout<Foo>.size)
    }
}

do {
    let f = Foo()
    let fp = UnsafeMutableRawPointer.allocate(bytes: MemoryLayout<Foo>.size, alignedTo: 1)
    fp.initializeMemory(as: Foo.self, to: f)
    let _ = Main(voidPointer: fp)
}

```
【聴講メモ】Developers Festa Sapporo 2017

2017年11月10日(金)に開催されたDevelopers Festa Sapporo 2017を聴講してきました。

#**JavaOne 2017 フィードバック～今後のJava開発・運用のために知っておくべき事総まとめ～**

伊藤　敬(日本オラクル株式会社)

---

2017/10/1～2017/10/5までサンフランシスコで開催されたJavaOne 2017の内容についてのお話し。
こういうクラスができてとかいう技術的な話しはほとんどなく、リリースサイクルとかオープン化な話が多かった。
Javaから離れて結構久しいので、何か軽量化されるぐらいしか知らなかったんですが、半年後にはJava10がリリースされるとかいう話しは結構衝撃的。

##**Java SE 9**

####**▼過去最多の機能追加**
20(Java7)→55(Java8)→91(Java9)
リリースが延びたのも要因の1つだそう...

####**▼リリースモデルの転換**

**従来**
・OpenJDKとOracleJDKに機能差分がある
　私、これ聞くまでOpenJDK自体知りませんでした...

・機能リリースは2年に1度(ただし目標)

・それぞれの機能リリースごとの長期サポート
　Java8まではおおむね8年サポートしてるんだそう

・更新リリースは3か月ごと
　セキュリティパッチに加えて限定的機能更新も含まれていたそう

**これから**
・OpenJDKとOracleJDKに機能差分をなくしていく
　すぐにではなく徐々に的な雰囲気

・機能リリースは6か月に1度(固定)
　リリース日は決めて、そこに間に合った機能を載せていくイメージ
　次出るバージョンはJava10→11→12のナンバリング
　18.3→18.9→19.3と西暦年+月の組み合わせにしてたのが最近方針転換されるらしい

・長期サポートはOracleJDKのみ
　ここの話が、最近Javaから離れている自分にはよく理解できなかった。
　長期サポート(LTS:Long Time Support)は、6か月ごとの機能リリースではなく、その中の特定のリリース(おおむね3年ごと)が対象となると認識しました。
　それのスタートが2018年9月で、次の長期サポートターゲットが2021年9月ということらしい。
　商用利用で頻繁にバージョンアップをしたくない企業向けなんですかね...

・更新リリースは3か月ごと
　セキュリティパッチのみで機能更新は含まない

####**▼転換期故の弊害**
**公式アップデート終了はJava10より9の方が早い**
Java8：2018.9
Java9：2018.3
Java10：2018.9

今Java8を使っている場合は、次のターゲットは10にした方が良い

####**▼その他**
**Java8から後継バージョンへの自動更新は行われない**

**Java SE9の32bit版バイナリの提供予定はない**
官公庁への影響は大きいだろうとのこと(実際説明に行って叱責を受けることが多いそう...)

**jlinkを利用したパッケージングとデプロイ**
　クライアントに入っているJREに依存しないアプリを作れるんだそう
　(Developers Festaなんだから、こういう話しをもっと聞きたかったですね...)


##**Java EE 8**

**▼JavaEEが抱える問題点**
・軽量でない
・業界トレンドとのギャップ

**▼Eclipse Foundationへの移管**

Oracleはもう関わらないというわけではなく、仕様策定の主管をEclipse Foundationへということ。

Eclipseでの開発プロジェクト名はEE4J(Eclipse Enterprise for Java)

##**Other**

**▼fn.project.io**
Java対応のFaaS(Function as a Service)
いわゆる、Oracleのサーバレスプラットフォームのようです

**蛇足**

じゃんけんでTシャツいただきましたw
Mサイズで自分には若干小さかったので妻へのプレゼントとなりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70897/99d1fcc9-53f1-3780-47c0-5dabf9ee22a8.png)


#**The State of Serverless Computing**

西谷　圭介(アマゾン ウェブ サービス ジャパン株式会社)

---

[昨年](https://qiita.com/nvtomo1029/items/2e442f54da642ed09f6c)に続いての聴講。
序盤でサーバレスとは？に簡単に触れ、後はアーキテクチャパターンについての実用的なお話しでした。
西谷さんが使っていた、スライドが暗くなって、指し示した一部分だけが明るくなるアイテムが気になって途中から話半分でしたｗ

##**サーバレスとは？**

**コンピューティングの進化の中、未だ残る制限**
物理サーバー
↓
仮想サーバー(オンプレ)
↓
仮想サーバー(クラウド)

と進化していく中で、サーバーの管理業務からは解放されていない

**サーバーは管理しない方が簡単**
ファンクションは短命
なので
・サーバレスはよりセキュア
・コストを抑えられる
　アイドル時の支払いなし
　ただし、実行回数の分は掛かる(コスト効率はいいが、何でもかんでも安くなるわけではない)

**サーバレスは管理業務からの解放**

##**アーキテクチャーパターン**

・Web Application
・Backends
・Data Processing
　→一番使われるパターン(RealTime、MapReduce、Batch)
・Chatbots、Amazon Alexa
・IT Automation
　→一番ハードルが低い(CIなど)

##**ベストプラクティス**

[The Twelve-Factor App （日本語訳）](https://12factor.net/ja/)

この中からいくつか出てきましたが、印象に残ったのは
・ステートレス
・開発/本番で一致した状態

この話の流れでLambdaについての技術的なお話し
・FUnctionのコンピューティングリソース設定
　メモリ設定の見極めが肝心

・コールドスタートとウォームスタート
　安定的にリクエストが来ていれば最初しかコールドスタートは発生しない
　コールドスタートのスピードを許容できないのであれば、Lambdaは正解ではない(使うな)

##**アンチパターン**

**▼AWS Lambda + RDBMS**

・コネクション数の問題
・VPCコールドスタートの問題
・DynamoDBを使うべし

**▼IP固定したがり問題**

**▼Serverless != Monitorless**
・監視はちゃんとしよう

#**IoT 時代を生き抜くエンジニアに必要な技術とは**

松下　享平(株式会社ソラコム)

---

こちらは[別記事](https://qiita.com/nvtomo1029/items/067de72412e8d3de706b)にまとめました。

以上
小さいデータセットでChainer語義曖昧性解消しようとしたら苦しかった話

# Chainerで語義曖昧性解消
大学の研究で語彙曖昧性解消を行う際、Chainerには苦しめられた。
そのあたりが今後誰かやるときに同じ苦しみを味わわないようにするためにシェア。

# そもそもデータセットが小さい

SemEvalのデータセットを使い学習させた際、
もちろん学習はきっちりやったつもりではあるが、
どうしても

```console
IndexError: index 342 is out of bounds for size 209
```

といったエラーに苦しめられた。

これはどうやらデータセットのサイズが大きいものを使うと解決する問題。
特に辞書のサイズが小さくなってしまう(数百語程度)ようなデータセットを使うのはおすすめしない。
ts-node で実行時に tsconfig.json の paths(alias) 設定が効かない

## 環境

### ディレクトリ構造

```bash:tree
 .
├── index.ts
└── helpers
    ├── foo.ts # {foo: ...}
    └── bar.ts # {bar: ...}
```

### 依存インストール

```bash
yarn add -D typescript ts-node
yarn run tsc --init
```

### TypeScript 設定

`helpers/foo`という感じでインポートできるようにこんな感じに設定。(この辺の設定について |> [TypeScriptでaliasなパスでmoduleをimportできるように](https://qiita.com/nju33/items/cf924f7b6bb513bef8a2))

```json:tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "helpers/*": ["helpers/*"]
    }
  }
}
```

### 確認ファイル

```ts:index.ts
import {foo} from 'helpers/foo';
import {bar} from 'helpers/bar';
```

こんな感じで、`yarn run ts-node index.ts`とすればできる…ハズだった。

## なんかできない

```bash:stderr
Error: Cannot find module 'helpers/foo'
```

## ググる

おー、[tsconfig.json/paths not working with ts-node](https://github.com/TypeStrong/ts-node/issues/138#issuecomment-269760415)というイシューがありました。

とりあえずこの[tsconfig-paths](https://www.npmjs.com/package/tsconfig-paths)っていうの使ってみる…

```bash
yarn add -D tsconfig-paths
yarn run ts-node -r tsconfig-paths/register index.ts
```

**ﾀｰｰﾝ**！！？！？！！！！？！😇

解決しました。
cron+retry+DBで地獄を見た件。

# 概要
アプリケーションにおいてそこで実装された機能の処理とcronにおいてデータベースの更新をすると、処理がかぶり、デッドロックが起こる場合がある。そうして負けた方のロールバックに巻き込まれてデータに不整合が起こるといった件で地獄を見たので共有。

# 起こった要因

#### ロックしている時間が長い

大量のINSERTをする+実行計画がindexである場合など様々スロークエリの状況が揃った場合に起こりやすくなっている。

#### Insertをした時にretryの処理を入れている(特にcron側)

あまり良くないとわかっていてもシステムを落とさないでしっかり動作させるためにこの処理入れているところもあるのではなかろうか。これが地獄を見た主たる原因。

# 改善策

- SQLの実行計画の改善 => 処理の時間を短くすることでかぶる確率を下げる
- cronの頻度を減らす　=> 上記に同じ。かぶる確率を下げる
- retryをしない => 処理を落とさないためにその他施策を打つ必要はある

# データがどういうことになってしまったか

アプリ側でINSERTなどをテーブルA, B, Cをロックしているとする。
その後、cron側がテーブルAとテーブルCをJOINしてSELECT->INSERTしに行こうとする。
しかしこの時、アプリ側でDBをロックしているのでROLL BACKが走る。
この時にリトライなどの処理を入れてしまうと、テーブルBのみINSERTされるといった現象が起きてしまう。ただ、INSERTはされているので、アプリの処理の書き方によっては、正常終了とみなされる。

|処理|テーブルA|テーブルB|テーブルC|
|:---:|:---:|:---:|:---:|
|cronの処理|アクセス不可||アクセス不可
|アプリの処理|ロック|ロック|ロック
Nim の変数名スタイル

# 本日は

Nim の変数名スタイルのお話です．Nim IN ACTION 本を買ってみました．

# Nimのスタイルは

- [Nim Enhancement Proposal #1 - Standard Library Style Guide](https://nim-lang.org/docs/nep1.html)

から引用すると

> Type identifiers should be in PascalCase. All other identifiers should be in camelCase with the exception of constants which may use PascalCase but are not required to.

となっています．つまり下のコードの通りです．

```nim
# Constants can start with either a lower case or upper case letter.
const aConstant = 42
const FooBar = 4.2

var aVariable = "Meep" # Variables must start with a lowercase letter.

# Types must start with an uppercase letter.
type
  FooBar = object
```

# Identifiers in Nim are style insensitive

そして Nim IN ACTION に記述されていたことなのですが，
camelCaseとsnake_caseの書き方，例えば，
`aVariable` と `a_variable` が同一視されるようです．

```nim
when isMainmodule:
  var myString : string = "Hello"
  echo my_string
```

`my_string` が定義されていないとコンパイラから怒られそうですが，実は通ります．
`echo my_string==myString`　の実行結果は `true` になります．

でも基本的には camelCase スタイルが勧められています．ナンジャラホイ．将来的にスタイルが変わるかもしれないことを見越しての設計なのかもしれないですね・

そして

```nim
when isMainmodule:
  var 変数 : string="文字"
  echo 変数
```

と日本語を変数名としても使えるようです．確かPython３もできましたね．
URLSessionにつまづく

# オリジナルクラスでURLSession周りにつまづく
全てを事前準備されたViewControler.swiftで完了する時は楽だった。つまるところ密結合は楽だった。

## JSON形式データのダウンロードは共通要素
NASA APIは複数のAPIが用意されているけれど、「API URLを指定してJSON形式データのダウンロード」はいずれも変わらない。

なので、API URLを引数にJSON形式データを戻り値にした関数（または類似の分け方）を作ろうと考える。

## URLSessionDownloadDelegateで怒られる

試しと新規classを作成してURLSessionDownloadDelegateを付ける。

```swift
class TestClass: URLSessionDownloadDelegate {
}
```

すると、

**Type 'TestClass' does not conform to protocol 'NSObjectProtocol' Do you want to add protocol stubs?**

と怒られる。`Fix`ボタンをクリックすると、大量の`func`が追加されて１つ１つがわからなかった。

[参考にさせていただいたページ](http://joyplot.com/documents/2016/09/30/swift-urlsession-progressbar/)では、これらの`func`が無くても大丈夫そうなので、わたしの書き方に不足があるのだろう。


## 非同期処理はイメージが難しい

基本的にプログラムは上から順に流れることしかしてこなかった。非同期処理は終わらずに次々進んでいってしまうことから、順番にこなした時は監視する必要があるのだろうか。

URLSessionでタスク開始時、進行中、終了時のそれぞれで呼び出される`func`が用意されている。しかしこの間、URLSessionに処理を要求した側は、タスク終了を待って進む必要がある時は、タスク終了を監視するのだろうか。

###### 最初から一気に外部クラス・外部関数に分けるのではなく、結合度を気にせず動くものを作ってから、少しずつ結合度を下げるのが身の丈に合ってるか。

# 環境
* Xcode Version 9.1 (9B55)
* Swift version 4.0.2
* macOS歴 一ヶ月弱

いつからSwiftが4.xになっていたのだろう。。。
MessengerパターンにPrismを使用する際に注意すること

# はじめに

私はWPFアプリを書く際、Messengerパターンの構築にPrismの`EventAggregator`を使用するのですが、ちょっとハマったので共有します。

# コード例

以下のコードは、私の環境ではうまく動作しません。

（Prism.Core以外に、ReactivePropertyを使用しています。）

・ViewModel

```csharp:_MainWindowViewModel.cs
using System;
using Prism.Events;
using Reactive.Bindings;

namespace WpfApp1
{
    public class _MainWindowViewModel
    {
        // Viewへのリクエスト
        public EventAggregator HelloRequest { get; }
        
        // ボタンの動作
        public ReactiveCommand HelloCommand { get; }

        public _MainWindowViewModel()
        {
            HelloRequest = new EventAggregator();
            HelloCommand = new ReactiveCommand();

            // ボタン押下時、Viewへリクエストを発行する。
            HelloCommand.Subscribe(_ => HelloRequest.GetEvent<PubSubEvent>().Publish());
        }
    }
}
```

・Viewのコードビハインド

```csharp:MainWindow.xaml.cs
using System.Windows;
using Prism.Events;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // ViewModelの初期設定
            var viewModel = new _MainWindowViewModel();
            DataContext = viewModel;

            // リクエストが発行されたら、MessageBoxを表示する
            var hello = "Hello, Prism!";
            viewModel.HelloRequest.GetEvent<PubSubEvent>().Subscribe(() => MessageBox.Show(hello));
        }
    }
}
```

・View

```xml:MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="200">
    <Grid>
        <!-- メッセージを表示するボタン -->
        <Button Content="Hello"
                Command="{Binding HelloCommand}"/>
    </Grid>
</Window>
```

実行後、ボタンを押下してもメッセージが表示されません。

# 原因

知識不足により私には詳しく分からないのですが、ポイントはViewのコードビハインドに記述されたこの部分です。

```csharp:MainWindow.xaml.cs
// リクエストが発行されたら、MessageBoxを表示する
var hello = "Hello, Prism!";  // ローカル変数にする
// ここのラムダ式がGCに回収される！
viewModel.HelloRequest.GetEvent<PubSubEvent>().Subscribe(() => MessageBox.Show(hello));
```

ここのコールバックのラムダ式がガベージコレクションにより回収されてしまいます。
その理由は、Prismの`EventAggregator`がコールバックを弱参照しているからです。
これにより、イベント購読側でメモリリークは起きなくなりますが、上述のようなコードを書くと早すぎる回収が発生してしまうようです。
（ローカル変数`hello`ではなく、文字列を直接指定すると正しく動作しました。ラムダ式の変数束縛に関係があるのでしょうか？）

# 対策

対策は簡単です。

```csharp:MainWindow.xaml.cs
// リクエストが発行されたら、MessageBoxを表示する
var hello = "Hello, Prism!";
// 第2引数にtrueを指定する
viewModel.HelloRequest.GetEvent<PubSubEvent>().Subscribe(() => MessageBox.Show(hello), true);
```

上記のように`PubSubEvent.Subscribe()`の第2引数に`true`を指定することにより、コールバックを強参照させることができます。
メモリリークには充分注意しましょう。

# まとめ

Prismの`EventAggregator`はコールバックを弱参照することを頭の片隅に覚えておきましょう。
以上です。
iOS11でPageViewControllerの現在のページが取れない時の対処法

以前は `pageViewController.childViewControllers.first` で現在のページがとれていたと思うのですが、iOS11.1 でとれなくてはまりました。

一応、対処法を見つけたのでメモしておきます。

```swift
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {

        DispatchQueue.main.async {
            if !completed { return }

            let currentVC = pageViewController.childViewControllers.filter {
                !previousViewControllers.contains($0)
            }.first

            // currentVCつかった処理をかく
        }
    }
```
Tracのチェックボックスがすごく便利

課題管理システム [Trac](http://trac.edgewall.org) で、課題を検索するときの条件において、チェックボックスで「ステータスがクローズである」といった検索条件を指定できる。このチェックボックス群に隠れた便利機能があるのを紹介したい。

# TL;DR

https://trac.edgewall.org/wiki/TracQuery の checkbox に関する記述を紹介する。
実際の動作は、たとえば [Trac-hacks](https://trac-hacks.org/query?owner=matobaa&status=closed) で試すことができる。

----

1. フィルタ行のラベル (=「ステータス」という文字) をクリックすると、全選択・全選択解除できる。
2. フィルタ行のラベル (=「ステータス」という文字) をAltクリックすると、チェックボックスの状態を反転できる。
3. フィルタのチェックボックスをクリックすると、そのチェックボックスをトグルする (通常のチェックボックスの動きと同じ)
4. フィルタのチェックボックスをAltクリックすると、そのチェックボックスにチェックし、それ以外のチェックボックスをクリアする。

## 使い方の例

- 「closed以外」を条件としたければ、ラベルをクリック(全選択)し、closed をクリック(チェックを外す)してから 検索
- 「closed以外」を条件としたければ、closed を Altクリック(= closedのみを選択) したあと、ラベルをAltクリック(全部を反転)してから 検索

# あとがき

- わかりにくい……けど慣れるとすこぶる便利。
- Excelのオートフィルタでも「全部を反転」したかった。
- Excelのオートフィルタだと、チェックボックスをダブルクリックすると決定してくれる。
機械学習論文読みメモ_102


[Conditional Image Generation with PixelCNN Decoders](https://arxiv.org/abs/1606.05328)
PixelCNNに基づいた条件付き画像生成手法を提案する．
このモデルはベクトルで表現可能な任意の情報で条件付けが可能である．
例えばImageNetで与えられているクラスラベルで条件付けした場合に，
それに関連した物体を生成することが可能になる．
また今まで見たことのない顔画像で条件付けした場合には，
その顔に関して異なった表現，ポーズ，イルミネーションの画像が生成される．
従来のPixelRNNと比較してLSTMであるようなGate構造を取り入れたCNNを今回用いた
事によりRNNに頼る事なく高性能を達成した．

[Variational Dropout Sparsifies Deep Neural Networks](https://arxiv.org/abs/1701.05369)
Dropoutのベイズ版であるvariational dropoutについて考える．
元々variational dropoutは，variational lower boundに対してparameterization trickを
用いてガウスノイズを持つ微分可能なモデルでモデル化した時に，それにより推定される
サンプル毎損失の共分散が全体損失の分散へ有意に寄与する事から，その共分散がゼロ
となるようのモデルを利用するlocal reparameterizationを用いるアイデアに基づく．
Dropoutでも似たように確率的に0掛けのノイズを与える手法になっているが，
このノイズ連続値的に扱い事前分布や変分損失を定義する事でベイズ的な解釈をする．
本論では，この時のdropout rateが不明である場合に，
Evidence variational lower boundを最適化する過程で導出可能である事を示す．
結果得られるdeep networkはスパース化されたものが自然と現れてくる事となる．
この現象はempirical bayesに対してautomatic relevance determinationを適用した
場合と似た現象である．
これによりモデルの圧縮が精度を落とさずに可能になる．

[A Unified Multi-scale Deep Convolutional Neural Network for Fast Object Detection](https://arxiv.org/abs/1607.07155), ECCV2016
高速なマルチスケールの物体検出手法としてmulti-scale CNNを提案する．
このモデルはproposalネットワークとdetectionネットワークの2つから成り立つ．
Proposalネットワーク内の異なった層からdetectionを行い，それによりマルチスケールのdetectionを実現する．
bitbucket.orgでは同一のSSH公開鍵を複数のアカウントに登録できない

SSH公開鍵を登録しようにも、

> 既に登録されている SSH 鍵です。

と表示され登録できません。
でもアカウントの何処を探しても登録されている形跡がありません。そもそも登録されてるなら何で使えないんだ？

`$ ssh -T git@bitbucket.org`

試しにSSHでログインしたら別のアカウント名が表示され、本記事タイトルが原因だと気付きました。登録していたアカウントを思い出してログインして該当鍵を削除したら問題無く登録できました。これってどのアカウントに登録したか思い出せなかったら結構面倒なんじゃないか。

# [追記]何故同一のSSH公開鍵を複数のアカウントに登録できないのか

`$ git clone git@bitbucket.org:project.git`

上記のようにbitbucket.orgとSSHで認証する際に渡す情報は以下の3つ

- ユーザ名（git）
- リポジトリ名
- 鍵

であり、個人のアカウントを識別する情報が鍵しか無いため、必然的に鍵とアカウントは一対一で対応する。ということでしょうか。
セキュリティ上の理由なのかなー？って思ってましたが、仕組み上そうならざるをえないみたいですね。

# 参考記事
- [同一端末上でBitbucketの複数アカウントを使い分ける](https://qiita.com/muran001/items/c268f0ee1f7efbc23e1c)
- http://blog.clock-up.jp/entry/2015/02/20/git-ssh-account-switch
- https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB
[baidu echarts] 棒グラフのラベルをカスタマイズする方法


![](http://aifan.jp/wp/wp-content/uploads/2017/11/double11_time.png)


```
option = {
    ...

    series: [
        {
            name: '売り上げ',
            type: 'bar',
            stack: '总量',
            label: {
                normal: {
                    show: true,
                    position: 'top',
                    formatter:function(obj){
                                var rmb = obj['value'];
                                rmb = rmb.toFixed(0);  
                                var jpy = rmb * 17;
                                return rmb + " (" + jpy +" 億円" + ")";
                            }
                }
            },
            data: [16, 100, 200, 300, 500, 700, 750]
        },
    ]

}
```


# 参考
http://aifan.jp
2017ダブル11（中国独身の日）の売上数字を見る


昨日（ **2017年11月11日** ）は、
中国のインターネット通販市場において **最大の商戦日** である「 **ダブル11（中国独身の日）**」でした。

その売り上げをいろんな数字や角度から見ていきたいと思います。

## トータルの売り上げ

トータル **2539.7億元 （約４兆３４２５億円）**　驚愕の数字に達成！

## 各インターネット通販サイトのシェア

![](http://aifan.jp/wp/wp-content/uploads/2017/11/double11_share.png)


## アリババ(Tmall)の数字
### (1) 売り上げ遷移
わずか **10秒**で **16億元** (約 **270億円**)
**３分**で **100億元** (約 **1700億円**)
**40分** で **500億元** (約 **8500億円**)

![](http://aifan.jp/wp/wp-content/uploads/2017/11/double11_time.png)


### (2) 省（日本の「県」に該当する）の売り上げランキング
#### No.1 广东省
#### No.2 浙江省
#### No.3 江苏省
#### No.4 上海
#### No.5 北京
#### No.6 山东省
#### No.7 四川省
#### No.8 湖北省
#### No.9 河南省
#### No.10 福建省
#### No.11 湖南省
#### No.12 安徽省
#### No.13 河北省
#### No.14 辽宁省
#### No.15 江西省
#### No.16 陕西省
#### No.17 重庆
#### No.18 广西壮族自治区
#### No.19 云南省
#### No.20 山西省

### (3) 都市の売り上げランキング

#### No.1 上海
#### No.2 北京
#### No.3 杭州
#### No.4 深圳
#### No.5 广州
#### No.6 成都
#### No.7 武汉
#### No.8 重庆
#### No.9 苏州
#### No.10 南京


### (4) 店舗の売り上げランキング

#### No.1 蘇寧(苏宁易购)；
#### No.2 小米；
#### No.3 荣耀；
#### No.4 HAIER(海尔官方旗舰店)；
#### No.5 NIKE；
#### No.6 UNIQLO(优衣库官方旗舰店)；
#### No.7 Sharp；
#### No.8 Adidas；
#### No.9 林氏木業(林氏木业家具旗舰店)；
#### No.10 Midea(美的官方旗舰店)。




## 参考
http://aifan.jp/2017ダブル11（中国独身の日）の売上数字を見る/
https://www.weibo.com/1956700750/FuvAvdjyx?type=comment#_rnd1510459717446
http://www.ebrun.com/20141112/115019_4.shtml
「現場で役立つシステム設計の原則」がとても勉強になったのでまとめてみた ~ １章 ~

## システム設計の原則知ってますか？
この記事は「現場で役立つシステム設計の原則」を読んで勉強になったことや仕事で役に立ちそうなことをまとめた記事です。
あくまでまとめで、説明できなさそうなところは省いているのできちんと理解したい人は本を読んでください！

[現場で役立つシステム設計の原則](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E5%8E%9F%E5%89%87-%E5%A4%89%E6%9B%B4%E3%82%92%E6%A5%BD%E3%81%A7%E5%AE%89%E5%85%A8%E3%81%AB%E3%81%99%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%8A%80%E6%B3%95-%E5%A2%97%E7%94%B0-%E4%BA%A8/dp/477419087X)

## この本を書いた方
著者は増田亨さんという方で、ドメイン駆動設計も用いたアプリケーション設計・開発をやられている方です。
スライドシェアにもドメイン駆動設計関連のスライドがたくさんありました。

[増田さんのスライドシェア](https://www.slideshare.net/masuda220)


## 第１章「小さくまとめてわかりやすくする」

### ソフトウェアの変更が大変な理由
- ソフトウェアの修正や変更で副作用が出たり、予期せぬ問題が出るのは設計(=ソースコード)に問題があるから
- 変更が大変なプログラムは３つの特徴がある
  - メソッドが長い(理解が大変)
  - クラスが大きい(変更時の影響範囲の特定が難しくなる)
  - 引数が多い(変更時の影響範囲の特定が難しくなる)
- ちょっとの修正が重なることで全体が複雑になる。

### プログラムの変更を楽にする書き方
-  わかりやすい名前を使う
    - 略語や一致しない名前の使用を避ける

```java
// Bad
int a; 
int qty;
return qty * up;
```

```java
// Good
int quantity;
return quantity * unitPrice;
```

- コードのまとまり(処理のまとまり)ごとに空白行を入れる
- 目的ごとに変数(= 説明用の変数)を用意する(破壊的代入((破壊的代入とは１つの変数を使いまわし代入を繰り返す書き方のこと))を避ける)

```java
// Bad
int price = quantity * unitPrice; // 数量x単価

if (price < 3000)
  price += 500;  // 送料

price = price * taxRate(); // 税込み金額
```

```java
// Good
int basePrice = quantity * unitPrice; // 数量x単価

int shippingCost = 0; // 送料
if (basePrice < 3000)
  shippingCost = 500;

int ItemPrice = ... // 税込み金額
```

- メソッドとして独立させる（メリットは以下）
  - 変更の影響をメソッド内に閉じ込めやすくなる
  - 詳細をメソッドに記載するので呼び出し元のコードが綺麗になる
  - メソッドの名前からコードの意図を理解しやすくなる

```java

int basePrice = quantity * unitPrice; // 数量x単価

int shippingCost = shippingConst(basePrice) // 送料計算を別のメソッドに切り出す

int shippingCost(int basePrice) {
...
}
```

- 異なるクラスの重複したコードをなくす
- 業務の関心ごとに対応したクラス（ドメインオブジェクト）を作る
  - 例えば、送料に関することは送料クラスにまとめることで変更の対象や影響範囲をそのオブジェクト内に限定できる


### 小さなクラスでわかりやすく安全にする
- 業務で扱う値は基本データ型で扱う値と一致しないことがある
  - 例えば、業務では単価は1億円まででも、intを使うとマイナス21億円からプラス21億円まで扱うことができてしまう
- 業務的に正しい値を扱えるように独自のクラス(値オブジェクト)を作成する((値を扱うための専用のクラスを作るやり方を値オブジェクトと言います))ことで異常な値を防ぐことができる
  - 例えば、数量に特化したQuantityクラスや電話番号に特化したTelephoneクラスを作成することで異常な値を防ぐと同時にコードの意図も明確にすることができる
- 値オブジェクトを不変にする(別の値が必要になったら別オブジェクトを作成するようにする)
  - 変数の上書きは予期せぬ副作用を呼ぶ可能性があるため
- 型を使ってコードをわかりやすく安全にする
  - 型を利用してコンパイラに間違いを見つけてもらう

```java
// Bad
int amount(int unitPrice , int quantity) {
... // unitPriceとquantityの渡す順番を間違えてもコンパイルエラーにならない
}

// Good
Money amount(Money unitPrice, Quantity quantity) {
... // unitPriceとquantityの渡す順番を間違えるとコンパイルエラーになる
}
```

### １章まとめ
- コード整理の基本は名前と段落にあり
- 短いメソッド、小さなクラスでコードを整理しよう
- 値オブジェクトを使ってわかりやすく安全にしよう
- クラス名やメソッド名を業務の用語と一致させるとプログラムがわかりやすくなり、変更もやりやすくなる
Swift3でAPI Keyを隠したかった

様々な方法が見つかるが、いずれも一長一短で決め手になる方法はなかった。

## 現時点では：API Keyのみが書かれた独立したSwiftファイルに格納

グローバル変数になるが、Dictionary<Key, Value>型で秘密情報を格納する。

```
himitu = [ "key name" : "key value" ]
```

### メリット

* IDE管理下で扱えるファイル。

* 第三者から見えない（らしい）。

### デメリット

* .gitignoreを忘れると無意味になる。

---

以下、よく見かけた方法。

## 環境変数に格納

様々な秘密情報を扱うようになると、後々管理するのが大変になりそう。特に、PCを買い替えた時に忘れそう。

### メリット

* ローカル環境の環境変数に秘密情報を格納する方法で、Xcode（他のIDE含む）と相性が良さそう。

### デメリット

* 環境変数に秘密情報を格納しなければならない。

## plistに格納

公開予定はないが将来はいつも未定のため避けておきたい。

### メリット

* コードからの扱いが楽そう。

### デメリット

* [第三者から丸見えになる。](https://qiita.com/Saayaman/items/c50000e6103358c8c4d6#comment-d518cbe570693cab32bb)

---

※はてなブログからの引越し記事
Amazon Connect で非通知電話ではなく、番号通知で電話をかける方法

2018/12/13　解決済みなのを確認しました。
日本リージョンの 0120電話からも発信者を通知して電話をかけられます。

2018/02/23も未解決なのを確認済み

2017/11/29　AWSの中の人に聞いたところ、日本で番号が通知されない問題は、年内に解決されないんじゃないかとのことでした。

Amazon Connect 本当に日本語のドキュメントが少なくて大変ですね。
参考記事
https://qiita.com/miTsuKow/items/2ec4feec6dc6bc7d6c8b


別サイトに電話をかけるボタンを埋め込んで、そこから電話をかけるためには、
CCPのURLを jsファイルにに書く必要があるのですが、"CCP"ってなに? となってしまう人もいるでしょう。

CCP とは、
[![Screenshot from Gyazo](https://gyazo.com/918c59cade00344afc223f942c2f0598/raw)](https://gyazo.com/918c59cade00344afc223f942c2f0598)
この電話マークを押すと出て来るポップアップのことです。

それさえわかれば、割りとすんなり実装できるのではないでしょうか？

さて、一番困った点は、非通知でしか電話が掛けられないことです。
AWSのサポートから電話をかけてもらう時は、番号通知済みで電話がかかってくるのに、なんでConnect からかけると電話がかかってくるのかどうかわからなかったのです。

これをサポートに問い合わせると、オレゴンとアメリカ国内では、番号を通知して電話をかけられるそうです。
しかし、オレゴン　日本、　シドニー　日本、の間では出来ないそうです。

設定には、相手の電話に表示させる番号とOutbound caller ID nameを（これで本当に相手に
自分の名前が通知されるかわからないけど）が選べるようになっていますが、これが特定リージョンとキャリアによっても無効か有効かが変化するそうです。

そもそも、ナンバーディスプレイというのは、掛ける方の電話会社とかかってくる方の電話会社が相互に連携をしていないと、成立しないものです。したがって、Amazon のサポートが使っている電話会社と、Conecct で使っている電話会社が違うので、番号通知がうまくいかないということだそうです。

非通知で電話をかけるコールセンターは怪しまれるでしょうから、問題だと思ってます。
誰かアマゾンの太い御客さんのひとは、東京リージョンで使えるようにしてほしいと要望していただきたいです。東京リージョンから日本にから発信するなら、番号を通知して発信できるでしょう。

（追記）
この問題をアマゾンのサポートに聞くと、
Oct 28, 2017　01:59 PM +0900　に問い合わせして、回答が来たのが、
初回の回答はすぐに来ました。最終的に意味ある回答が来たのが。
Nov 13, 2017　01:57 PM +0900　に回答が来ました。
現在、シアトル本社には、AmazonConnectの専門部隊がいるのかもしれないと、AWS日本の方がおっしゃっていました。
暫くの間は、英語で問い合わせると良いと思います。
URLSessionのメモ

Xcode 9.0.1でインターネットからダウンロードするときに使うコードのテンプレート。
doを使う処理との違いが分からないが、DispatchQueueを使うほうがダウンロードが完了しているため都合が良かった。


```Swift
func getDataFromInternet(url urlString: String) -> Void{
    let url = URL(string: urlString)
    let task = URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
        DispatchQueue.main.async(execute: { () -> Void in // 通信が完了したときに呼び出される
            if ((error) == nil) {
                // ここにダウンロードしたデータの処理を書く
            } else {
                // エラーが発生したときの処理を書く
                print("Error \(error?.localizedDescription)") // 未確認コード
            }
        })
    })
    task.resume()
}
```

---
※はてなブログからの引越し記事
TypeScriptとwebpackとthree.jsでexamplesを使う

# 背景
three.jsには、examplesと称して便利なクラスが用意されています。
例えば、`OBJLoader`と呼ばれる.objファイルを読み込むことのできるクラスなどがあります。
https://threejs.org/docs/#examples/loaders/OBJLoader

なぜかわかりませんが、npmモジュールとしてthree.jsを取り込んだ場合、examplesの中のクラスは取り込まれないようです。
しかし、@types/threeには定義されている・・・。
なんとか使いたい・・・！

そこで、imports-loaderで解決しました。

# imports-loaderとは
モジュールをimportするときに、同時に定義しておきたいパラメータをいい感じに定義してくれるやつです。
たとえば、以下のようなモジュールがあった時、`global`にjQueryが定義されていないと死ぬでしょう。

```js:caller.js
import $ from "jQuery";
import sample from "./sample";
sample(); // -> エラー！！！！
```
```js:sample.js
module.exports = function() {
  $("foo").trigger("click");
}
```

webpackの場合、いい感じにモジュールを隠蔽してくれるので、通常、上記のモジュールではjQueryにアクセスできません。



そこで、imports-loaderがいい感じに変換してくれます。

```js:caller.js
// ここが重要！
import sample from "imports-loader?$=jQuery!./sample.js";
sample();
```

↑のような呼び出し方をしておくと、以下のようにjQueryを定義して使えるようにした上でexportしてくれます。
`import [読み込みたい何か] from "imports-loader?[事前に定義しておきたい変数名]=[変数を定義するためのモジュール名など]![読み込みたいファイル].js"`
たぶん、Bootstrapなど、jQueryを事前に定義しておく必要があるモジュールを読み込む時に威力を発揮するような気がします。


```js:converted-sample.js
var $ = require("jQuery");
module.exports = function() {
  $("foo").trigger("click");
}
```

# three.jsで使う
OBJLoaderの実装を確認すると、以下のようになっていました。

```js:OBJLoader.js
THREE.OBJLoader = function() {
....
...
```

つまり、すでにglobalにTHREEが定義されているものとして実装されています。
ならば、imports-loaderが使えそうです。

```js:caller.js
// OBJLoader ".js"まで必要！
import "imports-loader?THREE=three!three/examples/js/loaders/OBJLoader.js";
import * as THREE from "three";

new THREE.OBJLoader();
// do something.
```

こんな感じで出力されていました。

```js:bundle.js
...
/*** IMPORTS FROM imports-loader ***/
var THREE = __webpack_require__(0);

/**
 * @author mrdoob / http://mrdoob.com/
 */

THREE.OBJLoader = ( function () {
...
```

以上です。よろしくおねがいいたします。
忙しい人向け睡眠時間を増やさずに睡眠不足を解消した方法

今回は、システム全然関係ない記事です。
睡眠時間慢性的に足りない状態でなんとか工夫して、ある程度睡眠不足を解消した話です。**忙しい人にとって、睡眠時間なんて対して増やせないはずなので睡眠効率を良くしよう**というコンセプトです。
# きっかけ
ここ最近、**睡眠時間をさほど増やさずに寝不足を昔ほど感じなくなりました**(ゼロではないですが、改善程度)。睡眠方法を変えたことが原因なようです。
私の場合は、食洗機を買ったことが睡眠方法を変えるきっかけでした。食洗機を有効活用すべく下記のようにやることを変え、料理とその調理器具洗いを朝にすることにしました。

|夜/朝|変更前|変更後|
|:--|:--|:--|
|夜|夕飯食事<br>食器洗い<br>翌日の食事料理<br>調理器具洗う|食事<br>食器洗い(食洗機)<br><br>|
|朝|<br>朝食食事<br>食器<br>|当日の食事料理<br>朝食食事<br>食器・調理器具洗う(食洗機)|

そのため、早寝早起き型にしたのですが、それによって寝不足をそこまで感じなくなりました。これがきっかけで、睡眠の本を読み、睡眠効率向上に取り組みました。今回はそのメモです。
本は[「スタンフォード式 最高の睡眠」](http://amzn.to/2iOtAbl)を参考にしています(すごくいい本です！)。
#基本の考えと最重要事項
人間は睡眠時に深部体温(体の中心)と皮膚体温の差が少ないらしいです。**深部体温と皮膚体温の差を近づけることが寝付きをよくする条件で、差を広げることが寝起きをよくする条件**です。
また、**寝付いてから90分が睡眠が回復等に最も効果的**なので誰にも邪魔されないようにすることが重要です。筆者は、息子の寝かしをしながらついつい寝て、1時間後に起きて家事をするなど多かったので、この点はできるだけないように改めました。

# 取り組んでいること(取り組む予定含む)
## 寝る前
### 1. 風呂に入るのは寝る90分前(またはシャワーを寝る前)
風呂に入るを寝る90分前にするのが寝付きを良くする秘訣だそうです。必ずできることではないですが、心がけています。90分より寝る直前になってしまうなら、ぬるま湯に浸かるかシャワーの方がいいそうです。

### 2. 寝る前までは足を温める
寝る前までは靴下等で足を温めておくといいようです。ただ、寝るときは靴下脱いだほうがいいみたいです。
私は、冬になったらやろうと考えています。

### 3. 寝る時間を固定する
よく言われていることですが、就寝時間は固定した方がいいのは確かなようです。もし、**仕事などやることがあれば、(就寝時間を遅くせずに)早起きして調節**。これは、試してみてすごく実感。早起きは確かにつらいのですが、そちらのほうが昼のパフォーマンスがいいような気がします。また、**前倒しで早く寝るのは、寝付きが悪くなりやすいので避けたほうがいい**ようです。

## 起きる時・起きた後
### 1. 起きたい時間の20分前に目覚ましをかける
起きたい時間の20分前に目覚ましをかけることで起きやすくなりました。朝は浅い睡眠と深い睡眠を繰り返しているので、起きたい時間の20分前に目覚ましをかけて、その時点ですっきりしていれば起きます。気づかなかった場合、またはつらかったら、次の目覚ましで置きます(20分あれば浅い睡眠に移行しているようです)。

### 2. 光を浴びる
太陽でなく家のライトでもいいので光を浴びると目が覚めやすいようです。起きたら窓をあけて(電気をつけて)光を浴びましょう。

### 3. 体温をあげる
(夏はどうだかわかりませんが)起きた後に体を温めるといいようです。私は冬でも暖房つけないこと多かったのですが、暖房使ってみます。

### 4. 裸足で行動する
冬はつらいですが、試してみようと思います。足から刺激を受けることで体が覚醒するようです。

### 5. 手を冷たい水で洗う
朝、手を冷たい水であらうことで、覚醒するようです。朝風呂はおすすめしないのだが、シャワーはおすすめのようです(水シャワーでなくてOK)。
PHP5.6から7への変更点に見る、コーデイング上の私的注意事項メモ

そろそろPHP7が来る（仕事的に）頃合いかなと変更点を読んでいたら色々思うところがあったのでメモ。
自分で思ったことのメモ書きのため、変更点のすべてをカバーしているわけではありません。

# Error（誤り）じゃなくException（例外）

エラーや例外の取り扱いの変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.error-handling

間違っている（Error）わけじゃない。ただこのシステムでは対応していない（Exception）というだけなのだ！

こういう考え方いいよね。

# 仕様に依存したあいまいな記述はやめよう

やりたいことははっきり書く。具体的に言えば括弧でくくる。

変数やプロパティ、メソッドへの間接的なアクセスの扱いの変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect

global は単純な変数だけを受け付ける
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.variable-handling.global

yield が右代入演算子に
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.yield

# 直観的に混乱するようなものはやっぱりやらないほうがいい

やがて消されるから。

list() の取り扱いの変更 
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.variable-handling.list

Switch 文に複数の default ブロックを書けない
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.multiple-default

JSON 拡張モジュールが JSOND に置き換わる
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.json-to-jsond

非互換のコンテキストからの呼び出しの削除
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.incompatible-this

非 static メソッドに対する static 呼び出し
http://php.net/manual/ja/migration70.deprecated.php#migration70.deprecated.static-calls

# 配列のloopは参照のみと心得て、元の配列をどうにかしようとするときはそれ用の手続きを取ること

foreach の変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.foreach

なお、loop内でloop元の配列に変更を加えると、

* 処理が遅くなる（らしい）
* なにやってんだかわかりづらくなりコードのリーダビリティ上よくない

ので、これは以前から気をつけていたことのため、なにかに勝った気分


# 0除算はうっかりだってしないもの

ゼロ除算の挙動の変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.integers.div-by-zero

# 型の扱いは丁寧に

動的型付け言語だっていってもそこに甘えず気をつける。16進数と、10進数・文字列を、ごちゃまぜに扱わない

文字列の取り扱いの変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.strings

# 自分のコードの書き方は常にupdateしていこう

新しい書き方のほうがかっこいいってのもある

新しいオブジェクトを参照渡しで代入できない
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.new-by-ref

PHP 4 形式のコンストラクタ
http://php.net/manual/ja/migration70.deprecated.php#migration70.deprecated.php4-constructors


# グローバル化進んでるなあ…

タイムゾーンとか言語とか

# そろそろPHPでも型宣言する時代が来た

戻り値の型宣言
http://php.net/manual/ja/migration70.new-features.php#migration70.new-features.return-type-declarations

基本的にはいい話。
ただこれで生産性がどこまであがるのかあるいは下がるのか、ちょっとわからないなと思うところはある。
異なる型の戻り値を返すような処理を書いていた場合、どの段階でエラー出してくれるんだろう？（ドキュメントがあるみたいだけど読んでない）

# Closure流行ってる？　

* オブジェクトを継承しまくるのが古い時代来る？
* ふるまいを親クラスに持たせ、それを子クラスで継承して、一部の定義だけ書き換えというコーディングをよくやっていたんだけど、これ、処理の一元化とかコード数を減らすのには便利だったんですけど、外（処理の呼び出し元付近）から見たときに親までさかのぼらないとなにやってるかわかりづらいのが不便だったんですよね。
* オブジェクトに定義だけを持たせ、objectの使い方（ふるまい）はClosureで定義して実装するっていう感じになるのかな。

# その他

* 宇宙船演算子（spaceship operater）という名前が猛烈かっこいい
 * 中二的な意味で
 * だけど実際のところこれ使うと読みにくくならないかが心配
* Null合体演算子
 * ようこそ、君を待っていた
* define() を用いた配列定数の定義
 * ようこそ、君を待っていた（その２）

全体的にはなんだかよさげな変更が多くて楽しみです。
同じ内容の処理でもかっこよく書けるとテンション上がりますよね。
React Nativeで「Error: Process exited with non-zero code: 163」が出たときの対応について

React Nativeでビルドしようとして、なんどもエラーでできなくて悔しかったので。

このエラーが発生したときの手順として、
・iPhone Simulatorの「Hardware」→「Erace All Content and setting」をクリックしてSimulatorを再起動する
・パッケージマネージャを再起動する(Ctrl+Cで止めて、再度動かす）
という手順が紹介されている。
そして、これらの手順は正しい（Simulatorのエラーが原因）のだが、
Xcodeの再インストール（アップフレード）の最中、Simulatorが起動したままになっていると
Xcodeのエラーで正常にSimulatorが起動しなくなることがある。
その場合には上記の手順では問題は解決しません。

・「Simulator」→「Quit Simulator」
・Xcodeを終了する
・Xcodeを起動する
・コマンドラインツールから、再度npm startする
の手順を行うことで、問題は解決します。
MYSQLの遅いクエリ（スロークエリ）を探る

mysqlの負荷対策を勉強している。

ある人はこうおっしゃってた。
「サーバーをどれだけ増やそうが、クエリやプログラムの組み方が雑だと無意味だ」
と。

#負荷の高いクエリを探り、修正していく

centosにログイン。

vim /etc/my.cnf を設定

```
[mysqld]
#sloqqueryログをオンに
slow_query_log = ON//クエリを取得
long_query_time = 10//10秒以上かかるクエリを保存
log_output = TABLE//MYSQLにテーブルとして保存
```


MYSQL 再起動。

```
systemctl restart mysqld
```

すると、mysql DB の slow_log テーブルにどんどん記録されていく。



#MYSQLの負荷が高くなった場合の対応

高負荷は 9 割方 DB 操作に起因
クエリ数の削減
クエリの見直し
インデックスの見直し
ロック範囲の見直し
デッドロック時はリトライ
やむを得ず重いクエリを流すならキャッシュする


#安いサーバーを増やすのか高いサーバーを増やすのか
月額10万円のサーバー8台で運用していたのが、
20万円のサーバーだと3台で運用できるなんてこともある。


#DB分割すると面倒なことも多い

単一DB
・DBからテーブルをSELECTするだけ

DB分割後
・グローバルDBからSELECT
・対象ユーザーIDのデータがあるDBからSELECT
・複数のユーザーDBからSELECT
Realm Swift版の導入(iOS用サンプル起動まで)

# 開発環境

- Mac OS 10.13.1
- XCode 9.1
- iOS 11.1
- Swift 4.0.2
- RealmSwift 3.0.2

# 手順

以下のサイトからSwift版Realmをダウンロードして解凍する。

https://realm.io/docs/swift/latest/

サンプルのXCodeプロジェクトを開く。  

```
realm-swift-3.0.2/examples/ios/swift-4.0.2/RealmExamples.xcodeproj 
```

サンプルのターゲットを選択して、シミュレータで実行する。

![realm01.png](https://qiita-image-store.s3.amazonaws.com/0/37449/8f0aaf6c-edd1-4231-2b9d-9c0a8d22b25e.png)

# サンプル一覧

- BackLink: 逆方向の関連のサンプル
- Encryption: 暗号化のサンプル
- GroupedTableView: グループ化されたテーブルのサンプル
- Migration: マイグレーションのサンプル
- Simple: 単純なサンプル
- TableView: テーブルのサンプル
Riot.jsのイベントオブジェクトに入ってくるitem

Riotタグ内でイベントハンドラを仕掛けた場合、普通のイベントオブジェクトに加えて`item`というメンバが入っていることがあります。

# ループ時の対応

以前、Riotの`each=`で配列を管理していたときに、[途中で飛ばすとインデックスがずれる](https://qiita.com/jkr_2255/items/4de028229c6a03c3d0b2)という問題が起きたのですが、その過程で、「`each`内部で回したものが、イベントオブジェクトで取れる」ことが判明しました。

# `e.item`の中身

回し方によって、入ってくるものが違います。

* `each={arr}`のように、変数名指定なしの場合…`e.item`自体が`arr`の要素として入っていたオブジェクトになる
* `each={item in arr}`のように値だけ取る形にした場合…`e.item.item`に配列の要素が入る
* `each={item, i in arr}`のように値と順番を取るようにした場合…`e.item.item`に配列の要素、`e.item.i`に**回した分だけの**インデックスが入る

なお、値はシャローコピーなので、配列の要素が配列などオブジェクト型だった場合、イベントハンドラ内からそのまま破壊的に変更することで、元の配列要素を変更することも可能です。

# イベントセットの方法

`e.item`がセットされるのは、ネイティブで`addEventListener`した場合には動かず、タグ内で`on***={}`のようにした場合に限られます。`on***`でセットできないカスタムイベントの場合は、使えないということになります。

# 子タグからの駆動

よくあるパターンとして、「特殊な入力フォームをRiotで作って、それを親タグで使う」というようなものが考えられます。ネイティブで`change`イベントが発生するような状況の場合、子タグ自体に`onchange`を仕掛けておくと、バブリングで上がってきた分もRiot経由で処理して、`item`が入ります。

一方で、子タグのJavaScriptコードで値を書き換えたような場合、`change`イベントは発生しませんので、同様な動作を期待するのなら[自力で発生させる](https://qiita.com/jkr_2255/items/1a9347ad2535991ec0ca)必要があります。
pythonを初めて触った。（fizzbuzz）

某AIプログラミングの体験会で、初めてpythonを使ったのでそのときのメモです。
qiita投稿もこれが初めてです。

## 問題
1〜１００までの値が与えられたとき、3で割り切れる場合は「fizz」、5で割り切れる場合は「buzz」、15で割り切れる場合は「fizzbuzz」と表示し、それ以外の数字はそのまま表示するプログラムを作ってください。

## 実装
python2.7.10で、こんな感じで実装しました。ifの条件は上から処理されていくので、最初に15で割り切れるかどうかの判断をしないといけませんね。elifってなんか違和感あります。。

```python:fizzbuzz.py
  1 num = 1
  2 while num < 101:
  3     if num % 15 == 0:
  4         print "fizzbuzz"
  5     elif num % 3 == 0:
  6         print "fizz"
  7     elif num % 5 == 0:
  8         print "buzz"
  9     else:
 10         print num
 11     num = num + 1
```
## 学び
- python初めて触ったけど書きやすくて面白い。
- pythonでは「インデント」をつかうことで処理するブロックの範囲を表現している。インデント大事。
- if条件は上から順番に評価される。
- qiitaの書き方が分かりました！