2017年6月11日 星期日

Drupal安裝備忘錄

drupal 安裝備忘錄

#安裝php及mysql環境
yum install php php-cli php-common php-gd php-mbstring mysqld zlib

(php-gd和php-mbstring是必要的,當初安裝drupal一直失敗就是這個原因)

#修改/etc/php.ini,找到[Date]區塊,新增以下一行設定(開頭分號要拿掉)
date.timezone = "Asia/Taipei"

#修改/etc/httpd/conf/httpd.conf,找到<Directory "/var/www/html">設定,
#將AllowOverride改成All
<Directory "/var/www/html">
 #AllowOverride None
 AllowOverride All
</Directory>


#到drupal官網下載drupal-8.3.3.tar.gz
cp drupal-8.3.3.tar.gz /var/www/html
cd /var/www/html
tar -zxvf drupal-8.3.3.tar.gz
mv drupal-8.3.3 drupal
rm drupal-8.3.3.tar.gz

#新增Drupal檔案上傳存放資料夾 (使用者上傳的圖檔會放到該資料夾)
cd /var/www/html/drupal/default/
mkdir files
chmod 775 files
chgrp apache files

#新增預設的settings.php
cd /var/www/html/drupal/default/
cp default.settings.php settings.php
chmod 660 settings.php
chgrp apache settings.php

#在settings.php中,加入以下兩行以下設定
ini_set('mbstring.http_input', 'pass');
ini_set('mbstring.http_output', 'pass');


#之後開啟瀏覽器,輸入http://localhost/drupal,進入安裝頁面
#在Requirement review會出現Clean URL和PHP OPCODE CACHING is not enable的警告,
#不要理他,直接下一步到底
#之後會要求輸入MySQL帳號密碼,剛開始可以用root,但上線系統並不建議
#安裝完成後,請修改/var/www/html/drupal/default/settings.php權限為644

產生C語言Call Graph的方法

測試了多個c語言的call-graph產生器,覺得最好用的還是cflow這個指令,
配合htags,能產生超強大的html來瀏覽source code
以下將說明指令使用方式

安裝相關套件:
yum install cflow global


cflow使用方式:
首先先切換到專案底下:
cd myproject;

