Advanced Tech Night No.2



   大阪から来たJava Puzzlers
    ~ Google I/Oに行ってきました

                           せんで
                            2011/07/22
                                谷本 心
今日のテーマ




  Google I/O 2011


                               1
         Advanced Tech Night
Google I/O 2011

• 2011/05/10~11@SanFrancisco
• Googleの技術イベント

• 2トラックの動画をライブ配信
• 2~3日後には全トラックの動画を配信

• 今年はAndroidが中心
• 今年はビジネスや課金に絡む話も多め

                                        2
                  Advanced Tech Night
今日のテーマ




 そんなGoogle I/Oで
  見つけた「Java」

                               3
         Advanced Tech Night
それが・・・




    Java Puzzlers


                               4
         Advanced Tech Night
Java Puzzlers by …




        Joshua Bloch


                                      5
                Advanced Tech Night
本日のメイントピック




   Java Puzzlers
         in
  Google I/O 2011

                              6
        Advanced Tech Night
1. ウォーミングアップ

public static void main(String args[]) {
     System.out.println(2.00 - 1.10);
}




   a) 0.90
   b) 0.9
   c) 1
   d) その他

                                           7
                   Advanced Tech Night
1. ウォーミングアップ(回答)

public static void main(String args[]) {
     System.out.println(2.00 - 1.10);
}




   出力結果)
   0.8999999999999999



                                           8
                    Advanced Tech Night
2. おつりの計算

import java.math.BigDecimal;
public class Change {
      public static void main(String args[]) {
            BigDecimal payment = new BigDecimal(2.00);
            BigDecimal cost = new BigDecimal(1.10);
            System.out.println(payment.subtract(cost));
      }
}


    a) 0.90
    b) 0.9
    c) 1
    d) その他

                                                    9
                       Advanced Tech Night
2. おつりの計算(回答)

import java.math.BigDecimal;
public class Change {
      public static void main(String args[]) {
            BigDecimal payment = new BigDecimal(2.00);
            BigDecimal cost = new BigDecimal(1.10);
            System.out.println(payment.subtract(cost));
      }
}


    出力結果)
    0.899999999999999911182158029987476766109466552734375



                                                            10
                           Advanced Tech Night
2. おつりの計算(回答)




                                11
          Advanced Tech Night
2. おつりの計算(教訓)

1. 精密な数値計算ではBigDecimalを使いなさい。
2. BigDecimalでは、引数がStringのコンストラクタ
   を使いなさい。


3. 普通に使った時に問題が起きないような、
   APIをデザインしなさい!!




                                   12
             Advanced Tech Night
3. 小学校の足し算

public class Elementary {
      public static void main(String[] args) {
            System.out.print(12345 + 5432l);
            System.out.print(" ");
            System.out.print(01234 + 43210);
      }
}



    a) 17777 44444
    b) 17777 43878
    c) 66666 44444
    d) 66666 43878

                                                 13
                       Advanced Tech Night
3. 小学校の足し算(回答)

public class Elementary {
      public static void main(String[] args) {
            System.out.print(12345 + 5432l);
            System.out.print(" ");
            System.out.print(01234 + 43210);
      }
}



    出力結果)
    17777 43878



                                                 14
                       Advanced Tech Night
3. 小学校の足し算(回答)

public class Elementary {
      public static void main(String[] args) {


           System.out.print(        1     2345 + 5432   l);
           System.out.print(" ");                           まさかの
           System.out.print(01234 + 43210);                 Long!
      }
}
             0xから始まるのは16進数表現
              0から始まるのは8進数表現

            1234 (8進数) = 668(10進数)




                                                                15
                        Advanced Tech Night
3. 小学校の足し算(教訓)

1. longのリテラルでは、大文字のLを使いなさい。
2. 変数名でも l は、やめなさい。
3. 0から数字を始めてはいけない。
   本当に8進数を使うなら、コメントをつけなさい。




                                 16
           Advanced Tech Night
4. アプリの価格
public class AppPrice {
    public static void main(String[] args) {
           System.out.println(createMessage(“¥¥85.0”) + “¥t“);
           System.out.println(createMessage("$0.99"));
    }

    private static String createMessage(String value) {
        return "Price:%%%".replaceAll("%%%", value);
    }
}

    a) Price:¥85.0      Price:$0.99
    b) Price:%%%        Price:%%%
    c) Price:85.0       Price:0.99
    d) その他

                                                          17
                          Advanced Tech Night
4. アプリの価格(回答)
public class AppPrice {
    public static void main(String[] args) {
           System.out.println(createMessage("¥¥85.0") + “¥t“);
           System.out.println(createMessage("$0.99"));
    }

    private static String createMessage(String value) {
        return "Price:%%%".replaceAll("%%%", value);
    }
}

    出力結果)
    Price:85.0    Price:%%%.99



                                                          18
                          Advanced Tech Night
4. アプリの価格(回答)




                                19
          Advanced Tech Night
4. アプリの価格(回答)




                                20
          Advanced Tech Night
4. アプリの価格(教訓)

1. replaceAllやsplitが正規表現を使っていることに
   留意しなさい。
2. replaceAllを使う場合、第二引数の¥や$はエス
   ケープしなさい。
  •   Matcher.quoteReplacement
3. String#replaceやStringUtilsを利用しなさい。




                                           21
                     Advanced Tech Night
今日のまとめ


                        22
  Advanced Tech Night
今日のまとめ

1. 直感的なAPIデザインを心がけなさい。
2. LやIなどの1文字変数は、やめなさい。
3. 意図せぬ正規表現に気をつけなさい。


4. Java Puzzlers、超おもしろい!
5. Google I/Oも、超おもしろい!



                                   23
             Advanced Tech Night
今日の本当のまとめ




  セミナーの動画を
    見なさい

                              24
        Advanced Tech Night
今日の本当のまとめ




   海外セミナーに
    行きなさい

                              25
        Advanced Tech Night
本当に言いたかったこと



   JavaOne2011に
    一緒に行こう!

  2011/10/02~06
                              26
        Advanced Tech Night
ご清聴ありがとう
 ございました

                         27
   Advanced Tech Night

ATN No.2 大阪から来たJavaPuzzlers