Genymotion 安装

在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 服务器挂了,等些时候再尝试即可。或者有的时候是因为代理的关系。

unknown generic error

下载对应的镜像,然后就能够运行模拟器了。

为了方便使用可以将 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 , 这样对开发者和使用者造成了一定的困扰,不过还好依然可以通过其他方法解决。

reference


2016-02-08 Android , AndroidDev , Genymotion

django web framework 学习笔记

这两天大概看了一下Python的web框架—-Django,顺带复习一下Python。从刚开始的一无所知,到现在对Django中MVC的一些了解,感觉收获颇丰,还顺带回想起来以前学习过程中的一些MVC的知识,虽然Django不是完全按照MVC的命名模式 Model,View,Controller,但是它依然遵循类似的开发模式,Django自己说自己是 MTV 模式, Model,Template,View。

在看 Django 之前也了解了一些 Python 的Web框架,在之前的写字应用中用 webpy 作了一个简单的接口,webpy 实现很简单,用它当然也能做一些大项目,但是可能需要自己Custom的东西比较多。而Django可以快速上手。

Installation

安装非常简单,先安装 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 viewsIncluding another URLconf 方式来定义URL。

  • settings.py 项目设置

    项目地址,安装应用,数据库,静态文件地址,等等都在此文件中配置。

学习方式

我觉得最好的教程就是官方的Getting started with Django,但是唯一的坏处就是不够视频直观,这个时候上 Google 搜Django tutorial 能够找到很多视频教程,先行入门之后,再去回头看官方的教程或者文档,会很轻松的加快学习进度。

个人觉得几个很重要的文档,在新建 model 的时候, Django 自带了一些 Field, 这些变量的定义直接影响到数据库中保存的数据,在我刚开始学习的时候经常查看Model field reference. 在定义完 model 之后需要执行 python manage.py makemigrationspython 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 知识,甚至可以实现一个具体的应用来锻炼一下。

参考

  • 官方参考 其中有很详细的文档、教程、已经一些基本的网页应用实现,缓存,分页,RSS,消息,Sessions 等等
  • YouTube 教程 一步一步教你用 Django 实现一个简单的个人博客。

2016-01-31 Django , Python , 学习笔记 , Web

每天学习一个命令:less 分页查看

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 查看进程信息并通过 less 分页显示

将其他命令的输出结果分页查看,尤其是当其他命令的输出结果多于一页时。

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 后,切换到 syslog

2016-01-28 less , linux , command

FFmpeg 项目中便携式媒体播放器 ffplay 使用

FFplay 是一个使用 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值可以为

  • 0, video 视频,默认
  • 1, waves 音频波形
  • 2, rdft 音频频谱

默认值 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       跳转到鼠标点击的位置(根据鼠标在显示窗口点击的位置计算百分比)

reference


2016-01-20 ffmpeg , ffplay , sdl , media , linux

boost 学习笔记 11:总结

至此boost一本书基本看完,很多内容粗略的扫过,大概知道了boost的能力,书中最后的总结很好,不仅指出boost的作用,同时把boost 力所不能及的地方指明,并且给了相应的解决方案。如此当遇上相同的需求时就能够快速的找到对应的解决方案。

boost 的缺点:没有达到 Java 和 Python 标准库“包罗万象”的程度:没有 GUI 库,没有 RPC 库,没有 COM+ CORBA 支持……

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

推荐书目

  • 设计模式 可复用面向对象软件的基础
  • C++标准程序库 自修教程与参考手册
  • C++ 语言的设计与演化
  • C++ Primer 第三版
  • Effective C++
  • Effective STL
  • C++网络编程 卷 1 运用 ACE 和模式消除复杂性
  • C++网络编程 卷 2 基于 ACE 和框架的系统化复用
  • C++ STL 中文版
  • UNIX 网络编程 第1卷 套接口 API
  • Python 简明教程

2016-01-18 boost , C++

boost 学习笔记 10:设计模式

设计模式是一个面向对象的通用解决方案,是一套被反复使用,多数人知晓的代码设计经验总结。

一般分为:创建型模式、机构型模式和行为模式

创建型模型

抽象工厂 Abstract Factory

提供统一的创建接口。

生成器 Builder

