BRIGHT VIE Advent Calendar 2017 - Qiita 3æ¥æ åœã®ç€ŸäŒäºº6å¹Žç® @megadreams14 ã§ãã
æšæ¥ã¯åŒç€Ÿç€Ÿé·ã®å!æçš¿èšäº ãIonicPageæ¡çšæã®HTMLã¿ã°æ¡åŒµ(Custom Components)å®è£ ã«ã€ã㊠(1/2)ã ã§ãããã
ãã䌌ãç»é¢æ§æãããŒããªã©ãCustom Componentsã«ãã£ãŠå
±éåããããšã§ãããéçºå¹çãäžããããã§ããïŒ
次åãå®éã«Custom Componentsã远å ããæé ã®èšäºã楜ãã¿ã§ãã
JavaScriptã§ãã€ããªããŒã¿ïŒïŒ
åŒç€Ÿã§ã¯ãAngularãšCordovaãããŒã¹ãšãªã£ãIonicãå©çšããŠã¢ããªã®éçºãè¡ã£ãŠããã
ãã®éã«Bluetoothãå©çšããŠããã€ã¹ãšé£æºããæ©èœã®éçºãè¡ãããšãããã
ãã€ããªããŒã¿ãJavaScriptã§æ±ãå¿
èŠããã£ãã®ã§ããã®ãšãã®éçºã¡ã¢ãšãªããŸãã
ãªããBluetoothããååŸããããŒã¿ã®è§£æã¿ãããªéšåã¯ææ¥ä»¥éã®èšäºã§å·çããããšæã£ãŠããã
ãŸããIonicã§ã®Bluetoothãæ±ãæ¹æ³ã¯ããIonic Advent Calendar 2017 - Qiitaãã§åŸæ¥å·çããäºå®ã§ãã®ã§ããã¡ãã®èšäºããæ¥œãã¿ã«ïŒ
åæç¥è
ã¡ã¢ãªåäœ
ã¡ã¢ãªäžã§ã¯ã8ããã=1ãã€ãã®åäœã§ç®¡çãããŠããã
2鲿°è¡šèšã§8æ¡ã§å
éšç¶æ
ã衚çŸããããããŠãããŸãã
äŸãã°ãã10ãã50ãã100ãã®ç¶æ ãå³ã«è¡šããšããããäžèšã®ããã«ãªããŸãã
2,10,16鲿°ã«ã€ããŠã¯äžèšã®èšäºãåãããããããã§ãã
ãå³è§£ã 2鲿°ïŒ10鲿°ïŒ16鲿°ã倿ããçºã®èšç®æ¹æ³ïŒ
å
ãŸããæ°å€ãæ±ãéã«ã¯ã
- äœãããã§ç®¡çããã®ãïŒ (8ããã?, 16ããã?, 32ããã?)
- 笊å·ã¯ããã®ïŒãªãã®ïŒ ïŒæ£ã®æ°(+)ã ã衚ãã®ïŒ è² ã®æ°(-)ã衚ãã®ïŒïŒ
- æŽæ°å€ã ãïŒå°æ°ç¹ãæ±ãã®ïŒ ïŒæŽæ°å€ã§ç®¡ç?ãæµ®åå°æ°ç¹ã§ç®¡ç?ïŒ
ãªã©ãªã©ãæ±ãããããŒã¿ã®ç¯å²ã«åãããŠä¿åãã圢åŒãéžã¶ããšãå¯èœã§ãã
äŸ) æŽæ°åã®äžèЧ
| ãµã€ãº | ç¯å² |
|---|---|
| 笊å·ä»ã 8 ãããæŽæ° | -128 ïœ 127 |
| 笊å·ä»ã 16 ãããæŽæ° | -32,768 ïœ 32,767 |
| 笊å·ä»ã 32 ãããæŽæ° | -2,147,483,648 ïœ 2,147,483,647 |
| 笊å·ä»ã 64 ãããæŽæ° | -9,223,372,036,854,775,808 ã 9,223,372,036,854,775,807 |
| 笊å·ãªã 8 ãããæŽæ° | 0 ïœ 255 |
| 笊å·ãªã 16 ãããæŽæ° | 0 ïœ 65,535 |
| 笊å·ãªã 32 ãããæŽæ° | 0 ïœ 4,294,967,295 |
| 笊å·ãªã 64 ãããæŽæ° | 0 ïœ 18,446,744,073,709,551,615 |
JavaScriptã§ãã€ããªåœ¢åŒã®æ°å€ãæ±ãå Žå
JavaScriptã§ã¯ãäžèšã®ããŒã¿åœ¢åŒãæ±ãããã«åŸã»ã©èª¬æãã
DataViewã¯ã©ã¹ã®ã®getter/setterã¡ãœãããšããŠäžèšã®ãããªãã®ããããŸãã
| æå³ | getterã¡ãœãã | setterã¡ãœãã | |
|---|---|---|---|
| Int8 | 笊å·ä»ã 8ãããæŽæ°ãæ±ã | getInt8 | getInt8 |
| Int16 | 笊å·ä»ã16ãããæŽæ°ãæ±ã | getInt16 | getInt16 |
| Int32 | 笊å·ä»ã32ãããæŽæ°ãæ±ã | getInt32 | getInt32 |
| Uint8 | 笊å·ãªã 8ãããæŽæ°ãæ±ã | getUint8 | getUint8 |
| Uint16 | 笊å·ãªã16ãããæŽæ°ãæ±ã | getUint16 | getUint16 |
| Uint32 | 笊å·ãªã32ãããæŽæ°ãæ±ã | getUint32 | getUint32 |
| Float32 | 32ãããæµ®åå°æ°ç¹æ°ãæ±ã | getFloat32 | setFloat32 |
| Float64 | 64ãããæµ®åå°æ°ç¹æ°ãæ±ã | getFloat64 | setFloat64 |
ãªã©ãæºåãããŠããŸãã
ãã€ããªãŒããŒ
ä»ã«ã2ãã€ã以äžã®æ°å€ãã¡ã¢ãªäžã«æ ŒçŽããæã®äžŠã³é ã衚ããã€ããªãŒããŒãšåŒã°ãããã®ãããã
ã¡ã¢ãªäžã«äžäœãã€ãããé ã«æ ŒçŽãããããã°ãšã³ãã£ã¢ã³æ¹åŒããš
äžäœãã€ãããé ã«æ ŒçŽããããªãã«ãšã³ãã£ã¢ã³æ¹åŒã
ã®2çš®é¡ã®æ¹åŒããããŸãã
ããããã®ãã€ããªãŒããŒã«ã¯ãã¡ãªããã»ãã¡ãªããããããŸããããã§ã¯è©³ãã説æã¯ããã
ãŸãã¯ããã»ããµã«ãã£ãŠå€åããããæ±ããã€ããªããŒã¿ã®ä»æ§æžãªã©ã確èªããŠèŠãŠäžããã
- åè
å®éã«JavaScriptã§æ±ã£ãŠã¿ã
JavaScriptã§ãã€ããªãæ±ãããã«ã¯ããArrayBufferããDataViewããTypedArrayãã®3çš®é¡ã®ä»æ§ããããŸãã
ç°¡åã«èª¬æãããšäžèšã®ããã«ãªããŸãã
- ArrayBuffer
- ç©çã¡ã¢ãªäžã«é åã確ä¿ããããã®ã¯ã©ã¹
- ãã®ã¯ã©ã¹ã§ã¯ã確ä¿ããã®ã¿ã§ããããã¡ã«å¯ŸããŠããŒã¿ãã»ãããããèªã¿åºãæäœã¯åºæ¥ãªã
- ãããã¡ã«å¯ŸããŠããŒã¿ãæäœããã«ã¯ããTypedArrayãããDataViewããå©çšãã
- TypedArray
- åãæå®ããŠãããã¡ããé åãçæãã
- éåžžã®é åã®ããã«ãããã¡ã«ã¢ã¯ã»ã¹å¯èœ
- ãé«éãã«èªã¿æžããåºæ¥ã
- DataView
- TypedArrayããã髿©èœãªã¯ã©ã¹
- ãã€ãæ°ãé©åã«èšå®åºæ¥ã䟿å©ãªæ©èœãåãã£ãŠãã
- åè¿°ãããUint32ãã Float64 ãç°¡åã«æ±ãããšãåºæ¥ã
詳现ã¯äžèšèšäºãããããããã§ãã
[JavaScript] ArrayBufferã«ã€ããŠèª¿ã¹ãŠã¿ã)
ä»åã¯ãArrayBufferãšDataViewãå©çšããŠãã€ããªããŒã¿ãæäœããŠã¿ãŸãã
ã¡ã¢ãªã確ä¿ãããŒã¿ãã»ãã
仿¥ã¯ã12æ3æ¥ãªã®ã§ãæ°åã®12ãš3ãããããã¡ã¢ãªäžã«ä¿åããŠã¿ãŸãã
å³ã«ãããšäžèšã®ãããªåœ¢ã§ãã
ä»åã¯ç¬Šå·ãªãã§ããŒã¿ãæ±ããŸãããã®ãããäžèšãããã°ã©ã ã§èšèŒãããš
// 1ãã€ã(8ããã) + 1ãã€ã(ããã) = 2ãã€ã(16ããã)ã®ãããã¡é åã確ä¿
let buffer = new ArrayBuffer(2);
// ãããã¡ã«å¯ŸããŠããŒã¿ã®æžã蟌ã¿ãåºæ¥ãããã«DataViewã¯ã©ã¹ãåæå
let dv = new DataView(buffer);
// DataViewã«ããŒã¿ãã»ããããã«ã¯ãsetXXX ã¡ãœãããå©çšããã
// XXXã«ã¯ãæ±ãããã¡ã¢ãªäžãžã®ä¿å圢åŒã«ãã£ãŠå€æŽãã
// ä»åã¯ã笊å·ãªã 8ãããæŽæ°ããæ±ã£ãŠãããã setUint8 ãå©çšãã
// 1ãã€ãç®ã«12ãã»ãã
dv.setUint8(0, 12);
// 2ãã€ãç®ã«3ãã»ãã
dv.setUint8(1, 3);
DataViewã®ã»ãã¿ãŒã¯ãäœãã€ãç®ããèšé²ããã®ãã®ãã€ããªãã»ãããšèšå®ãããå€ãåŒæ°ã«æž¡ãããšã§ä¿åããããšãåºæ¥ãŸãã
ãŸãå®éã«åãåºããšãã«ãã»ããããä¿å圢åŒã«åãããŠããŒã¿ãååŸããããšã§ãã€ããªããŒã¿ãåãåºãããšãåºæ¥ãŸãã
// 1ãã€ãç®ã«èšå®ããå€ãååŸãã
let month = dv.getUint8(0);
console.log(month); // 10鲿°ã§ã 12ã衚瀺ããã
console.log(month.toString(2)); // 2鲿°ã§ã1100ã衚瀺ããã
// 2ãã€ãç®ã«èšå®ããå€ãååŸãã
let day = dv.getUint8(1);
console.log(day); // 10鲿°ã§ã 3ã衚瀺ããã
console.log(day.toString(2)); // 2鲿°ã§ã 11ã衚瀺ããã
æ¥ä»ããã€ããªããŒã¿ã§ä¿åããŠã¿ã
äžèšã«ç¶ããŠä»æ¥ã®æ¥ä»ããã€ããªããŒã¿ã§æ±ã£ãŠã¿ãŸãããã
Bluetoothã®ããŒã¿ãæ±ããšããåèã«ãã€ã€ã
ä»åã¯æ¥ä»ã®ä¿å圢åŒã®ä»æ§ãäžèšãšããŸãã
| éå§ãã€ãäœçœ® | é
ç® | ãã€ãæ° | åœ¢åŒ |ãã€ããªãŒã㌠|
|:-:|:-:|:-:|:-:|:-:|:-:|
| 0 | 幎 | 2ãã€ã | 笊å·ãªãæŽæ° | ãªãã«ãšã³ãã£ã¢ã³ |
| 2 | æ | 1ãã€ã | 笊å·ãªãæŽæ° | - |
| 3 | æ¥ | 1ãã€ã | 笊å·ãªãæŽæ° |- |
å³ã«è¡šããšãã®ãããªåœ¢ã§ä¿åãããããšã«ãªããŸãã
ããã ãèŠããšåãé£ãããã§ãããJavaScriptã§äžèšãå®çŸããæ¹æ³ã¯ä»¥å€ãšç°¡åã§ãã
// 4ãã€ãåã®ãããã¡é åã確ä¿
let buffer = new ArrayBuffer(4);
// ãããã¡ã«å¯ŸããŠããŒã¿ã®æžã蟌ã¿ãåºæ¥ãããã«DataViewã¯ã©ã¹ãåæå
let dv = new DataView(buffer);
// 1. 幎ïŒ2017ïŒãä¿åããŠã¿ã
// - æ±ãããŒã¿ã¯ã笊å·ãªã16ãããæŽæ°ããªã®ã§ãUint16ã䜿ããŸã
// - ãŸããã€ããªãŒããŒã¯ãããªãã«ãšã³ãã£ã¢ã³ããªã®ã§ãsetUint16ã®ç¬¬ïŒåŒæ°ã«trueãæž¡ã
dv.setUint16(0, 2017, true);
// 2, æïŒ12ïŒãä¿åãã
// - æ±ãããŒã¿ã¯ã笊å·ãªã8ãããæŽæ°ããªã®ã§ãUint8ã䜿ããŸã
// - 幎ã§2ãã€ãå©çšããŠããã®ã§ãæã®ä¿åã¯3ãã€ãç®ããã§ãã
dv.setUint8(2, 12);
// 3, æ¥ïŒ3ïŒãä¿åãã
// - æ±ãããŒã¿ã¯ã笊å·ãªã8ãããæŽæ°ããªã®ã§ãUint8ã䜿ããŸã
// - 4ãã€ãç®ã«ä¿åããã®ã§ãé
åã®æ·»åã¯3ãæå®ããŸãã
dv.setUint8(3, 3);
ãªããšãã£ãã®5è¡ã§åºæ¥ã¡ãããŸããã
æåäœãç¥ããªãç¶æ
ã®ãšãã¯ããããæŒç®ãšããããªãããã®ãããŒãšæã£ãŠããŸãããã
JavaScriptãããã€ããªããŒã¿ã®æ±ãã«åªããæ°ãããŸããïŒä»ã®èšèªãåããããããªãã§ãã...ïŒ
æ¬åœã«æ£ããããŒã¿ãä¿åãããŠããã®ããã€ããªããŒã¿ã®äžèº«ãèŠããŠã¿ãŸãããã
ïŒæ¯èŒå¯Ÿè±¡ã¯èª¬æå³ã®ãããª2鲿°ã®æ°å€ã®äžŠã³ã«ãªã£ãŠããã°OKã§ãïŒ
// 1ãã€ããã€ã©ã®ãããªæ°å€ã®äžŠã³ã«ãªã£ãŠããã2鲿°ã§èŠãŠã¿ã
console.log(dv.getUint8(0).toString(2)); // åºå: 11100001
console.log(dv.getUint8(1).toString(2)); // åºå: 00000111
console.log(dv.getUint8(2).toString(2)); // åºå: 00001100
console.log(dv.getUint8(3).toString(2)); // åºå: 00000011
ã¯ããå³ã®ããã«ãªã£ãŠããŸããïŒ
ãªããã®ãã€ããªããŒã¿ããæ£ããæ¥ä»ã§ããŒã¿ã10鲿°ã§åãåºãã«ã¯ãäžèšã®ããã«ããã°å¯èœã§ãã
// getterã®å Žåããã€ããªãŒããŒããªãã«ãšã³ãã£ã¢ã³ã®å Žåã¯ç¬¬2åŒæ°ã«trueãæž¡ã
let year = dv.getUint16(0, true);
console.log(year); // 10鲿°ã§ã2017 ã衚瀺ããã
let month = dv.getUint8(2);
console.log(month); // 10鲿°ã§ã 12ã衚瀺ããã
let day = dv.getUint8(3);
console.log(day); // 10鲿°ã§ã 3ã衚瀺ããã
ãŸãšã
髿 ¡çã®ãšãã«åçŽã·ã¹ã¢ãïŒä»ã¯ITãã¹ããŒãããªïŒãååŸããéã«å匷ããããšãä»ã«ãªã£ãŠããªã圹ç«ã£ããšããæãã§ããïŒ
ãã®ããããæã£ãŠãã以äžã«JavaScriptã§ãã€ããªããŒã¿ãæ±ãããšãç°¡åã§ãããä»ã®èšèªã£ãŠã©ããªã®ã ãããšããã®ãæ°ã«ãªããŸããã
å®éã¯ãããã°ã©ã èšèªãããããã€ããªãŒããŒã笊å·ãããªããªã©ã®æŠå¿µãçè§£ã§ããŠããã°ãæ¯èŒçã¹ã ãŒãºã«çè§£ã§ããã®ãããããŸãããã
ããŠãææ¥ã¯ãæµ®åå°æ°ç¹ãå®éã«IEEEã§å®ããããŠããBluetoothã®ä»æ§ãå ã«ãã€ããªããŒã¿ãJSã§æ±ã£ãŠã¿ãããšæããŸãã