<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14267103</id><updated>2019-09-02T11:52:41.243+03:00</updated><category term="misc"/><category term="programming"/><category term="picture"/><category term="books"/><category term=".NET"/><category term="C#"/><category term="ASP.NET"/><category term="essay"/><category term="rant"/><category term="movies"/><category term="video"/><category term="javascript"/><category term="news"/><category term="personal"/><category term="software"/><category term="database"/><category term="WPF/Silverlight"/><category term="music"/><category term="administrative"/><category term="Visual Studio"/><category term="manga"/><category term="science"/><category term="web design"/><category term="Ajax"/><category term="chess"/><category term="github"/><category term="game"/><category term="browser"/><category term="politics"/><category term="technology"/><category term="Core"/><category term="XML"/><category term="places"/><category term="Coma"/><category term="IIS"/><category term="Windows API"/><category term="Java"/><category term="idea"/><category term="writing"/><category term="Linux"/><category term="Windows Server"/><category term="AngularJS"/><category term="Test Driven Development"/><category term="Windows Installer"/><category term="angular"/><category term="dream"/><category term="space"/><category term="Entity Framework"/><category term="TypeScript"/><category term="deployment"/><category term="food"/><category term="management"/><category term="question"/><category term="Sharepoint"/><category term="Windows Forms"/><category term="mobile"/><category term="religion"/><category term="Haxe"/><category term="LInQ"/><category term="NuGet"/><category term="T4"/><category term="VB"/><category term="architecture"/><category term="bicycle"/><category term="flash/shockwave"/><category term="friend"/><category term="npm"/><category term="physics"/><category term="translation"/><category term="Android"/><category term="F#"/><category term="MsAccess"/><category term="PHP"/><category term="cars"/><category term="flex"/><category term="mysql"/><category term="permanent"/><category term="process"/><category term="unit tests"/><title type='text'>Siderite&#39;s Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default?max-results=50&amp;redirect=false'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default?start-index=51&amp;max-results=50&amp;redirect=false'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1706</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>50</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14267103.post-6606238942564518478</id><published>2019-08-31T21:55:00.000+03:00</published><updated>2019-08-31T23:07:19.419+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="administrative"/><category scheme="http://www.blogger.com/atom/ns#" term="manga"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><title type='text'>Censorship, Wikipedia and manga online links</title><content type='html'>  I have a few posts that link to various sites that provide free online viewing of manga. Recently, I&#39;ve been getting DMCA notifications about &quot;copyright infringement&quot;, therefore I am replacing them with Wikipedia links. I am aware that whoever sent those notifications is wrong, since they can&#39;t possible have copy rights for links of sites they do not control, but I am not going down that rabbit hole. Google still works, after all.&lt;br /&gt;&lt;br /&gt;And speaking of Wikipedia, I&#39;ve recently been to Turkey where I was shocked to see that the entire Wikipedia site is blocked. According to &lt;a href=&quot;https://en.wikipedia.org/wiki/Censorship_of_Wikipedia&quot; target=&quot;_blank&quot; title=&quot;I know, it&#39;s a bit ironic to link to it, but bare with me&quot;&gt;Wikipedia&lt;/a&gt;, the site is or was censored in one way or another in China, France, Germany, Iran, Pakistan, Russia, Saudi Arabia, Syria, Tunisia, Turkey, United Kingdom, Uzbekistan and Venezuela. Hmm, France, Germany and the UK, huh? I wish you&#39;d have said something, visitors from those countries... assuming my blog is not censored as well, [intense stare into the future, horizon and the wall in front] as the shining beacon of freedom it is for the entire world [snapping out of it].&lt;br /&gt;&lt;br /&gt;Anyway, seems that only China and Turkey are seriously banning the Wikipedia articles, so I&#39;ve added a way to &quot;Fix&quot; the links by replacing them with Google queries *if* you are in Turkey, China or Taiwan, thanks to &lt;a href=&quot;https://ipapi.co/&quot; target=&quot;_blank&quot; title=&quot;ipapi - IP Address Location API&quot;&gt;ipapi&lt;/a&gt; for the user location detection service.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/6606238942564518478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=6606238942564518478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6606238942564518478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6606238942564518478'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/censorship-wikipedia-and-manga-online.html' title='Censorship, Wikipedia and manga online links'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-6364611237431135070</id><published>2019-08-30T12:30:00.000+03:00</published><updated>2019-08-30T17:06:46.874+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="personal"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>Istanbul, not Constantinopole</title><content type='html'>&lt;h2&gt;Intro&lt;/h2&gt;&lt;br /&gt;Istanbul is a beautiful lie. You are being served, begged of, you can haggle any price and no one will get upset, you are a king among serfs, everything is ancient, colorful and traditional. But as you walk around in the high but pleasant sea-side heat you can&#39;t help but wonder: how high was that initial price if you can lower it again and again and again? How are you a king while walking in the most populous city of one of the most powerful countries in the region? Why are there armored cars here and there, watching you while you unsuccessfully try to reach Wikipedia on your cell phone in Democracy Park? How can all these traditional shops sell the exact same thing all over the city? Why are there so many types of tea in the bazaar, but when you go to a cafe they only serve one?&lt;br /&gt;&lt;br /&gt;Now, I enjoyed my visit to Istanbul. My hotel was sub par, but I didn&#39;t care about it too much because the staff was doing their best to be accommodating. Yet there are some things I would have liked to know before going there. Here are my thoughts.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Prerequisites&lt;/h2&gt;&lt;br /&gt;The first thing to consider when going to Istanbul is if you want to rent a car. The answer to this is &quot;I do not want to rent a car, because I want to survive this vacation&quot;. The driving is chaotic and the roads are steep and crowded. Most of the time you don&#39;t even want to take cabs. People cross the street randomly and there are scooters that speed onto any temporarily free surface. Yet, except a motorcycle guy that probably died on the freeway, I have not seen even a car bump in this mess. To be a driver in Istanbul is both a badge of honor and skill and a psychiatric condition. You&#39;ve been warned!&lt;br /&gt;&lt;br /&gt;The second thing you need is select the part of Istanbul you want to be based in, because the city is vast and split by the sea into three parts: two in Europe and one in Asia. If you are a touristy kind of person, go to the Sultanahmet, Eminonu side. If you want more authenticity, real people living their lives, go to the Asian side, while the other European side is more for the city lifestyle and shopping, like in Taksim square. I haven&#39;t been to the modern part of the city, but from afar the buildings there look tall and beautiful and I am told it&#39;s great, too.&lt;br /&gt;&lt;br /&gt;You&#39;ve got to be careful choosing your hotel. Istanbul is so chocked with them that when you look at the map you feel that you have not zoomed in enough. In fact every building in some areas is a hotel and all that separates them are small windy one car streets: no side walk, no parking spaces, no green space. You have to pay attention to the pictures of the hotel, to how may rows of windows they have, for example. It will tell you how tall they really are and how many windows your room will have. A lot of these places have large lobbies and terraces, but it&#39;s where you enter the hotel and where you get breakfast in the morning, while your room might have just a window overlooking a fence. I&#39;ve seen rooms that had no windows. So it is vital you speak directly to the hotel and discuss the conditions of your rooms (do not trust they will get the information from Booking or act on it). It&#39;s not that they want to cheat you, but everything in Istanbul is negotiable. You need to speak to an actual person. The city abhors algorithms.&lt;br /&gt;&lt;br /&gt;One more important thing is your infrastructure. You need information and transportation. In Istanbul a lot of transportation works with an IstanbulKart, an electronic card you can put money on and then pay for trams, buses, ferries, etc. Cabs, of course, are different. Careful with the cabs: you might get a perfectly good one from the airport, with a meter and a credit card reader, then get another that only accepts cash and you must negotiate the price. Now, it might feel like a waste, but I recommend you get one kart for each person. While you can very well use only one for an entire group, I got into the situation where my wife passed and I didn&#39;t, so she had to wait until I found a recharging station and had to negotiate with the Turkish only interface.&lt;br /&gt;&lt;br /&gt;That gets me to the information portion: Turkey is not in the EU. That means that calls and SMS messages are very expensive and probably mobile Internet as well. While most shops have WiFi, when you are on the road you need Internet. If you have a dual SIM phone (and even if you don&#39;t) I recommend you buy a prepaid Turkish card for your Internet and local calls. I didn&#39;t do that, so I got stuck a lot of times. As so many translation systems work online, too, I think it&#39;s a good idea. Everything in Istanbul is in Turkish, with occasional afterthoughts about other languages. People there know very little English and when they do, you are not sure if they understood what you told them or they simply don&#39;t want to appear stupid.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The fun&lt;/h2&gt;&lt;br /&gt;The fun is all on you! I won&#39;t tell you what is good and what is not, because not one of the people that prepared me for my trip had an experience even close to mine. It&#39;s not that I am special, but people really are different and Istanbul provides differently depending on your style. What I can tell you is that it is a city worth visiting, but perhaps not for the usual reasons. It feels different. It&#39;s not a clone of all the other cities I&#39;ve been to. It really has its own culture, it&#39;s not overwhelmed with the same multinational corporations, it doesn&#39;t have banks and pharmacies everywhere, and the lack of rules (or the difference in them) opens the mind to possibilities.&lt;br /&gt;&lt;br /&gt;For me the mosques were all the same, the palaces were just buildings with old furniture in them, the museums collections of objects with little life to them. For example I went to the Royal Kitchens in Topkapi; there was nothing to reflect the life that went on there. Just random kitchen implements nicely ordered inside transparent cages. I didn&#39;t find the haggling with shop owners pleasant or the ice cream seller antics entertaining. The food was nice, but not extraordinary. The bazaars were full of shops that sold the exact same things. I couldn&#39;t get close to a shop without someone harassing me about buying or entering. These are not the reasons why I enjoyed Istanbul.&lt;br /&gt;&lt;br /&gt;Instead, it was the weird combination of new and old, of people living their lives differently, the all present sea breeze which made the heat bearable. It was the way people did all of these annoying things and yet I felt no malice from or toward them. It all felt viscerally eternal, like this city had the power to survive the world encroaching on it. &lt;br /&gt;&lt;br /&gt;I don&#39;t know, maybe you just need to have played Quest for Glory II to feel this way. Or maybe it&#39;s just me. I don&#39;t think I would want to return soon, but it&#39;s an experience I recommend. And now, try to get this out of your head:&lt;br /&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Wcze7EGorOk&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/6364611237431135070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=6364611237431135070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6364611237431135070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6364611237431135070'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/istanbul-not-constantinopole.html' title='Istanbul, not Constantinopole'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/Wcze7EGorOk/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-7198600908157297953</id><published>2019-08-30T01:08:00.001+03:00</published><updated>2019-08-30T01:08:25.395+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Vita Nostra (Метаморфозы #1), by Marina Dyachenko,  Sergey Dyachenko</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-IWsWDcQl6JM/XWhGY96NEzI/AAAAAAAAEE4/SOHLJfTiGBc9UgHtUNvC-Dnl4mnpryt2wCLcBGAs/s320/VitaNostra.jpg&quot; width=&quot;212&quot; height=&quot;320&quot; data-original-width=&quot;314&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; Imagine Harry Potter were a Russian girl named Sasha Samokhina. Instead of an Oliver Twist childhood followed by the happy admission to a place of high learning, she starts off within a happy family and then is forcefully inducted into a village institution apparently bent on making people crazy upon punishment of hurting said family. Instead of a loyal gaggle of friends to help the hero through random quests, it&#39;s a bunch of normal kids that either hate her, ignore her or get infatuated with her for their own random reasons. Instead of a nasty revenant with superpowers, she has only her own weakness and her insane teachers to fight against. And most of all, everything she achieves she does through effort, not by being lucky, getting powerful items from mysterious friends or being helped by previously unknown actors.&lt;br /&gt;&lt;br /&gt;  This is &lt;a href=&quot;https://www.goodreads.com/book/show/39090430-vita-nostra&quot; target=&quot;_blank&quot; title=&quot;the students are bizarre, and the curriculum even more so. The books are impossible to read, the lessons obscure to the point of maddening, and the work refuses memorization. Using terror and coercion to keep the students in line, the school does not punish them for their transgressions and failures; instead, it is their families that pay a terrible price. Yet despite her fear, Sasha undergoes changes that defy the dictates of matter and time; experiences which are nothing she has ever dreamed of . . . and suddenly all she could ever want.&quot;&gt;Vita Nostra&lt;/a&gt; - and not a book about Italian mobsters as the title made me believe, a book written by two married writers, &lt;a href=&quot;https://dyachenkowriters.com&quot; target=&quot;_blank&quot; title=&quot; Ukrainian co-authors of fantasy literature. They write in Russian, but also often first publish their books in Ukrainian. The Dyachenkos hail from Kiev and currently reside in California.&quot;&gt;Marina and Sergey Dyachenko&lt;/a&gt;, who wrote 26 other books before this you probably have never heard of because they are in Russian and no one bothered to translate them to English. I wonder if I would have ever heard of them if there weren&#39;t currently living in California. There are, of course, similarities to Harry Potter: the same idea that teachers perceive pupils as incompetent infants that cannot be trusted with information and power, for example. The same underestimation of children leads to both the successes of Potter and Samokhina (if hers can be called successes, it&#39;s a Russian book after all). There is also the isolation of children, away from family, friends and the rest of the world, a typical indoctrination move. Will our hero keep her morals or succumb to the ideas forced upon her by cruel educators? Will the teachers be proven right and their methods validated, or are they just assholes? Is this really a Hogwarts thing or more the Stanford Experiments meet 120 Days of Sodom? Well, that is for the reader to find out, as they go through the three books (yes, Russians are affected by trilogiopathy as well).&lt;br /&gt;&lt;br /&gt;  Warning, though, the book starts very slowly and with a style reminiscent of a lot of stories I disliked profusely: the dream sequence, where you cannot be certain that what the character perceives is real or not. Also, the ending is abrupt and says almost nothing. Oh, yes, I can speculate, but would be the point of that? In order to understand what is going on, you just have to read at least the second book as well.&lt;br /&gt;&lt;br /&gt;  Bottom line is that I liked the book after I got through the slow beginning, I was captivated by the lead character and I found it hard to put the book down, but it&#39;s not always easy to empathize with Sasha and the rest of the characters are not deeply explored.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/7198600908157297953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=7198600908157297953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/7198600908157297953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/7198600908157297953'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/vita-nostra-1-by-marina-dyachenko.html' title='Vita Nostra (Метаморфозы #1), by Marina Dyachenko,  Sergey Dyachenko'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-IWsWDcQl6JM/XWhGY96NEzI/AAAAAAAAEE4/SOHLJfTiGBc9UgHtUNvC-Dnl4mnpryt2wCLcBGAs/s72-c/VitaNostra.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-4370974655298910357</id><published>2019-08-30T00:37:00.004+03:00</published><updated>2019-08-30T00:37:34.943+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Quakeland: On the Road to America&#39;s Next Devastating Earthquake, by Kathryn Miles</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/--MocelsnG1E/XWhBDmH6sKI/AAAAAAAAEEs/tPbDFkPpEZwU4bR4l_kWKHGDNqpi7rXAwCLcBGAs/s320/Quakeland.jpg&quot; width=&quot;212&quot; height=&quot;320&quot; data-original-width=&quot;265&quot; data-original-height=&quot;400&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; We trust the ground beneath our feet as something solid that can take our weight, keep our structures straight, holds fast. Yes, we read things, we know about tectonics, but other than that, everything is stable. In the very beginning of &lt;a href=&quot;https://www.goodreads.com/en/book/show/32829304&quot; target=&quot;_blank&quot; title=&quot;A journey around the United States in search of the truth about the threat of earthquakes leads to spine-tingling discoveries, unnerving experts, and ultimately the kind of preparations that will actually help guide us through disasters. It&#39;s a road trip full of surprises.&quot;&gt;Quakeland&lt;/a&gt;, &lt;a href=&quot;https://www.kathrynmiles.net&quot; target=&quot;_blank&quot; title=&quot;an American journalist, writer, and environmental theorist. She is the author of three books including Superstorm: Nine Days Inside Hurricane Sandy, All Standing and Adventures with Ari&quot;&gt;Kathryn Miles&lt;/a&gt; thoroughly debunks that idea: Earth is an ocean of lava upon which very thin amalgamations of sand and rubble float precariously. What we call faults are just the largest of cracks, stable and classifiable; there are many more that we have no idea exist, fragile enough to be affected or even created by human activity. At this point, I was expecting an exciting journey through the center of the Earth. If the book would have continued as it started, it would have been a solid five stars, an educational tool to teach what most of the people have no idea about: the fragility of the thin crust we call solid ground. Alas, it was not to be.&lt;br /&gt;&lt;br /&gt;  The rest of Quakeland, let&#39;s say the last 80%, was a very US-centric analysis of how neglected earthquakes are when constructing and maintaining American infrastructure and a fear inducing series of &quot;what-ifs&quot; and possible disasters affecting that one country. I shouldn&#39;t have expected anything else, I mean the subtitle is pretty clear, but how can someone switch registers from talking about the very structure of the planet to the measly issues of one country and its weird measuring units? And maybe she did not use the almost ubiquitous bus size, but Miles did use the swimming pool together with the M-scale (do not let any &quot;serious&quot; seismologist hear you talk about Richter), the miles, the feet, the pounds, etc. The writing is competent and almost formulaic in structure, but I can&#39;t say I had any issues with it.&lt;br /&gt;&lt;br /&gt;  The bottom line is that the beginning was brilliant, the information that fracking (and mining in general) - regardless if it is toxic, damages the ground water or anything else activists throw at it - causes long series of earthquakes that affect whole areas while and even after operations cease, as powerful political and economic forces deny and actively fight the science that demonstrates this was new and important. Yet other than that it was just a normal reporter speculating about the possibilities of quakes - man made or not - causing serious harm. A lot of terribilism and fear mongering. That is why I can&#39;t really recommend this book and I will rate it as average only.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/4370974655298910357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=4370974655298910357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4370974655298910357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4370974655298910357'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/quakeland-on-road-to-americas-next.html' title='Quakeland: On the Road to America&#39;s Next Devastating Earthquake, by Kathryn Miles'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/--MocelsnG1E/XWhBDmH6sKI/AAAAAAAAEEs/tPbDFkPpEZwU4bR4l_kWKHGDNqpi7rXAwCLcBGAs/s72-c/Quakeland.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-4198039854191527952</id><published>2019-08-21T11:57:00.001+03:00</published><updated>2019-08-21T11:57:59.134+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="game"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><title type='text'>Installing emacs on Windows 10 linux subsystem and Android</title><content type='html'>  Here are the steps for installing Emacs on Windows 10:&lt;ul&gt;&lt;li&gt;First &lt;a href=&quot;https://itsfoss.com/install-bash-on-windows/&quot; target=&quot;_blank&quot; title=&quot;How to Install Linux Bash Shell on Windows 10&quot;&gt;enable the Linux subsystem&lt;/a&gt;:&lt;ul&gt;&lt;li&gt;Start Powershell as administrator&lt;/li&gt;&lt;li&gt;Type &#39;Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux&#39; and confirm&lt;/li&gt;&lt;li&gt;Restart computer&lt;/li&gt;&lt;li&gt;Go to Windows Store and search for &#39;Linux&#39;&lt;/li&gt;&lt;li&gt;Install Ubuntu, SUSE or anything you like from there and run it&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Second, &lt;a href=&quot;https://solarianprogrammer.com/2017/05/18/emacs-windows-subsystem-linux/&quot; target=&quot;_blank&quot; title=&quot;Emacs 25 on Windows Subsystem for Linux&quot;&gt;install Emacs&lt;/a&gt;:&lt;ul&gt;&lt;li&gt;Type &#39;sudo add-apt-repository ppa:kelleyk/emacs&#39;&lt;/li&gt;&lt;li&gt;Type &#39;sudo apt update&#39;&lt;/li&gt;&lt;li&gt;Type &#39;sudo apt install emacs25&#39;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;At this time you should have Emacs running in the Linux subsystem on Windows 10. &lt;br /&gt;&lt;br /&gt;You can also &lt;a href=&quot;https://endlessparentheses.com/running-emacs-on-android.html&quot; target=&quot;_blank&quot; title=&quot;Running Emacs on Android&quot;&gt;install it on Android&lt;/a&gt;:&lt;ul&gt;&lt;li&gt;Install the Termux app&lt;/li&gt;&lt;li&gt;Type &#39;apt update&#39;&lt;/li&gt;&lt;li&gt;Type &#39;apt install emacs&#39;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;But why would you need to install Emacs at all? Because now you can run &#39;&lt;a href=&quot;https://en.wikipedia.org/wiki/Dunnet_(video_game)&quot; target=&quot;_blank&quot; title=&quot; a surreal, cyberpunk text adventure written by Ron Schnell, based on a game he wrote in 1982. The name is derived from the first three letters of dungeon and the last three letters of Arpanet. It was first written in Maclisp for the DECSYSTEM-20, then ported to Emacs Lisp in 1992. Since 1994 the game has shipped with GNU Emacs; it also has been included with XEmacs.&quot;&gt;emacs -batch -l dunnet&lt;/a&gt;&#39;. Don&#39;t forget to &#39;save&#39;! :D&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/4198039854191527952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=4198039854191527952' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4198039854191527952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4198039854191527952'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/installing-emacs-on-windows-10-linux.html' title='Installing emacs on Windows 10 linux subsystem and Android'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-79656220927137529</id><published>2019-08-19T15:02:00.001+03:00</published><updated>2019-08-19T15:07:31.416+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Core"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Timers that capture the execution context, evil AsyncLocal and the quick and ugly solution used by Microsoft devs</title><content type='html'>  It all started with the source code for &lt;a href=&quot;https://github.com/aspnet/Extensions/blob/master/src/Shared/src/NonCapturingTimer/NonCapturingTimer.cs&quot; target=&quot;_blank&quot; title=&quot;Some things will always be internal&quot;&gt;NonCapturingTimer&lt;/a&gt;, a static factory class that was creating a &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.threading.timer&quot; target=&quot;_blank&quot; title=&quot;Provides a mechanism for executing a method on a thread pool thread at specified intervals. This class cannot be inherited.&quot;&gt;System.Threading.Timer&lt;/a&gt; without capturing the execution context and was described as &quot;&lt;i&gt;A convenience API for interacting with System.Threading.Timer in a way that doesn&#39;t capture the ExecutionContext. We should be using this (or equivalent) everywhere we use timers to avoid rooting any values stored in asynclocals.&lt;/i&gt;&quot;. What did that even mean?&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/aspnet/HttpClientFactory/issues/171&quot; target=&quot;_blank&quot; title=&quot;Don&#39;t capture the ExecutionContext in Timers created for expiry&quot;&gt;An issue&lt;/a&gt; opened by &lt;a href=&quot;http://davidfowl.com/&quot; target=&quot;_blank&quot; title=&quot;Principal Software Architect at Microsoft, born and raised in Barbados. He attended university in Florida (Florida Tech), where he had 2 internships at MSFT before joining full time in 2008.&quot;&gt;David Fowler&lt;/a&gt; sheds some light on this: &quot;&lt;i&gt;Any lazy activation of timers will capture the ExecutionContext. Combining this with a lazy initialization of the HttpClient and the handler graph may end up holding onto AsyncLocals for longer than expected. This could end up looking like a memory leak&lt;/i&gt;&quot;. This follows &lt;a href=&quot;https://twitter.com/davidfowl/status/1033964051607379968&quot; target=&quot;_blank&quot; title=&quot;I wasn&#39;t sure at first, but now I think AsyncLocal&amp;lt;T&amp;gt; is evil.&quot;&gt;a Twitter thread&lt;/a&gt; from Fowler declaring &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.threading.asynclocal-1&quot; target=&quot;_blank&quot; title=&quot;Represents ambient data that is local to a given asynchronous control flow, such as an asynchronous method.&quot;&gt;AsyncLocal&lt;/a&gt; as evil. &lt;br /&gt;&lt;br /&gt;There are also multiple issues that have crystallized into a proposal for a future version of .NET: &quot;&lt;a href=&quot;https://github.com/dotnet/corefx/issues/32866&quot; target=&quot;_blank&quot; title=&quot;The rooting behavior employed by Timer isn&#39;t obvious, and can lead to unexpected leaks&quot;&gt;Timer static Create methods that make rooting behavior explicit&lt;/a&gt;&quot;.&lt;br /&gt;&lt;br /&gt;And if you look at &lt;a href=&quot;https://github.com/search?p=2&amp;q=org%3Aaspnet+NonCapturingTimer.Create&amp;type=Code&quot; target=&quot;_blank&quot; title=&quot;NonCapturingTimer.Create in code&quot;&gt;the ASP.Net sources&lt;/a&gt; on GitHub, they do use the class mostly for one time timer calls and periodic cleanup calls. I should mention that Ben Adams from Microsoft calls &lt;a href=&quot;https://github.com/dotnet/corefx/issues/26523#issuecomment-417926130&quot; target=&quot;_blank&quot; title=&quot;Current (ugly) workaround&quot;&gt;this way of creating timers&lt;/a&gt; ugly.&lt;br /&gt;&lt;br /&gt;I don&#39;t have the time to go down further on this rabbit hole, but maybe people will find answers here when looking into this and comment on their findings.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/79656220927137529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=79656220927137529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/79656220927137529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/79656220927137529'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/timers-that-capture-execution-context.html' title='Timers that capture the execution context, evil AsyncLocal and the quick and ugly solution used by Microsoft devs'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-8880091659866527742</id><published>2019-08-19T11:29:00.003+03:00</published><updated>2019-08-19T11:37:20.372+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Ten Thousand (The Macht #1), by Paul Kearney </title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-arueXRXrDDc/XVpXbmEneeI/AAAAAAAAEEI/Gvj1cefsKOkCPRZB5_f2OljtOC0m7TwDQCLcBGAs/s320/TheTenThousand.jpg&quot; width=&quot;199&quot; height=&quot;320&quot; data-original-width=&quot;295&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; &lt;a href=&quot;https://www.goodreads.com/series/52925-the-macht&quot; target=&quot;_blank&quot; title=&quot;The story of Rictus... yeah, that&#39;s his name&quot;&gt;The Macht series&lt;/a&gt; is not related to anything Germanic, as the name might imply, but is instead inspired by the Greek &lt;a href=&quot;https://en.wikipedia.org/wiki/Hoplite&quot; target=&quot;_blank&quot; title=&quot;were citizen-soldiers of Ancient Greek city-states who were primarily armed with spears and shields. Hoplite soldiers utilized the phalanx formation in order to be effective in war with fewer soldiers.&quot;&gt;Hoplites&lt;/a&gt;. Even if &lt;a href=&quot;https://www.goodreads.com/book/show/3391271-the-ten-thousand&quot; target=&quot;_blank&quot; title=&quot;Retelling of the classic Greek history from Xenophon. Supported by targeted marketing, including ARCs, advertising in the genre press and online support.&quot;&gt;The Ten Thousand&lt;/a&gt; happens on another planet that has different continents and two moons and three intelligent races, &lt;a href=&quot;https://en.wikipedia.org/wiki/Paul_Kearney&quot; target=&quot;_blank&quot; title=&quot;a Northern Irish fantasy author. He is noted for his work in the epic fantasy subgenre and his work has been compared to that of David Gemmell.&quot;&gt;Paul Kearney&lt;/a&gt; could have written it just as well as a historical novel set in ancient Greece, with Greek mercenaries getting hired by Persians as weapons in a civil war that went awry. In fact, the story really is inspired by an actual historical group called the &lt;a href=&quot;https://en.wikipedia.org/wiki/Ten_Thousand&quot; target=&quot;_blank&quot; title=&quot; a force of mercenary units, mainly Greeks, employed by Cyrus the Younger to attempt to wrest the throne of the Persian Empire from his brother, Artaxerxes II. Their march to the Battle of Cunaxa and back to Greece (401–399 BC) was recorded by Xenophon (one of their leaders) in his work Anabasis.&quot;&gt;Ten Thousand&lt;/a&gt; and the main character, with the unfortunate name of &lt;span title=&quot;Oui, Patron!&quot;&gt;Rictus&lt;/span&gt;, seems to be inspired by that of real life &lt;a href=&quot;https://en.wikipedia.org/wiki/Xenophon&quot; target=&quot;_blank&quot; title=&quot;an ancient Greek philosopher, historian, soldier, mercenary, and student of Socrates. As a soldier, Xenophon became commander of the Ten Thousand at about 30, with noted military historian Theodore Ayrault Dodge saying of him, “the centuries since have devised nothing to surpass the genius of this warrior.”&quot;&gt;Xenophon&lt;/a&gt;. The book seems to be a retelling of &lt;a href=&quot;https://en.wikipedia.org/wiki/Anabasis_(Xenophon)&quot; target=&quot;_blank&quot; title=&quot;The narration of the journey is Xenophon&#39;s best known work, and &#39;one of the great adventures in human history&#39;&quot;&gt;Anabasis&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, the story is well written and short. I read the whole thing in a day. It&#39;s like a 300 novel, with the courageous and lethal Macht force finding itself on a foreign continent, surrounded by overwhelming hostile forces and having to march through rough and deadly terrain in order to get home. There is a lot of fighting, technical and military, some romance, bro-mance and feudal politics, but it&#39;s essentially the story of a huge march seen through the eyes of an experienced soldier, but young and new to the mercenary troupe.&lt;br /&gt;&lt;br /&gt;Bottom line: I don&#39;t know if I am going to read any other Macht book. This one felt self contained and I am not that much into ancient fights in the Bronze Age. I liked The Ten Thousand, though, and I recommend it as a short and captivating read.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/8880091659866527742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=8880091659866527742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8880091659866527742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8880091659866527742'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/the-ten-thousand-macht-1-by-paul-kearney.html' title='The Ten Thousand (The Macht #1), by Paul Kearney '/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-arueXRXrDDc/XVpXbmEneeI/AAAAAAAAEEI/Gvj1cefsKOkCPRZB5_f2OljtOC0m7TwDQCLcBGAs/s72-c/TheTenThousand.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-4169363135790518234</id><published>2019-08-19T10:57:00.002+03:00</published><updated>2019-08-19T10:57:20.652+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Luminous Dead, by Caitlin Starling </title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-bC6gG9m06fs/XVpTbaGjKyI/AAAAAAAAED8/mIPclIOn1okjT4BQ1NCsBy-kZMLcpYM9gCLcBGAs/s320/TheLuminousDead.jpg&quot; width=&quot;212&quot; height=&quot;320&quot; data-original-width=&quot;315&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt;  &lt;a href=&quot;https://www.goodreads.com/book/show/36117102-the-luminous-dead&quot; target=&quot;_blank&quot; title=&quot;A thrilling, atmospheric debut with the intensive drive of The Martian and Gravity and the creeping dread of Annihilation, in which a caver on a foreign planet finds herself on a terrifying psychological and emotional journey for survival.&quot;&gt;The Luminous Dead&lt;/a&gt; has only two active characters: a cave diver, covered in a special suit that enhances her strength and completely isolates her from the environment, and her handler, the person who guides and provides support remotely. At first glance it&#39;s a sci-fi story, as it happens on another planet, with futuristic technology, different rules, alien lifeforms, etc. However, it starts to itch at you that with the tech that was described, the tasks at hand could have been completed a lot more efficiently and safely, so what gives?&lt;br /&gt;&lt;br /&gt;Turns out the story is more of a metaphor than a fantastic cave adventure on another planet. Probably inspired by the death of &lt;a href=&quot;https://www.caitlinstarling.com&quot; target=&quot;_blank&quot; title=&quot; a writer and spreadsheet-wrangler who lives near Portland, Oregon. Equipped with an anthropology degree and an unhealthy interest in the dark and macabre, she writes horror-tinged speculative fiction of all flavors.&quot;&gt;Caitlin Starling&lt;/a&gt;&#39;s mother, it explores the damage done by losing your parents, the obsessions that drive the affected, the extent to which someone will go to quiet those voices in their heads. But I liked it. It&#39;s got just enough action and adrenaline to keep you going while it touches the painful emotional bits that the book was really about.&lt;br /&gt;&lt;br /&gt;Bottom line: I urge you to ignore all technical aspects of the story. It&#39;s not that the author did not made the effort to make them believable, it&#39;s that they are irrelevant to the moral of the book. Also ignore the wild emotional fluctuations of the characters: they are supposed to behave that way. The book feels as if following a personal journal with the events of the story being just sci-fi versions of the items there.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/4169363135790518234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=4169363135790518234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4169363135790518234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4169363135790518234'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/the-luminous-dead-by-caitlin-starling.html' title='The Luminous Dead, by Caitlin Starling '/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-bC6gG9m06fs/XVpTbaGjKyI/AAAAAAAAED8/mIPclIOn1okjT4BQ1NCsBy-kZMLcpYM9gCLcBGAs/s72-c/TheLuminousDead.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-1630670069684989381</id><published>2019-08-18T22:58:00.000+03:00</published><updated>2019-08-18T22:58:19.864+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><category scheme="http://www.blogger.com/atom/ns#" term="science"/><title type='text'>The giant house spider</title><content type='html'>  While being hosted in a small house in the &lt;a href=&quot;https://en.wikipedia.org/wiki/Argeș_County&quot; target=&quot;_blank&quot; title=&quot;Rotunda, Corbeni, to be more precise&quot;&gt;Arges county&lt;/a&gt;, I found myself face to... err... hairy body to hairy body with a large spider, at least 10 cm from the tips of the front legs to the tips of the hind legs. The body itself was about 2 cm in length. I tried to catch it, but it ran away and I didn&#39;t exactly feel safe handling it. However, from my standpoint, the adventure was just beginning. It starts with a picture:&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-WqRM63I2-GE/XVmlRPDBExI/AAAAAAAAEDw/ObuDiqvPdzgpmISZZzKhAKR3t83_3CzuwCLcBGAs/s1600/GiantHouseSpider.jpg&quot; imageanchor=&quot;1&quot; target=&quot;_blank&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-WqRM63I2-GE/XVmlRPDBExI/AAAAAAAAEDw/ObuDiqvPdzgpmISZZzKhAKR3t83_3CzuwCLcBGAs/s320/GiantHouseSpider.jpg&quot; width=&quot;320&quot; height=&quot;254&quot; data-original-width=&quot;1600&quot; data-original-height=&quot;1268&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In a &lt;a href=&quot;https://siderite.blogspot.com/2019/07/nature-in-valcea.html&quot; target=&quot;_blank&quot; title=&quot;Nature in Valcea&quot;&gt;previous post&lt;/a&gt;, I was telling you about &lt;a href=&quot;https://identify.plantnet.org/&quot; target=&quot;_blank&quot; title=&quot;Pl@antNet&quot;&gt;a web site&lt;/a&gt; that recognized plants from blurry pictures I had taken. I assumed that somewhere there was something similar for spiders. Alas, it doesn&#39;t seem to be the case, so I reverted to the classic Google search with descriptive words: a European spider 10 cm in length. I found it almost immediately, clearly a member of the genus &lt;a href=&quot;https://en.wikipedia.org/wiki/Tegenaria&quot; target=&quot;_blank&quot; title=&quot;a genus of fast-running funnel weavers that occupy much of the Northern Hemisphere except for Japan and Indonesia.&quot;&gt;Tegenaria&lt;/a&gt; in the family &lt;a href=&quot;https://en.wikipedia.org/wiki/Agelenidae&quot; target=&quot;_blank&quot; title=&quot;a large family of spiders in the suborder Araneomorphae. Well-known examples include the common &quot;grass spiders&quot; of the genus Agelenopsis. Nearly all Agelenidae are harmless to humans, but the bite of the hobo spider (Eratigena agrestis) may be medically significant, and some evidence suggests it might cause necrotic lesions.&quot;&gt;Agelenidae&lt;/a&gt;. Or is it?&lt;br /&gt;&lt;br /&gt;Funny enough, most of the spiders assigned to Tegenaria were recently (2013) moved to another genus, &lt;a href=&quot;https://en.wikipedia.org/wiki/Eratigena&quot; target=&quot;_blank&quot; title=&quot; a genus of spider in the Agelenidae family. Most of its species were moved from the genus Tegenaria in 2013. Two species that frequently build webs in and around human dwellings are now placed in this genus&quot;&gt;Eratigena&lt;/a&gt;, based on DNA and molecular analysis. So my spider, likely a &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Giant_house_spider&quot; target=&quot;_blank&quot; title=&quot;one of the biggest spiders of Central and Northern Europe. It was previously placed in the genus Tegenaria, where in addition to Tegenaria atrica, it was also documented as Tegenaria duellica, Tegenaria gigantea and Tegenaria saeva, among others, all thought to be different species. It is now a member of the newly described genus Eratigena.&quot;&gt;giant house spider&lt;/a&gt;&quot;, can be found either as Tegenaria atrica or Eratigena atrica (not to mention Tegenaria duellica, Tegenaria gigantea and Tegenaria saeva). I also can&#39;t be completely sure of the identification. As far as I can tell, it&#39;s a male, &lt;a href=&quot;https://sciencing.com/differences-between-male-female-spiders-8106959.html&quot; target=&quot;_blank&quot; title=&quot;The Differences Between Male and Female Spiders&quot;&gt;based on the large (pedi)palps&lt;/a&gt;, used not only to hold on to prey, but also to deposit sperm in the females. But while I think it looks most like an atrica, based on the pictures I found online, it could also be an &lt;a href=&quot;https://en.wikipedia.org/wiki/Agelena_labyrinthica&quot; target=&quot;_blank&quot;&gt;Agelena labyrinthica&lt;/a&gt; or a &lt;a href=&quot;https://en.wikipedia.org/wiki/Tegenaria_parietina&quot; target=&quot;_blank&quot;&gt;Tegenaria parietina&lt;/a&gt;, even if the first is found in Denmark and should be smaller and the second is rare and native to Central Asia.&lt;br /&gt;&lt;br /&gt;Considering it&#39;s a giant spider I found in a house, I will go with Eratigena atrica, but one has to wonder how active biology as a science is to have species of common arthropods reassigned from one genus to another just a few years ago. So yeah, a nice little story, for me at least, all starting from a picture of a spider in a bathroom.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/1630670069684989381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=1630670069684989381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/1630670069684989381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/1630670069684989381'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/the-giant-house-spider.html' title='The giant house spider'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-WqRM63I2-GE/XVmlRPDBExI/AAAAAAAAEDw/ObuDiqvPdzgpmISZZzKhAKR3t83_3CzuwCLcBGAs/s72-c/GiantHouseSpider.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-5300071010671595468</id><published>2019-08-14T23:39:00.000+03:00</published><updated>2019-08-14T23:39:02.745+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="manga"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="movies"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>Tate no Yuusha no Nariagari, or Rise of the Shield Hero. A ridiculous, but fun anime.</title><content type='html'>  &lt;a href=&quot;https://www.imdb.com/title/tt9529546/&quot; target=&quot;_blank&quot; title=&quot;a Japanese light novel series written by Aneko Yusagi. Originally published as a web novel in the user-generated novel site Shōsetsuka ni Narō, the series has since been published by Media Factory with an expanded story-line featuring illustrations by Seira Minami. As of June 25, 2019, twenty-two volumes have been published. The novel series was adapted into a manga series by Aiya Kyū and published by Media Factory, with thirteen volumes released as of April 23, 2019. Both the novel and manga series were licensed by One Peace Books and were published in North America starting in September 2015.&quot;&gt;Tate no Yuusha no Nariagari&lt;/a&gt; is one of those &lt;a href=&quot;https://en.wikipedia.org/wiki/Isekai&quot; target=&quot;_blank&quot; title=&quot;is the portal fantasy subgenre of Japanese light novels, manga, anime, and video games. Isekai works revolve around a normal person from Earth being transported to, reborn, or trapped in a parallel universe, usually a fantasy world.&quot;&gt;isekai&lt;/a&gt; animes where a normal Japanese boy is summoned in a magical realm to fight monsters. Once there, he realizes that the world and his character work exactly as in a fantasy video game, complete with items with upgradeable stats, waves of monsters and &lt;a href=&quot;https://www.youtube.com/watch?v=-vI5tdORhC0&quot; target=&quot;_blank&quot; title=&quot;It wouldn&#39;t be a fantasy world if it weren&#39;t a bit sexist, right?&quot;&gt;revealing female armor&lt;/a&gt;. He is summoned there with three other heroes, also from Japan, only from alternate universes, each of the heroes having their own magical item that defines their style. His item is a shield and immediately he notices that he is treated differently, with all honors given to the other three and only disgust for him. Long story short, he is forced to hone his skills through his will and efforts alone, while the others, spoiled by their environment, make no effort and therefore level up less.&lt;br /&gt;&lt;br /&gt;  I liked this anime and I will continue to watch it, although it&#39;s a bit ridiculous. I&#39;ve read the manga as well, which is also new, and there are slight differences in the sense that the anime is a little more serious. If you want a mindless game like experience in anime form, go for it. Here is a trailer:&lt;br /&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/ZG6eC7WT1gk&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/5300071010671595468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=5300071010671595468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5300071010671595468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5300071010671595468'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/tate-no-yuusha-no-nariagari-or-rise-of.html' title='Tate no Yuusha no Nariagari, or Rise of the Shield Hero. A ridiculous, but fun anime.'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/ZG6eC7WT1gk/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-4075668237661687669</id><published>2019-08-14T23:19:00.000+03:00</published><updated>2019-08-14T23:19:45.872+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="manga"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="movies"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>Violet Evergarden, a really nice anime, with an uncertain future</title><content type='html'>  &lt;a href=&quot;https://www.imdb.com/title/tt7078180/&quot; target=&quot;_blank&quot; title=&quot;a Japanese light novel series written by Kana Akatsuki and illustrated by Akiko Takase. It won the grand prize in the fifth Kyoto Animation Award&#39;s novel category in 2014, the first ever work to win a grand prize in each of the three categories (novel, scenario, and manga). The anime adaptation was first announced via a commercial of the light novel&#39;s first volume in May 2016.&quot;&gt;Violet Evergarden&lt;/a&gt; is set in a steampunk universe in which technology, other than metal prosthetics, is at the 19th century level, and the main character is a girl that was used as an elite child soldier in a terrible war who now has to find a purpose in a civilian life. She takes on the job of a &quot;auto memory doll&quot;, a person who needs to put into words the feelings of others. That&#39;s a bit of a stretch, because she doesn&#39;t know how to feel herself... it&#39;s like me taking on a job in psychology or artistic design so as to learn a new skill. Certainly great for me, but kind of sucks for my employer!&lt;br /&gt;&lt;br /&gt;  Anyway, the animation is really well done and the acting is top notch. The story itself is beautiful, even if at times inconsistent. After watching the 14 episodes of the first season, I was itching for more, only to hear from a colleague that the studio responsible for the animation, &lt;a href=&quot;https://en.wikipedia.org/wiki/Kyoto_Animation&quot; target=&quot;_blank&quot; title=&quot;a Japanese animation studio and a light novel publisher located in Uji, Kyoto Prefecture, Japan. It was established in 1981 by former Mushi Pro staff. Presided by Hideaki Hatta, the company is also affiliated with studio Animation Do. As of 2015, Kyoto Animation has produced 21 anime series and numerous films. Unlike most animation studios, Kyoto Animation&#39;s animators are salaried employees rather than freelance workers. Therefore, Kyoto Animation animators are able to focus more on the quality of each frame rather than on meeting frame production quotas.&quot;&gt;Kyoto Animation&lt;/a&gt;, was destroyed in a terrible &lt;a href=&quot;https://en.wikipedia.org/wiki/Kyoto_Animation_arson_attack&quot; target=&quot;_blank&quot; title=&quot;occurred at Kyoto Animation&#39;s Studio 1 building in the Fushimi ward of Kyoto, Japan, on the morning of 18 July 2019. The arson killed at least 35 people, injured an additional 33, and destroyed most of the materials and computers in Studio 1. It is one of the deadliest massacres in Japan since the end of World War II and the deadliest building fire in Japan since the 2001 Myojo 56 building fire.&quot;&gt;arson attack&lt;/a&gt;. That doesn&#39;t bode well for a sequel, yet a spin-off film had already been announced, so who knows?&lt;br /&gt;&lt;br /&gt;  Bottom line: it&#39;s not for everyone. PTSD romance, I would call it. But it nicely animated and I liked the story. I felt that the characters were a bit off, but not annoyingly so. Here is a trailer, in English:&lt;br /&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/UZEOpfelkxQ&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/4075668237661687669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=4075668237661687669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4075668237661687669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4075668237661687669'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/violet-evergarden-really-nice-anime.html' title='Violet Evergarden, a really nice anime, with an uncertain future'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/UZEOpfelkxQ/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-1249186196561837766</id><published>2019-08-13T13:14:00.002+03:00</published><updated>2019-08-13T13:15:28.194+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Binding, by Bridget Collins </title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-jv-8Y2eIRE8/XVKCebmq4aI/AAAAAAAAEDY/U6IQG985WTAXuZKPaVR63A6p3uHSKXwewCLcBGAs/s320/TheBinding.jpg&quot; width=&quot;222&quot; height=&quot;320&quot; data-original-width=&quot;318&quot; data-original-height=&quot;458&quot; style=&quot;float:left&quot; alt=&quot;book cover&quot;/&gt;  There is a trope in fantasy writing that goes like this: young person is uprooted from their life as they learn a new skill or gain a new power, while people in authority teach them things so slowly and inefficiently that the young person needs to make efforts to learn by themselves. Harry Potter had it. &lt;a href=&quot;https://www.goodreads.com/book/show/39964740-the-binding&quot; target=&quot;_blank&quot; title=&quot;Young Emmett Farmer is working in the fields when a strange letter arrives summoning him away from his family. He is to begin an apprenticeship as a Bookbinder—a vocation that arouses fear, superstition, and prejudice among their small community&quot;&gt;The Binding&lt;/a&gt; has it. Only in the case of this book, the young person is someone who is always sick without knowing why, is suddenly sent off from home to be an apprentice for someone he doesn&#39;t know and while he understands nothing of what he is supposed to do. Months later and 25% of the book in, he still hasn&#39;t learnt anything, although he is always tired and exhausted for no good reason whenever he is about to. If he doesn&#39;t collapse, his mentor will! And, spoilers ahead, his mentor then dies.&lt;br /&gt;&lt;br /&gt;So after a quarter of the book, absolutely nothing happened while I had to suffer a depressed weak and barely teenage boy who didn&#39;t want, know, or want to know anything. &lt;a href=&quot;https://twitter.com/br1dgetcollins&quot; target=&quot;_blank&quot; title=&quot;Bridget Collins trained as an actor at the London Academy of Music and Dramatic Art after reading English at King&#39;s College, Cambridge. She is the author of seven acclaimed books for young adults and has had two plays produced, one at the Edinburgh Fringe Festival. THE BINDING is her first adult novel.&quot;&gt;Bridget Collins&lt;/a&gt;&#39; writing is competent and I am sure things are going to get better from here (I mean, they can hardly get worse), but I just won&#39;t continue to read the book.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/1249186196561837766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=1249186196561837766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/1249186196561837766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/1249186196561837766'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/the-binding-by-bridget-collins.html' title='The Binding, by Bridget Collins '/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-jv-8Y2eIRE8/XVKCebmq4aI/AAAAAAAAEDY/U6IQG985WTAXuZKPaVR63A6p3uHSKXwewCLcBGAs/s72-c/TheBinding.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-1371966426419294746</id><published>2019-08-10T00:50:00.000+03:00</published><updated>2019-08-10T00:50:16.199+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Magic for Liars, by Sarah Gailey </title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-iEFh-hOHujM/XU3m7-k9IKI/AAAAAAAAEDA/O8d0U1lwFRAdxEbGurzFKhGqVE-j6VMugCLcBGAs/s320/MagicForLiars.jpg&quot; width=&quot;212&quot; height=&quot;320&quot; data-original-width=&quot;314&quot; data-original-height=&quot;475&quot; style=&quot;float:left&quot; alt=&quot;book cover&quot; /&gt; &lt;a href=&quot;https://www.goodreads.com/book/show/41555947-magic-for-liars&quot; target=&quot;_blank&quot; title=&quot;when Ivy is hired to investigate the gruesome murder of a faculty member at her sister’s private academy, the stalwart detective starts to lose herself in the case, the life she could have had, and the answer to the mystery that seems just out of her reach.&quot;&gt;Magic for Liars&lt;/a&gt; is one of those stories where magic exists in a hidden layer of our world, yet it doesn&#39;t bring any happiness. People are still people, regardless of their power. And what better way to explore human nature than writing a detective story in a high school for magical kids?&lt;br /&gt;&lt;br /&gt;  &lt;a href=&quot;http://www.sarahgailey.com/&quot; target=&quot;_blank&quot; title=&quot; is an American author. Their alternate history novella River of Teeth was a finalist for the 2017 Nebula Award for Best Novella, the 2018 Hugo Award for Best Novella, and the 2018 Locus Award for Best Novella. In 2018, they also won the Hugo Award for Best Fan Writer.&quot;&gt;Sarah Gailey&lt;/a&gt; writes the story from the viewpoint of the detective, a woman who&#39;s greatest frustrations stem from her sister being a magician, while she is just &quot;normal&quot;. Yet when she is tasked to find out the circumstances of the death of one of the teachers in the magic school, she jumps on it, making her realize more about herself and the relationships with family and other people.&lt;br /&gt;&lt;br /&gt;  Yes, the magic is quite incidental and the detective part quite secondary and it could just as well been written in a space academy or science lab or anywhere where flawed people have to manage each other and the balance of power between them. And while I feel the main character was compelling and the story well written, I can&#39;t quite shake the feeling I&#39;ve been duped into reading a touchy-feely type of drama that I didn&#39;t really intend to read. You will not read about the specifics of magic in any kind of way; it is quite bluntly used as a tool that the reader needs not understand. You will not be amazed by the amazing feats of deduction of a fascinating detective; the main character is by definition a very normal person with a penchant for introspection and focusing on her own messed up feelings.&lt;br /&gt;&lt;br /&gt;  In the end you know the spouse did it, or the butler, or the person who flirts with the detective, or the god-like magician, or the weird kid. The culprit isn&#39;t even that important for the plot. It&#39;s all about the theoretical dynamics between the people and what makes them tick.&lt;br /&gt;&lt;br /&gt;  Bottom line: a fine investigation into the core motivations of people, woven in a rather short and bland story which purely incidentally features detectives and magic.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/1371966426419294746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=1371966426419294746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/1371966426419294746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/1371966426419294746'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/magic-for-liars-by-sarah-gailey.html' title='Magic for Liars, by Sarah Gailey '/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-iEFh-hOHujM/XU3m7-k9IKI/AAAAAAAAEDA/O8d0U1lwFRAdxEbGurzFKhGqVE-j6VMugCLcBGAs/s72-c/MagicForLiars.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-8800017235069073429</id><published>2019-08-09T09:00:00.000+03:00</published><updated>2019-08-09T09:09:41.794+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>When is efficiency bad? TED talk: The human skills we need in an unpredictable world, from Margaret Heffernan</title><content type='html'>  The talk is a bit overreaching, doing more things than it should have tried to do, in other words not very efficient, but it contains some really interesting ideas and it&#39;s extremely well articulated. As a software developer, I always thrive for efficiency, but what Margaret Heffernan says is that efficiency is good only when the future is predictable. &lt;span class=&quot;important&quot;&gt;In a fast changing world (and getting faster), efficiency doesn&#39;t just not help, it makes things worse. Sometimes you can&#39;t plan, but you can prepare.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As expected, I wasn&#39;t as interested in the humanistic part of the talk as I was in the technical aspects: algorithmic efficiency is only good with things that can be measured. If you want to innovate or to adapt, it&#39;s trial and error that works best. I got that giddiness I get when people tell me &quot;you can&#39;t do THAT in software!&quot;. Oh, ye of little faith! But there is something there, something extremely useful, a tool that I can use whenever I get stuck in logic loops or some manager tells me that he needs data in order to make a decision about the project that would generate the data.&lt;br /&gt;&lt;br /&gt;&lt;iframe src=&quot;https://embed.ted.com/talks/margaret_heffernan_the_human_skills_we_need_in_an_unpredictable_world&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen style=&quot;width:100%; height:60vh;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href=&quot;https://www.ted.com/talks/margaret_heffernan_the_human_skills_we_need_in_an_unpredictable_world&quot; target=&quot;_blank&quot; title=&quot; In an environment that defies so much forecasting, efficiency won&#39;t just not help us, it specifically undermines and erodes our capacity to adapt and respond. &quot;&gt;Margaret Heffernan: The human skills we need in an unpredictable world&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/8800017235069073429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=8800017235069073429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8800017235069073429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8800017235069073429'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/when-is-efficiency-bad-ted-talk-human.html' title='When is efficiency bad? TED talk: The human skills we need in an unpredictable world, from Margaret Heffernan'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-341461545973441686</id><published>2019-08-06T12:19:00.002+03:00</published><updated>2019-08-08T13:21:53.589+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Core"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>.NET Core: Cannot resolve scoped service &#39;Microsoft.Extensions.Options.IOptionsSnapshot...&#39; from root provider</title><content type='html'>  I was trying to create an instance of an object from a service provider to resolve any dependencies, using &lt;i&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.activatorutilities.createinstance#Microsoft_Extensions_DependencyInjection_ActivatorUtilities_CreateInstance__1_System_IServiceProvider_System_Object___&quot; target=&quot;_blank&quot; title=&quot;Instantiate a type with constructor arguments provided directly and/or from an IServiceProvider&quot;&gt;ActivatorUtilities.CreateInstance&lt;/a&gt;&amp;lt;MyObject&amp;gt;(_serviceProvider)&lt;/i&gt; and I was getting the exception: &lt;pre&gt;System.InvalidOperationException&lt;br /&gt;  HResult=0x80131509&lt;br /&gt;  Message=Cannot resolve scoped service &#39;Microsoft.Extensions.Options.IOptionsSnapshot`1[ExternalConfiguration]&#39; from root provider.&lt;/pre&gt;&lt;br /&gt;My object was receiving a parameter of type &lt;i&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.options.ioptionssnapshot-1&quot; target=&quot;_blank&quot; title=&quot;Used to access the value of TOptions for the lifetime of a request.&quot;&gt;IOptionsSnapshot&lt;/a&gt;&amp;lt;ExternalConfiguration&amp;gt;&lt;/i&gt; and upon further investigation, my service provider (which came as a resolution from the dependency injection for IServiceProvider) was actually a &lt;a href=&quot;https://github.com/aspnet/DependencyInjection/blob/master/src/DI/ServiceLookup/ServiceProviderEngineScope.cs&quot; target=&quot;_blank&quot; title=&quot;source code, because there is no Microsoft Docs page for it&quot;&gt;ServiceProviderEngineScope&lt;/a&gt; which just refused to resolve any IOptionsSnapshot! Funny enough, if I replaced IOptionsSnapshot with &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.options.ioptionsmonitor-1&quot; target=&quot;_blank&quot; title=&quot;Used for notifications when TOptions instances change.&quot;&gt;IOptionsMonitor&lt;/a&gt;, which in my mind is a heavier interface, it worked without issues. Further still, the problem appeared only inside an IHostedService (a BackgroundService hooked up with services.AddHostedService&amp;lt;T&amp;gt;); if I wrote the same code in a controller action, for instance, it worked fine.&lt;br /&gt;&lt;br /&gt;The .NET 2+ implementation of IOptionsSnapshot&amp;lt;T&amp;gt; is &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.options.optionsmanager-1&quot; target=&quot;_blank&quot; title=&quot;Implementation of IOptions and IOptionsSnapshot.&quot;&gt;OptionsManager&lt;/a&gt;&amp;lt;T&amp;gt;. If I manually resolved an instance of OptionsManager before my object, then added it as a parameter, the code worked:&lt;pre&gt;var optionsSnapshot = ActivatorUtilities.CreateInstance&amp;lt;OptionsManager&amp;lt;TestOptions&amp;gt;&amp;gt;(_serviceProvider);&lt;br /&gt;var myObject = ActivatorUtilities.CreateInstance&amp;lt;MyObject&amp;gt;(_serviceProvider, optionsSnapshot);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, specifically, the issue is that &lt;span class=&quot;important&quot;&gt;in .NET Core, the service provider implementation cannot resolve IOptionsSnapshot interfaces in worker services. You can still do that manually, but I suspect it is a bug, since there is no problem using an IOptionsMonitor instead of IOptionsSnapshot.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A possible solution is to use an additional service provider only for IOptionsSnapshot. Warning, this will not work in a general situation if the dependencies from the additional service provider also need parameters that would be found in the original service provider:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;// initialization code&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; serviceCollection = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ServiceCollection();&lt;br /&gt;serviceCollection.AddSingleton(&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(IOptionsSnapshot&amp;lt;&amp;gt;), &lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(OptionsManager&amp;lt;&amp;gt;)&lt;br /&gt;);&lt;br /&gt;serviceCollection.AddSingleton(&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(IOptionsFactory&amp;lt;&amp;gt;),&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(OptionsFactory&amp;lt;&amp;gt;)&lt;br /&gt;);&lt;br /&gt;_additionalServiceProvider = serviceCollection.BuildServiceProvider();&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;// resolution code&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; constructor = &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(MyObject).GetConstructors()&lt;br /&gt;  .Where(ci=&amp;gt;ci.IsPublic)&lt;br /&gt;  .Single();&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; args = constructor.GetParameters()&lt;br /&gt;    .Select(p =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; _serviceProvider.GetService(p.ParameterType);&lt;br /&gt;        }&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;catch&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; _additionalServiceProvider.GetService(p.ParameterType);&lt;br /&gt;        }&lt;br /&gt;    })&lt;br /&gt;    .ToArray();&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; ActivatorUtilities.CreateInstance&amp;lt;MyObject&amp;gt;(_serviceProvider, args);&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/341461545973441686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=341461545973441686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/341461545973441686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/341461545973441686'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/net-core-cannot-resolve-scoped-service.html' title='.NET Core: Cannot resolve scoped service &#39;Microsoft.Extensions.Options.IOptionsSnapshot...&#39; from root provider'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-3666852429317705364</id><published>2019-08-05T19:34:00.003+03:00</published><updated>2019-08-10T00:33:04.970+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Blackfish City, by Sam J. Miller</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-7zbw7WqmwT4/XUhW_iUI4tI/AAAAAAAAEC0/6KDgYxjpIAsgNihewu_pRZgkbUWMlAKgQCLcBGAs/s320/BlackfishCity.jpg&quot; width=&quot;212&quot; height=&quot;320&quot; data-original-width=&quot;314&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt;  There are writers like Steven Erikson, describing worlds so vast that characters seem to drown in them, there are writers like William Gibson or Charles Stross, who go so far into the future that people seem to lose their relevance, yet none of them dare to ignore their characters or fail to make them interesting. Yet, that&#39;s what &lt;a href=&quot;https://samjmiller.com/&quot; target=&quot;_blank&quot; title=&quot; a science fiction, fantasy and horror short fiction author. His stories have appeared in publications such as Clarkesworld, Asimov&#39;s Science Fiction, and Lightspeed, along with over fifteen &#39;year&#39;s best&#39; story collections.&quot;&gt;Sam J. Miller&lt;/a&gt; does in &lt;a href=&quot;https://www.goodreads.com/book/show/35068768-blackfish-city&quot; target=&quot;_blank&quot; title=&quot;After the climate wars, a floating city is constructed in the Arctic Circle, a remarkable feat of mechanical and social engineering, complete with geothermal heating and sustainable energy. The city’s denizens have become accustomed to a roughshod new way of living, however, the city is starting to fray along the edges—crime and corruption have set in, the contradictions of incredible wealth alongside direst poverty are spawning unrest, and a new disease called “the breaks” is ravaging the population.&quot;&gt;Blackfish City&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;10% in and I couldn&#39;t bare reading any more of this book. I couldn&#39;t care less about the asexual person that is whining about his life, I couldn&#39;t care less about the orphan girl whining about her life, I couldn&#39;t care less about the sick homosexual boy who is whining about his life and I couldn&#39;t care less about the anonymous radio show that narrated what the city was instead of the action showing me. Should I care about all the world getting sunk under the water until the only livable places are floating megacities reminiscent of Waterworld and run by semi abandoned AIs? Should I care about the artificial drama, weird futuristic disease or the grey whining world that Miller describes? No. I refuse!&lt;br /&gt;&lt;br /&gt;Bottom line: a poor man&#39;s cyberpunk story, with the mechanical &quot;woke&quot;, but irrelevant to anything else, sexual and cultural references, with boring characters and a story that I had to make an effort to wade through and still didn&#39;t seem to go anywhere.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/3666852429317705364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=3666852429317705364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3666852429317705364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3666852429317705364'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/there-are-writers-like-steven-erikson.html' title='Blackfish City, by Sam J. Miller'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-7zbw7WqmwT4/XUhW_iUI4tI/AAAAAAAAEC0/6KDgYxjpIAsgNihewu_pRZgkbUWMlAKgQCLcBGAs/s72-c/BlackfishCity.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-8844183668849744645</id><published>2019-08-04T23:58:00.003+03:00</published><updated>2019-08-04T23:58:41.911+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>City of Miracles (The Divine Cities #3), by Robert Jackson Bennett </title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/--C8uVuwNbGs/XUdDEHIwk1I/AAAAAAAAECo/ZcvPQ0kyiYAQ0u0RIZwn6GXR3By5ulUzACLcBGAs/s320/CityOfBlades.jpg&quot; width=&quot;207&quot; height=&quot;320&quot; data-original-width=&quot;308&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; It takes the third book to see that the &quot;hero&#39;s journey&quot; is actually Sigrud&#39;s, even if he is the lead character only in this final book of the Divine Cities series. And yes, it is the final book, with a satisfying and very permanent ending, with no hope of dragging it on. Hell, if you consider there are three books and two cities and no gods left, you could wonder how would anyone continue the story if pressured by publishing companies.&lt;br /&gt;&lt;br /&gt;  &lt;a href=&quot;http://www.robertjacksonbennett.com/&quot; target=&quot;_blank&quot; title=&quot;an American writer of speculative fiction, born in Baton Rouge, Louisiana. He studied at the University of Texas and settled down in Austin, Texas.&quot;&gt;Robert Jackson Bennett&lt;/a&gt; did not disappoint with &lt;a href=&quot;https://www.goodreads.com/book/show/31522139-city-of-miracles&quot; target=&quot;_blank&quot; title=&quot;Revenge. It&#39;s something Sigrud je Harkvaldsson is very, very good at. So when he learns that his oldest friend and ally has been assassinated, he knows exactly what to do — and that no force can stop him from meting out the suffering Shara&#39;s killers deserve.&quot;&gt;City of Miracles&lt;/a&gt;, switching registers a little by turning the usual steampunk-noir detective story into more of a chase and revenge thriller. The villain is revealed quite soon, the mystery split into multiple little quirks that nag at you until the end of the book and a massive divine battle to top it all up. Yet I was a little disappointed with the ending. I know, rationally, that it is a great ending, but emotionally I didn&#39;t get what I needed from it, especially as I was still fired up on the penultimate chapter only to get an &quot;aftermath&quot; chapter for last.&lt;br /&gt;&lt;br /&gt;  Maybe it was that one of the options they employed at the end could have easily been the first and solved a lot of problems to boot. Or the fact that a lot of the grief in the final third of the book came from Sigrud not checking his kills, which is something he would never ever do. It felt a little stretched and tired compared to the other stories.&lt;br /&gt;&lt;br /&gt;  Sometimes I wonder, is it easier or harder for a writer to just abandon a world that he so carefully crafted? Is it a burden that everything that is successful needs to be turned into a trilogy or a series, or is it like coming home, writing about good friends living in your head? Either way, I am kind of grateful to Bennett for ending it all. I would have read more and more books like these if he wrote them, because I am an addict at heart, but I believe both of us can do better.&lt;br /&gt;&lt;br /&gt;  Bottom line: It&#39;s kind of difficult to compare the three books in the series. The first one was the most captivating, but also first, the second one was darker, yet in the same vein, while the last felt philosophical and like the writer wanted to get it done with. You can read either as standalone, although it makes more sense to read the whole trilogy from first to last. I recommend it and I will read more from the author.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/8844183668849744645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=8844183668849744645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8844183668849744645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8844183668849744645'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/08/city-of-miracles-divine-cities-3-by.html' title='City of Miracles (The Divine Cities #3), by Robert Jackson Bennett '/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/--C8uVuwNbGs/XUdDEHIwk1I/AAAAAAAAECo/ZcvPQ0kyiYAQ0u0RIZwn6GXR3By5ulUzACLcBGAs/s72-c/CityOfBlades.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-497851961441914220</id><published>2019-07-31T23:33:00.002+03:00</published><updated>2019-07-31T23:33:51.918+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>City of Blades (The Divine Cities #2), by Robert Jackson Bennett</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-2MZrA2x7Qm8/XUH4oGCLhbI/AAAAAAAAEB8/xp84KwzM0o8rGXLQjhhUhRrAxIyFlS2kwCLcBGAs/s320/CityOfBlades.jpg&quot; width=&quot;207&quot; height=&quot;320&quot; data-original-width=&quot;308&quot; data-original-height=&quot;475&quot; style=&quot;float:left&quot; alt=&quot;book cover&quot; /&gt; &lt;a href=&quot;http://www.robertjacksonbennett.com/&quot; target=&quot;_blank&quot; title=&quot;an American writer of speculative fiction, born in Baton Rouge, Louisiana. He studied at the University of Texas and settled down in Austin, Texas.&quot;&gt;Robert Jackson Bennett&lt;/a&gt; caught my attention with the first book in the &lt;a href=&quot;https://www.goodreads.com/series/159695-the-divine-cities&quot; target=&quot;_blank&quot; title=&quot;In a world where terrifying, capricious gods once walked the earth, enslaving and brutalizing millions, three unforgettable protagonists struggle to come to terms with the mysteries these divinities left behind— and to make sure these cruel masters do not rise again. &quot;&gt;Divine Cities&lt;/a&gt; series: &lt;a href=&quot;https://siderite.blogspot.com/2019/05/city-of-stairs-divine-cities-1-by.html&quot; target=&quot;_blank&quot; title=&quot;my review of it&quot;&gt;City of Stairs&lt;/a&gt;. It was a steam-punk and magic detective story featuring a strong female character and her trusty sidekick, with great world building and character work. &lt;a href=&quot;https://www.goodreads.com/book/show/23909755-city-of-blades&quot; target=&quot;_blank&quot; title=&quot; the city’s god is dead. The city itself lies in ruins. And to its new military occupiers, the once-powerful capital is a wasteland of sectarian violence and bloody uprisings. So it makes perfect sense that General Turyin Mulaghesh — foul-mouthed hero of the battle of Bulikov, rumored war criminal, ally of an embattled Prime Minister — has been exiled there to count down the days until she can draw her pension and be forgotten.&quot;&gt;City of Blades&lt;/a&gt; is kind of the same, but slightly darker.&lt;br /&gt;&lt;br /&gt;What surprised me in this book was that the author chose to abandon his hero of the previous volume and bring forth one that was a secondary character in that. It&#39;s still a whodunit, it&#39;s still a strong female lead fighting divine but malevolent forces. If it ain&#39;t broke, don&#39;t fix it, right? Only City of Blades is more about the personal pain of people, their sacrifice and service, their (dashed) hopes and dreams, the promise of the afterlife.&lt;br /&gt;&lt;br /&gt;Long story short, I was planning to read something else at the end of the book, but instead I&#39;ve just started immediately with &lt;a href=&quot;https://www.goodreads.com/book/show/31522139-city-of-miracles&quot; target=&quot;_blank&quot; title=&quot;Revenge. It&#39;s something Sigrud je Harkvaldsson is very, very good at. Maybe the only thing. So when he learns that his oldest friend and ally, former Prime Minister Shara Komayd, has been assassinated, he knows exactly what to do — and that no mortal force can stop him from meting out the suffering Shara&#39;s killers deserve. &quot;&gt;City of Miracles&lt;/a&gt;, the third and last book in the trilogy. I love this series!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/497851961441914220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=497851961441914220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/497851961441914220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/497851961441914220'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/city-of-blades-divine-cities-2-by.html' title='City of Blades (The Divine Cities #2), by Robert Jackson Bennett'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-2MZrA2x7Qm8/XUH4oGCLhbI/AAAAAAAAEB8/xp84KwzM0o8rGXLQjhhUhRrAxIyFlS2kwCLcBGAs/s72-c/CityOfBlades.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-971904200457914047</id><published>2019-07-28T22:56:00.001+03:00</published><updated>2019-07-28T23:17:03.341+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="essay"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="personal"/><title type='text'>Nature in Valcea</title><content type='html'>  I am going to try something new with this blog post. Usually, when I go somewhere on vacation, the things that capture my attention are not what interest about anybody else in my entourage. I am also not a very lyrical writer, so what&#39;s the point of enumerating the places I&#39;ve been from the perspective (oh, so much used!) of the casual tourist. I imagine myself writing one of those horrid &quot;10 things to do in...&quot; articles, promptly vomit and desist from thinking about it.&lt;br /&gt;&lt;br /&gt;With this post, though, I am going to tell you of the wild (but accessible) area that I&#39;ve explored and where to find it, how I felt and, if I can find the references, what plants and animals live there. You see, when I go somewhere, I avoid people and take really bad pictures of flowers and plants, butterflies, weird things and sometimes landscapes.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;The place&lt;/h1&gt;&lt;br /&gt;I&#39;ve been to Cheile Bistritei Valcene (the canyon of the river Bistritza from Valcea - there is another one in the north of the country) and in the valley of the Luncavatz river. The vegetation and insects are very similar, so I am going to treat this as a single area, even if their locations are &lt;span title=&quot;12.4 miles&quot;&gt;20 KMs&lt;/span&gt; apart:&lt;ul&gt;&lt;li&gt;Cheile Bistritei: from 45.189828, 24.039859 to 45.197871, 24.030284&lt;br /&gt;&lt;iframe src=&quot;https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d4938.018227336749!2d24.034541424700258!3d45.19358334219042!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x474d0d5a09626b75%3A0x9e3de10dd31a61bd!2sCheile+Bistritei+Valcene!5e0!3m2!1sen!2sro!4v1564327470081!5m2!1sen!2sro&quot; width=&quot;600&quot; height=&quot;450&quot; frameborder=&quot;0&quot; style=&quot;border:0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/li&gt;&lt;li&gt;Raul Luncavat: from 45.186682, 23.917856 to 45.190084, 23.914488&lt;br /&gt;&lt;iframe src=&quot;https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2811.9489435830524!2d23.913621315400274!3d45.188129759843086!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x0%3A0x0!2zNDXCsDExJzE3LjMiTiAyM8KwNTQnNTYuOSJF!5e0!3m2!1sen!2sro!4v1564327795122!5m2!1sen!2sro&quot; width=&quot;600&quot; height=&quot;450&quot; frameborder=&quot;0&quot; style=&quot;border:0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The area is very nice, easy to get to by car, but not very touristic yet, so not a lot of people having picnics and listening loudly to music. Leave your car and walk on the sides of the river(s) and the scenery is verdant and quiet. I have to warn you that even if in Romanian they are called rivers, they are more like creeks, especially at this time of the year. You can even find some caves in the area and if you are the long walk type of person, some 4-5 hour hike routes to more remote areas. Some flowers are white, but the vast majority of them are either yellow-orange or violet in color and probably are much more interesting in ultraviolet than human vision.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Animal life&lt;/h1&gt;&lt;br /&gt;I haven&#39;t seen any animals other than birds, a running lizard and a lot of insects.&lt;br /&gt;&lt;br /&gt;I saw several species of butterflies, the most common by far being a medium sized orange with black spots, a fritillary, probably the Silver-washed fritillary (Argynnis Paphia) or mantia imparatului in Romanian. They were frolicking on these tall yellow flowers with large leaves: the yellow oxeye (Telekia speciosa) or brusture and ochiul-boului in Romanian. The next most common was a shy dark butterfly with a crimson edge on its wings. Probably the Woodland ringlet (Erebia Medusa), I have no idea what the Romanian popular name for it is.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-3aV0LgSOuvE/XT3wF7Lx4JI/AAAAAAAAD-8/CbOqAqWkKjQFQ_f8IpjvAnMXDjffkG35gCLcBGAs/s1600/ArgynnisPaphia.jpg&quot; data-original-width=&quot;301&quot; data-original-height=&quot;301&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Argynnis Paphia on a Telekia speciosa&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-UKspIRsfDCU/XT3xFkLI8RI/AAAAAAAAD_I/_xggP4ampykZ7hmTxtv4jU5jt61cF6K3QCLcBGAs/s1600/ErebiaMedusa.jpg&quot; data-original-width=&quot;301&quot; data-original-height=&quot;301&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Erebia Medusa&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;Some other butterflies: the cabbage white (Pieris rapae) or fluturele de varza in Romania, the peacock (Aglais io) or ochi de paun de zi in Romanian, the swallowtail (Papilio machaon) or coada de rindunica in Romanian and even one glimpse of what I think was a marbled white (Melanargia galathea) or tabla de sah in Romanian.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-YNxmmEPdS-E/XT3x54CuOgI/AAAAAAAAD_U/-yLBLHu0fMEcA8Ru2LaLK4UL0BAQ4oobQCLcBGAs/s1600/PierisRapae.jpg&quot; data-original-width=&quot;483&quot; data-original-height=&quot;289&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Pieris Rapae&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-PtpTkzv-_TI/XT3y6XsJtfI/AAAAAAAAD_g/Rs-GeD7i484QaBBwcVOSDRj4PWB22YIvACLcBGAs/s1600/AglaisIo.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;225&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Aglais Io (during my youth Innachis Io)&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-DHt1Mr2P_Zk/XT3zXfg0ggI/AAAAAAAAD_o/tw6UqIJMMwcqC-3-qLqzBcuyxMX2HLPYQCLcBGAs/s1600/PapilioMachaon.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;201&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Papilio Machaon&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-Esrr1Ak7BCU/XT30xU1Bf3I/AAAAAAAAD_8/C_AcQ1jMxVcxoAqXwYD6g75d0t_cw4BSgCLcBGAs/s1600/MelanargiaGalathea.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;200&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Melanargia Galathea&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;One fascinating specimen looked similar to a peacock butterfly from afar only for it to settle in a triangular black and white shape when it stopped. It must have been a moth! I&#39;ve identified it as a Jersey tiger moth (Euplagia quadripunctaria) or fluturele urs dungat in Romanian.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-wtCVc7EbkU4/XT30di4PHhI/AAAAAAAAD_0/A5Kq5wHnNoA7SiuziuIAt4LuS0tvrl3TgCLcBGAs/s1600/EuplagiaQuadripunctaria.jpg&quot; data-original-width=&quot;464&quot; data-original-height=&quot;200&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Euplagia Quadripunctaria&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;What I also found fascinating is a tree that had apparently been colonized by ants. A lot of wood dust was on the ground and a lot of activity was inside the trunk. Still, there was another hole in the trunk that was filled with wood dust, but no ant activity. Could it have been some sort of other factor, termites or perhaps a disease, that destroyed the tree trunk&#39;s interior and the ants were just opportunists?&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/5ewcsMPzSm4&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;figcaption&gt;Ants or termites? New behavior or opportunism?&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Plants&lt;/h1&gt;&lt;br /&gt;Now, plants are easier to photograph, but harder to identify. I&#39;ve mentioned the oxeye. Then there was the touch-me-not (Impatiens noli-tangere) or slabanog and bradulet in Romanian, which appears to have been used traditionally for its medicinal properties, mostly related to kidney or gynecological issues. The Spreading bellflower (Campanula patula) was there, together with its close relative, the Creeping bellflower (Campanula rapunculoides) - both are called clopotei in Romanian. There was the mountain geranium (Geranium robertianum) or napraznic and priboi and iarba sfintului Robert in Romanian, which appears to have anti-stress, anti-cancer and fertility related purposed in traditional medicine. &lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-i5rq6EyT6cw/XT31dbe-hCI/AAAAAAAAEAI/OZiSmtLSJOUJ-OfJQcfoSR63Z59UKfQ2ACLcBGAs/s1600/ImpatiensNoliTangere.jpg&quot; data-original-width=&quot;210&quot; data-original-height=&quot;300&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Impatiens Noli-tangere&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-74tAsxkAYBc/XT32EjtNULI/AAAAAAAAEAQ/NUe91uEtf30gW55M0BNsiITPGmDzjdmKwCLcBGAs/s1600/CampanulaPatula.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;290&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Campanula Patula&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-K2HYri75x5M/XT32veVvCgI/AAAAAAAAEAY/wr6HOJK8cxIQtQQLfvHZo5WGMiJh7MF9gCLcBGAs/s1600/CampanulaRapunculoides.jpg&quot; data-original-width=&quot;400&quot; data-original-height=&quot;159&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Campanula Rapunculoides&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-S7nbs4iQegM/XT33JNa67iI/AAAAAAAAEAg/uCz3XhiytoIiexLV30SPV4NEXpTyeBwVwCLcBGAs/s1600/GeraniumRobertianum.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;248&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Geranium Robertianum&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;Field mustard was present as well (Brassica rapa). This plant was and is used for a variety of reasons in many cultures. The leaves and roots are rich in oil. In Puglia they use the buds as cimedirape in the making of orecchiette pasta. It is a plant from the cabbage family of plants, probably explaining the presence of the cabbage butterflies.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-Yi3SsD3itOA/XT33kaykwXI/AAAAAAAAEAs/xOLz9qKUdSgpMF9pQCReTiuxX8j4LiFmgCLcBGAs/s1600/BrassicaRapa.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;305&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Brassica Rapa&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;A very interesting flower has a very weird name: the Viper&#39;s bugloss (Echium vulgare) or iarba sarpelui in Romanian. It has blue flowers but the filaments of the stamens are red, contrasting with the petals and giving it a violet color per whole. It has medicinal uses as well, as an antidote for snake bites and for its antibiotic and astringent properties.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-XCP8AOk9mm0/XT34ECQVdrI/AAAAAAAAEA0/PY_UO3RzXFc9rn0fncsV4NH7YVQSDr7pwCLcBGAs/s1600/EchiumVulgare.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;364&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Echium Vulgare&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;Another violet flower, with uses in homeopathic medicine but also in poisonings, is aconite or wolfsbane (Aconitum napellus) or omag in Romanian. It contains powerful alkaloids and at one time it was forbidden to grow this plant anywhere in the Roman Empire on penalty of death. Death from intoxication with the plant can occur in as little as half an hour!&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-Ttt9k5KJgFk/XT34iRej_KI/AAAAAAAAEBA/sWNX1mpeAXgtZYTA_YlsYpf6J_rs2lecgCLcBGAs/s1600/AconitumNapellus.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;400&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Aconitum Napellus&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;And since we are talking about a violet flower with medicinal properties, how can we ignore the heal-all (Prunella vulgaris) or busuioc salbatic in Romania. The young leaves and stems can be eaten raw in salads; the plant in whole can be boiled and eaten as a potherb; and the aerial parts of the plant can be powdered and brewed in a cold infusion to make a beverage and it is used as an astringent in folk medicine.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-qYgUrbiRpgU/XT3472owUDI/AAAAAAAAEBI/jOYK1ouAbBwLlsb2-iA7bQ1B6YHPnYKcgCLcBGAs/s1600/PrunellaVulgaris.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;289&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Prunella Vulgaris&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;Not often, but when it happened it was a whole field of them, I found the Orange mullein (Verbascum phlomoides) or luminarica in Romanian. It is also a medicinal plant, used for the calming, sweat inducing and expectorant effects.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-ORy3C498So4/XT35Uyz8S8I/AAAAAAAAEBU/S5r57qNkXWos2OsxaJyODqRslPj7CPwngCLcBGAs/s1600/VerbascumPhlomoides.jpg&quot; data-original-width=&quot;250&quot; data-original-height=&quot;392&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Verbascum Phlomoides&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;I&#39;ve seen some daisies in the area and also another flower from the same family: the fleabane (Erigeron annuus) or bunghisor in Romanian. Used in salads as well as against the common cold or stomach aches in folk medicine.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-h76v0VTAMok/XT35sBebF4I/AAAAAAAAEBc/dTk48jYmgigEI-uULeurxw2Tr_UH2zYqgCLcBGAs/s1600/ErigeronAnnuus.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;341&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Erigeron Annuus&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;Last, but not least, the evening-primrose or sundrop (Oenothera biennis) or luminita noptii in Romanian. It started as an American plant, much like the fleabane, but it was brought and naturalized in Europe. It has been used medicinally by the native Americans for all kinds of ailments, as it is an edible plant containing an oil with anti inflammatory properties.&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-CbKIgLc_sc0/XT36BWKDEuI/AAAAAAAAEBk/mqwSBpNBNh8otkJnXNKziOu7AHvPu98twCLcBGAs/s1600/OenotheraBiennis.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;300&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Oenothera Biennis&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;There were a lot of plants without flowers, but I haven&#39;t had the time or patience for them. There was one with huge leaves and I photographed it for identification purposes. It turns out it was either the butterbur (Petasites hybridus) or the burdock (Arctium lappa) both called brusture in Romanian, but different species altogether. It&#39;s probably the Arctium, but I can&#39;t be sure!&lt;br /&gt;&lt;figure&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-VQzwMV11ZVQ/XT36w-VS_sI/AAAAAAAAEBs/q3aa0RkdaC0rj-7BVjheCC2sgZcmIsA2wCLcBGAs/s1600/Brusture.jpg&quot; data-original-width=&quot;300&quot; data-original-height=&quot;292&quot; /&gt;&lt;br /&gt;&lt;figcaption&gt;Petasites hybridus or Arctium lappa? A lot of stuff called brusture in Romanian!&lt;/figcaption&gt;&lt;br /&gt;&lt;/figure&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Resources&lt;/h1&gt;&lt;br /&gt;It would have been a lot more difficult for me to write this post if it weren&#39;t for sites like:&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://identify.plantnet.org&quot; target=&quot;_blank&quot; title=&quot;Identify, explore and share your observations of wild plants&quot;&gt;Pl@ntNet&lt;/a&gt; - upload photos of plants and get an instant AI driven identification&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://butterfly-conservation.org/butterflies/identify-a-butterfly&quot; target=&quot;_blank&quot; title=&quot;Identify a butterfly&quot;&gt;Butterfly Conservation&lt;/a&gt; - a comprehensive list of common butterflies&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://butterfliesfromromania.blogspot.com/&quot; target=&quot;_blank&quot; title=&quot;Butterflies from Romania&quot;&gt;Butterflies from Romania&lt;/a&gt; - from a blogger brother (Cătălin Murgocea)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.guerrillaradio.ro/categorii-articole/casca-de-cultura/insectar/&quot; target=&quot;_blank&quot; title=&quot;Strangely enough...&quot;&gt;Revista Radio Guerrilla &amp;rarr; Casca de cultură &amp;rarr; Insectar&lt;/a&gt; - not expecting that there, but high quality stuff and a lot of passion&lt;/li&gt;&lt;li&gt;... and of course Wikipedia and Google, which will let me find the correct association between a Latin name and the regional names&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Even with these great resources, it was obvious that not many people will publish nature related posts in any systematic manner. Even this post, three hours in the making, is a random mess of blurry pictures and random observations.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/971904200457914047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=971904200457914047' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/971904200457914047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/971904200457914047'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/nature-in-valcea.html' title='Nature in Valcea'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-3aV0LgSOuvE/XT3wF7Lx4JI/AAAAAAAAD-8/CbOqAqWkKjQFQ_f8IpjvAnMXDjffkG35gCLcBGAs/s72-c/ArgynnisPaphia.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-2304609716916764899</id><published>2019-07-25T23:06:00.003+03:00</published><updated>2019-08-21T13:06:59.412+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Dark Matter, by Blake Crouch</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-hXegaKk54Kg/XToI6ntrMMI/AAAAAAAAD-k/zwrrjstv-x0w6how3aQE2tNgHfOtL6yrACLcBGAs/s320/DarkMatter.jpg&quot; width=&quot;211&quot; height=&quot;320&quot; data-original-width=&quot;313&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left;&quot; /&gt; It wasn&#39;t the writing, it is competent, without having any other redeeming quality. It wasn&#39;t the story, which is as banal as the book cover and the title, but bearable. It was the main character, a person so ordinary that he freezes whenever he is in danger, loses everything he loves several times from people who threaten him with violence and who for seven chapters, under the guise of thinking like a scientist, attempted in vain to realize what was obvious to the reader from the start. Yeah, OK, how dare he not be a superhero with indomitable courage and magical powers! I accept my part of the responsibility, however I could not for the life of me continue to read &lt;a href=&quot;https://www.goodreads.com/book/show/27833670-dark-matter&quot; target=&quot;_blank&quot; title=&quot;Jason soon learns that in this world he’s woken up to, his house is not his house. His wife is not his wife. His son was never born. And someone is hunting him.&quot;&gt;Dark Matter&lt;/a&gt; past chapter 7.&lt;br /&gt;&lt;br /&gt;I am going to go on a limb here, though, and guess that the rest of the book will be just the same: a perfectly ordinary man, thrown into another world, whining about everything and not understanding anything because he clings to his idea of normalcy and refuses to adapt, only to somehow find some strength in the end and reach a partially satisfying ending. It&#39;s not really science fiction, it&#39;s just one of those &quot;what if you would have made other choices in life&quot; things masquerading as science fiction. I have other things to do that read about the emotional torture of a guy who is just too easily tortured. It&#39;s like stealing candy from children. I know the hero&#39;s journey starts from a state of pleasant equilibrium then something happens to upend that and the hero must fight to reach another state of equilibrium, but the initial state for this book is a boring guy living with his family and incapable of the basest reasoning skills.&lt;br /&gt;&lt;br /&gt;So, yeah, I stopped reading it midway. Sorry, &lt;a href=&quot;http://blakecrouch.com/&quot; target=&quot;_blank&quot; title=&quot; an American author, best known for his Wayward Pines Trilogy, which was adapted into the 2015 television series Wayward Pines.&quot;&gt;Blake Crouch&lt;/a&gt;!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/2304609716916764899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=2304609716916764899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/2304609716916764899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/2304609716916764899'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/dark-matter-by-blake-crouch.html' title='Dark Matter, by Blake Crouch'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-hXegaKk54Kg/XToI6ntrMMI/AAAAAAAAD-k/zwrrjstv-x0w6how3aQE2tNgHfOtL6yrACLcBGAs/s72-c/DarkMatter.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-5715141034302328688</id><published>2019-07-23T21:47:00.001+03:00</published><updated>2019-07-23T21:48:50.470+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Invention of Nature: Alexander von Humboldt&#39;s New World, by Andrea Wulf</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-h6YntzVSyXM/XTdOeO38VwI/AAAAAAAAD-U/Ll66-OOPHSUlG-EwFlRUlqPIlGNNrbR0QCLcBGAs/s320/TheInventionOfNature.jpg&quot; width=&quot;215&quot; height=&quot;320&quot; data-original-width=&quot;318&quot; data-original-height=&quot;473&quot; alt=&quot;Book cover&quot; style=&quot;float:left&quot; /&gt;  &lt;a href=&quot;https://www.goodreads.com/book/show/23995249-the-invention-of-nature&quot; target=&quot;_blank&quot; title=&quot;The acclaimed author of Founding Gardeners reveals the forgotten life of Alexander von Humboldt, the visionary German naturalist whose ideas changed the way we see the natural world—and in the process created modern environmentalism. &quot;&gt;The Invention of Nature&lt;/a&gt; is an ode to &lt;a href=&quot;https://en.wikipedia.org/wiki/Alexander_von_Humboldt&quot; target=&quot;_blank&quot; title=&quot; a Prussian polymath, geographer, naturalist, explorer, and influential proponent of Romantic philosophy and science. Humboldt&#39;s quantitative work on botanical geography laid the foundation for the field of biogeography. Humboldt&#39;s advocacy of long-term systematic geophysical measurement laid the foundation for modern geomagnetic and meteorological monitoring&quot;&gt;Alexander von Humboldt&lt;/a&gt;, the man who has practically invented our concept of nature, inspired Darwin and Goethe and Bolivar and Jefferson and so many others, created the ideas of ecology, Gaia (although it wouldn&#39;t be called that for some time), global connection between volcanic activity. He was among the first to popularize the idea that man&#39;s mindless exploitation of nature cannot last and will have dire consequences. The last true polymath, &lt;a href=&quot;https://www.andreawulf.com/&quot; target=&quot;_blank&quot; title=&quot;a historian and writer, lives in Britain, and has written books, newspaper articles and book reviews. Wulf studied design history at The Royal College of Art, London and is a public speaker, delivering lectures in the UK and USA. Her book The Brother Gardeners, published in April 2008, was long-listed for the Samuel Johnson Prize and received a CBHL Annual Literature Award in 2010. In 2016, Wulf won the Royal Society Insight Investment Science Book Prize and the Royal Geographical Society&#39;s Ness Award for her book The Invention of Nature.&quot;&gt;Andrea Wulf&lt;/a&gt; calls him, and on paper he seems a god: an avid reader, a great thinker, fluent in many languages, exploring on foot tirelessly until in his seventies, dabbling not only in natural sciences, but also politics, social revolution, physics, drawing, prose and poetry. He had been actively writing and corresponding until well in his eighties. The quintessential 19th century romantic scientist, he was interested in everything and anyone and wrote incessantly. At one time he remained out of money because he was paying for the publication of all his books, being interested in spreading the knowledge, not profit. He was collecting rocks, insects, plants, soil samples, etc. then he would send them to other scientists who were interested, for nothing in return.&lt;br /&gt;&lt;br /&gt;His view of nature and the cosmos (term that he coined) permeates the vision of our society even now. So how come so few people know about him? To my shame, that includes me. I vaguely knew the name, but had no idea how grand his influence is. Wulf&#39;s explanation is that after the first world war (and I guess the second didn&#39;t help, either) an anti-German sentiment spread in Europe and America, leading to burning of books, lynching of German people and an overall erasure of anything Germanic from culture. &lt;br /&gt;&lt;br /&gt;Now, half of the book is almost exclusively a Humboldt biography and it is awesome! I was imagining how great it would be if someone were to make a TV series about it (Netflix and National Geographic, I am looking at you!): so many details, so many adventures, so many important people of the age. I think the book would have been more accessible if it would been just that. But then the author also described some other people who were influenced by Humboldt, and while knowing that Darwin venerated the man and did everything he did from the moment he read one of the man&#39;s books, the others were less interesting or important.&lt;br /&gt;&lt;br /&gt;Even so, the other people cover less than a quarter of the book... the rest is acknowledgements, bibliography, references, etc. Andrea Wulf did a wonderful job researching this and bringing Humboldt to life for me. Even if the ending of the book was not as satisfying as the beginning, it&#39;s hard for me to rate this any less than excellent. You need to read this!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/5715141034302328688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=5715141034302328688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5715141034302328688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5715141034302328688'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/the-invention-of-nature-alexander-von.html' title='The Invention of Nature: Alexander von Humboldt&#39;s New World, by Andrea Wulf'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-h6YntzVSyXM/XTdOeO38VwI/AAAAAAAAD-U/Ll66-OOPHSUlG-EwFlRUlqPIlGNNrbR0QCLcBGAs/s72-c/TheInventionOfNature.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-3760528385233215851</id><published>2019-07-17T08:11:00.001+03:00</published><updated>2019-07-17T08:11:02.674+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Velocity Weapon (The Protectorate #1), by Megan E. O&#39;Keefe</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-7m6VlZ8WaKA/XS6ogpba2mI/AAAAAAAAD98/JTsKIsfdzv4YCSqBf133Dks_kjHC7r6uwCLcBGAs/s320/VelocityWeapon.jpg&quot; width=&quot;214&quot; height=&quot;320&quot; data-original-width=&quot;317&quot; data-original-height=&quot;475&quot; style=&quot;float:left&quot; alt=&quot;book cover&quot; /&gt; I can&#39;t decide if &lt;a href=&quot;https://www.goodreads.com/book/show/41085049-velocity-weapon&quot; target=&quot;_blank&quot; title=&quot;Sanda and Biran Greeve were siblings destined for greatness. A high-flying sergeant, Sanda has the skills to take down any enemy combatant. Biran is a savvy politician who aims to use his new political position to prevent conflict from escalating to total destruction.&quot;&gt;Velocity Weapon&lt;/a&gt; is brilliant or stupid. What I can say is that I didn&#39;t like it. &lt;a href=&quot;http://meganokeefe.com/&quot; target=&quot;_blank&quot; title=&quot;her website&quot;&gt;Megan O&#39;Keefe&lt;/a&gt; tells a story of three characters: a gunnery sergeant who ejects her pod during a space battle and is picked up by an intelligent spaceship, her brother who is a member of the Prime Protectorate and does everything to find her and a thief on some other planet who stumbles upon a strange lab that changes her entire life.&lt;br /&gt;&lt;br /&gt;  The writing is competent, nothing inspiring, though, and probably that is why I had difficulty finishing the book. But there are also some features of the story that I didn&#39;t like. For example of the three main characters who start the book on equal ground, the thief gets less and less space and, worse, her story never connects to the others. It&#39;s like O&#39;Keefe wrote a book and a novella and then merged them into a larger book, even if their only commonality is the same universe. Then there is a part of the story that I got invested in, only to be aborted midway; I can&#39;t say more without spoiling the story, but I didn&#39;t like that.&lt;br /&gt;&lt;br /&gt;  The thing that bothered me most, though, is how the plot meanders instead of getting to the point. I used to think that a good story would be less straightforward, but now that I read one that just comes and goes, gives you glimpses of the world, then does nothing with them... it just felt like wasted time. Don&#39;t get me wrong, the author builds a world with vast opportunities, a universe of multiple colonized worlds connected by star gates which are controlled by the Primes and their technology originated from an alien artifact. She is just beginning the story. The characters might yet come together, the villains might become clearer, the whole thing felt potentially epic, only one would probably have to read all of the books to understand where O&#39;Keefe is planning to go.&lt;br /&gt;&lt;br /&gt;  Basically the book is a string of almost random events, driven by forces that are never made clear, then somehow brought together by incredible coincidence, while the characters are barely sketched and hard to relate to, especially the male ones. The world has a lot of potential, but little is built on it so far. It feels like Star Wars, a little: a galaxy far far away where everybody is related or knows each other and everything in a chapter happens on one planet only. And it felt dated, as well.&lt;br /&gt;&lt;br /&gt;  So I can&#39;t decide: is this the start of a wonderful epic universe with immense potential or is it just a stupid space opera book that is not very good? I just didn&#39;t like it.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/3760528385233215851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=3760528385233215851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3760528385233215851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3760528385233215851'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/velocity-weapon-protectorate-1-by-megan.html' title='Velocity Weapon (The Protectorate #1), by Megan E. O&#39;Keefe'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-7m6VlZ8WaKA/XS6ogpba2mI/AAAAAAAAD98/JTsKIsfdzv4YCSqBf133Dks_kjHC7r6uwCLcBGAs/s72-c/VelocityWeapon.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-286208263401932989</id><published>2019-07-16T17:31:00.000+03:00</published><updated>2019-08-08T13:52:33.606+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Core"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>A .NET Core ServiceProvider that allows adding of services after it was created</title><content type='html'>  .NET Core comes with its own dependency injection engine, separated in the Microsoft.Extensions.DependencyInjection package, and ASP.Net Core uses it by default. In a very simplistic description, it uses an IServiceCollection to add services to, then it builds an IServiceProvider from that list, an interface which returns an implementation based on a type or null if finding none. Any change in the list of services is not supported. There are situations, though, where you want to add new services. One of them being dynamically resolving new types.&lt;br /&gt;&lt;br /&gt;Therefore I set up to create a custom implementation of IServiceProvider that fixes that, using the mechanisms already existing in .NET Core. &lt;span class=&quot;important&quot;&gt;Note that this is just something I did from frustration, &quot;because I could&quot;. Most people choose to replace the entire IServiceProvider with an implementation that uses some other DI container, like StructureMap.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First attempt was proxying a normal ServiceProvider and keeping a reference to the collection. Then I would just change the collection and recreate the service provider. That has two major problems. One is that the previous serviceProvider is not disposed. If you try, you automatically dispose all services already resolved and if you do not, you remain with references to the created services. The second, and more dire, is that recreating the service provider will generate new instances for services, even if registered as singletons. That is not good.&lt;br /&gt;&lt;br /&gt;I thought of a solution:&lt;ol&gt;&lt;li&gt;keep a list of service providers, instead of just one&lt;/li&gt;&lt;li&gt;use a custom service collection which will let us know when changes occurred&lt;/li&gt;&lt;li&gt;whenever new services are added, add them to a list of new services&lt;/li&gt;&lt;li&gt;whenever a service is resolved, go through the list of providers&lt;/li&gt;&lt;li&gt;if any provider returns a value, provide it&lt;/li&gt;&lt;li&gt;else if any new service create a new provider from the new services and add it to the list&lt;/li&gt;&lt;li&gt;else return null&lt;/li&gt;&lt;li&gt;when disposing, dispose all providers in the list&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;This works great except the newly added providers are separate from the existing providers so when you try to resolve a type with a second provider and that type has in its constructor a type that was registered in the first provider, you get nothing.&lt;br /&gt;&lt;br /&gt;One solution would be to add all services to the second provider, not only the new ones, but then we get back to the original issue of the singletons, only a bit more subtle:&lt;ol&gt;&lt;li&gt;register type1 as a singleton&lt;/li&gt;&lt;li&gt;get an instance of type1 (1)&lt;/li&gt;&lt;li&gt;build the provider&lt;/li&gt;&lt;li&gt;get an instance of type1 (2)&lt;/li&gt;&lt;li&gt;register type2 which receives a type1 in its constructor&lt;/li&gt;&lt;li&gt;get an instance of type2&lt;/li&gt;&lt;li&gt;now, type1 (1) is the same as type1 (2), because it was resolved by the same provider&lt;/li&gt;&lt;li&gt;type1 is different from type2.type1, though, because that was resolved as a different singleton by the second provider in the list&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;One solution would be to add all previous services as factories, then. For Itype1, instead of returning typeof(type1), return a factory method that resolves the value with our system. And it works... until it reaches a definition (like IOptions) that was registered as an open generic: &lt;i&gt;services.AddSingleton(typeof(IType3&amp;lt;&amp;gt;),typeof(Type3&amp;lt;&amp;gt;))&lt;/i&gt;. In case of open generics, you cannot use a descriptor with a factory, because it returns an object, regardless of the generic type argument used. It would not to do return a Type3&amp;lt;Banana&amp;gt; for a requested type of IType3&amp;lt;int&amp;gt;.&lt;br /&gt;&lt;br /&gt;So, final version is this:&lt;ol&gt;&lt;li&gt;keep a list of service providers, instead of just one&lt;/li&gt;&lt;li&gt;keep a dictionary of the last object resolved for a type&lt;/li&gt;&lt;li&gt;use a custom service collection which will let us know when changes occurred&lt;/li&gt;&lt;li&gt;whenever new services are added, add them to a list of new services&lt;/li&gt;&lt;li&gt;whenever a service is resolved, go through the list of providers&lt;/li&gt;&lt;li&gt;if any provider returns a value, return it&lt;/li&gt;&lt;li&gt;if no new services registered return null&lt;/li&gt;&lt;li&gt;create a new provider from all the services like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;if it&#39;s a new registration, use it as is&lt;/li&gt;&lt;li&gt;if it&#39;s an open generic definition type:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;if singleton, add first all the existing resolutions for types that are defined by it&lt;/li&gt;&lt;li&gt;use the original descriptor afterwards&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;use a registration that proxies to the advanced resolution mechanism we created&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;when disposing, dispose all providers in the list&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;This implementation also has a flaw&lt;/b&gt;: if a dependency parameter with a generic type definition descriptor was resolved as a singleton by an additional service provider, then is requested directly and can be resolved by a previous provider, it will return a different instance. Here is the scenario:&lt;ol&gt;&lt;li&gt;the initial provider knows to map I&amp;lt;&amp;gt; to M&amp;lt;&amp;gt;&lt;/li&gt;&lt;li&gt;you add a new singleton mapping from X to Y and Y gets a constructor parameter of type I&amp;lt;Z&amp;gt;&lt;/li&gt;&lt;li&gt;you request an instance of X&lt;/li&gt;&lt;li&gt;the first provider cannot resolve it&lt;/li&gt;&lt;li&gt;the second provider can resolve it, therefore it will also resolve a I&amp;lt;Z&amp;gt; as an M&amp;lt;Z&amp;gt; singleton instance&lt;/li&gt;&lt;li&gt;you request an instance of I&amp;lt;Z&amp;gt;&lt;/li&gt;&lt;li&gt;the first provider can resolve it, therefore it will return a NEW singleton instance of M&amp;lt;Z&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;This is an edge case that I don&#39;t have the time to solve. So, with the caveat above, here is the final version. &lt;br /&gt;Use it like this:&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;// IAdvancedServiceProvider either injected &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;// or resolved via serviceProvider.GetService&amp;lt;IAdvancedServiceProvider&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;// or even serviceProvider as IAdvancedServiceProvider&lt;/span&gt;&lt;br /&gt;advancedServiceProvider.ServiceCollection.AddSingleton...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And this is the source code: &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// Service provider that allows for dynamic adding of new services&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;interface&lt;/span&gt; IAdvancedServiceProvider : IServiceProvider&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// Add services to this collection&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    IServiceCollection ServiceCollection { get; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// Service provider that allows for dynamic adding of new services&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; AdvancedServiceProvider : IAdvancedServiceProvider, IDisposable&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; readonly List&amp;lt;ServiceProvider&amp;gt; _serviceProviders;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; readonly NotifyChangedServiceCollection _services;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; readonly object _servicesLock = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; object();&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; List&amp;lt;ServiceDescriptor&amp;gt; _newDescriptors;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; Dictionary&amp;lt;Type, object&amp;gt; _resolvedObjects;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// Initializes a new instance of the &amp;lt;see cref=&quot;AdvancedServiceProvider&quot;/&amp;gt; class.&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;services&quot;&amp;gt;The services.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; AdvancedServiceProvider(IServiceCollection services)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// registers itself in the list of services&lt;/span&gt;&lt;br /&gt;        services.AddSingleton&amp;lt;IAdvancedServiceProvider&amp;gt;(&lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        _serviceProviders = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; List&amp;lt;ServiceProvider&amp;gt;();&lt;br /&gt;        _newDescriptors = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; List&amp;lt;ServiceDescriptor&amp;gt;();&lt;br /&gt;        _resolvedObjects = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Dictionary&amp;lt;Type, object&amp;gt;();&lt;br /&gt;        _services = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NotifyChangedServiceCollection(services);&lt;br /&gt;        _services.ServiceAdded += ServiceAdded;&lt;br /&gt;        _serviceProviders.Add(services.BuildServiceProvider(&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;));&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; ServiceAdded(object sender, ServiceDescriptor item)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;lock&lt;/span&gt; (_servicesLock)&lt;br /&gt;        {&lt;br /&gt;            _newDescriptors.Add(item);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// Add services to this collection&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; IServiceCollection ServiceCollection { get =&amp;gt; _services; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// Gets the service object of the specified type.&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;serviceType&quot;&amp;gt;An object that specifies the type of service object to get.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;returns&amp;gt;A service object of type serviceType. -or- null if there is no service object of type serviceType.&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; object GetService(Type serviceType)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;lock&lt;/span&gt; (_servicesLock)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;rem&quot;&gt;// go through the service provider chain and resolve the service&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; service = GetServiceInternal(serviceType);&lt;br /&gt;            &lt;span class=&quot;rem&quot;&gt;// if service was not found and we have new registrations&lt;/span&gt;&lt;br /&gt;            if (service == null &amp;amp;&amp;amp; _newDescriptors.Count &amp;gt; 0)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class=&quot;rem&quot;&gt;// create a new service collection in order to build the next provider in the chain&lt;/span&gt;&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; newCollection = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ServiceCollection();&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; descriptor &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; _services)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; descriptorToAdd &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; GetDerivedServiceDescriptors(descriptor))&lt;br /&gt;                    {&lt;br /&gt;                        ((IList&amp;lt;ServiceDescriptor&amp;gt;)newCollection).Add(descriptorToAdd);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; newServiceProvider = newCollection.BuildServiceProvider(&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;                _serviceProviders.Add(newServiceProvider);&lt;br /&gt;                _newDescriptors = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; List&amp;lt;ServiceDescriptor&amp;gt;();&lt;br /&gt;                service = newServiceProvider.GetService(serviceType);&lt;br /&gt;            }&lt;br /&gt;            if (service != null)&lt;br /&gt;            {&lt;br /&gt;                _resolvedObjects[serviceType] = service;&lt;br /&gt;            }&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; service;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; IEnumerable&amp;lt;ServiceDescriptor&amp;gt; GetDerivedServiceDescriptors(ServiceDescriptor descriptor)&lt;br /&gt;    {&lt;br /&gt;        if (_newDescriptors.Contains(descriptor))&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;rem&quot;&gt;// if it&#39;s a new registration, just add it&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; descriptor;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        if (!descriptor.ServiceType.IsGenericTypeDefinition)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;rem&quot;&gt;// for a non open type generic singleton descriptor, register a factory that goes through the service provider&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; ServiceDescriptor.Describe(&lt;br /&gt;                                    descriptor.ServiceType,&lt;br /&gt;                                    _ =&amp;gt; GetServiceInternal(descriptor.ServiceType),&lt;br /&gt;                                    descriptor.Lifetime&lt;br /&gt;                                );&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// if the registered service type for a singleton is an open generic type&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// we register as factories all the already resolved specific types that fit this definition&lt;/span&gt;&lt;br /&gt;        if (descriptor.Lifetime == ServiceLifetime.Singleton)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; servType &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; _resolvedObjects.Keys.Where(t =&amp;gt; t.IsGenericType &amp;amp;&amp;amp; t.GetGenericTypeDefinition() == descriptor.ServiceType))&lt;br /&gt;            {&lt;br /&gt;&amp;nbsp;&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; ServiceDescriptor.Describe(&lt;br /&gt;                        servType,&lt;br /&gt;                        _ =&amp;gt; _resolvedObjects[servType],&lt;br /&gt;                        ServiceLifetime.Singleton&lt;br /&gt;                    );&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// then we add the open type registration for any new types&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; descriptor;&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; object GetServiceInternal(Type serviceType)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; serviceProvider &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; _serviceProviders)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; service = serviceProvider.GetService(serviceType);&lt;br /&gt;            if (service != null)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; service;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; null;&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// Dispose the provider and all resolved services&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;lock&lt;/span&gt; (_servicesLock)&lt;br /&gt;        {&lt;br /&gt;            _services.ServiceAdded -= ServiceAdded;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; serviceProvider &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; _serviceProviders)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;try&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    serviceProvider.Dispose();&lt;br /&gt;                }&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;catch&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class=&quot;rem&quot;&gt;// singleton classes might be disposed twice and throw some exception&lt;/span&gt;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            _newDescriptors.Clear();&lt;br /&gt;            _resolvedObjects.Clear();&lt;br /&gt;            _serviceProviders.Clear();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// An IServiceCollection implementation that exposes a ServiceAdded event for added service descriptors&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// The collection doesn&#39;t support removal or inserting of services&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; NotifyChangedServiceCollection : IServiceCollection&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; readonly IServiceCollection _services;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Fired when a descriptor is added to the collection&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;event&lt;/span&gt; EventHandler&amp;lt;ServiceDescriptor&amp;gt; ServiceAdded;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Initializes a new instance of the &amp;lt;see cref=&quot;NotifyChangedServiceCollection&quot;/&amp;gt; class.&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;services&quot;&amp;gt;The services.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; NotifyChangedServiceCollection(IServiceCollection services)&lt;br /&gt;        {&lt;br /&gt;            _services = services;&lt;br /&gt;        }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Get the value at index&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Setting is not supported&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; ServiceDescriptor &lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;[&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; index]&lt;br /&gt;        {&lt;br /&gt;            get =&amp;gt; _services[index];&lt;br /&gt;            set =&amp;gt; &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NotSupportedException(&lt;span class=&quot;str&quot;&gt;&quot;Inserting services in collection is not supported&quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Count of services in the collection&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; Count { get =&amp;gt; _services.Count; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Obviously not&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; IsReadOnly { get =&amp;gt; &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Adding a service descriptor will fire the ServiceAdded event&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;item&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Add(ServiceDescriptor item)&lt;br /&gt;        {&lt;br /&gt;            _services.Add(item);&lt;br /&gt;            ServiceAdded.Invoke(&lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;, item);&lt;br /&gt;        }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Clear the collection is not supported&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Clear() =&amp;gt; &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NotSupportedException(&lt;span class=&quot;str&quot;&gt;&quot;Removing services from collection is not supported&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// True is the item exists in the collection&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; Contains(ServiceDescriptor item) =&amp;gt; _services.Contains(item);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Copy items to array of service descriptors&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; CopyTo(ServiceDescriptor[] array, &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; arrayIndex) =&amp;gt; _services.CopyTo(array, arrayIndex);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Enumerator for service descriptors&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; IEnumerator&amp;lt;ServiceDescriptor&amp;gt; GetEnumerator() =&amp;gt; _services.GetEnumerator();&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Index of item in the list&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; IndexOf(ServiceDescriptor item) =&amp;gt; _services.IndexOf(item);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Inserting is not supported&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Insert(&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; index, ServiceDescriptor item) =&amp;gt; &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NotSupportedException(&lt;span class=&quot;str&quot;&gt;&quot;Inserting services in collection is not supported&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Removing items is not supported&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; Remove(ServiceDescriptor item) =&amp;gt; &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NotSupportedException(&lt;span class=&quot;str&quot;&gt;&quot;Removing services from collection is not supported&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Removing items is not supported&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; RemoveAt(&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; index) =&amp;gt; &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NotSupportedException(&lt;span class=&quot;str&quot;&gt;&quot;Removing services from collection is not supported&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// Enumerator for objects&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        IEnumerator IEnumerable.GetEnumerator() =&amp;gt; ((IEnumerable)_services).GetEnumerator();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/286208263401932989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=286208263401932989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/286208263401932989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/286208263401932989'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/a-net-core-serviceprovider-that-allows.html' title='A .NET Core ServiceProvider that allows adding of services after it was created'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-7232329974475368058</id><published>2019-07-11T11:57:00.002+03:00</published><updated>2019-07-13T00:40:39.497+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Stranger than we can Imagine: Making Sense of the Twentieth Century, by John Higgs</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-pgznH40Kr2k/XSbtq7TrM7I/AAAAAAAAD9k/YZkDRsQPIX0Sr0GV5w1i2LZxS8VZvfn2ACLcBGAs/s320/StrangerThanWeCanImagine.jpg&quot; width=&quot;213&quot; height=&quot;320&quot; data-original-width=&quot;316&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; &lt;a href=&quot;https://www.goodreads.com/book/show/24886729-stranger-than-we-can-imagine&quot; target=&quot;_blank&quot; title=&quot;John Higgs argues that before 1900, history seemed to make sense. We can understand innovations like electricity, agriculture and democracy. The twentieth century, in contrast, gave us relativity, cubism, quantum mechanics, the id, existentialism, Stalin, psychedelics, chaos mathematics, climate change and postmodernism.&quot;&gt;Stranger than we can Imagine&lt;/a&gt; feels like a companion book to the 2002 documentary &lt;a href=&quot;https://www.youtube.com/watch?v=eJ3RzGoQC4s&quot; target=&quot;_blank&quot; title=&quot;a 2002 British television documentary series by filmmaker Adam Curtis. It focuses on the work of psychoanalysts Sigmund Freud and Anna Freud, and PR consultant Edward Bernays. In episode one, Curtis says, &#39;This series is about how those in power have used Freud&#39;s theories to try and control the dangerous crowd in an age of mass democracy.&#39;&quot;&gt;The Century of the Self&lt;/a&gt;. Both are really well done and discuss the brusque changes that define the 20th century and they complement each other in content. I recommend them highly to just about everyone except maybe little children.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://johnhiggs.com&quot; target=&quot;_blank&quot; title=&quot;an English writer, novelist, journalist and cultural historian. In particular, Higgs has written about the so-called counterculture, exemplified by writers, artists and activists such as Timothy Leary, Robert Anton Wilson, Alan Moore and the British group The KLF&quot;&gt;John Higgs&lt;/a&gt; starts the book comparing history to a landscape and the works describing it as maybe roads. There are well trodden paths on this landscape, but also deep forests where few dare enter. He then promises that his book will try to describe the twentieth century by exploring these dark places, avoided by others. I didn&#39;t feel that was completely the case, but certainly it was a novel path to take to explain history: &lt;a href=&quot;https://en.wikipedia.org/wiki/Albert_Einstein&quot; target=&quot;_blank&quot;&gt;Einstein&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Werner_Heisenberg&quot; target=&quot;_blank&quot;&gt;Heisenberg&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Kurt_G%C3%B6del&quot; target=&quot;_blank&quot;&gt;Gödel&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Konrad_Lorenz&quot; target=&quot;_blank&quot;&gt;Lorenz&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Benoit_Mandelbrot&quot; target=&quot;_blank&quot;&gt;Mandelbrot&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Sigmund_Freud&quot; target=&quot;_blank&quot;&gt;Freud&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Pablo_Picasso&quot; target=&quot;_blank&quot;&gt;Picasso&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Salvador_Dal%C3%AD&quot; target=&quot;_blank&quot;&gt;Dalí&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/James_Joyce&quot; target=&quot;_blank&quot;&gt;Joyce&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Timothy_Leary&quot; target=&quot;_blank&quot;&gt;Leary&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Igor_Stravinsky&quot; target=&quot;_blank&quot;&gt;Stravinsky&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Aleister_Crowley&quot; target=&quot;_blank&quot;&gt;Crowley&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Margaret_Thatcher&quot; target=&quot;_blank&quot;&gt;Thatcher&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Rolling_Stones&quot; target=&quot;_blank&quot;&gt;The Rolling Stones&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Shigeru_Miyamoto&quot; target=&quot;_blank&quot;&gt;Miyamoto&lt;/a&gt; and so on. Its basic premise is that an abrupt change occurred at the beginning of the 20th century, when the general belief in absolutes (which he generically calls &lt;a href=&quot;https://en.wikipedia.org/wiki/Omphalos&quot; target=&quot;_blank&quot;&gt;omphaloi&lt;/a&gt;) was replaced with relativism and individuality.&lt;br /&gt;&lt;br /&gt;How would classical empires survive these changes when at their core stands the belief in a supreme leader, representing and supported by a supreme god, who protects and enforces rules that are culturally accepted by everyone? They would not, therefore the world wars that ended them. What absolute pillar of belief would survive &lt;a href=&quot;https://en.wikipedia.org/wiki/General_relativity&quot; target=&quot;_blank&quot;&gt;general relativity&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Uncertainty_principle&quot; target=&quot;_blank&quot;&gt;the uncertainty principle&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Quantum_mechanics&quot; target=&quot;_blank&quot;&gt;quantum mechanics&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/G%C3%B6del%27s_incompleteness_theorems&quot; target=&quot;_blank&quot;&gt;the incompleteness theorems&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Id,_ego_and_super-ego&quot; target=&quot;_blank&quot;&gt;the id&lt;/a&gt; and individualism, impressionism, cubism, modernism, postmodernism and finally, the corporation? None of them. Religion not so much dies as it breaks apart in small fragments that then fade away. Morality shakes under the reign of individual desires and psychopathic legal entities. Social norms, economical behavior, even the foundation of money are wiped out and replaced with the new. Art fractures as well, constantly redefining and contradicting itself and everything else. It is the century where value exists only when seen from certain perspectives and nothing has any intrinsic value.&lt;br /&gt;&lt;br /&gt;The book ends with a chapter that heralds the coming of a new age, the 21st century: the Internet and the erosion of the last remaining omphalos: truth. If truth also depends on the observer, if there is no one truth, if science if just a belief like any others, what awaits us in the &lt;a href=&quot;https://en.wikipedia.org/wiki/Post-truth&quot; target=&quot;_blank&quot;&gt;post-truth&lt;/a&gt; era?&lt;br /&gt;&lt;br /&gt;Overall it is a very interesting and informative book. More than simply stating facts, it is the unexpected connections between things that bring value to the reader, rather fitting considering the subject. Maybe not going into the depths of dark forests, but certainly exploring their edges and the strange beings that live there. Top marks!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/7232329974475368058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=7232329974475368058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/7232329974475368058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/7232329974475368058'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/stranger-than-we-can-imagine-making.html' title='Stranger than we can Imagine: Making Sense of the Twentieth Century, by John Higgs'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-pgznH40Kr2k/XSbtq7TrM7I/AAAAAAAAD9k/YZkDRsQPIX0Sr0GV5w1i2LZxS8VZvfn2ACLcBGAs/s72-c/StrangerThanWeCanImagine.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-8763948154226841618</id><published>2019-07-09T17:11:00.001+03:00</published><updated>2019-07-09T17:12:42.241+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Setting the NuGet package folder location for Visual Studio solutions</title><content type='html'>  Long story short, check out this answer to a StackOverflow question: &lt;a href=&quot;https://stackoverflow.com/a/53451805/4572240&quot; target=&quot;_blank&quot; title=&quot;The packages listed in the projects packages.config-Files are getting downloaded into the path specified in Nuget.config &amp;rarr; repositoryPath but the packages specified in the .net-core Project files (via PackageReference) are all downloaded into the global package directory in C:\Users\USERNAME\.nuget\packages.&quot;&gt;Package destination of restore of .net-core projects is always global package directory&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The scenario is this, you are used to .NET Framework projects for which Visual Studio restored NuGet packages in a packages folder in the solution folder and then you switch to .NET Core. No packages folder! You google it and you find that there is a global folder in your user&#39;s profile where NuGet will download all of these projects, that .NET Core uses it by default and also that you might change this behavior used on a property in nuget.config. So here are the issues you have take into account:&lt;ol&gt;&lt;li&gt;There are two ways of configuring NuGet packages for your projects: a packages.config file and PackageReference elements in your .csproj file&lt;/li&gt;&lt;li&gt;The name of the property you need to set is different based on the type of configuration: repositoryPath and globalPackagesFolder, respectively&lt;/li&gt;&lt;li&gt;There are two formats for configuring nuget properties: using the add element inside the config element and using the repositoryPath element inside the settings element&lt;/li&gt;&lt;li&gt;The format that worked for me in VS 2017 was the config element&lt;/li&gt;&lt;li&gt;There are two locations for the nuget.config file: in a .nuget folder inside your solution folder and directly in the solution folder (or any of its parent folders)&lt;/li&gt;&lt;li&gt;The location that is accepted by the latest versions of NuGet is directly in the solution folder&lt;/li&gt;&lt;li&gt;Sometimes you need to restart Visual Studio for the change in nuget.config files to considered&lt;/li&gt;&lt;li&gt;The path you specify is relative to the nuget.config file, no matter where it is&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;A bit of an overkill, but try this as the beginning of your nuget.config file that sits next to the .sln file in your solution:&lt;pre class=&quot;csharpcode&quot;&gt;&amp;lt;?xml version=&lt;span class=&quot;str&quot;&gt;&quot;1.0&quot;&lt;/span&gt; encoding=&lt;span class=&quot;str&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;config&amp;gt;&lt;br /&gt;    &amp;lt;add key=&lt;span class=&quot;str&quot;&gt;&quot;repositoryPath&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;str&quot;&gt;&quot;./packages&quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;add key=&lt;span class=&quot;str&quot;&gt;&quot;globalPackagesFolder&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;str&quot;&gt;&quot;./packages&quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;  &amp;lt;/config&amp;gt;&lt;br /&gt;  &amp;lt;settings&amp;gt;&lt;br /&gt;    &amp;lt;repositoryPath&amp;gt;./packages&amp;lt;/repositoryPath&amp;gt;&lt;br /&gt;  &amp;lt;/settings&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/8763948154226841618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=8763948154226841618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8763948154226841618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8763948154226841618'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/setting-nuget-package-folder-location.html' title='Setting the NuGet package folder location for Visual Studio solutions'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-756322478676029213</id><published>2019-07-08T19:29:00.001+03:00</published><updated>2019-07-08T19:29:44.282+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Deathcaster (Shattered Realms #4), by Cinda Williams Chima</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-3DKO0LqurJg/XSNrZImWltI/AAAAAAAAD9Y/cvA96POKgtkikbDkTF85hjXCOiI4Z3BfgCLcBGAs/s320/Deathcaster.jpg&quot; width=&quot;212&quot; height=&quot;320&quot; data-original-width=&quot;600&quot; data-original-height=&quot;906&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt;  &lt;a href=&quot;https://www.goodreads.com/book/show/39320115-deathcaster&quot; target=&quot;_blank&quot; title=&quot;Master storyteller Cinda Williams Chima ?!?!??! delivers spellbinding action, bittersweet reunions, and dazzling revelations in this indispensable conclusion to the Shattered Realms series. &quot;&gt;Deathcaster&lt;/a&gt; is the final book in the &lt;a href=&quot;https://www.goodreads.com/series/137107-shattered-realms&quot; target=&quot;_blank&quot; title=&quot;You should NOT read it&quot;&gt;Shattered Realms&lt;/a&gt; series, or at least it should be, since it kills off the villain and has everybody live happily ever after. It&#39;s one of the least satisfying endings I&#39;ve read in a long time.&lt;br /&gt;&lt;br /&gt;  &lt;a href=&quot;http://www.cindachima.com/&quot; target=&quot;_blank&quot; title=&quot;a New York Times bestselling author of young adult fantasy, best known for The Heir Chronicles, The Seven Realms and The Shattered Realm series.&quot;&gt;Cinda Williams Chima&lt;/a&gt; started slowly, by creating a complex world of realms, magic and a multitude of characters and factions. She spent two books on that. The third book, &lt;a href=&quot;https://siderite.blogspot.com/2018/05/stormcaster-shattered-realms-3-by-cinda.html&quot; target=&quot;_blank&quot; title=&quot;A big setup for nothing&quot;&gt;Stormcaster&lt;/a&gt;, was about introducing a powerful and mysterious villain and yet more characters, realms and factions. Deathcaster pretty much ends it all in an until then unknown place, at a random time, for a completely random reason. Imagine Luke Skywalker walking around, playing with his sword, thinking on how to defeat the Death Star and accidentally bumping into and killing the emperor and Darth Vader both. This is how this book feels, after wading through a zillion people, with their feelings described in detail while any military or political strategy is explained (poorly) in a paragraph or two, through their relationships with other people, through their random interactions that always seem to bring them together for no apparent reason and then split them apart randomly and then the villain basically stumbling and falling on their sword.&lt;br /&gt;&lt;br /&gt;  There is nothing interesting that actually happens, no moral in any of the stories and the development of the characters is basically just beefing up and aging a few years.&lt;br /&gt;&lt;br /&gt;  Bottom line: the ending of this book makes the reading of the three previous books and this one feel like a complete waste of time. How do you rate a book that makes all the previous ones unrateable? Cinda, you&#39;re a troll!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/756322478676029213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=756322478676029213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/756322478676029213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/756322478676029213'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/deathcaster-shattered-realms-4-by-cinda.html' title='Deathcaster (Shattered Realms #4), by Cinda Williams Chima'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-3DKO0LqurJg/XSNrZImWltI/AAAAAAAAD9Y/cvA96POKgtkikbDkTF85hjXCOiI4Z3BfgCLcBGAs/s72-c/Deathcaster.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-5609544922011671126</id><published>2019-07-08T19:09:00.001+03:00</published><updated>2019-07-08T19:09:28.893+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Flight of Morpho Girl (Wild Cards #24.1), by Caroline Spector and Bradley Denton</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-0F7L7s_2b3g/XSNo2fp9l9I/AAAAAAAAD9M/wwfbGJjOU50rrwYOfPw4IKlsvOcZVb6PwCLcBGAs/s320/FlightOfMorphoGirl.jpg&quot; width=&quot;213&quot; height=&quot;320&quot; data-original-width=&quot;316&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; &lt;a href=&quot;https://www.goodreads.com/book/show/40021546-the-flight-of-morpho-girl&quot; target=&quot;_blank&quot; title=&quot;Adesina is used to handling the weird that is her everyday, but life has dealt her a tricky new hand. First, her mom, the crimefighter Amazing Bubbles, has been off since her last mission. Second, Adesina recently aged from ten to sixteen, making everyone think she&#39;s even weirder than she already is. On top of everything else, her best friend goes missing. What&#39;s a newly-teenaged joker need to do to catch a break?&quot;&gt;The Flight of Morpho Girl&lt;/a&gt; is a short story set in the Wild Cards universe. If you haven&#39;t read the books until now, you won&#39;t know who the characters are. Even so, this story is so basic that it feels like &quot;The Unsuccessful Mugging of Batman&quot; or &quot;Murder of Crows v Superman&quot;: predictable and stakeless.&lt;br /&gt;&lt;br /&gt;  That doesn&#39;t mean that the authors didn&#39;t do a good job, it&#39;s just that it is a short that brings nothing to the table other than the introduction of Morpho Girl&#39;s (Adesina, the teenager daughter of Amazing Bubbles) post cocoon form: a teenage girl with very tough butterfly wings. For me it&#39;s like a collectible item in the Wild Cards set, nothing more.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/5609544922011671126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=5609544922011671126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5609544922011671126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5609544922011671126'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/the-flight-of-morpho-girl-wild-cards.html' title='The Flight of Morpho Girl (Wild Cards #24.1), by Caroline Spector and Bradley Denton'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-0F7L7s_2b3g/XSNo2fp9l9I/AAAAAAAAD9M/wwfbGJjOU50rrwYOfPw4IKlsvOcZVb6PwCLcBGAs/s72-c/FlightOfMorphoGirl.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-4493378016075323585</id><published>2019-07-08T18:58:00.001+03:00</published><updated>2019-07-08T18:58:22.693+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Descendant of the Crane, by Joan He</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-b4-CTN4xZfY/XSNky_9TvFI/AAAAAAAAD9A/tLA8QpaN16IYvkz4zASATkSLjzBdlIuUgCLcBGAs/s320/DescendantOfTheCrane.jpg&quot; width=&quot;216&quot; height=&quot;320&quot; data-original-width=&quot;320&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt;  I have to admit that my expectations for this book were so high that it was probably doomed to not satisfy me. I was expecting something deeply Asian, with fantastic elements and fresh ideas and characters. What I got is something that is almost accidentally fantastical and has few cultural elements to make it fresh. Yet it does have interesting characters and, if it weren&#39;t for the plot, which meanders whichever way the author needs to further her agenda, it would have been a good book. &lt;br /&gt;&lt;br /&gt;  &lt;a href=&quot;https://www.joanhewrites.com/&quot; target=&quot;_blank&quot; title=&quot;As a second-generation Chinese American, she was raised on a diet of Chinese cartoons and dramas. Journey to the West was basically her Sponge Bob.&quot;&gt;Joan He&lt;/a&gt; is American of Chinese descent (hence the name of the book?) and the culture described in &lt;a href=&quot;https://www.goodreads.com/book/show/41219451-descendant-of-the-crane&quot; target=&quot;_blank&quot; title=&quot;Princess Hesina of Yan has always been eager to shirk the responsibilities of the crown, but when her beloved father is murdered, she’s thrust into power, suddenly the queen of an unstable kingdom. Determined to find her father’s killer, Hesina does something desperate: she engages the aid of a soothsayer—a treasonous act, punishable by death... because in Yan, magic was outlawed centuries ago.&quot;&gt;Descendant of the Crane&lt;/a&gt; is based on an American&#39;s understanding of Chinese culture. That makes it both relatable and less Asian than I would have liked. What do I know, though? My feeling was that the author was exploring her own understanding of her origins instead of sharing something solid with the reader. There were some very intriguing ideas in the book, but they rode the story and the characters too strongly, making them inconsistent and irrational. This is an almost maybe book for me.&lt;br /&gt;&lt;br /&gt;  Bottom line: even without getting a lot of satisfaction out of it, I feel two stars out of five is too little, yet I am certain three is too much.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/4493378016075323585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=4493378016075323585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4493378016075323585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4493378016075323585'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/descendant-of-crane-by-joan-he.html' title='Descendant of the Crane, by Joan He'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-b4-CTN4xZfY/XSNky_9TvFI/AAAAAAAAD9A/tLA8QpaN16IYvkz4zASATkSLjzBdlIuUgCLcBGAs/s72-c/DescendantOfTheCrane.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-2178100238063819678</id><published>2019-07-08T18:40:00.002+03:00</published><updated>2019-07-08T18:40:38.515+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Rithmatist (Rithmatist #1), by Brandon Sanderson</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-Ko73PA9M7Aw/XSNhBqe6hqI/AAAAAAAAD80/b9nCQLlsbU47qQdFxuHPT9Be8QkzNUXIACLcBGAs/s320/TheRithmatist.jpg&quot; width=&quot;209&quot; height=&quot;320&quot; data-original-width=&quot;310&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; It was one of the few &lt;a href=&quot;https://brandonsanderson.com/&quot; target=&quot;_blank&quot; title=&quot;an American fantasy and science fiction writer. He is best known for the Cosmere universe, in which most of his fantasy novels (most notably the Mistborn series and The Stormlight Archive) are set. He is also known for finishing Robert Jordan&#39;s epic fantasy series The Wheel of Time. Sanderson was raised in Lincoln, Nebraska before attending Brigham Young University, where he received degrees in English literature and creative writing.&quot;&gt;Brandon Sanderson&lt;/a&gt; books that I hadn&#39;t read and it is, at least at this moment, a standalone book. I know that title says that &lt;a href=&quot;https://www.goodreads.com/book/show/22443261-the-rithmatist&quot; target=&quot;_blank&quot; title=&quot;More than anything, Joel wants to be a Rithmatist. Rithmatists have the power to infuse life into two-dimensional figures known as Chalklings. Rithmatists are humanity’s only defense against the Wild Chalklings. Having nearly overrun the territory of Nebrask, the Wild Chalklings now threaten all of the American Isles.&quot;&gt;The Rithmatist&lt;/a&gt; is part of a series, but what successful book isn&#39;t? In truth, Sanderson started this book while working (and failing) on another and it took years to rethink and rewrite it into a finished story. It&#39;s best you take it as one of those wonderful accidents that successfully reach the reader despite the publishing industry.&lt;br /&gt;&lt;br /&gt;  Back to the book, it&#39;s almost classic Sanderson: the main character is young, passionate and intelligent, yet lacking power. Everybody else has it, though, and he is fascinated by it, while learning at a prestigious school that also teaches the techniques of power. In this gearpunk like novel, the power is magical and involves drawing lines with chalk and imbuing them with personal will. The lines then become defenses, attacks, weapons and even magical minions. When the school is attacked and his friends are in danger, it is up to him to solve the mystery.&lt;br /&gt;&lt;br /&gt;  It&#39;s obvious that the story has issues, and that is probably why Sanderson worked so much at it to make it publishable, but one can get past it quickly. The characters are not as funny or punny as his others or even very complex, being satisfied to have one or two goals in life and go for them (kind of like magical chalk drawings themselves, hmmm). The plot, involving the awesome power of carrying a piece of chalk with you and going through amazing duels that resemble tower defense games, it also not the most captivating. Yet the story kind of works.&lt;br /&gt;&lt;br /&gt;  Bottom line: a pleasant Brandon Sanderson classic, without being exceptional in any way.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/2178100238063819678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=2178100238063819678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/2178100238063819678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/2178100238063819678'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/the-rithmatist-rithmatist-1-by-brandon.html' title='The Rithmatist (Rithmatist #1), by Brandon Sanderson'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-Ko73PA9M7Aw/XSNhBqe6hqI/AAAAAAAAD80/b9nCQLlsbU47qQdFxuHPT9Be8QkzNUXIACLcBGAs/s72-c/TheRithmatist.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-6333418549620274733</id><published>2019-07-08T18:22:00.001+03:00</published><updated>2019-07-08T18:25:55.910+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Chasing New Horizons: Inside the Epic First Mission to Pluto, by Alan Stern and  David Grinspoon</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-7qYYPWVWAEc/XSNVIBckZDI/AAAAAAAAD8c/kJsvBsdnjDQLxGo8NJAYISrEIX6lyQ8NgCLcBGAs/s320/ChasingNewHorizons.jpg&quot; width=&quot;210&quot; height=&quot;320&quot; data-original-width=&quot;263&quot; data-original-height=&quot;400&quot; style=&quot;float:left&quot; alt=&quot;book cover&quot; /&gt;  I thought long and hard how to start this review and I think the best place is the ending. In July 2015 the Internet and even the classic media exploded with the news of the American space probe named &lt;a href=&quot;https://en.wikipedia.org/wiki/New_Horizons&quot; target=&quot;_blank&quot; title=&quot;an interplanetary space probe that was launched as a part of NASA&#39;s New Frontiers program. Engineered by the Johns Hopkins University Applied Physics Laboratory (APL) and the Southwest Research Institute (SwRI), with a team led by S. Alan Stern, the spacecraft was launched in 2006 with the primary mission to perform a flyby study of the Pluto system in 2015, and a secondary mission to fly by and study one or more other Kuiper belt objects (KBOs) in the decade to follow, which as of 2019 includes 2014 MU69. It is the fifth space probe to achieve the escape velocity needed to leave the Solar System.&quot;&gt;New Horizons&lt;/a&gt; reaching the last unexplored classical planet of the solar system: &lt;a href=&quot;https://en.wikipedia.org/wiki/Pluto&quot; target=&quot;_blank&quot; title=&quot;a dwarf planet in the Kuiper belt, a ring of bodies beyond Neptune. It was the first Kuiper belt object to be discovered and is the largest known plutoid (or ice dwarf)&quot;&gt;Pluto&lt;/a&gt;. Long thought to be a frozen piece of rock floating too far from the Sun to be of any interest, it has been ignored by NASA and every other space agency out there, only to be revealed to be one of the most intriguing and beautiful gem of our system. New Horizons had been launched in 2006 and it took one more year to get all the Pluto data back to Earth. As far as the general population was concerned and even most of the people passionate about space, this was an axis in time with three major events: launch, flyby and end of data download. As far as the media was concerned, it was a great discovery because it produced memeable pictures (the Pluto heart is one, for example).&lt;br /&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-QFKi1mavklw/XSNfdfwiXFI/AAAAAAAAD8o/lhUG4nSGRkMG6bM7e4ketJixhuDB2ooNACLcBGAs/s1600/PlutoDog.png&quot; data-original-width=&quot;200&quot; data-original-height=&quot;204&quot; style=&quot;float:right&quot; alt=&quot;heart or Pluto the dog?&quot; /&gt;  &lt;a href=&quot;https://www.goodreads.com/book/show/36031228-chasing-new-horizons&quot; target=&quot;_blank&quot; title=&quot;Alan Stern and David Grinspoon take us behind the scenes of the science, politics, egos, and public expectations that fueled the greatest space mission of our time: New Horizons&#39; misison to Pluto.&quot;&gt;Chasing New Horizons&lt;/a&gt; starts in 1989, when &lt;a href=&quot;https://alanstern.space/&quot; target=&quot;_blank&quot; title=&quot;an American engineer and planetary scientist. He is the principal investigator of the New Horizons mission to Pluto and the Chief Scientist at Moon Express.&quot;&gt;Alan Stern&lt;/a&gt; deciding he would work for a NASA mission to Pluto, it takes us through the Herculean job of creating interest, gathering people, drafting a project, finding support and funding, fighting competing teams, bureaucracy and political apathy and even bad will, the ups and downs, the almost-theres, the Sisyphean and thankless work to get something up the Hill only to see it fall because of a change in administration, or a cut in the budget, or some hidden agenda and even &lt;a href=&quot;https://laurele.livejournal.com/4755.html&quot; target=&quot;_blank&quot; title=&quot;Dr. Brian Marsden makes assholes everywhere look good&quot;&gt;people petty enough&lt;/a&gt; to demote Pluto&#39;s status as a planet as a personal grudge against the person who discovered it.&lt;br /&gt;&lt;br /&gt;I liked how the book was written, even if at start I had to move over the usual platitudes meant to garner interest for space from the average reader and had to cope with the American units of measurement: feet, miles, Fahrenheit and, of course, the bus-size. However, no matter the small faults in the writing, the subject is so important than I can&#39;t rate the book lower than maximum. &lt;span class=&quot;important&quot;&gt;This is a must read, even if it skirts the technical aspects and mostly discusses the 25 year work from a managerial standpoint.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It&#39;s hard to describe how awesome these people are. Can you imagine working for a quarter century for something that can fail abruptly and with no positive outcome at literally any moment? I thought I had it bad when a project I was working on for six months was cancelled - imagine having to go through something like this several times, at the exact moment when you thought it will all sail smoothly from then on, when you had the funding, the assurances and even the construction of the probe nearly finished. Four days before one critical moment, the flyby, when New Horizons was supposed to do almost all of its work, the on board computer rebooted and lost all previously uploaded programming. In those four days, people had to scramble to recreate the entire software package they had worked for incrementally for the last 9 years and upload it to a machine that was 9 light hours away from Earth. One of the most critical moments of the mission (after 16 years of ground work to make it happen) was the launch, for example. The mission planners had no control over the mechanism of the launch vehicle. It could have blown on the pad or in the air.&lt;br /&gt;&lt;br /&gt;There would be no redos. First, no way the project would have been approved again after a failure so senseless. Second, Pluto would have moved in a region of its 248 year long orbit where its atmosphere would freeze, making any other future probe return much less interesting data than at that exact moment. If it failed, it would have been the first and probably last &lt;a href=&quot;https://en.wikipedia.org/wiki/Applied_Physics_Laboratory&quot; target=&quot;_blank&quot; title=&quot;The Johns Hopkins University Applied Physics Laboratory, commonly known as simply the Applied Physics Laboratory, or APL, located in Howard County, Maryland, near Laurel and Columbia, is a not-for-profit, university-affiliated research center (or UARC) employing over 6,000 people. The Lab serves as a technical resource for the Department of Defense, NASA, and other government agencies.&quot;&gt;APL&lt;/a&gt; planetary exploration mission, after they fought tooth and nail to be the ones doing it, rather than the usual and entrenched &lt;a href=&quot;https://en.wikipedia.org/wiki/Jet_Propulsion_Laboratory&quot; target=&quot;_blank&quot; title=&quot;The Jet Propulsion Laboratory (JPL) is a federally funded research and development center and NASA field center in La Cañada Flintridge, California, United States, though it is often referred to as residing in Pasadena, California, because it has a Pasadena ZIP Code&quot;&gt;JPL&lt;/a&gt;. People had lived their entire lives working on this thing and it could have failed in so many different ways.&lt;br /&gt;&lt;br /&gt;Bottom line: you have to be insane to do what Stern did. A wonderful flavor of insanity that is both admirable and terrifying. The system behind NASA should value and support these people even if, especially if, they are insanely driven enough that they don&#39;t actually need it. I would say that New Horizons succeeded despite the American space industry and political system, not because of them. It really shouldn&#39;t be that hard. &lt;span class=&quot;important&quot;&gt;This is a book for all space fans, but also people who had difficulties in their projects. While it might help with specific insights, this book will make almost any hardship you ever endured seem insignificant.&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/6333418549620274733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=6333418549620274733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6333418549620274733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6333418549620274733'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/chasing-new-horizons-inside-epic-first.html' title='Chasing New Horizons: Inside the Epic First Mission to Pluto, by Alan Stern and  David Grinspoon'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-7qYYPWVWAEc/XSNVIBckZDI/AAAAAAAAD8c/kJsvBsdnjDQLxGo8NJAYISrEIX6lyQ8NgCLcBGAs/s72-c/ChasingNewHorizons.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-6034014898499481700</id><published>2019-07-03T15:15:00.001+03:00</published><updated>2019-07-03T15:36:24.543+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Core"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Dynamically loading types from assembly files in .NET Core and Standard</title><content type='html'>  We already know how to load types in .NET Framework and we know what they say we should use in .NET Core. But what about Standard? Is that a trick question? Sort of. Right now we have two .NET Standard and three .NET Core versions, albeit .NET Core 3 is in preview mode. The signature for AssemblyLoadContext and how it is used has changed dramatically. Core 3 enables context unloading, but Standard 2 does not. So you either are forced to build your library as Core 3 or you have to not use Unloading contexts or use reflection, which is not robust and probably will not be needed with the possible arrival of Standard 3.&lt;br /&gt;&lt;br /&gt;But there are subtler issues at work. One of them is that, at least with .NET Core 3 Preview6, when you reference System.Runtime.Loader in a Standard library, so you can access AssemblyLoadContext, you get conflicts between the System.Runtime you are using and the one referenced by System.Runtime.Loader. The only solution is to use the System.Runtime.Loader NuGet package, but that returns you to the Standard 2 version of AssemblyLoadContext, even if the library version is higher!&lt;br /&gt;&lt;br /&gt;The setup is this: I have an ITestInterface interface which resides in TestInterfaceLibrary.dll. I also have a TestImplementation class that can be found in TestImplementationLibrary.dll and implements ITestInterface. My program either does not reference any of these libraries or it only references the interface one. The task is to load both these types and then simply convert one instance of TestImplementation to ITestInterface. Simple test would be loading the types and then expecting &lt;i&gt;interfaceType.IsAssignableFrom(implementationType)&lt;/i&gt; to be true.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Core 3&lt;/h2&gt;&lt;br /&gt;Let&#39;s first try the Core 3 way:&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; context = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; AssemblyLoadContext(&lt;span class=&quot;str&quot;&gt;&quot;testContext&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceAssembly = context.LoadFromAssemblyPath(interfaceAssemblyPath);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceType = interfaceAssembly.GetType(&lt;span class=&quot;str&quot;&gt;&quot;TestInterfaceLibrary.ITestInterface&quot;&lt;/span&gt;);&lt;br /&gt;Console.WriteLine(interfaceType?.ToString()??&lt;span class=&quot;str&quot;&gt;&quot;interface type not loaded&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationAssembly = context.LoadFromAssemblyPath(implementationAssemblyPath);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationType = implementationAssembly.GetType(&lt;span class=&quot;str&quot;&gt;&quot;TestImplementationLibrary.TestImplementation&quot;&lt;/span&gt;);&lt;br /&gt;Console.WriteLine(implementationType?.ToString() ?? &lt;span class=&quot;str&quot;&gt;&quot;implementation type not loaded&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;implementation implements interface: &quot;&lt;/span&gt;+interfaceType.IsAssignableFrom(implementationType));&lt;br /&gt;&amp;nbsp;&lt;br /&gt;context.Unload();&lt;br /&gt;&lt;/pre&gt;The output is: &lt;pre&gt;TestInterfaceLibrary.ITestInterface&lt;br /&gt;TestImplementationLibrary.TestImplementation&lt;br /&gt;implementation implements interface: True&lt;/pre&gt;&lt;br /&gt;It works! But only because the interface assembly is loaded first. If you try to load just the implementation type first, it will come up as empty. There are no exceptions thrown unless you get all the assembly types or specify the &lt;b&gt;throwOnError&lt;/b&gt; parameter in GetType. The exception is &quot;&lt;i&gt;System.IO.FileNotFoundException: &#39;Could not load file or assembly &#39;TestInterfaceLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&#39;. The system cannot find the file specified.&#39;&lt;/i&gt;&quot;.&lt;br /&gt;&lt;br /&gt;In order to solve this, we need to use the Resolve event of the AssemblyLoadContext class. Let&#39;s try this:&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; context = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; AssemblyLoadContext(&lt;span class=&quot;str&quot;&gt;&quot;testContext&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;context.Resolving += Context_Resolving;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationAssembly = context.LoadFromAssemblyPath(implementationAssemblyPath);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationType = implementationAssembly.GetType(&lt;span class=&quot;str&quot;&gt;&quot;TestImplementationLibrary.TestImplementation&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;Console.WriteLine(implementationType?.ToString() ?? &lt;span class=&quot;str&quot;&gt;&quot;implementation type not loaded&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceAssembly = context.LoadFromAssemblyPath(interfaceAssemblyPath);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceType = interfaceAssembly.GetType(&lt;span class=&quot;str&quot;&gt;&quot;TestInterfaceLibrary.ITestInterface&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;Console.WriteLine(interfaceType?.ToString() ?? &lt;span class=&quot;str&quot;&gt;&quot;interface type not loaded&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;implementation implements interface: &quot;&lt;/span&gt; + interfaceType.IsAssignableFrom(implementationType));&lt;br /&gt;&amp;nbsp;&lt;br /&gt;context.Resolving -= Context_Resolving;&lt;br /&gt;context.Unload();&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; Assembly Context_Resolving(AssemblyLoadContext context, AssemblyName assemblyName)&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; expectedPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, assemblyName.Name + &lt;span class=&quot;str&quot;&gt;&quot;.dll&quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; context.LoadFromAssemblyPath(expectedPath);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And now it works again, by assuming the assembly name is the same as the assembly file name and that it is found in the same place.&lt;br /&gt;&lt;br /&gt;But... if we try this in different contexts:&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; context = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; AssemblyLoadContext(&lt;span class=&quot;str&quot;&gt;&quot;testContext&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;context.Resolving += Context_Resolving;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationAssembly = context.LoadFromAssemblyPath(implementationAssemblyPath);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationType = implementationAssembly.GetType(&lt;span class=&quot;str&quot;&gt;&quot;TestImplementationLibrary.TestImplementation&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;Console.WriteLine(implementationType?.ToString() ?? &lt;span class=&quot;str&quot;&gt;&quot;implementation type not loaded&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;context.Resolving -= Context_Resolving;&lt;br /&gt;context.Unload();&lt;br /&gt;context = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; AssemblyLoadContext(&lt;span class=&quot;str&quot;&gt;&quot;testContext2&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;context.Resolving += Context_Resolving;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceAssembly = context.LoadFromAssemblyPath(interfaceAssemblyPath);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceType = interfaceAssembly.GetType(&lt;span class=&quot;str&quot;&gt;&quot;TestInterfaceLibrary.ITestInterface&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;Console.WriteLine(interfaceType?.ToString() ?? &lt;span class=&quot;str&quot;&gt;&quot;interface type not loaded&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;implementation implements interface: &quot;&lt;/span&gt; + interfaceType.IsAssignableFrom(implementationType));&lt;br /&gt;&amp;nbsp;&lt;br /&gt;context.Resolving -= Context_Resolving;&lt;br /&gt;context.Unload();&lt;br /&gt;&lt;/pre&gt;the output will show &lt;pre&gt;implementation implements interface: False&lt;/pre&gt;&lt;br /&gt;This means that if we want to encapsulate this in a TypeLoader class or something, we cannot use different contexts for dynamically loading types. Even if we had one context that we would unload in order to refresh all the types, it could still be different from the main context, in case the interface is loaded twice or referenced directly in the project.&lt;br /&gt;&lt;br /&gt;For example, if you reference TestInterfaceLibrary directly and you load TestImplementation dynamically it will work as expected, because ITestInterface is resolved automatically from the main context. However, if you load ITestInterface dynamically, too, it will be &lt;b&gt;a different type&lt;/b&gt; from the referenced ITestInterface, even if they apparently have the same name and full name and assembly qualified name! So it kind of makes sense to not load a type twice. Is this where the context unloading comes in? Not really. Let&#39;s define a method that counts the number of types with a certain name in the current domain as &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; CountTypes(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; typeName)&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; AppDomain.CurrentDomain.GetAssemblies()&lt;br /&gt;        .SelectMany(assembly =&amp;gt; assembly.GetTypes().Where(t =&amp;gt; t.FullName == typeName))&lt;br /&gt;        .Count();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And now let&#39;s run this code:&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; context = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; AssemblyLoadContext(&lt;span class=&quot;str&quot;&gt;&quot;testContext&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;context.Resolving += Context_Resolving;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; referencedInterfaceType = &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(ITestInterface);&lt;br /&gt;Console.WriteLine(referencedInterfaceType?.ToString() ?? &lt;span class=&quot;str&quot;&gt;&quot;interface type not loaded&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceAssembly = context.LoadFromAssemblyPath(interfaceAssemblyPath);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceType = interfaceAssembly.GetType(&lt;span class=&quot;str&quot;&gt;&quot;TestInterfaceLibrary.ITestInterface&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;Console.WriteLine(interfaceType?.ToString() ?? &lt;span class=&quot;str&quot;&gt;&quot;interface type not loaded&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Console.WriteLine($&lt;span class=&quot;str&quot;&gt;&quot;Types are the same: {interfaceType==referencedInterfaceType}&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Console.WriteLine($&lt;span class=&quot;str&quot;&gt;&quot;Number of types with name {interfaceType.FullName}: {CountTypes(interfaceType.FullName)}&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;context.Resolving -= Context_Resolving;&lt;br /&gt;context.Unload();&lt;br /&gt;Console.WriteLine($&lt;span class=&quot;str&quot;&gt;&quot;Number of types with name {interfaceType.FullName}: {CountTypes(interfaceType.FullName)}&quot;&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There is the referenced type, then we load the type dynamically again, inside a new context. We count the types loaded in the current domain, we unload the context, we count the types again. The result is &lt;pre&gt;TestInterfaceLibrary.ITestInterface&lt;br /&gt;TestInterfaceLibrary.ITestInterface&lt;br /&gt;Types are the same: False&lt;br /&gt;Number of types with name TestInterfaceLibrary.ITestInterface: 2&lt;br /&gt;Number of types with name TestInterfaceLibrary.ITestInterface: 2&lt;/pre&gt;The types are always 2!&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;important&quot;&gt;Bottom line, even when unloading the AssemblyLoadContext, the types used are not unloaded and trying to find a type by name will result in duplicates&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;OK, so let&#39;s just agree that types with the same name, once loaded, should remain there and no other type with the same name should be loaded. Let&#39;s try to incorporate this into a TypeLoader class:&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; TypeLoader : IDisposable&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; readonly AssemblyLoadContext _context;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; TypeLoader()&lt;br /&gt;    {&lt;br /&gt;        _context = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; AssemblyLoadContext(GetType().FullName, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;        _context.Resolving += Context_Resolving;&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; Assembly Context_Resolving(AssemblyLoadContext context, AssemblyName assemblyName)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; expectedPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, assemblyName.Name + &lt;span class=&quot;str&quot;&gt;&quot;.dll&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; context.LoadFromAssemblyPath(expectedPath);&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; Type LoadType(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; typeName, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; assemblyPath)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; type = AppDomain.CurrentDomain.GetAssemblies()&lt;br /&gt;            .SelectMany(assembly =&amp;gt; assembly.GetTypes().Where(t =&amp;gt; t.FullName == typeName))&lt;br /&gt;            .FirstOrDefault();&lt;br /&gt;        if (type != null)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; type;&lt;br /&gt;        }&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; assembly = _context.LoadFromAssemblyPath(assemblyPath);&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; assembly.GetType(typeName, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;    {&lt;br /&gt;        _context?.Resolving -= Context_Resolving;&lt;br /&gt;        _context?.Unload();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The code in our test is now much clearer: &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceAssemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, &lt;span class=&quot;str&quot;&gt;&quot;TestInterfaceLibrary.dll&quot;&lt;/span&gt;);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationAssemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, &lt;span class=&quot;str&quot;&gt;&quot;TestImplementationLibrary.dll&quot;&lt;/span&gt;);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceTypeName = &lt;span class=&quot;str&quot;&gt;&quot;TestInterfaceLibrary.ITestInterface&quot;&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationTypeName = &lt;span class=&quot;str&quot;&gt;&quot;TestImplementationLibrary.TestImplementation&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;using (&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; loader = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TypeLoader())&lt;br /&gt;{&lt;br /&gt;    Type referencedType = &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(TestInterfaceLibrary.ITestInterface);&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; interfaceType = loader.LoadType(interfaceTypeName, interfaceAssemblyPath);&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; implementationType = loader.LoadType(implementationTypeName, implementationAssemblyPath);&lt;br /&gt;    Console.WriteLine($&lt;span class=&quot;str&quot;&gt;@&quot;&lt;br /&gt;referenced type: {referencedType}&lt;br /&gt;interface type: {interfaceType}&lt;br /&gt;implementation type: {implementationType}&lt;br /&gt;referenced and loaded interfaces are the same: {referencedType == interfaceType}&lt;br /&gt;interface implemented: {interfaceType.IsAssignableFrom(implementationType)}&quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;and the result is &lt;pre&gt;referenced type: TestInterfaceLibrary.ITestInterface&lt;br /&gt;interface type: TestInterfaceLibrary.ITestInterface&lt;br /&gt;implementation type: TestImplementationLibrary.TestImplementation&lt;br /&gt;referenced and loaded interfaces are the same: True&lt;br /&gt;interface implemented: True&lt;/pre&gt;&lt;br /&gt;But we still use Unload. Maybe it will work some day as I want it to work, but until then, why not get rid of Unload and make TypeLoader a class in a Standard 2 library?&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Standard 2&lt;/h2&gt;&lt;br /&gt;For this I will create a new Standard 2 library project and then reference it in our test Core 3 project. Then I will move the TypeLoader class in the library project.&lt;br /&gt;&lt;br /&gt;The errors in the library project are related to not knowing what an AssemblyLoadContext is, therefore the first solution is to reference System.Runtime.Loader from the framework. I get the immediate error &quot;&lt;i&gt;Assembly &#39;System.Runtime.Loader&#39; with identity &#39;System.Runtime.Loader, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&#39; uses &#39;System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&#39; which has a higher version than referenced assembly &#39;System.Runtime&#39; with identity &#39;System.Runtime, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&lt;/i&gt;&quot;.&lt;br /&gt;&lt;br /&gt;Solution 2: load the System.Runtime.Loader NuGet package, which at the time of writing this, is version 4.3.0. The error is now gone, but several things are immediately apparent:&lt;ol&gt;&lt;li&gt;the Unload method doesn&#39;t exist anymore&lt;/li&gt;&lt;li&gt;the constructor doesn&#39;t receive a name and a bool anymore&lt;/li&gt;&lt;li&gt;AssemblyLoadContext is now abstract&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;In order to solve this I am creating a DynamicAssemblyLoadContext class that inherits from AssemblyLoadContext and just return null from the Load method overload, and I give it an Unload method and a constructor with a string and a bool that don&#39;t do anything. And it works again. The updated TypeLoader class is now: &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; TypeLoader : IDisposable&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; readonly DynamicAssemblyLoadContext _context;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; TypeLoader()&lt;br /&gt;    {&lt;br /&gt;        _context = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DynamicAssemblyLoadContext(GetType().FullName, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;        _context.Resolving += Context_Resolving;&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; Assembly Context_Resolving(AssemblyLoadContext context, AssemblyName assemblyName)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; expectedPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, assemblyName.Name + &lt;span class=&quot;str&quot;&gt;&quot;.dll&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; context.LoadFromAssemblyPath(expectedPath);&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; Type LoadType(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; typeName, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; assemblyPath)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; type = AppDomain.CurrentDomain.GetAssemblies()&lt;br /&gt;            .SelectMany(ass =&amp;gt; ass.GetTypes().Where(t =&amp;gt; t.FullName == typeName))&lt;br /&gt;            .FirstOrDefault();&lt;br /&gt;        if (type != null)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; type;&lt;br /&gt;        }&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; assembly = _context.LoadFromAssemblyPath(assemblyPath);&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; assembly.GetType(typeName, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;    {&lt;br /&gt;        _context?.Resolving -= Context_Resolving;&lt;br /&gt;        _context?.Unload();&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; DynamicAssemblyLoadContext : AssemblyLoadContext&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; DynamicAssemblyLoadContext(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; name, &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; isCollectible)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;override&lt;/span&gt; Assembly Load(AssemblyName assemblyName)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; null;&lt;br /&gt;        }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Unload()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;The safe way&lt;/h2&gt;&lt;br /&gt;The code above has an issue, though. &lt;span class=&quot;important&quot;&gt;If the interface type is dynamically loaded &lt;b&gt;before&lt;/b&gt; its referenced type is used, this fails again.&lt;/span&gt; This is the case when you use dependency injection. You dynamically load the types in order to register the implementation relationship to the interface, but then, when you ask for a resolution for the interface type, now referenced by the main project, you get another type named just the same.&lt;br /&gt;&lt;br /&gt;The safe way, considering that we don&#39;t really use Unload and we don&#39;t count on it every working, why not use the default context, the one where everything loads, and be done with it. When you do that, the code becomes a little uglier, but it works in all situations.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;important&quot;&gt;Final version.&lt;/span&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; TypeLoader&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; readonly object _resolutionLock = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; object();&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; Assembly Context_Resolving(AssemblyLoadContext context, AssemblyName assemblyName)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; expectedPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, assemblyName.Name + &lt;span class=&quot;str&quot;&gt;&quot;.dll&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; context.LoadFromAssemblyPath(expectedPath);&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; Type LoadType(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; typeName, &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; assemblyPath)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; context = AssemblyLoadContext.Default;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;lock&lt;/span&gt; (_resolutionLock)&lt;br /&gt;        {&lt;br /&gt;            context.Resolving += Context_Resolving;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; type = AppDomain.CurrentDomain.GetAssemblies()&lt;br /&gt;                .SelectMany(ass =&amp;gt; ass.GetTypes().Where(t =&amp;gt; t.FullName == typeName))&lt;br /&gt;                .FirstOrDefault();&lt;br /&gt;            if (type != null)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; type;&lt;br /&gt;            }&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; assembly = context.LoadFromAssemblyPath(assemblyPath);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;            type = assembly.GetType(typeName, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;            context.Resolving -= Context_Resolving;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; type;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You just gotta hate that adding and removing the event inside a lock, right? Well, if you find a better solution, let me know.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/6034014898499481700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=6034014898499481700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6034014898499481700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6034014898499481700'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/07/dynamically-loading-types-from-assembly.html' title='Dynamically loading types from assembly files in .NET Core and Standard'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-5126060381012147918</id><published>2019-06-30T12:35:00.001+03:00</published><updated>2019-06-30T12:35:22.717+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Blood Mirror (Lightbringer #4), by Brent Weeks</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-v7pvlYfdE4k/XRh8xK6LL5I/AAAAAAAAD78/TSr3xcdUp8YuII6TI8b8ZAnogYi6RaUSQCLcBGAs/s320/TheBloodMirror.jpg&quot; width=&quot;208&quot; height=&quot;320&quot; data-original-width=&quot;500&quot; data-original-height=&quot;770&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; &lt;a href=&quot;https://www.goodreads.com/book/show/29467232-the-blood-mirror&quot; target=&quot;_blank&quot; title=&quot;What&#39;s with the names? There is no Black Prism in the first volume and no blood mirror in this one!&quot;&gt;The Blood Mirror&lt;/a&gt; felt like the weakest book in the series, but really, if I think about it, it&#39;s the pattern that unfolded through the entire Lightbringer saga that feels wrong. The first book was amazing, with interesting characters, great world building, an intriguing story, but then came the second book - and I didn&#39;t see it then - which upended much of the concepts in the first and added many more. It was not a continuation, per se, but a reframing of the story with other parameters. Instead of closing story arcs, &lt;a href=&quot;http://www.brentweeks.com/writing/the-blinding-knife/&quot; target=&quot;_blank&quot; title=&quot;an American fantasy writer. He made The New York Times Best Seller list with The Blinding Knife in its first month, September 2012. Weeks was born in Montana on March 7, 1977, and graduated from Hillsdale College with a degree in English. He briefly worked as a teacher and bartender before moving to writing full-time.&quot;&gt;Brent Weeks&lt;/a&gt; was transforming them, kept them open and added many more. The third book made this pattern obvious and in this book it became annoying.&lt;br /&gt;&lt;br /&gt;  Forget that everybody is the relative of everybody or in the extreme the member of an organization that we didn&#39;t know existed or cared about in previous books. Forget that after we follow a character as something, we have to follow them as something completely different in the next book, because of reasons that we didn&#39;t know (or cared) about. Forget even that threatening someone&#39;s loved ones seems to control everything with maximum efficiency in this universe, while actually harming them is a forgivable offense. Nothing. Ever. Ends. It just piles on. And since there is limited space in the book, important things - like &lt;b&gt;the war&lt;/b&gt; or what the people are actually doing when the entire establishment blows in their faces and destroys their lives - get sidelined or completely eliminated in favor of whatever insecurity Kip feels while discussing hot sex with his friends or amazingly beautiful (and totally inconsistent) wife. And of course, the book ends in another cliffhanger.&lt;br /&gt;&lt;br /&gt;  In chess, when you are overwhelmed by the complexity of the position, you simplify it. You exchange pieces until the board is clearer. In Lightbringer, enemies just enjoy threatening each other and never following up while they work together for some completely pointless goal. Just like in TV soap operas, they all hate and love each other at the same time while things that could never have been predicted by the reader happen as chaotically as possible around them.&lt;br /&gt;&lt;br /&gt;  So, the fifth book will be published this year and I will read it, but my rating on the entire series just plunged dramatically. I don&#39;t expect things to really come to any conclusion, I don&#39;t expect characters to evolve in any meaningful way anymore or the lore behind it all to ever be explained. We started with seven colors and a god, now we have 11 colors and about 200 gods, for example. The chances that all of this mess will become clear in the future are remote.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/5126060381012147918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=5126060381012147918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5126060381012147918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5126060381012147918'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/the-blood-mirror-lightbringer-4-by.html' title='The Blood Mirror (Lightbringer #4), by Brent Weeks'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-v7pvlYfdE4k/XRh8xK6LL5I/AAAAAAAAD78/TSr3xcdUp8YuII6TI8b8ZAnogYi6RaUSQCLcBGAs/s72-c/TheBloodMirror.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-3197590351700824787</id><published>2019-06-27T16:59:00.000+03:00</published><updated>2019-06-27T16:59:34.904+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Broken Eye (Lightbringer #3), by Brent Weeks</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-PQklB59qhic/XRTHa7wLI8I/AAAAAAAAD7k/oiFd6vwTPdoR1O5CFCRPiMCmq0yyT5CLACLcBGAs/s320/TheBrokenEye.jpg&quot; width=&quot;208&quot; height=&quot;320&quot; data-original-width=&quot;309&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt;  &lt;a href=&quot;https://www.goodreads.com/book/show/12652457-the-broken-eye&quot; target=&quot;_blank&quot; title=&quot;As the old gods awaken, the Chromeria is in a race to find its lost Prism, the only man who may be able to stop catastrophe, Gavin Guile. But Gavin&#39;s enslaved on a galley, and when he finally escapes, he finds himself in less than friendly hands. &quot;&gt;The Broken Eye&lt;/a&gt; continues right after the shocking finale of &lt;a href=&quot;https://siderite.blogspot.com/2019/06/the-blinding-knife-lightbringer-2-by.html&quot; target=&quot;_blank&quot; title=&quot;My review or it&quot;&gt;The Blinding Knife&lt;/a&gt;! And that pretty much sucks, because the ending was the type of cliffhanger that just felt added on in order to make people quickly buy the next volume. Unfortunately, this book is no different. After a zillion story arcs that meet improbably and a lot of agitation one way or the other, &lt;a href=&quot;http://www.brentweeks.com/writing/the-blinding-knife/&quot; target=&quot;_blank&quot; title=&quot;an American fantasy writer. He made The New York Times Best Seller list with The Blinding Knife in its first month, September 2012. Weeks was born in Montana on March 7, 1977, and graduated from Hillsdale College with a degree in English. He briefly worked as a teacher and bartender before moving to writing full-time.&quot;&gt;Brent Weeks&lt;/a&gt; ends Broken Eye with an even shockier (is that a word?) ending. &lt;br /&gt;&lt;br /&gt;  And I will bite, I will read the fourth book in the series, &lt;a href=&quot;https://www.goodreads.com/book/show/29467232-the-blood-mirror&quot; target=&quot;_blank&quot; title=&quot;Stripped of both magical and political power, the people he once ruled told he&#39;s dead, and now imprisoned in his own magical dungeon, former Emperor Gavin Guile has no prospect of escape. But the world faces a calamity greater than the Seven Satrapies has ever seen... and only he can save it.&quot;&gt;The Blood Mirror&lt;/a&gt;, but only because I find the characters intriguing. Yet I definitely lost that feeling of respect for the story, the careful attention to detail that I enjoyed so much in the first volume. Weeks is a good writer, maybe even a great one, but instead of the series getting better, it just gets bloated until it needs over the top twists and abrupt cliffhangers. One of the most pervasive feelings when reading this volume was frustration that the stories of characters that I wanted to follow were interrupted by all of the others and how each and every one of even the secondary heroes needed their own grand achievement until it got claustrophobic. OK, you&#39;re the good guy, but when you see someone hurting everyone you know, you just kill them. You don&#39;t one up them, you don&#39;t talk to them, you don&#39;t strategize or play games. OK, you&#39;re a powerful psycho, but it doesn&#39;t mean &lt;b&gt;everything&lt;/b&gt; needs to be a power show. I mean, does Andross Guile even go to the bathroom or just &lt;i&gt;wills&lt;/i&gt; his bowels into submission? OK, you are young and inexperienced so you don&#39;t know what to do when you love someone, but doing the exact opposite? And how come in this universe there are at most two degrees of separation? More like one and a half. And how come everyone knows what they need to do when they need it, regardless if they ever learned it before?&lt;br /&gt;&lt;br /&gt;  I am already hooked into the story and Brent Weeks creates a complex and compelling one, however the experience of reading the books is only diminishing with stupid techniques like cliffhangers and hidden information and mindless expansions into new territories that absolutely did not need to be there. Too bad that now everything will need to at least maintain this insane level of tension and complexity, for fear of turning boring.&lt;br /&gt;&lt;br /&gt;  Bottom line: not bad, certainly not boring, but pointlessly exhausting.&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/3197590351700824787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=3197590351700824787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3197590351700824787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3197590351700824787'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/the-broken-eye-lightbringer-3-by-brent.html' title='The Broken Eye (Lightbringer #3), by Brent Weeks'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-PQklB59qhic/XRTHa7wLI8I/AAAAAAAAD7k/oiFd6vwTPdoR1O5CFCRPiMCmq0yyT5CLACLcBGAs/s72-c/TheBrokenEye.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-3469923958850581827</id><published>2019-06-25T11:35:00.002+03:00</published><updated>2019-06-25T11:44:30.344+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Visual Studio and Visual Studio Code extensions</title><content type='html'>  This is more a backup for the extensions that I have installed on the two main IDEs I&#39;m using for my job: Visual Studio and Visual Studio Code. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Visual Studio Code&lt;/h2&gt;&lt;br /&gt;In order to list the extensions installed, use the command &lt;b&gt;code --list-extensions&lt;/b&gt;. For me, this results in this output:&lt;pre&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=aeschli.vscode-css-formatter&quot; target=&quot;_blank&quot; title=&quot;This extension adds formatting to CSS.&quot;&gt;aeschli.vscode-css-formatter&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Angular.ng-template&quot; target=&quot;_blank&quot; title=&quot;Editor services for Angular templates&quot;&gt;Angular.ng-template&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=christian-kohler.npm-intellisense&quot; target=&quot;_blank&quot; title=&quot;Visual Studio Code plugin that autocompletes npm modules in import statements&quot;&gt;christian-kohler.npm-intellisense&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=cmstead.jsrefactor&quot; target=&quot;_blank&quot; title=&quot;Automated refactoring tools to smooth your development workflow&quot;&gt;cmstead.jsrefactor&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=cssho.vscode-svgviewer&quot; target=&quot;_blank&quot; title=&quot;SVG Viewer for Visual Studio Code.&quot;&gt;cssho.vscode-svgviewer&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=danwahlin.angular2-snippets&quot; target=&quot;_blank&quot; title=&quot;VS Code snippets for Angular and TypeScript/HTML&quot;&gt;danwahlin.angular2-snippets&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=dbaeumer.jshint&quot; target=&quot;_blank&quot; title=&quot;Integrates JSHint into VS Code. JSHint is a linter for JavaScript&quot;&gt;dbaeumer.jshint&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint&quot; target=&quot;_blank&quot; title=&quot;Integrates ESLint JavaScript into VS Code.&quot;&gt;dbaeumer.vscode-eslint&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=donjayamanne.jquerysnippets&quot; target=&quot;_blank&quot; title=&quot;Over 130 jQuery Code Snippets&quot;&gt;donjayamanne.jquerysnippets&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=donjayamanne.jupyter&quot; target=&quot;_blank&quot; title=&quot;Data Science with Jupyter on Visual Studio Code&quot;&gt;donjayamanne.jupyter&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=DotJoshJohnson.xml&quot; target=&quot;_blank&quot; title=&quot;XML Formatting, XQuery, and XPath Tools for Visual Studio Code&quot;&gt;DotJoshJohnson.xml&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ecmel.vscode-html-css&quot; target=&quot;_blank&quot; title=&quot;CSS support for HTML documents&quot;&gt;ecmel.vscode-html-css&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=eg2.vscode-npm-script&quot; target=&quot;_blank&quot; title=&quot;npm support for VS Code&quot;&gt;eg2.vscode-npm-script&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&quot; target=&quot;_blank&quot; title=&quot;VS Code plugin for prettier/prettier&quot;&gt;esbenp.prettier-vscode&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=fabianlauer.vs-code-xml-format&quot; target=&quot;_blank&quot; title=&quot;A simple XML formatter for VS Code.&quot;&gt;fabianlauer.vs-code-xml-format&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=fknop.vscode-npm&quot; target=&quot;_blank&quot; title=&quot;npm commands for VSCode&quot;&gt;fknop.vscode-npm&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify&quot; target=&quot;_blank&quot; title=&quot;Beautify code in place for VS Code&quot;&gt;HookyQR.beautify&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=humao.rest-client&quot; target=&quot;_blank&quot; title=&quot;REST Client for Visual Studio Code&quot;&gt;humao.rest-client&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=joelday.docthis&quot; target=&quot;_blank&quot; title=&quot;Automatically generates detailed JSDoc comments in TypeScript and JavaScript files.&quot;&gt;joelday.docthis&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=k--kato.docomment&quot; target=&quot;_blank&quot; title=&quot;Generate C# XML documentation comments for ///&quot;&gt;k--kato.docomment&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=michelemelluso.code-beautifier&quot; target=&quot;_blank&quot; title=&quot;Beautify css, sass and less code (extension for Visual Studio Code)&quot;&gt;michelemelluso.code-beautifier&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=minhthai.vscode-todo-parser&quot; target=&quot;_blank&quot; title=&quot;Parse TODOs in your working files.&quot;&gt;minhthai.vscode-todo-parser&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=mohsen1.prettify-json&quot; target=&quot;_blank&quot; title=&quot;Visual Studio Code Prettify JSON Extension&quot;&gt;mohsen1.prettify-json&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=mrmlnc.vscode-scss&quot; target=&quot;_blank&quot; title=&quot;Advanced autocompletion and refactoring support for SCSS&quot;&gt;mrmlnc.vscode-scss&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-mssql.mssql&quot; target=&quot;_blank&quot; title=&quot;Develop Microsoft SQL Server, Azure SQL Database and SQL Data Warehouse everywhere&quot;&gt;ms-mssql.mssql&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp&quot; target=&quot;_blank&quot; title=&quot;C# for Visual Studio Code (powered by OmniSharp).&quot;&gt;ms-vscode.csharp&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.typescript-javascript-grammar&quot; target=&quot;_blank&quot; title=&quot;This is development branch of VSCode JS/TS colorization. &quot;&gt;ms-vscode.typescript-javascript-grammar&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin&quot; target=&quot;_blank&quot; title=&quot;TSLint support for Visual Studio Code&quot;&gt;ms-vscode.vscode-typescript-tslint-plugin&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome&quot; target=&quot;_blank&quot; title=&quot;Debug your JavaScript code in the Chrome browser, or any other target that supports the Chrome Debugger protocol.&quot;&gt;msjsdiag.debugger-for-chrome&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=naumovs.color-highlight&quot; target=&quot;_blank&quot; title=&quot;Highlight web colors in your editor&quot;&gt;naumovs.color-highlight&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=pmneo.tsimporter&quot; target=&quot;_blank&quot; title=&quot;Automatically searches for TypeScript definitions in workspace files and provides all known symbols as completion item to allow code completion.&quot;&gt;pmneo.tsimporter&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=rbbit.typescript-hero&quot; target=&quot;_blank&quot; title=&quot;Additional toolings for typescript&quot;&gt;rbbit.typescript-hero&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=robinbentley.sass-indented&quot; target=&quot;_blank&quot; title=&quot;Indented Sass syntax highlighting, autocomplete &amp; snippets&quot;&gt;robinbentley.sass-indented&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;withinstall&quot;&gt;code --install-extension &lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight&quot; target=&quot;_blank&quot; title=&quot;highlight TODOs, FIXMEs, and any keywords, annotations&quot;&gt;wayou.vscode-todo-highlight&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;style&gt;.withinstall { display:none; }&lt;/style&gt;In order to install them, use &lt;span title=&quot;click to show&quot; href=&quot;#&quot; onclick=&quot;$(&#39;.withinstall&#39;).toggle();&quot; style=&quot;cursor:pointer;font-weight:bold&quot;&gt;code --install-extension [extension name]&lt;/span&gt; for each line.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Visual Studio&lt;/h2&gt;&lt;br /&gt;For Visual Studio, funny enough, in order to export and import your extensions you need to use an extension: &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MadsKristensen.ExtensionManager&quot; target=&quot;_blank&quot; title=&quot;Import/export extensions as well as associate extensions with individual solutions&quot;&gt;Extension Manager 2017&lt;/a&gt;, which on my system exports a file in .vsext format: &lt;pre&gt;{&lt;br /&gt;  &quot;id&quot;: &quot;5f191824-b8a6-47c0-9f96-f607dfd3c09b&quot;,&lt;br /&gt;  &quot;name&quot;: &quot;My Visual Studio extensions&quot;,&lt;br /&gt;  &quot;description&quot;: &quot;A collection of my Visual Studio extensions&quot;,&lt;br /&gt;  &quot;version&quot;: &quot;1.0&quot;,&lt;br /&gt;  &quot;extensions&quot;: [&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ConnieYau.NETPortabilityAnalyzer&quot; target=&quot;_blank&quot; title=&quot;Evaluates portability of assemblies across .NET platforms&quot;&gt;.NET Portability Analyzer&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;55d15546-28ca-40dc-af23-dfa503e9c5fe&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://www.advancedinstaller.com/visual-studio-extension.html&quot; target=&quot;_blank&quot; title=&quot;Set up your complete development environment using the Advanced Installer extension for Visual Studio&quot;&gt;Advanced Installer for Visual Studio 2017&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;Caphyon.AdvancedInstaller.23debb5a-cff4-4b91-88bf-6280f72a7ebb&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ADLTools.AzureDataLakeandStreamAnalyticsTools&quot; target=&quot;_blank&quot; title=&quot;An integrated development environment for Azure Data Lake and Stream Analytics application development.&quot;&gt;Azure Data Lake and Stream Analytics Tools&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;1e906ff5-9da8-4091-a299-5c253c55fdc9&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=VisualStudioWebandAzureTools.AzureFunctionsandWebJobsTools&quot; target=&quot;_blank&quot; title=&quot;Tools for creating and publishing Azure Functions and Web Jobs&quot;&gt;Azure Functions and Web Jobs Tools&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;Microsoft.VisualStudio.Web.AzureFunctions&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=stefankert.BuildVision&quot; target=&quot;_blank&quot; title=&quot;Building process visualization.&quot;&gt;BuildVision&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;837c3c3b-8382-4839-9c9a-807b758a929f&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=denis-prodan.clean-code-net&quot; target=&quot;_blank&quot; title=&quot;Clean Code .NET - set of Roslyn analyzers aimed to improve code correctness Not affiliated with Bob Martin&quot;&gt;Clean Code .NET&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;CleanCode.NET.9ecfa9bb-0775-48d0-9898-4dbbbd529fe3&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-azuretools.CloudExplorerForVS&quot; target=&quot;_blank&quot; title=&quot;View your cloud resources, inspect their properties, and perform key developer actions from within Visual Studio.&quot;&gt;Cloud Explorer for VS 2017&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;Microsoft.VisualStudio.CloudExplorer&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=GiovanniBassi-MVP.CodeCrackerforC&quot; target=&quot;_blank&quot; title=&quot;An analyzer library for C# that uses Roslyn to produce refactorings, code analysis, and other niceties. Check the official project site on code-cracker.github.io.&quot;&gt;Code Cracker for C#&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;CodeCracker.Vsix..5b99e64c-1418-4a06-990c-fd4cf01f4f63&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=YaobinOuyang.CodeAtlas&quot; target=&quot;_blank&quot; title=&quot;Visualize call graph, inheritance graph and variable usage graph for C/C++, C#, Python and other languages.&quot;&gt;Code Graph&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;CodeAtlasVSIX.Company.df5456fb-08ea-4256-b5ff-ecdb3a512ad3&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;http://www.codemaid.net/&quot; target=&quot;_blank&quot; title=&quot;An open source Visual Studio extension to cleanup and simplify C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding.&quot;&gt;CodeMaid&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;4c82e17d-927e-42d2-8460-b473ac7df316&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=mreu.CommentCop&quot; target=&quot;_blank&quot; title=&quot;Analyzes (mostly) xml comments and provides code fixes. Uses Roslyn C# code analyser.&quot;&gt;CommentCop&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;CommentCop..0521EE68-1A5D-4C78-9970-B6A46B03FA6D&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=SimonHughes.EntityFrameworkReversePOCOGenerator&quot; target=&quot;_blank&quot; title=&quot;Reverse engineers an existing database and generates EntityFramework Code First POCO classes, Configuration mappings and DbContext.&quot;&gt;EntityFramework Reverse POCO Generator&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;EntityFramework_Reverse_POCO_Generator..d542a934-8bd6-4136-b490-5f0049d62033&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MadsKristensen.ExtensionManager&quot; target=&quot;_blank&quot; title=&quot;Import/export extensions as well as associate extensions with individual solutions&quot;&gt;Extension Manager 2017&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;e83d71b8-8bfc-4e06-b145-b0388910c016&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.FixMixedTabs&quot; target=&quot;_blank&quot; title=&quot;Detects when you have mixed tabs and spaces and offers to fix them for you automatically.&quot;&gt;Fix Mixed Tabs&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;FixMixedTabs.9f1d3050-b986-4b10-ae36-97c6efc5e968&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=vs-publisher-599079.FixNamespace&quot; target=&quot;_blank&quot; title=&quot;Fixes the namespace of the .cs file based on the Project default namespace and its folder position relative to project.&quot;&gt;Fix Namespace&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;f073da8c-bb52-41f8-b95a-a6346b1a0b52&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=EF8980CD-E5F2-4113-92AE-5789026D677C.MetricsAnalyzer&quot; target=&quot;_blank&quot; title=&quot;Code metrics analyzers.&quot;&gt;MetricsAnalyzer&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;MetricsAnalyzer..8026235d-7afc-401b-8f45-ba8624a07ef5&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.MicrosoftCodeAnalysis2017&quot; target=&quot;_blank&quot; title=&quot;Live code analysis rules and code fixes addressing API design, performance, security, and best practices for C# and Visual Basic.&quot;&gt;Microsoft Code Analysis 2017&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;4db2d63d-3320-4fbd-bf80-07f8d1500bd3&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=AndreyLipatkin.moqanalyzers&quot; target=&quot;_blank&quot; title=&quot;Visual Studio extension that helps to write unit tests using Moq mocking library by highlighting typical errors and suggesting quick fixes. Port of Resharper extension to Roslyn.&quot;&gt;Moq.Analyzers&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;Moq.Analyzers..c3c7e3f8-2407-428d-beef-c4557253517b&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=OmarElabd.ObjectExporter&quot; target=&quot;_blank&quot; title=&quot;creates serializations of in memory objects from your various debugging windows. Currently supported output formats are: CSharp Object Initialization Code, JSON and XML.&quot;&gt;Object Exporter&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;07fb5b16-f4be-4488-9a19-b4f36d2c05a6&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=NikolayBalakin.Outputenhancer&quot; target=&quot;_blank&quot; title=&quot;Extension to add colors to Visual Studio output window.&quot;&gt;Output enhancer&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;VSOutputEnhancer.Nikolay Balakin.a06be4c3-f97e-425c-8a0d-bdef08ac2abb&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.PowerCommandsforVisualStudio&quot; target=&quot;_blank&quot; title=&quot;PowerCommands is a set of useful extensions for the Visual Studio IDE.&quot;&gt;Power Commands for Visual Studio&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;PowerCommands.3ecdd89b-f985-483d-8c94-be37de4dc083&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=SchabseSLaks.Ref12&quot; target=&quot;_blank&quot; title=&quot;Forwards F12 to ReferenceSource.Microsoft.com instead of showing metadata.&quot;&gt;Ref12&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;SLaks-Ref12-086C4CE4-7061-4B1F-BC77-B64E4ED71B8E&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MykolaTarasyuk.ReferenceConflictsAnalyser&quot; target=&quot;_blank&quot; title=&quot;A tool for analysis of the &#39;Could not load file or assembly or one of its dependencies&#39; problem and issues related to conflicts of referenced assemblies.&quot;&gt;Reference Conflicts Analyser&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;ff477521-e67b-4ca3-931f-3edf36125d28&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=AndreasAndersen.RegularExpressionTesterExtension&quot; target=&quot;_blank&quot; title=&quot;Parses regular expressions from your code, so you can modify and test them and insert the updated versions. &quot;&gt;Regular Expression Tester Extension&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;a65d58d2-ead8-4eea-a47d-fa60865a6043&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=battas.ResolveUR-ResolveUnusedReferences&quot; target=&quot;_blank&quot; title=&quot;Resolve unused references including nuget references in Visual Studio 2012/2013/2015 projects via menu item at solution and project nodes Solution Explorer Tool Window.&quot;&gt;ResolveUR - Resolve Unused References&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;637ba02c-3388-4e54-9051-3eea7c51b054&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=PhilippeArteau.RoslynSecurityGuard&quot; target=&quot;_blank&quot; title=&quot;Roslyn analyzers that aim to help security audit on .NET applications.&quot;&gt;Roslyn Security Guard&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;RoslynSecurityGuard..45fa56c2-16f1-4395-8c10-a5a460084018&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=josefpihrt.Roslynator2017&quot; target=&quot;_blank&quot; title=&quot;A collection of 500+ analyzers, refactorings and fixes for C#, powered by Roslyn.&quot;&gt;Roslynator 2017&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;9289a8ab-1bb6-496b-9992-9f7ea27f66a8&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=JaroslavLobacevski.SecurityCodeScanVS2017&quot; target=&quot;_blank&quot; title=&quot;Security static code analyzer for .NET&quot;&gt;Security Code Scan (for VS2017 and newer)&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;955196A7-ACBF-4F6B-820B-51B8507CE853&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.SolutionErrorVisualizer&quot; target=&quot;_blank&quot; title=&quot;Highlights errors and warnings in the Solution Explorer. Also allows Solution Explorer to be filtered by error type.&quot;&gt;Solution Error Visualizer&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;SolutionErrorVisualizer.a392f96b-6b33-4b53-b4bb-3376a05f986c&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=SonarSource.SonarLintforVisualStudio2017&quot; target=&quot;_blank&quot; title=&quot;Roslyn based static code analysis: Find and instantly fix nasty bugs and code smells in C#, VB.Net, C, C++ and JS.&quot;&gt;SonarLint for Visual Studio 2017&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;SonarLint.36871a7b-4853-481f-bb52-1835a874e81b&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=vs-publisher-306627.RedgateSQLSearch&quot; target=&quot;_blank&quot; title=&quot;Speed up SQL Server database development by finding SQL objects fast in Visual Studio.&quot;&gt;SQL Search&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;Redgate.SQLSearch.VSExtension.9BD7AEDA-C291-4702-8191-4189B099F3A9&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=PavelSamokha.TargetFrameworkMigrator&quot; target=&quot;_blank&quot; title=&quot;Change all your .Net projects Target Framework at once&quot;&gt;Target Framework Migrator&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;TargetFrameworkMigrator..4f7666b9-e62c-46a1-af25-21ab8742ef00&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MadsKristensen.TrailingWhitespaceVisualizer&quot; target=&quot;_blank&quot; title=&quot;Keeps your code files clean by making it easier than ever to identify and remove any trailing whitespace&quot;&gt;Trailing Whitespace Visualizer&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;4c1a78e6-e7b8-4aa9-8812-4836e051ff6d&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=RandomEngy.UnitTestBoilerplateGenerator&quot; target=&quot;_blank&quot; title=&quot;Generates a unit test boilerplate from a given C# class, setting up mocks for all dependencies. &quot;&gt;Unit Test Boilerplate Generator&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;UnitTestBoilerplate.RandomEngy.ca0bb824-eb5a-41a8-ab39-3b81f03ba3fe&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://visualstudio.microsoft.com/services/intellicode/&quot; target=&quot;_blank&quot; title=&quot;IntelliCode saves you time by putting what you’re most likely to use at the top of your completion list. IntelliCode recommendations are based on thousands of open source projects on GitHub each with over 100 stars. When combined with the context of your code, the completion list is tailored to promote common practices.&quot;&gt;Visual Studio IntelliCode&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;IntelliCode.VSIX.598224b2-b987-401b-8509-f568d0c0b946&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=EWoodruff.VisualStudioSpellCheckerVS2017andLater&quot; target=&quot;_blank&quot; title=&quot;An editor extension that checks the spelling of comments, strings, and plain text as you type or interactively with a tool window. It can also spell check an entire solution, project, or selected items.&quot;&gt;Visual Studio Spell Checker (VS2017 and Later)&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;43EA967E-0DE2-4136-8E52-C6DCFB5C2748&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;name&quot;: &quot;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=RobMensching.WixToolsetVisualStudio2017Extension&quot; target=&quot;_blank&quot; title=&quot;Visual Studio integration for the WiX Toolset - the most powerful set of tools available to create your Windows installation experience.&quot;&gt;Wix Toolset Visual Studio 2017 Extension&lt;/a&gt;&quot;,&lt;br /&gt;      &quot;vsixId&quot;: &quot;WixToolset.VisualStudioExtension.Dev15&quot;&lt;br /&gt;    }&lt;br /&gt;  ]&lt;br /&gt;}&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/3469923958850581827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=3469923958850581827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3469923958850581827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3469923958850581827'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/visual-studio-and-visual-studio-code.html' title='Visual Studio and Visual Studio Code extensions'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-5426610976146028714</id><published>2019-06-23T01:17:00.001+03:00</published><updated>2019-06-23T01:18:33.455+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Blinding Knife (Lightbringer #2), by Brent Weeks</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-pGn3ZZxT7gk/XQ6mygQIvbI/AAAAAAAAD7M/P2mRELx-HNUHjvOdl07-223v9uzFSZerwCLcBGAs/s320/TheBlindingKnife.jpg&quot; width=&quot;207&quot; height=&quot;320&quot; data-original-width=&quot;308&quot; data-original-height=&quot;475&quot; style=&quot;float:left&quot; alt=&quot;book cover&quot; /&gt;  &lt;a href=&quot;https://www.goodreads.com/book/show/12499290-the-blinding-knife&quot; target=&quot;_blank&quot; title=&quot;He’d thought he had five years left—now he has less than one. With fifty thousand refugees, a bastard son, and an ex-fiancée who may have learned his darkest secret, Gavin has problems on every side. All magic in the world is running wild and threatens to destroy the Seven Satrapies.&quot;&gt;The Blinding Knife&lt;/a&gt; continues the story of Kip the bastard, Gavin/Dazen Guile the genius god-like Prism and just about every other person alive a mere mortal. It is just as entertaining as the first book, although more focused on action than lore. A lot of new concepts are explored here, like colors that are not on the spectrum but can be drafted, other gods, other chromatic skills, but, as fantasy focused on little boys taught us, always unexplained, mysterious, too young to understand, people dying before they can finish their sentence, etc. I hate that clich&amp;eacute; and I really hope people would stop using it so much. I am talking to you, &lt;a href=&quot;http://www.brentweeks.com/writing/the-blinding-knife/&quot; target=&quot;_blank&quot; title=&quot;an American fantasy writer. He made The New York Times Best Seller list with The Blinding Knife in its first month, September 2012. Weeks was born in Montana on March 7, 1977, and graduated from Hillsdale College with a degree in English. He briefly worked as a teacher and bartender before moving to writing full-time.&quot;&gt;Brent Weeks&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Anyway, I can&#39;t say anything more about the story or the style or the author than I did when I read &lt;a href=&quot;https://siderite.blogspot.com/2019/06/the-black-prism-lightbringer-1-by-brent.html&quot; target=&quot;_blank&quot; title=&quot;The Black Prism (Lightbringer #1), by Brent Weeks&quot;&gt;the first book&lt;/a&gt; in the &lt;a href=&quot;https://www.goodreads.com/series/49673-lightbringer&quot; target=&quot;_blank&quot; title=&quot;Five books so far&quot;&gt;Lightbringer&lt;/a&gt; series. It&#39;s a continuous story, split in book sized volumes. I will start reading the next book in the saga momentarily. I recommend the writing style and I like the attention to detail and the lore, although after a while the boy genius recipe feels more and more like a Japanese manga and less than a real story.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/5426610976146028714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=5426610976146028714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5426610976146028714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/5426610976146028714'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/the-blinding-knife-lightbringer-2-by.html' title='The Blinding Knife (Lightbringer #2), by Brent Weeks'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-pGn3ZZxT7gk/XQ6mygQIvbI/AAAAAAAAD7M/P2mRELx-HNUHjvOdl07-223v9uzFSZerwCLcBGAs/s72-c/TheBlindingKnife.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-8703476046077183124</id><published>2019-06-20T11:58:00.002+03:00</published><updated>2019-06-20T11:58:54.270+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Serializing FileInfo or DirectoryInfo with Newtonsoft Json in .NET Core</title><content type='html'>&lt;h2&gt;The Problem&lt;/h2&gt;&lt;br /&gt;  Phew, that&#39;s a mouthful. But the issue is that trying to serialize a FileInfo or a DirectoryInfo object with Newtonsoft&#39;s Json library in .NET Core fails with a vague exception: &lt;pre&gt;Newtonsoft.Json.JsonSerializationException: Unable to serialize instance of &#39;System.IO.DirectoryInfo&#39;.&lt;br /&gt;   at Newtonsoft.Json.Serialization.DefaultContractResolver.ThrowUnableToSerializeError(Object o, StreamingContext context)&lt;br /&gt;   at Newtonsoft.Json.Serialization.JsonContract.InvokeOnSerializing(Object o, StreamingContext context)&lt;br /&gt;   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.OnSerializing(JsonWriter writer, JsonContract contract, Object value)&lt;br /&gt;   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)&lt;br /&gt;   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)&lt;/pre&gt;&lt;br /&gt;  It doesn&#39;t say why it fails, just that a method called ThrowUnableToSerializeError threw um... an unable to serialize error? &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Cause&lt;/h2&gt;&lt;br /&gt;Looking at &lt;a href=&quot;https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs#L424&quot; target=&quot;_blank&quot; title=&quot;DefaultContractResolve&quot;&gt;the Newtonsoft code&lt;/a&gt;, we eventually get to this piece of code: &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;// serializing DirectoryInfo without ISerializable will stackoverflow&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;// https://github.com/JamesNK/Newtonsoft.Json/issues/1541&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&lt;br /&gt;if&lt;/span&gt; (Array.IndexOf(BlacklistedTypeNames, objectType.FullName) != -1)&lt;br /&gt;{&lt;br /&gt;    contract.OnSerializingCallbacks.Add(ThrowUnableToSerializeError);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;  Later, another piece of code will execute the serializing callbacks and throw the exception. We can get rid of this functionality, by using a custom contract resolver, like this: &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; settings = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; JsonSerializerSettings&lt;br /&gt;{&lt;br /&gt;    ContractResolver = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; FileInfoContractResolver()&lt;br /&gt;};&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; FileInfoContractResolver : DefaultContractResolver&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;override&lt;/span&gt; JsonContract CreateContract(Type objectType)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; result = &lt;span class=&quot;kwrd&quot;&gt;base&lt;/span&gt;.CreateContract(objectType);&lt;br /&gt;        if (&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(FileSystemInfo).IsAssignableFrom(objectType))&lt;br /&gt;        {&lt;br /&gt;            result.OnSerializingCallbacks.Clear();&lt;br /&gt;        }&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; Yet now, when trying to serialize, we get the stack overflow exception described in &lt;a href=&quot;https://github.com/JamesNK/Newtonsoft.Json/issues/1541&quot; target=&quot;_blank&quot; title=&quot;StackOverflowException when serializing DirectoryInfo object on dotnet core 2 #1541&quot;&gt;the original Newtonsoft.Json issue&lt;/a&gt;. It stems from the difference between the &lt;a href=&quot;https://referencesource.microsoft.com/#mscorlib/system/io/filesysteminfo.cs&quot; target=&quot;_blank&quot; title=&quot;It&#39;s fun how they serialize internal fields...&quot;&gt;.NET Framework implementation&lt;/a&gt; and the &lt;a href=&quot;https://source.dot.net/#System.IO.FileSystem/System/IO/FileSystemInfo.cs&quot; target=&quot;_blank&quot; title=&quot;verboten!&quot;&gt;.NET Core implementation&lt;/a&gt; of ISerializable in FileSystemInfo, which in Core just throws PlatformNotSupportedException. It&#39;s still not clear why it goes to a StackOverflowException, probably some conflict with Newtonsoft code, but it&#39;s clear Microsoft does not intend to make these classes serializable. If you think about it, those classes suck for so many reasons!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Solution&lt;/h2&gt;&lt;br /&gt; So, in order to solve it, we will use a custom JSON converter:&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; FileSystemInfoConverter:JsonConverter&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;bool&lt;/span&gt; CanConvert(Type objectType)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(FileSystemInfo).IsAssignableFrom(objectType);&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;override&lt;/span&gt; object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)&lt;br /&gt;    {&lt;br /&gt;        if (reader.TokenType == JsonToken.Null)&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; null;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; jObject = JObject.Load(reader);&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; fullPath = jObject[&lt;span class=&quot;str&quot;&gt;&quot;FullPath&quot;&lt;/span&gt;].Value&amp;lt;&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; Activator.CreateInstance(objectType, fullPath);&lt;br /&gt;    }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; WriteJson(JsonWriter writer, object &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;, JsonSerializer serializer)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; info = &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; FileSystemInfo;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; obj = info == null&lt;br /&gt;            ? null&lt;br /&gt;            : &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                FullPath = info.FullName&lt;br /&gt;            };&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; token = JToken.FromObject(obj);&lt;br /&gt;        token.WriteTo(writer);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;And we use it like this: &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; settings = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; JsonSerializerSettings&lt;br /&gt;{&lt;br /&gt;    Converters = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; List&amp;lt;JsonConverter&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; FileSystemInfoConverter()&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; json = JsonConvert.SerializeObject(dir, settings);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; info = JsonConvert.DeserializeObject&amp;lt;DirectoryInfo&amp;gt;(json, settings);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Why FileInfo and DirectoryInfo suck&lt;/h2&gt;&lt;br /&gt;The answer of a senior developer to any question should be &quot;Why?&quot; or &quot;Why on Earth or anywhere in the Solar System would you want to do a dumb thing like that?!?!&quot;. Why would you want to serialize a directory or file info object? The answer is that you should not. The info objects are defined by only one thing: a path, but they have so much baggage: properties that access the file system, unsafe methods, no interfaces or factory methods that can allow them to be mocked in unit tests. They might look like data objects, but they are not!&lt;br /&gt;&lt;br /&gt;Imagine a scenario where you have a list of all the files in your drive. You enumerated them all and now you want to serialize them. Should the serializer save Exists or Length, for example? Because that means it will access the file system for each of them in the process of serialization, leading to a lot of work, propensity to access errors and so on.&lt;br /&gt;&lt;br /&gt;Best practices say you should either use some model classes to move around data, like an empty FileSystemInfoModel with Type and FullPath and maybe Attributes or Size properties or whatever you want to save, but that you set yourself as a separate responsibility. And if you want to use the functionality of the Info classes, use &lt;a href=&quot;https://github.com/System-IO-Abstractions/System.IO.Abstractions&quot; target=&quot;_blank&quot; title=&quot;Just like System.Web.Abstractions, but for System.IO. Yay for testable IO access!&quot;&gt;System.IO.Abstractions&lt;/a&gt; or the new Core &lt;a href=&quot;https://docs.microsoft.com/en-us/aspnet/core/fundamentals/file-providers&quot; target=&quot;_blank&quot; title=&quot;ASP.NET Core abstracts file system access through the use of File Providers. File Providers are used throughout the ASP.NET Core framework&quot;&gt;IFileProvider&lt;/a&gt; abstraction to get implementations of interfaces that you can mock in unit tests.&lt;br /&gt;&lt;br /&gt;Tell me what you think.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/8703476046077183124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=8703476046077183124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8703476046077183124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8703476046077183124'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/serializing-fileinfo-or-directoryinfo.html' title='Serializing FileInfo or DirectoryInfo with Newtonsoft Json in .NET Core'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-235725593647109982</id><published>2019-06-17T12:21:00.000+03:00</published><updated>2019-06-17T12:21:03.652+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Crown Tower (The Riyria Chronicles #1), by Michael J. Sullivan </title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-9xw2qYV7w6Y/XQdYegXD54I/AAAAAAAAD60/EMhu4LKu-kQmrtxV-JX_7MLiiuxlYrEEgCLcBGAs/s320/TheCrownTower.jpg&quot; width=&quot;209&quot; height=&quot;320&quot; data-original-width=&quot;310&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt;  It seems there is a dedicated fan base for the &lt;a href=&quot;https://www.goodreads.com/series/175806-the-riyria-chronicles&quot; target=&quot;_blank&quot; title=&quot;Bromance and prostitutes&quot;&gt;Riyria series&lt;/a&gt; that so enjoy the setup that they ignore the quality (or lack thereof) of the writing. The writing style is amateurish at best, the characters are not fleshed out, yet the little building they get is contradicted with impunity whenever the plot requires it, the point of the story of the book has not been revealed after more than half of it, while the plot doesn&#39;t make any sense most of the time.&lt;br /&gt;&lt;br /&gt;  I am sorry, &lt;a href=&quot;http://riyria.blogspot.com/&quot; target=&quot;_blank&quot; title=&quot; an American writer of epic fantasy and science fiction, best known for his debut series The Riyria Revelations, which has been translated into fourteen languages. In 2012 io9 named him one of the &#39;Most Successful Self-Published Sci-Fi and Fantasy Authors&#39;. His books have been translated into French, German, Spanish, Czech, Dutch, Polish, Hungarian, Japanese, Bulgarian, Russian, Portuguese, and Turkish.&quot;&gt;Michael J. Sullivan&lt;/a&gt;, but I could only read 60% of &lt;a href=&quot;https://www.goodreads.com/book/show/16043804-the-crown-tower&quot; target=&quot;_blank&quot; title=&quot;Not to mention the crown tower is just a tower that they scale a few times without any incident&quot;&gt;The Crown Tower&lt;/a&gt; before deciding I will not continue and I will not try any of the other books in the series. For the readers, imagine a story about implausibly competent youngsters that are forced to work together by a kindly old professor for no good reason other than they have to work together. Imagine a prostitute who decides to fight the world and open her own brothel, right across the street from her former pimp and king of the street, but the only concerns she has is how to bribe city officials to give her a business permit. After half of the book in which the characters have barely begun to do any of the activities listed above, nothing really happened, while hints have been placed to imply this is a world where magic exists, goblins, elves, dwarves, gods, yet none of them made an appearance.&lt;br /&gt;&lt;br /&gt;  I don&#39;t understand how stuff like that gets any awards. Is it just because they sell? Toilet paper sells and doesn&#39;t win anything! Just... ugh!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/235725593647109982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=235725593647109982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/235725593647109982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/235725593647109982'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/the-crown-tower-riyria-chronicles-1-by.html' title='The Crown Tower (The Riyria Chronicles #1), by Michael J. Sullivan '/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-9xw2qYV7w6Y/XQdYegXD54I/AAAAAAAAD60/EMhu4LKu-kQmrtxV-JX_7MLiiuxlYrEEgCLcBGAs/s72-c/TheCrownTower.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-3522960546352294330</id><published>2019-06-16T11:28:00.001+03:00</published><updated>2019-06-16T11:28:35.658+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Fear Factor: How One Emotion Connects Altruists, Psychopaths, and Everyone In-Between, by Abigail Marsh</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-MVs5Y4ypQ0A/XQX3avnM1QI/AAAAAAAAD6o/ps8yr9cYqEEZsOdYkonfocSDYAQpvb0eQCLcBGAs/s320/TheFearFactor.jpg&quot; width=&quot;206&quot; height=&quot;320&quot; data-original-width=&quot;258&quot; data-original-height=&quot;400&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt;  You remember when you had to write a paper for college and you had the thing that you wanted to say, but then your coordinator told you to make it a chapter, and then add others that are related for context? This book kind of feels like that. In English it is called &lt;a href=&quot;https://www.goodreads.com/book/show/35142874-the-fear-factor&quot; target=&quot;_blank&quot; title=&quot;How the brains of psychopaths and heroes show that humans are wired to be good&quot;&gt;The Fear Factor&lt;/a&gt;, but the Romanian edition calls it &quot;&lt;a href=&quot;https://www.goodreads.com/book/show/41011954-altruist-sau-bun-pe-gratis&quot; target=&quot;_blank&quot; title=&quot;Altruist sau bun pe gratis&quot;&gt;Altruist or being good without reward&lt;/a&gt;&quot; (my direct translation, as Good for Nothing didn&#39;t feel right, even if it is the title of the book in the UK), showing that even editors didn&#39;t really agree with the author on the right way to label it.&lt;br /&gt;&lt;br /&gt;  Overall, what &lt;a href=&quot;http://www.abigailmarsh.com/&quot; target=&quot;_blank&quot; title=&quot;The author&#39;s web site: The Laboratory on Social and Affective Neuroscience&quot;&gt;Abigal Marsh&lt;/a&gt; tries to say is simple: our capacity to do good to others without expecting a reward stems from an ancient mammalian mechanism designed to bond mothers to children and it is triggered by our ability to empathize with the fear other feel, while regulated by a network of brain centers, mainly our amygdala and hippocampus using the oxytocin hormone. This takes the book through eight chapters, each kind of separate and which I liked in different measures. The ones describing carefully crafted experiments and their outcomes I liked best, the ones that felt like fillers or the ones affirming that correlation doesn&#39;t imply causation then proceeding in describing a lot of correlation less so.&lt;br /&gt;&lt;br /&gt;  Marsh goes out of her way to portray a positive image of humanity, where most people are generous, empathetic and altruistic. She describes people who aren&#39;t capable of it - psychopaths and their amygdala dysfunction, people on the other side of the curve - superaltruists who don&#39;t care to whom they do good, they just do it, goes to very interesting experiments and comes with theories about how and why altruism, fear and empathy work. Her conclusion is that our focus on negative things makes us falsely believe things are getting worse, people less trustworthy, when the actual opposite if overwhelmingly true.&lt;br /&gt;&lt;br /&gt;  Bottom line: I liked the book, but some of the chapters felt forced. I didn&#39;t really need the exposition of her beach trip to save the turtles or how much she feared and then appreciated the help of a random guy who looked like a hood thug. Most of the information interesting to me was concentrated in the first chapters, while the last, explaining what to do to become more altruistic and how that improves our well being and filled with international statistical charts on altruism I could have done without entirely. It&#39;s not that it wasn&#39;t correct or well written, it just felt like an add on that had little to do with the book or, worse, was there just to fill up space.&lt;br /&gt;&lt;br /&gt;  If you search on TED Talks, you will see the author have a talk there titled &lt;a href=&quot;https://www.ted.com/talks/abigail_marsh_why_some_people_are_more_altruistic_than_others&quot; target=&quot;_blank&quot; title=&quot;Why do some people do selfless things, helping other people even at risk to their own well-being? Psychology researcher Abigail Marsh studies the motivations of people who do extremely altruistic acts, like donating a kidney to a complete stranger. Are their brains just different?&quot;&gt;Abigail Marsh: Why some people are more altruistic than others&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/3522960546352294330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=3522960546352294330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3522960546352294330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3522960546352294330'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/the-fear-factor-how-one-emotion.html' title='The Fear Factor: How One Emotion Connects Altruists, Psychopaths, and Everyone In-Between, by Abigail Marsh'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-MVs5Y4ypQ0A/XQX3avnM1QI/AAAAAAAAD6o/ps8yr9cYqEEZsOdYkonfocSDYAQpvb0eQCLcBGAs/s72-c/TheFearFactor.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-8418796049644220039</id><published>2019-06-14T17:03:00.001+03:00</published><updated>2019-06-14T21:09:25.814+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>How to timeout a task AND make sure it ends</title><content type='html'>  This post starts from a simple question: how do I start a task with timeout? You go to StackOverflow, of course, and find this answer: &lt;a href=&quot;https://stackoverflow.com/a/11191070/4572240&quot; target=&quot;_blank&quot; title=&quot;Look at the expanded solution&quot;&gt;Asynchronously wait for Task&amp;lt;T&amp;gt; to complete with timeout&lt;/a&gt;. It&#39;s an elegant solution, mainly to also start a &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.delay&quot; target=&quot;_blank&quot; title=&quot;Creates a task that will complete after a time delay.&quot;&gt;Task.Delay&lt;/a&gt; and continue when either task completes. However, in order to cancel the initial operation, one needs to pass the cancellation token to the original task and &lt;b&gt;manually handle it&lt;/b&gt;, meaning polluting the entire business code with cancellation logic. This might be OK, yet are there alternatives?&lt;br /&gt;&lt;br /&gt;But, isn&#39;t there the &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.run#System_Threading_Tasks_Task_Run_System_Action_System_Threading_CancellationToken_&quot; target=&quot;_blank&quot; title=&quot;Queues the specified work to run on the thread pool and returns a Task object that represents that work. A cancellation token allows the work to be cancelled.&quot;&gt;Task.Run(action)&lt;/a&gt; method that also accepts a CancellationToken? Yes, there is, and if you thought this runs an action until you cancel it, think again. Here is what Task.Run says it does: &quot;Queues the specified work to run on the thread pool and returns a Task object that represents that work. A cancellation token allows the work to be cancelled.&quot; and if you scroll down to Remarks, here is what it actually does: &quot;If cancellation is requested before the task begins execution, the task does not execute. Instead it is set to the Canceled state and throws a TaskCanceledException exception&quot;. You read that right: the token is only taken into account when the task starts running, not while it is actually executing.&lt;br /&gt;&lt;br /&gt;Surely, then, there must be a way to cancel a running Task. How about &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.dispose&quot; target=&quot;_blank&quot; title=&quot;Releases all resources used by the current instance of the Task class&quot;&gt;Task.Dispose()&lt;/a&gt;? Dispose throws a funny exception if you try it: &quot;System.InvalidOperationException: &#39;&lt;i&gt;A task may only be disposed if it is in a completion state (RanToCompletion, Faulted or Canceled).&lt;/i&gt;&#39;&quot;. In normal speech, it means &quot;Fuck you!&quot;. If you think about it, how would you abort a task execution? What if it does nasty things, leaves resources occupied, has to clean up after it? The .NET team took the safe path and refused to give you an out of the box unsafe cancelling mechanism.&lt;br /&gt;&lt;br /&gt;So, what is the solution? The recommended one is that you pass the token to all methods that can be cancelled and then check inside if cancellation was requested. Of course this only works if&lt;ol&gt;&lt;li&gt;you control what the task does&lt;/li&gt;&lt;li&gt;you can split the operation into small chunks that are either executed sequentially or in a loop so you interrupt their flow&lt;/li&gt;&lt;/ol&gt;. If you have something like an external process that is being executed, or a long running operation, you are almost out of luck. Why almost? Well, CancellationSource or CancellationToken do not have events, but the token exposes a &quot;wait handle&quot; that you can wait for synchronously. And here it gets funky. Check out an example of a method that executes some long running action and can react to token cancelling:&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// Executes the long running action and cancels it when needed&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;token&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; LongRunningAction(CancellationToken token)&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// instantiate a container and keep its reference&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; container = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; IdentificationContainer();&lt;br /&gt;    Task.Run(() =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// wait until the token gets cancelled on another thread&lt;/span&gt;&lt;br /&gt;        token.WaitHandle.WaitOne();&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// this will use the information in the container to kill the action&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// (presumably by interrupting external processes or sending some kill signal)&lt;/span&gt;&lt;br /&gt;        KillLongRunningAction();&lt;br /&gt;    });&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// this executes the action and populates the identification container if needed&lt;/span&gt;&lt;br /&gt;    RunLongRunningAction();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;This introduces some other issues, like what happens to the monitoring task if you never cancel the token or dispose of the cancellation source, but that&#39;s a bit too deep.&lt;br /&gt;&lt;br /&gt;In the code above we get a sort of a solution if we can control the code and we can actually cancel things gracefully inside of it. But what if I can&#39;t (or won&#39;t)? Can I get something that does what I wanted Task.Run to do: execute something and, when I cancel it, stop it from executing? &lt;br /&gt;&lt;br /&gt;And the answer, using what we learned above, is yes, but as explained at the beginning, it may have effects like resource leaks. Here it is:&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// Run an action and kill it when canceling the token&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;action&quot;&amp;gt;The action to execute&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;token&quot;&amp;gt;The token&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;/// &amp;lt;param name=&quot;waitForGracefulTermination&quot;&amp;gt;If set, the task will be killed with delay so as to allow the action to end gracefully&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; Task RunCancellable(Action action, CancellationToken token, TimeSpan? waitForGracefulTermination=null)&lt;br /&gt;{&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// we need a thread, because Tasks cannot be forcefully stopped&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; thread = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Thread(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ThreadStart(action));&lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// we hold the reference to the task so we can check its state&lt;/span&gt;&lt;br /&gt;    Task task = null;&lt;br /&gt;    task = Task.Run(() =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// task monitoring the token&lt;/span&gt;&lt;br /&gt;        Task.Run(() =&amp;gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span class=&quot;rem&quot;&gt;// wait for the token to be canceled&lt;/span&gt;&lt;br /&gt;            token.WaitHandle.WaitOne();&lt;br /&gt;            &lt;span class=&quot;rem&quot;&gt;// if we wanted graceful termination we wait&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;rem&quot;&gt;// in this case, action needs to know about the token as well and handle the cancellation itself&lt;/span&gt;&lt;br /&gt;            if (waitForGracefulTermination != null)&lt;br /&gt;            {&lt;br /&gt;                Thread.Sleep(waitForGracefulTermination.Value);&lt;br /&gt;            }&lt;br /&gt;            &lt;span class=&quot;rem&quot;&gt;// if the task has not ended, we kill the thread&lt;/span&gt;&lt;br /&gt;            if (!task.IsCompleted)&lt;br /&gt;            {&lt;br /&gt;                thread.Abort();&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// simply start the thread (and the action)&lt;/span&gt;&lt;br /&gt;        thread.Start();&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// and wait for it to end so we return to the current thread&lt;/span&gt;&lt;br /&gt;        thread.Join();&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// throw exception if the token was canceled&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;rem&quot;&gt;// this will not be reached unless the thread completes or is aborted&lt;/span&gt;&lt;br /&gt;        token.ThrowIfCancellationRequested();&lt;br /&gt;    }, token);&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; task;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, the solution is to run the action on a thread and then manually kill the thread. This means that any control of where and how the action is executed is wrestled from the default TaskScheduler and given to you. Also, in order to force the stopping of the task, you use &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.abort&quot; target=&quot;_blank&quot; title=&quot;Raises a ThreadAbortException in the thread on which it is invoked, to begin the process of terminating the thread. Calling this method usually terminates the thread.&quot;&gt;Thread.Abort&lt;/a&gt;, which may have nasty side effects. Here is what Microsoft says about it:&lt;br /&gt;&lt;br /&gt;&lt;aside&gt;The Thread.Abort method should be used with caution. Particularly when you call it to abort a thread other than the current thread, you do not know what code has executed or failed to execute when the ThreadAbortException is thrown, nor can you be certain of the state of your application or any application and user state that it is responsible for preserving. For example, calling Thread.Abort may prevent static constructors from executing or prevent the release of unmanaged resources.&lt;br /&gt;&lt;br /&gt;Note that the Thread.Abort method is not supported on .NET Core.&lt;/aside&gt;&lt;br /&gt;&lt;br /&gt;Bummer! .NET Core doesn&#39;t want you to kill threads. However, if you are really determined, there is a way :) Use &lt;a href=&quot;https://github.com/dotnet/coreclr/blob/master/tests/src/baseservices/threading/regressions/threadex.cs&quot; target=&quot;_blank&quot; title=&quot;As it uses reflection, it might not be future compatible&quot;&gt;ThreadEx.Abort(thread);&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bonus code: How do you get the cancellation token if you have the task?  &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; token = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TaskCanceledException(task).CancellationToken;&lt;br /&gt;&lt;/pre&gt;It might not help too much, especially if you want to use it &lt;b&gt;inside&lt;/b&gt; the task itself, but it might help clean up the code.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;Just like async/await, using the provided cancellation token method will only pollute your code with little effect. However, considering you want to use a common interface for the purpose, use RunCancellable instead of Task.Run and handle the token manually whenever you feel resources have been allocated and need to be cleaned up first.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/8418796049644220039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=8418796049644220039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8418796049644220039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8418796049644220039'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/how-to-timeout-task-and-make-sure-it.html' title='How to timeout a task AND make sure it ends'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-6971807629029692376</id><published>2019-06-10T21:58:00.000+03:00</published><updated>2019-06-10T21:58:24.995+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Black Prism (Lightbringer #1), by Brent Weeks</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-5hmuV7L2Ado/XP6lOqjXYLI/AAAAAAAAD6Q/r9zVBqTzagQuQuibsP9XCNrhlBIOPCf0wCLcBGAs/s320/TheBlackPrism.jpg&quot; width=&quot;212&quot; height=&quot;320&quot; data-original-width=&quot;331&quot; data-original-height=&quot;500&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; If there is something that went wrong with this book, then it has to be the cover on Goodreads: a hipster young man with dark hair, a goatee and a pointlessly fancy dagger, which has almost no connection to the story. Instead, try the one on Amazon, which at least doesn&#39;t offend. And that concludes what went wrong with &lt;a href=&quot;https://www.goodreads.com/book/show/7165300-the-black-prism&quot; target=&quot;_blank&quot; title=&quot;Guile is the Prism, the most powerful man in the world. He is high priest and emperor, a man whose power, wit, and charm are all that preserves a tenuous peace. Yet Prisms never last, and Guile knows exactly how long he has left to live. When Guile discovers he has a son, born in a far kingdom after the war that put him in power, he must decide how much he&#39;s willing to pay to protect a secret that could tear his world apart.&quot;&gt;The Black Prism&lt;/a&gt;! I actually liked it a lot.&lt;br /&gt;&lt;br /&gt;  The story feels like so many other young adult fantasy novels, with the young child with important ancestry that had a bad childhood and is suddenly thrown in a world of magic, war and intrigue, but the characters are fresh, their motivations carefully crafted with respectful attention to detail. The world building follow suit, with a novel magic system, a deep history and not all yet revealed. The writing is good, too. After reading this first book in the &lt;a href=&quot;https://www.goodreads.com/series/49673-lightbringer&quot; target=&quot;_blank&quot; title=&quot;Five books so far&quot;&gt;Lightbringer&lt;/a&gt; saga, I immediately felt the need to read the next one in the series. But there is a dark side to all this, too, as The Black Prism isn&#39;t a stand alone book. If you like it, you will have to read it all.&lt;br /&gt;&lt;br /&gt;  Bottom line: I really liked the love &lt;a href=&quot;http://www.brentweeks.com/writing/the-black-prism/&quot; target=&quot;_blank&quot; title=&quot;an American fantasy writer. He made The New York Times Best Seller list with The Blinding Knife in its first month, September 2012. Weeks was born in Montana on March 7, 1977, and graduated from Hillsdale College with a degree in English. He briefly worked as a teacher and bartender before moving to writing full-time.&quot;&gt;Brent Weeks&lt;/a&gt; weaved in his book. This is not one of those &quot;give me your money now&quot; kind of work, it&#39;s something that has value and beauty. It&#39;s not the greatest book ever written, but what book is? For the fantasy genre, it was pretty entertaining (and big!).&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/6971807629029692376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=6971807629029692376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6971807629029692376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6971807629029692376'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/the-black-prism-lightbringer-1-by-brent.html' title='The Black Prism (Lightbringer #1), by Brent Weeks'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-5hmuV7L2Ado/XP6lOqjXYLI/AAAAAAAAD6Q/r9zVBqTzagQuQuibsP9XCNrhlBIOPCf0wCLcBGAs/s72-c/TheBlackPrism.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-2496469354016236573</id><published>2019-06-06T11:31:00.001+03:00</published><updated>2019-06-06T11:32:36.655+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Rise and Fall of the Dinosaurs: A New History of a Lost World, by Stephen Brusatte</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-xmzfMkU-G9s/XPjKeGsSI_I/AAAAAAAAD6E/aS-Ue11IF1AYyHk95AN3QOPavKe6saB1gCLcBGAs/s320/RiseAndFallOfTheDinosaurs.jpg&quot; width=&quot;212&quot; height=&quot;320&quot; data-original-width=&quot;315&quot; data-original-height=&quot;475&quot; style=&quot;float:left&quot; alt=&quot;book cover&quot; /&gt; When I was a child I was obsessed with dinosaurs. I was going through the pages of the Zoological Atlas again and again, looking at the big lizard like monsters and memorizing all of their names. If I would have had access to a book like &lt;a href=&quot;https://en.wikipedia.org/wiki/Stephen_L._Brusatte&quot; target=&quot;_blank&quot; title=&quot;an American paleontologist and evolutionary biologist, who specializes in the anatomy and evolution of dinosaurs&quot;&gt;Steve Brusatte&lt;/a&gt;&#39;s, I would have probably become a paleontologist! By that I mean that the book is good... for an eight year old or for somebody who is already giddy with the prospect of reading about their favorite subject. Now, decades later, I really made an effort to enjoy &lt;a href=&quot;https://www.goodreads.com/book/show/35068612-the-rise-and-fall-of-the-dinosaurs&quot; target=&quot;_blank&quot; title=&quot;&quot;&gt;The Rise and Fall of the Dinosaurs&lt;/a&gt;, but it had no wow factor anymore. The plethora of names that I haven&#39;t known about when I was smaller than a toddler did not bring me joy. Hearing about feathered dinosaurs and what is the most likely reason feathers evolved at all or how they dinosaurs turned into their modern day form - the birds, even the tales about the dwarf dinosaurs found in my own homeland merely made the book bearable. Having a long chapter focused on Tyrannosaurs and having my book reader stop after each T. in T. Rex didn&#39;t help either.&lt;br /&gt;&lt;br /&gt;My verdict, therefore, is that it is a good history book. It is well written and the passion of the author is palpable and admirable. Yet, unless you either know nothing about dinosaurs or you already love them, you won&#39;t read anything really amazing or new. It is, quite literally, a history of how dinosaurs rose and fell and it feels like reading a history book. Somehow, I was expecting more, something that explored in depth a lost world, but in fact it only made clear how little we know and how tiny chances are that this will ever change. Instead of the feel of a lush green world where danger loomed and beauty abounded, I got a dry dusty look at people digging in rocks for small hints of that world. It was like looking at shadows and trying to figure out what made them.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/2496469354016236573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=2496469354016236573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/2496469354016236573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/2496469354016236573'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/06/the-rise-and-fall-of-dinosaurs-new.html' title='The Rise and Fall of the Dinosaurs: A New History of a Lost World, by Stephen Brusatte'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-xmzfMkU-G9s/XPjKeGsSI_I/AAAAAAAAD6E/aS-Ue11IF1AYyHk95AN3QOPavKe6saB1gCLcBGAs/s72-c/RiseAndFallOfTheDinosaurs.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-7273170745329127104</id><published>2019-05-31T22:37:00.002+03:00</published><updated>2019-05-31T22:37:42.501+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Malice (The Faithful and the Fallen #1), by John Gwynne </title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-EWaHVKmrrUo/XPGAVjepeBI/AAAAAAAAD5w/ofSQXcWi8jgpO4pzw_qNysEQqvasvIaaQCLcBGAs/s320/malice.jpg&quot; width=&quot;208&quot; height=&quot;320&quot; data-original-width=&quot;309&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; Have you ever found a book so bland that you just refused to continue reading it? To me it happens rarely, but it did with &lt;a href=&quot;https://www.goodreads.com/book/show/15750692-malice&quot; target=&quot;_blank&quot; title=&quot;Young Corban watches enviously as boys become warriors under King Brenin’s rule, learning the art of war. He yearns to wield his sword and spear to protect his king’s realm. But that day will come all too soon. Only when he loses those he loves will he learn the true price of courage. &quot;&gt;Malice&lt;/a&gt;, by &lt;a href=&quot;https://john-gwynne.com/&quot; target=&quot;_blank&quot; title=&quot;author&#39;s site&quot;&gt;John Gwynne&lt;/a&gt;. And I do feel a sense of loss, since the reviews I&#39;ve seen are all so overwhelmingly positive. Maybe if I would have just read a few more formulaic chapters I would have gotten to the part when something, anything, happens.&lt;br /&gt;&lt;br /&gt;  But no, I do have a lot of books to read and I am not going to waste my time reading about another child who wants to be a hero, but he&#39;s weak and bullied, another large blacksmith who was once a soldier, another pair of good and evil gods and their minions, noble savages, strong princesses, evil viziers and so on and so on. After several chapters all I got was a bunch of people in different contexts, each with their own names, friends, family, dreams, history and narration. Whenever I thought something would happen, another character with a silly name came along to perform whatever ritual is assigned to its cardboard role. Confusing and boring as hell.&lt;br /&gt;&lt;br /&gt;  Bottom line, I couldn&#39;t even begin to finish it. I probably read about 10-15% and gave up.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/7273170745329127104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=7273170745329127104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/7273170745329127104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/7273170745329127104'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/malice-faithful-and-fallen-1-by-john.html' title='Malice (The Faithful and the Fallen #1), by John Gwynne '/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-EWaHVKmrrUo/XPGAVjepeBI/AAAAAAAAD5w/ofSQXcWi8jgpO4pzw_qNysEQqvasvIaaQCLcBGAs/s72-c/malice.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-7410450147733773551</id><published>2019-05-30T09:14:00.001+03:00</published><updated>2019-05-30T09:16:42.477+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Foundryside (Founders #1), by Robert Jackson Bennett</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-4GqEnMdCtC8/XO9toDdtqLI/AAAAAAAAD5k/l73QR1JaOHoVfzRhSoO_Re1kTiGYs7VDACLcBGAs/s320/Foundryside.jpg&quot; width=&quot;211&quot; height=&quot;320&quot; data-original-width=&quot;313&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt;  Much like &lt;a href=&quot;https://siderite.blogspot.com/2019/05/city-of-stairs-divine-cities-1-by.html&quot; target=&quot;_blank&quot; title=&quot;I liked it a lot&quot;&gt;City of Stairs&lt;/a&gt;, &lt;a href=&quot;https://www.goodreads.com/book/show/37173847-foundryside&quot; target=&quot;_blank&quot; title=&quot;Sancia Grado is a thief, and a damn good one. And her latest target, a heavily guarded warehouse on Tevanne’s docks, is nothing her unique abilities can’t handle. But unbeknownst to her, Sancia’s been sent to steal an artifact of unimaginable power, an object that could revolutionize the magical technology known as scriving. &quot;&gt;Foundryside&lt;/a&gt; is a steampunk story set in a world where power resides in the hands of a few &quot;houses&quot; who use a magical programming language to alter reality. The lead character is also a girl, the plot also revolves around someone who wants to abuse ancient magic to rule the world and the state of knowledge is yet again recovering from a major catastrophe that veiled the past. Yet with all this, I liked the book less.&lt;br /&gt;&lt;br /&gt;Just as the story moved from a more mystical setting to a more rational, scientific one, so did &lt;a href=&quot;http://www.robertjacksonbennett.com/&quot; target=&quot;_blank&quot; title=&quot;an American writer of speculative fiction, born in Baton Rouge, Louisiana. He studied at the University of Texas and settled down in Austin, Texas.&quot;&gt;Robert Jackson Bennett&lt;/a&gt;&#39;s writing turned more formulaic. It&#39;s like he took something he had success with and applied the same exact formula, with some improvements related to what people want to read. As a result, the characters are less mysterious and more cardboard, the hints peppered around the story for the reader to glimpse where it is going are way too revealing (something that bothered me a little in City of Stairs, too, but here it was just too obvious). But what bothered me most was that the characterization: some were way too modern, way too educated or philosophical, considering their background, and the divide between good and evil was so obvious, back to the annoying clich&amp;eacute; where the good characters are principled and loyal and intelligent and their opponents are insane, frustrated and ugly.&lt;br /&gt;&lt;br /&gt;Bottom like, I liked the book, but I feel like Foundryside is a step back for Bennett. It was harder to empathize with the heroes and almost impossible to do so with the antagonists. The story felt recycled from a basic idea scrived with the same recipe as City of Stairs, but more lazily.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/7410450147733773551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=7410450147733773551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/7410450147733773551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/7410450147733773551'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/foundryside-founders-1-by-robert.html' title='Foundryside (Founders #1), by Robert Jackson Bennett'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-4GqEnMdCtC8/XO9toDdtqLI/AAAAAAAAD5k/l73QR1JaOHoVfzRhSoO_Re1kTiGYs7VDACLcBGAs/s72-c/Foundryside.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-8310323825667478246</id><published>2019-05-29T14:50:00.001+03:00</published><updated>2019-05-29T14:51:19.692+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Styling Angular Material tooltips</title><content type='html'>  This should be a simple question with a simple answer, but if you google for &lt;a href=&quot;https://material.angular.io/components/tooltip/&quot; target=&quot;_blank&quot; title=&quot;provides a text label that is displayed when the user hovers over or longpresses an element.&quot;&gt;Angular Material tooltip&lt;/a&gt; styling or length or width you get different answers that are not always complete or even correct. The problem: you have something like &lt;i&gt;&amp;lt;a matTooltip=&quot;some message&quot; matTooltipClass=&quot;myTooltipClass&quot; ...&lt;/i&gt; as per the examples easy to find. However, it doesn&#39;t seem to be working. The styling for myTooltipClass does not apply. Here are some points to check off while searching for the problem:&lt;ol&gt;&lt;li&gt;Check whether myTooltipClass is defined in the component or the global CSS file. It should either be in the global CSS file (so it applies to everything) or your component should declare &lt;i&gt;encapsulation: &lt;a href=&quot;https://angular.io/api/core/ViewEncapsulation&quot; target=&quot;_blank&quot; title=&quot;Defines template and style encapsulation options available for Component&#39;s Component.&quot;&gt;ViewEncapsulation&lt;/a&gt;.None&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Check the declaration of the class is specific enough. DO NOT use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity#The_!important_exception&quot; target=&quot;_blank&quot; title=&quot;Nothing is that important...&quot;&gt;!important&lt;/a&gt; to fix this, although it would work. Try something like this: &lt;i&gt;mat-tooltip-component .mat-tooltip.myTooltipClass {...}&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;To see if the class is applied, set the background-color property to red or something. If the class applies, you managed to define it correctly. If it applies partially, it&#39;s not specific enough. To change the width, use &lt;i&gt;max-width&lt;/i&gt;. To make the tooltip wrap use &lt;i&gt;white-space: wrap;&lt;/i&gt; and &lt;i&gt;word-wrap: break-word;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;As a reference, this is how the HTML looks for a rendered tooltip:&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;cdk-overlay-container&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;cdk-overlay-connected-position-bounding-box&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ltr&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;top: 0px; left: 0px; height: 100%; width: 100%;&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;cdk-overlay-1&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;cdk-overlay-pane mat-tooltip-panel&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;pointer-events: auto; top: 8px; left: 417.625px;&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;mat-tooltip-component&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;aria-hidden&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;ng-tns-c34-15 ng-star-inserted&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;zoom: 1;&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;mat-tooltip ng-trigger ng-trigger-state&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;transform-origin: left center; transform: scale(1);&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;Info about the action&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;mat-tooltip-component&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/8310323825667478246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=8310323825667478246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8310323825667478246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/8310323825667478246'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/styling-angular-material-tooltips.html' title='Styling Angular Material tooltips'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-6164453525361521433</id><published>2019-05-25T17:42:00.002+03:00</published><updated>2019-05-25T17:42:53.764+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>City of Stairs (The Divine Cities #1), by Robert Jackson Bennett</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-qFG9k4etghc/XOlRFQORnBI/AAAAAAAAD5M/DPI49H5ryR4I8sQzNkHVx0HfNNQenjekACLcBGAs/s320/CityOfStairs.jpg&quot; width=&quot;207&quot; height=&quot;320&quot; data-original-width=&quot;308&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; What makes a good story? It has to be the telling or writing style, of course, but then there are other factors: believable and sympathetic characters, an interesting idea, a tight plot, good world building, entertaining scenes. I am happy to report that &lt;a href=&quot;https://www.goodreads.com/book/show/20174424-city-of-stairs&quot; target=&quot;_blank&quot; title=&quot;The city of Bulikov once wielded the powers of the gods to conquer the world, enslaving and brutalizing millions — until its divine protectors were killed. Now, Bulikov’s history has been censored and erased, its citizens subjugated. But the surreal landscape of the city itself, forever altered by the thousands of miracles its guardians once worked upon it, stands as a haunting reminder of its former supremacy.&quot;&gt;City of Stairs&lt;/a&gt; aced everything! I haven&#39;t heard of &lt;a href=&quot;http://www.robertjacksonbennett.com/&quot; target=&quot;_blank&quot; title=&quot;an American writer of speculative fiction, born in Baton Rouge, Louisiana. He studied at the University of Texas and settled down in Austin, Texas.&quot;&gt;Robert Jackson Bennett&lt;/a&gt; before, but I am sure to remember his name now. The first book in &lt;a href=&quot;https://www.goodreads.com/series/159695-the-divine-cities&quot; target=&quot;_blank&quot; title=&quot;The Divine Cities trilogy&quot;&gt;a trilogy&lt;/a&gt;, City of Stairs wasn&#39;t just blessingly self contained, but also made me happy to have following books to continue the story.&lt;br /&gt;&lt;br /&gt;  The main character is a woman who does everything from conviction, care for others and most of all her own intelligence and effort, not because of her gender. The story is a detective story, set in a fictional preindustrial almost steampunk world where gods recently existed until people killed them. It is a book of mystery, intrigue, politics, detective like investigations, spirituality and magic, but held tight around a solid core of whodunit and great character and world building. It reminded me of the wonder I felt when starting reading &lt;a href=&quot;https://brandonsanderson.com/&quot; target=&quot;_blank&quot; title=&quot;Great world building, easy characters and reading, lots of heart&quot;&gt;Brandon Sanderson&lt;/a&gt;&#39;s books.&lt;br /&gt;&lt;br /&gt;  Bottom line: not the greatest work of literary fiction that ever existed, but I couldn&#39;t find any fault with it. Per my definition, it was a perfect book.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/6164453525361521433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=6164453525361521433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6164453525361521433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/6164453525361521433'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/city-of-stairs-divine-cities-1-by.html' title='City of Stairs (The Divine Cities #1), by Robert Jackson Bennett'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-qFG9k4etghc/XOlRFQORnBI/AAAAAAAAD5M/DPI49H5ryR4I8sQzNkHVx0HfNNQenjekACLcBGAs/s72-c/CityOfStairs.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-3789035936525628587</id><published>2019-05-23T08:11:00.000+03:00</published><updated>2019-05-23T08:11:01.614+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Microcosm: E. Coli and the New Science of Life, by Carl Zimmer</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-rP3D6QClkdY/XOYlvWawF3I/AAAAAAAAD5A/92NKiiNGOIYTxcQCB_v5cOsy4odDWPA9ACLcBGAs/s320/Microcosm.jpg&quot; width=&quot;211&quot; height=&quot;320&quot; data-original-width=&quot;329&quot; data-original-height=&quot;499&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; At first I thought this will rehash the same information I&#39;ve got from books I&#39;ve read recently: how microorganisms are everywhere and how they live in symbiosis and cooperation with themselves, plants and animals, how the imbalance in the ecosystem is what we normally get to call disease, maybe some epidemics stories and so on. Instead I&#39;ve got an ode to &lt;a href=&quot;https://en.wikipedia.org/wiki/Escherichia_coli&quot; target=&quot;_blank&quot; title=&quot;a Gram-negative, facultative anaerobic, rod-shaped, coliform bacterium of the genus Escherichia that is commonly found in the lower intestine of warm-blooded organisms&quot;&gt;E. Coli&lt;/a&gt; and how studying it for decades has revealed to us in details the way life works. It&#39;s &lt;a href=&quot;https://carlzimmer.com/&quot; target=&quot;_blank&quot; title=&quot;a popular science writer, blogger, columnist, and journalist who specializes in the topics of evolution, parasites, and heredity. He is the author of many books and contributes science essays to publications such as The New York Times, Discover, and National Geographic. He is a fellow at Yale University&#39;s Morse College and adjunct professor of Molecular biophysics and biochemistry at Yale University.&quot;&gt;Carl Zimmer&lt;/a&gt;&#39;s multifaceted portrait of a single species of bacteria (although that&#39;s a lot of bacteria, if you get to read the book).&lt;br /&gt;&lt;br /&gt;  Well written even if more technical than the average popular science book, &lt;a href=&quot;https://www.goodreads.com/book/show/2051708.Microcosm&quot; target=&quot;_blank&quot; title=&quot;From the award-winning science writer and author of Evolution comes a startlingly original look at what it means to be alive--as revealed by a microbe that dwells within each person. 13 b&amp;w illustrations.&quot;&gt;Microcosm&lt;/a&gt; explains how heredity works, DNA, RNA, proteins, amino acids, bacteria, biofilms, archaea, eukaryotes, viruses, plasmids, mutations, evolution, resistance and so on until it gets to creationists, genetic engineering and exobiology, all while following our scientific history built on the study of this one bacteria, the workhorse of microbiology. In fact, it is so focused on E. Coli, that it snubs most other bacteria, it talks little of epidemics or the microbe ecosystem and instead focuses on how things work. It&#39;s like an engineer&#39;s view on how life works, or a user&#39;s manual for Escherichia coli.&lt;br /&gt;&lt;br /&gt;  I liked the book and I will probably read more from the same author. I mean, if he writes a book per microbe species I could read his books until one of us dies :) I highly recommend it not only for its subject, but also for how it makes clear the inner workings of life and evolution. I would have loved to read this book when I was 12.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/3789035936525628587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=3789035936525628587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3789035936525628587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3789035936525628587'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/microcosm-e-coli-and-new-science-of.html' title='Microcosm: E. Coli and the New Science of Life, by Carl Zimmer'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-rP3D6QClkdY/XOYlvWawF3I/AAAAAAAAD5A/92NKiiNGOIYTxcQCB_v5cOsy4odDWPA9ACLcBGAs/s72-c/Microcosm.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-4625869194396128522</id><published>2019-05-18T20:05:00.000+03:00</published><updated>2019-05-18T20:08:13.948+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The Faded Sun Trilogy (The Faded Sun #1-3), by C.J. Cherryh</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-up2p82b2tlY/XOAzVHohIqI/AAAAAAAAD4o/g7GuqoDhPD8XNtGV5BmDfoZjUqjQuIJcACLcBGAs/s320/the-faded-sun-trilogy.jpg&quot; width=&quot;320&quot; height=&quot;320&quot; data-original-width=&quot;353&quot; data-original-height=&quot;353&quot; alt=&quot;audiobook cover&quot; style=&quot;float:left&quot; /&gt; To be honest, I&#39;ve reached the beginning of the third book in &lt;a href=&quot;https://www.goodreads.com/en/book/show/57042&quot; target=&quot;_blank&quot; title=&quot;All three books in a single package&quot;&gt;The Faded Sun Omnibus&lt;/a&gt; and I&#39;ve decided to stop.&lt;br /&gt;&lt;br /&gt;It was 1978. Religious people living in the desert under strict rules and brandishing swords were still cool and not considered terrorists. &lt;a href=&quot;https://www.cherryh.com/WaveWithoutAShore/&quot; target=&quot;_blank&quot; title=&quot;an American writer of speculative fiction. She has written more than 80 books since the mid-1970s, including the Hugo Award-winning novels Downbelow Station (1981) and Cyteen (1988), both set in her Alliance-Union universe. She is known for &#39;world building&#39;, depicting fictional realms with great realism supported by vast research in history, language, psychology, and archeology. &quot;&gt;C.J.Cherryh&lt;/a&gt; decides to write a story about a fierce warrior race that works in the employ of others to wage space war, driven by a very exact culture that emerged in the desert. They carry black veils that only let show their eyes and are very partial to rituals and hand to hand combat. No wonder humans kicked their asses, but even they are terribly anachronistic. They have waged 40 years of war with the humans, under the contract of the Regul, fat immobile and amoral beings that care only for their own tribe&#39;s well being.&lt;br /&gt;&lt;br /&gt;Reminds you of &lt;a href=&quot;https://en.wikipedia.org/wiki/Dune_(novel)&quot; target=&quot;_blank&quot; title=&quot;a 1965 science fiction novel by American author Frank Herbert, it is set in the distant future amidst a feudal interstellar society in which various noble houses control planetary fiefs. The story explores the multi-layered interactions of politics, religion, ecology, technology, and human emotion, as the factions of the empire confront each other in a struggle for the control of planet Arrakis and its spice.&quot;&gt;Dune&lt;/a&gt;, the Freemen and the Harkonen? Well, this is where the similarity ends. Where Dune was deep, these three books are tediously drudging through all kinds of futile rituals and each character is painfully introspective, to the point that tough warriors bred for battle are recognizing and thinking about their feelings of fear all the time. Worse, nothing really seems to be happening. It takes a book for a ship to get to its destination.&lt;br /&gt;&lt;br /&gt;And the book has aged poorly, even when in the whole thing there are maybe a page of technical descriptions, probably less. There is no mention on what makes the ships run, what types of weapons are used, how computers work, etc. A ship just &quot;fires&quot; and it is never even described in what way.&lt;br /&gt;&lt;br /&gt;But the ultimate sin is how little sense it makes. I mean, this is the age of Star Wars, where... errr... people on starships wage battles with swords... OK, the author isn&#39;t the only one who screwed stories up, but the Mri are presented as this scourge of the battles, yet they don&#39;t know technology or can even read or write, they are appalled by mass warfare and prefer hand to hand combat (like real men!) and are strict in what they are allowed to do, know or even think. It&#39;s like giving space weaponry to the Flinstones. OK, you get the Jetsons, but how is that supposed to be terrifying or a match to the voracious human penchant for mass destruction? And there is more. After 40 years, we learn that people have never captured Mri alive, never studied them. The Mris themselves are accompanied by huge bear like semitelepathic animals that they never name or even know how they reproduce. Unlike Frank Herbert, who was obsessed with ecology, Cherryh feels no need to explain how a species of huge carnivores exists on harsh desert planets that are almost devoid of life and water or how three completely different species can share air and food, or how the animals and plants on a different planet are the same as from one that lay 120 planets away, or how language and culture stays the same for 80000 years. A lot of things just don&#39;t make sense, including the story&#39;s main premise, which is the fear that humans and Regul alike carry for the Mri.&lt;br /&gt;&lt;br /&gt;Bottom line: if it were nice to read at least, I would have given it a shot, but after two books of people thinking in fear about what others are thinking of them, I gave it up. It was just tediously boring.&lt;br /&gt;&lt;br /&gt;Now, Cherryh was at the beginning of her illustrious career and there are books written by her that &lt;a href=&quot;https://siderite.blogspot.com/2017/04/finitys-end-company-wars-7-by-cjcherryh.html&quot; target=&quot;_blank&quot; title=&quot;Finity&#39;s End (The Company Wars #7), by C.J.Cherryh&quot;&gt;I liked&lt;/a&gt;. I just hated this one.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/4625869194396128522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=4625869194396128522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4625869194396128522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/4625869194396128522'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/the-faded-sun-trilogy-faded-sun-1-3-by.html' title='The Faded Sun Trilogy (The Faded Sun #1-3), by C.J. Cherryh'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-up2p82b2tlY/XOAzVHohIqI/AAAAAAAAD4o/g7GuqoDhPD8XNtGV5BmDfoZjUqjQuIJcACLcBGAs/s72-c/the-faded-sun-trilogy.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-2437485825838430031</id><published>2019-05-11T14:54:00.001+03:00</published><updated>2019-05-11T14:54:04.668+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>The City in the Middle of the Night, by Charlie Jane Anders</title><content type='html'>  &lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-xa1eGVszOHA/XNaxuNoZdZI/AAAAAAAAD4Q/YpuhmgKf9c0nJYUGTMmdjz4oQml9jTSeQCLcBGAs/s320/CityInTheMiddleOfTheNight.jpg&quot; width=&quot;210&quot; height=&quot;320&quot; data-original-width=&quot;312&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; &lt;a href=&quot;https://www.goodreads.com/book/show/37534907-the-city-in-the-middle-of-the-night&quot; target=&quot;_blank&quot; title=&quot;Set on a planet that has fully definitive, never-changing zones of day and night, with ensuing extreme climates of endless, frigid darkness and blinding, relentless light, humankind has somehow continued apace -- though the perils outside the built cities are rife with danger as much as the streets below.&quot;&gt;The City in the Middle of the Night&lt;/a&gt; reminded me of Octavia Butler&#39;s &lt;a href=&quot;https://siderite.blogspot.com/2017/09/liliths-brood-xenogenesis-by-octavia-e.html&quot; target=&quot;_blank&quot; title=&quot;really weird, really cool&quot;&gt;Xenogenesis&lt;/a&gt;, only way lighter. The same female centric focus, the slight weirdness of descriptions and feelings that comes from a truly different perspective. &lt;a href=&quot;http://www.charliejane.net/&quot; target=&quot;_blank&quot; title=&quot;an American writer and commentator. She has written several novels and is the publisher of other magazine, the &#39;magazine of pop culture and politics for the new outcasts&#39;&quot;&gt;Charlie Jane Anders&lt;/a&gt; describes a planet far away from Earth, a colony that devolved after humans reached the planet until it got to feudal levels of government and technology. The planet is tidally locked, so people live on the narrow edge that separates frigid night and scorching day. There are some aliens there as well. Pretty cool story and concept, so much so that I hated it when the book ended and it was NOT a trilogy or a saga or whatever. Hard to please me, right?&lt;br /&gt;&lt;br /&gt;  The writing style isn&#39;t on par with the richness of the concepts, though, and I was also thrown off often by gaps in the understanding of science, social norms and even sensory descriptions. Yet once I understood the author is a transgender woman with sensory integration disorder, it started to make sense. The main characters are all women. There are no real romantic or familial relationships between them, unless counting the fact that they are always feeling things strongly and lying together in beds without doing anything. The lack of sexuality in the novel is refreshing but going a long way in the other direction until it feels eerie. And they often react physically or mentally in such overblown ways that it&#39;s hard to empathize. Stuff like someone saying something and they suddenly go to a corner to heave, or having seen someone smile or being touched in a certain way just short circuits their brain. There are a lot of leftover threads in the book, things that get partially described and you just wait for them to be explained later on and they just don&#39;t. Also the mix of first person perspective for Sophie and third person for everybody else is strange and forces one of the characters as the main one, even if maybe a reader would relate better with somebody else.&lt;br /&gt;&lt;br /&gt;  So I had difficulty in rating this book. I would give an excellent rating to the world building and the concepts presented there, but an average on characterization (even if most of the book is about what characters do and think and feel). I would rate some descriptions of internal struggle and emotion as great, but others really lame, especially when it comes to characters who seem to be designed to be thrown away later on. The writing style is not bad, but not great either. It&#39;s a mixture of brilliance and average that is hard to reconcile into a single metric. I mean, I could describe the entire plot of the book in two paragraphs; the rest is just people bumbling around trying to make sense of the world and themselves. No character has a real back story, except a few defining moments that feel pulled out of a hat, and they are understandably confused all the time. Who are their parents? Everybody in the book is an orphan. Why so many descriptions of invented food if does nothing for the plot, yet no sex, only a rare and weird longing sort of platonic love? Why is everybody so casually violent, yet so disgusted with violence in their inner thoughts?&lt;br /&gt;&lt;br /&gt;  It seems to me that this is a book that only some will be able to connect to (the others will get delirious and murderous). I liked the ideas, I liked the characters, it&#39;s just that they are coming from nowhere and ultimately going nowhere.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/2437485825838430031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=2437485825838430031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/2437485825838430031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/2437485825838430031'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/the-city-in-middle-of-night-by-charlie.html' title='The City in the Middle of the Night, by Charlie Jane Anders'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-xa1eGVszOHA/XNaxuNoZdZI/AAAAAAAAD4Q/YpuhmgKf9c0nJYUGTMmdjz4oQml9jTSeQCLcBGAs/s72-c/CityInTheMiddleOfTheNight.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-3866717473278835808</id><published>2019-05-05T18:03:00.003+03:00</published><updated>2019-05-05T18:03:48.606+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Good Germs, Bad Germs: Health and Survival in a Bacterial World, by Jessica Snyder Sachs</title><content type='html'> &lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-UAEuS4RVr1o/XM73OFm-WPI/AAAAAAAAD3w/x3zOZoy4WqA-7hUzpshIWRX1GrxvIAGewCLcBGAs/s320/GoodGermsBadGerms.jpg&quot; width=&quot;199&quot; height=&quot;320&quot; data-original-width=&quot;600&quot; data-original-height=&quot;966&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; The book might put you off at the beginning, as it starts with a no bullshit nomenclature chapter. It basically says: &quot;This is how I am going to call things in this book and if you don&#39;t like it, talk to people who actually care about semantics&quot;. The rest of the book continues with the same directness and I believe it is one of the works&#39; best qualities.&lt;br /&gt;&lt;br /&gt;  &lt;a href=&quot;https://www.goodreads.com/book/show/1043273.Good_Germs_Bad_Germs&quot; target=&quot;_blank&quot; title=&quot;Public sanitation and antibiotic drugs have brought about historic increases in the human life span; they have also unintentionally produced new health crises by disrupting the intimate, age-old balance between humans and the microorganisms that inhabit our bodies and our environment. &quot;&gt;Good Germs, Bad Germs&lt;/a&gt; starts like a few other books on the subject I&#39;ve read recently, with a short history of how people have looked upon disease and its causes: Hippocrates&#39; humors, the (all bad) germ theory, vaccines, antibiotics, the bad antibiotics and the good germs, modern understanding of immunity. And yet this is just the first half of the story. The rest is about new ideas, actual therapies and studies, real life cases and attempts to bring this new knowledge into the public domain.&lt;br /&gt;&lt;br /&gt;  I really liked the book. It&#39;s easy to read, easy to understand. Less of the story-like or anecdotal writing style of some other works and more to the point. I also liked that it doesn&#39;t take sides: one therapy has to go through wholly unreasonable FDA hoops to be allowed to even be tested in humans, the author points both positive and negative aspects of being prudent. Is it ridiculous that the lack of communication between American hospitals hides invisible epidemics that then get reported by Canada or Europe and end back into the States&#39; headlines as foreign diseases? &lt;a href=&quot;http://www.jessicasachs.com/books/microbes/&quot; target=&quot;_blank&quot; title=&quot; Contributing editor to Popular Science and Parenting; contributor to Discover, National Wildlife, and other publications; adjunct professor at Fordham University, Kean University, and New York University. Former manager and editor, Science Digest.&quot;&gt;Jessica Snyder Sachs&lt;/a&gt; just reports on the facts, letting the reader draw their own conclusions.&lt;br /&gt;&lt;br /&gt;  Bottom line: I thought it would be just a repeat of the same information I&#39;ve become familiar with lately, yet it was not only a different way of tackling the same subject, but also a lot more information about actual attempts to use it in real situations. I recommend it to anyone trying to understand how we stand in this coevolution with the microbes living inside and outside us.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/3866717473278835808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=3866717473278835808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3866717473278835808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3866717473278835808'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/good-germs-bad-germs-health-and.html' title='Good Germs, Bad Germs: Health and Survival in a Bacterial World, by Jessica Snyder Sachs'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-UAEuS4RVr1o/XM73OFm-WPI/AAAAAAAAD3w/x3zOZoy4WqA-7hUzpshIWRX1GrxvIAGewCLcBGAs/s72-c/GoodGermsBadGerms.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14267103.post-3392998185455689568</id><published>2019-05-01T00:46:00.001+03:00</published><updated>2019-05-01T00:46:07.038+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="misc"/><category scheme="http://www.blogger.com/atom/ns#" term="picture"/><title type='text'>Knights of the Borrowed Dark (Knights of the Borrowed Dark Trilogy #1), by Dave Rudden</title><content type='html'>&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-aZCgCAUT19Y/XMi-yWRgKMI/AAAAAAAAD3Y/u5BMgyxAzEAtb5vfJSSMiCrrGkq6Sh0XQCLcBGAs/s320/KnightsOfTheBorrowedDark.jpg&quot; width=&quot;208&quot; height=&quot;320&quot; data-original-width=&quot;309&quot; data-original-height=&quot;475&quot; alt=&quot;book cover&quot; style=&quot;float:left&quot; /&gt; &lt;a href=&quot;https://www.goodreads.com/book/show/34844398-knights-of-the-borrowed-dark&quot; target=&quot;_blank&quot; title=&quot;Denizen Hardwick is an orphan, and his life is, well, normal. Sure, in storybooks orphans are rescued from drudgery when they discover they are a wizard or a warrior or a prophesied king. But this is real life—orphans are just kids without parents. At least that’s what Denizen thought. . .&quot;&gt;Knights of the Borrowed Dark&lt;/a&gt; is a typical fantasy story filled with tropes like: &quot;the one&quot;, &quot;son of...&quot; (or &quot;noble family&quot; or &quot;everybody is related to everybody&quot;),  &quot;secret war (for no good reason)&quot;, &quot;light versus dark&quot;, &quot;evil must be fought with swords&quot;, &quot;no one tells you anything, even if it makes no sense&quot;, &quot;dark king&quot; and so on. The main character is a &lt;a href=&quot;https://en.wikipedia.org/wiki/Mary_Sue&quot; target=&quot;_blank&quot; title=&quot; an idealized and seemingly perfect fictional character.&quot;&gt;Mary Sue&lt;/a&gt;, an orphan who doesn&#39;t know his parents and has lived his entire life in an orphanage, but somehow is a balanced, well read individual who favors rationality to emotion, yet has no problem using both. Add the trope of &lt;a href=&quot;https://www.goodreads.com/series/191848-knights-of-the-borrowed-dark-trilogy&quot; target=&quot;_blank&quot; title=&quot;at least they are only three&quot;&gt;trilogy&lt;/a&gt; to this and you have a complete picture.&lt;br /&gt;&lt;br /&gt;  Now, does that mean I was not entertained? Nope. It was all fun and games and I&#39;ve finished the book in a day, yet I can&#39;t but be disappointed in both the formulaic nature of the story and the fact that I liked it anyway. The bottom line is that &lt;a href=&quot;https://daverudden.com/?page_id=578&quot; target=&quot;_blank&quot; title=&quot;When, at the tender age of 25, Dave Rudden set out to write the first book of his fantasy trilogy, The Knights of the Borrowed Dark, he was sure of one thing. &#39;I wanted to create a hero that didn&#39;t have a lantern jaw and a six-pack, that didn&#39;t shy away from the darker aspects of what it&#39;s like to be a teenager.&#39;&quot;&gt;Dave Rudden&lt;/a&gt; writes decently and has enough skill and humor to make the same story you&#39;ve read or seen a dozen times already feel pleasant. So read it, if you like that kind of thing, but don&#39;t expect anything above ordinary.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;a href=&quot;http://siderite.blogspot.com&quot; style=&quot;font-size:3px;&quot; title=&quot;Content taken from Siderite&#39;s blog&quot;&gt;Content taken from Siderite&#39;s blog&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siderite.blogspot.com/feeds/3392998185455689568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14267103&amp;postID=3392998185455689568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3392998185455689568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14267103/posts/default/3392998185455689568'/><link rel='alternate' type='text/html' href='http://siderite.blogspot.com/2019/05/knights-of-borrowed-dark-knights-of.html' title='Knights of the Borrowed Dark (Knights of the Borrowed Dark Trilogy #1), by Dave Rudden'/><author><name>Siderite</name><uri>http://www.blogger.com/profile/15900117719824630437</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-aZCgCAUT19Y/XMi-yWRgKMI/AAAAAAAAD3Y/u5BMgyxAzEAtb5vfJSSMiCrrGkq6Sh0XQCLcBGAs/s72-c/KnightsOfTheBorrowedDark.jpg" height="72" width="72"/><thr:total>0</thr:total></entry></feed>