About neohope

一直在努力,还没想过要放弃...

Mac上安装Wine

Wine可以模拟Windows中的dll调用,从而使Windows程序可以运行在非BSD/UNIX/Linux平台上

1.安装XCode

2.安装MacPorts

3.配置MacPorts
依次执行下面的命令,需要admin授权
配置MacPorts路径

echo export PATH=/opt/local/bin:/opt/local/sbin:\$PATH$'\n'export MANPATH=/opt/local/man:\$MANPATH | sudo tee -a /etc/profile

配置cpu位数

if [ `sysctl -n hw.cpu64bit_capable` -eq 1 ] ; then echo "+universal" | sudo tee -a /opt/local/etc/macports/variants.conf; else echo "not 64bit capable"; fi

4.下载并编译wine

sudo port install wine

5.wine中安装软件

wine $INSTALLER.exe

或者是拷贝exe文件到wine下,但你要自己保证dll文件都在哟
wine的默认目录为

cd ~/.wine/drive_c

6.运行wine中软件

cd ~/.wine/drive_c/Program\ Files/
wine $PROGRAM.exe

7.增加桌面图标
在附件中找到AppleScript编辑器,把下面的东西粘进去

tell application "Terminal"
    do script "/opt/local/bin/wine ~/.wine/drive_c/Program\\ Files/$PATH_TO_PROGRAM.exe"
end tell

编译并运行试一下,如果可以的话,另存为Application
将其拖拽到Dock上就可以啦:)

8.更新Wine

sudo port selfupdate && sudo port upgrade outdated

9.卸载Wine

sudo port uninstall wine
sudo rm -rf /opt ~/.wine /Applications/MacPorts

如果我写的不够仔细,请参考下面的文章:
Installing Wine on Mac OS X

CMD常用命令07Bat截取字符串

%var:~n,k%
把这条命令理解为两条子命令
n为开始截取字符的位置,从左向右位置为(0,1,2,3 ...),从右向左位置为(-1,-2,-3,-4)
k为对n右侧字符截取到的位置,k>0从n向右截取的位置,k<0从字符串尾向前截取的位置
n默认从字符串最左边开始,k默认为截断到字符串尾
@echo off
rem echo %var:~n,k%
set str=0123456789

echo 字符串为:%str%
echo 第一个字符为:%str:~0,1%
echo 第二个字符为:%str:~1,1%
echo 倒数第一个字符为:%str:~-1,1%
echo 倒数第二个字符为:%str:~-2,1%
echo 截取前三个字符:%str:~0,3%
echo 截取后三个字符:%str:~-3,3%
echo 第三个字符及其之后的字符为:%str:~2%
echo 倒数第三个字符及其之后的字符为:%str:~-3%
echo 截取到倒数第三个字符:%str:~0,-3%
echo 截取倒数第五和第四个字符:%str:~-5,2%

pause

函数调用约定

1.STDCALL
微软制定的c语言调用约定,也就是传说中的WINAPI
参数从右向左进行压栈(微软官方文档说从左向右压栈),返回值存在eax中,
被调用函数清理栈,不允许变长参数列表
函数名前增加_,函数名后增加@和参数个数(32位机器上一定被4整除)
ret指令中,有可选参数指定有多少字节需要弹栈

2.CDECL
c语言的默认调用约定
参数从右向左进行压栈,返回值存在eax中,
调用函数清理栈,可用变长参数列表
函数名前会增加_

3.FASTCALL
非跨编译器的c语言调用约定,
前2-3个4字节内的参数被存放到寄存器(edx,eax,ecx)中,其他参数,或大于4字节的参数,按从右到左的顺序被存放在栈中
多数情况下,调用函数负责清理栈
仅适用于参数少,而且实时性要求很高的情况下
函数名前增加@,函数名后增加@和参数个数

4.THISCALL
cpp的调用约定
参数从右向左进行压栈,返回值存在eax中,this指针存在ecx中
每种编译器对函数名称有不同的修饰方法,但基于重载的需要,一般都会增加参数类型和类名
当使用extern “C”的时候,cpp编译器会使用c语言的修饰方法来修饰函数名,这样就可以方便的供别人调用了。

