Updates from January, 2012 Toggle Comment Threads | Keyboard Shortcuts

  • John Congdon 9:26 am on January 4, 2012 Permalink | Reply  

    Solved: vBulletin Quick Reply Not Working (ckeditor.js unable to get value of the property ‘label’) 

    I have a vBulletin board that I manage and while recently had users complain about the Quick Reply not working.  They had to go into the advanced editor to make it work.

    Doing my due diligence as an IT professional quickly narrowed it down to…. IE of course.  I spent hours digging, using a debugger I kept getting the error in the title of this post.  I kept going through the Call Stack trying to figure out what was going on, but the javascript is minified very tightly, so following it became daunting.

    Two days later another user complained about not being able to update their profile.  While debugging this, both problems became very clear.

    I had recently put in some rewrite rules to make the forum more SEO friendly.  However there are a couple situations where the rewrite rules broke down.  I was missing the two lines colored in green below.

    RewriteEngine On
    RewriteRule ^/videos.html /forums/36-Bowling-Videos-amp-Pictures
    RewriteRule ^/threads/ckeditor.php /ckeditor.php?t=$1 [L]
    RewriteRule ^/threads/(.*) /showthread.php?t=$1 [L]
    RewriteRule ^/forums/(.*) /forumdisplay.php?$1 [L]
    RewriteRule ^/entries/(.*) /entry.php?$1 [L]
    RewriteRule ^/blogs/(.*) /blog.php?$1 [L]
    RewriteRule ^/members/ajax.php /ajax.php?$1 [L]
    RewriteRule ^/members/(.*) /member.php?$1 [L]
    RewriteRule ^/list/(.*) /list.php?$1 [L]
    RewriteRule ^/list/author/(.*) /list.php?$1 [L]
    RewriteRule ^/$ http://www.bowlingboards.com/forum.php  [R,L]

    It was that simple.  I am sure I am missing some other rules, and will try to get them corrected in due time.

     

     
  • John Congdon 9:07 pm on March 11, 2011 Permalink | Reply
    Tags:   

    PHP User Groups (Orlando and Daytona Beach) 

    I am a member of two PHP user groups.  Each one runs a little bit differently.  I am looking for feedback from other people in other PHP user groups to find ways we may be able to make these better.

    The East Central Florida PHP User Group (Daytona Beach area) is new/restarting.  They have only had one meeting so far, and finally scheduled another a few months later.  They seem to be more geared towards teaching new PHP developers.  While we haven’t done anything so far, they are leaning towards a mentor/student type of group.

    The Orlando PHP User Group is quite different.  They lean towards more presentation style meetings.  Someone proposes a topic, and then someone volunteers to be the presenter.  If there isn’t a presentation, then they do some coding in DjangoDojo.  I have not been to a meeting without a topic yet, so I am not sure how those go.  I probably should since I am not very familiar with Django (or Dojo for that matter) at all.

    Of the two, I prefer the Orlando version because I am growing my skills.  However, I may like the mentor version because I feel I am a decent programmer and love teaching.

    I am looking forward to doing a presentation sometime, because I really want to improve my speaking skills.

    How does your user group run?  What is your preference?

     
    • Cal Evans 8:32 am on April 11, 2011 Permalink | Reply

      Hi John!

      I'll preface my remarks by saying I know David over at the Orlando PUG and think he is doing a great job.

      I've never seen a PUG organized around a mentor/student model. I think that could be very interesting but only if it has a very dedicated leadership. The problem I foresee is that as students grow and mature, they will fade. A strong leadership may be able to flip them to mentors but you will constantly be rotating people in and out. This is where a traditional UG structure comes in handy. By having an ongoing program of presentations and discussions, you give developers of all skill levels reasons to continue to attend.

      I would suggest that you start with the traditional structure and once you have your base solidified, appoint someone to run a mentoring program. Make sure that the mentoring group meets on an alternate week so as not to draw attendees away from the main group.

      IMHO, etc.

      =C=

      • John Congdon 8:41 am on April 11, 2011 Permalink | Reply

        Thanks Cal! So from your experience, most User Groups follow the Orlando model of presentations? I know that you probably had a lot of interactions with PHP UserGroups through your CodeWorks tour (which I enjoyed very much).

        That is definitely my preferred model, as I constantly add new tools to my tool belt. I feel I am learning, but at the same time I have been able to share from my experiences.

        By the way, how's the move to Orlando/Central Florida progressing?

    • John Congdon 8:44 am on April 11, 2011 Permalink | Reply

      I will also add, that the group needs to meet regularly to be successful. The fact that the East Central Florida inro meetup was 2 1/2 months ago, makes it difficult to keep people engaged. Hopefully after this meetup, we can get it more regular.

      The fact that we are meeting in a Wine Bar also makes me want to attend… ;-)

    • rdohms 9:02 am on April 11, 2011 Permalink | Reply

      Interesting points of view.

      Here in São Paulo we have never been able to maintain regular meetings every month or so, its hard getting around and finding a place, our beverage subgroup is better at it, eventually.

      But we do promote events every nw and then and we actually cover both cases you mentioned, some meetings are gueared toward presentations and some a guided toward coding and mentoring, like our TestFest, whe had quite a bit of new developers and the older one were very enthusiastic about helping averyone. We also try to add the mento mindset in our presentations, trying to bring sessions that will grow everyone, from newbie to veteran.

      Maybe you can mix both styles there as well?

      • John Congdon 9:07 am on April 11, 2011 Permalink | Reply

        Great point. I noticed that in Orlando. Some of the presentations do start from the bottom and work up. My first experience with a UserGroup concerned me that the group was going to be too basic. But I made it a point to continue to go and I am very happy that I have.

        I enjoy getting to meet other people with a similar mindset. I could be more outgoing for sure, but I have found myself at least one new person every meeting to have a conversation with.

        And I do feel like I am adding skills that I can use now and/or in the future.

        THANKS EVERYONE!

    • Joel Clermont 9:25 am on April 11, 2011 Permalink | Reply

      In Milwaukee, we tend toward the presentation model as well, however we make sure to regularly include other features like a roundtable discussion or a "show and tell" breakout session. At each monthly user group meeting, we try to have two short presentations, one aimed at beginners and one aimed at professionals. Every other month or so, we'll have only one presentation and then use the remaining time to break out into smaller groups, fire up the laptops and help each other with code or show off what we've been working on. Everyone seems to enjoy and benefit from those sessions.

      One other side comment, even though it takes more work, it's good to have a variety of speakers from within the group. As the organizer, it's easy to throw together a presentation each month, but by encouraging members to step up and present, they take more ownership in the group and it becomes stronger overall. I've been very impressed by our members and the quality of presentations they create, despite having never presented before.

      More info at mkepug.org

    • Lineke 9:36 am on April 11, 2011 Permalink | Reply

      Hi Joel,

      Here in the netherlands we have the PHPBenelux Usergroup. They also have the presentation style meetings, which i think will work best. Maybe you could do both? Offer presentations during the meetings and use the internet (e.g a forum or something) to set up a student/mentorship program. PHPWomen has the big sis/little sis program which is basically the same idea.

      Greetz, Lineke

    • Matthew 12:30 pm on April 11, 2011 Permalink | Reply

      At the Burlington, VT, PHP user group, which I used to attend (I no longer live there), we went the presentation style route. One thing we did, however, was to use Google Moderator (http://www.google.com/moderator/) to allow members to recommend and vote on topics. We found that when we did this, and had folks step forward to present on highly moderated topics, our attendance went up, and attendees tended to get more out of the meetings — because they were getting information they were interested in.

      • Matthias Gutjahr 4:39 pm on April 11, 2011 Permalink | Reply

        Good idea, Matthew. We (http://www.phpug-rheinhessen.de/ in Germany) also took the presentation style approach and at least try to meet every 6 weeks. It's sometimes difficult to find a presenter, and then we have discussions about various topics. Our attendees are mostly more or less experienced devs, but there are very active "normal" folks, too ;)
        We don't focus solely on PHP, but already had presentations on Javascript, Mobile Apps, or Microcopters (next week). Increasing the attendance is one main challenge for us, so maybe Google Moderator is worth a try.

    • jaguarnet7 9:46 pm on April 12, 2011 Permalink | Reply

      John,

      Here in Rio de Janeiro, we (phprio.org) use mailing list to tecnical subjects. We also have the presentation and beverage style meetings.
      A particularity of my city are the various Coding Dojo meeting, virtually all days of week has a Dojo running. This promotes a contact with various developers.

    • David Rogers 10:38 am on April 15, 2011 Permalink | Reply

      John,

      What a great discussion you’ve sparked here…! Thanks so much for participating. Can I post this to the group for additional comment from the members? I know some of our folks ride the line between two groups or have moved on to other cities, so it might illicit some other opinions.

      One correction, though: our non-presentation meetings are Coding Dojo meetings using PHPUnit, similar to the ones in Rio that @jaguarnet7 talked about. In fact, our resident “sensei” hails from there and kicked off the OrlandoDojo.org group from the PHP group, actually. I still help him out with that.

      My motivation for choosing the presentationVstyle model is mostly efficiency. It’s much easier to get someone to give a talk and have a little intro, Q&A, and social time than it is to organize a mentoring program, and ppl are less likely to show if it’s just a round-table discussion, I’ve found. The dojo is the _least_ maintenance, though, since it requires almost no planning up front. Still, I think you’ve got some great ideas. Let’s talk about them!

      • John Congdon 3:56 pm on April 19, 2011 Permalink | Reply

        Hi David,

        For some reason, your comment did not go into IntenseDebate. I am trying to import it now, that’s why I missed it for so long. :(

        You can definitely share with the group. I would really like to open the dialog as much as possible.

        As for the coding Dojo, I will correct it. :) I haven’t been to one of those meetups yet, and have not used Dojo at all. I guess I should at least look into it.

  • John Congdon 8:22 am on January 6, 2011 Permalink | Reply  

    APC Configuration Hell 

    Note to self: Know where your configuration files are.

    I have been fighting an APC out of memory/100% fragmentation nightmare.  I kept tweeking settings in /etc/php.ini and nothing seemed to be fixing the problem.  Sure, gracefully restarting Apache will appear to fix the issue at the moment, but then it returned.

    I started looking at the Runtime settings in apc.php and realized that nothing I had set really changed anything.  Turns out, apc by default put its config in /etc/php.d/apc.ini.  Sure, I would set them in php.ini and then they were overwritten in apc.ini.  ARGH!!!!

    Found and fixed… YAY!

     
  • John Congdon 7:00 am on June 10, 2010 Permalink | Reply  

    I Need PHP Advice From The Community, #tekx 

    I will try to keep this short.

    My Background:
    I have been programming for 20 years (12 professionally).  Grew up on BASIC and PASCAL.  And first job was in the old school Q&A database.  Needless to say, I started out very procedural.  My first web programming started in 1999 with PERL.  And I have always had the attitude of I will make it work and work quickly.

    Advice Needed:
    I took over a project 6 years ago.  It started with no pay, just a percentage of profits at the end of the year.  I took what they already had, and extended it to be able to sell more.  I year after that I was hired full time and have just been adding on top of the mess since then.  Spaghetti code, procedural, unused database tables, unused database fields, it’s just a mess.  I know OOP, but haven’t had the aha experience until a couple of years ago.  I used objects here and there, but ultimately not in good form.  

    I went to TEKX to improve my skills.  I have been looking into Zend Framework, CakePHP, and others for about a year, and have decided to go with Zend Framework and Doctrine.  So I am going to rewrite my entire codebase.  Here is where I need advice.  I’m at a fork in the road.

    I can either keep my bad database structure and work with it, or start from scratch and migrate the old data into the new database layout.

    Pros for keeping the DB structure:
    I can build parts of the site in ZF and get the code live quicker, letting the old codebase continue to run and eventually die out on its own.

    Cons for keeping the DB structure/Pros for rewriting the DB structure:
    The old DB is a mess.  A new DB structure will probably improve speed and data accuracy.

    Cons for rewriting the DB:
    I will have to rewrite the entire codebase before it can go live.  Everything will need to be rewritten and tested.  A data migration script will need to be written.  And a date will need to be set for new code to go live.

    Any advice would be greatly appreciated.

     
    • Cory 7:20 pm on June 16, 2010 Permalink | Reply

      Give it up, just use Ruby on Rails and be happy…

    • btaylor1948 3:55 pm on November 28, 2010 Permalink | Reply

      Probably too late to comment, but redo the db. If you are taking the time to rewrite the code, give it a clean database to play with. IMHO

  • John Congdon 9:59 am on September 29, 2009 Permalink | Reply
    Tags: Cache   

    I Need More Cache 

    I hate knowing the answer to a problem, but taking for ever to implement it.  Cacheing is probably one of the most important things I can do to improve a website, and yet it is one of my worst nightmares.  It shouldn’t be at all.  I have a fear of using outdated data because of my spaghetti code. :(

    I am working on this and coming to solutions slowly.  It really was apparent on the last update I made.  I had a script that was running probably a thousand plus queries.  During testing by myself, of course I didn’t notice it.  Launch it live to thousands of users running thousands of queries and you quickly learn about the mistake.  To the tune of taking the server to its ‘knees’, which is kinda neat because they don’t have knees.  Throw some quick cacheing into the mix and you have a happy system, and a happy system administrator (ME).

    Check out the new feature that caused my little nightmare on bowlingball.com top sellers and bowlingball.com popular searches.

     
  • John Congdon 6:57 pm on August 13, 2009 Permalink | Reply
    Tags: master/slave, ,   

    Mysql Master / Slave Thoughts 

    I have been thinking about a way to have isolated machines that I can almost take on and off line very easily.  Here are my thoughts and would love feedback on my “solution”.

    I am almost thinking about “spinning” the traditional model.  I will have my Administrative DB(ADB) in a central place.  ADB will be where I pull all reporting, master updates of product and pricing, all orders, etc….

    On each individual web server I will have a slave DB (SDB) that will replicate all data from ADB.  The individual web servers will pull information from SDB for pricing, dynamic web pages, etc…  It will also have its own database (ODB) for writes (order information mainly, maybe other statistics as well).  When an order is placed (instead of trying to reach ADB) it will put the information into ODB.

    Now I can have a cron job that will pull the data off each ODB to update ADB for reporting purposes.

    Why?

    1. Each web server should be able to run without relying on any other machine.
    2. Once the web server’s SDB is up to date, there should be very little delays in price/product changes.
    3. Scalability, simply launch a new server to be up and running.

    Does this make sense?
    Web servers write to ODB
    Administrative server reads from ODB to update itself which replicates to all the SDB (Every slave/web server becomes a realtime backup of ADB)

    Here is a diagram of my thoughts.

    DB Proof of Concept

    DB Proof of Concept

    Reblog this post [with Zemanta]
     
    • Melissa Muma 4:06 am on August 31, 2009 Permalink | Reply

      What the ****?

  • John Congdon 10:13 am on December 16, 2008 Permalink | Reply
    Tags: Checkout by Amazon   

    Cart Level Promotions with Checkout By Amazon 

    I was recently trying to offer a cart-level promotion with “Checkout by Amazon”  and while looking through their Developer Guide, I became very confused.  Their promotion section lead me to believe that I could offer such a discount, but it wasn’t clear at all.  I tried googling it, and other research to no avail. :(

    I finally read through the XSD which is not the most fun things to use to try and solve a particular problem.  But the answer was there.  To offer a cart level promotion, you simple need <CartPromotionId>DiscountName</CartPromotionId> in your <Cart></Cart> section.  And then the same <Promotions> section that they have laid out in the documentation for item-level discounts.

    I hope that this helps someone find the information faster than I did.

    This answers the question: “How do I offer cart-level promotions in checkout by Amazon?

     
    • sam 7:36 am on June 13, 2009 Permalink | Reply

      Thanks. This was very helpful.

  • John Congdon 2:56 pm on October 20, 2008 Permalink | Reply
    Tags: Website Changes   

    Added The Ability to Include Discontinued Items 

    I have heard many complaints from customers that there are too many products on bowlingball.com that are “Not Available”.  When looking at a list of bowling balls or bowling shoes they would see them scattered throughout the list and wouldn’t understand why there were there. 

    “If they are not available, why do you keep them on the site?”

    Our answer is simple, people like to look up information on older equipment.  They also like to compare old equipment to new equipment.  And the real die hard bowlers like to reminisce over older equipment.

    Well now your searches will initially not contain the added bulk of these additional items.  But if you want to find them, all you have to do is check the box that say include discontinued items.

     
  • John Congdon 8:46 am on July 25, 2008 Permalink | Reply
    Tags: Programming   

    How I Got Started Programming 

    Ok, so I somehow I came across a post by Joe Stump from Digg and I have found this “chain letter” type post. I want to participate, so here goes. :)

    How I got started programming:

    1. How old were you when you started programming? I had a real interest (unexplainably) in computers when I was around the age of 7 even though I had only used one a couple of times. My mom dated a guy when I was about 9 whom had a computer and he had King’s Quest 3 (I fell in love with computers).
    2. How did you get started in programming? My mother met her current husband and he had a Tandy Cocoa Color III.
      He taught me BASIC and I used a reference book that I still have
      today. It had every command on a separate page with a description of
      what it did. I went through the book trying most of the commands.
    3. What was your first language? My first language was BASIC, however I also did quite a bit on the TI-85. I create a Space Invaders type game on the TI-85.
    4. What was the first real program you wrote? My first program was a simple quiz game for my youngest sister, it taught her our address, phone number, etc… I also did some db work in a program called “Q&A” for the company my mom worked for “Connery Concrete”.
    5. What languages have you used since you started programming? I started in BASIC, in high school I became a Pascal user, after college I moved to Perl as I became a “web guy”, and have since changed to PHP. I have dabbled in others, but very limited.
    6. What was your first professional programming gig? My first paid job was for Connery Concrete doing some DB work. They did not store their information in a convenient way to make use of it. I also did similar work for a travel company. Before I started they entered all of their customer data into “Q&A” and then hand wrote all of the information onto forms. What a complete waste of time that was.
    7. If there is one thing you learned along the way that you would tell new developers, what would it be? Think outside the box. I can’t tell you how many things I have been able to do because I have thought about the problem and solution a little differently than any of my colleagues. “There is more than one way to skin a cat” is something my mom used to say all the time.
    8. What’s the most fun you’ve ever had programming? I have to say what I am doing now is. I am part of a team that cares where our project is going. Ecommerce is such a competitive field, and selling bowling balls is tricky. Trying to be on the cutting edge and know that you are doing it before the competition can blink is a GREAT feeling. Having a boss that doesn’t just settle on a store bought solution because it may be cheaper makes me feel very appreciated. I have really grown to love the sport and the nuances that go into it. And to be able to spend my day working in this industry is just plain awesome.

    I had to follow suit when I saw this post from Joe Stump. I can’t imaging working with such cutting edge technology persona’s as Kevin Rose, and the old crew from the Tech TV era.

    I wish I had people to tag. The only other programmer that I knew and respected was the best man in my wedding, but he has pretty much cut me out of his life. :( Long story, but I miss his friendship. The long talks we could have. Working together on programming projects. Makes me sad when I think about it.

    Oh well. He knows who he is and if he wants to carry on this type of post, I would be honored.

     
    • Cory 8:52 am on September 29, 2008 Permalink | Reply

      I guess someone has to comment on your ramblings. Things were different then, the future a bit brighter, the path more clear. I am not proud of most of what has happened since then, especially against you personally. I wish I could make sense of it all, but if I wallow in the mistakes of the past, I could easily drown in them.

    • john_congd46001 11:05 am on September 29, 2008 Permalink | Reply

      I do tend to ramble sometimes, that's for damn sure. I appreciate getting a response from you. I see that you knew who I was referring to.

      I don't hate you for the choices that you made. I was disappointed, but I can understand (a little) what you were feeling.

      I started to write a lot more, but it was rambling and I am sure this isn't the right place to air things out. Thank you for commenting.

      I am interested in reading what you have written about so far. It looks like you have moved on to Ruby on Rails. I have considered trying that, but never have grown the balls to try it. Kind of stick with PHP and Perl now.

      I hope to hear from you again. Take care.

    • John Congdon 1:51 am on October 1, 2008 Permalink | Reply

      I personally read the line as you having a smiley face. I could just picture you saying that in your way with a smirk. "well someone has to respond to your ramblings."

      I understand that I will be associated with the incident and I wish that I wasn't. I, we(Charlie and myself) were told that you wanted out and that you sent an email asking to be bought out. What happened from there was between you too.

      I definitely want to stay on the cutting edge and am always trying. I have started looking at Rails in the past and am not sure why I didn't proceed.

      I have tried to stay plugged into this social networking thing, watching tech podcasts and just staying in the loop. Using Twitter I find myself looking at all sorts of fun links that people post. And staying tuned in to the latest things available, like Google Chrome, and other information.

      I will read this PDF for sure. I like the aquasun site. Good job. Do you all of the programming still, or are you part of a team?

    • Cory 3:19 am on October 1, 2008 Permalink | Reply

      You and Charlie got the correct story, but the devil is in the details. We did 800K in sales in my time there (not counting eBay). Not groundbreaking, but not peanuts. My buyout was done in a exploitative way because I was in no position to do anything about it because signed agreements were always "just around the corner". To me, my deep respect for this person was all the contract I needed. I guess he didn't need to give me anything, but the pittance given was more of an insult than anything. Maybe he didn't see the full potential at the time and was not willing to invest. He could not have gotten where he is today with the site without full-time staff. He wasn't ready to be big yet, maybe I was lazy and did bad work

      Unfortunately, since then I have approached every situation with C.Y.A. in mind and it can really screw with the way you pursue new projects.

      This is the last time I will bring up this topic.

      Feel free to delete this comment as this is a personal/business blog.

    • Cory 3:41 am on October 1, 2008 Permalink | Reply

      Change is hard, especially when you are so familiar with one type of language. It is also harder to find the benefit in migrating to a new platform. It was easier for me because the project was fresh and I wanted to try something new.

      I still haven't really done much with the social network thing. I have a hard
      time seeing these things as a productive use of time (not that I use my time well anyway).

      The PDF is big, but after the first few pages, you will be hooked. I sorta like the site, it is only been launched for a month. There is some AJAX sprinkled in there that Rails makes very accessible. The real magic is in the backend: ebay API, ebay store, google shopping, etc…

      At the end of the day it is still e-commerce. I would rather be writing something else, but it pays the bills.

      I am the only coder, but I have Lee and Charlie on my team. Rails does such a good job separating logic from HTML that designers can write their own views without much help from me. We don't have to code, design, then integrate as much. I can code logic and hand the design off to them for most of the integration.

    • Cory 9:30 am on October 1, 2008 Permalink | Reply

      I should have put a smiley face after my first sentence as I wasn't using "rambling" in a negative light. I had read all your posts and to me blogging is rambling mostly because nobody is really listening; not to little guys like us anyway.

      You have every right to be disappointed or super-pissed. For what I did to you, I am truly sorry and I hope I can make it right one day. This doesn't change my opinion about the other person. Even with many years and a clear head to consider what happened I still feel very wronged. Unfortunately, you were attached to this incident and will forever be associated with it in my mind.

      I know you always wrote good, modular code, so maybe you have found your sweet spot with PHP and Perl, but since you do write good code, trying Rails is a MUST.

      Grab this and soak it in: http://www.rescuenil.com/AWDR.pdf

      Plus, you gotta stay on the cutting edge of this stuff. There is a lot going on out there and learning new stuff keeps you fresh and gives you different ways to look at problems. Finding myspace (bleh!) late is ok, but don't miss Rails

      Current Rails project: http://www.aquasunmotorsports.com/shop/

    • John Congdon 7:00 am on October 5, 2008 Permalink | Reply

      This is my personal blog, through and through. Thank you for sharing your views.

    • John Congdon 7:08 am on October 5, 2008 Permalink | Reply

      Have you looked into using Twitter? It really can be addicting. Then there is ping.fm, which lets you post in one place and have it automatically post to a bung of others (Twitter, pownce, plurk, etc…)

      I like the social networking in a sense that I keep up to date. I follow mostly tech people and they are constantly throwing out links to the latest and greatest. I decided to do the social networking thing because of many of the podcasts that I watch/listen to. I started by following the hosts there and have built it up from there. If you don't watch podcasts already, I highly suggest checking out http://www.geekbrief.tv and http://www.revision3.com for some of my favorites.

      I am not sure what your plans for http://www.rescuenil.com are in the long run, but I do have an invite code for Intense Debates if you would like one. I know you are not into social networking, but that is how I have built my little following. I have a couple of people that do come here when I post new topics.

      I started reading the PDF a little. I really want to print it out, but it is so big. But reading print is so much easier.

  • John Congdon 9:43 am on July 22, 2008 Permalink | Reply  

    Cleaning our offices for a Thur meeting with a major executive in the bowling industry. :) Gotta love putting on a show.

     
c
compose new post
j
next post/next comment
k
previous post/previous comment
r
reply
e
edit
o
show/hide comments
t
go to top
l
go to login
h
show/hide help
shift + esc
cancel