2015年12月26日 星期六

助教心得

這學期擔任科學計算課程的助教,過程和過去我做過多數工作相同,這薪水我領得非常的心虛。

在學期初,我有幫忙去設定電腦,並在上課前幾分鐘確認軟體的安裝狀態,而到了學期中,我幾乎是完全沒有被指派任何工作,主要是坐在電腦前做自己的事,並在設備有狀況時聯絡管理員,多數的時間完全沒有事情做。

雖然有開設助教時間,但幾乎不會有人來問問題,這讓人感到相當的挫折,對於助教而言尚且如此,對學校教師而言大概也會有類似的感覺吧?

期末報告教師分派了一些兩人一組以及一人一組的題目,由於期中有同學退選,所以人數剛好等於報告的題目,造成部分比較晚決定題目的同學被迫得一個人做兩人一組的題目,而有些同學的能力完全不足以應對這種題目,所以教師指派我和某位同學一組,各負責一部分。

某位同學,姑且以L代稱好了,積極度相當的差,當面溝通總是敷衍了事,FB密他連讀也不讀,讓人完全不知道該怎麼處理,只好自己完成整份報告,並把他的名字寫上去。對於如此不積極的學生,我感到相當的不爽,自己的分數不是應該自己顧嗎? 你自己負責的報告不自己做,難道我做?

對於合作學習這件事,有人是平常個人作業隨便做,遇到分組報告因為可能會影響到同儕成績而改變心態認真做,也有人是當很忙的時候遇到分組報告,會優先選擇個人課業,反正報告什麼的天塌下來總有人坦著,另外還有一種很常見的,是不管個人或團體作業都隨便完成,甚至完全不行動的。L的話三種都有可能,如果是第一種,也許是因為助教沒有分數,覺得就算搞砸開天窗也無所謂,也有可能是第二種,吃定我會幫忙做到底。

姑且不ˋ管是哪種,L這種學生在教學現場上應該是隨處可見的,如果每次都要這麼不爽,那肯定不是什麼好事,對於這類學生,在盡了一切應做的事以後,如果仍不見改善,那應該選擇就此忽略,反正這種傢伙沒救了。

就這次L的事情來說,我選擇把他所應負責的程式以及簡報的部分完成,至於上台講解,我會講解到2/3的部分就交給他,希望他有所準備。

2015年12月20日 星期日

自我妨礙筆記

自我妨礙自我設障,跛足策略是一種心理機制,自我妨礙通過一系列行動或想法讓自己擺脫掉為失敗的責任。自我妨礙通常被認為保持自尊,有的時候也被用來自我增強(更進一步提高自尊)或者對給別人留下某種印象

上述是wiki所提到關於自我妨礙的部分。

自我妨礙不只會出現在青少年中,成年人也經常出現,我自己也得多堤防以免自己陷入此心態之中,阻礙進步。

感覺wiki上的敘述似乎不是很完整,自我妨礙似乎不僅僅為了擺脫責任,而是想要把責任引導到特定方向。以常見的「我故意不認真,才會輸給你,我天份不比你差」為例,這件事情是把責任歸因於自身的努力或認真程度,一般來說這種歸因是相對於天份來得正向,歸因於此可能日後更努力以達成目標,但此例中卻並非如此,此例中言者很有可能是在事件開始前就預料到了失敗,而為了避免他人將失敗歸因於自身不可控的天份,所以刻意在準備期間進行自我妨礙,使得失敗得以歸因於自身可控的因素(努力、認真)上。

之所以會出現此窘境,可能是持續性的準備不足,或者各種環境因素而造成,要避免此心態出現,認清自身在當下的能力是必須的,當下的能力不足不等於才能,失敗也不必然和才能不足畫上等號,勇於承擔失敗並持續努力會是比較好的做法,持續的自我妨礙只會增大自己的自尊,能力卻毫無增長,只會迎來無止境的失敗。

會有此行為者,對於「才能」、「天份」或是當下的能力比「努力」、「認真」這幾件事情更為看重,且對於失敗這件事情很不願意面對,但在可預料的失敗面前,比起面對或被評價自己無能力或才能不足,被評為「很聰明,但不夠努力」則是個相當便宜的代價。

2015年12月17日 星期四

OSX 下查閱字體名方式

查了這個一段時間了,在linux下的fc-list好像不能用,稍微頭痛了一下,終於找到了方法,於是記錄於此:

查閱方法為在字體簿中更改顯示方式為詳細,PostScript 名稱即是所需要的字體名

2015年9月22日 星期二

