SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Downloaden Sie, um offline zu lesen
(@v vakame)


                Android




2011   8   25
•

                •

                •




                    http://www.slideshare.net/vvakame/debugging-strategy


2011   8   25
2011   8   25
2011   8   25
…




2011   8   25
•

                    • initA()      initB()        init()
                                    A, B public
                •              2

                    •      (          )
                    •
                •                         …
2011   8   25
/**
    *           bitmap                 .
     *
     * @param bitmapArrays
     */
   static void dot1PixelA(Bitmap[][] bitmapArrays) {
   	    for (int i = 0; i < bitmapArrays.length; i++) {          for
   	    	   for (int j = 0; j < bitmapArrays[i].length; i++) {
   	    	   	   bitmapArrays[j][i].setPixel(0, 0, Color.RED);
   	    	   }
   	    }
   }

   /**
    *           bitmap                 .
     *
     * @param bitmapArrays
     */
   static void dot1PixelB(Bitmap[][] bitmapArrays) {
   	
   	
        for (Bitmap[] bitmapArray : bitmapArrays) {
        	   for (Bitmap bitmap : bitmapArray) {
                                                                 for-each
   	    	   	   bitmap.setPixel(0, 0, Color.RED);
   	    	   }
   	    }
   }

2011   8   25
/**
    *           bitmap                 .
     *
     * @param bitmapArrays
     */
   static void dot1PixelA(Bitmap[][] bitmapArrays) {
   	    for (int i = 0; i < bitmapArrays.length; i++) {          for
   	    	   for (int j = 0; j < bitmapArrays[i].length; i++) {
   	    	   	   bitmapArrays[j][i].setPixel(0, 0, Color.RED);
   	    	   }
   	    }
   }

   /**
    *           bitmap                 .
     *
     * @param bitmapArrays
     */
   static void dot1PixelB(Bitmap[][] bitmapArrays) {
   	
   	
        for (Bitmap[] bitmapArray : bitmapArrays) {
        	   for (Bitmap bitmap : bitmapArray) {
                                                                 for-each
   	    	   	   bitmap.setPixel(0, 0, Color.RED);
   	    	   }
   	    }
   }

2011   8   25
Bitmap[][] bitmapArrays = new Bitmap[10][10];
 for (int i = 0; i < bitmapArrays.length; i++) {
 	 for (int j = 0; j < bitmapArrays[i].length; j++) {
 	 	 bitmapArrays[i][j] = Bitmap.createBitmap(3, 3, Config.ARGB_8888);
 	 }
 }



                                                            …




2011   8   25
ADT


                      2011/08/25   rev12

2011   8   25
2011   8   25
•

                    •

                    •

                    • null




2011   8   25
• LogCat




2011   8   25
•

 L07	 @Override
 L08	 public void onCreate(Bundle savedInstanceState) {
 L09	 	   super.onCreate(savedInstanceState);
 L10	 	   setContentView(R.layout.main);
 L11
 L12	 	   try {
 L13	 	   	   throw new NullPointerException();
 L14	 	   } catch (Exception e1) {
 L15	 	   	   try {
 L16	 	   	   	    throw new IllegalArgumentException(e1);
 L17	 	   	   } catch (Exception e2) {
 L18	 	   	   	    try {
 L19	 	   	   	    	   throw new IllegalStateException(e2);
 L20	 	   	   	    } catch (Exception e3) {
 L21	 	   	   	    	   throw new RuntimeException(e3);
 L22	 	   	   	    }
 L23	 	   	   }
 L24	 	   }
 L25	 }




                                                              Caused
2011   8   25
•
       L08	 @Override
       L09	 public void onCreate(Bundle savedInstanceState) {
       L10	 	   super.onCreate(savedInstanceState);
       L11	 	   setContentView(R.layout.main);
       L12	 	   requestWindowFeature(Window.FEATURE_NO_TITLE);
       L13	 }




                                                                 L11 L12


