Thanks for the introduction. Hi everyone, I'm Navit and I'm going to talk about separate separations of CPN circular security for any cycle length. This stock is based on two independent works, one by me and Chris Picard and one by Venkatakopula and Brent Waters. Okay, let's get started. Back to classical notions of security, we have two well-known definitions. One is CPS security, which says that encryptions of adversarially chosen messages are computationally indistinguishable. You know the attacker submits two messages and receives the challenge ciphertext and it has to determine which one is encrypted under public key. And one is CPS security, which is defined similarly except that the attacker has access to the encryption oracle. So the question is what is common in both of these definitions and the point is that both of these notions only consider the message that can be generated by the attacker. So let's consider a situation in which we have encryption of secret keys. In this figure, each directed edge shows that tail secret key is encrypted under heads public key. For example, an edge from Bob to Alice shows that Bob secret key is encrypted under Alice's public key. So as long as there is no cycle, we can say that CPS security of each individual encryption scheme suffices for the CPS security of whole system. This is observed by Goldwasser and McCully and now the question becomes what if we have a cycle? To answer the question what if we have a cycle, it turns out that hybrid argument breaks in this setting and we have uncertain security in general. So it might be secure or it might be not. To see that this example is not just a superficial thing. We have a few applications which use key cycles like password managers and disk encryption utilities. Anonymous credential schemes which was introduced by Kaminesh and Lysianskaya and proven computational soundness of symbolic protocols by Edaw et al. And more recently, and maybe the most famous example is bootstrapping technique for obtaining unbounded fullyomorphic encryption by Gen 3. So what kind of definition captures this requirement? Let's see. We said that the public encryption scheme is case circular secure if an encryption cycle is indistinguishable from encryption of junk message. So in other words, if you encrypt first secret counter, second public key, second secret counter, third public can so forth and then cycling back case, secret counter, first public key should be indistinguishable from encryption of all zeros. This definition can also be strengthened to key dependent message security which considers functions of one or more secret keys. Now the main question becomes does CPA or CCA imply case circular security? The answer is negative and we have a few separations based on different assumptions. Let's have a look on prior separations. We have this folklore result for one circular security which says that any CPA secure scheme can be transformed to one that is still CPA secure but not one circular secure. For K-Quals 2, there are separations based on standard assumptions. Earlier works were based on a 60-H assumption on bilinear groups and more recently, we have kind of examples from learning with errors and decision linear assumption. And then despite good progress for K-Quals 2, only now separations for K-Quals 2 are based on somewhat strong obfuscation assumption. One uses virtual black box obfuscation which later they refine their scheme to rely on IO and one uses indistinguishability obfuscation. Okay? The question is can we get read-up obfuscation assumption for the case K-Quals 2? And here is the main theorem which asserts that for any K greater than one, there exist CPA security schemes which are not K-Circular secure based on learning with errors and its ring variant for entity K approximation factors. These are first separations for K greater than 2 that do not rely on obfuscation assumptions and constructions are not specific for just K. They are also K-prime circular insecure for K-prime less than K. We use the few new techniques to achieve these results such as telescoping products for learning with errors which is sort of the main idea in both works and tensile LWE to get commutativity of the LWE secrets. Here we see features of both constructions at glance. Allomatic pie card constructions which we also call AP constructions are somewhat simple and direct especially in ring setting. We will see it soon whereas KW constructions are more complicated. However, it comes with some benefits. AP constructions has smaller public keys, secret keys and cipher text in ring setting whereas KW constructions is more efficient in plain LWE version and AP constructions use common random string whereas KW construction has no common random string. And finally, AP constructions handles just constant cycle length in plain LWE version whereas KW constructions handles polynomial cycle length. Okay, before going into the construction let's say useful abstraction which is called cycle tester and introduced by Bishop, Hohenberger and Waders. We say that the tuple of randomized algorithms, gen, nk and test together is a cycle tester when gen and nk is CPA secure. Note that definition of CPA security does not involve any decryption algorithm so we are not concerned with decryption and given K public keys and corresponding cipher text, test distinguishes cycles from non-cycles with noticeable advantage. Here is the algorithm from BHW 15 which simplifies our job to make a counter example. It says that a K cycle tester plus essentially any CPA secure or CCA secure scheme implies separation of K circular from CPA or CCA security and again by separation we mean a scheme which is CPA or CCA secure but not K circular secure. Okay, let's have a quick review on lattice trapdoors. Gen trap is a randomized algorithm which uses A bar as common random string and R as random coins which also we call it trapdoors to generate matrix A where A has A bar as its prefix. Once you know the trapdoor for matrix A it allows you to compute short random x such that A x equals any arbitrary right hand side. Note that this inverse operation is not a normal inverse operation and it's a rather randomized procedure and finally this A inverse operation is also known as Gaussian pre-image sampling which has been used in many cryptographic contexts. Now let's get into the construction. Here the message space is identical to the secret key space. First to set up we sample a uniform A bar as common random string. So key generation is very simple. To generate a key you sample a trapdoor from randomness space and then you run gen trap on A bar and R. So A is our public key and R is our secret key. Encryption algorithm is more interesting to encrypt a message which we viewed as a trapdoor under public key A. We run gen trap on A bar and message to get the matrix A tilde and then we choose a short matrix S. So the ciphertext would be a tilde inverse of noisy SA or we can view it as Gaussian pre-major of LWE sample for which S is short secret. And finally to test the cycle we simply compare prefixes of two products where each product is one public key multiplied by all of the ciphertext. Note that here two public keys are arbitrary and we can use any two different public keys as long as they have different index. Okay let's see why cycle tester works. First when we encrypt secret key R i minus one under next public key AI we run gen trap on A bar and R i minus one to get A i minus one and then the ciphertext would be A i minus one inverse of noisy S i A i or again the ciphertext can be viewed as a Gaussian pre-major of noisy LWE sample. Okay let's see what cycle tester computes. If we have a look on terascoping product for k cos 3 in the first line we could rewrite C0 as A2 inverse of S0 A0. Here we see that A2 and A2 inverse annihilate each other and what left is S0 A0 C1 C2 up to smile nose. In the second line again we can rewrite C1 as A0 inverse of S1 A1 and then A0 and A0 inverse annihilate each other and then doing similarly finally we get S0 S1 S2 A2. If we do the same thing similarly for the other chunk what we get is S1 S2 S0 A0. So tester gets almost equal chunks except with different public keys and different order but it's not so difficult to address these issues. The first point is that thanks to gen trap all of the public keys have common prefix A bar and the second point is that in ring LWE we know that the si correspond ring elements so they commute under multiplication so that's why cycle tester works in ring setting. However unlike other cryptographic constructions the ring based version does not immediately translate into plain LWE mainly because matrices si do not commute. Using tensor ring technique for LWE we get commutative of this i and then consequently we get plain LWE construction. I'm not gonna get into that because of time but you can refer to the paper to see more details. Now I want Venkata to continue the talk on KW construction. Thanks. Hi so this separation will be based on joint work with Brent Waters and in this part we show an LWE based encryption scheme which is not K circular secure and this K could be any polynomial in the security parameter and while both separations have some common features the two constructions are inherently different and as a result each has its own pros and cons. In particular our scheme is more complicated but it does not require the common random string, does not require commutativity and can handle poly length cycles. So as a warm-up I'll first present a separation for K equals to 1 and as Navid mentioned separation for K equals to 1 is pretty trivial. You can convert any in-CPS scheme into one that is still in CPS secure but not one circular secure. But the reason I'm presenting this is because it has more structure and it will lead to a more general K circular secure counter example. So we need to present three algorithms the key generation encryption and the testing algorithm. First the key generation. This chooses a large number of random matrices r1 to rl uses each of these matrices as randomness for generating the ai matrices using the GenTrap algorithm. Next it chooses a large number of matrices x1 to xl and plus minus 1 scalars y1 to yl which are random subject to the condition that summation yi times xi is equal to 0. The public key consists of two l matrices the first lr yi times ai's and the remaining lr the xi matrices. And the secret key is simply the randomness used for generating the ai's. Given this public key let's see how the encryption works. The encryption also consists of for each message consists of l components and each of these components is used as randomness for GenTrap. So each of these components mi gives us a matrix zi. Next you choose a short matrix s and the ciphertext consists of l components where the ith component is zi inverse of an approximation of s times xi. So given this public key and the ciphertext let's now see how the test algorithm works. The test algorithm is really simple. It takes the it takes the ith component of the public key multiplies it with the ith component of the ciphertext and then checks if the sum is close to zero to see why this works. Let's look at the encryption of the secret key. So the ith component is ai inverse of an approximation of s times xi. So now if you multiply this ith component with the ith component of the public key you'll get yi times ai times ai inverse of s times xi. So this is nothing but yi times s times xi. So if you sum them all up it is approximately s times summation yi xi which is equal to zero. So in this way if you have an encryption of the secret key then the test algorithm outputs zero or a short matrix and instead if you have an encryption of zeros then the final matrix that you get is some large matrix and hence you can distinguish between the two scenarios. So now how do we go from k equals to one to k greater than one? So for this we need to modify our construction and for this our scheme will have the key gen and the encryption algorithms will have two modes of operation and the test algorithm will be using the first public key and the k ciphertext. So this is what it will look like and for simplicity for now let's assume that the first public key and the first ciphertext are of the form that we've already seen. The remaining ciphertexts are computed in such a manner such that if they form an encryption of the secret key then if you combine each column then you get yi times xi for each column. So if these form encryptions of the secret key then if you combine each column then at the bottom you get via some matrix times yi times xi. So actually the main action is happening with only with the first public key and the first ciphertext. The other ciphertexts are merely propagating the yi values. So let's see how to implement this. For this we will first extend the cycle tester framework of BHW to have two special modes called the leader mode and the follower mode and the leader mode is what we've already seen. So in this abstraction we have five algorithms two for the leader mode, two for the follower mode and one the tester algorithm. The keygen and the encryption algorithms work as expected. The keygen gives out public keys and secret keys and the encryption gives out ciphertext. And we require in CPS security for both the leader mode and the follower mode and the test algorithm must be able to distinguish between case cycles and encryptions of non-cycles if the first public key and the ciphertext are in the leader mode. So if we can construct these five algorithms then it's easy to see how it's easy to see how this implies a case cycle tester. I won't talk about that in this talk but it's easy to transform the case cycle tester with leader follower setup to one to the BHW case cycle tester. So let's now look at the five algorithms. First we'll look at the leader mode which is very similar to the one cycle separation that we already seen. The key generation algorithm chooses a bunch of matrices using the gen-trap algorithm and then it chooses the xi matrices these yi scalars and construct the public key as shown. And the leader encryption algorithm is also as we've seen, we'll use the message components as randomness for gen-trap, compute zi matrices, choose a short matrix and the ciphertext consists of zi inverse of an approximation of s times xi. The follower mode is also really simple to generate a follower mode public key, you first choose l matrices using the gen-trap algorithm. These matrices correspond the public key and the randomness is the secret key.  So note that this is very similar to the leader encryption except that we are using s times ai instead of s times xi. For the test algorithm we have these, we have the first public key and the k ciphertext we compute the product of each column and then check if the sum of the products is close to zero. To see why this works let's look at the case for k equals to 3 and we have the three public keys where the first one is in the leader mode, the remaining two are in the follower mode and we have the three ciphertexts where the first two ciphertexts are in the follower mode and the last one is in the leader mode. So now let's look at the first ciphertext which is an encryption of sk1 using pk2. This is nothing but a1i inverse of an approximation of s2 times a21. Similarly the second ciphertext ct3 is consists of components of the form a2i inverse of an approximation of s3 times a31. The last one is in the leader mode and it is a31 inverse of a3i inverse of an approximation of s1 times xi. So now if you multiply each column let's look at the first column then if you multiply the first two terms you get y1 times s2 times a21 then multiply that with the third term you get y1 times s2 s3 times a31 and then if you multiply all of them you get y1 times s2 s3 s1 times x1 and so on yl times s2 s3 s1 times xa. So if you sum these all up the sum is close to zero because summation yi times xi is zero. So that concludes the construction I won't talk about the proof. To conclude we show separations between cpa and cca security and ksocular security and some of the techniques used are telescoping products and tensoring lw and looking back so testing cycles can be seen as a very simple form of computation on encrypted data. So a question natural question is can we use these techniques for richer computations on encrypted data. That concludes the talk. Thank you.