YouCompleteMe do not work with python-mode

Fix: disable the auto complete feature from mython-mode

let g:pymode_rope_complete_on_dot = 0

2015年8月9日 星期日

mysql開啟遠端連線

網路上都寫說用grant去開一個遠端帳戶

但除此之外,還需要設定mysqld 中的 bind-address

正常設定是127.0.0.1,如果要從遠端連線的話則必須改成0.0.0.0才行

2015年7月26日 星期日

2015年7月23日 星期四

測試程式區塊

#include

using namespace std;

int main(int argc,char *argv[])
{
  cout<<"ttt"<<"AAA";
  return 0;
}

2015年7月20日 星期一

Ubuntu下使用GDB給Eigen除錯

Eigen是個好用的c++數學庫,有很多矩陣、向量等工具可以使用

但對我而言稍微麻煩的就是它在預設狀況下無法使用GDB除錯

說是沒辦法有點不太對,就是顯示出來的資訊很混亂不清楚,基本上就是難以用人工去除錯

上網查詢後,找到了使用官方提供的pretty-print方法,但按照它上頭的解說仍無法順利使用,會出現以下錯誤

Python Exception <class 'TypeError'> 'map' object is not subscriptable:
原本以為是我什麼地方搞錯了,還跑去官網去查文件一篇一篇讀,根本....

最後根據這篇的解答,我確認了自己的python版本,確定問題是我這用apt-get 下載的gdb使用的是python3.4版本,而Eigen提供的版本是使用python2所撰寫的,也難怪沒辦法跑。

於是只好移除現有的gdb,重新從官方網站下載來編譯,關於參數我參考了別人的網誌,在編譯完成後總算是成功能 print 出矩陣的內容了。

雖然最後解決了,但這件事真的讓人挺煩躁的,沒事預設3.4版本做什麼啦,python2是過期了膩?明明還很多人在用阿......連gdb網站中的Extending gdb using Python條目都還在用python2耶......

2015年7月19日 星期日

c++ 存取 mysql 資料庫

Beginning Linux Programming》上頭寫的是C,比較不那麼好記憶,於是我上網搜尋了c++的相關用法。很幸運的,MySQL官方就有提供API可以給C++使用,它感覺使用了物件導向的概念,記憶上比較輕鬆,這篇筆記也是在參考它以後所寫的。(官方的文件也寫得很簡明易懂,建議可以看一下)

假設我想存取的資料庫在本機,有資料表children如下:












則我可以使用以下程式來讀寫

#include<iostream>
#include <stdlib.h>
#include "mysql_connection.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

using namespace std;

int main()
{
        sql::Driver *driver;
        sql::Connection *con;
        sql::Statement *stmt;
        sql::ResultSet *res;

        driver = get_driver_instance();
        con = driver->connect("localhost", "username", "password");
        con->setSchema("database");

        stmt = con->createStatement();
        stmt->execute("INSERT INTO children(no,fname,age) VALUE(8,'Amy',5)");
//      execute 是用於無回傳值的情況,executeQuery則是有回傳值的情況使用
res = stmt->executeQuery("SELECT * from children");

        while(res->next())
        {
                cout << "id = "<<res->getInt("no")<<"\t";
                cout << "fname = "<<res->getString("fname")<<"\t";
                cout << "age = " <<res->getString(3)<<"\t";
                cout <<endl;
        }
//      res.getInt和res.getString的參數也可以接收正整數,代表第幾個column
return 0; }

這小程式會新增一組資料,並回傳、顯示整個資料表

實際使用時記得得加上try,以投擲與接收錯誤資訊。

編譯時必須加上 -lmysqlcppconn

安裝時我是直接 sudo apt-get install libmysql*

2015年7月17日 星期五

MySQL筆記

參考書目:Beginning Linux Programming

在安裝完MySQL後,首先登入並設置密碼:

1
2
$ mysql -u root mysql
mysql> SET password=PASSWORD('2jennifer');

並新增一個帳號,給予權限

1
mysql> GRANT ALL ON *.*  TO [username] IDENTIFIED BY [password]
GRANT 主要用於修改權限,如果目標不存在則新增一個
*.*代表給予所有的權限

可使用指令查看是否新增成功

1
mysql> use myssql;
mysql> SELECT user,host,password FROM user;
成功的話在表單中可以查看到新增的帳號。
此處SELECT在日後會經常使用,謹記。

接著exit出去,用新造的用戶登入:


1
mysql> exit;
$ mysql -u [username] -p#這裡 -p代表需要輸入密碼

