Wednesday, September 14, 2011

Lynx: Associating filetypes with a program in Windows

After a few hours of trying and failing in lynx.cfg and searching the Internet, I found a reasonably good collection of ideas (kudos to Kenneth Kwok), which served me with inspiration for a working solution.

• The version of Lynx is 2.8.7rel1, unfortunately it doesn't support SSL (gonna work on getting Lynx with that some day...).
N., 15.09.2011. update: A fully functional and SSL-enabled, albeit an older, 2.8.5rel1, version of the browser is available at Claudio Santambrogio's (csant) website (beware that export and other restrictions may still apply to the downloader's country).

As I needed an SSL-based browser, then out of curiosity I started comparing both Lynx browsers' config files and to my great delight found that csant's external app configuration was more elegant than my previous discovery. Jump to a description of how to implement the better solution.

And yes, the options inspired by Kenneth Kwok are still valid, but there are now less scenarios to use them.
• The operating system is Windows xp SP3, other Windows operating systems may also apply, but exact instructions on how to change environment variables were gleaned from this version of Windows.

Unlike in the linked article, it turned out that I didn't need to use a .mailcap file to associate a helper app.

The interesting part is that Windows Lynx (still) requires batch files to send requests for an external application and a path to them must be set as a global or user environment variable.
  • Create a folder that will hold batch files. I created one in
    C:\Program Files\Lynx\Batches
  • Create an environment variable pointing to that path:

    In My Computer/System Properties > go to Advanced tab > click "Environment Variables" button > in the relevant window's "System variables" section > scroll down to Path, select it, click the Edit button;

    In the path editing window, the Path string is long, but you can add a semicolon to the end of the string (if it's missing), then right after the semicolon add

    C:\Program Files\Lynx\Batches

    and that's it. (No additional semicolon required.)

    Click OK to close the window, click OK in Environment Variables window — This will save and update the path in Windows xp (maybe 2000, too) or newer; click OK for System Properties window.

    You won't need to restart unless it's a Windows 9x OS, for which you'd need to edit autoexec.bat, enter a short-form path à la C:\PROGRA~1\Lynx\Batches and restart the system for changes to take effect.
  • Now, in the C:\Program Files\Lynx\Batches folder itself, assuming you only want an image viewer program to be associated, create paint.bat, edit it as follows:
    @ECHO OFF
    C:\WINDOWS\SYSTEM32\Mspaint.exe %1
    ^ In addition, you may wish to add %2 %3 %n — if you know that there may be more arguments passed from Lynx, but there's usually one.
    Save the batch file.
  • In lynx.cfg (opened either via WordPad or Notepad2 or something that supports both CR & LF newlines), go to a certain place in the file by searching for the image/png pattern. There, you will see which MIME types you must activate for each filetype suffix.

    I uncommented (deleted a hash # from the start of the line) all that were web images, such as those concerning .png, .gif, .jpg and .jpeg.
  • Then in lynx.cfg, go to part of the file using the VIEWER: search pattern. There, you will see a list of program commands associated with a particular MIME-type (they are short by default, because they're typically UNIX-specific).
    N., 15.09.2011.:
    Uncomment, or rather, copy, paste, and uncomment those for image formats, and modify the commands to look like this:
    VIEWER:image/gif:start mspaint %s
    VIEWER:image/png:start mspaint %s
    VIEWER:image/jpeg:start mspaint %s
    VIEWER:image/tiff:start gimp-2.6.exe %s #special case
    • The superb catch ^ is where one must use the start command to invoke a program that's located in the Windows Path environment variable.
    mspaint is the command-line name of the Windows Paint program, which is located in C:\WINDOWS\SYSTEM32 and that address is typically set as one of the locations in the Path environment variable.
    gimp-2.6.exe is a different case, where I separately had to include C:\Program Files\GIMP-2.0\bin in the Path environment variable to make it launch, as for some reason it was impossible to use the full program path in the Lynx config file.
    Uncomment, or rather, copy, paste, and uncomment those for image formats, and modify the commands to look like this:
    VIEWER:image/gif:paint.bat %s&:NON_XWINDOWS
    VIEWER:image/png:paint.bat %s&:NON_XWINDOWS
    VIEWER:image/tiff:gimp.bat %s&:NON_XWINDOWS
    VIEWER:image/jpeg:paint.bat %s&:NON_XWINDOWS
    • Up here ^, add paint.bat right after a colon that follows the mimetype;
    %s is the wildcard for the filename to be entered;
    • The ampersand & is there to leave the program in the background. It can be there in Windows, but it's useful in Unix-like systems.
    :NON_XWINDOWS [sic] basically specifies that the targetted application is not an X Window System program and this option can be there, too. In Windows it may mean that the batch program is not exactly a graphical program either.
  • Save the configuration file and I think you should be done.
    Launch Lynx, go to a page with an image file, then on it, press Enter/Return or the left key to activate.
Similar steps can be made for other filetypes and MIME-types (which can be added, btw, since the list in lynx.cfg is non-exhaustive) and you can add programs different than Paint for other filetypes. Above, I have setup a batch file to run The GIMP for the TIFF filetype.

Saturday, September 10, 2011

Absolute positioning of content in a containing block

A less formal alternative title would be "Placing content from the middle of a box into a sidebar to the edge of a containing block"

Context

The problem first occurred when I tried to create a user style for a login page to accomodate small screens (Yes, there are people who use small screens).

The main problem was that I could not change the structure of the not-so-well designed page, so I had to resort to some unorthodox uses of formatting in CSS. Later it turned out ot have some interesting uses in a sister blog.

The basic [formatting] concept behind this is taking content out of normal flow, placing it as a sidebar into the top right edge of the container block, and then making sure that other content (mostly visible text) will then flow around the sidebar box.

While it may sound simple just like that, then implementing a working solution for the first time proved more difficult. The solution that I found out does work, but still contains some caveats. More about it later and below.

In-depth

What does not work

First off, just floating the box to the right is pointless, because the box is positioned according to normal flow and is floated where it's structurally positioned in the page (or text). It is then adjacent to that content which only follows the box in the page structure.

Adding a negative top margin is just as impractical, because it will never be accurate relative to the sidebar's position, as the position of the sidebar still depends on how much space is taken up by preceding objects or text, since relative renderings are always different, depending on fonts, rendering engines and zoom levels.

If you're modifying your own content, then putting the box before the content that initially preceded it defeats the purpose of normal text flow (as seen in Lynx).

The solution

Mostly assuming that the containing block and inner blocks are <DIV> elements, which I so dislike, because they are severely overused.

The points are here in a hierarchically continuous order, so as to present the logic and reasons behind it.
  • The containing block,
    which is to enclose the sidebar and content that should surround it:
    Set its position to relative — This will keep absolutely positioned blocks inside the containing block; otherwise all absolutely positioned blocks will be taken out of all flow and will be (absolutely) positioned relative either to any preceding relatively positioned block in the page hierarchy, or the viewport, which is the topmost block.
  • The sidebar's position must be set to absolute, with most important parametres set like this:

    <DIV STYLE="position:absolute; top:0px; right:0px; width:234px">Textual content<DIV>
    ^ top:0px and right:0px will place the sidebar box to the top right (to right of main content), where position is calculated from the containing block's top and right edges; width:234px — Here you can specify your own width for the absolutely positioned box.
  • And finally, the tricky part — How to make sure that content or text surrounding the sidebar will show next to the sidebar without all of parts of it staying hidden under the sidebar?

    Well, my solution was to place the that content (which precedes the sidebar and is innards) into a relatively positioned DIV& box, with its right margin approximately the amount of the sidebar's width. This ensures that text or content inside that DIV won't stay under the sidebar.

    If the sidebar is long enough to encompass much of the content that follows, then that content should also be encased in a DIV with similar parametres: relative positioning and same margins.

    Caveats:
    • If much of the content left of the sidebar is text, then its flow is limited to the squares of DIV boxes (there must be at least two of them). Normally flowing text could then start well after the sidebar and DIV boxes end.

      Mitigating effects
      One way to mitigate this without creating separate DIVs and their left (or right) margins is to create a ghost DIV with same size properties as the sidebar floated right just under the absolutely positioned sidebar. This has better chances of taking effect if the sidebar's height and width are fixed and that the content is controlled server-side.

      Yes, the "ghost" DIV can contain about the same text, if there's a desire for that ghost DIV to follow the size of the primary DIV (think differences in fonts and zoom levels), but this then may defeat the purpose of having that text in the ghost sidebar, because it would be duplicating. Oh well, solutions can be made both with JavaScript and CSS to make sure this text doesn't appear twice in a text-only or very plain browser (think Lynx).

      Otherwise I was thinking of :before and :after pseudoelements, or of a way to insert a client-side Greasemonkey script.

      This is now the point where one can play around with various options.
    • I found another problem when editing text here in Blogger, where the sidebar height was greater than text next to it, so the sidebar, given that it was absolutely positioned, overlapped past the post tools area. In that sense it's a good thing to try out the size of the sidebar in the DOM Inspector, which allows client-side visual editing of webpage elements under inspection.

      One way to mitigate this would be wrapping all of the affected content, including some preceding the sidebar (where it visually starts) in a DIV and specifying a height greater than the height of the sidebar. The height of the DIV should then allow for some hypothetical differences in size.

This out-of-order sidebar solution works in Firefox 1.0 (Mozilla 1.7.xx, preferably SeaMonkey 1.1.19 or K-Meleon 1.5.4) and newer. It does not work in Internet Explorer 7 (or older), so a workaround must be in place, if there's a large IE-based audience in mind. It should probably work in Internet Explorer 8 or newer.

Saturday, September 3, 2011

Microsoft Security Essentials teeb arvuti aeglaseks?

Kommentaar PM/Tarbija24 artiklile ja selle kommentaaridele

Microsoft Security Essentials[:w:en] programmiga on see jama, et see uuendab väga mahukat moodi ja uuendamise ajal võtab liialt palju arvutiressurssi.

Teine jama on see, et kui arvuti töötab, kuid kui seda ei kasutata, siis hakkab MSE skannima — kujuta ette näiteks ETV-d veebist vaadates ja arvutit otseselt samal ajal mitte kasutades, kui pilt ka väärikal arvutil hakkima ja arvuti aeglaseks läheb.

Lahendus (ingliskeelses Windows XP-s) on järgmine:
Start > Programs > Accessories > System Tools > Scheduled Tasks — seal lülitasin mina välja MPIdleTask eseme.

Soovitan seda teha kogenud kasutajatel näiteks juhtudel, kui nad on sunnitud MSE-ga olema, kuid programmi sellist käitumist ei salli.

K., 15.02.2012. täiendus:
Microsoft Security Essentials programmi uuendamine toimub automaatselt ja sedasi poolenisti eraldi Windows Update teenusest. (Tingimus on, et Windows Update automaatsed uuendused on sisse lülitatud.)

Uuenduste kontrollimine ja automaatne uuendamine toimub iga kord kui Windowsisse sisse logida, sh. peale arvuti sisse lülitamist, peale arvuti "talveunest" sisse lülitamist, peale arvuti unerežiimist sisse lülitamist.

Absoluutselt iga kord. Uuenduste kontroll ja uuendamine võtab endale kogu arvuti tähelepanu ja midagi produktiivset sellel ajal teha ei saa.

Võimalik, et toode oligi mõeldud kodukasutajatele lisaks ka väikeettevõtetes kuni kümnele arvutile (aga ainult seda tüüpi organisatsioonides), seega näiteks väikeettevõtte tööarvutites ei peaks selline uuendamistuhin väga problemaatiline olema, sest väikeettevõtted on tavaliselt väga kitsaste eelarvevõimalustega ja sellises olukorras jääb MSE ainsaks legaalseks tasuta valikuks residentse skanneriga antiviiruste seas.

Tavalisele kodukasutajale, kes arvutit äriks ei kasuta, on olemas ka teistsuguseid variante, nii et MSE-d väga soovitada ei oska.