Hiển thị các bài đăng có nhãn Mac OS. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Mac OS. Hiển thị tất cả bài đăng

02/12/2020

iMac quạt kêu to như máy xay lúa

Sáng nay vào công ty, bật cái iMac ra thì cái quạt chạy kêu như máy xay lúa. Mình không nghĩ quạt hư mà chỉ là tốc độ hơi mạnh bạo. Loay hoay trên Google tìm cách điều chỉnh tốc độ quạt. Cuối cùng anh Google cũng dẫn đến Macs Fan Control. Tải về rồi chạy app thì app bảo cần "reset SMC".
Các bước để reset SMC:
  1. Tắt máy (shutdown)
  2. Rút dây nguồn.
  3. Chờ khoảng 15 giây
  4. Cắm dây nguồn lại
  5. Chờ 5 giây
  6. Bật máy lên
Ôi! Tuyệt quá. Vấn đề đã giải quyết.
Cái SMC là viết tắt của cụm từ: System Management Controller. Mình nghĩ khi mình mở máy lên anh ấy bị choáng (sốc điện) nên cần nghỉ ngơi và reset lại. :)

11/05/2018

My favorite text editors


09/01/2018

Tên file bằng Tiếng Nhật trong zip file


Khi làm việc với khách hàng Nhật Bản. Đôi khi mình nhận được tập tin nén dạng zip, 7z. Trong đó tên file đặt bằng Tiếng Nhật. Tuy nhiên khi chúng ta giải nén thì tên file không hiển thị được mà bị vỡ (corrupt).
Nguyên nhân là chúng ta đang dùng PC (Windows, Mac, Linux) bản quốc tế hỗ trợ Unicode. Còn khách hàng chúng ta đang dùng bản có encoding là shift_jis.
Giải pháp: Sử dụng tool tên là unar. Tool này tự nhận biết encoding của tên file trong file nén và giữ nó khi giải nén.
Tải tool này tại liên kết: https://theunarchiver.com/command-line
Đây là command line tool, do đó để sử dụng chỉ cần copy nó ở chỗ nào thuận lợi cho bạn. Mở Terminal lên và di chuyển đến thư mục chứ unar tool và gõ câu lệnh:
unar đường_dẫn_đến_file_nén
Chúc bạn thành công

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

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];
    }

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:

  1. 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
  2. Thay đổi NSApplication thành CustomApplication trong mục Principal Class ở Target properties.
       

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:
  • 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
    
Đoạn code trên có vấn đề ở chỗ là chúng ta sử dụng phương thức colorWithCalibratedRed:green: blue:, màu sắc hiện lên trên màn hình chỉ đúng khi người dùng chọn Generic RGB Profile trong System Preferences > Display > Color. Nếu người dùng chọn color profile khác thì màu sắc hiện lên màn hình không như bạn mong đợi. Bạn có thể sử dụng công cụ đo màu (color picker) để kiểm chứng điều này.
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):
  1. Khai property colorSpace trong AppDelegate.h:
    @interface AppDelegate:NSObject
    @property (strong) NSColorSpace*colorSpace;
    @end
    
  2. 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
  3. 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
            

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
                R = (0.75,0.5,0,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ư:

  • Add -fobjc-arc vào Other linker flags.
  • Sử dụng -weak_library, -weak_framework.
  • Tắt Implicit link to system library option
Cuối cùng cũng tìm ra lời giải. ARC trên 10.6.8 không hỗ trợ các phương thức + (void) initialize+(void) load.


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. 

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à đang suy nghĩ miên man về công nghệ mà Blue Stacks sử dụng.Ngoài ra liệu việc làm này sẽ làm cho Android mạnh lên hay sẽ thu hẹp tầm ảnh hưởng của nó?
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.