留言板

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: 留言板

各位兄弟姐妹们,流言飞语都来吧, 俺不怕!

Post Footer automatically generated by wp-posturl plugin for wordpress.

  1. liwooood
    October 14th, 2009 at 10:45 | #1

    hi,想请教一下mnesia的查询,又没办法做到模糊查询的?例如 name=“abcdefghij”,如果用sql查的话可以是:like “%cdef%”这样可以查到,但mnesia怎么可以做到?我看文档,找网络,都找不到。谢谢了!

    [Reply]

  2. October 14th, 2009 at 12:42 | #2

    mnesia是个数据源,只支持基本的查询操作, 复杂的查询条件是由 qlc模块来支持的。你说的功能可以用match_specification来做。

    [Reply]

  3. liwooood
    October 14th, 2009 at 18:14 | #3

    :)谢谢你的回答,能否给我match_specification的链接?我没找得到。

    [Reply]

  4. liwooood
    October 14th, 2009 at 18:16 | #4

    :)找到了,我先看看,不明白再请教。

    [Reply]

  5. hitty
    November 26th, 2009 at 15:03 | #5

    问一下老大,erlang开发大型网络游戏的前景如何?
    ND有这个应用的打算吗?

    [Reply]

    yu feng Reply:

    我觉得很适合做大型的网游 部分历史代码由port或者cnode已经nif承担,整个开发很轻松的。
    ND 老板很看好。。。

    [Reply]

  6. January 1st, 2010 at 11:13 | #6

    小弟不才,一直想在互联网这条路上混出点成绩来,以前都只是给别人做做小企业网站,也运营过地方论坛,但都没有什么成效,随着As3和Flex的发展,小弟对日后的发展也做了一定调整,想在休闲网页游戏方面试一试,主要是面向地方结合先下运营(小弟是广东佛山的),所以之前自学了as3了Flex,As3相对比较熟悉一点,Flex则大概了解了一遍.现在开始弄服务器端的编程,可是没有什么这方面的基础和实际经验,C/C++相信学习成本和难度高了些,用java也尝试过了解过,后来知道了Erlang,觉得用Erlang做的话应该很适合的,因为在我的架构里,主要是编写基于TCP协议方面的通信,但苦于没有更好的实战资料,自己的英文又基本是靠翻译才勉强看得明白的程序,苦恼啊!苦恼啊!

    本人目前要解决的问题如下:
    1.as3(多客户端)与于Erlang的通信问题.
    2.游戏大厅的服务器架构
    3.具体游戏的服务器架构(小弟主要想做的是网络棋牌对战类的网页Flash版的游戏).

    可能还有一些实际问题我没有遇到和想到,现在的我就在这卡主了,不知道该如何进行下去.

    小弟真诚求学,现在已经辞掉了工作,专心于这方面的学习了.

    当然,不能让余丰大哥太过雷锋的,小弟愿意有偿请教!当然,小弟积蓄也是有限啊!还望大哥能体谅.

    小弟计划花半年的时间掌握这方面的知识,花半年时间来开发产品,再投入运营!

    希望余丰大哥百忙中能为小弟指点一二.

    再次祝愿余丰大哥在新的一年里余丰余丰,御风而上,玉树临风.

    [Reply]

  7. zfz
    March 30th, 2010 at 13:06 | #7

    我在调分布式编程的KVS程序时出了问题:
    >rpc(call(gandalf@20090909-1351,kvs,store,[weather,fine]).
    出了错:
    **exception error:bad argument in an arithmetic expression
    in operator -/2
    called gandalf@20090909-1351
    请教问题出在哪儿?

    [Reply]

    Yu Feng Reply:

    gandalf@20090909-1351 这个不是atom

    正确的写法是 ‘gandalf@20090909-1351’

    [Reply]

  8. zfz
    March 30th, 2010 at 14:50 | #8

    谢谢,已经正确了

    [Reply]

  9. chinpeng
    April 2nd, 2010 at 14:31 | #9

    大牛,俺是一名java程序员,工作两年多,一直关注着erlang,业余时间学习erlang半年有余,现在感觉没多大长进了,能否提供一些方法和建议。

    [Reply]

    Yu Feng Reply:

    猛看代码 猛写代码. 推荐看看如mochiweb hotwheels这样的短小又写的好的模块. 光知道语法啥用没有!

    [Reply]

  10. Atlas
    April 19th, 2010 at 04:22 | #10

    Hi,本人在使用mnesia的过程中,发现log里常有:
    ** WARNING ** Mnesia is overloaded: {mnesia_tm, message_queue_len, “mm”}
    这样的警报信息。而我对mnesia的使用是很轻量级的,只有4个表,最大不超过2000条数据,没有理由超载。上网google了一下,网上对此问题众说纷纭,莫衷一是。

    请教下此信息因何产生?能通过什么思路调优?在此拜谢。

    [Reply]

  11. April 19th, 2010 at 11:40 | #11

    @Atlas
    846 Threshold = 100,
    847 Prev = S#state.tm_queue_len,
    848 {message_queue_len, Len} =
    849 process_info(Pid, message_queue_len),
    850 if
    851 Len > Threshold, Prev > Threshold ->
    852 What = {mnesia_tm, message_queue_len, [Prev, Len]},
    853 mnesia_lib:report_system_event({mnesia_overload, What}),
    854 {noreply, S#state{tm_queue_len = 0}};

    check_overload是10秒钟一次, 你打印警告信息的原因是在过去的20秒里面,你的mneisa_tm的消息队列的长度都超过了100. 也就是说你的事务交易积累太多.
    原因可能有2个:
    1. 你的提交的事务资源竞争, 事务未能很快完成.
    2. 你的机器处理能力有限, 不能很快处理事务.

    [Reply]

  12. Atlas
    April 20th, 2010 at 17:53 | #12

    @Yu Feng

    感谢。
    那mnesia_tm的作用是什么呢?为什么Len不能超过100?这个100的数量能不能增加的?

    因为我的系统业务模型比较复杂,所以我采用了原子型事务的方式,既每个业务都拆分成若干原子事务,每个原子事务都是独立的事务,可以作为不同业务的组成部分,也可以独立使用。所以事务交易积累是比较多。

    但如果我要改变这种原子型事务的结构,改成每个业务都是一个超级大事务,那么对整个体系改动太大。目前我的系统用户量和负载都很小,我观察过server,平均cpu负载都在5%以下,内存都在10%以下,我认为应该有充足的系统资源来满足mnesia的要求。我能不能通过改变某些配置来提高这个Threshold的值?

    [Reply]

  13. zfz
    April 24th, 2010 at 12:19 | #13

    你好!在学习Erlang的OTP编程,在第18章P276,1>alarm_handler:set_alarm(tooHot).有问题,** exception error: bad argument
    in function gen_event:send/2
    请教不知问题出在哪儿?

    [Reply]

    Yu Feng Reply:

    看起来好像是 gen_event要发送的进程不存在.

    [Reply]

  14. zfz
    April 25th, 2010 at 10:51 | #14

    谢谢余先生,我的环境是WINDOWS,所以先要运行erl -boot start_sasl,问题就解决了。但现在的问题是WINDOWS下运行eerl -boot start_sasl后emacs平台就没有了。我想请教:既保持emacs环境又能带参数的运行erl?

    [Reply]

  15. April 26th, 2010 at 16:03 | #15

    @zfz
    -boot start_sasl 和 -boot start_clean(默认的) 的区别是多启动了sasl应用.

    所以你可以在运行你的程序前运行
    application:start(sasl).
    效果是一样的.

    [Reply]

  16. April 26th, 2010 at 16:04 | #16

    @Atlas
    这个我个人感觉是你没用对mnesia, 你的瓶颈在锁和事务交互上了.

    [Reply]

  17. dean
    April 30th, 2010 at 10:21 | #17

    client_connect(Id, Pw) ->
    case gen_tcp:connect(“localhost”,6720,[binary,{packet,4}]) of
    {ok, Socket} ->
    %先发送认证消息
    case login_info(Socket,Id,Pw) of
    {ok} ->
    io:format(“pass login_info~n”),
    send_msg(Socket);
    {einval} ->
    {false_in_login}
    end;
    {error,Why} ->
    {Why}
    end.

    %向服务器发登陆认证
    login_info(Socket,Id,Pw) ->
    Msg = {login,Id,Pw},
    case gen_tcp:send(Socket, term_to_binary(Msg)) of
    ok ->
    % io:format(“login_info ok:~p~n”,[Self]),
    io:format(“send ok:~n”),
    case gen_tcp:recv(Socket,0) of
    {ok,B} ->
    io:format(“recv ok:~n”),
    {ok};
    %在这里套接字出错Why变为einval
    {error,Why} ->
    {Why}
    end;
    {error,closed} ->
    closed
    end.

    %%%%%%%%%%%%%%%%%%%%%
    %服务器在这里最后响应,同时也是问题出现的地方
    loop(Socket) ->
    io:format(“loop~n”),
    case gen_tcp:recv(Socket, 0) of
    {ok, Data} ->
    %处理信息,发送信息到client_manager让其处理向客户端发送消息事件
    %处理两种请求,一种登陆认证,另一种是消息传输
    io:format(“loop ok~n”),
    case binary_to_term(Data) of
    {login,Id,Pw} ->
    %认证登陆
    io:format(“in loop~n”),
    %在这里出现了问题
    gen_tcp:send(Socket,term_to_binary({ok})),
    io:format(“after send~n”),
    {login_check_now};
    Data_send ->
    io:format(“in loop no:~n”),
    client_manager ! {data,Data_send},
    loop(Socket)
    end;
    {error, closed} ->
    %不清错失败原因和出处时的处理方式,(待处理)
    client_manager ! {disconnect, Socket},
    {error, closed}
    end.

    现在问题在于gen_tcp:send(Socket,term_to_binary({ok}))上调用的话在login_info那里受到的einval的套接字出错的问题
    现在不知道问题出现在哪里?不知道能怎么样修改,谢谢余丰大哥了

    [Reply]

    Yu Feng Reply:

    {login_check_now}; 后loop 中止, 因为看不到你的其他代码, 但是基本上是由于loop中止, 进程退出。 进程退出的时候, 会关闭所拥有的port. gen_tcp是个port.所以你的socket就会被服务端关闭。

    [Reply]

  18. zfz
    April 30th, 2010 at 23:44 | #18

    谢谢余先生,现在还是有一些问题,一、application的相关技术文档哪儿有?二、错误日志配置文件又如何加载上去?如:erl -boot start_sasl -config elog3中的sasl应用已经可用application启动了,但elog3错误日志配置如何启动?

    [Reply]

  19. May 1st, 2010 at 08:20 | #19

    @zfz
    这些文档otp的随机带的文档里面写的非常清楚的,你可以先好好读下!

    [Reply]

  20. zfz
    May 2nd, 2010 at 16:11 | #20

    请教:在WINDOWS环境下错误日志配置文件elog3.config如何加载启用?

    [Reply]

  21. May 2nd, 2010 at 22:34 | #21

    @zfz
    不明白你的问题是什么? 但是我建议不要在windows下开发。你可以用virtualbox安装个ubuntu来使用,windows不大适合otp开发。

    [Reply]

  22. zfz
    May 3rd, 2010 at 02:39 | #22

    感谢!我的问题是:《Erlang程序设计》一书中第十八章很多地方用到SASL的配置,主要是错误日志的配置,如书中P273,日志在shell和循环日志中同时输出的配置文件elog3.config,但如何在WINDOWS环境下加载启用?我现在不是用于开发而是用于教学。你讲的方法我会试试。

    [Reply]

  23. May 3rd, 2010 at 06:16 | #23

    @zfz
    Erlang是完全平台移植的,这意味所有的命令行参数和使用习惯都是一样的,除了平台相关的东西,比如说文件路径。 你的疑惑是估计是这样的: unix平台下用的文件路径如/var/log/xxx.log 在windows下应该改成如c:\\var\\\log\\xx.log

    [Reply]

  24. zfz
    May 3rd, 2010 at 12:17 | #24

    一定叨唠了。但还得叨唠。

    在WINDOWS下,“运行”命令行:

    erl -boot start_sasl -config elog3

    出错:{“could not start kernel pid”,application_controller,”error in config file\”./elog3.config\”(none):configuration file not found”}

    可是在 e:\erl5.7.3\bin 下有 elog3.config 文件。因为错误信息一闪而过,今天才看清。

    请教问题出在哪儿?

    [Reply]

  25. May 3rd, 2010 at 22:56 | #25

    @zfz
    ./elog3.config 不是写的很明白吗, 是在当前目录下读呀。。。

    [Reply]

  26. zfz
    May 6th, 2010 at 10:07 | #26

    感谢!“当前目录读取”:只把erl启动前加上e:\erl5.7.3\bin便可。既WINDOWS下“运行”命令行为:

    e:\erl5.7.3\bin erl -boot start_sasl -config elog3

    在此命令行中,参数-boot start_sasl 可在>下运行:

    >application:start(sasl).

    来取代。现在的问题是:命令行参数

    -config elog3

    可用什么来代替?

    因为命令行开启的Erlang平台没了emacs编辑开发平台。

    [Reply]

  27. May 6th, 2010 at 11:12 | #27

    @zfz
    抱歉,确实不明白你的emacs和erlang有什么关系。
    干吗说, emacs平台没了?

    [Reply]

  28. zfz
    May 7th, 2010 at 01:32 | #28

    启动Erlang我认为有两种方式。
    一是在WINDOWS平台上:开始->运行->打开,键入

    e:\erl5.7.3\bin erl -boot start_sasl -config elog3

    就进入了Erlang环境。此时-boot start_sasl和-config elog3都起到了作用。仅有ESell,编辑Erlang程序很不方便。

    二是启动emacs后:file->open file,选择一个.erl文件,在emacs上就有一个Erlang菜单项。此时可编辑Erlang程序、编译Erlang程序,也有Erlang的Sell。第一种方式命令行中的参数-boot start_sasl 可在>下运行:

    >application:start(sasl).

    来取代。我的问题是:现在希望第一种方式命令行参数

    -config elog3

    也起作用,那么可用什么来代替呢?

    也就是:第一种方式开启Erlang平台,命令行参数-boot start_sasl和-config elog3都能起到作用,可是没有了emacs环境,编辑程序很不方便。第二种方式开启Erlang平台,编辑、编译、Shell集成了,很方便,命令行参数-boot start_sasl可用>application:start(sasl).来实现,可命令行参数-config elog3又能用什么来实现?

    [Reply]

  29. liv
    May 30th, 2010 at 19:47 | #29

    Mr Yu Feng 你好~我最近在研究聊天室方面的,我看到有个聊天室做到了一个房间同时有1W多人的,
    ejabberd貌似说支持单台服务器3000-5000,但是它好像不支持聊天室或者群组这种形式。。
    我想问问用erlang做聊天室可不可以做到单个房间1W人啊?先谢谢了。。。
    现在是不是有比书店那些书上写的其他高效的方法啊?

    [Reply]

    Yu Feng Reply:

    你从哪里看来的数字ejabberd才这么点? 这个数字如果是活跃的还差不多, 如果算在线的话, × 10差不多。 erlang的IO是能强大的。 你说的书上,不是你看了programing erlang就开始打算做这个系统吧?

    [Reply]

  30. liv
    May 31st, 2010 at 21:52 | #30

    想照着VC 6.0书上的例子做得~呵呵
    它上面是先把消息发到服务器,然后服务器转发到list里面
    Yu Feng老大还有其他高效点的方法吗?

    [Reply]

    Yu Feng Reply:

    看点书就做这种项目个人感觉很不靠谱!

    [Reply]

  31. liv
    June 6th, 2010 at 12:24 | #31

    Yu Feng老大,那ejabberd对群组的支持好不好啊?
    我在GOOFLE上搜索了下貌似只有一个客户端的软件支持~??

    [Reply]

  32. 武彻
    June 6th, 2010 at 15:28 | #32

    余老师,您好!
    我最近在研究tsung。遇到了一个问题,请教下您。
    firefox设置了localhost:8090代理,开启tsung recorder后,在录制的session里没有内容。

    [Reply]

  33. 武彻
    June 17th, 2010 at 17:18 | #33

    @武彻
    这个问题已经解决了。是1.2.2的版本有问题。我用1.3.1就不存在此问题

    [Reply]

  34. alex
    July 8th, 2010 at 17:30 | #34

    @zfz
    我也遇到同样的问题,貌似参数不对?

    man上是这样写的

    set_alarm(alarm())

    Types alarm() = {AlarmId, AlarmDescription}
    AlarmId = term()
    AlarmDescription = term()

    Sets an alarm with id AlarmId . This id is used at a later stage
    when the alarm is cleared.

    [Reply]

  35. Witeman
    September 2nd, 2010 at 22:45 | #35

    yu feng :我觉得很适合做大型的网游 部分历史代码由port或者cnode已经nif承担,整个开发很轻松的。ND 老板很看好。。。

    弱弱地问一句ND是什么公司啊?

    [Reply]

    Yu Feng Reply:

    ND=网龙 上市的游戏公司。

    [Reply]

  36. Witeman
    September 6th, 2010 at 11:14 | #36

    博主,有一问题请教。
    我要用mnesia存放一些,持久化的用户数据。可是,用户比较多,大概1M。然后,每个用户又会有很多物品,每个用户的每一物品有一个记录。这样我打算用这样的schema来存储我上面提到的业务,-record(user, {user_id, user_info, …}). -record(items, {item_id, user_id, item_info}).
    可是众所周知,mnesia有4G的限制。所以,我打算用table name mapping的方法来存放,具体是用list_to_atom(lists:concat([‘user_’, erlang:phash(user_id, 100)])),来作为table的名字。然后我的问题是:
    1 –

    [Reply]

  37. Witeman
    September 6th, 2010 at 11:17 | #37

    博主,有一问题请教。
    我要用mnesia存放一些,持久化的用户数据。可是,用户比较多,大概1M。然后,每个用户又会有很多物品,每个用户的每一物品有一个记录。这样我打算用这样的schema来存储我上面提到的业务,-record(user, {user_id, user_info, …}). -record(items, {item_id, user_id, item_info}).
    可是众所周知,mnesia有4G的限制。所以,我打算用table name mapping的方法来存放,具体是用list_to_atom(lists:concat([‘user_’, erlang:phash(user_id, 100)])),来作为table的名字。然后我的问题是:
    1 – mnesia可以支持大概2000个table的schema吗?在性能上会出现什么瓶颈或问题或side effect吗?
    2 – 我自己手动这样mapping的效果好,还是用mnesia fragment table的效果好呢?貌似,我这样的mapping查找起来的时候,比fragment要快。可是就是不知道容错和分布式性能上怎么样?

    [Reply]

    Yu Feng Reply:

    1. 2000个表太多了点。
    2. 最好用mnesia自己的fragment
    3. dets的问题未来我觉得会引入新的更强的替代品,官方在考虑这个事情。

    [Reply]

  38. Witeman
    September 10th, 2010 at 00:29 | #38

    @Yu Feng
    看了mnesia_frag的源代码,原来他的所做的和我所想的方法几乎是差不多的,而且也有foreign_key,那么我直接用mnesia 自带的 fragmant 就好了~~谢谢,大牛指点~~

    [Reply]

    Yu Feng Reply:

    不客气的,分片是mnesia很重要的一个特性。

    [Reply]

  39. Witeman
    September 14th, 2010 at 11:21 | #39

    @Yu Feng
    哇,好公司啊,在广州有没有分部啊?

    [Reply]

  40. xumingyong
    September 19th, 2010 at 13:24 | #40

    为何从JAVAEYE搬出来,还有你的“推”,我如何才能访问?

    [Reply]

Comment pages
1 2 3 8 65
  1. No trackbacks yet.