OmniAICreator/Qiita-1.07M huggingface dataset:
iOSのApp内課金で「このアイテムは利用できなくなりました」となる現象の対処法

今までアプリ内で販売していたApp内課金のアイテムが、購入しようとすると「このアイテムは利用できなくなりました」と表示されるようになった。

1. 他のアイテムは購入可能。
2. iOS側の「支払い」のポップアップは表示される。
3. 支払いを行うと何故か「このアイテムは利用できなくなりました」となる。
4. アプリのバージョンアップ後に起きるようになった。(これは現象の必須条件ではないかも)

この条件の場合、該当アイテムをAppStoreConnect上で非公開→公開の手順でやると、エラーが解決する場合があるようです。
（少なくとも弊社ではこれで解決しました。）

2018/9/29に起こった出来事だが、非公開処理及び公開処理はそれぞれおよそ30分程度でAppleの課金APIにも反映されていました。
つまり、概ね1時間あれば試せます。

既にAppleのレビューが終わっているアイテムであれば、特に申請も必要ないため、同じようなトラブルに直面した人は参考にしてみてください。
【将棋AI】「将棋AIで学ぶディープラーニング」を読む♪～将棋AIを強くするために

<img width="200" style="float: left;" alt="将棋AIで学ぶディープラーニング" src="https://qiita-image-store.s3.amazonaws.com/0/233744/ded117b9-37c7-1b41-033d-960e63ca5fe1.jpeg">
第廿五夜は、将棋AIを強くするにはどうすればいいかを考察します。
###やったこと
（１）将棋AIの性質から考える
（２）Gikou2と対戦する
###（１）将棋AIの性質から考える
そもそも将棋AIの強さは以下の４点が重要である。
①評価関数の精度
②実行速度
③初期盤面における定跡利用
④詰将棋

