10 янв. 2018 г.

How to write to NTFS USB drives on Mac OS X

Mac OS X by default can only read from attached USB drives with the NTFS file system. Here are the steps to enable read/write access:


Initial setup (only first time on a new Mac)

  1. Install Homebrew (and probably additional XCode tools)
  2. In Terminal: brew install caskroom/cask/osxfuse
  3. In Terminal: brew install ntfs-3g
  4. In Terminal: sudo mkdir -p /Volumes/NTFS

Each time when an NTFS USB drive is connected to the computer

  1. List disk partitions: diskutil list
  2. Find identifier of the partition with Windows_NTFS type (typically disk2s1 or disk3s1)
  3. Unmount found drive: sudo umount /dev/disk2s1
  4. Mount the drive with read/write access: sudo ntfs-3g /dev/disk2s1 /Volumes/NTFS -olocal -oallow_other
  5. The mounted drive should appear on the desktop, the file system should be mounted at /Volumes/NTFS.

The same steps in a shell script


sudo mkdir -p /Volumes/NTFS
DISK=`diskutil list | grep Windows_NTFS | sed -E "s/.+Windows_NTFS .+ GB +//"`
echo Mounting NTFS disk $DISK
sudo umount /dev/$DISK
sudo ntfs-3g /dev/$DISK /Volumes/NTFS -olocal -oallow_other

8 янв. 2018 г.

Proper transition: transform CSS for Android 4.4 browser, Chrome and Safari

Suppose you want CSS transitions for CSS "transform" property on mobile devices (Android 4.4 and above, iOS Safari 7 and above). You'd write

.example {
    transition: transform 1s ease;
}

But what about browser support for CSS 2D transforms and 3D transforms? They require "-webkit-" vendor prefix. No problem, you just add another line

.example {
    transition: -webkit-transform 1s ease;
    transition: transform 1s ease;
}

Stop. That won't work: the former rule is overridden by latter. OK, then combine them into one rule. Browsers should either ignore unknown transition property or use transition for both:

.example {
    transition: transform 1s ease, -webkit-transform 1s ease;
}

Surprise! Safari 7.X (and probably 8.X) doesn't comply to the specification and ignores the whole rule, not only the unknown "transform" property. The only way to write transition cross-browser is

.example {
    transition: -webkit-transform 1s ease;                    /* 1 */
    transition: transform 1s ease;                            /* 2 */
    transition: transform 1s ease, -webkit-transform 1s ease; /* 3 */
}

Let's analyze it with regard to intended browser support:

  • Safari 7.X and 8.X will accept rule 1 and ignore the rest because of unknown "transform" property. That's fine - they will use transition for the "-webkit-transform".
  • The same applies to WebKit-based browsers in Android 4.4
  • Chrome and Safari 9+ will accept rule 1, then override it with rule 2, then override it with rule 3. That's fine too - they will use transition for both prefixed and unprefixed transforms.
The easiest way to avoid such traps is to use Autoprefixer to automatically add vendor prefixes to CSS rules.

25 авг. 2017 г.

Emulate slow network connection on Mac OS X with Network Link Conditioner


  1. Open https://developer.apple.com/download/more/ (Downloads For Apple Developers)
  2. Find and download Additional Tools for Xcode 8.2 (or other Xcode version you use). Note that there is no need to download/install Xcode itself.
  3. Open Additional Tools - Hardware - double-click on Network Link Conditioner
  4. Agree to install it to Preferences
Available Network Profiles:
  • 100% Loss - drops all incoming and outgoing packets 
  • High Latency DNS - adds 3000 ms DNS delay 
  • Very Bad Network - 1 Mbps 500ms delay downlink, 1 Mbps 500 ms delay uplink, and 10% of incoming and outgoing packets are dropped
  • Edge - 240 Kpbs 400 ms delay downlink, 200 Kbps 440 ms delay uplink
  • 3G - 780 Kpbs 100 ms delay downlink, 330 Kbps 100 ms delay uplink
  • DSL - 2 Mbps 5ms delay downlink, 256 Kbps 5 ms delay uplink
  • LTE - 50 Mbps 50ms delay downlink, 10 Mbps 65 ms delay uplink
  • Wi-Fi - 40 Mbps 1ms delay downlink, 33 Mbps 1 ms delay uplink
  • Wi-Fi 802.11ac - 250 Mbps 1ms delay downlink, 100 Mbps 1 ms delay uplink
Also there is an option to create custom profiles.

15 авг. 2017 г.

EcmaScript support in Node

Interestingly enough, even 9.0.0 nightlies don't support ES2015 fully: it's missing tail call optimization, Array.prototype.values, and RegExp.prototype.flags.
http://node.green/ - ES2015 ES2016 ES2017 compatibility tables for Node.

List all the in progress features available on your Node release:
node --v8-options | grep "in progress"

List all dependencies and respective versions that ship with a specific Node binary:
node -p process.versions.v8
https://nodejs.org/en/docs/es6/

7 авг. 2017 г.

Get Pseudo-Element Properties with JavaScript

Assume your CSS looks like:

.element:before {
    content: 'NEW';
    color: rgb(255, 0, 0);
}

To retrieve the color property of the .element:before, you could use the following JavaScript:

var color = window
    .getComputedStyle(document.querySelector('.element'), ':before')
    .getPropertyValue('color')

Passing the pseudo-element as the second argument to window.getComputedStyle allows access to said pseudo-element styles


Mouse and keyboard support in Midnight Commander for Mac OS X

Somehow I broke mouse support in Midnight Commander while setting up a fresh Mac OS X. It took me the whole week to find the root cause and enable mouse in MC again. Here is the checklist:

  • Check that Mouse Reporting is enabled
    Terminal - Menu - View or Cmd+R hotkey
  • Find the value of TERM env variable
    echo $TERM in terminal or open Terminal Settings (Cmd+,), go to Profiles - look for Terminfo; it was set to xterm-256color in my case
  • Quit all Midnight Commander instances, if any
  • Edit ~/.config/mc/ini file, find corresponding terminal section, e.g. [xterm-256color] for my terminal, and remove all its entries
  • Start Midnight Commander
Keyboard support: to make Shift+Up and Shift+Down keys work in Midnight Commander, do the following:
  • Open Terminal Settings - Keyboard tab
  • Add Shift+Up - send text "\033[1;2A" (copy from Shift+Left and edit text)
  • Add Shift+Down - send text "\033[1;2B"