Friday, May 12, 2017

Netgear N300, a good router for $17

My old D-Link DIR615 finally decided to quit after many years and recently I had to restart it daily. Saw some $17 routers in Walmart, Netgear and Belkin, and decided to give them a try. I grabbed the last Netgear N300, model WNR2000v5, while many Belkin's were still there.



Setup was extremely easy and configuration was all done by itself. All I did was open "www.routerlogin.net" on my computer to confirm that I want it as an AccessPoint. I always use a netbook as a flexible and powerful router and home server for everything.

Much faster and better coverage than before. Now I can watch local HDTV stations over WiFi smoothly. Wish I had done this earlier.



It is a very small box standing up. No extruding antennas. The case is full of heat-dispense holes, ice cold to touch, a good sign of many years of smooth servicing.



Although insanely cheap, it has a power button! saving the hassle to unplug and replug the power in case a reboot is needed. Even more incredible, a WiFi on/off button too, above the WPS button.



In Chinese:

用了多年的D-Link终于开始不稳定了,需要每天重启一下。在Walmart看到Netgear和Belkin的N300都是$17,就捡了一个回来。Belkin还有一堆,Netgear只剩最后一个,所以挑了Netgear。

设置非常简单,我只启用了Access Point模式,然后全是它自己设定。

比以前快多了,覆盖也广多了。以前看当地高清台(MEPG2)时很卡,现在完全流畅了,后悔没早点换掉。

很小,立着,不占地方,天线没在外面。盒子上几乎全是散热孔,一点都不热,冰凉的,应该能多用几年。这么便宜的东西,居然还有个电源开关!需要重启的时候不用拔电源。甚至还有一个WiFi开关!当然WPS按钮也有。

Tuesday, April 25, 2017

NIkon D3300 Shutter Shock

Small compact cameras suffer from shutter shock. Mirroless cameras now have solved this issue by using electronic first curtains. It is nice that Nikon makes small DSLR's like the D3300, but they should deal with this shutter shock issue.

If shutter speed is within 1/30 to 1/250, the images look slightly blurry. Not very bad, but noticeable. Because this is the mostly used shutter speed range, so you almost never get tack sharp images with D3300.

With the 18-55 VR II kit lens, these are shot at 1/15 and 1/320, respectively, and both are tack sharp:



But at 1/160, it is not as sharp as above:

 

Even at 1/30 and 1/250, the differences are still there:



With the 55-200 VR II kit lens, results are similar.

Tack sharp at 1/15 and 1/320:



The worst is around 1/60 - 1/80:




Compared to the 18-55, 1/250 and even 1/200 are not that bad:



As you see, the worst case is still not too bad and you may simply forget about this issue and just shoot at any shutter speed. But, if you want an image that's totally tack sharp, then avoid speeds from 1/30 to 1/250.

As long as you can avoid shutter shock, these kit lenses and D3300 produce excellent sharpness, very close to my Sony 35mm/1.8 on a5100, far beyond what an entry level kit usually suggests.

Some interesting discussions and reviews regarding shutter shock. D5300 and D5500 also have this issue.

Saturday, April 15, 2017

Turn any headphones into wireless



I picked up the Taotronics TT-BA08 among others for the following reasons:

  • Up to 20 hours play time. Others are less than 10 hours, cannot serve a whole day.
  • Very small and light at 1 oz, ideal to clip on headphones as showing in above video.
  • Full control buttons for play/pause and volume/track.
  • APT-X for CD quality audio.
  • APT-X low latency (short delay). You can use two of these, one as transmitter and one as receiver, to watch TV with any of your favorite headphones.
  • Playing while charging.
  • Connect to two devices at the same time.
If your headphones have high impedance such as the Sennheiser HD600, you may give Creative Labs Sound Blaster E3 a try, supposed to drive 500 ohms.

If you want one that comes with a clip on it already and for free, Fry's is selling a smartbean adapter, free after $15 rebate. Note that it does not have all the above features, but you have nothing to lose.

Tuesday, April 11, 2017

Tweaks of sports photos

