python使用pycurl库

软硬件环境

  • macOS Sierra
  • pycurl-7.19.5

Mac安装pycurl

源码下载地址http://pycurl.sourceforge.net

tar xvf pycurl-7.19.5.tar.gz    
cd pycurl-7.19.5    
sudo python setup.py install    

测试pycurl是否安装成功,命令行执行python

import pycurl   
print pycurl.version    

如果你使用是pycharm,可以直接到preference里安装,如下图

pycurl_01

实例

这里的示例,实现一个从web server上下载一个文件到本地的功能,利用pycurl这个模块,直接上代码

__author__ = 'djstava'    
#!/usr/bin/env python
#coding=utf-8

import pycurl
import sys

DJ_PYCURL_CONNECTTIMEOUT = 30
DJ_PYCURL_TIMEOUT = 300
DJ_PYCURL_DOWNLOADURL = "http://192.168.1.99/test.zip"
DJ_PYCURL_DOWNLOAD_FILE = "download.file"

fp = open(DJ_PYCURL_DOWNLOAD_FILE,'wb+')

def dj_pycurl_writeFile(buffer):
    fp.write(buffer)

def dj_pycurl_download(url):
    pycurl.global_init(pycurl.GLOBAL_ALL)
    c = pycurl.Curl()

    c.setopt(pycurl.URL, url)
    c.setopt(pycurl.WRITEDATA,fp)
    c.setopt(pycurl.WRITEFUNCTION,dj_pycurl_writeFile)
    c.setopt(pycurl.NOPROGRESS,0)
    c.setopt(pycurl.CONNECTTIMEOUT,DJ_PYCURL_CONNECTTIMEOUT)
    c.setopt(pycurl.TIMEOUT,DJ_PYCURL_TIMEOUT)
    c.setopt(pycurl.VERBOSE,1)

    c.perform()
    c.close()
    fp.close()

if __name__ == '__main__':
    dj_pycurl_download(DJ_PYCURL_DOWNLOADURL)

代码测试

pycurl_02

Mac安装nginx

brew install nginx

修改nginx配置文件

/usr/local/etc/nginx/nginx.conf

nginx默认根目录

/usr/local/opt/nginx/html

启动nginx服务

sudo nginx

References

1、http://pycurl.sourceforge.net

macOS搭建Spring Boot开发环境

软硬件环境

  • macOS Sierra
  • java 1.8.0_65
  • maven 3.5.0
  • idea 2017.1.5

前言

最近接触了一点java web相关的知识,了解一下最近比较火的开发框架Spring Boot,站在一个从未涉足过java web和spring的开发者角度来讲,spring boot确实是一个非常不错的框架,配置简单,容易入门,对于想入行java web的童鞋,是一个很好的切入点。

maven安装

这里选择maven作为构建工具,你也可以使用其它的,如gradle等。到apache站点https://maven.apache.org/download.cgi下载最新稳定版的zip包,解压到指定目录,比如我这里是/Users/djstava/Workshop/tools,然后编辑/Users/djstava/.bash_profile文件,在文件末尾增加语句

export PATH=$PATH:/Users/djstava/Workshop/tools/apache-maven-3.5.0/bin

设置完成后,在Terminal中执行

source ~/.bash_profile

上述操作后,最后来检查一下设置的结果是否正确,在终端中执行

mvn -version

IDE选择

我这里选择jetbrains的IntelliJ IDEA,当然你也可以选择其它的,如eclipse。

创建第一个应用

新建工程

点击Create New Project

sb_01

选择左侧的Spring Initializer,Project SDK选择java 1.8

sb_02

接下来是一些工程基本信息的填写,Type选择Maven Project,Packaging选择Jar,其它的可以随意写

sb_03

依赖项选择Web,如图所示

sb_04

sb_05

工程创建成功后,第一个构建过程会比较慢,等待完成后,点击DemoApplication.java中的main函数前的绿色按钮就可以启动工程了

sb_06

这时候打开浏览器,输入localhost:8080查看

sb_07

上面浏览器输出是正常的。接下来我们加入点代码,让它能够显示点东西出来。创建一个新的java类

sb_08

HelloController.java源码
package com.xugaoxiang;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by djstava on 15/07/2017.
 */
@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello Spring Boot!";
    }

}

重新启动工程,查看浏览器,输入地址localhost:8080/hello

sb_09

工程解释

@RestController和@RequestMapping,这是2个很重要的注解。@RestController负责处理http请求,@RequestMapping负责url的映射。

Android应用程序如何导入到android源码树

软硬件环境

  • OTT BOx with android 5.1.1

前言

在做android开发时,有时需要事先将应用程序烧写到板子上去而不必让用户在板子出厂后自行安装。将应用导入到android源码树可以分为两种情况:应用的apk文件和工程源码,下面将一一介绍。

APK文件形式导入

这种方式最简单,app源码与android源码分开管理,互不相干。App发布后,再放进android源码库中编译打包。主要有一下几个步骤

