Prevent ‘Adobe Reader Updater Helper’ Automatic Run With System on OS X

今天开机的时候发现Adobe Reader检查更新的进程自启动而且高CPU占用,不一会儿就弹出个更新提示窗口。

不爽之。

遂在 ~/Library/LaunchAgents 目录下发现 com.adobe.ARM.202f4087f2bbde52e3ac2df389f53a4f123223c9cc56a8fd83a6f7ae.plist 文件一枚,改后缀。。

文件内容是下面这样的。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.adobe.ARM.202f4087f2bbde52e3ac2df389f53a4f123223c9cc56a8fd83a6f7ae</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/Adobe Reader.app/Contents/MacOS/Updater/Adobe Reader Updater Helper.app/Contents/MacOS/Adobe Reader Updater Helper</string>
        <string>semi-auto</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StartInterval</key>
    <integer>12600</integer>
</dict>
</plist>

在Adobe Reader程序首选项里改,也许也可以不弹出更新提示,但是不知道是否依然会有自启动的进程。

反正两边都弄了应该没事了~….

Update

总结几个OS X潜在的自启动的地方。

  • /Library/LaunchDaemons/
  • /Library/LaunchAgents/
  • ~/Library/LaunchAgents/
  • /System/Library/StartupItems
  • /Library/StartupItems
  • GUI 的 Login Items(系统偏好,用户群组,登陆项),找不到对应的文件?

另外这两个是系统级的,

  • /System/Library/LaunchDaemons/
  • /System/Library/LaunchAgents/

Ps. 加载顺序应该是 Daemons->Agents->StartupItems(在/System/Library/LaunchDaemons/里可以找到com.apple.SystemStarter.plist,由com.apple.SystemStarter进程负责加载StartupItems)。

About Css Preprocessor

在Bootstrap那里看过less,在Octopress那里看过sass。还几次搞混了。了解一下。

Reference

关于无中心网络及本地分享、社交?

今天在听歌的时候,突然有点想法,如果几个朋友出去(地铁里,噪杂的酒吧,或者旅行),可以一起听一首歌(用各自的移动设备,or Glass??),就像几个人呆在一个自己的私密空间里,是不是还蛮酷?

自然得想到如何实现。如果是有个人充当server的方式,显然不太优美。自然地想到一个挺像的东西,AirDrop,它貌似就是个去中心的点对点网络,这种东西用来做本地的分享、社交很合适。

但是AirDrop现在貌似还只能用于传文件(据说是因为WiFi耗电问题没法取代蓝牙?)。这个暂不论了。

于是我又想到,bit网络(bit coin什么的不是很火吗)。私密社交?+移动。

嗯。。我觉得这方面将来肯定会产生点有意思的东西。

LEX、YACC初识

以前只用下降子程序的方法手写过一个解释器,iplot

现在学院又开一门课,叫程序分析…讲的还是编译原理…只不过是让借助工具…两个实验,一个是LEX+YACC,一个是ANTLR。

那咱就学下LEX+YACC….

START

Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler。

Unix或Linux都自带Lex跟YACC,我用的OS X,跟GNU/Linux下面的一样,Lex是flex,而Yacc则是bison。

Lex

lex和flex都是解析Lex文件的工具,用法相近,flex意为fast lexical analyzer generator。可以看成lex的升级版本。

挖坑未填完,先把实验做掉。。

Reference

http://blog.csdn.net/liwei_cmg/article/details/1530999

http://www.ibm.com/developerworks/cn/linux/sdk/lex/

SA到底是什么

原谅我又拿考试复习的东西丢上来了 - -,而且这坑没填干净..

笔记而已,都是根据教材剖析出来的,加上一些自己的理解。

概念

  • 软件
  • 体系结构(Architecture)= 架构
  • 设计元素 = 组件 or 连接件
  • SA 包括 设计元素的描述、交互、组合的模式、模式中的约束。
  • SA = 组件+连接件+约束
  • 组件,连接件应该都是集合

风格

概念

  • SA风格,是描述特定系统组织模式的惯用范例,强调组织模式惯用范例

