在Linux下安装 Genymotion Android 模拟器。最近拾起 Android Development,Android 模拟器必不可少,用来用去 Genymotion 模拟器算是速度和效率最棒的模拟器了。
Genymotion 依赖 VirtualBox 运行,在安装之前确保已经安装 VirtualBox. 在Linux Mint下直接去 Software Manager 搜索 VirtualBox 然后点击安装即可。
Genymotion 安装需要一个 Genymotion 的个人账号,Genymotion 高级功能需要付费,所以去官网注册一个个人账号使用。 官网地址:https://www.genymotion.com
下载安装包,在注册账号登陆之后去首页按照自己的系统选择 32bit 或者 64bit 的安装包下载。目前最新的版本为 2.6.0.
假设安装包下载到 ~/Downloads
目录下,在终端:
# cd ~/Downloads/
# Move the downloaded file to ~/Android/ directory #
mv genymotion-2.6.0_x64.bin ~/Android/
# Set executable permission
chmod +x genymotion-2.6.0_x64.bin
# Install genymotion by running the file
./genymotion-2.6.0_x64.bin
# Navigate into genymotion directory
cd genymotion
# launch the genymotion #
./genymotion
运行 genymotion 之后,添加设备,此时需要登陆账号,有的时候会遇到 “unknown generic error” 错误,在我的观察下可能就是因为 genymotion 服务器挂了,等些时候再尝试即可。或者有的时候是因为代理的关系。
下载对应的镜像,然后就能够运行模拟器了。
为了方便使用可以将 Genymotion 的地址加入到 PATH 中,这样就能快速启动 Genymotion. 类似:
$ PATH=$PATH:/home/einverne/Android/genymotion/
在使用 Genymotion 的时候,有时会遇到 ”INSTALL_FAILED_NO_MATCHING_ABIS“ 错误。一些时候是因为 APP 和模拟器CPU架构的问题,但是在 Genymotion 这里需要额外安装一个文件。点击这里 去xda 下载 Genymotion-ARM-Translation_v1.1.zip 这个文件。并拖到模拟器中。这样就不会出现问题了。如果需要在模拟器中安装 GApps ,可以在上面的链接中找到对应的方法。
如果使用过程中出现 “An error occured while deploying the file. INSTALL_FAILED_CPU_ABI_INCOMPATIBLE” 这样的错误,利用上面的方法也能解决。造成这个错误的原因是因为 Genymotion 是一个基于 x86 的虚拟环境,不是一个 ARM 的模拟器。而 Genymotion 在更新过程中移除了 ARM Translation 和 Google Play Apps , 这样对开发者和使用者造成了一定的困扰,不过还好依然可以通过其他方法解决。
这两天大概看了一下Python的web框架—-Django,顺带复习一下Python。从刚开始的一无所知,到现在对Django中MVC的一些了解,感觉收获颇丰,还顺带回想起来以前学习过程中的一些MVC的知识,虽然Django不是完全按照MVC的命名模式 Model,View,Controller,但是它依然遵循类似的开发模式,Django自己说自己是 MTV 模式, Model,Template,View。
在看 Django 之前也了解了一些 Python 的Web框架,在之前的写字应用中用 webpy 作了一个简单的接口,webpy 实现很简单,用它当然也能做一些大项目,但是可能需要自己Custom的东西比较多。而Django可以快速上手。
安装非常简单,先安装 virtualenv
$ pip install virtualenv
$ cd my_project_folder
$ virtualenv . # create virtual env in current folder
$ source bin/activate
再安装 Django , 创建工程,然后就可以开工了。
$ pip install django # install latest version
# pip install django==1.9 或者指定某一版本
# pip install django --upgrade
$ django-admin startproject projectname
几个很常用的命令,在 manage.py
目录下:
$ python manage.py help
$ python manage.py runserver [port]
$ python manage.py makemigrations # 每一次修改 model 之后需要运行,之后需要运行 migrate
$ python manage.py migrate # 已经代替了 python manage.py syncdb 数据库相关,创建表
$ python manage.py createsuperuser
$ python manage.py startapp appname
几个文件解释:
models.py 和数据库表相关
model 中需要用到的 Field ,关键字:[Model field reference]
views.py 显示相关
处理HttpRequest请求,通过模板生成HTML网页返回
urls.py 匹配URL模式
通过正则匹配请求URL,将对应URL导向相应的view。Django 1.9 中可以引用三种对应的URL匹配模式,Function views
,Class-based views
和 Including another URLconf
方式来定义URL。
settings.py 项目设置
项目地址,安装应用,数据库,静态文件地址,等等都在此文件中配置。
我觉得最好的教程就是官方的Getting started with Django,但是唯一的坏处就是不够视频直观,这个时候上 Google 搜Django tutorial 能够找到很多视频教程,先行入门之后,再去回头看官方的教程或者文档,会很轻松的加快学习进度。
个人觉得几个很重要的文档,在新建 model 的时候, Django 自带了一些 Field, 这些变量的定义直接影响到数据库中保存的数据,在我刚开始学习的时候经常查看Model field reference. 在定义完 model 之后需要执行 python manage.py makemigrations
和 python manage.py migrate
来同步自定义的 model 和 数据库中内容。
在 view 中需要 render 模板的时候,常用的方式就是在 工程下app 的同级目录增加 templates 目录,将html模板放到该目录下。并且需要在 settings.py 文件中 TEMPLATES 设置中增加
'DIRS': [os.path.join(BASE_DIR, "templates")],
. 可以参考 官方文档 .
而接下来是网页的表单,可以自定义表单,也可以通过 Model 直接生成对应的表单,官方都有详细的介绍。
至此生成一个自己的简单页面应该没有任何问题了。下面就是学习一些深入的内容,在之前的视频中有用到 django-registration-redux
一个第三方的注册登陆的实现。能够快速实现一个网站的注册邮箱验证以及登录验证。然后因为 Django 生成的网页表单太丑,所以还用了 django-crispy-forms
这样一个第三方生成表单的应用。快速生成带CSS样式的表单。具体的使用看文档都能够快速使用。
到此,可以看一些教程实现一些自定义的表单 validation,可以看一下第三方应用的实现来充实一下自己的 django 知识,甚至可以实现一个具体的应用来锻炼一下。
less 命令可以对文件或其它输出进行分页显示,应该说是 linux 正统查看文件内容的工具,功能强大。less 的用法比起 more 更有弹性。在 more 的时候,我们并没有办法向前面翻,只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容。除此之外,在 less 里拥有更强大的搜索功能,不止可以向下搜,也可以向上搜。
less [options] 文件
less 与 more 类似,more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件
命令参数:
-b 缓冲区大小 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似 more 命令的百分比
-N 在 less 中显示每行的行号
-o 文件名 将 less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x 数字 将“tab”键显示为规定的数字空格
交互命令, less 中的交互命令可以在 less 中直接按下按键来使用:
h H 显示帮助界面
q :q Q :Q ZZ 退出 less 命令
移动,全屏导航
F like tail -f 滚动到文件末尾并持续监听文件写入
jk 下 / 上 一行,因为个人习惯了 vim 的 keymap 所以使用 jk,但 less 的移动键有很多个,可以 help 来查看
G 移动到最后一行
g 移动到第一行
f 向下移动一屏
b 向上移动一屏
d 向下移动半屏
u 向上移动半屏
y 向前滚动一行
空格键 滚动一页
回车键 滚动一行
[pagedown] 向下翻动一页
[pageup] 向上翻动一页
less 命令和 Vim 类似,也可以使用比如 10k,表示向上移动 10 行。
less 内搜索
/ 字符串:向下搜索“字符串”的功能
? 字符串:向上搜索“字符串”的功能
n 重复前一个搜索(与 / 或 ? 有关)
N 反向重复前一个搜索(与 / 或 ? 有关)
&pattern 只显示匹配的行
快速跳转
g < ESC-< 跳转到第一行
G > ESC-> 跳转到最后行
'' 跳转到上一个位置
其它交互命令
:e 检视其他文件
v 使用配置的编辑器 ($VISUAL or $EDITOR) 编辑当前文件
V 打印 less 版本
!command 执行 $SHELL 命令
h 显示 less 的帮助文档
&pattern 仅显示匹配模式的行,而不是整个文件
标记导航
当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:
ma 使用 a 标记文本的当前位置
'a 导航到标记 a 处
看到这些交互命令其实应该一点都不陌生,如果使用 Vim 的话,基本都是 Vim 中用到的。
命令:
less +F /var/log/syslog
将其他命令的输出结果分页查看,尤其是当其他命令的输出结果多于一页时。
ps -ef |less
举一反三
apt search nemo | less
查看命令历史使用记录并通过 less 分页显示
history | less
同时查看多个文件:
less /var/log/syslog /var/log/mysql/error.log
此时 less 只会显示一个 syslog,此时
:n
后,切换到 mysql/error.log:p
后,切换到 syslogFFplay 是一个使用 FFmpeg 和 SDL 库制作的简易轻便的媒体播放器,他可以用来测试 FFmpeg APIs。
使用方式很简答
ffplay [options] input_file
播放 demo.mp4 ,播放完成后自动退出
ffplay -autoexit demo.mp4
以特定大小播放 demo.mp4
ffplay -x 640 -y 480 demo.mp4
从指定时间开始播放
ffplay -ss 10 demo.mp4
指定播放时长
ffplay -t 10 demo.mp4
关闭音频
ffplay -an demo.mp4
关闭视频
ffplay -vn demo.mp4
将窗口标题设置为 “myplayer”,循环播放 2 次
ffplay -window_title myplayer -loop 2 demo.mp4
设置显示模式
ffplay -showmode rdft demo.mp4
参数 -showmode
后面接的mode值可以为
默认值 video, 在播放时,可以通过 w
快捷键在几种模式中切换
ffplay 相比于本地播放器,他也能够播放网络视频,如果能够拿到视频的网络播放地址,不管是直链,还是 m3u8,也能够直接加在 ffplay 后面播放,顺便也可以直接查看视频流的信息。
本地做一个测试,开启一个终端播放 ffplay
ffplay udp://127.0.0.1:8080
然后使用 ffmpeg 生成流媒体
ffmpeg -r 25 -i demo.mp4 -f mpegts udp://127.0.0.1:8080
这里的参数
-r 25
表示每秒25帧-f
输出视频流q, ESC 退出
f 全屏
p, SPC 暂停
w 切换显示模式(视频/音频波形/音频频带)
s 步进到下一帧
left/right 快退/快进 10 秒
down/up 快退/快进 1 分钟
page down/page up 跳转到前一章/下一章(如果没有章节,快退/快进 10 分钟)
mouse click 跳转到鼠标点击的位置(根据鼠标在显示窗口点击的位置计算百分比)
至此boost一本书基本看完,很多内容粗略的扫过,大概知道了boost的能力,书中最后的总结很好,不仅指出boost的作用,同时把boost 力所不能及的地方指明,并且给了相应的解决方案。如此当遇上相同的需求时就能够快速的找到对应的解决方案。
boost 的缺点:没有达到 Java 和 Python 标准库“包罗万象”的程度:没有 GUI 库,没有 RPC 库,没有 COM+ CORBA 支持……
RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
设计模式是一个面向对象的通用解决方案,是一套被反复使用,多数人知晓的代码设计经验总结。
一般分为:创建型模式、机构型模式和行为模式
提供统一的创建接口。
将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
定义接口用于创建对象。
原型模式使用类的实例通过拷贝的方式创建对象,具体的拷贝行为可以定制。最常见的用法为类实现一个 clone() 成员函数,这个函数创建一个与原型相同或者相似的新对象。
运行时,类有且仅有一个实例。
如何组合类或者对象,更而形成更大更有用的新对象。
把一个类的接口转换成另一个接口,在不改变原有代码的基础上复用原代码。
将抽象部分与实现部分分离,使它们都可以独立的变化。
将小对象组合成树形结构。
运行时动态地给对象增加功能。
为系统中大量对象提供一个一致的对外接口,简化系统使用。
使用共享的方式节约内存的使用
它的意图不是改变接口插入新系统(适配),也不是为对象增加职责(装饰),而是要控制对象。
智能指针库,利用代理模式将原始指针包装,代理原始指针的职能。
把对象连成一条链,使链上的每个对象都有机会处理请求。
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。
给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立的变化。
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
定义对象间一对多的联系,当一个对象的状态发生变化时,所有与它有联系的观察者对象都会得到通知。
允许对象在状态发生变化时行为也同时发生改变。
封装不同的“算法”,使它们可以在运行时相互替换。
模板方法模式准备一个抽象类,将部分逻辑以具体方法及具体构造子类的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先构建一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。
分离类的内部元素和访问它们的操作,可以在不改变内部元素的情况下增加作用于它们的新操作。
用于返回无意义的对象时,它可以承担处理null的责任。
通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。
用于为异步事件多路分离和分派处理器的对象行为模式
说了很久想去国家博物院,只是迟迟没有动脚,终于熬到今天。本不是旅游旺季,早上9点出门到那边依然能够领到票进去,排队人数也不是很多,几乎就是去了拿票直接进。如果想要预约门票的话,提早电话或者网上预定,可参见官网文章。
去的时候没有查攻略,也没有看任何文章,进到博物馆才发现那边这么大,一时间竟然不知道从那边逛起,幸而查了一眼马蜂窝,看到有人建议到地下一层从《古代中国》开始看。于是开始一段非常漫长的游览史,不是知道是因为走得太慢还是看的太认真,当走到“三国魏晋南北朝”开始已经开始寻找座位想要快速结束这段旅程了。而此后一遍又一遍的感慨中国历史太长,沉浸其中容易无法自拔。
参观的时候没有导游,所以大部分时间就是在读文物的介绍,然后自己维基百科查看,夏商周时候那些青铜器皿,几乎没有知道作用的,于是和小伙伴开始了异想天开,这是洗澡用的,这是喝酒用的,等等,不过倒也知道了一些知识:
后来的后来真的没怎么看了,几乎都是快速浏览过,就这样快速的走过,光是看了一个到1912年的《古代中国》,走出展厅就已经到了下午,后来休息了一下,又粗粗的看了书法展,国博建筑概览就匆匆过去了,很多展厅也没去看,总之以后有机会再过去看看吧。以后有了小孩,应该做好充分的准备工作再去看看,回来之后看到维基上列举的一些国家级文物,印象是有的,只是当时也没有仔细的看,四羊方尊,金缕玉衣,等等当时历史教科书中存在的图片展现到眼前是还是会激动一下的。只是后来倦于拍照片,回来整理也就只几张。
给后人的参考,其之前可以大概的浏览这个维基页面,在其中的古代中国中,列举了一些文物,有一些还是很值得一看的。比如远古时期的”人面鱼纹彩陶盆“,”玉琮“等等;夏商周的青铜器;秦汉的兵马俑,石刻;到后期的瓷器等等。
人面鱼纹彩陶盆
大禹治水图
著名的四羊方尊
金边玉杯,得此一杯,此生足矣
金制头饰,匆匆路过,突然看到这个饰品,太美了。
可爱的神兽,没想到古人也是挺萌的嘛
又一只萌萌的神兽
说不上名字的青铜器,已经忘了他叫什么了,应该也是尊吧。
最后!!!请工作人员不要这么摆设啊,会吓死人的
Boost中有两个用于并发编程的组件。首先是thead库:它为C++增加了可移植的线程处理能力。然后是一个用于同步和异步IO操作的功能强大的库——asio,它使用了前摄器模式,可以处理串口,网络通信,而且有望成为C++标准底层通信库。
互斥量是一种用于线程同步的手段,它可以在线程编程中防止多个线程同时操作共享资源(或称临界区)。一旦一个线程锁定了互斥量,那么其他线程必须等待他解锁互斥量才能在访问共享资源。thead提供了7中互斥量类型(实际只有五种):
mac下使用 boost thread 需要将 libboost_thread.dylib libboost_thread-mt.dylib lib boost-system.dylib 加入到工程,链接进工程。
具体用法:
#include <iostream>
#include <string>
#include <boost/assign.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/assign.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/ref.hpp>
#include <boost/bind.hpp>
using namespace boost;
using namespace std;
#define BOOST_DATE_TIME_SOURCE
#define BOOST_THREAD_NO_LIB
// 模板类配合模板参数提供不同范围的计数,提供隐式类型转换操作
// 在多线程环境下安全计数
template <typename T>
class basic_atom: noncopyable {
private:
T n;
typedef boost::mutex mutex_t;
mutex_t mu;
public:
basic_atom(T x = T()):n(x) {}
T operator++(){
mutex_t::scoped_lock lock(mu);
return ++n;
}
// T operator=(const T _n){
// mutex_t::scoped_lock lock(mu);
// n = _n;
// return _n;
// }
operator T() {return n;}
};
boost::mutex io_mu;
typedef basic_atom<int> atom_int;
void printing(atom_int& x, const string& str){
for (int i = 0; i < 5; ++i) {
boost::mutex::scoped_lock lock(io_mu);
cout << str << ++x <<endl;
}
}
void to_interrupt(atom_int& x, const string& str){
try {
for (int i = 0; i < 5; ++i) {
this_thread::sleep(posix_time::seconds(1));
boost::mutex::scoped_lock lock(io_mu);
cout << str << ++x <<endl;
}
} catch (thread_interrupted& ) {
cout << "thread_interrupted" <<endl;
}
}
int main(int argc, const char * argv[]) {
cout << "start" <<endl;
this_thread::sleep(posix_time::seconds(2));
cout << "sleep 2 seconds" <<endl;
boost::mutex mu;
try {
mu.lock();
cout << "do some operations" << endl;
mu.unlock();
} catch (...) {
mu.unlock();
}
boost::mutex mu1;
boost::mutex::scoped_lock lock(mu1);
cout << "some operations" <<endl;
atom_int x;
thread t1(printing, boost::ref(x), "hello");
// this_thread::sleep(posix_time::seconds(2));
// join & timed_join
if (t1.joinable()) {
t1.join(); // 等待t1 线程结束再返回,不管执行多长时间
}
thread t2(printing, boost::ref(x), "boost");
t2.timed_join(posix_time::seconds(1)); // 最多等待1秒返回
thread t(to_interrupt, boost::ref(x), "interrupt");
this_thread::sleep(posix_time::seconds(4));
t.interrupt();
t.join();
return 0;
}
Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库。以下代码实现一个简单的tcp服务,访问http://localhost:6688
可得到字符.
#include <iostream>
#include <string>
#include <boost/assign.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/assign.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/asio.hpp>
using namespace boost;
using namespace std;
int main(int argc, const char * argv[]) {
using namespace boost::asio;
try {
io_service ios;
ip::tcp::acceptor acceptor(ios, ip::tcp::endpoint(ip::tcp::v4(), 6688));
cout << acceptor.local_endpoint().address() << endl;
while (true) {
ip::tcp::socket sock(ios);
acceptor.accept(sock);
cout << "client:" ;
cout << sock.remote_endpoint().address() << endl;
sock.write_some(buffer("hello asio"));
}
} catch (std::exception& e) {
cout << e.what() << endl;
}
return 0;
}
更多 boost.asio 相关内容查看C++ 网络编程
项目中需要将C++的程序暴露给网络使用,我也不想使用C++来用网络编程,就想到可以使用Python来解决Web端,然后将 C++ 的接口暴露给 Python 。于是在寻求解决方案的时候找到了 boost.python 库。
boost 中的 Python 库支持在 Python 和 C++ 之间的自由转换,包括 C++ 到 Python 的类型转换,默认参数,关键字参数,引用,指针等等。boost.python 库可以让 Python 轻易地调用 C++ 编写的模块,也可以很容易地在 C++ 中调用 Python 。
C++ 文件中需要包含头文件
#include <boost/python.hpp>
using namespace boost::python;
还需要在链接的时候,加入 -lboost_python
。
以下操作借助Linux下g++完成,Windows可能需要借助其他工具,导出C++函数具体实现:
hello.cpp
char const* greet()
{
return "hello, world";
}
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello) // Python 模块开始
{
using namespace boost::python; // 打开命名空间
def("greet", greet);
}
Makefile
PYTHON_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)
# location of the Boost Python include files and library
#
BOOST_INC = /usr/local/include
BOOST_LIB = /usr/local/lib
# compile mesh classes
TARGET = hello
$(TARGET).so: $(TARGET).o
g++ -shared $(TARGET).o -L$(BOOST_LIB) -lboost_python -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o $(TARGET).so
$(TARGET).o: $(TARGET).cpp
g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).cpp
clean:
rm *.so *.o
hello.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import hello
print hello.greet()
输出: hello, world
注意将 python, boost 所在目录 include 进去,在链接时加上 -lboost_python -lpython2.7
并 include python 和 boost目录。
Demo 地址GitLab : https://gitlab.com/einverne/boost_test/
这两天陆陆续续通过一些插件脚本删除了一些社交网站数据。年轻的时候发过一些无聊的状态,然后很久以后都没有登陆过的一些账号,倒不如关了的好,自此以后墙外只用 Google+ , 还有 Blog 记录一下所思所想,墙内公开内容除了豆瓣可能也没得发了,不愿生活在一个审查的制度下。虽然我可能也不会发什么敏感的内容,可谁知道什么敏感,什么不敏感呢?
Delete all facebook posts , 可以利用以下插件删除 Facebook 所有状态,包括账号内的头像等等。
Chrome Extension link
https://chrome.google.com/webstore/detail/facebook-timeline-cleaner/lfejocdlmhhkmnabbaeckmaehmgaffje
Update: 可惜了这个插件被删除了
关闭账号
delete tool 删除工具 http://app.weibo.com/detail/62A7lB
批量删除 weibo http://3.amfen.sinaapp.com/
删除微博评论 http://weibo333.com/
设置中关闭账号
通过以下链接申请删除 QQ 空间。