4 NGUYÊN NHÂN CHÍNH KHIẾN MACBOOK BỊ NÓNG VÀ CÁCH KHẮC PHỤC ĐƠN GIẢN

Có thể nói MacBook là một món đồ xịn với số tiền hơi cao chút so với các dòng máy tính xách tay khác. Có lẽ chính vì cái lý tiền nào của ấy nên đồ nhà Apple rất bền, và ít gặp lỗi vặt. Nhưng đã là đồ công nghệ thì cũng không thể nói trước được điều gì, máy đang dùng bị nóng lâu ngày không khắc phục sẽ ảnh hưởng đến chất lượng máy.

Vậy đâu là nguyên nhân gây ra hiện tượng nóng máy trên MacBook? Hãy cũng Forsharing mổ xẻ để phòng tránh / bảo vệ cho chiếc MacBook của bạn:

1.  Do chạy nhiều chương trình cùng một lúc và chạy trong nhiều giờ liền.

2. MacBook của bạn sử dụng lâu ngày không vệ sinh 

3. Do nhiệt độ xung quanh nóng 

4. Nhiễm phần mềm / virus độc hại.


Cách kiểm tra nhiệt độ MacBook

Bước 1: Vào Launchpad >> Other >> Terminal; hoặc nhấp chuột vào Spotlight (Commad + Space) và gõ và Terminal rồi nhấn Enter.

Bước 2: Tại Terminal gõ “sudo gem install iStats” rồi nhấn Enter.

Bước 3: Nhập password khi được hỏi.

Bước 4: Bạn gõ vào Terminal câu lệnh “istats cpu” là xong.

KHẮC PHỤC 

1.  Tắt ứng dụng khiến MacBook bạn Ngốn pin nhiều nhất

Thông thường, phần mềm được cho là hay gây nóng cho máy tính phải kể đến là Google Chrome. Muốn giảm thiểu ảnh hưởng này, bạn có thể chuyển sang ứng dụng Safari hoặc một số ứng dụng khác của Apple.

Hoặc bạn có thể kiểm tra xem phần mềm ngốn pin nhất

Bước 1: Mở Activity Monitor.

Bước 2: Chọn All Processes.

Bước 3: Click chọn CPU.

Bước 4: Click chọn cột %CPU để sắp xếp các ứng dụng và process theo thứ tự các ứng dụng ngốn CPU nhiều nhất đến ít nhất.

Tìm và chọn các ứng dụng nào đang sử dụng nhiều hơn 70% CPU, sau đó chọn Quit Process.

2. Sắp xếp lại ổ cứng 

Hãy xóa tất cả những dữ liệu và phần mềm không cần thiết khiến máy bị nóng. Chống phân mảnh ổ cứng để cải thiện tốc độ truy xuất dữ liệu. Tắt các ứng dụng khởi động cùng lúc với hệ điều hành,…

Không để máy hoạt động quá lâu, khi máy nóng sẽ đi kèm với tình trạng chạy chậm, hãy cho máy nghỉ ngơi.
Máy móc cũng như con người, cũng cần được nghỉ ngơi, bạn không nên bắt máy làm việc quá sức, điều này sẽ khiến chiếc Macbook Pro rất nóng.

3. Vệ sinh MacBook 

Thường xuyên vệ sinh MacBook định kỳ (6 tháng/lần) sẽ hạn chế được sự cố xảy ra với máy.

Sử dụng đế tản nhiệt để làm mát máy trong khi sử dụng
Một chiếc đế tản nhiệt sẽ giúp làm mát chiếc máy của bạn rất hiệu quả, hạn chế tình trạng nóng máy.

Nếu sợ dùng đế làm chai pin bạn có thể chọn một chiếc quạt tản nhiệt, nó có thể rất hữu dụng.

