00:05:48 | * | gmpreussner quit (Ping timeout: 240 seconds) |
00:07:02 | * | gmpreussner joined #nim |
00:16:40 | FromGitter | <nitely> Araq: docs for things exported with `export thing` are not generated. May be it's intended? |
00:18:20 | * | endragor joined #nim |
00:21:25 | Araq | varriount: It's not ugly, 'random' is deprecated, 'rand' is the new thing |
00:22:53 | * | endragor quit (Ping timeout: 256 seconds) |
00:25:05 | FromGitter | <zacharycarter> @raydf I'd love to do more web dev in karax, unfortunately at work I'm stuck using react :/ and I'm currently not involved in building any mobile apps |
00:25:59 | FromGitter | <zacharycarter> I need to build a more complex app with karax - I think it's really a great library and I think there could be an ecosystem built around it, assuming enough people were to use it |
00:27:06 | dom96 | radagast: further to zacharycarter's message: ...and if PRs are too much, issues would be great too :) |
00:29:15 | FromGitter | <nitely> awr: if docs for `export some` were generated, then you could have a main module that exports the public API, but that's not the case |
00:30:11 | radagast | I'm thinking of creating an unofficial gitbook/wikibook about basic Nim. I have spare time of a few months. This might be a good learning experience for me. |
00:33:10 | FromGitter | <zacharycarter> could you elaborate on where you're finding friction in learning the language? |
00:33:17 | FromGitter | <zacharycarter> or certain features? |
00:34:11 | FromGitter | <zacharycarter> if anything needs more documentation in Nim - I think it's advanced, low level / unsafe features as well as multi-threading, parallelism, async, etc... |
00:34:45 | FromGitter | <zacharycarter> and some advanced examples of the above mentioned features would be wonderful as well |
00:37:38 | GitDisc | <awr> nitely: The `export x` appears to do what I want |
00:38:33 | GitDisc | <awr> but, as you said its not certain if this is how `export` is meant to work |
00:40:16 | radagast | @zachary, regarding advanced topics like low level/unsafe --best place to contribute is to the manual itself. There are a few non-stable constructs like concepts that need a bit more explaining. However, what I want to achieve is a different approach to introduce Nim to beginners. |
00:41:45 | radagast | The presentation of the manual is a little bit.... complicated. I want to take a different approach, that's all. |
00:43:05 | GitDisc | <awr> I recall seeing a few months back that someone wanted to make a video tutorial series for Nim. |
00:43:34 | FromGitter | <zacharycarter> I wish there were less video tutorials for programming and more text based tutorials |
00:43:36 | GitDisc | <awr> I know videos are not everyone's preferred educational medium, but I like them |
00:43:44 | FromGitter | <zacharycarter> :P |
00:45:41 | radagast | To be honest, visual method of teaching can be more effective. But alas, it requires more effort. |
00:47:03 | FromGitter | <nitely> awr: yeah, using export to avoid the doc generation is certainly a hack |
00:47:42 | FromGitter | <nitely> plus, it's unclear to me if the no docs for exports are intended behaviour |
00:50:01 | * | SenasOzys quit (Read error: Connection reset by peer) |
00:50:35 | * | SenasOzys joined #nim |
01:25:47 | * | vlad1777d quit (Ping timeout: 256 seconds) |
01:32:37 | FromGitter | <zetashift> @radagast there is also http://nim-cookbook.btbytes.com/ where you can add some code samples |
01:46:14 | FromGitter | <mratsim> The manual is not a tutorial, more of a reference book. |
01:47:30 | FromGitter | <mratsim> Personally I find video tutorials really cumbersome, it's too slow, and you can't control + F. |
01:50:39 | FromGitter | <mratsim> Targeted tutorials/recipes (Nim for frontend web, Nim for IO, Nim for networking, Nim for games, Nim for science) might be helpful. |
01:59:16 | FromGitter | <zacharycarter> +1 |
02:11:31 | * | endragor joined #nim |
02:32:28 | * | chemist69 quit (Ping timeout: 240 seconds) |
02:40:04 | * | skrylar joined #nim |
02:46:27 | * | chemist69 joined #nim |
02:55:04 | * | dddddd quit (Remote host closed the connection) |
03:44:51 | * | marenz__ joined #nim |
03:47:58 | * | Snircle quit (Quit: Textual IRC Client: www.textualapp.com) |
03:49:10 | * | marenz_ quit (Ping timeout: 272 seconds) |
03:52:38 | * | astronavt joined #nim |
04:26:24 | FromGitter | <Varriount> @mratsim My project this month is going to be compiling how-to articles on Nim, for the website. |
04:26:56 | FromGitter | <mratsim> |
04:37:33 | * | marenz__ quit (Ping timeout: 264 seconds) |
04:39:01 | * | astronavt quit (Remote host closed the connection) |
04:47:56 | skrylar | do any nimmers actually use stuff like Dash and Zeal |
04:52:35 | FromGitter | <mratsim> I dowloaded Dash since someone put nim docs in a compatible format, it was a dropbox link though |
04:53:14 | FromGitter | <mratsim> @dom96 @Araq, Nim readme still mentions Gratipay even though it closed down. https://gratipay.com/ |
04:54:18 | * | nitely joined #nim |
04:54:29 | skrylar | mratsim, varriount: https://github.com/Skrylar/sksbox woot |
04:56:14 | * | nitely quit (Client Quit) |
04:58:24 | FromGitter | <mratsim> have to play with it vs msg pack, protobuf et al |
04:59:00 | skrylar | its not a replacement for those things |
04:59:16 | FromGitter | <mratsim> the apartment besides mine, took full fire 2 hours ago, and I can’t sleep :/ |
04:59:24 | skrylar | '_' |
04:59:59 | skrylar | in a non impending fire danger sense, sbox is more a solution to glTF's problem of "We used json but have this inconvenient buffer of floats lying around" |
05:00:20 | skrylar | it's sort of zip-esque in that it just deals with key/values and you shove blobs there |
05:00:33 | FromGitter | <mratsim> it has been extinguished, but it smells. |
05:01:01 | skrylar | msgpack is quite nice though |
05:01:16 | skrylar | i haven't tested the module someone wrote. i did write a bson module, but never did the final polishes on it |
05:01:49 | skrylar | on the fence about trying to have msgpack with an optional pre-schema, or just biting it and writing an avros adapter |
05:02:38 | skrylar | avros is already 50% json, so that would just sit back on the json code we already have. the binary version would take a little work, but it 1) hooks in to Apache Spark and al ltheir big data shit and 2) also solves the problem of "i need to do a lot of rpc and already know the schema" |
05:06:50 | skrylar | bleh nimble is still giving protocol errors |
06:01:52 | FromGitter | <mratsim> Avro seems quite nice, I didn’t check it out until now (though I’ve looked into Thrift, Bson, etc). I like Cap’n Proto cerealization homepage too: https://capnproto.org/language.html |
06:02:33 | FromGitter | <mratsim> Seems like Avro can use either no compression, zlib or Snappy too |
06:02:39 | FromGitter | <mratsim> huhu maybe I have a winner |
06:05:47 | FromGitter | <mratsim> https://github.com/thekvs/cpp-serializers |
06:06:54 | FromGitter | <mratsim> and: https://eng.uber.com/trip-data-squeeze/ |
06:31:48 | * | yglukhov joined #nim |
06:35:25 | * | nsf joined #nim |
07:33:33 | * | solitudesf joined #nim |
07:37:44 | * | Vladar joined #nim |
07:41:29 | skrylar | doesn't any serialization method "support" compression |
07:46:08 | * | gmpreussner quit (Ping timeout: 240 seconds) |
07:46:45 | skrylar | mratsim: sounds like that page is saying capnproto is the best ever |
07:49:21 | * | gmpreussner joined #nim |
07:49:47 | FromGitter | <alehander42> "infinitely faster" and I thought light speed travel was just a dream |
07:49:50 | skrylar | serializers are awkward to compare, imho. it really depends on your goals |
07:51:04 | skrylar | schemaless is great for throwaway scripts and prototypes, schema compiled is great for real-time wire stuff, schema-stored is apparently best for long-term document life (ex. "can i open this ten year old blender file?") |
07:54:11 | skrylar | will take a look at capnproto's spec tho |
08:04:26 | skrylar | some of the optimizations these things make don't work super well in nim |
08:04:55 | skrylar | afaik we don't really have a common-use slice mechanic, so you can't just hand out slices to the giant buffer instead of copying out strings |
08:11:23 | * | Lord_Nightmare2 joined #nim |
08:14:53 | * | Lord_Nightmare quit (Ping timeout: 255 seconds) |
08:14:53 | * | Lord_Nightmare2 is now known as Lord_Nightmare |
08:16:42 | * | vlad1777d joined #nim |
08:19:20 | skrylar | blegh. capnproto's official spec doesn't say what the offset allocations are |
08:24:32 | * | claudiuinberlin joined #nim |
08:28:50 | skrylar | https://github.com/zielmicha/capnp.nim hm |
08:56:36 | * | floppydh joined #nim |
08:57:17 | skrylar | hoboy. interesting blog post on someone saying the way capnproto allocates space apparently also works for livecoding |
09:03:59 | * | gmpreussner quit (Ping timeout: 248 seconds) |
09:05:24 | * | gmpreussner joined #nim |
09:19:42 | skrylar | http://cbor.io/ neat. |
09:21:56 | * | xkapastel quit (Quit: Connection closed for inactivity) |
09:24:12 | * | chemist69 quit (Ping timeout: 272 seconds) |
09:25:16 | * | solitudesf quit (Ping timeout: 265 seconds) |
09:36:54 | FromGitter | <raydf> @zacharycarter. Look in this gist: https://gist.github.com/raydf/5e428c8e275cde6a01905b7dd9a26840. I tried to translate: ⏎ ⏎ ```code paste, see link``` ⏎ ⏎ The problem is for my little understanding of the transpilation/compilation process of nim to js i couldn't find a way to pass the parameters to the nim method that is a callback on success or on error of the barcode scanner. This is the normal behaviour of |
09:36:54 | FromGitter | ... all cordova plugins (to use callbacks). What i'm doing right now is using proxy functions without parameters that call the javascript code for the plugin, using global objects for exchanging the messages/properties. ... [https://gitter.im/nim-lang/Nim?at=5a3397b61a4e6c8223107555] |
09:37:52 | * | chemist69 joined #nim |
09:41:47 | * | arnetheduck joined #nim |
09:43:36 | * | Arrrr joined #nim |
09:43:36 | * | Arrrr quit (Changing host) |
09:43:36 | * | Arrrr joined #nim |
09:44:47 | * | Ven` joined #nim |
09:48:49 | * | PMunch joined #nim |
09:49:41 | Arrrr | Good improvements to random. I think a rand(Enum) would be useful too, i use this a lot. |
09:52:48 | Araq | rand(ValueA..ValueB) should work |
09:52:58 | Araq | but probably I got the generic wrong :P |
09:54:16 | Arrrr | It should create a const array to take into consideration enums with holes |
09:58:49 | Araq | I'll remove enums with holes instead ;-) |
09:58:54 | Araq | hate that feature, it's stupid |
09:59:23 | Araq | enums should be simply, enums with holes are not "enumerable" at all |
09:59:27 | Araq | *simple |
10:02:35 | * | gokr joined #nim |
10:03:19 | Arrrr | Yes, you can always use a custom array to give enums custom int values |
10:10:19 | Araq | I introduced this feature for easier C interop but 'distinct' didn't exist back then |
10:10:49 | Araq | I wonder if we really should deprecate it |
10:11:12 | Araq | makes Nim's core more complex and v0.18 is the big breaking release |
10:17:44 | skrylar | forcing people to jump through hoops sounds like the opposite of double plus good |
10:18:41 | PMunch | I like enums with holes :( |
10:20:32 | * | NimBot joined #nim |
10:20:57 | Araq | PMunch, you could use a distinct int instead |
10:21:12 | PMunch | Yeah, but then I don't get automatic enumeration |
10:21:21 | skrylar | or prefixed names |
10:21:27 | skrylar | ErrorCode.ItBroke |
10:21:31 | PMunch | I could also use separate enums, but then the compiler won't warn me of overlapping series |
10:22:15 | Araq | skrylar, for prefixed names you can move it to its own module |
10:22:28 | skrylar | i'm confused here as to whether there is a legitimate problem with enums and holes or if araq is just having an anneurism over entropy |
10:22:36 | PMunch | Take this for example: https://github.com/Tomas-M/xlunch/blob/master/xlunch.c#L104 It's C code but the idea is the same |
10:23:00 | skrylar | also fun with "import fooberrors" |
10:23:11 | Arrrr | So why do you need holes for that |
10:23:35 | Araq | PMunch, all I see is an C enum with pointless arbitrary values in between them for coolness |
10:23:58 | PMunch | So that people can do retval & mask to determine which kind of return value it is |
10:24:30 | Arrrr | burn it with fire |
10:24:36 | PMunch | Haha :P |
10:24:49 | PMunch | I guess I could create a macro for it in Nim.. |
10:25:58 | Araq | what is an "anneurism over entropy"? |
10:26:41 | * | vlad1777d quit (Ping timeout: 248 seconds) |
10:27:38 | PMunch | Arrrr, what don't you like about it? Makes sure that I can add more exit codes and old code can still work as the masks doesn't change :) |
10:29:31 | skrylar | Araq, shannon entropy increases when more probabilities exist |
10:29:44 | Arrrr | I think you can use procs for that behavior instead of casting enum to int |
10:30:01 | skrylar | if the sole reason to get rid of something is "because it takes code that already exists" == just pissing around with entropy at that point |
10:30:08 | skrylar | if its like, some crushing maintenence burden... maybe |
10:30:13 | Araq | I learn from the languages I don't like too. |
10:30:58 | Araq | in this case it's Golang's "a feature we lack cannot break" |
10:31:03 | PMunch | Arrrr, of course there are different ways of doing it. But this one is nice and simple, provides me some compiler protection, and is pretty clear when looking at the source |
10:31:28 | Araq | skrylar, wanna bet how many bugs are open wrt enums with holes? |
10:31:47 | Arrrr | Well, is clear if you have C experience. I think a specific proc for that behavior is more clear. |
10:32:17 | Araq | it's ok, I won't touch enums with holes. for now. |
10:32:24 | skrylar | Araq, seven multiplied by the inverse root of splorb. |
10:32:42 | * | PMunch rejoices! |
10:33:42 | PMunch | Arrrr, a simple table of return codes. Maybe throw in a small comment about the masking stuff. How much clearer can it get? |
10:35:23 | Arrrr | A real table called "ExitMask" |
10:40:49 | * | dddddd joined #nim |
11:02:11 | FromGitter | <mratsim> The enum are OK as is, some libs would be much harder to wrap otherwise like this one which uses negative values: https://github.com/mratsim/Arraymancer/blob/master/src/tensor/backend/blis_api.nim. I'm pretty sure the Neverwinter Nights code also uses heavily enum with holes. And we already had questions about enum having to have 0 in reddit and in the issue tracker. |
11:03:04 | Araq | of course now that the feature exists people appreciate it and like to keep it |
11:03:25 | Araq | that's why it's so important to not introduce features in the first place... :P |
11:06:59 | Araq | nimble install gtk2 |
11:06:59 | Araq | Downloading https://github.com/nim-lang/gtk2 using git |
11:06:59 | Araq | Warning: Package 'gtk2' has an incorrect structure. The top level of the package source directory should contain at most one module, named 'gtk2.nim', but a file named 'atk.nim' was found. This will be an error in the future. |
11:07:12 | Araq | is there a single package that DOES NOT produce this warning? |
11:07:51 | Araq | if nothing adheres to the scheme we came up, maybe the scheme is wrong... |
11:07:53 | euantor | I think my packages don't show it, but they're pretty simple |
11:09:06 | Araq | maybe Nimble needs to get smarter, 'tests' and 'example' directories don't have to be listed as excluded dirs |
11:12:53 | Araq | euantor, now that I understand the problem my own new packages are free of these warnings too |
11:13:20 | Araq | but package managers need to get out of my way :P |
11:13:40 | dom96 | It is getting out of your way, that's why it's a warning |
11:14:02 | euantor | The problem is introducing it as an afterthought when there are already many packages and conventions |
11:15:01 | * | Ven` quit (Quit: My MacBook has gone to sleep. ZZZzzz…) |
11:16:39 | dom96 | I guess we need to get back to discussing this in https://github.com/nim-lang/Nim/issues/6700 |
11:17:10 | dom96 | We're discussing two things there now :\ |
11:20:44 | euantor | yep, that discussion kind of fell into another discussion |
11:23:48 | FromGitter | <mratsim> The zip package (or untar?) also has an incorrect structure. |
11:27:41 | * | Ven` joined #nim |
11:29:01 | * | Ven` quit (Client Quit) |
11:40:06 | PMunch | Arrrr, that wouldn't give you the compile-time check though.. |
11:40:47 | PMunch | And yeah the nimble package structure is a bit weird.. |
11:44:14 | skrylar | i keep having issues with nimble publish crapping out |
11:54:18 | Arrrr | Why do you need the compile-time check? to avoid repeating values? You can do this: https://play.nim-lang.org/?gist=f25c547a50842ab1867f610fe152ae8c |
11:58:41 | PMunch | But then I have to write out each of the values.. |
12:00:18 | PMunch | It's not a huge thing, just a minor convenience :) |
12:01:06 | skrylar | probably a good time to learn jenkins if stuff is going to break again |
12:01:09 | Arrrr | Yes, but i think is better for many procs to avoid caring about holes in enums |
12:06:29 | FromGitter | <Yardanico> https://pineapplefund.org :P |
12:07:29 | Araq | dom96, the problem with the warning is the "this will be an error in the future" part |
12:12:47 | Araq | Error: ambiguous identifier: 'on' --use system.on or events.on :-/ |
12:13:46 | Araq | ambiguous identifier: 'any' --use system.any or pegs.any |
12:18:45 | * | nc-x joined #nim |
12:22:28 | nc-x | Araq: Why does https://github.com/nim-lang/Nim/blob/02ff5f596c330b68927f843814ecb9b86c2eee67/compiler/nimblecmd.nim#L60 simply parse the path and take whatever is after a `-` as the version number? Shouldn't it read the version from the *.nimble file? I am asking this because I just downloaded the nimx repo as zip. Running nake fails with `Error: unhandled exception: len(ver) == 0 or contains({0, 35, 48..57}, ver[0]) Wrong version: master |
12:22:37 | nc-x | because it reads the wrong version number |
12:23:20 | Araq | the compiler doesn't process .nimble files |
12:23:25 | nc-x | Changing the folder name to have a number after the `-` works though. |
12:23:47 | nc-x | Araq: I mean why not just parse the *.nimble file to read the version info? |
12:23:52 | * | skrylar quit (Quit: Leaving) |
12:24:03 | Araq | because the compiler is not nimble? |
12:25:08 | nc-x | But nimble or not nimble, the version number of the project would remain same, no? But currently the compiler uses the path of the folder to detect the version number (atleast when `--nimblepath` is used) |
12:25:46 | Araq | that's how nimble works ... it installs packages into foo-$version |
12:26:05 | dom96 | if you want to add nimx to your path then uust use --path |
12:26:07 | dom96 | *just |
12:26:18 | Araq | why do we need to support invalid package names? |
12:26:21 | dom96 | or use nimble to install like everyone else :) |
12:26:43 | * | Snircle joined #nim |
12:26:54 | Araq | dom96, can you confirm that 'nimble develop foo' git clones foo? |
12:27:03 | dom96 | yes |
12:27:14 | nc-x | But what if i have downloaded a local package from github, maybe for changing the source code and using `nimble develop`? I should not be manually required to change the folder name to include the version number |
12:27:27 | Araq | can we get an alias for this? 'nimble clone' would make it more obvious |
12:27:59 | Araq | a local package wouldn't have the name foo-master. |
12:28:12 | Araq | as that it is not a valid pacakage name |
12:28:34 | Araq | ok, if it is no package ... but then why add it to your $nimbledir? |
12:28:39 | dom96 | nc-x: if you 'cd' into that directory and run 'nimble develop' then it shouldn't be a problem. |
12:28:55 | dom96 | Araq: I guess... |
12:29:38 | dom96 | but then ``nimble clone`` in a package's directory will be odd |
12:29:47 | dom96 | as it won't actually clone |
12:30:06 | Araq | alright, fair enough |
12:30:27 | nc-x | @nc-x "if you 'cd' into that directory and run 'nimble develop' then it shouldn't be a problem." -> Thats what i did. |
12:30:33 | dom96 | `nimble develop` mirrors `nimble install` pretty well. |
12:31:16 | * | Trustable joined #nim |
12:31:19 | dom96 | nc-x: I see. I would consider that a bug then. |
12:31:30 | dom96 | Report it on Nimble's repo though |
12:32:12 | nc-x | Araq: What if the "VALID" package name is in a folder name which has a `-`? say "C:/abc-def/package". Now it reads the version as `def/package` |
12:32:26 | dom96 | hrm, I see the issue now |
12:32:37 | dom96 | Nim uses the same logic for 'develop' linked packages |
12:32:54 | dom96 | maybe this is a Nim bug after all |
12:32:58 | nc-x | IMHO, the version should be parsed from the *.nimble files even if the nim compiler is used. |
12:33:45 | nc-x | or maybe some other logic, where nim and nimble find the same and correct version number. |
12:33:56 | dom96 | This would tie Nimble to the compiler too much |
12:34:44 | nc-x | Well, after seeing the effectiveness of rust and cargo, I would love if nimble and the compiler are tied together. |
12:34:45 | * | marenz__ joined #nim |
12:35:00 | dom96 | Does Rust read cargo files? |
12:36:04 | dom96 | It doesn't seem like it |
12:36:05 | dom96 | http://doc.crates.io/environment-variables.html |
12:36:12 | nc-x | Most probably not, but in the Rust community, use of rustc is discouraged and usage of cargo is encouraged everywhere. |
12:36:17 | dom96 | It seems that cargo passes this information via environment variables. |
12:36:40 | dom96 | Yeah, so perhaps we should move in that direction instead? |
12:36:55 | Araq | I don't want Cargo, thanks. |
12:37:15 | nc-x | Well, *most* people would love to. |
12:38:10 | nc-x | Anyway, is this a bug? If yes, in which repo should i open the Issue? |
12:38:33 | Araq | last time I checked Cargo it didn't solve any of my problems, Nimble gets a decent 8/10 score |
12:38:34 | dom96 | Open it in the Nimble repo. I'll figure out whether I should touch Nim code or not so as to not trigger Araq :) |
12:39:02 | dom96 | I must be going now |
12:39:08 | dom96 | bbl |
12:39:52 | nc-x | IMHO, one place where nimble shines is `tasks`. But using cargo for every project does make simple things even more simpler. |
12:40:17 | nc-x | dom96: Okay, will open the issue in the nimble repo. |
12:40:46 | FromGitter | <dom96> Oh and btw. Using nimble instead of Nim is a workaround for your issue here. |
12:41:02 | FromGitter | <dom96> So do try it and let me know what the pain points are with that. |
12:47:56 | nc-x | dom96: using `nimble develop nimx` or manually downloading nimx and doing `nimble develop` works fine. But only if the path does not contain any `-`. Or if `-` is followed by a number. So this is in fact a nim bug when `--NimblePath` is used. |
12:48:08 | nc-x | Still i will create the issue in nimble repo with an example |
12:50:07 | Araq | probably there is a simple bug in the compiler when it comes to dash handling |
12:54:20 | Araq | but that doesn't mean 'nimx-master' is a valid package name. and when the package name is invalid, how could I read its .nimble file to figure out the version? |
12:55:33 | nc-x | dom96: https://github.com/nim-lang/nimble/issues/439 |
12:56:02 | nc-x | Araq: See the above issue. The package name is valid, the folder in which the package is stored is not. |
12:56:37 | nc-x | Maybe this could be fixed atleast. Have to agree about the invalid package name though. |
12:57:20 | Araq | yeah, that is just a bug |
12:57:30 | Araq | doesn't seem to be hard to fix |
12:58:17 | nc-x | and for the invalid package name case also, I would love to have an error that says that the package name is invalid, rather than an assertion failure which says the version is incorrect. |
12:58:35 | Araq | pfff details :P |
13:01:07 | nc-x | Should i add the `invalid package name` case to the *same issue* so that I could get a lovely error in that case? Or should I open a new Issue (this time in the Nim repo) |
13:01:33 | * | PMunch quit (Quit: Leaving) |
13:01:44 | * | PMunch joined #nim |
13:09:10 | nc-x | Updated the same issue for now. |
13:09:14 | * | nc-x quit (Quit: Page closed) |
13:14:00 | * | Ven` joined #nim |
13:23:22 | * | sleepyqt joined #nim |
13:24:20 | radagast | Do all objecs inherit from RootObj? |
13:27:41 | Araq | no, only the ones which are declared to inherit from it |
13:35:52 | * | natrys joined #nim |
13:42:54 | fvs | pointer parameters in procs - these are mutable by their nature, right? So no need to declare with "var"? |
13:43:22 | * | gokr quit (Ping timeout: 265 seconds) |
13:45:39 | * | solitudesf joined #nim |
13:46:03 | fvs | proc(lyr: pointer) = lyr.reset |
13:46:11 | FromGitter | <mratsim> var is needed if you want to modify the pointer |
13:46:39 | FromGitter | <mratsim> Var is not needed to modify the object pointed to (it's shallow immutability) |
13:47:33 | FromGitter | <mratsim> Still several people (including me) prefer that as long as there is a modification, var is used because it conveys intent. |
13:48:58 | fvs | gotcha, thanks |
13:49:10 | FromGitter | <mratsim> Well for pure pointer I don't follow that rule though, only for ref object. |
13:53:45 | Araq | that breaks subtyping :P |
13:55:53 | * | Arrrr quit (Read error: Connection reset by peer) |
14:00:16 | * | Jesin quit (Quit: Leaving) |
14:14:03 | * | Ven` quit (Quit: My MacBook has gone to sleep. ZZZzzz…) |
14:19:53 | * | drs left #nim (#nim) |
14:20:01 | * | Ven` joined #nim |
14:33:50 | * | floppydh quit (Quit: WeeChat 1.9.1) |
14:36:10 | * | foo_ joined #nim |
14:36:38 | foo_ | hello? |
14:37:16 | PMunch | Hi? |
14:38:00 | foo_ | oh cool, I was just seeing how active the channel is since sometimes I get on irc and there are 100+ nicks and nobody actually there |
14:38:16 | PMunch | Oh right |
14:38:35 | PMunch | This channel is pretty active, at least if someone asks a question or suggests something :) |
14:38:46 | foo_ | I'm about to jump into learning nim so I wanted to see if this would be a viable resource |
14:38:49 | foo_ | awesome |
14:39:21 | PMunch | Most definitely, when I was learning Nim this channel was incredibly valuable |
14:39:45 | PMunch | We of course prefer if you at least Google things first though :P |
14:40:29 | foo_ | yeah I will, I usually spend far too long trying to figure things out before asking anybody(often to my own detriment) but I wanted to be sure I had somewhere to turn if I need it |
14:41:27 | foo_ | anyway, that's all for now really, I have to go but I wanted to check on this before I leave for the day |
14:41:40 | foo_ | nice meeting you |
14:43:04 | PMunch | Hope to see you around :) |
14:43:27 | Araq | hey, foo_ you're welcome |
14:47:37 | * | foo_ quit (Ping timeout: 256 seconds) |
14:48:08 | * | gokr joined #nim |
14:49:38 | FromGitter | <zacharycarter> Does anyone have any good resources for learning multi threading programming using low level primitives like Nim features? Even like a C resource or something would probably be useful to me. |
14:51:06 | radagast | I'm very pleased with the nice sugar for generic type constraints. However, how does a Nim programmer emulate template specialization of C++? |
14:51:11 | PMunch | dom96's book talks a bit about it I think |
14:51:17 | radagast | Oh wait, I can just overload |
14:51:21 | radagast | nvm |
14:51:35 | flyx | the slides from my professor's Real-Time Programming lecture give a good overview, but unfortunately I cannot hand them out :/ |
14:52:06 | FromGitter | <mratsim> @zacharycarter Dom book? :P |
14:52:46 | FromGitter | <zacharycarter> I didn't think dom's book went into too much detail on it but I'll have to go through my copy again tonight |
14:53:04 | FromGitter | <mratsim> There is the channel part. |
14:54:53 | FromGitter | <mratsim> Otherwise you can look at Intel TBB (threads building blocks) the doc is not bad, it's for task based parallelism. (Or OpenMP for data parallelism) |
14:55:41 | FromGitter | <mratsim> Start a threadpool, and assign stuff to threads basically. |
14:57:14 | FromGitter | <mratsim> Maybe check C++11 native threads/threadpool tutorials |
14:58:11 | FromGitter | <zacharycarter> thanks @mratsim I'll give those resources a look over as well |
15:00:09 | * | endragor quit (Remote host closed the connection) |
15:00:29 | * | Ven` quit (Ping timeout: 272 seconds) |
15:14:45 | * | yglukhov quit (Remote host closed the connection) |
15:23:26 | * | BitPuffin|osx joined #nim |
15:30:27 | * | yglukhov joined #nim |
15:30:49 | fvs | wrapping some c that includes: char** src |
15:31:04 | fvs | in nim, is this: ptr cstring? |
15:31:20 | fvs | howto get the string in src: src[]? |
15:32:12 | * | Sentreen quit (Remote host closed the connection) |
15:32:36 | flyx | fvs: no, just use cstring |
15:32:37 | flyx | ah wait |
15:32:38 | flyx | double ptr |
15:33:02 | flyx | src[] with ptr cstring should work |
15:33:44 | * | Sentreen joined #nim |
15:34:36 | flyx | depending on the use-case, I think a `var cstring` param could be used instead |
15:35:28 | Araq | cstringArray |
15:36:01 | * | Sentreen quit (Client Quit) |
15:37:10 | * | yglukhov quit (Remote host closed the connection) |
15:39:33 | * | yglukhov joined #nim |
15:41:00 | * | yglukhov quit (Remote host closed the connection) |
15:41:56 | * | SenasOzys quit (Remote host closed the connection) |
15:43:56 | * | arecaceae quit (Remote host closed the connection) |
15:44:15 | * | arecaceae joined #nim |
15:45:48 | * | Jesin joined #nim |
15:45:50 | * | yglukhov joined #nim |
15:49:00 | dom96 | The parallelism chapter of my book, I dare say, is one of the best :) |
15:50:10 | * | yglukhov quit (Remote host closed the connection) |
15:51:27 | FromGitter | <Yardanico> Always happy when I see something like this |
15:51:36 | FromGitter | <Yardanico> (https://files.gitter.im/nim-lang/Nim/QF5I/image.png) |
15:56:18 | * | d10n-work joined #nim |
16:00:09 | * | BitPuffin|osx quit (Ping timeout: 265 seconds) |
16:01:43 | Araq | stalker :P |
16:01:58 | FromGitter | <Yardanico> and I read almost every github notification I get |
16:02:04 | Araq | any experts on data flow analysis around? |
16:09:28 | * | sz0 joined #nim |
16:15:00 | FromGitter | <zacharycarter> This article series is interesting - https://blog.molecular-matters.com/2015/08/24/job-system-2-0-lock-free-work-stealing-part-1-basics/ |
16:15:31 | FromGitter | <zacharycarter> I haven't read through it all the way, trying to make sure I understand everything I'm reading |
16:17:51 | * | yglukhov joined #nim |
16:17:54 | dom96 | Yay, just got one assignment left to finish and semester 1 is done! |
16:19:56 | FromGitter | <zacharycarter> :D |
16:23:21 | * | dddddd quit (Ping timeout: 265 seconds) |
16:25:46 | * | natrys quit (Ping timeout: 265 seconds) |
16:26:35 | * | dddddd joined #nim |
16:27:10 | PMunch | zacharycarter, yeah work-stealing is pretty interesting |
16:27:41 | * | BitPuffin|osx joined #nim |
16:30:58 | * | yglukhov quit (Remote host closed the connection) |
16:32:04 | dom96 | I wish I had time for more livestreams :\ |
16:34:04 | FromGitter | <zacharycarter> PMunch: I'm trying to think about job scheduling in Nim |
16:37:33 | * | gokr quit (Ping timeout: 256 seconds) |
16:44:22 | FromGitter | <tim-st> When I override a proc to return 1) bool 2) int and use the proc name in another proc that compares the proc to int, it can't find out that 2) has to be taken? Isn't this the only possibility? |
16:49:09 | FromGitter | <zacharycarter> @tim-st please share some code |
16:49:20 | FromGitter | <alehander42> huh I didn't know that was possible in nim |
16:50:01 | dom96 | Not sure if this is what you mean but Nim does not support return type overloading |
16:50:39 | FromGitter | <tim-st> @dom96 yes, I meant that. ok thanks |
16:50:57 | FromGitter | <alehander42> I see how somebody can be confused |
16:51:25 | FromGitter | <tim-st> I coded too long in python, it works there |
16:51:26 | FromGitter | <alehander42> if you just compile the overloads without calling them, there is no error (because no cgen for them obvsly) |
16:51:36 | FromGitter | <tim-st> yes, exactly |
16:51:44 | * | natrys joined #nim |
16:52:00 | dom96 | it works in Python? really? |
16:52:39 | FromGitter | <tim-st> I mean I can return any type within the function |
16:52:45 | dom96 | oh |
16:52:56 | dom96 | Maybe what you want is an object variant? |
16:53:05 | dom96 | you can also abuse JSON for this |
16:53:40 | * | natrys quit (Client Quit) |
16:53:42 | FromGitter | <tim-st> I don't know, I just expected it to work, as I said, there wasn't another possibility for the compiler |
16:59:58 | FromGitter | <alehander42> do you have any particular function/task in mind? probably there is a good way to achieve what you want without return type overloading |
17:01:26 | * | yglukhov joined #nim |
17:01:35 | FromGitter | <tim-st> @alehander42 I now had a look at my code again and it's probably better to rename the proc to a name that fits better, maybe this is mostly interesting for the return type openarray. |
17:01:56 | FromGitter | <alehander42> (and actually Python doesn't really suport exactly that: you might be able to return either bool or int from the same function, but Python will always call the same def for a `name`) |
17:03:02 | FromGitter | <tim-st> Yes, that's true but the same func can yield different return types in Python, in Nim it's not possible I learnt now |
17:03:58 | FromGitter | <alehander42> you can use variants to wrap different types |
17:04:14 | * | nsf quit (Quit: WeeChat 1.9.1) |
17:04:19 | FromGitter | <alehander42> also it *can* in a lot of cases: if it depends on a different set of args |
17:04:30 | FromGitter | <alehander42> which is usually when this is useful |
17:05:03 | FromGitter | <tim-st> Ok that's good to know, thanks! |
17:06:22 | * | yglukhov quit (Ping timeout: 265 seconds) |
17:13:43 | * | claudiuinberlin quit (Quit: Textual IRC Client: www.textualapp.com) |
17:16:57 | * | Jesin quit (Remote host closed the connection) |
17:18:07 | * | SenasOzys joined #nim |
17:19:38 | * | Jesin joined #nim |
17:26:17 | * | Jesin quit (Ping timeout: 256 seconds) |
17:29:31 | * | miran joined #nim |
17:30:44 | * | yglukhov joined #nim |
17:39:18 | * | Jesin joined #nim |
17:42:28 | * | PMunch quit (Quit: Leaving) |
17:42:33 | * | gokr joined #nim |
17:42:59 | FromGitter | <zacharycarter> The godot community is a show :/ |
17:45:36 | * | dddddd quit (Ping timeout: 260 seconds) |
17:50:02 | * | dddddd joined #nim |
17:51:12 | FromGitter | <mratsim> Actually you can use auto for multi return types, but last time I tried I got caught by Araq :P (flatten proc/iterator). |
17:52:32 | FromGitter | <mratsim> I manage to have proc that could return Tensor or CudaTensor depending on a static[enum] with `when` conditions |
17:56:41 | miran | hi all! HashSet doesn't have .pop()? how to get some random value out? |
17:57:58 | subsetpark | You might need to get a seq version, randomly pick an element, and then remove from the set |
17:59:07 | miran | bleh.... |
18:00:01 | miran | hopefully there's some way without conversion |
18:06:49 | FromGitter | <tim-st> @mratsim good idea, thanks! |
18:10:45 | * | claudiuinberlin joined #nim |
18:12:25 | miran | subsetpark: i did it with: for element in set: doThings(element); break |
18:13:14 | subsetpark | what do you do, randomly pick an i in the cardinality of the set and then doTHings when j == i? |
18:13:21 | miran | and manually excluding that element |
18:14:42 | Araq | patch the stdlib and add this feature |
18:15:13 | * | Trustable quit (Remote host closed the connection) |
18:15:19 | miran | i start iterating through the elements, and then stop (break) after the first iteration |
18:16:23 | miran | Araq: should it be random, or is fine like i did it above? |
18:16:28 | Araq | yeah I doubt the stdlib implementation would do something else |
18:16:55 | Araq | no random. debuggability is king |
18:24:42 | * | sz0 quit (Quit: Connection closed for inactivity) |
18:44:26 | * | Arrrr joined #nim |
18:47:10 | * | yglukhov quit (Remote host closed the connection) |
18:58:30 | * | BitPuffin|osx quit (Ping timeout: 265 seconds) |
19:00:25 | * | sz0 joined #nim |
19:02:07 | miran | Araq: ok, i'll look into that tomorrow, now i'm too tired. if i manage to do something useful, i'll make a PR |
19:04:46 | * | yglukhov joined #nim |
19:10:18 | * | yglukhov quit (Remote host closed the connection) |
19:10:33 | * | yglukhov joined #nim |
19:11:05 | * | yglukhov quit (Remote host closed the connection) |
19:11:26 | * | yglukhov joined #nim |
19:11:55 | * | yglukhov quit (Remote host closed the connection) |
19:13:28 | * | sz0 quit (Ping timeout: 240 seconds) |
19:16:39 | * | sz0 joined #nim |
19:22:59 | * | solitudesf quit (Quit: solitudesf) |
19:26:16 | * | yglukhov joined #nim |
19:26:19 | * | yglukhov quit (Remote host closed the connection) |
19:26:56 | * | yglukhov joined #nim |
19:27:06 | * | yglukhov quit (Remote host closed the connection) |
19:27:21 | * | yglukhov joined #nim |
19:27:53 | * | yglukhov quit (Remote host closed the connection) |
19:28:13 | * | yglukhov joined #nim |
19:28:40 | * | yglukhov quit (Remote host closed the connection) |
19:28:56 | * | yglukhov joined #nim |
19:29:27 | * | yglukhov quit (Remote host closed the connection) |
19:30:06 | * | yglukhov joined #nim |
19:30:14 | * | yglukhov quit (Remote host closed the connection) |
19:40:21 | * | yglukhov joined #nim |
19:40:22 | * | yglukhov quit (Remote host closed the connection) |
19:40:41 | * | yglukhov joined #nim |
19:40:46 | dom96 | mratsim: nice website you put together for arraymancer, maybe it's time to submit that to HN? :) |
19:41:09 | * | yglukhov quit (Remote host closed the connection) |
19:41:27 | * | yglukhov joined #nim |
19:41:56 | * | yglukhov quit (Remote host closed the connection) |
19:42:22 | FromGitter | <zacharycarter> It'd be cool to see some practical examples using arraymancer |
19:42:36 | * | yglukhov joined #nim |
19:42:44 | * | yglukhov quit (Remote host closed the connection) |
19:42:54 | FromGitter | <zacharycarter> I don't know enough about tensors or scientific computing to make any real conclusions about how I might use the library |
19:43:15 | * | lastjedi joined #nim |
19:46:39 | * | yglukhov joined #nim |
19:50:46 | FromGitter | <zacharycarter> I also have a feeling there aren't simple examples really when it comes to this kind of computing either |
19:53:25 | subsetpark | distance matrices are fun and fairly simple to understand |
19:57:34 | Arrrr | I see that pure doesn't work as it used to, but i don't know what really does now. Where can i read more about its new behavior? |
20:00:10 | FromGitter | <zacharycarter> In relation to what Arrrr? enums? |
20:01:13 | Arrrr | yes |
20:03:58 | FromGitter | <zacharycarter> Hrm :/ I wasn't aware it had changed / was changing. I just checked the changelog as well and I don't see any mention of it there |
20:04:35 | * | miran quit (Quit: Konversation terminated!) |
20:28:13 | * | vlad1777d joined #nim |
20:29:11 | * | gokr quit (Ping timeout: 272 seconds) |
20:52:06 | * | sleepyqt quit (Read error: Connection reset by peer) |
20:52:53 | * | Arrrr quit (Read error: Connection reset by peer) |
20:54:54 | * | Vladar quit (Quit: Leaving) |
20:58:28 | FromGitter | <mratsim> @dom96 like last time, it’s the weekend :P |
20:59:14 | FromGitter | <mratsim> I was thinking of waiting for either sparse tensors support or OpenCL support (oneor the other would be the next big feature for my next version) |
20:59:21 | FromGitter | <mratsim> and thanks :) |
20:59:24 | dom96 | well, it's up to you |
20:59:32 | dom96 | I don't think weekend/weekday matters much :) |
21:00:20 | FromGitter | <mratsim> I think the glaring missing feature is loading from CSV or json at least, without that you can only use the library for batch of images (with arraymancer-vision) |
21:01:07 | * | endragor joined #nim |
21:05:08 | * | endragor quit (Ping timeout: 240 seconds) |
21:07:27 | dom96 | isn't this kind of going in the direction of the sort of thing that pandas provides? |
21:07:32 | dom96 | What's the scope of arraymancer? |
21:07:57 | * | solitudesf joined #nim |
21:12:31 | FromGitter | <mratsim> Numpy can load csv though. |
21:13:19 | FromGitter | <mratsim> Arraymancer scope is Deep Learning on unstructured data: images, sound, text, videos, games ... |
21:14:11 | FromGitter | <mratsim> I might add classic machine learning stuff as well, and clustering. |
21:14:42 | * | sz0 quit (Quit: Connection closed for inactivity) |
21:15:10 | FromGitter | <mratsim> In the future I’d like to add Bayesian neural networks (probabilistic neural networks) because I think they will improve a glaring issue in current neural nets: uncertainty and risk management. |
21:16:30 | FromGitter | <mratsim> classic machine learning would be a wrapper for XGBoost (gradient boosted trees), useful loss functions (F1 score, correlation matrix), utilities (one-hot encoding …) |
21:17:14 | FromGitter | <mratsim> and sparse tensors and sparse neural networks support (recommendation system typically deal with a lot of sparse data) |
21:18:26 | FromGitter | <mratsim> I leave the pandas stuff to bluenote and NimData, though we probably have to find a way to convert back and forth between our 2 libraries |
21:19:01 | Araq | I've implemented fmt"{0}{nimExpr}" for the stdlib but I wonder how alignment should be done |
21:19:29 | Araq | {x:y} passes 'y' as another argument to format, producing (x, y) |
21:19:54 | Araq | but alignment is independent of the type specific formatters |
21:20:13 | * | gokr joined #nim |
21:53:08 | FromGitter | <dustinlacewell> Is there a Concurrent ML library for Nim? |
21:57:19 | * | gokr quit (Ping timeout: 248 seconds) |
22:06:00 | * | d10n-work quit (Quit: Connection closed for inactivity) |
22:13:25 | * | mrcl joined #nim |
22:13:33 | mrcl | hey guys |
22:14:42 | FromGitter | <francewar> hey there |
22:15:20 | * | mrcl quit (Client Quit) |
22:17:52 | * | nsf joined #nim |
22:18:18 | * | Jesin quit (Quit: Leaving) |
22:49:37 | * | solitudesf quit (Ping timeout: 248 seconds) |
23:01:56 | FromGitter | <Varriount> Araq: Is allotment really needed? |
23:02:02 | FromGitter | <Varriount> *alignment |
23:02:08 | * | claudiuinberlin quit (Quit: Textual IRC Client: www.textualapp.com) |
23:02:21 | FromGitter | <Varriount> 99% of the time, people just want expression substitution |
23:02:40 | Araq | I copied Python's syntax |
23:03:25 | Araq | I think it's {expr:5<} for left alignment and {expr:5>} for right alignment |
23:03:31 | FromGitter | <Varriount> You mean its f-string syntax, or its format() syntax? |
23:04:17 | Araq | the f-string syntax calls format() |
23:04:46 | Araq | hmm I could have checked if I had Python installed :P |
23:06:19 | FromGitter | <dustinlacewell> Well I think a CML lib for Nim would be pretty hot |
23:06:20 | FromGitter | <Varriount> F-strings are my favorite new feature in Python. |
23:06:39 | FromGitter | <dustinlacewell> https://github.com/Hopac/Hopac/blob/master/Docs/Programming.md#introduction |
23:07:28 | dom96 | Araq: huh? what about my proposal? |
23:07:35 | dom96 | I thought you were happy with it |
23:07:57 | * | benoliver999 quit (Ping timeout: 246 seconds) |
23:09:28 | FromGitter | <zacharycarter> CML = customizable math library? |
23:09:46 | FromGitter | <zacharycarter> err configurable I mean |
23:10:53 | Araq | dom96, I'm implementing your proposal |
23:11:01 | * | benoliver999 joined #nim |
23:11:49 | dom96 | Araq: oh I see, awesome. |
23:12:18 | dom96 | We can either have each formatter specify its own alignment format |
23:12:57 | dom96 | or provide some way to pass multiple parameters to the format() proc? |
23:13:58 | FromGitter | <mratsim> @dustinlacewell seems like concurrent ML is a mix between coroutines + channels |
23:14:25 | FromGitter | <Varriount> dom96: Can I see your proposal? |
23:15:11 | FromGitter | <Varriount> How does python handle the alignment case? |
23:15:28 | dom96 | https://github.com/nim-lang/Nim/pull/6507#issuecomment-345071140 |
23:15:38 | FromGitter | <mratsim> I don’t see the difference between Concurrent ML and Erlang BEAM but I don’t know that much about ML lang |
23:15:47 | dom96 | That is a good question, how does Python handle this? |
23:17:12 | FromGitter | <dustinlacewell> @mratsim https://wingolog.org/archives/2016/09/20/concurrent-ml-versus-go |
23:19:07 | FromGitter | <mratsim> You can look into Nim coroutines but I’m not sure if many re using them so you might be on your own |
23:20:36 | FromGitter | <mratsim> and maybe async/await. Nim channels uses system threads so they are not lightweight jobs like in Hopac |
23:22:34 | FromGitter | <dustinlacewell> Yeah in Hopac threads are just ints which can be garbage collected |
23:22:44 | FromGitter | <dustinlacewell> It uses one system thread per core and then implements its own scheduler |
23:22:50 | FromGitter | <dustinlacewell> Work is modeled as contiuations |
23:23:21 | FromGitter | <dustinlacewell> @mratsim You may be interested in the very interesting and accessible book Concurrent Programming in ML by John Reppy which is currently blowing my mind |
23:24:04 | FromGitter | <dustinlacewell> I wrote this line in F# the other day using Hopac: let doFetch () = run <| delay ^->. Alt.choose [ timeout; result ] |
23:24:38 | FromGitter | <dustinlacewell> Which defines a function which returns a task that blocks the main thread to delay for a bit, and then either fetch and succesfully return a response, or timeout which ever happens first |
23:24:57 | FromGitter | <dustinlacewell> All with error handling built into the job monad, type safe return values from the server, etc |
23:25:01 | FromGitter | <dustinlacewell> I’m having a good time :) |
23:27:24 | FromGitter | <mratsim> You can do similar things in Nim with Futures, for the monad, either use a checked exception instead, or return a tuple/object. But blocking a thread (or doing async processing) while waiting for a response is supported |
23:27:47 | FromGitter | <dustinlacewell> Does Nim have the ability to express the Maybe monad? |
23:27:53 | FromGitter | <dustinlacewell> I’m guessing so. |
23:28:15 | FromGitter | <dustinlacewell> Also, I’m aware you can do concurrent programming in just about any language. |
23:29:01 | FromGitter | <dustinlacewell> Anyway I was just curious if someone had done it. I’ll stop hogging the channel now. |
23:29:14 | FromGitter | <mratsim> https://nim-lang.org/docs/options.html |
23:29:49 | FromGitter | <mratsim> In the future there will be core language support for Maybe: https://nim-lang.org/araq/destructors.html see the “opt” paragraph |
23:30:48 | * | yglukhov quit (Remote host closed the connection) |
23:30:55 | FromGitter | <mratsim> You can check the “Nim in Action” book, there is a step by step tutorial to build an async messaging app like Slack/IRC/Gitter |
23:34:33 | * | qih joined #nim |
23:34:48 | qih | Hi, how do I delete an account on the Nim Forum> |
23:35:39 | qih | s/>/? |
23:45:32 | FromGitter | <ephja> @mratsim as in a language feature? why? |
23:45:53 | FromGitter | <Varriount> qih: Why? |
23:52:58 | FromGitter | <dustinlacewell> ….language support for Maybe? |
23:53:12 | FromGitter | <dustinlacewell> You just need a descriminated union and user typeclasses I believe |
23:53:19 | FromGitter | <dustinlacewell> But I’m a dummy, or that’s what you meant |
23:55:15 | qih | Varriount: Different account name and email address from what I am now using. |
23:56:11 | FromGitter | <Varriount> qih: You'll probably have to talk to dom96 |
23:56:44 | qih | OK ty |
23:56:50 | dom96 | you can't |
23:57:07 | dom96 | for now at least |
23:57:36 | qih | Ah right, well it can sit dormant then, I have never posted from it, and the email address will be deleted today |
23:58:38 | qih | From in IRC, how do you mention or highlight someone's nick, which is using gitter.im? |