先新增資料庫,並切換過去:
1
mysql> CREATE DATABASE [資料庫名]
mysql> use [資料庫名]

看看有沒有成功
1
mysql> SHOW DATABASES;

之後可以新增資料表:

1
CREATE TABLE children(
        no INT AUTO_INCREMENT NOT NULL PRIMARY KEY /*此為鍵值*/
        , fname VARCHAR(30)
        , age INT
)
這裡是新增一個名為children的資料表,並增加三個欄位(column)
值得一提的是,這段可以存成一個檔案,並在mysql互動式界面中存取
假設我存成 AddTable.sql,存取方式如下

1
mysql> SOURCE AddTable.sql;
可以查看有沒有新增成功:

1
mysql> SHOW TABLES FROM [database name];

新增資料的方式如下:

1
mysql> INSERT INTO children(fname,age) VALUE("Nick",9);
mysql> INSERT INTO children(fname,age) VALUE("Jack",12);
由於欄位no我們設定成會自動增加的欄位,所以不指定也ok,會自動填入1

接著可以使用先前查看用戶名的方式來看我們的資料表:

1
mysql> SELECT * FROM children;
也可以指定顯示某幾個欄位

1
mysql> SELECT no,fname FROM children;
透過比對某欄位值來顯示:

1
mysql> SELECT * FROM children WHERE fname='Jack';
也可以用 LIKE

1
mysql> SELECT * FROM children WHERE fname LIKE 'N%';
更詳細的用法我會參考這裡:凍仁的筆記

2015年7月16日 星期四

awk 複習


awk '
BEGIN{
KE=0
dens=0
pm=0
N=0
}
NR==1{
print "filename :",FILENAME
}
NR>107{
N++
KE+=$2
dens+=$4
pm+=$6
}
END{
KE/=N
dens/=N
pm/=N
print "average KE =",KE
print "average dens =",dens
print "average pm =",pm
}
' $*
上面這是引入一個檔案,並在107行以後開始取平均 引入這類的檔案< awk的用法常忘記,通常要用到的時候又得重新查,故在此留個筆記

2015年6月27日 星期六

Java 讀取資料夾內的檔案名稱

同樣是在 java.io 裡面的方法

這回物件是綁定在資料夾上,如此一來就可以使用 list() 方法來存取其內的檔案,先做筆記,之後會用到

import java.io.*;

public class showdir{
        public static void main(String[] args){
                String dirname="testdir";
                File f = new File(dirname);
                String[] filelist = f.list();
                System.out.println(filelist[0]+" "+filelist[1]+" "+filelist[2]+" ");
        }
}

Java read file

read() 和 write() 在Java 中也存在,和c一樣可以存取串流或裝置中的東西,只是這好像只能一次讀取一個字元,因此會改用其他方式。

以下引用自小狐狸事務所

import java.io.*;
public class file1 {
  public static void main(String[] args) {
    try {
      FileReader fr=new FileReader("test.txt");
      BufferedReader br=new BufferedReader(fr);
      String line;
      while ((line=br.readLine()) != null) {
        System.out.print(line);
        }
      }
    catch (IOException e) {System.out.println(e);}
    }
  }

2015年6月24日 星期三

Socket 筆記

我是參考 《Beginning Linux programming》這本書的第15章,相關的範例程式可以在書商的網站下載。

Socket 應該是 Linux 系統中提供的一組關於網路的 API ,使用方式也很有 Linux 的風格。

撰寫的方式在書中也有提到,主要是 server 端持續開著程式,設定好 socket ,接著等待 client 端連線的要求,接收到了以後就准許連線,並轉到設定好的 socket ,之後就可以使用類似存取檔案的方式來對該socket 進行 read 和 write 的動作。對server 端而言,write是指把資料write到client端使其能read出來的感覺。

2015年6月19日 星期五

SEIKO 7N42-0GB0 開箱

DSCN0455

最近忽然沒來由的忽然想換錶,於是就去西門町買了。

買的錶是SEIKO 7N42-0GB0  這隻,會選SEIKO的原因是因為我覺得這個牌子很耐用,從小就看我爸戴這牌子的錶,買錶二十多年來有十幾年都在跑工地,怎麼撞怎麼震都不會壞,簡直是工地神錶。

我需要的功能是看時間以及日期,其他計時什麼的我並不需要,所以目標主要放在素面的款式上。

