Macbook Pro Retina late2012 with GTX 1080 eGPU Upgrade

Summary: I upgraded my 6 year old Macbook Pro 13″ from 3DMark 11 gaming performance P721 to P9412 and play recent games with highest settings.

I recently was looking for a new notebook with Thunderbolt 3 to replace my late 2012 Macbook Pro 13 inch. I wanted to play some games but didn’t want to buy a desktop PC. So it has to be a notebook with Thunderbolt 3 so I could attach an eGPU to the USB-C port.

During my research I found egpu.io where I could read about external GPUs that are available on the market. I also learned about Thunderbolt 3 to Thunderbolt 2/1 adapter. There were other Macbook Pro owners who succeeded to get eGPU to run with an adapter.

I decided to try and upgrade an old Macbook Pro Retina 13-inch late 2012 because it was still fast enough for me.

I read many success stories and started collecting information about what which steps to do. All include multiple steps and have different aproaches and need some experimenting.

My starting point is: I have a Macbook Pro with only Windows 10 installed . I have no MacOS X partition left because I deleted them all.

Notebook Specs

  • Late 2012 13″ Retina Macbook Pro i7 2.9 GHz, (Turbo Boost 3.6 GHz)
  • 8 GB 1600 MHz DDR3L
  • 256 GB SSD
  • Intel HD Graphics 4000
  • 2x Thunderbolt 1 (up to 10 Gbit/s)

eGPU

  • Gigabyte Aorus Gaming Box
  • NVIDIA GTX 1080

Cable and Adapter

  • Thunderbolt 2 cable
  • Thunderbolt 3 to Thunderbolt 2 adapter

Installation steps

Download Software

  • Download Gigabyte Aorus Gaming Box Software
  • Download Intel Thunderbolt Software
  • Download NVIDIA driver Software
  • Downlaod EFI files:
    apple_set_os.efi https://github.com/0xbb/apple_set_os.efi
    refind 0.11.4 http://www.rodsbooks.com/refind/

Backup

Backup my Windows installation and create a recovery stick.

SIP

Disable SIP (System Integrity Protection) – I have no running Mac OS X installed but can start MacOS X Internet Recovery Mode.

  1. Start Internet Recovery Mode, press CMD + ALT + R after power on
  2. Connect to the internet with WiFi
  3. Open a terminal and execute
  4. Execute the command csrutil disable

Install EFI

Spoof the system to not disable the iGPU when an external GPU was detected. This is the most confusing part. I did manage to get my Macbook Pro to not boot several times because of trial-and-error approach.

I did install rEFInd following the instructions at http://www.rodsbooks.com/refind/installing.html#windows it didn’t work exactly. Here are my modifed steps:

  1. Extract the zip file
  2. In refind folder, remove aa64 and ia32 folders and efi files. The are not used.
  3. Copy apple_set_os.efi to the refind folder
  4. Rename refind.conf-sample to refind.conf
  5. Open the command prompt windows as administrator
  6. mountvol S: /S
  7. Copy contents of refind folder to S:\EFI\Boot\ with xcopy /E refind S:\EFI\Boot
  8. Change to drive S: and then cd EFI\Boot
  9. Rename .efi files. rename bootx64.efi windows64.efi and rename apple_set_os.efi bootx64.efi

Working
Using the external GPU with internal and external screen. Playing games with highest settings. The results using the external screen is better.

Not working
USB Hub on the Aorus Gaming Box
The 2 small fans are not running.

 

Authentication with Passport JWT

This is the third part of Getting Started with NestJS. This document was updated to use NestJS 5.3.6

We use Passport as our authentication middleware with NestJS. It suppport different methods, in Passport it’s called Strategy, to authenticate e.g Local, OpenID, Facebook, Google Account and Twitter. We use the local one.

We need a user entity to persist registered user. This is the same task as creating the product entity from last time.

Create folder user in folder nestjs-backend/src.

Create file user.entity.ts in folder nestjs-backend/src/user.
Continue reading “Authentication with Passport JWT”

Add TypeORM to NestJS Project

This is the second part of Getting Started with NestJS. This document was updated to use NestJS 5.3.6

We add sqlite3 database support with TypeORM. Install TypeORM and sqlite3 for our project:

npm i -s @nestjs/typeorm typeorm sqlite3

In folder nestjs-backend/src create folder product.

In folder nestjs-backend/src/product create the file product.entity.ts.


import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Product {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 500 })
  name: string;

  @Column('text')
  description: string;
}

Continue reading “Add TypeORM to NestJS Project”

Getting Started with NestJS

We are getting started with NestJS. This document is a work in progress and it gets updated as we go. This document was updated to use NestJS 5.3.6 We use Visual Studio Code, download and install it. Open the console in VS Code with View|Integrated Terminal. Now create a new folder for the project on the console and open it as VS Code project folder:

 mkdir nestjs-backend code -r nestjs-backend

Install Node.js if you don’t have it yet. Check for npm version (currently 5.6.0), npm comes with Node.js.

npm -v

If the version is older than 5 update it with

npm install -g npm

Continue reading “Getting Started with NestJS”

Handle offline and online status

Check if your web app is offline/online and show the status and handle it when the user triggers something needing the connection. [Mozilla: Online and offline events](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/Online_and_offline_events)

What is the right way to wait for data in Angular?

I have a child-component `CheckboxListComponent` which shows a list of checkboxes. The list is populated in `ngOnInit` through a webservice-call which takes more or less time. It also has a function `setEntryChecked` to set a specific item to checked. When `foo()` is called before the `CheckboxListComponent` has it’s data the call was lost or has no effect. My solution is to wait for the result to be available with `await this.listSubject.first().toPromise()`. Is there a better way to do this in TypeScript? Continue reading “What is the right way to wait for data in Angular?”