Hôm nay rãnh rỗi ngồi viết code cho bài viết: Tải nhạc (phim) từ trang nhaccuatui.com.
Chương trình này tạm gọi là NCTDownloader. Phiên bản 1.0.0.0 download về tại đây.
Ở phiên bản này NCTDownloader chỉ lấy link download trực tiếp bài nhạc hay video clip.
01/05/2013
02/04/2013
Cài đặt custom FontAndColorTheme in XCode
Download file FontAndColor miễn phí ở một số trang như sau:
- http://amychr.wordpress.com/2011/06/05/xcode-color-themes/
- http://undefinedvalue.com/2012/10/30/havenjark-color-theme-xcode-4
~/Library/Developer/Xcode/UserData/FontAndColorThemes
Labels:
XCode
22/03/2013
OpenGL blend function
Trước đây làm việc OpenGL mà không hiểu mấy về cái hàm gl.glBlendFunc(a,b). Hôm qua có thời gian ngồi xem tài liệu kỹ lại thì ra là thế này. Gọi D là màu của destination (màu đang có), S là màu source (màu ta cần pha với màu đang có), ta có công thức tính màu sau khi pha như sau:
R = a*S+b*D
Lấy ví dụ:
- Nếu a= GL_ONE, b=GL_ONE, S=(1,0,0) (màu đỏ), D=(0,0,1) (xanh da trời). Ta sẽ có R=(1,0,1) (màu đỏ tươi)
- Nếu a=GL_SRC_ALPHA, b= GL_ONE_MINUS_SRC_ALPHA, S=(0.5,1,0,0), D=(1,0,0,1). Ta sẽ có:
- Ra = 0.5*0.5+(1-0.5)*1=0.25+0.5 = 0.75
- Rr = 0.5*1+(1-0.5)*0 = 0.5
- Rg = 0.5*0+(1-0.5)*0 = 0
- Rb = 0.5*0+(1-05)*1 = 0.5
20/03/2013
ARC in Mac OS X 10.6.8
Một ngày vật lộn với việc build app với ARC chạy trên Mac OS X 10.6.8 bằng XCode 4.6.1 (Lưu ý: XCode 4.6 có bug khi build app với ARC chạy trên Mac OS X 10.6.8). Nếu tạo một Project mới với ARC được bật thì mọi việc OK. Tuy nhiên khi add mấy file mã nguồn vào thì cứ bị lỗi:
Symbol not found: _objc_retain
Thử đủ cách lượm lặt từ Google như:
Symbol not found: _objc_retain
Thử đủ cách lượm lặt từ Google như:
- Add -fobjc-arc vào Other linker flags.
- Sử dụng -weak_library, -weak_framework.
- Tắt Implicit link to system library option
15/03/2013
Kiểm tra một số có là luỹ thừa của 2 hay không nhanh nhất
Thông thường để muốn kiểm tra một số có là luỹ thừa của 2 hay không thì chúng ta đem số này chia cho 2 như sau:
1: 000001
2: 000010
4: 000100
8: 001000
16: 010000
32: 100000
Xét số n = 32 ( 100000) và n -1 = 31 (011111) và rõ ràng n&(n-1) = 0.
Ta có giải thuật như sau:
public boolean isPowerOfTwo(int n){
if( 0 == n|| 1 == n ) return true;
int x = n / 2;
int y = n%2;
if (1 == y) return false;
return isPowerOfTwo(x);
}
Hoặc chúng ta không cần viết đệ qui như sau:
public boolean isPowerOfTwo(int n){
boolean ret;
if( 0 == n|| 1 == n ){
ret = false;
}else{
int x = n / 2;
int y = n%2;
while ( x > 0){
if (1 == y) {
ret = false;
break;
};
x = x / 2;
y = x%2;
}
ret = true;
}
return ret;
}
Sau đây là cách nhanh hơn sử dụng hàm logarit:
public boolean isPowerOfTwo(int n){
double logn2 = Math.log(n)/Math.log(2);
int logn2i = (int) (Math.floor(logn2));
if(logn2-logn2i==0)
return true;
else
return false;
}
Tuy nhiên nếu chúng ta để ý một chút chúng ta sẽ có cách kiểm tra nhanh nhất. Các số là luỹ thừa của 2 đều có 1 chữ số 1 trong biểu diễn nhị phân của chúng. Ví dụ số1: 000001
2: 000010
4: 000100
8: 001000
16: 010000
32: 100000
Xét số n = 32 ( 100000) và n -1 = 31 (011111) và rõ ràng n&(n-1) = 0.
Ta có giải thuật như sau:
public boolean isPowerOfTwo(int n){
return ((n!=0) && (n&(n-1))==0);
}
Thật ngắn gọn, đơn giản phải không các bạn!
16/02/2013
Android 4.2.2 (JDQ39) changelog
Google has release Android 4.2.2 (Jelly Bean). Nexus tablets ( Nexus 7 (non-3G), Nexus 10) and Galaxy Nexus (takju) can be updated the new version OS. Some changes:
- More secured ADB.
- Bug fix for bluetooth audio streaming
- Download notification now shows remaining time
- Quick Settings:Toggle WiFi and Bluetooth on/off by a long-touch
- Performance enhancements
- New notification sounds (wireless charging and low battery)
Google vừa phát hành bản nân cấp Android 4.2.2. Các smartphone Nexus 4, Galaxy Nexus và máy tính bảng Nexus 7, Nexus 10 đã có thể cập nhật bản Android 4.2.2.
Một vài điểm mới trong bản nâng cấp Android 4.2.2:
- An toàn hơn cho cầu nối ADB.
- Vá lỗi âm thanh bị lắp khi dùng Bluetooth và lỗi tự khởi động lại thiết bị.
- Thông báo (Notification) tải ứng dụng trình bày thông tin về thời gian còn lại cần để tải.
- Thiết lập nhanh (Quick Settings):Người dùng có thể chạm vào và giữ lâu (long touch) lên biểu tượng Wi-Fi và Bluetooth để thay đổi thiết lập.
- Âm báo mới cho chức sạc không dây và cảnh báo pin sắp hết.
- Tốc độ hiển thị và lướt ảnh trong Gallery nhanh hơn.
Labels:
Android
04/01/2013
Hệ điều hành dành cho Smartphone năm 2013
- Ubuntu trình làng hệ điều hành dành cho smartphone Ubuntu for phone (UFP). UFP dựa trên bản Ubuntu dành ch o PC. Mẫu điện thoại di động dùng UFP sẽ ra mắt vào CES 2013 ở Las Vegas từ 8/1-11/1. Các ứng dụng chạy trên UFP là các ứng dụng HTML5 hay các ứng dụng Qt/QML.
- Apple thử nghiệm iOS7 và iPhone thế hệ thứ 6.
- Smartphone Tizen sẽ ra đời vào năm 2013: Tizen là sự kết hợp giữa MeeGo và LiMo được tài trợ bởi Intel và Samsung. Samsung và NTT Docomo đang hợp tác để năm 2013 này, điện thoại sử dụng Tizen sẽ ra đời. Ngoài ra Vodafone, France Telecom,Panasonic, NEC cũng đang phát triển thiết bị sử dụng Tizen.
- Jolla trình làng Sailfish OS dự trên Mer tại Phần Lan.
- Mozilla thử nghiệm Firefox OS.
- RIM tuyên bố sẽ cho ra lò smartphone sử dụng Blackberry 10 trong năm 2013.
Labels:
Blackberry,
Firefox,
iOS,
Sailfish OS,
Tizen,
Ubuntu
03/01/2013
Khắc phục lỗi trùng ObjectID trong XCode 4.5
Một dự án Mac OS bạn sử dụng các phiên bản cũ (4.3-) để phát triển. Sau một khoảng thời gian bạn đã nâng cấp XCode lên phiên bản 4.5. Lúc này bạn mở lại các dự án cũ, thỉnh thoảng bạn gặp lỗi sau:
The document "name.xib" could not be opened. The operation couldn’t be completed. Two members of the document have the object ID 17. This may have happened through an external edit, such as an SCM merge operation.
Trường hợp của bạn có thể không phải object ID 17 mà là một con số khác.
Để khắc phục lỗi này chúng ta mở nib file bị lỗi trong trường hợp này là name.xib bằng text editor và tìm cụm ">17" (thay số 17 bằng số trong trường hợp của bạn). Thay đổi số này bằng một số lớn lớn rồi lưu lại.
The document "name.xib" could not be opened. The operation couldn’t be completed. Two members of the document have the object ID 17. This may have happened through an external edit, such as an SCM merge operation.
Trường hợp của bạn có thể không phải object ID 17 mà là một con số khác.
Để khắc phục lỗi này chúng ta mở nib file bị lỗi trong trường hợp này là name.xib bằng text editor và tìm cụm ">17" (thay số 17 bằng số trong trường hợp của bạn). Thay đổi số này bằng một số lớn lớn rồi lưu lại.
31/12/2012
Cắt số lẻ trong số double
Trong các phần mềm tài chính, ngân hàng thường có bài toán như sau:
Cho một số double, bạn hãy cắt bỏ các số lẻ sau số lẻ thứ k trong phần thập phân.
Đứng trước bài toán này bạn thường nghĩ đến giải pháp cắt chuỗi. Biến double sang NSString rồi cắt chuỗi.
Tuy nhiên khi bạn chuyển số double sang NSString bằng string format %.*f bạn sẽ gặp phải vấn đề làm tròn số lên. Bạn lại nghĩ ra vậy tôi lấy đến k+1 số lẻ rồi cắt bỏ chữ số cuối cùng.Tuy nhiên giải pháp này lại bị vấn đề làm tròn số lan truyền khi chữ số thứ k+1 là số 9. Để tránh làm tròn số lan truyền một bạn khác lại đề nghị chuyển double sang NSNumber trước khi chuyển sang NSString. Một điều không may cho giải pháp này khi bạn chuyển các số double như 1.05, 0.05 thì bạn sẽ nhận được các số 1.049999..., 0.049999,.. (xem bài viết Vấn đề làm tròn số khi dùng double). Ngoài ra bạn cũng có thể nghĩ đến các hàm C khác khi modf, ... F giới thiệu cách sử dụng hàm floor như sau:
Cho một số double, bạn hãy cắt bỏ các số lẻ sau số lẻ thứ k trong phần thập phân.
Đứng trước bài toán này bạn thường nghĩ đến giải pháp cắt chuỗi. Biến double sang NSString rồi cắt chuỗi.
Tuy nhiên khi bạn chuyển số double sang NSString bằng string format %.*f bạn sẽ gặp phải vấn đề làm tròn số lên. Bạn lại nghĩ ra vậy tôi lấy đến k+1 số lẻ rồi cắt bỏ chữ số cuối cùng.Tuy nhiên giải pháp này lại bị vấn đề làm tròn số lan truyền khi chữ số thứ k+1 là số 9. Để tránh làm tròn số lan truyền một bạn khác lại đề nghị chuyển double sang NSNumber trước khi chuyển sang NSString. Một điều không may cho giải pháp này khi bạn chuyển các số double như 1.05, 0.05 thì bạn sẽ nhận được các số 1.049999..., 0.049999,.. (xem bài viết Vấn đề làm tròn số khi dùng double). Ngoài ra bạn cũng có thể nghĩ đến các hàm C khác khi modf, ... F giới thiệu cách sử dụng hàm floor như sau:
floor(x*pow(10,k)+1E-10)/pow(10,k)
29/12/2012
Chạy ứng dụng Android trên PC
Đọc các bài báo sau trên báo Tuổi trẻ:
Về công nghệ thì theo các bài báo có chút thông tin tóm tắt như sau:
- Chạy mọi ứng dụng Android trên Mac
- Đem 500.000 ứng dụng Android lên Windows
- BlueStacks mang ứng dụng Android lên Windows 8
- Trải nghiệm ứng dụng Android trên Windows
- Chạy ứng dụng và game Android trên PC
Về công nghệ thì theo các bài báo có chút thông tin tóm tắt như sau:
- BlueStacks sử dụng BlueStacks App Player (BAP)
- BAP thực hiện giải pháp chuyển đổi ảo hoá Windows/Mac OS nhanh chóng thông qua công nghệ đám mây BlueStack Cloud Connect
- Cho phép đồng bộ ứng dụng trên Android smartphone với PC.
VẤN ĐỀ LÀM TRÒN SỐ KHI DÙNG DOUBLE
Có bao giờ bạn gặp rắc rối khi gán 0.05 vào 1 biến double:
double f = 0.05
Rồi sau đó bạn tính
floor(f*100)
Bạn mong đợi nhận được 5. Tuy nhiên kết quả bạn nhận được lại là 4.
Để tìm hiểu nguyên nhân tại sao như vậy chúng ta bắt đầu tìm hiểu từ cách thức lưu số double trong bộ nhớ ra sau.
Số double sử dụng 8 byte hay 64 bit để lưu. Trong đó:
Vậy độ chính xác (machine epsilon) khi làm tròn là 2-53 do khoảng cách giữa hai số 2n và 2n+1 là 2n-52
Phần số mũ e được biểu diễn dạng offset-binary (excess-K) K=2n-1 với n là số bit. Ở đây n = 11.
Giá trị của số = (-1)signx 2exponent - 1023x1.mantissa
Bây giờ ta hãy xem số 0.05 lưu trong bộ nhớ ra sao?
0.05 = 0.00001100110011001100110011001100110011001100110011001100... = 0.1100110011001100110011001100110011001100110011001100... x 2-4
Phần sau dấu phẩy bị cắt 52 bít là:
110011001100110011001100110011001100110011001100110
Bây giờ bạn tính lại sẽ thấy giá trị là:
0.049999999999999988897769753748434595763683319091796875
Rõ ràng số này nhân với 100 và tính floor là 4 chứ không phải là 5.
Để lấy floor chính xác bạn cần cộng thêm một lượng 10-N. Trong đó N là số chữ số bạn quan tâm.
double f = 0.05
Rồi sau đó bạn tính
floor(f*100)
Bạn mong đợi nhận được 5. Tuy nhiên kết quả bạn nhận được lại là 4.
Để tìm hiểu nguyên nhân tại sao như vậy chúng ta bắt đầu tìm hiểu từ cách thức lưu số double trong bộ nhớ ra sau.
Số double sử dụng 8 byte hay 64 bit để lưu. Trong đó:
- 1 bit dùng để lưu dấu của số double (sign bit)
- 11 bit dùng để lưu độ lớn của số mũ (exponent)
- 52 bit + 1 bit có giá trị mặc định để lưu phần định trị (mantissa)
Vậy độ chính xác (machine epsilon) khi làm tròn là 2-53 do khoảng cách giữa hai số 2n và 2n+1 là 2n-52
Phần số mũ e được biểu diễn dạng offset-binary (excess-K) K=2n-1 với n là số bit. Ở đây n = 11.
Giá trị của số = (-1)signx 2exponent - 1023x1.mantissa
Bây giờ ta hãy xem số 0.05 lưu trong bộ nhớ ra sao?
0.05 = 0.00001100110011001100110011001100110011001100110011001100... = 0.1100110011001100110011001100110011001100110011001100... x 2-4
Phần sau dấu phẩy bị cắt 52 bít là:
110011001100110011001100110011001100110011001100110
Bây giờ bạn tính lại sẽ thấy giá trị là:
0.049999999999999988897769753748434595763683319091796875
Rõ ràng số này nhân với 100 và tính floor là 4 chứ không phải là 5.
Để lấy floor chính xác bạn cần cộng thêm một lượng 10-N. Trong đó N là số chữ số bạn quan tâm.
25/12/2012
LƯU Ý KHI RESHOW UIPOPOVERCONTROLLER
Vì một lý do nào đó bạn phải reshow lại UIPopoverController ví dụ như bạn phải canh giữa màn hình, khi đó bạn cần phải đăng ký lại các notification nếu có cho UIPopoverController này. Nếu không sau khi reshow thì UIPopoverController không nhận notification nữa.
Ví dụ bạn muốn điều chỉnh lại kích thước của UIPopoverController mỗi khi bàn phím hiện ra chúng ta phải đăng ký nhận notification UIKeyboardWillShowNotification như sau:
//MyPopoverViewCtrl.h
@interface MyPopoverViewCtrl:UIPopoverController
-(void) reshow;
@end
//MyPopoverViewCtrl.m
@implementation MyPopoverViewCtrl
-(void) registerKeyboardEvent {
[ [NSNotificationCenter defaultCenter] addObserver:self select:@selector(doSomething:) name:UIKeyboardWillShowNotification object:nil];
}
-(void) unregisterKeyboardEvent{
[ [NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
}
- (id)initWithContentViewController:(UIViewController *)viewController
self = [super initWithContentViewController:viewController];
if(self){
[self registerKeyboardEvents];
}
return self;
}
-(void) dealloc{
[self unregisterKeyboardEvent];
[super dealloc];
}
-(void) reshow{
[self unregisterKeyboardEvent];
//do reshow
[self registerKeyboardEvent];
}
-(void) doSomething:(NSNotification*)noti{
//Do what you want.
}
@end
Ví dụ bạn muốn điều chỉnh lại kích thước của UIPopoverController mỗi khi bàn phím hiện ra chúng ta phải đăng ký nhận notification UIKeyboardWillShowNotification như sau:
//MyPopoverViewCtrl.h
@interface MyPopoverViewCtrl:UIPopoverController
-(void) reshow;
@end
//MyPopoverViewCtrl.m
@implementation MyPopoverViewCtrl
-(void) registerKeyboardEvent {
[ [NSNotificationCenter defaultCenter] addObserver:self select:@selector(doSomething:) name:UIKeyboardWillShowNotification object:nil];
}
-(void) unregisterKeyboardEvent{
[ [NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
}
- (id)initWithContentViewController:(UIViewController *)viewController
self = [super initWithContentViewController:viewController];
if(self){
[self registerKeyboardEvents];
}
return self;
}
-(void) dealloc{
[self unregisterKeyboardEvent];
[super dealloc];
}
-(void) reshow{
[self unregisterKeyboardEvent];
//do reshow
[self registerKeyboardEvent];
}
-(void) doSomething:(NSNotification*)noti{
//Do what you want.
}
@end
Labels:
iOS
21/12/2012
9 ỨNG DỤNG IN ẤN HÀNG ĐẦU TRÊN ANDROID
Hiện nay ở Việt Nam, điện thoại Android dần phổ biến. Một chiếc điện thoại Android thì không thể thiếu chiếc máy ảnh đi kèm. Khi chụp ảnh xong chúng ta thường tải lên các trang mạng xã hội như Facebook, Google Plus, ... Có bao giờ bạn muốn in những bức ảnh này ra máy in không? Làm cách nào để in?
Hiện nay theo F thì có các ứng dụng sau đây giúp bạn thực hiện được mong muốn này:
Hiện nay theo F thì có các ứng dụng sau đây giúp bạn thực hiện được mong muốn này:
- StarPrint
- Nội dung in: PDF, PS, văn bản trơn, nội dung trang Web, hình ảnh trong bộ sưu tập trên thiết bị, hình ảnh trên Instagram, SMS, sổ địa chỉ, thư điện tử.
- Hỗ trợ in qua Bluetooth, Wi-Fi, USB.
- Hỗ trợ hơn 3000 thiết bị in khác nhau của các hãng HP, Canon, Brothers, Epson, ...
- ePrint
- Chỉ hỗ trợ các máy in Epson, Canon, HP.
- Chỉ hỗ trợ Android 3.0 trở đi.
- Canon Easy PhotoPrint
- Chỉ hỗ trợ máy in Canon
- Hỗ trợ in PDF và hình tạo bởi "Canon equipment"
- Epson iPrint (CyPria)
- Chỉ hỗ trợ máy in Epson.
- Hỗ trợ nhiều loại tập tin
- Có thể in từ Box, DropBox, Evernote và Google Docs.
- KODAK Document Print
- Yêu cầu tài khoản "Google Cloud Print" và máy in không dây Kodak.
- Hỗ trợ nhiều loại tập tin.
- Breezy-Print and Fax
- Hỗ trợ cả iOS và Blackberry.
- Yêu cầu "Breezy subscription".
- Office Max Print Center
- Yêu cầu phải có "Office Max Network".
- Brother iPrint & Scan
- Chỉ hỗ trợ máy in Brothers.
- HP ePrint Home & Biz
- Chỉ hỗ trợ máy in HP.
Labels:
Android
19/12/2012
nlctim version 2.0 release
Phiên bản 2.0 của nlctim được release vào 19/12/2012.
Phiên bản này tương thích với Yahoo! Messenger 11.5
Tải nlctim về tại http://nlctim.sf.net
Phiên bản này tương thích với Yahoo! Messenger 11.5
Tải nlctim về tại http://nlctim.sf.net
Labels:
nlctim
09/12/2012
Student Visit Tour Document
Thời gian vừa qua Folami có cơ hội được trò chuyện với các bạn sinh viên HCMUT (cũng là các bạn đồng môn F). Nội dung chính là các bạn chuẩn bị gì để trở thành một nhà phát triển phần mềm C/C++ và một vài kinh nghiệm cho buổi phỏng vấn xin việc. Tất cả những vấn đề nêu ra đều xuất phát từ ý kiến cá nhân của F trong quá trình phỏng vấn các bạn sinh viên mới ra trường xin việc làm. Nếu có thông tin gì không đúng hay có gì muốn trao đổi với F thì đừng ngần ngại gửi email cho F.
Labels:
Career
06/12/2012
Hiển thị tập tin Freemind trong Blogger
- Tải visorFreemind.swf từ trang nhà của Freemind
- Upload visorFreemind.swf lên một host miễn phí nào đó ví dụ http://www.000webhost.com. Giả sử URL của file visorFreemind.swf là http://www.example.com/visorFreemind.swf
- Upload file Mindmap example.mm lên host tương tự như tập tin visorFreemind.swf. Giả sử URL của file này là http://www.example.com/example.mm
- Tạo bài viết mới trong blog của bạn chọn tab "HTML" và post nội dung bên dưới vào:
<div style="width: 100%;height:500px;">Sau đây là một ví dụ:
<object data="http://www.example.com/visorFreemind.swf" height="100%" type="application/x-shockwave-flash" width="100%">
<param name="movie" value="http://www.example.com/visorFreemind.swf" />
<param name="quality" value="high" />
<param name="flashvars" value="initLoadFile=http://www.example.com/example.mm&openUrl=_self&startCollapsedToLevel=3&maxNodeWidth=200&mainNodeShape=elipse&justMap=false&defaultToolTipWordWrap=200&offsetX=middle&offsetY=middle&buttonsPos=top&min_alpha_buttons=20&max_alpha_buttons=100&scaleTooltips=false&bgcolor=0xF8FBFC" />
</object>
</div>
05/12/2012
Những điểm mới trong XCode 4.5
Hiện nay XCode có phiên bản mới nhất là 4.5.2. So với phiên bản 4.5 thì các phiên bản 4.5.1 và 4.5.2 chủ yếu là để sửa các lỗi trong phiên bản 4.5. So với các phiên bản trước đó thì XCode 4.5 có những điểm nổi bật như sau:
- LLDB là trình gỡ rối mặc định thay cho GDB.
- Hỗ trợ OpenGL debugging & performance analysis.
- Auto layout.
- Object-C literal trong NSArray và NSDictionary.
- Hỗ trợ truy xuất bằng toán tử [].
- Hỗ trợ chuẩn C++11.
- NSNumber literals:
// character literals.
NSNumber *theLetterZ = @'Z'; // equivalent to [NSNumber numberWithChar:'Z']
// integral literals.
NSNumber *fortyTwo = @42; // equivalent to [NSNumber numberWithInt:42]
NSNumber *fortyTwoUnsigned = @42U; // equivalent to [NSNumber numberWithUnsignedInt:42U]
NSNumber *fortyTwoLong = @42L; // equivalent to [NSNumber numberWithLong:42L]
NSNumber *fortyTwoLongLong = @42LL; // equivalent to [NSNumber numberWithLongLong:42LL]
// floating point literals.
NSNumber *piFloat = @3.141592654F; // equivalent to [NSNumber numberWithFloat:3.141592654F]
NSNumber *piDouble = @3.1415926535; // equivalent to [NSNumber numberWithDouble:3.1415926535]
// BOOL literals.
NSNumber *yesNumber = @YES; // equivalent to [NSNumber numberWithBool:YES]
NSNumber *noNumber = @NO; // equivalent to [NSNumber numberWithBool:NO]
#ifdef __cplusplus
NSNumber *trueNumber = @true; // equivalent to [NSNumber numberWithBool:(BOOL)true]
NSNumber *falseNumber = @false; // equivalent to [NSNumber numberWithBool:(BOOL)false]
#endif
Lưu ý:
- Giá trị sau @ là một giá trị đơn, không chấp nhận biểu thức. Trong trường hợp cần đóng gói
(boxing) cho một biểu thức thì sử dụng cú pháp:@(expression) - Đóng gói giá trị enum thì giá trị này chuyển sang kiểu của enum, nếu enum không khai báo kiểu
thì kiều mặc định là số nguyên. - Đóng gói C string chuyển thành NSString với UTF8 encoding.
- Container literals:
- Array: NSArray*a = @[Danh sách các đối tượng ngăn cách nhau bằng dấu phẩy];
- Dictionary: NSDictionary*b = @{ 1 danh sách các cặp @"key":object cách nhau bằng dấu phẩy}.
- Object subscripting:
NSMutableArray *array = ...;
NSUInteger idx = ...;
id newObject = ...;
id oldObject = array[idx];
array[idx] = newObject; // replace oldObject with newObject
NSMutableDictionary *dictionary = ...;
NSString *key = ...;
oldObject = dictionary[key];
dictionary[key] = newObject; // replace oldObject with newObject
- Sử dụng #if __has_feature(objc_array_literals|objc_dictionary_literals|objc_subscripting) để kiểm tra chức năng này có hay không.
Labels:
iOS
24/06/2012
Lập trình Qt cho Android
Nếu bạn đã có một chương trình Qt chạy khá tốt trên các nền tảng khác bây giờ bạn muốn chuyển nó qua Android mà bạn không muốn tốn nhiều công sức để viết lại từ đầu sử dụng Android SDK thì đây là bài viết phù hợp cho bạn.
Tôi cũng là một nhà phát triển phần mềm sử dụng Qt/QML. Tôi cũng có một mong muốn giống bạn. Tôi đã bắt đầu từ Android Lighthouse. Tuy nhiên gần đây tôi đã phát hiện ra Necessitas. Necessitas đã cung cấp cho người dùng một bộ SDK khá hoàn chỉnh để phát triển chương trình Qt/QML cho Android. Necessitas sử dụng Android Lighthous, Qt Creator, Ministro. Tuy Necessitas chưa được ổn định nhưng đã phần nào đáp ứng nhu cầu của tôi.
Tôi đã thử phát triển chương trình QML và deploy trên Android phone. Chương trình chạy rất OK.
Tôi cũng là một nhà phát triển phần mềm sử dụng Qt/QML. Tôi cũng có một mong muốn giống bạn. Tôi đã bắt đầu từ Android Lighthouse. Tuy nhiên gần đây tôi đã phát hiện ra Necessitas. Necessitas đã cung cấp cho người dùng một bộ SDK khá hoàn chỉnh để phát triển chương trình Qt/QML cho Android. Necessitas sử dụng Android Lighthous, Qt Creator, Ministro. Tuy Necessitas chưa được ổn định nhưng đã phần nào đáp ứng nhu cầu của tôi.
Tôi đã thử phát triển chương trình QML và deploy trên Android phone. Chương trình chạy rất OK.
13/06/2012
Lần đầu tiên sử dụng dịch vụ nhờ thu hộ Séc
Nhớ lần đầu tiên tôi nhận Séc của GMI. Tôi không biết phải làm sao để sử dụng nó. Tôi lên mạng hỏi nhà thông thái Google. Thì ra tôi phải ra ngân hàng sử dụng dịch vụ thu hộ Séc. Gần chỗ tôi làm có phòng giao dịch của ngân hàng STB. Khi tôi đưa tờ Séc ra cô nhân viên xinh đẹp hỏi tôi có phải Séc du lịch không? Trời ơi tui biết Séc du lịch là cái gì tui chết liền ý. Tôi mới trả lời là mình không biết. Cô ấy chạy lại hỏi cấp trên một hồi và nói:
-Anh ơi cái này anh qua VCB ấy, bên đó họ mới thanh toán Séc quốc tế.
Tôi trở về mà lòng buồn buồn và tự hỏi sao mà phiền phức tiếp. Có được vài từ khoá qua cuộc trao đổi với cô tiếp tân của STB tôi quyết định hỏi bác Google lần nữa. Lần này tui hỏi bác ấy ngân hàng nào chấp nhận thanh toán. Bác ấy trả lời là BIDV. Sáng hôm sau tôi đến phòng giao dịch BIDV lấy số thứ tự và ngồi chờ. Đến lượt tui, tui đưa cái Séc ra, cô nhân viên BIDV lại lắc đầu lia lịa:
-Anh ui cái này anh qua VCB kế bên nha, bên đó họ mới thanh toán Séc quốc tế.
Tôi đành phải qua phòng giao dịch VCB kế bên. Lần này không phải lấy số đâu nhé vì trưa rồi không còn ai nữa. Tôi đưa tờ Séc cho anh đẹp trai, anh ta lại lắc đầu nguầy nguậy:
-Anh ui cái này anh phải đến chi nhánh cơ. Ở TP.HCM thì anh đến CN Kỳ Đồng hay CN Bến Chương Dương.
Tôi không quên cảm ơn anh.
Hôm sau, tôi lên CN Kỳ Đồng vì chỗ này gần chỗ tôi. Tôi bắt số và ngồi chờ đến lượt. Cuối cùng cũng đến lượt tôi. Tôi đưa tờ Séc cho cho bank teller, cô ta nói giọng Huế ngọt lịm:
-Anh ui, cái này anh đến chỗ Bến Chương Dương nha, ở đó mới có bộ phận làm việc này.
Trong lòng bắt đầu chán nản nhưng tôi cũng cố lên Bến Chương Dương:
-Anh ui, cái địa chỉ trong Séc không giống trong CMND, địa chỉ này là địa chỉ tạm trú à. Vậy anh có đem sổ tạm trú không?
-Trời ơi sao tôi biết cái này phải đem sổ tạm trú chứ! Chị vui lòng cho tôi bổ sung khi đến nhận tiền không?
-Không được anh à! Vì sếp em duyệt nữa mà không có sổ tạm trú là không được duyệt rùi.
Tôi đành phải chạy về nhà để mượn sổ tạm trú. Khi quay lên tôi lại không đi đường cũ mà chạy lạc qua hầm chui Thủ Thiêm. Lần đầu tiên tôi chạy qua cái hầm này. Trời đất ơi cái hầm sao mà dài và qua hầm lại không có chỗ quay đầu xe. Cuối cùng cũng đến được VCB một lần nữa. Lần này mọi thứ suôn sẻ. Tiền thu từ Séc có thể tự động chuyển vào tài khoản.
-Anh ơi cái này anh qua VCB ấy, bên đó họ mới thanh toán Séc quốc tế.
Tôi trở về mà lòng buồn buồn và tự hỏi sao mà phiền phức tiếp. Có được vài từ khoá qua cuộc trao đổi với cô tiếp tân của STB tôi quyết định hỏi bác Google lần nữa. Lần này tui hỏi bác ấy ngân hàng nào chấp nhận thanh toán. Bác ấy trả lời là BIDV. Sáng hôm sau tôi đến phòng giao dịch BIDV lấy số thứ tự và ngồi chờ. Đến lượt tui, tui đưa cái Séc ra, cô nhân viên BIDV lại lắc đầu lia lịa:
-Anh ui cái này anh qua VCB kế bên nha, bên đó họ mới thanh toán Séc quốc tế.
Tôi đành phải qua phòng giao dịch VCB kế bên. Lần này không phải lấy số đâu nhé vì trưa rồi không còn ai nữa. Tôi đưa tờ Séc cho anh đẹp trai, anh ta lại lắc đầu nguầy nguậy:
-Anh ui cái này anh phải đến chi nhánh cơ. Ở TP.HCM thì anh đến CN Kỳ Đồng hay CN Bến Chương Dương.
Tôi không quên cảm ơn anh.
Hôm sau, tôi lên CN Kỳ Đồng vì chỗ này gần chỗ tôi. Tôi bắt số và ngồi chờ đến lượt. Cuối cùng cũng đến lượt tôi. Tôi đưa tờ Séc cho cho bank teller, cô ta nói giọng Huế ngọt lịm:
-Anh ui, cái này anh đến chỗ Bến Chương Dương nha, ở đó mới có bộ phận làm việc này.
Trong lòng bắt đầu chán nản nhưng tôi cũng cố lên Bến Chương Dương:
-Anh ui, cái địa chỉ trong Séc không giống trong CMND, địa chỉ này là địa chỉ tạm trú à. Vậy anh có đem sổ tạm trú không?
-Trời ơi sao tôi biết cái này phải đem sổ tạm trú chứ! Chị vui lòng cho tôi bổ sung khi đến nhận tiền không?
-Không được anh à! Vì sếp em duyệt nữa mà không có sổ tạm trú là không được duyệt rùi.
Tôi đành phải chạy về nhà để mượn sổ tạm trú. Khi quay lên tôi lại không đi đường cũ mà chạy lạc qua hầm chui Thủ Thiêm. Lần đầu tiên tôi chạy qua cái hầm này. Trời đất ơi cái hầm sao mà dài và qua hầm lại không có chỗ quay đầu xe. Cuối cùng cũng đến được VCB một lần nữa. Lần này mọi thứ suôn sẻ. Tiền thu từ Séc có thể tự động chuyển vào tài khoản.
Labels:
Kiếm tiền qua mạng
02/06/2012
PHP: Phân biệt Android Phone và Android Tablet
Đầu tiên lấy thông tin UA từ server:
$userAgent = $_SERVER['HTTP_USER_AGENT'];
Nếu chuỗi này có chứa từ Android thì client device đang chạy Android OS:
if (stripos($userAgent, 'Android') !== false){
//Cần xác định Android Phone hay Android Tablet ở đây.
}
Không có một cách nào chính xác để phân biệt giữa Android Phone và Android Tablet (chưa kể một số web browser cho phép người dùng thiết lập UA). Tuy nhiên có một số mẹo sau:
- Android 3.x chỉ sử dụng cho các Tablet.
- Google khuyên các nhà sản xuất bỏ chữ 'Mobile' ra khỏi chuỗi UA.
- Một số thiết bị Kindle Android lại có chữ Mobile trong UA nhưng nó lại không có chữ Silk.
if (stripos($userAgent, 'Android') !== false){
if (stripos($userAgent, 'Android 3') !== false ||
stripos($userAgent, 'Tablet') !== false ||
stripos($userAgent, 'Mobile') === false ||
stripos($userAgent, 'Silk') !== false )
}else{
//Android Phone
}
}
Đăng ký:
Bài đăng (Atom)