tag:blogger.com,1999:blog-69227194751906164772024-03-13T11:42:30.462+01:00Tech stuffMichaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.comBlogger145125tag:blogger.com,1999:blog-6922719475190616477.post-52538713150613115252019-04-25T22:23:00.000+02:002019-04-25T22:23:39.104+02:00Gallium OS 3 (beta2) on Acer Chromebook<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTxhoJ88-wGi-GOlcW0N74_klzSvFmAfnCCor6Q60azIlzYQ4girnpba2d_xa9ugp52Nb5TnxMQaIaMiNnlnSMjodoXFy_-OaFA6nLqrgXHbpoKdchV8lyRBnjYM4i2ZetMzB_0G4PTdiQ/s1600/galliumos.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTxhoJ88-wGi-GOlcW0N74_klzSvFmAfnCCor6Q60azIlzYQ4girnpba2d_xa9ugp52Nb5TnxMQaIaMiNnlnSMjodoXFy_-OaFA6nLqrgXHbpoKdchV8lyRBnjYM4i2ZetMzB_0G4PTdiQ/s1600/galliumos.png" /></a><br />
I reinstalled my Acer "CB3-131" Chromebook with <a href="https://www.reddit.com/r/GalliumOS/comments/bak8lt/galliumos_30beta_released/">GalliumOS v3 beta 2</a>. The procedure to install GalliumOS still applies: <a href="https://wiki.galliumos.org/Hardware_Compatibility">https://wiki.galliumos.org/Hardware_Compatibility</a>.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs__Dui16IsHWtrDQjtFNBY9ny_DrmHyekWQRN7GTz10v3ldSBf6tg-_DKYJkNrgYbjsx-8PrfGfbrhzjAOTTYdggreyyWlvTCo1aCuCWcNZ_zKIwE-nxeOuNYAmkWU2ekggDwtrFhletM/s1600/2001062609.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs__Dui16IsHWtrDQjtFNBY9ny_DrmHyekWQRN7GTz10v3ldSBf6tg-_DKYJkNrgYbjsx-8PrfGfbrhzjAOTTYdggreyyWlvTCo1aCuCWcNZ_zKIwE-nxeOuNYAmkWU2ekggDwtrFhletM/s200/2001062609.jpeg" width="200" /></a><br />
After install, everything just works fine <a href="https://michael-peeters.blogspot.com/2016/10/galliumos-2-fixing-keyboard-layout-on.html">as it did with version 2</a> Only two small issues were easy to fix:<br />
<ul>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdLdyw-g8aMhOot0vtlGjeRGn8xOpx4Bffi_ax-0KBgXyh1YIq9RpvDWeK_7ss-abpYV68yuyEUib7RoX85N1JN6LhOSQdZXpeCtkQ1t18fx8chToEnAx-hHBJ9qgyFnokf7Yh4enjauKr/s1600/amixer+galliumos3.0beta+startup.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="555" data-original-width="474" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdLdyw-g8aMhOot0vtlGjeRGn8xOpx4Bffi_ax-0KBgXyh1YIq9RpvDWeK_7ss-abpYV68yuyEUib7RoX85N1JN6LhOSQdZXpeCtkQ1t18fx8chToEnAx-hHBJ9qgyFnokf7Yh4enjauKr/s200/amixer+galliumos3.0beta+startup.png" width="170" /></a>
<li>by default, GalliumOS uses the "right alt" for providing access to the functionkeys. On some-keyboard-layouts like azerty, the right alt is already used to access special characters ("<i>alt gr</i>"). This "alt gr" key combination is not working on a default GalliumOS install.<br /><u>solution</u>: open the "Keyboard" application and in the "<i>Layout</i>"-tab select the "<i>Chromebook (most models) | Search overlay | F keys mapped to media keys</i>" entry for "Keyboard model". You can now accessing the F-keys by combining them with the search-key. "Alt gr" will now work fine.</li>
<li>The volume of the headset and the builtin speakers is very low. As a workaround I added an entry to the "Session and Startup" with the following command:<br /><span style="font-family: "courier new" , "courier" , monospace;">bash -c 'sleep 5 ; amixer -c chtmax98090 set "Speaker" 100% ; amixer -c chtmax98090 set "Headphone" 100%'</span><br />ref:<a href="https://www.reddit.com/r/GalliumOS/comments/9o5jix/galliumos_30_audio_volume_low/">https://www.reddit.com/r/GalliumOS/comments/9o5jix/galliumos_30_audio_volume_low/</a></li>
</ul>
<br />
<div>
</div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-39324256183409710582019-03-13T12:46:00.002+01:002019-03-13T12:52:21.463+01:00Hanging M3U8 downloads in ffmpegOn my ubuntu laptop ffmpeg was regularly hanging while downloading a ".m3u8" video stream. Youtube-dl uses ffmpeg under the hood to download those type of files.<br />
<br />
e.g.:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">ffmpeg -y -loglevel verbose -headers "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7? Accept-Language: en-us,en;q=0.5? Accept-Encoding: gzip, deflate? Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8? User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0?" -i https://cdn.provider.url.../content/.../file.m3u8 -tls_verify 1 -c copy -f mp4 "file:resultingfile.mp4" </span></blockquote>
This command would stop at some random point when opening a ".ts" video fragment. <br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">[hls,applehttp @ 0xc16300] Opening 'crypto+https://.../fragment.ts' for reading
</span></blockquote>
Waiting for timeouts and playing with the ffmpeg options didn't seem to help.<br />
<br />
An <span style="font-family: "courier new" , "courier" , monospace;">strace</span> would indicate the server is not responding, but still is keeping the socket open.<br />
<br />
e.g.: (do NOT run <span style="font-family: "courier new" , "courier" , monospace;">strace</span> as a background process with &)<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">strace ffmpeg
-y -loglevel verbose -headers "Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.7? Accept-Language: en-us,en;q=0.5?
Accept-Encoding: gzip, deflate? Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8?
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101
Firefox/59.0?" -i https://cdn.provider.url.../content/.../file.m3u8
-tls_verify 1 -c copy -f mp4 "file:resultingfile.mp4" > /tmp/ffmpeg.log 2>&1</span></blockquote>
<br />
would gives the following output<br />
<blockquote>
<span style="font-family: "courier new" , "courier" , monospace;">...</span><span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 5</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">fcntl64(5, F_GETFL) = 0x2 (flags O_RDWR)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">fcntl64(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">connect(5, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("...")}, 16) = -1 EINPROGRESS (Operation now in progress)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">poll([{fd=5, events=POLLOUT}], 1, 100) = 1 ([{fd=5, revents=POLLOUT}])</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">getsockopt(5, SOL_SOCKET, SO_ERROR, [0], [4]) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">open("/etc/ssl/certs/ca-certificates.crt", O_RDONLY|O_LARGEFILE) = 6</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">fstat64(6, {st_mode=S_IFREG|0644, st_size=235192, ...}) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">_llseek(6, 0, [0], SEEK_CUR) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">fstat64(6, {st_mode=S_IFREG|0644, st_size=235192, ...}) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">read(6, "-----BEGIN CERTIFICATE-----\nMIIH"..., 233472) = 233472</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">read(6, "UMlQMAimTHpKG9n/v55IFDlndmQguLvq"..., 4096) = 1720</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">read(6, "", 4096) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">close(6) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">clock_gettime(CLOCK_REALTIME, {tv_sec=1552330418, tv_nsec=452985119}) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">gettimeofday({tv_sec=1552330418, tv_usec=453367}, NULL) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">gettimeofday({tv_sec=1552330418, tv_usec=453637}, NULL) = 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">poll([{fd=5, events=POLLOUT}], 1, 100) = 1 ([{fd=5, revents=POLLOUT}])</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">send(5, "\26\3\1\0\352\1\0\0\346\3\3\\\206\256\373\263ZO\233\356U\344b\204O\3217\275\16fb\331"..., 239, MSG_NOSIGNAL) = 239</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">poll([{fd=5, events=POLLIN}], 1, 100) = 0 (Timeout)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">poll([{fd=5, events=POLLIN}], 1, 100) = 0 (Timeout)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">poll([{fd=5, events=POLLIN}], 1, 100) = 0 (Timeout)<br />...</span></blockquote>
<br />
Perhaps the server was doing some connection throttling? <br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><b>Workaround: proxy all trafic with tinyproxy</b></span><br />
<ul>
<li>Install tinyproxy:
<span style="font-family: "courier new" , "courier" , monospace;">sudo apt install tinyproxy</span><br />
</li>
<li>tweak the following config items: <span style="font-family: "courier new" , "courier" , monospace;">sudo nano /etc/tinyproxy/tinyproxy.conf</span><br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;"># I lowered the timeout from 600s to 60s</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Timeout 60</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># only accept localhost connections</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Allow 127.0.0.1</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#'stealth mode'</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">DisableViaHeader Yes </span></blockquote>
</li>
<li>
restart the daemon:<br />
<span style="font-family: "courier new" , "courier" , monospace;">sudo systemctl restart tinyproxy </span><br />
</li>
<li>
a quick test will validate the proxy is working: <br />
<span style="font-family: "courier new" , "courier" , monospace;">wget https://www.google.com -e use_proxy=yes -e http_proxy=127.0.0.1:8888
</span></li>
</ul>
If you download the m3u8 stream through the proxy, any hickup in the download will trigger a timeout in the proxy and let the download proceed on.<br />
<br />
ffmpeg syntax: (recent ffmpeg versions have a -http_proxy option)<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">http_proxy="http://127.0.0.1:8888" <span style="font-family: "courier new" , "courier" , monospace;">ffmpeg
-y -loglevel verbose -headers "Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.7? Accept-Language: en-us,en;q=0.5?
Accept-Encoding: gzip, deflate? Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8?
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101
Firefox/59.0?" -i https://cdn.provider.url.../content/.../file.m3u8
-tls_verify 1 -c copy -f mp4 "file:resultingfile.mp4"</span></span></blockquote>
<br />
Youtube-dl syntax: <br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">youtube-dl --proxy http://127.0.0.1:8888/ ...</span></blockquote>
<br />
You can check the tinyproxy log to validate the proxy is working correctly:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">sudo tail -f /var/log/tinyproxy/tinyproxy.log </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">INFO Mar 13 12:34:53 [525]: No upstream proxy for ...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">CONNECT Mar 13 12:34:53 [525]: Established connection to host "ondemand-b.lwc.vrtcdn.be" using file descriptor 8.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">INFO Mar 13 12:34:53 [525]: Not sending client headers to remote machine</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">CONNECT Mar 13 12:34:54 [523]: Connect (file descriptor 7): localhost [127.0.0.1]</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">CONNECT Mar 13 12:34:54 [523]: Request (file descriptor 7): CONNECT ...:443 HTTP/1.1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">INFO Mar 13 12:34:54 [523]: No upstream proxy for ...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">CONNECT Mar 13 12:34:54 [523]: Established connection to host "..." using file descriptor 8.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">INFO Mar 13 12:34:54 [523]: Not sending client headers to remote machine</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">INFO Mar 13 12:34:54 [525]: Closed connection between local client (fd:7) and remote client (fd:8)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">INFO Mar 13 12:34:54 [523]: Closed connection between local client (fd:7) and remote client (fd:8)</span></blockquote>
<br />
<br />
<br />
<br />
<br />
<br />Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com7tag:blogger.com,1999:blog-6922719475190616477.post-77240697409738691392018-06-02T12:42:00.001+02:002018-06-02T12:45:42.070+02:00Improving Language Support in Kubuntu 18.04After a few days of use Kubuntu 18.04 seems quite solid and smooth for my use as a main OS, even on a very limited Intel Celeron CPU N3050 @ 1.60GHz with 4 gigs of memory.<br />
<br />
The biggest issue so far with kubuntu is it suboptimal language support, at least compared to regular Ubuntu. Luckily, it's very easy to add full Ubuntu-like support for non English languages by doing a small gnome-detour.<br />
<br />
In a Konsole, run the following commands:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ sudo apt install language-selector-gnome<br />$ gnome-language-selector</span></blockquote>
With the gnome-language-selector you can now configure the additional languages you wish to use.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGJ5f-aG5gMG_03PZtllXGteT0XzY2kUqggtI2Vnqw52KtrA9-sNsbOxUvPXqeD0QFIzKq3RBJD6eFvIj-CG0vOFxYugWggpoWvnHKFxoq_1Fla5wciPv7bDhQwk-1YFGJ7xGdTpbqLt6R/s1600/kubuntu+gnome-language+support.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="581" data-original-width="608" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGJ5f-aG5gMG_03PZtllXGteT0XzY2kUqggtI2Vnqw52KtrA9-sNsbOxUvPXqeD0QFIzKq3RBJD6eFvIj-CG0vOFxYugWggpoWvnHKFxoq_1Fla5wciPv7bDhQwk-1YFGJ7xGdTpbqLt6R/s320/kubuntu+gnome-language+support.png" width="320" /></a></div>
If you don't like the additional gnome dependencies, you can uninstall the <span style="font-family: "courier new" , "courier" , monospace;">gnome-language-selector</span> package afterwards. Kubuntu has also a command line alternative, but I didn't test it by myself:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">sudo apt install $(check-language-support)</span></blockquote>
One last issue I had is that the Konsole (actually Bash) language was somehow set to French. Apparently, Bash is confused when the <span style="font-family: "courier new" , "courier" , monospace;">LANGUAGE</span> environment variable has multiple elements. Start the KDE "Language" application and make sure you have only one "Preferred Language" set.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0ZbHBooPCLbzbqpBFHCrptSQ6wj_Bv2GVW4c6u0-JvxjzsCNFtGY5DKA6Gh54r1u1dQgm-L4FsBQiVQjDKQM5QaH_CwOpnQFao-NxiQT8eGSS6cKl1qm7XQoHe3IT_fa-nPQVY2f60STr/s1600/kubuntu+language+settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="522" data-original-width="744" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0ZbHBooPCLbzbqpBFHCrptSQ6wj_Bv2GVW4c6u0-JvxjzsCNFtGY5DKA6Gh54r1u1dQgm-L4FsBQiVQjDKQM5QaH_CwOpnQFao-NxiQT8eGSS6cKl1qm7XQoHe3IT_fa-nPQVY2f60STr/s320/kubuntu+language+settings.png" width="320" /></a></div>
In the terminal you can check if <span style="font-family: "courier new" , "courier" , monospace;">LANGUAGE</span> has only a single language:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ locale<br />LANG=en_US.UTF-8<br /><b>LANGUAGE=en_US</b><br />LC_CTYPE="en_US.UTF-8"<br />LC_NUMERIC="en_US.UTF-8"<br />LC_TIME="en_US.UTF-8"<br />LC_COLLATE="en_US.UTF-8"<br />LC_MONETARY="en_US.UTF-8"<br />LC_MESSAGES="en_US.UTF-8"<br />LC_PAPER="en_US.UTF-8"<br />LC_NAME="en_US.UTF-8"<br />LC_ADDRESS="en_US.UTF-8"<br />LC_TELEPHONE="en_US.UTF-8"<br />LC_MEASUREMENT="en_US.UTF-8"<br />LC_IDENTIFICATION="en_US.UTF-8"<br />LC_ALL=en_US.UTF-8</span></blockquote>
<br />
reference: <a href="https://askubuntu.com/questions/769609/how-to-install-additional-languages-in-kubuntu-16-04-lts">https://askubuntu.com/questions/769609/how-to-install-additional-languages-in-kubuntu-16-04-lts</a><br />Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-46646498969401119542018-03-11T19:53:00.000+01:002020-05-22T13:53:59.432+02:00Running Volumio 2 on a Raspberry Pi 2 model B with a 3.5" Touchscreen<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfUHEacRmQe_Q5oUW7ymViQKVrAhkZPIH3VM3MzCNupyjdsL_R2T5rfBksqUPHSm78uOyiKsJwe-O8nsVkkpyAgk33ag6vyQQrMf7TyC0TfAf_bWz6hACivmDFx2WLbY9D_VnFdRAR_1ps/s1600/IMG_20180307_212221.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfUHEacRmQe_Q5oUW7ymViQKVrAhkZPIH3VM3MzCNupyjdsL_R2T5rfBksqUPHSm78uOyiKsJwe-O8nsVkkpyAgk33ag6vyQQrMf7TyC0TfAf_bWz6hACivmDFx2WLbY9D_VnFdRAR_1ps/s320/IMG_20180307_212221.jpg" width="320" /></a></div>
I was pleasantly surprised with how well <a href="https://volumio.org/">Volumio 2</a> runs out of the box on my old Raspberry Pi 2 model B using an external USB DAC (in my case, <a href="https://www.amazon.de/Behringer-U-Control-UCA222-Interface-Soundkarte/dp/B0023BYDHK/ref=sr_1_1?ie=UTF8&sr=8-1&keywords=behringer+uca222+usb">Behringer UCA222</a>). As a next step, I wanted to add a <a href="https://www.amazon.de/dp/B06X191RX7/ref=pe_3044161_185740101_TE_item">small 3.5 inch display</a> that connects to the 26 GPIO pins of my Pi 2 B.<br />
<br />
The setup of the 3.5" LCD screen is a bit tougher than expected, but after a lot of googling and trial and error I got the LCD touchscreen fully working with Volumio 2. It seems like the same display is sold under different brands.<br />
<br />
These are the steps to get the display working:<br />
<ul>
<li>get Volumio running on your Raspberry Pi:</li>
<ul>
<li>install and activate Volumio on an SD card: follow the excellent guide in <a href="https://volumio.org/get-started/">https://volumio.org/get-started/</a></li>
<ul>
<li><i>2020-05: the latest volumio image still doesn't work for me on an old Pi 2 model B -- some issue with the overlayfs remaining stuck at 100% and causing "Dirty Bit set" error on /boot. I had to use the an image from 2018 </i><i><a href="http://updates.volumio.org/pi/volumio/2.457/volumio-2.457-2018-09-17-pi.img.zip">http://updates.volumio.org/pi/volumio/2.457/volumio-2.457-2018-09-17-pi.img.zip</a> and upgrade Volumio to the latest version(System / Check Updates). Now Volumio does work reliably.</i></li>
</ul>
<li>run the ssh daemon by going to <a href="http://volumio.local/dev/">http://volumio.local/dev/</a></li>
</ul>
<li>install and activate the Touch Display Plugin<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY6b5Y_oFyzciTNxmGpD6kxhc3IEPYZYzVxhfQPilEIE2tO4i-qMgBw-BMiO4ZGThyphenhyphenaGIwv0-NQE0fOYvDq4CQIei65HV9UckSB8fG7ca9i85MQcK8MjUep319zhf6eij7VJhS8Nb4ixQB/s1600/Screenshot+from+2018-03-10+15-28-45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="648" data-original-width="1296" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY6b5Y_oFyzciTNxmGpD6kxhc3IEPYZYzVxhfQPilEIE2tO4i-qMgBw-BMiO4ZGThyphenhyphenaGIwv0-NQE0fOYvDq4CQIei65HV9UckSB8fG7ca9i85MQcK8MjUep319zhf6eij7VJhS8Nb4ixQB/s320/Screenshot+from+2018-03-10+15-28-45.png" width="320" /></a></li>
<ul></ul>
</ul>
<ul>
<li><div class="separator" style="clear: both; text-align: left;">
connect to your Raspberry Pi CLI through ssh (username: volumio; password: volumio) and execute the following commands</div>
</li>
<ul>
<li>download the display driver:<br /><span style="font-family: "courier new" , "courier" , monospace;">git clone https://github.com/goodtft/LCD-show</span></li>
<li>run these few commands (handpicked from the <span style="font-family: "courier new" , "courier" , monospace;">LCD35-show</span> script -- do NOT run the script!):<br /><span style="font-family: "courier new" , "courier" , monospace;">cd LCD-show/<br />sudo mkdir /etc/X11/xorg.conf.d<br />sudo cp ./usr/tft35a-overlay.dtb /boot/overlays/<br />sudo cp ./usr/tft35a-overlay.dtb /boot/overlays/tft35a.dtbo<br />sudo cp -rf ./usr/99-calibration.conf-35-90 /etc/X11/xorg.conf.d/99-calibration.conf<br />sudo mkdir -p /usr/share/X11/xorg.conf.d/<br />sudo cp -rf ./usr/99-fbturbo.conf /usr/share/X11/xorg.conf.d/</span></li>
<li>modify the <span style="font-family: "courier new" , "courier" , monospace;">99-calibration.conf</span><span style="font-family: inherit;"> file and add the </span><span style="font-family: "courier new" , "courier" , monospace;">Driver "evdev"</span> option<span style="font-family: inherit;">: </span></li>
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace;">sudo nano /etc/X11/xorg.conf.d/99-calibration.conf</span></li>
<li>the file should be:<br /><span style="font-family: "courier new" , "courier" , monospace;">Section "InputClass"<br /> Identifier "calibration"<br /> MatchProduct "ADS7846 Touchscreen"<br /> Option "Calibration" "3936 227 268 3880"<br /> Option "SwapAxes" "1"<br /> <b>Driver "evdev"</b><br />EndSection</span></li>
<li>save the file (Control-X)</li>
</ul>
<li>create a new <span style="font-family: "courier new" , "courier" , monospace;">/boot/userconfig.txt</span> (<i>2020-05 update: </i>this file is automatically included in <span style="font-family: "courier new" , "courier" , monospace;">/boot/config.txt</span> by Volumio)</li>
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace;">sudo nano /boot/userconfig.txt</span></li>
<li>add the single line:<span style="font-family: "courier new" , "courier" , monospace;"><br /><b>dtoverlay=tft35a</b></span></li>
<li>save the file (Control-X)</li>
</ul>
<li>install missing packages:</li>
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace;">sudo apt update</span></li>
<li><span style="font-family: "courier new" , "courier" , monospace;">sudo apt install lightdm</span></li>
<li><span style="font-family: "courier new" , "courier" , monospace;">sudo apt install xserver-xorg-input-evdev</span></li>
</ul>
<li>fix the autologin user for lightdm (<i>updated 2020-05)</i></li>
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace;">sudo nano /etc/lightdm/lightdm.conf</span></li>
<li>modify the "autologin" user from "pi" to "volumio":<span style="font-family: "courier new" , "courier" , monospace;"><br /><b>autologin-user=volumio</b></span></li>
<li>save the file (Control-X)</li>
</ul>
</ul>
</ul>
<div>
After a reboot, everything works fine :). </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbi3JI3D3GSCD3UW5RJQMG1mZZmEUrIabi2Bv_CRkbclhA70ImKmsfjt94jpYvq32Y5PrurEC4KWWaITWPFJjEYGkPvbaff4RqM0GkNymUz-I38amosyws6RmxDnEzOYGMkT3Hd5u7Ql2d/s1600/IMG_20200522_130313.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="937" data-original-width="1508" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbi3JI3D3GSCD3UW5RJQMG1mZZmEUrIabi2Bv_CRkbclhA70ImKmsfjt94jpYvq32Y5PrurEC4KWWaITWPFJjEYGkPvbaff4RqM0GkNymUz-I38amosyws6RmxDnEzOYGMkT3Hd5u7Ql2d/s320/IMG_20200522_130313.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<br /></div>
The final product is functional, but not perfect: the boot time takes a few minutes and chromium in kiosk mode is not very snappy. This might be a limitation of the older Raspberry Pi hardware. But as a simple display and for basic pause/play interaction, it works.<br />
<br />
You can optionally disable the sleep mode and change the orientation of display in the Touch Display Plugin settings:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEircEt2ZegJ_naFms9XWW55T7PQBSwKUWgmiNSre2Vay7LFvTHlWkp5BSUbv8VRoArQEwCvSYFlVqFmeyX4qJIYRvobqyyH45Wfa9T0TQQvq0YhjPp8SiiWB6XKm2KH3hq8r9jcmsQFCVpY/s1600/Screenshot_2020-05-22_13-10-44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="546" data-original-width="697" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEircEt2ZegJ_naFms9XWW55T7PQBSwKUWgmiNSre2Vay7LFvTHlWkp5BSUbv8VRoArQEwCvSYFlVqFmeyX4qJIYRvobqyyH45Wfa9T0TQQvq0YhjPp8SiiWB6XKm2KH3hq8r9jcmsQFCVpY/s200/Screenshot_2020-05-22_13-10-44.png" width="200" /></a></div>
<div style="text-align: center;">
<br /></div>
The "classic" layout (settings > appearance) seems to work out a bit cleaner on a small display:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgioL_DLleq1CfEANAHNSMGMWCXg3iUjLH0la6Jcjir2cvGPWzEURY1wnSLzsxRGA2FERMTGBYyEacFmgSQ_1HFGZ2EE0qhe0dG6G4BwCoJiwLOZS7tTgECA_ZWbCY48yeKVJf_cUlDuUBa/s1600/Screenshot_2020-05-22_13-47-50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="170" data-original-width="692" height="49" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgioL_DLleq1CfEANAHNSMGMWCXg3iUjLH0la6Jcjir2cvGPWzEURY1wnSLzsxRGA2FERMTGBYyEacFmgSQ_1HFGZ2EE0qhe0dG6G4BwCoJiwLOZS7tTgECA_ZWbCY48yeKVJf_cUlDuUBa/s200/Screenshot_2020-05-22_13-47-50.png" width="200" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
References:<br />
<ul>
<li><a href="https://volumio.org/forum/101-direct-volumio-gui-raspberry-lcd-touchscreen-t3464.html">https://volumio.org/forum/101-direct-volumio-gui-raspberry-lcd-touchscreen-t3464.html</a></li>
<li>use evdev driver: <a href="https://github.com/notro/fbtft/issues/445#issuecomment-354714529">https://github.com/notro/fbtft/issues/445#issuecomment-354714529</a></li>
<li>screen timeout: <a href="https://volumio.org/forum/screentimeout-rpi-touchscreen-t5059.html">https://volumio.org/forum/screentimeout-rpi-touchscreen-t5059.html</a></li>
<li>chromium restore tabs alert: <a href="https://superuser.com/a/864918">https://superuser.com/a/864918</a></li>
<li>older images: <a href="https://volumio.org/forum/older-volumio-versions-img-files-t7009.html">https://volumio.org/forum/older-volumio-versions-img-files-t7009.html</a></li>
<li>fix playlist issues for volumio: <a href="https://volumio.org/forum/play-stops-midway-through-queue-since-444-t11180-10.html">https://volumio.org/forum/play-stops-midway-through-queue-since-444-t11180-10.html</a> </li>
</ul>
<br />
<br />Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com33tag:blogger.com,1999:blog-6922719475190616477.post-50727818992143177172018-02-21T12:38:00.003+01:002018-02-21T12:54:56.200+01:00Ubuntu 17.10 Fixing Intel Graphics Issue on Medion Akoya e1210On a fresh Ubuntu install on my old Medion Akoya e1210 netbook with Intel Graphics the screen is <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvRemUavxUzE8pGiYLInfjRLkVa2oZknyC4MXoc9XihajjPJcybCilaLE0lPVZYrF61ysK_HdydUb9VCTgIQLjfuv-MY6myYbMF6njUd9krbAozh92XDWIjrRqcQugXuCaSVRoL57pytsU/s1600/Medion_E1210.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="580" data-original-width="512" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvRemUavxUzE8pGiYLInfjRLkVa2oZknyC4MXoc9XihajjPJcybCilaLE0lPVZYrF61ysK_HdydUb9VCTgIQLjfuv-MY6myYbMF6njUd9krbAozh92XDWIjrRqcQugXuCaSVRoL57pytsU/s200/Medion_E1210.jpg" width="175" /></a></div>
now corrupted. In the past this never caused any issues. I tried a few Ubuntu derivatives (16.04, 17.10, Xubuntu, Ubuntu Mate & Lubuntu), but the issue remains. The classical tip of using "nomodeset" solves the issue, but uses a suboptimal resolution for the display.<br />
<br />
This is my configuration:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ lspci -nnk | grep -iA2 vga<br />00:02.0 VGA compatible controller [0300]: Intel Corporation Mobile 945GSE Express Integrated Graphics Controller [8086:27ae] (rev 03)<br /> Subsystem: Micro-Star International Co., Ltd. [MSI] Mobile 945GSE Express Integrated Graphics Controller [1462:0110]<br /> Kernel driver in use: i915</span></blockquote>
<br />
I finally found the simple workaround until this is fixed upstream:<br />
<ul>
<li>during boot hold down the "shift" key to show the Grub menu</li>
<ul>
<li>in "advanced", choose the latest kernel in "recovery" mode</li>
<li>now continue the boot normally: the GUI will show up correctly when started from recovery.</li>
</ul>
<li>open a terminal</li>
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace;">sudo nano /etc/default/grub</span></li>
<li>at the end of the file, add the following line:<br /><span style="font-family: "courier new" , "courier" , monospace;">GRUB_GFXPAYLOAD_LINUX=text</span></li>
<li>save the modified file</li>
<li>now run <br /><span style="font-family: "courier new" , "courier" , monospace;">sudo update-grub</span></li>
</ul>
</ul>
<span style="font-family: inherit;">After rebooting, the logon screen should show just fine. </span><br />
<br />
<span style="font-family: inherit;"><b>reference</b>: <a href="https://askubuntu.com/questions/1004912/ubuntu-16-04-3-lts-nosplash-parameter-causes-major-issues."></a> </span><br />
<ul>
<li>bugtracking ticket: <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1724639">https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1724639</a></li>
<li>specific workaround: <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1724639/comments/39">https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1724639/comments/39</a></li>
</ul>
<br />
<span style="font-family: inherit;"></span><br />
<div>
<br /></div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-73734307164690907762018-02-18T21:39:00.001+01:002018-02-21T12:52:04.052+01:00Fixing Black Screen after Boot on Ubuntu 16.04 & 17.10 (Intel Graphics)On my Dell laptop with Intel Graphics I suddenly experienced a black screen on booting Ubuntu <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDt2zqvjs0ZOMjDIuyI8b0TV7Jn8o4fPvylCiqIqOHWqdcrUysNmGyLnG2d3t4QfC0_MBLMl-1tl4FHMtWHi_K5Mo6mcw4XW0C5xr_tXSBUsjAZMCv8Au9Cv9Qd0U1ZRVhE2gepYy7Mmn_/s1600/dell+inspiron+15+3552+ubuntu.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="205" data-original-width="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDt2zqvjs0ZOMjDIuyI8b0TV7Jn8o4fPvylCiqIqOHWqdcrUysNmGyLnG2d3t4QfC0_MBLMl-1tl4FHMtWHi_K5Mo6mcw4XW0C5xr_tXSBUsjAZMCv8Au9Cv9Qd0U1ZRVhE2gepYy7Mmn_/s1600/dell+inspiron+15+3552+ubuntu.jpeg" /></a></div>
16.04 and later. I reinstalled Ubuntu and tried out some Ubuntu derivatives (Mint, Xubuntu), but that didn't help. The classical tip of using "nomodeset" didn't help either.<br />
<br />
This is my configuration:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ lspci -nnk | grep -iA2 vga<br />00:02.0 VGA compatible controller [0300]: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller [8086:22b1] (rev 21)<br /> Subsystem: Dell Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller [1028:06ac]<br /> Kernel driver in use: i915</span></blockquote>
<br />
I finally found the simple solution:<br />
<ul>
<li>during boot hold down the "shift" key to show the Grub menu</li>
<ul>
<li>in "advanced", choose the latest kernel in "recovery" mode</li>
<li>now continue the boot normally: the GUI will show up correctly when started from recovery.</li>
</ul>
<li>open a terminal</li>
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace;">sudo nano /etc/default/grub</span></li>
<li>search for <i><span style="font-family: "courier new" , "courier" , monospace;">splash</span></i> in this file and modify it into <i><span style="font-family: "courier new" , "courier" , monospace;"><b>no</b>splash</span></i></li>
<li>save the modified file</li>
<li>now run <br /><span style="font-family: "courier new" , "courier" , monospace;">sudo update-grub</span></li>
</ul>
</ul>
<span style="font-family: inherit;">After rebooting, the logon screen should show just fine. </span><br />
<br />
<span style="font-family: inherit;"><b>reference</b>: <a href="https://askubuntu.com/questions/1004912/ubuntu-16-04-3-lts-nosplash-parameter-causes-major-issues.">https://askubuntu.com/questions/1004912/ubuntu-16-04-3-lts-nosplash-parameter-causes-major-issues.</a> </span>Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com3tag:blogger.com,1999:blog-6922719475190616477.post-52233311818119740972017-04-24T18:33:00.000+02:002017-04-25T07:33:58.294+02:00Lenovo Yoga 2 11" - Fixing Wifi and Bluetooth under Ubuntu 16.04.2<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI0ujuZzcQWxtlupk5jZvo2m0ZbiFxjxWUguelzHBv8Jg6klyc_NGqqGpp7KWLHjcQZOyioKC2e4zSqAwND-H7yuPAvVITgYIOQ1k3Y3ZBek01ywoOJTLYKCB8Fcs5t0qnA6OR9vlX944k/s1600/lenovo+yoga+2+11.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI0ujuZzcQWxtlupk5jZvo2m0ZbiFxjxWUguelzHBv8Jg6klyc_NGqqGpp7KWLHjcQZOyioKC2e4zSqAwND-H7yuPAvVITgYIOQ1k3Y3ZBek01ywoOJTLYKCB8Fcs5t0qnA6OR9vlX944k/s320/lenovo+yoga+2+11.jpg" width="265" /></a>The Lenovo Yoga 2 11" convertible laptop has a compelling form factor and gives a solid impression. Unfortunately it's not a Linux-friendly laptop as far as wireless is concerned. Under Ubuntu 16.04.2 with a very recent 4.8 kernel, the wifi and bluetooth are not working. To add insult to injury, Lenovo has hardcoded the Broadcom wifi and bluetooth card in the UEFI bootloader, so the laptop refuses tot boot with any replacement wifi card I tested.<br />
<br />
This post details how I managed to get the Broadcom wifi and bluetooth up and running under Ubuntu 16.04.2. Actually, I'm running <a href="https://neon.kde.org/">KDE Neon</a> which is built on 16.04, but the solution should be the same. I used a simple USB3 ethernet dongle for providing initial wired internet connectivity.<br />
<br />
<h4>
wifi</h4>
<div>
the following card is installed in my device:</div>
<div>
<blockquote class="tr_bq">
<span style="font-family: "verdana" , sans-serif;">$ lspci -nn | grep -i broad<br />01:00.0 Network controller [0280]: Broadcom Corporation </span><b style="font-family: verdana, sans-serif;">BCM43142</b><span style="font-family: "verdana" , sans-serif;"> 802.11b/g/n [</span><b style="font-family: verdana, sans-serif;">14e4:4365</b><span style="font-family: "verdana" , sans-serif;">] (rev 01)</span></blockquote>
</div>
<div>
steps to support the wifi card:</div>
<div>
<ul>
<li>deactivate secure boot in the UEFI settings</li>
<li>install the following packages (run in a terminal)</li>
</ul>
<blockquote class="tr_bq">
<span style="font-family: "verdana" , sans-serif;">sudo apt install bcmwl-kernel-source firmware-b43-installer</span></blockquote>
reference: <a href="https://askubuntu.com/questions/55868/installing-broadcom-wireless-drivers">https://askubuntu.com/questions/55868/installing-broadcom-wireless-drivers</a><br />
<br />
<h4>
bluetooth</h4>
The bluetooth device is known in Linux as:<br />
<blockquote class="tr_bq">
<span style="font-family: "verdana" , sans-serif;">$ lsusb | grep Bluetooth</span>
<br />
<span style="background-color: white;"><span style="font-family: "verdana" , sans-serif;">Bus 001 Device 006: ID <b>105b:e065</b> Foxconn International, Inc. <b>BCM43142A0 Bluetooth</b> module</span></span></blockquote>
By default, the firmware is missing due to legal concerns:<br />
<blockquote class="tr_bq">
<span style="font-family: "verdana" , sans-serif;">$ dmesg | grep -i blueto</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.060475] Bluetooth: Core ver 2.21</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.060503] Bluetooth: HCI device and connection manager initialized</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.061584] Bluetooth: HCI socket layer initialized</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.061593] Bluetooth: L2CAP socket layer initialized</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.061607] Bluetooth: SCO socket layer initialized</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.084378] Bluetooth: hci0: BCM: chip id 70</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.105106] Bluetooth: hci0: michael-Lenovo-Yoga-2-11</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.105112] Bluetooth: hci0: BCM (001.001.011) build 0000</span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.110415] bluetooth hci0: Direct <b>firmware load for brcm/BCM.hcd failed with error -2</b></span>
<br />
<span style="font-family: "verdana" , sans-serif;">[ 7.110423] Bluetooth: hci0: BCM: <b>Patch **brcm/BCM.hcd not found**</b></span></blockquote>
There is a Github <a href="https://github.com/winterheart/broadcom-bt-firmware">repository with recent Broadcom bluetooth</a> firmware files, so you don't have manually extract and convert the relevant files from the usb driver.<br />
<br />
Install the BCM.hcd file in a terminal:<br />
<blockquote class="tr_bq">
<span style="font-family: "verdana" , sans-serif;">$ sudo apt install git</span>
<br />
<span style="font-family: "verdana" , sans-serif;">$ cd</span>
<br />
<span style="font-family: "verdana" , sans-serif;">$ git clone https://github.com/winterheart/broadcom-bt-firmware.git</span>
<br />
<span style="font-family: "verdana" , sans-serif;">$ cd broadcom-bt-firmware/brcm</span>
<br />
<span style="font-family: "verdana" , sans-serif;">$ ls -l BCM43142A*</span></blockquote>
Now pick and choose the file that matches the usb device id from the lsusb command above.<br />
<blockquote class="tr_bq">
<span style="font-family: "verdana" , sans-serif;">$ sudo cp BCM43142A0-<b>105b-e065</b>.hcd /lib/firmware/brcm/BCM.hcd
</span></blockquote>
Finally power off / on your pc -- askubuntu explicitly advises against a simple reboot. In my case a simple modprobe cycle was enough:<br />
<blockquote class="tr_bq">
<span style="font-family: "verdana" , sans-serif;">$ sudo modprobe -r btusb</span>
<br />
<span style="font-family: "verdana" , sans-serif;">$ sudo modprobe btusb</span></blockquote>
Reference with much more in depth details: <a href="https://askubuntu.com/questions/632336/bluetooth-broadcom-43142-isnt-working">https://askubuntu.com/questions/632336/bluetooth-broadcom-43142-isnt-working</a><br />
<br />
<br /></div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-4212003035316253662017-02-22T12:32:00.001+01:002017-02-22T16:31:55.048+01:00Sound Stuttering Issues on Gigabyte GB-BXBT-2807 in Ubuntu Mate 16.04<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilbc5w6IgSReh0tfBSIiR0X4pLV6S6vdIpxfXBhYzviK2TjSD2oGmzqnSX-ofqAnod0aG2lOtXVwN2XB3nqFkpJGQgq05a2iOOMk7TLOG3ylYY70OmlmxNNXaTn9j3KGx086xVdlPoCOMa/s1600/Gigabyte+GB-BXBT-2807.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilbc5w6IgSReh0tfBSIiR0X4pLV6S6vdIpxfXBhYzviK2TjSD2oGmzqnSX-ofqAnod0aG2lOtXVwN2XB3nqFkpJGQgq05a2iOOMk7TLOG3ylYY70OmlmxNNXaTn9j3KGx086xVdlPoCOMa/s320/Gigabyte+GB-BXBT-2807.png" width="320" /></a>I experienced random sound stuttering issues on my Gigabyte GB-BXBT-2807 running Ubuntu Mate 16.04. At first, I was investigating PulseAudio, but this was NOT the issue (see <a href="https://wiki.ubuntu.com/PulseAudio/Log">https://wiki.ubuntu.com/PulseAudio/Log</a> and <a href="http://steamcommunity.com/app/8930/discussions/1/540744299662467088?ctp=4">http://steamcommunity.com/app/8930/discussions/1/540744299662467088?ctp=4</a>).<br />
<br />
After some research it appears that the Realtek Wifi driver was to be blamed: every time the wifi driver scans for accesspoints, the +/ 50ms latency occured. Simply disabling wifi solves the issue. In my case I use a wired connection, so I just removed the RTL8723BE mini PCIe card. Problem solved.<br />
<br />
More background info on this bug: <a href="https://bugzilla.redhat.com/show_bug.cgi?id=1262957">https://bugzilla.redhat.com/show_bug.cgi?id=1262957</a> and <a href="https://bugzilla.kernel.org/show_bug.cgi?id=108461">https://bugzilla.kernel.org/show_bug.cgi?id=108461</a><br />
<div>
<br /></div>
<br />
<br />
<br />Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com1tag:blogger.com,1999:blog-6922719475190616477.post-63647224905759524642017-01-08T11:31:00.002+01:002017-01-08T11:33:54.523+01:00Running the USB EasyCAP Video Capture Device in Ubuntu 16.04<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7IuphbcSh2xZBFB52QUiRMhJvQTre1zCO6qYybF0uJoxUYPhthu9sfbTbbuGl3z44VJCJoExMYzFKkCPw87IvvnewR7y38UFGJkZgRHv-QaQBDtrLS6Nfm1LOLF9MOjxfbdFWIykK_YeK/s1600/mumbi+video+grab+device.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7IuphbcSh2xZBFB52QUiRMhJvQTre1zCO6qYybF0uJoxUYPhthu9sfbTbbuGl3z44VJCJoExMYzFKkCPw87IvvnewR7y38UFGJkZgRHv-QaQBDtrLS6Nfm1LOLF9MOjxfbdFWIykK_YeK/s200/mumbi+video+grab+device.jpg" width="200" /></a>I bought an external USB2 video capture device in order to convert old VHS material to digital and to let the kids play with an old <a href="https://en.wikipedia.org/wiki/V.Smile">vtech v.smile game console</a> on Linux. The device I ended up was a "Mumbi Video Grabber USB 2.0" from Amazon (e.g. <a href="https://www.amazon.de/dp/B0042EZ596/ref=pe_217221_31005211_dp_1">https://www.amazon.de/dp/B0042EZ596/ref=pe_217221_31005211_dp_1</a>). It appears that this device is a clone of the so-called "EasyCAP" device. This chipset is well supported under Linux: <a href="https://linuxtv.org/wiki/index.php/Easycap">https://linuxtv.org/wiki/<wbr></wbr>index.php/Easycap</a>.<br />
<br />
Technical details:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ lsusb</span><br />
...<br />
<span style="font-family: "courier new" , "courier" , monospace;"></span><span style="font-family: "courier new" , "courier" , monospace;">Bus 001 Device 008: ID <b>05e1:0408</b> Syntek Semiconductor Co., Ltd STK1160 Video Capture Device</span></blockquote>
<div>
Although the video capture function did work out-of-the-box, I had some trouble with grabbing the sound.<br />
<br />
I ended up with the following bash script that reliably captures the video AND sound. Just create a shell-script file in your home-directory, add the "execute" permissions and create a launcher that references your script.
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">#!/bin/bash</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">amixer -c stk1160mixer sset Line unmute cap </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">cvlc -vvv --color --input-slave=alsa://pulse --live-caching=300 \</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> --v4l2-standard=PAL --deinterlace-mode=yadif \</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> --video-filter=deinterlace v4l:///dev/video0</span></blockquote>
</div>
Details about this script:<br />
<ul>
<li>by default the sound from the USB device is muted. You have to unmute it with the <span style="font-family: "courier new" , "courier" , monospace;">amixer</span> command or, manually, with the <span style="font-family: "courier new" , "courier" , monospace;">alsamixer</span> interface. See <a href="https://linuxtv.org/wiki/index.php/Stk1160#Enable_sound_capture">https://linuxtv.org/wiki/index.php/Stk1160#Enable_sound_capture</a> for details. </li>
<li><span style="font-family: "courier new" , "courier" , monospace;"><b>c</b>vlc</span> runs VLC without the window decorators (menu, etc.). This is handy for having a simple launcher for the kids. Use plain <span style="font-family: "courier new" , "courier" , monospace;">vlc</span> if you don't mind the menus and buttons. </li>
<li>Ubuntu use pulse-audio, so it is important tot use the "<span style="font-family: "courier new" , "courier" , monospace;">pulse</span>" input-slave parameter. I couldn't get other suggested settings like "hw2,0" etc. to work, so stick with "pulse"...</li>
<li>You can try to improve the deinterlace-mode. See <a href="https://wiki.videolan.org/deinterlacing#VLC_deinterlace_modes">https://wiki.videolan.org/deinterlacing#VLC_deinterlace_modes</a> for possible values and how they work.</li>
</ul>
<div>
Known issues: </div>
<div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<ul>
<li>Make sure you configure the video capture device as your sound input device in "Sound Settings":<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0Kn7Es06xhtvy7Q3EJz0dlNrH4NLZ36GMlZvuQ3qlssfCQgoeogvUkM5EZ91DSGlqaBeIghSINqa4axdFYfGyLD_h59E9tuKV2clB4boKoPv0dJDgTnW6mqEjKPMv4oG5-So3vdPTJKu/s1600/Sound+Settings+Ubuntu+16.04+STK1160.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="255" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0Kn7Es06xhtvy7Q3EJz0dlNrH4NLZ36GMlZvuQ3qlssfCQgoeogvUkM5EZ91DSGlqaBeIghSINqa4axdFYfGyLD_h59E9tuKV2clB4boKoPv0dJDgTnW6mqEjKPMv4oG5-So3vdPTJKu/s320/Sound+Settings+Ubuntu+16.04+STK1160.png" width="320" /></a></div>
</li>
<li>The <a href="https://linuxtv.org/wiki/index.php/Stk1160#Enable_sound_capture">linuxtv wiki</a> says that the <span style="font-family: "courier new" , "courier" , monospace;">amixer</span> command must only be run once, but I ended up running it always. This doesn't seem to have any bad effects, so I left it in for now.</li>
<li>When plugging in the USB stick on a <i>live</i> Ubuntu system, the stk1160mixer is not always present. I had the most reliable operation by plugging in the USB device before booting.</li>
</ul>
</div>
And it all works :<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzQ5VyqutPVODu8AOyYrrX54ulDjRHQzp5JK6XgEomNhgo6fyDn3OJNE0Vjsffzb1N8DRnQ6Zlt2YARDTGUlf1NfjNmng8ON2V_xSW5mkP9dW0S_ixMX2UsPRdWpKa8JHKmfSYtPHeKC6m/s1600/vtech+v.smile+screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzQ5VyqutPVODu8AOyYrrX54ulDjRHQzp5JK6XgEomNhgo6fyDn3OJNE0Vjsffzb1N8DRnQ6Zlt2YARDTGUlf1NfjNmng8ON2V_xSW5mkP9dW0S_ixMX2UsPRdWpKa8JHKmfSYtPHeKC6m/s320/vtech+v.smile+screenshot.png" width="320" /></a></div>
<br />
<br />
<br />
<br />Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-67854270950544110312017-01-04T17:44:00.000+01:002017-01-04T17:49:33.293+01:00Fixing an external USB3 ethernet adapter (Realtek r8152) in Ubuntu 16.04<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEj_h48nJRhRKjgg99lGHWWHjZOc9Lc9OBD-2vWjG5JPm2OzOek95pJytfpBuar0AFfvoEmZWlE3fpZyOLa8Z_Ei4NsR0aw1A4b0NGC0u2lENRgarIpC8JywDzC6xpsN6YOXs619abG6XH/s1600/USB+3_0+Metal+HUB+3+Port+with+Gigabit+Ethernet+Adapter++10_100_1000+Mbps.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEj_h48nJRhRKjgg99lGHWWHjZOc9Lc9OBD-2vWjG5JPm2OzOek95pJytfpBuar0AFfvoEmZWlE3fpZyOLa8Z_Ei4NsR0aw1A4b0NGC0u2lENRgarIpC8JywDzC6xpsN6YOXs619abG6XH/s200/USB+3_0+Metal+HUB+3+Port+with+Gigabit+Ethernet+Adapter++10_100_1000+Mbps.jpg" width="200" /></a>I have an external USB3 ethernet adapter that wasn't working under Ubuntu 16.04.<br />
<br />
Details of the adapter:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ lsusb</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>Bus 001 Device 012: ID 0bda:8153 Realtek Semiconductor Corp. </b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Bus 001 Device 011: ID 2109:2812 VIA Labs, Inc. VL812 Hub</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">$ lsmod | grep r8152</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>r8152</b> 49152 0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">mii 16384 2 r8152,usbnet</span>
</blockquote>
Error log:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ dmesg</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">[ 584.877219] usb 1-2.3.3: reset high-speed USB device number 15 using xhci_hcd</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">[ 585.017923] r8152 1-2.3.3:1.0 eth0: v1.08.2</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">[ 586.623086] r8152 1-2.3.3:1.0 enx00e04c...d: renamed from eth0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">[ 586.658451] IPv6: ADDRCONF(NETDEV_UP): enx00e04c...d: link is not ready</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">[ 586.708837] IPv6: ADDRCONF(NETDEV_UP): enx00e04c...d: <b>link is not ready</b></span></blockquote>
After some googling, I found that the issue is related to the USB autosuspend feature (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1236679">https://bugzilla.redhat.com/show_bug.cgi?id=1236679</a>). Luckily, the fix is very easy:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">sudo nano /etc/default/tlp</span></blockquote>
and in this file add the following line:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;"># Exclude listed devices from USB autosuspend (separate with spaces).</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># Use lsusb to get the ids.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># Note: input devices (usbhid) are excluded automatically (see below)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#USB_BLACKLIST="1111:2222 3333:4444"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>USB_BLACKLIST="0bda:8153"</b></span></blockquote>
After a reboot, the USB3 wired ethernet works just fine:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ dmesg</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">[ 87.910485] IPv6: ADDRCONF(NETDEV_CHANGE): enx00e04c...d: link becomes ready
</span></blockquote>
<br />Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-29073730005864681212016-11-25T17:21:00.004+01:002016-12-08T07:45:05.623+01:00OWASP Benelux 2016, Conference day<div class="body" id="body">
slides: <a href="https://www.owasp.org/index.php/BeNeLux_OWASP_Day_2016-2#tab=Conferenceday">https://www.owasp.org/index.php/BeNeLux_OWASP_Day_2016-2#tab=Conferenceday</a><br />
<h2>
Securing Android Applications</h2>
<i>Dario Incalza</i>
<br />
apk: <a href="http://image.slidesharecdn.com/english-final-140610053432-phpapp02/95/android-applications-in-the-cruel-world-how-to-save-them-from-threats-6-638.jpg?cb=1402390537">http://image.slidesharecdn.com/english-final-140610053432-phpapp02/95/android-applications-in-the-cruel-world-how-to-save-them-from-threats-6-638.jpg?cb=1402390537</a>
<br />
tools:
<br />
<ul>
<li><a href="https://bytecodeviewer.com/">https://bytecodeviewer.com/</a> uses multiple decompilers
</li>
<li>apktool
</li>
<li>mitmproxy <a href="https://mitmproxy.org/">https://mitmproxy.org/</a>
</li>
<li>xPosed: <a href="http://repo.xposed.info/module/de.robv.android.xposed.installer">http://repo.xposed.info/module/de.robv.android.xposed.installer</a>
<ul>
<li>inject / modify running Android app (root)
</li>
</ul>
</li>
<li>linux memory extractor: dump memory <a href="https://github.com/504ensicsLabs/LiME/">https://github.com/504ensicsLabs/LiME/</a>
</li>
</ul>
recommendations
<br />
<ul>
<li>obfuscate / encrypt</li>
<li>communication
</li>
<li>execution env (root etc)
</li>
<li>full disk encryption: keys are in mem at runtime
</li>
<li>passwords: char[] & PBKDF2
</li>
<li>key management:
<ul>
<li>keystore (rooted devices)
</li>
<li>sharedpreferences
</li>
</ul>
</li>
<li>no AES in ECB
</li>
<li>check logs
</li>
<li>sdcard is readable
</li>
<li>securerandom issue <a href="http://android-developers.blogspot.be/2013/08/some-securerandom-thoughts.html">http://android-developers.blogspot.be/2013/08/some-securerandom-thoughts.html</a>
</li>
<li>obfuscation / code protection
<ul>
<li>nonobvious branching
</li>
<li>reflection
</li>
<li>proguard <a href="http://proguard.sourceforge.net/">http://proguard.sourceforge.net/</a>
</li>
</ul>
</li>
<li>test rooting: google safetynet api -- JWS with "attest" <a href="https://developer.android.com/training/safetynet/index.html">https://developer.android.com/training/safetynet/index.html</a>
</li>
</ul>
<hr class="light" />
<h2>
The State of Security of WordPress (plugins)</h2>
<i>Yorick Koster</i><br />
wordpress: blogging software with CMS features
<br />
<ul>
<li>enumerate media
</li>
<li>php "unserialize" <a href="https://www.owasp.org/index.php/PHP_Object_Injection">https://www.owasp.org/index.php/PHP_Object_Injection</a>
</li>
<li>core: security:
<ul>
<li>filter / escaped, etc
</li>
<li>but: no prepared statements, MD5 passwords
</li>
</ul>
</li>
<li>plugins: relatively ok
<ul>
<li>escape html etc
</li>
</ul>
</li>
<li>meterpreter
</li>
<li><a href="https://codex.wordpress.org/Hardening_WordPress">https://codex.wordpress.org/Hardening_WordPress</a>
</li>
</ul>
<hr class="light" />
<h2>
Securing AngularJS Applications</h2>
<i>Sebastian Lekies</i>
<br />
AngularJS
<br />
<ul>
<li>"declarative templating"
</li>
<li>contextual auto escaping (html, url, resource_url)
<ul>
<li>managed by the $sceProvider
</li>
<li>URL / output $compileProvider
</li>
<li>auto-encoding
</li>
<li>URL validation: $sceDelegateProvider resourceURLWhitelist / Blacklist
</li>
</ul>
</li>
<li>html sanitizer: removes all script
</li>
</ul>
security pitfalls
<br />
<ul>
<li>do <b>not</b> <i>generate</i> templates based on user input
</li>
<li>do not write user input befor AngularJS is loaded -- careful with mixing other libraries
</li>
<li>inserting HTML in DOM
<ul>
<li>ngBindHtml with trustAsHtml -- security is disabled! -- use ng-bind-html
</li>
<li>DIY escapeForHtml() call --managing security on your own is dangerous: AngularJS will sanitize the input for you
</li>
<li>do not use jqLite
</li>
</ul>
</li>
<li>white/blacklisting URLs
<ul>
<li>wildcards in schemes:
<ul>
<li>other urls can replace the wildcard! (e.g; <a href="http://evil.com/?ignore=.//my.org/">http://evil.com/?ignore=.//my.org/</a>
</li>
<li>replace http: with javascript:
</li>
</ul>
</li>
<li>wildcards in domains: replace domainname
<ul>
<li>toplevel domains: replace them with your own (my.evil.com
</li>
</ul>
</li>
<li>regexps
</li>
<li><b>conclusion: </b>ONLY whitelist specific URLs, do NOT use regexp / wildcards</li>
</ul>
</li>
</ul>
<hr class="light" />
<h2>
Compression Bombs Strike Back</h2>
<i>Giancarlo Pellegrino</i>
<br />
Compression
<br />
<ul>
<li>main lossless algorithm: deflate (zlib, gzip etc)
</li>
<li>protocols: IMAP, XMPP, SSH, HTTP response:
<ul>
<li>Accept-Encoding: deflate/gzip
</li>
<li>Content-Encoding: gzip etc
</li>
</ul>
</li>
</ul>
issues
<br />
<ul>
<li>DOS "computationally intensive"
</li>
<li>data amplification
</li>
<li>unbalance client/server (server caches compress file, client always decompresses)
</li>
</ul>
old issues
<br />
<ul>
<li>zip bombs: 42kb -- 4.5PB unzipped (1996)
</li>
<li>xmlbombs: recursive entities (2003)
</li>
</ul>
present
<br />
<ul>
<li>attack clients:
<ul>
<li>html content bomb: e.g. 4GB of whitespace -- gzipped: 4mb: <a href="https://www.cyberis.co.uk/2013/08/vulnerabilities-that-just-wont-die.html">https://www.cyberis.co.uk/2013/08/vulnerabilities-that-just-wont-die.html</a>
</li>
<li>manipulate Content-Length
</li>
</ul>
</li>
<li>server attacks
<ul>
<li>SOAP POST requests, gzipped
</li>
<li>JSON POST
</li>
<li>XMPP
</li>
<li>fixed runtimes
<ul>
<li>Apache Httpd
</li>
<li>tomcat
</li>
<li>axis2
</li>
</ul>
</li>
</ul>
</li>
</ul>
attention points
<br />
<ul>
<li>first authenticate before uncompressing
</li>
<li>input validation: size (check decompression ratio, limit size of decompressed message)
</li>
<li>correctly chain + interprete payload
</li>
<li>logger: resource exhaustion (e.g. decompress before logging)
</li>
<li>zip size header can be different than actual zipped content
</li>
</ul>
<a href="https://www.usenix.org/conference/usenixsecurity15/technical-sessions/presentation/pellegrino">https://www.usenix.org/conference/usenixsecurity15/technical-sessions/presentation/pellegrino</a>
<br />
<hr class="light" />
<h2>
Zap it !</h2>
<i>Zakaria Rachid</i>
<br />
<a href="https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project">https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project</a>
<br />
use cases
<br />
<ul>
<li>simple scanning
</li>
<li>automatic security integration tests
<pre>docker pull owasp/zap2docker-weekly
docker run owasp/zap2docker-weekly zap-baseline.py -t http://target
</pre>
</li>
<li>security plugin
</li>
<li>zap api
</li>
</ul>
<hr class="light" />
<h2>
Stealing Secrets through Browser-based Side-channel Attacks</h2>
<i>Tom Van Goethem</i>
<br />
<ul>
<li>compression: guess char-by-char and check if this impacts response size
<ul>
<li>gzip + input controlled by attacker (or mitm)
</li>
</ul>
</li>
<li>find out response size:
<ul>
<li>cache api: + authenticted cross-origin responses
<ul>
<li>quota restrictions - can calculate response size of other site
</li>
<li>getEstimate(): exact quota
</li>
<li>but: after decompression
</li>
</ul>
</li>
<li>tcp windows: extra round trip
<ul>
<li>measure number of roundtrips
</li>
</ul>
</li>
</ul>
</li>
</ul>
protection
<br />
<ul>
<li>no compression, but bandwidth
</li>
<li>do not compress secrets
</li>
<li>samesite cookies
</li>
<li>no third party cookies
</li>
</ul>
<hr class="light" />
<h2>
Handling of Security Requirements in Software Development Lifecycle</h2>
<i>Daniel Kefer
</i><br />
demo
<br />
<ul>
<li>securityRAT <a href="https://github.com/SecurityRAT/SecurityRAT">https://github.com/SecurityRAT/SecurityRAT</a>
</li>
</ul>
<hr class="light" />
<h2>
Closing Keynote: The Future of Security</h2>
<i>Bart Preneel</i><br />
<br />
trends
<br />
<ul>
<li>big data / analysis
<ul>
<li>visibility
</li>
<li>mass surveillance
</li>
</ul>
</li>
<li>privace as security property
</li>
<li>privacy by design:
<ul>
<li>"General Data Protection Regulation" GDPR
</li>
</ul>
</li>
<li>cryptowars continue
</li>
<li>offense over defence (0-days)
</li>
</ul>
recommendations
<br />
<ul>
<li>avoid single point of failure / trust
</li>
<li>future
<ul>
<li>future of internet: simple but secure
</li>
<li>small local data instead of centralised
</li>
<li>distributed solutions (e.g. bitcoins)
</li>
<li>big data --> encrypted data
</li>
<li>open source solutions
</li>
</ul>
</li>
</ul>
</div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-31136006360704693752016-11-11T12:20:00.000+01:002016-11-14T13:07:28.454+01:00Devoxx 2016 - day 5: notes (2016/11/11)<h1>
Java Language and Platform Futures: A Sneak Peek</h1>
<h2>
Brian Goetz</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/oGll155-vuQ" frameborder="0" allowfullscreen></iframe>
possible improvements
<br />
<ul>
<li>type inference for local variables
</li>
<li>taming boilerplate
<ul>
<li>equals, hashCode toString...
</li>
<li>IDE help for writing but not reading
</li>
<li>e.g. data classes class Point(int x, int y){ } (but complex issues to solve)
</li>
</ul>
</li>
<li>improved switch: eg pattern matching
</li>
<li>project valhalla: value types / better Data layout (complex)
</li>
<li>specialized generics
</li>
<li>project panama: efficient native code (better JNI)
</li>
</ul>
others:
<br />
<ul>
<li><a href="https://www.eclipse.org/collections/">https://www.eclipse.org/collections/</a> efficient collections
</li>
</ul>
<hr class="light" />
<h1>
Flying services with the drone</h1>
<h2>
Krzysztof Kudrynski, Blazej Kubiak</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/aaZMh4IqMcM" frameborder="0" allowfullscreen></iframe>
<ul>
<li>parrot
</li>
<li>yadrone library: <a href="https://vsis-www.informatik.uni-hamburg.de/oldServer/teaching//projects/yadrone/">https://vsis-www.informatik.uni-hamburg.de/oldServer/teaching//projects/yadrone/</a>
</li>
<li>blended map: focus mask + average
</li>
<li>edge based distance
</li>
<li>ffmpeg on android/windows
</li>
<li>camera distortions: "camera calibration" (opencv)
</li>
<li>particle filtering:
</li>
</ul>
<hr class="light" />
<h1>
Building Chat Bots - The Next Gen UI</h1>
<h2>
James Ward</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Nqjfn4iHXjM" frameborder="0" allowfullscreen></iframe>
<ul>
<li>chat channels: slack, facebook messenger
</li>
<li>natural language / interactive
</li>
<li>protocols: no standards
</li>
<li>demo
</li>
</ul>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-33879551828961658032016-11-10T18:26:00.001+01:002016-11-14T13:03:53.695+01:00Devoxx 2016 - day 4: notes (2016/11/10)<h1>
Programming your body with chip implants</h1>
<h2>
Pär Sikö</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/W29p2d67AEw" frameborder="0" allowfullscreen></iframe>
chip: 12mm / 2mm -- same as for pets
<br />
<ul>
<li>rfid: entrance system
</li>
<li>nfc: smartcards: 1kb
</li>
</ul>
issues
<br />
<ul>
<li>battery -- energy harvesting
</li>
<li>communication technology
<ul>
<li>active
</li>
</ul>
</li>
</ul>
<hr class="light" />
<h1>
Optional - The Mother of All Bikesheds</h1>
<h2>
Stuart Marks</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Ej0sss6cq14" frameborder="0" allowfullscreen></iframe>
Optional
<br />
<ul>
<li>java 8 (java.util)
</li>
<li>non-null ref (present) or empty (absent)
</li>
<li>primitives: OptionalInt, Long etc
</li>
<li><b>never</b> use "null" as ref in Optional
</li>
<li>"limited mech for returntypes where null will very likely return
errors" e.g. streams api: Optional prevents NPE's in chained calls
</li>
<li>issue NoSuchElementException
</li>
</ul>
usage of Optional
<br />
<ul>
<li>never call "Optional.get()" when you can prove that the Optional is present
</li>
<li>prefer alternatives to Optional.isPresent() / .get()
<ul>
<li>use: orElse() / orElseGet() / orElseThrow()
</li>
</ul>
</li>
<li>Optional.filter() predicate
</li>
<li>Optional.ifPresent(): (<> isPresent) executes lambda if present
</li>
<li>other methods
<ul>
<li>empty()
</li>
<li>of()
</li>
<li>flatMap()
</li>
<li>...
</li>
</ul>
</li>
<li>stream of Optional: .filter(Optional::isPresent).map(Optional::get).collect() -- filters present Optionals & extract values
</li>
</ul>
misuses:
<br />
<ul>
<li>simple nullchecks - avoid Optional.isNullable. chainsgh
</li>
<li>too complex constucts: Optional chains should be avoided
</li>
<li>Optional.get() "attractive nuisance" -- will be deprecated
</li>
<li>do not use Optional for
<ul>
<li>fields
</li>
<li>method parameters
</li>
<li>collections
</li>
<li>replacing every null
</li>
</ul>
</li>
<li>Optional adds extra objects -- check performance issues
</li>
<li>no identity-sensitive operations (e.g. serialization)
</li>
</ul>
<hr class="light" />
<h1>
A Crash Course in Modern Hardware</h1>
<h2>
Cliff Click</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/OFgxAFdxYAQ" frameborder="0" allowfullscreen></iframe>
<ul>
<li>classic Von Neumann Architecture
</li>
<li>throughput / core +10% / year (single-threaded)
</li>
<li>CISC: easier to program, but harder to optimize (pagefaults)
</li>
<li>RISC: simpler, but faster execution
</li>
<li>walls:
<ul>
<li>power wall
</li>
<li>ILP wall (branch prediction, speculative execution)
<ul>
<li>pipelining
<ul>
<li>better throughput, but latency remains
</li>
</ul>
</li>
<li>cache misses: stall -- performance = cache misses
</li>
<li>branch predictions: 95% success
</li>
<li>Itanium: static ILP: not much gain for huge effort
</li>
<li>x86: limited by cache misses / branch mispredicts
</li>
<li>locality is critical
</li>
</ul>
</li>
<li>memory wall
<ul>
<li>memory is larger, but latency is still high (DRAM)
</li>
<li>SRAM for caches
<ul>
<li>requires data locality
</li>
<li>cache layers
</li>
</ul>
</li>
<li>"memory is the new disk"
</li>
<li>faster memory
<ul>
<li>relax coherency constraints
</li>
<li>better throughput
</li>
</ul>
</li>
</ul>
</li>
<li>speed of light
</li>
</ul>
</li>
<li>flat clock rates (15y)
<ul>
<li>hyper-threading: same limits (cache misses)
</li>
<li>more cores
<ul>
<li>challenges:
<ul>
<li>chips reorder</li>
<li>concurrency is hard
</li>
<li>immutable data
</li>
<li>missing toolsets
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr class="light" />
<h1>
The ISS position in real time on my mobile in less than 15mn ? Yes, we can.</h1>
<h2>
Audrey Neveu</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/BekH3wxtRvU" frameborder="0" allowfullscreen></iframe>
<ul>
<li>api.open-notify.org
</li>
<li>ionic + cordova
</li>
<li>server-sent events: push technology: text-only
<ul>
<li>streamdata.io for streaming the server-sent-events
</li>
<li>JSON-patch RFC-6902 for changes
demo
</li>
</ul>
</li>
<li>ionic start iss.io maps (=template)
</li>
<li>ionic serve --lab
</li>
<li>bower.json --> bower install
</li>
</ul>
<hr class="light" />
<h1>
graph databases and the "panama papers"</h1>
<h2>
Stefan Armbruster</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/8VJ4njrA0TQ" frameborder="0" allowfullscreen></iframe>
panama papers: 2,6 TB data
<br />
<ul>
<li>3 million files
</li>
<li>tools
<ul>
<li>Nuix OCR
</li>
<li>icij extract for metadata extraction: <a href="https://github.com/ICIJ/extract">https://github.com/ICIJ/extract</a>
</li>
<li>blacklight (opensource collaboration tool: <a href="http://projectblacklight.org/">http://projectblacklight.org/</a>)
</li>
<li>db
<ul>
<li>solr
</li>
<li>redis
</li>
<li>neo4j <a href="https://neo4j.com/">https://neo4j.com/</a>
</li>
</ul>
</li>
<li>linkurious visualisation <a href="http://linkurio.us/">http://linkurio.us/</a> (commercial)
</li>
</ul>
</li>
</ul>
property graph model
<br />
<ul>
<li>nodes: entities (can have name/value properties
</li>
<li>relationships: type + direction (=semantic)
</li>
</ul>
neo4j usecases
<br />
<ul>
<li>internal
<ul>
<li>network / it operations
</li>
<li>data management
</li>
</ul>
</li>
<li>customer facing
<ul>
<li>real-time recommendations
</li>
<li>graph based search
</li>
<li>identity/access management
</li>
</ul>
</li>
</ul>
neo4j:
<br />
<ul>
<li>graph database -- easy to draw structure
</li>
<li>solves relational pains (logical vs table model)
</li>
<li>open source
</li>
<li>easy to use
</li>
<li>ACID
</li>
<li>scalable (3.1)
</li>
<li>syntax
<ul>
<li>patterns: (:Person{name:"Dan"})-:KNOWS>(:Person{name:"an"})
</li>
<li>clauses CREATE / MERGE / SET/DELETE..
</li>
<li>MATCH<pattern> > WHERE <>
<ul>
<li>ORDER BY <>
</li>
<li>paginationSKIP / LIMIT
</li>
</ul>
</pattern></li>
<li>LOAD CSV
</li>
</ul>
</li>
<li>demo
</li>
</ul>
<hr class="light" />
<h1>
A JVM does That?</h1>
<h2>
Cliff Click</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/-vizTDSz8NU" frameborder="0" allowfullscreen></iframe>
<div>
services -- "Virtual"
<br />
<ul>
<li>high quality GC
</li>
<li>high quality machine code gen
</li>
<li>uniform threading / memory model
</li>
<li>type safety
</li>
<li>...
</li>
</ul>
Illusion:
<br />
<ul>
<li>infinite mem -- gc pauses
<ul>
<li>jvm optimizes
</li>
</ul>
</li>
<li>byte code is fast:
<ul>
<li>JIT brings back expected cost model (gcc -O2 level)
</li>
<li>JIT requires profiling
</li>
</ul>
</li>
<li>virtual calls are slow: java makes them fast
<ul>
<li>inline caches
</li>
</ul>
</li>
<li>partial programs are fast: requires deoptimization, reprofile, reJIT
</li>
<li>consisten memory model: every machine has different memory models -- JVM handles this
</li>
<li>consistent thread model: JVM imporves locking etc
</li>
<li>Locks are fast
</li>
<li>quick time access: difficult on hardware / multiple threads *
<ul>
<li>gettimeofday in java
</li>
</ul>
</li>
</ul>
wishes for the future:
<br />
<ul>
<li>tail calls
</li>
<li>Integer as cheap as int
</li>
<li>BigInteger as cheap as int
</li>
<li>atomic multi-address update (software transactional memory)
</li>
<li>thread priorities: on linux -- only as root
</li>
<li>finalizers: "eventually" runs -- might be never (no timeliness guarantees)
</li>
<li>soft/phantom refs: difficult to maintain in GC </li>
</ul>
</div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-86955308630875223052016-11-09T18:42:00.001+01:002016-11-14T12:59:47.139+01:00Devoxx 2016 - day 3: notes (2016/11/09)<h1>
Keynote</h1>
<iframe width="560" height="315" src="https://www.youtube.com/embed/T-ujPlfm6p4" frameborder="0" allowfullscreen></iframe>
<ul>
<li>AI / machine learning
<ul>
<li>lots af labeled datasets
</li>
<li>products
<ul>
<li>tensorflow
</li>
</ul>
</li>
</ul>
</li>
<li>java 9:
<ul>
<li>modules
<ul>
<li>jlink
</li>
</ul>
</li>
<li>jshell (REPL interface)
</li>
</ul>
</li>
<li>java future
<ul>
<li>small improvements: property-classes
</li>
<li>Panama: improve JNI
<ul>
<li>demo: opencv (detect image contents)
</li>
<li>cleaner interaction with native code
</li>
</ul>
</li>
</ul>
</li>
</ul>
<iframe width="560" height="315" src="https://www.youtube.com/embed/oERlVYfLTn8" frameborder="0" allowfullscreen></iframe>
<hr class="light" />
<h1>
Security and Microservices</h1>
<h2>
Sam Newman</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ZXGaC3GR3zU" frameborder="0" allowfullscreen></iframe>
intro
<br />
<ul>
<li><a href="http://samnewman.io/books/building_microservices/">http://samnewman.io/books/building_microservices/</a>
</li>
<li>"live attacks" demo for fun <a href="http://map.norsecorp.com/">http://map.norsecorp.com</a>
</li>
<li>prevention / detection / response / recovery
</li>
</ul>
transport security
<br />
<ul>
<li>threatmodel
<ul>
<li>attack trees <a href="https://www.schneier.com/academic/archives/1999/12/attack_trees.html">https://www.schneier.com/academic/archives/1999/12/attack_trees.html</a>
</li>
<li>ms threat model Stride
</li>
<li>aim: raise cost of attack
</li>
</ul>
</li>
<li>https everywhere:
<ul>
<li>server guarantee / tampering prevention
</li>
<li>letsencrypt.org
</li>
</ul>
</li>
<li>client side certs: difficult -- Lemur
</li>
<li>auth
<ul>
<li>oauth
</li>
<li>form auth
</li>
<li>"confused deputy problem": multiple access paths complicate security
<ul>
<li>saml assertions: complex
</li>
<li>oauth token validated in services
</li>
</ul>
</li>
</ul>
</li>
</ul>
data at rest
<br />
<ul>
<li>encrypted datastore
</li>
<li>vault for password storage
</li>
</ul>
docker issue
<br />
<ul>
<li>scans
</li>
<li>build them yourself
</li>
</ul>
code
<br />
<ul>
<li>sdlc
</li>
<li>scanner
</li>
<li>connections: <a href="https://www.vaultproject.io/">https://www.vaultproject.io/</a>
</li>
</ul>
logs
<br />
<ul>
<li>centralize in ELK
</li>
</ul>
<hr class="light" />
<h1>
The road to Node Package Manager Hell</h1>
<h2>
Paul Watson</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/6qibcuTeaG4" frameborder="0" allowfullscreen></iframe>
dependency checker:
<br />
<ul>
<li>owasp dependency checker
</li>
<li>commercial: snyk.io / nodesecurity.io
</li>
</ul>
yarn
<br />
<ul>
<li>alternative npm client
</li>
<li>fast
</li>
<li>autolock dependencies
</li>
<li>deterministic installs
</li>
<li>offline installs
</li>
</ul>
others:
<br />
<ul>
<li>Nexus / Arifactory
</li>
<li>gradle gulp / node plugin
</li>
</ul>
<hr class="light" />
<h1>
Modern web development using Aurelia</h1>
<h2>
Harro Lissenberg</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/vOyH3-Rybtw" frameborder="0" allowfullscreen></iframe>
aurelia <a href="http://aurelia.io/">http://aurelia.io/</a>
<br />
<ul>
<li>javascript framework
</li>
<li>clean & non-obstrusive
</li>
<li>no dependencies -- uses its own polyfills
</li>
<li>MIT license
</li>
</ul>
demo
<br />
<ul>
<li>cli for project setup
</li>
<li>yarn install
</li>
<li>require.js
</li>
<li>recent ecmascript --> export class {}, constructor etc.
</li>
<li>au run -watch for testing</li>
<li>repeate.for attribute with list of elements</li>
</ul>
<hr class="light" />
<h1>
Containers, VMs, Processes… How all of these technologies work ? Deep dive and learn about your OS</h1>
<h2>
Quentin ADAM</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/RgRNk0cYB44" frameborder="0" allowfullscreen></iframe>
process isolation
<br />
<ul>
<li>chroot
<ul>
<li>security risks (root, escape, ...)
</li>
</ul>
</li>
<li>jail / containers
<ul>
<li>linux cgroups: (docker)
<ul>
<li>some security risks
</li>
<li>filedescriptors shared fS or full OS
</li>
</ul>
</li>
</ul>
</li>
<li>vm (e.g. qemu)
<ul>
<li>simulate cpu
</li>
<li>VT-X instruction-set
</li>
<li>performance?
<ul>
<li>cpu / memory- bound? usually not an issue
</li>
<li>I/O system
<ul>
<li>storage
</li>
<li>network
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
others:
<br />
<ul>
<li>linux trickx
<ul>
<li>alpine linux <a href="https://alpinelinux.org/">https://alpinelinux.org/</a>
<ul>
<li>musl
</li>
</ul>
</li>
</ul>
</li>
<li>devops: specialization required
</li>
</ul>
<hr class="light" />
<h1>
100% Stateless with JWT (JSON Web Token)</h1>
<h2>
Hubert Sablonnière</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/67mezK3NzpU" frameborder="0" allowfullscreen></iframe>
intro:
<br />
<ul>
<li>cookies
</li>
<li>sessionid
<ul>
<li>shared / distributed cache (memcached etc)
</li>
<li>or sticky session
</li>
</ul>
</li>
</ul>
jwt
<br />
<ul>
<li>comparable to sessionids
</li>
<li>types
<ul>
<li>by reference
<ul>
<li>bankcard ref needed
</li>
</ul>
</li>
<li>by value
<ul>
<li>realmoney --> no extra data needed
</li>
</ul>
</li>
</ul>
</li>
<li>initial
<ul>
<li>wiret +sign
</li>
<li>set JWT as cookie
</li>
</ul>
</li>
<li>after
<ul>
<li>verify each request
</li>
</ul>
</li>
<li>parts:
<ul>
<li>payload: claims + extra data
<ul>
<li>iss issuer
</li>
<li>sub subject emaetc
</li>
<li>times exp / nbf /iat
</li>
<li>jti id
</li>
<li>claims
</li>
</ul>
</li>
<li>signature
<ul>
<li>symetric e.g. hmac256
</li>
<li>asymetric signature
</li>
</ul>
</li>
</ul>
</li>
<li>oauth2 / openid connect
<ul>
<li>based on jwt
</li>
</ul>
</li>
<li>benefits
<ul>
<li>no loadbalancing:
<ul>
<li>shared secret on all servershtt
</li>
<li>or public key on all servers en secret only on logon-service
</li>
</ul>
</li>
<li>multilanguage
</li>
</ul>
</li>
<li>drawbacks
<ul>
<li>revocation
<ul>
<li>blacklist or whitelist?
</li>
</ul>
</li>
<li>single page applications // security?
<ul>
<li>xss with data in local storage
<ul>
<li>3rd party scripting
</li>
<li>solution: HTTPonly cookies
</li>
</ul>
</li>
</ul>
</li>
<li>mobile apps
<ul>
<li>Authorization: Bearer header instead of cookie
</li>
</ul>
</li>
<li>csrf:
<ul>
<li>use local storage + add csrf token in payload
</li>
<li>interceptor to send csrf token on each ajax request
</li>
</ul>
</li>
</ul>
</li>
<li>others
<ul>
<li>multipart forms
</li>
<li>emails: jwt for reset email
</li>
<li>api gateway with sessionid, but use internally JWT: api gateway does the transformation
</li>
</ul>
</li>
</ul>
<hr class="light" />
<h1>
Testing Legacy Code</h1>
<h2>
Elliotte Rusty Harold</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/cjxXv0eifhY" frameborder="0" allowfullscreen></iframe>
<a href="http://www.cafeaulait.org/slides/sdbestpractices2006/legacy/">http://www.cafeaulait.org/slides/sdbestpractices2006/legacy/</a>
<br />
<ul>
<li>create broader tests first
</li>
<li>prefer unit test over integration test
</li>
<li>concentrate on changes
</li>
<li>junit, testng etc
</li>
<li>create initial setup (before / after) and add easy tests
</li>
<li>trial & error to tweak a new test
</li>
<li>also test obvious cases
</li>
<li>remove dead code
</li>
<li>code coverage: focus on missed elements:
<ul>
<li>Emma, Cobertura.
</li>
<li>covered != tested...
</li>
</ul>
</li>
<li>autogenerate tests? avoids boilerplate
</li>
<li>static analysis: Findbugs, PMD,...
</li>
<li>refactoring: watch out for reflective access (hibernate, etc)</li>
</ul>
<hr class="light" />
<h1>
Wait, what!? Our microservices have actual human users?</h1>
<h2>
Stefan Tilkov</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/jJxmi8nrHwg" frameborder="0" allowfullscreen></iframe>
<div>
<ul>
<li>single frontend that connects to multiple services?
</li>
<li>orchestration: complex
<ul>
<li>latency issue
</li>
<li>"Bff" Backend for Frontends: <a href="http://samnewman.io/patterns/architectural/bff/">http://samnewman.io/patterns/architectural/bff/</a>
</li>
<li>channels: are not <i>that</i> important -- seamless experience -- "everything everywhere"
</li>
</ul>
</li>
<li>functional services
<ul>
<li>services with DB-access -- JDBC in disguise -- too low level
</li>
<li>reuse is sideeffect
</li>
</ul>
</li>
<li>UIs matter most (not the services)
<ul>
<li>can become a big monolith
</li>
<li>failure in the long run
</li>
</ul>
</li>
<li>"virtical responsibility": <a href="http://scs-architecture.org/">http://scs-architecture.org/</a>
<ul>
<li>single team responsible for full slice
</li>
<li>modularize frontend
</li>
</ul>
</li>
<li>frontend tech is <i>not</i> an implementation detail!
<ul>
<li>impacts architecture
</li>
<li>decision to be made upfront
</li>
</ul>
</li>
<li>frontend
<ul>
<li>web: server vs client rendering
<ul>
<li>simple links (=resources)
</li>
<li>redirection
</li>
<li>transclusion: embedding other apps with javascript -- Web Components?
</li>
<li>argument to avoid native
<ul>
<li>"mobile first"
</li>
<li>responsive design
</li>
<li>progressive enhancement
</li>
<li><a href="http://idlewords.com/talks/website_obesity.htm">http://idlewords.com/talks/website_obesity.htm</a>
</li>
</ul>
</li>
</ul>
</li>
<li>hybrid: try to use webbased
</li>
<li>native: platform specifics
<ul>
<li>single monolith "by definition"
</li>
<li>only internal modularization
</li>
</ul>
</li>
</ul>
</li>
<li>solution frontend
<ul>
<li>organizational structure
</li>
<li>platform interfaces: comparable to EJBs
</li>
<li>release trains
</li>
<li>discipline
</li>
<li>or use hybrid: native with content from app (aka careless SPA)
<ul>
<li>js-apps shouldn't be as bad as native apps
</li>
<li>forward/backward/refresh support?
</li>
<li>linking support?
</li>
</ul>
</li>
<li>html instead of js (js-only reinvents browser)
</li>
<li>use the browser (or embedded browser)
</li>
<li><a href="http://roca-style.org/">http://roca-style.org/</a>
</li>
<li>build more than one single page app
</li>
<li><a href="https://medium.com/@stilkov/why-i-hate-your-single-page-app-f08bb4ff9134#.l6wpi2up2">https://medium.com/@stilkov/why-i-hate-your-single-page-app-f08bb4ff9134#.l6wpi2up2</a>
</li>
</ul>
</li>
<li>summary
<ul>
<li>UIs matter
</li>
<li>use the correct architectural style
</li>
<li>frontend monoliths: as good /bad as backend monoliths
</li>
</ul>
</li>
</ul>
</div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-5942877659337606992016-11-08T19:19:00.000+01:002016-11-14T12:51:46.080+01:00Devoxx 2016 - day 2: notes (2016/11/08)<h1>
Array Linked to a List, the full story!</h1>
<h2>
José Paumard</h2>
<br />
<iframe width="560" height="315" src="https://www.youtube.com/embed/Y4XkWSAm2XU" frameborder="0" allowfullscreen></iframe>
<a href="https://stuartmarks.wordpress.com/2015/12/18/some-java-list-benchmarks/">https://stuartmarks.wordpress.com/2015/12/18/some-java-list-benchmarks/</a>
<br />
basic operations
<br />
<ul>
<li>list.sort
</li>
<li>list.removeIf()
</li>
<li>forEach
</li>
<li>stream()
</li>
<li>...
random:
</li>
<li>arraylist
<ul>
<li>will never shrink
</li>
<li>arraycopy operations
</li>
</ul>
</li>
<li><a href="http://www.hackersdelight.org/">http://www.hackersdelight.org/</a>
</li>
<li>linkedlist:
<ul>
<li>som costly operations
</li>
</ul>
</li>
</ul>
benchmarks: JMH
<br />
<ul>
<li><a href="http://openjdk.java.net/projects/code-tools/jmh/">http://openjdk.java.net/projects/code-tools/jmh/</a>
</li>
<li>annotation
</li>
<li>special maven rule create jar for benchmark
</li>
<li>@Param for measuring with different params
</li>
<li>@Benchmark
</li>
</ul>
cpu architecture
<br />
<ul>
<li>multicore cpu
</li>
<li>3 levels of cache
</li>
<li>arraylist had contiguous zones
</li>
<li>linkedlist is penalized
<ul>
<li>pointer chasing
</li>
<li>not cache-friendly
</li>
</ul>
</li>
<li>other cache unfriendly examples:
<ul>
<li>SkipList
</li>
<li>HashMap
</li>
</ul>
</li>
<li>future:
<ul>
<li><a href="http://mail.openjdk.java.net/mailman/listinfo/valhalla-spec-experts">http://mail.openjdk.java.net/mailman/listinfo/valhalla-spec-experts</a>
</li>
<li>Eclipse Collections
</li>
<li>HPPC
</li>
<li>Koloboke
</li>
<li>Trove
</li>
<li><a href="http://java-performance.info/hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove-january-2015/">http://java-performance.info/hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove-january-2015/</a>
</li>
</ul>
</li>
</ul>
Java 9
<br />
<ul>
<li>List.of()
</li>
<li>Set.of()
</li>
</ul>
demo
<br />
<ul>
<li>removeIf() -- mark & sweep logic (BitSet)
</li>
<li>sort()
</li>
<li>Objects.requireNonNull() <a href="https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html">https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html</a>
</li>
<li>@FunctionalInterface <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html">https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html</a>
</li>
<li>Supplier interface <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html">https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html</a>
</li>
</ul>
<hr class="light" />
<h1>
Exploring Java 9</h1>
<h2>
Venkat Subramaniam</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/8XmYT89fBKg" frameborder="0" allowfullscreen></iframe>
Modularity
<br />
<ul>
<li>big rt.jar split in modules ("jmods" subdir)
</li>
<li>java.base: default dependencies
</li>
<li>other code also in modules
</li>
<li>rule: no cycles (cyclic dependencies)
</li>
</ul>
module
<br />
<ul>
<li>collection of packages / data
</li>
<li>name
</li>
<li>"requires"
</li>
<li>"exports": only exported stuff can be used
</li>
<li>convention: put module in dedicated dir
</li>
<li>module-info.java in a top-level directory
<ul>
<li>module { export <package name="">; }
</package></li>
<li>"requires java.base;" automatically added
</li>
</ul>
</li>
<li>public is not "public" anymore -- module-bound
</li>
<li>examine dependencies
<ul>
<li>jdeps -s (exists since java 8)
</li>
<li>-Xdiag:resolver
</li>
<li>java -listmods -- JRE dependencies
</li>
</ul>
</li>
<li>implied readability: support transitive dependencies
<ul>
<li>"requires public"
</li>
</ul>
</li>
<li>transition to java 9:
<ul>
<li>jdeps -genmoduleinfo outputdir *.jar
</li>
<li>put old jars in module path (-mp option)
</li>
<li>"automatic modules"
</li>
<li>uses name of jar instead of name of module"
</li>
<li>classpath: "unnamed module" -- 'quarantined' module (exports all)
</li>
</ul>
</li>
<li>versions: still ongoing
</li>
</ul>
others
<br />
<ul>
<li>jlink: create platformspecific binary executable -- "java"
</li>
<li>REPL "read evaluate print loop" -- jShell: snippets
</li>
</ul>
<hr class="light" />
<h1>
The end of polling : why and how to transform a REST API into a Data Streaming API?</h1>
<h2>
Audrey Neveu</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/NDDp7BiSad4" frameborder="0" allowfullscreen></iframe>
"realtime user experience"
<br />
<ul>
<li>no refresh buttons
</li>
<li>solutions
<ul>
<li>polling -- chatty protocol / inefficient
</li>
<li>alternative
<ul>
<li>websockets RFC-6455
<ul>
<li>bidirectional
</li>
<li>binary
</li>
<li>reconfigure proxy
</li>
<li>message layout not specified
</li>
<li>new WebSocket(...)
</li>
<li>connectionlost: not specified
</li>
</ul>
</li>
<li>server-sent events
<ul>
<li>text-only
</li>
<li>data:
</li>
<li>new EventSource(...)
</li>
<li>callbacks: onopen/onMessage/onError
</li>
<li>retry--config + recovery
</li>
<li>use polyfills for IE
</li>
</ul>
</li>
<li>performance comparison: <a href="http://matthiasnehlsen.com/blog/2013/05/01/server-sent-events-vs-websockets/">http://matthiasnehlsen.com/blog/2013/05/01/server-sent-events-vs-websockets/</a> </li>
</ul>
</li>
</ul>
</li>
</ul>
demo with <a href="http://streamdata.io/">http://streamdata.io</a> and a drone
<br />
<hr class="light" />
<h1>
Open Sesame! Conversations With My Front Door</h1>
<h2>
Maurice Naftalin</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/J1S5P6WIPus" frameborder="0" allowfullscreen></iframe>
raspberry pi for controlling dooropener
<br />
<ul>
<li>python
</li>
<li>asterisk: voip solution
<ul>
<li>complex setup / config
</li>
<li>freepbx (commercial modules)
</li>
<li>Asterisk-Java: support Fast AGI -- server on 45373
</li>
<li>dialplay: voice recognition -- IBM Watson speech recognition service for converting the codes
</li>
<li>DTMF is more reliable for entering a code
future:
</li>
<li>Natural Language Processing
</li>
</ul>
</li>
</ul>
<hr class="light" />
<h1>
Notes on Type Theory for absolute beginners</h1>
<h2>
Hanneli Tavante</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/UXBoiqRJ6DQ" frameborder="0" allowfullscreen></iframe>
intro to Type theory
<br />
steps:
<br />
<ul>
<li>collect all keywords / analyse gramar
</li>
<li>replace with mathemetics
</li>
<li>remove duplicates
</li>
<li>symbolic logic
</li>
<li>environment (set of classes / variables)
</li>
<li>predicate logic to analyse your system
</li>
<li>lambda calculus
</li>
<li>...
</li>
</ul>
<br />Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-67271212925404133892016-11-07T19:24:00.000+01:002016-11-08T16:52:42.928+01:00Devoxx 2016 - day 1: notes (2016/11/07)<h1>
Deep Learning: An Introduction</h1>
<h2>
Breandan Considine</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/RouuW2APMqM" frameborder="0" allowfullscreen></iframe>
<br />
examples
<br />
<ul>
<li>ImageNet <a href="http://image-net.org/">http://image-net.org/</a>
</li>
<li>voice recognition
</li>
</ul>
reasons
<br />
<ul>
<li>big data
</li>
<li>hardware (nvidia cuda)
</li>
<li>algorithms
</li>
</ul>
machine learning fundamentals
<br />
<ul>
<li>tensors: n-dimensional array
</li>
<li>learning types:
<ul>
<li>supervised
</li>
<li>unsupervised
</li>
<li>reinforced
</li>
</ul>
</li>
</ul>
tensorflow examples
<br />
<ul>
<li>linear regression: single line in data
</li>
<li>classification
<ul>
<li>"perceptron"
</li>
<li>layers + weighs "gradient descent"
</li>
</ul>
</li>
</ul>
unsupervised learning
<br />
<ul>
<li>clustering, separation, association</li>
<li>clustering: random points, euclidean distance
</li>
</ul>
data preprocessing
<br />
<ul>
<li>feature scalin,g normalization
</li>
<li>decomposition & aggregation
</li>
<li>dimensionality reduction
</li>
<li>--> training set, validate & select best modelf
</li>
</ul>
DeepLearning4J
<br />
<ul>
<li>builder pattern
</li>
<li>components:
<ul>
<li>nd4j -- n-dimensional arrays
reinforcement learning
</li>
</ul>
</li>
<li>agent has context + choices
</li>
<li>rewards
</li>
<li>goal: maximize cumulative reward
</li>
</ul>
refs:
<br />
<ul>
<li><a href="http://www.asimovinstitute.org/neural-network-zoo/">http://www.asimovinstitute.org/neural-network-zoo/</a>
</li>
<li>"Deep learning for Java": <a href="https://deeplearning4j.org/">https://deeplearning4j.org/</a> & <a href="https://deeplearning4j.org/documentation">https://deeplearning4j.org/documentation</a>
</li>
<li>mnist samples of handwriting: <a href="http://yann.lecun.com/exdb/mnist/">http://yann.lecun.com/exdb/mnist/</a>
</li>
<li>combine multiple models <a href="https://github.com/google/inception">https://github.com/google/inception</a> & <a href="https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html">https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html</a>
-awsome public datasets: <a href="https://github.com/caesar0301/awesome-public-datasets">https://github.com/caesar0301/awesome-public-datasets</a>
</li>
</ul>
<hr class="light" />
<h1>
Make CSS Fun Again with Flexbox!</h1>
<h2>
Hubert Sablonnière</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/1oKlYgsnyfw" frameborder="0" allowfullscreen></iframe>
<br />
refs:
<br />
<ul>
<li><a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/">https://css-tricks.com/snippets/css/a-guide-to-flexbox/</a>
</li>
<li>autocomplete: <a href="http://emmet.io/">http://emmet.io/</a>
</li>
<li>autoprefixer: <a href="https://autoprefixer.github.io/">https://autoprefixer.github.io/</a>
</li>
</ul>
flex:
<br />
<ul>
<li>float styles are only for text flow
</li>
<li>display: flex: // flex: 1 ( for 1 row)
<ul>
<li>parent / flexcontainer
</li>
<li>children: elements
</li>
</ul>
</li>
<li>flex-grow: weight
</li>
<li>flex-shrink: minimum
</li>
<li>flex-basis: default
</li>
</ul>
others
<br />
<ul>
<li>justify-content: center / flex-end
</li>
<li>align-items: center
</li>
</ul>
<hr class="light" />
<h1>
Easily secure your Front and back applications with KeyCloak</h1>
<h2>
Sébastien Blanc</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/RGp4HUKikts" frameborder="0" allowfullscreen></iframe>
<br />
<a href="http://www.keycloak.org/">http://www.keycloak.org/</a>
<br />
Open Source Identity and Access Management
<br />
<ul>
<li>jwt (rfc 7519)
</li>
<li>openid, kerberos etc
</li>
<li>adapters (wildfly, spring boot, node.js ...)
</li>
<li>native clients
</li>
<li>login brokers
</li>
<li>otp
</li>
</ul>
demo
<br />
<ul>
<li>web.xml: roles/ security config
</li>
<li>keycloak.json config
</li>
<li>atom editor <a href="https://atom.io/">https://atom.io/</a>
</li>
<li>node.js: add keycloak.protect()
</li>
</ul>
<hr class="light" />
<h1>
Sentiment analysis of social media posts using Apache Spark</h1>
<h2>
Niels Dommerholt</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/jyPkiU8vX5A" frameborder="0" allowfullscreen></iframe>
<br />
<a href="http://spark.apache.org/">http://spark.apache.org/</a> dataprocessing engine<br />
<div>
<br /></div>
sentiment analysis
<br />
<ul>
<li>positive / negative
</li>
<li>java 8 / streams api
</li>
<li>coursera
</li>
</ul>
demo
<br />
<ul>
<li>JavaSparkContext: config</li>
</ul>
<div>
<hr class="light" />
<h1>
Apache Spark? If only it worked</h1>
<h2>
Marcin Szymaniuk</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/u8MXemztChU" frameborder="0" allowfullscreen></iframe>
<br />
origin: <a href="http://blog.explainmydata.com/2014/05/spark-should-be-better-than-mapreduce.html">http://blog.explainmydata.com/2014/05/spark-should-be-better-than-mapreduce.html</a>*
<br />
<br />
details
<br />
<br />
<ul>
<li>RDD: Resilient Distributed Dataset :
<ul>
<li>cache
</li>
<li>no priority
</li>
</ul>
</li>
<li>sizing executors: configure memory (should autobalance in recent versions)
</li>
<li>known pitfalse: 2g block limit, gc's -- check level of parallelism (groupByKey, repartition)
</li>
<li>check locality: NODE_LOCAL -- increase exectors if needed
</li>
<li>broadcast variable
</li>
<li>avoid groupbykey -- use reducebykey
</li>
<li>debugging:
<ul>
<li>log aggregation
</li>
<li>hdfs monitoring logging
</li>
<li>gclogs </li>
</ul>
</li>
</ul>
</div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-70100608100337339462016-11-07T14:47:00.000+01:002016-11-08T20:15:54.190+01:00Devoxx 2016: Be Productive with JHipster (2016-11-07)<i>Julien Dubois & Deepu K Sasidharan
</i><br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/dzdjP3CPOCs" width="560"></iframe>
<br />
<a href="https://jhipster.github.io/">https://jhipster.github.io/</a>
<br />
<ul>
<li>Yeoman generator for generating Spring Boot + Angular apps
</li>
<li>open source
</li>
<li>install: <a href="https://jhipster.github.io/installation/">https://jhipster.github.io/installation/</a> --> yo jhipster
</li>
<li>ohmyz.sh --> zsh configuration for shortcuts
</li>
</ul>
demo generated stuff:
<br />
<ul>
<li>database: liquibase
</li>
<li>Dockerfile -- docker-compose -f src/main/docker/mysql.yml up -d
</li>
<li>swagger documentation
</li>
<li>mvn clean test (maven / gradle wrappers)
</li>
</ul>
other options
<br />
<ul>
<li>hazelcast <a href="https://hazelcast.org/getting-started/">https://hazelcast.org/getting-started/</a>
</li>
<li>mongodb / mongobee changelogs '<a href="https://github.com/mongobee/mongobee">https://github.com/mongobee/mongobee</a>)
</li>
<li>Cassandra
</li>
<li>elasticsearch (spring data elasticsearch)
</li>
<li>kafka: load / failover for microservices
</li>
<li>Spring Data JPA
Security
</li>
<li>sessionbased: classic Spring Security + "remember me" suport
</li>
<li>oauth2: stateless
</li>
<li>jwt: default for microservices
</li>
</ul>
I18n:
<br />
<ul>
<li>Angular Translate in client
</li>
<li>java internationalization on server
</li>
</ul>
Websockets
<br />
<ul>
<li>Spring Websockets
</li>
<li>sample screen generated (track users)
</li>
</ul>
demo:
<br />
<ul>
<li>yo jhipster entity
</li>
<li>tip: use git to save between sub-generator steps
</li>
<li>MapStruct for data-access (or DTO's) -- <a href="http://mapstruct.org/">http://mapstruct.org/</a>
</li>
<li>pagination options
</li>
<li>yo jhipster:upgrade -- creates clean git branch
</li>
<li>spring boot devtools: auto reload
</li>
<li>mvnw: maven wrapper <a href="https://github.com/takari/maven-wrapper">https://github.com/takari/maven-wrapper</a>
</li>
<li>gulp: task management <a href="https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md">https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md</a>
</li>
<li>bower install bootstrap material design
</li>
<li>John Papa Angular JS style guide: <a href="https://github.com/johnpapa/angular-styleguide">https://github.com/johnpapa/angular-styleguide</a>
</li>
</ul>
integration tests
<br />
<ul>
<li>reuse Spring context
</li>
<li>Mockito: @WithMockUser to use "test"-user
</li>
<li>field injection: ReflectionTestUtils.setField(...)
</li>
<li>karmaber:
</li>
<li>gatling
</li>
<li>cucum <a href="https://cucumber.io/">https://cucumber.io/</a>
</li>
<li>protractor (Firefox) <a href="http://www.protractortest.org/#">http://www.protractortest.org/#</a>/
</li>
<li>code quality with Sonar (mvnw clean test sonar:sonar)
</li>
<li>travis (<a href="https://travis-ci.org/">https://travis-ci.org/</a>) / jenins 2 config
</li>
</ul>
production
<br />
<ul>
<li>mvnw clean package -Pprod
</li>
<li>light server: <a href="http://undertow.io/">http://undertow.io/</a>
</li>
<li>Spring Boot Actuator prepares settings for production <a href="http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/%3Cspan%20style=">http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/<span style="color: red;">#production</span>-ready</a>,
</li>
<li>Dropwizard Metrics (timed annotations) <a href="http://metrics.dropwizard.io/p">http://metrics.dropwizard.io/p</a>
</li>
<li>stream logs to Logstash etc (ELK server) <a href="https://www.elastic.co/products/logstash">https://www.elastic.co/products/logstash</a>
</li>
<li>docker compose generator --> microservices
<ul>
<li>Docker Swarm subgenerator
</li>
<li>Kubernetes: yo jhipster:kubernetes
</li>
<li>Heroku: yo jhipster:heroku
</li>
</ul>
</li>
<li>deployables: AWS, BoxFuse (<a href="https://boxfuse.com/">https://boxfuse.com/</a>), war etc
</li>
</ul>
JDL Jhipster Domain Language
<br />
<ul>
<li>JDL Studio <a href="https://jhipster.github.io/jdl-studio/">https://jhipster.github.io/jdl-studio/</a></li>
<li>generate entities for jhipster
</li>
<li>yo jhipster:import-jdl <file from="" jdsl="" studio="">
</file></li>
<li>graphical view
</li>
</ul>
Modules
<br />
<ul>
<li><a href="https://jhipster.github.io/modules/marketplace/#">https://jhipster.github.io/modules/marketplace/#</a>/list
</li>
<li><a href="https://npms.io/search?q=jhipster-module">https://npms.io/search?q=jhipster-module</a>
</li>
</ul>
Microservices
<br />
<ul>
<li>"applicationtype": <b>gateway</b>
</li>
<li><a href="https://goo.gl/images/YiRaUf">https://goo.gl/images/YiRaUf</a>
</li>
<li>"Micorservice application" type
</li>
<li>security
<ul>
<li>JWT: default
<ul>
<li>secret key with gateway
</li>
</ul>
</li>
<li>or oauth2
</li>
</ul>
</li>
<li>Netflix Zuul (routing, load balancing, failover etc): <a href="https://github.com/Netflix/zuul/wiki">https://github.com/Netflix/zuul/wiki</a>
</li>
<li>websockets : not available (Zuul 2)
</li>
<li>registry:
<ul>
<li>JHipster registry (Netflix Eureka <a href="https://github.com/Netflix/eureka">https://github.com/Netflix/eureka</a> for service reg/discovery, Spring cloud config etc)
</li>
<li>HasiCorp Consul (alternative) <a href="https://www.consul.io/">https://www.consul.io/</a>
<ul>
<li>more efficient
</li>
<li>with DNS server
</li>
</ul>
</li>
</ul>
</li>
<li>Hazelcast distributed cache
</li>
</ul>
JHipster Console
<br />
<ul>
<li>Monitoring app built with ELK
</li>
<li>Dcoker Compose sub-generator
</li>
</ul>
future:
<br />
<ul>
<li>yarn upgrade <a href="https://yarnpkg.com/">https://yarnpkg.com/</a>
</li>
<li>bower will be removed in jhipster 4
</li>
<li>Angular JS2: 90% done
</li>
<li>JHipster IDE Plugin for eclipse: design entities
</li>
</ul>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-92097913681022836292016-10-06T20:24:00.003+02:002019-04-25T22:27:01.879+02:00GalliumOS 2: fixing keyboard layout on the Logon window<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTxhoJ88-wGi-GOlcW0N74_klzSvFmAfnCCor6Q60azIlzYQ4girnpba2d_xa9ugp52Nb5TnxMQaIaMiNnlnSMjodoXFy_-OaFA6nLqrgXHbpoKdchV8lyRBnjYM4i2ZetMzB_0G4PTdiQ/s1600/galliumos.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTxhoJ88-wGi-GOlcW0N74_klzSvFmAfnCCor6Q60azIlzYQ4girnpba2d_xa9ugp52Nb5TnxMQaIaMiNnlnSMjodoXFy_-OaFA6nLqrgXHbpoKdchV8lyRBnjYM4i2ZetMzB_0G4PTdiQ/s1600/galliumos.png" /></a><br />
I installed <a href="https://galliumos.org/">GalliumOS v2</a> on a Acer "CB3-131" Chromebook.<br />
<br />
This xubuntu-based distro makes it a nice and quite capable 'netbook' considering the limited 2Gb of memory. In addition the promised 8h batterylife is interesting. The procedure to install GalliumOS is device-specific and detailed in <a href="https://wiki.galliumos.org/Hardware_Compatibility">https://wiki.galliumos.org/Hardware_Compatibility</a>.<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs__Dui16IsHWtrDQjtFNBY9ny_DrmHyekWQRN7GTz10v3ldSBf6tg-_DKYJkNrgYbjsx-8PrfGfbrhzjAOTTYdggreyyWlvTCo1aCuCWcNZ_zKIwE-nxeOuNYAmkWU2ekggDwtrFhletM/s1600/2001062609.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs__Dui16IsHWtrDQjtFNBY9ny_DrmHyekWQRN7GTz10v3ldSBf6tg-_DKYJkNrgYbjsx-8PrfGfbrhzjAOTTYdggreyyWlvTCo1aCuCWcNZ_zKIwE-nxeOuNYAmkWU2ekggDwtrFhletM/s200/2001062609.jpeg" width="200" /></a>After install, the keyboard layout for non-qwerty (mine is french azerty) layouts has 2 issues that can be easily fixed:<br />
<br />
<ul>
<li>the logon-screen defaults to <i>qwerty</i>.<br /><u>Fix</u>: modify the following line in /etc/default/keyboard in a terminal (command: <span style="font-family: "courier new" , "courier" , monospace;">sudo nano /etc/default/keyboard</span>):...<br /><span style="font-family: "courier new" , "courier" , monospace;">XKBLAYOUT=<b>"<u>fr</u>"</b></span><br />...<br />(my chromebook has an azerty "<span style="font-family: "courier new" , "courier" , monospace;">fr</span>"ench keyboard. Pick the correct layout id for your keyboard)<br /><b>Note: this is fixed in GalliumOS 3</b></li>
<li>by default, GalliumOS uses the "right alt" for providing access to the functionkeys. On some-keyboard-layouts like azerty, the right alt is already used to access special characters ("<i>alt gr</i>"). This "alt gr" key combination is not working on a default GalliumOS install.<br /><u>solution</u>: open the "Keyboard" application and in the "<i>Layout</i>"-tab select the "<i>Chromebook (most models) | Search overlay | F keys mapped to media keys</i>" entry for "Keyboard model". You can now accessing the F-keys by combining them with the search-key. "Alt gr" will now work fine.</li>
</ul>
<div>
<b>Update 2019-04 GalliumOS 3 beta: </b>the first issue in the logon-screen is solved. The second solution for non-US keyboard with an "alt-gr" key still applies. See <a href="https://michael-peeters.blogspot.com/2019/04/gallium-os-3-beta2-on-acer-chromebook.html">https://michael-peeters.blogspot.com/2019/04/gallium-os-3-beta2-on-acer-chromebook.html</a> for details.</div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-26751256488075004542016-02-27T22:02:00.002+01:002016-02-27T22:05:56.435+01:00Headless Ubuntu Server 15.10 on Gigabyte GB-BXBT-2807I had some trouble getting my Ubuntu Server 15.10 install on a Gigabyte GB-BXBT-2807 booting without the HDMI cable plugged in.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrjvXGvWDJYYijnTp23KxDpt2ulsY1brD7nHx4XI_K-nT8xBk9a8ueLKqGKkc_AgsmhCbsukNj0JISgE7EboS_EQ49-xIJOPc2mpcjDF6yN1MPZ8KIuBSMWvO_Xb2nDkh1s_jSfgZqoxXO/s1600/Gigabyte+GB-BXBT-2807.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrjvXGvWDJYYijnTp23KxDpt2ulsY1brD7nHx4XI_K-nT8xBk9a8ueLKqGKkc_AgsmhCbsukNj0JISgE7EboS_EQ49-xIJOPc2mpcjDF6yN1MPZ8KIuBSMWvO_Xb2nDkh1s_jSfgZqoxXO/s320/Gigabyte+GB-BXBT-2807.png" width="320" /></a></div>
<br />
<br />
After some trial and error, I found an easy fix: edit the <span style="font-family: "courier new" , "courier" , monospace;">/etc/default/grub</span> file (<span style="font-family: "courier new" , "courier" , monospace;">sudo nano /etc/default/grub</span>) and modify / uncomment the following entries:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">GRUB_CMDLINE_LINUX_DEFAULT=""</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">GRUB_TERMINAL=console</span></blockquote>
Regenerate the grub config: <span style="font-family: Courier New, Courier, monospace;">sudo update-grub2</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
After that Ubuntu Server just boots fine in headless mode without any HDMI cable plugged in.Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-91727873299767648912016-01-22T20:28:00.002+01:002017-01-05T09:01:10.405+01:00Fixing the TechnoTrend T1900 external DVB-T device under Ubuntu<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJm859g8ApJ5E_Uu_Lxik_Hsia9KbKuv-0D5E-IE4322b8JF7_KLUGv0kckl3hv5Ls5GUioq9EC4_KoNu1vtulYjIcKjcBi5HDR6cB0-1TUABqg6dW3ur0n6gJe3eGzuvL3FDZni3MRt3E/s1600/Technotrend-Connect-USB-T-1900-DVB-T-Windows-Linux.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJm859g8ApJ5E_Uu_Lxik_Hsia9KbKuv-0D5E-IE4322b8JF7_KLUGv0kckl3hv5Ls5GUioq9EC4_KoNu1vtulYjIcKjcBi5HDR6cB0-1TUABqg6dW3ur0n6gJe3eGzuvL3FDZni3MRt3E/s320/Technotrend-Connect-USB-T-1900-DVB-T-Windows-Linux.jpg" width="320" /></a>I had trouble getting the TechnoTrend T1900 external DVB-T device working under Ubuntu.<br />
<br />
The device gets properly detected by Ubuntu:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ lsusb<br />
...<br />
Bus 001 Device 007: ID 0b48:1005 TechnoTrend AG Technotrend/Hauppauge USB-Nova<br />
...<br /><br />
$ lsmod | grep dvb<br />
dvb_ttusb_budget 24576 10 <br />
dvb_core 126976 1 dvb_ttusb_budget</span>
</blockquote>
While scanning for channels, I discovered in dmesg that the firmware was outdated and couldn't be overridden. (see also <a href="http://ubuntuforums.org/showthread.php?t=1316032">http://ubuntuforums.org/showthread.php?t=1316032</a> -- "be" is "Belgium")<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ sudo apt install w-scan<br />
$ w_scan -c be -X >> channels.conf<br />
...</span>
</blockquote>
<br />
In a different terminal:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">$ dmesg<br />
...<br />
[ 430.620228] tda1004x: setting up plls for 53MHz sampling clock<br />
[ 432.761251] tda1004x: timeout waiting for DSP ready<br />
[ 432.767276] tda1004x: found firmware revision 0 -- invalid<br />
[ 432.767294] tda1004x: trying to boot from eeprom<br />
[ 435.082609] tda1004x: timeout waiting for DSP ready<br />
[ 435.089600] tda1004x: found firmware revision 0 -- invalid<br />
[ 435.089615] tda1004x: waiting for firmware upload...<br />
[ 435.089712] usb 1-2.3: <b>Direct firmware load for dvb-fe-tda10046.fw failed with error -2</b><br />
</span>
</blockquote>
<br />
Luckily, the solution is easy: just load the non-free firmware package (apt and apt-get are the same):
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">sudo apt install linux-firmware-nonfree<br />
</span>
</blockquote>
Now, the DVB-T device will work just fine.
<br />
<br />
reference: <a href="http://lists.mythtv.org/pipermail/mythtv-users/2012-June/335840.html">http://lists.mythtv.org/pipermail/mythtv-users/2012-June/335840.html</a><br />
<br />
<b>update 2016</b>: with Ubuntu 16.04, the linux-firmware-nonfree package was removed from the official repos (<a href="http://ubuntu-bugs.narkive.com/LwyC5LpW/bug-1513589-new-linux-firmware-nonfree-should-be-removed-from-xenial" style="font-family: Ubuntu, sans-serif; line-height: normal;">https://bugs.launchpad.net/ubuntu/+source/linux-firmware-nonfree/+bug/1513589</a>).<br />
<br />
As a workaround you have to manually download and install the firmware drivers:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">wget https://github.com/OpenELEC/dvb-firmware/raw/master/firmware/dvb-fe-tda10045.fw<br />
wget https://github.com/OpenELEC/dvb-firmware/raw/master/firmware/dvb-fe-tda10046.fw<br />
sudo cp ./dvb-fe-tda1004*.fw /lib/firmware/</span></blockquote>
<br />
<br />Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-8622684031922641072015-04-26T21:43:00.004+02:002015-04-26T21:48:32.565+02:00Fixing Certificate Issue for Minecraft under UbuntuThe Minecraft game on one of my Ubuntu pc's suddenly failed to start. After some
digging into the logs, it became clear that the minecraft servers use a
new certificate that can't be validated by the java cacerts file on my
Ubuntu 14.10 installation.<br />
<br />
Luckily, the solution is simple. Open a terminal and execute the following commands
<br />
<blockquote class="tr_bq">
<ul>
<li><span style="font-family: Verdana,sans-serif;">echo -n | openssl s_client -connect libraries.minecraft.net:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/minecraft.crt</span> </li>
<li><span style="font-family: Verdana,sans-serif;">sudo keytool -import -trustcacerts -keystore /etc/ssl/certs/java/cacerts -storepass changeit -noprompt -alias mycert -file /tmp/minecraft.crt</span> </li>
</ul>
</blockquote>
The first command retrieves the certificate from libraries.minecraft.net, the second imports it into the java certificate store.
<br />
<br />
reference: <a href="http://stackoverflow.com/questions/11617210/how-to-properly-import-a-selfsigned-certificate-into-java-keystore-that-is-avail">http://stackoverflow.com/questions/11617210/how-to-properly-import-a-selfsigned-certificate-into-java-keystore-that-is-avail</a>
<br />
<br />
Detailed error log <i>before</i> the fix:
<br />
<pre> [20:52:56 WARN]: Couldn't download https://libraries.minecraft.net/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar for job 'Version & Libraries'
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[?:1.8.0_45]
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1937) ~[?:1.8.0_45]
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) ~[?:1.8.0_45]
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) ~[?:1.8.0_45]
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1478) ~[?:1.8.0_45]
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212) ~[?:1.8.0_45]
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) ~[?:1.8.0_45]
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) ~[?:1.8.0_45]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1050) ~[?:1.8.0_45]
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363) ~[?:1.8.0_45]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391) ~[?:1.8.0_45]
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375) ~[?:1.8.0_45]
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) ~[?:1.8.0_45]
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) ~[?:1.8.0_45]
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1512) ~[?:1.8.0_45]
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) ~[?:1.8.0_45]
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) ~[?:1.8.0_45]
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) ~[?:1.8.0_45]
at com.mojang.launcher.updater.download.ChecksummedDownloadable.download(ChecksummedDownloadable.java:49) ~[launcher_mcpatched.jar:?]
at com.mojang.launcher.updater.download.DownloadJob.popAndDownload(DownloadJob.java:109) [launcher_mcpatched.jar:?]
at com.mojang.launcher.updater.download.DownloadJob.access$000(DownloadJob.java:12) [launcher_mcpatched.jar:?]
at com.mojang.launcher.updater.download.DownloadJob$1.run(DownloadJob.java:86) [launcher_mcpatched.jar:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_45]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_45]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_45]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45]
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) ~[?:1.8.0_45]
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) ~[?:1.8.0_45]
at sun.security.validator.Validator.validate(Validator.java:260) ~[?:1.8.0_45]
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) ~[?:1.8.0_45]
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) ~[?:1.8.0_45]
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) ~[?:1.8.0_45]
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460) ~[?:1.8.0_45]
... 22 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145) ~[?:1.8.0_45]
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131) ~[?:1.8.0_45]
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) ~[?:1.8.0_45]
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) ~[?:1.8.0_45]
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) ~[?:1.8.0_45]
at sun.security.validator.Validator.validate(Validator.java:260) ~[?:1.8.0_45]
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) ~[?:1.8.0_45]
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) ~[?:1.8.0_45]
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) ~[?:1.8.0_45]
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460) ~[?:1.8.0_45]
... 22 more
[20:52:56 ERROR]: Gave up trying to download https://libraries.minecraft.net/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar for job 'Version & Libraries'
[20:52:56 ERROR]: Job 'Version & Libraries' finished with 31 failure(s)! (took 0:00:02.233)
</pre>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-7633306900536559832014-11-14T12:45:00.000+01:002014-11-14T12:45:01.555+01:00Devoxx 2014: Conference day 3 Notes (14/11/2014)<br />
<h4 data-origin="<h4 id="50-new-things-we-can-do-with-java-8"><a name="50-new-things-we-can-do-with-java-8" href="#50-new-things-we-can-do-with-java-8"></a>50 new things we can do with Java 8</h4>" id="50-new-things-we-can-do-with-java-8" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
50 new things we can do with Java 8</h4>
<div data-origin="<p><strong>José Paumard</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>José Paumard</strong></div>
<div data-origin="<p>Date</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Date</div>
<ul data-origin="<ul>
<li>Instant.now()<ul>
<li>Duration.between(start, end).toMillis()</li>
</ul>
</li>
<li>LocalDate.now() — .of() — <ul>
<li>Period: time between 2 dates</li>
<li>now.with(TemporalAdjuster.next(DayOfWeek.SUNDAY));</li>
</ul>
</li>
<li>LocalTime.now() — of(10,20) //10:20</li>
<li>ZoneTime / ZoneId.of(“Europe/London”)<ul>
<li>ZonedDateTime — Period</li>
</ul>
</li>
<li>Formatter (DateTimeFormatter.ISO_DATE_TIME etc.)</li>
<li>Bridge with java.util.Date:<ul>
<li>Date.from(instant)</li>
<li>TimeStamp.from(instant)</li>
<li>Date.from / toLocalDate()</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Instant.now()<ul>
<li style="line-height: 1.4em;">Duration.between(start, end).toMillis()</li>
</ul>
</li>
<li style="line-height: 1.4em;">LocalDate.now() — .of() —<ul>
<li style="line-height: 1.4em;">Period: time between 2 dates</li>
<li style="line-height: 1.4em;">now.with(TemporalAdjuster.next(DayOfWeek.SUNDAY));</li>
</ul>
</li>
<li style="line-height: 1.4em;">LocalTime.now() — of(10,20) //10:20</li>
<li style="line-height: 1.4em;">ZoneTime / ZoneId.of(“Europe/London”)<ul>
<li style="line-height: 1.4em;">ZonedDateTime — Period</li>
</ul>
</li>
<li style="line-height: 1.4em;">Formatter (DateTimeFormatter.ISO_DATE_TIME etc.)</li>
<li style="line-height: 1.4em;">Bridge with java.util.Date:<ul>
<li style="line-height: 1.4em;">Date.from(instant)</li>
<li style="line-height: 1.4em;">TimeStamp.from(instant)</li>
<li style="line-height: 1.4em;">Date.from / toLocalDate()</li>
</ul>
</li>
</ul>
<div data-origin="<p>Stream</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Stream</div>
<ul data-origin="<ul>
<li>IntStream</li>
<li>Patter.compile(…).splitAsStream(txt)</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">IntStream</li>
<li style="line-height: 1.4em;">Patter.compile(…).splitAsStream(txt)</li>
</ul>
<div data-origin="<p>String concat</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
String concat</div>
<ul data-origin="<ul>
<li>compiler does stringbuilder conversion</li>
<li>StringJoiner: concat with delimeters + pre-/postfix<ul>
<li>String.join(…)</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">compiler does stringbuilder conversion</li>
<li style="line-height: 1.4em;">StringJoiner: concat with delimeters + pre-/postfix<ul>
<li style="line-height: 1.4em;">String.join(…)</li>
</ul>
</li>
</ul>
<div data-origin="<p>Numbers</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Numbers</div>
<ul data-origin="<ul>
<li>Long.max(), Long.sum()</li>
<li>lambda: .reduce(…,Long::max)</li>
<li>static Long.hashCode(l) </li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Long.max(), Long.sum()</li>
<li style="line-height: 1.4em;">lambda: .reduce(…,Long::max)</li>
<li style="line-height: 1.4em;">static Long.hashCode(l)</li>
</ul>
<div data-origin="<p>I/O reading text files</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
I/O reading text files</div>
<ul data-origin="<ul>
<li>Files.lines(Path)<ul>
<li>path=Paths.get(…);</li>
<li>autoclosable with try(resource){} pattern</li>
</ul>
</li>
<li>Files.list(path)</li>
<li>Files.walk(path): recursive find</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Files.lines(Path)<ul>
<li style="line-height: 1.4em;">path=Paths.get(…);</li>
<li style="line-height: 1.4em;">autoclosable with try(resource){} pattern</li>
</ul>
</li>
<li style="line-height: 1.4em;">Files.list(path)</li>
<li style="line-height: 1.4em;">Files.walk(path): recursive find</li>
</ul>
<div data-origin="<p>Iterable</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Iterable</div>
<ul data-origin="<ul>
<li>forEach consumes (e.g; strings.forEacht(System.out::println))</li>
<li>boolean b = list.removeIf(s-> s.length() > 4)</li>
<li>list.replaceAll(String::toUpperCase)</li>
<li>list.sort(Comparator.naturalOrder())</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">forEach consumes (e.g; strings.forEacht(System.out::println))</li>
<li style="line-height: 1.4em;">boolean b = list.removeIf(s-> s.length() > 4)</li>
<li style="line-height: 1.4em;">list.replaceAll(String::toUpperCase)</li>
<li style="line-height: 1.4em;">list.sort(Comparator.naturalOrder())</li>
</ul>
<div data-origin="<p>Comparator</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Comparator</div>
<ul data-origin="<ul>
<li>Comparator.naturalOrder()</li>
<li>Comparator.comparingBy(Person::getLastName) .thenComparing(Person::getFirstName).thenComparing(..)</li>
<li>comparator.reversedOrder() / comp.reversed()</li>
<li>Comparator.nullsFirst() /nullsLast()</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Comparator.naturalOrder()</li>
<li style="line-height: 1.4em;">Comparator.comparingBy(Person::getLastName) .thenComparing(Person::getFirstName).thenComparing(..)</li>
<li style="line-height: 1.4em;">comparator.reversedOrder() / comp.reversed()</li>
<li style="line-height: 1.4em;">Comparator.nullsFirst() /nullsLast()</li>
</ul>
<div data-origin="<p>Optional</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Optional</div>
<ul data-origin="<ul>
<li>Optional.<string>empty();</string></li>
<li>Optional.of(“one”)</li>
<li>opt.isPresent() /.get() / .orElse(“”) / .orElseThrow()</li>
<li>Stream integration ifPresent / filter / map / flatMap<ul>
<li>flatMap().collect(…) </li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Optional.<string>empty();</string></li>
<li style="line-height: 1.4em;">Optional.of(“one”)</li>
<li style="line-height: 1.4em;">opt.isPresent() /.get() / .orElse(“”) / .orElseThrow()</li>
<li style="line-height: 1.4em;">Stream integration ifPresent / filter / map / flatMap<ul>
<li style="line-height: 1.4em;">flatMap().collect(…)</li>
</ul>
</li>
</ul>
<div data-origin="<p>Map</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Map</div>
<ul data-origin="<ul>
<li>map.forEach( (key, value) -> …)</li>
<li>better Compare-And-Swap functions for concurrency:<ul>
<li>map.get(key) -> map.getOrDefault(key, <em>default</em>)</li>
<li>map.putIfAbsent(key, object)</li>
<li>map.replace(key, old, new) -> extra test on old value</li>
<li>map.remove(key, old) - extra test on old value</li>
<li>map.compute() / computeIfAbsent() / computeIfPresent()</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">map.forEach( (key, value) -> …)</li>
<li style="line-height: 1.4em;">better Compare-And-Swap functions for concurrency:<ul>
<li style="line-height: 1.4em;">map.get(key) -> map.getOrDefault(key, <em>default</em>)</li>
<li style="line-height: 1.4em;">map.putIfAbsent(key, object)</li>
<li style="line-height: 1.4em;">map.replace(key, old, new) -> extra test on old value</li>
<li style="line-height: 1.4em;">map.remove(key, old) - extra test on old value</li>
<li style="line-height: 1.4em;">map.compute() / computeIfAbsent() / computeIfPresent()</li>
</ul>
</li>
</ul>
<div data-origin="<p>Type Annotations</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Type Annotations</div>
<ul data-origin="<ul>
<li>@NonNull</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">@NonNull</li>
</ul>
<div data-origin="<p>Parallel Arrays</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Parallel Arrays</div>
<ul data-origin="<ul>
<li>Arrays.parallelPrefix </li>
<li>parallelSort</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Arrays.parallelPrefix</li>
<li style="line-height: 1.4em;">parallelSort</li>
</ul>
<div data-origin="<p>Completable Future -> graphs of tasks (“reactive programming”)</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Completable Future -> graphs of tasks (“reactive programming”)</div>
<ul data-origin="<ul>
<li>CompletableFuture.supplyAsync()</li>
<li>thenApply() thenAccept()</li>
<li>thenCompose() </li>
<li>allof(): combine multiple futures -> join()</li>
<li>thenCombine() / applyToEither: get the first result</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">CompletableFuture.supplyAsync()</li>
<li style="line-height: 1.4em;">thenApply() thenAccept()</li>
<li style="line-height: 1.4em;">thenCompose()</li>
<li style="line-height: 1.4em;">allof(): combine multiple futures -> join()</li>
<li style="line-height: 1.4em;">thenCombine() / applyToEither: get the first result</li>
</ul>
<div data-origin="<p>Atomic Variables</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Atomic Variables</div>
<ul data-origin="<ul>
<li>AtomicLong -> updateAndGet(lambda) / accumulateAndGet(lambda)</li>
<li>multithreaded ;increment() / .sum() computes final result</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">AtomicLong -> updateAndGet(lambda) / accumulateAndGet(lambda)</li>
<li style="line-height: 1.4em;">multithreaded ;increment() / .sum() computes final result</li>
</ul>
<div data-origin="<p>StampedLock</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
StampedLock</div>
<ul data-origin="<ul>
<li>s.writeLock() s.readLock()</li>
<li>tryOptimisticRead()</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">s.writeLock() s.readLock()</li>
<li style="line-height: 1.4em;">tryOptimisticRead()</li>
</ul>
<div data-origin="<p>ConcurrentHashMap</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
ConcurrentHashMap</div>
<ul data-origin="<ul>
<li>completely replaced, no locking</li>
<li><del>size()</del>: do not use! -> map.mappingCount()</li>
<li>search(threshold, lambda) : threshold before going parallel </li>
<li>reduce() / reduceKey() / reduceEntries()</li>
<li>ConcurrentHashMap.newKeySet() // values are Boolean.TRUE</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">completely replaced, no locking</li>
<li style="line-height: 1.4em;"><del>size()</del>: do not use! -> map.mappingCount()</li>
<li style="line-height: 1.4em;">search(threshold, lambda) : threshold before going parallel</li>
<li style="line-height: 1.4em;">reduce() / reduceKey() / reduceEntries()</li>
<li style="line-height: 1.4em;">ConcurrentHashMap.newKeySet() // values are Boolean.TRUE</li>
</ul>
<div data-origin="<p>Books</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Books</div>
<ul data-origin="<ul>
<li>Java SE8 for the Really Impatient - Cay Horstman </li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Java SE8 for the Really Impatient - Cay Horstman</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="introduction-to-android-wear---a-glimpse-into-the-future"><a name="introduction-to-android-wear---a-glimpse-into-the-future" href="#introduction-to-android-wear---a-glimpse-into-the-future"></a>Introduction to Android Wear - A Glimpse Into the Future</h4>" id="introduction-to-android-wear---a-glimpse-into-the-future" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#introduction-to-android-wear---a-glimpse-into-the-future" name="introduction-to-android-wear---a-glimpse-into-the-future" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Introduction to Android Wear - A Glimpse Into the Future</h4>
<div data-origin="<p><em>Cyril Mottier</em></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<em>Cyril Mottier</em></div>
<div data-origin="<p>principles:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
principles:</div>
<ul data-origin="<ul>
<li>contextual</li>
<li>glanceable</li>
<li>low interaction </li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">contextual</li>
<li style="line-height: 1.4em;">glanceable</li>
<li style="line-height: 1.4em;">low interaction</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="in-full-flow:-java-8-lambdas-in-the-stream"><a name="in-full-flow:-java-8-lambdas-in-the-stream" href="#in-full-flow:-java-8-lambdas-in-the-stream"></a>In Full Flow: Java 8 Lambdas in the Stream</h4>" id="in-full-flow:-java-8-lambdas-in-the-stream" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#in-full-flow:-java-8-lambdas-in-the-stream" name="in-full-flow:-java-8-lambdas-in-the-stream" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>In Full Flow: Java 8 Lambdas in the Stream</h4>
<div data-origin="<p><em>Paul Sandoz</em></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<em>Paul Sandoz</em></div>
<div data-origin="<p>Stream Basics</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Stream Basics</div>
<ul data-origin="<ul>
<li>Stream:<ul>
<li>abstract view over data</li>
<li>aggregate ops</li>
</ul>
</li>
<li>not RxJava, not CompletableFuture, not Distributed Stream</li>
<li>e.g.;<ul>
<li>list.stream().filter(s -> s.length() > 0).count()</li>
<li>mapToLong(e -> 1L)</li>
<li>reduce(0, Long::sum);</li>
<li>reduce(“”, (a, b) -> a + “ “ + b)</li>
<li>Optional<string></string></li>
</ul>
</li>
<li>performance:<ul>
<li>parallel can go slower for small datasets (due to overhead)</li>
<li>reduce can generate a lot of extra classes -> .collect()</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Stream:<ul>
<li style="line-height: 1.4em;">abstract view over data</li>
<li style="line-height: 1.4em;">aggregate ops</li>
</ul>
</li>
<li style="line-height: 1.4em;">not RxJava, not CompletableFuture, not Distributed Stream</li>
<li style="line-height: 1.4em;">e.g.;<ul>
<li style="line-height: 1.4em;">list.stream().filter(s -> s.length() > 0).count()</li>
<li style="line-height: 1.4em;">mapToLong(e -> 1L)</li>
<li style="line-height: 1.4em;">reduce(0, Long::sum);</li>
<li style="line-height: 1.4em;">reduce(“”, (a, b) -> a + “ “ + b)</li>
<li style="line-height: 1.4em;">Optional<string></string></li>
</ul>
</li>
<li style="line-height: 1.4em;">performance:<ul>
<li style="line-height: 1.4em;">parallel can go slower for small datasets (due to overhead)</li>
<li style="line-height: 1.4em;">reduce can generate a lot of extra classes -> .collect()</li>
</ul>
</li>
</ul>
<div data-origin="<p>Parallel Game</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Parallel Game</div>
<ul data-origin="<ul>
<li>a stream is sequential by default</li>
<li>can be made parallel()</li>
<li>Greedy -> takes more work -> multicore</li>
<li><p>implementation under the hood:</p>
<ul>
<li>forkjoinpool -> split problem in parts</li>
</ul>
</li>
<li><p>when to use? </p>
<ul>
<li><a href="http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html">http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html</a></li>
<li>minimum threshold (~100µs)</li>
<li>workload ‘components’</li>
<li>measure </li>
<li>JMH — <a href="http://openjdk.java.net/projects/code-tools/jmh/">http://openjdk.java.net/projects/code-tools/jmh/</a> </li>
<li>switch off HyperThreading</li>
<li>visualize <ul>
<li>-> DOT file -> SVG</li>
<li>adapt() / peek(): to get feedback</li>
<li>datamodels:<ul>
<li>ArrayList / Range: best</li>
<li>HashSet: not completely balanced</li>
<li>LinkedList / iterator: poor choice (size unknown)</li>
</ul>
</li>
</ul>
</li>
<li>boxing:<ul>
<li>gc works harder</li>
<li>pointer chasing/ cache issues</li>
<li>-> Int/Long Streams</li>
</ul>
</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">a stream is sequential by default</li>
<li style="line-height: 1.4em;">can be made parallel()</li>
<li style="line-height: 1.4em;">Greedy -> takes more work -> multicore</li>
<li style="line-height: 1.4em;"><div style="margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
implementation under the hood:</div>
<ul>
<li style="line-height: 1.4em;">forkjoinpool -> split problem in parts</li>
</ul>
</li>
<li style="line-height: 1.4em;"><div style="margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
when to use?</div>
<ul>
<li style="line-height: 1.4em;"><a href="http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html</a></li>
<li style="line-height: 1.4em;">minimum threshold (~100µs)</li>
<li style="line-height: 1.4em;">workload ‘components’</li>
<li style="line-height: 1.4em;">measure</li>
<li style="line-height: 1.4em;">JMH — <a href="http://openjdk.java.net/projects/code-tools/jmh/" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">http://openjdk.java.net/projects/code-tools/jmh/</a></li>
<li style="line-height: 1.4em;">switch off HyperThreading</li>
<li style="line-height: 1.4em;">visualize<ul>
<li style="line-height: 1.4em;">-> DOT file -> SVG</li>
<li style="line-height: 1.4em;">adapt() / peek(): to get feedback</li>
<li style="line-height: 1.4em;">datamodels:<ul>
<li style="line-height: 1.4em;">ArrayList / Range: best</li>
<li style="line-height: 1.4em;">HashSet: not completely balanced</li>
<li style="line-height: 1.4em;">LinkedList / iterator: poor choice (size unknown)</li>
</ul>
</li>
</ul>
</li>
<li style="line-height: 1.4em;">boxing:<ul>
<li style="line-height: 1.4em;">gc works harder</li>
<li style="line-height: 1.4em;">pointer chasing/ cache issues</li>
<li style="line-height: 1.4em;">-> Int/Long Streams</li>
</ul>
</li>
</ul>
</li>
</ul>
<div data-origin="<p>The future</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
The future</div>
<ul data-origin="<ul>
<li>near term: <ul>
<li>better parallel resource control</li>
<li>improved splitting implementations<ul>
<li>Files.lines()</li>
<li>unordered input to limit()</li>
</ul>
</li>
<li>more operations:<ul>
<li>takeWhile()</li>
<li>skipWhile()</li>
<li>Matcher.stream()</li>
</ul>
</li>
<li>helper methods<ul>
<li>Optional.stream()</li>
<li>Stream.ofNullable(T t)</li>
</ul>
</li>
<li>longer term:</li>
<li>Value types</li>
<li>extending generics over values</li>
<li>IntStream extends Stream<int></int></li>
<li>Tuples</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">near term:<ul>
<li style="line-height: 1.4em;">better parallel resource control</li>
<li style="line-height: 1.4em;">improved splitting implementations<ul>
<li style="line-height: 1.4em;">Files.lines()</li>
<li style="line-height: 1.4em;">unordered input to limit()</li>
</ul>
</li>
<li style="line-height: 1.4em;">more operations:<ul>
<li style="line-height: 1.4em;">takeWhile()</li>
<li style="line-height: 1.4em;">skipWhile()</li>
<li style="line-height: 1.4em;">Matcher.stream()</li>
</ul>
</li>
<li style="line-height: 1.4em;">helper methods<ul>
<li style="line-height: 1.4em;">Optional.stream()</li>
<li style="line-height: 1.4em;">Stream.ofNullable(T t)</li>
</ul>
</li>
<li style="line-height: 1.4em;">longer term:</li>
<li style="line-height: 1.4em;">Value types</li>
<li style="line-height: 1.4em;">extending generics over values</li>
<li style="line-height: 1.4em;">IntStream extends Stream<int></int></li>
<li style="line-height: 1.4em;">Tuples</li>
</ul>
</li>
</ul>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-43955291346692652662014-11-13T19:55:00.000+01:002014-11-13T19:55:07.485+01:00Devoxx 2014: Conference day 2 Notes (13/11/2014)<br />
<h4 data-origin="<h4 id="keynote:-android-material-design"><a name="keynote:-android-material-design" href="#keynote:-android-material-design"></a>keynote: Android Material Design</h4>" id="keynote:-android-material-design" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
keynote: Android Material Design</h4>
<div data-origin="<p><strong>Chet Haase & Nick Butcher</strong><br>visual design talk :-/</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Chet Haase & Nick Butcher</strong><br style="clear: both;" />visual design talk :-/</div>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="modern-enterprise-java-architectures-with-spring-4.1"><a name="modern-enterprise-java-architectures-with-spring-4.1" href="#modern-enterprise-java-architectures-with-spring-4.1"></a>Modern Enterprise Java Architectures with Spring 4.1</h4>" id="modern-enterprise-java-architectures-with-spring-4.1" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#modern-enterprise-java-architectures-with-spring-4.1" name="modern-enterprise-java-architectures-with-spring-4.1" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Modern Enterprise Java Architectures with Spring 4.1</h4>
<div data-origin="<p><strong>Juergen Hoeller</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Juergen Hoeller</strong></div>
<div data-origin="<p>Spring Framework 4.1</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Spring Framework 4.1</div>
<ul data-origin="<ul>
<li>embedded webserver</li>
<li>websocket-style lightweight messaging</li>
<li>baseline: <ul>
<li>min.: java 6, servelt 2.5, JPA 2.0</li>
<li>Java 8 support,</li>
</ul>
</li>
<li>support: <ul>
<li>servlet 3.0 oriented</li>
<li>compatible with Websphere7 (JPA feature pack) </li>
<li>Google App Engine</li>
<li>EE7 level: <ul>
<li>servlet 3.1, Websockets</li>
<li>JRSR-236 Managed concurrency</li>
<li>JPA2.1, Bean validattion</li>
<li>JTA 1.2, JMS 2.0</li>
<li><em>JCache 1.0</em></li>
</ul>
</li>
<li>dedicated support for latest servers<ul>
<li>Tomcat 8.0, Jetty 9.2</li>
<li>GlassFish 4.2, WebLogic 12.1.3</li>
<li>Websphere Liberty Profile, WildFly</li>
</ul>
</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">embedded webserver</li>
<li style="line-height: 1.4em;">websocket-style lightweight messaging</li>
<li style="line-height: 1.4em;">baseline:<ul>
<li style="line-height: 1.4em;">min.: java 6, servlet 2.5, JPA 2.0</li>
<li style="line-height: 1.4em;">Java 8 support,</li>
</ul>
</li>
<li style="line-height: 1.4em;">support:<ul>
<li style="line-height: 1.4em;">servlet 3.0 oriented</li>
<li style="line-height: 1.4em;">compatible with Websphere7 (JPA feature pack)</li>
<li style="line-height: 1.4em;">Google App Engine</li>
<li style="line-height: 1.4em;">EE7 level:<ul>
<li style="line-height: 1.4em;">servlet 3.1, Websockets</li>
<li style="line-height: 1.4em;">JRSR-236 Managed concurrency</li>
<li style="line-height: 1.4em;">JPA2.1, Bean validattion</li>
<li style="line-height: 1.4em;">JTA 1.2, JMS 2.0</li>
<li style="line-height: 1.4em;"><em>JCache 1.0</em></li>
</ul>
</li>
<li style="line-height: 1.4em;">dedicated support for latest servers<ul>
<li style="line-height: 1.4em;">Tomcat 8.0, Jetty 9.2</li>
<li style="line-height: 1.4em;">GlassFish 4.2, WebLogic 12.1.3</li>
<li style="line-height: 1.4em;">Websphere Liberty Profile, WildFly</li>
</ul>
</li>
</ul>
</li>
</ul>
<div data-origin="<p>Spring 4.1 features</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Spring 4.1 features</div>
<ul data-origin="<ul>
<li>Component Classes: example meta-data (annotations) (not new)<ul>
<li>@Service, @Lazy</li>
<li>@Autowired</li>
<li>@Transactional</li>
</ul>
</li>
<li>Configuration classes<ul>
<li>@Configuration</li>
<li>@Profile</li>
</ul>
</li>
<li>Composable annotations<ul>
<li>combine annotations to a “@interface” that groups multiple default annotations</li>
<li>overridable annotations: e.g. custom scopes, require specific attributes</li>
</ul>
</li>
<li>Generic-based Injection Matching: look for the most specific @Bean match with @Autowired, without qualifiers;</li>
<li>ordered collection injection: <ul>
<li>@Bean @Order(1)</li>
<li>@Autowired …List<> is filled with correct beans, using the @Order</li>
</ul>
</li>
<li>Lazy Injection Points </li>
<li>support for standard annotations: @ManagedBean, @Inject, @PreDestroy -> no need to have spring dependencies</li>
<li>java.util.Optional (java 8)</li>
<li>Declarative formatting with Java 8 data-time:<ul>
<li>base: LocalDate, LocalDateTime (java.time.*)</li>
<li>@DateTimeFormat(pattern=”M/d/yy h:mm”) (org.springframework.annotations)</li>
<li>@Past (javax.validation.constraints.*)</li>
</ul>
</li>
<li>Declarative Scheduling<ul>
<li>@Async </li>
<li>@Scheduled (can repeated on a single method)</li>
</ul>
</li>
<li>java 8 Lambdas<ul>
<li>JdbcTemplate, JmsTemplate etc.</li>
</ul>
</li>
<li>Annotated MVC Controllers<ul>
<li>@PathVariable from @RequestMapping(value=”/path/{id}”)</li>
<li>@Valid -> bean validation</li>
</ul>
</li>
<li>STOMP on WebSocket: @SubscribeMapping</li>
<li>Annotated JMS Endpoints: <ul>
<li>@JmsListener</li>
<li>Messaging abstraction: org.springframework.messaging.Message</li>
</ul>
</li>
<li>Declarative Caching: <ul>
<li>use spring’s annotation (not in JEE yet)<ul>
<li>@CacheConfig</li>
<li>@Cacheable</li>
<li>@CachePut</li>
<li>@CacheEvict</li>
</ul>
</li>
<li><em>or</em> JCache JSR-107 javax.cache.annotations.<ul>
<li>@CacheDefaults</li>
<li>@CacheResult</li>
<li>@CachePut</li>
<li>@CacheRemove</li>
</ul>
</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Component Classes: example meta-data (annotations) (not new)<ul>
<li style="line-height: 1.4em;">@Service, @Lazy</li>
<li style="line-height: 1.4em;">@Autowired</li>
<li style="line-height: 1.4em;">@Transactional</li>
</ul>
</li>
<li style="line-height: 1.4em;">Configuration classes<ul>
<li style="line-height: 1.4em;">@Configuration</li>
<li style="line-height: 1.4em;">@Profile</li>
</ul>
</li>
<li style="line-height: 1.4em;">Composable annotations<ul>
<li style="line-height: 1.4em;">combine annotations to a “@interface” that groups multiple default annotations</li>
<li style="line-height: 1.4em;">overridable annotations: e.g. custom scopes, require specific attributes</li>
</ul>
</li>
<li style="line-height: 1.4em;">Generic-based Injection Matching: look for the most specific @Bean match with @Autowired, without qualifiers;</li>
<li style="line-height: 1.4em;">ordered collection injection:<ul>
<li style="line-height: 1.4em;">@Bean @Order(1)</li>
<li style="line-height: 1.4em;">@Autowired …List<> is filled with correct beans, using the @Order</li>
</ul>
</li>
<li style="line-height: 1.4em;">Lazy Injection Points</li>
<li style="line-height: 1.4em;">support for standard annotations: @ManagedBean, @Inject, @PreDestroy -> no need to have spring dependencies</li>
<li style="line-height: 1.4em;">java.util.Optional (java 8)</li>
<li style="line-height: 1.4em;">Declarative formatting with Java 8 data-time:<ul>
<li style="line-height: 1.4em;">base: LocalDate, LocalDateTime (java.time.*)</li>
<li style="line-height: 1.4em;">@DateTimeFormat(pattern=”M/d/yy h:mm”) (org.springframework.annotations)</li>
<li style="line-height: 1.4em;">@Past (javax.validation.constraints.*)</li>
</ul>
</li>
<li style="line-height: 1.4em;">Declarative Scheduling<ul>
<li style="line-height: 1.4em;">@Async</li>
<li style="line-height: 1.4em;">@Scheduled (can repeated on a single method)</li>
</ul>
</li>
<li style="line-height: 1.4em;">java 8 Lambdas<ul>
<li style="line-height: 1.4em;">JdbcTemplate, JmsTemplate etc.</li>
</ul>
</li>
<li style="line-height: 1.4em;">Annotated MVC Controllers<ul>
<li style="line-height: 1.4em;">@PathVariable from @RequestMapping(value=”/path/{id}”)</li>
<li style="line-height: 1.4em;">@Valid -> bean validation</li>
</ul>
</li>
<li style="line-height: 1.4em;">STOMP on WebSocket: @SubscribeMapping</li>
<li style="line-height: 1.4em;">Annotated JMS Endpoints:<ul>
<li style="line-height: 1.4em;">@JmsListener</li>
<li style="line-height: 1.4em;">Messaging abstraction: org.springframework.messaging.Message</li>
</ul>
</li>
<li style="line-height: 1.4em;">Declarative Caching:<ul>
<li style="line-height: 1.4em;">use spring’s annotation (not in JEE yet)<ul>
<li style="line-height: 1.4em;">@CacheConfig</li>
<li style="line-height: 1.4em;">@Cacheable</li>
<li style="line-height: 1.4em;">@CachePut</li>
<li style="line-height: 1.4em;">@CacheEvict</li>
</ul>
</li>
<li style="line-height: 1.4em;"><em>or</em> JCache JSR-107 javax.cache.annotations.<ul>
<li style="line-height: 1.4em;">@CacheDefaults</li>
<li style="line-height: 1.4em;">@CacheResult</li>
<li style="line-height: 1.4em;">@CachePut</li>
<li style="line-height: 1.4em;">@CacheRemove</li>
</ul>
</li>
</ul>
</li>
</ul>
<div data-origin="<p>Demo: start.spring.io</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Demo: start.spring.io</div>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="api-design-with-java-8-lambda-and-streams"><a name="api-design-with-java-8-lambda-and-streams" href="#api-design-with-java-8-lambda-and-streams"></a>API Design With Java 8 Lambda and Streams</h4>" id="api-design-with-java-8-lambda-and-streams" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#api-design-with-java-8-lambda-and-streams" name="api-design-with-java-8-lambda-and-streams" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>API Design With Java 8 Lambda and Streams</h4>
<div data-origin="<p><strong>Stuart Marks / Brian Goetz</strong><br><em>API: “interface between software pieces” client / library</em></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Stuart Marks / Brian Goetz</strong><br style="clear: both;" /><em>API: “interface between software pieces” client / library</em></div>
<div data-origin="<p>history:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
history:</div>
<ul data-origin="<ul>
<li>java 5:<ul>
<li>generics (parameterized types)</li>
<li>annotations</li>
</ul>
</li>
<li>java 8 <ul>
<li>lambda</li>
<li>default methods</li>
<li>streams</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">java 5:<ul>
<li style="line-height: 1.4em;">generics (parameterized types)</li>
<li style="line-height: 1.4em;">annotations</li>
</ul>
</li>
<li style="line-height: 1.4em;">java 8<ul>
<li style="line-height: 1.4em;">lambda</li>
<li style="line-height: 1.4em;">default methods</li>
<li style="line-height: 1.4em;">streams</li>
</ul>
</li>
</ul>
<div data-origin="<p>lambda:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
lambda:</div>
<ul data-origin="<ul>
<li>pass behavior <ul>
<li>“functions as data”</li>
<li>replaces anon. inner classes</li>
</ul>
</li>
<li>subclassing vs functions-as-data<ul>
<li>“behavioral” patterns: Command, Iterator, Observer/Listener …</li>
<li>eg: <ul>
<li>Collection -> Array -> Streams.toArray(lambda)</li>
<li>Iterator -> forEach() (state on stack, one method call)</li>
<li>conditional execution (e.g. null elements) -> iilter()</li>
</ul>
</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">pass behavior<ul>
<li style="line-height: 1.4em;">“functions as data”</li>
<li style="line-height: 1.4em;">replaces anon. inner classes</li>
</ul>
</li>
<li style="line-height: 1.4em;">subclassing vs functions-as-data<ul>
<li style="line-height: 1.4em;">“behavioral” patterns: Command, Iterator, Observer/Listener …</li>
<li style="line-height: 1.4em;">eg:<ul>
<li style="line-height: 1.4em;">Collection -> Array -> Streams.toArray(lambda)</li>
<li style="line-height: 1.4em;">Iterator -> forEach() (state on stack, one method call)</li>
<li style="line-height: 1.4em;">conditional execution (e.g. null elements) -> iilter()</li>
</ul>
</li>
</ul>
</li>
</ul>
<div data-origin="<p>Function composition and High order functions</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Function composition and High order functions</div>
<ul data-origin="<ul>
<li>Collections.sort(List, Comparator) -> custom order with Comparator<ul>
<li>Collectins.sortBy<em>Type</em>() -> too many specialized methods -> method variation is not the correct solution</li>
<li>-> revisit Comparator:<ul>
<li>higher-order functions to make composing easy</li>
<li>Comparator.comparing(keyFunc)</li>
<li>Comparator.comparingInt</li>
<li>Comparator.thenComparing(): chain comparing</li>
</ul>
</li>
</ul>
</li>
<li>Composition / High-order functions are extremely powerful techniques! <ul>
<li>Java 8 + Lambda’s</li>
<li>Strategy / Command patterns</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Collections.sort(List, Comparator) -> custom order with Comparator<ul>
<li style="line-height: 1.4em;">Collectins.sortBy<em>Type</em>() -> too many specialized methods -> method variation is not the correct solution</li>
<li style="line-height: 1.4em;">-> revisit Comparator:<ul>
<li style="line-height: 1.4em;">higher-order functions to make composing easy</li>
<li style="line-height: 1.4em;">Comparator.comparing(keyFunc)</li>
<li style="line-height: 1.4em;">Comparator.comparingInt</li>
<li style="line-height: 1.4em;">Comparator.thenComparing(): chain comparing</li>
</ul>
</li>
</ul>
</li>
<li style="line-height: 1.4em;">Composition / High-order functions are extremely powerful techniques!<ul>
<li style="line-height: 1.4em;">Java 8 + Lambda’s</li>
<li style="line-height: 1.4em;">Strategy / Command patterns</li>
</ul>
</li>
</ul>
<div data-origin="<p>Default Methods</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Default Methods</div>
<ul data-origin="<ul>
<li>interface evolution</li>
<li>java 8: <ul>
<li>enable streams on collections</li>
<li>e.g; default remove() implementation on interface</li>
</ul>
</li>
<li>reduces pressure to get interface right from the beginning</li>
<li>don’t replace abstract classes<ul>
<li>no private/protected</li>
<li>no state</li>
<li>client vs subclasser interface distinction is difficult</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">interface evolution</li>
<li style="line-height: 1.4em;">java 8:<ul>
<li style="line-height: 1.4em;">enable streams on collections</li>
<li style="line-height: 1.4em;">e.g; default remove() implementation on interface</li>
</ul>
</li>
<li style="line-height: 1.4em;">reduces pressure to get interface right from the beginning</li>
<li style="line-height: 1.4em;">don’t replace abstract classes<ul>
<li style="line-height: 1.4em;">no private/protected</li>
<li style="line-height: 1.4em;">no state</li>
<li style="line-height: 1.4em;">client vs subclasser interface distinction is difficult</li>
</ul>
</li>
</ul>
<div data-origin="<p>Static methods on interfaces</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Static methods on interfaces</div>
<ul data-origin="<ul>
<li>less need for utility classes (e.g. Collections)</li>
<li>static factory methods: Comparator.comparing()</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">less need for utility classes (e.g. Collections)</li>
<li style="line-height: 1.4em;">static factory methods: Comparator.comparing()</li>
</ul>
<div data-origin="<p>Streams in APIs</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Streams in APIs</div>
<ul data-origin="<ul>
<li>aggregations of other things:<ul>
<li>historically: Collection<ul>
<li>defensive copy</li>
<li>performance issues</li>
</ul>
</li>
<li>java8: Stream<ul>
<li>lazy by default</li>
<li>avoid making defensive copies</li>
<li>no need for conversion</li>
<li>can be infinite</li>
<li><em>(use Collection is repeatable read is required)</em></li>
<li>client can filter(), collect(), findFirst() on Stream</li>
</ul>
</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">aggregations of other things:<ul>
<li style="line-height: 1.4em;">historically: Collection<ul>
<li style="line-height: 1.4em;">defensive copy</li>
<li style="line-height: 1.4em;">performance issues</li>
</ul>
</li>
<li style="line-height: 1.4em;">java8: Stream<ul>
<li style="line-height: 1.4em;">lazy by default</li>
<li style="line-height: 1.4em;">avoid making defensive copies</li>
<li style="line-height: 1.4em;">no need for conversion</li>
<li style="line-height: 1.4em;">can be infinite</li>
<li style="line-height: 1.4em;"><em>(use Collection is repeatable read is required)</em></li>
<li style="line-height: 1.4em;">client can filter(), collect(), findFirst() on Stream</li>
</ul>
</li>
</ul>
</li>
</ul>
<div data-origin="<p>Optional</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Optional</div>
<ul data-origin="<ul>
<li>wrapperclass: value is <em>present</em> or <em>empty</em></li>
<li>consider when a method can return null</li>
<li>reducess NullPointerExceptions</li>
<li>usages: min/max on empty input; find/search</li>
<li>orElse(), orElseThrow()</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">wrapperclass: value is <em>present</em> or <em>empty</em></li>
<li style="line-height: 1.4em;">consider when a method can return null</li>
<li style="line-height: 1.4em;">reducess NullPointerExceptions</li>
<li style="line-height: 1.4em;">usages: min/max on empty input; find/search</li>
<li style="line-height: 1.4em;">orElse(), orElseThrow()</li>
</ul>
<div data-origin="<p>Generics</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Generics</div>
<ul data-origin="<ul>
<li>type inference relies on generics</li>
<li>raw types give issues</li>
<li>use wildcards :-/</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">type inference relies on generics</li>
<li style="line-height: 1.4em;">raw types give issues</li>
<li style="line-height: 1.4em;">use wildcards :-/</li>
</ul>
<div data-origin="<p>others: </p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
others:</div>
<ul data-origin="<ul>
<li>deprecate/remove old stuff? “removing has almost only drawbacks”</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">deprecate/remove old stuff? “removing has almost only drawbacks”</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="don't-be-naked-in-front-of-javascript:-15-essential-tools-explained-in-15-minutes"><a name="don't-be-naked-in-front-of-javascript:-15-essential-tools-explained-in-15-minutes" href="#don't-be-naked-in-front-of-javascript:-15-essential-tools-explained-in-15-minutes"></a>Don’t be naked in front of JavaScript: 15 essential tools explained in 15 minutes</h4>" id="don't-be-naked-in-front-of-javascript:-15-essential-tools-explained-in-15-minutes" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#don't-be-naked-in-front-of-javascript:-15-essential-tools-explained-in-15-minutes" name="don't-be-naked-in-front-of-javascript:-15-essential-tools-explained-in-15-minutes" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Don’t be naked in front of JavaScript: 15 essential tools explained in 15 minutes</h4>
<div data-origin="<p><strong>Romain Linsolas</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Romain Linsolas</strong></div>
<ul data-origin="<ul>
<li>books: <ul>
<li>Javascript the good parts</li>
<li>Javascript definitive guide</li>
</ul>
</li>
<li>NodeJS: <ul>
<li>serverside; npm</li>
<li>Express: REST</li>
</ul>
</li>
<li>Yoeman: scafold project<ul>
<li><code>yo angular</code></li>
</ul>
</li>
<li>Bower: dependency mgmt</li>
<li>Grunt: task runner<ul>
<li>config over code</li>
<li>ant for javascript</li>
</ul>
</li>
<li>Gulp: Stream-besed build system <ul>
<li>code over config</li>
</ul>
</li>
<li>IntelliJ/ WebStorm</li>
<li>Jasmine: unit tests and functional tests</li>
<li>CasperJS: integration testing</li>
<li>Google Closure Compiler</li>
<li>SonarQube:<ul>
<li>coding rules</li>
<li>test coverage</li>
</ul>
</li>
<li>Batarang: Chrome extension<ul>
<li>Angular debugging / profiling</li>
<li>inspect scopes</li>
<li>watch perf.</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">books:<ul>
<li style="line-height: 1.4em;">Javascript the good parts</li>
<li style="line-height: 1.4em;">Javascript definitive guide</li>
</ul>
</li>
<li style="line-height: 1.4em;">NodeJS:<ul>
<li style="line-height: 1.4em;">serverside; npm</li>
<li style="line-height: 1.4em;">Express: REST</li>
</ul>
</li>
<li style="line-height: 1.4em;">Yoeman: scafold project<ul>
<li style="line-height: 1.4em;"><code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">yo angular</code></li>
</ul>
</li>
<li style="line-height: 1.4em;">Bower: dependency mgmt</li>
<li style="line-height: 1.4em;">Grunt: task runner<ul>
<li style="line-height: 1.4em;">config over code</li>
<li style="line-height: 1.4em;">ant for javascript</li>
</ul>
</li>
<li style="line-height: 1.4em;">Gulp: Stream-besed build system<ul>
<li style="line-height: 1.4em;">code over config</li>
</ul>
</li>
<li style="line-height: 1.4em;">IntelliJ/ WebStorm</li>
<li style="line-height: 1.4em;">Jasmine: unit tests and functional tests</li>
<li style="line-height: 1.4em;">CasperJS: integration testing</li>
<li style="line-height: 1.4em;">Google Closure Compiler</li>
<li style="line-height: 1.4em;">SonarQube:<ul>
<li style="line-height: 1.4em;">coding rules</li>
<li style="line-height: 1.4em;">test coverage</li>
</ul>
</li>
<li style="line-height: 1.4em;">Batarang: Chrome extension<ul>
<li style="line-height: 1.4em;">Angular debugging / profiling</li>
<li style="line-height: 1.4em;">inspect scopes</li>
<li style="line-height: 1.4em;">watch perf.</li>
</ul>
</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="java-8,-9-and-beyond---ask-the-experts"><a name="java-8,-9-and-beyond---ask-the-experts" href="#java-8,-9-and-beyond---ask-the-experts"></a>Java 8, 9 and beyond - Ask the Experts</h4>" id="java-8,-9-and-beyond---ask-the-experts" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#java-8,-9-and-beyond---ask-the-experts" name="java-8,-9-and-beyond---ask-the-experts" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Java 8, 9 and beyond - Ask the Experts</h4>
<div data-origin="<p><strong>Brian Goetz / Paul Sandoz / Stuart Marks</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Brian Goetz / Paul Sandoz / Stuart Marks</strong></div>
<ul data-origin="<ul>
<li>reified generics instead of erased genics: dificult with wildcards / complex within compiler -> address painpoints<ul>
<li>better type literals</li>
<li>arrays: immutable</li>
<li>arraylist of int</li>
</ul>
</li>
<li>jdk 9</li>
<li>parallelstreams by default -> start sequential, measure <ul>
<li>jmh: performance measurement <a href="http://openjdk.java.net/projects/code-tools/jmh/">http://openjdk.java.net/projects/code-tools/jmh/</a></li>
</ul>
</li>
<li>backwards compatibility: burden? -> “constraint”</li>
<li>checked exceptions: failed? part of the platform. <ul>
<li>difficult with generics</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">reified generics instead of erased genics: dificult with wildcards / complex within compiler -> address painpoints<ul>
<li style="line-height: 1.4em;">better type literals</li>
<li style="line-height: 1.4em;">arrays: immutable</li>
<li style="line-height: 1.4em;">arraylist of int</li>
</ul>
</li>
<li style="line-height: 1.4em;">jdk 9</li>
<li style="line-height: 1.4em;">parallelstreams by default -> start sequential, measure<ul>
<li style="line-height: 1.4em;">jmh: performance measurement<a href="http://openjdk.java.net/projects/code-tools/jmh/" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">http://openjdk.java.net/projects/code-tools/jmh/</a></li>
</ul>
</li>
<li style="line-height: 1.4em;">backwards compatibility: burden? -> “constraint”</li>
<li style="line-height: 1.4em;">checked exceptions: failed? part of the platform.<ul>
<li style="line-height: 1.4em;">difficult with generics</li>
</ul>
</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="3d-printing,-teaching-java-&-visual-programming"><a name="3d-printing,-teaching-java-&-visual-programming" href="#3d-printing,-teaching-java-&-visual-programming"></a>3D Printing, Teaching Java & Visual Programming</h4>" id="3d-printing,-teaching-java-&-visual-programming" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#3d-printing,-teaching-java-&-visual-programming" name="3d-printing,-teaching-java-&-visual-programming" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>3D Printing, Teaching Java & Visual Programming</h4>
<div data-origin="<p><strong>Michael Hoffer</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Michael Hoffer</strong></div>
<div data-origin="<p>3D Printing: plastic: layers of material ‘additive’ -prototyping (industry: remove layers)</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
3D Printing: plastic: layers of material ‘additive’ -prototyping (industry: remove layers)</div>
<div data-origin="<p>How to create 3D geometries? </p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
How to create 3D geometries?</div>
<ul data-origin="<ul>
<li>professional CAD</li>
<li>Blender (free) -> design</li>
<li>OpenSCAD</li>
<li>JCSG / JFXScad (Java libraries)<ul>
<li>Union, Diff, Intersection or Hull</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">professional CAD</li>
<li style="line-height: 1.4em;">Blender (free) -> design</li>
<li style="line-height: 1.4em;">OpenSCAD</li>
<li style="line-height: 1.4em;">JCSG / JFXScad (Java libraries)<ul>
<li style="line-height: 1.4em;">Union, Diff, Intersection or Hull</li>
</ul>
</li>
</ul>
<div data-origin="<p>VRL-Studio</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
VRL-Studio</div>
<ul data-origin="<ul>
<li>General purpose visual programming language</li>
<li>Automatic GUI gen</li>
<li>jar-file</li>
<li>JCSG Plugin -> 3d drawing<ul>
<li>save as STL file -> to printing software</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">General purpose visual programming language</li>
<li style="line-height: 1.4em;">Automatic GUI gen</li>
<li style="line-height: 1.4em;">jar-file</li>
<li style="line-height: 1.4em;">JCSG Plugin -> 3d drawing<ul>
<li style="line-height: 1.4em;">save as STL file -> to printing software</li>
</ul>
</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="pragmatic-functional-refactoring-with-java-8"><a name="pragmatic-functional-refactoring-with-java-8" href="#pragmatic-functional-refactoring-with-java-8"></a>Pragmatic Functional Refactoring with Java 8</h4>" id="pragmatic-functional-refactoring-with-java-8" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#pragmatic-functional-refactoring-with-java-8" name="pragmatic-functional-refactoring-with-java-8" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Pragmatic Functional Refactoring with Java 8</h4>
<div data-origin="<p><strong>Raoul-Gabriel Urma / Richard Warburton</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Raoul-Gabriel Urma / Richard Warburton</strong></div>
<div data-origin="<p>First-class Functions</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
First-class Functions</div>
<ul data-origin="<ul>
<li>classic: interface Predicate / implemented </li>
<li>java 8: <ul>
<li>method refs: this::myMethod()</li>
<li>lambdas</li>
</ul>
</li>
<li>composing functions<ul>
<li>java.util.function.Predicate -> test()<ul>
<li>has default methods e.g; or(), and() etc.</li>
</ul>
</li>
<li>function pipelines: java.util.function.Function<ul>
<li>andThen() chaining</li>
</ul>
</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">classic: interface Predicate / implemented</li>
<li style="line-height: 1.4em;">java 8:<ul>
<li style="line-height: 1.4em;">method refs: this::myMethod()</li>
<li style="line-height: 1.4em;">lambdas</li>
</ul>
</li>
<li style="line-height: 1.4em;">composing functions<ul>
<li style="line-height: 1.4em;">java.util.function.Predicate -> test()<ul>
<li style="line-height: 1.4em;">has default methods e.g; or(), and() etc.</li>
</ul>
</li>
<li style="line-height: 1.4em;">function pipelines: java.util.function.Function<ul>
<li style="line-height: 1.4em;">andThen() chaining</li>
</ul>
</li>
</ul>
</li>
</ul>
<div data-origin="<p>Currying</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Currying</div>
<ul data-origin="<ul>
<li>DoubleUnaryOperator class</li>
<li>partial application: using some arguments and returning a new function</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">DoubleUnaryOperator class</li>
<li style="line-height: 1.4em;">partial application: using some arguments and returning a new function</li>
</ul>
<div data-origin="<p>Immutability</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Immutability</div>
<ul data-origin="<ul>
<li>with<em>Xxxxx</em>() methods instead of setters that copy the object and return the modified version</li>
<li>copy objects to prevent racecondition issues with internal state</li>
<li>related<ul>
<li>domain driven design: immutable value types</li>
<li>tools: <ul>
<li>JSR-308: annotations </li>
<li>Mutability Detector</li>
<li>FindBugs @Immutable test</li>
</ul>
</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">with<em>Xxxxx</em>() methods instead of setters that copy the object and return the modified version</li>
<li style="line-height: 1.4em;">copy objects to prevent racecondition issues with internal state</li>
<li style="line-height: 1.4em;">related<ul>
<li style="line-height: 1.4em;">domain driven design: immutable value types</li>
<li style="line-height: 1.4em;">tools:<ul>
<li style="line-height: 1.4em;">JSR-308: annotations</li>
<li style="line-height: 1.4em;">Mutability Detector</li>
<li style="line-height: 1.4em;">FindBugs @Immutable test</li>
</ul>
</li>
</ul>
</li>
</ul>
<div data-origin="<p>Optional Data Types</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Optional Data Types</div>
<ul data-origin="<ul>
<li>NullPointerException protection</li>
<li>java.util.Optional<t><ul>
<li>single value container</li>
<li>excplicit modelling</li>
<li>must be actively unwrapped</li>
<li>construct: Optional.ofNullable(person);</li>
<li>Optional.flatMap(Person::getCar — can be chained -> return Optional value</li>
</ul>
</t></li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">NullPointerException protection</li>
<li style="line-height: 1.4em;">java.util.Optional<t><ul>
<li style="line-height: 1.4em;">single value container</li>
<li style="line-height: 1.4em;">excplicit modelling</li>
<li style="line-height: 1.4em;">must be actively unwrapped</li>
<li style="line-height: 1.4em;">construct: Optional.ofNullable(person);</li>
<li style="line-height: 1.4em;">Optional.flatMap(Person::getCar — can be chained -> return Optional value</li>
</ul>
</t></li>
</ul>
<div data-origin="<p>Books: </p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Books:</div>
<ul data-origin="<ul>
<li>Java 8 in Action</li>
<li>Java 8 Lambdas</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Java 8 in Action</li>
<li style="line-height: 1.4em;">Java 8 Lambdas</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h4 data-origin="<h4 id="evening-keynote:-infinite-possibilities"><a name="evening-keynote:-infinite-possibilities" href="#evening-keynote:-infinite-possibilities"></a>Evening Keynote: Infinite Possibilities</h4>" id="evening-keynote:-infinite-possibilities" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#evening-keynote:-infinite-possibilities" name="evening-keynote:-infinite-possibilities" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Evening Keynote: Infinite Possibilities</h4>
<div data-origin="<p><strong>Denise Jacobs</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Denise Jacobs</strong></div>
<ul data-origin="<ul>
<li>creativity</li>
<li>fixed (perfectionism) or growth mindset?</li>
<li>‘release tirany of the expert’</li>
<li>adopt a beginner’s mind</li>
<li>“flow”</li>
<li>make bug lists</li>
<li>choose bigger/creative problems to solve</li>
<li>‘culture of creativity’</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">creativity</li>
<li style="line-height: 1.4em;">fixed (perfectionism) or growth mindset?</li>
<li style="line-height: 1.4em;">‘release tirany of the expert’</li>
<li style="line-height: 1.4em;">adopt a beginner’s mind</li>
<li style="line-height: 1.4em;">“flow”</li>
<li style="line-height: 1.4em;">make bug lists</li>
<li style="line-height: 1.4em;">choose bigger/creative problems to solve</li>
<li style="line-height: 1.4em;">‘culture of creativity’</li>
</ul>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-75619219433985223562014-11-12T19:18:00.000+01:002014-11-13T19:49:57.490+01:00Devoxx 2014: Conference day 1 Notes (12/11/2014)<h3 data-origin="<h3 id="keynote"><a name="keynote" href="#keynote"></a>keynote</h3>" id="keynote" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#keynote" name="keynote" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>keynote</h3>
<h4 data-origin="<h4 id="jboss"><a name="jboss" href="#jboss"></a>jboss</h4>" id="jboss" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#jboss" name="jboss" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>jboss</h4>
<ul data-origin="<ul>
<li>containers</li>
<li>microservices</li>
<li>“Camel”</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">containers</li>
<li style="line-height: 1.4em;">microservices</li>
<li style="line-height: 1.4em;">“Camel”</li>
</ul>
<h4 data-origin="<h4 id="oracle"><a name="oracle" href="#oracle"></a>oracle</h4>" id="oracle" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.4em; margin-bottom: 0.66em; margin-left: 0px; margin-right: 0px; margin-top: 0.99em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#oracle" name="oracle" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>oracle</h4>
<ul data-origin="<ul>
<li>20 years java (1995)</li>
<li>java 8 Brian Goetz<ul>
<li>lamba’s</li>
<li>stream() / parallelStream() (List / Hashset api)</li>
<li>default methods</li>
</ul>
</li>
<li>next <ul>
<li>—> jigsaw module system<ul>
<li>small devices (compact profile)</li>
<li>security mechs</li>
<li>startup performance</li>
<li>blocked usage of sun*internal stuff</li>
<li>part of openjdk</li>
</ul>
</li>
<li>Poject Valhalla <ul>
<li>cache misses / align curren tmemory</li>
<li>sepcialized generics</li>
<li>value types</li>
<li>var handles</li>
</ul>
</li>
<li>Project Panama</li>
</ul>
</li>
<li>IoT Jasper Potters</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">20 years java (1995)</li>
<li style="line-height: 1.4em;">java 8 Brian Goetz<ul>
<li style="line-height: 1.4em;">lamba’s</li>
<li style="line-height: 1.4em;">stream() / parallelStream() (List / Hashset api)</li>
<li style="line-height: 1.4em;">default methods</li>
</ul>
</li>
<li style="line-height: 1.4em;">next<ul>
<li style="line-height: 1.4em;">—> jigsaw module system<ul>
<li style="line-height: 1.4em;">small devices (compact profile)</li>
<li style="line-height: 1.4em;">security mechs</li>
<li style="line-height: 1.4em;">startup performance</li>
<li style="line-height: 1.4em;">blocked usage of sun*internal stuff</li>
<li style="line-height: 1.4em;">part of openjdk</li>
</ul>
</li>
<li style="line-height: 1.4em;">Poject Valhalla<ul>
<li style="line-height: 1.4em;">cache misses / align curren tmemory</li>
<li style="line-height: 1.4em;">sepcialized generics</li>
<li style="line-height: 1.4em;">value types</li>
<li style="line-height: 1.4em;">var handles</li>
</ul>
</li>
<li style="line-height: 1.4em;">Project Panama</li>
</ul>
</li>
<li style="line-height: 1.4em;">IoT Jasper Potters</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h3 data-origin="<h3 id="devoxx-2014:-pico-services-with-java-ee-7-on-java-8-and-docker"><a name="devoxx-2014:-pico-services-with-java-ee-7-on-java-8-and-docker" href="#devoxx-2014:-pico-services-with-java-ee-7-on-java-8-and-docker"></a>Devoxx 2014: Pico Services with Java EE 7 on Java 8 and Docker</h3>" id="devoxx-2014:-pico-services-with-java-ee-7-on-java-8-and-docker" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#devoxx-2014:-pico-services-with-java-ee-7-on-java-8-and-docker" name="devoxx-2014:-pico-services-with-java-ee-7-on-java-8-and-docker" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Devoxx 2014: Pico Services with Java EE 7 on Java 8 and Docker</h3>
<div data-origin="<p><strong>Adam Bien</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Adam Bien</strong></div>
<div data-origin="<p>base concepts:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
base concepts:</div>
<ul data-origin="<ul>
<li>JAX-RS</li>
<li>@Inject</li>
<li>Business component: Boundary Control Entity pattern</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">JAX-RS</li>
<li style="line-height: 1.4em;">@Inject</li>
<li style="line-height: 1.4em;">Business component: Boundary Control Entity pattern</li>
</ul>
<div data-origin="<p>setup demo</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
setup demo</div>
<ul data-origin="<ul>
<li>netbeans</li>
<li>glassfish v4</li>
<li>simple pom.xml: javax / javaee-api 7.0</li>
<li>JAX-RS</li>
<li>@Stateless EJB (bean.xml in JEE6)</li>
<li>docker:<ul>
<li>test environment</li>
<li>expose ports</li>
<li>jenkins in docker</li>
<li>“ambassador pattern” -> used for real data</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">netbeans</li>
<li style="line-height: 1.4em;">glassfish v4</li>
<li style="line-height: 1.4em;">simple pom.xml: javax / javaee-api 7.0</li>
<li style="line-height: 1.4em;">JAX-RS</li>
<li style="line-height: 1.4em;">@Stateless EJB (bean.xml in JEE6)</li>
<li style="line-height: 1.4em;">docker:<ul>
<li style="line-height: 1.4em;">test environment</li>
<li style="line-height: 1.4em;">expose ports</li>
<li style="line-height: 1.4em;">jenkins in docker</li>
<li style="line-height: 1.4em;">“ambassador pattern” -> used for real data</li>
</ul>
</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h3 data-origin="<h3 id="60-useful-linux-commands-in-15-minutes"><a name="60-useful-linux-commands-in-15-minutes" href="#60-useful-linux-commands-in-15-minutes"></a>60 useful Linux commands in 15 minutes</h3>" id="60-useful-linux-commands-in-15-minutes" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#60-useful-linux-commands-in-15-minutes" name="60-useful-linux-commands-in-15-minutes" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>60 useful Linux commands in 15 minutes</h3>
<div data-origin="<p><strong>Pierre-Antoine Grégoire</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Pierre-Antoine Grégoire</strong></div>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h3 data-origin="<h3 id="sparky-guide-to-bug-free-javascript"><a name="sparky-guide-to-bug-free-javascript" href="#sparky-guide-to-bug-free-javascript"></a>Sparky guide to bug-free JavaScript</h3>" id="sparky-guide-to-bug-free-javascript" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#sparky-guide-to-bug-free-javascript" name="sparky-guide-to-bug-free-javascript" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Sparky guide to bug-free JavaScript</h3>
<div data-origin="<p><strong>Mite Mitreski</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Mite Mitreski</strong></div>
<ul data-origin="<ul>
<li><code>debugger;</code> statement: force debugger</li>
<li><code>console.table</code> clean format in console</li>
<li><code>console.trace</code> + <code>Objects.observe</code> who changed object?</li>
<li>async debug (full stactrace) async </li>
<li>DOM mutation Observer</li>
<li>log with google analytics <code>gaq.push()</code> :-/</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;"><code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">debugger;</code> statement: force debugger</li>
<li style="line-height: 1.4em;"><code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">console.table</code> clean format in console</li>
<li style="line-height: 1.4em;"><code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">console.trace</code> + <code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">Objects.observe</code> who changed object?</li>
<li style="line-height: 1.4em;">async debug (full stactrace) async</li>
<li style="line-height: 1.4em;">DOM mutation Observer</li>
<li style="line-height: 1.4em;">log with google analytics <code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">gaq.push()</code> :-/</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h3 data-origin="<h3 id="let's-get-physical:-i/o-programming-with-java-on-the-raspberry-pi-using-pi4j"><a name="let's-get-physical:-i/o-programming-with-java-on-the-raspberry-pi-using-pi4j" href="#let's-get-physical:-i/o-programming-with-java-on-the-raspberry-pi-using-pi4j"></a>Let’s Get Physical: I/O Programming with Java on the Raspberry Pi using Pi4J</h3>" id="let's-get-physical:-i/o-programming-with-java-on-the-raspberry-pi-using-pi4j" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#let's-get-physical:-i/o-programming-with-java-on-the-raspberry-pi-using-pi4j" name="let's-get-physical:-i/o-programming-with-java-on-the-raspberry-pi-using-pi4j" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Let’s Get Physical: I/O Programming with Java on the Raspberry Pi using Pi4J</h3>
<div data-origin="<p><strong>Robert Savage</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Robert Savage</strong></div>
<ul data-origin="<ul>
<li>Pi4j: <ul>
<li>open source / Low level IO</li>
<li>event based</li>
<li>java + JNI (C)</li>
</ul>
</li>
<li>IO interfaces<ul>
<li>digital interfaceGPIO/ PWM</li>
<li>data UART, serial, SPI, I²C</li>
<li>analog interfaces: extra hardware</li>
</ul>
</li>
<li>models<ul>
<li>a/b: 21 GPIO</li>
<li>b+ 28 GPIO</li>
<li>compute module: 46</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">Pi4j:<ul>
<li style="line-height: 1.4em;">open source / Low level IO</li>
<li style="line-height: 1.4em;">event based</li>
<li style="line-height: 1.4em;">java + JNI (C)</li>
</ul>
</li>
<li style="line-height: 1.4em;">IO interfaces<ul>
<li style="line-height: 1.4em;">digital interfaceGPIO/ PWM</li>
<li style="line-height: 1.4em;">data UART, serial, SPI, I²C</li>
<li style="line-height: 1.4em;">analog interfaces: extra hardware</li>
</ul>
</li>
<li style="line-height: 1.4em;">models<ul>
<li style="line-height: 1.4em;">a/b: 21 GPIO</li>
<li style="line-height: 1.4em;">b+ 28 GPIO</li>
<li style="line-height: 1.4em;">compute module: 46</li>
</ul>
</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h3 data-origin="<h3 id="spotify---audio-delivery-at-scale"><a name="spotify---audio-delivery-at-scale" href="#spotify---audio-delivery-at-scale"></a>Spotify - audio delivery at scale</h3>" id="spotify---audio-delivery-at-scale" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#spotify---audio-delivery-at-scale" name="spotify---audio-delivery-at-scale" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Spotify - audio delivery at scale</h3>
<div data-origin="<p><strong>Niklas Gustavsson</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Niklas Gustavsson</strong></div>
<ul data-origin="<ul>
<li>commoditiy servers<ul>
<li>high availibility, robustnest</li>
<li>colocated</li>
</ul>
</li>
<li>backend services<ul>
<li>‘atomic’</li>
<li>self-executing jar</li>
<li>wired toghether with propriatary protocol (zeromq-based)</li>
</ul>
</li>
<li>clients: keep socket open </li>
<li>Service Discovery: DNS records</li>
<li>robustnest / scalability: <ul>
<li>storage: Cassandra</li>
</ul>
</li>
<li>teams <ul>
<li>autonomuous org.</li>
<li>general principles / rules (programming language etc.) </li>
</ul>
</li>
<li>content distribution<ul>
<li>attempt to do local caching (depends on device)</li>
<li>“storage resolve” service -> file location</li>
<li>CDN’s<ul>
<li>audio-files are not really ‘standard’ content for CDN’s</li>
<li>multiple providers</li>
<li>performance is correlated with amount of data served from CDN</li>
</ul>
</li>
</ul>
</li>
<li>measure!<ul>
<li>latency</li>
<li>buffering</li>
</ul>
</li>
<li>others:<ul>
<li>no p2p</li>
<li>only desktop clients (battery / bandwidth constraints)</li>
<li>prefetching</li>
<li>head files: first few seconds (unencrypted on CDN)</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">commoditiy servers<ul>
<li style="line-height: 1.4em;">high availibility, robustnest</li>
<li style="line-height: 1.4em;">colocated</li>
</ul>
</li>
<li style="line-height: 1.4em;">backend services<ul>
<li style="line-height: 1.4em;">‘atomic’</li>
<li style="line-height: 1.4em;">self-executing jar</li>
<li style="line-height: 1.4em;">wired toghether with propriatary protocol (zeromq-based)</li>
</ul>
</li>
<li style="line-height: 1.4em;">clients: keep socket open</li>
<li style="line-height: 1.4em;">Service Discovery: DNS records</li>
<li style="line-height: 1.4em;">robustnest / scalability:<ul>
<li style="line-height: 1.4em;">storage: Cassandra</li>
</ul>
</li>
<li style="line-height: 1.4em;">teams<ul>
<li style="line-height: 1.4em;">autonomuous org.</li>
<li style="line-height: 1.4em;">general principles / rules (programming language etc.)</li>
</ul>
</li>
<li style="line-height: 1.4em;">content distribution<ul>
<li style="line-height: 1.4em;">attempt to do local caching (depends on device)</li>
<li style="line-height: 1.4em;">“storage resolve” service -> file location</li>
<li style="line-height: 1.4em;">CDN’s<ul>
<li style="line-height: 1.4em;">audio-files are not really ‘standard’ content for CDN’s</li>
<li style="line-height: 1.4em;">multiple providers</li>
<li style="line-height: 1.4em;">performance is correlated with amount of data served from CDN</li>
</ul>
</li>
</ul>
</li>
<li style="line-height: 1.4em;">measure!<ul>
<li style="line-height: 1.4em;">latency</li>
<li style="line-height: 1.4em;">buffering</li>
</ul>
</li>
<li style="line-height: 1.4em;">others:<ul>
<li style="line-height: 1.4em;">no p2p</li>
<li style="line-height: 1.4em;">only desktop clients (battery / bandwidth constraints)</li>
<li style="line-height: 1.4em;">prefetching</li>
<li style="line-height: 1.4em;">head files: first few seconds (unencrypted on CDN)</li>
</ul>
</li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h3 data-origin="<h3 id="concurrency-in-enterprise-java"><a name="concurrency-in-enterprise-java" href="#concurrency-in-enterprise-java"></a>Concurrency in Enterprise Java</h3>" id="concurrency-in-enterprise-java" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#concurrency-in-enterprise-java" name="concurrency-in-enterprise-java" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Concurrency in Enterprise Java</h3>
<div data-origin="<p><strong>Alexander Heusingfeld</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Alexander Heusingfeld</strong></div>
<div data-origin="<p>Java SE 5 classic Thread -> java.util.concurrent</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Java SE 5 classic Thread -> java.util.concurrent</div>
<ul data-origin="<ul>
<li>ExecutorServices</li>
<li>no trx’s </li>
<li>etc.</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">ExecutorServices</li>
<li style="line-height: 1.4em;">no trx’s</li>
<li style="line-height: 1.4em;">etc.</li>
</ul>
<div data-origin="<p>patterns of software stability</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
patterns of software stability</div>
<ul data-origin="<ul>
<li>timeouts</li>
<li>bulkheads: separate app components</li>
<li>curcuit breaker: failfast on thread starvation</li>
<li>steady state: free unused resources</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">timeouts</li>
<li style="line-height: 1.4em;">bulkheads: separate app components</li>
<li style="line-height: 1.4em;">curcuit breaker: failfast on thread starvation</li>
<li style="line-height: 1.4em;">steady state: free unused resources</li>
</ul>
<div data-origin="<p>JSR 236: javax.enterprise.concurrent</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
JSR 236: javax.enterprise.concurrent</div>
<ul data-origin="<ul>
<li>containermanaged threads</li>
<li>ManagedThreadFactory<ul>
<li>extends ThreadFactory from SE</li>
<li>ManageableThread</li>
<li>use ExecutorServices from SE</li>
<li>fork/join pool not supported</li>
</ul>
</li>
<li>ManagedExecutorService<ul>
<li>jndi lookup</li>
<li>lifecycle api’s disabled</li>
<li>List <future<object>>executor.invokeAll()</future<object></li>
</ul>
</li>
<li>ManagedScheduledExecutorService<ul>
<li>schedule tasks with trigger (e.g. executor.scheduleAtFixedRate())</li>
</ul>
</li>
<li>ContextService</li>
<li>ManagedTaskListener -> event management<ul>
<li>ManagedExecutors class</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">containermanaged threads</li>
<li style="line-height: 1.4em;">ManagedThreadFactory<ul>
<li style="line-height: 1.4em;">extends ThreadFactory from SE</li>
<li style="line-height: 1.4em;">ManageableThread</li>
<li style="line-height: 1.4em;">use ExecutorServices from SE</li>
<li style="line-height: 1.4em;">fork/join pool not supported</li>
</ul>
</li>
<li style="line-height: 1.4em;">ManagedExecutorService<ul>
<li style="line-height: 1.4em;">jndi lookup</li>
<li style="line-height: 1.4em;">lifecycle api’s disabled</li>
<li style="line-height: 1.4em;">List <future object="">>executor.invokeAll()</future></li>
</ul>
</li>
<li style="line-height: 1.4em;">ManagedScheduledExecutorService<ul>
<li style="line-height: 1.4em;">schedule tasks with trigger (e.g. executor.scheduleAtFixedRate())</li>
</ul>
</li>
<li style="line-height: 1.4em;">ContextService</li>
<li style="line-height: 1.4em;">ManagedTaskListener -> event management<ul>
<li style="line-height: 1.4em;">ManagedExecutors class</li>
</ul>
</li>
</ul>
<div data-origin="<p>runtime remarks:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
runtime remarks:</div>
<ul data-origin="<ul>
<li>wildfly (JBoss): special commanline options</li>
<li>some gotcha’s as this is new technology<ul>
<li>check RejectionPolicy</li>
<li>Java 8 Streams API (parallelStream -> uses ForkJoinPool internally, not compatible with ManagedThreads)</li>
</ul>
</li>
<li>running on < Java8: Guava — ListeningExecutorService -> Callbacks</li>
<li>Netflix Hystrix: stability patterns (e.g. Circuit-Breaker)<ul>
<li>custom threadpool</li>
<li>hystrix.plugin.HystrixConcurrencyStrategy</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">wildfly (JBoss): special commanline options</li>
<li style="line-height: 1.4em;">some gotcha’s as this is new technology<ul>
<li style="line-height: 1.4em;">check RejectionPolicy</li>
<li style="line-height: 1.4em;">Java 8 Streams API (parallelStream -> uses ForkJoinPool internally, not compatible with ManagedThreads)</li>
</ul>
</li>
<li style="line-height: 1.4em;">running on < Java8: Guava — ListeningExecutorService -> Callbacks</li>
<li style="line-height: 1.4em;">Netflix Hystrix: stability patterns (e.g. Circuit-Breaker)<ul>
<li style="line-height: 1.4em;">custom threadpool</li>
<li style="line-height: 1.4em;">hystrix.plugin.HystrixConcurrencyStrategy</li>
</ul>
</li>
</ul>
<div data-origin="<p>Summary JSR 236:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Summary JSR 236:</div>
<ul data-origin="<ul>
<li>good mix of convenience /stability</li>
<li>potential for optimisations<ul>
<li>incompat. with ForkJoinPool</li>
<li>Runtime.availableProcessors()</li>
</ul>
</li>
<li>see <a href="https://github.com/jee-samples/javaee7-samples">https://github.com/jee-samples/javaee7-samples</a> </li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">good mix of convenience /stability</li>
<li style="line-height: 1.4em;">potential for optimisations<ul>
<li style="line-height: 1.4em;">incompat. with ForkJoinPool</li>
<li style="line-height: 1.4em;">Runtime.availableProcessors()</li>
</ul>
</li>
<li style="line-height: 1.4em;">see <a href="https://github.com/jee-samples/javaee7-samples" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://github.com/jee-samples/javaee7-samples</a></li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h3 data-origin="<h3 id="predictability-and-performance"><a name="predictability-and-performance" href="#predictability-and-performance"></a>Predictability and Performance</h3>" id="predictability-and-performance" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#predictability-and-performance" name="predictability-and-performance" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>Predictability and Performance</h3>
<div data-origin="<p><strong>Richard Warburton</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Richard Warburton</strong></div>
<div data-origin="<p><em>“be predictable”</em></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
<em>“be predictable”</em></div>
<div data-origin="<p>Branch prediction:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Branch prediction:</div>
<ul data-origin="<ul>
<li>cpu-cycles: fetch, decode, exec, writeback </li>
<li>branch -> stall -> predict<ul>
<li>static: no dynamic data considered<ul>
<li>forward: not taken</li>
<li>backware: taken</li>
</ul>
</li>
<li>local / global</li>
<li>performance event counters: <ul>
<li>specific registers -> can store prediction info </li>
</ul>
</li>
</ul>
</li>
<li>demo <code>time perf java ...</code></li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">cpu-cycles: fetch, decode, exec, writeback</li>
<li style="line-height: 1.4em;">branch -> stall -> predict<ul>
<li style="line-height: 1.4em;">static: no dynamic data considered<ul>
<li style="line-height: 1.4em;">forward: not taken</li>
<li style="line-height: 1.4em;">backware: taken</li>
</ul>
</li>
<li style="line-height: 1.4em;">local / global</li>
<li style="line-height: 1.4em;">performance event counters:<ul>
<li style="line-height: 1.4em;">specific registers -> can store prediction info</li>
</ul>
</li>
</ul>
</li>
<li style="line-height: 1.4em;">demo <code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">time perf java ...</code></li>
</ul>
<div data-origin="<p>Locality</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Locality</div>
<ul data-origin="<ul>
<li>arrays -> strides</li>
<li>good data layout principles<ul>
<li>primitive collections: HPPC, FastUtil, GNU Trove)</li>
<li>arrays instead of linked lists</li>
<li>hashtable instead of tree</li>
<li>custom data-structures: judy arrays, kD-Trees, Z-Order Curves</li>
</ul>
</li>
<li>java heap layout issues: no location guarantee (GC etc)<ul>
<li>off heap structures (libraries)</li>
</ul>
</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">arrays -> strides</li>
<li style="line-height: 1.4em;">good data layout principles<ul>
<li style="line-height: 1.4em;">primitive collections: HPPC, FastUtil, GNU Trove)</li>
<li style="line-height: 1.4em;">arrays instead of linked lists</li>
<li style="line-height: 1.4em;">hashtable instead of tree</li>
<li style="line-height: 1.4em;">custom data-structures: judy arrays, kD-Trees, Z-Order Curves</li>
</ul>
</li>
<li style="line-height: 1.4em;">java heap layout issues: no location guarantee (GC etc)<ul>
<li style="line-height: 1.4em;">off heap structures (libraries)</li>
</ul>
</li>
</ul>
<div data-origin="<p>Storage</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
Storage</div>
<ul data-origin="<ul>
<li>seeking vs sequential reads</li>
<li>fragmentation: preallocate</li>
<li>sector misalignment: offset logical vs physical sector</li>
<li><code>iotop</code></li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">seeking vs sequential reads</li>
<li style="line-height: 1.4em;">fragmentation: preallocate</li>
<li style="line-height: 1.4em;">sector misalignment: offset logical vs physical sector</li>
<li style="line-height: 1.4em;"><code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">iotop</code></li>
</ul>
<hr class="section" data-origin="<hr class="section">" style="background-color: white; border-bottom-color: rgb(230, 230, 230); border-bottom-style: solid; border-image: initial; border-left-color: rgb(230, 230, 230); border-left-style: solid; border-right-color: rgb(230, 230, 230); border-right-style: solid; border-top-color: rgb(230, 230, 230); border-top-style: solid; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;" />
<h3 data-origin="<h3 id="the-end-of-traditional-enterprise-it"><a name="the-end-of-traditional-enterprise-it" href="#the-end-of-traditional-enterprise-it"></a>The end of traditional enterprise IT</h3>" id="the-end-of-traditional-enterprise-it" style="background-color: white; clear: both; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 1.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.125em;">
<a href="https://www.blogger.com/blogger.g?blogID=6922719475190616477#the-end-of-traditional-enterprise-it" name="the-end-of-traditional-enterprise-it" style="color: #3269a0; text-decoration: none; vertical-align: baseline;"></a>The end of traditional enterprise IT</h3>
<div data-origin="<p><strong>Ron Van Kemenade (CIO ING group)</strong></p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
<strong>Ron Van Kemenade (CIO ING group)</strong></div>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0tag:blogger.com,1999:blog-6922719475190616477.post-12196053023313026992014-10-16T22:28:00.000+02:002014-10-17T06:47:04.508+02:00Electricity Metering with Flukso<div data-origin="<p>For over 2 years now, I’m monitoring my photovoltaic panels with the sma-bluetooth application running on a Tonido2 plug-computer (<a href="http://michael-peeters.blogspot.be/2012/04/sb-inverter-bluetooth-connection-on.html">http://michael-peeters.blogspot.be/2012/04/sb-inverter-bluetooth-connection-on.html</a>). The data is sent every 10 minutes to the excellent pvoutput.org site where it can be viewed directly from a browser or through an Android app. This setup is running surprinsingly stable for more than 2 years now. </p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; word-wrap: break-word;">
For over 2 years now, I’m monitoring my photovoltaic panels with the sma-bluetooth application running on a Tonido2 plug-computer (<a href="http://michael-peeters.blogspot.be/2012/04/sb-inverter-bluetooth-connection-on.html" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">http://michael-peeters.blogspot.be/2012/04/sb-inverter-bluetooth-connection-on.html</a>). The data is sent every 10 minutes to the excellent pvoutput.org site where it can be viewed directly from a browser or through an Android app. This setup is running surprinsingly stable for more than 2 years now.</div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz8VEEFzezjQLbEvh3mnKW3ynK4Oqtk9uUMF5RtwslbLxphGPDQ_PWv4U1OXkrLg9FolcdfKCS1Y-1W2U1AvTLFxNk_mapcTaVRaK9vokhGz8im7KCjfGgFiibIFubB0hXZz0Cb95xu6TP/s1600/IMG_20141014_152807223.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz8VEEFzezjQLbEvh3mnKW3ynK4Oqtk9uUMF5RtwslbLxphGPDQ_PWv4U1OXkrLg9FolcdfKCS1Y-1W2U1AvTLFxNk_mapcTaVRaK9vokhGz8im7KCjfGgFiibIFubB0hXZz0Cb95xu6TP/s1600/IMG_20141014_152807223.jpg" height="178" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Flukso device wired up with 4 sensors (water, gas,<br />
electricity consumption and production)</td></tr>
</tbody></table>
<div data-origin="<p>I was looking for a cost-efficient way to also monitor my electricity consumption. After some research I discovered the flukso device (<a href="https://www.flukso.net/about">https://www.flukso.net/about</a>). It is a cheap device from a company in Leuven (Belgium) that allows to monitor electricity through current clamps and / or by counting signals on pulse ports. The flukso device itself is opensource and based on openwrt (<a href="https://openwrt.org/">https://openwrt.org/</a>). Besides energy consumption, it’s also possible to measure (solar) energy production. In addition, it has support for measuring water and gas consumption. </p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
I was looking for a cost-efficient way to also monitor my electricity consumption. After some research I discovered the flukso device (<a href="https://www.flukso.net/about" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://www.flukso.net/about</a>). It is a cheap device from a company in Leuven (Belgium) that allows to monitor electricity through current clamps and / or by counting signals on pulse ports. The flukso device itself is opensource and based on openwrt (<a href="https://openwrt.org/" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://openwrt.org/</a>). Besides energy consumption, it’s also possible to measure (solar) energy production. In addition, it has support for measuring water and gas consumption. <span style="font-size: 15px;">The Flukso also comes with a free webservice to monitor your energy usage at all times.</span></div>
<div data-origin="<p>The Flukso device is well-thought but requires some DIY skills, research and careful preparation as not all setups are compatible. Here are some findings / considerations when using the device:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
The Flukso device is well-thought but requires some DIY skills, research and careful preparation as not all setups are compatible. Here are some findings / considerations when using the device:</div>
<ul data-origin="<ul>
<li>I bought the FLM02<strong>B</strong> version as it has support for 4 pulse ports. This allows me to monitor 4 different things: electricity production (solar panels), electricity consumption (3 phases), water and gas. If you don’t need all the extra meterings possibilities, the FLM02A might be enough for you.</li>
<li>As an alternative to measuring your power consumption with power clamps, you might consider buying a cheap DIN power meter with an S0 port. Before buying a DIN consumption meter check out if the pulse/kWh rate is supported by Flukso (1000 pulses/kWh works best). In my case, the power meter turned out to be cheaper than buying the 3 powerclamps — although I got the insight a bit late :-). You can also ask for the lastest alpha-version of the firmware to overcome some issues with other pulse/kWh rates (see <a href="https://www.flukso.net/content/3-phase-not-measuring-correctly?page=1">https://www.flukso.net/content/3-phase-not-measuring-correctly?page=1</a>).</li>
<li>Checkout if your solar power meter has a S0 port. I only had to wire up the “Carlo Gavazzi 2 kWh” S0 port to my flukso. (<a href="http://www.carlogavazzisales.com/pdfs/EM10-DIN_Datasheet.pdf">http://www.carlogavazzisales.com/pdfs/EM10-DIN_Datasheet.pdf</a>)</li>
<li>Check out that your installation can separate consumption from generation. Although this seems obvious, my solar power was injected “somewhere” in the breaker panel, making it impossible to monitor consumption only. After some rewiring of the breaker board by an electrician and installing the electricity meter, everything went fine (see: <a href="https://www.flukso.net/content/seperating-household-consumption-and-generated-power">https://www.flukso.net/content/seperating-household-consumption-and-generated-power</a>). </li>
<li>I’m using an ethernet cable to transfer the Pulse-signals from my water and gas meters. Although I had some hesitations, this did work fine in my case over a distance of 10-15m. (see <a href="https://www.flukso.net/content/maximum-pulse-wire-length-and-wire-used">https://www.flukso.net/content/maximum-pulse-wire-length-and-wire-used</a>)</li>
<li>I had some trouble with the gas sensor. By bending the cable and pushing the sensor upwards, everything worked OK <a href="https://www.flukso.net/content/elster-bk-g4m-positioning-sensor">https://www.flukso.net/content/elster-bk-g4m-positioning-sensor</a>).</li>
<li>The ‘shop’ pages contain the right constant values for the water and gas sensors; I’m having the exact same models as depicted: <a href="https://www.flukso.net/content/water-probe">https://www.flukso.net/content/water-probe</a> and <a href="https://www.flukso.net/content/gas-probe">https://www.flukso.net/content/gas-probe</a> </li>
<li>by default, the locale web-console only accepts connections over the ethernet port, not over Wifi. This is a security feature, but it can be changed if you wish. See <a href="https://www.flukso.net/content/access-flm-wireless-interface">https://www.flukso.net/content/access-flm-wireless-interface</a> to enable it: ssh root@ip.to.flukso (password: root)<pre><code class="sh hljs" data-origin="<pre><code class="sh">uci set firewall.@zone[1].input=ACCEPT
uci commit
/etc/init.d/firewall reload
</code></pre>">uci <span class="hljs-keyword">set</span> firewall.@zone[<span class="hljs-number">1</span>].input=ACCEPT
uci commit
/etc/init.d/firewall reload
</code></pre>
You can also change the password with <code>passwd</code></li>
<li>with ssh, you can access the syslog with <code>logread</code> and <code>logread -f</code> — <a href="http://www.xinotes.net/notes/note/1510/">http://www.xinotes.net/notes/note/1510/</a></li>
<li>I had a few issues with unreliable connections. After some trial and error, it turned out to be simply a matter of correctly connecting all cables :).</li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;">I bought the FLM02<strong>B</strong> version as it has support for 4 pulse ports. This allows me to monitor 4 different things: electricity production (solar panels), electricity consumption (3 phases), water and gas. If you don’t need all the extra meterings possibilities, the FLM02A might be enough for you.</li>
<li style="line-height: 1.4em;">As an alternative to measuring your power consumption with power clamps, you <table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaCErf2Y7JFdrwq0wJJA-uyS57mj5UlWijeHzXLGWrsUV-0oEIbIhxsC2k9iqx9uO1V3SNHpjmR6htPCyCaKmIBEZsNd-HoIf7hLHjkFsk2wrldQN1em9y1uW_bnQ1L60VGScJNy1uXt9G/s1600/IMG_20141014_152756671.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaCErf2Y7JFdrwq0wJJA-uyS57mj5UlWijeHzXLGWrsUV-0oEIbIhxsC2k9iqx9uO1V3SNHpjmR6htPCyCaKmIBEZsNd-HoIf7hLHjkFsk2wrldQN1em9y1uW_bnQ1L60VGScJNy1uXt9G/s1600/IMG_20141014_152756671.jpg" height="178" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Flukso device connected to power consumption <br />
and production meters</td></tr>
</tbody></table>
might consider buying a cheap DIN power meter with an S0 port. Before buying a DIN consumption meter check out if the pulse/kWh rate is supported by Flukso (1000 pulses/kWh works best). In my case, the power meter turned out to be cheaper than buying the 3 powerclamps — although I got the insight a bit late :-). You can also ask for the lastest alpha-version of the firmware to overcome some issues with other pulse/kWh rates (see <a href="https://www.flukso.net/content/3-phase-not-measuring-correctly?page=1" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://www.flukso.net/content/3-phase-not-measuring-correctly?page=1</a>).</li>
<li style="line-height: 1.4em;">Checkout if your solar power meter has a S0 port. I only had to wire up the “Carlo Gavazzi 2 kWh” S0 port to my flukso. (<a href="http://www.carlogavazzisales.com/pdfs/EM10-DIN_Datasheet.pdf" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">http://www.carlogavazzisales.com/pdfs/EM10-DIN_Datasheet.pdf</a>)</li>
<li style="line-height: 1.4em;">Check out if your installation can correctly separate consumption from generation. Although this seems obvious, my solar power was injected “somewhere” in the breaker panel, making it impossible to monitor consumption only. After some rewiring of the breaker board by an electrician and installing the electricity meter, everything went fine (see: <a href="https://www.flukso.net/content/seperating-household-consumption-and-generated-power" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://www.flukso.net/content/seperating-household-consumption-and-generated-power</a>).</li>
<li style="line-height: 1.4em;">I’m using an ethernet cable to transfer the pulse-signals from my water and gas meters. Although I had some hesitations, this does work fine over a distance of 10-15m. (see <a href="https://www.flukso.net/content/maximum-pulse-wire-length-and-wire-used" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://www.flukso.net/content/maximum-pulse-wire-length-and-wire-used</a>)</li>
<li style="line-height: 1.4em;">I had some trouble with the gas sensor. By bending the cable and pushing the sensor upwards, everything worked OK <a href="https://www.flukso.net/content/elster-bk-g4m-positioning-sensor" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://www.flukso.net/content/elster-bk-g4m-positioning-sensor</a>).</li>
<li style="line-height: 1.4em;">The ‘shop’ pages contain the right constant values for the water and gas sensors; I’m having the exact same models as depicted, so this was easy: <a href="https://www.flukso.net/content/water-probe" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://www.flukso.net/content/water-probe</a>and <a href="https://www.flukso.net/content/gas-probe" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://www.flukso.net/content/gas-probe</a></li>
<li style="line-height: 1.4em;">by default, the locale web-console only accepts connections over the ethernet port,<br /> not over Wifi. This is a security feature, but it can be changed if you wish. See <a href="https://www.flukso.net/content/access-flm-wireless-interface" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://www.flukso.net/content/access-flm-wireless-interface</a> to enable it: ssh root@ip.to.flukso (password: root)<pre style="border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; overflow: auto; word-break: break-all; word-wrap: break-word;"><code class="sh hljs" data-origin="<pre><code class="sh">uci set firewall.@zone[1].input=ACCEPT
uci commit
/etc/init.d/firewall reload
</code></pre>" style="background-color: #fdf6e3; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); color: #657b83; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 1em; font-weight: bold; letter-spacing: -1px; margin: 0px; overflow-x: auto; padding: 0.5em; word-break: break-all; word-wrap: break-word;">uci <span class="hljs-keyword" style="color: #859900;">set</span> firewall.@zone[<span class="hljs-number" style="color: #2aa198;">1</span>].input=ACCEPT
uci commit
/etc/init.d/firewall reload
</code></pre>
You can also change the password with <code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">passwd</code></li>
<li style="line-height: 1.4em;">with ssh, you can access the syslog with <code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; word-break: break-all; word-wrap: break-word;">logread</code> and <code style="background-color: #feecdd; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(239, 223, 208); color: black; margin: 0px 2px; padding: 0px 5px; white-space: nowrap;">logread -f</code><br /><span style="font-size: 15px; line-height: 1.4em;">—</span><a href="http://www.xinotes.net/notes/note/1510/" style="color: #3269a0; font-size: 15px; line-height: 1.4em; text-decoration: none; vertical-align: baseline;">http://www.xinotes.net/notes/note/1510/</a></li>
<li style="line-height: 1.4em;">I had a few issues with unreliable connections. After some trial and error, it turned out to be simply a matter of correctly connecting all cables :).</li>
</ul>
<div data-origin="<p>references:</p>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; margin-bottom: 1em; margin-top: 1em; word-wrap: break-word;">
references:</div>
<ul data-origin="<ul>
<li><a href="https://flukso.net">https://flukso.net</a></li>
<li>excellent blog: <a href="http://www.rowetel.com/blog/?page_id=312">http://www.rowetel.com/blog/?page_id=312</a></li>
</ul>" style="background-color: white; color: #222222; font-family: 'Roboto Condensed', Tauri, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', AppleSDGothicNeo-Medium, 'Segoe UI', 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px;">
<li style="line-height: 1.4em;"><a href="https://flukso.net/" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">https://flukso.net</a></li>
<li style="line-height: 1.4em;">excellent blog: <a href="http://www.rowetel.com/blog/?page_id=312" style="color: #3269a0; text-decoration: none; vertical-align: baseline;">http://www.rowetel.com/blog/?page_id=312</a></li>
</ul>
Michaëlhttp://www.blogger.com/profile/12582053064068588476noreply@blogger.com0