OmniAICreator/Qiita-1.07M huggingface dataset:
事業開発な私がエンジニアメンバーとのやり取りで気をつけている5つのこと

トレタ事業開発部の@osaki_ayuです。今一番ほしいのはダイソンの空気清浄機です。

事業開発部ではアライアンス（提携）を担当していて、わたしは主に[提携パートナーさまとの連携開発](https://toreta.in/jp/feature/media-connect/)の窓口をしています。
![FireShot Capture 24 - グルメサービス連携 - https___toreta.in_jp_feature_media-connect_.png](https://qiita-image-store.s3.amazonaws.com/0/323789/4f2520fd-bf2b-7086-a8dc-64117840eaff.png)
<font color="gray">※トレタは多数の提携パートナーさまと連携させていただいています。</font>

エンジニアメンバーと一緒にお仕事をすることも多いので、わたしが普段どんなことを考えてコミュニケーションをしているか、せっかくの機会なので書き出してみようと思います。

## 1. 経緯や目的をしっかり説明する

何をするにしても**「なぜやるのか」**を明らかにするのは大事なことですが、アライアンスの場合はそもそも相手ありきな取り組みなので、複雑な事情が絡んでいることも多いです。

「ビジネスサイドだけが事情を知っててよくわからん！」みたいなことにはならないように、

- **提携パートナーさまがどういう企業で**
- **どれくらいの規模のサービスで**
- **どんな経緯で連携開発を進めることになって**
- **連携するとお互いや飲食店さまにどんなメリットがあるのか**

などを整理して伝えるようにしています。

## 2. 報連相はとにかく早く

わたしの仕事は主に「調整」なので、わたしの手元で止めてしまうとすべてが遅れます。

特に開発仕様に関するやり取りに関しては、たとえ別の作業をやっている最中でも優先的に対応します。

これはエンジニアメンバーを急かしているわけでもなんでもなく、**調整や質疑応答を少しでも早く進めることで、その分開発にしっかり時間をかけられるようにしたい**という意図です。

## 3. 丸投げしない

上記のようなやり取りの中で、提携パートナーさまから「連携開発における質問リスト」をいただくことも多いです。

が、そのリストを丸投げするようなことはしないようにしています。

- **必ず自分で目を通して、答えられるものや追加ヒアリングが必要なものは自分で対応する**
- **自分なりに回答案を埋めてみて、自信がないものについては確認してもらう**
- 調べてもまるっきりわからない専門用語が出てきたら素直に聞く:innocent:

トレタのメンバーは非エンジニアにもわかるように丁寧に説明してくれるので、普段かなり助かってます。多謝！

## 4. 全員の役割・立場を理解して仕事をお願いする

非エンジニアのわたしが開発においてできることはほとんどないので、**「誰かにお願いする」**ことが仕事になります。<font color="gray">（個人的な話ですが仕事を「振る」「投げる」という表現があまり好きでないので、「お願いする」という言い方をするようにしています）</font>

トレタのメンバーは1人で複数プロジェクトを担当していることがほとんどなので、

- 誰が何のプロジェクトに携わっていて
- 今どういう状況で
- どんな優先順位で動いているのか

上記を把握した上で、こちらの優先順位や温度感を伝えるようにしています。

さらに細かいことを言うと、急ぎではない用事で話しかけたりメンションする前に、その人のカレンダーを見て「今打ち合わせ中なのかどうか」も確認するようにしています。

プログラミング中に話しかけていたらごめんなさい！<font color="gray">（ちなみにわたしは前職Webデザイナーだったので、コーディング中に話しかけられるとワーワーしてました）</font>

## 5. 効率化できるものはする

開発を進めていると、途中「これ本当にエンジニアメンバーがやるべきなんだろうか...」と思われる業務が見つかったりします。

例えば、提携パートナーさまへの権限設定など、主に何かの登録や発行系のタスクです。

##### 工程例
1. 提携パートナーさまから依頼を受ける
2. 自分からエンジニアメンバーに依頼する
3. エンジニアメンバーが対応、完了したら教えてもらう
4. 提携パートナーさまへ完了した旨を連絡する

こういったタスクはかっちりスケジュールが決まっているわけでもなく発生ベースでの対応になってしまうので、作業自体は少しだとしてもスイッチングコストがかかります。

なので、こういった業務を自分の方でできるようにさせてもらえないか都度相談するようにしています。

ただし**お互いの業務境界や会社として権限管理が自由すぎるのもよくない**ので、ケースバイケースです。<font color="gray">（自分でもできそうだからやらせて！という舐めた発想ではありませんのであしからず...）</font>

##さいごに
わたしが窓口として間に入る意味は、**「いかにエンジニアメンバーに本来の開発業務に専念してもらえるか」**につきると思っています。

今後もより良い形で一緒に開発を進められるよう、日々コミュニケーションをとっていきたいと考えています。
JSPでファイルにテキストを書き込む際のEclipseの設定

##概要
JSP＆サーブレットの参考書を読んでいて、ファイルにテキストを書き込むサンプルを書いてある通りに打ち込んで実行したところ、作成されたファイルが見つからないという状態に…。色々調べた結果、Server Pathを正しく理解していないことがわかりました。ここではEclipseでJSPからファイルに書き込みを行った際どこに保存されるか簡単に紹介します。

##Default設定
特に設定を変えていない場合、Eclipseワークスペースの\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebappsにServer Locationが設定されています。プログラムでテキストファイルなどを出力した場合、どうやらこのディレクトリ下に作成されるようです。

##設定の変更
この設定は以下のスクショのServerタブに表示されているTomcatサーバーをダブルクリックすることで変更可能です。
![server_tab.png](https://qiita-image-store.s3.amazonaws.com/0/326104/73ad994e-8961-04ea-bedc-bb6350445124.png)
ダブルクリックすることでServer Locationを変更できる画面が出てきます。
![server_location.png](https://qiita-image-store.s3.amazonaws.com/0/326104/699b8255-6c71-a88b-69bd-9b6d27072984.png)
私は、Tomcatのドキュメントルートwebappsに変更しました。
こうすることで、プロジェクト名がJSPBookSampleだった場合、webapps/JSPBookSample/WEB_INFOなどのwebappsディレクトリ以下の任意のフォルダにデータを保存することが簡単にできます。
mysqlでダンプファイルからテーブルとcsvデータを読み込む方法

# はじめに
すでに出来上がってるデータベースに後から追加したいテーブルがある時が発生したので手順を書いていきたいと思います。
# 手順

### ダンプファイルの読み込み
```
mysql -u username -p dbname < dump.sql 
```
usernameは設定しているrootなどの名前
dbnameにデータベースの名前
dump.sqlは追加したいデータのモデルなどの詳細が書かれているもの
をそれぞれ指定

---
### csvの読み込み
```
mysql LOAD DATA LOCAL infile "sample.csv" into table samples fields terminated by ',';
```
sample.csvには用意したcsvファイルを
samplesのところには上で読み込んだテーブル名を指定
fields terminatedは,(カンマ)で値を区切っているという定義です。 
オプションでoptionally enclosed by '"'をつけると日本語のstringなどの囲い文字の定義ができます。

---
**ここでエラー**

```
ERROR 1148 (42000): The used command is not allowed with this MySQL version
```

[参考](
https://stackoverflow.com/questions/18437689/error-1148-the-used-command-is-not-allowed-with-this-mysql-version)
local_infileの設定を定義しなければいけないらしいので設定していく。

```
mysql -u root -p --local-infile dbname
mysql SHOW VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+
mysql SET GLOBAL local_infile = 1;
```
### もう一度

```
mysql LOAD DATA LOCAL infile "sample.csv" into table samples fields terminated by ',';
```
このような返答が返ってきたらok!!

```
Query OK, 18 rows affected, 92 warnings (0.06 sec)
Records: 18  Deleted: 0  Skipped: 0  Warnings: 92
```
無事に新しいテーブルを追加することができました！！

# 終わりに
色んな記事を回っていたら
rake db:dropをして元のデータを全て消してしまい、復活にかなり時間がかかりました。。
恐るべし
### db:drop！！
サービスを使ってみる

# サービスとは
サービスとは公式リファレンスによると

> Service は、バックグラウンドで長時間動作して作業を行い、ユーザー インターフェースを表示しないアプリケーション コンポーネントです。

らしいです。

# コード
サンプルとしてアクティビティから離れた時、chromeが起動してgoogleを表示するプログラムを書いてみました。


## サービス
```kotlin:SampleService.kt
package com.hoge.fuga.piyo

import android.app.Service
import android.widget.Toast
import android.content.Intent
import android.net.Uri
import android.os.*
import android.os.Process.THREAD_PRIORITY_BACKGROUND


class SampleService : Service() {
    private var mServiceLooper: Looper? = null
    private var mServiceHandler: ServiceHandler? = null

    private inner class ServiceHandler(looper: Looper) : Handler(looper) {
        override fun handleMessage(msg: Message) {
            try {
                // 5秒待った後、chromeが起動する。
                Thread.sleep(5000)
                val uri = Uri.parse("https://www.google.com/")
                val intent = Intent(Intent.ACTION_VIEW, uri)
                startActivity(intent)

            } catch (e: InterruptedException) {
                Thread.currentThread().interrupt()
            }

            stopSelf(msg.arg1)
        }
    }

    override fun onCreate() {
        val thread = HandlerThread("ServiceStartArguments",
                Process.THREAD_PRIORITY_BACKGROUND)
        thread.start()

        mServiceLooper = thread.looper
        mServiceHandler = ServiceHandler(mServiceLooper!!)
    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show()

        val msg = mServiceHandler!!.obtainMessage()
        msg.arg1 = startId
        mServiceHandler!!.sendMessage(msg)

        return START_STICKY
    }

    override fun onBind(intent: Intent): IBinder? {
        return null
    }

    override fun onDestroy() {
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show()
    }
}
```

## サービスを呼び出す
```kotlin:MainActivity.kt
package com.hoge.fuga.piyo

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.content.Intent



class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onPause() {
        super.onPause()
        
        // アクティビティが一時停止状態に入ったら、サービスを実行する
        val intent = Intent(this, SampleService::class.java)
        startService(intent)
    }
}
```

# 参考
https://developer.android.com/guide/components/services?hl=ja
rails マイグレートできないときにやったことのメモ（railsは初心者）

## 概要
railsで新しく`rake db:migrate`をしようとしても全くいかず`rake db:migrate:status`をすると下記のようなイメージ
```terminal
   up     20171015134104  Add categories
   up     20171017102838  Change article categories
   up     20171101225726  Change article category nil true
   up     20171231130107  Add comment type to item comments
   up     20180513165804  Add is deliver mail to supervisor
   up     20180625170224  Media status to articles
   up     20180827045902  Add image description to item images
   up     20180903230206  Devise create gym accounts
   up     20180904064121  Create tables matching
   up     20181029235907  Add source url to gym tables
  down    20181119064854  Change gym table
  down    20181129052654  Create pickup gyms
  down    20181203032628  Change gym tables
  down    20181205053310  Create gym interview tables
  down    20181206025619  Change gym page table
```

知っている情報は`migrate`　と `create`とかそんなレベル
とはいえ、今の職場でrailsができる人に聞いたことのキオクを頼りに色々と調べてみる



### rake db:reset
これはよくわからずに使った笑
とはいえ、調べてみるとこの記事にたどり着いた
https://qiita.com/mom0tomo/items/a252ff8a42eea00f81b1

とりあえず使ってみる、migrateできるかやってみる

けどだめぽだったので、よーく見てみると
そもそも`rake db:reset`はまとめてやってくれるっぽいらしい（今メモ書きなので、さっき見た記事を決してわからなくなったので後でまた書きます）
とはいえ、`migrate:status`をみてもだめだったのでどうしようかと思って最初からmysqlのDBを消したり、あーでもないこうでもないとかやっていたらとある記事にたどり着いた

### rake db:statusでdownになっているやつをupするとか
https://qiita.com/youcune/items/5cb4dd151ce359c6a399
この方の記事がとても助かった

`rake db:migrate:redo VERSION=xxxx`
※xxxに`migrate:status`でdownになっているやつの番号をいれる


一旦これで動いたので、とりあえずメモ
何をしてどうなっているかはまた調べよう。。一応フロントエンドなのだがrailsも面白く感じてきてしまいました。
Unityを使った研究例

こんにちは!! Unityメンターのちぇるです．
[Life is Tech! Tokai Mentors Advent Calendar 2018 15日目](https://qiita.com/advent-calendar/2018/lit-tokai-mentors)の記事になります．

僕は普段，大学院で藻の研究をしています．
しかし僕の興味の範囲は藻につきません．
たまに自分の研究に関連したテーマの研究について調べたりします．

そして来たるアドベントカレンダー．
せっかくだからこの記事を読んでいる方にも大学の研究に少しでも興味を持って欲しい．
そんな思いがあったので僕が普段ゲーム開発に使っているUnityを使った研究を調べました．

というわけで今回はUnityを使った研究で面白そうと思ったものについて紹介します．

#研究紹介
###展示への応用
展示にUnityの技術を使って新しい展示を創出するという研究を行なっている研究室があります．
[東京大学 廣瀬・谷川・鳴海研究室 ](http://www.cyber.t.u-tokyo.ac.jp/ja/projects/)ではバーチャルリアリティ技術によって生み出されるコンテンツや技術の展開を対象としている研究室です．
デジタルミュージアムの実現を目指しているようで，
研究紹介の中で特に面白いと思ったのは「思い出のぞき窓」というアプリです．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/248631/6d916509-5f91-84fa-b2ee-d030b7acdd8f.png)
(廣瀬・谷川・鳴海研究室 - 東京大学 より)

ミュージアムや市街地の公共空間において，映像資料や昔の風景を現在の風景に重ね合わせ
鑑賞する展示システムです．

実際にアプリとしてもリリースされており自分の手で思い出の風景を再現することができます．

![スクリーンショット 2018-12-14 13.54.00.png](https://qiita-image-store.s3.amazonaws.com/0/248631/8061caf1-6e65-8a4d-69f8-f09b4d881dd2.png)
(思い出のぞき窓 より)


百聞は一見に如かずということで
[思い出のぞき窓](http://nozokimado.org/gallery.php)をダウンロードをしましたが
名古屋で思い出をのぞける場所はまだ少ないようです．

これ以外にも面白い研究研究プロジェクトを行なっていました．
というわけでUnityをゲーム開発ではなく，
展示をより面白くするツールとして使う面白い例でした．

###医療への応用
Unityは医療にも応用されています．
難しい手術で失敗しないため仮想上でシミュレーションの訓練を行なうことがあります．

しかし訓練の内容によっては
3次元構築モデル構築の精度や操作の容易性に問題があるために
手術の内容によっては仮想上での訓練を用いない場合があります．

東京大学院医学系研究科脳神経外外科の庄野直之先生や金太一先生は
高度な技術が用いられる脳動脈瘤の手術のシミュレータの開発をUnityで行なっています．

手術で使う器具はMayaで作っていて経済的効果もあるらしいです．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/248631/f843bdb3-b845-40c4-d323-a46362ff6d3a.png)
(Unity探検隊 医療現場にUnityを。脳動脈瘤の手術現場で使われるVRとは？ より)

Unityを使った医療の現場での仮想訓練・・・。
医療の現場のみならず様々な場面の訓練でもUnityは活躍しそうですね．
UnityのみならずMayaや画像処理といった様々な技術が求められる研究例でした．

#最後に
この記事ではUnityを使った大学の研究例を紹介しました．
何か面白そうな研究はあったでしょうか?

何か自分の特技・スキルや趣味・好きなことから，
新しく好きなことや，やりたいことを発見することは楽しいことですし成長もできます．

あなたの好きなことは何でしょうか?
自分の好きなことから様々な発見が生まれることを願っています．

**参考URL**
思い出のぞき窓
http://nozokimado.org/gallery.php
廣瀬・谷川・鳴海研究室 - 東京大学
http://www.cyber.t.u-tokyo.ac.jp/ja/projects/
脳動脈瘤クリッピングシミュレータの開発 J-Stage VR医学
https://www.jstage.jst.go.jp/article/jmvr/13/1/13_20/_article/-char/ja/
Unity探検隊 医療現場にUnityを。脳動脈瘤の手術現場で使われるVRとは？
https://madewithunity.jp/info/clip-sim/
【Git】ブランチの作成

##何故やるのか
一般的にはmaster、devなどのブランチを用意し、ローカルで作業したものをまずdevなどにマージして最終的にリリースする時にmasterにpushするためです。

##pushって何
gitに記録するためのコマンドです。


gitの流れを超端的に言うと
・ git add .
・ git commit -m 'other_comment'
・ git push


の繰り返しです。


##解決策
```
git checkout b branch_name
```

```
git branch
```
```
* master
  dev
```

のようになっているかと思います。



##おわりに
gitはわからないことだらけです。
デキるエンジニアはなんでもかんでも簡単と言いますが、我々出来ないエンジニアには難しいのです。
それは恐らく理解するポイントが違うのではないかと思います。

自分は一連の動作はできますが、ちょっと他の企業さんから「弊社のリポジトリを使ってください」とか言われると頭真っ白になります。
それは仕組みを全然理解していない証拠なので、理屈を学びながら少しずつステップアップしていこうと思っています。

それでは、初心者の皆様一緒に頑張りましょう！
Lambda Layersにnode.jsの自作関数を追加する

re:Invent 2018で発表されたAWSのLambda Layersを触ってみたので備忘録兼ねての投稿です。
まだLayers + node.jsの話が詳しくまとまってるところがあんまりなかったのでちょっとでも参考になれば幸いです。(pythonはちょいちょいあった)
なお、筆者は普段Androidエンジニアで実際のところ門外漢なので、用語とか理解とか間違ってたらマサカリ投げてください。
泣きながら直します。

# Lambda Layersとは
ざっくりいうと共通のモジュールをまとめといて複数のLambdaで使い回せるよって機能。

# Layers + node.jsのディレクトリ構成
こんな感じ

```
hoge-layer
    ├── layer
    │   └── nodejs
    │       ├── node_modules
    │       │   └── (入れたいモジュールたち)
    │       ├── package.json
    ├── serverless.yml
```

serverless.ymlの中身は以下の通り

```yml:serverless.yml
service: hoge-layer
frameworkVersion: ">=1.34.0"
provider:
  name: aws
  runtime: nodejs8.10

layers:
  hogeLayer:
    path: layer
    compatibleRuntimes:
      - nodejs8.10
```
注意点としてはserverlessのバージョンを1.34.0以上にしないとLayers対応してないので、
古いバージョンを使ってる人は更新しよう。

# ローカルモジュールを追加したい
上記で既存のモジュール(momentとか)は入れられたので自作の関数を入れてみようと構成を以下のように変更した。

```
hoge-layer
    ├── layer
    │   └── nodejs
    │       ├── node_modules
    │       │   └── (入れたいモジュールたち)
    │       ├── package.json
　　　　　　　　│　　　　　　    └──　hoge_function <- 追加
    │           └── hoge.js
    └── serverless.yml
```

ただし、これだとLambda側でrequireするときに

```
const hoge = require('/opt/nodejs/hoge_function/hoge');
```
みたいな書き方をすると動くには動くけど開発環境だと実行できないとのこと。
そこで

```
const hoge = require('hoge');
```
で動くようにするために以下の手順を実施する。
1. hoge_functionディレクトリでnpm installを実施
2. nodejsディレクトリのpackage.jsonのdependenciesにhoge_functionを追記
3. nodejsディレクトリでnpm installを実施
4. デプロイ

これでrequire('hoge')で動くようになった

# 動くようにはなった、が・・・
結論から言うと自作のローカルモジュールをLayersに入れるのはあまり便利ではなさそうらしい。
ローカル環境で開発する際に結局そのモジュールがないと動かないから。
共通モジュールならローカルにも入ってるはずなのでパスを切り替えれば動くらしいので、
Layers自体が使えないってわけではないけどちょっと思惑とは違った結果になった。
（この辺は聞いた話なのであんまりわかってない）
【Power BI】表でやるか、裏でやるか

この記事は[Microsoft Power BI Advent Calendar 2018](https://qiita.com/advent-calendar/2018/powerbi)に参加しています。

##累計グラフをPoewr BIってみんとする

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/221359/c91bc512-30c9-8169-c730-74d7703212c2.png)

↑こんな感じの前年・当年・予算の累計グラフが大好物な弊社。
今まではPower BIでの作成方法がわからず、お得意のAccessで加工した元データを、Excelに出力して、VBAで足し算させていくという方式で更新していましたが、そろそろPower BI力を上げていかねばと一念発起して、チャレンジしてみました。

自分用語でレポート作成画面を「表」、クエリエディター画面を「裏」って呼んでます。
技術的なことよりも、あんまり何も考えずに作ると、裏でも表でも項目作ったりしちゃうよね、ほんとはどっちかでまとめた方が後からみてわかりやすいんじゃないかなってお話です。

##まずは裏で
まずは裏で、当年と前年を識別するフラグ項目を作成。裏の方が慣れているので、必要な項目は全部裏で作っちゃおうと思いました。
「当年」という項目を作って
```
DateTime.ToText(DateTime.LocalNow() + #duration(0,9,0,0),"yyyy")
```
「年度抽出」という項目でフラグをたてます。

```
if [当年]=[YYYY]
 then 1
 else
  if [当年]-1 =[YYYY]
   then 2 
   else 0
```

##それから表でメジャーを作ろうと思ったら・・・・
これで準備はオッケー！とクエリの適用をして表へ。
早速前年、当年、予算の累計を出すメジャーを！
・・・と思ったらなんかうまくいかない。

あれこれ試行錯誤して、前年の日付をと今年の日付に読み替えてあげなくちゃと思い、また裏に戻って項目つくるの面倒だ・・・・
項目は裏でまとめて作ろうと思ったのに、あっさり表でつくっちゃうことにしました。

```
グラフ用日付 = if('実績'[年度抽出]=2,
DATE(YEAR('実績'[Invoice_Date])+1,
MONTH('実績'[Invoice_Date]),
DAY('実績'[Invoice_Date])),'実績'[Invoice_Date])
```
年度フラグが2（前年）だったら、Invoice_Dateに１年足す。

##それから表でメジャーを作ろうと思ったら・・・再び

これで日付が揃ったので、やっと累計のメジャーを書く。
```
前年累計 = CALCULATE(sum('実績'[金額]),'実績'[年度抽出]=2,
FILTER(ALLSELECTED('実績'),'実績'[グラフ用日付]<=MAX('実績'[グラフ用日付])))
```
```
当年累計 = IF(MAX('実績'[グラフ用日付])<=TODAY(),
CALCULATE(sum('実績'[金額]),'実績'[年度抽出]=1,FILTER(ALLSELECTED('実績'),
'実績'[グラフ用日付]<=MAX('実績'[グラフ用日付]))),BLANK())
```
最後の「BLANK()」がないと今日以降が平らになってしまうので、今日以降の線を引かせないためです。

##まだまだ足りない項目・・・
実績は実績テーブルから、予算は予算テーブルから、それをカレンダーテーブルでリレーション。
さて、グラフに値を配置・・・・
と思ったら、使っているカレンダーテーブルの日付が「YYYYMMDD」形式になってるのでなんかうまくない。
で、YYYYMMDD形式を日付形式に変換。

これでやっとこさ完成！
もっとスマートな方法もあるかと思うのですが、これでよしとする！

##まとめ
結論としてはたぶん表でやっても裏でやってもできることはどっちでやってもいいのでしょうが、どちらかに寄せた方がいいのではないかと思いました。

しかし、もともとプラグラマー脳みたいなものが未発達なせいか、必要な事前準備がきちんとできずにどうしても手戻りが発生してしまいます。
項目名なんかもテキトウになっちゃうので、あとから見て「？」となってしまう・・・
これは慣れていけばできるようになるものなのか、それともちゃんと訓練（？）しないとダメなものなのでしょうか・・・・？


（初Qiita記事でレイアウトなどお見苦しいところがあるかと思いますが、やさしい気持ちで読んでいただけるとありがたいです。）
googleスプレットシートの表をmarkdownで出力したい

追記: 2021年9月
いつの間にか、MarkdownTableMakerは使えなくなっていたので、、、
それに変わる同等のツールをこちらで紹介
[【googleスプレットシートの表をマークダウンで出力したい時の便利ツール】](https://test-hack.com/google%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%88%e3%82%b7%e3%83%bc%e3%83%88%e3%81%ae%e8%a1%a8%e3%82%92%e3%83%9e%e3%83%bc%e3%82%af%e3%83%80%e3%82%a6%e3%83%b3%e3%81%a7%e5%87%ba%e5%8a%9b%e3%81%97/)

------------------
markdownで表作るの | この線いっぱいあって目がしょぼしょぼしてくる。。。つらい。
そんなとき

## MarkdownTableMaker使うと楽！

![スクリーンショット 2018-12-14 11.22.34.png](https://qiita-image-store.s3.amazonaws.com/0/148127/36ab058d-28d1-b4f3-91a0-dd8c78e89347.png)

## 導入手順

1. 適当なスプレットシートを開く
1. メニューにあるアドオンをクリック
1. アドオンを取得をクリック
 ![スクリーンショット 2018-12-14 11.24.00.png](https://qiita-image-store.s3.amazonaws.com/0/148127/99834654-18e2-bde7-de1e-3b60707c56e1.png)
1. アドオンウィンドウでMarkdownTableMakerを検索
1. "+無料"ボタンをクリック
1. アカウント選択画面が出てくるので使用したいアカウントを選択
1. [MarkdownTableMaker が Google アカウントへのアクセスをリクエストしています] のウィンドウが出てくるので"許可"をクリック

## 使い方
1. markdownに出力したい表の範囲を選択
1. メニューのアドオン -> MarkdownTableMaker -> Convert range to table.. を選択
![スクリーンショット 2018-12-14 11.33.21.png](https://qiita-image-store.s3.amazonaws.com/0/148127/e0e589e5-0a3a-8dbe-c54f-33c4dd1e8398.png)
1. 画面右の方に出力されたmarkdownが表示するので、あとはそれをコピペして使う
![スクリーンショット 2018-12-14 11.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/148127/43ad12eb-b01f-3441-9a62-910583412e7b.png)

以上、便利！

## ダウンロード

こちら！
https://gsuite.google.com/marketplace/app/markdowntablemaker/46507245362
Serverless Webpackでオプションの値を受け取る

```
$ sls deploy --stage=staging
```
みたいな感じでビルド時に渡したオプションをWebpack側でも受け取って使いたいなーと思って調べてたら案外簡単だったのでメモ。

https://github.com/serverless-heaven/serverless-webpack/issues/301

webpack.config.jsで下記のコードを書けば受け取れる。

```
const slsw = require('serverless-webpack');
const stage = slsw.lib.options.stage;
```

あとはオプションの値に合わせて、DefinePluginとかで設定してやれば良い。

```
  plugins: [
    new webpack.DefinePlugin({
      HOGE: JSON.stringify(SETTINGS[stage])
    })
  ]
```
C#(OpenCV for Unity)でconnectedComponentsWithStatsを使う

#connectedComponentsWithStatsとは
[リファレンス(OpenCV公式)](https://docs.opencv.org/3.0.0/d3/dc0/group__imgproc__shape.html#gae57b028a2b2ca327227c2399a9d53241)
[リファレンス(OpenCV for Uniy)](https://enoxsoftware.github.io/OpenCVForUnity/3.0.0/doc/html/class_open_c_v_for_unity_1_1_imgproc.html#ad87c662fe4cf039dfe5cf1e362c4fb6e)
二値画像に対してラベリングを行い，さらに各領域の面積や重心などの情報を取得できる関数です．

情報を取得できるものの，それらを参照する方法が結構ややこしいです．C++での参照の仕方は[この記事](https://qiita.com/wakaba130/items/9d921b8b3eb812e4f197)に書かれていますが，C#(OpenCV for Unity)で参照しようとして時間がかかったので書き残します．

#関数の仕様
関数の使い方は以下のとおりです．

```cs
var nLabels = connectedComponentsWithStats(src, labelImg, stats, centroids);
```
入力srcに対してラベリングした画像がlabelImgに，面積等の情報がstatsに，重心の位置がcentroidsに格納され，ラベル数を返します．
ややこしいのが，statsもcentroidsもMat型である点です．Listとかの方が扱いやすそうですが，なにかMatにする利点があるんでしょう．

#statsの参照方法
[参考元](https://teratail.com/questions/112820)

```cs
double area = stats.get(label, CC_STAT_AREA)[0];
```
labelはラベル番号です．Mat.get()はdouble型の配列を返しますが，この場合label番目の領域の面積だけが返ってくる（要素数1）ので添字0をつけます．CC_STAT_AREAを変えればstatsの各情報を参照することができ，labelをイテレータとしてfor文で回せば全領域の情報を参照できます．

#centroidsの参照方法
[参考元](https://stackoverflow.com/questions/34470927/connectedcomponentswithstats-return-types-and-values-in-java)

```cs
Point centroid = new Point(centroids.get(label, 0)[0], centroids.get(label, 1)[0]);
```
こちらもstats同様に，get()でラベル番号を指定します．第2引数に0を指定するとx座標が，1を指定するとy座標がそれぞれdouble型の要素数1の配列で返ってくるので，添字[0]を指定します．

#まとめ
Mat.get()は単に指定した座標の画素値を取得するメソッドだと思っていたので，今回のような使い方は理解するのに時間がかかりました．なんでMat型で返すんだろう...
PythonによるUDP通信

# はじめに
よくUDP通信をするので、まとめてみました。内容はコメント通り。

# 送信
```python
from socket import socket, AF_INET, SOCK_DGRAM

HOST = ''
PORT = 5000
ADDRESS = "127.0.0.1" # 自分に送信

s = socket(AF_INET, SOCK_DGRAM)
# ブロードキャストする場合は、ADDRESSを
# ブロードキャスト用に設定して、以下のコメントを外す
# s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

while True:
    msg = input("> ")
    # 送信
    s.sendto(msg.encode(), (ADDRESS, PORT))

s.close()
```

# 受信
```python
from socket import socket, AF_INET, SOCK_DGRAM

HOST = ''   
PORT = 5000

# ソケットを用意
s = socket(AF_INET, SOCK_DGRAM)
# バインドしておく
s.bind((HOST, PORT))

while True:
    # 受信
    msg, address = s.recvfrom(8192)
    print(f"message: {msg}\nfrom: {address}")

# ソケットを閉じておく
s.close()
```

# 参考
https://ameblo.jp/oyasai10/entry-10590541669.html
PfGA for ディープラーニング（続き）

##前回の続き
前回投稿した　[パラメーターフリー遺伝的アルゴリズムでディープラーニングのハイパーパラメータを解く](https://qiita.com/magokorokun/items/11e779ec4ab6896cfc1b)　で説明できていなかったことを少し補足するのと、一部機能追加したので触れておきます。

##GAAP
PfGA（パラメーターフリー遺伝的アルゴリズム）が比較的小家族で世代交代していく方法であることに対して、GAAPというPfGAの進化版も発表されています。これは優秀な両親はたくさんの子供を作ることができる、というルールが追加されたものです。よって、母集団はPfGAよりも増えていきますが、通常のGAではこちらの方が優秀な結果がでることが多いようです。
今回はディープラーニングが適合度評価の対象になるため、前回の記事で記載したように母集団はできるだけ少ない方が時間的問題から良いことから、GAAPは採用しませんでした。

##エリート保存の法則
GAでは母集団が毎回入れ替わりますが、場合によっては最も優秀なゲノムも入れ替わってしまうことがあります。その結果、次世代以降の適合度評価が下がるケースが発生してました。
エリート保存の法則はこれを避けるルールで、当世代の母集団で最優秀ゲノムは無条件に次世代に残る権利を得られるというものです。PfGAやGAAPでは、結果的にこのルールが適用されています。

##移住型GA
このエリートを活用した移住型GAとう手法も発表されています。これは、複数の母集団を作り、それぞれで世代交代しながら進化させていく並列GAのようなものですが、それぞれの母集団でレコード更新した優秀なゲノムは他の母集団に一定確率で移住（というかコピー）する権利を得るというのが特徴です。
このルールによって、複数の母集団が切磋琢磨（？）しながら進化していくことになり、通常のGAではこれが最も良い結果を出します。今回は母集団が増えること自体が時間的にNGなため見送りました。

##初期母集団へのエリートゲノム投入
実は今回、ある事件が起きまして･･･（学習中のPCがWindowsUpdateの自動更新で再起動されたｗ）せっかく良い感じに成長していたゲノムが消えてしまいました。初歩的なミスですねｗ
幸い、下記のようなログを出していたので、最優秀ゲノムの遺伝子の値は残ってたため、これを再度学習開始する際に、初期ゲノムとして注入しようと思い、機能追加しました。

```
gen:1 best-value:0.6301846504211426 best-gene:[0.0001, 5, 0.5, 0.5, 0.7, 0.7, 2, 1.0, <class 'chainer.optimizers.ada_delta.AdaDelta'>]
gen:2 best-value:0.6301846504211426 best-gene:[0.0001, 5, 0.5, 0.5, 0.7, 0.7, 2, 1.0, <class 'chainer.optimizers.ada_delta.AdaDelta'>]
```

まず、下記のようにPFGAクラスの初期化の際に、エリートゲノムが指定されていたら、それを初期母集団とするコードを追加しました。

```python:
class PFGA():
    def __init__(self, gene_len, evaluate_func=None, better_high=True, mutate_rate=0.05, elite=None):
        self.family = []
        self.gene_len = gene_len
        self.evaluate_func = evaluate_func
        self.better_high = better_high
        self.mutate_rate = mutate_rate
        self.generation_num = 0
        
        if elite is not None:
            for e in elite:
                self.add_elite_population(e)
        
    def add_elite_population(self, elite_gene):
        new_gene = []
        new_gene.append(elite_gene)
        new_gene.append(None)
        self.family.append(new_gene)
```

次に、ディープラーニング側の評価用クラスでエリートゲノムの遺伝子値を0～1のFloat値に変換するコードを準備します。

```python:
class Evaluate_cnn():
    def add_elite(self, gene):
        elite_gene = []
        for i in range(len(gene)):
            x = self.gene_list[i].index(gene[i])
            elite_gene.append((x / len(self.gene_list[i]) + (0.5 / len(self.gene_list[i]))))
        return elite_gene
```

最後にディープラーニング側の初期化時点で、ゲノムの遺伝子値を複数（下記例では１固体）指定するだけで、いきなり優秀な母集団で学習開始することができます。

```python:
    elite_genom = []
    elite_genom.append(ev.add_elite([0.0001, 5, 0.5, 0.5, 0.7, 0.7, 2, 1.0, optimizers.AdaDelta]))
    
    ga = PFGA(9, evaluate_func=ev.evaluate, better_high=True, mutate_rate=0.25, elite=elite_genom) 
```

とりあえずはこれだけです。
[ABAP]内部テーブルの特定項目のみを別テーブルに抜き出す(Extract Field Values In Internal Table)

Qiita初投稿になります。よろしくお願いします。

CL_ABAP_CORRESPONDINGという面白そうな標準クラスを見つけたので、内部テーブルの特定項目のみを
別テーブルに抜き出すというサンプルコードを書いてみました。

src_tbl：抽出元テーブル
del_dup： 'X'の場合、重複値を除外(DELETE DUPLICATE)した結果を返す
out_tbl：抽出先テーブル。src_tblから抜き出す項目と同一名項目を持つ必要があります（当たり前:smiley:）

例えば、メインテーブルとは別にコードのテキスト値を取得する際に値一覧テーブルを取得後、
それらをFor all entriesのテーブルとして指定するなどしたら便利ではないでしょうか。

```ABAP:SAMPLE_CL_ABAP_CORRESPONDING
REPORT Y_SAMPLE_CL_ABAP_CORRESPONDING.

* 参照PGM：DEMO_CORRESPONDING_CLASS_TB

   TYPES:
     BEGIN OF line1,
       matnr TYPE mara-matnr,
       meins TYPE mara-meins,
       mtart TYPE mara-mtart,
       matkl TYPE mara-matkl,
     END OF line1,
     BEGIN OF line2,
       meins TYPE mara-meins,
     END OF line2,
     BEGIN OF line3,
       mtart TYPE mara-mtart,
     END OF line3.
 
   DATA:
     itab1 TYPE TABLE OF line1 WITH KEY matnr,
     itab2 TYPE TABLE OF line2 WITH NON-UNIQUE KEY meins,
     itab3 TYPE TABLE OF line3 WITH NON-UNIQUE KEY mtart.

CLASS LCL_move_correspond DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main IMPORTING src_tbl TYPE ANY TABLE
                                 del_dup TYPE c
                       EXPORTING out_tbl TYPE ANY TABLE.
ENDCLASS.

CLASS LCL_move_correspond IMPLEMENTATION.
  METHOD main.
*   共通項目名の内容を抜き出し
    cl_abap_corresponding=>create(
      source            = src_tbl
      destination       = out_tbl
      mapping           = VALUE cl_abap_corresponding=>mapping_table(  )
      )->execute( EXPORTING source      = src_tbl
                  CHANGING  destination = out_tbl ).
    SORT out_tbl.
    IF del_dup = abap_on.
*     値の重複を除外
      DELETE ADJACENT DUPLICATES FROM out_tbl.
    ENDIF.

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

* 元となるテーブルにデータを格納 
  SELECT matnr, meins, mtart, matkl
    FROM mara INTO TABLE @itab1.
 
* meins一覧作成
  LCL_move_correspond=>main( EXPORTING src_tbl = itab1
                                       del_dup = abap_on ”値重複除外:on
                             IMPORTING out_tbl = itab2 ).
* 書き込み
  cl_demo_output=>write( itab2 ).

* mtart一覧
  LCL_move_correspond=>main( EXPORTING src_tbl = itab1
                                       del_dup = abap_on
                             IMPORTING out_tbl = itab3 ).
* 書き込み
  cl_demo_output=>write( itab3 ).

* 書き込んだ内容を表示
  cl_demo_output=>display( ).
```
Erlangの型検査ツールDialyzerの実装を読む

> 型システムとは、プログラムの各部分を、それが計算する値の種類に沿って分類することにより、プログラムがある種の振る舞いを起こさないことを保証する、計算量的に扱いやすい構文的手法である。

「[型システム入門](https://www.ohmsha.co.jp/book/9784274069116/)」より

## 概要

Erlangの型検査ツールであるDialyzerの振る舞いを理解したいという目的でソースコードを読みます。対象とするOTPバージョンは21.1.4です。

- https://github.com/erlang/otp/blob/OTP-21.1.4/lib/dialyzer/src/

## 対象とする読者

- Dialyzerの挙動を学びたいErlangプログラマー
- 型システムに興味のある人

## Dialyzerの中身

おおざっぱなコールグラフを示します。私が重要だと感じた関数のみを記載しほとんどのプライベート関数や型検査に直接関係なさそうな多くの関数を省いています。

![out.png](https://qiita-image-store.s3.amazonaws.com/0/8169/e24b96a5-079c-5f3e-2b3e-cba1b8e0c0e5.png)

`dialyzer_worker` モジュールの `launch` 関数は4つのモードごとに違った仕事を非同期的に行います。dialyzerはPLTを作成する `plt_build` とそれを使って型検査する `succ_typing` という2つの処理がありますが、前者では `typesig` モードの仕事を、後者では `typesig`, `dataflow`, `warning` の3つの仕事を行うようです。なお `compile` モードはソースから型検査する場合にbeamファイルを作成するということをやっているようですが今回の興味からは外れるため省略しています。

### success typing

DialyzerはSuccess typing[^LS06]と呼ばれるアルゴリズムを基礎にしています。そのアルゴリズム が実際に行われる部分は `dialyzer_typesig:analyze_scc` と思われます。型付け規則による型導出が `traverse` 関数、制約解消を行うのが `solve` 関数で、論文の内容とおおよそ合致します。

[^LS06]: http://www.it.uu.se/research/group/hipe/papers/succ_types.pdf

### 論文に記載されなかった詳細や論文との相違

#### 型付け規則の[ABS]規則

論文では[ABS]規則において

```math
\tau = ((\tau_1,...,\tau_n) \to \tau_e \texttt{ when } C)
```
のような制約をつけており、$$\tau \texttt{  when  } C$$ のような制約をもった型が必要のように読めますが、実際には必要なく次のような規則で実装されています。

```math
\frac
{A\cup \{x_1\mapsto \alpha_1,...,x_n\mapsto \alpha_n\} \vdash e : \tau_e, C} 
{A\vdash \texttt{fun}(x_1,...,x_n) \to e : (\alpha_1,...,\alpha_n) \to \tau_e, C}
[\text{ABS}]
```

#### 型付け規則の[CASE]規則

TODO

####  solveにおける型変数への型割り当ての初期値

solveでは型変数へ割当たる型を狭めていくという方針で制約解消を目指しているようです。初期値は `any()` 型とするようです。


## よくある質問

TODO

## 宣伝

dialyzerより軽くて早いErlangの型検査ツールをOCamlで開発しています。

- https://github.com/dwango/fialyzer/
Hackney による HTTP アクセスのデバッグ

_(2018.12.16 追記)_ hacknet_trace は標準出力および Port への書き出し、または全てのイベントを関数でハンドリングすることしかできません。これだと、Phoenix プロジェクトでは気軽に使えないので、

- Plug 化
- Elixir の Logger への対応
- トレース内容の文字列を関数でハンドリング

に対応したモジュールを [plug_hackney_trace](https://github.com/ishikawa/plug_hackney_trace) として公開しました。

## hackney_trace とは？

多くの Elixir (Erlang) プロジェクトで使われている HTTP ライブラリである [hackney](https://github.com/benoitc/hackney) の、内部で起こっていることをトレースできるモジュールが [hackney_trace](https://github.com/benoitc/hackney/blob/master/doc/hackney_trace.md#type-trace_level) です。

### すべてのトレースを標準出力に

```elixir
iex> :hackney_trace.enable(:max, :io)
:ok
```

こんな感じで色々な情報が出力されます。

```elixir
iex(3)> HTTPoison.get("http://google.co.jp")
[hackney trace 80 <0.545.0> 2018:12:14 03:56:23 4723] request
   Content: [{module,hackney},
             {line,307},
             {method,get},
             {url,{hackney_url,hackney_tcp,http,<<"google.co.jp">>,<<>>,
                               <<"/">>,<<>>,<<>>,"google.co.jp",80,<<>>,<<>>}},
             {headers,[]},
             {body,<<>>},
             {options,[]}]
[hackney trace 60 <0.545.0> 2018:12:14 03:56:23 4723] request without proxy
   Content: [{module,hackney},{line,679}]
[hackney trace 60 <0.545.0> 2018:12:14 03:56:23 4723] connect
   Content: [{module,hackney_connect},
             {line,35},
             {transport,hackney_tcp},
             {host,"google.co.jp"},
             {port,80},
             {dynamic,true}]
[hackney trace 80 <0.545.0> 2018:12:14 03:56:23 4724] no socket in the pool
   Content: [{module,hackney_connect},{line,230},{pool,default}]
```

### トレースの無効化

```elixir
iex> :hackney_trace.disable()
stop trace at 2018:12:14 03:59:09 419
:ok
```
botでSlackの散らばった発言をまとめて全体把握する話

[Aptpod Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aptpod) 14日目の記事です。

CTO の梶田です。
今回初めての試みとして、会社([アプトポッド](https://www.aptpod.co.jp/)) で アドベントカレンダーをやってみたという感じなのですが、
みんなちゃんと期日通りに埋めてくれて偉い！
まだまだ書ける人が少なくて4記事書く猛者もいて素晴らしい。

今までは、会社としてあまり公にはできてなかったですが、これに限らず、できる範囲で広げていく・続けていくことができればと思ってます！

さて、自分としては、最後の方に予約して余裕持っていたのですが、
埋まらない！？といことだったのでここで入れてみました。

まず最初の記事としては、Slackネタをゆるーく書いてみようと思います。

## 背景
弊社の中でのコミュニケーションハブとして担っているのがSlackで
コミュニケーションだけでなくアプリケーションとつないだり、監視したり等々、
なくてはならない存在となっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/48545/c90c30ea-7aae-00da-12fc-a15123fbb0d2.png)



流行る前から使っており、けっこう経つのですが、
人や案件/プロジェクト/製品が増えるにあたり、チャンネルがどんどん増え
けっこう辛い状況となってきました。。。

よくある話ですね。。。（汗

## モチベーション / きっかけ
課題解決！というか

> 何がどうなってるかわからない

ということをちらちら聞いていたので
[Slackに #timeline channelをつくった話](https://qiita.com/kozyty@github/items/2a87bf7e652765b9967d)
記事を参考に前から作ってたHubotの応用で簡単に
全体として俯瞰して時系列で眺める用にPublicのチャンネルを集約するbotを作って導入してみました。

古い記事でslackのAPIも新しくなっていたので遊んでみたい思いもあり。。。気分転換にやってみた感。。

他の記事も [↓参考](#参考) に

## 導入して
導入して1年以上経ちますが、1/3ぐらいにはみてもらえているようです。

- 気になる発言を拾うことができた
- 知らなかったチャンネルにJOINできた
- スレッドを拾うことができた

という声も聞くし、自分としてもTwitter好きなので便利だーという感じです。
全体の緩い把握と球拾いにイイですね！

timelineの実際はこんな感じ↓
いろんなチャンネルから時系列に並ぶ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/48545/ff9462f0-c7d2-d957-610c-0ff4bc247976.png)


# その他
Tips系を

## Hubot実装Tips
一応少しだけ書いとこう

### botのプロファイル画像取得
チャンネルのメッセージを拾ってメッセージまとめる部分で

```
module.exports = (robot) ->

  robot.hear /.*?/i, (msg) ->
    channel = robot.adapter.client.rtm.dataStore.getChannelGroupOrDMById(msg.envelope.room).name
    channel_url = process.env.SLACK_URL_BASE + msg.envelope.room
    message = msg.message.text
    username = msg.message.user.name
    user_id = msg.message.user.id
    user_image = ※msg.message.user.slack.profile.image_48
    ...

```

※部分はユーザーだと取れるがbotだとImage取れないので

```
user_image = robot.adapter.client.rtm.dataStore.bots[msg.message.rawMessage.bot_id].icons.image_48
```

botはこんな感じで取る

### メッセージの最後に対象のチャンネルを付与する

```
message += "%0A(at %23#{channel} )"
```

## 構築Tips
- 初期のモチベーションがお金かけないだったので以下のAddonを利用
- Herokuの無料枠でどうやるか

### Addon
- Hubot使うためにRedis必要なので
  - [Redis To Go](https://elements.heroku.com/addons/redistogo)
- 常時起動はお金がFreeプランではできないのでbotを2:00〜8:00までは寝るようにする（健全！？）
  - [Process Scheduler](https://devcenter.heroku.com/articles/process-scheduler)

## （おまけ）利用Tips
- チャンネルのリンクから該当箇所に飛んでしまうとどこまで読んだかわからなくなる。。。

->

1. リンクで飛ぶ前に `Star` 押してお気に入り(timelineチャンネル上のメッセージ)

2. リンクで飛ぶ

3. お気に入り一覧からJump でもとに戻る

とりあえず時間が経っても違うチャンネル行ったりしても戻れますね
で役目を終えたらお気に入り外せばよい


# 今後
timelineをカテゴリ分けたり、集計したり。。。便利/解決できることはやりたい！
という思いはある。。
できれば

# 参考
[Slack上にTimelineを形成して全チャンネルの発言をゆるく眺める](https://qiita.com/Vexus2/items/70a84b28c85fc9af14c7)

[Slackに #timeline channelをつくった話](https://qiita.com/kozyty@github/items/2a87bf7e652765b9967d)

[slackで分報をタイムライン表示して一覧性を手に入れろ](https://qiita.com/kon_yu/items/9aad8849e7cca75f2456)
[React] withRouter を使っている component を Storybook でマウントする

# 対象となる問題

`withRouter` で wrap している React component を Storybook でマウントした場合，
`props.match.params` が空オブジェクト `{}` になる．

このままだと，例えば `/users/:id` という URL で component をマウントしている場合，

```javascript
// User.js
class User extends Component {
  constructor(props) {
    this.userId = props.match.params.id;
  }
  render() {
    return (
      ...
    );
  }
}

export default withRouter(User);
```

```javascript
// Storybook
import User from './User';

stories.add('User component', () => (
  <MemoryRouter initialEntries={['/users/1']}>
    <User />
  </MemoryRouter>
));
```

というようなことをした時に `props.match.params.id` が 正しく取得できず，意図した動作にならない．

# 解決方法

`withRouter` で wrap する前の component を `export` して Storybook でマウントし，必要な `props` はその時に指定する．
`history` もその際に定義する．

```javascript
// User.js
class User extends Component {
  constructor(props) {
    this.userId = props.match.params.id;
  }
  render() {
    return (
      ...
    );
  }
}

export { User };

export default withRouter(User);
```

```javascript
// Storybook
import { User } from './User';

stories.add('User component', () => (
  <MemoryRouter initialEntries={['/users/1']}>
    <User match={{params: {id: 1}}} history={{push: () => {}} />
  </MemoryRouter>
));
```

もっといい解決方法があるような気がするので，ご存知の方がいらっしゃればご教示いただけるとありがたいです．
Node-REDで愛され雑談ボットを作ろう！

Node-REDアドベントカレンダー１６日目。
どうも、ウエンツです。

## コマンド外の会話を作るのが実は一番しんどくないですか？

とりあえずNode-REDボットを作ってみたけど、所定のコマンド以外を話しかけると
「すみません、わかりませんでした。XXXやOOOと話しかけてください」と返事をするボットって、なんだか味気ないですよね？

でも雑談って何話しかけてくるかわからないから、なにを設定すればいいやら、と思っているあなたに、WatsonAssistantをつかって簡単に雑談を作れる設定をお伝えします。

## すみません、Node-REDの設定説明はしません。

WatsonAssistantへのつなぎ方や、普通のボット対応は他の投稿者さんに任せるとして、取り急ぎはどのようにしたら雑談設定したら良いかをお伝えします。

というわけでNode-RED内で必要な箇所にWatsonAssitantにつないだら、動作するために必要な設定をしたら、WatsonAssistantの設定に入ります。

## WatsonAssitantの設定のコツ

### どのような雰囲気の言葉を言われたか？を定義する
私は以下のように設定しています。

<img width="975" alt="スクリーンショット 2018-12-14 12.20.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/23230/4d9dfabb-1a81-085e-9fb3-5dfeaeaaf60c.png">
▲何をされたか？を上手にカテゴリ化するのがポイント

これに至った理由は、人間そんなに長い言葉をBotに話しかけないということに気づいたからです。

「ねえねえ」とか「なんで？」とか「使えねえ」とか「まじかよ」とか結構短い言葉をみんな話しかけてきます。雑談といいつつも話題とかではなく、ホント中身のない言葉をかけてくることが結構多いんですね。なので、その言葉に込められている感情を汲み取り、それに対する反応を作る、という感じで作ると意外と会話ができます。

ちなみに、反応単語には以下のようなものを設定しています。人は感情のないボットにはいろんな悪口を投げかけてきます。ひどいですね。

<img width="669" alt="スクリーンショット 2018-12-14 12.30.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/23230/f16a5a9e-f9ef-9cde-965f-ca2246521873.png">
▲言われた悪口コレクション

### 相づちっぽい言葉を返し、卑屈にならない

世の中のだいたいのボットは人の言いなりになり、出来ないことがあると「使えねーやつだな」という気持ちになってしまいます。

しかし、そんな言葉に対して強気に反してくるボットにすると、「おっ、何だこいつ」となり、ちゃんとコマンド通りに動くと「わあ、まともにいう事聞いてくれた！うれしい！」という気持ちになることがあります。人間チョロい。

なので、各インテントに私は以下のように口の悪いキャラクターを設定しています。

<img width="1610" alt="スクリーンショット 2018-12-14 12.32.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/23230/f0f933c9-ff3d-25f6-7aa2-6ef9ec13e015.png">

ただ見ての通り、口が悪いだけではなく、時々素直に言われたことを受け止め感情を出す面なども用意し「おっ、どうした今回」「ひどいこと言っちゃったなあ」と人間に思わせると、親しみやすさが出て愛されるようになります。まあこのあとすぐに超煽ってくるんですけどね。でもそうなると「よかった、いつものボットに戻った。元気になったんだね」と人間はホッとします。ほんと人間チョロい。

<img width="418" alt="スクリーンショット 2018-12-14 12.45.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/23230/aa315072-7932-6add-e5e1-d113aa0d5abf.png"><img width="419" alt="スクリーンショット 2018-12-14 12.58.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/23230/8f9ba219-1211-ee08-2903-94d911ba1e75.png">
▲振り回される人間

### アイコンは可愛らしく、そして動物に

こういう感情の起伏の多いボットを作ると、人間でアイコンを作ってしまうと「なんだよ、メンヘラかよ。うぜえ」という雰囲気が生まれてしまいます。

しかし動物にすることで「まあ動物だし」「人間の世界わからないもんね」「もっと俺を煽って！」という人が何故か増えることもこのボットを運用しながらわかりました。

僕は犬の設定にしています
<img width="358" alt="スクリーンショット_2018-12-14_12_41_08.png" src="https://qiita-image-store.s3.amazonaws.com/0/23230/1e0e00b0-29f4-51ac-055b-06ea10ec5346.png">
▲パシられる犬

##まとめ
こういう感じに雑談ボットを設定すると、ボットに可愛らしさが生まれ、愛されるキャラクターになります。
Node-REDでとりあえずボットを作ったけどなんか味気ないなーと思った人は、ぜひWatsonAssistantにつないで、かわいいボットを作ってみてください。
[Unity] DontDestroyOnLoad()を解除する

一度 DontDestroyOnLoad() したオブジェクトを再びLoadScene()で削除されるようにするには

```
SceneManager.MoveGameObjectToScene(gameObject, SceneManager.GetActiveScene());
```

とすればよい。

具体的には、

Sphereを置いたSceneAと
![2018-12-14_121905.png](https://qiita-image-store.s3.amazonaws.com/0/59911/4bec806c-6377-001d-03d9-a94561c68a95.png)
Cubeを置いたSceneBを作り、
![2018-12-14_121946.png](https://qiita-image-store.s3.amazonaws.com/0/59911/a0f3962a-39e1-d94b-0a18-fdf0bbdc227f.png)
それぞれのSphere,Cubeに以下のスクリプトを張り付ける

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class LoadScene : MonoBehaviour {
    [SerializeField] string m_nextScene;
	void Start () {
        DontDestroyOnLoad(gameObject);
	}
	
	void Update () {
	}

    private void OnMouseDown()
    {
        SceneManager.MoveGameObjectToScene(gameObject, SceneManager.GetActiveScene());
        SceneManager.LoadScene(m_nextScene);
    }
}
```
SceneAのSphereにはNextSceneに SceneBを、
![2018-12-14_122313.png](https://qiita-image-store.s3.amazonaws.com/0/59911/670dcda4-d11b-2303-201e-ad0514e6410b.png)

SceneBのCubeにはNextSceneに SceneAをいれる
![2018-12-14_122611.png](https://qiita-image-store.s3.amazonaws.com/0/59911/06f4d4f1-ab9b-8400-d82a-494709ce1556.png)

これで、シーンロード直後はDontDestroyOnLoad シーンに入っているSphere,Cubeが
![2018-12-14_123043.png](https://qiita-image-store.s3.amazonaws.com/0/59911/73305289-1c61-79a9-8754-205ac1e48c1c.png)

LoadScene()で消えるようになる
![2018-12-14_123131.png](https://qiita-image-store.s3.amazonaws.com/0/59911/cec13458-a6c0-056c-f240-d5f118602f87.png)

[参考文献](https://answers.unity.com/questions/18217/undoing-dontdestroyonload-without-immediately-dest.html)
Azure DevOps プロジェクトを ASP.NET Core 2.1 へアップグレード（前編）

#概要
　[Azure DevOps Projects](https://azure.microsoft.com/ja-jp/services/devops/) は、**1. 開発言語の選択、2. ランタイムの選択、3. 実行基盤の選択**という **3 つの簡単なステップ**だけで、アプリケーションの CI/CD 環境を簡単に開始できる Azure サービスです。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/3853fd3a-0f7d-6f97-6c09-441208d4a0cb.png)

#DevOps プロジェクトの新規作成
###1. 開発言語の選択
今回は .NET を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/d52ef327-ee94-3722-6229-57464799861b.png)

###2. ランタイムの選択
[ASP.NET Core](https://docs.microsoft.com/ja-jp/aspnet/core/?view=aspnetcore-2.2) を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/40d56ddd-90fc-e956-3d1b-306f648d82b2.png)

###3. 実行基盤の選択
[Linux Web App](https://docs.microsoft.com/ja-jp/azure/app-service/containers/app-service-linux-intro) を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/bcda4111-78a4-46ff-2939-51dc4aa91278.png)

　**最終ステップ**で、プロジェクト名などの各種パラメータを設定します。既存の Azure DevOps Organization がない場合は、ここで作成します。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/2db4549c-65ba-86dc-fc73-6eb840ce919d.png)


# 作成されたプロジェクトについて
　プロジェクトが作成されると自動的に CI/CD パイプラインが実行され、成功すると次のような完了通知メールが配信されます。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/7e150170-2b5c-d59d-fe29-148e06732ee5.png)

　通知メールの [View result] をクリックすると、下記のように Build, Test, Publish といった Build Pipeline の各ステップを DevOps ポータルで確認できます。各ステップ項目をクリックすると更に処理の詳細内容を確認できます。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/404558d2-9fb7-d415-caed-a9061565ba84.png)

　また上記の DevOps ポータルでなく、Azure ポータル側で作成された DevOps プロジェクトを開くと次のような画面が確認できます。これは、ひな形となるサンプルコードが Repos/Code に配置され、それをトリガーに最初の First Commit の Build Pipeline が実行され、最後に Web Apps に配置される流れを示しています。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/f064c056-f7e3-5ffa-e80a-f691156b6dea.png)

　配置されたアプリケーションは、右側の Web Apps (App Service) の Application endpoint をクリックしてアクセスできます。正常に稼働していれば下記の画面が確認できます。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/08a8bb2d-e976-ba58-d135-332aaa804b5a.png)

#次回
　今回は Azure DevOps プロジェクトの概要説明までとなりますが、ここで作成されるプロジェクトは .NET Core 1.1 ベースとなっています。次回の [Azure DevOps プロジェクトを ASP.NET Core 2.1 へアップグレード（後編）](https://qiita.com/Aida1971/items/d80a8d7a7b354949cbe7)では、このひな形を元に、.NET Core 2.1 へアップグレードする流れを説明していきたいと思います。
BoostをインストールするときにPython関連でエラー

# エラー内容

最新のBoostライブラリをインストールしようとしたら、

> fatal error: pyconfig.h: No such file or directory

というエラーメッセージが表示され、Python関連のターゲットのビルドが失敗してしまいました。
その解決法の備忘録。

# 対策

`pyconfig.h`へのパスを見つけられなかったのが原因です。`pyconfig.h`が存在しないか、通常の場所に置かれていません。`pyconfig.h`が存在しない場合は、例えばパッケージマネージャで`python-devel`や`python3-devel`などがインストールされていないことが考えられます。`pyconfig.h`が存在するにもかかわらず見つけられない場合、解決方法は

1. `project-config.jam`へ`pyconfig.h`のパスを指定する。
2. `user-config.jam`を作成して`b2`の`--user-config`オプションに渡す。

の2つです。

## `project-config.jam`へ`pyconfig.h`のパスを追加する

- [boost 1.66 - Ubuntu 16.04 - Running b2, g++ gcc cannot find pyconfig.h #289](https://github.com/boostorg/build/issues/289)

解凍したBoostライブラリのルートディレクトリにある`project-config.jam`のpython部分を以下のように修正します。私の場合はanacondaを使っていたので以下のようになりましたが、適宜自分の場合に置き換えてpythonのバージョンやパスを加えててください。

```:変更前
if ! [ python.configured ]
{
    using python : 3.6 : /home/sho/anaconda3 ;
}
```

```:変更後
if ! [ python.configured ]
{
    using python : 3.6 : /home/sho/anaconda3 : /home/sho/anaconda3/include/python3.6m ;
}
```

## `user-config.jam`を作成して`b2`の`--user-config`オプションに渡す

解凍したBoostライブラリのルートディレクトリの中の`build/example/user-config.jam`をルートディレクトリ直下にコピーして、以下の内容をファイルの最後等に追加してください。

```user-config.jam
using python : 3.6 : /home/sho/anaconda3 : /home/sho/anaconda3/include/python3.6m ;
```

そしてルートディレクトリで`b2`を実行する際に

```console
$ ./b2 --user-config=user-config.jam install
```

と`user-config.jam`を指定すればうまくいくはずです。
【MySQL】作成した後のテーブルに主キーの追加

##何故するのか
主キーを付け忘れた
後々考えたら主キーが必要だった　など

##自分がこれを行うに至った状況
既に存在するテーブルについてのバックアップを2週間ほど保存しておいて
cronで物理削除をしようとする機能を作成する時に
```SHOW COLUMNS FROM table_name;```
したら、PRIがないことに気が付いたため。


####table_A
Field| Null|Key|
|:------------------|:-----------------|:------------------|
|table_A_no| No             | PRI       |
|othertable_unique_no| Yes           | MUL        |

####table_Backup
Field| Null|Key|
|:------------------|:-----------------|:------------------|
|table_A_no| No             |               |
|othertable_unique_no| Yes           |             |

##解決策

```
ALTER TABLE table_Backup ADD PRIMARY KEY(column_name);
```

##結果
####table_Backup
Field| Null|Key|
|:------------------|:-----------------|:------------------|
|table_A_no| No             | PRI              |
|othertable_unique_no| Yes           |             |


##おわりに
othertable_unique_noカラムのKeyに「MUL」もあるけど、
バックアップテーブルにMultipleが必要かどうか。
そもそもMultipleってなんだろう。

こういうレベル感の自分が、今後も業界未経験レベルの初心者に向けて
記事を書いていきたいと思っています。
玄人様なんかには自分の記事は恥ずかしくて見せられないですが、
明らかな間違いなどありましたら指摘して頂ければと思います。


##追記
書いた後も作業してて思ったのが、バックアップ用だから同じデータが何回も入ってくるのでそもそもPRIMARY KEYである必要がなかったです。。
Dockerで手軽にlevelDB+Node.jsを動かしてみる

[levelDB](https://github.com/google/leveldb)を[Node.js実装](https://github.com/Level/levelup)で触ってみる[Dockerイメージを作成した](https://cloud.docker.com/repository/docker/sot528/leveldbtest/general)。

# 利用手順

```bash
docker run -it sot528/leveldbtest
```

# JSから挙動確認

```bash
node index.js
```

`index.js`をいじることでいろいろ挙動確認が可能。
HTML5ゲームエンジンの徹底評価[日本語訳] (4) enchant.jsとcrafty.js


こちらの記事の続き

- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (1) 2D・3D対応とプログラミング言語の比較](https://qiita.com/motoyasu-yamada/items/f4e03f98442b3ec164be)
- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (2) Three.jsとPixi.js](https://qiita.com/motoyasu-yamada/items/0139a933ded6f478f92a)
- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (3) PhaserとEgretEngine](https://qiita.com/motoyasu-yamada/items/0df8489e6ad3c9c8cefc)

# enchant.js コンセプト

Enchant.jsはエンジンではなく、フレームワークです。 同時に、enchant.jsはゲームだけでなくアプリにも使用されます。

## 設計思想

ゲームとアプリの両方の開発がサポートされており、このフレームワークは、ゲーム開発へ対応をしながらもアプリ開発への対応もされています。 アーキテクチャは、すべてがOOPに従って設計されているわけではなく、内部使用の実践が駆動(訳者注：???)され、うまく非同期処理にも対応しています。

ゲーム開発向けには、アニメーション関連の機能のみをサポートしています。 enchant.jsフレームワークはプラグインメカニズムを提供しており、使いたい機能をプラグインという形でenchant.jsフレームワークにインジェクションすることができます。

また、enchant.jsは開発者が無料で素材を使用するためのオンライン画像ライブラリを提供しています。実際にはゲームに近いレベルのゲームエフェクトすら提供されています。

## 機能
enchant.jsフレームワークは非常に限られた機能しか提供しません。追加の機能が必要な場合は、自分で拡張するか、対応しているプラグインを探す必要があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/5253bcc6-bbfe-8f97-a525-246d28f12887.png)

# craftyJSのポジショニング
craftyJSは、JavaScriptゲームのフレームワークという位置づけです。

## 設計思想

コンセプトから、craftyJSは、可能な限り小さなファイルサイズ、物理演算システム、DisplayObjectのパッケージ化、衝突検出、イベントシステムなどのAPIセットに、CanvasとDomレンダリングをあわせて提供しています。多くの機能を提供するモジュールがありますが、すべてのモジュールは、物理演算モジュールの設計に依存します。

実際に触ってみた限り、craftyJSのAPIの設計思想はイケてません。

## 機能

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/bb50efac-5a62-c4a6-3d06-b9bf4cb3742c.png)

# 続く

[HTML5ゲームエンジンの徹底評価 \[日本語訳\] (5) Turbulenz, cocos2d-js, PlayCanvas, melonJS](https://qiita.com/drafts/4265dab44bf82dc27b7b)
更新があった場合のみに実行されるlaneを作る

fastlaneを利用して継続的デリバリを行ううえで，特に更新が無ければビルド・デリバリを行わないようにしたかったので，お手軽な方法で実現してみました．

まずはコミットの有無を判定する以下のようなスクリプトを用意します．

```checkNeedsToDailyBuild.sh
#!/bin/bash

# 直近24時間のコミット情報
COMMITS_IN_LAST_24_HOURS=$(git log --pretty=%h --since="24 hours ago")

if [ -z "${COMMITS_IN_LAST_24_HOURS}" ] ; then
  # No commits exist
  echo -n "false"
else
  # Some commits exist
  echo -n "true"
fi

exit 0
```

そのうえで，laneは次のように設定しておきます．

```ruby:Fastfile
lane :deploy_only_update_exists do
  res = sh "./checkNeedsToDailyBuild.sh"
  if res == "true" then
    UI.message("Some updates exist")
    # ...
    # ビルド・デプロイ処理
    # ...
  else 
    UI.message("No updates")
  end
end
```

CI自体のスケジューリングを使ったり，[last_git_commit](https://docs.fastlane.tools/actions/last_git_commit/)の情報で判定したり，…とやり方はいろいろあるとは思いますが，スクリプトに分けておけば時間以外にも条件等の設定もしやすいかなと思ってこのような形にしています．(と言いつつ今回はやってませんが…)

もしもっといいやり方があればコメントいただけると幸いです．
Firebase Authentication でユーザーの作成日時および最終ログイン日を取得する

[Firebase Version 4.4.0](https://firebase.google.com/support/release-notes/ios#4.4.0) から Firebase Authentication のユーザー作成日時、および最終ログイン日を取得できるようになりました。

```
Auth.auth().currentUser.metadata.lastSignInDate // 最終ログイン日時
Auth.auth().currentUser.metadata.creationDate // 作成日時
```

## 参考

[ios \- Get Created date and last login date from FIRUser with Firebase 3 \- Stack Overflow](https://stackoverflow.com/questions/38174178/get-created-date-and-last-login-date-from-firuser-with-firebase-3)
PyBind11のcmake_exampleをVisual Studio 2017でデバッグ

# バージョン
Visual Studio 2017: 15.9.4
CMake: 3.13.1
cmake_example: 8818f49

# cmake_exampleとは
PyBind11のHello World。CMakeでパッケージ化できる。

# Visual StudioのCMake integrationは？
混合モード（Python / C++）でのデバッグに対応していない。[Mixed mode debugging for cmake projects](https://github.com/MicrosoftDocs/cpp-docs/issues/399)

# 準備
- Visual Studio Installerで
 - ~~32ビット版Pythonをインストール。理由：[「C++ を使用するには、32 ビットの Python インタープリターを使用する必要があります (Python 3.6 以降を推奨)」](https://docs.microsoft.com/ja-jp/visualstudio/python/working-with-c-cpp-python-in-visual-studio?view=vs-2017)~~ いつの間にか64ビットでもmixed-modeのデバッグができるようになっていた。[Debug Python and C++ together](https://docs.microsoft.com/en-us/visualstudio/python/debugging-mixed-mode-c-cpp-python-in-visual-studio?view=vs-2019)
 - Python ネイティブ開発ツールをインストール

- シェルを開いて~~32ビット版~~Pythonにパスを通す。例：

```
set Path=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_86;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_86\Scripts;%Path%
```

# 手順
まずはリポジトリから取ってくる。そしてCMakeLists.txtからsln / vcxprojファイルを生成。

```bash
git clone --recursive https://github.com/pybind/cmake_example.git
cd cmake_example
cmake -G "Visual Studio 15 2017" -A Win32 # 64ビットならx64
```

以下はVisual Studio 2017のGUIで。

1. cmake_example.slnを開いて、cmake_exampleプロジェクトをビルド。Debugフォルダにcmake_example.cp36-win32.pydができていることを確かめる。

1. ソリューションに新しいプロジェクト（Pythonアプリケーション）を追加
 - これはPythonからpydを叩くテスト用モジュール
 - 名前はpython_testとしておく

1. python_testプロジェクトのプロパティで
 - 「インタープリター」に~~32ビット版~~Pythonを指定
 - 「ネイティブコードのデバッグを有効にする」にチェック

1. ソリューションエクスプローラーでpython_testプロジェクトの中の「検索パス」を右クリック、「フォルダーを検索パスに追加」でDebugフォルダを追加

1. python_test.pyの中身を書く

```python_test.py
import sys
print(sys.path)
import cmake_example
assert cmake_example.add(1,2) == 3
```

python_test.pyを実行。もしimport cmake_exampleでコケるなら、sys.pathがDebugフォルダに通っているかどうか確かめる。
main.cppにブレークポイントを設定して実行してみて、ブレークポイントが効くことを確かめる。

# 参考
[Python 用 C++ 拡張機能の作成](https://docs.microsoft.com/ja-jp/visualstudio/python/working-with-c-cpp-python-in-visual-studio?view=vs-2017)
[cmake-generators](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2015%202017.html)
あるブランチの内容を別ブランチと同一にする

# 背景
ブランチAの内容をブランチBと同一にしたい。
`git checkout A && git reset --hard B` でもできるが、そうすると `git push --force` が必要になってしまう。
ブランチAに対して1個追加コミットする形で、ブランチBと同一にしたい。

# やり方
```
git checkout A
git checkout B .  # ブランチAのまま、Bの全ファイルをワーキングツリーにコピーする
git commit        # すでにインデックスに追加されているので、コミットするだけでOK
```

参考：
https://stackoverflow.com/questions/35174544/git-how-to-copy-contents-of-one-branch-to-other-branch
社内新人勉強会のまとめ【Java】

###はじめに
社内の新人勉強会でJavaについてを勉強しています。
勉強した内容の中で特に興味深かった点をまとめてみました。
第1～4回はProgate・スッキリわかるJava、第5回はスッキリわかるJava実践編を使って勉強しています。

Progateについては下記サイトへGO
https://qiita.com/wdmmm/items/0fa27221498e767c953a

##第1回　変数名のつけ方
<img width="300" alt="iOS の画像 (1).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/322324/84413ac7-cf56-a0c6-944b-817b57df3b5f.jpeg">

変数名は基本キャメルケースで書く。
例：userName

マジックナンバーは基本使用しない。
例：name1, name2, name3,...

変数名は省略しすぎても長すぎてもダメ。。。

####☆おすすめされた本☆
・リーダブルコード

##第2回　値渡しと参照渡し
####値渡し

基本データ型の変数の値自体を渡すことを値渡しといいます。

####参照渡し

基本データ型以外の変数の参照を渡すことを参照渡しといいます。

※Stirng型は参照渡しであり、生成後に文字列を変更できない不変型(immutable)です。

##第3回　スレッドセーフ
複数のスレッドをマルチスレッドといいます。
マルチスレッドで同時に処理されても安全であるという意味です。
スレッドセーフな設計とは複数のスレッドを同時に使用しても安全なクラスやメソッドであることです。

##第4回　ラッパークラス

基本データ型をオブジェクトとして操作するための便利クラスです。
例：int → Integer, long → Long
(左側が基本データ型、右側がラッパークラスです。)

Integer.parseInt()とかで使われていますね。

##第5回　StringBuilder & StringBuffer
<img width="300" alt="iOS の画像.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/322324/dc81b17c-8cc7-9097-0585-1111458c62e3.jpeg">

文字列を連結するクラスです。
＋で文字列を連結するより、圧倒的に高速です。

####StringBuilderとStringBufferの違い
StringBuilderはマルチスレッドの時に同じ対象に対する処理を行おうとすると上書きされる場合があります。
一方、StringBufferはマルチスレッドの時に同じ対象に対する処理を行っても一つずつ処理を行うため、
上書きはされないですが、StringBuilderよりは処理速度が遅いです。


###おわりに
これからも勉強会は続くので予習復習をして、
面白いなと思うものに出会ったときに気が付けるようにしていきたいなと思いました。
来年にはSpringについても学ぶ予定なのでJavaの知識をきちんと身に付けて勉強会に臨みたいと思います。