各位手速500words/min大佬下午好
又來到了雷蛇五六開獎時間
484hen4興奮呢!!!
自從在鍵鼠板發文,就一堆熱心鍵友私信要提供鍵盤鍵帽
小弟很是心領,可是家環四壁空間有限,沒辦法每個都收
感謝你們每yee個人
------
總之
今天為各位推薦的是台灣知名鍵帽印刷廠TaiHao的 UK Royal Blue - 英國藍
帽主還很調皮的用超級大紙箱裝呢,想跟群內大佬一樣裝逼不小心踢到都難
https://i.imgur.com/yklr5Vn.jpg
------
先來個小故事,一樓幫我上音樂
國小歷史課聽了不下百次,也被證實了
中世紀時,在歐洲貴族身上流的是藍色的血
直到現在更不只歐洲,就連亞洲也甚為流行藍血
大大眼睛的花漾少女,露出雪白而堅挺的雙峰,那吹彈可破的細緻嫩肌
帶著藍色涓流,彷彿倘佯在浩瀚無垠的星空中
阿,又想到,我們國中時看的那部電影,叫什麼也不曉得
依稀記得劉德華與方天涯在那未來的場景中交織著藍色的愛情
或許在很遠的將來,藍色,這個尊貴的顏色
也會一直活在英國、德國、西國這些浪漫的國度吧
------
接著
上個工程師跟卓粉最愛的spec
- 太豪表面粗糙化ABS
- 字體二色成型
- 標準104鍵無增補
- 指環拔鍵器、橡膠8、太豪紅白鍵帽兩個
https://i.imgur.com/mC1AWhY.jpg
https://i.imgur.com/9k3QmMM.jpg
藍色還被束縛起來了,不怕坑碰到白帽染到色!
------
今天的小幫手是Filco藍軸跟可愛的alpha5K
https://i.imgur.com/Q1gFta8.jpg
沒錯,國藍當然要配藍軸才對味!!
期待他成為英國忍藍
先裝上Filco引以為傲的數字區
https://i.imgur.com/W57XnNo.jpg
阿斯,巧妙的白藍紅配置,讓雙眼彷彿看到的披掛著中華戰袍的運動鍵兒
雖敗猶榮阿!!
雖然這套是ABS,但其實有種PBT的粗曠風
眼前的白也不是白
https://i.imgur.com/1m8deWi.jpg
挑逗著F沒有平衡軸的可愛小豆豆,好不容易也是全部替換上去了
完美結合
https://i.imgur.com/66CWPkX.jpg
恰到好處,也安全的配色,讓這套中華藍無懈可擊
https://i.imgur.com/LNrcQCR.jpg
世上沒有完美的
殘酷的總是殘酷
這套中華鍵兒也不是沒有缺點
https://i.imgur.com/S7u6AbP.jpg
可以發現字體非常不統一,可能是兩套新舊模具
難道是在闡述著時代的交替與淚光的交織?
(Caps Lock and Shift就很明顯了)
https://i.imgur.com/1ruT0u7.jpg
可以發現Insert非常地不均勻
------
總之,依這個價位而言已經很棒了
要是能改善字體這種比較明顯的瑕疵
或許我們國產車的等級又會再更一步的飛躍性跳升
https://i.imgur.com/9Ug6f81.jpg
------
我是雷蛇56,祝各位佳節愉快,抹茶湯圓好吃喔!
一起邁向勝利人生!
2017年12月22日 星期五
2017年11月16日 星期四
OpenStack 雲端開源平台技術整理 (kairen.gitbooks)
https://kairen.gitbooks.io/openstack-liberty/content/index.html
在centos上使用qemu製造win10的qcow2
[root@localhost ~]# qemu-img create win10.qcow2 30G -f qcow2
>>Formatting 'win10.qcow2', fmt=qcow2 size=32212254720 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
[root@localhost ~]#
kvm \
-machine accel=kvm \
-cpu host -smp 2 \
-m 2048 -soundhw ac97 \
-usb -usbdevice tablet \
-vnc :1 \
-net nic,model=e1000 -net user \
-drive file=win10.qcow2 \
-cdrom /opt/SW_DVD5_Win_Pro_10_64BIT_ChnTrad_MLF_X20-25781.ISO
>>
2017年11月7日 星期二
OpenStack 使用RDO架設在CentOS7
1. 最小化安裝
2. 關閉networkmanager套件
由於預設的NetworkManager網路管理套件會讓OpenStack的網路異常,
所以要停用NetworkManager套件,改用network套件來管理網路。
3.
4.
打開瀏覽器,輸入CentOS 7主機的IP位址,登入OpenStack管理網頁。
5.
Ref
https://www.hkitblog.com/?p=28801
https://www.rdoproject.org/tripleo/
http://www.shunze.info/forum/thread.php?threadid=1962&boardid=35&sid=9c6bdf22a478bd080dcf0e7c760f8329&sid=9c6bdf22a478bd080dcf0e7c760f8329
http://www.chenshake.com/
https://www.youtube.com/watch?v=JMDxpAmR_XQ
2. 關閉networkmanager套件
由於預設的NetworkManager網路管理套件會讓OpenStack的網路異常,
所以要停用NetworkManager套件,改用network套件來管理網路。
systemctl disable NetworkManager
systemctl stop NetworkManager
chkconfig network on
systemctl start network.service
systemctl stop NetworkManager
chkconfig network on
systemctl start network.service
3.
- sudo yum update -y
- 安裝OpenStack套件sudo yum install -y https://rdo.fedorapeople.org/rdo-release.rpm
sudo yum install -y openstack-packstack - 以allinone模式安裝OpenStackpackstack --allinone
4.
打開瀏覽器,輸入CentOS 7主機的IP位址,登入OpenStack管理網頁。
5.
Ref
https://www.hkitblog.com/?p=28801
https://www.rdoproject.org/tripleo/
http://www.shunze.info/forum/thread.php?threadid=1962&boardid=35&sid=9c6bdf22a478bd080dcf0e7c760f8329&sid=9c6bdf22a478bd080dcf0e7c760f8329
http://www.chenshake.com/
https://www.youtube.com/watch?v=JMDxpAmR_XQ
2017年10月31日 星期二
Cent OS 7 安裝注意事項
CentOS的磁碟格式比較特別,
建議使用 Rufus來做USB安裝碟
接著安裝開啟sudoers, 以及安裝OPENSSH
1
ifconfig not found ---- yum install net-tools
2
建議使用 Rufus來做USB安裝碟
接著安裝開啟sudoers, 以及安裝OPENSSH
1
ifconfig not found ---- yum install net-tools
2
修改/etc/ssh/ssh_config 加上 ServerAliveInterval 5 然後,重啟SSH服務: #sudo /etc/init.d/ssh restart 或 #sudo service ssh restart
2017年10月30日 星期一
OpenStack架設使用devstack在ubuntu 14.04 and 16.04
openstack的初步探索
http://perrywu0606.pixnet.net/blog/post/27646684-%5B筆記%5D-openstack的初步探索
在經過一番架設之後還是失敗了
2017-10-31 05:38:50.890 | +./stack.sh:main:738 PYPI_ALTERNATIVE_URL=
2017-10-31 05:38:50.897 | +./stack.sh:main:738 /opt/stack/devstack/tools/install_pip.sh
2017-10-31 05:38:51.031 | /opt/stack/devstack/.localrc.auto: line 20: crt,n-obj,n-: command not found
2017-10-31 05:38:51.040 | ++./stack.sh:main:738 err_trap
2017-10-31 05:38:51.049 | ++./stack.sh:err_trap:534 local r=127
2017-10-31 05:38:51.057 | stack.sh failed: full log in /opt/stack/logs/stack.sh.log.2017-10-31-133514
2017-10-31 05:38:51.059 | Error on exit
stack@CQ71:~/devstack$
http://perrywu0606.pixnet.net/blog/post/27646684-%5B筆記%5D-openstack的初步探索
在經過一番架設之後還是失敗了
2017-10-31 05:38:50.890 | +./stack.sh:main:738 PYPI_ALTERNATIVE_URL=
2017-10-31 05:38:50.897 | +./stack.sh:main:738 /opt/stack/devstack/tools/install_pip.sh
2017-10-31 05:38:51.031 | /opt/stack/devstack/.localrc.auto: line 20: crt,n-obj,n-: command not found
2017-10-31 05:38:51.040 | ++./stack.sh:main:738 err_trap
2017-10-31 05:38:51.049 | ++./stack.sh:err_trap:534 local r=127
2017-10-31 05:38:51.057 | stack.sh failed: full log in /opt/stack/logs/stack.sh.log.2017-10-31-133514
2017-10-31 05:38:51.059 | Error on exit
stack@CQ71:~/devstack$
解決很多問題之後還是不行
看起來是pip有東西還沒裝好,不過暫時不處理了
改採用比較多使用者推薦的RDO
當初devstack的local.conf
[[local|localrc]]
HOST_IP=#實體機的IP
DATABASE_PASSWORD=openstack #密碼可自訂
ADMIN_PASSWORD=openstack
SERVICE_PASSWORD=openstack
SERVICE_TOKEN=openstack
RABBIT_PASSWORD=openstack
#Network settings
FLAT_INTERFACE=p1p1
#May be different depends on the network interface, it could be eth0
FIXED_NETWORK_SIZE=256
#Enable Logging
LOGFILE=/opt/stack/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=/opt/stack/logs
#Pre-requisite
ENABLED_SERVICES=rabbit,mysql,key
#Nova
ENABLED_SERVICES+=,n-api,n- crt,n-obj,n- cpu,n-cond,n- sch
IMAGE_URLS+=”,https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-
x86_64-disk.img”
ENABLED_SERVICES+=,n-cauth
#ENABLED_SERVICES+=,n-cell
ENABLED_SERVICES+=,n-novnc
#Horizon
ENABLED_SERVICES+=,horizon
#HORIZON_REPO=https://github.com/openstack/horizon
#HORIZON_BRANCH=master
#Glance
ENABLED_SERVICES+=,g-api,g- reg
#Neutron
ENABLED_SERVICES+=,q-svc,q- agt,q-dhcp,q- l3,q-meta,neutron
##Neutron – Load Balancing
#ENABLED_SERVICES+=,q-lbaas
##Neutron – VPN as a Service
#ENABLED_SERVICES+=,q-vpn
##Neutron – Firewall as a Service
#ENABLED_SERVICES+=,q-fwaas
#Cinder
ENABLED_SERVICES+=,cinder,c-api,c- vol,c-sch
##Cinder – Block Device Service
ENABLED_SERVICES+=,c-bak
#Heat
ENABLED_SERVICES+=,heat,h-api,h- api-cfn,h- api-cw,h- eng
#Ceilometer
ENABLED_SERVICES+=,ceilometer-acompute,ceilometer- acentral,ceilometer-
collector,ceilometer-api
ENABLED_SERVICES+=,ceilometer-alarm- notify,ceilometer-alarm- eval
#Swift
#ENABLED_SERVICES+=,s-proxy,s- object,s-container,s- account
#SWIFT_REPLICAS=1
#SWIFT_HASH=openstack
#Ceph
#ENABLED_SERVICES+=,ceph
#CEPH_LOOPBACK_DISK_SIZE=10G
#CEPH_CONF=/etc/ceph/ceph.conf
#CEPH_REPLICAS=1
#GLANCE_CEPH_USER=glancy
#GLANCE_CEPH_POOL=imajeez
#CINDER_DRIVER=ceph
#CINDER_CEPH_USER=cindy
#CINDER_CEPH_POOL=volumeuh
#CINDER_BAK_CEPH_POOL=backeups
#CINDER_BAK_CEPH_USER=cind-backeups
#CINDER_ENABLED_BACKENDS=ceph,lvm
#NOVA_CEPH_POOL=vmz
2017年7月12日 星期三
Keil C 中的變數 volatile
1) 參考 http://www.originality.idv.tw/webhosting/develop/sections/general_c/volatile.htm
2)
轉自http://codebeauty.blogspot.tw/2012/03/c51.html
volatile 實例講解
volatile的本意是一般有兩種說法--1.“暫態的”;2.“易變的”。
這兩種說法都有可行。但是究竟volatile是什麼意思,現舉例說明(以Keil-c與a51為例
例子來自Keil FQA),看完例子後你應該明白volatile的意思了,如果還不明白,那只好
再看一遍了。
例1.
void main (void)
{
volatile int i;
int j;
i = 1; //1 不被優化 i=1
i = 2; //2 不被優化 i=1
i = 3; //3 不被優化 i=1
j = 1; //4 被優化
j = 2; //5 被優化
j = 3; //6 j = 3
}
---------------------------------------------------------------------例2.函數:
void func (void)
{
unsigned char xdata xdata_junk;
unsigned char xdata *p = &xdata_junk;
unsigned char t1, t2;
t1 = *p;
t2 = *p;
}編譯的彙編為:
0000 7E00 R MOV R6,#HIGH xdata_junk
0002 7F 00 R MOV R7,#LOW xdata_junk
;---- Variable 'p' assigned to Register 'R6/R7' ----
0004 8F 82 MOV DPL,R7
0006 8E83 MOV DPH,R6
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 注意
0008 E0 MOVX A,@DPTR
0009 F 500 R MOV t1,A
000B F500 R MOV t2,A
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
000D 22 RET 將函數變為:
void func (void)
{
volatile unsigned char xdata xdata_junk;
volatile unsigned char xdata *p = &xdata_junk;
unsigned char t1, t2;
t1 = *p;
t2 = *p;
}編譯的彙編為:
0000 7E00 R MOV R6,#HIGH xdata_junk
0002 7F 00 R MOV R7,#LOW xdata_junk
;---- Variable 'p' assigned to Register 'R6/R7' ----
0004 8F 82 MOV DPL,R7
0006 8E83 MOV DPH,R6
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0008 E0 MOVX A,@DPTR
0009 F 500 R MOV t1,A ;a處
000B E0 MOVX A,@DPTR
000C F500 R MOV t2,A
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
000E 22 RET 比較結果可以看出來,未用volatile關鍵字時,只從*p所指的位址讀一次
如在a處*p的內容有變化,則t2得到的則不是真正*p的內容。
---------------------------------------------------------------------例3
volatile unsigned char bdata var; // use volatile keyword here
sbit var_0 = var^0;
sbit var_1 = var^1;
unsigned char xdata values[10];
void main (void) {
unsigned char i;
for (i = 0; i < sizeof (values); i++) {
var = values[i];
if (var_0) {
var_1 = 1; //a處
values[i] = var; // without the volatile keyword, the compiler
// assumes that 'var' is unmodified and does not
// reload the variable content.
}
}
}在此例中,如在a處到下一句運行前,var如有變化則不會,如var=0xff; 則在
values[i] = var;得到的還是values[i] = 1;
---------------------------------------------------------------------應用舉例:
例1.
#define DBYTE ((unsigned char volatile data *) 0)說明:此處不用volatile關鍵字,可能得不到真正的內容。
---------------------------------------------------------------------例2.
#define TEST_VOLATILE_C
//***************************************************************
// verwendete Include Dateien
//***************************************************************
#if __C51__ < 600
#error: !! Keil 版本不正確
#endif
//***************************************************************
// 函數 void v_IntOccured(void)
//***************************************************************
extern void v_IntOccured(void);
//***************************************************************
// 變數定義
//***************************************************************
char xdata cValue1; //全局xdata
char volatile xdata cValue2; //全局xdata
//***************************************************************
// 函數: v_ExtInt0()
// 版本:
// 參數:
// 用途:cValue1++,cValue2++
//***************************************************************
void v_ExtInt0(void) interrupt 0 {
cValue1++;
cValue2++;
}
//***************************************************************
// 函數: main()
// 版本:
// 參數:
// 用途:測試volatile
//***************************************************************
void main() {
char cErg;
//1. 使cErg=cValue1;
cErg = cValue1;
//2. 在此處仿真時手動產生中斷INT0,使cValue1++; cValue2++
if (cValue1 != cErg)
v_IntOccured();
//3. 使cErg=cValue2;
cErg = cValue2;
//4. 在此處仿真時手動產生中斷INT0,使cValue1++; cValue2++
if (cValue2 != cErg)
v_IntOccured();
//5. 完成
while (1);
}
//***************************************************************
// 函數: v_IntOccured()
// 版本:
// 參數:
// 用途: 閉環
//***************************************************************
void v_IntOccured() {
while(1);
}仿真可以看出,在沒有用volatile時,即2處,程式不能進入v_IntOccured();但在4處可以進入v_IntOccured();
2)
轉自http://codebeauty.blogspot.tw/2012/03/c51.html
volatile 實例講解
volatile的本意是一般有兩種說法--1.“暫態的”;2.“易變的”。
這兩種說法都有可行。但是究竟volatile是什麼意思,現舉例說明(以Keil-c與a51為例
例子來自Keil FQA),看完例子後你應該明白volatile的意思了,如果還不明白,那只好
再看一遍了。
例1.
void main (void)
{
volatile int i;
int j;
i = 1; //1 不被優化 i=1
i = 2; //2 不被優化 i=1
i = 3; //3 不被優化 i=1
j = 1; //4 被優化
j = 2; //5 被優化
j = 3; //6 j = 3
}
---------------------------------------------------------------------例2.函數:
void func (void)
{
unsigned char xdata xdata_junk;
unsigned char xdata *p = &xdata_junk;
unsigned char t1, t2;
t1 = *p;
t2 = *p;
}編譯的彙編為:
0000 7E00 R MOV R6,#HIGH xdata_junk
0002 7F 00 R MOV R7,#LOW xdata_junk
;---- Variable 'p' assigned to Register 'R6/R7' ----
0004 8F 82 MOV DPL,R7
0006 8E83 MOV DPH,R6
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 注意
0008 E0 MOVX A,@DPTR
0009 F 500 R MOV t1,A
000B F500 R MOV t2,A
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
000D 22 RET 將函數變為:
void func (void)
{
volatile unsigned char xdata xdata_junk;
volatile unsigned char xdata *p = &xdata_junk;
unsigned char t1, t2;
t1 = *p;
t2 = *p;
}編譯的彙編為:
0000 7E00 R MOV R6,#HIGH xdata_junk
0002 7F 00 R MOV R7,#LOW xdata_junk
;---- Variable 'p' assigned to Register 'R6/R7' ----
0004 8F 82 MOV DPL,R7
0006 8E83 MOV DPH,R6
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0008 E0 MOVX A,@DPTR
0009 F 500 R MOV t1,A ;a處
000B E0 MOVX A,@DPTR
000C F500 R MOV t2,A
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
000E 22 RET 比較結果可以看出來,未用volatile關鍵字時,只從*p所指的位址讀一次
如在a處*p的內容有變化,則t2得到的則不是真正*p的內容。
---------------------------------------------------------------------例3
volatile unsigned char bdata var; // use volatile keyword here
sbit var_0 = var^0;
sbit var_1 = var^1;
unsigned char xdata values[10];
void main (void) {
unsigned char i;
for (i = 0; i < sizeof (values); i++) {
var = values[i];
if (var_0) {
var_1 = 1; //a處
values[i] = var; // without the volatile keyword, the compiler
// assumes that 'var' is unmodified and does not
// reload the variable content.
}
}
}在此例中,如在a處到下一句運行前,var如有變化則不會,如var=0xff; 則在
values[i] = var;得到的還是values[i] = 1;
---------------------------------------------------------------------應用舉例:
例1.
#define DBYTE ((unsigned char volatile data *) 0)說明:此處不用volatile關鍵字,可能得不到真正的內容。
---------------------------------------------------------------------例2.
#define TEST_VOLATILE_C
//***************************************************************
// verwendete Include Dateien
//***************************************************************
#if __C51__ < 600
#error: !! Keil 版本不正確
#endif
//***************************************************************
// 函數 void v_IntOccured(void)
//***************************************************************
extern void v_IntOccured(void);
//***************************************************************
// 變數定義
//***************************************************************
char xdata cValue1; //全局xdata
char volatile xdata cValue2; //全局xdata
//***************************************************************
// 函數: v_ExtInt0()
// 版本:
// 參數:
// 用途:cValue1++,cValue2++
//***************************************************************
void v_ExtInt0(void) interrupt 0 {
cValue1++;
cValue2++;
}
//***************************************************************
// 函數: main()
// 版本:
// 參數:
// 用途:測試volatile
//***************************************************************
void main() {
char cErg;
//1. 使cErg=cValue1;
cErg = cValue1;
//2. 在此處仿真時手動產生中斷INT0,使cValue1++; cValue2++
if (cValue1 != cErg)
v_IntOccured();
//3. 使cErg=cValue2;
cErg = cValue2;
//4. 在此處仿真時手動產生中斷INT0,使cValue1++; cValue2++
if (cValue2 != cErg)
v_IntOccured();
//5. 完成
while (1);
}
//***************************************************************
// 函數: v_IntOccured()
// 版本:
// 參數:
// 用途: 閉環
//***************************************************************
void v_IntOccured() {
while(1);
}仿真可以看出,在沒有用volatile時,即2處,程式不能進入v_IntOccured();但在4處可以進入v_IntOccured();
2017年6月13日 星期二
土砲 - 成本200之 全罩安全帽藍牙耳機
牽了一台重車之後發現
不管跟車隊出遊互通路訊
或是單騎旅遊聽導航
實在還是需要一個內嵌式的耳機會來的方便些
網路上搜尋一下其實也不貴
2K上下就夠用了!
但實在不喜歡外掛一顆在那邊
加上手上有不要的耳機
就來試試看土炮啦!!
材料:
安全帽 (ZSUS 811)
藍牙耳機 (露天隨便買的 200元)
頭戴耳機 (中信卡友送的)
烙鐵
VHB雙面膠 (75元)
大致流程就是把全罩耳機拆開, 把線剪斷, 改焊上藍牙模組
然後塞到安全帽耳朵洞裡面
首先想辦法把頭戴式耳機肢解掉, 留下耳機線圈跟線就好
我的安全帽空間還夠, 所以我連棉套都留下來了, 空間不夠的可以拆掉
試著裝上去, 戴戴看會不會卡卡的, 畢竟這原本只是要給耳朵的空間
擺看看藍牙主機要放哪邊比較不會擋視線又好按
沒問題就開工了, 把頭戴耳機拆到看到線為止
然後量好要藏在安全帽內裏的長度後直接把線剪斷
耳機線輸出的部分有三條(紅、綠、金)
金色為共地、紅色左聲道、綠色右聲道、如果有白的話就是麥克風
焊線的部分注意, 廉價的耳機線很細, 而且外面漆的部分並不導電
作法是美工刀割到露出線之後不用再去刮漆, 用焊錫的熱度直接溶掉表面進行焊接
短的那邊因為是焊到PCB上, 所以難度應該不高, 手會抖的可以先用膠帶固定再焊
長的那邊因為我繞過整個安全帽裡面到右耳, 所以要做線對焊的作業
也是固定好, 用熱度融掉表面之後就焊上去了
四條線焊好之後大概就變這樣
再上點熱融膠當作防水跟固定
再用VHB雙面膠黏上去, 大功告成!
剩下的材料一樣可以焊回去變成一般的耳機
過程中焊好一小部分都有做簡單的測試, 基本上都沒問題
線雖然細, 比想像中的好焊, 也沒有雜訊干擾的現象
執得注意的是線對焊好之後, 記得用膠帶做個絕緣
以免兩個銲錫接觸到而短路
這主要是拿身邊的材料來做利用啦
相信大家應該有很多耳機不敷使用想丟掉的
就可以用這個方式廢物利用啦~
不管跟車隊出遊互通路訊
或是單騎旅遊聽導航
實在還是需要一個內嵌式的耳機會來的方便些
網路上搜尋一下其實也不貴
2K上下就夠用了!
但實在不喜歡外掛一顆在那邊
加上手上有不要的耳機
就來試試看土炮啦!!
材料:
安全帽 (ZSUS 811)
藍牙耳機 (露天隨便買的 200元)
頭戴耳機 (中信卡友送的)
烙鐵
VHB雙面膠 (75元)
大致流程就是把全罩耳機拆開, 把線剪斷, 改焊上藍牙模組
然後塞到安全帽耳朵洞裡面
首先想辦法把頭戴式耳機肢解掉, 留下耳機線圈跟線就好
我的安全帽空間還夠, 所以我連棉套都留下來了, 空間不夠的可以拆掉
試著裝上去, 戴戴看會不會卡卡的, 畢竟這原本只是要給耳朵的空間
擺看看藍牙主機要放哪邊比較不會擋視線又好按
沒問題就開工了, 把頭戴耳機拆到看到線為止
然後量好要藏在安全帽內裏的長度後直接把線剪斷
耳機線輸出的部分有三條(紅、綠、金)
金色為共地、紅色左聲道、綠色右聲道、如果有白的話就是麥克風
焊線的部分注意, 廉價的耳機線很細, 而且外面漆的部分並不導電
作法是美工刀割到露出線之後不用再去刮漆, 用焊錫的熱度直接溶掉表面進行焊接
短的那邊因為是焊到PCB上, 所以難度應該不高, 手會抖的可以先用膠帶固定再焊
長的那邊因為我繞過整個安全帽裡面到右耳, 所以要做線對焊的作業
也是固定好, 用熱度融掉表面之後就焊上去了
四條線焊好之後大概就變這樣
再上點熱融膠當作防水跟固定
再用VHB雙面膠黏上去, 大功告成!
剩下的材料一樣可以焊回去變成一般的耳機
過程中焊好一小部分都有做簡單的測試, 基本上都沒問題
線雖然細, 比想像中的好焊, 也沒有雜訊干擾的現象
執得注意的是線對焊好之後, 記得用膠帶做個絕緣
以免兩個銲錫接觸到而短路
這主要是拿身邊的材料來做利用啦
相信大家應該有很多耳機不敷使用想丟掉的
就可以用這個方式廢物利用啦~
2017年6月6日 星期二
2017年6月5日 星期一
LINE Notify
Line在現在已是大家常用的通訊軟體之一,2016/12/26 Line在台舉辦LINE Taiwan TechPulse大會中,介紹了在LINE平台上的5大開發套件,分別是OWA(Official Web App)、LINE Notify、LINE SMS、Customer Connect、Group App Platform,讓有興趣透過API來開發服務的朋友們可以方便使用。
LINE Notify是一項很新的服務,在2016/09/30發布,所以無法在網路上找到比較多的應用,筆者這2天有幸與一位三商電腦技術主任一起研究LINE Notify及其相關內容,這讓筆者有了許多點子可以想,以下筆者將先介紹LINE Notify環境設定,後續再將LINE Notify相關應用分享,也歡迎對LINE Notify有興趣的朋友一起討論與集思廣益。
LINE Notify是一個單向傳輸文字、訊息、圖片的API,無法作雙向溝通,所以只要拿來做為訊息的傳送就可以,重點它是免費的,如果用Line Bot做雙向溝通就要收錢了,LINE Notify算是經濟實惠的API服務。
方法:開發人員在 LINE Notify 官網申請一個client_id,透過client_id找出用戶端的Token,最後藉由該Token傳送文字、訊息、圖片給用戶端。
上述方法看似簡單,但實際操作起來要花上一些時間設定,以下就一一說明操作方法。
Step 1. 到 LINE Notify官網 登錄服務,申請取得Client ID。
Step 2. 填寫申請資料並登錄。
PS:以下幾點要注意。
Step 3. 發送認證郵件致電子信箱。
PS:認證郵件由常常會被誤以為垃圾信件,請注意。
Step 4. 點選認證信件中網址啟動服務。
Step 5. 點選認證網址後回到 LINE Notify 登錄服務頁面。
這時就可以見到申請好的Client ID,基本上一個人可以申請多個Client ID,再點選圖片進到裡面查看個人詳細內容。
Step 6. Client ID是要用來取得用戶端Token,將Client ID與註冊用到「CallbackURL」一起帶入以下HTML程式碼,並存成 index.php。
Step 7. 開啟網頁index.php網頁,連結到LineNotify按鈕,連結到Line Notify網頁設定Line的同意與連動。
執行以上 index.php 程式碼需要php的環境,若是為了要執行以上程式碼要大家安裝去Apache 與php,將是一件大工程,筆者這裡推薦一個簡易版的伺服器系統:Usbwebserver,大家可以去官網下載無須安裝、操作簡易、容易擴充、方便使用、檔案大小約82 MB一個隨身碟即可帶著走,使用教學。
Step 8. 選擇用戶端,並點選同意與連動按鈕。
觀察Line,此時會出現 LINE Notify 帳號作為通知,如果有成功到這一步地顯示,表示已成功串起 LINE Notify 服務。
PS:如果用戶端沒有加入 LINE Notify 帳號,將不會收到任何通知訊息。
Step 9. 在點選同意與連動按鈕後,網頁會回到「CallbackURL」的頁面,這時取出URL上的Code,藉由這個Code來取出用戶端的Token。
Step 10. 使用Postman傳送參數到 https://notify-bot.line.me/oauth/token 取回Token。
填入以下參數
URL:https://notify-bot.line.me/oauth/token
Key:grant_type、Value:authorization_code
Key:code、Value:Step 9.的Code
Key:redirect_uri、Value:Step 2.的redirect_uri
Key:client_id、Value:Step 5.的client_id
Key:client_secret、Value:Step 5.的client_secret
PS:這裡的POST要指定application/x-www-form-urlencoded。
Step 11. 使用Postman,在Headers中Header:Authorization、Value:Step 10.的Token、傳送訊息message帶入傳送的訊息,將這些內容傳送到 https://notify-api.line.me/api/notify 給LINE Notify 發送訊息。
form-data模式
application/x-www-form-urlencoded模式
PS:
到此各位應該都可以順利完成所有步驟了,有了這樣的基礎,後續透過程式傳送資訊就應該不成問題。
結論:
LINE Notify是一項很新的服務,在2016/09/30發布,所以無法在網路上找到比較多的應用,筆者這2天有幸與一位三商電腦技術主任一起研究LINE Notify及其相關內容,這讓筆者有了許多點子可以想,以下筆者將先介紹LINE Notify環境設定,後續再將LINE Notify相關應用分享,也歡迎對LINE Notify有興趣的朋友一起討論與集思廣益。
LINE Notify是一個單向傳輸文字、訊息、圖片的API,無法作雙向溝通,所以只要拿來做為訊息的傳送就可以,重點它是免費的,如果用Line Bot做雙向溝通就要收錢了,LINE Notify算是經濟實惠的API服務。
方法:開發人員在 LINE Notify 官網申請一個client_id,透過client_id找出用戶端的Token,最後藉由該Token傳送文字、訊息、圖片給用戶端。
上述方法看似簡單,但實際操作起來要花上一些時間設定,以下就一一說明操作方法。
Step 1. 到 LINE Notify官網 登錄服務,申請取得Client ID。
Step 2. 填寫申請資料並登錄。
PS:以下幾點要注意。
- 圖片格式要求為PNG格式。
- 「服務網址」可先填與「CallbackURL」相同內容。
- 「CallbackURL」內容需要有一個可以連結的網址,在後續應用時建議使用可以24小時提供服務的web server來存放網頁,現在測試時可先以本機電腦位置(localhost)驗證。
- 「CallbackURL」主要是當與用戶端建立連動關係後,Line主機會回傳一組Code的植在URL上,這組Code就類似用戶識別碼,再透過這組Code去Line主機取回對應的Token,該Token就是要能取得對用戶端發訊權限,透過這組 Token 這樣才能對用戶端發送訊息。
Step 3. 發送認證郵件致電子信箱。
PS:認證郵件由常常會被誤以為垃圾信件,請注意。
Step 4. 點選認證信件中網址啟動服務。
Step 5. 點選認證網址後回到 LINE Notify 登錄服務頁面。
這時就可以見到申請好的Client ID,基本上一個人可以申請多個Client ID,再點選圖片進到裡面查看個人詳細內容。
Step 6. Client ID是要用來取得用戶端Token,將Client ID與註冊用到「CallbackURL」一起帶入以下HTML程式碼,並存成 index.php。
<html> | |
<head> | |
<title>連結到LineNotify</title> | |
<meta charset="big-5" /> | |
<script> | |
function oAuth2() { | |
var URL = 'https://notify-bot.line.me/oauth/authorize?'; | |
URL += 'response_type=code'; | |
URL += '&client_id=AkGjwZTlY8VUJ63CQVhkor'; | |
URL += '&redirect_uri=http://localhost:8080/index.php'; | |
URL += '&scope=notify'; | |
URL += '&state=abcde'; | |
window.location.href = URL; | |
} | |
</script> | |
</head> | |
<body> | |
<button onclick="oAuth2();">連結到LineNotify按鈕</button> | |
</body> | |
</html> |
執行以上 index.php 程式碼需要php的環境,若是為了要執行以上程式碼要大家安裝去Apache 與php,將是一件大工程,筆者這裡推薦一個簡易版的伺服器系統:Usbwebserver,大家可以去官網下載無須安裝、操作簡易、容易擴充、方便使用、檔案大小約82 MB一個隨身碟即可帶著走,使用教學。
Step 8. 選擇用戶端,並點選同意與連動按鈕。
觀察Line,此時會出現 LINE Notify 帳號作為通知,如果有成功到這一步地顯示,表示已成功串起 LINE Notify 服務。
PS:如果用戶端沒有加入 LINE Notify 帳號,將不會收到任何通知訊息。
Step 9. 在點選同意與連動按鈕後,網頁會回到「CallbackURL」的頁面,這時取出URL上的Code,藉由這個Code來取出用戶端的Token。
Step 10. 使用Postman傳送參數到 https://notify-bot.line.me/oauth/token 取回Token。
填入以下參數
URL:https://notify-bot.line.me/oauth/token
Key:grant_type、Value:authorization_code
Key:code、Value:Step 9.的Code
Key:redirect_uri、Value:Step 2.的redirect_uri
Key:client_id、Value:Step 5.的client_id
Key:client_secret、Value:Step 5.的client_secret
PS:這裡的POST要指定application/x-www-form-urlencoded。
Step 11. 使用Postman,在Headers中Header:Authorization、Value:Step 10.的Token、傳送訊息message帶入傳送的訊息,將這些內容傳送到 https://notify-api.line.me/api/notify 給LINE Notify 發送訊息。
form-data模式
application/x-www-form-urlencoded模式
PS:
- Token前面一定要加 "Bearer " 空格一定要在,不然無法 LINE Notify 發送訊息。
- 這裡的POST指定form-data或application/x-www-form-urlencoded。
到此各位應該都可以順利完成所有步驟了,有了這樣的基礎,後續透過程式傳送資訊就應該不成問題。
結論:
- 最後取得用戶端 Token後,就可以對此Token發送文字、圖片等的訊息,中間可以不用再使用Code取Token的動作。
- LINE Notify 登錄服務頁面的URL,後續都可以修改,但請記住如果要做為後續服務,就必須要有一個度定Web Server來運作,主因還是要取得其他用戶端的Token。
- 需要一個24小時能在線上執行網頁的Web Server。
- 有了以上的觀念後,就可以使用多種程式語言來做到 Line Notify ,如Excel VBA、VB .net、Python、Perl、C#、C++、R、Ruby、go等。
訂閱:
文章 (Atom)