How to get Android Studio Emulator working properly with Ryzen on Windows - actual instructions that don't suck

I recently built a new Ryzen computer and felt like getting back into Android development for some personal apps. Got Android Studio up and running without any major issues, but the emulator wouldn't run without HAXM (which doesn't work on AMD processors).


Intel HAXM is required to run this AVD. HAXM is not installed.
Install Intel HAXM for better emulation performance.
So one of the first results we all see when searching Google for "Android Studio Ryzen" is a blog post on Google's official Android developers blog titled Android Emulator - AMD Processor & Hyper-V Support, posted in July 2018.

For Windows, the instructions looked simple enough.

  1. ✔️Have an AMD Ryzen processor
  2. ✔️Android Studio v3.2 beta or higher
  3. ✔️Android Emulator v27.3.8 or higher
  4. ✔️x86 based Android Virtual Device image
  5. ✔️Windows 10 April 2018 or higher
  6. ✔️Windows Hypervisor Platform enabled
  7. ???
  8. ❌Profit

Yes yes all done, but why am I still getting the HAXM error message? I checked for any other blog posts with the AMD tag but in the past 2 years nothing else has been posted for Ryzen.

They also point you to a troubleshooting page which pretty much gave the same instructions as the blog post.

So what the hell am I doing wrong? Nothing. The docs are wrong.

Image result for principal skinner kids are wrong

There is one crucial step missing from most results on the first page of Google when it comes to this issue and I even had trouble finding it on Stack Overflow and Reddit.

By chance, I thought "if Intel needs HAXM drivers, maybe AMD does too". So I took a look in the SDK manager and there it was sitting quietly in the second tab.


  • Open up Android Studio
  • From the top menu, click on Tools > SDK Manager
  • Expand the tree from Appearance & Behaviour > System Settings > Android SDK
  • Click on SDK Tools
  • Tick "Android Emulator Hypervisor Driver for AMD Processors (installer)"
  • Click OK or Apply and let it install
  • Once its finished, open up your Android SDK folder and navigate to "sdk_path\extras\google\Android_Emulator_Hypervisor_Driver"
  • Right click "silent_install.bat" and run with Administrator rights

Now you should be able to run AVDs at a decent speed.

I wish Google would take the time to update their own docs regarding this. It's literally one or two extra lines.

Source

VirtualBox: Cloning a physical drive (HDD or SSD) to VDI on Windows

Open up Partition Manager on Windows to find your "disk number"


Open up a Command Prompt and type:

VBoxManage.exe convertfromraw \\.\PhysicalDrive2 C:\output.vdi --format VDI

Replacing "2" with the drive index you want to clone and changing the output location to whereever you want.

That should be it!

Update:

VBoxManage creates a full clone, meaning the image will take up as much space as the physical drive. If you want an image based on just the content, use Disk2vhd from Microsoft

Sources

Fix slow link clicks in Microsoft Office (Word, Excel, Powerpoint, etc)

When working with a spreadsheet with roughly 90 rows of links, I got frustrated with a 1-3 second delay when clicking on each link.

The cause

For those who don't have Internet Explorer as their default browser (who in their right mind would?), Office has implemented a workaround which does a request internally to check the response before opening the link.

This internal request also handles other cases like checking if the link points to another spreadsheet file or an external word doc file on a network drive.

The behaviour is noticeable in Office 2003, 2007, 2010, 2013, 2016 and probably 2019 onwards.

Fortunately there is an easy fix which forces link clicks to be handled by the system instead of Office.

The catch

If this all sounds too good to be true, then it is.

The fix changes a setting which sets ForceShellExecute=1, which means all links will be treated as if it was clicked from within the shell (aka Windows Explorer).

Because of that, Office no longer has any way to intercept the clicks and this breaks multi-document linkage. See this page to see if any of the scenarios affect your daily workflow before running the fix.

The fix

To stop the internal request from being made (and causing delays), go to this Office troubleshooting page and download the "Easy fix".

Run it and follow the instructions.

That should be all you need to do.

Sources:


Getting native Linux terminal on Win10 WSL (Windows Subsystem for Linux)

(Wow, it's been a while since I've written anything! Since Open Live Writer doesn't seem to be working anymore, I had to venture back into writing straight in the browser. Dammit Blogger it's still awful)

After upgrading to Win10 1809 (the infamous November 2018 rollout) and updating to the latest WSL Ubuntu build, I noticed a bunch of issues with my ConEmu/WSL setup.

Vim wasn't navigating as it should; ignoring input at random and text wasn't pasting properly into the command line. It seemed to be truncated randomly and I couldn't spot a pattern. Turns out there were some changes to the way input was encoded and I needed an update for ConEmu and use their wslbridge script.

I tried updating and the performance hit was awful. I had native WSL and bridged ConEmu side by side tailing the same log file and the bridge script was causing it to jitter uncomfortably.

Along the way I found an extremely helpful post by ropnop called "Configuring a pretty and usable terminal emulator for WSL". I didn't know it was possible to forward the X Window manager to... Windows! There was a detail or two missing (regarding firewall and dbus) but eventually I managed to get it working in a slightly simpler way (no need for vbscript).

Downloads

