« first day (285 days earlier)      last day (3574 days later) » 
00:00 - 21:0021:00 - 00:00

00:00
RELOAD!
[INFO] Reactor Summary:
[INFO]
[INFO] cardshifter ....................................... SUCCESS [  0.004 s]
[INFO] cardshifter-api ................................... SUCCESS [ 40.513 s]
[INFO] cardshifter-modapi ................................ SUCCESS [ 26.109 s]
[INFO] cardshifter-test .................................. SUCCESS [  6.870 s]
[INFO] cardshifter-core .................................. SUCCESS [ 36.773 s]
[INFO] cardshifter-fx .................................... SUCCESS [ 18.873 s]
[Cardshifter/Cardshifter] 1 opened issue. 12 issue comments.
[retailcoder/Rubberduck] 6 commits. 4 opened issues. 3 closed issues. 8 issue comments.
@Simon after updating maven it looks like it built correctly!
Now, just not sure how to launch it lol
00:02
me neither :P
Well anyways, that's good news. It might have just created some .jar files somewhere I need to just run
GTG though
00:17
Cya later!
 
3 hours later…
03:07
> I've been talking to Jay, And there is one thing he really would like to see happen. We both realize it will be **very** difficult to make happen. But the idea is to where I can start a game using Cyborg Chronicles mod, and someone else can start a deck using another mod like Mythos, and *we can play each other*.

We realize there are all sorts of obstacles for this to happen. Is it realistically even possible?
 
