小子 发布的文章

C++中嵌入python

#include 
#include 

using namespace std;

int main(int argc, char* argv[]) {
	PyObject *pModule, *pDict, *pFunc;
	PyObject *pArgs, *pArg, *pResult;
	
	Py_Initialize();
	// ...
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");
	
	// ...
	pModule = PyImport_ImportModule("callback");

	if(pModule != NULL) {
		pDict = PyModule_GetDict(pModule);
		pFunc = PyDict_GetItemString(pDict, "hello");

		if(pFunc && PyCallable_Check(pFunc)) {
			pResult = PyObject_CallObject(pFunc, NULL);
			if(pResult != NULL) {
				cout << PyString_AsString(pResult) << endl;

				Py_DECREF(pResult);
			}
			
		}
		Py_XDECREF(pFunc);
		Py_DECREF(pDict);
		Py_DECREF(pModule);
	}

	// Py_DECREF(pArgs);
	// Py_DECREF(pArg);
	
	Py_Finalize();
	
	return 0;
}

內容粗略,僅是記錄一下,有待更新。

bash杂记2

不显示终端的输入(stty)

echo "Please enter your password:"
stty -echo
read PASSWORD
stty echo
# 输出刚才输入的内容
echo $PASSWORD

交互式选择(select)

# 江山和美人,你更喜欢那个?
echo "Which do you prefer?"
select result in "beauty" "land"
do
	break
done
echo $result

得到当前脚本的绝对路径

echo $(cd "$(dirname "$0")"; pwd)

mysql储存时间选择怎样的字段类型

储存时间,常用的有三个选择datetimetimestampint。昨夜同事问到了,于是今天就总结一下自己的理解。

  1. 插入效率:datetime > timestamp > int
  2. 读取效率:int > timestamp > datetime
  3. 储存空间:datetime > timestamp = int
具体上面的实验数据可以看这篇文章
建立索引的体积,和索引的速度,你懂的。

让我们来看一个应用场景:
QQ截图20120601102859.png
看下这张图,第一我们需要设置系统的默认时区,第二我们也需要提供不同时区时间显示的需要。于是,我们分别使用datetimetimestampint字段类型来看下:

使用datetime

直接显示时间,这是个不错的选择,但是如果考虑到时区,很明显计算上的麻烦。

使用timestamp

OK,这个很好,可以根据系统的时区来自动输出时间,但是单个用户要定制自己的时区呢?再者你不怕麻烦,在程序里面实现了这个计算,服务器若是换个地方,改了下时区,你程序里面计算单个用户当地时间的代码怎么办(timestamp出来的时间会根据时区的变化而变化,在某些情况下是不错的选择,但在某些情况下,真的很鸡肋)。

使用int

从上面两个类型的缺点看来,貌似这个类型可以解决以上的问题,其实我们只要存格林时间的unix timestamp就好了,时区时间的计算上也很方便,读取的效率也不错。我觉得用这个储存的缺点呢,就是直接select的时候时间不能直观的显示出来。

看看其他开源程序是怎么做的

discuz, typecho, emlog等等等等,他们都选用int了,这一定有他们的道理,我想也没什么可以多说的了。

C++获取程序所在目录

#include 
#include 
#include 

using namespace std;

string selfPath();

int main() {
	string abspath = selfPath();
	cout << abspath << endl;
	return 0;
}

string selfPath() {
	char buff[1024];
	ssize_t len = readlink("/proc/self/exe", buff, sizeof(buff)-1);
	if(len != -1) {
		buff[len] = '\0';
		return dirname(buff);
	}
	return "";
}

C++ console显示进度条

#include 
#include 

using namespace std;

int main() {
	for(int i = 0; i <=10; i++) {
		// flush擦除,\r定位到行首
		cout << flush << '\r' << string(i, '#');

		sleep(1);
	}
	cout << endl;

	cin.get();
	return 0;
}

C# Clipboard的操作

Clipboard.ContainsText(); // 判断剪切板中是否包含文字
Clipboard.GetText(); // 获取剪切板文字
Clipboard.SetText(); // 设置剪切板文字

Clipboard.ContainsImage(); // 判断剪切板中是否包含图片
Clipboard.GetImage();
Clipboard.SetImage();

// 还有其他的,比如声音文件...

Clipboard.Clear(); // 清空剪切板

《编程珠玑》学习笔记

书是买了好久,一直没心情,到今天才拿起来看,算法使用python实现。

