-
Notifications
You must be signed in to change notification settings - Fork 1
/
feed.xml
8991 lines (7876 loc) · 934 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title> Josh Long's Bootiful Blog </title>
<link>https://joshlong.com</link>
<atom:link href="https://joshlong.com/feed.xml" rel="self" type="application/rss+xml" />
<description> Josh Long's Bootiful Blog </description>
<language>en-gb</language>
<pubDate>Thu, 2 Jan 2020 19:50:27 +0000</pubDate>
<lastBuildDate>Thu, 2 Jan 2020 19:50:27 +0000</lastBuildDate>
<item>
<title>Josh's 2019 in Review</title>
<link>https://joshlong.com/jl/blogPost/2019_year_in_review.html</link>
<pubDate>Tue, 31 Dec 2019 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/2019_year_in_review.html</guid>
<description>
<p>You know I've always wanted to do these Year In Review blogs, but I'm usually so darned busy I always forget. So, finally, I get to do it. Let's see. What was 2019 for me?</p>
<p>I don't even know where to start. It's tempting to boil it down to numbers. Let's see if that works. According to UNITED, alone, not including any other non-Star Alliance airline, I traveled 636,000 &quot;premier qualifying miles,&quot; I spent $156,316 on flights, and I flew 187 segments this year. The &quot;premier qualifying miles&quot; have multipliers that mean they're not always the same as actual miles flown. Tripit does a pretty good job of tracking actual miles. It shows that in 2019 I flew 445,000 miles this year. I spoke to a <em>ton</em> of customers and at a <em>ton</em> of conferences. I did every city on the SpringOne Platform tour. I made a ton of other appearances. I went (twice!) to every continent this year, save Antarctica, where I've not yet set foot. In all, I gave north of 280 different talks, online, in-person, at conferences, or for customers, all around the world.</p>
<p>I released a new episode of my podcast, <a href="https://soundcloud.com/a-bootiful-podcast"><em>A Bootiful Podcast</em></a>, every week of 2019. I published a few dozen new <a href="https://www.youtube.com/watch?v=MTKlk8_9aAw&amp;list=PLgGXSWYM2FpPw8rV0tZoMiJYSCiLhPnOc">Spring Tips videos</a>. I blogged <em>at least</em> twice a week, every week, all year. I always release <em>This Week in Spring</em>, on the <a href="http://spring.io/blog">Spring blog</a>, and I consistently blog about the latest podcast episode. Some weeks I also blogged about the newest Spring Tips video. Some weeks I <em>also</em> published one or two installments in a series. I did a few series this year on reactive programming, on Spring Cloud for Microsoft Azure, on Spring Cloud for Google Cloud Platform, etc. So, some weeks I did as many as four or five blogs a week. But at <em>least</em> once a week.</p>
<p>In January, I visited Montreal, Canada; Pittsburgh, Pennsylvania; and Charlotte, North Carolina.</p>
<p>In February, I visited Saint Louis, Missouri; Denver, Colorado; Washington DC, USA; Kansas City, Kansas; and Columbus, Ohio.</p>
<p>In March, I visited Tel Aviv, Israel; Atlanta, Georgia; Seattle, Washington; Montreal, Canada; London, UK; Amsterdam, Netherlands; and Pleasanton, California;</p>
<p>In April, I visited New York City, New York; Cape Town, South Africa; Johannesburg, South Africa; Mauritius; Cape Town, South Africa; Belgrade, Serbia; Shanghai, China; Hangzhou, China; Los Angeles, California; Warsaw, Poland; Istanbul, Turkey; Chicago, Illinois; and Milwaukee, Wisconsin.</p>
<p>In May, I visited Chicago, Illinois; San Francisco, California; Sao Paolo, Brazil; London, UK; Krakow, Poland; Barcelona, Spain; Zurich Switzerland; Paris, France; Minsk, Belarus; and Barcelona, Spain.</p>
<p>In June, I visited San Francisco, California; Cork, Ireland; London, UK; Amsterdam, Netherlands; Atlanta, Georgia; Des Moines, Iowa; Minneapolis, Minnesota, Tampa, Florida; Paris, France; and the Dominican Republic;</p>
<p>In July, I visited Medellin, Columbia; Chicago, Illinois; Lima, Peru; Philadelphia, Pennsylvania; Portland, Oregon; Chicago, Illinois; Denver, Colorado; Burlington, Massachusetts; and San Mateo, California.</p>
<p>In August, I visited Sebastapol, California; and Austin, Texas; Dallas, Texas; Dallas, Texas; San Diego, California; Denver, Colorado; and Bangalore, India.</p>
<p>In September, I visited Oslo, Norway; San Francisco, California; Banff, Canada; Victoria, Canada; Madrid, Spain; and Guadalajara, Mexico.</p>
<p>In October, I visited Taipei, Taiwan; Austin, Texas; Amsterdam, Netherlands; Prague, Czech Republic; Nantes, France; Bologne-Billancourt, France; St. Petersburg, Russia; Chicago, Illinois; and San Francisco, California.</p>
<p>In November, I visited Kyiv, Ukraine; Antwerp, Belgium; Sydney, Australia; Singapore; Seoul, South Korea; and Tokyo, Japan.</p>
<p>In December, I visited Sydney, Australia; Brisbane, Australia; Tokyo, Japan; Los Angeles, California; and San Francisco, California.</p>
<p>The numbers don't tell the whole story, though. In November, my father entered the hospital. I canceled a ton of trips from mid-November onward so I could be by his bedside. He passed away on 11 December 2019, at 5:45 PM PST. I recorded an <a href="https://soundcloud.com/a-bootiful-podcast/i-need-to-talk-about-my-father-clark-bud-long-who-just-passed-away">episode of the podcast about him</a>. It still hurts to think he's gone. Rest in peace, dad.</p>
<p>I wrote another 150 pages or so (I know, I know, I need to pick up the pace!) on my <a href="http://www.reactivespring.io/"><em>Reactive Spring</em> book</a>, which is available for pre-order now. If you buy it now, you can start reading it now. As I update it, you'll get the updates <em>and</em> you'll also get the final edition once it's published. The book's starting to take final shape and I'm excited to see it finished.</p>
<p>I am also planning on expanding some of the series I've written in the last 12 months and turning them into new books. Hopefully those will get done in 2020, too. But I will only begin that effort, or those efforts, <strong>after</strong> finishing <em>Reactive Spring</em>.</p>
<p>I also contributed edits and reviews to a few other books, notably, Dr. Venkat Subramaniam's <em>excellent</em> <a href="https://pragprog.com/book/vskotlin/programming-kotlin">Programming Kotlin</a>. It's excellent, <em>despite</em> me. You should absolutely buy it now. I bought my own copy, it's that good.</p>
<p>I was also the subject of a chapter in Geertjan Wielenga's <em>excellent</em> new book, <a href="https://www.packtpub.com/business-other/developer-advocate"><em>Developer, Advocate!</em></a> book on the work of developer advocacy.</p>
<p>On a personal note, this was the first full year with Kimly, who we helped immigrate to the United States in November 2018. I spent more time in San Francisco than ever in order to be home as often as possible for that silly little girl. I took the girls - my partner Tammie and our kid Kimly - with me all around the planet in 2019. We went to half a dozen cities in the US together, to Jamaica, to Peru, to various countries in Europe and Asia and even other cities in California. I try to line these trips up with business visits, but I took a few that were just for thrill of being with my amazing family. I'm with them right now, as I write this roundup, in Denver, Colorado, where we're visiting friends and ringing in the new year in the company of friends.</p>
<p>Happy New Year, my friends! May your 2020 find you healthy and happy.</p>
</description>
</item>
<item>
<title>Getting Emacs Ready for Writin', Part 1</title>
<link>https://joshlong.com/jl/blogPost/emacs-pt-1.html</link>
<pubDate>Mon, 21 Jan 2019 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/emacs-pt-1.html</guid>
<description>
<p>I'm working on a new book, <a href="http://ReactiveSpring.io"><em>Reactive Spring</em></a>, and in the process I'm trying to level up my <code>emacs</code>-fu. I wrote most of my last book with my buddy <a href="http://Twitter.com/KennyBastani">Kenny Bastani</a>, <a href="http://CloudNativeJava.io"><em>Cloud Native Java</em></a>, in <code>emacs</code> and really enjoyed the process, especially having come from four other published books before that where the work was done largely in Microsoft Word, running inside a Windows Virtual Machine, running on my workhorse Linux desktop machine, a decade ago.</p>
<p>This time I wanted go further than just using <code>emacs</code> as a text editor with no plugins. I wanted to use some of the famed flexibility in Emacs. Today I spent a little time my with my friend <a href="http://Twitter.com/MarioGray">Mario Gray</a> tweaking <code>emacs</code> then I threw everything we did away and tried to get the meaningful stuff setup again, from scratch, avoiding all the mistakes made in the first run, so that I could explain them all here.</p>
<p>The pre-requisite is that you're going to need to <a href="https://melpa.org/#/getting-started">install Melpa</a>, a repository for the Elpa package manager. That's easy. Copy-and-paste the configuration shown in that file to your <code>~/.emacs</code> file. You might have to create that file.</p>
<p>Once that's installed the rest is easy. You can use <code>M-x package-list-packages</code> to see all the possible packages. You should be able to find <a href="https://github.com/sensorflo/adoc-mode/wiki"><code>adoc-mode</code></a>. You can install it by issuing <code>M-X package-install</code> and then specifying <code>adoc-mode</code>.</p>
<p>Now you can open up any file with Asciidoctor in it, issue <code>M-X adoc-mode</code> and it'll give you decent syntax highlighting.</p>
<p>Next, and hear me out. I want to use <code>emacs</code> for Asciidoctor editing and I want to use it to do light refactoring of Java code. Perfectly normal. It's a natu... I SAID HEAR ME OUT! I know. But it's normal. Java code is text, last I checked. <code>emacs</code> is great with text. So, I'll let that sink in. I want to edit Java code. In <code>emacs</code>. :whistles:</p>
<p>Still there? My book has tons of code and I need to be able to look at the code, especially when annotating it. I don't want to have to load a whole IDE just to annotate the code for use in the book as includes in that book. <code>emacs</code> is crazy fast and purpose-built for this sort of editing so it figures I'd do that in here. But i'm not the good <a href="http://twitter.com/VenkatS">Dr. Venkat Subramaniam</a>. I don't write Java code without an IDE and hope to get away with it! I need the soft landing of syntax highlighting and in-editor compilation and feedback. Autocompletion would be nice too.</p>
<p>Now, keep in mind I'm not planning on using <code>emacs</code> for some of the things you might think I'd use an IDE.</p>
<p>I'm <em>not</em> using the IDE to format the code. That's done by the glorious <a href="https://github.com/spring-io/spring-javaformat">Spring Boot Java Format</a> Maven plugin which I've configured in all my Maven projects. I run <code>mvn spring-javaformat:apply</code> at the root of my project and it formats all my code consistently. If I <em>don't</em> run that command, it fails the build! So I don't need to worry about tidying up in <code>emacs</code> versus Eclipse versus IntelliJ. There's only one way to get code past the CI build and that's not in <code>emacs</code>.</p>
<p>I'm <em>not</em> planning on using <code>emacs</code> to do large scale refactorings (though, this <code>emacs</code> plugin does apparently support some of that. Which is nice.</p>
<p>All I want is syntax highlighting and the usual feedback. Tell me if something won't compile. Give me autocompletion as I type. The usual.</p>
<p>This is all quite elegantly acheived with a plugin called <a href="https://github.com/mopemope/meghanada-emacs">Meghanada</a>. You can install it from your Elpa package manager as well. You'll need to copy-and-paste the configuration from the linked website into your <code>~/.emacs</code> file as well.</p>
<p>Once it's installed, just point <code>emac</code> to a <code>.java</code> file. It'll automatically syntax highlight it and even offer auto-completion for types as you type. The first time it's used on a <code>.java</code> file it'll download a server - what I imagine to be something like, if not exactly like, a Visual Studio Code Language Server, that it uses to index Maven and Java projects. Truly, what a time to be alive!</p>
<p><img src = "https://pbs.twimg.com/media/Dxf6gYMUcAEl-UX.png:large" /></p>
<p>Here's my finished, working <code>~/.emacs</code> file.</p>
<pre><code class="language-text">
(require 'package)
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
(not (gnutls-available-p))))
(proto (if no-ssl &quot;http&quot; &quot;https&quot;)))
(when no-ssl
(warn &quot;\
Your version of Emacs does not support SSL connections,
which is unsafe because it allows man-in-the-middle attacks.
There are two things you can do about this warning:
1. Install an Emacs version that does support SSL and be safe.
2. Remove this warning from your init file so you won't see it again.&quot;))
;; Comment/uncomment these two lines to enable/disable MELPA and MELPA Stable as desired
(add-to-list 'package-archives (cons &quot;melpa&quot; (concat proto &quot;://melpa.org/packages/&quot;)) t)
;;(add-to-list 'package-archives (cons &quot;melpa-stable&quot; (concat proto &quot;://stable.melpa.org/packages/&quot;)) t)
(when (&lt; emacs-major-version 24)
;; For important compatibility libraries like cl-lib
(add-to-list 'package-archives (cons &quot;gnu&quot; (concat proto &quot;://elpa.gnu.org/packages/&quot;)))))
(package-initialize)
(require 'meghanada)
(add-hook 'java-mode-hook
(lambda ()
;; meghanada-mode on
(meghanada-mode t)
(flycheck-mode +1)
(setq c-basic-offset 2)
;; use code format
(add-hook 'before-save-hook 'meghanada-code-beautify-before-save)))
(cond
((eq system-type 'windows-nt)
(setq meghanada-java-path (expand-file-name &quot;bin/java.exe&quot; (getenv &quot;JAVA_HOME&quot;)))
(setq meghanada-maven-path &quot;mvn.cmd&quot;))
(t
(setq meghanada-java-path &quot;java&quot;)
(setq meghanada-maven-path &quot;mvn&quot;)))
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(package-selected-packages (quote (## adoc-mode meghanada))))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
</code></pre>
<p>This is fresh getting everything working. Nothing else installed like <code>markdown-mode+</code> or any of the other packages I had installed.</p>
<p>Thanks again to <a href="http://Twitter.com/MarioGray">Mario Gray</a>) for helping me get all the bugs ironed out to get this abomination working so smoothly! Now if we could only figure out why the lights in the room flicker every time I open <code>emacs</code>...</p>
</description>
</item>
<item>
<title>How to Install FFMPEG with _ALL_ the Options using Homebrew on macOS</title>
<link>https://joshlong.com/jl/blogPost/how-to-install-a-fully-souped-up-ffmpeg-on-osx.html</link>
<pubDate>Fri, 28 Sep 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/how-to-install-a-fully-souped-up-ffmpeg-on-osx.html</guid>
<description>
<p>I needed <code>libtheora</code> support in my macOS / OSX install of <code>ffmpeg</code>. I installed <code>ffmpeg</code> using <a href="http://homebrew.io">Homebrew</a> but needed to add theora support.</p>
<p>I found this handy recipe which gives me an <code>ffmpeg</code> that supports <em>tons</em> of options!</p>
<pre><code class="language-sh">brew install ffmpeg $(brew options ffmpeg | grep -vE '\s' | grep -- '--with-' | tr '\n' ' ')
</code></pre>
<p>If you already have <code>ffmpeg</code> installed you can remove it or just change the above command to be <code>brew reinstall ...</code>.</p>
</description>
</item>
<item>
<title>Eight (8!) Years on the Spring Team</title>
<link>https://joshlong.com/jl/blogPost/8-years-on-the-spring-team.html</link>
<pubDate>Thu, 2 Aug 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/8-years-on-the-spring-team.html</guid>
<description>
<p>I'll never forget it. I was sat at my desk at the offices of Shopzilla in Santa Monica, Los Angeles, California talking to then Spring Integration lead (he now runs <a href="http://ProjectRiff.io">the Riff project</a>) Mark Fisher about some code I'd contributed. I'd been working with, and for, him for a while on Spring Integration since I was enamored with enterprise application integration and, it seemed to me, Spring Integration was the technology to learn and invest in. A propos to nothing, he volunteered that there was this new job opening for a &quot;developer advocate,&quot; and suggested that I should perhaps apply. Now, I'd only ever known James Ward in this role and it seemed to me that I could never do what James Ward did. His wisdom and patience were matched only by his charisma. The guy's a rockstar!</p>
<p>By this point, I was already a pretty outspoke Spring fan. I'd spoken at different conferences (almost entirely on my own time and dime.). I'd already written two books on Spring. I was, clearly, a big ol fan of Spring. It'd helped me deliver better software for the better part of a decade, at startups and in the enterprise, and I couldn't be happier to see its expansion from the core Spring Framework around 2005 to extension projects like Spring Security, Spring Batch and Spring Integration. But still. Me? Be like James Ward? NO WAY NO SIR NO HOW! That sorta thing wasn't for me! Thanks anyway! I knew my limits. So, I thanked Mark Fisher profusely and walked away from my desk (for what reason I don't remember? Lunch? Coffee break?) and got all of ten paces before it hit me: WHAT AM I DOING?? OF COURSE I WANTED TO WORK WITH THE SPRING TEAM!?? I ran back to my desk and said &quot;I'll take it! I'll do it! Sign me up!&quot;</p>
<p>So the interviews began. I talked to the hiring manager, a gentleman named <a href="https://twitter.com/DevrelChap">Adam Fitzgerald</a>, a SpringSource co-founder, <a href="https://twitter.com/kdonald">Keith Donald</a>, and of course <a href="https://twitter.com/M_F_">Mark himself</a>. I'd tricked them all! They seemed to like me. Or at least, not hate me. I felt pretty confident about the opportunity. I just knew the phone was going to ring any day now. I'd be their guy! So I waited. And I waited. During this time Craig Wall, who was and is infinitely more qualified, joined the Spring team. I was gutted. That was the dream job I'd wanted! He was going to be the Spring developer advocate! Well, tis better to have applied and lost than to have never applied at all, or something, I told myself. But then Craig tweeted about his daily work. He'd joined as an engineer. Not as a developer advocate. I think since he was already a famous public speaker they figured they'd just let Craig do his own thing <em>and</em> leverage him as an engineer. Smart! So, why hadn't I gotten the job? What happened? I could have understood Craig Walls getting the role. He's a freaking legend! I'd even sheepishly asked if I could be his friend on Facebook a year earlier. I didn't, and don't, even use Facebook!</p>
<p>So, <em>what</em> happened?</p>
<p>I reached out to Adam who explained that everyone liked me and that the job was everything but mine because there'd been a hiring freeze! I can deal with a hiring freeze. I wasn't looking for a new job. I loved my old job. I loved the team and the company and it had waaay better benefits than the job to which I was applying. But this was the Spring team darnit! I loved the Spring team! They were heroes, not just employers. Inspirations, even. If they would have me, I'd love to work with them. Just think of all the things I could learn! So I waited.</p>
<p>July came and I got the email of a lifetime. The opportunity was open, and the job was mine if I wanted it! I practically flipped out of my chair. I was super sad and super happy at the same time. Shopzilla was the best job I'd ever had. Some of the best people I'd ever had the privilege of working with were there. I'm <em>still</em> friends with a ton of them. And the folks that worked there ended up in the Los Angeles tech disapora and continue to dominate the direction even to this day. I was sad to have to leave a great thing, but I wouldn't be able to sleep if I passed this opportunity up. So I gave three weeks notice. (which is a week longer than is normal in the US. I did it as a courtesy). My teammates even helped me. My friend Rob Rolland helped me configure the new MacBook Pro VMWare (where Spring lived at the time) had sent me! Truly, it was bittersweet. Then the big day. My first day on the job.</p>
<p>I started August 2nd, 2010. Today is the eighth anniversary of my working (officially) with the Spring team.</p>
<p>When I joined I was the first (and only) Spring Developer Advocate. The epic <a href="http://twitter.com/Pledbrook">Mr. Peter Ledbrook</a> was the Grails Developer Advocate. A year later we reworked the team a bit. <a href="http://twitter.com/Chanezon">Patrick Chanezon</a> came in and helped us grow the team, with a focus on Cloud Foundry. Beyond Peter and me, there were specialists focusing on Rails, Node.js, PHP, RabbitMQ and more. It was an exciting team and and even more exciting time!</p>
<p>Poor Adam. He did the best with what he was given. I knew <em>nothing</em>! (I'm not much better now..) He mentored me. Guided me. Spell-checked me, for Pete's sake! The man was one of the busiest, most in-demand human beings I've ever met but he always took time to try to guide me. Adam's a consummate professional. He helped me see that developer advocacy was more than just &quot;drinking and knowing things,&quot; as one internet meme about advocates jokes. He's since moved on to lead developer advocacy worldwide for a small up-and-coming company in Seattle called &quot;Amazon&quot; who, as far as I can tell, sell books. He keeps saying they're going to be big one day :) I think about Adam once a week at least. Every time I step on soil in some other corner of the planet, connect with some soul making their way to production with tools I love, or see a smile-inducing Tweet, I think about the risk he took in hiring me, in giving me the opportunity to work for him. Thank you Adam.</p>
<p>Patrick has since moved on to Microsoft (in a leadership role for developer advocacy) and now Docker (guiding strategy). Whenever I go to India, where Patrick, Chris Richardson, Rajdeep Dua and I had the privilege of spending a <em>lot</em> of time, I think of Patrick. Thank you Patrick.</p>
<p>When we spun out and created Pivotal, there were some organizational changes and I ended up reporting to <a href="http://twitter.com/BrianDussault">Brian Dussault</a>, the engineering manager for the Spring team. Brian didn't owe me a thing, but he took me in and assured me that he'd try to find funds in his engineering org for me in this new, scrappy Pivotal world. Brian, you're a live safer my friend. Thank you Brian.</p>
<p>Then came <a href="http://twitter.com/LittleIdea">Andrew Clay Shafer</a>. Andrew deserved better! But he got me. And he built a team with Pivotal's nascent marketing budget and community at his back. Andrew is a wonderful and strange cat. He built up a team and let us loose. He's been there to help, unfailingly, whenever we had questions or concerns. He is sometimes shockingly authentic. It's easy to be authentic when your manager is so forthcoming. Good, bad, or ugly, Andrew prioritizes the truth and expects nothing less from us. Andrew in turn hired Tasha Isenberg, our events manager who is sort of like air-traffic control. I work with Tasha almost daily. She's the most valuable person at Pivotal for me. I could not do what I do without her. It is entirely thanks to her that I am able to sardine pack hundreds of distinct talks, cities and meetings per year into the schedule. Andrew and Tasha make it so that I can do more while simultaneously wasting less time. I have more time off while getting more work done. Thank you Andrew and Tasha.</p>
<p>The Spring team are my friends. I've been through a divorce and a some health issues over the years and the Spring team always looked after me. We started a new company together, Pivotal, which you may have heard IPO'd in April of 2018 (earlier this year). I bought my first home in 2014, and my second in 2017, all thanks to the stability of working with the Spring team. In short, they've helped me grow and exceed my ambitions. I tend to richochet between cities and countries in my never ending quest to bring Spring to the world, to meet developers where they are literally and metaphorically. This means I get confused about things at <em>the oddest</em> hours and days relative to most of the team, but they always try to help. When I occasionally fail, it's entirely my fault. When I succeed, it's a shared privilege and effort. The Spring team are the real heroes here. They deliver boss-sauce software and I, the messenger, collect the hugs. I have grown with the Spring team, as a part of the Spring team, and I look forward to continuing to do so.</p>
<p>And of course, my work is pointless if I'm just speaking into a vaacuum. It's only thanks to you, the ever indulgent community, that I've gotten any traction at all. Thanks for making this work the thing that I feel privileged to do, day in and day out. Thank you.</p>
<p>I can't believe it's been eight years! Time sure flies when you're having fun..</p>
</description>
</item>
<item>
<title>Sane Defaults for Navigating Between Words on iTerm on macOS</title>
<link>https://joshlong.com/jl/blogPost/iterm-defaults-on-osx.html</link>
<pubDate>Wed, 1 Aug 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/iterm-defaults-on-osx.html</guid>
<description>
<p>I'm slowly getting used to iTerm and macOS, again. One of the first things I had to do, after installing Homebrew and iTerm, was figure out how to get normal navigation between words on the shell in iTerm. Turns out there's a sane default now. Open up iTerm preferences and choose &quot;Natural Text Editing&quot; in the Profiles -&gt; Keys -&gt; Key Mappings preferences.</p>
<p>Why isn't this a default?</p>
<p><img src = "https://pbs.twimg.com/media/Djkm0FMU4AEub-I.jpg" /></p>
</description>
</item>
<item>
<title>Some Notes on Sound</title>
<link>https://joshlong.com/jl/blogPost/some-notes-on-sound.html</link>
<pubDate>Sat, 28 Jul 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/some-notes-on-sound.html</guid>
<description>
<p>I've been studying sound and I took some notes and I'd like to be able to find these readily so I figured i'll post them there. Hope you find these notes, disjointed thought they are, even a tiny bit useful.</p>
<h3>Frequency</h3>
<ul>
<li>When sound is created, it travels through a medium, usually air. Its the change in pressure of the waves that we perceive when it hits our ears.</li>
<li>the timing of those waves is known as the frequency, or literally how frequently the eave fluctuates.</li>
<li>the frequency is how long it takes to complete a cycle</li>
<li>measured in hertz, or cycles per second.</li>
<li>the more cycles per second the higher the pitch of the sound</li>
<li>440 cycles per second = 440 hertz.</li>
<li>anything over a thousand hertz is measured in kilohertz</li>
<li>human hearing = 20 Hz to 20 kHz</li>
</ul>
<h3>Amplitude</h3>
<ul>
<li>how much the sound wave fluctuates up ad down</li>
<li>smaller fluctuates = softer; bigger = louder</li>
<li>decibels = dB is how you measure amplitude</li>
<li>0 dbfs (decibels for scale) = the loudest. lower = -1dB until 0dB. -12dB is louder than 0dB.</li>
</ul>
<h3>Sample Rate</h3>
<ul>
<li>when we capture sound were not actually capturing the whole thing, were capturing snapshots at intervals</li>
<li>the sample rate is measured in hertz</li>
<li>CDs are sample at 44100 Hz. Video = 48 KHz.</li>
<li>The general rule is that the sample rate is double the highest frequency you are going to record which is why 44.1 kHz is the lowest sample rate you'd want since human beings can reach 20khz of frequency.</li>
<li>some audio engineers set it at 96 kHz for incredible quality. obviously this takes more space in the file!</li>
</ul>
<h3>Bit Depth</h3>
<ul>
<li>the bit depth determines how much info is stored in each sample; the more bits the wider the range of volume we can store in each sample</li>
<li>a low bit depth of 8 bits gives us a dynamic range fo 48dB. 16 bits is used for CDs. 48 bits is used for videos.</li>
<li>the higher the bit depth the larger the file will be. Still, recommendation? Record at the highest bit depth you can (32-float).</li>
</ul>
</description>
</item>
<item>
<title>A Bootiful, Reactive April and May 2018 (with apperances from Spring co-founders Rod Johnson and Juergen Hoeller!)</title>
<link>https://joshlong.com/jl/blogPost/april-and-may-2018.html</link>
<pubDate>Fri, 20 Apr 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/april-and-may-2018.html</guid>
<description>
<p>I just concluded a wonderful Devoxx FR where I was reunited with old friends and spoke to people about cloud native (reactive) Spring.</p>
<p>I did two workshops (one at Devoxx FR, and another for Zenika, as a meetup, in the evening) and then co-presented with Spring co-founder and my hero (and freind) Juergen Hoeller. It was a lot of fun and I want to thank all those that turned up! It was an honor!</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">It was such a privelege to speak at <a href="https://twitter.com/ZenikaIT?ref_src=twsrc%5Etfw">@ZenikaIT</a> last night! Look at this group still going strong at 21:45! 🙏 <a href="https://t.co/BKmD5nEkbd">pic.twitter.com/BKmD5nEkbd</a></p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/986940126633832448?ref_src=twsrc%5Etfw">April 19, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Great to see old friends like <a href="https://twitter.com/arungupta?ref_src=twsrc%5Etfw">@arungupta</a> <a href="https://twitter.com/emmanuelbernard?ref_src=twsrc%5Etfw">@emmanuelbernard</a> and <a href="https://twitter.com/springjuergen?ref_src=twsrc%5Etfw">@springjuergen</a> <a href="https://twitter.com/DevoxxFR?ref_src=twsrc%5Etfw">@DevoxxFR</a> <a href="https://t.co/qzM1tAVXsb">pic.twitter.com/qzM1tAVXsb</a></p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/986940118396219392?ref_src=twsrc%5Etfw">April 19, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">I had so much fun presenting with my friend (and hero) <a href="https://twitter.com/springjuergen?ref_src=twsrc%5Etfw">@springJuergen</a> today on “Reactive Spring” <a href="https://twitter.com/DevoxxFR?ref_src=twsrc%5Etfw">@DevoxxFR</a> <a href="https://twitter.com/hashtag/devoxxfr?src=hash&amp;ref_src=twsrc%5Etfw">#devoxxfr</a> !<br><br>we talked about reactive <a href="https://twitter.com/springframework?ref_src=twsrc%5Etfw">@springframework</a> 5, <a href="https://twitter.com/springboot?ref_src=twsrc%5Etfw">@springboot</a> 2, <a href="https://twitter.com/SpringData?ref_src=twsrc%5Etfw">@springdata</a> Kay, and <a href="https://twitter.com/springcloud?ref_src=twsrc%5Etfw">@springcloud</a> Function and <a href="https://twitter.com/projectriff?ref_src=twsrc%5Etfw">@projectriff</a> <a href="https://twitter.com/java?ref_src=twsrc%5Etfw">@java</a> and <a href="https://twitter.com/kotlin?ref_src=twsrc%5Etfw">@kotlin</a> <a href="https://t.co/G6AjRC6Chr">pic.twitter.com/G6AjRC6Chr</a></p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/986917183296081920?ref_src=twsrc%5Etfw">April 19, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Now it's off to the states for some business then I return to Europe, Sunday, <a href="https://jax.de/programm/">for JAX in Mainz, Germany</a>. There, I'll co-present <em>again</em> with Juergen. I speak French (so that helped in Paris) and he speaks German (that'll help in Mainz)! It's a nice symmetry. We'll even have a bit more time to articulate our ideas - an hour! I'll also be doing a <em>Cloud Native Java</em> book signing at JAX, so don't miss that!</p>
<p>They announced that JavaDays Ukraine would soon join the Devoxx franchise and family as Devoxx Ukraine and Juergen and I have already been invited to speak there. I sure hope we can! Congratulations to the team. It looks like it's going to be an exciting adventure.</p>
<p>Then, it's off to Linz, Austria (where Juergen lives, no less), <a href="https://devone.at/">for the DevOne show</a>. There, again, Juergen and I will co-present on all things Reactive Spring. If you're there, don't miss this opportunity to meet Juergen Hoeller, one of the greats!</p>
<p>On the 27th, I'll be presenting at a meetup <a href="https://www.meetup.com/de-DE/Enterprise-Java-User-Group-Austria/events/249259945/">in Vienna, Austria</a>.</p>
<p>Then, on 2-3 May I'll be in Melbourne, Australia, and the <a href="https://voxxeddays.com/melbourne/">VOXXED Melbourne event</a>. This is exciting! I'll be co-presenting with the <em>other</em> Spring co-founder, Rod Johnson, in his native Australia! Do <em>not</em> miss this!</p>
<p>Then, it's off to Manchester, <a href="https://www.meetup.com/ManchesterUK-Java-Community/events/248184150/">UK for a meetup on the 9th of May, 2018</a>. Do you want to miss this? I think not!</p>
<p>From there, I'll head to <a href="https://www.devoxx.co.uk/">Devoxx UK</a>, one of my all time favorite shows, in London on the 9th to 11th May. I'll also be speaking to customers there.</p>
<p>Then, it's off to Denver, Colorado for the <a href="https://springonetour.io/2018/denver">epic SpringOne Tour Denver event</a> on the 14th. These SpringOne Tour events sell out quick, so don't miss this one!</p>
<p>From Denver, I head off to Kyiv, Ukraine for a <a href="http://jug.ua/">JUG meeting</a>. I'll also be presenting at the <a href="https://jeeconf.com/">JEEConf</a> event on the 18th of May. Juergen and I will again be co-presenting there!</p>
<p>I'll be in Dublin an Belfast speaking to customers and <em>hopefully</em> doing a JUG on the 21st of May.</p>
<p>Then, from there, it's off to the legendary <a href="https://2018.springio.net/">Spring I/O</a> event in beautful (<em>bootiful</em>) Bercelona, Spain! Join us!</p>
<p>Then, finally, I'll return home to San Francisco for a few days in the sun before I make the trek to Singapore for the epic <a href="https://voxxeddays.com/singapore/">VOXXED Singapore event</a>.</p>
<p>Needless to say, if you're in any of the regions in which I'm speaking I'd love to see you there and hear from you!</p>
</description>
</item>
<item>
<title>Atlanta, Indianapolis and Cincinnati</title>
<link>https://joshlong.com/jl/blogPost/atl-ind-CVG.html</link>
<pubDate>Mon, 9 Apr 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/atl-ind-CVG.html</guid>
<description>
<p>I'm off to Atlanta, Indianapolis and Cincinnati this week! I'll be speaking at the <a href="https://www.meetup.com/AtlantaSpring/events/244444404/">Atlanta, GA Spring Meetup on Tuesday the 10th</a> where I'll be looking about all things new, <em>bootiful</em> and <em>cloud-native</em> including reactive programming, Spring Web Flux, Spring Cloud Finchley, Spring Cloud Function and <a href="http://ProjectRiff.io">Project Riff</a>.</p>
<p>Then it's off <a href="https://www.meetup.com/Indianapolis-Java-User-Group/events/248184994/">to Indianapolis where I'll be doing the same talk</a> on Thursday the 12th.</p>
<p>I'd love to see you! Come on out!</p>
</description>
</item>
<item>
<title>Happy... 1st of April, 2018!</title>
<link>https://joshlong.com/jl/blogPost/springone-tour-2018-dallas.html</link>
<pubDate>Sun, 1 Apr 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/springone-tour-2018-dallas.html</guid>
<description>
<p>Happy Easter, friends! I spent the day walking around San Francisco basking in the beautiful San Francisco Sunday sun. There's so much good stuff happening in the neighborhood that one can't help but soak it all up.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">what a warm and wonderful Easter it’s been! <a href="https://t.co/KmxE3PyGNQ">pic.twitter.com/KmxE3PyGNQ</a></p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/980629124325687297?ref_src=twsrc%5Etfw">April 2, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Today, April 1st, 2018, is also (I beleive!) the 5th anniversary of the founding of Pivotal, a company that has given me so much in my life. I talked about it a bit on Twitter as well.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">however you count it, <a href="https://twitter.com/pivotal?ref_src=twsrc%5Etfw">@pivotal</a> has been at least 5 years in the making. We at VMW heard rumors about a spinoff for a solid two years before officially launching <a href="https://twitter.com/pivotal?ref_src=twsrc%5Etfw">@pivotal</a>.</p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/980567704737234944?ref_src=twsrc%5Etfw">April 1, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>And, of course, today is April Fool's Day, and so there were lots of good thing shappening out there in that wonderful world wide web, with the usual suspects - like Google - getting in on the action.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Wow <a href="https://twitter.com/googlemaps?ref_src=twsrc%5Etfw">@googlemaps</a> has “Where’s Waldo” today <a href="https://twitter.com/hashtag/AprilFoolsJoke?src=hash&amp;ref_src=twsrc%5Etfw">#AprilFoolsJoke</a> <a href="https://twitter.com/hashtag/AprilFoolDay?src=hash&amp;ref_src=twsrc%5Etfw">#AprilFoolDay</a> <a href="https://t.co/id0uxyYMMY">pic.twitter.com/id0uxyYMMY</a></p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/980512231816179712?ref_src=twsrc%5Etfw">April 1, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Tomorrrow, I board a flight for Dallas, TX, for the <a href="https://springonetour.io/2018/dallas"><em>Spring One Tour Dallas event</em></a> there starting on Tuesday. I hope you'll join me and some of my friends; it's sure to be a blast!</p>
</description>
</item>
<item>
<title>Java 10</title>
<link>https://joshlong.com/jl/blogPost/java-10.html</link>
<pubDate>Tue, 20 Mar 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/java-10.html</guid>
<description>
<p>UPDATE: you can find <a href="https://github.com/joshlong/spring-boot-and-java-10">the code for this project on my Github</a>.</p>
<p>It's my favorite time of the year, the first day of Spring! Happy Spring equinox!</p>
<p>And, almost as if to ring in the new season with an extra jolt of caffeine, <a href="http://mail.openjdk.java.net/pipermail/announce/2018-March/000247.html">Java 10 was released today</a>, as well! There's so much to enjoy one hardly knows where to get started! So, I set about <a href="http://jdk.java.net/10/">downloading the new JDK</a> and got it installed on my local machine. I had to do so manually, though. I'm running Ubuntu 17.10, (though I'm eagerly awaiting 18.04 due next month..) and there is no Java 10 / OpenJDK package, yet. This is fine. OpenJDK 10 went GA literally hours ago, so.. not a big deal.</p>
<p>I downloaded the Linux distro for JDK 10, unpacked it and then changed my <code>JAVA_HOME</code> variable to point to <code>$HOME/bin/jdk-10</code>, which is where I'd unpacked it. I also made sure that my <code>PATH</code> variable had <code>$JAVA_HOME/bin</code> on it. I then have to tell Ubuntu to prefer the new JDK, not the existing <code>defaultjdk</code> that was already installed. For me, this has been Java 8. I used the following commands to make it work:</p>
<pre><code>sudo update-alternatives --install &quot;/usr/bin/javac&quot; &quot;javac&quot; &quot;${JAVA_HOME}/bin/javac&quot; 1
sudo update-alternatives --install &quot;/usr/bin/java&quot; &quot;java&quot; &quot;${JAVA_HOME}/bin/java&quot; 1
</code></pre>
<p>Then I had to update the configuration for the alternatives available, telling Ubuntu to prefer the new <code>java</code> and <code>javac</code> be from the JDK 10 release. This amounted to running <code>sudo update-alternatives --config java</code> and choosing the appropriate installation (one of which is the release I manually installed above). I did the same thing again, substituting <code>javac</code> for <code>java</code>. I opened a new shell and ran <code>java -version</code> and <code>javac -version</code> to confirm everything had taken. Looked good!</p>
<p>At this point, Ubuntu believed I was running Java 10, but - as I would soon discover - little else did.</p>
<p>I opened up <a href="http://start.spring.io">the Spring Initialzr</a>, added <code>Web</code>, <code>JPA</code>, and <code>Actuator</code>, <code>H2</code>, and generated a (Maven) project. I unzipped the project and then ran <code>mvn clean package</code> and got a number of errors complaining that JAXB was missing. Java 9 dropped support for the various types that used to be part of Java EE as those have since been moved to a separate foundation. So, we have to add the dependency back. Thankfully, the correct version is already managed for us by the Spring Boot starter parent so all that was required was adding the dependency:</p>
<pre><code>&lt;dependency&gt;
&lt;groupId&gt;javax.xml.bind&lt;/groupId&gt;
&lt;artifactId&gt;jaxb-api&lt;/artifactId&gt;
&lt;/dependency&gt;
</code></pre>
<p>You would have had to add this dependency if you were using Java 9, too. I want to use Java 10, though, so I opened the <code>pom.xml</code> file and changed the <code>java.version</code> property value to be <code>10</code>. The Maven surefire plugin broke the build next; it was complaining about not being able to parse the version of the JDK. I overrode the version by redefining the property for the plugin's version: <code>&lt;maven-surefire-plugin.version&gt;2.21.0&lt;/maven-surefire-plugin.version&gt;</code>.</p>
<p>I then made sure I had the latest version of IntelliJ IDEA - version 2018.1, as of this writing - and set up my JDK as the default in the Default Project Settings and then I opened my new Spring Boot project in IntelliJ and was able to use some of the nice shiny new features that I've not had a chance to enjoy since the release of Java 8, including local type inference (<code>var</code>), and the collection builders <code>Map.of(..)</code> and <code>Set.of(..)</code>, among other things.</p>
<script src="https://gist.github.com/joshlong/808ff052844e9ed9c05d8e14c52753bb.js"></script>
<p>So far the experience seems to be alright, though I'm sad that I couldn't figure out how to get Lombok working. Here's hoping that gets sorted soon. If you have some other issue not addressed in this post, you might <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9">check the evolving Spring Boot with Java 9 Wiki page</a> or this example and explainer <a href="https://github.com/dsyer/spring-boot-java-9">from the good Dr. Dave Syer</a>. If you're trying to use Spring Boot with Java 9 modules (Jigsaw) then.. why? But if you must, Nicolas Frankel has a nice few posts that seemed helpful. Here's <a href="https://blog.frankel.ch/migrating-to-java-9/1/">part one</a> and here's <a href="https://blog.frankel.ch/migrating-to-java-9/2/">part two</a>.</p>
</description>
</item>
<item>
<title>Agile India 2018</title>
<link>https://joshlong.com/jl/blogPost/agile-india-2018.html</link>
<pubDate>Sun, 11 Mar 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/agile-india-2018.html</guid>
<description>
<p>After my brief but wonderful visit to Dubai, I flew to Bengalaru, India, to speak at the legendary <a href="https://2018.agileindia.org/">Agile India</a> 2018 edition. It was <em>amazing</em>. It was held in the beautiful Taj West End hotel, a resort in the middle of Bengalaru, historically called &quot;the garden city.&quot; Naresh Jain, who runs the show, invited me to speak there.</p>
<p>Naresh, shown below, did me a <em>huge</em> solid! What a wonderful event!</p>
<p><img src ="https://pbs.twimg.com/media/DYHFdcKVQAAorLa.jpg" width = "500" /></p>
<p>I got to see old friends like <a href="http://www.enterpriseintegrationpatterns.com/"><em>Enterprise Integration Patterns</em></a> author <a href="https://twitter.com/ghohpe">Gregor Hohpe</a>..</p>
<p><img src = "https://pbs.twimg.com/media/DYHGbYWUQAAqSc5.jpg" width = "500" /></p>
<p>..and microservices master and Thoughtworker James Lewis..</p>
<p><img src = "https://pbs.twimg.com/media/DYHGbYUVQAAsttl.jpg" width = "500" /></p>
<p>..and microservices master <a href="http://twitter.com/fgeorge52">Fred Georges</a> (on the right) and new friends like <a href="https://twitter.com/juttaeckstein">Jutta Eckstein</a> (on the left)..</p>
<p><img src="https://pbs.twimg.com/media/DX9Qj4tVMAATmxp.jpg" width = "500" /></p>
<p>..and new friends like <a href="https://twitter.com/MrAlanCooper">Alan Cooper</a> (&quot;the father of Visual Basic&quot;)..</p>
<p><img src="https://pbs.twimg.com/media/DYHGbYKUMAAvDBO.jpg" width ="500"/></p>
<p>..and user-story mapping authority <a href="https://twitter.com/jeffpatton">Jeff Patton</a>..</p>
<p><img src ="https://pbs.twimg.com/media/DYHGbYKUMAMA69C.jpg" width = "500" /></p>
<p>It seemed like every other person I spoke to knew, in some way, <a href="http://twitter.com/Pivotal">of Pivotal</a> and our CEO and decades-long agile guru Rob Mee, and many even had great stories to share of their interactions with him and Pivotal (or Pivotal Labs, part of Pivotal)! There I was, in India, talking to people who worked with my company's CEO more than a decade ago. It truly is a small, wonderful, agile world.</p>
<p>I love India. I <em>love</em> India. So I paid for a visa for my partner Tammie and asked her to join me for this trip. She <em>also</em> had a wonderful time, and spent days exploring the city while I was at the show. All in all, yet another amazing trip to India for which I'm eternally grateful and which I shall not soon forget.</p>
</description>
</item>
<item>
<title>Hi, Dubai!</title>
<link>https://joshlong.com/jl/blogPost/dubai-march-2018.html</link>
<pubDate>Thu, 8 Mar 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/dubai-march-2018.html</guid>
<description>
<p>I left Sydney, Australia in a rush. I went from Sydney to Singapore and then from Singapore to Dubai. The journey took the better part of a day and I landed in Dubai late in the evening on Tuesday. I'd never been to Dubai so I confess I wasn't sure <em>what</em> to expect. I couldn't find a clear picture of what the VISA requirements were for entering the country, either. Most websites I found said that Americans didn't need VISAs, but I couldn't readily find anything that looked like it was from the Dubai government. So, a little nervously, I arrived, queued and talked to the immigration officer. It couldn't have been easier, or more modern. There were smart, face-detecting cameras. It was as if Apple or Tesla had designed an immigration system. I talked to the officer. He didn't ask me about business or tourism. Didn't ask much of anything, really. I don't think he even asked where I was staying. It was so painless! And there I was, in this amazing country that looked like the computer-generated models of futuristic cities in science fiction movies or in advertising but that we hardly expect to experience first hand. It was <em>awesome</em>! What a country! It was modern, clean, bustling and shiny. And <em>yuuuge</em>! Words fail me when I talk about the structures. Skyscrapers <em>everywhere</em>! And, apparently a lot of them use the same contractor! Most of the buildings say <em>EMAAR</em> on them, presumably a common, very prolific developer. Whatever it was, the results spoke for themselves. It was absolutely amazing.</p>
<p>Obviously, when in Dubai, you <em>must</em> (and can scarcely avoid!) see the <a href="https://en.wikipedia.org/wiki/Burj_Khalifa">Burj Khalifa</a>, the world's tallest building since 2008.</p>
<blockquote class="twitter-video" data-lang="en"><p lang="en" dir="ltr">This is the Burj Khalifa, the world’s tallest building, lit up in unison with the water fountains <a href="https://t.co/BBRlRVBfDG">pic.twitter.com/BBRlRVBfDG</a></p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/971234852283576320?ref_src=twsrc%5Etfw">March 7, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>The Burj Khalifa is not the <em>only</em> thing from the future you'll see in Dubai. The place is oozing future-tech.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">This 👏 place 👏 is 👏 LIT <a href="https://t.co/Fx5HqEDTbv">pic.twitter.com/Fx5HqEDTbv</a></p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/971080658058645509?ref_src=twsrc%5Etfw">March 6, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>I spoke to some amazing groups there, as well. First up, the amazing combination of the <a href="https://twitter.com/Dubai_DED">Dubai DED</a> and <a href="https://twitter.com/emaratechUAE">Emiratech</a> - a leading technology and management consulting company in the Arab World.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Thanks to <a href="https://twitter.com/Dubai_DED?ref_src=twsrc%5Etfw">@Dubai_DED</a> and <a href="https://twitter.com/emaratechUAE?ref_src=twsrc%5Etfw">@emaratechUAE</a> for hosting <a href="https://twitter.com/pivotal?ref_src=twsrc%5Etfw">@pivotal</a> <a href="https://twitter.com/starbuxman?ref_src=twsrc%5Etfw">@starbuxman</a>. Great session and great hospitality! <a href="https://twitter.com/springcloud?ref_src=twsrc%5Etfw">@springcloud</a> <a href="https://twitter.com/springboot?ref_src=twsrc%5Etfw">@springboot</a> <a href="https://t.co/hIggjjo42V">pic.twitter.com/hIggjjo42V</a></p>&mdash; Fadi Yousuf (@fadicce) <a href="https://twitter.com/fadicce/status/971335134690635777?ref_src=twsrc%5Etfw">March 7, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Then, I went and spoke to the world-famous Emirates airlines, routinely ranked among the best airlines in the world. Turns out, they love Pivotal and Spring almost as much as the world loves their airline!</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Thank you <a href="https://twitter.com/emirates?ref_src=twsrc%5Etfw">@emirates</a> ! It was fun speaking to you about reactive <a href="https://twitter.com/cloudnativejava?ref_src=twsrc%5Etfw">@cloudnativejava</a> <a href="https://twitter.com/cloudfoundry?ref_src=twsrc%5Etfw">@cloudfoundry</a> <a href="https://twitter.com/springcloud?ref_src=twsrc%5Etfw">@springcloud</a> <a href="https://twitter.com/springboot?ref_src=twsrc%5Etfw">@springboot</a> - and thank you for the amazing gift! ❤️ <a href="https://t.co/VPcg72XuVN">pic.twitter.com/VPcg72XuVN</a></p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/971357768098578432?ref_src=twsrc%5Etfw">March 7, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">A great turnout for <a href="https://twitter.com/starbuxman?ref_src=twsrc%5Etfw">@starbuxman</a> at <a href="https://twitter.com/emirates?ref_src=twsrc%5Etfw">@emirates</a>... 100+ engineers and counting! <a href="https://twitter.com/pivotal?ref_src=twsrc%5Etfw">@pivotal</a> <a href="https://twitter.com/springcloud?ref_src=twsrc%5Etfw">@springcloud</a> <a href="https://twitter.com/springboot?ref_src=twsrc%5Etfw">@springboot</a> <a href="https://t.co/GIKM3KP8JV">pic.twitter.com/GIKM3KP8JV</a></p>&mdash; Fadi Yousuf (@fadicce) <a href="https://twitter.com/fadicce/status/971332771867254785?ref_src=twsrc%5Etfw">March 7, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Needless to say, I was even more grateful to be flying Emirates on my way to my next stop, India!</p>
</description>
</item>
<item>
<title>A quick "Jump" to Sydney, Australia</title>
<link>https://joshlong.com/jl/blogPost/sydney-march-2018.html</link>
<pubDate>Tue, 6 Mar 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/sydney-march-2018.html</guid>
<description>
<h2>A Blessing in Disguise</h2>
<p>I woke up Wednesday the 28th of February prepared to get on a flight to Glasgow, Scotland. I was packed, ready to go. I even got out of bed, took a hasty shower, and talked to my partner Tammie about the type of plane and we talked about her plans while I was gone. I got to the breakfast bar and started eating, checking news and checking email. Several messages from my team's scheduler had come in, &quot;Don't leave! The visit with [ridiculously large bank's name redacted] has been cancelled!&quot; And that was that! Apparently, the UK was being deluged with <a href="https://www.cnn.com/2018/02/28/europe/uk-weather-snow-intl/index.html">a snow storm to rival all others</a>. The airports were, as far as I know, still working, but the customer conference itself had decided to cancel the event, feeling I suspect a bit of worry that the snow would make travel an unmitigated disaster for the incoming speakers. No problem! I didn't particularly want to be in that snow storm, anyway. So I called my travel agent and we moved things around. Things would be easier now. I could stay home another day, lazing in San Francisco. Tammie and I spent the requisite few hours in my condo's jacuzzi, of course, then visited some friends and soaked in the blue skies and comfortable weather. It was a hard job but somebody had to do it.</p>
<p>This extra day shaved off a bit of an onerous run from my travel agenda. The original plan was that I would fly from Glasgow, Scotland to Sydney, Australia. If you haven't done that run before, it's a <em>long</em> trip! I was looking at some thirty hours of travel. It's equivalent to going a few hours further east than Chinia and <em>then</em> going like ten hours south beyond south east Asia (like Singapore). As much as I would have liked the mileage, I don't need it <em>that</em> badly. I just passed the United 1K tier. United 1k is the top <em>listed</em> tier of travel. There is one more level above that, Global Services, which is invitation-only. There are no listed characteristics for this level, but I've heard that you need to be in the top 1% of all travelers in both miles and ticket spend to be invited. I have been invited for the last two years in a row. My point: I would've done the trip if there was a chance to serve the Spring community, but I'm not too sad that I didn't make it..</p>
<h2>When James Watters says &quot;Jump!&quot;..</h2>
<p>..I say &quot;how <em>far</em>?&quot; <a href="http://twitter.com/wattersjames">James</a>, of course, is a legendary SVP of cloud here at Pivotal and he wanted me in Sydney to talk to a customer. So, we fit the trip in a couple of weeks before the day. I was supposed to go from Glasgow to Dubai, with no trip to Sydney. Now, suddenly, the trip to Glasgow was out of the picture and I had more time to visit Sydney.</p>
<h2>&quot;Mardis Gras&quot; in Sydney</h2>
<p>The extra time gave me a bit of a buffer so I was able to get to Sydney early and meet some friends of the community. I arrived, as it happens, on &quot;Mardi Gras,&quot; which is an event that celebrates the LGBTQ community. It was <em>massive</em>. The whole country gets in on the action! It was heartening. Even Uber's map and Google map adapts to the route of the parade in the midddle of Syndey. Cher appeared and did a massive concert. The PM was tweeting about it (and he was there to meet Cher).</p>
<p><img src = "https://pbs.twimg.com/media/DYFYc9fVQAEB7pX.jpg"/></p>
<p>The spirit of the event spilled over into the costumes people wore (even relatively far away from the main event parade route)</p>
<p><img src = "https://pbs.twimg.com/media/DYFYc9hVwAAmHp6.jpg" /></p>
<p>Rock on Sydney. That was awesome.</p>
<h2>Michael Neale</h2>
<p>So as it happens the amazing <a href="https://twitter.com/michaelneale/">Michael Neale</a>, co-founder of Cloudbees and legend, lives in the Blue Mountains, near Sydney, and he was in town. We've interacted with each other for years on Twitter but I've never had the privilege of meeting, but this time, finally, we did! Cloudbees used to run an amazing platform, itself <a href="">called Cloudbees</a>, which competed, for a time, with Cloud Foundry and Heroku. It was an interesting technology with a devoted userbase that was ahead of its time. They retired the platform, itself, a few years ago and have since re-oriented on lifecycle management and deployment (continuous delivery, I suppose, would be the broader word to describe their focus) and tools like Jenkins, the majority of whose development Cloudbees sponsors.</p>
<p><img src = "https://pbs.twimg.com/media/DXWoVMIUQAAp0Dp.jpg" /></p>
<h2>James Dumay (and his dog, <em>Oddy</em>)</h2>
<p>We hung out and talked software, cloud platforms, continuous delivery and more, all of which was fun. At some point, though, a few snacks into our discussion one of Michael's friends, James Dumay, strolled by and motioned for us to join him. <a href="http://twitter.com/i386">James Dumay</a>, shown below, is an interesting character, so I followed, intrigued.</p>
<p><img src = "https://pbs.twimg.com/media/DXWpajRUMAENj74.jpg" /></p>
<p>I didn't quite know where, or why, but darnit, we were off! We walked a few blocks and and I found myself in James' house greeted by this friendliest of critters, Oddy.</p>
<p><img src = "https://pbs.twimg.com/media/DXWo_PaU0AAKFGl.jpg" /></p>
<p>We proceeded to the back and Oddy entertained all the partyers. I met a whole bunch of people and got to talk to some of the amazing engineers in the local scene, including James. There's a long and interesting Australian technology scene. Google have an office there. The majority of the amazing-for-its-time, but unfortunately now dead Google Wave project was developed there. There are a number of Red Hatters from there. And, of course, there's Atlassian. Everybody in the Australian technology scene, it seems, has at one point or another worked at Atlassian. Atlassian, of coourse, is one of the most successful Australian software companies. Their co-founders have variously been among the richest people on the planet. In the last 24 hours the <a href="https://www.smh.com.au/technology/aussie-tech-tycoons-join-world-s-richest-after-atlassian-soars-20180312-p4z3w8.html">two co-founders - Michael Cannon-Brookes and Scott Farquhar - joined Bloomberg's Richest people</a>.</p>
<p>It was an amazing party, surrounded by amazing technologists and community members. Thanks Michael.</p>
<h2>Dez Blanchfield</h2>
<p>The next day I got to connect with the legendary <a href="https://twitter.com/dez_blanchfield">Dez Blanchfield</a>. Dez is a friend of the community, an interesting center of gravity in Sydney, and yet another person with whom I've interacted for years on Twitter but was delighted to finally get the chance to meet. Dez came baring sweet and savory Australian gifts.</p>
<p><img src = "https://pbs.twimg.com/media/DYFhYgtX0AAZUq5.jpg" /></p>
<p>Dez is a force of nature. The man has a company that itself serves all sorts of verticals worldwide. His 200+ people organization helps companies make the leap across the digital divide. I learned a crapton talking to Dez, and look forward to working with him in the future. I appreciate all that we talked about, but I especially appreciate the <em>very</em> quick but amazing visit to the Sydney Harbour bridge. We jumped in his Audi and dashed across the bridge and took a few photos.</p>
<p><img src = "https://pbs.twimg.com/media/DYFlKjbXkAEWMDt.jpg" /></p>
<h2>David Julia</h2>
<p>Many years ago I traveled to Chicago to help the Pivotal Labs teams, then just ramping up on Spring Boot, get going. I met David, from Denver, who was working at the Chicago Pivotal Labs office. He was one of our legendary Pivots and he's been there, rising through the ranks, for years. He's been a local advocate for Spring and for Kotlin. He's been a reliable friend, and every time I'm in town we get dinner. I am a big David Julia fan. So, it was disappointing, but completely understandable, when I learned he had accepted a position as office director for the Pivotal Sydney office. Needless to say, I was elated to have the opportunity to catch up with an old friend.</p>
<p><img src ="https://pbs.twimg.com/media/DXhQF0pX0AApOc9.jpg" /></p>
<h2>Pivotal in Sydney</h2>
<p>We have a Pivotal office in Sydney and we work with the largest local companines helping them transform. For this trip I spoke to several different groups in the same, very large customer. It was an exhausting day but I spent an extra <em>two hours</em> talking to them on a number of different topics. We started early in the morning and ended up leaving after most of the office was dark and shutdown. What an amazing group.</p>
<p>It was a very productive 50 hours in Sydney and I look forward to returning to Australia in May, but, at this point, I had to get to Dubai...</p>
</description>
</item>
<item>
<title>Functional Reactive Web Endpoints in Spring Framework 5.0 and Spring Boot 2.0</title>
<link>https://joshlong.com/jl/blogPost/functional_reactive_endpoints_with_spring_framework_5.html</link>
<pubDate>Sun, 18 Feb 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/functional_reactive_endpoints_with_spring_framework_5.html</guid>
<description>
<p>Want to get started with Spring Framework 5's functional reactive web endpoints? Read on..</p>
<p>Spring Framework 5 introduced a new way to build HTTP endpoints that's similar to the handler model in Express.js in the Node.js world, or Sinatra in the Ruby world, or Ratpack in the Groovy world, or Spark Java in the Java world. The idea is simple: contribute a predicate that matches incoming requests and provide a callback or handler that produces the response when the predicate matches an incoming request. This is a particularly compelling approach in the world of lambdas, in Java 8 or later, or in more sophisticated languages like Groovy, Kotlin, or Scala.</p>
<p>Go to <a href="http://start.spring.io">the Spring Initializr</a>, choose the latest version of Spring Boot (version 2.0.RC1, as of this writing) in the dropdown menu on the top right, and then type 'Reactive Web' in the 'Search for Dependencies' text input field. You'll be given a default Maven project (though you could have selected Gradle). Open the Maven project in your iDE. IntellIJ will let you File &gt; Open &gt; select <code>pom.xml</code>. In Eclipse you can go to File &gt; Import &gt; Maven and then select the <code>pom.xml</code>. You'll be given a single class with a <code>public static void main</code> method in it and the <code>@SpringBootApplication</code> annotation on the Java class. Edit it, adding a single method, to make it look like this:</p>
<pre><code>package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
@SpringBootApplication
public class DemoApplication {
@Bean
RouterFunction&lt;ServerResponse&gt; routes() {
return RouterFunctions
.route(GET(&quot;/hi&quot;), request -&gt; ServerResponse.ok().body(Flux.just(&quot;Hi, world&quot;), String.class))
.andRoute(GET(&quot;/hello&quot;), request -&gt; ServerResponse.ok().body(Flux.just(&quot;Hello, world&quot;), String.class));
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
</code></pre>
<p>Run the Java program and open the browser at <code>/hi</code> and you'll see <code>Hello, world</code>.</p>
<p>Congratulations on building your first functional reactive endpoint with Spring Framework 5 (and Spring Boot 2.0).</p>
</description>
</item>
<item>
<title>IBM Index 2018</title>
<link>https://joshlong.com/jl/blogPost/index-2018.html</link>
<pubDate>Sat, 17 Feb 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/index-2018.html</guid>
<description>
<p>Next week I'll be speaking at the <a href="https://developer.ibm.com/indexconf/sessions/?cm_mmc=Search_Google-_-xIBM+Events_Global+Conferences-_-WW_US-_-+Index++IBM_Broad_&amp;cm_mmca2=10001376&amp;cm_mmca7=9060406&amp;cm_mmca8=kwd-433543267564&amp;cm_mmca9=d0a94465-7723-4671-a0b9-2bb8e14376a1&amp;cm_mmca10=249912056768&amp;cm_mmca11=b&amp;mkwid=d0a94465-7723-4671-a0b9-2bb8e14376a1&amp;cvosrc=ppc.google.&amp;cvo_campaign=000021SX&amp;cvo_crid=249912056768&amp;Matchtype=b#!?id=5557">new Index conference</a> talking about building reactive microservices with Spring Boot and Spring Cloud. I've never been to this conference but I have high hopes. It looks to be fun and I hope you'll join me there!</p>
</description>
</item>
<item>
<title>Devnexus 2018</title>
<link>https://joshlong.com/jl/blogPost/devnexus-2018.html</link>
<pubDate>Fri, 16 Feb 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/devnexus-2018.html</guid>
<description>
<p>Next week I'll also be speaking at the <a href="http://devnexus.com">2018 edition of the <em>epic</em> Devnexus show in Atlanta, GA</a> talking about <a href="https://devnexus.com/presentations/1884/">testing applications</a> (starting at individual beans in a Spring application and working [our way towards integration testing with microservices and consumer driven contract testing with Spring Cloud Contract) and then we'll look at building Kotlin-based applications <a href="https://devnexus.com/presentations/1887/">in <em>Bootiful Kotlin</em></a>. Join me!</p>
</description>
</item>
<item>
<title>"Bootiful Testing" in San Diego</title>
<link>https://joshlong.com/jl/blogPost/bootiful-testing-in-san-diego.html</link>
<pubDate>Thu, 15 Feb 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/bootiful-testing-in-san-diego.html</guid>
<description>
<p>My friends! Won't you join fellow Spring Developer Advocate Mario Gray and myself for a look at <em>&quot;Bootiful&quot; Testing</em> in <a href="">our upcoming San Diego Java User Group talk</a>?</p>
</description>
</item>
<item>
<title>Tangent: I Got to See Prince's Paisley Park and It Was Awesome!</title>
<link>https://joshlong.com/jl/blogPost/prince-in-minnesota.html</link>
<pubDate>Mon, 12 Feb 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/prince-in-minnesota.html</guid>
<description>
<p>I just had the privilege of visiting some customers in Minneapolis, Minnesota and while I was there I took some time to visit the compound that housed the late musician <a href="https://en.wikipedia.org/wiki/Prince_(musician)">Prince</a> 's production facilities (studios, offices, and more) and personal residence, Prince was a musical legend and a personal hero, so it was an amazing experience to visit that place. Sadly, photos are prohibited within the compount itself, so I don't have much to share here except that you should visit the place if you have the opportunity. It's humbling. Think about it - Prince built it in the mid '80s for TEN million dollars, out in the middle of <em>nowhere</em>! The place is <em>massive</em>!</p>
</description>
</item>
<item>
<title>JFokus 2018</title>
<link>https://joshlong.com/jl/blogPost/jfokus-2018.html</link>
<pubDate>Wed, 7 Feb 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/jfokus-2018.html</guid>
<description>
<p>I had the privilege of speaking at the Swedish Java conference, JFokus 2018, in beautiful Stockholm, Sweden. The conference is an amazing show because the community there tends to be enthusiastic and reflects a very diverse set of interests. I loved seeing old friends including JFokus founder Mattias Karlsson, Pratik Patel, Mark Heckler, Simon Ritter, and a million others besides! At the conference I had a reactive microservices workshop and a one-hour presentation.</p>
<p>The conference itself was rather uneventful, however, leaving Stockholm proved to be more of a challenge! My flight to Munich, where I was going to do a book signing (<a href="http://cloudNativeJava.io"><em>Cloud Native Java</em></a>) and meet some amazing Pivotal customers, was cancelled because Munich itself was uncharacteristically deluged with snow. It took some doing but I took a 7am flight out the next morning and made it to the OOP conference in Munich for a book signing, <em>barely</em>! That same night, exhausted, I took a train to Frankfurt and arrived in time to present to a few large customers there. Finally, on early Saturday, I flew out from Frankfurt and returned to San Francisco. What a journey!</p>
</description>
</item>
<item>
<title>Meeting the Master of Messages, Kafka Creator and CEO Jay Kreps</title>
<link>https://joshlong.com/jl/blogPost/kafka-and-confluence.html</link>
<pubDate>Thu, 1 Feb 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/kafka-and-confluence.html</guid>
<description>
<p>I had the privilege of meeting with the master of messages, Confluent CEO and Kafka-creator Jay Kreps to talk to him about the Spring ecosystem and its support for Kafka and to talk to him about what I think of as one of the most exciting things to happen to the cloud, Confluent's hosted, managed, and <a href="https://www.confluent.io/confluent-cloud/">ready-to-scale Kafka service</a>.</p>
<p>There's a lot of great opportunities for Spring developers working with Apache Kafka. <a href="https://projects.spring.io/spring-kafka/">Spring for Apache Kafka</a> provides the base integration for Spring developers wanting to work with Apache Kafka, <a href="https://github.com/spring-projects/spring-integration-kafka">Spring Integration supports for Apache Kafka</a> provides inbound and outbound adapters and messaging gateways for the Spring Integration EAI framework. <a href="https://cloud.spring.io/spring-cloud-stream/">Spring Cloud Stream provides binders for Apache Kafka</a> that make a matter of configuration and convention the connection between one microservice and another as connected through a messaging technology like Apache Kafka. <a href="https://cloud.spring.io/spring-cloud-dataflow/">Spring Cloud Data Flow supports easy coordination and orchestration of messaging pipelines using Apache Kafka</a>. There's a lot there! If you don't know where to start, it's my humble opinion that you should choose Spring Cloud Stream. Indeed, you can <a href="http://start.spring.io">go the Spring Initializr</a> and generate a new project that's ready to go!</p>
<div><img src = "media/jay-kreps-confluent.jpg" /></div>
<div> the amazing Jay Kreps </div>
<p>I learned a lot and can't wait to talk to more people about all things Kafka.</p>
</description>
</item>
<item>
<title>The Pivotal Insights podcast and "Developer Catnip"</title>
<link>https://joshlong.com/jl/blogPost/pivotal-insights-jan-2018.html</link>
<pubDate>Wed, 31 Jan 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/pivotal-insights-jan-2018.html</guid>
<description>
<p>I had a lot of fun talking to Pivotal storytellers and community marketing maestros <a href="http://twitter.com/dormaindrewitz">Dormain Drewitz</a> and <a href="http://twitter.com/jeffreyfkelly">Jeff Kelly</a> on the <em>Pivotal Insights</em> podcast talking about all things <a href="http://CloudNativeJava.io">cloud native, Spring and Cloud Foundry</a> in the <em>developer catnip</em> episode. Subscribe, <a href="https://content.pivotal.io/podcasts/the-developer-catnip-episode-ep-57">Listen</a>, and enjoy!</p>
</description>
</item>
<item>
<title>LavaOne 2018</title>
<link>https://joshlong.com/jl/blogPost/lavaone-2018.html</link>
<pubDate>Tue, 16 Jan 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/lavaone-2018.html</guid>
<description>
<p>I finished my visit to Germany and jumped on plane to Oahu, Hawaii, connecting through San Francisco. LavaOne was the first (and hopefully not the last!) conference I've had the privilege of visiting in Oahu, Hawaii. It was <em>stunning</em>! I admire anybody who's willing to listen to me (and any of the infinitely better other speakers) yammer on inside a conference hall when <em>paradise</em> lay just beyond the sliding glass door. Madness! These are some <em>dedicated</em> technologists! It was great to see and hang with the amazing technical community and to see old friends like Graal project ninja Chris Talinger, Java community legend Sharat Chandler, JRuby project lead and legend Charles Nutter, and Java EE community legend David Delabassee.</p>
<p>My friends, trust me, you need to <a href="http://twitter.com/LavaOne">add LavaOne 2019 to your conference calendar!</a></p>
<div><em>Just look at that!</em></div>
<div><img src = "/media/beach-lavaone2018-1.jpg" /></div>
<p><br/></p>
<div> <em>Don't you wish you'd bought your tickets and joined us?</em></div>
<div> <img src = "/media/beach-lavaone2018-2.jpg" /> </div>
<p>Luckily for the attendees (and for us!), the talks were recorded so the audience could go surfing and not missing anything :-)</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Check out all the sessions from <a href="https://twitter.com/LavaOneConf?ref_src=twsrc%5Etfw">@LavaOneConf</a><a href="https://twitter.com/hashtag/Java?src=hash&amp;ref_src=twsrc%5Etfw">#Java</a> <a href="https://twitter.com/hashtag/Microservices?src=hash&amp;ref_src=twsrc%5Etfw">#Microservices</a> <a href="https://twitter.com/hashtag/Serverless?src=hash&amp;ref_src=twsrc%5Etfw">#Serverless</a><a href="https://t.co/6lTiPzVZMJ">https://t.co/6lTiPzVZMJ</a> <a href="https://t.co/4ukfUjQpxV">pic.twitter.com/4ukfUjQpxV</a></p>&mdash; Java (@java) <a href="https://twitter.com/java/status/955826709198073856?ref_src=twsrc%5Etfw">January 23, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</description>
</item>
<item>
<title>Bootiful Germany in January 2018</title>
<link>https://joshlong.com/jl/blogPost/germany-jan-2018.html</link>
<pubDate>Sat, 13 Jan 2018 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/germany-jan-2018.html</guid>
<description>
<p>On the 10th of <a href="https://twitter.com/starbuxman/status/951014295994806272">this month I visited</a> the <a href="http://www.jug-muenster.de/cloud-native-java-mit-spring-boot-10-1-2018-1489/">Java User Group in Munster, Germany</a>, and had the privilege of presenting for three hours in a cold winter January evening to a full room full of passionate Java developers. It was the first time I got to show a lot of new, reactive features in Spring Boot 2.0 and Spring Cloud Finchley. I'm a big fan of anybodydy who chooses to stay late on a weekday and learn about the things I love to learn about, so <em>thank you</em>, Munster, for an amazing experience!</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Glad to be at <a href="https://twitter.com/Jug_MS?ref_src=twsrc%5Etfw">@Jug_MS</a> to watch <a href="https://twitter.com/starbuxman?ref_src=twsrc%5Etfw">@starbuxman</a> live in action 😉👍🏻 <a href="https://t.co/nOpEk5Bqhw">pic.twitter.com/nOpEk5Bqhw</a></p>&mdash; xlab iq (@xlabiq) <a href="https://twitter.com/xlabiq/status/951138815128850432?ref_src=twsrc%5Etfw">January 10, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Then, it was off to Solingen, Germany, for a visit to the Codecentric world headquarters where they hosted a <em>Cloud Native Java</em> day with yours truly, as the featured guest speaker. I loved the event, and the audience was <em>amazing</em>! I spoke to the group about tons of different things, for around six hours, well into the evening, past 19:00! This was the first time in 2018 that I got to talk to developers about a number of things, including reactive microservices with Spring Boot and Spring Cloud, Spring Cloud Function (our abstraction for working with function-as-a-service offerings like AWS Lambda, Openwhisk, or of course Pivotal's white-hot new function-as-a-service <a href="http://projectriff.io">platform Project Riff</a>). <a href="https://github.com/joshlong/cloud-native-day-codecentric-2018">The code for the event is here, if you're interested</a>.</p>
<p>I loved the preview video for the talk, shown below.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/4RNIBaoGzQ0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
<p>Codecentric are a consulting business that specializes in next-level software and they <em>truly</em> live and breath it. When you walk into their new and massive building, you're greeted with a friendly reception where you'll find a magazine that is, <em>of course</em>, all about code! (Naturally!) The billboard in front of the building features their logo against code on a backlight screen.</p>
<p>It was also a pleasure to see a demo of Codecentric's spinoff business, <a href="https://www.instana.com/"><em>Instana</em></a>, which is developing a post-cloud monitoring technology that just <em>knows</em> what to do in a containerized, microservices-aware world. I really like this technology and hope that more people will give it a go.</p>
</description>
</item>
<item>
<title>Scallops</title>
<link>https://joshlong.com/jl/blogPost/scallops.html</link>
<pubDate>Sun, 10 Sep 2017 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/scallops.html</guid>
<description>
<p>I was discharged yesterday, September 9th, 2017, from the United Christian Hospital (a public hospital) in Hong Kong after an overnight stay there. It started at a YOW! Hong Kong speaker dinner on Friday the 8th. The show was amazing, as you'd expect from any <em>YOW!</em> event, and I was particularly looking forward to the speaker's dinner with so many of my heroes and friends.</p>
<p>We arrived and slowly the food started appearing and I attacked it with my usual glee. First, the appetizers arrived. Lots of good choices and I tried them all. I particularly enjoyed the mushrooms and scallops. I ate a plate, and another besides. Dinner table conversation was, as you can imagine, world-class. I was sat next to Dr. Sengupta (a PhD, a hero and a genius, but not a medical doctor) and Joe Albahari. I turned to Joe and shared that my hands and feet were starting to itch. I'd felt such an itch on my hands before and didn't think much of it. Maybe I'd used an overly abrasive soap? Here, both my feet and my hands were suddenly burning! I even took my shoes off to rub my feet (in the socks i was wearing) on the carpet. I told Dr. Sengupta. We had a moments back and forth talking about how sometimes foods can cause mild reactions. I was Googling furiously, at this point.</p>
<p>I was OK for ten to fifteen minutes. I started feeling short of breath. But I'm used to feeling short of breath - I'm asthmatic! I don't leap to conclusions. If I have gas, I might be short of breath. I might pant from physical exertion. I might be short of breath. And besides, I always keep an emergency Albuterol rescue inhaler in my pockets. I never use it, though. My asthma is well managed thanks to daily intake of Dulera, a preventative medicine. The emergency inhaler was just that: for <em>emergencies</em>. So I took a few puffs. Nothing. The shortness of breath was getting worse. I raised the issue with Dave Thomas, the founder of the YOW! conference and a friend, and he had Cantonse- and Chinese-speaking aid Marlous Teh quickly get me some medical help.</p>
<p>We walked to the front of the restaurant. The ambulance was on its way. By this point I was super short of breath and my heart was pounding. I was struggling to take in oxygen so my heart was pumping harder. My extremities were tingling. I was dizzy. I was sitting there gasping for air, trying to answer whatever questions I could to make sure Marlous had enough context to talk to the medics when they arrived. Even if they spoke English, who's to say I would still be conscious?</p>
<p>I was terrified. I hadn't faced such an uphill asthma attack since I was a little boy. No matter what I did the airways closed. Apparently an antihistamine like Benadryl and an epinephrin pen would've been <em>really</em> handy then and there but I had left them in my backpack in the hotel.</p>
<p>I can't tell you how scared I was in this moment. Oxygen was thinning and there was no help in sight. There's a terror knowing that if I blacked out I might not wake up. What if the ambulance crashed just meters from the entryway and they all died? What if they were dispatched accidentally to the wrong mall? What if they arrived five minutes too late and I was too far oxygen starved, suffered severe brain damage after blacking out, and would never recover? What if?</p>
<p>The adrenaline was definitely in play, too. I feared my heart might give. It was <em>pounding</em>.</p>
<p>The medics arrived. Finally! They asked me if I had any allergies. I said that my mother had always told me that I had an allergy to Erythromycin, though I don't remember experiencing its effects. They said they were going to give me an epinephrine jab and I urged them to hurry. I asked again if they'd done it already. &quot;Please, hurry!&quot; They assured me they'd already jabbed me. I didn't feel anything in my arm. It was numb. No relief. I took puffs of whatever inhalers they gave me. They put me on a stretcher and rushed me to the hospital. I don't know how long I was in the ambulance but I was still, surprisingly, conscious. So while I was still struggling to breathe, it didn't seem to be getting worse. I was having a <em>really</em> hard time sustaining the deep breathing required to maintain, though. Anyway, time for a selfie!</p>
<p><img src="/media/hk-icu-2017/ambulance.jpg" width = "600" /></p>
<p>We arrived at the hospital. I was swarmed by five or six doctors. They were triaging me. Oxygen masks and inhalers and injections. A flurry of questions. Lots of questions! Allergies? Medical history? Do I drink? Smoke? And yes of course, I assured them as I was gasping for air, that I knew that - as a non-resident - I was looking at a <em>very</em> steep medical bill of almost $26,000 HKD were I to be admitted to the ICU (intensive care unit) for the night. Wait. What? $26,000 Hong Kong Dollars!! Oh.. wait... that's $3,350 United States Dollars or so. It was the only time I laughed all night. (In the United States, the ride in the ambulance can cost thousands all by itself!)</p>
<p>Anyway, about 45 minutes later I had the most incredible headache but I was breathing. They were shallow breaths, but they were consistent and markedly better than whatever passed for breathing an hour earlier. The doctors said my oxygen saturation was rising, and that I could be moved to the ICU. They put me on a stretcher and moved me to the ICU. They'd wired my poor different veins and arteries three different ways to various drips, had me breathing from an oxygen mask and rigged to a few different monitors.</p>
<p><img src ="/media/hk-icu-2017/icu.jpg" width = "600" /></p>
<p>At this point I was alive. Shallow breaths. But I was alive! Marlous was still waiting for me. The staff had given her my glasses and inhaler (which I had in my hands when the medics returned). I'd given her my phone while I was being triaged. She was talking to my girlfriend, making sure she knew what was happening to me. My phone was loosing power precipitously and I wanted to make sure my girlfriend had someone to talk to for status updates or, <em>gulp</em>, whatever.</p>
<p>It's at this point that I want to take a moment - an hour even! - to thank Marlous for everything she did. She was, and I'm not using this term figuratively, a <em>life-saver</em>. She called the ambulance, consoled me as I was suffocating in wait, waited with me in the ambulance to the hospital and helped translate back and forth between Cantonese and English (and whatever it is I understood). She waited hours in the hospital. Liaised with my girlfriend. She was back the next morning, once I was moved to the general ward, with a power bank and an iPhone cable. Thank you SO SO much, Marlous. I'll never, ever forget your composure and grace as you saved my life.</p>
<p><img src="/media/hk-icu-2017/marlous.jpg" width = "600" /></p>
<p>That morning, the speakers were supposed to board a flight to Singapore but I was still in Hospital. &quot;YOW!&quot; founder Dave Thomas and Marlous, so concerned for me, stayed behind. They extended my hotel stay in the eventuality I'd need to stay an extra night. They changed my flight accommodations. They came to visit, too, and to escort me to the hotel after I was finally discharged. Dave runs an amazing show. I've had the privilege of participating in five YOW! events thus far and they are world-class. He brings amazing, legendary speakers (well, except for me, of course!) from all around the world together in one place and makes sure the speakers and the attendees have an <em>amazing</em> time. He's a great technologist, show runner and businessman. He's also an insanely kind human being. This week he's been anxiously worrying about friends and family afflicted by hurricane Irma while running an amazing show in two countries and - because that's not enough - he spared no expense or time in making sure I was OK. Thank you, Dave.</p>
<p><img src="/media/hk-icu-2017/dave-thomas-and-me.jpg" width = "600" /></p>
<p>I wasn't too worried about the expense of saving my own life, either. I was not worried about a $3,500 medical bill. I am not rich but I am <em>very</em> fortunate and I had at least enough to pay that socked away if it came to that. But I knew it wouldn't come to that. You see, my Pivotal has graciously provided me with traveler's insurance. So I reached out to HR. I asked HR who to contact for the traveler's insurance. I called them, and they called their local Hong Kong partner who, when I last checked, were going to reach out to the hospital's billing department to provide a guarantee of payment. Lesson: make sure you've got traveler's insurance.</p>
<p>Where does this leave me now? I'm in Singapore, ready for the next event. I almost died and, if I'm honest, that still hangs over me. If you read this blog from the last week you'll see death and disease have hung over me a lot this last week. This close call didn't help. I find myself re-dedicated to the things I already loved. I want to make more friends. I want to learn more things. I want to share and grow in the communities that I love (like the Spring community). (I also want to secure an epinephrine pen and take a food allergy test as soon as I get back to the states!)</p>
<p>Relative to most other days in recent memory, this trip to the hospital wasn't my favorite. But it only serves to remind me how fortunate I am. I was a speaker at a <em>conference</em> in <em>Hong Kong</em> surrounded by people with a hundred+ combined years of experience pioneering software, some of whom I consider personal friends. The doctors said I suffered anaphylaxis - a severe, life-imperiling allergic reaction. But I was not alone. Good people and friends saw me through it. I have insurance and - failing that - the means to pay my meager medical fees. How lucky is that?</p>
</description>
</item>
<item>
<title>RIP Bobalee Johansen</title>
<link>https://joshlong.com/jl/blogPost/rip-bobalee-johansen.html</link>
<pubDate>Thu, 7 Sep 2017 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/rip-bobalee-johansen.html</guid>
<description>
<p>My mom's best friend of 30+ years, Bobalee Johansen, passed away. She was afflicted with Alzheimer's disease. She's always been a part of my family. She cradled me in the premie-ward when I was born two months early when she'd come and sit with my mom after work. She worked on computers as a technician and documentation writer (in the 1980s and 1990s!) She always had a computer around. She lived with us for a few wonderful years after she and her ex-husband Bill separated. During that time, she served as the family technician, helping us lurch slowly into the silicon age. She <em>lent</em> me her computer for a few months. Inarguably, I owe my career and good fortune to her as much as my parents (and, of course, random good luck). She was always surrounded by Disney figurines. She owned every Disney animated movie. She was such a childlike soul. She'd routinely whoop everyone at a game of <em>Trivial Pursuit</em>. She was lifetime master bridge player. She drove a fast car and <em>loved</em> an annual or bi-annual escape with my mother for a weekend in Las Vegas where they'd play the slots all night, sleep and then repeat. She raised two <em>amazing</em> girls. They'd even babysit my sister and me at times! Those two girls are now very successful women with families and children of their own. I am so pleased Bob was able to see that before her situation deteriorated. At some point in the last decade, poor Bob was moved to a home in Los Angeles. Both my parents went and visited (separately). It'd been years since she was able to hold a conversation or recognize friends or family. Bob was one of the many strong women who mentored me and shaped my future and I'll never, ever forget her. RIP Bob. I'll miss you.</p>
</description>
</item>
<item>
<title>My Father Has Dementia</title>
<link>https://joshlong.com/jl/blogPost/my-father-has-dementia.html</link>
<pubDate>Wed, 6 Sep 2017 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/my-father-has-dementia.html</guid>
<description>
<p>I got a phone call Monday evening that would change everything: the devastating news that my father had been diagnosed with dementia. I spent the entire night (before a long day before two large customers, no less!) of the news of the diagnosis talking to my father and talking to my elder brother Troy about next steps. I felt - I still feel - lost. I don't know much about dementia <a href="">so I asked on Twitter</a> for any insight people could share on the matter. What I got was a deluge of people responding with kindness, compassion and wisdom in both private and public channels. My tweets are synchronized with Facebook and so there, again, I was overwhelmed with oceans of kindness. Thank you, very much, everyone.</p>
<h3>Things I've Learned So Far</h3>
<p>I got lots of great tips from folks and from soaking up a book recommendation (called <a href="https://www.amazon.com/36-Hour-Day-Alzheimer-Disease-Dementias/dp/1455521159">the 36 Hour Day</a>):</p>
<p>Figure out <em>designated power of attorney</em> (DPOA) as soon as possible. A person will soon lose the ability to be trusted with their own destiny, legally. It's important that when there's a crisis, somebody entrusted is able to act.</p>
<p>Take time to be with that person. Take in their stories. Use the time to absorb their histories. It'll put both patient and family/friends more to remember and cherish.</p>
<p>Remember that a patient with dementia, which describes a category of diseases that impair the function of the brain, are not in control of themselves. They may say things or do things that hurt you. They may present a danger to themselves. They may react with fear to mundane things. It's important to keep their environments distraction- and surprise-free and their routines predictable. Don't contribute to their confusion. Symptoms reveal neuro-cognitive impairment. It's impossible to perfectly diagnose dementia without a post-mortem so - if in doubt - treat it.</p>
<p>Catastrophic reactions to mundane circumstances are common. A patient might become irate when asked to finish dinner. They might become difficult if they feel that they're not in control, or if they are scared.</p>
<p>Communication can be hard. Speech and comprehension are functions of the brain often impaired by dementia. Music can help animate otherwise idle minds. Communication is an essential part of ones sense of personal self. Aphasia means that people can't use words, or that they can't communicate.</p>
<p>It's important to stay ever vigilant for other conditions that may complicate dementia. Treat them quickly.</p>
<p>You should simplify a patient's daily routine and environment. They have a harder time processing stimuli. Remove household clutter. Don't leave surprises. Remove physical obstacles like throwaway rugs on which a patient might trip. Remove expired foods from the refrigerator.</p>
<p>A dementia patient loses their short term memory. It can be frustrating to answer the same question multiple times. Focus on, and savor, the moment. Accept who the patient is in the present moment. Also, use the older, long-term memories as a resource that you can dip into to inspire joy and happiness for both caretaker and patient.</p>
<p>Find enjoyable activity for a patient. Such activity can slow the onset of dementia. Even mundane things like folding laundry can be enjoyable. Folding laundry can be enjoyable. A 2011 study in the &quot;Inter Generational Psychiatric Journal&quot; found that continued 4exposure to pets, like a dog, can mitigate depression and increase alertness.</p>
<p>Figure out the patient's schedule. Many feel depressed and erratic as sunlight disappears. Many people feel depressed as the day progresses and sunlight disappears. This is called <em>sundowning</em>. Take advantage of this fact - help the patient sleep earlier in the day. Perhaps the medicine they take once daily makes them drowsy. Have them take this in the early evenings, instead of - for example - the mornings. Light therapy is known to help here, as well. Tart cherry juice contains sleep-inducing melatonin that helps a patient to get more sleep.</p>
<p>Patients are people. Non-verbal communication is critical. Caregivers should assure patients that they're still people, and are cared for. Touch is valuable here. It fosters sympathy and gratitude. They lose capacity for recognition of a giving touch.</p>
<p>Caregivers must have a solid strategy for self-care. It's hard to have to constantly look after someone else, in addition to whatever other duties life throws at you. It's an unforgiving chore and you must be prepared for it. If you risk burning out you jeopardize your own health as well as that of the patient. It's important to know that you can lean on family and friends to help ease y our burden and perhaps even shoulder some of the burden here.</p>
<p>You're not alone. Take the time to learn about resources that can help you. There are numerous websites, organizations and government aid programs that can serve you here. In the United States it's well worth learning about how Medicare and Medicaid can help people with dementia.</p>
<h3>The Road Ahead</h3>
<p>My family and I are coming to grips with this. Dad already suffers from macular degeneration - he's effectively blind. And he has neuropathy in his legs - he can't walk. He's 80. It's not easy for him to take up a new hobby or even move around without escort.</p>
<p>I bought him an Amazon Echo. I figure we'll set that up and he can play Audible books entirely with voice command. He can use it to get the latest news. I'm always keen on <a href="mailto:starbuxman@gmail.com">getting any ideas to make dad's life easier</a>, of course, so don't hesitate to reach out if you have experience in this situation.</p>
</description>
</item>
<item>
<title>Cloud Native Java is Done</title>
<link>https://joshlong.com/jl/blogPost/cloud_native_java_is_done.html</link>
<pubDate>Mon, 28 Aug 2017 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/cloud_native_java_is_done.html</guid>
<description>
<p>I'm so happy to say that, at long last, <em>Cloud Native Java</em> is done! <a href="https://www.amazon.com/Cloud-Native-Java-Designing-Resilient/dp/1449374646/ref=sr_1_1?ie=UTF8&amp;qid=1503905875&amp;sr=8-1&amp;keywords=cloud+native+java#customerReviews">Get it while it's hot!</a> We talk a bit more about it <a href="http://cloudnativejava.io/post/cloud_native_java_is_done/">on the official blog</a>.</p>
</description>
</item>
<item>
<title>Functionally Filtering a String in Java 8</title>
<link>https://joshlong.com/jl/blogPost/functionally_processing_a_string_in_java.html</link>
<pubDate>Sat, 18 Mar 2017 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/functionally_processing_a_string_in_java.html</guid>
<description>
<p>I was looking for cleaner ways to filter a string in Java 8. I figured this would be easy as Java has lambdas nicely woven into the APIs, and <code>String</code> instances are <em>already</em> immutable so it seemed like a home-run.</p>
<p>I knew how to do it in a trivial Python example:</p>
<pre><code>#!/usr/bin/env python
print ''.join([a for a in '123 a string !!!' if a.isalpha()])
</code></pre>
<p>I asked on Twitter:</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">“a string !!”.chars().boxed()<br> .filter(c-&gt; isLetter(c))<br> .map(i -&gt; Character.toString(Character.toChars(i)[0])) <br> .collect(joining(&quot;&quot;)) 😞</p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/843215420039553026">March 18, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>My initial attempt was valiant, but <em>very</em> complicated. A Java <code>String</code> returns an <code>IntStream</code> from the <code>chars()</code> method, so at some point there <em>has</em> to be a conversion to a <code>Character</code> - this means boxing and unboxing, <em>somewhere</em>.</p>
<p>Others replied suggesting that I use</p>
<p>..a regular expression:</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/phillip_webb">@phillip_webb</a> <a href="https://twitter.com/starbuxman">@starbuxman</a> <a href="https://twitter.com/java">@java</a> what&#39;s wrong with something like<br>&quot;a string !!&quot;.replaceAll(&quot;[^a-zA-Z]&quot;,&quot;&quot;)<br>?</p>&mdash; Ralf D. Müller™ (@RalfDMueller) <a href="https://twitter.com/RalfDMueller/status/843224851267641349">March 18, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>..or Kotlin:</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/starbuxman">@starbuxman</a> &quot;a string !!&quot;.filter(Char::isLetter)<br><br>Did I break your Java?</p>&mdash; Hadi Hariri (@hhariri) <a href="https://twitter.com/hhariri/status/843222983925792768">March 18, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>..or the <code>replace</code> method:</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/starbuxman">@starbuxman</a> You don’t fancy:<br><br>&quot;a string !!&quot;.replaceAll(&quot;\\W&quot;, &quot;&quot;)<br><br>?</p>&mdash; Nicky Mølholm (@moelholm) <a href="https://twitter.com/moelholm/status/843226794241200128">March 18, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>All of these are good ideas, but not quite what I wanted.</p>
<p>I was looking for trivial amounts of conceptual noise - something I could stare at and process, quickly. Maybe Python was the right thing, after all? So I tried embedding Jython (the Python language implementation on the JVM). This required a pesky, um, let's call it <em>utility</em> library (the entire Python language and runtime) whose Maven coordinates are <code>org.python</code> : <code>jython</code> : <code>2.7.1.b3</code> :</p>
<pre><code>import org.python.util.PythonInterpreter;
import java.util.Properties;
public class JythonApplication {
public static void main(String[] args) {
Properties properties = new Properties();
properties.put(&quot;python.import.site&quot;, &quot;false&quot;);
PythonInterpreter.initialize(System.getProperties(), properties, new String[0]);
System.out.println(new PythonInterpreter().eval(&quot;''.join([a for a in '123 a string !!!' if a.isalpha()])&quot;));
}
}
</code></pre>
<p>Not bad! (I'm only kidding. Half kidding, anyway.) <em>Some</em> people liked it, alright? Jeez! :D</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/rotnroll666">@rotnroll666</a> <a href="https://twitter.com/phillip_webb">@phillip_webb</a> <br>System.out.println(new PythonInterpreter().eval(&quot;&#39;&#39;.join([a for a in &#39;123 a string !!!&#39; if a.isalpha()])&quot;)); :D</p>&mdash; Josh Long (龙之春, जोश) (@starbuxman) <a href="https://twitter.com/starbuxman/status/843226085118554112">March 18, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>The following example does a bit less gymnastics than my previous example, and is functional, so I suppose it's the best solution so far. I learned a lot from this example, too.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/phillip_webb">@phillip_webb</a> <a href="https://twitter.com/starbuxman">@starbuxman</a> Not sure if more clearer but one functional alternative would be <a href="https://t.co/RNFOvLSnAi">pic.twitter.com/RNFOvLSnAi</a></p>&mdash; Tomche Delev (@tdelev) <a href="https://twitter.com/tdelev/status/843220643760037888">March 18, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
</description>
</item>
<item>
<title>Travel is Fatal to Prejudice</title>
<link>https://joshlong.com/jl/blogPost/travel_is_fatal_to_prejudice.html</link>
<pubDate>Tue, 20 Dec 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/travel_is_fatal_to_prejudice.html</guid>
<description>
<p>My friend <a href="https://twitter.com/headius/status/811092321169195008">Charlie Nutter</a> shared this great Mark Twain quote on Twitter, and I want to capture it here.</p>
<p>&quot;Travel is fatal to prejudice, bigotry, and narrow-mindedness, and many of our people need it sorely on these accounts. Broad, wholesome, charitable views of men and things cannot be acquired by vegetating in one little corner of the earth all one's lifetime.&quot; ―Mark Twain, <em>The Innocents Abroad/Roughing It</em></p>
<p>As we wobble across the finish line of this horrendous year, I hope you'll keep that quote in your heart.</p>
</description>
</item>
<item>
<title>The Version Controlled Operating System</title>
<link>https://joshlong.com/jl/blogPost/the-version-controlled-os.html</link>
<pubDate>Sat, 15 Oct 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/the-version-controlled-os.html</guid>
<description>
<p>I hate having to remember which packages on each new operating system install. I keep a small script called josh-env.sh in a private Github repository (remember, Github now has unlimited private repositories!) that I then make sure is present in my home directory. The script does two things: it contributes important environment variables (typically the environment variables I use to run builds, as I might on the CI server) that are themselves version controlled, and it records the contents of my Homebrew and Homebrew Cask installations into text files and then <code>git commit</code> and <code>git push</code> those files if the contents have changed.</p>
<pre><code>#!/bin/bash
c=`pwd`
d=`dirname $0`
## contribute environment variables
source $d/josh-env-vars.sh
## record homebrew
mkdir -p $HOME/bin
export PATH=$PATH:$HOME/bin
# lets make sure that this and the brew manifest of the OS itself are all version controlled
BC=$d/brew-cask.txt
B=$d/brew.txt
brew cask list &gt; $BC
brew list &gt; $B
cd $d
n=`date`
git add $B
git add $BC
git commit -a -m &quot;updated brew manifest $n.&quot;
last_commit_status=$?
if [ $last_commit_status -eq 0 ]; then
echo &quot;changes detected on $n. running git push.&quot;
git push;
fi
cd $c
</code></pre>
<p>Naturally, this script needs to be run at somepoint. It's a cheap operation so I run it on every new user shell, inside <code>$HOME/.zshrc</code>:</p>
<pre><code>...
source $HOME/josh-env/josh-env.sh
...
</code></pre>
<p>This way, if for any reason I need to restore a system tomorrow, I can <code>git clone</code> the private project on a new machine and restore everything. It might be as simple as:</p>
<pre><code>#!/bin/bash
cat brew.txt | while read l ; do brew install $l ; done
cat brew-cask.txt | while read l ; do brew cask install $l ; done
</code></pre>
<p>I keep everything <em>heavy</em> weight inside of Dropbox, so that restores naturally. I keep all code inside Github, and those restore naturally. This ensures that the remaining personalizations to my environment are recorded and restored as well.</p>
</description>
</item>
<item>
<title>Converting `.mp4` to `.gif`</title>
<link>https://joshlong.com/jl/blogPost/converting_mp4s_to_gifs.html</link>
<pubDate>Fri, 14 Oct 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/converting_mp4s_to_gifs.html</guid>
<description>
<p>I know there are probably a million worthy solutions to this, but I've found one that works so I thought I'd share it with others:</p>
<pre><code>#!/bin/bash
mp4_to_gif (){
fn=$1
frames=`mktemp -d`
mkdir $frames
out=$2
ffmpeg -i $fn -vf scale=320:-1:flags=lanczos,fps=10 $frames/ffout%03d.png
convert -loop 0 $frames/ffout*.png $out
rm -rf $frames
}
mp4_to_gif dogs.mp4 dogs.gif
</code></pre>
<p>Make sure you've got <code>imagemagick</code> and <code>ffmpeg</code> and <code>ghostscript</code> installed on your machine. On OS X/macOS Sierra: <code>brew install imagemagick ffmpeg ghostscript</code> will do the trick. Why is this useful? Well, reusing funny content on Twitter for posts to Google Hangouts is my use case. Perhaps there are others..</p>
</description>
</item>
<item>
<title>Can You Recommend Some Worthy Alternatives to Dropbox?</title>
<link>https://joshlong.com/jl/blogPost/alternatives-to-dropbox.html</link>
<pubDate>Sun, 10 Jul 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/alternatives-to-dropbox.html</guid>
<description>
<p>I need some recommendations for worthy alternatives to Dropbox. I've found a few but would love some input and recommendations as this will, no doubt, be <em>very</em> painful.</p>
<p>Here's the background on my motivations for leaving. I have an old credit card on file with Dropbox. It's about to expire and a few months ago Dropbox started sending me emails telling me to update it so as to ensure uninterrupted service. Fine. So, I logged into the website on iOS and tried to change my Credit Card and it gave me a cryptic message saying there was an error. It sometimes showed me an error saying it couldn't change the country code. I thought it might just be shite JavaScript and so tried it on Chrome on the Desktop. Same nonsense. I sent them an email asking for help and they responded, days later, that my country was Germany and that there's no way to change the country code without downgrading my account. I've never lived in Germany, nor had a credit card or a billing address, in Germany. It happened, however, that I was in Germany at the time I was trying to update my credit card. (I am not sure if this bit's related). So, after I made them promise me nothing would be lost if i briefly downgraded, I went ahead and did it. Logged in to the site, and... the <em>Change Payment</em> option didn't exist! There's no way to specify a new credit card! Or any credit card! All this after a week of emails back and forth and an hour or two trying to fiddle with the credit card dialog. They can seamlessly sync my files to all manner of devices, anywhere in the world, but updating the country in the credit card dialog? IMPOSSIBLE! If they don't want $200/yearly, that's fine, I'll just go somewhere else.</p>
<p>So, what can you recommend? <a href="http://twitter.com/starbuxman">Please let me know on Twitter</a></p>
</description>
</item>
<item>
<title>A Discussion on Distributed State and Microservices</title>
<link>https://joshlong.com/jl/blogPost/an-email-on-distributed-state.html</link>
<pubDate>Sun, 26 Jun 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/an-email-on-distributed-state.html</guid>
<description>
<blockquote>
<p>Note: I was recently asked about CQRS and its role in buiilding microservices. I threw together an email - high level, devoid of specific technologies (like Spring Cloud Stream, Axon, or Eventuate) that looks at some of the patterns for connecting distributed systems. I figure I may as well share it here, briskly edited.</p>
</blockquote>
<p>Hi,</p>
<p>I believe CQRS to be one (though, interesting) dimension tot he challenge of modeling distributed state. The challenge is, given that microservices stand up APIs in front of data, how do we connect these datasets? How do we get services to agree upon distributed state? this isn't a new problem. there are quite a few nice patterns and approaches for dealing w/ this.</p>
<p>the CAP theorem offers an interesting, but flawed, mental model when talking about distributed state. nominally, it states: given availability (A), consistency (C) and partitionability (P), you can only have 2/3. Specifically, you can have A+C (but not P) or PA (but not C). The truth, however, is that very few systems need perfect CAP 100% of the time. If you're willing to accept gradients then you can have all 3 at the same time. One way to introduce a gradient is temporal decoupling, or just <em>time</em>. If I'm ok with a bit of time, then I <em>can</em> (given time) guarantee consistency and availability. Most systems are OK w/ this.</p>
<ul>
<li>
<p>the X/Open protocol / distributed transactions (in Java, this is supported through the JTA API): this is a <em>terrible</em> idea. it introduces a giant SPOF and, as most of the resources w/ which we'd like to work today (HTTP APIs or messaging APIs powered through the likes of WebSockets, AMQP, or Apache Kafka) don't implement the X/Open protocol, it's also moot/irrelevant.</p>
</li>
<li>
<p>eventual consistency: this is messaging. Use messaging to introduce temporal decoupling. Hack CAP by introducing the gradient of time. In our case, it's RabbitMQ or Apache Kafka..</p>
</li>
<li>
<p>Saga pattern: define a set of interleavable (eg, A doesn't <em>have</em> to come before B) transactions (eg: book a hotel, book a car, book a flight) w/ semantic (that is to say, they <em>undo</em> the transaction and return the system to a semantically consistent state: unbook hotel, unbook flight, unbook car) compensatory TXs. A compensatory transaction must be idempotent; the system <em>must</em> be able to retyr the compensatory transaction until it succeeds. The Saga pattern was defined in the 80s to model <em>long-running</em> transactions. Naturally, a network gap - algorithmically - looks the same as time so it applies perfectly to distributed systems work today.</p>
</li>
<li>
<p>CQRS: is a more sophisticated version of eventual consistency. It recognizes that reads are intrinsically different from writes and encourages a division of the models used to support them. The technology used to report on data could be optimized for that task (fast-read data grids like Geode or Redis) where the tech used for writes might be optimized for that (a transactional DB like Neo4J or PostgreSQL). If the read and the write databases are distinct then the logical consequence is that they must be synchronized, and this usually involves introducing messaging (eventual consistency). If you have enough components whose state needs to be synchronized it's natural to introduce an event bus so that all interested parties can consume events as necessary. This is where you get into event sourcing. An event store holds stacked events (think of them like layers on a git file system) and whenever a new record is introduced a message is published on the bus for all interested consumers who then update their own internal read cache of the data.</p>
</li>
</ul>
<p>So, how's a microservice benefit from CQRS? Microservices represent bounded contexts, silod' bits of data behind an API. Clients talk to the API, not the data itself, and the API can hide the nuances of whether the data is being read from Geode or written to MongoDB. The microservice only knows about the data in its domain, of course, so we need to solve the problem of composing data from different sources in a transactional way. CQRS is a logical fit here, especially with event sourcing.</p>
<p>Hope this helps..</p>
</description>
</item>
<item>
<title>OSCON 2016</title>
<link>https://joshlong.com/jl/blogPost/oscon-2016.html</link>
<pubDate>Sun, 1 May 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/oscon-2016.html</guid>
<description>
<p>I regretfully share that I've had to drop out of OSCON 2016. I've wanted to be back at OSCON, especially in light of its move to Austin, and I tried very hard to reschedule but it was not to be. That said, it looks like you'll be in good hands! I've had my friend <a href="https://twitter.com/kennybastani">Kenny</a> substitute for me at the <em>Cloud Native Workshop</em> workshop and it looks like <a href="https://twitter.com/jbaruch">Baruch</a> will be able to give another talk even though I've had to drop out of our joint submission. I'm so very sad to miss this year's show! It looks <em>amazing</em>! Here's to next year..</p>
</description>
</item>
<item>
<title>Craft Conf 2016</title>
<link>https://joshlong.com/jl/blogPost/craftconf-2016-trip-review.html</link>
<pubDate>Sat, 30 Apr 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/craftconf-2016-trip-review.html</guid>
<description>
<p>This was my first Craft Conf. I have been invited every year since the debut and have always had to decline in order to make the Great Indian Developer Summit (a great show to be sure!), to which I was previous committed. This year, I <em>finally</em> remembered to give it a shot and I am <em>so</em> glad I did! I met many of my heroes and heroines and see <em>many</em> old friends all in one dense, information packed show. The content was superb, the endless Nespresso and beer made the occasional intermissions go over well, and (incredibly!) the wi-fi was top-notch, as well. It was a genuinely good show.</p>
<p>There were two parts that weren't as great as they should be:</p>
<p>First, the electricity for the room I was in failed. I was one of the first session talks after the keynote on the first day, so the whole thing hadn't yet been proven. This whole show was in an amazing <a href="http://www.vasuttortenetipark.hu/"><em>train museum</em>, Magyar Vasúttörténeti Park</a>, and so assembled with astonishingly good results just days before the big event! Unfortunately, this meant that while the engineers spent the first 25 minutes of my 40 minute slot trying to get the stage lighting and display working, I was left on stage just chatting with the audience. I tried to make up for it, later, in a smaller supposedly hands-on workshop which seemed to go over alright. The first session was 40 minutes. The later session was to be a hands-on session of 90 minutes. I was told I could repeat the earlier talk then, which I did. I hope it resonated with people. I would've liked to have been able to take the audience that was in my room with me on a journey, as planned, though I'm pleased people showed up later. Oh well..</p>
<p>Also, I was really keen on finally meeting <a href="http://twitter.com/aphyr">Kyle Kingsbury</a>, author of <a href="https://aphyr.com/tags/Jepsen">the <em>Call Me Maybe</em> series of blogs</a> that disect the availability, partitionability and consistency qualities of distributed systems in <em>excruciating, hilarious</em> detail. Unfortunately, he fell ill with an ear infection before boarding his flight for Budapest. I don't know if you've ever had an ear infection but the <em>last</em> thing you want to do is change atmospheric pressure! It's excruciating enough as it is! Obviously, I wish him a speedy recovery and look forward to seeing his streamed presentation this Saturday in the AM PST time. (Follow <a href="http://twitter.com/aphyr">him on Twitter for more</a>!)</p>
<p>I took away a lot of great ideas from this show. A lot of great themes also resonated:</p>
<ul>
<li>agility is a way of working that is independant of any prescribed processes. Ignore the dogma.</li>
<li>an agile organization learns, deploys and fails faster. This is a win.</li>
<li>automation around builds, testing, production, and more were - as far as any of the speakers were concerned - long since arrived.</li>
<li>Microservices, microservices, and microservices</li>
</ul>
<p>Also, <a href="https://twitter.com/search?q=%40starbuxman%20%23craftconf&amp;src=typd">I played Craft Conf selfie-Pokémon</a> (gotta catch 'em all!) and took as many photos with friends as possible! :-)</p>
<table>
<tr>
<td><img src="/media/craftconf_francesc.jpg"/><a href="http://twitter.com/francesc">Francesc Campoy</a></td>
<td><img src="/media/craftconf_grepory.jpg"/><a href="http://twitter.com/grepory">Greg Poirier</a></td>
<td><img src="/media/craftconf_hadi_hariri.jpg"/><a href="http://twitter.com/hhariri">Hadi Hariri</a></td>
</tr><tr>
<td><img src="/media/craftconf_kirk_pepperdine.jpg"/><a href="http://twitter.com/kcpeppe">Kirk Pepperdine</a></td>
<td><img src="/media/craftconf_littleidea_bridget.jpg"/><a href="http://twitter.com/littleidea">Andrew Clay Shafer</a> and <a href="http://twitter.com/BridgetKromhout">Bridget Kromhout</a></td>
<td><img src="/media/craftconf_michael_feathers.jpg"/><a href="http://twitter.com/mfeathers">Michael Feathers</a></td>
</tr><tr>
<td><img src="/media/craftconf_todd_l_montgomery.jpg"/><a href="http://twitter.com/toddlmontgomery">Todd L Montgomery</a></td>
<td><img src="/media/craftconf_trisha_gee.jpg"/><a href="http://twitter.com/Trisha_Gee">Trisha Gee</a></td>
<td><img src="/media/craftconf_venkat_subramaniam.jpg"/><a href="http://twitter.com/venkat_s">Dr. Venkat Subramaniam</a></td>
</tr><tr>
<td><img src="/media/craftconf_adrian_cochroft.jpg"/><a href="http://twitter.com/adrianco">Adrian Cochroft</a></td>
<td><img src="/media/craftconf_dan_north.jpg"/><a href="http://twitter.com/tastapod">Dan North</a></td>
<td><img src="/media/craftconf_danielbryant_charleshumble.jpg"/><a href="https://twitter.com/danielbryantuk">Daniel Bryant</a> and <a href="http://twitter.com/charleshumble">Charles Humble</a></td>
</tr><tr>
<td><img src="/media/craftconf_jessie frazelle.jpg"/><a href="http://twitter.com/jessfraz">Jessie Frazelle</a></td>
<td><img src="/media/craftconf_kelsey_hightower.jpg"/><a href="http://twitter.com/kelseyhightower">Kelsey Hightower</a></td>
<td><img src="/media/craftconf_shafer_allspaw_jezhumble.jpg"/><a href="http://twitter.com/littleidea">Andrew Clay Shafer</a>, <a href="http://twitter.com/allspaw">John Allspaw</a> and
<a href="http://twitter.com/jezhumble">Jez Humble</a></td>
</tr>
</table>
<p>I loved the speaker's gift, as well!</p>
<p><img src="/media/craftconf_speaker_gift.jpg" /></p>
<p>This show was a <em>lot</em> of fun and I certainly hope to be invited back next year! In the meantime, though, I am <em>very</em> excited to be returning to San Francisco (where I live!) in a few short hours, for the first time since the last week of January!</p>
</description>
</item>
<item>
<title>Pieter Hintjens</title>
<link>https://joshlong.com/jl/blogPost/pieter-hintjens.html</link>
<pubDate>Mon, 25 Apr 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/pieter-hintjens.html</guid>
<description>
<p>The amazing <a href="https://en.wikipedia.org/wiki/Pieter_Hintjens">Pieter Hintjens</a> is not well. He's contributed a lot to the open-source community, notably to the AMQP protocol (which underpins RabbitMQ) and to ZeroMQ. He's talked about his state in a blog called <a href="http://hintjens.com/blog:115"><em>A Protocol for Dying</em></a>. If you're a fan, perhaps now's your chance to let him know. If you're not a fan, then perhaps you could investigate some of his work? He <a href="http://zeromq.org/">leads the ZeroMQ project</a>, wrote <a href="http://hintjens.com/books">a few books</a>, and did a lot of great videos. I really liked this one <a href="http://www.ustream.tv/recorded/61450822">from 2015's Craft Conf</a>. I'll be at Craft Conf (starting today, actually) this year and I'll be thinking of Pieter.</p>
</description>
</item>
<item>
<title>Belgium, on March 22, 2016</title>
<link>https://joshlong.com/jl/blogPost/belgium-03-22-2016.html</link>
<pubDate>Tue, 12 Apr 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/belgium-03-22-2016.html</guid>
<description>
<p>I was in Paris the week of March 22nd, 2016, with customer meetings and meetups in both Brussels, Belgium and Paris, France scheduled. Indeed, I arrived in Paris, and was due to travel, <em>by train</em>, the morning of March 22nd, 2016, to speak with customers and <a href="https://www.eventbrite.com/e/ordina-jworks-hands-on-cloud-native-journey-workshop-with-josh-long-tickets-22864131232">to appear at a meetup that evening</a>. I woke up in the morning, in Paris, to a barrage of tweets and text messages from concerned family and colleagues (some of whom may as well be family); the unspeakable had happened. Earlier that morning, terrorists, cowards, attacked the Brussels station and murdered dozens of innocent people. I was encouraged to stay in Paris. My customers understandably evacuated their local staff and sent them home. We rescheduled the in-person meetup and directed all the would-be attendees to join us for a remote webinar which was well-received. I was not among the victims of that horrific day. I was safe, far away, in Paris, France. I was due to travel there, though. I know, logically, that I was never at risk because of the schedule. It disturbs me that it was as simple as the schedule: my travel was scheduled eight hours later. That's it. I am here because I had morning obligations in Paris, and the victims of that nightmare didn't. I am so very fortunate. I am so very sad those lost were lost. I am so sorry. Nothing can make right what happened.</p>
<p>My friend, colleague, and Belgian Stéphane Nicoll, said it best:</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Dear terrorists, greetings from Belgium! You can shake us but you will never break us <a href="https://twitter.com/hashtag/ilovebelgium?src=hash">#ilovebelgium</a> <a href="https://t.co/5zrnMcrx8w">pic.twitter.com/5zrnMcrx8w</a></p>&mdash; Stéphane Nicoll (@snicoll) <a href="https://twitter.com/snicoll/status/712270099235921920">March 22, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
</description>
</item>
<item>
<title>I Wish I Could've Made JPoint</title>
<link>https://joshlong.com/jl/blogPost/sorry-about-jpoint.html</link>
<pubDate>Mon, 11 Apr 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/sorry-about-jpoint.html</guid>
<description>
<p>I was scheduled to appear at <a href="http://javapoint.ru/">JPoint</a>, a conference in <a href="https://en.wikipedia.org/wiki/Novosibirsk">Novosibirsk</a>, Russia. I was <em>very</em> excited to go, I purchased tickets and - because my schedule is <em>very</em> busy and I spend very few contiguous days in the US before in which I could secure a VISA, before having to venture out to parts unknown, I had to commit more than $800 USD towards securing an expedited VISA through a travel agent. Which I did. And then came the big day when I was to board a flight from Los Angeles to Russia, via China. It was a long-haul flight but I was excited. I got to the airport late as I was stuck in traffic in Los Angeles. The front desk was already closed and I couldn't even proceed to security. For some reason, the front desk wouldn't let me check in online enroute, so by the time I got there, there was no way to checkin, either. It was so frustrating. I called my travel agent and explained the situation and - miraculously - the agent with whom I was speaking found a route that left later, got me there earlier and was cheaper! Amazing! I had her book it! I waited in the airport, already exhausted, only to amble to the checkin counter (I couldn't even checkin and get to a lounge or somewhere comfortable for hours, before) only to discover the flight was to Moscow. Not Novosibirsk, the destination city. I scrambled. Was there a flight that connected from Moscow? Surely it couldn't be that big a delta?? It was. It was equivalent to landing in Los Angeles when I had a meeting in New York City where the timezone was three hours ahead. It was the wrong flight and it was too late to find an alternative flight, Star Alliance or not. This was so very frustrating and I wish the situation had been different. I am sorry, and I hope that, next time, things are better.</p>
</description>
</item>
<item>
<title>Annoying "Accept Incoming Requests" Dialog when Using IntelliJ IDEA on OS X</title>
<link>https://joshlong.com/jl/blogPost/accept-incoming-request-intellij.html</link>
<pubDate>Wed, 3 Feb 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/accept-incoming-request-intellij.html</guid>
<description>
<p>I recently got a new machine and did a <code>brew cask install intellij-idea</code> and then quickly went to a dozen different customer meetings. When the dust finally settled, I realized I was being prompted by OS X's firewall and security subsystem to confirm that IntelliJ could accept incoming connections on <em>every</em> launch of IntelliJ, as shown here:</p>
<p><img src="/media/accept-all-incoming-connections.png"/></p>
<p>Lazy, and in sufficient pain as to warrant a Tweet, I asked if anybody knew of a way around this issue. I was given two interesting replies. First, we <a href="https://youtrack.jetbrains.com/issue/IDEA-150782">should watch and vote on this issue on the IntelliJ tracker</a> and <a href="https://twitter.com/damian_bl/status/694891546462797824">second</a> (thanks <em>so much</em> <a href="http://twitter.com/damian_bl">@damian_bl</a>!) that if I wanted to fix it in the meantime <a href="https://www.igorkromin.net/index.php/2015/07/05/fix-the-do-you-want-the-application-intellij-idea-14-ceapp-to-accept-incoming-network-connections-prompt/">I could force it to resign itself</a>:</p>
<pre><code>sudo codesign --force --deep --sign - /opt/homebrew-cask/Caskroom/intellij-idea/15.0.2/IntelliJ\ IDEA\ 15.app
</code></pre>
<p>That's all it took! On the next restart, I was prompted to confirm acceptance (one last time), and then not since have I had to confirm it.</p>
</description>
</item>
<item>
<title>Spring Cloud Guides</title>
<link>https://joshlong.com/jl/blogPost/spring-cloud-guides.html</link>
<pubDate>Sat, 30 Jan 2016 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/spring-cloud-guides.html</guid>
<description>
<p>Kenny and I have been hard at work on the O'Reilly <em>Cloud Native Java</em> book, and Phil and I have been hard at work on the updated <em>Building Microservices with Spring Boot LiveLessons</em> for the more in-depth introductions to Spring Boot and Spring Cloud, but I am <em>very</em> happy to report that we on the Spring team <em>finally</em> started to add guides to the <a href="http://spring.io/guides">Spring Guides section</a> on <a href="http://spring.io/guides/gs/service-registration-and-discovery/">service registration and discovery</a>, <a href="http://spring.io/guides/gs/routing-and-filtering/">Zuul-based microproxies for routing and filtering</a>, <a href="http://spring.io/guides/gs/circuit-breaker/">circuit breakers</a>, and <a href="http://spring.io/guides/gs/centralized-configuration/">centralized configuration</a>! Get 'em while they're hot!</p>
</description>
</item>
<item>
<title>Tech Tip: Getting Started with Spring Boot</title>
<link>https://joshlong.com/jl/blogPost/tech_tip_geting_started_with_spring_boot.html</link>
<pubDate>Fri, 27 Jun 2014 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/tech_tip_geting_started_with_spring_boot.html</guid>
<description>
<p>Spring Boot is a convention-over-configuration <a href="http://spring.io/projects/spring-boot">centric approach to application development with Spring</a>.</p>
<p>There are a few ways to get started.</p>
<p>In principal, the easiest way to get started is to just reuse somebody else's handcrafted build file and project setup. There are code-generators that make this easy. The Node-ecosystem tool <code>yo</code> offers a code-generator <a href="http://jhipster.github.io/"> called <code>generator-jhipster</code></a>. The projects generated with JHipster are web applications built using Maven, Spring, and Angular.js. The Groovy-language ecosystem codegenerator <a href="https://github.com/pledbrook/lazybones">Lazy Bones</a> can code-generate Spring Boot applications for you, as well.</p>
<p>For me, nothing beats the <a href="http://start.spring.io">Spring Initializr</a>. It's simply a small form that's pre-filled out with useful values. You might make sure to specify Java 1.8, and check the boxes for <code>Web</code>, <code>JPA</code> (or any of the other supported data-access technologies like MongoDB), and <code>Actuator</code>. This is a safe first-application. Once you've specified your Java revision (you <em>are</em> on Java 1.8, aren't you?), specify the type of project you'd like. Many people will know what to do with the default, a <code>Maven Project</code>. This will be importable into any IDE, straight-Eclipse, IntelliJ (Community or Ultimate), NetBeans, etc. I'd leave the version ( - the latest stable release) and the project type set to the defaults. Click <code>Generate</code> to download a an archive. Unzip it and then import it into your favorite IDE as a Maven project.</p>
<p>If you're using our open-source Eclipse distribution <a href="https://spring.io/tools/sts">Spring Tool Suite (STS)</a>, there are many ways to get started. We base STS on the latest-and-greatest cut of the Eclipse Java EE distribution, so it represents a stable, well-integrated distibution of Eclipse. The Spring Tool Suite provides extra tools and niceties. One such nicety is a dialog within the IDE that acts as a front for the Spring Initializr. It's nice skipping the download, unzip, and import steps!</p>
<p>The <a href="http://spring,io/guides">spring.io guides</a> provide easy-to-digest introductions to using Spring (or Spring ecosystem technologies). Each guide is backed by a Github repository that demonstrates the finished project as well as provides a base template that you can fill out when completing the guide. There's a nice feature in STS that lets you import a <em>Getting Started</em> guide directly from the IDE, by going to <code>File</code> -> <code>New</code> -> <code>Import Spring Getting Started Content</code>. This saves you the <code>git clone</code>, and IDE-import.</p>
<p>I've <a href="//www.youtube.com/embed/p8AdyMlpmPk">put together a video that shows what it looks like to use the tools in Spring Tool Suite (STS)</a>,</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/p8AdyMlpmPk" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>Spring Integration Adapters, Gateways, and Channels</title>
<link>https://joshlong.com/jl/blogPost/spring_integration_adapters_gateways_and_channels.html</link>
<pubDate>Fri, 6 Jun 2014 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/spring_integration_adapters_gateways_and_channels.html</guid>
<description>
<p>A community member was a little unclear on the role of Spring Integration adapters, gateways, and channels. I put together a response and thought I'd share it here, too. Here's my response:</p>
<p>A <code>channel</code> is a named conduit between components in a system. By default, it's more or less synonymous with a <code>java.util.Queue</code>. Data goes in one side of the tunnel, comes out the other.</p>
<p>Let's ignore the discussion of <code>channel</code>s for a moment.</p>
<p>A gateway is a terminating component, like an inbound/outbound adapter. That is, messages either come in from the outside world (beyond the memory space of your Spring Integration flow) or they leave the Spring Integration flow for some external system or component (also beyond the memory space of your Spring Integration flow).</p>
<p>An adapter receives messages from an external messaging system (JMS, e-mail, SFTP, whatever) and "adapts" it to the messaging system (as a Spring Integration <code>Message&lt;T&gt;</code>). The inbound email adapter takes messages sitting in a mail-box (IMAP, or whatever) and "adapts" it to the Spring Integration <code>Message&lt;T&gt;</code> type. And vice-versa: it takes a Spring Integration <code>Message&lt;T&gt;</code> and "adapts" it to the formats required of an external system. For example, the outbound e-mail adapter takes Spring Integration <code>Message&lt;T&gt;</code>s and turns them into emails that get sent.</p>
<p>Once a message comes in, via an inbound adapter, it flows from one component to another via <code>channel</code>s. Ultimately, it might be appropriate to write that message out somewhere. You can write the message using an outbound adapter.</p>
<p>A gateway is just like an adapter, except that it can take replies. So, for example, perhaps a message comes in via JMS, and it has specified a JMS destination to which replies should be sent. The example above can be thought of as an inbound gateway. If you send a message TO a gateway and want the reply to come back via that gateway, then that's an outbound gateway. (Perhaps you've made an HTTP request on one <code>channel</code> through the gateway, and the HTTP response comes back into the system via the gateway on another <code>channel</code>).</p>
<p>The gateway can handle that sort of inbound AND outbound work for the same message flow.</p>
<ul>
<li><strong>Adapter</strong>s write out, or read in, but not both.</li>
<li><strong>Gateways</strong> write out and wait for reply, or read in and send response. Gateways only make sense where there's the need for a reply.</li>
</ul>
<p>Returning now to <code>channel</code>s, you don't need to worry about <code>channel</code>s most of the time. I worry about them when: I want to make parts of the flow have different concurrency characteristics, when I want to make sure that the transit of messages in the system itself is durable (for example, by switching out the java.util.Queue-ish default <code>channel</code> for something that delegates to JMS for persistence), or when I want to insert auditing logic in a central place (around the <code>channel</code> through which messages flow is a great place for that sort of thing). Often, if you don't mind the default, synchronous <code>java.util.Queue</code>-like behavior, u don't even need to define a <code>channel</code>. Just specify a name where a <code>channel</code> reference is expected. As long as the names are the same, Spring Integration will create the beans for you at runtime and connect wire everything up for you.</p>
<p>In related news: check out this amazing video by <a href="https://www.youtube.com/watch?v=g3DgdSqEgzI">Spring Integration lead Gary Russell on using the Spring Integration Java configuration API and DSL</a>.</p>
</description>
</item>
<item>
<title>Don't Want to use Maven with Spring?</title>
<link>https://joshlong.com/jl/blogPost/dont_want_to_use_maven_with_spring.html</link>
<pubDate>Tue, 3 Jun 2014 00:00:00 +0000</pubDate>
<guid isPermaLink="false">jl/blogPost/dont_want_to_use_maven_with_spring.html</guid>
<description>