Home
ejabberd
ejabberd@conference.jabber.ru
Четверг, 4 мая 2017< ^ >
Holger установил(а) тему: ejabberd · english room · https://ejabberd.im
Конфигурация комнаты
Участники комнаты

GMT+3
[00:01:43] Marzanna вышел(а) из комнаты
[00:05:57] Marzanna вошёл(а) в комнату
[00:06:05] sezuan вышел(а) из комнаты
[00:07:17] pod вышел(а) из комнаты
[00:08:02] linus вышел(а) из комнаты
[00:08:20] sezuan вышел(а) из комнаты: Replaced by new connection
[00:08:30] sezuan вошёл(а) в комнату
[00:11:18] Marzanna вышел(а) из комнаты
[00:11:26] SouL вошёл(а) в комнату
[00:12:30] ileh вышел(а) из комнаты
[00:13:48] ileh вошёл(а) в комнату
[00:14:43] Marzanna вошёл(а) в комнату
[00:22:58] linus вошёл(а) в комнату
[00:32:27] pod вышел(а) из комнаты
[00:37:50] nabeel вышел(а) из комнаты
[00:39:24] badlop вышел(а) из комнаты
[00:39:46] nabeel вошёл(а) в комнату
[00:41:36] nabeel вышел(а) из комнаты
[00:43:28] nabeel вошёл(а) в комнату
[00:45:53] nabeel вышел(а) из комнаты
[00:47:55] nabeel вошёл(а) в комнату
[00:51:51] jere вошёл(а) в комнату
[00:52:40] Marzanna вышел(а) из комнаты
[00:56:16] linus вышел(а) из комнаты: Replaced by new connection
[00:56:18] linus вошёл(а) в комнату
[00:56:42] jeremy вышел(а) из комнаты: Machine going to sleep
[00:58:28] erik вышел(а) из комнаты: Machine going to sleep
[01:05:19] linus вышел(а) из комнаты: Replaced by new connection
[01:05:22] linus вошёл(а) в комнату
[01:17:53] Marzanna вышел(а) из комнаты: Replaced by new connection
[01:17:56] Marzanna вошёл(а) в комнату
[01:26:53] zinid вышел(а) из комнаты
[01:35:07] cippaciong вошёл(а) в комнату
[01:57:06] linus вышел(а) из комнаты: Replaced by new connection
[02:35:30] rozzin вышел(а) из комнаты
[02:40:14] linus вошёл(а) в комнату
[02:56:56] cippaciong вышел(а) из комнаты
[02:58:59] linus вышел(а) из комнаты
[03:00:05] linus вошёл(а) в комнату
[03:06:05] linus вышел(а) из комнаты
[03:21:14] cippaciong вышел(а) из комнаты
[03:30:21] linus вошёл(а) в комнату
[03:54:52] linus вышел(а) из комнаты: Replaced by new connection
[03:54:53] linus вошёл(а) в комнату
[04:19:21] linus вышел(а) из комнаты: Replaced by new connection
[04:19:22] linus вошёл(а) в комнату
[04:24:52] linus вышел(а) из комнаты: Replaced by new connection
[04:24:55] linus вошёл(а) в комнату
[04:41:53] sezuan вышел(а) из комнаты: Replaced by new connection
[04:41:59] sezuan вошёл(а) в комнату
[04:43:14] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[04:43:18] jere вошёл(а) в комнату
[04:47:30] linus вышел(а) из комнаты: Replaced by new connection
[04:47:33] linus вошёл(а) в комнату
[04:57:44] linus вышел(а) из комнаты: Replaced by new connection
[04:57:46] linus вошёл(а) в комнату
[05:15:25] linus вышел(а) из комнаты: Replaced by new connection
[05:15:27] linus вошёл(а) в комнату
[05:41:16] kimsehic3 вышел(а) из комнаты: Disconnected: Replaced by new connection
[05:42:15] Marzanna вошёл(а) в комнату
[05:42:35] kimsehic3 вошёл(а) в комнату
[05:45:00] linus вышел(а) из комнаты: Replaced by new connection
[05:45:02] linus вошёл(а) в комнату
[05:45:38] kimsehic3 вышел(а) из комнаты: Disconnected: Replaced by new connection
[05:45:43] kimsehic3 вошёл(а) в комнату
[05:47:51] kimsehic3 вышел(а) из комнаты: Disconnected: Replaced by new connection
[05:48:03] kimsehic3 вошёл(а) в комнату
[05:52:14] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[05:52:16] jere вошёл(а) в комнату
[05:56:48] linus вышел(а) из комнаты: Replaced by new connection
[05:56:51] linus вошёл(а) в комнату
[06:11:58] Marzanna вышел(а) из комнаты
[06:36:08] jere вышел(а) из комнаты
[06:36:13] jere вошёл(а) в комнату
[06:49:30] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[06:49:32] jere вошёл(а) в комнату
[07:05:36] linus вышел(а) из комнаты: Replaced by new connection
[07:05:38] linus вошёл(а) в комнату
[07:08:55] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[07:08:59] jere вошёл(а) в комнату
[07:40:20] linus вышел(а) из комнаты: Replaced by new connection
[07:40:22] linus вошёл(а) в комнату
[07:41:29] pod вошёл(а) в комнату
[07:48:36] sattellite вышел(а) из комнаты
[07:51:12] linus вышел(а) из комнаты: Replaced by new connection
[07:51:14] linus вошёл(а) в комнату
[07:52:25] pod вошёл(а) в комнату
[07:56:50] kimsehic3 вышел(а) из комнаты: Disconnected: Replaced by new connection
[07:56:56] kimsehic3 вошёл(а) в комнату
[07:59:25] anand вошёл(а) в комнату
[08:02:12] linus вышел(а) из комнаты: Replaced by new connection
[08:02:14] linus вошёл(а) в комнату
[08:04:59] anand вышел(а) из комнаты: Disconnected: Replaced by new connection
[08:05:02] anand вошёл(а) в комнату
[08:06:43] sattellite вошёл(а) в комнату
[08:07:46] jannic вышел(а) из комнаты
[08:08:01] zinid вошёл(а) в комнату
[08:09:17] anand вошёл(а) в комнату
[08:09:31] anand вышел(а) из комнаты: offline
[08:11:42] sattellite вышел(а) из комнаты
[08:14:02] linus вышел(а) из комнаты: Replaced by new connection
[08:14:06] linus вошёл(а) в комнату
[08:14:40] pod вышел(а) из комнаты
[08:15:34] pod вошёл(а) в комнату
[08:19:16] ileh вышел(а) из комнаты
[08:21:11] sergio вошёл(а) в комнату
[08:25:58] linus вышел(а) из комнаты: Replaced by new connection
[08:26:01] linus вошёл(а) в комнату
[08:27:34] sattellite вошёл(а) в комнату
[08:30:40] ileh вошёл(а) в комнату
[08:35:52] sattellite вышел(а) из комнаты: Replaced by new connection
[08:35:58] sattellite вошёл(а) в комнату
[08:36:31] linus вышел(а) из комнаты: Replaced by new connection
[08:36:34] linus вошёл(а) в комнату
[08:42:40] jannic вошёл(а) в комнату
[08:42:55] sattellite вышел(а) из комнаты
[08:43:32] jeremy вышел(а) из комнаты: Replaced by new connection
[08:43:35] jeremy вошёл(а) в комнату
[08:44:44] sergio вошёл(а) в комнату
[08:48:03] sattellite вошёл(а) в комнату
[08:48:27] jeremy вышел(а) из комнаты: Replaced by new connection
[08:48:29] jeremy вошёл(а) в комнату
[08:48:40] jannic вышел(а) из комнаты
[08:49:05] jannic вошёл(а) в комнату
[08:52:36] linus вышел(а) из комнаты: Replaced by new connection
[08:52:38] linus вошёл(а) в комнату
[08:53:36] jodok вышел(а) из комнаты
[08:53:53] jodok вошёл(а) в комнату
[08:58:01] sattellite вышел(а) из комнаты: Replaced by new connection
[08:58:05] sattellite вошёл(а) в комнату
[08:58:33] sattellite вышел(а) из комнаты
[08:58:39] sattellite вошёл(а) в комнату
[08:59:10] anand вышел(а) из комнаты: Disconnected: closed
[09:04:24] hlad вышел(а) из комнаты: Replaced by new connection
[09:04:27] linus вышел(а) из комнаты: Replaced by new connection
[09:04:28] hlad вошёл(а) в комнату
[09:04:30] linus вошёл(а) в комнату
[09:05:46] sattellite вышел(а) из комнаты
[09:05:52] sergio вышел(а) из комнаты
[09:16:10] linus вышел(а) из комнаты: Replaced by new connection
[09:16:11] linus вошёл(а) в комнату
[09:16:45] debalance вошёл(а) в комнату
[09:18:06] rozzin вошёл(а) в комнату
[09:18:58] sattellite вошёл(а) в комнату
[09:25:02] sattellite вышел(а) из комнаты
[09:31:28] jannic вышел(а) из комнаты: Replaced by new connection
[09:31:37] jannic вошёл(а) в комнату
[09:32:48] erik вошёл(а) в комнату
[09:33:02] linus вышел(а) из комнаты: Replaced by new connection
[09:33:05] linus вошёл(а) в комнату
[09:38:00] pod вышел(а) из комнаты
[09:44:08] cippaciong вошёл(а) в комнату
[09:52:29] linus вышел(а) из комнаты: Replaced by new connection
[09:52:31] linus вошёл(а) в комнату
[09:54:37] anand вошёл(а) в комнату
[09:56:36] rom1dep вошёл(а) в комнату
[09:59:32] pod вошёл(а) в комнату
[10:11:27] sattellite вошёл(а) в комнату
[10:12:24] linus вышел(а) из комнаты
[10:12:37] sven7 вошёл(а) в комнату
[10:14:23] <sven7> Hey, I get the following error in ejabberd 17.01 when trying to use TURN:
** Reason: {badarg,[{erlang,iolist_to_binary,[[<<"test-c">>,58,<<"example.org">>,58,{<<115,81,11,44,232,174,125,141,58,11,149,5,92,96,112,186,111,19,172,251>>,<<12,128,198,57,120,113,115,119,83,97,154,38,132,169,132,145,30,12,176,40>>,<<252,135,125,25,93,165,232,17,52,255,177,159,61,225,210,118>>,4096}]],[]},{crypto,hash,2,[{file,"crypto.erl"},{line,223}]},{stun_codec,check_integrity,2,[{file,"src/stun_codec.erl"},{line,124}]},{stun,process,2,[{file,"src/stun.erl"},{line,241}]},{ejabberd_listener,udp_recv,3,[{file,"src/ejabberd_listener.erl"},{line,354}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,237}]}]}
** Packet: <xxx>>
[10:14:27] <sven7> is this a known bug?
[10:15:33] <zinid> not known
[10:15:49] <sven7> I use this tool to test STUN and TURN: https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
[10:16:34] <zinid> I cannot look at it right now, so github issue is highly welcome ;)
[10:16:53] <sven7> I don't have an account :D
[10:17:06] <zinid> yeah...
[10:17:16] <zinid> this is like not to having an account in google
[10:18:59] sattellite вышел(а) из комнаты
[10:19:48] sattellite вошёл(а) в комнату
[10:23:20] linus вошёл(а) в комнату
[10:24:11] <sven7> well, looks like the password passed to iolist_to_binary has a wrong format
[10:26:36] <zinid> ah yes
[10:26:45] <zinid> because you're using SCRAM
[10:26:52] <zinid> no TURN for you then ;)
[10:27:04] sattellite вышел(а) из комнаты
[10:28:25] <zinid> "Note on SCRAM using and foreign authentication limitations: when using the SCRAM password format, it is not possible to use foreign authentication method in ejabberd, as the real password is not known, Foreign authentication are use to authenticate through various bridges ejabberd provide. Foreign authentication includes at the moment SIP and TURN auth support and they will not be working with SCRAM."
[10:30:06] <sven7> ehm
[10:31:50] <sven7> what does "foreign authentication" mean? It works with no authentication?
[10:32:03] <zinid> yes, works without authentication
[10:32:08] <zinid> i.e. anonymous auth
[10:32:38] <zinid> everyone can use your turn relay then, kinida TOR :D
[10:32:43] <zinid> *kind a
[10:32:58] <sven7> what's the reason for that? just not implemented?
[10:33:15] <zinid> digest auth in TURN
[10:33:23] <zinid> requires plain password
[10:33:33] <sven7> omg
[10:33:55] <zinid> same in SIP
[10:33:58] <zinid> same in HTTP
[10:34:42] <zinid> so if you're using SCRAM, no way to log into web admin console ;)
[10:35:01] <zinid> because SCRAM is shit
[10:35:15] <sven7> ehm? I'm able to use web admin
[10:35:38] <zinid> ah, there is plain http auth in web-console? nice ;)
[10:35:51] <zinid> and without https
[10:36:01] <sven7> no, it's not without https
[10:36:08] <zinid> ah, ok then
[10:38:23] <sven7> well, if I use SCRAM why does web-console work then? ^^
[10:38:24] <zinid> indeed, there is Basic auth in ejabberd_web_admin.erl
[10:38:55] <zinid> because there is basic auth and I though it was digest
[10:39:01] <zinid> *thought
[10:39:07] linus вышел(а) из комнаты: Replaced by new connection
[10:39:09] <sven7> ah okay
[10:39:09] linus вошёл(а) в комнату
[10:40:21] <sven7> hm, shit I need TURN :D
[10:40:47] <zinid> how will you use it?
[10:40:51] <zinid> with what client?
[10:41:04] Holger вышел(а) из комнаты: Replaced by new connection
[10:41:10] Holger вошёл(а) в комнату
[10:41:14] <sven7> working on webrtc :)
[10:43:09] <zinid> well, I have no solution :/
[10:43:17] <zinid> anonymous TURN only
[10:43:40] <zinid> but a client should be configured to use anonymous TURN
[10:43:44] <sven7> is there a way to use other login data for TURN only?
[10:44:10] <sven7> zinid, anonymous TURN? nobody provides you anonymous TURN
[10:44:13] <zinid> no, this is not implemented
[10:44:17] <sven7> for good reason I would say
[10:45:22] hlad вошёл(а) в комнату
[10:45:42] Holger вышел(а) из комнаты: Replaced by new connection
[10:45:48] <sven7> okay, maybe I should use an external TURN for now then
[10:45:54] Holger вошёл(а) в комнату
[10:47:47] <Holger> One option would be allowing only PLAIN auth and teaching ejabberd to cache the passwords for online sessions in memory.
[10:48:11] <Holger> You get close to that with the extauth cache ...
[10:52:20] <sven7> Looks like there is a RFC for third-party auth https://tools.ietf.org/html/rfc7635
[10:53:05] sattellite вошёл(а) в комнату
[10:53:54] <zinid> ha, some new RFC, didn't read it
[10:55:06] <zinid> Holger: I'm going to implement caching for ejabberd_auth, will keep this in mind
[10:58:38] <zinid> ah, that's oauth 2.0 for stun
[10:58:47] <zinid> I mean that RFC
[10:59:02] <sven7> yep
[10:59:17] <zinid> but client should support oauth2.0 ;)
[10:59:17] sattellite вышел(а) из комнаты
[10:59:40] <zinid> "Using OAuth 2.0, a client obtains an
   ephemeral token from an authorization server, e.g., a WebRTC server,
   and the token is presented to the STUN server"
