1 2 3 > 下一頁 | 最後一頁 1/3
目前分類: 程式技術    檢視方式: 列表 摘要
Perl 小技巧整理
ddy1280 在天空部落發表於00:54:45 | 程式技術 氣象
用perl 讀取Excel (xls)檔案的方法

use strict;
use Win32::OLE;


my $Excel = Win32::OLE->new('Excel.Application','Quit');
my $xlsfn = Win32::GetFullPathName("LANG_CHINESE.xls");
my $Book = $Excel->Workbooks->Open($xlsfn) or die "please assign file.";
my $working_sheet_1 = 1;
my $Sheet = $Book->Worksheets($working_sheet_1);


foreach my $row (2..3000)
{
    next unless defined $Sheet->Cells($row,1)->{'Value'};

    my $string_id = $Sheet->Cells($row,1)->{'Text'};
    my $eng_str = $Sheet->Cells($row,2)->{'Text'};
    my $cht_str = $Sheet->Cells($row,3)->{'Text'};
    
    #display to screen
    printf "%s  %s  %s\n",$string_id,$eng_str,$cht_str;
}

$Excel->Quit;
$Book = 0;
$Excel = 0;

在windows下產生 unix 格式的檔案,並且存成utf8 格式

觀看全文...
Perl 小技巧(整理)
ddy1280 在天空部落發表於09:50:53 | 程式技術 氣象
Perl 真的是很需要"理解"的語言,同一個功能可能會有數十種做法
這也是看別人寫的Perl 程式最痛苦的地方,最近又把學藝不精的Perl 拿出來玩
整理一些之前的筆記…

要巡覽陣列裡的每一個元素的方法
my @array=("aa","bb","cc","dd","ee");

1.
foreach $str (@array) {
    print $str ."\n"
}

2.
for($i=0; $i<=$#array; $i++) {
    print $array[$i] ."\n"
}
$#array ---> 能取得陣列的上標

3.
for($i=0; $i<scalar(@array); $i++) {
    print $array[$i] ."\n"
}
scalar(@array)  ---> 傳回陣列的元素數量

觀看全文...
【C語言】一堆子轉換函式
ddy1280 在天空部落發表於18:05:57 | 程式技術 氣象
前二天一個初學C語言的朋友在問…這是什麼爛語言呀~~怎麼資料轉來轉去的…頭都昏了
我哈哈大笑之後…跟他解釋原理,他大概能接受了。
但我想許多對初學者而言,資料的轉換仍然是一個問題,在此整理一些函式說明如下:

大概分為三類
  1. 字串與數值轉換
  2. 位元順序轉換
  3. 網路位址轉換

字串與數值轉換
    常見的就是atoi(),atol(),atof(),itoa() ... 之類的,其中itoa() 不被gcc所支援,可透過sprintf()來實現轉換,並僅以atoi()與sprintf()為例
 
原型宣告 使用方法 使用時機
#include <stdlib.h>
int atoi (const char *str);
int a;
a=atoi("100");
將數值字串轉換成整數
#include <stdio.h>
int sprintf (char *str,const char *format,...);
char s[10];
sprintf(s,"%s",100);
將數值轉換為字串


位元順序轉換
    位元序序轉換是因為x86 cpu讀取記憶體的順序與磁碟上存放的順序不同而造成的,x86架構是所謂的Little-Endian,在磁碟上儲存的位元組是照順序的,然而以32位元記憶體存取而言,會先從低位元開始讀取,例如…在磁碟上存放的資料是0x12345678,那麼讀進記憶體之後,就會是0x78 0x56 0x34 0x12
所以,從在儲存媒體與記憶體之間的資料需要轉換。另外就是用於Host Byte Order 與 Network Byte Order 互換,因為網路跨平台的特性,無論主機端是Big-Endian 或是Little-Endian 都要能正確地透過網路交換資料,所以在Socket定義上,Network Byte Order 採用 Big-Endian 。以下函式可達成轉換:

#include <netinet/in.h>

uint32_t htonl(uint32_t hostlong);//32位元資料轉換
uint16_t htons(uint16_t hostshort);//16位元資料轉換
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);



