MacOS 利用WIFI共享网络

MAC OS : 10.7.5

应用情景: 华为3G网卡负责外网,利用本机的wifi为其他设备提供共享网络。

  • 打开系统 System Preferences界面,找到Sharingalt none
  • Sharing配置界面左侧选择Internet Sharing,只选中,不要打勾。在界面右侧的”Share your connection from”的下拉菜单中选择你需要共享的外网连接(我这里是HUAWEIMobile),然后在”To computers using:”下拉菜单中选择你用来发送共享网络的设备(我这里是Wi-Fi) alt none
  • 在左侧栏的”Internet Sharing”复选框中打勾,弹出下面的对话框后点击”Start” alt none
  • 完成后的状态 alt none

让人目瞪口呆的三位世界级电脑大师

公元1998年

在我读高二那年,那还是我用Windows 98的时候有次我系统崩溃了, 因为我那时还是个电脑白痴,我同学帮我介绍了一个电脑高手来帮我修电脑。

他看了一下电脑,问我有没有Windows 98 的光盘?我说没有。

他想了一下,叫我把家里电话拿给他,我心里想说修电脑要电话干什么? 但人家是电脑高手,我也不好意思说什么,就把电话拔下来给他了。

他把电话线空着的一头接在主机版的一个插孔内,然后进入了 DOS, 然后就开始在电话上不停的按着键,他按键的速度非常快,但是他都只按电话的0,1两个键。 我搞不懂这有什么用? 但也不敢问,看了半个多小时,他还是不停的按这两个键。

我渐渐的有些困,我问他这东西要搞多久? 他说还要几个小时,我给他倒了杯咖啡,就一个人去隔壁书房睡觉了。

醒来的时候,一看已经过了5个多小时,我起身到隔壁,看见他正在 Windows 98 里面调试。 过了一会儿,他说,你试试,我坐上椅子用了一下,真的好了。

我当时也不懂电脑,谢过人家就走了。

后来我慢慢对电脑有了一些概念才了解到, 原来当时那位电脑高手是使用机器语言编了一个Windows 98系统从我给他的电话直接输入到硬盘。

我后来问我同学那位高手的下落,我同学说前几年去了美国之后,杳无音讯….

公元2000年

在我读大一那年,那还是我用Windows Me的时候有次我系统崩溃了, 因为我那时还是个电脑入门,我朋友帮我介绍了一个电脑高手来帮我修电脑。

他看了一下电脑,问我有没有Windows Me 的安装盘?我说没有。 他想了一下,叫我把一张空的DVD刻录盘和一根奈米细针拿给他,

我心里想说修电脑要刻录盘和奈米细针干什么?但人家是电脑高手,我也不好意思说什么。 於是我就把DVD刻录盘拿一张来给他了。 他把奈米细针头对着刻录盘戳,他戳的速度非常快,但是只戳深或浅。

我搞不懂这有什么用?但也不敢问,看了半个多小时,他还是不停的戳着DVD刻录盘。

我渐渐的有些困,我问他这东西要搞多久?他说要几个小时,我给他倒了杯葡萄酒, 就一个人去隔壁客厅沙发上睡觉了。

醒来的时候,一看已经过了6个多小时,我起身到隔壁,看见他正在 Windows Me 里面调试, 还装上了 Office、Photoshop、迅雷、魔兽世界等软件……过了一会儿他说, 你试试,我坐上椅子用了一下,真的好了。

我当时也不懂电脑,谢过人家就走了。

后来我慢慢对电脑有了一些基础,终于明白了,原来当时那位电脑高手是用奈米细针头刻了一个单面双层的DVD , 在里面刻上了Windows Me、Office、 Photoshop、魔兽世界的安装程序。

我后来问我朋友那位高手的下落,我朋友说前几年去了法国之后,杳无音讯….

公元2001年

在我读大二那年,那还是我用Windows XP的时候有次我不小心把D盘格式化了, 因为我那时还是个电脑新手,我亲戚帮我介绍了一个电脑高手来帮我的电脑D盘恢复数据。

他看了一下电脑,问我有没有Windows XP备份过的Ghost? 我说没有。

他想了一下, 叫我把一块奈米强力磁铁棒拿给他,还问我D盘里有什么东西? 我心里想说修电脑要奈米强力磁铁棒干什么? 但人家是电脑高手,我也不好意思说什么,就把奈米强力磁铁棒给他了, 还告诉他我的D盘里面全是火影忍者的动画。

他把整颗硬盘拆了,用奈米强力磁铁棒在盘子上面画圈圈,他画圈圈的速度非常快, 但是他的奈米强力磁铁棒好像有碰到又好像没有碰到,我搞不懂这有什么用?但也不敢问。

看了半个多小时,他还是不停的在硬盘上画着圈,我渐渐的有些困, 我问他这东西要搞多久?他说要几个小时,我给他倒了杯蘇格蘭威士忌, 就一个人去隔壁房间睡觉了。

醒来的时候,一看已经过了7个多小时,我起身到隔壁,看见他正在D盘里面调试, 里面全是火影忍者的动画片,过了一会儿,他说, 你试试,我坐上椅子用了一下,真的好了。

