Archive for November 2009


[GTK编程]如何读取网络中的图片创建image控件

November 18th, 2009 — 11:00pm

发个牢骚,五千万个干!昨天可是想破头了,今天起来翻翻文档就实现了。
代码相当的ugly,希望有高手赐教更方便的方法,
实现方法很简单就是通过curl访问读取到内存中,
然后调用gdk_pixbuf_new_from_stream,
最后通过gtk_image_new_from_pixbuf创建。

/*
功能:演示在GTK中如何读取网络中的图片创建image控件
编译:gcc -Wall -g `pkg-config –cflags –libs gtk+-2.0`  pixbuf.c -o pixbuf
作者:SuPanYong@Gmail.com
主页:http://www.spy8888.com
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <gio/gio.h>
 
struct MemoryStruct {
  char *memory;
  size_t size;
};
 /*
 代码出处http://curl.haxx.se/libcurl/c/getinmemory.html
 */
static void *myrealloc(void *ptr, size_t size)
{
  if(ptr)
    return realloc(ptr, size);
  else
    return malloc(size);
}
 
static size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
  size_t realsize = size * nmemb;
  struct MemoryStruct *mem = (struct MemoryStruct *)data;
 
  mem->memory = myrealloc(mem->memory, mem->size + realsize + 1);
  if (mem->memory) {
    memcpy(&(mem->memory[mem->size]), ptr, realsize);
    mem->size += realsize;
    mem->memory[mem->size] = 0;
  }
  return realsize;
}
/*网络图片地址*/
gchar *url=
“http://spy8888.com/wp-content/uploads/2009/11/gun-1255533971-stone-arshavin.jpg”;

int main(int argc, char **argv)
{
  GtkWidget *window,*image;
  GdkPixbuf *pixbuf;
  GInputStream *input_stream;
  CURL *curl_handle;
  GError *gerror=NULL;
  struct MemoryStruct chunk;
  chunk.memory=NULL;
  chunk.size = 0;   
 
  curl_global_init(CURL_GLOBAL_ALL);
  gtk_init (&argc, &argv);
 
  curl_handle = curl_easy_init();
  curl_easy_setopt(curl_handle, CURLOPT_URL, url);
  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  /*访问并读取到内存*/
  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
  curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, “libcurl-agent/1.0″);
  curl_easy_perform(curl_handle);
  curl_easy_cleanup(curl_handle);
  curl_global_cleanup();
  /*从内存读取*/
  input_stream = g_memory_input_stream_new_from_data(chunk.memory, chunk.size, NULL);
  /*创建pixbuf来自stream*/
  pixbuf = gdk_pixbuf_new_from_stream(input_stream, NULL, &gerror);
  /*释放*/
  g_input_stream_close(input_stream, NULL, NULL);
  g_object_unref(input_stream);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), “Pixbuf Image”);
 
  g_signal_connect (G_OBJECT (window), “destroy”,
                    G_CALLBACK (gtk_main_quit), NULL);                  
  /*创建image来自pixbuf*/
  image = gtk_image_new_from_pixbuf(pixbuf);
 
  gtk_container_add (GTK_CONTAINER (window), image);
  gtk_widget_show_all (window);
  gtk_main ();

  return 0;
}

Comment » | 技术

[翻译]Linux命令行技巧3

November 16th, 2009 — 11:01am

3.将mkdir和cd合并为一条命令

一般你创建一个新的目录后,你想进入这个目录需要在执行cd
如下所示:

# mkdir -p /tmp/subdir1/subdir2/subdir3
# cd /tmp/subdir1/subdir2/subdir3
# pwd
/tmp/subdir1/subdir2/subdir3

通过下列配置将cd和mkdir合并为一条命令

