一般滑雪场都在郊区, 从起床到进入雪场, 一般需要至少3小时, 雪场开始营业的时间是早8点左右, 结束是一般下午4 5点种, 中间可能需要在雪场用餐. 这个时间要计算好, 免得玩的不够尽兴.
滑雪多数时间是在上山, 途径拖牵, 缆车, 传送带(也叫魔毯). 滑下速度很快, 没有太多消耗体力的地方, 一般体能也能持续很长时间, 只要休息好了.
如果赶到人流多的时候, 在进入, 领服装, 雪鞋, 雪板, 换服装也会消耗很多时间.
雪场一般都有餐厅, 价格不算很便宜, 不过附近一般也没什么地方有卖吃的, 有条件的话自己带吃喝.
不能吃太饱, 差不多吃吃就行了, 运动前的常识, 吃完不宜立即剧烈运动.
带上一些高能量食品, 如巧克力, 如果饿了可以先垫点.
带上水杯, 雪场有温水, 也可以自己带水. 水喝多了没事, 雪场应该有卫生间, 一般在雪道底部一侧. 刚进雪场的时候可以先踩踩点, 熟悉周边设施.
内衣最好是透湿, 有弹性, 保暖还行的内衣, 滑雪是持续运动中, 只要吃够了, 外套防风 防水, 基本不会有冷的感觉, 滑完之后可以加件保暖夹层. 贴身不要穿纯棉的, 吸汗之后会湿, 容易着凉.
我穿的是 迪卡依Equarea面料的上身和下身, 保暖一般, 滑雪不感觉到冷, 不活动的时候再加件抓绒上衣, 我穿的是 迪卡依Stratermic面料的抓绒衣.
中间夹层一般建议穿背心, 不会影响到手臂的活动, 温度合适的话, 可以不用加背心. 背心一般是填充的羽绒.
也可以是类似冲锋衣内胆哪种抓绒衣物, 保暖程度主要考虑当天的气温如何.
外套主要是要防风和防水, 能保暖也行, 就可以少穿一件保暖夹层, 如果自己有冲锋衣裤也可以, 手脚和腰是缩口的最好, 防止摔倒之后进雪. 雪场也有滑雪服租用, 一般团购的票里面就带有滑雪服租用费.
不建议在日常外套外面穿滑雪服, 会十分影响四肢活动, 而且还可能太热.
一般滑雪服都使用尼龙魔术贴固定的, 租用的可能魔术贴老化而贴不牢, 可以考虑带条腰带, 比较宽, 有一些弹性, 对运动影响小最好. 如果有战术腰带也可, 方便下文要说的腰包. 衣服口袋都是拉链, 可以看看口袋是不是完好, 必要的话可以要求调换.
雪靴一般都比较硬, 加上持续的活动, 建议至少穿两双袜子.
即使在无风的天气, 下滑的速度也会产生挺大的风, 最好能对耳朵保护下, 还能有一定的保暖, 可以减少大量的热量消耗.
一般如抓绒帽, 线帽都可以, 防风 不吸水的为主.
我的是这个围脖, 将收缩绳拉上就是个帽子了, 有长发的女孩子还可以把长发从缩口中拉出来, 滑行中更有型.
不带手套的话, 手会很快冻僵, 摔倒沾到雪, 湿了之后就更容易冻伤, 所以最好有手套, 依旧是防水 防风的, 毛线手套空隙太大的不行, 会透风, 下滑时风会进入手套. 手套最好能方便挂到手上或脖子上, 避免丢失. 我的是这个手套.
如果是初级滑道, 当天也没有风的话是没必要考虑眼镜, 后面的中级滑道就需要眼镜了, 主要是挡风, 不然滑下时风太大, 会流眼泪, 影响视野. 滑雪镜和前面几个的不太一样的是, 基本没什么别的场合可以使用(除非在东北, 大风下雪天气), 可以考虑租用滑雪镜. 如果有畏光, 雪盲, 看到大量雪会难受则一定要找个滑雪镜. 不建议传统太阳镜, 摔倒脱落的话有可能伤到眼睛. 滑雪镜不是潜水镜, 周围是海绵垫着的, 不会对眼球产生负压.
如果受不了迎风直接吸冷风, 则还需要口罩, 或者是围巾, 能对直接刮来的冷风有点削减的就行.
总结起来就是:
建议把平时多数随身物品都存上, 免得滑雪中掉落, 可以随身携带的有:
水可以放寄存柜, 需要的话回来开柜取出来.
最简单的就是把所有东西都放到滑雪服的拉链口袋, 切记用完后要拉好拉链, 防止掉落.
如果东西多可以考虑用一个贴身的小双肩背包, 防水, 能在腰间绑一圈固定的最好.
如果对滑雪服的拉链口袋不满意, 可以用腰包, 一般军品店哪种战术腰带也行, 可以根据需要挂接腰包模块, 足够放手机和钥匙就行, 腰包一定要可靠, 不能中途物品掉落.
雪板和雪鞋可能会不匹配, 拿到之后建议在原地试试, 是否能卡紧, 卡不紧可以要求调整或者调换. 顺便了解下怎么脱离雪板, 然后在进入雪场.
一般雪板都是可以摔倒自动脱离, 正常的脱离是用雪杖扎到卡住雪鞋后跟哪个机关的小凹坑上, 使劲压, 可能需要双手压, 脚后跟就能起来了. 如果有同伴就让同伴用雪鞋帮踩压哪个机关.
领取这些东西一般会有一个领用凭据之类的, 这个要保存好, 最好随身携带. 雪板和雪杖不要丢失, 会扣钱的. 有些雪杖前面的帽会脱落, 能换个好点的就换吧.
雪场一般有雪板和雪杖的寄存处, 应该是免费的, 需要休息, 去卫生间等可以把雪板和雪杖先寄存. 或者是同伴帮看着.
不要把雪杖扎到自己的脚前面, 那样十分费劲, 雪杖最多扎到和脚后跟平行, 不要想着能一次把自己推多远, 少量多次就可以了, 后面可以学习脚怎么配合一些滑行的动作, 能省力很多.
不推荐新手只在平地上滑行, 极其消耗体力, 还会玩的很痛苦.
滑道会有难度标识, 建议新人从练习道和初级道开始, 这两个的坡度很小, 速度会慢一些.
上滑道一般是三种途径:
还有雪地摩托, 但是好像这个只能进入专用滑雪道, 它上山是直接在滑雪道上逆行的.
雪场有教练服务, 费用还是很贵的, 建议找同伴中比较熟悉的人学习, 或者是在教练附近蹭学, 不要蹭太久了, 可以远处看着也行.
水平横在雪道下坡就可以停住, 实在停不住可以向左右一侧倒, 但要注意后面有没有跟随的人, 避免被后面的人撞上, 人多的时候就不建议这样做.
雪杖不要脱手, 会造成其它人摔倒.
这次去的是平谷渔阳滑雪场.
雪场的酒店, 是别墅木屋哪种, 两层, 三室, 全部独立卫生间 淋浴, 如果是很多人会比较划算, 最近房子刚刚装修, 气味比较重.
其它就只能住附近了, 当然最后行程是当天, 不过夜.
我不确定把Currying记作科里化是否更容易理解, 所以下文还是依旧使用Currying吧.
Currying是函数式编程中一种高阶函数的典型应用, 如果非要把它对应到传统OO中的话, 那么它类似Builder模式, 一般译作构建器模式 建造者模式.
Builder模式可以简单理解为创建一个复杂的对象需要依赖多个参数, 要提供的参数又依赖于不同的方法, 使用Builder模式让每个方法只关注自己提供的参数, 最终根据全部参数创建出对象来. 对象实例最终是拿来调用的, 可以把这个过程想象成调用一个参数很多的函数.
Javascript中完全可以按照传统OO的方式实现Builder模式, 但使用Currying更轻量级 简单, 考虑下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
执行输出
1 2 |
|
modN函数有2个参数, 示例中可以同时提供所有的参数, 当然这是相当理想的情况. 实际可能不同的参数在不同的阶段提供:
1 2 3 4 5 6 7 8 9 10 11 |
|
这种方式需要有一个变量用来保存参数, 而如果使用Currying可以这样:
1 2 |
|
根据需要可以curry()
多个参数或curry()
多次. 上文中使用的curry
函数的实现:
1 2 3 4 5 6 7 |
|
这是最轻量级 最简单的实现方式, 深入挖掘Javascript语言的表达力应该还会出现更巧妙的设计.
考虑体积计算公式体积 = 长 x 宽 x 高
, 假设已知长为10, 那么这个公式就变成了体积 = 10 x 宽 x 高
, 进一步已知宽为7, 那么公式就变为体积 = 10 x 7 x 高
, 这种转换即Currying.
这是最通俗的描述, 比较正式的可以参考维基百科的Currying词条.
之所以要额外提Scala, 是因为它是原生支持Currying的语言, 相对比通过类库支持能提供更巧妙的语法, 参见下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
上述代码只是加了额外的注释, 调整了下顺序, 和来源中的代码等价.
最重要的, Scala是静态类型语言, 开发环境可以提供每次Currying
之后的函数提示信息, 并能够做编译时检查, 而Groovy, Python, Javascript只能依赖约定, 错误会在运行时发生, 必须有其它的措施确保同步修改关联的代码.
可以译作偏函数, 即提供部分参数值的函数, 和Currying很像, 只是另外一种更灵活的语法, 可以不按照参数顺序提供参数.
在John Resig的Blog有一篇介绍Partial function和Currying的文章, 贴个简单的代码片段:
1 2 3 4 5 |
|
partial()
的实现:
1 2 3 4 5 6 7 8 9 10 |
|
里面还有一个curry
函数, 基本和上文中的差不多, 有兴趣的可以点Partial Application in JavaScript
Scala也有Partial function的实现, 依旧是静态类型, 示例代码:
1 2 3 |
|
参考[Wikipedia][]的Contrast with partial function application 和 Partial function
Javascript是动态语言, 开发环境无法提供太多提示信息, 上文提到的Currying更适合一些比较稳定的, 不经常变动的API.
实际项目中如果函数参数很多, 并且可能在不同的地方提供参数, 则会使用参数对象的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
这个看起来和Builder模式十分相像, 参数都提供有默认值, num
和x
可以使用更有意义的名称以使阅读性更好一些, 但也付出了不少编码工作.
从Firefox 2.0开始支持解构赋值New in JavaScript 1.7: Destructuring assignment, 这个特性可以让实现modN
少了一些纠结:
1 2 3 4 5 6 |
|
原文中还有解构赋值的很多高级用法, 但是到目前为之还没看到其它浏览器提供支持, 也没有进入ECMAScript标准, 只能在比如Firefox扩展开发时爽爽.
Dropbox是很出名的网盘服务, 也可以叫它云端存储服务, 它的客户端能够自动同步多个电脑间的文件夹, 当然这个功能在现在十分常见了, 只是在他出现之前, 多数网盘服务都是以Web形式为主的. 它给免费用户提供2G空间, 通过邀请其它用户可以扩容空间, 基本上后来的网盘都是这种套路. 额外还有根据订购的套餐按月付费.
Y Combinator是一家很有意思的风险投资公司, 它只向最早期的创业团队投资. 而Dropbox是它最成功的投资之一.
Y Combinator的创始人是Paul Grahm, 被誉为硅谷创业之父, 他曾经从事过程序员的工作. 阮一峰的网络日志 我要翻译Paul Graham了上面介绍的很不错, 引用首段:
下面,我就告诉你,我为什么那么想翻译Paul Graham。
他1964年出生于英国,在康奈尔大学读完本科,然后在哈佛大学获得计算机科学博士学位。1995年,他创办了Viaweb,帮助个人用户在网上开店,这是世界上第一个互联网应用程序。1998年夏天,Yahoo!公司收购了Viaweb,收购价约为5000万美元。
此后,他架起了个人网站paulgraham.com,在上面撰写了许许多多关于软件和创业的文章,以深刻的见解和清晰的表达而著称,迅速引起了轰动。2005年,他身体力行,创建了风险投资公司Y Combinator,将自己的理论转化为实践,目前已经资助了80多家创业公司。现在,他是公认的互联网创业权威。
这就引出了Paul Grahm写的书Hackers and Painters: Big Ideas from the Computer Age, 注意英文副标题, 可以直译为计算机时代的伟大想法. 这本书的中译版是黑客与画家, 译者是上面提到的阮一峰.
这里有一个有趣的故事, 为什么 Dropbox 比其它同类产品更受欢迎? 有趣的在于其中回答这个问题的人中有Dropbox的竞争产品 - Syncplicity的联合创始人, 其中不乏他的多年思考总结, 以及一些行业的内幕轶事.
这是Dropbox的故事.
Stack Overflow是一个免费的问答网站, 很类似国内的百度知道, 不过它有浓郁的Geek和技术文化, Stack Overflow
在程序中是堆栈溢出错误, 这是软件开发工作中一种很棘手, 很不容易处理的严重错误, Stack Overflow还有相关的其它领域的一系列问答网站, 如体育, 各种外语, 电影电视, 个人理财等.
对我来说, 我日常工作中Google搜索问题时, 能在Stack Overflow上得到十分有价值的答案, 甚至可以将工作分为有Stack Overflow前和有了Stack Overflow之后.
Stack Overflow属于Stack Exchange公司的产品, Stack Exchange下的一系列问答网站全都没有广告, 也没有向用户收费的服务, Stack Exchange也获得了风险投资, 不过这里要说的是在哪之前.
Joel Spolsky是Stack Exchange的联合创始人, 可以看到Stack Exchange团队很多人耍宝的GIF动画, Joel Spolsky同时也是Fog Creek的创始人, Fog Creek有一些不错的团队协作产品:
除了Trello是免费的外(无广告), 其它的都是免费试用 + 根据套餐按月付费, 提供基于Web和移动平台的客户端.
Joel Spolsky的个人Blog名字叫Joel on Software, 他将自己Blog上的一些文章整理到一起, 出了本书叫More Joel on Software, 国内有出中文翻译软件随想录, 译者还是上文提到的阮一峰, 点击这里进去可以看到部分篇章, 里面讨论了软件开发中很多有趣的话题.
这里引用一段Joel Spolsky的介绍:
Joel Spolsky(乔尔•斯波尔斯基)是一个世界闻名的软件开发流程专家。
他的网站“Joel谈软件”在全世界程序员中非常流行,被译成了30多种语言。
作为纽约的Fog Creek Software公司的创始人,他开发了FogBugz软件,这是一个在软件开发团队中非常流行的项目管理系统。
Joel曾经在微软公司工作,是Excel开发团队的一员,他设计了VBA(Excel的宏语言)。他还曾在Juno Online Services公司工作,开发了几百万用户使用的互联网客户端。
他已经出版了三本书:User Interface Design for Programmers(《程序员之用户界面设计》,Apress, 2001),《Joel谈软件》(Joel on Software, Apress, 2004),以及Smart and Gets Things Done(《巧妙完成工作》,Apress, 2007)。
他还是The Best Software Writing I(《最佳软件文选(第一辑)》,Apress, 2005)的编辑。
Joel从耶鲁大学获得计算机科学本科学位。
他曾在以色列国防军(Israeli Defense Forces)中服伞兵役,并且是以色列哈纳顿集体农场(Kibbutz Hanaton)的共同创始人之一。
这是Stack Overflow的故事.
Ruby on Rails是我在做Java工程师时接触到的, 感叹它巧妙的设计, 在当时给Java世界带来了巨大的震撼, 原来Web应用也可以这样开发! 时至今日, Ruby on Rails依然是Ruby社区中的明星项目.
在之后的多年中我还陆续接触过Groovy Django web2py Apache Play ASP.Net MVC, 它们或多或少都能看到Ruby on Rails的影子.
Ruby on Rails的作者是David Heinemeier Hansson, 以下是他自己的简介, 我简单翻译成中文:
我是Ruby on Rails的作者, 37signals的合伙人, 纽约时报(NYT)畅销书作家, 公开演说家, 业余摄影师, 和赛车手.
这里畅销书指的是Rework, 除了纽约时报(NYT)外还有华尔街日报(WSJ)和The Sunday Times, 由Jason Fried和David Heinemeier Hansson合著, 封面是个揉了的纸团, 豆瓣网有Rework的中文简介.
还有一本Getting Real, 副标题是: 小规模,更快速,更高质量的软件构建方法, 翻译引用自CNBorn. 这是一本更多讲软件开发, 非技术方面的东西.
上面这两本书都可以免费从作者网站上下载的, 但是它们的实体书同样销售的不错, 也确实, 这种书需要反复的来回看, 领悟.
37signals这家公司同样很有意思, 他们有几个在线协作产品:
这些产品都是基于Web, 以及提供移动平台客户端, 并根据套餐按月付费.
他们有与众不同的内部工作方式, 为什么我要把公司做成扁平型, 作者是37signals的创始人Jason Fried.
在关于还可以看到Jeff Bezos, 他是作为37signals的顾问, 当然他更出名的是作为亚马逊 Amazon.com的创始人和CEO.
这是Ruby on Rails的故事.
上面提到的网站和产品多数是英文的, 还有受限于我国的网络问题而无法访问.
上面提及的书基本都不涉及技术细节, 都很适合IT从业者反复阅读, 而Rework更是适合各种人群阅读.
即使未来不打算从事创业, 但是也很有助于辨别优秀的创业者, 合作方, 投资目标, 抑或是改善自己的日常工作
我仍旧无法用概括性的文字来描述我为什么要写上面的文字, 暂且作为对一些有趣资料的介绍吧.
]]>异步加载这个名称不是很贴切, 实际上有三部分, 非阻塞(不暂停页面渲染) 下载 执行. 只是叫异步加载字数少点, 请不要完全从这个字面理解其意义.
主要用于外链的js文件, 会带来下面的好处:
<head>
和文档开始处的外链js.如果仅仅想页面内容显示的更快, 可以简单的把脚本放置在文档结尾, 比如</body>
标签前.
异步加载的js文件有一个限制的:
document.write()
, 因为页面已经加载完成, 再调用会覆盖现有页面的内容.下面是异步加载的一些实现方式.
1
|
|
使用了defer
属性的<script>
标签下载时不会暂停页面渲染, 当页面解析完后执行, 即常说的DOM Ready
之后, window load
之前.
如果有多个<script defer>
将会按照DOM中的顺序执行, 多个前后依赖的脚本可以放心使用.
defer
属性在html 4中就定义了, 各浏览器兼容性如下:
defer
属性, 将会立即执行.defer
属性IE6会有一些特殊的规则.行内脚本(inline script)是指相对于使用src
属性外链的脚本来说的, 即下面的代码:
1 2 3 |
|
IE6中外链脚本的defer
属性符合上文描述的规则, 但是行内脚本遵循下面的规则.
<head>
中定义的会在<head>
标签解析完成执行.<body>
中定义的会在<body>
标签解析完成执行.1
|
|
使用了async
属性的脚本下载时同样不会暂停页面渲染, 但是它会在下载完成时就执行, 在多个外链脚本时, 可能会有无法控制的执行顺序, 前后依赖的多个脚本不能使用这种方式加载.
async
属性在html 5中定义, 各浏览器兼容性如下:
async
会立即执行, 而defer
会在页面解析完按照DOM树中的顺序执行.如果浏览器支持的话, async
的优先级比defer
高, 即如果async
为true
的话, 会忽略defer
属性.
上述拥有defer
async
属性的<script>
标签都可以通过Javascript编码方式插入到DOM树中, 代码如下:
1 2 3 4 5 6 7 8 9 10 |
|
上述代码适合放到<body>
中, 因为<head>
标签未解析完成的情况下不能插入元素.
也可以在页面加载后(window.onload
)插入, 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
更常用的是DOM Ready
之后插入, 相对会更早点, 鉴于完整的DOM Ready
代码量比较多, 下面例子使用jQuery的DOM Ready
实现:
1 2 3 4 5 6 |
|
Javascript编码方式也是Javascript模块加载器基本原理.
这是更重量级的做法, 适用于大量互相依赖的Javascript的异步加载, 一般需要遵循模块加载器的规则编写自己的模块以用于异步加载.
下面是常见Javascript模块加载器和简单的使用代码.
1 2 3 4 |
|
1 2 3 4 |
|
Head JS 除了提供加载js之外还可以加载css, css js和浏览器特性检测等. 这里只贴加载js的示例代码.
1 2 3 4 5 |
|
SeaJS 是 lifesinger 发起的项目, 提供有完整的中文文档和相关预编译, 打包部署工具. 并且其模块化API遵循CommonJS的标准.
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 |
|
使用spm打包部署
1 2 3 4 5 |
|
如果打算让别的网站通过一段代码来嵌入自己网站的内容, 建议提供下面这种风格的嵌入代码.
1 2 3 4 |
|
id="widget"
是用于放置第三方组件的容器.script
定义了 defer
async
用于异步加载, 不会暂停页面渲染.src
属性的URL定义了用户相关的数据(/username
), 以及指定把组件添加到id="widget"
的标签中.其Javascript大概是这样的
1 2 3 4 5 6 |
|
在参考资料中 Defer parsing of JavaScript 提及在移动应用中一般会减少使用外链脚本的数量, 这样可能行内脚本会增多, 对于哪些不是必须立即执行的行内脚本可以尝试的延迟解析, 不仅仅是延迟执行.
具体做法比如将其写为注释或任何能让浏览器忽略的格式, 等需要的时候再使用eval()
执行.
当然也可以简单的将所有<script>
放在文档结尾.
这不是针对特定品牌, 特定型号的备忘, 只是对购买笔记本中注意点的记录, 从软硬件, 到卖场交易等等.
最近的修改在列表开始
购买时需要首先确定一些重要的外观需求, 比如大小, 接口设计, 键盘.
屏幕从整体上决定了后面要说的体积和重量, 所以放在最开始.
屏幕尺寸, 14英寸的为主, 15英寸的会有额外的小键盘区域, 13及更低的可能会没有光驱.
屏幕长宽比, 之前的都是4:3的, 现在的主要是16:9和16:10, 这个影响最大的是打算另外买笔记本包的时候, 一定要确定电脑包的长度是否足够, 避免到时候不能用.
屏幕解析度, 目前主流是1366x768, 13 14 15英寸多数都一样, 未来可能会有解析度更高的屏幕出现.
液晶屏幕面板, 现在主要是TN面板, 主要响应速度快, 也有一些是IPS面板, 显示色彩更多, 更逼真, 就是响应慢点, 可能会有轻微拖尾.
哑光和镜面屏, 主要是在背后有强光的时候, 屏幕是否会反光. 另外, 哑光屏仔细看可能会看到很多彩色的点, 镜面屏一般比较清澈.
上段也大概提到了, 屏幕尺寸和比例决定了长宽, 一般14英寸, 16:9的笔记本长宽分别为35cm 24cm左右. 其它尺寸和长宽比的可以自行估计.
厚度按照最厚的地方算, 一般在2cm-3.5cm之间.
重量一般14英寸的笔记本带上电池在2-2.5kg之间, 如果再加电源的话, 在3kg左右.
主要外壳部分一般是工程塑料, 磨砂或镜面处理. 掌托部分有些可能会使用金属拉丝的工艺, 当然仍旧是工程塑料的材质.
磨砂的反光少, 镜面的沾指纹看起来很明显, 但是也容易擦. 表面有光泽的样子比较吸引人.
另一类材料是镁铝合金, 价格会高一些, 这个手摸就能分辨出来.
红色白色等亮丽的颜色对女性可能更有吸引力, 可能不耐脏, 很容易显灰尘, 有划痕的话也会很明显, 需要在使用中多注意养护.
笔记本的多数接口都在侧面, 接口主要考虑的是位置, 下面所说的前是指面向使用者的侧面, 后就是面向前方的侧面.
下面的条目只是说好的设计怎么样, 一般很难能同时满足所有的, 实际应当根据自己的主要需求进行取舍.
一般分下沉式和上浮式, 下沉式的转轴比较多一些, 原因多种多样, 成本, 美观, 适用程度.
鼠标和键盘作为操作笔记本的主要途径, 鼠标可以另配, 键盘就不方便换了, 所以应该一开始就明确自己可以适应怎么样的键盘.
一般很难有能完全做到上面所说的最好的设计, 就算有, 可能也会在价格, 体积, 重量上有对应的改变. 所以只能根据各自的首要需求做出取舍.
选择型号的时候, 一般主要型号范围内全部使用一样的模具, 在了解了其中一个型号的外观后, 其它详细型号的外观差异基本没有.
每个品牌的型号规则差别很大, 可以自行了解, 辨别起来还是很容易的.
这部分和笔记本的主要用途息息相关, 将能决定其它的主要配件和价格.
现在主流14寸笔记本续航时间在2-3小时之间, 具体看使用情况, 玩游戏最耗电, 看文章, 运行更少的程序, 开笔记本品牌商场提供的省电软件耗电会低.
电池现在基本都是锂电池了, 我不清楚笔记本是否大量使用锂聚合物电池, 不过仍旧属于锂电池, 对续航影响差距不大, 需要更长的续航时间就需要更大的电池. 聚合物电池相对安全性好些, 不会有爆炸的情况.
但是仍旧应该在合适的温度下使用笔记本.
如果没有特别强烈的需要电池续航的话, 可以不考虑太苛刻的电池和续航时间, 事实也是很多人仅仅把笔记本当作方便移动的台式机来使用.
功耗一般和机器性能有关, 在满负荷运转下, 性能越高, 功耗越高. 对应的发热也越高, 对散热要求会更高.
笔记本内部设计的十分紧凑, 所以应清楚自己的使用环境, 选择合适的配置, 新机器散热可能没问题, 但是长期使用, 散热风道积聚灰尘之后散热能力会下降, 在过热的环境下笔记本除了可能会罢工外, 还有损坏的风险.
显卡关乎游戏性能, 更好的显卡能流畅的运行高需求的游戏, 同时功耗, 发热量也上来了.
大概的显卡范围一般比较容易确定, 如果要在相近的几个型号中选择, 可以参考这个Laptop Video Graphics Cards - Benchmark List.
一般游戏都是使用特定DirectX版本, 而显卡性能测试软件3DMark系列分别针对不同的DirectX版本, 其对应关系如下:
所以可以先考虑主要玩的游戏所需要的DirectX版本, 然后考虑对应得分更高的显卡. 当然价格也是很重要的因素.
这里有一个笔记本显卡分级Comparison of Laptop Graphics Cards, 给出了高端游戏显卡, 中端, 中低端, 低端, 办公用等显卡和相关的性能测试结果.
可以从中看到, 现在Intel HD Graphics 4000显卡, 也就是Intel酷睿i系列第三代处理器集成的显卡, 已经能达到中低端显卡的范畴了, 和NVIDIA GeForce GT 620M, NVIDIA GeForce GT 525M, NVIDIA GeForce GT 330M, AMD Radeon HD 7450M在同一范围, 如果你的选择范围在这个里面, 可以考虑一下CPU集成显卡.
其实这么说来, Intel超级本的游戏性能对付一般游戏还是可以接受的.
没有提CPU? 我感觉CPU这东西是一分钱一分货, 性能参考Comparison of Mobile Processors (CPU Benchmarks). 一般主流价位的笔记本其CPU性价比最高.
CPU详细的对比参见下面这两个链接, 分别来自Intel和AMD的官方, 目前多数笔记本都是Intel的CPU:
内存一般看主流, 现阶段比较尴尬, 因为普遍笔记本能识别的只有3G左右内存, 等64位Windows和相关的软件流行的时候才能使用更大的内存.
硬盘基本什么大小的都够用, 固态, 或者混合硬盘相应的价格更高, 性能更好, 还是一分钱一分货.
现实不是决定选择什么型号的机器然后购买就完了.
去卖场能够看到真实的机器, 上面的外观方面主要是到卖场是亲身感受为主, 但是卖场还是会存在各种坑人的事.
在卖场一定要坚持一个原则, 不在卖场内做决定, 卖场内的商家会十分的热情, 环境也比较吵杂, 闷热, 这种情况下做出决定往往就是个不怎么好的决定, 建议在出了卖场后, 休息或者吃饭的时候再决定, 有朋友一起更好.
卖场中越大的店给推荐换型号时, 越倾向于推荐库存型号, 店大欺客是必然的.
在卖场中一定要注意防盗, 人多的地方什么事都可能发生, 特别是自己的注意力在别的东西上时, 最好多人一起, 一个人和商家交涉, 另一个打酱油.
逛卖场会比较累, 最好随身携带水, 吃饭也不要吃太多, 人在累的时候最容易被说服.
网购主要是指在淘宝上网购, 因为淘宝上的规则目前都是到买家有利, 所以也不失为一个渠道. 网购的货源比较多, 卖场中哪些缺货的事不存在. 在自己家, 做决定也不是在紧张的环境中.
主流品牌的行货笔记本都有全国联保, 一般淘宝商城的都是行货. 如果你很在乎质保期限, 一定要商家开单据证明购买时间. 否则一般售后会按照出厂时间 + 3个月作为购买时间. 有些品牌的售后要求必须是发票才能证明购买时间, 请了解具体品牌的售后政策.
售后的工作流程会很麻烦, 时间也长, 就算说的再好的售后, 也难免遇到自己有特殊情况. 所以哪些品牌宣传中所谓的售后可以不用过多考虑, 我更在乎的是产品的质量, 什么售后补足产品质量是扯淡, 钱都收了, 做的好是人情, 耍赖是本份.
网店如果对买入的不满意, 可以要求退货或者换货, 退换的时间甚至可以达到1个月左右(利用淘宝有利买家的规则).
寄回的邮费可能需要自己出, 如果对自己的选机型的能力不够自信, 又觉得来回折腾又费心, 那么就不建议考虑网购了.
利用淘宝的规则还有卖家的承诺, 完全可以做到很好的维护自己的权益. 其实重点是买家可以在淘宝上给差评, 低评分, 举报等. 就算交易完成了, 还可以拍些东西给差评, 然后说没收到货, 拒绝支付.
这方面买家骚扰的成本比卖家反骚扰的成本低多了, 比卖场的情况好.
网购一般标配送的东西都齐全, 但是额外的可能就没有了, 毕竟价格低嘛, 要的话可以和卖家交涉.
目前笔记本的网购配送主要是顺丰快递, 这个快递还是很可靠的, 无论是速度还是对包裹的保护上.
在卖场购买的话, 建议头天晚上决定好, 第2天上午在中意的几家当中交涉, 然后午饭后购买, 验机, 速度快的话, 能在下午6点前回家吃晚饭.
网购的话, 一般有好几天确认的时间, 还是比较宽裕的.
多数情况到这一步基本都没啥问题了, 但是难免有些个体差异, 如果让自己遇到了当然是越早发现越好, 所以验机步骤不能少.
拿到机器后先看包装和外观
然后装上电池, 接通电源, 装系统或者启动.
先看看屏幕是否有亮点, 暗点, 万里有个一的话就和卖家交涉. 测试软件可以使用EVEREST, 工具菜单中有显示器测试.
接下来主要的接口测试, 比如USB, 网线接口, 耳麦接口, 读卡器, 有光驱的试试光驱弹出, 关闭. 有条件的还可以测试VGA或者HDMI接口.
网络部分WiFi, 有蓝牙的用手机试试蓝牙.
内部的硬件检测可以使用上面提到的EVEREST.
或者是鲁大师, 比较简单直观, 有一个界面可以快速以习惯的词汇描述的硬件配置.
如果要跑分一般是3DMark.
现在超级本还不是很多, 相信不远的未来这方面会多出很多. 所以有必要提提超级本.
超级本是Intel提出的概念, 对消费者来说就是Intel要求品牌厂商的笔记本至少要满足一些条件, 就可以使用超级本来做宣传, 也就是一些保底的要求, 对消费者来说主要是下面这些:
这些是外在特点, 具体这些还需要很多相关内在的变化才能做到.
启动时间得依据实际的软件使用情况, 可能没有那么短, 不过一般出厂预装的软件环境应该是可以达到的.
综合起来说就是对付一般游戏, 典型的应用环境完全足够, 现阶段的价格还比较高, 不过未来成本降低的情况下相对传统的笔记本很有竞争力的, 所以我也相信它会在未来成为热点.
]]>iframe
实现的, 以前遇到的各种问题总是在IE下, 但是之前又发现一个很奇怪的问题, 仅在Firefox下出现.
具体表现为窗口组件关闭时再将相关的父级或iframe
重定向到新的地址, 结果在Firefox下没看到重定向, 也没在错误控制台看到任何错误信息.
前提: 以下所有的都不涉及跨域的问题, 只描述Firefox下运行的情况, 目前我的Firefox版本是15.0.1.
关键结构如下, $
表示jQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
一些需要说明的实际情况
window
和iframe
中的window
. 窗口下是指window.document
和下面的所有DOM元素.#main
中parent.dialog()
实际是自动探测或指定在哪个父级打开窗口.
Dialog1
中parent.dialogClose
实际是哪个窗口打开就重定向那个窗口, 或者指定重定向哪个窗口.<iframe id="Dialog1">
是按照实际打开的情况自动分配的id, 这里使用固定的id方便说明.上述代码运行后的结果没有产生重定向, 加了try catch
后:
An error occurred throwing an exception
出错行在 (frameElement.openWindow || window).location = url;
.
怀疑可能是不能识别默认属性, 换成location.href
试试
"Component returned failure code: 0x804b000a (NS_ERROR_MALFORMED_URI) [nsIDOMLocation.href]"
在MDN window.location发现有assign
和replace
也可以用来重定向
assign
正常执行了, 但是replace
"Component returned failure code: 0x804b000a (NS_ERROR_MALFORMED_URI) [nsIDOMLocation.replace]"
想到可能和上下文有关吧, 试试用目标window.setTimeout
, 传入字符串参数, 执行正常了.
1
|
|
上述所有尝试的代码示例:
iframe
加载的页面都在这一个里面, 根据不同的Url Query执行不同的代码.openWindow.
表示重定向的是按钮所在窗口.虽然问题算是解决了, 但是为什么在哪种情况会发生异常, 仅在Firefox下. 还有没有其它可以回避这个异常的方式.
想想上面代码有些怪怪的就是, 先从DOM树中移除了iframe
, 如果想办法调整一下移除和重定向的顺序, 就有了下面的示例:
可以看到所有的重定向都成功了.
iframe
.iframe
间的调用, 比如setTimeout方式.
iframe
后还需要执行代码的情况.
当然如果和我一样是维护原有项目, 有很多地方不能随便修改, 遇到麻烦就只能大量摸索了. 比如上文中的尝试.
在iframe
中location.assign()
必须确保当前iframe
已加载一个页面, 不然会发生错误
"Component returned failure code: 0x804b000a (NS_ERROR_MALFORMED_URI) [nsIDOMLocation.assign]"
对于已加载页面的则正常, 例子:
]]>使用方式:
自动关机
双点批处理, 按照提示输入要等待的分钟数, 可以输入3*60+15
这样的数学表达式, 只能是整数, 确定后就会在指定时间之后关机.
自动运行程序
将打算自动运行的程序或快捷方式拖到这个批处理文件上, 然后会出现和自动关机相似的提示, 一样的输入, 确定后不要关闭, 时间到之后会自动运行这个程序并关闭自身.
命令行下也可以, 第一个参数是要运行的程序, 后续的是要运行程序的参数. 然后按照提示信息来, 和上面的一样.
代码部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
|
PM2.5浓度 μg/m3 |
15 | 40 | 65 | 150 | 250 | 350 | 500 |
API | 50 | 100 | 150 | 200 | 300 | 400 | 500 |
国内标准 | 优 | 良 | 轻微污染 | 中度污染 API<250 | 重度污染 大于250 | ||
美国标准 | 良好 | 中等 | 对敏感人群不健康 | 不健康 | 非常不健康 | 有毒害 | |
香港标准 | 轻微 API<25 中等 API<50 |
偏高 | 甚高 | 严重 | |||
加拿大标准 | 良好 API<25 中等 API<50 |
较差 | 极差 |
例如: PM2.5在15到40之间, 那么API就在50到100之间, 按照国内标准评级的话, 就是良.
由于优先选择PM2.5, 所以PM10的就不列出来了, 想看可以看开头参考的文章.
PM2.5 μg/m3 年均 | PM2.5 μg/m3 日均 | |
---|---|---|
过渡期-1 | 35 | 75 |
过渡期-2 | 25 | 50 |
过渡期-3 | 15 | 37.5 |
准则(AQG) | 10 | 25 |
2001-2006年卫星图片显示的全球PM2.5均值
上图来自 New Map Offers a Global View of Health-Sapping Air Pollution
国内尚没有执行WHO的颗粒物空气质量准则和过渡期目标(拟于2016年实施过渡期-1的目标), 但是北京和东 南沿海各个省份已经在发布PM2.5空气质量指数, 可以自行找当地的环保部门网站查看.
智能手机可以找找有没有当地的空气质量报告软件, 有些地方性的手机软件有PM2.5的指数, 比如我现在用的是全国空气质量.
颗粒物分类, 包括PM2.5和PM10
避免接触为上策, 没办法的时候只能先用口罩.
无论国内还是国外检测口罩防护效果使用的都是氯化钠气溶胶和石蜡油, 其粒径在0.02-2微米到之间, 捕获率是按照最小计算, 而不是平均值, 所以可以理解为对PM2.5的防护能力.
NiOSH标准, 测试空气流量:85L/分钟
等级 | 捕获率 |
---|---|
N95 R95 P95 | ≥95% |
N99 R99 P99 | ≥99% |
N100 R100 P100 | ≥99.97% |
中国GB2626-2006标准, 测试空气流量:85L/分钟
等级 | 捕获率 |
---|---|
KN90 KP90 | ≥90% |
KN95 KP95 | ≥95% |
KN100 KP100 | ≥99.97% |
这篇主要是默认设置下的常用的快捷键, 类似vim这类编辑器, 形成一个标准可以带来一些好处, 诸如方便交流, 不需要备份恢复太多自定义配置.
主要挑哪些很实用, 比较容易按到的.
基本上有语法分析的编辑环境都会有自动完成, 经常的目的是提示类的方法等, Eclipse中自动完成是按Alt + /, 重复按可以在几个不同类目切换, 具体可以自己试试.
Alt + Shift + / 是用于参数提示, 和Alt + /效果差不多, 甚至有时能相互通用, 不过这个参数提示比较简单, 只有类型和参数名, 详细的还得在看方法提示时右边出现的说明.
Ctrl + Enter 这个不是单独使用, 而是在按了Alt + /之后使用, 用于修改一个方法调用, 因为按Enter将是插入代码. 具体见下图
在类一级, 即方法外面按Alt + /会提示可重写的方法.
Ctrl + 1是快速修正, 不同场合会有十分不同的功能, 我觉得它是Eclipse中使用频率仅次于Alt+/的快捷键.
直接写变量赋值而不写变量类型时, 按Ctrl + 1
快速修正的列表中
Create local variable ‘a’
创建方法内变量, 上面已经有截图.
Create field ‘a’
创建类变量.
Create parameter ‘a’
创建方法参数.
Remove assignment
删除.
直接写方法调用foo("bar")
, 而不实现方法时, 按Ctrl + 1, 会有Create method ‘methodName(paramType)’, Enter后会在合适的位置创建指定的方法空实现, 并且参数都已经写好, 按Tab键可以切换到返回类型和参数类型上调整, 最后Enter两次完成.
类也可以用相似的方式创建, 先写new Foo("Name")
, 然后Ctrl + 1, 选Create class ‘Foo’. 如果是在方法调用中这么写foo(new Bar())
, 并且foo
方法的参数有具体的类型限制, 那么创建的类会继承参数指定的类型或实现参数的接口类型.
如果现有类里面有, Ctrl + 1会出现Import ‘Xxx’ (xxx.xx), 用于引入现有类.
在类声明上写了implements IFoo
后, 按Ctrl + 1会有
Add unimplemented methods
添加未实现的接口方法.
Make type ‘Xxx’ abstract
修改当前类为抽象.
还有抽象类的抽象方法也有类似的提示, 具体可以自行尝试, 套路基本和上面的一样.
结合上段, 使用匿名内部类时, 输入new InterfaceClass(){}
之后按Ctrl + 1, 也有Add unimplemented methods, 这在写UI程序时添加事件回调很有用.
所有默认生成的方法都会有// TODO Auto-generated method stub
这段, 可以在那一行按Ctrl + 1 -> Remove task tag
不过直接按删除行更直接点, Ctrl + D
这一般是在打算调整代码时用, 十分通用的比如重命名, 可以按Alt + Shift + R更直接点.
在变量声明或赋值上按Ctrl + 1, 下面是一些比较有用的.
Convert local variable to field
把本地变量转换为类变量.
Split variable declaration
和下一项相反, 把变量声明和赋值分离, 在操作外部资源, 用try finally
时很有用.
Join variable declaration
将变量赋值和声明合并为一行.
Extract to local variable
把变量扩展为本地变量, 一般是优化时使用, 访问本地变量比类变量快.
在类变量上按Ctrl + 1有Create getter and setter for ‘xxx’用于创建类变量的get
和set
方法, 如果是boolean
类型会把get
变成is
.
不过常见的情况是用菜单栏Source -> Generate Getters and Setters, 可以一次性把选择的类变量生成get
set
方法.
在多数情况下, 项目中名称重复的文件并不多, 特别是在做jsp开发的时候, 可以使用Ctrl + Shift + R, 输入文件名称就能很快的打开相关的文件.
这段来自和网友的交流.
上篇介绍的Breadcrumb需要鼠标点才能完成上述目的, 也可以用Ctrl + O打开临时的Outline试图, 可以输入文本过滤, 或者用方向键选择, 最后按Enter转向到指定的方法.
这个在全屏编辑的时候很有用.
上面是我遇到的常用的地方, 还有很多地方都可以按Ctrl + 1, 可以自行尝试.
Ctrl + Q
在修改代码的时候很有用, 快速跳到刚刚修改的地方, 而不撤销代码的修改.
Alt + 方向左/方向右
这个也是在最近的相关文件的行中跳转, 但是我也不是很理解具体的规则, 只是偶尔用用看.
默认鼠标移上去就能看到, 但是需要悬停一会, 如果不想碰鼠标, 可以将光标移动到相关的类或者方法上按F2, 和鼠标悬停弹出的完全一样.
Ctrl + M, 看个人喜好, 我一般是临时用用, Eclipse可以把编辑窗口拖出来分离成左右或上下的, 最大化时仍旧保持左右或上下, 适合对比分析代码, 比如一个客户端, 一个服务端的代码.
Ctrl + W 和几乎所有主流浏览器的关闭窗口快捷键一样, 大量的编辑器也是这个键, 经常用的话就会很自然了.
上面提到的常用快捷键肯定有遗漏, 如果想自己找相关快捷键可以这样操作.
菜单栏 Window -> Preferences, 在左侧顶部输入Keys
, 一般就一个, 可以看到如下界面
一般Scheme保持Default不变, 在type filter text输入自己想知道的快捷键锁功能相关的单词, 然后在下面出现的快捷键上找, 并尝试.
这些不限于在Eclipse中使用, 很多地方也可以用这些快捷键, 彻底不了解的可以看, 其他人可无视.
Ctrl + 方向左/方向右
光标向左/右移动一个单词, 中文没有单词可能不适用, 不过在代码中很常用.
Shift + 方向左/方向右
向左/右选择一个字符, 可以重复按选择多个.
Shift + 方向上/方向下
从当前光标位置向上/下选一行, 可以配合左/右, 重复按来调整选择区域.
Ctrl + Shift + 方向左/方向右
向左/右选择一个单词, 可以配合上面提到的细节调整选择区域.
Ctrl + 方向上/方向下
滚动条上下滚动, 光标不移动, 一般是一次滚动一行.
Home End
移动到行首/行末, 配合Shift可以变成选择到行首/行末. 有些编辑器能自动检测行首缩进.
Page Down Page Up
上翻页, 下翻页, 配合Shift可以选择上一页/下一页的内容.
Ctrl + X/C/V
Windows平台最常用的, 剪贴, 复制, 粘贴.
Tab
单独按就是缩进, 根据编辑器的设置, 可能被替换为空格. 配合选中多行, Tab可以调整多行的缩进. 配合Shift可以反缩进, 即减少缩进, 文本向左移动. 这个不是十分通用, 不过多数编程环境都是这样的.
上篇介绍到了ScrapBook, 在断点调试时也有类似的功能.
通过Window -> Show View -> Other, 在Show View窗口顶部的文本框输入Display
, 应该会在下面看到Display, 点击即可打开上图所示界面.
具体功能和上篇的ScrapBook基本一致, 只是用于调试时, 这个主要是可以在调试时, 把一些变量的值直接以文本方式展示, 甚至可以自己填些说明, 方便后续的调试参考.
经常会需要查看当前编辑的文件在项目文件系统中的路径, 标签上只显示了文件名, 鼠标移上去可以看到路径, 但是如果想查看同目录下其它的文件就比较麻烦了. 下面是个快速找到当前文件在项目中位置的方式.
因为点了Link With Editor后, 切换编辑的文件将总会自动转到对应的项目路径, 所以一般我会点两次恢复默认.
上一段说的是针对所有文件都能生效的方法, 但是对于Java类来说, 想知道它在项目中的路径, 挺多时候实际目的是查看和它临近类, 那么可以使用Breadcrumb.
在项目上可以显示两种不同的Java包结构, 通过点击Package Explorer或Project Explorer窗口右上的View Menu -> Package Presentation -> Flat或Hierarchical在两种风格中切换, 实际效果如图:
]]>不分先后顺序, 只是想到什么就写什么, 因为内容比较多, 所以这篇是1.
以英文版的介绍为主, 因为我发现很多人基本都只使用英文版.
不是很熟悉字符串的查找, 截取等到底返回的是多少? 不清楚日期返回的年月日分别是几? 不清楚某个静态方法给特定值返回的是多少?
这些经常会遇到的小问题, 基本都可以建立一个测试Java项目写个包含main的静态方法, 在里面写测试代码就行了. 但是这样始终很麻烦. 可以试试下面的这个功能:
先确保右上已经选择的是 Java(Java perspective), 在随便一个Java项目中右键 -> New -> Other, 选择树状结构中的Java -> Java Run/Debug -> Scrapbook Page, 如下图
然后Next, 输入文件名, 比如test
, Finish. 打开的窗口中可以输入类似下面的代码, 选择所有代码后点工具栏上的Display Result of Evaluating Selected Text, 如下图:
鼠标右键菜单中也有和菜单栏按钮等价的菜单项:
Inspect
可以在弹出的小窗口中显示, 类似Eclipse中调试Java代码时的Inspect
Display
上文已经说过了, 它可以将这段表达式或最后一行语句的结果显示在编辑器中
Execute
这个和直接运行差不多, System.out.println
这些会输出
Set Imports
设置默认导入哪些类, 包, 类似Java中import
语句
目前手机上使用Catch来记录和收集手机上看到的各种信息, 在电脑上查看之后会删除, 但是奇怪的是Catch.com网站的My Ideas不显示删除按钮, 而别的都会显示, 但是在手机上收集的信息默认不选择的时候都会保存到My Ideas分类里面, 所以就有了下面这个工具.
这是一个Bookmarklet, 使用方式是在上面这个链接上鼠标右键
然后访问Catch.com, 登录后点My Ideas, 先找个笔记点删除, 默认会弹出确认删除, 选中Do not show me this message again -> Delete.
然后依次选中想删除的笔记, 在收藏夹(IE)/书签菜单(Firefox)/书签栏(Chrome)中点刚刚保存的书签, 就可以看到笔记被一个个的删除.
上述Bookmarklet的源码是
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
这里有一篇关于Bookmarklet和编写的资料, Bookmarklet编写指南.
一个简单的在线Bookmarklet编写网页, Bookmarklet Crunchinator.
]]>下面代码示例中rem
表示对下一行的注释, 一般下一行以>
开始, 表示在命令提示符中输入的, 再下一行表示大概的输出. 整块的代码一般是文件内容, 将会以文件中的形式表现.
最近的修改在列表开始
除了Win+R cmd
打开外, 还可以在文件窗口中按住Shift + 鼠标右键, 在此处打开命令窗口, 在文件夹上Shift + 鼠标右键同样有这个菜单项.
command1 & command2
先执行command1, 然后是command2, 一般在cmd
开启新的命令提示符窗口时比较有用
cmd echo 1 && echo 2 && echo 3
command1 && command2
先执行command1, 如果执行成功(退出码为0), 将会接着执行command2
command1 || command2
和&&
相反, 如果command1执行失败将会执行command2
(command1 & command2)
()
用于组合嵌入多个命令, 可以在其中使用换行符, 将类似&
的效果, 只是写成了多行, 在for
和if
中很有用
if not defined foo (
set foo = bar
)
command1 param1;param2
分割命令的参数, 也可以使用符号,
.
如果命令参数中有&
|
()
>
<
^
则需要使用^
转义
>echo ^&
&
set命令用于基本的查看和设置环境变量
>set
....
USERNAME=netwjx
>set user
USERNAME=netwjx
>set username
USERNAME=netwjx
>set myvar=varvalue
同样的, 如果变量值包含&
|
>
<
^
, 使用^
转义符
set命令的进一步使用可用来计算数字
>set /p expr=输入时间,单位分钟,例如:5*60+35
输入时间,单位分钟,例如:5*60+35
>3*60+11
>set /a sec=%expr%
191
>echo %sec%
191
使用环境变量
>echo %myvar%> foo.txt
%myvar%
将会被扩展成myvar
环境变量的值, 后面的输出重定向将这个值输出到foo.txt
.
在执行一行命令时, %myvar%
将只扩展一次
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
因为if
和后面括号中的多行命令只属于一个if
命令, 括号内的%VAR%
在指定外面的if
命令时已经被扩展了, 所以括号内的if
命令实际是
if "before" == "after" @echo If you see this, it worked
将始终不会输出, 类似的, 在for
命令和使用括号的组合命令中同样会有上述现象.
如果要使用VAR
被修改后的值, 则需要使用延缓环境变量扩展, 下列命令用于开启延缓环境变量扩展
setlocal enabledelayedexpansion
然后在延缓环境变量扩展的地方将%
替换为!
, 如下
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
要关闭延缓环境变量扩展特性除了
setlocal disabledelayedexpansion
还可以
endlocal
只有for
命令的循环变量是个特例, 每次执行循环都会被扩展为具体的值.
字符串替换
>set foo=abcdef
>echo %foo:bcd=_%
a_ef
>echo %foo:bcd=%
aef
字符串截取
>echo %foo:~1%
bcdef
>echo %foo:~-1%
f
>echo %foo:~1,2%
bc
>echo %foo:~-3,2%
de
>echo %foo:~1,-2%
bcd
输出如上所示, 使用2个数字时, 第2个是截取长度, 负数表示截取到字符串结尾还剩指定个字符, 第2个是负数时表示截取到离结尾还有指定个字符.
if not defined foo (
echo need %foo%
)
执行set
命令, 并将每行的内容作为循环变量%i输出
>for /f %i in ('set') do @echo %i
...
windir=C:\windows
有时可能不方便使用单引号'
, 可以使用反引号`
>for /f "usebackq" %i in (`set`) do @echo %i
...
windir=C:\windows
更多关于for
命令
环境变量扩展增强没有能获取文件名, 文件路径等等的功能, 也不能直接使用参数修饰符来实现获取文件名等目的, 但是可以配合上一段介绍的来实现
1
|
|
foo.bat
用于输出第一个参数的文件名部分, 下面是获取环境变量值的文件名部分
>set foo=%cd%\bar.foo
>for /f %i in ('foo.bat %foo%') do set foo=%i
>echo %foo%
bar.foo
内建环境变量是在执行环境变量扩展的时候最先检查的, 其中有一些比较有用的
%ALLUSERSPROFILE%
返回所有用户的数据目录, 对于Win7, 它是C:\ProgramData
%APPDATA%
返回当前用户的应用程序数据存储目录
%CD%
返回当前活动目录
%CMDCMDLINE%
返回当前命令行解释器的路径, 结果是被双引号"
括起来的
%CMDEXTVERSION%
返回当前命令行处理扩展的版本号
%COMPUTERNAME%
返回当前计算机名称
%COMSPEC%
和%CMDCMDLINE%
基本一样, 只是结果不是被双引号"
括起来的
%DATE%
返回当前的日期, 格式和date /t
命令相同, 这个还和系统的区域和语言设置有关, 实际处理起来通用性不是很好.
%ERRORLEVEL%
返回最近一次命令的执行结果, 一般非0表示发生了错误.
%HOMEDRIVE%
返回用户目录所在的盘符, 格式如C:
%HOMEPATH%
返回用户目录的路径, 不包括盘符, 格式如\Users\netwjx
%HOMESHARE%
, %LOGONSEVER%
文档中有, 但是我没测试出来有效值
%NUMBER_OF_PROCESSORS%
返回系统的处理器数量
%OS%
返回操作系统名称, 基本上Win2000以后都是Windows_NT
%PATH%
可执行文件的搜索路径
%PATHEXT%
可执行文件后缀
%PROCESSOR_ARCHITECTURE%
返回处理器架构, x86
IA64
%PROCESSOR_IDENTIFIER%
返回处理器描述
%PROCESSOR_LEVEL%
返回处理器的系列编号
%PROCESSOR_REVISION%
返回处理器的修订编号
%PROMPT%
返回当前命令提示符窗口的提示符, 可以通过prompt
命令修改
%RANDOM%
返回一个随机数字, 范围在0到32767之间
%SYSTEMDRIVE%
返回操作系统所在的盘符
%SYSTEMROOT%
返回操作系统的根路径, 包含盘符
%TEMP%
%TMP%
返回当前用户的临时目录
%TIME%
返回当前的时间, 格式类似time /t
命令返回的, 这个还和系统的区域和语言设置有关, 实际处理起来通用性不是很好.
%USERDOMAIN%
返回当前用户所在的域, 或工作组名
%USERNAME%
返回当前登录的用户
%USERPROFILE%
返回当前用户目录
%WINDIR%
返回当前操作系统的路径, 类似%SYSTEMROOT%
在内建环境变量中没有指定名称的变量后, 会依次从下面的位置查找
一个常见的场景, 查找使用特定网络端口的应用程序
>netstat -ano | find ":4000"
UDP 0.0.0.0:4000 *:* 3876
其中最右边的3876是应用程序的进程ID, 而|
是管道操作符.
管道操作将会把左边命令的输出, 作为右边命令的输入. 上面例子中netstat -ano
将会输出本机的网络连接和对应的进程, find ":4000"
则是在输入中找包含字符串:4000
的行.
重定向和管道也很相似, 典型的用途是将一个命令的输出保存为文本文件.
>netstat -ano > foo.txt
可以在当前目录中看到foo.txt
, 其内容是netstat -ano
命令的输出.
可以和管道操作结合, 将查出来的本地网络连接信息保存到文件
?netstat -ano | find ":4000" > foo.txt
>
会始终覆盖原来的文件, 使用>>
则会在文件结尾添加
>netstat -ano >> foo.txt
随着反复的运行, foo.txt
的结尾会一直增加.
有一个特殊的管道目标叫clip
, 可以用来操作系统剪贴板
还有一个特殊的输出设备叫nul
, 它不会产生任何文件, 效果就像执行了命令, 但是不回显命令的输出, 在延迟 Sleep有这个例子.
上述可以将命令正常执行的结果重定向到文件, 但是错误信息仍旧会输出到命令提示符窗口(标准输出)
>netstat -x > nul
显示协议统计和当前 TCP/IP 网络连接。
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [interval]
....
默认错误信息输出的目标叫标准错误输出, 仍旧可以让其不显示
>netstat -x > nul 2>&1
其中>&
也是重定向操作符, 需要配合>
>>
使用, 2标准错误输出, 1表示标准输出.
> nul 2>&1
表示在将标准输出重定向到nul
的同时将标准错误输出重定向到标准输出, 这样就完成了完全隐藏命令行输出的正常信息和错误信息.
关于重定向的数字下面是完整的参考
0
STDIN
标准输入, 键盘输入
1
STDOUT
标准输出, 命令提示符窗口输出
2
STDERR
标准错误输出, 命令提示符窗口输出
3-9
UNDEFINED
未定义, 参考文档中描述其在特定应用程序中会使用, 但是没找到具体使用的例子, 所以我目前也不清楚具体使用是怎么样的.
如果仅想取得命令的错误信息可以这样
>netstat -x 2> foo.txt
在参考链接中Using filters有管道和重定向混合使用示例.
上面的重定向都是输出重定向, 这里开始介绍输入重定向.
在介绍管道的时候使用了find
命令, 它会在标准输入中查找指定字符串, 除了使用管道外, 还可以使用输入重定向
> netstat -ano > foo.txt
> find ":4000" < foo.txt
UDP 0.0.0.0:4000 *:* 3876
这会使用中间文件foo.txt
而标准输入实际是个特殊的输入设备con
>find "foo" < con
等价于
>find "foo"
每当输入包含foo的字符串并回车后, 会立即回显一次.
比如使用用户输入来创建文件
>copy con foo.txt
>bar
>hello world
>^Z
已复制 1 个文件。
其中^Z
表示Ctrl+Z
, 输入结束.
除了find
会使用标准输入外, 常见的还有下列命令也会使用标准输入
more
用于逐屏显示标准输入
sort
按行排序标准输入
还有一个<&
重定向操作符, 文档中的解释是会从右边的设备读取输入, 并从左边输出, 我实在想不出来这具体是在什么场景下使用, 所以也不知道如何介绍.
在参考链接中Using filters有管道和重定向混合使用示例.
>pushd d:\foo
将当前工作目录保存后, 立即将工作目录切换到d:\foo
.
>popd
将当前工作目录切换到最近一次pushd
时所在的工作目录.
很典型的一个栈stack结构, push和pop. stack为空时pop将没有任何效果.
比cd
命令好用的是cd
在跨盘符的时候还需要手工切换盘符.
>ping -n 4 -w 1000 127.0.0.1 > nul
这将会延迟3秒, 其中-n
参数表示的是重复ping的次数, 将决定最终的延迟的时间.
因为ping 127.0.0.1
会立即返回, 所以实际延迟的时间是 -n
参数 - 1 的秒数.
一般使用%
作为转义字符
>echo %username%
netwjx
>echo %%username%
%netwjx
但是&
|
需要使用^
转义, 这个在上面在一行执行多个命令已经有描述
>echo ping -n 3 127.0.0.1^>nul
ping -n 3 127.0.0.1^>nul
>echo netstat -ano^|find ":80"
netstat -ano|find ":80"
P.S. Linux下echo转义符号是\
空行, 在echo紧跟.
>echo.
使用echo和输出重定向可以产生文本文件, 可以用来产生脚本批处理等.
如果在批处理文件中使用for
则需要将%i
写为%%i
, 象下面这样
>for /f %%i in ('set') do @echo %%i
使用for
命令的循环变量时, 可以使用类似批处理哪样的参数修饰符
>for %I in (*.log) do @echo %~nxI
log.log
....
下面例子将使用在命令提示符窗口中的写法, 而不是批处理文件中的写法.
for
命令一般是用于处理多个文件, 文件的多行, 也可以用于处理另外一个命令的输出. 下面是显示*.log
文件的例子
>for %i in (*.log) do @echo %i
C:\Log\log.log
....
匹配目录
>for /d %i in (.*) do @echo %i
.svn
....
枚举当前目录所有.txt文件
>for /r %i in (*.txt) do @echo %i
C:\foo.txt
C:\bar\foo.txt
....
枚举所有名字以.
开始目录, 主要是指.svn .hg
这些
>for /d /r %i in (.*) do @echo %i
C:\Users\Netwjx\.ssh
....
数字的循环变量
>for /l %i in (0, 1, 5) do @echo %i
0
1
2
3
4
5
注意初始值0
和最大值5
, 都会包含在内, 也就是这个循环将执行6次.
显示文件中的每行, 从开始到第一个空格到tab
之间的字符串
>for /f %i in (mylog.log) do @echo %i
15:07:50.947:
15:07:50.947:
15:07:50.947:
....
/f
还可以使用一些参数, 下面将会把path
环境变量的第一个;
之前的内容输出
>for /f "usebackq delims=;= tokens=2" %i in (`set path`) do @echo %i
C:\Ruby\bin
.COM
详细参数如下, 空格分割
eol=c
指定行注释字符, 以c
字符开始的行将被忽略
skip=n
指定忽略开始的n行
delims=xxx
指定分割字符, 可以指定多个, 配合tokens
参数使用, 类似传统编程语言中split
函数的分割字符
tokens=x,y,m-n
将x y
以及m-n
之间的字符串返回给循环变量, 下标从1开始, 如果有y*
, 则表示从第y
个往后的所有都返回, 下一段有详细的使用示例.
usebackq
表示使用`
符号表示一个命令行, 而不是传统的'
符号
配合自定义的命令行程序, 可以自行处理命令提示符窗口的输入和输出, 以及弥补内建环境变量中%date%
和%time%
格式不固定的问题.
tokens
参数可以用来提取命令行或文件的返回值, 最基本的如:
>for /f "tokens=2" %i in ("1 2 3 4 5 6 7 8") do @echo %i
2
tokens
可以指定多个, 会隐式的将对应索引的值赋给按照字母顺序命名的循环变量:
>for /f "tokens=2,4,6-8" %i in ("1 2 3 4 5 6 7 8") do @echo %i %j %k %l %m %n
2 4 6 7 8 %n
可以看到tokens=2,4,6-8
分别会给%i %j %k %l %m
赋值, 而%n
则原样显示.
还有y*
的例子
>for /f "tokens=2*" %i in ("1 2 3 4 5 6 7 8") do @echo %j %k
3 4 5 6 7 8 %k
>for /f "tokens=2*" %i in ("1 2 3 4 5 6 7 8") do @echo %i %j %k
2 3 4 5 6 7 8 %k
2*
将会把从第2个开始(不包括)往后所有的都赋给了%j
这是个使用for
执行命令并取得命令执行结果到变量的典范.
>for /f "tokens=3 skip=2" %i in ('reg query HKEY_CLASSES_ROOT\txtfile\shell\open\command /ve') do @echo %i
C:\windows\notepad.exe
其中reg query
命令是读取注册表, 返回的内容类似下面
HKEY_CLASSES_ROOT\txtfile\shell\open\command
(默认) REG_SZ C:\windows\notepad.exe %1
因为其开始会有一个空行, 所以/f
参数有skip=2
批处理文件可以是bat
后缀, 也可以是cmd
后缀.
批处理文件需要保存为ANSI格式, 对于中文Windows是GBK, 不建议用UTF-8, 也不建议有BOM
以@
开始的命令将不会回显
>@echo hello
同时可以使用echo off
关闭回显, 如果两者结合的话就是
>@echo off
一般在批处理文件第一行, 可以使所有命令都不回显.
一般调试时可能会需要在某行之后回显, 可以再echo on
打开回显.
使用%1
到%9
获取, 其中%0
是当前批处理文件的路径.
1 2 3 4 5 6 |
|
使用示例
>Foo\test.bat 1 2 3 4
Foo\test.bat
1
2
3
4
%0
可用来删除脚本自身, 不过这行必须放结尾, 因为一旦删除就会脚本执行出错.
可以用if
检测参数是否提供
>if not "%4"=="" echo %4
1-9不够用可以使用shift
>rem 将参数队列弹出一个, 这将会使旧的%1值被移除, 旧的%2变成%1, 旧的%3变成%2
>shift
>rem 和上面的类似, 只是一次弹出2个, 旧的%1 %2被移除, 旧的%3 %4 %5将变成%1 %2 %3
>shift /2
如果仅需要将当前的参数原封不动的传递给别的命令行程序, 使用%*
>call foo.bat %*
%*
将包含原始的%1-%n
的参数, 不受shift
影响, %*
不能使用参数修饰符
参数修饰可以将指定参数扩展为文件或目录名, 使用当前的盘符和目录信息.
>rem 把%1参数扩展为包含盘符和路径的字符串
>echo %~dp1
完整的修饰符列表
%~1
扩展%1参数并移除参数两边的双引号"
%~f1
扩展%1参数为完整的路径
%~d1
扩展%1参数为盘符
%~p1
扩展%1参数为路径, 不包括盘符和文件名
%~n1
扩展%1参数为文件名, 不包括扩展名
%~x1
扩展%1参数为扩展名, 包含点
%~s1
扩展%1参数为仅包含短名称目录名的路径
%~a1
扩展%1参数为文件属性, 格式如--a------
, 其它标志位的字母可以自行测试
%~t1
扩展%1参数为文件修改时间, 格式如2011/07/31 17:04
%~z1
扩展%1参数为文件大小的数字, 单位字节
%~$PATH:1
在PATH环境变量中指定的所有目录中(分号;
分割的目录路径)搜索名为%1的文件名, 返回第一个发现的文件路径, 如果环境变量不存在或者找不到文件, 将返回空白的字符串
上述的修饰符和多重叠加
>rem 搜索PATH环境变量的路径中名为%1的文件, 并返回第一个找到的文件的盘符和路径
>echo %~dp$PATH:1
一般是可以直接other.bat
, 但是可能会发生一些奇怪的现象, 如后续的命令未执行之类的, 所以
>call other.bat arg1 arg2
和传统编程语言中的用法一样
if "%1"=="" goto help
echo running
....
goto end
:help
echo help message
goto :EOF
:end
echo completed
标记使用:label
来定义, 然后是goto label
跳转.
有一个特殊标记:EOF
表示结束, 使用时是goto :EOF
.
因为有2个手机和NDS, 手机一个是之前提过的黑莓8310, 另外一个是小米手机, 而平时玩小米手机时间挺多, 再加上临近过年, 要回家, 路上肯定会玩手机, 很可能电力不足.
在淘宝上搜移动电源的话, 品牌主要是羽博和品胜的, 外观时尚, 体积和电容量给设备充一次是没问题.
在电玩网站发现还有联力众(续航大师), 西诺电子, TPOS, 微发, 因为是给电玩充电的, 所以电容量都比较大, 相应体积重量也提高了.
另外还有淘宝聚划算和淘宝试用中心还有一些我感觉很冷门的品牌, 如力杰, 还是做时尚外观, 电容量一般充一次没问题.
移动电源目前都是锂电池, 因为锂电池有可能发生爆炸, 所以我专门找了些关于锂电池拆机的评测, 主要在电玩网站上有, 下面是我根据回忆整理的一些信息.
锂电池 指的是传统的锂离子电池, 一般移动电源中使用的锂电池是18650圆柱形锂电芯, 18650的意思是18mm直径, 65mm高度的圆柱形.
羽博和品胜的移动电源使用的是这个电芯, 多数笔记本也使用的是这样的电池.
在高温中工作是一定会爆炸的, 漏液什么的现在应该几乎见不到了.
聚合物电池 指的是聚合物锂离子电池, 还是锂电池, 只是一般聚合物电池的特性可以做成片状, 现在新的手机哪些高容量电池都是这种的. 而且聚合物电池不会爆炸,
电玩网站提到的移动电源基本都使用的是ATL电芯.
我看过一个视频是把电池放下面点火的铁盘上加热, 最后膨胀, 冒烟, 但是没有爆炸. 对照视频中的锂离子电池在加热到一定程度就爆炸, 电池残骸飞出去了.
电池的电容量一般是mhA标注, 1000mhA的意思是以1000mA电流, 电池的额定电压放电, 能持续放电1小时.
考虑电容量不能简单的除以现在电池的容量, 应按照放电时间来计算是比较靠谱的.
比如我的小米手机充电器的放电是5V 1A, 充满1930mhA的小米手机电池, 需要2小时40分钟左右.
我购买的微发移动电源, 电容量是8800mhA, 因为锂电池的放电电压不足5V, 所以会有升压电路. 如果要提供5V 1A的输出, 输出电流可能在1300mhA左右, 因为锂电池会随着持续放电而电压降低, 一般是从4.2V到3.2V, 低于3V会使电芯受损, 所以一般都有过放电保护, 越往后需要的输出电流越多.
使用1300mhA计算, 那么8800mhA以5V 1A输出能持续放电6小时46分钟左右, 用总放电时间除以充满一次点需要的时间, 结果就是2次半左右, 以我实际使用的测试情况来计算也是如此.
简单估算方法: 充满1000mhA的电池, 移动电源需要消耗大概1800mhA的电量.
简单的可以理解为转换效率高能对电池利用的更多, 比如微发8800mhA电源在1A的输出下可以达到97%的输出效率. 一般在90%以上为佳.
这个参数一般看不到, 最好是看看评测, 一般移动电源有一个最佳的放电电流, 能够得到十分高的转换效率, 在这种情况下工作对移动电源利用的最多.
和这个参数关联最大的是移动电源的电路用料, 这个我不是很熟悉, 就是看到微发的拆解中提到钽电容, 可以作为参考.
移动电源上的接口最好是标准USB口, 大, 牢固, 也很耐用. 一般还有独立的充电接口, 会为了和放电接口区分开而使用不同的接口, 我觉得最好是其它USB接口, 这样比较通用, 比如目前流行的MicroUSB, 以及以前挺流行的MiniUSB. MicroUSB更好点, 它更牢固.
充电线一般有1拖2 + N种转接头, 或者是1拖2固定接口, 我建议用固定接口, 因为转接头可能会有接触不良, 而成为最薄弱的环节.
再者现在很多设备充电线都是USB口, 移动电源的充电线不一定总是能用到, 针对没有USB口充电线的设备买个对应的充电线就行了.
设计其实没什么好说的, 高亮LED用于照明, 接口尽量设计为方便放包中的同时给设备充电为好.
以前看的时候羽博和品胜还没有明显能确定是聚合物电芯的移动电源, 现在应该都有了吧, 这个得找具体的评测.
当时我购买的是微发8800mhA的, 但是并不推荐现在仍旧购买这个, 因为现在已经有超过10000mhA的移动电源了.
电容量篇说过如何评估移动电源能充电的次数, 一般越大越重, 体积也越大, 选购应先确定一个理想的电容量范围, 然后就是自己决定外观接口设计, 品牌, 电芯类型这些东西.
电池这个东西是一分钱一分货, 只要不是特别去挑便宜, 一般不会被骗到.
虽然聚合物电池不会爆炸, 但是高温环境电池还是会膨胀, 也会影响到电器性能的, 所以应该减少和避免移动电源和电子设备在高温环境中.
在找这些资料的时候, 还发现有人自己做移动电源, 用的都是上乘的材料, 主要是外壳看起来比较粗糙, 后来的好很多, 有开淘宝店卖自己做的电源, 有兴趣的可以看看. 小于电源
文中图片来自搜索引擎找到的, 懒得自己处理, 上面的水印还在, 不是我可以给做广告啊.
]]>棉(Cotton) 是天然植物纤维, 日常使用的最多的一种, 柔软, 穿着舒适, 吸湿, 透气, 弹性几乎没有, 容易折皱, 需要熨烫才能弄平, 可以机洗, 必然会缩水.
一般洗多次之后表面会起毛, 根据材料和织法, 轻重程度不同.
容易染色, 白色的不能和褪色的衣物一起洗, 有些衣服图案使用的印染技术不好图案会花, 发粘, 我说的是在以纯买的一件.
纯棉(Pure Cotton) 一般还会和一些别的纤维混纺, 以拥有两种纤维的特性, 多数是合成纤维.
莱卡(Lycra) 是杜邦公司的注册商标, 也就是只有杜邦授权的才能叫莱卡, 否则都叫氨纶(Spandex).
加了氨纶的服装会弹性十分好, 能防止缩水, 也不会折皱, 吸水后比纯棉干的快, 洗多次后表面起毛比纯棉少很多.
其它特性和纯棉一致. 一般T恤中氨纶会占1%-10%.
涤纶(Terylene) 聚酯纤维(Polyester Fiber)算是第一大合成纤维, 价格可能比氨纶的便宜点.
弹性比纯棉好, 但是比氨纶的差, 和纯棉混纺会有轻微缩水, 折皱情况和涤纶的含量有关, 越多折皱越不容易, 但是涤纶自身透气吸湿较差. 平时穿着不是很容易折皱, 洗多次后表面起毛少.
其它特性和纯棉一致. 一般T恤中涤纶会占15%左右.
尼龙(Nylon) 聚酰胺纤维(Polyamide Fibre) 是最早的合成纤维, 有光泽, 手感顺滑, 耐磨, 会折皱, 容易产生静电.
一般会用于服装的面料, 比如羽绒服. 或者是需要耐磨的, 比如袜子.
靠近火焰会缩, 燃烧有毛发味, 挺多把这个当羊毛材料用.
亚麻(Flax) 是天然植物纤维, 透气效果极好, 吸湿, 吸水后干的十分快, 纯亚麻的穿着会有刺痒, 一般都是和纯棉混纺, 麻含量从35%到60%都有.
一般亚麻混纺的织法都很粗犷, 有薄而不透的效果.
不耐磨, 所以一般是不能机洗的, 只是现在可以有洗衣袋装起来洗, 避免扭到一起. 手洗的话也不能揉搓和使劲扭. 清洗时也不能使用酸性和碱性洗涤剂, 只能使用专用的中性洗涤剂. 洗多次之后会越来越软.
莫代尔(Modal) 原料是欧洲的灌木林, 和棉一样属于天然纤维, 柔软, 有光泽, 吸湿, 透气较纯棉好一些. 不容易被染色, 几乎不缩水, 特别是加了氨纶后.
一般会和一些合成纤维混纺, 使布料具有一定的弹性. 也有和纯棉混纺.
清洗多次没有明显的变化.
丝(Silk) 天然动物纤维, 属于蛋白质纤维(Protein Fibre). 有光泽, 柔软, 透气优于纯棉, 会缩水.
一般也可能加其它合成纤维, 比如氨纶, 以增加弹性, 减少缩水.
只适合手洗, 不可揉搓, 不可拧干, 不能用洗衣粉, 洗衣皂, 香皂等洗涤品. 只能用专门的洗涤剂, 或者洗发水, 不能暴晒, 只能阴干.
帆布(Canvas) 是粗厚的棉织物或麻织物, 日常主要是帆布鞋, 帆布包. 坚硬, 耐磨, 相对于皮革比较透气, 重量轻.
主要是指动物毛皮, 衣服主要有牛皮, 猪皮, 小牛皮, 山羊皮, 绵羊皮. 皮革衣服普遍很贵, 并且只适用于特定场合, 所以基本不普及, 很多场合也有特性更好的合成纤维代替.
另一个大量使用皮革的是鞋, 主要有牛皮, 羊皮, 猪皮, 当然现在也有部分场合被人造革代替.
皮革都需要特别的护理, 不宜浸水, 需要防霉, 防蛀.
人造革主要是高分子聚合物, 主要原料是PVC, PU, 无纺布.
早期的人造革耐磨都不如皮革, 还有过以人造革假冒皮革的, 但是现代制造出了一些比较好的人造革. 现在多数运动鞋都使用人造革, 比皮革轻, 有光泽, 颜色美观, 耐磨程度相当, 还易于加工, 日常护理相对较皮革容易.
目前人造革就是透气上可能不如皮革, 一般鞋会通过设计透气孔, 搭配其它材料来改善透气.
合成革和人造革据说是不同的东西, 不过我现在区分不出来, 在运动鞋的材料说明上很多也写的有合成革.
白色运动鞋清洗完最好使用吸水纸包裹避光晾干, 也避免鞋面发黄.
前文参考了以下网站的资料
使用 Google 搜索.
]]>\uXXXX
格式表示的字符, 其中XXXX
是16进制数字的字符串表示形式, 在js中这个叫Unicode转义字符, 和\n
\r
同属于转义字符. 在其他语言中也有类似的, 可能还有其它变形的格式.
多数时候遇到需要解码的情况多点, 所以会先介绍解码decode, 后介绍编码encode.
下文会提供Javascript C# Java三种语言下不同方法的实现和简单说明, 会涉及到正则和位运算的典型用法.
1 2 3 |
|
unescape
是用来处理%uXXXX
这样格式的字符串, 将\uXXXX
替换成%uXXXX
后unescape
就可以处理了.
1 2 3 4 5 |
|
和解码中相对应, 使用escape
编码, 然后将%uXXXX
替换为\uXXXX
, 因为escape
还可能把一些字符编码成%XX
的格式, 所以这些字符还需要使用unescape
还原回来.
escape
编码结果%uXXXX
中的XXXX
是大写的, 所以后面的replace
只处理大写的A-F
.
不使用正则和escape
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
遍历字符串中的字符, 那些charCode
大于256的会转换成16进制字符串c.toString(16)
, 如果不足4位则左边补0pad.substr(0, 4 - c.length)
. 结尾将遍历的结果合并成字符串返回.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
正则和js中的一样, 将XXXX
转换以16进制System.Globalization.NumberStyles.HexNumber
解析为short
类型, 然后直接(char)c
就能转换成对应的字符, "" + (char)c
用于转换成字符串类型返回.
由于正则中也有\uXXXX
, 所以需要写成\\uXXXX
来表示匹配字符串\uXXXX
, 而不是具体的字符.
上面使用到了Lambda, 需要至少dotnet 4的SDK才能编译通过, 可以在dotnet 2下运行.
1 2 3 4 5 6 |
|
和C#的解码实现正好相反, 0-255之外的字符, 从char
转换成short
, 然后string.Format
以16进制, 至少输出4位.
和C#相似的, 使用正则
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Java语言没有内嵌正则语法, 也没有类似C#的@"\u1234"
原始形式字符串的语法, 所以要表示正则中匹配\
, 就需要\\\\
, 其中2个是用于Java中字符转义, 2个是正则中的字符转义.
Java语言中没有设计函数或者委托的语法, 所以它的正则库提供的是find
appendReplacement
appendTail
这些方法的组合, 等价于js和C#中的replace
.
这里使用StringBuffer
类型是由于appendReplacement
只接受这个类型, StringBuffer
有线程安全的额外操作, 所以性能差一点. 也许第三方的正则库能把API设计的更好用点.
Integer.parseInt(m.group(1), 16)
用于解析为int
类型, 之后再(char)
, 以及Character.toString
转换成字符串.
因为StringBuffer
的原因, 不使用正则的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
手工做就是麻烦很多, 代码中也一坨的符号.
遍历所有字符chars
, 检测到\u
这样的字符串, 检测后续的4个字符是否是16进制数字的字符表示. 因为Character.isDigit
会把一些其它语系的数字也算进来, 所以保险的做法'0' <= ch && ch <= '9'
.
Character.digit
会把0-9
返回为int
类型的0-9, 第2个参数是16时会把a-f
返回为int
类型的10-15.
剩下的就是用|=
把各个部分的数字合并到一起, 转换成char类型. 还有一些调整遍历位置等.
考虑到Java正则的杯具, 还是继续手工来吧, 相对解码来说代码少点.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
对应于上文Java编码的实现正好是反向的实现, 依旧遍历字符, 遇到大于256的字符, 用位运算提取出4部分并使用Character.forDigit
转换成16进制数对应的字符.
剩下就是sb.toString()
返回了.
购买黑莓主要是想试试全键盘的手机, 黑莓全键盘手机主要是两个系列, Bold 经典设计, Curve 小巧设计, 其实Curve和Bold的大小差异就是几毫米.
不同时期黑莓手机就是屏幕, 性能, 外观差异, 比如7xxx 87xx 83xx 85xx 89xx. 同一时期的主要是网络制式, GPS, WiFi, 发行地区, 键盘Y/Z倒置之类的差异.
黑莓的型号数字大小和发布日期最初是有些对应关系的, 但是后来就很混乱了, 不仔细找资料还真很难区分.
我购买的是水货的BlackBerry Curve 8310, 以下简称bb8310, 铁灰色, 和图片上哪种颜色不同.
GSM网络制式, 国内能用移动和联通的2G网络.
支持GPRS/EDGE上网, EDGE是GPRS升级, 理论上快一点, 但是我没感觉到. EDGE移动的基站支持的比较多, 联通挺多的还是GPRS.
Intel PXA901 312 MHz, 就实际使用的流畅感觉来说, 所有点击操作都有延迟的感觉, 列表滚动经常短暂的卡顿.
内置存储 64M, 精简ROM后还能剩30M左右, 安装第三方应用都需要占用内置存储空间.
支持MicroSD(TF)卡, 应该是不支持SDHC, 不过实际我用的是2G的, 因为bb8310读写速度极慢, 写入速度低于1M/s.
320x240解析度的TFT屏幕, 阳光下可以看清字, 因为会自动调整背光强度.
带GPS, 带200w像素的摄像头, 无自动对焦, 带闪光灯, 闪光灯实际当手电筒使用.
无WiFi, 有WiFi的那个型号只能使用系统自带浏览器上网, 第三方应用要折腾导入服务预订
轨迹球导航键, 比侧边的滚轮能提供4个方向导航, 但是比更新型号的光学触控板更容易变油腻, 老化明显.
图片JPG, BMP, TIFF. 音乐AMR, MP3, WMA. 视频MPEG4, 3GP(H.263), 不建议考虑视频, 即使是录制的视频质量也太差, 没有实际意义.
硬件参数什么的只能说是, 哪个时期, 水货哪个价格还行, 行货价格极高.
正面的LED灯十分有用, 能够表示未接来电, 新短信, 充电中, 充电完成, 电量低. 配合第三方软件还可以有其它的提醒用途.
侧面框和顶部都是橡胶油涂层, 手感好, 但是bb8310有点问题, 用一段时间后, 磨损等会让所有涂层都脱落, 就剩塑料了.
外部扬声器在顶部, 有缝隙, 不怕手机压到什么地方后声音太小.
bb8310的键盘按键有些特殊, 是比较硬的哪种, 按下后会响. 由于是Curve的小巧设计, 有些人可能会觉得按键太小, 我感觉还好.
左右两侧中部的按键可以设置为启动自定义的软件, 我是其中一个设置为摄像机, 用于开启闪光灯, 当手电筒用, 另外一个设置为百度输入法, 具体为何会在下文说明.
最好也买一个休眠套, 一般是牛皮的, 除了省电外, 还能在拿出休眠套后自动点亮屏幕, 可以理解为直板手机的翻盖开关.
黑莓中可以安装的软件主要是alx, jad, cod:
alx是黑莓自己的格式, 可以使用黑莓的PC工具中带的AppLoader刷机工具安装.
jad是JavaME的标准, 一般是在线安装, 如果已经下载好了可以用 多媒体 中 黑莓键 - 浏览 打开来安装.
cod, 上面2个一般都是安装描述格式, 这个才是软件自身, 一般需要使用工具生成alx或jad然后来安装, 也可以使用BerryBox直接安装.
排名不分先后.
比黑莓自带的浏览器靠谱很多的第三方浏览器.
bb8310只能使用在线地图, 必须将 选项 - 高级选项 - TCP 中的 APN 设置为cmnet
才行, 非中国移动的设置成对应的XXnet
. 感觉Google地图的定位速度比较快.
可以使用离线地图包, 也可以制作自己的地图包. 地图保存在TF卡上, 刷机后一般建议重新导入离线地图包.
来电归属地显示, 不过这个在bb8310上并不总是一定能看到, 还好可以在通话记录中手工查找归属地, 归属地数据库不定期更新.
提供IP拨号功能, 可能受限于API, 不能高度和系统集成, 只是拨号时增加了一个菜单项.
提供接通震动, 拨号后等待接通的这段时间可以不必要一直听着手机.
和来电助手是同一个开发者, 是一个快捷启动软件的工具, 用来对付哪些没有设置快捷键的软件.
百度黑莓输入法
曾经叫点讯梅花输入法, 利用黑莓键盘最下方的5个键来选字, 比默认的输入法选字速度快, 支持双拼(自定义双拼方案).
在bb8310上缺点是它是在独立程序 百度记事本 中输入好之后再粘贴的, 基本上BlackBerry OS 4.5的第三方输入法全都是这样, 黑莓的公司一直以来对开发者不怎么待见. 所以我设置为右侧中部按键启动 百度记事本.
由于基本都是泄漏出来的, 所以没有什么官方地址, 自行Google或者到这里下载
直板手机都有的, 因为黑莓提供了休眠套, 所以黑莓自身没有超时自动锁键盘的功能, 所以用这个软件来完成超时自动锁键盘.
桌面图标显示为农历的日期, 包括24节气什么的.
还有一个PanvsCalendar, 功能更多一些, 收费的, 和桌面农历不是同一个开发者, PanvsCalendar作者的淘宝店.
黑莓上的微博工具, 支持新浪微博, 街旁网, 做啥网, 我多数时候用新浪微博.
不过bb8310及同系列的, 要么没WiFi, 要么第三方软件不能使用WiFi, GPRS速度太慢了, 就算是EDGE也没太大提高.
贝贝词典
十分快速小巧的词典软件, 可以自定义词库, 作者提供有一个英汉词典.
作者没有设置网站, 主要在maxpda论坛发布, 可以自行Google或者到这里下载
连接电脑后, 使用导入客户端导入时必须同时启动手机上的贝贝词典.
需要注意的是词库会导入到黑莓的数据库, 这会在使用黑莓桌面工具备份数据库的时候速度极慢.
如名字所示, 记事本, 可以编辑txt和系统内部的记事本. 名字是英文的, 但是界面有中文.
可以用这个把系统记事本保存到TF卡上.
GBBReader
文本格式阅读器, 打开速度极快, 我觉得这个是作为BBNotePad的搭配, 这个阅读十分方便, 中文字体可以开反锯齿, 效果会好点.
作者没有设置网站, 我也没找到主要在什么网站发布, 只能自行Google.
Nintaii
磨时间的移植类游戏, 自行Google
这是个PC端工具, 需要dotnet 2.0运行环境, 可以实现黑莓上的安装软件, 备份软件, cod生成alx和jad, 完整刷机前的清除, 同步时间, 截屏, 工程模式激活码, OTA下载功能.
拨号键 - 黑莓键 - 选项 - 智能拨号 中 国家地区号码设置为+86
表示中国, 国内号码长度设置为11
表示国内的手机号码长度.
这样可以避免一些拨号的问题, 国行应该不需要这样的设置吧.
在通讯簿中, 黑莓键 - SIM 电话簿 - 黑莓键 - 全部复制到通讯簿.
bb8310的通讯簿不能以拼音索引联系人, 必须输入汉字才行, 这算是黑莓做本地化的失败之处. 听说新的机型已经支持拼音索引了.
替代办法是给联系人设置上公司名字, 可以仅填上首字母, 或者按照英文人名规则哪样空格分割.
有一个软件叫 通讯簿批量添加拼音缩写小工具 , 来自uulab.org, 但是目前只能访问uulab.cn, 第三方网站上还能下载到, 比如这里
还有莓软360的凌波微步 SmartDial通过独立实现通讯簿方式实现按拼音索引, 但都受限于黑莓的API, 和系统集成的不是很好.
通讯簿可以给联系人设置头像, 但是哪个却限制为一个很小的图片, 来电时会显示一个很小的头像, 很莫名其妙的设计.
bb8310默认带的字体在英文的表现比较好, 中文的则必须把字号设置大一点才方便看, 中文没有反锯齿.
但是奇怪的是GBBReader中显示中文却可以反锯齿, 难道是黑莓有意为之?
断网主要是在APN为net接入点时, 第三方软件间歇性无法访问网络, 原因比较奇怪, 看表现应该是黑莓对运营商的新旧网络设备不兼容.
这个问题在比bb8310更新的机型中也存在, 我不知道最新的是否有解决这个问题.
这个一般是在安装一些主题或软件后会发生, 处理办法是将语言设置为英文后重启, 重启方法见下文.
我看过黑莓的应用程序开发SDK, 没有发现任何明确的, 控制手电筒的API, 也没有找到能单独打开闪光灯的应用, 这个好像都只有在新的黑莓手机和SDK中存在.
所以只能将左侧的键设置为摄像机, 用空格键切换闪光灯为强制开, 以后要开手电筒就按左侧的键, 等一会就能打开, 只是需要过一会动一下滚迹球, 否则会自动锁屏.
发送彩信基本没有什么特殊的设置, 但是接收彩信需要确保是下面的设置
选项 - 高级选项 - 浏览器推入中, 选中启用 WAP 推入.
选项 - 彩信中, 多媒体接收和自动检索选中, 消息过滤中的拒绝最好取消掉.
接收彩信必须打开移动网络中的数据服务.
选项 - 媒体卡中的
然后连接电脑就应该能看到新的盘符.
需要注意的是, bb8310确实是USB 2.0的接口, 使用的TF卡确实是Class 4的, 读取至少在10M/s以上, 写入至少在4M/s. 但是在bb8310上读取在1M/s左右, 写入大概0.8M/s左右, 不确定是硬件还是软件限制的原因. 所以如果是大文件建议拔出来用读卡器.
bb8310桌面上的关闭电源会有关闭和完全切断电源两个选择
关闭类似待机, 如果设置了自动开机会生效, 启动很快.
完全切断电源类似休眠, 自动开机不会生效, 闹钟也不会生效, 但是启动很快.
bb8310没有通过软件真正关机的办法, 只能是拔电池. 下次安装电池就会自动开机.
推荐使用 左Alt + 右Shift(左下角和右下角的键) + Del 重启, 毕竟拔电池再安装太麻烦了.
重启速度很慢, 大概3分钟.
这个是黑莓故意为之, 他会配合运营商限制用户对手机的一些功能的使用和设置, 包括浏览器, 彩信, WiFi.
这么做的好处是运营商相关的一些网络配置是自动化设置好的, 坏处是运营商会在很多地方和用户为敌, 而黑莓正好处处配合运营商.
网上有导入服务预订 Service Book设置的可以解除锁定, 我觉得很复杂, 用过一次, 结果不能上网了.
发送文件一般比较简单, 但是用黑莓接收就需要绕点弯了.
多媒体 - 黑莓键 - 使用蓝牙接收, 后续按照屏幕指示就可以了.
没有自动接收, 批量接收, 总体感觉蓝牙的使用极其繁琐.
在通讯簿中, 查看一个联系人的信息, 将光标移动到联系人的号码上, 黑莓键 - 复制到SIM电话簿.
没有批量操作方式, 我也没找到第三方软件有这样的功能, 好像是黑莓的API限制.
黑莓桌面工具的同步功能可以将通讯簿导出为逗号分割的文本格式, 可以在Excel或者WPS表格中编辑, 但是这个操作过程还是很麻烦的.
设计很是奇怪, 软件的快捷键启动方式可以由
没有快捷键设置的软件可以使用上文中提到的黑莓热键大师, 黑莓系统内的快捷键可以自行Google
黑莓禁止这种功能, 估计最新的API也不提供这样的功能.
目的是睡觉前使用, 在睡着后自动停止.
bb8310的音乐播放功能好像完全被系统自身的音乐播放器控制, 所有的音乐都由系统自身的音乐播放器来播放.
我没有找到bb8310可用的这种音乐播放软件.
进入工程是 Alt + Shift + H, 然后在BerryBox中输入这个界面上看到的PIN, 应用程序版本, 启动时间等信息, 然后选择一个进入工程模式的时间, 点击获取激活码, 得到的应该是8位的字符, 在黑莓上直接输入哪些字符就会进入工程模式, 之后在工程模式的时间内, 按 Alt + Shift + H 会直接进入工程模式的界面.
我也没发现工程模式中有什么特别有用的功能.
自带的拼音输入法, 在极个别的情况下会导致系统死机, 我没有能找出重现这个现象的方法, 但是出现过一次. 输入法应该除了黑莓开发的, 就是黑莓的合作运营商开发的.
在插入耳机的情况下, 并且使用了自动开关机, 自动开机后可能闹钟不使用外放, 而使用耳机播放闹钟的音乐.
一般水货商卖的机器会安装好很多东西, 也基本够用, 如果想精简成完全适合自己的就需要刷机了. 当然也可以是为了使用更新版本的ROM而刷机.
刷机前先要确定使用哪个版本的ROM, 不同的机型对应不同的ROM, 我的bb8310主要用过的是
8310EastAsia_PBr4.5.0_rel294_PL2.7.0.105_A4.5.0.174_Hutchison_maxpda.exe
8310EastAsia_PBr4.5.0_rel306_PL2.7.0.106_A4.5.0.182_AT_amp_T.exe
相关的下载可以用文件名搜. 这两个ROM实际差异感觉不明显, 后一个第三方软件兼容好一点点, 只是因为黑莓的软件不多而显得可能比较明显.
可靠的刷机方式是使用黑莓桌面工具中的AppLoader, 路径是C:\Program Files\Common Files\Research In Motion\AppLoader\Loader.exe
.
一般完整刷机(WIPE刷机)需要1小时, 再加上安装和配置软件什么的估计需要2小时, 赶上重装Windows了.
AppLoader也用于安装alx格式的软件, 不过我更推荐使用BerryBox作为日常安装软件, 除非某些软件必须使用AppLoader.
刷机或者安装软件后可能需要重启, 这个重启近乎和左Alt + 右Shift(左下角和右下角的键) + Del一样, 启动需要3分钟左右, 显然黑莓给自己留了重启的API.
使用AppLoader刷机时会看到有2个拼音输入法和2个笔画输入法, 每个里面第2个是繁体的, 简体中文只需要选中第一个.
ROM中一般会携带一些运营商和合作伙伴的软件, 很多的其实用不到, 所以就出现了各种ROM精简方法.
这里有个批处理, 是针对8310 os4.5 rom的精简批处理脚本, 保存后, 将比如C:\Program Files\Common Files\Research In Motion\Shared\Loader Files\8310-v4.5.0.182_P2.7.0.106
这样的目录拖到批处理文件上, 或者在命令行下手工指定路径运行这个批处理, 就可以对指定路径的ROM精简, 精简掉的文件都移动到了rom目录下的backup目录.
黑莓桌面工具可以完整的备份黑莓中的配置, 但不包括安装上的软件. 恢复也是覆盖式恢复, 不会合并, 实际用途好像仅限于刷机前的备份.
能有价值备份的也主要是联系人, 短信, 通讯记录, 日程, 任务, 笔记之类的.
全面备份可能会因为类似贝贝词典这样的软件而中间卡很长时间.
备份的格式是ipd格式, 一种私有的2进制格式, 不是很方便修改.
在黑莓公司开始下坡之前, 一直都和各个国家的运营商走的近, 上文多处也提到一些事的端倪.
对开发者比较不待见, 比如曾经不给中国开发者提供SDK下载. 在Android大量抢夺开发者的时候, 黑莓仍旧搞的和苹果一样, 对开发者收取软件签名用的证书费用, 后来降成1$, 最后免费, 不过为时已晚. SDK的维护不力, 大量私有的API. 后来情况有些改观, 但是也是太晚了, 坏的印象留下就无法抹去, 况且当时Android和iOS已经抢了主要的开发者.
对最终用户有一种很奇怪的态度, 一方面积极完善BIS BES这种”企业级”应用, 另一方面对旧产品疏于维护, 甚至一些问题会从旧的到新的产品中持续存在. 迟迟到来的应用商店对旧型号的支持还不如应用商店中的一些软件, 即应用商店中的软件支持这个旧机型, 但是应用商店自身却不支持. 虽然四处和运营商合作, 但是黑莓的网站仍旧慢的可以, 无论是用户还是开发者的感受会十分差. 大肆扩张业务的国家和地区, 但是相应的本地化却太肤浅, 至少我觉得和中国地区的一些优秀本地化应用开发者或公司合作太少, 感觉还是走亲近运营商的老路了.
中国地区的BIS好不容易才能用, 不过感觉还是太贵了, 多数人可能更在乎的是手机上方便的发邮件, 收邮件并不需要实时, 况且我根本不相信运营商能提供足够稳定的服务实现实时接收. BES好像还没什么消息, 除了贵之外, 可能也和国内公司没有使用Email的习惯吧.
黑莓公司现在的状况很差, 股价大跌, 公司高层的频繁变动, 还有政策变动, 裁员, 新产品销量达不到预期, 可能和Android关系更多, 反正是这个坎很难过.
]]>以下是代码, 多数代码都是从Jeykll插件示例中抄的, 第一次写实用的ruby程序, 也没多想注释什么的.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
1 2 3 4 5 6 7 |
|
需要修改sass/_partials.scss
, 结尾加入一行
1
|
|
1 2 3 4 5 6 7 8 9 10 11 |
|
目前只做了生成分类页面, 侧边栏还没有做, 以后有做的冲动了再说吧.
Migrating from Wordpress to Jekyll - Part 2 Tag cloud 段落
How to create a tag cloud? (With formula and sample calculation) 算法
octopress / plugins / category_generator.rb Octopress修改的具体分类页面生成插件
RemotingException : 拒绝访问
异常, 期间查找异常原因的时候发现中文不大容易搜到正确的答案, 也可能是因为Remoting是已经不再支持的技术吧, 因为历史的原因还不能使用WCF, 所以这里将这个异常的原因和解决办法介绍一下.
发生这个异常的场景是一个Windows服务程序在IPC信道注册, 另外一个桌面程序连接到IPC信道通讯, 重点是在IPC信道注册的程序是Windows服务, 默认情况下它将运行在LocalSystem帐号下, 连接这个IPC信道的是另外的用户启动的进程.
错误的原因是向IPC信道注册时, 默认的授权是相同用户的进程才可以访问这个IPC信道, 可以通过下面的代码修改默认授权:
1 2 3 4 5 |
|
其中portName
变量是IPC信道的名称
在IIS中运行的Web应用一般也是由一个IUSER_xxxxx
的用户运行, 所以还有通过web.config
配置方式在IPC信道注册的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Calling a Windows Service from ASP.NET via Remoting & IpcChannel
MSDN的文档对属性值并没有太多的说明, 这个里面有多个示例.
这里不会解释具体的代码含义, 仅仅介绍写法, 可能不适合刚开始学习.
使用前必须要有具体的委托类型, 下面的例子中会使用到这些常用的委托类型
1 2 3 4 5 6 7 |
|
Action
和Action<in T1, in T2>
是在dotnet 3.5 sp1出现的一个很实用的委托, 类似的还有1-16个参数的, 这里主要使用这2种.
Predicate
是从dotnet 2.0就出现的, 一般是在泛型集合的查询中使用.
Func<in T1, in T2, out TResult>
也是dotnet 3.5 sp1出现的, 和Action
基本一样, 也有1-16个参数的, 和Action不同的是这个委托都声明有返回值类型, 而不是Action
的void.
最简单的Action
1 2 3 4 5 6 7 8 9 |
|
对于复杂的委托, 比如Func
1 2 3 4 5 6 7 8 9 |
|
和上一个区别就是不需要创建Foo
方法了
1 2 3 4 |
|
Predicate
就是这样的
1 2 3 4 |
|
右边的new xxxx()
可以省略
1 2 3 4 |
|
由于也是一行代码, 结尾的分号还是必须的.
也适用于最初的写法
1 2 3 4 5 6 7 8 9 |
|
如果使用的是dotnet 4的编译器, 可以使用var
, 看起来就像是颠倒过来了
1 2 3 4 |
|
var
是编译器提供的魔法, 会自动推导=
右边的类型, 当然前提是右边的可以推导出来类型, 无法推导出来就会编译错误.
1 2 3 4 5 6 7 |
|
语法方面, 无参数要写成()
, 1个参数可以省略括号, 2个及更多参数则必须括号()
; =>
右边必须有表达式; 表达式结果必须是委托的返回值类型, 如果委托返回值类型是void则无所谓表达式结果类型.
Lambda也算是编译器魔法, 上述Lambda表达式特点都是左边的委托类型明确, 即委托的参数, 返回值也是明确的, 和var
相似, 类型是可推导出来的, 那么就可以使用Lambda, 这样就省了写一堆的参数类型和return语句.
实际使用中可能是这样的
1 2 3 4 |
|
即除了声明变量, 参数是明确的委托类型时, 也可以使用Lambda.
Lambda的=>
右边也可以是多行代码
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 |
|
执行时会按照先加先执行的顺序, 如果有返回值, 那么将使用最后加进来的委托的返回值.
同样也可以从叠加的里面减去, 不过这里是按引用, 所以需要保留一个加进去的委托引用.
1 2 3 4 5 6 |
|
C#提供了一个event
关键字用于声明一种特殊的委托, 可以在类外部+=
-=
, 但是执行委托只能在内部
1 2 3 4 5 6 7 8 9 10 11 |
|
默认的事件实现中+=
-=
是线程安全的, 这点可以在反编译event
的源码中看到, 如果要自行实现event
的+=
-=
则需要自行处理线程安全.
使用委托可以避免创建太多的中间方法, 而使用Lambda, 则可以使在写委托的时候避免大量的delegate
关键字和重复的委托参数类型声明.
也许会让代码不是很容易理解, 但是只要遵循一些约定, 熟悉了还是没关系的.
重要的是这会少写很多重复的东西, 同样修改时也少修改一些东西.