我当时也不懂电脑,谢过人家就走了。

后来我慢慢对电脑有了一些体会,终于体悟到,原来当时那位电脑高手是用奈米强力磁铁棒直接在硬盘上写数据,他凭着惊人的记忆力将他曾经看过的火影忍者动画片数据都写入了硬盘。

我后来问我亲戚那位电脑高手的下落,我亲戚说他前几年去了英国之后,杳无音讯….

在QT pro文件中使用 PKGCONFIG

QT : 5.0.2

QT Create : 2.7

如果要在qt项目的pro文件中使用PKGCONFIG参数,必须要先配置CONFIG += link_pkgconfig。例如:

CONFIG += link_pkgconfig

PKGCONFIG += gtk+-2.0 \
             glib-2.0 \
             ImageMagick \
             MagickWand

使用Android接口描述语言(AIDL)

AIDL简介

Andorid提供了一种轻量级的进程间通信机制:接口描述语言(Android Interface Definition Language),简称AIDL。进程间使用AIDL通信跟使用Intent通信的最大区别在于:前者是同步通信,而后者是异步通信。AIDL的语法与JAVA中的Interface十分相似,对数据类型的支持方面有一些差别,目前AIDL支持的数据类型有:

  • Java中的基本数据类型
  • String
  • List
  • CharSequence
  • Map
  • 其他AIDL生成的接口
  • 实现了Parcelable接口并通过值传递的自定义类型

使用AIDL的步骤

  1. 创建.aidl文件,在文件中声明远程服务的接口
  2. 在.java文件中实现.aidl中声明的方法
  3. 在AndroidMainifest中注册上面创建的服务
  4. 客户端请求绑定服务成功后就可以调用.aidl中声明的方法了

示例解析

项目目录结构: alt none

  1. 在项目src文件夹下创建IAddService.aidl文件,在aidl声明了一个addOne方法,这个方法简单的把传入的值加上一。

    IAddService.aidl:

    package net.lnmcc.aidltest.aidl;
       
    interface IAddOneService {
    	int addOne(int value);
    }
    

    保存.aidl文件后,Eclipse将会自动在gen/文件夹下生成一个IAddService.java文件,在后面实现远程服务的时候会使用到其中的抽象类Stub。

  2. 创建AddService,AddService是一个bound服务,需要实现onBind()方法,它将返回一个IAddService.Stub实例。IBinder简单的理解成进程间通信的通道,可以通过这个通道来实现数据传输。

    AddService.java:

    public class AddService extends Service {
       
    	IAddService.Stub mBinder;
       
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		mBinder = new IAddService.Stub() {
       
                           //简单的把参数加 1
    			@Override
    	       		public addOne(int value) throws RemoteException {
    				return value + 1;
    			}
    		};
    	}
       
            //当客户端请求绑定服务成功后,会调用这个方法,并把mBinder返回, 
            //mBinder引用了一个IAddService.Stub实例,从而使得客户端可以   
            //成功调用IAddService.Stub中的方法,于是mBinder成了一个通信通道
            @Override
    	public IBinder onBind(Intent arg0) {
    		return mBinder;
    	}
       
    	@Override
    	public void onDestroy() {
    		super.onDestroy();
    	}
    }
    

    接下来需要在AndroidManifest.xml中声明service:

    <service android:name="net.lnmcc.aidltest.AddService" android:process="net.lnmcc.aidltest.AddService" />
    
    需要说明的是android:process指示把这个service当做一个独立的进程来执行,进程名字即”net.lnmcc.aidltest.AddService”。之所以这么做是因为我们是在一个app中演示进程间通信。当运行本例子的时候,使用ps grep aidl命令可以看到有2个进程。但在一般情况下,service和client分属于2个app,自然属于两个不同进程,并不需要声明android:process 。
  3. 创建client端,连接IAddService,连接成功后就可以像调用本地方法一样调用远程方法(这里称AIDL中声明的方法为远程方法)。

    public class AddClient extends Activity {
       
    	IAddService service;
       
            //myServiceConnection用来管理服务连接,      
            //服务连接成功后会调用onServiceConnected方法,
            //断开连接时会调用onServiceDisconnected方法  
       
    	myServiceConnection connection;
       
    	class myServiceConnection implements ServiceConnection {
       
                    //服务连接成功时调用,                          
                    //IAddService.Stub.asInterface()是一个辅助方法,
                    //可以把IBinder类型的变量转换成IAddService类型   
                    @Override
    		public void onServiceConnected(ComponentName name, IBinder boundservice) {
       
    			service = IAddService.Stub.asInterface(boundservice);
    			Toast.makeText(AddClient.this, "Service connected", Toast.LENGTH_SHORT).show();
    		}
       
    		@Override
    		public void onServiceDisconnected(ComponentName name) {
    			service = null;
    			Toast.makeText(AddClient.this, "Service disconnected", Toast.LENGTH_SHORT).show();
    		}
    	}
       
    	private  void initService() {
    		connection = new myServiceConnection();
       
                    //创建一个action intent, 用来连接到远程服务。       
                    //服务名字必须跟前面在AndroidManifest.xml中注册的一样
       
    		Intent i = new Intent();
    		i.setClassName("net.lnmcc.aidltest", net.lnmcc.aidltest.AddService.class.getName());
       
                    //请求绑定到Intent指定的远程服务                   
                    //第二个参数是用来具体处理连接的ServiceConnection对象
                    //BIND_AUTO_CREATE标志表示如果服务不存在,则自动启动 
       
    		if(!bindService(i, connection, Context.BIND_AUTO_CREATE)) {
    			Toast.makeText(AddClient.this, "Bind Service Failed", Toast.LENGTH_SHORT).show();
    		}
    	}
       
    	private void releaseService() {
    		unbindService(connection);
    		connection = null;
    	}
       
    	private TextView result; 
    	private EditText value;
            private Button btnAdd; 
       
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
       
                    //这是app的主activity,布局中包括了一个用于输入值的EditText
                    //一个显示结果的TextView和一个提交按钮                   
       
    	        setContentView(R.layout.activity_main);		
       
                    result = (TextView)findViewById(R.id.result);
    	        value = (EditText)findViewById(R.id.value);
                    initService();
       
    		btnAdd = (Button)findViewById(R.id.addone);
    		btnAdd.setOnClickListener(new View.OnClickListener() {
       
    			@Override
    			public void onClick(View v) {
    				int v1, res = 0;
    				try{
    					v1 = Integer.parseInt(value.getText().toString());
    					res = service.addOne(v1);
    				}catch(RemoteException e) {
    					e.printStackTrace();
    				}
    				result.setText(Integer.valueOf(res).toString());
    			}
    		});
    	}
       
    	@Override
    	protected void onDestroy() {
    		releaseService();
    		super.onDestroy();
    	}
    }
    
    1. AndroidManifest.xml:

        <application
              android:allowBackup="true"
              android:icon="@drawable/ic_launcher"
              android:label="@string/app_name"
              android:theme="@style/AppTheme" >
              <activity
                  android:name="net.lnmcc.aidltest.AddClient"
                  android:label="@string/app_name" >
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
            
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
            
              <service android:name="net.lnmcc.aidltest.AddService" android:process="net.lnmcc.aidltest.AddService" />
          </application>
      

      5.activity_main.xml:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical"
          android:text="Android AIDL"
          android:textSize="22dp" >
            
          <LinearLayout
              android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content">
            
              <EditText 
                  android:id="@+id/value"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"/>
            
              <Button 
                  android:id="@+id/addone" 
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="+1" />
          </LinearLayout>
            
          <TextView
              android:id="@+id/result"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="result" />
            
      </LinearLayout>
      

