Hi everyone, welcome to Hyperledger Foundation's in-depth webinar with Espeo. Please just give us a moment to allow for everyone to join and we will get started shortly. Okay, welcome everyone to another session of Hyperledger Foundation's in-depth member webinars. Today as you can see we have Espeo blockchain. They're going to be talking about the multi-cluster deployment of Hyperledger Fabric Network using the Fabric Operator. We have Marcin who's going to be presenting that information with you today and answer any questions you have as well as his colleague Simone Bidula as well who will be joining as well. I'm just going to go over a couple of quick housekeeping items. One, first of all, to share that all are welcome here at Hyperledger. We do conduct all of our meetings and all of our events under the Hyperledger Code of Conduct and the Linux on Ancient Antitrust Policy, so please look for those on our website or on our wiki if you'd like to learn more about that. This session is being recorded. It will be available on the events page of our website, but also on our YouTube page under the webinar playlist soon after the event. We are also live on YouTube as well. Any slides that are available will be on the event page of our website, the webinar page that we have on the hyperledger.org. These sessions, these webinar sessions are really intended to be a time for you to learn and connect with the speakers, so please feel free to raise your hand, post questions in the chat or the Q&A box. I will be monitoring it throughout the call or throughout the webinar, and Marcin and Simone may take some of your questions throughout the session, and as well we will leave time at the end for questions, so feel free to jump in and speak up. This is your time to really engage and learn with them. I'd like to invite Marcin to let us get started. Perfect. Can you see my screen? Yes. Perfect. All right, so hello everyone and welcome to the webinar. Today we will talk about the multi-clustered deployment of Hyperledger Fabric Network, assisted by Hyperledger Fabric Operator. Let's start with a brief introduction about the presenters in the company, and we'll mention what you will learn today. We will discuss the business problem, so how do we try to find the client's needs, what problems we had to resolve to achieve them, and we will do an introduction to Hyperledger Fabric Operator and show you the proof of concept of our solution. A big part of the presentation will be the demo, where we will actually show you how to deploy the network on two clusters, and after that we will sum it up and proceed to the questions the audience will have any. Also of course during the presentation you can ask them, so I can try and answer them on the go. So after this meeting you will know more or less how things work in our company, how we discover requirements and tools to meet them.  We are representing SPO Blockchain, which is a company based in Poznan, Poland. We introduce Enterprise Level Blockchain Innovations to Business. We are a Hyperledger Fabric Certified Service Provider as one of 17 certified companies. We have around five years of professional experience and we can help you with Blockchain Consulting and Development. My name is Marcin and I am a recent acquisition of SPO Blockchain. I started working for the company in March this year. Currently I'm a Blockchain and backend developer. I have experience working for industries like telecommunications, e-commerce, fintech and Blockchain. My current technological focus is on Nest, JS and Hyperledger Fabric. To help with the business part of the presentation I invited my colleague from SPO, Simon. Would you like to introduce yourself? Hello, of course. So I am in SPO Blockchain. I am also a Blockchain developer. I am also working on the Node.js site in many projects, but I started my career with a scientific study of human brain. So I was using mostly newer imaging to study the architecture of the brain. And then I moved to the IT sector as a developer and I helped clients with building solutions from the different fields like finance, marketing or HR. I was active on both front and back end and my main language is JavaScript, mainly in the TypeScript formula. And I want to share with you and convey how at SPO Blockchain we are approaching every project. So at the very beginning we are starting with the client. We strongly believe that every successful business needs to put the client at the first place in the heart of the business. So what we have learned when we were discovering and learning about the client is that the client was from the business consulting sector and it had multiple branches that were fairly independent at operational level. That means that technical and organizational levels inside these branches were independent. As a result, there was a strict security policy when it comes to the flow of the information. So every flow of the information of the branch and out of each branch has to be registered. As a result came the problem that the client came to us to resolve. So the client need was the following. We had several independent branches. We had to register the flow of information between them and it has to be done in the audit table form. So each change needs to be registered. The possible solution needs to scale well because there was a lot of these branches and the client has a great appetite for growth. And the client was also interested in extensive monitoring the whole solution. And the client was also very curious if there will be an out-of-the-box administration capabilities for managing the whole solution. So that was the need. That was the client. And based on that, we started thinking about what tools could help clients, the client with this particular need. So we started from the very bottom. And we realized that because there are multiple independent branches, they need to have a consensus of how the data was flowing in and out of them in a secure and trustworthy manner. So as we put all these things on the Blackboard, we realized that the blockchain will be a perfect solution for the client because blockchain is a way of realizing trust between parties that are fairly independent. So we started from that that we need a blockchain. Then we thought about what kind of blockchain will be perfect for our client. And we realized that we needed a blockchain that will be private. It needs to be secure by default. It needs to have extensive administration capabilities. It needs to be easily monitored. And it needs to be developed by active and engaged community. And also, again, as we put all these requirements on the Blackboard, we immediately realized that Hyperledger Fabric Network will be a perfect solution. So we have blockchain. We have a way to implement this blockchain with the Hyperledger Fabric. Now we started to think about how to scale it. And then we realized that the perfect tool for that will be Kubernetes. So Kubernetes helps clients with scaling fairly independent Docker containers. So every Hyperledger Fabric Network could be in a separate container and orchestrating and managing them could be done from the Kubernetes level. Why this is important? I will just show you one stat. So 85% of admin directors or IT managers believe that Kubernetes will be the most important and the crucial part of the stack within the cloud in the future. I am basing this stat on the 2021 State of Enterprise open source report. So one of the important and crucial part of this presentation is to show you that Hyperledger Fabric could work very well with the Kubernetes inside the cloud environment. Okay, so we know that we need to implement blockchain with the Hyperledger Fabric. It could scale well with Kubernetes. But how we evaluate, for example, that Hyperledger Fabric will be great. So as you can see here on this screen, there is a screenshot from the Hyperledger Fabric repository that is currently at GitHub. There is a lot of data. And on the next slide, we are showing you how you could uncover and use this one page to get lots of data about how to evaluate the tool, if it's good for you or not. So we are always checking if there is an open source repository, like the one that we showed you before. If it is, it means that the tool is open source and that's great. Then we are checking the number of the stars. If this number is high, it's fantastic because many people are using it and are thinking highly of the solution. So Hyperledger Fabric ticking also this mark. Then we are checking the license. We are always searching for a license that is permissible and is open to use for commercial purposes. And that's also the case with the Hyperledger Fabric. Then we are checking the documentation if it is extensive and it's covering many cases. Then we are checking if the tool was used in real business cases. Then we are checking how many pull requests and issues are raised. If there are many issues but not too many pull requests, it, for example, could show you that there are many errors in the software but the community is not engaged enough to resolve them. That's not the case with the Hyperledger Fabric. Then we are looking at when was the last commit and how many commits are inside the repository. As you could see, Hyperledger Fabric is actively developed and it has many commits. So it is a fairly extensive and a big software tool. Finally, we are checking if there is some organization that is backing the tool that we wanted to use. With the Hyperledger Fabric, we know that there is a Linux foundation. So we were feeling quite confident that with this help, this community and this tool, we could provide value to the client. Great. Thank you, Siobhan. Now that we have the problems and we have the tools to resolve them, let's actually talk about the solution that we proposed to the client. So the problem number one was the need of server separation. That was a result of independent branches of the company that is spread worldwide. They wanted us to keep a very similar or even the same pipeline for all of the branches and they had a demanding security policy. So to resolve that, we decided to make a separate cluster for each organization or the branch of the organization in this case with an additional CA server. It contains the same network structure on all clusters and each branch will be responsible for keeping the clusters running. The problem number two that we occurred was the complexity of Kubernetes. I believe it's common knowledge that Kubernetes is much more complex than the current compose. In that tool, we just need to specify the right images, ports, volumes and variables. Well, in Kubernetes, we have clusters, nodes, spots, deployments, config maps, secrets, services, and I could go on and on. It's obvious that it's more difficult as Kubernetes offers much more than Docker compose and we did not want to create all the YAML fires from scratch, handle all the network configuration or store the cryptographic material anywhere except on the clusters. So to solve the problem, we found a tool called Hyperledger Fabric Operator. The main benefit is that you don't need to know much about Kubernetes. It eliminates the need to store crypto material anywhere except on the cluster on the administrator machine, which is us, the developers or network administrators. We only have to store one private key, which is an admin access to perform operations on the network. You will see exactly what that means during the demo. It allows for ISSA integration in case the client would like to expose it to the outside world in the future and it generates all necessary configurations for us to operate on it. We just need to install a pod on the cluster and then we need to install kubectl plugin on the administrator machine. Let's talk more about the Hyperledger Fabric Operator. It's an open source solution for deploying the Fabric network on Kubernetes, as I mentioned. Currently, it's not very popular, unfortunately. It has around 150 stars on GitHub. The goal of this presentation is also to bring some lights to the project. From my experience, this tool really makes a life of a developer easier. It is being continuously developed. It has released around once a month or once or two months. It has advanced documentation and it was first created under Kung Fu Software name, which is a Spanish IT company focused on Hyperledger Fabric. But recently, it was moved into Hyperledger Labs GitHub to encourage even more developers to contribute. It is being used in production in a few projects for now, mainly by KF Software, but I hope it will change in the future. The creator of the tool, David Viejo, is very active on the repository, providing developers with a lot of help. It's also a good sign. Before we go into the demo, let's talk a few words about other technologies that we decided to use for our proof-of-concept. You will see them in the demo in just a minute. To play around with the Hyperledger Fabric operator, we had to make a choice for a few technologies for Cloud provider. We decided to go with DigitalOcean and debate with in-between cluster connection. We decided to go with Freedom as public domain provider and DNS management service. Of course, this is not the only possible combination of technologies. It should work with clusters created on any Cloud providers and with any domain provider with DNS management service. It would be even possible to use DigitalOcean's DNS service. You just have to change the name resolution to DNS service on DigitalOcean. If you want to try the development yourself, you can do it for free. DigitalOcean offers a free trial for the domain for free credits and Freedom offers free domains for up to 12 months. Ideally, for production network, we will use a private hostname resolution, but for proof-of-concept purposes, this solution was sufficient. Let's see what we are actually going to achieve in the demo. We decided to go with it. Marcin, I'm just going to jump in here real quick because we got a question from someone and it's related to the last slide that you were just on. Shane Tay was asking, what is the minimum knowledge expectations for someone who is keen to use the Hyperledger Fabric operator assuming that they're not familiar with Kubernetes? Minimal requirements would be basically to watch either this webinar or the webinar from David Viejo. I will provide the link also at the end of the presentation to it. It's a really good material. It's a great introduction to the tool. It provides a lot of detailed information about how the tool exactly works. For Kubernetes knowledge, it's not really necessary. All we need to do is how to use the configuration files of the cluster, which I will also show in a second, and then how to use kubectl, the basic commands. Okay. And then Ramesh Meryala here is asking, what's the difference between HLF operator and Fabric operator? I think that's... Yes, that's the same thing. So a different name, you cannot repeat the same thing over and over. Yeah, HLF is Hyperledger Fabric operator is just using a shorthand for it. Yes, exactly. Thank you. All right. So we decided to go with the following schema. This is a basic Hyperledger Fabric network with three organizations. We have two app organizations, which include 1CA and two peers each. Our order organization contains one order for each app organization. So we have two orders here in place and one CA. This design allows for an easy expand if we move the CA order to another cluster. On the diagram, for clarity purposes, I did not include all of the connections since the peers are able to communicate with each other and with any of the orders. It would create a giant mess on the diagram. All right. Since we do not have much time, we only have like half an hour to deploy the entire network. I might be going for things pretty quickly and I will not explain the very basic concepts of the tool. For that, as I mentioned, I will recommend the David Viejo webinar, which will be linked in the end. With that, let me try to go to the code. Is the VS Code visible? Yes, it is. Perfect. Now it's back to your slides, though. Yep. I wanted to show first how we can actually create the clusters first because I already prepared the environment because it takes a few minutes to spin up things up and assign the public IP addresses. To create a cluster, we need to go to, after we make the account, we need to go to create Kubernetes. There you will have the cluster creation website. We can choose where we want the location of our cluster. For my clusters, one is based in Amsterdam. The other one is in Frankfurt. We use the latest version of Kubernetes. We use all the basic settings. Just change the name to whatever suits your needs. Then just create the cluster. After we create the clusters, we need to give them a few minutes to create. Then we can go back to the Kubernetes panel. We can go click on the three dots next to the cluster and then download config. After we do that, we can go into our code. To use that, we will have to export to config variable to operate on the correct cluster. As you can see, I prepared three columns of nodes and tools to synchronize them together. On the left on the left side, you can see the commands that I will use on cluster one, the middle, the cluster two, and on the right, the information, what we are doing right now. So let's export these variables pretty quick. To see if we are connected to the cluster, we can use the cluster info command. It should return us different IP addresses for the control planes. We are connected to different clusters and everything is running properly. So now that we have that, we will also need the domains. Recently, something was wrong with the freedom website. I will show you the screen shows that I made to not worry about it not working now. This will be also, I will provide a link to this repository with all the commands and all the screenshots later on. So this is the main website. Here you can type in the domain that you want. First, check availability. It should show you if any domain is available. For this, you can add in another one. For now, we will need three domains. One for each organization. So one for organization one, one for organization two, and one for order organization. When you have them all, you can proceed to checkout. Here you can change for up to 12 months for free to use this domain. Then you can continue and finish the purchase of the domains.  Then open each of the domain settings in another tab. There you can, on each tab, you can go to manage freedom DNS. And this is the screen that you will see. I already added the record so you can see the configuration that I used. I will show you in a second how to get these IP addresses. But this is the configuration that you should use to look very similar if you're trying to deploy the same network as we will do right now. Okay. We can proceed with the installation of the tools. I already installed STO CTL. To do that, we need to use this command. And we also need to install the hyperlitter fabric operator that I mentioned. To do that, we need to add the Helm repository of KF software. Then we can proceed with the installation to check if the things are running. We can type in kubectl getpods command. As you can see, the project fabric operator is running on this cluster as well. To check if the STO is running, you need to change the namespace to STO system. So it's also quickly to that. This here is also running so everything is installed as it should. So to get the IP address that I mentioned just now, we need to type in this command. This will return all the information about our Ingress Gateway. This is the public IP address that our load balancer has assigned to the service. And to check if the DNS is refreshed, we can use any command like peer or dig or probably even tracer it. This command should return the IP address that it resolves to. So you can see this is the same IP address. Let's put it on this on the other terminal. This one should return the other IP address. As you can see, it looks correct. It's also quickly checked. Check the order IPs. It also looks like it's running. So with that, we can proceed to deploying the actual network. I will create a few files to organize the deployment configs. And to deploy anything, we need to know what storage class the master operates on. So to do that, we can use kubectl getStorage class. We will just use the default one. So do-plot-storage. You can see it's being used right here, the deployment command. And we need to provide some basic arguments like the storage class just mentioned, storage capacity, the name of the CA, and ID and password to generate new users on the CA. Hypervisor Fabric Operator offers an option to deploy things right away if we removed these two lines. So just this command would result in a CA being deployed right away. Just with this, we can also inspect what's happening, how the deployment looks. So let's quickly deploy it. Let's do the same thing for the order CA. Let's also run it on the organization too. And with this command, you can wait for all of the CAs to be deployed because currently, they're just started, and we need to wait for them to be operational. Hopefully, it will not take too long. After that, we can see the pods are really running. On the cluster one, it's already done. Both of the CAs are running. So as you can see, the pods are created. And the other one as well. So with CAs in place, we can proceed to deploy peers for both organizations. So for each peer, we need to register peer identity on the CA. Then we can create and apply peer configuration. What differs from single cluster deployment is that for each service that is exposed for communication with network components from other clusters, we need to add the following flags. So hosts, which is the domain of the complement, the URL to access it. Ingress Gateway is the default value for the Ingress Gateway. And they still port this 4.4.3, which is also the default value. So if you install it the same way I did with this command, then everything should be the same. So let's also run these commands. I have peer1 is created, peer0 is created. Let's go with peer1. These commands are very similar. I'm just changing peer identity. I'm creating a new one. I'm using a different name for it. But basically they look almost the same. Let's do the same for organization2. Both created with no problem. So without stopping, we can deploy our orders. The order for organization1 will have no problems deploying as it follows basically the same path as the peer deployment. So we need to create the order identity. We just change the type to order. Here above you can see those type peer. And then just comment or not create. You also need to add the hosts and Istio parameters to it as it will be communicating with the other cluster. So let's also run these commands. And for order2 we will have to make a few adjustments. Function or not create, which we just executed for order1. It's responsible for generating order pod configuration. It scans the current cluster for certificate authority provided by the CA name flag. So it's no problem for order1 since the order CA is running on the same cluster. But for order2 we need to make some changes manually. As you can see, if we try to do it with the order CA, it will throw an error that the CA is not found. And so how do we avoid that? We can use the CA that we deployed before for order2. Just before applying the configuration, we will make the changes manually. So let's first register on the first cluster and the order2 identity. Then let's create the manifest file. And let's open these files that were just created. We will also need to copy some values from order1 configuration since it's used the correct CA. So as you can see here, we will have to change the CA host parameters on this cluster. And it will have to point to order-ca.hlf.dk, which is my domain for the order CA. We will also have to change the port to default port of ingress gateway, which is for code 3. We will have to also copy the entire certificate from order1 and paste it in this place. We need to also change it for the TLS connection. So let's quickly do that. Change the port to default port 3. And let's copy and paste that certificate. And to be able to connect to it, we need to also add it to the host area here. And with that done, we should be ready to go. Let's save it. And let's close the files. And let's proceed to apply the order2 configuration. Now let's run the commands to wait for the deployment of both peers and orders. So as you can see, the peers are already deployed. Here you can see what the order is already also deployed on cluster1. And we will just have to wait for the order on cluster2 since we just applied it. You can also see that both are running. This is the order and the two peers that we created. Okay, perfect. The order is also deployed. This is what we created. Now in order to deploy the chain code and create the channel, we need to generate admin connection files. To do that, we have a few comments to run. First, inspecting the organization. This generates a simple YAM file which contains all important information about the organization, along with a few certificates to authorize the connection. Second, we have to register and enroll the admin user. Register command was used before with the order and peer creation. Now we also have to enroll it to generate the private certificate on our file system. Then we have a quick few tool that we need to use in order to add the admin file to the organization file. So let's execute this. Perfect. As you can see, the admin contains a public and private key. I'm not afraid to show it since the network will basically be removed after the webinar. And then we can see the organization one config, which also contains the important information, like what peers do we have and what orders are connected. And if you also look for it, you can find the admin user that we just created. Let's do the same for the order organization on cluster one. Let's do the same for organization two. And this file won't be needed for the demo, but just have to so you can guys have a look. If we need it for order on the cluster two, we need to generate the admin on the first cluster. And then we can just use that to create a configuration on the other cluster. And it also should be working. Okay. Now that we have admin rights to operate on the network, let's deploy some chain codes. I prepared just a basic favcarn check code written in JavaScript. It's stolen straight from official fabric samples. It takes a while, so let's run it in a separate terminal. We need to provide it with a path. The chain code sits right here. We need to provide it the config that we just created, language, label, the admin user username, because you can add multiple users to the configuration and then appear that you want to deploy it on. So let's run these commands. No quick error, so just a good sign. Okay. So let it run in the background. And while this is installing, we can create a channel. So let's start with creating a genesis book, which is a simple command. We need to provide it an output where we want to write it to channel name and then organizations that we want to include. And because the org2 is not visible on the cluster that we will be creating it, even if I include it in the command, it will only read the peers from organization one. So we will have to add the organization to manually later on. So to join the order to the channel, we need to enroll a TLS configuration because by default we are using a craft consensus mechanism. We will have to enroll it using TLSCA. And we already registered the user. We can use the same credentials to just generate a slightly different certificate. Now we can join the channel. Status code 201, which means everything succeeded. Now we can proceed to join the peers to the channel. We also need to provide just the name of the channel and then the config username and peer that we want to join to the channel. Channel join. So let's do the same thing for the other peer. And the first thing that we should do after we join the peers to the channel is to set an encore peer. So the other organizations can discover what other peers are in the network. Okay. And now we can try to inspect the channel on this cluster. We can see that both of the peers already joined and it's two transactions were consumed already. To add organization two, we need to inspect the organization on the other cluster. I will also move it right away to the resources folder that we created at the beginning, since it will become a big cluster clatter in a second as we will be updating the channel configuration. With that we need to execute this command, which automatically for us adds the organization two to the cluster, to the channel, excuse me. Channel updated. It should update. Yes, there you go. One peer already registered the change. The other one is synced already too. So now we need to do the same thing as we did on the order one. We need to create the admin TLS configuration and then we can join the other order to the network. So now the order two is in the channel, but it still can't do much. Let's say we want to add it as concenter instead of order one being the loan leader. The Qubectl HLF plugin offers add the concenter function, but unfortunately it doesn't work when the order is deployed on a different cluster. So we will have to make the change manually. We will use config.exlator from fabric binaries, which I also installed in this folder. So let's export the path. First, let's fetch the current channel configuration and encode it as we will need it for later. Then we can make a copy of the JSON configuration and we can make changes in the file. So the quickest way to navigate to add the concenter is to find the existing order. Just import one that HLF in my case and we need to add our order two to this admin array. So let's quickly do that and we will have to add the order two into this concenters array. So as you can see here, there are two certificates, hosts and ports. You can copy the entire thing and make a second element in this array. We can remove the certificates as we will have to fetch one ourselves. We can change the post to order two. The port stays default. Now to get the certificates, we need to first, we need to fetch it from the pod file system. So let's get the name of the pod that we will want to get it from. So now we're ordering node and let's type in kubectl xx-at, paste the pod name and then let's paste the rest of this command. This actually gave me a pretty big headache because I couldn't figure out what's wrong and this line was life changing because when Bash was adding carry returns, which are invisible signs that were changing the base 64 encoding of the certificate and after removing that, finally everything started to work properly. So let's remove, let's copy the certificate. Let's paste it in the correct place just here and here. Let's save it. Now we can close it and proceed with the standard hyperlitter fabric channel updates. These commands are also basically taken from the documentation. So I will not go into details on what they are doing. Basically, we are creating a transaction that will update the channel. Before we can apply it, we need to sign the update by the current authority, which is the order one in this case. But as you can see, unfortunately, there is a small bug in the program that I did not have a chance to fix yet. Need to go to order one config and not the very bottom. The tool expects a map instead of an error. So we need to change that. And now if we execute it again, the command runs successfully. So now we can update the channel. The transaction is committed. So it should also show here, perfect. The peers are still synchronizing. And now we can join the peers from order, from organization two to the channel. It might throw an error because the channel updates makes the order unavailable for a second. But thankfully, it worked already. You can join the other one. And you can set the anchor peer, just like with the organization one. Okay, let's see if our chinko is installed. Looks like everything went smoothly. With the status 200, here we will need to use this package ID. But we can also just get it by using query installed command. And this is the same result that we saw in the other terminal. And let's export cc underscore package underscore ID. So lazy developers like me can just copy paste the rest of the commands easily. We can query all approved chain codes. For now, we shouldn't have any since we didn't approve any on the other cluster as well. Let's not forget to export this on the other terminal as well. Now we can proceed to approve it. We also need to provide it with the configuration, the user peer, which will be used to approve it, then the package ID and the version and sequence. Since this is the first one we are deploying, we will just use version and sequence one. Name is Fobcar and we will use ant policy so that both of the organizations need to approve it before committing. Yes, do we have any questions? Yeah, just someone, Ramesh, jumping in here again with a question about whether the container registry is supported for chain code installation. I don't get the question. Could you maybe rephrase it? Let's see. Ramesh, do you want to come off mute and ask the question and clarify? Let me find him in the attendee list real quick. Ramesh, would you like to come off mute and ask your question or please type it again into the Q&A box with a little bit more language around it and hopefully Marchion can answer it. Okay, maybe while we wait, I can go a little bit forward since we are almost running out of time. Yep, go ahead. Okay, so let's run the approve command and let's run approve on the other cluster also. If we execute query approved again, it should hopefully show that we indeed approve this chain code on this cluster. Should also perfect and now we can commit it so we can actually use it. After that, we can invoke the initialization of the chain code and after that we'll be able to execute the chain code commands to chain code functions. Okay, it went through successfully. We are already on block nine and we can invoke create car chain code function. We can create cars on both of the clusters. The transaction is successful here and here as well. Now you can query the cars to show everything is running properly and as you can see it's working just fine and the two functions that we executed were created a new transaction. The peers are all synchronized and that's basically all from the demo that I prepared for you. I just some quick cleanup functions. I will not execute them right now in case there are some questions afterwards. Simone, would you like to continue with the summary? Yeah, sure. We will now move to the take home messages. So probably one of the most important things that we have learned because Marcin showed that there is a lot to digest on is that hyperledger could be used in a very complex scenarios. These complex scenarios could be used even in the cloud environment. We have also learned during this session that there is a lot of tools that could help you with implementing even the most complex scenarios that we have faced on. So there is a large community inside the IJLF and it could help you with deploying your blockchain network to the cloud and manage it with the Kubernetes. So I believe that these are the most important take home messages and now we could move to the next slide and one more. So we have good news. So if you are excited about hyperledger and would like to join us, we are hiring. We have open positions for senior developers. So if you already have experience in blockchain, then you could join us. But if you are not an experienced developer in blockchain, we also have a program for starting with that, starting with hyperledger. So there is a junior academy, junior blockchain academy that you could join, and we will teach you and help you to become a blockchain developer at the spell. So that are the great news if you are interested. And if you after even this webinar would like to have in touch with us, then please write to us or write to Swavomil. He's a great resource and definitely will help you with any problem that you have. So that's all on our side. Thank you. And if you have questions, we are happy to answer them. Yes. So Ramesh, maybe you would like to open with your question. Hi, Marcin. I got booted off. Could you make me host please? Okay. Thank you. Okay. So Ramesh, would you like to come off mute or Jeff also had a question as well? If you'd like to come off mute and ask your questions, we have enough time to address those live. Yeah, definitely. Hi, everyone. So my query is, so every day we'll be doing the chain code development that we are pushing it to the Docker container registry. So is that supported in the HLF operator? Rather than giving the source code path, I just mentioned the Docker image path so that I would like to install the chain code on the peer section. That's my query. I'm not exactly sure since I'm not that much proficient with the tool, but in general, the tool is very flexible. So it should be able to, if not with the tool itself, then it should be possible to make some manual adjustments. And one more thing is the Fabric Gateway also supported on the HLF operator. From the 2.4 onwards, Fabric Gateway has been produced. Oh, I didn't have a look at that yet. So I need to catch up. And how are the monitoring of the blockchain, something like Romotis and Grafana? That is also another step that we are considering. Because for now it was just the proof of concept to see how difficult it is and how much time we can spend on it. So this is the next step that we will try to implement. So because I'm already using the Fabric operator, that's where I'm trying to bring up all the things. But I have some challenges actually. So that's the reason if I can switch to the HLF operator, so if we can address all these things, then it would be very easy to integrate the HLF operator and the Kubernetes to bring up the blockchain network. For now, the tool provides most of the basic operations that we do on the Fabric network. But if you want to do something more complex, then usually it requires some more work or working around some issues. Yeah. Thank you. Thank you, Ramesh, for your question. Jeff, did you want to come off mute and ask your question or we can also just... Sure, I'm actually off mute, I think. Hi, Jeff. Yeah, I was just curious. Everything that you showed was that part of the operator framework. And if so, if I already had an existing configuration, is it possible to import that into operator to make it possible to use operator going forward to manage it? Okay, as far as I'm aware, moving the current configuration is not possible for now. The network needs to be created basically from scratch. But all of the things that I showed during the demo, except modifying the channel manually, of course, which is just a part of the framework, everything was executed using the HLF operator plugin. Okay, thanks. Any other questions? Let us know in the Q&A box or raise your hand and I can unmute you. I will do one thing. I will integrate the step in the front end device so that it will be like a complete example. So I already have that set up with the Fabric operator. So what I will do is I'll create the pull request and I'll just add it in the current code, whatever you hosted on it. So that it will be like end-to-end pull stack up. Nice. Yeah, the Fabric operator really needs some attention and some contributors. So that's nice that you're helping in that topic. Yeah, because I'm already started in the Fabric operator. So I think this is the same similar kind of work I think I can do it for the Fabric operator, the HLF operator. It's perfect. Thank you, Ramesh. That's wonderful. Okay. I don't see any other questions or hands raised. So I want to take the opportunity to thank Marcin and Simone for their presentation, for the demo. It was really informative and also really demonstrated clearly the process that you all took and the lessons learned and take away. I really like that you included that part at the end as well. So thank you all for joining today. Feel free to reach out to our team or the Espeo team if you want to understand more about what they're doing or understand more about the Hyperledger Fabric operator. We do have another member webinar coming up next week. So please join us again for Indicio. They're going to be talking about scaling verifiable digital credentials. And you can sign up for that on the events page on our website, just like you did for this one. The recording for this will be available shortly on our webinar page on our website at hyperledger.org and also on our YouTube page because we were YouTube live. So that'll be under the webinar playlist there. But join us next week for Indicio. If you'd like to continue the conversation, get involved in our community, please join our Discord. We have chats for chat channels for all of our projects, all of our sigs and communities, including our labs as well. So please engage with our community there. It's a great place to get your questions answered. And finally, thank you again to Espeo and thank you all for attending and joining us today. We look forward to catching you on our next member webinar. Yes. Thank you very much for listening. Thank you. Have a great day, everybody.


