- Ý nghĩa: Hát, ca (đt), bài ca, bài hát (dt)
- Số nét:14 nét
- Cách đọc:
- Kun:うた,うた.う
- On:カ
01/12/2013
Ý nghĩa của chữ Ca (歌)
30/11/2013
Ý nghĩa của chữ Âm (音)
Sau đây là một cách giải thích ý nghĩa chữ Âm (音):
- Ý nghĩa: Tiếng nói, âm thanh (dt)
- Số nét: 9
- Cách đọc:
- Kun:おと,ね
- On:イン,オン,-ノン
- Tên:お,と
29/11/2013
Ý nghĩa của chữ Ốc (屋)
Sau đây là một cách giải thích ý nghĩa của chữ Ốc(屋):
- Ý nghĩa: Nhà, phòng (dt)
- Số nét: 9
- Cách đọc:
- Kun:や
- On:オク
- Tên:た
28/11/2013
Ý nghĩa của chữ Viễn (遠)
Sau đây là một cách giải thích ý nghĩa của chữ Viễn (遠):
- Ý nghĩa: Xa (tt), Xa lìa (đt)
- Số nét:12
- Cách đọc:
- Kun:とお.い
- On:イン,オン
- Tên:お,おに,ど,どお
27/11/2013
Ý nghĩa của chữ Ánh (映)
Sau đây là một cách giải thích ý nghĩa của chữ Ánh (映):
- Ý nghĩa: Chiếu, phản xạ (đt)
- Số nét:9
- Cách đọc:
- Kun:うつ.す,うつ.る,は.える,-ば.え
- On:エイ
- Tên:あきら,え,てる
26/11/2013
Ý nghĩa của chữ Anh (英)
Sau đây là một cách giải thích ý nghĩa chữ Anh (英):
- Ý nghĩa: Nước Anh, hoa, nhuỵ hoa (dt)
- Số nét:8
- Cách đọc:
- Kun: はなぶち
- On:エイ
- Tên:あ,あい,え,すぐる,はな,ひ,ひで,よし,ら
25/11/2013
Ý nghĩa của chữ Vận (運)
Sau đây là một cách giải nghĩa cho chữ Vận (運):
- Ý nghĩa: (đt) Vận chuyển, (dt) may mắn
- Số nét:12 nét
- Các đọc:
- Kun:はこ。ぶ
- On:ウン
Ý nghĩa của chữ Viên (員)
Sau đây là một cách giải thích ý nghĩa của chữ Viên (員):
- Ý nghĩa: Tròn (tính từ), nhân viên, thành viên (danh từ)
- Số nét: 10
- Cách đọc:
- Kun
- On: イン
- Tên: いな、かず
24/11/2013
Ý nghĩa của chữ Ám (暗)
Sau đây là một cách giải nghĩa cho chữ Ám (暗):
- Nghĩa: Tối (Tối ở đây là tối sáng chứ không có nghĩa là ban đêm).
- Số nét: 13
- Cách phát âm:
- On:アン
- Kun:くら.い,くら.む,くれ.る
Ý nghĩa của chữ Viện (院)
Sau đây là một cách giải nghĩa cho chữ Viện (院):
- Ý nghĩa: Viện (Khu nhà có tường thấp bao xung quanh)
- Số nét:10
- Cách đọc:
- Kun:
- On:イン
23/11/2013
Ý nghĩa của chữ Dẫn (引)
Sau đây là một cách giải nghĩa của chữ Dẫn (引):
- Ý nghĩa: Kéo, nhận vào, cài đặt.
- Số nét: 4
- Các đọc:
- Kun:ひ.き,ひ.き-,ひく,ひける,-びき
- On:イン
- Tên:いな,ひき,ひけ,びき
22/11/2013
Ý nghĩa của chữ Dĩ (以)
Sau đây là một cách giải nghĩa của chữ Dĩ (以):
- Ý nghĩa: Bởi vì, có nghĩa là, so sánh với, với cái nhìn của, ... khi kết hợp với chữ khác. Tiếp tục khi đứng 1 mình.
- Số nét:5
- Các đọc:
- Kun:もつ.て
- On: イ
- Tên: もち
21/11/2013
Ý nghĩa của chữ Ý (意)
Sau đây là một cách giải thích ý nghĩa của chữ Ý (意):
- Ý nghĩa: Ý, ý chí, ý nghĩa
- Số nét:13
- Các đọc:
- On:イ
- Kun:
- Tên: もと、よし
20/11/2013
19/11/2013
Ý nghĩa của chữ Y (医)
Sau đây là một cách giải thích ý nghĩa của chữ Y (医):
- Ý nghĩa: Thuốc (Nghĩa cổ: Cái bao đựng tên)
- Số nét:7.
- Cách đọc:
- Kun:い.する,い.やす,くすし
- On:イ
18/11/2013
Ý nghĩa của chữ Ác (悪)
Một cách giải mghĩa chữ Ác trong hình bên dưới:
- Số nét: 11 nét
- Cách đọc:
- Kun: ああ, あ.し,いずくに,いずくんぞ,にく.い,-にく.い,にく.む,わる-,わる.い
- On:アク,オ
- Ý nghĩa: ác,xấu
14/11/2013
Ý nghĩa của chữ Hành (行)
Sau đây là một cách giải nghĩa của chữ Hành (行).
- Số nét: 6
- Ý nghĩa: Đi, hành trình.
- Phát âm:
- Kun: ーい.き、ーいき、ーいく、おこな.う、おこ.なう、ーゆ.き、ーゆ.く
- On: アン、ギョウ、コウ
- Tên người: いく、なみ、みち、ゆき、ゆく。
13/11/2013
Ý nghĩa của chữ Chu (週)
Xem giải thích trong hình bên dưới. Bạn nào có cách giải thích khác xin vui lòng comment để cùng nhau học hỏi nha:
11/11/2013
Ý nghĩa của chữ Hiệu (校)
Sau đây là một cách giải nghĩa của từ Hiệu (校):
Nếu bạn có cách giải nghĩa khác thì vui lòng comment để cùng nhau học hỏi.
Nếu bạn có cách giải nghĩa khác thì vui lòng comment để cùng nhau học hỏi.
10/11/2013
Ý nghĩa của chữ Thư (書)
Phần sưu tầm giải nghĩa chữ THƯ (書) trong hình bên dưới.
Nếu bạn có cách giải thích khác xin vui lòng comment, chia sẻ để cùng nhau học hỏi.
09/11/2013
Kinh nghiệm đi công tác Nhật Bản
Sau đây là một vài kinh nghiệm nhỏ của Folami khi đi công tác Nhật vì là kinh nghiệm bản thân nên có thể đúng và có thể sai đối với người khác. Chia sẻ kinh nghiệm này mong giúp ích những ai mới qua Nhật lần đầu chưa biết chuẩn bị gì, mang theo gì. Mong là nó có ích cho bạn:
08/11/2013
Build Tizen Emulator on CentOS 6.4
1) Set up development environment
2) Install development tools
3) Sign-in to the Tizen official review Web site.
4) Select Projects > List to view all the available projects.
5) Click on sdk/emulator/qemu project
6) Select SSH > Copy link to clone project such as
git clone ssh://teddywcn@review.tizen.org:29418/sdk/emulator/qemu
7) change directory to tizen folder
8) Install the dependency libraries, project:
10) The emulator is built into tizen/emulator
2) Install development tools
3) Sign-in to the Tizen official review Web site.
4) Select Projects > List to view all the available projects.
5) Click on sdk/emulator/qemu project
6) Select SSH > Copy link to clone project such as
git clone ssh://teddywcn@review.tizen.org:29418/sdk/emulator/qemu
7) change directory to tizen folder
8) Install the dependency libraries, project:
- git submodule update --init check-gl
- yum install glib2.x86_64
- yum install glib2-devel.x86_64
- yum install pixman-devel.x86_64
- yum install flex.x86_64
- yum install bison.x86_64
- yum istall alsa-lib.x86_64
- yum install alsa-lib-devel.x86_64
- yum install libcap-devel.x86_64
- yum install libattr-devel.x86_64
- yum install libv4l-devel.x86_64
- yum install libX11-devel.x86_64
- yum install libpng-devel.x86_64
- yum install SDL-devel.x86_64
- yum install libXcomposite-devel.x86_64
- yum install ant.x86_64
- yum install ant-nodeps.x86_64
- Copy swt.jar into tizen/src/skin/client/lib
10) The emulator is built into tizen/emulator
07/11/2013
Change time properties of file in Windows
Sometime we want to change time properties of file (in Windows). The following Perl script is useful for you:
$|++;
use strict;
use warnings;
use DateTime::Format::Strptime;
use Win32API::File::Time qw{:win};
my $parser = DateTime::Format::Strptime->new( pattern => '%m/%d/%Y %H:%M');
my $filename="Test.txt";
my $cdate="12/10/2012 2:00";
my $mdate="12/14/2012 9:00";
my ($atime, $mtime, $ctime) = GetFileTime ($filename);
$mtime = $parser->parse_datetime($mdate)->epoch;
$ctime = $parser->parse_datetime($cdate)->epoch;
SetFileTime ($filename, $atime, $mtime, $ctime);
Labels:
Perl
06/11/2013
05/11/2013
Con gái của bố (My daughter Seo Young)
- Nước sản xuất: Hàn Quốc
- Đơn vị sản xuất: KBS2
- Số tập: 75
- Năm sản xuất:2012
Sự kiên trì đeo đuổi đến cùng mục tiêu của mình không thể không kể đến nhân vật Choi Ho Jung. Cô yêu Lee Sang Woo và nhiều lần bị từ chối do Sang Woo đã có người yêu rồi. Cô kiên trì đến cùng và tận dụng cơ hội để kết hôn với Sang Woo. Tình yêu và sự chân thành của cô đã làm trái tim chàng Sang Woo xao động.
Labels:
Xem phim cùng Fo
04/11/2013
Giải Mã Nhân Tâm II (A Great Way To Care II)
- Tên Tiếng Trung Quốc: 仁心解碼II.
- Tên Tiếng Anh: A Great Way To Care II.
- Số tập: 25.
- Nước sản xuất: Trung Quốc.
- Sản xuất: TVB Jade.
- Phát hành: 18/03/2013.
- Kênh phát sóng: HTV2.
- Cái bất ngờ lớn nhất là đôi khi chúng ta làm những gì ngay cả bản thân chúng ta cũng không biết đó là trường hợp của cô cảnh sát yêu nghề Lâm Tụng Ân (Tưởng Y Lâm), cô gái có tuổi thơ đáng thương. Những vết thương về mặt tinh thần xảy ra đối với con trẻ tưởng chừng vô hại nhưng đôi khi lại để lại cho phần còn lại của cuộc đời con trẻ là bóng tối đêm đen. Đây là bài học đáng quan tâm của những ông bố, bà mẹ trẻ. Tưởng Đại Quân (cha của Y Lâm) cùng Lục Nhật Cần tham gia vụ cướp ở đại lục và bị truy đuổi nên ông đưa Y Lâm trốn đến Hồng Công nương nhờ gia đình Nhật Cần. Một hôm Nhật Cần vu cho Đại Quân ăn cắp chiếc đồng hồ. Tức nước vỡ bờ nên Đại Quân ra tay giết hại cảgia đình họ Lục trước mắt con gái của mình. Cảnh tượng hải hùng này là vết thương không bao giờ lành trong tinh thần của Y Lâm. Sau khi gây án, Đại Quân giao Y Lâm cho cha sứ nuôi dưỡng và đổi tên thành Tụng Ân. Vết thương kia lớn dần theo năm tháng và biến thành căn bệnh Tâm thần phân liệt, đa nhân cách. Lúc cô là Tụng Ân với khẩu súng chính nghĩa của người đại diện pháp luật và lúc là Đại Quân trừ gian diệt ác ung dung ngoài vòng pháp luật, không tin vào đấng tối cao và sự công bằng của pháp luật.
- Cái kết có hậu của mối tình Cao Lập Nhân và Trác Tuệ Kiều. Đôi khi đường gần không hiệu quả ta lại phải đi vòng chút. Đường nào cũng về La Mã ý mà. Cũng khá hâm mộ sự chung tình của Cao Lập Nhân với người vợ cũ Mạc Mẫn Nhi và tinh thần trách nhiệm với từng hành động của mình.
- Phim vẫn thuộc mô típ thiện thắng ác. Đôi khi cái ác có thể tạm thời thắng cái thiện nhưng đó cũng chỉ là nhất thời mà thôi. Quy luật nhân quả thể hiện khá đậm nét trong các trường hợp Đàm Tân, La Vĩnh Khanh, Trịnh Bội Như,...
- Trong mối tình tay ba giữa Lương Khải Vinh, Lại Dao Châu và Trần Tư Gia. Đôi lúc người đàn ông cũng bị say nắng tuy nhiên tình yêu đích thực bao giờ cũng là mục tiêu anh ta tìm kiếm. Cái sai lầm của anh chàng Vinh hô là không biết ra quyết định và sự chần chừ của anh ta khiến anh ta phải trả giá.
- Tình yêu là phương thuốc diệu kỳ làm đâm chồi, ra hoa cho những tâm hồn cằn cỗi, khô hạn như trường hợp của Lại Dao Tinh.Anh trai của Dao Châu bị tự kỷ nhưng khi anh ta tìm được người yêu mình trong căn tiệm bán bánh bao, một cô gái câm khá xinh đẹp đã làm cuộc đời anh thay đổi và tờ lịch để bàn tràn ngập những hình smiley hạnh phúc.
Labels:
Xem phim cùng Fo
03/11/2013
24/10/2013
Cải tiến nhập số thẻ ATM nội địa
Mỗi lần thanh toán trực tuyến bắt nhập cái chuỗi số thẻ và thời gian bắt đầu có giá trị của thẻ là phát mệt vì cái dãy số nó dài ngoằn hà. Có cách nào cải tiến nó không?
- In QR code trên thẻ
- In Barcode trên thẻ
- Gắn NFC tag (cái này nguy hiểm, phải có cách mã hoá để bảo vệ bị đọc trộm)
Labels:
New Ideas
18/10/2013
Dịch ngược ứng dụng iOS
Để dịch ngược ứng dụng iOS các công cụ sau đây là rất hữu ích cho bạn:
- class-dump
- lipo
- otool
- class-dump-z
- Hopper Disassembler
Labels:
iOS
25/09/2013
Remote deploy Tomcat application using Maven
Configure Tomcat servers for Maven:
Open ~/.m2/settings.xml (if it doesn't exist, create it), add the following lines:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<!-- Omit the irrelevant information here -->
<server>
<id>Tomcat7</id>
<username>tomcat</username>
<!-- Change this password -->
<password>mypassword</password>
</server>
<!-- Omit the irrelevant information here -->
</servers>
</settings>
Configure pom.xml:
Add the plugin for Maven:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<server>Tomcat7</server>
<!-- Change the name of your server -->
<url>http://example.com:8080/manager/text</url>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<packagingExcludes>WEB-INF/web.xml</packagingExcludes>
</configuration>
</plugin>
Configure Tomcat:
Open file /conf/tomcat-users.xml:
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="mypassword" roles="manager-gui,manager-script"/>
</tomcat-users>
Using:
Run your application with goal tomcat:redeploy the application will be redeployed to remote server.
23/09/2013
Thay đổi hostname của máy Mac OS X
Do nhu cầu quản lý hoặc để chia sẻ dữ liệu giữa các thành viên trong nhóm dễ dàng hơn chúng ta cần thay đổi hostname của máy tính đang sử dụng hệ điều hành Mac OS X của chúng ta. Để xem hostname hiện tại sử dụng câu lệnh sau trong cửa sổ Terminal:
hostname
Để thay đổi hostname chúng ta sử dụng câu lệnh sau trong cửa số Terminal:
sudo scutil –-set HostName new_hostname
Lưu ý rằng phía trước chữ set là dấu dash (--) chứ không phải dấu hyphen (-)
Nếu bạn chỉ muốn thay đổi hostname tạm thời và hostname sẽ bị thiết lập lại sau khi bạn khởi động lại hệ thống thì sử dụng câu lệnh sau đây trong cửa số Terminal:
sudo hostname new_hostname
hostname
Để thay đổi hostname chúng ta sử dụng câu lệnh sau trong cửa số Terminal:
sudo scutil –-set HostName new_hostname
Lưu ý rằng phía trước chữ set là dấu dash (--) chứ không phải dấu hyphen (-)
Nếu bạn chỉ muốn thay đổi hostname tạm thời và hostname sẽ bị thiết lập lại sau khi bạn khởi động lại hệ thống thì sử dụng câu lệnh sau đây trong cửa số Terminal:
sudo hostname new_hostname
Labels:
Mac OS
15/06/2013
Thay đổi kích thước view khi user thay đổi paper orientation
Đôi khi chúng ta gặp tình huống là chúng ta muốn thay đổi thuộc tính của view cho phù hợp với orientation của trang giấy khi user chọn trên print panel.
NSPrintOperation*fPrintOperation = [NSPrintOperation printOperationWithView:viewToPrint];
[fPrintOperation.printInfo setOrientation:NSLandscapeOrientation];
[fPrintOperation.printPanel setOptions:NSPrintPanelShowsPreview|NSPrintPanelShowsPaperSize|NSPrintPanelShowsPageRange|NSPrintPanelShowsCopies|NSPrintPanelShowsOrientation];
[NSPrintOperation setCurrentOperation:fPrintOperation];
if(fPrintOperation.printPanel.runModal == NSOKButton){
NSPrintInfo*printInfo = [fPrintOperation printInfo];
if( [printInfo orientation] == NSPortraitOrientation){
//Do something
}else{
//Do something
}
[[NSPrintOperation currentOperation] cleanUpOperation];
NSPrintOperation *rPrintOperation = [NSPrintOperation printOperationWithView:viewToPrint printInfo:printInfo];
[rPrintOperation setShowsPrintPanel:NO];
[rPrintOperation runOperation];
}else{
[[NSPrintOperation currentOperation] cleanUpOperation];
}
Labels:
Mac OS
18/05/2013
Bind edit shortcuts cho chương trình Mac OS X
Lập trình Mac OS X, ai cũng biết rằng để bind các edit shortcuts như Cmd-C, Cmd-V, Cmd-A, ... cho chương trình chúng ta thường sử dụng built-in Edit menu. Tuy nhiên trong vài trường hợp chúng ta cần customize menu bar nên không có built-in Edit menu trên menu bar. Trong trường hợp này chúng ta thực hiện theo phương pháp sau:
- Kế thừa NSApplication, tạo lớp CustomApplication:
- CustomApplication.h:
@interface CustomApplication:NSApplication
@end - CustomApplication.m
@implementation CustomApplication
- (void) sendEvent:(NSEvent *)event {
if ([event type] == NSKeyDown) {
if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask) {
if ([[event charactersIgnoringModifiers] isEqualToString:@"x"]) {
if ([self sendAction:@selector(cut:) to:nil from:self])
return;
}
else if ([[event charactersIgnoringModifiers] isEqualToString:@"c"]) {
if ([self sendAction:@selector(copy:) to:nil from:self])
return;
}
else if ([[event charactersIgnoringModifiers] isEqualToString:@"v"]) {
if ([self sendAction:@selector(paste:) to:nil from:self])
return;
}
else if ([[event charactersIgnoringModifiers] isEqualToString:@"z"]) {
if ([self sendAction:@selector(undo:) to:nil from:self])
return;
}
else if ([[event charactersIgnoringModifiers] isEqualToString:@"a"]) {
if ([self sendAction:@selector(selectAll:) to:nil from:self])
return;
}
}
else if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) == (NSCommandKeyMask | NSShiftKeyMask)) {
if ([[event charactersIgnoringModifiers] isEqualToString:@"Z"]) {
if ([self sendAction:@selector(redo:) to:nil from:self])
return;
}
}
}
[super sendEvent:event];
}
@end - Thay đổi NSApplication thành CustomApplication trong mục Principal Class ở Target properties.
Labels:
Mac OS
11/05/2013
Lưu ý khi dùng NSColor trong MAC OS X programming
Trong khi lập trình MAC OS X bạn sẽ gặp phải vấn đề sau đây:
Khách hàng đưa cho bạn màu sắc của một bản thiết kế nào đó dạng chuỗi HTML RGB ví dụ: 6F5A4E và yêu cầu bạn đưa lên màn hình. Thông thường bạn sẽ làm như sau:
Tạo category cho NSColor để thêm phương thức tạo NSColor từ chuỗi HTMLRGB:
Sau đây mình sẽ trình bày phương pháp để giải quyết vấn đề này bằng ColorSync Manager API (Xem thêm tài liệu Technical Q&A QA1396):
Khách hàng đưa cho bạn màu sắc của một bản thiết kế nào đó dạng chuỗi HTML RGB ví dụ: 6F5A4E và yêu cầu bạn đưa lên màn hình. Thông thường bạn sẽ làm như sau:
Tạo category cho NSColor để thêm phương thức tạo NSColor từ chuỗi HTMLRGB:
- Tạo file NSColor+Ext.h:
@interface NSColor(Ext) +(NSColor*) newColorFromRGBString:(NSString*) rgb; @end
- Tạo file NSColor+Ext.m
@implementation NSColor(Ext) +(NSColor*) newColorFromRGBString:(NSString*) rgb{ NSColor*result= nil; unsigned colorValue=0; unsigned char r,g, b; if (nil != rgb) { NSScanner* scanner = [NSScanner scannerWithString:rgb]; // ignore error (void) [scanner scanHexInt:&colorValue]; } r = (unsigned char)(colorValue >> 16); g = (unsigned char)(colorValue >> 8); // masks off high bits b = (unsigned char)(colorValue); result = [NSColor colorWithCalibratedRed:(CGFloat)r / 0xff green:(CGFloat)g / 0xff blue:(CGFloat)b / 0xff alpha:1.0f]; return result; } @end
Sau đây mình sẽ trình bày phương pháp để giải quyết vấn đề này bằng ColorSync Manager API (Xem thêm tài liệu Technical Q&A QA1396):
- Khai property colorSpace trong AppDelegate.h:
@interface AppDelegate:NSObject @property (strong) NSColorSpace*colorSpace; @end
- Trong AppDelegate.m
Private category:
#import <ApplicationServices/ApplicationServices.h> @interface AppDelegate() +(CGColorSpaceRef)CreateDisplayColorSpace; -(void)updateColorSpace; -(void)registerNotifications; @end @implementation AppDelegate //Disable deprecated warning #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +(CGColorSpaceRef)CreateDisplayColorSpace{ CMProfileRef sysprof = NULL; CGColorSpaceRef dispColorSpace = NULL; // Get the Systems Profile for the main display if (CMGetSystemProfile(&sysprof) == noErr) { // Create a colorspace with the systems profile dispColorSpace = CGColorSpaceCreateWithPlatformColorSpace(sysprof); // Close the profile CMCloseProfile(sysprof); } return dispColorSpace; } //Enable deprecated warning #pragma GCC diagnostic warning "-Wdeprecated-declarations" -(void)registerNotifications { NSDistributedNotificationCenter *center; center = [NSDistributedNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(updateColorSpace) name:kCMDeviceUnregisteredNotification object:nil]; [center addObserver:self selector:@selector(updateColorSpace) name:kCMDefaultDeviceNotification object:nil]; [center addObserver:self selector:@selector(updateColorSpace) name:kCMDeviceProfilesNotification object:nil]; [center addObserver:self selector:@selector(updateColorSpace) name:kCMDefaultDeviceProfileNotification object:nil]; } -(void)updateColorSpace{ CGColorSpaceRef csr = [AppDelegate CreateDisplayColorSpace]; self.colorSpace = [[NSColorSpace alloc] initWithCGColorSpace:csr]; CGColorSpaceRelease(csr); }
- (void)applicationWillFinishLaunching:(NSNotification *)aNotification{
[self registerNotifications];
[self updateColorSpace];
} @end - Nhiệm vụ cuối cùng là thay đổi cách viết NSColor+Ext ở trên dùng property colorSpace trong lớp AppDelegate:
@implementation NSColor(Ext) +(NSColor*) newColorFromRGBString:(NSString*) rgb{ NSColor* result = nil; unsigned colorValue = 0; unsigned char r, g, b; if (nil != rgb) { NSScanner* scanner = [NSScanner scannerWithString:rgb]; // ignore error (void) [scanner scanHexInt:&colorValue]; } r = (unsigned char)(colorValue >> 16); g = (unsigned char)(colorValue >> 8); // masks off high bits b = (unsigned char)(colorValue); CGFloat components[4] = {(CGFloat)r / 0xff,(CGFloat)g / 0xff,(CGFloat)b / 0xff,1.0f}; return [NSColor colorWithColorSpace:(AppDelegate*)([NSApplication shareApplication].delegate).colorSpace components:components count:4]; } @end
Labels:
Mac OS
01/05/2013
NCTDownloader version 1.0.0.0
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.
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.
Labels:
lazarus,
NCTDownloader
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
}
}
12/05/2012
Tắt ARC trong XCode 4.2
Trong XCode 4.2, khi bạn tạo một dự án mới thì có một checkbox cho phép bạn chọn là dự án của bạn có dùng chức năng ARC (Automatic Reference Counting) hay không. Với chức năng này khi viết code bạn không phải quan tâm nhiều đến việc quản lý bộ nhớ. Bạn đã chọn sử dụng ARC. Tuy nhiên sau đó dự án của bạn phải sử dụng một thư viện của hãng thứ ba, thư viện này lại không sử dụng tính năng ARC. Do đó bạn đứng trước một lựa chọn vô cùng khó khăn: Sử dụng thư viện hay sử dụng ARC. Mình tin rằng bạn chọn sử dụng thư viện. Vậy làm sađâyo để tắt tính năng ARC cho dự án hiện tại đây? Bạn làm theo các bước sau đây:
- Chọn project file
- Chọn tab Build Settings, chọn tuỳ chọn Levels (mặc định là Combined)
- Có một ô dùng để tìm kiếm gần Combined, gõ vào từ Automatic
- Chọn nhóm Apple LLVM Compiler 3.0 – Language, hàng thứ hai trong nhóm này dùng để điều khiển ARC
- Chuyển "yes" sang "no" ở hàng này
Labels:
iOS
Đăng ký:
Bài đăng (Atom)