I am Saransh, I am pursuing an undergraduate degree in computer science and maths at the University of Delhi and you guessed it right, I am from India. I like Python and Julia and I like open source research software. And I maintain a few of them listed out here, PyBam, Python battery mathematical modeling, Backbot which is just short for battery bot and Vector which is not an acronym, it stands for Vector itself. And I love going to do a lot of them, specifically the open source research software. You can learn more about me on the website and again from my shirt it looks like I like superheroes. So going through the table of contents really quick, I will be starting with the introduction, covering basics of unit testing and code coverage, then running testing code coverage but not in a sub-process yet. Then we will be configuring a complete pipeline including some YAML and some code code magic which would automate everything, every test and the code coverage values. Then we will start working with threads, we will run these tests inside a thread and see if that affects code coverage or not and I don't want to spoil it for you so we will look into that at that section. Then we will move ahead to sub-processes, like what are sub-processes, why and how and then some basic data structures that you should be concerned when you're using sub-processes while unit testing. Then running tests in a sub-process and this would be the part where we would identify our main issue and then we will push everything to remote, see how the issue is still persistent and then we will work on a solution for that. Alright, so what is unit testing? A very basic term and let's get started with the brief introduction to come. As it says on the slide, unit testing means writing extra code to test your user-facing code or the main code that your user would be using and this process should ideally be automated so you should not run unit tests every time you make a change but it should run automatically using the pipeline. We will be using the unit test library of Python for this talk and there are a lot of Python libraries that are shifting to PyTest in most tests but for this talk, let's stick to the unit test and maybe some other libraries next year. Moving ahead to code coverage, again as the slide says code coverage is a percentage value that shows how much of your user-facing code is actually covered by the unit test that you are writing. This helps you in finding missing tests but again in an automated way. So getting to a very small example of unit test, let's say we have a feature that adds two numbers in the form of a very simple function and we can write a unit test for that function. This is a standard format of writing unit test. We inherit the unit test or test case class and that enables us to use some assert methods that are provided inside that class and there is a whole list of assert methods that you can go to a particular URL and check it. I think I have linked in my slide yes. And then we check some edge cases to make sure that a unit test are working fine and they are not just a hoax and then the last if underscore underscore name the double underscore statement works is again a pretty standard way of how we write unit test. This basically ensures that our unit test runs when we are running a module and we can run all of them at once. So if we go ahead and write Python hyphen unit test with a hyphen v that is basically to prettify the output. It shows us all the unit tests run well. We can do the same thing with coverage then with the coverage run command and then pass hyphen m unit test and hyphen v hyphen v again for prettifying the output and it does the exact same thing but it generates a dot coverage RC file with it and then we can use that particular coverage RC file using the current coverage report and so if we do coverage report it would show the coverage of the calc module that is calc dot pi and test calc dot pi but we want to omit the test calc dot pi code because that is not a user facing code that is test that we wrote for a main feature so we can omit it by using the hyphen hyphen omit option and then it shows us that our coverage is 100% that means we're covering everything that a user would be using. There are other commands such as coverage HTML which you can use to visualize the coverage even better and a lot of these options are available in coverage documentation so I'd highly recommend you to check that out. Then we move on to why unit testing and code coverage because now why should I increase my already huge open source workflow to include unit testing and code coverage reports. So there are a lot of points that makes them that makes using unit testing and code coverage a very good candidate so first it makes your code more reliable that means when a user comes to your code base they know that the code is tested and if a certain breaking change happened then you would know how to fix it or if even you don't know how to fix it or at least know that a certain breaking change has happened that is making your code crash which you'll know through unit tests and it obviously improves your code's quality alongside testing it it makes your code more maintainable that means it makes it easier to accept code contributions from other people now you don't have to worry about if that code contribution is breaking your existing code base that would be tested out by the pipeline that you write hence making your code base more maintainable then it lets you check faults so if your existing code has a sudden breaking change or a new feature breaks something you'll know exactly where the feature is breaking something because that particular unit test will be failing then it lets you keep the production life keeps the production master or the main band safe and your user base won't go down moving on to coverage it definitely pushes you to add more unit tests but it also tells you where the unit tests are missing and how you can improve the coverage of your code base and then it also helps you identify any bugs in your code base but not always the bugs can make way through unit tests without being detected so in all it's a very good addition to your code base and most of the open source libraries use it and you should too use it maybe not in your personal projects but definitely the projects that other users would be using so don't be this person a person who does not write any unit tests and would do anything to skip writing unit tests or this person who writes the first line of the project and unit test it unit test it or is addicted to unit testing that means the right unit test before even writing the code instead maintain a balance so you should go up through this pyramid so the first priority should be writing basic features of your project that means your project should be usable then you should add and improve the unit test which means your project would be reliable and the users would trust you even more the next step would be to automate these tests and coverage your lowest tests are missing and you don't have to worry about running them again and again everything would be automated and the last step or according to this tutorial or the top this the last step would be making the unit testing making unit testing mandatory so now you don't have to worry about a random person accidentally breaking your project instead whenever they add a new feature they would have to add a unit test along with it and then we can explore more better testing such as integration tests which test different parts which says how different parts of your code base integrates together but we won't be talking about that in this talk so finally let's move to setting up a dummy project for this talk very simple project a calculator file named as cal.py and and test for that name test and so cal.py so right now everything should work fine and it should give me 100% coverage so let me see okay is is the code visible or is only the presentation visible I have VS code on my screen but I'm not sure if it is visible just a minute I'll share my complete screen or I'll share the VS code I think the screen should be visible yes so a very basic calculation or a calculator file with some tests written for the same and according to a slide it should work very well so if I go to let me open up the terminal and let's see it into dummy project and alright so the first step would be to we were using the omit feature of coverage.py inside the command line but a visor option here would be to add a .coverage .coverage RC file which would also be beneficial for the upcoming sections of this talk so you can specify the coverage configuration in this file and coverage.py would automatically note that up it is written in the classic terminal or any format and it has a lot of sections and a lot of fields which can be exported for documentation so if I go ahead and run the coverage using this command again coverage and hyphen in the test and then hyphen review for the pretty output it executes all the tests it generates a .coverage file that we discussed about and this coverage should be ignored when I go ahead and write coverage report because that is how we have configured it it knows that file and everything works out next let's go to github and create a new repository for this then we will be automating everything so that we don't have to care about the tests let's name it euro python and if you have code code already configured it would show you the option here but if you don't then you can just sign in and it would automatically come up we create a new repository till then I will set up a gith repository locally adding files to the staging area and committing stuff let's say initial alright we can go ahead and push that local repository and I already had ignored in place to ignore the cache and .coverage file .coverage file should ideally not be kept in your version control system because it is changed every time coverage runs and you will be running coverage a lot if you have a bigger project so everything working fine and we have created a remote repository next step would be to configure an actual CI pipeline for this we will be using yaml and codecove getter provides this really nice tab actions and we can configure whatever we like getter gives us a few solutions we don't want a python packet but we want a python application and we will configure it we can do everything here inside this particular editor and let's say I want this would run on every push and on every pull request in this particular branch we don't need the permissions thing and for the job let's say we want two jobs first would be checking the style of the file with flake it the linting part and then we would be running the actual unit test and uploading the coverage report to let's say codecove so for that I already have a file in place so that I don't have to write it all from scratch right now so the style job I can copy it here it would set up python 3.9 interestingly set up python before the version 4 requires you to specify the python version here we could have skipped specifying the python version if we were using v3 but before it requires you to specify the version it installs upgrades pip installs flake it and then just runs flake it style issues it would automatically give an error and let us paste that here so the build part again let's skip to python 3.9 so the libraries don't give any error and for installing dependencies a good rule is to use python-nm before pip to avoid any particular errors especially in a remote system we don't need flake it we don't need file test we will be using coverage and we don't have any requirements right so I can skip that glinting with flake it we've done in a different job and then we're not testing with pytest we are testing with unit test so let's say run unit test and generate coverage report here we can check our old command coverage run hyphen and unit test hyphen we this would generate a coverage report but then we need to make sure that it gets uploaded to codecove and speaking about codecove I think it this would be a really nice time to go to the codecove and like sign in if you don't have an account already so I already have an account so it will automatically redirect me there so these are all the repositories which are connected with github and this would appear right there this is how we were generating coverage report locally the dot coverage file next I think this to make it a bit more realistic we'll add the need style the needs field here just to make sure that if our style check fails we don't unit test it so we want users to write the code pretty first and then test it the next step would be to upload the coverage the coverage file generated here to codecove for that we should have an action here report for action yes so let me check out the usage yes it shows that I can basically put it like this and then some additional arguments or options that I can pass in which we don't have to care about right now next step would be to add that particular action here so let's say upload coverage report and then put this thing here and just to be on the safer side let's use we do I think it looks good let's rename it to Euro Python and just to make sure that it is good and I haven't done any made any typos I'll copy paste the already written one I think both of them are identical at this point and let's rename this to CR so this would run on every push and every pull request on this particular repository no matter what the branch is this would first check the style that means run flake it if that errors out it won't proceed ahead if that passes then it would proceed ahead and test everything and upload a coverage report so making the complete making a complete CI pipeline you don't have to do anything manually everything is then automatically all right let's commit this directly to the main branch and ideally this should have started some checks here if you would guess the actions part is running this would first run the style part if that passes it would go to the build part and if the build succeeds you should be able to see the repository here in code code all right let's wait for it spoiler alert it would work the build check has started so the test went fail I think yes everything passed and then the upload coverage report to code code also succeeded and the result URL is available here you don't actually have to go through there it would take some time but code code should automatically show that repository here I already have a test repository from yesterday here yep it should take some time all right it's here it shows that the coverage is 100% which we were seeing locally and if I go to files it shows only a single file and if I open that file it would show me which particular lines are covered which are all the lines this would also this is how the interface would look like if you do coverage HTML but that would look locally instead if you want to automate it use coverage another option is cover also but I personally prefer coverage code code mode all right our repository is here as well you know python if I open that up quick it should show me yes I have made one commit that has 100% coverage the root directory and only one file some pretty graphs and again that particular file and how the coverage is for that particular file all right so everything works right now which is good next let's follow it so I think yes let me create a PR here to show you how code work can work but all right let's go this one yes code code comes with a nice patch to let your users know users know how much coverage your repository has let's create a markdown batch and go to a repository doing everything on the remote repository create a readmify let's rename it to Europe I can talk add a code coverage batch and also the GitHub actions come with a nice looking batch that would tell you users when the repository is down or when the tests are failing and when you can when everything is passing copy the status batch all right so if I do this right and I create a new PR so yes the test should run automatically because we configured our CI that way first of all the style test would run and after that the root run which is unit testing and it's running over full version portion now as we're running out of time I think I'll move ahead alongside as a test run and everything should work out of the box if we check out that PR right yes going to the next part which is threads now one might want to run the unit test in threads this would come with some minor changes in your code so for example you cannot read them directly from threads rather you'd be using a thread safe data structures like built-in path indexes or usually most of the built-in data structures are thread safe you will be appending that value or adding a new key and adding the value here and then you'd be accessing that in the thread so here when we are asserting and we want to make sure that everything works fine we are running the test inside a thread passing arguments like this and additionally passing a dictionary to capture the return values if I run the test and code coverage on this particular code it would run as fine as it was running before so because threads usually are meant to share memory and it won't affect coverage.py in any way the output won't be affected in any way if I use thread or if I don't use thread I won't actually be running this because we are running late on time by a thread why would you want to run a thread first off it would allow you to execute test parallely a lot of open source software use this to execute test parallely and save time and resources so for example if you have a really large testing suit then you might have to pay to get up to allocate you a larger amount of CIT time per month so that you can run your test without any failures. If you want to check out the examples and you can search this particular expression on GitHub and you'll find a lot of repositories use threads. Some additional things you'll need to take care of when you are using it. Unit testing is that ensure multiple threads don't access a single variable at a given time which is you don't have a consumer producer consumer type of problem and you don't run into tech logs etc and then use thread save built-in Python dictionaries or other Python data structures which are built-in data structures are thread save to return values and everything would work if you would use thread so let's switch to the pull request that we made so all the checks are passing and in addition there are two more checks which are automatically added by code code which shows the coverage is not affected at all and the coverage report is full that means 100% and additional information so this is everything is automated if someone comes ahead and contributes to your repository you don't have to care of running the test and running the coverage manually instead everything is done here I can go ahead and merge the pull request so that repository looks a bit nicer yes yes the badges are working very well everything is passing and code code is at 100%. Next if we go to sub-processes so sub-processes the memories are not the memory is not shared but there are specific functionalities through which you can share memories but we won't be discussing them here rather we'll use a queue to return values and this would this queue would be taken out of the multiprocessing library itself so this is how we would be running our test we would be creating a process running the targeting the add function passing the arguments and arguments will be passing the queue additionally to get the result and then we'll save.assert to check if the result is working fine all right I think I'll run this quick I'll move out the calc and test calc out and then move the process one in and calc process yes so I think the calc process one disappeared all right so I might not be able to run it right now because of the time shortage so if we run this thing we will note that our coverage value drops down it goes down to 60 percent around going from 100 percent to 60 percent because coverage cannot automatically detect if you're running detect as if you're running them inside a sub-process or if you're using multiprocessing or any other processing library to run the tests inside now why are we using sub-processes when the coverage value is going down and it is making our lives difficult again you can run tests parallelly saving CI diamond resources both but this is a bit more inefficient than threads if you just want to execute test parallely but you can also step stop test midway if they're taking too long and restart them so if you're having some probabilistic tests in your repository you might want to use sub-processes to run that again a lot of repositories use sub-processes but some of the few and few ones to name pi bam bad bot gnii etc and pi bam and bad bot are the ones that inspired this talk later does know that you can use sub-processes and how they would affect the coverage value of your codebase and again use multiprocess save data structures like q and maps to return values this work does not work ideally but I guess I cannot get it to run right now and I don't have enough time to figure that out so why are we why will we be getting the wrong results because this is what how the how coverage dot-pies documentation put setup so measuring coverage in those sub-processes can be tricky because you have to modify the code spawning the process to invoke coverage dot-pies so coverage dot-pi would not automatically know that you are running tests inside the sub-process rather you need to invoke coverage dot-pi to run the tests a fix for this I think let me add that and run the coverage quick so you can actually see that the coverage is written down so I'll have a test repository here and yes the calc process for you so everything is same as it was before instead we're just calling this test out of a process here and we're using q to return values let me run the coverage and high-finance test and with the high-finance it runs all the unit test fine and if I do coverage report the coverage actually goes down whereas we're testing everything this is this part of the site that it does not work naturally rather you have to configure some stuff the first configuration would be to add these particular lines in your coverage RC file that means telling code coverage dot-pi that you're running parallely and the specifying multi-processing in the concurrency part but here you can replace this with the particular library that you're using to spawn a particular process so if I go to alright let me I think I'll push this up onto GitHub to make sure that code code gives the same result alright process and then we push yes set upstream so now that we have another full request I'll open this up quick right I might not have anything like that so it is the time the test runs we can move ahead and if I add these particular lines coverage dot-pi should automatically note that I am running test insider makes a sub-process but any library that could be spawning that sub-process you can replace that library here and if I do the same commands running the test and generating coverage report alright some so it first of all it goes ahead and creates different files for different processes that and these files are named differently because of this particular option parallely equal to true now we can use coverage combined to combine these files and then a classic coverage report which would so coverage combined combines all these files into a dot coverage file that we've been seeing until now and then the coverage report gives us a hundred percent which is what we were expecting alright s pass the code code thing might take some time so I don't want to take more time here in the session this was the config fix how you can fix this particular problem by editing your configuration file and then if you edit your CI and push it up then code code would eventually notice that the coverage is wrong and it will error out on that full request another fix would be to pass the concurrency option in the CLI itself but this particular thing works only with multiprocessing that means if you're using some other library to let's say spawn a sub process then this would not work and you should stick to the the configuration file fix so if I go ahead and I remove this part here concurrency is equal to multiprocessing then I can still run this thing and pass in concurrency here it still generates a lot of files I think four of them are for different sub processes and one of them is a general overview file then we can coverage combine these files and the coverage report now gives us a hundred percent coverage so and if again we push this alright I think yes I think we did not edit our so if everything went well and if we edited our CLI then the code code part should give us an error here that the coverage is dropping whereas we are testing everything inside sub processes alright so our problem is solved now so we can run sub test inside a sub process and inside the thread without like taking down the coverage of a code base and keeping it all looking pretty for the users as well and everything works now so things to take away from this session it was a bit rushed but I hope you got the basics of it we went through basics of unit testing and coverage then we had some fun with CI pipeline using GitHub action and code code then we started running tests inside threads inside sub processes and then at least locally we discovered that the coverage was going down it would definitely happen there but happen on the remote but maybe some time maybe and I'll have it for another talk next year and then the code coverage how we can fix that error that we are getting using two particular solutions editing the config file and then passing the configuration directly into our CLI if we are using multiprocessing as a library to spawn sub processes or to spawn different multiple processes and yes that could be it thank you so I know it was a bit rushed because I couldn't figure out the echo part in the starting of the presentation but I hope you get something here


