Centos+python3+nginx+uwsgi+flask

1、下载Python3

wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz

2、安装openssl

$ yum install openssl -y (-y 是遇到选择yes/no的时候默认提前yes了)
$ yum install openssl-devel -y

3、解压Python3

$ tar -zxf Python-3.6.3.tgz
$ cd Python-3.6.3

4、编译Python

$ ./configure
$ make & make install

5、安装虚拟环境

$ pip3 install virtualenv
$ virtualenv --no-site-packages -p python3 **_env (不关联系统库,使用python3)

$ source **_env/bin/activate(激活)
$ deactivate (退出虚拟环境)

6、安装nginx

$ yum install nginx
$ service nginx start

6.1、谁占用了80端口?kill掉

$ netstat -tln | grep 80
$ kill -9 'id'

7、安装uwsgi

$ pip install uwsgi

8、配置nginx与uwsgi之间

$ vim /etc/nginx/nginx.conf
    server {
        listen 80;
        server_name localhost;
        charset utf-8;
        client_max_body_size 75M;
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
            uwsgi_param UWSGI_PYHOME /var/www/leefeng_env;
            uwsgi_param UWSGI_CHDIR /var/www/leefeng;
            uwsgi_param UWSGI_SCRIPT core:app;
        }
    }
$ vim /var/www/leefeng/uwsgi.ini
    [uwsgi]
    socket = 127.0.0.1:8000
    plugins = python
    chidir = /var/www/leefeng
    virtualenv = /var/www/leefeng_env
    wsgi-file = core.py
    callable = app

    threads = 2
    processes = 4

9、编写代码

$ pip install flask
$ vim /var/www/leefeng/core.py
1
2
3
4
5
6
7
8
9
from flask import Flask
app=Flask(__name__)

@app.route('/')
def index():
return '<h2>Hello Word!</h2>'

if __name__ == '__main__':
app.run()

10、开启

$ uwsgi uwsgi.ini
$ nohup uwsgi uwsgi.ini & (断开终端依旧运行)
$ ps -ef|grep uwsgi (查询正在运行的uwsgi的进程,然后kill -9 id 后退出uwsgi)

错误解决

make时报错zipimport.ZipImportError: can't decompress data; zlib not available:#yum install zlib-devel
启动nginx报错:nginx: [emerg] socket() [::]:80 failed=需要在nginx.conf 注释掉#listen       [::]:80 default_server;
pip报错:ssl module in Python is not available=(需要重新python :./configure make & make install )
yum install openssl -y (-y 是遇到选择yes/no的时候默认提前yes了)
yum install openssl-devel -y
安装python错误:Prior to installing Python in CentOS 7, let’s make sure our system has all the necessary development dependencies:

# yum -y groupinstall development
# yum -y install zlib-devel
分享到 评论

Just Do It

最近的一段工作中,进入了大量学习的阶段,压力并不是外在的,而是自己强加给自己的,需要适度的适应。

<a>此处删了100行</a>
Python,Kotlin,Swift,Java...

Just Do It
分享到 评论

Change Coming Soon

分享到 评论

Swift ijkplayer

Swift-IJKPlayer

IJKPlayer的封装视频播放器封装,Swift编写。仿今日头条视频播放器。

How To Use

1、添加依赖库

需要下载的framework:

真机(一般用于上线):链接:http://pan.baidu.com/s/1dF2Bx3j 密码:t56g

模拟器+真机(一般用于测试):链接:http://pan.baidu.com/s/1gf5VjUz 密码:w8fh

2、把项目中 VideoPlayer 文件夹拖进自己的项目

3、有一个桥接文件,如果自己已经配置了则添加:#import “Slider.h” ,没有则使用VideoPlayer文件夹中的 Swift-IJKPlayer-Bridging-Header.h 文件作为桥接文件。

4、基本设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//以下必须配置
//得到控制器
playerController = PlayerViewController()
if let playerView = playerController?.view {
//初始化播放界面的大小
playerController?.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width,height: height)
//添加控制器
addChildViewController(playerController!)
//添加播放界面
view.addSubview(playerView)

}
//设置路径后立即播放,默认true
playerController?.isAutoPlay = false
//设置路径
playerController?.url = "http://baobab.wandoujia.com/api/v1/playUrl?vid=2616&editionType=normal"
//以下选配
//设置封面
playerController?.coverImageView()?.image = UIImage(named: "cover")
playerController?.playerTitle = "leefeng.me"
//协议
playerController?.playerProtocol = self

5、协议方法

1
2
3
4
5
6
7
8
9
10
11
internal func playerStartComplete() {
print("playerStartComplete 播放完成")
}

internal func playerStartPause() {
print("playerStartPause 播放暂停")
}

internal func playerStartPlay() {
print("playerStartPlay 开始播放")
}

6、其他API

play()播放

pause() 暂停

shutDown()退出

基库: https://github.com/Bilibili/ijkplayer

License

1
2
3
4
5
6
7
8
9
10
11
12
13
Copyright  2017 Limxing

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
分享到 评论

再见,世景

两年的时间,在这里成长,今天是在世景的最后一天,心中难掩不舍,虽然是一个集团大家庭,没有小公司的浓厚氛围,我想我是一个比较理性带有感性的人。两年,是一个不长不短的日子,感谢公司给与我这个工作机会。