僅以host 中32位元記憶體中資料 0x78563412 為例:
原型宣告 使用方法 使用時機
#include <netinet/in.h>
uint32_t htonl(uint32_t hostlong);
unsigned int a,b;
a=0x78563412;
b=htonl(a);
1.host轉換成network 順序
2.memory 資料寫入磁碟的轉換
(0x78563412-->0x12345678)
#include <netinet/in.h>
uint32_t ntohl(uint32_t netlong);
unsigned int a,b;
b=0x12345678;
a=ntohl(b);
1.network 轉換成host順序
(0x12345678-->0x12345678)

網路位址轉換

觀看全文...
使用C 取得外部shell script回傳值(linux)
ddy1280 在天空部落發表於10:14:47 | 程式技術 氣象
有時候我們為了提高程式的彈性,會使用shell script 來做部份的工作
再取得回傳值來判定正常或是異常
以下面的例子…使用script 判斷目錄是否存在~

#!/bin/sh
#check directory

if [ -d $1 ];then
   #do something...
   ls $1
   exit 0
else
   exit 2
fi

可直接在shell 下觀察回傳
echo $?

而在C 語言程式裡…若要取得執行外部shell script 的回傳值的話,如下所示

觀看全文...
新功能再上線--我的樹狀選單式書籤
ddy1280 在天空部落發表於11:50:32 | 程式技術 氣象
再次考驗來小窩的朋友眼力
看到了嗎?
在右側小時鐘的上方,有一個「我的書籤(選單)」功能
這個功能主要是為了將分散的書籤做集中階層化管理,好讓右側書籤連結不會拖得落落長

平時可以縮起來,只看到大分類,點進去後…可以看見所屬的書籤連結

程式也是從網路上找到後稍修改,待整理後再貼給大家看
backtrace 學習記錄
ddy1280 在天空部落發表於15:46:53 | 程式技術 氣象
這幾天同事在研究為什麼Wintegra的程式出問題後,我們只需回傳stack資料他們就能知道那個函式出問題
以我早期的觀念,當主程式呼叫副程式時,會先將返回位址存到stack裡
所以透過傾印stack 可以得知在錯誤發生前的進入點是那個函式~~
這實在是很值得探討的方向,我就開始尋找一些資料
一面做實驗一面在整理…資訊太多…等有點心得後…轉換成自己的方式我會貼出來的




參考資料:
timhsu 兄所寫的 Who Call Me?
Printing back trace of functions inside a program
Unix編程/應用問答中文版 ---2.堆棧相關問題
Obtaining a stack trace in C upon SIGSEGV
Stack Backtracing Inside Your Program
以Readline 實作 getch() 功能
ddy1280 在天空部落發表於18:12:14 | 程式技術 氣象
在Linux 下GNU Readline Library 是很常用的,在許多交談式的程式裡都能見到其蹤影,最經典的莫過於shell了,使用readline() 所提供的功能,可以在文字模式使程式更容易操作更專業,一般來說包含了指令列的輸入/編輯等操作與熱鍵設定(符號化),甚至按[Tab] 鍵可以Auto completion 將未輸入完成的指令補齊,若搭配GNU History Library 則可以提供歷史指令的查詢,使用上/下鍵巡覽指令。

readline() 故名思義,就是一次讀一行資料,在輸入時會blocking 住,等待[CR] 鍵(Enter 鍵),才將輸入存入buffer,供程式讀取使用。在工作上我所採用的是以readline()做為輸入界面,一直以來都很好用,直到這二天需要getch() 這類功能才發現一些問題,例如,我希望按的鍵不要顯示,而且按完立即回應不要等待[CR],但是以readline() 預設模式是無法實現的,當然有其它方式可以解決不一定要用readline,像是使用curses所提供的getch(),基於系統限制我必須使用readline,所以在研究之後有了這一篇出現,程式碼如下:

觀看全文...
實作登入連線數限制
ddy1280 在天空部落發表於17:00:36 | 程式技術 氣象
一般而言取得連線數量通常為的是做限制,以防系統資源遭有心人士耗盡
例如限制telnet 連線數量,方法有很多種(以下我都試過,從最笨的開始)

