#day1 of java
Explore tagged Tumblr posts
Text
ð° Starting out in Java? Youâve probably seen this line over and over: public static void main(String[] args) { // your code here } But did you know Java allows several valid variations of the main method? Letâs break it down for clarity! ð â
ðœðððð
ðððð ðŽððððð
ðºððððððð: 1ïžâ£ public static void main(String[] args) â Standard & most widely used 2ïžâ£ public static void main(String args[]) â Old-school array syntax (still valid) 3ïžâ£ public static void main(String... args) â Uses varargs â flexible and works the same 4ïžâ£ public static void main(String[] myCustomName) â Parameter name can be anything! â ðð£ð«ðð¡ðð ðð®ð£ð©ððððš: ð« public void main(String[] args) â Missing static ð« static void main(String[] args) â Missing public ð« public static void main(int[] args) â Wrong parameter type ð The JVM specifically looks for: public static void main(String[] args) ð§ ððªð£ ðððð©: You can overload the main method, but only the correct one (String[] args) will run by default! ð ð¡ð²ð ððŒ ðð®ðð®? Check out my full beginner-friendly blog post on this topic: ð https://wp.me/paNbWh-2l ð¬ Got any Java tricks you wish you knew earlier? Drop them below ð Letâs grow together. #Java #100DaysOfCode #FullStackDevelopment #CodingJourney #LinkedInLearning #Beginners
#app development#backend#beginner#code like a pro#core java#datastructures#day1 of java#day2 of java#different type of main method#different type of main method in Java#frontend#fullst#fullstack#fullstackdeveloper#Java#main methods#output#print#programming
0 notes
Text
Six Days Java Bali Tour Package
Get the details of Six Days Java Bali Tour Package for your best holiday travels to Java and Bali islands. This best starter exploration of Indonesia should be continued to make other great journeys! Day1: Arrival at Yogyakarta International Airport (YIA) Our team is happy to welcome you and escort your visiting the huge temple complex of Prambanan. It depends on your flight time; we will have aâŠ
0 notes
Photo

"Love recognizes no barriers. It jumps hurdles, leaps fences, penetrates walls to arrive at its destination full of hope." . #mayaangelou #faith #hope #love . Always taking care of business! . #bass #bassist #bassplayer #food #foodie #whole30 #day1 #coffee #java #espresso (at Seguin, Texas) https://www.instagram.com/p/BvvDBOBllm9/?utm_source=ig_tumblr_share&igshid=uwdgcnjvnri8
1 note
·
View note
Photo

selamat pagi dunia ... #siapsiap #prepare #start #tour #duty #tourofduty #banyuwangi #eastjava #java #trip #twowheels #culture #culturetrip #culinary #food #foodporn #day1 #monday #desalogi #bastamanography (at Banyuwangi, Jawa Timur, Indonesia) https://www.instagram.com/p/B8XSbuqAAVw/?igshid=yqzh5vdk16mv
#siapsiap#prepare#start#tour#duty#tourofduty#banyuwangi#eastjava#java#trip#twowheels#culture#culturetrip#culinary#food#foodporn#day1#monday#desalogi#bastamanography
0 notes
Text
Hey tumblr!
So I don't know if it counts but here is how my first day went into the challenge. So I tried waking up at 4 am and I did but i dozed off again as the weather was quite cold.
Then I woke up by 9 am and took lecture 1 from Cs50 about SCRATCH. Then I built a Scratch project, a rough fruit ninja game. "I'll share link to my projects here soon."
I tried listening to another lecture, but I felt quite unmotivated.
Highly disappointed by DAY1 but won't drop here. So I am listing my Day 2 targets here.
1. Complete Python course on Sololearn and Kaggle both.
2. Complete Java course on Sololearn and w3s.
3. See Android studio basics.(YOUTUBE)
4. Complete one certification on freecodecamp.
It's lot and unrealistic but this way i can get atleast half done. ðð
Also waking up at 4 am for sure.
P.s. Taking writing challenge too, will share poems and short stories shortly.
#learn to code#java#learn python#learn programming#programming#30daysofcode#30 day writing challenge#software engineering#software development#software#coderdojo#followlike#lifestyle#study hard#study motivation#planner#studywithme#study tips#studyblr
13 notes
·
View notes
Photo

On every night during 11 pm, I will updating about my day and how Ive been doing with my activities.
I will use the hashtag
#dailyreport #day1 #improvising #ctf #java #website #religion #python
0 notes
Photo

倪ä¹
æ²æç¶åžçïŒorientation day1ååšæå®€å
§èœäºäžåå°æçä»ç޹就è¶
æ³ç¡ãçµæç¬¬äºå€©å°±èäºæŽå€©ç詊ïŒèå®åŸçå¿åŸåªæåèªå·±çºä»éºŒåšéåå°æ¹ð ç¶æ¿çµ±èšè²¡ç®¡æèšèçéœäžé£ïŒéœæ¯6幎ååžéäœçŸåšå¿å
å
çæ±è¥¿ïŒäœæ¯Javaçèè©Šå¯Šåšæ¯è®æ¯å人åºäŸéœæ¯äžèå»çŒé»äººåèïŒ90åéå
§èŠåçå®30é¡éžæé¡ïŒå äžå¯Šäœäžåimport/sort/query from .txtçprojectå¯Šåšæ¯å€ªéæŒæè²äºïŒæ²èŸŠæ³åœ¢å®¹æ¿å°èé¡ç¶äžæå€é»äººåèïŒèå®å€§æŠåªå©åšå€é¢æ¬æ¬å€ªéœèµ°èµ°è·¯æŸç©ºçæ³æ³ð èäžä¹åŸæé¡¯å¯ä»¥çåºçšåºŠå·®ç°ïŒé€äºå¹Ÿåè¶
匷å°åºŠäºº60åéå
§å¯«å®å
šéšïŒå
šç倧æŠåªæå¹Ÿå人å¯ä»¥äžçŽåšéµç€äžæåïŒå
¶ä»äººå®å
𿳿åé£äžåfunctionéœäžç¥é該æéºŒå¯«ð±åºäŸåŸèŠé¢ææåŒåªå©see you guys in the class ææé說éåªæ¯a piece of cake comparing with the final exam?!?!?!Damn...... #walkingtothesky #welcometocmu #longday #20180515
1 note
·
View note
Photo

Day 1 : 7 Days 7 Project Challenge Full demo available here : https://thecodersgig-7dayproject-day1.web.app/ For complete source code dm us #coder #frontend #devops #madeinindia #nodejs #aws #gcp #docker #reactjs #java #c #c++ (at India) https://www.instagram.com/p/CKuHrIsgdCS/?igshid=1ogukkkwq62ap
0 notes
Photo

Day 1: Home made
This snack is home made. Not by mine but another.
In frame: Rempeyek â a traditional snack from Java. Usually, one of its ingredients is peanut but in this frame was exchanged with dried shrimp. So crunchy and salty!
What is your snack(s) today?
0 notes
Text
2017幎çµäºïŒä»å¹Žã¯äœããã£ããïŒ
æŠèŠ
ä»å¹Žäœããã£ãã®ããæ¯ãè¿ããåªåããŠããªãããã§ã¯ãªãããããŸãæé·ã®ãªã1幎ã ã£ããäœããã£ããšãã宿ãç¹ã«ãªãã£ãã
ä»å¹Žå§ããããš
å
¬éçšã® Android ã¢ããªéçº
Kotlin
GitHub ç·å掻å
転è·ãã©ãã
ããŒæ®æ¥âŠâŠ4æãã9ãæé£ç¶ã§ãŒãã ã£ãããªã幎åã¯
Tumblr
ã€ã³ããã
èªæž
ä»å¹Žã¯ IPA ã®æ
å ±åŠçæè¡è
詊éšãåããªãã£ãã®ã§ãããã ãå€ãæ¬ãèªãããšãã§ããã åœç«åœäŒå³æžé€šã«è¡ãããšãèŠããŠãããã§æ¬ãç¡æã§èªãããã«ãªã£ãã®ãè¯ãã£ãã
ãã¬ã¬ã·ãŒãœãããŠã§ã¢æ¹åã¬ã€ãã
ãã±ã³ãã»ããã¯ã®SmallTalkãã¹ããã©ã¯ãã£ã¹ã»ãã¿ãŒã³ã
ããªããžã§ã¯ãæåã¯ãŒã¯ããã¯ã
ããªãã¡ã¯ã¿ãªã³ã°ã
ãJavaããã©ãŒãã³ã¹ã
ãJavaæ¬æ Œå
¥éã
ãAndroid Pattern Cookbookã
ãAndroidã¢ããªéçºã®æ¥µæã
ãEffective Debuggingã
ãKotlinã¹ã¿ãŒãããã¯ã
ãRxJavaãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã
ãæ
ç±ããã°ã©ããŒã
"Reactive Java Programming"
ãã³ãŒãã£ã³ã°ãæ¯ããæè¡ã
ãAndroidã¢ããªéçº 74ã®ã¢ã³ããã¿ãŒã³ã
ãAndroidãæ¯ããæè¡(II)ã
ãå®è£
ãã¿ãŒã³ã
ãThoughtWorksã¢ã³ãœããžãŒã
ãJavaã«ãã颿°åããã°ã©ãã³ã°ã
ç¹ã«ããªãã¡ã¯ã¿ãªã³ã°ãã«ã¯æéãåããããã£ãšæ©ãèªãã¹ãã ã£ããæ§çã§ãååãªäŸ¡å€ãããã ãAndroidã¢ããªéçºã®æ¥µæããAndroidã¢ããªéçº 74ã®ã¢ã³ããã¿ãŒã³ããAndroidãæ¯ããæè¡(II)ã ã®3åã¯ç§ã® Android 芳ãåæ§æããã®ã«éåžžã«æçã ã£ãããThoughtWorksã¢ã³ãœããžãŒãã¯ãããã«ä»ãšãªã£ãŠã¯å€ãæ¬ã ãã ãªããžã§ã¯ãæåãšã¯ãµãµã€ãºããã¡ãŒã¹ãã¯ã©ã¹ã³ã¬ã¯ã·ã§ã³ãStringUtilsããªã埮åŠãªã®ãããªã©ãŸã ãŸã 圹ç«ã€å
容ãèŒã£ãŠããã åœæã® ThoughtWorks ã Groovy/JRuby/Jaskell ãããããšæšããŠããã®ãå確èªããã®ã«ã圹ç«ã£ãã
ã«ã³ãã¡ã¬ã³ã¹èŽè¬
èªè²»(çŽ60äžå)ïŒæçµŠäŒæ5æ¥ã䜿ã£ãŠæµ·å€ã«ã³ãã¡ã¬ã³ã¹ã«è¡ããšããçµéšãããŠãæµ·å€ã«ã³ãã¡ã¬ã³ã¹ã¯äŒç€Ÿã®éã§è¡ããã®ã ãšããèªèã匷ããããšãã§ããã
DroidKaigi 2017
Devoxx US 2017
Droidcon Vietnam 2017
JavaOne 2017
ã¬ããŒã
Devoxx US 2017
https://reminiscencesoftoastkid.tumblr.com/post/160693403713/devoxx-us-2017-short-report
Droidcon Vietnam 2018
https://reminiscencesoftoastkid.tumblr.com/post/159716738388/droidcon-vietnam-2017-flash-report
ãªã2018ãéå¬äºå®ãšã®ããš
JavaOne 2017
JavaOne 2017 Day1 Flash Report
JavaOne 2017 Day2 Flash Report
JavaOne 2017 Day3 Flash Report
JavaOne 2017 Day4 Flash Report
JavaOne 2017 Day5 Flash Report
ã¢ãŠãããã
æžããèšäº
ä»å¹Žã¯ Qiita ã« 24 ã®èšäºãæçš¿ããã NIO2 ã®åæ©çãªå
容ã®èšäºã ãã¯ãããã30ãè¶
ããããããšã¯ã©ãã1æ¡ã ã£ããä»äºã§ç¥èŠãæºããããããã«ãªããªããšãã¡ã ãšçæããã
Date Title 2017/01/03(Tue) Gradle ãããžã§ã¯ãã§éçè§£æããŒã«ã䜿ã 2017/01/17(Tue) TestFX ã§ JavaFX ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããæžã 2017/01/31(Tue) java.io.File ã®ã³ãŒãã java.nio.Path ãš java.nio.Files ã䜿ã£ãŠæžãçŽã 2017/02/16(Thu) JavaFX ã§ã¹ã©ã€ãã·ã§ãŒããŒã«ãäœã 2017/02/20(Mon) Googleã®å
¥ç€Ÿè©Šéš(éå
¬åŒ)ã«Groovyã§ãã£ã¬ã³ãžããŠã¿ã 2017/04/03(Mon) minimal-json ã§ JSON ãæ±ã 2017/04/05(Wed) æ£åŒãªãªãŒã¹åã« Eclipse ã§ JUnit 5ãæãã 2017/04/08(Sat) Optional ã®7ã€ã®ã«ãŒã«ã«ã€ããŠèãã 2017/06/02(Fri) JavaFX ã® Clipboard API ã䜿ã 2017/06/13(Tue) Android ã® AppWidget ã§ Snackbar ã䜿ã 2017/07/17(Mon) ç¹å®ã® Fragment ã§ã ã䜿ãã¡ãã¥ãŒé
ç®ãå
±çšã® Toolbar ã« inflate ãã 2017/07/30(Sun) RecyclerView ã®èŠçŽ ã埪ç°ããã 2017/08/12(Sat) Moshi ã䜿ã£ãŠ Java ãªããžã§ã¯ããš JSON ãçžäºå€æãã 2017/08/14(Mon) enum ã®å®æ°å€ããšã«æ¯ãèããå€ããã®ã Kotlin ã§ãã£ãŠã¿ã 2017/08/21(Mon) Android ã¢ããªã® Java ãœãŒã¹ã³ãŒãã Kotlin ã«å€æããŠèºããç¹ããŸãšãã 2017/09/15(Fri) android.text.TextUtils ã®ã¡ãœããã調ã¹ã 2017/09/23(Sat) Android çšã® ColorPicker ãæ¢ã 2017/10/09(Mon) Android ãããžã§ã¯ãã§ JUnit5 ã䜿ã 2017/10/31(Tue) Kotlin ã® sealed ã¯ã©ã¹ã䜿ã 2017/11/05(Sun) Android Studio ã®ã¡ãã¥ãŒæåãµã€ãºãå€ãã 2017/12/01(Fri) RxPermissions ã§ Runtime Permission ã®åŠçããã 2017/12/03(Sun) RxJava ãéåæåŠçãæžããããããã©ã€ãã©ãªãšããŠèãã 2017/12/19(Tue) ããã°ã©ã ã§çæãã TextInputLayout ã« EditText ãã»ãããã 2017/12/30(Sat) TextView ã® CompoundDrawable ã« ColorFilter ãããã
ææ¥ã§èŠããšååãææãšç«æã«æçš¿ããŠãããäŒæ¥ã¯ãããããããã«ãããšããã€ã¡ãŒãžãããã®ãšã äŒã¿äžã«å®æããªãã£ãèšäºãæã»ç«ã«æçš¿ããŠããã®ãšã§ãããªã£ãã®ããšæãã
Day of week Count Mon 6 Tue 6 Wed 1 Thu 1 Fri 3 Sat 4 Sun 3
Tumblr
æ¥ãããã«Qiitaã®èŠçŽæ¹æ£ããã£ãŠããããæ©ã«å匷äŒã®ã¡ã¢ãQiitaã«æçš¿ããã®ãæ¢ããå®å
šã«ããã°ã©ãã³ã°ã®ãã¿ã ããæçš¿ããããšã«ããã ãããŠå¥ã« Tumblr ãå§ããŠã¿ããšãããæ¬åœã«èª°ãèªãã§ããªããŠèãçããªããTumblr ã¯ç»åãæçš¿ãããã æ°ã«ãªã£ãèšäºã®ã¡ã¢ãã¡ãã£ãšæžããŠãããšããäœ¿ãæ¹ãªãé©ããŠããã®ã ããããã°ãæžããµãŒãã¹ãšããŠã¯åŸ®åŠãªãšãããããã ç¹ã«ã³ãŒããããã¯ãæšæºã ãšå
šç¶ãã¡ãªã®ãæ¬åœã«å°ãã ããŸã« Qiita ã«æžãã»ã©ã§ããªããªãšæã£ããã¿ã Tumblr ã«æžããŠããããããã«ãããŠããŸã£ãã ä»ã§ã¯ãæŒã®ç»åãã¢ããããã®ãšãæ°ã«ãªã£ãWebèšäºã®ã¯ãªããã³ã°çšåºŠã«ãã䜿ã£ãŠããªãã
Android ã¢ããª
è¶£å³ã®ããã°ã©ãã³ã°ã§ã Android ã¢ããªã®éçºããããªããšåŠç¿éãå
šç¶è¶³ããªããšæããä»å¹Žã®6æããããå§ããã åŠç¿å¹æãé«ãŸã£ãã®ãšãæµçšã§ããã³ãŒã矀ãã¹ããã¯ã§ããããã«ãªã£ãã®ãšã§ãä»äºã«ãã©ã¹ã«ãªã£ãã®ã¯å€§ããã£ãã
ãªãå
¬éã«ã€ããŠã¯ãããã€ãäœã£ãŠã¯ã¿ããå
šç¶ãã¡ã ã£ããå¯äžãWi-Fi ã®ç¶æ
ãåãæ¿ãããŠã£ãžã§ããã¯ã¡ãã£ãšã ãåããŠããã äžçªåãå
¥ããŠããWebæ€çŽ¢ã¢ããªãå
šç¶ã€ã³ã¹ããŒã«ãããªããŠã ãã®åã«äœã£ãŠãããããŒãã¢ããªã®æ¹ã3åã€ã³ã¹ããŒã«ãããŠããã ããããããªãã
https://play.google.com/store/apps/developer?id=toastkidjp
ã¡ãªã¿ã«ããã皌ãã ãæžããŠãããšã4ãæã§14åã§ããããã£ãã·ã¥ãè²·ããªãã
Kotlin
ãããŸã§æ
å ±åéããããŠããªãã£ãããGoogle I/O 以éäžæ°ã«äžéãåŸãå§ããã 転è·ãã©ããçã§ã ãKotlin ãã£ãŠãŸãããšããäŒæ¥ã°ããã«ãªã£ãŠããŠãããå æžãããªããšãŸãããšæãã è¶£å³ã®ããã°ã©ãã³ã°ã§äœ¿ãå§ããã
æåã¯éåæã匷ãã£ããããã¹ãŠã®ã³ãŒããäžæ¬ã§ Kotlin 倿ããããšããã¹ãã«ã¿åŒåŠç¿æ³ã«ãã2é±éçšåºŠã§é転ããã JavaOne ã§ã¯ Kotlin ã®ã»ãã·ã§ã³ãäžå¿ã«èããŸãã£ãŠãããç©è¶³ããªããæãããããã«ã¯ãªã£ãŠãã (åœç¶ã ã JavaOne ã§ã¯ Kotlin ãç¥ããªã人åãã®ã»ãã·ã§ã³ãå€ãããã§ãã)ã
ãã Kotlin ãã䜿ã£ãŠããªãäŒæ¥ã§ããã£ãŠããããšããæ ¹æ ã®ãªãèªä¿¡ãã§ããã
GitHub ç·å掻å
転è·ã§æå©ã ãšããã®ã§ã軜èãªæ°æã¡ã§å§ãããšãã100æ¥ä»¥äžç¶ããã commitæ°ãäŒç€Ÿã® GitHub Enterprise ã®ã¢ã«ãŠã³ãããå€ãã£ããšããã
ãããããããšã§æ¥åžžçã«ã³ãŒããæ¹åããç¿æ
£ã身ã«ã€ãããããäžæ¹ã§ã1æ¥ã§çµãããªããããªå€§æãããªä¿®æ£ã(å¿ççã«) ãã«ãããªã£ããšæããã
è²·ã£ããã®
ThinkPad X1 Carbon
髿§èœã ããç¡é£ã§é¢çœããšããã¯ãªããThinkPad X1 Tablet ãšãã«æ¯ã¹ããšæ
ç±ã¯æããªããã·ã³ã ã£ãã
Covia L7
Android ã¢ããªéçºãè¶£å³ã§å§ããã®ã«å®æ©ãå¿
èŠã ã£ãã®ã§è³Œå
¥ããã
é·æ
1äžåçšåºŠã§å
¥æå¯èœ
éåžžã«è»œã
çæ
å®ã£ãœã
æ§èœã貧匱
è§£å床ãäœãâŠâŠéã«çãç»é¢ã®ç¢ºèªã«ã¯äœ¿ãã
OS 6.0ãRuntime Permission ã®æ€èšŒãã®ãªã®ãªã§ããçšåºŠ
Galaxy Feel
ãŸããªæ€èšŒç«¯æ«ã欲ãããšæã£ãŠæ¢ãããšãããæãã£ãªã¢ã®è²©å£²æŠç¥ã«ããåšåº«ãããã€ããŠããããããAmazon ã®ããŒã±ãããã¬ã€ã¹ã§25,000åçšåºŠã§è³Œå
¥ã§ããã
調æž
OSã7.0
ããããããã¹ããã¯
ãããã軜ã
ææ©ELãã£ã¹ãã¬ã€
çæ
OSã7.0(AppShortcutsã䜿ããªã)
ããŒã ããŒãããŒããŠã§ã¢
ããã¯ããŒãšã¿ã¹ã¯ããŒãéåžžãšé
Activity ã®ã¢ãã¡ãŒã·ã§ã³ãç¬èªå®è£
ãããŠãã
ClipboardManager ã®å®è£
ãããããã®ãã LeakCanary ã§èª€æ€ç¥ãããŸãã
ä»ã®ç«¯æ«ãšåãã³ãŒãã§ãã©ãã·ã¥ãå¶åŸ¡ã§ããªã
âŠâŠãªããæžããŠã¿ããææ©ELãã£ã¹ãã¬ã€ä»¥å€ã®é·æããªããããªæ°ãããã
507SH
13,000åãšéåžžã«å®ãã£ãã®ã§è³Œå
¥ãããšãããæ¶²æ¶ä¿è·ãã£ã«ã ã貌ã£ããšããã§æºè¶³ããŠç®±ã«ããŸã£ãŠããã
ä»äº
ã¢ãããŒã·ã§ã³ã°ã©ããæžããšå±±ããè°·ãŸã§ãã£ããåºæ¬ãè°·ã®æ¹ãå€ãã£ããåæãåŸèŒ©ã®Android éçºè
ãæ¬¡ã
ãšè»¢è·ããŠããŠã äŒç€Ÿããè©äŸ¡ãããªãä»äºãããŠããããšãžã®çŠããåã幎ã ã£ãããŸããã©ã®ä»äºã«å²ãåœãŠãããããªã©ç§ã決ãããããã®ã§ã¯ãªãããã éãæªããšæã£ãŠè«Šããããã»ãã«ãªãããããæ®æ¥ãŒãéåãšèã«ã€ãªãã£ãŠãããšããã
å
容ã§èšããšãå®å
šã«ãµãŒããµã€ãã®ä»äºããªããªã£ãŠAndroid ã¢ããªéçºã°ãããããããã«ãªãã å€äžã«é»è©±ãããã£ãŠããããšããªããªã£ããäŒæ¥ã«PCãæã£ãŠåž°ã£ããããªããŠãããªã£ãã®ãéåžžã«ããã£ãã âŠâŠããã£ãã®ã ããæ¥å¹ŽãããŸããµãŒããµã€ãã®éçºãšéçšããããªããšãããªããªãããã§å°ã£ãŠããã
æ¥å¹Žã®æ±è²
ãŸã DroidKaigi 2018 ã§çºè¡šããæ©äŒãããã ãããããã§ãã¡ããšåããããã«æºåãããã
Android ã¢ããªãéçºããâŠâŠ1ã€ãããåçã®æ±ã«ãªãã¢ããªãäœããã
Qiita ã® 100èšäº ïŒ 1,000 Contribution ãç®æãâŠâŠéæãããšã¯äžèšãèšã£ãŠããªã
GitHub ã®ç·åãç¶ç¶ãã
0 notes
Text
Tweeted
Super Excited to learn @Java this week from @johnowenteachcs!! #Day1 here we go!! @weteachcs #techieteacher #happyteacher
â Hollie Mae Alvarez (@MrsHAlvarez) July 23, 2018
0 notes
Text
ãŸã£ããæ¹é Slackãäœã£ãŠæ¥ã
ã®äœæ¥ã楜ããRTA Day2
Day2 : botãšäŒè©±ãããïŒ
ãŸã£ããæ¹é Slackãäœã£ãŠæ¥ã
ã®äœæ¥ã楜ããRTA ïŒæ¥ç®
ããã°ããã (HMD|hamaguchi) ã§ãã ãªããšã1æ¥ç®ã®èšäºãTumblrã«æçš¿ãããã®ã®ã1èšäºæžãã®ã«3hããã£ãããTumblrã®markdownãšãªããããã¹ãã®å€æãããŸããããªãã£ããã§ãã¡ããã¡ãæ¶èããŸããããŸãã倿ã®çµææç« ãé£ãã§ããšããããã£ãã®ã§ãåŸããçŽã矜ç®ã«ãªããããŸãããæšæ¥ã®å€±æãåé¢æåž«ã«ããŠã仿¥ã¯HackMDã§èšäºãæžããŠããŸãã 仿¥ã¯æšæ¥ã®ç¶ããšããããšã§ãã¿ãŒããã«äžã§ãªãSlackäžã§botãšããåãã§ããããã«ããããbotã®ã¹ã¯ãªãããç·šéãããããŸãããCoffeeScriptã¯çãŸããŠåããŠæžãᅵᅵã®ã§çµæ§æ¥œããã£ãã§ãã
ããã§ã¯ä»æ¥ã ãã£ããããŠãã£ãŠã
ç®æ¬¡
SlackãšHubotã飿ºãã
CoffeeScriptãåŠã¶
botã®ã¹ã¯ãªãããç·šéãããããã¹ããã
ãŸãšã
1. SlackãšHubotã飿ºãã
仿¥ã¯ãŸããæšæ¥ããªã³ã¯ã貌ã£ããã®èšäº(*1)ãåèã«SlackãšHubotã®é£æºãããŠãããŸãã
æåã«ãæšæ¥ã®botã®èšå®ã§ã¯Slackã§ããåãã§ããªãã®ã§ãæ°ãã«HubotãäœãçŽããŸããæšæ¥ãšã¯å¥ã®ãã£ã¬ã¯ããªãäœãHubotãç«ã¡äžããã³ãã³ããæã¡ãŸãã
// ä»åã¯ãã£ã¬ã¯ããªã®ååãslack-local-botãšãã $ mkdir slack-local-bot $ cd slack-local-bot $ yo hubot
ããã§ãŸãæšæ¥ã®å¥Žãåºãã®ã§å¿
èŠæ
å ±ãæã¡èŸŒãã§ãããŸãã
ããã§æ³šæããå¿
èŠãããã®ãã質åæåŸã®ãBot Adapterãã«å¯Ÿããæšæ¥ãšéããslackããšçããããšã§ãããããå¿ãããšslackã§åãbotã«ã§ããªãã®ã§æ°ãã€ããŠãã ãããïŒã¡ãããšèª¿ã¹ãŠãªãããã³ãã³ããçµãã£ãåŸã«çæãããŠããã¡ã€ã«ãæžãæããã°ãåŸããSlackã«å¯Ÿå¿ããbotã«ã§ããã£ãœãïŒïŒ
次ã«Slackäžã§botãåãããã«botãèµ·åããŸãã以äžã®ã³ãã³ããå©ããŸãã
HUBOT_SLACK_TOKEN=<MYAPP_HUBOT_TOKEN> bin/hubot --adapter slack
ããã§MYAPP_HUBOT_TOKENãšããã®ã¯ãSlackã«Hubotã远å ããæã«çæãããæååã§ããbotã®Configureèšå®ãéãããããŒãžã®äžéšã«
HUBOT_SLACK_TOKEN=ãããããããã
ãšæžããŠããããã®ããããããããããã®éšåãTokenã«åœãããŸãã Tokenããã§ãã¯ãããäžã®ã³ãã³ããå®è¡ãbotã®èµ·åã§ããadapterãšãããªãã·ã§ã³ã« slack ãèšå®ããã®ãå¿ããªãããã«ããŸããããã³ãã³ãå®è¡åŸãSlackã«ç§»åãããšAppsã«ããHubotãONLINEã«ãªã£ãŠãã®ã§ãDMã«ãpingããšéã£ãŠã¿ãŸãããããš...
ããã¯Hubotã®åæç¶æ
ãã䜿ãããã®ã§ãUserã®pingã«å¯ŸãbotãPONGãšåå¿ããããšããã³ãã³ãã§ãã
ããã§äžå¿SlackãšHubotã®é£æºã¯ã§ããŸããããã ãã®ãŸãŸã§ã¯å³æ°ãªãã®ã§ããšããããã¹ã¯ãªãããããã£ãŠãã£ã©ã¯ã¿ãŒã£ãœãããããšæããŸãã
2. CoffeeScriptãåŠã¶
ã¹ã¯ãªããããããåã«ãã¹ã¯ãªããèšè¿°çšã«äœ¿ãããŠããCoffeeScriptã®å匷ãããŠãããããªããšæã£ãã®ã§ããããŸãããšãããã以äžã®ããšãããŸããã
å
¬åŒã®Document(*2)ã«è»œãç®ãéã
QiitaãæŒã
ããã°ãæŒã
scriptsãã£ã¬ã¯ããªã«æåããå
¥ã£ãŠã example.coffee ãèªãã§ã¿ã
1ã4ã飜ãããŸã§ãã
ç¹ã«4ã¯å¹æçã§ãã2,3ãšäžŠè¡ããŠããã°ã¹ã¯ãªããã«ããèªç±åºŠãäžããæ°ãããŸãã å匷ã«é£œãããã³ãŒãã£ã³ã°ã§ããscriptsãã£ã¬ã¯ããªã«ã¹ã¯ãªãããäœããŸãããã
3. botã®ã¹ã¯ãªãããç·šéãããããã¹ããã
botããã£ã©ã¯ã¿ãŒïŒæ£®ä¹
ä¿ä¹ã
ïŒã£ãœãããããã«ãscriptsãã£ã¬ã¯ããªã«ãUserããæ£®ä¹
ä¿ããšåŒã³ããããããããããèšå®ããæ£®ä¹
ä¿ã£ãœãå£èª¿ã®ã»ãªããbotãè¿ãããšãã仿§ã®ã¹ã¯ãªãããçšæããŸãããã
scrits以äžã« freetalk.coffee ãšãããã¡ã€ã«ãäœã以äžã®ããã«ç·šéããŸãã
module.exports = (robot) -> robot.hear /森ä¹
ä¿/, (res)-> res.send 'ãªããªãã§ãããã...'
ã³ãŒãã®è§£èª¬ãããŠãããŸãã ãŸã1è¡ç®ã§ãããããã¯Javaã§ããpsvmãCã§ãã#includeã¿ãããªãã®ã§ããã€ãŸãã¯ããŸããªãã§ãã...ïŒãŸã ã³ãŒãã®å®æ
ãã¡ãããšææ¡ã§ããŠãªãïŒæ¬¡ã«2è¡ç®ã§ãããããã§ robot.hear ãšãã颿°ãåŒã³åºããåŒæ°ã«æ£èŠè¡šçŸãšã³ãŒã«ããã¯é¢æ°(ã®ãããªãã®)ãæž¡ããŠããŸãã3è¡ç®ã¯é¢æ°ã®äžèº«ã§ãres.send ã§ã»ãªããæžããæååãæž¡ããŠããŸãããã® robot.hear ã§ããããSlackã«æã¡èŸŒãŸããæååãšæ£èŠè¡šçŸã«äžèŽãåã£ãæã第äºåŒæ°ã®é¢æ°ãåŒã³åºãããšãã颿°ãªã®ã§ããã®å ŽåSlackã«ã森ä¹
ä¿ãã®æååãå«ãæçš¿ãããã°botãåå¿ãããªããªãã§ãããã...ããšåããšããããšã«ãªããŸããããã§ã¯å®è·µããŠã¿ãŸãããïŒ
ãæ£®ä¹
ä¿ãã®æååãå«ãã°åå¿ããã®ã§ãªããé¢çœãããšã«ãªã£ãŠãŸãïŒä»äººäºïŒ ã§ããšããããbotãšæãéããªãããã¹ãã§ããã®ã§ä»æ¥ã¯OKã§ã
4. ãŸãšã
仿¥ã¯ãããŸã§
仿¥ãã£ãããš
botãšSlackäžã§ãããã¹ããããâ
ãpingãâãPONGã
CoffeeScriptã®å匷ãããã
botã®ã¹ã¯ãªãããç·šéããŠåŒã³ããã«å¯Ÿå¿ããããã«ããã
botãšSlackäžã§ãããã¹ããããâ¡
ãã£ã©ã®å£èª¿ã£ãœãã¬ã¹ãã³ã¹ãåž°ã£ãŠãã
ããã§ã¯Day3ã§ãŸãäŒããŸãããïŒ
åŒçšãªã©
èšäº(*1): Slackã®Bot(hubot)ãäœã£ãŠã¿ã URL: https://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a
èšäº(*2): CoffeeScript å
¬åŒããŒãž URL: http://coffeescript.org/
0 notes
Text
Adaptive UI Tutorial for Android with Kotlin
Update Note: This tutorial is now up to date with the latest version of Android Studio version 3.0.1, and uses Kotlin for app development. Update by Joe Howard. Original tutorial by James Nocentini.
Android runs on a wide variety of devices that offer different screen sizes and densities. Because of this, it is important for Android apps to have a responsive user interface that can adapt to these different screens. Since the early days of the Android platform, system APIs have provided very powerful abstractions to design adaptive UIs, also known as adaptive layouts.
This is an update to our adaptive UI in Android tutorial which will show you how to build apps that work across different devices by dealing with the fragmentation in the Android device market. Youâll learn about:
Configuration qualifiers
Alternative layouts and drawables
And layout previews in Android Studio â an immensely useful tool
What would a tutorial be without something to tinker with? Itâd be pretty boring. So, youâll build the user interface for a simple weather app completely from scratch! When youâre done, the screen will display an image, text labels and a map in three different configurations. Apps look so cool and well built when they have an adaptive UI. :]
Getting Started
Download the starter project named Adaptive Weather here, and open it in Android Studio 3.0.1 or later. Then build and run.
The app displays a simple RecyclerView listing several cities.
To learn all about RecyclerViews, we recommend reading our Android RecyclerView tutorial.
Open the build.gradle file of the app module to declare the following dependency:
dependencies { ... implementation 'com.google.android:flexbox:0.3.2' }
Googleâs FlexBox provides an implementation of the FlexBox specification on the Android platform. As you will see later on, it is a very useful tool for designing adaptive layouts. And combining it with Androidâs resource qualifier system makes it even more powerful!
Note: The Android platform is constantly updated and the version numbers may have increased since we published this tutorial. You can find details of the different versions, including the most recent on the support library pages on the Android developer site.
During this tutorial, youâll often switch between the Android and Project modes in the Project navigator. Generally speaking:
Android mode is the default when working within Android Studio because it provides a clean and simple file structure.
Project mode is also necessary for building alternative layouts.
Weather Icons
Android devices have different screen densities, and for that reason itâs a good practice to import static images in multiple sizes. This is one way Androidâs system APIs provide a way to create adaptive UIs. As described in the Supporting Multiple Screens guide, the categories of screen densities are:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi
Whilst some UI editors make it easy to export images in different sizes, we will be exploring a different approach in this tutorial. Android Studio recently added support for Vector Drawables. This means that all your assets can be imported once and will be scaled at runtime depending on the device configuration (screen size and orientation).
Download the Weather Icons and extract. In Android Studio right-click on res/drawable and click on the New\Vector Asset menu item:
Select Local file (SVG, PSD) under Asset Type. From the filesystem location chooser under Path locate the weather-icons folder and choose the first icon, cloud.svg. Make sure to check the Override under Size setting otherwise your icons will look a bit distorted later on (¯\_(ã)_/¯). Click Next and Finish:
Now you should see your icon in Android Studio as res/drawable/ic_cloud.xml. Repeat the same operations for the other icons: fog, rain, snow, sun, thunder.
Finally, enable the use of Vector Drawables in the app moduleâs build.gradle as follows:
android { ... defaultConfig { ... vectorDrawables.useSupportLibrary = true } }
With scalable assets now in place in the project, youâre ready to start customizing the layouts.
Building layouts
With the dependencies declared, you get to shift your focus to building some layouts!
This simple application only contains one screen, which is represented by MainActivity. From the Project navigator, open res/layout/activity_main.xml. Click on the Preview button on the right side to see it in action.
An activity comprises a Kotlin or Java class â in this case MainActivity.kt â and a layout file. In fact, one activity can have several layouts, as youâll see shortly. For now, itâs important to remember that the existing layout file, activity_main.xml, is the default layout.
Forecast Grid View
First, define the default layout for your main activity. To start this, open res/values/colors.xml and replace its content with the following:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="color_primary">#9B26AF</color> <color name="color_primary_dark">#89229b</color> <color name="text_color_primary">#ffffff</color> <color name="forecast_grid_background">#89bef2</color> </resources>
Here youâre overriding the default Material theme colors and providing a background color for the forecast grid. Next, right-click on the values folder and select the New\Value resource file menu:
Enter fractions.xml for the file name and paste the following:
<?xml version="1.0" encoding="utf-8"?> <resources> <item name="weather_icon" type="fraction">33%</item> </resources>
Here youâre specifying that the width taken by each icon should be 1/3 of the total width.
Next, create a new layout in res/layout called forecast_grid.xml and add the following list of images inside a FlexboxLayout:
<?xml version="1.0" encoding="utf-8"?> <com.google.android.flexbox.FlexboxLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/forecast" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/forecast_grid_background" app:alignItems="center" app:flexWrap="wrap" app:justifyContent="space_around"> <android.support.v7.widget.AppCompatImageView android:id="@+id/day1" android:layout_width="wrap_content" android:layout_height="60dp" app:layout_flexBasisPercent="@fraction/weather_icon" app:srcCompat="@drawable/ic_thunder" /> <android.support.v7.widget.AppCompatImageView android:id="@+id/day2" android:layout_width="wrap_content" android:layout_height="60dp" app:layout_flexBasisPercent="@fraction/weather_icon" app:srcCompat="@drawable/ic_fog" /> <android.support.v7.widget.AppCompatImageView android:id="@+id/day3" android:layout_width="wrap_content" android:layout_height="60dp" app:layout_flexBasisPercent="@fraction/weather_icon" app:srcCompat="@drawable/ic_rain" /> <android.support.v7.widget.AppCompatImageView android:id="@+id/day4" android:layout_width="wrap_content" android:layout_height="60dp" app:layout_flexBasisPercent="@fraction/weather_icon" app:srcCompat="@drawable/ic_snow" /> <android.support.v7.widget.AppCompatImageView android:id="@+id/day5" android:layout_width="wrap_content" android:layout_height="60dp" app:layout_flexBasisPercent="@fraction/weather_icon" app:srcCompat="@drawable/ic_cloud" /> <android.support.v7.widget.AppCompatImageView android:id="@+id/day6" android:layout_width="wrap_content" android:layout_height="60dp" app:layout_flexBasisPercent="@fraction/weather_icon" app:srcCompat="@drawable/ic_sun" /> </com.google.android.flexbox.FlexboxLayout>
There are a couple things to note with the above block:
Youâre using the com.google.android.flexbox.FlexboxLayout resource to layout the icons on the screen.
Youâre using the android.support.v7.widget.AppCompatImageView resource to draw the weather icons on the screen. You would normally use the ImageView resource with plain images (.png, .jpg) but for Vector Drawables you must use this component instead.
In the Preview pane, you see should the weather icons aligned perfectly:
This is already starting to feel adaptive!
Instead of positioning the icons with margins or using a relative layout you have used the FlexBox properties to spread them symmetrically. If you remove a middle icon for example, the remaining ones will automatically shift to the left to fill in the empty space. This is the true power of using FlexBox in layouts. The forecast grid is now ready to be used in your default layout for the main activity.
Main Activity
Open res/layout/activity_main.xml and replace its contents with the following:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/forecast_grid" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <android.support.v7.widget.RecyclerView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>
Hereâs what is happening in this layout:
Orientation for the LinearLayout is set to vertical
Dimensions: using the layout_weight XML attribute youâre setting each child view to take half of the screen height
Layout reuse: using the include XML tag youâre placing the forecast grid on the top half by referencing the forecast_grid.xml layout. This is one of the core functionalities to creating different layouts without duplicating the code.
Notice that the preview in the editor gets instantly updated. At this point you still havenât deployed the application to a device or emulator which is astonishing.
Build and run. You should now see the weather icons above the list of locations.
Updating the Weather Forecast
Take a look at the static JSON data in assets/data.json. The forecast for a given location is represented as an array of strings. You could create another RecyclerView with a GridLayout to dynamically create the forecast, but thatâs asking for trouble :]. Instead you will write a method that maps each possible forecast value to a corresponding drawable icon.
In MainActivity, add a new method:
private fun mapWeatherToDrawable(forecast: String): Drawable? { var drawableId = 0 when (forecast) { "sun" -> drawableId = R.drawable.ic_sun "rain" -> drawableId = R.drawable.ic_rain "fog" -> drawableId = R.drawable.ic_fog "thunder" -> drawableId = R.drawable.ic_thunder "cloud" -> drawableId = R.drawable.ic_cloud "snow" -> drawableId = R.drawable.ic_snow } return ContextCompat.getDrawable(this, drawableId) }
Now you are ready to write the code that responds to the click event of a RecyclerView row. Add the following method to MainActivity:
private fun loadForecast(forecast: List<String>) { val forecastView = findViewById<View>(R.id.forecast) as FlexboxLayout for (i in 0 until forecastView.childCount) { val dayView = forecastView.getChildAt(i) as AppCompatImageView dayView.setImageDrawable(mapWeatherToDrawable(forecast[i])) } }
Then find // TODO in MainActivity and replace it with the following:
loadForecast(location.forecast)
Build and run. Click on a location name and notice the weather forecast gets updated:
Good job, what a beautiful looking weather application! The weather in San Francisco isnât looking so beautiful though :].
Creating Adaptive UI: Landscape Layout
So far, you built this application with the portrait mode in mind but letâs take a look at what happens when the phone is rotated to landscape. Open activity_main.xml, in the layout editor click on the orientation icon, and choose Switch to Landscape:
At this stage, you could run the app on multiple Android devices or simulators. But this method of testing alternative layouts is time consuming and repetitive at best, and error prone at worst. There must be another way.
Thankfully, Android Studio has extensive previewing capabilities. Open the default activity_main.xml file, and hover your mouse over the bottom right corner of the screen to resize the layout. Notice that upon clicking the handle, Android Studio automatically displayed guides for different device sizes.
Ugh â landscape mode is none too kind to your design. Letâs try to have both views side by side instead. To tell the system which resource to pick for a given dimension, you place the layout resource in a folder named in a particular way. The system will pick the correct activity layout for the current deviceâs screen dimensions. This way, you will have adaptive UIs for your app.
Layout qualifiers
Back in Android Studio, right-click on res/layout and click on the New\Layout resource file menu:
Name the file activity_main and add the landscape resource qualifier:
The layout editor now shows a blank screen for the landscape mode because it picked the newly-created layout file layout-land/activity_main.xml. This only contains an empty ConstraintLayout, though not for much longer :]. Add the following to reuse the weather forecast layout and RecyclerView in a horizontal orientation this time.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <include layout="@layout/forecast_grid" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <android.support.v7.widget.RecyclerView android:id="@+id/list" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout>
And the layout editor now shows all your elements in landscape orientation.
Well done! You have created the first layout qualifier in this application. There are layout qualifiers for plenty of other configurations (screen width, height, aspect ratio etc.). In the next section we will modify the landscape layout even further with just a one-line change.
Resource qualifiers
Another enhancement you could make to the layout is to organize the weather icons as 2 columns and 3 rows as opposed to the current 3 columns and 2 rows layout. We could duplicate the forecast_grid.xml layout, but then it would be duplicated code and harder to maintain. The width occupied by each weather icon in relation to the FlexBox view width is determined by the layout_flexBasisPercent attribute:
<android.support.v7.widget.AppCompatImageView android:id="@+id/day1" android:layout_width="wrap_content" android:layout_height="60dp" app:layout_flexBasisPercent="@fraction/weather_icon" app:srcCompat="@drawable/ic_thunder" />
The value is a fraction type and is currently equal to 33% in the resource qualifier file res/values/fractions.xml. Following the same approach to creating a landscape layout, you can create resource files for the landscape configuration. Right-click on res/values and select the New\Values resource file menu item. Name the file fractions and add the landscape orientation qualifier:
Inside the resources XML tag, add the following:
<item name="weather_icon" type="fraction">49%</item>
Return to the main activity layout in landscape mode and notice the weather icons are laid out on 2 columns and 3 rows:
Well done! You can pause here and appreciate the fact that once again, you didnât have to deploy the application to achieve this result. Of course now you should build & run though and make sure it works :]
The configuration qualifiers can be applied to any attribute type in your XML layout (font size, colors, margins etc.).
Extra Large Layout
Return to the portrait orientation in the layout editor and drag the screen size all the way to the X-Large size range.
For devices with that much screen real estate, you could show all the weather icons on 1 row. Go ahead and right-click on res/values and select the New\Values resource file menu item. Name the file fractions and add the X-Large Size qualifier:
Add the following inside the resources XML tag:
<item name="weather_icon" type="fraction">16%</item>
Return to the layout editor and notice that all the weather icons are aligned on 1 row.
Configuration Calculations
Donât worry, the content in this section isnât as scary as the title makes it sound. When the user interacts with the application, the layout state changes over time (rows are selected, input fields populated with text etc.). When the layout changes (for example when the orientation changes), the existing layout is thrown away a new layout is inflated. But the system has no way of knowing how to restore the state because the two layouts could be completely different as far as it knows.
To see a live example of this in action, build and run the application. Select a location then change the orientation and notice the location isnât selected anymore!
If you are not already surprised that the forecast in London is sunny all week then you may also notice that the selected row was deselected after switching to landscape.
To fix this, you will hook into the activity lifecycle methods to save the selected location to a bundle and retrieve after the screen rotation.
Add the following at the top of MainActivity, below the properties:
companion object { private const val SELECTED_LOCATION_INDEX = "selectedLocationIndex" }
Then add the following method to MainActivity below the onCreate() method:
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt(SELECTED_LOCATION_INDEX, locationAdapter.selectedLocationIndex) }
Add the following to the end of onCreate():
if (savedInstanceState != null) { val index = savedInstanceState.getInt(SELECTED_LOCATION_INDEX) if (index >= 0 && index < locations.size) { locationAdapter.selectedLocationIndex = index loadForecast(locations[index].forecast) } }
Build and run again and this time the location remains selected across configuration changes. Hooray!
Where to Go From Here
Well done! Youâve built your first Android app with adaptive layouts and you learned how activities can make use of multiple layouts. You learned how drawables work with different displays, and how to make your app come to life on practically any Android device.
Of course, there's a lot more to Android than layouts, and no shortage of ways to build on the adaptive UI principles you discovered in this adaptive UI for Android tutorial. To learn more, check out Google's guidelines on the best UI practices. If you want, you can challenge yourself by trying the following:
Use another available qualifier to have yet another type of layout. For example, what if you'd like to have a different background color based on the locale qualifier?
Or, try using size qualifier on other resources, such as strings. You could add a TextView which shows a short message, or a longer message with the same name if the screen is in landscape?
Get the full source code for this project as a downloadable zip.
Feel free to share your feedback, findings or ask any questions in the comments below or in the forums. Talk to you soon!
The post Adaptive UI Tutorial for Android with Kotlin appeared first on Ray Wenderlich.
Adaptive UI Tutorial for Android with Kotlin published first on https://medium.com/@koresol
0 notes
Photo

Morgan James at Java Jazz Festival 2017. #Day1 #javajazzfestival #javajazz2017 #BNI46 #BNIJJFPhotoContest #matacokelat_ #muthiarys
0 notes
Photo

Java Jazz Festival 2017 #Day1 #temantulus ð
0 notes