2011年8月23日 星期二

Lolita Fashion條目

日本的wiki有針對Lolita條目做詳細的解說,也順便介紹了一下目前的日本地區的品牌。很值得參考。

我還是最喜歡白,粉紅為基調lolita!

ロリータ・ファッション

ゴスロリブランド一覧

2011年8月22日 星期一

海賊木樽ジョッキ

小賴傳給我的。喝酒用的杯子,但不接受海外訂購。有實體店,去東京可以順便去晃晃。

 http://urakita.ocnk.net/

2011年8月21日 星期日

Linux local socket範例

這是我在做測試時寫的一個關於local socket的範例。

由main產生child與parent這兩個process,然後parent作為server,child為client。由child向server發送資料,並由server印出在console上。

#include <stdarg.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/un.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <errno.h>

#define SERVER "/home/mark/test/test_socket"

/* Open socket from local socket */
int openMsgSocket(){
int fd;
struct sockaddr_un name;
int fd_flags;

fd = socket(PF_LOCAL, SOCK_STREAM, 0);

//Set socket to non-block mode
fd_flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, fd_flags | O_NONBLOCK);

name.sun_family = AF_LOCAL;
strcpy(name.sun_path, SERVER);
bind(fd, &name, SUN_LEN(&name));
listen(fd, 5);

return fd;
}

/* Send message to local socket */
void sendMsg(char *msg_string){
int socket_fd;
struct sockaddr_un name;

socket_fd = socket(PF_LOCAL, SOCK_STREAM, 0);
name.sun_family = AF_LOCAL;
strcpy(name.sun_path, SERVER);

connect(socket_fd, &name, SUN_LEN(&name));


int i = write(socket_fd, msg_string, strlen(msg_string)+1);
if(i < 0){
printf("write error\n");
}

close(socket_fd);
}

/* Format string and call send message */
int debug(const char * __restrict format, ...){
char buf[512];
va_list arg;
int rv;

va_start(arg, format);
rv = vsprintf(buf, format, arg);
va_end(arg);

sendMsg(buf);

return rv;
}


int main (void){
unlink(SERVER);
pid_t chpid;

if ( (chpid = fork()) == (pid_t) -1 ) {
fprintf(stderr, "%s: fork(2)\n", strerror(errno));

exit(1);

} else if ( chpid == 0 ){
/* child */
printf("child start...\n");

sleep(5);

printf("child send msg 55555\n");
debug("55555");
printf("child send msg 666\n");
debug("666");
}else{
/* parent */
printf("parent start...\n");
int fd = openMsgSocket();
//int fd=5;

printf("parent open socket\n");

while(1){

int client_socket_fd;
struct sockaddr_un client_name;
int client_name_len;
int i;
char msg[512];

client_socket_fd = accept(fd, &client_name, &client_name_len);

if(client_socket_fd != -1){

if(i = read(client_socket_fd, &msg, sizeof(msg)) > 0){
printf("parent get msg %s\n", msg);
}
close(client_socket_fd);
}

}
}
return 0;
}

要注意的是,server端因為沒有使用select機制,會導致CPU利用率100%。如果真得要使用,請加上select機制。


參考資料:
[1] GNU C

2011年8月7日 星期日

Alice: Madness Returns

動作類型。

這遊戲最可取的地方就是美術風格,還有 Alice會一直換可愛的衣服,我承認我是被這樣的風格吸引而去玩的。

而最失敗的地方是遊戲性,一直重複的關卡,還有從頭到尾的跳跳樂,老實說我還挺失望的。要收藏的許多支線要素,讓我浪費了不少時間順道去拿,最後也是沒有收集完就是了。

此外,遊戲的英文用詞好難,且對話之間大多不連續,我其實都不知道在演什麼!

如果關卡冗餘設計能再刪減許多,才會比較好玩吧~。

alice-madness-returns-cover-art

2011年8月4日 星期四

C#簡單的對稱加解密

這是參考自Jeff隨手記。我將他稍作修改可以讓Key與initial vector可以直接吃字串。解密失敗時會產生exception,可以作為檢測該密碼是否合法。

        public string EncodeString(string EnString){
byte[] Key = Encoding.UTF8.GetBytes("xxxxxxxx");
byte[] IV = Encoding.UTF8.GetBytes("yyyyyyyy");
byte[] b = Encoding.UTF8.GetBytes(EnString);   DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform ict = des.CreateEncryptor(Key, IV);
byte[] outData = ict.TransformFinalBlock(b, 0, b.Length);
return Convert.ToBase64String(outData);
}
        public string DecodeString(string DeString){   byte[] Key = Encoding.UTF8.GetBytes("xxxxxxxx");
byte[] IV = Encoding.UTF8.GetBytes("yyyyyyyy");
byte[] b = Convert.FromBase64String(DeString);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform ict = des.CreateDecryptor(Key, IV);
byte[] outData = ict.TransformFinalBlock(b, 0, b.Length);
return Encoding.UTF8.GetString(outData);
}

資料來源:
[1] 對稱式加解密 C#