分类

  1. 数据流系统(Data Flow),就是数据顺序流过多个组件,如 批处理序列(batch sequential),管道和过滤器(Pipes & Fliters)
  2. 调用返回系统(Call/Return),这个不用解释了吧~ 如 主/子程序(main program & subroutine),面向对象系统(Object Oriented),分层系统(layered)这里把C/S归为分层,两层或三层(应用服务器),B/S归为C/S的特例
  3. 数据中心系统(知识库,data-centered),就是数据都放在中心节点,如 仓库(repository),黑板(blackboard)
  4. 虚拟机(Virtual Machine),可以理解成一个模拟器,如 解释器(interpreter),基于规则系统(rule-based system)
  5. 独立构件(independent components),不知道在说什么..,如 通信过程(communicating processes),事件系统(event systems,分显式、隐式调用)

这5种风格具体就先不介绍了。。感觉书上的都是老的东西,以我在这个时代的认知读起来感觉很扯。。咱尽量不八股。。

下面简单挑几个说一点,

PS

黑板模式,就好像多位不同的专家在同一黑板上交流思想,每个专家都可以获得别的专家写在黑板上的信息,同时也可以用自己的分析去更新黑板上的信息,从而影响其它专家。

解释器,用来执行其他程序的程序,不单单指通常的编程语言解释器,也可以按大的理解,如浏览器(HTML、CSS、JS),通信协议(TCP/IP,socket),甚至是处理用户输入的一些Parser也可以算(parse了之后赋予语义)。

管道过滤器,这个挺好理解的,而且感觉挺有意思的,以后有机会可以找个项目实现一下。记得以前搞MVC.NET的时候看过那种Fliter。

建模(Modeling)

什么决定你的建模

架构师跟利益相关者,进行cost/benefit权衡。

简单说就是客户给基本需求,架构师进行分析,做权衡。

建模什么

基本的架构元素(architectural elements),

  • Components(组件or构件)
  • Connectors(连接件)
  • Interfaces(接口)
  • Configurations(配置?结构?)
  • Rationale - reasoning behind decisions

模型的要点

  • 无歧义
  • 准确且精确 PS.准确指正确,接近目标;精确指不矛盾、无歧义,击中一个地方,但不一定正确

视图

View(视图)是一个subset-model(模型子集),viewpoint(视点)是指关注点、标准(concern,criteria)。

这个学过数据库应该都知道,就是东西都放在一个模型里太复杂了,就分开放到多个视图里,每个视图只用说清楚一类事情,视图的划分由视点(viewpoint)来决定。

常用的viewpoints,

  • Logical Viewpoints
  • Physical Viewpoints
  • Deployment Viewpoints
  • Concurrency Viewpoints
  • Behavioral Viewpoints

比方说,用deployment做视点,那可能整个model就被分为server、client两个视图。

建模方法

通常方法

  • 自然语言
  • PowerPoint-style modeling
  • UML(the Unified Modeling Language)

其他

  • 早期的ADL(architecture description languages)
  • Domain- and style-specific languages
  • Extensible architecture description languages

文档描述(Documenting)

用途

正规的软件开发过程有很多角色参与,需要一个交流设计思想的媒介。

架构设计(architecture design)

架构模式

没提到?感觉就是架构风格(Pattern = Style)

质量属性(Quality Attributes)

系统不仅需要满足功能特性(functionality),还需要满足其他一些质量属性(QA)。功能特性跟质量属性是正交的,功能不会决定质量。

达到特定质量属性,需要考虑设计、实现、部署三方面。

质量属性本身是没有多大用的,需要在明确质量属性(specifying QA)的过程中来帮助架构设计。

常见的质量属性有6种(USTAMP),

  • Usability(易用性),方便使用
  • Security(安全性),入侵检测、入侵容忍、多机备份
  • Testability(可测试性),单元测试、错误可复现、语句覆盖度(Path Coverage?)
  • Availability(可用性),系统在任一时刻正常工作的概率
  • Modifiability(可修改性),修改指采用新的算法、数据结构、UI等
  • Performance(性能),系统响应时间,硬件资源的占用率

其他,

  • Scalability(可伸缩性)
  • Portability(可移植性)
  • etc.

质量属性场景(QAS)

所以,我们就需要 质量属性场景(QA Scenarios)。在特定场景中去明确质量属性。

一个场景分为6部分,

  • source
  • stimulus
  • artifact
  • environment
  • response
  • response measure

