jquery

2019年3月28日 星期四

Arduino, Raspberry pi 自走車(智能小車) 無法走直線(1)

為了迎接未來物聯網的時代,身為一個軟體工程師的我也開始學起IOT
在芒茫網海搜尋後,敗入了一台Arduino自走車,
紅外線避障+藍芽版本的一台才650塊新台幣 ,為了讓運費划算一點
買了樹莓派3 B+(含電源、殼、hdmi線),這個比台灣便宜很多,台幣1300左右,台灣這樣買要破二千

買來興高采列的組起小車



但組完之後發現這傢伙沒辦法走直線....等等,這是不是有什麼誤會Orz
一台車耶,沒辦法走直線

再上網問狗之後,發現這個不是個案

網路上找到的問題點
 1.馬達有公差,,即使二顆馬達全力輸出,,轉速也不可能一模一樣
 2.Arduino是單晶片,速度不快所導致

這二個問題點都可以透過調整馬達的速度(PWM)進行改善。

但除此之外呢?  沒有其它辦法嗎

因為據我觀察這台車的結果,給我的直覺就是
他是先啟動其中一輪所導致的

這台車是按下直走後,往左邊轉了約30度後再走直線

往左邊轉就是右輪先啟動,那程式裡剛好就是右輪先走
rightWheel()
leftWheel()

在這個情形下,先啟動的那邊會先走當然不奇怪,自然就歪一邊

所以身為專業的軟體工程師,我直覺的就想到, 用fork() 做multithread不就好了...?
 做法很容易
1. 啟動右輪進背景
2. 馬上暫停右輪約1/3秒 (為了等左輪啟動)
3.啟動左輪

但白痴如我,單晶片不支援多工

所以...身為一個專業的軟體工程師,我決定改車....

我就像軌道車那樣,用一顆馬達做四輪傳動就好了

就憑你這種小車也想玩我,我操!!!



2019年2月22日 星期五

日檢N1答題技巧

在2018年12月,我參加了日本語能力試驗N1

說實在這個考試我已經考了第三次了

平常工作時就有在用日文,也有在看日語新聞,照理來說我的程度應該不會太差

但偏偏就是考不過。 

N1的實際題目遠遠比市面上賣的考題難,然後一年比一年難,這個很靠北

不過人總要成長,哪裡跌倒哪裡站起來,在考了二次之後,規納出自己的幾項比較弱的地方,針對應試的方式進行改變。

我這裡說的應試方式指的不是念書的方法那些,因為我覺得如果你的程度已經有到N1,但偏偏就是考試不會過,以下的方法或許可以幫助你

一、筆試
    1. 單字、文法
        這個大題我認為是測定你有沒有N1程度最佳的判斷方式,因為這個部分很單純的靠實力,單字不會就是不懂,一翻二瞪眼。所以這個部分沒有技巧,看命....
      文法短句很靈活,如果你平常就有在講日文,相信再爛也可以拿到一半
    2. 短文
       建立在你平常的熟悉度,我個人覺得這部分不是很難。所以這個部分看完文章再答題即可

   3. 長篇文章
     這部份是我個人最弱的地方,我前二次考都沒有寫完,最後都是用猜的交卷。
     文章本身也不難,難就難在太長太多,很浪費時間。
   
加上他題目問的方式基本上都是要從文章中推敲後才有辦法答,可是面對第一次看到的文章,平常人根本很難一次就記起來,常常來回查看確認,時間就浪費掉了。
   
所以,我這次使用的方式是「翻中文」,開始看文章時,就把每一段的中文翻譯寫上去

   這樣寫題目時很容易找到他在問哪一段,也很好去推敲是哪一個答案。

   有人會問,可是這樣會不會拖慢整體答題時間,答案是,「不見得」
    
  因為遇到比較深的文章,你可以減少反覆看的時間,而且寫成中文後你答題時的尋找內容速度會整個上昇非常多,正確率也會提升,這個考試只要過,又不是要考高分

所以你可以找找市面上的練習題,以這種答題方式練個幾次,我這次靠這個方式,寫完剩一分鐘,然後PASS

二、聽力

     聽力基本上也很吃基本功,因為我平常就有和日本人在交談,這部分我根本沒有花時間練習也考了42分

  但基本的準備方式就是你背的每一個單字你都要熟悉,因為這部分的變化我覺得比我之前考的難,速度也變快了,單字的熟悉度不夠很快就去了,所謂的熟悉就是不用想就懂那個字

  如果可以練到熟悉,基本上拿個40不是問題,因為這個大題連題目選項都是要靠用聽的,我因為上半場考完就已經頭腦晃神,聽解時精神很難集中,所以這部分得分不是太高

   但, 再說一次,目標只是要過,又不是要考第一名。  大家加油吧XDDDD
恁北N1過了啦

2019年1月11日 星期五

上下班打卡 考勤系統

在系統裡原有的打卡功能,讓員工可以利用電腦進行打卡,而權限夠的人事部可以進到系統裡查詢每個人每個月出勤狀況


但上班隨手用卡刷,下班時才在電腦上刷,這樣似乎比較符合上班族的使用習慣,

因為有時上班就差那麼幾秒就遲到了,加上如果電腦開機慢,那整個時間就不對了

所以另行開發了一個介面,可以使用QR CODE進行刷卡上下班

2018年12月22日 星期六

在python 3內使用pymysql

最近開始學python,在資料庫讀取的部分使用pymysql

但發現pymysql 在select出來的資料是tuple,當我如php一樣對其陣列內容打入欄位名稱時會出現type Error,
 TypeError: tuple indices must be integers or slices, not str