Nên sử dụng máy trên những bề mặt cứng, bằng phẳng, thoáng mát và khô ráo.
Không nên đặt máy trên các vật mềm như chăn, gối, nệm,… Điều này sẽ khiến Macbook rất nóng khi sử dụng.

4. Giữ các tab ở mức tối thiểu nhất có thể. Đóng và đánh dấu các tab bạn chưa sử dụng đến.

Điều này sẽ giúp lưu trữ và tiết kiệm tài nguyên cho CPU.Hiển thị các ứng dụng ngầm và tắt một số ứng dụng không cần thiết.

Thường xuyên cập nhật các phiên bản hệ điều hành của macOS để phòng tránh các mã virus và phần mềm độc hại

Mình hay sử dụng phần mềm HWMonitor để theo dõi nhiệt độ máy từ đó kiếm tra và tắt các tác vụ hợp lý.

Các bạn có thể thử để quản lý máy (hiệu suất) 1 cách tốt hơn.

Khai báo biến trong extension của Swift

Một trong những hạn chế của Swift Extension là không thể khai báo biến trong nó. Trong bài viết này, chúng ta sẽ tìm hiểu về cách để tạo biến trong extension.

Tổng quan

Swift Extension cho phép chúng ta thêm các hàm cho một class, struct, enum hoặc protocol có sẵn. Extension thường được sử dụng nhiều trong project. Và đôi khi, ta cần phải giữ reference đến một object nào đó trong những extension này. Không may là, Swift không cung cấp một phương pháp cụ thể nào cho việc này cả. Tuy nhiên, Swift API hiện tại có cách hỗ trợ cho việc này. Bắt đầu nào 😉

Cách thông thường

Nếu bạn chưa bao giờ thử khai báo biến trong extension, thì việc khai báo sẽ đại khái như thế này.

Ví dụ chúng ta có 1 protocol tên là ToggleProtocol, chứa 1 phương thức toggle. Sau đó, ta cho UIButton implement protocol này để thay đổi trạng thái của button. Khá đơn giản phải không? 😉

protocol ToggleProtocol {
    func toggle()
}
enum ToggleState {
    case on
    case off
}
extension UIButton: ToggleProtocol {
    private(set) var toggleState = ToggleState.off
    func toggle() {
        toggleState = toggleState == .on ? .off : .on
        if toggleState == .on {
            // Shows background for status on
        } else {
            // Shows background for status off
        }
    }
}

Khoan, có lỗi compile rồi! Lỗi xảy ra ở dòng

private(set) var toggleState = ToggleState.off:

error: extensions may not contain stored properties.

Cú lừa chăng? Không đâu bạn ơi, đó là do Swift không support việc khai báo biến trong extension 😔😔. Vì thế, bạn không thể dùng thuộc tính toggleState được. Giờ ta phải thêm 1 chút ma thuật để đưa mọi thứ về với đúng quỹ đạo của nó.

Cách ma thuật

protocol ToggleProtocol {
    func toggle()
}
enum ToggleState {
    case on
    case off
}
extension UIButton: ToggleProtocol, PropertyStoring {
    typealias T = ToggleState
    private struct CustomProperties {
        static var toggleState = ToggleState.off
    }
    var toggleState: ToggleState {
        get {
            return getAssociatedObject(&CustomProperties.toggleState, defaultValue: CustomProperties.toggleState)
        }
        set {
            return objc_setAssociatedObject(self, &CustomProperties.toggleState, newValue, .OBJC_ASSOCIATION_RETAIN)
        }
    }
    func toggle() {
        toggleState = toggleState == .on ? .off : .on
        if toggleState == .on {
            // Shows background for status on
        } else {
            // Shows background for status off
        }
    }
}

Ở đây ta có 2 keyword mới đó là objc_getAssociatedObjectobjc_setAssociatedObject. Hãy cùng tìm hiểu rõ hơn nào 😋😋.