目錄的結構大約如下,source code分別放在src及lib資料夾
myproject
+--src
+--a.c
+--b.c
+--lib
+--cqji.c
假設我的程式碼分別放在src及lib目錄下,我希望產生所有c檔的call-graph,
cflow src/*.c lib/*.c;

執行後輸出:
main() <int main (int argc, char *argv[]) at src/main.c:319>:
    getopt()
    print_usage() <void print_usage (const char *pro_name) at src/main.c:40>:
        printf()
    time()
    printf()
    ctime()
    packet_queue_init() <BOOL packet_queue_init (void) at src/packet_queue.c:22>:
        pthread_mutex_init()
    flow_init() <int flow_init (void) at src/flow.c:175>:
        flow_hash_init() <int flow_hash_init (void) at src/hash_table.c:30>:
            MALLOC()
            pthread_mutex_init()
        flow_queue_init() <int flow_queue_init (void) at src/flow_queue.c:27>:
            pthread_mutex_init()
    pthread_create()

可以加上-T選項,產生如下
+-main() <int main (int argc, char *argv[]) at src/main.c:319>
  +-getopt()
  +-print_usage() <void print_usage (const char *pro_name) at src/main.c:40>
  | \-printf()
  +-time()
  +-printf()
  +-ctime()
  +-packet_queue_init() <BOOL packet_queue_init (void) at src/packet_queue.c:22>
  | \-pthread_mutex_init()
  +-flow_init() <int flow_init (void) at src/flow.c:175>
  | +-flow_hash_init() <int flow_hash_init (void) at src/hash_table.c:30>
  | | +-MALLOC()
  | | \-pthread_mutex_init()
  | \-flow_queue_init() <int flow_queue_init (void) at src/flow_queue.c:27>
  |   \-pthread_mutex_init()
  +-pthread_create()

配合htags指令,可以產生一個超強大的html
cflow src/*.c -o cflow.txt -f posix
htags -ngoIsv --cflow cflow.txt





2017年5月19日 星期五

C語言小抄

用snprintf模擬asprintf來處理字串相加
char* cstr;
int c = snprintf( NULL, 0, "%d * %d = %d", tmp, tmp, tmp*tmp );
cstr = new char[ c + 1 ];
snprintf( cstr, c + 1, "%d * %d = %d", tmp, tmp, tmp*tmp );

基本型態與跟指標的大小,結論就是sizeof(任意型態的指標)都是8bytes
printf("char : %d\n", sizeof(char)); //輸出1
printf("char*: %d\n", sizeof(char *)); //輸出8 (我用64bit的OS,因此address是8byte)
printf("int  : %d\n", sizeof(int)); //輸出1
printf("int* : %d\n", sizeof(int *)); //輸出8 (我用64bit的OS,因此address是8byte)

2017年4月25日 星期二

C語言巨集篇 -- C preprocessor (節錄Gcc Macro Manual)

https://gcc.gnu.org/onlinedocs/cpp/Macros.html



本篇將快速介紹C語言巨集的用法,以及一些實用的技巧


巨集(Macro)最基本的用法,就是拿來定義常數,或是拿來定義一段程式碼區塊,其中 '\' 符號在巨集中表示換行,下面是一個例子
#define BUFFER_SIZE 1024
#define NUMBERS 1, \
                2, \
                3
foo = (char *) malloc (BUFFER_SIZE);
int x[] = { NUMBERS };
你可以用以下指令來察看前處理器將巨集語法編譯後的結果,你會發現所謂的巨集就是拿來做語法上的字串替換
gcc -E -P XXX.c 
像上面這一段程式碼經過前處理器編譯後變成
foo = (char *) malloc (1024);
int x[] = { 1, 2, 3 };
以下將用註解呈現編譯後的結果

C語言前處理器的編譯是循序的,因此巨集必須先定義才會生效,以下是個例子
foo = X;
#define X 4
bar = X;

//前處理器編譯後變成
//foo = X;
//bar = 4;
實際上巨集定義是能包含其他巨集名稱的,例如
#define TABLESIZE BUFSIZE
#define BUFSIZE 1024
//此時TABLESIZE變成1024
另一個有趣的例子,先定義BUFSIZE後,再重新定義BUFSIZE,結果很有趣
#define BUFSIZE 1020
#define TABLESIZE BUFSIZE
#undef BUFSIZE
#define BUFSIZE 37


//此時TABLESIZE為37,
//不管何時使用TABLESIZE,TABLESIZE都會是37不會是1020

2017年4月2日 星期日

列印gcc 預設include path

列印gcc 預設include path:
echo | gcc -E -Wp,-v -

列印c++預設include path:
echo | cpp -xc++ -Wp,-v 

搜尋含有關鍵字的檔案

在bash中輸入以下指令,可以搜尋src資料夾下,
包含main關鍵字的檔案,並印出該關鍵字出現在該檔案的行號
grep -nr main ./src

執行結果:
src/main.c~:273:capture_main(const char* interface, void (*pkt_handler)(void*), int livemode){
src/main.c~:319:int main(int argc, char *argv[]){
src/main.c~:376: /* Start main capture in live or offline mode */
src/main.c~:378: capture_main(interface, packet_queue_enq, 1);
src/main.c~:381: capture_main(tracefile, packet_queue_enq, 0);


或者配合find指令
find ./src -type f -exec grep -nH -e main {} +


