<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-57700989516441543</id><updated>2018-03-02T15:03:03.250-01:00</updated><category term="Java"/><category term="MSE"/><category term="boot-land.net"/><category term="CCNA"/><category term="CISCO"/><category term="ubuntu"/><category term="winbuilder"/><category term="wordpress"/><category term="miguel"/><category term="vacations"/><category term="virusremoval.pro"/><category term="Acer One"/><category term="Azores"/><category term="C programming language"/><category term="Toshiba R360"/><category term="WIM"/><category term="WINE"/><category term="Windows"/><category term="dedicated server"/><category term="google apps"/><category term="ninja pendisk"/><category term="phpbb"/><category term="raw editor"/><category term="reboot.pro"/><category term="remedium"/><category term="windpws 7 pwned"/><category term="Avatar"/><category term="C&#39;T"/><category term="CMU"/><category term="Canon Ixus 70"/><category term="Coffee"/><category term="Coimbra"/><category term="DDOS"/><category term="DoD"/><category term="EJB"/><category term="FindBugs"/><category term="GALP"/><category term="HSQL"/><category term="HTC PDA"/><category term="HTTP server"/><category term="ISOstick"/><category term="LOC counter"/><category term="Laptop"/><category term="MS"/><category term="Mac OSX"/><category term="Mint"/><category term="OSX"/><category term="PE header"/><category term="PSP"/><category term="Pittsburgh"/><category term="Pittsburgh."/><category term="R1Soft"/><category term="SVN"/><category term="StarCraft"/><category term="Stock Market"/><category term="UML editor"/><category term="UPB"/><category term="Universidade de Coimbra"/><category term="addons2wpi"/><category term="android"/><category term="apache"/><category term="app engine"/><category term="baby nuno  carla azores"/><category term="barack obama"/><category term="beam"/><category term="biography"/><category term="birthday"/><category term="bizarre world"/><category term="botnet"/><category term="coffee ninja sponsor"/><category term="database"/><category term="desktop"/><category term="desktop path"/><category term="domain"/><category term="eclipse"/><category term="electric"/><category term="email redirection"/><category term="exam season"/><category term="familly"/><category term="flippa.com"/><category term="free"/><category term="freeware"/><category term="gadget"/><category term="gmail"/><category term="godaddy"/><category term="google ads"/><category term="google friend connect"/><category term="hi5"/><category term="hive"/><category term="law suit"/><category term="lenovo U310"/><category term="life questions"/><category term="litePHP"/><category term="meat"/><category term="minimum wage"/><category term="mom"/><category term="msfn.org"/><category term="mysql"/><category term="netbeans"/><category term="peper"/><category term="phone"/><category term="phpmyadmin"/><category term="pocket pc"/><category term="raw registry"/><category term="razor cms"/><category term="registry"/><category term="remote posting"/><category term="reviews"/><category term="romans"/><category term="samsung"/><category term="scooter"/><category term="security"/><category term="slay"/><category term="stack overflow"/><category term="summer tent beach carla nuno"/><category term="summer terceira"/><category term="tortoise"/><category term="ubuntu 8.04 VirtualBox 1.6 Personal Edition"/><category term="ubuntu 8.04 VirtualBox 1.6 Personal Edition Host USB"/><category term="ubuntu 8.10"/><category term="ubuntu 8.10 virtualbox"/><category term="ubuntu laptop HP Pavilion tx1000"/><category term="ubuntu mac virtualbox"/><category term="ubuntu virtualbox init.d boot start virtual machine"/><category term="university carla"/><category term="unix"/><category term="vista uac"/><category term="watch"/><category term="web 3.0"/><category term="wife"/><category term="wiki"/><category term="xmarks"/><category term="yEd"/><title type='text'>brito</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default?alt=atom&amp;start-index=26&amp;max-results=25'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>262</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-4451455552313367751</id><published>2018-02-17T21:05:00.000-01:00</published><updated>2018-02-20T17:29:21.148-01:00</updated><title type='text'>IPFS: the missing link for our future</title><content type='html'>There is a new way to store files online, it is called IPFS: &lt;a href=&quot;https://ipfs.io/&quot;&gt;https://ipfs.io/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a decentralized network that functions on top of the Internet. The idea is that you can publish a file of any kind online and anyone else can decide to host the same file so you are not alone.&lt;br /&gt;&lt;br /&gt;We have torrents. We have similar projects from the past and likely more in the future that are available, why would this one be special?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This one is easy to use. Has a catchy name and simply works.&lt;br /&gt;&lt;br /&gt;For those interested in cyber-archaeology, the worse fear is that any given server will fail at some point. Geocities went gone, thousands of forum sites disappear per year, let alone the small zip files and other resources that we will not be finding again, so soon.&lt;br /&gt;&lt;br /&gt;IPFS proposes a good way to preserve that link with our future, before it goes missing. Uploading new files is simple, straightforward and anonymous. The potential is there.&lt;br /&gt;&lt;br /&gt;Imagine our forum software being rewritten one day to simply store the content on text files and permit any viewer to iterate and use this data. Even as the original server goes offline, the forum itself would continue to function as read-only on the very least.&lt;br /&gt;&lt;br /&gt;Same for image and attachment hosting. Today, the server for one forum is hosting the attachments and images that are posted by end-users. With IPFS exists the option for any user to store those same files and thus preserve them when they are no longer available on the original location.&lt;br /&gt;&lt;br /&gt;This matters not only for the future, it matters too for geographies where Internet access blocked to certain sites today. Or even better, just imagine how unimaginably difficult it is today to read a forum site without being monitored online through your operating system, the network cables, the web browser and the javascript libraries that simply tell the whole world what you are doing online, at any given moment.&lt;br /&gt;&lt;br /&gt;In the end of the day: decentralization is the basis of our Internet.&lt;br /&gt;It is our place where anyone, anywhere, anyhow can share knowledge at anytime.&lt;br /&gt;&lt;br /&gt;Let&#39;s keep it that way.&lt;br /&gt;&lt;br /&gt;Try out IPFS by yourself, and see today how the future looks like.. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/4451455552313367751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2018/02/ipfs-missing-link-on-our-future.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/4451455552313367751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/4451455552313367751'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2018/02/ipfs-missing-link-on-our-future.html' title='IPFS: the missing link for our future'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-3790886399292684551</id><published>2018-01-01T17:00:00.000-01:00</published><updated>2018-01-01T17:33:05.946-01:00</updated><title type='text'>10 things to learn from the 1 400 000 000 passwords/emails leaked to public</title><content type='html'>Just writing 1.4 billion doesn&#39;t work.&lt;br /&gt;&lt;br /&gt;To visually understand how big this recent leak of data was, you really need to count slowly the zeros on the title of this post.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-sj1e8sm4haU/Wkp2y_gkk1I/AAAAAAAAR_I/9M9gyyr0oJUvU7rZ31v18N0cdl4-FofhwCLcBGAs/s1600/liam-passwords.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;400&quot; data-original-width=&quot;550&quot; height=&quot;232&quot; src=&quot;https://1.bp.blogspot.com/-sj1e8sm4haU/Wkp2y_gkk1I/AAAAAAAAR_I/9M9gyyr0oJUvU7rZ31v18N0cdl4-FofhwCLcBGAs/s320/liam-passwords.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;That&#39;s data that anyone with some time will be able to find. It is not awfully recent, it is from about 2016 and most of the major websites such as google, linkedin, dropbox and similar have already forced their customers to change the password they were using.&lt;br /&gt;&lt;br /&gt;Still, (and this is a big still), The amount of information that you can extract from this database with 1400000000 user accounts is simply gigantic.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;10 things anyone can learn about you:&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Knowing your old password means that anyone can also query that same password and find other email accounts that you are using&amp;nbsp; (for example, gmail accounts)&lt;/li&gt;&lt;li&gt;An attacker can likely spot a pattern that they can try in other sites. For example: &quot;linkedin1970&quot; as password will give a hint that they can try at other sites replacing the &quot;linkedin&quot; portion&lt;/li&gt;&lt;li&gt;For big organizations, it is hundreds if not thousands of email addresses from real employees that can now be targeted for phishing&lt;/li&gt;&lt;li&gt;Passwords are intimate, often reveal what is on the mind of the user. Some passwords are too revealing (e.g. sexual orientation, religion, romantic partners) and this information can be used against them (blackmail, defamation)&lt;/li&gt;&lt;li&gt;Revealing identities, you have people belonging to a company or organization that do not want this information to be public&lt;/li&gt;&lt;li&gt;Email patterns, learn the pattern under which the emails are created such as &quot;John.Doe@acme.com&quot;, &quot;jdoe@acme.com&quot;, &quot;john@acme.com&quot; or some other combination that helps attackers to guess the email address of another person inside the same company that they want to target&lt;/li&gt;&lt;li&gt;Discovering your nationality or real name, based on the country portion of the domains where your accounts are using&lt;/li&gt;&lt;li&gt;Discovering previous companies where a person has worked&lt;/li&gt;&lt;li&gt;Get direct email access to the CEO/CTO of smaller companies&lt;/li&gt;&lt;li&gt;Passwords hint your security knowledge. Looking at the same organisation, a person using special characters will look more knowledgeable than another using only simple words. This helps attackers to pick users likely to fall for social engineering traps&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The potential for misuse and abuse is there.&lt;br /&gt;&lt;br /&gt;Passed a good part of last week looking at the data, cleaning up the records and verifying their authenticity. This data is real, even my mom had her password listed there.&lt;br /&gt;&lt;br /&gt;Some cases were just weird. While looking up for the name of a known criminal as test, the first match indicates that he had an email account with a very small email provider in Switzerland.&amp;nbsp; In other cases such as the accounts from domains belonging to football clubs, the large majority of these passwords included the name of the football club inside them (e.g. &quot;benfica1&quot;). One of these clubs had recently passed through problems as their emails got leaked to public. After looking at their password practices, I can really understand why it wasn&#39;t that difficult to guess them.&lt;br /&gt;&lt;br /&gt;What seems more troubling is the amount of people using their company emails for registration in external sites. Certainly in many cases it is a necessary action, can&#39;t stress enough that this type of thing should be avoided as much as possible.&lt;br /&gt;&lt;br /&gt;Change your passwords and use two-step authentication when available. Over the next two weeks we will see so many people losing their privacy, so please change your own passwords without delay.&lt;br /&gt;&lt;br /&gt;Want to help your friends? Make sure they read this page so they can also learn. That&#39;s good karma being built on 2018 right from the start.&lt;br /&gt;&lt;br /&gt;Stay safe out there. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/3790886399292684551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2018/01/10-things-to-learn-from-1-400-000-000.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/3790886399292684551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/3790886399292684551'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2018/01/10-things-to-learn-from-1-400-000-000.html' title='10 things to learn from the 1 400 000 000 passwords/emails leaked to public'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-sj1e8sm4haU/Wkp2y_gkk1I/AAAAAAAAR_I/9M9gyyr0oJUvU7rZ31v18N0cdl4-FofhwCLcBGAs/s72-c/liam-passwords.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-7424344706352287271</id><published>2017-06-14T07:30:00.001+00:00</published><updated>2017-06-14T07:30:44.477+00:00</updated><title type='text'>Flat files are faster than databases (for my purpose)</title><content type='html'>I&#39;ve tried. I&#39;ve honestly tried (again) to use databases for the purpose of storing tens of million entries but it is just too slow.&lt;br /&gt;&lt;br /&gt;Over the past week I&#39;ve been trying different approaches for storing file hashes inside a database, so that it would become possible to do neat queries over the data without needing to re-invent the wheel like we have done in past.&lt;br /&gt;&lt;br /&gt;Our requirements are tough because we are talking about tens of million, if not billion entries and being capable of providing database answers on plain normal laptops without any kind of installation happening. The best candidate for this job seemed to be H2 database, after previously trying SQLite and HSQLDB.&lt;br /&gt;&lt;br /&gt;The first tries were OK with a small sample but then became sluggish when adding data in larger scale. There was a peak of performance at the beginning and then it would creep to awful slowness as the database got bigger. Further investigation helped with the performance, disabling the indexation, cache and other details that would get on the way of a mass data insert. Still, I would wait 1~2 days and the slow speed wouldn&#39;t give confidence that the data sample (some 4Tb with 19 million computer files) could be iterated in useful time.&lt;br /&gt;&lt;br /&gt;So, went back to the old school methods and used plain flat files using CSV format. It was simpler to add new files. It was easy to view with a text editor if things were being written as intended, it was simpler to count how much data had already been inserted during the data extraction. And it was fast, not simply fast, it was surprisingly fast and completed the whole operation under 6 hours.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://image.prntscr.com/image/75vGzezCQzeg7aokrcWFrg.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;228&quot; data-original-width=&quot;800&quot; height=&quot;180&quot; src=&quot;https://image.prntscr.com/image/75vGzezCQzeg7aokrcWFrg.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It is frustrating to try using a fancy database and then end up using the traditional methods, simply because they are reliable and faster than other options. I&#39;ve tried, but for now will continue using flat files to index large volumes of data.</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/7424344706352287271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2017/06/flat-files-are-faster-than-databases.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/7424344706352287271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/7424344706352287271'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2017/06/flat-files-are-faster-than-databases.html' title='Flat files are faster than databases (for my purpose)'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-9137348698618800398</id><published>2017-06-08T18:46:00.001+00:00</published><updated>2017-06-08T19:45:19.701+00:00</updated><title type='text'>Getting started with the H2 database</title><content type='html'>&lt;a href=&quot;https://4.bp.blogspot.com/-1iaJ9GaYYZI/WTmbYl4Y5PI/AAAAAAAAPoo/n3GUM_yA1hUYaHrOv6nvj21kqfit0LGpQCLcB/s1600/NoSQL-DBMS.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;857&quot; data-original-width=&quot;851&quot; height=&quot;200&quot; src=&quot;https://4.bp.blogspot.com/-1iaJ9GaYYZI/WTmbYl4Y5PI/AAAAAAAAPoo/n3GUM_yA1hUYaHrOv6nvj21kqfit0LGpQCLcB/s200/NoSQL-DBMS.jpg&quot; width=&quot;198&quot; /&gt;&lt;/a&gt;H2 database is a small and compact way to store data directly from Java, especially because it can use simple binary files as storage. My goal with these things is performance and large scale indexing of data. When speaking about large scale, I&#39;m talking about hundreds of million rows.&lt;br /&gt;&lt;br /&gt;On this blog post I&#39;m adding some of the things that are useful for those interested in debugging this database.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Starting an interactive shell&lt;/h3&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;java -cp h2.jar org.h2.tools.Shell -url jdbc:h2:./test.mv.db -user xyz -password 123456&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;Where you should adjust:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;h2.jar&lt;/span&gt;&lt;/b&gt; is the library jar file from H2 (just a single file)&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;./test.mv.db&lt;/span&gt;&lt;/b&gt; is the filename for your database&lt;/li&gt;&lt;li&gt;&quot;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;xyz&lt;/b&gt;&lt;/span&gt;&quot; and &quot;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;123456&lt;/b&gt;&lt;/span&gt;&quot; are the user and password &lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Hello World (writing your first data and database to disk)&lt;/h3&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;import&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;java.sql.Connection;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;import&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;java.sql.DriverManager;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;import&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;java.sql.ResultSet;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;import&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;java.sql.Statement;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Start {&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java preprocessor&quot;&gt;/**&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java preprocessor&quot;&gt;* @param args&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java preprocessor&quot;&gt;*/&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;static&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;main(String[] args)&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;{&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;try&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;{&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;Class.forName(&lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;org.h2.Driver&quot;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;Connection con = DriverManager.getConnection(&lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;jdbc:h2:~/test&quot;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;, &lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;test&quot;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;, &lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;&quot;&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;Statement stmt = con.createStatement();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number18 index17 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java comments&quot;&gt;//stmt.executeUpdate( &quot;DROP TABLE table1&quot; );&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number19 index18 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;stmt.executeUpdate( &lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;CREATE TABLE table1 ( user varchar(50) )&quot;&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number20 index19 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;stmt.executeUpdate( &lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;INSERT INTO table1 ( user ) VALUES ( &#39;Claudio&#39; )&quot;&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number21 index20 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;stmt.executeUpdate( &lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;INSERT INTO table1 ( user ) VALUES ( &#39;Bernasconi&#39; )&quot;&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number23 index22 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;ResultSet rs = stmt.executeQuery(&lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;SELECT * FROM table1&quot;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number24 index23 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;while&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;( rs.next() )&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number25 index24 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;{&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number26 index25 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;String name = rs.getString(&lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;user&quot;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number27 index26 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;System.out.println( name );&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number28 index27 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number29 index28 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;stmt.close();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number30 index29 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;con.close();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number31 index30 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number32 index31 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;catch&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;( Exception e )&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number33 index32 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;{&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number34 index33 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;System.out.println( e.getMessage() );&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number35 index34 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number36 index35 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number37 index36 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;This example was retrieved from Claudio Bernasconi (thank you!):&lt;br /&gt;&lt;a href=&quot;http://www.claudiobernasconi.ch/2010/08/17/h2-embedded-java-db-getting-started/&quot; target=&quot;_blank&quot;&gt;http://www.claudiobernasconi.ch/2010/08/17/h2-embedded-java-db-getting-started/ &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Relevant commands&lt;/h3&gt;To list your tables inside the database:&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;SHOW TABLES;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To list everything inside a table:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;SELECT * FROM MyTABLE;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Where &quot;MyTable&quot; is naturally the name for your table.&lt;br /&gt;&lt;br /&gt;Showing which INDEXES are associated with a table:&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;SELECT * FROM information_schema.indexes WHERE table_schema = &#39;PUBLIC&#39; AND table_name=&#39;MyTable&#39;; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;b&gt;Relevant links related to performance&lt;/b&gt;&lt;/h3&gt;Several switches to improve performance:&amp;nbsp;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;http://iliachemodanov.ru/en/blog-en/21-databases/42-h2-performance-en&quot;&gt;http://iliachemodanov.ru/en/blog-en/21-databases/42-h2-performance-en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some people say that an active INDEX will slow down large scale data entry:&lt;br /&gt;&lt;a href=&quot;https://groups.google.com/forum/#!msg/h2-database/7U99fWMaMw0/FbpkXgWIrDcJ&quot;&gt;https://groups.google.com/forum/#!msg/h2-database/7U99fWMaMw0/FbpkXgWIrDcJ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Learn to add multiple data fields per SQL call to speed things up further:&lt;br /&gt;&lt;a href=&quot;https://stackoverflow.com/a/19682518&quot;&gt;https://stackoverflow.com/a/19682518&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/9137348698618800398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2017/06/getting-started-with-h2-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/9137348698618800398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/9137348698618800398'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2017/06/getting-started-with-h2-database.html' title='Getting started with the H2 database'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-1iaJ9GaYYZI/WTmbYl4Y5PI/AAAAAAAAPoo/n3GUM_yA1hUYaHrOv6nvj21kqfit0LGpQCLcB/s72-c/NoSQL-DBMS.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-2003158292005430617</id><published>2017-01-05T14:23:00.002-01:00</published><updated>2017-02-18T11:57:27.787-01:00</updated><title type='text'>New name</title><content type='html'>One of the new year resolutions is to make changes where changes were due.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-RBTNImCoxOw/WG5kpEY2LrI/AAAAAAAAPPc/qGzKN5P8FukOBIi-tHPCPh-pJ_me3cKngCLcB/s1600/new-name.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://2.bp.blogspot.com/-RBTNImCoxOw/WG5kpEY2LrI/AAAAAAAAPPc/qGzKN5P8FukOBIi-tHPCPh-pJ_me3cKngCLcB/s320/new-name.jpg&quot; width=&quot;278&quot; /&gt;&lt;/a&gt;&lt;/div&gt;And one of those changes is the online identity. It has been some years since my first name is perfectly comprehensible in Portuguese/Spanish language but always causing some confusion in other languages. Too often my (already short) first name with just four letters would be confused in different variations. Other times I would be left explaining what is the root origin of that name. It doesn&#39;t help one bit as most of my time is passed traveling and living in non-Latin lands.&lt;br /&gt;&lt;br /&gt;In the end of the day, it isn&#39;t something that I see value in continuing because my own preference of a first name is different. My preference is for an international name that works good in whatever location. So, name changed. This transition should only be completed around 2020. In the meanwhile please do accept my apologies in advance for any confusion this might bring until the dust settles.&lt;br /&gt;&lt;br /&gt;If you met me through the old name, please do continue referring to the old name if you really prefer. From here forward, you might find my name written simply as Max.</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/2003158292005430617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2017/01/new-name.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/2003158292005430617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/2003158292005430617'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2017/01/new-name.html' title='New name'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-RBTNImCoxOw/WG5kpEY2LrI/AAAAAAAAPPc/qGzKN5P8FukOBIi-tHPCPh-pJ_me3cKngCLcB/s72-c/new-name.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-6442195540935736662</id><published>2017-01-03T08:43:00.000-01:00</published><updated>2017-01-05T14:41:11.409-01:00</updated><title type='text'>Compiling Java apps as native x86 Windows executables</title><content type='html'>This was quite a holy grail some years ago.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-W1MpiLzcOPQ/WGtx_pwu2xI/AAAAAAAAPPM/UAYqam06MGkgryQxcpdh8KdvincBb_UHwCLcB/s1600/java-everywhere.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://3.bp.blogspot.com/-W1MpiLzcOPQ/WGtx_pwu2xI/AAAAAAAAPPM/UAYqam06MGkgryQxcpdh8KdvincBb_UHwCLcB/s320/java-everywhere.jpg&quot; width=&quot;298&quot; /&gt;&lt;/a&gt;The flexibility of Java turned into an easy to run application for Windows. If you are interested in compiling your Java-based software into native Windows applications, then you probably looked into options such as GCJ and wrappers. The problem is that GCJ is more like a myth nowadays where it is not clear if that thing works and wrappers, well. They are wrappers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There is an alternative. A way to compile Java code directly into x86 binaries that run under Windows without needing .NET or any other intermediate platform. You are welcome to enter the world of Mono and IKVM.&lt;br /&gt;&lt;br /&gt;You should read this page:&lt;br /&gt;&lt;a href=&quot;http://www.mono-project.com/docs/about-mono/languages/java/&quot;&gt;http://www.mono-project.com/docs/about-mono/languages/java/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first step is compiling your jar file into a .NET executable using IKVMC, this is as simple as downloading the most recent tools from:&lt;br /&gt;&lt;a href=&quot;http://weblog.ikvm.net/default.aspx&quot;&gt;http://weblog.ikvm.net/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Attention: these tools only run on Windows 7 and above (you can likely run in XP by installing a modern .NET version).&lt;br /&gt;&lt;br /&gt;Then place your jar file inside the .\bin folder. Head out to the command prompt on that folder and type:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;ikvmc myApp.jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Where &quot;myApp.jar&quot; is obviously the jar you want to transform. If you have additional jars to be added as classpath, look on the syntax page for instructions. On my case I already ship a &quot;fat jar&quot; where every other jar files get merged into a single one in any case.&lt;br /&gt;&lt;br /&gt;The compilation will likely show you that some classes are missing, that is mostly references on the code for things that were not found. On my case none of them were used so not really a problem, they were just warnings and you get a Windows .NET executable as output.&lt;br /&gt;&lt;br /&gt;When running for the first time it failed. Was complaining that the a java.util.date method was returning a null value.&amp;nbsp; There is something to know about IKVM, it is an implementation of the JVM but it is not perfect. So you might need to adapt slightly the code so that it doesn&#39;t touch on the methods not supported by IKVM. On this case, I just removed the part of the code that was failing since it was not critical and then everything worked.&lt;br /&gt;&lt;br /&gt;Now you have a .NET executable.&lt;br /&gt;&lt;br /&gt;You will need to ship it together with some of the IKVM dll files. The minimum files to include are IKVM.OpenJDK.Core.dll and IKVM.Runtime.dll. However, you might need additional DLL files from the IKVM distribution depending on the functionalities that you are using. This is mostly a trial and error approach until you find which files are really needed. The end result is that you get an executable that you won&#39;t need to ship with a JVM or ask end-users to install one (under Windows).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The final step in case you are interested, is to remove the .NET dependency. This might be useful for the cases where you want to run on bare-metal Windows from older versions such as Windows 95, all the way up to newer versions where x86 code is supported. That is where Mono helps. Take a look on this section: &lt;a href=&quot;http://www.mono-project.com/docs/about-mono/languages/java/#compiling-java-code-to-x86-code&quot;&gt;http://www.mono-project.com/docs/about-mono/languages/java/#compiling-java-code-to-x86-code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Taking the executable created on the previous steps,&amp;nbsp; basically install the Mono setup (about 1Gb of disk space after installation) and type:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;mono --aot myApp.exe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will generate a set of files, refer to the previous link for additional details. Hopefully making your app run completely native under Windows. I&#39;m yet to test the performance of native x86 Java binaries vs the bytecode versions running on the JVM. My initial expectation is that the Oracle/OpenJDK JVM is faster because but this might be a false impression.&amp;nbsp; If you manage to test the performance just let me know.&lt;br /&gt;&lt;br /&gt;Have fun! :-)</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/6442195540935736662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2017/01/compiling-java-apps-as-native-x86.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/6442195540935736662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/6442195540935736662'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2017/01/compiling-java-apps-as-native-x86.html' title='Compiling Java apps as native x86 Windows executables'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-W1MpiLzcOPQ/WGtx_pwu2xI/AAAAAAAAPPM/UAYqam06MGkgryQxcpdh8KdvincBb_UHwCLcB/s72-c/java-everywhere.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-7111164850676147189</id><published>2016-10-14T10:38:00.000+00:00</published><updated>2016-10-17T14:10:53.192+00:00</updated><title type='text'>The value of privacy</title><content type='html'>At TripleCheck things are never stable nor pretty, same old news. However, data archival and search algorithms kept booming beyond expectations, both of them estimated to grow 10x over the next 12 months as we finally add up more computing power and storage. So, can&#39;t complain about that.&lt;br /&gt;&lt;br /&gt;What I do complain today is about privacy. More specifically, the value of anonymity. One of the business models we envisioned for this technology is the capacity to break source code apart and discover who really wrote each part of the source code. We see it as a wonderful tool for plagiarism detection, but one of the remote scenarios also envisioned was uncovering the identity for hidden authors of malware.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-u6CQT5vf5pM/WAC09ZJeGVI/AAAAAAAAO0s/RgL7SlJEJ3Yh6INhlIA2lLlLi2VRgOdFgCLcB/s1600/vegeta-malware.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;223&quot; src=&quot;https://1.bp.blogspot.com/-u6CQT5vf5pM/WAC09ZJeGVI/AAAAAAAAO0s/RgL7SlJEJ3Yh6INhlIA2lLlLi2VRgOdFgCLcB/s400/vegeta-malware.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Malware authorship detection had been an hypothesis. It made good sense to help catch these malware authors, the &quot;bad guys&quot; and bring them to justice when committing cyber-warfare.&amp;nbsp; There hadn&#39;t been many chances to test this kind of power measuring over the past year because we are frankly too busy with other topics.&lt;br /&gt;&lt;br /&gt;But today that changed. Was reading the news about an IoT malware spread into the wild, whose source code got published in order to maximize damage: &lt;br /&gt;&lt;a href=&quot;http://www.darknet.org.uk/2016/10/mirai-ddos-malware-source-code-leaked/&quot;&gt;http://www.darknet.org.uk/2016/10/mirai-ddos-malware-source-code-leaked/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For those not understanding why someone makes malware code public on this context, it is because &quot;script kiddies&quot; will take that code, make changes and amplify its damaging reach. The author was anonymous and nowadays seems easy to just blame the Russians for every hack out there. So I said to myself: &lt;i&gt;&quot;let&#39;s see if we can find who really wrote the code&quot;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Downloaded the source code for the original Mirai malware, which can be downloaded from:&lt;a href=&quot;https://github.com/jgamblin/Mirai-Source-Code&quot;&gt; https://github.com/jgamblin/Mirai-Source-Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Scanned the source code through the tool and started seeing plagiarism matches on the terminal.&lt;br /&gt;&lt;br /&gt;What I wasn&#39;t expecting was that it generated such a clear list. In less than 10 minutes had already narrowed the matches to a single person on the Internet. For a start, he surely wasn&#39;t Russian. I&#39;ve took the time to go deeper and see what he had been doing in previous years, previous projects and areas of interest. My impression is that he might feel disgruntled with &quot;the system&quot;, specifically about the lack of security and privacy that exists nowadays. That this malware was his way of demonstrating to public that IoT can be too easily exploited and this is urgent to change.&lt;br /&gt;&lt;br /&gt;And then I was sad.&lt;br /&gt;&lt;br /&gt;This didn&#39;t looked like a &quot;bad guy&quot;, he wasn&#39;t doing it for profit. This was a plain engineer like me. I could read his posts and see what he wrote about this lack of device security to no avail, nobody listened. Only when something bad happens, people listen. Myself couldn&#39;t care less about IoT malware until this exploit was out in the wild, so what he did worked.&lt;br /&gt;&lt;br /&gt;If his identity would now be revealed, this might mean legal repercussions for an action that in essence is today forcing manufacturers to fix their known security holes &lt;i&gt;(they wouldn&#39;t fix otherwise because it costs them extra money per device)&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Can we really permit cases where after talking gets nothing done, only an exploit forces these fixes to happen in the future?&lt;br /&gt;&lt;br /&gt;I don&#39;t know the answer. All that I know is that an engineer with possibly good intentions released the source code to fix a serious security hole before it would grow bigger &lt;i&gt;(IoT devices grow every year)&lt;/i&gt;. That person has published the code under the presumption of anonymity, which our tech is now be able to uncover and possibly bring damage to a likely good person and engineer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/7111164850676147189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2016/10/the-value-of-privacy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/7111164850676147189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/7111164850676147189'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2016/10/the-value-of-privacy.html' title='The value of privacy'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-u6CQT5vf5pM/WAC09ZJeGVI/AAAAAAAAO0s/RgL7SlJEJ3Yh6INhlIA2lLlLi2VRgOdFgCLcB/s72-c/vegeta-malware.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-8678512888322077185</id><published>2016-05-22T19:58:00.000+00:00</published><updated>2016-05-22T22:59:26.832+00:00</updated><title type='text'>TripleCheck GmbH</title><content type='html'>The news are official, TripleCheck is now a German company in full right.&lt;br /&gt;&lt;br /&gt;It was already a registered company since 2013. But it was labelled as a &quot;hobby&quot; company because of the unfortunate UG (haftungsbeschränkt) tag for young companies in Germany.&lt;br /&gt;&lt;br /&gt;You might be wondering at this point: &lt;i&gt;&quot;what is the fuss all about?&quot;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-C4SQuOzO5TY/V0INgBR64YI/AAAAAAAAN2w/SQAAwo-fok4KX3w31T2m5Qm3HNeV1-3LACLcB/s1600/frozen-cat.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://3.bp.blogspot.com/-C4SQuOzO5TY/V0INgBR64YI/AAAAAAAAN2w/SQAAwo-fok4KX3w31T2m5Qm3HNeV1-3LACLcB/s400/frozen-cat.jpg&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;In Germany, a normal company needs to be created with a minimum of 25 000 EUR on the company bank account. When you don&#39;t have that much money, you can start a company with a minimum of one Euro, or as much you can, but you get labelled as UG rather than GmbH.&lt;br /&gt;&lt;br /&gt;When we first started the company, I couldn&#39;t care less about UG vs. GmbH kind of discussion. It was only when we first started interacting with potential customers in Germany that we understood the problem. Due to this UG label, your company is seen as unreliable. It soon became frequent to hear: &lt;i&gt;&quot;I&#39;m not sure if you will be around in 12 months&quot;&lt;/i&gt; and this came with other implications such as banks refusing to grant us a credit card linked to the company account.&lt;br /&gt;&lt;br /&gt;Some people joke and observe that UG stands for &quot;Untergrund&quot;, in the sense that this type of company has strong odds of not floating and going under the ground within some months. Sadly true. &lt;br /&gt;&lt;br /&gt;You see, in theory a company can save enough money on the bank account until it reaches 25k EUR to then upgrade. In practice, we can make money but at the same time have servers, salaries and other heavy costs to pay. Moving the tick to 25k is quite a pain. Regardless of how many thousands of Euros are made and then spent across the year, that yearly flow of revenue does not count unless you have a screenshot showing the bank account above the magic 25k.&lt;br /&gt;&lt;br /&gt;This month we finally broke that limitation.&lt;br /&gt;&lt;br /&gt;No more excuses. We simply went way above that constraint and upgraded the company into full GmbH. Ironically, this only happened when our team moved temporarily out of Germany and is opening a new office elsewhere in Europe.&lt;br /&gt;&lt;br /&gt;Finally a GmbH. Have to say that Germany in some instances is very &lt;i&gt;unfriendly&lt;/i&gt; to startups. The UG situation reduces chances of a young startup to compete at the same level as a GmbH company, even when the technology is notoriously more advanced on the UG company.&lt;br /&gt;&lt;br /&gt;As example, in the United Kingdom you can get a Ltd. company and you are in the same standing level as the large majority of companies. Ironically, we could have registered a Ltd. in the UK without money on the bank and then use this status in Germany to look &quot;better&quot; than a plain boring GmbH.&lt;br /&gt;&lt;br /&gt;The second thing that bothers me are taxes. As UG we pay the same level of taxes as a GmbH in full. Whereas in the UK you get tax breaks when starting an innovative company. In fact, you get back 30% of your expenses with developers (any expense considered as R&amp;amp;D) in that country. From Germany we only got heavy invoices of tax bills to pay every month.&lt;br /&gt;&lt;br /&gt;I&#39;m happy that we are based in Germany. We struggled to survive and move up to GmbH as you can see. We carved our place in Darmstadt against the odds. But Germany, you are really losing your competitive edge when there exist so many advantages for Europeans to open up startups in UK rather than DE. Let&#39;s try to improve that, shall we? :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/8678512888322077185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2016/05/triplecheck-gmbh.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/8678512888322077185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/8678512888322077185'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2016/05/triplecheck-gmbh.html' title='TripleCheck GmbH'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-C4SQuOzO5TY/V0INgBR64YI/AAAAAAAAN2w/SQAAwo-fok4KX3w31T2m5Qm3HNeV1-3LACLcB/s72-c/frozen-cat.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-8107571599285151083</id><published>2016-03-03T08:50:00.000-01:00</published><updated>2016-03-05T12:31:56.677-01:00</updated><title type='text'>Intuitive design for command line switches</title><content type='html'>I use the command line.&lt;br /&gt;&lt;br /&gt;It is easy. Gets things done in a straightforward manner. However, the design of the command line switches is an everyday problem. Even for the tooling that is used more often, one is never able to memorize totally the switches required for common day-to-day actions.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://xkcd.com/1168/&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;https://xkcd.com/1168/&quot; border=&quot;0&quot; height=&quot;205&quot; src=&quot;https://2.bp.blogspot.com/-0v5R1mE-bcM/VtgFcfI8wgI/AAAAAAAAN0Q/C1v-DQqi1NE/s640/tar.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For example, want to rsync something?&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;rsync -avvzP user@location1 ./&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Want to decompress some .tar file?&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;tar -xvf something.tar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above is already not friendly but still more or less doable with practice. But now ask yourself &lt;i&gt;(attention: google not allowed)&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How do you find files with a given extension inside a folder and sub-folders?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You see, in Unix (Linux, Mac, etc) this is NOT easy. Just like so many other commands, a very common task was not designed with an intuitive usage in mind. They work, but in so much as you learn an encyclopedia of switches. Sure, there exist manual pages and google/stackoverflow to help but what happened to simplicity in design?&lt;br /&gt;&lt;br /&gt;In Windows/ReactOS one would type:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;dir *.txt /s&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In Unix/Linux this is a top answer:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;find ./ -type f -name &quot;*.txt&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;source: &lt;a href=&quot;http://stackoverflow.com/a/5927391&quot;&gt;http://stackoverflow.com/a/5927391&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Great. It is spread everywhere this kind of complication for everyday tasks. Want to install something, need to type:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;apt-get install something&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since we only use &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;apt-get&lt;/span&gt; for installing stuff, why not?&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;apt-get something &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Whenever designing your next command line app. Would help end-users if you list which usage scenarios will be more popular and reduce to bare minimum the switches. Some people argue that switches deliver consistency and this is a fact. However, one should perhaps balance consistency with friendliness in mind, which in the end turns end-users into happy-users.&lt;br /&gt;&lt;br /&gt;Be nice, keep it simple.&lt;br /&gt;&lt;br /&gt;¯\_(ツ)_/¯ &lt;br /&gt;&lt;br /&gt;Question:&lt;br /&gt;&lt;b&gt;What is the weirdest Unix command that really upsets you?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Noteworthy reactions to this post:&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;- Defending Unix against simpler commands: &lt;br /&gt;&lt;a href=&quot;http://leancrew.com/all-this/2016/03/in-defense-of-unix/&quot; target=&quot;_blank&quot;&gt;http://leancrew.com/all-this/2016/03/in-defense-of-unix&lt;/a&gt;&lt;br /&gt;- This post ended stirring a fight of Linux &amp;gt; Windows&lt;br /&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=11229025&quot;&gt;https://news.ycombinator.com/item?id=11229025&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/8107571599285151083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2016/03/intuitive-design-for-command-line.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/8107571599285151083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/8107571599285151083'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2016/03/intuitive-design-for-command-line.html' title='Intuitive design for command line switches'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-0v5R1mE-bcM/VtgFcfI8wgI/AAAAAAAAN0Q/C1v-DQqi1NE/s72-c/tar.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-51210656897877977</id><published>2016-02-20T09:16:00.001-01:00</published><updated>2016-02-20T14:25:56.072-01:00</updated><title type='text'>How big was triplecheck data in 2015?</title><content type='html'>Last year was the first time that we started releasing the offline edition of our tooling for evaluating &lt;a href=&quot;http://triplecheck.net/originality-report.html&quot; target=&quot;_blank&quot;&gt;software originality&lt;/a&gt;. At the beginning this tool was released on a single terabyte USB drive. However, shipping the USB across normal post was difficult and the I/O speed that we could read data from the disk was peaking at 90Mbps, in turn this made scannings take way too long &lt;i&gt;(defined as anything longer than 24 hours running)&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;As the year moved along, we kept reducing the disk space required for fingerprints and at the same time kept increasing the total number of fingerprints dispatched with each new edition.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-7DL9K7hJIyc/Vsg5Sg9cNCI/AAAAAAAANz8/pq6NrSxeq3Y/s1600/data.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;242&quot; src=&quot;https://3.bp.blogspot.com/-7DL9K7hJIyc/Vsg5Sg9cNCI/AAAAAAAANz8/pq6NrSxeq3Y/s320/data.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;In the end we managed to fit the basic originality data sets inside a special 240Gb USB thumb drive. When mentioning &quot;special&quot;, I mean a drive containing two miniature SSD devices that are connected in hardware-based RAID 0 mode. For those unfamiliar with RAID, this means two disks working together and appearing on the surface as a single disk. The added advantage is reading data faster because you are physically reading from two disks and roughly doubling speed. Since it has no physical moving parts, the speed of the whole thing jumped to 300Mbps. My impression is that we didn&#39;t reach yet the peak speed for how fast data can be read from the device, our bottleneck simply moved to the CPU cores/software not being able to digest data faster. Due to contract reasons can&#39;t mention the thumb drive model, but this is a device in the range of $500 to $900. Certainly worth the price when scanning gets completed faster.&lt;br /&gt;&lt;br /&gt;Another multiplier to high-speed and data size was compression. Tests were made to find a compression algorithm that wouldn&#39;t need much CPU to decompress and at the same time would reduce disk space. We settled for plain zip compression since it consumed minimal CPU and resulted in a good-enough ratio of 5:1. Meaning that if something was using 5Gb before, now it was only using 1Gb of disk space.&lt;br /&gt;&lt;br /&gt;There is an added advantage to this technique besides disk space: now we were able of reading the same data almost 5x faster than before. If before we needed to read 5Gb from the disk, now this requirement got reduced to 1Gb for accessing the same data &lt;i&gt;(discounting CPU load)&lt;/i&gt;. It then became possible to fit 1Tb of data inside a 240Gb drive, reducing by 4x the needed disk space, while increasing speed by 3x with the same data.&lt;br /&gt;&lt;br /&gt;All this comes to the question: &lt;b&gt;How big was triplecheck data last year?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;These are the raw numbers:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; source files: 519,276,706&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;artwork files: 157,988,763&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;other files: 326,038,826&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;total files: 1,003,304,295&lt;/span&gt; &lt;/blockquote&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;snippet files: 149,843,377&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;snippets: 774,544,948&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;jsp: 892,761&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cpp: 161,198,956&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctp: 19,708&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ino: 41,808&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;c: 54,797,323&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;nxc: 324&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;hh: 20,261&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;tcc: 27,974&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;j: 2,190&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;hxx: 446,002&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;rpy: 2,457&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cu: 17,757&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;inl: 337,850&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cs: 26,457,501&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;jav: 1,780&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cxx: 548,553&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;py: 189,340,451&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;php: 229,098,401&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;java: 94,896,020&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;hpp: 6,481,794&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cc: 9,915,077&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;snippet size real: 255 Gb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;snippet size compressed: 48 Gb&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;One billion individual fingerprints for binary files were included. 500 million (50%) of these fingerprints are source code files in 54 different programming languages. Around 15% of these fingerprints are related to artwork and this means icons, png, jpg files. The other files are usually included with software projects, things like .txt documents and such.&lt;br /&gt;&lt;br /&gt;Over the year we kept adding snippet detection capabilities to mainstream programming languages. This means the majority of C-based dialects, Java, Python and PHP. On the portable offline edition we were unable to include the full C collection, it was simply too big and there wasn&#39;t much demand from customers to have it included &lt;i&gt;(with only one notable customer exception across the year)&lt;/i&gt;. In terms of qualified individual snippets we are tracking a total of 700 million across 150 million source code files. A qualified snippet is one that contains valid enough logical instructions. We use a metric called &quot;diversity&quot;, meaning that a snippet is only accepted when it has a given percentage of logical commands inside. For example: a long switch or IF statement without other relevant code is simply ignored because this is not typically relevant from an originality point of view.&lt;br /&gt;&lt;br /&gt;The body of data was built from relevant source code repositories available to public and a selection of websites such as fora, mailing lists and social networks. We are being picky about which files to include on the offline edition and only accept around 300 specific types of files. The collected raw data during 2015 went above 3 trillion binary files and much effort was applied to iterate this archive within weeks instead of months to build relevant fingerprint indexes.&lt;br /&gt;&lt;br /&gt;For 2016 the challenge continues. There is a data explosion ongoing. We notice a 200% growth between 2014 and 2015, albeit this might be caused due to our own techniques for gathering data to have improved and no longer being limited by disk space as when first started in 2014. More interesting is remembering that the &lt;a href=&quot;http://www.nsrl.nist.gov/Downloads.htm&quot; target=&quot;_blank&quot;&gt;NIST fingerprints&lt;/a&gt; index had a relevant compendium of 20 million fingerprints in 2011 and that now we need technology to handle 50x as much data.&lt;br /&gt;&lt;br /&gt;So let&#39;s see. This year I think we&#39;ll be using the newer models with 512Gb. A big question mark is if we can somehow squeeze more performance by using the built-in GPU that you find on modern computers today. Albeit this is new territory for our context and doesn&#39;t exist certainty that moving data between disk, CPU and GPU will bring added performance or be worth the investment. The computation is already light as it is, and not particularly suited &lt;i&gt;(IMHO)&lt;/i&gt; for GPU type of processing. &lt;br /&gt;&lt;br /&gt;The other field to explore is image recognition. We have one of the biggest archives of miniature artwork &lt;i&gt;(icons and such)&lt;/i&gt; that you would find applied in software. There exist cases where the same icon is saved under different formats and right now we are not detecting such cases. The second doubt is if we should pursue this kind of detection because it is a necessary thing &lt;i&gt;(albeit having no doubt it is a cool thing, thought)&lt;/i&gt;. What I&#39;m sure is that we already doubled the archive compared to last year and that soon we&#39;ll be creating new fingerprint indexes. Again starts the optimization to keep speed acceptable. Oh well, data everywhere. :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/51210656897877977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2016/02/how-big-was-triplecheck-tech-in-2015.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/51210656897877977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/51210656897877977'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2016/02/how-big-was-triplecheck-tech-in-2015.html' title='How big was triplecheck data in 2015?'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-7DL9K7hJIyc/Vsg5Sg9cNCI/AAAAAAAANz8/pq6NrSxeq3Y/s72-c/data.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-5089043905461899668</id><published>2016-01-04T11:55:00.000-01:00</published><updated>2016-01-04T12:04:19.022-01:00</updated><title type='text'>2016</title><content type='html'>The last twelve months did not pass fast. It was a long year..&lt;br /&gt;&lt;br /&gt;Family-wise changed. Some got affected by Alzheimer, others display old age all too early. My own mom got surgery for two different cancer cases and a foot surgery. My grandma of 80 y.o. broke a leg which is a problem in her age. In worse cases family members passed away. Too much, too often, too quick. I&#39;ve tried to be present, to support the treatment expenses and somehow, just somehow help. Sadder events were the death of my wife&#39;s father. Happened over night just before Christmas, just too quick and unexpected. Also sad was the earlier death of our house pet dog, which was part of the family for a whooping 17 years. Was sad to see our old dog put to final sleep. He was in constant pain, couldn&#39;t even walk any more. Will miss our daily walks on the park that happened three times a day regardless of snow or summer. We&#39;d just get out on the street for fresh air so he could do his own business. Many times enjoyed the sun outside the office thanks to him, still grateful for these good moments. A great moment in 2015 was the birth of my second son. A strong and healthy boy. Nostalgia when remembering the happy moment when my first child got born back in 2008. In the meanwhile since that year almost everything changed, especially maturity-wise. In 2009 I&#39;ve made the world familiar to me fall apart and yet to this day feel sad about my own decisions that eventually broke the first marriage. I can&#39;t change the past, but I can learn, work and aim to become a better father for my children. This is what I mean about maturity, do that extra mile to balance family and professional activities. It is sometimes crazy but somehow there must be balance. This year had the first proper family vacations since 5 years, which consisted on two weeks at a mountain lake. No phone, no Internet. Had to walk a kilometer on foot to get some WiFi on the phone at night. This summer we were talking with investors and communication was crucial so the idea of vacations seemed crazy. In the end, family was given preference and after summer we didn&#39;t went forward with investors in either case. Quality time with family was what really mattered, lesson learned.&lt;br /&gt;&lt;br /&gt;Tech-wise we did the impossible, &lt;i&gt;repeatably&lt;/i&gt;. If by December 2014 we had an archive with a trillion binary files and struggled hard on how to handle the already gathered data, by the end of 2015 was estimated that we had 3x as much data now stored. Not only the availability of open data grew exponentially, we also kept adding new sources of data before it would vanish. If before we were targeting some 30 types of source code files related to mainstream programming languages, now we target around 400 different types of binary formats. In fact, we don&#39;t even target just files. At current day we see relevant data extracted from blogs, forum sites, mailing lists. I mention an estimation of data because only in February we&#39;ll likely be able to pause and compute rigorous metrics. There was an informal challenge at DARPA to account the number of source code lines that are publicly available to humanity in current times, we might be able to report back a 10^6 growth compared to an older census. Having many files and handling that much data with very limited resources is one part of the equation that we &lt;i&gt;(fortunately) &lt;/i&gt;had already solved back in 2014. The main challenge for 2015 was how to find the needles of relevant information inside a large haystack of public source code within a reasonable time. Even worse, how to enable end-users &lt;i&gt;(customers)&lt;/i&gt; to find these needles by themselves inside the haystack through their laptops &lt;i&gt;in &lt;/i&gt;offline manner, without a server farm somewhere &lt;i&gt;(privacy)&lt;/i&gt;.&amp;nbsp; However, we did managed to get the whole thing working. Fast. The critical test was a customer with over 10 million LOC in different languages, written for the past 15 years. We were in doubt about such a large code base. But running the triplecheck tooling from a normal i7 laptop to crunch the matches required only 4 days, compared to 11 days when compared to other tools with smaller databases. That was a few months ago, in 2016 we are aiming to reduce this value down to a single day of processing (or less). Impossible is only impossible until someone else makes it possible. Don&#39;t listen to naysayers, just take as many steps as you need to go up a mountain, no matter how big it might be. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Business-wise was quite a ride. The top worst decisions &lt;i&gt;(mea culpa) &lt;/i&gt;in 2015 was pitching our company at a European-wide venture capital event and trusting completely on outsourced sales without preparation for either. The first decision wasn&#39;t initially bad. We went there and got 7 investors interested in follow-up meetings. Very honest about where the money would be used, along with expected growth. However, the cliché that engineers are not good at business might be accurate. Investors speak a different language, there was disappointment for both sides. This initiative costed our side thousands of euros in travel and material costs, along with 4 months of stalled development. Worse was believing that the outsourced team could deliver sales &lt;i&gt;(without being asked for a proof or test beforehand)&lt;/i&gt;. Investors can invest without proof of revenue, but when someone goes to market then they want to wait and see how it performs. In our case, it didn&#39;t perform. Many months later we had paid thousands of EUR to the outsourced company and had zero product revenue to account from them. Felt like a complete fool for permitting this to happen and not putting a brake earlier. The only thing saving the company at this point was our business angel. Thanks to his support we kept getting new clients for the consulting activities. Majority of these clients became recurring M&amp;amp;A customers, this is what kept the company floating. Can never thank him enough, a true business angel in the literal sense of the expression. By October, the dust from outsourcing and investing were gone. Now existed certainty that we want to build a business and not a speculative startup. We finally got product sales moving forward by bringing aboard a veteran on this kind of challenge. For a start, no more giving our tools away for free during trial phase. I was skeptic but it worked well because this filtered our attention for companies that would pay upfront a pilot test. This made customers take the trial phase seriously since it had a real cost paid by them. The second thing was to stop using powerpoints during meetings. I prepare slides before customer meetings but this is counter-productive. More often than not, customers couldn&#39;t care less about what we do. Surprisingly enough they care about what they do and how to get their own problems solved. :-) Today exists a focus on hearing more than speaking at such meetings. Those two simple changes made quite a difference.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, that&#39;s the recap from last year. Forward we move. :-)</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/5089043905461899668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2016/01/2016.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/5089043905461899668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/5089043905461899668'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2016/01/2016.html' title='2016'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-936955817318500286</id><published>2015-10-18T20:01:00.003+00:00</published><updated>2015-10-18T20:01:53.911+00:00</updated><title type='text'>Linux Mint 17 with Windows 10 look</title><content type='html'>This weekend finally took the time to upgrade Windows 7 on my old laptop and try out that button on the system tray with the free Windows 10 install.&lt;br /&gt;&lt;br /&gt;Was surprised, that was an old laptop from 2009 that came with the stock  Windows 7 version and still worked fairly OK. Have to say that the new interface, which is  indeed looking better and simpler. The desktop is enjoyable, but the fact that this Windows version beams  up to Microsoft whatever I&#39;m doing with on my own laptop is still a bother and a cold shill on the spine. &lt;br /&gt;&lt;br /&gt;On my newer laptop I run Linux Mint. This is an old version installed back in 2013 and could  really use an update. So, since it was upgrade-weekend I&#39;ve decided to simply go ahead and bring up this Linux machine to a more recent version of Mint and see what had changed over the  past years. While doing this upgrade, a question popped up: &quot;how about  adding the design of Windows 10 with Linux underneath, would it work?&quot;&lt;br /&gt; &lt;br /&gt; And this is the result:&lt;br /&gt; &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-VnAgpP-gck8/ViPwqC4VyqI/AAAAAAAANvI/sjDRrGqBLvg/s1600/Screenshot_2015-10-18_16-59-49.png&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;http://3.bp.blogspot.com/-VnAgpP-gck8/ViPwqC4VyqI/AAAAAAAANvI/sjDRrGqBLvg/s1600/Screenshot_2015-10-18_16-59-49.png&quot; border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-VnAgpP-gck8/ViPwqC4VyqI/AAAAAAAANvI/sjDRrGqBLvg/s1600/Screenshot_2015-10-18_16-59-49.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span rel=&quot;lightbox&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; The intention wasn&#39;t creating a perfect look-a-like, but (in my opinion) to try mixing and getting a relatively fresh looking design based on Windows, at the same time without opening  hand from our privacy.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;Operating System&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; I&#39;ve got Linux Mint 17.2 (codename Olivia, Cinnamon edition for x64) downloaded from &lt;a class=&quot;bbc_url&quot; href=&quot;http://www.linuxmint.com/edition.php?id=197&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;http://www.linuxmint...tion.php?id=197&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Instead of installing to disk, this time I&#39;ve installed and now run the  operating system from a MicroSD card connected to the laptop through the  SD reader using an SD adapter. The MicroSD is a Samsung 64Gb with  advertised speed of 40Mb/s for read operations. Cost was ~30 EUR.&lt;br /&gt; &lt;br /&gt; Installing the operating system followed the same routine steps as  one would expect. There is a GUI tool from within Linux mint to write the  DVD ISO into a pendisk connected on your laptop. Then boot from the USB  and install the operating system on the MicroSD, having the boot entry  added automatically.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;Window 10 theme and icons&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; Now that the new operating system is running, we can start the customization.&lt;br /&gt; &lt;br /&gt; The windows style you find on the screenshot can be downloaded from: &lt;a class=&quot;bbc_url&quot; href=&quot;http://gnome-look.org/content/show.php/Windows+10+Theme?content=171327&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;http://gnome-look.or...?content=171327&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; This theme comes with icons that look exactly like Windows 10, but that wasn&#39;t  looking balanced nor was our intention to copy pixel per pixel the icons. Rather, the intention was re-using the design guidelines. While looking for options, found Sigma Metro which resembled what was needed: &lt;a class=&quot;bbc_url&quot; href=&quot;http://gnome-look.org/content/show.php/0.1+Sigma+metro+windows+8+Style?content=167327&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;http://gnome-look.or...?content=167327&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; If you look around the web, you&#39;ll find instructions on how to change the window themes and icons. Otherwise if you get into difficulties, just write me a message and I&#39;ll help.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Firefox update and customization&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; Install Ubuntu Tweaks. From there, go to Apps tab and install the most  recent edition of Firefox because the one included on the distro is a  bit old.&lt;br /&gt; &lt;br /&gt; Start changing Firefox by opening it up and going to &quot;Addons&quot; -&amp;gt; &quot;Get  Addons&quot;. Type on the search box &quot;Simple White Compact&quot;, this was the  theme that I found the simplest and will change the  browser looks, from icons to tab position as you can see on the screenshot. Other extensions that you might enjoy  adding while making these changes are &quot;Adblock Plus&quot; to remove ads, &quot;Tab Scope&quot; to show miniatures when  browsing tabs and &quot;Youtube ALL HTML5&quot; to force youtube running without  using the Adobe Flash Player.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Office alternative and customization&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; Then we arrive to Office. I only keep that oldish laptop because it has the  Adobe Reader (which I use for signing PDF documents) and Microsoft Office for the cases when I need to modify documents and presentations without getting them  to look broken. So, I was prepared this time to run both apps using Wine (it  is possible) but decided to first do an update on the alternatives and try using only Linux  native apps. Was not badly surprised.&lt;br /&gt; &lt;br /&gt; LibreOffice 4.x is included by default on the distro. Whenever I&#39;d use it, my slides formatted in MS Office would look broken and unusable. Decided to download and try out version 5.x and to my surprise notice that these issues are  gone. Both the slides and word documents are now properly displayed with just  about the same results that I&#39;d expected from Microsoft office. I&#39;m happy.&lt;br /&gt; &lt;br /&gt; To install LibreOffice 5.x visit &lt;a class=&quot;bbc_url&quot; href=&quot;https://www.libreoffice.org/download/libreoffice-fresh/&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;https://www.libreoff...reoffice-fresh/&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; For the Linux edition, read the text document with instructions.  Quite straightforward, just one command line to launch the setup. So, I was happy with LibreOffice as a complete  replacement to Microsoft (no need to acquire licenses nor run office  through Wine). However, those icons inside LibreOffice still didn&#39;t look good, they looked old. On  this aspect the most recent version of Microsoft Office simply &quot;looks&quot; better. I wanted LibreOffice to  look that way too. So, got icons from here: &lt;a class=&quot;bbc_url&quot; href=&quot;http://gnome-look.org/content/show.php/?content=167958&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;http://gnome-look.or...?content=167958&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; It wasn&#39;t straightforward to find out where the icons could be placed  because the instructions for version 4.x no longer apply. To help you,  the zip file with icons need to be placed inside:&lt;br /&gt; &lt;pre class=&quot;prettyprint prettyprinted&quot;&gt;&lt;span class=&quot;str&quot;&gt;/opt/&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;libreoffice5&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;share&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Then you can open up &quot;writer&quot; and from the &quot;Tools&quot; -&amp;gt; &quot;Options&quot;  -&amp;gt; &quot;View&quot; choose &quot;Office2013&quot; and get the new icons being used. The  startup logo of LibreOffice also seemed too flashy and could be changed.  So I&#39;ve changed with the one available at &lt;a class=&quot;bbc_url&quot; href=&quot;http://gnome-look.org/content/show.php/LibreOffice+Monochrome+Splash?content=166590&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;http://gnome-look.or...?content=166590&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Just a matter of overwriting the &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;intro.png&lt;/span&gt; image found at:&lt;br /&gt;&lt;span class=&quot;str&quot;&gt; &lt;/span&gt;&lt;pre class=&quot;prettyprint prettyprinted&quot;&gt;&lt;span class=&quot;str&quot;&gt;/opt/&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;libreoffice5&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;program&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Alternative to Adobe Reader for signing PDF&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; Every now and then comes a PDF that requires being printed, signed by pen and then scanned to send again to the other person. I stopped doing this kind of thing some time ago by adding a  digital signature that includes an image of my handwritten signature on  the document. This way there&#39;s no need to print nor scan any papers. Adobe  Reader did a good work on this task but getting it to run on Wine with  the signature function was not straightforward.&lt;br /&gt; &lt;br /&gt; Started looking for a native Linux alternative and found &quot;Master PDF  Editor&quot;. The code for this software is not public but I couldn&#39;t find other options and these were the only ones that  provided a native Linux install supporting digital handwritten  signatures: &lt;a class=&quot;bbc_url&quot; href=&quot;https://code-industry.net/masterpdfeditor/&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;https://code-industr...asterpdfeditor/&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; If you&#39;re using this tool for business, you need to acquire a license. Just  for home-use is free of cost. Head out to the  download page and install the app. I was surprised because it looked  very modern, simple and customizable. I&#39;ll buy a license for this tool, does exactly what I needed. Having LibreOffice and MasterPDF as  complete alternative to MS Office and Acrobat,&amp;nbsp; there is no more valid reason (on  my case) to switch back the old laptop whenever editing documents. This can  be done with same (or even better) quality from Linux now.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Command line&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; A relevant part of my day-to-day involves the use of  command line. In Linux this is a relatively pleasant task because the terminal window can  be adjusted, customized and never feels like a second class  citizen inside the desktop. With these recent changes that were applied, was  now possible to improve further the terminal window by showing the tool bar (see the screenshot).&lt;br /&gt;&lt;br /&gt;Open a terminal, click on &quot;View&quot;  -&amp;gt; &quot;Show tool bar&quot;. Usually I&#39;m against adding buttons, but that tool bar has  a button for pasting clipboard text directly onto the console. I know that can be done by the keyboard using &quot;Ctrl &#39;+ Shift + V&quot;, but found it very practical to just click on a single button and paste the text.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Non-Windows tweaks&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; There are tweaks only possible on Linux. One of my favorite keeps  being the &quot;Woobly windows&quot;. Enable Compiz on the default desktop  environment: &lt;a class=&quot;bbc_url&quot; href=&quot;http://askubuntu.com/questions/449651/how-do-i-enable-wobbly-windows&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;http://askubuntu.com...-wobbly-windows&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; With Compiz there are many tweaks possible, I&#39;ve kept them to a  minimum but certainly is refreshing to use some animations rather than the  plain window frames. If you never saw this in action, here is a video example: &lt;a href=&quot;https://www.youtube.com/watch?v=jDDqsdrb4MU&quot;&gt;https://www.youtube.com/watch?v=jDDqsdrb4MU&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Skype alternatives&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; Many of my friends and business contacts use Skype. It is not safe, it is not private, and I&#39;d prefer to use a non-Microsoft  service because the skype client gets installed on my desktop. Who knows  what it can do on my machine when it is running on the background. One interesting alternative that I&#39;ve found was launching the  web-edition of skype that you find at &lt;a class=&quot;bbc_url&quot; href=&quot;https://web.skype.com/&quot; rel=&quot;norewrite nofollow external&quot; title=&quot;External link&quot;&gt;https://web.skype.com/&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; From firefox, there is the option to &quot;Pin&quot; a given tab. So I&#39;ve  pinned skype as you can see on the screenshot, and now opens automatically whenever the browser  gets open, in practice bringing it online when I want to be reachable. A  safe desktop client and alternative would be better, this is nowhere a perfect solution but rather a  compromise that avoids installing the skype client.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;Finishing&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; There are more small tweaks happening to adjust the desktop for my case, but  what is described above are the big blocks to help you reach this kind of design in case you&#39;d like to do something similar.  If you have any questions or get stuck at any part of customization, just let me know.&lt;br /&gt;&lt;br /&gt;Have fun!&lt;br /&gt;:-) </content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/936955817318500286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/10/linux-mint-17-with-windows-10-look.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/936955817318500286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/936955817318500286'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/10/linux-mint-17-with-windows-10-look.html' title='Linux Mint 17 with Windows 10 look'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-VnAgpP-gck8/ViPwqC4VyqI/AAAAAAAANvI/sjDRrGqBLvg/s72-c/Screenshot_2015-10-18_16-59-49.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-8050226804214504238</id><published>2015-10-15T15:02:00.000+00:00</published><updated>2015-10-15T15:02:48.607+00:00</updated><title type='text'>.ABOUT format to document third-party software</title><content type='html'>If you are a software developer, you know that every now and then someone asks you to create a list of the third-party things that you are using on some project.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-wagT1_Qs1ys/Vh-9jr3QT5I/AAAAAAAANuY/aIaTB8RJkR8/s1600/i-don-t-always-document.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://1.bp.blogspot.com/-wagT1_Qs1ys/Vh-9jr3QT5I/AAAAAAAANuY/aIaTB8RJkR8/s320/i-don-t-always-document.jpg&quot; width=&quot;255&quot; /&gt;&lt;/a&gt;This is a boring task. Ask any, single, motivated developer and try to find one that will not roll his eyes whenever asked to do this kind of thing. We (engineers) don&#39;t like it, yet are doomed to get this question every now and then. It is not productive to repeat the same thing over and over again, why can&#39;t someone make it simpler?&lt;br /&gt;&lt;br /&gt;Waiting a couple of years didn&#39;t worked, so time to roll up the sleeves and find an easier way of getting this sorted. To date, one needs to list manually each and every portion of code that is not original (e.g. libraries, icons, translations, etc) and this will either end up on a text file or a spreadsheet (pick your poison). &lt;br /&gt;&lt;br /&gt;There are ways to manage dependencies. Think of npm, maven and similar. However, you need to be using a dependency manager and this doesn&#39;t solve the case of non-code items. For example, when you want to list that package of icons from someone else, or just list dependencies that are part of the project, but not really part of the source code (e.g. servers, firewalls, etc).&lt;br /&gt;&lt;br /&gt;For these cases, you still need to do things manually and it is &lt;i&gt;painful&lt;/i&gt;. At TripleCheck, we don&#39;t like ourselves to do these lists so started looking into how to automate this step once for all. Our requirements: 1) simple, 2) tool-agnostic and 3) portable.&lt;br /&gt;&lt;br /&gt;So we got inclined to the way how configuration files work because they are plain text files that are easy for humans to read or edit, and straightforward for machines to parse. We are big fans of &lt;a href=&quot;http://spdx.org/&quot; target=&quot;_blank&quot;&gt;SPDX&lt;/a&gt; because it permits describing third-party items in intrinsic detail, but a drawback of being so detailed is that sometimes we only have granular information. Example, we know that the files on a given a folder belong to some person and have a specific license (maybe we even know the version), but we don&#39;t want to compute the SHA1 binary signature for each and every file on that folder (either because the files might change often, or simply because it won&#39;t be done so easily and quickly by the engineer).&lt;br /&gt;&lt;br /&gt;Turns out we we&#39;re not alone on this kind of quest. &lt;a href=&quot;http://nexb.com/&quot; target=&quot;_blank&quot;&gt;NexB&lt;/a&gt; had already pioneered in previous years a text format specifically for this kind of task, defining the &quot;.ABOUT&quot; file extension to describe third-party copyrights and applicable licenses: &lt;a href=&quot;http://www.aboutcode.org/&quot;&gt;http://www.aboutcode.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The text format is fairly simple, here is an example we use ourselves:&lt;br /&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre&gt;&lt;i&gt;name: jsTree&lt;br /&gt;license_spdx: MIT&lt;br /&gt;copyright: Ivan Bozhanov&lt;br /&gt;version: 3.0.9&lt;br /&gt;&lt;br /&gt;spec_version: 1.0&lt;br /&gt;download_url: none&lt;br /&gt;home_url: http://jstree.com/&lt;br /&gt;&lt;br /&gt;# when was this ABOUT file created or last updated?&lt;br /&gt;date: 2015-09-14&lt;br /&gt;&lt;br /&gt;# files inside this folder and sub-folders&lt;br /&gt;about_resource: ./&lt;/i&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Basically, it follows the &lt;a href=&quot;http://spdx.org/licenses/&quot; target=&quot;_blank&quot;&gt;SPDX license abbreviations&lt;/a&gt; to ensure we use a common way of talking about the same license and you can add or omit information as much as it is available. Take attention on the &quot;about_resource&quot; field that describes what is covered by this ABOUT file. When using &quot;./&quot; means all files and files in respective sub-folders.&lt;br /&gt;&lt;br /&gt;One interesting point is the possibility for nesting of multiple ABOUT files. For example, place one ABOUT on the root of your project to describe the license terms generally applicable to the project and then create specific ABOUT on specific third-party libraries/items to describe what is applicable for such cases.&lt;br /&gt;&lt;br /&gt;When done with the text file, place it on the same folder of what you want to cover. The &quot;about_resource&quot; can also be used for a single file, or repeated in several lines for covering a very specific set of files.&lt;br /&gt;&lt;br /&gt;NexB made available tooling to collect ABOUT files and generate documentation. Unfortunately, this text format is not as known as it should be. Still, it fits like a glove as easy solution to list third-party software so we started using it for automating the code detection.&lt;br /&gt;&lt;br /&gt;Our own TripleCheck engine is now supporting the recognition of .ABOUT files and adding this information automatically to the report generation. There is even a simple web frontend for creating .ABOUT files at &lt;a href=&quot;http://triplecheck.net/components/&quot;&gt;http://triplecheck.net/components/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From that page, you can either create your own .ABOUT files or simply browse through the collection of already created files. The backend of that web page is powered by GitHub, you find the repository at &lt;a href=&quot;https://github.com/dot-about/components/tree/master/samples&quot;&gt;https://github.com/dot-about/components/tree/master/samples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, no more excuses to keep listing third-party software &lt;b&gt;manually&lt;/b&gt; on spreadsheets.&lt;br /&gt;&lt;br /&gt;Have fun! :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/8050226804214504238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/10/about-format-to-document-third-party.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/8050226804214504238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/8050226804214504238'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/10/about-format-to-document-third-party.html' title='.ABOUT format to document third-party software'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-wagT1_Qs1ys/Vh-9jr3QT5I/AAAAAAAANuY/aIaTB8RJkR8/s72-c/i-don-t-always-document.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-4139029693050339213</id><published>2015-10-13T10:17:00.000+00:00</published><updated>2015-10-13T10:17:50.258+00:00</updated><title type='text'>Something is cooking in Portugal</title><content type='html'>I don&#39;t usually write about politics, for me that is more often a never-ending discussion about tastes, rather than facts.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-To2X5DviHpc/VhzXzih_PbI/AAAAAAAANt0/MWS8E9VdaJg/s1600/enlisttodaydarth.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;228&quot; src=&quot;http://2.bp.blogspot.com/-To2X5DviHpc/VhzXzih_PbI/AAAAAAAANt0/MWS8E9VdaJg/s320/enlisttodaydarth.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;However, one senses a disturbance in the forces at Portugal. For the first time over the last (35?) years we see a change in landscape. For those non-familiar with Portuguese politics, the country is historically ruled by either one of the two large parties. Basically, one &quot;misbehaves&quot; and then comes the other to &quot;repair&quot;. Vice-versa on next elections as voters grow anemic and disconnected from whomever gets elected.&lt;br /&gt;&lt;br /&gt;This year wasn&#39;t the case. The ruling party is seen as &quot;misbehaving&quot; and the other party didn&#39;t got a majority, in other words, didn&#39;t convinced a significant part of the population to vote for them. This isn&#39;t unusual, what happened as different was the large number of votes going to other two minor parties and the fact that most citizens got up from their sofas to vote who &quot;rules&quot; them for the next years.&lt;br /&gt;&lt;br /&gt;For the first time, I&#39;m watching how the second largest party is now forced to negotiate with these smaller parties to reach an agreement. How since a long time they have to review what was promised during election time and get audited by other parties to ensure they keep what was promised.&lt;br /&gt;&lt;br /&gt;In other words, for the first time watching what I&#39;d describe as a realistic democratic process happening in our corner of Europe. Might seem strong words, but fact is that ruling a government by majority (in our context) is a carte blanche to rule over public interests. Go to Portugal, ask if they feel the government works on their behalf or against. Ask them for specific examples from recent years that support their claim, they quickly remember epic fights to prevent expensive airports from being built (Ota) by government or the extensive (and expensive) network of highways that got built with EU money and are today empty, still serving only the private interest of companies charging tolls on them.&lt;br /&gt;&lt;br /&gt;There was (and still exists) a too-high level of corruption on higher instances of government (just look at our former prime-minister, recently in jail) or the current prime-minister (ask him about &quot;tecnoforma&quot; or about his friend &quot;Dr. Relvas&quot;) and so exists a positive impact when small parties get higher voting representation, forcing the majority administrations to be audited and checked in public.&lt;br /&gt;&lt;br /&gt;You see, most of this situation derives from a control of mind-share. In previous centuries you&#39;d get support from local cities by promoting your party followers to administrative positions. Later came newspapers (which got tightly controlled), then radio (eventually regulated to forbid rogue senders), then TV (which to date has only two private channels and two state-owned channels) and now comes the Internet.&lt;br /&gt;&lt;br /&gt;With the Internet there is a problem. The local government parties with majority are not controlling the platforms where people exchange their thoughts. Portuguese use facebook (hate or like it, that&#39;s what common families and friends use between them) and facebook couldn&#39;t (currently) care less about elections in Portugal, nor could either of the large parties have resources to make facebook biased to their interests. So what we have is a large platform where public news can be debunked as false or plain biased, where you can see how other citizens really feel about the current state of affairs, where smaller parties get a balanced chance to be read, heard and now even voted by people who support what they stand up for.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-LJ8fGtfehks/VhzXH8LopqI/AAAAAAAANts/tFhroQF6gmI/s1600/15c4a10.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;108&quot; src=&quot;http://3.bp.blogspot.com/-LJ8fGtfehks/VhzXH8LopqI/AAAAAAAANts/tFhroQF6gmI/s320/15c4a10.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;For the first time I see the Internet making a real difference in enabling people to be connected between themselves and enabling the population to collectively learn and change the course of their history, together. As for the Portuguese, you see the big parties worried that this thing of re-elections in automatic pilot is no longer assured. They too need to work together now. Portuguese, please do keep voting. For me this is democracy in action. Today I&#39;m happy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/4139029693050339213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/10/something-is-cooking-in-portugal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/4139029693050339213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/4139029693050339213'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/10/something-is-cooking-in-portugal.html' title='Something is cooking in Portugal'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-To2X5DviHpc/VhzXzih_PbI/AAAAAAAANt0/MWS8E9VdaJg/s72-c/enlisttodaydarth.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-2671629483808155614</id><published>2015-07-29T09:49:00.001+00:00</published><updated>2015-07-29T17:27:20.423+00:00</updated><title type='text'>TripleCheck as a Top 20 Frankfurt startup to watch in 2015</title><content type='html'>&lt;a href=&quot;http://1.bp.blogspot.com/-sLPfnnv1S8k/VbidfBGcFDI/AAAAAAAANqE/eaCq6DWg5XQ/s1600/frankfurt-285625_1280.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;http://1.bp.blogspot.com/-sLPfnnv1S8k/VbidfBGcFDI/AAAAAAAANqE/eaCq6DWg5XQ/s320/frankfurt-285625_1280.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;Quite an honor and surprise, we got &lt;a href=&quot;http://magazine-mn.com/news/top_20_frankfurt_startups_to_watch_in_2015/2015-07-12-217&quot; target=&quot;_blank&quot;&gt;appointed with this distinction&lt;/a&gt; despite the fact that we don&#39;t see ourselves so much as a startup, but rather as a plain normal company worried about getting to the next month and growing with its own resources.&lt;br /&gt;&lt;br /&gt;Looking back, things are much better off today than a year ago. Our schedule is busy at 150% of client allocation and we managed to survive through plain normal consulting, finally moving to product sales this year with a good market reception so far. Team grew, we finally have a normal office location and I keep worrying each month that the funds in the bank are not enough to cover expenses. Somehow, on that brink of failure or success we work hard to pay the bills and invest in material or people that permits moving a bit further each month.&lt;br /&gt;&lt;br /&gt;It is not easy, this is not your dream story and we don&#39;t know what will happen next year. What I know is that we are pushed to learn more and grow. That kind of experience has a value of its own.&lt;br /&gt;&lt;br /&gt;Next step for triplecheck is building in 2015 our own petabyte-level datacenter in Frankfurt. Efficiency of costs aside, we are building a safe-house outside of the &quot;clouds&quot; where nobody really knows who has access to them. &lt;br /&gt;&lt;br /&gt;I wish it was time for vacations or celebrate, but this is not yet the time. I&#39;m happy that together with smart and competent people we are building a stable company.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/2671629483808155614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/07/triplecheck-as-top-20-frankfurt-startup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/2671629483808155614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/2671629483808155614'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/07/triplecheck-as-top-20-frankfurt-startup.html' title='TripleCheck as a Top 20 Frankfurt startup to watch in 2015'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-sLPfnnv1S8k/VbidfBGcFDI/AAAAAAAANqE/eaCq6DWg5XQ/s72-c/frankfurt-285625_1280.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-3750152159067922780</id><published>2015-04-22T09:19:00.002+00:00</published><updated>2015-04-22T09:27:23.727+00:00</updated><title type='text'>List of &gt;230 file extensions in plain JSON format</title><content type='html'>I&#39;ve collected over the last year some 230 file extensions and manually curated their descriptions so that whenever I find a file extension, it becomes possible to give the end-user a slight idea about what the extension is about.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-39eamFhTMM0/VTdmhJRx8EI/AAAAAAAANfQ/3cgkHQZOtNI/s1600/blog_post_file_extensions.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-39eamFhTMM0/VTdmhJRx8EI/AAAAAAAANfQ/3cgkHQZOtNI/s1600/blog_post_file_extensions.png&quot; height=&quot;165&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Most of my code nowadays is written in Java but there is interest in porting some of this information to web apps. So I have exported a JSON list that you are welcome to download and use in your projects.&lt;br /&gt;&lt;br /&gt;The list is available on GitHub at &lt;a href=&quot;https://github.com/triplecheck/engine/blob/master/run/extensionTypes.js&quot; target=&quot;_blank&quot;&gt;this link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One thing to keep in mind is that I&#39;m looking at extensions from a software developer perspective. This means that when the same extension is used for different programs, I usually favor the programs related to programming.&lt;br /&gt;&lt;br /&gt;The second thing is that I collect more information about file extensions than the info you find on this JSON list. For example, I populate for each extension the applicable programming languages. Here is an example for &lt;a href=&quot;https://github.com/triplecheck/engine/blob/master/src/extensions/source/c_lang/h.java#L76&quot; target=&quot;_blank&quot;&gt;.h source code files&lt;/a&gt;. Other values include information if the data is plain binary or text readable, the category to which the extension belongs (archive, font, image, sourcecode, ..) and other meta data values that are useful for file filtering and processing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you need help or would like to suggest something to improve the list, just let me know. </content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/3750152159067922780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/04/list-of-230-file-extensions-in-plain.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/3750152159067922780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/3750152159067922780'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/04/list-of-230-file-extensions-in-plain.html' title='List of &gt;230 file extensions in plain JSON format'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-39eamFhTMM0/VTdmhJRx8EI/AAAAAAAANfQ/3cgkHQZOtNI/s72-c/blog_post_file_extensions.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-7485252090960569571</id><published>2015-04-20T20:47:00.001+00:00</published><updated>2015-04-21T08:44:49.222+00:00</updated><title type='text'>Updating the header and footer on static web sites using Java</title><content type='html'>This year was the first time that I&#39;ve moved away from websites based on Wordpress, PHP and MySQL to embrace the simplicity of static HTML sites.&lt;br /&gt;&lt;br /&gt;Simplicity is indeed a good reason. It means virtually no exploits as there is no database nor script interpretation happening. It means speed since there are no PHP, Java nor Ruby scripts running on the server and only direct files are delivered. The last feature that I was curious to try is the site hosting provided by Github, which is only supporting static web sites.&lt;br /&gt;&lt;br /&gt;The first site to convert was the TripleCheck company site. It had been developed over a year ago and lagged a serious update. Was based on Wordpress and wasn&#39;t easy to make changes on the theme or content. The site was quickly converted and placed online using Github.&lt;br /&gt;&lt;br /&gt;However, not all are roses with static websites. As you can imagine, one of the troubles is updating the text and links that you want to see on each page of the site. There are tools such as Jekyll that help to maintain blogs, but all that was needed here was a simple tool that would pick the header and footer tags to updated with whatever content was intended.&lt;br /&gt;&lt;br /&gt;Easy enough, I&#39;ve wrote a simple app for this purpose. You can download the binaries from this &lt;a href=&quot;https://github.com/triplecheck/site_update/releases&quot; target=&quot;_blank&quot;&gt;link&lt;/a&gt; and the source code is available at &lt;a href=&quot;https://github.com/triplecheck/site_update/&quot;&gt;https://github.com/triplecheck/site_update/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to get started?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Place the &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;site_update.jar&lt;/span&gt; file inside the folder where your web pages are located. Then copy also the &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;html-header.txt&lt;/span&gt; and &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;html-footer.txt&lt;/span&gt; files and write inside the content you&#39;d want to use as header and footer.&lt;br /&gt;&lt;br /&gt;Inside the HTML pages that you want to change, you need to include the following tags:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;lt;header&amp;gt;&amp;lt;/header&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;lt;footer&amp;gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once you have this ready, from the command line run the jar file using:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;java -jar site_update.jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Check your HTML pages to see if the changes were applied.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What happens when it is running?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It will look for all HTML files with &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;.html&lt;/span&gt; extension that are found on the same folder where the &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;.jar&lt;/span&gt; file is located. For each HTML file it will look for the HTML tags that were mentioned above and replace whatever is placed between them, effectively updating your pages as needed.&lt;br /&gt;&lt;br /&gt;There is an added feature. If you have pages on a sub-folder, this software will automatically convert the links inside the tags so that they keep working. For example, a link pointing to &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;index.html&lt;/span&gt; will be modified to &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;../index.html&lt;/span&gt; and this way preserve the link structure. This is done also for images.&lt;br /&gt;&lt;br /&gt;An example where this program used can be found at the TripleCheck website, whose code you find available on Github at &lt;a href=&quot;https://github.com/triplecheck/triplecheck.github.io&quot;&gt;https://github.com/triplecheck/triplecheck.github.io&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Feedback, new features?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I&#39;d be happy to help. Just let me know on the comment box here or write a post on Github.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/7485252090960569571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/04/updating-header-and-footer-on-static.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/7485252090960569571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/7485252090960569571'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/04/updating-header-and-footer-on-static.html' title='Updating the header and footer on static web sites using Java'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-6154066492775257446</id><published>2015-04-10T19:46:00.002+00:00</published><updated>2015-04-10T19:46:31.093+00:00</updated><title type='text'>List of 310 software licenses in JSON format</title><content type='html'>I&#39;ve recently needed a list of licenses to use inside a web page. The goal was presenting the end-user with a set of software licenses to choose from. However, couldn&#39;t find one readily available as a JSON or some kind of format to be embbeded as part of Javascript code.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-AtAaU2wr2Mo/VSgnQtuQJLI/AAAAAAAANeo/ad88uyA7c1Y/s1600/remember-by-heart.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-AtAaU2wr2Mo/VSgnQtuQJLI/AAAAAAAANeo/ad88uyA7c1Y/s1600/remember-by-heart.png&quot; height=&quot;232&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;So I&#39;ve created such a list, based on the nice &lt;a href=&quot;http://spdx.org/&quot; target=&quot;_blank&quot;&gt;SPDX&lt;/a&gt; documentation. This list contains 310 license variations and types. I&#39;m explicitly mentioning &quot;types&quot; because you will find licenses called &quot;Proprietary&quot; to define some sort of terms that are customized and a &quot;Public domain&quot; type, which is not a license &lt;i&gt;per se&lt;/i&gt; but in practice denotes the lack of an applicable license since copyright &lt;i&gt;(in theory)&lt;/i&gt; is not considered as applicable for them.&lt;br /&gt;&lt;br /&gt;In case you are ok with these nuances, you can download this json list from &lt;a href=&quot;https://github.com/triplecheck/engine/blob/master/run/licenseList.js&quot;&gt;https://github.com/triplecheck/engine/blob/master/run/licenseList.js&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The list was not crafted manually, I&#39;ve wrote a few lines of Java code to output the file. You find this file at &lt;a href=&quot;https://github.com/triplecheck/engine/blob/master/src/provenance/javascript/OutputLicenseList.java&quot;&gt;https://github.com/triplecheck/engine/blob/master/src/provenance/javascript/OutputLicenseList.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you find the list useful and have feedback or need an updated version, just let me know.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/6154066492775257446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/04/list-of-310-software-licenses-in-json.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/6154066492775257446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/6154066492775257446'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/04/list-of-310-software-licenses-in-json.html' title='List of 310 software licenses in JSON format'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-AtAaU2wr2Mo/VSgnQtuQJLI/AAAAAAAANeo/ad88uyA7c1Y/s72-c/remember-by-heart.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-6543756530225053420</id><published>2015-04-02T09:14:00.000+00:00</published><updated>2015-04-02T09:14:49.036+00:00</updated><title type='text'>SSDEEP in Java</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-eRLbiacGVxo/VR0HaHgmEzI/AAAAAAAANdw/H0NP3WqW6Hk/s1600/hashing_great.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-eRLbiacGVxo/VR0HaHgmEzI/AAAAAAAANdw/H0NP3WqW6Hk/s1600/hashing_great.jpg&quot; height=&quot;166&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;If you are familiar with similarity hashing algorithms &lt;i&gt;(a.k.a. fuzzy hash matching)&lt;/i&gt; and need an SSDEEP implementation in Java code, it is available directly from my Github account at this location: &lt;a href=&quot;https://github.com/nunobrito/utils/tree/master/Utils/src/utils/hashing/ssdeep&quot;&gt;https://github.com/nunobrito/utils/tree/master/Utils/src/utils/hashing/ssdeep&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The original page for SSDEEP can be found at &lt;a href=&quot;http://ssdeep.sourceforge.net/&quot;&gt;http://ssdeep.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On that page you find also the binaries for Windows.&lt;br /&gt;&lt;br /&gt;Have fun.</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/6543756530225053420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/04/ssdeep-in-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/6543756530225053420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/6543756530225053420'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/04/ssdeep-in-java.html' title='SSDEEP in Java'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-eRLbiacGVxo/VR0HaHgmEzI/AAAAAAAANdw/H0NP3WqW6Hk/s72-c/hashing_great.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-8997068481954462210</id><published>2015-03-02T19:36:00.000-01:00</published><updated>2015-03-02T19:36:06.773-01:00</updated><title type='text'>Preserving the soul of an old laptop</title><content type='html'>If you&#39;re like me and keep old laptops around the house that are wannabe time-capsules, I&#39;ve recently started converting the physical operating systems onto virtual machines that I can run from a PC emulator.&lt;br /&gt;&lt;br /&gt;The concept is called P2V (Physical To Virtual) and has been made simpler over recent years. My favorite tool for this purpose is provided by VMWare at &lt;a href=&quot;http://www.vmware.com/products/converter&quot;&gt;http://www.vmware.com/products/converter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is a freeware tool, albeit you have to provide an email address to access the download page. What I like about the tool is the fact that the most difficult steps are automated. All one needs to do is installing, convert and run the new virtual machine through a wizard-driven menu with a few clicks.&lt;br /&gt;&lt;br /&gt;Being a VMWare tool you&#39;d think that it restricts running the virtual image to their line of products. However, I was able to use VirtualBox to run and see my old Windows 7 booting and running from a virtual machine.&lt;br /&gt;&lt;br /&gt;Very nice, to be able of preserving the old look &amp;amp; feel, the apps, documents and working environment in such a quick manner as hardware moves forward.</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/8997068481954462210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/03/preserving-soul-of-old-laptop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/8997068481954462210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/8997068481954462210'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/03/preserving-soul-of-old-laptop.html' title='Preserving the soul of an old laptop'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-2467534464706911458</id><published>2015-02-20T07:11:00.000-01:00</published><updated>2015-02-20T07:11:02.404-01:00</updated><title type='text'>Windows: Driver for logging the timing of drivers and services at startup</title><content type='html'>Sometimes it is good to measure how long a laptop with Windows will take to boot and which drivers or services might be hogging down the boot process. There exist some ways of measuring the time using Microsoft-provided tooling but they aren&#39;t redistributable.&lt;br /&gt;&lt;br /&gt;To overcome this limitation, I&#39;ve wrote a simple driver that will write a text file with a time stamp when each other driver or service gets called. This way we can (more or less) expose which drivers or services are taking longer to be loaded.&lt;br /&gt;&lt;br /&gt;This is a sample of what to expect:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre class=&quot;prettyprint lang-auto linenums:0 prettyprinted&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.437&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\Drivers\crashdmp&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.453&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\Drivers\iaStor&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.453&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\Drivers\dumpfve&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.812&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\system32\DRIVERS\cdrom&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.812&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\Drivers\Null&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;SYS&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.828&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\Drivers\Beep&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;SYS&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.843&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\drivers\watchdog&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.843&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\drivers\VIDEOPRT&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;SYS&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.843&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\drivers\vga&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.843&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\DRIVERS\RDPCDD&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.859&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\system32\drivers\rdpencdd&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.859&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\system32\drivers\rdprefmp&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sys&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.859&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\Drivers\Msfs&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;SYS&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.875&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\System32\Drivers\Npfs&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;SYS&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;02&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;40.875&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; \SystemRoot\system32\DRIVERS\TDI&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;SYS&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;The code is available under the EUPL terms and hosted on GitHub at this location: &lt;a href=&quot;https://github.com/nunobrito/BootLogger&quot;&gt;https://github.com/nunobrito/BootLogger&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the download folder you find the compiled drivers (x86 and x64 versions) along with the instructions on how to use the driver on your machine.&lt;br /&gt;&lt;br /&gt;Feedback from other users can be read at reboot on this topic:&lt;br /&gt;&lt;a href=&quot;http://reboot.pro/topic/20345-driver-for-logging-windows-boot-drivers-and-services/&quot;&gt;http://reboot.pro/topic/20345-driver-for-logging-windows-boot-drivers-and-services/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Each boot log report will be placed under c:\BootLogger, this parameter is configurable in case you want to change it.&lt;br /&gt;&lt;br /&gt;Have fun!&lt;br /&gt;:-) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/2467534464706911458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/02/windows-driver-for-logging-timing-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/2467534464706911458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/2467534464706911458'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/02/windows-driver-for-logging-timing-of.html' title='Windows: Driver for logging the timing of drivers and services at startup'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-6170761459602742056</id><published>2015-02-10T09:00:00.002-01:00</published><updated>2015-02-11T16:48:48.193-01:00</updated><title type='text'>Olhando à frente</title><content type='html'>Olhando à frente&lt;br /&gt;existe rumo diferente. &lt;br /&gt;Rumo que dita o futuro, &lt;br /&gt;de curto tempo e alento&lt;br /&gt;para escapar o tormento&lt;br /&gt;que traz o curto momento. &lt;br /&gt;Assim temos um ano&lt;br /&gt;pouco sano e profano&lt;br /&gt;que de tal visto amanho&lt;br /&gt;só pode trazer mais dano.&lt;br /&gt;Serão dez meses a terminar&lt;br /&gt;esta pequena obra d&#39;encantar,&lt;br /&gt;que deu tanto gosto de começar,&lt;br /&gt;e tão pouco tempo para saborear&lt;br /&gt;Imagino como seria o dia&lt;br /&gt;em que o peso desaparecia.&lt;br /&gt;Um dia correndo de alegria,&lt;br /&gt;iria apreciar, seria &lt;a href=&quot;https://www.youtube.com/watch?v=L_ymvjxErs0&quot; target=&quot;_blank&quot;&gt;magia&lt;/a&gt;&lt;br /&gt;Tal dia chegará&lt;br /&gt;um dia, oxalá.</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/6170761459602742056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/02/olhando-frente.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/6170761459602742056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/6170761459602742056'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/02/olhando-frente.html' title='Olhando à frente'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-3730417498640530514</id><published>2015-01-28T18:20:00.001-01:00</published><updated>2015-01-29T12:46:08.175-01:00</updated><title type='text'>Java hidden gem: CopyOnWriteArrayList()</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;CopyOnWriteArrayList()&lt;/span&gt; is a cousin of the well-known &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;ArrayList()&lt;/span&gt; class.&lt;br /&gt;&lt;br /&gt;ArrayList is often used for storing items. On my case, I had been working on a multi-threaded program that shared a common ArrayList.&lt;br /&gt;&lt;br /&gt;In order to improve performance, every now and then I would like to remove some of the items on this list when matched some criteria. In the past I would use the &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Iterator()&lt;/span&gt; class to iterate through item using the &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;iterator.next()&lt;/span&gt; function.&lt;br /&gt;&lt;br /&gt;To remove an item I&#39;d just call &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;iterator.delete()&lt;/span&gt;. However, this approach was failing for some odd reason: &lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;i&gt;java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification (AbstractList.java:372)&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;I tried to place &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;synchronized&lt;/span&gt; on the relevant methods but processing just got slower, not solving the error failure.&lt;br /&gt;&lt;br /&gt;So, what else can one try? Looking around the web I&#39;ve found the &lt;i&gt;not-so-known&lt;/i&gt; &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;CopyOnWriteArrayList()&lt;/span&gt; and to my surprise solved the problem with a nice performance boost. &lt;br /&gt;&lt;br /&gt;Works in the same manner as a typical Arraylist but doesn&#39;t synchronize the items when they are removed. To remove items I use a second Arraylist that is decoupled and place the items to remove there. Then, an independent status thread is running in interval loops of three seconds to check if this second Arraylist has any items, removing them from the main list in asynchronous manner.&lt;br /&gt;&lt;br /&gt;All in all, running the code in multi-threaded mode and adopting &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;CopyOnArrayWriteArrayList()&lt;/span&gt; reduced the overall processing time for 17 million lines of data from 30 minutes to around 10 minutes, an average of 30k lines/second. The text database used as example is sized in 12,3 Gb and contains 2.5 billion snippets that are compared against 164 methods of my test sample.&lt;br /&gt;&lt;br /&gt;This translates to roughly 41 billion comparisons taking place in 10 minutes.&lt;br /&gt;&lt;br /&gt;As reference, when my computer is just reading the lines without any processing then it reaches an average speed of 140k lines/second, this value reveals the upper I/O limit expected as disk bandwidth. The speed of 30k lines/second occurs (probably) due to CPU limitations (an i7 core) when doing similarity comparisons between strings.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The performance is not bad, but at this point I&#39;m running out of ideas on how to further bring down the processing time. The bottleneck is still the comparison algorithm, I&#39;ve already wrote a &lt;a href=&quot;https://github.com/triplecheck/f2f/blob/657a01c7c27f48de58e7ee9f3c6c5c154993b3db/src/sandbox/Performance.java#L273-L282&quot; target=&quot;_blank&quot;&gt;cheaper/dirty version of Levensthein&#39;s algorithm&lt;/a&gt; for faster comparisons but still is not enough.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Any ideas?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EDIT&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After some more time looking on performance I&#39;ve noted that comparison of two strings was being made using &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;String&lt;/span&gt; objects. There was redundant transformation back and forth between &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;char[]&lt;/span&gt; and &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;String&lt;/span&gt; objects. The code was modified to run using only &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;char[]&lt;/span&gt; arrays. Speed was doubled, is now averaging 60k lines/second, taking 5 minutes to complete the same processing because less stress is placed on the CPU.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/3730417498640530514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/01/java-hidden-gem-copyonwritearraylist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/3730417498640530514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/3730417498640530514'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/01/java-hidden-gem-copyonwritearraylist.html' title='Java hidden gem: CopyOnWriteArrayList()'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-3543860704639632983</id><published>2015-01-27T22:50:00.001-01:00</published><updated>2015-01-27T22:50:25.159-01:00</updated><title type='text'>Java: RandomAccessFile + BufferedReader = FileRandomReadLines</title><content type='html'>In the Java world when reading large text files you are &lt;i&gt;usually&lt;/i&gt; left with two options:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;RandomAccessFile&lt;/li&gt;&lt;li&gt;BufferedReader&lt;/li&gt;&lt;/ol&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-xvXyMv42HHk/VMgjpsCGYEI/AAAAAAAANMk/x2LHWFq3ahI/s1600/mysql.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-xvXyMv42HHk/VMgjpsCGYEI/AAAAAAAANMk/x2LHWFq3ahI/s1600/mysql.jpg&quot; height=&quot;212&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Option 1) allows to read text from any given part of the file but is not buffered, meaning that it will be slow to read lines.&lt;br /&gt;&lt;br /&gt;Option 2) is buffered, therefore fast but you need to read each line from the beginning of the text file until you reach where you want to really read data.&lt;br /&gt;&lt;br /&gt;There are strategies to cope with these mutually exclusive options, one is to read data sequentially, another option is to partition data into different files. However, sometimes you just have that case where you need to &lt;b&gt;resume&lt;/b&gt; some time consuming operation (think on a scale of days) where billions of default sized lines are involved. Neither option 1) nor option 2) will suffice.&lt;br /&gt;&lt;br /&gt;Up to this point I was trying to improve performance, remove any IF&#39;s and any code that could squeeze a few more ounces of speed but the problem remained the same: we need an option 3) that mixes the best of both options. There wasn&#39;t one readily available that I could find around the Internet. &lt;br /&gt;&lt;br /&gt;In the meanwhile I have found a hint that might be possible to feed a BufferedReader directly from a RandomAccessFile. Tested this idea and was indeed possible, albeit still with some rough edges.&lt;br /&gt;&lt;br /&gt;For example, if we are already reading data from the BufferedReader and decide to change the file position on the RandomAccessFile object, the BufferedReader will get erroneous data on the buffer. The solution that I&#39;ve applied is to simply re-create a new BufferedReader, forcing the buffer to be reset.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, I&#39;m making available the code that combines the these two approaches. You find the RandomAccessFile class at &lt;a href=&quot;https://github.com/nunobrito/utils/blob/master/Utils/src/utils/ReadWrite/FileRandomReadLines.java&quot;&gt;https://github.com/nunobrito/utils/blob/master/Utils/src/utils/ReadWrite/FileRandomReadLines.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Has no third-party dependencies, you are likely fine by just downloading and including it on your code. Maybe there is already similar implementation elsewhere published before, I didn&#39;t found one and tried as much as possible to find some ready-made code.&lt;br /&gt;&lt;br /&gt;If you see any improvements possible, do let me know and I&#39;ll include your name on the credits.</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/3543860704639632983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/01/java-randomaccessfile-bufferedreader.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/3543860704639632983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/3543860704639632983'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/01/java-randomaccessfile-bufferedreader.html' title='Java: RandomAccessFile + BufferedReader = FileRandomReadLines'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-xvXyMv42HHk/VMgjpsCGYEI/AAAAAAAANMk/x2LHWFq3ahI/s72-c/mysql.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-57700989516441543.post-4328988012629879146</id><published>2015-01-06T13:41:00.000-01:00</published><updated>2015-05-14T18:10:43.991+00:00</updated><title type='text'>A trillion files</title><content type='html'>2014 has come to an end, so I&#39;m writing a retrospective about what happened and what might be coming down the road in 2015.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-aurquV_86Rg/VKvzCOa8oYI/AAAAAAAANKI/lDoh1AektnQ/s1600/2015-start.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://2.bp.blogspot.com/-aurquV_86Rg/VKvzCOa8oYI/AAAAAAAANKI/lDoh1AektnQ/s1600/2015-start.jpg&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For me, the year had the first milestone reached in February with a talk about &lt;a href=&quot;http://spdx.org/&quot; target=&quot;_blank&quot;&gt;SPDX&lt;/a&gt; and open source in &lt;a href=&quot;http://youtu.be/sFSO68fi7eY&quot; target=&quot;_blank&quot;&gt;FOSDEM&lt;/a&gt;. At that time I was applying to a position as co-chair for the SPDX working group but another candidate in Europe was chosen, apparently more suited.&lt;br /&gt;&lt;br /&gt;Nevertheless, I kept throughout the year with my work related to the SPDX open format. In FOSDEM was debuted the &lt;a href=&quot;http://youtu.be/nljP6hC8xbc&quot; target=&quot;_blank&quot;&gt;first graphical visualizer&lt;/a&gt; for SPDX documents, in the process was written a license detection engine to &lt;a href=&quot;https://github.com/triplecheck/reporter/wiki/Installing&quot; target=&quot;_blank&quot;&gt;find common software licenses&lt;/a&gt; and place this information on newly generated SPDX documents.&lt;br /&gt;&lt;br /&gt;On the TripleCheck side, funding was a growing difficulty across the year. After FOSDEM there was urgency in raising funds to keep the company running. At that point we had no MVP &lt;i&gt;(minimum viable prototype)&lt;/i&gt; to show and investors had no interest in joining the project. Despite our good intentions and attempts to &lt;a href=&quot;http://youtu.be/7N8C8OUHRfA&quot; target=&quot;_blank&quot;&gt;explain the business concept&lt;/a&gt;, we didn&#39;t had the needed presentation and business skills to move forward. The alternative option for funding without depending on investors was the EUREKA funding from the EuroStars program.&lt;br /&gt;&lt;br /&gt;For this purpose was formed a partnership with an aerospace organization and another company well matured in the open source field. We aimed to move a step forward in terms of open source licensing analysis. After months of preparation, iteration and project submission we got a reply: not accepted. The critique that pained me the most was reading that our project would be open source, therefore unable to maintain a sustainable business because competitors would copy our work. Maybe they have a point, but being open source ourselves is our leverage against competitors since this is a path they will not cross and that opened the doors of the enterprise industry to what we do. Open sourced companies are hard to succeed, despite the hard path I wasn&#39;t willing to see us become like the others.&lt;br /&gt;&lt;br /&gt;In parallel, people had been hired in previous months to work on the business side of TripleCheck but it just wasn&#39;t working as we hoped. The focus then moved strictly to code development and reach an MVP but this wasn&#39;t working from a financial perspective either. At this point my own bank savings were depleted, the company reduced back to the two original founding members and seemed the end of the story for yet another startup that tried their luck. We did not had the finances, nor the team, nor the infrastructure to process open source software in large scale.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Failure was here, was time to quit and go home. So, as an engineer I just assumed failure as a consolidated fact. Now with everything failed, there was nothing to lose. The question was &quot;&lt;i&gt;what now?&lt;/i&gt;&quot;&lt;br /&gt;&lt;br /&gt;There was enough money in the bank to pay rent and stay at home for a couple of months. Finding a new job is relatively easy when you know your way around computers. It was a moment very much like a certain &lt;a href=&quot;http://www.dailymotion.com/video/xbyc2_depeche-mode-only-when-i-lose-mysel_music&quot; target=&quot;_blank&quot;&gt;song&lt;/a&gt; where the only thing occupying the mind was not really failure, but the fact that I remained passionate about solving the licensing problem and wanted to get this project done.&lt;br /&gt;&lt;br /&gt;So, let&#39;s clear the mind and start fresh. No outside financing from VC, no ambitious business plans, no business experts, no infrastructure nor any resources other than what is available right now. Let&#39;s make things work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Kept working on the tooling, kept moving forward and eventually got approached by companies that needed consulting. TripleCheck was no longer a startup looking for explosive growth, it had now the modest ambition of making enough to pay the bills and keep working with open source.&lt;br /&gt;&lt;br /&gt;Consulting on the field of open source compliance is not easy when you&#39;re a small company. While bigger consulting companies on this field can afford to just give back a report listing what is wrong with the code of a client, we had to do the same, plus putting our hands to change the code and make it compliant. Looking back in time, this was one heck of way to get expertise in complete and fast-forward manner.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Each client became a beta-tester for the tooling developed at the same time. This meant that the manual process was incrementally replaced with an automated method. Our tooling got improved with each analysis that brought different code to analyze, different requirements and different licenses to interpret. At the some point the tooling got so accurate that could now detect licensing faults on the open source code from companies &lt;a href=&quot;http://nunobrito1981.blogspot.de/2014/11/looking-into-net-license-compliance.html&quot; target=&quot;_blank&quot;&gt;such as Microsoft&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At this time surfaced our first investor. A client was selling his company and he got amazed with the work done while inspecting his code. For me this was one of those turning points, now we had a business expert on our side. Our old powerpoint pitch-decks were crap, nobody really understood why someone needed a compliance check. But this investor had lived through the pain of not having his code ready for acquisition and how relevant this code repair had been. This had become an opportunity to bring aboard a person with first hand experience as a client that we didn&#39;t had to explain why it mattered to fix licensing with a tool, not an expert human.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;With his support more business got done and our &lt;a href=&quot;http://youtu.be/Le17DNDw4fk&quot; target=&quot;_blank&quot;&gt;presentation improved&lt;/a&gt;. Was now possible to move forward. One of the goals in mind was the creation of an independent open source archive. In August we reached the mark of 100 million source code files archived. A new type of technology dubbed &quot;&lt;a href=&quot;https://github.com/triplecheck/big&quot; target=&quot;_blank&quot;&gt;BigZip&lt;/a&gt;&quot; was developed for this purpose since normal file systems and archives were ill suited for this scale of archive processing. A good friend of mine described nicely this concept as a &quot;reversed zipped tar&quot;. Meaning that we create millions of zip files inside a single file, the reverse action of what tar.gz does in Linux.&lt;br /&gt;&lt;br /&gt;This way got solved the problem of processing files in large numbers. To get files from the Internet was developed a project called &quot;&lt;a href=&quot;https://github.com/triplecheck/gitfinder&quot; target=&quot;_blank&quot;&gt;gitFinder&lt;/a&gt;&quot; that retrieved over 7 million open source projects. Our first significant data-set had been achieved.&lt;br /&gt;&lt;br /&gt;In August was time for the first presence with a stand for TripleCheck on a conference, the FrOSCon. At this event we already had developed a new technology that was able to find snippets of code which were not original. It was dubbed &quot;&lt;a href=&quot;https://github.com/triplecheck/f2f&quot; target=&quot;_blank&quot;&gt;F2F&lt;/a&gt;&quot;, based on a humour inspired motto: &lt;i&gt;&quot;Hashes to Hashes, FOSS to FOSS&quot;&lt;/i&gt; as a mock to the fact that file hashes (MD5, SHA1, ..) were used for exposing FOSS source code files inside proprietary code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This code created a report indicating the snippets of code that were not original and where else on the Internet they could be found. For this purpose I wrote a token translator/comparator and a few other algorithms to detect code similarity. The best memory that I have from this development happened when writing part of the code on a boat directly in front of the Eiffel tower. When you&#39;re a developer, these are the memories that one remembers with a smile as years pass.&lt;br /&gt;&lt;br /&gt;Shortly later in October, TripleCheck got &lt;a href=&quot;http://www.slideshare.net/nunobrito/2014-1014-github-plus-foss-1-million-spdx&quot; target=&quot;_blank&quot;&gt;attention at LinuxCon&lt;/a&gt; in Europe. For this event we brought aboard a partnership with &lt;a href=&quot;http://searchcode.com/&quot;&gt;http://searchcode.com&lt;/a&gt; to &lt;a href=&quot;http://searchcode.com/spdx&quot; target=&quot;_blank&quot;&gt;create or view online an SPDX&lt;/a&gt; document from a given repository on GitHub. In the same event we made available a &lt;a href=&quot;https://github.com/triplecheck/diy&quot; target=&quot;_blank&quot;&gt;DIY project&lt;/a&gt; that enabled anyone to generate 1 million SPDX documents. To provide context, the SPDX format is criticized by the lack of example documents available to public. The goal was making available as many documents as possible. Sadly, no public endorsement from the SPDX working group came to this kind of activities. To make matters worse, too often my emails went &lt;a href=&quot;http://lists.spdx.org/pipermail/spdx-biz/2014-November/000601.html&quot; target=&quot;_blank&quot;&gt;silently ignored&lt;/a&gt; on the mailing list whenever proposing improvements. That was sad, had real hopes to see this open standard rise.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Can only wonder if the Linux Foundation will ever react. I&#39;m disenchanted with the SPDX direction but believe we (community) very much need this open standard for code licensing to exist, so I keep working to make it reachable and free of costs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From November to December the focus was scaling our infrastructure. This meant a code rewrite to apply lessons learned. The code complexity was simplified to a level where we can keep using inexpensive hardware and software where only 1~2 developers are needed to improve the code.&lt;br /&gt;&lt;br /&gt;The result was a platform that reached by the end of December the milestone of one trillion files archived. In this sense we achieved what others said to be impossible without the proper funds. These files belong to several million projects around the web that are now ready for use in future code analysis. For example, upcoming in 2015 is the introduction of two similarity matching algorithms converted to Java. One of them is &lt;a href=&quot;https://github.com/triplecheck/TLSH&quot; target=&quot;_blank&quot;&gt;TLSH&lt;/a&gt; from TrendMicro and the second is &lt;a href=&quot;https://github.com/sdhash/sdhash&quot; target=&quot;_blank&quot;&gt;SDHash&lt;/a&gt;. This is code that we are directly donating back to the original authors after conversion and will be testing to see how it performs on code comparisons.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In retrospective I am happy. We passed through great and collapsing moments, lived through a journey that builds code that others can reuse. I&#39;m happy that TripleCheck published more code in a single year than any other licensing compliance provider has ever done over the term of their existence, which in most cases is above a decade.&lt;br /&gt;&lt;br /&gt;At the end of day after TripleCheck is long gone, it is this same code that will remain public and reachable for other folks to re-use. Isn&#39;t knowledge sharing one of the cornerstones of human revolution? In 2014 we have helped human knowledge about source code to move forward, let&#39;s now start 2015.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://nunobrito1981.blogspot.com/feeds/4328988012629879146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nunobrito1981.blogspot.com/2015/01/a-trillion-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/4328988012629879146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/57700989516441543/posts/default/4328988012629879146'/><link rel='alternate' type='text/html' href='http://nunobrito1981.blogspot.com/2015/01/a-trillion-files.html' title='A trillion files'/><author><name>Max Brito</name><uri>https://plus.google.com/103402553186575297840</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-y6VXSv2moo8/AAAAAAAAAAI/AAAAAAAAKuo/GK_64LLY_80/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-aurquV_86Rg/VKvzCOa8oYI/AAAAAAAANKI/lDoh1AektnQ/s72-c/2015-start.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry></feed>