山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

JJUG ナイトセミナー 「Java O/Rマッパー特集」に参加してきました #jjug

久しぶりに?JJUGナイトセミナーに参加してきましたその際のメモになります。

あくまでもメモなので、抜けている箇所や誤っている箇所がある可能性があります。セッションの資料はかなりわかりやすかったので、是非各スライドをご参照ください

概要

時間 内容
19:00-19:05 オープニング
19:05-19:30 「25分でわかるJPA
19:30-19:55 「MyBatis を利用した Web Application 開発についてのご紹介」
19:55-20:05 休憩
20:05-20:30 「ざっくりわかるDoma
20:30-20:55 「Reladomo入門」
20:55-21:00 クロージング
21:00- 懇親会

25分でわかるJPA

  • スピーカー
    • 多田真敏 (@suke_masa)
    • 株式会社カサレアル
  • 発表資料
  • 25分でわかるJPA → 25分で(難しさが)わかるJPA
  • JPAとは
    • JAVA EEの一部(仕様のみ)
    • JPA実装ライブラリ
      • 仕様のみなので実装が必要
      • 実装によって挙動がぜんぜん違う
      • Hibernate
        • 今回はこちらを使用して説明する
      • EclipseLink
    • SQLはかかない
  • 実際に実行されるSQLは絶対にログに出せ!
  • エンティティの状態
    • めっちゃ重要
    • 永続化コンテキストに含まれるか否か
    • EntityManagerのメソッドで状態を変更する
  • エンティティの状態遷移のスライドが最大に重要
  • mergeメソッドの引数のオブジェクトは状態変更されない
    • 返り値のオブジェクトが状態変更されている
  • JPQLとは
    • SELECT,UPDATE,DEKETEのみ
    • INSERT、集合演算、FROMでの副問合せはできない
    • 殆どSQLと一緒だが、ちょっと違う
  • リレーションとN+1問題
    • フェッチは基本LAZY
      • EAGERは不要なデータを読み込むため
    • LAZYからEAGERから動的に変更も可能
      • JOIN FETCH文
      • DISTINCTを使用する
        • SQLに加えてListの重複を取り除く
  • Spring Data JPA
    • 超おすすめ
    • 便利機能満載
  • JPAは使えるのか?
    • 使える
    • ただし、正しい知識、シチュエーションを選ぶ必要がある
  • JPAを使っていい条件
    • DBを新規に設計できる
    • 集合演算やFROM区
    • パーフェクトJava EEを読破した人がプロジェクトに1人以上いる
    • ↑が1つでも当てはまらないならば他のORマッパーを使ったほうが良い

MyBatis を利用した Web Application 開発についてのご紹介

  • スピーカー
  • 発表資料
  • MyBatisとは
  • SQLは直接書く
    • interfaceを通じて呼び出す
  • 結果をBeanにMappingする
  • シンプルなので学習コストが低い
  • どんなスキーマでも使える
    • 手でSQLを書くため
    • 主キーがなくても
    • サブクエリなど複雑なクエリも簡単に使える
  • 完全にDB製品に依存する
    • 手でSQLを書くため
    • JPAとか使っていても結局、なんだかんだあってそのまま移行は難しい
  • 発行されるクエリが人間に読みやすい
    • 手で書くため
  • 3つの書き方
  • 困ったときに検索するとStack Overflowに引っかかるので大丈夫
  • Intellij IDEAがあれば、色々補完が効くので結構大丈夫
  • Spring bootのサポートが手厚い
  • Spring Initializrってのがかなりいいらしい
  • 利点
    • SQLが直接書いてある
      • コードレビューが容易
      • スロークエリのリカバリが容易
    • ドキュメントが充実
      • Qiitaの記事が結構いい
    • コードがシンプル
  • 欠点