MinGW中Socket基础

1.客户端简单例子
myc.c

#define MINGW32

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

#ifdef MINGW32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#endif

#define MAXLINE 1024

int main(int argc,char **argv) 
{
  int  sockfd,n;
  char  receline[MAXLINE+1];
  struct  sockaddr_in serveraddr;

  //输入参数太少,退出
  if(argc != 2) 
  { 
    printf("Usage :%s  IP_address\n", argv[0]);
    exit(0);
  }

  #ifdef MINGW32
  //Winsows下启用socket
  WSADATA wsadata;
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail\n");
    exit(0);
  }
  #endif
  
  //建立socket
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  {
    printf("socket() fail\n");
    exit(0);
  }

  //设置协议及Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family = AF_INET;
  serveraddr.sin_port=htons(1024);

  //设置IP
  serveraddr.sin_addr.s_addr=inet_addr(argv[1]);

  //连接
  if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr))==-1)
  {
    printf("connect() fail\n");
    exit(0);
  }

  //读取数据并输入到标准输出
  #ifdef MINGW32
  while((n=recv(sockfd,receline,MAXLINE,0))>0)
  #else
  while((n=read(sockfd,receline,MAXLINE))>0)
  #endif
  { 
    receline[n]=0;
    if(fputs(receline,stdout)==EOF)
    {
      printf("fputs() error\r\n");
    }
  }

  //没有获取数据
  if(n<0) 
  {
    printf("read() fail\n");
  }

  #ifdef MINGW32
  //Winsows下关闭socket
  closesocket(sockfd);
  WSACleanup();
  #endif

  exit(0);
}
&#91;/code&#93;

2.服务端简单例子
mys.c
&#91;code lang="c"&#93;
#define MINGW32

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

#ifdef MINGW32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#endif

#define LISTENQ 10

int main(int argc,char *argv[])
{
  int  serverfd,connectfd;
  struct  sockaddr_in serveraddr;
  char  buff[1024];
  time_t  tlick;
  int  iRet;

  #ifdef MINGW32
  //Winsows下启用socket
  WSADATA wsadata;
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail\n");
    exit(0);
  }
  #endif

  //新建socket
  printf("socket()\n");
  serverfd=socket(AF_INET,SOCK_STREAM,0);
  if(serverfd==-1)
  {
    printf("socket() fail\n");
    exit(0);
  }

  //清零
  memset(&serveraddr,0,sizeof(serveraddr));

  //设置协议
  serveraddr.sin_family=AF_INET;
  //设置IP
  serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
  //设置Port
  serveraddr.sin_port=htons(1024);

  //绑定端口,监听1024端口的任何请求
  printf("bind()\n");
  iRet=bind(serverfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
  if(iRet==-1)
  {
    printf("bind() fail\n");
    exit(0);
  }

  //监听端口,最大并发数10
  printf("listen()\n");
  iRet=listen(serverfd,LISTENQ);
  if(iRet==-1)
  {
    printf("listen() fail\n");
    exit(0);
  }

  //接受请求,发送主机时间
  for(;;)
  {
    printf("Waiting for connection...\n");
    //接受请求
    connectfd=accept(serverfd,(struct sockaddr*)NULL,NULL);
    //获取时间    
    tlick=time(NULL);
    //格式化时间    
    snprintf(buff,sizeof(buff),"From mys:\n%s",ctime(&tlick));
    //写入时间
    //关闭请求
    #ifdef MINGW32
    send(connectfd,buff,strlen(buff),0);
    closesocket(connectfd);
    #else
    write(connectfd,buff,strlen(buff));
    close(connectfd);
    #endif
  }

  #ifdef MINGW32
  //Winsows下关闭socket
  closesocket(serverfd);
  WSACleanup();
  #endif

  //退出
  exit(0);
}

3.Makefile

all:mys myc

mys:mys.c
	gcc -g -o mys mys.c -l wsock32

myc:myc.c
	gcc -g -o myc myc.c -l wsock32

