我找到了一些关于打开/关闭递归的解释,但我不明白为什么定义包含"递归"这个词,或者它与动态/静态调度的比较.在我发现的解释中,有:
打开递归.大多数语言使用对象和类提供的另一个便利功能是一个方法体通过一个名为
self
或在某些语言中调用的特殊变量来调用同一对象的另一个方法的能力this
.self的特殊行为是它是后期绑定的,允许在一个类中定义的方法在第一个类的某个子类中调用稍后定义的另一个方法.[ Ralf Hinze ]
......或者在维基百科:
调度语义
this
,即对此调用的方法调用是动态调度的,称为开放递归,意味着这些方法可以被派生类或对象覆盖.相比之下,函数的直接命名递归或匿名递归使用闭合递归,具有早期绑定.
我还阅读了StackOverflow问题:什么是开放递归?
但我不明白为什么"递归"这个词用于定义.当然,如果通过执行方法递归调用来使用"开放递归",它可能会导致有趣(或危险)的副作用.但是定义不直接考虑方法/函数递归调用(在维基百科定义中显示"封闭递归",但听起来很奇怪,因为"打开递归"并不是指递归调用).
你知道为什么定义中有"递归"这个词吗?是因为它是基于另一个我不知道的计算机科学定义吗?应该简单地说"动态调度"还不够吗?
StackOverflow上有很多关于这个主题的问题,但我似乎找不到与我的问题相关的问题.
我有一个需要与HTTPS服务器通信的Android应用程序:一些与在Android系统密钥库中注册的CA(常见的HTTPS网站)签名,一些使用我拥有但不在Android系统密钥库(具有例如,自动签名证书).
我知道如何以编程方式添加我的CA并强制每个HTTPS连接使用它.我使用以下代码:
public class SslCertificateAuthority {
public static void addCertificateAuthority(InputStream inputStream) {
try {
// Load CAs from an InputStream
// (could be from a resource or ByteArrayInputStream or ...)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = new BufferedInputStream(inputStream);
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
} finally {
caInput.close();
}
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs …
Run Code Online (Sandbox Code Playgroud) SOA概念很容易掌握,但我对BPEL和Apache Camel等企业服务集成架构和技术并不熟悉.
我知道BPEL有助于协调服务,而且Camel是企业集成模式的实现.我目前正在阅读着名的企业集成模式书.
但EIP和管弦乐之间的界限对我来说似乎很薄弱.在我看来,Camel还以自己的方式协调服务.此外,Camel提供了许多连接器,因此可以轻松使用不同的协议.
Camel比BPEL更好吗?
或者是否可以使用您无法使用Camel执行的BPEL操作?
哪个?
关于我所阅读的内容,似乎Camel比BPEL更好地协调REST服务:这是真的吗?
在Swift中,有时候,关键字是普通关键字,而其他一些关键字则以@
.
例如,weak
,unowned
,inout
,class
是平原.但是@final
,@lazy
从开始@
.
有时,我们甚至都有!prefix
并且@prefix
,infix
和@infix
例如.
它不完全是Objective-C继承,因为我们有@class
而不是class
Objective-C.我能理解为什么我们有class
而不是@class
在斯威夫特,但是既然我们有@final
或者@lazy
,我会认为应该@weak
而不是weak
.
为什么选择这个?是否有一种直观的方式应该告诉:"嘿,这个关键字的开头是合乎逻辑的@
?
即使我认为考虑到预处理器的观点,@
在编译之前调用一种特定的预处理器并不明显(例如,@final
它实际上不是一种预处理器指令).
我使用有关为iOS开发创建通用二进制框架以分发库的方法.我还想在框架中添加文件,并将它们加载到主程序中(实际上是SSL证书).这与StackOverflow问题有关,主要区别在于我想要包含除XIB之外的其他内容.
如果我们读取与链接帖子相关的线程,似乎是不可能的.但是,提到了以下博客文章 ; 我们可以读到:
"静态框架不是标准框架的完全替代 - 访问框架资源的标准方法,例如
+[NSBundle bundleForClass:]
不会返回预期的bundle.通过查询dyld来确定与路径对应的库路径 - 在在静态链接的情况下,这将返回静态库链接到的二进制文件的路径.另外,NSBundle/CFBundle
将检查返回地址的前一个堆栈,并使用该返回地址来确定调用代码的dyld二进制路径.这些限制,一些解决方法是可能的,例如-[NSBundle privateFrameworkPath]
用于定位嵌入式框架的路径."
我是iOS开发的初学者,我很难使用这样的机制.privateFrameworksPath
确实使用返回路径,但我不知道接下来要做什么来找到我想要加载的文件.
它是这样的:
NSBundle * bundle = [NSBundle bundleForClass:[self class]];
NSString * path = [bundle privateFrameworksPath]; // Works, return something like .../Frameworks
NSString * file = [path stringByAppendingPathComponent:@"MyFramework.framework/Versions/A/my-cert.der"];
NSData * trustedCertData = [NSData dataWithContentsOfFile:file]; // Returns nil
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
StackOverflow和其他地方有很多示例使用该类LocalBroadcastManager
来避免在应用程序之外广播事件.
但是,此类使用Android支持库,如包名称所示:android.support.v4.content.LocalBroadcastManager
.
LocalBroadcastManager
在标准SDK中是否有相当于不使用Android支持库的内容?
似乎没有这种sendBroadcast
方法android.content.Context
具有这种安全粒度.
根据我的理解,bitcode允许生成具有中间二进制格式的二进制文件.所以这是编译到ARM或x64架构之前的步骤.
.framework
自iOS 8起,可以为iOS 创建"真实" 文件.但是,默认情况下,框架文件仅针对一种体系结构进行编译(模拟器,iPhone).当想要分发.framework
文件时,最好提供与iOS模拟器兼容的文件,并且还可以部署到iPhone.可以找到不同的脚本示例来使用创建这样的胖文件lipo
.
但是,是否可以仅将已.framework
编译的bitcode分发而不必创建具有不同体系结构的胖文件?
不幸的是,即使为我启用了bitcode .framework
:
我是否误解了bitcode的概念,或者我错过了什么?
我使用的是Windows版本的Python.我有一个使用Pyside的Python脚本(没什么复杂的,一种"hello world").
当我单击我的脚本文件或者从命令行启动它时,它会完美地执行,并且我会出现一个GUI.
但是,如果脚本是从文本终端(cmd.exe,cygwin,...)启动的话,我想避免使用GUI.一种自动知道它应该具有GUI输出还是文本输出的脚本.
有一种简单易行的方法吗?我希望能够使用Windows版本的Python(不是Cygwin软件包附带的版本).
当我从文本终端启动脚本时,一种显而易见的方法是添加一种"--no-gui"参数,但我想知道Python(或某些Python库)是否已经为此提供了工具.
此外,我在这台计算机上有一个SSH服务器(Cygwin-base),我可以远距离执行脚本但是没有GUI出现(当然),我没有错误消息.在这种情况下,由于缺少Windows图形支持或者脚本应该将其输出调整为文本终端,因此知道脚本是否失败是非常有趣的.
我想在Windows上使用与Cygwin一起打包的Python.我需要安装PyBluez,一个蓝牙Python绑定.我用easy_install安装它,没问题.我知道它与Windows版本的Python一起工作得很好,因为我安装了PyBluez的.exe并进行了一些测试.
但是我不想使用Windows版本的Python,而是使用Cygwin的版本.但实际上,使用easy_install或直接从tarball安装不能很好地工作(没有错误消息,但它没有完全安装).原因似乎很简单:在几个文件中,有一些条件语句:
if sys.platform == 'win32':
...
elif sys.platform == 'linux2':
...
elif sys.platform == 'darwin':
...
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我为Cygwin启动Python时,平台是:
$ python
>>> import sys
>>> sys.platform
'cygwin'
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我们从Cygwin启动Python for Windows时,我们拥有哪个平台:
$ /cygdrive/d/Programs/Python26/python -i
>>> import sys
>>> sys.platform
'win32'
Run Code Online (Sandbox Code Playgroud)
我们可以想到修改PyBluez库中的一些Python文件,这样他们就可以同时考虑'win32'和'cygwin':
if sys.platform == 'win32' or sys.platform == 'cygwin':
...
Run Code Online (Sandbox Code Playgroud)
不幸的是,1)它意味着修改一些文件,2)它是不够的:在PyBluez的情况下,当我导入库时,我们在__init__.py文件中:
if sys.platform == "win32":
_dbg("trying widcomm")
have_widcomm = False
dll = "wbtapi.dll"
sysroot = os.getenv ("SystemRoot")
...
Run Code Online (Sandbox Code Playgroud)
os.getenv("SystemRoot")在启动Python for Windows时正确定义,但没有使用Python for Cygwin定义.
所以,我的问题是:有没有一种简单的方法可以欺骗Python,让Cygwin认为它是从win32平台启动的,具有所有正确的所需环境,而无需手动修改库设置文件?
也许根本不可能?(两个版本都在Windows上,但编译方式不同).
问题不仅限于PyBluez的安装,也适用于其他类型的库.
在Android上,我使用a ListView
,我希望能够使用拖放重新排序其项目.我知道有一个"拖放列表视图"的不同实现,但我想使用自API级别11以来的拖放框架.
它开始非常好,直到我想ListView
在拖放时滚动我.正如下面的例子中所写的那样,现在,我检查了我所在的列表元素的顶部,所以如果它的位置不在之间ListView.getLastVisiblePosition()
,ListView.getFirstVisiblePosition()
我使用a ListView.smoothScrollToPosition()
来查看其他列表项.
这是第一个实现,但它运作良好.
滚动时会出现问题:DragEvent.ACTION_DRAG_ENTERED
当我处于拖放状态时,某些元素不会回复拖放事件 - 以及其他元素.这是由于ListView管理其项目视图的方式:它尝试回收不再可见的项目视图.
这是所有权利和它的作品,但有时getView()
的的ListAdapter
回报率的新对象.由于它是新的,这个对象错过了DragEvent.ACTION_DRAG_STARTED
所以它不回答其他DragEvent
事件!
这是一个例子.在这种情况下,如果我通过长按一下列表项开始拖放,如果我拖动它,如果我在它们之上,大多数项目将具有绿色背景; 但有些人没有.
有没有想过让他们订阅拖放事件机制,即使他们错过了DragEvent.ACTION_DRAG_STARTED
?
// Somewhere I have a ListView that use the MyViewAdapter
// MyListView _myListView = ...
// _myListView.setAdapter(new MyViewAdapter(getActivity(), ...));
_myListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(null, shadowBuilder, _myListView.getItemAtPosition(position), 0);
return …
Run Code Online (Sandbox Code Playgroud)