原本看上的的是 ALBA VJ42-X126SD 這個系列,但實際上到錶店看過後卻覺得完全沒辦法接受,因為這錶真的有夠大、有夠厚的,詢問店員後,店員表示最近的趨勢是錶都做得很大,看慣了我爸那顆舊錶的我實在是沒辦法接受這尺寸,於是拜託店員幫我找個比較小的,在一番猶豫後,我選了7N42-0GB0 這隻錶。

7N42-0GB0 這個系列好像沒有出現在官方網站上,但網拍上卻常常看到,說實在的我不是很確定是不是假的就是了。

買來的時候有附一個盒子,裡面放錶這樣

DSCN0457

錶面的配置和網路上的一樣,有日期和指針,直徑是3.9cm

DSCN0462

厚度按照網路上的資料來看是0.8mm,我沒特別拿卡尺來量,姑且就相信吧

DSCN0461

我的手比較小,所以戴起來還是覺得有點大,不過比起另外幾隻已經小很多了,還算能接受。

DSCN0458

買到的價格大概比網路上便宜個幾百塊,這是讓我挺訝異的,我上一支錶是在師大附近買的 CASIO AW-90H,整整比PCHOME貴上了快三百阿…這點還真讓人有些困惑阿

2015年6月8日 星期一

通常網頁中的超連結是這種形式


要用正規表達法抓這裡面的網址的話,大概是這樣

href=[\"]([^\"\']+)

用正規表達法來抓網址

通常網頁中的超連結是這種形式


要用正規表達法抓這裡面的網址的話,大概是這樣

href=[\"]([^\"\']+)


2015年5月27日 星期三

c++ stream 使用科學記號

[stream]<<std::scientific;

可以是cout或是任何fstream物件

這方法可以把輸出的數字全部用科學記號來輸出

雖然沒有什麼實質效用,但可以讓數據看起來美觀一點

還有其他的格式化方式可以到參考以下網站

http://en.cppreference.com/w/cpp/io/manip/fixed

https://www.bnw.com.tw/conference/viewtopic.php?f=76&t=5290

learn for awk

http://lalakiwe.myweb.hinet.net/Documents/awk/awk_4.html
從這網站上可以學習到awk的一些基礎

awk 是個相當方便的程式語言,我想我應該好好熟悉它的。

舉例來說,我有個檔案格式是兩個colum組成的,我想取第一個colum的平均值,方法如下:

awk 'BEGIN{sum=0} {sum+=$1} END{sum/=NR; print sum}' test.dat

就這樣一行就可以完結了,相當的方便。

大二的時候就聽師揚介紹過,但並沒有很常用,但今後我應該要好好熟悉它。

2015年5月25日 星期一

Convert Eigen Matrix to C-style array

We can convert C-style array to Eigen Matrix :

double C_arr[N*N]
MatrixXd EigenMatrix
EigenMatrix=Map<MatrixXd>(C_arr,N,N)

And there is the same way to covert Eigen Matrix to C-style:

Map<MatrixXd>(C_arr,N,N)=EigenMatrix

2015年5月20日 星期三

定時執行某段程式

這回被指派的工作是每八小時印出程式中的某個vector,我上網查了一些文章,學到了使用多執行緒來計時的方法,剛好現在又有重新碰了openmp,用起來還算方便。

過去我沒有分執行緒的習慣,通常都是直接在迴圈內做「if delte_time > T dosomething」這種檢查,但這會佔到主執行緒的時間,所以處理的速度總是會被拖慢,如果有一千萬個迴圈,那這個檢查就會執行一千萬次,雖然和矩陣運算相比微不足道,但總不是個好方法。

現在學習到的方法是多切一個執行緒出來,專門進行計時的工作,程式碼我放在這裡了,其中要注意的地方是「計時」的函式,不能用 ctime 的 clock() ,要使用 omp_get_wtime() 才可以,如果使用 clock() ,在主執行緒好像不會有問題,但在切割出來的副執行緒似乎就會跑太快。

vim 半透明模組 seiya.vim


我是參考這篇部落格找到這個模組的,它成功的解決了我長久以來的小問題,成功的把 vim 給半透明化了,效果相當的不錯。

seiya作者的github在此,我是透過 vundle 來安裝下來的,過程沒有出現任何問題,相當的順利,真是相當的不錯阿。

2015年5月19日 星期二

解決 vim 在 tmux 下底色問題




這件事情之前也困擾著我,今天上網查到了還算滿意的解答
根據第二篇回答,只要在 .vimrc 中加入 set t_ut= 這段即可解決
不過照理來說應該還是有辦法去修改 tmux 的設定來解決,畢竟出問題的不是vim,有種找錯仇家的感覺阿......