7 hours later…
10:12
\[[**Vogel612/JavaBot**](https://github.com/Vogel612/JavaBot)\] [**Vogel612**](https://github.com/Vogel612) pushed commit [**59be187f**](https://github.com/Vogel612/JavaBot/commit/59be187f5d1be8633245da1b84b5708ab34fae4b) to [**master**](https://github.com/Vogel612/JavaBot/tree/master): Created an example properties file,
added SITE to configuration possibilities. fixes #58

Light changes on SESite behaviour when generated from Strings / URLs
\[[**Vogel612/JavaBot**](https://github.com/Vogel612/JavaBot)\] [**Vogel612**](https://github.com/Vogel612) pushed commit [**faf576ef**](https://github.com/Vogel612/JavaBot/commit/faf576ef41569dcfdccfc1ba64ca647e6f2db670) to [**master**](https://github.com/Vogel612/JavaBot/tree/master): Merge pull request #59 from Vogel612/58_site-config

Implemented Site-Configuration
10:37
hey
@skiwi anything interesting?
@SimonAndréForsberg I find it a very interesting read
Halfway through now
Slide 197 about Spock looks really cool
@SimonAndréForsberg I think I'm starting to feel the same, though I haven't programmed yet...
And that GPars Actors looks like something interesting as well
Feature A looks interesting, Feature B looks interesting, Feature C looks interesting... Everything looks interesting!
11:30
@skiwi GPars Actors?
oh, I hadn't learned about that part until now
> A friend of mine would actually like to accomplish the same thing, but with Hearthstone and Magic: The Gathering.

Theoretically, it is possible, but there are a bunch of obstacles for it.

Let's take the example of HS & MTG. You play a HS deck, I play a MTG deck.

Here is just some examples of possible obstacles:

- Does this mean that you start with 30 life (HS) and I with 20 (as in MTG) ?
- How should attacking and blocking work? If you are attacking me, do you attack according to
@SimonAndréForsberg Not sure how to describe it, it really looks a lot like something we had in Automata and Process Theory
11:45
it reminds me of what I have heard Donald.McLean talk about, Actors also exist in Scala.
12:00
> This can (and possibly should) be used instead of automation for #53
@SimonAndréForsberg Yeah.. true
12:13
Hey :D
That ORM was a whole read, but definitely worth it
Now I'll only need to use it one time
@Marc-Andre using Groovy's Grails' GORM I can use Hibernate without knowing a lot about Hibernate, I don't even need to know HQL
You can use Hibernate in Java too without knowing HQL.
HQL is not really hard to learn though, especially not if you know some SQL already
@skiwi That's nice! And that is what a good framework should do!
@SimonAndréForsberg That's true as well
@SimonAndréForsberg How? I'm not sure if I've seen that around yet
13:05
@skiwi you can call good old fashioned Java methods and construct a query that way
@Phrancis you can start the server and the client from within Eclipse, which is what I would recommend
13:47
@SimonAndréForsberg Are those manager-like objects or you mean calling sql with prepared statements, etc. directly?
14:01
> I figured that would be the case, thanks for looking into it
@skiwi more like query-builder-like objects.
Monking!
hey @Phrancis
hey @Phrancis
14:15
HQL looks interesting, although I don't understand the meaning of "Hibernate" in a programming context
CriteriaQuery<Person> personCriteria = builder.createQuery( Person.class );
Root<Person> personRoot = person.from( Person.class );
Join<Person,Order> orders = personRoot.join( Person_.orders );
Join<Order,LineItem> orderLines = orders.join( Order_.lineItems );
...
I thought that Something<Foo> syntax was for generics, is that the case here too?
14:31
@Phrancis yes, it is
@Phrancis Hibernate is a kind of wrapper around the JDBC API, to make it easier to switch RDBMS, and to provide an ORM (Object-Relational Mapping) so that your Java classes can be directly transformed into rows in a database table.
I see, that's pretty neat
@SimonAndréForsberg Ah okay, my eyes now do hurt though from reading that
I tried to be productive, I shouldn't have played a game
@skiwi I have to say the CSS formatting on that page is pretty offensive
@Phrancis Yeah agree
Groovy has some sorcery here
    def bindingMap = [firstName: 'Peter', lastName: 'Gabriel', age: 63]

    def person = Person.get(someId)
    person.properties = bindingMap

    assert person.firstName == 'Peter'
    assert person.lastName == 'Gabriel'
    assert person.age == 63
yup
but it's groovy sorcery :)
14:43
Groovy sorcery == Grocery?
I think it's time to actually start doing something
Step 1. Find a name for the application
It's an application to manage buying and selling goods
I'm not really home in terminology with finance related stuff, maybe you know it @Phrancis?
naming things is doing something?
@SimonAndréForsberg It's a start!
I'm pretty good with finance stuff since I work in the insurance industry
I've heard about the term Inventory Management, but to me that implies an inventory rather than managing buying/selling?
@SimonAndréForsberg instantstar
14:51
Inventory generally refers quantity and types of physical goods, often in a wholesale or retail context
It's tangentially related to buying and selling of course, but not directly
Purchasing is the function of buying Goods & Services from External Source to an Organisation. Purchase department buys Raw Materials, Spare parts, services etc. as Required by the company or Organisation. Purchase management is One of the most Crucial Area of the Entire Organisation. Thus, Needs Intensive management. Purchase is the Main Activity in Area of Material management. Purchasing management is a department in an organization responsible for purchasing activities. Purchase is Most Important Function in any Organisation. Purchase is the first element which affects the product cost. Purchase...
I think this is probably closer to what you are thinking of
Actually, that's a pretty poorly written article... @skiwi what kind of goods/products is it about selling/buying?
@Phrancis Can be used for anything I'd say
The thing is, the process of buying and selling varies massively depending on the kinds of goods
(and on the party who is buying/selling)
I will need to handle being able to buy multiple products "as one", and same for selling
If that makes sense
Like you buy a bunch of things for $100 as a group, and they don't have an individual price
Hmm. The closest real-life example of that that comes to mind would be like construction contractors
- Buy a batch of materials from a distributor/manufacturer in one purchase
- Build a home and sell it as one purchase, rather than selling individual planks & bricks
But with the materials you buy, you could also build two homes
and sell those individually
@Phrancis It's in the context of reselling stuff with the goal to make profit
But I thought that if you create an application where you can enter purchases and sales, that would be pretty generic?
15:16
Could you be a little more vague? ;)
The thing is that the application I've got in mind should be able to handle all kinds of things
The only "generic" way I've seen in real business that generic enough to handle all kinds of things is a RDBMS, and generally the application is just used to pass data back and forth between the user and DB (and do administrative like create invoices and such with the data)
I just need a damn name :P
I'm inclined to call it Purchases and Sales Tracker
But it's a stupid name :D
I think it should be usable by a Pawn Shop
Or maybe not, I thought it was something different
@skiwi I've just jumped in, but do know that an application that handle all kinds of things is good at being generic. It will have some problems dealing with specific things (which is not bad just a "reminder")
There's those series on TV where you have companies that buy goods in bulk (like a container for $100) and then make profit by selling those items
15:29
@skiwi so this is one of your own projects, not anything for school or anything else?
@SimonAndréForsberg This is one of my own projects, yes
I see some possibility to sell this software, but I really don't know how so I'm just getting it started as Open Source
@skiwi Well then, consider eBay as a possible model, this is what sounds closest to what you are trying to make
@Phrancis I'm not trying to build an application like eBay, I'm trying to build an example that could track someone buying and sellings things from/on eBay
Hope it makes more sense now
So it's really an accounting type of system then? To keep track of payable and receivable transactions?
Pretty much that ^
So it's more accounting software?
15:35
Yep
:|
Accounts Payable and Accounts Receivable <-- Accounting
Thanks a lot though
I was looking in the wrong direction all of the time
@Phrancis Never heard of those terms yet, I need to check their translation
Interesting, when you translate those words to Dutch you get more legal meanings of buying/sellings
"Purchases" and "Sales" would do for now I guess?
It would I guess, you can always Refactor->Rename later ;)
Here this may help you conceptualize it better, even though it's SQL I think the chart will help you
11
Q: Revision 2 - Step 1: PsychoProductions management tool project

PhrancisI have been told by DBA.SE people that this was off-topic for DBA.SE and should be on CR.SE instead. So... here I submit this database schema design for my trusted fellow CRitters to review! This is another revision of my Psycho Productions database, this time refactored from MySQL to PostgreSQ...

@Phrancis Le'ts check it out
It's close, but I don't think I'll be dealing with invoices right now
15:47
OK
A ledger is the principal book or computer file for recording and totaling economic transactions measured in terms of a monetary unit of account by account type, with debits and credits in separate columns and a beginning monetary balance and ending monetary balance for each account. == Overview == The ledger is a permanent summary of all amounts entered in supporting journals which list individual transactions by date. Every transaction flows from a journal to one or more ledgers. A company's financial statements are generated from summary totals in the ledgers. Ledgers include: Sales ledger,...
I'll probably go with the very descriptive "AccountingSoftware" name for now
It's just a WIP-name, but it at least has to make somse sense ;)
I primarly just have to convince myself of it being good enough
At least that name describes unequivocally what the software is for!
Looks up unequivocally
I hate programs that don't come with an installer
And instead with an update you'll need to redownload it again
15:53
I love programs that don't come with an installer
Why?
Because where there's installers, there's piece of sh** being added to the Windows registry, the start menu, etc...
I love Eclipse, just download and unpack and start!
@skiwi It has just taken you 1 hour and 4 minutes to pick a name.
2
@SimonAndréForsberg You really measured it? damn
@SimonAndréForsberg I should've been clearer, this already came with an installer, but to update it requires you to download it again and reinstall it
@SimonAndréForsberg That's one thing I love about OS X applications - They're almost always just self-contained, so "installing" it is just a matter of putting the application file in a folder, and "uninstalling" it is just deleting the file
@skiwi I looked at the time stamp of two chat messages. was easy to calculate the time spent from that
15:59
I like sudo apt-get install and sudo apt-get remove
@Marc-Andre But don't worry, I won't try to solve the whole generic problem in one go ;)
@skiwi Something like that? ^^
Actually the purchase should show ($500) since it's a debit and not a credit
Is there some word that's generic over a Person and a Business?
Entity
Party
@Phrancis That's an example, yes
But it already gets more tricky when one purchase can be about multiple products
^^ That's what invoices are for, or transactions
16:07
Yes, but in an Excel file it's really hard to keep track of stuff when you buy 1x A + 2x B for $500 in total, but you don't know how much you actually paid for them a piece
Yep, that's what people use relational databases for ;)
And that's why it will also be stored in one :P
There ya go
The "typical" model for transaction from my experience is you will have a Header and a Detail (this works for invoices, receipts, shipping, all kinds of stuff)
So you could achieve a simple accounting ledger with as few as two data sets
16:26
Hmm interesting, that could probably work
Regarding the fields, it is a simplistic version there
Right
@skiwi is it even necessary to have a table for sale and one for purchase? I think you'd be able to do some more awesome queries if those were the same table, "Transaction"
Products might still be too vague though
As now it references a Product (like a DVD of a specific movie)
But you really want to reference one instance of a DVD of a specific movie
@SimonAndréForsberg I don't know about that, wanted to go for the simpler looking option here
That's also why a User is not an Entity right now
if you're workign with transactions, then it should be
@skiwi Transaction would be simpler IMO. + for sales, - for purchases. Or a boolean flag.
16:30
And I still need to model costs... hmm this model still needs updates for sure!
Costs are related to a purchase or sale, but can be qualified in price
@skiwi One thing to keep in mind is that in a typical business setting, prices and profits are very rarely tracked per each individual instance of a product. If that's what you're wanting to do, you'll have to serialize each product instance and that's a lot of work IMO
Would it make sense to call that a ProductInstance that references a Product?
@Phrancis I think that is what I actually want to do, all products are really physically different
Can be from something as simple like visual damage, to some properties on digital devices
Eh I better hope there's a way to move this model down on the page :|
That could be as simple then as a plain old text field with a description
16:41
@Phrancis Yeah, or a map of properties, something like that
Sure
Ah good, managed to move my model down, so I have more space in the top :P
Perhaps a RDBMS is not the best fit after all, have you considered maybe something more malleable like JSON/XML?
I think data tables might be too "rigid" for what you're trying to do
(yes, I actually recommended against using SQL, for the record ;)
@Phrancis RDBMS sounds fit for the job to me (although JSON can definitely work as well)
I think SQL is completely fine
I'll be modelling it using domain classes though, I won't be touching any SQL (hopefully)
16:48
What is the purpose of the Cost table? Shouldn't that be with ProductInstance instead?
@Simon Does Java work pretty good with PostgreSQL?
@Phrancis When you would drive somewhere to buy something, you've got to pay the fuel for example
Ah ok
@Phrancis yes. I'm using Java + Hibernate + PostgreSQL for @Duga
@skiwi Isn't cost, purchase and sale just different forms of a income/expenditure?
@SimonAndréForsberg Would it be a pretty simple task to setup a database connector for Cardshifter? (to store JSON replays in)
@Phrancis "simple" depends on who you ask. If you ask me, it's quite simple yes. (because I've done it before enough times)
16:59
Well, I am asking you, aren't I? ;)
I think we could get away with having just one table with 3 columns: an ID, a time stamp, and the JSON itself.
@Phrancis depends on who will implement it, then :)
@Phrancis I don't think it should be about "getting away with", I think it should be about making it right. That setup won't do it for me. I think we should go with something similar to what I use in my Minesweeper Flags database. Users table, games table, users in game table. That way we can grab all games where "Phrancis" has played much easier, which I imagine will be a quite frequent query.
OK, I was mostly just thinking of somewhere to put the replays, though I would also prefer a more flexible setup as well
@Phrancis Have you seen what I have at stats.minesweeperflags.net ?
We could use stored functions to make views that would normalize the data into several tables just from the JSON
@SimonAndréForsberg I think I have before, but that domain is blocked by my employer :\
17:07
Nope, same thing
Other than Players->PlayerGames->Games what else you think should be broken out into tables, if anything else?
possibly a Game--Tag table, so that we could add "tags" to games. It's a feature I've been using in Minesweeper but not sure if it's worth using in CShifter. And if it is, probably not yet for a long while
I think Game->Mod might make more sense?
I think that should probably just be a field in the game table
as it's a 1:N relationship, not N:N
17:22
Ah yes that would make more sense
Breaking out a game identity and the players from JSON into Postgres is pretty trivial, the only thing that gave me pause is how to extract who actually won the game
@SimonAndréForsberg I'd say it depends on what you want to track
Perhaps the Java server could just put that into a WinningPlayer field in Game table when it dumps the JSON replay in there
It would be perfectly valid to only track purchases of X amount on date Y, but that's not what the application is about
I think that should work OK. I think normalizing out cards/actions into tables probably would be overkill, if we needed that we can just create stored functions or something like that. Agree?
@Phrancis yes it can, and I think it should do that as I think it will be a frequent thing you want to know about.
@Phrancis agreed
@skiwi FYI:
> Handling exceptions in Groovy is the same as in Java. We write a try-catch block to catch an exception and handle it. But there is a twist: in Groovy every exception is optional. This goes for checked exceptions as well. Groovy will pass an exception to the calling code until it is handled, but we don't have to define it in our method signature. So we as developers can choose how and when to handle the exception.
i.e. all exceptions are handled as unchecked exceptions.
17:46
@SimonAndréForsberg That is nice
@Marc-Andre I have not yet decided what I think about it. I am quite used to either declaring throws or try-catch'ing
@SimonAndréForsberg Good to know
I'm still undecided as well
When writing API methods I really like to throw checked exceptions
When writing "client" code I dislike checked exceptions
When I'm writing both in the same project, I often end up writing no code
@SimonAndréForsberg You will still have to deal with it.. the thing is you do not to do :
catch (CheckedException e ) { throw new UncheckedException(e);}
18:04
that is true
All those IOException finally not checked anymore
but now it will be harder for me to find the spots where I need to add the catches
Unless you read the documentation ;) Which should still say hey btw I'll be throwing thoses exceptions
should say...
I'm the one writing the documentation for this code, my documentation says squat!
2
Then you could it yourself as well! ;)
18:15
@Duga has nothing to remind anyone of today!
@Duga Good @Duga
@Simon could I bother you to create a schema in your DB for Cardshifter replay data and give me access to it, if that is not too much trouble?
That way I can create tables and functions and you'll only need to make the connector
Or if you'd rather, I can just write the code and give it to you to run. Whichever is fine
@Phrancis the tables can create themselves in Hibernate (but they can also be created manually of course), unfortunately I think it will still take a little while before it is integrated into CShifter, so for now I think it's best if you write the code for it.
OK perfect
I need to cleanup the database branch anyways so now that will give me an excuse to :)
Would Hibernate per-parse the player and game information from JSON before inserting, or should the database do that?
(I'd prefer if Hibernate/Java did, TBH)
leave it up to Hibernate
18:34
I have a feeling Hibernate and I are going to get along well :)
@Phrancis Until Hibernate backstabs you
Because that's what all frameworks do on the days you absolutely need them most!
Naah, it's only you that they backstab, @skiwi
> We will store replay game data as JSON into a fairly simple PL/pgSQL database, which has a native JSON data type and queries can be written to manipulate JSON data. The most important relationship will be `player -> player_game -> game` and most of the relevant data will be in `game` table. The idea is that when a game ends, the game server will establish a connection to the DB and insert the data using Hibernate framework.