在世景的两年里,我所骄傲的是我的Android能力的提高,世景给了我富足的时间让我学习、自我提高,在社区上分享了自己的轮子,得到了不少行内的认同和鼓励,学习了IOS开发,让我对移动开发的认识进一步的提高。

祝福世景

分享到 评论

技术习惯

每周三晚的技术分享和每周末每人一篇的技术博客
分享到 评论

工作总结

产品层面

  1. 特效的运用要考虑用户的心理趋向和感受,炫的效果很酷,可能会让人产生某种心理导向。
  2. 特效的运用要考虑将来功能的扩展,一味的渲染也不一定很好,可能会为后续功能带来难度。
  3. 一个产品能帮助用户解决至少一个问题,那解决问题会有主流程,引导要强化,比如按钮大,颜色显眼,字体稍大,放置位置移动少。
  4. 产品不能为照顾运营而偏离主题,或者严重影响美观和主要功能,聚划算妹纸儿们说广告banner曝光度不够,设计变为由轮转变为平铺,但是广告良莠不齐,视觉效果不好,并且主页list仅能显示1、2个商品,影响了主题功能。

代码方面

代码需要审核,程序的代码需要共同学习,完善代码

项目方面

  1. 计划进度,前紧后慢,提前实施。
  2. 不拘泥与细节,不干扰整体进度。
  3. 个人有担当,能者多劳,最大程度保证进度。
  4. 有问题不能包着,有些项目问题不是一个人的问题,不是一人能担得住的。
  5. 宝不能压在责任无关人身上,别人的资源、承诺要充分利用,但是最终还是靠自己突破。
  6. 干一样活的人放在一起,沟通迅速,快速解决问题。
  7. 早上碰一下,清晰任务;晚上碰一下一下,检查进度。
  8. bug先把基础性、功能性问题解决,适配、显示、兼容问题靠后。
  9. 不同网络机型下的跑测,不同网络环境下的测试提前入测。
  10. 写完一天代码,尽量坚持用findbugs查找潜在危险。
  11. 同一版本多次发布,或多个版本发布后,记录下的crash问题如果没有版本属性就很难定位,混淆map也对应不上。发板后立即封代码,保证bug日志中的bug发生行数和源码一致。
  12. 开发新功能、打包、发布过程规范化,规范减少问题发生概率。
  13. 日志规范:
    1). 冗长、惯例日志打到Verbose级别,例如网络返回信息,经常携带大量的信息,会严                                    重干扰视觉;
    2). 细粒度信息打到Debug级别,对出问题时调试有帮助作用,比如某个参数的值,我并    不总想知道是多少,但某些情况我就得看一下;
    3). 粗粒度级别信息打到Info级别,比如应用业务主逻辑,运行中重要的过程或关键点;
    4). 会出现 潜在错误的信息 或者 可以接受的错误 打到Warn级别,比如某个地方我想警告一下说这里是有问题的,或者可能引出其他什么问题;
    5). 错误或者致命信息,理应放到Error级别,血红的颜色很显眼~
    

管理方面

  1. 会议总结问题,就一定要着手解决,不解决会议时间就白浪费了。
  2. 对于人的期望,快速的给予回馈,帮助其向希望的方向发展。
分享到 评论

defaultConfig中ndk的使用

1
2
3
4
5
6
7
8
9
android{
...
defaultConfig {
...
ndk {
abiFilters 'armeabi', 'x86'//, 'armeabi-v7a', 'x86_64', 'arm64-v8a', mips, mips64...加入需要生成的文件夹
}

}

如果不添加此处ndk的选项描述,那么androidstudio默认打包会产生所有的平台so文件包,如果没有相应的so文件那么就会导致程序报错:找不到so文件在某个目录下。因此我们需要根据现有的什么类型的so文件进行配置ndk。

  • 通常我们都会有armeabi和x86平台的so文件,这两个都是为32位的平台提供。有这两个就满足的几乎全部的机型了
  • armeabi-v7a,arm64-v8a都是arm平台的更优化的平台,使用这个so文件效率更高,如果有这种的so文件那么就添加响应的配置。
  • 手机优先选择平台更好的处理平台的so文件,因此没有高版本的so文件就不要添加配置。
分享到 评论

用INTEIILj idea 创建Android studio插件

GitHub项目地址:https://github.com/limxing/MVPHelper

一键创建 Activity Presenter View 以及BaseActivity BasePresenter ProjectApplication

分享到 评论

把项目发布到JCenter

####如何把库发布到JCenter

1、首先去注册https://bintray.com
2、

1
2
3
4
5
6
7
8
9
10
11
12
 classpath 'com.novoda:bintray-release:0.3.4'

如果遇到错误添加
allprojects {
repositories {
jcenter()
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
}
}

3、库的build

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apply plugin: 'com.novoda.bintray-release'//添加
android {
lintOptions {
abortOnError false
}
}

publish {
userOrg = 'limxing'//bintray.com用户名
groupId = 'me.leefeng'//jcenter上的路径
artifactId = 'library'//项目名称
publishVersion = '1.0.2'//版本号
desc = '我的个人库,更改动画'//描述,不重要
website = 'https://github.com/limxing/app'//网站,不重要;尽量模拟github上的地址,例如我这样的;当然你有地址最好了
}

分享到 评论