IRC logs of #shogun for Friday, 2017-06-09

--- Log opened Fri Jun 09 00:00:05 2017
-!- olinguyen [81615ad9@gateway/web/freenode/ip.129.97.90.217] has quit [Quit: Page closed]00:27
@wiking????03:13
-!- mikeling [uid89706@gateway/web/irccloud.com/x-kkmyepfbwvxthgjp] has joined #shogun04:29
mikelingwiking: hey!05:13
mikelingmorning Sir05:13
mikelingwiking: ping06:01
mikelingwhat's this for ? https://github.com/shogun-toolbox/shogun/blob/develop/src/shogun/base/DynArray.h#L359-L36206:01
-!- iglesiasg [~iglesiasg@217.119.234.214] has joined #shogun09:21
-!- mode/#shogun [+o iglesiasg] by ChanServ09:21
-!- geektoni [5d27d5be@gateway/web/freenode/ip.93.39.213.190] has joined #shogun09:55
shogun-buildbotbuild #77 of nightly_all is complete: Success [build successful]  Build details are at http://buildbot.shogun-toolbox.org/builders/nightly_all/builds/7710:01
@wikingmikeling, here?10:07
mikelingwiking: yep10:07
@wikingmikeling, ok so i dont understand10:07
@wikingwhy would you try to use std::vector<bool>10:07
@wiking?10:07
@wiking:)10:07
mikelingbecause we need it in DynProg10:08
mikelinghttps://pastebin.mozilla.org/902403910:08
@wikingyes10:09
@wikingbut why dont we use a different datastructure10:10
@wikingfor the special case of10:10
@wikingDynamicArray<bool>10:10
@wiking?10:10
mikelingwiking: yeah, but array doesn't really works, because std::array looks like can't been resize maanully10:11
mikeling* manually10:11
@wikingmikeling, yes you can10:11
@wikingdelete it10:11
@wiking1) create a new one10:11
@wiking2) copy stuff from the old10:11
@wiking3) delete the old10:11
@wikingi mean10:11
@wikinglike old school10:11
mikelingdelete it?10:11
mikelingmmm, so10:11
mikelingif I got a pointer init by DynamicArray<bool>.get_array()10:12
mikelingwhat will happened if I just delete the old one10:12
@wikingyeah it's invalid10:13
@wikingbut i mean10:13
@wikingyou use the array internally10:13
@wikingyou who write the code10:13
@wikingshould know that this could happen10:13
mikelingwiking: ok, but things will become weird for insert_element()10:14
mikelingI need to first create a new onw10:15
mikelingone10:15
mikelingand copy first part of elements into it10:15
mikelingadd the new element and copy the rest of the old one10:15
mikelingI prefer to do it by plain pointer10:16
mikelinglike bool* m_array and make things act like DynArray(bunch of mallocs)10:17
mikelingBut we could use Template Specialization to make these things happened only when the T is bool10:18
mikelingand we use std::vector for the rest of type10:18
mikelingI know it's weird, but so we could get rid of DynArray10:19
@wikingyes10:21
@wikingbut i mean this was the idea until now10:21
@wikingno?10:21
@wiking"Template Specialization to make these things happened only when the T is bool10:21
@wiking"10:21
@wikingthat's why i was a bit surprised when i saw a log when you were talking about std::vector<bool>10:21
mikelingwiking: yeah, I finally give it up until this morning10:23
mikelingI thought I could do it when I found something like std<bool>::reference10:23
mikelingand std<bool>::pointer10:23
@wikingnono10:23
@wikingthose are special way of arrays10:23
@wikingbecause they super optimized10:24
@wikingfor the bool value10:24
@wikingi guess the story there is that10:24
mikelingyeah....10:24
@wikingthey take a unit8_t10:24
mikelingso I finally give it up10:24
@wikingand store there 8 booleans10:24
@wikingand use bit operations to set and get the right boolean value10:24
@wiking;)10:24
mikelingso, I'm trying to use bool* now, most of works are same like we did in DynArray.10:27
mikelinghope it can works this time10:27
@wikingyes10:27
@wikingit should10:27
mikelingI really need finish it and move on10:27
@wikingi mean if you maintain your own10:27
mikelingreally do10:27
@wikingbool array10:27
@wikingthen it should be fine10:27
geektoniping wiking10:30
@wikingpong10:32
geektoniI get some weird errors on the last PR I made10:33
geektonihttps://travis-ci.org/shogun-toolbox/shogun/jobs/240700757#L355910:33
geektoniAre they related to SWIG?10:33
@wikinglemme check10:34
@wikingprobably10:35
@wikinglemme see the changes10:35
@wikingin the code10:35
@iglesiasgwiking, mikeling: if Features and DynProg are not getting a pointer to the data, it should be possible to use std::vector<bool>, right?10:35
@wikingiglesiasg, yes10:35
@wikingwell it's easy to test10:36
@wikingjust disable that function10:36
@wikingget_array()10:36
@wikingfor T = bool10:36
@iglesiasgthen, I think substituting DynArray by std::vector should still be all good10:37
@iglesiasgit might need a special treatment to explitcitly say DynArray<bool> is std::vector<bool>, otherwise DynArray<T> is std::vector<T>10:37
@iglesiasgmikeling: does it make sense to you?10:38
@wikingstructure/DynProg.cpp:    m_sign_words_array(m_sign_words.get_array()),10:38
@wiking:)10:38
@wikingCDynamicArray<bool> m_sign_words10:38
mikelingiglesiasg: wiking actually I had test it and i found it do call get array10:38
@iglesiasgthen no10:38
mikelingYes that's it10:38
@iglesiasgbecause it is geting the pointer to the data10:38
mikelingAnd I also try to use int instead of bool10:39
@iglesiasgis it reasonable to dive i if the m_sign_words_array(m_sign_words.get_array()) could be done differently?10:39
mikelingLike 1 represent true and 0 represent  false10:39
mikelingBut it somehow went wrong also10:40
@iglesiasgm_sign_words_array(m_sign_words.get_array())10:40
@wikingiglesiasg, the problem with this approach10:40
@iglesiasgthat looks like it is just being used as a shorthand10:40
@wikingis that you kind of conceptually break10:40
@wikingDynamicArray for a special type10:40
@wikingso i mean either disable DynamicArray<bool> as is10:40
@wikingor make it sure that it works for all the interface of DynamicArray10:40
@iglesiasgyeah10:41
@iglesiasgmy thinking is that since the stl also made that error10:41
@wiking:)10:41
@iglesiasgwe have that excuse to make it as well ^_^10:41
@wikingwell what jupyter can do....10:41
@wikinggeektoni, hey so one thing10:41
@wikingwhat is your swig version?10:41
@iglesiasgit feels reasonable to me at the time of taking the decision of falling back to std::vector10:41
@wikingnot for me10:42
@wikingi feel it's really awkward10:42
@wikingto say10:42
@iglesiasgif std::vector has that limitation and we are just making use of it, of course then we get that limitation10:42
@wikingDynamicArray<bool> is ok until you dont get the array :)10:42
@wikingi mean in that case10:42
@iglesiasgyeah, it is weird10:42
@wikingthen please just remove get_array()10:42
@wikingfrom the api10:42
@iglesiasgbut it is something that comes with std::vector10:42
@wikingthat might be a more reasonable thing to do ...10:42
geektoniwiking: my swig version is 3.0.810:42
@wikingok10:43
@wikingso lemme check some10:43
@wikingbut there's something with swig there definitely10:43
@wikingi'm just wondering what10:43
geektonimaybe it can't "convert" Some<>?10:43
@wikingyeah i'm wondering what exactly could go wrong there10:44
geektoniwiking: btw, did you receive my daily update?10:44
@wikinggeektoni, yes10:49
@iglesiasgbut yeah, I think that making our own DynArray<bool> and for any other T != bool DynArray<T> is std::vector<T> is also good10:51
geektoniwiking: kk10:51
@wikinggeektoni, trying to see wtf is happening there10:54
@wikingbut i guess10:54
@wikingthere's an indirection problem10:54
@wikingthat since things became Some<>10:55
@wikingbecause10:55
@wikingyeah probably10:55
@wikingno?10:55
@wikinggeektoni, i mean SGObject.parallel is now Some<Parallel>10:56
@wikingand as the swig error says10:56
@wikingwe still call10:56
@wikingSGObject.parallel.set_num_threads(num_threads)10:57
geektoniit shouldn't change much10:57
geektoniI mean10:57
geektoniif we a pointer or a Some object10:57
@wikingbut it should be10:57
@wikingsvm.parallel->set_num_threads(num_threads)10:57
@wikingno?10:57
geektoniwe can still reach its methods by using ->10:57
@wikingyes10:57
geektonibut10:58
@wikingi mean the thing is that that mapping should be taken care by someboy10:58
@wiking*sombody10:58
@wikingi mean swig has no idea that Some is an indirection object10:58
@wikingit only knows that you want10:59
@iglesiasgSome<body>10:59
@wikingSome<Parallel>.set_num_threads10:59
@wikingand it tries to lookup the set_num_threads of Some10:59
@wikingbut obviously it doesn't have that10:59
geektoniok right10:59
geektonithat means we need to tweak some .i file?10:59
@wikingyep11:01
@sukeyPull Request #3840 "[SmartPointers] Port SGObject and its unit tests to Some<>."  synchronized by geektoni - https://github.com/shogun-toolbox/shogun/pull/384011:03
geektoniok, I'll give a look11:03
-!- HeikoS [~heiko@host-92-0-178-129.as43234.net] has joined #shogun11:03
-!- mode/#shogun [+o HeikoS] by ChanServ11:03
@wikinggeektoni, i guess you should be able to get some inspiration from: https://github.com/swig/swig/blob/master/Lib/shared_ptr.i11:04
@wikingas well as11:04
@wikinghttps://github.com/swig/swig/blob/master/Lib/python/boost_shared_ptr.i11:05
@wikingbut11:05
@wikingon this thing11:05
@wikingi think this is going to be much more complicated11:05
@wikingas we imagined11:05
@wiking\o/11:05
@wikinganother shitfuck11:05
@wikingbecause the swig guys did all the wrapping for11:05
@wikingstd::shared_ptr11:06
@wikingfor all the languages they support11:06
@wikingand now what?11:06
@wikingour plan is to do this for Some<> ? :)11:06
@wikingi would never do this11:06
@wikingbecause it's not scaleable11:06
@wikingHeikoS, ^11:07
@wikinggeektoni, but i mean check on it11:07
@wikingbut my suspicion is what i just wrote above11:07
@wiking:)))11:07
micmnsorry to interrupt :p I can't find the make target to get the preprocessed output of just one file, i.e. make Linalgblaba.i, is it possibile?11:07
@HeikoSwiking: hi11:08
@wikingmicmn, as tehre's no such thing :(11:08
geektoniyeah sure. Maybe it turns out to be less terrible than we think.11:08
@wikingmicmn, those .i files are being included in modshogun.i11:08
@wikinggeektoni, yep maybe :)11:08
@wikingbut i mean you do understand11:08
@wikingnevermind :)11:08
@wikingi mean i just dont see11:08
@wikinghow you wanna do this less complicated11:09
@wikingthan std::shared_ptr11:09
@wikingbecause what you need11:09
@wikingis for each wrapped objet11:09
@wiking*object11:09
@wikingon compile time generate the api11:09
@wikingsomehow11:09
@wikingright?11:09
@wikingapi of the wrapped object :D11:09
@wikingi mean it might work some sort of tricky indirection in case of dynamic languages11:09
@wikingbut things like11:10
@wikingjava or any other compiled language11:10
@wikingi'm a bit suspicious11:10
@HeikoSwiking: what is up?11:10
@wikingso like in case of java you would constantly do object inspection?11:10
@wikingi mean that is quite costly11:10
@wiking...11:10
@wikingbut ok i mean lets see11:10
@wikingHeikoS, Some<>11:11
@wikingand how to use those object from swig11:11
@wikingso say you have11:11
@wikingSGObject.parallel which is Some<Parallel>11:11
@HeikoSisnt there something like ->as(TYPE) ?11:11
@wikingand then let's say in python you want11:11
@wikingsvm.parallel.set_num_threads(3)11:11
@wikinghow do you translate this?11:12
@wikingHeikoS, what ? :)11:12
@HeikoSwiking: i have a talk now, but will think about that11:12
@HeikoSback soon11:12
@wikingbecause this what std::shared_ptr  does11:13
geektoniwiking: ok, so, right now, the only problems we have are with the R and Python interface. Other languages seem to work well (since all their test passes).11:13
@wikinggeektoni, because they dont have11:13
@wikingthose things accesd11:13
@wiking:)11:13
@wikingi mean those errors11:13
@wikingin python you get not from the generated examples11:13
@wikingbut from some custom examples right?11:13
geektoni? what do you mean?11:14
@wikingin CI11:14
@wikinghtere are just a handful examples11:14
@wikingthat are systematically tested11:14
@wikingon each and every interface11:14
@wikingthose are called integration_meta_*11:15
@wikingnow if you check in the python CI error11:15
@wikingit's all the cases11:15
@wikingwhere the python_modular tests are failing11:15
@wikingthose are some custom tests on python11:15
@wikingthat are not tested on other interfaces11:15
@wikinghence if you dont access11:15
@wikingparallel11:15
@wikingor other stuff from SGObject via a swig interface11:16
@wikingof course you will not fail11:16
geektoniahhn ok.11:16
geektoniwell11:16
geektoni*tableflip*11:16
@wikingsukey tableflip11:16
@wikingsukey: tableflip11:16
@wikingsukey help11:16
@sukeywiking: ship it - Display a motivation squirrel11:16
@sukeysukey adapter - Reply with the adapter11:16
@sukeysukey animate me <query> - The same thing as `image me`, except adds a few parameters to try to return an animated GIF instead.11:16
@sukeysukey calculate <expression> - Calculate the given math expression.11:16
@sukeysukey convert <expression> in <units> - Convert expression to given units.11:16
@sukeysukey echo <text> - Reply back with <text>11:16
@sukeysukey flip - Hubot flips a table11:17
@sukeysukey help - Displays all of the help commands that Hubot knows about.11:17
@sukeysukey help <query> - Displays all help commands that match <query>.11:17
@sukeysukey image me <query> - The Original. Queries Google Images for <query> and returns a random top result.11:17
@wikingsukey flip11:17
@sukeysukey map me <query> - Returns a map view of the area returned by `query`.11:17
@sukeysukey mustache me <url|query> - Adds a mustache to the specified URL or query result.11:17
@sukeysukey ping - Reply with pong11:17
@sukeysukey pug bomb N - get N pugs11:17
@sukeysukey pug me - Receive a pug11:17
@sukeysukey tell <recipients> <some message> - tell <recipients> <some message> next time they are present.11:17
@sukeysukey the rules - Make sure hubot still knows the rules.11:17
@sukeysukey time - Reply with current time11:17
@sukeysukey translate me <phrase> - Searches for a translation for the <phrase> and then prints that bad boy out.11:17
@sukeysukey translate me from <source> into <target> <phrase> - Translates <phrase> from <source> into <target>. Both <source> and <target> are optional11:17
@sukey(╯°□°)╯︵ ┻━┻ ︵ ╯(°□° ╯)11:17
@wikingyeeeeeeeeeeeeeey11:17
@wikingsukey flip11:17
@sukey(╯'□')╯︵ ┻━┻11:17
@wiking:>11:17
@wikingi mean this is gonna be a serious issue11:17
@wikingyou really dont want to into this11:17
@wikingimo11:17
@wikingunless you want to code swig11:17
@wikingfor the next 1 month11:17
@wikingand in a way for nothing11:18
@wikingbecause that work has been done for std::shared_ptr11:18
@wikinghttps://github.com/swig/swig/blob/master/Lib/java/boost_shared_ptr.i11:18
@wikingand as you can see11:18
@wikingthese things are all nicely customised11:18
@wikingfor all the langauges :)11:18
geektonimmh, since there are most important things to do I would gladly skip this pain.11:19
geektonihowever11:19
geektoniif we can't export Some<> by using swig11:20
geektonitechnically we can't port member variables to some11:20
geektonibecause they won't be accessible anymore from other languages.11:20
@wiking:)11:21
@wikingbingo11:21
geektonioh crap11:22
@wikinggeektoni, i'm just looking at this one11:23
@wikinghttp://www.swig.org/Doc3.0/Library.html#Library_std_shared_ptr11:23
@wikingi mean it seems11:23
@wikingfor me that this indirection is not even possible with std::shared_ptr11:23
@wikingas far as i understand it now11:23
@HeikoSwiking: re11:24
geektoniI need to look at it more closely, because I'm not a SWIG master11:24
@wikingand then even the more nice thing is "Some target languages have support for handling the shared_ptr reference counted smart pointer"11:24
@wikingnote the *some* part11:24
@wikingi.e. this will limit the target languages we could even support11:25
@HeikoSwiking: not sure I yet fully understand the problem11:25
@wikingit's fucked :)11:25
@wikingthat's the story11:26
@HeikoSwe cannot make API like parallel part of the base class api that is generated by swig?11:26
@wikingque?11:26
@HeikoSi.e. no dynmiac typing for that?11:26
@HeikoSlike the parallel set_num_threads11:26
@HeikoScant that be part of the base API?11:26
@HeikoSso there is no need to "get" an object before?11:27
@wikingi really dont see11:27
@wikinghow you gonna make this11:27
@wikingi mean i really dont fully understand the concept yet11:27
@HeikoSis this a problem related to things like Parallel?11:28
@HeikoSor even for things like "get_kernel"?11:28
@wikingit's a problem11:28
@wikingif you wanna use Some<>11:28
@wikingso basically remove auto reference counting11:28
@wikingi.e. get rid of11:28
@wikingSG_REF/UNREF11:29
@wikingso any SGObject11:29
@HeikoSI see11:29
@HeikoSnoiche!11:29
-!- HeikoS_mobile [~Mutter@host-92-0-178-129.as43234.net] has joined #shogun11:30
HeikoS_mobileI guess we keep on being surprised by this multi Lang stuff11:31
@wiking?11:33
@HeikoSwiking: well as in problem we didnt anticipate11:34
@wikingwell yes :)11:34
@HeikoSwiking: so let me understand the problem11:34
@HeikoSyou call a "get"11:34
@HeikoSyou get a some<...>11:34
@wikingwhat get?11:34
@HeikoS"get_parallel"11:34
@wikingi dont understand what kind of get?11:34
@wikingno11:34
@wikingnobody calls get_paralle11:34
@wikingl11:34
@wikingas parallel is a public11:34
@wikingbut yeah11:35
@wikingyou can call get11:35
@wikingif you want11:35
@wikingit doesn't change the story here11:35
@wikingyes you get some<parallel>11:35
@HeikoSok11:35
@wikingwhich is auto reference counted11:35
@HeikoSthen I have a some<parallel> object in say python11:35
@wikingyes11:35
@wikingand then you wanna call any method on it11:35
-!- HeikoS_mobile [~Mutter@host-92-0-178-129.as43234.net] has quit [Quit: Mutter: www.mutterirc.com]11:35
@HeikoSwell that doesnt work yet11:36
@HeikoSbecause it is some11:36
@HeikoSright?11:36
@wikingwhich is th method of the wrapped object11:36
@wikingbut i mean11:36
@wikinghow you plan to fix this?11:36
@HeikoSso there needs to be a cast11:36
@wikingwhat cast?11:36
@HeikoSp = some<parallel> ...11:36
@wikingyes an p i now some<parallel>11:36
@wikingand?11:36
@HeikoSp.as<API_I_WANT>().my_mymethod?11:36
@wikingwhat?11:37
@wiking:)11:37
@HeikoSisnt that what sergey said?11:37
@HeikoSthere is a cast operation implemented somewhere in tags-swig-interface11:37
@wiking?11:37
@HeikoSthat can re-interpret the type of any tag object11:37
@HeikoSlisitsyn: ^ no?11:38
@wikingHeikoS, if you do git grep Any11:38
@wikingin src/interfaces11:38
@wikingthere's only 1 hit11:39
-!- HeikoS_mobile [~Mutter@host-92-0-178-129.as43234.net] has joined #shogun11:39
@wikingpython_modular/swig_typemaps.i:        array=PyArray_FromAny((PyObject*)ary, NULL,0,0, NPY_FARRAY|NPY_ENSURECOPY, NULL);11:39
@wikingbut yeah wait11:39
@wikingwrong brnahc11:39
@wikingnoup11:39
@wikingsame story for in feature/tags11:39
@HeikoSbut this problem11:40
@HeikoSis the same as for say11:40
@HeikoSk=mkl->get_kernels()->get(0)11:40
@HeikoSGaussianKernel::obtain_from_generic(k).get_width()11:40
@HeikoSno11:40
@HeikoS?11:40
@wikingeh?11:41
@wikingi dont see how that's the same11:41
@wikingi mean MKL* get_kernels11:41
@wikingreturns a Kernel*11:41
@wikingthat has get11:41
@wikingbut you dont get any other type11:41
@wikingjust11:41
@wikingSome11:41
-!- HeikoS_mobile [~Mutter@host-92-0-178-129.as43234.net] has quit [Remote host closed the connection]11:41
@wikingand Some interface only has a handful of11:41
@HeikoSwiking: sure k is kernel11:42
@HeikoSbut no access to the methods one wants11:42
@HeikoSand so a cast-like call is needed11:42
@HeikoSwiking: what does lisitsyn say to this?11:42
@wikingi have no idea11:42
@wikingi was just guessint11:42
@wiking*guessing11:42
@wikingthat this is a similar story11:42
@wikingin case of swig11:43
@wikinglike std::shared_ptr11:43
@wikingas that's kind of our Some11:43
@wikingand if you check in swig the story of std::shared_ptr is really a non trivial story11:43
@HeikoSyep I glanced over that11:44
@wikingso i mean yeah maybe we have a magic11:44
@wikingbuuuut11:44
@HeikoSwiking: and if the libshogun and the swig stuff is separated?11:44
@wikingi'm a bit sceptical11:44
@wikingttyl11:44
@HeikoSkk11:44
-!- geektoni [5d27d5be@gateway/web/freenode/ip.93.39.213.190] has quit [Quit: Page closed]12:36
lisitsynwiking: HeikoS: ok did read your discussion13:00
lisitsynwill need to take a look at std::shared_ptr in swig13:01
lisitsynit is no different13:01
lisitsynas far as I know swig extensions (even internal ones) are not hard-coded13:01
lisitsynso should be possible13:01
mikelingwiking: ping13:32
mikelinglisitsyn: Hi~13:32
-!- geektoni [c1cdd24e@gateway/web/freenode/ip.193.205.210.78] has joined #shogun14:02
-!- HeikoS [~heiko@host-92-0-178-129.as43234.net] has quit [Quit: Leaving.]14:14
-!- HeikoS1 [~heiko@host-92-0-178-129.as43234.net] has joined #shogun14:14
-!- HeikoS1 [~heiko@host-92-0-178-129.as43234.net] has quit [Client Quit]14:15
@sukeyPull Request #3826 "Remove duplicate code in LDA/FisherLDA and port the solvers to use linalg (WIP)" - https://github.com/shogun-toolbox/shogun/pull/382614:58
@sukeyPull Request #3826 "Remove duplicate code in LDA/FisherLDA and port the solvers to use linalg (WIP)"  synchronized by micmn - https://github.com/shogun-toolbox/shogun/pull/382614:59
-!- Saurabh7_ [Saurabh7@gateway/shell/panicbnc/x-krwoojqznvtjxuod] has quit [Ping timeout: 255 seconds]15:10
-!- iglesiasg [~iglesiasg@217.119.234.214] has quit [Quit: leaving]16:07
-!- geektoni [c1cdd24e@gateway/web/freenode/ip.193.205.210.78] has quit [Quit: Page closed]16:30
-!- OXPHOS [92bd305b@gateway/web/freenode/ip.146.189.48.91] has quit [Quit: Page closed]17:28
-!- HeikoS [~heiko@host-92-0-178-129.as43234.net] has joined #shogun17:28
-!- mode/#shogun [+o HeikoS] by ChanServ17:28
@sukeyPull Request #3832 "use std::deque instead of DynArray(on going)"  synchronized by MikeLing - https://github.com/shogun-toolbox/shogun/pull/383217:57
-!- HeikoS [~heiko@host-92-0-178-129.as43234.net] has quit [Ping timeout: 246 seconds]18:52
@sukeyPull Request #3832 "use std::deque instead of DynArray(on going)"  synchronized by MikeLing - https://github.com/shogun-toolbox/shogun/pull/383219:38
mikelingwiking: lisitsyn ping19:39
-!- mikeling [uid89706@gateway/web/irccloud.com/x-kkmyepfbwvxthgjp] has quit [Quit: Connection closed for inactivity]22:10
-!- Saurabh7_ [Saurabh7@gateway/shell/panicbnc/x-qjqdjvhmwkfngaea] has joined #shogun23:45
--- Log closed Sat Jun 10 00:00:07 2017

Generated by irclog2html.py 2.10.0 by Marius Gedminas - find it at mg.pov.lt!