- [ ] Create DB schema, tables and indexes
- [ ] Write a few fun
@SimonAndréForsberg Can you give me the DSL Groovy link again? I lost it
(Yes, I lost a tab, deal with it)
It's lost together with 100 other tabs :(
18:46
@SimonAndréForsberg I think it was that one
Do you recommend one over the other?
I recommend both.
The first one is about DSLs in general, the second one is more about how to make DSLs in Groovy
@SimonAndréForsberg Then some user of your api will be surprised by an unexpected exception
Imagine creating a Groovy DSL to program OpenGL... that could be aweosme!
But it's not worse than an UncheckedException
[Cardshifter/Cardshifter] Phrancis pushed commit 577287ed to database: Delete cardshifter-0.4-card-list.sql
18:57
@SimonAndréForsberg That one seems like a significantly longer read
@skiwi the first one is in four parts, each part having 4-5 pages I think
@SimonAndréForsberg Oh... then I only read 1 part!
19:12
@SimonAndréForsberg think we're safe with a 4 byte int for the game seed field? I looked at JSON replay and it looks like this seed":81248606495951 so we might need to use a bigint (8 bytes)?
8 bytes, yup
it's a long in Java, which is 64-bit, so 8 bytes.
not sure if there is a need for a specific seed field though
Maybe not, actually. I think we can just had a regular id field in the db
yes, a game id
good old primary key :)
19:36
\[[**Cardshifter/Cardshifter**](https://github.com/Cardshifter/Cardshifter)\] [**Phrancis**](https://github.com/Phrancis) pushed commit [**51dfbc8b**](https://github.com/Cardshifter/Cardshifter/commit/51dfbc8b6701cf364a577b6003000abb4cd8f272) to [**database**](https://github.com/Cardshifter/Cardshifter/tree/database): Update and rename cardshifter-0.4-player-list.sql to DDL for cardshifter_replays schema

Create schema and tables
@Simon do a quick review when you have a minute please? ^^
If there are other fields you'd like to see in any of the tables just LMK. Might be fun to extrapolate a bit more data in player_game if you think it wouldn't complicate things too much, like damage_caused, mana_spent but that one I think covers the fundamentals
[Cardshifter/Cardshifter] Phrancis pushed commit 78637266 to database: Rename DDL for cardshifter_replays schema to DDL for cardshifter_replays schema.sql
[Cardshifter/Cardshifter] build #944 for commit 51dfbc8b on branch database passed
[Cardshifter/Cardshifter] build #945 for commit 78637266 on branch database passed
[Zomis/Server] Zomis created branch transformers
[Zomis/Server] Zomis pushed commit 8d9d154f to transformers: made variables final
[Zomis/Server] Zomis pushed commit efdcf46f to transformers: added Base64Utils
[Zomis/Server] Zomis pushed commit cbe4ab07 to transformers: added groovy support
[Zomis/Server] Zomis pushed commit d589be69 to transformers: added FourChar transformer in Groovy and added LoginMessage class
@Phrancis It's impossible to extract damage_caused and mana_spent right now. That is game-logic dependent.
[Zomis/Server] Zomis pushed commit 7d95475f to transformers: deprecated old methods, switching over to new transformers handling and usage of the Message class
@SimonAndréForsberg OK, what about starting and ending health? Same deal?
19:47
@Phrancis Why not call the schema simply cardshifter ? I think we should use the same database for all Cardshifter related stuff (or is Schema not the same thing as a database?)
@Phrancis yup, same deal unfortunately.
@Phrancis add a password field for player
@SimonAndréForsberg OK, I can probably do some sort of SQL sorcery to extract some of that from the JSON
@Phrancis player_game needs a primary key. And I'm not sure we need the inviter field
@Phrancis you need the game logic to extract that, you don't have the game logic in pure SQL
Oh, poo. Guess it would be mod dependent eh
@Phrancis To support potentially more player games in the future, I find a INT winresult to be better than a BOOL for winner.
@Phrancis Don't forget a mod (String probably?) field in game
</sql-review>
Cool, will make the adjustments then :)
19:54
@Phrancis what's that picture?
Transformers :)
> Save game state to make it possible to resume games at a later time (like Minesweeper Flags Extreme)
[Zomis/Server] Zomis added label enhancement to issue #8: Replays
> Support a replay system, save played games to a database. (like Minesweeper Flags Extreme)
> Each game should have a unique chat (again, like Minesweeper Flags Extreme)
> Battleship players and Ultimate Tic-Tac-Toe users should not be in the same chat room.
> One of my favorite features from Minesweeper Flags Extreme: Observe games
> Add communication tests to make sure the server responds as we expect it to (this might also provide some documentation about the server protocol)
[Zomis/Server] Zomis pushed commit 4cebf48a to transformers: cleanup, deprecation, logging, and ignoring
[Zomis/Server] Zomis pushed commit 1b153147 to transformers: removed references to removed class
20:15
@SimonAndréForsberg Do you want a whole separate database for Cardshifter, or just a separate schema in your current database?
Separate schema would be simpler to manage, but it would also add load to the database for the other things it does
On the flip side, having a separate DB would allow you to isolate Cardshifter with its own DB users, as user permission is set on DB level I think
@Phrancis I don't have a current database for Cardshifter.
I mean, the DB you use for other things like minesweeper and such
oh, you mean that... Minesweeper is using MySQL (yes, I know....) and is hosted on another computer in a galaxy far far away. I have a database for @Duga locally, but I don't think Cardshifter things belong there. I think it's better to give it its own db
OK
That will make managing permissions easier
20:31
It's evolving!
Requesting a sanity check
20:45
@SimonAndréForsberg Do you have type checked enabled?
I've only seen so far that you need to add @TypeChecked to every method (or class?), but what's your experiencew ith it?
@skiwi once per class is enough. I do use it on some classes but not when I don't want it
I see that you can use Java code in Groovy
But does it also work the other way around?
[Cardshifter/Cardshifter] Phrancis pushed commit 284e4533 to database: Update and rename DDL for cardshifter_replays schema.sql to cardshifter_database.sql
you can also use meta-annotations if there are many annotations you want to have on many of your classes, then annotating with the meta-annotation is enough
20:53
@Simon please see changes I made
okay
I should also read a basic Groovy tutorial at some point
@skiwi I read most of docs.groovy-lang.org/latest/html/documentation yesterday
@Phrancis that's looking good
Why aren't we writing our card definitions in a custom Groovy-based DSL already?!
@SimonAndréForsberg Is that more a tutorial or closer to something like the JLS?
\[[**Cardshifter/Cardshifter**](https://github.com/Cardshifter/Cardshifter)\] [**Phrancis**](https://github.com/Phrancis) pushed commit [**79c97817**](https://github.com/Cardshifter/Cardshifter/commit/79c978177937c9b166aba38147f0703d9b007bd6) to [**database**](https://github.com/Cardshifter/Cardshifter/tree/database): Update cardshifter_database.sql

Fixed small error
00:00 - 21:0021:00 - 00:00

« first day (285 days earlier)      last day (3574 days later) »