Every piece of all creatures in this freezing world, are racing for freedom.
由于serialport里面有一些原生编译的代码需要运行node-gyp提前build一下, 而node-gyp使用的node V8引擎版本与electron的V8引擎版本不同, 导致直接在node中可以require('serialport'),而在electron中却不行. 在electron中报错如下:var SP = require('serialport') C:\r\electron\macgetter\node_modules\bindings\bindings.js:83 Uncaught Error: A dynamic link library (DLL) initialization routine failed. \\?\C:\r\electron\macgetter\node_modules\serialport\build\Release\serialport.node at Error (native) at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:168:20) at Object.Module._extensions..node (module.js:583:18) at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:168:20) at Module.load (module.js:473:32) at tryModuleLoad (module.js:432:12) at Function.Module._load (module.js:424:3) at Module.require (module.js:483:17) at require (internal/module.js:20:19) at bindings (C:\r\electron\macgetter\node_modules\bindings\bindings.js:76:44)module.(anonymous function) @ ELECTRON_ASAR.js:168Module._extensions..node @ module.js:583module.(anonymous function) @ ELECTRON_ASAR.js:168Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20bindings @ C:\r\electron\macgetter\node_modules\bindings\bindings.js:76(anonymous function) @ C:\r\electron\macgetter\node_modules\serialport\lib\bindings.js:3Module._compile @ module.js:556Module._extensions..js @ module.js:565Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20(anonymous function) @ C:\r\electron\macgetter\node_modules\serialport\lib\serialport.js:12Module._compile @ module.js:556Module._extensions..js @ module.js:565Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20(anonymous function) @ VM133:1 查找了一些相关文档, 如下: electron使用serialport Using node-serialport in an electron appnode-serialport的官方回答, 看下面voodootikigod的回答: Tracking Electron support #538electron的官方回答: Using Native Node Modules先实践着...
原文链接%YAML 1.1 # Reference card --- Collection indicators: '? ' : Key indicator. ': ' : Value indicator. '- ' : Nested series entry indicator. ', ' : Separate in-line branch entries. '[]' : Surround in-line series branch. '{}' : Surround in-line keyed branch. Scalar indicators: '''' : Surround in-line unescaped scalar ('' escaped '). '"' : Surround in-line escaped scalar (see escape codes below). '|' : Block scalar indicator. '>' : Folded scalar indicator. '-' : Strip chomp modifier ('|-' or '>-'). '+' : Keep chomp modifier ('|+' or '>+'). 1-9 : Explicit indentation modifier ('|1' or '>2'). # Modifiers can be combined ('|2-', '>+1'). Alias indicators: '&' : Anchor property. '*' : Alias indicator. Tag property: # Usually unspecified. none : Unspecified tag (automatically resolved by application). '!' : Non-specific tag (by default, "!!map"/"!!seq"/"!!str"). '!foo' : Primary (by convention, means a local "!foo" tag). '!!foo' : Secondary (by convention, means "tag:yaml.org,2002:foo"). '!h!foo': Requires "%TAG !h! <prefix>" (and then means "<prefix>foo"). '!<foo>': Verbatim tag (always means "foo"). Document indicators: '%' : Directive indicator. '---': Document header. '...': Document terminator. Misc indicators: ' #' : Throwaway comment indicator. '`@' : Both reserved for future use. Special keys: '=' : Default "value" mapping key. '<<' : Merge keys from another mapping. Core types: # Default automatic tags. '!!map' : { Hash table, dictionary, mapping } '!!seq' : { List, array, tuple, vector, sequence } '!!str' : Unicode string More types: '!!set' : { cherries, plums, apples } '!!omap': [ one: 1, two: 2 ] Language Independent Scalar types: { ~, null } : Null (no value). [ 1234, 0x4D2, 02333 ] : [ Decimal int, Hexadecimal int, Octal int ] [ 1_230.15, 12.3015e+02 ]: [ Fixed float, Exponential float ] [ .inf, -.Inf, .NAN ] : [ Infinity (float), Negative, Not a number ] { Y, true, Yes, ON } : Boolean true { n, FALSE, No, off } : Boolean false ? !!binary > R0lG...BADS= : >- Base 64 binary value. Escape codes: Numeric : { "\x12": 8-bit, "\u1234": 16-bit, "\U00102030": 32-bit } Protective: { "\\": '\', "\"": '"', "\ ": ' ', "\<TAB>": TAB } C : { "\0": NUL, "\a": BEL, "\b": BS, "\f": FF, "\n": LF, "\r": CR, "\t": TAB, "\v": VTAB } Additional: { "\e": ESC, "\_": NBSP, "\N": NEL, "\L": LS, "\P": PS } ...
软件程序为了描述数据不遗余力有多重方式, 早期windows上有.ini文件, linux上有.conf文件. 后来.xml几乎成为了标配, 以及从.xml衍生的apple格式.plist. xml衍生自html, 刚刚出来的时候大家都很兴奋, 确实在一段时间内几乎成为了一统江湖的格式. 然而xml与html不同的是, 在html中标签名称都比较简单短小, xml描述数据后key根据不同软件要求变得复杂, 前后一个括号将key写两遍变得很臃肿, key+value一共得占用三行,篇幅大阅读性也不够好. 后来json出来了, 大家就又松了口气, 舒服多了, key+value一行就够了, 写起来也舒服. 而现在yaml是要比json写更少内容的了. 甚至连大括号中括号都不用, 逗号也不用, 引号也不用, 所占用的行也没有了.# 注释 name: John Smith age: 37 spouse: name: Jane Smith age: 25 children: - name: Jimmy Smith age: 15 - name: Jenny Smith age 12 从内容上看起来让人想到了python和markdown. 使用缩进, 描述语言更容易阅读. 上面这段包含了key value关系, 层次关系, 列表(数组)关系. 对比json: 用缩进替代大括号表示层次关系, 这是python的手段; 用回车替代逗号表示不同元素, 这也是python的手段 继承了json使用冒号分隔key和value的方式 用减号替代方括号表示列表, 这是markdown的方式 注释使用井号#, 这是python的方式 字符串断行使用反斜杠\, 这与js是相同的. 最有趣的是, 如果你想在一行里面写多个元素, 你还可以使用js的[],{}语法 --- - [name , hr, avg ] - [Mark McGwire, 65, 0.278] - [Sammy Sosa , 63, 0.288] --- Mark McGwire: {hr: 65, avg: 0.278} Sammy Sosa: { hr: 63, avg: 0.288 } 还有个比json强大的地方, 可以使用&定义常量并在后面使用星号*引用, 如 name: &JS Jhon Smith nameagain: *JS 有一个现在不太明白怎么用的, 就是使用三减号---分隔不同文档,使用三点...终结文档. 这样可以在一个文档里描述多个文档, 干嘛用? spec里说用在通信频道上?不清楚列 非常神奇的是, 可以使用一个复杂的对象作为key,而不是仅限于string, 这时候key需要以问号?开头 ? - Detroit Tigers - Chicago cubs : - 2001-07-23 ? [ New York Yankees, Atlanta Braves ] : [ 2001-07-02, 2001-08-12, 2001-08-14 ] 对于value的类型,常见的类型是自动判断的 number: 123 float: 123.13 string: something is something string2: "123" bool: true canonical: 2001-12-15T02:59:43.1Z iso8601: 2001-12-14t21:59:43.10-05:00 spaced: 2001-12-14 21:59:43.10 -5 date: 2002-12-14 其他复杂的类型, 有些需要!!说明, 其他需要编程语言自己搞定. 通常是在key后面加叹号描述类型 --- not-date: !!str 2002-04-28 picture: !!binary | R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs= application specific tag: !something | The semantics of the tag above may be different for different documents. # Sets are represented as a # Mapping where each key is # associated with a null value --- !!set ? Mark McGwire ? Sammy Sosa ? Ken Griff %TAG ! tag:clarkevans.com,2002: --- !shape # Use the ! handle for presenting # tag:clarkevans.com,2002:circle - !circle center: &ORIGIN {x: 73, y: 129} radius: 7 - !line start: *ORIGIN finish: { x: 89, y: 102 } - !label start: *ORIGIN color: 0xFFEEBB text: Pretty vector drawing. # Ordered maps are represented as # A sequence of mappings, with # each mapping having one key --- !!omap - Mark McGwire: 65 - Sammy Sosa: 63 - Ken Griffy: 58
需要预先安装如下工具: python2.x, npm, visual studio. npm需要安装工具node-pre-gyp和node-gypnpm install -g npm-pre-gyp npm install -g npm-gyp 在项目中npm install serialport 哦, 每次装到最后都不显示任何信息了.... 如果这时候require('serialport'),会出现这个错误:C:\r\electron\macgetter\node_modules\bindings\bindings.js:91 throw err ^ Error: Could not locate the bindings file. Tried: → C:\r\electron\macgetter\node_modules\serialport\build\serialport.node → C:\r\electron\macgetter\node_modules\serialport\build\Debug\serialport.node → C:\r\electron\macgetter\node_modules\serialport\build\Release\serialport.node → C:\r\electron\macgetter\node_modules\serialport\out\Debug\serialport.node → C:\r\electron\macgetter\node_modules\serialport\Debug\serialport.node → C:\r\electron\macgetter\node_modules\serialport\out\Release\serialport.node → C:\r\electron\macgetter\node_modules\serialport\Release\serialport.node → C:\r\electron\macgetter\node_modules\serialport\build\default\serialport.node → C:\r\electron\macgetter\node_modules\serialport\compiled\5.2.0\win32\x64\serialport.node at bindings (C:\r\electron\macgetter\node_modules\bindings\bindings.js:88:9) at Object.<anonymous> (C:\r\electron\macgetter\node_modules\serialport\lib\bindings.js:3:35) at Module._compile (module.js:399:26) at Object.Module._extensions..js (module.js:406:10) at Module.load (module.js:345:32) at Function.Module._load (module.js:302:12) at Module.require (module.js:355:17) at require (internal/module.js:13:17) at Object.<anonymous> (C:\r\electron\macgetter\node_modules\serialport\lib\serialport.js:12:25) at Module._compile (module.js:399:26) 根据网上的解决方案:进入项目目录C:\r\electron\macgetter>cd node_modules\serialport C:\r\electron\macgetter\node_modules\serialport>node-gyp rebuild 输出一堆信息......最后 gyp info ok 然后就可以了.
cocos creator WebSocket在web与android上的一点小区别.
通过如下命令建立WebSocket连接.ws = new WebSocket('ws://' + WS_SERVER) 常常需要判断ws.readyState是否处于OPEN状态, 然后决定是否要进行操作. 然而, 对OPEN等几个常量的调用, 在Android与Web上有不同. 例如, 在Web上, 调用 ws.OPEN, 则值为1, 在Android上则为undefined. 所以在这儿一定要使用WebSocket.OPEN, 无论Web还是Android都是1.
假如xxx为app名 确定已经用debug模式完成编译, 生成了xxx_debug.apk文件. 确定已经可以使用vscode调试模拟器. USB连接手机, 在手机上安装xxx_debug.apk 使用adb运行此APP. 命令为: adb shell am start -n "org.cocos2d.xxx/org.cocos2dx.javascript.AppActivity" 你此时应看到APP已经在手机上运行. adb转发端口 adb forward tcp:5086 tcp:5086 vscode开启调试模式, 查看console是否连接成功. ar: attachRequest: address: localhost port: 5086 ar: attachRequest: retry socket.connect ar: attachRequest: connected 开始打断点调试. 使用adb logcat 和findstr过滤输出信息 adb logcat | findstr "cocos"注意, 魅族手机的开发者选项中, 默认只输出部分log,需要在开发者选项中打开全部log 的输出.
以windows为例: 1. USB连接手机, 确认打开USB调试模式. 2. 找到USB KEY ID. 打开: 设备管理器->Android Phone->Android Composite ADB Interface->详细信息->属性->硬件Id 看到值为如下:USB\VID_7A98&PID_0C02&REV_????&MI_01 USB\VID_7A98&PID_0C02&MI_01 7A98即为ID 3. 进入 "C:\Users\YourUsername.android" 目录. 确定是这个目录的方式是, 其中有adbkey.pub和adbkey文件. 4. 在此目录中新建文件adb_usb.ini文件, 内容为:0x7A98 也就是写入id, 保存. 5. 再次查看adb devices,应该已经可以看到了
JS的布尔运算返回的不一定是布尔值
布尔运算有三种, 与或非. 在C中, 布尔运算一定会返回布尔值. 在JS中却不同, 只有"非"运算一定会返回布尔值, "与或"都不一定返回布尔值.a && b 与运算:a为false/NaN/undefined/null/0/""时, 则返回a; a不为以上值,如true/Object/"0" 则返回b; 注意, "0"被认为是true, ""被认为是false.a || b 或运算:和&&相反, a不为false/NaN/undefined/null/0/""时, 则返回a;其他情况返回b;
貌似这个简单的操作会有无数种不同的方法. 使用Object.assign var clone = Object.assign({}, obj);这个方法貌似是新的js中支持的, 会有兼容性问题. 那么还有其他方法: y = _.clone(x); 这个是用的underscore库. y = JSON.parse(JSON.stringify(x)) var bill = $.extend(true, {}, bob); 这是用的jquery库. 使用Object.create,但这并非真正的clone,而是继承. y = Object.create(x); 其他 其他方法中最重要的就是自己写一个function, 去iterate key并且赋值.参考: (How do I correctly clone a JavaScript object?)[http://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object] (4 CREATIVE WAYS TO CLONE OBJECTS)[http://heyjavascript.com/4-creative-ways-to-clone-objects/] (Deep copy Javascript objects)[https://webdevwonders.com/deep-copy-javascript-objects/]