我mnesia overloaded
主要使用async_dirty
查询和ram_copies
表时有时会收到错误消息.因此,要了解发生了什么,我想获得有关mnesia状态的更多信息,例如每秒查询数或查询队列的大小.我搜索了很多,发现了两种可能的方法.
第一个是mnesia:system_info
可以返回当前事务列表的函数.但它似乎无法提供有关非事务性查询的信息.
第二个是订阅mnesia事件,但是使用这种方式需要一些活动的后台处理以及手动订阅每个表事件.
是否有更好的方法来获取此信息?
我有一个相当复杂的项目,包括几个大型的本地化子项目.
我的大多数子项目都是通过一个Localizable.strings文件进行本地化的.此文件将复制到SubProjectName.bundle
目标中,该目标与SubProjectName.a
主项目中的静态库一起使用.这很好用.
但是,我的一个子项目包含许多本地化的.strings文件.无论设备(或模拟器)的配置方式如何,此项目都无法读取除英语之外的任何语言的字符串.
例如,这行代码始终返回英文字符串:
[[NSBundle myResourcesBundle] localizedStringForKey:@"MY_TEST_STRING" value:@"" table:@"MyTable"]
Run Code Online (Sandbox Code Playgroud)
其中MyTable
对应于本地化为多种语言的MyTable.strings文件.当我查看.app包时,所有本地化都在那里,坐在应用程序内的"MyBundle.bundle"资源中.
但是,以下代码在所有本地化中正确查找给定字符串的翻译:
for (NSString *language in [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"])
{
NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle myResourcesBundle] pathForResource:language ofType:@"lproj"]];
NSLog(@"%@: %@", language, NSLocalizedStringFromTableInBundle(@"MY_TEST_STRING", @"MyTable", bundle, nil));
}
Run Code Online (Sandbox Code Playgroud)
因此,当bundle是实际MyBundle.bundle/<LanguageCode>.lproj
文件夹时,字符串查找起作用.但显然这违背了iOS提供的自动查找的目的.
(注意,[NSBundle myResourcesBundle]
上面只是一个静态便捷方法来获取子项目的自定义包).
-
编辑:我一直在试验这个,如果我en.lproj
从子项目的包中删除文件夹,那么它正确使用设备或模拟器的区域设置.
例如,我有:
MyApp.app/
|
- MyResources.bundle/
|
- en.lproj/
|
- zh-Hans.lproj/
Run Code Online (Sandbox Code Playgroud)
当我将模拟器(或设备)设置为简体中文时,它会查找字符串,en.lproj
即使语言环境是zh-Hans
.如果我删除en.lproj
文件夹并重新启动应用程序,它会正确使用zh-Hans本地化.
在我的Erlang/OTP应用程序中,我有一个one_for_all
主管(sup),有几个孩子.其中一个子节点(带有gen_server
行为的child1)应该能够向另一个节点发送消息(带有supervisor
行为的child2).当然,我可以注册它,但是用多余的名字堵塞全球范围似乎不是一个好主意.
从而使这种相互作用可能的唯一途径是提供child1与的PID 的child2.说到做到.有supervisor:wich_children/1
适当的功能调用.刚好路过燮的PID为参数chidl1,称which_children
在child1:init
,和...得到一个僵局.SUP等待child1开始,child1等待燮为孩子的描述:
init(SupPid) ->
Descriptions = supervisor:which_children(SupPid),
... .
Run Code Online (Sandbox Code Playgroud)
这可以通过以下方法解决:
init(SupPid) ->
gen_server:cast(self(), initialize),
... .
handle_cast(initialize, State) ->
Descriptions = supervisor:which_children(SupPid),
... % Generating new state containing desired pid
{noreply, NewState}.
Run Code Online (Sandbox Code Playgroud)
但是,我对此解决方案并不满意.
问题是:根据OTP设计原则,监管树成员之间最常见的交互方式是什么?
我对这个matplotlib的例子有疑问.
这是我不理解的部分
def update_line(num, data, line):
line.set_data(data[...,:num])
return line,
Run Code Online (Sandbox Code Playgroud)
怎么line.set_data(data[...,:num])
办?
Mnesia 有四种读取数据库的方法:read
, match_object
, select
, qlc
。当然,除了他们肮脏的同行。它们中的每一个都比以前的更具表现力。
更新。
正如我提到的CRAP ANSWERS,read
只是一个键值查找,但经过一段时间的探索,我发现还有函数index_read
and index_write
,它们以相同的方式工作,但使用索引而不是主键。
我有一个带有整数键(时间戳)的表,其中包含应从数据库中删除特定记录的时间。还有一个清理查询,它从这个表中获取过期时间少于现在的记录并删除它们。
Erlang的文件说,有四种类型的表类型:set
,ordered_set
,bag
,和duplicate_bag
。
set
使用哈希表实现,因此读取时间复杂度为 O(1)。ordered_set
是使用树实现的,因此读取需要 O(log(n)) 时间复杂度,但它更好地适用于随后的间隔。bag
实施的信息。ordered_set
看起来很理想,但我不能使用它,因为两条记录可以具有相同的时间戳。所以问题是:
该bag
表是如何实现的,是否适合查询后续间隔?如果没有,我怎样才能获得“ ordered_bag
”功能?
要知道特定表达式是否与指定模式匹配,我可以在erlang中写入如下内容:
case <expression> of
<pattern> -> true;
_ -> false
end
Run Code Online (Sandbox Code Playgroud)
例如:
case {1, 2, 3} of
{_, 2, _} -> true;
_ -> false
end
Run Code Online (Sandbox Code Playgroud)
有没有办法以更紧凑的方式编写它?就像是:
is_match(<pattern>, <expression>)
Run Code Online (Sandbox Code Playgroud) erlang ×6
mnesia ×4
colon ×1
ellipsis ×1
erlang-otp ×1
indexing ×1
ios ×1
localization ×1
monitoring ×1
nsbundle ×1
python ×1
slice ×1
uikit ×1