執行結果:
src/main.c~:273:capture_main(const char* interface, void (*pkt_handler)(void*), int livemode){
src/main.c~:319:int main(int argc, char *argv[]){
src/main.c~:376: /* Start main capture in live or offline mode */
src/main.c~:378: capture_main(interface, packet_queue_enq, 1);
src/main.c~:381: capture_main(tracefile, packet_queue_enq, 0);


兩者的差別是,第1種會將結果上色,比較利於閱讀。





2017年3月30日 星期四

抓取證交所資料網址

外資買賣超日報
http://www.tse.com.tw/ch/trading/fund/T86/T86.php
download=?
qdate=?
select2=ALLBUT0999
外資買賣超週報
    http://www.tse.com.tw/ch/trading/fund/TWT54U/TWT54U.php
外資買賣超月報
http://www.tse.com.tw/ch/trading/fund/TWT47U/TWT47U.php
三大法人買賣金額統計表
http://www.tse.com.tw/ch/trading/fund/BFI82U/BFI82U.php

每日成交量前20%
http://www.tse.com.tw/ch/trading/exchange/MI_INDEX20/MI_INDEX20.php
個股歷年最高價最低價
http://www.tse.com.tw/ch/trading/exchange/FMNPTK/FMNPTKMAIN.php


1402遠東新 紡織纖維
1434福懋 紡織纖維
<option value="ALL">全部</option>
<option value="ALLBUT0999">全部(不含權證、牛熊證、可展延牛熊證)</option>
<option value="0049">封閉式基金</option>
<option value="0099P">ETF</option>
<option value="019919T">受益證券</option>
<option value="0999">認購權證(不含牛證)</option>
<option value="0999P">認售權證(不含熊證)</option>
<option value="0999C">牛證(不含可展延牛證)</option>
<option value="0999B">熊證(不含可展延熊證)</option>
<option value="0999X">可展延牛證</option>
<option value="0999Y">可展延熊證</option>
<option value="0999GA">附認股權特別股</option>
<option value="0999GD">附認股權公司債</option>
<option value="0999G9">認股權憑證</option>
<option value="01" selected="">水泥工業</option>
<option value="02">食品工業</option>
<option value="03">塑膠工業</option>
<option value="04">紡織纖維</option>
<option value="05">電機機械</option>
<option value="06">電器電纜</option>
<option value="07">化學生技醫療</option>
<option value="21">化學工業</option>
<option value="22">生技醫療業</option>
<option value="08">玻璃陶瓷</option>
<option value="09">造紙工業</option>
<option value="10">鋼鐵工業</option>
<option value="11">橡膠工業</option>
<option value="12">汽車工業</option>
<option value="13">電子工業</option>
<option value="24">半導體業</option>
<option value="25">電腦及週邊設備業</option>
<option value="26">光電業</option>
<option value="27">通信網路業</option>
<option value="28">電子零組件業</option>
<option value="29">電子通路業</option>
<option value="30">資訊服務業</option>
<option value="31">其他電子業</option>
<option value="14">建材營造</option>
<option value="15">航運業</option>
<option value="16">觀光事業</option>
<option value="17">金融保險</option>
<option value="18">貿易百貨</option>
<option value="23">油電燃氣業</option>
<option value="9299">存託憑證</option>
<option value="19">綜合</option>
<option value="20">其他</option>
<option value="CB">可轉換公司債</option>
</select>

在Bash中用sftp上傳檔案

IP="172.17.254.152"
echo $IP
#PORT=$2
#echo $PORT
USERNAME="user"
echo $USERNAME
PASSWORD="passwd"
echo $PASSWORD
#REMOTE_FILE=$6
#echo "LOCAL_FILE = $REMOTE_FILE"
REMOTE_DIR_A="/upload/serverA"
echo "REMOTE_DIR_A = $REMOTE_DIR_A"
REMOTE_DIR_B="/upload/serverB"
echo "REMOTE_DIR_B = $REMOTE_DIR_B"
DES_DIR_A="/home/vslog/bkrchnl_report/serverA"
echo "DES_DIR_A = $DES_DIR_A"
DES_DIR_B="/home/vslog/bkrchnl_report/serverB" echo "DES_DIR_B = $DES_DIR_B" lftp  -u  $USERNAME,$PASSWORD  sftp://$IP << END_SFTP cd $REMOTE_DIR_A lcd $DES_DIR_A mput "RC_`date -d yesterday "+%Y%m%d"`*" cd $REMOTE_DIR_B lcd $DES_DIR_B mput "RC_`date -d yesterday "+%Y%m%d"`*" quit END_SFTP

Oracle 安裝步驟

Oracle安裝步驟

下載linux.x64_11gR2_databases_1of2.zip及linux.x64_11gR2_databases_1of2.zip兩個檔案並解壓縮
1. 在/etc/hosts檔案最後一行新增:
10.144.27.208 hadoop001.cht.local hadoop001
2. 在/etc/sysctl.conf最後一行新增:
fs.suid_dumpable = 1
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
(註)如果你的sysctl裡面有類似的值,且原本的值比上面的還高,以值高的為主。
之後執行/sbin/sysctl -p讓設定生效。
3. 在/etc/security/limit.conf最後一行新增:
oracle              soft    nproc   2047
oracle              hard    nproc   16384
oracle              soft    nofile  4096
oracle              hard    nofile  65536
oracle              soft    stack   10240
* soft nofile 102400
* hard nofile 102400

3. 新增以下帳號及群組
groupadd oinstall
groupadd dba
groupadd oper
groupadd asmadmin
groupadd asmdba
groupadd asmoper
adduser -g oinstall -G dba,asmdba,oper oracle
passwd oracle #(設定oracle的密碼)
mkdir -p /opt/oracle/product/11.2.0/db_1
chown -R oracle.oinstall /opt/oracle
chmod -R 775 /opt/oracle
4.  在/etc/profile最後一行新增以下環境變數
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=OracleDB
export ORACLE_UNQNAME=OracleDB
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$CLASSPATH
存檔後,執行source /etc/profile,讓當前終端機生效,若要永久生效,請重新開機。

Cloudera 安裝失敗時,重裝步驟

service cloudera-scm-server stop
service cloudera-scm-agent stop
yum remove cloudera*
~/rm_hadoop.sh
rpm -ivh cloudera-manager-server cloudera-manager-daemons cloudera-manager-agent
drop database metastore;
drop database scm;
create database metastore character set utf8;
create database scm character set utf8;
/usr/share/cmf/schema/scm_prepare_database.sh mysql scm scm hadoop
netstat -tlunp | grep 7180
netstat -tlunp | grep 7182
netstat -tlunp | grep 9000
netstat -tlunp | grep 9001
service cloudera-scm-server start