将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

工厂方法

定义接口用于创建对象。

原型 Prototype

原型模式使用类的实例通过拷贝的方式创建对象,具体的拷贝行为可以定制。最常见的用法为类实现一个 clone() 成员函数,这个函数创建一个与原型相同或者相似的新对象。

单件 Singleton

运行时,类有且仅有一个实例。

结构性模型

如何组合类或者对象,更而形成更大更有用的新对象。

适配器 Adapter

把一个类的接口转换成另一个接口,在不改变原有代码的基础上复用原代码。

桥接 Bridge

将抽象部分与实现部分分离,使它们都可以独立的变化。

组合 Composite

将小对象组合成树形结构。

装饰 Decorator

运行时动态地给对象增加功能。

外观 Facade

为系统中大量对象提供一个一致的对外接口,简化系统使用。

享元 Flyweight

使用共享的方式节约内存的使用

代理 Proxy

它的意图不是改变接口插入新系统(适配),也不是为对象增加职责(装饰),而是要控制对象。

智能指针库,利用代理模式将原始指针包装,代理原始指针的职能。

行为模式

职责链 Chain of Responsibility

把对象连成一条链,使链上的每个对象都有机会处理请求。

命令 Command

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。

解释器 Interpreter

给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

迭代器 Iterator

提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

中介者 Mediator

包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立的变化。

备忘录 Memento

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

观察者 Observer

定义对象间一对多的联系,当一个对象的状态发生变化时,所有与它有联系的观察者对象都会得到通知。

状态 State

允许对象在状态发生变化时行为也同时发生改变。

策略 Strategy

封装不同的“算法”,使它们可以在运行时相互替换。

模板 Template method

模板方法模式准备一个抽象类,将部分逻辑以具体方法及具体构造子类的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先构建一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

访问者 Visitor

分离类的内部元素和访问它们的操作,可以在不改变内部元素的情况下增加作用于它们的新操作。

其他模式

空对象

用于返回无意义的对象时,它可以承担处理null的责任。

包装外观

通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。

前摄器模式 Proactor

用于为异步事件多路分离和分派处理器的对象行为模式


2016-01-18 boost , C++

国家博物院一日游

说了很久想去国家博物院,只是迟迟没有动脚,终于熬到今天。本不是旅游旺季,早上9点出门到那边依然能够领到票进去,排队人数也不是很多,几乎就是去了拿票直接进。如果想要预约门票的话,提早电话或者网上预定,可参见官网文章

去的时候没有查攻略,也没有看任何文章,进到博物馆才发现那边这么大,一时间竟然不知道从那边逛起,幸而查了一眼马蜂窝,看到有人建议到地下一层从《古代中国》开始看。于是开始一段非常漫长的游览史,不是知道是因为走得太慢还是看的太认真,当走到“三国魏晋南北朝”开始已经开始寻找座位想要快速结束这段旅程了。而此后一遍又一遍的感慨中国历史太长,沉浸其中容易无法自拔。

参观的时候没有导游,所以大部分时间就是在读文物的介绍,然后自己维基百科查看,夏商周时候那些青铜器皿,几乎没有知道作用的,于是和小伙伴开始了异想天开,这是洗澡用的,这是喝酒用的,等等,不过倒也知道了一些知识:

  • ”匜“,拼音yí,是先秦的礼器,客人洗手之用。当时还在讨论,如果是,盛水,洗手器,为什么不写成半包围,中间加个手字,多形象
  • 瓦当,已经忘记了在哪个朝代看到的了,后来查看维基才知道,发明于战国时期的鲁班。是屋檐最前面的圆形瓦片,古人会在上面雕刻图案或者神兽。
  • 知道了三国中的魏国并不是曹操建立的,而是他儿子废了汉,看三国的时候没注意呢。
  • 知道了竹林七贤,除了嵇康,阮籍之外多记住了一个刘伶,其他的还是没记住
  • 知道了原来王守仁就是王阳明,他的书法还很不错