git clone https://github.com/lnmcc/AIDLTest.git

sqlite的基本用法

介绍

SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。

数据库操作

查询已有数据库

$ sqlite > .databases 

创建数据库

$ sqlite test.db

如果数据库已经存在了,则打开数据库。

创建表

sqlite> create table mytable(id integer primary key, value text);

sqlite>为sqlite的命令行提示符

查看数据库中存在的表

$ sqlite .tables

往表中插入数据

sqlite> insert into mytable(id, value) values(1, 'Micheal');
sqlite> insert into mytable(id, value) values(2, 'Jenny');
sqlite> insert into mytable(value) values('Francis');
sqlite> insert into mytable(value) values('Kerk');

查询数据

sqlite> select * from test;

输出:

1|Micheal
2|Jenny
3|Francis
4|Kerk

设置格式化查询结果

sqlite> .mode column
sqlite> .header on
sqlite> select * from test;

输出:

id          value
----------- -------------
1           Micheal
2           Jenny
3           Francis
4           Kerk

修改表结构

增加列

sqlite> alter table mytable add column email text not null default '' collate nocase;

default : 设置默认值 collate nocase : 设置排序规则,nocase即大小写无关

创建视图

sqlite> create view nameview as select * from mytable;

创建索引

sqlite> create index test_idx on mytable(value);

常用的sqlite命令

查看帮助信息

sqlite> .help 

退出sqlite

sqlite> .quit 

显示表结构

sqlite> .schema [table]

获取所有表和视图

sqlite > .tables

获取指定表的索引列表

sqlite > .indices [table ]

导出数据库到 SQL 文件

sqlite > .output [filename ] 
sqlite > .dump 
sqlite > .output stdout

从 SQL 文件导入数据库

sqlite > .read [filename ]

格式化输出数据到 CSV 格式

sqlite >.output [filename.csv ] 
sqlite >.separator , 
sqlite > select * from test; 
sqlite >.output stdout

从 CSV 文件导入数据到表中

sqlite >create table newtable ( id integer primary key, value text ); 
sqlite >.import [filename.csv ] newtable

备份数据库

/* usage: sqlite [database] .dump > [filename] */
sqlite mytable.db .dump > backup.sql

恢复数据库

/* usage: sqlite [database ] < [filename ] */ 
sqlite mytable.db < backup.sql

ref : http://www.oschina.net/question/12_53183