分类目录归档:未分类

wordpress 用WP-CLI解决更新慢的问题


wordpress的升级非常方便,就是不适合国情,之前多试几次总会成功的,最近老是失败,删除了几次lock后发飙了。

对了如果没有安装SSH SFTP Updater Support的话,请先装好他,wp原生的太弱,还不加密,咱升级的重要原因不就是因为漏洞太多么,还没侵入性,因为ssh肯定有啊。win OS请走开,xx空间请走开。

然后就是主角WP-CLI了,这个东西太好了,有了它就算上面的升级失败也有终极方法了,命令行终究是万能的,甩UI几条街。安装请移步:WP-CLI

wp plugin install 插件名

wp core update #wordpress升级
wp language core update #wordpress语言包升级
奇怪的就是这种升级非常快,如果下载慢重来一次,如果实在下载不了可以拷贝下载链接用迅雷下载后直接安装。
wp plugin update --all #wordpress 插件升级
wp media regenerate --yes #重新生成wordpress多媒体文件
wp theme update --all #更新所有皮肤文件

PHP 7.1开始放弃mcrypt

PHP7安装mcrypt失败。

最近更新docker镜像发现这个问题,搜索半天居然没有解决,原来从7.1开始mcrypt就被放弃了。因为它的依赖10年前就停止更新了。好吧放弃需要他的组件即可。

绝地求生/吃鸡 攻略 保证进前十

 

此攻略完全原创,没看过他人的攻略,全凭自己的推测和经验。精力有限玩了大概二十局不到一般都进前十,照着攻略走前十没问题,越靠前的规则越重要。前十的攻略较为重要,前五要养成习惯。十条以后就是经验了。

  1. 决定生死的不是枪的好坏,而是谁先发现对方。好枪不重要,拳头都能杀人,这个游戏还原度超级高,一把手枪也可以一枪爆头。所以不要总是低头找装备,时刻先观察四周才最重要。
  2. 看过电影都知道,进到一个建筑物特战队都会先clear一遍所有房间,这是因为近距离遭遇都会致命,远距离大概率都是受伤,所以观察以近处为主,远处瞥一眼即可。远处的敌人最喜欢了,一开枪就会暴露自己,还有时间慢慢找他,近处的一出现就是夺命一梭子弹。同理,接近房间和建筑物就要弯腰前行放轻脚步,靠墙后不妨听几秒,确定无声再进。
  3. 因为逼真度高,自动步枪默认是点发,我擦,一开始我真的不知道,近距离的时候点发必死。常备状态一定改为全自动。
  4. 找车。这条本来考虑放到第二,想想跟中后期有关,就排到第四了。这个游戏在一个岛上,这个岛还原度高,真的很大,毒圈收缩开始慢可能跑跑问题不大,中后期毒圈收缩快,扣血加快,没车必死。
  5. 沿着路找到车的概率大,现实世界中也是,所以跳伞开始不妨就先观察公路,找到一辆车是进前十的前提,除非运气好到爆,正好跳进圈子中心。
  6. 躲,有了前面五条为基础,新手只要不被毒死,在圈内靠躲就能进前20。枪法不好,枪不好都没事。别人和毒会帮你杀人。
  7. 跑图路线选择,毕竟是游戏,躲太没意思了,当然了,很多老阴B就是爱躲咱就不提了。时间和航线很重要,越是靠近航线的房子越容易被搜空,所以一开始有车就过上土豪生活了,开车搜刮装备是很爽的,根据时间计算一下跟航线的距离来选择后续跑的点很重要。开车的话肯定走公路,如果遇到枪机,加速即可。
  8. 如果没车,或者后期不适合开车的地方,跑点非常讲究障碍物和阴影,空旷的地方简直是找死的,逼不得已不去空旷的地方。
  9. 防御装备,这个要重视,直接加血的,等级越高越好,装备这种东西真的看运气,搜索很多房子不一定能找到合适的,所以高手的选择就是空旷的大厂房这类,因为不像房间很多,需要一个个找,很花时间。这里防毒面具有必要找到,后期很有用。
  10. 防御后就是枪了,这个大家都知道m16和sks首选,因为稳定,使用场景多。建议中后期要配备,前期无所谓的。高手都是让别人快递的,哈哈哈
  11. 圈子的收缩跟空投是一致的,所以观察空投飞机的路径是可以大致判断即将收缩的大概位置。
  12. 只要不需要开镜就不要开镜杀,乱枪打死老师傅就是这个道理。
  13. 后期跑点容易跑到有人的地方,这种遭遇很爽,双方都知道大概位置,这个时候逆向思维非常重要,还有就是耐心,这属于高级内容了。
  14. 最后几个圈子,应该差不多进前十了,这个时候要特别观察地形,记住房子的出入口,和制高点,能判断圈子的收缩就要抢占制高点,这个时候超级容易死人。所以要综合把握时间,地形,并时刻观察四周,杀人是必须的,否则下一刻杀的可能就是你。
  15. 说几个杀人小技巧,随时找制高点,然后看毒圈的收缩,这里要会看地形,然后慢慢杀人。
  16. 远程当然要点射了,这里没有几倍镜的就不要想了。瞄准的时候要预估到前面去。
  17. 杀人要果断,追击,这游戏看不到血条,还有一丝血也能活蹦乱跳。
  18. 不要总是呆在房间里,躲容易,发现人了就要追击,否则多房间就是死。
  19. 游戏有一个bug,并且会长期存在,就是守门边的时候,你的武器模型可能在墙外能看到一点,话就说到这里,哈哈

 

