This is more obvious when creating APIs, but it’s true of all code: Code is an interface. It’s what we interact with to do our jobs. Write code for humans, and let the compiler figure out how to make it fast (or go back and make it faster after it’s working — but always, ALWAYS keep it easy to read & understand!).
If your code is self-explanatory, you shouldn’t need many comments. If you find yourself adding lots of comments, see if you can re-name some variables or methods, remove some levels of indentation, etc, until it reads like plain English.
Annotations
I’m not a fan of “functional comments” (i.e. annotations), because they break the mental model of what docblocks are, and are for. It’s fine for them to provide hints to your IDE, or for auto-generating documentation, but they should not be used to provide actual functionality (e.g. marking a particular method as a test method).
Plain Old HTML
attributes are supposed to be surrounded by double-quotes, not singles. In php, this means you should enclose html in single quotes. When you do that, it doesn’t parse variables inside the single quotes. You need to end the quote first, like:
Always go for a long descriptive name over a short one that’s quick to type. Your IDE should auto-complete them for you, anyway.
Avoid having duplicate terms for same thing: home, house, building? Gateway_user_id, user_gateway_id. For more info, look at Domain Driven Design’s concept of “bounded contexts”.
There’s no need to name things $whateverObj. Everything should be an object. It’s assumed. If anything, use special naming for arrays, which should be fairly uncommon (opt for Objects & Collections instead).
URLs should map directly to controller & method names. Breaking that convention is ok if it enables re-use, but not “just because”. This makes tracing bug screenshots back to the relevant code much easier, many times a week.
URLs should be RESTful, meaning GET /users/ returns a list of all users, while POST /users/ creates a user, and GET /users/23 returns user 23, and PUT /users/23 updates user 23.
Controller and table names should be plural. Model names should be singular. Join tables should refer to the joined tables in alphabetical order, and each should be singular. For example, a table joining users and activities would be called: activity_user
Avoid names like $data. What KIND of data? What’s it for? Can we pass or return an actual object instead?
Avoid names like “prepareData”. What data? How are you preparing it? What are you going to do with it?
Avoid names like Helper. How does it help? What’s it doing, exactly? If it’s doing a bunch of stuff, it should be separate classes. If it is presenting something, call it a Presenter. If it is transforming something, call it a Transformer.
With objects & namespaces there’s no reason to put the object name in the method name:
.
api->apiRequest()
vs
api->request()
or
Customer.php->getPaymentGatewayCustomer()
vs
Customer.php->get()
Namespaces
Put the namespace in a use statement to reduce visual clutter in the code:
use App\Models\UserBillingDetails;
...
$details = UserBillingDetails::where(...)
If you want a more specific name than the class name, rename the class, or alias it:
use App\Models\UserBillingDetails as UserBillingDetailsModel;
Objects
You should be asking Objects to tell you about themselves, not inspecting the Object yourself. That’s rude! You don’t look inside someone’s tummy to see if they’re full. You ask them!
Before:
if(empty($object))
After:
if($object->isEmpty())
Use Objects, not arrays. You can’t enforce anything on arrays.
An object or method should never access anything outside itself directly, like $_SESSION, or DOM elements in JS functions. The object shouldn’t need to know about the structure of data outside itself. If you need to access outside data, pass it into the constructor, then call getters on that object. This simplifies testing, because it allows us to pass a fake or mock into the constructor, instead of the real thing. That makes it easier to isolate what you’re testing.
The parameters you pass into an object help explain what it’s doing, so pass in the parameters you directly need, not ones you indirectly need.
Before:
function methodName(Account $account){
$card = $account->getCard();
return $card->getTotal();
}
After:
function methodName(Card $card){
return $card->getTotal();
}
Constructors
Pass in any objects you’ll need access to, then assign them to properties. That’s dependency injection. It makes testing easier. An especially common thing people do is directly access the session from within an object. You should be passing it into the constructor, so you can swap it out for a fake session in automated tests. As another example, let’s say a Cart stores its items in Redis, but you want to be able to test it without Redis, by storing test data in a simple array instead:
Production:
$cart = new Cart(new RedisStore());
Testing:
$cart = new Cart(new ArrayStore());
Methods & Functions
Ending a function with “return;” should be very rare. Return a value!
Specify the Return Type, if you know what it’ll be.
public function getAccount() : Account
Don’t echo in a method. Return what you want to return and have the thing that receives it echo it. If you really want a method to output directly, create 2 methods. One that gets the output, and another that outputs it. That way the output data is available to other method, to be output in different ways.
If you always need to json_decode the return value you get back from a method, return it already json_decoded.
If you need to return mixed types, try to stick to: Array+Boolean+NULL, or JSON+Boolean+NULL, or Object+Boolean+NULL
If you need a value in many methods, pass it into the constructor, then access it via $this->varName
If you only need a value in 1 method, make it a parameter on that method, don’t pass it into the constructor.
Don’t pass in an array if you only need 1 or 2 values from it.
The function shouldn’t need to know about the structure of data outside itself. Instead, make those values specific parameters. It’s less error-prone, easier to follow, and allows your IDE to auto-complete.
function name(Account $account){
$card = $account->getCard();
}
vs
function name(Card $card){
...
}
Static Methods
Avoid them as much as possible, because they usually don’t take advantage of $this, which results in more parameters than you need, and in object state not being used… which just creates more work. If you’re using a lot of statics, you’re probably using objects as related groups of functions, and that’s not real Object Orientation.
Instead of returning [‘status’=>’ok’], send the appropriate HTTP response code: 200, 400, 404, 500, etc.
With Laravel, if a public controller method or Route returns an array, it’ll automatically json_encode it. You only need to return response()->json if you want to send an http response code other than 200.
Objects throw Exceptions, Controllers catch them and redirect appropriately. Flow control is controller’s job/responsibility. What does a controller control? Flow.
Controllers shouldn’t usually contain protected or private methods (unless it is a BaseController). Put reusable code in models or libraries. Controllers are for flow logic, not business logic.
Instead of doing queries in Controllers, put them in a method on the object you’re querying! Tidier & more reusable.
A model does not need to have a corresponding database table. It just needs to be a distinct unit of logic. It may just manipulate data, or work with an API, or whatever.
Try to avoid doing DB::table queries. Instead, use Eloquent’s methods. MANY are built-in. Save yourself some work.
For Laravel, read the documentation. It’s amazing how much functionality is built-in.
If you find yourself repeatedly writing queries that have “where site = %s”, try adding a Scope to your model, so you can just say: $model->site($site). It saves a bit of typing and is less error prone.
Sessions
Sessions are an HTTP thing. They should only be used/referenced in Controllers. Objects should receive them via constructor, or setter. Models should not be tied to session, because then you can’t use them offline, such as on the CLI, cron jobs, or queued jobs. Pass the state you need into the model, or set it on the model. Sometimes it can be a session, other times it can be an object or collection, as long as they obey the same Interface. Note: APIs, and the code inside them, should not use sessions at all. They are inherently stateless. Microservices are just APIs. If they’re using sessions, you’re doing it wrong.
Traits
There are 2 kinds of “use” statement. Outside codeblock in the header is for activating a namespace. Inside a codeblock before the constructor is for importing methods & properties from Traits.
Traits aren’t for sharing methods wherever you want. They’re for horizontal inheritance, which is otherwise impossible in PHP. It should make sense for the object using the Trait to have those methods. If not, simply instantiate an object that logically has those methods, and use that object inside the object you’re working on. Traits basically just make the compiler copy paste methods & properties into the classes that use them. Because it’s pasting, Traits shouldn’t include methods or properties that already exist in the objects that’ll use that Trait. It will be flagged as duplicate code, and the compiler will throw an exception.
Views
If you see a lot of conditionals and logic in a View, move it into the Model, and have the Controller get the result from the Model and push it into the View. For example, say you want to include a formatted price in the view. Instead of formatting it in the view, your Model could add a value to its collection called $collection->formatted_price, and you just pass that into the View. I’ve also seen that technique used to specify the class that should be on an item, like $collection->row_class=’danger’;
Miscellaneous
If something feels super-tricky, there’s probably an easier way. Ask around.
Never use extract(). It’s too non-obvious as to what variables it creates, and can lead to overwriting variables you didn’t mean to overwrite. This leads to errors, and unused variables, OR trying to use variables that don’t exist. It also makes your IDE freak out, highlighting the uses of the extracted variables as being undefined.
After a few years of being a manager, I’ve gone back to development. im working on a project using Laravel and Vue.js. its the first time I’ve touched the frontend in roughly 10 years… and WOW have things changed.
There are now multiple competing build tools and chains: gulp, grunt, npm, etc. Theres no winner yet. It feels like the early days of php.
But THANK GOD for Vue. Not having to deal with the DOM makes javascript bearable, and dare I say it, kind of fun. I still DETEST the compile step (which is why I went with php and not Java or C), but at least it’s relatively quick, and easy to setup and run.
Anyway, today I’m at GrumpyConf in Ingersoll. My first dev confrrence in ages. Having a great time :)
Nobody wants to lose their contacts, texts, music, documents, photos, & videos. Before 2000, I didn’t. Then I lost all my data, and it cost $2500 to get it back. That was just 40GB. Today I have 2000GB. I hate to think what that would cost to get back.
The only rule of backups you need to know is this:
If you have a Mac and an iPhone or iPad, here’s what to do:
iOS
Turn on iCloud Photo Library.
Turn on iCloud Backups. Yes, this costs money, but it’s SO much cheaper than paying to recover lost data, and much less painful than not being able to recovery any data at all.
Regularly sync & backup (turn on encrypted backups) your iOS device to your Mac.
macOS
Turn on iCloud Photo Library. If you have enough free space on your Mac, tell it to download the originals of all photos and videos. That’ll act as a backup of your iCloud Photo Library.
Sign up for Google Photos (free) and install their Sync tool. It won’t back up your photos and videos at their original resolution unless you pay, but the free plan still gives you high quality copies, and that’s much better than nothing.
Turn on iTunes Match, which will upload all your music into the cloud. This will also make it appear in the Music app on iOS. This can free up lots of space on your iOS device, because instead of syncing to music to the device, you can just stream your own music from the cloud through the Music app.
Turn on Document and Desktop Sync for macOS, but do not turn on Optimize Storage for macOS, because that actually prevents you from being able to backup your files! (It purges infrequently accessed files, so the only copy of them is in the cloud, therefore they won’t be copied to your backup drive).
Move all your documents into Dropbox. Note: This isn’t a backup, because if you delete your document from your Mac, it’s gone from Dropbox & iCloud too. Both Dropbox & iCloud only guard against losing or breaking your computer, not against mistakes.
Buy an external harddrive slightly larger than your Mac (if you have an external drive with data on it, buy an external that is slightly larger than your Mac and current external drive combined)
Buy SuperDuper and schedule it to run daily at noon. When it pops up, that’s your reminder to break for lunch.
If you want to go all-out, buy a 3rd external and use it as a TimeMachine drive. This is handy for hourly backups, which are useful when you do something you didn’t mean to do. It’s likely that a nightly backup isn’t recent enough to help you in these situations.
Install Backblaze, which will backup ALL your data offsite for just $5/mth. Tell it to backup your mac and your external data drive (if you have one), but not your external backup drive or TimeMachine drive. An offsite backup like Backblaze is critical because it’s the only thing that can protect you against flood and theft which would presumably also result in you losing your external backup drive(s). Plus, you never have to remember to run Backblaze. It’s just always running. That’s priceless.
This isn’t really backup-related, but please install and use a password manager, such as 1Password or LastPass. It saves you so much hassle. No more remembering, and it makes it easy to use a different secure password for each site or service. That keeps your private information safe.
In the past, I was mostly interested in UFOs and ghosts, with minor interests in bigfoot and conspiracy theories like 9/11, and the moon landing.
The new year has brought new interests!
In particular, a huuuuge interest in bigfoot, and the flat earth, and renewed interest in UFOs given recent statements by pentagon officials. These rabbit holes are truly deep. Expect a lot of blog posts on those topics in the coming days.
In 2016, a Citizen’s Hearing was held, with many governmental, military, and intelligence people testifying as to the reality of UFOs.
Video
Here are some key videos from that hearing:
Captain Robert Salas testifies that a UFO appeared above his installation, causing all 10 nuclear missiles to shutdown. This had never happened before, and has never happened since.
Gary Heseltine , a detective, reports on Police reports of UFOs.
In 2001, Dr. Steven M. Greer of CSETI held a similar event at the National Press Club in Washington. You can watch the 2 hour event on youtube, by searching 2001 National Press Club Disclosure Event.
In the last week, the New York Times has published several stories about UFOs. It’s important, because the people corroborating the stories are from the governmental, military, and intelligence communities. Keep in mind that a UFO is simply an unidentified object, not necessarily soemthing alien.
Story 1: Glowing Auras and ‘Black Money’: The Pentagon’s Mysterious U.F.O. Program
This story ran on the front page of the New York Times Sunday Edition on December 17th, 2017. The web version (published 20 hours earlier) contains 2 videos of UFOs recorded by US fighter jets, who had no ideas what they were. It is revealed that the US Government spent $22 Million over the past 10 years investigating UFOs. Here’s a CNN interview with one of the pilots. Furthermore, it states that metal alloys and other materials had been recovered from said unidentified aerial phenomena.
Story by Helene Cooper (NYT Pentagon Correspondant), Ralph Blumenthal, and Leslie Kean.
Story 2: 2 Navy Airment and an Object That ‘Accelerated Like Nothing I’ve Ever Seen’
This is a more extensive interview with one of the pilots from the previous article. At one point they state that the object travelled 40 miles in under a minute. It also alludes to the presence of a U.S.O. (unidentified submerged object). “It had no plumes, wings or rotors and outran our F-18s. I want to fly one.”
Story by Helene Cooper (NYT Pentagon Correspondant), Leslie Kean, and Ralph Blumenthal.
Story 3: On the Trail of a Secret Pentagon U.F.O. Program
This article is about how the previous 2 articles got the green-light to be written and published by the NYT. It contains additional background information on the Pentagon’s Advanced Aerospace Threat Identification Program.
Story by Ralph Blummenthal.
Regarding the authors of these stories, I have read Leslie Kean’s book “UFOs: Generals, Pilots, and Government Officials Go on the Record”, and I constantly recommend it as the best book on the subject. It contains nothing but testimony by the most credible witnesses possible. People who are trained observers, who we trust with nukes, and who stand to gain nothing but lose everything by testifying about the veracity of UFOs. If I were to recommend one more book on the topic, it would be Disclosure: Military and Government Witnesses Reveal the Greatest Secrets in Modern History by Dr. Steven M. Greer, M.D. Again, it is a book full of testimy by the most credible witnesses possible.
To The Stars Academy
Luis Elizondo, who ran the Pentagon UFO Program, only left that program a couple of months ago. Here’s a quick interview with him. He now works at the “To The Stars Academy of Arts and Science” (aka TTSAcademy), an organization whose goal is to work with the authorities to bring secret UFO information and technology to the people. The name “To The Stars Academy” sounds silly to me, but they have a serious roster of talented, credentialed people on their team. Earlier this year, they held a live event to introduce their team, and their intentions. Watch it here.
Bias (aka Follow The Money)
You should note that the name of this UFO Program was the “Advanced Aerospace Threat Identification Program”. The name alone predisposes people to believe that UFOs are threats.
CSETI Disagrees, says UFOs Not a Threat
If you’ve known me for a while, you know that I spent a week with Dr Steven M. Greer (Director, CSETI) in the high desert of Colorado, and experienced some weird stuff out there. He recently released a movie about what he knows, called “Unacknowledged”. It’s well worth watching on iTunes, Netflix, etc. Anyway, suffice it to say he’s a world-renowned expert on the topic of UFOs. His perspective is that the UFOs/ETs are friendly, and are here to help humanity advance. He says that if they wanted to harm us, they would have already wiped us out, and there’s nothing we could do about it, because they are SO far ahead of us, technologically. He’s worried that the Military is going to try to paint them as threats, in order to get more money flowing into military budgets. As soon as those UFO stories hit The Times, he sent out an email, which read:
URGENT: Note that the recent NY Times story is couched from a Threat office of the Pentagon: This a clear ramp up to False Flag FAKE disclosure designed to prepare people for a threat from outer space- so the War Mongers and War Profiteers have a new , bigger enemy . BEWARE
Meanwhile , Unacknowledged is being BLOCKED by media, no coverage even though it is the 2017 # 1 Documentary on iTunes and widely popular on Netflix etc. The secret government is manipulating a false disclosure and threat via their lackeys and ‘cut-outs’ . Stay tuned!
“UFO Researcher of the Year, 2017”, author of Sekret Machines and Gods, Man, & War, and former frontman of the band Blink182.
Jim Semivan, VP Operations
“Retired” senior intelligence service member of the CIA’s operations division. Currently an active consultant in the Intelligence Community.
Dr. Hal Puthoff, VP Science & Technology
An alumnus of SRI, the NSA, GE, and Sperry, he regularly advises NASA, the Department of Defense, and various intelligence agencies. He’s an expert in electron-beam devices, lasers, energy fields, and space propulsion. He ran a program to investigate paranormal abilities for SRI, focusing on Remote Viewing more info
Steve Justice, Director of Aerospace
“Retired” Program Director for Advanced Systems at the Lockheed Martin Advanced Development Program (aka Skunk Works, aka super-experimental top-secret stuff).
Luis Elizondon, Director of Global Security & Special Programs
An alumnus of the U.S. Army, the Department of Defense, the National Counterintelligence Executive, and the Director of National Intelligence, and Director for the National Programs Special Management Staff. For the past 10 years, he ran a sensitive aerospace threat identification program at the Pentagon, focusing on UFOs.
Chris Mellon, National Security Affairs Advisor
Chair of the Science Committee at the Carnegie Museum of Natual History, former Deputy Assistant Secretary of Defense for Intelligence and Minority Staff Director of the Senate Select Committee on Intelligence. He has received multiple awards from the Department of Defense and agencies of the US Intelligence Community.
Dr. Garry Nolan, Genetics Technologies
A Professor in the Department of Microbiology and Immunology at Stanford University School of Medicine. He has published more than 220 research articles and is the holder of 20 US patents, has been honored as one of the top 25 inventors at Stanford University and is the first recipient of the Teal Innovator Award (2012) from the Department of Defense.
Dr. Paul Rapp, Brain Function & Consciousness
Professor of Military and Emergency Medicine, Professor of Medical and Clinical Psychology, former editor of Physica, holds degrees in Physiology (minor in Chemistry), and Engineering Physics, and a Ph.D in Applied Mathematics and Theoretical Physics.
Dr. Norm Kahn, National Security & Program Management
National Security consultant for the US Government, with a focus on biological weapons of mass destruction. A 30-year veteran of the CIA, he created its Counter-Biological Weapons Program. Recipient of the CIA’s Distinguished Career Intelligence Medal and the Director of National Intelligence’s National Intelligence Distinguished Service Medal.
Dr. Colm Kelleher, Biotech
Does micro-biology for the Deartment of Defense. Former Deputy Director of the National Institute for Discovery Science, a research organization using forensic science methodology to unravel scientific anomalies. Former Deputy Administrator of a US government funded threat assessment program focused on advanced aerospace technology.
Dr. Adele Gilpin, Biomedical Research & Law
Licensed attorney, and medical scientist, focusing on FDA regulated products such as medical devices and pharmaceuticals.
Man, that was a kick-ass keynote. SO much stuff was mentioned! But you know what? Some stuff that wasn’t mentioned still happened, and I’ve pored over the word-clouds from the keynote, and bits of documentation to bring you this list of unmentionables:
Streamlined family setup
iCloud Family storage sharing
iCloud Family Apple Music
iCloud file sharing
iCloud remote backup (is this TimeMachine in the Cloud?)
Apple TV home screen sync across multiple Apple TVs
“Proactive” (a key feature of iOS 10) has been rebranded as Siri
A “Type to Siri” accessibility option on iOS
Screen recorder in Control Centre on iOS
We didn’t get iCloud Family Photo Libraries, but the groundwork has been laid. There was also no mention of how (Vocal ID?) multiple users will be accommodated by HomePod.
P.S. - now I want an iPad Pro, but 256GB 10.5” with Wi-Fi+Cellular and Pencil and Smart Keyboard Cover and AppleCare+ is $1617 CAD. Ouch!
In late 2016 Apple stated that they’d be getting more into Podcasting. They have pre-announced that for the first time there will be podcast booths available for use at WWDC. I think it’s not just a nice gesture, but a place to try out a new piece of software designed for facilitating podcasts. My guess is that it’d be called Podcast Studio, and would free podcasters from having to use Skype for all of their remote guests. Apple loves to contribute where they can make a real impact, and podcasting definitely needs a good alternative to Skype.
I think we’ll finally see Family Photo Libraries. If you have Family Sharing, you can simply go in and say who has access to which Photo Libraries. In the Camera App, there’ll be a Library Selector/Picker. Whichever one you have selected is where the photos you take will be uploaded. You can move them from library to library in the Photos app on iOS or macOS. Users will be able to list photos in a single library, or see all libraries at once in a single timeline. This will require having a Family iCloud Storage Pool (e.g. 1TB shared across 5 iCloud accounts/Apple IDs).
I expect to see the debut of Vocal ID / Voice ID. This will be crucial for any Alexa competitor, and it will simple account switching on Apple TV, iPad, and even macOS.
Lastly, I think Apple may reverse course on its statement that touchscreen macs are a bad idea due to ergonomics. When using an iPad Pro with a keyboard, it basically is a Mac with touch screen. It is a primarily-touch device, with some clicking. I believe there’s room for a primarily-click device, with some touching. It wouldn’t be for fine-grained control, but broader motions like swipes/gestures & certain actions like pinch, pan, scroll, highlight/select.
Along the same lines of thinking, they already brought a TouchBar to the Mac. I think they might take Rene Ritchie & John Gruber’s advice and bring a ClickBar to the iPad.
As a team-focused manager, there are a few things that I find quite difficult:
Convincing your team to trust in short term pain for long term gain
Handling personality conflicts, because there’s not much people can do about their innate personalities
Losing people
My favourite part of the job is the regular 1-on-1 meetings I have with my team. I learn all about them; their families, habits, likes & dislikes, and that helps me be a better manager. It also helps them open up to me when there is a real problem that needs to be remedied. This means we get close. Closer than most bosses & employees, which is great, until someone decides to leave.
It’s like losing a close friend. I know it’s nothing personal, but that doesn’t prevent me from wondering if there’s something I could have done. I’m the leader, right? So it must have been
Something I did, or didn’t do, that made this person want to leave. That feeling is horrible.
I spend a good long time finding and choosing the right people to add to my team, so losing one is always bad. It throws everything off balance, and changes the dynamic… and in general, it’s just kind of a bummer.
I don’t have a solution to this. People gonna change. Needs gonna change. That’s life. But what I’m not going to do is stop investing in these relationships. Taking my emotions out of the equation would make things much easier, but that’s not the kind of world I want to live in. I want a warm world where people care, even if it’s inconvenient. I want a world where people love, even if that means risking hurt.
Ula got me the PSRV for my 40th birthday. I played with it for a couple of hours last night, and it was fucking amazing.
While it might not be as clear & crisp as the Vive or Oculus CV1, it is WAY more clear & crisp than the Oculus DK1 that I had, and the tracking is far superior.
I was honestly blown away.
The PSVR comes with 2 discs. One contains “VR Worlds”, a collection of 5 experiences built specifically to demonstrate the abilities of the PSVR, and the other contains 9 demo versions of PSVR games that are available for purchase. When you install the PSVR (which has many, many wires and dongles), a free download also appears on your PS4, called “Playgrounds”. I haven’t tried that yet.
Anyway, when you start “VR Worlds”, you are in something like a Roman or Greek temple. There are the titles of games surrounding you. There’s a DualShock4 controller floating in mid-air in front of you. When you move the one in your real hands, the one in mid-air moves in exact correspondence. There’s also an orb, floating in front of the controller. You can bump it with the controller, and the orb reacts, and the controller rumbles. It’s great. The appearance of the orb changes depending on which game you have selected. I played as many of them as I could last night.
** Danger Ball
I haven’t tried this one yet. Looking forward to it tonight.
** Ocean Descent - Shark Encounter
This was the first one I tried, and MAN, was that ever a great experience. It was probably the perfect “first experience”. You are being lowered down into the depts of the ocean inside a shark cage. You get to see lots of marine life swimming around you, while a sense of tension is building. I could feel my heartbeat picking up the pace. When he shark did finally attack, yes, I actually jumped in my chair.
** The London Heist
You plan a diamond heist in a smokey bar. You steal the diamond. You shoot your way out of the place. You escape. You rip off your friends. They catch you and torture you. It’s amazing. In the smokey bar, you can get right up in the guy’s face and look at his wrinkles. You can light your cigar and smoke it, and it feels totally natural. I actually found myself exhaling in real life. You answer a cell phone call by putting it up to your ear. You shoot a guy by holding the controller like a gun, aiming it like a gun, and pulling the trigger. One time I didn’t stand up because I thought I couldn’t because a piece of (virtual) metal was in my way.
** VR Luge
Tilt your head, and the luge turns in that direction. Very simple. Kinda fun. Boring after 5 minutes.
** Scavengers Odyssey
Pilot a mech around inside a ship, and jumping from asteroid to asteroid. Pretty fun, but induced a little motion-sickness.
I felt a little weird after playing for 90 minutes. Hot. My eyes and brain? felt a little weird. Falling asleep was difficult. I don’t know what to call this feeling. VR-hangover? Hopefully I just become accustomed to it over time, and the feeling subsides.
Today is my 40th birthday. On this day, every year for the past… ohhh, 30 years, I have said to myself “By this time next year I want to be skinny”. I have yet to achieve that… but this year I have real hope of being able to do it!
It’s Day 8 of my Fast5 lifestyle, and I’m still going strong. My hunger and cravings really went away on day 5. It has been much easier since then. I am very alert all day. No cognitive fog at all, and no crash mid-afternoon. I have more time in the morning to help get Claire fed and ready for the day. I have more time at noon to do whatever I want. I hope to start walking during that time. Not to lose weight, but just to get outside.
The only exceptions I’m making to the diet are:
1) If it’s a family holiday or special event, I can eat on a regular schedule.
2) I can go out for breakfast once on the weekend.
I believe that being able to do those things guilt-free, because they were rules I pre-established, will be key to maintaining this lifestyle for the long run.
I have also tried to start incorporating a special drink into my diet. Once a day, 750ml of water containing 4 tsp of apple cider vinegar (with the mother), and 2 tsp of lemon juice. It tastes a bit vinegary, but if you look it up you’ll see that it has many healthy effects.
Bonus: the swelling in my leg & ankle is down to almost nothing, for the first time since I broke it in 2004. I mean, there have been other times, but the cause of the decrease wasn’t known, and the effect wasn’t sustained.
By this time next year I want to weigh less than what I weighed almost 10 years ago when I met Ula, and even a bit less than what I weighed 17 years ago in university :)
Did I mention that I can’t get a kidney transplant until I lose 100lbs? Yeah. So… in addition to wanting to lose weight to be able to play with Claire, there is some extra life-saving motivation.
I’m trying the Fast5 diet & hopefully lifestyle. It’s super simple: eat within 5 consecutive hours. Outside that window, don’t eat & only drink water, tea, & black coffee.
I. The past I’ve tried to not eat after dinner (at 5pm) and it hasn’t worked. I’m always hungry later. Fast5 suggests that your 5 hour window be from 5pm-10pm, and that sounded perfect to me. I can still have dinner with my family, and snacks while watching TV or movies! Sure, skipping breakfast & lunch will be tricky, but it’s worth a try.
I’m done day 3 now, and it hasn’t been too difficult. Surprisingly, I feel more alert, I don’t have any crashes during the day, and my mood is better than usual! Good stuff! I’m also finding that I feel full more quickly, so even when I’m allowed to eat whatever, I don’t eat that much. I don’t feel deprived. I think I can do this :)
Big Mac,
McDLT,
a Quarter-Pounder with some cheese,
Filet-O-Fish,
a hamburger,
a cheeseburger,
a Happy Meal.
McNuggets,
tasty golden french fries,
regular or larger size,
and salads: chef salad or garden,
or a chicken salad oriental.
Big Big Breakfast,
Egg McMuffin,
hot hot cakes,
and sausage.
Maybe biscuits,
bacon, egg and cheese,
a sausage,
danish,
hash browns too.
And for dessert
hot apple pies,
and sundaes
three varieties,
a soft-serve cone,
three kinds of shakes,
and chocolatey chip cookies.
And to drink a Coca-Cola,
Diet Coke, and orange drink,
A Sprite and coffee, decaf too,
A low fat milk, also an orange juice.
I love McDonald’s, good time great taste,
and I get this all at one place…
I have a bad habit of not attempting things that I feel I could potentially fail at. I believe this is one of the reasons for the success that I have in my life, such as it is. BUT it’s also the reason I don’t have more success. It’s why I haven’t launched any of the umpteen web apps & services I’ve built over the years. It’s why I procrastinated for so long on creating the London PHP Meetup.
I used to make a habit of tackling these sorts of fears head-on. For example, throughout high school and university I was deathly afraid of public speaking, and believed I had a poor memory. To combat that I auditioned for the play Hamlet and got the part of Claudius. I had to memorize over 600 lines, and it took over 3 hours to perform, 3 nights in a row. It completely eliminated my fear, and I even got a shout out in the local newspaper for having given a good performance. I’ve continued to speak publicly since then, at developer conferences and meetups, but I haven’t tackled other things that are actually holding me back.
That changes on Monday. Ever since I started receiving and paying for student loans, I have had a mental block against spreadsheets and numbers (and unexpected phone calls).
At work, I have had to get comfortable with the phone, as I am doing some account management these days, in addition to all the one-on-one meetings I do with my team. So what about spreadsheets and numbers?
Well, as of Monday our 30 person company’s sole Project Manager is going on a leave of absence for 8 weeks, and I’m adding his duties to mine until he gets back.
That means I’m scheduling everyone’s work, tracking everyone’s hours, calculating anticipated vs realized revenue, figuring out our WIP numbers, and lots more. If I screw up, it could be disastrous. Nothing quite like jumping into the deep end to teach yourself how to swim.
You may have noticed that I rarely update my blog. Part of that is that it’s running on Wordpress, and every time I login, I see a message that says there’s a new version, or some plug-in needs updating, or there are comments awaiting moderation, and most of them are spam anyway. It’s just easier to not blog.
I’ve decided to give it another try, on a new blogging system. For quite some time now, I have been meaning to start writing everything I write in markdown. Markdown is just plain text, but you can transform it into html quite easily. I want plain text, because it lasts forever. I can no longer open the Wordperfect files I wrote in grade 9, but I can open the text files just fine. They’re durable.
So, I wanted the new system to allow me to write in markdown, and render in html. Thankfully, there are lots of systems that can do this. One of the great benefits is that I can write markdown in any number of fantastic applications, from TextEdit, to BBEdit, to PHPStorm, to what I’m using right now — iA Writer.
Because I was a PHP developer for 15 years, I also wanted the system to be written in PHP, so that I can modify it if I want to. Lately I’ve been using Laravel, so I thought I’d give bonus points if the blogging system was written in Laravel.
Another requirement was that I wanted no PHP dependencies on the machine I’m writing on, because it could be my iPhone, which can’t run PHP. All of the markdown-to-html conversion should be done entirely on the server. I don’t want to transform it here, and send the transformed text to the server. That’s too much overhead for me.
I also wanted to be able to publish simply by saving the markdown file to Dropbox. Yep, that’s a thing you can do. That means there is NO admin panel for your website. There’s not even a login/password. You manage it through your Dropbox.
The final requirement, which I only came up with right near the end was “as simple as possible”. I figured, the less there is to go wrong, the more likely I am to actually blog instead of spending time working on my blog.
After a lot of googling, I narrowed the list of finalists to 3:
Statamic - written in PHP using Laravel, it has a billion features, is super-slick, has great documentation (including how-to videos) and support, and costs $199 USD.
Kirby - written in PHP, it has a billion features, is only slightly less slick looking, has great documentation and support, and costs $17 USD.
SecondCrack - written in PHP, not slick at all, has next to no documentation, zero support, is a bit buggy, and costs $0 USD.
Despite all its flaws, I chose SecondCrack. It really is just the simplest system. Here’s my favourite section of its documentation:
Why doesn’t it have [feature]?
Because I didn’t think [feature] needed to be there.
Comments: Use Disqus or Facebook comments. Or just go without comments. Do you really need them?
Stats: Use Google Analytics or Mint. (Or both.)
Widgets and dynamic page content: Use Javascript.
Dynamic rendering for automatic mobile layouts, etc.: Use CSS.
What’s so good about that? It doesn’t try to be everything to everyone. That means it’s a much simpler system. It also encourages using the right tool for the job.
You know what I hate about React.js? That it smooshes javascript, css, and html into a single thing. It makes me feel gross just talking about it. SecondCrack doesn’t do that, and I love it for it.
Unfortunately, there was no easy way to get your content out of Wordpress and into SecondCrack, so I had to make one: wp2secondcrack converter.
All you do is export your Wordpress to XML (that’s built-in to wordpress), and then run my converter on it, and you’ll have a complete set of markdown files; one for each blog post or page. Then you just put them in your secondcrack “posts” folder, and that’s it.
Anyway, yay. The blog is back!
P.S. - yes, it’s super-ugly right now. I’ll fix that soon enough.
I’m willing to bet that you could attach an iPad Pro to a MacBook Pro, where the screen would normally go. You could un-dock the iPad and use it as an iPad, or dock it and it becomes the Retina Display for the MacBook Pro.
It would be 1 device, made of 2 devices, running 2 operating systems, and syncing files via iCloud or Bluetooth/Wi-Fi. What you’re doing could be sustained from device to device upon dock/undock via Continuity’s Handoff & Universal Clipboard. PowerNap and other background services could keep both devices in constant sync.
This would require “Super-Universal” apps, that contain both Intel/macOS and ARM/iOS versions, but it might be doable.
What are the advantages? It truly means no compromises. iOS+iPad for some tasks, macOS+MacBook for other tasks. Power when & where you need it. Maybe those devices could delegate tasks to one another for off-board processing. The MacBook wouldn’t need to contain speakers, because the iPad would contain the speakers. This would leave more room in the MacBook for additional battery.
Maybe you could mix & match the individual pieces: iPad Air & MacBook Air iPad Pro & MacBook Pro
How would they market it? Maybe call it a MacBook Plus? or dare I say it… an iBook?
It would also help increase iPad sales. It’s a natural coupling, too, since the iPad and Mac sales cycles seem to be similar, which is to say, much less frequent than iPhone upgrade cycles.
It’s just a thought… but I think it’s an interesting one.
I would like to see the MacBook Air line go away, and be replaced by just the MacBook line (13”), and the MacBook Pro line (13” & 15”).
Potential “One more thing”: external 27” Retina display with wide colour gamut and TrueTone, with AirPlay receiver built-in.
Wild cards: new Mac Pro, Mac Mini, iMac. Detachable keyboard. 3D Touch support, e-ink keyboard.
I think this is coming sometime, but I have no evidence to support it: Siri switch replacements with built-in proximity sensors, iBeacons, and microphones. They replace a light switch, are electricity powered, always on, and always listening. They make Siri omnipresent and reactive.
Comments from my old blog:
(Derek)[http://www.derekmartin.ca] said: Well, looks like I scored about 4 out of 20 on that one:
- Touch ID
- OLED Magic Toolbar
- Much beefier speakers
- USB-C & Thunderbolt 3 at 2016-10-27 19:29:33
What’s in store for the future of HomeKit? Right now, the clunkiest bit is if you walk into a room and want the lights to come on, you either have to activate Siri on your watch or phone, or you have to get to the physical switch and turn them on. This could be better. The lights could just come on. For this reason, I think iBeacons are about to finally become commonplace. They’ll detect the proximity of a watch, or Mac, or iOS device, and activate a particular light, or scene. This is better than motion sensors because iBeacons have a sense of your identity. As a simple example, it could turn a room’s lights blue for me, but purple for my sister.
About 10 years ago there was this concept of “data emitters”. Things you put around you in the room that expose information. At the time, they connected via USB. Now they can be connected via Wi-Fi, and/or your electrical grid. For example, if your stocks are up, your house lighting could turn green. If a smoke detector is going off, or motion was detected at night, or you left the door unlocked, or the oven on, all the lights could flash red.
One thing to consider when purchasing HomeKit lighting, the main thing you need to consider is whether you want colour changing lights or not. If you don’t, I can highly recommend the Lutron Caséta line of in-wall dimmers and remotes. They’re the ones that have worked flawlessly for me. The best thing about them is that you wire them into the house. This means that someone can’t turn off the switch, and make it so that your lights are no longer controllable via HomeKit. That can be very frustrating.
Up until recently, that’s exactly how Philips Hue lights worked. Thanks to a new wall dimmer from Philips, you can now get around this in 2 easy steps: 1) Remove your existing wall switch, hard-wire the connection to on, and cover it with a faceplate. 2) Stick the new wireless wall dimmer to the faceplate. Now nobody can turn off the light except via HomeKit or that wireless switch, which just triggers the appropriate HomeKit action.
P.S. - Looks like I was right about how Apple would do Siri APIs :)
Change iOS to allow you to set default apps for certain use cases
Apple creates full sets of Siri APIs for each use case (for example: a set of APIs for managing ToDo lists)
Apple makes all of its own apps implement those APIs. By default, Siri will use the Apple app for any task.
You can write an app that implements the entire API.
Users can choose to set your app as the default for that use case instead of Apple’s app (e.g. use Omnifocus for ToDo, instead of Reminders)
In other words, you won’t be able to make your own commands. You’ll only be able to do what Apple has already created APIs for. This keeps Apple in control of Siri, and affords them the maximum ability to tweak and change things as they go along.
Potential API use cases Apple would need to implement: todo, calendaring, music, video, phone, email, instant messaging, video calling, timers, photos/cameras, health.