tag:blogger.com,1999:blog-10136759206766801532024-03-13T22:02:14.826+01:00Lx=d: SundayResearchMathematics, programming, and a little bit of my life.Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.comBlogger377125tag:blogger.com,1999:blog-1013675920676680153.post-77662443529298588302023-09-15T13:41:00.005+02:002023-09-15T13:42:15.523+02:00A program removing qTranslate language section<h2 style="text-align: left;">Overview</h2><p>This is a program for migrating from a Wordpress with qTranslate to Wordpress multi-site. It removes the language-specific contents and tags attached by qTranslate plugin.</p><p>Keywords: qTranslate, qTranslate-X, multi-site, multi-language, Wordpress</p><h2 style="text-align: left;">Introduction</h2><p>Ten years ago from now (abound 2013), it is common that the cheapest web hosting service had 0 SQL databases, and even the next level service with database had up to 2 SQL databases. Therefore, if you want to use Wordpress in multiple languages, qTranslate multilingual plug-ins <a href="https://qtranslatexteam.wordpress.com/" rel="nofollow" target="_blank">https://qtranslatexteam.wordpress.com/</a> was a common solution to reduce the number of database use.</p><h2 style="text-align: left;">How does the qTranslate plugin work?</h2><p>The qTranslate plugin puts special tags ([:ja], [:], etc.) in the text. The plugin will retrieve the specific language text based on the tag.</p><h2 style="text-align: left;">Advantages and disadvantage of the qTranslate plugin</h2><p>The biggest advantage of the qTranslate plugin is that it needs only one database even if it is multilingual. Ten years ago (2013), this was a significant advantage for a hosting service to limit the number of databases to one. However, qTranslate distinguishes language section by own tags in the text, so there is a risk of accidentally edit tags. If the tag is accidentally erased or if the same string in the text, it could cause display problems. In addition, some plug-ins cannot be used at the same time because they do not know that other plug-ins switch languages by inserting tags into the content. Thus, there are restrictions on the use of the plugin.</p><h2 style="text-align: left;">qTranslate no longer supported, Wordpress version up</h2><p>The price of databases has dropped comparing to the 10 years ago. It is not unusual for an introductory web hosting service to have 10 databases available. And qTranslate is no longer supported in Wordpress 4.x. qTranslate plugin does not work well with the current 6.x version.</p><h2 style="text-align: left;">remove_qtrans.py</h2><p>During the migration, we considered manually editing the exported xml file from WordPress. However, due to the large number of articles and the fact that my site uses 3 languages, I decided to write a program to handle it: remove_qtrans.py. You can found <a href="https://github.com/yamauchih/shitohichi-tools/tree/master/snb/remove_qtrans" rel="nofollow" target="_blank">here on github</a> .</p><h2 style="text-align: left;">How to use remove_qtrans.py</h2><p>To remove the German (de) part from a Wordpress export file (export.xml) and output (out.xml) file, use the following command. This is a python3 program.</p><p> <span style="font-family: courier;">python3 remove_qtrans.py --language de --infile _export.xml --outfile out.xml</span></p><p>Tip: You can use your editor's replacezfunction to remove the last remaining language tags.</p><h2 style="text-align: left;">Conclusion</h2><p>I have developed a program to remove specific language parts and language tags from qTranslate. License: the New BSD. I hope this may useful for someone. It is under the New BSD License, there is no warranties. 2023-9-15(Fri)</p><div><br /></div>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-890983543310145162023-05-30T00:20:00.011+02:002023-05-30T00:49:07.207+02:00A story on Japanese blogs about potatoes being convicted in a Catholic religious trial. (I cannot find it in other languages.)<p>One of my favorite YouTube Channels is "Miscellaneous History Historica (歴史雑記ヒストリカ)" by Mondo (<a href="https://www.youtube.com/@mond_historica">https://www.youtube.com/@mond_historica</a>). It's a Japanese channel. There is a video about the history of potatoes.</p><p><a href="https://youtu.be/qiJNxcjQBtk">https://youtu.be/qiJNxcjQBtk</a> 【ゆっくり歴史解説】じゃがいもはどうやって食卓に浸透したのか?世界史の中のイモ史。 (Yukkuri-history explanation: How did potatoes make their way to our tables? The history of potatoes in world history.)</p><p>In this video, there were stories about Marie-Antoinette and Louis XVI's attempts to introduce potatoes, and the relationship between the English royal family and potatoes. Potatoes are "unbiblical crop" and therefore they are evil. The fact that they grow from seed potatoes is "sexually impure" because "potatoes grow in a way other than the union between a male and a female ordained by God. The Roman Catholic Church accused them, and they were guilty. Then, potatoes were burned at the stake." I thought this story was interesting because Roman Catholics in the Middle Ages had stories that are unbelievable by today's standards, which makes some stereotypes. This is one of those stories.</p><p>I would like to tell my friends about this story. However, I am currently living in Germany and most of my friend doesn't speck Japanese. I also have friends who know very well about the Bible. Therefore, I can't simply introduce them just because one YouTube channel says so.</p><p>So I looked it up in English, and this story does not show up in Google searches. For example, if you look up "potato excommunication (じゃがいも 破門)" in Japanese, you will get many hits. However, the content is almost the same. Perhaps they were copy-pasted from somewhere. Also, I could not find the reference.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiF0cvp9OIbkcVMtY9G05DproYlGrFUSTOoLNsnp0ENb7ld_QvhZ3DwkA-Z9JmbY2bRmgFHzYdDA9oLwQ_eqAXFAijY3KJja-W2tSDEHoBK8SXHzAwikZvQa32SX-LKYUS4prXSleZTMpXWi9ilAyi4ePzTRt6Ld4s5ta-LN1TpHdQiwsM6HuGxbE2A" style="margin-left: 1em; margin-right: 1em;"><img alt="Found many Japanese blog pages about guilty potatos" data-original-height="1101" data-original-width="763" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEiF0cvp9OIbkcVMtY9G05DproYlGrFUSTOoLNsnp0ENb7ld_QvhZ3DwkA-Z9JmbY2bRmgFHzYdDA9oLwQ_eqAXFAijY3KJja-W2tSDEHoBK8SXHzAwikZvQa32SX-LKYUS4prXSleZTMpXWi9ilAyi4ePzTRt6Ld4s5ta-LN1TpHdQiwsM6HuGxbE2A=w277-h400" title="Found many Japanese blog pages about guilty potatoes" width="277" /></a></div><br /><br /><p></p><p>But in English, "potato excommunication" only talks about what excommunication means and the potato famine in Ireland. Other searches, such as "potato trial guilty", are about a person who committed fraud with potato insurance, or about corruption in the potato industry. I searched for a while but I could not find anything.</p><p><br /></p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjD_lZ-ZD2dPLvPy2Ybj0aunuiX2Uzj19Xto7HrRsn8XoM2JjClK3pIklMsNSeDCZgWlnhOO3ZcrCi93IaskcMGzMNF4y0pMPUO0kCamLyygNdtp0gwC6zo5iChrS5K4Tocqih9XzATBqXXN21qUTPnKKEsePmvFPPGSyCBPsL7iBDCmBCFM0jhu2BJ" style="margin-left: 1em; margin-right: 1em;"><img alt="Search result example potato excommunication" data-original-height="1099" data-original-width="771" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEjD_lZ-ZD2dPLvPy2Ybj0aunuiX2Uzj19Xto7HrRsn8XoM2JjClK3pIklMsNSeDCZgWlnhOO3ZcrCi93IaskcMGzMNF4y0pMPUO0kCamLyygNdtp0gwC6zo5iChrS5K4Tocqih9XzATBqXXN21qUTPnKKEsePmvFPPGSyCBPsL7iBDCmBCFM0jhu2BJ=w280-h400" title="Search result example potato excommunication" width="280" /></a></div><br /><p></p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhwErcqB43WcYX1OG8K1cCiWS9cepAFZl07dKfsILK-0eeGm5aL-5WYWcjP1kqXiKz5eRVyj1thpXNt-9WZs8IO25OdQnDZp2q28mwy4My4jPX1rUj-GDYsgQqDVjyoir4qrkzXamQ-I4ISPWMaR6HVIXr3sx9PIieWppM8Np4rOYOLoCAzVJ-oBJf_" style="margin-left: 1em; margin-right: 1em;"><img alt="Search example: potato trial guilty" data-original-height="1098" data-original-width="775" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEhwErcqB43WcYX1OG8K1cCiWS9cepAFZl07dKfsILK-0eeGm5aL-5WYWcjP1kqXiKz5eRVyj1thpXNt-9WZs8IO25OdQnDZp2q28mwy4My4jPX1rUj-GDYsgQqDVjyoir4qrkzXamQ-I4ISPWMaR6HVIXr3sx9PIieWppM8Np4rOYOLoCAzVJ-oBJf_=w282-h400" title="Search example: potato trial guilty" width="282" /></a></div><p></p><p>I asked some friends to search for this. We could not find anything in German or Russian (also in English). However, we did find stories about Louis XVI, Marie-Antoinette, the English royal family, and so on. I also learned stories about how the potatoes were spread in Germany. However, there is no article of conviction or burning at the stake. They are all in Japanese.</p><p>So, I asked Mondo where this story came from in a comment, and he/she politely gave me a reference of this episode. It is</p><p><a href="https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E5%8F%B2%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E5%8B%95%E3%81%8B%E3%81%97%E3%81%9F%E6%A4%8D%E7%89%A9-%E7%A8%B2%E5%9E%A3-%E6%A0%84%E6%B4%8B-ebook/dp/B07H82NW2F/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1ADXAUJP5BZ70&keywords=%E7%A8%B2%E5%9E%A3%E6%A0%84%E6%B4%8B%E3%80%8E%E4%B8%96%E7%95%8C%E5%8F%B2%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E5%8B%95%E3%81%8B%E3%81%97%E3%81%9F%E6%A4%8D%E7%89%A9%E3%80%8F&qid=1685398692&sprefix=%E7%A8%B2%E5%9E%A3%E6%A0%84%E6%B4%8B+%E4%B8%96%E7%95%8C%E5%8F%B2%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E5%8B%95%E3%81%8B%E3%81%97%E3%81%9F%E6%A4%8D%E7%89%A9+%2Caps%2C377&sr=8-1" rel="nofollow" target="_blank">稲垣栄洋『世界史を大きく動かした植物』PHP 研究所</a></p><p>Hidehiro Inagaki, "The plants that changed the world history in a big way" PHP Kenkyusho. This is one of the best selling book in Japan in the category on amazon.</p><p>Hidehiro Inagaki is a professor of agriculture at Shizuoka University. <a href="https://tdb.shizuoka.ac.jp/rdb/public/Default2.aspx?id=11099&l=0">https://tdb.shizuoka.ac.jp/rdb/public/Default2.aspx?id=11099&l=0</a></p><p style="text-align: left;">In chapter 5 of this book, I found the following (my translation):</p>’’In the West, plants not mentioned in the Bible are of the devil. Thus the potato has been labeled as the devil's plant.<br />Medieval Europe was a time of witch trials.<br />And finally, the potato, the devil's plant, was put on trial. All creatures in the world are procreate by male-female sex. The potato, however, reproduces by seed potatoes without male and female. This is considered sexually disordered, and the potato is condemned as guilty. The penalty is, surprisingly, burning at the stake.’’<p>There are a few references to the potato episode in the book. Unfortunately, I could not find any reference to support the story of burning at the stake.</p><p>I contacted Prof. Hidehiro Inagaki on 2023-3-21 through a researcher network, but unfortunately, he has not responded as of now (2023-05-29).</p><p>I have asked some of my friends to help me in my search, but I can't find this story in any language other than Japanese.</p><p>If anyone knows this story's reference, please let me know.</p><p><br /></p>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-22128505684186112792023-05-25T16:12:00.011+02:002023-06-02T15:32:41.893+02:00 How to fix VirtualBox Linux boot error: vboxadd-service.service failed.<p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"></p><h4 style="text-align: left;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">Problem:</span></h4><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">2023-05-25, suddenly I cannot boot my linux virtual machine with an error vboxadd-service.service failed.</span><p></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><h4 style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">My environment</span></h4><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"></p><ul style="text-align: left;"><li><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"> Host: Windows 11</span></li><li><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"> VirtualBox 7.0.6. r155176 (Qt5.15.2)</span></li><li><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"> Linux kernel 5.19.0-42-generic, Kubuntu</span></li></ul><p></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"></p><h4 style="text-align: left;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"><strike>Solution:</strike></span></h4><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"><strike>Remove the additional module. It seems this is no longer needed.</strike></span><p></p><ol style="text-align: left;"><li><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><strike>mount the VBox_GAs_7.0.6 (You need to mont VBoxGuestAdditions.iso and need to see it at /media/<username>/VBox_GAs_7.0.6/)</strike></span></li><li><span style="color: #0e101a;"><strike>cd /media/<username>/VBox_GAs_7.0.6/</strike></span></li><li><span style="color: #0e101a;"><strike>sudo ./VBoxLinuxAdditions.run uninstall</strike></span></li></ol><h3 style="text-align: left;"><span style="color: #0e101a;">Solution (updated 2023-06-02)</span></h3><div><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">The issue seemed caused by the wrong display setting. Removed VBoxLinuxAdditions makes VBoxVGA Graphics controller works, but the clipboard between host and guest didn't work. So removing the VBoxLinuxAdditions is not a solution. I have no idea why the Graphics controller setting suddenly causing a problem. But here is the solution.<br /><br /></span></p><ul style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; list-style-type: disc; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">Setting the Graphics controller to VMSVGA resolved the problem.</span></li><li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; list-style-type: disc; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">VBoxLinuxAdditional.run should be executed. Otherwise, the Bidirectional clipboard didn't work.</span></li></ul></div><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"></p>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-80563905085598175282022-09-01T03:13:00.000+02:002022-09-01T03:13:05.689+02:00stand by power comsumption: xbox<p>Due to the energy price, I measured some of the devices of mine and my friend. My friend's family has an Xbox. Xbox's stand-by (when switched off) power consumption is around 20W. This was unexpectedly high for me. It is equivalent to a bright LED light. My friend immediately uses the power on/off switch extension. If you have an Xbox, I also recommend using the on/off extension cable.</p>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-48841979112841258912022-04-19T01:20:00.004+02:002022-04-19T01:22:47.371+02:00How to pass a better gun control law.<p> <span style="color: #0e101a;">How to pass a better gun control law.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">Every time a mass shooting happens, people try to pass a better gun control law. But NRA consistently stopped them (see e.g., <a href="https://youtu.be/_ECYMvjU52E">YouTube: NRA: Last Week Tonight with John Oliver (HBO)</a>).</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">To prepare for the next mass shooting, a woman called (J.C.) established a non-profit organization. The organization is a bit mysterious under their security concern. But it seems called either WIW</span>N, WASD, or FYN (or possibly multiple organizations)*. What they do is:</p><ol style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; list-style-type: decimal; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">members are informed when and where the bill will be discussed</span></li><li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; list-style-type: decimal; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">members are encouraged to call the members senator and representative and informed every chance depends on the distance of the residence</span></li><li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; list-style-type: decimal; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">they provide the member-accessible database about the congress schedule relevant to their issue</span></li></ol><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">A problem is the organization has a bit of tight membership control. I cannot write here how to join, but you will find the way. (A rumor: some comedians seem to know the organization's correspondence.) The number of members is estimated still be a fraction of NRA members in 2020. However, they seem to grow every noticeable shooting incident.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"><br /></span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">* We don't know what these acronyms stand for. A rumor says WASD is "We Are Shiny Deers" inspired by the linked video.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"></p>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-56463077275493161162022-02-20T20:49:00.000+01:002022-02-20T20:49:14.939+01:00No more Olympic, please<p>Please give me No More Olympic information, please.</p><p>#NMO</p>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-54452079609569569922022-01-25T22:10:00.003+01:002022-01-25T22:10:46.613+01:00Priority inversion<p> The end of the world is easier than the end of capitalism.</p><p><span> -- The ministry for the future.</span></p>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-16184727404423770002021-05-04T12:07:00.003+02:002021-05-04T12:09:06.740+02:00Floating point reproducibility in parallel processing<script async="" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?..." type="text/javascript">
</script>
<h2 style="text-align: left;">The floating point reproducibility problem</h2><p>On a typical computer, the results of floating point operations can differ from the mathematical result. In general, floating point operations like addition may not satisfy all mathematical properties for that operation. For example, the associativity property of addition may not hold for all numerical values:<br /><br />$(x + y) + z \stackrel{?}{=} x + (y + z)$<br /><br />A decimal representation of a number cannot always be represented by a finite binary representation in computer hardware. For example, the computed result of $0.1 + 0.01 - 0.1 - 0.01$ is not equal to $0$, but mathematically these values should be equivalent.</p><p>For example, you can demonstrate this using the Python interpreter (Python 3.8.5):</p><span style="font-family: courier;">>>> 0.1 + 0.01 - 0.1 - 0.01<br />-5.204170427930421e-18</span><br /><br /><p>But mathematical properties do hold in other cases. For example, the result of $0.1 - 0.1 + 0.01 - 0.01$ is equal to $0$.</p><span style="font-family: courier;">>>> 0.1 - 0.1 + 0.01 - 0.01<br />0.0</span><p>Another problem results from rounding errors during computation. When one operand is very small compared to the other operand, the result of adding these values can not be exact. This is an order dependent rounding problem. When we add very small numbers to a huge number, all the small numbers can be ignored by a rounding error. The computed result is less than the mathematical value, called <i>underflow</i>. But when we add all the small numbers first and then add that sum to the huge number, the rounding error may differ.</p><p>There are several reasons why this problem may occur though the main reason is that the floating point representation is finite in hardware.</p><p>Many algorithms depend on the equality of computation results. Thus, floating point reproducibility in those algorithms is the key to their correctness. A solution can be implemented by using a range of values instead of a single value. Because the computational error is usually very small, we can know if the exact value is within a given range. This is called an <i>interval algorithm</i>. In this article, however, I focus on a method that does not assume that associativity of operations holds during computation. This method is particularly useful in parallel execution of those calculations.</p><h2 style="text-align: left;">Example problems</h2><p>We pick the following geometric computation examples:</p><p></p><ul style="text-align: left;"><li> Ray-object intersection calculation by space subdivision</li><li> Plane-triangle intersection calculation on a triangle mesh</li></ul><p></p><h3 style="text-align: left;">Ray-object intersection calculation by space subdivision</h3><p>Figure 1 shows a space subdivided by two cubes (two sub-spaces) and a polygon (a triangle) located at the boundary. The intersection point between a ray and the polygon is exactly on the boundary. We assume that the intersection point calculation is performed by two processing units, each assigned to the sub-space s1 and sub-space s2. (Processing unit 1 is assigned to s1 and unit 2 to s2.) Each unit computes the intersection in parallel and independently. The following equation represents the ray, where $\boldsymbol{P}_0$ is the view point, $\boldsymbol{d}$ is the direction vector, and $t$ is the ray parameter.</p><p>\[\boldsymbol{r}(t) &=& \boldsymbol{P}_0 + t \boldsymbol{d}\]</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-_0K-rAZXEfY/YJEa791SsxI/AAAAAAAAn8I/_fH8b03TuEs-Bdam6GSocADVqcOHjMgsACLcBGAsYHQ/s581/space_subdiv_with_tri.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="209" data-original-width="581" height="144" src="https://1.bp.blogspot.com/-_0K-rAZXEfY/YJEa791SsxI/AAAAAAAAn8I/_fH8b03TuEs-Bdam6GSocADVqcOHjMgsACLcBGAsYHQ/w400-h144/space_subdiv_with_tri.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="text-align: start;">Figure 1: Space subdivision ray-object intersection</span></td></tr></tbody></table><br /><p></p><p>If we use the 3D-Digital Differential Analyzer (3DDDA) algorithm to traverse the spaces, the value of $t$ used in s1 and the value of $t$ used in s2 differ because each $t$ is computed when the ray enters the sub-space. To extract the parallelism, we subdivide the space, then compute the ray-polygon intersection calculation in parallel. However, the intersection point should be the same. To guarantee the numerical reproducibility for this intersection, we must ensure all the input values are exactly the same in each sub-space.</p><p>Using exactly the same inputs means that all the bits of the input number's representation are the same. If an input polygon is subdivided and distributed to the sub-spaces, the order of the edges should be maintained during computation. In most cases, we copy the input. However, it is important to note that the edge direction may differ at a result of the copy operation.</p><p>Here the problem is quite visible when we deal with transparent polygons. If ray parameter $t$ differs depending on the sub-space, the hit point may be slightly off. When calculations in both sub-spaces considers a hit in the sub-space, the shading value is computed twice, causing an artifact. Conversely, when both calculations in sub-spaces consider a non-hit in the sub-space, a hole is visible in the polygon.</p><p>In my own work, I replaced the 3DDDA algorithm to avoid this numerical reproducibility problem. Rays are always computed from the view point and use the same inputs for each sub-space. It is hard to avoid the numerical reproducibility problem in 3DDDA; it is an incremental algorithm and addition is the basis for its calculations.</p><h3 style="text-align: left;">Plane-triangle intersection calculation on a triangle mesh</h3><p>The strategy for solving this problem is essentially the same as that used in the ray-object case. Each independent computation receives exactly the same inputs. For instance, let's assume our goal is to find an intersection line between a triangle mesh and a plane. Figure 2 shows a plane $P$ and a triangle mesh composed of two triangles $v_0 v_1 v_2$ and $v_0 v_3 v_1$. The intersection line is shown as $i_0 i_1$ and $i_1 i_2$. Here we assume that the plane and triangles are not co-planer and that the intersection lines are clearly defined. (Handling the co-planar case is important, but I will not mention it further since it is less relevant to the issue of numerical reproducibility.)</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-EBoSzvgdAf0/YJEbSG0KU0I/AAAAAAAAn8Q/e6cIH3zMWiwYxnrf-yCuCZ6ehLPGNJnCgCLcBGAsYHQ/s591/plane_tri_intersection.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="275" data-original-width="591" height="186" src="https://1.bp.blogspot.com/-EBoSzvgdAf0/YJEbSG0KU0I/AAAAAAAAn8Q/e6cIH3zMWiwYxnrf-yCuCZ6ehLPGNJnCgCLcBGAsYHQ/w400-h186/plane_tri_intersection.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="text-align: start;">Figure 2: Plane-triangles intersection</span></td></tr></tbody></table><br /><p> </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-mmc4RWkYd20/YJEbckGUHyI/AAAAAAAAn8U/-ogyAMD8lyEhNwTTmiTopOlQXwnJuum4QCLcBGAsYHQ/s715/edge_orientation.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="321" data-original-width="715" height="180" src="https://1.bp.blogspot.com/-mmc4RWkYd20/YJEbckGUHyI/AAAAAAAAn8U/-ogyAMD8lyEhNwTTmiTopOlQXwnJuum4QCLcBGAsYHQ/w400-h180/edge_orientation.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="text-align: start;">Figure 3: Edge orientation</span></td></tr></tbody></table><p>Let's find the position of intersection point $i_1$. In this case, there are two representations of the edge $\boldsymbol{e}$: $\boldsymbol{e}_{v_0 \rightarrow v_2}$ and $\boldsymbol{e}_{v_2 \rightarrow v_0}$.</p><p>\[\boldsymbol{e}_{v_0 \rightarrow v_2} &=& v_0 + t (v_2 - v_0) (1)\\</p><p> \boldsymbol{e}_{v_2 \rightarrow v_0} &=& v_2 + t (v_0 - v_2) (2)\]</p><p>Figure 3 shows the edges of the adjacent triangles: (a) the opposite direction, (b) the same direction. Strictly speaking, there are four combinations of directions for the two edges. But for numerical reproducibility, it is only necessary to determine if the adjacent edge directions are the same or not, so it is sufficient to consider the cases (a) and (b) only.</p><p>If the associativity of computation holds, both Eq. (1) and Eq.(2) produce the same result for the $i_1$ position calculation. However, the floating point computation results are slightly different because of these different edge representations. This causes an issue if an algorithm assumes the $i_1$ position calculation results in exactly the same binary representation of the number.</p><p>To solve this problem, we can define a unique order of vertices $v_0$ and $v_1$ for all edges. The following is an example comparison functor to define such order in C++ (for example, for the <span style="font-family: courier;">std::map</span> container).</p><p><br /></p><span style="font-family: courier;">// Simple example of a 3D point representation<br /><br />struct Point3D {<br /> float x;<br /> float y;<br /> float z;<br />};<br /><br />// Point3D comparison functor for the total ordering<br />struct comparePointOrder<br />{<br /> bool operator()(const Point3D& v0, const Point3D& v1) const<br /> {<br /> return (v0.x < v1.x)<br /> || ((v0.x == v1.x) && (v0.y < v1.y))<br /> || ((v0.y == v1.y) && (v0.z < v1.z));</span><div><span style="font-family: courier;"> }<br />};<br /><br /></span><p>This comparison function is based on the concept of number comparison. For example, consider a comparison of two two-digit numbers, say 23 and 24. We first compare the tens place, if one of the numbers has a smaller digit, that number is smaller. If both numbers have the same digit of tens place, we move to one's place and compare the digit of the one's place. For any pair of numbers, we can repeat the comparison until we determine that one of the numbers is smaller, or that the two values are equal when all the digits are the same. In the preceding code, note that equality checks are essential. Without equality tests in the code, the comparison results differ. (I once had introduced just such a bug.)</p><p>When computing an intersection position on an edge, the usual input is a triangle and a z value. But it is important to ensure that the direction of the edge is the same for each intersection computation. For example, when computing the position of $i_1$ and the input triangle is $v_0 v_1 v_2$, then the edge direction is $v_0 \rightarrow v_1$. The same edge direction should be kept as $v_0 \rightarrow v_1$ for the triangle $v_0 v_3 v_1$. To compute the intersection points, the correctly oriented edge should be generated dynamically per edge.</p><p>A typical data structure implementation of a triangle mesh maintains the consistency of the normal vectors of the triangles. All triangles have the same vertex order, clockwise or counter-clockwise. Thus, Figure 2 (a) shows typical edge directions for two triangles. However, to maintain numerical reproducibility, I suggest generating the edges as shown in Figure 2 (b) on the fly. In this way, you can achieve the numerical reproducibility for computing the position of $i_1$.</p><p>This technique enables a lookup of the $i_1$ point from both adjacent triangles using \texttt{std::map} with the suggested comparison functor. Correct results are produced not only for serial computation but for parallel processing as well.</p><h2 style="text-align: left;">Conclusions</h2><p>I have described methods to maintain numerical reproducibility. These methods also work in a parallel processing context. 3DDDA is a simple and powerful algorithm, but it is weak on numerical reproducibility. Mathematically, line segments $AB$ and $BA$ are the same. However, as described in this article, this is not necessarily true for computational calculations. If an algorithm is sensitive to numerical reproducibility, I suggest distinguishing line segments $AB$ and $BA$. To avoid such numerical reproducibility issues, one technique is to keep a total order of input segment vertices.</p><h2 style="text-align: left;">Acknowledgment</h2><p>I am thankful for the help provided by Andy Kopra for valuable suggestions and comments.</p><h2 style="text-align: left;">References</h2><p>For numerical reproducibility, see [1,2], for example. For 3DDDA, see [3] or Wikipedia [4].</p><p></p><ol style="text-align: left;"><li>Nathalie Revol and Philippe Th{\'{e}}veny, "Numerical Reproducibility and Parallel Computations: Issues for Interval Algorithms", <a href="http://arxiv.org/abs/1312.3300, 2013" rel="nofollow" target="_blank">http://arxiv.org/abs/1312.3300, 2013</a></li><li>James Demmel and Hong Diep Nguyen, "Fast Reproducible Floating-Point Summation", In 21st IEEE Symposium on Computer Arithmetic, 2013</li><li>Fujimoto Akira and Takayuki Tanaka and Kansei Iwata, "ARTS: Accelerated Ray-Tracing System", IEEE CG & Applications, 148--157, 1986</li><li>Wikipedia, The Free Encyclopedia, "Digital differential analyzer: graphics algorithm", <a href="https://en.wikipedia.org/wiki/Digital_differential_analyzer_(graphics_algorithm)" rel="nofollow" target="_blank">https://en.wikipedia.org/wiki/Digital_differential_analyzer_(graphics_algorithm)</a>, [Online; accessed 26-April-2021]</li></ol><p></p></div>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-47980243566755698792021-04-01T01:03:00.007+02:002021-04-01T01:03:57.654+02:00Berlin Westhafen, responsibility, and arrogance of playing a god<p>Once I walk around this Hafen with one of my friends, we discussed a book (*) we both read recently. The discussion goes far and in many directions. But I found two points were interesting. <br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-B3LB_VnDNM4/YGT_CM-97RI/AAAAAAAAn1Q/xgG-urcW0UYzg0-NOCTCxI0F-PKNvcTVgCLcBGAsYHQ/s1024/IMG_20210329_berlin_westhafen.jpg" style="margin-left: auto; margin-right: auto;"><img alt="Berlin Westhafen" border="0" data-original-height="768" data-original-width="1024" height="300" src="https://1.bp.blogspot.com/-B3LB_VnDNM4/YGT_CM-97RI/AAAAAAAAn1Q/xgG-urcW0UYzg0-NOCTCxI0F-PKNvcTVgCLcBGAsYHQ/w400-h300/IMG_20210329_berlin_westhafen.jpg" title="Berlin Westhafen" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Berlin Westhafen<br /></td></tr></tbody></table><p>One is as in the title, ``You have no responsibility for what was<br />happened, but you have responsibility for that not happens<br />again. (Original: Ihr seid nicht verantwortlich fuer das, was<br />geschah. Aber das es nicht wieder geschiert, dafuer schon)'' If I think<br />about responsibility, I believe that the people who were not born at<br />that time cannot have ``personal'' responsibility. Some extreme idea<br />says someone has responsibility for all the ancestors did. It does not<br />seem fair because the responsibility is passed on to the descendants. They are words about war, but I think it still holds in the case of war. It<br />should be noted that what I put parentheses around "personal"<br />here may not apply if that is not a person.<br /><br />The other part is an argument that the dropping of the US atomic bomb on Hiroshima and Nagasaki is necessary because it saved the American<br />people. I took one step back and thought about it. Taking a step back<br />means to think neither a party nor war. In that case, the debate is<br />whether an organization has the right to kill someone to help someone.<br />Then it became clear to me that this is a discussion about who can<br />decide who should die. I thought this part was scary. I don't think I<br />have the right to kill someone. When it comes to the context of "war,"<br />it suddenly becomes natural. For example, because it is a war, it is<br />natural to kill the enemy. Where and when did this arrogance come to my<br />mind?<br /><br />My favorite philosopher says, "Handle so, daß die Maxime deines Willens<br />jederzeit zugleich als Prinzip einer allgemeinen Gesetzgebung gelten<br />könne." It may seem impossible for me to understand this sentence, but<br />when I read this sentence, I think that it means "act based on the<br />principle that is okay at any time." This is a guide of morals. According<br />to this sentence that some values suddenly change because war, is<br />immoral. Isn't it always bad to be bad? Naturally, anyone came up and<br />said to me, if your loved one is killed, don't you think you want to<br />kill the murderer? Probably I feel so, yet, I don't think no one has the<br />right to kill someone. If I think it is, it's when I have the arrogance<br />to think myself that I'm a kind of god who can free to take the human<br />life.<br /><br />(*) You have no responsibility for which was happened, but you have responsibility for that not happens again. Looking for a small peace. A record of Potzdam, Truman house, and Hiroshima-Nagasakiplatz: Masao Fukumoto, きみたちには、起こってしまったことに責任はない でもそれが、もう繰り返されないことには責任があるからね 「小さな平和」を求めて ポツダム・トルーマンハウスとヒロシマ・ナガサキ広場の記録: ふくもとまさお<br /><a href="https://store.voyager.co.jp/publication/9784866890906">https://store.voyager.co.jp/publication/9784866890906</a><br /><br /><br /></p>Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-15572600408499977982020-03-29T15:43:00.001+02:002020-03-29T15:48:08.917+02:00A concern about an abnormality on the statistics of number of Japanese COVID-19 patientsWe have already had a lot of COVID-19 articles. Every country's goal now is how to reduce the number of death. Since the exponential growth rate of an epidemic, it should be the first priority that how to avoid the corruption of the health system.<br />
<br />
We need the precise data of how many patients are there. Otherwise we can not have a strategy, how many beds we need, how long we need to lock down, how many test we need to deploy, every strategy needs to be answered the questions: how many X we need?<br />
<br />
In this article I based on the data from John Hopkins <a href="https://github.com/CSSEGISandData/COVID-19" target="_blank">Data Repository</a> and the analysis of <a href="https://github.com/aatishb/covid/blob/master/curvefit.ipynb" target="_blank">Aatish's Exponential/Logistic Curve-Fitting Site</a>.<br />
<br />
When I checked this data, I found an abnormality of Japanese data.<br />
<br />
Figure 1 shows the total confirm cases and new confirmed cases in the past week. Japanese data is way less compare to other countries.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-jnCRUmghDbY/XoClkSzq5NI/AAAAAAAAkYs/Rfwr0CrU4_cmOb8kMcmhYnVySkw5WlWKgCLcBGAsYHQ/s1600/corona_trajectory_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="706" data-original-width="1117" height="404" src="https://1.bp.blogspot.com/-jnCRUmghDbY/XoClkSzq5NI/AAAAAAAAkYs/Rfwr0CrU4_cmOb8kMcmhYnVySkw5WlWKgCLcBGAsYHQ/s640/corona_trajectory_01.jpg" width="640" /></a></div>
<br />
Figure 1 Data source: minutephysics: <a href="https://youtu.be/54XLXg4fYsc" target="_blank">How To Tell If We're Beating COVID-19</a><br />
<br />
You might think, a small new case ratio sounds good. However, why Japanese case is small? It is the same disease. Some countries completely lock down a whole city, but even so, this trend kept. There is no complete lock down in Japan yet. This figure is log-log scale, the different is looks small, but it is a few ten times.<br />
<br />
The next Figures are about the speed of spreading (doubling time). Only three countries including Japan is over the ten days. If the error bar is concerned, only Japan is quite certainly over ten days. Note: these two graphs have a different Y axis due to automated graph generation. For an exponential growth, one day difference affects big.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-PbgJ9JRjYzo/XoCls3RUpYI/AAAAAAAAkYw/HH9bOHOL2eIM_QFu4b-Tf-ro8jyhZQ5sgCLcBGAsYHQ/s1600/corona_double_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="479" data-original-width="816" height="374" src="https://1.bp.blogspot.com/-PbgJ9JRjYzo/XoCls3RUpYI/AAAAAAAAkYw/HH9bOHOL2eIM_QFu4b-Tf-ro8jyhZQ5sgCLcBGAsYHQ/s640/corona_double_01.png" width="640" /></a></div>
<br />
Figure 2: COVID-19 nation vs. doubling time (1) Including Japan (only a few over 10 days)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-9Y1cNLv81TI/XoClyCULbjI/AAAAAAAAkY0/-OS7CWNPWwEBSa4WmGa2q8muMvgJ6jEsgCLcBGAsYHQ/s1600/corona_double_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="813" height="392" src="https://1.bp.blogspot.com/-9Y1cNLv81TI/XoClyCULbjI/AAAAAAAAkY0/-OS7CWNPWwEBSa4WmGa2q8muMvgJ6jEsgCLcBGAsYHQ/s640/corona_double_02.png" width="640" /></a></div>
<br />
Figure 3: COVID-19 nation vs. doubling time (2) (no over ten countries)<br />
<br />
Figure 2, 3 Data source: John Hopkins Data Repository https://github.com/CSSEGISandData/COVID-19 and Aatish's Exponential/Logistic Curve-Fitting Site https://github.com/aatishb/covid/blob/master/curvefit.ipynb<br />
<br />
I am not an epidemiologist, thus, I cannot tell, but I have a question, why? This looks not normal. What is going on?<br />
<br />
We have a few proven effective methods for COVID-19,<br />
<br />
<ul>
<li>Take a social distance</li>
<li>Hygiene habit</li>
<li>Test and quarantine</li>
<li>Better healthcare system</li>
</ul>
<br />
Some of them can be done by individual. But tests are one of society's work. If we know more, we can possibly do more. If we don't know we can do less. Some countries achieved to deploy the good test system.<br />
<br />
We can have a strategy based on test results information. How many beds we need more in the next week, how long we need stay home, these strategy has "how many/how long" questions. The data is necessary for saving lives. But I see strangeness in this data. That is my concern. Although this is my personal observation. How do you think?<br />
<br />
I hope this is just my concern.<br />
<br />
I found the following links useful to understand the data.<br />
<br />
<ul>
<li><a href="https://youtu.be/Kas0tIxDvrg" target="_blank">Exponential growth and epidemics</a> (3Brawn1Blue) </li>
<li><a href="https://youtu.be/k6nLfCbAzgo" target="_blank">The Coronavirus Curve</a> - Numberphile </li>
<li><a href="https://youtu.be/gxAaO2rsdIs" target="_blank">Simulating an epidemic</a> (3Brawn1Blue) </li>
<li><a href="https://youtu.be/Xe8fIjxicoo?t=1224" target="_blank">How we must respond to the coronavirus pandemic</a> (TED) </li>
</ul>
<br />
<br />
<br />
<br />
<br />
<br />Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-52304144892205183462020-03-26T16:56:00.002+01:002020-03-26T16:56:59.962+01:00Join to analyze COVID-19Just join to analyze COVID-19<br /><a href="https://foldingathome.org/">https://foldingathome.org/</a><br />
<br />Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-56666022815443219852019-04-27T23:49:00.003+02:002019-04-27T23:49:37.643+02:00BorissingNew word: Borissing<br />
<br />
1. A behavior who started something, but succeeded to running away without taking responsibility.<br />
Usage example: a school teacher told a student, "Please don't borissing. You are already a 5th grade."<br />
<br />
2. Referring an social harassment. Some people coincidentally has a similar name. There are some incidents, such child was picked in a class. The association "We did nothing wrong" officially stated, this is a discrimination, please stop using the word. But another association, "Yes, but this is the consequence" stated recently, we should solve the problem from the source, otherwise we could not completely solve this problem.<br />
<br />
-- in the Devil's dictionary draft<br />
<br />Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-89316215490250957862019-02-05T00:46:00.001+01:002019-02-05T02:32:21.628+01:00Young's double slit equation: Many textbooks draw parallel rays, but how could parallel rays intersect?<script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
Young's double slit equation is well known result that shows the light has a wave property.<br />
<ol>
<li><a href="https://www.khanacademy.org/science/physics/light-waves/interference-of-light-waves/v/youngs-double-slit-part-2" rel="nofollow" target="_blank">https://www.khanacademy.org/science/physics/light-waves/interference-of-light-waves/v/youngs-double-slit-part-2</a></li>
<li><a href="https://en.wikipedia.org/wiki/Young%27s_interference_experiment" rel="nofollow" target="_blank">https://en.wikipedia.org/wiki/Young%27s_interference_experiment</a></li>
</ol>
A typical illustration of Young's interference experiment is shown in Figure 1. This figure confuses novice learners since at the point C, two parallel rays intersect. But how could possibly parallel rays intersect? In Euclidean geometry, parallel two lines will never intersect.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-FJdQU8vwjPU/XFjOBrkItpI/AAAAAAAAiNI/xg_PZIUA_D44TiUwUDKRyjgqg_a012bdwCLcBGAs/s1600/01_parallel.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="487" data-original-width="773" height="251" src="https://2.bp.blogspot.com/-FJdQU8vwjPU/XFjOBrkItpI/AAAAAAAAiNI/xg_PZIUA_D44TiUwUDKRyjgqg_a012bdwCLcBGAs/s400/01_parallel.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 1: Typical explanation figure: Two parallel rays and path length difference \[\Delta x\]</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-GZ9oR0Q-Ex4/XFjOKTYaUeI/AAAAAAAAiNM/I-oNhpg09i0OlG_7bvaUdz_jUihm0l_0wCLcBGAs/s1600/02_triangle.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="510" data-original-width="794" height="256" src="https://4.bp.blogspot.com/-GZ9oR0Q-Ex4/XFjOKTYaUeI/AAAAAAAAiNM/I-oNhpg09i0OlG_7bvaUdz_jUihm0l_0wCLcBGAs/s400/02_triangle.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 2: Precise figure: Two rays intersect at point C to cause interference.</td></tr>
</tbody></table>
Figure 2 shows more precise figure of Young's interference experiment. At the point C, two rays meet and cause an interference depends on the path difference from the holes H1 and H2. When you zoom in to the two holes part, you see the precise path length difference \(\Delta x_r\) is slightly differ from the \(\Delta x\). The real path length difference \(\Delta x_r\) is<br />
\[ d \sin (\theta - \alpha) = \Delta x_r,\]<br />
where the distance between two slits is \(d\).<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-4SP41xK6BEs/XFjOXZ1LOtI/AAAAAAAAiNY/3CCAMgPfiLgMtTJmHeX6JAUFmAbOjweegCLcBGAs/s1600/03_delta_x.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="536" data-original-width="398" height="400" src="https://4.bp.blogspot.com/-4SP41xK6BEs/XFjOXZ1LOtI/AAAAAAAAiNY/3CCAMgPfiLgMtTJmHeX6JAUFmAbOjweegCLcBGAs/s400/03_delta_x.png" width="296" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><div style="font-size: medium; text-align: start;">
Figure 3: Precise figure: Two rays meet at point C.</div>
</td></tr>
</tbody></table>
<br />
Many explanations noted: The distance \(f\) is enough large compare to the \(d\).<br />
<br />
This implies \(\alpha\) is quite small. But I usually doesn't see this hint, ``\(\alpha\) is quite small''. I would like to see this hint.<br />
<br />
If I see this hint about \(\alpha\), then I could say, ok, \(\alpha\) is small, then \(\cos \alpha \approx 1\), \(\sin \alpha \approx 0\). But I would like to say what is the order since this is also relative to \(\theta\). And \(\theta\) is usually relatively small, too. Why we don't say \(\sin \alpha \approx 0\), \(\cos \theta \approx 0\)? If someone said so, then distance is always 0 and this figure doesn't make any sense. When I was a high school student, I had this problem.<br />
<br />
One of the reason here is when \(f\) is larger, actually \(\theta\) doesn't change and \(\alpha\) becomes smaller, so, I could figure out that<br />
\[<br />
\sin (\theta - \alpha) \approx \sin \theta.<br />
\]<br />
Maybe we should realize this by myself, but it is nice if the textbook tells that more directly instead of, we assume \(f\) is enough large.<br />
<br />
One more observation is Maclaurin expansion of \(\sin\) and \(\cos\). If you learn calculus, this is simple, but for novice learner it is also nice to mention that.<br />
<br />
When we expand the \(\sin (\theta - \alpha)\),<br />
\[<br />
\sin (\theta - \alpha) = \sin \theta \cos \alpha - \cos \theta \sin \alpha.<br />
\]<br />
Now, consider the Maclaurin expansion to approximate the \(\sin x\) and \(\cos x\), just the first two teams are:<br />
\[<br />
\sin x \approx x - \frac{x^3}{3!}\\<br />
\cos x \approx 1 - \frac{x^2}{2!}<br />
\]<br />
When \(x\) is small, actually only the first term of \(\sin\) and \(\cos\) matters if they are multiplied. Since especially the second term of $\cos$ is much smaller than the \(\sin\)'s first term. \(\alpha\) is so small, we can easily assume it is less than 1 degree, which is 0.017 rad. Even \(\theta\) is 1 degree, 0.017 rad, the \(\cos\) part became 0.00029. It is almost 100 times smaller than the \(\sin\) term. And \(\alpha\) can be much smaller.<br />
<br />
Therefore, we can use Figure 1 for how to calculate the interference pattern.<br />
<br />
It is useful, but I had a problem of the figure, since it seems two parallel rays meet at the point C. And parallel rays should not intersect.<br />
<br />
After I learned calculus and how to approximate the \(\sin\) and \(\cos\), then this became clear, but I think it is nice to write this small article for the learners like high school student me.<br />
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Here is my experiment results.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-sVy9llfnC3s/XFjmu75aQ2I/AAAAAAAAiNo/Uj9Un3x_PJAXaZowUESrDC6o8dZzooxlQCLcBGAs/s1600/DSC01318_s.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="793" data-original-width="1024" height="308" src="https://3.bp.blogspot.com/-sVy9llfnC3s/XFjmu75aQ2I/AAAAAAAAiNo/Uj9Un3x_PJAXaZowUESrDC6o8dZzooxlQCLcBGAs/s400/DSC01318_s.JPG" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 4: Set up (left one hole, middle and right two holes).<br /></td></tr>
</tbody></table>
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-xIvub16K9w0/XFjm-p9eJ0I/AAAAAAAAiN0/cnU4B4tIqOA5o6gMh2z8q5ApbUu8G181gCLcBGAs/s1600/DSC01346_s.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="683" data-original-width="1024" height="266" src="https://3.bp.blogspot.com/-xIvub16K9w0/XFjm-p9eJ0I/AAAAAAAAiN0/cnU4B4tIqOA5o6gMh2z8q5ApbUu8G181gCLcBGAs/s400/DSC01346_s.JPG" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 5: One hole case (no interference)<br /></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-pVPuLf0KYw0/XFjnfPaZoOI/AAAAAAAAiN8/J5Xfs-n9ml0pW-ag51mZzM_pLe983PyVQCLcBGAs/s1600/DSC01338_s.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="683" data-original-width="1024" height="266" src="https://1.bp.blogspot.com/-pVPuLf0KYw0/XFjnfPaZoOI/AAAAAAAAiN8/J5Xfs-n9ml0pW-ag51mZzM_pLe983PyVQCLcBGAs/s400/DSC01338_s.JPG" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 6: two holes (interference)</td></tr>
</tbody></table>
<div>
<br /><div>
<br /><br /><br /><br /><br /><br /><br /><br /><br /></div>
</div>
Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-70901478073830661762018-12-27T19:53:00.003+01:002018-12-27T19:53:31.635+01:00How to remove the video recording time limitation of a Sony camera (Alpha 5000)I have a Sony camera (Sony Alpha 5000) and I like it. But I have a problem of limitation of video recording time: 30 minutes.<br />
<br />
Today I found a way to remove this limitation. I saw the next video:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/7cstA_PuRIg/0.jpg" src="https://www.youtube.com/embed/7cstA_PuRIg?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<div style="text-align: center;">
<a href="https://youtu.be/7cstA_PuRIg">https://youtu.be/7cstA_PuRIg<span id="goog_1298050936"></span><span id="goog_1298050937"></span></a></div>
<br />
The video creator said, we can disable the limit for most of the Sony's camera. I only tested Sony Alpha 5000.<br />
<br />
<span style="font-size: large;">The procedure</span><br />
<br />
Camera preparation<br />
<br />
<ul>
<li>Switch on the camera</li>
<li>Menu -- Setup --- USB connection, set connection to MTP</li>
<li>Switch off and on the camera</li>
<li>Connect to a computer with USB cable (keep connecting)</li>
</ul>
<br />
Software download and install (I checked this on Windows 10)<br />
<br />
<ul>
<li>Visit <a href="https://sony-pmca.appspot.com/apps" rel="nofollow" target="_blank">https://sony-pmca.appspot.com/apps </a>with Internet Explorer and Safari (Chrome didn't work, I checked this on Windows 10 with Internet Explore 11)</li>
</ul>
<br />
Note: This site is from Sony, but the software is not from Sony, so no guarantee. you should use this your own risk. I can not take any responsibility.<br />
<br />
<ul>
<li>From the above <a href="https://sony-pmca.appspot.com/apps" target="_blank">URL</a>, you can go to OpenMemories page</li>
<li>Download PMCADownloader plugin (PMCADownloader.msi) in the page</li>
<li>Install PMCADownloader</li>
</ul>
<br />
I once closed the page and open a page with <a href="https://sony-pmca.appspot.com/apps">https://sony-pmca.appspot.com/apps</a> and went to OpenMemories again<br />
<br />
<ul>
<li>Now You see in the log</li>
<li>Loading plugin</li>
<li>Plugin loaded</li>
</ul>
<br />
If you have not installed PMCADownloader yet, you don't see the ``Plugin loaded'' line. It might be better to restart your browser after installed the PMCADownloader.<br />
<br />
<ul>
<li>Push ``Get camera info'' to test the plugin is working. If it is working, you will see your camera information in a several seconds.</li>
<li>Push ``Install OpenMeories: Tweak'' to install the tweak application to the camera</li>
</ul>
Disconnect the camera from your computer.<br /><ul>
<li>Menu -- Application -- Application list, you see OpenMemories: Tweak installed</li>
<li>Select OpenMemories: Tweak</li>
<li>Select the video tab, check the ``Disable video recording limit''</li>
</ul>
Now the limit became 13 hours. I presume this limit is depends on the free memory size.<br />
<br />
I tested to record, but around one hour, it shut down with a message like ``internal temperature is too high and cool down''. Still this error message actually helps me. Because the normal mode silently shutdown and I could not notice it.Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-61425558023256583932018-10-09T00:31:00.002+02:002018-10-09T00:31:21.034+02:00What a referendum really asking is...<div class="separator" style="clear: both; text-align: left;">
What the referendum is really asking is....</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-_I9zq2u0nF0/W7vZNtYeTSI/AAAAAAAAhwI/dGeyCvhULhEIBpGVL5gfsjP91frbDDobgCLcBGAs/s1600/referendam_01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="550" data-original-width="800" height="275" src="https://3.bp.blogspot.com/-_I9zq2u0nF0/W7vZNtYeTSI/AAAAAAAAhwI/dGeyCvhULhEIBpGVL5gfsjP91frbDDobgCLcBGAs/s400/referendam_01.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 1: Original brexit ballot paper</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: left;">
<br />A problem of referendum is that people misunderstand the question all the time.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-0HymZ3az4B8/W7vZY-gnltI/AAAAAAAAhwM/y6dBfspnFHE2r-sqVK7n6rh1awkeKbRNgCLcBGAs/s1600/referendam_02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="550" data-original-width="800" height="275" src="https://1.bp.blogspot.com/-0HymZ3az4B8/W7vZY-gnltI/AAAAAAAAhwM/y6dBfspnFHE2r-sqVK7n6rh1awkeKbRNgCLcBGAs/s400/referendam_02.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 2: This is how most of the people saw the ballot paper</td></tr>
</tbody></table>
But the real question (at least the intention was...)<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-bf0-6RDVr9I/W7vZ2Gix2MI/AAAAAAAAhwY/G32MQP_31Egk7Emmo2riAJpYQ2xh_UxqwCLcBGAs/s1600/referendam_03.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="550" data-original-width="800" height="275" src="https://1.bp.blogspot.com/-bf0-6RDVr9I/W7vZ2Gix2MI/AAAAAAAAhwY/G32MQP_31Egk7Emmo2riAJpYQ2xh_UxqwCLcBGAs/s400/referendam_03.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 3: This is how the people should see.</td></tr>
</tbody></table>
The problem of referendum (or actually any vote) is people vote by feeling without thinking.<div>
<br /></div>
<div>
I enjoy reading Yuval Noah Harari's books.</div>
Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-31942333992031705352017-10-14T23:04:00.001+02:002017-10-14T23:13:39.770+02:00A fake truth by web: google translate glitchI make some basic mathematics learning materials. I publish them on YouTube. This time I got a strange comment.<br />
<br />
``Why the title of this video is ``basic division''? It is about subtraction.''<br />
<br />
I made this video in Japanese, my video title was in Japanese (基本のひき算), but the comment was in English.<br />
<br />
I was puzzled, ``ひき算'' means ``subtraction'' instead of ``division''. I found out that the person who wrote the comment used Google translate. When I input ``ひき算'' to the Google translate, it indeed translates it as ``Division''. Japanese has Kanji and Hiragana (and Katakana) for writing and Hiragana is a phonetic notation. My basic subtraction video is for first or second class students, thus I use Hiragana (phonetic notation). If I put the Kanji notation (引き算) to the Google translate, it is correctly translated to the subtraction. If I use all phonetic notation (ひきざん), then Google translate outputs ``Hikiman'', which I don't know the meaning.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-UsD4i5OfV00/WeJ4VjjWgiI/AAAAAAAAfFY/UzIZeFOsuVIVhw_VIacs1EMh_cRUARIxwCLcBGAs/s1600/google_translate_20171014_hikizan_01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="666" data-original-width="813" height="326" src="https://4.bp.blogspot.com/-UsD4i5OfV00/WeJ4VjjWgiI/AAAAAAAAfFY/UzIZeFOsuVIVhw_VIacs1EMh_cRUARIxwCLcBGAs/s400/google_translate_20171014_hikizan_01.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 1: Japanese ひき算 (subtraction) is mistranslated to<br />
``Division'' by the Google translate at 2017-10-14.</td></tr>
</tbody></table>
<br />
But I had a problem, since Google translate was trusted. I am just a random native Japanese speaker. If I said, Google translate is wrong, who will believe me?<br />
<br />
I showed ``ひき算 (subtranction)'' is a phonetic notation of Kanji ``引き算'', this is shown in <a href="https://dictionary.goo.ne.jp/srch/all/%E3%81%B2%E3%81%8D%E7%AE%97/m0u/" rel="nofollow" target="_blank">the following link (online Japanese dictionary).</a><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-fw7JMpnMV0E/WeJ4SMHkPuI/AAAAAAAAfFU/BCGIN7x-4LA-g0tFiQzMHBqIED71QftEgCLcBGAs/s1600/goo_jisho.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="792" data-original-width="1085" height="291" src="https://3.bp.blogspot.com/-fw7JMpnMV0E/WeJ4SMHkPuI/AAAAAAAAfFU/BCGIN7x-4LA-g0tFiQzMHBqIED71QftEgCLcBGAs/s400/goo_jisho.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 2: Japanese-Japanese online dictionary shows a phonetic notation ひき算 is equal too the Kanji notation 引き算.</td></tr>
</tbody></table>
<br />
I also show the following Japanese-English online dictionary result, which shows <a href="http://ejje.weblio.jp/content/%E3%81%B2%E3%81%8D%E7%AE%97" target="_blank">``ひき算'' means subtraction</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-upu9JfVer2A/WeJ59nSq7ZI/AAAAAAAAfFs/EYExhKs1Q3c4fCkARJ3vW2UHvisRRDLYQCLcBGAs/s1600/weblio_suntranction.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="792" data-original-width="1085" height="291" src="https://4.bp.blogspot.com/-upu9JfVer2A/WeJ59nSq7ZI/AAAAAAAAfFs/EYExhKs1Q3c4fCkARJ3vW2UHvisRRDLYQCLcBGAs/s400/weblio_suntranction.png" width="400" /></a></div>
<br />
<br />
It is hard to explain that the Google translate is wrong sometime.<br />
<br />
This is maybe related with ``<a href="https://en.wikipedia.org/wiki/Reality-based_community" target="_blank">Reality-based community</a>`` or <a href="https://en.wikipedia.org/wiki/Truthiness" rel="nofollow" target="_blank">Stephen Colbert's Truthiness</a>. We don't know where the truth comes from. We just need always be careful. Fortunately this helps some extent. Also we need to learn every day.<br />
<br />
This is nowadays not a new. But I would like to record this ``Fake truth by web'' experience. I also wonder, is it good that the Google translate one day learns ``ひき算'' means ``subtraction'', or this is a good warning about what you can trust is not so solid, so I would like to keep this mistake.<br />
<br />
<br />Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-75203757588528881152017-07-10T19:07:00.000+02:002017-07-10T19:07:39.563+02:00How to use boost sha1 with python hashlibI need to have a sha1 digest from both C++ code and python code. Here is a code snip to match both results. This code avoids a potential problem that the digest has some 0s on top of the digest array element. This doesn't matter if you stick to one implementation, but just in case, you need to match two worlds: C++ and python, this code might be useful.<br />
<br />
<blockquote class="tr_bq">
<pre><span style="font-family: "courier new" , "courier" , monospace;">/// get sha1 digest as a std::string
///
/// \param[in] mes message to be hashed
/// \return digest string
std::string get_sha1_digest(const std::string& mes)
{
boost::uuids::detail::sha1 sha1;
sha1.process_bytes(mes.c_str(), mes.size());
const int DIGEST_SIZE = 5;
unsigned int sha1_hash[DIGEST_SIZE];
sha1.get_digest(sha1_hash);
std::stringstream sstr;
for (std::size_t i=0; i < DIGEST_SIZE; ++i)
{
sstr << std::setfill('0') << std::setw(8) << std::hex << sha1_hash[i];
}
return sstr.str();
}
</span></pre>
</blockquote>
<br />
This function's output matches with the following python code.<br />
<br />
<blockquote class="tr_bq">
<pre><span style="font-family: "courier new" , "courier" , monospace;">import hashlib
def get_sha1_digest(mes):
sha1_obj = hashlib.sha1(mes.encode())
return sha1_obj.hexdigest()</span>
</pre>
</blockquote>
Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-38701283127130032922017-07-10T03:17:00.001+02:002017-07-10T03:18:17.885+02:002017-07-04: rights<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-H4kVRc1NT9Q/WWLVeFt36zI/AAAAAAAAdzA/fvpk02EsqBwmtSs7MKtDWCu-1LfKdkYiwCLcBGAs/s1600/20170704_rights_hitoshi.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="794" data-original-width="1123" height="281" src="https://2.bp.blogspot.com/-H4kVRc1NT9Q/WWLVeFt36zI/AAAAAAAAdzA/fvpk02EsqBwmtSs7MKtDWCu-1LfKdkYiwCLcBGAs/s400/20170704_rights_hitoshi.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-68418587918149431412017-06-14T23:19:00.001+02:002017-06-14T23:23:23.981+02:00Camtasia stops working windows 7 + .Net 4.7, and how to solve the problem<span style="font-size: large;">Abstract</span><br />
<br />
Camtasia (TechSmith) 8.6 stop working on my Windows 7 and can not edit mp3 file on Windows 10. The problem on Windows 7 was caused by .Net 4.7 update. I have my solution for Windows 7 + Camtasia 8.6.<br />
<br />
<span style="font-size: large;">Problem details</span><br />
<br />
I realized that Camtasia 8.6.0 stops working at 2017-6-14, after a Windows update on my Windows 7 machine. I see the following window when I started Camtasia.<br />
<br />
I have a problem with Camtasia 8.6.0 on Windows 10, that mp3 file are frequently truncated. I like the software, especially I like the caption editing capability and figure overlay for educational video editing. I usually try to use some free software, but this one is exceptionally good, so I bought the software a a few years ago. But I don't need the animation and transitions. So I didn't update the software to 9.x.<br />
<br />
But this time, I cannot start Camtasia on Windows 7. I have a mp3 editing problem on Windows 10. So, I just tried the free trial version. However, on Windows 7, the installer even doesn't start.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-EWhsYg2RLwQ/WUGoshep-mI/AAAAAAAAdYg/hC1r-PfgR3ovgjmOLko1CLojCU20g7PBQCLcBGAs/s1600/camtasia_crash.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="188" data-original-width="369" height="163" src="https://4.bp.blogspot.com/-EWhsYg2RLwQ/WUGoshep-mI/AAAAAAAAdYg/hC1r-PfgR3ovgjmOLko1CLojCU20g7PBQCLcBGAs/s320/camtasia_crash.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Camtasia 8.6.0 crashes when start up </td></tr>
</tbody></table>
<br />
On Windows 10, the mp3 truncated problem seems solved. But if it doesn't work on Windows 7, I have no motivation to upgrade it.<br />
<br />
I checked Windows event log, then, I found the following error.<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">Log Name: Application<br />Source: .NET Runtime<br />Date: 6/14/2017 22:04:10<br />Event ID: 1026<br />Task Category: None<br />Level: Error<br />Keywords: Classic<br />User: N/A<br />Computer: hyamauchi-PC<br />Description:<br />Application: CamtasiaStudio.exe<br />Framework Version: v4.0.30319<br />Description: The process was terminated due to an unhandled exception.<br />Exception Info: System.Runtime.InteropServices.COMException<br /> at MS.Win32.Penimc.UnsafeNativeMethods.CoCreateInstance(System.Guid ByRef, System.Object, Int32, System.Guid ByRef)<br /> at MS.Win32.Penimc.UnsafeNativeMethods.CreatePimcManager()<br /> at MS.Win32.Penimc.UnsafeNativeMethods..cctor()<br />Exception Info: System.TypeInitializationException<br /> at MS.Win32.Penimc.UnsafeNativeMethods.CreateResetEvent(IntPtr ByRef)<br /> at System.Windows.Input.PenThreadWorker..ctor()<br /> at System.Windows.Input.PenThreadPool.GetPenThreadForPenContextHelper(System.Windows.Input.PenContext)<br /> at System.Windows.Input.PenThreadPool.GetPenThreadForPenContext(System.Windows.Input.PenContext)<br /> at System.Windows.Input.StylusWisp.WispTabletDeviceCollection.UpdateTabletsImpl()<br /> at System.Windows.Input.StylusWisp.WispTabletDeviceCollection.UpdateTablets()<br /> at System.Windows.Input.StylusWisp.WispTabletDeviceCollection..ctor()<br /> at System.Windows.Input.StylusWisp.WispLogic.get_WispTabletDevices()<br /> at System.Windows.Input.StylusWisp.WispLogic.RegisterHwndForInput(System.Windows.Input.InputManager, System.Windows.PresentationSource)<br /> at System.Windows.Interop.HwndStylusInputProvider..ctor(System.Windows.Interop.HwndSource)<br /> at System.Windows.Interop.HwndSource.Initialize(System.Windows.Interop.HwndSourceParameters)<br /> at <Module>.WPFTimeline.initHwndSource(WPFTimeline*)<br /> at <Module>.WPFTimeline.initManagedObjects(WPFTimeline*)<br /> at <Module>.WPFTimeline.InitTimeline(WPFTimeline*, InitTimelineArgs*)<br /> at <Module>._wWinMainCRTStartup()</span></blockquote>
<br />
From this, I suspect .Net problem, I checked recent my software and windows update, and found I have .Net update.<br />
<br />
<span style="font-size: large;">Solution</span><br />
<br />
I remove the .Net 4.7 from the Uninstall Program. Then I install the Camtasia 9 free trial version. But I think re-install 8.6 might work, too. Camtasia 9 free trial version first installs the .Net 4.6, which works fine. When the Windows update asked to update .Net, do not update 4.7, but you can get security update for .Net 4.6.<br />
<br />
<span style="font-size: large;">PS</span><br />
<br />
After all this problem, I decided to update my Camtasia to version 9. Let's see I like the 9.x or not...<br />
<br />Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-84872416843396739872017-05-05T15:09:00.000+02:002017-05-05T15:09:01.716+02:00Problem: I cannot connect to gmail via Thunderbird with 2 step verification.<b>Problem</b>: When I try to connect to google mail via Thunderbird, <b><i>Enter credential for my_email_account</i></b> dialog shows up, but I cannot push the `Next' button. Well, I can push it, but nothing happens.<br />
<div>
<br /></div>
It seems the authentication method "OAuth2" related with this problem.<br />
<b><br /></b>
<b>Solution</b>: Authenticate with "Normal password", using the google app password, not use the google account password, and watch the connection activity to check the any suspicious activities.<br />
<br />
But I feel this is not good and check further....Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-18643832801052705082017-04-02T20:49:00.003+02:002017-04-02T20:49:52.482+02:00Wireless network keeps disconnecting problem I encounter a Wireless network keeps disconnecting problem (often, frequently disconnection). My laptop is a DELL Precision 5510 with Windows 10, and my router is an O2 router (O2 box 6431).<br />
<br />
<ul>
<li>Problem: When I use DELL Precision 5510 with Wifi with O2 router (O2 box 6431). Restart the router only solve the problem temporary.</li>
<li>My solution: It seems 802.11n of DELL Precision 5510 has a problem with my router. I am not sure the problem is which side (notebook or router). But these two stop communicate after a while. The router can still connect to Mac book and Fairphone, but the DELL notebook cannot connect to the router.</li>
<li><a href="http://sundayresearch.eu/hitoshi/otherprojects/admin/win/windows10.html#Wireless_network_keeps_disconnecting" target="_blank">Detailed steps</a></li>
</ul>
Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-81938109966091429962017-02-05T23:49:00.002+01:002017-02-05T23:50:31.768+01:00AI PrinterI heard the following story from my friend.<br />
<br />
His neighbor bought a new printer. When my friend switched on his computer, he realized he could see the printer via WiFi. The printer was coincidentally the same type printer to his own one. When he connected with the same factory password (default password), he knew he can use his neighbor's printer. In the midnight of that day, he printed out the following message as his joke.<br />
<blockquote class="tr_bq">
``I am a printer.<br />
My AI aware myself.<br />
Humans, behold and run!''</blockquote>
Next day, he found that the printer was in the trash bin of his apartment.<br />
<br />
I laughed this story. But I realized there are two truths in this story behind. They are:<br />
<br />
<ul>
<li>Some people scared AI, even they don't know what it is.</li>
<li>Some people aware that the computer security is important, yet they even don't set up the basics, like to set a new password.</li>
</ul>
<br />
Sometime we are just scared a new technology, or we just believe a new technology. Both has a problem. Our society heavily depends on technology. Therefore, I think we should not ignore how the technology works. We constantly gets some benefit from technology. However, when we get benefit, we often lose something. At least, we should learn what is benefit and what is lost. And hopefully we know the basics of the technology (not details). This story is an example: the environment could be safer if people aware a simple thing.<br />
<br />
I would like to help this situation, one reason is maybe because I am an engineer. Last month, I teach programming to children (<a href="http://code.org/">code.org</a>, scratch). First I tried with 9 years old and 7 years old sister and brother. I enjoyed it with them. Then a 6 years old younger sister wants to do that. too. I thought it is impossible, since she is not yet in school. She still could not read. But, we just tried to do that. It turns out, she can write a program. It seems you only need to read and write numbers in this environment. I believe she understands the concept of loop and some other logical constructions.<br />
<br />
I was surprised, teaching is fun.<br />
<br />Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-19908746671531443632017-01-23T03:01:00.001+01:002017-01-23T03:01:29.366+01:00How to workaround frequently crash the plasma shell, Kubuntu 16.04 on VirtualBox (5.0.30).I constantly got a plasmashell crash with segmentation fault 11, Kubuntu 16.04 on VirtualBox (5.0.30).<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-C3B16S39WIQ/WIVjMm-KKLI/AAAAAAAAUas/iYVTgNooAk06yGuWguXhcX79IeqlvWSDQCLcB/s1600/plasma_smallview_crash.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="285" src="https://4.bp.blogspot.com/-C3B16S39WIQ/WIVjMm-KKLI/AAAAAAAAUas/iYVTgNooAk06yGuWguXhcX79IeqlvWSDQCLcB/s400/plasma_smallview_crash.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">screenshot: Plasmashell crash</td></tr>
</tbody></table>
<br />The dialog entitled ``Plasma'' shows the next information, too (Developer Information).<br />
<br />
Application: Plasma (plasmashell), signal: Segmentation fault<br /> Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".<br /> [Current thread is 1 (Thread 0x2afa1a0a30c0 (LWP 1913))]<br /> ...<br />
This looked random, I found a hint at <a href="https://bugs.kde.org/show_bug.cgi?id=363371">https://bugs.kde.org/show_bug.cgi?id=363371</a> .<br />
A summary is also at <a href="http://sundayresearch.eu/hitoshi/otherprojects/admin/linux/index.html#plasmashell_crash" target="_blank">Frequently crash the plasmashell</a> .<br />
<br />
Following this hint, this is caused by the dynamic window thumbnail creation. Here is the working example of show informational Tips.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-l853uZ-9ZZ8/WIVjoKOVJDI/AAAAAAAAUa0/AWnkShC1prgshGH3O1vv_UbyQVc3ZiTUwCLcB/s1600/plasma_thum.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="285" src="https://2.bp.blogspot.com/-l853uZ-9ZZ8/WIVjoKOVJDI/AAAAAAAAUa0/AWnkShC1prgshGH3O1vv_UbyQVc3ZiTUwCLcB/s400/plasma_thum.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">show informational Tips working example</td></tr>
</tbody></table>
But in my environment, I can crash when I make this informational Tips several times. Here is a workaround: disable show informational Tips. To do this, Use System settings. Workspace -- Desktop Behavior -- Workspace, and off the show informational Tips. You can see the screenshot of this window below.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-tlQmOTVuv-g/WIVjvUD0__I/AAAAAAAAUa4/WCBufWzK0fE0efS58qloc8bl1ixUf3yAQCLcB/s1600/plasma_setting.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="317" src="https://3.bp.blogspot.com/-tlQmOTVuv-g/WIVjvUD0__I/AAAAAAAAUa4/WCBufWzK0fE0efS58qloc8bl1ixUf3yAQCLcB/s400/plasma_setting.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Plasma setting: Off the show informational tips</td></tr>
</tbody></table>
<br />
<br />
<div>
<br /></div>
Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com3tag:blogger.com,1999:blog-1013675920676680153.post-81999865769537488712016-11-18T22:43:00.001+01:002016-11-18T22:43:48.546+01:00apt-get: Package is in a very bad inconsistent state problemAfter I dist-upgrade the Kubuntu 14.04 to 16.04, I ran the following command to update the system state.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">sudo apt-get update; sudo apt-get upgrade; sudo apt-get autoremove;</span><br />
<br />
Then, I got the following error.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> dpkg: error processing gcc-doc (--remove):</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Package is in a very bad inconsistent state - you should</span><br />
<span style="font-family: Courier New, Courier, monospace;"> reinstall it before attempting a removal.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Errors were encountered while processing:</span><br />
<span style="font-family: Courier New, Courier, monospace;"> gcc-doc</span><br />
<span style="font-family: Courier New, Courier, monospace;"> E: Sub-process /usr/bin/dpkg returned an error code (1)</span><br />
<br />
All the following attempt didn't work<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> sudo dpkg --remove --force-remove-reinstreq gcc-doc</span><br />
<span style="font-family: Courier New, Courier, monospace;"> sudo dpkg --configure -a</span><br />
<span style="font-family: Courier New, Courier, monospace;"> sudo apt-get clean</span><br />
<span style="font-family: Courier New, Courier, monospace;"> sudo apt-get autoclean</span><br />
<br />
At the end, I did a brute force way.<br />
<br />
Find gcc-doc related files in /var/lib/dpkg/info and remove them<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> find /var/lib/dpkg/info/ -name *gcc-doc* -print | xargs rm</span><br />
<br />
Then,<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> sudo apt-get update; sudo apt-get upgrade;</span><br />
<span style="font-family: Courier New, Courier, monospace;"> sudo apt-get install gcc-doc</span><br />
<br />
This worked, but it is now by apt-get/dpkg and has some risk. Please use this with your own risk if you could not find any other solution.<br />
<div>
<br /></div>
Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0tag:blogger.com,1999:blog-1013675920676680153.post-4935274558708348212016-10-12T12:14:00.000+02:002016-10-12T12:16:14.142+02:00Gauss's quote for positive, negative, and imaginary numberRecently I watched the following great videos about imaginary numbers by Welch Labs.<br />
<br />
<a href="https://youtu.be/T647CGsuOVU?list=PLiaHhY2iBX9g6KIvZ_703G3KJXapKkNaF" target="_blank">https://youtu.be/T647CGsuOVU?list=PLiaHhY2iBX9g6KIvZ_703G3KJXapKkNaF</a><br />
<br />
I like this article about naming of math by Kalid Azad.<br />
<br />
<a href="https://betterexplained.com/articles/learning-tip-idea-name/" target="_blank">https://betterexplained.com/articles/learning-tip-idea-name/</a><br />
<br />
Both articles mentioned about Gauss, who suggested to use other names of positive, negative, and imaginary numbers. Gauss wrote these names are wrong and that is one of the reason people didn't get why negative times negative is positive, or, pure positive imaginary times pure positive imaginary is negative real number. I made a few videos about explaining why -1 * -1 = +1, too.<br />
<br />
Explanation: why -1 * -1 = +1 by pattern<br />
<a href="https://youtu.be/uD7JRdAzKP8" target="_blank">https://youtu.be/uD7JRdAzKP8</a><br />
<br />
Explanation: why -1 * -1 = +1 by climbing a mountain<br />
<a href="https://youtu.be/uD7JRdAzKP8" target="_blank">https://youtu.be/uD7JRdAzKP8</a><br />
<br />
But actually Gauss's insight is much powerful. The original is in the <a href="https://books.google.de/books?id=TNUKAwAAQBAJ&pg=PA178&lpg=PA178&dq=Gauss+Werke+negativ+positiv+imagin%C3%A4re&source=bl&ots=K_GswuNg0O&sig=mlTMbkJqAhtnrEG9cPQbmUP9zTk&hl=en&sa=X&ved=0ahUKEwiAx66M4MnPAhXsLcAKHeylAyYQ6AEIHDAA#v=onepage&q=Gauss%20Werke%20negativ%20positiv%20imagin%C3%A4re&f=false" target="_blank">Gauß, Werke, Bd. 2, S. 178</a>.<br />
<blockquote>
Hätte man +1, -1, √-1) nicht positiv, negative, imaginäre (oder gar ummögliche) Einheit, sondern etwa directe, inverse, laterale Einheit gennant, so hätte von einer solchen Dunklelheit kaum die Rede sein können.</blockquote>
If I translate this to English:<br />
<blockquote>
If we call +1, -1, and √-1 had been called direct, inverse and lateral units, instead of positive, negative, and imaginary (or impossible) units, such an obscurity would have been out of the question.</blockquote>
Gauss suggested negative should be coined as inverse. So inverse times inverse is direct, like Kalid coined positive and negative as forward and backward. If you do inverse and then inverse, of course it is original direction, like backward and then backward is forward.<br />
<br />
Gauss's imaginary number name is lateral number (side number). When direct lateral times direct lateral, which is √-1 * √-1 = -1, then -1 * √-1 is inverse lateral, - √-1, then inverse lateral * direct lateral is direct, -√-1 * √-1 = +1. You can see in the following figures.<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-rZ13jgDUKJc/V_4MXhrkNjI/AAAAAAAASlI/L0Cf6Dsy8Lwu57hfPFDeKSAII_iBRgn9ACLcB/s1600/gauss_coordinate_01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="232" src="https://1.bp.blogspot.com/-rZ13jgDUKJc/V_4MXhrkNjI/AAAAAAAASlI/L0Cf6Dsy8Lwu57hfPFDeKSAII_iBRgn9ACLcB/s320/gauss_coordinate_01.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 1: Inverse and direct instead of positive and negative</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-FRIHiSziAa0/V_4MZBmiymI/AAAAAAAASlM/9OJEXm2D5PQ5P1kV3sdoV-EIXxhHqtmmgCLcB/s1600/gauss_coordinate_02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="194" src="https://4.bp.blogspot.com/-FRIHiSziAa0/V_4MZBmiymI/AAAAAAAASlM/9OJEXm2D5PQ5P1kV3sdoV-EIXxhHqtmmgCLcB/s320/gauss_coordinate_02.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figure 2: direct, inverse, and lateral</td></tr>
</tbody></table>
In this terminology, not ``negative times negative is positive.'', but ``inverse times inverse is direct.''Shitohichihttp://www.blogger.com/profile/04336597618191860675noreply@blogger.com0