clean:
	del *~ *.o *.exe

VC中Socket通信基础

1.客户端程序
SocketClientBlock.c

#pragma comment(lib, "WS2_32")

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

#define BUF_SIZE (1024)

int main(int argc,char **argv) 
{
  WSADATA wsadata;

  int  sockfd,n;
  char  receline[BUF_SIZE];
  struct  sockaddr_in serveraddr;

  //Winsows下启用socket
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail\n");
    exit(0);
  }

  //建立socket
  if((sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
  {
    printf("socket() fail\n");
    exit(0);
  }

  //设置协议,IP及Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family = AF_INET;
  serveraddr.sin_port=htons(1024);
  serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
  /*
  //hostname转ip
  hostent *hostEnt = gethostbyname( strRemote );
  if( hostEnt != NULL )
  {
    lIPAddress = ((in_addr*)hostEnt->h_addr)->s_addr;
    serveraddr.sin_addr.s_addr = lIPAddress;
  }
  else
  {
    serveraddr.sin_addr.s_addr = inet_addr( strRemote );
  }
  */

  //连接
  if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr))==SOCKET_ERROR)
  {
    printf("connect() fail\n");
    exit(0);
  }

  //读取数据并输入到标准输出
  while((n=recv(sockfd,receline,BUF_SIZE,0))!=SOCKET_ERROR)
  { 
    receline[n]=0;
    if(fputs(receline,stdout)==EOF)
    {
      printf("fputs() error\r\n");
    }
  }

  //没有获取数据
  if(n<0) 
  {
    printf("read() fail\n");
  }

  //Winsows下关闭socket
  closesocket(sockfd);
  WSACleanup();

  exit(0);
}
&#91;/code&#93;

2.服务端程序,阻塞
SocketServerBlock.c
&#91;code lang="c"&#93;
#pragma comment(lib, "WS2_32")

#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_CONNECT_NUM (10)

