330 karma · joined May 4, 2012
~/src/bar (foo =)$ hub pull-request
https://github.com/foo/bar/pull/5
There is also `hub fork` and others: These GitHub commands are provided by hub:
pull-request Open a pull request on GitHub
fork Make a fork of a remote repository on GitHub and add as remote
create Create this repository on GitHub and add GitHub as origin
browse Open a GitHub page in the default browser
compare Open a compare page on GitHub
release List or create releases (beta)
issue List or create issues (beta)
ci-status Show the CI status of a commitThere is an actual whiteboard on my wall and a webcam on a stand. When I want to whiteboard something, I get up, switch camera angles, and literally draw it out. I have found this to be far more productive than any whiteboard apps out there.
For something more interactive, Google Draw isn't awful, but it's not a pen and paper.
The Chef Server stack is somewhat complicated, though with an omnibus install you will rarely have to interact with it at that level. These days, it scales well up to thousands of client nodes with no meaningful effort.
I'm not sure what you mean by the server using its own versioning. Cookbooks are versioned, as they are deployable artifacts. Environments then define which versions of all the cookbooks exist, so you have an easy promotion strategy. The challenge with Chef Server and DVCS is that you have to centralize the uploading of Chef artifacts (roles, environments, data bags, cookbooks) to Chef Server if you have a team with more than 1 person. That challenge is not unique to Chef, however. Hopefully, a team of Ansible users are not running Ansible playbooks directly from their workstations. If you try to upload a version of a cookbook that is older than the current version, it yells at you, so it makes certain bad behaviors more difficult.
There is plenty I don't like about Chef. And Puppet. And Ansible...I've worked with all of them, but I still haven't seen a valid argument to support the phrase "over-engineered" when used on Chef. Of all the configuration management products out there, Chef is still the most flexible and the most powerful.
Every time a new configuration management utility comes out, everyone loves it because of it's simplicity or some arbitrary measure of "lightweight," but once Systems Engineers need to solve real automation problems in the real world, they start adopting features to work around the illusion of being "lightweight."
I like Ansible for automating my home network where I have simple problems and no need for environment separation. For professional work, I stick with Chef or Puppet.
Several companies later, I find it actually difficult to work in an office environment. I'm not a hermit or even a strong introvert. I enjoy the company of other people from all walks of life, but there are so many distractions in an office environment that prevents me from doing my best work. As a Technical Operations engineer (SysEng, DevOps, SRE, or buzzword-dujour), most of my work is contemplative and best performed away from a keyboard. At home, I am free to work while running, walking, or sitting in the bathtub (TMI) with no fear of judgement from my peers. When I do need access to someone, I have a variety of tools at my disposal to suit the required latency and interactivity of the conversation.
Plus, pants are optional and slippers are the prescribed footware.
There are always challenges, though. For me, strict enforcement of work hours is a must. Sometimes I still get in the zone, lose track of time and work late, but usually I sit down around 9AM and take off around 5-6PM. Otherwise, work takes over my life and I end up neglecting my responsibilities as a husband, father, and homeowner. I am lucky to have a wife who understands my work boundaries and children who have never known a father who leaves the house for work each day. "Daddy is working" is enough for them to get them out of my office. Oddly, I grew up in a similar environment, as my father worked from a home office when I was a kid.
The biggest challenge for me has been while working for a medium-sized (1000+ employee) company in a Director role for a mostly colocated company. As an individual contributor, communication with my team and boss is relatively easy, but as a leader it is incredibly difficult to inject myself into important conversations via chat and email when those people are literally sitting next to each other. Having trusted "spies" within the organization that will keep their ears open and report back is a must or else you end up completely out of the loop.
Having worked primarily at colocated companies where I'm in the minority as a remote employee, I'm very excited to be joining an established remote first company next year and seeing how they do it in the "big leagues."
For me, the biggest problem was when my computer was turned off overnight, I had to go to some external source to read the transcript of the conversations that transpired rather than having it available immediately, in my application. DMs can also be sent when the user is offline, which is great for "hey, get back to me when you're back on."
I was able to solve some of these issues by setting up my own Quassel or ZNC server, but these were hacks and the clients were no where near as refined as Slack or HipChat.
I keep hearing this advice repeated. Maybe I live in Crazytown, but I doubt it's realistic at any scale and likely self-selects for young, inexperienced, or presently unemployed candidates.
So, in practice they are terrible primary keys in systems that do not have a native UUID type. In that case, an 8-byte bigint generated externally by a ticket service like Snowflake is often far superior.
Basically, while studying temperament is interesting, the reality is it rarely causes practical issues. Most pianos are tuned with equal temperament, which is good enough and almost every other western instrument has enough flexibility to adjust "on the fly."
I'd like to give PostgreSQL the benefit of the doubt here, but this behavior seems fundamentally incorrect to me.
In MySQL, I get the exact behavior that I expect with anything above RC isolation level (which is the default for PostgreSQL):
session 1> create table foo ( k varchar(10) not null, v varchar(10) not null ) ;
session 1> set transaction isolation level read committed;
session 2> set transaction isolation level read committed;
session 1> insert into foo (k,v) values ('a','b');
session 1> begin;
session 2> begin;
session 1> delete from foo where k = 'a';
session 2> delete from foo where k = 'a';
-- transaction hangs here as expected since session 1 has a lock on this record
session 1> insert into foo (k,v) values ('a','c');
session 1> commit;
-- session 2 executes the delete
session 2> insert into foo (k,v) values ('a','e');
session 2> commit;
session 2> select * from foo;
+---+---+
| k | v |
+---+---+
| a | e |
+---+---+
When I do this in PostgreSQL, I end up with 2 rows in the table, which seems fundamentally incorrect and to me implies that PostgreSQL's implementation of read committed is flawed and should be fixed. The transaction in session 2, at RC isolation, should see the most recently committed result, which is the single record from session 1. I'm not CJ Date, though so am very likely missing some subtlety.PostgreSQL after the sequence above:
test=# select * from foo;
k | v
---+---
a | c
a | e
(2 rows)
What am I missing? Why is this considered correct behavior?