objc_getAssociatedObject trả về một giá trị của object tương ứng với key được truyền vào. Phương thức này yêu cầu 2 tham số.

  1. object: Any!: source object. Ta có thể truyền self trong trường hợp này.
  2. key: UnsafeRawPointer!: con trỏ nối giữa key và object.

objc_setAssociatedObject set giá trị object cho key. Phương thức này yêu cầu 4 tham số.

  1. object: Any!: source object. Ta có thể truyền self trong trường hợp này.
  2. key: UnsafeRawPointer!: con trỏ nối giữa key và object.
  3. value: Any!: object truyền vào.
  4. policy: objc_AssociationPolicy: Kiểu lưu object. Có thể là 1 trong các kiểu sau:
    • OBJC_ASSOCIATION_ASSIGN: Lưu object với weak reference.
    • OBJC_ASSOCIATION_RETAIN_NONATOMIC: Lưu strong object theo cách nonatanomic.
    • OBJC_ASSOCIATION_COPY_NONATOMIC: Khởi tạo object kiểu non-atomic và tạo 1 bopy cho object đó.
    • OBJC_ASSOCIATION_RETAIN: Lưu strong object theo cách atanomic.
    • OBJC_ASSOCIATION_COPY: Khởi tạo object kiểu atomic và tạo 1 bopy cho object đó.

Property Storing là 1 kiểu Generic cho phép ta khởi tạo object ngắn hơn

protocol PropertyStoring {
    associatedtype T
    func getAssociatedObject(_ key: UnsafeRawPointer!, defaultValue: T) -> T
}
extension PropertyStoring {
    func getAssociatedObject(_ key: UnsafeRawPointer!, defaultValue: T) -> T {
        guard let value = objc_getAssociatedObject(self, key) as? T else {
            return defaultValue
        }
        return value
    }
}

 

Và đây là cách để tạo biến trong Swift Extension. ✌️✌️✌️

Nguồn

  1. Source
  2. objc_setassociatedobject
  3. objc_getassociatedobject

[Chia sẻ] Tài liệu lướt nhanh TypeScript 2.0

This post is part of the TypeScript Evolution series:

  1. TypeScript 2.0: Non-Nullable Types
  2. TypeScript 2.0: Control Flow Based Type Analysis
  3. TypeScript 2.0: Acquiring Type Declaration Files
  4. TypeScript 2.0: Read-Only Properties
  5. TypeScript 2.0: Tagged Union Types
  6. TypeScript 2.0: More Literal Types
  7. TypeScript 2.0: The never Type
  8. TypeScript 2.0: Built-In Type Declarations
  9. TypeScript 2.1: async/await for ES3/ES5
  10. TypeScript 2.1: External Helpers Library
  11. TypeScript 2.1: Object Rest and Spread
  12. TypeScript 2.1: keyof and Lookup Types
  13. TypeScript 2.1: Mapped Types
  14. TypeScript 2.1: Improved Inference for Literal Types
  15. TypeScript 2.1: Literal Type Widening
  16. TypeScript 2.1: Untyped Imports
  17. TypeScript 2.2: The object Type
  18. TypeScript 2.2: Dotted Properties and String Index Signatures
  19. TypeScript 2.2: Null-Checking for Expression Operands
  20. TypeScript 2.2: Mixin Classes
  21. TypeScript 2.3: Generic Parameter Defaults
  22. TypeScript 2.3: The –strict Compiler Option
  23. TypeScript 2.3: Type-Checking JavaScript Files with –checkJs
  24. TypeScript 2.3: Downlevel Iteration for ES3/ES5
  25. TypeScript 2.4: String Enums
  26. TypeScript 2.4: Weak Type Detection
  27. TypeScript 2.4: Spelling Correction
  28. TypeScript 2.4: Dynamic import() Expressions
  29. TypeScript 2.5: Optional catch Binding
  30. TypeScript 2.6: JSX Fragment Syntax
  31. TypeScript 2.7: Numeric Separators
  32. TypeScript 2.7: Strict Property Initialization
  33. TypeScript 2.8: Per-File JSX Factories

 