[10:59:54] <sven7> is there an outh2.0 provider in ejabberd? ;)
[11:00:04] <sven7> oauth
[11:00:12] <zinid> yes
[11:00:21] <zinid> not sure if it's 2.0 though
[11:00:25] <sven7> lol
[11:00:35] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[11:00:38] erik вошёл(а) в комнату
[11:00:43] <sven7> actually, it was a joke :D
[11:01:15] <zinid> you might be laughing, but users use it quite a lot, surprisingly
[11:02:00] anand вышел(а) из комнаты: Disconnected: closed
[11:02:02] <sven7> :)
[11:02:32] <zinid> that's because a lot of use cases for ejabberd is to use it's external http api, I think
[11:02:48] <zinid> like, get_roster, send_message
[11:03:01] <zinid> easy way to build web-chat instead of taming fucking xmpp
[11:03:43] <zinid> waaaaay easier than using BOSH
[11:03:46] <sven7> okay, I see there are lot of construction zones for jabber audio/video calls except for webrtc client implementation :)
[11:04:23] <zinid> this is sip.js implementing webrtc over sip
[11:04:41] <zinid> so you can add mod_sip, install sip.js and you have an webrtc server :)
[11:04:58] <zinid> ah, wait, esip doesn't support websocket, damn it
[11:06:36] <zinid> also, sip has the same problem with scram
[11:06:47] erik вошёл(а) в комнату
[11:06:55] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[11:06:59] erik вошёл(а) в комнату
[11:07:02] <sven7> :D
[11:08:03] linus вышел(а) из комнаты
[11:08:51] <zinid> did you find the same RFC but for SIP? :)
[11:08:58] <zinid> last time I checked I found nothing
[11:09:59] <zinid> https://tools.ietf.org/html/draft-yusef-sipcore-sip-oauth-04
[11:10:49] <sven7> no, I never used SIP
[11:12:15] sezuan вошёл(а) в комнату
[11:14:33] sattellite вошёл(а) в комнату
[11:15:57] erik вышел(а) из комнаты: Connection failed: connection closed
[11:17:28] <zinid> damn, this draft is brutal
[11:22:00] cippaciong вошёл(а) в комнату
[11:24:31] sattellite вышел(а) из комнаты
[11:24:41] sattellite вошёл(а) в комнату
[11:30:07] sattellite вышел(а) из комнаты
[11:31:11] linus вошёл(а) в комнату
[11:36:34] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[11:36:37] jere вошёл(а) в комнату
[11:37:09] linus вышел(а) из комнаты
[11:37:37] sezuan вышел(а) из комнаты: Machine going to sleep
[11:44:58] anand вошёл(а) в комнату
[11:46:35] sezuan вошёл(а) в комнату
[11:46:51] mimi89999 вышел(а) из комнаты
[11:56:04] sattellite вошёл(а) в комнату
[11:59:22] debalance вышел(а) из комнаты
[12:01:09] debalance вошёл(а) в комнату
[12:01:15] sattellite вышел(а) из комнаты
[12:02:20] linus вошёл(а) в комнату
[12:05:50] erik вышел(а) из комнаты: Machine going to sleep
[12:06:41] sattellite вошёл(а) в комнату
[12:10:40] sattellite вышел(а) из комнаты
[12:12:56] sattellite вошёл(а) в комнату
[12:14:28] sezuan вышел(а) из комнаты
[12:14:29] sattellite вышел(а) из комнаты
[12:14:48] sattellite вошёл(а) в комнату
[12:31:41] sattellite вышел(а) из комнаты
[12:44:11] anand вышел(а) из комнаты: Disconnected: closed
[12:48:05] sattellite вошёл(а) в комнату
[12:49:33] sattellite вышел(а) из комнаты
[12:54:14] linus вышел(а) из комнаты
[12:55:00] linus вошёл(а) в комнату
[12:55:06] anand вошёл(а) в комнату
[13:01:00] linus вышел(а) из комнаты
[13:01:41] sattellite вошёл(а) в комнату
[13:07:06] debalance вышел(а) из комнаты
[13:07:18] cippaciong вошёл(а) в комнату
[13:07:20] sattellite вышел(а) из комнаты
[13:08:19] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[13:08:22] erik вошёл(а) в комнату
[13:08:24] sattellite вошёл(а) в комнату
[13:10:48] hlad вышел(а) из комнаты
[13:11:00] hlad вошёл(а) в комнату
[13:13:16] sattellite вышел(а) из комнаты
[13:15:37] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[13:15:41] erik вошёл(а) в комнату
[13:17:02] debalance вошёл(а) в комнату
[13:18:36] sattellite вошёл(а) в комнату
[13:21:06] mimi89999 вошёл(а) в комнату
[13:24:02] sattellite вышел(а) из комнаты
[13:39:43] sattellite вошёл(а) в комнату
[13:44:10] sattellite вышел(а) из комнаты
[13:45:51] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[13:45:53] erik вошёл(а) в комнату
[13:50:16] sattellite вошёл(а) в комнату
[13:53:08] sattellite вышел(а) из комнаты
[13:54:40] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[13:54:43] erik вошёл(а) в комнату
[13:55:26] anand вышел(а) из комнаты: Disconnected: closed
[13:56:16] anand вошёл(а) в комнату
[14:00:32] sattellite вошёл(а) в комнату
[14:02:00] sattellite вышел(а) из комнаты
[14:04:46] Marzanna вышел(а) из комнаты: Replaced by new connection
[14:04:54] Marzanna вошёл(а) в комнату
[14:12:20] <zinid> https://github.com/processone/ejabberd/blob/master/src/gen_mod.erl#L445
[14:12:31] <zinid> a function which returns a function which returns a function
[14:12:40] <zinid> we need to go deeper (c)
[14:13:11] <Holger> We do functional programming yay!
[14:13:33] <zinid> we do shit ;)
[14:13:39] <zinid> I rewrite this piece of shit
[14:13:41] <Holger> That too.
[14:13:51] anand вышел(а) из комнаты: Disconnected: closed
[14:14:37] <zinid> ex-C++ programmer wrote this
[14:15:08] <zinid> well, it's normal to have a pointer to a function with a pointer to a function, I guess ;)
[14:15:40] <zinid> (***f)(x)
[14:18:07] <Holger> Yes that's normal :-)
[14:19:50] <zinid> btw, in ocaml such meta-code is normal, but it's way easier to read due to language specific
[14:20:26] <zinid> a function is always anonymous there, so no difference
[14:21:15] sattellite вошёл(а) в комнату
[14:22:21] ThUnd3r|Gr33n вышел(а) из комнаты: unknown reason
[14:23:00] mimi89999 вышел(а) из комнаты
[14:25:19] sattellite вышел(а) из комнаты
[14:25:29] mimi89999 вошёл(а) в комнату
[14:26:00] debalance вышел(а) из комнаты: Replaced by new connection
[14:26:04] debalance вошёл(а) в комнату
[14:29:26] <Holger> Hmm you do have funs with names and funs without, no?
[14:29:58] <zinid> well, yes, but definition is the same
[14:30:10] SouL вышел(а) из комнаты
[14:30:16] SouL вошёл(а) в комнату
[14:30:22] <Holger> let add x = (fun y -> x + y)
[14:30:54] linus вошёл(а) в комнату
[14:30:54] <Holger> Is a named fun which returns an anonymous one.
[14:32:02] <Holger> But yes a named fun is just an anonymous one bound to a variable.  Whereas a named Erlang function is a special-cased thing.
[14:32:04] sattellite вошёл(а) в комнату
[14:32:13] <zinid> yep
[14:32:54] <zinid> that's what I actually wanted to say
[14:32:56] <zinid> :)
[14:33:34] <Holger> And yes these higher-order constructs usually look much better in OCaml (or Haskell) than in Erlang :-)
[14:34:23] <Holger> ... until you try writing something like a chat server in OCaml (or Haskell).
[14:35:34] <zinid> we rewrote ejabberd in ocaml back in the days
[14:35:35] sattellite вышел(а) из комнаты
[14:35:41] <Holger> Heh.
[14:35:51] <zinid> everything is fine, but no remsh, so no production debug :/
[14:35:57] ThUnd3r|Gr33n вошёл(а) в комнату
[14:36:05] <Holger> I would've thought coping with concurrency is also a PITA.
[14:36:27] <Holger> I mean with OCaml, you'd fork n OS processes for n CPUs and then do I/O multiplexing.
[14:36:31] <Holger> Like in C.
[14:36:49] <zinid> well, it's possible to emulate processes in ocaml, that's what we did, but the multitasking was cooperative of course
[14:37:02] <Holger> Yeah.
[14:37:19] linus вышел(а) из комнаты
[14:37:50] <zinid> so you still have so called "pi problem", i.e. if you want to calculate pi with a great precision, this will lock the whole thread
[14:38:35] <Holger> Yes.  Or if some I/O wait is blocking (even though it shouldn't) ...
[14:38:51] <zinid> so two problems: no remsh and no preemtive scheduling
[14:39:29] <Holger> This stuff is a PITA to deal with in server software which is the #1 reason I like Erlang.
[14:39:37] <zinid> all other stuff is great: the code is shorter, no runtime typing errors, much faster, low memory
[14:39:47] <Holger> I mean I did server software in C and Erlang's best feature is that it hides this issue from me.
[14:40:01] <Holger> Yes.  I like OCaml as well.
[14:40:11] <Holger> Especially the static typing.
[14:40:21] <zinid> yes, severely underrated language
[14:40:42] <zinid> there is Haskell, but monads is just an idiotic concept (IMHO)
[14:41:20] <zinid> in ocaml you can use imperative style, which is great sometimes
[14:42:00] <zinid> you can use mutable vars, which is usefull sometimes (unlike erlang where you need to use shit-slow ets)
[14:42:53] <Holger> I'm fine with Monads but Haskell has the practical issue that it's memory usage can be unpredictable even for experienced people.  So I wouldn't use it for real-world software except for one-shot stuff such as compilers or so.
[14:43:09] <Holger> Due to it's lazy evaluation.
[14:43:09] linus вошёл(а) в комнату
[14:43:20] <zinid> yes, laziness is also a problem
[14:43:25] <Holger> So the existing real-world software is crippled with forced strict evaluation.
[14:43:29] debalance вышел(а) из комнаты: Replaced by new connection
[14:43:33] debalance вошёл(а) в комнату
[14:43:37] <Holger> E.g. Darcs or GHC.
[14:44:31] <Holger> So the supposed-to-be-wonderful Haskell code ends up being horrible.  And the software still runs into memory leaks nevertheless, until yet another corner of the code has been forced to strict evaluation.
[14:45:28] <Holger> So yes, I prefer OCaml too :-)
[14:45:32] sergio вышел(а) из комнаты
[14:45:58] <zinid> yeah, now write something using it and everybody will tell you your software is shit because ocaml :)
[14:46:23] <zinid> and lua is so beutiful language ^_^
[14:46:30] sergio вошёл(а) в комнату
[14:47:17] <zinid> we lose a *lot* of customers because of Erlang, lol
[14:47:42] <zinid> even worse, now customers come and ask if we can write the server in Go
[14:47:50] <zinid> Go, Carl!!!
[14:49:09] linus вышел(а) из комнаты
[14:50:11] <Holger> Hehe, Lua has no concurrency, no remsh, no static typing, and a bunch of modules designed and tested for simple scripting purposes.  But otherwise it's a perfect fit for chat servers ;-)
[14:50:33] <Holger> Yeah, Go is the hype of the day.
[14:51:41] cippaciong вышел(а) из комнаты
[14:52:23] cippaciong вошёл(а) в комнату
[14:58:31] linus вошёл(а) в комнату
[15:02:19] sattellite вошёл(а) в комнату
[15:05:23] sattellite вышел(а) из комнаты
[15:12:22] sattellite вошёл(а) в комнату
[15:15:47] sattellite вошёл(а) в комнату
[15:17:27] linus вышел(а) из комнаты
[15:20:39] jodok вышел(а) из комнаты
[15:23:08] sergio вышел(а) из комнаты
[15:26:00] linus вошёл(а) в комнату
[15:29:26] sattellite вышел(а) из комнаты
[15:31:54] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[15:31:57] jere вошёл(а) в комнату
[15:32:36] sattellite вошёл(а) в комнату
[15:40:06] sattellite вышел(а) из комнаты
[15:40:22] linus вышел(а) из комнаты
[15:41:30] Marzanna вышел(а) из комнаты
[15:43:07] rozzin вышел(а) из комнаты: Machine going to sleep
[15:43:10] Marzanna вошёл(а) в комнату
[15:43:21] sattellite вошёл(а) в комнату
[15:44:46] jeremy вошёл(а) в комнату
[15:45:35] linus вошёл(а) в комнату
[15:52:18] rom1dep вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[15:52:19] rom1dep вошёл(а) в комнату
[15:52:25] sattellite вышел(а) из комнаты
[16:01:59] sattellite вошёл(а) в комнату
[16:03:02] Marzanna вышел(а) из комнаты: Replaced by new connection
[16:03:10] Marzanna вошёл(а) в комнату
[16:05:40] linus вышел(а) из комнаты
[16:10:43] sattellite вышел(а) из комнаты
[16:21:00] <bowlofeggs> go makes no sense
[16:21:14] <bowlofeggs> rust is much better than go
[16:21:22] rozzin вошёл(а) в комнату
[16:22:53] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[16:22:57] jere вошёл(а) в комнату
[16:24:26] sattellite вошёл(а) в комнату
[16:24:28] <zinid> but rust is complex as hell
[16:26:01] sattellite вышел(а) из комнаты
[16:29:46] linus вошёл(а) в комнату
[16:31:26] sergio вошёл(а) в комнату
[16:33:54] linus вышел(а) из комнаты: Replaced by new connection
[16:33:58] linus вошёл(а) в комнату
[16:35:04] sattellite вошёл(а) в комнату
[16:36:02] <bowlofeggs> it doesn't seem that much more complex to me than go, and it has a much better feature set (and doesn't have widespread poor practices, like using commit hashes instead of versions - the go library world is just like javascript in that respect)
[16:37:46] sattellite вышел(а) из комнаты: Replaced by new connection
[16:37:50] sattellite вошёл(а) в комнату
[16:38:35] <bowlofeggs> rust's cargo actually does semantic versioning, which is fantastic
[16:38:36] sattellite вышел(а) из комнаты
[16:38:51] sattellite вошёл(а) в комнату
[16:40:00] sezuan вошёл(а) в комнату
[16:40:19] <zinid> https://camo.githubusercontent.com/fcda84b7fca74872137bdf649aab791fe2105143/687474703a2f2f692e696d6775722e636f6d2f746f6e577245472e706e67
[16:40:26] <zinid> so this is not complex in your opinion?
[16:40:33] <zinid> then I don't know what complex is :)
[16:41:21] sattellite вышел(а) из комнаты
[16:42:51] Marzanna вышел(а) из комнаты
[16:44:35] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[16:44:39] erik вошёл(а) в комнату
[16:44:57] jere вышел(а) из комнаты
[16:45:00] jere вошёл(а) в комнату
[16:46:04] Marzanna вошёл(а) в комнату
[16:46:26] cippaciong вышел(а) из комнаты
[16:48:00] linus вышел(а) из комнаты: Replaced by new connection
[16:48:08] linus вошёл(а) в комнату
[16:49:44] <bowlofeggs> yeah that is complex
[16:50:04] <bowlofeggs> but i think go isn't simple
[16:50:10] <bowlofeggs> (nor is erlang ☺)
[16:50:26] <bowlofeggs> i do think erlang is a fine choice for any messaging system
[16:50:34] Marzanna вышел(а) из комнаты: Replaced by new connection
[16:50:42] <bowlofeggs> i could see it making sales harder, and hiring
[16:50:52] <bowlofeggs> and probably community contributions too
[16:51:01] <bowlofeggs> mostly just because it's a bit of a niche language
[16:51:08] <bowlofeggs> but it is very good at its niche
[16:54:51] daniel вошёл(а) в комнату
[16:55:28] daniel вышел(а) из комнаты
[16:57:26] <Holger> I think Erlang is simple.  In the same sense as e.g. C is simple, or Lua.  Those are some of the few languages where I have the feeling they fit more or less completely into my head :-)
[16:58:39] <zinid> damn, I don't know what to do next with ejabberd :/
[16:58:44] <Holger> Then there's languages such as C++ with lots of high-level constructs baked into the language.  They are supposed to make things easier, and they often do, but they also make it less obvious/ideomatic how to solve a given problem because there's often many ways to do it.
[16:59:20] <Holger> I didn't do anything serious with Rust but it does seem more like C++ to me, and less straightforward than Go.
[16:59:37] <zinid> Holger: same for me: safer C++
[16:59:49] <zinid> with the same obfuscated syntax
[17:00:17] <Holger> I mean this is the answer on how to do string concatination: http://stackoverflow.com/a/30154791
[17:00:24] <Holger> WTF seriously?
[17:00:34] sezuan вышел(а) из комнаты: Machine going to sleep
[17:00:42] <Holger> zinid: You're bored?
[17:00:50] <Holger> I have many ideas for ejabberd :-)
[17:00:59] <zinid> Holger: pretty much, I just added second-level option validator :)
[17:01:14] <zinid> because I have no more ideas
[17:01:28] <Holger> Heh.
[17:02:13] <Holger> What about the clustered cache?
[17:02:20] <zinid> for the record, in the last month I improved CPU performance in 10-20% :)
[17:02:26] <Holger> Yay.
[17:02:26] <zinid> Holger: but it's done
[17:02:30] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[17:02:34] erik вошёл(а) в комнату
[17:02:40] <Holger> Ah cool.  Is mod_mam using it now?
[17:02:50] <zinid> for archive_prefs table only
[17:02:58] <Holger> Yes that's what I meant.
[17:03:03] <Holger> Missed it then :-)
[17:03:14] <zinid> and the cache now damn fast, within 1-2 *micro*second on lookup/store
[17:03:24] <zinid> no single-process bottle-neck
[17:03:55] <zinid> for comparison, expat parsing takes around 30 microseconds
[17:04:20] <Holger> Can we use that for global roster/CAPS caches?
[17:04:30] <Holger> Rather than caching these things in c2s processes?
[17:04:35] <zinid> yes
[17:04:48] <zinid> I'm a bit tired with cache stuff, will add it a bit later
[17:04:49] linus вышел(а) из комнаты: Replaced by new connection
[17:04:51] linus вошёл(а) в комнату
[17:04:56] <Holger> That would help fixing various things.
[17:05:02] <zinid> yes, I know
[17:05:10] <Holger> Ok :-)
[17:07:05] <zinid> damn, that string concatenation stuff is retarded
[17:07:11] <zinid> it's even easier in C
[17:07:53] <Holger> Yes.
[17:08:08] <Holger> https://userpage.fu-berlin.de/holger/archive/concat.c.txt
[17:08:31] sattellite вошёл(а) в комнату
[17:08:54] <zinid> if ((p = malloc(size)) == NULL)
[17:09:06] <zinid> ahaha, who checks that, pfff....
[17:09:25] <Holger> Heh.
[17:09:26] <zinid> p = malloc(size);
memcpy(p, from, size)
[17:09:37] <zinid> the only TRUE way to allocate
[17:11:40] Marzanna вошёл(а) в комнату
[17:11:50] <Holger> The cool kids would do it this way of course, to avoid the extreme overhead of counting the length of string1 twice: https://userpage.fu-berlin.de/holger/archive/concat-memcpy.c.txt
[17:12:02] <Holger> Also note the awesome way of nul-terminating the result.
[17:12:23] <zinid> lol
[17:13:43] sattellite вышел(а) из комнаты
[17:15:06] <zinid> back to rust: I'm not sure I understand its purpose
[17:15:11] <zinid> what is it designed for?
[17:15:23] <zinid> C++ with boundary control?
[17:15:58] cippaciong вышел(а) из комнаты
[17:16:43] <Holger> Yes, the point is avoiding a runtime/garbage-collection.
[17:16:52] <zinid> also, the authors have strong ocaml knowledge and the first compiler was written in ocaml
[17:17:06] <Holger> So might be an option for low-level stuff.
[17:17:08] <Holger> Yes.
[17:17:49] <Holger> But I don't see why you'd prefer it over Go for normal applications/servers/whatever.
[17:18:07] sattellite вошёл(а) в комнату
[17:23:33] <Holger> Esp. as Go's "goroutines" are nice.  I think they get closer to Erlang's processes than other languages.
[17:24:09] <zinid> becaus of speed, probably
[17:24:19] <zinid> but if I need speed, I take C
[17:25:05] <Holger> (But still not quite the same.  They preempt on function calls rather than looking at reductions, and Go doesn't hide I/O blocking issues from you.  So I'm not sure you'd create hundreds of thousands of goroutines like you do in Erlang in practice.)
[17:25:08] <Holger> zinid: Yup.
[17:31:05] sattellite вышел(а) из комнаты
[17:31:15] sattellite вошёл(а) в комнату
[17:31:58] cippaciong вошёл(а) в комнату
[17:33:03] mimi89999 вышел(а) из комнаты
[17:34:50] linus вышел(а) из комнаты: Replaced by new connection
[17:34:54] linus вошёл(а) в комнату
[17:36:25] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[17:36:30] jere вошёл(а) в комнату
[17:40:24] sattellite вышел(а) из комнаты
[17:47:00] <bowlofeggs> zinid: it's a systems programming language with speed AND memory safety
[17:47:33] <bowlofeggs> which it gets by doing all that crazy lending/borrowing stuff, which enables it to guarantee memory safety at compile time instead of at run time
[17:47:44] <Holger> Yeah but it's often advocated for other purposes than systems programming.
[17:47:58] <bowlofeggs> which eliminates a class of bad problems without sacrificing performance
[17:47:58] <zinid> so, C niche?
[17:48:05] <zinid> I don't think it's as fast as C
[17:48:07] <bowlofeggs> yeah it's meant to replace C
[17:48:33] <bowlofeggs> it also has concurrency patterns built in
[17:49:07] sattellite вошёл(а) в комнату
[17:50:25] <Holger> bowlofeggs: But those are just about using OS threads in a safe way, IIRC?
[17:51:00] <Holger> That's not of much help with server programming.
[17:51:32] <bowlofeggs> yeah i think it's aimed at lower level systems stuff
[17:51:48] <zinid> how does it do this, by the way?
[17:51:48] <bowlofeggs> i think it's quite nice, but i see it's not for everyone ☺
[17:51:53] <zinid> without locking?
[17:52:04] <bowlofeggs> zinid: it basically is locking, but at compile time
[17:52:07] <Holger> zinid: Message passing rather than shared access I think.
[17:52:17] <bowlofeggs> zinid: it has these concepts of "borrowing" and "lending"
[17:52:26] <bowlofeggs> which is why that concat thing you linked is complicated
[17:52:55] <bowlofeggs> but basically, a variable binding holds a compile-time lock on its variable and nothing else can use it while it has it
[17:53:00] Marzanna вышел(а) из комнаты
[17:53:04] <Holger> https://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html
[17:53:06] <bowlofeggs> and this is done with no runtime overhead
[17:53:29] <zinid> Holger: tl;dr ;)
[17:53:49] <bowlofeggs> this chapter and the two after it are about the borrowing/lending thing: https://doc.rust-lang.org/book/ownership.html
[17:53:58] Marzanna вошёл(а) в комнату
[17:54:09] <bowlofeggs> cool thing is that if you do it wrong, it's a compiler error not a run time error
[17:54:32] jeremy вышел(а) из комнаты
[17:54:36] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[17:54:39] <bowlofeggs> so they know "who" has control of each bit of memory at all times, and there are patterns for safe handoffs
[17:54:39] erik вошёл(а) в комнату
[17:54:46] <bowlofeggs> it's pretty cool i think
[17:55:24] <bowlofeggs> you are trading something (complexity of expression - the bit you don't like) to get something (perfectly safe memory without garbage collection or other runtime performance hits)
[17:56:49] <zinid> so I want to change some global value, rust can do that without locking? (i.e. without putting a thread on hold)
[17:56:51] <bowlofeggs> i used to be a C++ programmer, so the syntax probably doesn't offend me as much as it offends you (i'm used to <<<<<<'s and >>>>>>>>>'s ☺)
[17:57:49] linus вышел(а) из комнаты
[17:58:01] <bowlofeggs> zinid: if it's set to be a mutable, i believe yes (variables are immutable by default)
[17:58:06] <bowlofeggs> note: i'm not a rust programmer
[17:58:11] <bowlofeggs> i'm dabbling
[17:59:26] <zinid> I still see mutexes in that article pointed by Holger ;)
[18:01:18] <bowlofeggs> yeah, though it's showing it as an alternative tot he section above it
[18:02:50] Marzanna вышел(а) из комнаты
[18:03:03] erik вышел(а) из комнаты: Connection failed: connection closed
[18:03:53] <zinid> frankly, I would like to have lightweight mutexes in erlang
[18:04:18] <zinid> I can do locking via a process, but this may become a bottle-neck
[18:05:07] sattellite вышел(а) из комнаты
[18:05:28] erik вошёл(а) в комнату
[18:08:37] jodok вошёл(а) в комнату
[18:08:56] <bowlofeggs> i need to learn erlang more than i have
[18:09:22] <bowlofeggs> i was reading Learn You Some Erlang For Great Good a while back but i got busy or somethign and put it down and never came back to it
[18:10:00] <bowlofeggs> it is kind of a mind twister for me, but i'm only really familiar with imperative languages so i'm both learning erlang and functional programming at the same time
[18:10:13] <bowlofeggs> python is my daily driver
[18:10:33] <bowlofeggs> and you *can* do "light" functional programming with it, so long as you don't make the stack too big ☺
[18:10:57] <bowlofeggs> it doesn't have any way to do tail recursion so you really shouldn't do taht in python
[18:11:52] <Holger> Yeah when I learnt Erlang I already knew Haskell/OCaml/SML and then it seemed really straightforward to me.  Much less magic than in those other functional languages.  But might be different when you never did any of those.
[18:11:56] <bowlofeggs> i've also been interested in checking out elixir since it uses the erlang vm but might have a more approachable expression for me
[18:12:30] <Holger> I think the Erlang vs. Elixir difference is just cosmetics.
[18:12:38] <bowlofeggs> yeah i would expect so
[18:12:38] <zinid> the problem with elixir is the same problem with scala: you will end up learning erlang (java)
[18:12:44] <bowlofeggs> hahah
[18:12:49] <Holger> Yeah.
[18:12:50] <bowlofeggs> oh man java makes me shudder
[18:12:52] hlad вышел(а) из комнаты: Replaced by new connection
[18:12:55] <Holger> And you do things the same way anyway.
[18:12:57] hlad вошёл(а) в комнату
[18:13:01] <bowlofeggs> i spent a few years as a java dev too
[18:13:05] <bowlofeggs> never again
[18:13:11] <Holger> It's just that it tries to *look* a bit more like Ruby.
[18:13:26] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[18:13:30] erik вошёл(а) в комнату
[18:13:53] jodok вышел(а) из комнаты
[18:14:59] <Holger> The only unique Elixir feature I see is metaprogramming.
[18:15:17] <zinid> I liked partials
[18:15:18] <Holger> If you're about to create a DSL that will be much nicer in Elixir than with Erlang's parse tranforms.
[18:19:33] sattellite вошёл(а) в комнату
[18:19:36] jodok вошёл(а) в комнату
[18:24:52] mimi89999 вошёл(а) в комнату
[18:25:05] sattellite вышел(а) из комнаты
[18:25:37] ileh вышел(а) из комнаты
[18:26:30] kimsehic3 вышел(а) из комнаты
[18:27:52] kimsehic3 вошёл(а) в комнату
[18:29:29] ileh вошёл(а) в комнату
[18:35:29] ileh вышел(а) из комнаты
[18:35:31] jodok вышел(а) из комнаты
[18:38:05] jodok вошёл(а) в комнату
[18:38:36] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[18:38:41] jere вошёл(а) в комнату
[18:40:30] hlad вышел(а) из комнаты
[18:41:16] pod вышел(а) из комнаты
[18:49:33] stefandxm вышел(а) из комнаты: Connection failed: connection closed
[18:50:05] erik вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[18:50:12] erik вошёл(а) в комнату
[18:51:26] sattellite вошёл(а) в комнату
[18:59:54] sattellite вышел(а) из комнаты
[19:00:40] badlop вошёл(а) в комнату
[19:00:55] linus вошёл(а) в комнату
[19:00:58] jeremy вошёл(а) в комнату
[19:01:32] debalance вышел(а) из комнаты
[19:01:36] sezuan вошёл(а) в комнату
[19:04:11] sattellite вошёл(а) в комнату
[19:04:31] hlad вышел(а) из комнаты: Replaced by new connection
[19:04:34] hlad вошёл(а) в комнату
[19:06:18] linus вышел(а) из комнаты
[19:08:24] linus вошёл(а) в комнату
[19:08:49] sezuan вышел(а) из комнаты: Machine going to sleep
[19:10:32] linus вышел(а) из комнаты: Replaced by new connection
[19:10:35] linus вошёл(а) в комнату
[19:13:35] ileh вошёл(а) в комнату
[19:18:17] kimsehic3 вышел(а) из комнаты
[19:21:19] jodok вышел(а) из комнаты: Replaced by new connection
[19:21:29] jodok вошёл(а) в комнату
[19:23:50] sattellite вышел(а) из комнаты: Replaced by new connection
[19:23:53] sattellite вошёл(а) в комнату
[19:23:56] jeremy вышел(а) из комнаты: Machine going to sleep
[19:25:46] pod вошёл(а) в комнату
[19:25:58] ThUnd3r|Gr33n вышел(а) из комнаты: unknown reason
[19:29:52] ThUnd3r|Gr33n вошёл(а) в комнату
[19:29:56] linus вышел(а) из комнаты
[19:31:21] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[19:31:25] jere вошёл(а) в комнату
[19:31:44] hlad вошёл(а) в комнату
[19:34:14] sattellite вышел(а) из комнаты
[19:34:34] sattellite вошёл(а) в комнату
[19:34:40] linus вошёл(а) в комнату
[19:38:45] rom1dep вышел(а) из комнаты: Connection failed: timeout
[19:39:26] sattellite вышел(а) из комнаты
[19:40:59] sattellite вошёл(а) в комнату
[19:41:44] sattellite вышел(а) из комнаты: Replaced by new connection
[19:41:47] sattellite вошёл(а) в комнату
[19:41:55] sattellite вышел(а) из комнаты
[19:41:57] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[19:42:01] jere вошёл(а) в комнату
[19:42:47] ThUnd3r|Gr33n вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[19:42:53] ThUnd3r|Gr33n вошёл(а) в комнату
[19:43:00] ThUnd3r|Gr33n вышел(а) из комнаты: Stream closed by us: Replaced by new connection (conflict)
[19:43:07] ThUnd3r|Gr33n вошёл(а) в комнату
[19:46:20] sattellite вошёл(а) в комнату
[20:00:01] sattellite вышел(а) из комнаты
[20:05:39] linus вышел(а) из комнаты
[20:06:47] sattellite вошёл(а) в комнату
[20:07:19] jeremy вошёл(а) в комнату
[20:07:20] stefandxm вошёл(а) в комнату
[20:07:45] sattellite вышел(а) из комнаты
[20:17:11] linus вошёл(а) в комнату
[20:17:22] sattellite вошёл(а) в комнату
[20:20:04] jere вышел(а) из комнаты
[20:21:25] sattellite вышел(а) из комнаты
[20:23:11] linus вышел(а) из комнаты
[20:24:39] stefandxm вышел(а) из комнаты: Connection failed: connection closed
[20:27:29] sattellite вошёл(а) в комнату
[20:27:31] mimi89999 вышел(а) из комнаты
[20:32:08] mimi89999 вошёл(а) в комнату
[20:39:30] hlad вышел(а) из комнаты: Replaced by new connection
[20:39:35] hlad вошёл(а) в комнату
[20:40:28] hlad вышел(а) из комнаты: Replaced by new connection
[20:40:34] hlad вошёл(а) в комнату
[20:40:38] cippaciong вышел(а) из комнаты
[20:41:08] jere вошёл(а) в комнату
[20:41:47] cippaciong вошёл(а) в комнату
[20:43:37] sattellite вышел(а) из комнаты
[20:45:32] jeremy вошёл(а) в комнату
[20:46:02] jeremy вышел(а) из комнаты
[20:48:07] rozzin вышел(а) из комнаты: Machine going to sleep
[20:52:02] linus вошёл(а) в комнату
[20:54:50] jodok вышел(а) из комнаты: Replaced by new connection
[20:54:58] jodok вошёл(а) в комнату
[21:00:17] <rom1dep> Heh cool read. Never considered the JVM as an alternative to the Erlang VM?
[21:00:31] sattellite вошёл(а) в комнату
[21:01:09] hlad вышел(а) из комнаты: Replaced by new connection
[21:01:16] hlad вошёл(а) в комнату
[21:03:02] sattellite вышел(а) из комнаты
[21:09:28] sattellite вошёл(а) в комнату
[21:10:13] linus вышел(а) из комнаты
[21:10:47] <Holger> rom1dep: Well you don't want to rewrite 15 years of ejabberd code, so this is all just useless "vi is better than emacs" chat ☺️
[21:14:24] <Holger> I prefer Erlang/BEAM. Nicer concurrency, introspection, and clustering. And Java is so boring ☺️
[21:15:14] <Holger> But there's other servers written in Java if you like that.
[21:15:19] <rom1dep> "Never" could have happened before ejabberd turned 15, or said differently, has the JVM any significant downside for that?
[21:15:21] <rom1dep> Ah
[21:15:57] <rom1dep> That's why I put 'jvm' and not java there, it has some cool languages nowadays
[21:16:35] <rom1dep> And fwiw, akka basically brings the Erlang concurrency to it
[21:17:13] linus вошёл(а) в комнату
[21:20:58] debalance вошёл(а) в комнату
[21:21:22] sezuan вошёл(а) в комнату
[21:21:35] SouL вышел(а) из комнаты
[21:21:52] kimsehic3 вошёл(а) в комнату
[21:22:20] hlad вышел(а) из комнаты: Replaced by new connection
[21:22:23] <Holger> Yes I've been shown the web site before. The fanbois of any arbitrary language will always show me a framework that tries to emulate the behavior for their language ☺️ I doubt it can provide a behavior similar to BEAM's scheduler without the core of the VM being designed with this sort of scheduling in mind. But I'm clueless and may be wrong ☺️
[21:22:26] hlad вошёл(а) в комнату
[21:23:14] linus вышел(а) из комнаты
[21:26:03] cippaciong вышел(а) из комнаты
[21:27:32] rom1dep вошёл(а) в комнату
[21:28:04] <rom1dep> it had me googling http://stackoverflow.com/questions/4491039/how-does-akka-compare-to-erlang for the record
[21:28:04] sattellite вышел(а) из комнаты
[21:29:33] rozzin вошёл(а) в комнату
[21:29:51] <Holger> Yes that basically matches my expectations :-)
[21:30:13] cippaciong вошёл(а) в комнату
[21:31:17] <Holger> And it's not just BEAM's preemtive scheduling mentioned there but also the memory layout / garbage collection built around that model.  You can't implement these things as an afterthought on top of an existing language.
[21:34:05] debalance вышел(а) из комнаты
[21:35:19] kimsehic3 вышел(а) из комнаты: Disconnected: Replaced by new connection
[21:35:25] kimsehic3 вошёл(а) в комнату
[21:36:02] rozzin вышел(а) из комнаты: Machine going to sleep
[21:39:16] <rom1dep> 👍
[21:40:46] sattellite вошёл(а) в комнату
[21:41:12] <zinid> the most liked Java inclined post from this SO page:
"IMO, Scala is a much better language on the syntax level than Erlang. It has objects, traits, proper namespaces, proper type safety, no ugly record syntax, etc. The community is larger, I can use all available Java tools and it just feels more polished."
[21:41:14] <zinid> checkmate
[21:41:42] <zinid> translation: we shit, but have good syntax and a lot of fanboys
[21:41:57] <zinid> the same will happen with Go, I bet :)
[21:41:58] linus вошёл(а) в комнату
[21:42:50] pod вышел(а) из комнаты
[21:51:53] <rom1dep> zinid: well, scala may be hip, and all, but it's an academic language (like ocaml) that tries to take computer/compilers/programming language science to a next/higher level. Go is the exact opposite (dumbed down language so google's cheap interns can't mess-up so much that their managers can't reuse the code because nobody understands it)
[21:52:29] <zinid> I actually tried to learn scala (when I was searching for Erlang replacement)
[21:52:39] <zinid> it's nothing withon knowing java, so no
[21:52:50] sattellite вышел(а) из комнаты
[21:52:51] <Holger> rom1dep: Yes that's what I like about Go as well.  It's dumbed down to my level :-)
[21:53:37] <zinid> what's the point in learning scala when I need to read a lot of java code?
[21:53:46] <zinid> I would rather use java directly
[21:54:52] <rom1dep> Scala tries to have a sound type system, for instance. I wouldn't mind seeing more 'refined' languages like it, or Haskell, or others becoming more mainstream, quite the opposite
[21:55:26] stefandxm вошёл(а) в комнату
[21:55:29] <zinid> last time I checked scala and haskell had comparable popularity
[21:55:42] <zinid> haskell has grown a lot in this regard in last years
[21:56:44] <rom1dep> Holger: haha. But seriously, missing generics and taking a firm stance on it that boils down to "our users are not smart enough and prepared for it, so we'll keep them in the dark" is pathetic.
[21:57:08] <zinid> but it works ;)
[21:57:33] <zinid> because users are... well, not smart enough :)
[21:57:51] <rom1dep> zinid: did you face a wall with picking up scala that required you to learn java to go further?
[21:58:05] <rom1dep> Shouldn't be the case
[21:58:06] <zinid> yes, android application for example
[21:58:17] <zinid> try to write android application in scala
[21:58:21] <zinid> you will be surprised
[21:59:18] <rom1dep> Bah, android is the worst platform, I don't have enough hair left to pull to waste my energy on it, I really have no fun there
[22:00:06] <rom1dep> But that's not the typical scala battlefield, it's a bit harsh to judge based on that
[22:00:09] sven7 вышел(а) из комнаты
[22:02:17] <zinid> so how do I remsh in scala?
[22:02:53] <zinid> a customer has a problem, I need to investigate what's going on in production, probably even running profiling on some parts
[22:03:21] <rom1dep> Remote java debugger?
[22:03:31] <zinid> debugger
[22:03:33] <zinid> lol
[22:03:34] linus вышел(а) из комнаты
[22:03:39] <zinid> well, erlang has debugger too
[22:03:49] <zinid> but why don't I use it? ;)
[22:03:57] <zinid> because debuggers are shit?
[22:04:06] <rom1dep> Yup works anywhere, for any process and if you want a shell,you just connect to a shell session
[22:04:14] linus вошёл(а) в комнату
[22:04:15] <rom1dep> Have a look at ammonite shell for instance
[22:05:45] <zinid> not very clear from the github page
[22:06:09] <rom1dep> http://www.lihaoyi.com/Ammonite/#RemoteREPL
[22:07:25] <rom1dep> even something like jconsole lets you do a bunch of stuff without requiring anything special
[22:07:39] <rom1dep> you can invoke functions remotely
[22:10:10] <zinid> even prosody/lua has remote shell
[22:10:20] <zinid> where you can call something
[22:11:18] <zinid> so how do I know which part is going wrong? what should I do? running a debugger?
[22:11:18] <rom1dep> what I'm telling you is that it's nothing language specific there, you can connect and remote debug anything running on the JVM and do quite a lot of stuff already
[22:11:55] <rom1dep> then you can use an IDE-type remote debugger that will let you "drill down" into the code and inspect variables values
[22:12:02] <rom1dep> and if you just want a shell, there are shells
[22:12:22] <zinid> in erlang it's very clear, it's like a regular shell, where you can inspect running processes, using top or whatever
[22:12:35] stefandxm вышел(а) из комнаты: Connection failed: connection closed
[22:13:25] <rom1dep> yup, nothing special
[22:14:29] <zinid> and in scala, well, could you please elaborate?
[22:14:44] <zinid> I should take a list of all objects and call some method on them or what?
[22:14:50] <rom1dep> I mean, just google java/jvm monitoring tools, I don't think there are many platforms with more options than that
[22:15:05] <zinid> ah, just google, ok
[22:15:34] <zinid> every debate with java guys ends up with this
[22:15:38] linus вышел(а) из комнаты: Replaced by new connection
[22:15:41] linus вошёл(а) в комнату
[22:15:43] <zinid> no exact answer, just googel :)
[22:15:50] <rom1dep> you have more options in the possible first hit than you have expressed needs so far
[22:15:55] <rom1dep> I can't read your mind ;)
[22:16:36] <zinid> ok, I repeat: in erlang I can sort all processes by reductions, memory or mailboxes
[22:16:48] <zinid> what's the analog for this in scala?
[22:17:12] <rom1dep> you want a gui ? you want a shell ? you want a web dashboard ?
[22:17:21] <zinid> I want a shell
[22:17:32] <rom1dep> then implement a shell in your app
[22:17:43] <rom1dep> make a call to ammonite.main
[22:17:46] <rom1dep> and you go
[22:17:52] <zinid> go with what?
[22:18:06] <rom1dep> you want a nice graphics showing your threads ? memory ? objects ? use jconsole
[22:18:06] <zinid> I don't I need to implement shell in erlang?
[22:18:43] <zinid> how to stop some "object", i.e. kill -9
[22:19:07] <rom1dep> maybe you want something is nothing more than what you are used to, maybe you could find better
[22:19:26] <zinid> I have asked exact questions :)
[22:19:30] <zinid> I though you know ;)
[22:19:39] <rom1dep> you null that reference to the object and call the GC?
[22:19:44] <rom1dep> or you interrupt the thread?
[22:20:45] <rom1dep> I mean, from a shell with access to your program runtime and the whole standard library of your language, multi lines colored input and autocompletion, what else do you need?
[22:21:02] <rom1dep> what do you think you would need ?
[22:21:46] stefandxm вошёл(а) в комнату
[22:22:07] sattellite вошёл(а) в комнату
[22:23:12] linus вышел(а) из комнаты
[22:23:28] <Holger> rom1dep: Java threads aren't like Erlang processes, they're OS threads.  Sorting processes by resource usage is highly useful when tracking down issues on production servers indeed.  And I'd be surprised if you could do something equivalent with the JVM, as it boils down to Erlang's process model again.  It doesn't just make programming easier but also helps with introspection.
[22:23:46] pinky вошёл(а) в комнату
[22:23:56] linus вошёл(а) в комнату
[22:24:12] <zinid> well, it can be dome with debugger probably, but only if debugger is lightweight
[22:24:15] sattellite вышел(а) из комнаты
[22:24:32] <zinid> not sure what to do when you find "something" (not sure what to find in JVM)
[22:26:05] <rom1dep> Holger, if a thread is misbehaving, I could spot it right away with jconsole, visualvm, topthreads and so on
[22:26:07] erik вошёл(а) в комнату
[22:26:32] <Holger> Say an XMPP session goes nuts because a user is DoSed.  In ejabberd there's an Erlang process that manages his XMPP session.  So we can easily spot it as the process currently eating most resources.  Then we can freely query or modify its state, or kill it.
[22:27:20] <zinid> try to kill something sitting in locked section
[22:27:54] <Holger> In Java you'd have a thread handling many such sessions.  You can introspect that thread, but chances are it won't be as straightforward, and you can't easily kill it.
[22:27:57] <Holger> Right.
[22:28:12] <rom1dep> Holger, again, it depends on how you decided to handle your sessions, and it's not up to java/jvm to decide for you
[22:28:20] <Holger> Of course it is.
[22:28:39] <Holger> You can't just decide to use a thread per session.
[22:28:44] <rom1dep> it wouldn't show up in top, that doesn't mean that it wouldn't show up at all in a cpu monitoring tool
[22:28:55] <Holger> Well you can but that you won't support many concurrent sessions per node :-)
[22:28:56] <zinid> I thought in scala we spawn a process per session, this is just handy, no?
[22:29:00] linus вышел(а) из комнаты: Replaced by new connection
[22:29:04] linus вошёл(а) в комнату
[22:29:27] <rom1dep> you could
[22:29:28] <zinid> or actor, how is it called there, I'm lost
[22:29:43] <rom1dep> you could use actors also
[22:29:52] <rom1dep> you could use futures, and run them on a thread pool
[22:29:56] <zinid> can I kill actors?
[22:30:02] <Holger> rom1dep: You can't in the same way you can on BEAM.  As I said above.
[22:30:18] <zinid> run them on a thread pool?
[22:30:21] <zinid> what does it mean?
[22:30:24] <Holger> That's a VM feature and you can't just emulate it on top of the JVM.
[22:30:28] <zinid> how the scheduling is implemented?
[22:30:51] <zinid> smells like cooperative scheduling
[22:31:09] <zinid> just splitted across thread-pool
[22:31:13] <rom1dep> you can't do it the same way you would do on BEAM, that doesn't mean you can't do anything like it
[22:32:09] <Holger> You can't do it as nicely :-)
[22:32:48] <zinid> also, I bet there is something in Haskell like that, why would I mess with scala after all?
[22:32:51] jere вышел(а) из комнаты
[22:32:55] <rom1dep> if there were a cookie-cutter solution that would work best in all cases we wouldn't be comparing so many concurrency/parallelism… models
[22:34:14] <Holger> Not in all cases, but for chat servers and similar things, I'd say BEAM's model is the best :-)
[22:34:19] <rom1dep> zinid, why not? I believe trade-offs in programming languages are not one-dimensional going from bad to good
[22:34:45] <Holger> It was designed with such a use-case in mind and that's the one thing it does really well.  The JVM does many other things better than BEAM, don't worry.
[22:35:03] <rom1dep> it's better at things worse at others, you should match your use-case against the strengths and weaknesses
[22:35:12] <rom1dep> Holger, you're probably right
[22:35:31] <Holger> rom1dep: ... while you more sound like JVM is the best no matter the use-case :-)
[22:35:45] <rom1dep> and I'm sure you've much much more knowledge on the matter than I have
[22:36:51] <rom1dep> that doesn't mean you cannot do distributed/performing apps on top of the jvm and end-up with a black box you can't introspect and understand
[22:37:21] <Holger> Of course.  You can do this stuff in most languages.  I mean you can even do it in Lua!
[22:37:34] <Holger> I'm just arguing that Erlang is a good fit.
[22:38:47] stefandxm вышел(а) из комнаты: Connection failed: connection closed
[22:38:48] <zinid> I bet one can write a jabber server in assembler
[22:43:16] stefandxm вошёл(а) в комнату
[22:43:36] sattellite вошёл(а) в комнату
[22:46:24] rozzin вошёл(а) в комнату
[22:48:30] sezuan вышел(а) из комнаты: Machine going to sleep
[22:49:27] <rom1dep> > Holger: you more sound like JVM is the best no matter the use-case
Certainly not. My initaial question was genuinely naïve, if other languages like ocaml were tried, what would prevent a JVM language to be a compelling alternative? That seems especially relevant after the hints as how erlang/beam can be a scary platform. And that was answered.
I'm in no way in a position to challenge you and your long-amassed technical experience. But I'd be delighted to shed some (frail) light on the debugging/troubleshooting options and tooling on the JVM considering that they seem to be largely downplayed here. BEAM may be the best fit for a platform like ejabberd, granted, I still fail to see how that is related to debugging and how BEAM it is such a special snowflake on that aspect. That troubleshouting remote-shelling looks boring to me, honnestly.
[22:50:01] sattellite вышел(а) из комнаты
[22:50:09] SouL вошёл(а) в комнату
[22:50:34] jere вошёл(а) в комнату
[22:51:17] linus вышел(а) из комнаты
[22:53:44] sattellite вошёл(а) в комнату
[22:55:28] cippaciong вышел(а) из комнаты
[22:57:32] <Holger> Well I could only repeat myself.  My point is that Erlang's process model isolates individual tasks of a server in a way that makes introspection easier than what I've seen from other platforms.
[22:59:14] <rom1dep> Holger: what would be missing from https://visualvm.github.io/index.html for instance ?
[23:03:07] <Holger> I have not used that so I can't tell you for sure.  But such debuggers are usually focused on code blocks.  You can check what line of code a given thread is currently executing, and you can look at the memory (at variable values, whatever).  In an Erlang shell, your focus is on processes instead, which roughly maps to objects (i.e. *instances* of classes) in Java.
[23:03:56] <rom1dep> ok, 1sec
[23:04:24] <Holger> You look at the objects attributes, its state, its communication with other objects (messages sent to or received from other processes).  Or you modify these things, or kill the object altogether.
[23:04:53] <Holger> Then you have profiling tools which operate on these things, i.e. on aggregates of objects.
[23:06:01] <Holger> And from my experience this stuff is highly useful in practice, when introspecting internet services.  That's all.
[23:07:10] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[23:07:13] jere вошёл(а) в комнату
[23:07:37] <Holger> I never worked with a Java XMPP server such as Openfire or Tigase.  That would give a proper comparison.
[23:09:57] pod вышел(а) из комнаты
[23:10:45] <rom1dep> http://tamytro.org/tmp/threads.png
http://tamytro.org/tmp/memory.png
[23:11:13] <rom1dep> then you can add instrumentation, and custom probles
[23:11:16] <rom1dep> then you can add instrumentation, and custom probes
[23:11:23] <rom1dep> I'm not an expert
[23:12:20] <Holger> Do we agree that this example supports my point? :-)
[23:12:37] <zinid> so a list of thread, what's next?
[23:12:50] <zinid> what should I do with it? terminate a thread?
[23:13:39] <rom1dep> http://tamytro.org/tmp/instances.png
[23:13:52] <zinid> I can draw absolutely the same picture in erlang, using scheduling thread statistics, which is pointless
[23:14:45] <Holger> rom1dep: 5 Baloon instances.  Can you list them, with their properties?
[23:15:19] <rom1dep> yes, I'm still new with that tool, hold on :)
[23:17:10] jere вышел(а) из комнаты: Disconnected: Replaced by new connection
[23:17:15] jere вошёл(а) в комнату
[23:19:54] <rom1dep> I need to attach to some code, so this may not be the greatest of all examples
[23:24:25] <Holger> I wouldn't go on your nerves if you hadn't declared this functionality as "boring" :-)
[23:24:51] <Holger> But I'm AFK for a while.  See you!
[23:26:20] <zinid> even on the thread.png picture we see thread utilization is suboptimal
[23:26:27] <zinid> some threads are overloaded, some are idle
[23:27:10] <zinid> because of cooperative scheduling, without any thread migration
[23:32:16] linus вошёл(а) в комнату
[23:32:40] sattellite вышел(а) из комнаты
[23:32:40] sergio вошёл(а) в комнату
[23:34:44] sattellite вошёл(а) в комнату
[23:37:42] <rom1dep> http://tamytro.org/tmp/members.png
[23:39:33] jere вышел(а) из комнаты
[23:39:36] jere вошёл(а) в комнату
[23:41:10] cippaciong вошёл(а) в комнату
[23:41:47] sattellite вышел(а) из комнаты
[23:44:48] pinky вышел(а) из комнаты
[23:45:01] pinky вошёл(а) в комнату
[23:45:01] pinky вышел(а) из комнаты
[23:45:05] sattellite вошёл(а) в комнату
[23:51:48] sattellite вышел(а) из комнаты
[23:51:49] <rom1dep> zinid: how can you say that? the timeframe for the threads screenshot is like 30s, and it's showing the thread status over that timeframe, not the cpu usage per thread. Also regarding scheduling, it runs native/system threads, so the scheduling is up to the OS?
[23:53:23] badlop вышел(а) из комнаты
[23:55:23] jeremy вышел(а) из комнаты
[23:55:30] sattellite вошёл(а) в комнату
[23:57:50] linus вышел(а) из комнаты
Powered by ejabberd - robust, scalable and extensible XMPP server Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!