Thứ Bảy, 7 tháng 10, 2017

Cảm ơn em vì đã yêu anh...


Một cánh cửa khác khép lại là một cánh cửa mới mở ra.

Hồi ấy tìm tới gần 3h sáng mới thấy facebook em.
Tìm facebook sdt chả hiểu sao lại ra 1 thằng đàn ông, trời ạ.

Em là một trong số ít cô gái anh yêu từ cái nhìn đâu tiên.
Từ khuôn mặt, cách nói chuyện cho đến phong cách giẵm giày.  haha nhìn đáng yêu kinh.
a sẽ chẳng nghĩ là mình đủ giỏi để có thể cưa được em, một cô gái xinh xắn và là mơ ước của anh.
yêu em cứ như là a yêu một cô tiên ý, sướng phát khóc,
a có gọi điện cho mẹ khoe luôn r.
a sẽ giấu em khỏi tất cả bạn bè, a sẽ để không ai biết tới. sẽ không ai động được vào em.
Dù có thế nào đi chăng nữa , a cũng muốn được lo lắng cho em. quan tâm em. lo cho em no đủ, giàu sang như người ta.

Bây h trong lòng anh chỉ có 2 điều lo lắng.
bao h em bỏ anh và người yêu cũ.
2 năm, phải mất 2 năm a mới yêu được em, người làm con tim anh rung động sau những tổn thương của mối tình đâu, em là người đã thắp sáng lại con tim anh sau những đen tối và tưởng như không thể vượt qua. Sau tất cả, a đã nghĩ sẽ k dành cho ai tất cả tình yêu và sự tin tưởng như thế nữa. Nhưng riêng với em là ngoại lệ. lần này a sẽ đánh cược 1 lần nữa. hy vọng a sẽ đúng.

Mối tình đầu mà em, người a dành hết tình cảm cho mà, có lẽ sẽ có 1 lúc nào đó, a chớt nhớ về người ta, sẽ có thể làm em buồn, nhưng a hy vọng em k biết, vì với anh bây h nó chỉ là một kỉ niệm đẹp mà thôi. em nhé. a k nghĩ a lại yêu được một người tuyệt vời như em.
cám ơn em đã đến bên anh những tháng ngày tuổi trẻ. ahihi
Em biết điều t2 là gì không? a sợ em bỏ anh. a yêu một ai là sẽ dành hết tình cảm tâm tư thời gian mọi thứ, mọi thứ cho người ấy, nếu bỏ anh, a sẽ chẳng nghĩ được mình sống sao nữa. nó còn bị tổn thương hơn rất rất nhiều lần,
a không sợ khổ, a không sợ vất vả, a có thể thay đổi tất cả vì em, nhưng rồi a lại sợ niềm tin lại bị đánh rơi. chắc buồn lắm đó em.

a cám ơn em đã đến bên anh lúc như thế này, cả tuổi thanh xuân đã dành cho anh.
năm nay 26t. đợi em cả 4 năm nữa. Đợi người mình yêu cả đời còn đợi được huống chi là 3,4 năm phải không em.
 Yêu em nhiều lắm.









Thứ Hai, 25 tháng 5, 2015

Android 5.1 Lollipop SDK

By Jamal Eason, Product Manager, Android
Yesterday we announced Android 5.1, an updated version of the Android Lollipop platform that improves stability, provides better control of notifications, and increases performance. As a part of the Lollipop update, we are releasing the Android 5.1 SDK (API Level 22) which supports the new platform and lets you get started with developing and testing.

What's new in Android 5.1?

For developers, Android 5.1 introduces a small set of new APIs. A key API addition is support for multiple SIM cards, which is important for many regions where Android One phones are being adopted. Consumers of Android One devices will have more flexibility to switch between carriers and manage their network activities in the way that works best for them. Therefore you, as a developer, can create new app experiences that take advantage of this new feature.
In addition to the new consumer features, Android 5.1 also enhances enterprise features to better support the launch of Android for Work.
 
Android 5.1 supports multiple SIM cards on compatible devices like Android One.

Updates for the Android SDK

