分类目录归档:未分类

Flask Debug模式下总是初始化两遍

这个如果是在debug模式下出现一般是跟reloader特性有关系,WERKZEUG提供的这个特性主要是方便实时监测到开发中修改的文件,比重启app要快很多。但是有的时候我们希望app或者部分代码指启动一遍,可以用下面的环境变量来监测是否是第二次reload中的初始化。

if not app.debug or os.environ.get(“WERKZEUG_RUN_MAIN”) == “true”

组件初始化我们也希望初始化一遍,flask对此有一个专门的事件:

@app.before_first_request
def initialize():
print “Called only once, when the first request comes in”

docker network 网络服务发现和内嵌的dns系统

docker-compose的启动会默认创建一个bridge类型的网络,当然它跟默认的bridge是继承关系。最近升级ide和docker后发现服务之间出现了个现象,服务能ping的通但是别名就不可以。而更改的地方就是网络模式network_mode  设置为了bridge。

原来当使用default bridge network的情况下,docker container使用宿主机的resolv.conf,当然不会解析服务名了。从1.10开始docker对自建的网络默认启用embedded dns,这个dns会自动更新新分配的服务。

docker network create mynet  //不指定网络模式时默认是bridge

用mynet替换原先的bridge即可。如果在一个网络内可以用服务名来访问比如ping service_name,如果不是可以通过ping service_name.devnet

mysql docker 日志输出时区修正

docker通常修改 -v /etc/localtime:/etc/localtime就可以修改系统时间,但是mysql日志输出时间还是没变,因为它的时间默认是UTC时间,修改需要更改mysql的配置。增加启动参数:–log_timestamps=SYSTEM

完整示例:

docker run -e MYSQL_ROOT_PASSWORD=root -v /etc/localtime:/etc/localtime:ro  -d mysql:5.7 –log_timestamps=SYSTEM

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.