Does Matthew 5.17 or any other passage for that matter teach that we should keep the law? Thanks more Christians, welcome back. This particular passage was brought to my attention and I want to give it some attention to see if indeed it teaches that we should keep the law. Now, I'll say this upfront before I go into it. No, we should not keep the law. There are some dire consequences for trying to keep the law, even to try to remember the law. I understand that some people might want to maybe keep some sort of Jewish roots or what have you, but that is not prescribed for us, especially if we are not Jewish to begin with. Gentiles wanting to become messianic or Gentiles wanting to adhere to certain facets of the law, one we're never told to keep any portion of the law. As a matter of fact, Gentiles are not familiar with the law in the New Testament. We do see the therapy that come around who try to tell the Gentile believers that they should first convert to Judaism, receive circumcision and so forth, and then place their faith in Jesus Christ as the Jewish Messiah. But that is unlivable. As a matter of fact, Paul calls that a gospel, a different gospel that really is not a gospel. But before we even get to that, let's go to Matthew chapter 5 verse 17. In there he says, Do not think Jesus says that I have come to abolish the law or the prophets. I did not come to abolish the law, but to fulfill the law. And some folks might say, well, see, he's saying that he didn't come to abolish the law, but look what he says. He says he's come to fulfill the law. The question is, what does that mean? We'll get to that in a second, but let's continue reading. He says in verse 18, For truly I say to you until heaven and earth pass away, not the smallest letter or stroke shall pass from the law until all is accomplished. Well, the question is going to be then what is meant by until all is accomplished? All of what is accomplished? We'll get to that in a second, but let's continue reading. Verse 19, Whoever unknowals one of the least of these commandments and teaches others to do the same shall be called least in the kingdom of heaven. But whoever keeps and teaches them shall be called great in the kingdom of heaven. Now, I think one key would be to kind of get a good understanding of what Jesus' whole point is. First of all, he's not just bringing this passage out just out of thin air. He's in the middle of a conversation in the middle of a thought and he wraps it up in this very next verse. He says in verse 20, For I say to you that unless your righteousness surpasses that of the scribes and Pharisees, you will not enter the kingdom of heaven. Now, his point is he's focusing on the kingdom of heaven. In other words, salvation. Now, is salvation brought about by the law? Well, remember at this point in time that Jesus is making this statement, what is still in effect, the old covenant, the law. He's speaking to these Jews and if anyone is to go around telling anyone to annul any of this, well, then they are, they're in danger. We are to keep them as far as he's concerned at this point in time. Similarly, no one is to teach someone to tell someone not to keep it, but we are to do our very best. Now, the point of the law, and lest we forget is that we are not going to be able to adhere to, we're not going to be able to keep. There's not been one person safe for Jesus who has ever kept the entirety of the law. Everyone is guilty of the implication of failing in the law, which is everybody who was under the law. And that was a problem. Now, your righteousness was brought about by what? Your works in the law? No, your righteousness was brought about by your faith in what the law ultimately brought, which was what? Atonement. Let's go back to it. Let's look at what Jesus says. He says, I didn't come to destroy the law or to abolish the law, but to fulfill it. Well, how so? Recall, the law requires that there be atonement for sin. How was that done? Obviously by the priest who's a mediator who would go before the Lord and there would be this laying on of hands on the scapegoat. All the sins are professed on the head of the scapegoat and sent away. In other words, signifying that their sins of the people are taken away. And then also we have this perpetuation, this shed blood by this animal blood sprinkled on the altar. And so in that regard, atonement was made for Israel. So what is Jesus going to do? Jesus is going to do the exact same thing. And in this case, he's going to play the part of all three of the elements, the high priest, the scapegoat, the land that takes away the sins of the world. And then thirdly, he will be the perpetuation. He would be the one who would provide the shed blood. So in that regard, Jesus fulfills the law. How do we know so? Because after that's done, there is no more need for the law. So what does he do on the cross? He not only ends the old law, not only does he bring it into its requirements, but he then also inaugurates for Israel the new covenant. Paul makes a mention of this in Romans chapter 10. So let's go there. Verse 4 says, for Christ is the end of the law for righteousness. How? Look what he says, to everyone who believes. And in this case, the ones who are believing, if you are believing in what Christ has done, one, it's an end of the law. But then it brings about righteousness. Your faith brings about righteousness. In other words, your faith makes you right. Not your works, not your deeds, not your adherence to the law. Now this was always what God had in mind, which is why he says, going back to that passage, verse 18, he says, for I say to you that until heaven and earth pass away, not the smallest letter or the first stroke shall pass from the law until all is accomplished. All of what is accomplished? This ultimate atonement. One, as the law requires, but then be fulfilled in Christ. Which is why he says later on in verse 20, he says, for I say to you that unless your righteousness surpasses that of the scribes and Pharisees, you will not enter the kingdom. Well, what was the righteousness of the scribes and Pharisees? They wanted to be someone who gave the impression that they were keeping the law, all the tins of the law. Well, that's what their righteousness was based upon. We already know that that particular type of righteousness that they tried to obtain cannot be gained by them trying to adhere to the law. Why? Because no one can do it. Paul covers us again in Galatians. Remember, in Galatians we have this issue of these Judaizers who come and they want to make them become adherents of the law. And Paul is bothered by this. As a matter of fact, he even calls them foolish and wonders and marvel at how quickly they are turning from this faith, believing that, oh, you know what? It's no longer about our faith. I guess we have to also keep these. And so Paul rebukes them as well. But then in chapter three, starting in verse 23, Liberty says, he says, But before faith came, we were kept in custody under the law, being shut up to the faith, which was later to be revealed. In other words, we had no idea what was going to be revealed. We didn't really know what this whole point purpose of this was.  Look what he says. Verse 24 says, Therefore the law has become our tutor to lead us to Christ so that we may be justified by faith, exactly not by works, but by faith. And so what we find out is that in trying to observe and to keep the law, we find out that none of us, at least none of them, were able to do so and they would struggle and see that I can't do this, which is the point of having this atonement at the end to make atonement for your souls the same thing now. And so what does this do? It shows that we can't do it. We can't be right. We can't be justified by our works. We are only justified by our faith in his work on the cross. He says in verse 25, But now that faith has come, we are no longer under a tutor, for you are all sons of God, how? Through faith, for you are all baptized in the Christ, have clothed yourselves with Christ. There is neither Jew nor Greek. There's neither slave nor free. There is neither male nor female, for you are all one in Christ Jesus. And if you belong to Christ, then you are Abraham the Senate, heirs according to promise, not according to the law, but according to promise. And how does this come about? By our faith in what he's done. And so returning to the original passage, does Matthew chapter 5, 17 teach or any other passage teach that we are to adhere or to keep the law, keep the different elements of the law, trying to figure out which portion of the law is more important? No, that's why we don't have a passage in the New Testament telling specifically us as Gentiles to keep or to adhere to the law. As a matter of fact, those that are reviewed are those that are trying to bring about this idea of keeping the law. That's one group that's reviewed. The second group that's reviewed are the believers who are going to the law in order to justify themselves or to make themselves feel even better about one having faith and keeping the law. Paul calls them foolish. Let's not do so because there is no passage that tells Christians that we are to keep the law. Amen.