一句话说,就是 刺激源,在特定环境(条件、系统模式)下,用特定刺激(n.)去刺激(v.)制品(指系统或code),然后获得反应,最后测量(度量)反应。

来说明系统达到这个质量属性的程度。

战术(Tactics)

目前架构师主要工作是复用以前架构的方法(即很少凭空创造),这些方法(解决方案)大部分指 Patterns & Styles,小部分指 Tactics。

疑问,架构模式(architectural patterns)跟架构风格(styles)基本是一个意思,那架构模式跟设计模式(design patterns)又有什么区别?

而战术(Tactics),是用来实现质量属性反应(quality attribute response)的。它是影响控制质量属性反应的设计决策。我们又称一个战术集合为一个架构策略(architectural strategy)。

对6个常见的质量属性(USTAMP),相应地有6个战术,

  • Usability Tactics(易用性战术),运行时战术(runtime tactics)、设计时战术(design-time tactics,包括MVC、PAC等)?
  • Security Tactics(安全性战术),抵抗攻击(resisting attacks),检测攻击(detecting attacks),从攻击中恢复(recovering from attacks)
  • Testability Tactics(可测试性战术),提供输入捕获输出(providing input & capturing output),内部监控(internal monitoring)
  • Availability Tactics(可用性战术),错误检测(fault detection)、错误恢复(fault recovery)、错误预防(错误阻止,fault prevention)
  • Modifiability Tactics(可修改性战术),局部修改(Localize Modifications),防止连锁反应(Prevent Ripple Effects),推迟绑定时间(Defer Binding Time)
  • Performance Tactics(性能战术),控制资源需求(Resource Demand),资源管理(Resource Management),资源仲裁(Resource Arbitration)

设计操作(Design Operators)

设计操作是创建一个体系结构设计的重要设计工具。包括以下5个操作,

  • Decomposition(分解)
  • Replication(复制,冗余)
  • compression(压缩)
  • abstraction(抽象)
  • resource sharing(资源共享)

?没细看

质量属性驱动的设计(ADD, Attribute-driven design)

ADD是一步一步地系统地生成初步的体系结构设计的方法。

ADD的结果:全部的结构决策、内部连接和协调机制、应用模式和策略制定各部分的机制、显式达到质量属性的要求、不能详细到接口!

ADD输入:质量属性需求、功能需求、约束。

ADD步骤: 1. 确定足够的需求信息 2. 选择系统的一部分分解 3. 优先部分需求以及标识架构驱动 4. 选择满足与所选择的系统分解向关联的那部分系统的架构驱动的设计概念:模式(patterns)、风格(styles)、策略(tactics) 5. 实例化(instantiated)架构元素,分配功能性需求 6. 归并(merge)设计完成 7. 分配剩下的功能性需求 8. 定义戒口给实例化元素 9. 检查和提炼需求,使他们能约束实例化元素 10. 对于系统的下一个分解部分,重复步骤2到9

架构评估

  • SAAM: Scenario-based Architecture Analysis Method
  • ATAM: Architecture Trade-off Analysis Method

这里主要介绍 ATAM(框架权衡分析法)。

效用树

Chrome Extension Manifest V2

今天兴起想写个 Chrome Extension,研究了一番,稍有点头绪。 想到天天用的 Fawave,去找了下它源码(原项目名叫falang…好名字!)。