debian/ubuntu install 安装 ffmpeg

ffmpeg太出名了,linux上只要跟多媒体有关的多多少少都会有它的身影。最近需要用到它读取多媒体metadata,使用的库说找不到ffmpeg,apt也装不了会报错误。原来debian7开始ffmpeg被libav取代,这个东西也是从ffmpeg fork出来的,到了debian9又回到了ffmpeg,不过奇怪的是我换了stretch还是无法安装ffmpeg。老版本如果要装ffmpeg可以加入backports源,例如jessie源可以加入如下:

 
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib

 

 

阿里云OSS js SDK使用https出现ERR_SSL_PROTOCOL_ERROR错误


在HTTPS站点ajax请求的地址如果不是https那么就有ERR_SSL_PROTOCOL_ERROR错误了。

解决办法:当然是把http改为https即可

阿里云一贯loss文档的尿性,确实找不到相应的说明,甚至找到对应sdk的项目地址都难,这里贴上oss js sdk的地址,看去是淘宝ued出品:https://github.com/aliyun-UED/aliyun-sdk-js

找到后发现有n多可配置项,这里需要加secure:true 到oss对象初始化的options即可,默认是false所以请求的是http。

最后重要的事说三遍:鄙视👎阿里云、鄙视👎阿里云、鄙视👎阿里云

跨flask app使用url_for

用flask的肯定知道url_for,解放了记住url的繁琐。前阵子因为flask臭名昭著的 servername问题彻底拆分了应用程序,在解决了大部分引用和重用后发现应用间导航也是个问题,写硬url显然不科学。这里祭出几大法宝用来解决这个问题:

  1. 中间件Dispatcher,也可以使用werkzeug.wsgi 的 DispatcherMiddleware,中间件的设计理念真是扩展所必须的呀;
  2. with nebapp.app_context,没错在每个应用程序中创建邻居app后可以使用它的上下文即可用url_for了;
  3. 实际使用会有报错,这里需要mock一个request,这里flask准备好了app.test_request_context;

贴一下我在用的Dispatcher

