Saturday, December 30, 2017

Battery replacement for Japanese rice cookers

The battery in some Japanese rice cookers will run out in about 10 years. Unfortunately this battery is solder-on and thus not replaceable by the user. Therefore I had to desolder the old battery and mount a 2-AAA battery holder. From now on, the two AAA batteries should last forever. If they somehow will run out again, it is very easy to replace.

Wednesday, December 13, 2017

Friday, December 1, 2017

Final fix for water in canister

If your Toyota or Scion car has check-engine light on after driving in heavy rain, you may watch this videos for diagnosis (ignore the condom part, no need to do that, because water did not get in from there, see the correct fix at the bottom of this page):



And this video for purging water out of the canister pump module:



For the permanent fix, block the small holes under the gas-feed inlet (take off the rear tire at the driver side and look up):




Tuesday, November 21, 2017

Piaggio/Vespa scooter regulator test and replacement

The battery on my Piaggio LT150 is no longer charged while riding. It took me quite a while to figure out how to access the charging unit, turned out to be quite easy as showing in this video:


This video also shows how to test the regulator, replace it and mount everything back.

Friday, July 7, 2017

Thursday, June 29, 2017

The best version of Yandex

17.1.2.339.  Older versions cannot block some sites' pop up ads, such as 6park.com, and no option to save passwords for many sites. Newer versions have the tableau totally messed up.

Yandex

[in Chinese]

老的版本不能阻挡一些网站的恶性弹出广告,比如6park.com,很多的网站也不提示密
码保存。新的版本呢,常去网站的标签一塌糊涂,名不相符。

我衷心感谢Yandex终于做了一个在手机和平板上真正能替代桌面电脑的浏览器。从用PDA那
时候开始,我就一直梦想这么个浏览器。我现在很少带电脑出门了,因为这下手机上都可以做了。
  • 能无极缩放,又能自动满行,还有阅读模式。
  • 能记住所有网站的密码。当然你也可以选择不记。
  • 支持所有的电脑上的Chrome和Opera的插件,也就是这个浏览器无所不能。
  • 页面整洁,不像Chrome和UCWEB里的有些字太大、有些字又太小。
  • 看Youtube没有广告(不需要安装任何插件),自动全屏。
  • 不像UCWEB和Chrome那样发热耗电。
  • 写了一半的帖,reboot后都还在,一字不漏。
  • 地址栏在下面,很贴心(平板时还是在上面)。

Wednesday, June 21, 2017

Two big problems with Le S3

Encountered two big issues with the Le S3:

1) No android.net.conn.CONNECTIVITY_CHANGE broadcast, apps are not aware of network changes, such as register loss of SIP after switching from WiFi to mobile data or vice versa.

2) No setExactAndAllowWhileIdle(), apps cannot do things periodically, such as register of SIP every 15 minutes.

The result is: communication-based apps become totally unreliable. Seems a general issue of such Chinese phones.

[Solution] Install the unofficial LOS 13.

 [In Chinese]

一是没有android.net.conn.CONNECTIVITY_CHANGE广播。没有这个广播,apps无法知道
网络有没有变化。自Android 5.0一来,这个广播总是乱广播、误广播,所以我在我自
己的app里对这个广播做仔细的过滤。我能理解乐视的工程师为什么要这么干,但是这
是典型的中国式的不守规矩,在美国不能也这么干的。

二是没有setExactAndAllowWhileIdle()。没有这个,apps无法定时做一些事情。比
如Sipdroid每15分钟要注册一次,就没法子了。我也能理解在流氓软件遍地的中国,为
什么乐视的工程师要这么以流氓的方式对付流氓,但是你在美国卖这个手机,就不能这
样耍流氓。

这里一位老兄也遭遇到了这些问题,他说中国的手机大多都这么干:

https://stackoverflow.com/questions/40931966/android-alarmmanager-setexactandallowwhileidle-and-wakefulbroadcastreceiver-no

需要用手机干正经事的,还是不能买这些国产手机。Axon 7我没有真正使用过,不知道
是不是也是这样,多半没有,因为中兴和华为已经在美国卖了很多年的手机了,应该没
有这么重的流氓习气。

对于不是码农的普通用户来说,结果是网络活动不牢靠,比如微信和邮件不能及时推送
到手机上,Hangouts之类的漏电话,定时的事件不会按时发生。。。好处是省电,类似
于苹果那样的流氓加恶霸式的强行关后台。

是的,我已经在电池管理里面折腾过了,没效果。

【解决办法】刷unofficial LOS 13,一切问题都没有了。


Monday, June 19, 2017

How to solve the touch issue of ZTE K88

If you experience touch issues, you must update your Trek 2 HD. It is a very tricky process though.

First thing first, you must insert an active SIM card that uses AT&T network, such as H2O or AT&T prepaid (goPhone). You don't need to enable data, you can disable it, but you should use AT&T's APN.



Now connect your tablet to Internet via WiFi. Wait for a while for the auto update to start. Once started, you can see downloading activity in the WiFi icon:



If no go, reboot.

If still no go, force update manually. Go to settings and AT&T Software Update, Check for Updates. If it goes through, all good. If not, saying "try again after 24 hours", then you need to change your phone's date one day ahead (tomorrow). Then reboot, wait for a while for it to auto update. If no go, try manually update again. If fails again, repeat.

You have to update to B29 or B33, to solve the touch problem.


How dual-SIM phone work

Dual-SIM phones are not new, but until recently they were not good enough for both voice and data. The ZTE Axon 7 is the one that represents the new generation of dual-SIM phones.



An alternative is the Le S3 for about $150. It lacks some Verizon bands though and it cannot make calls with a Verizon SIM; LTE data only. The Mini version of the Axon 7 is very similar to the Le S3 on these regards; so is the Le Pro 3.


With such a dual-SIM phone, you can use the cheapest or best services for voice and data separately. For example, you can use a Tracfone or ExpoMobile SIM for very cheap and good voice calls on Verizon network while using a T-Mobile SIM for data. You may also use a Truephone SIM for free voice calls and text while using another SIM for data on T-Mobile, Verizon or AT&T. Such a dual-SIM phone is also extremely handy when you travel in another country including China.

Two big issues with Le S3

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

    [update] How to solve the touch issue

    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 1/4/2018) 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.

    You need to install Greasemonkey (Firefox) or Violentmonkey (Chrome, Opera and Yandex), add a new script and copy and paste the following lines.

    // ==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/*
    // @exclude      https://3c-lxa.mail.com/mail/client*
    // ==/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\']' +
        ',div[class^=\'tout-sdk\']' +
        ',iframe[src*=\'tpc.googlesyndication.com\']' +
        ',iframe[src*=\'googleads\']' +
        ',iframe[src*=\'imasdk.googleapis.com\']'
    ;

    /* 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 = '8%';
        var ck = 'blockGIF';
        var hs = hasGIF;
      }
      else {
        rt = '4%';
        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 + ";" + "bottom:10%;" + "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 ('loadend', function(){
      doBlock();
      window.setTimeout(doBlock, 4000);
    }, true);

    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);