`
abruzzi
  • 浏览: 459359 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

可编程计算器(phoc)的设计与实现

阅读更多

前言

借助JavaScript脚本引擎Rhino,可以很容易的实现一个计算逻辑与界面相分离,且很容易扩展的可编程计算器。界面部分使用Swing及Netbeans的SAF(Swing Application Framework),计算部分使用Rhino引擎,来实现基本表达式的计算,以及变量,函数的定义等,绘图采用另外一个开源的库jmathtools(http://code.google.com/p/jmathplot/),更多资料请参看这里。这个可编程的计算器暂命名为phoc(Programmable Higi-Order-Calculator),项目我已经托管到google code,感兴趣的朋友可以参看:phoc(http://code.google.com/p/phoc/)。

 

另外,插句题外话,搬家之后的新空间由于种种原因停止租用,现在又回到了JavaEye,人生何处不相逢啊,呵呵。

 

phoc的主要功能

事实上,phoc更多的是为了展示引擎与界面分离,使得更容易扩展计算器本身,而不需要重新的编译计算器,界面除了负责展示计算结果和参入人机交互之外,不会参杂计算逻辑。而脚本,作为phoc的核心,负责所有的计算以及插件的实现而存在。事实上,phoc的绘图功能,就是用JavaScript脚本来实现的。

 

和其他任何的桌面计算器一样的界面:


 

不同的是,用户可以定义自己的函数,界面的作用很简单,将用户定义的函数作为字符串交给引用rhino来eval:

 

 

/**
 *
 * @author juntao
 */
public class Evaluator {
    public Evaluator(){}
    
    public Object evalScriptString(String expr) throws ScriptException{
        RuntimeEnv executor = RuntimeEnv.getInstance();
        Object obj = null;

        obj = executor.getScriptEngine().eval(expr);

        return obj;
    }

    public Object evalScriptFile(File file) throws ScriptException, FileNotFoundException{
        RuntimeEnv executor = RuntimeEnv.getInstance();
        Object obj = null;

        obj = executor.getScriptEngine().eval(new FileReader(file));
        
        return obj;
    }
}

 

 
 函数定义界面:


在输入框中可以直接调用内建的plot2d来完成绘图:


上图即为sin(x)在-PI到PI之间的曲线,此处我们使用的是第三方的开源的jsmathtools来实现,如果想要实现自己的绘图引擎,则在系统内建的脚本plot.js中修改相关代码即可,不需要对已有的phoc中的java代码做修改。

 

设计与实现

为了尽可能的将计算部分独立出来,我们需要尽可能的将涉及计算的部分放入脚本,然后在应用程序初始化的时候,加载并求值这些脚本,初始化完成之后,负责计算的部分就已经存在于系统中。

 

 

    public void initEnv(){
        computer = new Evaluator();
        memory = new Stack();
        symTable = new HashMap<String, Object>();
        try{
            computer.evalScriptFile(new File("script/system.js"));
            computer.evalScriptFile(new File("script/math.js"));
            computer.evalScriptFile(new File("script/plot.js"));
        }catch(Exception e){
            UIKit.alert(e.getMessage(), "Error while initialize calculator");
        }
        
    }

 

内建的脚本可以做一些工具加载(JSON处理,数学运算,画图等),完成之后,在界面部分的输入框中就可以调用这些内建的函数(当然,可以自己定义函数,然后调用)。

 

我们这里看一下plot.js的实现:

 

 

/**
 * i.e.
 * plot2d(function(x){return Math.sin(x);}, {
 *     start : -3.0,
 *     step : 0.1,
 *     stop : 3.0
 * });
 */

function plot2d(func, range){
    var x = DoubleArray.increment(range.start, range.step, range.stop);
    var y = new Array(x.length);

    for(var i = 0, len = x.length; i < len; i++){
        y[i] = func(x[i]);
    }

    var plot = new Plot2DPanel();
    plot.addLegend("SOUTH");

    var name = func.toString();
    plot.addLinePlot(name, Color.GREEN, x, y);

    var frame = new JFrame("plot function : "+name);
    frame.setSize(600, 600);
    frame.setContentPane(plot);
    frame.setVisible(true);
}

plot2d主要是组织参数,然后使用jmathtools来实现绘图(在一个新的frame中)。

 

至于phoc的其他部分,乏善可陈,无非是界面的布局,按钮的事件处理函数等。

 

附后

源码及发布版(v0.2)已经托管之google code,感兴趣的朋友可以自行下载:phoc(http://code.google.com/p/phoc/)

  • 大小: 36 KB
  • 大小: 34 KB
  • 大小: 66.2 KB
分享到:
评论
14 楼 abruzzi 2012-02-10  
lilinpu221 写道
看楼主的贴受益很大,浅显易懂,楼主文笔不错

谢谢,phoc的新版本中已经支持plot3d的功能,当然,还是依赖于这个优秀的jmathtools。JavaScript-内核系列的第十四章中讨论了JavaScript在Java中的应用,你可以参考下。
http://www.icodeit.org/%E7%AC%AC%E5%8D%81%E5%9B%9B%E7%AB%A0-java%E5%BA%94%E7%94%A8%E4%B8%AD%E7%9A%84javascript/
13 楼 lilinpu221 2012-02-10  
看楼主的贴受益很大,浅显易懂,楼主文笔不错
12 楼 robiplus 2011-01-24  
看到这个。。。我的上个问题有点答案了 对于计算器真的是好想法 妙 eval
11 楼 qingpu 2011-01-19  
abruzzi 写道
beykery 写道
这似乎没有什么意义啊。核心部分js解析执行是别人的开源实现。你套个壳子,感觉这个应用不是很精彩。

呵呵,应用程序就是套壳子了。比如信息管理系统,是给数据库的SQL套个壳子;IDE,是给编译器,调试器套个壳子;游戏,是给游戏引擎,脚本引擎套个壳子;WEB开发,是给socket的一个子集套个壳子。如此而已。

+1
10 楼 abruzzi 2011-01-19  
<div class="quote_title">chinpom 写道</div>
<div class="quote_div">
<div class="quote_title">abruzzi 写道</div>
<div class="quote_div">
<div class="quote_title">coffeesweet 写道</div>
<div class="quote_div">楼主可以想象利用这种方式设计一个规则引擎,允许业务人员填写规则脚本。</div>
<br>可以详细说说吗?</div>
<p> </p>
<p><img src="/images/smiles/icon_biggrin.gif" alt=""> 我觉得LZ还是做一个测试用例生成工具比较好。比如有一个输入框它只接受英文字母、中文、数字和下划线(不包含特殊字符),并且长度为4到10位的以英文字母或中文开头的字符串,那它生成的测试用例应该包括以(英文字母开头、中文开头、数字开头、下划线开头、特殊字符开头)长度为3的字符串……当然还有其它很多临界的测试用例。</p>
</div>
<p> </p>
<p>听着不错, 工作上到还确实有个自动测试的项目, 值得研究下, 呵呵.</p>
9 楼 chinpom 2011-01-18  
<p>我自己想用图算法来解决的 <img src="/images/smiles/icon_cry.gif" alt=""> 可是还没再做</p>
8 楼 chinpom 2011-01-18  
当然,还有一些测试条件是有依赖关系的,总之实现起来还真的很复杂。我们在公司做出个大概给测试人员用了一下感觉不理想就放弃了,真的做起来的话,还可以做很多其它功能的,比如生成Excel格式的测试文档等等。
7 楼 chinpom 2011-01-18  
<div class="quote_title">abruzzi 写道</div>
<div class="quote_div">
<div class="quote_title">coffeesweet 写道</div>
<div class="quote_div">楼主可以想象利用这种方式设计一个规则引擎,允许业务人员填写规则脚本。</div>
<br>可以详细说说吗?</div>
<p> </p>
<p><img src="/images/smiles/icon_biggrin.gif" alt=""> 我觉得LZ还是做一个测试用例生成工具比较好。比如有一个输入框它只接受英文字母、中文、数字和下划线(不包含特殊字符),并且长度为4到10位的以英文字母或中文开头的字符串,那它生成的测试用例应该包括以(英文字母开头、中文开头、数字开头、下划线开头、特殊字符开头)长度为3的字符串……当然还有其它很多临界的测试用例。</p>
6 楼 abruzzi 2011-01-18  
coffeesweet 写道
楼主可以想象利用这种方式设计一个规则引擎,允许业务人员填写规则脚本。

可以详细说说吗?
5 楼 coffeesweet 2011-01-18  
楼主可以想象利用这种方式设计一个规则引擎,允许业务人员填写规则脚本。
4 楼 abruzzi 2011-01-18  
beykery 写道
这似乎没有什么意义啊。核心部分js解析执行是别人的开源实现。你套个壳子,感觉这个应用不是很精彩。

呵呵,应用程序就是套壳子了。比如信息管理系统,是给数据库的SQL套个壳子;IDE,是给编译器,调试器套个壳子;游戏,是给游戏引擎,脚本引擎套个壳子;WEB开发,是给socket的一个子集套个壳子。如此而已。
3 楼 beykery 2011-01-18  
这似乎没有什么意义啊。核心部分js解析执行是别人的开源实现。你套个壳子,感觉这个应用不是很精彩。
2 楼 abruzzi 2011-01-18  
λ-lambda 写道
错误处理上貌似很多问题,比如非法表达式等。

,这个正在改进,基本功能倒是都实现了,开发人员总是按照自己的思路去测试,呵呵。还有好几个小项目都在改进。
1 楼 λ-lambda 2011-01-18  
错误处理上貌似很多问题,比如非法表达式等。

相关推荐

    浙江理工大学2017-2019年历年研究生入学考试试卷,代码:930.pdf

    2. 设计实验利用pUC19在大肠杆菌中表达肠杆菌磷酸转移酶(phoC)并检测表达功能。 3. 分析病毒的遗传物质特点及病毒增殖的方式。 4. 讨论细菌产生耐药性的机制,并从微生物学角度分析人类使用抗生素的后果。 5. ...

    zwp-virtual-keyboard:使用wayland-scanner板条为virtual_keyboard_unstable_v1协议生成的Rust代码

    Pinephone或Librem 5上的Phosh / phoc可以理解。 我通常为我的Pinephone构建示例,并在其上打开编辑器。 然后,我使用scp将可执行文件复制到手机并通过ssh执行它。 现在,您应该看到在编辑器中输入了多个'x'字符。...

    概率图模型Probabilistic Graphical Model论文集9

    而"A PHOC Decoder for Lexicon-Free Handwritten Word Recognition"可能介绍了无词典的手写单词识别中的词形编码解码器,利用PGM来处理手写识别中的不确定性。 "Uncertainty Visualization Using Copula-Based ...

    GIB 8114的规则,检测器,checker

    GIB 8114的规则,检测器,checker

    Sunny+duan-大模型安全挑战与实践:构建+AI+时代的安全防线.pdf

    Con北京站聚焦技术落地与前沿趋势,核心方向包括: ​​AI工程化​​:端侧推理、RAG增强、多模态生成成为主流; ​​云原生深水区​​:混合云治理、湖仓一体架构、可观测性技术持续迭代; ​​安全与效能​​:大模型安全防御、研发流程标准化、平台工程价值凸显; ​​行业融合​​:物流、金融、社交等领域的技术跨界创新案例丰富。 大会为开发者提供了从理论到实践的全景视角,推动技术向生产力转化。

    shotcut22.06.23.exe

    shotcut22.06.23

    李志伟-端侧大模型的安全建设:如何在算力与保障之间找到平衡.pdf

    Con北京站聚焦技术落地与前沿趋势,核心方向包括: ​​AI工程化​​:端侧推理、RAG增强、多模态生成成为主流; ​​云原生深水区​​:混合云治理、湖仓一体架构、可观测性技术持续迭代; ​​安全与效能​​:大模型安全防御、研发流程标准化、平台工程价值凸显; ​​行业融合​​:物流、金融、社交等领域的技术跨界创新案例丰富。 大会为开发者提供了从理论到实践的全景视角,推动技术向生产力转化。

    基于MATLAB/Simulink的电动汽车转弯制动ABS与DYC联合控制模型

    内容概要:本文详细介绍了利用MATLAB/Simulink构建的电动汽车转弯制动模型,该模型集成了防抱死系统(ABS)和直接横摆力矩控制(DYC)。模型采用7自由度设置,涵盖车身纵向、横向、横摆运动以及四个车轮的旋转自由度。文中重点讨论了轮胎魔术公式的实现、滑移率观测器的设计、滑模控制的应用及其参数调试,并展示了双移线工况下的仿真结果。结果显示,在启用联合控制系统后,车身横摆角显著降低,制动距离缩短,证明了系统的有效性。 适合人群:从事汽车电子控制、自动驾驶技术研发的工程师和技术爱好者。 使用场景及目标:适用于研究电动汽车在极端驾驶条件下(如急转弯、紧急制动)的安全性和稳定性控制策略。目标是提高车辆操控性能,确保行驶安全。 其他说明:建议读者关注模型中的关键参数选择和调试技巧,尤其是轮胎模型参数、滑模控制参数以及电机响应延迟等方面的内容。此外,模型提供了丰富的参考资料,便于深入理解和优化控制算法。

    3dmax插件032-阵列多物体.ms

    3dmax插件

    基于PyTorch的MobileNetV1-UNet图像分割项目:快速部署与高效训练

    内容概要:本文介绍了一个基于PyTorch框架的MobileNetV1-UNet图像分割项目,涵盖了从模型构建、训练到预测的完整流程。该项目利用MobileNetV1的深度可分离卷积作为编码器,结合UNet的经典跳跃连接进行解码,实现了轻量级且高效的语义分割。项目中包含了详细的代码实现,如深度可分离卷积、解码器模块、训练脚本、预测脚本以及数据预处理方法。此外,还介绍了如何应对数据集不均衡的问题,优化训练过程,并提供了一些实用的小技巧,如动态学习率调整、数据增强和后处理方法。最终,项目在街景分割任务中表现出色,能够在较低硬件配置下实现高速推理。 适合人群:具有一定深度学习基础的研究人员和开发者,特别是对图像分割感兴趣的从业者。 使用场景及目标:适用于需要快速搭建图像分割系统的场景,如医疗影像分析、自动驾驶、安防监控等领域。目标是帮助用户快速上手并应用于实际项目中,提高开发效率。 其他说明:项目已准备好完整的数据集和预训练模型,用户只需解压即可开始训练和预测。代码经过精心优化,在常见GPU上能够稳定运行,适合初学者和有一定经验的开发者使用。

    信捷触摸屏与士林变频器Modbus通讯实战指南:硬件接线、参数配置及常见问题解决方案

    内容概要:本文详细介绍了信捷触摸屏与士林变频器通过Modbus RTU协议进行通讯的方法和注意事项。首先,强调了正确的硬件接线方法,如使用双绞线并在适当情况下增加120Ω终端电阻。其次,详细解释了参数配置的具体步骤,包括波特率、站号、数据格式等设置。接着,提供了读写频率和其他重要参数的代码实现,并指出了常见的地址偏移和数据格式转换问题。最后,针对通讯超时等问题提出了具体的排查方法和解决方案。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些负责触摸屏与变频器通讯调试工作的人员。 使用场景及目标:帮助工程师快速定位和解决信捷触摸屏与士林变频器之间的通讯问题,提高工作效率,减少调试时间和成本。 其他说明:文中还提供了一些实用的小技巧,如使用Modscan工具进行初步测试,以及通过报文抓取法分析通讯数据,有助于更好地理解和解决问题。

    Delphi 12.3控件之TextShaping4Delphi-main.zip

    Delphi 12.3控件之TextShaping4Delphi-main.zip

    LabVIEW 2018纯软件波形发生器:基于事件结构与生产者-消费者模式的多波形生成与噪声叠加

    内容概要:本文详细介绍了使用LabVIEW 2018构建一个纯软件波形发生器的方法。该波形发生器能够生成四种基本波形(正弦波、方波、三角波、锯齿波),并且可以通过参数设置进行实时调整。此外,还可以向波形中加入噪声,模拟真实环境中的信号。文中详细解释了波形生成的核心算法、噪声叠加的技术细节以及波形显示的优化方法。通过事件结构和生产者-消费者模式实现了高效的参数联动和实时波形更新。 适合人群:对LabVIEW有一定了解的工程师和技术爱好者,尤其是从事信号处理和仿真工作的专业人士。 使用场景及目标:适用于需要生成各种波形用于实验、教学或产品研发的场合。主要目标是帮助用户掌握LabVIEW中波形生成的基本原理和技术细节,提高波形生成的灵活性和实用性。 其他说明:文中提供了许多调试经验和优化技巧,如参数联动、噪声合成、波形图刷新等方面的注意事项,有助于用户更好地理解和应用LabVIEW进行波形生成。

    FPGA图像处理:MIPI CSI-2接收、Debayer转换及USB3.0 UVC传输的实现与优化

    内容概要:本文详细介绍了基于Lattice MachXO3LF-690 FPGA的MIPI相机系统的实现,涵盖MIPI CSI-2接收、Debayer转换、RGB转YUV以及USB3.0 UVC传输等多个关键技术环节。首先,MIPI CSI-2接收部分通过状态机解析RAW10数据流并进行字节对齐,确保数据正确传输。其次,Debayer模块采用梯度插值法和乒乓缓存结构,优化资源利用率并提高处理速度。接着,RGB转YUV模块使用定点数运算代替浮点运算,减少逻辑资源消耗。最后,FX3014的UVC传输部分实现了动态帧率控制和带宽管理,确保不同分辨率下的稳定传输。文中还分享了多个调试经验和优化技巧,如动态FIFO控制、帧率控制策略等。 适合人群:具备一定FPGA开发经验的工程师和技术爱好者,特别是对图像处理和高速数据传输感兴趣的读者。 使用场景及目标:适用于希望深入了解FPGA图像处理流程的技术人员,帮助他们掌握从传感器数据接收、图像处理到USB传输的全流程实现方法,提升系统性能和稳定性。 其他说明:文中提供了详细的Verilog代码片段和架构图解,便于读者理解和实践。此外,还提到了一些常见的调试问题及其解决方案,有助于加速项目开发进程。

    基于LabVIEW的多设备并行控制系统设计与实现

    内容概要:本文详细介绍了使用LabVIEW开发的一个多设备并行控制系统,主要应用于工业自动化领域。系统能够同时控制六台烘干设备,并支持不停机扩展新设备。核心技术包括利用子面板(Subpanel)实现动态加载设备界面,通过Modbus TCP/IP协议与PLC通信,以及采用事件结构实现控制权切换等功能。文中还分享了一些调试经验和性能优化技巧,如内存管理和通信稳定性等方面的问题及其解决方案。 适合人群:对LabVIEW编程有一定基础,从事工业自动化控制系统的开发人员和技术爱好者。 使用场景及目标:适用于需要在同一上位机上同时监控和控制多台设备的应用场合,旨在提高操作效率,减少人工干预,确保系统稳定性和扩展性。 其他说明:文中提到的一些具体实现细节和技术难点对于理解和掌握LabVIEW编程非常有帮助,尤其是关于多实例并行处理的部分。此外,作者还提到了一些常见的错误案例及其修正方法,有助于读者规避类似问题。

    1.6 技能提升:设计一份个人简历.rp

    1.6 技能提升:设计一份个人简历.rp

    MATLAB/Simulink仿真:交直流微电网中光伏、蓄电池、风机的并离网切换与虚拟同步发电机技术

    内容概要:本文详细介绍了如何在MATLAB/Simulink环境中对交直流微电网进行仿真,涵盖了光伏、风机和蓄电池的建模方法及其在不同运行模式下的控制策略。具体包括光伏系统的MPPT控制、风机的变桨距控制、蓄电池的充放电管理、并离网切换的逻辑控制以及虚拟同步发电机技术的应用。通过这些仿真实验,可以深入理解微电网的工作原理和技术难点,为实际工程应用提供了宝贵的参考。 适合人群:从事电力系统、新能源技术和自动化控制领域的研究人员和工程师,尤其是对微电网仿真感兴趣的初学者和有一定经验的研发人员。 使用场景及目标:适用于高校科研项目、企业技术研发部门等场合,旨在帮助用户掌握微电网仿真技术,优化系统设计,提高微电网的稳定性和可靠性。 其他说明:文中提供了大量具体的MATLAB/Simulink代码示例,便于读者理解和实践。同时,作者分享了许多个人经验和调试技巧,有助于解决常见问题,提升仿真的成功率。

    3dmax插件021-一键路牙.ms

    3dmax插件

    基于一阶RC模型与FFRLS+EKF算法的电池SOC在线联合估计Matlab实现

    内容概要:本文详细介绍了利用一阶RC模型结合带遗忘因子的递推最小二乘(FFRLS)和扩展卡尔曼滤波(EKF)算法,在Matlab中实现电池SOC(荷电状态)的在线联合估计。首先,FFRLS用于实时更新电池模型参数(如R0、R1、C1),以适应电池老化和时变特性。接着,EKF用于精确估计SOC,通过OCV-SOC曲线和状态方程进行预测和更新。文中还讨论了参数初始化、采样周期设置、温度补偿以及常见错误避免等问题,并提供了详细的代码片段和调试建议。 适合人群:从事电池管理系统研究与开发的技术人员,尤其是有一定Matlab编程基础的研究人员。 使用场景及目标:适用于电动汽车、储能系统等领域,旨在提高电池SOC估计精度,确保电池安全高效运行。具体目标包括降低SOC估计误差、增强算法鲁棒性和适应不同工况条件。 其他说明:文章强调了参数估计和状态估计之间的相互影响,提出了双线程配合的工作方式。此外,还分享了一些实践经验,如参数初始化、采样周期的选择、温度补偿等,帮助读者更好地理解和应用这一方法。

Global site tag (gtag.js) - Google Analytics