class Dispatcher:
    """
    Allows one to mount middlewares or applications in a WSGI application.

    This is useful if you want to combine multiple WSGI applications::

        app = DispatcherMiddleware(app, {
            '/app2':        app2,
            '/app3':        app3
        })

    """

    def __init__(self, app, mounts=None):
        self.app = app
        self.mounts = mounts or {}
        self.url_for_resolver = URLForResolver(
            self.mounts
        )
        self.app.dispatcher = self

    def __call__(self, environ, start_response):
        script = environ.get('PATH_INFO', '')
        path_info = ''

        while '/' in script:
            if script in self.mounts:
                app = self.mounts[script]
                break
            script, last_item = script.rsplit('/', 1)
            path_info = '/%s%s' % (last_item, path_info)
        else:
            app = self.mounts.get(script, self.app)

        original_script_name = environ.get('SCRIPT_NAME', '')
        environ['SCRIPT_NAME'] = original_script_name + script

        # Convert empty path info values to a forward slash '/'
        environ['PATH_INFO'] = path_info or '/'

        return app(environ, start_response)


class URLForResolver:
    """
    A URL resolver that provides resolution of `url_for` across multiple apps.
    """

    def __init__(self, mounts):
        self.mounts=mounts
        self.apps = list(mounts.values())
        self.cache = {}

        for app in self.apps:
            app.url_build_error_handlers.append(self)

    def __call__(self, endpoint, **values):
        """Attempt to resolve a URL any of the registered apps"""
        error = Exception('can not find endpoint for %s' % endpoint)

        parts=endpoint.split('.')
        path=parts.pop()
        if len(parts)>1:
            path='%s.%s'%(parts[1],path)
        app_name=None
        if len(parts)>0:
            app_name=parts[0]

        # Check if we have a cached look up
        if endpoint in self.cache:
            app = self.cache[endpoint]
            if app:
                with app.app_context(), app.test_request_context():
                    ret_path= url_for(path, **values)
                    if ':5000' in ret_path:
                        ret_path=ret_path.replace(':5000','')
                    return ret_path
            else:
                raise error

        if app_name:
            app = self.mounts[app_name]
            self.cache[endpoint] = app
            return self(endpoint, **values)
        # Attempt to find an app with the registered endpoint
        for app in self.apps:

            for rule in app.url_map.iter_rules():

                if rule.endpoint == path:
                    # Found - cache the result and call self to return the URL
                    self.cache[endpoint] = app
                    return self(endpoint, **values)

        # Not found - cache the result and re-raise the error
        self.cache[endpoint] = None
        raise error

使用方式:

#初始化
init_apps()
    apps = create_apps()
    del apps['/passport']
    dispatcher = Dispatcher(passport, mounts=apps)
#调用
current_app.dispatcher.url_for_resolver('/appname.blueprint_name.page_name',_external=True))

pycharm remote docker debug with external sources

 

Great IDE pycharm can easy debug with docker-compose.yml file. But default guid not metioned how to config debug with external sources. If Problem happend in external sources ,I have to stupid add sources to my project for debug. After Google a lot ,it seems like path mapping problem. What important is the breakpoint you locate can not be in pycharm cache, you can check this when move cursor to the source tab shows the path.

Solution(Menu:Pycharm>Project Interpreter):

  1. Click dots in the end of “Path mappings”
  2. find your local python path ,if you using py3 in mac the path should looks like “/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4”
  3. Add two mappings ,below is my config

“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-package” : “/usr/local/lib/python3.4/site-package”

“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4″:”/usr/local/lib/python3.4”

After all done you need to referesh remote sources, maybe not but i did. Then pycharm will reindex soruces ,wait a few minites, you can check with command+B jump to external sources , if path changed to your local sites-package location its success.

用户密码不要再用MD5加密了,不妨改为Bcrypt

 

MD5实在太出名了,特别是刚毕业的同学脑子里就是Hash,MD5,AES几种,其实算法的世界就跟森林一样,还每一颗都不同。各有各的特长和适用场景,多年前MD5因为计算的复杂度一度被认为不可破解,但是随着cpu的摩尔定律现在已经可以被破解了。玩SS的同学不妨可以切换几种试试,小众的可能被侦测的概率会更小。

回归正题,黑客拿到网站数据库后当然就是破解用户的加密密码,这个时候MD5加密的密码网站上有专门的rainbow服务提供碰撞破解,甚至常见的人家都已经cache了,碰撞都不需要。道高一尺魔高一丈想不被破解除了采用加salt这类亡羊补牢的办法外更换算法才是最有效果的。DANG!DANG!有请主角Bcrypt出场,前面MD5之所以被破解是因为它的复杂计算后来可以被CUDA方式加速计算,结果就是可能1ms就够了,对于高级显卡个人PCrainbow都没问题。