No matter for whatever kind of photos, you must set your camera to:
  • Always use single point focusing and the smallest focus area. If you let the camera to pick up a focus point for you, you simply waste your time.
  • Always use either AF-S for still objects or AF-C for moving ones. AF-A sounds great but no manufacturer have implemented it well; so never use it.
  • Always use A (aperture) mode. For one object or two such as portrait, use f/1.8 or the widest aperture; f/8 for massive objects such as landscape. If you use auto or P mode, you simply waste your time.
  • Set a minimum shutter speed. For still objects, set it to 1/8 for standard lenses and 1/30 for telephoto lenses. For a party, 1/60 or so; for chasing a child, 1/125 or so; for sports, 1/250 or 1/500. Canon and Sony entry-level cameras do not have this option, this is why I bought the Nikon D3300 instead.

Now about sports:
  • As already mentioned, use a minimum shutter speed of 1/250. Use 1/500 or even faster if lighting allows (without pushing ISO to too high).
  • Use AF-C mode. When the moving object is approaching, half press down the shutter to make an initial focusing, hold the shutter and, once the object reaches your desired spot, press down fully the shutter to take the shot.
  • If the object is moving from left to right, aiming at it, half press down the shutter to make an initial focusing, hold the shutter while moving camera to follow the object and, once the object reaches your desired spot, press down the shutter fully to take the shot.
  • To isolate the object from the surroundings, use the longest focal length and widest aperture and go as close as possible.
    Now about D3300 and its kit lenses:
    • Like other Nikon cameras, D3300 also suffers from shutter shock between 1/30 and 1/125. So use either 1/30 or slower, or 1/125 or faster.
    • Because the AF-S VR II lenses are sharp at all focal lengths including 200 mm (55 mm), so feel free to zoom all way in. But I found the best focus accuracy is achieved around 165 mm (45 mm), so I always try to use this focal length whenever possible, i.e., just a little bit back from the longest end.
    • Focusing with the 55-200 lens is not so quick, especially when the focus was far away from the object. Therefore, it is almost mandatory to do aforementioned initial focusing while the object is approaching.
    • Usually I focus on a person's eye, but for sports this is very difficult and often unnecessary. Because D3300 has only one cross-type focus point at the center, so I use it to focus on the center of the body. I keep my camera level - not looking down or up; so the person's face will be mostly in focus as well.
    • Set camera's sharpening to 7 for sharp but not over sharp images.

    Wednesday, April 5, 2017

    Friday, March 31, 2017

    Nikon D3300 focus problem and fix

    They are on clearance in Walmart stores and I'm lucky enough to grab one at $299. Right out of box, photos are blurry, very. After some tests I confirmed front-focus problem with both lenses (18-55 and 55-200):



    As both lenses do the same front-focus thing, it must be the camera body. So I enabled sensor clean procedure to lift up the mirror, turned the auto focus screw counterclockwise a little bit (about 10 degree or so), as instructed here.

    Now both lenses focused at the center perfectly:



    I used to be against to DSLR, because they were big, heavy and expensive. Things have changed in recent years, they have been getting smaller, lighter and inexpensive, under the competition from mirrorless and smartphones. Their lenses are more and relative cheap.

    Sunday, March 26, 2017

    Tweaks for ZTE Trek 2 K88 HD Tablet

    For only $60, you get a very fast and smooth 8" tablet that you'll love to use it to do serious work or play for fun:

    • 2GB RAM and 16GB storage that can be expanded via MicroSD.
    • 1280x800 bright and clear screen, non reflective, not the stupid 16:9.
    • 5M front and rear cameras.
    • Two front facing speakers, loud and clear.
    • Unlock code provided, use it on T-Mobile and in other countries including China.
    • FM radio, clean and good reception, timer off, but mono.
    • Large battery that last for a day of heavy use and idle forever.
    • Good GPS for offline or online navigation.
    No root

    Fortunately not many garbages, and half of them can be easily disabled. For annoying notifications: press and hold on it, then click on the info icon and block it.



    If Google stuff is a problem (such as in China), use noroot firewall to block them.

    Hotspot

    This function is hidden, but you can use it with WiFi Hotspot Pro.


    Calls

    It cannot do calls and texts in the way of normal smartphones do. The built-in dialer and SMS apps are modified, the NumberSync craps that are VoIP based. They are no different than Hangouts, except the CID is spoofed to that of an AT&T postpaid #.

    You do can install the Android Messages and Dialer by Google. Then SMS will work like is on an ordinary phone. For the dialer, however, not much you can. You can only install the old RC8 versions because RC9 and newer cannot install on non-Google phones. For newer versions, you can find some hacked ones on XDA.

    You still cannot make phone calls though, because some necessary libraries are crippled, like all other tablets sold in monopoly USA. You do can dial some secret codes, such as *#*#4636#*#*, then turn radio off to save battery:


    Browser

    Use Yandex, please, don't bother with all others! A truly full browser, plus the MS RDP, are what make a tablet a productive tool to leave your computer home.



    If you don't use Google Play Store and Drive, disable their app links. Then Play Store and Drive links will be opened in Yandex.


    Few photos

    Low light, normal light and front camera:




    This article is written on this tablet. The built-in Gallery app is very handy for cropping and doodling photos.

    No battery drain during idle under WiFi. Very little drain when LTE signal is poor:


    Friday, March 17, 2017

    Philips SHP9500S

    For $50, these headphones are extremely comfortable and sound great - very detailed and flat. Their impedance is 30 ohm, easy to drive by phones and media players. Because they are open-back, healthy for ears, but don't use them in a noisy environment though.


    They beat Grado 60 on each and every aspects, as the entry to good sound. As these are extremely comfortable, you don't suffer while enjoying great tunes like you do with Grado 60. And they sound better, much better. My HD518 do not offer the veil-less sound from these.

    The only issue I have with them is too weak clamping force - they move and even drop whenever I look for something on the ground. This also causes a stress after a while, because my head tends not to move due to the fear of dropping the headphones.

    Fortunately, there is an easy workaround. Now I can wear them even while doing some labor work. They have thus replaced officially my daily-wearing headphones - Koss KSC35/75.


    As you see, I use Samsung HS3000 to make them wireless (with large battery to last at least a whole day), thanking to the standard 3.5 mm jack. Comfortable and convenient, cannot ask for more.

    If you need headphones in a noisy environment, check the Phillips SHB9850NC. The 9850 and 9500S are pretty much the only headphones I use these days.

    Friday, March 10, 2017

    KoT's Dynamic Content Blocker

    My two scripts, Block GIF and AD Block, worked so well, so I combined them into one. I also added another transparent button for iFrame block. Being able to block or unlock on the fly and to save the preference to a site or sub-site, this method is perfect. Can be easily modified, improved, extended and expanded as well.

    I am not against to ads, but I hate dynamic contents - too annoying and distractive, killing battery, slowing devices down and running them hot. Because all contents are blocked not removed, the original page format is retained and there is no up-down or left-right shifting.

    See how well it works:



    I also use The Great Suspender to unload tabs after 5 minutes. Now, there is no CPU consumption, how great is this!



    The following script has been (on 5/22/2017) and will be updated. If you want to unblock an item, please let me know so I can find out the iframe for you and add it to the NOT_TO_REMOVE list.

    // ==UserScript==
    // @name         KoT's Content Blocker
    // @namespace    http://www.kots.us
    // @grant        none
    // @exclude      https://xfinity.nnu.com/xfinitywifi/main
    // @exclude      https://www.blogger.com/*
    // @exclude      https://groups.google.com/forum/*
    // @exclude      https://productforums.google.com/forum/*
    // @exclude      https://postage.ebay.com/ws/eBayISAPI.dll*
    // @exclude      https://ibdswebp41-ext.pb.com/images/USPS/HTMLFolders/HTML14/*
    // ==/UserScript==

    /* add your items not to be blocked */

    var NOT_TO_REMOVE = 
        ':not([src*=\'youtu\'])' +
        ':not([src*=\'dailymotion\'])' +
        ':not([src*=\'youku\'])' +
        ':not([src*=\'tudou\'])' +
        ':not([src*=\'powermv\'])' +
        ':not([src*=\'dramafever\'])' +
        ':not([src*=\'vimeo\'])' +
        ':not([src*=\'liveguidestationplayer\'])' +
        ':not([src*=\'RoutePositionET\'])' +
        ':not([src*=\'blogger.com\'])' +
        ':not([src*=\'chase.com\'])' +
        ':not([src*=\'/tob/live/usp-core\'])' +
        ':not([src*=\'vi.vipr.ebaydesc.com\'])' +
        ':not([src*=\'signin.ebay.com/ws/\'])' +
        ':not([iframe-src*=\'mail.com\'])' +
        ':not([src*=\'captcha\'])'
    ;

    /* add your items to be blocked */

    var TO_REMOVE = 'div[id^=\'carousel\']' +
        ',div[id^=\'Carousel\']' +
        ',iframe[src^=\'/news/index.php?act=getiframe\']' +
        ',iframe[src^=\'javascript\']' +
        ',div[class^=\'eis_slide\']'
    ;

    /* add special items to be blocked */

    function blockSpecialItems() {
      var m = document.getElementById('scrollWrap');
      if (m !== null) {
        m.id = 'scrollWrap_';
        m = document.getElementById('scrollMsg');
        if (m !== null) {
          m.parentNode.removeChild(m);
        }
      }
    }

    /* no need to change below */

    function getCookie(w){
    cName = "";
    pCOOKIES = new Array();
    pCOOKIES = document.cookie.split('; ');
    for(bb = 0; bb < pCOOKIES.length; bb++){
    NmeVal  = new Array();
    NmeVal  = pCOOKIES[bb].split('=');
    if(NmeVal[0] == w){
    cName = unescape(NmeVal[1]);
    }
    }
    return cName;
    }

    function setCookie(name, value, expires, path, domain, secure){
    cookieStr = name + "=" + escape(value) + "; ";

    if(expires){
    expires = setExpiration(expires);
    cookieStr += "expires=" + expires + "; ";
    }
    if(path){
    cookieStr += "path=" + path + "; ";
    }
    if(domain){
    cookieStr += "domain=" + domain + "; ";
    }
    if(secure){
    cookieStr += "secure; ";
    }

    document.cookie = cookieStr;
    }

    function setExpiration(cookieLife){
        var today = new Date();
        var expr = new Date(today.getTime() + 
                            cookieLife * 24 * 60 * 60 * 1000);
        return  expr.toGMTString();
    }

    function is_gif_image(i) {
      return /^(?!data:).*\.gif/i.test(i.src);
    }

    function freeze_gif(i) {

      hasGIF = true;
      
      var c = document.createElement('canvas');
      var w = c.width = i.width;
      var h = c.height = i.height;
      c.getContext('2d').drawImage(i, 0, 0, w, h);
      try {
        // if possible, retain all css aspects
        i.src = c.toDataURL("image/gif");
      } catch(e) {
        // cross-domain -- mimic original with all its tag attribs
        for (var j = 0, a; a = i.attributes[j]; j++)
          c.setAttribute(a.name, a.value);
        i.parentNode.replaceChild(c, i);
      }
    }

    function blockMarquee() {
      var m = document.getElementsByTagName('marquee');
      while( m.length > 0) {
        var p = document.createElement('div');
        p.innerHTML = m[0].innerHTML;
        var wth = (m[0].style.width == "") ? "350" : m[0].style.width;
        var stl = "clear: both; white-space: nowrap; overflow: hidden;" +
            "text-overflow: ellipsis; width:" + wth + ";";
        p.setAttribute('style', stl);
        m[0].parentNode.insertBefore(p, m[0]);
        m[0].parentNode.removeChild(m[0]);
      }
    }

    function blockContents(elements) {
      for (var i = 0; i < elements.length; i++) {
        hasIframe = true;
        var frm = document.createElement("iframe");
        frm.width = elements[i].width;
        frm.height = elements[i].height;
        frm.style.border = "none";
        frm.style.float = elements[i].style.float;
        frm.style.position = elements[i].style.position;
        frm.style.display = elements[i].style.display;
        frm.style.margin = elements[i].style.margin;
        elements[i].parentNode.replaceChild(frm, elements[i]);
      } 
    }

    function createButton(label) {
      if(label == 'GiF') {
        var rt = '7%';
        var ck = 'blockGIF';
        var hs = hasGIF;
      }
      else {
        rt = '1%';
        ck = 'blockIframe';
        hs = hasIframe;
      }
      var btn = document.createElement( 'input' );
      with( btn ) {
        onclick = function() {
          if (getCookie(ck) !== 'No') {
            setCookie(ck, 'No', 3650);
          }
          else { 
            setCookie(ck, '', -1); 
            setCookie(ck, '', -1, '/'); 
          }  
          location.reload();
        };
        setAttribute( 'value', label );
        setAttribute( 'type', 'button' );
        var stl = "font-size: 18px; position: fixed;bottom: 1%;" +
            "background-color: Transparent; background-repeat:" + 
            "no-repeat; cursor: pointer; overflow: hidden;" + 
            "right:" + rt + ";" + "color:";
        if (getCookie(ck) !== "No")
          if (hs)
            stl += "red;";
          else
            stl += "gray;";
        else
          stl += "green;";
       setAttribute( 'style', stl );
      }
      document.body.appendChild(btn);  
    }

    function doBlock() {

      if (getCookie('blockIframe') !== 'No') {
        blockContents(document.querySelectorAll(NOT_TO_REMOVE));
        blockContents(document.querySelectorAll(TO_REMOVE)); 
      }
      
      //Firefox has a good addon: Toggle aninated GIFs
      if (typeof InstallTrigger == 'undefined') {
        if (getCookie('blockGIF') !== 'No')
          [].slice.apply(document.images).filter(is_gif_image)
            .map(freeze_gif);
      }
      
      if (window.top !== window.self)
        return;
      
      if (typeof InstallTrigger == 'undefined')
        createButton ('GiF');
      createButton ('FrM'); 
      
    }

    NOT_TO_REMOVE = 'iframe:not([src])' + NOT_TO_REMOVE + 
      ',iframe[src^=\'http\']' + NOT_TO_REMOVE;

    doBlock();

    if (window.top !== window.self)
      return;

    var hasGIF = false;
    var hasIframe = false;

    blockSpecialItems();
    blockMarquee();
      
    //some items are delayed to show up
    window.addEventListener ('load', function(){ 
      doBlock();
      window.setTimeout(doBlock, 4000);
    }, false);

    Wednesday, March 8, 2017

    My script for blocking GIF

    I cannot find a good animation block extension for Opera and Yandex which are my current favorite browsers for Windows and Android, respectively. GIF Jam jams loading of a page while jamming GIF. So is GIF Blocker, although faster. Stop Animations does not block GIF by default; so you have to press ESC key all the time - quite a hassle and no ESC key on a phone.

    Therefore I had to make one. I found a script that does what is similar to Stop Animations. I changed it to block GIF by default. I also added a transparent "GIF" button to unblock (or block) GIF on the fly and save the option to the site via cookie (Opera does not support GM_setValue, code is from here).


    This button is located at the bottom right corner. On the phone, this button might be a little hard to find if you zoom the page. The button label is gray if blocking is enabled (default) and, if one or more GIF images got blocked, it becomes red, or green if disabled (not blocking). So you'll know if you are missing something. This script does not add obvious slowdown and other side effects.

    Related article: KoT's Dynamic Content BlockerMy ad-block script

    This script has been (on 03/09/2017) and will be updated without notice

    // ==UserScript==
    // @name         KoT's Content Blocker
    // @namespace    http://www.kots.us
    // @grant        none
    // @exclude      https://xfinity.nnu.com/xfinitywifi/main
    // @exclude      https://www.blogger.com/*
    // @exclude      https://groups.google.com/forum/*
    // ==/UserScript==

    /* add your items not to be blocked */

    var NOT_TO_REMOVE = 
        ':not([src*=\'youtu\'])' +
        ':not([src*=\'dailymotion\'])' +
        ':not([src*=\'youku\'])' +
        ':not([src*=\'tudou\'])' +
        ':not([src*=\'powermv\'])' +
        ':not([src*=\'dramafever\'])' +
        ':not([src*=\'vimeo\'])' +
        ':not([src*=\'liveguidestationplayer\'])' +
        ':not([src*=\'RoutePositionET\'])' +
        ':not([src*=\'blogger.com\'])' +
        ':not([src*=\'chase.com\'])' +
        ':not([src*=\'/tob/live/usp-core\'])'   
    ;

    /* add your items to be blocked */

    var TO_REMOVE = 'div[id*=\'carousel\']' +
        ',div[id*=\'Carousel\']' +
        ',iframe[src^=\'/news/index.php?act=getiframe\']' +
        ',iframe[src^=\'javascript\']'
    ;

    /* add special items to be blocked */

    function blockSpecialItems() {
      var m = document.getElementById('scrollWrap');
      if (m !== null) {
        m.id = 'scrollWrap_';
        m = document.getElementById('scrollMsg');
        if (m !== null) {
          m.parentNode.removeChild(m);
        }
      }
    }

    /* no need to change below */

    function getCookie(w){
    cName = "";
    pCOOKIES = new Array();
    pCOOKIES = document.cookie.split('; ');
    for(bb = 0; bb < pCOOKIES.length; bb++){
    NmeVal  = new Array();
    NmeVal  = pCOOKIES[bb].split('=');
    if(NmeVal[0] == w){
    cName = unescape(NmeVal[1]);
    }
    }
    return cName;
    }

    function setCookie(name, value, expires, path, domain, secure){
    cookieStr = name + "=" + escape(value) + "; ";

    if(expires){
    expires = setExpiration(expires);
    cookieStr += "expires=" + expires + "; ";
    }
    if(path){
    cookieStr += "path=" + path + "; ";
    }
    if(domain){
    cookieStr += "domain=" + domain + "; ";
    }
    if(secure){
    cookieStr += "secure; ";
    }

    document.cookie = cookieStr;
    }

    function setExpiration(cookieLife){
        var today = new Date();
        var expr = new Date(today.getTime() + 
                            cookieLife * 24 * 60 * 60 * 1000);
        return  expr.toGMTString();
    }

    function is_gif_image(i) {
      return /^(?!data:).*\.gif/i.test(i.src);
    }

    function freeze_gif(i) {

      hasGIF = true;
      
      var c = document.createElement('canvas');
      var w = c.width = i.width;
      var h = c.height = i.height;
      c.getContext('2d').drawImage(i, 0, 0, w, h);
      try {
        // if possible, retain all css aspects
        i.src = c.toDataURL("image/gif");
      } catch(e) {
        // cross-domain -- mimic original with all its tag attribs
        for (var j = 0, a; a = i.attributes[j]; j++)
          c.setAttribute(a.name, a.value);
        i.parentNode.replaceChild(c, i);
      }
    }

    function blockMarquee() {
      var m = document.getElementsByTagName('marquee');
      while( m.length > 0) {
        var p = document.createElement('div');
        p.innerHTML = m[0].innerHTML;
        var wth = (m[0].style.width == "") ? "350" : m[0].style.width;
        var stl = "clear: both; white-space: nowrap; overflow: hidden;" +
            "text-overflow: ellipsis; width:" + wth + ";";
        p.setAttribute('style', stl);
        m[0].parentNode.insertBefore(p, m[0]);
        m[0].parentNode.removeChild(m[0]);
      }
    }

    function blockContents(elements) {
      for (var i = 0; i < elements.length; i++) {
        hasIframe = true;
        var frm = document.createElement("iframe");
        frm.width = elements[i].width;
        frm.height = elements[i].height;
        frm.style.border = "none";
        frm.style.float = elements[i].style.float;
        frm.style.position = elements[i].style.position;
        elements[i].parentNode.replaceChild(frm, elements[i]);
      } 
    }

    function createButton(label) {
      if(label == 'GiF') {
        var rt = '1%';
        var ck = 'blockGIF';
        var hs = hasGIF;
      }
      else {
        rt = '7%';
        ck = 'blockIframe';
        hs = hasIframe;
      }
      var btn = document.createElement( 'input' );
      with( btn ) {
        onclick = function() {
          if (getCookie(ck) !== 'No') {
            setCookie(ck, 'No', 3650);
          }
          else { 
            setCookie(ck, '', -1); 
            setCookie(ck, '', -1, '/'); 
          }  
          location.reload();
        };
        setAttribute( 'value', label );
        setAttribute( 'type', 'button' );
        var stl = "font-size: 18px; position: fixed;bottom: 1%;" +
            "background-color: Transparent; background-repeat:" + 
            "no-repeat; cursor: pointer; overflow: hidden;" + 
            "right:" + rt + ";" + "color:";
        if (getCookie(ck) !== "No")
          if (hs)
            stl += "red;";
          else
            stl += "gray;";
        else
          stl += "green;";
       setAttribute( 'style', stl );
      }
      document.body.appendChild(btn);  
    }

    function doBlock() {

      if (getCookie('blockIframe') !== 'No') {
        blockContents(document.querySelectorAll(NOT_TO_REMOVE));
        blockContents(document.querySelectorAll(TO_REMOVE)); 
      }
      
      if (getCookie('blockGIF') !== 'No')
        [].slice.apply(document.images).filter(is_gif_image)
          .map(freeze_gif);
      
      createButton ('GiF');
      createButton ('FrM'); 
      
    }

    //for main frame only:
    if (window.top !== window.self)
      return;

    var hasGIF = false;
    var hasIframe = false;

    NOT_TO_REMOVE = 'iframe:not([src])' + NOT_TO_REMOVE + 
      ',iframe[src^=\'http\']' + NOT_TO_REMOVE;

    blockSpecialItems();
    blockMarquee();

    doBlock();
      
    //some items are delayed to show up
    window.addEventListener ('load', function(){ 
      doBlock();
      window.setTimeout(doBlock, 4000);

    }, false);

    Thursday, March 2, 2017

    My ad-block script

    Why not using an add-on/extension like adblock etc.? Because many sites now block them! And they tend to block some wanted content while leave some unwanted unblocked.

    You'll need to install the Greasemonkey (Firefox) or Violent Monkey (Chrome, Yandex and Opera). Then add a new script and copy & paste. All dynamic contents are removed; so be sure to add to the "NOT_TO_REMOVE" list the iframe src's that you do want to see! Or you may add exceptional line(s) like this within metadata block:

    // @exclude     http://www.example.com/foo/baz

    Now your browsers should be totally quiet without any unwanted moving stuff. Timers are removed too!

    Related article: KoT's Dynamic Content BlockerMy script for blocking GIF

    This script has been (on 03/09/2017) and will be updated without notice

    // ==UserScript==
    // @name         Block Marquee
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       You
    // @include      http*://*/*
    // @exclude      https://xfinity.nnu.com/xfinitywifi/main
    // @exclude      https://www.blogger.com/*
    // @exclude      https://groups.google.com/forum/*
    // @grant        none
    // ==/UserScript==
        
    /* add your items to be not blocked */

    var NOT_TO_REMOVE = 'iframe' +
    ':not([src*=\'youtu\'])' +
    ':not([src*=\'dailymotion\'])' +
    ':not([src*=\'youku\'])' +
    ':not([src*=\'tudou\'])' +
    ':not([src*=\'powermv\'])' +
    ':not([src*=\'dramafever\'])' +
    ':not([src*=\'vimeo\'])' +
    ':not([src*=\'liveguidestationplayer\'])' +
    ':not([src*=\'RoutePositionET\'])' +
    ':not([src*=\'blogger.com\'])' +
    ':not([src*=\'chase.com\'])' +
    ':not([src*=\'/tob/live/usp-core\'])'
    ;

    /* add your items to be blocked */

    var TO_REMOVE = 'div[id*=\'carousel\']' +
    ',div[id*=\'Carousel\']' 
    ;

    function doRemove() {

      var m, i;
      
      if (window.top == window.self) {
          m = document.querySelectorAll(NOT_TO_REMOVE);
          for (var i = 0; i < m.length; i++) {
            m[i].parentNode.removeChild(m[i]);
          }
      }
      
      m = document.querySelectorAll(TO_REMOVE);
      for (i = 0; i < m.length; i++) {
        m[i].parentNode.removeChild(m[i]);
      }
      
      // Thanks to http://stackoverflow.com/a/8345837
      // Set a fake timeout to get the highest timeout id
      var highestTimeoutId = setTimeout(";");
      for (i = 0 ; i < highestTimeoutId ; i++) {
          clearTimeout(i); 
      }

    }

    var m, i;

    /* block Special items */

    m = document.getElementById('scrollWrap');
    if (m !== null) {
      m.id = 'scrollWrap_';
      m = document.getElementById('scrollMsg');
      if (m !== null) {
        m.parentNode.removeChild(m);
      }
    }

    /* block common items */

    m = document.getElementsByTagName('marquee');
    for (i = 0; i < m.length; i++) {
      var p = document.createElement('div');
      p.innerHTML = m[0].innerHTML;
      p.setAttribute('style', 'width: 100%; clear: both;');
      m[0].parentNode.insertBefore(p, m[0]);
      m[0].parentNode.removeChild(m[0]);
    }

    //Don't run on frames or iframes
    if (window.top !== window.self) 
        return;

    doRemove(); window.addEventListener('load', doRemove, false);