{ "version": "https://jsonfeed.org/version/1", "title": "Zeke Snider", "home_page_url": "https://zekesnider.com/", "feed_url": "https://zekesnider.com/feed.json", "description": "My personal website\n", "icon": "https://zekesnider.com/apple-touch-icon.png", "favicon": "https://zekesnider.com/favicon.ico", "expired": false, "items": [ { "id": "https://zekesnider.com/automatic-reference-counting-with-self/", "title": "Automatic Reference Counting with `self`", "summary": null, "content_text": "Recently, when working on Jared, I ran into an interesting memory leak. Jared is written nearly entirely in Swift, which uses ARC for memory allocation. As advertised, it usually “just works”. However in this case some of my callback code had unintended side effects.Jared contains the ability to load .bundle plugin files to add additional commands. These bundle contain a principle class which conforms to a protocol and is loaded dynamically at runtime. In this instance, I was experimenting with a bundle whose class started a HTTP web server using Telegraph.I originally noticed strange behavior because when reloading plugins. The application would crash upon reload, due to the server trying to re-bind the same port, even though I was stopping the server in the module’s deinit statement. Setting a breakpoint, the deinit was never called.After unloading the server module, I ran an experiment by mashing the reload plugins button repeatedly.Digging into Xcode’s Debug Memory graph, and filtering on filtering on leaked blocks, it’s clear that old copies of RoutingModules are sticking around in memory.Looking closer into the pertinent part of the memory graph:The route has a clear strong reference cycle between itself and an array, causing it to stick around. All modules do provide an array of routes. Narrowing down the pertinent code:var routes: [Route] = []init() { let reload = Route(name:\"/reload\", comparisons: [.startsWith: [\"/reload\"]], call: self.reload, description: localized(\"reloadDescription\")) routes = [reload]}func reload(_ message: Message) -> Void {}After some research, it was evident that the issue lied in the reference to a self method in the callback parameter. The purpose of the callback is to provide the routing module with the appropriate method to call when a triggering message is received. It is not meant to live beyond the memory scope of the containing class. However, because it was a strong self reference, it was causing any module to never be deallocated. The class contained a list of elements that depend on itself, so as far as ARC is concerned, the resource never reached a zero reference count.This behavior is explicitly called out in the Swift documentation: A strong reference cycle can also occur if you assign a closure to a property of a class instance, and the body of that closure captures the instance. This capture might occur because the closure’s body accesses a property of the instance, such as self.someProperty, or because the closure calls a method on the instance, such as self.someMethod(). In either case, these accesses cause the closure to “capture” self, creating a strong reference cycle.As a simple solution, I simply provided the callback as a weak self reference instead:let reload = Route(name:\"/reload\", comparisons: [.startsWith: [\"/reload\"]], call: {[weak self] in self?.reload($0)}, description: localized(\"reloadDescription\"))The weak reference allows you to reference self, without keeping a strong hold on it. This prevents a strong reference cycle, and allows my Module classes to be deallocated appropriately. After changing to a weak self reference in all Routes, the issue resolved itself, and I’m free to mash that reload button without incurring a memory leak. Thus solving a long lived bug in my application.tl;dr: You should be very careful when using self in callbacks. It is very likely that you should use a reference to weak self instead of a strong reference.", "content_html": "
Recently, when working on Jared, I ran into an interesting memory leak. Jared is written nearly entirely in Swift, which uses ARC for memory allocation. As advertised, it usually “just works”. However in this case some of my callback code had unintended side effects.
Jared contains the ability to load .bundle
plugin files to add additional commands. These bundle contain a principle class which conforms to a protocol and is loaded dynamically at runtime. In this instance, I was experimenting with a bundle whose class started a HTTP web server using Telegraph.
I originally noticed strange behavior because when reloading plugins. The application would crash upon reload, due to the server trying to re-bind the same port, even though I was stopping the server in the module’s deinit
statement. Setting a breakpoint, the deinit was never called.
After unloading the server module, I ran an experiment by mashing the reload plugins button repeatedly.
Digging into Xcode’s Debug Memory graph, and filtering on filtering on leaked blocks, it’s clear that old copies of RoutingModules are sticking around in memory.
Looking closer into the pertinent part of the memory graph:
The route has a clear strong reference cycle between itself and an array, causing it to stick around. All modules do provide an array of routes. Narrowing down the pertinent code:
After some research, it was evident that the issue lied in the reference to a self
method in the callback parameter. The purpose of the callback is to provide the routing module with the appropriate method to call when a triggering message is received. It is not meant to live beyond the memory scope of the containing class. However, because it was a strong self
reference, it was causing any module to never be deallocated. The class contained a list of elements that depend on itself, so as far as ARC is concerned, the resource never reached a zero reference count.
This behavior is explicitly called out in the Swift documentation:
A strong reference cycle can also occur if you assign a closure to a property of a class instance, and the body of that closure captures the instance. This capture might occur because the closure’s body accesses a property of the instance, such as self.someProperty, or because the closure calls a method on the instance, such as self.someMethod(). In either case, these accesses cause the closure to “capture” self, creating a strong reference cycle.
As a simple solution, I simply provided the callback as a weak
self reference instead:
The weak
reference allows you to reference self, without keeping a strong hold on it. This prevents a strong reference cycle, and allows my Module
classes to be deallocated appropriately. After changing to a weak self reference in all Routes, the issue resolved itself, and I’m free to mash that reload button without incurring a memory leak. Thus solving a long lived bug in my application.
tl;dr: You should be very careful when using self
in callbacks. It is very likely that you should use a reference to weak self
instead of a strong reference.
This is the stuff that I enjoyed the most since 2010.
Melodrama - Lorde
1989 - Taylor Swift
E•MO•TION - Carly Rae Jepsen
Norman Fucking Rockwell - Lana Del Rey
Pure Heroine - Lorde
Gone Now - Bleachers
Ghost Stories - Coldplay
Ultraviolence - Lana Del Rey
Every Open Eye - Chvrches
Days Are Gone - HAIM
How Big, How Blue, How beautiful - Florence and the Machine
Nothing’s Real - Shura
BADLANDS - Halsey
Persona 4 Golden
The Last of Us
Persona 5
Shin Megami Tensei IV
Tetris 99 / Tetris Effect
The last episode aired in 2010 so it counts
", "url": "https://zekesnider.com/best-of-the-decade/", "image": "the-greatest.jpg", "date_published": "2020-01-01T02:15:40+00:00", "date_modified": "2020-01-01T02:15:40+00:00", "author": "" }, { "id": "https://zekesnider.com/homekit-servo-blinds/", "title": "Homekit Servo Blinds", "summary": null, "content_text": "I have little experience with hardware, but had a goal that I wanted to retrofit my completely manually operated blinds so that I could control them via HomeKit. This post is about how I accomplished exactly that! The final solution is controllable down to a percentage via siri and the home app.Best thing I’ve done all year. #HomeKit #homebridge pic.twitter.com/4uWfUkBkt0— Zeke (@ZekeSnider) April 18, 2019The Equipment Raspberry Pi 3 Alternatively, you can use a Raspberry Pi Zero with a headboard soldered on (or solder directly) 360° servo Make sure you get a 360° servo. Jumper wires Screwdriver extension This one is overkill for this use case, but I figure they’d be useful to have anyway. Command strip Wand grip Note: I haven’t tested this one specifically because my blind already had a grip. I ordered a few of these and am planning on testing them with my other blinds. (Note: the amazon links are affiliate links.)The hardware\t \tThe original blindsThe specifics will obviously differ based on what type of blinds you have. My blinds are twist blinds, which conveniently have a removable grip on the bottom of the rod, with has a hole on the bottom. I noticed this, and thought it would be perfect for screwing to a servo.screwing into the servoYou’ll need a screwdriver extension to properly screw into the servo through the grip. My extension was overkill on length, but got the job done.now how to attach to the wallI attached the grip back onto the blind rod, and we’re almost good to go. Except I needed to attach it to the wall, and still have the flexibility to remove it in case I need to manually slide the blinds. I’m also renting this apartment so I didn’t want a permanent solution like screwing into the wall.modern problems require modern solutionsCommand strips were a good solution for me. I’m sure this is super amateur hour, but it worked for my use case.servo attached to wallI then plugged in my raspberry pi to the wall (running raspbian), and wired up the servo to the pi using the wiring guide here.The softwareBecause my ultimate goal was to connect to homekit, I installed homebridge, and set it up to run in the background. Then I stumbled upon the homebridge-minimal-http-blinds plugin, which allowed me to bind a blinds accessory to an http server. So then I set out to write a server that exposed the correct endpoints.I ended up writing it in Node, and using pigpio to control the servo. You can see (and use) the source here. The nice thing about this solution is it allowed me to implement percentage based setting of the blinds.The server’s implementation also includes rubber-banding on request. So for example, if the blinds are at 0%, you request 100% then request 20% after they reach 50%, they will immediately turn back. Newest request takes priority, and it checks which direction it should be turning on every iteration of the control loop.After much tinkering via HTTP requests to determine the correct config parameters, I arrived at a final set of values. Then I setup my application to run persistently using systemd, and updated my homebridge config file to point at the new accessory. Afterwards it was all good to go.I’m very happy with my final product and am currently working on implementing on the other blinds in my apartment!", "content_html": "I have little experience with hardware, but had a goal that I wanted to retrofit my completely manually operated blinds so that I could control them via HomeKit. This post is about how I accomplished exactly that! The final solution is controllable down to a percentage via siri and the home app.
Best thing I’ve done all year. #HomeKit #homebridge pic.twitter.com/4uWfUkBkt0
— Zeke (@ZekeSnider) April 18, 2019
(Note: the amazon links are affiliate links.)
The specifics will obviously differ based on what type of blinds you have. My blinds are twist blinds, which conveniently have a removable grip on the bottom of the rod, with has a hole on the bottom. I noticed this, and thought it would be perfect for screwing to a servo.
You’ll need a screwdriver extension to properly screw into the servo through the grip. My extension was overkill on length, but got the job done.
I attached the grip back onto the blind rod, and we’re almost good to go. Except I needed to attach it to the wall, and still have the flexibility to remove it in case I need to manually slide the blinds. I’m also renting this apartment so I didn’t want a permanent solution like screwing into the wall.
Command strips were a good solution for me. I’m sure this is super amateur hour, but it worked for my use case.
I then plugged in my raspberry pi to the wall (running raspbian), and wired up the servo to the pi using the wiring guide here.
Because my ultimate goal was to connect to homekit, I installed homebridge, and set it up to run in the background. Then I stumbled upon the homebridge-minimal-http-blinds plugin, which allowed me to bind a blinds accessory to an http server. So then I set out to write a server that exposed the correct endpoints.
I ended up writing it in Node, and using pigpio to control the servo. You can see (and use) the source here. The nice thing about this solution is it allowed me to implement percentage based setting of the blinds.
The server’s implementation also includes rubber-banding on request. So for example, if the blinds are at 0%, you request 100% then request 20% after they reach 50%, they will immediately turn back. Newest request takes priority, and it checks which direction it should be turning on every iteration of the control loop.
After much tinkering via HTTP requests to determine the correct config parameters, I arrived at a final set of values. Then I setup my application to run persistently using systemd, and updated my homebridge config file to point at the new accessory. Afterwards it was all good to go.
I’m very happy with my final product and am currently working on implementing on the other blinds in my apartment!
", "url": "https://zekesnider.com/homekit-servo-blinds/", "image": "blinds.png", "date_published": "2019-04-21T19:15:40+00:00", "date_modified": "2019-04-21T19:15:40+00:00", "author": "" }, { "id": "https://zekesnider.com/running-homebridge-in-background/", "title": "How to run homebridge in the background", "summary": null, "content_text": "A no BS guide to running homebridge in the background on a unix system (requires systemd). Works 70% of the time every time.Add user to run homebridge undersudo useradd --system homebridgeCreate directory for itsudo mkdir /var/lib/homebridgeOwn the directory permissionssudo chown -R homebridge:homebridge /var/lib/homebridge sudo chmod 777 -R /var/lib/homebridgeCopy your home directory’s config (if you don’t have one already, edit it instead)sudo cp ~/.homebridge/config.json /var/lib/homebridge/config.jsonCopy your home directory’s persist directory (if it exists)sudo cp -R ~/.homebridge/persist /var/lib/homebridge/persistDetermine where homebridge is aliasedwhich homebridgeEdit the systemd servicesudo nano /etc/systemd/system/homebridge.servicePaste in the contents of homebridge.service from here. Make sure to replace /usr/local/bin/homebridge with where homebridge is actually installed.Exit nanocontrol + x, Ysudo nano /etc/default/homebridge Paste in the contents of homebridge from here.Reload systemd configssudo systemctl daemon-reloadEnable and start the servicesudo systemctl enable homebridgesudo systemctl start homebridgeCheck on its statussudo systemctl status homebridgeIf something is wrong, check the logs.journalctl -u homebridgeAt this point if there are any issues, live vicariously via google and stackoverflow.🏝", "content_html": "A no BS guide to running homebridge in the background on a unix system (requires systemd). Works 70% of the time every time.
Add user to run homebridge undersudo useradd --system homebridge
Create directory for itsudo mkdir /var/lib/homebridge
Own the directory permissionssudo chown -R homebridge:homebridge /var/lib/homebridge
sudo chmod 777 -R /var/lib/homebridge
Copy your home directory’s config (if you don’t have one already, edit it instead)sudo cp ~/.homebridge/config.json /var/lib/homebridge/config.json
Copy your home directory’s persist directory (if it exists)sudo cp -R ~/.homebridge/persist /var/lib/homebridge/persist
Determine where homebridge is aliasedwhich homebridge
Edit the systemd servicesudo nano /etc/systemd/system/homebridge.service
Paste in the contents of homebridge.service
from here. Make sure to replace /usr/local/bin/homebridge
with where homebridge is actually installed.
Exit nanocontrol + x, Y
sudo nano /etc/default/homebridge
Paste in the contents of homebridge
from here.
Reload systemd configssudo systemctl daemon-reload
Enable and start the servicesudo systemctl enable homebridge
sudo systemctl start homebridge
Check on its statussudo systemctl status homebridge
If something is wrong, check the logs.journalctl -u homebridge
At this point if there are any issues, live vicariously via google and stackoverflow.
🏝
", "url": "https://zekesnider.com/running-homebridge-in-background/", "date_published": "2019-04-20T19:15:40+00:00", "date_modified": "2019-04-20T19:15:40+00:00", "author": "" }, { "id": "https://zekesnider.com/the-making-of-jared/", "title": "The Making of Jared", "summary": null, "content_text": "I’ve realized that I’ve never written about my side project Jared here, and its background, so I figured now is a good time.BackgroundFor the uninitiated, iMessage is Apple’s messaging platform that is only available on Apple devices. If you text another iPhone user from an iPhone, the bubble will be blue (sent via iMessage).Apple has tried to lock down iMessage as much as possible, and there is no public API for common chat bot hooks. As far as I know, I was the first to attempt to write any sort of chat bot for iMessage. Because of how obtuse it is, I assume most would rather write for a platform that actually encourages development of bots, but I was in it for the challenge! iMessage is my favorite messaging service, and I wanted to build on it.There are only a few hooks available to iMessage: ❌ iMessage Apps (introduced in iOS 10). These provide very limited hooks that would not provide a chat bot like is implemented in Jared. All input would need to be in the context of the message extension, as these apps cannot read messages, names, or any personal information. They also can only send messages with the user’s explicit consent. ❌ Siri Shortcuts (introduced in iOS 12). Shortcuts have interesting potential, but they are also limited. They can only be triggered manually, and user consent is needed to send messages with images. They cannot read conversation history. ✅ AppleScript support via Messages.app for the Mac. The Messages.app on the Mac has existed before the introduction of iMessage. It originally only supported AIM, Google Talk, and Jabber accounts. It was just Apple’s instant messenger client. Of course it has evolved and now only supports iMessage, but the base code base has remained the same. For that reason (I’m assuming), it still (had) full AppleScript support.AppleScript is basically a local RPC framework for automating actions on the Mac. Its syntax is very… strange (English like)? It’s not so much an elegant programming language, but it is good for its use as an automation language. There is also a technology called JXA which allows you to use AppleScript actions from JavaScript instead, but it is not very well documented and I haven’t spent much time with it. But I think all the AppleScript in this project could be replaced with JXA.For my purposes, two pieces of functionality were key in the Message App’s AppleScript dictionary:Message HandlerThis is triggered when a message is received. It provides the content of the message as well information on the sender. From then we can do routing on it, and if needed…Send ActionSend a message to a specified recipient. This even supports attachments, and sending to group chats making it extremely useful to me. These two pieces were all I need to implement my chat bot.The first implementationv1The first take (which I have not open sourced because of how sloppy it is), was functional but not elegant. Everything was implemented in one AppleScript handler file. It did not call into any other languages or frameworks.InstallationBecause everything is in one file, it became quite bloated quickly. In addition, AppleScript syntax is very verbose and not well catered towards writing scalable software. It was really intended for small macro automations. Single threaded - Whenever the handler is processing a message, it is unable to handle new incoming messages. This caused messages to not get handled if they were routed at the same time, and errors to assert causing the whole system to stop functioning until it was manually restarted. Errors - If any error was thrown and not caught, it could cause an error dialog to pop, which shut the whole thing down as mentioned. These errors could be timeouts (spending more than 60 seconds processing), or just inconsistent system errors. As such, I devised a method that would automatically dismiss any error alerts, but this was not 100% effective either. Limited Scope - AppleScript as a language is limiting as it lacks many standard language functionality and frameworks. I was able to cut some corners by using some AppleScript helper apps that exposed things like REST calls, but this was obtuse and didn’t work for all the features that I wanted to implement.And thus brought v2, a full rewrite…The better implementationv2This (current) version uses a native app written in Swift that exposes an AppleScript interface. The Applescript handler in messages is very simple and just passes data to the Swift app. This solves several issues of the initial implementation. Multi-threading - All incoming requests on the Swift side are put in a background thread via a GCD Dispatch queue. This allows processing to take as long as needed for each message, and allows for other things such as sending delays. Frameworks - Swift is a well supported, native language. You’ll be able to find libraries (built in or not) for most things, and it allows for interop with C and Obj C, among other languages. Plugins - The original version had all routing in one AppleScript file, which became difficult to maintain after adding many commands. The Swift version added a plugin framework with a rules engine for routing. Additional commands could be added just by building them into a plugin module and placing them in a plugin directory. The plugins are loaded in via NSBundle modularization. UI - Because it is running as an app, Jared can now provide a cocoa UI for enabling/disabling the service, as well as configuration options.The new UIThese improvements allowed for much more flexibility. Many bottlenecks were removed, and it also allowed for adding things like database persistence for various state parameters, background processing jobs for scheduling, etc.A simple send script is called for sending outgoing messages. It is called by making an osascript shell call from Swift.This solution was great, until Apple made a change in macOS High Sierra 10.13.4.Wait where’d it go.. 🤔🤔🤔They removed the option to specify an AppleScript handler in Messages.app. I would like to think I caused this, but more realistically an engineer at Apple probably discovered this menu option one day and asked why the functionality exists at all.The message send action still exists, but now there is no way to receive the hooks for incoming messages, which brings us back a few steps.Working around AppleThird time’s the charmIn ~/Library/Messages there is a messages.db SQLite database that contains the contents of all message history. It gets updated when new messages are received/sent. Suprisingly, it is a standard SQLite database, and it is not encrypted. So, as a workaround to the AppleScript handler, we can instead query the database on a set interval (5s)? For all new records since the last query. This will allow us to batch process all new messages received.In addition, there are lots of fields in the database that are available in the database, that were not available via AppleScript, such as read receipts, and more. Although it will be difficult/impossible to query on changes to fields that do not trigger update of a date field.This solution works around the removal of the AppleScript handler preference, while still keeping most of the codebase the same.This is not fully implemented yet, as I’ve been working on it on a branch which hasn’t been merged yet. Progress can be tracked on this issue. Credit to Github user mezeipetister for the idea of repeatedly querying the database. Unfortunately I’ve neglected this project too much, but I hope to complete this fix in the near future, so that we can get Jared working on Mojave 😀. I will likely write another update post once that is done.PS: Private FrameworksYou may ask, isn’t there some private API call you can use to bypass AppleScript for sending messages. Well, there is in theory, but I haven’t been able to get any of them to work properly (read: at all). I’ve used class-dump to retrieve header files, and tried to use methods of the Messages private framework, but haven’t had any luck.This is something I should probably spend some more time on, but it’s pretty tedious and unsatisfying. A hundred different things could be preventing the method calls from working, but because it’s a private API, it’s very difficult to diagnose it. If anyone has anyone to share on this, please let me know!So there you have it, the complete story of Jared thus far. If you want to try it out, check it out on GitHub and give it a star. Hit me up by Twitter or email if you have any questions!", "content_html": "I’ve realized that I’ve never written about my side project Jared here, and its background, so I figured now is a good time.
For the uninitiated, iMessage is Apple’s messaging platform that is only available on Apple devices. If you text another iPhone user from an iPhone, the bubble will be blue (sent via iMessage).
Apple has tried to lock down iMessage as much as possible, and there is no public API for common chat bot hooks. As far as I know, I was the first to attempt to write any sort of chat bot for iMessage. Because of how obtuse it is, I assume most would rather write for a platform that actually encourages development of bots, but I was in it for the challenge! iMessage is my favorite messaging service, and I wanted to build on it.
There are only a few hooks available to iMessage:
❌ iMessage Apps (introduced in iOS 10). These provide very limited hooks that would not provide a chat bot like is implemented in Jared. All input would need to be in the context of the message extension, as these apps cannot read messages, names, or any personal information. They also can only send messages with the user’s explicit consent.
❌ Siri Shortcuts (introduced in iOS 12). Shortcuts have interesting potential, but they are also limited. They can only be triggered manually, and user consent is needed to send messages with images. They cannot read conversation history.
✅ AppleScript support via Messages.app for the Mac.
The Messages.app on the Mac has existed before the introduction of iMessage. It originally only supported AIM, Google Talk, and Jabber accounts. It was just Apple’s instant messenger client. Of course it has evolved and now only supports iMessage, but the base code base has remained the same. For that reason (I’m assuming), it still (had) full AppleScript support.
AppleScript is basically a local RPC framework for automating actions on the Mac. Its syntax is very… strange (English like)? It’s not so much an elegant programming language, but it is good for its use as an automation language. There is also a technology called JXA which allows you to use AppleScript actions from JavaScript instead, but it is not very well documented and I haven’t spent much time with it. But I think all the AppleScript in this project could be replaced with JXA.
For my purposes, two pieces of functionality were key in the Message App’s AppleScript dictionary:
This is triggered when a message is received. It provides the content of the message as well information on the sender. From then we can do routing on it, and if needed…
Send a message to a specified recipient. This even supports attachments, and sending to group chats making it extremely useful to me. These two pieces were all I need to implement my chat bot.
The first take (which I have not open sourced because of how sloppy it is), was functional but not elegant. Everything was implemented in one AppleScript handler file. It did not call into any other languages or frameworks.
Because everything is in one file, it became quite bloated quickly. In addition, AppleScript syntax is very verbose and not well catered towards writing scalable software. It was really intended for small macro automations.
And thus brought v2, a full rewrite…
This (current) version uses a native app written in Swift that exposes an AppleScript interface. The Applescript handler in messages is very simple and just passes data to the Swift app. This solves several issues of the initial implementation.
These improvements allowed for much more flexibility. Many bottlenecks were removed, and it also allowed for adding things like database persistence for various state parameters, background processing jobs for scheduling, etc.
A simple send script is called for sending outgoing messages. It is called by making an osascript shell call from Swift.
This solution was great, until Apple made a change in macOS High Sierra 10.13.4.
They removed the option to specify an AppleScript handler in Messages.app. I would like to think I caused this, but more realistically an engineer at Apple probably discovered this menu option one day and asked why the functionality exists at all.
The message send action still exists, but now there is no way to receive the hooks for incoming messages, which brings us back a few steps.
In ~/Library/Messages
there is a messages.db SQLite database that contains the contents of all message history. It gets updated when new messages are received/sent. Suprisingly, it is a standard SQLite database, and it is not encrypted. So, as a workaround to the AppleScript handler, we can instead query the database on a set interval (5s)? For all new records since the last query. This will allow us to batch process all new messages received.
In addition, there are lots of fields in the database that are available in the database, that were not available via AppleScript, such as read receipts, and more. Although it will be difficult/impossible to query on changes to fields that do not trigger update of a date field.
This solution works around the removal of the AppleScript handler preference, while still keeping most of the codebase the same.
This is not fully implemented yet, as I’ve been working on it on a branch which hasn’t been merged yet. Progress can be tracked on this issue. Credit to Github user mezeipetister for the idea of repeatedly querying the database. Unfortunately I’ve neglected this project too much, but I hope to complete this fix in the near future, so that we can get Jared working on Mojave 😀. I will likely write another update post once that is done.
You may ask, isn’t there some private API call you can use to bypass AppleScript for sending messages. Well, there is in theory, but I haven’t been able to get any of them to work properly (read: at all). I’ve used class-dump to retrieve header files, and tried to use methods of the Messages private framework, but haven’t had any luck.
This is something I should probably spend some more time on, but it’s pretty tedious and unsatisfying. A hundred different things could be preventing the method calls from working, but because it’s a private API, it’s very difficult to diagnose it. If anyone has anyone to share on this, please let me know!
So there you have it, the complete story of Jared thus far. If you want to try it out, check it out on GitHub and give it a star. Hit me up by Twitter or email if you have any questions!
", "url": "https://zekesnider.com/the-making-of-jared/", "image": "jared.png", "date_published": "2018-11-21T05:15:40+00:00", "date_modified": "2018-11-21T05:15:40+00:00", "author": "" }, { "id": "https://zekesnider.com/a-blog-post/", "title": "A Blog Post", "summary": null, "content_text": "It’s been 364 days since my last post, so I’m getting right in under that 1 year mark so that I can still declare that my blog is regularly updated. Here are some boring random tidbits that somehow constitute a blog post.Also, I am hereby committing to posting a technical blog post about the status of Jared within the next week!! Once you start using a clipboard manager on your computer and adapt your work-flow around it, you can never go back. You can un-subscribe from junk mail by paying $2 for a 10 year membership at the Direct Marketing Association (DMA). You can also un-subcribe from credit card offers in the mail. (More info from the FTC here). If you live in California it’s worth investing in some N95 masks. If you post really long ridiculous captions on Instagram of a product and tag it with #ad, everyone will believe you’ve been sponsored by Coke (even though you have like 50 followers) and ask you about it the next time they see you. I’ll soon (maybe) finally get CarPlay in my car. This will be a truly incredible day 2 years in the making. I don’t even know what else in life I’m waiting for at that point. I’ve been made aware that a HomeKit supported essential oil diffuser is available, and this is so ridiculous that I might just need to own one. There are many trade offs to using Sublime vs a full featured IDE and I don’t think I’ll ever be fully happy with either. Dark Mode on Mojave is nice. Not having to use Windows ever ever is a great blessing that I will never take for granted. Not having to use Windows APIs is an even bigger blessing. 👏👏 House Majority Leader Nancy Pelosi 👏👏 ", "content_html": "It’s been 364 days since my last post, so I’m getting right in under that 1 year mark so that I can still declare that my blog is regularly updated. Here are some boring random tidbits that somehow constitute a blog post.
Also, I am hereby committing to posting a technical blog post about the status of Jared within the next week!!
Once you start using a clipboard manager on your computer and adapt your work-flow around it, you can never go back.
You can un-subscribe from junk mail by paying $2 for a 10 year membership at the Direct Marketing Association (DMA). You can also un-subcribe from credit card offers in the mail. (More info from the FTC here).
If you live in California it’s worth investing in some N95 masks.
If you post really long ridiculous captions on Instagram of a product and tag it with #ad, everyone will believe you’ve been sponsored by Coke (even though you have like 50 followers) and ask you about it the next time they see you.
I’ll soon (maybe) finally get CarPlay in my car. This will be a truly incredible day 2 years in the making. I don’t even know what else in life I’m waiting for at that point.
I’ve been made aware that a HomeKit supported essential oil diffuser is available, and this is so ridiculous that I might just need to own one.
There are many trade offs to using Sublime vs a full featured IDE and I don’t think I’ll ever be fully happy with either.
Dark Mode on Mojave is nice.
Not having to use Windows ever ever is a great blessing that I will never take for granted. Not having to use Windows APIs is an even bigger blessing.
👏👏 House Majority Leader Nancy Pelosi 👏👏
I’ve been thinking about this a lot since their amazing Seattle show, so I made a playlist of my favorite Coldplay songs.
Check it out:
", "url": "https://zekesnider.com/coldplay-favorites/", "image": "coldplayOG.jpg", "date_published": "2017-10-03T05:15:40+00:00", "date_modified": "2017-10-03T05:15:40+00:00", "author": "" }, { "id": "https://zekesnider.com/favorite-ios-apps/", "title": "My Favorite iOS Apps", "summary": null, "content_text": "Here’s my highly anticipated list of favorite iOS apps. A follow up to my favorite Mac apps.1PasswordMy favorite password manager is excellent on iOS. A must have for me.OvercastOvercast is by far my favorite podcast app on iOS. According to the settings panel, Overcast’s smart speed feature has saved me 55 hours of listening time. The app is very nicely designed, features smart speed & voice boost, and has a robust sync service backing it. If you are using another podcast app, I highly recommend giving Overcast a try.TweetbotTweetbot is a beautifully designed third party twitter client. The default twitter app is gross, I only use it to access polls or other features which Tweetbot is unable to add due to lack of API support from Twitter.InstagramPerhaps this goes without saying, but I really enjoy using Instagram.AutomaticI have an automatic dingus in my car, and the app is great at letting me view past routes, and interesting statistics and such.PCalcIf you’re looking for a more advanced calculator than the system default (or you need an iPad calculator), PCalc is excellent. It is feature rich and is frequently updated with any new features added to the OS.LyftThe better ride sharing app. (Uber is a terrible company)CashThe fastest and easiest way to send money to friends or family. We’re done using those other apps.Dark SkyUp to the minute weather notifications that really work. Getting a notification on your wrist when rain is about to arrive is often very useful. The app also provides more detailed weather info than available in the default weather app. I still use the default app as well, but Dark Sky is a great backup.WorkflowThe best way to automate common tasks on iOS. A really powerful tool. So good it got bought out by Apple. My favorite workflow: one that quick-plays Melodrama by Lorde.MidoriMy favorite Japanese dictionary on iOS.Day OneDay One is how I journal. I’ve written in detail about it in my Mac Apps post, and the iOS app has feature parity. It’s delightful.Stack ExchangeI enjoy browsing stack exchange sites, and the app is surprisingly native and feature rich. Recommended if you’re a frequent visitor to any stack exchange sites.The Washington PostMy favorite news site has a solid iOS app. I prefer scrolling through in the WaPo app instead of Apple’s News app because of how nicely it is laid out.", "content_html": "Here’s my highly anticipated list of favorite iOS apps. A follow up to my favorite Mac apps.
My favorite password manager is excellent on iOS. A must have for me.
Overcast is by far my favorite podcast app on iOS. According to the settings panel, Overcast’s smart speed feature has saved me 55 hours of listening time. The app is very nicely designed, features smart speed & voice boost, and has a robust sync service backing it. If you are using another podcast app, I highly recommend giving Overcast a try.
Tweetbot is a beautifully designed third party twitter client. The default twitter app is gross, I only use it to access polls or other features which Tweetbot is unable to add due to lack of API support from Twitter.
Perhaps this goes without saying, but I really enjoy using Instagram.
I have an automatic dingus in my car, and the app is great at letting me view past routes, and interesting statistics and such.
If you’re looking for a more advanced calculator than the system default (or you need an iPad calculator), PCalc is excellent. It is feature rich and is frequently updated with any new features added to the OS.
The better ride sharing app. (Uber is a terrible company)
The fastest and easiest way to send money to friends or family. We’re done using those other apps.
Up to the minute weather notifications that really work. Getting a notification on your wrist when rain is about to arrive is often very useful. The app also provides more detailed weather info than available in the default weather app. I still use the default app as well, but Dark Sky is a great backup.
The best way to automate common tasks on iOS. A really powerful tool. So good it got bought out by Apple. My favorite workflow: one that quick-plays Melodrama by Lorde.
My favorite Japanese dictionary on iOS.
Day One is how I journal. I’ve written in detail about it in my Mac Apps post, and the iOS app has feature parity. It’s delightful.
I enjoy browsing stack exchange sites, and the app is surprisingly native and feature rich. Recommended if you’re a frequent visitor to any stack exchange sites.
My favorite news site has a solid iOS app. I prefer scrolling through in the WaPo app instead of Apple’s News app because of how nicely it is laid out.
", "url": "https://zekesnider.com/favorite-ios-apps/", "image": "iOS.jpeg", "date_published": "2017-10-03T04:15:40+00:00", "date_modified": "2017-10-03T04:15:40+00:00", "author": "" }, { "id": "https://zekesnider.com/favorite-mac-apps/", "title": "My Favorite Mac Apps", "summary": null, "content_text": "Here’s a list of my favorite (third party) Mac apps.1Password1Password is a must app for anybody, in my opinion. It is an easy to use and well designed application that makes it super easy to manage unique passwords for all of your online accounts. It autofills in all browsers, and stores everything else important in your life like Pin codes, credit card numbers, etc. It also supports 2 factor auth codes. It’s a lifeline for me. And it syncs easily between all my devices. 5/5.Day OneTerrific journaling App. Makes it easy to log your life, and syncs with the iOS and watchOS apps as well. Really well designed, and makes it easy to get writing, format it how you like, and attach images or locations. I think journaling is really important, and Day One fills an important need. There are pros and cons to digital journling, but a few things I like: Easy tagging / searching.It’s so easy to find old posts by tags, locations, date, etc. Much easier than searching through physical pages. It’s also fun to look at the different views such as the map with all your journal posts. Password protectionYou can use a passcode (or TouchID) to secure your journal. That way nobody, even with physical access can access my journal. And with end to end encryption, even if Day One servers are hacked, my data is safe. Since my journal contains my most personal thoughts, this is very important. BackupThere are backups of my journal on Day One’s server, as well as my iCloud backup, Time Machine, Backblaze, etc. There’s little risk of me losing my journal with so many replications of it. With a physical journal, there’s only one. ConvienienceI can type out an entry whenever I want. Sometimes I’ll create a quick entry from my watch with the time and location, then fill it in later. Always accessible. I get the appeal of a physical journal, but for me, writing digitally is way easier. It’s personal preference. Also my hand would get so tired when I write long winded journals…IINAAn up and coming open source video player. Plays nearly every format and the UI is more native and prettier than VLC. If you’re a old time VLC user because of format compatibility, give IINA a try.TweetbotA fantastic Twitter client for macOS. Way better than using the website if you’re a regular Twitter user. Has feature parity with the iOS version and the UI design is great.DaisyDiskMy preferred way to see how the disk space on my mac is being used. Allows me to find and delete unneeded files when I need to make space.1BlockerA native content blocker for macOS & safari. Because it uses Apple’s content blocker API, it’s faster and has better privacy by design that other ad blockers. All the rules and filters sync with the iOS app as well.SketchA vector design app that is mostly used for user interfaces. Great for designers, but I also like prototyping in it, as it is sometimes faster and easier than messing with interface builder.PixelmatorMy favorite drop in Photoshop replacement. No subscription, fairly cheap (~$15), and fully native.Affinity DesignerI’ll admit I’m terrible with vectors. But this looks like a great app. I’ve tried it a few times…ScreensI use screens to connect to my work iMac when I need to work from home. And it does the job well. Syncs with the iOS app as well.TransmitDeveloped by Panic, one of my favorite software companies. This is definitely one of the best designed apps on the platform. A nearly perfect FTP/SFTP client. If you need to upload files of any sort to a web server, this is how to get it done.Sublime TextA nice text editor.PawPaw is terrific for simulating HTTP(S) requests to test the web services you’re developing, or play with public APIs. I use this everyday at work. Postman is the more well known cross platform alternative, but I like Paw way better.Sequel ProThe best way to the contents of your database. I use it during development, but I’m sure it could also be used in production. It’s fast, and just works.TowerThe best git client I have used on the Mac. Some things are still a little unwiedly and sometimes I’ll have to go back to command line git, but for most operations Tower gets the job done well. If you’re looking for a free solution, Source Tree is fine as well.", "content_html": "Here’s a list of my favorite (third party) Mac apps.
1Password is a must app for anybody, in my opinion. It is an easy to use and well designed application that makes it super easy to manage unique passwords for all of your online accounts. It autofills in all browsers, and stores everything else important in your life like Pin codes, credit card numbers, etc. It also supports 2 factor auth codes. It’s a lifeline for me. And it syncs easily between all my devices. 5/5.
Terrific journaling App. Makes it easy to log your life, and syncs with the iOS and watchOS apps as well. Really well designed, and makes it easy to get writing, format it how you like, and attach images or locations. I think journaling is really important, and Day One fills an important need. There are pros and cons to digital journling, but a few things I like:
Easy tagging / searching.
It’s so easy to find old posts by tags, locations, date, etc. Much easier than searching through physical pages. It’s also fun to look at the different views such as the map with all your journal posts.
Password protection
You can use a passcode (or TouchID) to secure your journal. That way nobody, even with physical access can access my journal. And with end to end encryption, even if Day One servers are hacked, my data is safe. Since my journal contains my most personal thoughts, this is very important.
Backup
There are backups of my journal on Day One’s server, as well as my iCloud backup, Time Machine, Backblaze, etc. There’s little risk of me losing my journal with so many replications of it. With a physical journal, there’s only one.
Convienience
I can type out an entry whenever I want. Sometimes I’ll create a quick entry from my watch with the time and location, then fill it in later. Always accessible.
I get the appeal of a physical journal, but for me, writing digitally is way easier. It’s personal preference. Also my hand would get so tired when I write long winded journals…
An up and coming open source video player. Plays nearly every format and the UI is more native and prettier than VLC. If you’re a old time VLC user because of format compatibility, give IINA a try.
A fantastic Twitter client for macOS. Way better than using the website if you’re a regular Twitter user. Has feature parity with the iOS version and the UI design is great.
My preferred way to see how the disk space on my mac is being used. Allows me to find and delete unneeded files when I need to make space.
A native content blocker for macOS & safari. Because it uses Apple’s content blocker API, it’s faster and has better privacy by design that other ad blockers. All the rules and filters sync with the iOS app as well.
A vector design app that is mostly used for user interfaces. Great for designers, but I also like prototyping in it, as it is sometimes faster and easier than messing with interface builder.
My favorite drop in Photoshop replacement. No subscription, fairly cheap (~$15), and fully native.
I’ll admit I’m terrible with vectors. But this looks like a great app. I’ve tried it a few times…
I use screens to connect to my work iMac when I need to work from home. And it does the job well. Syncs with the iOS app as well.
Developed by Panic, one of my favorite software companies. This is definitely one of the best designed apps on the platform. A nearly perfect FTP/SFTP client. If you need to upload files of any sort to a web server, this is how to get it done.
A nice text editor.
Paw is terrific for simulating HTTP(S) requests to test the web services you’re developing, or play with public APIs. I use this everyday at work. Postman is the more well known cross platform alternative, but I like Paw way better.
The best way to the contents of your database. I use it during development, but I’m sure it could also be used in production. It’s fast, and just works.
The best git client I have used on the Mac. Some things are still a little unwiedly and sometimes I’ll have to go back to command line git, but for most operations Tower gets the job done well. If you’re looking for a free solution, Source Tree is fine as well.
", "url": "https://zekesnider.com/favorite-mac-apps/", "image": "macos.png", "date_published": "2017-08-31T04:15:40+00:00", "date_modified": "2017-08-31T04:15:40+00:00", "author": "" }, { "id": "https://zekesnider.com/blogging-in-2017/", "title": "Blogging in 2017", "summary": null, "content_text": "I’ve always enjoyed blogging, but have been very lazy recently about getting around to it. And part of that is because I haven’t really had a good home for all my content. I’ve been using Medium because it’s easy and fast. The design is pretty good and has suited my needs. But I really want a place that’s my very own on the WWW. One that’s not owned by any corporation, that I have (almost) complete control over.I still think Medium is a great platform, and I will probably continue to cross-post my important pieces there. There’s still a lot of insightful content I read on Medium. However, I would like to have a place I completely manage and own, so that’s why we’re here. I think it’s important that the web doesn’t become too centralized on large services. I post enough of my content on Twitter, Instagram, etc. Some of it should be hosted by me.Also Medium has added dickbars and some other questionable design decisions that take away from the most import thing: content.Choosing a blogging engineWhen deciding what blogging engine to use, I was mainly debating between Wordpress and Ghost. Wordpress is a battle tested CMS that is used very widely. I’ve used it a lot in the past and have done some contracting work with it. Wordpress is great at what it does.But it does come with its fair share of bloat. And upkeep with installing security upgrades, patching PHP, managing the server, installing plugins, etc. And because of its wide range of functionality, I find that theming it can be overly complicated. I wanted to keep it simple for my blog, and I just thought that managing a Wordpress install and theme would be overkill.So I also took a look at Ghost, which is a new up and comer in the area. It’s built using Node.js and Express, which is a stack I am fond of. I spun up a $10 digital ocean droplet to take Ghost for a spin. I liked it, but again seemed overkill for what I wanted. Also it seems a lot of open source themes I was trying out weren’t working due to lack of updates for the latest versions of Ghost.Ghost overall seemed very promising, but again overkill. A lot of the themes I was looking at weren’t striking my fancy. And hosting it on Digital Ocean would incur additional costs over the shared hosting I’m already paying for at dreamhost.JekyllThis brings us to Jekyll, which is what I ended up going with. Jekyll is an awesome tool which allows you to generate a completely static site using Markdown. The templates are easily modifiable, and you have complete control over what goes into your site.Let me just say, I love Jekyll. I am a total convert. The default theme is awesome, minimal, and was easy to customize to my liking. I am very satisfied with how the look of my blog ended up. I wanted something minimal and easy to read, with nice colors, and a unique style so that it doesn’t look like a generic template.I am a huge promponent of Markdown, so the writing format is a huge plus for me. I want to write my posts in Markdown no matter what engine I’m using. I really like how Jekyll formats and organizes the project files as well.Stepping back down to a completely static site is actually very nice. The current WWW has so many sites with insane bloat, it’s nice to keep my site to a fast loading lean machine. Just content, that’s it. My site does not have a single line of JavaScript. Hopefully it can stay that way. No need for AMP here, just natively fast loading pages.Importing PostsI only had 4 posts on Medium, so this wasn’t a huge undertaking. I decided to do it manually because of how few posts I have. There’s no importer plugin that I know of. I would of written one myself if I had more posts, but it just wouldn’t be worth it with the number I have.In a few hours I was done. Most of my issues were relating to layout of images. Jekyll doesn’t have many images helpers built in, so I added some which mimick the responsive layout functionality of Medium’s image embeds. I still have some tweaking to do, but I think it’s pretty good for the most part. Because I implemented them with _includes, they will be easy to modify later.JSON FeedJSON Feed is a very new (May 2017) syndication format designed by Manton Reece and Brent Simmons. I really like the idea of it, and wanted to support it on my blog for the novelty of it if possible.Luckily, there is already an open source project which implements JSON feed for Jekyll. With some minor modifications, my JSON Feed was ready to go. You can check it out here! Even if there’s not much that parses JSON feed yet, I like the idea of supporting it.Open Graph / Twitter CardsI wanted to add the meta tags used by Twitter/Facebook to create rich previews. Also because they are used by iMessage, and I really wanted the previews to look nice in there. This was fairly easy to accomplish by modifying my header template. There are some great articles out there already which helped out a lot.With some minor modification and tweaking in Facebook’s open graph validator, my rich content previews were set.BeautifulHostingJekyll has awesome integration with Github Pages, which allows for free and easy hosting of your jekyll site with built in source control. This is a excellent option for most, especially considering the price (free) and ease of use.Unfortunately, Github Pages does not current support HTTPS for custom domains. They support HTTPS for *.github.io domains which is great, but I really want to host my site on my own domain (zekesnider.com). So I decided to just copy over the files to my Dreamhost shared hosting instance.I might set up a better automatic commit pull workflow in the future, but for now I just copy over the _site directory using Transmit. I already had a letsencrypt cert setup, so I customized the .htaccess file, and I was set! If GitHub adds support for HTTPS on custom domains in the future, I will probably switch over to that.I would like to improve the deployment workflow in the future, just so I can easily update my blog on the go from my iPad (or iPhone). Hoping this is possible with some combination of Working Copy, Coda, and better server tooling. This is a nice to have, hopefully the frequency of my postings will necessitate this in the future.AnalyticsI didn’t want any ad tracking JavaScript on my site at all. In fact, the site currently has no JavaScript on it all. But I also wanted to have a general access log so I know how many people are visiting my site.Dreamhost Site Statistics seemed like the best solution to this problem (considering it’s built into the hosting). I have yet to fully configure it, but I might do another post on this once I get some actionable data built up.ConclusionSo there you have it. With Jekyll I have a very fast loading, nice looking site with no ad tracking and 0 lines of JavaScript. It fits my needs very well, and I hope that I can keep the blogging habbit for this redesign to be worth my effort. Thanks for reading, and stay tuned for more! You can check out the source for my blog here if you like.", "content_html": "I’ve always enjoyed blogging, but have been very lazy recently about getting around to it. And part of that is because I haven’t really had a good home for all my content. I’ve been using Medium because it’s easy and fast. The design is pretty good and has suited my needs. But I really want a place that’s my very own on the WWW. One that’s not owned by any corporation, that I have (almost) complete control over.
I still think Medium is a great platform, and I will probably continue to cross-post my important pieces there. There’s still a lot of insightful content I read on Medium. However, I would like to have a place I completely manage and own, so that’s why we’re here. I think it’s important that the web doesn’t become too centralized on large services. I post enough of my content on Twitter, Instagram, etc. Some of it should be hosted by me.
Also Medium has added dickbars and some other questionable design decisions that take away from the most import thing: content.
When deciding what blogging engine to use, I was mainly debating between Wordpress and Ghost. Wordpress is a battle tested CMS that is used very widely. I’ve used it a lot in the past and have done some contracting work with it. Wordpress is great at what it does.
But it does come with its fair share of bloat. And upkeep with installing security upgrades, patching PHP, managing the server, installing plugins, etc. And because of its wide range of functionality, I find that theming it can be overly complicated. I wanted to keep it simple for my blog, and I just thought that managing a Wordpress install and theme would be overkill.
So I also took a look at Ghost, which is a new up and comer in the area. It’s built using Node.js and Express, which is a stack I am fond of. I spun up a $10 digital ocean droplet to take Ghost for a spin. I liked it, but again seemed overkill for what I wanted. Also it seems a lot of open source themes I was trying out weren’t working due to lack of updates for the latest versions of Ghost.
Ghost overall seemed very promising, but again overkill. A lot of the themes I was looking at weren’t striking my fancy. And hosting it on Digital Ocean would incur additional costs over the shared hosting I’m already paying for at dreamhost.
This brings us to Jekyll, which is what I ended up going with. Jekyll is an awesome tool which allows you to generate a completely static site using Markdown. The templates are easily modifiable, and you have complete control over what goes into your site.
Let me just say, I love Jekyll. I am a total convert. The default theme is awesome, minimal, and was easy to customize to my liking. I am very satisfied with how the look of my blog ended up. I wanted something minimal and easy to read, with nice colors, and a unique style so that it doesn’t look like a generic template.
I am a huge promponent of Markdown, so the writing format is a huge plus for me. I want to write my posts in Markdown no matter what engine I’m using. I really like how Jekyll formats and organizes the project files as well.
Stepping back down to a completely static site is actually very nice. The current WWW has so many sites with insane bloat, it’s nice to keep my site to a fast loading lean machine. Just content, that’s it. My site does not have a single line of JavaScript. Hopefully it can stay that way. No need for AMP here, just natively fast loading pages.
I only had 4 posts on Medium, so this wasn’t a huge undertaking. I decided to do it manually because of how few posts I have. There’s no importer plugin that I know of. I would of written one myself if I had more posts, but it just wouldn’t be worth it with the number I have.
In a few hours I was done. Most of my issues were relating to layout of images. Jekyll doesn’t have many images helpers built in, so I added some which mimick the responsive layout functionality of Medium’s image embeds. I still have some tweaking to do, but I think it’s pretty good for the most part. Because I implemented them with _includes, they will be easy to modify later.
JSON Feed is a very new (May 2017) syndication format designed by Manton Reece and Brent Simmons. I really like the idea of it, and wanted to support it on my blog for the novelty of it if possible.
Luckily, there is already an open source project which implements JSON feed for Jekyll. With some minor modifications, my JSON Feed was ready to go. You can check it out here! Even if there’s not much that parses JSON feed yet, I like the idea of supporting it.
I wanted to add the meta tags used by Twitter/Facebook to create rich previews. Also because they are used by iMessage, and I really wanted the previews to look nice in there. This was fairly easy to accomplish by modifying my header template. There are some great articles out there already which helped out a lot.
With some minor modification and tweaking in Facebook’s open graph validator, my rich content previews were set.
Jekyll has awesome integration with Github Pages, which allows for free and easy hosting of your jekyll site with built in source control. This is a excellent option for most, especially considering the price (free) and ease of use.
Unfortunately, Github Pages does not current support HTTPS for custom domains. They support HTTPS for *.github.io domains which is great, but I really want to host my site on my own domain (zekesnider.com). So I decided to just copy over the files to my Dreamhost shared hosting instance.
I might set up a better automatic commit pull workflow in the future, but for now I just copy over the _site directory using Transmit. I already had a letsencrypt cert setup, so I customized the .htaccess file, and I was set! If GitHub adds support for HTTPS on custom domains in the future, I will probably switch over to that.
I would like to improve the deployment workflow in the future, just so I can easily update my blog on the go from my iPad (or iPhone). Hoping this is possible with some combination of Working Copy, Coda, and better server tooling. This is a nice to have, hopefully the frequency of my postings will necessitate this in the future.
I didn’t want any ad tracking JavaScript on my site at all. In fact, the site currently has no JavaScript on it all. But I also wanted to have a general access log so I know how many people are visiting my site.
Dreamhost Site Statistics seemed like the best solution to this problem (considering it’s built into the hosting). I have yet to fully configure it, but I might do another post on this once I get some actionable data built up.
So there you have it. With Jekyll I have a very fast loading, nice looking site with no ad tracking and 0 lines of JavaScript. It fits my needs very well, and I hope that I can keep the blogging habbit for this redesign to be worth my effort. Thanks for reading, and stay tuned for more! You can check out the source for my blog here if you like.
", "url": "https://zekesnider.com/blogging-in-2017/", "image": "jekyll.png", "date_published": "2017-08-19T05:15:40+00:00", "date_modified": "2017-08-19T05:15:40+00:00", "author": "" }, { "id": "https://zekesnider.com/why-i-like-vinyl/", "title": "Why I Like Vinyl", "summary": null, "content_text": "Recently I, a 20 year old, have taken a liking to vinyl records. And not because it’s an old medium and I want to be a hipster. I am not “nostalgic” about CDs, casset tapes, or other antiquated mediums. There are solid reasons for why I specifically like this antiquated medium.The age of streaming\t \tWhen I listen to music, 90% of the time I am streaming it. I use Apple Music and really enjoy the service. I’m not arguing that Vinyl is the best way to listen to music. The convenience and pricing of streaming services are king, and will stay that way. If anything, I would argue that streaming is the best platform for most consumers. It offers a the most flexibility, and tons of variety for a low price.And you can listen anytime, anywhere. Personally I have my whole library downloaded offline, which is a another plus of most streaming services. You can still have the benefit of an offline cache with the flexibility of an extremely large catalog.Physical collectionsAnd yet, even with streaming’s flexibility and ease of use, I still would like to have a physical collection of my very favorite albums. The albums that I love and could listen to literally hundreds of times without getting tired of them. I like the physical collection because it gives me a better connection with my media, rather than just a expose of album art in iTunes.When I buy games, I tend to buy the physical versions whenever possible for the same reason. The physical collection will also always be in my possession as long as it’s not damaged or lost. I’m not sure if Apple Music / Spotify / streaming service of your choice will still be active in 30 years. And, if you decide to stop paying for the streaming service, the music is not longer yours to keep.So, if I want a physical collection of my music, I’m left with 2 options for the most part: CD and vinyl. There are several problems with CD which prevent it from being a medium that I enjoy collecting.It is a digital format, with no connection to the music on disc. It’s boring, scratches easily, and you’re just going to import it to your computer and play from there for the most part. There is nothing unique or special about it. It exists because of the technology at the time of its inception.Also, the art is tiny, the jewel cases are usually bad quality and scratch/crack easily. It’s just not an appealing collector’s item. I do own lots of albums that are only on CD, and they are fine. But if it’s available on vinyl, because…HUGE ALBUM ARTIt puts CDs to shameThe fact that vinyl is a huge and awkward disc format means the outer sleeve is a huge print of the album artwork. This is AWESOME, and honestly probably my favorite thing about vinyl. I love album art and the vinyl sleeves are just a great way to display them. It’s cool to see my favorite albums jumbo size.They can also be hanged or displayed in different ways which is great.My signed copy of E•MO•TION: Side B framedThe analog connectionVinyl is not a superior format to digital (in my opinion at least). But still, the feeling you get dropping the needle on the record to start the album is absolutely great. It brings a sort of connection to the music that you don’t get when tapping the album on your phone.Just the fact that you’re playing from physical grooves in a disc that are recreating the audio of the song is great. Sure it’s clumsy and inconvenient to swap discs and they can only store a few minutes of content, but the analog connection is very special.Whole AlbumsIn the age of playlisting, singles, and random mixes, I think many people have really lost the value in listening to an album all the way through. I think it’s important to listen to an album all the way as its how the artist intended it. Each song also has its own connection to the other around it on the album that you don’t understand when listenting to singles.A album can have a great single on it, but that doesn’t make it a great album. Truly great artists deliver on all tracks on an album, even the ones that can’t top the charts. And I think it’s important to experience the whole collection of work that way. I’m not trying to argue an elitist viewpoint that you should always listen to albums all the way through, but I think cohesive albums are still important. I still enjoy playlisting, but albums are my favorite way to listen to music.Vinyl, by design kind of forces you to listen all the way through the album, because of the clumsiness of switching vinyls and finding where on the record a song starts. While it is annoying to have to switch records 4 times to finish an album, I still enjoy it.QualityMany people say that vinyl is the only way to listen to music because the quality is that music better. And to be honest, I don’t agree. There may be a difference in sound, but it’s hard to notice. I’m not an audiophile per say, so this is not a huge issue for me, it sounds consistent to digital to me, which is OK. It depends on your speaker/headphone set hooked up to your player as well.I will say that some records do sound different or “warmer” to me on vinyl, although this may depend on the album or it might just be placebo. Regardless, the sound from vinyl is definitely not a step down in my experience.“Pure Heroine” by Lorde is one of my favorite sounds on vinyl.You can play an album on your phone anytime, but there’s just something special about handling the vinyl record, placing it on the platter and starting it. It provides a connection with the music that doesn’t exist in other mediums.Vinyl is an antiquated, awkward to handle, and expensive format. But I still really like it.", "content_html": "Recently I, a 20 year old, have taken a liking to vinyl records. And not because it’s an old medium and I want to be a hipster. I am not “nostalgic” about CDs, casset tapes, or other antiquated mediums. There are solid reasons for why I specifically like this antiquated medium.
When I listen to music, 90% of the time I am streaming it. I use Apple Music and really enjoy the service. I’m not arguing that Vinyl is the best way to listen to music. The convenience and pricing of streaming services are king, and will stay that way. If anything, I would argue that streaming is the best platform for most consumers. It offers a the most flexibility, and tons of variety for a low price.And you can listen anytime, anywhere. Personally I have my whole library downloaded offline, which is a another plus of most streaming services. You can still have the benefit of an offline cache with the flexibility of an extremely large catalog.
And yet, even with streaming’s flexibility and ease of use, I still would like to have a physical collection of my very favorite albums. The albums that I love and could listen to literally hundreds of times without getting tired of them. I like the physical collection because it gives me a better connection with my media, rather than just a expose of album art in iTunes.
When I buy games, I tend to buy the physical versions whenever possible for the same reason. The physical collection will also always be in my possession as long as it’s not damaged or lost. I’m not sure if Apple Music / Spotify / streaming service of your choice will still be active in 30 years. And, if you decide to stop paying for the streaming service, the music is not longer yours to keep.So, if I want a physical collection of my music, I’m left with 2 options for the most part: CD and vinyl. There are several problems with CD which prevent it from being a medium that I enjoy collecting.
It is a digital format, with no connection to the music on disc. It’s boring, scratches easily, and you’re just going to import it to your computer and play from there for the most part. There is nothing unique or special about it. It exists because of the technology at the time of its inception.
Also, the art is tiny, the jewel cases are usually bad quality and scratch/crack easily. It’s just not an appealing collector’s item. I do own lots of albums that are only on CD, and they are fine. But if it’s available on vinyl, because…
The fact that vinyl is a huge and awkward disc format means the outer sleeve is a huge print of the album artwork. This is AWESOME, and honestly probably my favorite thing about vinyl. I love album art and the vinyl sleeves are just a great way to display them. It’s cool to see my favorite albums jumbo size.
They can also be hanged or displayed in different ways which is great.
Vinyl is not a superior format to digital (in my opinion at least). But still, the feeling you get dropping the needle on the record to start the album is absolutely great. It brings a sort of connection to the music that you don’t get when tapping the album on your phone.Just the fact that you’re playing from physical grooves in a disc that are recreating the audio of the song is great. Sure it’s clumsy and inconvenient to swap discs and they can only store a few minutes of content, but the analog connection is very special.
In the age of playlisting, singles, and random mixes, I think many people have really lost the value in listening to an album all the way through. I think it’s important to listen to an album all the way as its how the artist intended it. Each song also has its own connection to the other around it on the album that you don’t understand when listenting to singles.
A album can have a great single on it, but that doesn’t make it a great album. Truly great artists deliver on all tracks on an album, even the ones that can’t top the charts. And I think it’s important to experience the whole collection of work that way. I’m not trying to argue an elitist viewpoint that you should always listen to albums all the way through, but I think cohesive albums are still important. I still enjoy playlisting, but albums are my favorite way to listen to music.
Vinyl, by design kind of forces you to listen all the way through the album, because of the clumsiness of switching vinyls and finding where on the record a song starts. While it is annoying to have to switch records 4 times to finish an album, I still enjoy it.
Many people say that vinyl is the only way to listen to music because the quality is that music better. And to be honest, I don’t agree. There may be a difference in sound, but it’s hard to notice. I’m not an audiophile per say, so this is not a huge issue for me, it sounds consistent to digital to me, which is OK. It depends on your speaker/headphone set hooked up to your player as well.
I will say that some records do sound different or “warmer” to me on vinyl, although this may depend on the album or it might just be placebo. Regardless, the sound from vinyl is definitely not a step down in my experience.
You can play an album on your phone anytime, but there’s just something special about handling the vinyl record, placing it on the platter and starting it. It provides a connection with the music that doesn’t exist in other mediums.Vinyl is an antiquated, awkward to handle, and expensive format. But I still really like it.
", "url": "https://zekesnider.com/why-i-like-vinyl/", "image": "spinningvinyl.jpg", "date_published": "2017-05-18T02:13:40+00:00", "date_modified": "2017-05-18T02:13:40+00:00", "author": "" }, { "id": "https://zekesnider.com/using-an-ecobee-thermostat-with-a-millivolt-heating-system/", "title": "Using an Ecobee Thermostat with a Millivolt Heating System", "summary": null, "content_text": "We’ve always been using an old simple thermostat for use with the house’s stove which uses a millivolt connection. This is the only heating appliance in the house, and there’s no AC (perks of living in Washington). But recently, I decided that it was time to upgrade to a smart thermostat.\t \tIt's working!I really wanted HomeKit support on the thermostat, so I ended up going with the Ecobee 3 Lite. It is a cheaper version of the Ecobee 3 that skips the remote sensors and some other premium features. I figured the lite would be perfect for my smaller use case, and because there’s only one source of heat so the remote sensors wouldn’t be all that useful.Unfortunately, the Ecobee (and Nest and most other competitors as well I believe) don’t support millivolt heaters natively. They only support the HVAC wiring system. Millivolt does not contain wiring for power, so that has to be managed as well. I was still determined install this thing, after some research on the internet and expirementation with electronics parts off Amazon, I was able to get it working!Now I’m just going to preface this with the fact that I’m a software engineer not a electrical engineer. So I’m not guarenteeing that everything here is 100% correct, just sharing the solution that worked for me. There was a few posts on forums and Q&A sites giving some hints on how this works but I couldn’t find a comprehensive guide. So I figured I’d write one in case anyone else is trying to connect their Ecobee (or nest, etc.) to a millivolt stove.The Parts 24V Transformer Relay Electrical Wire Connection ScrewsAnd also you’ll need some wiring, which you may have laying around. Be sure to have enough slack for when you install it in the wall.Wiring DiagramA professional drawingPlease excuse the amateur iPad sketch, but this should give a good idea of how it’s wired up. Here’s a legend if any of the colors are ambiguous Relay Orange -> Heater Relay Yellow -> Heater Relay White/Yellow -> Ecobee W(1) White / Blue joins Transformer ouput #1-> Ecobee C Transformer output output #2 -> Ecobee Rc Relay White / Black: unused Relay Blue: unused\t \tWired in.\t \tConnections #1\t \tConnections #2A note on the transfomers, originally we had tried using this Heath Zenith transformer but it only worked for about 5 minutes before exibiting some strange smells and overheating. We may have just received a faulty product, but we decided to just get one that plugs directly into the socket, then wire into the wall from there. A little more clunky, but it works for us. It’s easier because you don’t need to worry about mounting the transformer in the wall.Fortunately Amazon refunded us for the broken transformer, so not much harm done. Very very glad it did not damage the ecobee. These are the thrills of experimentation I suppose. The new transformer works like a charm.HomeKit access right from notification centerAfter getting it all set up, the Ecobee is very nice! We still haven’t properly mounted it in the wall, but we’re trying it out in the temporary setup until then. The homekit functionality is great and everything is working as expected. Overall I would recommend the Ecobee to anyone using a millivolt system or not. Hopefully this guide helped someone, let me know if you have any improvements / comments.", "content_html": "We’ve always been using an old simple thermostat for use with the house’s stove which uses a millivolt connection. This is the only heating appliance in the house, and there’s no AC (perks of living in Washington). But recently, I decided that it was time to upgrade to a smart thermostat.
I really wanted HomeKit support on the thermostat, so I ended up going with the Ecobee 3 Lite. It is a cheaper version of the Ecobee 3 that skips the remote sensors and some other premium features. I figured the lite would be perfect for my smaller use case, and because there’s only one source of heat so the remote sensors wouldn’t be all that useful.
Unfortunately, the Ecobee (and Nest and most other competitors as well I believe) don’t support millivolt heaters natively. They only support the HVAC wiring system. Millivolt does not contain wiring for power, so that has to be managed as well. I was still determined install this thing, after some research on the internet and expirementation with electronics parts off Amazon, I was able to get it working!
Now I’m just going to preface this with the fact that I’m a software engineer not a electrical engineer. So I’m not guarenteeing that everything here is 100% correct, just sharing the solution that worked for me. There was a few posts on forums and Q&A sites giving some hints on how this works but I couldn’t find a comprehensive guide. So I figured I’d write one in case anyone else is trying to connect their Ecobee (or nest, etc.) to a millivolt stove.
And also you’ll need some wiring, which you may have laying around. Be sure to have enough slack for when you install it in the wall.
Please excuse the amateur iPad sketch, but this should give a good idea of how it’s wired up. Here’s a legend if any of the colors are ambiguous
A note on the transfomers, originally we had tried using this Heath Zenith transformer but it only worked for about 5 minutes before exibiting some strange smells and overheating. We may have just received a faulty product, but we decided to just get one that plugs directly into the socket, then wire into the wall from there. A little more clunky, but it works for us. It’s easier because you don’t need to worry about mounting the transformer in the wall.Fortunately Amazon refunded us for the broken transformer, so not much harm done. Very very glad it did not damage the ecobee. These are the thrills of experimentation I suppose. The new transformer works like a charm.
After getting it all set up, the Ecobee is very nice! We still haven’t properly mounted it in the wall, but we’re trying it out in the temporary setup until then. The homekit functionality is great and everything is working as expected. Overall I would recommend the Ecobee to anyone using a millivolt system or not. Hopefully this guide helped someone, let me know if you have any improvements / comments.
", "url": "https://zekesnider.com/using-an-ecobee-thermostat-with-a-millivolt-heating-system/", "image": "ecobee.jpeg", "date_published": "2016-12-13T02:13:40+00:00", "date_modified": "2016-12-13T02:13:40+00:00", "author": "" }, { "id": "https://zekesnider.com/project-diva-x-review/", "title": "Project Diva X Review", "summary": null, "content_text": "For those new to the series, X is the third project diva game on the Playstation Vita. The two others are f and F2nd, which are the same game for the most part with different song lists and minor changes. The basic gameplay is a rhythm game based around the playstation shape buttons, hitting the right notes in time with the music. You can watch a few gameplay videos or try to the demo to find out if it clicks for you or not pretty quickly.This review is written from the perspective of a fan of the series, who has platinumed both f and F 2nd. Prior to X’s release I was still frequently playing f and F 2nd, and often going to the arcade to play that version. X made a lot of changes to the classic formula, thus being called X and not F 3rd. I’m all for brining some new ideas to the series, but for the most part the changes made in X are step backs. There is a lot more reliance on equips and RNG luck over rhythm game skill. I think this is taking the series in a direction I don’t really want to see. So let’s get right into it…This game introduces a new game mode called “area quest” which replaces free play more for the most part. Free play still exists but it’s mostly an afterthought, you won’t be playing that mode if you want to progress on the game’s extremely long grind. Free play is required for 2 trophies but besides that, is not required for anything at all and there’s no way to progress on the game’s objectives in free play.X removes diva points, which are usually earned in songs and used to purchase modules, presents, accessories, etc. Instead everything in X is a random drop at the end of a song. Entirely random. Yes, this is awful.Roll the diceIf you clear the chance time section of a song, you are granted a random module. And the modules, which are normally cosmetic now serve functional purposes in area quest mode. And by no means are you guaranteed a new module every time. You’ll find once you get a few in your library you’ll frequently get the same modules again, and this is extremely frustrating if you want to go for 100% module completion of modules. In past games you were able to buy modules at will from the shop.Area quest mode is very different from normal free play, you have a voltage meter which raises the percentage of return on correct notes. There’s “voltage raise” notes outlined rarely which will raise it more than other notes. There’s no life bar which means you can’t fail by missing so many notes in the middle of a song, you just won’t pass the requirement at the end.The elementsAlso they’ve separated out the modules and songs into 5 groups: cute, cool, neutral, chaos & beauty. If you equip a module and accessories of the matching element you can gain boosts of up to 60% on your score. If you don’t have the maximum 60% boost you’re SOL on some of the harder challenges. Which is making the game more about RNG and equips than actual skill.When I briefly tried playing Love Live! on iOS I was turned off because the game was not very skill based, I would still get rank C scores even with full combos in that game because I didn’t have the right cards. And that’s why I never got into it. I fear that this series is heading in that direction (possibly because it’s more profitable) which worries me.The module skills are a nice idea to make the game into an “RPG” but fail badly at being balanced or interesting at all. Once you get the right modules the only ones that are worthwhile are “new module up Lv4” which increases the chances of obtaining a new module, and “voltage note up Lv5” which increases the frequency of the notes that bump your voltage up. The lower level modules and other skills become entirely useless, and these 2 skills will be the only useful ones in your arsenal for the most part.The 60% bonusThey’ve also gave a “purpose” to the accessories which are just cosmetic accessories in previous games. However they fail to have any real purpose, as once you’ve obtained the best accessory combination for each element that grants the 40% boost there is no point to using any other accessories. I saved load outs for each of the magic combinations and never looked back. There’s a module skill for increasing accessory drop rates but it’s already easy to obtain all of them normally so that’s another useless skill.In the past diva games, there has been a “Diva Room” mode which is usually my least favorite part, but required to 100% it. You could give presents to the vocaloids and play games to raise their affection level. In X this mode is absolutely awful. They raised the max affection level for each vocaloid to 10 from 5, making it an INSANE grind to get max level which is required for several trophies. You can no longer play games with the vocaloids, you can only give presents. Now you can spam presents as much as you want but they give so little affection per present it will take forever to get to max level that way.The only way to effectively raise affection is fulfilling a vocaloid’s request for a present, for example if they want a something sweet you can give them a cookie which would increase the affection much more than regularly giving a cookie. This may not sound bad, however you cannot start a request at will, they are prompted randomly at the end of a song. There’s no rule or behavior for it, but it will randomly prompt you sometimes at the end of a song. Randomly. Some people online critisize the requests for being hard to understand if you don’t understand Japanse, but I won’t mark the game down for this because well, it’s in Japanese…Weebs can’t decipher what she wantsX also introduces another mode called “live quest” (not area quest), and medleys which are one of the few additions I actually like. They allow you to chain together several shortened versions of songs into one live show. You can create a custom mix of 3 of your favorites and play them as a show basically. This is quite cool but again suffers from the same equips and RNG of everything else in the game. One time I got a perfect (full combo) on a live quest and still failed because I didn’t have the proper module or accessory so my multiplier was not high enough. This is maddening.This game also only contains 24 songs (and 6 medleys). F has 44, F2nd has 40. This is a step back in the one major thing I care about in a rhythm game, the song collection. In addition, of those 24 songs, 20 feature Miku as the main singer and 22 have Miku in them. I like Miku but there should be more variety in vocaloids, as there’s 6 of them. Another disappointment, and there’s not even a Rin & Len song in this game.Just a stageThe PVs in this game are also lackluster, they are all on a stage with no story. Past games featured full story scenes movies in the background of the song which are quite cool and tell the story of the song. In this game there is none of that, literally all of the songs are just dancing on a stage. I could excuse this if the song selection was wider, but in my opinion this is just a disappointment with only 24 songs with no quality PVs.Several other features such as skins, edit mode, and loading screen art are also gone. In F and F 2nd you could customize the GUI of the rhythm game with several art presets called skins. I never used this feature that much but there’s no reason to remove it and it’s no longer here. Also previous games had fan art on the loading screens which was nice to look at, this is replaced with a generic loading screen in X. And edit mode which allows you to create custom beat maps doesn’t exist anymore. No idea why all of these things were removed, probably just laziness.I guess I should also mention that they tried to shoehorn in a “story”, which I started skipping all the text of after the first half hour because it’s about as interesting as something a first grader would write for his homework assignment.Amazing and enthralling dialog!For completionists, this game is hell for grinding with all the random drops, and increased max level of 10 in the diva room. I am 85 hours in but still not close to getting the platinum. I should also mention that the area quest mode requires you to play each song with challenges after beating the 4 main difficulties (easy, normal, hard, extreme). These “challenges” do stupid stuff like make the notes waver, make the notes hidden, make the notes go super fast. This is just distracting and not fun, but to 100% the game you have to clear about 5 challenges on each song. The last of which is 3 modifiers on extreme difficulty, not fun at all.The game is fun normally, but how about a mode where you can’t see where the hell the notes are goingAnd to get the right random drops to obtain all the modules you’ll be playing songs over and over over and over and over again. By the end of your PSN platinum experience you will hate even your favorite songs from trying to get the correct module and item drops. Because you have no control over this, if your luck is bad you can be repeatedly screwed with nothing you can do. This is entirely personal opinion, but I also didn’t care for a lot of the songs in the game. In fact I hate a majority of the “chaos” songs. And the game really does force you to play ALL the songs many times for completion.Project Diva X tries to make some changes to the well tested formula to add RPG like elements and expand the game. But it fails badly on most of these ventures and creates something that is reliant on luck, equips, and other factors out of your control. It may be interesting enough to hold the attention of a casual player for a few hours, but for a seasoned veteran of the series, Project Diva X is a few steps in the wrong direction.Final Official IGN Score: 6/10", "content_html": "For those new to the series, X is the third project diva game on the Playstation Vita. The two others are f and F2nd, which are the same game for the most part with different song lists and minor changes. The basic gameplay is a rhythm game based around the playstation shape buttons, hitting the right notes in time with the music. You can watch a few gameplay videos or try to the demo to find out if it clicks for you or not pretty quickly.
This review is written from the perspective of a fan of the series, who has platinumed both f and F 2nd. Prior to X’s release I was still frequently playing f and F 2nd, and often going to the arcade to play that version. X made a lot of changes to the classic formula, thus being called X and not F 3rd. I’m all for brining some new ideas to the series, but for the most part the changes made in X are step backs. There is a lot more reliance on equips and RNG luck over rhythm game skill. I think this is taking the series in a direction I don’t really want to see. So let’s get right into it…
This game introduces a new game mode called “area quest” which replaces free play more for the most part. Free play still exists but it’s mostly an afterthought, you won’t be playing that mode if you want to progress on the game’s extremely long grind. Free play is required for 2 trophies but besides that, is not required for anything at all and there’s no way to progress on the game’s objectives in free play.X removes diva points, which are usually earned in songs and used to purchase modules, presents, accessories, etc. Instead everything in X is a random drop at the end of a song. Entirely random. Yes, this is awful.
If you clear the chance time section of a song, you are granted a random module. And the modules, which are normally cosmetic now serve functional purposes in area quest mode. And by no means are you guaranteed a new module every time. You’ll find once you get a few in your library you’ll frequently get the same modules again, and this is extremely frustrating if you want to go for 100% module completion of modules. In past games you were able to buy modules at will from the shop.
Area quest mode is very different from normal free play, you have a voltage meter which raises the percentage of return on correct notes. There’s “voltage raise” notes outlined rarely which will raise it more than other notes. There’s no life bar which means you can’t fail by missing so many notes in the middle of a song, you just won’t pass the requirement at the end.
Also they’ve separated out the modules and songs into 5 groups: cute, cool, neutral, chaos & beauty. If you equip a module and accessories of the matching element you can gain boosts of up to 60% on your score. If you don’t have the maximum 60% boost you’re SOL on some of the harder challenges. Which is making the game more about RNG and equips than actual skill.
When I briefly tried playing Love Live! on iOS I was turned off because the game was not very skill based, I would still get rank C scores even with full combos in that game because I didn’t have the right cards. And that’s why I never got into it. I fear that this series is heading in that direction (possibly because it’s more profitable) which worries me.
The module skills are a nice idea to make the game into an “RPG” but fail badly at being balanced or interesting at all. Once you get the right modules the only ones that are worthwhile are “new module up Lv4” which increases the chances of obtaining a new module, and “voltage note up Lv5” which increases the frequency of the notes that bump your voltage up. The lower level modules and other skills become entirely useless, and these 2 skills will be the only useful ones in your arsenal for the most part.
They’ve also gave a “purpose” to the accessories which are just cosmetic accessories in previous games. However they fail to have any real purpose, as once you’ve obtained the best accessory combination for each element that grants the 40% boost there is no point to using any other accessories. I saved load outs for each of the magic combinations and never looked back. There’s a module skill for increasing accessory drop rates but it’s already easy to obtain all of them normally so that’s another useless skill.
In the past diva games, there has been a “Diva Room” mode which is usually my least favorite part, but required to 100% it. You could give presents to the vocaloids and play games to raise their affection level. In X this mode is absolutely awful. They raised the max affection level for each vocaloid to 10 from 5, making it an INSANE grind to get max level which is required for several trophies. You can no longer play games with the vocaloids, you can only give presents. Now you can spam presents as much as you want but they give so little affection per present it will take forever to get to max level that way.
The only way to effectively raise affection is fulfilling a vocaloid’s request for a present, for example if they want a something sweet you can give them a cookie which would increase the affection much more than regularly giving a cookie. This may not sound bad, however you cannot start a request at will, they are prompted randomly at the end of a song. There’s no rule or behavior for it, but it will randomly prompt you sometimes at the end of a song. Randomly. Some people online critisize the requests for being hard to understand if you don’t understand Japanse, but I won’t mark the game down for this because well, it’s in Japanese…
X also introduces another mode called “live quest” (not area quest), and medleys which are one of the few additions I actually like. They allow you to chain together several shortened versions of songs into one live show. You can create a custom mix of 3 of your favorites and play them as a show basically. This is quite cool but again suffers from the same equips and RNG of everything else in the game. One time I got a perfect (full combo) on a live quest and still failed because I didn’t have the proper module or accessory so my multiplier was not high enough. This is maddening.
This game also only contains 24 songs (and 6 medleys). F has 44, F2nd has 40. This is a step back in the one major thing I care about in a rhythm game, the song collection. In addition, of those 24 songs, 20 feature Miku as the main singer and 22 have Miku in them. I like Miku but there should be more variety in vocaloids, as there’s 6 of them. Another disappointment, and there’s not even a Rin & Len song in this game.
The PVs in this game are also lackluster, they are all on a stage with no story. Past games featured full story scenes movies in the background of the song which are quite cool and tell the story of the song. In this game there is none of that, literally all of the songs are just dancing on a stage. I could excuse this if the song selection was wider, but in my opinion this is just a disappointment with only 24 songs with no quality PVs.
Several other features such as skins, edit mode, and loading screen art are also gone. In F and F 2nd you could customize the GUI of the rhythm game with several art presets called skins. I never used this feature that much but there’s no reason to remove it and it’s no longer here. Also previous games had fan art on the loading screens which was nice to look at, this is replaced with a generic loading screen in X. And edit mode which allows you to create custom beat maps doesn’t exist anymore. No idea why all of these things were removed, probably just laziness.
I guess I should also mention that they tried to shoehorn in a “story”, which I started skipping all the text of after the first half hour because it’s about as interesting as something a first grader would write for his homework assignment.
For completionists, this game is hell for grinding with all the random drops, and increased max level of 10 in the diva room. I am 85 hours in but still not close to getting the platinum. I should also mention that the area quest mode requires you to play each song with challenges after beating the 4 main difficulties (easy, normal, hard, extreme). These “challenges” do stupid stuff like make the notes waver, make the notes hidden, make the notes go super fast. This is just distracting and not fun, but to 100% the game you have to clear about 5 challenges on each song. The last of which is 3 modifiers on extreme difficulty, not fun at all.
The game is fun normally, but how about a mode where you can’t see where the hell the notes are going
And to get the right random drops to obtain all the modules you’ll be playing songs over and over over and over and over again. By the end of your PSN platinum experience you will hate even your favorite songs from trying to get the correct module and item drops. Because you have no control over this, if your luck is bad you can be repeatedly screwed with nothing you can do. This is entirely personal opinion, but I also didn’t care for a lot of the songs in the game. In fact I hate a majority of the “chaos” songs. And the game really does force you to play ALL the songs many times for completion.
Project Diva X tries to make some changes to the well tested formula to add RPG like elements and expand the game. But it fails badly on most of these ventures and creates something that is reliant on luck, equips, and other factors out of your control. It may be interesting enough to hold the attention of a casual player for a few hours, but for a seasoned veteran of the series, Project Diva X is a few steps in the wrong direction.
I submitted my application to Apple’s WWDC 2016 student scholarship 2 days ago. It seems like every year I really want to do this, but this year I finally did. It feels like a great accomplishment, even if I don’t win. I’ve been learning Swift ever since The Swift Programming Language book dropped at WWDC 2014, but I’ve always struggled with Cocoa frameworks because there’s just so much there to learn.
Recently, I’ve become somewhat bored with working on web projects in my free time. Possibly because I’m a web developer by occupation now, or maybe I’m just getting tired with the platform. But either way, I figured the best way to hit the ground running on learning iOS development would be to just build an app and fill in the gaps as I went. This brings us to my app, titled Z Split.
I started on this project in January, before even considering that I could submit this for the scholarship. It’s a split timer, in the vein of WSplit, Llainfair, and LiveSplit. There are plenty of split timers out there, but no really great ones on iOS or OS X. This was a gap I wanted to fill.
I wanted to make a split timer that is elegant, and makes use of native APIs and specifics to the platform. I used Autolayout, Core Data, 3D Touch, Watch Kit, UIKeyCommand, among other technologies.
I worked with my dad on the design for the app. We decided to go with a dark theme for the app to start out with. I usually prefer dark theme in apps (Tweetbot for one). A light version is definitely coming at some point in the future. Hoping system wide dark mode is coming in iOS 10!
In March I attended the try! Swift conference in Tokyo. There were lots of great speakers there, and I learned a lot of great tips there. One of which: protocols/extensions in Swift are really great!
I used protocols in my code to simplify two things: gradients on my custom UITableViewCells, and simple CoreData tables. They allowed me to save on repetitive code and slim down my View Controllers so they don’t become gigantic all encompassing monsters.
One of the hardest parts of developing the app was probably getting everything with Core Data working properly. It’s a pretty great framework, but the learning curve is quite high for a newbie like myself. And there’s a lot of tricky “gotchas” to manage with a persistence system. For example, at one point my app was taking seconds to load in each view because loading the split/route images from the core data store was blocking the UI thread. And I haven’t even gotten into the more advanced features of background thread management yet.
Developing the Apple Watch extension app was also an interesting experience. I wanted to make it as simple as possible, because otherwise you’ll honestly just reach for your phone because of the loading times on third party apps on the watch. Currently it just acts as a quick status indicator for the status of a run and you can preform actions such as Split, Pause, etc by the force touch menu. In the future I may consider adding more independent functionality to the watch app. But for now, I think it works quite well (as long as your phone is nearby).
This might not be the best idicator of activity since it includes library commits (I used 1 cocoapod, RSKImageCropper) and Storyboards which rack up line addition/deletions. But it gives a general idea of my activity on the project over time. Even though this project wasn’t conceived after the scholarship was announced, the past 2 weeks were still definitely a giant cram session to get things done on time.
<img class=”notfullwidthimage” src=”/assets/ZSplitIcon.png” alt=”Z Split app icon, Z on top of a clock background”
I plan to continue development of Z Split, and submit it to the App Store in the coming weeks. There’s tons of features that I want to add, cramming over the scholarship period basically got me to the minimum required featured set. Additional functionality I want to add includes:
Also I have a quite a few other ideas for apps to work on, and I will be open sourcing a OS X app I’ve been working on quite soon. Stay tuned. 😉
Even if I don’t win the scholarship, this was still an amazing experience, it was a great way to get me motivated!
", "url": "https://zekesnider.com/applying-to-the-wwdc-scholarship/", "image": "wwdc-submission.png", "date_published": "2016-05-03T02:13:40+00:00", "date_modified": "2016-05-03T02:13:40+00:00", "author": "" } ] }