There are always issues happening around the house And I'm the kind of the handyman if you will So I'm I'm called upon to fix a lot of different things around the house So when something goes wrong, I've got to work on something I just grabbed my handy toolbox or my tool bag in my case and that's got all kinds of stuff in it because I Never exactly know what I'm gonna need necessarily when I get into this and truth is I'm probably gonna need a few different things And I want to have all them with me, but not all tools are the same They don't all do the same thing. So I'm need a variety of things The same is true when we think about small groups small groups aren't all the same They don't serve the same function They don't all work the same way and don't all provide the same kind of outcome So in this video, we want to take a look at the different types of small groups that we encounter as we begin our Discussion of small group communication and some of the different types of groups that we may be involved in So when we think about the different types of groups first, we look at orientation We can look at orientation. This is a task oriented group or a relational oriented group Task-oriented groups are formed to solve a problem. They promote a cause. They generate ideas or information They have a to-do list things that they're trying to Accomplish in a specific, you know goal in mind for what they're trying to accomplish Relational-oriented groups though are formed more to promote interpersonal connections and are more focused on quality of interactions that contribute to the well-being of the group members. So think here about you know support groups groups of friends things like that that are more focused on building those individual relationships and building up the individual people involved as opposed to having a specific to-do list For that group. So there are different groups and they have different purposes and there's a spectrum there Not, you know, it's not an either-or type of thing You can have a little bit of both but some groups are heavily task-oriented some are heavily relationally oriented and some are somewhere in The middle and they fall all along that spectrum We can also look at what we call primary and secondary groups All right primary groups are formed based on those interpersonal relationships So we're thinking here about family and close friends people with whom you have frequent interactions and long-lasting ties. These are these are groups that last for Long long time for years, right? Not just days or even weeks But we also have secondary groups. These are groups that are less emotional and relational There are less relational connections and they're more task-oriented.  They these are more secondary They they have maybe an expiration date, so to speak, you know Their relationships that exist only as long as you're with that organization and that person that other those other people are part of that organization and and May not have the same kind of an emotional relational connection But is more task-oriented and that's what we would call a secondary group then You can also think about teams What's the difference between a group and a team? Well, a group a team is really a type of group It's just more task-oriented and members are in a team What we would define as a team are especially loyal and dedicated to that task and to the other group members So it's really more about cohesion. A team is just a group that's really Tight-knit and really focused on what they're doing and focused on benefiting the others and working together as a group So then we would kind of they've kind of be elevated to that team status you can also have of course now in The days of technology and especially in our post pandemic days. We see a lot of virtual teams, right? Teams that meet exclusively or primarily online to achieve their purpose or goal and their specific kind of rules and roles within that as well So you can see we have a lot of different types of teams represented here different, you know, that we can be involved in So it's important to recognize that there are different types of teams It's also important to recognize that each of these requires something a little different and as we get into this We're gonna talk about the different variables that exist within group communication So we need to be able to identify what type of group is this and and how does that affect the way that I communicate and Interact and work with the other group members If you have questions about the types of groups or about group communication in general feel free to email me I'd love to hear from you there Otherwise, I will so hopefully see you in the next video and hopefully you understand now The different types of teams and groups that are out there and how that might impact your communication in small groups


