The web in a box - a next generation web framework for the Perl programming language

IRC log for #mojo, 2017-05-08

| Channels | #mojo index | Today | | Search | Google Search | Plain-Text | summary

All times shown according to UTC.

Time Nick Message
00:40 Pierre joined #mojo
01:17 bobkare joined #mojo
02:36 noganex joined #mojo
04:04 Pierre joined #mojo
04:09 Pierre joined #mojo
04:13 aborazmeh joined #mojo
04:36 iamb joined #mojo
05:59 Pierre joined #mojo
06:34 Peppard joined #mojo
06:49 dod joined #mojo
06:52 AndrewIsh joined #mojo
06:54 dod joined #mojo
07:06 aborazmeh joined #mojo
07:30 CHYC sri: It's coming! :)
07:30 prg joined #mojo
07:34 CHYC It's currently written with backwards compatibility in mind, but the rest of my mind is telling me that the default behaviour should be to take the last given param unless explicitly told otherwise.
07:36 CHYC Also, the tests imply correct behaviour of input(foo => ['', 'bar', ''])->required('foo')->output is {}. To me, when forcing an arrayref in output, I'm not sure what the desired output would be for that.
07:37 CHYC Also, would "->input(foo => [], $MAGIC_FLAG_TO_FORCE_LIST_OUTPUT)->required('foo')->has_error" return true?  What about "foo => ['']" or "foo => ['', 'bar']"?
07:43 trone joined #mojo
07:51 CHYC For me the questions are little easier to answer when backwards compatibility is removed as a requirement, but I'd appreciate some guidance for the cases above.
08:04 Peppard joined #mojo
08:53 vytas joined #mojo
08:58 irqq joined #mojo
09:22 kes joined #mojo
10:51 jeez joined #mojo
11:02 karjala_ joined #mojo
11:03 karjala_ batman, how do you add "LIMIT 20" at the end of your select SQL query, when using Mojo::mysql ($db->select("table_name", undef, {size => 'large'}))
11:03 karjala_ or anyone else, for that matter
11:08 sri not supported
11:08 sri you need SQL::Abstract::Limit for that
11:08 sri CHYC: i guess backwards compatibility is good
11:11 sri empty string has to be filtered out, since form validation will always be the main focus
11:11 sri it's just required
11:15 CHYC sri: Thanks. Filtering out is fine, but then this line, at least to me, should equal { foo => 'bar', bar => 'baz'} https://github.com/kraih/mojo/blob/master/t/mojolicious/validation_lite_app.t#L211
11:17 sri hmm
11:18 sri suppose the assumption there is that you have 3 form elements with the same name and only one is filles oud
11:18 sri *out
11:18 sri but you say they are required
11:19 sri think that's one of the cases i wasn't entirely sure about and requested feedback for back when validation was added, but nobody commented
11:20 sri the behavior is not currently documented i believe
11:21 sri perhaps none of the multi-value handling is documented
11:21 sri "Change validation L</"topic">, apply filters, and make sure a value is present and not an empty string. All filters from L<Mojolicious::Validator/"FILTERS"> are supported."
11:21 sri that leaves a lot of creative freedom
11:22 sri the description of ->required
11:23 CHYC I agree (about the freedom given in the documentation). It does require altering tests which I originally wasn't keen on.
11:24 sri as lomg as you have a good argument why the new behavior is correct it should be fine
11:24 sri s/m/n/
11:25 sri that said, i'm not sure the current behavior is wrong
11:25 sri like i mentioned before, the 3 form elements with same name case makes sense with the current behavior
11:28 sri karjala_: i've actually been thinking about just using SQL::Abstract::Limit in Mojo::Pg, but a module that has not seen a release since 2008 makes me a little nervous :S
11:30 sri it even has hardcoded Class::DBI stuff
11:30 CHYC sri: Point taken.
11:30 purl Hey, give that back!
11:30 sri :)
11:30 karjala_ sri: it has lots of old unresolved bug reports
11:39 itaipu joined #mojo
11:40 haarg it hasn't really gotten much attention since DBIC stopped using it
11:40 sri yea, real shame DBIx::Class doesn't share more
11:42 haarg well, it needed the metadata inside DBIC.  trying to make it more generic wouldn't have worked well.
12:08 Pierre joined #mojo
12:15 Janos joined #mojo
12:23 gizmomathboy joined #mojo
12:41 go|dfish joined #mojo
13:03 Armen goodmorning
13:04 pink_mist hah, managed to fool purl there :P
13:04 pink_mist well done :P
13:04 Armen well, you know, trial and error... ;)
13:05 itaipu joined #mojo
13:07 CHYC joined #mojo
13:10 CHYC_ joined #mojo
13:21 jberger So the hard thing about limit/offset is db attraction
13:21 jberger But Mojo::Pg and Mojo::mysql arent abstract
13:22 jberger In concept the Mojo:: layer could just handle limit/offset there
13:22 Pyritic joined #mojo
13:24 * nic spent at least 3 secs pondering "db attraction" :)
13:26 nic it kind of depends on why you're using limit
13:27 nic if you want just the first, and fetching the other 3 million would be a waste of resources (and perhaps too much for ram) then doing it outside the db makes no sense
13:40 jberger Err yes, thanks autocorrect, *abstraction
13:41 jberger And no, I mean let Mojo::Pg append limit and offset if given
13:41 jberger The pg syntax places it at the end of the query
13:42 jberger I think that's true of mysql as well (though it has been a while now)
13:53 gryphon joined #mojo
14:11 mcsnolte joined #mojo
14:36 Xyem Could you make those functions tappable? $db->select('names', {name => 'Isabell'}, sub { $_ . ' LIMIT 1' })->hash;
14:39 sri jberger: interesting idea
14:41 Xyem Or perhaps a more specific method: $db->subselect({count => 1}, 'names', {name => 'Isabell'}, ...);
14:43 ribasushi sri, jberger: isn't this exactly what I suggested some time ago https://irclog.perlgeek.de/mojo/2017-02-23#i_14152236 ?
14:46 genio sri: SQL::Abstract::Limit is up for adoption.
14:46 genio so, it's unlikely to get updates until someone takes it on
14:48 jnap joined #mojo
14:49 sri jberger: there is FETCH and FOR that can come after LIMIT/OFFSET
14:49 sri if SQL::Abstract added FOR support it would get tricky
14:50 jberger FETCH is just a compatibilty for LIMIT/OFFSET
14:50 sri ye
14:50 mr_sticky joined #mojo
14:50 jberger FOR would be trickier, but that doesn't seem likely to be added to an abstraction layer IMO
14:50 sri FOR is the tricky one, i can actually see SQL::Abstract supporting FOR UPDATE
14:50 jberger really?
14:51 genio well, I say it's up for adoption, but maybe DAVEBAIRD just hasn't removed ADOPTME after taking it on himself?
14:51 jberger what other rdbmses do row level locking?
14:51 genio Grinnz: Any chance of getting a way to save the current search as a URL so we can link directly to a specific perm set in cpanmeta.grinnz.com?
14:53 sri jberger: SELECT FOR UPDATE is part of the SQL standard i think
14:53 jberger per the postgres docs: "Although FOR UPDATE appears in the SQL standard, the standard allows it only as an option of DECLARE CURSOR. PostgreSQL allows it in any SELECT query as well as in sub-SELECTs, but this is an extension. The FOR NO KEY UPDATE, FOR SHARE and FOR KEY SHARE variants, as well as the NOWAIT and SKIP LOCKED options, do not appear in the standard."
14:54 jberger I don't know if others implement that same extension or if the docs are out of date
14:54 sri mysql and ms sql do it too
14:54 sri (as far as i remember)
14:54 * sri googles
14:55 sri oracle too
14:55 jberger hmmm, ok well that would be harder ...
14:56 jberger but again, if you were using ->select(...) are you likely to be locking rows?
14:56 jberger I suppose you could be
14:56 sri in a transaction
14:56 jberger yeah
14:57 jberger speaking of transactions
14:57 jberger I did a thing at $work last week
14:57 jberger we've got this thin-ish model layer over mojo-pg
14:58 sri but yea, i think LIMIT/OFFSET would be much more useful, and prolly worth the risk
14:58 jberger and to do so it has a ->query() method that delegates to grabbing a new db from the pool and running the query on it
14:58 sri so, i guess i would be willing to accept a patch
14:58 jberger and i added support for transactions by letting the model have an attached Mojo::Pg::Transaction object from which it would instead get the db
14:59 jberger which meant I build it and have to un-weaken the db attribute it has :-P
14:59 jberger never had to do that one before :D
15:00 jberger btw, postgres allows placeholders in limit/offset clauses
15:01 jberger so it probably is easier to just append " limit ?" and " offset ?" to the statement
15:01 jberger rather than having to quote things
15:05 ribasushi https://metacpan.org/source/RIBASUSHI/DBIx-Class-0.082840/t/sqlmaker/limit_dialects/torture.t <--- what supports what if there's interest to dig further
15:09 ribasushi + the pod form: https://metacpan.org/pod/distribution/DBIx-Class/lib/DBIx/Class/SQLMaker/LimitDialects.pm#SQL-LIMIT-DIALECTS
15:10 Grinnz genio: i'd like to, but not sure how to do that with the tab-selection fragment i'm using
15:15 PryMar56 joined #mojo
15:16 sri https://github.com/kraih/mojo-pg/compare/limit_offset
15:17 bwf joined #mojo
15:17 sri (i'm not actually pursuing this further, just wanted to see how it would fit in)
15:19 jberger read: if someone else wants to flesh it out further ... someone that would like to see it added ... go ahead
15:19 sri indeed
15:20 gregf_ joined #mojo
15:20 sri suppose it would be cleaner with an options hashref at the end, like the rest of SQL::Abstract
15:21 sri $db->select('crud_test', undef, undef, undef, {limit => 1})->hashes->to_array
15:21 sri $db->select('crud_test', undef, undef, undef, {limit => 1, offset => 1})->hashes->to_array
15:22 sri and more future proof
15:22 jberger wow that RowNumberOver is really awful
15:22 jberger sri: yeah
15:24 ribasushi jberger: rownum is worse: https://metacpan.org/source/RIBASUSHI/DBIx-Class-0.082840/lib/DBIx/Class/SQLMaker/LimitDialects.pm#L267-284
15:24 jberger ribasushi: just saw that :-P
15:24 ribasushi jberger: read the comment I linked, it's... educational.
15:25 jberger indeed
15:25 * sri updates https://github.com/kraih/mojo-pg/compare/limit_offset
15:29 mr_sticky hello everyone, not sure if anyone aware of this but untill Mojolicious 6.32, I was able intercept json handler and like this to make output pretty  app->renderer->add_handler(json => sub { ${ $_[2] } = JSON::XS->new->utf8->pretty(1)->encode($_[3]{json}) });  but now it doesnt seem to work now Mojolicious 7.31.
15:29 mr_sticky i can see in Changes log for 6.33 which reads "- Improved renderer not to require a return value from handlers. " I was wondering if there is any other way of achieving this ?
15:30 mr_sticky not a big issue but still always good to see json pretty :)
15:31 jberger if the major issue is wanting to see it pretty, I recommend jq in the console and "JSON Viewer" chrome extension in the browser
15:32 jberger they are even prettier than JSON::XS's pretty and your mechanized clients don't have to pay a penalty for it
15:33 mr_sticky yeah i mean its plus if its pretty but not big issue but reason i brought it up is that i was updating from 6.25 to 7 so just checking what things have changed or not working anymore
15:34 jberger I'm not certain that what you were doing was ever supposed to work
15:35 jberger the json "handler" isn't a handler actually implemented via the handler system IIRC
15:35 sri was never a documented feature
15:35 sri the features that changed you can read about here https://github.com/kraih/mojo/wiki/Upgrading
15:36 jberger you could for example add a new handler (with a new name) ala http://mojolicious.org/perldoc/Mojolicious/Guides/Rendering#Adding-a-handler-to-generate-binary-data
15:37 jberger and maybe you could even use before_render to snatch a json stash value and use it to call your json_pretty renderer
15:37 jberger s/renderer/handler/
15:38 Xyem Looking through that changes list reminded me.. is Morbo supposed to detect changes to configuration files?
15:39 jberger I don't believe so, not by default at least
15:39 mr_sticky perfect thanks, jberger and sri :)
15:40 jberger mr_sticky: no problem
15:40 karjala joined #mojo
15:40 jberger and do at least play with some of the "client-side" json prettifiers, just to see if perhaps they are a reasonable or even better fit for you
15:42 Xyem It makes sense that it doesn't, with Config being a plugin, wanted to ask while I was reminded :)
15:43 jberger hmmm, a Mojolicious::Plugin::JSONPretty would be easy to do
15:43 jberger add a json_pretty handler and optionally add a before_render hook that would snatch the json and divert it there
15:44 jberger say even from the application config
15:44 jberger that way you could have json_pretty enabled globally during development but then disabled for prod
15:44 Xyem That would be pretty handy.
15:45 Grinnz sri: limit/offset as options looks nice and would be easy to add to Mojo::SQLite as well
15:46 jberger yet another thing I might be willing to write the code for but let someone else write docs/tests and maintain :-P
15:46 jberger I'm totally at this stage of open source contribution, hehe
15:46 Grinnz the big question is the best way to do it, subclass SQL::Abstract or intercept the options or...
15:49 Xyem Or Mojo::SQL?
15:53 Xyem jberger: Morbo doesn't watch the configuration file, but you can tell it to using 'morbo -w app.conf'.
15:54 jberger that's kinda what I meant by "not by default" but its good that you put that out there, I should have
15:55 Xyem Heh, no worries.
15:56 cheako joined #mojo
15:59 prg joined #mojo
16:06 jberger ok so json "handler" comes before user handlers: https://github.com/kraih/mojo/blob/master/lib/Mojolicious/Renderer.pm#L106-L111
16:06 jberger so it couldn't just use the json stash key without having a before_render
16:07 jberger but once you have a before_render (ie to intercept all json calls to the new handler) then you may as well move the data over too
16:14 dod joined #mojo
16:22 jberger https://gist.github.com/jberger/687fff38763e70b6712975f6aea8779c
16:24 disputin joined #mojo
16:33 bpj joined #mojo
16:34 bpj With Mojo::DOM I want to get a collection with all children of an element which are text nodes. Is that even possible?
16:35 bpj Mojo-DOM that is. You know what I mean! :-)
16:35 pink_mist Mojo::DOM was right
16:35 pink_mist Mojo-DOM I have no idea what it is
16:35 bpj I got a smiley insted of ':D'
16:36 pink_mist lol
16:37 Xyem Typical eMoji-In-The-Middle attack..
16:38 pink_mist bpj: did you read the first method name in the documentation for Mojo::DOM?
16:38 Grinnz my $texts = $dom->child_nodes->grep(sub { $_->type eq 'text' })
16:38 pink_mist though, I guess it's not a collection
16:40 bpj Facepalm. I missed that you can chain a grep on child_nodes. Newer mind! Thanks!
16:41 bpj Never
16:41 Grinnz doesn't hurt to ask, there's a lot of functionality in Mojo::DOM and Mojo::Collection
16:41 pink_mist Newer is right as well .. every second :P
16:41 karjala_ I'm beginning to learn systemd - is it possible to use systemd with morbo in foreground mode?
16:42 bpj Yeah, I'm a zen man since the eighties, but that wasn't what I meant right now!
16:42 bpj Bye!
16:42 karjala_ I mean, the fact that morbo doesn't return to the shell, does that matter to systemd?
16:42 bpj left #mojo
16:42 Grinnz karjala_: morbo doesn't have a background mode... but in the same way as for the daemon command, probably
16:42 Grinnz also make sure you set a User= and Group= so it doesn't run as root
16:43 pink_mist ((why use morbo under systemd?))
16:43 Grinnz i have a setup like that tbh, just because i'm too lazy to manage one of our morbo instances manually :P
16:43 karjala_ I'm practicing my systemd skills, so I'm starting with morbo
16:44 Grinnz https://metacpan.org/pod/Mojolicious::Guides::Cookbook#Built-in-web-server
16:45 Grinnz i suppose it's also possible to run "user services" in systemd, but i have no idea how honestly
16:46 mr_sticky @jberger https://gist.github.com/jberger/687fff38763e70b6712975f6aea8779c << many thanks :)
16:46 Grinnz otherwise set User=foo in the [Service] section
16:46 karjala_ I have to install in /etc/systemd/system
16:46 Grinnz it won't be able to bind to port 80/443 of course
16:47 jberger mr_sticky: caveat emptor, I wrote that in like 15 minutes :-P
16:50 mr_sticky yep had to change few things but got it working
16:50 mr_sticky cheers
16:50 Grinnz i'd be happy to put something together for CPAN for json_pretty... with the same backend-sensitive options Mojo::JSON::MaybeXS is using
16:53 mr_sticky this on CPAN is using same thing https://metacpan.org/source/YOWCOW/MojoX-Renderer-JSON-XS-0.07/lib/MojoX/Renderer/JSON/XS.pm
16:53 mr_sticky but it wont be working with latest mojolicious
16:53 Grinnz directly using JSON::XS, ew
16:54 Grinnz better to use Mojo::JSON::MaybeXS than that
16:55 mr_sticky yep whichever you prefer :)
16:55 karjala_ right, and after I created my own-service.service, do I place it in /etc/systemd/system?
16:55 karjala_ (I have fedora)
16:56 Grinnz yes
17:12 tchaves joined #mojo
17:17 karjala_ What's better? To run hypnotoad with the User=apache (or something else) systemd option, or to omit the User= option and use that Mojolicious::Plugin that sets User & Group?
17:17 karjala_ on production server I mean
17:17 Pyritic joined #mojo
17:19 Grinnz either would work unless you need to bind to a privileged port like 80 or 443
17:19 Grinnz (I suggest using an application specific user, not apache)
17:19 karjala_ Why app-specific user, Grinnz ?
17:20 karjala_ And if I run 5 websites on the server, should each run as its own user?
17:20 Grinnz to avoid giving your app and apache access to everything each other owns by default
17:20 Grinnz better separation of privileges
17:20 Grinnz make a common group if they need to access the same data somewhere
17:21 Grinnz and yes i make a new user for each application
17:21 karjala_ Where should the .pid file be if it's running as an app-specific user? It can't be in /var/run as that's owned by root.
17:21 Grinnz unless they're closely related
17:21 karjala_ It can't be in the source code, as that's owned by the person who checked out the code from git
17:22 Grinnz a /var/run/foo subdir can be owned by other users
17:22 karjala_ oh cool
17:22 Grinnz (apache does this, for instance)
17:32 stryx` joined #mojo
17:36 karjala_ joined #mojo
17:45 karjala_ joined #mojo
17:49 karjala_ oh there's an /etc/tmpfiles.d, I'll try there
18:02 irqq joined #mojo
18:16 howitdo joined #mojo
18:33 stryx` joined #mojo
19:04 da5id joined #mojo
19:22 disputin joined #mojo
19:42 [0xAF] joined #mojo
19:43 [0xAF] left #mojo
19:43 stryx` joined #mojo
19:47 [0xAF] joined #mojo
19:47 [0xAF] Good evening to all.
19:48 [0xAF] I'm just trying Convos and planing to stay for "awhile"
19:49 Grinnz http://s2.quickmeme.com/img/1a/1a9986b077fb0cb0a6036e2e3bf9db424c36be718e465bd3caf9b65c2cdf02e5.jpg
19:49 [0xAF] Grinnz: thanks :)
19:49 Bloke joined #mojo
19:58 punter joined #mojo
20:06 Pyritic joined #mojo
20:39 Bloke Howcome hypnotoad doesn't take a bundle of arguments like morbo does?
20:40 jberger Bloke: the way it works, it can't do that
20:40 jberger because of the hot reloading
20:40 jberger if you'd rather have arguments and can live without hot reload then use the prefork server
20:41 * Bloke goes to write a config file
20:44 sri hmm
20:45 sri i wonder if basic "LIMIT ? OFFSET ?" would get accepted into SQL::Abstract
20:45 sri considering that postgres, mysql and sqlite support the syntax these days
20:45 Grinnz sri: doesn't work in mysql, for one
20:45 sri i think it does
20:46 Grinnz ah, it does now
20:46 sri https://dev.mysql.com/doc/refman/5.7/en/select.html
20:46 stryx` joined #mojo
20:46 genio Is there anything "wrong" with SQL::Abstract::Limit other than that it's old?  If there is something that needs to be done, I'll take on maintenance if it's minimal
20:47 Grinnz looks like its worked in mysql for quite some time, wonder what sql i'm thinking of
20:47 punter I hope SQL::Abstract accepts it
20:48 Grinnz heh, maybe it was SphinxQL (sphinxsearch's mysql subset)
20:48 Grinnz seems to only support LIMIT ?, ?
20:50 pink_mist genio: from what I've seen in the backlog here, ::Limit hardcodes DBIC stuff and depends on access to DBIC to work, so I doubt it's minimal to untangle that
20:50 genio eww. nevermind
20:51 Grinnz https://metacpan.org/pod/SQL::Abstract::Limit#LimitYX seems wholly incorrect also. if you use the ?, ? syntax in SQLite, it's $offset, $rows just like in any other sql
20:52 Grinnz (aka the LimitXY just above)
20:53 Grinnz $offset, $rows seems to be unique to mysql and slite
20:53 Grinnz sqlite*
20:54 Grinnz both of those also support $rows OFFSET $offset, but not sure how far back
20:54 * sri asks #dbix-class
20:57 Grinnz MSSQL and oracle are of course the big two that don't support anything of the like
20:58 punter maybe SQL::Abstract could allow you to append a suffix somehow
20:58 punter like " LIMIT 10 OFFSET 20"
20:58 sri don't go there
20:58 sri that's silly
20:59 Grinnz according to stackoverflow answers, recent versions of MSSQL and Oracle have both added "OFFSET $offset ROWS FETCH NEXT $rows ROWS ONLY"
20:59 sri you're designing yourself into a corner that way, in many SQL dialects LIMIT/OFFSET is not the end
21:01 Grinnz right, for instance mysql has PROCEDURE, INTO OUTFILE, FOR UPDATE, and LOCK IN SHARE MODE which all come after LIMIT
21:01 sri (note that i'm not saying having injection points for raw SQL is necessarily bad, like "append this SQL after this list of keywords")
21:01 sri that could be a way to make SQL::Abstract more hackable
21:02 sri but it would have to be done very carefully
21:03 Grinnz https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1 and https://msdn.microsoft.com/en-us/library/ms188385(SQL.110).aspx
21:03 Grinnz seems those require an ORDER BY, though
21:06 cheako joined #mojo
21:06 nic having a limit without and order by is... strange
21:07 cheako joined #mojo
21:07 Grinnz perhaps, but sometimes you don't care which results you get, just that you don't get too many
21:08 Grinnz and ORDER BY RAND() or equivalent is still more intensive than ORDER BY whatever_index_it_happened_to_pick
21:08 nic yeah, as a kind of "This should never happen but just in case..."
21:08 nic ordering by a function is always going to be rough
21:10 nic I've never understood why oracle makes you do the crazy dance in that situation
21:11 genio oracle is just a big bag of crazy
21:12 nic it seems to bend over backwards to make your life harder
21:12 Grinnz their business model is selling support contracts, so...
21:13 genio at least they finally fixed the whole case-insensitive password thing. and oddities like 4 and $ being the same thing in your password
21:15 Grinnz i don't even want to know
21:16 * genio luckily got to quit dealing with Oracle right after they fixed that fun
21:16 genio my current hatred is merge into syntax for SQL SERVER
21:17 Grinnz i suspect if i had to use Oracle or SQL Server i'd have extensive documents for them similar to https://grinnz.com/stuff/lolmysql.txt
21:20 nic I'm guessing a fair few of those are out of date
21:20 Grinnz only the ones that say "until mysql x.y.z"
21:20 Grinnz otherwise I am still dealing with most of them on a daily basis
21:21 nic Your bit on temp tables makes it sound crazy, when the reality makes sense
21:21 Grinnz well, statement-based replication is what's crazy in that case
21:26 nic I love mixed-mode replication, but that's at the heart of why I don't tolerate limits without orderings :)
21:29 disputin joined #mojo
21:29 Grinnz my solution was to stop using temp tables
21:31 Grinnz we have a norep_* prefix to avoid replication for temp tables, but that of course breaks replication if any DDL statements reference them
21:31 Grinnz i think we're moving to row-based anyway, as that's what AWS aurora supports
21:34 Grinnz sri: could always release a SQL::Abstract subclass that only does LIMIT ? OFFSET ? and OFFSET ? ROWS FETCH NEXT ? ROWS ONLY, but i wouldn't know where to start with testing dbs other than sqlite :P
22:48 inokenty joined #mojo
22:49 disputin joined #mojo
22:59 maschine joined #mojo
23:14 Pierre joined #mojo
23:25 disputin joined #mojo
23:58 noganex joined #mojo

| Channels | #mojo index | Today | | Search | Google Search | Plain-Text | summary