$ vi .bash_profile
function mkdircd () { mkdir -p “$@” && eval cd
“\”\$$#\”"; }

测试一下合并后的命令

# mkdircd /tmp/subdir1/subdir2/subdir3
[注意: 此时创建目录并自动进入创建的目录]
# pwd

/tmp/subdir1/subdir2/subdir3

4.使用“cd-”在最后进入的两个目录中切换
如下所示

# cd /tmp/very/long/directory/structure/that/is/too/deep
# cd /tmp/subdir1/subdir2/subdir3
# cd -
# pwd
/tmp/very/long/directory/structure/that/is/too/deep
# cd -
# pwd
/tmp/subdir1/subdir2/subdir3
# cd -
# pwd
/tmp/very/long/directory/structure/that/is/too/deep

使用dirs,pushd和popd对目录进行栈操作
压入弹出目录栈主要是通过下列三个命令完成的
o dirs: 显示目录栈
o pushd: 压入目录栈
o popd: 弹出目录栈

dir输入当前目录栈中的内容,如果目录栈为空,则输入
当前目录的内容,如下所示:

# popd
-bash: popd: directory stack empty
# dirs
~
# pwd
/home/ramesh

如何运用pushd和popd呢?首先创建些零时目录,然后
将他们压入栈中,如下所示:

# mkdir /tmp/dir1
# mkdir /tmp/dir2
# mkdir /tmp/dir3
# mkdir /tmp/dir4
# cd /tmp/dir1
# pushd .
# cd /tmp/dir2
# pushd .
# cd /tmp/dir3
# pushd .
# cd /tmp/dir4
# pushd .
# dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1
[注意: 命令行中第一个输出的目录(/tmp/dir4)是当前文件夹
下的目录名,不是目录栈中的]

当前目录栈中的内容

/tmp/dir4
/tmp/dir3
/tmp/dir2
/tmp/dir1

最后压入栈中的总是显示在最上方,当你执行popd,将
首先弹出他,如下所示,最后压入的是/tmp/dir4,所以
当执行popd,将弹出/tmp/dir4

# popd
# pwd
/tmp/dir4
[注意: 若执行popd之后,栈中内容为:
/tmp/dir3
/tmp/dir2
/tmp/dir1]

# popd
# pwd
/tmp/dir3
[注意: 若执行popd之后,栈中内容为:
/tmp/dir2
/tmp/dir1]

# popd
# pwd
/tmp/dir2
[注意: 若执行popd之后,栈中内容为:
/tmp/dir1]

# popd
# pwd
/tmp/dir1
[注意: 若执行popd之后,栈中内容为空!]
# popd
-bash: popd: directory stack empty

原书下载 Free eBook: Linux 101 Hacks

Comment » | Linux101Hacks, 技术, 翻译

[ARMOURY SQUARE]我想买块石头

November 6th, 2009 — 10:16am

官网的活动,买块石头刻上你的名字或祝福铺在ARMOURY SQUARE。价钱也很不错从50欧到595欧不等。
秀点图,这是广场全景。

再来一张

再上一张球员的,A23,安菲尔德大四喜

偶今年是买不起了,明年先买块石头铺铺路,然后在买栋海布里的公寓,哈哈哈!

Comment » | 生活

[翻译]Linux命令行技巧2

November 5th, 2009 — 3:26pm

2.cd别名实现快速进入目录

当进入一个非常长的目录之后想要返回到上几层需要连续使用很多次的../

# mkdir -p
/tmp/very/long/directory/structure/that/is/too/deep
# cd /tmp/very/long/directory/structure/that/is/too/deep
# pwd
/tmp/very/long/directory/structure/that/is/too/deep
# cd ../../../../
# pwd
/tmp/very/long/directory/structure

介绍4种别名规则有效实现快速返回上几级目录

方法1:使用“..n”

如下面的例子 ..4 是返回上4级目录 ..3 是返回上3级以此类推

alias ..=”cd ..”
alias ..2=”cd ../..”
alias ..3=”cd ../../..”
alias ..4=”cd ../../../..”
alias ..5=”cd ../../../../..”
# cd
/tmp/very/long/directory/structure/that/is/too/deep
# ..4
[注意: 使用 ..4 返回上4级目录]
# pwd
/tmp/very/long/directory/structure/

方法2:使用“.”

“…..”5个句号代表返回上4级目录,这个规则很容易记忆的,因为你输入“..”是代表返回
上一级的目录,所以以此类推就可以了。

alias ..=”cd ..”
alias  …=”cd ../..”
alias  ….=”cd ../../..”
alias  …..=”cd ../../../..”
alias  ……=”cd ../../../../..”
# cd /tmp/very/long/directory/structure/that/is/too/deep
# …..
[注意: 使用 ..... (五个句号) 返回上4级目录]
# pwd
/tmp/very/long/directory/structure/

方法3:使用cd和.的组合形式

如下实例cd…..(5个句号)代表返回上4级目录,以此类推

alias  cd..=”cd ..”
alias  cd…=”cd ../..”
alias  cd….=”cd ../../..”
alias  cd…..=”cd ../../../..”
alias  cd……=”cd ../../../../..”
# cd /tmp/very/long/directory/structure/that/is/too/deep
# cd…..
[注意: 使用 cd..... 返回上4级目录]
# pwd
/tmp/very/long/directory/structure

方法4:使用cd和数字的组合形式

alias cd1=”cd ..”
alias cd2=”cd ../..”
alias cd3=”cd ../../..”
alias cd4=”cd ../../../..”
alias cd5=”cd ../../../../..”

原书下载 Free eBook: Linux 101 Hacks

Comment » | Linux101Hacks, 技术, 翻译

[翻译]Linux命令行技巧1

November 2nd, 2009 — 3:42pm

1. cd的使用
使用CDPATH定义cd命令的启示目录

[spy8888@spy8888 ~]# pwd
/home/spy8888
[spy8888@spy8888 ~]# cd mail
-bash: cd: mail: 没有该文件或目录
[注意: 此时查找当前目录下的mail文件夹]
[spy8888@spy8888 ~]# export CDPATH=/etc
[spy8888@spy8888 ~]# cd mail
/etc/mail
[注意: 此时查找的是/etc目录下的mail文件夹]
[spy8888@spy8888 /etc/mail]# pwd
/etc/mail

若要永久改变目录变量,只需添加export CDPATH=/etc到
~/.bash_profile(若不存在创建即可)
如要创建多个目录变量,用:分割即可

export CDPATH=.:~:/etc:/var

原书下载 Free eBook: Linux 101 Hacks

Comment » | Linux101Hacks, 技术, 翻译

Back to top