To get you started with Android 5.1, we have updated the Android SDK tools to support the new platform and its new APIs. The SDK now includes Android 5.1 emulator system images that you can use to test your apps and develop using the latest capabilities and APIs. You can update your SDK through the Android SDK Manager in Android Studio.
For details on the new developer APIs, take a look at the API Overview.

Coming to Nexus devices soon

Over the next few weeks, we’ll be rolling out updates for Android 5.1 to the following Nexus devices: Nexus 4, Nexus 5, Nexus 6, Nexus 7 [2012], Nexus 7 [2012] (3G), Nexus 7 (2013), Nexus 7 [2013] (3G/LTE), Nexus 9, Nexus 9 (LTE), Nexus 10, and Nexus Player.

Next Steps

As with all Android releases, it’s a good idea to test your apps on the new platform as soon as possible. You can get started today using Android 5.1 system images with the emulator that’s included in the SDK, or you can download an Android 5.1 Nexus image and flash the system image to your Nexus device.
If you have not had a chance to update your app to material design, or explore how your app might work on Android Wear,Android TV, or even Android Auto, now is a good time to get started with the Android 5.1 SDK update.

Source: http://android-developers.blogspot.com/2015/03/android-51-lollipop-sdk.html

Thứ Hai, 18 tháng 5, 2015

Ripple effect in android Lollipop

In this below, I have two example about ripple effect . it begin use from Android Lollipop 5.0: 

1.
ripple.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple android:color="@color/COLOR_WHILE_PRESSING" xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@drawable/background"></item>
</ripple>
background.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
 <solid android:color="@color/BACKGROUND_COLOR" />
 <corners android:radius="6dp" />
</shape>

Add two file drawable forder and try to view.
2.The same
<Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@drawable/ripple"

    />
Where the ripple.xml is:
<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
                      android:color="?android:colorControlHighlight">
        <item android:id="@android:id/mask">
            <shape android:shape="oval">
                <solid android:color="?android:colorAccent" />
            </shape>
        </item>
 </ripple>

Thanks


Thứ Năm, 19 tháng 6, 2014

Đọc và Suy ngẫm part 1

http://pham-thanh.blogspot.com/2014/06/tu-hoc-lap-trinh-trong-10-nam-peter.html

Part 2 :
http://www.webtretho.com/forum/f3950/bai-hoc-tu-cay-soi-2045944/

Tích hợp Thanh toán Paypal trong ứng dụng Android

đang tìm hiểu....
code example download https://github.com/paypal/PayPal-Android-SDK
để test thì tạo 1 tài khoản trên https://developer.paypal.com
sau đó vào https://developer.paypal.com/webapps/developer/applications/accounts để tạo 1 tài khoản personal (ở đây có 2 loại 1 là bussiness 2 là personal )  để test ứng dung. tạo ít tiền trong cái tài khoản giả này nhé.
tạo 1 ứng dụng bất kỳ trong thẻ my app, chú ý chỗ Test credentials có 1 client ID dùng để test
down source code về rồi import vào eclipse
chạy thử thì bạn sẽ nhận đc 1 chuỗi json truyền về trong đó có mã ID. mình cần lưu lại mã ID lên server để sau này thanh toán. nhưng đây là trong môi trường giả lập
để test thực sự với tài khoản sandbox bạn phải chuyển từ
 private static final String CONFIG_ENVIRONMENT = PayPalConfiguration.ENVIRONMENT_NO_NETWORK;
thành
private static final String CONFIG_ENVIRONMENT = PayPalConfiguration.ENVIRONMENT_SANDBOX;
 thay giá trị của CONFIG_CLIENT_ID bằng client ID của app vừa tạo
rồi ok. chạy thử.
bây h đến tài khoản thực
(chú ý là tài khoản thực thì cái CONFIG_CLIENT_ID) khác nhau nhé. bạn có thể xem trong app

Thứ Sáu, 2 tháng 5, 2014

Hướng dẫn sử dụng GreenDao trong Android

