‘Opril’s code’

禁止APP内Webview页面跟随系统缩放字号

17:05 八月 15th, 2017 by Opril

最近开始做适配移动端的网页,通过APP内部的Webview展示。为了在不同分辨率的设备上都能按相同的布局来展示,使用了rem布局的页面自适应方式:

(function (doc, win) {
  var docEl = doc.documentElement,
  resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
  recalc = function () {
    var clientWidth = docEl.clientWidth;
    if (!clientWidth) return;
    docEl.style.fontSize = 100 * (clientWidth / 320) + 'px';
    alert(docEl.style.fontSize);
  };

  // Abort if browser does not support addEventListener
  if (!doc.addEventListener) return;
  win.addEventListener(resizeEvt, recalc, false);
  doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

样式表中文字的字号,元素的高宽、间距等都以rem为单位。

但是测试的时候发现了一个很糟糕的问题,当Android手机将系统的字号大小设置为非标准时,页面的布局受到了严重的影响,包括字号在内,所有以rem为单位的属性都被放大或者缩小了。为了保证布局不受影响,在网上查阅了一些应对这个问题的解决方案,经过了自己的实践验证后整理如下:
Read more »

Leetcode 365. Water and Jug Problem

01:31 六月 25th, 2016 by Opril

题目描述

You are given two jugs with capacities x and y litres. There is an infinite amount of water supply available. You need to determine whether it is possible to measure exactly z litres using these two jugs.

Operations allowed:

  • Fill any of the jugs completely.
  • Empty any of the jugs.
  • Pour water from one jug into another till the other jug is completely full or the first jug itself is empty.

解题思路

这个问题实质上是求解关于a和b的方程ax+by=z是否有整数解的问题。a和b为正数时表示给一个空壶倒满水,负数时表示把一个水壶倒空。容易得知当且仅当z是x与y的最小公约数的倍数时,该方程有整数解,所以本题的关键是判断z被x和y的最大公约数整除即可,关键的算法是辗转相除法。

目前尚存在争议的一个问题是在最后量取的步骤中水壶能否被多次使用(比如x=1, y=2, z=5的情况,是否可以用1+2+2=5来实现),该问题的讨论区里也在讨论中。目前的test cases好像是认定为最终只能用两个水壶在某一时刻里存有的总水量来衡量,所以z>x+y的情况都判定为false了。

代码

class Solution {
public:
    int gcd(int x, int y)  
    {
        return y==0?x:gcd(y, x%y);  
    }
    bool canMeasureWater(int x, int y, int z) {
        if(z < 0 || z > x + y)
            return false;
        if(z % gcd(x, y))
            return false;
        else
            return true;
    }
};

写了一个自动转发微博的bot

02:20 四月 4th, 2015 by Opril

其实算是看到微博树洞微信树洞一类的东西都挺火的,于是动手写了一个。
也是因为微博的粉丝服务平台面向所有用户开放了,所以可以通过下发私信的方式去执行相应的操作:发微博在正文中 @平台帐号,给平台帐号私信指定的指令(比如uid中的某几位的运算结果),平台帐号转发微博。

首先是使用微博API的 statuses/mentions 接口,get接收到的最近的@主体帐号的微博(access_token直接给固定的粉丝服务平台的token即可),为了避免干扰可以筛选出原创微博;
从最新的微博id往前与sender_id进行比对,直到找到符合的微博或达到某个设定的阈值;
比较当前时间与sender_id上一次使用这个功能的时间(存在本地csv文件里),判断时间间隔是否超过阈值,以免滥用刷屏;
判断微博正文里是否有不希望出现的词或者链接中是否包含淘宝地址(直接用strstr()就够了;判断链接用 short_url/expand )等,视情况予以回复信息警告或拉黑;
使用 friendships/show 判断是否关注主体帐号,如果没有则提示关注后再使用(涨了不少粉..);
如果都没有问题的话,往 statuses/post post相应信息就好了,顺便把sender_id和微博id记录到csv文件里。

基本的流程就是这样,算是绕过了执行者给微博应用授权的这个过程,不过还是需要一定的人工干预(比如每天查看一次)以避免不当使用。不过最近微博APP似乎把 statuses/mentions 接口设置成只能返回授权用户的微博了(orz),想想办法还是能把这个问题给解决掉的,嗯~