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とは
- 実際に実行されるSQLは絶対にログに出せ!
- エンティティの状態
- めっちゃ重要
- 永続化コンテキストに含まれるか否か
- EntityManagerのメソッドで状態を変更する
- エンティティの状態遷移のスライドが最大に重要
- mergeメソッドの引数のオブジェクトは状態変更されない
- 返り値のオブジェクトが状態変更されている
- JPQLとは
- SELECT,UPDATE,DEKETEのみ
- INSERT、集合演算、FROMでの副問合せはできない
- 殆どSQLと一緒だが、ちょっと違う
- リレーションとN+1問題
- フェッチは基本LAZY
- EAGERは不要なデータを読み込むため
- LAZYからEAGERから動的に変更も可能
- JOIN FETCH文
- DISTINCTを使用する
- SQLに加えてListの重複を取り除く
- フェッチは基本LAZY
- Spring Data JPA
- 超おすすめ
- 便利機能満載
- JPAは使えるのか?
- 使える
- ただし、正しい知識、シチュエーションを選ぶ必要がある
- JPAを使っていい条件
- DBを新規に設計できる
- 集合演算やFROM区
- パーフェクトJava EEを読破した人がプロジェクトに1人以上いる
- ↑が1つでも当てはまらないならば他のORマッパーを使ったほうが良い
MyBatis を利用した Web Application 開発についてのご紹介
- スピーカー
- Tokuhiro Matsuno (@tokuhirom)
- LINE Corp.
- 発表資料
- MyBatisとは
- 永続化フレームワーク
- SQLは直接書く
- interfaceを通じて呼び出す
- 結果をBeanにMappingする
- シンプルなので学習コストが低い
- どんなスキーマでも使える
- 手でSQLを書くため
- 主キーがなくても
- サブクエリなど複雑なクエリも簡単に使える
- 完全にDB製品に依存する
- 発行されるクエリが人間に読みやすい
- 手で書くため
- 3つの書き方
- 困ったときに検索するとStack Overflowに引っかかるので大丈夫
- Intellij IDEAがあれば、色々補完が効くので結構大丈夫
- Spring bootのサポートが手厚い
- Spring Initializrってのがかなりいいらしい
- 利点
- 欠点
ざっくりわかるDoma
- スピーカー
- うらがみ (https://github.com/backpaper0)
- 関西Javaエンジニアの会
- 発表資料
- Domaとは
- DaoとエンティティでDB操作
- SQLはMETA-INF配下に置く
- ない場合にはコンパイル時にエラーにしてくれる
- SQLにロジックもかけたりする(後が辛い
- Daoでできること
- Streamで複数件検索する場合はStreamを直接返すメソッドは警告がFunctionを返すメソッドを使用する
- forUpdate対応
- 挿入、更新、削除でSQLファイルを書くことも可能
- Domaができないこと
- Selectクエリの自動生成
- 親子などの構造を持ったエンティティへのマッピング
- ドメインクラス
- ドメインクラスのデメリット
- クラスが多くなる
- 作るの面倒
- コンパイル時検査
- Domaだけで使える
- 依存jarがない
- Spring Bootにプラグインありで使いやすいとのこと
- Domaは日本語ドキュメントあり
- DomaはSeasarからの派生
Reladomo入門
- スピーカー
- 伊藤博志 (@itohiro73)
- 株式会社FOLIO
- 発表資料
- 「りらども」と読むらしい
- 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
- 発表資料
- 最近フリーランスになったらしい。
- なぜオブザーバーパターンか?
- オブジェクトが気にかけていることが起きた時に通知。
- Flux/Reduxはオブザーバーパターンベースの設計。
LT.2:新卒エンジニアが Angular と React の比較をしてみた @atsushi
- 発表資料
- 新卒の方らしい。
- Angular4
- 独自ルールはだるい。
- 先行事例が少なくてつらい。
- 開発ツール使うと感動の嵐。
- React
- 先行事例が多い(日本語情報多い)
- jsxが気持ち悪い
- ライブラリの依存関係が多くてだるい
- 開発ツール使うと感動の嵐。
- RxJSは鬼ムズイ
- Reduxはめんどくさい
- ルールがかっちりしてるので、ちょっとしたことに対する手続きが多い。
LT.3:非SPAで小さく始めるReactアーキテクチャ @masarufuruya
- 発表資料
- SPA導入の記事が多い。
- 非SPAの記事が少ないので発表してみる。
- jQueryとReactの同居。
- 発表後にjQueryとReactの同居は辛くない?という質問 → まだプロジェクトは完了してないが、今のところは問題ないとのこと。
- axiosを使うとモックが使えて便利らしい。
- 初回のロード待ちの解消にはgon
LT.4:Reduxでmiddlewareを酷使するためにスロットマシーン書いた @腹筋コントローラーの力を信じろ
- 発表資料
- そこそこのアプリにならないとわからない。 → 作ってみた
- Actionの分解。
- Middlewareは何に反応して何に処理を繋ぐかだけを考えれば良い。
- 結構いいんじゃない?という感想。
- まかないてっく#1杯目 〜フロントエンドを語ろう〜の参加者募集中!
- 前提の知識が私に足りなかったため、あまりメモれず。。。
LT.5:JavascriptでチャットCLIツール作成!@akane_256
- 発表資料
- チャットボット流行ってるので何か作ってみたい。
- GoogleのAPI.AIが便利そう。
- Node.jsのSDKがある。
- 言い回しのゆらぎを吸収。
- コンソールに「ピザ食べたい」。
- API.AIはサンプルコードがあるので、JavaScriptがわかれば簡単。
- 楽しむの大事。
- API.AIは今のところは無料らしい。
- そのうち有料化の話もある??
- API.AIのサンプルはピザ注文らしい。(チュートリアル?)
LT.6:JavaScript で味わう、関数型プログラミングのメリット @k5jp1015
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秒でも早く作成する。
環境
アプリケーションの要件
- 問い合わせフォームを作る
- 「 http://xxx.xxx.xxx.xxx 」でアクセスすると問い合わせフォーム画面が表示される。
- ポートは80
- 問い合わせフォーム画面は、「名前」、「Eメール」、「問い合わせ内容」の3つの入力が可能。
- それぞれの入力にそれなりにValidationをかける。
- 送信ボタンを押下すると完了画面が表示される。
- 送信ボタン押下時にDBに入力内容を保存する。
- DBはなんでも良い
- テーブル構成もなんでも良い
リポジトリ
- この記事のコードは以下に置いてあります。
- https://github.com/yamap55/example_minimum_form_for_springboot
- 手順に沿ってコミットも分けていますので、見たい方はどうぞ。
Pleiadesインストール*4
プロジェクト作成
- プロジェクトエクスプローラ上で右クリック → 新規 → プロジェクト
- Spring → Springスタータープロジェクト
- Spring Boot Version : 1.5.3
- Dependencies
- DevTools
- Web
- Thymeleaf
- H2
- JPA
完了
問い合わせ画面を作成
- Controllerを追加
- com.example.demo.DemoApplication.java
- クラス分ける時間が惜しいので、アプリケーションを起動するクラスに追加してしまいます。
- com.example.demo.DemoApplication.java
@RequestMapping("/") public String index(Model model) { return "index"; }
- 画面を作成
- src/main/resources/templates/index.html
- 特に特筆すべき事はないのでコードは割愛。
- アプリケーション起動
- プロジェクト右クリック → 実行 → Spring Boot アプリケーション
ブラウザで確認
完了画面を作成
@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">
- 画面を作成
- src/main/resources/templates/result.html
- 特に特筆すべき事はないのでコードは割愛。
ブラウザで確認
入力チェックを追加
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に保存する
- DB(H2)に入力情報を保存する。
- ブラウザで確認
- ドメインを作成
@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に変更
src/main/resources/application.properties → src/main/resources/application.yml
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
ブラウザで確認
- アプリケーションの再起動が必要かも。
- http://localhost
- http://localhost/h2-console
jarで出力する
- プロジェクト右クリック → 実行 → Maven install
- target配下にjarが出力されていることを確認。
jar単体で起動
- コマンドプロンプト起動。
java -jar demo-0.0.1-SNAPSHOT.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
- ブラウザで確認
- http://xxx.xxx.xxx.xxx
- http://xxx.xxx.xxx.xxx/h2-console
- h2コンソールを見たい場合には起動オプションに「
--spring.h2.console.settings.web-allow-others=true
」を追加することで確認可能。
- h2コンソールを見たい場合には起動オプションに「
まとめ
- ハマった部分が解消されたら、特になんてこともなくこなすことができ、凹んでいた気分が少し回復したので良しとする。
- ハマった部分に関しても、落ち着いて挑めば解決できたと思うので、焦ってエラーメッセージや事象を検索するのではなく、外の空気でも吸いに行けばよかったと思った。
- 色々突っ込みどころはあると自分でも思うが、お題がお題なのでこんなものではないだろうか。
- いいお題だと思ったので、今後新しいフレームワークを学ぶ際にはこのお題をこなそうと決めた。
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にPOSTしてます。
参考
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 } }
手順
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に置換してください。)
- GroovyでPOST
- curlでPOST
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
- 確認
参考
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
- JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜
- 発表資料
- 図で理解するJavaScriptのプロトタイプチェーンを参考にしたとのこと。
- protoってES2015まで非標準だった。
- protoはプロトタイプチェーンを辿るためのオブジェクト。
LT.2:Elmの話(仮) @boiyaa
関連ツイート↓
さきほどのElmコードです。https://t.co/oG7z3sCegs
— boiyaa (@YamaHilo) 2017年4月27日
Try Elmでみてみてくださいー https://t.co/j1D1teSPcX #wejs
移植元のJSコードつけ忘れましたhttps://t.co/CjEtpvcn1Q#wejs https://t.co/hHFjRmxcPC
— boiyaa (@YamaHilo) 2017年4月27日
LT.3:==と=== @IganinTea
- ==と===を調べてみた
- 発表資料
- JavaScriptの==の中身を知る
- 発表者による補完資料
- 曖昧な比較と厳密な比較
- 1 == ‘1’
- まとめると「==」を使うなって話。
関連ツイート↓
これをリツイートしろって言われている気がした #wejs https://t.co/FbdMk6EfYq
— zuckey (@zuckey_17) 2017年4月27日
LT.4:そろそろwebpackと真剣に向き合ってみる。 @Nao-bt
- 公式ページ
- 大量のJSを書くと死ぬ。
- 大量のJSのコードをモジュールごとに分ける。
- 言語仕様としてはモジュールをサポートしていない。
- ↓の4個を覚えとけ
- Entry
- アプリの中で最初に読み込むファイル
- Output
- ビルドの結果を出力する設定
- Loaders
- ビルドの際にモジュールのソースコードに適用される変換を指定する。
- testって書かないとエラーとなるのがハマりどころらしい。
- Plugins
- ビルド時の設定を行う。
- ビルドの際にファイルの圧縮だったり、コンパイルエラーを無視?するとか。
LT.5:TypeScriptでDDD~RepositoryとEntity編~ @mrdShinse
- リポジトリ
- TypeSctipt公式
- DDD = ドメイン駆動設計
- LineのBotを作成するのに、Bot作成用のフレームワークを使わず、あえてExpress.jsを使用して開発。
- TypeScriptのGenericsはいい
LT.6:jsのGCについて @brn0227
- Javascript Garbage Collector overview
- 発表資料
- 関数は会議
- Stackはホワイトボード
- 関数単位で割り当てられるので、終了すると自動で廃棄
- Heapは議事録
- プログラムで制御
LT.7:はじめてのReact: ES2015の実用 @Jay
- はじめてのReact
- HelloWorldの代わりになる自分のやったことの発表
- セミコロンレスで書いたらしい。
LT.8:オブジェクトの作成とコンストラクタの話 @chikoski
- An implementation of new operator in JS
- 発表資料
- Gist
- サンプルコード
- newは何をしているのか。
- newを使わないでnewを再現する。
*1:公開が遅れて申し訳ありません。(書いたとばっかり思ってました。。。)