1. GreenDao là gì?
Nó là một thư viện mà theo mình hiểu nôm na thì nó là một cách thức để giao tiếp ,làm việc với SQLite trong ứng dụng Android. GreenDao có từ năm 2012 và bây giờ đã đến phiên bản 1.3
+,So với cách làm việc thông thường thì việc sử dụng GreenDao mang lại rất nhiều ưu điểm:
    1.Hiệu suất tối đa
    2.Dễ dàng sử dụng
    3.Tối ưu hóa cho Android
    4.Sử dụng bộ nhớ tối thiểu
    5. kích cỡ thư viện nhỏ
    và theo như mình tìm hiểu thì :
         -, Tốc độ thực thi của GreenDao nhanh hơn rất nhiều so với việc thao tác trên ORMLite:
          cụ thể là:
           - 3 lần:  Viết
           - 12 lần: Đọc 10000 đối tượng trong một bảng
           - 2-3 lần: Đọc một hàng
           - 15 lần : Sử dụng câu lệnh tìm kiếm "LIKE" for 100 bản ghi trong 10000 đối tượng của bảng
       -, GreenDao cũng nhanh hơn so với việc thực hiện câu lệnh raw SQLite
Nói chung là hiểu nôm na đây là cách thao tác mới với SQLite, nó còn mới, dễ sử dụng, nhanh, gọn và rất cần học.
2. GreenDao sẽ làm gì?
Nó sẽ tự động sinh ra các thực thể cùng các thuộc tính mà mình quy định gọi là Entity chẳng hạn, mỗi Entity lại có một Lớp được sinh kèm là EntityDao. Lớp này có chứa tất cả các phương thức cơ bản để có thể tương tác với SQLite ví dụ như insert, update, delete và tham số truyền vào thường là một đối tượng của một thực thể.
Ngoài ra thì còn 2 lớp khác được sinh ra kèm là DaoMaster  và DaoSession

3. Hướng dẫn thao tác với GreenDao trong Android
Mình thích học qua các ví dụ cho nó trực quan và dễ hiểu nên mình sẽ làm một ví dụ sử dụng GreenDao luôn, vừa làm mình sẽ vừa giải thích cho các bạn

3.1 tạo các lớp thực thể và bảng
 GreenDao có một ví dụ để tham khảo, các bản có thể download tại đây
       https://github.com/greenrobot/greenDAO
Mình sẽ hướng dẫn thông qua project greenDao cung cấp sẵn cho nó tiện:
sau đó bạn import  - Java project       : DaoExampleGenerator
                              - Android Project:  DaoExample
Java project Chắc chắn sẽ lỗi vì bạn thiếu thư viện, Bạn download thư viện ở đây:
(có thể có sẵn trong thư mục vừa download , mình chưa kiểm tra) Download thư viện dành cho GreenDao
-, Sau khi download xong, trong đây có 2 thư viện là freemarker.jar và greendao-generator.jar  dùng để  import vào Java project và greendao-1.3.1.jar dùng để import vào Android Project

Bây giờ bắt đầu thực hành nhé:
0. tạo 1 Androdi project , mình đặt là sampleAndroid ,sau đó tạo 1 thư mục source có tên src-gen
1.bạn tạo 1 Java project cho việc tự sinh các lớp thực thể mà mình sẽ giao tiếp trong Android
Để tiện mình sẽ lấy luôn Java project của greenDao ,project này sẽ tự sinh ra 3 lớp thực thể gồm có
Note:  id ---------- Long
          text ---------String
          comment --- String
Customer:  id ---------- Long
                 text ---------String
Order    : id ------------- Long
               date----------- Date
               customerId---- Long

Các bạn Import project  DaoExampleGenerator mà mình đã nói ở trên rồi import 2 thư viện   freemarker.jar và greendao-generator.jar  đã download ở trên vào.
có mỗi 1 lớp là ExampleDaoGenerator.java , ở đây mỗi bảng trong SQLite sẽ được tạo ra dựa theo các thuộc tính của mỗi đối tượng . Tại hàm main ()
Schema schema = new Schema(3, "de.greenrobot.daoexample");
        addNote(schema);
        addCustomerOrder(schema);

        new DaoGenerator().generateAll(schema, "C:/Users/hung/Documents/FriendBook/sampleAndroid/src-gen");