在应用程序所在目录创建文件夹

一般是packages/apps/这个目录或者厂家自己存放apps的位置

mkdir Hello
将Hello.apk拷贝到刚才所创建的文件夹下
copy Hello.apk Hello
在apk同级创建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
    
LOCAL_MODULE := Hello.apk
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE_CLASS := EXECUTABLE
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
LOCAL_SRC_FILES := $(LOCAL_MODULE)
到android根目录进行编译
make

应用源码形式导入

在应用程序所在目录创建文件夹

一般是packages/apps/这个目录或者厂家自己存放apps的位置

mkdir Hello
将工程源码拷贝到Hello文件夹下
copy -rf Hello/* Hello/
新建Android.mk文件
LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := Hello
LOCAL_MODULE_TAGS := eng 
    
include $(BUILD_PACKAGE)
到android根目录进行编译
make
如果java中调用了c库,则工程中会有个jni目录

source_tree_01

这里的Android.mk是用来编译C文件产生lib*.so的,如

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

# java中System.loadLibray()使用 
LOCAL_MODULE := SerialPort
LOCAL_SRC_FILES := SerialPort.c     
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY)
此时工程的Android.mk可如下
LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE_TAGS := eng 
LOCAL_SRC_FILES := $(call all-java-files-under, src) 
LOCAL_PACKAGE_NAME := testApp 
LOCAL_CERTIFICATE := platform 
LOCAL_JNI_SHARED_LIBRARIES := libserial_port 
LOCAL_PROGUARD_ENABLED := disabled 
include $(BUILD_PACKAGE) 
include $(call all-makefiles-under,$(LOCAL_PATH))
重新编译
make

关于作者

Website: http://www.xugaoxiang.com
Github: https://github.com/djstava
Email: djstava@gmail.com

Android开机执行C程序

软硬件环境

  • OTT BOx with android 5.1.1

前言

之前的Android开机执行shell脚本介绍了如何在android系统开机时执行特定的shell脚本文件,不过在某些情况下不适合用shell实现,又不好做成jni动态库由app调用,这时用C语言程序来实现就有可能帮上你,本文就以创建文件夹为例,来实现android开机启动C可执行程序。

实现步骤

在Android源码中创建文件夹
cd android_src/external
mkdir djstava
创建C源文件及Android.mk

首先是写源码文件test.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int ret = mkdir("/system/djstava");//请确保你的用户有对相应目录的权限
    if(ret == -1)
    {
        printf("mkdir failed!\n");
        return -1;
    }
    return 0;
}

这里如果你的system分区只读,可以换成/data/djstava作为测试用

接下来就是Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng 
LOCAL_MODULE := djstava 
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)
修改Android开机脚本文件init.${platform}.rc文件,增加
service djstava_test /system/bin/djstava
    class main
    user root
    group root
    oneshot
重新编译源码并打包
cd android_src
make
刷机并测试

看看文件夹/system/djstava(或者/data/djstava)是否已经被创建好了。

关于作者

Website: http://www.xugaoxiang.com
Github: https://github.com/djstava
Email: djstava@gmail.com

Android开机执行shell脚本

软硬件环境

  • OTT BOx with android 5.1.1

前言

在应用程序启动之前,往往需要在Android启动过程中去对系统做一些设置,如修改某些文件夹的属主和文件的权限等。本文实现在init.*.rc中调用shell脚本,而所有对系统资源的修改和配置都在此shell脚本中实现,最后讲一下关闭android selinux的三种方法。

Shell脚本

这里以创建蓝牙设备结点为例,shell文件名为makebtusb0.sh,在脚本中创建结点,然后修改结点属性,具体如下

#! /system/bin/sh

mknod /dev/btusb0 c 180 194
chmod 777 /dev/btusb0

修改init.${platform}.rc文件

这个文件一般是放在device目录下,如果没有的话,也可以直接加到init.rc中

service makenode /system/etc/makebtusb0.sh
    class main
    user root
    group root 
    oneshot

上述命令中,包含一些android init language的知识点,如果想了解的话,请见参考资料1,写得非常详细。

关闭Android selinux的几种方法

刚好在集成蓝牙驱动中碰到了这个问题,就在这里一并记录下,希望其他朋友少走弯路

方法一
setenforce 0
方法二
echo 0 > /sys/fs/selinux/enforce
方法三

编辑BoardConfig.mk

BOARD_KERNEL_CMDLINE := console=ttyS0,115200n8 androidboot.hardware=zx2000 androidboot.serialno=01234567890123456789 androidboot.selinux=permissive

方法一和方法二适合在终端中执行,当然放在这篇文章中,也可以利用shell脚本实现。方法三在源码中设定,编译打包镜像后就不用再做设置,推荐用这种方法。

关于作者

Website: http://www.xugaoxiang.com
Github: https://github.com/djstava
Email: djstava@gmail.com

参考资料

https://www.kancloud.cn/digest/shichang-framework/131973