不看不知道,一看发现它逻辑这么复杂。。而且光看popup.html我就头大了。。 那个神一样模版语言(<?js ... ?>...#{...}...)。。见都没见过。

搞半天弄清楚他用的是shotenjin.js,是tenjin.js的子集,用于client-side。略小众啊,都搜不到什么相关信息。不过超轻量,整个就100多行代码,用法也真心简单。

又看了半天源码,似乎摸清楚几个困惑的点,

  • chrome extension 的 popup.html 不支持持久化,每次点一下相当于要重新载入
  • 像我这种比较小的需求,应该就是每次载入都从localStorage里拿数据出来更新DOM
  • fawave那些timeline用localStorage肯定放不下的,貌似是利用 background.html 来做本地缓存(cache。写得好像很吊,就看了一点)。

总结一下,其实上面几个点就是纠结 popup.html 里的数据的持久化。

墨迹完了~~

真正跟标题相关的内容

fawave用的是manifest V1,我用的V2。于是我用shotenjin.js来解析模版就出现了问题。

1
Uncaught Error: Code generation from strings disallowed for this context

经过一番搜索。。。发现是V2不再支持eval(),而shotenjin.js里必须用了eval()啊。。。

具体解决方法参照,

Chrome extension 升级到 manifest version 2 的问题

Using eval in Chrome Extensions. Safely.

因为不想换模版引擎,我用的是官方给的方法,用一个sandbox 的iframe,来代替进行eval()。。

但是。。仍然有问题(好吧这个问题证明是我是小白),简单说就是我想在popup.html load的时候就进行模版渲染,但是那个时候iframe里的script还没执行,message事件还没注册。。

解决方法是,

1
2
3
$('sandbox').onload = function() {
    init();
}

这样保证 init(给iframe发消息让它渲染模版)时, iframe 已经 load,就行了。

Open Terminal(iTerm2) in Current Folder

原来Terminal一直用自带的,现在改成iTerm2。 google到一些用AppleScript解决的方案,经测试不可用,估计是OS X 10.8改了什么东西。 没空研究AppleScript…

然后意识到也许可以把Go2Shell的默认Terminal改一下,然后确实google到了方法。。

Solution

  1. Download Go2Shell.
  2. Change your default Go2Shell terminal to iTerm2.
1
open -a Go2Shell --args config

That will open the configuration screen.

Core Java 2 读书笔记(一)

我不会说我是因为明天考Java才开始看的。

鉴于记性实在太差,觉得以后每系统地学一个新的东西都要做一点笔记。。留给以后回忆用。。(“青春就是用来回忆的…”

从第三章开始看的,看到第六章。

数据类型

  • 基本类型,八种,int/short/long/byte,float/double,char,boolean
  • 对象,都集成于Object类

ps. 没有unsigned类型,于是我就想…表示pixel的话,只能用-128~127的byte了…

赋值与初始化

Java中只有声明(没有类似C/C++的定义一说,声明的同时可以初始化变量)。

常量

用final修饰(const虽然为保留字,但目前还未定义)

操作符

有一种>>>操作符,表示逻辑右移,>>是算术右移。

字符串equals

要使用equals来进行String的比较(覆盖了Object的equals),==只能判断两个串是否储存在同一位置。

格式化输出

可以用System.out.printf(),类似C的printf。

ps.不知道为什么书上介绍的是Format.printf()

循环、分支

switch语句的case标签必须是整数。

break还有一种带标签的break语句,用于跳出多层循环。

大数字

BigInterger、BigDecimal,有add、subtract、multiply、divide、mod等方法。 用valueOf静态方法来转成大数字。

Java跟C++不同,程序员无法重载操作符。

数组

int[] a;int a[];都可以用来声明数组。

System.arraycopy(from, fromIndex, to, toIndex, count)可以用来拷贝数组中的元素。

Arrays.sort(a)可以对数组排序。 ps.开始我奇怪怎么没有类似的cmp函数,原来是在Comparable接口中定义了

Conclusion

四五六章后面几篇再写。。

Sublime Text 2 Build System for OSX

Cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && open '${file_path}/${file_base_name}'"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'<'${file_path}/${file_base_name}.in'>'${file_path}/${file_base_name}.out'"]
        }
    ]
}

Python

1
2
3
4
5
6
7
8
9
10
11
12
{
    "cmd": ["bash", "-c", "python -u '${file}' && chmod a+x '${file}' && open -a terminal '${file}'"],
    "selector": "source.python",

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "python -u '${file}' && chmod a+x '${file}' && '${file}'<'${file_path}/${file_base_name}.in'>'${file_path}/${file_base_name}.out'"]
        }
    ]
}

Java

1
2
3
4
5
{
    "cmd": ["bash", "-c", "javac '${file}' && java '${file_base_name}'"],
    "file_regex": "^(...*?):([0-9]*):?([0-9]*)",
    "selector": "source.java, source.java"
}

Conclusion

For cpp & python, the build-system can open a new terminal window, so I can interact(ep. input) with my program easily.

For java, I don’t know how to do that, only can show the outputs yet.

想做的东西

  • 一个TODO
  • 个人网站