What's going on guys? This is Steve from SurfStationStore.com I just wanted to wish you guys a Merry Christmas and a Happy Holidays I'm just here to talk to you guys about day one of our 12 days of Christmas sale We have got 15% off of all skateboard decks and accessories 20% off of all lumb board completes Penny's one of them, Sector 9, we've got Carvers and we've got 25% off all protective gear like helmets, elbow pads, we have any knee pads all of those, so if you come by the shop or check us out online at SurfStationStore.com you can grab some new skateboards and skate accessories today for the day one of our 12 days of Christmas sale


Washed-up comedian Rob Schneider memed a little bit too close to the sun at a Republican event and ended up getting burned and by burned I mean canceled and by canceled I mean he's saying that this is another attempt to cancel him now This comes after he has increasingly aligned himself with conservatives over the years after he got redpilled himself And the Rolling Stone has a pretty comprehensive timeline about his redpilling It started back in 2012 and 2013 when he came out as an anti-vaxxer Then endorsed a Republican and accused Obama of being a secret Muslim only to then do the enlightened centrist pivot in 2020 before going full Republican in 2022 and Subsequently getting his own comedy special on Fox News where he told the same pronoun joke literally every single Right-wing comedian ever has told his pronouns are he and ha Get it because pronouns are silly and trans people are goofy.   He chose to do that So I mean good job Rob now I have to also show you the quote from Indie wire because he deleted that tweet So I guess he's not willing to stick to his guns even though he said this a year later on Glenn Beck's program Are you willing to lose it all for what you believe? Absolutely, so brave. Hey Rob. Why'd you delete those tweets? Seems like you know you don't have that much confidence to be bold and edgy unless it comes to you punching down on Marginalized people and telling the same pronoun joke that every other right-wing comedian ever has told But I mean that's as far as he's willing to go when it comes to pushing boundaries, right? To him lazy and racist jokes based on stereotypes and derivative bullshit is his bread and butter and Conservatives, you know, they're oftentimes more than happy to laugh at those things so long as you're reinforcing Their worldview and that's kind of why he cozyed up to them in the first place It's why a lot of comedians cozy up to the right because they'll clap like seals as long as you tell them what they want to hear Regardless if you're funny or not However, he did get a brutal wake-up call while he was in a conservative safe space Daniel Lippman of Politico reports Former Saturday Night Live cast member Rob Schneider delivered a comedy set so off-color and off-putting to a group of prominent Republicans late last year that the hosts cut their performance short and later apologized to attendees Daniel Lippman reports Senator Cindy Hyde Smith walked out during Schneider's performance Which occurred at the holiday gala hosted at the Waldorf Astoria by the Senate working group a networking group for senior GOP Hill staffers downtown alumni and other corporate and individual members the show was supposed to last at least a half hour But SWG executive director James Kimmy stopped it within 10 minutes after the comedian made raunchy and inappropriate jokes People present for or familiar with the performance said including some aimed at Asian people including a crack about Korean whore houses So original Schneider's set was gross and vulgar Hyde Smith's spokesperson said she didn't have to listen to it And so she got up and left the approximately 150 attendees which included more than 40 Senate chiefs of staff received an apology email the next day quote While we do our best to ensure every aspect of our program is professional courteous and appropriate We sincerely regret that the entertainment last night's program fell short of that goal. It said ouch So he probably thought look Republicans love racism. They're super racist, too So I can say whatever I want. I could let it all hang out, but Maybe he just went a little bit too far but I do wonder if he's gonna accuse Republicans of Cancel culture and maybe call them a bunch of snowflakes My guess is that he'll passive aggressively accuse people of trying to cancel him While being as vague as possible so as to not offend the conservatives that he's aligned himself with oh wait That's not a guess. That's actually what he did So in response, he promoted his special titled woke up America I wonder what that's about and he followed up by saying my Korean whorehouse joke is now streaming on Netflix and has been for the last Three and a half years the delayed rescheduled late onset third stage cancel attempts can be seen at your own leisure Why'd they pick tax day and speaking of snowflakes?  In other words millionaire comedians are the real victims here now first of all No, Brazil is not a dictatorship second of all He doesn't understand the Scotland law that he's talking about as it literally cannot be used to censor offensive jokes from comedians It is aimed at stochastic terrorists who use their platforms to incite hatred against marginalized groups and Transphobes like JK Rowling have cried freedom of speech to denounce the law and dared the government to arrest her for hate speech But as a supposed lover of free speech She's the one that weaponized the United Kingdom's defamation laws to bully her critics into silence For example journalist Rivka Brown of Navarra media was forced to tweet this at risk of being sued on March 13th I tweeted that JK Rowling is a Holocaust denier that allegation was false and offensive I have deleted it and apologize to JK Rowling, but here's the thing She did engage in Holocaust denialism this tweet where she denies that Nazis burn books about trans research is still up till this day But her attempt to silence her critic ended up backfiring after JK Rowling is a Holocaust denier started trending on Twitter So she's learning about the Streisand effect the hard way now The point is multi-millionaires like JK Rowling and Rob Schneider They don't have to worry about their free speech rights, right? They might want to pretend that they're the victims, but they're both incredibly rich and this is somebody who has Stand-up specials on Netflix even has his own show on Netflix. I believe it's a sitcom. So they're not the ones Who should be worried as much as they want to portray themselves as victims It's the people with no money and no power like Rivka Brown that could lose it all for saying the wrong thing or critiquing the wrong person But of course, you know, he's gonna cry free speech in response to this story because that's just what you do after getting canceled That's part of the right wing comedian playbook The only problem is that the call is coming from inside the house, right?   You're not getting canceled you insufferable prick People just don't think that your jokes are funny anymore because they're not Okay, I'm not gonna carry on to work I realize I'm just work I realize you okay, I always do your course test work. I worry you look Olympic work I realize work I realize I realize you work I realize you work I realize you work, I realized


This research paper examined the potential of using gum-based formulations to extend the shelf life of entomopathogenic fungal spores used in biological control applications. The authors found that gum-based formulations containing either acacia or hercitella gum could maintain the viability of hercitella citroformis canadia for up to three months when stored at four degrees Celsius. This suggests that these formulations may be useful for increasing the shelf life of entomopathogenic fungi used in biological control applications. This article was authored by Rosa A. Flores Virial, Alonso A. Orozco Flores, Cervando H. Cantabernol, and others.