WHMCS API: heritage of whmcs-ruby gem

Joshua Priddle did a great job back in DotBlock accomplishing Ruby binding for WHMCS API. Unfortunately, last signs of activity were 3 years ago. It’s a pity, as gem is great, and works like charm, but it became massively outdated, and piled with pull requests no one merged in the master branch for ages. The code was published by MIT license on 2011, thus whmcs-api gem will be its descendant, which I’ll try to keep updated as much as possible....

April 3, 2014 · 1 min · anvyst

Punycode domains: why?!

Honestly, I couldn’t get the idea of non-latin alphabet used in domain names. Especially when the standards were passed, and Registrars started offering cyrillic, arabic domain names, but web browsers still were preferring to output it as a punycode mess. A pretty simple cyrillic domain like ‘президент.рф’ (stands for president.rf) becomes ‘xn–d1abbgf6aiiy.xn–p1ai’. Not all the browsers still keep cyrillic domains in the address bars, so you’d see some punycode mess in there....

March 19, 2014 · 1 min · anvyst

How bad is your Change Risk Anti-Pattern index?

CRAP is short for Change Risk Anti-Patterns – an acronym to protect you from deeply offensive code. Measures the C.R.A.P. (Change Risk Anti-Patterns) score. It is designed to analyze and predict the amount of effort, pain, and time required to maintain an existing body of code. A method with a CRAP score over 30 is considered CRAPpy (i.e., unacceptable, offensive, etc.). C.R.A.P.(m) = comp(m)^2 * (1 – cov(m)/100)^3 + comp(m) Where comp(m) is the cyclomatic complexity of method m, and cov(m) is the test code coverage provided by automated tests....

March 17, 2014 · 1 min · anvyst

Friday pint talks with fellow inhouse developers

X:- Hey, we’ve recently launched a cool piece of NDA in our proprietary NDA. Y:- Sounds great. How did you manage to prototype it? X:- Well, we took some NDA, with NDA, cuz the first one had some problems with caching, and with some NDA, we got this NDA to work! Y:- Why did you use this NDA, when NDA we use in the company does NDA better, it’s more NDA, NDA and NDA that this!...

February 14, 2014 · 1 min · anvyst

SQL reinsert row in the same table

Seems that we have a competitor to “export to csv” SQL query that I keep forgetting every time I need to export something in the CSV file. The second nominee is reinserting the row into the same database but with a new primary key. # YOURID - source record # yourtable - target table; CREATE TEMPORARY TABLE tmp_table SELECT * FROM yourtable WHERE id=YOURID; SELECT @new_id:=((SELECT id FROM yourtable ORDER BY id DESC LIMIT 1) + 1); UPDATE tmp_table SET id=@new_id WHERE id = YOURID; INSERT INTO yourtable SELECT * FROM tmp_table WHERE id=@new_id;

February 10, 2014 · 1 min · anvyst

Migrating to Fozzy.com: finale

I finally accomplished my migration to Fozzy.com, taking in account domain transfers and all required procedures. Just for doing some benchmarking, but overall - everything is tuned and migrated smoothly. First impressions are super-positive. It’s fast, really fast, even though I haven’t tried our free CDN network. Couple of glitches were found in the Control Panel of Fozzy billing, which I added in the backlog, and will try to resolve soon....

January 2, 2014 · 1 min · anvyst

Ruby Sinatra in less than 999B of code

%w.rack tilt date INT TERM..map{|l|trap(l){$r.stop}rescue require l};$u=Date;$z=($u.new.year + 145).abs;puts "== Almost Sinatra/No Version has taken the stage on #$z for development with backup from Webrick" $n=Module.new{extend Rack;a,D,S,q=Rack::Builder.new,Object.method(:define_method),/@@ *([^\n]+)\n(((?!@@)[^\n]*\n)*)/m %w[get post put delete].map{|m|D.(m){|u,&b|a.map(u){run->(e){[200,{"Content-Type"=>"text/html"},[a.instance_eval(&b)]]}}}} Tilt.mappings.map{|k,v|D.(k){|n,*o|$t||=(h=$u._jisx0301("hash, please");File.read(caller[0][/^[^:]+/]).scan(S){|a,b|h[a]=b};h);v[0].new(*o){n=="#{n}"?n:$t[n.to_s]}.render(a,o[0].try(:[],:locals)||{})}} %w[set enable disable configure helpers use register].map{|m|D.(m){|*_,&b|b.try :[]}};END{Rack::Handler.get("webrick").run(a,Port:$z){|s|$r=s}} %w[params session].map{|m|D.(m){q.send m}};a.use Rack::Session::Cookie;a.use Rack::Lock;D.(:before){|&b|a.use Rack::Config,&b};before{|e|q=Rack::Request.new e;q.params.dup.map{|k,v|params[k.to_sym]=v}}} That’s a wow! That’s what I call a minimal Web Framework. Full description of the code can be found here.

December 20, 2013 · 1 min · anvyst

Future of PHP and HHVM buzz

Input Processing and sanitize (GET/POST/COOKIE) Session Management Database Access without surprises Syntactic sugar for callbacks Template processing XML, HTML, JSON processing These are stuff that PHP should already have in some kind of fast internal c code, but it simply fails to deliver. Frameworks fill the gap. If HHVM provides substantial better alternatives and people use HHVM then Frameworks will use these extensions. Framework code is already filled with edge case handling for different PHP Versions, adding a case for HHVM isn’t a problem....

December 19, 2013 · 1 min · anvyst

WHMCS: IPv6 issues

I suspect that input filtering is being done on ALL the variables at the moment of initialization now, and that an IPv6 address containing colons : is being wiped from the server array. This would explain no IP address being returned back to the client.(c) It seems that WHMCS has problems using Whitelists/API restrictions. It can’t digest IPv6 addresses. Pity, as IPv6 are next door and hosting industry is quite sensible for this issue....

November 12, 2013 · 1 min · anvyst