本書では以下のことが取り上げられている。
①【評価関数】Networkモデルをチューニングして強くする
②【評価関数】PolicyとValueを同時学習により学習効率を上げる
③【評価関数】学習する棋譜をカスタマイズして最適化する
④【実行速度】処理を並列化する
⑤【実行速度】UCT探索の工夫
⑥【実行速度】実行速度の速い言語（C++)にする
⑦【詰将棋】詰み探索の導入
⑧【評価関数と定石】強化学習
ウワンの実力から言って、①から③はここで取り上げたが、④以降はすぐに実行するにはちょっと難しい。
そこで、④の並列化は本書ダウンロードサイトからアプリをもらって利用することとし、さらに実行速度を上げることは難しいので持ち時間を大幅に増加して、さらに探索深さをなるべく大きな値にするということでどこまで強くなるかを実施してみた。
###（２）Gikou2と対戦する
Gikou2のソフトレーティングは、読みの深さで調整できて以下の参考ページで公開されている。そしてイロレーティングで見たようにだいたいレート差２００だと勝負になることから、Gikou２のDepth１違うとレート差がほぼ２００程度となっていることから強さを見るのに都合がよい。
【参考】
・[コンピュータ将棋 まとめサイト](https://www.qhapaq.org/shogi/)
実は、ここに並んでいる将棋ソフトはほとんどC言語で書かれている。
C言語とPythonの速度差は以下の参考によると、だいたい１５倍程度の差がある。
逆に言うと、１５倍持ち時間を与えれば速度差は吸収される可能性がある。
【参考】
・[色々な言語で計算速度を比較してみた](https://qiita.com/hanada/items/c91788bcac2a40f1bb05)
ということで、持ち時間を長くして（最大１時間程度）かつ探索深さを１００００にして対戦してみた。
####Gikou2 D1  1512 +17/-9  
![GikouL1vsTry.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/8f4a8c9d-1863-6715-7f77-1da606a5df89.jpeg)
####Gikou2 D2  1799 +12/-9 
![Gikou2D2vsTry.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/cac3f33d-da8a-3e3e-dc08-850e348fad9f.jpeg)
####Gikou2 D3  2001 +12/-12
![Gikou2D3vsTryp.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/552b9240-9005-6bec-84fe-8416dd70541d.jpeg)
![Gikou2D3vsTry10000Condi.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/288ff261-4f45-b77f-b325-5b0a1e3d78ab.jpeg)
####Gikou2 D5  2187 +14/-13
![Gikou2D5vsTry10000R.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/a4f2b265-7848-8963-8d82-42101db58543.jpeg)
![Gikou2D5vsTry10000.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/78ff4990-866a-87b1-679e-b467f61c8540.jpeg)
ちなみに、[Gikou2D5の強さについてはこういう強さ(技巧２と私)](https://www.evernote.com/shard/s696/sh/29dba55e-9db4-41b2-81ea-17e042ad2c28/40398c64d1c0e86ac66f9ba8dc4b76ac)だそうです。
探索深さは上記は１００００の結果だが、３００００まで増加してやってみたが、あまり向上しなかった。
###まとめ
・将棋AIの強さのポイントをまとめた
・速度向上はスキル的に難しいので、持ち時間を長くして10000探索局面（playout）に増やしてGikou2とDepthを変えて対戦した
・だいたいレーティング１８００程度だと見える

・探索局面がほぼ同一なら、評価関数レベルではGikouと同様なレベルになったかもしれないが確証はない
VBAのちょっとしたこと

ちょっとした機能なんですけと、忘れちゃうので登録していきます。
# メニューバーを追加
オリジナルのメニューを追加したい

```vb
:Module1
'メニュー追加
Sub AddMenu()
  Dim popUpMenu As CommandBarPopup
  Dim buttonMenu As CommandBarButton
  With Application.CommandBars("Worksheet Menu Bar")
    Set popUpMenu = .Controls.Add(Type:=msoControlPopup)
    popUpMenu.Caption = "ドキュメントツール(&T)"
     
    'オリジナルメニュー作成
    Set buttonMenu = popUpMenu.Controls.Add
    With buttonMenu
       .Caption = "全シートの選択セルをA1へ(&I)"
       .OnAction = "SelectedA1Cell" '←ここに実行するSUBを設定
       .BeginGroup = False ' メニューの前に区切り線を付けるかどうか
       .Style = msoButtonCaption
    End With
End Sub
```
こんな感じ
メニューバー[アドイン]>オリジナルメニュー
![menu.jpg](https://qiita-image-store.s3.amazonaws.com/0/296251/2e3aa6f5-5a74-0090-2168-098f9fa23e0e.jpeg)

# 全シートの選択セルをA1へ移動
ブック内のシートをすべてA1セルへ移動させるの面倒なので作りました。

```vb:Module1
' 全シートの選択セルをA1にする
Sub SelectedA1Cell()

    Dim s As Worksheet
    With ActiveWorkbook
        For Each s In .Sheets
            s.Activate
            Application.Goto Reference:=ActiveWindow.ActiveSheet.Range("A1"), Scroll:=True
            ActiveWindow.Zoom = 100 '←表示倍率を100％にする時はこれ
        Next s
        .Sheets(1).Activate
    End With
    
End Sub
```
# メニューバーを削除
オリジナルのメニューを削除したい

```vb
:Module1
' メニュー削除
Sub DeleteMenu()

    Dim userMenu As CommandBarControl
    With Application.CommandBars("Worksheet Menu Bar")
        For Each userMenu In .Controls
          userMenu.Delete
        Next
    End With
    
End Sub
```
Rubyの2次元配列の要素追加と削除方法

２次元配列に関して学んだのでメモ

### 配列とは
```ruby:sample.rb
elements = ["UCLA","UCB","UCSD","UCSF","MIT"]
```
複数のデータをカンマで区切って変数に格納できる。

## 2次元配列とは
```ruby:qiita.rb
elements = [["UCLA","UCB"],["UCSD","UCSF","MIT"]]
```
配列の中にさらに配列が入っている形を二次元配列と呼ぶ

## ２次元配列の指定方法
```ruby:qiita.rb
elements = [["UCLA","UCB"],["UCSD","UCSF","MIT"]]
puts elements[0][0]
=> UCLA
puts elements[1][2]
=> MIT
```
elements[0]でひとつめの配列を指定し、elements[0][0]で指定した配列内のひとつめの要素を指定している。


## 値の追加方法：push
```ruby:qiita.rb
elements = [["UCLA","UCB"],["UCSD","UCSF","MIT"]]
elements[0].push("Harvard")
p elements[0]
=> ["UCLA", "UCB", "Harvard"]
```
追加したい配列を指定して、pushメソッドで追加可能。　elements[0] << "Harvard"　という記述でも可能なので、こっちが簡単か。

## 削除方法：delete_at()

```ruby:qiita.rb
elements = [["UCLA","UCB"],["UCSD","UCSF","MIT"]]
elements[1].delete_at(1)
p elements[0]
=> ["UCLA", "UCB"]
```
ちょっとトリッキーかもしれない。elements[1][1].delete_at、みたいに記述してもエラーになるので、上記のように指定する必要がある。
各種言語別　Hello World!出力一覧　　(適時更新予定)

```
python3.x系の場合:

print("Hello World!")
_____________________
python2.x系の場合:

print "Hello World!"
_____________________
javaの場合:

import java.util.*;

public class Main{
    public static void main(String[] args) throws Exception {
        System.out.println("Hello World!");
    }
}
_____________________
PHPの場合:

<?php
echo "Hello World!";

?>
_____________________
Rubyの場合:

puts "Hello World!";

または

print "Hello World!";

_____________________
Goの場合:

package main
import "fmt"
func main(){

    fmt.Println("Hello World!")
}

_____________________
javascriptの場合:

process.stdin.resume();
process.stdin.setEncoding('utf8');

var hello = "Hello World!";
console.log(hello);

または
console.log("Hello World!");
_____________________
C#の場合:

public class Hello{
    public static void Main(){
        
        System.Console.WriteLine("Hello World!");
    }
}

_____________________
Swiftの場合:

print("Hello World!")

_____________________
Rの場合:

cat("Hello World!")

_____________________
Cの場合:

#include <stdio.h>
int main(void){

        printf("Hello World!");
}
_____________________
C#の場合:

public class Hello{
    public static void Main(){
        
        System.Console.WriteLine("Hello World!");
    }
}
_____________________
C++の場合:

#include <iostream>
using namespace std;
int main(void){

    printf("Hello World!");
    
    return 0;
}
_____________________
luaの場合:

print("Hello World!")
_____________________
Cobolの場合:

IDENTIFICATION DIVISION.
program-id. Hello.
procedure division.

display "Hello World!".
_____________________
Elixirの場合:

IO.puts "Hello World!"

_____________________
Haskellの場合:

main = putStrLn "Hello World!"

_____________________




```
Ruby on Rails ページネーション

実装する時に調べましたが、情報が散っていたので自分用にまとめておきます。

# 環境

**`AWS Cloud9`**
**`ruby 2.4.1`**
**`rails 5.1.4`**

# Gemの設定

使用するライブラリは、
**`will_paginate`**
**`bootstrap-will_paginate`**
**Rails Tutorial**にて紹介されていたので採用しました。
他には**Kaminari**とかもページネーションとしては情報が多いです。

`Gemfile`に追加します。

```ruby:Gemfile
gem 'will_paginate',           '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'
```

追加したら`$ bundle install`を実行します。

# Controllerの設定

`モデル名.paginate`でページネーションを扱えました
インスタンス変数に代入しています。

```ruby:users_controller.rb
def index
  @users = User.paginate(page: params[:page])
end
```

## ページ毎の件数を指定したい

デフォルトでは30件のようです。
引数に`:per_page`オブションを追加することで設定できました。

```ruby:users_controller.rb
def index
  # ２０件毎に表示したい場合
  @users = User.paginate(page: params[:page], per_page: 20)
end
```

# Viewの設定

ページネーションを表示したい**view**で下記を設定して完了しました。

```erb:index.html.erb
<%= will_paginate @users %>
<!-- 下記でも表示された　-->
<%= will_paginate %>
```

```ruby
# 下記のエラーが発生する場合は、サーバーを再起動することで症状が改善されるかもしれません。
undefined method paginate
```

## ラベルを日本語化したい

設定していないと、ラベルが英語表記になるので、必要なら日本語化します。
`config/environment.rb` に以下を追加すると、設定を上書きできます。

```ruby:config/environment.rb
# 記号（ < と > ）も入るので不要なら消す。
WillPaginate::ViewHelpers.pagination_options[:previous_label] = '&lt 前へ'
WillPaginate::ViewHelpers.pagination_options[:next_label] = '次へ &gt'
```

個別に表示したい場合は、直に記述も可能です。
一部のビューのみ変更したい場合に使えそう。

```erb:index.html.erb
<%= will_paginate @users, previous_label: '&lt 前へ', next_label: '次へ &gt' %>
```

---

`i18n`の設定を`:ja`にしているなら`locals`ファイルで設定することもできるみたいです。

```ruby:config/application.rb
config.i18n.default_locale = :ja
```

```yml:config/locals/ja.yml
ja:
  will_paginate:
    previous_label: 前
    next_label: 次
    page_gap: …
```
[Vue.js] ブログ作ってみました

# はじめに
ブログが作りたいと思っていました。
でもWordPressやはてなブログなどの既存のもの以外で構築したいという思いがありました。
なんか方法はないかなーと思って [**Vue.js ブログ**](https://jp.vuejs.org/v2/cookbook/serverless-blog.html) でググると公式がサポートしてくれていました…さすが…。
ということで構築したので [**公開**](https://github.com/tosite0345/vue-blog) しておきます。

ちなみに作ったブログは [**こちら**](http://tosite.work/blog) です。

# 導入手順

## １．プロジェクトをクローン

```bash:console
git clone https://github.com/tosite0345/vue-blog.git
cd vue-blog
npm i
```

## ２．ButterCMSでユーザー作成
[**ButterCMS**](https://buttercms.com/) からユーザー作成を行います。
なお公開後に所定の手順を踏めばフリープランが有効になるみたいなので、私もそのうち切り替えていきたいと思います。

## ３．Vue.js側で設定ファイル記述

### APIキー設定

```js:config/dev(prod).env.js
module.exports = {
  NODE_ENV       : '"production"',
  BUTTER_API_KEY : '"your ButterCMS API KEY"',
}
```

APIキーの場所はこちら。

<img width="1318" alt="スクリーンショット 2018-09-29 15.52.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/165355/1d91f710-a2c9-77fc-a3ac-76b5ffeb4e9f.png">

### ブログタイトル修正

```js:/src/main.js
Vue.prototype.$BlogTitle = "your blog title"
```

### metaタグ修正

ブログの説明などを修正します。

```html:index.html
<head>
  <meta charset="utf-8">
  <meta name="description"      content="write your blog description.">
  <meta name="viewport"         content="width=device-width,initial-scale=1.0">
  <meta name="format-detection" content="telephone=no,address=no,email=no">
  <link rel="canonical"         href="url of your site.">
  <link rel="shortcut icon"     href="/static/favicon.ico" type="image/vnd.microsoft.icon">
  <link rel="icon"              href="/static/favicon.ico" type="image/vnd.microsoft.icon">
  <link rel="apple-touch-icon"  href="/static/favicon.ico" type="image/vnd.microsoft.icon">
  <link rel="stylesheet"        href='https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons'>
  <title>your blog title</title>
  <style>.truncate { white-space: nowrap; width: 100%; overflow: hidden; text-overflow: ellipsis; }</style>
</head>
```

## ４．ビルド

```console:bash
npm run dev
```

# 終わりに
ちょうどやってみたかったことがドンピシャでやれたのでモチベ高く開発ができました。
いろいろと修正したいところはたくさんあるので、まだまだ開発は進めていく予定です。
オブジェクト指向がn%理解できる記事まとめ

全部読めばきっと理解できる…はず。

### 話題編

- [オブジェクト指向が5000%理解できる記事](https://qiita.com/gorillab/items/b2f8e39d7cc23ad505f9)

### 理論編

- [オブジェクト指向を5000%理解できたら、次に5000兆%理解できように実社会の例でオブジェクト指向を考えてみる。](https://qiita.com/_-_-_-_-_/items/1f604f6205b8bfd8a823)
- [オブジェクト指向が5％くらい理解できればいいなという記事](https://qiita.com/aono/items/fa367f15db6d8cf20dd9)
- [魔法のように理解しようとするオブジェクト指向](https://qiita.com/mosamosa/items/30f9b3781e80fd09b188)
- [オブジェクト指向プログラミング（OOP）がちょっとわかるようになるための記事](https://qiita.com/yuu341/items/2200d870dfe093a3adfc)
- [C#のオブジェクト指向が全く理解できないのでまとめる記事](https://qiita.com/kazurego7/items/2aaabeb3ee6e4fcd7937)
- [Listもどきでほんわか理解するオブジェクト指向　カプセル化編](https://qiita.com/ikasandesu/items/a32030351ef0df823960)
- [オブジェクト指向設計とは?](https://qiita.com/mysticatea/items/4654333da4440832bd92)
- [オブジェクトの「クラス」とかいう言葉の自分なりの理解](https://qiita.com/Nao000/items/1f22275b88e328f2ff67)
- [分かりそうで分からない少し分かるオブジェクト指向プログラミング](https://qiita.com/miyabisun/items/86fabbafe0730a726a34)

#### vs 関数型

[オブジェクト指向と関数型についての自分の考え](https://qiita.com/kumagai_games/items/ca558723a016555ccf8d)
[オブジェクト指向と関数型プログラミングを100‰説明する記事](https://qiita.com/hogefuga/items/dff080173984fbbbe2de)

### 実践編

- [オブジェクト指向が5000%理解できる記事(実践編)](https://qiita.com/gorillab/items/fab2a6637f681221f687)
- [JavaScriptのオブジェクト指向が10%理解できる記事（実践編）](https://qiita.com/uhyo/items/ab8e273e1eb71d02e29a)
- [オブジェクト指向の理解を n% 深めるために実践してみた](https://qiita.com/juno-nishizaki/items/74cc93b93c42b540df04)
- [オブジェクト指向が0.005%理解できる記事](https://qiita.com/jzmstrjp/items/dfac23ed9405b1e609b1)
- [「オブジェクト指向が5000%理解できる記事(実践編)」の解答編](https://qiita.com/hiki_neet_p/items/d4624635d8baedba44c9)

### 反逆編

- [オブジェクト指向が0.05%も理解できない記事](https://qiita.com/raccy/items/58254f842788707f8c53)
- [「オブジェクト指向とは、現実世界を正しく捉えること」という理解はデメリットのほうが大きい](https://qiita.com/maueki/items/1176980026c18a6f093f)
- [オブジェクト指向はもう死んでいる](https://qiita.com/a_k_/items/e77abb14ab16692d5f8c)
- [【オブジェクト指向】自然言語を基準に設計することの問題点](https://qiita.com/dorarep/items/803b874858a961ce2a5a)
- [まだ「オブジェクト指向はこうあるべき」で消耗してるの?](https://qiita.com/gyu-don/items/09db0a298136debfe757)

---

親記事のコメント等でリンクされている、または、記事内で親記事関連をリンクしている記事、または、「○%理解」というワードがある記事を取り上げています。追加や抜けがあればコメントか編集リクエストで教えてください。
アジャイルな開発現場で感じたこと (1 ヶ月目)

今までウォーターフォールで開発してきた人がアジャイルな現場に飛び込んで感じたメモです

## こんなことをやっています

- 朝会 (デイリースタンドアップ)
- 1 週間区切りで動く (スプリント)
- 週の頭にみんなでタスクを作る (スプリント計画)
- 週の終わりに振り返り会をやる (スプリントレビュー)
- チームリーダーの会がある様子 (スクラムオブスクラム)

### スプリント

スプリントは 1 週間〜 4 週間が一般的だそうです
ちなみに上記をアジャイルではイテレーション、スクラムではスプリントと呼ぶようです

アジャイルの手法の 1 つがスクラムのようです
なのでアジャイルというよりも、スクラムと呼んだほうがより正確かもしれませんが、周りでは「アジャイル」と呼んでいるので、私も習います

### タスクを作る場所

Todo, Doing Done がわかれば何でも良いと思います
私の今いる現場は [Azure DevOps](https://azure.microsoft.com/ja-jp/services/devops/) を使っていますが [Trello](https://trello.com/) でもホワイトボードに付箋でも

## なぜアジャイル？

ここが私にとって一番重要なのですが、残念ながらまだわかっていません

顧客のニーズに合ったシステムを作るためにウォーターフォールからアジャイルになった、という背景は聞きましたが、ウォーターフォールに染まった人間としては、ヒアリングや要件定義といった単語が頭をよぎります

まだチームに参加して 1 ヶ月なので気楽に構えて今後も勉強していこうと思っています

## 良いなと感じたこと

- メンバーがそのタスクの「完成」「完了」の定義を共有できる
  + なにをもって「完了」なのかは人によって違いしますね
- タスクを細かく分割する
  + 1 つ 1 つのタスクに対してゴールを意識して仕事できます
- ペアプロ・モブプロが多い
  + 新メンバーの私にとってはシステム (開発対象) や仕事の進め方を把握しやすかったです
  + これはアジャイルに限らず、特に新メンバーにとってはありがたいかも。システム (開発対象) の流儀も早く身につけられる気がします
- 画面や DB 設計もみんなでする
  + 色々な意見が出て、結果的に不要な機能を発見できたりできます
  + 一人でやるより、単純に楽しいです
- 短い期間 (スプリント) での振り返り
  + 可能な限り早く本番にリリースできますし、達成感があります
- テストコードを書く
  + 言わずもがな

## うーん・・、と感じたこと

- スプリント計画でみんなで工数見積をする
  + どうしても見積もりが低い方に流される傾向がある気がします
  + バッファについては 1 つ 1 つのタスクは取らず、スプリント全体でバッファを取るという考えみたいですが
- face to face を重視する
  + 「情報を伝えるもっとも効率的で効果的な方法はフェイス・トゥ・フェイスで話をすることです。」[アジャイル宣言](http://agilemanifesto.org/iso/ja/principles.html)
  + なんかミーティング多いし、リモートワークしにくい雰囲気だな・・

## 良いかどうか判断つかないこと

- レビューの時間が短い
  + ペアプロ・モブプロが多いせいか、みんなで確認したから OK ね、という流れが多い気がします
  + 早くリリースできる
  + レビュワーとしてはもうちょっと色々調べたいけど期限が・・(明日とか)
- 開発工程があまり文章化されない
  + その分コーディングの時間が取れる？
  + ナレッジがたまりにくそう
- リリースサイクルが早い
  + 結合テストがちょっと粗くなりがち・・？

## 読んだ本

- アジャイルサムライ――達人開発者への道  
https://www.amazon.co.jp/dp/B00J1XKB6K/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
- カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで  
https://www.shoeisha.co.jp/book/detail/9784798153346
Gmailから日時を抽出してGoogleカレンダーに自動登録するGASのスニペット

DMM英会話の予定を忘れるので書いておいた。

日時はJSTに変換しないといけないのかなと思ったけど、連携しているGoogleアカウントのロケールで？よしなにやってくれている。

https://script.google.com/home から新規スクリプトつくって、トリガー5分ごととかにしておく。

```js
var title = "【DMM英会話】レッスン予約"; //inbox内を検索するワード
var q = "is:unread";  //必要なら未読のみとか、検索条件

function genDate(y, mo, d, h, min){
  return new Date(y, parseInt(mo, 10)-1, parseInt(d, 10), parseInt(h, 10),parseInt(min, 10));
}

function myFunction() {
  var myThreads = GmailApp.search(title+' '+q, 0, 1);
  Logger.log(myThreads);
  if(!myThreads.length)return;
  
  var myMessages = GmailApp.getMessagesForThreads(myThreads);
  myMessages.forEach(function(messages){
    messages.forEach(function(message){
      //本文中から正規表現で日時を抽出する
      var date = message.getPlainBody().match(/ご予約日：(\d{4})年(\d{2})月(\d{2})日/);
      var time = message.getPlainBody().match(/開始時間：(\d{2})時(\d{2})分/);
      
      // Creates an event
      var event = CalendarApp.getDefaultCalendar().createEvent(title,
      genDate(date[1],date[2],date[3],time[1],time[2]),
      genDate(date[1],date[2],date[3],time[1],parseInt(time[2],10)+1));

      Logger.log('Event: ' + title);
      Logger.log('Event ID: ' + event.getId());

      //不要なら既読にしちゃう
      GmailApp.markMessageRead(message);
    });
  });
}

```
初心者がIoTハッカソンに行ってみた

#0.自己紹介
どうも,みなさんこんにちは。RHEMS技術研究所の菅原です。
今回は業界未経験でプログラミング教習を開始したばかりの自分が初めてハッカソンに行った率直な感想やどういったことをしたのかを書いていきたいと思います。
#1.IoTハッカソンとは
そもそもIoTハッカソンとは?という方も多いと思いますので簡単に説明いたします。
**IoTとは?**
IoTとは「Internet of Things」の略で身近なモノをインターネットにつなげることを言います。
**ハッカソンとは?**
ハッカソンとは様々な分野の人たちがチームを作り,短い時間の中テーマにそって,サービスやシステムなどを開発して優勝を争うイベントです。
#2.ハッカソンの流れ
**オリエンテーション**(ルールやテーマなどが運営の方より話されます。)
　　　　　　　　　　　　　↓
**アイデア出し**(何個かのチームに分けてアイデアをだしあいます。)
　　　　　　　　　　　　　↓
**チーム分け**(関心をもったアイデアのもとに集まりチームを結成します。)
　　　　　　　　　　　　　↓
**アイデアソン**(チームになったあとアイデアをさらに掘り下げていきます。)
　　　　　　　　　　　　　↓
**ハッカソン**(実際に役割分担をしてアイデアを開発していきます。)
　　　　　　　　　　　　　↓
**プレゼンテーション**(各チームが作成したモノを発表します。)
　　　　　　　　　　　　　↓
**結果発表**(上位入賞チームには豪華賞品があるかも)
これらを2日間かけて行います。
※今回の流れは自分が実際に体験したハッカソンをもとに書いているのですべてのハッカソンがこの流れとは限りません。
#3.ハッカソンで使用した技術について
実際ハッカソンでは何をしたのかというとhtmlを使用してちょっとしたサイトの見た目を作りました。
**htmlとは?**
htmlとはwebページの見た目を作るときに使われるプログラミング言語です。
**実際に使うときに必要になってくるもの**
実際にhtmlを使おうとするときに必要になってくるものはhtmlのソースコード,テキストエディタになります。
**htmlのソースコードとは?**
htmlのソースコードとはwebページ内の表示や動作の命令をすることができる文字列です。自分はインターネット上でhtmlのサンプルコード(最初から完成されているソースコード)を検索して良いデザインのサンプルコードをコピーしました。
**テキストエディタとは?**
htmlのサンプルコードをコピーしても表示するものがなければ意味がありません。そこでテキストエディタというサンプルコードを作成,編集することができるソフトを使います。自分はatomエディタというものを使用しましたがテキストエディタは様々な種類がありますので気に入ったものをダウンロードしてください。
**実際にブラウザに表示する方法**
htmlのサンプルコードのコピーをatomエディタのhtmlファイルを作成して貼りつけます。そのhtmlファイルを保存します。保存したhtmlファイルをブラウザにドラッグするとhtmlが表示されます。

#4.最後に
自分は初参加ということもありかなり緊張していたのですが周りのエンジニアの方たちが優しかったこともあり楽しくハッカソンを終えることができました。
これから自分がRHEMS技研として次のハッカソンに向けてやっていこうと思っていることは様々な種類の中のどれか一つの言語をほぼ完璧に理解するということです。
ここまで読んでいただきありがとうございました。
もし,ハッカソンに興味があるけど技術に不安があるという方もやる気がある方は大歓迎だと思うのでぜひ参加してみてください。
【まつもとゆきひろ氏　特別講演】20代エンジニアのためのプログラマー勉強法  視聴メモ

Rubyの生みの親であるまつもとゆきひろさんの特別講演視聴メモ。
[【まつもとゆきひろ氏　特別講演】20代エンジニアのためのプログラマー勉強法](https://supporterz-seminar.connpass.com/event/96550/)

##学生と社会人の勉強法の違い
同一視してはいけない。

* 満点 vs 満点なし
* 苦手克服 vs 得意を伸ばす　～　得意に注力することが合理的
* 記憶 vs 把握　～　覚えておく必要はない。基本的な概念・知識のIndexを頭に入れておく
* 知識 vs インデックス
* 試験 vs 常在戦場　～　いついつまでに何を勉強するというものはない。未来に備える勉強はいつ使うのかもわからない
* 一次元 vs 多次元
* メイン vs サブ　～　勉強は学生の本分だが、社会人は稼ぐことが本業
* 間接的 vs 直接的　～　社会人の学びは直接活きる
* 安定 vs 変化　～　社会人の学びは変化する

##なぜ勉強するのか？

* 成功したい
* 高収入
* 好きなことで生きていきたい
* 良好な人間関係を築きたい

##必要なものは何か？
勉強の目的は「尊敬」

* 高評価
* 尊重される

## How to What to study

* 内省　～　自分を見つめる、棚卸
* 走り出すのは楽、走り続けるのは大変
* 走る前に考えるのは大切
* 興味があること、ないこと
* 得意なこと、苦手なこと
* 好きなことは上達する
* 好きなものに集中したほうが効果的

##パターン認識は成功の秘訣

* アメリカの成功者はパターン認識能力が高かった。過去の事例を抽象的にとらえる。
* あなたが尊敬する人は？
* パターンを探せ
* 知らない人を尊敬できない
* 知られることが大切
* 人間は本質的にミーハー、有名人に弱い
* 知名度は価値と可換
* 成功のためには有名になる必要がある

##キャズム理論
知らないものを人は買わない

* イノベータ、アーリーアダプタ、アーリーマジョリティ、レートマジョリティ、ラガード
* キャズム(峡谷)を乗り越えるには
* ニッチに進出
* 横展開
* 勉強の成果をアウトプット
* 「埋没しない」←重要

##自己紹介

* 東京に住まない
* 尊重してもらえる環境
* 従業員2000人の中堅IT企業に就職、200人中6人のCS専攻
* 埋没しない
* より下のレイヤーに　～　社内ツールを開発
* 高い裁量度
* 8割の時間をフレームワークに
* 周囲の生産性も高める
* バブル崩壊
* 閑職(窓際)へ　～　社内ツールのメンテナーになったがやることなかった
* 人間関係はよかった
* いやな仕事ではなかった
* 放置・放任
* そんだなんか作ろう
* フリーソフトウェア Ruby製作
* インターネットで公開
* 私にとっては自然、だが当時はユニーク
* ニッチに進出　～　世の中に認識される「Rubyを作った人」
* 横展開につながった　～　講演などに呼ばれるように
* 時を超えて共通　～　オープンソースコミュニティーで発生する問題解決
* 人間のふるまいについて学ぶ　～　ブログ・ツイッターにて公開
* 現在時間の半分はOSS開発、それ以外は顧問業、講演業、執筆業、イベント業
* 給与収入70%、顧問収入20%、講演収入10%
* 割が良いかではなく満足するか
* いやなことはしたくない

##あなたはどう勉強するか

* パターン認識
* 内省　～　自分に合った勉強法
* インベントリ(棚卸)　～　どちらに進むかを自分で考えなければならない
* 真剣に考える　～　自分の在庫について、何がしたいか、どう差別化するか、どこまで妥協するか、意地を張るか、住む場所、職種
* 結果的に幸いだった　～　運任せは危険
* 真剣に考えて決める
* 未来のことはわからない
* 予想は外れる
* 決めたことは変えてもよい
* 本当に考えるべきこと　～　自分の傾向、どこに向いているのか

##具体的な話

* モチベーション
* 好きなこと
* 漠然とした希望　～抱きがち
* 具体的な希望
* 暇だ、退屈だ　～　自分のやりたいことを挙げていったらどそうはならない
* 暇の撲滅
* どうやって時間を作るか　～　優先順位を考慮して
* プライベートを犠牲にしない
* 生産性を高める　～　忙しすぎない状態を維持するのがよいのでは、会社の時間で勉強できる環境を構築するのが重要。そうじゃない職場からは逃げるべき
* 就業時間中に勉強するのが原則 
* 短い時間で成果を上げる
* インプットは重要だが差別化要因にならない
* アウトプット
* ハードル高い
* 面倒
* 羞恥心
* あんなの誰でもできる　～　半分本当だが
* 心理的障壁
* はずかしい、チャンスがない
* アウトプットによる定着　～　例えば、ブログで読んでもらうところまでブラッシュアップして書く
* クオリティはとりあえず棚上げ
* アウトプットを繰り返す
* だんだん楽になる
* アウトプットの最適化
* 心理的障壁の低減
* 人間の可塑性が起きる　～　人は変われる
* 置かれた環境に合わせて変化する
* マネジメントに興味が　～　変わることはよい、会社都合はよくない
* 新しい可能性を発見した　～　アメリカの会社で退職する人のことをこう表現する
* ゆっくりだが変化する
* 予想もしない方向で


##最後のアドバイス
### 基礎を身に着ける
* コンピュータサイエンス、あまり変化しない知識

###英語を学ぶ
* 英語で情報を得る
* タイムマシン経営　～　アメリカで流行っていることを日本に導入。3年くらい時差がある。日本のIT市場は1年遅れている
* ガラパゴスを出る
* 必要なレベルで　～　読む、雑談、講演
* 語学は場数
* 完璧を目指さない　～　伝わればよい

###コンフォートゾーン
* 幸せな空間
* 成長がない
* 普段ならやらないようなことを
* 一歩踏み出す
* 変化を恐れない訓練
* 誰かを見下さない　～　コミュニケーションを取れなくなる、自分も含めて
ImportError: No module named 'dataset'

#はじめに
ゼロから作るDeepLearning(オライリー・ジャパン)という本をコードを実行しながら読み進めていたところ、エラーが発生してしまい困ったところがありました。
[以前に構築した環境で実行しました。](https://qiita.com/nakamura_hikaru/items/639204ee7c7c8cd51a90)

#エラーが出たところ
73ページにある。

```python
import sys, os
sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image
```
というコードの`from dataset.mnist import load_mnist`で

```bash
ImportError: No module named 'dataset'
```
とエラーが出ました。
親ディレクトリを参照できていないようです...
自分でもいくつか調べてみたのですが、良い方法が見つからず、
`/Users/<username>/.pyenv/versions/anaconda3-4.3.1/lib/python3.6`
の中に`dataset`ディレクトリを突っ込みました。力技にも程がある。
これだと最初の方の`import sys,os`とか`sys.path.append(os.pardir)`を書かなくても動く。

#とりあえずは動く
gitHubからダウンロードしたソースを見ると、他にも`from common.functions import *`などでエラーが起きそうなので、このあたりも同様に対処していけば、とりあえずは動くのかなと思う。
JSONのユニコードエスケープ処理にICUを使用する

#ユニコードエスケープの対応

ＪＳＯＮ形式では、GETやPOSTでWebサーバーに要求を送ると日本語の文字列は下の例のようにユニコードエスケープ処理されて返ってきます。

```:Json文字列の一部
"Type":"A10","Code":"9876","Name":"\u3053\u3093\u306b\u3061\u306f"
```

上の例にある先頭の/u3053は日本語の「こ」で16ビットのコードポイントです。5文字をあわせて「こんにちは」になります。

コードポイントをC/C++で日本語にする場合、大変高度なCの知識が必要になりコード量が増加します。これを回避するため、ICUを使います。

ICUを使えば、Web時代でのWindowsアプリケーションのプログラミングが楽になると思います。

#What is ICU?

International Components for Unicodeを略し、ＩＣＵと呼びます。ユニコードを扱うオープンソースライブラリーです。

C/C++、JAVAでこのライブラリーを利用してアプリケーションが作成できます。世界の大手IT企業がICUを利用してアプリケーションを作成しています。

これまでに広範に利用され続け、成熟された内容に進化し続けています。いまでも頻繁にアップデートされている。

#ダウンロードと環境構築

ＰＣの環境としてWindows10,Visual Studio 2017を前提にしています。

ICUのソースコードを[ホームページ](http://site.icu-project.org/download/62#TOC-ICU4C-Download)のダウンロードサイトからダウンロードします。
ICU4CがC用のソースです。
ICU4C Source Code Downloadの項目からZIP file for Windows platformsを選びます。
ファイル名はicu4c-62_1-src.zipですが、62_1はリリース番号です。
git-hubの場合、[こちら](https://github.com/unicode-org/icu)ダウンロードしてください。

ダウンロードしたら任意のフォルダーに解凍し、icuフォルダーがあるのを確認します。
そのなかにあるsourceフォルダーのallinoneというフォルダーを開き、Visual studioでソリューションファイル「allinone.sln」を開きます。開いたらリリースモードでビルドします。

ビルドが完了するとicuフォルダーの直下にlib、 binフォルダーがそれぞれ作成されます。
今度はicuフォルダーをCドライブ直下に移動させます（フォルダーの置き場所は任意の場所でOkです）。

pathを通すため、windowsの環境変数のpathの項目にc:\icu\binを追加します。

ＩＣＵを使用したいプロジェクトを作り、プロパティ→リンカー→入力→追加の依存に次のファイルを追加します。

```:追加の依存ファイル（コピペしてください）
icuuc.lib;icuin.lib
```
![linker.png](https://qiita-image-store.s3.amazonaws.com/0/139807/0a429cfe-66c2-9f58-e01a-c108ca39a8fd.png)


同じくライブラリーディレクトリにc:\icu\libとインクルードディレクトリにC:\icu\includeを追加します。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/139807/5cecb546-c972-28fd-9a3d-061b96a93554.png)


プロジェクトフォルダのソースファイル(cpp/cファイル)のある場所に以下のファイルをicuフォルダーからコピー＆ペーストします。

```:以下のファイルをプロジェクトフォルダーにコピペする

icuin62.dll
icuuc62.dll
icudt62.dll
```

#Coding with C

今回はCにてユニコードのコードポイントからCString型に変換します。

```c:Coding_With_C
// Visual C++ の　CLR、 CLR empty projectで作成。
// Visual　StudioからMFC関連のAPIを導入してください。

#include <atlstr.h>
#include <unicode\unistr.h> // ICUのヘッダーを追加する。

int main() {

//　WEBサーバーからのJSON形式のレスポンスの一部。(constにはできない文字列。)
	char src[] = "\"Type\":\"A10\",\"Code\":\"9876\",\"Name\":\"\\u3053\\u3093\\u306b\\u3061\\u306f\"";
	char separator[] = "\\u"; //区切り文字をセット。
    char dq[] = "\"";
	char targetWord[] = "Name\":\""; // ターゲットとなる項目の文字列を選ぶ。
    char* pSrc = NULL;
	char* gotWord = NULL;
	char* answer = NULL;
	char* token = NULL;
	char temp[256];
	icu::UnicodeString uniStr;
	CString strCstr;
	HWND hWnd = NULL;

	pSrc = strstr(src, targetWord); // ターゲットの文字列の先頭にポインターを移す。
	pSrc += strlen(targetWord); // ターゲット項目の文字列の数だけポインターをずらす。
    gotWord = strtok_s(pSrc, dq, &token);// ポインター位置からダブルクオーテーションまでの文字を抜き出す。
        
	answer = strtok_s(gotWord, separator, &token);//区切り文字を「\\u」として、文字列を抽出する。
	while (answer != NULL) {

		strcpy_s(temp, sizeof(temp), "0x");
		strcat_s(temp, sizeof(temp), answer); //文字列を0xXXXXに変換する。
		uniStr = strtol(temp, NULL, 16); // ICUのUnicodeStringに16進数へ変換した文字を入れる。
		strCstr.AppendFormat(_T("%s"), uniStr.getTerminatedBuffer()); // CString形式に変換して文字を追加する。

		answer = strtok_s(NULL, separator, &token);//次の文字列を探す。
	}
	
	MessageBox(hWnd, strCstr, _T("Message"), MB_OK | MB_ICONINFORMATION);//メッセージを表示する。

	return 0;
}

```
Laravelでシングルアクションコントローラーを定義するとInvalid route actionが出る問題

Laravel知れば知るほど便利度と自由度の高さには驚かされます。

Railsに似ていることもあり、採用するサービスや使っている人もどんどん増えているみたいですね。

そんな中でLaravelのシングルアクションコントローラーという概念があります。

今回は、そのコントローラーを作成する際 `Invalid route action` というエラーに少し詰まったので備忘録として残します。

## シングルアクションコントローラーとは

その名の通りアクションが１つだけのコントローラーです。

Laravelの場合、シングルアクションコントローラーにはコントローラーの中にinvokeメソッドだけが存在しています。

[この話](https://postd.cc/how-dhh-organizes-his-rails-controllers/)のようにできるだけコントローラーはシンプルにしたいものですよね。

１つのアクションが存在しているだけのコントローラーなんか通常通りにコントローラーを作成してメソッドを１つだけ作ればいいのではないか？という話もありますが、　明示的に単一のアクションがある方が可読性が上がるのかな？と思います。（その他のメリットはまだ勉強中です…）

## アクションが作成されない
Laravelの公式ページ
https://readouble.com/laravel/5.7/ja

さて本題に入りますが今回、上記の公式ページ通りにシングルアクションコントローラーを作成しました。

ルーティングを公式ページ通り下記のように設定します。

```/routes/web.php
Route::get('user/{id}', 'ShowProfile');
```

そして対応するコントローラーを作成するコマンド。

```bash
php artisan make:controller ShowProfile --invokable
```

とすると下記エラーが発生。

```
Invalid route action: [App\Http\Controllers\ShowProfile].
```

ルーティングがだめだとのことでした。

[stackoverflow](https://stackoverflow.com/questions/50095242/in-routeaction-php-line-84-invalid-route-action) なんかを見てみるとルーティングにメソッド名をつけない場合はresourceでルーティングしないとだめみたいな話も出てました。(少し今回とは違う内容ですが)

つまり、この場合だと

```web.php
Route::resource('user/{id}', 'ShowProfile');
```

とするか

```web.php
Route::get('user/{id}', 'ShowProfile@show');
```

のようにするかであれば解決することができます。

しかし、これであれば上記でお話したように通常通りにコントローラーを作成して単一のメソッドを作るのと変わらないですね。

## シングルアクションのコントローラーを作るには

最終的な対応策として `ルーティングを定義 → コントローラーを作成` としていたのを `コントローラーを作成 → ルーティングを定義` としました。

したがって一旦 `web.php` 内のルーティングに関する行を消去して

```bash
php artisan make:controller ShowProfile --invokable
```
を実行するとアクションが作成できました。

本質的な解決ではないので、誰か他に解決策を知っている方がいればぜひ教えてください。
話題のSQLクライアント、「TeamSQL」を使って簡単なグラフ描画を行ってみた。

### [※こちらに移植しました。 → 【イケてるSQLクライアント、TeamSQLを使ってみた！！接続から〜簡単なグラフ作成まで】](https://tech-blog.s-yoshiki.com/2018/09/642/)

<h1>概要</h1>
少し話題になっているイケてるSQLクライアント、TeamSQLを使って接続から簡単なグラフの作成までを行った時のメモ。


<h1>TeamSQL?</h1>
<a href="https://teamsql.io">
<img src="https://pbs.twimg.com/media/DoHZ5UbU4AEeGNg.png"></a>
https://teamsql.io

<h1>使い方</h1>
ここでは簡単な接続方法およびSQLの実行方法を紹介します。

<a href="https://tech-blog.s-yoshiki.com/2018/09/642/">イケてるSQLクライアント、TeamSQLを使ってみた！！接続から〜簡単なグラフ作成まで！</a>

<h2>接続と簡単な紹介</h2>
接続設定の紹介。
<a href="https://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0">WordPressのDB</a>を例に接続して遊みます。

<img src="https://pbs.twimg.com/media/DoHVpiWVAAA8-6b.jpg">
アプリケーションを起動した時の画面です。
Create a connectionから接続先の情報を作成します。

<img src="https://pbs.twimg.com/media/DoHVaQhV4AAQRyn.jpg">
このようにデータベースと接続先の情報を入力します。
<h2>SSHトンネリング</h2>
<img src="https://pbs.twimg.com/media/DoHVfADUUAIBWpz.jpg">
オプションの設定でSSHトンネリングを利用した接続を行うこともできます。
<h1>SQLを実行する</h1>
とりあえずWordPressのDBに接続して遊んでみました。

<img src="https://pbs.twimg.com/media/DoHZ9R9VsAAh0ac.jpg">
接続が成功するとこんな画面になります。
サイドバーに表示されているのが選択したデータベースの情報です。
真ん中に見えるエディタからSQLを入力し実行します。

エディタのUIも優秀です。
補完機能が働きます。<a href="https://tech-blog.s-yoshiki.com/2018/09/585/">MonacoEditor</a>ぽいですね。


<img src="https://pbs.twimg.com/media/DoHX1qvUYAAOnaf.jpg">
SQLの実行結果はこのように表示されます。
<h1>グラフの描画</h1>
ここでは簡単なグラフの作成方法について紹介します。

<a href="https://tech-blog.s-yoshiki.com/2018/09/645/">イケてるSQLクライアント、TeamSQLを使ってみた！！簡単なグラフを作成してみる！</a>を参考にしました。


<h2>データの用意</h2>
グラフに表示させるデータを用意します。

<img src="https://pbs.twimg.com/media/DoHeLNfU8AEhqxW.jpg">
ここで、ブログの「投稿日」と「投稿した文字列の長さ」を取得します。
ここでオレンジ色のChartsボタンを押すとグラフ用の別ウィンドウが立ち上がります。
<h2>グラフの設定</h2>
<img src="https://pbs.twimg.com/media/DoHeRvhU0AIW4yf.jpg">
ここでグラフの設定を行っていきます。

<img src="https://pbs.twimg.com/media/DoHgjcGUUAEt3hE.jpg">
このようにSOURCE に取得したデータのカラム名を設定し、
LABELには適当な値を設定します。
今回の場合はデフォルトの設定のままにしました。

<img src="https://pbs.twimg.com/media/DoHg03tUYAEJfZC.jpg">
MEASUREとDIMENSIONに取得したデータをそれぞれ設定します。

また今回の場合、Filterに関しては特に何も設定していません。
orderやwhereでフィルタをかけた方が早いような気がしました。
<h2>グラフの表示</h2>
<img src="https://pbs.twimg.com/media/DoHhJbDUcAEKpb0.jpg">
APPLYボタンを押下するとグラフが描画されます。
これは棒グラフを選択した時の様子です。

<img src="https://pbs.twimg.com/media/DoHj1tAU8AA-F3p.jpg">
サイドバーからグラフの種類を選択できます。
円グラフにするとこんな感じです。

<img src="https://pbs.twimg.com/media/DoHj2M3V4AESPJi.jpg">
これは何に使うのでしょうか。。。

他にも折れ線グラフなどが選択できます。
<h2>描画の設定</h2>
Chart Optionsから細かい設定を行うことができます。
<img src="https://pbs.twimg.com/media/DoHj28EV4AE-q72.jpg">
グラフのタイトルやラベルの設定などが変更できます。

これがグラフ設定の一連の流れになると思います。

<h1>その他の機能</h1>
<h2>拡張機能の導入</h2>
<img src="https://pbs.twimg.com/media/DoHXrM7UcAA6RJ3.jpg">
VScodeみたいに拡張機能を追加できるようです。
<h2>履歴</h2>
<img src="https://pbs.twimg.com/media/DoHVl_gUcAA0ENT.jpg">
いつどんなSQLが実行されたかをこんな感じで確認することができます。
<h1>参考</h1>

まだまだ日本語で書かれた情報は少ないようですね。

<a href="https://tech-blog.s-yoshiki.com/2018/09/663/">TablePlusを使ってみる。シンプルでモダンなSQLクライアントツール</a>


<a href="https://tech-blog.s-yoshiki.com/2018/09/642/">イケてるSQLクライアント、TeamSQLを使ってみた！！接続から〜簡単なグラフ作成まで！</a>

 <a href="https://tech-blog.s-yoshiki.com/2018/09/642/">イケてるSQLクライアント、TeamSQLを使ってみた！！簡単なグラフを作成してみる！</a>

以上。
配列の順番を考慮するSQLの書き方

1対nの関係がある時、IDしか興味が無い場合に中間テーブルを使わずに1側のテーブルにID配列を持たせることがあります。

```sql
CREATE TABLE posts (
  id INT
  ,content TEXT
  ,image_id_array INT[]
  ,PRIMARY KEY (id)
);
CREATE TABLE images (
  id INT
  ,width INT
  ,height INT
  ,url TEXT
  ,PRIMARY KEY (id)
);
```
postとimageを一緒に取得するSQLを書きます。

```sql
SELECT
  t1.id
  ,t1.content
  ,jsonb_agg(jsonb_build_object(
    'url'
    ,t2.url
    ,'width'
    ,t2.width
    ,'height'
    ,t2.height
  )) AS image_json
FROM
  posts AS t1
  LEFT OUTER JOIN images AS t2 ON (
    t2.id = ANY(t1.image_id_array)
  )
GROUP BY
  t1.id
  ,t1.content
;
```
ここで配列の順番に意味があったとします。JSONには配列の順番に生成してほしいです。

```sql
SELECT
  t1.id
  ,t1.content
  ,jsonb_agg(jsonb_build_object(
    'url'
    ,t3.url
    ,'width'
    ,t3.width
    ,'height'
    ,t3.height
  ) ORDER BY t2.line_number) AS image_json
FROM
  posts AS t1
  LEFT OUTER JOIN unnest(t1.image_id_array) 
    WITH ORDINALITY AS t2(image_id, line_number) ON TRUE
  LEFT OUTER JOIN images AS t3 ON (
    t2.image_id = t3.id
  )
GROUP BY
  t1.id
  ,t1.content
;
```
unnestしたテーブルはLEFT OUTER JOINしないとimage_id_arrayが空だったりNULLだったりするとpostのレコードが取得できなくなります。
box-shadow

box-shadowは本来は影をつけるものなのですが，こういった使いかたもできます．

![aaa.PNG](https://qiita-image-store.s3.amazonaws.com/0/140965/61c88306-9190-9333-1913-05ce03181c75.png)


cssのbox-shadowを使って同じ形のものを複製してる感じです．
htmlにはdivしかないです．

``` sample.html
<!DOCTYPE html>
<html>

<head>
    <link rel="stylesheet" href="./sample.css">
</head>

<body>
    <div class="test"></div>
</body>

</html>
```

``` sample.css
.test {
    width: 30px;
    height: 30px;
    box-shadow: 50px 0px red, 100px 0px green, 150px 0px blue;
}
```
animation使ってみました

cssのアニメーションを使ったことがなかったので，使ってみました．
(シンプルなものだと意外と簡単だった！！凝りだすとはまりそうだけど...)
上の緑の四角にマウスオーバー⇒赤緑青の四角が動くようにしてあります．
(他の要素をcssのみで動かすっていうがと意外に難しかった)

![aaaa.gif](https://qiita-image-store.s3.amazonaws.com/0/140965/2bfe2b1d-f8d5-0c7f-0e7c-ef823ecb768a.gif)



``` sample.html
<!DOCTYPE html>
<html>

<head>
    <link rel="stylesheet" href="./sample.css">
</head>

<body>
    <div class="test1"></div>
    <div class="test"></div>
</body>

</html>
```


``` sample.css
.test {
    width: 30px;
    height: 30px;
    margin: 0 auto;
    margin-top: 400px;
    box-shadow: 50px 0px red, 100px 0px green, 150px 0px blue;
}

.test1 {
    width: 200px;
    height: 76px;
    margin: 0 auto;
    background-color: green;
}

.test1:hover+.test {
    animation: ue 1s forwards, shita 1s 1s forwards;
    animation-timing-function: ease-out;
}

@keyframes ue {
    from {
        margin-top: 400px;
    }
    to {
        margin-top: 100px;
    }
}

@keyframes shita {
    from {
        margin-top: 100px;
    }
    to {
        margin-top: 400px;
    }
}


```
【感想】PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応

# はじめに


PHPフレームワーク Laravel Webアプリケーション開発
http://amzn.asia/d/cslZyKz

対象の読者は、Laravel5上で保守や運用まで見据えた実践的なアプリケーションの設計/実装に悩んでいるような脱Laravel初心者を目指しているような方、かなと思いました。実際現場でこのような悩みを抱えているエンジニアは多いのではないでしょうか？少なくともウェブアプリケーションフレームワークを初めて触るような方向けとしては書かれておらず、SymfonyやCakePHP等のPHPのウェブアプリケーションフレームワークを使った経験がある方でないと少し内容が難しく感じるかもしれません。

# 第一部

第一部では、Laravel上でアプリケーションを組むときに知っておきたいフレームワークのアーキテクチャや処理フローについて、しっかりとページを割いて図付きで解説されています。サービスコンテナとサービスプロバイダの関係は多くのLaravel初心者が躓くというか、理解に時間のかかる部分だと個人的には思っていますが、この本を読めばすんなり腑に落ちると思います。この第一部にはLaravel脱初心者をするために最も重要なコンテンツが詰まっていると思いました。

# 第二部

第一部の後半から第二部にかけては、フレームワークの各機能の使い方をLaravelの公式ドキュメントから一歩二歩踏み込んで紹介しています。実践的なウェブアプリケーションやバッチ処理の設計パターンが紹介されていて、エラーハンドリングの実装パターンからロギングといった運用に欠かせないトピックまで充実しています。

# 第三部

この本で一番グッと来た点は、テストに関するトピックがとても充実していてる点です。データベースやモックを使ったユニットテストからWebAPIのテストの詳細なサンプルコードが第二部にたくさんあるだけでなく、この第三部では50ページ以上に渡ってテスト駆動でアプリケーションを開発する方法が丁寧に説明されているところです。このような本があると、開発チームにTDDを導入するときにとても助かりそうです。

# おわりに

この本を通じて学んぶことは、Laravel以外のフレームワークを使ってアプリケーションを実装するときにも役立つこと間違いないなと思います。まさに「現場で使える内容」となっていました。個人的にオススメしたい読み方は第一部まで一通り読んで、残りはリファレンス的に気になるトピックを掻い摘んで読んでいくスタイルです。
RxJSを覚えないAngularの書き方

:::note alert
この記事の内容はRxJS7から非推奨となりました。最新版に対応したものは https://zenn.dev/rdlabo/articles/60b4be5be02704 で公開しておりますので、こちらをご覧ください。
:::

「RxJSを覚えないといけないからAngularは大変だ！」「RxJSはテスト難しいからつかいたくない」などと時々聞くので、RxJSを覚えないAngularの書き方を書いておきます。

# AngularでRxJSを使う場所
まず、よく「AngularはRxJSを使う」とよくいいますが、具体的にどこに使われていますでしょうか。

これいうと、大体驚かれるんですが「package.jsonでインストールされているだけ」です。[^1]
特にデフォルトでRxJSが書かれてて、それを理解しないと作業を進めることができないわけじゃありません。

ただ、いくつかのAngularのAPIでRxJSをデフォルトにしているものがあります。それがHttpClientです。

## HttpClientとは
RxJSを使ったajaxのようなものです。URLを叩いて、値を取得してきたりします。jQueryでAjaxを使ってた皆さんは、以下のように書いてたと思います。

```js
$.ajax({
  url:'https://example.com',
})
  .done( (data) => {
    // 成功時
  })
  .fail( (data) => {
    // 失敗時
  });
```

それが、以下のように変わります。

```ts
this.http.get('https://example.com').subscribe(
  done => {
    // 成功時
  },
  fail => {
    // 失敗時
  }
);
```

`ajax` だと`done` `fail`を書くと思うのですが、同じように使えます。ただ、`subscribe`というのを書かないといけないだけです。[^2]

__終わりです。__

いや、本当ですって、実際、私はこれだけの知識でアプリリリースしましたし。
RxJSって、覚えたら様々なAPIがあって、それを使ったら様々な便利な非同期処理を実行することができるものなのですが、Anguarで「RxJSを使わないとかけない処理」ってこれぐらいなものですよ。[^3]

ですので、「RxJSを覚えないといけないから、Angularは難しい」と思い込んでる方はおそらく思い込みじゃないかなと。便利なパッケージが同封されているだけだと思って、気軽にはじめてもらえればと思います。

## subscribeも書きたくない
もうちょっというと、Promiseベースで、async-awaitを書きたいという方向けです。jQueryをいれて`ajax`を使うとか、JavaScriptライブラリの`axios`使うとかいろいろやり方はあるのですが、ここでは「RxJSベースのHttpClientをPromiseに変換する」方法を書いておきます。

```ts
this.http.get('https://example.com')
  .pipe(first())
  .toPromise(Promise)
```

これだけで、RxJSはPromiseになりました。ですので、以下のような使い方ができます。

```ts
const f = this.http.get('https://example.com')
  .pipe(first())
  .toPromise(Promise);

f.then(data => {
  // Promiseっぽく書ける
});
```

もちろん、async-awaitも使えますので

```ts
async get(){
  const f = await this.http.get('https://example.com')
    .pipe(first())
    .toPromise(Promise);
  console.log(f); // Promise実行後の値が入る
}
```

みたいな書き方もできます。
もうこれで、Angularを採用するのに、RxJSは課題ではありませんね。

ちなみに、もうひとつよく挙げられる「AngularはTypeScriptがあるから...」も、「TypeScriptでReactを書く」みたいな記事がでてたり、[Vue.js公式がTypeScriptのサポート](https://jp.vuejs.org/v2/guide/typescript.html)をしたりしているので、わざわざフレームワークの選定レベルで避けて通るようなものではなくなってきた感じはあります。

それでは、また。

### 補足
先程の書き方するには、`operators`から`first`を呼んでくる必要があるので、なぜか動かないと悩んだ場合は上に以下の行を書き足してください。

```ts
import { first } from 'rxjs/operators';
```

[^1]: 内部処理では使われていますが、ユーザが書くエリアにはないので「インストールされてるだけ」という表現をしています。npm removeしたらもちろんエラーでます
[^2]: `next` `error` `complete` などの概念はスキップしています。必要なときに覚えればいいのです。
[^3]: @rxjs/store（Flex/Redux的な処理）とか書き出したらもちろん変わりますが、それ書く頃には中級者です。覚えてください。
Python×Keras×GANチュートリアル　人工知能でファッション生成（１）

# GANでファッションショー

　![9E5nCb032.gif](https://qiita-image-store.s3.amazonaws.com/0/266780/94b4d31e-ec17-0363-e1c0-42e9fc381392.gif)


##この記事の目的
　人工知能界隈を賑わせるGANについて、実装しながら学ぼうという企画です。
　PythonとKerasを使えば、なんと１８０行くらいでGANによる画像生成ができちゃいます。しかも、学習にかかる時間は数分。使用するデータセットは

　![fashon_mnist](https://github.com/zalandoresearch/fashion-mnist/blob/master/doc/img/fashion-mnist-sprite.png?raw=true)

　https://github.com/zalandoresearch/fashion-mnist
　mnist_fashionです。mnist_fashionは、mnistと同じ２８×２８の画像データセットです。mnistと同じ形式で、様々なファッション画像を保存したデータベースです。数字より、服のほうが圧倒的面白いので、こっちを使うことにしました。なお、ダウンロードはプログラムでカンタンにできるので、事前にする必要はありません。

　この記事を書くにあたっては
　https://github.com/eriklindernoren/Keras-GAN
をほとんど参考にさせていただきました。このレポジトリは、めちゃくちゃすごいので、この記事を読み終えたら是非、git cloneしてみてくださいね！

##まずは動かす
　GANの数理は、一旦置いといて、まずは動かしてみましょう。
####リポジトリのクローン 

```python:terminal
git clone https://github.com/hideki1991/gangan.git
```
####依存ライブラリ
　依存ライブラリのインストール。クローンしたリポジトリ移動してから、下記のコマンドを実行。なお、pythonは３系です。

```python:terminal
pip install -r requirements.txt
```

　これで準備完了です！

####依存ライブラリ

　あとは、実行あるのみ。

```python:terminal
python gan.py
```

 さあ、次々とimageディレクトリが生成されて、その中に、エポックごとの生成結果がpngファイルで書き込まれていきます。生成画像はなめらかに変化していくようにしてあります。

##次回

　以上で前半は終了です。とってもカンタンで、計算にかかる時間も数分ですね。次回は、ganの仕組みを解説します。
条件分岐で代入する方法って結局どのパターンで分岐するんだっけ？

2018/9/30 11:30 修正しました :pencil: 

## よくやるリファクタリング

```ruby
hensu = hoge(fuga)
if hensu
 p "変数が真です"
else
 p "変数が偽です"
end
```

こうできますよね

```ruby
if hensu = hoge(fuga)
 p "変数が真です"
else
 p "変数が偽です"
end
```

でもこれって、hensuがどういう状態なら"変数が偽です"が出力されるかわかりますか？
自分もよくこんがらがるので備忘録です

|hensuuの中身|出力|
|:--|:--|
|false|"変数が偽です"|
|true|"変数が真です"|
|""|"変数が真です"|
|nil|"変数が偽です"|
|[]|"変数が真です"|
|{}|"変数が真です"|

肝は`nil`と`[]`のときかなと思っています。
例えば、両者とも該当のユーザーさんが存在しないときです。

```ruby
if user = User.find_by(name: "nanashi")
 p "変数が真です"
else
 p "変数が偽です"
end
=> "変数が偽です"
```

```ruby
if user = User.where(name: "nanashi")
 p "変数が真です"
else
 p "変数が偽です"
end
=> "変数が真です"
```

上記の返り値が`nil`と`[]`になってしまうので、注意必要ですね :thinking:
アイコンは自分で作る。楽しい。探すより早い。

# お薦めポイント
- 自分で作成するから著作権リスク低い！
- 自分の欲しいモノを作れるから嬉しい！
- PowerPointがあれば無料でアイコンゲット！
- 慣れると10～15分程度で完成できる！

# まずは、パズル感覚で遊んでみて
下記PowerPointの図形を選んだら、何が出来上がると思いますか？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/6183b98e-c68e-eb1b-2315-683e55e8bde6.png)

正解は　↓ 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/92f4b1e8-6499-b58c-a5a1-772d926f65af.png)
　　　　　　　　　　　      　　　　　　　　証明書のアイコン　でした。

# 慣れると様々なアイコンを作れます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/369eeaec-d899-8d75-da7e-df8aaafb3f1b.png)

# ぷちテクニック
## ラインの太さだけで勝負
円と線だけ選んで。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/7eb9111b-62aa-1601-27c5-ecce6121b4aa.png)
円の枠線を「線なし」で消したり、円の塗りつぶし色を白に変えたり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/ff8e8d76-41c4-8645-371d-dc032666ccb5.png)
線を太く太くしたり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/b7089af7-ab38-8d1a-730b-0bb2f9195cc6.png)
角度を変えてみたり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/26bb863f-02a6-96bd-09a6-e350e89b8d87.png)
すると…、なんとなく鍵っぽくなった。南京錠とセットで作ろう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/64fcd65a-a936-3704-406d-678701358101.png)

## 重ね技だけで勝負
だ円を重ねて、重ねて、なんとなく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/8f8f244d-915a-299e-4ae0-a582e4e7ea76.png)

## 複製とサイズ変更だけで勝負
複数の図形をコピーして、画像貼り付けするとひとつの画像になる。その画像をコピペしてサイズ変更すると、なんとなく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/d2ac6046-e9f8-fdc4-a0ba-1c163970e57f.png)

## 複雑な形も作れちゃう。頂点の編集だけで勝負
有償のイラストレーター（ソフトウェア）みたいな形の変形も出来ちゃう。頂点の追加、削除、カーブだって出来る！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/8d5974f1-74c0-ebf3-0e21-fc42dc11fb37.png)
ひたすら変形するだけで、なんとなく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/5a4549d2-03c6-6308-4bd6-972e6d804528.png)

## 実際の手順だけで勝負
本当の工事みたいに、レンガをひたすら積み上げる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/0f8fc545-4fcf-9ec4-a8e0-5161a0163c2f.png)

## どれだけ手を抜くかだけで勝負
めんどくさそうなWiFi電波だって、分解すれば単なる円。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/5764627f-fd3f-a71c-691d-9b64b7260402.png)

## 配色を変更するだけで勝負
アイコンが１個できたら、気分に合わせてワンクリックで色を変えることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/a2010c54-20e8-c298-c28d-a847fd2b7545.png)


## 前後の配置関係だけで勝負
一番大事な技は、図形を配置しているレイヤーを考えて、図形を前後のレイヤーへ配置移動。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/d74c84db-dc30-5aaf-d32b-9a66a0bcadee.png)

## 本格的なイラストまでイケちゃう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189936/c38abc74-1d18-58f4-8e04-91ccbc8f4c79.png)
Rubyクラス作成

```:ruby
class Car
  attr_reader :speed
  def initialize(speed)
    raise ArgumentError, 'speed < 0' if speed < 0
    @speed = speed
  end

  def time(distance)
    raise ArgumentError, 'distance < 0' if distance < 0
    return nil if @speed.zero?
    distance.to_f / @speed
  end
end

car = Car.new(50)
p car
p car.speed
p car.time(100) # => 2.0

car = Car.new(0)
p car.time(100) # => nil

begin
  Car.new(-1)
rescue ArgumentError => ex
  p ex
end
```
kuberctl のタイムアウト解消について

kubectlコマンドを打った時に時間がかかって動かず、
時間がかかり以下のメッセージが出るときの解決方法。

Unable to connect to the server: dial tcp 192.168.99.100:8443: i/o timeout




サーバー側が立ち上がっていない可能性がある
minikubeを立ち上げてもいう一度

以下のコマンドを入力しよう

```bash
minikube start
kubectl version
```
PhpstormのJava Virtual Machine Optioonsの設定

## 設定変更の背景
PhoStormがコード編集時にカクつくようになったので、設定を調整してみた。

## 設定の編集
ToolBoxのSettings > Java Virtual Machine Optioons > Edit より
テキストエディタでJVMオプション設定ファイルが開く


バージョン2018.2.4のデフォルト設定に以下の資料のパラメータを組み合わせてみた
[intellij-jvm-options-explained](https://github.com/FoxxMD/intellij-jvm-options-explained)

### デフォルト
```
-Xms128m
-Xmx750m
-XX:ReservedCodeCacheSize=240m

-XX:+UseCompressedOops
-Dfile.encoding=UTF-8
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Xverify:none

-XX:ErrorFile=$USER_HOME/java_error_in_phpstorm_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_phpstorm.hprof
-Dide.no.platform.update=true


```

### 変更後
```
-Xms512m
-Xmx4096m
-XX:ReservedCodeCacheSize=240m
-XX:+UseG1GC
-XX:-UseParNewGC
-XX:-UseConcMarkSweepGC
-server
-XX:+UseCompressedOops
-Dfile.encoding=UTF-8
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Xverify:none

-XX:ErrorFile=$USER_HOME/java_error_in_phpstorm_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_phpstorm.hprof
-Dide.no.platform.update=true

```
## 設定による変化

とりあえずカクつか無くなったので快適になった
他には、MacであればディスクユーティリティのFirst Aid等を行うとファイル操作の重さが軽減される事がある
GridSearchCV の実装に関するメモ

##Sample Code
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#matplotlib inline

iris = sns.load_dataset('iris')

#iris2 = pd.get_dummies(iris)
#iris2.head(3)

species_mapping = {'setosa': 0, 'versicolor': 1, 'virginica': 2}
iris3 = iris.copy()
iris3['species'] = iris['species'].map(species_mapping)
iris3.head(3)

plt.figure(figsize = (5, 5))
sns.heatmap(iris3.corr(), annot = True, linewidths = 0.1, linecolor = 'white')
plt.xticks(rotation = 30)
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/91874663-e8b2-d1e7-4eba-1bad9dea6275.png)

```python
x = iris3['sepal_length']
y = iris3['petal_length']
target = iris3['species']

plt.figure(figsize = (5, 3))
plt.scatter(x = x, y = y, \
            c = [['orange', 'green', 'blue'][t] for t in target])
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/beff6a41-67bf-b06a-8ee2-869a338abd37.png)

```python
features = iris3.drop('species', axis = 1)
target = iris3['species']
feat_labels = features.columns

from sklearn.model_selection import train_test_split

x_train, x_val, y_train, y_val = train_test_split(features, target, test_size = 0.2)

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier()
rf.fit(x_train, y_train)

importances = rf.feature_importances_

#indices = np.argsort(importances)[::-1]
#plt.figure(figsize = (5, 3))
#plt.bar(x = range(x_train.shape[1]), height = importances[indices])
#plt.xticks(range(x_train.shape[1]), feat_labels[indices], \
#           rotation = 30)
#plt.title('Feature importances')
#plt.show()

indices = np.argsort(importances)
plt.figure(figsize = (5, 3))
plt.barh(y = range(len(indices)), width = importances[indices])
plt.yticks(range(len(indices)), feat_labels[indices])
plt.title('Feature importances')
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/cf2aff57-bd5b-838c-65a6-2b37a7a02784.png)

```python
from sklearn.metrics import confusion_matrix, accuracy_score

y_pred = rf.predict(x_val)
acc = accuracy_score(y_true = y_val, y_pred = y_pred)
conf_mat = confusion_matrix(y_true = y_val, y_pred = y_pred)

print ('accuracy:', acc)

plt.figure(figsize = (5, 5))
sns.heatmap(conf_mat, annot = True, linewidths = 0.1, linecolor = 'white')
plt.title('Confusion matrix')
plt.xlabel('predicted label')
plt.ylabel('true label')
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/4de30c68-4c78-d55c-2a28-e3a3a0eafdaf.png)


```python
from sklearn.grid_search import GridSearchCV

param_grid = [{'n_estimators': [10, 20], \
              'max_depth' : [2, 5], \
              'criterion' : ['gini']}, \
              {'n_estimators': [10, 20], \
              'max_depth' : [2, 5], \
              'criterion' :['entropy']}]


gs = GridSearchCV(estimator = rf, param_grid = param_grid, cv = 3, \
                 scoring = 'accuracy')
gs.fit(x_train, y_train)

print (gs.best_score_)
print (gs.best_params_)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/05f0f80e-d8d4-f771-dce8-90c8f4a483b2.png)
MySQL 忘れがちコマンドメモ

##Table作りたいな〜


```
mysql> cretae table [テーブル名]([カラム名] [型] [オプション]);
```

`mysql> create table [テーブル名];`はダメだった。
カラムは一つ以上追加して作成しないと怒られますよ〜


###オプション忘れちゃった〜

- primary key >>> 主キー設定
- unique >>> 一意のモノに設定
- auto_increment >>> 自動で番号を振る
- not null >>> nullは許さん
- default >>> デフォルト値設定

※自分が必要だと思って調べたオプションのみの掲載。

##Tableできた？


```
mysql> show tables;
```


##Table消したいな〜


```
mysql> drop table [テーブル名];
```


##Table名変更したいな〜


```
mysql> alter table [既存のテーブル名] rename [変更後のテーブル名];
```


##カラム追加したいな〜


```
mysql> alter table [テーブル名] add [追加カラム名]　[型] [オプション];
```


##〇〇カラムの後に追加したいんだよな〜


```
mysql> alter table [テーブル名] add [追加カラム名]　[型] [オプション] after [既存のカラム名];
```

##〇〇カラム削除したいな〜


```
mysql> alter table [テーブル名] drop [カラム名];
```

`アレとアレを削除したいんだよな〜`は、`[カラム名]`の後`カンマ[,]`区切りでできますよ〜


##あれ、どんな構造でテーブル作成したっけ？


```
mysql> desc [テーブル名];
```

又は

```
mysql> show create table [テーブル名];
```

##カラムの構造変更したいな〜


```
mysql> alter table [テーブル名] change [既存カラム名] [変更後のカラム名]　[型] [オプション];
```

`カラム名は変更したくないんだよな〜`なら同名のカラム名でもできますよ〜


##まとめ


`コレ便利ですよ！`とか、`ココ間違えてますよ！`がありましたら、コメントにてお願い致します。
RaspberryPi3にUbuntu Mate 16.04.2をインストール for ROS

#ラズパイにROSをインストールするための忘備録
##ubuntu mate 16.04.2のインストール
###準備
- イメージファイルのDL先
 - https://ubuntu-mate.org/raspberry-pi/
- Macでのイメージファイルの作成法
 - macにHomebrewをインストール https://qiita.com/balius_1064/items/ac7dff5ef10eaf69996f
 - macでxzの解凍 https://qiita.com/kamayaplus/items/d5a355e03ee78095daf7

 - Mac OS X で Raspberry PiのOSイメージを焼く https://ledsun.hatenablog.com/entry/2014/10/26/174712

##ubuntu mate インストール中の設定
###ubuntu mate in the middle of installing
- 日本語を選択
- PCの名前の設定 rspi3
- passwordの設定

##ubuntuインストール後の設定など
- Wifiの設定
- sudo apt-get update
- sudo apt-get upgrade
- LANG=C
- xdg-user-dirs-gtk-update
- 日本語設定（「システム」→「設定」→「ユーザ向け」→「言語サポート」）　https://qiita.com/petadimensionlab/items/2f62ae270be0443573a3
- chromiumのインストール
- sudo apt-get install chromium-browser


##ROSのインストール
###設定
- sources.list設定、キーサーバーの設定、apt-get update
 - ターミナルを起動してcommandを実行

``` terminal.cmd
sudo sh -c 'echo "deb sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get update
```
###ROSのインストール
- ROSデスクトップインストール、rosdep、環境設定、rosinstallのインストール
 - ターミナルを起動してcommandを実行

```terminal.cmd
sudo apt-get install ros-kinetic-desktop-full
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc source ~/.bashrc
sudo apt-get install python-rosinstall
```

-  動作確認
 - .bashrcを読みこませるために新しいterminalで動作確認
 - インストールに続けておこうなうと「プログラム 'roscore' はまだインストールされていません。 次のように入力することでインストールできます:」のエラーがでる。

```
roscore
```  
- いろいろとメッセージが出力されて最後に以下のように表示されれば、インストール完了

```
started core service [/rosout]
```
Lambda実行時エラー「Process exited before completing request」

RDSに対してLambda関数からクエリを実行した際に、エラーにより以下のメッセージが表示されました。
一先ず、なぜ発生したのかが分かったので共有したいと思います。

```bash:エラーメッセージ
{
  "errorMessage": "RequestId: 6f9d7015-c2e8-11e8-a6ba-d70bc21f76bf Process exited before completing request"
}
```

ログの使用メモリを見ると

```bash:取得できた時
Memory Size: 2048 MB　Max Memory Used: 1652 MB
```

```bash:エラーになった時
Memory Size: 2048 MB　Max Memory Used: 2049 MB
```

結果：メモリ不足のため、落ちただけでした・・。

500,000件近くを取得しようとしてたら、メモリ必要ですよぉな結果でした。
試しにメモリを増やして実行したところ取得できました。

同じようにはまった人は、メモリを増やしてみると解決するかもしれません。
ただし、検索してわかったのですが、同じエラーメッセージで事象が違う場合もあるようです。
今回のケースは事象の一つとして参考になればと思います。

以上です。