ざっくりわかるDoma

  • スピーカー
  • 発表資料
  • Domaとは
    • Pluggable Annotation Processiong APIを利用
    • ORMというよりResultSet Mapper
    • SelectはSQLファイルを書く
    • Java8対応
      • Optionalとかいい感じに使える
  • DaoとエンティティでDB操作
  • SQLはMETA-INF配下に置く
  • SQLにロジックもかけたりする(後が辛い
  • Daoでできること
  • Streamで複数件検索する場合はStreamを直接返すメソッドは警告がFunctionを返すメソッドを使用する
  • forUpdate対応
  • 挿入、更新、削除でSQLファイルを書くことも可能
  • Domaができないこと
    • Selectクエリの自動生成
    • 親子などの構造を持ったエンティティへのマッピング
  • ドメインクラス
    • StringやIntegerなどの基本型だらけになりがちだけれども、値オブジェクトを使用可能
    • 引数の順番間違えでもコンパイルエラーになるからわかりやすい
    • シグネチャに現れる
    • IDEの補完がきく
  • ドメインクラスのデメリット
    • クラスが多くなる
    • 作るの面倒
  • コンパイル時検査
    • 割といい感じにコンパイル時にエラー出してくれる
    • SQLファイル内で変数をバインドしているのに使ってないなどもエラー
    • タイポ検出が結構嬉しい
  • Domaだけで使える
    • 依存jarがない
  • Spring Bootにプラグインありで使いやすいとのこと
  • Domaは日本語ドキュメントあり
  • DomaSeasarからの派生

Reladomo入門

  • スピーカー
  • 発表資料
  • 「りらども」と読むらしい
  • Relational Domain Object
  • ゴールドマン・サックスが2016/9に公開
    • OSSとしては日が浅いが、2004年に開発開始している
  • XMLからコード/DDLの自動生成
  • 強力に型付けられたクエリ言語
    • SQLは書かない
  • 具象クラス
  • Finderクラスを用いてOperationを生成
    • 複雑なクエリを型安全で柔軟に書ける
  • キャッシュ
    • 複数のキャッシュを持つ
    • キャッシュはかなり賢い
    • あまり深く考えなくても自動でDBアクセスを最小に保てる
  • セッターに値渡すといきなり更新が走る
  • Listで一括で複数更新も可能
  • 関連はXMLで定義
  • N+1問題
    • deepFetchというAPIを利用する
    • 取得したい関連をdeepFetch指定
  • みんなでアホになってフレームワークに任せましょう
  • GS Collectionsのサポートが手厚い
  • Eclipse Collectionsは現在サポートされていない
    • まもなくサポートされる予定
  • JUnitサポート
    • h2でいい感じに使える
  • バイテンポラルモデルサポート

We Are JavaScripters! @9thに参加してきた #WeJS #21cafe

はじめに

  • 7月20日(木)に「We Are JavaScripters! @9th」という勉強会に参加してきた時のメモです。
  • 全てLT、酒飲みながらのメモなので*1、興味のある発表については資料見たほうが早いかと思います。
    • 資料については、2017/07/21 9:00現在公開されていないようなので、公開され次第追記します。
  • ここ何回かは参加できていませんでしたが、もう9回目かという感じ。早いなー

概要

「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」
と思ったのがきっかけで作った勉強会、「We Are JavaScripters」!

自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、

お酒を片手に、気軽に発信できる場を目指しています^^/

※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!

LT.1:JavaScriptパターンシリーズ ~オブザーバパターン~ @ta__miyan

LT.2:新卒エンジニアが Angular と React の比較をしてみた @atsushi

  • 発表資料
  • 新卒の方らしい。
  • Angular4
    • 独自ルールはだるい。
    • 先行事例が少なくてつらい。
    • 開発ツール使うと感動の嵐。
  • React
    • 先行事例が多い(日本語情報多い)
    • jsxが気持ち悪い
    • ライブラリの依存関係が多くてだるい
    • 開発ツール使うと感動の嵐。
  • RxJSは鬼ムズイ
  • Reduxはめんどくさい
    • ルールがかっちりしてるので、ちょっとしたことに対する手続きが多い。

LT.3:非SPAで小さく始めるReactアーキテクチャ @masarufuruya

LT.4:Reduxでmiddlewareを酷使するためにスロットマシーン書いた @腹筋コントローラーの力を信じろ

  • 発表資料
  • そこそこのアプリにならないとわからない。 → 作ってみた
  • Actionの分解。
  • Middlewareは何に反応して何に処理を繋ぐかだけを考えれば良い。
  • 結構いいんじゃない?という感想。
  • まかないてっく#1杯目 〜フロントエンドを語ろう〜の参加者募集中!
  • 前提の知識が私に足りなかったため、あまりメモれず。。。

LT.5:JavascriptでチャットCLIツール作成!@akane_256

  • 発表資料
  • チャットボット流行ってるので何か作ってみたい。
  • GoogleAPI.AIが便利そう。
    • Node.jsのSDKがある。
    • 言い回しのゆらぎを吸収。
  • コンソールに「ピザ食べたい」。
  • API.AIはサンプルコードがあるので、JavaScriptがわかれば簡単。
  • 楽しむの大事。
  • API.AIは今のところは無料らしい。
    • そのうち有料化の話もある??
  • API.AIのサンプルはピザ注文らしい。(チュートリアル?)

LT.6:JavaScript で味わう、関数型プログラミングのメリット @k5jp1015

  • 発表資料
  • 何故関数型なのか。
    • モジュール性が高まる。
    • テストが楽。
    • コードの正しさの証明。
  • small is beautiful
  • 個人的にわかった感がかなり大きい発表。
  • ☆後で見直す。

LT.7:Generate a QR code with your image by Vue.js! @schwalbe

  • 発表資料
  • LTするどころか、見ることもはじめて。
  • 本業はコンサルらしい。
  • とても初心者とは思えないw
  • 今後もプログラミングは続けていくとのこと。

LT.8:いまさらのPromise再入門 @chikoski

  • 発表資料
  • いずれされる処理を表すオブジェクト
  • 状態を2種類持っている。
    • if文(成功 or 失敗)
    • 仕事する前を含めて3つ
  • 直列化、並列化
  • エラー処理と本筋と分けて書ける
  • 普通の処理もPromiseで書いちゃう
  • thenの中でthenといったネストしたPromiseはよく考えた方が良い。
  • Promiseの本

*1:特に後半

Redshiftの文字列はバイト数換算

Amazon RedshiftはPostgreSQL互換ですが、多くの違いがあります。異なる点については公式を始めとして各所にまとまっていますが、タイトルの件についてはあまり記載を見なかったのでメモしときます。

PostgreSQLは文字数

SQLは2つの主要な文字データ型を定義しています。 character varying(n)とcharacter(n)です。 ここでnは正の整数です。 これらのデータ型は2つともn文字長(バイト数ではなく)までの文字列を保存できます。

わざわざ、バイト数ではなく と強調して書かれています。

create table hoge(c1 varchar(5));
insert into hoge(c1) values('12345'); -- OK
insert into hoge(c1) values('あいうえお'); -- OK
select * from hoge;

insert into hoge(c1) values('あいうえおa'); -- NG

実際にSQLを実行しても文字数換算です。

Redshiftはバイト数

公式から引用

CHAR および VARCHAR のデータ型は、文字単位でなくバイト単位で定義されます。CHAR 列にはシングルバイト文字のみを含めることができます。したがって、CHAR(10) 列には、最大 10 バイト長の文字列を含めることができます。VARCHAR にはマルチバイト文字 (1 文字あたり最大で 4 バイトまで) を含めることができます。例えば、VARCHAR(12) 列には、シングルバイト文字なら 12 個、2 バイト文字なら 6 個、3 バイト文字なら 4 個、4 バイト文字なら 3 個含めることができます。

こちらも、わざわざ文字単位ではなく と強調して書かれています。

create table hoge(c1 varchar(5));
insert into hoge(c1) values('あいうえお'); -- NG

insert into hoge(c1) values('12345'); -- OK
select * from hoge;

実際にSQLを実行してもバイト数換算です。ちなみに、日本語は3-4バイトになるので注意が必要です。

insert into hoge(c1) values('あ12'); -- OK
insert into hoge(c1) values('あ123'); -- NG

insert into hoge(c1) values('𠮷1'); -- OK
insert into hoge(c1) values('𠮷12'); -- NG

参考

Spring Bootを使ってWebアプリケーションを作成する(開発環境から)

はじめに

  • 某所でお題として与えられ、楽勝!って思ったら完遂できなかったので、ハマった所を解消し、再挑戦した際のメモです。*1
  • 最良、最適な方法ではないと思いますので、参考にする場合には自己責任でお願いします。*2
  • コードは一部しか記載しませんので、全てを確認したい場合には参考用コミットとしてGitHubへのリンクを記載してますので、こちらを確認してください。

要件とか

  • 下記の要件でWebアプリケーションを作成する。
  • 少しでも早く作成する。
  • 指定されていない事は想定する必要はない。
    • 最低限要件を満たした上で1秒でも早く作成する。

環境

  • まっさらなWindows
    • 開発環境。
    • 実際はWindows10だったのですが、用意できないので7で再挑戦。*3
  • Linux
    • この環境でポート80でアクセスできるWebアプリケーションを動作させる。
    • 実際はAWSでIPと秘密鍵は用意されてました。(SSHでログインは可能。)
    • 用意できないので、別マシン上にDockerで用意。

アプリケーションの要件

  • 問い合わせフォームを作る
  • http://xxx.xxx.xxx.xxx 」でアクセスすると問い合わせフォーム画面が表示される。
    • ポートは80
  • 問い合わせフォーム画面は、「名前」、「Eメール」、「問い合わせ内容」の3つの入力が可能。
  • それぞれの入力にそれなりにValidationをかける。
  • 送信ボタンを押下すると完了画面が表示される。
  • 送信ボタン押下時にDBに入力内容を保存する。
    • DBはなんでも良い
    • テーブル構成もなんでも良い

リポジトリ

Pleiadesインストー*4

プロジェクト作成

  • プロジェクトエクスプローラ上で右クリック → 新規 → プロジェクト
  • Spring → Springスタータープロジェクト
  • Spring Boot Version : 1.5.3
  • Dependencies
    • DevTools
    • Web
    • Thymeleaf
    • H2
    • JPA
  • 完了

  • 参考用コミット

問い合わせ画面を作成

  • Controllerを追加
    • com.example.demo.DemoApplication.java
      • クラス分ける時間が惜しいので、アプリケーションを起動するクラスに追加してしまいます。
@RequestMapping("/")
public String index(Model model) {
    return "index";
}
  • 画面を作成
    • src/main/resources/templates/index.html
    • 特に特筆すべき事はないのでコードは割愛。
  • アプリケーション起動
    • プロジェクト右クリック → 実行 → Spring Boot アプリケーション
  • ブラウザで確認

  • 参考用コミット

完了画面を作成

  • 問い合わせ画面でボタン押下したら完了画面が表示されるようにします。
  • 完了画面のマッピングを追加
    • com.example.demo.DemoApplication.java
@RequestMapping("result")
public String result(Model model) {
    // TODO 入力チェック
    // TODO DBに保存
    return "result";
}
  • 完了画面に遷移するように問い合わせ画面を変更
    • src/main/resources/templates/index.html
-  <form role="form" action="#">
+   <form role="form" th:action="@{/result}" method="post">

入力チェックを追加

  • 問い合わせ画面でボタン押下時に入力チェックが行われるように設定。
  • formを作成
    • src/main/java/com/example/demo/InputForm.java
public class InputForm {
    @NotEmpty
    @Size(min = 1, max = 50)
    private String name;

    @Size(max = 50)
    private String email;

    @NotEmpty
    @Size(max = 100)
    private String message;
  // getter, setterは略
}
  • 入力チェックでエラーとなった場合には問い合わせ画面に戻す処理を追加。
    • com.example.demo.DemoApplication.java
 - public String result(Model model) {
 -      // TODO 入力チェック
 +  public String result(@ModelAttribute("inputForm") @Valid InputForm form, BindingResult bindingResult, Model model) {
 +      if (bindingResult.hasErrors()) {
 +          return index(form, model);
 +      }
  • エラーメッセージを表示するように修正。
    • src/main/resources/templates/index.html
-          <p>名前 : <input type="text" name="name" /></p>
+           <p>名前 : <input type="text" th:value="*{name}" name="name" /></p>
+           <p><span
+               th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>
+           </p>
<!-- 以下略 -->

DBに保存する

@Entity
@Table(name="message")
public class Message {
    public Message(InputForm form) {
    // 何か他にいい方法ありそうだけど、コンストラクタでformから入れ替える
        this.message = form.getMessage();
        this.email = form.getEmail();
        this.name = form.getName();
    }
    @Id
    @GeneratedValue
    private int id;

    @Column
    private String name;

    @Column
    private String email;

    @Column
    private String message;
  // getter, setterは略
}
public interface MessageRepository extends JpaRepository<Message, Integer> {
}
  • 保存処理を追加
public class DemoApplication {
 +  @Autowired MessageRepository repository;
// 略
 -      // TODO DBに保存
 +      repository.save(new Message(form));

プロパティファイルは好きじゃないのでYAMLに変更

DBに保存されている事を確認するためh2コンソールの表示設定を追加

  • src/main/resources/application.yml
spring:
   h2:
     console:
       enabled: true
   datasource:
     url: jdbc:h2:mem:test

起動するポート番号を変更

  • src/main/resources/application.yml
+server:
 +  port: 80

jarで出力する

  • プロジェクト右クリック → 実行 → Maven install
  • target配下にjarが出力されていることを確認。

jar単体で起動

動作環境の整備

  • Linuxにログイン
  • Javaのインストー
    • sudo yum install java-1.8.0-openjdk.x86_64
  • ↑で作成したjarをLinuxに移動
  • ファイアーウォールを止める
    • sudo service iptables stop
  • 起動
    • java -jar demo-0.0.1-SNAPSHOT.jar
  • ブラウザで確認

まとめ

  • ハマった部分が解消されたら、特になんてこともなくこなすことができ、凹んでいた気分が少し回復したので良しとする。
  • ハマった部分に関しても、落ち着いて挑めば解決できたと思うので、焦ってエラーメッセージや事象を検索するのではなく、外の空気でも吸いに行けばよかったと思った。
  • 色々突っ込みどころはあると自分でも思うが、お題がお題なのでこんなものではないだろうか。
  • いいお題だと思ったので、今後新しいフレームワークを学ぶ際にはこのお題をこなそうと決めた。

*1:ハマった事象は別記事にする予定。

*2:ツッコミ歓迎

*3:何も変わる事はないはず。

*4:そもそもSTSプラグイン版じゃなくて単体パッケージ版を使用した方が良いって誰かが言ってた気がする。https://spring.io/tools/sts/all

*5:これってWindows10でも発生する?

GroovyでJSONをPOSTする

概要

  • ↓をGroovyでやりたい。
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":"abcdef","user":{"name":"tarou","age":20,"email":"example@example.com","result":true}}' https://script.google.com/macros/s/xxxxxxxxx/exec
  • groovy.json.JsonBuilder を利用してJSONを作成。
  • groovyx.net.http.HTTPBuilder を利用してPOSTする。

コード

@Grab("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1")

import groovyx.net.http.HTTPBuilder
import groovy.json.JsonBuilder
import static groovyx.net.http.ContentType.*

def json = new JsonBuilder()
json {
  id "abcdef"
  user {
    name "tarou"
    age 20
    email "example@example.com"
    result true
  }
}
def postBody = json.toString()

assert postBody == $/{"id":"abcdef","user":{"name":"tarou","age":20,"email":"example@example.com","result":true}}/$
/*
{
  "id":"abcdef",
  "user":{
    "name":"tarou",
    "age":20,
    "email":"example@example.com",
    "result":true
  }
}
*/

def http = new HTTPBuilder("https://script.google.com/macros/s/xxxxxxxxx/")

http.post( path: 'exec', body: postBody,
           contentType: JSON ) { resp ->
  println "POST Success: ${resp.statusLine}"
}

参考

JSONをPOSTしてGoogle SpreadSheetに書き込む

はじめに

  • GAS(Google Apps Script)でPOSTを受け付けて、SpreadSheetに書き込む手順です。
  • 認証はありませんので、URLがわかれば誰でもPOSTできてしまうので注意。
  • GroovyからSpreadSheetに書き込みたかったが、GData APIを使用するためのライブラリである、gdata-java-clientをGrapeで入れようとしたら、うまく入らなかったのでやめたという経緯があったりします。

仕様

{
  "id":"abcdef",
  "user":{
    "name":"tarou",
    "age":20,
    "email":"example@example.com",
    "result":true
  }
}

手順

  • スプレッドシートを作成
    • 適当にヘッダとか作っときます。
  • ツール → スクリプトエディタ
  • GASのコードを書く。
    • doPostはPOST、doGetはGETの時に呼ばれます。
    • 今回はPOSTで作成。
function doPost(e) {
  var jsonString = e.postData.getDataAsString();
  var data = JSON.parse(jsonString);

  var id = data.id;
  var name = data.user.name;
  var age = data.user.age;
  var email = data.user.email;
  var result = data.user.result;

  // シート取得
  var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
  var sheet = ss.getSheetByName("シート1");
  
  // データ入力
  sheet.appendRow([id, name, age, email, result]);
}
  • 保存
  • 公開 → ウェブアプリケーションとして公開
  • プロジェクトバージョン
    • 新規作成
    • コミットコメント
  • 次のユーザとしてアプリケーションを実行
    • 自分
  • アプリケーションにアクセスできるユーザー
    • 全員(匿名ユーザーを含む)
    • ↑に設定することで認証が行われない。
  • 「承認が必要です」というダイアログが表示される。
    • 許可を確認 → 許可
  • 「現在のウェブアプリケーションのURL」をメモ。
  • POST(URLは↑で確認したURLに置換してください。)
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":"abcdef","user":{"name":"tarou","age":20,"email":"example@example.com","result":true}}' https://script.google.com/macros/s/xxxxxxxxx/exec
  • 確認 f:id:yamap_55:20170509025238p:plain

参考

We Are JavaScripters! @6thに参加してきた #WeJS #21cafe

はじめに

4月27日(木)に「We Are JavaScripters! @6th」という勉強会に参加してきた時の自分用メモです。*1

全てLTなので、資料見たほうが早いかと思いますw

概要

「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」
と思ったのがきっかけで作った勉強会、「We Are JavaScripters」!

自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、

お酒を片手に、気軽に発信できる場を目指しています^^/

※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!
  • イベント申込時の主催者アンケートだと、JavaScript初心者が半分くらいだったらしいです。
    • 個人的には怪しいと思ってますがw

LT.1:JSの基本的なことをちょっと掘り下げてみる話 prototype編(やっと) @ta__miyan

LT.2:Elmの話(仮) @boiyaa

関連ツイート↓

LT.3:==と=== @IganinTea

関連ツイート↓

LT.4:そろそろwebpackと真剣に向き合ってみる。 @Nao-bt

  • 公式ページ
  • 大量のJSを書くと死ぬ。
  • 大量のJSのコードをモジュールごとに分ける。
  • 言語仕様としてはモジュールをサポートしていない。
  • ↓の4個を覚えとけ
  • Entry
    • アプリの中で最初に読み込むファイル
  • Output
    • ビルドの結果を出力する設定
  • Loaders
    • ビルドの際にモジュールのソースコードに適用される変換を指定する。
    • testって書かないとエラーとなるのがハマりどころらしい。
  • Plugins
    • ビルド時の設定を行う。
    • ビルドの際にファイルの圧縮だったり、コンパイルエラーを無視?するとか。

LT.5:TypeScriptでDDD~RepositoryとEntity編~ @mrdShinse

LT.6:jsのGCについて @brn0227

  • Javascript Garbage Collector overview
    • 発表資料
  • 関数は会議
  • Stackはホワイトボード
    • 関数単位で割り当てられるので、終了すると自動で廃棄
  • Heapは議事録
    • プログラムで制御

LT.7:はじめてのReact: ES2015の実用 @Jay

  • はじめてのReact
  • HelloWorldの代わりになる自分のやったことの発表
  • セミコロンレスで書いたらしい。

LT.8:オブジェクトの作成とコンストラクタの話 @chikoski

*1:公開が遅れて申し訳ありません。(書いたとばっかり思ってました。。。)