因為pymysql所存放的格式是長這樣的
(1264, 94, 2018, 11, 9, 5, 48, 12, 15, 14, 22, 4, 4, 12, 14, 15, 22, 48, 28)

這樣的話你就只能用array[0],array[1],array[2]...方式進行取值,在程式的可讀性上變得很差

理想的情形是array["year"] ,array["month"]這種對人類來有意義的文字,可讀性比較高
所以我的目標即把select 出來的內容轉成如下格式
 {'serial': 1269, 'round': 99, 'year': 2018, 'month': 11, 'day': 27, 'week': 2, 'o1': 27, 'o2': 36, 'o3': 43, 'o4': 44, 'o5': 41, 'o6': 33, 's1': 27, 's2': 33, 's3': 36, 's4': 41, 's5': 43, 's6': 44, 'sp': 31}
---------------------------------------------------------------------------------------------------------------------

以下範例
例如在php,我從資料select出0~50的數字,當程式判斷該o1~o6欄的數字,並在相對位置的陣列位置的值+1,這樣就可以計算出每一個數字有幾個
ex:第一個row 的o1值為27,則在陣列的第27個位置的值+1
   

$str= "select * from raw_number where year='2018'";
         $time_count=Array();
        $i=0;
        while($i<=50){
            $time_count[]=0;
            $i++;
        }
       
   $data=$db->query($str)->fetchAll();
   foreach($data as $d){
      
     $time_count[$d['o1']]+=1;   //這寫法在php可以,但在pymysql無法
     $time_count[$d['o2']]+=1;
     $time_count[$d['o3']]+=1;
     $time_count[$d['o4']]+=1;
     $time_count[$d['o5']]+=1;
     $time_count[$d['o6']]+=1;
     $time_count[$d['sp']]+=1;    
   }
-----------------------------------------------------------------------------------
而在python,幾經google找尋後,pymysql 出來的資料可以使用map的方式把資料配對組好,組好後轉成list即可
雖然有點麻煩,但其實不過就是多寫二行
 #cursor.description是列出欄位名稱,不熟的朋友可以直接print(cursor.description)看看
#new2dict函數,這個函數是自定義函數,也就是我寫來把欄位名稱和值配在一起用的
#接著下一行會使用map()這個函數把從資料庫fetchall()中所有的值和欄位配在一起
 def new2dict(new): 
   return dict(zip([x[0] for x in cursor.description],[x for x in new]))

new_list = list(map(new2dict,cursor.fetchall()))

for i in new_list:
    nu[i["o1"]]+=1 #o1
    nu[i["o2"]]+=1 #o2
    nu[i["o3"]]+=1 #o3
    nu[i["o4"]]+=1 #o4
    nu[i["o5"]]+=1 #o5
    nu[i["o6"]]+=1 #o6
    nu[i["sp"]]+=1 #sp

沒了....其實就是多了一個new2dict和map(),接下來的邏輯就和php差不多

2018年12月7日 星期五

Linux Ubuntu 上安裝Python 3 及 postgresql

[安裝]
在ubuntu上裝了最新的3.7版的python
命令列上隨意的打上
sudo apt-get install python3

一下子就裝好了
接著要裝pip ,pip可以用來下載python的套件(函式庫),
但請注意,這個pip要下載3.0版用的,在ubuntu上他叫python3-pip, 所以
sudo apt-get install python3-pip

裝好了後,少了database,剛好我python是新學的,於是想說一直以來除了mysql之外也沒有用過別家的
於是呼想起之前一直想學的Postgresql,好吧,那就裝吧

sudo apt-get install postgresql

於是,postgresql也就這樣裝好了

----------------------------------------------------------------------------------------------------------------
 設定

1.首先,postgresql在安裝時會預設幫你創一個叫「postgres」的使用者
這個使用者被設定為postgresql最大的管理員(相當於root),但創建時的密碼是亂數,所以你必須先幫個這個postgres改系統密碼

 sudo passwd postgre

2.改好之後切換到postgres這個使用者
    su postgres

接著就可直接打上psql 這個指令,順利進入後你會看令命列postgres=#

3.由於安全因素,一般不建議大家使用postgres這個帳號進行日常維護
尤其這個帳號你知我知,寶傑西屏都知道,所以我們在此創立一個新的,他叫tom
密碼 1111,這個tom 必須是linux的user之一,因為postgresql所採用的peer認證的方式,所以除了db內建之外,linux也必須要建一個相同的user帳號,並 請一定要記得打完後要加一個分號

 postgres=# create user tom with password '1111';     <--- br="">
 
4. 接著建立一個database 叫myshop
    postgres=# create database myshop;

5. 把這個database 的權限指定給tom
postgres=#GRANT ALL PRIVILEGES ON DATABASE myshop TO tom;

然後,我以為這樣就結束了
但,我用TOM的帳號進去後發現無法創建資料表及INSERT資料
上網一查發現,TABLE也必須GRANT,所以

6.指定TABLE權限給TOM
 postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA PUBLIC TO tom;
 
7. 建立一張table
create table lotto (serial int, o1 int,o2 int)

至此,postgresql的設定皆完成

接下來換PYTHON

1.首先裝上psycopg2
 sudo apt-get  install python3-psycopg2

2接著寫一個簡單的python 測試連線

import psycopg2
conn= psycopg2.connect("dbname=myshop user=tom password=1111 host=127.0.0.1")
cur=conn.cursor()
cur.execute("insert into lotto (14,15,16)")
conn.commit()
conn.close()

設定完了~~~!

---------------------------------------------------------------------------------------------------------------------
[備註]
如果其單純想創建資料庫使用者而不想多一個linux使用者的話,可以修改
 /etc/postgresql/10/main/pg_hba.conf


local   all             all                                     peer
改成