Georgia Power is leading the way in helping communication services providers expand their network. Using our existing infrastructure including lighting, transmission towers, land lease for third-party telecom towers, and Georgia Power telecom towers, we provide easy and fast co-location support. Our system includes 500,000 outdoor street lights, 90,000 transmission towers, over 300 company-owned telecom towers, and over 600 properties for third-party built-to-suit. In addition to these resources, we also provide small cell deployment through our streetlight co-location. With the help of Veriset, a web-based customer portal, customers can search our asset inventory through our GIS system. Once the desired asset is identified and selected, we can assist our telecom customers with everything from submitting a request and permit tracking, all the way to equipment maintenance support and billing. Our goal is to make it as easy as possible for our customers to partner with Georgia Power for their co-location needs. Visit georgapower.com slash utility services and select Telecom Co-location to learn more.


Hi, London community. My name is Marge de Khaf, I work for Tropenbos International. And together with IUCN Netherlands Committee and Majority Fancy, we will organize a session on community forest rights. The London online encounter is a great opportunity for us to highlight the importance of recognizing these community rights to forest and also to discuss how we can create an enabling environment for these communities to manage their forests for the benefit of people and nature. So I hope you will join us and see you there.


T.S. Iliot worked for three hours per day. That's surprising. Hi friends, I am Arvita Karwa and in this video lecture, we are going to talk about a lot more serious topic. But then before that, I would like to share a fun fact with you. I was reading a paper on T.S. Iliot and I found that he wrote his plays and poems partially on typewriter and partially with pen and paper. And he said in one of the interview that he never worked more than three hours per day. Because he said that when I started writing, I had an urge to write longer and longer. But when I looked at the same work next day, I never found anything satisfactory, which I wrote beyond three hours. So he decided that day that he's just going to write for three hours per day. Now, I just wonder that can we do that like working for three hours and having fun the other day? I don't know. But then if T.S. Iliot did that, I am sure that it is going to work. Because even after working just three hours per day, he wrote some of the most celebrated poems of literature, including Wasteland, Ash Wednesday, Love Song of J.L. and Hallouman. He wrote some of the greatest plays, Murder in the Cathedral and, you know, so many other interesting works was written by him. But in this video lecture, I am going to look at the essays written by T.S. Iliot. Because today in this video, we are going to look at T.S. Iliot as a critic. The first topic that we are going to talk about is T.S. Iliot's concept of objective correlative. Objective correlative was a concept which T.S. Iliot discussed in his essay called Hamlet and His Problems. And this was a question of June 2011. So you must remember that T.S. Iliot has coined the term objective correlative in the essay Hamlet and His Problems. But don't mix it up. The term objective correlative was initially for the first time used by an American painter whose name was Washington Alson. But this term was made famous by T.S. Iliot when he wrote a lot about this particular term, explained it to the people in the essay Hamlet and His Problems. So what is the objective correlative? In order to understand that better, I would like you to answer this question of mine that why horror movies always feature thunderstorm or why horror movies always have episodes shot in night. So they have a lot of episodes in the night. Most of the horror movies take place during night. Why is that so? Have you ever contemplated on this particular question? If not, then do it now because only after understanding this question, you'll be able to understand the concept of objective correlative. Objective correlative is a very easy concept. T.S. Iliot wants us to believe that if a playwright or a novelist want to create an impact on the audience, if that particular playwright wants the audience to feel a particular emotion, it will only happen in a combination of object, description, images. If I just want to show a fool and create the image of love in the reader's mind, it's not possible. Only when I mix four or five things together together, I can evoke the emotion of love in the heart of the reader. For example, if you look at the poems of Wordsworth or you look at poems of Robert Frost, you'll see that all the items in the nature are linked together to create that particular emotion, to evoke that emotion in the reader. Kabi bhi aisa rahi hoga ki ek bahut hi sunder jage ki baat ho rahi hai, ek bahut happy mood ki baat ho rahi hai, and achanak se the poet talks about thorns or the poem talks about blackness. Never will that happen. Why? Because all the good things must be linked together in order to evoke that particular emotion in the mind of the reader. For example, agar I am talking about a sunny day. I would talk about flowers blooming. I will talk about the sun rising. I will talk about the nature which is supporting my mood. But I will never look at the negative aspects of nature. I will never look at the dark side of the nature. Why? Because if I start looking at the dark side of the nature, then the objective correlative will never happen in the poem. Objective correlative tabhi hoga when all the images, all the pictures, all the description put together, evokes a same image in the mind of the reader. And that is why if you look at horror movies, you will see that all the negative dark images are presented together. And that is where we start feeling fearful. That is where we start having goosebumps. Because sari cheeze milke humare andar wo reaction kreate karegi. Sif ek cheeze akele kabi wo reaction kreate nahi kar sakti. That is what T.S. Ilyat meant by the use of the term objective correlative. The second important work written by T.S. Ilyat when it comes to literary criticism is metaphysical poetry. It's an essay which was written as a review to J.G. Greenstone's essay, which talked about metaphysical lyrics and poetry of 17th century. And T.S. Ilyat talks about the definition given by Samuel Johnson. Samuel Johnson has classified all these metaphysical poets together in the lives of Abraham Kaulay. He wrote a biography of Abraham Kaulay, who is a very famous metaphysical poet. And in that biography, he clubbed all these metaphysical poets together for the first time and said that these metaphysical poets are not very good. Why? Because these poets are trying to combine or, you know, mix and match heterogeneous ideas by the use of violence. For example, if you look at the works of John Dunn, he's comparing lovers to pair of compass. Now, comparing lovers to pair of compass doesn't seems to be a very apt comparison. So they are joining to heterogeneous, dissimilar ideas together by the use of violence. And Samuel Johnson did not like it at all. When T.S. Ilyat was looking at the work written by Samuel Johnson, he questioned himself that metaphysical poetry aren't good, is that so? And then somewhere when he looked at the works of John Dunn and other metaphysical poets, he came up with the idea that no, metaphysical poets are fabulous because they were able to combine dissimilar ideas together. Nobody during the Victorian or romantic period was able to club these two dissimilar images together. Only metaphysical people were able to do that. And that is why he celebrates metaphysical poetry in his essay, Metaphysical Poetry. You should remember this thing that Samuel Johnson passed a derogatory remark on the metaphysical poets. He was not happy with the works of metaphysical poets. But T.S. Ilyat loved the works of metaphysical poets. And he said that these poets are justified. He has quoted several examples from Herbert, from John Dunn, from Abraham Cowley, stating that look at the way they have clubbed two dissimilar ideas so beautifully, which can never be done by the Romantics and Victorian writers who preceded them. The next key idea by T.S. Ilyat is the concept of unification of sensibility and disassociation of sensibility. Now, these two terms seems really, really tough to understand. It's quite difficult to understand what he's trying to say. But I'm telling you, guys, it's very simple. Don't let the technical jargon create fear in you. It's very simple. Basically, T.S. Ilyat, as we have seen in the works of metaphysical poetry, that he praised the metaphysical poets and their views that two dissimilar things can be put together and can be fused in one and another. If you look at the works of Elizabethan writers and Jacobian writers, you'll see that T.S. Ilyat also believes in the notion that all the Elizabethan and Jacobian writers were able to synthesize dissimilar things together and were able to fuse them, mix them into unified one. And this is called unification of sensibility. When you are able to take two dissimilar images and you are able to fuse them together. So according to T.S. Ilyat, writers from the Elizabethan and Jacobian age were able to fuse different things together and were able to produce works which were classic, which were extremely wonderful. But during the restoration, during enlightenment, during romantics and Victorian period, this unification of sensibility was not present. He says that Milton, Milton and Dryden, these writers were masters of the language, but they were not the masters of the soul. The language was very good for Milton and Dryden, but they were not able to fuse things together. They were not able to master their soul. A good poet is one who writes from the soul and these writers were masters of language, but they were not masters of soul. And this was also a question in June 2011 at exam that which are the two writers for whom T.S. Ilyat has said that they are the masters of language, but not the masters of the soul. So we find that T.S. Ilyat is saying that during the enlightenment, during the Elizabethan and Jacobian period, writers were able to have unification of sensibility. But for the next 200 to 50 years, we can see that the writers suffered from disassociation of sensibility. They were not able to fuse things together. Tennyson Browning, he has commented on these writers saying that they were not good, they were not able to fuse different things together, they were not able to talk about totally unrelated ideas in their in the same poem. But then he again comes to the modern age and he says that now in the modern age, we can again see unification of sensibility in the works of modern writers because the time is such. It is a changing period plus people are going through so much trauma. There's a lot of depression, world war is happening and all these dissimilar fragmented things are there in the world. And now all these writers, budding writers, they are able to talk about these disjointed things, these disassociated things together, they are able to unify them. And that is how they are carrying forward the legacy of Elizabethans and Jacobians. So this is the concept of unification of sensibility and disassociation of sensibility. There's a beautiful statement that T.S. Eliot has used for John Dunn and he says that for John Dunn, every thought was like an experience. This is a quotation by T.S. Eliot and he's talking about the great metaphysical poet, Mr. John Dunn. There are a lot of other concepts that T.S. Eliot talks about. We have lemon squeezer method. Then he talks about the theory of impersonality in his most celebrated essay, tradition and individual talent. We'll be talking about all these works in detail in my audio online course. You can go to my website, arpitaakarwa.com and under the section of online course content, you can get a list of all the important literary critics and writers that you must study if you want to clear UGC net in your first attempt. So you can go and check the list of the writers. If you like the list, you can join my online course. You'll find the details of my online course on my website. You can even contact on the number displayed above. You can also follow me on all the social media platform. I'm running a go net quiz, which will help you to boost your exam preparation. You can also subscribe to this YouTube channel because I post videos every Saturday and every Sunday exclusively for UGC net aspirants and I help them in preparing for the next UGC net exam. I'm also running a new paper one series in which I'm talking about all the sections that must be covered when you are preparing for UGC net paper one. So if you want to get notified about all the video lectures, which will be coming up next week, do subscribe to this channel and also click the bell button, which is displayed just near the subscribe button. With that note, I end my video. That's it for this video lecture. We'll meet soon till the time we meet next. Happy learning, keep loving literature and stay tuned to ArpitaKarwa.com.


