Upgrade to Pro — share decks privately, control downloads, hide ads and more …

from old Java to modern Java (2017) #jjug

from old Java to modern Java (2017) #jjug

JJUG ナイトセミナー 「Java エンジニアのためのJava(再)入門」
https://jjug.doorkeeper.jp/events/61857

Shin Tanimoto

June 28, 2017
Tweet

More Decks by Shin Tanimoto

Other Decks in Programming

Transcript

  1. GSPNPME+BWBUPNPEFSO+BWB

    +BWBॳ৺ऀ͔Β࣍ͷεςοϓ΁

    ͋Δ͍͸ࡀ͔Βͷ+BWB࠶ೖ໳

    #jjug
    Acroquest Technology Co., LTD.

    Shin Tanimoto (@cero_t)

    View Slide

  2. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    8IPBN*
    • ୩ຊ ৺ (Shin Tanimoto)
    • Acroquest Technologyגࣜձࣾ
    • ೔ຊJavaϢʔβάϧʔϓ (JJUG)
    • JavaOne / SpringOneεϐʔΧʔ
    • Microservices, Elasticsearch

    • twitter: @cero_t
    • facebook: shin.tanimoto
    • 9݄16೔ੜ·Ε
    2

    View Slide

  3. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    ॻ੶Λॻ͖·ͨ͠
    • Javaຊ֨ೖ໳ େ޷ධൃചதʂ
    • ॻ࣌͘ʹେ੾ʹͨ͜͠ͱ
    • ʮݱ৔Ͱͷʢ͍ۤʣܦݧʯΛ౿·͑ͯॻ͘
    • ࣄ࣮ͷྻڍͰͳࣗ͘෼ͨͪͷࢥ૝Λॻ͘
    • ৽چͷJavaίʔυΛฒ΂ͯܝࡌ͢Δ
    • ຊ೔΋ࡏݿ͖࣋ͬͯͯ·͢ʂ
    • ͓஋ஈͳΜͱ3,000ԁʂʂʢఆՁɿ3,218ԁʣ
    • ʮͤΖ͞Μ͸Ͳ͜ॻ͍ͨͷʁʯ͸࣭໰ېࢭͰ͢
    3

    View Slide

  4. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    4
    ݹ͍όʔδϣϯͷ+BWBͰ

    ॻ͍ͨίʔυΛ

    ࠷ۙͷόʔδϣϯͷ+BWBͷίʔυʹ

    ม͍͑ͯ͘ͱ͍͏͓࿩Ͱ͢

    View Slide

  5. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    5BCMFPGDPOUFOUT
    1. Introduction
    2. From 1.4 to 5.0
    3. From 5.0 to 7
    4. From 7 To 8
    5

    View Slide

  6. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    #1

    Introduction
    6

    View Slide

  7. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    7
    ࠓճ঺հ͢Διʔείʔυ
    $47ϑΝΠϧͷಡΈॻ͖
    *OUSPEVDUJPO

    View Slide

  8. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    8
    *OUSPEVDUJPO
    CSV File
    Java App
    ௥ه
    ಡΈࠐΈ
    2017-04-25,100,123456,Acroquest,څ༩
    2017-05-02,100,-28980,λχϞτ,Χʔυར༻
    2017-05-03,100,-17712,λχϞτ,Χʔυར༻
    2017-05-20,100,3000000,gihyo,ҹ੫
    2017-06-22,100,200000,ΧΰΠέ,ATMৼΓࠐΈ
    2017-06-22,100,-1000000,λχϞτ,ATMҾ͖ग़͠
    ʢۜߦͷར༻໌ࡉͷΠϝʔδʣ

    ೔෇,ޱ࠲൪߸,ֹۚ,ར༻ऀ,ࡉ໨

    View Slide

  9. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    9
    ؆୯ʹιʔεݟͤ·͢
    *OUSPEVDUJPO

    View Slide

  10. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    10
    void append(String fileName, String[] items) {
    StringBuffer buffer = new StringBuffer();
    for (int i = 0; i < items.length; i++) {
    if (buffer.length() > 0) {
    buffer.append(",");
    }
    buffer.append(items[i]);
    }
    String row = buffer.toString() + '\n';
    Writer writer = null;
    try {
    writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName, true), "UTF-8"));
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    } finally {
    try {
    if (writer != null) {
    writer.close();
    }
    } catch (IOException e) {
    // ignore
    }
    }
    }
    ϑΝΠϧ΁ͷCSVߦ௥Ճ

    View Slide

  11. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    11
    StringBuffer buffer = new StringBuffer();
    for (int i = 0; i < items.length; i++) {
    if (buffer.length() > 0) {
    buffer.append(",");
    }
    buffer.append(items[i]);
    }
    String row = buffer.toString() + '\n';
    ϑΝΠϧ΁ͷCSVߦ௥Ճʢจࣈ഑ྻͷ݁߹ʣ

    View Slide

  12. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    12
    Writer writer = null;
    try {
    writer = new BufferedWriter(new OutputStreamWriter(

    new FileOutputStream(fileName, true), "UTF-8"));
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    } finally {
    try {
    if (writer != null) {
    writer.close();
    }
    } catch (IOException e) {
    // ignore
    }
    }
    ϑΝΠϧ΁ͷCSVߦ௥ՃʢϑΝΠϧ΁ͷ௥هʣ
    Ϧιʔε͸finallyͰclose͢Δ

    View Slide

  13. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    13
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList();
    BufferedReader reader = null;
    try {
    reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);
    }
    } catch (ParseException e) {
    throw new RuntimeException("failed to parse date", e);
    } catch (IOException e) {
    throw new RuntimeException("failed to read file: " + fileName, e);
    } finally {
    try {
    if (reader != null) {
    reader.close();
    }
    } catch (IOException e) {
    // ignore
    }
    }
    return list;
    }
    ϑΝΠϧͷಡΈࠐΈ

    View Slide

  14. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    14
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList();
    BufferedReader reader = null;
    try {
    reader = new BufferedReader(new InputStreamReader(

    new FileInputStream(fileName), "UTF-8"));
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ

    View Slide

  15. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    15
    } catch (ParseException e) {
    throw new RuntimeException("failed to parse date", e);
    } catch (IOException e) {
    throw new RuntimeException("failed to read file: " + fileName, e);
    } finally {
    try {
    if (reader != null) {
    reader.close();
    }
    } catch (IOException e) {
    // ignore
    }
    }
    return list;
    }
    ϑΝΠϧͷಡΈࠐΈʢޙ൒ʣ
    Ϧιʔε͸finallyͰclose͢Δʢେࣄʣ

    View Slide

  16. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    16
    class Transaction {
    Date date;
    String accountId;
    Integer amount;
    String name;
    String note;
    public Transaction() {
    }
    public Transaction(Date date, String accountId, Integer amount, String name, String note) {
    this.date = date;
    this.accountId = accountId;
    this.amount = amount;
    this.name = name;
    this.note = note;
    }
    public String toString() {
    return date + " " + accountId + " " + amount + " " + name + " " + note;
    }
    }
    TransactionΫϥε

    View Slide

  17. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    17
    class Transaction {
    public Transaction() {
    }
    public Transaction(Date date, String accountId, Integer amount, String name, String note) {
    this.date = date;
    this.accountId = accountId;
    this.amount = amount;
    this.name = name;
    this.note = note;
    }
    public String toString() {
    return date + " " + accountId + " " + amount + " " + name + " " + note;
    }
    }
    TransactionΫϥεʢϝιουͷΈʣ

    View Slide

  18. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    18
    String fileName = "./transactions.csv";
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    append(fileName, new Transaction(df.parse("2017-04-25"), "100", 123456, "Acroquest", "給与"));
    append(fileName, new Transaction(df.parse("2017-05-02"), "100", -28980, "タニモト", "カード利用"));
    append(fileName, new Transaction(df.parse("2017-05-03"), "100", -17712, "タニモト", "カード利用"));
    append(fileName, new Transaction(df.parse("2017-05-20"), "100", 3000000, "gihyo", "印税"));
    append(fileName, new Transaction(df.parse("2017-06-22"), "100", 200000, "カゴイケ", "ATM振り込み"));
    append(fileName, new Transaction(df.parse("2017-06-22"), "100", -1000000, "タニモト", "ATM引き出し"));
    ར༻ଆͷྫ - σʔλͷ௥Ճ

    View Slide

  19. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    19
    List list = read(fileName);
    int sum = 0;
    for (int i = 0; i < list.size(); i++) {
    Transaction tx = (Transaction) list.get(i);
    sum += tx.amount;
    }
    System.out.println(sum);
    ར༻ଆͷྫ - ࢒ߴͷܭࢉ

    View Slide

  20. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    *OUSPEVDUJPO
    20
    List list = read(fileName);
    for (int i = 0; i < list.size(); i++) {
    Transaction tx = (Transaction) list.get(i);
    Calendar cal = Calendar.getInstance();
    cal.setTime(tx.date);
    if (cal.get(Calendar.MONTH) == 5) {
    System.out.println(tx);
    }
    }
    ར༻ଆͷྫ - 6݄෼ͷऔҾͷΈදࣔ
    ݄͸0͔Β࢝·Δ

    View Slide

  21. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    21
    ͍·ݟͤͨίʔυ͸

    +BWBͰಈ͖·͢
    *OUSPEVDUJPO

    View Slide

  22. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    #2
    From 1.4 to 5.0
    22

    View Slide

  23. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    23
    +BWB4&
    'SPNUP

    View Slide

  24. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    24
    (FOFSJDT
    'SPNUP
    GPSFBDI
    WBSBSHT FOVN
    TUBUJDJNQPSU
    BVUPCPYJOH
    ʜBOENPSF

    View Slide

  25. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    25
    +BWBจ๏ͷجૅ
    'SPNUP

    View Slide

  26. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    26
    จࣈ഑ྻͷ݁߹

    CFGPSFBGUFS
    'SPNUP

    View Slide

  27. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    27
    StringBuffer buffer = new StringBuffer();
    for (int i = 0; i < items.length; i++) {
    if (buffer.length() > 0) {
    buffer.append(",");
    }
    buffer.append(items[i]);
    }
    String row = buffer.toString() + '\n';
    จࣈ഑ྻͷ݁߹

    View Slide

  28. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    28
    StringBuilder builder = new StringBuilder();
    for (String item : items) {
    if (builder.length() > 0) {
    builder.append(",");
    }
    builder.append(item);
    }
    String row = builder.toString() + '\n';
    จࣈ഑ྻͷ݁߹

    View Slide

  29. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    29
    StringBuilder builder = new StringBuilder();
    for (String item : items) {
    if (builder.length() > 0) {
    builder.append(",");
    }
    builder.append(item);
    }
    String row = builder.toString() + '\n';
    จࣈ഑ྻͷ݁߹
    StringBuilderͷํ͕

    ཧ࿦తʹੑೳ͕ྑ͍
    foreachจʢ֦ுforจʣͰ

    ϧʔϓΛ؆ܿʹॻ͘

    View Slide

  30. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    30
    ϑΝΠϧಡΈࠐΈ

    CFGPSFBGUFS
    'SPNUP

    View Slide

  31. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    31
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList();
    BufferedReader reader = null;
    try {
    reader = new BufferedReader(new InputStreamReader(

    new FileInputStream(fileName), "UTF-8"));
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ

    View Slide

  32. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    32
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList();
    BufferedReader reader = null;
    try {
    reader = new BufferedReader(new InputStreamReader(

    new FileInputStream(fileName), "UTF-8"));
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ

    View Slide

  33. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    33
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList();
    BufferedReader reader = null;
    try {
    reader = new BufferedReader(new InputStreamReader(

    new FileInputStream(fileName), "UTF-8"));
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ
    GenericsͰܕΛ໌֬ʹ

    View Slide

  34. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    34
    List list = read(fileName);
    int sum = 0;
    for (int i = 0; i < list.size(); i++) {
    Transaction tx = (Transaction) list.get(i);
    sum += tx.amount;
    }
    System.out.println(sum);
    ར༻ଆͷྫ - ࢒ߴͷܭࢉ

    View Slide

  35. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    35
    List list = read(fileName);
    int sum = 0;
    for (Transaction tx : list) {
    sum += tx.amount;
    }
    System.out.println(sum);
    ར༻ଆͷྫ - ࢒ߴͷܭࢉ

    View Slide

  36. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    36
    List list = read(fileName);
    int sum = 0;
    for (Transaction tx : list) {
    sum += tx.amount;
    }
    System.out.println(sum);
    ར༻ଆͷྫ - ࢒ߴͷܭࢉ
    ΩϟετʢܕΛ໌ࣔʣΛͤͣʹ

    ར༻Ͱ͖Δ

    View Slide

  37. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    37
    7BMVF0CKFDU

    CFGPSFBGUFS
    'SPNUP

    View Slide

  38. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    38
    class Transaction {
    public Transaction() {
    }
    public Transaction(Date date, String accountId, Integer amount, String name, String note) {
    this.date = date;
    this.accountId = accountId;
    this.amount = amount;
    this.name = name;
    this.note = note;
    }
    public String toString() {
    return date + " " + accountId + " " + amount + " " + name + " " + note;
    }
    }
    TransactionΫϥεʢϝιουͷΈʣ

    View Slide

  39. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    39
    class Transaction {
    public Transaction() {
    }
    public Transaction(Date date, String accountId, Integer amount, String name, String note) {
    this.date = date;
    this.accountId = accountId;
    this.amount = amount;
    this.name = name;
    this.note = note;
    }
    @Override
    public String toString() {
    return date + " " + accountId + " " + amount + " " + name + " " + note;
    }
    }
    TransactionΫϥεʢϝιουͷΈʣ

    View Slide

  40. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    40
    class Transaction {
    public Transaction() {
    }
    public Transaction(Date date, String accountId, Integer amount, String name, String note) {
    this.date = date;
    this.accountId = accountId;
    this.amount = amount;
    this.name = name;
    this.note = note;
    }
    @Override
    public String toString() {
    return date + " " + accountId + " " + amount + " " + name + " " + note;
    }
    }
    TransactionΫϥεʢϝιουͷΈʣ
    ϝιουͷܧঝʢ࣮૷ʣͰ͋Δ͜ͱΛ

    ໌ࣔͯ͠ϛεΛ๷͙

    View Slide

  41. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    41
    ͕͢͞ʹ͜ͷล͸

    େৎ෉Ͱ͢ΑͶ☺
    'SPNUP

    View Slide

  42. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    #3
    From 5.0 to 7
    42

    View Slide

  43. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    43
    +BWB4&
    'SPNUP

    View Slide

  44. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    44
    USZXJUISFTPVSDFT
    'SPNUP
    EJBNPOEPQFSBUPS
    OJP NVMUJDBUDI
    ʜBOENPSF

    View Slide

  45. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    45
    ͜ͷลΓ͔Βগ͠ཧղ͕

    ո͘͠ͳΔਓ͕͍Δ
    'SPNUP

    View Slide

  46. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    46
    ϑΝΠϧॻ͖ࠐΈ

    CFGPSFBGUFS
    'SPNUP

    View Slide

  47. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    47
    Writer writer = null;
    try {
    writer = new BufferedWriter(new OutputStreamWriter(

    new FileOutputStream(fileName, true), "UTF-8"));
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    } finally {
    try {
    if (writer != null) {
    writer.close();
    }
    } catch (IOException e) {
    // ignore
    }
    }
    ϑΝΠϧ΁ͷ௥ه

    View Slide

  48. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    48
    try (Writer writer = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(fileName, true), StandardCharsets.UTF_8))) {
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه

    View Slide

  49. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    49
    try (Writer writer = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(fileName, true), StandardCharsets.UTF_8))) {
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه
    try-with-resourecesʹΑΔ

    ϦιʔεͷࣗಈΫϩʔζ

    View Slide

  50. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    50
    pOBMMZͰDMPTF͢Δͷ͸

    ݹ͍ఆੴ
    'SPNUP

    View Slide

  51. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    51
    try (Writer writer = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(fileName, true), StandardCharsets.UTF_8))) {
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه
    try/catch͔Βൈ͚ͨ࣌ʹ ( ) Ͱએݴ͍ͯͨ͠Ϧιʔε͕close͞ΕΔɻ

    ( ) ͷதͰએݴͰ͖Δม਺͸AutoCloseableΠϯλϑΣʔεͷΫϥεͷΈɻ

    View Slide

  52. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    52
    try (Writer writer = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(fileName, true), StandardCharsets.UTF_8))) {
    writer.write(row);
    }
    ϑΝΠϧ΁ͷ௥ه
    catchͤͣʹϝιουʹ throws IOExceptionΛ͚ͭΔ࣌Ͱ΋

    try-with-resourcesʹ͓͚ͯ͠͹ɺ͖ͪΜͱclose͞ΕΔɻ

    View Slide

  53. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    53
    try (Writer writer = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(fileName, true), StandardCharsets.UTF_8))) {
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه
    ϑΝΠϧΤϯίʔυΛStringͰ͸ͳ͘CharsetͰࢦఆ͢ΔͨΊʹ

    ୅දతͳΤϯίʔυΛྻڍ͢ΔStandardCharsetsΛར༻͢Δɻ

    Τϯίʔυ͕ݟ͔ͭΒͳ͍࣌ͷྫ֎ൃੜΛ๷͛Δɻ

    View Slide

  54. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    54
    ͞Βʹ

    ϑΝΠϧॻ͖ࠐΈ

    BGUFS
    'SPNUP

    View Slide

  55. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    55
    try (Writer writer = Files.newBufferedWriter(Paths.get(fileName),
    StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND)) {
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه

    View Slide

  56. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    56
    try (Writer writer = Files.newBufferedWriter(Paths.get(fileName),
    StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND)) {
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه
    ϑΝΠϧͷૢ࡞΍Ϧιʔεͷ࡞੒Λ؆ܿʹॻ͚Δ

    FilesΫϥε͕௥Ճʢnio2ʣ

    View Slide

  57. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    57
    try (Writer writer = Files.newBufferedWriter(Paths.get(fileName),
    StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND)) {
    writer.write(row);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه
    OptionͷࢦఆͰॻ͖ࠐΈͷϧʔϧΛࢦఆɻ

    ͜ͷྫͰ͸࣍ͷΦϓγϣϯΛࢦఆ

    ɹɾϑΝΠϧ͕ͳ͚Ε͹৽ن࡞੒ɺطʹ͋Ε͹ͦΕΛ࢖͏

    ɹɾϑΝΠϧʹ͸௥ه͢Δʢ্ॻ͖Ͱ͸ͳ͍ʣ

    View Slide

  58. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    58
    ͞Βʹ͞Βʹ

    ϑΝΠϧॻ͖ࠐΈ

    BGUFS
    'SPNUP

    View Slide

  59. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    59
    String row = builder.toString();
    try {
    List rows = Collections.singletonList(row);
    Files.write(Paths.get(fileName), rows, StandardCharsets.UTF_8,
    StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه

    View Slide

  60. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    60
    String row = builder.toString();
    try {
    List rows = Collections.singletonList(row);
    Files.write(Paths.get(fileName), rows, StandardCharsets.UTF_8,
    StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه
    FilesͷwriteϝιουͰɺϦετʢIterableʣΛ

    ·ͱΊͯϑΝΠϧʹॻ͖ࠐΈՄೳɻ

    ͳ͓ߦ຤ʹ͸վߦίʔυ͕ೖΔɻ

    View Slide

  61. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    61
    ϑΝΠϧಡΈࠐΈ

    CFGPSFBGUFS
    'SPNUP

    View Slide

  62. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    62
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList();
    BufferedReader reader = null;
    try {
    reader = new BufferedReader(new InputStreamReader(

    new FileInputStream(fileName), "UTF-8"));
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ

    View Slide

  63. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    63
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList<>();
    try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName),
    StandardCharsets.UTF_8)) {
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ

    View Slide

  64. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    64
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList<>();
    try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName),
    StandardCharsets.UTF_8)) {
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ μΠΞϞϯυԋࢉࢠͰ

    هड़Λ؆ܿʹ
    try-with-resourcesͱɺFilesͷϦιʔεੜ੒ɺ

    StandardCharsets͸΋͏ֶͼ·ͨ͠

    View Slide

  65. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    65
    } catch (ParseException e) {
    throw new RuntimeException("failed to parse date", e);
    } catch (IOException e) {
    throw new RuntimeException("failed to read file: " + fileName, e);
    } finally {
    try {
    if (reader != null) {
    reader.close();
    }
    } catch (IOException e) {
    // ignore
    }
    }
    return list;
    }
    ϑΝΠϧͷಡΈࠐΈʢޙ൒ʣ

    View Slide

  66. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    66
    } catch (ParseException | IOException e) {
    throw new RuntimeException("failed to parse date or read file”, e);
    }
    return list;
    }
    ϑΝΠϧͷಡΈࠐΈʢޙ൒ʣ
    ෳ਺ͷྫ֎Λ·ͱΊͯcatchͰ͖Δ

    ʢຊདྷ͸ɺྫ֎ॲཧͷ಺༰͕શ͘ಉ࣌͡ʹ࢖͏ʣ

    View Slide

  67. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    67
    USZXJUISFTPVSDFT͸

    ͱʹ͔͘ඇৗʹେ੾ͳػೳ
    'SPNUP

    View Slide

  68. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    #4
    From 7 to 8
    68

    View Slide

  69. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    69
    4USFBN"1*
    'SPNUP
    -BNCEB
    %BUFBOE5JNF"1*
    ʜBOENPSF

    View Slide

  70. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    70
    4USFBN"1*ͱ-BNCEBࣜͰ

    Ұؾʹจ๏͕มΘͬͨ
    'SPNUP

    View Slide

  71. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    71
    ɾɾɾ͚ͲɺͦΕ͸ޙʹͯ͠

    ͦΕҎ֎ͷݟམͱ͞Ε͕ͪͳ

    ͱ͜Ζ͔Β΍Γ·͢
    'SPNUP

    View Slide

  72. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    72
    จࣈ഑ྻͷ݁߹ͱ

    ϑΝΠϧॻ͖ࠐΈ

    CFGPSFBGUFS
    'SPNUP

    View Slide

  73. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    73
    StringBuilder builder = new StringBuilder();
    for (String item : items) {
    if (builder.length() > 0) {
    builder.append(",");
    }
    builder.append(item);
    }
    String row = builder.toString() + '\n';
    try {
    List rows = Collections.singletonList(row);
    Files.write(Paths.get(fileName), rows, StandardCharsets.UTF_8,
    StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه

    View Slide

  74. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    74
    String row = String.join(",", items);
    try {
    List rows = Collections.singletonList(row);
    Files.write(Paths.get(fileName), rows, // StandardCharsets.UTF_8,
    StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه

    View Slide

  75. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    75
    String row = String.join(",", items);
    try {
    List rows = Collections.singletonList(row);
    Files.write(Paths.get(fileName), rows, // StandardCharsets.UTF_8,
    StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    } catch (IOException e) {
    throw new RuntimeException("unable to write file: " + fileName, e);
    }
    ϑΝΠϧ΁ͷ௥ه ͱ͏ͱ͏join͕Մೳʹʂ
    ϑΝΠϧΤϯίʔυࢦఆͷলུ͕Մೳɻ

    লུͨ͠৔߹͸UTF-8ͱͳΔɻ

    View Slide

  76. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    76
    ೔෇ΛؚΉ7BMVF0CKFDU

    CFGPSFBGUFS
    'SPNUP

    View Slide

  77. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    77
    class Transaction {
    Date date;
    String accountId;
    Integer amount;
    String name;
    String note;
    public Transaction() {
    }
    public Transaction(Date date, String accountId, Integer amount, String name, String note) {
    this.date = date;
    this.accountId = accountId;
    this.amount = amount;
    this.name = name;
    this.note = note;
    }
    TransactionΫϥεʢtoStringলུʣ

    View Slide

  78. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    78
    class Transaction {
    LocalDate date;
    String accountId;
    Integer amount;
    String name;
    String note;
    public Transaction() {
    }
    public Transaction(LocalDate date, String accountId, Integer amount, String name, String note) {
    this.date = date;
    this.accountId = accountId;
    this.amount = amount;
    this.name = name;
    this.note = note;
    }
    TransactionΫϥεʢtoStringলུʣ

    View Slide

  79. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    79
    class Transaction {
    LocalDate date;
    String accountId;
    Integer amount;
    String name;
    String note;
    public Transaction() {
    }
    public Transaction(LocalDate date, String accountId, Integer amount, String name, String note) {
    this.date = date;
    this.accountId = accountId;
    this.amount = amount;
    this.name = name;
    this.note = note;
    }
    TransactionΫϥεʢtoStringলུʣ
    LocalDateͰ೔෇ͷΈΛѻ͏ɻ

    ଞʹ΋LocalDateTime΍LocalTimeɺ

    OffsetDateTimeɺZonedDateTimeͳͲ͋Γ

    View Slide

  80. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    80
    List read(String fileName) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList<>();
    try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName),
    StandardCharsets.UTF_8)) {
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = df.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ

    View Slide

  81. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    81
    List read(String fileName) {
    // SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList<>();
    try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName))) {
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = LocalDate.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ

    View Slide

  82. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    'SPNUP
    82
    List read(String fileName) {
    // SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    List list = new ArrayList<>();
    try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName))) {
    String line;
    while ((line = reader.readLine()) != null) {
    String[] s = line.split(",");
    Transaction tx = new Transaction();
    tx.date = LocalDate.parse(s[0]);
    tx.accountId = s[1];
    tx.amount = Integer.valueOf(s[2]);
    tx.name = s[3];
    tx.note = s[4];
    list.add(tx);

    }
    ϑΝΠϧͷಡΈࠐΈʢલ൒ʣ
    ϋΠϑϯ۠੾Γͷ

    ISO 8601ܗࣜͷ೔࣌ͳΒ

    ϑΥʔϚολͳ͠ͰύʔεՄೳ
    ΤϯίʔυΛলུ͢Δͱ

    UTF-8ͱͳΔ

    View Slide

  83. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    String fileName = "./transactions.csv";
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    append(fileName, new Transaction(df.parse("2017-04-25"), "100", 123456, "Acroquest", "給与"));
    append(fileName, new Transaction(df.parse("2017-05-02"), "100", -28980, "タニモト", "カード利用"));
    append(fileName, new Transaction(df.parse("2017-05-03"), "100", -17712, "タニモト", "カード利用"));
    append(fileName, new Transaction(df.parse("2017-05-20"), "100", 3000000, "gihyo", "印税"));
    append(fileName, new Transaction(df.parse("2017-06-22"), "100", 200000, "カゴイケ", "ATM振り込み"));
    append(fileName, new Transaction(df.parse("2017-06-22"), "100", -1000000, "タニモト", "ATM引き出し"));
    83
    ར༻ଆͷྫ - σʔλͷ௥Ճ
    'SPNUP

    View Slide

  84. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    84
    String fileName = "./transactions.csv";
    // SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    append(fileName, new Transaction(LocalDate.of(2017, 4, 25), "100", 123456, "Acroquest", "給与"));
    append(fileName, new Transaction(LocalDate.of(2017, 5, 2), "100", -28980, "タニモト", "カード利用"));
    append(fileName, new Transaction(LocalDate.of(2017, 5, 3), "100", -17712, "タニモト", "カード利用"));
    append(fileName, new Transaction(LocalDate.of(2017, 5, 20), "100", 3000000, "gihyo", "印税"));
    append(fileName, new Transaction(LocalDate.of(2017, 6, 22), "100", 200000, "カゴイケ", "ATM振り込み"));
    append(fileName, new Transaction(LocalDate.of(2017, 6, 22), "100", -1000000, "タニモト", “ATM引き出し"));
    ར༻ଆͷྫ - σʔλͷ௥Ճ
    'SPNUP

    View Slide

  85. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    85
    String fileName = "./transactions.csv";
    // SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    append(fileName, new Transaction(LocalDate.of(2017, 4, 25), "100", 123456, "Acroquest", "給与"));
    append(fileName, new Transaction(LocalDate.of(2017, 5, 2), "100", -28980, "タニモト", "カード利用"));
    append(fileName, new Transaction(LocalDate.of(2017, 5, 3), "100", -17712, "タニモト", "カード利用"));
    append(fileName, new Transaction(LocalDate.of(2017, 5, 20), "100", 3000000, "gihyo", "印税"));
    append(fileName, new Transaction(LocalDate.of(2017, 6, 22), "100", 200000, "カゴイケ", "ATM振り込み"));
    append(fileName, new Transaction(LocalDate.of(2017, 6, 22), "100", -1000000, "タニモト", “ATM引き出し"));
    ར༻ଆͷྫ - σʔλͷ௥Ճ
    ೥ɺ݄ɺ೔ɺ࣌ɺ෼ɺඵͳͲΛࢦఆͯ͠

    Πϯελϯεੜ੒͕Մೳɻ

    ͔͠΋݄͸1͔Β࢝·Δʂ
    'SPNUP

    View Slide

  86. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    86
    ೔෇ܭࢉ

    CFGPSFBGUFS
    'SPNUP

    View Slide

  87. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    87
    List list = read(fileName);
    for (Transaction tx : list) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(tx.date);
    if (cal.get(Calendar.MONTH) == 5) {
    System.out.println(tx);
    }
    }
    ར༻ଆͷྫ - 6݄෼ͷऔҾͷΈදࣔ
    'SPNUP

    View Slide

  88. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    88
    List list = read(fileName);
    for (Transaction tx : list) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(tx.date);
    if (cal.get(Calendar.MONTH) == 5) {
    System.out.println(tx);
    }
    }
    ར༻ଆͷྫ - 6݄෼ͷऔҾͷΈදࣔ
    'SPNUP
    ݄͸0͔Β࢝·ΔͷͰɺ6݄͸5ʹͳΔɻ

    ʢCalendar.JUNEͱ͍͏ఆ਺΋ར༻Մೳʣ

    View Slide

  89. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    89
    List list = read(fileName);
    for (Transaction tx : list) {
    if (tx.date.getMonth() == Month.JUNE) {
    System.out.println(tx);
    }
    }
    ར༻ଆͷྫ - 6݄෼ͷऔҾͷΈදࣔ
    'SPNUP

    View Slide

  90. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    90
    List list = read(fileName);
    for (Transaction tx : list) {
    if (tx.date.getMonth() == Month.JUNE) {
    System.out.println(tx);
    }
    }
    ར༻ଆͷྫ - 6݄෼ͷऔҾͷΈදࣔ
    'SPNUP
    ݄͸enumͱͯ͠ఆٛ͞Ε͓ͯΓ

    enumಉ࢜ͷൺֱͰ൑ఆ͢Δ

    View Slide

  91. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    91
    4USFBN-BNCEBͷ

    ӨʹӅΕ͕͚ͪͩͲ

    ༗༻ͳ"1*͕૿͍͑ͯΔ
    'SPNUP

    View Slide

  92. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    92
    Ͱɺ؊৺ͷ

    4USFBN"1*ͱ-BNCEB

    ͸ɾɾɾʁ
    'SPNUP

    View Slide

  93. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    93
    ޙ൒ʹͭͮ͘ʂ

    View Slide

  94. Copyright © Acroquest Technology Co., Ltd. All rights reserved.
    @cero_t #jjug
    94
    Ξϯέʔτޚڠྗ͓ئ͍͠·͢

    http://bit.ly/jjug201706

    View Slide