1)修改telnet daemon 的source code
在 telnetd 的 main() 裡面加上這段code,讓每一個telnetd 起來時檢查自己的數量
當數量超過最大值則結束程式
1     readfp = popen("ps aux |grep in.telnetd |grep -v grep |wc -l","r");
2 if (readfp !=NULL)
3 {
4 fgets(buffer,10,readfp);
5 pclose(readfp);
6
7 if (atoi(buffer)>MAXCONNECTION)
8 return 0;
9 }

優點:可以熟悉telnetd 的source code
缺點:1.telnetd 與官版不一致,更新易出問題
2.若使用ssh 則無法控管,除非也修改sshd (我真的也傻傻地改了sshd)



觀看全文...
使用mtrace() 抓出Memory Leaks
ddy1280 在天空部落發表於16:54:25 | 程式技術 氣象
最近發現之前使用YACC & LEX 所寫的程式竟然有memory leaks
花了一些時間測試除錯,最後發現問題出現在YACC & LEX 裡面
幫助我抓到這些問題的好工具是 mtrace 。mtrace 是一個 GNU C/C++(Linux platform)提供的函式
使用簡單搭配 gcc -g 除錯資訊,可以輕易找到問題點

例:

 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6 int *p;
7 int i;
8
9 #ifdef DEBUG
10 setenv("MALLOC_TRACE", "./memleak.log", 1);
11 mtrace();
12 #endif
13
14 p=(int *)malloc(1000);
15 if (p!=NULL)
16 {
17 for (i=0;i<1000;i++)
18 {
19 p[i]=i;
20 }
21 }
22 else
23 printf("malloc fail");
24
25 return 0;
26 }


在這個程式裡malloc了一個空間,卻沒有free掉,我們為了除錯加了下面這段code
9 #ifdef DEBUG
10 setenv("MALLOC_TRACE", "./memleak.log", 1);
11 mtrace();
12 #endif

然後編譯 gcc -g -o aa -DDEBUG aa.c


觀看全文...
使用awk 解析資料
ddy1280 在天空部落發表於17:14:23 | 程式技術 氣象
使用 Linux 愈久,愈深深的被 Linux 的系統架構與極具彈性的 script 與工具吸引
原來,解決問題只要短短的一行指令,相信這是許多程式設計人員嚮往的事

最近工作上需要從dhcpcd 取得一些額外的資訊,所以在system call 所沒有有提供的部份,就要從記錄檔裡分析
通常,我們在 linux 下常見的文字檔是DSV 格式(Delimiter-Separated Values)像是/etc/passwd 或是以Space 分隔
在Windows 則常見 INI 格式

以往要取得這類文件的某行或某列的特定資料,通常會寫個程式,然後開檔,一行一行讀取,讀到某行,再進行分析,這樣的做法真的很累,以前我就是這樣做的
而現在,grep 與 sed ,或是 awk 幫我完成大部份工作
例1:

觀看全文...
1 2 3 > 下一頁 | 最後一頁 1/3
系統公告
個人檔案
個人圖檔
ID:ddy1280
暱稱:ddy
生日:1975/03/16
地區:桃園縣

廣告


強力推薦,讓Blog的人氣轉換成現金,鼓勵Blog創作最佳的回饋方式,詳請見使用BloggerAds 為Blog賺取實質收益或點選上方圖片加入喔

另一個Blog廣告的選擇BlogAD,欲加入請按這裡
Tags Cloud
好時光貼曆
基督徒串聯
文章分類
搜尋Blog
搜尋:
時光機器

謹民出生第

人氣指數
當日人次:
累積人次:
誰來我家
我推薦誰
誰推薦我
隨機文章
公益串聯
到台湾玩不带走一张发票
用愛彌補~羅慧夫顱顏基金會
我的書籤(選單)
RSS 訂閱
贊助商
CC授權
其它資訊
本部落所刊登之內容,皆由作者個人所提供,不代表 yam 天空 本身立場。
POWERED BY
POWERED BY 天空部落
會員登入免費註冊