Hello, this is Sartre with LSNTAP giving you a roundup of this week in legal services technology. We've got some great stuff. An update on the hackathon from last weekend, games for good ideas, a free webinar that's going on next week, and some help with knowledge management. Let's jump right in here with the legal aid virtual hackathon that happened this last weekend. Awesome event. Big thank you out there to Joseph and to Abhijit for running a wonderful event. Really well done. We had over 30 participants that I was aware of online at any time and some people came and went all weekend. I believe our registration was up over 50 or 60 people. There were a lot of different projects out there. Super happy. I ended up getting second place in the hackathon for a privacy policy best practices. I'll have a separate video on that at a later point in time, but the idea is to look at what's going on with everybody rewriting their privacy policies with regard to what's been going on recently in Europe and coming up with best practices for anybody who's writing a privacy policy that are really going to protect users and then come up with a practical privacy policy anybody in legal services can use. The number one winning team though was the Chatbot team that came up with a Chatbot to help youth that were aging out of foster care. Really awesome idea. A simple Chatbot that could be put onto a website or embedded in an application. The target audience for this was youth. They had practical resources as part of it, worked on the logic tree, and actually got the Chatbot working somewhat. Once there is a full demo of that, I'm going to try to bring them in to do a video highlighting that overall. The next thing that we've got today is an article that Kat put together for our website on Games for Good. A few months ago, a local judge here in the Seattle area asked for examples of how games could be used in the civil service area or to help people. Kat happened to be working on a spreadsheet for game jams looking specifically at some of the games that have come out for good. This is really interesting to me. As you know from last week, we planned the social justice game jam here last year. I've got some news coming up about one of those games in the future, but finding better ways to teach the law to get people involved in learning about civics is really a passion of mine. Kat has this wonderful spreadsheet that is available. The link is down there. You can also find it on the LSNTAP website, but it's got over 20 games that are really designed with this civics idea in mind or other purposes or with a mission as part of it. We've got a free webinar coming up next week. Laura Quinn, the former head and founder of Idealware is doing a user experience webinar. It is free. All of our webinars are free. You can register over at the lsntap.org slash trainings portion of the website. We've got Rachel Harris from Ohio Legal Assistance Foundation and Dan Jackson of New Law Labs. Anybody who is creating content online or websites, portals, mobile apps, anything like that, I highly recommend checking out this webinar. Last thing is I'm highly new resource that's been put up recently on LSNTAP this year. It's a knowledge management toolkit. It is a PDF that goes through all of the basic things that you need to know about knowledge management when trying to set up a brief bank or some type of a knowledge sharing system. I was one of the individuals who ended up being interviewed for this. This is a passion of mine is finding out better ways to share information internally. One of the big takeaways for me in this area has been that community doesn't create itself. You need some type of a manager. You need someone who is going to really own that project and champion it for people. It's an extremely practical guide. There are lots of worksheets and pieces for implementing, understanding the ways that you would use knowledge, who should have control, who should have access, who should own it. So it's super practical. Definitely recommend checking it out over at lsntap.org. If there's anything that you would like to see on a future episode, things that you're doing, projects that are awesome that you want to share with the community, definitely contact me. I'm looking for contact for this. And until next time, hack for justice.


