I was just made aware of this post and wanted to let you know that I had independently put my code online as-is but with a proper license at https://github.com/lip6-apr/syb_qc. I haven’t done anything related since, but I want to take a closer look at the following:

– Li-yao Xia’s implementation at https://github.com/Lysxia/generic-random

– the paper on Luck https://arxiv.org/abs/1607.05443, a DSL for writing generators

– the GenCheck framework by Uszkay & Carette http://hackage.haskell.org/package/gencheck

– Jonas Duregård’s work, e.g. http://publications.lib.chalmers.se/publication/225344

I have spent 8 years teaching students and have not yet come up with a good method of discouraging them from plagiarism.

First a few words about the environment at my university. During the last several years authorities of my university have recognized plagiarism as an increasing problem and introduced regulations to counter it. (I heard the motivation for this changes was a small scandal where several of our students participating in the Erasmus program have been caught cheating on the exam at one of the foreign universities and got expelled for that.) One of the regulations allows punishing a student found guilty of plagiarism with being removed from the lab group. This essentially forces that student to re-take the course in the following academic year. This is the biggest consequence for handing in a plagiarized assignment. Of course the exact consequences are at TA’s discretion and don’t have to be that severe.

In practice many academic teachers turn a blind eye to plagiarism or even openly encourage it! The result is that scale of the problem is really big and many students consider copying from others as the norm. I personally have always been very strict about plagiarism. I have always put a great deal of effort and time to identify cases of plagiarism and never hesitated to immediately remove students from my lab group if found guilty of plagiarism. Frankly speaking, I am not entirely happy with such an approach. One problem is that it requires a lot of time on my side – time that could be spent better on something else. I think this is why some TAs don’t care much about plagiarism. I discussed this with one of my colleagues and he said: “I am here to be a teacher, not a policeman. I would rather dedicate my time to work with students that want to learn and develop their skills rather than spend that time on chasing down students that don’t want to learn.” I think my colleague has a good point here. Secondly, I realize that detection rate is far from 100% and there is a feeling of injustice for a student that gets caught. One of my students once showed me a Facebook discussion between students about TAs teaching one of the courses on programming. A student participating in that discussion was once caught by me on plagiarism and removed from the lab group. That student openly admitted on FB that he indeed handed in somebody else’s assignment, yet still expressed a feeling of being treated unfair! At first I found this thinking totally surprising. How can someone openly admit to having committed plagiarism and at the same time feel that I have treated him in an unjust way by punishing it? It sounded as if I have broken an unwritten rule of tolerating plagiarism. And perhaps I have. My takeaway message from this is this: you need everyone on the faculty to engage in countering plagiarism, possibly using the same rules. And you definitely have to be very clear about what the rules are, what qualifies as a just use of somebody else’s work and what does not.

I have already employed in the past the approach with requiring students to provide citations, though my motivations were slightly different than yours. Firstly, when students hand in their assignments and I discuss their solution to the problem I want students to be able to easily track down sources of knowledge that they used. For example, they might have implemented a formula that I consider incorrect and want to see the original source of that formula (perhaps it is correct but under different assumptions?). Secondly, two students working independently with the same source (eg. a tutorial) might result in very similar solution giving a false impression that one solution was created from the other. I have also emphasized that using online resources is OK as long as materials used are cited. This, I think, is the same as your approach. So far success here was moderate. I found that many students don’t recognize citations as something that is beneficial for them, rather as another burden (especially when the project is started at 2am a night before the deadline). I have seen many cases where students have provided citations but in the course of discussion it turns out that they actually have used other materials that they have not listed. Takeaway message: explain to students that citations are something beneficial for them; that they protect them from being accused of plagiarism.

I hope these thoughts will be helpful. I am curious how your policies work out in practice so please write a follow-up post sometime in the future.

Janek

]]>We can make an instance of `MonadPut` and `MonadGet` in `bytes` for a monad transformer that computes such a CRC as it reads or writes using an underlying monad. This is basically a glorified WriterT. Then the ‘twisted functor’ here is to let this monoid ‘act’ on that writer monad in the obvious way.

]]>I’ve used this monoid many times in the past, but never had a name for the concept, so I’ll steal yours!

Here are a couple of simple examples I’ve found useful in the past.

Say you want to compute a hash function in parallel. You might try doing something like saying that the hash is the bitstring mod q where q is an odd number, since an odd number is coprime with 2, you can compute this answer for the concatenation of two bitstrings by simply tracking how many bits you have (which you combine with +), and by computing

(a,n) (b,m) = (mod (a*2^m + b) q, m + n)

Here our monoids are addition, and addition mod q, the action of m on a is multiplying a * 2^m.

If you do this in a Galois field instead of the usual integer ring, and store x^m and x^n, instead of m and n, then you can easily compute standard CRCs in parallel!

(a,x_n) (b,x_m) = (a * x_m + b, x_n * x_m)

https://www.schoolofhaskell.com/user/edwardk/parallel-crc

When you’re done, just ‘forget’ the x_n, term, and use the usual the usual CRC finalization of flipping all the bits to get your answer.

(I found out after that the ability to compute that result in parallel had been written up a couple of years before in Kadatch and Jenkins: https://github.com/rurban/crcutil/raw/master/doc/crc.pdf)

Minor modifications allow the computation of Adler32 or Fletcher checksums in a similar way.

]]>