2011    8   25
L22       …
       L09	 @Override
       L10	 public void onCreate(Bundle savedInstanceState) {
       L11	 	   super.onCreate(savedInstanceState);
       L12
       L13	 	   LinearLayout layout1 = new LinearLayout(this);
       L14	 	   LinearLayout layout2 = new LinearLayout(this);
       L15	 	   LinearLayout layout3 = new LinearLayout(this);
       L16	 	   Button button = new Button(this);
       L17
       L18	 	   layout1.addView(layout2);
       L19	 	
       L20	 	
                layout2.addView(layout1);
                layout3.addView(button);
                                            layout1 → layout2 → layout1
       L21
       L22	 	   setContentView(layout1);              layout1 → layout2 → layout3       …
       L23	 }




2011   8   25
“      ”
                •              (     ω   ´)

                    •

                    •

                    •                    ←

                    • ……                      ……

                    •              … orz ←
2011   8   25
“       ”
                •

                •

                •

                    •
                            …

                    •

2011   8   25
void sort() {
                       	   List<String> list = new ArrayList<String>();
                       	   list.add("cupcake");
                       	   list.add(null);
                       	   list.add("donuts");
                       	   list.add(null);
                       	   list.add("froyo");

                       	   Collections.sort(list, new Comparator<String>() {
                       	   	   @Override
                       	   	   public int compare(String str1, String str2) {
                       	   	   	   if (str1 == null) {
                       	   	   	   	    return -1;
                       	   	   	   }
                       	   	   	   return str1.compareTo(str2);
                       	   	   }
                       	   });

                       	   Log.d("Debug", list.toString());
                       }



                    NullPointerException                                        …
           LogCat                                                                   …
2011   8   25
2011   8   25
str2   null
            String#compareTo(String)   null   …

2011   8   25
NPE(NullPointerException)


2011   8   25
2011   8   25
…
                public class Util {

                	   /**
                	    *       2          1                            .
                	    * @param list1 1
                	    * @param list2 2
                	    * @return 1
                	     */
                	   public static List<Object> merge(List<Object> list1, List<Object> list2) {
                	   	    list1.addAll(list2);
                	   	    return list1;
                	   }

                	   /**
                	    *                   1                            .
                	    * @param lists
                	    * @return 1
                	     */
                	   public static List<Object> merge(List<?>... lists) {
                	   	    List<Object> result = new ArrayList<Object>();
                	   	    for (List<?> list : lists) {
                	   	    	   result.addAll(list);
                	   	    }
                	   	    return result;
                	   }
                }


2011   8   25
public void test() {
                	   List<Object> list1 = new ArrayList<Object>();
                	   list1.add("a");
                	   list1.add("b");
                	   List<Object> list2 = new ArrayList<Object>();
                	   list2.add(1);
                	   list2.add(2);
                	   List<Object> list3 = new ArrayList<Object>();
                	   list3.add(1.25);
                	   list3.add(2.5);

                	   List<Object> merged1 = Util.merge(list1, list2);
                	   List<Object> merged2 = Util.merge(list1, list2, list3);

                	   assertEquals(merged1.size(),   4);
                	   assertEquals(merged1.get(0),   "a");
                	   assertEquals(merged1.get(1),   "b");
                	   assertEquals(merged1.get(2),   1);
                	   assertEquals(merged1.get(3),   2);

                	   assertEquals(merged2.size(),   6);
                	   assertEquals(merged2.get(0),   "a");
                	   assertEquals(merged2.get(1),   "b");
                	   assertEquals(merged2.get(2),   1);
                	   assertEquals(merged2.get(3),   2);
                	   assertEquals(merged2.get(4),   1.25);
                	   assertEquals(merged2.get(5),   2.5);
                }


2011   8   25
public void test() {
       	   List<Object> list1 = new ArrayList<Object>();
       	   list1.add("a");
       	   list1.add("b");
       	   List<Object> list2 = new ArrayList<Object>();
       	   list2.add(1);
       	   list2.add(2);
       	   List<Object> list3 = new ArrayList<Object>();
       	   list3.add(1.25);
       	   list3.add(2.5);

       	    List<Object> merged1 = Util.merge(list1, list2);
       	    List<Object> merged2 = Util.merge(list1, list2, list3);

       	    assertEquals(merged1.size(),   4);
       	    assertEquals(merged1.get(0),   "a");
       	    assertEquals(merged1.get(1),   "b");
       	    assertEquals(merged1.get(2),   1);
       	    assertEquals(merged1.get(3),   2);



                                                                      size   8
       	    assertEquals(merged2.size(),   6);
       	    assertEquals(merged2.get(0),   "a");
       	    assertEquals(merged2.get(1),   "b");
       	    assertEquals(merged2.get(2),   1);
       	    assertEquals(merged2.get(3),   2);
       	    assertEquals(merged2.get(4),   1.25);
       	    assertEquals(merged2.get(5),   2.5);
       }