int main(int argc,char** argv)
{
  WSADATA wsadata;
  struct  sockaddr_in serveraddr;
  int  socketflag,connectflag;

  time_t  time_tick;
  char  buff[1024];
  
  //Winsows下启用网络
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail,%d\n", WSAGetLastError());
    exit(0);
  }
  
  //新建socket
  if(INVALID_SOCKET==(socketflag=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
  {
    printf("socket() fail\n");
    exit(0);
  }

  //清零,设置协议,设置IP,设置Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family=AF_INET;
  serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
  serveraddr.sin_port=htons(1024);

  //绑定端口,监听1024端口的任何请求
  if(SOCKET_ERROR==bind(socketflag,(struct sockaddr*)&serveraddr,sizeof(serveraddr)))
  {
    printf("bind() fail\n");
    exit(0);
  }

  //监听端口,最大并发数MAX_CONNECT_NUM
  if(SOCKET_ERROR==listen(socketflag,MAX_CONNECT_NUM))
  {
    printf("listen() fail\n");
    exit(0);
  }

  //接受请求,发送主机时间
  for(;;)
  {
    struct  sockaddr clientaddr;
    int iLen = sizeof(clientaddr);
    printf("Waiting for connection...\n");

    //接受连接
    connectflag=accept(socketflag,&clientaddr,&iLen);
    if(INVALID_SOCKET==connectflag)
    {
      printf("accept() fail\n");
      exit(0);
    }

    //获取时间,并格式化
    time_tick=time(NULL);
    sprintf(buff,"From mys:\n%s",ctime(&time_tick));
    //写入时间
    if(SOCKET_ERROR==send(connectflag,buff,strlen(buff),0))
    {
      printf("send() fail\n");
      exit(0);
    }

    //关闭连接
    closesocket(connectflag);
  }

  //Winsows下关闭socket及网络
  if(SOCKET_ERROR==closesocket(socketflag))
  {
    printf("closesocket() fail\n");
    exit(0);
  }
  WSACleanup();

  //退出
  exit(0);
}

3.服务端程序,阻塞,有Select
SocketServerBlockSelect.c

#pragma comment(lib, "WS2_32")

#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_CONNECT_NUM (10)

int main(int argc,char** argv)
{
  WSADATA wsadata;
  struct  sockaddr_in serveraddr;
  int  socketflag,connectflag;

  fd_set  fdR;
  struct  timeval timeout ={1,500};

  time_t  time_tick;
  char  buff[1024];
  
  //Winsows下启用网络
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail,%d\n", WSAGetLastError());
    exit(0);
  }
  
  //新建socket
  if(INVALID_SOCKET==(socketflag=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
  {
    printf("socket() fail\n");
    exit(0);
  }

  //清零,设置协议,设置IP,设置Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family=AF_INET;
  serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
  serveraddr.sin_port=htons(1024);

  //绑定端口,监听1024端口的任何请求
  if(SOCKET_ERROR==bind(socketflag,(struct sockaddr*)&serveraddr,sizeof(serveraddr)))
  {
    printf("bind() fail\n");
    exit(0);
  }

  //监听端口,最大并发数MAX_CONNECT_NUM
  if(SOCKET_ERROR==listen(socketflag,MAX_CONNECT_NUM))
  {
    printf("listen() fail\n");
    exit(0);
  }

  //接受请求,发送主机时间
  for(;;)
  {
    printf("Waiting for connection...\n");

    FD_ZERO(&fdR);
    FD_SET(socketflag, &fdR);
        switch (select(0, &fdR, NULL, NULL,&timeout)) 
    {
    case SOCKET_ERROR:
      printf("Socket Error...\n");
      break;
    case 0:
      printf("Time Out Here...\n");
      break;
    default:
      printf("Connection is coming...\n");
      if (1)
      {
        struct  sockaddr clientaddr;
        int iLen = sizeof(clientaddr);

        //接受连接
        connectflag=accept(socketflag,&clientaddr,&iLen);
        if(INVALID_SOCKET==connectflag)
        {
          printf("accept() fail\n");
          exit(0);
        }

        //获取时间,并格式化
        time_tick=time(NULL);
        sprintf(buff,"From mys:\n%s",ctime(&time_tick));
        //写入时间
        if(SOCKET_ERROR==send(connectflag,buff,strlen(buff),0))
        {
          printf("send() fail\n");
          exit(0);
        }

        //关闭连接
        closesocket(connectflag);
      }
      break;
        }
  }

  //Winsows下关闭socket及网络
  if(SOCKET_ERROR==closesocket(socketflag))
  {
    printf("closesocket() fail\n");
    exit(0);
  }
  WSACleanup();

  //退出
  exit(0);
}

4.服务端程序,非阻塞
SocketServerNonBlock.c

#pragma comment(lib, "WS2_32")

#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_CONNECT_NUM (10)

int main(int argc,char** argv)
{
  WSADATA wsadata;
  struct  sockaddr_in serveraddr;
  int  socketflag,connectflag;

  time_t  time_tick;
  char  buff[1024];

  unsigned long flag=1;
  
  //Winsows下启用网络
  if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
  {
    printf("WSAStartup() fail,%d\n", WSAGetLastError());
    exit(0);
  }
  
  //新建socket
  if(INVALID_SOCKET==(socketflag=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
  {
    printf("socket() fail\n");
    exit(0);
  }

  //非阻塞方式
  if(ioctlsocket(socketflag,FIONBIO,&flag)!=0)
  {
    printf("ioctlsocket() fail\n");
    exit(0);
  }

  //清零,设置协议,设置IP,设置Port
  memset(&serveraddr,0,sizeof(serveraddr));
  serveraddr.sin_family=AF_INET;
  serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
  serveraddr.sin_port=htons(1024);

  //绑定端口,监听1024端口的任何请求
  if(SOCKET_ERROR==bind(socketflag,(struct sockaddr*)&serveraddr,sizeof(serveraddr)))
  {
    printf("bind() fail\n");
    exit(0);
  }

  //监听端口,最大并发数MAX_CONNECT_NUM
  if(SOCKET_ERROR==listen(socketflag,MAX_CONNECT_NUM))
  {
    printf("listen() fail\n");
    exit(0);
  }

  //接受请求,发送主机时间
  for(;;)
  {
    struct  sockaddr clientaddr;
    int iLen = sizeof(clientaddr);
    printf("Waiting for connection...\n");

    //接受连接
    connectflag=accept(socketflag,&clientaddr,&iLen);
    if(INVALID_SOCKET==connectflag)
    {
      printf("no connection\n");
      Sleep(1500);
    }
    else
    {
      printf("Connection is coming...\n");
      //获取时间,并格式化
      time_tick=time(NULL);
      sprintf(buff,"From mys:\n%s",ctime(&time_tick));
      //写入时间
      if(SOCKET_ERROR==send(connectflag,buff,strlen(buff),0))
      {
        printf("send() fail\n");
        exit(0);
      }

      //关闭连接
      closesocket(connectflag);
    }
  }

  //Winsows下关闭socket及网络
  if(SOCKET_ERROR==closesocket(socketflag))
  {
    printf("closesocket() fail\n");
    exit(0);
  }
  WSACleanup();

  //退出
  exit(0);
}

XCode切换ARC状态

project -> build setting -> Apple LLVM Complier 3.0 – Language -> Objective-C Auto Reference Counting ->
NO 关闭
YES 打开

ARC在编译阶段会产生代码来处理对象引用数,所以启用ARC的话,很多retian和release都不需要了
注意,现在xcode默认启用ARC,关闭的话,要自己补上释放对象的代码哟

在Xcode中部分禁用ARC

大家都清楚ARC(Automatic Reference Counting)是Xcode中很有用的新特色,
ARC会自动检查对象计数,从而在引用数为0时释放对象,让大家的工作轻松了很多
ARC工作在编译阶段,而不是运行阶段

ARC让代码中很多的retain和release变成了不再必要,简化了程序书写
但很多第三方库中,会自行控制对象的释放,经常会有
@property (nonatomic, readwrite, assign) __weak

在ARC工程中引用非ARC的库,会出现下面的编译错误
property attributes ‘assign’ and ‘weak’ are mutually exclusive

这时,只需要修改引用到非ARC库的源码编译参数就可以了
target -> Build Phases -> Compile Sources -> 相应.m文件
增加编译参数 -fno-objc-arc 就好啦

为了简化工作,把interface中使用到第三方库的部分放到.m文件中,或直接用反射,会简化整个过程

另外,如果你发下使用非ARC库时,出现对象不能retain的状况,试试在link时,加上参数

-all_load
-ObjC

c与cpp输出16进制,8进制及ASCII

1.c

#include <stdio.h>
int main(int argc,char **argv)
{
	for(int i=0;i<=127;i++)
	{
		printf("%X-%03o-%c\n",i,i,i);
	}
	return 0;
}

2.cpp

#include <iostream>
#include <iomanip>

using namespace std;

int main(int argc,char **argv)
{
	for(int i=0;i<=127;i++)
	{
		cout<<setw(2)<<setfill('0')<<hex<<i<<"-"<<setw(3)<<setfill('0')<<oct<<i<<"-"<<dec<<(char)i<<endl;
	}

	return 0;
}

obj还是objs?

运行下面代码,得到的结果是什么?
obj还是objs?

public class Test{
       public static void test(Object obj){
              System.out.println("obj");
       }
       public static void test(Object[] objs){
              System.out.println("objs");
       }
       public static void main(String[] args){
              test(null);
       }
}

是objs哦:)

JDK命令行

JDKVars.bat

@echo off

set JAVA_HOME=D:\Java\jdk1.6.0_22
set MVN_HOME=D:\Java\apache-maven-3.0.3
set ANT_HOME=D:\Java\apache-ant-1.8.1
set PATH=%JAVA_HOME%\bin;%MVN_HOME%\bin;%ANT_HOME%\bin;%PATH%
set CLASSPATH=.;%JAVA_HOME%\lib\tools.jar

color 02
title Java_1.6_u22
echo Java_Enviroment_OK!

echo on

cmd快捷启动方式

%ComSpec% /K D:\Java\jdk1.6.0_22\bin\JDKVars.bat