Ryan Davis. Thank you very much. I have 101 slides to do in 30 minutes, so I got to go a little fast. And I realized that I'm not actually getting the butterflies, that the same feeling you get from butterflies is also the same feeling I get from sleep deprivation, which I have in spades. So prepare for me to put my foot in my mouth. So I need to start off. This is my first time in Madison. Gorgeous city. I'm really enjoying it. I'm really liking the evenings with cicadas and the crickets and everything. Do we have any locals somewhere in the front? Okay, I'm gonna pick on on you. I was told not to touch this word because if I do I'm gonna get beat up by some farm boys. What's that? I'm sorry for spelling it wrong. Can you say the word though? Monticello. Yes, it hurts. I can't criticize this word.  But I can pick on this one. Can you say it again? Manona. It's actually wrong. It's like Manona, as in one na, contrasted to a Baena, like shana na or banana. Turns out there are other nas in the world. I didn't know this, but My Chemical Romance does a song with a dodeca na, and the logical conclusion of that and what I've been driving Ozzy crazy with this entire week is the double dodeca na. So now you know. So this is a tiny bait and switch. Aaron Patterson talked about how to get started contributing to open source at Steel City a few weeks ago, and that happened after I proposed this talk. So he did a really good job of it. I'm not going to talk about getting started in open source at all. He did a very good job of it, a better job than I can do. Eventually the video will be up on Confreaks. Is Julia in the audience? I did a wonderful job of making these awesome notes, and I found them online. So here's Aaron's talk. I'll wait. Okay. So what I'm going to be talking about is how to contribute open source.  As a side note, I just need to say so that everyone understands my pain that Aaron sucks and you never ever wanted to work with him. As an example, if we're going further than a few blocks to lunch, it's incredibly embarrassing to go out to lunch with him. We don't have an office at all. We work from a cafe, so it's embarrassing to work in public with him. All he talks about incessantly is his ugly cat, which I need to point out, ran into a brick wall as a kitten and has a completely flat face, and then incessantly, obsessively, talks about his sausage, which has its own Twitter account, has computer monitoring, the works. It's really obnoxious, but I don't think this really conveys. I'm going to show you a typical day between Aaron and I. So I say, hey Aaron, why are you meowing? He says, thinking about cats, totally normal response for him, and I say, why are you meowing journeys? Don't stop believing. And he says, well I'm thinking about cats singing. And I'm like, so that said, Aaron is brilliant and working with him is fun and rewarding and just so you further know my pain, I scoured through literally 59 pages of Flickr self-portraits for you guys. So I'm going to be talking about the later stages of open source contribution, typically the relationship between the developer and the contributor. So let's get into it and talk about what contributors actually are. In proprietary we have the developer, which is most often a corporation. It's usually a black box. If you're lucky you have a phone number to call tech support and you have the consumer, you, the user. In open source it's just slightly different. The developer is oftentimes an individual or a group of individuals. Sometimes it's a company but you'll almost always have direct access to the developers themselves. There's you, the user, again and then there's what I'm considering to be a hybrid between those two things which is the contributor. And I'm going to be talking about this relationship between those two things. So what are contributions? I see it as bug reports, feature requests, documentation submissions or enhancements. Pretty much any form of feedback is a contribution. Even just a, this doesn't make sense to me, is information the developer can use to improve their product. So let's look at what contributions used to look like in yield open source. It started with smoke signals and then we adapted TCPIP in Morse code over Telegraph. That typically looked like checking out a project in CVS and then later Subversion. You locally work your changes. You don't have right access to the repository so you're doing everything locally and it's transient. There's no persistence to this thing. And then you submit the diffs of your changes back to the developer because you don't have right permissions to the original repository and you don't have a real cloning system. That's what makes this transient. Hopefully there was something like source forage or track or any sort of mechanism to cause the contribution to be persisted somewhere. In having that type of thing, you don't have your diffs get lost in email. They don't get, typically don't get ignored or forgotten about. They are something that you can keep referring to and they're things that other people can look at and they can see, oh someone else has had this problem also. I'll add additional information or diagnostics and as a result there's more information sharing. There wasn't always source forage and there wasn't always track and oftentimes there were diffs just emailed to a mailing list and forgotten. We actually had this world in Ruby five plus years ago. So most the burden is on the user to get it right. They need to make sure that their diffs are right, that they apply cleanly, that they work right. Back in those days testing was not standardized. The burden was on the user to get it right. Nowadays it's a lot easier to be a contributor. We typically use Git, whether we like it or not, we typically use it. We typically use GitHub and we're dealing with pull requests instead of patch sets and the difference is subtle. Basically you have a system managing those patch sets instead of you managing those patch sets and managing the communication they're in. And really, thanks to things like GitHub, you don't even need a local checkout anymore. You don't have to clone the project at all. You can clone, edit, and submit a diff in one or two clicks. So as a result, forked projects and pull requests have scaled up by orders of magnitude. And this is good overall, but it means that the project developers are massively outnumbered by the contributors now because the contributors have been empowered to be able to give that feedback as easily as possible. And this often looks like the fire hose. When you're dealing with a project like Rails or Ruby or RSpec, very popular projects, the fire hose is a little bigger. But the point is that most of the burden goes back to the developer. They're now having to manage all that communication coming in. They're having to triage it, having to schedule it and figure out what to do with it when there's a lot more coming in than there used to be. Aaron really wanted me to bring up the question of when someone should try to contribute any sort of contribution and I think it very clearly is early and often. As soon as you have a question about a product, as soon as you have the potential for a bug and you're not even sure about it, please communicate that to the developer and they can clarify that as quickly as possible. I think that things like Stack Exchange obscure communication with the developer. They make it harder for the developer to be in contact with the users that are having issues. And so the developer has the additional burden of having to hunt down questions on Stack Exchange and other similar systems rather than having direct communication with with the user. So how to handle a contribution? The developer has roughly three options and there's trade-offs with each one. They can accept as is, just push in the merge button. If the Travis CI bot says that the patch applies and the test run, it must be fine, right? So what can go wrong? Well, as you can see here, it's a minimum of effort, tiny little sliver of it. Pushing the merge button takes no effort whatsoever, but the potential for complexity goes up the most. 20 merge buttons in and you potentially have a very bad mess. You can reject the contribution for whatever reason and that takes a little bit more effort because it typically warrants a response of some sort and the potential for drama goes up tremendously. And in some cases, there's nothing you can do about it. Or you can do what I'm calling distillation or rewriting the original contribution so that it fits both the user's needs and the project's needs. And this requires the most amount of effort, the most amount of communication, and it still has the potential for drama because you're potentially editing someone's contribution to you and they might have ego attached to that change, attached to that code. And obviously any addition to your project has the potential of increasing the complexity, but you've reduced that complexity as much as possible. So I think this is the ideal balance to spend more time upfront so that the complexity of the project goes up the minimum amount over time. Wow, I'm flying through this. 66 slides in. So let's take a look at distillation. As an example, many tests has a flexible but simple runner. And by simple, I mean it's just Ruby and it is actually pretty readable code, but this is a typical stack trace required to run a single test. And you can see that a runner is instantiated and dispatched. That based on the type of runner that you're dealing with, dispatches to run tests which picks up the suites, which runs a single suite, which instantiates a single test, runs the hooks, runs the test, and runs the cleanup. That's actually as simple as I could get it and still have it be flexible enough to allow for both running tests and running a benchmarking system with n-by-m matrix and doing curve fitting to that and allowing you to do performance regressions against your code in a normalized manner. And really, the system's flexible enough that we haven't fully realized the potential for it because there just aren't that many plugins for many tests that change the type of runner that you're dealing with. There's a lot more stuff that it could do. In particular, I've been working with with Aaron. It's got hooks for various phases of a test run. There's the before setup, the setup, the after setup, same thing with tear down. And I worked with Aaron to help generalize those hook systems so that it meets all of his needs for testing rails with the Rails mocking system. But he has the benefit of working and sitting next to me on a daily basis. So we have the highest communication bandwidth that's possible and most other developers don't. So other systems like Mocha or FlexMock turn various CI integration systems. There's one for Travis and I'm sure there's many others. The number of bugs filed from those development groups currently are at zero with a minor exception that the Mocha has been picking up the ball in the last month or so and getting that communication rolling. And they're doing what I'm calling copy-paste munch, which is they're taking whole methods from the runner, which I consider to be internals. They're not documented. They are not promising any particular type of internal architecture. And as you can see here, Mocha has essentially a monkey patch per version range of many tests releases. And as you may know, I'm a tad bit release happy with my projects. You're welcome. The current maintainer Mocha is doing a much better job of communicating. I need to say this. He's been talking to me a lot about what he can do. And he's working on a scheme to make it so that Mocha does not need to monkey patch many tests anymore. And that will improve in the near future, but it's not there yet. But what it means is that Mocha in particular has the problem that its complexity is proportional to the number of frameworks that it's patching, and that's our spec test unit, many tests and probably others, times the number of releases of those products. And that's a geometric growth. Every time I change my internals, and my internals are mine, don't touch me there, they can break his code. And that did happen with the latest release of many tests. That's why we're now communicating about this stuff. And I think that's untenable. Luckily, he's working on fixing that situation, but there's a lot of other systems that monkey patch many tests that just aren't there. So I have a happy example.  I had a co-worker come to me with a question, and the dialogue basically looked like this in IRC, he's trying to make something similar to call the spheres CI reporter, which is basically a system that hooks into the test framework and then submits the data up to a CI so that you can see it company-wide. And I'd never heard of it, and so I decided to go look at it, and the integration was insane. It was crazy. It was 224 lines of monkey patch that I couldn't make sense of and couldn't figure out what version they'd forked from many tests because it was that munched. So he's submitting a pull request to me to writing a similar system. It was hooking into many tests and making it so that test results were getting collated and then written into some sort of XML and pushed to some CI system somewhere. And he's submitting a pull request to me to make many tests fit his needs better. He still had monkey patches, but he found the places where they were overlapping a little bit and wanted to make it so that his life was a little easier as he should. Unfortunately, his patch set was the wrong way to go for many tests. I rejected it, but I was able to talk to him through the issue tracker. And really, what happened is there's a huge difference already. It got the ball rolling. It got us communicating. And as a result, we were able to distill his needs. I basically said, let's back up a second. I understand what your patch set is, and I understand what you're trying to go for, but what do you really need out of this? And as a result, we were able to reach some clarity on that. One of the things with him being a newer developer is that he just didn't have the mindset to reduce the problem description to its pure essence. And so I was able to just say, okay, let's just stop for a second. What data points do you need and when do you need them? And as a result, we wound up with a very small change to Minitest. It is literally an empty method. That's it. It takes five arguments. The suite, what method was running, how many assertions ran, the time it took to run, and whether or not there was an error. And if there was, what the error was. Nothing Minitest does with that is interesting, so it's an empty method. And then I wind up calling it in the run suite method after every test is run, after the tear down methods have run. As a result, and I don't expect you to be able to read this, what I want you to do is look at the colors. And for any of you who might be red, green, blind, this is pointed out to me about five minutes before my talk. So I would just want to point out that about 80% of this diff is red. There are removals. And about 10 to 20% is green. There are places where he was able to clean up his code. And as a result, instead of this tangled mess, he's got this. He subclasses Minitest unit with his own CI unit. He has one after test hook which goes and does the submission. And then he is overwriting the record method where he creates a push into his system and calls super, like a good citizen. Everyone should call super. And then he replaces the regular runner with his CI unit runner. And since all it's doing is subclassing and overwriting one method and adding one hook, it runs exactly the same and then does his extra stuff. So is there a conclusion on my talk? Kind of. I can't really boil this down anymore. But communicate, communicate, communicate. I'm not going to jump on the stage because I don't trust it. And I'm not going to sweat that much for you because I don't love you that much. But please communicate with the developers. Thank you.