2011   8   25
Debug As ...




2011   8   25
• F8

                • F5 1   (   )

                • F6 1   (       )

                • F7




2011   8   25
8   …


2011   8   25
(   )
2011   8   25
•
                    •               ,   ,
                    •   Variables
                •
                    •
2011   8   25
…
                ¨   ¨   ¨   ¨   ¨   ¨   ¨   ¨...
2011   8   25
→Inspect




2011   8   25
2011   8   25
•

                •

                •

                •

                •

                •
2011   8   25
2011   8   25
OpenGL




2011   8   25
OpenGL




  http://t.co/bet4051

2011   8   25
2011   8   25

Weitere ähnliche Inhalte

Was ist angesagt? (14)

An introduction to functional programming with Go [redux]
An introduction to functional programming with Go [redux]An introduction to functional programming with Go [redux]
An introduction to functional programming with Go [redux]
 
python-geohex
python-geohexpython-geohex
python-geohex
 
20150415 csharp6.0
20150415 csharp6.020150415 csharp6.0
20150415 csharp6.0
 
Boost.勉強会#4 Boost.Proto
Boost.勉強会#4 Boost.ProtoBoost.勉強会#4 Boost.Proto
Boost.勉強会#4 Boost.Proto
 
Reactive x
Reactive xReactive x
Reactive x
 
All set1
All set1All set1
All set1
 
Java
Java Java
Java
 
Programación funcional en Haskell
Programación funcional en HaskellProgramación funcional en Haskell
Programación funcional en Haskell
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOS
 
Tugas pw [10]
Tugas pw [10]Tugas pw [10]
Tugas pw [10]
 
Tugas pw [10]
Tugas pw [10]Tugas pw [10]
Tugas pw [10]
 
Spring Framework Orm Di
Spring Framework Orm DiSpring Framework Orm Di
Spring Framework Orm Di
 
Most Common JavaScript Mistakes
Most Common JavaScript MistakesMost Common JavaScript Mistakes
Most Common JavaScript Mistakes
 
FP is coming... le 19/05/2016
FP is coming... le 19/05/2016FP is coming... le 19/05/2016
FP is coming... le 19/05/2016
 

Andere mochten auch (8)

Le rapport gallois 2012
Le rapport gallois 2012Le rapport gallois 2012
Le rapport gallois 2012
 
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
 
俺とお前とGoogleware
俺とお前とGoogleware俺とお前とGoogleware
俺とお前とGoogleware
 
Memes
MemesMemes
Memes
 
JavaScript再入門
JavaScript再入門JavaScript再入門
JavaScript再入門
 
JavaScript 再入門2
JavaScript 再入門2JavaScript 再入門2
JavaScript 再入門2
 
TypeScript 独習会
TypeScript 独習会TypeScript 独習会
TypeScript 独習会
 
TypeScript Hands-on
TypeScript Hands-onTypeScript Hands-on
TypeScript Hands-on
 

Mehr von Masahiro Wakame

Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Masahiro Wakame
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
Masahiro Wakame
 
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Masahiro Wakame
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築
Masahiro Wakame
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Masahiro Wakame
 
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったDatastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Masahiro Wakame
 
函館IKA Eclipse活用術
函館IKA Eclipse活用術函館IKA Eclipse活用術
函館IKA Eclipse活用術
Masahiro Wakame
 
函館IKA ICS開発情報
函館IKA ICS開発情報函館IKA ICS開発情報
函館IKA ICS開発情報
Masahiro Wakame
 

Mehr von Masahiro Wakame (20)