位图排序

import random
# 产生一组随机数
unsorted = [random.randint(1, 19) for i in range(7)]

print(unsorted)
# 初始化一个向量组
bits = [0] * 20
# 储存排序后的结果
hsorted = []
# 对号入座
for i in unsorted:
	bits[i] = 1
for n, m in enumerate(bits):
	if m == 1:
		hsorted.append(n)

print(hsorted)

二分法查找

lis = [0,1,2,3,4,5,6,7,8]

search = 7.5

def binarySearch(lis, search):
	low = 0
	high = len(lis) - 1
	while low <= high:
		#mid = (low + high) // 2
		mid = (low + high) >> 1
		if search < lis[mid]:
			high = mid - 1
		elif search > lis[mid]:
			low = mid + 1
		elif search == lis[mid]:
			return mid
	if low > len(lis) - 1 or high < 0:
		return -1
	return (high, low)

print(binarySearch(lis, search))

CentOS登录信息显示IP

# 备份
cp /etc/issue /etc/issue_standard

创建脚本文件

在脚本文件中写入以下内容。

#!/bin/bash
cat /etc/issue_standard >/etc/issue
/sbin/ifconfig eth0 |grep "inet addr"|sed 's/^.* addr://g' |sed 's/Bcast.*$//g' >>/etc/issue
echo "" >>/etc/issue

增加可执行权限,加入开机启动。

2012-10-08补充

由于只有开机启动的时候写IP信息的话,登录后改过IP,再退出登录的时候就会有问题(显示的还是原来的IP)。

# 网卡启用前执行
/sbin/ifup-pre-local
# 网卡被启用后执行
/etc/sysconfig/network-scripts/ifup-post
# 网卡启用后,最后执行
/sbin/ifup-local
# 网卡被禁用后执行
/etc/sysconfig/network-scripts/ifdown-post

php创建透明缩略图的方法

我所知的两种方法:

  • 非混色模式(透明色具有覆盖的效果)
  • 使新创建的画布透明

方法一、非混色模式

$thumb = imagecreatetruecolor(100, 100);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
// 裁剪
// imagecopy
// 缩放
// imagecopyresampled

方法二、让画布透明

$canvas = imagecreatetruecolor(100, 100);
$blackcolor = imagecolorallocate($canvas, 0, 0, 0);
imagecolortransparent($canvas, $blackcolor);
// 画个长方形测试一下
imagefilledrectangle($im, 4, 4, 50, 25, $red);

sed之打点计数器

将第二行的dns nameserver注释掉

sed -r '/nameserver/{
     x;
     s/^/./;
     /^\.{1}$/x;
     /^\.{2,}$/{x;s/^/; /};
     }' /etc/resolv.conf

sublime设置build system

PHP

{
	"cmd": ["php", "-f", "$file"],
	"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
	"selector": "source.php"
}

C++

{
	"cmd": ["g++ -Wall ${file} -o ${file_base_name} && ${file_path}/${file_base_name}"],
	"working_dir": "${file_path}",
	"selector": "source.c++",
	"shell": true
}

Lua

{
	"cmd": ["lua52", "$file"],
	"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
	"selector": "source.lua"
}

顺便,转换文件格式的地方View -> Line Endings

RPM打包spec文件

Summary:   Account6000
Name:      ac6000
Version:   1.0.1
Release:   1
License:   GPL
Group:     System
Source:    account.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
Url:       http://www.inote.cc/
Packager:  WangZhicheng
Prefix:    %{_prefix}
Prefix:    %{_sysconfdir}

%description
Account6000.

%prep
%setup -c
%install
install -d $RPM_BUILD_ROOT
/bin/cp -af * $RPM_BUILD_ROOT

%clean
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/%{name}-%{version}

%files
%defattr(-,root,root)
/var/www/html/account
/usr/*
/etc/*

install段,是将tar.gz包解压到RPM_BUILD_DIR目录的,而file段拷贝的时候是从RPM_BUILD_ROOT目录拷贝的,所以在install段的时候要将解压到RPM_BUILD_DIR下的文件拷贝到RPM_BUILD_ROOT目录下。

js的trim

在IE6,7,8中String对象没有trim方法,IE9,Chrome,Firefox是有的,解决方法:

if(typeof String.prototype.trim !== 'function') {
	String.prototype.trim = function() {
		return this.replace(/^\s+|\s+$/g, '');
	}
}

如果使用jQuery,直接用$.trim(string)好了。