tag:blogger.com,1999:blog-84544846008402150872024-03-03T01:24:57.488-07:00Square IslandAndroid development and more.Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.comBlogger187125tag:blogger.com,1999:blog-8454484600840215087.post-87292686921668362622019-09-24T14:48:00.000-06:002019-09-24T23:05:06.915-06:00Sample Ballot: From pdf to custom page<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN5rhfZKh0LGqdFUZWnsVav17KrNjQ7F-EbneJymCpjEF5EF0VkPiYM9HS9gaVqFOhiW57TngLbt4JwoTIfNCTeXSQsYQO0Ao3rlzJNU2kJJDGdXY3EZ2FiSlLg0N5tD0uUs1GNVBs/s1600/greeley.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN5rhfZKh0LGqdFUZWnsVav17KrNjQ7F-EbneJymCpjEF5EF0VkPiYM9HS9gaVqFOhiW57TngLbt4JwoTIfNCTeXSQsYQO0Ao3rlzJNU2kJJDGdXY3EZ2FiSlLg0N5tD0uUs1GNVBs/s640/greeley.jpg" width="412" height="640" data-original-width="1029" data-original-height="1600" /></a></div>
<p class="header">Ballot Guide</p>
<p>Last year I wrote <a href="https://github.com/GetBallot">Ballot Guide</a> to learn Flutter and Firebase and to make election information more accessible.</p>
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/YtxwZSfS3mo?rel=0" frameborder="0" allowfullscreen=""></iframe>
</center>
<p>The 2019 election is coming up in November, so I thought, hey I'll use my app to get more information. But there was nothing.</p>
<p class="header">Google Civic Information API</p>
<p>I went to check the list of elections on the <a href="https://developers.google.com/civic-information/docs/v2/elections/electionQuery">Google Civic Information API</a> and indeed, they don't have our local elections here in Colorado. But I still want to see what will be on my ballot before actual election time. Fortunately, my county publishes a sample ballot on the election website:</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://www.weldgov.com/UserFiles/Servers/Server_6/File/Departments/Clerk%20and%20Recorder/Election%20Information/2019%20Coordinated%20Sample%20Ballot.pdf" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib2lpLopr8dEs3bZDDEaxv8f6LHsainZeV25EdwkNAjgvkAUJEAh52Sz3U8NP6E8MQ9AhdxPkzXJ74dfq4ac95fSnlib9bN8fHzdpHxqOg-VDlQVMS_HF3t0x-YDdLbvCqPH6vKIKW/s640/weld_ballot.jpg" width="390" height="640" data-original-width="976" data-original-height="1600" /></a></div>
<p>My first thought was, woah there are lots of stuff to vote on! Looking closer though, multiple cities and school districts are listed, and I don't reside in all of them, so my actual ballot should have fewer items than this. Can I filter it down to only the items relevant to me?</p>
<p class="header">My voting districts</p>
<p>I went back to the Google Civic Information API and used the <a href="https://developers.google.com/civic-information/docs/v2/elections/voterInfoQuery">voterInfoQuery</a> end point to find my voting districts. That works for city council, but not school districts, because that API does not return them.</p>
<p>Looking around, I found the shapefiles for Special Districts on the <a href="https://demography.dola.colorado.gov/gis/gis-data/">Colorado Department of Local Affairs (DOLA) GIS page</a>. Great! But how do I query shapefiles?</p>
<p class="header">Turf.js</p>
<p>I found a javascript library: <a href="https://turfjs.org/">Turf.js</a>. A few steps to transform the data:</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7kuMyt6BCif_gd2Pr7hL8F4_FLSCaVE0gnXiAnJtDxDmXeOtHcBcf1IW16t_pwnqyCxkNwOiwqyjYwhIrNLkO1fWm5TyJUuFrNxbc7wl7wUwfFxJbxnD44fqr8S6_mp0vLRw74yxv/s1600/qgis.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7kuMyt6BCif_gd2Pr7hL8F4_FLSCaVE0gnXiAnJtDxDmXeOtHcBcf1IW16t_pwnqyCxkNwOiwqyjYwhIrNLkO1fWm5TyJUuFrNxbc7wl7wUwfFxJbxnD44fqr8S6_mp0vLRw74yxv/s640/qgis.jpg" width="600" height="284" data-original-width="1364" data-original-height="646" /></a></div>
<ul>
<li>Convert shapefiles into GeoJSON though with <a href="https://qgis.org">QGIS</a>.</li>
<li>Use the <a href="https://developers-dot-devsite-v2-prod.appspot.com/maps/documentation/javascript/examples/places-autocomplete">Google Places Autocomplete API</a> to convert my voting address into latitude and longitude.</li>
<li>Call <a href="https://www.npmjs.com/package/@turf/boolean-point-in-polygon">booleanPointInPolygon</a> from <a href="https://turfjs.org/">Turf.js</a> on all the districts to see which one matches my residence.</li>
</ul>
<p>But that didn't work! I tried many things until I realized that the exported GeoJSON has points in (lng, lat) instead of (lat, lng). Gah! Need to write a script to convert that.</p>
<p class="header">Split the sample ballot</p>
<p>Finally I have a way to find my school district. Now I need to split the sample ballot into each contest, and only show those matching mine. I create a Google spreadsheet and, gasp, copy and paste the data from the PDF by hand.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr4IIo1ZeW_TTJ04_KAxPOBe2IPDNYXLRT3OmlUNWdQ2ND8wl5fLgrW98yrFCosX3L43oHqdCXfOlhOpKwdtfTpcojX6nxeBtwpJzX-3zIlZO4wBH2fYq92yNfvMSudl2zt49obMiJ/s1600/sheet.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr4IIo1ZeW_TTJ04_KAxPOBe2IPDNYXLRT3OmlUNWdQ2ND8wl5fLgrW98yrFCosX3L43oHqdCXfOlhOpKwdtfTpcojX6nxeBtwpJzX-3zIlZO4wBH2fYq92yNfvMSudl2zt49obMiJ/s640/sheet.jpg" width="600" height="216" data-original-width="884" data-original-height="319" /></a></div>
<p>The worst are the ballot measures. The PDF is multi-column, and when I copy and paste the line runs from one column to the other, instead of go onto the logical next line. It was very not fun.</p>
<p class="header">Ingest into Firebase</p>
<p>Once I have the information on Google sheet, I wrote a script to curl the tsv, convert to json, and upload it into Firebase using the Firebase Admin SDK.</p>
<p class="header">Missing data</p>
<p>I have missing data on both the ballot side and the district side. For the ballot, not all counties have sample ballots yet, so I have to wait until closer to the election. On the district side, some cities are subdivided into wards. Google Civic Information does not always return ward information. And I don't always have the shapefiles to do it myself.</p>
<p class="header">Annotations</p>
<p>With that, I am able to filter and display a sample ballot before the election. Mostly. However, I still want more information. Specifically, city council and school board contests are non-partisan, but I would like to know the registered party of the candidates.</p>
<p>Colorado voter registration information in public. Anyone can purchase the whole database for $50. The webiste <a href="https://voterrecords.com/">voterrecords.com</a> bought it and made a search interface out of it, so I queried the candidates and added that information to my Google sheet to be ingested into Firebase.</p>
<p class="header">Try it out</p>
<p>You can see it in action at <a href="https://huddle4hope-districts.web.app/">huddle4hope-districts.web.app</a>, or embedded below:
</p>
<iframe src="https://huddle4hope-districts.web.app"height="540px" width="96%" style="border: none"></iframe>
<p>
Currently it works for Adams County, Boulder County, Larimer County and Weld County in Colorado. If you don't live in those counties, you can try these addresses:</p>
<ul>
<li>9440 Hoffman Way, Thornton, CO</li>
<li>2000 Walnut St, Boulder, CO</li>
<li>2446 Reception Ct, Fort Collins, CO</li>
<li>1001 50th Ave, Greeley, CO</li>
</ul>
<p>Let me know what you think!</p>
<div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-48122331484217866972019-03-20T23:31:00.000-06:002019-03-21T11:30:37.013-06:00Meetup Child Care: Parents Night Out<p>
As a meetup organizer, I strive to be as inclusive as possible, but I struggle with picking a time that works for parents. I've surveyed the members to see if moving from a weeknight to weekday lunch time or weekend would work better, but there was no obvious time that works for everyone.
</p>
<p>
I was lamenting about this problem to <a href="http://effie.io">Effie</a> and she told me about Parents Night Out. Various companies and non-profits host evening activities where parents can drop off the kids and have some time to themselves. What about running a meetup on an evening when Parents Night Out is available?
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTJ3An6zk8dqSYviuXR6J38bNvnp9sTIZiHFGymUsy2TteUFJrae_3F_2mU6l7ehqBO65WK_aS7C6qem9hUWcusOx9Iz5XEGmrEIZ3AU9cUfNL7iQ5DjDcWXGtbfrUG3urD7sk_BMV/s1600/pno.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTJ3An6zk8dqSYviuXR6J38bNvnp9sTIZiHFGymUsy2TteUFJrae_3F_2mU6l7ehqBO65WK_aS7C6qem9hUWcusOx9Iz5XEGmrEIZ3AU9cUfNL7iQ5DjDcWXGtbfrUG3urD7sk_BMV/s400/pno.jpg" width="400" height="300" data-original-width="794" data-original-height="595" /></a></div>
<p>
I loved the idea, but I don't know the options available in the Boulder area. I mentioned that during a meetup and <a href="https://twitter.com/sepzilla">Sepideh</a> said she knows some. I looked into the places she mentioned and March 15 was a good date at <a href="https://www.shredderski.com/products/boulder-parents-night-out">Shredder Ski</a>, so I scheduled our annual <a href="https://www.meetup.com/Google-Developer-Group-Boulder/events/258485149/">Women Techmakers Lightning Talks</a> that night.
</p>
<p>
I managed to get some event funding from Google to pay for the child care. I set up a Google Form for parents to sign up, and purchased <a href="https://www.shredderski.com/shredder-gift-certificates">gift certificates</a> for them. This way, the parents did not need to worry about payment at all. Instead, I submit the receipts for the gift certificates and get reimbursed by Google.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVhq9uXPoZ3I_7hABX0ynR0oGGlarIMHyY_eQwsnrDW3a2t9lO5ClgLS0MuY1F3fo0_6tbVSw2Bzz-qszqICzWHO5ewSe05FPn33z3y_JyBjhP5kOXnCamalzSS3y0tI_p8KFYDB0q/s1600/comment.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVhq9uXPoZ3I_7hABX0ynR0oGGlarIMHyY_eQwsnrDW3a2t9lO5ClgLS0MuY1F3fo0_6tbVSw2Bzz-qszqICzWHO5ewSe05FPn33z3y_JyBjhP5kOXnCamalzSS3y0tI_p8KFYDB0q/s400/comment.jpg" width="400" height="119" data-original-width="653" data-original-height="194" /></a></div>
<p>
I am so happy to find out about Parents Night Out! If you run a meetup, or know meetup organizers, please try this idea. Hope this will help make meetups more inclusive.
</p>
<div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-19086256854229885132018-05-20T12:30:00.000-06:002018-05-20T12:30:09.058-06:00Modular Meal Planning<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEida7_3Mw9GCv7FaAW1piMlCF7sKs5cIHt8tIplZyo78gxzluYOIvHOaF29Juj5Go-fdBsTVR5AS0vh3wHTW28HDwBR_p1eSyvX5Q073yQLCbOMedxuSpp2abk2bSuvRCdz2ZG1ONPV/s1600/mealplan.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEida7_3Mw9GCv7FaAW1piMlCF7sKs5cIHt8tIplZyo78gxzluYOIvHOaF29Juj5Go-fdBsTVR5AS0vh3wHTW28HDwBR_p1eSyvX5Q073yQLCbOMedxuSpp2abk2bSuvRCdz2ZG1ONPV/s400/mealplan.jpg" width="300" height="400" data-original-width="1200" data-original-height="1600" /></a></div>
<p>
The topic of healthy eating often comes up when I'm chatting with friends. They are very impressed that my husband and I both work from home and cook lunch and dinner every day. We got quite the modular meal planning system in place and so I thought I'd share it here.
</p>
<p class="header">Our taste</p>
<p>
I'm Chinese and my husband is French, so we have our own notion of comfort food. Vegetables are very prominent, and we like them mushy. No salad in our house haha.
</p>
<p class="header">The algorithm</p>
<ol>
<li>Make a grid for all the lunches and dinners for the week</li>
<li>Fill in the <span style="background-color: #FFCCBC">fixed dishes</span>:<br/>
Sunday lunch: Pork Roast<br/>
Monday lunch: California Bowl</br>
Tuesday lunch: Tacos
</li>
<li>Decide what <span style="background-color: #D1C4E9">mega dishes</span> we want to make Saturday and Sunday evenings. These provide leftovers throughout the week</li>
<li>Spread <span style="background-color: #B3E5FC">leftovers</span> throughout the week</li>
<li>Fill the remaining slots with <span style="background-color: #F8BBD0">one-meal dishes</span> and <span style="background-color: #F0F4C3">single-ingredient sides + roast</span></li>
</ol>
<p>
Here is an example:
</p>
<center>
<table border="1" cellpadding="4">
<tr>
<th rowspan="2">Sat</th>
<th>L</th>
<td bgcolor="B3E5FC">Leftovers</td>
</tr>
<tr>
<th>D</th>
<td bgcolor="#D1C4E9">Mega dish</td>
</tr>
<tr>
<th rowspan="2">Sun</th>
<th>L</th>
<td bgcolor="FFCCBC">Pork Roast</td>
</tr>
<tr>
<th>D</th>
<td bgcolor="#D1C4E9">Mega dish</td>
</tr>
<tr>
<th rowspan="2">Mon</th>
<th>L</th>
<td bgcolor="FFCCBC">California bowl</td>
</tr>
<tr>
<th>D</th>
<td bgcolor="B3E5FC">Leftovers</td>
</tr>
<tr>
<th rowspan="2">Tue</th>
<th>L</th>
<td bgcolor="FFCCBC">Tacos</td>
</tr>
<tr>
<th>D</th>
<td bgcolor="F0F4C3">Single-ingredient side + Roast</td>
</tr>
<tr>
<th rowspan="2">Wed</th>
<th>L</th>
<td bgcolor="F0F4C3">Single-ingredient side + Roast</td>
</tr>
<tr>
<th>D</th>
<td bgcolor="B3E5FC">Leftovers</td>
</tr>
<tr>
<th rowspan="2">Thur</th>
<th>L</th>
<td bgcolor="F8BBD0">One-meal dish</td>
</tr>
<tr>
<th>D</th>
<td bgcolor="B3E5FC">Leftovers</td>
</tr>
<tr>
<th rowspan="2">Fri</th>
<th>L</th>
<td bgcolor="F0F4C3">Single-ingredient side + Roast</td>
</tr>
<tr>
<th>D</th>
<td bgcolor="B3E5FC">Leftovers</td>
</tr>
</table>
</center>
<p class="header">Advantages</p>
<p>
Why we like this meal planning algorithm:
<ul>
<li>Enough constants that we don't need to think too hard</li>
<li>Enough variety that we don't get bored</li>
<li>Enough easy dishes (leftovers and single-ingredient dishes) for lunches when we don't have a lot of time</li>
</ul>
</p>
<p class="header">The modules</p>
<h3>Fixed dishes</h3>
<p>
We make these every week, on the same days.
</p>
<ul>
<li>Pork Roast: Sunday lunch. Buy a chuck of pork loin, cut slots to embed garlic wedges, bake until 55°C. Take out of oven and rest until 60°C. This provides meat for the rest of the week. We cook just side dishes to go with it.</li>
<li>California bowl: Sushi without rolling. Set rice cooker on timer after breakfast. Scoop out at lunch, top with canned tuna, surimi, cucumber and avocado. Mix and eat.</li>
<li>Tacos: Cook tilapia or swai in pan. Remove when done. Cook onion with green bell pepper. Serve with tortillas and sliced avocado.</li>
</ul>
<h3>Mega dishes</h3>
<p>
We cook these weekend evenings, with the intent of eating the leftovers throughout the week. Many of the dishes are made in a pressure cooker 💨.
</p>
<ul>
<li>💨 <a href="https://www.seriouseats.com/recipes/2014/04/pressure-cooker-thai-green-chicken-curry.html">Thai chicken curry with kabocha squash</a></li>
<li>💨 <a href="https://www.manilaspoon.com/2017/04/instant-pot-chicken-adobo.html">Chicken adobo</a></li>
<li>💨 <a href="http://almostturkish.blogspot.com/2007/03/middle-eastern-lamb-stew-orta-dou-usul.html">Lamb güveç</a></li>
<li>💨 <a href="http://www.bitchincamero.com/2009/09/pressure-cooker-pork-ragu/">Ragu</a></li>
<li>Ratatouille</li>
<li><a href="https://www.justonecookbook.com/chikuzenni-simmered-chicken-and-vegetables/">Japanese stew</a></li>
<li><a href="https://cookieandkate.com/2015/quinoa-vegetable-soup-recipe/">Quinoa Vegetable Soup with Kale</a>
<li>Stuffed tomatoes</li>
</li>
</ul>
<p>
We rotate them so we don't eat the same dishes every week.
</p>
<h3>Single-ingredient sides</h3>
<p>
These are easy sides that we make, with the pork roast as the meat. There are 3 kinds:
</p>
<ul>
<li>Leafy vegetables Chinese-style. We cook napa cabbage, spinach and bok choy this way. Cut vegetable into small pieces. Add oil and garlic to pan. Add vegetables. Drizzle with sesame oil. Add salt. Cover and cook until vegetable is soft.</li>
<li>Vegetables French-style. We cook carrot, cauliflower and green beans this way. Cut vegetable into small pieces. Boil until soft. Drain. Add butter and garlic to pan. Put back vegetables to coat. Brown if desired (we do that for cauliflower).</li>
<li>Bake in oven. We cook sweet potatoes, squash, asparagus and broccoli this way.</li>
</ul>
<p>
The leafy veggies take the least time to cook so we usually do that for lunch.
</p>
<h3>One-meal dishes</h3>
<p>
We sprinkle these one-meal dishes in the meal plan to add variety. One-meal means there won't be leftovers. If the dish has no meat, we eat it with pork roast.
</p>
<ul>
<li>Skillet-Braised Cod Provençal</li>
<li><a href="https://www.epicurious.com/recipes/food/views/mushroom-and-leek-saute-51238850">Leek mushroom</a>
</li>
<li>Chicken marsala</li>
<li><a href="https://www.justonecookbook.com/miso-dengaku/">Nasu dengaku</a></li>
</ul>
<p class="header">Suggestions?</p>
<p>
What are you favorite dishes to make? I'd love to add more options to each category!
</p>
<div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-80514926873431360012017-11-13T20:07:00.000-07:002017-11-13T20:11:32.325-07:00Types of Android Tests<p>I saw this <a href="https://www.reddit.com/r/androiddev/comments/7cfa6r/testing_concepts_in_android/">Reddit discussion</a> on Android testing concepts, which tries to categorize tests into short, medium and long. I don't find that a very useful way to think about different types of tests, so I thought I'd give offer my view.</p>
<p class="header">Two dimensions</p>
<p>I think it's more useful to think of tests in two dimensions</p>
<ul>
<li>Does it run on the JVM or needs a device?</li>
<li>Does it test the UI or not?</li>
</ul>
<p>Depending on the answer to these two questions you get 4 types of tests.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPx9aS5-exwG8hrVtLGQqhnexpK6nTFzQEhyphenhyphentwdFgu2GVjWETF_7Z25DcpZzvy7uSOVkLAUvZNu7Whipc8gEsDn9x8BHnHn-HdwSz2MGOwhUljZA1NIcPmnzoSA7djhnx3ymJhom5h/s1600/AndroidTestTypes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPx9aS5-exwG8hrVtLGQqhnexpK6nTFzQEhyphenhyphentwdFgu2GVjWETF_7Z25DcpZzvy7uSOVkLAUvZNu7Whipc8gEsDn9x8BHnHn-HdwSz2MGOwhUljZA1NIcPmnzoSA7djhnx3ymJhom5h/s640/AndroidTestTypes.jpg" width="560" height="430" data-original-width="1600" data-original-height="1229" /></a></div>
<p class="header">JVM tests</p>
<p>JVM tests are the faster to run since you don't need to deploy to a device
(physical or emulator), and should be preferred. Try to structure your app so
that the logic is in pure Java classes i.e. does not use the Android framework.</p>
<p>Since we are writing Android apps, it is difficult to test the UI without the
Android framework. There are two ways you can do that.</p>
<p class="header">Robolectric</p>
<p>The first way to test the UI on the JVM is Robolectric, which mocks the Android
framework. I don't recommend that, because the mocked classes don't necessarily
reflect the actual behavior on the Android framework.</p>
<p class="header">Model-View-Presenter (MVP)</p>
<p>The second way is to make your Android classes as logic-free as possible. There
are various architecture patterns you can use to achieve that, for an example
Model-View-Presenter (MVP). MVP allows you to encapsulate the Android part
inside the View (Activity or Fragment) and extract the logic into the Presenter,
which does not use any Android framework code. This way, you can test the
Presenter on the JVM.</p>
<p class="header">Espresso</p>
<p>After you have tested your logic extensively on the JVM (you may want to aim for
100% test coverage), you should add some UI tests. Think of these as sanity
checks, going through the happy path to make sure the app does not crash when
you bump up the library version. I use Espresso for UI tests, together with
Mockito and <a href="https://caster.io/courses/mockwebserver/">MockWebServer</a> to set up a hermetic environment for repeatable tests.</p>
<p class="header">More info</p>
<ul>
<li>Zine: <a href="https://gum.co/AndroidTestingPrimer">Android Testing Primer</a></li>
<li>Course: <a href="https://bit.ly/EfAnTe">Effective Android Testing for Mobile Developers</a></li>
</ul><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-90664143255759211692017-05-11T15:34:00.000-06:002017-08-11T19:09:55.065-06:00Why I run a conference<p>
As some of you know, I'm one of the organizers for <a href="http://360andev.com/">360|AnDev</a>. It's a lot of work to run a conference, so why do I do it?
</p>
<p>
I started the conference because I want an inclusive place for people to learn about Android:
</p>
<ol>
<li>
We want it to be welcoming to beginners so that they can plug into the community right away. That's why we have a "Getting Started" track (see our <a href="http://360andev.com/call-for-papers">CFP</a>).
</li>
<li>
We want to encourage first-time speakers, so we run <a href="https://www.youtube.com/watch?v=2_n8nd5P8Fc">Q&A Hangouts</a> to answer as many questions as we can.
</li>
<li>
We want people to speak regardless of their financial situation, which is why we cover the travel costs for speakers if their companies do not.
</li>
<li>
We have <a href="https://360andev.com/about/inclusivity-scholarships">inclusivity scholarships</a> to help people who cannot otherwise attend.
</li>
</ol>
<p>
We did not collect attendee statistics last year, but you can see from our speaker lineup that we were off to a good start in terms of inclusivity.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3vckLPtYzYSmqfN8Xyz-5681S80vuvBdfPlzkgNroDuaAY6_FGz_fQcPpP15eHOv8l0-hxkhDNE5o9nFoo_aIATV8vwRHtPyrZ2O_LWwn3B3rp72o5WlNkPSRTzwfHqq_6couNTpb/s1600/speakers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3vckLPtYzYSmqfN8Xyz-5681S80vuvBdfPlzkgNroDuaAY6_FGz_fQcPpP15eHOv8l0-hxkhDNE5o9nFoo_aIATV8vwRHtPyrZ2O_LWwn3B3rp72o5WlNkPSRTzwfHqq_6couNTpb/s400/speakers.png" width="400" height="200" /></a></div>
<p class="header">We need your help</p>
<p>
Last year we managed to break even, which was really good for a first-year conference that covers travel costs for speakers. We hope to keep it up, to have a financially viable event that we can run again and again. But we need your help:
</p>
<ol>
<li>
Please spread the word. Tell everyone about the event:<br/>
July 13 - 14, 2017. Denver Colorado. <a href="http://360andev.com/">360andev.com</a>.
</li>
<li>
If you plan to attend, please buy a ticket right away so us organizers are not sitting at the edge our seats wondering if anyone would come.
</li>
<li>
If you are at a company, please ask your employer if they would like to sponsor the conference: <a href="http://360andev.com/sponsorship">360andev.com/sponsorship</a>.
</li>
<li>
Support us via Patreon: <a href="https://www.patreon.com/360andev">https://www.patreon.com/360andev</a>
</li>
</ol>
<p>
Every bit helps. Thank you for your support!
</p>
<div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-13993565866586860512017-04-16T16:40:00.000-06:002017-05-06T17:04:33.414-06:00Droidcon Boston Keynote<p>
I just came back from the inaugural edition of <a href="http://www.droidcon-boston.com/">Droidcon Boston</a> last week, at the beautiful Calderwood Pavilion.</p>
<center>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="en" dir="ltr">Yes, <a href="https://twitter.com/hashtag/DroidConBos?src=hash">#DroidConBos</a> is at a theater. <a href="https://t.co/OjNjaQOnOv">pic.twitter.com/OjNjaQOnOv</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/851435589777977344">April 10, 2017</a></blockquote>
</center>
<p class="header">Keynote preparation</p>
<p>
I had the honor to deliver the Day 2 keynote at Droidcon Boston.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQpjSRS847HdHtHqdQpvSxu3M-iUOwD5DMbs_OoqmsvrQoJUXyqE6SNuf_Snp7P2o7V5vNBEo_m_HJaSHQsVwo8cwFJ8geo18iFUG354UZq3PkjjZ9pbCAe8uOuR49EbqCRG_kVdAJ/s1600/IMG_20170411_093718.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQpjSRS847HdHtHqdQpvSxu3M-iUOwD5DMbs_OoqmsvrQoJUXyqE6SNuf_Snp7P2o7V5vNBEo_m_HJaSHQsVwo8cwFJ8geo18iFUG354UZq3PkjjZ9pbCAe8uOuR49EbqCRG_kVdAJ/s400/IMG_20170411_093718.jpg" width="400" height="300" /></a></div>
<p>
I <a href="http://blog.sqisland.com/2015/10/how-i-prepared-my-keynote.html">prepared
extensively</a> when I first gave this keynote at <a href="http://androidsummit.org/">Android Summit</a>, so this time I was
relatively chill about it. I updated some of the slides, and gave a practice
version at <a href="https://www.meetup.com/DenverDroids/events/237644767/">Denver Droids</a>.
For a last minute refresher, I brought the video recording on my laptop and watched myself give the talk
on my flight to Boston.
</p>
<p class="header">Fresh material</p>
<p>
Normally I do not tweak my talk the day before the conference, but after seeing
the shout-outs in <a href="http://adavis.info/2017/04/droidcon-boston-2017-recap.html">Annyce's opening keynote</a> I was inspired to do the same.
</p>
<p>
My talk is about how sharing makes you an expert, and I used tweets from day 1
of the conference as examples.
</p>
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/m7gveZ5SwzE?rel=0" frameborder="0" allowfullscreen></iframe>
</center>
<p class="header">Learn from each other</p>
<p>
That is the beauty of going to a conference: we learn, we share what we learn,
and we lift each other up. It was really rewarding to see people getting out of
their comfort zone to tweet, blog, sketchnote, and plot to give their very first
talk. This is how we build a community.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">"The community is you. It's not some secret pool of experts. It's you!" - <a href="https://twitter.com/chiuki">@chiuki</a> at <a href="https://twitter.com/hashtag/DroidConBos?src=hash">#DroidConBos</a>. <a href="https://t.co/YdwDvqfY1q">pic.twitter.com/YdwDvqfY1q</a></p>— DroidSmith (@devunwired) <a href="https://twitter.com/devunwired/status/851799200287215616">April 11, 2017</a></blockquote>
</center>
<p class="header">Watch the keynote</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://slideslive.com/38900610/how-to-be-an-android-expert" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcjjM01EcUmNR10lI6Wcw02gSUfukf-lxLIyqko1JvHWwxBhBLVJCbmgTbuMy2cfqGOHtplErTwDXEvfzrPBoeY_6IkdtL3g7YlO5SUf0apsYt0czLfGRqXDeO8eN6IqpIJEwOhk9o/s400/droidconbos.jpg" width="400" height="225" /></a></div>
<ul>
<li>
Video: <a href="https://slideslive.com/38900610/how-to-be-an-android-expert">https://slideslive.com/38900610/how-to-be-an-android-expert</a>
</li>
<li>
Slides: <a href="https://www.slideshare.net/chiuki/how-to-be-an-android-expert-droidcon-boston">https://www.slideshare.net/chiuki/how-to-be-an-android-expert-droidcon-boston</a>
</li>
</ul>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0Calderwood Pavilion at Boston Center for the Arts42.344525 -71.07086700000002142.321056 -71.11120750000002 42.367993999999996 -71.030526500000022tag:blogger.com,1999:blog-8454484600840215087.post-73361001325180926992017-03-16T12:32:00.000-06:002017-03-16T12:37:44.542-06:00Lint stuck after upgrading gradle plugin to 2.3.0<p>
<code>app:lint</code> hangs after I upgraded the gradle plugin to <code>2.3.0</code>.
</p>
<blockquote>
Unexpected failure during lint analysis (this is a bug in lint or one of the libraries it depends on)
</blockquote>
<p>
It complains about <code>ProblemReporter.isClassPathCorrect(ProblemReporter.java:4761)</code> and other places in <code>ProblemReporter</code>, but I was not able to pinpoint the problem.
</p>
<p>
Turns out this is caused by libraries that uses old lint APIs, in my case <a href="https://mvnrepository.com/artifact/com.jakewharton.timber/timber">Timber</a> and <a href="https://mvnrepository.com/artifact/com.jakewharton/butterknife">Butterknife</a>. Once I updated those dependencies, lint finishes.
</p>
<p>
Thanks <a href="https://twitter.com/athornz">Josh Burton</a> for sharing his solution with me!
</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-47805912277674742522017-02-13T10:35:00.000-07:002017-02-13T13:22:43.990-07:00Constraint Layout beta5 lint error<p>
<a href="https://sites.google.com/a/android.com/tools/recent/constraintlayoutbeta5isnowavailable">Constraint Layout beta 5</a> is the release candidate, and added a lint to deprecate older versions.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLFe9gnS2YKyfJNgaS8BoE-cfqmk_UnBQY4-46DC3XsvAIKWDQISYryQT7hFbhhMwEeboA4CUWiR-1c_4-uyMWH5gzOVRPDdQs9ZfZhBU1T96s2RgT2Lm8SA7kpCI69DZ1VgbM_7vU/s1600/obsolete.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLFe9gnS2YKyfJNgaS8BoE-cfqmk_UnBQY4-46DC3XsvAIKWDQISYryQT7hFbhhMwEeboA4CUWiR-1c_4-uyMWH5gzOVRPDdQs9ZfZhBU1T96s2RgT2Lm8SA7kpCI69DZ1VgbM_7vU/s1600/obsolete.png" /></a></div>
<p>
The easiest way to get rid of the lint error is to press <code>Alt-Enter</code> and choose the first option to upgrade.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3bXR2QoFDEgKyooH0LaYFlwRIPekrtPlc82fh1wh2VjXc6UdP2FkoLazAnKM_yyjNZjGYmHVrkyJrvXmJ1nFjgAyA_xy4D0SCl_aRY-KUHrcfQnLCk2paWZXgIgl172grMqPohebj/s1600/upgrade.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3bXR2QoFDEgKyooH0LaYFlwRIPekrtPlc82fh1wh2VjXc6UdP2FkoLazAnKM_yyjNZjGYmHVrkyJrvXmJ1nFjgAyA_xy4D0SCl_aRY-KUHrcfQnLCk2paWZXgIgl172grMqPohebj/s1600/upgrade.png" /></a></div>
<p>
However, I encountered a <a href="https://code.google.com/p/android/issues/detail?id=233863">bug</a>, which forces me to stay with <code>beta4</code> until the next version comes out with the fix. I still want to get rid of the lint error so my continuous build does not fail. I didn't want to change <code>lintOptions abortOnError</code> to <code>false</code> in <code>build.gradle</code> because I still want my build to catch other fatal lint errors.
</p>
<p>
I tried to get Android Studio to fix this lint error for me by choosing <code>Disable inspection</code> from <code>Alt-Enter</code>. Alas, that only changed the local settings. Turns out that I need to go to Settings → Editor → Inspections to undo that.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHOXKHw1vefnZs6AS0KGkn4VCSJHsmWXAFeZrDaQPwA1DhpVmcnwBO0u-_q5mYSd2rbu58e_l5lz9UzoezugyX9DeJNm_jggHHUiXn0QQH2PlEG4JTr_Ikn7gTFIaNOEguuWEeITVv/s1600/settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXGfgfkIbxO8DVq_4gZPn91zQw62fXAGIwCYsD7b_4a0-0O4A4ZqX_fJBU6n2PmumVPfgzJXbAwPTSdREy5aehDgNleeoGG7iCxy1POAL3OPQRaAfrxy8NzSYqve6cpZeKytvkxyTI/s1600/settings.png" width="600" height="218" /></a></div>
<p>
The option I wanted is <code>Suppress: Add tools:ignore="MissingConstraints" attribute</code>, which modifies the xml for me to add the appropriate lint suppression.
</p>
<pre class="prettyprint" lang-xml>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="MissingConstraints">
<!-- Cannot upgrade to beta5 due to http://b.android.com/233863 -->
</pre>
<p>
Finally, I added a comment to remind me why I suppress the lint error.
</p>
<p>
More info: <a href="https://sites.google.com/a/android.com/tools/tips/lint/suppressing-lint-warnings">Suppress Lint Warnings</a>.
</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-28632348094590318822017-01-16T11:02:00.000-07:002017-01-16T11:02:53.753-07:00Java compatibility in build.gradle<p>
I got an email from Google asking me to update <a href="https://play.google.com/store/apps/details?id=com.sqisland.fitcat">Fit Cat</a> for <a href="https://developer.android.com/wear/preview/features/app-distribution.html">Android Wear 2.0</a>, so I tried to compile that app after I haven't touched it for a few months.
</p>
<p>
Since Android Studio evolves so quickly, I wasn't exactly surprised when I got an error:
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMkAWc7V0paznXMz6gnIZb7AOs9d8a0G25POAKrcBvtFKkfBatQedtFgQfvycJWBPdNCC9c07ryG8U0gIH4d9oUl25bKjYJhHmTyqrKAbfu-nFUJLBWg3V7D59_W16Io54fDQRheUq/s1600/Java_1_7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMkAWc7V0paznXMz6gnIZb7AOs9d8a0G25POAKrcBvtFKkfBatQedtFgQfvycJWBPdNCC9c07ryG8U0gIH4d9oUl25bKjYJhHmTyqrKAbfu-nFUJLBWg3V7D59_W16Io54fDQRheUq/s1600/Java_1_7.png" /></a></div>
<pre>
Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been
compiled using Java 8 or above.
</pre>
<p>
It asked me to add <code>sourceCompatitbility</code> and <code>targetCompatitbility</code> to Java submodules. What does that mean? After a lot of searching plus trial and error I found the <a href="https://stackoverflow.com/questions/21028438/gradle-sourcecompatibility-has-no-effect-to-subprojects#21051506">answer</a>.
</p>
<p>
In your top-level <code>build.gradle</code>, add this:
</p>
<pre class="prettyprint">
allprojects {
tasks.withType(JavaCompile) {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
}
</pre>
<div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-12443475777563487252016-12-01T12:37:00.001-07:002016-12-01T12:49:50.706-07:00Elite Worship<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_d8ngsM9Spqc4wGN-ohnXQCi_8yqdKNKxE-Irm1CORTeJyPQL87xtKZF_or6lWjTQKrc38UEqgbHLTkhYcOU4EFfGfgYEJ4M8yCQQsl81UMAQUC4yrW8cP_2GBZcxoH0C8UfZhcCL/s1600/elite.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="borderless" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_d8ngsM9Spqc4wGN-ohnXQCi_8yqdKNKxE-Irm1CORTeJyPQL87xtKZF_or6lWjTQKrc38UEqgbHLTkhYcOU4EFfGfgYEJ4M8yCQQsl81UMAQUC4yrW8cP_2GBZcxoH0C8UfZhcCL/s320/elite.jpg" width="320" height="320" /></a></div>
<p>Yesterday I read an article called <a href="http://ppinera.es/2016/11/16/in-a-world.html">In a world...</a>,
which talked about the problem of elite worship in the iOS community. I'm an Android developer,
but I see the same problems in our community as well.</p>
<p>Here is how I see it:</p>
<ul>
<li>People who tweet, blog, speak and open source are considered elites</li>
<li>Elites are held above the rest of the community, making it unwelcome for others</li>
</ul>
<p class="header">Does being loud make you a better developer?</p>
<p>Or, flipping the question, are people who don't share their work inherently worse?
No, of course not. Unfortunately, unseen work is just that: unseen. Without external
evidence, there is no way to tell if a developer is good or not, so we assume they
are average. Not better, not worse.</p>
<p>I, too, would like to believe that we live in a meritocracy where good work is
automatically recognized. But how? How do people know what you are doing if you
don't tell them?</p>
<p>This encourages people to run up a hill and yell on top of their voice. And the
people who are comfortable doing that are rewarded, are seen as "better".</p>
<p>However, this is not automatically lead to elite worship. Yes, there will always
be some people who are more visible in the community. But that does not mean it
has to be a small group who are revered above all else.</p>
<p class="header">What you can do</p>
<p style="font-size:1.2em"><b>When you see good work, point it out</b></p>
<p>One problem of elite worship is that we ended up comparing ourselves with people
with more Twitter followers, more mentions in the industry newsletter, more conference
talks etc and feel defeated. We can counter that by pointing out the good work
we see that is not enshrined on the internet.</p>
<p>Here is a concrete thing you can do: When you do a code review, don't just point
out the things to fix. Remark on the good parts as well.</p>
<p style="font-size:1.2em"><b>When something takes longer than expected, write it down</b></p>
<p>We need more voices in our community. Blogging is great, because there is no
gatekeeper to decide who gets to publish and who doesn't. But there is still
one hurdle: What to write about?</p>
<p>Pay attention to what you do day to day. If you spent more time figuring out how to do
something than you thought you would, it is worth writing down.</p>
<p>Don't worry about looking stupid because others must know how to do it already.
You don't have to push the boundaries of human knowledge. That's PhD theses, not
blog posts.</p>
<p>Think of it as notes to your future self, a place to put codes and commands in
monospace font so you can come back in 3 months to copy and paste them.</p>
<p>Just because some people share more doesn't mean there is no place for you to do
it. Everyone has a different experience, and we want to hear from you.</p>
<p style="font-size:1.2em"><b>Speak at local meetups</b></p>
<p>In the original article, the author laments that there is no diversity at
conferences. Always the same faces, always the same topics. As a conference
organizer, I can tell you that speaker selection is hard. There were so many
people that very much deserved a speaking slot but didn't get one, because we
had a very limited number. You can read more
about <a href="http://blog.sqisland.com/2016/08/360andev-cfp-process.html">how we try to have a balanced speaker roster at 360|AnDev</a>.</p>
<p>That said, we don't have to let conferences be the only place where technical
talks are given. There are numerous meetups happening all over the world on
any given week. And they are always, always looking for speakers. Sure, it does
not come with the prestige of conference speaking, but does that make them
worthless?</p>
<p>If you think the local audience is too small to worth your time, record your talk and
post it on the internet. I wrote <a href="http://blog.sqisland.com/2015/12/use-quicktime-to-record-your-own-talk.html">a guide on
how to record your screen and voice with QuickTime</a>. Would love it if someone write one for <a href="https://obsproject.com/">Open Broadcaster Software (OBS)</a>!</p>
<p>Give talks yourself, and encourage those around you to do it. That is how we get
new voices. Don't let the conference speaking circuit dictate who gets to speak and who doesn't.</p>
<p class="header">Sharing != Elite Worship</p>
<p>People are lazy. If we see the same name over and over, we think that person
must know something. This is fundamentally what leads to elite worship. We can't
change human nature, but we can spread the love. Point out each other's good work,
encourage each other to make it visible. Make the elite circle so large that it
is no longer elite.</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com3tag:blogger.com,1999:blog-8454484600840215087.post-34773361760093722392016-10-13T14:28:00.000-06:002016-10-14T14:23:46.325-06:00Dennis Ritchie Dies Again<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQECldj8HXKkF32CHqN9JOQGFEcKILnKVxartT6ookgNYqia-ccXmSAQm3k3Mym9YEAQPNLJhdDNJUCBzk9uhrHhd_bYLqWCwUX5NKz-BkUz2tiVpWvaUIoUriuv5hIREI6Gp1n0Tt/s1600/sure.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="borderless" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQECldj8HXKkF32CHqN9JOQGFEcKILnKVxartT6ookgNYqia-ccXmSAQm3k3Mym9YEAQPNLJhdDNJUCBzk9uhrHhd_bYLqWCwUX5NKz-BkUz2tiVpWvaUIoUriuv5hIREI6Gp1n0Tt/s320/sure.png" width="320" height="320" /></a></div>
<p>
Yesterday many people on my Twitter timeline sharing an article about Dennis Ritchie's death:
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Dennis Ritchie, Father of C and Co-Developer of Unix, Dies <a href="https://t.co/LxkCK6i1DE">https://t.co/LxkCK6i1DE</a> via <a href="https://twitter.com/WIRED">@WIRED</a></p>— Om Malik (@om) <a href="https://twitter.com/om/status/786381463193128960">October 13, 2016</a></blockquote>
</center>
<p>
I clicked through to read the article, which was from 2011. Why is this circulating again?
</p>
<p>
My guess is that some people were retweeting without bothering to read the article, and thought he died recently.
</p>
<p>
This makes me think of a reaction to a tweet I posted.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/chiuki">@chiuki</a> <a href="https://twitter.com/yuichi_araki">@yuichi_araki</a> are you sure?</p>— Michel Onwordi (@lupo342) <a href="https://twitter.com/lupo342/status/700782692602871808">February 19, 2016</a></blockquote>
</center>
<p>
I was furious. Why would I post something that I'm not sure about? I even backed it up with a slide. Why are you doubting me?
</p>
<p>
Took me a while to remember that that's what other people do. Say things even when they are only 60% sure. I look back at my career and cringe to think of all the times when other people were regarded more knowledgeable because they open their mouths even when they are not sure.
</p>
<p>
This time, I am happy that I checked the details before passing it on.
</p>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com1tag:blogger.com,1999:blog-8454484600840215087.post-51978229587442584432016-10-08T23:13:00.000-06:002016-10-08T23:54:32.952-06:00Constraint Layout: Icon Label Text<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuO_LdHJ678jj1vqxkL99_aUSxmW8OceS9ZZ0ZXeKv_4w2Rlu1u3TCLCOYrngJNcE24IobhRLf0aWYyrnaG1XNzrXOHtjiTj8IF209D8pIoApz8OUAhwZ5uWtHrR_CZ9ooEWUhTvf3/s1600/iconlabeltext.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="borderless" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuO_LdHJ678jj1vqxkL99_aUSxmW8OceS9ZZ0ZXeKv_4w2Rlu1u3TCLCOYrngJNcE24IobhRLf0aWYyrnaG1XNzrXOHtjiTj8IF209D8pIoApz8OUAhwZ5uWtHrR_CZ9ooEWUhTvf3/s400/iconlabeltext.jpg" width="400" height="157" /></a></div>
<p>
I am making one of those classic layouts: an icon with two lines of text. I would like to use vector drawable for the icon, and scale it according to the text sizes. I want the top edge of the icon to line up with the top edge of the first line of text, and the bottom edge of the icon to line up with the bottom edge of the second line.
</p>
<p>
How would I do that? With <a href="https://developer.android.com/training/constraint-layout/index.html">ConstraintLayout</a>!
</p>
<pre class="prettyprint lang-java">
<ImageView
android:id="@+id/flower_image"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="@+id/label"
app:layout_constraintBottom_toBottomOf="@+id/text"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintDimensionRatio="1:1"
app:srcCompat="@drawable/ic_flower"/>
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@+id/image"
app:layout_constraintTop_toTopOf="parent"
android:text="@string/flower"
android:textSize="16sp"/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/label"
app:layout_constraintLeft_toLeftOf="@+id/label"
android:text="@string/jasmine"
android:textSize="24sp"/>
</pre>
<p>
The width and the height of the <code>ImageView</code> is <code>0dp</code>. This tells <code>ConstraintLayout</code> to compute them by the constraints. In this case, the height of the <code>ImageView</code> is determined by these constraints:
</p>
<pre class="prettyprint lang-java">
app:layout_constraintTop_toTopOf="@+id/label"
app:layout_constraintBottom_toBottomOf="@+id/text"
</pre>
<p>
The width is the same as the height.
</p>
<pre class="prettyprint lang-java">
app:layout_constraintDimensionRatio="1:1"
</pre>
<p>
The rest of the constraints are for positioning.
</p>
<p>
With that, the image scales up as the text sizes increase. It stays sharp because it is a vector.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD2OMnTUp_8EfFfnXqdTXSz5QpEkGVRK5JPjTcbAGLkIgK7GTnDjlGT7VBHydjMuJDPuFv7uF-EDRZ6iBg18Xri32hH2_L0tHoGspuII_OLpTM2fanzMovK55ZyZj2UbWwlW0-HP-W/s1600/iconlabeltext.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="borderless" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD2OMnTUp_8EfFfnXqdTXSz5QpEkGVRK5JPjTcbAGLkIgK7GTnDjlGT7VBHydjMuJDPuFv7uF-EDRZ6iBg18Xri32hH2_L0tHoGspuII_OLpTM2fanzMovK55ZyZj2UbWwlW0-HP-W/s400/iconlabeltext.gif" width="400" height="157" /></a></div>
<p class="header">Layout Editor</p>
<p>
I tried to make this layout with the Layout Editor, but could not figure out how to create the constraint <code>app:layout_constraintTop_toTopOf="@+id/label"</code> for the <code>ImageView</code>. I was hovering my cursor around the top edge but not sure how to drag it to link the two views. So I added up playing with the editor a bit to deduce the XML attributes, and switched to editing the XML directly. I hope to use the layout editor in my next attempt to use Constraint Layout.
</p>
<p>
Follow-up Twitter discussion:
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/romainguy">@romainguy</a> Just tried it again. Yes I can do the top & the bottom. Then I try to set the image view to 0x0 and things just go crazy.</p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/784990017156296704">October 9, 2016</a></blockquote>
</center>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/chiuki">@chiuki</a> <a href="https://twitter.com/romainguy">@romainguy</a> with 2.2, you do need to touch the XML for ratio & chains, yes</p>— Nicolas Roard (@camaelon) <a href="https://twitter.com/camaelon/status/784992591347535874">October 9, 2016</a></blockquote>
</center>
<p>
Read the <a href="https://twitter.com/chiuki/status/784990017156296704">whole Twitter thread</a>.
</p>
<p class="header">Source code</p>
<p>
<a href="https://github.com/chiuki/iconlabeltext">github.com/chiuki/iconlabeltext</a>
</p>
<p>
Click on either TextView to increase its size. Click on the image to reset.
</p>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-78982361926010601822016-09-16T14:42:00.000-06:002016-09-16T14:42:09.057-06:00TransactionTooLargeException crashes on Nougat<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM5dWBaJgcDvs0Ajz-fJMosr52rBBFfnLUN9yP7DDkYKD7Q0hYFgjpSED5IG1TynNbNJ9VQUQaK4AyaSbS0IOFsYcQycRBla6DW8Aw03UaP0KUzHv0qj_IIa7rr0EjLBr7KUoWDDrv/s1600/TTLE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="borderless" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM5dWBaJgcDvs0Ajz-fJMosr52rBBFfnLUN9yP7DDkYKD7Q0hYFgjpSED5IG1TynNbNJ9VQUQaK4AyaSbS0IOFsYcQycRBla6DW8Aw03UaP0KUzHv0qj_IIa7rr0EjLBr7KUoWDDrv/s320/TTLE.png" width="320" height="320" /></a></div>
<p>
I was testing my app on Android Nougat, and it crashed when I try to move from one Activity to another. I saw this in the log: <code>java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 700848 bytes</code>.
<p>
Actually, the platform has been printing warning log about this for a while, but let's be honest, who has time to read all the logs? Nougat (API 24) <a href="https://developer.android.com/about/versions/nougat/android-7.0-changes.html#other">throws <code>TransactionTooLargeException</code>s as <code>RuntimeException</code>s</a>, so we cannot ignore that any more.
</p>
<p class="header">onSaveInstanceState</p>
<p>
Turns out I was saving a big list of search results during <code>onSaveInstanceState</code> to persist them over rotation. Time to move that to a <a href="https://medium.com/google-developers/making-loading-data-on-android-lifecycle-aware-897e12760832">Loader</a>!
</p>
<p class="header">But what is the limit?</p>
<p>
But now I'm curious: What is the limit? I wrote a sample app to find out.
</p>
<pre class="prettyprint lang-java">
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, AnotherActivity.class);
startActivity(intent);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
int length = 1000;
Uri uri = getIntent().getData();
if (uri != null) {
try {
length = Integer.parseInt(uri.getLastPathSegment());
} catch (NumberFormatException e) {
}
}
byte[] data = new byte[length];
outState.putByteArray("data", data);
}
}
</pre>
<p>
To try different sizes, I start the app like this:
</p>
<pre>
adb shell am start \
-a android.intent.action.View \
-n com.sqisland.tutorial.transcation_too_large/.MainActivity \
-d 700000
</pre>
<p>
This launches <code>MainActivity</code>, which immediately goes to <code>AnotherActivity</code>. When that happens, the system calls <code>onSaveInstanceState</code>, which tries to stash away a byte array of the length specified in the adb command, retrieved by <code>getIntent().getData()</code>. This way, I can try different numbers without recompiling and redeploying the app.
</p>
<p>
I did a binary search on a Nougat emulator and my Nexus 9. The limit is slightly different, but it hovers around 500000. That is not a small number, but not too hard to exceed if you try to store data rather than state.
</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com4tag:blogger.com,1999:blog-8454484600840215087.post-78439627757526286142016-08-25T11:47:00.000-06:002016-08-25T11:51:50.169-06:00Speaking profile<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF7R9cB1Bris7lElon4pvLmboUw2gZc3olczwqGttnmoZLR6nQ1AjiF1171Hhi1Hi7szWWIDAv-1uPwmdIhP6GLfzAa3cTg-xtIyn7rjM_v46SFBJd8u1cfLf6pZ3MbxS53T-M9Etp/s1600/speaking.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="borderless" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF7R9cB1Bris7lElon4pvLmboUw2gZc3olczwqGttnmoZLR6nQ1AjiF1171Hhi1Hi7szWWIDAv-1uPwmdIhP6GLfzAa3cTg-xtIyn7rjM_v46SFBJd8u1cfLf6pZ3MbxS53T-M9Etp/s320/speaking.png" width="320" height="320" /></a></div>
<p>
Your speaking profile showcases your speaking experience. Conference organizers can see where you have spoken at, look at the slides, and watch videos of your talk.
</p>
<p>
Make one now, even if you are just getting started. You can list the topics you would like to speak about, and then add your talks as you schedule and give them.
</p>
<p>
Here are 3 places you can host your speaking profile.
</p>
<p class="header">Blog page</p>
<p>
Most blogging platforms e.g. wordpress, blogger allows you to add pages independent of the blog posts. You can add a speaking page there.
</p>
<p>
Example: <a href="http://www.adavis.info/p/public-speaking.html">Annyce Davis</a>.
</p>
<p class="header">GitHub pages</p>
<p>
If you don't have a blog, you can use <a href="https://pages.github.com">GitHub pages</a> to host your speaking page.
</p>
<p>
Example: <a href="https://margaretmz.github.io/">Margaret Maynard-Reid</a>.
</p>
<p class="header">Lanyrd</p>
<p>
If you don't want to deal with formatting your page, you can create a profile on <a href="http://lanyrd.com">lanyrd.com</a>. You will need to find the conference you are speaking at (create it if there is no entry), add a session, and mark yourself as the speaker. It is a bit of a hassle to enter all that structured data, but you get cool stats.
</p>
<p>
Example: <a href="http://lanyrd.com/profile/estellevw/">Estelle Weyl</a>.
</p>
<p class="header">Further reading</p>
<p>
Even more examples: <a href="https://github.com/asg-feminati/speakers">https://github.com/asg-feminati/speakers</a>
</p>
<p>
Watch my <a href="https://www.youtube.com/watch?v=2ESAV51B9VY">How to Write a Conference Proposal</a> talk where I mentioned how to use speaking profiles to discover conferences.
</p>
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/2ESAV51B9VY?rel=0" frameborder="0" allowfullscreen></iframe>
</center>
<div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-80450109783682982992016-08-12T19:37:00.001-06:002017-05-11T15:36:37.431-06:00360|AnDev: Money<p><a href="http://360andev.com">360|AnDev</a> is the first time I run a conference. I was raised to be frugal, never spending money that I don't have, but putting on a conference requires exactly that. We have to book the venue, order badges, buy plane tickets for speakers etc, all without knowing if any one will actually buy tickets to the conference. It was nerve-racking.</p>
<p class="header">50 Shades of No</p>
<p>Our first source of income is sponsorship. As a first year conference, we have no track record to show, and it has been difficult to attract sponsors.</p>
<p>We were so grateful that <a href="https://possiblemobile.com">POSSIBLE Mobile</a> and <a href="http://tackmobile.com/">Tack mobile</a> jumped in as sponsors the moment we announced. But after that, we had a long period of nothing. I was cold emailing a lot of companies, getting various versions of no.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvRG5XLuu9ZaFdWIbma6vzQN52dm5iua1rcxbtEs5_Kq1DoAk7VjfbJvRMxhr_BT1fIY40ifD59cggsHvx2g_FfyvdsLBs_U4SOJY3y28REUB-S1-mcnZZgBgB4vEtBmQfO53jqXBq/s1600/no.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvRG5XLuu9ZaFdWIbma6vzQN52dm5iua1rcxbtEs5_Kq1DoAk7VjfbJvRMxhr_BT1fIY40ifD59cggsHvx2g_FfyvdsLBs_U4SOJY3y28REUB-S1-mcnZZgBgB4vEtBmQfO53jqXBq/s400/no.jpg" width="400" height="400" /></a></div>
<ul>
<li>The classic: No reply.</li>
<li>The cliff: Initial interest, but no follow up.</li>
<li>The black hole: Ask me to submit to a ticketing system.</li>
<li>The clash: "We are already sponsoring a conference in the same city in the same month."</li>
<li>The budgeteer: "We have no more budget for this year / month."</li>
<li>The freeloader: "We would rather get presence for free through the CFP." (Okay they didn't say that, but that's what happened)</li>
</ul>
<p class="header">Surprising Yes Stories</p>
<p>I was quite discouraged, to be honest. Fortunately my co-organizer <a href="https://twitter.com/jwilker">John</a> has put on many conferences before, and knows that everyone procrastinates until the last moment. So I should not give up hope.</p>
<p>And indeed, we got an influx of sponsors in the last month. Some of which are the same people that we have been pinging, and the reminder of "Hey, conference is really soon" kicked them into action.</p>
<p>One sponsor approached us out of nowhere, pretty late. When I talked to them at the conference, they told me that one of their employees saw me at <a href="http://www.writespeakcode.com/">Write/Speak/Code</a> the month before, and the company decided that really want to be a part of our community-focused conference. Wow, I had no idea!</p>
<p>Another sponsor came from counter-solicitation. From time to time I get recruiter emails, and I have been replying with, "No, I don't need a job, but please sponsor my conference to reach out to other Android developers." Most of the time I get "Oh I am just a recruiter I can't make decisions like that", but one company actually followed through and became our sponsor!</p>
<p>I was genuinely surprised. This really reinforces my belief that you should always ask for what you want. You need to give people a chance to say yes!</p>
<p class="header">Attendees</p>
<p>Same as sponsors, attendees are major slackers. I had this exchange with so many of my friends:</p>
<p>Friend: I'm so excited about <a href="http://360andev.com">360|AnDev</a>!<br>Me: Yay! You bought your ticket already, right?<br>Friend: hmm... no.</p>
<p><a href="https://twitter.com/jwilker">John</a> told me that they always procrastinate, no matter what you do. I was sitting at the edge of my seat until the day of the conference, not knowing if we were going to break even.</p>
<p>
I was promoting the conference as hard as I could, but there was still a lot of people who did not hear about the conference, or did not know until it was too late to arrange travel. Perhaps I have been promoting it within my echo chamber? How can I reach out?
</p>
<p class="header">Again?</p>
<p>The conference has come and gone, and yes, we broke even. I went into this knowing that I am not running a conference for the money, but still, the uncertainty was no fun.</p>
<p>Will I run <a href="http://360andev.com">360|AnDev</a> again next year? Right now I am leaning towards yes. I was so happy to see so many people connecting with each other and lifting each other up. With a stellar first edition, I hope next year it will be easier to get sponsors and sell tickets.</p>
<p>Do you want to be a part of <a href="http://360andev.com">360|AnDev</a> next year? <a href="https://goo.gl/forms/lATmzbJS5CWXPfRo1">Sign up</a> to stay in the know!</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com4Holiday Inn Express Denver Downtown39.744449146411675 -104.988304674625439.744258146411674 -104.9886196746254 39.744640146411676 -104.9879896746254tag:blogger.com,1999:blog-8454484600840215087.post-53112371175637043942016-08-06T16:36:00.002-06:002017-05-11T15:36:37.426-06:00360|AnDev: CFP process<p>One of the reasons why I decided to run <a href="http://360andev.com">360|AnDev</a> is that I want a inclusive place for Android developers to learn from each other. Inclusivity has many dimensions: identities, financial status, level of experience, to name a few. We want everyone to feel welcome, and we know that the speakers will set a tone for the whole conference, so we were very careful in our CFP process.</p>
<p class="header">Core track</p>
<p>I know from experience that conferences are great to forge connections that help you in your career, but a lot of beginners fear that they do not have enough background to participate. To address that, we dedicated one room one day to cover fundamental topics, to let beginners know that there is something for them.</p>
<p>The rest of the conference has more advanced topics so that we take of experienced developers as well.</p>
<p class="header">Clear, specific guideline</p>
<p>When I reach out and ask people to speak, they often ask, why would anyone listen to me, and what would I talk about? We address those two questions specifically on the <a href="http://360andev.com/call-for-papers">Call For Papers page</a>.</p>
<blockquote>Contrary to popular belief, you do not need to be an expert to teach. In fact, for fundamental classes it is often best to hear from someone who has just learned it. They know the pain points, and highlight details which may seem obvious to experts.</blockquote>
<p>After that, we offer some topics to get people started. It is not an exhaustive list, but it gives a flavor of what we are looking for, which is much more useful than, "Everything is good, just submit!"</p>
<p class="header">Cover travel cost</p>
<p>We want everyone to be able to come and speak, regardless of their financial situation. It costs quite a bit extra to cover 2 nights of hotel plus flight for each speaker, but we care about inclusivity enough to do so. This way, people don't shy away from submitting because they are between jobs, they work for themselves, their companies have murky policies about conference reimbursements etc.</p>
<p class="header">Q&A hangout</p>
<p>Even with a detailed <a href="http://360andev.com/call-for-papers">CFP page</a>, we know we cannot anticipate all the questions. We hosted a <a href="https://www.youtube.com/watch?v=P8b6aJlNaE0">Q&A hangout</a> for potential speakers to chat with us directly. Yes, we answered questions, but the most powerful part about the hangout is to put a human face behind the conference, to have a chance to tell everyone that, yes, we want you. We have a few talks that resulted directly from the hangout.</p>
<p class="header">Anonymous voting</p>
<p>With all that effort, we hope to have a variety of talk proposals from speakers with different background. Next step is to make sure that the selection process preserves that, rather than just pick out the famous people.</p>
<p>Our talk selection has two rounds. In the first round, we removed all personally identifiable information from titles and abstracts, and send them out to members of the Android community for voting. Here is the voting guideline:</p>
<ul style="list-style: none;">
<li>5: OMG I'll drop everything to see this talk (Please do not give this score to more than 20 talks).</li>
<li>4: I'd like to see this talk.</li>
<li>3: Neutral. I'll probably see this talk, but skip if there is another talk at the same time.</li>
<li>2: I'd rather be in the hallway than see this talk.</li>
<li>1: Offensive/Too commercial/Inappropriate.</li>
<li>0: Abstain.</li>
</ul>
<p>In the second round, <a href="https://twitter.com/devunwired">Dave</a> and I look at proposals from each track, from the highest-scoring one down. For the most part we just take the ones ranked highest by the voters, but sometimes there are multiple proposals on the same topic, and their scores are too close to use as a differentiator.</p>
<p>In that case, we compare the titles and abstracts to see what will be covered. We also look into the speaker to try to get a sense of how well the material will be delivered. This is why this round is no longer anonymous.</p>
<p class="header">Final program</p>
<p>
While there are still many ways to improve, we are very proud of what we managed to achieve for the first year of our conference. Here is our final speaker roster:
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="http://360andev.com/speakers" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0bBYtM626dRjW-ONVRPM88QFbGPUxINekQ-dV6xO6EJtlslnNkDKH7zNqbsmeuOKnPyh5VAk6l1G0zmq0qxiMfV86KC9zFiVBvEi2MxKoJCWOpcPc5p12ayWS5l-oUyHDzqmvDsGq/s640/speakers.png" width="560" height="280" /></a></div><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0Holiday Inn Express Denver Downtown39.744451208772311 -104.9882966279983539.744069708772308 -104.98892712799835 39.744832708772314 -104.98766612799835tag:blogger.com,1999:blog-8454484600840215087.post-49708704567744546402016-07-01T15:29:00.000-06:002016-07-04T11:28:00.450-06:00One year of sketchnoting<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7tAhR8cf-PFCLN8MatHwql_23IPtKCkkwc6WFYNzBEwQSY_9pAJJFlbO497epDgMx71Ede6ghZUjKfQXiLxWf4ujHn1268OsVmYjmuOD0sT3obx0vX71byAIZqNQm0e7UAsHtdgPU/s1600/cactus.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7tAhR8cf-PFCLN8MatHwql_23IPtKCkkwc6WFYNzBEwQSY_9pAJJFlbO497epDgMx71Ede6ghZUjKfQXiLxWf4ujHn1268OsVmYjmuOD0sT3obx0vX71byAIZqNQm0e7UAsHtdgPU/s200/cactus.jpg" width="200" height="200" /></a></div>
<p>
I made my first sketchnote at <a href="http://blog.sqisland.com/2015/03/write-speak-code-write.html">Write/Speak/Code 2015</a> on the impostor syndrome talk by <a href="https://twitter.com/nerdneha">Neha Batra</a>.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Dealing w/ "I cannot draw" by sketchnoting: You Are Not Your Impostor Syndrome by <a href="https://twitter.com/nerdneha">@nerdneha</a> at <a href="https://twitter.com/hashtag/wsc2015conf?src=hash">#wsc2015conf</a> <a href="http://t.co/HTXm5wpYuk">pic.twitter.com/HTXm5wpYuk</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/578567616786264064">March 19, 2015</a></blockquote>
</center>
<p>
I started with a single black pen, added a gray marker as I experimented with shading.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Sketchnote: Tweeting about Speaking. <a href="http://t.co/ZBsSmqM1yc">http://t.co/ZBsSmqM1yc</a><br>Watch me draw it! <a href="http://t.co/l044frq4O9">http://t.co/l044frq4O9</a> <a href="http://t.co/xHvfQ2ON5G">pic.twitter.com/xHvfQ2ON5G</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/597827783650324480">May 11, 2015</a></blockquote>
</center>
<p>
My friend saw the little gray hearts and suggested that I get the primary colors, which was perfect since I was about to attend <a href="http://blog.sqisland.com/2015/05/google-io-2015.html">Google I/O</a>.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Google I/O Keynote <a href="https://twitter.com/hashtag/Sketchnotes?src=hash">#Sketchnotes</a> <a href="https://twitter.com/hashtag/io15?src=hash">#io15</a> <a href="http://t.co/uZ59UC4pPC">pic.twitter.com/uZ59UC4pPC</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/603988249095245825">May 28, 2015</a></blockquote>
</center>
<p>
The overwhelmingly positive reaction I got for my sketchnotes gave me the confidence to try drawing as well, which, mind you, I grew up believing that I cannot draw. It was a pleasant surprise to discover the joy of copying and coloring.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">My umbrella (2nd picture) is falling apart, so I drew the bear on it before I reluctantly throw it away. <a href="https://twitter.com/hashtag/doodle?src=hash">#doodle</a> <a href="https://t.co/mpFshBEsQw">pic.twitter.com/mpFshBEsQw</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/661763758595813378">November 4, 2015</a></blockquote>
</center>
<p>
When I <a href="http://blog.sqisland.com/2015/03/sketchnoting-an-engineers-approach.html">first wrote about sketchnoting</a>, I said there is no way I can draw portraits. Guess what, I do that now!
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Talking <a href="https://twitter.com/gradle">@Gradle</a> with <a href="https://twitter.com/brwngrldev">@brwngrldev</a> on <a href="https://twitter.com/FragmentedCast">@FragmentedCast</a> <a href="https://t.co/neRPu12nEc">https://t.co/neRPu12nEc</a> <a href="https://twitter.com/hashtag/Sketchnotes?src=hash">#Sketchnotes</a> <a href="https://t.co/u4fBIj3Evn">pic.twitter.com/u4fBIj3Evn</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/715212826353278977">March 30, 2016</a></blockquote>
</center>
<p>
At <a href="http://blog.sqisland.com/2016/06/writespeakcode-10x-myself.html">Write/Speak/Code 2016</a> I sketchnoted for Neha again, and it is really fun to see how much I have progressed in a year.
</p>
<center>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="en" dir="ltr">Branding is the most cringeworthy term you want to know about by <a href="https://twitter.com/nerdneha">@nerdneha</a> <a href="https://twitter.com/hashtag/wsc2016conf?src=hash">#wsc2016conf</a> <a href="https://twitter.com/hashtag/sketchnotes?src=hash">#sketchnotes</a> <a href="https://t.co/jeUIdWPo3p">pic.twitter.com/jeUIdWPo3p</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/743527687839416321">June 16, 2016</a></blockquote>
</center>
<p class="header">You can do it too</p>
<p>
I have seen many other engineers start sketchnoting since I posted my first sketchnote last year, and it was been absolutely delightful. Wanna get started? Here are some resources:
</p>
<ul>
<li>My <a href="https://gum.co/Sketchnotes2015">2015</a> and <a href="https://gum.co/Sketchnotes2016">2016</a> sketchnotes</li>
<li><a href="http://blog.sqisland.com/2015/03/sketchnoting-an-engineers-approach.html">Sketchnoting: An Engineer's Approach</a></li>
<li><a href="http://coreylatislaw.com/sketchnoting-for-techies/">Sketchnoting for Techies</a></li>
<li><a href="https://plus.google.com/+VirginiaPoltrack/posts/MvKzqAnepU8">Drawing tools</a></li>
<li><a href="http://coreylatislaw.com/sketchnoters-toolbox">Sketchnoter's Toolbox</a></li>
<li><a href="https://gumroad.com/l/IconCopybook">Icon Copybook</a></li>
<li><a href="https://gumroad.com/l/IconsByNumber">Icons by Number</a></li>
</ul>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-2924880614308641332016-06-25T19:07:00.002-06:002016-06-26T11:55:27.190-06:00Write/Speak/Code: 10x Myself<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh99aZLW-aNVTndYXs1GSUXmKNa890aO7Hnghiq4ywIbFzr0eHS1RVdpHcU9oGUg7q12KTA-t1WhAVr02a8bQ0Rqi-dfU0PpCTGdtv8aAhpirsQYCEtvnZiklHQlAotrgdgbSHYfzdV/s1600/10x.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" class="borderless" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh99aZLW-aNVTndYXs1GSUXmKNa890aO7Hnghiq4ywIbFzr0eHS1RVdpHcU9oGUg7q12KTA-t1WhAVr02a8bQ0Rqi-dfU0PpCTGdtv8aAhpirsQYCEtvnZiklHQlAotrgdgbSHYfzdV/s320/10x.png" /></a></div>
<p>
I am very active in the Android community, blogging and speaking and sharing code, but I can only do so much as one person. To scale my efforts, I mentor others to do the same, which aligns with the goals of <a href="http://blog.sqisland.com/2015/03/write-speak-code.html">Write/Speak/Code</a> exactly.
</p>
<p>
During Write day last year I shared my <a href="http://blog.sqisland.com/2015/03/blogging-formula-conference-reports.html">conference report blogging formula</a>, I have seen it being adopted widely. Some examples:
</p>
<ul>
<li><a href="http://www.kiodev.com/big-android-bbq-2015">Big Android BBQ 2015</a> by <a href="https://twitter.com/kellyshuster">Kelly Shuster</a></li>
<li><a href="https://medium.com/@margaretmz/learnings-from-google-i-o-2016-1c1a89c56e38">What I learned from Google I/O 2016</a> by <a href="https://twitter.com/margaretmz">Margaret Maynard-Reid</a></li>
<li><a href="http://www.adavis.info/2016/06/writespeakcode-2016-recap.html">Write/Speak/Code 2016 Recap</a> by <a href="https://twitter.com/brwngrldev">Annyce Davis</a></li>
</ul>
<p>
For speaking, last year I met fellow Android developers <a href="http://www.yprabhu.com/p/speaking.html">Yash Prabhu</a> and <a href="https://www.youtube.com/watch?v=NFfNiO3CR6w">Danielle Vass</a> at Write/Speak/Code, and I am delighted to see them start their speaking careers shortly afterwards.
</p>
<p>
This year, I was on the writing panel again, and also moderated the conference organizers panel. I hope to inspire many more women to go forth and share their knowledge. Storify:
</p>
<ul>
<li><a href="https://storify.com/chiuki/writing-for-developers-panel-2016">Writing for Developers Panel</a></li>
<li><a href="https://storify.com/chiuki/conference-organizers-panel-2016">Conference Organizers Panel</a></li>
</ul>
<p>
Besides mentoring, I took the opportunity of being surrounded by amazing women to level up my own career as well. One of my <a href="http://blog.sqisland.com/2015/11/2016-speaking-goals.html">2016 speaking goals</a> is to give a keynote, and during Write/Speak/Code I brainstormed and refined a topic that I am super excited about: <a href="http://blog.sqisland.com/2016/06/the-state-of-android-testing.html">The State of Android Testing</a>.
</p>
<center>
<blockquote class="twitter-tweet" data-cards="hidden" data-lang="en"><p lang="en" dir="ltr">The State of Android Testing <a href="https://t.co/q9pfkYcEmQ">https://t.co/q9pfkYcEmQ</a> Like this tweet if you'd like to see me give this keynote at <a href="https://twitter.com/hashtag/DroidconNYC?src=hash">#DroidconNYC</a> ❤</p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/746873976329224192">June 26, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<p>
I'd love to hear your Write/Speak/Code story. Did you get started on writing, speaking or open source because of it? <a href="https://twitter.com/chiuki">Let me know</a>!
</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-54776264822353755212016-06-25T18:41:00.000-06:002016-06-26T12:29:57.553-06:00The State of Android Testing<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaG83rqSxh0qPhtfmLNV1Zi4SMYh79M7RqA42hmEOK0Rr4EQwRRUbl8zaDC20FkBjaeqWIg7_72dFEprYrbn10sl5PasGHDyGq-wrQinm_Z6UHBWItA-huQuuc5aO1WvZ62sgrWmFK/s1600/speaking.jpg" style="display: none"/>
<p>
We all know testing is good for you, but it is very overwhelming. What is a unit test? What is an instrumentation test? <a href="https://google.github.io/android-testing-support-library/docs/espresso">Espresso</a>, <a href="http://robolectric.org">Robolectric</a>, <a href="http://mockito.org">Mockito</a>… what do all these libraries do? More fundamentally, why should I test?
</p>
<p>
I'd like to give a keynote talk to answer all these questions. Do you know a conference that would be interested? Perhaps <a href="http://droidcon.nyc">Droidcon NYC</a>?
</p>
<center>
<blockquote class="twitter-tweet" data-cards="hidden" data-lang="en"><p lang="en" dir="ltr">The State of Android Testing <a href="https://t.co/q9pfkYcEmQ">https://t.co/q9pfkYcEmQ</a> Like this tweet if you'd like to see me give this keynote at <a href="https://twitter.com/hashtag/DroidconNYC?src=hash">#DroidconNYC</a> ❤</p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/746873976329224192">June 26, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
</center><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com2tag:blogger.com,1999:blog-8454484600840215087.post-83601057052166889142016-06-04T17:48:00.000-06:002016-06-05T12:14:40.860-06:00Coding live stream<p>
I first heard about live streaming when I watched <a href="https://www.twitch.tv/lettershoppe">Dina Rodriguez</a> hand lettering on Twitch.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">I thought <a href="https://twitter.com/Twitch">@Twitch</a> is only for gaming, but then I discovered <a href="https://twitter.com/lettershoppe">@lettershoppe</a> <a href="https://t.co/jxNgNoI17v">https://t.co/jxNgNoI17v</a> <a href="https://twitter.com/hashtag/lettering?src=hash">#lettering</a> <a href="https://t.co/4vAhOJAZKX">pic.twitter.com/4vAhOJAZKX</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/688601276934828033">January 17, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<p>
But I wasn't sure what to do in front of a live audience, so I didn't do anything about it until I met <a href="https://twitter.com/LiamSpradlin">Liam Spradlin</a> at Google I/O. He started streaming after watching Dina, and encouraged me to try it, giving me lots of practical tips. There was a lot of <a href="g.co/codelabs/io16">code labs</a> announced at Google I/O, so I thought, hey I want to do them anyway, why not live stream too?
</p>
<p class="header">Software</p>
<p><a href="https://obsproject.com/">OBS, Open Broadcaster Software</a>. Free, available in Windows, Mac and Linux.</p>
<p class="header">Streaming service</p>
<p>
<a href="https://restream.io">restream.io</a>: Stream to many places at the same time. I picked:
</p>
<ul>
<li><a href="https://www.youtube.com/AndroidDialogs/live">YouTube</a></li>
<li><a href="https://www.twitch.tv/AndroidDialogs">Twitch</a></li>
<li><a href="https://www.livecoding.tv/AndroidDialogs">livecoding.tv</a>
(added because of a <a href="https://twitter.com/hondrus/status/735202476555567104">tweet</a>)
</li>
</ul>
<p class="header">Layout</p>
<p>
Here is how my desktop looked like during live stream:
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyyH9iGQFVnMp4eYBzs8K5JtpjJ57lp6N0PKQCj87nwGP1cPGC6Vekf_LaTT1lzwFAzbwJtP9ht11PQdJZ54gE_kZfCoc4xnwZpad3CPuF9HHnP2otrUUxoEp5aq7cxyDKHknSXR8o/s1600/CodingLiveStream.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyyH9iGQFVnMp4eYBzs8K5JtpjJ57lp6N0PKQCj87nwGP1cPGC6Vekf_LaTT1lzwFAzbwJtP9ht11PQdJZ54gE_kZfCoc4xnwZpad3CPuF9HHnP2otrUUxoEp5aq7cxyDKHknSXR8o/s1600/CodingLiveStream.png" /></a></div>
<p>
My monitor resolution is 2560x1600, and I cropped the Display Capture to 1920x1080 so get the 16:9 aspect ratio. I popped out the chats from the 3 services so I can monitor them, but put them outside of the capture area so my audience won't see them.
</p>
<p>
I put the emulator outside as well, and declare it as a source in OBS so it
is always visible, even when I type in Android Studio. If I want to hide it, I move it down in the list of sources in OBS.
</p>
<p>
The last source is my webcam. I cropped it to a square.
</p>
<p>
Here is how it looks like when I stream:
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWEIjEz6ISWP4vrLX_IdDT5oOoV2VpS041230LcQv7fwIpbi-3SEtYl84H4oyTZkKip7G1KVNpXum8Yy_Df5Sow69VsH4nX4DktT0T4w8ir_1Y6aeX_1eu-_VBIJ-DyD64MBpsAh55/s1600/capture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWEIjEz6ISWP4vrLX_IdDT5oOoV2VpS041230LcQv7fwIpbi-3SEtYl84H4oyTZkKip7G1KVNpXum8Yy_Df5Sow69VsH4nX4DktT0T4w8ir_1Y6aeX_1eu-_VBIJ-DyD64MBpsAh55/s320/capture.png" /></a></div>
<p>
The emulator source is in the top right, and the webcam source is in the bottom right.
</p>
<p class="header">Preparation</p>
<ul>
<li>
Click "Start Recording" in OBS to see what it captures, and adjust the microphone, webcam etc as needed.
</li>
<li>
Set up the channels in restream.io, and copy the stream key to OBS.
</li>
<li>
For each channel, set up archiving on the site itself e.g. YouTube.
</li>
<li>
Set up OBS with the instructions from livecoding.tv: <a href="https://www.livecoding.tv/obs-guide">https://www.livecoding.tv/obs-guide</a>
</li>
<li>
Increase the font size of your browser and IDE.
</li>
<li>
Try out a little bit whatever you plan to do while streaming. I was going to stream from my Linux box, but couldn't get the Android Wear N Preivew emulator going, so I had to switch to my Mac.
</li>
<li>
Advertise multiple times before the live stream, and once again after you have started streaming.
</li>
</ul>
<p class="header">Streaming</p>
<p>
Keep an eye out on the chat windows when you stream. Live stream is much less fun without audience interaction! I say my reply out loud, but type links into the chat window so people can click on them.
</p>
<p class="header">Results</p>
<p>
I trimmed the video to skip the initial part when I'm setting things up and waiting for people to show up.
</p>
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/RC8fb2SdyjY?rel=0" frameborder="0" allowfullscreen></iframe>
</center>
<p>
People seem to like it!
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxWSaPovmEh6Fdh1ipx5qPdsURwzPWTfJGbBBAM1BocMs35iiMTBQyGkP1huQ0dPzKjORpKnwiTLmb_45gAm7EyVoHJ7hY_3P831mxdDViq4nPJ_a8ewgjwhfyQS-d-LYHP9vy6FIr/s1600/like.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxWSaPovmEh6Fdh1ipx5qPdsURwzPWTfJGbBBAM1BocMs35iiMTBQyGkP1huQ0dPzKjORpKnwiTLmb_45gAm7EyVoHJ7hY_3P831mxdDViq4nPJ_a8ewgjwhfyQS-d-LYHP9vy6FIr/s400/like.png" /></a></div>
<p class="header">Next</p>
<p>
I'll try to stream once a month. I'll be announcing them on <a href="https://twitter.com/chiuki">Twitter</a>, and you can also subscribe to our <a href="https://www.youtube.com/AndroidDialogs">YouTube channel</a> to get notified of the recorded videos.
</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-44044494843970112502016-06-02T16:51:00.000-06:002016-06-02T16:51:10.780-06:00Advanced Espresso at #io16<p>
I missed the <a href="https://www.youtube.com/watch?v=isihPOY2vS4">Advanced Espresso talk</a> at Google I/O this year because it was at the same time as <a href="https://www.youtube.com/watch?v=tP8yKNXXGmQ&feature=youtu.be&t=8m4s">Building rich fitness experiences with Google Fit platform and Android Wear</a>, where <a href="https://play.google.com/store/apps/details?id=com.sqisland.fitcat">Fit Cat</a> was featured.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Here is a direct link to the point when <a href="https://twitter.com/monziggity">@monziggity</a> starts to talk about <a href="https://twitter.com/hashtag/FitCat?src=hash">#FitCat</a> in the <a href="https://twitter.com/hashtag/io16?src=hash">#io16</a> talk <a href="https://t.co/aKSQEfclfK">https://t.co/aKSQEfclfK</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/736302576207986689">May 27, 2016</a></blockquote>
</center>
<p>
Finally got a chance to watch it at home, and wow, lots of good tips and tricks!
</p>
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/isihPOY2vS4?rel=0" frameborder="0" allowfullscreen></iframe>
</center>
<p class="header">onTransitionToIdle <small>(at <a href="https://youtu.be/isihPOY2vS4?t=10m33s">10:33</a>)</small></p>
<p>
According to the talk, it's preferable to set the state of the idling resource once, and call the idle transition callback when the state changes to idle. A good example is <a href="https://android.googlesource.com/platform/frameworks/testing/+/android-support-test/espresso/contrib/src/main/java/android/support/test/espresso/contrib/CountingIdlingResource.java"><code>CountingIdlingResource</code></a>, in the <code>decrement</code> function.
</p>
<p>
I went back to look at my custom idling resources, and try to skip calling the idle transition callback in <code>isIdleNow</code>. That gives me this error:
</p>
<blockquote><tt>
Caused by: java.lang.IllegalStateException: Resource com.sqisland.espresso.idling_resource.intent_service.IntentServiceIdlingResource isIdleNow() is returning true, but a message indicating that the resource has transitioned from busy to idle was never sent.
</tt>
</blockquote>
<p>
So it's seems like I must call the callback. From the <a href="https://developer.android.com/reference/android/support/test/espresso/IdlingResource.html">doc</a>, it seems harmless to call it multiple times, so I'm going to leave my querying idling resources as is.
</p>
<p>
For idling resources that query the state in <code>isIdleNow</code>, there is no need to call the idle transition callback. See <a href="https://github.com/chiuki/espresso-samples/blob/master/idling-resource-intent-service/app/src/androidTest/java/com/sqisland/espresso/idling_resource/intent_service/IntentServiceIdlingResource.java">IntentServiceIdlingResource</a> for an example.
</p>
<p class="header">loopMainThreadForAtLeast <small>(at <a href="https://youtu.be/isihPOY2vS4?t=11m18s">11:18</a>)</small>
</p>
<p>
Try to avoid it, but if you need some time to pass in your test, do not call <code>Thread.sleep</code> or <code>SystemClock.sleep</code>. Instead, use <code>UiController.loopMainThreadForAtLeast</code>.
</p>
<p>
You will need to make a custom <code>ViewAction</code> to get access to the <code>UiController</code>. Note: Not to store the <code>UIController</code> outside the <code>ViewAction</code>, because it may not be valid any more.
</p>
<p class="header">More tips</p>
<ul>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=12m10s">12:10</a>) Do not copy and paste between tests. Create helper functions.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=13m35s">13:35</a>) Use available Matchers. Write your own only if necessary, with <code>TypeSafeMatcher</code> and <code>BoundedMatcher</code>.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=15m8s">15:08</a>) Use <code>CountingIdlingResource</code>.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=15m54s">15:54</a>) Change <code>IdlingPolicy</code> if the defaults are too short.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=16m35s">16:35</a>) Focus on testing behavior, not layout properties. Use position assertions e.g. <code>isBelow</code> if you must verify layout. They are relative and easier to maintain.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=17m35s">17:35</a>) Write many small tests rather than large ones.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=18m44s">18:44</a>) Launch directly into desired screen and state with intents.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=19m56s">19:56</a>) Most UI tests should be as hermetic as possible.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=20m37s">20:37</a>) Use Espresso Intents to intercept Intents that launch external apps.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=21m19s">21:19</a>) Learn how to run long running animations. Read <code>ANIMATOR_DURATION_SCALE</code> from system settings and disable that in your app when it is zero. Show surface updates from Developer Tools to see hidden animations.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=24m">24:00</a>) Implement your own <code>FailureHandler</code> if you want to log extra information when your test fails.</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=24m41s">24:41</a>) Developer Tools FTW!</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=25m5s">25:05</a>) Change touch and hold delay for slow devices / emulator</li>
<li>(<a href="https://youtu.be/isihPOY2vS4?t=25m49s">25:49</a>) Enable testing for accessibility issues. Super easy: <code>AccessibilityValidator.enable()</code></li>
</ul>
<p>
Thank you <a href="https://twitter.com/wkalic">Wojtek Kaliciński</a> for the informative talk!
</p>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-2671063310091569612016-05-26T10:18:00.000-06:002016-05-26T10:34:22.145-06:00Tips on hosting Google Hangout on Air<p>
My friend <a href="https://twitter.com/yashvprabhu">Yash</a> is hosting an <a href="https://plus.google.com/events/cn5tjr4oe6edva7leb3pvpa8m90">Ask Me Anything via Google Hangout</a>, and asked me for some tips. Thought I'd share them with everyone!
</p>
<p>
Rule number one of Google Hangout: Anything that could go wrong, will.
</p>
<p>
That said, here are a few things you can do to make it better.
</p>
<ol>
<li>
Get on it 15 minutes before event time to get over technical difficulties.
</li>
<li>
Go live 5 minutes before event time so people who come early can already see the live stream. Otherwise their window will stay static until they refresh i.e. they won't know the event has started. Also, by starting a bit early people can start posting questions already.
</li>
<li>
Send reminder emails / tweet after you go live for the same reason as number 2.
</li>
<li>
If you use the Q&A module, beware that it may or may not work. So you may need a different place to post questions e.g. the event comments.
</li>
<li>
It's better to have another person to keep an eye on the questions so you can focus on talking. Have that person ask the questions for you to answer.
</li>
</ol>
<p>
Here is an example of a Google Hangout on Air we did for <a href="http://360andev.com">360|AnDev</a>:
</p>
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/P8b6aJlNaE0?rel=0" frameborder="0" allowfullscreen></iframe>
</center><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-35529630895133382832016-04-03T22:10:00.000-06:002016-04-03T22:11:26.542-06:00Go Code Colorado<p>
<a href="http://gocode.colorado.gov/">Go Code Colorado</a> is a state-wide event to innovate on top of <a href="https://data.colorado.gov/">Colorado open data</a>. <a href="https://github.com/AndroidAtelier">Android Atelier</a> went to Challenge Weekend in Fort Collins.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">We look like a team who might have a business plan. <a href="https://twitter.com/hashtag/gocodeco?src=hash">#gocodeco</a> <a href="https://twitter.com/chiuki">@chiuki</a> <a href="https://twitter.com/KellyShuster">@KellyShuster</a> <a href="https://twitter.com/kenodoggy">@kenodoggy</a> <a href="https://t.co/yZyu4bLFrP">pic.twitter.com/yZyu4bLFrP</a></p>— Sepideh (@sepzilla) <a href="https://twitter.com/sepzilla/status/716400690680082433">April 2, 2016</a></blockquote>
</center>
<p class="header">Preparation</p>
<p>
We wanted to use <a href="https://cartodb.com/">CartoDB</a> to visualize the geo data on the map,
so we went to <a href="http://www.meetup.com/Maptime-Boulder/events/229466840/">Maptime Boulder</a> to learn about it.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Learning CartoDB from <a href="https://twitter.com/geobill1">@geobill1</a> at <a href="https://twitter.com/MaptimeBoulder">@MaptimeBoulder</a> in preparation for <a href="https://twitter.com/GoCodeColorado">@GoCodeColorado</a> <a href="https://t.co/ed57nubWsG">pic.twitter.com/ed57nubWsG</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/715700905966854145">April 1, 2016</a></blockquote>
</center>
<p>
Also, I baked cookies.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">I baked cookies for <a href="https://twitter.com/hashtag/GoCodeFoCo?src=hash">#GoCodeFoCo</a> <a href="https://t.co/jV8szGuvy5">pic.twitter.com/jV8szGuvy5</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/716294224610627586">April 2, 2016</a></blockquote>
</center>
<p class="header">Data</p>
<p>
How are we going to create value? By showing multiple sets of data on the same map.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIAkOUiSQhUFK4DJB6UTcEPl1P3zIKKhuGKvMy7RK-V4oKukWavIhGtJJn_1QyMsm85jCHLo4X-CTmkkaKCbV0HNCHI12_8vd9sroHYRVAJ89it1Avbb1P8-xuzgSdhXvBwFFKMlBq/s1600/IMG_20160403_164422.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIAkOUiSQhUFK4DJB6UTcEPl1P3zIKKhuGKvMy7RK-V4oKukWavIhGtJJn_1QyMsm85jCHLo4X-CTmkkaKCbV0HNCHI12_8vd9sroHYRVAJ89it1Avbb1P8-xuzgSdhXvBwFFKMlBq/s400/IMG_20160403_164422.jpg" /></a></div>
<p>
The different layers made it very easy to parallelize the work. We looked at different data sets and scrubbed the geo data to put it on the map.
</p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Forgot to post this yesterday: We were working intensely! <a href="https://twitter.com/hashtag/gocodefoco?src=hash">#gocodefoco</a> <a href="https://t.co/hXNLUaJGZe">pic.twitter.com/hXNLUaJGZe</a></p>— Chiu-Ki Chan (@chiuki) <a href="https://twitter.com/chiuki/status/716759686066806784">April 3, 2016</a></blockquote>
</center>
<p>
Here is our <a href="https://baghaii.cartodb.com/viz/d0a670c0-f994-11e5-9560-0e674067d321/public_map">working demo</a>:
</p>
<center>
<iframe width="100%" height="520" frameborder="0" src="https://baghaii.cartodb.com/viz/d0a670c0-f994-11e5-9560-0e674067d321/embed_map" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen></iframe>
</center>
<p class="header">Presentation</p>
<p>
Go Code Colorado 2016 centers around the problem statement:
</p>
<blockquote>
Create an app and business concept that helps businesses build a competitive strategy.
</blockquote>
<p>
Our app shows agricultural, demographics and logistics data allowing businesses decide where to set up shop. Here is our presentation:
</p>
<center>
<iframe src="https://docs.google.com/presentation/d/1y2UcK3Kc573OgwVnjV0pR9cydiZgrZfjfKmSvVRjaOs/embed?start=false&loop=false" frameborder="0" width="560" height="344" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
</center>
<p class="header">Winners</p>
<p>Two teams advances per location to the final round.</p>
<p><b>SWO</b></p>
<center>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Celebrating with my awesome team mates on SWO! We're going to the finals in Denver in May. <a href="https://twitter.com/hashtag/gocodefoco?src=hash">#gocodefoco</a> <a href="https://t.co/iojoS5baCE">https://t.co/iojoS5baCE</a></p>— Gretchen Kastetter (@gretchenlynd) <a href="https://twitter.com/gretchenlynd/status/716831013284872192">April 4, 2016</a></blockquote>
</center>
<p>
SWO, or Shop Women Owned, crosses the Colorado business entities with the Social Security Number gender data to showcase women-owned businesses in Colorado. They had a great pitch, and made us realize that we were taking the problem statement too literally.
</p>
<p>
At the end of the day, this is a business pitch competition. Helping businesses build a competitive strategy (Where will I play? How will I win? Is it worth it?) was not a hard requirement. As long as public data is used, any business plan is fine. In this case, SWO promotes women-owned businesses in bulk, without necessarily helping them build a competitive strategy individually.
</p>
<p><b>Colorado Well Spot</b></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCCGFa_oAPNlzYIfmnkRYjFoH1oTWimSnxCF_wwyzHkPELCT_ao-gGMShefUwQSF5ij9yJYsA5QdaT8Onb66nTKG11WczJv9tfq2KAlTqgfwGDwJHNEHN0VZTU0gTJ3PAS-RjO6-Mm/s1600/IMG_20160403_182326.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCCGFa_oAPNlzYIfmnkRYjFoH1oTWimSnxCF_wwyzHkPELCT_ao-gGMShefUwQSF5ij9yJYsA5QdaT8Onb66nTKG11WczJv9tfq2KAlTqgfwGDwJHNEHN0VZTU0gTJ3PAS-RjO6-Mm/s400/IMG_20160403_182326.jpg" /></a></div>
<p>
Colorado Well Spot aggregates public data to help oil and gas companies figure out where they should operate. You would think that they would check and make sure not to drill too close to a school, or right of top of a pipeline. Turns out the data is scattered all over the place, and there is not really a good way to do a comprehensive check.
</p>
<p>
Emily Hueni, the leader of the team, is a GIS specialist with oil and gas experience, and really understands the problem. Once she started talking about the app, we knew they were going to win!
</p>
<p class="header">CartoDB</p>
<p>
<a href="https://cartodb.com/">CartoDB</a> is really nice. I like how I can extrapolate from my existing knowledge of SQL and CSS to customize my map. Even though we did not win, we had lots of fun exploring and visualizing the data.
</p>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0Fort Collins, CO, USA40.588618566012379 -105.0743955373764640.588241566012378 -105.07502603737646 40.588995566012379 -105.07376503737646tag:blogger.com,1999:blog-8454484600840215087.post-16842845425717427092016-03-21T23:29:00.000-06:002016-03-22T15:05:03.512-06:00How to make a podcast transcript<img style="display: none" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI4rDKcVxOx5-4BbJ2nMCDP_-QK_qR61Ryl0greJpZQBHwbO21OTuAeS0xU4JqEjdOGnNCIKQ1Gt6766yo9bQ0hfLevoHhZEnaCMzedtmS_I_9o4Viic7blTP1aGdVLzhzEl9biY-x/s400/transcribe.png" />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNwYoTTAbaSEMk5xZESupX-DI2HcTAPi1hJyw6-LtQTwP_Bed-nqYDWe7-bi10tDZTvkgLbmmAQBuaULnJgJxWHduB_ecX6GBWdUZgSFcroOVevBMyDlin3VEgDGgJ59qwVLb_4jFn/s1600/transcribe.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="borderless" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNwYoTTAbaSEMk5xZESupX-DI2HcTAPi1hJyw6-LtQTwP_Bed-nqYDWe7-bi10tDZTvkgLbmmAQBuaULnJgJxWHduB_ecX6GBWdUZgSFcroOVevBMyDlin3VEgDGgJ59qwVLb_4jFn/s400/transcribe.png" /></a></div>
<p>
I really enjoyed my chat with <a href="https://twitter.com/saronyitbarek">Saron</a> on the <a href="http://www.codenewbie.org/podcast/technically-speaking">CodeNewbie podcast</a>, and wanted to circulate the content more widely. Audio is great, but text is more searchable and thus more discoverable, so I wanted to transcribe the show.
</p>
<p class="header">Automatic transcript via YouTube</p>
<p>
YouTube transcribes for free, all you need is a video. I took the podcast and made a video with a black screen, and uploaded to YouTube. The transcript got maybe 70% right, but not enough to actually understand the show without listening.
</p>
<pre style="border: 1px solid #ccc">
1
00:00:00,000 --> 00:00:12,259
welcome to the gurney podcast when we
talk to people on their current journey
2
00:00:12,259 --> 00:00:16,779
notes about being you on yours I'm your
house around today on the show I'm so
3
00:00:16,779 --> 00:00:21,060
excited to have to teach an independent
Android developer and creator of
4
00:00:21,060 --> 00:00:28,230
technically speaking to be on as a high
so you do a lot of stuff but the main
</pre>
<p class="header">Correct the transcript via Fiverr</p>
<p>
I did not want to correct the transcript myself, so I outsourced it on <a href="https://www.fiverr.com/gigs/transcription">Fiverr</a>. I provided the link to download the podcast, the <code>.srt</code> transcript from YouTube, and some extra information:
</p>
<blockquote>
<ol>
<li>The name of the show is CodeNewbie</li>
<li>The host is Saron Yitbarek</li>
<li>The guest is Chiu-Ki Chan (aka me!)</li>
<li>Technically Speaking is the name of the newsletter we talked about. Please capitalize.</li>
</ol>
</blockquote>
<p>
I got the cleaned transcript the next day, for $30 ($31.5 including fees):
</p>
<pre style="border: 1px solid #ccc">
1
00:00:00,000 --> 00:00:12,259
SARON: Welcome to the CodeNewbie podcast, where we
talk to people on their coding journey
2
00:00:12,259 --> 00:00:16,779
in hopes of helping you on yours. I'm your
host, Saron. Today on the show I'm so
3
00:00:16,779 --> 00:00:21,060
excited to have Chiu-Ki Chan, independent
Android developer and creator of
4
00:00:21,060 --> 00:00:28,230
Technically Speaking. Chiu-Ki, you want to say hi?
CHIU-KI: Hello! SARON: So you do a lot of stuff, but the main
</pre>
<p class="header">Convert to HTML</p>
<p>
The transcript has line breaks that makes it a bit hard to read. I wrote a Python script to convert that to Markdown, then open it in <a href="https://atom.io">Atom</a> to get the HTML.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPL7gTlkj6Aef8ol460Ua8BFt2JsLk7Kc9WobcEKDkZJdrHzpE6w8aW3Vxc8hXihIiN3Fe1GoAULE_C8aJDx0D1lEuxSueAKhnAHsWJ2m0SGzMc6zRRP_2iUujd4IoY-5lX5m5lq6x/s1600/atom.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" width="560" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPL7gTlkj6Aef8ol460Ua8BFt2JsLk7Kc9WobcEKDkZJdrHzpE6w8aW3Vxc8hXihIiN3Fe1GoAULE_C8aJDx0D1lEuxSueAKhnAHsWJ2m0SGzMc6zRRP_2iUujd4IoY-5lX5m5lq6x/s640/atom.png" /></a></div>
<p class="header">Add links and Publish</p>
<p>
This is optional, but when I pasted the HTML to my blog I added some links as well.
</p>
<p>
You can see the results here: <a href="http://blog.sqisland.com/2016/03/codenewbie-podcast-visibility.html">blog.sqisland.com/2016/03/codenewbie-podcast-visibility.html</a>
</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com0tag:blogger.com,1999:blog-8454484600840215087.post-64323337343846269952016-03-20T09:09:00.000-06:002016-03-22T15:04:07.786-06:00CodeNewbie podcast: Visibility<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhUJtphQ6n947qf9TnQ8mDDle4eE-TOG63t-6krCFjVGi2eh2ubRAVMyJJ-B54GKo_x_o-wzXVp4KmmB-qdR1Gib7mp-rSFEBBd34XJZugkApcRRWuM6lPgNYSu6UcKMn92bGEXU4l/s1600/CodeNewbie.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img class="borderless" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhUJtphQ6n947qf9TnQ8mDDle4eE-TOG63t-6krCFjVGi2eh2ubRAVMyJJ-B54GKo_x_o-wzXVp4KmmB-qdR1Gib7mp-rSFEBBd34XJZugkApcRRWuM6lPgNYSu6UcKMn92bGEXU4l/s200/CodeNewbie.png" width="160" height="160"/></a></div>
</td>
<td>
<p>
I was on the <a href="http://www.codenewbie.org/podcast/technically-speaking">CodeNewbie podcast</a> a few weeks ago to talk about blogging, tweeting, speaking, and shared a some tips on how to promote yourself without feeling braggy. I would like to make the content more accessible, and decided to make a transcript of the show.
</p>
<p>
I used YouTube, Fiverr, plus my own python script to produce the transcript. Read how I did it: <a href="http://blog.sqisland.com/2016/03/how-to-make-podcast-transcript.html">How to make a podcast transcript</a>.
</p>
<p>
You can listen to the episode here: <a href="http://www.codenewbie.org/podcast/technically-speaking">http://www.codenewbie.org/podcast/technically-speaking</a>.
</p>
</td>
</tr>
</table>
<hr/>
<p>SARON: Welcome to the CodeNewbie podcast, where we
talk to people on their coding journey
in hopes of helping you on yours. I'm your
host, Saron. Today on the show I'm so
excited to have Chiu-Ki Chan, independent
Android developer and creator of
Technically Speaking. Chiu-Ki, you want to say hi?</p>
<p>CHIU-KI: Hello!</p>
<p>SARON: So you do a lot of stuff, but the main
thing that I know about you, and the thing
that people keep telling me about, is
this thing called Technically Speaking.
so tell us about what that is.</p>
<p>CHIU-KI: <a href="http://techspeak.email">Technically Speaking</a> is a newsletter
about public speaking, and it's mostly
targeted for people who want to speak at
technical conferences, which is why
"Technically Speaking." I was pretty
proud of the name.</p>
<p>SARON: It's a good name.</p>
<p>CHIU-KI: Actually yeah,
when I thought, I was like "Oh, but, but - maybe it's too generic.
And it's OK. I think people got what
I'm trying to get at.</p>
<p>SARON: Yeah.</p>
<p>CHIU-KI: And it actually
got started when I was <a href="http://blog.sqisland.com/2014/11/oredev.html">at a conference</a> with
my friend, <a href="https://twitter.com/catehstn">Cate Huston</a>, and we were
talking about how it is very difficult
to break into the speaking scene, but once
you get started, it's actually not too
difficult to keep going as a speaker. So
we want to try to help people who are
interested or just have an inkling that
oh, maybe this is something that they
want to do because it's good for their
career or because that's something that
they see other people do and they thought
it's neat. Whatever reason it is, we
just want to have a way for people to
get started. And then we decided on a
newsletter because we figured that
if we have a website, we'll probably just
forget to update it. A lot of the speaking stuff is very timely, right?
A particular conferences is looking for people, and then you put it there, and
then two years later people come back and look and say,
"You know, this site is dead." So we didn't want
that, which is why we went for the
newsletter format.</p>
<p>SORAN: So what was the
mission? Who are you trying to help? What are
you trying to accomplish with this
newsletter?</p>
<p>CHIU-KI: That's an interesting question, because
the way it started out, we were just saying
that, oh, you know, just people who are
interested in speaking at conferences.
But because both of us are women and we
wanted to see more women on stage, we
make it a point to include 50% content
that is either about women or
generated by women. And that ended up
somehow branding us as something
targeted for women, which is very
interesting because we were not aiming
for women; we were just aiming for balance.</p>
<p>SARON: Yes.</p>
<p>CHIU-KI: I guess our industry is so tilted
towards men that having something 50-50
automatically gets you the label "Wow, it's
for women."</p>
<p>SARON: Isn't that so interesting, how it works out that way?</p>
<p>CHIU-KI: Yeah.</p>
<p>SARON: That's
not the point, but...</p>
<p>CHIU-KI: We never marketed ourselves as "Ooh, it's for technical
women," but it ended up being that way.
People look at us that way, which I
mean, I don't mind, but I just find it
very fascinating.</p>
<p>SARON: It's very telling of
the industry more so than it is, you know,
you and your product. It's an interesting
observation.</p>
<p>CHIU-KI: Yeah.</p>
<p>SARON: So one of the
things that I love about this is
a lot of times when you hear about
a CFP, like you said, it's very timely, right?
You just so happen to have heard
about it at the right time and the right
situation,
and hopefully you have an idea
to submit. And if you don't know about it,
then you kind of miss your opportunity. So
you're making it more accessible
to a lot of people, and I'm really
excited and I'm really hoping that a lot of new
speakers and new developers really take
advantage of a lot of the legwork that
you've already done. Every week in
my inbox, I get a list of upcoming talks,
and now I have no excuse to not speak
and not submit. So have you seen people
who wouldn't ordinarily speak, the
people who are not regular speakers? Have
you seen them take advantage of this
opportunity?</p>
<p>CHIU-KI: Oh yeah, definitely. So actually last year -
so the newsletter started in November 2014,
so last November we celebrated our one-year
anniversary.</p>
<p>SARON: Congratulations.</p>
<p>CHIU-KI: Thank you. And as part of the celebration,
what we wanted to do was have people
essentially submit their stories
about - actually, no, I got it wrong.
Let's take it back. That was our six-month
anniversary. So I'm going to talk about both.
The <a href="http://tinyletter.com/techspeak/letters/technically-speaking-may-5-2015">six-month anniversary</a>, what we wanted to
do is for people to write in and tell
us what action, what concrete action
they took as a result of the newsletter.
So some of them wrote blog posts, some of them
posted a tweet, and there are definitely
people who told us that "Hey, I just gave
my first conference talk. Thank you so
much for just making it happen." Part
of it just is something that you think -
you know, you have to be an expert, you
have to be someone that just knows
everything. And having that newsletter,
reading stories about what other
people did, really removed that mystery of like,
how do you become a speaker? A lot of people were
more courageous to step, to take the first step.
And then for our first year we did something
slightly different, which is we did <a href="http://tinyletter.com/techspeak/letters/technically-speaking-november-3-2015">one-on-one
coaching</a>. So if you wrote a list
of essentially your 2016 goals, like what do
you want to do in terms of public
speaking, and post it somewhere public,
then we pair you up with someone who
are already speaking and try to come
up with a game plan with you.
So that we don't know yet, because this just
happened two months ago, so we don't have
any - well, we should follow up and
ask people, "So, what happened
after the one-on-one sessions?" Yeah, so I'm
definitely seeing action coming off
the newsletter, which is really, really
rewarding.</p>
<p>SARON: So what do you think are some
of the advantages of speaking?</p>
<p>CHIU-KI: There are multiple. One is that I don't know
about you, but when I go attend a conference,
I really don't like the "networking," the small talk.
Like, you're in a big room and you go around and
you have to put yourself out there to
introduce yourself. Because you know, right? You are at
a conference to meet people, and there
are a lot of good things that come out
of meeting people. But just doing that
little small talk, saying "Hey, my name is
Chiu-Ki, I'm an Android developer" - for
me, I don't like doing that. But if you're
a speaker, you in a way introduce
yourself in broadcast on stage, right? So you
went on stage, you talked about a particular
topic that, well, you have enough to talk
about for 15 minutes or 50 minutes. So after
that, when you run into people during
coffee breaks or lunch or any of the
social events, people will come up to you and
say, "Hey, I went to your talk. It was really
great, and I have a little bit of follow-up
discussion that I want to have with you."
So to skip all that, for me,
annoying small talk and jump right into
the interesting part - that's huge. In a
way - I mean I am not in any way an
introvert; I am still afraid of doing
small talk, and I have also heard people
who told me that. Like they'd
rather go hide in a corner
than put themselves out there. But doing that one lump of
"Whoa, I'm so scared. I put myself out there," and give a
talk - that, you can reap the benefits afterwards
for the whole conference.</p>
<p>SARON: That is
so interesting. I never thought of it
that way. I never thought of it as a
solution to, you know, to not...</p>
<p>CHIU-KI: Just get it done once and
for all, right? Rather than repeat it 15 times.</p>
<p>SARON: Right. And, when you get it
done once and for all, it's scripted.
You get to prepare for it, you have your slides, you know
exactly what you're going to say, when you're going
to say it. You don't have to respond
spontaneously to different people and
react. So I can definitely see that as being a
solution to small talk. That's a really great
way to look at it. I like that, yeah.</p>
<p>CHIU-KI: Yeah, so
for me that was almost a side benefit. Actually,
I didn't start
public speaking because I wanted to solve
the small talk problem. I just noticed that
once I started doing this, I was like "Oh hey,
this is really nice! I don't have to
bother with going around the room and
trying to introduce myself, because people
come to me." So when I started - and this is
true, still - what I wanted to do is
essentially make a name for myself. I mean, that sounds really
egoistic.</p>
<p>SHARON: No, good for you. Make that name.</p>
<p>CHIU-KI: Yeah, because
I'm an independent developer, so I go
around and I have to go tell clients to
hire me to write Android apps for them. And
having some recorded talks out there and
just saying "Hey look, I know what I'm
talking about. Like, I literally know what
I'm talking about. I talked about it for
an hour" - that is really helpful. It's
really concrete. Because a lot of the
times - well, I guess sure,
you look for a job with resumes, but
resume in a way for me is keyword
stuffing.
You just put things in there, hoping that it catches someone's attention.</p>
<p>SARON: Right,
something clicks.</p>
<p>CHIU-KI: Right. But if you are giving a full lecture on the topic, that
really tells a lot about you
as not just a developer. So you
have to know your technology, but you
also have to know how to communicate, how
to express yourself, how to explain
complex concepts. And they see
more of you than just the two-
dimensional you on a piece of paper.
So for me, that was the initial goal.
I wanted to be able to have essentially a
living resume, almost. Like, "Hey,
this is me. Look, you can watch me explain
what I do." And that for me was really
helpful for my career, but not in that
sense - I don't know if you noticed a theme,
a lot of things I started doing and
then I saw the side effect and I liked
the side effect better. So I didn't
actually get any direct - what do you call it, leads
out of speaking. I ended up having a lot of
my clients as friends of friends, so not
necessarily strangers that watch my talk.
But by speaking I get to meet a lot of
people at conferences and also I get to
essentially share what I know.
That helped establish myself as "Hey, she
knows her Android things." So I think
indirectly when I get hired by my
clients, they know that "Oh OK, I think we
can give her the benefit of the doubt that
she can do what she claims she can do."</p>
<p>SARON: I
like that. I like that a lot. I love the idea of speaking as
your living resume.</p>
<p>
CHIU-KI: I just came up with
that, by the way.</p>
<p>SARON: Genius. So one of the things that you said
a little bit earlier really stuck out to me, where
you said "I want to do this to
make a name for myself," and then you
followed up by saying "Not to
sound too egotistical." And I think that
that feeling, that feeling of "I
want to advance my career, I want to put
myself out there, I want to build
recognition and expertise... but at the
same time, I'm hesitant to be a
self-promoter, I'm hesitant to feel
braggy" - and it sounds like something that
you've dealt with too.</p>
<p>CHIU-KI: I think
part of it is, I'm not sure if it's
something specific to my upbringing or
everybody faced that problem, but I grew
up in Hong Kong, and our culture is a lot
about don't stand out. Like for example,
when I was in school, I remember I
was maybe in 8th grade, and - I mean, it's
kind of a Hermoine moment. As the teacher
asked a question, I know the answer, so I
raise my hand
and answer the question. It sounds
straightforward. But one of my really
good friends pulled me aside one day and told me,
"Look, even if you know the
answer, you should not answer all the
questions because people don't like it.
People don't like people who show off."
And at that point I didn't even realize that it's
a problem. I guess I was just naive. But
then after that, I was like "Oh, OK.
This is something that people will view
negatively if you are showing off,
essentially." Also, the Chinese culture is a little bit
different. We have very intricate
protocols about - like basically you praise
someone and then they say "No,
it's nothing," and then you praise
again. So it's not very easy to
just come out and say, "I am the best." You don't
do that, pretty much. And I guess
I have carried that with me even though
now I'm in America, which is a little
bit different. At least when I was going
through in my job, every six months or year
or so you have to do a performance
review and you have to write about the great
thing you did for the company, and
that is really uncomfortable that you
have to list out all your
accomplishments. So yeah, I mean, that's
kind of my explanation why I feel that I
should not brag. That
other people don't like it, basically.</p>
<p>SARON: And I don't
think that's just you. I know lots of
people, a lot of friends of mine who
I'll talk to and I'll say,
"You should really put that on
your profile, share that, tweet that, go on
stage, talk," whatever it is, and
there's a lot of "Oh, I just, you
know, I don't want to be too promote-y."
This idea of self-promotion is being
seen as negative. So coming from a
culture where that's how it is, how have
you countered that? How have you dealt with
those feelings of discomfort and still
going out and speaking and making sure
that people know about your work?</p>
<p>CHIU-KI: Well, I
guess it comes in two stages. The
first stage is, like I said, during
company performance review, I feel like
this is something I need to do. It's not a
choice. I don't get to choose
to write about my achievement or not.
Because I don't want the
company to view me as someone who is
useless and just fire me either.</p>
<p>SARON: That's true.</p>
<p>CHIU-KI: So
the first stage is I read a lot of self-help books. All the books about how to
advance your career, how to speak up, how to
toot your own horn without bragging.
I think that's an actual title of a book; I'm not 100% sure.
So I went through a big phase of just
prepping myself and getting excited
about telling other people how great I am.
That worked to a certain extent. I wouldn't say
that that was - I mean, that got the
thought planted that it's okay.</p>
<p>SARON: It helps, yeah.</p>
<p>CHIU-KI: It's like, this is a big enough topic that
there is a whole bookshelf of books
about this, so it's something that I need to do
and I'm not comfortable doing it. It's fine.
It's something I need to learn. And I think that's
a good way of putting it, is it's a skill that
you need to learn, much like programming,
much like learning to write almost.
It's not natural. Nobody just knows how to
tell others about the good works that
they do. So once I got comfortable with
the idea, then there's the execution.
What exactly do you do? And that kind of
came after I became independent.
For some reason, once I left a corporate job
and I know that I have to fend for
myself in terms of just demonstrating
that
"Hey, I am good. You should hire me," then
I'm much more comfortable in just
writing on my blog or being visible on
Twitter and just trying - I feel like once
I make it a goal, then it's OK. Rather than
I did something and then as a second
thought "I should promote it," I make it
really, really forefront of what
I'm doing. I write code, but I also tell
people what I wrote about. So that,
I feel like it's almost a mind trick. I just
told myself that, "Look, this is something you
do now, so just go do it."</p>
<p>SARON: This is who you are, yes.</p>
<p>CHIU-KI: And also, one thing I realized is that when I
first started, nobody's reading my blog. I have no Twitter
followers. So I can brag all I want; it's not like anybody is
listening. That's a very comforting thought.
So that helped a lot, actually.
I will try to post - I'll write a blog post and post it
on my Twitter, which then my friends
will come and like it, and I'm like "thank you!" But
it's not really braggy, I feel
like, because I felt like I'm just
yelling in the air; there's
nobody there, really, to judge me I guess.</p>
<p>SARON: That is so interesting, because I've
heard from so many people that the
reason why they don't want to blog and
they don't want to tweet and they don't want to do that
is because they say, "What's the point?
No one's going to read it anyway." And instead,
what you're saying is, "Great! I'm so happy
no one is reading it because that gives
me the freedom to put myself out there
and to self-promote without worrying
about people judging me as much."
I really like the different take on that situation. Yeah.</p>
<p>CHIU-KI: For some reason, people are really afraid of
people throwing rocks at them, almost, right?
Because if I write a blog post about
some technical topic and I'm wrong,
oh, the horrors! There will be hoards of people coming after me
and telling me that I'm wrong.
But the truth is there's no one reading your blog.</p>
<p>SARON: So it's
OK. It doesn't matter.</p>
<p>CHIU-KI: I'm sorry to tell you, but there will
not be hoards of people to tell you that
you're wrong. I mean sure, it's
sad that you are just yelling in the air, but on the
other hand, it's a great chance to
experiment.</p>
<p>SARON: Yeah.</p>
<p>CHIU-KI: Just do something, write something,
and then if some posts end up being read,
great! Then you'll end up building your audience. And if
not, well, try something different. There's, like I
said, no one there to critique you.</p>
<p>SARON: I think another
problem that I've heard in our community
is this idea that the thing they did or
accomplished isn't worth promoting.
You learn something, and especially if
you're at the very beginning of your
journey, you go "Well everyone else already knows
that, so what is there to
celebrate?" Have you had those feelings before?</p>
<p>CHIU-KI: Hmm, that's interesting. Personally,
when I first started doing all this
blogging and tweeting and stuff, I
do have - not necessarily that "Oh,
whatever I have to say, somebody else
already knows," but more like "I don't have
anything to say period." It's not like I come
up with something to say and then I
silence myself because I feel like it's
not worth saying. I feel like somehow I nip the idea
even earlier, you know what I mean? And usually, by the
time I come up with an idea, like I have
invested enough time in it, then I
will just go for it. So in a way it's a
mindset. That's
my personal experience. It's not like, "Oh, let's talk about X"
and then my left hand says, "No, don't do that! That's stupid! Nobody wants
to hear about that!" It's not like that. It stops even earlier than that. I don't even
come to the idea generation phase. I would
just sit back and say,
"Why bother?"</p>
<p>SARON: Do you feel like that results in you
possibly dismissing good ideas before
you really give yourself a chance?"</p>
<p>CHIU-KI: I feel
like it's so internalized. I didn't
even get a chance to have that internal
dialogue, like "Ooh, let's write about this." "No,
don't do that, that's stupid." That just
played itself without manifesting in
concrete ideas in my head. Just, my
brain just stifled itself, like "No, don't
even bother thinking about it." Of course,
you know this is all
looking back in three years, I would say. I
started blogging about three years ago. And it's
almost like going to the gym: just keep
doing it until it's like, "Hey, you know what?
I can lift a lot more now."
Which by the way I don't go to the gym.
Just a metaphor. But for my blog, I
definitely feel that way. In the beginning,
in a way I was just forcing myself to go
write this thing, and then it seems very
clumsy, and I don't want to read it
myself. But nowadays I actually enjoy my own reading, which is crazy
right?</p>
<p>SARON: That's awesome.</p>
<p>CHIU-KI: I am so trained to not praise myself and
not say anything good about myself that
I feel embarrassed about telling you
that I enjoy my own reading. I like the
way I structure my articles. I have my
own little formulas; I chunk
things up into smaller paragraphs so that
they are easier for me to write, but also
easier to read. So I have my own bag of
tricks by now, like building up. But
you know, three years, is that a long time?
I don't think so. It didn't feel
like "Wow, it took me 20 years to come
here from the beginning." I think I went
from "Oh, I have nothing to say" to oh, OK, now I
have
a pretty good idea of how to structure a
blog post. And when I'm coding, I'm
actually paying attention to like, "Ooh,
that could be something that is
interesting to talk about." So it is
really for me a mindset. Just
switching from "Oh no, who am I? Why would I
blog about anything?" to now I have a blog, I
have a few articles out there; let me pay
more attention. And it's not even
intentional that I'm paying attention to
things that I'm doing, always mining
for opportunities to tweet or blog, but it's more
like since I started doing that,
my subconscious is just like "Oh OK boss,
that's what you do, huh? I'll pay
attention now." Which is cool.</p>
<p>SARON: That is cool.</p>
<p>CHIU-KI: I don't
understand how the human mind works, but at least that's how it works
for me, is once I started doing that, then
I see things differently.</p>
<p>SARON: It sounds
like a large part of you blogging
consistently and speaking and doing all
these things is not so much about being
comfortable, it's not about wanting to do
it and necessarily being excited about
doing it; it's about recognizing that
it's important and just being disciplined
about doing it anyway and trusting that
as long as you get in this rhythm and
have a consistent process of just doing it,
that eventually you'll be proud of it
and you'll be able to self-promote
without it feeling so squeamish.</p>
<p>CHIU-KI: Yeah.
I think a large part is telling
myself that it's about the quantity, not about the
quality. Just write it. Write something; it
doesn't really matter. Just do it. I mean, some
people are even more vigorous than that.
They actually keep a schedule. I don't. I
think in the beginning maybe I did.
I don't even remember. Because I have this vague
notion that I should blog more if I
want to be an independent and be known
for my work. But even now, I
will go sometimes to look at my blog and say "Oh, I
didn't write at all last month. Oh well, too
bad. I guess it was Christmas." I don't give
myself a hard time not writing because
I know that I am writing "enough,"
whatever that means. But when I first
started, there were definitely moments when
I'm like, "OK, this thing that seems remotely
interesting, maybe I should write about it... ugh,
are you kidding me? Do I have to do this?" There's
definitely moments where you know what? Just
go through the motion, figure out, type it up.
And usually once I type it up and I'm reading it again, I'm like
"You know what? This is not half bad. Let's just hit that submit button
already." So convincing myself to do it.</p>
<p>SARON: Yes.</p>
<p>CHIU-KI: Usually once it comes out, then I look at it and say
"that wasn't too bad." So I just really have to
convince myself that, just do it.
I actually sometimes tell myself, "If it's not good,
throw it away." It never happened. Once I
committed myself - I'm all about
committing device. If I need
to go exercise, I sign up for a class. Once
I'm committed, I do it. So once I'm
committed to writing it and I get
started, then I will keep doing it.
That has worked pretty well for me.</p>
<p>SARON: Yeah. So we talked about blogging, we
talked about speaking; what are some
other ways that you've been able to make
your work more visible?</p>
<p>CHIU-KI: Tweeting is a
lightweight way of blogging, in a sense.
And again, tweeting for me was also
actually really, really difficult to pick
up in the beginning. I sign up for an
account and I don't really have anything
to say. It was kind of funny; like, "I know
Twitter is very useful for connecting
with other people in the industry," and I
sign up and - it doesn't work the
same way as blogging, is what I'm trying
to get at. If you want to write an article,
you can sit down, come up with a topic and just do
it. Tweeting is much more nebulous. Like, how do I participate on
Twitter? So for me, the breakthrough was actually going to a
conference and just - usually when you go to a conference,
they have a conference hashtag and
people will post things that are related
to that conference with the hashtag. So I
started following and trying to see what
other people do. I was like, "Oh, this is brilliant."
I would see people, for example, they will
listen to a lecture and write down some -
not really catchphrases, but
interesting points, and then other people will retweet those.
I was like, "OK, that I can do."
So I started off with just retweeting
other people's things when I go to
conferences, so it's a very, very specific
little niche of how I used Twitter. And then I
started - "Oh OK, this is the kind of thing
that people will report, essentially,
during a conference." Let me try that too.
So if someone put up a slide that has an
interesting quote, I'll type that up and put the hashtag in.
So gradually that got me started on Twitter.
Then nowadays, I apply the same
lesson after a conference, or maybe
I will be reading certain articles like, "Ooh,
that's interesting." I'll post a link and
just put the title of the article. I
don't agonize too much over "Oh, I
need to put something witty in it." But then
much like blogging, I started
noticing things. Actually, one thing
that was really funny - at least
I thought - so basically nowadays,
tweeting to me is such a habit that I have
tweetable moments in life. One day, it was maybe a year or
two ago, we were at a supermarket and
we were getting a jug of milk, and my
husband said, "Wow, milk is more expensive
than gasoline."
Any normal person would just laugh,
get the milk, and go on with
life, but me, I was like, "Oh, that's a tweet! Wait!" So I
stood there, took a picture of the milk jug and the price tag, and then
I <a href="https://twitter.com/chiuki/status/556885189775728640">posted on Twitter</a>. Actually I think I
phrased it slightly differently; I put
"OH" which is overheard, "I wish we can drink gasoline,"
and then there was just the milk and the price.
But this is not something normal people
do. Normal people will just make a comment to their wife
and continue with life. But kind of going around
the same theme is once you
start doing it, then you pick up certain
tricks and habits and things become much
easier afterwards. So I really like
that. Nowadays I'm pretty active
on Twitter, but I mostly do a lot of
technical tweets. If I read an
interesting article, I will post a link. Or
if I wrote one, I would definitely post it.
That's actually another reason that I got
more comfortable with promoting my stuff,
is that I feel like I've built up my
Twitter feed in such a way that it's not
just me, me, me, me, me. I share other
people's stuff. Last night I was cooking
and I was using a cooking thermometer, which
is a very nerdy thing to do, but hey,
I'm a developer; it's okay. So I posted a picture of the cooking
thermometer in my fish. So it's not just me talking about things that I do
that is "Oh look at this crazy
technique that I'm using so that my
app is more responsive." It's not always
just showing off how cool I am.
I talk about other things. I share other
people's content. So that helped a lot to
too, just getting a good mix, essentially.
Then I feel I'm just sneaking in my little
braggy stuff among all the other things that I
talk about. Which is life. I mean, that's how I am. A person.
I don't walk around talking about what I do
all day long; I talk about other things too.
So I reflect that
in my Twitter presence.</p>
<p>SORAN: Yeah, I like that.
So what advice do you have for people
who are a little bit newer? Because you
learned to code many years ago, and you've
been in tech for a while, and I'm wondering
how can people who are just getting
started, who are maybe a year into
coding, hoping to get their
first job - how can they share their
progress and the work they're doing so
that in the future it helps
them get that job, make those connections,
and really advance their career?</p>
<p>CHIU-KI: I think part of
it is - I mean, even I'm struggling with that, is that
I don't want to show my weakness, almost.
For example, when I write a blog -
it has evolved. In the beginning I would
only write about my final solution, the
perfect, all shiny "this is how
this is done because I know what I'm
doing." But nowadays I actually go
through a little bit more storytelling,
almost. So I always start my blog post with like
"This is what I'm trying to do. I tried X,
Y, and Z, and they don't work, and finally I
tried this other thing and it worked." So I
feel like getting comfortable with just
telling it as a narrative of "this
is what I am doing" - not necessarily
phrase it as "this is the one and only way to
do it" - that's very helpful, and I feel
like you could do that whichever stage
you are in your career. In the
beginning, maybe that will be "I have ABCDEFG
and I've tried a million things. They all don't
work" and then your blog post just stops there.
It's okay. It doesn't have to be
everything is perfect, even though a lot
of us would like to present ourselves as
flawless and amazing. So I understand.
I tell myself to do that and I can't
get myself to do that 100% of
the time, so I wouldn't necessarily say
it's advice, but it's something that's
worth trying. Just let go of the
notion that it has to be perfect before
you put it out to the world.
But the important part is
you're explaining that "This is what I'm
trying and this doesn't work because
of this." It's not just "Oh OK, I
cannot do anything. Everything just
failed." Don't phrase it that way, but it's more like
"Wow, this thing is more complicated
than I initially thought. I tried this and
that." So that would be, like I said, not
quite an advice, but I think it's worth
trying and seeing where that takes you. Maybe
you are super uncomfortable doing that, you don't
like putting yourself out there, telling
people that "Yeah, I walk into dead ends
all the time." Which to be honest,
that's how programming is. I feel like
people will understand. If you're always
painting a rosy picture, that's almost
too fake in a way.</p>
<p>SARON: Yeah, people will definitely see right
through that.</p>
<p>CHIU-KI: Yeah. And then also, like I was saying earlier,
it doesn't always necessarily have to be
something that you have done.
Like conference is a great example, where
you can report on what has happened.
You can say that "Oh wow, I went to
this talk and I wanted to try this
thing." You don't even need to necessarily
try it at that point in time. You can just say "I want to
try it" and just put it out there and
get the conversation going.
I feel like at least that's how - I think that's
how I transitioned from "I have nothing to
say" to "Wow, OK, I regularly
have something to say. It's like I
broadened my sense of what I can
share. Because for some reason, I really
constrained myself in the beginning that it
has to be finished, polished, and perfect
before I show it to the world. But now I
do a lot of "Oh, that thing looks interesting. I
should look into that." Sometimes I even say I
"should" look into that. I'm not even committing myself to
looking into; I'm just saying that it looks
interesting. And that has value.
Even though maybe all you have is a link
to something that you've never seen
before, maybe other people have not seen
that either. So just broadening to
things that you wish you were doing,
things that are half done, things that you
started doing but did not finish because
of various reasons. It's OK. It's OK to
document all those things.</p>
<p>SARON: So next let's move on to some rapid-fire
fill in the blanks. Are you ready?</p>
<p>CHIU-KI: Yep.</p>
<p>SARON: Number 1: "Worst advice I've ever received is..."</p>
<p>CHIU-KI: This is not specifically directed to me, but it's more
in general, that you should go find a mentor.</p>
<p>SARON: Ooh, tell me about that.</p>
<p>CHIU-KI: So
I picked this kind of on purpose
because its controversial.</p>
<p>SARON: I was going to say, yeah.</p>
<p>CHIU-KI: Yeah. What I mean
is that for some reason there's this notion that if I
want to advance in my career, what I need
to do is to find that one person, one
special person that will hold my hand
and lead me to my next level or the next
thing I need to do. And I tried that. I
tried that for years and that didn't bring me anywhere.
There will be companies that have, for example -
it's all in good intention - they'll have a
corporate program that pair up people and
have them mentor maybe junior people and help
them. But the problem at least I
personally experienced is that I walk in,
I don't really know what I want out of it;
the mentor doesn't know what he or she
should be doing to help me. So in the end,
we meet once a month and then we meet
not really and then nothing happens. So
that's the worst advice. But there's
a very easy way to flip that. Basically all you need to do
is find mentors.</p>
<p>SARON: Interesting.</p>
<p>CHIU-KI: Instead of one singular person.
The way I look at it is instead of going
into a fancy restaurant and getting a
chef's choice and every course is laid
out for you and you can just sit down
and eat them all and be full, you're going
a la carte, basically. You have to look at
every single aspect of your career and
decide what you want to do and then
find a person that can help you. And it
may be one person; it may be ten people
for ten different things. Because at that
point, then it's become much more focused.
So maybe you want to start public
speaking,
and maybe you are an Android developer.
So then you started going to the
different conference websites and see
what people do, and then maybe you'll find
somebody that seems interesting. At that
point, also mentorship is not a very - for
me, not a very rigid concept. It's not
necessarily "Oh, let's meet once a month
and talk about what I need to do next." I
will consider someone my mentor - actually
I have a lot of mentors that don't know that they
are my mentor because</p>
<p>SARON: I have a lot of those too.</p>
<p>CHIU-KI: Exactly. When I first started speaking I would go look
for people that I feel like is what I always call 2 years ahead of me, essentially.
They're 2 years ahead of me, they're already speaking, and I see
what they do. I follow them on Twitter. It sounds really stalky, sounds kind of creepy.
But what I do is I emulate. I find people that are doing
things that I want to do myself, and I observe what
they do and then I try it. Much like I was
telling you about when I go to
conferences, I see other people tweeting,
I do that. There are a few
people that I am observing very
carefully what they do on Twitter and
try to reverse engineer and figure it out. I
never go to them and say "Hey, will you be
my mentor?" No. But eventually usually what
happened is that then I ended up
replying to their tweets and seeing
them at different events and we become
friends, but I never actually come out and tell them that actually, secretly,
you have been my mentor for all these years. I don't do that. But I do have many different
people that I consider my mentor in the
sense that OK, I want to figure out how
to do this thing. How do I contribute to
open source maybe. And I'll find
some project that have people that are really
active and see what they do, and then
I'll figure it out. And sometimes I do reach out
and specifically ask questions. But
I never use the word "mentor." I'll reach out and say
"Hey, I saw that you've been doing
this for quite a while, and I want to
get started on it," and I have a few
really concrete questions that I would
ask them and say maybe something very
specific, like "How does a pull request work?
How do you squash a commit -"
something really super specific.</p>
<p>SARON: Very specific, yeah.</p>
<p>CHIU-KI: Right. That way they know how to help me,
and I want to help them help me, essentially. Which I feel like
when you just have this romantic notion that "if only I had
a mentor, then my career would be all set,"
that is not going to help you.
I mean, I know people that have that in
their life, that they have this one
person that really guided them and helped
them move to the next stage. Great
for them, but I feel like it's not
something that you can pursue. If it
happens to you, it's great but I - at least I
tried and that didn't work, and I feel
like finding multiple people is a much
more reliable way of actually getting
the mentorship that I need.</p>
<p>SARON: I like that. Number 2: "My first coding project was
about..."</p>
<p>CHIU-KI: I actually started coding very
early. So when I was eight, my mom brought
home a computer that her company didn't want;
they upgraded to something better. And I
ended up learning BASIC programming,
which is a programming language that is
very close to assembly I would say. So
it's kind of low-level. So I learned that;
I went to - my mom signed me up for
a community center
course, so I was learning programming. I
don't think she even knew I was learning
programming; I think she thought it's a
class to learn how to use the
mouse and type and things like that. But I loved it.
I really like - I was eight, so I really
liked the fact that I can tell the computer
to do something and it will
do it. I think - I mean, I don't think
that's the very, very first program that I
wrote, but the very first that I remember was
a hangman program. I gave it an array of words,
and then it renders little dashes and then
you can put letters and it will
show which one you got right. And I was
so excited, and I was forcing my cousin to
play it and she was not interested at all.
But my cousin was also much younger than me.
I was eight; I don't know how old she was. She was maybe four.
I don't think a 4-year-old is interested in hangman. Yeah, that's my very first programming
project.</p>
<p>SARON: Very cool.
Number 3: "One thing I wish I knew
when I first started to code is..."</p>
<p>CHIU-KI: I wish I
knew that it's okay to ask questions.
I feel like when I've - it's not even when I
first started. I've been working for a long
time. But every time I have something that I
want to ask someone about, I will research
extensively. I'm making sure that I have all
grounds covered before I reach out and
ask someone because I don't want to
waste their time. And what I've
discovered is that the process of asking
a question actually helps me clarify
what I'm confused about.</p>
<p>SARON: Yes.</p>
<p>CHIU-KI: So what I have done instead - I don't
walk up to people and ask questions just
randomly just because that is really
disruptive. What I try to do is try to
write emails. I would start an email, I
would type out basically
what I couldn't do. "I'm trying to do
this but it doesn't work." I have to explain
myself, "I tried this, I tried that, I tried
that." Usually I'll be like, "Oh, I didn't
try that other thing yet." So I would save that
draft, go try the other thing, come back
and "Oh, OK. That's how it's done." So then I discard the draft.
I didn't actually even need to send out the
question. So just going through the
motion of asking the question</p>
<p>SARON: The process.</p>
<p>CHIU-KI: Yeah, the process of formulating your question
helped so much. And don't get me wrong;
that's maybe 20% of the case.
I do actually, the other 80%, do go out
and ask my questions. It is very
intimidating in the sense that once again, you're
exposing your weakness. You're
going out there and telling people that "No, I
don't know what I'm doing." But actually this
happened just last night. Last night I was
on a Slack channel with some other
Android developers, and I was using some library,
and I could not figure out how to log
the error. I know something went wrong; I
need to debug it. So I was really reluctant.
I was like, "Hm, should I ask this, should I not?" I ended up
asking it. I asked, and yeah, it was a very
obvious answer in the sense that there are two
ways of doing it. I was doing it one
way; it's the other way that I didn't try. So
I felt a little bad about doing that. But
then what happened was after that, after
I figured out how to log my error, I went back to the
Slack channel and I posted the error
message, and somebody else was like, "Oh, that!"
It turns out to be a very common problem
that a lot of other people had and is on
the GitHub issue. A lot of people have problems.
It was really funny, because what I
ended up triggering was that the dev
that was on the project actually merged
in a fix for that particular problem
because he was like "So many people had this problem,
I finally got my act together and just
got this into the master." I was like,
"Oh thank you! I wasn't expecting that." And afterwards
I'm so glad that I asked that, even though it's very intimidating.
Especially since I knew that the dev that is
doing that library is in the channel, so
I would appear very stupid if it is a
very obvious question. So every time I ask a
question, I still waver, like "Should I do
it? Should I not do it?" But I am getting more
and more telling myself that "no, do it." Because
the times when it was so - basically the number of times that I
have looked back and said "Look, you wasted so many people's
hours, you were stupid" is zero. That never happened. Usually
what happened is that OK, it was
a quick answer, thank you, bye, life goes on.
Or something like what I described: it
actually ended up opening up
opportunities for other people. So definitely
it's OK to ask questions. I mean,
it's scary, but you should do it anyways.</p>
<p>SARON: Next let's do some shoutouts.
Do you have a couple for us?</p>
<p>CHIU-KI: Yeah. My first one is an Android one. This is an Android developer.
It's called CodePath. I think what they call
themselves is <a href="https://guides.codepath.com/android">CodePath Android Cliffnotes</a>. It
is a wiki that is curated by people
who are teaching Android, and it's really
nice because it gives you a - well, it's cliffnotes,
so it gives you a one-pager on various topics -
for example, testing or how do you talk to
the internet and things like that. What I like about it is
that most of the time we want to get
the official source. Like, oh, Android is written
by Google; I should go to Google and read
their documentation. But a lot of the times
they are also other libraries out there that are
built by the community, and Google don't
necessarily want to endorse any
particular one. So this is a third-party
list which gives you, in my mind,
a more holistic review of what's out there and what
you should try. So I definitely recommend that.</p>
<p>SARON: Cool. What else you got?</p>
<p>CHIU-KI: The next one is also
Android. I will say the first one is for everybody,
whether you're a beginner or not; the
second one is a little bit specific
in the sense that I use it daily, almost,
because I do a lot of - well, I write Android apps.
And then what I need to do is I
usually need to take a screenshot, either
to upload it to Google Play or to show
people what I have done. I use this
app called <a href="https://medium.com/@emmaguy/death-to-ugly-android-screenshots-48ea071d912e6">Clean Status Bar</a>. What it
does is that when you activate that, it
will cover up your existing status bar,
and then it will only put the time and
maybe just full wifi signal so that
there's no clutter on it. Because I don't
know about your phone, but my phone constantly
has notifications on it. Usually what happens is there'll be
like a Gmail icon, a little tweet bird on
it, and then I will have a little Bluetooth
icon. It's just very distracting on top.
And I used to - either I'd be lazy and just post it as-is,
or I would actually take out GIMP and
manually rub out all the icons, which is really tedious.
But this is a really good app
because what you need to do is that you
just activate this app and then you
pick the status bar color - and then
you can even change the time; you can
choose the time that it shows - and then it has
nothing else. It just has the time and the wifi
icon and the status bar. So it still looks real,
but it doesn't have the clutter. I highly, highly
recommend everybody to do that, because now that
I use it, I cannot tolerate screenshots
with distracting notifications anymore.</p>
<p>SARON: Mmhm. Yeah.</p>
<p>CHIU-KI: Yeah. And then my final pick is
not Android; I figured that I should give a shoutout to
not-Android things as well, even though Android is
a big part of my life. It's a website
called <a href="http://paletton.com/">Paletton</a>. It's a bit hard to - I'm not
sure how to pronounce it, because I've only ever
seen it written in the URL bar. I
guess you'll put it in the show notes.
What it is is a color site. What you can
do is you can go there and you can give
the site a color - usually I do it by the
hex value; for example, red - and then it will
give you complementary colors. So it will
give you multiple shades of red that is
derived from the red that you gave and
also the complementary color, which I
cannot do on
top of my head, which is why I need the
site. Basically a color that goes
well with it. So for example, maybe you
will have to use the red as your primary
color, and then you will use the secondary
color for your buttons. I really
like it because I have no sense of what
colors go well together, and yet
sometimes I'm doing my own little side
project; I just need to have something
that doesn't look awful.</p>
<p>SARON: It doesn't have to be good; just not bad.</p>
<p>CHIU-KI: Right, just not awful. So I'll go through that site, and I'll put in one color -
usually purple, because I love purple - and then it will give
me that purple and then a lighter shade and
a darker shade so that I can use - for example, in Android
usually what you do is that you have
your app - the app has a toolbar which
shows your app title that's a lighter
shade of purple, and then the top status
bar is a darker shade of purple, and they
go well together.
Rather than me randomly picking some color.</p>
<p>SARON: And hoping it
turns out well.</p>
<p>CHIU-KI: Exactly. You still have to pick one color, which
is OK. Maybe you pick green, and then
it will generate a color scheme for
you. I found that really nice. Just takes
the guesswork out of it.</p>
<p>SARON: Yeah, that sounds really helpful. I
have a couple shoutouts of my own. One is -
I actually found this on your blog - is it Laura Hogan
or <a href="https://twitter.com/lara_hogan">Lara Hogan</a>?</p>
<p>CHIU-KI: Oh, donuts!</p>
<p>SARON: Yes.
Her donuts post is just amazing. She started -
it looks like it was two years
ago that she first started this. She
started celebrating her career wins with
donuts. And the problem that she was solving is
that she works really hard, she
does a lot of really great stuff, is very
accomplished, but as soon as the good
thing happens, it's "OK great. That's
done, now let's move on to the next thing,"
without really taking the time to
celebrate the accomplishment. And I'm
very, very guilty of this too; as soon as the
thing happens and it's over, it's "OK,
what's next?" and you don't really get to
appreciate it. And so what she started doing
is buying herself a donut with every small
or big career accomplishment
that she gets, and it's really, really
amazing - one, because I had
no idea there were these many types of
donuts. The diversity of donuts is
absolutely incredible. But two, because
it's a really nice, easy, simple, fun way
to reward yourself, to literally treat yourself
and acknowledge the things that you're doing. And her wins
include speaking gigs and writing books
and chapters and
appearing and doing a bunch of things.
I can definitely see a place for all of
us, no matter how small our wins may feel,
for us to celebrate with a little treat
as well. So I loved that initiative, and you
should all definitely take a look at it and
read it. It's <a href="http://larahogan.me/donuts/">larahogan.me/donuts</a>,
and I'll post that on the website
as well, so check it out.
And the second, going back to speaking
and Commons proposals - as you heard today,
the first step in speaking is oftentimes
submitting a proposal, and there's lots
of really good blog posts
out there that talk about how to write a
really good proposal. And one that I
really like, that is incredibly thorough,
is by <a href="https://twitter.com/sarahmei">Sarah Mei</a>, and it's called <a href="http://www.sarahmei.com/blog/2014/04/07/what-your-conference-proposal-is-missing/">What
Your Conference Proposal Is Missing.</a>
Sarah is part of Ruby Central and
organizes RubyConf and RailsConf, and
she's been reviewing conference
proposals and organizing conferences for
a very long time, and she wrote up this
really, really good summary of the things
you need to make sure that you do, the
things that you should not do. There is
an example of what a good talk proposal
looks like. And she gives a very, very
thorough review of all the things you
should think about for your next proposal. So
if you're thinking about it, if you're
trying to figure out what makes a good
pitch and what makes a good submission,
definitely take a look at that blog post.
It'll give you some really good ideas. If
you want to join the conversation, you
can join us on <a href="http://discourse.codenewbie.org/">CodeNewbie Discourse</a>, our online
forum for people excited about code, or you can chat
with us every week on the CodeNewbie Twitter
chat. Just search for <a href="https://twitter.com/search?q=%23CodeNewbie">#CodeNewbie</a>
and tweet with us every Wednesday
evening at 9 p.m. Eastern Time.
You can learn more about that, as well as
show notes on this episode, at <a href="http://codenewbie.org/podcast">codenewbie.org/podcast</a>.
If there's a topic you want to hear about
or a guest you want to hear from, send us an
email, hello@codenewbie.org. Thank you again,
Chiu-Ki, so much for joining us.
You want to say goodbye?</p>
<p>CHIU-KI: Bye.</p>
<p>SARON: Thanks for listening. See you next week.</p><div class="blogger-post-footer"><script type="text/javascript">
var sc_project=5052645;
var sc_invisible=1;
var sc_security="f92fc67a";
</script>
<script type="text/javascript" src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="blogspot hit counter" href="http://statcounter.com/blogger/" class="statcounter"><img class="statcounter" src="http://c.statcounter.com/5052645/0/f92fc67a/1/" alt="blogspot hit counter" /></a></div></noscript></div>Chiu-Ki Chanhttp://www.blogger.com/profile/01970007638489793840noreply@blogger.com1