GoCon2016 spring 自作Webフレームワーク uconを作った話
GoCon2016 spring 自作Webフレームワーク uconを作った話GoCon2016 spring 自作Webフレームワーク uconを作った話
GoCon2016 spring 自作Webフレームワーク uconを作った話
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
TypeScriptは明日から使うべき
TypeScriptは明日から使うべきTypeScriptは明日から使うべき
TypeScriptは明日から使うべき
 
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
 
Google Glass XE17版
Google Glass XE17版Google Glass XE17版
Google Glass XE17版
 
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
 
20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school
 
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築
 
Firefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJSFirefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJS
 
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
 
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったDatastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
 
TypeScript 勉強会
TypeScript 勉強会TypeScript 勉強会
TypeScript 勉強会
 
わかめモナ化LT
わかめモナ化LTわかめモナ化LT
わかめモナ化LT
 
NFC app launcher
NFC app launcherNFC app launcher
NFC app launcher
 
函館IKA Eclipse活用術
函館IKA Eclipse活用術函館IKA Eclipse活用術
函館IKA Eclipse活用術
 
函館IKA ICS開発情報
函館IKA ICS開発情報函館IKA ICS開発情報
函館IKA ICS開発情報
 

デバッグ戦略

  • 1. (@v vakame) Android 2011 8 25
  • 2. • • http://www.slideshare.net/vvakame/debugging-strategy 2011 8 25
  • 3. 2011 8 25
  • 4. 2011 8 25
  • 5. … 2011 8 25
  • 6. • initA() initB() init() A, B public • 2 • ( ) • • … 2011 8 25
  • 7. /** * bitmap . * * @param bitmapArrays */ static void dot1PixelA(Bitmap[][] bitmapArrays) { for (int i = 0; i < bitmapArrays.length; i++) { for for (int j = 0; j < bitmapArrays[i].length; i++) { bitmapArrays[j][i].setPixel(0, 0, Color.RED); } } } /** * bitmap . * * @param bitmapArrays */ static void dot1PixelB(Bitmap[][] bitmapArrays) { for (Bitmap[] bitmapArray : bitmapArrays) { for (Bitmap bitmap : bitmapArray) { for-each bitmap.setPixel(0, 0, Color.RED); } } } 2011 8 25
  • 8. /** * bitmap . * * @param bitmapArrays */ static void dot1PixelA(Bitmap[][] bitmapArrays) { for (int i = 0; i < bitmapArrays.length; i++) { for for (int j = 0; j < bitmapArrays[i].length; i++) { bitmapArrays[j][i].setPixel(0, 0, Color.RED); } } } /** * bitmap . * * @param bitmapArrays */ static void dot1PixelB(Bitmap[][] bitmapArrays) { for (Bitmap[] bitmapArray : bitmapArrays) { for (Bitmap bitmap : bitmapArray) { for-each bitmap.setPixel(0, 0, Color.RED); } } } 2011 8 25
  • 9. Bitmap[][] bitmapArrays = new Bitmap[10][10]; for (int i = 0; i < bitmapArrays.length; i++) { for (int j = 0; j < bitmapArrays[i].length; j++) { bitmapArrays[i][j] = Bitmap.createBitmap(3, 3, Config.ARGB_8888); } } … 2011 8 25
  • 10. ADT 2011/08/25 rev12 2011 8 25
  • 11. 2011 8 25
  • 12. • • • null 2011 8 25
  • 14. • L07 @Override L08 public void onCreate(Bundle savedInstanceState) { L09 super.onCreate(savedInstanceState); L10 setContentView(R.layout.main); L11 L12 try { L13 throw new NullPointerException(); L14 } catch (Exception e1) { L15 try { L16 throw new IllegalArgumentException(e1); L17 } catch (Exception e2) { L18 try { L19 throw new IllegalStateException(e2); L20 } catch (Exception e3) { L21 throw new RuntimeException(e3); L22 } L23 } L24 } L25 } Caused 2011 8 25
  • 15. L08 @Override L09 public void onCreate(Bundle savedInstanceState) { L10 super.onCreate(savedInstanceState); L11 setContentView(R.layout.main); L12 requestWindowFeature(Window.FEATURE_NO_TITLE); L13 } L11 L12 2011 8 25
  • 16. L22 … L09 @Override L10 public void onCreate(Bundle savedInstanceState) { L11 super.onCreate(savedInstanceState); L12 L13 LinearLayout layout1 = new LinearLayout(this); L14 LinearLayout layout2 = new LinearLayout(this); L15 LinearLayout layout3 = new LinearLayout(this); L16 Button button = new Button(this); L17 L18 layout1.addView(layout2); L19 L20 layout2.addView(layout1); layout3.addView(button); layout1 → layout2 → layout1 L21 L22 setContentView(layout1); layout1 → layout2 → layout3 … L23 } 2011 8 25
  • 17. ” • ( ω ´) • • • ← • …… …… • … orz ← 2011 8 25
  • 18. ” • • • • … • 2011 8 25
  • 19. void sort() { List<String> list = new ArrayList<String>(); list.add("cupcake"); list.add(null); list.add("donuts"); list.add(null); list.add("froyo"); Collections.sort(list, new Comparator<String>() { @Override public int compare(String str1, String str2) { if (str1 == null) { return -1; } return str1.compareTo(str2); } }); Log.d("Debug", list.toString()); } NullPointerException … LogCat … 2011 8 25
  • 20. 2011 8 25
  • 21. str2 null String#compareTo(String) null … 2011 8 25
  • 23. 2011 8 25
  • 24. public class Util { /** * 2 1 . * @param list1 1 * @param list2 2 * @return 1 */ public static List<Object> merge(List<Object> list1, List<Object> list2) { list1.addAll(list2); return list1; } /** * 1 . * @param lists * @return 1 */ public static List<Object> merge(List<?>... lists) { List<Object> result = new ArrayList<Object>(); for (List<?> list : lists) { result.addAll(list); } return result; } } 2011 8 25
  • 25. public void test() { List<Object> list1 = new ArrayList<Object>(); list1.add("a"); list1.add("b"); List<Object> list2 = new ArrayList<Object>(); list2.add(1); list2.add(2); List<Object> list3 = new ArrayList<Object>(); list3.add(1.25); list3.add(2.5); List<Object> merged1 = Util.merge(list1, list2); List<Object> merged2 = Util.merge(list1, list2, list3); assertEquals(merged1.size(), 4); assertEquals(merged1.get(0), "a"); assertEquals(merged1.get(1), "b"); assertEquals(merged1.get(2), 1); assertEquals(merged1.get(3), 2); assertEquals(merged2.size(), 6); assertEquals(merged2.get(0), "a"); assertEquals(merged2.get(1), "b"); assertEquals(merged2.get(2), 1); assertEquals(merged2.get(3), 2); assertEquals(merged2.get(4), 1.25); assertEquals(merged2.get(5), 2.5); } 2011 8 25
  • 26. public void test() { List<Object> list1 = new ArrayList<Object>(); list1.add("a"); list1.add("b"); List<Object> list2 = new ArrayList<Object>(); list2.add(1); list2.add(2); List<Object> list3 = new ArrayList<Object>(); list3.add(1.25); list3.add(2.5); List<Object> merged1 = Util.merge(list1, list2); List<Object> merged2 = Util.merge(list1, list2, list3); assertEquals(merged1.size(), 4); assertEquals(merged1.get(0), "a"); assertEquals(merged1.get(1), "b"); assertEquals(merged1.get(2), 1); assertEquals(merged1.get(3), 2); size 8 assertEquals(merged2.size(), 6); assertEquals(merged2.get(0), "a"); assertEquals(merged2.get(1), "b"); assertEquals(merged2.get(2), 1); assertEquals(merged2.get(3), 2); assertEquals(merged2.get(4), 1.25); assertEquals(merged2.get(5), 2.5); } 2011 8 25
  • 28. • F8 • F5 1 ( ) • F6 1 ( ) • F7 2011 8 25
  • 29. 8 … 2011 8 25
  • 30. ( ) 2011 8 25
  • 31. • , , • Variables • • 2011 8 25
  • 32. ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨... 2011 8 25
  • 34. 2011 8 25
  • 35. • • • • • 2011 8 25
  • 36. 2011 8 25
  • 37. OpenGL 2011 8 25
  • 39. 2011 8 25