Trong đó:  "de.greenrobot.daoexample" là nơi lưu trữ các Entity trong thư mục Android project C:/Users/hung/Documents/FriendBook/sampleAndroid/src-gen (khi các bạn tạo Android project thì tạo 1 thư mục source tên là src-gen như đã nói ở trên).sampleAndroid là Android project của mình

- tạo bảng có tên là Note:
private static void addNote(Schema schema) {
        Entity note = schema.addEntity("Note");
        note.addIdProperty();
        note.addStringProperty("text").notNull();
        note.addStringProperty("comment");
        note.addDateProperty("date");
    }
- 2 bảng Customer và Order có quan hệ 1-n , bảng Order và Customer có quan hệ 1-1 nên ta sẽ tạo ra như sau:
private static void addCustomerOrder(Schema schema) {
        Entity customer = schema.addEntity("Customer");
        customer.addIdProperty();
        customer.addStringProperty("name").notNull();

        Entity order = schema.addEntity("Order");
        order.setTableName("ORDERS"); // "ORDER" is a reserved keyword
        order.addIdProperty();
        Property orderDate = order.addDateProperty("date").getProperty();
        Property customerId = order.addLongProperty("customerId").notNull().getProperty();
        order.addToOne(customer, customerId);

        ToMany customerToOrders = customer.addToMany(order, customerId);
        customerToOrders.setName("orders");
        customerToOrders.orderAsc(orderDate);
    }
các bạn để ý "customerToOrders.setName("orders");" . khi tạo xong thì đối tượng của Lớp Customer sẽ có 1 hàm là getorders() trả về danh sách các đối tượng Order có customerId =Customer .getID();

chạy Java project và ta sẽ thấy trong thư mục: C:/Users/hung/Documents/FriendBook/sampleAndroid/src-gen/de/greenrobot/daoexample các lớp đã được sinh ra gồm 8 lớp: Note.java,NoteDao.java,Order.java,OrderDao.java,Customer.java,CustomerDao.java,DaoMaster.java,DaoSession.java
Nếu đúng vậy là ok.

3.2 Thao tác với SQLite

1. tạo SQLite tên
  DevOpenHelper openHelper = new DevOpenHelper(MainActivity.this,
    "sample-db", null);
  SQLiteDatabase db = openHelper.getWritableDatabase();
  DaoMaster daoMaster = new DaoMaster(db);
  //khởi tạo session để thực hiện thao tác với SQLite 
  DaoSession daoSession = daoMaster.newSession();
 (Các bạn có thể tham khảo tại lớp MainActivity.java trong project DamExample ở đã download ở trên)
2. Cú pháp thực hiện thao tác với SQLite
2.1 Câu lệnh insert
 - việc insert vào SQLite sẽ thực hiện theo đối tượng của các thực thể ví dụ:
// insert 10 bản ghi vào bảng Note
 for (int i = 0; i < 10; i++) {
  Note note = new Note(null, "hung" + i, "comment" + i);
  daoSession.getNoteDao().insert(note);
 }
 //insert 2 bản gì vào bảng Customer
 Customer custm = new Customer(null, "customer");
 Customer custm2 = new Customer(null, "customer2");
 daoSession.getCustomerDao().insert(custm);
 daoSession.getCustomerDao().insert(custm2);
  
 //insert 6 bản ghi vào bảng Order theo ID của đối tượng "custm" ở trên 
 for (int i = 0; i < 6; i++) {
  Order order = new Order(null, new Date(), custm.getId());
  daoSession.getOrderDao().insert(order);
 }
 //insert 6 bản ghi vào bảng Order theo ID của đối tượng "custm2" ở trên
 for (int i = 0; i < 9; i++) {
  Order order = new Order(null, new Date(), custm2.getId());
  daoSession.getOrderDao().insert(order);
 }
Chú ý: Chúng ta cũng có thể insert trực tiếp bằng câu lệnh : daoSession.insert(entity) ,daoSession.delete(entity),,daoSession.update(entity);
- Insert vào một bảng có quan hệ với nhat : ví dụ như khi insert thêm một bản ghi của Bảng order của đối tượng custm thì làm như sau:

// insert 1 bản ghi của bảng Order
//lấy list các Order của một customer (không cần thiết)  mình lấy ra chỉ để so //sánh kết qủa trước và sau insert thôi.

List listOrderCus = customer.getOrders();
Order order = new Order(null, new Date(), customer.getID());
daoSession.insert(order);
// sau đó đến đấy bạn phải cập nhật lại listOrder
// nếu không listOrderCus của bạn giữ nguyên size không thay đổi 
    // cách 1
 listOrderCus.add(order);
     //cách 2 
 customer.resetOrders();
2.2 Câu lệnh Truy vấn
- Lấy tất cả các bản ghi trong 1 bảng

//lấy tất cả các bản ghi của một bảng
List listOrder = daoSession.getOrderDao().queryBuilder().build().list();
- Lấy tất cả các bản ghi trong một bản theo điều kiện
cách 1:
Query queryNote = daoSession.getNoteDao().queryBuilder()
    .where(new StringCondition("_ID >5")).build();
List listNote = queryNote.list(); 
cách 2:
List listNote2 = daoSession.getNoteDao().queryBuilder().where(Properties.Id.gt(5)).list();
Riêng cách này thì bạn phải nhớ các hàm để thực hiện câu lệnh truy vấn:
eq(): so sánh bằng
notEq() :so sánh không bằng
like() : như SQL
in(): như SQL
gt(): lớn hơn
lt(): nhỏ hơn
ge(): lớn hơn hoặc bằng
le(): nhỏ hơn hoặc bằng
isNull() và isNotNull : giống SQL
các bạn có thể tham khảo thêm tại đây: Property của greenDao

- Lấy tất cả các bản ghi trong các bảng có liên kết:

//tài liệu tham khảo, mình chưa test thử
Query query = userDao.queryBuilder().where(
new StringCondition("_ID IN " +
"(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build();
- Lấy các bản ghi trong bảng Order của một đối tượng Customer hoặc từ một đối tượng Order

// lấy tất cả các Order của một customer
    List listOrderCus = customer.getOrders();
// lấy tất cả các Order của một order của customer
    List listOrderCus =order.getCustomer().getOrders();
2.3 Câu lệnh Update
- update một bản ghi trong SQLite ví dụ bản ghi của bảng Note

// update
        Note note= new Note();
        note.setId(listNote.get(0).getId());
 note.setText("tran hung deptrai");
 noteDao.update(note);
//trong đó listNote là danh sách tất cả các bản ghi trong bảng Note
// mà mình đã lấy ra trước đó
- update một bản ghi của một bảng có quan hê ví dụ như update một bản ghi của bảng Order (tương tự như khi insert):
Sau khi update sau các bạn nhớ thực hiện:

customer.resetOrders();
2.4 Câu lệnh Delete
- Delete một bản ghi trong một bảng

// delete
   Note note= new Note(listNote.get(0).getId());
   daoSession.getNoteDao().delete(note);
   
//hoặc delete theo ID
   daoSession.getNoteDao().deleteByKey(id);
- Delete một bản ghi có quan hệ 1-1 ví dụ như delete một bản ghi của bảng Order (giống insert) khi thực hiện xong nhớ

listOrderCus.remove(order);
       //hoặc
customer.resetOrders();
   
-Delete một bản ghi có quan hệ 1-n ví dụ

// delete Customer
  Customer customer = listCustomer.get(0);
   for (int i = 0; i < customer.getOrders().size(); i++) {
 daoSession.delete(customer.getOrders().get(i));
   }
   daoSession.delete(customer);
 Không biết có câu lệnh delete các bản ghi của bảng Order khi delete một bản ghi của Customer hay  không? Cái này mình không biết nên làm thủ công. :D
sau khi làm xong nhớ close lại nhé.

 daoSession.clear();
 db.close();
 openhelper.close();

Rồi như vậy là xong.
Riêng mình thấy thao tác với greenDao rất là hay. :) Hy vọng các bạn thấy bổ ích