Tuesday, 18 February 2014

jsmin.js keeping important comments unchanged

More than dozen years ago Douglas Crockford, the JavaScript guru, has presented his JavaScript Minifier. This tool obfuscates the JavaScript code, removing extra whitespaces and comments. Later, Franck Marcia has adapted the C-written program to JavaScript. See his implementation at the page JS Minifier.

Still later, Billy Hoffman has patched the script and added the support of important comments. Important comments are specially formed comments (in practice, denoted with /*!) that are not removed by minifier. What he has done we can find out from his article JSMin, Important Comments, and Copyright Violations. The main goal to support important comments was to retain copyrights and licensing information intact.

Important comments are very useful also to keep some sensitive data within (for example, resources used by the script). Unfortunately, they are not supported completely because TAB and asterisk characters are changed (TABs are converted to SPACEs, and asterisks are eaten by the minifier). To fix this issue I have made some changes to the latest version of jsmin.js.

You can find the updated version of the jsmin.js at the GitHub. Also you can apply the following patch for the existing on your computer copy of the original script:
1a2,9
> jsmin.js - 2014-02-04
> Author: Ildar Shaimordanov
> This version was patched to keep important comments (denoted with /*!) 
> unchanged. The previous version of jsmin.js ate asterisk symbols and 
> modified some characters as well (for example TAB was replaced by SPACE). 
> Sometimes, comments should stay unchanged (for example, a function could 
> keep its resources within comments). So this version does it. 
> 
128,131c136
<     if(c >= ' ' || c == '\n' || c == '\r') {
<       return c;
<     }
<     return ' ';
---
>     return c;
141a147,150
>   function peekIC() {
>     theLookahead = getcIC();
>     return theLookahead;
>   }
173,174c182,183
<                   if(peek() == '/') {
<                     getc();
---
>                   if(peekIC() == '/') {
>                     getcIC();
176a186
>                   d += c;

Wednesday, 4 December 2013

Cygwin Here

This short article explains how to open a specific folder in Cygwin.

Friday, 17 May 2013

Modulo adjustment

If you open MDN pages, describing Math.ceil, Math.floor, and Math.round, you will find the good example of the adjustment and rounding based on the decimal logarithm. For exdample, Math.ceil10(55, 2) returns 100 where 2 expresses an exponent for 10^2.

Besides of logarithmic adjustment we can use modulo based adjustment. It is almost the same as above but uses an arbitrary number for adjustment.

Tuesday, 2 October 2012

Continuing long lines in a batch script

Unintentionally I found for myself that a batch script has a nice feature to break long lines without loosing of possibility of reading them.

Imagine, you have some weird combination of commands as below that is not put completely in one line of a screen.

some-command-with-many-arguments | another-lomg-command-with-its-own-arguments | etc | etc | etc

If the line of a code cannot be shown within one line on a screen it will be i) either turned and the rest of line will be shown below on one or more lines or ii) continued out of edges of the screen with a horizontal scrolling bar. Both of them are not convenient because we not able to observe the code entirely.

Fortunately, modern batch scripts (in XP, Vista, Win7) have blocks implemented by brace:

(
    some-command-with-many-arguments 
) | (
    another-long-command-with-its-own-arguments 
) | etc | etc | etc

I known this feature (because I used brace in the if-else and for statements) but did not realised right now.

So, this gives us good possibility to break the long line into a several lines without loosing of functionality. This is better than nothing and is better than undocumented feature using the DOS-like escaping character ^ at the very ending of the line because you have to look after that this character is in the lastest character of the line. See the same example with the esacaping character:

some-command-with-many-arguments | ^
another-long-command-with-its-own-arguments | ^
etc | etc | etc

Unix shell scripts are featured to continue long commands using by backslashes since the begining of the Unix wolrd.

some-command-with-many-arguments \
| another-long-command-with-its-own-arguments \
| etc | etc | etc

Saturday, 29 September 2012

How to concatenate multiple lines in console (bash, cmd)

If for some reasons you need to have concatenated lines try one of the recipes below.

Monday, 25 June 2012

Merge and sort many logfiles having multiline entries

logmerge is the small and powerful script to merge two or more log files so that multiline entries appear in the correct chronological order without breaks of entries. Optional arguments control an adding of descriptive fields at the beginning of each line in the resulting combined logfile. Reading of .gz/.bz2 files is available.

Tuesday, 15 May 2012

Regular Expression Analyzer

Neat online tool. Regular expressions are described in the human-friendly style.

Regular Expression Analyzer

Sunday, 25 March 2012

Universal way to identify your external IP and more

There are many such kind of resources in Internet but this is the best. It allows the numerous structured data and it has nice name. Meet http://ifconfig.me/.
Command line interface
Using curl
curl ifconfig.me
or wget
wget -qO - ifconfig.me/ip
JScript
JS
var xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
xmlhttp.open('GET', 'http://ifconfig.me/ip', false);
xmlhttp.send();
 
var ip = xmlhttp.responseText;
JS+XML
var xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
xmlhttp.open('GET', 'http://ifconfig.me/all.xml', false);
xmlhttp.send();
 
var ip = xmlhttp.responseXml.getElementsByTagName('ip_addr')[0].text;
Having JSON library you can read and parse JSON data:
var xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
xmlhttp.open('GET', 'http://ifconfig.me/all.json', false);
xmlhttp.send();
 
var data = JSON.parse(xmlhttp.responseText);
var ip = data.ip_addr;
VBScript
Dim xmlhttp, ip
 
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.open "GET", "http://ifconfig.me/ip", False
xmlhttp.send
 
ip = xmlhttp.responseText

Thursday, 5 January 2012

Artist/Album Info in Foobar2000

foobar2000 is perfect mediaplayer for Windows platforms. It is kind of those applications whose functionality is extendable simply adding plugins. One of these finest plugins is Run services that allows to run external applications and scrpts from within foobar2000.

I use Run services to view/edit information about albums or artists stored in plain text files. Let's consider how it is possible.

Monday, 10 October 2011

Версии Internet Explorer

Нечасто, но иногда на странице требуется программно определить какой же браузер и какой версии используется. Для этого существует несколько способов определения.