Setup


  • Install VcXsrv and run XLaunch. The default settings are fine, but be sure to save the config so you can simply run the configuration to start X.
  • Alternatively you can start it with:
    "C:\Program Files\VcXsrv\vcxsrv.exe" :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl -dpi auto
  • Make sure the icon appears in the taskbar.


  • Open up an instance of WSL Bash
  • Start off with "sudo apt-get update"
  • Followed by "sudo apt-get install dbus-x11 gnome-terminal" (you can substitute gnome-terminal with whatever terminal you'd prefer)
  • Confirm install and let the downloads start
  • While you're waiting, be sure to create a firewall rule to prevent anyone else from accessing your X server
  • (Firewall setup) Go to "Windows Defender Firewall" and click on "Advanced settings" on the left

(I hate the labyrinth known as Windows 10 settings)


  • Click on "Inbound Rules" under "Windows Defender Firewall ..."
  • Right click > "New Rule" (or click on New Rule on the right panel)
  • Rule type: Program
  • Program path: C:\Program Files\VcXsrv\vcxsrv.exe (by default)
  • Allow the connection
  • Only apply to Private connections
  • Then give the rule an appropriate name
  • Edit the new rule you've created
  • Go to the "Scope" tab and add 127.0.0.1 to both local and remote IP restrictions


  • Apply and finish
  • (Back to the terminal setup) Once it's done downloading, give dbus a kick start:
    sudo /etc/init.d/dbus restart
  • Test that window forwarding works by pasting this in:
    DISPLAY=:0 gnome-terminal &
  • If it works, create an alias in ".bash_aliases" called "runterminal" with the following:
    alias runterminal="DISPLAY=:0 terminator &"


  • Finally, create a shortcut on your desktop to easily start gnome-terminal:
    bash.exe -i -c "runterminal"
  • Set "Run" to minimised to avoid an unnecessary command prompt flicker.
  • And now you're done!

Sources


Getting Python 3.6 build tools working on Windows

What an annoying process this has become. Used to be "download this exe, install and carry on".

Didn't bother with Python 3.7 since a lot of libraries were breaking on Linux.

Downloads

Grab Microsoft Visual C++ 14.0 standalone: Build Tools for Visual Studio 2017 (x86, x64, ARM, ARM64).

Setup

  • Run vs_buildtools.exe
  • Wait for it to download a bunch of files for "Visual Studio Installer"
  • Click "Individual components"
  • Select "Compilers, build tools, and runtimes" > "VC++ 2017 version 15.7 v14.14 latest v141 tools" (or whatever is latest)
  • Select "Development activities" > "Visual C++ Build Tools core features"
  • Select "Windows  10 SDK (10.0.17134.0)"
  • Everything else needed will be automatically selected for you.
  • Last chance to change "Installation location" at the bottom
  • Go grab a coffee or tea.

All up it should take about 3.03gb in space.

image

Summary on the side should look something like this

Source

Python: comparison of pipenv vs pip-tools

Now this isn't a blog I would have normally written up here since the stats in this post were only meant for my colleagues in an internal email update.

But I noticed some emotional messages in recent discussions regarding pipenv and a distinct lack of solid information about it's actual merits / benefit as a tool.

To me software development should be factual, much like maths and science. You prove yourself through your work. I don't give a shit if it was written by someone who is LGBT, has an illness or celebrity status.

It's as irrelevant to me as the stupid royal wedding. It doesn't matter and I don't need to know the back story.

That said, stress and anxiety from work should be dealt with by taking a damn break. It's not healthy to do nothing but coding or provide support for open source projects.

tldr; While I appreciate the effort and intention of the project to fix the Python workspace, pipenv feels like an early project still trying to find its feet.

Deterministic builds ARE important

As developers, there are plenty of things we'd like to spend our time doing and our dev tools are meant to help us save time in doing so.

Last week I had time to pick up a task from mid 2017 to switch our company codebase to use pip-tools.

pip-tools is primarily a tool to pin python dependencies by generating (and documenting) requirements.txt files from an input file, allowing for deterministic builds across all machines. It's pretty much yarn for Python.

I switched over to pip-tools within a day but there were still a few kinks with our dependencies. Conflicting library dependency versions, badly named libs, etc. Nothing really unexpected after 5+ years of digital hoarding and virtualenv neglect.

Another day of cleansing saw a few unnecessary libraries removed from the codebase and a neatly generated requirements.txt file.

During the process of updating our dev setup guide, I was looking for some documentation on Python.org and saw a little note recommending use of Pipenv for our virtualenv and packaging needs.

Well if it's recommended by Python it should be good, right? If this is the way it should be then it'd be in the best interest of our devs to switch to Pipenv so our skillset doesn't fall behind.

A summary of my experience follows below.

Benchmark setup

For the sake of reproducibility, all tests were done in a VM with a fresh install of Ubuntu 16.04 (on a host with a 7200rpm HDD), 4gb of ram, a shitty AMD A10-5800k and standard rubbish Aussie ADSL "broadband" internet.

Library versions are:

  • Pip 10.0.1
  • Python 2.7.11
  • pipenv 2018.5.18 (seriously, what is semver?)
  • virtualenv 16.0.0
  • and pip-tools 2.0.2

Timing was done via the "time" command. It's accessible and easy to use. Results were measured in seconds.

Notes:

  • for tests without pip cache, I would run "rm -rf ~/.cache/pip*" to clear pip/pipenv caching.
  • I wasn't able to time 2 commands properly, so I just wrote a "compile-sync.sh" script to time both "pip-compile --verbose" and "pip-sync"
  • excuse the charts, took me forever to figure out how to do them in Excel

Benchmark results

image

image

  • pipenv: pipenv --two
  • virtualenvwrapper: mkvirtualenv pt

No issue here. Nobody is gonna complain about 1 second difference in the grand scheme of things.

image

image

  • pipenv: pipenv install requests==2.18.4 django==1.11.13
  • pip-tools: ./compile-sync.sh

4 seconds difference, still not too bad.

image

image

  • pipenv: pipenv install requests==2.18.4 django==1.11.13
  • pip-tools: ./compile-sync.sh

So here was the first time I deleted the virtualenvs. I kept pip/pipenv caches intact to compare the dependency walking times.

Both much faster, but surprisingly still a 4 second difference.

image

image

  • pipenv: pipenv install (includes time to generate new lockfile)
  • pip-tools: ./compile-sync.sh

Now this is where it becomes interesting.

New virtualenv, no pip/pipenv caching, complicated requirements (pyrax and all of its insanity)

All things being equal, pipenv ends up being 2.7x slower than pip-tools.

If you want to replicate it, this is what the Pipfile looks like:

requests = "==2.18.4"
django = "==1.11.13"
### because pyrax is a cruel mistress
# "Could not find a version that matches pbr!=2.1.0,<2.0,>=1.6,>=2.0.0"
# https://github.com/rackspace/pyrax/issues/623
pyrax = "==1.9.8"
# required to get pyrax working without conflicting with its own dependencies
# https://github.com/pycontribs/pyrax/issues/623#issuecomment-329647249
"oslo.serialization" = "==1.6.0"
"oslo.utils" = "==2.0.0"
"oslo.i18n" = "==1.7.0"
debtcollector = "==0.5.0"
python-keystoneclient = "==1.6.0"
"oslo.config" = "==1.12.0"
stevedore = "==1.5.0"

For an insight to how truly horrible this library is, you should check the output of "pipenv graph".

image

image

  • pipenv: pipenv install
  • pip-tools: ./compile-sync.sh

Same complex requirements as before, but this time I only binned the virtualenv. It's much quicker once the libraries are cached, but pipenv is 4.8x slower when it needs to regenerate the lockfile.

Even with a valid lockfile, it's still 3.7x slower than pip-tools.

image

image

  • pipenv: pipenv install search_google==1.2.1
  • pip-tools: ./compile-sync.sh (after manually editing requirements.in)

Waiting 1m11s each time I want to add a library does not sound appealing.

Pros and cons

At this point I've only provided speed comparisons between pipenv and pip-tools. Below are a few things I noticed during my week comparing these tools.

virtualenvwrapper

  • simple virtualenv workflow
  • have to manually modify .bashrc to get the commands working
  • would have preferred the syntax to be some variance of "venvwrap mk|rm venv_name" rather than "mkvirtualenv venv_name" and "rmvirtualenv venv_name"

pip-tools

  • simple and focused
  • works with projects AND libraries
  • maintains compatibility with existing deployment tools (puppet, ansible, etc)
  • generated requirements.txt file is well documented and easy to read
  • pip-sync both installs new and removes unused libraries
  • unable to understand urls from github with #egg==version format (which pip understands)
  • likewise with virtualenvwrapper syntax, would have preferred "piptools sync|compile" over "pip-sync" and "pip-compile"

pipenv

  • provides many useful features like "check" for security vulnerabilities and "graph"
  • graph output is very nicely laid out
  • gets the "pipenv install|sync|clean" syntax right
  • much slower at tasks
  • works with projects, but not libraries
  • documentation for commands need work, better luck with trial and error
  • pipenv sync only seems to add libraries - need to run pipenv clean to remove unused libs
  • Pipfile syntax errors result in vague TomlDecodeError stack trace instead of helpful error messages
  • may cause issues with some shell setups due to the way pipenv shell works (lose aliases, no virtualenv label shown, source commands in .bashrc no longer work as expected, etc). mitigated by using --fancy flag, but inconsistent between dev machines with varied setups
  • "pipenv run" fails to set VIRTUAL_ENV environment. Apparently this is virtualenv's fault, but isn't pipenv meant to be a tool that makes it easier for Python newbies to pick up?

"Pipenv is primarily meant to provide users and developers of applications with an easy method to setup a working environment" (from homepage, paragraph 3)

  • doesn't quite feel like deployment tooling/plugins are ready yet (puppet, ansible, etc) - requires more work to update deployment scripts
  • no command for checking if virtualenv already created (I could be wrong due to documentation)

So in a deployment script, I tried to detect if a virtualenv folder exists before trying to sync. Nope, can't do.

"pipenv --venv" should give you the path of the virtualenv, but only if the virtualenv exists. Otherwise, it ends with exit code 1 which will terminate deploy scripts

Maybe sync will work? "pipenv sync --help" shows:

Options:
  --three / --two  Use Python 3/2 when creating virtualenv.

Ahh "when creating", that sounds promising!

But alas, in practice that actually destroys and recreates your virtualenv without warning! Enjoy your additional waiting time...

:~/src/test-piptools$ pipenv sync --two
Virtualenv already exists!
Removing existing virtualenv…
Creating a virtualenv for this project…

I have no words ...

What's the verdict?

I spent roughly 4-5 days getting things to work with pipenv. A bit of time learning the ropes of pipenv's workflow, some of it fighting my mostly-vanilla bash shell to work properly with pipenv, looking up issues on Github/StackOverflow, a lot of time waiting for lockfile generation and I finally had enough when the deployment scripts/tooling needed more work in the staging environment.

Your experience with pipenv on github may vary depending on who you interact with on the contributors team. I've seen a few valid tickets get dismissed, but the friendly assistance I got from uranusjr was highly appreciated.

While I can't argue the fact that pipenv works, it's definitely one of those things that could test the patience of a saint once used in a real world environment.

I find it difficult to see why pipenv is recommended by Python.org / PYPA apart from the reason that it's made by the guy who made requests.

Something to keep an eye on, but for now I don't believe it is as production ready as their alternatives.

Getting Font Awesome v5 (Pro) to work with yarn on multiple dev machines

FontAwesome is pretty much the defacto standard icon library these days.

First of all, you'll need your NPM token from your Accounts > Services page.

Following the instructions on the FontAwesome docs (and substitution npm with yarn) you get:

yarn config set @fortawesome:registry https://npm.fontawesome.com/YOUR-TOKEN

Unfortunately this will set the config variable @fortawesome:registry for only your system!

It seems the instructions on their docs for pro support prefer development on a single machine rather than reduce setup for multiple developers. This makes sense in a way since it's easier to get started on a single machine.

If you're fine with that, then we're done here.

But for those wanting a way to set up a project for multiple developers and reduce onboarding, the method below will set the registry for a project with multiple devs.

  • create a .yarnrc file in your project next to package.json
  • paste in the registry into your project .yarnrc:
    "@fortawesome:registry" "https://npm.fontawesome.com/YOUR-TOKEN"
  • (optional) remove @fortawesome:registry from your system
    yarn config delete @fortawesome:registry

Now you should be able to access fontawesome's npm registries via yarn.

yarn add @fortawesome/fontawesome-pro-solid
yarn add @fortawesome/fontawesome-pro-regular
yarn add @fortawesome/fontawesome-pro-light
yarn add @fortawesome/fontawesome-free-brands

Note, this method does assume your token will be inserted into a git repo somewhere. Not a huge security issue since tokens can be revoked via the accounts page.

Other things to do now are:

Sources

Easily Integrate React.js to a Django Website for dev and production builds

Assuming you already have a Django website up and running, this will get you started with compiled React.js on the front-end with:

  • Django and Webpack integrated nicely together during development and deployment
  • Support for React.js code in your website
  • Packaged and obfuscated Javascript code
  • SCSS support
  • Proper sourcemaps for dev builds
  • Hot reloading of (S)CSS changes during development, automatic page reloading for JS changes

Throughout this tutorial, it treats the client (browser) and django (server) projects as separate codebases. I'll try to be as clear as possible to which one we're currently working on.

This post was meant to be written much earlier, but things happened...

Zelda: Breath of the Wild took over my free time

      Setup

      • Grab the latest Node.js (6.10.0)
      • Make sure npm is up to date. Comes with Node if you upgraded it (currently using 3.10.8)
      • Install yarn globally (currently using 0.21.3)

      npm install -g yarn

      • Install create-react-app globally (currently 0.9.4 on github, but install says 1.3.0? so confusing)

      npm install -g create-react-app

      Note: don't use 0.9.3 if you want hot-reloading without some extra work.

      Prepping Django for integration with Webpack

      This side is much simpler, so we'll get it out of the way first.

      • In your Django project folder, install "django-webpack-loader" (v0.3.3 at time of writing):

      pip install django-webpack-loader

      • Add "webpack_loader" to INSTALLED_APPS in settings.py
      • Now to add WEBPACK_LOADER in settings.py. Take note that webpack loader will load different files depending on the value of settings.DEBUG.

      # Webpack loader
      WEBPACK_LOADER = {
          'DEFAULT': {
              'BUNDLE_DIR_NAME': 'bundles/',
              'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats-dev.json' if DEBUG else 'webpack-stats-live.json'),
          }
      }

      • Using your knowledge of setting up Django views and templates, point "your-react-view" url to this basic template react.html

      from django.shortcuts import render

      def your_react_view(request):

          return render(request, 'react.html')

      • The react.html file should contain:

      <!doctype html>
      < html lang="en">
        <head>
          <meta charset="utf-8" />
          <title>Testing</title>
        </head>

        <body>
          <div id="root"></div>

          {% load render_bundle from webpack_loader %}      
          {% render_bundle 'main' %}
        </body>
      < /html>

      In the template is simply an empty html5 document which imports the "webpacked" files and an empty div with the ID "#root" is used for the mounting point for the React code (see client/src/index.js).

      It also imports the "main" bundle compiled by webpack and executes it.

      Those are the 3 most important lines as they bring in the webpacked content to the page of your liking.

      Creating a front-end React/Webpack project

      Now for the nitty gritty. All the jokes and complaints you've heard about JS compilation and complexity are somewhat true. This guide will probably be out of date by the time you finish reading it!

      But don't worry, this tutorial will get you through the hardest part (the setup) by being as clear as possible, letting you know what you're changing and why.

      In a console, go to your Django project folder and type:

      create-react-app client
      cd client/
      yarn start

      I'm using the name "client" for the browser project, but you can quite easily call it "frontend" or whatever else you fancy.

      After typing "yarn start", it should pop up a browser tab/window while compiling and show you that it's working.

      At the moment it's a completely separate website to your Django website, so we'll have to make some changes to link them together.

      Ejecting from  create-react-app bootstrap

      So far it's very barebones and there are no files in client project that you can modify to change the build process.

      To make any sort of customisations, you will need to eject the project so there are files to configure. This means leaving the safety nest of create-react-app. It's a one way process, but you'll be far better off afterwards.

      • In the console for the client project, type in:

      yarn eject

      • Press Y to confirm (I got an error at the end of it, but the ejection process seemed to work just fine)
      • Now looking through the client project folder, you have lots of new files to modify!
      • Let's test that the client project still works with:

      yarn start

      Customisations

      By the time we're done with this section, your config should:
      • create production build to your-django-project/media/client/(css|js|media)
      • use SCSS in your code (it's great for managing nested CSS)
      • produce a webpack-stats-(dev|prod).json file for django integration
      • have a working dev build integrated with Django (served via websockets, so no output folder)

      Before we get started, there are some downloads needed for the extra features we want.

      • In the client project folder, type in:

      yarn add webpack-bundle-tracker node-sass sass-loader

      Current versions are:

        • webpack-bundle-tracker@0.2.0
        • sass-loader@6.0.2
        • node-sass@4.5.0

      While we're waiting, lets get rid of the annoying a browser tab that opens everytime we run yarn start!

      • Open up client/scripts/start.js and search for any lines of code with openBrowser
      • There should only be two lines using it; the import and call.
      • Terminate with extreme prejudice.

        Changes to client/config/webpack.config.dev.js

        • Under "var paths = require('./paths')", add in:

        var BundleTracker = require('webpack-bundle-tracker');

        • Replace "var publicPath = '/';" with:

        var publicPath = 'http://' + paths.serverHostname + ':3000/assets/bundles/'; // override django's STATIC_URL for webpack bundles

        • Change module.exports > output > path to paths.appBuildDev
        • Under module.exports > resolve, add in root: paths.appSrc,
        • Under module.exports > module > preloaders, under 'include' add in:

        exclude: /node_modules/

        There is no need to lint check modules that we shouldn't be changing.

        • Under module.exports > module > loaders > first entry > exclude, change:

        /\.css$/,

        to

        /\.(css|scss)$/,

        • Under module.exports > module > loaders, add in the following after the .css test:

        // SCSS support
        {
          test: /\.scss$/,
          loaders: ["style", "css", "sass"]
        },

        • Search for HtmlWebpackPlugin and disable/remove it
        • And at the very end of module.exports > module > plugins, add in:

        // For django to know about webpack
        new BundleTracker({ filename: '../webpack-stats-dev.json' })

        Note: the dev specific filename

        • Search for devtool and change it from 'cheap-module-source-map' to 'source-map'.

        We don't want to go cheap while we're debugging! More information is always better.

        Changes to client/config/webpack.config.prod.js

        • Under "var paths = require('./paths')", add in:

        var BundleTracker = require('webpack-bundle-tracker');

        • Under module.exports > module > preloaders, add the follow under 'include':

        exclude: /node_modules/

        There is no need to lint check modules we shouldn't be changing.

        • Under module.exports > resolve, add in root: paths.appSrc,
        • Under module.exports > module > loaders > first entry > exclude, change:

        /\.css$/,

        to

        /\.(css|scss)$/,

        • Under module.exports > module > loaders, and after the .css test, add in:

        // SCSS support
        {
          test: /\.scss$/,
          loader: ExtractTextPlugin.extract('style', 'css?-autoprefixer!postcss!sass')
        },

        • Search for HtmlWebpackPlugin and disable/remove it
        • Same with ManifestPlugin
        • And at the very end of module.exports > module > plugins, add in:

        // For django to know about webpack
        new BundleTracker({ filename: '../webpack-stats-prod.json' })

        Note: the production specific filename

        • I'd strongly suggest disabling sourcemaps by commenting out "devtool" for production so people can't view your plain text source code unless you have something in place for specifically your map files.

        Changes to client/config/paths.js

        • In getPublicUrl(), change the one liner to:

        return envPublicUrl || require(appPackageJson).homepage || '/media/';

        • Scroll to the bottom to find "module.exports"
        • Comment out or remove appHtml, we don't need it anymore.
        • Change appBuild to:

        appBuild: resolveApp('../media/'),

        • And add these to module.exports:
        appBuildDev: resolveApp('build'),   

        serverHostname: 'localhost',

        Changes to client/scripts/build.js

        Replace the following line

        fs.emptyDirSync(paths.appBuild);

        With:

        fs.emptyDirSync(paths.appBuild + '/client/');

        This line empties the output folder each time you run yarn build. The change ensures your existing media folder doesn't get wiped each time.

        Changes to client/scripts/build.js and client/scripts/start.js

        • Remove paths.appHtml from

        if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {

        You can also take the time to remove the files:

        • client\public\favicon.ico
        • client\public\index.html

        Phew, we're mostly done with the configuration!

        Switching to SCSS

        Now let's switch to SCSS. Rename client/src/App.css to client/src/App.scss and update the import in App.js from:

        import './App.css';

        to:

        import './App.scss';

        It's a relatively minor change, but makes a world of difference when writing neatly nested CSS classes. You can also define variables and macros/functions when defining styles.

        Testing your setup

        Dev setup

        • Build your project:

        yarn start

        • And run Django as per usual:

        python manage.py runserver

        Production setup

        • Build your project:
        • In your production settings.py file, make sure you're reading webpack information from webpack-stats-prod.json in the WEBPACK_LOADER setting.
        • Compile your production browser project by typing:

        yarn build

        • Check for output in DjangoPath/media/client/

        Enabling hot loading

        You may have noticed some 404's in the Django log to /sockjs-node/info while testing your setup.

        That's webpack hot-loading looking for the hot-reload websocket signal in the wrong place.

        In webpack.config.dev.js, disable/remove the line:

        require.resolve('react-dev-utils/webpackHotDevClient')

        And replace it with:

        require.resolve('webpack-dev-server/client') + '?http://' + paths.serverHostname + ':3000',
        require.resolve('webpack/hot/dev-server'),

        The default webpackHotDevClient provided by create-react-app is neat, but isn't configurable so makes it's useless for our setup. So we have to switch it out for the one that comes with webpack-dev-server which allows us to set the webpack server location.

        Hot-reload bug with create-react-app 0.9.3

        Please note that there is a bug which prevents webpack-dev-server/client from working properly with create-react-app v0.9.3 (or v1.2.1?). The bug was fixed in 0.9.4.

        If you're on v0.9.3 and want hot reloading, you can just fix this yourself by editing webpack.config.dev.js.

        • Find the following line under module > loaders > first entry > exclude:

        /\.(js|jsx)$/,

        • And replace it with:

        /\.(js|jsx)(\?.*)?$/,

        Reason being Webpack was stripping out the query information after the "?" on the line where webpack-dev-server/client was imported. For further information about the bug, see this pull request.

        Other recommendations

        Use JSX file extension

          Switching your React component code to use the file extension jsx instead of js. Some editors will behave better for React specific code.

          • Rename index.js to index.jsx and App.js to App.jsx
          • Remember to change paths.appIndexJs accordingly.  

          Disabling chunk hash on output filenames

            For production, sometimes you may find it useful to not include hashes in your code filenames.

            In webpack.config.prod.js:

            • output.filename: 'client/js/[name].js'
            • plugins at the end: new ExtractTextPlugin('client/css/[name].css')

            I would definitely keep it in for media files though as they don't change often.

                  Change dev build output filename from "bundle.js"

                  You'll need to change this if you want to support code splitting/chunks.

                    Delete logo.svg

                      It's likely you'll be removing the demo code so why not the demo assets too?

                      That's about it for now. For me it's back to Zelda...

                      Sources

                      Updates

                      22/05/2017

                      • Fixed output folder from static to media
                      • Fixed bug with SCSS output in the wrong order
                      • Removing file hashes from output.
                      • Removed the section about /static/static

                      10/03/2017

                      • Forgot to remove ManifestPlugin from webpack.config.prod.js
                      • Added module.exports > resolve > root

                      Samba File Server: Stop files from being set with executable bit

                      While doing a bit of code cleanup today, I found some files which were marked as executable even though they weren't meant to be.

                      image

                      As I looked around at the files affected, a colleague did some snooping on git and found out why it was being set.

                      "Err Twig, I think it's you".

                      After double checking the git logs, yep it was me. How embarassing!

                      dramatic_alpaca

                      Preventing the stupid setting

                      Fortunately it's an easy fix to stop it from happening.

                      Open up the Samba FS config file

                      • sudo vi /etc/samba/smb.conf
                      • Under "[global]", paste in:

                      map archive = no

                      • Save and restart

                      Bonus: Fixing affected files

                      Unfortunately, this part isn't so easy

                      You can use this command to quickly search and list out files affected:

                      find -type f -perm /u+x | vim -

                      If you want to just find and turn off the executable bit automatically, then use:

                      find -type f -perm /u+x -exec chmod -x {} \;

                      find -type d -perm /u+x -exec chmod 0755 {} \;

                      It'll be up to you to set +x back onto any files which were supposed to have it.

                      Source

                      cPanel / WHM: How to redirect sub-addressed (plus addressing) emails to your inbox folder

                      For a few months now, my inbox has been pretty quiet. I thought that the war on spam is finally over, but then I noticed that my regular cron job emails weren't being received either.

                      I checked and disabled all my email filters, nothing strange there.

                      I disabled all my spam checks. Nope nothing there too.

                      Without many other options, I contacted my web host and they said it seemed fine. I sent various test emails and replied back saying it wasn't working for me on all email addresses on their servers.

                      Something seemed fishy, but I decided to bypass my usual IMAP method of use and went straight to webmail. Wasn't showing up there either.

                      The problem

                      Clicking around on all the options on Roundcube, by chance I stumbled upon an option to select folder subscriptions and noticed a bunch of folders which matched the names of my test emails!

                      It turns out somewhere along the line, in a "recent" update cPanel decided to redirect all plus-addressed emails to a subfolder matching the name of the sub-address. This was a ridiculously stupid decision as IMAP clients generally don't refresh the subfolder listings until you tell them to. With plus-addressing being a useful tool to determine where spam emails come from, it's a chore to keep refreshing the folders whenever I sign up to a new website.

                       Untitledemail filters
                      Thunderbird and Roundcube both don't automatically subscribe to new folders when accessing your email via IMAP.

                      What makes it worse is there is no option to disable this default behaviour. They've just proudly written down in the docs as a note under "Email subaddresses" in case you happen to stumble upon it.

                      image

                      The solution

                      In the docs there are notes about tweaking EXIM (which sounds like it could cause more trouble), but thankfully I managed to find a help page by Ngage Hosting UK which provided a fix for this. I'd take a guess it was a response to customers frequently complaining about not receiving emails...

                      • Go to your cPanel setup page
                      • Click on Mail > "User-Level Filtering"
                      • For each email address, click on "Manage Filters"
                      • Click "Create a New Filter"
                      • Give it a name (eg. "Sub-address to inbox")
                      • Set rule to be "To" > "matches regex" > you\+[a-z0-9]@yourdomain.com (replace "you" and "yourdomain.com" parts)
                      • Set action to be "Deliver to Folder"
                      • Click the browse button and select "Inbox"
                      • Save it and repeat for other email addresses

                      You'll also have to do this for every domain, so enjoy this tedious process!

                      Sources

                      Fix Windows 7 getting stuck on "Checking for updates...", high CPU usage or installing updates

                      So my friend's computer has had issues with getting updates since day 1. I didn't really know why, but at the time a lot of the responses online was to leave it running overnight and hope for the best.

                      Eventually, my computers became victim to the same issue. For months, Windows Update would get stuck on the "Checking for updates..." or hang when trying to download the updates.

                      windows updates chcekingwindows update scanning

                      It also pegs a CPU core to almost 100% usage (or 25% in quad cores and 50% in dual cores) under the process "svchost.exe" while it searches aimlessly, wasting valuable battery life and compute cycles on something that should be sitting quietly in the background.

                      Note: svchost.exe is used to host many services, but in my case after stopping the "Windows Update" service, the CPU spike stopped. If this isn't the case for you, then you have another problem.

                      I stumbled upon some information by chance which described the issues. Apparently there were some changes to Windows Updates which fixes these issues, but only made available through optional rollup patches.

                      1283775594667

                      Great logic there Microsoft. You've fix your updater but made it optional, so anyone who uses it has to go on a wild goose chase in order to get it working.

                      These rollup patches come in a form of rollup updates, which basically mean they're a monthly service pack.

                      Before you continue... Service Pack 1 is required!

                      Make sure you're on Windows 7 SP1!

                      Right click on "My Computer" and select Properties. That'll give you the service pack information under "Windows edition".

                      If you're not on SP1, go to Windows 7 and Windows Server 2008 R2 Service Pack 1 (KB976932), click download and select either:

                      • windows6.1-KB976932-X64.exe (64 bit)
                      • windows6.1-KB976932-X86.exe (32 bit)

                      And depending on how long your updater has been broken for, you'll also need the April 2015 service servicing stack update. For most people this shouldn't be a problem. Only download and install it the fix process complains.

                      The fix

                      • When it's done, disable the Windows Update service from running in the background. This will speed up installation of the update by a great amount.
                      • To disable it, find command prompt in the start menu, right click, run as administrator and paste in:

                      sc stop wuauserv

                      • Go to the Update for Windows 7 file and run it
                      • Click through the prompts and let it do its thing. After a while, it'll ask you to restart. Hope you've got some time because it takes a while!

                      DSC_1012

                      Stays on 13% for ages! Worst quality photo, no apologies.

                      • Once you're back into Windows, make sure that Windows Updates works by clicking on "Check for updates". It should work much faster (within a few minutes) like it used to!

                      imageAs you can see, this computer hasn't had a proper update since June...

                      • If it shows new updates available quickly then you should be on your way.
                      • Install the updates to test it out. Everything should be working perfectly now.

                      image

                      So now you should have gone from a computer which takes about 10 minutes to scan for updates to one that scans within a minute. And now the updates should actually work!

                      1461611048714

                      Sources

                      Android: Fix for YouTube "There was a problem while playing. Tap to retry" - Videos Stop Playing After a Few Days

                      This was an annoying issue plaguing me for the past year or so. I don't know exactly when it started happening or why, but there are numerous posts and issue trackers for it scattered around the internet without a solid fix.

                      The problem

                      The official YouTube app suddenly decides to stop working about 2 days after rebooting the phone. There's no real information available (as a user) to figure out what's wrong.

                      All it says is "There was an error while playing. Touch to Retry".

                      Oh but not to worry, you're still able to watch YouTube ads before the actual video itself.

                      http://i.imgur.com/y96imEp.png

                      For those more technically inclined, here's what the stack trace looks like when YouTube freaks the hell out:

                      Fixes that I've tried

                      Over the year, nothing I tried works aside from restarting the phone. That was the only thing that kept YouTube working, other than just watching it via the browser which bypasses the app altogether.

                      In case you've stumbled upon this guide while running into an entirely different issue, here are a few things that may get YouTube working again:

                      Clearing cache and data for YouTube didn't work
                      Uninstalling and reinstalling YouTube didn't work
                      Downgrading to an older version of YouTube didn't work - I went all the way back from v11 to v6
                      Removing current WiFi details and adding it back didn't work - some people believe this works
                      As mentioned above, restarting the phone works for about 2 days. You'll find it frustrating after putting up with an ad and it doesn't work again
                      Using a web browser to play the video Works consistently, but it's not as good as the app

                      The Solution!

                      Only until last week did I manage to find a new suggestion on XDA forums. I tried it out, gave it a few days and surprisingly it still works!

                      Unfortunately, it requires you to have root access to your Android device. I guess there's only so much you can do before you have to dig deeper to fix these sort of issues.

                      What you need to do is rename a few system files and restart the phone.

                      1. Open up a file explorer capable of browsing system folders. If your phone doesn't have one, I recommend FX File Explorer as it comes with root explorer mode.
                      2. Navigate your way to /system/etc/firmware/
                      3. Rename the following files to add ".bak":
                        tzwidevine.b00 tzwidevine.b00.bak
                        tzwidevine.b01 tzwidevine.b01.bak
                        tzwidevine.b02 tzwidevine.b02.bak
                        tzwidevine.b03 tzwidevine.b03.bak
                        tzwidevine.mdt tzwidevine.mdt.bak

                      4. Restart your phone.
                      5. Make YouTube great again! You shouldn't have any more issues with watching silly videos again after doing this.

                      Source

                      Video playback issue - Post #4

                      Sony Z5 Compact: Root without losing TA partition (DRM features) on Marshmallow

                      I've spent too long on Android without root access and it really bothers me. I need it!

                      1046
                      Feeling imprisoned by my own Android OS... I did not sign up for iOS!

                      Overview

                      • In order to back up the TA partition (where the DRM keys are stored) we need temporary root access via the iovyroot exploit, which is only available on a Lollipop build. This part is optional if you don't care about that functionality
                      • Once that's done, you can unlock the bootloader. Doing so wipes the TA partition.
                      • Upgrade to Marshmallow
                      • We then trick the kernel into thinking it's still locked, giving us both root access and access to DRM-locked features.
                      • Optionally, for completion we can also partially restore DRM keys from the TA backup.
                      • Having your TA backed up correctly prevents any issues if you want to keep your DRM features such as camera optimisations.

                      Before starting, make sure you have:

                      • enabled USB debugging via Developer mode
                      • backed everything up. It's going to get wiped!

                      Before starting

                      We have to make sure that this process is actually possible with your device.

                      • Open the dialler and enter *#*#7378423#*#* to access the service menu.
                      • Go to Service info > Configuration > Rooting Status
                      • If "Bootloader unlock allowed" says Yes, then you can continue with this tutorial.
                      • If it says No or if the status is missing, then your device cannot be unlocked. Good luck.

                      Note: If it says "allowed" it means you CAN unlock your device. It does NOT mean your device IS unlocked.

                      While we're here, make a note of your IMEI number. You'll need it later.

                      Screenshot_2016-04-16-17-47-40

                      Downloads

                      Downgrade to Lollipop

                      (Optional if you don't care about the DRM keys)

                      If you're already on Marshmallow, then I'm afraid you need to downgrade back to Lollipop (and in the process wipe everything). Make a backup using the Sony PC Companion before doing so.

                      • Download Flashtool and install it
                      • Download firmware (It's Aussie firmware, but we only need it for a short amount of time so it'll do) and put it into %USERPROFILE%\.flashTool\firmwares
                      • Start Flashtool
                      • Click on the lightning bolt icon
                      • Select "Flashmode"
                      • Select the Lollipop firmware (32.0.A.6.200) and select the wipe options APPS_LOG, DIAG and USERDATA. Otherwise things will crash a lot and you won't get into the phone properly. Trust me, I've tried.
                      • Turn off the phone.
                      • Wait for Flashtool to finish preparing the files.
                      • When prompted, hold "volume DOWN" button while plugging in the USB.
                      • Wait for it to finish. Don't trust the progress bar! Make sure it's finished by reading the text. It will tell you when to disconnect and restart.

                      Backing up the TA partitions

                      (Optional if you didn't bother downgrading to Lollipop)

                      Now that you're on Lollipop, you can use iovyroot. With this we can gain temporary root access and dump the TA partition to a file. This file is what we use to restore the DRM keys to your device after it's been wiped by unlocking the bootloader.

                      Extract iovyroot_v0.4.zip and run "tabackup.bat"

                      Once it's done, you should have a TA-####.img file which sorta looks like "TA-16042016.img" and is approximately 2mb in size. That's your TA backup done and dusted!

                      Keep it safe somewhere.

                      Unlocking your bootloader

                      • Go to Settings > Developer options
                      • Tick "Enable OEM unlock"
                      • Open up a browser on your computer and follow the instructions at Sony's developer website. You'll need to provide your email in order to continue. Mine got caught in junk mail so be sure to check that.
                      • After receiving your email, entering your IMEI number and accepting some user conditions will provide you with an unlock code.
                      • This is the point where I remind you again...

                      BACK UP WHAT YOU NEED NOW. There's no turning back after this!

                      • Turn off your phone.
                      • In Flashtool, click on "BLU"
                      • Hold "volume DOWN" on your phone and plug it into the computer.
                      • When prompted, release volume down and unplug.
                      • Hold volume UP and plug it back in.
                      • You should now get a dialog which lets you enter an unlock code.
                      • Paste in the unlock code and click "Unlock".
                      • Wait for the phone to finish doing it's thing and restart.
                      • Your phone is now wiped clean so you'll need to go through an initial setup again.
                      • Checking the service status again should now say "Bootloader unlocked: Yes".

                      Upgrading to Marshmallow

                      (optional if you're already on Marshmallow)

                      At this point you can either download the firmware I provided (if you're Australian) or download the right one for your region.

                      If you're not an awesome Australian, then you'll need to download your own firmware.

                      • Using FlashTool, click on the "XF" icon to launch "XperiFirm"
                      • This lets you search for firmware files for your device.
                      • Look for "Xperia Z5 Compact" and then your model. In my case E5823 (check your phone under Settings > About > Model)
                      • Select the region you want (Customised AU means generic unbranded firmware for Australia)
                      • Select the firmware on the right, shown as highlighted.
                      • Click download.

                      image

                      • Close the downloader when it's done unpacking.
                      • It will take some time to repackage the firmware files into an FTF file. This is what we use to re-flash your phone with stock firmware. It also contains the kernel file you need for the next part of the tutorial.
                      • Now turn off your phone.
                      • In Flashtool > Lightning bolt icon > Flashmode
                      • Select the Marshmallow upgrade (32.1.A.1.185)
                      • Wait for it to prepare the files.
                      • When prompted, hold volume DOWN on phone, plug it in.
                      • Wait until it's done. Restart and ensure the phone is working.

                      Rooting your Z5 Compact

                      Now for the main course. This is why you're here.

                      • Open your Marshmallow FTF file using Winrar or 7-zip and extract out "kernel.sin".
                      • In FlashTool > Tools > Sin Editor, open up "kernel.sin" and click "Extract"
                      • This will give you "kernel.elf"
                      • Extract the files from "rootkernel_v4.22_Windows_Linux.zip" into a folder without spaces (ie. not your desktop or program files)
                      • Copy "UPDATE-SuperSU-v2.65-####.zip" into the rootkernel folder and rename so it becomes "SuperSU-v2.65-####.zip"
                      • Open a command prompt to the rootkernel folder and type in "rootkernel kernel.elf kernel_patched.elf". This process deactivates SONY-RIC, removes DM-VERITY, adds TWRP bootloader as well as the DRM FIX.
                      • Ensure that the SuperSU service was added by scanning the output for "Adding service entry for SuperSU".
                      • If you come across this error, it means you did it on a Lollipop kernel.

                      - Found SuperSU-v2.65-20151226141550.zip
                        Adding service entry for SuperSU
                      source type fsck does not exist
                      Could not add rule for perm: dac_override
                      source type fsck does not exist
                      Could not add rule for perm: write
                      source type fsck does not exist
                      Could not add rule for perm: create

                      I don't know how to fix it, but I'm pretty sure the author of rootkernel isn't bothered to fix it either.

                      • Now that you have your patched kernel, it's time to flash it using Flashtool!
                      • Turn off your phone.
                      • Flashtool > Lightning bolt icon > Fastboot
                      • Now we've got a lot of options! Click "Select kernel to Flash"

                      image

                      • Hold the volume UP button and plug in your phone.
                      • When the Kernel Chooser dialog appears, click on the "*.sin" dropdown to change it to "*.elf", then select "kernel_patched.elf".

                      image

                      • It should finish pretty quickly with something like "Please check the log before rebooting into system".
                      • If everything went well, unplug and turn on your phone.
                      • The device should now have the SuperSU app installed.
                      • Checking unlock status should now say "Bootloader unlock allowed: Yes" again.
                      • Download and test Titanium Backup. You should be prompted to give root access on start.
                      • Turn your phone off completely and then on again to make sure root status persists.
                      • Now you can enjoy your... well, EVERYTHING!

                      Restoring the DRM keys

                      (optional, I guess?)

                      This is for the perfectionists and completionists. If you can't stand the thought of being at 99% and absolutely NEED to have that 100% completion then follow me.

                      • Copy your TA partition backup to the rootkernel folder.
                      • Open up a command prompt to the rootkernel folder and type in the following:

                      flash_dk TA-####.img restore-drm-keys.ftf

                      • The script will spit out a new file called "restore-drm-keys.ftf".
                      • Put this into "%USERPROFILE/.flashTool/firmwares/"
                      • In Flashtool, click on the lightning bolt icon
                      • Select flashmode
                      • Select "DeviceKey" and click Flash
                      • Hold "volume DOWN" and plug in USB cable.
                      • Unplug and restart phone when instructed (read the activity log)

                      This new restored TA partition should persist across device wipes and Android upgrades.

                      Well, that's the end of that! We sure showed Sony who's boss!

                      View post on imgur.com

                      Donations

                      Big props go to zxz0O0 for making the TA backup easy to use and tobias.waldvogel for the DRM restoration patch. I've linked to their donation pages so please donate for their amazing work.

                      If you thought this guide was helpful then please feel free to donate to me too! (link is on the right)

                      Sources

                      Git: Post-merge hook to detect when certain files have changed and display a notification

                      When certain files in a project change, the project needs to be rebuilt/restarted/recompiled. Using the following git hook, you can keep an eye out for changes in certain files then display a reminder message to perform an update or just make it run the command automatically.

                      It's just a simple bash script that's executed by git after a successful merge.

                      Use check_run() to run the script automatically, or check_warn() if you want it to only be noisy about it.

                      Store this in your_project/.git/hooks/ as "post-merge".

                      14QJ3Mv
                      Automate things. Less room for errors and mistakes.

                      How to safely downgrade your Old/New Nintendo 3DS to firmware 9.2.0-20

                      Assuming you're on firmware 9.3 to 10.3, then you can downgrade to 9.2 using the following method.

                      • Download starter.zip (aka the "homebrew starter kit")
                      • Download sysUpdater.zip
                      • Download 9.2.0-20X firmware for your console (Replace X with E for Europe, U for US and J for Japan)

                      I can't link you the firmware download links, but I can tell you how to find it.

                      • Google for "[MEGA] [CIA/BIN] MSET 4.X & 6.X backups, Browser backups, Update packs (All Regions)" with the quotation marks.
                      • Search for your console generation (3ds OLD or NEW)
                      • Then be VERY careful to download the right 9.2.0-20X firmware for your console.

                      You will risk bricking your console if you try to install the wrong firmware onto your console.

                      To double-check the download after it's done, verify the zip archive with an MD5 checker against the following checksums.

                      Region

                      N3DS

                      O3Ds

                      9.2.0-20E (Full)

                      MD5: 6dcca8fcbc9a28c82c2a4e5182f3acf8
                      SHA-1: e7c77bf205137167f1f1befa0c4db9d879a21a2e?

                      MD5: caec3e015bc065dd0ca512f219c8fc3c
                      SHA-1: 63f0e83892af0f43d159685b4d775e09360552e4?

                      9.2.0-20U (Full)

                      MD5: e5f40c3b155cfd12ef38be35d2e81d2e
                      SHA-1: 377c140377fb6cf31a0c032c4e1196cc521f87fe?

                      MD5: 879f437d7c78f09ae565f79f5aa9c421
                      SHA-1: ccc272c495a84aa49f8db2da6072a79a73053e19?

                      9.2.0-20J (Full)

                      MD5: f46677696ed4bf0e182de5a8168b7542
                      SHA-1: c9a1aaf4a4923fb5e065546da5c4a4da37aafdb2?

                      MD5: a7c14f50e553d99d93efd3a8dd4f8b9d
                      SHA-1: 422af53b07c270d65bf443d09736f3d1c540641c?

                      Setting up the 3DS for downgrade

                      Before starting, use a file hash checker to MAKE SURE THE FILE WAS DOWNLOADED CORRECTLY!

                      • Extract starter.zip to root folder of your sd card
                      • Extract sysUpdater app to "3ds/sysUpdater" folder of sd card
                      • Make a folder called "updates" on the root of the sd card
                      • Put all the firmware CIA files into the "updates" folder
                      • Safely remove sd card from computer
                      • Put it into the 3ds
                      • Turn it on
                      • Y8MAaYR

                      Installing Menuhax

                      Since all the files are already on the SD card and ready to go...

                      • Open up the 3DS browser and run browserhax by typing in http://yls8.mtheall.com/3dsbrowserhax_auto.php
                      • It'll flicker and take you into Homebrew Launcher.
                      • From there, select Menuhax installer
                      • Press A to install
                      • Restart when instructed
                      • Now that it's installed, turn off WiFi
                      • Turn off your 3DS
                      • Turn it on again, but hold L as it loads
                      • This should now start you directly into Homebrew Launcher without the need of browserhax

                      I've written this up in greater detail in a previous tutorial if you're still confused.

                      Downgrading your Old/New 3DS to 9.2

                      From homebrew launcher:

                      • Start up sysUpdater
                      • Press Y to downgrade. It takes a moment to response so give it about 10 seconds before giving up.
                      • Wait a few minutes for it to finish
                      • It will reboot itself
                      • If everything worked, you will now be on 9.2.0-20 (but you've lost your menuhax)
                      • When you're rebooted back into your 3DS, open up the browser
                      • Run and reinstall menuhax via browserhax at http://yls8.mtheall.com/3dsbrowserhax_auto.php
                      • Remember to turn off WIFI after it's all done

                      Problems you may encounter with sysUpdate

                      • opening sysUpdate gives a black screen
                      • sysUpdate turns on and shows text, but pressing Y or B does nothing

                      In these cases, I recommend trying:

                      Method A: Trying a new sd card

                      • Copy all the stuff from your SD card onto your computer
                      • Copy all the stuff from the computer to a new sd card made by a more reliable brand (Apparently Samsung works well)
                      • Try again with new card

                      Method B: Format the card to FAT32

                      • Copy all the stuff from your SD card onto your computer
                      • Format the card to FAT32 using Windows Explorer
                      • Copy all the stuff back
                      • Try again

                      Method C: Run FTBrony first

                      This one is a strange one but actually worked for me after the third attempt (and after formatting the SD card)

                      • Get into Homebrew Launcher
                      • Start FTBrony
                      • Spam the B button to exit immediately
                      • Spam the "Right" button on the d-pad to find sysUpdater
                      • Start it and hope to see text

                      Things to do now

                      If you've got a Gateway card, you'd be pleased to know that Gateway supports v9.2 so you can start using it again.

                      Much like installing sysUpdater, you'll need to load Gateway mode via Homebrew Loader

                      • Grab GW_ULTRA_3_6_2_BETA.zip from their website
                      • Extract the contents of GW_3dsx.zip to your SD card so you have X:\3ds\GW\
                      • Start Homebrew Loader
                      • Load up Gateway
                      • Sleep. I'll write up more stuff another day.

                      VYtJ9

                        Sources

                           
                          Copyright © Twig's Tech Tips
                          Theme by BloggerThemes & TopWPThemes Sponsored by iBlogtoBlog