There are more than 200 people who have been named as possible authors of the imitation of Christ, including people like Saint Bernard of Clairvaux, which is really way off. No, that's 400 years of law. It's not possible. But even in the Roman breivery today, when they have readings from the imitation of Christ, it just says from the imitation of Christ. It doesn't say by Thomas the campus. But scholars today believe are very confident that he did, in fact, write it. And they can tell this by the manuscript copies that are in existence and where they are and when they date from. So it clearly is his own work. And if you read his other works, there is such a similarity of style and theme.


What's up Maggie Sykes?  You saw the title. It's funny. It's happened to me a few years ago. There was this white girl I used to work with, we were at the table together. We used to flirt all the time. I used to flirt with her a lot. I was just grinding her down. I could tell that she had a little something for me. She thought I was attractive. But I knew that she was from an upper-deep part of town and a little bit kind of timid I guess on how to act around black guys. So I thought that was kind of cute because that she was a little shy about around me about that stuff. So I used to mess with her all the time.  So for the longest time though she had me fooled. Like I did not think that I was going to pull her ever. And what happened was a few months had passed and one time I saw her at this party. And I saw her there. She was looking bad. Good. So talking to her. I go outside. I'm talking to her. Talking to her when I walked her out and everything. And you know she left. I didn't try to kiss her or nothing like that. I was just trying to cement the deal. I was really trying to get at her at this point. It's funny too because me and her are actually going to run in at one point. And you know we were really cool you know. But she you know unbeknownst to me. This before I could read women real well. Remember I told y'all how at just one point I started to be able to read people and trust my gut. I should have trusted my gut back then. So months I guess go by after that instance. I hadn't seen her in a while.  Is a girl. And she just basically just hating. She was just hating a little bit as far as I concerned. She see this video. If you wasn't hating you wasn't hating. But it sounded just hating to me. Because I'm not like this.  I'm like what are you talking about. She was like you know such and such. Well she said she liked you. But she was too afraid to go out with you. Because she didn't know what her man would think. Her ex would think about her ground with a black guy. I was like what. Wait a minute.  Has anybody gave a damn about what their ex thought about their next girl from her boyfriend. Like really unless you're trying to get them back.  And we like yeah I want her to see me with her.  You know what I'm saying. You know girls do the same thing. I was like what. Yeah she was like yeah she she was afraid of what he would think about her dating a black guy.  So as you see there is some truth to that whole thing where it's like if if a white woman dates a black man then white man don't want him. I think mostly it's on the whole insecurity thing you know if the white man does not want to date her it's because he's insecure.  There's a lot of things about black men that are true sexually you know and in the bedroom you know we got a good stroke we got rhythm we are big you know we know we doing a lot of us. But it's not like we're these like gods that cannot be equated in the bedroom you know what I mean.    See I could away and it's funny cuz me and her got along so well we really did we got along really really well I was like that is really fucked up. So what's funny is though she ended up getting back with that ex and marrying him and I recently saw her status on Facebook and her divorce. See that see girl.  See that now I'm destroying Sarah Casey on a daily basis. She's reaping the benefits that you could have had but you lost it all because you're afraid of what your boyfriend would think about a little bit of chocolate and everybody loves chocolate baby.  That was just retarded.  So I guess it was good that I did not go out with this girl.  Crazy ain't it?