后来的后来真的没怎么看了,几乎都是快速浏览过,就这样快速的走过,光是看了一个到1912年的《古代中国》,走出展厅就已经到了下午,后来休息了一下,又粗粗的看了书法展,国博建筑概览就匆匆过去了,很多展厅也没去看,总之以后有机会再过去看看吧。以后有了小孩,应该做好充分的准备工作再去看看,回来之后看到维基上列举的一些国家级文物,印象是有的,只是当时也没有仔细的看,四羊方尊,金缕玉衣,等等当时历史教科书中存在的图片展现到眼前是还是会激动一下的。只是后来倦于拍照片,回来整理也就只几张。

给后人的参考,其之前可以大概的浏览这个维基页面,在其中的古代中国中,列举了一些文物,有一些还是很值得一看的。比如远古时期的”人面鱼纹彩陶盆“,”玉琮“等等;夏商周的青铜器;秦汉的兵马俑,石刻;到后期的瓷器等等。

人面鱼纹彩陶盆 人面鱼纹彩陶盆

大禹治水 大禹治水图

四羊方尊 著名的四羊方尊

金边玉杯 金边玉杯,得此一杯,此生足矣

金制头饰 金制头饰,匆匆路过,突然看到这个饰品,太美了。

可爱的神兽 可爱的神兽,没想到古人也是挺萌的嘛

又一只萌萌的神兽 又一只萌萌的神兽

说不上名字的青铜器 说不上名字的青铜器,已经忘了他叫什么了,应该也是尊吧。

请工作人员不要这么摆设啊,会吓死人的 最后!!!请工作人员不要这么摆设啊,会吓死人的


2016-01-17 博物院 , travel , beijing , 游记 , 经验总结

boost 学习笔记 9:并发编程

Boost中有两个用于并发编程的组件。首先是thead库:它为C++增加了可移植的线程处理能力。然后是一个用于同步和异步IO操作的功能强大的库——asio,它使用了前摄器模式,可以处理串口,网络通信,而且有望成为C++标准底层通信库。

互斥量是一种用于线程同步的手段,它可以在线程编程中防止多个线程同时操作共享资源(或称临界区)。一旦一个线程锁定了互斥量,那么其他线程必须等待他解锁互斥量才能在访问共享资源。thead提供了7中互斥量类型(实际只有五种):

  • mutex 独占式互斥量
  • try-mutex mutex 同义词
  • timed_mutex 独占式互斥量,提供超时锁定功能
  • recursive_mutex 递归式互斥量,可以多次锁定,相应也要多次解锁
  • recursive_try_mutex recursive_mutex 同义词
  • recursive_time_mutex 递归式互斥量,基本功能同 recursive_mutex ,提供超时锁定功能
  • shared_mutex multi-reader/single-writer 型共享互斥量 读写锁

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;
}

asio

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++ 网络编程


2016-01-16 boost , C++

boost 学习笔记 10:Python

项目中需要将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/


2016-01-16 boost , C++

删除社交账号状态

这两天陆陆续续通过一些插件脚本删除了一些社交网站数据。年轻的时候发过一些无聊的状态,然后很久以后都没有登陆过的一些账号,倒不如关了的好,自此以后墙外只用 Google+ , 还有 Blog 记录一下所思所想,墙内公开内容除了豆瓣可能也没得发了,不愿生活在一个审查的制度下。虽然我可能也不会发什么敏感的内容,可谁知道什么敏感,什么不敏感呢?

facebook

Delete all facebook posts , 可以利用以下插件删除 Facebook 所有状态,包括账号内的头像等等。

Chrome Extension link

https://chrome.google.com/webstore/detail/facebook-timeline-cleaner/lfejocdlmhhkmnabbaeckmaehmgaffje

Update: 可惜了这个插件被删除了

renren

关闭账号

weibo

delete tool 删除工具 http://app.weibo.com/detail/62A7lB

批量删除 weibo http://3.amfen.sinaapp.com/

删除微博评论 http://weibo333.com/

腾讯微博

设置中关闭账号

关闭 QQ 空间

通过以下链接申请删除 QQ 空间。

http://imgcache.qq.com/qzone/web/qzone_submit_close.html


2016-01-15 经验总结 , social , posts

电子书

本站提供服务

最近文章

  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。
  • Go 语言编写的网络穿透工具 chisel chisel 是一个在 HTTP 协议上的 TCP/UDP 隧道,使用 Go 语言编写,10.9 K 星星。