所以bcrypt的特点之一就是不能被gpu加速;特点二本身要够慢,当破解需要几十上百年的时候也就可以认为它不可被破解,所以算法本身除了复杂度外怎么就是更慢,对于算法来说要做到这个可不容易,bcrypt采用了Blowfish的算法,让他慢的在算法里都显得特别奇葩,前面1ms的加密它可能需要0.3秒。算法终究是会过时的,bcrypt为了延长生命期还增加了salt和work factor,后者可以自由更改用于增加因为cpu性能增加让系统计算更慢。

‘$2b$12$nf3TdEFJZ6AtRA7N9r1f.OANfpFS9Qxtklo4km.LHbuEV7Mu5jJN2’

上面就是一段用bcrypt加密‘mypassword’后的结果,这里$是分隔符没有意义,2b代表算法版本,12代表work factor。

对于一些大型站点可能不会用bcrypt毕竟它太慢,但是对于中小型站点来说它足够安全且用于频率很低的密码还是很不错的选择。

PS:wp和gitlab都是用的bcrypt。

绕过目标网站对Ad Block 的检测

我想用ab的同学一定碰到过提示加入ab的白名单的标语,甚至有的会阻碍你的浏览如果不加入白名单。开始的时候对有的网站本身广告较少,排版合理的我都会乐意加入白名单,但是当这样的提示越来越多,并且严重影响阅读的广告越来越多后就痛苦了,毕竟经常上的网站就那么几个。这个时候神奇油猴就派上用场了,更开心的是排名超前的aak很完美的实现了这个功能,地址:https://openuserjs.org/scripts/reek/Anti-Adblock_Killer_Reek

可以继续无广告玩耍了,当然对于喜欢的网站还是会妥妥的加入白名单的。

How to use JAC (jinja-assets-compressor) in Flask and with Flask-User

If you use flask-user in your flask application , and jac won’t work, also flask_static_crompress package (which do not have even one line ,only jac flask contrb file reference, its funny).

Problem HOW to make it work.

In your Init_app function, if you do not have it please try to use this method create app once ,its very smart way .code like below:

 

app=Flask(__name__)
jac = JAC()
def init_app():
  jac.init_app(app)
  app.jinja_env.compressor_debug = app.config.get('DEBUG')
  app.jinja_env.compressor_output_dir = './static'
  app.jinja_env.compressor_static_prefix = '/static'

If you do not use Flask-User, its done otherwise you have to custom your static_finder function (file jac/contrib/flask.py ) and add one line to above config:

 app.jinja_env.compressor_source_dirs = static_finder(app) 

 

def static_finder(app):
    def find(path=None):
        if path is None:
            folders = set()
            for blueprint in app.blueprints.values():
                if blueprint.static_folder is not None:
                    folders.update([blueprint.static_folder])
            folders.update([app.static_folder])
            return folders
        else:
            bp_values = app.blueprints.values()
            # dectect flask-user
            if 'flask_user' in [x.name for x in bp_values]:
                app.blueprints['flask_user'].name = 'user'

            for rule in app.url_map.iter_rules():
                if '.' in rule.endpoint:
                    with_blueprint = True
                    blueprint_name = rule.endpoint.rsplit('.', 1)[0]
                    for x in bp_values:
                        if x.name == blueprint_name:
                            blueprint = x

                    data = rule.match(u('{subdomain}|{path}').format(
                        subdomain=blueprint.subdomain or '',
                        path=path,
                    ))
                else:
                    with_blueprint = False
                    data = rule.match(u('|{0}').format(path))

                if data:
                    static_folder = blueprint.static_folder if with_blueprint and blueprint.static_folder is not None else app.static_folder
                    return os.path.join(static_folder, data['filename'])

        raise IOError(2, u('File not found {0}.').format(path))

    return find