In my free time I play a lot of video games, on a variety of platforms, but I have strong opinions about which ones are “best”. I have done my best to keep gaming-specific items in a separate section.
I’m grateful and privileged to be well employed and capable of buying quality gear. I appreciate that not everyone can afford such luxuries. I hope that someday the world will have enough social safety nets and universal benefits that everyone could have the same opportunities. #unionize
]]>You can find the episode in your podcast app of choice, or listen right here:
]]>This year, we have been building a new linter, Fixit 2, designed from the ground up to make developers more efficient and capable, both in open source projects and the diverse landscape of our internal monorepo. At Meta, we are using Fixit 2 with a few early adopters, and plan to roll it out to the rest of our monorepo soon. But any developer can use it to perform auto-fixing more efficiently and make faster improvements to their own codebases.
Something I don’t get to talk about enough is just how much I truly appreciate the ability to spend my time at Meta solving problems with open source, and that I can share my work with the rest of the world. Fixit is the third open source project that I’ve had the privilege of releasing at Meta, and I believe Fixit makes it easier than ever before to build new lint rules for Python, a powerful tool for any Python team.
Writing a new lint rule can be done with less than a dozen lines of code, and test cases are defined inline. You can even place it right next to the code that it will be linting:
# teambread/rules/hollywood.py import fixit import libcst class HollywoodName(fixit.LintRule): VALID = [...] # no lint errors here INVALID = [...] # bad code samples here def visit_SimpleString(self, node: libcst.SimpleString): if node.value in ('"Paul"', "'Paul'"): self.report(node, "It's underbaked!")
Unlike other new linters on the market, Fixit is uniquely focused on reducing the barriers to writing high quality, auto-fixing lint rules in pure Python, without needing to learn Rust or any other language. We believe that having targeted lint rules with auto-fixes is key to improving developer productivity even more than having the fastest possible linter:
When running Fixit 2 with auto-fixing lint rules, any code that triggers the lint rule is an opportunity to get an automatic replacement, improving the codebase with less effort from the developer. Applied more broadly, Fixit 2 can even be used as a tool to enact sweeping codemods against a large codebase while leaving a lint rule in place to handle any matching code in the future.
Fixit 2 is already available on PyPI.
You can pip install fixit
and start using it with zero configuration.
]]>We have a roadmap with plans for future improvements and features, and a rich set of documentation and user guides to help you get started with Fixit 2 in your own projects or repositories.
I am a trans woman — wife, cat mom, daughter, and sister. This is who I am.
I started this journey over four years ago, but the difficult parts have only just begun. I greatly appreciate all of your love and support.
Thank you! 💜
]]>It turned out to actually be “PyCon Talk on Hard Mode” instead, because nothing went right.
It’s March, and I’m writing my talk. I care enough about style, typography, and legibility that I need tight control over fonts and themes. I lean heavily on Keynote and Adobe Fonts, with screenshots of oversized 42pt type in my editor of choice to get the best results.
And because I’m never good at extemporaneous speaking, I write a full script ahead of time, and keep that script in the speaker notes, so that in the worst case, I can fall back to orator mode. This all means I need tight control over the device that I’m presenting from.
But the only laptop I have is my employer’s, where installing fonts is complicated and a grey area that would require mixing my personal Adobe account with professional work tools. Every other device I own is a desktop, tablet, or phone.
Even more, I’ve never liked having to bring a big bag and heavy laptop just to give a presentation. Carrying four pounds of gear around all day sucks, and I’d much prefer something small and light enough to fit in my everyday bag.
That’s when I get The Idea:
“Why not give the talk using my iPad Mini?”
Modern iOS includes Keynote, and I can use the Adobe app to install my fonts system-wide, just like on my Mac, and Keynote can use them perfectly fine.
I pulled out my USB-C HDMI dongle, and while normally the iPad just mirrors the device over HDMI, Keynote will actually show the slides at full screen over HDMI, while showing the presenter notes on the iPad itself, just like a laptop. It would even render 16:9 when presenting!
I double check on my monitor’s input stats, and it’s outputting a 1440p signal. This might actually work!
It can’t be this easy, right? Am I crazy?
Seriously considering giving my PyCon talk using just an iPad and leaving my laptop at home. 👀
— Amethyst Reese ✊🏳️🌈🏳️⚧️ (@n7cmdr) March 29, 2022
I tried it with other monitors and my TV, and it seemed flawless. I did full dry runs using my iPad, and even paired my trackpad and keyboard to the iPad and edited the rest of the talk on the iPad. I was convinced I wouldn’t need my laptop.
A week before the event, I committed.
We fly to SLC, and I’m continuing to practice—and edit—my talk on the iPad. The morning of the talk, I immediately head to the green room and test my setup.
No issues.
This is actually happening!
I come back after lunch. The volunteer walks me to the room I’m presenting in.
I say hi to the staff, drop off my bag, get mic’ed up, walk up to the podium, plug in HDMI, trigger Keynote, and …
The A/V system is only rendering my slides on the left half of the screen, squashed into the wrong aspect ratio.
It’s OK, we’ll just unplug and re-plug.
But no matter what I or the A/V staff do, my slides won’t show up correctly.
We delay the start of the talk; people are still filing in bit by bit. The host tries to lighten the mood and asks me a couple filler questions to stall for time.
Time flies while we’re desperately waiting to see if this can get fixed. Before I know it, it’s about 8 minutes past the original start time, and the host asks if I just want to get started anyways.
I say yes, because bad slides are at least better than no slides—or no talk.
Now, my topic was intentionally broad in scope, and I had a lot to cover. I had already planned to talk fast to get through everything. During rehearsals, I cut content so that I could consistently finish at almost exactly the 30 minute time slot.
But now I’m already behind.
I had Keynote set up to show me a timer, so I would know how I was doing on time. Ten minutes into the talk, and the host is already showing me the “15 minutes left” card. I’m talking as fast as I can, but also stumbling under the pressure. I’ve gone from speaking to reading.
At 13 minutes, an A/V expert manages to fix the output of my slides, but it’s too late for the demo of “thx” that I was the most excited to share. I wouldn’t find out that they were fixed until much later. Nothing mattered if I couldn’t finish the talk.
Moments later and they show me the “10 minutes left” card. They’re not giving me the full half hour. I start dropping phrases or sentences where I can to make up. I don’t think I’ve ever talked this fast in my life.
At 18 minutes, they give me the “5 minute warning”.
I make it to the final section (well ahead of my original expected pace, mind you) and get the STOP card. I power through 8 slides in 40 seconds, but the “ums” return as I have to make it all up on the spot.
I close out the talk with a total runtime of just about 26 minutes.
The polite applause starts, and I manage to get myself off stage with a shred of dignity in tact. As they’re removing the mic, I thank and apologize to the A/V crew for causing so many problems. 😅
I find out that—for reasons I will never understand—the iPad was only negotiating a resolution of 1080i (interlacing!) instead of the 1080p that their system was expecting.
Why 1080i? Because technology!
And why did that break the A/V layout? No idea.
But thankfully, even after my mediocre delivery, the smashed slides, and flickering output, there were still folks that stopped by to say hello, compliment my talk, and ask questions. Sadly, my brain was toast, so I have little memory of who they were or what we talked about. 😓
I don’t know if I’ll have the opportunity to give this talk again in the future, but I’m planning to re-record it at home soon. Maybe I can talk at a more reasonable pace, and actually make it through with all of my content in one piece.
But there’s one thing I know I’m doing the next time a talk gets selected for PyCon, or any of the wonderful regional conferences I love attending:
I’m using my iPad to present! 💪
]]>Listen in Overcast, any podcast player, or right here:
]]>And if that was too slow, don’t miss the shorter rendition of this talk that I gave at PyCascades 2020, right before COVID ruined everything.
]]>This is difficult for me to say publicly. I’ve been trying to find the right time and the right words for over a year now.
Most of my life, I’ve known deep down that I didn’t fit into the traditional male gender role or expectations, even if I didn’t understand what that meant. I was often insulted, ridiculed, or harassed on a regular basis for being myself. I learned through trial by error how to “blend in”, and suppressed other emotions or behaviors for fear of how I would be perceived by everyone else. There wasn’t a lot of introspection involved–just reactions to external judgement. Without the vast array of media that’s now become available to everyone these days, I don’t know that I could have fully understood who I was even if I’d tried. I just didn’t have the conceptual framework or cognitive tools necessary to unpack notions of gender roles, let alone to analyze how they affected me or my own position within them.
But now I do, and I’ve become more aware of who I’ve been all along. The past few years have been a slow awakening and acknowledgement of how I feel and what truly makes me feel happy. It’s complicated, and I don’t claim to have a full definition of who I am, but I like to believe it includes some combination of courage, femininity, intelligence, empathy, and emotional strength. I’ve started to embrace this in what I wear and how I express myself as a person. I’ve bought and worn more “women’s” clothes, shoes, and accessories in the past two years than traditional “masculine” items, and it’s been absolutely liberating. Some of my closest coworkers, friends, and family have seen a small number of these over the past couple years, but I suspect most have not realized what they were seeing, because they only see what I’ve been willing–or felt safe enough–to share with the rest of the world.
I live in daily fear that expressing my true self in public may result in uncomfortable, dangerous, or even deadly consequences. Transgender, non-binary, and queer people face incredible risk in our society, just trying to live as who we are. As we become more visible in society, the number of hate crimes being committed against us is increasing. Even in progressive areas, I’ve witnessed name calling and harassment of queer people by bigots who thrive on intimidation and violence. This is absolutely unacceptable in our society, but it “works”; fear is an effective tactic. I’ve refused to wear overtly feminine clothes in public, because no matter how many allies I have in this world, it only takes one asshole to ruin–or end–my life, and I can’t know who they are until it’s too late.
Coming out here won’t change that. I already expect to see harassment–or at least be treated differently–by those who read this. I’m prepared to delete comments, and block people online or in real life, that refuse to accept me for who I am. Being visibly queer will most likely carry a stigma and risk for the rest of my life, but maybe it will also let me be more comfortable around those that do accept me, and that alone will be worth it to me. I don’t know if I’ll ever feel safe being myself in public, but I’m fortunate to now have a full-time remote position at one of the most diverse and accepting companies I’ve ever seen, increasing the time I can spend with my best friend, being the person I’ve always been. Over time, I’m sure that how I express myself will change and adapt as I learn more about myself and what makes me happy. I hope that some day I can feel safe enough to share more of my authentic self in public as well.
I’m truly thankful to have an amazing best friend, wife, and soul mate in Ember, who truly accepts and embraces me for who I am. She is, and always will be, the love of my life. At every step of this journey, she has been my rock and my guiding star, and I will never be able to express just how much it means to have her support.
I would also like to thank my friends, coworkers, and every other visible queer person I know that took these steps before me, so that I can more easily understand who I am and who I want to be.
]]>A short quote, and timely announcement:
I’m currently preparing a talk for PyCon 2018 on using asyncio with multiprocessing for highly-parallel monitoring and/or scraping workloads. To go with this talk, I’m working on some simple example code that I hope to publish on Github. This will be my first major conference talk, so I’m both excited and absolutely terrified! 😅
I’m looking forward to giving that talk, and will post a video here afterwards!
]]>And damn, it’s good!
The discipline and focus of the team at Frontier Development has produced one of the most polished space sim games I’ve ever played, and while there are plenty of gaps in features compared to the competition, everything that’s there is done so well that I continue to be impressed every time I get in that cockpit and launch into the void.
After putting dozens of hours into the final release, I’ve gathered a few notes here that will hopefully help others in their journies to the stars. I will attempt to keep this up to date for as long as I’m playing the game.
]]>I’ve spent countless hours dreaming of visiting the planets and stars of our universe: in games like Wing Commander, Freespace, Freelancer, Mass Effect, and X3, exploring fictional galaxies, and in Orbiter Sim, recreating my own journeys to the planets and moons of our own solar system. I can’t wait for Star Citizen and X Rebirth to give me further ways to escape the confines of Earth and experience worlds that I will never be able to visit otherwise.
And I have NASA to thank for inspiring so many of these wonderful outlets, from the Mercury, Gemini, and Apollo projects that took us to the Moon, the Voyager missions for showing us just how beautiful our own back yard really is, to the Mars rovers for exploring our closest neighbor, and to future NASA missions like New Horizons that are leading the way towards understanding our tiny place in this vast universe.
Today, it was finally confirmed that Voyager 1 has indeed crossed the boundary of the heliosphere and forever left our solar system behind.
Wow.
I simply find it incredible that not only is Voyager still working after four decades of exceptional service, but that it’s still capable of aiming its antennas at Earth, sending a coherent signal using only 23W of power, and actually sending useful data back to us. That alone is a hugely amazing achievement, and I think everyone at NASA should be eternally proud of their accomplishment. The fact that we now have even more data points regarding the boundaries of our solar system is just pure icing on top of that cake, and I congratulate everyone involved in the project.
If you asked me what my favorite spacecraft is, fictional or not, it wouldn’t be the Enterprise, the Millenium Falcon, the Normandy, or even the Apollo rockets; it would be Voyager. And it will forever hold a special place in my heart.
So thank you, NASA. Thank you.
]]>I set out to write an article about how I feel Android provides unique affordances that create a unique cohesive mobile experience (more on that below) rather than talking openness, features and apps. However, the more time I spent living with Android it became obvious that being able to do anything and suit a variety of needs is a pillar of the Android experience.
I was trying to find out why Android felt so remarkably different to use, beyond aesthetics. I found there are a few pieces that help contribute to this magical user experience: the global back button, intents and Google Now.
Delight. It’s what designers strive to produce in the experiences they craft. Google Now has hit the nail on the head. I can’t even count the number of times friends have pulled out their phone to show me the smart things Google Now did for them.
Using Android feels like one fluid experience.
And it just keeps getting better and better!
]]>My immediate response to change of removing the switch was: “Thank god, that should have happened ages ago”.
…
You don’t get extra privacy by disabling JavaScript. I can fully track you even without JavaScript. At the same time I can enhance your browser experience through better written JavaScript code that allows me to do things with your browser that plain HTML does not allow.
If you’re really paranoid about your privacy, use Firefox, enable the Do Not Track flag in your options, enable click to play for plugins like Flash or Silverlight, and install the Ghostery and Adblock extensions. Anything else is just going to break the web at your own expense.
]]>The answer is to make digital games so attractive that players will abandon physical discs on their own. (One might call this the Steam strategy.) Microsoft could have avoided this whole fiasco by maintaining the old disc-based ecosystem while softly undermining it with three moves that create an alternate digital future.
Combined, these three changes would destroy the traditional retail market. The $40 price would make digital games cheaper at release; the ongoing heavy sales would undercut the used games market; and persistence would make digital games easier to maintain across multiple devices. Microsoft needs to make buying games digitally a better deal for the consumer than buying them physically.
I was extremely disappointed to hear Microsoft cave in to rabid demands to maintain the status quo. I was really looking forward to their plans for combined physical and digital ownership, where I could get all the benefits of buying physical copies, including special and collectors’ editions of my favorite titles, while simultaneously retaining all the benefits of a digital copy, like the ability to forego disc-swapping.
How long will we have to wait for consoles to catch up with Steam?
]]>However, I have very little insight into usage statistics for the plugin. Pushover is the only service that gives me gross usage data, but considering ZNC Push supports six other networks as well as custom push URLs, this only represents an unknown portion of the total usage. But I will continue to draw baseless conclusions from it regardless! Do note that I can’t see anything more than raw volume of notifications; I do not have access to who is sending/receiving these, nor the contents of those messages.
So without further ado, some pretty graphs straight from the Pushover dashboard:
ZNC Push reached a milestone of sending 15,000 push notifications in May through the Pushover service!
Push volume has been growing steadily since Pushover support was added, with a small dip in December and January that is likely attributeable to the holidays for most users. May marked the second occasion that ZNC Push has exceeded the volume “cap”, and Pushover has again graciously increased that in support of this open source project. At this sort of grawth rate, I would expect the next volume cap (25,000/mo) will be reached by October at the latest. I’m excited to see such growth for a small side project with such a niche use case.
Sometimes, it’s amazing to stop and realize just how far this project has come. What started in January of 2011 as a basic module for the Notifo push service, has blossomed into a mature system supporting multiple push services and far more customization options than I had ever envisioned from the beginning. Knowing that it’s being used by so many people, and helping them stay more connected with their online communities, makes me a very happy engineer.
Many thanks to Pushover for granting such a large volume of free notifications to ZNC Push. If you’re not already using them for your push service of choice, I highly recommend them. They have apps for both Android and iPhone, and they continue to improve them and add new features over time.
And as always, my eternal appreciation to everyone who has contributed time and energy to helping me improve the module over the past two and a half years! The project wouldn’t be where it is today without your support.
]]>The latest version of Android outshines the latest version of iOS in almost every single aspect. I find it to be better in terms of the performance, smoothness of the rendering engine, cross-app and OS level integration, innovation across the board, look & feel customizability and variety of the available apps.
On the topic of app and system integration:
Another great example: Sharing stuff on social networks. On iOS, I have to rely on the developers again. Flipboard, as one of the better examples, gives me the ability to directly share with Google+, Twitter and Facebook. On my Nexus 4, I have 20+ options. That is, because every app I install can register as a sharing provider. It’s a core feature of the Android operating system.
…
All of this is entirely impossible on iOS today. I’ve stopped counting how often I felt annoyed because I clicked a link to a location in Mobile Safari and would have loved the Google Maps app to launch. Instead, Apple’s own Maps app is hardcoded into the system. And there’s no way for me to change it.
Regarding possibilities for app developers:
On iOS, many things I always wished to see being developed, simply cannot be done because of the strict sandbox Apple enforces around apps.
…
I also have apps [on Android] that give me great insight into the use of mobile data across the device and all apps. Or the battery consumption. Or which apps talk home and how frequently.
None of it is available for iOS. And possibly won’t be at any time in the near future.
And summing up the way I’ve felt for a long time when using iOS devices:
… whenever I grab my iPhone for testing purposes, iOS feels pretty old, outdated and less user friendly. For me, there currently is no way of going back. Once you get used to all of these capabilities, it’s hard to live without them.
There are many things Apple got right with iOS, like making a consistent user experience, and encouraging users to spend money in the market for quality apps. But when they place so many restrictions and limitations on how you can use your phone, and what your software is allowed to do on your own device, I gladly give up those things that make iOS so great for the freedom to run apps that can do what I want — and expect — from a modern computing device.
]]>Now keep in mind, I still like many of the features that drew me to Poole in the
first place, such as the use of a document-centric build process, with YAML
headers for defining page metadata rather than an inline, proprietary format
used by projects like Jekyll. I also enjoy the simplicity of the content
representations, but the lack of an extensible content pipeline is my biggest
complaint. Supporting formats other than Markdown requires adding yet another
hook to the macro file; generating archives and tag pages required hacking in a
multi-phase build using os.exec()
; and inlining another page’s content
post-render was just not possible, resulting in Markdown named-link collisions
when rendering multiple posts to a single page.
I wanted something new. So, for the past few months, I’ve been working on Nib.
The resulting design is based heavily on the concepts of Poole, but built around a primary goal of producing a proper content pipeline that is simultaneously aware of the differentiation between resources and documents, and defines multiple stages where plugins can hook into the process and alter or generate page contents at build time. Indeed, most of the actual functionality of Nib is contained within a handful of plugins, while the main module merely defines a framework for the content pipeline.
In effect, adding support for more content or resource formats should be as simple as adding a new plugin attached to the appropriate file extensions. Advanced content manipulation, generating “virtual pages”, and aggregating pages or documents into multiple locations are all possible as well.
The Markdown plugin is 14 lines of code; the LessCSS plugin is 13; even the blog plugin — which generates the archive pages, tag listings, and Atom feed — takes only 86 lines to do a better job than the old Poole macros that required double the effort.
Today, I’ve thrown the switch. While it looks nearly identical to the old site generated by Poole, the page you are now reading has officially been generated by Nib. The news feed sees the biggest makeover, having changed formats from RSS to Atom, and now offers full content posts. Link-style posts, a format that I’ve been wanting to experiment with, are also a new option. Both features would have required more effort on Poole than I was interested in expending, but the new architecture has allowed me to indulge myself.
Nib is still in an extremely early, and unstable, phase though. It works for the needs of my site, and does come with some basic documentation and a sample site to start from, but it’s far from complete. Near term goals include adding support for an intelligent menu, as well as support for more content and resource formats, like reStructuredText or SASS. Contributions are always welcome though, even at this early stage. Nib is liberally licensed, and I would love to hear feedback from anyone trying to use it. Hopefully it will be useful for someone other than myself.
]]>What do you prefer about Android?
I prefer Android because it allows apps to do more things for the user, and allows them to better integrate with the system as a whole.
I can replace the on screen keyboard with one that has a full five-row keyboard for times when I SSH into a machine. On a similar vein, when I SSH into a machine, I can actually leave the SSH session running in the background while I switch to another app, without fearing that the OS is about to kill my SSH app while I’m looking something up or responding to a text message. I can also leave my IRC client running in the background without it constantly needing to reconnect when I switch back to it.
Intents in Android, especially in combination with the global Share mechanism, allow any app to receive arbitrary data from any other app, meaning apps don’t need to know about specific apps or services in order to integrate with them. Clicking on a URL allows you to choose which browser (or set a default) to open the link in, allowing you to use alternate browsers (or alternate email clients, SMS apps, dialers, etc); tapping Share in the browser allows you to send the current URL to any application that can receive a URL, making apps like Instapaper, Pinboard, and 3rd party Twitter clients have the same capabilities as first party applications.
Sideloading apps means I’m not limited to installing programs from the Android Market/Play Store, and can do things like buy apps directly from the Humble Indie Bundle and install them on my own.
Proper background service support, and allowing apps to affect things outside their sandbox, lets me run programs like Locale that can monitor the phone’s status, location, etc, and modify the phone’s settings automatically based on a set of conditions that I’ve pre-arranged. My phone automatically silences itself at night time and while I’m physically at work, turns on my Wifi when I’m at home or work while defaulting it off when I’m out and about, and more.
That’s just some of the reasons I like Android better than iOS.
]]>Oh, and I got a job at Facebook.
On May 3rd, BioWare informed me that my position in the studio was being eliminated. My terrible luck had struck again. But this time was different; within a few days, a recruiter from Facebook found this website and my open source work, reached out to me, and encouraged me to apply for an engineering role. Four weeks later, after phone screens and an on-site interview, I was offered a position as a Production Engineer. My luck had not only reversed, it had gone off the scale in the opposite direction.
Alongside Facebook, all my other leads paled in comparison. I wanted to stay in gaming, but here was the opportunity of a lifetime, to join one of the biggest and best engineering companies in the world, and the chance to learn from some of the brightest minds in the industry. The position is similar to the role I had at BioWare: writing and maintaining software to manage and automate the vast array of infrastructure that supports the front-end applications and engineers. It was an offer I couldn’t refuse.
Monday was my orientation, and I was immediately impressed by the level of passion, vision and dedication from the entire team. Boz discussed the culture of “hack”, and told a story about building a loft in a war room when it couldn’t fit everyone in just two dimensions. Chris Cox gave an inspiring talk about where Facebook is heading, and I got a surreal sense of wonder when he mentioned our long term goals or the level of impact we have on global society and the way people communicate. It feels amazing to be part of a company that truly wants to change the world and improve the lives of hundreds of millions of people.
Even the training process embodies those same ideals. The first few weeks, every engineer goes through “bootcamp”, attending learning and development sessions, sitting among other bootcamp engineers, and working with veteran teammates on real tasks to get familiar with the infrastructure, tools and codebase. Everyone is given the chance to progress at their own pace, with as much or as little help as needed. I’ve already learned so much in a few days, and I’ve also had the chance to share my own knowledge and experience with my fellow newcomers. And yet there’s still so much left to cover.
Wednesday was my first day at a desk. Taped to the monitor was a sheet of paper printed with bold, red lettering.
What would you do if you weren’t afraid?
I don’t have an answer for that yet, but I will soon.
]]>Now, I’ve been a core developer, and de facto release manager, for the project for many years — since I was still in university and getting paid by my then-employer to contribute features and plugins that they wanted to use for their engineering team. Those plugins, like Source Integration, wouldn’t be free without me fighting to license and release them for the community. And I wouldn’t be where I am today without the experience and help I received in turn from the very same community.
I know I haven’t been as involved in the project these days as I would like to be; there is an endless list of features and improvements to make to both the core system and the array of plugins I’ve created for it. Some great community members have stepped up and filled my place at times, while I have at least tried to stay active on the mailing lists and in the IRC channels. I’ve still guided and cut the last couple releases, but I haven’t played a part in shaping the future of the project.
There are multiple competing visions charting new paths for the aging project, with conflicting goals and revision histories, and it really needs a stronger leader to take the reins and guide the project to its next milestones. I’m unfortunately not the person to fill this role, for many reasons. Maybe a few years ago it would have been better timing.
Lately, I’ve come to the realization that I can no longer bring myself to work with PHP for personal projects. I don’t like the syntax, I don’t like where the language is heading, I don’t like how much memory and CPU it requires to run on a web server, and I just spend the whole time wishing I was writing Python code instead.
This blog hasn’t run on PHP or a database for just over a year now, and with my MantisBT install being used mainly for projects I don’t have the time or will to work on, it just seems to be dead weight. Github can serve my needs well enough for the few remaining projects I work on, and without needing a complicated setup on my end. Turning off MantisBT means I no longer need MySQL, PHPMyAdmin, APC, or even mod_php at all. The remaining apps can easily be replaced with external services.
So basically, this is me announcing what I’ve already been practicing for many months now: I will no longer be a developer for Mantis Bug Tracker, but I will remain involved as a mentor for other core developers, or for those seeking some advice on my plugins or creating their own. I won’t be maintaining any of my plugins, but I will look at and accept pull requests until someone else wants to step up as maintainer. I will be removing MantisBT from my site, but will keep a database dump in case I ever need to reference it in the future.
This is not me withdrawing from open source; I have many other projects that I’ve been working on, most of which are written in Python or C++. I find them more enjoyable to deal with, and most importantly, they allow me to break out of the realm of writing web applications. IRC, as old as it is, has been my point of intrigue lately, and is at the core of my current “pet” project.
Regardless of language, you can still find me on Github, where all my toys are available for the public to point and laugh at. And as always, I will answer questions on Freenode as “amyreese”, or via email, although there may sometimes be a long delay before I can reply.
Thank you to everyone who’s contributed to MantisBT or its plugins, and thank you to everyone who helped me on the way to where I’m going.
]]>Hey man,
Just wanted to say thanks for the ZNC Push Module you made. I’m using it with Notify My Android and it works great! This should be a standard module in ZNC imo. Stellar work my friend.
Best,
~Lucien
It makes me smile every time I hear from someone using my software, knowing that I can make an impact on peoples daily lives, no matter how small it may be. Thank you to everyone who has taken the time to thank me for my work.
]]>I won’t be working on games directly, but I’ll be working in a devops role to automate and manage servers for games and internal projects. It’s a good fit with my experience in web applications, system administration, and tool development. It also can be a potential stepping stone to a game development position later on.
The next two months are likely to be hectic, as I move to temporary housing in California, and then find an apartment and move into it. Ongoing projects may have to take a back seat until I can get the free time again. But the weather and job will be worth it!
]]>/away
status, time since
the last notification, number of clients connected to ZNC, and more. Currently
supported push services include Boxcar, NMA, Notifo, Pushover,
Prowl, and Supertoasty.
The module is released under the MIT license, and the source code and full documentation can be found on the project’s Github repository page.
]]>From any SSH client, I can seamlessly pick up my IRC session where I last left it, regardless of where I started that session. Similarly, I can connect with my phone’s IRC client, get a short backlog of recent conversations, or answer pending private messages. When I’m not already engaged in a conversation, I get near-instant notification on my phone and desktop, allowing me to respond at my leisure and from any location. I never miss a private message because I was connected from the wrong place, other users always see a single nick, and I get a central, searchable history of every channel and private message.
With this sort of setup, I gain a lot of freedom — to deal with conversations on my terms — and convenience. It’s served me well for a couple years, and I’ve enjoyed IRC much more since putting it all together. For each layer, I’ll detail the tasks it covers, the software I’ve chosen, and give a copy of any configuration files or options needed to replicate my environment.
]]>I didn’t get to take pictures of the XB-70 like I wanted to though; it was in their Research and Development hangar, which requires an ID check and bus ride to visit. Hopefully we’ll get to return soon and rectify that.
The full gallery is on Picasa, and contains 130 photos.
]]>The Spotify client supports DBus for controlling the player, using the MPRIS Specification, but does not listen for basic media key signals provided by Gnome. This program acts as a “wrapper” around Spotify to translate media key signals from Gnome and send them to the Spotify client.
The program is released under the MIT license, and the source code and documentation can be found on the project’s Github repository page.
Many thanks to Mike Houston at kothar.net and Fran Dieguez at Mabishu for their blog postings that pointed me in the right directions to get this implemented.
]]>Linking changesets to issues requires commit messages to match the regular expressions specified in the source integration configuration page. By default, phrases like “fixes #123” or “resolved #123, #123” are supported, in present, past, singular, and plural forms.
Remote checkin must be enabled for use by post-commit hooks that don’t use an API key to authenticate, and must list the IP addresses or blocks for any repository server that will push commit data to Mantis.
Remote imports must be enabled for use by cronjob-based scripts that will trigger Mantis to pull in new changeset data for a given repository.
Your web server needs to have the SVN client binaries installed, and they must be accessible by the
account that your web server uses. Similarly, if the binaries are in a directory that’s not included in
your web server’s default path, you will need to specify the directory path in your source integration
configuration. On Linux, this is usually /usr/bin
or /usr/local/bin
— on Windows, something like
c:/path/to/subversion/bin
is likely required.
For Windows servers, you may also need to enable the “Windows start” source integration option.
Make sure that the individual repository URL that you use for Mantis is the same URL you would use to checkout the repository when using an SVN client.
When using repositories that require authentication, make sure the username and password you enter in Mantis has read access to the entire repository.
If your repositories are hosted using HTTPS/SSL, and your server is using self-signed certificates, you will need to have SVN version 1.6 or newer installed, and you will need to enable the “Trust all SSL certs” option from source integration.
If your commit messages contain UTF-8 or other non-ASCII characters, or your system’s locale is not set to “en_US”, then you may need to look at issue #93 and #130 on my bug tracker for help modifying your server or SourceSVN plugin to use an appropriate encoding or locale.
If using Gitweb, versions newer than 1.6 may not work correctly, as the Gitweb plugin is scraping HTML from the viewer, and changes to the HTML structure will break the Gitweb plugin. The version of Gitweb in use on MantisForge is known to work with the plugin.
Using Github with private organization repositories is not yet supported. Private repositories for normal user accounts, however, is supported. Enter the username and API key from any Github account with access to the repository, and it should import correctly.
Using branches other than “master” will require you to modify the individual repository configuration in Mantis to list any branches that you want to be imported.
There are a lot of applications that don’t yet take advantage of what’s offered by the Honeycomb APIs, but still tend to work really well. It mainly depends on how well the author designed the application to scale with the user’s screen size and density. An example of doing it wrong is the official Facebook app; it’s still usable mind you, but it certainly looks dumb in process, showing the main menu as a large grid of tiny icons with massive amounts of whitespace between them. It would have gone a long way if they had simply scaled the images to fill the screen.
I’ve been meaning to write about some of my most cherished apps, and seeing them in new form has given me an even better reason to get to it. Some of them really only work well on a phone, and others have only gotten better than ever when given a tablet form factor to call their own. So in no particular order, here are my favorite apps for Android. All prices are rounded up from Market estimates at time of writing, and all screenshots are taken from my devices:
]]>Future plans for the feature include support for configuring multiple API keys simultaneously, as well as adding support for using the API keys from other data sources, such as SVN or Gitweb repositories. Additionally, the old options for listing allowed IP addresses is now considered deprecated, and will likely be removed entirely at the next major release.
To set up an API key in your MantisBT instance, visit the Repository Configuration page, where you will find a new option labelled, strangely enough, “API Key”. You will need to generate your own key; the best way to do this is on a machine with OpenSSL by running the following command to create a secure, random string of hexadecimal digits, and then copying the resulting string to MantisBT:
$ openssl rand -hex 12
Once this is done, you can enable this on your Github projects by visiting the Service Hooks admin page for your repositories, activating the MantisBT hook, and copying the same key string into the “Api Key” field there. Any future pushes to your Github repo should send data to your MantisBT install using the API key to authorize the data submission.
]]>There is quite a lot of suggestions for mitigating this issue, such as given in this question on Stack Overflow. Many places point to Bryce Boe’s article, where he advocates rolling your own replacement for the multiprocessing module’s Pool class, but that seems to not only invite bugs and added maintenance overhead, but also doesn’t address the root cause.
I have figured out (what I think is) a better solution to the problem, and have not found anyone else mentioning it online, so I have decided to share that here. It not only solves the problem of handling the interrupt for both idle and busy worker processes, but also precludes the need for worker processes to even care about KeyboardInterrupt in the first place.
The solution is to prevent the child processes from ever receiving KeyboardInterrupt in the first place, and leaving it completely up to the parent process to catch the interrupt and clean up the process pool as it sees fit. In my opinion this is the most optimal solution, because it reduces the amount of error handling code in the child process, and prevents needless error spew from idle workers.
The following example shows how to do this, and how it works with both idle and busy workers:
#!/usr/bin/env python
# Copyright (c) Amethyst Reese
# Licensed under the MIT License
import multiprocessing
import os
import signal
import time
def init_worker():
signal.signal(signal.SIGINT, signal.SIG_IGN)
def run_worker():
time.sleep(15)
def main():
print "Initializng 5 workers"
pool = multiprocessing.Pool(5, init_worker)
print "Starting 3 jobs of 15 seconds each"
for i in range(3):
pool.apply_async(run_worker)
try:
print "Waiting 10 seconds"
time.sleep(10)
except KeyboardInterrupt:
print "Caught KeyboardInterrupt, terminating workers"
pool.terminate()
pool.join()
else:
print "Quitting normally"
pool.close()
pool.join()
if __name__ == "__main__":
main()
This code is also available on Github as amyreese/multiprocessing-keyboardinterrupt. If you think there’s a better way to accomplish this, please feel free to fork it and submit a pull request. Otherwise, hopefully this helps settle this issue for good.
]]>Saying you found my resume on Monster.com or some other job site when I have never ever registered or even visited the site in question.
Saying you found my resume on a site I did sign up for, and then blatently ignoring that my account is marked as “not willing to relocate” and offering me a job in backwater Arkansas, Montana, Tennessee, or South Dakota. There is exactly one place I want to relocate to, and that is the west coast.
Requiring knowledge in technologies that aren’t even mentioned in passing on my resume.
Looking for “Rock Start” software engineers to join a start-up.
Advertising your start-up with a bullet point of “e-commerce… e-commerce… e-commerce”.
Having your offer email include a footnote saying “Message sent with an unregistered version of MailList King!”. Nothing says legitimate like a recruiter who uses an unregistered piece of spam software.
Sigh…
]]>I bought the very first Android phone, the T-Mobile G1, when it was first released over two years ago. Even then, Locale was big news for the platform, having won the very first Android Developer Challenge. I have been using it on all my Android phones since then, and I continue to be impressed by it.
Locale is the killer app for Android. It embodies everything that Android is capable of, and everything that Apple refuses to allow in iOS. My phone can now be smart enough that I don’t have to babysit its settings everywhere I go; it knows when to be discreet and when to be secure. No other mobile OS can do that.
For a quick background, Locale is an application for automating changes to your phone’s settings based on a configurable set of “situations”. You define a set of “defaults”, and then each situation is comprised of a set of “conditions” and “settings”. When a situation’s conditions are met, the associated settings override the defaults; when the conditions are no longer met, Locale returns to the default settings. By combining multiple situations together in a priority list, your phone can make intelligent decisions, and seamlessly switch between multiple situations as they become active or inactive.
But what makes Locale even better is that it was designed from the beginning to be extensible. You can find plugins on the Market that add new conditions and settings. Because of Android’s ability to share data between applications, these plugins can even go so far as to use context from, or modify behavior of, other applications installed on your phone. As an example, the Astrid task manager allows you to attach a location to your tasks, and integrates with Locale as a condition when you reach those locations.
But for a more concrete example of just what’s possible, I’d like to show you what my current Locale conditions and settings are.
The Locale plugins that I use to accomplish this:
Color me happy.
]]>htop
on the first one; it’s current
hostname is “kittycat1”…
Not exactly the shabbiest set of servers to work on…
]]>If you work on the Source engine, or are looking to run or join open source mod projects, I highly recommend you take the time to listen in.
]]>As for the actual reasoning behind the move, it stems from multiple issues I had with the old domain, such as:
Being able to pronounce my email address and domain to the general public without having to always spell it out and make sure they catch that there are two e’s in the domain.
Switching at the same time from jreese@ to john@ for my address also means I don’t have to worry about people misspelling my last name, which happens so much even my own family still gets it wrong on a regular basis.
Not having to explain what “leet” is, or getting remarks about it being a juvenile choice due to the stigma of “leetspeak”.
It’s a short .com domain, so that people will get it right every time; I’ve had people assume I actually meant leetcode.com, without confirming it before sending a doomed message…
Anyways, in the off chance that you’re a sentient being, and actually reading this, if you happen to catch an error or gap in my redirection efforts, please drop a line to john@ this domain.
]]>ZNC to Notifo is a module for ZNC that will send notifications to a Notifo account
for any private message or channel highlight that matches a configurable set of conditions,
including the user’s /away
status, time since the last notification, number of clients
connected to ZNC, and more.
The module is released under the MIT license, and the source code and documentation can be found on the project’s Github repository page.
]]>Rest in peace, Joyce. You will be missed.
]]>Android is all but open.
I’m calling this out. Android, as a software project, is completely, 100%, open. It’s released by Google with the Apache license, which is recognized by OSI and the FSF as a Free/Libre, Open Source license. The Android code itself is freely available, freely redistributable, and can be compiled and flashed onto any compatible device.
However, there is a significant portion of the Android ecosystem that is not “open” by the same definitions above:
Device drivers for individual phones are open or closed depending on the device and the individual chipsets in question, but that is a moot point in my opinion as there are plenty of people who use Free desktop operating systems with closed “binary” drivers. Therefore I will leave this topic for another discussion.
All of the Google-branded applications — including the Market, Gmail, and Maps — are closed-source and must be licensed with Google to be included on a phone. This means that Cyanogen is not allowed to include these apps when he releases his amazing CyanogenMod firmware. Other services that Google then builds on top of these closed applications are also closed by nature, including their proprietary “push” communication model.
For some purists, this is a major problem, and I would generally agree. But unlike Apple and iOS devices, none of these Google-branded apps are “privileged” applications; they don’t get special treatment from Android, and they don’t have access to anything that “normal” applications can’t access through the SDK.
But more importantly, these apps are not Android, and they are not necessary to delivering an Android phone or firmware. Developers can write and release competing or nearly indentical applications that replace these closed system apps, and indeed, there are multiple competing “app stores” for Android, with Amazon rumored to be creating yet another. There are even better alternatives for Chrome to Phone already available. And if you insist on not using — or have a phone without — the Android Market, Android is perfectly capable of “side-loading” software packages, and nobody needs to pay Google for the rights to do so.
What is all this proclaimed openness worth if it still boils down to exploiting security systems if you want to run that system you just modified?
That is the real problem, and in my opinion the blame is firmly with the carriers; not Google, and certainly not Android. I specifically purchased a Nexus One because it supports the ability to flash the phone with unsigned firmware. I can download the Android source code, compile it, and flash that resulting firmware to my phone, without needing to root, exploit, or jailbreak my phone. I could do that with my Openmoko Freerunner, and I can do that with my Nexus One.
If enough people insisted on purchasing phones with this capability, then the carriers and manufacturers would pay attention and deliver. Or perhaps Google should be standing up to carriers and demanding that all Google-branded and licensed Android phones have this capability. But even if they could get away with that demand, they can’t enforce it on all Android devices; the very definition of Free Software allows carriers and manufacturers to take Android and do what they want with it if they don’t like Google’s terms.
Maybe the real lesson is that Free Software is a double-edged sword, and if you want corporations to join in, you have to be willing to play their game too.
]]>I’ve been typing with the Dvorak layout for about three years now. I personally can’t fully touch type, and never have been able to, although these days I’m getting pretty close if I stop thinking about it and just start typing. My typing speed has slightly increased, but is more or less limited by the speed at which I can think about what I’m trying to type. The real benefits are in the related experience.
I’ve noticed a dramatic reduction in wrist strain at the end of the day, mainly due to the shorter movements for the majority of keystrokes, as well as the proper alternation between hands. Both are hallmarks of the Dvorak layout’s primary design requirements.
Regarding impact on programming efforts, My biggest complaint is that the brackets are on the number row instead of just above the home row, but when I’m writing Python code, I use them far less, so it’s not much of an issue; when I’m writing PHP, C, or Java code though, it can get a bit annoying, but it’s a good trade-off since the +/= and -/_ keys are now closer at hand.
For my editor, I’ve been using Vim for longer than I’ve been using Dvorak, but I’ve never used the hjkl keys for normal movements; I bought keyboards that specifically have the arrow keys right under the Enter key, so moving to use those is very simple, and allows me to use Vim without having to remap any of the normal movement keys.
In all, I highly recommend the switch, especially for anyone who plans to do a lot of typing in their daily routine. The benefits have far outweighed any of the drawbacks. And purchasing a purpose-built Dvorak keyboard will be one of the best investments you can make. I personally love and highly recommend the TypeMatrix keyboards, not only for their great layout, but because it has a physical toggle switch for moving between Qwerty and Dvorak layouts, which is priceless when you want to be able to play games that aren’t friendly to non-Qwerty layouts.
If you’d like an entertaining way to learn more about the Dvorak layout, DVZine has a very informative comic book about the history and benefits.
]]>I’ve long been on the fence regarding PHP’s type coercion and comparison issues, but a recent bug in Mantis Bug Tracker has made me /facepalm for the first time in my long history of working with PHP:
When I click on “Edit” next to 1.2, mantis shows me the 1.20 properties. When I click 1.1 it shows me 1.10!
The offending snippet of code:
foreach( $g_cache_versions as $t_version ) {
if ( ( $t_version['version'] == $p_version )
&& ( $t_version['project_id'] == $c_project_id ) ) {
return $t_version['id'];
}
}
At first glance, it seems perfectly normal… and then you read the commit log, emphasis mine:
This is due to an incorrect version name comparison in version_get_id whereby the following check between strings was occurring:
if( "1.1" == "1.10" ) { ... }
PHP evaluates this expression to true because 1.1 and 1.10 are treated as floats. We however need to preserve the string type during this comparison, thus we need to use the === comparison operator instead.
I thought I’d seen it all…
]]>Now if only I could find a job local to Cincinnati… If you are interested in hiring me, or know someone who’s looking for an open source developer, take a look at my resume.
]]>Anyways, the information and explanations presented in his article are pretty accurate. Until I can get the time to fully document the SVN and Git plugins, or the framework as a whole, consider Chris’s post to be canonical information.
Cheers
]]>]]>The Good King Lisp raised his glass and toasted with the Knights of Lambda, “To much recursion!”
What’s twenty-four?
Nifty.
]]>The slides are hosted directly on Google Docs: http://docs.google.com/Presentation?id=dffhxmhs_1273ct3kc8
]]>I’ll be attending it to give a presentation on MantisBT and the Source Integration framework. Specifically, I’ll be covering the myriad of new features that have made it into the project over the past week and a half. I plan to walk through setting up a project in Mantis, creating a new repository on GitHub, linking the Source Integration framework to that, and showing how the branch mapping and auto-resolving features work. Should be interesting.
After the presentation, I plan to post the slides, along with my presentation notes, up here. If anyone decides to video the talk, I’ll also make sure I can get a copy of that as well, but no promises.
Cheers!
]]>Considering that my last post on Integrating Git and SVN has garnered a fair amount of attention, I thought that it would be useful to discuss my Source Integration framework in more detail. Specifically, I’ll be covering topics such as the design and implementation of the framework and, more importantly, how developers can go about implementing support for other version control tools.
The point of this is to show that it’s quite possible to integrate just about any type of version control tool with the Source Integration system; indeed I planned from the beginning to create a generalized framework that would support many different types and paradigms for version control. This should at least be evident in that I have already created extension plugins for Git and Subversion - it should be quite possible to extend the concepts further to Mercurial, Bazaar, CVS, or any other tool.
For the point of brevity, I’ll make the assumption that the developer at least has a fair understanding of PHP, their version control tool, and how events and plugins work in MantisBT. If you are not yet familiar with the plugin system, there is currently a basic introduction in the MantisBT Developer’s Guide, which I’ll hopefully be adding more information to in the near future.
]]>Thank you Explosm, you’ve just made my day! :)
]]>As the core developer of the new plugin system, I have been working on a variety of plugins. In particular, I have created a vastly improved method of integrating source control repositories within MantisBT. The plugin package is named, aptly enough, Source Integration, and implements a generic framework that will allow integration with multiple repositories, each potentially using any source control systems available, simply by creating an extension plugin for each new tool. Currently, I have implemented integration packages for both Git and Subversion, my two source control tools of choice.
The Source Integration package tracks repository information based on a series of changesets, each of which may have a list of affected files. The data representation is generic enough to cover version control concepts used by all types of tools, from the ubiquitous CVS and Subversion, to modern distributed tools like Git and Hg. However, the system takes the stance of implementing as few details as possible, so it relies on existing repository-viewing tools for tasks such as viewing commit diffs, file contents, tree browsing, etc. Extension plugins handle translating tool-specific information, like history logs or checkin data, into the generalized data objects used by the framework. Extensions also generate URL’s for viewing files and diffs, but everything else is handled automatically by the core framework.
The true benefit of the Source Integration package lies in the amount of repository integration that it implements within MantisBT. When importing changesets from your repository, Source looks at the commit message of each changeset for references to bug numbers in your tracker, and sets up links in the database for any bugs mentioned. When viewing bugs mentioned in commit messages, a new section is displayed after the bugnotes called “Related Changesets”, giving a list of linked changes, including information about the changeset, such as the branch, author, timestamp, and a list of changed files.
]]>A few choice quotes that I most enjoyed:
I don’t know anyone who programs in PHP and hasn’t … become much more acquainted with the concept of “haystack” and “needle” than any one person should have to in a lifetime.
With time, an experienced developer learns that the only reason why any particular functionality is not in PHP is that it’s not there — yet.
Invariably, PHP developers who try to settle into a framework have the (often irresistible) urge to simply drop it and write their own, because, you see, there is no framework that does things the way he or she wants — yet.
I really like working on the PHP projects that I’m a part of, but every time I write a Python script to do something, it just reminds me of how unsophisticated PHP really is as a language. Perhaps that’s OK; it certainly hasn’t stopped me… yet.
]]>Why again does John need to go through this long, redirection process? Why not just use a different email client on the iPhone? Because Apple is anti-competitive, and third party apps can’t run in the background, straight from John Gruber himself.
Isn’t this a bit absurd? Why do people let Apple stifle competition like this? Am I the only one that thinks this situation is far worse than anything presented in the huge anti-trust cases against Microsoft in the past decade? Apple is specifically denying competition on the iPhone, and all the groupies think that it’s perfectly acceptable, even good for the consumer! But shame on Microsoft for bundling Internet Exploder and a Media Player; how dare they allow anyone to choose a different browser even!
People ask me why I purchased my Neo Freerunner instead of an iPhone. Even disregarding that I’d lose my choice of carrier, I don’t see why people are rushing to a company that depends on anti-competitive practices to maintain the ‘best’ apps on the phone. If Apple’s browser, mail reader, etc, don’t suit the customers’ needs (as is apparent from Gruber’s post), why are they trying to stop them choosing a better option? It’s not like Apple’s revenues depend on users choosing Safari or Mail.app; hell, wouldn’t they get even more revenues from the App Store if people could buy a superior browser for even $1 a pop?
Sounds to me like Apple cares more about maintaining control than providing their users with the best experience….
]]>How about rather than asking web designers, server owners and IT staff everywhere to add some hack tag to their code, you force IE8 into compatibility mode unless a designer specifically enables IE8 rendering on their page by adding said tag? That mediates the issue pretty easily.
They [Microsoft] were originally planning to require a special tag to enable standards compliance in IE8, but there was a gigantic backlash from the web development and standards community.
Why? Because then we get nowhere; all the clueless web designers never find out about the special tag to make IE8 comply with internet standards, and continue making web pages for the broken IE rendering model for the next 10 years.
We need to make all those old websites break, because otherwise they’ll never comply with modern standards. We need to have standards based rendering be the default because then the designers that test against IE8 will be making sites that work better with other browsers.
By forcing developers to realize that their websites are non-compliant (either from angry users or specifically forcing quirks mode) and by defaulting to standards-based rendering, we make the web design future a much nicer place to be.
]]>I don’t think the creator of an interface can ever objectively measure the usability of the interface, no matter how much they use it; they don’t ever have to learn it, because they created it in the first place.
…
I’m not saying usability is not the core. I’m saying that the creator of the interface is in no position to objective judge the usability because they have an innate knowledge of the system because they designed it and they know exactly how it functions and how it’s supposed to be used. If you want a real measure of usability, you have to get someone who understands the problem domain, but has never before seen your interface, and then objectively determine how easily they can figure out how to perform tasks and get things done. The fact that you, as the designer, already know exactly how the interface is built and operates precludes you from having an objective opinion of how easy the interface is to understand.
Similarly, a painting’s artist cannot objectively determine how beautiful/emotional/successful the work of art is, because he has an innate sense of what it is trying to convey to the viewers. Just because the artist sees the subtle details, nuances, allusions, etc, does not mean that other viewers will be able to glean the same information.
And to drive the nail home a third time, an engineer could not possibly be an objective judge of how easy a car is to operate (usability), because they already know where everything is and how it works. They need to have someone, without previous experience, sit in the seat to realize that putting the cigarette lighter and cup holders inside the center console is a bad idea and not at all intuitive…
]]>Where there is money and people with power corruption is very likely. What fascinates me, about America specifically, is how ingrained the representative democracy concept is. Direct democracy is this wild and crazy thing that absolutely and directly = Hitler. There could be an interesting argument why Swiss style direct democracy would not work for a huge country like the US. But what about local government? What about little towns? It’s fascinating that Americans from a very young age learn that the head of local government is the mayor. What would happen if a little town in nowhere decided to mimic Switzerland in governance and eliminates the middle men? Doom?
As an American, I think the biggest reason that the majority of Americans embrace (worship?) representative democracy is because it frees them from feelings of responsibility in the outcome of the government, and means that much less effort they must contribute back to society. Why learn about all the issues and directly vote for what I want, when I could more easily just elect someone else to do all that hard stuff for me so I can spend more time on the sofa watching the drama of Hollywood retards unfold on high definition TV?
As an added benefit, when my elected representatives then vote the “wrong” way, I certainly can’t blame myself, because A) I’m only one of thousands, or millions, of votes, B) I voted for the other guy, or C) I didn’t vote at all / that’s why I don’t ever vote. It’s the exact same reason that companies pay barrels of money for IT support contracts; it’s less work, and when something goes wrong, the blame always shifts to someone else.
Solution: Nuke it from orbit; it’s the only way to be sure…
]]>So for the public record, I’d like to list the set of features that I feel are most important to have in a browser, and how the array of competitors each handle themselves. Just want to see the results?
So here’s how I see today’s options of browsers, with their best and worst parts:
I’m actually not very happy with any of the browser options available; they all have disadvantages when compared to other browsers, and there is no clear leader, especially when you consider that every user has a different set of requirements.
However, Firefox still makes me cry the least while I’m using it, and, with its myriad of plugins, makes my time surfing the web so much more enjoyable, except for when JavaScript makes it sop responding of course. Probably the best thing Mozilla could do to improve Firefox would be to implement process separation akin to Google Chrome, or at least prevent the UI from becoming unresponsive during heavy JavaScript execution. If that would happen, I would be absolutely elated.
So the real questions now are: Where does this leave us? How far are we towards a better web? Which browser will get us there the fastest? What will eventually make all this goofy garbage obsolete? When will I shut up and let you leave this page?
]]>i need a google account to use gphone; i need itunes to use iphone; i have to buy apps from approved channels. it favors the vendors apps; no thanks wake me when i can buy a device that runs apps i choose, connects to the network i want. i realize this is a pipe dream. the wireless world is a world of shit i might as well look for the smallest flash-based linux notebook possible that runs skype and just hold it up to my ear old-skule style like gordon gecko and that giant cell phone from wall street
I have an Openmoko Neo FreeRunner: it has GPS, accelerometers, WiFi G, high resolution 640x480px touch screen, Micro SD card slot, good quality speakers/headphone jack, and good battery life; it works with any GSM carrier; it can run just about any operating system compiled for its ARM CPU; you can run and compile programs on it in any language supported by GCC or an ARM-compiled interpreter; it can connect to the internet via GPRS, WiFi, or USB with a PC, to update it’s software, install software packages, accept/initiate SSH sessions; it allows software to run that uses any windowing toolkit, including Gtk, Qt, and E.
It costs $399 direct from Openmoko and is available through multiple worldwide resellers.
I’m not a fan of Openmoko, but you make a good point. There ARE options for people who want them. The cell phone market is more open now than it ever has been in the past.]]>
Certainly it’s not as polished as the iPhone, but for people who actually care about their freedoms, it’s fantastic. Even if for the simple reasons that I can flash my Neo at will, and that I have no limitations from the manufacturer as to what I can do with my phone, or how it can be used, it’s the best smartphone/PDA I have ever purchased or used.
I find it interesting that you’re the most vocal supporter of the Openmoko on this site, and you still don’t use it as your only phone. Hopefully they will work out the kinks eventually, but it is not an option for most of us yet, not even those of us who care about software freedom. If you NEED to have a backup phone, then it is still just an expensive toy.
Correct. But that doesn’t mean that it’s any less important in the mobile ecosystem. It’s the only truly free phone in every sense of the word. You’re free to do anything with the phone, at any time, without the permission of phone manufacturers, or app store reviewers, or fucking NDAs.
The biggest problem with Openmoko is that nobody knows about them, and nobody realizes why they matter. Everybody sees the horrors going on between Apple, the App Store, and developers’ applications being rejected for competing with Apple, and then they complain about it, but that’s just the way it is.
Yet that’s not how it should be, and if everyone could find out about Openmoko, and actually realize and know why their freedoms truly matter, and that Openmoko makes the most freedoms-loving phone on the planet, then I wouldn’t have anything more to talk about.
But we all know that even Openmoko’s unexpectedly high sales amounts for the FreeRunner is still only a drop in the ocean compared to even only the iPhone, and even less compared to the entire smartphone industry. And that’s why it matters to me and others to get the word out, to let people know that there really is another option, one that doesn’t squelch your freedoms, and that if freedom truly matters to you, then you do have a choice.
Freedom is Your Choice. I choose Freedom.
]]>I wish the Empathy project would hurry up and mop the floor after the mess Pidgin made of its end-users…
]]>