分类: 存档
学习卡拉特拉娃
我最近一直在和卡拉特拉娃玩, 这很有趣。最令人兴奋的方面是他们的跨平台的方法。他们推动可重用中间件 (例如共享应用程序逻辑), 同时保留 ui 层本机。
有趣的是, 共享逻辑是在咖啡脚本。因此, 它甚至可以在其他平台上共享, 如 embr. js 和 node. js–前提是逻辑在本质上足够可重用。
到目前为止, 我唯一的抱怨是该项目的文件不差。例如, calatrava 支持 ios 和 android 上的本机 ui, 但通过运行 calatrava 创建 myapp 生成的示例应用
程序仅在 ios 上显示本机 ui。生成的 android 应用程序正在使用 web 视图。
首先, 您需要更改转换窗体类 (位于 droid/myapp
c mypp/mypp/) 从 com.calat
rava.bridge.RegisteredActivity 继承
。所以, 这一点:
成为:
接下来, 您将主要了解转换窗体的现有实现 (离开 getage
name 方法, 其
他一切都将继续), 并重写 getfieldvalu
e 和呈现
:
getfiel
dvalue 方法是咖啡脚本和本机脚本之间的桥梁。具体而言, 它允许 calatrava 知道屏幕上当前有哪些值。因此, 对于文本字段, 它可能如下所示:
((edittext) 这. findviewbyid (R.id.my _ field). gettext (). tostring ();
因此, 为了编写此方法, 您需要创建一个布局文件。调用它转换 _ form. xml
, 并将其置于 droidres·ret布局下
:
现在重新访问该操作, 并覆盖在 "创建" 上:
如果你现在通过运行 rake droid 来运行应
用程序: 部署你会使用你的自定义视图变灰, 但它还不能正常工作。有了它, 让我们重新审视我们的 getfielvalue
方法。
如果你看一下 ios 示例应用, 你会知道应该如何实现此方法:
或者, 您可以查看 kernel/app/转换器下的 control
ler.converter.
coffee, 并查找对 views.conversi
onForm.get 的所有调用, 以查看此控制器引用的视图控件。在这种情况下, 它引用:
- 以 _ 货币
- 出 _ 货币
- 金额为 _
让我们通过实现 getfieldvalue 方法将这些连接到我们
的布局:
现在, 让我们对输入和输出货币类型进行硬编码。然而, 我们已经实现了 "量" 字段,
因此我们实际上是将我们的本地视图连接到 calatrava (尽管只是在一个方向上)。为了在 coffescript 视图控制器中触发事件, 我们将使用 com.calatrava.bridge.RegisteredActivity.triggerEvent (string 事件, string..。外)
方法。幸运的是, 我们的活动是注册活动
, 因此我们可以调用触发器
事件
。这样做将直接调用 coffecript 方法, 传递任何参数。在我们的例子中, 我们要调
用转换方法, 我们不需要传入任何参数。用类似的命名方法包装这一点, 可以让我们:
最后, 拼图的最后一部分是完全实现渲染方法, 以便可
以将值从 calatrava 传递到您的本机视图中。在 android calatrava 上,
将提供一个包含 json 的字符串, 它取决于 render
的实现来解析它。除了 ios 和 android 之间的微小差异外, 再看看转换窗体视图
. m 揭示了此方法的意图:
在 key/值上循环,
呈现方法将尝试将每个键与 ui 元素的名称匹配并绑定其值。android 的实现如下所示:
不幸的是, 按原样运行此代码会导致运行时错误。似乎卡拉特拉娃从非
ui 线程调用渲染, 导致以下崩溃:
E/AndroidRuntime(13246): org.mozilla.javascript.WrappedException: 包装 android.view.ViewRootImpl $calledfromw失r翼 threadexception: 只有创建视图层次结构的原始线程才能触摸其视图。(calatrava/scripts/bridge.js#34)
黑客攻击蓝牙 le
灵感来自于最近阅读了一篇关于模拟蓝牙 le 与廉价 nrf24l01 + 模块的文章, 我决定采取的土地和订购一些易趣。我最终花了196美元的10单位与航运包括, 所以约1.20 美元的单位。足够多的额外乐趣:-)我最初的想法是使用德米特里的例子, 咬撞 btle, 但适应它运行 atmeg328-pu。这证明比我预想的要困难一些, 主要是因为 (我怀疑) dmitry 正在使用的编译器和 avr gcc 之间存在差异。例如, dmitry 的代码使用了 cbi
和 a
bi 函数。我不熟悉这些, 一些搜索显示, 他们已经错过了 (弃用, 然后实际上删除) 从 avr gcc 了一段时间。由于不完全理解这些职能的目的, 我的移植工作也受到阻碍。我最终找到了这个样本的一个端口, 从这个港口我能够推断应该做什么。最终, 我得到了这样的结果:不幸的是, 这似乎什么都没做。至少, 根据 iStumbler 的说法, 运行他们的蓝牙扫描仪并没有发现任何迹象表明我的小 avr 正在广播。这大约是我周末能做到的, 所以我还不知道问题出在哪里。我怀疑要么我使用了 iStumbler 的错误, 要么我移植 spi 实现的方式出了问题。无论哪种方式, 这都是我以后要挖掘的。
新博客
在离开博客空间一段时间后, 我想我早该重新开始我的博客了。我正在使用 jekyll 和 github pages 为这个网站提供动力。到目前为止, 这是一个相当简单的过程, 这个系统的灵活性给我留下了深刻的印象。每天使用复杂的系统, 很高兴知道, 我可以让我的博客恢复和运行, 而不会搞乱 web 托管 (和每月成本), 一个数据库和 web 服务器来配置。不是我做不到, 也不是说我过去没有, 而是杰基尔的简单让人耳目一新。我预计随着网站的发展, 将增加更多的功能。例如, 就在今天上午, 我添加了注释的 "不对项"。目前为止,一切都好!
在 os x 上安装 avr-gcc
avr-gcc 编译器可以通过家庭酿造安装在 os x 上。目前它不是任何官方公式的一部分, 但它可以很容易地安装使用水龙头。在 os x 小牛 (10.9.1) 我只是:
通宵软件设计提示: 提示 #2
对于《四夜的软件设计提示》的第二部分, 我想谈一些关于异常的问题。. net 中的异常提供了处理错误的绝佳方法。我们都知道不要使用异常来控制流, 但还有许多其他方法可以滥用异常。
滥用异常可以是任何东西, 从引发基本异常类, 到抛出的不仅仅是异常。但最常见的滥用异常处理的方法是简单地压制它们。我们都看到了一些应用程序, 它们执行类似于以下操作:
某业务对象 bo = SomeBusinessObject.LoadWithId(4); 尝试 { 博。值 = int。分析 (txt text领域. text); } 捕获 { 值不是 int..。所以忽略它。 } 博。保存 ();
抑制异常的问题在于, 大多数组件并不只是为了好玩而抛出异常, 因此首先引发异常的一些根本原因。
上面的例子看起来足够无辜。int32 的 parse 方法如果无法解析输入字符串, 则会引发异常。但是, 如果将来另一个开发人员认为业务对象的 "某种价值" 需要某种限制可接受值的业务规则, 该怎么办?
公共类某些业务对象 { 其他类代码 公共 int 某些值 { 获取 {返回 _ 某个值;} 集 { 如果 (值< 0)></ 0)> 引发新的业务规则异常 ("某些值的无效值"); _ 值 = 值; } } }
将已部署的 asp. net 站点与 ndebend 进行比较
很少有东西可以与继承现有软件项目的经验相比, 当 (无论出于何种原因) 原始开发人员都不在公司。我自己也遇到过几次这种情况, 它永远不会失败, 你及时继承了代码库, 以修复 bug 或实现新功能。
每当发生这种情况时, 我担心的一个问题是, 网站的部署版本是否与源代码管理中的最新版本相匹配。在一个理想的世界里, 源代码控制系统会在最后一次部署时被标记, 他们的工作几乎不会有什么猜测。但生活很少是这种理想。实际上, 除了驻留在服务器上的二进制文件之外, 通常没有指示上次部署到生产中的时间和内容。
幸运的是, ndepend 有很多强大的功能, 可以帮助解决这个确切的困境。对于那些从未使用过 ndepend 的用户, 它是一个非常强大的. net 静态代码分析工具, 包含的功能比我在这里所能做到的要多。对于那些感兴趣的斯科特·汉斯曼在这里写了一篇伟大的评论, ndepend 网站上也有几个屏幕截图。
比较二进制文件
为了演示这一点, 我将把我目前部署的博客 (我恰好知道它正在运行 dasblog 版本 2.3) 与 dasblog 2.2 的已知版本进行比较。若要开始, 请确保您有要比较的两个网站的本地副本, 然后打开 ndebend 的副本。
若要比较源文件, 您甚至不需要创建项目文件。您只需从 visual ndebend gui 的 "比较" 菜单中选择 "选择要比较的程序集或分析"。
在本演示中, 我将仅比较随 dasblog 附带的新智能程序集, 但您需要比较这些程序集以表示您自己的自定义代码。例如, 如果您使用了 nhibernate orm, 则不一定要比较 nhibernate. dll。
选择要比较的程序集并单击 "确定" 后, n源将开始分析程序集的过程。根据程序集的数量和大小, 这可能需要一些时间。但是, 作为对你的小等待的奖励, 你很快就会受到足够多的代码指标的迎接, 即使是最仔细的人也会感到快乐。
挖掘结果
一旦执行了代码分析, 我们就可以开始手头的任务, 找到网站的两个版本之间的差异。对于此任务, 主屏幕中有两个值得关注的区域。类浏览器和 cql 查询窗口。
对于熟悉 visual studio 的任何人来说, 类浏览器都非常直观, 只需提供程序集、命名空间和类型的高级概述即可。对于即时满足, ndepd 善意地通过上下文菜单选项提供。从类浏览器右键单击您比较的程序集之一, 然后选择 "更改了什么?", 然后 "从装配公司选择方法..。在哪里 codewaschanged "。代替类浏览器, 您将看到不同版本的方法列表。
在场景背后, n源针对它在代码分析过程中编译的内部数据库发出了它所谓的 cql (代码查询语言) 查询。此数据库包含有关源代码的各种有用信息。使用 cql, 我们可以做的不仅仅是选择已更改的方法。我们可以对返回的内容应用任意数量的约束。例如, 您可能不关心未使用的方法, 即使它们确实不同。使用 cql, 您可以使用如下所示:
从装配公司 "新智慧" 中选择方法。daslog. web " codewaschanged 和 ( 方法 ca > 0 或 ispublic or 单点或 异种接口或 类构造函数或 isfin治器 )
在. net 2.0 下运行 codesmith 2。6
codesmith 是我时不时才拿出的工具之一, 但当我这样做的时候, 它真的派上用场。由于我对 codesmith 的使用相当有限, 我发现 codesmith 的免费软件版本正好满足了我的需求。
因此, 不用说, 当我开始 codesmith 看到一条错误消息, 通知我它需要. net 1.1 操作时, 我感到很失望。明智的做法本来是安装. net 1.1, 但这似乎是一个很大的麻烦, 因为我 (否则) 没有使用. net 1.1。我知道应用程序将尝试在没有1.1 的情况下在. net 2.0 下执行, 除非明确指示它不要这样做, 因此我开始查找阻止它运行的原因。
我首先转到 CodeSmith.exe.config 文件, 在那里我看到:
<startup></startup> <supportedRuntime version="v1.1.4322"></supportedRuntime> <supportedRuntime version="v1.0.3705"></supportedRuntime> <requiredRuntime version="v1.0.3705"></requiredRuntime>
通宵软件设计提示: 提示 #1
数据库标识符并不重要..。向您的用户。当然数据库标识符对数据库很重要, 而且它们对您的数据访问层很重要, 但它们对应用程序的用户来说毫无意义。
《四夜》的软件设计小贴士: 序曲
设计软件就是试图理解构成其部分的逻辑。作为软件开发人员, 我们最多只能对我们应用程序的意图进行粗略的近似。即使是最彻底的需求收集也不能解释每一个最后的排列, 就像单元测试不能保证你的系统工作一样。