Link bài viết gốc: https://blog.mariusschulz.com/series/typescript-evolution

Quản lý công việc hiệu quả với Skype + Microsoft To Do

Hôm nay mình xin phép chia sẻ về cách quản lý công việc đơn giản với những bước vô cùng đơn giản.

  1. Skype: Một ứng dụng gần như ai cũng biết và dùng để trao đổi và chính nó đã có thêm 1 tính năng tuyệt vời đó là quản lý task khi bạn ấn chuột phải vào 1 tin nhắn ở dưới.
    Bước 1: Chọn tin nhắn sẽ trở thành tên task của mình
    Bước 2: Theo dõi task mình đã tạo trên skype


  2. Tận dụng ứng dụng Microsoft To Do có sẵn tính năng đồng bộ với skype khi task được tạo ra để giúp mọi người nhắc nhở công việc hằng ngày.
    Hiện tại Microsoft chưa ra bản chính thức về ứng dụng này cho 2 nền tảng, nhưng đừng lo đã có những người tốt bụng viết cho chúng ta
    Windows: https://github.com/klauscfhq/ao
    Mac: https://github.com/Wowu/microsoft-todo-osx
    Hình ảnh ứng dụng:

Cài đặt java cho MacOS nhiều version hoạt động hiệu quả

0. If you haven’t already, install homebrew.

See https://brew.sh/

1. Install jenv

brew install jenv

2. Add jenv to the bash profile

if which jenv > /dev/null; then eval "$(jenv init -)"; fi

3. Add jenv to your path

export PATH="$HOME/.jenv/shims:$PATH"

4. Tap “caskroom/versions”

brew tap caskroom/versions

5. Install the latest version of java

brew cask install java

6. Install java 6 (or 7 or 8 whatever you need)

brew cask install java6
#brew cask install java7
#brew cask install java8

7. Review Installations

All Java version get installed here: /Library/Java/JavaVirtualMachines lets take a look.

ls -la /Library/Java/JavaVirtualMachines

8. Add each path to jenv one-at-a-time.

We need to add “/Contents/Home” to the version folder. WARNING: Use the actual paths on your machine… these are just EXAMPLE‘s

jenv add /Library/Java/JavaVirtualMachines/1.6.0___EXAMPLE___/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk___EXAMPLE___/Contents/Home

9. Check if jenv registered OK

jenv versions

10. Set java version to use (globably)

Where XX matches one of the items in the versions list above.

jenv global XX

Check java version

java -version

[IELTS]-[Writing] Task 2: Introduction

From: I Shine – Chia sẻ kỹ năng IELTS

Note for me, for you.

This post will help you write better introductions in your Task 2 IELTS essays

  1. Introduction:
    1. Background
    2. Detail Background
    3. Thesis statement
    4. Outline the statement
  2. Detail each item in an introduction:
    1. Background – Lead the reader to the subject
      1. Fact:
        1. It is apparent that
        2. It is obviously witnessed that
        3. It is axiomatic that
      2. Conflict:
        1. The issue of + N Phase + generates many heated debates
        2. The issue of + N Phase + remains controversial
      3. Definition:
        1. Something + could be defined as the trend of / phenomenon of + V-ing
        2. Something + refers to the trend of / phenomenon of + V-ing
    2. Detail Background
      Ingone for Conflict
    3. Thesis statement – Vital in body
      1. Choose the main idea to answer the question
      2. Turns main ideas into noun phrases
      3. Include the noun phrase into the thesis statement
    4. Outline the statement
      This essay will discuss/analyze the typical cause

Fastlane in Mojave