Okay. Welcome everybody to my talk about LiberPCB. My name is Urban Bruhin from Switzerland and yeah. So first, what's LiberPCB? It's actually similar to Horizon and EDA tool, new open-source EDA tool. It's multi-platform, so it's works on Linux, Windows and Mac OS, and it's written from scratch in C++ and Qt. I started the development in about five years ago. So yeah, and there's the code is on GitHub, so you can check it out. First, the reason why I created the new EDA tool, and basically also the frustration about existing tools. Five years before now, think about how Kikad was then and so on, and it was, I was really frustrated about the existing tools. And the main reason is basically the library system, which is very limited in other tools, and also the file format, especially when using version control systems. Other EDA tools, yeah, they have a file format. If it's, maybe it's binary, then yeah, good luck. But if you have luck, then it's text-based, but still not very good suited for version control. And also the usability is often not very great of the tool. So about something about the library management. One thing is other tools have different library file formats for different kind of library types. So for example, one library type for components, one for footprints, and so on. And I think this is not really nice for users because maybe the tool sometime has add support for spice models or something like that. It also introduces a new file format for libraries. And yeah, and the other thing is tools do not really completely handle library management. So there is often no integrated tool to install and update libraries. If libraries have dependencies, so the tool does not handle this. So you as a user need to handle dependency management. And the project library management is also a little bit complicated sometime. So the result is actually the user has a lot of work to handle or to manage his libraries he wants to use. And that's quite a pain. So for example, as an eager user, if you maybe know this website where you search for libraries, download something, and install it manually. Or in KitKat, in the schematic editor, this is the library configuration dialog or in the board editor. I see a lot of file paths there and some environment variables and path substitutions and project specific libraries, global libraries, and so on. And I asked myself, why is it so complicated? I just want to use these libraries. So my answer is it doesn't have to be that complicated. So in Libre PCB, I integrated the library manager and to update and install libraries. And it also has a simple library dependency management system. So if you download a library, which library A, which depends on library B, library B is automatically installed when you install library A. And probably the most important thing is the application basically handles everything for you. So you don't have to care about libraries. They just work. So because there is no reason to make this very complicated. And another thing is actually similar to the Horizon tool. The problem of other tools is they reference many things just by name. And in some tools, it's even not possible to reference library elements between or across libraries. So you can't use components from library A with a symbol from library B and so on. And the result is there are often broken references when changing names or name conflicts. And many duplicates because, yeah, they cannot be shared between libraries. And the solution is actually the same as in Horizon. We use UUIDs for every entity in the library. So every symbol, every pin, every pad, everything has a UUID which never changes. So you can change the names and so on. And it doesn't have any effect. It doesn't break anything. And it's also possible to reference libraries across reference entities across different libraries. So for example, if you take a look at the file format of Libre PCB, which is based on S expressions, you can see that there are many UUIDs there. For example, a symbol looks like that. At the top is the UUID of the symbol itself. And the name is just the property which you can change anytime. And the same for every pin. So another problem of existing library systems is there is no way to have different symbols for the same component. So for example, a resistor can have an American or a European symbol. And but there is no solution for that in many tools. And these results in duplicated components with exactly same functionality but different symbol. For example, in Eagle, it looks like this. So if you have a resistor component and it's a resistor symbol, and the resistor has, for example, three devices, it looks like that. And if you want to have an American resistor symbol, you have to create an American resistor component. And you can't use the device from the European resistor. So you have to copy them. And maybe there is even another variant of the symbol. And you have many duplicates of devices. And this is quite a mess. So the quality of library gets worse and worse. So the solution of Libre PCBs, there is an entity called Component Symbol Variant. So there is only one component for a resistor. And it can have as many representation variants as you like. So you can create one for the European symbol, one for the American, or whatever you want. Similar problem is with packages or footprints. Because libraries do not have an abstraction layer for packages. For example, this TO220 package, this is three times the same package, but three different footprints. And this is quite common. For example, you have different footprints for different mounting variants or different size of pads, because one for reflow soltering, one for hand soltering, and so on. But libraries do not provide a way to abstract this. And so the result is every device needs to know every footprint variant of their package. For example, if you have a voltage regulator in a TO220 package, there's one relation between them. If you have one more device using that footprint, you have one more relation. But if you have some different footprint for the same device, for example, this time without the mounting hole, you have many to many relations. And let's add one more device and more footprints. And you can see you have many to many relation between devices and footprints. And that's quite a nightmare in a library system. So Libre PCB adds an entity called package, which doesn't know anything about footprints directly, but only what pads it has. And a device references only a package, and the package can contain as many footprint variants as you like. So the next problem is version control systems. It's quite hard to version control EDA files, because often important and unimportant data is mixed. So you cannot just check in the important data, but not the unimportant. And it's often even unclear rich files to put on the version control and which not. And the typical result is you have local changes, even if you didn't modify anything in a project or very large diffs, and merging is for sure impossible. And Libre PCB solves this by using many smaller files instead of one single big file. So you have higher granularity, and you can easily distinguish between important and unimportant data. And one very simple improvement is the tool automatically creates a git ignore file, so the user doesn't need to know which files to check in or not. And another thing is, and this is a diff of a Kicad PCB file. I just created a PCB, opened the editor, zoomed around, switched some, toggled some layers on and off, saved the project, and looked at the diff. And this is the diff. And you can see there are changes, which actually you don't want to check in these, because they are only irrelevant data. And at the bottom, there is actually the diff is one bit of some number. I don't know the exact reason of it. And this brings me to the next point. Files are not really human readable. So diffs are hard to understand, version control system are hard to use on these files. So my solution is basically, first, don't just consider text-based file formats as human readable. Not every text-based file format is human readable. You need to control every tiny detail of the file format to make it as readable as possible. And in Libre PCB, I consider parts of files which are not really human readable as box, and box need to be fixed. So the current project status is actually the library management works pretty good. The library editor has only basic features. It works kind of, but not very good. And schematic editor is also working pretty good, except some important features like copy and paste. And the board editor is at the moment work in progress. So there are no planes, no air wires, no design rule check, and so on. But Gerber export is possible, basically. And, of course, available libraries, there aren't many libraries available. But the most important thing is the file format is not yet considered as stable. So you can use Libre PCB already for some simple PCBs, but don't expect that you can open the files, for example, in a year with the newer version. So to get started, there are nightly builds available at the moment for Linux and Windows, and also some documentation. Okay, now let's show a short demo. This is actually just the app image I started, directly downloaded from the Internet. And this is the only the first time it says to create workspace. Then the project, the control panel says you need to install some libraries. So you open the library manager, and these are the libraries available in the Internet. And, for example, I want to install this library. It also selects the library here because they are dependencies. And if I unselect this, this is also gone. So let's install these libraries. They are downloaded from the Internet. And here we have some libraries. Okay, so now let's create a new project. Then the schematic editor is here. And as an example, I just add some components so you can see how the workflow would be. For example, capacitors are now available in the European symbol or the American symbol. So you can just add the American variant. Or you can also choose only a component or an exact device. It doesn't matter. So this one is just an ancient MOSFET without choosing already a footprint. So maybe ground VCC, make some connections, whatever. It doesn't make sense, but... So, okay. And now in the board editor, we can see there are three parts which are missing on the board right now. So we can choose, for example, the resistor, choose the exact device, add it, and the other devices. And for example, the MOSFET, we have two devices available at the moment. And for the TO220 device, we can also choose between the different mounting variants. So let's add this one. And one cool feature is also you can copy a board. Then you have two times the same board and can work independently on them. So you can... For example, in this board, you want to use the other device. You can just switch to the other one. Or you can also choose just the other mounting variant. And also the board and the schematic is also in sync. It's always in sync. So for example, if I remove one resistor, it disappears from both boards in the time. Yeah, so it's like an eagle, basically. And yeah, you can... Okay, that's... Sorry? Oh, okay. Right now, it's also no possible, in the laboratories, we do delete from the board, but it's planned to do that. So if I delete something, it appears in this list because it's not added to this board, but here it's still available in the other board. So okay, and after, let's say you have... Okay, that's just... Because I said already, the board editor is in work in progress, so there are some strange things. And there is even a very simple Gerber exporter without any option, but you just click Generate and open the direction. And if you don't trust me, the files are generated in this. Yeah, so you can just open them with Gerview, for example, and here it is. So very simple, but it works. Okay, so I think this is... So now the next steps. The first, the highest priority at the moment is to stabilize the file format, so do the last breaking changes and to create the first stable release. And for that, I also need to make the board editor really usable because it doesn't make fun like that. But it's already possible to order PCBs, so... And yeah, the next step is add more functionality, but yeah. So contributors welcome, of course, and yeah, that's it. What's it written in? The language, C++ 11 and Q5. Why not just participate? Okay, the question was again, why not instead contributing to QCCAT? And actually my answer is similar to the Horizon one because I think the library system is that important part of the EDA tool and it's a very fundamental low-level part and it's very hard to change this concept. And I think in Libre PCB, the concept is completely different than in QCCAT, so... I don't see Wayne going like this instead of... This is a problem. Okay, but... It's subject for discussion later. Yeah, yeah. More questions? So your question is the generic devices, where to order them then? So yeah, so the question is the part numbers. Are they part... Order codes and exact part numbers and so on? If they are included in the library and the current answer is at the moment, it's not part of the library, but I already have plans how to integrate it, so it will be in the library later. Yeah. So I can follow, for example, as a follower of the PGA and I want to go to the other direction and then keeping the overview. It's quite hard if you only have one view. Sorry, where is all the... No, the views that you see, perhaps the whole layout where you are and where you want to start and where you want to end and you see, you have another window where you are in a much larger scale. I'm not sure. You're asking about the board editor or... Does it happen? Can you have multiple views? Okay, okay. Is it intended to have multiple views of the same board, basically, with other regions? It's not planned this time, but of course it would be useful. Yeah. Okay, let's thank Orban again.