Here’s a brief step-by-step that worked for me:

  • Install rbenv: brew install rbenv
  • Add rbenv to your environment by the following to ~/.bash_profile:
    export PATH="/Users/username/.gem/ruby/2.3.0/bin:$PATH"
    eval "$(rbenv init -)"
  • Restart terminal
  • Install a local ruby version: rbenv install 2.3.1 (this takes a while to complete)
  • Activate the local ruby version: rbenv local 2.3.1

Then you can gem install bundler without sudo.

RXSwift Basics with Story

Subject – Observable and Observer at once. Basically it can observe and be observed.
BehaviorSubject – When you subscribe to it, you will get the latest value emitted by the Subject, and then the values emitted after the subscription.
PublishSubject – When you subscribe to it, you will only get the values that were emitted after the subscription.
ReplaySubject – When you subscribe to it, you will get the values that were emitted after the subscription, but also values that were emitted before the subscription. How many old values will you get? It depends on the buffer size of ReplaySubject you subscribe to.

You’ve opened first, second, third gift. And whoops! Your mom was cooking some delicious food and is late to the opening party. As a mom, she just has to know what presents you’ve got already. So you tell her about them. In Rx world you’ve sent observable sequence (presents) to the observer (your mom). What’s interesting is that she started observing you after you already emitted few values, but she got whole info anyways. For her we are a ReplaySubject with buffer = 3 (we save 3 latest presents and give it every time a new subscriber appears).

You are still opening presents and there you see that two of your friends (Jack and Andy) were also late to the party. Jack happens to be your close friend so he asks what have you opened so far. As you are kinda angry that he missed a part of it, you tell him only the latest present you’ve opened. He doesn’t know that there were more of it, so he is happy with it. In Rx world you’ve sent only latest emitted value to the observer (Jack). He will also get the next values as you emit them (next presents you will open). For him we are a BehaviorSubject (we kinda changed the Subject ?).

There is also Andy, who happens to be just a friend and doesn’t really care about the presents you’ve opened so he just sits down and waits for the rest of the show. As you can imagine, for him we are just a PublishSubject. He just gets values that are emitted after the subscription.

One more thing...

There is also something called Variable. This is wrapper around BehaviorSubject. The thing is, you can only submit the .onNext() event (when using BehaviorSubject you have direct access to sending .onError().onCompleted()). Also, Variableautomatically sends .onCompleted() event when it’s being deallocated.

Alright, enough with definitions. Let’s try it out!

Source: https://www.thedroidsonroids.com

[iOS Developer] Thông số tham khảo khi lập trình IPhone XS, XR, XS Max

iPhone XS

  • Display: 5.8” OLED
  • Screen size: 375pt x 812pt
  • Physical size: 1125px x 2436px (458 PPI)
  • Scale factor: @3x
  • Native scale factor: @3x
  • Portrait size classes: w: Compact, h: Regular
  • Landscape size classes: h: Compact, w: Compact

iPhone XR

  • Display: 6.1” LCD
  • Screen size: 414pt x 896pt
  • Physical size: 828px x 1792px (326 PPI)
  • Scale factor: @2x
  • Native scale factor: @2x
  • Portrait size classes: w: Compact, h: Regular
  • Landscape size classes: h: Regular, w: Compact

iPhone XS Max

  • Display: 6.5” OLED
  • Screen size: 414pt x 896pt
  • Physical size: 1242px x 2688px (458 PPI)
  • Scale factor: @3x
  • Native scale factor: @3x
  • Portrait size classes: w: Compact, h: Regular
  • Landscape size classes: h: Regular, w: Compact

[Xcode] Quản lý provisioning thật đơn giản

Dưới dây mình xin giới thiệu với các bạn mình tool hỗ trợ với việc xóa, tìm kiếm với file đó thật dễ dàng. Rất dễ dàng sử dụng.

 

Download: http://hippo-foundry.s3.amazonaws.com/profile-manager/ProfileManager.zip

Ref: https://github.com/Hipo/ProvisioningProfileManager

WP Facebook Auto Publish Powered By : XYZScripts.com